bat-0.25.0/.cargo/audit.toml000064400000000000000000000001011046102023000136220ustar 00000000000000[advisories] ignore = ["RUSTSEC-2024-0320", "RUSTSEC-2024-0421"] bat-0.25.0/.cargo_vcs_info.json0000644000000001360000000000100116660ustar { "git": { "sha1": "25f4f96ea3afb6fe44552f3b38ed8b1540ffa1b3" }, "path_in_vcs": "" }bat-0.25.0/.github/.codecov.yml000064400000000000000000000000171046102023000142370ustar 00000000000000comment: false bat-0.25.0/.github/FUNDING.yml000064400000000000000000000000471046102023000136340ustar 00000000000000github: [sharkdp, keith-hall, Enselic] bat-0.25.0/.github/ISSUE_TEMPLATE/bug_report.md000064400000000000000000000025201046102023000166720ustar 00000000000000--- name: Bug Report about: Report a bug. title: "" labels: bug assignees: '' --- **What steps will reproduce the bug?** 1. step 1 2. step 2 3. ... **What happens?** ... **What did you expect to happen instead?** ... **How did you install `bat`?** --- **bat version and environment** bat-0.25.0/.github/ISSUE_TEMPLATE/config.yml000064400000000000000000000000331046102023000161650ustar 00000000000000blank_issues_enabled: true bat-0.25.0/.github/ISSUE_TEMPLATE/feature_request.md000064400000000000000000000001711046102023000177250ustar 00000000000000--- name: Feature Request about: Suggest an idea for this project. title: '' labels: feature-request assignees: '' --- bat-0.25.0/.github/ISSUE_TEMPLATE/question.md000064400000000000000000000003701046102023000163720ustar 00000000000000--- name: Question about: Ask a question about 'bat'. title: '' labels: question assignees: '' --- bat-0.25.0/.github/ISSUE_TEMPLATE/syntax_request.md000064400000000000000000000012301046102023000176150ustar 00000000000000--- name: Syntax Request about: Request adding a new syntax to bat. title: "" labels: syntax-request assignees: '' --- **Syntax:** [Name or description of the syntax/language here] **Guideline Criteria:** [packagecontrol.io link here] bat-0.25.0/.github/dependabot.yml000064400000000000000000000007321046102023000146500ustar 00000000000000version: 2 updates: - package-ecosystem: cargo directory: "/" schedule: interval: monthly time: "04:00" timezone: Europe/Berlin ignore: - dependency-name: git2 versions: - 0.13.17 - package-ecosystem: gitsubmodule directory: "/" schedule: interval: monthly time: "04:00" timezone: Europe/Berlin - package-ecosystem: "github-actions" directory: "/" schedule: interval: monthly time: "04:00" timezone: Europe/Berlin bat-0.25.0/.github/workflows/Auto-merge-dependabot-PRs.yml000064400000000000000000000017101046102023000214070ustar 00000000000000# This workflow triggers auto-merge of any PR that dependabot creates so that # PRs will be merged automatically without maintainer intervention if CI passes name: Auto-merge dependabot PRs on: pull_request_target: types: [opened] jobs: auto-merge: if: github.repository == 'sharkdp/bat' && startsWith(github.head_ref, 'dependabot/') runs-on: ubuntu-latest environment: name: auto-merge url: https://github.com/sharkdp/bat/blob/main/.github/workflows/Auto-merge-dependabot-PRs.yml env: GITHUB_TOKEN: ${{ secrets.AUTO_MERGE_GITHUB_TOKEN }} steps: - uses: actions/checkout@v4 - run: | gh pr review ${{ github.event.pull_request.number }} --comment --body "If CI passes, this dependabot PR will be [auto-merged](https://github.com/sharkdp/bat/blob/main/.github/workflows/Auto-merge-dependabot-PRs.yml) πŸš€" - run: | gh pr merge --auto --squash ${{ github.event.pull_request.number }} bat-0.25.0/.github/workflows/CICD.yml000064400000000000000000000472321046102023000153100ustar 00000000000000name: CICD env: CICD_INTERMEDIATES_DIR: "_cicd-intermediates" MSRV_FEATURES: --no-default-features --features minimal-application,bugreport,build-assets on: workflow_dispatch: pull_request: push: branches: - master tags: - '*' jobs: all-jobs: if: always() # Otherwise this job is skipped if the matrix job fails name: all-jobs runs-on: ubuntu-latest needs: - crate_metadata - ensure_cargo_fmt - min_version - license_checks - test_with_new_syntaxes_and_themes - test_with_system_config - documentation - cargo-audit - build steps: - run: jq --exit-status 'all(.result == "success")' <<< '${{ toJson(needs) }}' crate_metadata: name: Extract crate metadata runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Extract crate information id: crate_metadata run: | cargo metadata --no-deps --format-version 1 | jq -r '"name=" + .packages[0].name' | tee -a $GITHUB_OUTPUT cargo metadata --no-deps --format-version 1 | jq -r '"version=" + .packages[0].version' | tee -a $GITHUB_OUTPUT cargo metadata --no-deps --format-version 1 | jq -r '"maintainer=" + .packages[0].authors[0]' | tee -a $GITHUB_OUTPUT cargo metadata --no-deps --format-version 1 | jq -r '"homepage=" + .packages[0].homepage' | tee -a $GITHUB_OUTPUT cargo metadata --no-deps --format-version 1 | jq -r '"msrv=" + .packages[0].rust_version' | tee -a $GITHUB_OUTPUT outputs: name: ${{ steps.crate_metadata.outputs.name }} version: ${{ steps.crate_metadata.outputs.version }} maintainer: ${{ steps.crate_metadata.outputs.maintainer }} homepage: ${{ steps.crate_metadata.outputs.homepage }} msrv: ${{ steps.crate_metadata.outputs.msrv }} ensure_cargo_fmt: name: Ensure 'cargo fmt' has been run runs-on: ubuntu-20.04 steps: - uses: dtolnay/rust-toolchain@stable with: components: rustfmt - uses: actions/checkout@v4 - run: cargo fmt -- --check min_version: name: Minimum supported rust version runs-on: ubuntu-20.04 needs: crate_metadata steps: - name: Checkout source code uses: actions/checkout@v4 - name: Install rust toolchain (v${{ needs.crate_metadata.outputs.msrv }}) uses: dtolnay/rust-toolchain@master with: toolchain: ${{ needs.crate_metadata.outputs.msrv }} components: clippy - name: Run clippy (on minimum supported rust version to prevent warnings we can't fix) run: cargo clippy --locked --all-targets ${{ env.MSRV_FEATURES }} - name: Run tests run: cargo test --locked ${{ env.MSRV_FEATURES }} license_checks: name: License checks runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v4 with: submodules: true # we especially want to perform license checks on submodules - run: tests/scripts/license-checks.sh test_with_new_syntaxes_and_themes: name: Run tests with updated syntaxes and themes runs-on: ubuntu-20.04 steps: - name: Git checkout uses: actions/checkout@v4 with: submodules: true # we need all syntax and theme submodules - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable - name: Build and install bat run: cargo install --locked --path . - name: Rebuild binary assets (syntaxes and themes) run: bash assets/create.sh - name: Build and install bat with updated assets run: cargo install --locked --path . - name: Run unit tests with new syntaxes and themes run: cargo test --locked --release - name: Run ignored-by-default unit tests with new syntaxes and themes run: cargo test --locked --release --test assets -- --ignored - name: Syntax highlighting regression test run: tests/syntax-tests/regression_test.sh - name: List of languages run: bat --list-languages - name: List of themes run: bat --list-themes - name: Test custom assets run: tests/syntax-tests/test_custom_assets.sh test_with_system_config: name: Run tests with system wide configuration runs-on: ubuntu-20.04 steps: - name: Git checkout uses: actions/checkout@v4 - name: Prepare environment variables run: | echo "BAT_SYSTEM_CONFIG_PREFIX=$GITHUB_WORKSPACE/tests/examples/system_config" >> $GITHUB_ENV - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable - name: Build and install bat run: cargo install --locked --path . - name: Run unit tests run: cargo test --locked --test system_wide_config -- --ignored documentation: name: Documentation runs-on: ubuntu-20.04 steps: - name: Git checkout uses: actions/checkout@v4 - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable - name: Check documentation env: RUSTDOCFLAGS: -D warnings run: cargo doc --locked --no-deps --document-private-items --all-features - name: Show man page run: man $(find . -name bat.1) cargo-audit: name: cargo audit runs-on: ubuntu-latest steps: - run: cargo install cargo-audit --locked - uses: actions/checkout@v4 - run: cargo audit build: name: ${{ matrix.job.target }} (${{ matrix.job.os }}) runs-on: ${{ matrix.job.os }} needs: crate_metadata strategy: fail-fast: false matrix: job: - { target: aarch64-unknown-linux-musl , os: ubuntu-20.04, dpkg_arch: arm64, use-cross: true } - { target: aarch64-unknown-linux-gnu , os: ubuntu-20.04, dpkg_arch: arm64, use-cross: true } - { target: arm-unknown-linux-gnueabihf , os: ubuntu-20.04, dpkg_arch: armhf, use-cross: true } - { target: arm-unknown-linux-musleabihf, os: ubuntu-20.04, dpkg_arch: musl-linux-armhf, use-cross: true } - { target: i686-pc-windows-msvc , os: windows-2019, } - { target: i686-unknown-linux-gnu , os: ubuntu-20.04, dpkg_arch: i686, use-cross: true } - { target: i686-unknown-linux-musl , os: ubuntu-20.04, dpkg_arch: musl-linux-i686, use-cross: true } - { target: x86_64-apple-darwin , os: macos-13, } - { target: aarch64-apple-darwin , os: macos-14, } - { target: x86_64-pc-windows-gnu , os: windows-2019, } - { target: x86_64-pc-windows-msvc , os: windows-2019, } - { target: x86_64-unknown-linux-gnu , os: ubuntu-20.04, dpkg_arch: amd64, use-cross: true } - { target: x86_64-unknown-linux-musl , os: ubuntu-20.04, dpkg_arch: musl-linux-amd64, use-cross: true } env: BUILD_CMD: cargo steps: - name: Checkout source code uses: actions/checkout@v4 - name: Install prerequisites shell: bash run: | case ${{ matrix.job.target }} in arm-unknown-linux-*) sudo apt-get -y update ; sudo apt-get -y install gcc-arm-linux-gnueabihf ;; aarch64-unknown-linux-gnu) sudo apt-get -y update ; sudo apt-get -y install gcc-aarch64-linux-gnu ;; esac - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable with: targets: ${{ matrix.job.target }} - name: Install cross if: matrix.job.use-cross uses: taiki-e/install-action@v2 with: tool: cross - name: Overwrite build command env variable if: matrix.job.use-cross shell: bash run: echo "BUILD_CMD=cross" >> $GITHUB_ENV - name: Show version information (Rust, cargo, GCC) shell: bash run: | gcc --version || true rustup -V rustup toolchain list rustup default cargo -V rustc -V - name: Build shell: bash run: $BUILD_CMD build --locked --release --target=${{ matrix.job.target }} - name: Set binary name & path id: bin shell: bash run: | # Figure out suffix of binary EXE_suffix="" case ${{ matrix.job.target }} in *-pc-windows-*) EXE_suffix=".exe" ;; esac; # Setup paths BIN_NAME="${{ needs.crate_metadata.outputs.name }}${EXE_suffix}" BIN_PATH="target/${{ matrix.job.target }}/release/${BIN_NAME}" # Let subsequent steps know where to find the binary echo "BIN_PATH=${BIN_PATH}" >> $GITHUB_OUTPUT echo "BIN_NAME=${BIN_NAME}" >> $GITHUB_OUTPUT - name: Set testing options id: test-options shell: bash run: | # test only library unit tests and binary for arm-type targets unset CARGO_TEST_OPTIONS unset CARGO_TEST_OPTIONS ; case ${{ matrix.job.target }} in arm-* | aarch64-*) CARGO_TEST_OPTIONS="--lib --bin ${{ needs.crate_metadata.outputs.name }}" ;; esac; echo "CARGO_TEST_OPTIONS=${CARGO_TEST_OPTIONS}" >> $GITHUB_OUTPUT - name: Run tests shell: bash run: | if [[ ${{ matrix.job.os }} = windows-* ]] then powershell.exe -command "$BUILD_CMD test --locked --target=${{ matrix.job.target }} ${{ steps.test-options.outputs.CARGO_TEST_OPTIONS}}" else $BUILD_CMD test --locked --target=${{ matrix.job.target }} ${{ steps.test-options.outputs.CARGO_TEST_OPTIONS}} fi - name: Run bat shell: bash run: $BUILD_CMD run --locked --target=${{ matrix.job.target }} -- --paging=never --color=always --theme=ansi Cargo.toml src/config.rs - name: Show diagnostics (bat --diagnostic) shell: bash run: $BUILD_CMD run --locked --target=${{ matrix.job.target }} -- --paging=never --color=always --theme=ansi Cargo.toml src/config.rs --diagnostic - name: "Feature check: regex-onig" shell: bash run: $BUILD_CMD check --locked --target=${{ matrix.job.target }} --verbose --lib --no-default-features --features regex-onig - name: "Feature check: regex-onig,git" shell: bash run: $BUILD_CMD check --locked --target=${{ matrix.job.target }} --verbose --lib --no-default-features --features regex-onig,git - name: "Feature check: regex-onig,paging" shell: bash run: $BUILD_CMD check --locked --target=${{ matrix.job.target }} --verbose --lib --no-default-features --features regex-onig,paging - name: "Feature check: regex-onig,git,paging" shell: bash run: $BUILD_CMD check --locked --target=${{ matrix.job.target }} --verbose --lib --no-default-features --features regex-onig,git,paging - name: "Feature check: minimal-application" shell: bash run: $BUILD_CMD check --locked --target=${{ matrix.job.target }} --verbose --no-default-features --features minimal-application - name: Create tarball id: package shell: bash run: | PKG_suffix=".tar.gz" ; case ${{ matrix.job.target }} in *-pc-windows-*) PKG_suffix=".zip" ;; esac; PKG_BASENAME=${{ needs.crate_metadata.outputs.name }}-v${{ needs.crate_metadata.outputs.version }}-${{ matrix.job.target }} PKG_NAME=${PKG_BASENAME}${PKG_suffix} echo "PKG_NAME=${PKG_NAME}" >> $GITHUB_OUTPUT PKG_STAGING="${{ env.CICD_INTERMEDIATES_DIR }}/package" ARCHIVE_DIR="${PKG_STAGING}/${PKG_BASENAME}/" mkdir -p "${ARCHIVE_DIR}" mkdir -p "${ARCHIVE_DIR}/autocomplete" # Binary cp "${{ steps.bin.outputs.BIN_PATH }}" "$ARCHIVE_DIR" # README, LICENSE and CHANGELOG files cp "README.md" "LICENSE-MIT" "LICENSE-APACHE" "CHANGELOG.md" "$ARCHIVE_DIR" # Man page cp 'target/${{ matrix.job.target }}/release/build/${{ needs.crate_metadata.outputs.name }}'-*/out/assets/manual/bat.1 "$ARCHIVE_DIR" # Autocompletion files cp 'target/${{ matrix.job.target }}/release/build/${{ needs.crate_metadata.outputs.name }}'-*/out/assets/completions/bat.bash "$ARCHIVE_DIR/autocomplete/${{ needs.crate_metadata.outputs.name }}.bash" cp 'target/${{ matrix.job.target }}/release/build/${{ needs.crate_metadata.outputs.name }}'-*/out/assets/completions/bat.fish "$ARCHIVE_DIR/autocomplete/${{ needs.crate_metadata.outputs.name }}.fish" cp 'target/${{ matrix.job.target }}/release/build/${{ needs.crate_metadata.outputs.name }}'-*/out/assets/completions/_bat.ps1 "$ARCHIVE_DIR/autocomplete/_${{ needs.crate_metadata.outputs.name }}.ps1" cp 'target/${{ matrix.job.target }}/release/build/${{ needs.crate_metadata.outputs.name }}'-*/out/assets/completions/bat.zsh "$ARCHIVE_DIR/autocomplete/${{ needs.crate_metadata.outputs.name }}.zsh" # base compressed package pushd "${PKG_STAGING}/" >/dev/null case ${{ matrix.job.target }} in *-pc-windows-*) 7z -y a "${PKG_NAME}" "${PKG_BASENAME}"/* | tail -2 ;; *) tar czf "${PKG_NAME}" "${PKG_BASENAME}"/* ;; esac; popd >/dev/null # Let subsequent steps know where to find the compressed package echo "PKG_PATH=${PKG_STAGING}/${PKG_NAME}" >> $GITHUB_OUTPUT - name: Create Debian package id: debian-package shell: bash if: startsWith(matrix.job.os, 'ubuntu') run: | COPYRIGHT_YEARS="2018 - "$(date "+%Y") DPKG_STAGING="${{ env.CICD_INTERMEDIATES_DIR }}/debian-package" DPKG_DIR="${DPKG_STAGING}/dpkg" mkdir -p "${DPKG_DIR}" DPKG_BASENAME=${{ needs.crate_metadata.outputs.name }} DPKG_CONFLICTS=${{ needs.crate_metadata.outputs.name }}-musl case ${{ matrix.job.target }} in *-musl) DPKG_BASENAME=${{ needs.crate_metadata.outputs.name }}-musl ; DPKG_CONFLICTS=${{ needs.crate_metadata.outputs.name }} ;; esac; DPKG_VERSION=${{ needs.crate_metadata.outputs.version }} DPKG_ARCH="${{ matrix.job.dpkg_arch }}" DPKG_NAME="${DPKG_BASENAME}_${DPKG_VERSION}_${DPKG_ARCH}.deb" echo "DPKG_NAME=${DPKG_NAME}" >> $GITHUB_OUTPUT # Binary install -Dm755 "${{ steps.bin.outputs.BIN_PATH }}" "${DPKG_DIR}/usr/bin/${{ steps.bin.outputs.BIN_NAME }}" # Man page install -Dm644 'target/${{ matrix.job.target }}/release/build/${{ needs.crate_metadata.outputs.name }}'-*/out/assets/manual/bat.1 "${DPKG_DIR}/usr/share/man/man1/${{ needs.crate_metadata.outputs.name }}.1" gzip -n --best "${DPKG_DIR}/usr/share/man/man1/${{ needs.crate_metadata.outputs.name }}.1" # Autocompletion files install -Dm644 'target/${{ matrix.job.target }}/release/build/${{ needs.crate_metadata.outputs.name }}'-*/out/assets/completions/bat.bash "${DPKG_DIR}/usr/share/bash-completion/completions/${{ needs.crate_metadata.outputs.name }}" install -Dm644 'target/${{ matrix.job.target }}/release/build/${{ needs.crate_metadata.outputs.name }}'-*/out/assets/completions/bat.fish "${DPKG_DIR}/usr/share/fish/vendor_completions.d/${{ needs.crate_metadata.outputs.name }}.fish" install -Dm644 'target/${{ matrix.job.target }}/release/build/${{ needs.crate_metadata.outputs.name }}'-*/out/assets/completions/bat.zsh "${DPKG_DIR}/usr/share/zsh/vendor-completions/_${{ needs.crate_metadata.outputs.name }}" # README and LICENSE install -Dm644 "README.md" "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/README.md" install -Dm644 "LICENSE-MIT" "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/LICENSE-MIT" install -Dm644 "LICENSE-APACHE" "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/LICENSE-APACHE" install -Dm644 "CHANGELOG.md" "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/changelog" gzip -n --best "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/changelog" cat > "${DPKG_DIR}/usr/share/doc/${DPKG_BASENAME}/copyright" < "${DPKG_DIR}/DEBIAN/control" <> $GITHUB_OUTPUT # build dpkg fakeroot dpkg-deb --build "${DPKG_DIR}" "${DPKG_PATH}" - name: "Artifact upload: tarball" uses: actions/upload-artifact@master with: name: ${{ steps.package.outputs.PKG_NAME }} path: ${{ steps.package.outputs.PKG_PATH }} - name: "Artifact upload: Debian package" uses: actions/upload-artifact@master if: steps.debian-package.outputs.DPKG_NAME with: name: ${{ steps.debian-package.outputs.DPKG_NAME }} path: ${{ steps.debian-package.outputs.DPKG_PATH }} - name: Check for release id: is-release shell: bash run: | unset IS_RELEASE ; if [[ $GITHUB_REF =~ ^refs/tags/v[0-9].* ]]; then IS_RELEASE='true' ; fi echo "IS_RELEASE=${IS_RELEASE}" >> $GITHUB_OUTPUT - name: Publish archives and packages uses: softprops/action-gh-release@v2 if: steps.is-release.outputs.IS_RELEASE with: files: | ${{ steps.package.outputs.PKG_PATH }} ${{ steps.debian-package.outputs.DPKG_PATH }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} winget: name: Publish to Winget runs-on: ubuntu-latest needs: build if: startsWith(github.ref, 'refs/tags/v') steps: - uses: vedantmgoyal2009/winget-releaser@v2 with: identifier: sharkdp.bat installers-regex: '-pc-windows-msvc\.zip$' token: ${{ secrets.WINGET_TOKEN }} bat-0.25.0/.github/workflows/require-changelog-for-PRs.yml000064400000000000000000000022601046102023000214650ustar 00000000000000name: Changelog on: pull_request: jobs: check-changelog: name: Check for changelog entry runs-on: ubuntu-latest # dependabot PRs are automerged if CI passes; we shouldn't block these if: github.actor != 'dependabot[bot]' env: PR_NUMBER: ${{ github.event.number }} PR_BASE: ${{ github.base_ref }} steps: - uses: actions/checkout@v4 - name: Fetch PR base run: git fetch --no-tags --prune --depth=1 origin # cannot use `github.actor`: the triggering commit may be authored by a maintainer - name: Get PR submitter id: get-submitter run: curl -sSfL https://api.github.com/repos/sharkdp/bat/pulls/${PR_NUMBER} | jq -r '"submitter=" + .user.login' | tee -a $GITHUB_OUTPUT - name: Search for added line in changelog env: PR_SUBMITTER: ${{ steps.get-submitter.outputs.submitter }} run: | ADDED=$(git diff -U0 "origin/${PR_BASE}" HEAD -- CHANGELOG.md | grep -P '^\+[^\+].+$') echo "Added lines in CHANGELOG.md:" echo "$ADDED" echo "Grepping for PR info (see CONTRIBUTING.md):" grep "#${PR_NUMBER}\\b.*@${PR_SUBMITTER}\\b" <<< "$ADDED" bat-0.25.0/.gitignore000064400000000000000000000003051046102023000124440ustar 00000000000000/target/ **/*.rs.bk # Generated files /assets/completions/_bat.ps1 /assets/completions/bat.bash /assets/completions/bat.fish /assets/completions/bat.zsh /assets/manual/bat.1 /assets/metadata.yaml bat-0.25.0/.gitmodules000064400000000000000000000270351046102023000126420ustar 00000000000000[submodule "assets/syntaxes/Elixir"] path = assets/syntaxes/02_Extra/Elixir url = https://github.com/princemaple/elixir-sublime-syntax/ [submodule "assets/syntaxes/Packages"] path = assets/syntaxes/01_Packages url = https://github.com/sublimehq/Packages/ [submodule "assets/syntaxes/TOML"] path = assets/syntaxes/02_Extra/TOML url = https://github.com/jasonwilliams/sublime_toml_highlighting [submodule "assets/syntaxes/Julia"] path = assets/syntaxes/02_Extra/Julia url = https://github.com/JuliaEditorSupport/Julia-sublime [submodule "assets/themes/sublime-monokai-extended"] path = assets/themes/sublime-monokai-extended url = https://github.com/jonschlinkert/sublime-monokai-extended [submodule "assets/syntaxes/Docker"] path = assets/syntaxes/02_Extra/Docker url = https://github.com/asbjornenge/Docker.tmbundle [submodule "assets/syntaxes/VimL"] path = assets/syntaxes/02_Extra/VimL url = https://github.com/SalGnt/Sublime-VimL [submodule "assets/syntaxes/INI"] path = assets/syntaxes/02_Extra/INI url = https://github.com/clintberry/sublime-text-2-ini [submodule "assets/syntaxes/CMake"] path = assets/syntaxes/02_Extra/CMake url = https://github.com/zyxar/Sublime-CMakeLists [submodule "assets/syntaxes/LESS"] path = assets/syntaxes/02_Extra/LESS url = https://github.com/danro/LESS-sublime [submodule "assets/themes/DarkNeon"] path = assets/themes/DarkNeon url = https://github.com/RainyDayMedia/DarkNeon [submodule "assets/themes/github-sublime-theme"] path = assets/themes/github-sublime-theme url = https://github.com/AlexanderEkdahl/github-sublime-theme [submodule "assets/themes/1337-Scheme"] path = assets/themes/1337-Scheme url = https://github.com/MarkMichos/1337-Scheme [submodule "assets/themes/TwoDark"] path = assets/themes/TwoDark url = https://github.com/erremauro/TwoDark [submodule "assets/syntaxes/AWK"] path = assets/syntaxes/02_Extra/AWK url = https://github.com/JohnNilsson/awk-sublime [submodule "assets/syntaxes/Nix"] path = assets/syntaxes/02_Extra/Nix url = https://github.com/wmertens/sublime-nix [submodule "assets/themes/zenburn"] path = assets/themes/zenburn url = https://github.com/colinta/zenburn.git [submodule "assets/syntaxes/Kotlin"] path = assets/syntaxes/02_Extra/Kotlin url = https://github.com/vkostyukov/kotlin-sublime-package [submodule "assets/syntaxes/Elm"] path = assets/syntaxes/02_Extra/Elm url = https://github.com/elm-community/SublimeElmLanguageSupport [submodule "assets/syntaxes/TypeScript"] path = assets/syntaxes/02_Extra/TypeScript url = https://github.com/Microsoft/TypeScript-Sublime-Plugin [submodule "assets/syntaxes/Puppet"] path = assets/syntaxes/02_Extra/Puppet url = https://github.com/russCloak/SublimePuppet [submodule "assets/themes/onehalf"] path = assets/themes/onehalf url = https://github.com/sonph/onehalf [submodule "assets/syntaxes/JavaScript (Babel)"] path = assets/syntaxes/02_Extra/JavaScript (Babel) url = https://github.com/babel/babel-sublime [submodule "assets/syntaxes/FSharp"] path = assets/syntaxes/02_Extra/FSharp url = https://github.com/hoest/sublimetext-fsharp [submodule "assets/syntaxes/PureScript"] path = assets/syntaxes/02_Extra/PureScript url = https://github.com/tellnobody1/sublime-purescript-syntax [submodule "assets/syntaxes/Swift"] path = assets/syntaxes/02_Extra/Swift url = https://github.com/quiqueg/Swift-Sublime-Package [submodule "assets/syntaxes/Crystal"] path = assets/syntaxes/02_Extra/Crystal url = https://github.com/crystal-lang-tools/sublime-crystal.git [submodule "assets/syntaxes/PowerShell"] path = assets/syntaxes/02_Extra/PowerShell url = https://github.com/PowerShell/EditorSyntax [submodule "assets/syntaxes/Robot"] path = assets/syntaxes/02_Extra/Robot url = https://github.com/andriyko/sublime-robot-framework-assistant.git [submodule "assets/themes/sublime-snazzy"] path = assets/themes/sublime-snazzy url = https://github.com/greggb/sublime-snazzy [submodule "assets/syntaxes/Assembly (ARM)"] path = assets/syntaxes/02_Extra/Assembly (ARM) url = https://github.com/tvi/Sublime-ARM-Assembly [submodule "assets/syntaxes/protobuf-syntax-highlighting"] path = assets/syntaxes/02_Extra/Protobuf url = https://github.com/VcamX/protobuf-syntax-highlighting.git branch = master [submodule "assets/syntaxes/Terraform"] path = assets/syntaxes/02_Extra/Terraform url = https://github.com/alexlouden/Terraform.tmLanguage.git [submodule "assets/syntaxes/Jsonnet"] path = assets/syntaxes/02_Extra/Jsonnet url = https://github.com/gburiola/sublime-jsonnet-syntax.git [submodule "assets/syntaxes/varlink"] path = assets/syntaxes/02_Extra/varlink url = https://github.com/varlink/syntax-highlight-varlink.git [submodule "assets/syntaxes/sublime-fish"] path = assets/syntaxes/02_Extra/Fish url = https://github.com/Phidica/sublime-fish.git [submodule "assets/syntaxes/Org mode"] path = assets/syntaxes/02_Extra/Org mode url = https://github.com/jezcope/Org.tmbundle.git [submodule "assets/syntaxes/DotENV"] path = assets/syntaxes/02_Extra/DotENV url = https://github.com/zaynali53/DotENV [submodule "assets/syntaxes/hosts"] path = assets/syntaxes/02_Extra/hosts url = https://github.com/brandonwamboldt/sublime-hosts [submodule "assets/syntaxes/ssh-config"] path = assets/syntaxes/02_Extra/ssh-config url = https://github.com/robballou/sublimetext-sshconfig.git [submodule "assets/syntaxes/GraphQL"] path = assets/syntaxes/02_Extra/GraphQL url = https://github.com/dncrews/GraphQL-SublimeText3.git [submodule "assets/syntaxes/Verilog"] path = assets/syntaxes/02_Extra/Verilog url = https://github.com/pro711/sublime-verilog [submodule "assets/syntaxes/SCSS_Sass"] path = assets/syntaxes/02_Extra/SCSS_Sass url = https://github.com/braver/SublimeSass [submodule "assets/syntaxes/Strace"] path = assets/syntaxes/02_Extra/Strace url = https://github.com/djuretic/SublimeStrace [submodule "assets/syntaxes/Jinja2"] path = assets/syntaxes/02_Extra/Jinja2 url = https://github.com/Martin819/sublime-jinja2 [submodule "assets/syntaxes/SLS"] path = assets/syntaxes/02_Extra/SLS url = https://github.com/saltstack/sublime-text branch = master [submodule "assets/themes/dracula-sublime"] path = assets/themes/dracula-sublime url = https://github.com/dracula/sublime.git [submodule "assets/syntaxes/HTML (Twig)"] path = assets/syntaxes/02_Extra/HTML (Twig) url = https://github.com/Anomareh/PHP-Twig.tmbundle.git [submodule "assets/themes/Nord-sublime"] path = assets/themes/Nord-sublime url = https://github.com/crabique/Nord-plist.git [submodule "assets/syntaxes/Vue"] path = assets/syntaxes/02_Extra/Vue url = https://github.com/vuejs/vue-syntax-highlight.git branch = new [submodule "assets/syntaxes/CoffeeScript"] path = assets/syntaxes/02_Extra/CoffeeScript url = https://github.com/sustained/CoffeeScript-Sublime-Plugin [submodule "assets/syntaxes/02_Extra/Stylus"] path = assets/syntaxes/02_Extra/Stylus url = https://github.com/billymoon/Stylus [submodule "assets/themes/Solarized"] path = assets/themes/Solarized url = https://github.com/braver/Solarized [submodule "assets/syntaxes/02_Extra/Fortran"] path = assets/syntaxes/02_Extra/Fortran url = https://github.com/315234/SublimeFortran [submodule "assets/syntaxes/02_Extra/Email"] path = assets/syntaxes/02_Extra/Email url = https://github.com/mariozaizar/email.sublime-syntax.git [submodule "assets/syntaxes/02_Extra/QML"] path = assets/syntaxes/02_Extra/QML url = https://github.com/skozlovf/Sublime-QML [submodule "assets/syntaxes/02_Extra/AsciiDoc"] path = assets/syntaxes/02_Extra/AsciiDoc url = https://github.com/asciidoctor/sublimetext-asciidoc.git [submodule "assets/syntaxes/02_Extra/GLSL"] path = assets/syntaxes/02_Extra/GLSL url = https://github.com/euler0/sublime-glsl [submodule "assets/syntaxes/02_Extra/Nginx"] path = assets/syntaxes/02_Extra/Nginx url = https://github.com/brandonwamboldt/sublime-nginx [submodule "assets/syntaxes/02_Extra/Apache"] path = assets/syntaxes/02_Extra/Apache url = https://github.com/colinta/ApacheConf.tmLanguage [submodule "assets/syntaxes/02_Extra/Ninja"] path = assets/syntaxes/02_Extra/Ninja url = https://github.com/pope/SublimeNinja.git [submodule "assets/syntaxes/02_Extra/Svelte"] path = assets/syntaxes/02_Extra/Svelte url = https://github.com/corneliusio/svelte-sublime [submodule "assets/themes/Coldark"] path = assets/themes/Coldark url = https://github.com/ArmandPhilippot/coldark-bat.git [submodule "assets/themes/gruvbox"] path = assets/themes/gruvbox url = https://github.com/subnut/gruvbox-tmTheme.git branch = bat-source [submodule "assets/syntaxes/02_Extra/Lean"] path = assets/syntaxes/02_Extra/Lean url = https://github.com/leanprover/vscode-lean.git [submodule "assets/syntaxes/02_Extra/LiveScript"] path = assets/syntaxes/02_Extra/LiveScript url = https://github.com/paulmillr/LiveScript.tmbundle [submodule "assets/syntaxes/02_Extra/Zig"] path = assets/syntaxes/02_Extra/Zig url = https://github.com/ziglang/sublime-zig-language.git [submodule "assets/syntaxes/02_Extra/gnuplot"] path = assets/syntaxes/02_Extra/gnuplot url = https://github.com/hesstobi/sublime_gnuplot [submodule "assets/syntaxes/02_Extra/SystemVerilog"] path = assets/syntaxes/02_Extra/SystemVerilog url = https://github.com/TheClams/SystemVerilog.git [submodule "assets/themes/visual-studio-dark-plus"] path = assets/themes/visual-studio-dark-plus url = https://github.com/vidann1/visual-studio-dark-plus.git [submodule "assets/syntaxes/02_Extra/SublimeEthereum"] path = assets/syntaxes/02_Extra/SublimeEthereum url = https://github.com/davidhq/SublimeEthereum.git [submodule "assets/syntaxes/02_Extra/Groff"] path = assets/syntaxes/02_Extra/Groff url = https://github.com/carsonoid/sublime_man_page_support [submodule "assets/syntaxes/02_Extra/http-request-response"] path = assets/syntaxes/02_Extra/http-request-response url = https://github.com/keith-hall/http-request-response-syntax.git [submodule "assets/syntaxes/02_Extra/LLVM"] path = assets/syntaxes/02_Extra/LLVM url = https://github.com/ioncodes/LLVM.tmBundle [submodule "assets/syntaxes/02_Extra/Slim"] path = assets/syntaxes/02_Extra/Slim url = https://github.com/slim-template/ruby-slim.tmbundle.git [submodule "assets/syntaxes/02_Extra/Racket"] path = assets/syntaxes/02_Extra/Racket url = https://github.com/follesoe/sublime-racket.git [submodule "assets/syntaxes/02_Extra/MediaWiki"] path = assets/syntaxes/02_Extra/MediaWiki url = https://github.com/tosher/Mediawiker.git [submodule "assets/syntaxes/02_Extra/Dart"] path = assets/syntaxes/02_Extra/Dart url = https://github.com/elMuso/Dartlight.git [submodule "assets/syntaxes/02_Extra/SublimeJQ"] path = assets/syntaxes/02_Extra/SublimeJQ url = https://github.com/zogwarg/SublimeJQ.git [submodule "assets/syntaxes/02_Extra/cmd-help"] path = assets/syntaxes/02_Extra/cmd-help url = https://github.com/victor-gp/cmd-help-sublime-syntax.git branch = main shallow = true [submodule "assets/syntaxes/02_Extra/TodoTxt"] path = assets/syntaxes/02_Extra/TodoTxt url = https://github.com/dertuxmalwieder/SublimeTodoTxt [submodule "assets/syntaxes/02_Extra/Ada"] path = assets/syntaxes/02_Extra/Ada url = https://github.com/wiremoons/ada-sublime-syntax [submodule "assets/syntaxes/02_Extra/Crontab"] path = assets/syntaxes/02_Extra/Crontab url = https://github.com/michaelblyons/SublimeSyntax-Crontab [submodule "assets/syntaxes/02_Extra/NSIS"] path = assets/syntaxes/02_Extra/NSIS url = https://github.com/SublimeText/NSIS [submodule "assets/syntaxes/02_Extra/vscode-wgsl"] path = assets/syntaxes/02_Extra/vscode-wgsl url = https://github.com/PolyMeilex/vscode-wgsl.git [submodule "assets/syntaxes/02_Extra/CFML"] path = assets/syntaxes/02_Extra/CFML url = https://github.com/jcberquist/sublimetext-cfml.git bat-0.25.0/CHANGELOG.md000064400000000000000000001422401046102023000122720ustar 00000000000000# v0.25.0 ## Features - Set terminal title to file names when Paging is not Paging::Never #2807 (@Oliver-Looney) - `bat --squeeze-blank`/`bat -s` will now squeeze consecutive empty lines, see #1441 (@eth-p) and #2665 (@einfachIrgendwer0815) - `bat --squeeze-limit` to set the maximum number of empty consecutive when using `--squeeze-blank`, see #1441 (@eth-p) and #2665 (@einfachIrgendwer0815) - `PrettyPrinter::squeeze_empty_lines` to support line squeezing for bat as a library, see #1441 (@eth-p) and #2665 (@einfachIrgendwer0815) - Syntax highlighting for JavaScript files that start with `#!/usr/bin/env bun` #2913 (@sharunkumar) - `bat --strip-ansi={never,always,auto}` to remove ANSI escape sequences from bat's input, see #2999 (@eth-p) - Add or remove individual style components without replacing all styles #2929 (@eth-p) - Automatically choose theme based on the terminal's color scheme, see #2896 (@bash) - Add option `--binary=as-text` for printing binary content, see issue #2974 and PR #2976 (@einfachIrgendwer0815) - Make shell completions available via `--completion `, see issue #2057 and PR #3126 (@einfachIrgendwer0815) - Syntax highlighting for puppet code blocks within Markdown files, see #3152 (@liliwilson) ## Bugfixes - Fix long file name wrapping in header, see #2835 (@FilipRazek) - Fix `NO_COLOR` support, see #2767 (@acuteenvy) - Fix handling of inputs with OSC ANSI escape sequences, see #2541 and #2544 (@eth-p) - Fix handling of inputs with combined ANSI color and attribute sequences, see #2185 and #2856 (@eth-p) - Fix panel width when line 10000 wraps, see #2854 (@eth-p) - Fix compile issue of `time` dependency caused by standard library regression #3045 (@cyqsimon) - Fix override behavior of --plain and --paging, see issue #2731 and PR #3108 (@einfachIrgendwer0815) - Fix bugs in `$LESSOPEN` support, see #2805 (@Anomalocaridid) ## Other - Upgrade to Rust 2021 edition #2748 (@cyqsimon) - Refactor and cleanup build script #2756 (@cyqsimon) - Checks changelog has been written to for PRs in CI #2766 (@cyqsimon) - Use GitHub API to get correct PR submitter #2791 (@cyqsimon) - Minor benchmark script improvements #2768 (@cyqsimon) - Update Arch Linux package URL in README files #2779 (@brunobell) - Update and improve `zsh` completion, see #2772 (@okapia) - More extensible syntax mapping mechanism #2755 (@cyqsimon) - Use proper Architecture for Debian packages built for musl, see #2811 (@Enselic) - Pull in fix for unsafe-libyaml security advisory, see #2812 (@dtolnay) - Update git-version dependency to use Syn v2, see #2816 (@dtolnay) - Update git2 dependency to v0.18.2, see #2852 (@eth-p) - Improve performance when color output disabled, see #2397 and #2857 (@eth-p) - Relax syntax mapping rule restrictions to allow brace expansion #2865 (@cyqsimon) - Apply clippy fixes #2864 (@cyqsimon) - Faster startup by offloading glob matcher building to a worker thread #2868 (@cyqsimon) - Display which theme is the default one in basic output (no colors), see #2937 (@sblondon) - Display which theme is the default one in colored output, see #2838 (@sblondon) - Add aarch64-apple-darwin ("Apple Silicon") binary tarballs to releases, see #2967 (@someposer) - Update the Lisp syntax, see #2970 (@ccqpein) - Use bat's ANSI iterator during tab expansion, see #2998 (@eth-p) - Support 'statically linked binary' for aarch64 in 'Release' page, see #2992 (@tzq0301) - Update options in shell completions and the man page of `bat`, see #2995 (@akinomyoga) - Update nix dev-dependency to v0.29.0, see #3112 (@decathorpe) - Bump MSRV to [1.74](https://blog.rust-lang.org/2023/11/16/Rust-1.74.0.html), see #3154 (@keith-hall) - Update clircle dependency to remove winapi transitive dependency, see #3113 (@niklasmohrin) ## Syntaxes - `cmd-help`: scope subcommands followed by other terms, and other misc improvements, see #2819 (@victor-gp) - Upgrade JQ syntax, see #2820 (@dependabot[bot]) - Add syntax mapping for quadman quadlets #2866 (@cyqsimon) - Map containers .conf files to TOML syntax #2867 (@cyqsimon) - Associate `.xsh` files with `xonsh` syntax that is Python, see #2840 (@anki-code) - Associate JSON with Comments `.jsonc` with `json` syntax, see #2795 (@mxaddict) - Associate JSON-LD `.jsonld` files with `json` syntax, see #3037 (@vorburger) - Associate `.textproto` files with `ProtoBuf` syntax, see #3038 (@vorburger) - Associate GeoJSON `.geojson` files with `json` syntax, see #3084 (@mvaaltola) - Associate `.aws/{config,credentials}`, see #2795 (@mxaddict) - Associate Wireguard config `/etc/wireguard/*.conf`, see #2874 (@cyqsimon) - Add support for [CFML](https://www.adobe.com/products/coldfusion-family.html), see #3031 (@brenton-at-pieces) - Map `*.mkd` files to `Markdown` syntax, see issue #3060 and PR #3061 (@einfachIrgendwer0815) - Add syntax mapping for CITATION.cff, see #3103 (@Ugzuzg) - Add syntax mapping for kubernetes config files #3049 (@cyqsimon) - Adds support for pipe delimiter for CSV #3115 (@pratik-m) - Add syntax mapping for `/etc/pacman.conf` #2961 (@cyqsimon) - Associate `uv.lock` with `TOML` syntax, see #3132 (@fepegar) ## Themes - Patched/improved themes for better Manpage syntax highlighting support, see #2994 (@keith-hall). ## `bat` as a library - Changes to `syntax_mapping::SyntaxMapping` #2755 (@cyqsimon) - `SyntaxMapping::get_syntax_for` is now correctly public - [BREAKING] `SyntaxMapping::{empty,builtin}` are removed; use `SyntaxMapping::new` instead - [BREAKING] `SyntaxMapping::mappings` is replaced by `SyntaxMapping::{builtin,custom,all}_mappings` - Make `Controller::run_with_error_handler`'s error handler `FnMut`, see #2831 (@rhysd) - Improve compile time by 20%, see #2815 (@dtolnay) - Add `theme::theme` for choosing an appropriate theme based on the terminal's color scheme, see #2896 (@bash) - [BREAKING] Remove `HighlightingAssets::default_theme`. Use `theme::default_theme` instead. - Add `PrettyPrinter::print_with_writer` for custom output destinations, see #3070 (@kojix2) # v0.24.0 ## Features - Add environment variable `BAT_PAGING`, see #2629 (@einfachIrgendwer0815) - Add opt-in (`--features lessopen`) support for `LESSOPEN` and `LESSCLOSE`. See #1597, #1739, #2444, #2602, and #2662 (@Anomalocaridid) ## Bugfixes - Fix `more` not being found on Windows when provided via `BAT_PAGER`, see #2570, #2580, and #2651 (@mataha) - Switched default behavior of `--map-syntax` to be case insensitive #2520 - Updated version of `serde_yaml` to `0.9`. See #2627 (@Raghav-Bell) - Fix arithmetic overflow in `LineRange::from` and `LineRange::parse_range`, see #2674, #2698 (@skoriop) - Fix paging not happening when stdout is interactive but stdin is not, see #2574 (@Nigecat) - Make `-pp` override `--paging` and vice versa when passed as a later argument, see #2660 (@J-Kappes) ## Other - Output directory for generated assets (completion, manual) can be customized, see #2515 (@tranzystorek-io) - Use the `is-terminal` crate instead of `atty`, see #2530 (@nickelc) - Add Winget Releaser workflow, see #2519 (@sitiom) - Bump MSRV to 1.70, see #2651 (@mataha) ## Syntaxes - Associate `os-release` with `bash` syntax, see #2587 (@cyqsimon) - Associate `Containerfile` with `Dockerfile` syntax, see #2606 (@einfachIrgendwer0815) - Replaced quotes with double quotes so fzf integration example script works on windows and linux. see #2095 (@johnmatthiggins) - Associate `ksh` files with `bash` syntax, see #2633 (@johnmatthiggins) - Associate `sarif` files with `JSON` syntax, see #2695 (@rhysd) - Associate `ron` files with `rust` syntax, see #2427 (@YeungOnion) - Add support for [WebGPU Shader Language](https://www.w3.org/TR/WGSL/), see #2692 (@rhysd) - Add `.dpkg-new` and `.dpkg-tmp` to ignored suffixe, see #2595 (@scop) - fix: Add syntax mapping `*.jsonl` => `json`, see #2539 (@WinterCore) - Update `Julia` syntax, see #2553 (@dependabot) - add `NSIS` support, see #2577 (@idleberg) - Update `ssh-config`, see #2697 (@mrmeszaros) - Add syntax mapping `*.debdiff` => `diff`, see #2947 (@jacg) ## `bat` as a library - Add optional output_buffer arg to `Controller::run()` and `Controller::run_with_error_handler()`, see #2618 (@Piturnah) # v0.23.0 ## Features - Implemented `-S` and `--chop-long-lines` flags as aliases for `--wrap=never`. See #2309 (@johnmatthiggins) - Breaking change: Environment variables can now override config file settings (but command-line arguments still have the highest precedence), see #1152, #1281, and #2381 (@aaronkollasch) - Implemented `--nonprintable-notation=caret` to support showing non-printable characters using caret notation. See #2429 (@einfachIrgendwer0815) ## Bugfixes - Fix `bat cache --clear` not clearing the `--target` dir if specified. See #2393 (@miles170) ## Other - Various bash completion improvements, see #2310 (@scop) - Disable completion of `cache` subcommand, see #2399 (@cyqsimon) - Signifigantly improve startup performance on macOS, see #2442 (@BlackHoleFox) - Bump MSRV to 1.62, see #2496 (@Enselic) ## Syntaxes - Added support for Ada, see #1300 and #2316 (@dkm) - Added `todo.txt` syntax, see #2375 (@BANOnotIT) - Improve Manpage.sublime-syntax. See #2364 (@Freed-Wu) and #2461 (@keith-hall) - Added a new `requirements.txt` syntax, see #2361 (@Freed-Wu) - Added a new VimHelp syntax, see #2366 (@Freed-Wu) - Associate `pdm.lock` with `TOML` syntax, see #2410 - `Todo.txt`: Fix highlighting of contexts and projects at beginning of done.txt, see #2411 - `cmd-help`: overhaul scope names (colors) to improve theme support; misc syntax improvements. See #2419 (@victor-gp) - Added support for Crontab, see #2509 (@keith-hall) ## Themes ## `bat` as a library - `PrettyPrinter::header` correctly displays a header with the filename, see #2378 and #2406 (@cstyles) # v0.22.1 ## Bugfixes - Bring back pre-processing of ANSI escape characters to so that some common `bat` use cases starts working again. See #2308 (@Enselic) # v0.22.0 ## Features - Make the default macOS theme depend on Dark Mode. See #2197, #1746 (@Enselic) - Support for separate system and user config files. See #668 (@patrickpichler) ## Bugfixes - Prevent fork nightmare with `PAGER=batcat`. See #2235 (@johnmatthiggins) - Make `--no-paging`/`-P` override `--paging=...` if passed as a later arg, see #2201 (@themkat) - `--map-syntax` and `--ignored-suffix` now works together, see #2093 (@czzrr) - Strips byte order mark from output when in non-loop-through mode. See #1922 (@dag-h) ## Other - Relaxed glibc requirements on amd64, see #2106 and #2194 (@sharkdp) - Improved fish completions. See #2275 (@zgracem) - Stop pre-processing ANSI escape characters. Syntax highlighting on ANSI escaped input is not supported. See #2185 and #2189 (@Enselic) ## Syntaxes - NSE (Nmap Scripting Engine) is mapped to Lua, see #2151 (@Cre3per) - Correctly color `fstab` dump and pass fields, see #2246 (@yuvalmo) - Update `Command Help` syntax, see #2255 - `Julia`: Fix syntax highlighting for function name starting with `struct`, see #2230 - Minor update to `LiveScript`, see #2291 - Associate `.mts` and `.cts` files with the `TypeScript` syntax. See #2236 (@kidonng) - Fish history is mapped to YAML. See #2237 (@kidonng) ## `bat` as a library - Make `bat::PrettyPrinter::syntaxes()` iterate over new `bat::Syntax` struct instead of `&syntect::parsing::SyntaxReference`. See #2222 (@Enselic) - Clear highlights after printing, see #1919 and #1920 (@rhysd) # v0.21.0 ## Features - Correctly render tab stops in `--show-all`, see #2038 (@Synthetica9) - Add a `--style=default` option and make it the default. It is less verbose than `full`, see #2061 (@IsaacHorvath) - Enable BusyBox `less` as pager, see #2162 (@nfisher1226) - File extensions are now matched case-insensitively. See #1854, #2181 (@Enselic) ## Bugfixes - Bump `regex` dependency from 1.5.4 to 1.5.5 to fix [CVE-2022-24713](https://blog.rust-lang.org/2022/03/08/cve-2022-24713.html), see #2145, #2139 (@Enselic) - `bat` no longer crashes when encountering files that references missing syntaxes. See #915, #2181 (@Enselic) ## Performance - Skip syntax highlighting on long lines (> 16384 chars) to help improve performance. See #2165 (@keith-hall) - Vastly improve startup time by lazy-loading syntaxes via syntect 5.0.0. This makes bat display small files ~75% faster than before. See #951, #2181 (@Enselic) ## Other - Include info about custom assets in `--diagnostics` if used. See #2107, #2144 (@Enselic) ## Syntaxes - Mapped clang-format config file (.clang-format) to YAML syntax (@TruncatedDinosour) - log syntax: improved handling of escape characters in double quoted strings. See #2123 (@keith-hall) - Associate `/var/spool/mail/*` and `/var/mail/*` with the `Email` syntax. See #2156 (@cyqsimon) - Added cmd-help syntax to scope --help messages. See #2148 (@victor-gp) - Slightly adjust Zig syntax. See #2136 (@Enselic) - Associate `.inf` files with the `INI` syntax. See #2190 (@Enselic) ## `bat` as a library - Allow configuration of `show_nonprintable` with `PrettyPrinter`, see #2142 - The binary format of syntaxes.bin has been changed due to syntaxes now being lazy-loaded via syntect 5.0.0. See #2181 (@Enselic) - Mark `bat::error::Error` enum as `#[non_exhaustive]` to allow adding new variants without future semver breakage. See #2181 (@Enselic) - Change `Error::SyntectError(syntect::LoadingError)` to `Error::SyntectError(syntect::Error)`. See #2181 (@Enselic) - Add `Error::SyntectLoadingError(syntect::LoadingError)` enum variant. See #2181 (@Enselic) # v0.20.0 ## Features - New style component `header-filesize` to show size of the displayed file in the header. See #1988 (@mdibaiee) - Use underline for line highlighting on ANSI, see #1730 (@mdibaiee) ## Bugfixes - Fix bash completion on bash 3.x and bash-completion 1.x. See #2066 (@joshpencheon) ## Syntaxes - `GraphQL`: Add support for interfaces implementing interfaces and consider ampersand an operator. See #2000 - Associate `_vimrc` and `_gvimrc` files with the `VimL` syntax. See #2002 - Associate `poetry.lock` files with the `TOML` syntax. See #2049 - Associate `.mesh`, `.task`, `.rgen`, `.rint`, `.rahit`, `.rchit`, `.rmiss`, and `.rcall` with the `GLSL` syntax. See #2050 - Added support for `JQ` syntax, see #2072 - Properly associate global git config files rooted in `$XDG_CONFIG_HOME/git/` or `$HOME/.config/git/`. See #2067 (@cyqsimon) ## `bat` as a library - Exposed `get_syntax_set` and `get_theme` methods on `HighlightingAssets`. See #2030 (@dandavison) - Added `HeaderFilename` and `HeaderFilesize` to `StyleComponent` enum, and mark it `#[non_exhaustive]`. See #1988 (@mdibaiee) # v0.19.0 ## Performance - Reduce startup time in loop-through mode (e.g. when redirecting output) by 90%. See #1747 (@Enselic) - Load themes lazily to make bat start 25% faster when disregarding syntax load time. See #1969 (@Enselic) - Python syntax highlighting no longer suffers from abysmal performance in specific scenarios. See #1688 (@keith-hall) - Fix for poor performance when ANSI escape sequences are piped to `bat`, see #1596 (@eth-p) - Fix for incorrect handling of ANSI escape sequences when using `--wrap=never`, see #1596 (@eth-p) - Load custom assets as fast as integrated assets, see #1753 (@Enselic) ## Features - Support for `x:-delta` (minus) syntax in line ranges (e.g. `20:-10`). See #1901 (@bojan88) - Support for `--ignored-suffix` argument. See #1892 (@bojan88) - `$BAT_CONFIG_DIR` is now a recognized environment variable. It has precedence over `$XDG_CONFIG_HOME`, see #1727 (@billrisher) - Support for `x:+delta` syntax in line ranges (e.g. `20:+10`). See #1810 (@bojan88) - Add new `--acknowledgements` option that gives credit to theme and syntax definition authors. See #1971 (@Enselic) - Include git hash in `bat -V` and `bat --version` output if present. See #1921 (@Enselic) ## Bugfixes - First line not shown in diff context. See #1891 (@divagant-martian) - Do not ignore syntaxes that handle file names with a `*.conf` extension. See #1703 (@cbolgiano) ## Other - Add PowerShell completion, see #1826 (@rashil2000) - Minimum supported Rust version (MSRV) bumped to 1.51, see #1994 (@mdibaiee) ## Syntaxes - Groff, see #1685 (@scop) - HTTP Requests and Responses, see #1748 (@keith-hall) - LLVM, see #1777 (@ioncodes) - Highlight for `vimrc` and `gvimrc` files, see #1763 (@SuperSandro2000) - Syslog highlighting improvements, see #1793 (@scop) - Added support for `slim` syntax, see #1693 (@mfinelli) - Racket, see #1884 (@jubnzv) - LiveScript, see #1915 (@Enselic) - MediaWiki, see #1925 (@sorairolake) - The `requirements.txt` syntax has been removed due to incompatible license requirements. - Dart, new highlighter, see #1959 (@Ersikan) - SCSS and Sass syntaxes updated, see #1766 (@Enselic) - PowerShell syntax updated, see #1935 (@Enselic) - TypeScript syntax updated, see #1834 (@Enselic) ## `bat` as a library - Deprecate `HighlightingAssets::syntaxes()` and `HighlightingAssets::syntax_for_file_name()`. Use `HighlightingAssets::get_syntaxes()` and `HighlightingAssets::get_syntax_for_path()` instead. They return a `Result` which is needed for upcoming lazy-loading work to improve startup performance. They also return which `SyntaxSet` the returned `SyntaxReference` belongs to. See #1747, #1755, #1776, #1862 (@Enselic) - Remove `HighlightingAssets::from_files` and `HighlightingAssets::save_to_cache`. Instead of calling the former and then the latter you now make a single call to `bat::assets::build`. See #1802, #1971 (@Enselic) - Replace the `error::Error(error::ErrorKind, _)` struct and enum with an `error::Error` enum. `Error(ErrorKind::UnknownSyntax, _)` becomes `Error::UnknownSyntax`, etc. Also remove the `error::ResultExt` trait. These changes stem from replacing `error-chain` with `thiserror`. See #1820 (@Enselic) - Add new `MappingTarget` enum variant `MapExtensionToUnknown`. Refer to its documentation for more information. Also mark `MappingTarget` as `#[non_exhaustive]` since more enum variants might be added in the future. See #1703 (@cbolgiano), #2012 (@Enselic) # v0.18.3 ## Bugfixes - Bump `git2` dependency to fix build with Rust 1.54, see #1761 # v0.18.2 ## Features - Ignore known backup/template filename suffixes when selecting the syntax, see #1687 (@scop) ## Bugfixes - Fix for a security vulnerability on Windows. Prior to this release, `bat` would execute programs called `less`/`less.exe` from the current working directory (instead of the one from `PATH`) with priority. An attacker might be able to use this by placing a malicious program in a shared directory where the user would execute `bat`. `bat` users on Windows are advised to upgrade to this version. See #1724 and #1472 (@Ry0taK). ## Other - Add bash completion, see #1678 (@scop) - Fix Clippy lints, see #1661 (@mohamed-abdelnour) - Add syntax highlighting test files, see #1213 and #1668 (@mohamed-abdelnour) ## Syntaxes - Upgraded Julia syntax to fix a highlighting bug, see #1692 - Added support for `dash` syntax, see #1654 (@mohamed-abdelnour) - Added support for `XAML` syntax, see #1590 and #1655 (@mohamed-abdelnour) - Apply `DotENV` syntax also for `.env.default` and `.env.defaults` files, see #1669 # v0.18.1 ## Bugfixes - Mouse support and screen clearing broken for `less` versions with minor version number (581.2), see #1629 and #1639 (@aswild) ## Other - `Input::ordinary_file` and `Input::with_name` now accept `Path` rather than `OsStr` see #1571 (@matklad) - The `LESS` environment variable is now included in `bat --diagnostic`, see #1589 (@Enselic) - Increased min. required Rust version to 1.45 ## Syntaxes - Improved the Syslog syntax highlighting, see #1606 (@keith-hall) - Replaced "Advanced CSV" with a custom CSV syntax definition written especially for `bat`; see #1574 (@keith-hall) - Added SystemVerilog file syntax, see #1580 (@SeanMcLoughlin) - Added Solidity and Vyper syntax, see #1602 (@Ersikan) ## New themes - Dark+ VS Code theme, see #1588 and #1598 (@PatriotRossii) # v0.18.0 ## Features - Use a pager when `bat --list-languages` is called, see #1394 (@stku1985) ## Bugfixes - If the last line doesn't end with a newline character, don't add it if `--style=plain`, see #1438 (@Enselic) - Only print themes hint in interactive mode (`bat --list-themes`), see #1439 (@rsteube) - Make ./tests/syntax-tests/regression_test.sh work on recent versions of macOS, see #1443 (@Enselic) - VimL syntax highlighting fix, see #1450 (@esensar) - Print an 'Invalid syntax theme settings' error message if a custom theme is broken, see #614 (@Enselic) - If plain mode is set and wrap is not explicitly opted in, long lines will no be truncated, see #1426 - If `PAGER` (but not `BAT_PAGER` or `--pager`) is `more` or `most`, silently use `less` instead to ensure support for colors, see #1063 (@Enselic) - If `PAGER` is `bat`, silently use `less` to prevent recursion. For `BAT_PAGER` or `--pager`, exit with error, see #1413 (@Enselic) - Manpage highlighting fix, see #1511 (@keith-hall) - `BAT_CONFIG_PATH` ignored by `bat` if non-existent, see #1550 (@sharkdp) ## Other - Performance improvements, see #1421 (@LovecraftianHorror) - Added a new `--diagnostic` option to collect information for bug reports, see #1459 (@sharkdp) - Modified default theme colors to differentiate between a JSON key and a string value, see #1400 (@keith-hall) - Upped min required Rust version to 1.42 ## Syntaxes - Added Zig syntax, see #1470 (@paulsmith) - Added Lean syntax, see #1446 (@Julian) - Added `.resource` extension for Robot Framework files, see #1386 - Added `gnuplot` syntax, see #1431 (@sharkdp) - Highlight *.pac (Proxy auto-config) files as JavaScript, see #1515 (@sharkdp) ## New themes - `ansi` replaces `ansi-dark` and `ansi-light`, see #1104 and #1412 (@mk12). **Breaking change:** users that were previously using one of the `ansi-*` themes should switch to `ansi`. - The Gruvbox theme has been updated, see #1291 (@j0hnmeow). **Breaking change:** users that were previously using `gruvbox` or `gruvbox-white` should update and use `gruvbox-dark`/`gruvbox-light` instead. ## `bat` as a library - The following `PrettyPrinter` methods have been removed (they were previously deprecated): - `input_stdin_with_name` - `input_from_bytes_with_name` - `input_from_reader_with_name` - `vcs_modification_markers` (if the `git` feature is not enabled) # v0.17.1 ## Bugfixes - Running `bat` without arguments fails ("output file is also an input"), see #1396 # v0.17.0 ## Features - Added a new `--style` value, `rule`, which adds a simple horizontal ruled line between files, see #1276 (@tommilligan) - Pass `-S` ("chop long lines") to `less` if `--wrap=never` is set in `bat`, see #1255 (@gahag) ## Bugfixes - Detect infinite loop when input and output are the same, see #1193 and #1197 (@niklasmohrin) - Throw an error when `bat` is being used as `pager`, see #1343 (@adrian-rivera) - Bash syntax highlighting not selected for `*.ebuild` and `*.eclass` files, see #1292 (@sharkdp) - Fix `zsh` completion when using `-p`, see #1320 (@xzfc) ## Other - Add note to refer to see detailed help with `--help` (and vice versa with `-h`), see #1215 (@henil) - Add a `Contributors` section to `README`, see #1348 (@adrian-rivera) ## Syntaxes - Manpage syntax highlighting has been improved, see #1315 (@keith-hall) - Add Svelte file syntax, see #1285 (@kjmph) ## New themes - Coldark, see #1329 (@armandphilippot) # v0.16.0 ## Features - Added support for the `NO_COLOR` environment variable, see #1021 and #1031 (@eth-p) - Added `-P` short flag to disable paging, see #1075 and #1082 (@LordFlashmeow) - Added `--force-colorization`/`-f` flag to provide an alias for forced color and decoration output, see #1141 (@alexanderkarlis) ## Bugfixes - Fixed non-printable characters display for redirected output, see #1061 (@gsomix) - Handle file extension conflicts in `--list-languages`, see #1076 and #1135 (@Kienyew) ## Other - Switched to "Β·" (U+00B7) Middle Dot from "β€’" (U+2022) Bullet for non-printing spaces, see #1056 and #1100 (@LordFlashmeow) - Added zsh shell completion script, see #1136 (@Kienyew) - Improved `--help` text (@sharkdp) - Added custom languages/themes sections to manpage (@eth-p) ## Syntaxes - Update AsciiDoc syntax, see #1034 (@rxt1077) - GLSL (@caioalonso) - Add Nginx and Apache config file syntax, see #1137 (@kjmph, @niklasmohrin) - Use `fstab` syntax for `crypttab` files, see #1073 (@sharkdp) - Support syntax highlighting for files in `$XDG_CONFIG_HOME/git/`, see #1191 (@ahmedelgabri) ## New themes - Gruvbox, see #1069 (@kyleondy) - base16-256 for [base16-shell](https://github.com/chriskempson/base16-shell) users, see #1111 (@mk12) ## `bat` as a library - Add APIs to provide `Input` descriptions with `InputDescription` (@eth-p) - Add function to directly provide `Input`s to `PrettyPrinter` (@eth-p) - **Breaking:** `Input::theme_preview_file` is no longer available. (@eth-p) ## Packaging - Removed build dependency on `liquid` (@sharkdp). # v0.15.4 ## Bugfixes - Added missing Solarized themes, see #1027 - Fixed highlighting bug in Haskell source files, see #1026 # v0.15.3 ## Bugfixes - Cannot run `bat` with relative paths, see #1022 - bat mishighlights Users that start with digits in SSH config, see #984 ## New syntaxes - SML, see #1005 (@kopecs) ## Other - Some syntaxes and themes have been updated to the latest version # v0.15.2 ## Bugfixes - Fix syntax detection for files called 'rails', see #1008 - Fix potential errors with syntax detection for symlinked files, see #1001 - `--map-syntax` doesn't work with names provided through `--file-name` (@eth-p) ## Other - Add padding above headers when not using a grid, see #968 and #981 (@pt2121) - bat now prints an error if an invalid syntax is specified via `-l` or `--map-syntax`, see #1004 (@eth-p) ## `bat` as a library - `PrettyPrinter::vcs_modification_markers` has been marked deprecated when building without the `git` feature, see #997 and #1020 (@eth-p, @sharkdp) ## Packaging - Compilation problems with `onig_sys` on various platforms have been resolved by upgrading to `syntect 4.2`, which includes a new `onig` version that allows to build `onig_sys` without the `bindgen` dependency. This removes the need for `libclang(-dev)` to be installed to compile `bat`. Package maintainers might want to remove `clang` as a build dependency. See #650 for more details. # v0.15.1 ## Bugfixes - Fix highlighting of Markdown files, see #963 and #977 - Fix `base16` theme (was broken since in v0.14), see #972, #934 and #979 (@mk12). Users suffering from #865 ("no color for bat in ssh from a Windows client") can use the `ansi-dark` and `ansi-light` themes from now on. ## New syntaxes - Fortran, see #957 - Email (@mariozaizar) - QML, see #962 (@pylipp) # v0.15.0 ## Features - Add a new `--diff`/`-d` option that can be used to only show lines surrounding Git changes, i.e. added, removed or modified lines. The amount of additional context can be controlled with `--diff-context=N`. See #23 and #940 ## Bugfixes - Error message printed in the middle of the output for another file, see #946 - Performance improvements when using custom caches (via `bat cache --build`): the `bat` startup time should now be twice as fast (@lzutao). ## Themes - Updated version of the Solarized dark/light themes, see #941 ## `bat` as a library - There are a few changes in the "low level" API (the `Config` struct has changed and the error handler needs a new `&mut dyn Write` argument). The high-level API is not affected. # v0.14.0 ## Features - Added a new `--file-name …` option to overwrite the displayed filename(s) in the header. This is useful when piping input into `bat`. See #654 and #892 (@neuronull). - Added a new `--generate-config-file` option to create an initial configuration file at the right place. See #870 (@jmick414) ## Bugfixes - Performance problems with C# source code have been fixed, see #677 (@keith-hall) - Performance problems with Makefiles have been fixed, see #750 (@keith-hall) - Fix bug when highlighting Ruby files with unindented heredocs, see #914 (@keith-hall) - A highlighting problem with Rust source code has been fixed, see #924 (@keith-hall) - Windows: short files that do not require paging are displayed and then lost, see #887 - `--highlight-line` did not work correctly in combination with `--tabs=0` and `--wrap=never`, see #937 ## Other - When saving/reading user-provided syntaxes or themes, `bat` will now maintain a `metadata.yaml` file which includes information about the `bat` version which was used to create the cached files. When loading cached files, we now print an error if they have been created with an incompatible version. See #882 - Updated `liquid` dependency to 0.20, see #880 (@ignatenkobrain) ## `bat` as a library - A completely new "high level" API has been added that is much more convenient to use. See the `examples` folder for the updated code. The older "low level" API is still available (basically everything that is not in the root `bat` module), but has been refactored quite a bit. It is recommended to only use the new "high level" API, if possible. This will be much easier to keep stable. Note that this should still be considered a "beta" release of `bat`-as-a-library. For more details and some screenshots of the example programs, see #936. - Stripped out a lot of binary-only dependencies, see #895 and #899 (@dtolnay) This introduces a `features = ["application"]` which is enabled by default and pulls in everything required by `bat` the application. When depending on bat as a library, downstream `Cargo.toml` should disable this feature to cut out inapplicable heavy dependencies: ``` toml [dependencies] bat = { version = "0.14", default-features = false } ``` Other optional functionality has also been put behind features: `paging` and `git` support. - Allow using the library with older syntect, see #896 and #898 (@dtolnay) ## New syntaxes - Rego, see #872 (@patrick-east) - Stylo, see #917 # v0.13.0 ## `bat` as a library Beginning with this release, `bat` can be used as a library (#423). This was a huge effort and I want to thank all people who made this possible: @DrSensor, @mitsuhiko, @mre, @eth-p! - Initial attempt in #469 (@mitsuhiko) - Second attempt, complete restructuring of the `bat` crate, see #679 (@DrSensor) - Updates to example, public API, error handling, further refactoring: #693 #873 #875 (@sharkdp) I want to stress that this is the very first release of the library. Things are very likely to change. A lot of things are still missing (including the documentation). That being said, you can start using it! See the example programs in [`examples/`](https://github.com/sharkdp/bat/tree/master/examples). You can see the API documentation here: https://docs.rs/bat/ ## Features - (**Breaking change**) Glob-based syntax mapping, see #877 and #592. With this change, users need to update their bat config files (`bat --config-file`), if they have any `--map-syntax` settings present. The option now works like this: ```bash --map-syntax : ``` For more information, see the `--help` text, the man page or the README. This new feature allows us to properly highlight files like: * `/etc/profile` * `~/.ssh/config` - `--highlight-line` now accepts line ranges, see #809 (@lkalir) - Proper wrapping support for output with wide Unicode characters, see #811 #787 and #815 (@Kogia-sima) - A lot of updates to existing syntaxes via #644 (@benwaffle, @keith-hall) - `BAT_CACHE_PATH` can be used to place cached `bat` assets in a non-standard path, see #829 (@neuronull) - Support combination of multiple styles at the same time, see #857 (@aslpavel) ## Bugfixes - Do not pass '--no-init' on newer less versions, see #749 and #786 (@sharkdp) - 'bat cache' still takes precedence over existing files, see #666 (@sharkdp) - `.sc` files should be treated as scala files, see #443 (@benwaffle) - Allow underscores and dashes in page names, see #670 (@LunarLambda) - Keep empty lines empty, see #601 (@mbarbar) - Wrapping does not work when piping, see #758 (@fusillicode, @allevo, @gildo) - Allow for non-unicode filenames, see #225 (@sharkdp) - Empty file without header produces incomplete grid, see #798 (@eth-p) - Files named `build` don't respect shebang lines, see #685 (@sharkdp) ## Other - Parametrizable names for man page and shell completion files, see #659 #673 #656 (@eth-p) - Enabled LTO, making `bat` about 10% faster, see #719 (@bolinfest, @sharkdp) - Suggestions non how to configure `bat` for MacOS dark mode, see README (@jerguslejko) - Extended ["Integration with other tools"](https://github.com/sharkdp/bat#integration-with-other-tools) section (@eth-p) - Updated [instrutions on how to use `bat` as a `man`-pager](https://github.com/sharkdp/bat#man), see #652, see #667 (@sharkdp) - Add section concerning file encodings, see #688 and #568 (@sharkdp) - Updated sort order of command-line options in `--help` text and manpage, see #653 and #700 (@hrlmartins) - Updates to the man page syntax, see #718 (@sharkdp) - Japanese documentation updates, see #863 (@k-ta-yamada, @sorairolake and @wt-l00) - Accept "default" as a theme, see #757 (@fvictorio) - Updated Windows installation instructions, see #852 (@sorenbug) - Updated man page, see #573 (@sharkdp) ## New syntaxes - Jinja2, see #648 (@Martin819) - SaltStack SLS, see #658 (@Martin819) - `/etc/fstab`, see #696 (@flopp and @eth-p) - `/etc/group` and `/etc/passwd`, see #698 (@argentite) - `/proc/cpuinfo` and `/proc/meminfo`, see #593 (@sharkdp) - Nim, see #542 (@sharkdp) - Vue, see #826 (@chaaaaarlotte) - CoffeScript, see #833 (@sharkdp) ## New themes - Dracula, see #687 (@clarfon) - Nord, see #760 (@crabique) - Solarized light and dark, see #768 (@hakamadare) ## Packaging - `bat` is now in the official Ubuntu and Debian repositories, see #323 and #705 (@MarcoFalke) - `bat` can now be installed via MacPorts, see #675 (@bn3t) - Install fish completions into 'vendor_completions.d', see #651 (@sharkdp) ## Thanks - To @eth-p for joining me as a maintainer! I'm very grateful for all the work you put into managing and responding to issues, improving our deployment, adding PR/issue templates (#837) as well as fixing bugs and implementing new features. # v0.12.1 ## Bugfixes - Fixes a bug for older Windows versions (*"The procedure entry point `CreateFile2` could not be located"*), see #643 (@rivy) # v0.12.0 ## Features - Binary file content can now be viewed with `bat -A`, see #623, #640 (@pjsier and @sharkdp) - `bat` can now be used as a man pager. Take a look at the README and #523 for more details. - Add new style component to separate multiple `--line-range`s, see #570 (@eth-p) - Added `-L` as an alias for `--list-languages` ## Bugfixes - Output looks unbalanced when using '--style=grid,numbers' without 'header', see #571 (@eth-p) - issues with filenames starting with "cache", see #584 - Can't build cache with new theme without creating cache dir, see #576 (@frm) - `--terminal-width -10` is parsed incorrectly, see #611 ## Other - Added fish completions to DEB package, see #554 ## New syntaxes - Emacs Org mode, see #36 (@bricewge) - `requirements.txt` - DotENV `.env` - SSH config syntax (`-l ssh_config`), see #582 (@issmirnov) - `/etc/hosts`, see #583 (@issmirnov) - GraphQL, see #625 (@dandavison) - Verilog, see #616 - SCSS and Sass, see #637 - `strace` syntax, see #599 ## Packaging - `bat` is now in the official Gentoo repositories, see #588 (@toku-sa-n) - `bat` is now in the official Alpine Linux repositories, see #586 (@5paceToast) - `bat` is in the official Fedora repositories, see #610 (@ignatenkobrain) # v0.11.0 ## Features - Three new special color themes are available: `ansi-light`, `ansi-dark` and `base16`. These are useful for people that often switch from dark to light themes in their terminal emulator or for people that want the colors to match their terminal theme colors. For more details, see #543 and #490 (@mk12, implementation idea by @trishume) - Hand-written auto completion script for Fish shell, see #524 and #555 (@ev-dev and @eth-p) - The `-p`/`--plain` option can now be used twice (typically `-pp`). The first `-p` switches the `--style` to "plain". The second `-p` disables the pager. See #560 and #552 (@eth-p) ## Bugfixes - Do not replace arguments to `less` when using `--pager`, see #509 - Binary files will now be indicated by a warning in interactive mode, see #530 #466 #550 (@maxfilov) - Empty files are (once again) printed with a single header line, see #504 and #566 (@reidwagner and @sharkdp) - `--terminal-width=0` is now disallowed, see #559 (@eth-p) - Accidental printing of files named `cache`, see #557 ## Other - New integration tests, see #500 and #502 (@reidwagner and @sharkdp) - New ["Integration with other tools"](https://github.com/sharkdp/bat#integration-with-other-tools) section in the README. - Migrated to Rust 2018 (@expobrain) ## New syntaxes - F# syntax has been updated, see #531 (@stroborobo) - Fish shell, see #548 (@sanga) ## Packaging - `bat` is now available on Chocolatey, see #541 (@rasmuskriest) # v0.10.0 ## Features - Added new `--highlight-line ` option, see #453, #346 and #175 (@tskinn and @sharkdp) ## Changes - **Change the default configuration directory on macOS** to `~/.config/bat`, see #442 (@lavifb). If you are on macOS, you need to copy your configuration directory from the previous place (`~/Library/Preferences/bat`) to the new place (`~/.config/bat`). - Completely disabled the generation of shell completion files, see #372 - Properly set arguments to `less` if `PAGER` environment variable contains something like `less -F` (which is missing the `-R` option), see #430 (@majecty) - Report the name of missing files, see #444 (@ufuji1984) - Don't start pager if file doesn't exist, see #387 - Rename `bat cache --init` to `bat cache --build`, see #498 - Move the `--config-dir` and `--cache-dir` options from `bat cache` to `bat` and hide them from the help text. ## Bugfixes - Blank line at the end of output when using `--style=plain`, see #379 - EOF must be sent twice on stdin if no other input is sent, see #477 (@reidwagner) ## New syntaxes - Twig (@ahmedelgabri) - `.desktop` files (@jleclanche) - AsciiDoc (@markusthoemmes) - Assembly (x86_64 and ARM) - Log files (@caos21) - Protobuf and ProtobufText (@caos21) - Terraform (@caos21) - Jsonnet (@hfm) - Varlink (@haraldh) ## Other - Added Japanese version of README (@sh-tech and @object1037) - Code improvements (@barskern) # v0.9.0 ## Features - A new `-A`/`--show-all` option has been added to show and highlight non-printable characters (in analogy to GNU `cat`s option): ![](https://camo.githubusercontent.com/c3e769482ef3184f6be6adaa34bdc8d19c378254/68747470733a2f2f692e696d6775722e636f6d2f324b54486859542e706e67) see #395 and #381 for more details. - Added `--pager` option (to configure the pager from the configuration file), see #362 (@majecty) - Added `BAT_CONFIG_PATH` environment variable to set a non-default path for `bat`s configuration file, see #375 (@deg4uss3r) - Allow for multiple occurrences of `--style` to allow for the configuration of styles from the config file, see #367 (@sindreij) - Allow for multiple `--line-range` arguments, see #23 - The `--terminal-width` option can now also accept offsets, see #376 ## Changes - Use of italics is now *disabled by default* (see #389 for details). They can be re-enabled by adding `--italic-text=always` to your configuration file. - The default tab-width has been set to 4. - Added new "Sublime Snazzy" theme. - Shell completions are currently *not* shipped anymore, see #372 for details. ## Bugfixes - Avoid endless recursion when `PAGER="bat"`, see #383 (@rodorgas) ## Other - `bat` is now available on openSUSE, see #405 (@dmarcoux) - Added section about the new configuration file in the README (@deg4uss3r) - Chinese translation of README (@chinanf-boy) - Re-written tests for `--tabs` (@choznerol) - Speed up integration tests, see #394 # v0.8.0 ## Features - Support for a configuration file with the following simple format: ```bash --tabs=4 --theme="Sublime Snazzy" # A line-comment --map-syntax .ignore:.gitignore --map-syntax PKGBUILD:bash --map-syntax Podfile:ruby # Flags and options can also be on a single line: --wrap=never --paging=never ``` The configuration file path can be accessed via `bat --config-file`. On Linux, it is stored in `~/.config/bat/config`. - Support for the `BAT_OPTS` environment variable with the same format as specified above (in a single line). This takes precedence over the configuration file. See also #310. - Support for custom syntax mappings via the `-m`/`--max-syntax` option. This allows users to (re)map certain file extensions or file names to an existing syntax: ``` bash bat --map-syntax .config:json ... ``` The option can be use multiple times. Note that you can easily make these mappings permanent by using bats new configuration file. See #169 - Support pager command-line arguments in `PAGER` and `BAT_PAGER`, see #352 (@Foxboron) - Add support for wildcards in Windows CMD, see #309 (@zxey) - First-line syntax detection for all input types, see #205 - Encoding support for UTF-16LE and UTF-16BE, see #285 - New syntaxes: Robot framework (@sanga) ## Changes - Binary files are now detected and not displayed when the output goes to an interactive terminal, see #205 ## Bugfixes - JavaDoc comments break syntax highlighting in .java files, see #81 - Bat Panics on Haskell Source Code, see #314 ## Other - Better `-h` and `--help` texts. - Updated documentation on how to configure `bat`s pager - Updated documentation for light backgrounds, see #328 (@russtaylor) - Generate shell completions during build, see #115 (@davideGiovannini) - A lot of new tests have been written - `bat` is now available via [Termux](https://termux.com/), see #341 (@fornwall) - `bat` is now available via [nix](https://nixos.org/nix), see #344 (@mgttlinger) - `bat` is now available via [Docker](https://hub.docker.com/r/danlynn/bat/), see #331 (@danlynn) # v0.7.1 ## Features - Use the `ansi_colours` package by @mina86 for better true-color approximation on 8 bit color terminals, see #319 and #202. ## Bugfixes - Bat Panics on Haskell Source Code, see #314 - Disable wrapping when `--style=plain`/`-p` is used, see #289 ## Other - Added Ansible install instructions (@aeimer) - Added section about Cygwin to the README (@eth-p) # v0.7.0 ## Features - Tabs are now (optionally) expanded to spaces. This can be controlled with the new `--tabs` command-line option or the `BAT_TABS` environment variable. The new feature also closes two bugs #166 and #184. For more information, see #302 (@eth-p). - Added support for the `BAT_STYLE` environment variable, see #208 (@ms2300) - Added `OneHalf` theme for terminals with a light-gray background, see #256 - Added new syntaxes for CSV, JSX in JavaScript and TypeScript, Cabal, Dart, F#, PureScript, Swift, Crystal, PowerShell (Many Thanks to @tobenna and @mimadrid) ## Changes - Query `git diff` only when needed, see #303 (@ShikChen) - Disable wrapping when `--plain` is used, see #289 (@eth-p) ## Bugfixes - Can read files named `cache`, see #275 (@BK1603) - A lot of bugfixes for Windows, see #252, #264 - Detect `less` reliably and in a portable way, see #271 and #290 (@Aankhen) - last decoration line is not formatted properly with `--wrap never`, see #299 (@Rogach) - Do not show file header for directories, see #292 ## Other - Enabled a new `aarch64` build target, see #258 (@rachitchokshi) - Provide Debian packages for `armhf`, see #280 (@rachitchokshi) - Added README section about "`bat` on Windows" (@Aankhen) - Windows installation via scoop (@meltinglava) # v0.6.1 ## Bugfixes - Fixed panic when running `bat --list-languages | head`, see #232 (@mchlrhw) - Respect `--color` settings for `--list-themes` and `--list-languages`, see #233 - Git modifications now work on Windows ## Other - There will be auto-generated Windows releases, starting with this version (@anykao) # v0.6.0 ## Features - The `--list-themes` option now shows a preview for each highlighting theme (@ms2300) - Added `-p`/`--plain` as an alias for `--style=plain`, see #212 (@ms2300) - Major refactorings, enabling some progress on #150. In non-interactive mode, `bat` will now copy input bytes 1:1. - New languages: Elm, Kotlin, Puppet, TypeScript, see #215 #216 #217 #218 - New syntax highlighting theme: zenburn (@colindean) ## Changes - New themes in `$BAT_CONFIG_DIR/themes` are now loaded *in addition* to the default themes (they may also override), see #172 - The `Default.tmTheme` symlink is not necessary anymore. ## Bugfixes * Using `bat cache --init` leads to duplicated syntaxes, see #206 ## Other * Extended and cleaned-up `--help` text. * Added initial version of a man page, see #52 * New README sections: *Development* and *Troubleshooting*, see #220 # v0.5.0 ## Features - Added `--line-range n:m` option to print a range of lines, see #159 (@tskinn) - The syntax highlighting theme can now be controlled by the `BAT_THEME` environment variable, see [README](https://github.com/sharkdp/bat#highlighting-theme) and #177 (@mandx) - The `PAGER` and `BAT_PAGER` environment variables can be used to control the pager that `bat` uses, see #158 and the [new README section](https://github.com/sharkdp/bat#using-a-different-pager) - Added syntax highlighting for Nix, see #180 - Added syntax highlighting for AWK (Gert Hulselmans) ## Changes - The customization of syntax sets and theme sets is now separated. Syntax definitions are now loaded *in addition* to the ones that are stored in the `bat` binary by default. Please refer to these new sections in the README: [Adding new syntaxes](https://github.com/sharkdp/bat#adding-new-syntaxes--language-definitions), [Adding new themes](https://github.com/sharkdp/bat#adding-new-themes), also see #172 - The color for the filename is now the default foreground color. The colors for the grid and the line numbers is now determined from the syntax highlighting theme, which now also works for light backgrounds, see #178. ## Bugfixes - Escape Sequences get partially stripped, see #182 (@eth-p) - Use separate Git repository for snapshot testing, see #165 and #161 - Markdown breaking on JavaScript, see #183 ## Other - Binaries for armv7 are now provided, see #196 - `bat` is now in the official [Arch package repositories](https://www.archlinux.org/packages/community/x86_64/bat/). - Optimizations in the RGB => 8-bit conversion (@mina86) # v0.4.1 (this is just a small bugfix release, see 0.4.0 for all features and changes) ## Bugfixes - Fix problem with `cargo test` when `bat` is not checked out in a Git repository, see #161 # v0.4.0 ## Features * Support for line-wrapping, see #54 and #102 (@eth-p) * New and updated `--style` parameter, see #74 and README (@pitkley) * Added `--theme` and `--list-themes` options, see #89 (@rleungx) * Added syntax highlighting for: Julia (@iamed2), Dockerfiles, VimL, CMake, INI, Less * Added a few popular Sublime Text highlighting themes, see #133 * Support for bold, italic and underline font styles, see #96 * Support for 32bit systems is now available, see #84 * Added `-u` and `-n` options, see #134 * ANSI color support on Windows 10 ## Changes * The customization folder for own syntaxes has been renamed from `syntax` to `syntaxes`, see README. * Changed Markdown syntax to the default Sublime Text syntax, see #157 * Sorted language listing (@rleungx) * Command line arguments like `--theme` or `--color` can now override themselves. * Improved `--help` text. ## Bugfixes - Fixed crash for (really) small terminal sizes, see #117 (@eth-p) - Syntax detection for `.bashrc`, `CMakeLists.txt` etc., see #100 - Properly handle lines with invalid UTF-8, see #7 (@BrainMaestro) - Better error handling, see #17 (@rleungx and @sharkdp) - Proper handling of UTF-8 characters in `less`, see #98 (@ghuls) - Build fix on nightly, see #148 (@tathanhdinh) ## Other - [Comparison with alternative projects](https://github.com/sharkdp/bat/blob/master/doc/alternatives.md). - New "bat" logo in the README, see #119 (@jraulhernandezi) - Output test cases (@BrainMaestro) - Lots of great refactoring work (@BrainMaestro) # v0.3.0 ## Features * Automatic paging by integrating with `less`, see #29 (@BrainMaestro) * Added support for reading from standard input, see #2 * Added support for writing to non-interactive terminals (pipes, files, ..); new `--color=auto/always/never` option, see #26 (@BrainMaestro) * Added `--list-languages` option to print all available syntaxes, see #69 (@connorkuehl) * New option to specify the syntax via `-l`/`--language`, see #19 (@BrainMaestro) * New option to control the output style (`--style`), see #5 (@nakulcg) * Added syntax highlighting support for TOML files, see #37 ## Changes * The `init-cache` sub-command has been removed. The cache can now be controlled via `bat cache`. See `bat cache -h` for all available commands. ## Bug fixes * Get git repository from file path instead of current directory, see #22 (@nakulcg) * Process substitution can now be used with bat (`bat <(echo a) <(echo b)`), see #80 ## Thanks I'd like to say a big THANK YOU to all contributors and everyone that has given us some form of feedback. Special thanks go to @BrainMaestro for his huge support with new features, bug reports and code reviews! # v0.2.3 - Added a new statically linked version of bat (`..-musl-..`) # v0.2.2 - Remove openssl dependency completely, see #30. # v0.2.1 - Added Elixir syntax, see #25. - Use libcurl-openssl instead of libcurl-gnutls, see #30. # v0.2.0 - Support for custom syntaxes, add 'Markdown extended' theme - Bugfix: Git modifications not shown from child folder # v0.1.0 Initial release bat-0.25.0/CONTRIBUTING.md000064400000000000000000000057331046102023000127170ustar 00000000000000# Contributing Thank you for considering to contribute to `bat`! ## Add an entry to the changelog Keeping the [`CHANGELOG.md`](CHANGELOG.md) file up-to-date makes the release process much easier and therefore helps to get your changes into a new `bat` release faster. However, not every change to the repository requires a changelog entry. Below are a few examples of that. Please update the changelog if your contribution contains changes regarding any of the following: - the behavior of `bat` - syntax mappings - syntax definitions - themes - the build system, linting, or CI workflows A changelog entry is not necessary when: - updating documentation - fixing typos >[!NOTE] > For PRs, a CI workflow verifies that a suitable changelog entry is > added. If such an entry is missing, the workflow will fail. If your > changes do not need an entry to the changelog (see above), that > workflow failure can be disregarded. ### Changelog entry format The top of the `CHANGELOG` contains a *"unreleased"* section with a few subsections (Features, Bugfixes, …). Please add your entry to the subsection that best describes your change. Entries must follow this format: ``` - Short description of what has been changed, see #123 (@user) ``` Please replace `#123` with the number of your pull request (not issue) and `@user` by your GitHub username. ## Development Please check out the [Development](https://github.com/sharkdp/bat#development) section in the README. ## Adding a new feature Please consider opening a [feature request ticket](https://github.com/sharkdp/bat/issues/new?assignees=&labels=feature-request&template=feature_request.md) first in order to give us a chance to discuss the details and specifics of the potential new feature before you go and build it. ## Adding new syntaxes/languages or themes Before you make a pull request that adds a new syntax or theme, please read the [Customization](https://github.com/sharkdp/bat#customization) section in the README first. If you really think that a particular syntax or theme should be added for all users, please read the corresponding [documentation](https://github.com/sharkdp/bat/blob/master/doc/assets.md) first. ## Regression tests You are **strongly encouraged** to add regression tests. Regression tests are great, not least because they: * ensure that your contribution will never completely stop working. * makes code reviews easier, because it becomes very clear what the code is supposed to do. For functional changes, you most likely want to add a test to [`tests/integration_tests.rs`](https://github.com/sharkdp/bat/blob/master/tests/integration_tests.rs). Look at existing tests to know how to write a new test. In short, you will invoke the `bat` binary with a certain set of arguments, and then assert on stdout/stderr. To learn how to write regression tests for theme and syntax changes, read the [Syntax tests](https://github.com/sharkdp/bat/blob/master/doc/assets.md#syntax-tests) section in `assets.md`. bat-0.25.0/Cargo.lock0000644000001367200000000000100076520ustar # This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 3 [[package]] name = "adler2" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "aho-corasick" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] [[package]] name = "ansi_colours" version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14eec43e0298190790f41679fe69ef7a829d2a2ddd78c8c00339e84710e435fe" dependencies = [ "rgb", ] [[package]] name = "anstream" version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" [[package]] name = "anstyle-parse" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" dependencies = [ "windows-sys 0.48.0", ] [[package]] name = "anstyle-wincon" version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", "windows-sys 0.59.0", ] [[package]] name = "anyhow" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "assert_cmd" version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88903cb14723e4d4003335bb7f8a14f27691649105346a0f0957466c096adfe6" dependencies = [ "anstyle", "bstr", "doc-comment", "predicates", "predicates-core", "predicates-tree", "wait-timeout", ] [[package]] name = "autocfg" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "base64" version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bat" version = "0.25.0" dependencies = [ "ansi_colours", "anyhow", "assert_cmd", "bincode", "bugreport", "bytesize", "clap", "clircle", "console", "content_inspector", "encoding_rs", "etcetera", "execute", "expect-test", "flate2", "git2", "globset", "grep-cli", "home", "indexmap", "itertools", "nix", "nu-ansi-term", "once_cell", "path_abs", "plist", "predicates", "regex", "semver", "serde", "serde_derive", "serde_with", "serde_yaml", "serial_test", "shell-words", "syntect", "tempfile", "terminal-colorsaurus", "thiserror", "toml", "unicode-width 0.1.13", "wait-timeout", "walkdir", "wild", ] [[package]] name = "bincode" version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" dependencies = [ "serde", ] [[package]] name = "bit-set" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" dependencies = [ "bit-vec", ] [[package]] name = "bit-vec" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" [[package]] name = "bstr" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "542f33a8835a0884b006a0c3df3dadd99c0c3f296ed26c2fdc8028e01ad6230c" dependencies = [ "memchr", "regex-automata", "serde", ] [[package]] name = "bugreport" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "535120b8182547808081a66f1f77a64533c780b23da26763e0ee34dfb94f98c9" dependencies = [ "git-version", "shell-escape", "sys-info", ] [[package]] name = "bytemuck" version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f5715e491b5a1598fc2bef5a606847b5dc1d48ea625bd3c02c00de8285591da" [[package]] name = "bytesize" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e368af43e418a04d52505cf3dbc23dda4e3407ae2fa99fd0e4f308ce546acc" [[package]] name = "cc" version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "jobserver", "libc", ] [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cfg_aliases" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "clap" version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fbb260a053428790f3de475e304ff84cdbc4face759ea7a3e64c1edd938a7fc" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64b17d7ea74e9f833c7dbf2cbe4fb12ff26783eda4782a8975b72f895c9b4d99" dependencies = [ "anstream", "anstyle", "clap_lex", "strsim 0.11.1", "terminal_size", ] [[package]] name = "clap_lex" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "clircle" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d9334f725b46fb9bed8580b9b47a932587e044fadb344ed7fa98774b067ac1a" dependencies = [ "cfg-if", "windows", ] [[package]] name = "colorchoice" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "console" version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" dependencies = [ "encode_unicode", "libc", "once_cell", "unicode-width 0.2.0", "windows-sys 0.59.0", ] [[package]] name = "content_inspector" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7bda66e858c683005a53a9a60c69a4aca7eeaa45d124526e389f7aec8e62f38" dependencies = [ "memchr", ] [[package]] name = "crc32fast" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] [[package]] name = "darling" version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" dependencies = [ "darling_core", "darling_macro", ] [[package]] name = "darling_core" version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim 0.10.0", "syn", ] [[package]] name = "darling_macro" version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", "syn", ] [[package]] name = "dashmap" version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" dependencies = [ "cfg-if", "hashbrown 0.12.3", "lock_api", "once_cell", "parking_lot_core", ] [[package]] name = "deranged" version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", ] [[package]] name = "difflib" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" [[package]] name = "dissimilar" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd5f0c7e4bd266b8ab2550e6238d2e74977c23c15536ac7be45e9c95e2e3fbbb" [[package]] name = "doc-comment" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "either" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" [[package]] name = "encode_unicode" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "encoding_rs" version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] [[package]] name = "equivalent" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" dependencies = [ "errno-dragonfly", "libc", "windows-sys 0.48.0", ] [[package]] name = "errno-dragonfly" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" dependencies = [ "cc", "libc", ] [[package]] name = "etcetera" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" dependencies = [ "cfg-if", "home", "windows-sys 0.48.0", ] [[package]] name = "execute" version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a82608ee96ce76aeab659e9b8d3c2b787bffd223199af88c674923d861ada10" dependencies = [ "execute-command-macro", "execute-command-tokens", "generic-array", ] [[package]] name = "execute-command-macro" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90dec53d547564e911dc4ff3ecb726a64cf41a6fa01a2370ebc0d95175dd08bd" dependencies = [ "execute-command-macro-impl", ] [[package]] name = "execute-command-macro-impl" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce8cd46a041ad005ab9c71263f9a0ff5b529eac0fe4cc9b4a20f4f0765d8cf4b" dependencies = [ "execute-command-tokens", "quote", "syn", ] [[package]] name = "execute-command-tokens" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69dc321eb6be977f44674620ca3aa21703cb20ffbe560e1ae97da08401ffbcad" [[package]] name = "expect-test" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e0be0a561335815e06dab7c62e50353134c796e7a6155402a64bcff66b6a5e0" dependencies = [ "dissimilar", "once_cell", ] [[package]] name = "fancy-regex" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2" dependencies = [ "bit-set", "regex", ] [[package]] name = "fastrand" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" [[package]] name = "flate2" version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "miniz_oxide", ] [[package]] name = "float-cmp" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" dependencies = [ "num-traits", ] [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] [[package]] name = "generic-array" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2cb8bc4c28d15ade99c7e90b219f30da4be5c88e586277e8cbe886beeb868ab2" dependencies = [ "typenum", ] [[package]] name = "git-version" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ad568aa3db0fcbc81f2f116137f263d7304f512a1209b35b85150d3ef88ad19" dependencies = [ "git-version-macro", ] [[package]] name = "git-version-macro" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "git2" version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b903b73e45dc0c6c596f2d37eccece7c1c8bb6e4407b001096387c63d0d93724" dependencies = [ "bitflags 2.4.0", "libc", "libgit2-sys", "log", "url", ] [[package]] name = "glob" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "globset" version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19" dependencies = [ "aho-corasick", "bstr", "log", "regex-automata", "regex-syntax", ] [[package]] name = "grep-cli" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47f1288f0e06f279f84926fa4c17e3fcd2a22b357927a82f2777f7be26e4cec0" dependencies = [ "bstr", "globset", "libc", "log", "termcolor", "winapi-util", ] [[package]] name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12" [[package]] name = "hermit-abi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "home" version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "ident_case" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", ] [[package]] name = "indexmap" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3fc2e30ba82dd1b3911c8de1ffc143c74a914a14e99514d7637e3099df5ea0" dependencies = [ "equivalent", "hashbrown 0.14.1", "serde", ] [[package]] name = "is_terminal_polyfill" version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itertools" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ "either", ] [[package]] name = "itoa" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" [[package]] name = "jobserver" version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b" dependencies = [ "libc", ] [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "libgit2-sys" version = "0.17.0+1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10472326a8a6477c3c20a64547b0059e4b0d086869eee31e6d7da728a8eb7224" dependencies = [ "cc", "libc", "libz-sys", "pkg-config", ] [[package]] name = "libz-sys" version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9702761c3935f8cc2f101793272e202c72b99da8f4224a19ddcf1279a6450bbf" dependencies = [ "cc", "libc", "pkg-config", "vcpkg", ] [[package]] name = "linked-hash-map" version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" [[package]] name = "lock_api" version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ "autocfg", "scopeguard", ] [[package]] name = "log" version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "miniz_oxide" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ "adler2", ] [[package]] name = "mio" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4929e1f84c5e54c3ec6141cd5d8b5a5c055f031f80cf78f2072920173cb4d880" dependencies = [ "hermit-abi", "libc", "wasi", "windows-sys 0.52.0", ] [[package]] name = "nix" version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ "bitflags 2.4.0", "cfg-if", "cfg_aliases", "libc", ] [[package]] name = "normalize-line-endings" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" [[package]] name = "nu-ansi-term" version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd2800e1520bdc966782168a627aa5d1ad92e33b984bf7c7615d31280c83ff14" dependencies = [ "windows-sys 0.48.0", ] [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] name = "num-traits" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", ] [[package]] name = "once_cell" version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "onig" version = "6.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c4b31c8722ad9171c6d77d3557db078cab2bd50afcc9d09c8b315c59df8ca4f" dependencies = [ "bitflags 1.3.2", "libc", "once_cell", "onig_sys", ] [[package]] name = "onig_sys" version = "69.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b829e3d7e9cc74c7e315ee8edb185bf4190da5acde74afd7fc59c35b1f086e7" dependencies = [ "cc", "pkg-config", ] [[package]] name = "parking_lot" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", "parking_lot_core", ] [[package]] name = "parking_lot_core" version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" dependencies = [ "cfg-if", "libc", "redox_syscall 0.2.16", "smallvec", "windows-sys 0.45.0", ] [[package]] name = "path_abs" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05ef02f6342ac01d8a93b65f96db53fe68a92a15f41144f97fb00a9e669633c3" dependencies = [ "std_prelude", ] [[package]] name = "percent-encoding" version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pkg-config" version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" [[package]] name = "plist" version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" dependencies = [ "base64", "indexmap", "quick-xml", "serde", "time", ] [[package]] name = "powerfmt" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "predicates" version = "3.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5d19ee57562043d37e82899fade9a22ebab7be9cef5026b07fda9cdd4293573" dependencies = [ "anstyle", "difflib", "float-cmp", "normalize-line-endings", "predicates-core", "regex", ] [[package]] name = "predicates-core" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" [[package]] name = "predicates-tree" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d86de6de25020a36c6d3643a86d9a6a9f552107c0559c60ea03551b5e16c032" dependencies = [ "predicates-core", "termtree", ] [[package]] name = "proc-macro2" version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] [[package]] name = "quick-xml" version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2" dependencies = [ "memchr", ] [[package]] name = "quote" version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] [[package]] name = "redox_syscall" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ "bitflags 1.3.2", ] [[package]] name = "redox_syscall" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] [[package]] name = "regex" version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", "regex-automata", "regex-syntax", ] [[package]] name = "regex-automata" version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", "regex-syntax", ] [[package]] name = "regex-syntax" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "rgb" version = "0.8.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3603b7d71ca82644f79b5a06d1220e9a58ede60bd32255f698cb1af8838b8db3" dependencies = [ "bytemuck", ] [[package]] name = "rustix" version = "0.38.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" dependencies = [ "bitflags 2.4.0", "errno", "libc", "linux-raw-sys", "windows-sys 0.48.0", ] [[package]] name = "ryu" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" [[package]] name = "same-file" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" dependencies = [ "winapi-util", ] [[package]] name = "scopeguard" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "semver" version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "serde_json" version = "1.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44" dependencies = [ "itoa", "ryu", "serde", ] [[package]] name = "serde_spanned" version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] [[package]] name = "serde_with" version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" dependencies = [ "serde", "serde_derive", "serde_with_macros", ] [[package]] name = "serde_with_macros" version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" dependencies = [ "darling", "proc-macro2", "quote", "syn", ] [[package]] name = "serde_yaml" version = "0.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a15e0ef66bf939a7c890a0bf6d5a733c70202225f9888a89ed5c62298b019129" dependencies = [ "indexmap", "itoa", "ryu", "serde", "unsafe-libyaml", ] [[package]] name = "serial_test" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e56dd856803e253c8f298af3f4d7eb0ae5e23a737252cd90bb4f3b435033b2d" dependencies = [ "dashmap", "lazy_static", "parking_lot", "serial_test_derive", ] [[package]] name = "serial_test_derive" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "shell-escape" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f" [[package]] name = "shell-words" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" [[package]] name = "smallvec" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "std_prelude" version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8207e78455ffdf55661170876f88daf85356e4edd54e0a3dbc79586ca1e50cbe" [[package]] name = "strsim" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" version = "2.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c786062daee0d6db1132800e623df74274a0a87322d8e183338e01b3d98d058" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "syntect" version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "874dcfa363995604333cf947ae9f751ca3af4522c60886774c4963943b4746b1" dependencies = [ "bincode", "bitflags 1.3.2", "fancy-regex", "flate2", "fnv", "once_cell", "onig", "plist", "regex-syntax", "serde", "serde_derive", "serde_json", "thiserror", "walkdir", "yaml-rust", ] [[package]] name = "sys-info" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b3a0d0aba8bf96a0e1ddfdc352fc53b3df7f39318c71854910c3c4b024ae52c" dependencies = [ "cc", "libc", ] [[package]] name = "tempfile" version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" dependencies = [ "cfg-if", "fastrand", "redox_syscall 0.4.1", "rustix", "windows-sys 0.48.0", ] [[package]] name = "termcolor" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" dependencies = [ "winapi-util", ] [[package]] name = "terminal-colorsaurus" version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "858625398bdd5da7a96e8ad33a10031a50c3a5ad50d5aaa81a2827369a9c216c" dependencies = [ "cfg-if", "libc", "memchr", "mio", "terminal-trx", "windows-sys 0.59.0", ] [[package]] name = "terminal-trx" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57a5b836e7f4f81afe61b5cd399eee774f25edcfd47009a76e29f53bb6487833" dependencies = [ "cfg-if", "libc", "windows-sys 0.59.0", ] [[package]] name = "terminal_size" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" dependencies = [ "rustix", "windows-sys 0.48.0", ] [[package]] name = "termtree" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "507e9898683b6c43a9aa55b64259b721b52ba226e0f3779137e50ad114a4c90b" [[package]] name = "thiserror" version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "time" version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", "num-conv", "powerfmt", "serde", "time-core", "time-macros", ] [[package]] name = "time-core" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ "num-conv", "time-core", ] [[package]] name = "tinyvec" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] [[package]] name = "tinyvec_macros" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "toml" version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", "toml_edit", ] [[package]] name = "toml_datetime" version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" dependencies = [ "serde", ] [[package]] name = "toml_edit" version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", "winnow", ] [[package]] name = "typenum" version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-bidi" version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcc811dc4066ac62f84f11307873c4850cb653bfa9b1719cee2bd2204a4bc5dd" [[package]] name = "unicode-normalization" version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" dependencies = [ "tinyvec", ] [[package]] name = "unicode-width" version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "unicode-width" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" [[package]] name = "unsafe-libyaml" version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b" [[package]] name = "url" version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] [[package]] name = "utf8parse" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "vcpkg" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "wait-timeout" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" dependencies = [ "libc", ] [[package]] name = "walkdir" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", ] [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wild" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3131afc8c575281e1e80f36ed6a092aa502c08b18ed7524e86fbbb12bb410e1" dependencies = [ "glob", ] [[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows" version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1de69df01bdf1ead2f4ac895dc77c9351aefff65b2f3db429a343f9cbf05e132" dependencies = [ "windows-core", "windows-targets 0.52.6", ] [[package]] name = "windows-core" version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4698e52ed2d08f8658ab0c39512a7c00ee5fe2688c65f8c0a4f06750d729f2a6" dependencies = [ "windows-implement", "windows-interface", "windows-result", "windows-targets 0.52.6", ] [[package]] name = "windows-implement" version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "windows-interface" version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "windows-result" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" dependencies = [ "windows-targets 0.52.6", ] [[package]] name = "windows-sys" version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ "windows-targets 0.42.1", ] [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ "windows-targets 0.48.0", ] [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ "windows-targets 0.52.6", ] [[package]] name = "windows-sys" version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ "windows-targets 0.52.6", ] [[package]] name = "windows-targets" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" dependencies = [ "windows_aarch64_gnullvm 0.42.1", "windows_aarch64_msvc 0.42.1", "windows_i686_gnu 0.42.1", "windows_i686_msvc 0.42.1", "windows_x86_64_gnu 0.42.1", "windows_x86_64_gnullvm 0.42.1", "windows_x86_64_msvc 0.42.1", ] [[package]] name = "windows-targets" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" dependencies = [ "windows_aarch64_gnullvm 0.48.0", "windows_aarch64_msvc 0.48.0", "windows_i686_gnu 0.48.0", "windows_i686_msvc 0.48.0", "windows_x86_64_gnu 0.48.0", "windows_x86_64_gnullvm 0.48.0", "windows_x86_64_msvc 0.48.0", ] [[package]] name = "windows-targets" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] [[package]] name = "windows_aarch64_gnullvm" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" [[package]] name = "windows_aarch64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" [[package]] name = "windows_aarch64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" [[package]] name = "windows_i686_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" [[package]] name = "windows_i686_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" [[package]] name = "windows_x86_64_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" [[package]] name = "windows_x86_64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" [[package]] name = "windows_x86_64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] [[package]] name = "yaml-rust" version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" dependencies = [ "linked-hash-map", ] bat-0.25.0/Cargo.toml0000644000000126060000000000100076710ustar # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies. # # If you are reading this file be aware that the original Cargo.toml # will likely look very different (and much more reasonable). # See Cargo.toml.orig for the original contents. [package] edition = "2021" rust-version = "1.74" name = "bat" version = "0.25.0" authors = ["David Peter "] build = "build/main.rs" exclude = [ "assets/syntaxes/*", "assets/themes/*", ] autolib = false autobins = false autoexamples = false autotests = false autobenches = false description = "A cat(1) clone with wings." homepage = "https://github.com/sharkdp/bat" readme = "README.md" categories = ["command-line-utilities"] license = "MIT OR Apache-2.0" repository = "https://github.com/sharkdp/bat" [profile.release] lto = true codegen-units = 1 strip = true [lib] name = "bat" path = "src/lib.rs" [[bin]] name = "bat" path = "src/bin/bat/main.rs" [[example]] name = "advanced" path = "examples/advanced.rs" [[example]] name = "buffer" path = "examples/buffer.rs" [[example]] name = "cat" path = "examples/cat.rs" [[example]] name = "inputs" path = "examples/inputs.rs" [[example]] name = "list_syntaxes_and_themes" path = "examples/list_syntaxes_and_themes.rs" [[example]] name = "simple" path = "examples/simple.rs" [[example]] name = "yaml" path = "examples/yaml.rs" [[test]] name = "assets" path = "tests/assets.rs" [[test]] name = "github-actions" path = "tests/github-actions.rs" [[test]] name = "integration_tests" path = "tests/integration_tests.rs" [[test]] name = "no_duplicate_extensions" path = "tests/no_duplicate_extensions.rs" [[test]] name = "snapshot_tests" path = "tests/snapshot_tests.rs" [[test]] name = "system_wide_config" path = "tests/system_wide_config.rs" [[test]] name = "test_pretty_printer" path = "tests/test_pretty_printer.rs" [dependencies.ansi_colours] version = "^1.2" [dependencies.bincode] version = "1.0" [dependencies.bugreport] version = "0.5.0" optional = true [dependencies.bytesize] version = "1.3.0" [dependencies.clap] version = "4.4.12" features = [ "wrap_help", "cargo", ] optional = true [dependencies.clircle] version = "0.6.1" default-features = false [dependencies.console] version = "0.15.10" [dependencies.content_inspector] version = "0.2.4" [dependencies.encoding_rs] version = "0.8.35" [dependencies.etcetera] version = "0.8.0" optional = true [dependencies.execute] version = "0.2.13" optional = true [dependencies.flate2] version = "1.0" [dependencies.git2] version = "0.19" optional = true default-features = false [dependencies.globset] version = "0.4" [dependencies.grep-cli] version = "0.1.11" optional = true [dependencies.nu-ansi-term] version = "0.50.0" [dependencies.once_cell] version = "1.20" [dependencies.path_abs] version = "0.5" default-features = false [dependencies.regex] version = "1.10.6" optional = true [dependencies.semver] version = "1.0" [dependencies.serde] version = "1.0" [dependencies.serde_derive] version = "1.0" [dependencies.serde_yaml] version = "0.9.28" [dependencies.shell-words] version = "1.1.0" optional = true [dependencies.syntect] version = "5.2.0" features = ["parsing"] default-features = false [dependencies.terminal-colorsaurus] version = "0.4" [dependencies.thiserror] version = "1.0" [dependencies.unicode-width] version = "0.1.13" [dependencies.walkdir] version = "2.5" optional = true [dependencies.wild] version = "2.2" optional = true [dev-dependencies.assert_cmd] version = "2.0.12" [dev-dependencies.expect-test] version = "1.5.0" [dev-dependencies.predicates] version = "3.1.3" [dev-dependencies.serde] version = "1.0" features = ["derive"] [dev-dependencies.serial_test] version = "2.0.0" default-features = false [dev-dependencies.tempfile] version = "3.8.1" [dev-dependencies.wait-timeout] version = "0.2.0" [build-dependencies.anyhow] version = "1.0.86" [build-dependencies.clap] version = "4.4.12" features = [ "wrap_help", "cargo", ] optional = true [build-dependencies.indexmap] version = "2.3.0" features = ["serde"] [build-dependencies.itertools] version = "0.13.0" [build-dependencies.once_cell] version = "1.20" [build-dependencies.regex] version = "1.10.6" [build-dependencies.serde] version = "1.0" [build-dependencies.serde_derive] version = "1.0" [build-dependencies.serde_with] version = "3.12.0" features = ["macros"] default-features = false [build-dependencies.toml] version = "0.8.19" features = ["preserve_order"] [build-dependencies.walkdir] version = "2.5" [features] application = [ "bugreport", "build-assets", "git", "minimal-application", ] build-assets = [ "syntect/yaml-load", "syntect/plist-load", "regex", "walkdir", ] default = ["application"] git = ["git2"] lessopen = ["execute"] minimal-application = [ "clap", "etcetera", "paging", "regex-onig", "wild", ] paging = [ "shell-words", "grep-cli", ] regex-fancy = ["syntect/regex-fancy"] regex-onig = ["syntect/regex-onig"] [target.'cfg(target_os = "macos")'.dependencies.home] version = "0.5.9" [target.'cfg(target_os = "macos")'.dependencies.plist] version = "1.7.0" [target."cfg(unix)".dev-dependencies.nix] version = "0.29" features = ["term"] default-features = false bat-0.25.0/Cargo.toml.orig0000644000000065370000000000100106360ustar [package] authors = ["David Peter "] categories = ["command-line-utilities"] description = "A cat(1) clone with wings." homepage = "https://github.com/sharkdp/bat" license = "MIT OR Apache-2.0" name = "bat" repository = "https://github.com/sharkdp/bat" version = "0.25.0" exclude = ["assets/syntaxes/*", "assets/themes/*"] build = "build/main.rs" edition = '2021' rust-version = "1.74" [features] default = ["application"] # Feature required for bat the application. Should be disabled when depending on # bat as a library. application = [ "bugreport", "build-assets", "git", "minimal-application", ] # Mainly for developers that want to iterate quickly # Be aware that the included features might change in the future minimal-application = [ "clap", "etcetera", "paging", "regex-onig", "wild", ] git = ["git2"] # Support indicating git modifications paging = ["shell-words", "grep-cli"] # Support applying a pager on the output lessopen = ["execute"] # Support $LESSOPEN preprocessor build-assets = ["syntect/yaml-load", "syntect/plist-load", "regex", "walkdir"] # You need to use one of these if you depend on bat as a library: regex-onig = ["syntect/regex-onig"] # Use the "oniguruma" regex engine regex-fancy = ["syntect/regex-fancy"] # Use the rust-only "fancy-regex" engine [dependencies] nu-ansi-term = "0.50.0" ansi_colours = "^1.2" bincode = "1.0" console = "0.15.10" flate2 = "1.0" once_cell = "1.20" thiserror = "1.0" wild = { version = "2.2", optional = true } content_inspector = "0.2.4" shell-words = { version = "1.1.0", optional = true } unicode-width = "0.1.13" globset = "0.4" serde = "1.0" serde_derive = "1.0" serde_yaml = "0.9.28" semver = "1.0" path_abs = { version = "0.5", default-features = false } clircle = { version = "0.6.1", default-features = false } bugreport = { version = "0.5.0", optional = true } etcetera = { version = "0.8.0", optional = true } grep-cli = { version = "0.1.11", optional = true } regex = { version = "1.10.6", optional = true } walkdir = { version = "2.5", optional = true } bytesize = { version = "1.3.0" } encoding_rs = "0.8.35" execute = { version = "0.2.13", optional = true } terminal-colorsaurus = "0.4" [dependencies.git2] version = "0.19" optional = true default-features = false [dependencies.syntect] version = "5.2.0" default-features = false features = ["parsing"] [dependencies.clap] version = "4.4.12" optional = true features = ["wrap_help", "cargo"] [target.'cfg(target_os = "macos")'.dependencies] home = "0.5.9" plist = "1.7.0" [dev-dependencies] assert_cmd = "2.0.12" expect-test = "1.5.0" serial_test = { version = "2.0.0", default-features = false } predicates = "3.1.3" wait-timeout = "0.2.0" tempfile = "3.8.1" serde = { version = "1.0", features = ["derive"] } [target.'cfg(unix)'.dev-dependencies] nix = { version = "0.29", default-features = false, features = ["term"] } [build-dependencies] anyhow = "1.0.86" indexmap = { version = "2.3.0", features = ["serde"] } itertools = "0.13.0" once_cell = "1.20" regex = "1.10.6" serde = "1.0" serde_derive = "1.0" serde_with = { version = "3.12.0", default-features = false, features = ["macros"] } toml = { version = "0.8.19", features = ["preserve_order"] } walkdir = "2.5" [build-dependencies.clap] version = "4.4.12" optional = true features = ["wrap_help", "cargo"] [profile.release] lto = true strip = true codegen-units = 1 bat-0.25.0/Cargo.toml.orig000064400000000000000000000065371046102023000133600ustar 00000000000000[package] authors = ["David Peter "] categories = ["command-line-utilities"] description = "A cat(1) clone with wings." homepage = "https://github.com/sharkdp/bat" license = "MIT OR Apache-2.0" name = "bat" repository = "https://github.com/sharkdp/bat" version = "0.25.0" exclude = ["assets/syntaxes/*", "assets/themes/*"] build = "build/main.rs" edition = '2021' rust-version = "1.74" [features] default = ["application"] # Feature required for bat the application. Should be disabled when depending on # bat as a library. application = [ "bugreport", "build-assets", "git", "minimal-application", ] # Mainly for developers that want to iterate quickly # Be aware that the included features might change in the future minimal-application = [ "clap", "etcetera", "paging", "regex-onig", "wild", ] git = ["git2"] # Support indicating git modifications paging = ["shell-words", "grep-cli"] # Support applying a pager on the output lessopen = ["execute"] # Support $LESSOPEN preprocessor build-assets = ["syntect/yaml-load", "syntect/plist-load", "regex", "walkdir"] # You need to use one of these if you depend on bat as a library: regex-onig = ["syntect/regex-onig"] # Use the "oniguruma" regex engine regex-fancy = ["syntect/regex-fancy"] # Use the rust-only "fancy-regex" engine [dependencies] nu-ansi-term = "0.50.0" ansi_colours = "^1.2" bincode = "1.0" console = "0.15.10" flate2 = "1.0" once_cell = "1.20" thiserror = "1.0" wild = { version = "2.2", optional = true } content_inspector = "0.2.4" shell-words = { version = "1.1.0", optional = true } unicode-width = "0.1.13" globset = "0.4" serde = "1.0" serde_derive = "1.0" serde_yaml = "0.9.28" semver = "1.0" path_abs = { version = "0.5", default-features = false } clircle = { version = "0.6.1", default-features = false } bugreport = { version = "0.5.0", optional = true } etcetera = { version = "0.8.0", optional = true } grep-cli = { version = "0.1.11", optional = true } regex = { version = "1.10.6", optional = true } walkdir = { version = "2.5", optional = true } bytesize = { version = "1.3.0" } encoding_rs = "0.8.35" execute = { version = "0.2.13", optional = true } terminal-colorsaurus = "0.4" [dependencies.git2] version = "0.19" optional = true default-features = false [dependencies.syntect] version = "5.2.0" default-features = false features = ["parsing"] [dependencies.clap] version = "4.4.12" optional = true features = ["wrap_help", "cargo"] [target.'cfg(target_os = "macos")'.dependencies] home = "0.5.9" plist = "1.7.0" [dev-dependencies] assert_cmd = "2.0.12" expect-test = "1.5.0" serial_test = { version = "2.0.0", default-features = false } predicates = "3.1.3" wait-timeout = "0.2.0" tempfile = "3.8.1" serde = { version = "1.0", features = ["derive"] } [target.'cfg(unix)'.dev-dependencies] nix = { version = "0.29", default-features = false, features = ["term"] } [build-dependencies] anyhow = "1.0.86" indexmap = { version = "2.3.0", features = ["serde"] } itertools = "0.13.0" once_cell = "1.20" regex = "1.10.6" serde = "1.0" serde_derive = "1.0" serde_with = { version = "3.12.0", default-features = false, features = ["macros"] } toml = { version = "0.8.19", features = ["preserve_order"] } walkdir = "2.5" [build-dependencies.clap] version = "4.4.12" optional = true features = ["wrap_help", "cargo"] [profile.release] lto = true strip = true codegen-units = 1 bat-0.25.0/LICENSE-APACHE000064400000000000000000000261351046102023000124110ustar 00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. bat-0.25.0/LICENSE-MIT000064400000000000000000000021111046102023000121050ustar 00000000000000Copyright (c) 2018-2023 bat-developers (https://github.com/sharkdp/bat). Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. bat-0.25.0/NOTICE000064400000000000000000000003701046102023000113620ustar 00000000000000Copyright (c) 2018-2021 bat-developers (https://github.com/sharkdp/bat). bat is made available under the terms of either the MIT License or the Apache License 2.0, at your option. See the LICENSE-APACHE and LICENSE-MIT files for license details. bat-0.25.0/README.md000064400000000000000000000746631046102023000117550ustar 00000000000000

bat - a cat clone with wings
Build Status license Version info
A cat(1) clone with syntax highlighting and Git integration.

Key Features β€’ How To Use β€’ Installation β€’ Customization β€’ Project goals, alternatives
[English] [δΈ­ζ–‡] [ζ—₯本θͺž] [ν•œκ΅­μ–΄] [Русский]

### Sponsors A special *thank you* goes to our biggest sponsors:
WorkOS
Your app, enterprise-ready.
Start selling to enterprise customers with just a few lines of code.
Add Single Sign-On (and more) in minutes instead of months.
Warp
Warp, the intelligent terminal
Run commands like a power user with AI and your dev team’s
knowledge in one fast, intuitive terminal. For MacOS or Linux.
### Syntax highlighting `bat` supports syntax highlighting for a large number of programming and markup languages: ![Syntax highlighting example](https://imgur.com/rGsdnDe.png) ### Git integration `bat` communicates with `git` to show modifications with respect to the index (see left side bar): ![Git integration example](https://i.imgur.com/2lSW4RE.png) ### Show non-printable characters You can use the `-A`/`--show-all` option to show and highlight non-printable characters: ![Non-printable character example](https://i.imgur.com/WndGp9H.png) ### Automatic paging By default, `bat` pipes its own output to a pager (e.g. `less`) if the output is too large for one screen. If you would rather `bat` work like `cat` all the time (never page output), you can set `--paging=never` as an option, either on the command line or in your configuration file. If you intend to alias `cat` to `bat` in your shell configuration, you can use `alias cat='bat --paging=never'` to preserve the default behavior. #### File concatenation Even with a pager set, you can still use `bat` to concatenate files :wink:. Whenever `bat` detects a non-interactive terminal (i.e. when you pipe into another process or into a file), `bat` will act as a drop-in replacement for `cat` and fall back to printing the plain file contents, regardless of the `--pager` option's value. ## How to use Display a single file on the terminal ```bash > bat README.md ``` Display multiple files at once ```bash > bat src/*.rs ``` Read from stdin, determine the syntax automatically (note, highlighting will only work if the syntax can be determined from the first line of the file, usually through a shebang such as `#!/bin/sh`) ```bash > curl -s https://sh.rustup.rs | bat ``` Read from stdin, specify the language explicitly ```bash > yaml2json .travis.yml | json_pp | bat -l json ``` Show and highlight non-printable characters: ```bash > bat -A /etc/hosts ``` Use it as a `cat` replacement: ```bash bat > note.md # quickly create a new file bat header.md content.md footer.md > document.md bat -n main.rs # show line numbers (only) bat f - g # output 'f', then stdin, then 'g'. ``` ### Integration with other tools #### `fzf` You can use `bat` as a previewer for [`fzf`](https://github.com/junegunn/fzf). To do this, use `bat`s `--color=always` option to force colorized output. You can also use `--line-range` option to restrict the load times for long files: ```bash fzf --preview "bat --color=always --style=numbers --line-range=:500 {}" ``` For more information, see [`fzf`'s `README`](https://github.com/junegunn/fzf#preview-window). #### `find` or `fd` You can use the `-exec` option of `find` to preview all search results with `bat`: ```bash find … -exec bat {} + ``` If you happen to use [`fd`](https://github.com/sharkdp/fd), you can use the `-X`/`--exec-batch` option to do the same: ```bash fd … -X bat ``` #### `ripgrep` With [`batgrep`](https://github.com/eth-p/bat-extras/blob/master/doc/batgrep.md), `bat` can be used as the printer for [`ripgrep`](https://github.com/BurntSushi/ripgrep) search results. ```bash batgrep needle src/ ``` #### `tail -f` `bat` can be combined with `tail -f` to continuously monitor a given file with syntax highlighting. ```bash tail -f /var/log/pacman.log | bat --paging=never -l log ``` Note that we have to switch off paging in order for this to work. We have also specified the syntax explicitly (`-l log`), as it can not be auto-detected in this case. #### `git` You can combine `bat` with `git show` to view an older version of a given file with proper syntax highlighting: ```bash git show v0.6.0:src/main.rs | bat -l rs ``` #### `git diff` You can combine `bat` with `git diff` to view lines around code changes with proper syntax highlighting: ```bash batdiff() { git diff --name-only --relative --diff-filter=d | xargs bat --diff } ``` If you prefer to use this as a separate tool, check out `batdiff` in [`bat-extras`](https://github.com/eth-p/bat-extras). If you are looking for more support for git and diff operations, check out [`delta`](https://github.com/dandavison/delta). #### `xclip` The line numbers and Git modification markers in the output of `bat` can make it hard to copy the contents of a file. To prevent this, you can call `bat` with the `-p`/`--plain` option or simply pipe the output into `xclip`: ```bash bat main.cpp | xclip ``` `bat` will detect that the output is being redirected and print the plain file contents. #### `man` `bat` can be used as a colorizing pager for `man`, by setting the `MANPAGER` environment variable: ```bash export MANPAGER="sh -c 'sed -u -e \"s/\\x1B\[[0-9;]*m//g; s/.\\x08//g\" | bat -p -lman'" man 2 select ``` (replace `bat` with `batcat` if you are on Debian or Ubuntu) If you prefer to have this bundled in a new command, you can also use [`batman`](https://github.com/eth-p/bat-extras/blob/master/doc/batman.md). > [!WARNING] > This will [not work](https://github.com/sharkdp/bat/issues/1145) out of the box with Mandoc's `man` implementation. > > Please either use `batman`, or convert the shell script to a [shebang executable](https://en.wikipedia.org/wiki/Shebang_(Unix)) and point `MANPAGER` to that. Note that the [Manpage syntax](assets/syntaxes/02_Extra/Manpage.sublime-syntax) is developed in this repository and still needs some work. #### `prettier` / `shfmt` / `rustfmt` The [`prettybat`](https://github.com/eth-p/bat-extras/blob/master/doc/prettybat.md) script is a wrapper that will format code and print it with `bat`. #### Highlighting `--help` messages You can use `bat` to colorize help text: `$ cp --help | bat -plhelp` You can also use a wrapper around this: ```bash # in your .bashrc/.zshrc/*rc alias bathelp='bat --plain --language=help' help() { "$@" --help 2>&1 | bathelp } ``` Then you can do `$ help cp` or `$ help git commit`. When you are using `zsh`, you can also use global aliases to override `-h` and `--help` entirely: ```bash alias -g -- -h='-h 2>&1 | bat --language=help --style=plain' alias -g -- --help='--help 2>&1 | bat --language=help --style=plain' ``` This way, you can keep on using `cp --help`, but get colorized help pages. Be aware that in some cases, `-h` may not be a shorthand of `--help` (for example with `ls`). Please report any issues with the help syntax in [this repository](https://github.com/victor-gp/cmd-help-sublime-syntax). ## Installation [![Packaging status](https://repology.org/badge/vertical-allrepos/bat-cat.svg?columns=3&exclude_unsupported=1)](https://repology.org/project/bat-cat/versions) ### On Ubuntu (using `apt`) *... and other Debian-based Linux distributions.* `bat` is available on [Ubuntu since 20.04 ("Focal")](https://packages.ubuntu.com/search?keywords=bat&exact=1) and [Debian since August 2021 (Debian 11 - "Bullseye")](https://packages.debian.org/bullseye/bat). If your Ubuntu/Debian installation is new enough you can simply run: ```bash sudo apt install bat ``` **Important**: If you install `bat` this way, please note that the executable may be installed as `batcat` instead of `bat` (due to [a name clash with another package](https://github.com/sharkdp/bat/issues/982)). You can set up a `bat -> batcat` symlink or alias to prevent any issues that may come up because of this and to be consistent with other distributions: ``` bash mkdir -p ~/.local/bin ln -s /usr/bin/batcat ~/.local/bin/bat ``` ### On Ubuntu (using most recent `.deb` packages) *... and other Debian-based Linux distributions.* If the package has not yet been promoted to your Ubuntu/Debian installation, or you want the most recent release of `bat`, download the latest `.deb` package from the [release page](https://github.com/sharkdp/bat/releases) and install it via: ```bash sudo dpkg -i bat_0.18.3_amd64.deb # adapt version number and architecture ``` ### On Alpine Linux You can install [the `bat` package](https://pkgs.alpinelinux.org/packages?name=bat) from the official sources, provided you have the appropriate repository enabled: ```bash apk add bat ``` ### On Arch Linux You can install [the `bat` package](https://www.archlinux.org/packages/extra/x86_64/bat/) from the official sources: ```bash pacman -S bat ``` ### On Fedora You can install [the `bat` package](https://koji.fedoraproject.org/koji/packageinfo?packageID=27506) from the official [Fedora Modular](https://docs.fedoraproject.org/en-US/modularity/using-modules/) repository. ```bash dnf install bat ``` ### On Funtoo Linux You can install [the `bat` package](https://github.com/funtoo/dev-kit/tree/1.4-release/sys-apps/bat) from dev-kit. ```bash emerge sys-apps/bat ``` ### On Gentoo Linux You can install [the `bat` package](https://packages.gentoo.org/packages/sys-apps/bat) from the official sources: ```bash emerge sys-apps/bat ``` ### On Void Linux You can install `bat` via xbps-install: ```bash xbps-install -S bat ``` ### On Termux You can install `bat` via pkg: ```bash pkg install bat ``` ### On FreeBSD You can install a precompiled [`bat` package](https://www.freshports.org/textproc/bat) with pkg: ```bash pkg install bat ``` or build it on your own from the FreeBSD ports: ```bash cd /usr/ports/textproc/bat make install ``` ### On OpenBSD You can install `bat` package using [`pkg_add(1)`](https://man.openbsd.org/pkg_add.1): ```bash pkg_add bat ``` ### Via nix You can install `bat` using the [nix package manager](https://nixos.org/nix): ```bash nix-env -i bat ``` ### Via flox You can install `bat` using [Flox](https://flox.dev) ```bash flox install bat ``` ### On openSUSE You can install `bat` with zypper: ```bash zypper install bat ``` ### Via snap package There is currently no recommended snap package available. Existing packages may be available, but are not officially supported and may contain [issues](https://github.com/sharkdp/bat/issues/1519). ### On macOS (or Linux) via Homebrew You can install `bat` with [Homebrew](https://formulae.brew.sh/formula/bat): ```bash brew install bat ``` ### On macOS via MacPorts Or install `bat` with [MacPorts](https://ports.macports.org/port/bat/summary): ```bash port install bat ``` ### On Windows There are a few options to install `bat` on Windows. Once you have installed `bat`, take a look at the ["Using `bat` on Windows"](#using-bat-on-windows) section. #### Prerequisites You will need to install the [Visual C++ Redistributable](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) package. #### With WinGet You can install `bat` via [WinGet](https://learn.microsoft.com/en-us/windows/package-manager/winget): ```bash winget install sharkdp.bat ``` #### With Chocolatey You can install `bat` via [Chocolatey](https://chocolatey.org/packages/Bat): ```bash choco install bat ``` #### With Scoop You can install `bat` via [scoop](https://scoop.sh/): ```bash scoop install bat ``` #### From prebuilt binaries: You can download prebuilt binaries from the [Release page](https://github.com/sharkdp/bat/releases), You will need to install the [Visual C++ Redistributable](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) package. ### From binaries Check out the [Release page](https://github.com/sharkdp/bat/releases) for prebuilt versions of `bat` for many different architectures. Statically-linked binaries are also available: look for archives with `musl` in the file name. ### From source If you want to build `bat` from source, you need Rust 1.74.0 or higher. You can then use `cargo` to build everything: ```bash cargo install --locked bat ``` Note that additional files like the man page or shell completion files can not be installed in this way. They will be generated by `cargo` and should be available in the cargo target folder (under `build`). Shell completions are also available by running: ```bash bat --completion # see --help for supported shells ``` ## Customization ### Highlighting theme Use `bat --list-themes` to get a list of all available themes for syntax highlighting. To select the `TwoDark` theme, call `bat` with the `--theme=TwoDark` option or set the `BAT_THEME` environment variable to `TwoDark`. Use `export BAT_THEME="TwoDark"` in your shell's startup file to make the change permanent. Alternatively, use `bat`s [configuration file](https://github.com/sharkdp/bat#configuration-file). If you want to preview the different themes on a custom file, you can use the following command (you need [`fzf`](https://github.com/junegunn/fzf) for this): ```bash bat --list-themes | fzf --preview="bat --theme={} --color=always /path/to/file" ``` `bat` automatically picks a fitting theme depending on your terminal's background color. You can use the `--theme-light` / `--theme-light` options or the `BAT_THEME_DARK` / `BAT_THEME_LIGHT` environment variables to customize the themes used. This is especially useful if you frequently switch between dark and light mode. You can also use a custom theme by following the ['Adding new themes' section below](https://github.com/sharkdp/bat#adding-new-themes). ### 8-bit themes `bat` has three themes that always use [8-bit colors](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors), even when truecolor support is available: - `ansi` looks decent on any terminal. It uses 3-bit colors: black, red, green, yellow, blue, magenta, cyan, and white. - `base16` is designed for [base16](https://github.com/chriskempson/base16) terminal themes. It uses 4-bit colors (3-bit colors plus bright variants) in accordance with the [base16 styling guidelines](https://github.com/chriskempson/base16/blob/master/styling.md). - `base16-256` is designed for [base16-shell](https://github.com/chriskempson/base16-shell). It replaces certain bright colors with 8-bit colors from 16 to 21. **Do not** use this simply because you have a 256-color terminal but are not using base16-shell. Although these themes are more restricted, they have three advantages over truecolor themes. They: - Enjoy maximum compatibility. Some terminal utilities do not support more than 3-bit colors. - Adapt to terminal theme changes. Even for already printed output. - Visually harmonize better with other terminal software. ### Output style You can use the `--style` option to control the appearance of `bat`s output. You can use `--style=numbers,changes`, for example, to show only Git changes and line numbers but no grid and no file header. Set the `BAT_STYLE` environment variable to make these changes permanent or use `bat`s [configuration file](https://github.com/sharkdp/bat#configuration-file). >[!tip] > If you specify a default style in `bat`'s config file, you can change which components > are displayed during a single run of `bat` using the `--style` command-line argument. > By prefixing a component with `+` or `-`, it can be added or removed from the current style. > > For example, if your config contains `--style=full,-snip`, you can run bat with > `--style=-grid,+snip` to remove the grid and add back the `snip` component. > Or, if you want to override the styles completely, you use `--style=numbers` to > only show the line numbers. ### Adding new syntaxes / language definitions Should you find that a particular syntax is not available within `bat`, you can follow these instructions to easily add new syntaxes to your current `bat` installation. `bat` uses the excellent [`syntect`](https://github.com/trishume/syntect/) library for syntax highlighting. `syntect` can read any [Sublime Text `.sublime-syntax` file](https://www.sublimetext.com/docs/3/syntax.html) and theme. A good resource for finding Sublime Syntax packages is [Package Control](https://packagecontrol.io/). Once you found a syntax: 1. Create a folder with syntax definition files: ```bash mkdir -p "$(bat --config-dir)/syntaxes" cd "$(bat --config-dir)/syntaxes" # Put new '.sublime-syntax' language definition files # in this folder (or its subdirectories), for example: git clone https://github.com/tellnobody1/sublime-purescript-syntax ``` 2. Now use the following command to parse these files into a binary cache: ```bash bat cache --build ``` 3. Finally, use `bat --list-languages` to check if the new languages are available. If you ever want to go back to the default settings, call: ```bash bat cache --clear ``` 4. If you think that a specific syntax should be included in `bat` by default, please consider opening a "syntax request" ticket after reading the policies and instructions [here](doc/assets.md): [Open Syntax Request](https://github.com/sharkdp/bat/issues/new?labels=syntax-request&template=syntax_request.md). ### Adding new themes This works very similar to how we add new syntax definitions. First, create a folder with the new syntax highlighting themes: ```bash mkdir -p "$(bat --config-dir)/themes" cd "$(bat --config-dir)/themes" # Download a theme in '.tmTheme' format, for example: git clone https://github.com/greggb/sublime-snazzy # Update the binary cache bat cache --build ``` Finally, use `bat --list-themes` to check if the new themes are available. ### Adding or changing file type associations You can add new (or change existing) file name patterns using the `--map-syntax` command line option. The option takes an argument of the form `pattern:syntax` where `pattern` is a glob pattern that is matched against the file name and the absolute file path. The `syntax` part is the full name of a supported language (use `bat --list-languages` for an overview). **Note:** You probably want to use this option as [an entry in `bat`'s configuration file](#configuration-file) for persistence instead of passing it on the command line as a one-off. Generally you'd just use `-l` if you want to manually specify a language for a file. Example: To use "INI" syntax highlighting for all files with a `.conf` file extension, use ```bash --map-syntax='*.conf:INI' ``` Example: To open all files called `.ignore` (exact match) with the "Git Ignore" syntax, use: ```bash --map-syntax='.ignore:Git Ignore' ``` Example: To open all `.conf` files in subfolders of `/etc/apache2` with the "Apache Conf" syntax, use (this mapping is already built in): ```bash --map-syntax='/etc/apache2/**/*.conf:Apache Conf' ``` ### Using a different pager `bat` uses the pager that is specified in the `PAGER` environment variable. If this variable is not set, `less` is used by default. If you want to use a different pager, you can either modify the `PAGER` variable or set the `BAT_PAGER` environment variable to override what is specified in `PAGER`. >[!NOTE] > If `PAGER` is `more` or `most`, `bat` will silently use `less` instead to ensure support for colors. If you want to pass command-line arguments to the pager, you can also set them via the `PAGER`/`BAT_PAGER` variables: ```bash export BAT_PAGER="less -RF" ``` Instead of using environment variables, you can also use `bat`s [configuration file](https://github.com/sharkdp/bat#configuration-file) to configure the pager (`--pager` option). ### Using `less` as a pager When using `less` as a pager, `bat` will automatically pass extra options along to `less` to improve the experience. Specifically, `-R`/`--RAW-CONTROL-CHARS`, `-F`/`--quit-if-one-screen`, and under certain conditions, `-X`/`--no-init` and/or `-S`/`--chop-long-lines`. >[!IMPORTANT] > These options will not be added if: > - The pager is not named `less`. > - The `--pager` argument contains any command-line arguments (e.g. `--pager="less -R"`). > - The `BAT_PAGER` environment variable contains any command-line arguments (e.g. `export BAT_PAGER="less -R"`) > > The `--quit-if-one-screen` option will not be added when: > - The `--paging=always` argument is used. > - The `BAT_PAGING` environment is set to `always`. The `-R` option is needed to interpret ANSI colors correctly. The `-F` option instructs `less` to exit immediately if the output size is smaller than the vertical size of the terminal. This is convenient for small files because you do not have to press `q` to quit the pager. The `-X` option is needed to fix a bug with the `--quit-if-one-screen` feature in versions of `less` older than version 530. Unfortunately, it also breaks mouse-wheel support in `less`. If you want to enable mouse-wheel scrolling on older versions of `less` and do not mind losing the quit-if-one-screen feature, you can set the pager (via `--pager` or `BAT_PAGER`) to `less -R`. For `less` 530 or newer, it should work out of the box. The `-S` option is added when `bat`'s `-S`/`--chop-long-lines` option is used. This tells `less` to truncate any lines larger than the terminal width. ### Indentation `bat` expands tabs to 4 spaces by itself, not relying on the pager. To change this, simply add the `--tabs` argument with the number of spaces you want to be displayed. **Note**: Defining tab stops for the pager (via the `--pager` argument by `bat`, or via the `LESS` environment variable for `less`) won't be taken into account because the pager will already get expanded spaces instead of tabs. This behaviour is added to avoid indentation issues caused by the sidebar. Calling `bat` with `--tabs=0` will override it and let tabs be consumed by the pager. ### Dark mode If you make use of the dark mode feature in macOS, you might want to configure `bat` to use a different theme based on the OS theme. The following snippet uses the `default` theme when in the _dark mode_ and the `GitHub` theme when in the _light mode_. ```bash alias cat="bat --theme=\$(defaults read -globalDomain AppleInterfaceStyle &> /dev/null && echo default || echo GitHub)" ``` ## Configuration file `bat` can also be customized with a configuration file. The location of the file is dependent on your operating system. To get the default path for your system, call ```bash bat --config-file ``` Alternatively, you can use `BAT_CONFIG_PATH` or `BAT_CONFIG_DIR` environment variables to point `bat` to a non-default location of the configuration file or the configuration directory respectively: ```bash export BAT_CONFIG_PATH="/path/to/bat/bat.conf" export BAT_CONFIG_DIR="/path/to/bat" ``` A default configuration file can be created with the `--generate-config-file` option. ```bash bat --generate-config-file ``` There is also now a systemwide configuration file, which is located under `/etc/bat/config` on Linux and Mac OS and `C:\ProgramData\bat\config` on windows. If the system wide configuration file is present, the content of the user configuration will simply be appended to it. ### Format The configuration file is a simple list of command line arguments. Use `bat --help` to see a full list of possible options and values. In addition, you can add comments by prepending a line with the `#` character. Example configuration file: ```bash # Set the theme to "TwoDark" --theme="TwoDark" # Show line numbers, Git modifications and file header (but no grid) --style="numbers,changes,header" # Use italic text on the terminal (not supported on all terminals) --italic-text=always # Use C++ syntax for Arduino .ino files --map-syntax "*.ino:C++" ``` ## Using `bat` on Windows `bat` mostly works out-of-the-box on Windows, but a few features may need extra configuration. ### Prerequisites You will need to install the [Visual C++ Redistributable](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) package. ### Paging Windows only includes a very limited pager in the form of `more`. You can download a Windows binary for `less` [from its homepage](http://www.greenwoodsoftware.com/less/download.html) or [through Chocolatey](https://chocolatey.org/packages/Less). To use it, place the binary in a directory in your `PATH` or [define an environment variable](#using-a-different-pager). The [Chocolatey package](#on-windows) installs `less` automatically. ### Colors Windows 10 natively supports colors in both `conhost.exe` (Command Prompt) and PowerShell since [v1511](https://en.wikipedia.org/wiki/Windows_10_version_history#Version_1511_(November_Update)), as well as in newer versions of bash. On earlier versions of Windows, you can use [Cmder](http://cmder.app/), which includes [ConEmu](https://conemu.github.io/). **Note:** Old versions of `less` do not correctly interpret colors on Windows. To fix this, you can add the optional Unix tools to your PATH when installing Git. If you don’t have any other pagers installed, you can disable paging entirely by passing `--paging=never` or by setting `BAT_PAGER` to an empty string. ### Cygwin `bat` on Windows does not natively support Cygwin's unix-style paths (`/cygdrive/*`). When passed an absolute cygwin path as an argument, `bat` will encounter the following error: `The system cannot find the path specified. (os error 3)` This can be solved by creating a wrapper or adding the following function to your `.bash_profile` file: ```bash bat() { local index local args=("$@") for index in $(seq 0 ${#args[@]}) ; do case "${args[index]}" in -*) continue;; *) [ -e "${args[index]}" ] && args[index]="$(cygpath --windows "${args[index]}")";; esac done command bat "${args[@]}" } ``` ## Troubleshooting ### Garbled output If an input file contains color codes or other ANSI escape sequences or control characters, `bat` will have problems performing syntax highlighting and text wrapping, and thus the output can become garbled. If your version of `bat` supports the `--strip-ansi=auto` option, it can be used to remove such sequences before syntax highlighting. Alternatively, you may disable both syntax highlighting and wrapping by passing the `--color=never --wrap=never` options to `bat`. > [!NOTE] > The `auto` option of `--strip-ansi` avoids removing escape sequences when the syntax is plain text. ### Terminals & colors `bat` handles terminals *with* and *without* truecolor support. However, the colors in most syntax highlighting themes are not optimized for 8-bit colors. It is therefore strongly recommended that you use a terminal with 24-bit truecolor support (`terminator`, `konsole`, `iTerm2`, ...), or use one of the basic [8-bit themes](#8-bit-themes) designed for a restricted set of colors. See [this article](https://gist.github.com/XVilka/8346728) for more details and a full list of terminals with truecolor support. Make sure that your truecolor terminal sets the `COLORTERM` variable to either `truecolor` or `24bit`. Otherwise, `bat` will not be able to determine whether or not 24-bit escape sequences are supported (and fall back to 8-bit colors). ### Line numbers and grid are hardly visible Please try a different theme (see `bat --list-themes` for a list). The `OneHalfDark` and `OneHalfLight` themes provide grid and line colors that are brighter. ### File encodings `bat` natively supports UTF-8 as well as UTF-16. For every other file encoding, you may need to convert to UTF-8 first because the encodings can typically not be auto-detected. You can `iconv` to do so. Example: if you have a PHP file in Latin-1 (ISO-8859-1) encoding, you can call: ``` bash iconv -f ISO-8859-1 -t UTF-8 my-file.php | bat ``` Note: you might have to use the `-l`/`--language` option if the syntax can not be auto-detected by `bat`. ## Development ```bash # Recursive clone to retrieve all submodules git clone --recursive https://github.com/sharkdp/bat # Build (debug version) cd bat cargo build --bins # Run unit tests and integration tests cargo test # Install (release version) cargo install --path . --locked # Build a bat binary with modified syntaxes and themes bash assets/create.sh cargo install --path . --locked --force ``` If you want to build an application that uses `bat`s pretty-printing features as a library, check out the [the API documentation](https://docs.rs/bat/). Note that you have to use either `regex-onig` or `regex-fancy` as a feature when you depend on `bat` as a library. ## Contributing Take a look at the [`CONTRIBUTING.md`](CONTRIBUTING.md) guide. ## Maintainers - [sharkdp](https://github.com/sharkdp) - [eth-p](https://github.com/eth-p) - [keith-hall](https://github.com/keith-hall) - [Enselic](https://github.com/Enselic) ## Security vulnerabilities Please contact [David Peter](https://david-peter.de/) via email if you want to report a vulnerability in `bat`. ## Project goals and alternatives `bat` tries to achieve the following goals: - Provide beautiful, advanced syntax highlighting - Integrate with Git to show file modifications - Be a drop-in replacement for (POSIX) `cat` - Offer a user-friendly command-line interface There are a lot of alternatives, if you are looking for similar programs. See [this document](doc/alternatives.md) for a comparison. ## License Copyright (c) 2018-2023 [bat-developers](https://github.com/sharkdp/bat). `bat` is made available under the terms of either the MIT License or the Apache License 2.0, at your option. See the [LICENSE-APACHE](LICENSE-APACHE) and [LICENSE-MIT](LICENSE-MIT) files for license details. bat-0.25.0/assets/.gitattributes000064400000000000000000000000241046102023000146470ustar 00000000000000* linguist-vendored bat-0.25.0/assets/.ignore000064400000000000000000000000241046102023000132400ustar 00000000000000syntaxes/* themes/* bat-0.25.0/assets/acknowledgements.bin000064400000000000000000000232711046102023000160110ustar 00000000000000xΪν}λrΫH’ξ‰σ~‡:Ϊ8q€9m«έέΣ—νhŠ„mΪ©&(«= Y$Ρ.’θŽώ³±/²°O±±ο΅™YU@€d]8ν™q:f·)¨KVζWy©¬ŒχώχΒ­dΉJΓΩ<ϋγqτμωž=£ ?œΘK%K™fbžηΛμΫ§Oga>/Fq²xšΝƒτb²| 4ώ#ΒL,‚‰ΑeFΑ(’’ˆ'2ω\Š\¦‹L$S!‘ ύέIg(ΊαXΖ™‰ϊͺΉ Ζsι˜oΟ\-―’"Ι2“ϊς₯€‡»–Χσ½Γζi³υΪA<)ΏΒ¦§a$31…–#έάDζ0² špώιŸDΆŠσΰZfOŸ=σi0ΎfπyPdωSέJ#ΏΞηFft„±ΛΡJΜ ΞεΔΣΣ9fyγX $ΌŒ Γ8Œg"c ΅Oζsh&K¦ωUJteΙ8  =1IΖΕBΒΈpͺzϋ8Χ=_Ώ±w@Ld9aLt0?‰+ mRδ"•Yž†clΓa<ŽŠ ŽΑό…‹Pχ€―d4Zd0§+Ι$œβ%MkYŒ’0›»bbΣ£"‡/3ό’(λβ<ž₯3E΄JZl{tτ }‰Ν5‰2όζjž,κ3 3gZ€1t)ιI$£‘γΏΑΗ§I%W8΅qOBœQφ­γ α§`”\Jš‹βο8Ιa¨jΈΛjUυOΐΠQ$FR ϊ cΏ2ΣI±ϋ,‡…ƒH,“”ϊ[Ÿ&0Χ˜ΡοΏž7žθψβtΠΧi{m±Χταο=Wœw†―ϋgCO š½α{Ρ)š½χβm§Χv…χσιΐσ}Ρ8“ΣnΗƒο:½Vχ¬έι½Ηπ^―’Σ&‡F‡}κ¦:žxƒΦkψ³yάιv†ο]ηegΨΓ6_φ’)N›ƒa§uΦmΔιΩΰ΄ο{Π}šνuz/Π‹wβυ† θΎή;ψCψ―›έ.vε4Ο`τŸhυOί:―^Ελ~·νΑ—ΗŒ¬yάυTW0©V·Ω9qE»y|εΡ[}heΰΰcjtβό΅‡_aMψ_kΨιχp­~o8€?]˜ε`XΎzήρ=W4 ςrΠ?q$'ΌΡ§Fཞ§ZAR‹ΪŠΐ#ψχ™ο• ŠΆΧμB[°<½Ϊςm@Εџ½λ< ž6Οί˜P gƒΩ>όqΰ8θzθϊό…x“ΜcΡ ώg|ωœρEΦt_> |‘)~_&A…/Άl’ΚΡ3α‡ ΰ³Ar%NNNN6ΰ„μͺ Q6UW΄’XhΨh6Δ«4X9Mΰ/%l(‘2½”h K™BnD9DζΛΐHΣ<; γ ]‘ν΅Θ\dδG-Π k8”ΐ£ό(CDY¦ΙeˆάœΟΑξ»Ijθ₯…ΜAzž7D}HΔβz,γΜΡ˜t0„6jp»¬Ή$hŽ€7πΈί/}”™…τΎΡψdddd6@l;)ύq.σ»bΝ7ΐ@™²AVVVV6`%E/ΥθˆςGρ.H‹Xτ‚Υ*H·!ΞI"#Ρ]S1κ0κ0κ0κά„:cψοŸ'2#­&Iο:κ+ќ αηΕH¦|ς’ρ†ρ†ρf ή¬€’mg0ZuHΡ¦“ †xΪPŽηq%³0I€BσΠ’‰u<]0εŠw "Θ‘GgτO{ί9«€€HϊŠ‚xxφΨ"scΉΜ‘}Η Ζε‚x,«»n’αΌΧ (eΨΩΐdρ{Q‹·α(I:{ͺΕ?3d8„‘:ΞY °…qΔΏa Ό –0Ž1Ζ‚+”₯`ΘI² }_₯!Fݝ gl™QΑLνθHη?nϊίuΦd¬γi†…€82†_—ΉzPΣ i6ͺƒώΊσ©ΞΘ–rŒ'H`Fρ¬fRΜsR‚ϋ ^(ΰκT›mNηF&ki~σi™£gΌ9ρζτ;oNΞζι™ϋnNΞϊζ$΄99ۏʾΌΦΌ‡54'`ƒa°IΔ&›Dl­#Κ«4™N`‰q€lŸ„Ά…Ψb[ˆm‘udy=<ιŠύαU8;Έεv—0Κx’Κ+ρδρBώάνς‡_νrο›]ΆŒΰ17»μςb—‡ήλςJWŒƒ…ΉΒ\]nAOΰ%ζ`P‘)Π“ρ~‘;Z‘ωE’K‘ζ›#Q'Π3°μ@žφ¦b€Ύ<―΅γ;₯3gΉŒ-μγϋf6ο›Q³ΌωΒΗΰΪγ/œ)α<ώΒ§ΌpF<φΒ§ΊpF<ώΒG_8#vrጣ/œ»pf;¦Ώ .•(φƒ‘Œnƒφ/²gΒ/@δ>¬Ω«;QG:Έœ8Έœ8ΈœΗ;Έœ8ΈœΏšθ|jΧ';₯θμΖΑεμΖΑεμΔΑεό•”Ζ7ΐ»xkS‰*βcκηγo{ή:9οŠ7A\ ͺtτμΩ‹_ϊΘwl'ε†oŽ‘γΡζ2π€KΫgD3—ž‚Vm™HElΰyC΄εΰΜ$¨ΎΛcύZ‚2ˆ­ϋκυ5`FOΓση3Fα#MΡE`5υ9 ›₯aΊΎ«FžCϋiRΜζβ›Q r+I7V‘BrƒκCΒ Γς•Ύt"ό@ύιvΆ½AΪ7tJΫβOύ@Ό€œPxΤτΖ Š'h7S+fΈ'€΅ͺšQκ)ύ„0D]“Ί™DΚ:ΠD4h—RS7`œ,κCψ§4z-΄£:lˆ—:+`Y€Λ$3Ψjκ‡φνιVφh*°;…κΥδJ¦θTH 1!VŸi»*ΛΓπ½ϊ‰(€ͺwΜ$.'ΕxΆΡ\τaυ©ί€ΪΆ)s"7A+ϋ!Œ„–'›‡KliNsڊΗΨτώ—Οώοu—€Rή4TδˆλδYΑ’ 23-B“#K}\­ukœΥ’ΏOŠ=±οβ§tοΐ^uψl‹ΫJ…ΝΊy £ ³υ, ­n hY6XΝ'‹nOTkœΆLεT¦˜ΛBΏN‰βΨ…miff+'!Ω1€/¨}ΈΤ[,έΌ1ώ©\#ΣpV€–VS ½O[ϊζΠQ’ο`9Šˆδƒμ£…]+†Qˆ3|20 EίDϊΟ)8μy¨9·>AέΖΪ41υ(DJ”Ύ‘¦9NH7Υ4½`¦— ½I±Ρ¦%ΨΏΘWK{ΪηIz± Wπ%X]~œV‰h#z₯(ιiέX7€ΜΘ 2bΐq Y)(qaMK2πfkB+yŽ{ΛΔψμp΄Ί‰}˜€Όˈt·„ΦjsΉ 8Όa…ν ’B-_ "θjHlo°ν4Π³Χ-)˜‚LeV‘(ΪΦ΅Β*μŠ– eαjŽηΐbβžΚː–ΉH£εDH p’šΏ*‚-MΊ±ς:J’~€šnDB―…3p‚D[Φ| NMkβ:Υω4υ›υΪQσzΧH%DύKω”Λ %NAΊΠ4@Χ—Ρ δ Ύ “†ψ=fΡιΎΝi0¦MΒ΅φΘ’¨ƒBκΘdZ­zΛxK€R[W|]*¦κ―$ 8³—–γΐΖjkB<<њˆi)Q΄‘·ΰχ›οZB‘#κ'Πud` ν ƒφŒήAάš P(PG„γj…YeΪξnέ-lEQ™ΊG~I ζύυ7*/wΫνΕ^9§=έ–ΪοKXΖBD`š»Έ £ ">2Ξ)T>ŠXS_ ΨD—‘NΉuw+Ρ?so݊Jμ²ϋ€UcxΖ_FwaζΦΌžFΚVY.™ α°η·1ν‘ϊ ΅όδW%m₯Τ΅l’»ŒΤΈΐ’6 ]“EF»<υΈ ΌΤjδ9!^΅5ΙkC„ϊ\ ?ΒT²e8.’"α]ι…ΊΥΆΤŽŒΚ%³pφWI«7p"‚Υ^θ[V{›"Ό¦_—Σ6ψQ•Η& ςΤ;sΜH?Κ( ΙaΠv?•fς/πO„έŽ ·ΪQα΅ΔOΡέΡtΞΚ%d4+ΌΞŽOm5f,1³QYΒ.),՜F€`φr€ήRζ@Γ~}Ρδ*D]#NβCZω fŒSš¬‚(_’η D»Λ„’“7vsS³ :,έλ.ͺƒKδγ €«ΰœΌ=c "0κ2 Vnυ ŒYm΅kΞ+šh A‰Ε€,oτΈe;'lQ τ…΅@§‚ξ?ΐκμλόvΰi09r£"‘KPDb©ζj­¨λΠΨ<Έ”€ε™‘χ ₯΄ €λΝΥάSjaJЊ²Φ fΜ̐jL―”σŽ[C ‹NTFμC£ΈJ¦Ÿ΅&T€Flκ–ΈƒτfY†$ΣΠΗX424{Ÿ-ψϋΩ˜ΑI,υŽπ‡a£ΌΪλΓtύ3!Ή!$#*yυΑι.p)Μ^.―)i e€TΘΣε’δαLίQ> πg9mΈοWV©[§I–Αpγ€@ύIύMχDΑUV„9N5’3΅ θΠήy₯_#ΠΥQρ6€£=A <Σ¦vՎͺZ™i™υX¦ Ν(U¬Ξ‰Fe2Ζ¨–chT2¦·<£U©έEWΟπJPzN'π₯aΎ’Ίϊ:ˆ‰‚‚λε!Β\QΧP¨ζ…Άρθ-–ΥFθ¬Xl†f΅"T3›Υ~’Ήkۊ΅R淝|0vՁš)ΖHg8^ž²7`YC˜"‚–­ϊ–Φ!ώۘθZB―Ψw΄š>GVŸΚqS©hGQT‚œ:)²˜ΰ‘‹υ˜Yέ#Δ•,m’ι>“:T‹νΤ{[=«˜΄[9Jž¬Ρϊ䬎Λνx…vζ«έΡΥάν",N$κM₯L‹ζ•ΈιΉ™νΖxΦ!΅Ή)τ4mΠΰ ’ -μ2*τγFAšW—ΡΰΧ'Z'ΪδA«\mψαRοAœόΣ{ |ΧΉΊ^ΔNχ*·Υ-]l‘” ΚzYMΣ3€5 &dcΪ·³l#kYΒjFƒ!ƒšMΑ½ ]­fΆSx+]‰Ω Hxΐ Ά½τϊ•JZA1‚NΏ5Γ Μ+Z[·ΌΨ\•έ:†οl0―1™-Χu”§Ξΰ–9«vΐΝφ“Τέ€r`t=ΛΛ₯mƒ-TšI )`ͺΕ‚ΣΙ!NrUMŒώ90˜Q±‘ΓΉ²ΒΏ6Ιl­7)Κ”.|+WΤPκΓΡ²₯b˜5ί|Ήm€?§hοΨi΅b†)tIpυ3X{NdO‘{c27X±0jkc °(ϋΟ,η:¦Θ°U˜Θ[…ΗOHH‹uώS„Ή)n±•D•UAj+9λ•°ζψ²–Ρσ°‡Œ.Ή΅Φš–»Eƒ―\{[BFͺ+V”L·ŒΖ­ΔfJΖβκSΔφΞ•’DνaΧ–7―ΐF΄ͺΆ —Z·ΊΖJσQΝ-SZ*k–@mAΎ$cΗΔͺΙV­΄ΐ¬!τ}UΈhςο© Ρό₯­IιίX­k‘–3ΛrcέθΊͺ4}μqέ‘SΌ\―Z}7ΣΜPΐaZ £ _§V ύ>ψ(π₯2zSC£ ΕvFζn#4΄¬ΐcr"U ΕΐZ’²Β6ρ 9HŠ₯I„—~γ›ΫΛΘ"ƒΝΨ‚xή’ )ψ;RWZ·=t,ΰ+€B£€d‹–=I9s₯rΫgΤa 5h|Ϋ„1πLš₯Ρ ΧK¦—θΣΧͺhΘΓΥ6{ έΚλ€ΝΤς&΄)Ν'€ΐ7mι΄€°ρ' OλCŽκςΚ‘^Šθ@Oν†ΦH“Y7½lΩ₯Ύ†ψsu¦ž:ύθ²*…ΰΦKیl½Ί­\0-ϋY5Τ}+: ΦMTϋit_Φχ`ϋ½nΪ yάνnΖ85e«J«Σέr.άUNuE*}Žeb˜ΓΞ°λΉxnψΠ>βnž?†j§It›gJΤn«’…F`όKθ4€¨Ef”UXgXΉ4Y¦x *¦ O»¨œς_…Έ–ΏΤ£§kΰ:ΜΩΛΣU$›κ:ΞJήX;ΠΊiΜ*ήϋcώ.OMΑKέ0w™―ƒ;―υ'ΞΥy_jΎŠΘΩ cKΫr΅˜H0Pn» b9‹BΠΎΖςΐ-£έnΝ•[z~>ΚοϋJQ@Ÿ~ŽH‘£ΑΝΠQΖ-L—9ž@ΘnΉΪΠ³Ά} SΖ,YRΗΪ#@K,ΐK^σαγΫζH@u8€ΆVN6x [J@Fωt1 §5>77Ί«S3Η]Όά«1jΌnθ5‹c υ ψ%ΤbZΈj{ φo‰›Qα΄£D1μ,IΐUΩΎCp„δΙrΜθŒέbYΰΐ§’(R΅ Όˆ+ε†6Α-'A0 €ΜkΣCu,3`δCTΠΧqΊ™L Έ‰‘‚©>Ύ ‰`7θζ•|ΣΝ1ξ HƒΌΨs³Ϊ¨-‘8Ÿ£κ^Χυ`α­α6£…ŽηI’Ό δι¬ΫΙη zΫTžΤΡιΚPšΔRΉA5ϊ­ˆοδ"Ζ£%•CL‘52c‡˜€½P™9Φ¨H"7Β|P^΄}f΅p―“+΄„”)YŒθi5\͏N΄Δ‘ )un!'ώ΄‚Q/i:U₯BτΚSd±φ £ΝN>£ΐ+y'ΪLKΪ@8ΜυhΖ“-σ ]εΊ€b%ΞEšVΡ2ν9L«UεDu7ύΖ£•V6ͺ ­MKeώΚβFKm,Η’Ψλ©Ε[ŽΑΡοΝΣSx€σσ·Έ„δ-D]mΉΪ£‘\•±$<^wΗ\}Œ’ξM0juR“‚žΛ2ρ’΄δΑωM2π5AΨθ0J)3χ~ύm―2RΠ3‘w»•a&BUmυY–tCμ·“ψ•η,5ŸAΦ:™©Ίψ&¨ψε8LβH΅m[±Y”uz² „’Q―8/F¨ΤΣΪOjPœžU|\†«2»τιz36‘U;γKn6‘A|qGŽkΔΰ=ά+κ‘O}ψ‡ Œ–ρxM9w-έ3•“#HΗsŒX+f¨‚‰ΏΰίoβW7ε«Τ’¬ΏΡ㏽JšxτmΚ–Υ§ •οy§2<Ύ‹k•m/εƒoV~Όϊ]] mνβ~eR rΕς›Vτiφ_a₯΅ηβ]xπϊΣe€άI^ΕkILo <ƒι£°κ σyϊ ~:ΜTΑΆ§΅χ8}ŸΣχ9}ŸΣχΧ κm’Ga\aηKpΎηKpΎηKpΎηKpΎηKpΎηKpΎηKpΎηKpΎηKpΎηKpΎηKpΎηKpΎηKpΎηKpΎηKpΎηKpΎηKpΎηKpΎηKpΎηKpΎΔ}σ%ώε_9_βo._βθΩσ#UΔφ]L`ΗHΕΫ$ΛWΕErΙΉœ+ρ˜\‰nχέIYπ4ΏΞ·Φ ;E[ό)Ι“K!Ύ‡ Xk†ΰΥG\ΊΈD—ˆΰ\"βΦ”‡ bΑωœοΐωœοΐωœοΐωœοΐωœοΐωœοΐωœοΐωœοΐωœοΐωœοΐωœοΐω‚σ8߁σ8߁ση;pΎη;pΎη;pΎη;pΎη;ΞwψDω7ρΖτιd}uΠ Wλt°Ψ‡?Άœ6>‚ E‰@X‚}}Do ί-ΰ«”n\y}όΎX‰f6Ώqΐχ«Φχ«;Ÿβ°1ί―ώIοWwξtΨψϐ‡‘9ΥΫXLθQ Cίn fœΏωGQ©ΊHΐ˜Ή€›ΝΣƒέBΝΗςœ{Ax4Τ8χΝkΘkpξ5βo₯”Γv¨q~¨ΉC^ƒs'¨;‚ηy b7y ˜žρψΌ†»AsK^ΐ ‹L•Ά€ƒΌδ œΈ±Θ(83Q§΅:™,Α~Π§©τƒ™Ž°£FkΒ?¦Ε*XJνΧH₯dq²'Kp²'Kp²'Kp²'Kp²'Kp²'Kp²'Kp²'Kp²'Kp²'Kp²'Kp²'Kp²'Kp²'Kp²'Kp²'Kp²'Kp²'Kp²'Kp²‡¨‡ψυ7.ρ·XβZo°YHρϊ'q Οvσ ׅຏ© ΡkκΊ, IΫΈώyΫΏ»g{½Η« ηy°ώηœΙΕ™\œΙΕ™\€ΖΏχO'ύRΌ£¬ њ§€Wg2fŒωœ1†¬]Ζ˜Ο chŠwΐ˜λ!Μΐ|NΏ΄5γμχMΏsr¨ψ=“CΕ?Rr¨ψ[IΏkr¨ψ]“CΕο•z’Wύ”2‘d/›¦^jρ-{ι4΄œαiυτ’©Υ§©8€ ‰ιcηψ _LΥρωlσp™ΈV™}JΌΘeQ;Ev“ΐ¨σι2ΑωΓځ9bnϋΌuΖͺŠšnH™k|œx†žΐΡκ,ž¬dR†ηΫF=Y0#0Ηχn„£Εχ„Υυτ4 p:kΐ³}¬€₯QR;qˆ`° Žί«mАφ3ͺDZ4ώ€΅ –ψ[Xαn —vΞΝΧΆ  δγΐ1πœvΗ')χΪ7aΖϊ,΅₯šc‰ŽΑvgΰ‘θ&–ŸZ@9_Χώ©Χκΰοg&ΣŒ¨6}ο§3x~t ζμ„$°&­³Α?;φ!΄y6τΔ«~ΏM:žο ށ¨ϋί‰nί'jQ t»9lRΗА ~†ΟΗgLH΄N<Ηƒ³SD’˜ω9eചπj›¨ΫοΡTBύνΫA±ΒAL―n ­Η„3ΗjŽ’η½κv^y½–WƒΜƒ2;ͺΫσζ{ƒ›ϊhq¬K+):°?΅ίupΨϊaX{Ώ£ω„HΦz­!ώFΜ<Εl_*ΒM¨yβΡgΨI5Υ9eΎΠsχ₯IΩώcϋνΏ ϋο4MςdTLοοfϊBΥη~_\‡Β» (’Κ(ÞlFφdo L±\Κ܌ψBΧaχ<ΦΓθΒ: £ λ0›θ’š»WΥιζ-Hς΅=?ϊβΕ³g " " " "λ ςΣIχ6πQœVβmς!J.w sv sv sv sv s[ sv sv sv sώϊ‘°A2J`ύ|%šρ$ WβuΊΚ³‹πR ƒΌΝ ρc¨a¨a¨a¨YƒΏεϋφAr+Έ©E6@揠»ΘXtƒ™Ό”|NΝ#6Ψ<Ϊ‚+]λΞuΜΤΠι7CΜ^:4ΉHsΰ½ωΟάΑ˜Ε!z~³-<‡tTΩeΖΟƒρ΄,8…‡Sxξ˜Βs›Β{7*Ϊ[ ψ†ζ=ήω8vΙ;Η.Χ %_E…₯N«ΏΕ)μYˆbˆoφfΈ‰1ΟΙSxβ]@' παχ#όό#ˆζ/οčβΗι˜ζt]”Uy;τφ…hƒΜ‘Χΰm1Zeσ €Žο'κ«/ΜW΄ψαQ€η<ξΰΎσΐƒϋΞcξ;Ÿπœ‡άwvxΞ§>Έο<ςΰΎσΠƒϋΞ#ξ;q!8<ηQχ‡ΊΎxtgH±Έ«#αˏΕwώ² ς9«RμD`UŠΘr)£\ήέ3ΩJXF!θBgXς–a…a…a…aeVΒιƒ—ž9°Λ•hFς: 'Σχ ψκΗΏrֈeώ#ϋ„qΨ'΄8T½ ’a”ΜΈ-Χ’εZ΄\‹–kΡr-ZEΛ΅hΉ-Χ’εZ΄\‹–kΡr-ZEΛ΅hΉ-Χ’εZ΄\‹–kΡr-ZEΛ΅hΉ-Χ’εZ΄\‹–kΡr-ZEΛ΅hΉ-Χ’εZ΄\‹–kΡr-ZEΛ΅hΉνί[-ΪV,2Ύ»‚οxLωΩaίΎςΦΤ¨£ηβ β¦8ύ#$ήγ<Όβ<ΌZΓ jξΓwΝΉόŠr‘D7Φβ»ΰUUU6Qe΅4χνsκ§>qκ§>qκ§>qκ§>qκ§>qκ§>qκ§>qκ§>qκ§>qκ§>qκ§>qκ§>qκ§>qκ§>qκ§>qκ§>qκ§>qκ§>qκ§>qκ§>qκΣίOκΣ―+ψχ›ψ•ƍΗΐλQΦί8!Š’UΜχ]Έθ>€¬‹D°λβ9ΘWΘΫΐγDNdΰDNdX˜Bή_Ύ8€<)ο2 ­•±…KD1Άp‰¨ulωS8»[ΌkˆΟl-zωFN§βer¦c c cΛg-ΫΑeΌ˜Ξe΄4ΣΘ―σέqzΛΡ ρξΏώsŒ¨WIόαΏώ#’ΔiΚώ\0Δ0Δ0Δ|ξ Ό€yώΕ_ϊcόγJΚ׈%β΅L—αxΞhΒhΒhΒhBhg+`ΓV$yβ<ΩΤQž‰fΊ@ž;‡QΈ\&9>ΆKDy²[Hy²SLy²;Py²Tyς`XΑ…Ϋ-°<Ή/²Πv†-Ov.Ov‰.Ov/Ov‹/Ov 0O*„yRƒ˜^’NInΠXn }u¨οb>&ΎTίOδ₯Œ’%ʏ|=ƒoωƒΨGίp¦ΣA¬_Xαa…‡Vxό$ θΞΪϋ•ωJΌM†ΊΑ ˆλ0¬0¬0¬hX^%νšuη<%ρ*˜|˜‡β-ΐΔό_rΉ[`Α{Žv,x8cgΐ‚7hοXͺ‹6G‹Ψ,ˁΕ\ΠγμXD,Ξ#€El‹σp`6°8±X&i0.’`Σ€Ί{"€1’Ϊͺ)ΌGaΑΙΦ¬½°φΒΪ‹™YZ\Ž’λ»Ζ©Ÿαmσsˆ^sH‰Α„Α„ΑDIΣ`χHz|ώ 0F,š * ρ}Άό˜~ Ÿ ωƒ ƒ ƒ ƒ ‹6ƒIœ\α‘ΌΞe|XέΥuyn­ΈbΐV08~OlΈ)AϊJια ’Žrf.ž…¨ „ΖKϊ-¨p·`…Kκל[AƒςqάxN»γ“{ν›B?Υ,ϋη=7uMn5ΕjΠ$۝‡‚ˆX~jα`x]Wψ§^«ƒΌŸ=˜Ks ’Ϊτ½ŸΞΰ!ψΡ Ž³Šΐ’΄ΞyHμΨv†gCOΌκχΫDgίΌ‘χΏsΊ}Ÿˆu†Τn›Τ14”ςΏΓΟΗgKH³Noθ g§ˆC°Όη@c^mΣbφ{@ ώ€φ€νX‘ k νΗΜ­9ŠžχͺΫyευZ^ 0Jΐμ¨nΟ›οMτ«ΔCόΨρKψsi!Ev§φ»[? Kοw4›ΙZ―5Ήj½ εUY­G—±ͺ³9«ιAuεΏ₯²lŽ)χ¦κx«2°κφp]ŠJ‰C„Œ.‚·Κ?S­)`€Ϊ°±¦‘Μ\§~³*r\Φ@1H6ͺΈόΐ~ŒΓbat-0.25.0/assets/completions/_bat.ps1.in000064400000000000000000000242521046102023000162600ustar 00000000000000 using namespace System.Management.Automation using namespace System.Management.Automation.Language Register-ArgumentCompleter -Native -CommandName '{{PROJECT_EXECUTABLE}}' -ScriptBlock { param($wordToComplete, $commandAst, $cursorPosition) $commandElements = $commandAst.CommandElements $command = @( '{{PROJECT_EXECUTABLE}}' for ($i = 1; $i -lt $commandElements.Count; $i++) { $element = $commandElements[$i] if ($element -isnot [StringConstantExpressionAst] -or $element.StringConstantType -ne [StringConstantType]::BareWord -or $element.Value.StartsWith('-')) { break } $element.Value }) -join ';' $completions = @(switch ($command) { '{{PROJECT_EXECUTABLE}}' { [CompletionResult]::new('-l', 'l', [CompletionResultType]::ParameterName, 'Set the language for syntax highlighting.') [CompletionResult]::new('--language', 'language', [CompletionResultType]::ParameterName, 'Set the language for syntax highlighting.') [CompletionResult]::new('-H', 'H', [CompletionResultType]::ParameterName, 'Highlight lines N through M.') [CompletionResult]::new('--highlight-line', 'highlight-line', [CompletionResultType]::ParameterName, 'Highlight lines N through M.') [CompletionResult]::new('--file-name', 'file-name', [CompletionResultType]::ParameterName, 'Specify the name to display for a file.') [CompletionResult]::new('--diff-context', 'diff-context', [CompletionResultType]::ParameterName, 'diff-context') [CompletionResult]::new('--tabs', 'tabs', [CompletionResultType]::ParameterName, 'Set the tab width to T spaces.') [CompletionResult]::new('--wrap', 'wrap', [CompletionResultType]::ParameterName, 'Specify the text-wrapping mode (*auto*, never, character).') [CompletionResult]::new('--terminal-width', 'terminal-width', [CompletionResultType]::ParameterName, 'Explicitly set the width of the terminal instead of determining it automatically. If prefixed with ''+'' or ''-'', the value will be treated as an offset to the actual terminal width. See also: ''--wrap''.') [CompletionResult]::new('--color', 'color', [CompletionResultType]::ParameterName, 'When to use colors (*auto*, never, always).') [CompletionResult]::new('--italic-text', 'italic-text', [CompletionResultType]::ParameterName, 'Use italics in output (always, *never*)') [CompletionResult]::new('--decorations', 'decorations', [CompletionResultType]::ParameterName, 'When to show the decorations (*auto*, never, always).') [CompletionResult]::new('--paging', 'paging', [CompletionResultType]::ParameterName, 'Specify when to use the pager, or use `-P` to disable (*auto*, never, always).') [CompletionResult]::new('--pager', 'pager', [CompletionResultType]::ParameterName, 'Determine which pager to use.') [CompletionResult]::new('-m', 'm', [CompletionResultType]::ParameterName, 'Use the specified syntax for files matching the glob pattern (''*.cpp:C++'').') [CompletionResult]::new('--map-syntax', 'map-syntax', [CompletionResultType]::ParameterName, 'Use the specified syntax for files matching the glob pattern (''*.cpp:C++'').') [CompletionResult]::new('--theme', 'theme', [CompletionResultType]::ParameterName, 'Set the color theme for syntax highlighting.') [CompletionResult]::new('--theme-dark', 'theme', [CompletionResultType]::ParameterName, 'Set the color theme for syntax highlighting for dark backgrounds.') [CompletionResult]::new('--theme-light', 'theme', [CompletionResultType]::ParameterName, 'Set the color theme for syntax highlighting for light backgrounds.') [CompletionResult]::new('--style', 'style', [CompletionResultType]::ParameterName, 'Comma-separated list of style elements to display (*default*, auto, full, plain, changes, header, header-filename, header-filesize, grid, rule, numbers, snip).') [CompletionResult]::new('-r', 'r', [CompletionResultType]::ParameterName, 'Only print the lines from N to M.') [CompletionResult]::new('--line-range', 'line-range', [CompletionResultType]::ParameterName, 'Only print the lines from N to M.') [CompletionResult]::new('-A', 'A', [CompletionResultType]::ParameterName, 'Show non-printable characters (space, tab, newline, ..).') [CompletionResult]::new('--show-all', 'show-all', [CompletionResultType]::ParameterName, 'Show non-printable characters (space, tab, newline, ..).') [CompletionResult]::new('-p', 'p', [CompletionResultType]::ParameterName, 'Show plain style (alias for ''--style=plain'').') [CompletionResult]::new('--plain', 'plain', [CompletionResultType]::ParameterName, 'Show plain style (alias for ''--style=plain'').') [CompletionResult]::new('-d', 'd', [CompletionResultType]::ParameterName, 'Only show lines that have been added/removed/modified.') [CompletionResult]::new('--diff', 'diff', [CompletionResultType]::ParameterName, 'Only show lines that have been added/removed/modified.') [CompletionResult]::new('-n', 'n', [CompletionResultType]::ParameterName, 'Show line numbers (alias for ''--style=numbers'').') [CompletionResult]::new('--number', 'number', [CompletionResultType]::ParameterName, 'Show line numbers (alias for ''--style=numbers'').') [CompletionResult]::new('-f', 'f', [CompletionResultType]::ParameterName, 'f') [CompletionResult]::new('--force-colorization', 'force-colorization', [CompletionResultType]::ParameterName, 'force-colorization') [CompletionResult]::new('-P', 'P', [CompletionResultType]::ParameterName, 'Alias for ''--paging=never''') [CompletionResult]::new('--no-paging', 'no-paging', [CompletionResultType]::ParameterName, 'Alias for ''--paging=never''') [CompletionResult]::new('--list-themes', 'list-themes', [CompletionResultType]::ParameterName, 'Display all supported highlighting themes.') [CompletionResult]::new('-L', 'L', [CompletionResultType]::ParameterName, 'Display all supported languages.') [CompletionResult]::new('--list-languages', 'list-languages', [CompletionResultType]::ParameterName, 'Display all supported languages.') [CompletionResult]::new('-u', 'u', [CompletionResultType]::ParameterName, 'u') [CompletionResult]::new('--unbuffered', 'unbuffered', [CompletionResultType]::ParameterName, 'unbuffered') [CompletionResult]::new('--no-config', 'no-config', [CompletionResultType]::ParameterName, 'Do not use the configuration file') [CompletionResult]::new('--no-custom-assets', 'no-custom-assets', [CompletionResultType]::ParameterName, 'Do not load custom assets') [CompletionResult]::new('--lessopen', 'lessopen', [CompletionResultType]::ParameterName, 'Enable the $LESSOPEN preprocessor') [CompletionResult]::new('--no-lessopen', 'no-lessopen', [CompletionResultType]::ParameterName, 'Disable the $LESSOPEN preprocessor if enabled (overrides --lessopen)') [CompletionResult]::new('--config-file', 'config-file', [CompletionResultType]::ParameterName, 'Show path to the configuration file.') [CompletionResult]::new('--generate-config-file', 'generate-config-file', [CompletionResultType]::ParameterName, 'Generates a default configuration file.') [CompletionResult]::new('--config-dir', 'config-dir', [CompletionResultType]::ParameterName, 'Show bat''s configuration directory.') [CompletionResult]::new('--cache-dir', 'cache-dir', [CompletionResultType]::ParameterName, 'Show bat''s cache directory.') [CompletionResult]::new('--diagnostic', 'diagnostic', [CompletionResultType]::ParameterName, 'Show diagnostic information for bug reports.') [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print this help message.') [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print this help message.') [CompletionResult]::new('-V', 'V', [CompletionResultType]::ParameterName, 'Show version information.') [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Show version information.') ## Completion of the 'cache' command itself is removed for better UX ## See https://github.com/sharkdp/bat/issues/2085#issuecomment-1271646802 break } '{{PROJECT_EXECUTABLE}};cache' { [CompletionResult]::new('--source', 'source', [CompletionResultType]::ParameterName, 'Use a different directory to load syntaxes and themes from.') [CompletionResult]::new('--target', 'target', [CompletionResultType]::ParameterName, 'Use a different directory to store the cached syntax and theme set.') [CompletionResult]::new('-b', 'b', [CompletionResultType]::ParameterName, 'Initialize (or update) the syntax/theme cache.') [CompletionResult]::new('--build', 'build', [CompletionResultType]::ParameterName, 'Initialize (or update) the syntax/theme cache.') [CompletionResult]::new('-c', 'c', [CompletionResultType]::ParameterName, 'Remove the cached syntax definitions and themes.') [CompletionResult]::new('--clear', 'clear', [CompletionResultType]::ParameterName, 'Remove the cached syntax definitions and themes.') [CompletionResult]::new('--blank', 'blank', [CompletionResultType]::ParameterName, 'Create completely new syntax and theme sets (instead of appending to the default sets).') [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Prints help information') [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Prints help information') [CompletionResult]::new('-V', 'V', [CompletionResultType]::ParameterName, 'Prints version information') [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Prints version information') break } }) $completions.Where{ $_.CompletionText -like "$wordToComplete*" } | Sort-Object -Property ListItemText } bat-0.25.0/assets/completions/bat.bash.in000064400000000000000000000104161046102023000163300ustar 00000000000000# shellcheck disable=SC2207 # Requires https://github.com/scop/bash-completion # Macs have bash3 for which the bash-completion package doesn't include # _init_completion. This is a minimal version of that function. __bat_init_completion() { COMPREPLY=() _get_comp_words_by_ref "$@" cur prev words cword } __bat_escape_completions() { # Do not escape if completing a quoted value. [[ $cur == [\"\']* ]] && return 0 # printf -v to an array index is available in bash >= 4.1. # Use it if available, as -o filenames is semantically incorrect if # we are not actually completing filenames, and it has side effects # (e.g. adds trailing slash to candidates matching present dirs). if (( BASH_VERSINFO[0] > 4 || \ BASH_VERSINFO[0] == 4 && BASH_VERSINFO[1] > 0 )); then local i for i in ${!COMPREPLY[*]}; do printf -v "COMPREPLY[i]" %q "${COMPREPLY[i]}" done else compopt -o filenames fi } _bat() { local cur prev words split=false if declare -F _init_completion >/dev/null 2>&1; then _init_completion -s || return 0 else __bat_init_completion -n "=" || return 0 _split_longopt && split=true fi if [[ ${words[1]-} == cache ]]; then case $prev in --source | --target) _filedir -d return 0 ;; esac COMPREPLY=($(compgen -W " --build --clear --source --target --blank --help " -- "$cur")) return 0 fi case $prev in -l | --language) local IFS=$'\n' COMPREPLY=($(compgen -W "$( "$1" --list-languages | while IFS=: read -r lang _; do printf "%s\n" "$lang" done )" -- "$cur")) __bat_escape_completions return 0 ;; -H | --highlight-line | \ --diff-context | \ --tabs | \ --terminal-width | \ -m | --map-syntax | \ --ignored-suffix | \ --list-themes | \ --squeeze-limit | \ --line-range | \ -L | --list-languages | \ --lessopen | \ --diagnostic | \ --acknowledgements | \ -h | --help | \ -V | --version | \ --cache-dir | \ --config-dir | \ --config-file | \ --generate-config-file) # argument required but no completion available, or option # causes an exit return 0 ;; --file-name) _filedir return 0 ;; --wrap) COMPREPLY=($(compgen -W "auto never character" -- "$cur")) return 0 ;; --color | --decorations | --paging) COMPREPLY=($(compgen -W "auto never always" -- "$cur")) return 0 ;; --italic-text) COMPREPLY=($(compgen -W "always never" -- "$cur")) return 0 ;; --pager) COMPREPLY=($(compgen -c -- "$cur")) return 0 ;; --theme) local IFS=$'\n' COMPREPLY=($(compgen -W "auto${IFS}auto:always${IFS}auto:system${IFS}dark${IFS}light${IFS}$("$1" --list-themes)" -- "$cur")) __bat_escape_completions return 0 ;; --theme-dark | \ --theme-light) local IFS=$'\n' COMPREPLY=($(compgen -W "$("$1" --list-themes)" -- "$cur")) __bat_escape_completions return 0 ;; --style) # shellcheck disable=SC2034 local -a styles=( default full auto plain changes header header-filename header-filesize grid rule numbers snip ) # shellcheck disable=SC2016 if declare -F _comp_delimited >/dev/null 2>&1; then # bash-completion > 2.11 _comp_delimited , -W '"${styles[@]}"' else COMPREPLY=($(compgen -W '${styles[@]}' -- "$cur")) fi return 0 esac $split && return 0 if [[ $cur == -* ]]; then # --unbuffered excluded intentionally (no-op) COMPREPLY=($(compgen -W " --show-all --plain --language --highlight-line --file-name --diff --diff-context --tabs --wrap --chop-long-lines --terminal-width --number --color --italic-text --decorations --force-colorization --paging --pager --map-syntax --ignored-suffix --theme --theme-dark --theme-light --list-themes --squeeze-blank --squeeze-limit --style --line-range --list-languages --lessopen --diagnostic --acknowledgements --set-terminal-title --help --version --cache-dir --config-dir --config-file --generate-config-file --no-config --no-custom-assets --no-lessopen " -- "$cur")) return 0 fi _filedir ## Completion of the 'cache' command itself is removed for better UX ## See https://github.com/sharkdp/bat/issues/2085#issuecomment-1271646802 } && complete -F _bat {{PROJECT_EXECUTABLE}} bat-0.25.0/assets/completions/bat.fish.in000064400000000000000000000223331046102023000163450ustar 00000000000000# Fish Shell Completions # Copy or symlink to $XDG_CONFIG_HOME/fish/completions/{{PROJECT_EXECUTABLE}}.fish # ($XDG_CONFIG_HOME is usually set to ~/.config) # `bat` is `batcat` on Debian and Ubuntu set bat {{PROJECT_EXECUTABLE}} # Helper functions: function __bat_complete_files -a token # Cheat to complete files by calling `complete -C` on a fake command name, # like `__fish_complete_directories` does. set -l fake_command aaabccccdeeeeefffffffffgghhhhhhiiiii complete -C"$fake_command $token" end function __bat_complete_one_language -a comp command $bat --list-languages | string split -f1 : | string match -e "$comp" end function __bat_complete_list_languages for spec in (command $bat --list-languages) set -l name (string split -f1 : $spec) for ext in (string split -f2 : $spec | string split ,) test -n "$ext"; or continue string match -rq '[/*]' $ext; and continue printf "%s\t%s\n" $ext $name end printf "%s\t\n" $name end end function __bat_complete_map_syntax set -l token (commandline -ct) if string match -qr '(?.+):(?.*)' -- $token # If token ends with a colon, complete with the list of language names. set -f comps $glob:(__bat_complete_one_language $syntax) else if string match -qr '\*' -- $token # If token contains a globbing character (`*`), complete only possible # globs in the current directory set -f comps (__bat_complete_files $token | string match -er '[*]'): else # Complete files (and globs). set -f comps (__bat_complete_files $token | string match -erv '/$'): end if set -q comps[1] printf "%s\t\n" $comps end end function __bat_cache_subcommand __fish_seen_subcommand_from cache end # Returns true if no exclusive arguments seen. function __bat_no_excl_args not __bat_cache_subcommand; and not __fish_seen_argument \ -s h -l help \ -s V -l version \ -l acknowledgements \ -l config-dir -l config-file \ -l diagnostic \ -l list-languages -l list-themes end # Returns true if the 'cache' subcommand is seen without any exclusive arguments. function __bat_cache_no_excl __bat_cache_subcommand; and not __fish_seen_argument \ -s h -l help \ -l acknowledgements -l build -l clear end function __bat_style_opts set -l style_opts \ "default,recommended components" \ "auto,same as 'default' unless piped" \ "full,all components" \ "plain,no components" \ "changes,Git change markers" \ "header,alias for header-filename" \ "header-filename,filename above content" \ "header-filesize,filesize above content" \ "grid,lines b/w sidebar/header/content" \ "numbers,line numbers in sidebar" \ "rule,separate files" \ "snip,separate ranges" string replace , \t $style_opts end # Use option argument descriptions to indicate which is the default, saving # horizontal space and making sure the option description isn't truncated. set -l color_opts ' auto\tdefault never\t always\t ' set -l decorations_opts $color_opts set -l paging_opts $color_opts # Include some examples so we can indicate the default. set -l pager_opts ' less\tdefault less\ -FR\t more\t vimpager\t ' set -l italic_text_opts ' always\t never\tdefault ' set -l wrap_opts ' auto\tdefault never\t character\t ' # While --tabs theoretically takes any number, most people should be OK with these. # Specifying a list lets us explain what 0 does. set -l tabs_opts ' 0\tpass\ tabs\ through\ directly 1\t 2\t 4\t 8\t ' set -l special_themes ' auto\tdefault,\ Choose\ a\ theme\ based\ on\ dark\ or\ light\ mode auto:always\tChoose\ a\ theme\ based\ on\ dark\ or\ light\ mode auto:system\tChoose\ a\ theme\ based\ on\ dark\ or\ light\ mode dark\tUse\ the\ theme\ specified\ by\ --theme-dark light\tUse\ the\ theme\ specified\ by\ --theme-light ' # Completions: complete -c $bat -l acknowledgements -d "Print acknowledgements" -n __fish_is_first_arg complete -c $bat -l cache-dir -f -d "Show bat's cache directory" -n __fish_is_first_arg complete -c $bat -l color -x -a "$color_opts" -d "When to use colored output" -n __bat_no_excl_args complete -c $bat -l config-dir -f -d "Display location of configuration directory" -n __fish_is_first_arg complete -c $bat -l config-file -f -d "Display location of configuration file" -n __fish_is_first_arg complete -c $bat -l decorations -x -a "$decorations_opts" -d "When to use --style decorations" -n __bat_no_excl_args complete -c $bat -l diagnostic -d "Print diagnostic info for bug reports" -n __fish_is_first_arg complete -c $bat -s d -l diff -d "Only show lines with Git changes" -n __bat_no_excl_args complete -c $bat -l diff-context -x -d "Show N context lines around Git changes" -n "__fish_seen_argument -s d -l diff" complete -c $bat -l generate-config-file -f -d "Generates a default configuration file" -n __fish_is_first_arg complete -c $bat -l file-name -x -d "Specify the display name" -n __bat_no_excl_args complete -c $bat -s f -l force-colorization -d "Force color and decorations" -n __bat_no_excl_args complete -c $bat -s h -d "Print a concise overview" -n __fish_is_first_arg complete -c $bat -l help -f -d "Print all help information" -n __fish_is_first_arg complete -c $bat -s H -l highlight-line -x -d "Highlight line(s) N[:M]" -n __bat_no_excl_args complete -c $bat -l ignored-suffix -x -d "Ignore extension" -n __bat_no_excl_args complete -c $bat -l italic-text -x -a "$italic_text_opts" -d "When to use italic text in the output" -n __bat_no_excl_args complete -c $bat -s l -l language -x -k -a "(__bat_complete_list_languages)" -d "Set the syntax highlighting language" -n __bat_no_excl_args complete -c $bat -l lessopen -d "Enable the $LESSOPEN preprocessor" -n __fish_is_first_arg complete -c $bat -s r -l line-range -x -d "Only print lines [M]:[N] (either optional)" -n __bat_no_excl_args complete -c $bat -l list-languages -f -d "List syntax highlighting languages" -n __fish_is_first_arg complete -c $bat -l list-themes -f -d "List syntax highlighting themes" -n __fish_is_first_arg complete -c $bat -s m -l map-syntax -x -a "(__bat_complete_map_syntax)" -d "Map :" -n __bat_no_excl_args complete -c $bat -l no-config -d "Do not use the configuration file" complete -c $bat -l no-custom-assets -d "Do not load custom assets" complete -c $bat -l no-lessopen -d "Disable the $LESSOPEN preprocessor if enabled (overrides --lessopen)" complete -c $bat -s n -l number -d "Only show line numbers, no other decorations" -n __bat_no_excl_args complete -c $bat -l pager -x -a "$pager_opts" -d "Which pager to use" -n __bat_no_excl_args complete -c $bat -l paging -x -a "$paging_opts" -d "When to use the pager" -n __bat_no_excl_args complete -c $bat -s p -l plain -d "Disable decorations" -n __bat_no_excl_args complete -c $bat -o pp -d "Disable decorations and paging" -n __bat_no_excl_args complete -c $bat -s P -d "Disable paging" -n __bat_no_excl_args complete -c $bat -s A -l show-all -d "Show non-printable characters" -n __bat_no_excl_args complete -c $bat -l style -x -k -a "(__fish_complete_list , __bat_style_opts)" -d "Specify which non-content elements to display" -n __bat_no_excl_args complete -c $bat -l tabs -x -a "$tabs_opts" -d "Set tab width" -n __bat_no_excl_args complete -c $bat -l terminal-width -x -d "Set terminal , +, or -" -n __bat_no_excl_args complete -c $bat -l theme -x -a "$special_themes(command $bat --list-themes | command cat)" -d "Set the syntax highlighting theme" -n __bat_no_excl_args complete -c $bat -l theme-dark -x -a "(command $bat --list-themes | command cat)" -d "Set the syntax highlighting theme for dark backgrounds" -n __bat_no_excl_args complete -c $bat -l theme-light -x -a "(command $bat --list-themes | command cat)" -d "Set the syntax highlighting theme for light backgrounds" -n __bat_no_excl_args complete -c $bat -s V -l version -f -d "Show version information" -n __fish_is_first_arg complete -c $bat -l wrap -x -a "$wrap_opts" -d "Text-wrapping mode" -n __bat_no_excl_args # Sub-command 'cache' completions ## Completion of the 'cache' command itself is removed for better UX ## See https://github.com/sharkdp/bat/issues/2085#issuecomment-1271646802 complete -c $bat -l build -f -d "Parse new definitions into cache" -n __bat_cache_no_excl complete -c $bat -l clear -f -d "Reset definitions to defaults" -n __bat_cache_no_excl complete -c $bat -l blank -f -d "Create new data instead of appending" -n "__bat_cache_subcommand; and not __fish_seen_argument -l clear" complete -c $bat -l source -x -a "(__fish_complete_directories)" -d "Load syntaxes and themes from DIR" -n "__bat_cache_subcommand; and not __fish_seen_argument -l clear" complete -c $bat -l target -x -a "(__fish_complete_directories)" -d "Store cache in DIR" -n __bat_cache_subcommand complete -c $bat -l acknowledgements -d "Build acknowledgements.bin" -n __bat_cache_no_excl complete -c $bat -s h -d "Print a concise overview of $bat-cache help" -n __bat_cache_no_excl complete -c $bat -l help -f -d "Print all $bat-cache help" -n __bat_cache_no_excl # vim:ft=fish bat-0.25.0/assets/completions/bat.zsh.in000064400000000000000000000127161046102023000162240ustar 00000000000000#compdef {{PROJECT_EXECUTABLE}} local curcontext="$curcontext" ret=1 local -a state state_descr line typeset -A opt_args (( $+functions[_{{PROJECT_EXECUTABLE}}_cache_subcommand] )) || _{{PROJECT_EXECUTABLE}}_cache_subcommand() { local -a args args=( '(-b --build -c --clear)'{-b,--build}'[initialize or update the syntax/theme cache]' '(-b --build -c --clear)'{-c,--clear}'[remove the cached syntax definitions and themes]' --source='[specify directory to load syntaxes and themes from]:directory:_files -/' --target='[specify directory to store the cached syntax and theme set in]:directory:_files -/' --blank'[create completely new syntax and theme sets]' --acknowledgements'[build acknowledgements.bin]' '(: -)'{-h,--help}'[show help information]' ) _arguments -S -s $args } (( $+functions[_{{PROJECT_EXECUTABLE}}_main] )) || _{{PROJECT_EXECUTABLE}}_main() { local -a args args=( '(-A --show-all)'{-A,--show-all}'[show non-printable characters (space, tab, newline, ..)]' --nonprintable-notation='[specify how to display non-printable characters when using --show-all]:notation:(caret unicode)' \*{-p,--plain}'[show plain style (alias for `--style=plain`), repeat twice to disable automatic paging (alias for `--paging=never`)]' '(-l --language)'{-l+,--language=}'[set the language for syntax highlighting]:language:->languages' \*{-H+,--highlight-line=}'[highlight specified block of lines]:start\:end' \*--file-name='[specify the name to display for a file]:name:_files' '(-d --diff)'--diff'[only show lines that have been added/removed/modified]' --diff-context='[specify lines of context around added/removed/modified lines when using `--diff`]:lines' --tabs='[set the tab width]:tab width [4]' --wrap='[specify the text-wrapping mode]:mode [auto]:(auto never character)' '!(--wrap)'{-S,--chop-long-lines} --terminal-width='[explicitly set the width of the terminal instead of determining it automatically]:width' '(-n --number --diff --diff-context)'{-n,--number}'[show line numbers]' --color='[specify when to use colors]:when:(auto never always)' --italic-text='[use italics in output]:when:(always never)' --decorations='[specify when to show the decorations]:when:(auto never always)' --paging='[specify when to use the pager]:when:(auto never always)' '(-m --map-syntax)'{-m+,--map-syntax=}'[map a glob pattern to an existing syntax name]: :->syntax-maps' '(--theme)'--theme='[set the color theme for syntax highlighting]:theme:->theme_preferences' '(--theme-dark)'--theme-dark='[set the color theme for syntax highlighting for dark backgrounds]:theme:->themes' '(--theme-light)'--theme-light='[set the color theme for syntax highlighting for light backgrounds]:theme:->themes' '(: --list-themes --list-languages -L)'--list-themes'[show all supported highlighting themes]' --style='[comma-separated list of style elements to display]: : _values "style [default]" default auto full plain changes header header-filename header-filesize grid rule numbers snip' \*{-r+,--line-range=}'[only print the specified line range]:start\:end' '(* -)'{-L,--list-languages}'[display all supported languages]' -P'[disable paging]' "--no-config[don't use the configuration file]" "--no-custom-assets[don't load custom assets]" '(--no-lessopen)'--lessopen'[enable the $LESSOPEN preprocessor]' '(--lessopen)'--no-lessopen'[disable the $LESSOPEN preprocessor if enabled (overrides --lessopen)]' '(* -)'--config-dir"[show bat's configuration directory]" '(* -)'--config-file'[show path to the configuration file]' '(* -)'--generate-config-file'[generate a default configuration file]' '(* -)'--cache-dir"[show bat's cache directory]" '(* -)'{-h,--help}'[show help information]' '(* -)'{-V,--version}'[show version information]' '*: :{ _files || compadd cache }' ) _arguments -S -s $args && ret=0 case "$state" in syntax-maps) if ! compset -P '*:'; then _message -e patterns 'glob pattern:language' return fi ;& # fall-through languages) local IFS=$'\n' local -a languages languages=( $({{PROJECT_EXECUTABLE}} --list-languages | awk -F':|,' '{ for (i = 1; i <= NF; ++i) printf("%s:%s\n", $i, $1) }') ) _describe 'language' languages && ret=0 ;; themes) local -a themes expl themes=(${(f)"$(_call_program themes {{PROJECT_EXECUTABLE}} --list-themes)"} ) _wanted themes expl 'theme' compadd -a themes && ret=0 ;; theme_preferences) local -a themes expl themes=(auto dark light auto:always auto:system ${(f)"$(_call_program themes {{PROJECT_EXECUTABLE}} --list-themes)"} ) _wanted themes expl 'theme' compadd -a themes && ret=0 ;; esac return ret } case $words[2] in cache) ## Completion of the 'cache' command itself is removed for better UX ## See https://github.com/sharkdp/bat/issues/2085#issuecomment-1271646802 shift words (( CURRENT-- )) curcontext="${curcontext%:*}-${words[1]}:" _{{PROJECT_EXECUTABLE}}_cache_subcommand ;; *) _{{PROJECT_EXECUTABLE}}_main ;; esac bat-0.25.0/assets/create.sh000075500000000000000000000034611046102023000135660ustar 00000000000000#!/usr/bin/env bash set -euo pipefail ASSET_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" REPO_DIR="$ASSET_DIR/.." # Ensure submodules are initialized. update_submodules() { local submodule local submodule_prompt=unspecified local submodule_path { while { read -r submodule && read -r submodule_path; } <&3; do if ! [[ -d "${REPO_DIR}/.git/modules/${submodule}" ]] && [[ -d "${REPO_DIR}/${submodule_path}" ]]; then if [[ "$submodule_prompt" = "unspecified" ]]; then echo "One or more submodules were found to be uninitialized." printf "Initialize and update them? [Y/n] " read -r submodule_prompt fi case "$submodule_prompt" in y|yes|'') { git -C "$REPO_DIR" submodule update --init "$submodule_path" };; n|no) { return };; *) { echo "Unknown answer. Not updating submodules." };; esac fi done } 3< <(git config --file "${REPO_DIR}/.gitmodules" --null --get-regexp path | xargs -0 printf "%s\n" | sed 's/^submodule.//;s/.path$//') } if [ -t 0 ]; then update_submodules fi # Always remove the local cache to avoid any confusion bat cache --clear # TODO: # - Remove the JavaDoc patch once https://github.com/trishume/syntect/issues/222 has been fixed # - Remove the C# patch once https://github.com/sublimehq/Packages/pull/2331 has been merged # Apply patches ( cd "$ASSET_DIR" for patch in patches/*.patch; do patch --strip=0 < "$patch" done ) reverse_patches() { ( cd "$ASSET_DIR" for patch in patches/*.patch; do patch --strip=0 --reverse <"$patch" done ) } # Make sure to always reverse patches, even if the `bat cache` command fails or aborts trap reverse_patches EXIT bat cache --build --blank --acknowledgements --source="$ASSET_DIR" --target="$ASSET_DIR" bat-0.25.0/assets/manual/bat.1.in000064400000000000000000000333431046102023000145000ustar 00000000000000.TH {{PROJECT_EXECUTABLE_UPPERCASE}} "1" .SH NAME {{PROJECT_EXECUTABLE}} \- a cat(1) clone with syntax highlighting and Git integration. .SH "USAGE" .IP "{{PROJECT_EXECUTABLE}} [OPTIONS] [FILE]..." .IP "{{PROJECT_EXECUTABLE}} cache [CACHE-OPTIONS] [--build|--clear] .SH DESCRIPTION {{PROJECT_EXECUTABLE}} prints the syntax-highlighted content of a collection of FILEs to the terminal. If no FILE is specified, or when FILE is '-', it reads from standard input. {{PROJECT_EXECUTABLE}} supports a large number of programming and markup languages. It also communicates with git(1) to show modifications with respect to the git index. {{PROJECT_EXECUTABLE}} automatically pipes its output through a pager (by default: less). Whenever the output of {{PROJECT_EXECUTABLE}} goes to a non-interactive terminal, i.e. when the output is piped into another process or into a file, {{PROJECT_EXECUTABLE}} will act as a drop-in replacement for cat(1) and fall back to printing the plain file contents. .SH "OPTIONS" General remarks: Command-line options like '-l'/'--language' that take values can be specified as either '--language value', '--language=value', '-l value' or '-lvalue'. .HP \fB\-A\fR, \fB\-\-show\-all\fR .IP Show non\-printable characters like space, tab or newline. Use '\-\-tabs' to control the width of the tab\-placeholders. .HP \fB\-\-nonprintable\-notation\fR .IP Specify how to display non-printable characters when using \-\-show\-all. Possible values: .RS .IP "caret" Use character sequences like ^G, ^J, ^@, .. to identify non-printable characters .IP "unicode" Use special Unicode code points to identify non-printable characters .RE .HP \fB\-p\fR, \fB\-\-plain\fR .IP Only show plain style, no decorations. This is an alias for \&'\-\-style=plain'. When '\-p' is used twice ('\-pp'), it also disables automatic paging (alias for '\-\-style=plain \fB\-\-paging\fR=\fI\,never\/\fR'). .HP \fB\-l\fR, \fB\-\-language\fR .IP Explicitly set the language for syntax highlighting. The language can be specified as a name (like 'C++' or 'LaTeX') or possible file extension (like 'cpp', 'hpp' or 'md'). Use '\-\-list\-languages' to show all supported language names and file extensions. .HP \fB\-H\fR, \fB\-\-highlight\-line\fR ... .IP Highlight the specified line ranges with a different background color. For example: .RS .IP "\-\-highlight\-line 40" highlights line 40 .IP "\-\-highlight\-line 30:40" highlights lines 30 to 40 .IP "\-\-highlight\-line :40" highlights lines 1 to 40 .IP "\-\-highlight\-line 40:" highlights lines 40 to the end of the file .IP "\-\-highlight\-line 30:+10" highlights lines 30 to 40 .RE .HP \fB\-\-file\-name\fR ... .IP Specify the name to display for a file. Useful when piping data to {{PROJECT_EXECUTABLE}} from STDIN when {{PROJECT_EXECUTABLE}} does not otherwise know the filename. Note that the provided file name is also used for syntax detection. .HP \fB\-d\fR, \fB\-\-diff\fR .IP Only show lines that have been added/removed/modified with respect to the Git index. Use '\-\-diff\-context=N' to control how much context you want to see. .HP \fB\-\-diff\-context\fR ... .IP Include N lines of context around added/removed/modified lines when using '\-\-diff'. .HP \fB\-\-tabs\fR .IP Set the tab width to T spaces. Use a width of 0 to pass tabs through directly .HP \fB\-\-wrap\fR .IP Specify the text\-wrapping mode (*auto*, never, character). The '\-\-terminal\-width' option can be used in addition to control the output width. .HP \fB\-S\fR, \fB\-\-chop\-long\-lines\fR .IP Truncate all lines longer than screen width. Alias for '\-\-wrap=never'. .HP \fB\-\-terminal\-width\fR .IP Explicitly set the width of the terminal instead of determining it automatically. If prefixed with '+' or '\-', the value will be treated as an offset to the actual terminal width. See also: '\-\-wrap'. .HP \fB\-n\fR, \fB\-\-number\fR .IP Only show line numbers, no other decorations. This is an alias for '\-\-style=numbers' .HP \fB\-\-color\fR .IP Specify when to use colored output. The automatic mode only enables colors if an interactive terminal is detected. Possible values: *auto*, never, always. .HP \fB\-\-italic\-text\fR .IP Specify when to use ANSI sequences for italic text in the output. Possible values: always, *never*. .HP \fB\-\-decorations\fR .IP Specify when to use the decorations that have been specified via '\-\-style'. The automatic mode only enables decorations if an interactive terminal is detected. Possible values: *auto*, never, always. .HP \fB\-f\fR, \fB\-\-force\-colorization\fR .IP Alias for '--decorations=always --color=always'. This is useful \ if the output of {{PROJECT_EXECUTABLE}} is piped to another program, but you want \ to keep the colorization/decorations. .HP \fB\-\-paging\fR .IP Specify when to use the pager. To disable the pager, use \&'\-\-paging=never' or its alias, \fB-P\fR. To disable the pager permanently, set BAT_PAGER to an empty string. To control which pager is used, see the '\-\-pager' option. Possible values: *auto*, never, always. .HP \fB\-\-pager\fR .IP Determine which pager is used. This option will override the PAGER and BAT_PAGER environment variables. The default pager is 'less'. To control when the pager is used, see the '\-\-paging' option. Example: '\-\-pager "less \fB\-RF\fR"'. Note: By default, if the pager is set to 'less' (and no command-line options are specified), 'bat' will pass the following command line options to the pager: '-R'/'--RAW-CONTROL-CHARS', '-F'/'--quit-if-one-screen' and '-X'/'--no-init'. The last option ('-X') is only used for 'less' versions older than 530. The '-R' option is needed to interpret ANSI colors correctly. The second option ('-F') instructs less to exit immediately if the output size is smaller than the vertical size of the terminal. This is convenient for small files because you do not have to press 'q' to quit the pager. The third option ('-X') is needed to fix a bug with the '--quit-if-one-screen' feature in old versions of 'less'. Unfortunately, it also breaks mouse-wheel support in 'less'. If you want to enable mouse-wheel scrolling on older versions of 'less', you can pass just '-R' (as in the example above, this will disable the quit-if-one-screen feature). For less 530 or newer, it should work out of the box. .HP \fB\-m\fR, \fB\-\-map\-syntax\fR ... .IP Map a glob pattern to an existing syntax name. The glob pattern is matched on the full path and the filename. For example, to highlight *.build files with the Python syntax, use -m '*.build:Python'. To highlight files named '.myignore' with the Git Ignore syntax, use -m '.myignore:Git Ignore'. Note that the right-hand side is the *name* of the syntax, not a file extension. .HP \fB\-\-ignored\-suffix\fR .IP Ignore extension. For example: 'bat \-\-ignored-suffix ".dev" my_file.json.dev' will use JSON syntax, and ignore '.dev' .HP \fB\-\-theme\fR .IP Set the theme for syntax highlighting. Use \fB\-\-list\-themes\fP to see all available themes. To set a default theme, add the \fB\-\-theme="..."\fP option to the configuration file or export the \fBBAT_THEME\fP environment variable (e.g.: \fBexport BAT_THEME="..."\fP). Special values: .RS .IP "auto (\fIdefault\fR)" Picks a dark or light theme depending on the terminal's colors. Use \fB-\-theme\-light\fR and \fB-\-theme\-dark\fR to customize the selected theme. .IP "auto:always" Variation of \fBauto\fR where where the terminal's colors are detected even when the output is redirected. .IP "auto:system (macOS only)" Variation of \fBauto\fR where the color scheme is detected from the system-wide preference instead. .IP "dark" Use the dark theme specified by \fB-\-theme-dark\fR. .IP "light" Use the light theme specified by \fB-\-theme-light\fR. .RE .HP \fB\-\-theme\-dark\fR .IP Sets the theme name for syntax highlighting used when the terminal uses a dark background. To set a default theme, add the \fB\-\-theme-dark="..."\fP option to the configuration file or export the \fBBAT_THEME_DARK\fP environment variable (e.g. \fBexport BAT_THEME_DARK="..."\fP). This option only has an effect when \fB\-\-theme\fP option is set to \fBauto\fR or \fBdark\fR. .HP \fB\-\-theme\-light\fR .IP Sets the theme name for syntax highlighting used when the terminal uses a dark background. To set a default theme, add the \fB\-\-theme-dark="..."\fP option to the configuration file or export the \fBBAT_THEME_LIGHT\fP environment variable (e.g. \fBexport BAT_THEME_LIGHT="..."\fP). This option only has an effect when \fB\-\-theme\fP option is set to \fBauto\fR or \fBlight\fR. .HP \fB\-\-list\-themes\fR .IP Display a list of supported themes for syntax highlighting. .HP \fB\-s\fR, \fB\-\-squeeze\-blank\fR .IP Squeeze consecutive empty lines into a single empty line. .HP \fB\-\-squeeze\-limit\fR .IP Set the maximum number of consecutive empty lines to be printed. .HP \fB\-\-style\fR .IP Configure which elements (line numbers, file headers, grid borders, Git modifications, \&..) to display in addition to the file contents. The argument is a comma\-separated list of components to display (e.g. 'numbers,changes,grid') or a pre\-defined style ('full'). To set a default style, add the '\-\-style=".."' option to the configuration file or export the BAT_STYLE environment variable (e.g.: export BAT_STYLE=".."). Possible values: *default*, full, auto, plain, changes, header, header-filename, header-filesize, grid, rule, numbers, snip. .HP \fB\-r\fR, \fB\-\-line\-range\fR ... .IP Only print the specified range of lines for each file. For example: .RS .IP "\-\-line\-range 30:40" prints lines 30 to 40 .IP "\-\-line\-range :40" prints lines 1 to 40 .IP "\-\-line\-range 40:" prints lines 40 to the end of the file .IP "\-\-line\-range 30:+10" prints lines 30 to 40 .RE .HP \fB\-L\fR, \fB\-\-list\-languages\fR .IP Display a list of supported languages for syntax highlighting. .HP \fB\-u\fR, \fB\-\-unbuffered\fR .IP This option exists for POSIX\-compliance reasons ('u' is for 'unbuffered'). The output is always unbuffered \- this option is simply ignored. .HP \fB\-\-no\-custom\-assets\fR .IP Do not load custom assets. .HP \fB\-\-config\-dir\fR .IP Show bat's configuration directory. .HP \fB\-\-cache\-dir\fR .IP Show bat's cache directory. .HP \fB\-\-diagnostic\fR .IP Show diagnostic information for bug reports. .HP \fB\-\-acknowledgements\fR .IP Show acknowledgements. .HP \fB\-\-set\-terminal\-title\fR .IP Sets terminal title to filenames when using a pager. .HP \fB\-h\fR, \fB\-\-help\fR .IP Print this help message. .HP \fB\-V\fR, \fB\-\-version\fR .IP Show version information. .SH "POSITIONAL ARGUMENTS" .HP \fB...\fR .IP Files to print and concatenate. Use a dash ('\-') or no argument at all to read from standard input. .SH "SUBCOMMANDS" .HP \fBcache\fR - Modify the syntax\-definition and theme cache. .SH "FILES" {{PROJECT_EXECUTABLE}} can also be customized with a configuration file. The location of the file is dependent on your operating system. To get the default path for your system, call: \fB{{PROJECT_EXECUTABLE}} --config-file\fR Alternatively, you can use the BAT_CONFIG_PATH environment variable to point {{PROJECT_EXECUTABLE}} to a non-default location of the configuration file. To generate a default configuration file, call: \fB{{PROJECT_EXECUTABLE}} --generate-config-file\fR These are related options: .HP \fB\-\-config\-file\fR .IP Show path to the configuration file. .HP \fB\-\-generate-config\-file\fR .IP Generates a default configuration file. .HP \fB\-\-no\-config\fR .IP Do not use the configuration file. .SH "ADDING CUSTOM LANGUAGES" {{PROJECT_EXECUTABLE}} supports Sublime Text \fB.sublime-syntax\fR language files, and can be customized to add additional languages to your local installation. To do this, add the \fB.sublime-syntax\fR language files to `\fB$({{PROJECT_EXECUTABLE}} --config-dir)/syntaxes\fR` and run `\fB{{PROJECT_EXECUTABLE}} cache --build\fR`. \fBExample:\fR .RS 0.5i mkdir -p "$({{PROJECT_EXECUTABLE}} --config-dir)/syntaxes" .br cd "$({{PROJECT_EXECUTABLE}} --config-dir)/syntaxes" # Put new '.sublime-syntax' language definition files .br # in this folder (or its subdirectories), for example: .br git clone https://github.com/tellnobody1/sublime-purescript-syntax # And then build the cache. .br {{PROJECT_EXECUTABLE}} cache --build .RE Once the cache is built, the new language will be visible in `\fB{{PROJECT_EXECUTABLE}} --list-languages\fR`. .br If you ever want to remove the custom languages, you can clear the cache with `\fB{{PROJECT_EXECUTABLE}} cache --clear\fR`. .SH "ADDING CUSTOM THEMES" Similarly to custom languages, {{PROJECT_EXECUTABLE}} supports Sublime Text \fB.tmTheme\fR themes. These can be installed to `\fB$({{PROJECT_EXECUTABLE}} --config-dir)/themes\fR`, and are added to the cache with `\fB{{PROJECT_EXECUTABLE}} cache --build`. .SH "INPUT PREPROCESSOR" Much like less(1) does, {{PROJECT_EXECUTABLE}} supports input preprocessors via the LESSOPEN and LESSCLOSE environment variables. In addition, {{PROJECT_EXECUTABLE}} attempts to be as compatible with less's preprocessor implementation as possible. To use the preprocessor, call: \fB{{PROJECT_EXECUTABLE}} --lessopen\fR Alternatively, the preprocessor may be enabled by default by adding the '\-\-lessopen' option to the configuration file. To temporarily disable the preprocessor if it is enabled by default, call: \fB{{PROJECT_EXECUTABLE}} --no-lessopen\fR These are related options: .HP \fB\-\-lessopen\fR .IP Enable the $LESSOPEN preprocessor. .HP \fB\-\-no\-lessopen\fR .IP Disable the $LESSOPEN preprocessor if enabled (overrides --lessopen) .PP For more information, see the "INPUT PREPROCESSOR" section of less(1). .SH "MORE INFORMATION" For more information and up-to-date documentation, visit the {{PROJECT_EXECUTABLE}} repo: .br \fBhttps://github.com/sharkdp/bat\fR bat-0.25.0/assets/patches/1337.tmTheme.patch000064400000000000000000000014451046102023000164330ustar 00000000000000diff --git themes/1337-Scheme/1337.tmTheme themes/1337-Scheme/1337.tmTheme index fdff5bf..8cfc888 100644 --- themes/1337-Scheme/1337.tmTheme +++ themes/1337-Scheme/1337.tmTheme @@ -280,7 +280,7 @@ SOFTWARE. name PHP Namespaces scope - support.other.namespace, entity.name.type.namespace + support.other.namespace, entity.name.type.namespace, entity.name settings foreground @@ -561,7 +561,7 @@ SOFTWARE. name diff.header scope - meta.diff, meta.diff.header + meta.diff, meta.diff.header, markup.heading settings foreground bat-0.25.0/assets/patches/C#.sublime-syntax.patch000064400000000000000000000011061046102023000176360ustar 00000000000000diff --git syntaxes/01_Packages/C#/C#.sublime-syntax syntaxes/01_Packages/C#/C#.sublime-syntax index ed494f8b..01b710e8 100644 --- syntaxes/01_Packages/C#/C#.sublime-syntax +++ syntaxes/01_Packages/C#/C#.sublime-syntax @@ -1312,7 +1312,7 @@ contexts: 2: punctuation.separator.cs 3: punctuation.section.brackets.end.cs 4: keyword.operator.pointer.cs - - match: \((?=(?:[^,)(]*|\([^\)]*\))*,) + - match: \((?=(?:[^,)(]|\([^\)]*\))*,) scope: punctuation.section.group.begin.cs push: - meta_scope: meta.group.tuple.cs bat-0.25.0/assets/patches/Groff.sublime-syntax.patch000064400000000000000000000011011046102023000204470ustar 00000000000000diff --git syntaxes/02_Extra/Groff/Man Page/Man Page.sublime-syntax syntaxes/02_Extra/Groff/Man Page/Man Page.sublime-syntax index 57834af..6648664 100644 --- syntaxes/02_Extra/Groff/Man Page/Man Page.sublime-syntax +++ syntaxes/02_Extra/Groff/Man Page/Man Page.sublime-syntax @@ -4,9 +4,9 @@ # - man-pages(7) # - groff(7) --- -name: Man Page (groff/troff) +name: Groff/troff scope: text.groff -file_extensions: [man, groff, troff, '1', '2', '3', '4', '5', '6', '7'] +file_extensions: [groff, troff, '1', '2', '3', '4', '5', '6', '7', '8', '9'] contexts: main: bat-0.25.0/assets/patches/JavaDoc.sublime-syntax.patch000064400000000000000000000010351046102023000207210ustar 00000000000000diff --git syntaxes/01_Packages/Java/JavaDoc.sublime-syntax syntaxes/01_Packages/Java/JavaDoc.sublime-syntax index 422a6a9..40a741e 100644 --- syntaxes/01_Packages/Java/JavaDoc.sublime-syntax +++ syntaxes/01_Packages/Java/JavaDoc.sublime-syntax @@ -13,7 +13,7 @@ variables: contexts: prototype: # https://docs.oracle.com/javase/7/docs/technotes/tools/windows/javadoc.html#leadingasterisks - - match: ^\s*(\*)\s*(?!\s*@) + - match: ^\s*(\*)(?!/)\s*(?!\s*@) captures: 1: punctuation.definition.comment.javadoc bat-0.25.0/assets/patches/JavaScript.sublime-syntax.patch000064400000000000000000000010531046102023000214600ustar 00000000000000Submodule assets/syntaxes/01_Packages contains modified content diff --git syntaxes/01_Packages/JavaScript/JavaScript.sublime-syntax syntaxes/01_Packages/JavaScript/JavaScript.sublime-syntax index 05a4fed6..78a7bf55 100644 --- syntaxes/01_Packages/JavaScript/JavaScript.sublime-syntax +++ syntaxes/01_Packages/JavaScript/JavaScript.sublime-syntax @@ -5,7 +5,7 @@ name: JavaScript file_extensions: - js - htc -first_line_match: ^#!\s*/.*\b(node|js)\b +first_line_match: ^#!\s*/.*\b(node|bun|js)\b scope: source.js variables: bin_digit: '[01_]' bat-0.25.0/assets/patches/Lisp.sublime-syntax.patch000064400000000000000000002233421046102023000203300ustar 00000000000000diff --git syntaxes/01_Packages/Lisp/Lisp.sublime-syntax syntaxes/01_Packages/Lisp/Lisp.sublime-syntax index 50e5dad3..44a9795d 100644 --- syntaxes/01_Packages/Lisp/Lisp.sublime-syntax +++ syntaxes/01_Packages/Lisp/Lisp.sublime-syntax @@ -1,11 +1,14 @@ %YAML 1.2 --- -# http://www.sublimetext.com/docs/3/syntax.html +# https://www.sublimetext.com/docs/syntax.html # # `Common Lisp` Language Reference: -# http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/index.html -# +# https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/index.html +# https://www.lispworks.com/documentation/lw70/CLHS/Front/Contents.htm name: Lisp +scope: source.lisp +version: 2 + file_extensions: - lisp - cl @@ -17,108 +20,2268 @@ file_extensions: - ss - lsp - fasl # Scheme dialect of Lisp -scope: source.lisp + - sld # Scheme r7rs library + +first_line_match: |- + (?xi: + ^ \s* ; .*? -\*- .*? \blisp\b .*? -\*- # editorconfig + ) + +############################################################################### + contexts: main: - - include: comments + - include: statements + + statements: - include: parens + - include: expressions + - match: \) + scope: invalid.illegal.stray-bracket-end.lisp expressions: - include: comments - include: numbers - - include: constants - include: strings - - include: variables + - include: annotations + - include: keywords + - include: quotes + - include: macros + - include: modifiers + - include: identifiers + +###[ COMMENTS ]################################################################ + + comments: + - include: line-comments + - include: block-comments + - match: \|# + scope: invalid.illegal.stray-comment-end.lisp + + block-comments: + - match: '#\|' + scope: punctuation.definition.comment.begin.lisp + push: block-comment-body + + block-comment-body: + - meta_scope: comment.block.lisp + - match: '\|#' + scope: punctuation.definition.comment.end.lisp + pop: 1 + - include: block-comments + + line-comments: + - match: ;+ + scope: punctuation.definition.comment.lisp + push: line-comment-body + + line-comment-body: + - meta_scope: comment.line.semicolon.lisp + - match: $\n? + pop: 1 + +###[ PARENTHESES ]############################################################# + + parens: + - match: \( + scope: punctuation.section.parens.begin.lisp + push: + - paren-body + - paren-begin + + paren-begin: + - include: class-declaration + - include: function-declaration + - include: macro-declaration + - include: struct-declaration + - include: type-declaration + - include: variable-declaration + - include: other-declaration + - include: declare - include: control - - include: functions - - include: operators + - include: loop + - include: operator + - include: quote + - include: namespaces + - include: builtin-function + - include: other-function + - include: comments + - include: else-pop - variables: - - match: (\*)(?i:trace-output|terminal-io|suppress-series-warnings|standard-output|standard-input|readtable|read-suppress|read-eval|read-default-float-format|read-base|random-state|query-io|print-right-margin|print-readably|print-radix|print-pretty|print-pprint-dispatch|print-miser-width|print-lines|print-level|print-length|print-gensym|print-escape|print-circle|print-case|print-base|print-array|package|modules|macroexpand-hook|load-verbose|load-truename|load-print|load-pathname|gensym-counter|features|evalhook|error-output|default-pathname-defaults|debugger-hook|debug-io|compile-verbose|compile-print|compile-file-truename|compile-file-pathname|break-on-warnings|break-on-signals|applyhook)(\*) - scope: variable.language.lisp + paren-body: + - meta_scope: meta.parens.lisp + - include: paren-end + - include: parens + - include: expressions + + paren-end: + - meta_include_prototype: false + - meta_scope: meta.parens.lisp + - match: \) + scope: punctuation.section.parens.end.lisp + pop: 1 + +###[ LISTS ]################################################################### + + expect-list: + # a list expression + # skips function-like parentheses on next level + - meta_include_prototype: false + - match: \( + scope: punctuation.section.parens.begin.lisp + set: paren-body + - include: comments + - include: else-pop + + expect-lists-list: + # a list of list expressions + # skips function-like parentheses on next 2 levels + - meta_include_prototype: false + - match: \( + scope: punctuation.section.parens.begin.lisp + set: lists-list-body + - include: comments + - include: else-pop + + lists-list-body: + - meta_scope: meta.parens.lisp + - include: paren-end + - include: lists + - include: expressions + + lists: + - match: \( + scope: punctuation.section.parens.begin.lisp + push: paren-body + +###[ QUOTED EXPRESSIONS ]###################################################### + + quotes: + # abbreviation of (quote ...) function + - match: \' + scope: punctuation.definition.quoted.lisp + push: quoted-content + + quoted-content: + - meta_include_prototype: false + - match: \( + scope: punctuation.section.parens.begin.lisp + set: quoted-paren-body + # A quoted symbol evaluates to the symbol. + - match: '{{identifier}}' + scope: constant.other.symbol.lisp captures: - 1: punctuation.definition.variable.begin.lisp - 2: punctuation.definition.variable.end.lisp - - match: (\*)(\S*)(\*) - scope: variable.other.global.lisp + 1: punctuation.definition.symbol.begin.lisp + 2: punctuation.definition.symbol.end.lisp + pop: 1 + - include: immediately-pop + + quoted-parens: + - match: \( + scope: punctuation.section.parens.begin.lisp + push: quoted-paren-body + + quoted-paren-body: + - meta_scope: meta.parens.lisp + - include: paren-end + - include: quoted-parens + - include: expressions + +###[ CLASS DECLARATIONS ]###################################################### + + class-declaration: + # https://www.lispworks.com/documentation/lw70/CLHS/Body/m_defcla.htm + - match: (?i:defclass|define-class){{break}} + scope: meta.class.lisp keyword.declaration.class.lisp + set: + - class-declaration-slots + - class-declaration-parent-list + - class-declaration-name + + class-declaration-name: + - match: '{{identifier}}' + scope: entity.name.class.lisp captures: - 1: punctuation.definition.variable.begin.lisp - 3: punctuation.definition.variable.end.lisp + 1: punctuation.definition.symbol.begin.lisp + 2: punctuation.definition.symbol.end.lisp + pop: 1 + - include: comments + - include: else-pop + + class-declaration-parent-list: + - meta_include_prototype: false + - match: \( + scope: punctuation.section.parens.begin.lisp + set: class-declaration-parent-list-body + - include: comments + - include: else-pop + + class-declaration-parent-list-body: + - meta_scope: meta.parens.lisp + - include: namespaces + - match: '{{identifier}}' + scope: entity.other.inherited-class.lisp + captures: + 1: punctuation.definition.symbol.begin.lisp + 2: punctuation.definition.symbol.end.lisp + - include: comments + - include: paren-end + + class-declaration-slots: + - meta_content_scope: meta.class.lisp + - include: paren-pop + - include: lists + - include: expressions + +###[ FUNCTION DECLARATIONS ]################################################### + + function-declaration: + # https://www.lispworks.com/documentation/HyperSpec/Body/s_lambda.htm + - match: (?i:lambda){{break}} + scope: meta.function.lisp keyword.declaration.function.inline.lisp + set: + - function-body + - function-parameter-list + # https://www.lispworks.com/documentation/HyperSpec/Body/m_defun.htm + - match: (?i:def(?:[a-z]+f)?un|defgeneric|define-(?:command(?:-global)?|parenscript)){{break}} + scope: meta.function.lisp keyword.declaration.function.lisp + set: + - function-body + - function-parameter-list + - function-declaration-name + # https://www.lispworks.com/documentation/HyperSpec/Body/m_defmet.htm + - match: (?i:defmethod){{break}} + scope: meta.function.lisp keyword.declaration.function.lisp + set: + - function-body + - function-parameter-list + - method-qualifier + - function-declaration-name + # https://www.lispworks.com/documentation/HyperSpec/Body/s_flet_.htm + - match: (?i:flet|labels){{break}} + scope: keyword.declaration.function.lisp + set: function-declaration-list + + function-declaration-list: + - meta_include_prototype: false + - match: \( + scope: punctuation.section.parens.begin.lisp + set: function-declaration-list-body + - include: comments + - include: else-pop + + function-declaration-list-body: + - meta_scope: meta.parens.lisp + - match: \( + scope: punctuation.section.parens.begin.lisp + push: + - paren-end + - function-body + - function-parameter-list + - function-declaration-name + - include: comments + - include: paren-end + + function-declaration-name: + - include: namespaces + - match: '{{identifier}}' + scope: entity.name.function.lisp + captures: + 1: punctuation.definition.symbol.begin.lisp + 2: punctuation.definition.symbol.end.lisp + pop: 1 + - include: comments + - include: else-pop + + method-qualifier: + # qualifiers may be anything but lists + - include: expressions + - include: else-pop + + function-parameter-list: + - meta_include_prototype: false + - match: \( + scope: punctuation.section.parameters.begin.lisp + set: function-parameter-list-body + - include: comments + - include: else-pop + + function-parameter-list-body: + - clear_scopes: 1 + - meta_scope: meta.function.parameters.lisp + - match: \) + scope: punctuation.section.parameters.end.lisp + pop: 1 + - include: comments + - include: annotations + - include: keywords + - include: modifiers + - include: parameters + + function-body: + - meta_content_scope: meta.function.lisp + - include: paren-pop + - include: parens + - include: expressions + +###[ MACRO DECLARATIONS ]###################################################### + + macro-declaration: + # https://www.lispworks.com/documentation/HyperSpec/Body/m_defmac.htm + - match: (?i:defmacro){{break}} + scope: meta.macro.lisp keyword.declaration.macro.lisp + set: + - macro-body + - macro-parameter-list + - macro-declaration-name + # https://www.lispworks.com/documentation/HyperSpec/Body/s_flet_.htm + - match: (?i:macrolet){{break}} + scope: keyword.declaration.macro.lisp + set: macro-declaration-list + + macro-declaration-list: + - meta_include_prototype: false + - match: \( + scope: punctuation.section.parens.begin.lisp + set: macro-declaration-list-body + - include: comments + - include: else-pop + + macro-declaration-list-body: + - meta_scope: meta.parens.lisp + - match: \( + scope: punctuation.section.parens.begin.lisp + push: + - paren-end + - macro-body + - macro-parameter-list + - macro-declaration-name + - include: comments + - include: paren-end + + macro-declaration-name: + - include: namespaces + - match: '{{identifier}}' + scope: entity.name.macro.lisp + captures: + 1: punctuation.definition.symbol.begin.lisp + 2: punctuation.definition.symbol.end.lisp + pop: 1 + - include: comments + - include: else-pop + + macro-parameter-list: + - meta_include_prototype: false + - match: \( + scope: punctuation.section.parameters.begin.lisp + set: macro-parameter-list-body + - include: comments + - include: else-pop + + macro-parameter-list-body: + - clear_scopes: 1 + - meta_scope: meta.macro.parameters.lisp + - match: \) + scope: punctuation.section.parameters.end.lisp + pop: 1 + - include: comments + - include: annotations + - include: keywords + - include: modifiers + - include: parameters + + macro-body: + - meta_content_scope: meta.macro.lisp + - include: paren-pop + - include: parens + - include: expressions + +###[ STRUCT DECLARATIONS ]##################################################### + + struct-declaration: + # https://www.lispworks.com/documentation/lw70/CLHS/Body/m_defstr.htm + - match: (?i:defstruct|define-struct){{break}} + scope: meta.struct.lisp keyword.declaration.struct.lisp + set: + - struct-declaration-body + - struct-declaration-name + + struct-declaration-name: + - meta_include_prototype: false + - match: \( + scope: punctuation.section.parens.begin.lisp + set: + - paren-body + - struct-declaration-qualified-name + - include: struct-declaration-qualified-name + + struct-declaration-qualified-name: + - include: namespaces + - match: '{{identifier}}' + scope: entity.name.struct.lisp + captures: + 1: punctuation.definition.symbol.begin.lisp + 2: punctuation.definition.symbol.end.lisp + pop: 1 + - include: comments + - include: else-pop + + struct-declaration-body: + - meta_content_scope: meta.struct.lisp + - include: paren-pop + - include: lists + - include: expressions + +###[ TYPE DECLARATIONS ]####################################################### + + type-declaration: + # https://www.lispworks.com/documentation/lw70/CLHS/Body/m_deftp.htm + - match: (?i:deftype|define-type){{break}} + scope: meta.type.lisp keyword.declaration.type.lisp + set: + - type-body + - type-parameter-list + - type-declaration-name + + type-declaration-name: + - include: namespaces + - match: '{{identifier}}' + scope: entity.name.type.lisp + captures: + 1: punctuation.definition.symbol.begin.lisp + 2: punctuation.definition.symbol.end.lisp + pop: 1 + - include: comments + - include: else-pop + + type-parameter-list: + - meta_include_prototype: false + - match: \( + scope: punctuation.section.parameters.begin.lisp + set: type-parameter-list-body + - include: comments + - include: else-pop + + type-parameter-list-body: + - clear_scopes: 1 + - meta_scope: meta.type.parameters.lisp + - match: \) + scope: punctuation.section.parameters.end.lisp + pop: 1 + - include: comments + - include: annotations + - include: keywords + - include: modifiers + - include: parameters + + type-body: + - meta_content_scope: meta.type.lisp + - include: paren-pop + - include: parens + - include: expressions + +###[ VARIABLE DECLARATIONS ]################################################### + + variable-declaration: + # https://www.lispworks.com/documentation/HyperSpec/Body/s_let_l.htm + - match: (?i:let\*?){{break}} + scope: keyword.declaration.variable.lisp + set: variable-declaration-list + # https://www.lispworks.com/documentation/lw445/CLHS/Body/m_defcon.htm + - match: (?i:defconstant){{break}} + scope: meta.declaration.lisp keyword.declaration.constant.lisp + set: constant-declaration-name + # https://www.lispworks.com/documentation/HyperSpec/Body/m_defpar.htm + - match: (?i:defparameter|defvar){{break}} + scope: meta.declaration.lisp keyword.declaration.variable.lisp + set: variable-declaration-name + + variable-declaration-list: + - meta_include_prototype: false + - match: \( + scope: punctuation.section.parens.begin.lisp + set: variable-declaration-list-body + - include: comments + - include: else-pop + + variable-declaration-list-body: + - meta_scope: meta.parens.lisp + - match: \( + scope: punctuation.section.parens.begin.lisp + push: + - paren-body + - variable-declaration-name + - match: '{{identifier}}' + scope: meta.declaration.lisp variable.other.lisp + captures: + 1: punctuation.definition.symbol.begin.lisp + 2: punctuation.definition.symbol.end.lisp + - include: comments + - include: paren-end + + constant-declaration-name: + - meta_content_scope: meta.declaration.lisp + - match: '{{identifier}}' + scope: meta.declaration.lisp constant.other.lisp + captures: + 1: punctuation.definition.symbol.begin.lisp + 2: punctuation.definition.symbol.end.lisp + pop: 1 + - include: comments + - include: else-pop + + variable-declaration-name: + - meta_content_scope: meta.declaration.lisp + - match: '{{identifier}}' + scope: meta.declaration.lisp variable.other.lisp + captures: + 1: punctuation.definition.symbol.begin.lisp + 2: punctuation.definition.symbol.end.lisp + pop: 1 + - include: comments + - include: else-pop + +###[ OTHER DECLARATIONS ]###################################################### + + other-declaration: + - match: '{{declaration_keywords}}' + scope: keyword.declaration.lisp + pop: 1 + +###[ DECLARE STATEMENTS ]###################################################### + + declare: + # https://www.lispworks.com/documentation/HyperSpec/Body/s_declar.htm + - match: (?i:declare){{break}} + scope: keyword.declaration.declare.lisp + set: declare-specifier-list + + declare-specifier-list: + - match: \( + scope: punctuation.section.parens.begin.lisp + push: + - paren-body + - declare-identifier + - include: comments + - include: else-pop + + declare-identifier: + - match: '{{declaration_identifiers}}' + scope: storage.modifier.lisp + pop: 1 + - include: comments + - include: else-pop + +###[ CONTROL FLOW STATEMENTS ]################################################# control: - - match: \b(?i:with|while|when|unless|typecase|to|thereis|then|return-from name|return|repeat|prog*|prog|never|named|maplist|mapl|mapcon|mapcar|mapcan|mapc|loop|let|initially|if|from|for|finally|etypecase|else|dotimes|dolist|doing|do*|do|ctypecase|cond|case|block|as|always)\b + # Conditional + - match: (?i:if|case|cond|otherwise|unless|when|[ce]?typecase){{break}} + scope: keyword.control.conditional.lisp + pop: 1 + # Flow + - match: (?i:return(?:-from)?){{break}} + scope: keyword.control.flow.return.lisp + pop: 1 + # Loop + # https://www.lispworks.com/documentation/lw70/CLHS/Body/m_dolist.htm + # https://www.lispworks.com/documentation/lw70/CLHS/Body/m_dotime.htm + - match: (?i:dolist|dotimes){{break}} + scope: keyword.control.loop.lisp + set: expect-list + # https://www.lispworks.com/documentation/lw70/CLHS/Body/m_do_do.htm + - match: (?i:do\*?|do-(?:all-|external-)?symbols|iterate){{break}} + scope: keyword.control.loop.lisp + set: expect-lists-list + # Other + - match: (?xi:block|map(?:can|car|con|c|list|l)){{break}} scope: keyword.control.lisp + pop: 1 + +###[ LOOP STATEMENTS ]######################################################### + + loop: + # https://www.lispworks.com/documentation/lw70/CLHS/Body/06_a.htm + # https://www.lispworks.com/documentation/lw70/CLHS/Body/m_loop.htm + - match: (?i:loop){{break}} + scope: keyword.control.loop.lisp + set: loop-body + + loop-body: + - meta_scope: meta.loop.lisp + - include: paren-pop + + # declaration keywords + - match: (?i:named){{break}} + scope: keyword.declaration.name.lisp + push: loop-name + - match: (?i:with){{break}} + scope: keyword.declaration.variable.lisp + + # loop termination test keywords + - match: (?i:always|as|do|doing|for|never|repeat|thereis|until|while){{break}} + scope: keyword.control.loop.lisp + # conditional keywords + - match: (?i:end|else|if|then|unless|when){{break}} + scope: keyword.control.conditional.lisp + # control flow keywords + - match: (?i:finally|initially){{break}} + scope: keyword.control.flow.lisp + - match: (?i:return(?:-from)?){{break}} + scope: keyword.control.flow.return.lisp - functions: - - match: \b(?i:(defun|defmethod|defmacro))\b\s+([\w\-!?<>]*) - scope: meta.function.lisp + # operator keywords + - match: ={{break}} # can be both, assignment and comparison + scope: keyword.operator.lisp + - match: (?i:into){{break}} + scope: keyword.operator.assignment.lisp + - match: (?i:and){{break}} + scope: keyword.operator.logical.lisp + - match: |- + (?xi: across | above | being | below | by | each | in | of | on | the + | (?:down|up)?to | (?:up)?from | using ){{break}} + scope: keyword.other.loop.lisp + + # expressions + - include: comments + - include: parens + - include: numbers + - include: strings + - include: annotations + - include: keywords + - include: quotes + - include: macros + - include: modifiers + - match: (?={{identifier}}) + push: loop-identifier + + loop-identifier: + - include: builtin-function + - include: identifier + + loop-name: + - match: '{{identifier}}' + scope: entity.name.loop.lisp + captures: + 1: punctuation.definition.symbol.begin.lisp + 2: punctuation.definition.symbol.end.lisp + pop: 1 + - include: comments + - include: else-pop + +###[ QUOTE STATEMENTS ]######################################################## + + quote: + - match: (?i:quote){{break}} + scope: meta.function-call.lisp support.function.lisp + set: quote-args + + quote-args: + - include: paren-pop + - include: quoted-parens + - include: expressions + +###[ FUNCTIONS ]############################################################### + + builtin-function: + - match: '{{builtin_functions}}' + scope: meta.function-call.lisp support.function.lisp + pop: 1 + + other-function: + # functions starting with `make-` are most likely used as constructors + - match: make-{{identifier}} + scope: meta.function-call.lisp variable.function.constructor.lisp + captures: + 1: punctuation.definition.symbol.begin.lisp + 2: punctuation.definition.symbol.end.lisp + pop: 1 + # mutating functions changing data in-place end with ! + - match: (?![+*#`'&]\S){{identifier}}\!{{break}} + scope: meta.function-call.lisp variable.function.mutating.lisp + captures: + 1: punctuation.definition.symbol.begin.lisp + 2: punctuation.definition.symbol.end.lisp + pop: 1 + # predicate functions returning boolean values end with ? or -p + - match: (?![+*#`'&]\S){{identifier}}(?:\?|-p){{break}} + scope: meta.function-call.lisp variable.function.predicate.lisp + captures: + 1: punctuation.definition.symbol.begin.lisp + 2: punctuation.definition.symbol.end.lisp + pop: 1 + # anything not looking like global variable, constant or macro + - match: (?![+*#`'&]\S|{{builtin_constants}}|{{builtin_types}}){{identifier}} + scope: meta.function-call.lisp variable.function.lisp + captures: + 1: punctuation.definition.symbol.begin.lisp + 2: punctuation.definition.symbol.end.lisp + pop: 1 + +###[ MACROS ]################################################################## + + macros: + # https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node191.html + - include: macro-arrays + - include: macro-characters + - include: macro-conditionals + - include: macro-functions + - include: macro-numbers + - include: macro-pathnames + - include: macro-structures + - include: macro-throw-exceptions + - include: macro-variables + - include: macro-vectors + + macro-conditionals: + # Feature-flags + - match: (#[-+])({{identifier}})? + captures: + 1: keyword.control.conditional.lisp + 2: constant.other.feature.lisp + 3: punctuation.definition.symbol.begin.lisp + 4: punctuation.definition.symbol.end.lisp + + macro-arrays: + # https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node29.html + - match: (#\d*[aA])(\() + captures: + 1: punctuation.definition.array.lisp + 2: meta.parens.lisp punctuation.section.parens.begin.lisp + push: macro-array-body + - match: (#\d*[aA])({{identifier}}) + captures: + 1: punctuation.definition.array.lisp + 2: variable.other.lisp + 3: punctuation.definition.symbol.begin.lisp + 4: punctuation.definition.symbol.end.lisp + + macro-array-body: + - meta_scope: meta.array.lisp + - meta_content_scope: meta.parens.lisp + - match: \) + scope: meta.parens.lisp punctuation.section.parens.end.lisp + pop: 1 + - include: parens + - include: expressions + + macro-characters: + # Standard Characters + # https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node22.html + # Non-Standard Characters + # https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node24.html + # Character Attributes + # https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node25.html + - match: (#(\d*)\\){{char_attributes}}?(?i:Space|NewLine){{break}} + scope: constant.character.standard.lisp + captures: + 1: punctuation.definition.constant.lisp + 2: storage.modifier.attributes.lisp + - match: (#(\d*)\\){{char_attributes}}?(?i:Backspace|Tab|Linefeed|Page|Return|RubOut){{break}} + scope: constant.character.semi-standard.lisp + captures: + 1: punctuation.definition.constant.lisp + 2: storage.modifier.attributes.lisp + - match: (#(\d*)\\){{char_attributes}}?{{standard_char}}{{break}} + scope: constant.character.standard.lisp captures: - 1: storage.type.function-type.lisp - 2: entity.name.function.lisp - - match: \b(?i:zerop|yes-or-no-p|y-or-n-p|write-to-string|write-string|write-char|write-byte|write|with-standard-io-syntax|with-slots|with-simple-restart|with-package-iterator|with-output-to-string|with-open-stream|with-open-file|with-input-from-string|with-hash-table-iterator|with-condition-restarts|with-compilation-unit|with-accessors|wild-pathname-p|warn|vectorp|vector-push-extend|vector-push|vector-pop|vector|variable-information|values-list|values|user-homedir-pathname|use-value|use-package|upper-case-p|upgraded-complex-part-type|upgraded-array-element-type|update-instance-for-redefined-class|update-instance-for-different-class|unuse-package|untrace|until-if|until|unread-char|union|unintern|unexport|typep|type-of|type-error-expected-type|type-error-datum|two-way-stream-output-stream|two-way-stream-input-stream|truncate|truename|tree-equal|translate-pathname|translate-logical-pathname|trace|to-alter|time|third|terpri|terminate-producing|tenth|tanh|tan|tailp|synonym-stream-symbol|symbolp|symbol-value|symbol-plist|symbol-package|symbol-name|symbol-function|sxhash|svref|summing|sum|subtypep|substitute-if-not|substitute-if|substitute|subst-if-not|subst-if|subst|subsetp|subseries|subseq|sublis|stringp|string>=|string>|string=|string<=|string<|string/=|string-upcase|string-trim|string-right-trim|string-not-lessp|string-not-greaterp|string-not-equal|string-lessp|string-left-trim|string-greaterp|string-equal|string-downcase|string-char-p|string-capitalize|string|streamp|stream-external-format|stream-error-stream|stream-element-type|store-value|step|standard-char-p|stable-sort|sqrt|split-if|split|special-form-p|sort|some|software-version|software-type|slot-value|slot-unbound|slot-missing|slot-makunbound|slot-exists-p|slot-boundp|sleep|sixth|sinh|sin|simple-vector-p|simple-string-p|simple-condition-format-string|simple-condition-format-arguments|simple-bit-vector-p|signum|signal|short-site-name|shiftf|shared-initialize|shadowing-import|shadow|seventh|setq|setf|set-syntax-from-char|set-pprint-dispatch|set-macro-character|set-exclusive-or|set-dispatch-macro-character|set-difference|set-char-bit|set|series|second|search|schar|scan-symbols|scan-sublists|scan-range|scan-plist|scan-multiple|scan-lists-of-lists-fringe|scan-lists-of-lists|scan-hash|scan-fn-inclusive|scan-fn|scan-file|scan-alist|scan|scale-float|sbit|rplacd|rplaca|row-major-aref|round|rotatef|room|reverse|revappend|result-of|restart-name|restart-case|restart-bind|rest|require|replace|rename-package|rename-file|remprop|remove-method|remove-duplicates|remove|remhash|remf|reinitialize-instance|reduce|realpart|realp|readtablep|readtable-case|read-preserving-whitespace|read-line|read-from-string|read-delimited-list|read-char-no-hang|read-char|read-byte|read|rationalp|rationalize|rational|rassoc-if-not|rassoc-if|rassoc|random-state-p|random|quote|pushnew|push|psetq|psetf|provide|progn|prog2|prog1|producing|proclaim|probe-file|print-unreadable-object|print-object|print|prin1|previous|pprint-tabular|pprint-tab|pprint-pop|pprint-newline|pprint-logical-block|pprint-linear|pprint-indent|pprint-fill|pprint-exit-if-list-exhausted|pprint-dispatch|positions|position-if-not|position-if|position|pop|plusp|phase|peek-char|pathnamep|pathname-version|pathname-type|pathname-name|pathname-match-p|pathname-host|pathname-directory|pathname-device|pathname|parse-namestring|parse-macro|parse-integer|pairlis|packagep|package-used-by-list|package-use-list|package-shadowing-symbols|package-nicknames|package-name|package-error-package|output-stream-p|open-stream-p|open|oddp|nunion|numerator|numberp|nthcdr|nth-value|nth|nsubstitute-if-not|nsubstitute-if|nsubstitute|nsubst-if-not|nsubst-if|nsubst|nsublis|nstring-upcase|nstring-downcase|nstring-capitalize|nset-exclusive-or|nset-difference|nreverse|nreconc|notevery|notany|no-next-method|no-applicable-method|ninth|nintersection|next-out|next-method-p|next-in|nconcing|nconc|nbutlast|namestring|name-char|multiple-value-setq|multiple-value-list|multiple-value-bind|muffle-warning|mismatch|minusp|minimizing|minimize|mingle|method-qualifiers|method-combination-error|merge-pathnames|merge|memberp|member-if-not|member-if|member|maximizing|maximize|mask-field|mask|mapping|maphash|map-into|map-fn|map|makunbound|make-two-way-stream|make-synonym-stream|make-symbol|make-string-output-stream|make-string-input-stream|make-string|make-sequence|make-random-state|make-pathname|make-package|make-load-form-saving-slots|make-load-form|make-list|make-instances-obsolete|make-instance|make-hash-table|make-echo-stream|make-dispatch-macro-character|make-condition|make-concatenated-stream|make-char|make-broadcast-stream|make-array|macroexpand-1|macroexpand|macro-function|machine-version|machine-type|machine-instance|lower-case-p|loop-finish|long-site-name|logtest|logorc2|logorc1|lognot|lognand|logical-pathname-translations|logical-pathname|logcount|logbitp|logandc2|logandc1|log|locally|load-logical-pathname-translations|load|listp|listen|list-length|list-all-packages|list*|list|lisp-implementation-version|lisp-implementation-type|length|ldiff|ldb-test|ldb|lcm|latch|last|lambda|keywordp|iterate|isqrt|invoke-restart|invoke-debugger|invalid-method-error|intersection|intern|interactive-stream-p|integerp|integer-length|integer-decode-float|int-char|inspect|input-stream-p|initialize-instance|in-package|import|imagpart|ignore-errors|identity|host-namestring|hash-table-test|hash-table-size|hash-table-rehash-threshold|hash-table-rehash-size|hash-table-p|hash-table-count|handler-case|handler-bind|graphic-char-p|gethash|getf|get-universal-time|get-setf-method-multiple-value|get-setf-method|get-properties|get-output-stream-string|get-internal-run-time|get-internal-real-time|get-decoded-time|get|gentemp|gensym|generic-function|generator|gcd|gathering|gatherer|functionp|function-lambda-expression|function-keywords|function-information|funcall|fourth|formatter|format|floor|floatp|float-sign|float-radix|float-precision|float-digits|float|first|finish-output|find-symbol|find-restart|find-package|find-method|find-if-not|find-if|find-class|find-all-symbols|find|fill-pointer|fill|file-write-date|file-string-length|file-position|file-namestring|file-length|file-error-pathname|file-author|fifth|ffloor|fdefinition|fboundp|f|expt|export|expand|exp|every|evenp|evalhook|eval|error|ensure-generic-function|enough-namestring|endp|encode-universal-time|enclose|encapsulated|elt|eighth|ed|echo-stream-output-stream|echo-stream-input-stream|ecase|dribble|dpb|documentation|do-symbols|do-external-symbols|do-all-symbols|disassemble|directory-namestring|directory|digit-char-p|digit-char|destructuring-bind|describe-object|describe|deposit-field|denominator|delete-package|delete-if-not|delete-if|delete-file|delete-duplicates|delete|defvar|deftype|defstruct|defpackage|define-setf-method|define-modify-macro|define-method-combination|define-declaration|define-condition|define-compiler-macro|defgeneric|defclass|decode-universal-time|decode-float|declaration-information|declaim|counting|count-if-not|count-if|count|cotruncate|cosh|cos|copy-tree|copy-symbol|copy-seq|copy-readtable|copy-pprint-dispatch|copy-list|copy-alist|continue|constantp|consp|cons|conjugate|concatenated-stream-streams|concatenate|compute-restarts|compute-applicable-methods|complexp|complex|complement|compiler-macroexpand-1|compiler-macroexpand|compiler-macro-function|compiler-let|compiled-function-p|compile-file-pathname|compile-file|compile|commonp|collecting-fn|collecting|collect-sum|collect-plist|collect-or|collect-nth|collect-nconc|collect-min|collect-max|collect-length|collect-last|collect-hash|collect-fn|collect-first|collect-file|collect-append|collect-and|collect-alist|collect|coerce|code-char|clrhash|close|clear-input|class-of|class-name|cis|chunk|choose-if|choose|check-type|characterp|character|char>=|char>|char=|char<=|char<|char/=|char-upcase|char-not-lessp|char-not-greaterp|char-not-equal|char-name|char-lessp|char-int|char-greaterp|char-font|char-equal|char-downcase|char-code|char-bits|char-bit|char|change-class|cerror|cell-error-name|ceiling|cdr|cddr|cdddr|cddddr|cdddar|cddar|cddadr|cddaar|cdar|cdadr|cdaddr|cdadar|cdaar|cdaadr|cdaaar|ccase|catenate|car|call-next-method|call-method|cadr|caddr|cadddr|caddar|cadar|cadadr|cadaar|caar|caadr|caaddr|caadar|caaar|caaadr|caaaar|byte-size|byte-position|byte|butlast|broadcast-stream-streams|break|boundp|both-case-p|boole|bit-xor|bit-vector-p|bit-orc2|bit-orc1|bit-not|bit-nor|bit-nand|bit-ior|bit-eqv|bit-andc2|bit-andc1|bit-and|bit|augment-environment|atom|atanh|atan|assoc-if-not|assoc-if|assoc|assert|asinh|asin|ash|arrayp|array-total-size|array-row-major-index|array-rank|array-in-bounds-p|array-has-fill-pointer-p|array-element-type|array-dimensions|array-dimension|arithmetic-error-operation|arithmetic-error-operands|aref|apropos-list|apropos|applyhook|apply|appending|append|alter|alphanumericp|alpha-char-p|adjustable-array-p|adjust-array|adjoin|add-method|acosh|acos|acons|abs|abort)\b - scope: support.function.lisp + 1: punctuation.definition.constant.lisp + 2: storage.modifier.attributes.lisp + - match: (#(\d*)\\){{char_attributes}}?{{identifier_char}}+{{break}} + scope: constant.character.non-standard.lisp + captures: + 1: punctuation.definition.constant.lisp + 2: storage.modifier.attributes.lisp + + macro-functions: + # Function reference + - match: \#[Mm'] + scope: punctuation.definition.function.lisp + push: macro-function-name + + macro-function-name: + - include: namespaces + - include: operator + - include: builtin-function + - include: other-function + - include: immediately-pop + + macro-numbers: + # binary rational numbers + - match: |- + (?xi) + ( \#(?: b | 2r ) ) + ( [-+]? ) + ( [01]+ (/) [01]+ ) + {{break}} + scope: meta.number.rational.binary.lisp + captures: + 1: constant.numeric.base.lisp + 2: keyword.operator.arithmetic.lisp + 3: constant.numeric.value.lisp + 4: keyword.operator.arithmetic.lisp + # binary integer numbers + - match: |- + (?xi) + ( \#(?: b | 2r ) ) + ( [-+]? ) + ( [01]+ (?: (\.)(?![01]) | {{break}} ) ) + scope: meta.number.integer.binary.lisp + captures: + 1: constant.numeric.base.lisp + 2: keyword.operator.arithmetic.lisp + 3: constant.numeric.value.lisp + 4: punctuation.separator.decimal.lisp + # octal rational numbers + - match: |- + (?xi) + ( \#(?: o | 8r ) ) + ( [-+]? ) + ( [0-7]+ (/) [0-7]+ ) + {{break}} + scope: meta.number.rational.octal.lisp + captures: + 1: constant.numeric.base.lisp + 2: keyword.operator.arithmetic.lisp + 3: constant.numeric.value.lisp + 4: keyword.operator.arithmetic.lisp + # octal integer numbers + - match: |- + (?xi) + ( \#(?: o | 8r ) ) + ( [-+]? ) + ( [0-7]+ (?: (\.)(?![0-7]) | {{break}} ) ) + scope: meta.number.integer.octal.lisp + captures: + 1: constant.numeric.base.lisp + 2: keyword.operator.arithmetic.lisp + 3: constant.numeric.value.lisp + 4: punctuation.separator.decimal.lisp + # hexadecimal rational numbers + - match: |- + (?xi) + ( \#(?: x | 16r ) ) + ( [-+]? ) + ( \h+ (/) \h+ ) + {{break}} + scope: meta.number.rational.hexadecimal.lisp + captures: + 1: constant.numeric.base.lisp + 2: keyword.operator.arithmetic.lisp + 3: constant.numeric.value.lisp + 4: keyword.operator.arithmetic.lisp + # hexadecimal integer numbers + - match: |- + (?xi) + ( \#(?: x | 16r ) ) + ( [-+]? ) + ( \h+ (?: (\.)(?!\h) | {{break}} ) ) + scope: meta.number.integer.hexadecimal.lisp + captures: + 1: constant.numeric.base.lisp + 2: keyword.operator.arithmetic.lisp + 3: constant.numeric.value.lisp + 4: punctuation.separator.decimal.lisp + # radix rational numbers + - match: |- + (?xi) + ( \#\d+r ) + ( [-+]? ) + ( [[:alnum:]]+ (/) [[:alnum:]]+ ) + {{break}} + scope: meta.number.rational.other.lisp + captures: + 1: constant.numeric.base.lisp + 2: keyword.operator.arithmetic.lisp + 3: constant.numeric.value.lisp + 4: keyword.operator.arithmetic.lisp + # radix integer numbers + - match: |- + (?xi) + ( \#\d+r ) + ( [-+]? ) + ( [[:alnum:]]+ (?: (\.)(?![[:alnum:]]) | {{break}} ) ) + scope: meta.number.integer.other.lisp + captures: + 1: constant.numeric.base.lisp + 2: keyword.operator.arithmetic.lisp + 3: constant.numeric.value.lisp + 4: punctuation.separator.decimal.lisp + # complex numbers + - match: (#[cC])(\() + captures: + 1: punctuation.definition.complex.lisp + 2: meta.parens.lisp punctuation.section.parens.begin.lisp + push: macro-numbers-complex-body + + macro-numbers-complex-body: + - meta_scope: meta.number.complex.lisp + - meta_content_scope: meta.parens.lisp + - match: \) + scope: meta.parens.lisp punctuation.section.parens.end.lisp + pop: 1 + - include: parens + - include: expressions - operators: - - match: '\/\=|\>\=|\<\=|\=|\>|\<|\b(?i:max|min|eq|neq|eql|equalp|equal)\b' + macro-pathnames: + - match: (#\d*[pP])(\") + captures: + 1: punctuation.definition.pathname.lisp + 2: string.quoted.double.lisp punctuation.definition.string.begin.lisp + push: macro-pathname-body + + macro-pathname-body: + - meta_scope: meta.path.lisp + - meta_content_scope: string.quoted.double.lisp + - match: \" + scope: string.quoted.double.lisp punctuation.definition.string.end.lisp + pop: 1 + - match: \\. + scope: constant.character.escape.lisp + + macro-structures: + # Structures + # https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node39.html + - match: (#\d*[sS])(\() + captures: + 1: punctuation.definition.struct.lisp + 2: meta.parens.lisp punctuation.section.parens.begin.lisp + push: + - macro-struct-body + - macro-struct-name + + macro-struct-name: + - match: '{{identifier}}' + scope: entity.name.struct.lisp + captures: + 1: punctuation.definition.symbol.begin.lisp + 2: punctuation.definition.symbol.end.lisp + pop: 1 + - include: else-pop + + macro-struct-body: + - meta_scope: meta.struct.lisp + - meta_content_scope: meta.parens.lisp + - match: \) + scope: meta.parens.lisp punctuation.section.parens.end.lisp + pop: 1 + - include: lists + - include: expressions + + macro-vectors: + # Vector + # https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node30.html + - match: (#\d*)(\() + captures: + 1: punctuation.definition.vector.lisp + 2: meta.parens.lisp punctuation.section.parens.begin.lisp + push: macro-vector-body + # Bit vector + # https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node32.html + - match: (#\d*\*)([01]*){{break}} + scope: meta.vector.lisp + captures: + 1: punctuation.definition.vector.lisp + 2: meta.number.integer.binary constant.numeric.value.lisp + + macro-vector-body: + - meta_scope: meta.vector.lisp + - meta_content_scope: meta.parens.lisp + - match: \) + scope: meta.parens.lisp punctuation.section.parens.end.lisp + pop: 1 + - include: parens + - include: expressions + + macro-throw-exceptions: + - match: '#[ \t\n\r)<]' + scope: keyword.control.exception.throw.lisp + + macro-variables: + # Inline runtime/loadtime eval + - match: \#[.,:] + scope: punctuation.definition.variable.lisp + # Local assignment + - match: ((#)\d+)\s*(=) + captures: + 1: variable.other.local.lisp + 2: punctuation.definition.variable.lisp + 3: keyword.operator.assignment.lisp + - match: (#)(\d+)(#) + scope: variable.other.lisp + captures: + 1: punctuation.definition.variable.begin.lisp + 2: variable.other.local.lisp + 3: punctuation.definition.variable.end.lisp + +###[ OPERATORS ]############################################################### + + modifiers: + # https://www.lispworks.com/documentation/lw70/CLHS/Body/02_df.htm + - match: '[`'']' + scope: punctuation.definition.quoted.lisp + - match: ',@?' + scope: punctuation.definition.variable.lisp + + operator: + # Contains 'Standardized Compound Type Specifier Names' + # https://www.lispworks.com/documentation/lw70/CLHS/Body/04_bc.htm + - match: (?:(?:/=|>=|<=|=|>|<)|(?i:max|min|eq|neq|eql|equalp|equal)){{break}} scope: keyword.operator.comparison.lisp - - match: '\+|\-|\*|\/|\b(?i:mod|rem|incf|decf)\b' + pop: 1 + - match: ={{break}} + scope: keyword.operator.assignment.lisp + pop: 1 + - match: (?:[-+*/]|(?i:mod|rem|incf|decf)){{break}} scope: keyword.operator.arithmetic.lisp - - match: \b(?i:and|or|not)\b + pop: 1 + - match: (?i:and|or|not|satisfies){{break}} scope: keyword.operator.logical.lisp - - match: \b(?i:logand|logior|logxor|lognor|logeqv)\b + pop: 1 + - match: (?i:logand|logior|logxor|lognor|logeqv){{break}} scope: keyword.operator.bitwise.lisp + pop: 1 - parens: - - match: '\(' - scope: punctuation.definition.group.begin.lisp - push: - - meta_scope: meta.group.lisp - - match: '\)' - scope: punctuation.definition.group.end.lisp - pop: true - - include: expressions - - include: parens - - match: '\)' - scope: invalid.illegal.stray-bracket-end.lisp - - constants: - - match: \b(?i:null|t|single-float-negative-epsilon|single-float-epsilon|short-float-negative-epsilon|short-float-epsilon|pi|nil|multiple-values-limit|most-positive-single-float|most-positive-short-float|most-positive-long-float|most-positive-fixnum|most-positive-double-float|most-negative-single-float|most-negative-short-float|most-negative-long-float|most-negative-fixnum|most-negative-double-float|long-float-negative-epsilon|long-float-epsilon|least-positive-single-float|least-positive-short-float|least-positive-normalized-single-float|least-positive-normalized-short-float|least-positive-normalized-long-float|least-positive-normalized-double-float|least-positive-long-float|least-positive-double-float|least-negative-single-float|least-negative-short-float|least-negative-normalized-single-float|least-negative-normalized-short-float|least-negative-normalized-long-float|least-negative-normalized-double-float|least-negative-long-float|least-negative-double-float|lambda-parameters-limit|lambda-list-keywords|internal-time-units-per-second|double-float-negative-epsilon|double-float-epsilon|char-super-bit|char-meta-bit|char-hyper-bit|char-font-limit|char-control-bit|char-code-limit|char-bits-limit|call-arguments-limit|array-total-size-limit|array-rank-limit|array-dimension-limit)\b - scope: constant.language.lisp - - match: '(#)(\w|[\\+-=<>''"&#])+' - scope: constant.character.lisp - captures: - 1: punctuation.definition.constant.lisp +###[ LITERALS ]################################################################ numbers: - - match: '\b((0(x|X)\h*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)(?i:l|ul|u|f|ll|ull)?\b' - scope: constant.numeric.lisp + # https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node16.html + # https://www.lispworks.com/documentation/lw70/CLHS/Body/02_ca.htm + # decimal floating point + - match: |- + (?x) + ( [-+]? ) + ( \d* (?: (\.) \d+ ) {{exponent}}? + | \d+ (?: (\.) \d* )? {{exponent}}) + {{break}} + scope: meta.number.float.decimal.lisp + captures: + 1: keyword.operator.arithmetic.lisp + 2: constant.numeric.value.lisp + 3: punctuation.separator.decimal.lisp + 4: punctuation.separator.decimal.lisp + # decimal rational numbers + - match: |- + (?x) + ( [-+]? ) + ( \d+ (/) \d+ ) + {{break}} + scope: meta.number.rational.decimal.lisp + captures: + 1: keyword.operator.arithmetic.lisp + 2: constant.numeric.value.lisp + 3: keyword.operator.arithmetic.lisp + # decimal integer numbers + - match: |- + (?x) + ( [-+]? ) + ( \d+ (?: (\.)(?!\d) | {{break}} ) ) + scope: meta.number.integer.decimal.lisp + captures: + 1: keyword.operator.arithmetic.lisp + 2: constant.numeric.value.lisp + 3: punctuation.separator.decimal.lisp strings: - - match: '"' + # https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node31.html + - match: \" scope: punctuation.definition.string.begin.lisp + push: string-body + + string-body: + - meta_include_prototype: false + - meta_scope: meta.string.lisp string.quoted.double.lisp + - match: \" + scope: punctuation.definition.string.end.lisp + pop: 1 + - match: \\. + scope: constant.character.escape.lisp + - include: string-format-mini-language + + string-format-mini-language: + # https://www.hexstreamsoft.com/articles/common-lisp-format-reference/clhs-summary/#subsections-summary-table + - match: (~)(\d*)[%&|~] + scope: constant.character.escape.lisp + captures: + 1: punctuation.definition.placeholder.lisp + # 2: constant.numeric.integer.decimal.lisp + - match: (~):?@?[CR] + scope: constant.other.placeholder.lisp + captures: + 1: punctuation.definition.placeholder.lisp + # ~R + - match: |- + (?x: + (~) + (?:(\d*) # Radix + (?:(,)\d* # mincol + (?:(,)(?:'.)? # padchar + (?:(,)(?:'.)? # comma-char + (?:(,)\d*)? # comma-interval + )?)?)?) + ):?@?[rR] + scope: constant.other.placeholder.lisp + captures: + 1: punctuation.definition.placeholder.lisp + 2: punctuation.definition.numeric.base.lisp + 3: punctuation.separator.sequence.lisp + 4: punctuation.separator.sequence.lisp + 5: punctuation.separator.sequence.lisp + 6: punctuation.separator.sequence.lisp + # ~b, ~o, ~d, ~x + - match: |- + (?x: + (~) + (?:\d* # mincol + (?:(,)(?:'.)? # padchar + (?:(,)(?:'.)? # comma-char + (?:(,)\d*)? # comma-interval + )?)?)? + ):?@?[bBoOdDxX] + scope: constant.other.placeholder.lisp + captures: + 1: punctuation.definition.placeholder.lisp + 2: punctuation.separator.sequence.lisp + 3: punctuation.separator.sequence.lisp + 4: punctuation.separator.sequence.lisp + # ~f + - match: |- + (?x: + (~) + (?:\d* # width + (?:(,)\d* # decimals + (?:(,)\d* # scale + (?:(,)(?:'.)? # overflowchar + (?:(,)(?:'.)? # padchar + )?)?)?)?)? + )@?[fF] + scope: constant.other.placeholder.lisp + captures: + 1: punctuation.definition.placeholder.lisp + 2: punctuation.separator.sequence.lisp + 3: punctuation.separator.sequence.lisp + 4: punctuation.separator.sequence.lisp + 5: punctuation.separator.sequence.lisp + # ~e, ~g + - match: |- + (?x: + (~) + (?:\d* # width + (?:(,)\d* # decimals + (?:(,)\d* # exponent-width + (?:(,)\d* # scale + (?:(,)(?:'.)? # overflowchar + (?:(,)(?:'.)? # padchar + (?:(,)(?:'.)? # exponentchar + )?)?)?)?)?)?)? + )@?[eEgG] + scope: constant.other.placeholder.lisp + captures: + 1: punctuation.definition.placeholder.lisp + 2: punctuation.separator.sequence.lisp + 3: punctuation.separator.sequence.lisp + 4: punctuation.separator.sequence.lisp + 5: punctuation.separator.sequence.lisp + 6: punctuation.separator.sequence.lisp + 7: punctuation.separator.sequence.lisp + # ~$ + - match: |- + (?x: + (~) + (?:\d* # decimals + (?:(,)\d* # min-units + (?:(,)\d* # min-width + (?:(,)(?:'.)? # padchar + )?)?)?)? + ):?@?\$ + scope: constant.other.placeholder.lisp + captures: + 1: punctuation.definition.placeholder.lisp + 2: punctuation.separator.sequence.lisp + 3: punctuation.separator.sequence.lisp + 4: punctuation.separator.sequence.lisp + # ~a, ~s + - match: |- + (?x: + (~) + (?:\d* # min-col + (?:(,)\d* # col-inc + (?:(,)\d* # min-pad + (?:(,)(?:'.)? # padchar + )?)?)?)? + ):?@?[aAsS] + scope: constant.other.placeholder.lisp + captures: + 1: punctuation.definition.placeholder.lisp + 2: punctuation.separator.sequence.lisp + 3: punctuation.separator.sequence.lisp + 4: punctuation.separator.sequence.lisp + +###[ SYMBOLS ]################################################################# + + annotations: + - match: (&){{identifier}} + scope: variable.annotation.lisp + captures: + 1: punctuation.definition.annotation.lisp + 2: punctuation.definition.symbol.begin.lisp + 3: punctuation.definition.symbol.end.lisp + + keywords: + # The colon : is a package marker. + # If the package name is missing, the symbol is in the KEYWORD package. + - match: (::?)({{identifier}}) + captures: + 1: punctuation.accessor.lisp + 2: keyword.other.symbol.lisp + 3: punctuation.definition.symbol.begin.lisp + 4: punctuation.definition.symbol.end.lisp + - match: \.{{break}} + scope: keyword.control.lisp + + identifiers: + # https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node27.html + # Pushing a dedicated context reduces syntax cache size + # and increases parsing performance, significantly. + - match: (?={{identifier}}) + push: identifier + + identifier: + - include: namespaces + # types + - match: '{{builtin_types}}' + scope: storage.type.lisp + pop: 1 + # constants + - match: (?i:true|false){{break}} + scope: constant.language.boolean.lisp + pop: 1 + - match: (?i:nil|null){{break}} + scope: constant.language.null.lisp + pop: 1 + - match: '{{builtin_constants}}' + scope: constant.language.lisp + pop: 1 + - match: \+\S+\+{{break}} + scope: constant.other.lisp + pop: 1 + # variables + - match: '{{builtin_variables}}' + scope: variable.language.lisp + pop: 1 + - match: '{{identifier}}' + scope: variable.other.lisp + captures: + 1: punctuation.definition.symbol.begin.lisp + 2: punctuation.definition.symbol.end.lisp + pop: 1 + - include: immediately-pop + + parameters: + # parameter with initial value + - match: \( + scope: punctuation.section.parens.begin.lisp push: - - meta_scope: string.quoted.double.lisp - - match: '"' - scope: punctuation.definition.string.end.lisp - pop: true - - match: \\. - scope: constant.character.escape.lisp - - block-comment: - - match: '#\|' - scope: punctuation.definition.comment.begin.lisp - push: - - meta_scope: comment.block.lisp - - include: block-comment - - match: '\|#' - scope: punctuation.definition.comment.end.lisp - pop: true + - paren-body + - parameter-name + # parameter without initial value + - match: '{{identifier}}' + scope: variable.parameter.lisp + captures: + 1: punctuation.definition.symbol.begin.lisp + 2: punctuation.definition.symbol.end.lisp - comments: - - include: block-comment - - match: '\|#' - scope: invalid.illegal.stray-comment-end.lisp - - match: (;).*$\n? - scope: comment.line.semicolon.lisp + parameter-name: + - include: annotations + - include: keywords + - include: modifiers + - match: '{{identifier}}' + scope: variable.parameter.lisp + captures: + 1: punctuation.definition.symbol.begin.lisp + 2: punctuation.definition.symbol.end.lisp + pop: 1 + - include: comments + - include: else-pop + + namespaces: + # built-in namespace indicating keyword symbols + # note: accessor is consumed by `keywords` context + - match: (\|?)keyword(\|?)(?=:) + scope: variable.namespace.lisp + captures: + 1: punctuation.definition.symbol.begin.lisp + 2: punctuation.definition.symbol.end.lisp + # normal namespaces but not an escaped char #\: + - match: ((?!#\\?){{identifier}})(::?) + captures: + 1: variable.namespace.lisp + 2: punctuation.definition.symbol.begin.lisp + 3: punctuation.definition.symbol.end.lisp + 4: punctuation.accessor.lisp + + variables: + # Symbols evaluate to their values + # https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node27.html + - match: '{{identifier}}' + scope: variable.other.lisp captures: - 1: punctuation.definition.comment.lisp + 1: punctuation.definition.symbol.begin.lisp + 2: punctuation.definition.symbol.end.lisp + +###[ PROTOTYPES ]############################################################## + + else-pop: + - match: (?=\S) + pop: 1 + + immediately-pop: + - match: '' + pop: 1 + + paren-pop: + - match: (?=\)) + pop: 1 + +############################################################################### + +variables: + + # variables / keyword-symbols + identifier: (?:{{identifier_char}}*{{identifier_must_have}}{{identifier_char}}*|{{quoted_identifier}}) + identifier_char: (?:\\.|[^{{break_char}}]) + identifier_must_have: (?:\\.|[^\d.{{break_char}}]) # May not be only digits or periods + quoted_identifier: (\|)(?:\\.|[^|])*(\|) + + break: (?={{break_char}}|$) + break_char: '[\s()"'',:;|]' + + # caracters + standard_char: '[0-9A-Za-z!"#$%&''()*+,\-./:;<=>?@\\\[\]^_`{|}~]' + char_attributes: (?:(?:[[:alnum:]_]+-)+\\?) + + # numbers + exponent: (?:[esfdlESFDL][-+]?\d+) + + declaration_keywords: |- + (?xi: + declaim + | define-(?: compiler-macro | condition | declaration | method-combination | modify-macro | setf-method ) + | def(?: class | constant | generic | macro | method | package | parameter | setf | struct | type | un | var ) + | generic-(?: flet | function | labels ) + | flet + | labels + | let\*? + | locally + | macrolet + | multiple-value-bind + | proclaim + | prog\*? + | with-(?: accessors | added-methods | condition-restarts | input-from-string | open-file | open-stream | output-to-string | standard-io-syntax ) + ){{break}} + + declaration_identifiers: |- + (?xi: + dynamic-extent + | ftype + | ignorable + | ignore + | inline + | notinline + | optimize + | special + | type + ){{break}} + + builtin_constants: |- + (?xi: + t | true | false | null | nil | pi + | array-(?: rank | dimension | total-size )-limit + | call-arguments-limit + | char-(?: (?: super | hyper | meta | control )-bit | (?: font | code | bits )-limit ) + | internal-time-units-per-second + | lambda-(?: parameters-limit | list-keywords ) + | least-(?: positive | negative )-normalized-(?: single | short | long | double )-float + | most-(?: positive | negative )-fixnum + | (?: most | least )-(?: positive | negative )-(?: single | short | long | double )-float + | multiple-values-limit + | (?: single | short | long | double )-float-(?: negative- )?epsilon + ){{break}} + + builtin_functions: |- + (?xi: + abort + | abs + | acons + | acos + | acosh + | add-method + | adjoin + | adjust-array + | adjustable-array-p + | alpha-char-p + | alphanumericp + | alter + | append + | appending + | apply + | applyhook + | apropos + | apropos-list + | aref + | arithmetic-error-operands + | arithmetic-error-operation + | array-dimension + | array-dimensions + | array-element-type + | array-has-fill-pointer-p + | array-in-bounds-p + | array-rank + | array-row-major-index + | array-total-size + | arrayp + | ash + | asin + | asinh + | assert + | assoc + | assoc-if + | assoc-if-not + | atan + | atanh + | atom + | augment-environment + | bit + | bit-and + | bit-andc1 + | bit-andc2 + | bit-eqv + | bit-ior + | bit-nand + | bit-nor + | bit-not + | bit-orc1 + | bit-orc2 + | bit-vector-p + | bit-xor + | boole + | both-case-p + | boundp + | break + | broadcast-stream-streams + | butlast + | byte + | byte-position + | byte-size + | caaaar + | caaadr + | caaar + | caadar + | caaddr + | caadr + | caar + | cadaar + | cadadr + | cadar + | caddar + | cadddr + | caddr + | cadr + | call-method + | call-next-method + | car + | catenate + | ccase + | cdaaar + | cdaadr + | cdaar + | cdadar + | cdaddr + | cdadr + | cdar + | cddaar + | cddadr + | cddar + | cdddar + | cddddr + | cdddr + | cddr + | cdr + | ceiling + | cell-error-name + | cerror + | change-class + | char + | char-bit + | char-bits + | char-code + | char-downcase + | char-equal + | char-font + | char-greaterp + | char-int + | char-lessp + | char-name + | char-not-equal + | char-not-greaterp + | char-not-lessp + | char-upcase + | char/= + | char< + | char<= + | char= + | char> + | char>= + | character + | characterp + | check-type + | choose + | choose-if + | chunk + | cis + | class-name + | class-of + | clear-input + | close + | clrhash + | code-char + | coerce + | collect + | collect-alist + | collect-and + | collect-append + | collect-file + | collect-first + | collect-fn + | collect-hash + | collect-last + | collect-length + | collect-max + | collect-min + | collect-nconc + | collect-nth + | collect-or + | collect-plist + | collect-sum + | collecting + | collecting-fn + | commonp + | compile + | compile-file + | compile-file-pathname + | compiled-function-p + | compiler-let + | compiler-macro-function + | compiler-macroexpand + | compiler-macroexpand-1 + | complement + | complex + | complexp + | compute-applicable-methods + | compute-restarts + | concatenate + | concatenated-stream-streams + | conjugate + | cons + | consp + | constantp + | continue + | copy-alist + | copy-list + | copy-pprint-dispatch + | copy-readtable + | copy-seq + | copy-symbol + | copy-tree + | cos + | cosh + | cotruncate + | count + | count-if + | count-if-not + | counting + | declaim + | declaration-information + | decode-float + | decode-universal-time + | delete + | delete-duplicates + | delete-file + | delete-if + | delete-if-not + | delete-package + | denominator + | deposit-field + | describe + | describe-object + | destructuring-bind + | digit-char + | digit-char-p + | directory + | directory-namestring + | disassemble + | do-all-keyword-symbols + | do-external-keyword-symbols + | do-keyword-symbols + | documentation + | dolist + | dpb + | dribble + | ecase + | echo-stream-input-stream + | echo-stream-output-stream + | ed + | eighth + | elt + | encapsulated + | enclose + | encode-universal-time + | endp + | enough-namestring + | ensure-generic-function + | error + | eval + | evalhook + | evenp + | every + | exp + | expand + | export + | expt + | f + | fboundp + | fdefinition + | ffloor + | fifth + | file-author + | file-error-pathname + | file-length + | file-namestring + | file-position + | file-string-length + | file-write-date + | fill + | fill-pointer + | find + | find-all-keyword-symbols + | find-class + | find-if + | find-if-not + | find-method + | find-package + | find-restart + | find-symbol + | finish-output + | first + | float + | float-digits + | float-precision + | float-radix + | float-sign + | floatp + | floor + | format + | formatter + | fourth + | funcall + | function-information + | function-keywords + | function-lambda-expression + | functionp + | gatherer + | gathering + | gcd + | generator + | generic-function + | gensym + | gentemp + | get + | get-decoded-time + | get-internal-real-time + | get-internal-run-time + | get-output-stream-string + | get-properties + | get-setf-method + | get-setf-method-multiple-value + | get-universal-time + | getf + | gethash + | graphic-char-p + | handler-bind + | handler-case + | hash-table-count + | hash-table-p + | hash-table-rehash-size + | hash-table-rehash-threshold + | hash-table-size + | hash-table-test + | host-namestring + | identity + | ignore-errors + | imagpart + | import + | in-package + | initialize-instance + | input-stream-p + | inspect + | int-char + | integer-decode-float + | integer-length + | integerp + | interactive-stream-p + | intern + | intersection + | invalid-method-error + | invoke-debugger + | invoke-restart + | isqrt + | iterate + | keywordp + | last + | latch + | lcm + | ldb + | ldb-test + | ldiff + | length + | lisp-implementation-type + | lisp-implementation-version + | list + | list-all-packages + | list-length + | list\* + | listen + | listp + | load + | load-logical-pathname-translations + | locally + | log + | logandc1 + | logandc2 + | logbitp + | logcount + | logical-pathname + | logical-pathname-translations + | lognand + | lognot + | logorc1 + | logorc2 + | logtest + | long-site-name + | loop-finish + | lower-case-p + | machine-instance + | machine-type + | machine-version + | macro-function + | macroexpand + | macroexpand-1 + | make-array + | make-broadcast-stream + | make-char + | make-concatenated-stream + | make-condition + | make-dispatch-macro-character + | make-echo-stream + | make-hash-table + | make-instance + | make-instances-obsolete + | make-list + | make-load-form + | make-load-form-saving-slots + | make-package + | make-pathname + | make-random-state + | make-sequence + | make-string + | make-string-input-stream + | make-string-output-stream + | make-symbol + | make-synonym-stream + | make-two-way-stream + | makunbound + | map + | map-fn + | map-into + | maphash + | mapping + | mask + | mask-field + | maximize + | maximizing + | member + | member-if + | member-if-not + | memberp + | merge + | merge-pathnames + | method-combination-error + | method-qualifiers + | mingle + | minimize + | minimizing + | minusp + | mismatch + | muffle-warning + | multiple-value-bind + | multiple-value-list + | multiple-value-setq + | name-char + | namestring + | nbutlast + | nconc + | nconcing + | next-in + | next-method-p + | next-out + | nintersection + | ninth + | no-applicable-method + | no-next-method + | notany + | notevery + | nreconc + | nreverse + | nset-difference + | nset-exclusive-or + | nstring-capitalize + | nstring-downcase + | nstring-upcase + | nsublis + | nsubst + | nsubst-if + | nsubst-if-not + | nsubstitute + | nsubstitute-if + | nsubstitute-if-not + | nth + | nth-value + | nthcdr + | numberp + | numerator + | nunion + | oddp + | open + | open-stream-p + | output-stream-p + | package-error-package + | package-name + | package-nicknames + | package-shadowing-keyword-symbols + | package-use-list + | package-used-by-list + | packagep + | pairlis + | parse-integer + | parse-macro + | parse-namestring + | pathname + | pathname-device + | pathname-directory + | pathname-host + | pathname-match-p + | pathname-name + | pathname-type + | pathname-version + | pathnamep + | peek-char + | phase + | plusp + | pop + | position + | position-if + | position-if-not + | positions + | pprint-dispatch + | pprint-exit-if-list-exhausted + | pprint-fill + | pprint-indent + | pprint-linear + | pprint-logical-block + | pprint-newline + | pprint-pop + | pprint-tab + | pprint-tabular + | previous + | prin1 + | print + | print-object + | print-unreadable-object + | probe-file + | producing + | prog1 + | prog2 + | progn + | provide + | psetf + | psetq + | push + | pushnew + | quote + | random + | random-state-p + | rassoc + | rassoc-if + | rassoc-if-not + | rational + | rationalize + | rationalp + | read + | read-byte + | read-char + | read-char-no-hang + | read-delimited-list + | read-from-string + | read-line + | read-preserving-whitespace + | readtable-case + | readtablep + | realp + | realpart + | reduce + | reinitialize-instance + | remf + | remhash + | remove + | remove-duplicates + | remove-method + | remprop + | rename-file + | rename-package + | replace + | require + | rest + | restart-bind + | restart-case + | restart-name + | result-of + | revappend + | reverse + | room + | rotatef + | round + | row-major-aref + | rplaca + | rplacd + | sbit + | scale-float + | scan + | scan-alist + | scan-file + | scan-fn + | scan-fn-inclusive + | scan-hash + | scan-lists-of-lists + | scan-lists-of-lists-fringe + | scan-multiple + | scan-plist + | scan-range + | scan-sublists + | scan-symbols + | schar + | search + | second + | series + | set + | set-char-bit + | set-difference + | set-dispatch-macro-character + | set-exclusive-or + | set-macro-character + | set-pprint-dispatch + | set-syntax-from-char + | setf + | setq + | seventh + | shadow + | shadowing-import + | shared-initialize + | shiftf + | short-site-name + | signal + | signum + | simple-bit-vector-p + | simple-condition-format-arguments + | simple-condition-format-string + | simple-string-p + | simple-vector-p + | sin + | sinh + | sixth + | sleep + | slot-boundp + | slot-exists-p + | slot-makunbound + | slot-missing + | slot-unbound + | slot-value + | software-type + | software-version + | some + | sort + | special-form-p + | split + | split-if + | sqrt + | stable-sort + | standard-char-p + | step + | store-value + | stream-element-type + | stream-error-stream + | stream-external-format + | streamp + | string + | string-capitalize + | string-downcase + | string-equal + | string-greaterp + | string-left-trim + | string-lessp + | string-not-equal + | string-not-greaterp + | string-not-lessp + | string-right-trim + | string-trim + | string-upcase + | string/= + | string< + | string<= + | string= + | string> + | string>= + | stringp + | sublis + | subseq + | subseries + | subsetp + | subst + | subst-if + | subst-if-not + | substitute + | substitute-if + | substitute-if-not + | subtypep + | sum + | summing + | svref + | sxhash + | symbol-function + | symbol-name + | symbol-package + | symbol-plist + | symbol-value + | symbolp + | synonym-stream-symbol + | tailp + | tan + | tanh + | tenth + | terminate-producing + | terpri + | third + | time + | to-alter + | trace + | translate-logical-pathname + | translate-pathname + | tree-equal + | truename + | truncate + | two-way-stream-input-stream + | two-way-stream-output-stream + | type-error-datum + | type-error-expected-type + | type-of + | typep + | unexport + | unintern + | union + | unread-char + | untrace + | unuse-package + | update-instance-for-different-class + | update-instance-for-redefined-class + | upgraded-array-element-type + | upgraded-complex-part-type + | upper-case-p + | use-package + | use-value + | user-homedir-pathname + | values + | values-list + | variable-information + | vector + | vector-pop + | vector-push + | vector-push-extend + | vectorp + | warn + | wild-pathname-p + | with-compilation-unit + | with-hash-table-iterator + | with-package-iterator + | with-simple-restart + | with-standard-io-syntax + | write + | write-byte + | write-char + | write-string + | write-to-string + | y-or-n-p + | yes-or-no-p + | zerop + ){{break}} + + # Built-in atomic type specifiers + # https://www.lispworks.com/documentation/lw70/CLHS/Body/04_bc.htm + # Note: Some of them are scoped function when appearing as first list item. + builtin_types: |- + (?xi: + arithmetic-error + | array + | atom + | base-char + | base-string + | bignum + | bit + | bit-vector + | broadcast-stream + | built-in-class + | cell-error + | character + | class + | compiled-function + | complex + | concatenated-stream + | condition + | cons + | control-error + | division-by-zero + | double-float + | echo-stream + | end-of-file + | error + | extended-char + | file-error + | file-stream + | fixnum + | float + | floating-point-inexact + | floating-point-invalid-operation + | floating-point-overflow + | floating-point-underflow + | function + | generic-function + | hash-table + | integer + | keyword + | list + | logical-pathname + | long-float + | method + | method-combination + | number + | package + | package-error + | parse-error + | pathname + | print-not-readable + | program-error + | random-state + | ratio + | rational + | reader-error + | readtable + | real + | restart + | sequence + | serious-condition + | short-float + | signed-byte + | simple-array + | simple-base-string + | simple-bit-vector + | simple-condition + | simple-error + | simple-string + | simple-type-error + | simple-vector + | simple-warning + | single-float + | standard-char + | standard-class + | standard-generic-function + | standard-method + | standard-object + | storage-condition + | stream + | stream-error + | string + | string-stream + | structure-class + | structure-object + | style-warning + | symbol + | synonym-stream + | two-way-stream + | type-error + | unbound-slot + | unbound-variable + | undefined-function + | unsigned-byte + | vector + | warning + ){{break}} + + builtin_variables: |- + \*(?xi: + applyhook + | break-on-signals + | break-on-warnings + | compile-file-pathname + | compile-file-truename + | compile-print + | compile-verbose + | debug-io + | debugger-hook + | default-pathname-defaults + | error-output + | evalhook + | features + | gensym-counter + | load-pathname + | load-print + | load-truename + | load-verbose + | macroexpand-hook + | modules + | package + | print-array + | print-base + | print-case + | print-circle + | print-escape + | print-gensym + | print-length + | print-level + | print-lines + | print-miser-width + | print-pprint-dispatch + | print-pretty + | print-radix + | print-readably + | print-right-margin + | query-io + | random-state + | read-base + | read-default-float-format + | read-eval + | read-suppress + | readtable + | standard-input + | standard-output + | suppress-series-warnings + | terminal-io + | trace-output + )\*{{break}} bat-0.25.0/assets/patches/Makefile.sublime-syntax.patch000064400000000000000000000064531046102023000211400ustar 00000000000000diff --git syntaxes/01_Packages/Makefile/Makefile.sublime-syntax syntaxes/01_Packages/Makefile/Makefile.sublime-syntax index 3cc3a97e..0c7a3f24 100644 --- syntaxes/01_Packages/Makefile/Makefile.sublime-syntax +++ syntaxes/01_Packages/Makefile/Makefile.sublime-syntax @@ -44,64 +44,50 @@ variables: # variable substitutions anywhere. We try to remedy this by hacking in a # regex that matches up to four levels of nested parentheses, and ignores # whatever's inside the parentheses. - nps: '[^()]*' - open: '(?:\(' - close: '\))?' # ignore this invalid.illegal + nps_unnested: '[^()]*' + nps: '[^()]*(?=[()])' + open: '(?:{{nps}}\(' + close: '\){{nps_unnested}})?' # ignore this invalid.illegal just_eat: | # WARNING: INSANITY FOLLOWS! - (?x) # ignore whitespace in this regex - {{nps}} # level 0 + (?x)(?: # ignore whitespace in this regex {{open}} # start level 1 __ - {{nps}} # level 1 _______ /*_>-< {{open}} # start level 2 ___/ _____ \__/ / - {{nps}} # level 2 <____/ \____/ {{open}} # start level 3 is like snek... (by Valerie Haecky) - {{nps}} # level 3 {{open}} # start level 4 {{nps}} # level 4 {{close}} # end level 4 - {{nps}} # level 3 {{close}} # end level 3 - {{nps}} # level 2 {{open}} # start level 3 - {{nps}} # level 3 {{open}} # start level 4 {{nps}} # level 4 {{close}} # end level 4 - {{nps}} # level 3 {{close}} # end level 3 - {{nps}} # level 2 + {{nps}} {{close}} # end level 2 - {{nps}} # level 1 {{open}} # start level 2 - {{nps}} # level 2 {{open}} # start level 3 - {{nps}} # level 3 {{open}} # start level 4 {{nps}} # level 4 {{close}} # end level 4 - {{nps}} # level 3 + {{nps}} {{close}} # end level 3 - {{nps}} # level 2 {{open}} # start level 3 - {{nps}} # level 3 {{open}} # start level 4 {{nps}} # level 4 {{close}} # end level 4 - {{nps}} # level 3 + {{nps}} {{close}} # end level 3 - {{nps}} # level 2 {{open}} # start level 3 - {{nps}} # level 3 {{open}} # start level 4 {{nps}} # level 4 {{close}} # end level 4 - {{nps}} # level 3 + {{nps}} {{close}} # end level 3 - {{nps}} # level 2 + {{nps}} {{close}} # end level 2 - {{nps}} # level 1 + {{nps}} {{close}} # end level 1 - {{nps}} # level 0 + |{{nps_unnested}}) rule_lookahead: '{{just_eat}}{{ruleassign}}{{just_eat}}' var_lookahead_base: '{{just_eat}}({{varassign}}|{{shellassign}}){{just_eat}}' bat-0.25.0/assets/patches/Markdown.sublime-syntax.patch000064400000000000000000000201711046102023000211760ustar 00000000000000diff --git syntaxes/01_Packages/Markdown/Markdown.sublime-syntax syntaxes/01_Packages/Markdown/Markdown.sublime-syntax index 19dc685d..3a45ea05 100644 --- syntaxes/01_Packages/Markdown/Markdown.sublime-syntax +++ syntaxes/01_Packages/Markdown/Markdown.sublime-syntax @@ -24,7 +24,6 @@ variables: ) [ \t]*$ # followed by any number of tabs or spaces, followed by the end of the line ) - setext_escape: ^(?=\s{0,3}(?:---+|===+)\s*$) block_quote: (?:[ ]{,3}>(?:.|$)) # between 0 and 3 spaces, followed by a greater than sign, followed by any character or the end of the line atx_heading: (?:[#]{1,6}\s*) # between 1 and 6 hashes, followed by any amount of whitespace indented_code_block: (?:[ ]{4}|\t) # 4 spaces or a tab @@ -277,69 +276,40 @@ contexts: 8: markup.underline.link.markdown push: [link-ref-def, after-link-title, link-title] - match: '^(?=\S)(?![=-]{3,}\s*$)' - branch_point: heading2-branch - branch: - - not-heading2 - - heading2 - - not-paragraph: - - match: |- - (?x) # pop out of this context when one of the following conditions are met: - ^(?: - \s*$ # the line is blank (or only contains whitespace) - | (?= - {{block_quote}} # a block quote begins the line - | [ ]{,3}[*+-][ ] # an unordered list item begins the line - | [ ]{,3}1[.][ ] # an ordered list item with number "1" begins the line - | \# # an ATX heading begins the line - | [ ]{,3}<( # all types of HTML blocks except type 7 may interrupt a paragraph - {{html_tag_block_end_at_close_tag}} # 1 - | !-- # 2 - | \? # 3 - | ![A-Z] # 4 - | !\[CDATA\[ # 5 - | {{html_tag_block_end_at_blank_line}} # 6 + push: + - meta_scope: meta.paragraph.markdown + - match: |- + (?x) # pop out of this context when one of the following conditions are met: + ^(?: + \s*$ # the line is blank (or only contains whitespace) + | (?= + {{block_quote}} # a block quote begins the line + | [ ]{,3}[*+-][ ] # an unordered list item begins the line + | [ ]{,3}1[.][ ] # an ordered list item with number "1" begins the line + | \# # an ATX heading begins the line + | [ ]{,3}<( # all types of HTML blocks except type 7 may interrupt a paragraph + {{html_tag_block_end_at_close_tag}} # 1 + | !-- # 2 + | \? # 3 + | ![A-Z] # 4 + | !\[CDATA\[ # 5 + | {{html_tag_block_end_at_blank_line}} # 6 + ) ) ) - ) - pop: true - - not-heading2: - - include: not-paragraph - - match: (?=\S) - branch_point: heading1-branch - branch: - - paragraph - - heading1 - - match: '' - pop: true - - paragraph: - - meta_scope: meta.paragraph.markdown - - match: ^\s{0,3}===+\s*$ - fail: heading1-branch - - match: ^\s{0,3}---+\s*$ - fail: heading2-branch - - include: not-paragraph - - include: inline-bold-italic-linebreak - - include: scope:text.html.basic - - heading1: - - meta_scope: markup.heading.1.markdown - - include: inline-bold-italic-linebreak - - match: '^[ \t]{0,3}(={3,})(?=[ \t]*$)' - captures: - 1: markup.heading.1.setext.markdown punctuation.definition.heading.setext.markdown - pop: true - - heading2: - - meta_scope: markup.heading.2.markdown - - include: inline-bold-italic-linebreak - - match: '^[ \t]{0,3}(-{3,})(?=[ \t]*$)' - captures: - 1: markup.heading.2.setext.markdown punctuation.definition.heading.setext.markdown - pop: true - + pop: true + - include: inline-bold-italic-linebreak + - include: scope:text.html.basic + - match: '^(={3,})(?=[ \t]*$)' + scope: markup.heading.1.setext.markdown + captures: + 1: punctuation.definition.heading.setext.markdown + pop: true + - match: '^(-{3,})(?=[ \t]*$)' + scope: markup.heading.2.setext.markdown + captures: + 1: punctuation.definition.heading.setext.markdown + pop: true link-ref-def: - meta_scope: meta.link.reference.def.markdown - match: '' @@ -430,8 +400,6 @@ contexts: push: - meta_scope: markup.bold.markdown - meta_content_scope: markup.italic.markdown - - match: '{{setext_escape}}' - pop: true - match: |- (?x) [ \t]*\*{4,} # if there are more than 3 its not applicable to be bold or italic @@ -446,8 +414,6 @@ contexts: scope: punctuation.definition.bold.end.markdown set: - meta_content_scope: markup.italic.markdown - - match: '{{setext_escape}}' - pop: true - match: |- (?x) [ \t]*\*{3,} # if there are more than 3 its not applicable to be bold or italic @@ -463,8 +429,6 @@ contexts: scope: punctuation.definition.italic.end.markdown set: - meta_content_scope: markup.bold.markdown - - match: '{{setext_escape}}' - pop: true - match: |- (?x) [ \t]*\*{3,} # if there are more than 3 its not applicable to be bold or italic @@ -727,8 +691,6 @@ contexts: scope: punctuation.definition.italic.begin.markdown push: - meta_scope: markup.italic.markdown - - match: '{{setext_escape}}' - pop: true - match: |- (?x) [ \t]*\*{4,} # if there are more than 3 its not applicable to be bold or italic @@ -745,8 +707,6 @@ contexts: scope: punctuation.definition.italic.begin.markdown push: - meta_scope: markup.italic.markdown - - match: '{{setext_escape}}' - pop: true - match: |- (?x) [ \t]*_{4,} # if there are more than 3 its not applicable to be bold or italic @@ -773,8 +733,6 @@ contexts: - include: bold-italic-trailing bold-italic-trailing: - include: scope:text.html.basic - - match: '{{setext_escape}}' - pop: true - match: ^\s*$\n? scope: invalid.illegal.non-terminated.bold-italic.markdown pop: true @@ -1073,6 +1031,21 @@ contexts: escape: '{{code_fence_escape}}' escape_captures: 0: meta.code-fence.definition.end.python.markdown-gfm + 1: punctuation.definition.raw.code-fence.end.markdown + - match: |- + (?x) + {{fenced_code_block_start}} + ((?i:puppet)) + {{fenced_code_block_trailing_infostring_characters}} + captures: + 0: meta.code-fence.definition.begin.puppet.markdown-gfm + 2: punctuation.definition.raw.code-fence.begin.markdown + 5: constant.other.language-name.markdown + embed: scope:source.puppet + embed_scope: markup.raw.code-fence.puppet.markdown-gfm + escape: '{{code_fence_escape}}' + escape_captures: + 0: meta.code-fence.definition.end.puppet.markdown-gfm 1: punctuation.definition.raw.code-fence.end.markdown - match: |- (?x) @@ -1152,7 +1125,7 @@ contexts: - match: |- (?x) {{fenced_code_block_start}} - ((?i:rust)) + ((?i:rust|rs)) {{fenced_code_block_trailing_infostring_characters}} captures: 0: meta.code-fence.definition.begin.rust.markdown-gfm bat-0.25.0/assets/patches/MediaWiki.sublime-syntax.patch000064400000000000000000000007201046102023000212550ustar 00000000000000diff --git syntaxes/02_Extra/MediaWiki/MediawikiNG.sublime-syntax syntaxes/02_Extra/MediaWiki/MediawikiNG.sublime-syntax index f542c9e..8eaf020 100644 --- syntaxes/02_Extra/MediaWiki/MediawikiNG.sublime-syntax +++ syntaxes/02_Extra/MediaWiki/MediawikiNG.sublime-syntax @@ -1,7 +1,7 @@ %YAML 1.2 --- # http://www.sublimetext.com/docs/3/syntax.html -name: Mediawiki NG +name: MediaWiki file_extensions: [mediawiki, wikipedia, wiki] scope: text.html.mediawiki bat-0.25.0/assets/patches/Monokai-Extended.tmTheme.patch000064400000000000000000000024141046102023000211660ustar 00000000000000diff --git themes/sublime-monokai-extended/Monokai\ Extended.tmTheme themes/sublime-monokai-extended/Monokai\ Extended.tmTheme index 9c2aa3e..180cbbf 100644 --- themes/sublime-monokai-extended/Monokai Extended.tmTheme +++ themes/sublime-monokai-extended/Monokai Extended.tmTheme @@ -810,11 +810,11 @@ name JSON String scope - meta.structure.dictionary.json string.quoted.double.json + meta.mapping.key.json string.quoted.double.json, punctuation.separator.sequence.csv settings foreground - #cfcfc2 + #fd971f @@ -1027,7 +1027,7 @@ name Invalid scope - invalid + invalid, markup.error settings background @@ -1042,7 +1042,7 @@ name Invalid deprecated scope - invalid.deprecated + invalid.deprecated, markup.warning settings background bat-0.25.0/assets/patches/OneHalfDark.tmTheme.patch000064400000000000000000000027161046102023000201560ustar 00000000000000diff --git themes/onehalf/sublimetext/OneHalfDark.tmTheme themes/onehalf/sublimetext/OneHalfDark.tmTheme index b16050c..b021071 100644 --- themes/onehalf/sublimetext/OneHalfDark.tmTheme +++ themes/onehalf/sublimetext/OneHalfDark.tmTheme @@ -28,7 +28,7 @@ name - OneHalfLight + OneHalfDark semanticClass theme.dark.one_half_dark uuid @@ -155,7 +155,7 @@ name Classes scope - support.class, entity.name.class, entity.name.type.class + support.class, entity.name.class, entity.name.type.class, entity.name settings foreground @@ -188,7 +188,7 @@ name Storage scope - storage + storage, meta.mapping.key string settings foreground @@ -309,7 +309,7 @@ name Markdown: Headings scope - markup.heading punctuation.definition.heading, entity.name.section + markup.heading punctuation.definition.heading, entity.name.section, markup.heading - text.html.markdown settings fontStyle @@ -660,4 +660,4 @@ - \ No newline at end of file + bat-0.25.0/assets/patches/Python.sublime-syntax.patch000064400000000000000000000012341046102023000206740ustar 00000000000000diff --git syntaxes/01_Packages/Python/Python.sublime-syntax syntaxes/01_Packages/Python/Python.sublime-syntax index 2acd86d8..86257f7b 100644 --- syntaxes/01_Packages/Python/Python.sublime-syntax +++ syntaxes/01_Packages/Python/Python.sublime-syntax @@ -988,10 +988,6 @@ contexts: - match: \} scope: punctuation.section.mapping-or-set.end.python set: after-expression - - match: (?={{simple_expression}}:|\s*\*\*) - set: inside-dictionary - - match: (?={{simple_expression}}[,}]|\s*\*) - set: inside-set - match: ',' scope: punctuation.separator.set.python set: inside-set bat-0.25.0/assets/patches/Rust.sublime-syntax.patch000064400000000000000000000007011046102023000203460ustar 00000000000000diff --git syntaxes/01_Packages/Rust/Rust.sublime-syntax syntaxes/01_Packages/Rust/Rust.sublime-syntax index 3c354486..24727a4e 100644 --- syntaxes/01_Packages/Rust/Rust.sublime-syntax +++ syntaxes/01_Packages/Rust/Rust.sublime-syntax @@ -907,6 +907,8 @@ contexts: - include: type-any-identifier - match: ':' scope: punctuation.separator.rust + - match: (?=;) + pop: true fn-body: - meta_scope: meta.function.rust bat-0.25.0/assets/patches/ShellScript.sublime-syntax.patch000064400000000000000000000013001046102023000216410ustar 00000000000000diff --git syntaxes/01_Packages/ShellScript/Bash.sublime-syntax syntaxes/01_Packages/ShellScript/Bash.sublime-syntax index e973e319..07c170a7 100644 --- syntaxes/01_Packages/ShellScript/Bash.sublime-syntax +++ syntaxes/01_Packages/ShellScript/Bash.sublime-syntax @@ -30,12 +30,12 @@ file_extensions: - .zshenv - .zshrc - PKGBUILD # https://jlk.fjfi.cvut.cz/arch/manpages/man/PKGBUILD.5 - - .ebuild - - .eclass + - ebuild + - eclass first_line_match: | (?x) - ^\#! .* \b(bash|zsh|sh|tcsh|ash)\b + ^\#! .* \b(bash|zsh|sh|tcsh|ash|dash)\b | ^\# \s* -\*- [^*]* mode: \s* shell-script [^*]* -\*- #------------------------------------------------------------------------------- bat-0.25.0/assets/patches/TodoTxt.sublime-syntax.patch000064400000000000000000000010241046102023000210150ustar 00000000000000diff --git syntaxes/02_Extra/TodoTxt/TodoTxt.sublime-syntax syntaxes/02_Extra/TodoTxt/TodoTxt.sublime-syntax index 6c75dbb..0115978 100644 --- syntaxes/02_Extra/TodoTxt/TodoTxt.sublime-syntax +++ syntaxes/02_Extra/TodoTxt/TodoTxt.sublime-syntax @@ -68,7 +68,7 @@ contexts: - match: (\s+[^\s:]+:[^\s:]+)+\s*$ comment: Custom attributes - scope: variable.annotation.todotxt.attribute + scope: variable.other.todotxt.attribute comments: # Comments begin with a '//' and finish at the end of the line. bat-0.25.0/assets/patches/TwoDark.tmTheme.patch000064400000000000000000000026231046102023000174100ustar 00000000000000diff --git themes/TwoDark/TwoDark.tmTheme themes/TwoDark/TwoDark.tmTheme index 87fd358..56376d3 100644 --- themes/TwoDark/TwoDark.tmTheme +++ themes/TwoDark/TwoDark.tmTheme @@ -125,7 +125,7 @@ name Classes scope - support.class, entity.name.class, entity.name.type.class + support.class, entity.name.class, entity.name.type.class, entity.name settings foreground @@ -290,7 +290,7 @@ name Headings scope - markup.heading punctuation.definition.heading, entity.name.section + markup.heading punctuation.definition.heading, entity.name.section, markup.heading - text.html.markdown settings fontStyle @@ -533,7 +533,7 @@ name Json key scope - source.json meta.structure.dictionary.json string.quoted.double.json + source.json meta.mapping.key.json string.quoted.double.json settings foreground @@ -875,4 +875,4 @@ comment Work in progress - \ No newline at end of file + bat-0.25.0/assets/patches/XML.sublime-syntax.patch000064400000000000000000000005301046102023000200510ustar 00000000000000diff --git syntaxes/01_Packages/XML/XML.sublime-syntax syntaxes/01_Packages/XML/XML.sublime-syntax index ad7d9c87..af4a00f0 100644 --- syntaxes/01_Packages/XML/XML.sublime-syntax +++ syntaxes/01_Packages/XML/XML.sublime-syntax @@ -12,6 +12,7 @@ file_extensions: - rss - opml - svg + - xaml first_line_match: |- (?x: ^(?: bat-0.25.0/assets/syntaxes.bin000064400000000000000000035455521046102023000143530ustar 00000000000000Ν Plain Texttxt text.plainYxΪ…ŽA €0 + >Ζ/•<*’9ψ|²Δξe ΝfδIΖΈ¦y—ώϋ=-φ>+Ψ‚\mΐ ω(υ•vpΧ{Π¦ΛΖ}M₯gqθ/aΑ SΡCASPasa source.aspapostrophe_comment_begin'asp_builtin_classesB\b(?i:Application|ObjectContext|Request|Response|Server|Session)\basp_builtin_eventss\b(?i:Application_OnEnd|Application_OnStart|OnTransactionAbort|OnTransactionCommit|Session_OnEnd|Session_OnStart)\bclass_magic_funcs)\b(?i:Class_Initialize|Class_Terminate)\bcomparison_operators[=><] constants°\b(?i:vbTrue|vbFalse|vbCr|vbCrLf|vbFormFeed|vbLf|vbNewLine|vbNullChar|vbNullString|vbTab|vbVerticalTab|vbBinaryCompare|vbTextCompare|vbSunday|vbMonday|vbTuesday|vbWednesday|vbThursday|vbFriday|vbSaturday|vbUseSystemDayOfWeek|vbFirstJan1|vbFirstFourDays|vbFirstFullWeek|vbGeneralDate|vbLongDate|vbShortDate|vbLongTime|vbShortTime|vbObjectError|vbEmpty|vbNull|vbInteger|vbLong|vbSingle|vbDouble|vbCurrency|vbDate|vbString|vbObject|vbError|vbBoolean|vbVariant|vbDataObject|vbDecimal|vbByte|vbArray|vbOkCancel|vbOkOnly|vbYesNo|vbYesNoCancel|vbAbortRetryIgnore|vbRetryCancel|vbYes|vbNo|vbAbort|vbCancel|vbIgnore|vbRetry|vbCritical|vbExclamation|vbInformation|vbQuestion|vbDefaultButton[123])\b functions"\b(?i:Abs|Array|Add|Asc|Atn|CBool|CByte|CCur|CDate|CDbl|Chr|CInt|CLng|Conversions|Cos|CreateObject|CSng|CStr|Date|DateAdd|DateDiff|DatePart|DateSerial|DateValue|Day|Derived|Math|Escape|Eval|Exists|Exp|Filter|FormatCurrency|FormatDateTime|FormatNumber|FormatPercent|GetLocale|GetObject|GetRef|Hex|Hour|InputBox|InStr|InStrRev|Int|Fix|IsArray|IsDate|IsEmpty|IsNull|IsNumeric|IsObject|Item|Items|Join|Keys|LBound|LCase|Left|Len|LoadPicture|Log|LTrim|RTrim|Trim|Maths|Mid|Minute|Month|MonthName|MsgBox|Now|Oct|Remove|RemoveAll|Replace|RGB|Right|Rnd|Round|ScriptEngine|ScriptEngineBuildVersion|ScriptEngineMajorVersion|ScriptEngineMinorVersion|Second|SetLocale|Sgn|Sin|Space|Split|Sqr|StrComp|String|StrReverse|Tan|Time|TimeSerial|TimeValue|TypeName|UBound|UCase|Unescape|VarType|Weekday|WeekdayName|Year)\b identifier/[a-zA-Z]\w*|\[(?:(?!%>|\]).)*(?:\]|(\n|(?=%>)))keywords&\b(?i:Empty|False|Nothing|Null|True)\bliteral_number_decimal`(?:(?:\d+\.\d*|\.?\d+)(?i:e[+-]?\d+)?)(?={{whitespace_or_end_of_statement}}|{{operators}}|[,)_])literal_number_hexH(&[hH])\h+(&)?(?={{whitespace_or_end_of_statement}}|{{operators}}|[,)_])logical_operators\b(?i:And|Not|Or|Xor|Is)\bmath_operators(?:[+*^&/\\-]|\b(?i:Mod)\b) operatorsA{{comparison_operators}}|{{math_operators}}|{{logical_operators}}rem_comment_begin \b(?i:REM)\breserved_wordsΥ\b(?i:Class|Sub|Function|Const|Dim|ReDim|Public|Private|End|Preserve|Select|Case|If|Else|ElseIf|Then|For|Each|Next|ByRef|ByVal|Set|Call|New|Option|With|To|In|While|Wend|Until|Loop|On|GoTo|Resume|Let|Get|Exit|Do)\bwhitespace_or_end_of_statement@(?=\s|$|:|{{apostrophe_comment_begin}}|{{rem_comment_begin}}|%>)―xΪν=‹rΫΖ΅”d7Iqv§7‰νΨ)Yτ3i£ZV$J²εH–―(Ϋ·H.EΤ ΐ ,v0s§?Π?θ?τgϊύž³ΐ»Λ]€(5ιˆ3@πμξΩσ>gλg…πs9Ί~i؎]7Ϊ>qλ]βwœVέ6Ί€~gͺ ~²άe ¦r6ΈΗ§£λ{Bƒ¦ΣνΫχLfαbΞEΧKœνω†νΧNktz>Ί^”}Χ±κmΛy“ΐώB‰@ΛμJ}Ύ•#ϊvtύ@€#G=—xž ·qο(±4mΟl‘zΓrš―Ψ_fΓΖό*6fΣ―³aο3ΨίdΓ>`°ο¦Α6-ΓγDΰB6l<7FύΟ•°<ƒ[N2ΒϋΡυzf+³-SžρρZf[X€ι'-?ŒW2[Ύ1ύNξ’RΤ£v‘²Εΐ—”±L;Β΄ϋ†RΧμnκ£QZΕΔ8ΊώΠΚvό:±[u§]]τ *n2'Juˆ91`¦eV€τ;5·o΅κ &eŽ[χLϋΐ"!ΖqŸJ*]―w ΣfΏώVRδ:bαϊS€˜¬ Ω6ψ™D °gΈFW\·γC€fΰ_HΤΑΒz‡πwJ’.†w¨0-6m;φΰUΙ”„€<ͺΧ$Ζ¬0ϋύKΙΦwJ±d !ΜoHΆ"†<4¬~ŒΤMΙRρŠΓ`Ύ’h,(WΫq‰ΡμΤI(£(€ϋƒ,I&UAΦY‰hΜ#°ίη$ώΛ#`e¨\Sqf€·$.€Λ@sJR6©ŒupqI›ΈΔnΖ$š—$|ΈεP“²Ί‰J—Y“Ϋ’ό$.Aά‘$sz}ΐΔv}Wβ1π Š-Vά“„Ο΄,r`XT€cfά—:❃y †‘κΐ`Ύ–μ€ΪΑ0θo$ρSA·Ήdqόkσ{ΙψhΪ Ζ&όψV’(M#Ξ–²– ’EΥ»;Φβ’έRΊΉŽiΕC<”„Ξ/2ψE™Ό?d@ΤxGΖ»sϊ>~5X‹%u·`ͺH’γί©<ί1 eIfΤή”A―DWΧςžͺ"Ω§}…ρY•μ“Β]­Itζ£uAΦ₯($Ν$<Ž,’uz„ZψΏ'’qtθΝπzμχ Ι¦$qƒx*Ιpv<ΐZ~]YΘΨ·C#GZ`U^“˜Ϊ›„ Χ4Π™‚ή[ΡυYAύAΈώKƒj%φψBΒ£2£ ωTρ81ΰΑ(ΠλΫM?”¨²σΑk(eΰBΖ£&‘Pq©»p½$ΰΙgV2CεΖ‹΅jih’rγ)ycO•ε?μo8ŒJA8©’Hμ©΄)±/Εβ’Ή°2Ψ!ν`eπ°J5o΄Tά3ζ²<§ύΪ›Ω ΆW\Z(.]½ρ(¨ν—Κ₯YψZΫŠ5Ζ]Όρ¨TJFžš–H (…q@Κ]§N2vΘ8]Ήυ’$–iTIΐ–ΫΘ|δxD%¦N]ˆI†³Ω»UΪ/3ηδpΝ΄!κ2‘[-'Ϊ2O΅…8£“yaHΟΥΌΩb­X*ΦJ@ήΩLZ}™"ί†λƒrƒ˜ΆŠ`W3›Fš‘“ϋΟe‰““ˆ(4.£Α)=\ΣλYx§5έn(m„=,ΙΌaΖtIw’ƒ₯q5U₯ήαΈ½(0zJΓh&ή―ΙΰγΆΚΜkΐ|<σΐ¦sŒx5­ΰΥ Ε³›…ƒ,ΜοAŒξΪ€W’/0:-‘Qρ"£,_΅‚μ¬m•j4^ΞiΩ’˜₯Œ1 e οx4ΏQ<»«xv»ϊΡIρ7i Ξi˜ω…R:ŠcheAgή.θζV.)+qˆ²Ι2³’σ-1Όk0σ¨£\:qΥ»Μ»ͺpΊIT σT©κ’#/΅»#3?·dξͺIvŸί²ΏΓ+Οb­\Λ‹Lη$>sφ>9ςΛΏk €EΨ—‡7—δ”PE^Μ§[-Šd8 ληiP)a*Μ\₯tB+‚ω‘"Θϋ5ˆ4–χ~xψh‚ oφfn‘>Ÿ–Δ.L0Κ?φ `Ήετ1@JάTLŠΜ¨Κ Bkqd)πΤ9ΩΣνλjZšΠΥ»9 ˜ΠγjIΈΞ«‘o”iq`ž±oxU6μA2Y•πΖ9bši㈈γΔœΚ˜v¬–,AίΜA?ϊα‚μ‡7€XφXg$&PβΡ*Κφ‡ΓO±jΕΗη,hυ=0KΔα2“Η―° UθQ+ΨWΆ»–ΎM‰Pc'SCJΗM›·Σf+ΨψϋΒl?Ψ„Uβ0g]τ³€xΆ^Π`΅)ΙLfΰ2*_Ε™ŽL)*0Κγ*&>±YabνIIλ‰!\ΪάOι[’ψ@5jR( @zλπYͺΞsIcι, ΣYΊ ͺύFπάΕ,ΗdΟo磍ΚΤΔZHηQ-ΟΚk&r„Ηw0τΌΣžb!’±υq!OχγλS‚eΈ­Α›‹L#ΜγΪ£,ΚS*Κ“?ηJΎ„f‡xύ.˜π½ω3χTR!F°wD§δψŒrgRCŒ-kL0\ZŒπΓ[όΎϊΡ5[ΘΣ@ž\E‹ŸΈŠντέ&‘KtιΘɈύΆ0š%ΛηόB)ΚE9ΞN)1'ΩΎŽ€βg&ζοάΠ3Ž ³S!@Χ΄i+ͺξt¦‘ΦX€‘%y’΅ιΡλ"·•μbΙ}\4– #‰ώM²6¬΅‚3*ΚοΥό+ϋ’DΘΤYΡ¨ί—9TV”4ωN£Μ1>Μj˜Ωμ]©ωϋs™†S§ϊΧdUgp—‡Ÿf―’θΤB~~ŸŸ#“³—Gδ-Jˆ›?(γΚc2 ­ωΊ A-·k‰w‡Θ„Υ$ό¬ΎžΖ±Nφkω‘·šΰ`η 9lΞ¦œ$G?Qq4Ϊ½“ΚΤσγ0uζxVr²ΥγλΊ\)€}΄Ζδν Ε€Ÿ«œk!9’ŸCΦφζ^η ΨχΞ\ρ&-@fvμ->z°΄°77ϋΓΝΫ΅Ϊό~΄ε΄¨}[Ά[Α3ΗΆέΰ7Ψπ°π&υύ’œ>ΔRbC˜λšM¨ΉϊδμU‡ΐ³kΠ2―v•°œV¬[©»ι‰φR(όwœ ΅Φ\­\k •—ΰΎ„4!{sσϋτΫR鴉}MGlHΤ ΏΜ͈““LσΆμ°±λφIpΨX7,―—ώΩlγ3Ην‚[ϊύy³ iήυ-«1άθΆJλΠπeΧhΐί—›MΓ Ώ­€Χu§‹‘%Β@Ζ“|«φν–1€›-'ΊΩν/Ό{EZ6»ίντέθvέ5Γ›ͺαχέπφ…GͺΌϊͺ1ΨnΏ"δ5šη?5μ»μ~vπβο€{ϋ˜Ψ°:i­Bd€ΣuμƒθΆΪq\Ÿ{ΌkvγΗΡύvγΟ%­ΉƒYλφόADΈl„‚΅Ζ–t ά¬:?’»οβlΔe »Ζ^£ήWΗ"†TF‹fϋa##\ ΉŽ ΪΧ2.ώ`W―+†έ$½έΆ-|φGβ=sΨ5ώyΉsΫ!Ύ;Ψ8°Κ&ϊ-pœ Γ`qμ7± &“JNβlo—ͺ!₯LŒ}ϋ_`{t»JΪFίςWϊΎοΨ{wοέίηόν%Yθ-Γ>θcΐ%ΚωMΑg‡L …΄ͺƒΤ₯ Bρηzgεr―ίλΑΔΒ ξ°!υ+ Ό15}&;§ZΗoΎΕ?½ 9RΥO…τχFγΤϊFBA΅ΰΎ¨x–½ΰ.–dΒZ*δ―Γ#§€σΖΒYδοͺ“ΏΠΘ6&Σ<’ε”γεΟ±/T€΅ΊFp T|8ο Έ‚ŸΆ―ΝI‹ͺja§¨xV›“‘;¬JiXΙ―ΘP ۝ˆ9•bŽμ oΎQMεw)1βTfτSΩuNa‘j*χ„;o’(l&‘ά‰n δͺζωͺζωVΚΙ€–±>ήu α@THΡΉε·ςΊeω%#*^ βΏ!Ğ7Ϋσ,AΰΞfyΉIα9wlΒ"–ZOΧ‰Hj-S#:τ“μΐ›Γ­.ΩΏ¬fbψ挘à }F.žή΄τ²ybσΙםΆ‚­X’S ωαΠ~o‹Ÿε 4ΞΖ`Ύi9™oΈFσ5ρ₯EΗ³²ΗΔΚ QkΚΙ”ΞΚgeŸsΩ#­0‘Hω΅^Κ—^’aΉΥ –½f°μΫAi ‘LΰAP‘Τ―¬6ΰiΎλ‚Κ&π‘βΨ‡ΔΕχ:=Έ‡.Ȉδ•*BΗΪΰ(x]5Ϋmzσά"αMτH·/ρ₯_Έ«ππΤlΛπ;ΑšΧ4z$Xϋ¬™žοΑ₯¬›,άλ”b±ΐ„_±7*ŠαΧg}τύΡ—ηVζa‰ΏιήE˜ΓΎτ„O@3‚ »ΧχWœ#ΈΑιΠΏ;δ0@:¬›πΨ ‰ΈαΡ™nx‘¨oxTΤρBΝάEl€B?^πΤ1νΰ{Ί·Ήβ€Ξ›X]6I7 ΪΑ¦c΄ž›`€Av6ƒ`sΧ5»ΑύK qΌ`Λ2™v†ƒδ’ŸΑzL°ε ξϜ7Α6Œ½CΊΞ!‰.Λ€ίιYFž<^ vΜƒ€;™jΣ5{ώš}€ζ²7­ΦːχΒ[ƟWωƒis?°Ν-ά ΏzΥ’RνY¦Tt 4ΪΔ RόπΠ vAΩ)sρO$>xŠΟ.H?ύ‹ͺ/(U_€Ω€R6!4rh(£+mρGbΈœ^},ιUΌΕjH·Ζ+(jW…•KαOψ0I¬€ʟ\’0Œ΄Iz=G,CόSžxΣ-nρ~· ϊί`ε•ΰίη`ΧA žƒV£ž¬_ž»Δ#.ΘcX\ (›6ΪΑ’ ΐ=&:¨΅`άpoμ‘A3 , ΨξΡ‘±ͺμ: ‘AΈυA!ΐ © EN/ΨΆƒΗ„Ϋ¬θΆ\ܞ †v8φάžC[@bΡQJ2qμB°ŽΛ+ώ?aEΈyμGτ₯²fŸkεΖŠaά±CŒV)(V,¬`“68#4σŽσΪ?†f2ηγ˜ξ!Ÿά—QβαAγ]Η7,t^ ‡*-Ε³>―‰^ί—”)^ύŸΦδΗ<™Œf“x”bZŽΟ‡£ςλqCš °η4ύ‹ˆ4Λ"q›σύχ’­œbhό/™^Τ€¨yρ 0Όr―"Ίλ 9τ β`D5.U•u«οu@`[¦‹šB&¬τΫmh_έ •0©0υP-œΈΨd*D[ΆOmxMθΑcWˆ«OέV$ ŽmSΑW΄±<ί¨TΑξBH‰,€γgΗο4ޝC6~Uδw¨%jn αΡΪi"Ω11Ό(J~²»΅Ήf7mΰΧ{Ο1ξΩu ΫCΏΨ‰~6„ŽݝΣχefœϋ93#!¬•Ÿ°Λ ¨›96•ΟHβ©μVΓCGΰŽ‘ !¨*xT¦Νfȍ3NθΎ,=$₯Ϊ‘Κ£€ϋ sΈΑPΝ">‘ˆ9σS#f2Ωͺ8Y°ΒΊA€SK„«―!Žΐ΅€ά²τ“ΧΗΡδcΜκzLy{p޲»&zGθ瘻˜uƒ|Ηγ©έ˜%ΝG·|qEσ\x3”MΙiλ4B­U\;¨ϊ€w +m©λ¬S…|―y -~ψ?•¬<+8+θτ~N½ΰΏ2ŸΞ*ŽgΗ³ŠcZΕ‘©HƒBπDe€Υ’’ KsΈͺUr–žX΅’τσΏΣΒ n<’tκ!ψςιΠΊψκ—2ι/»€W0τ^›Xσ8—Ρ/θΒ—U~δ?‰iEh¨1&φζ"›_Zbv;:rŒΒ±—ƒσ#ͺ](ŽωΔ1E‚‘y⁎yο騱•'hŽ#φκψ‡ΙΙΤΠζECέΞ₯ϊH½ΫΔζ}‘žΤYPΎ}g#Ld΄χˆ3Cώι<“˜bΆsμ‘O/–SΨδt«pvγ|[Π§=c°I6A‚Νδaσ{›γWuΙθ(ξ·`—ψΑΒ£gΥru>ρN‚ΥΒV&ιd p+ρ pI! '°QύΨiώSŸ’ό€OΜδa’rΪ&OˆOπXέcΜζ$„σb_e,h_ΔΏ¨xΜb'5AωπύτγOtTΈ”— *rfCπ=>Jkp^EρZ)νΥαΜ“~ΣZ8Ξ€o f»fΛοΘQ[Χτπ8fΕφΜΤZ¦¬ΚΓοrΎΦ9ςT>A`8ή€8·ζ£±E ³»kΧ΄Ϋ;ρ„o£‰υ†ωŸ|4lʁ ¦«τ˟ΘΕ2Ρ¨Λ§_ͺί†ζ+ύΉJΖ?R!€ŸαƒPxfΧŒydρG±Γκ­o‘G>Β¬ΫτKς±Μh£‘Ωγš’ Œ’,ς₯ΑQΖ™Ρ }ώsσN,σωψ»‰NMGζ:1γο‚ts₯ϊΆυZρI¨₯5ƒ ,;  <ΥΕbUτ?j„%ίh'RΉΎΦ”δ/Έ£μF§ΰΙ΄dpωΣx^\a̒׻ƁΩ,C™,γΤ‡ΟξœΐΩ‚δδΓbΔCΙερ£Eki ΞΙπ³pάCΝ¦S|βρϋ|WϊΘ}•I‡O š¦’Pπ»ΐYφ Os|XŠ?¦Ώψ"ξUϋnBΝ›]<ζ(Œ|³£οΊiοRΠ·-J WΪw*ςWΗ·k·0 ΑZΞ™₯oRu`€³œ2±ΝΈΉ-eΞ7Ο6 ΉνH<ΤΜ>A‘lΩ’:‚—λΜΙU½½(hω6 ’pν#”±ΌΊ,ΰψ­hHp“W\Œ€λ.ξΞ,Lδα0VW@q£ρ'QŒHΊ΅δ^ωv–zsΆGό4)χfo ³ΑeXz`Ή4Ζg‘Ε`X₯=ιΊαW±Ί£M^α²^’=§ΥΑrτσy‹φSa‚c&αcoώvςW5v‰₯μͺγόβ$²z’>υΎ`(nts Ί"?η’­5Ί. Ί,`oΓ35Άρ"|έρq׊U'Ά„₯WΉ²D ΐUύΔBλίpοΉ HTML (ASP)asp text.html.aspxΪΕUKOƒ@Zίz11ρβIkЉD―j­Xcbj"υΦ„laS‰νB`1šψγά‘Λjυ sθlgfηρΝΜ²₯|юΰϋ„ωΜ&Q`»^Hξ½RϋDSŠ΄7cΔΜα1α^ςHG›^Rί,\zζ“ρΤF«Ά9]MπeΑm{B<ΪΊΰ+Ή6β$δ ^|KπBςΌ#Ν¦‘@Ϋ‚UM'CκΊΤMAΛU„Ϊ¬₯Mί‚FQ.­!χΞ؏h©ϋu„@Šθ6NFlA‚I•ϊRHi5[zς έ\Βʈh@BΒύΠx‘οΗ―dS#IZςh7Ϋ­Ζ₯ž‹΅ͺ\jXUA’Jεβ¦ο΅ΰpXš»“q@ΫΘ:–₯/ƒ"GY/‘­"Kε,½εο*sZ₯JηΊ4mηJ5α;xΆ‰ƒΗ ϋ†ρβτιlf8Jί§WG-60"νdTΓf³νu{ζυ}ΧκZΦέCΟκ›ύξΗ½Ω»}2o“Cηξζ£hφ,³ΣOΤΊ>ζΞΥΔR:‚υτYςή0nŒ ΕdD τt₯Ωθ8hpιu₯bήsiγlTΚ\΄eέ+ΉhόrͺjQ«:Ή+xδΗ‘“Α1u›ΞΖLη=0ΰΌσAOX•Ώλθ\ ΉCy§daν'+<ο-€ΟΞ'ŽβV ActionScriptassource.actionscript.2λxΪΥ[νnδFv΅ΧΞn~$H‚ ?‚YoΦ›-Žwd{ˆ@h©[3½ΦG―Z3cΗς6Ψd΅š+6IσCRυy«όΜ3εœ{‹lvK³‚ lυY¬ΊuοΉηžKώμύχgώυ—a–g³U˜d³Oή{gϋίΗ|ΪσξγΗwΦML^Ό,NΒ Ά‡ρdίΔΊ₯I²ϊ·ωφˆΜγͺ΄UΕS0Π3ΙnL t―°ΉϋΒ± σϋΊη˜Βaž6«Μΰl\‚Ζ ‡pˆ$σ ‹9ΊBΰjΈΒ‘XΓiRΏJμm@λψν™s{Vbu¦˜,Wΰρ¦N`•εyZӍΈϋ>­i0τη1R–ŸΩΠ J8=W†WW„(ΐ’“kͺ₯?ΆΜM»x·*jέςc“ΐΟ8‘LOΐ{7uay—fWBΣ`€Ό:α’ηa9­Aάqκ½ΤLτ :I^œeGy'Dβΐ_+Χϊ›ΊΰΆ6;qδ1V€Μ 'ν$ˆήσ‰Α1VT›ZΆHΑrFΡ·M ‰hίM σ> ``ϊƒαe-ςΘ^Ε||‰%Ψ Ό;cΎΧπƒ•Ισz „ΐBlb.ότΒΐ£Rz•©tx˜V~$ΕH”Ιw°dˆEJ¨˜ιΙ$uή/ ]k-ηӐlθΖ¦˜Fe¦KžνS€]Ν_‹δΠwΙSΓUMΊ +Β¬Β/Β,NIΞμ-―xδ“!0iŒJ=ίΘ@—Q„V{ΊβέΒ\:–"[Ά«#DD D’λvΘbž‡%ΨΠM„Α’0­ό ϋjj)CsΫQ δ¦6χ‘VVœkεώ"V`βQ΄Μ§f ΟYC"ηΕ‘Τ%ήnΓ­Ψsͺέ‹œq7$.5iϊ•%μ˜E&ΛκΓ|¬ΐ1aK`܌Θͺ9σ}‹Aω…™]nΈT³6βαπR[Ÿ…«)IU4“Ξ-DCQqη’L„ψ–½‘5-n ž0 ΠiT_L»ά=ψέΛΩqζ}φwH‰Lr σ†|Ύ¬γCΏΕ`Ηΰa© ϋ~½)\PLŒ‘’²+ΰ ²½Ύγv­‚±~[,‚yΊ_4™V ΦaMγ’.†WΏ E?}Vl‘₯!>1`‚0Ϋ0*S r§ΝjN8ΘΜϊbS»x¦‚ˆWΔIͺΩ»λP_wο›:$ΗΆ+7œN—»GA~x`€ˆkMΜ]|™-h,K±•&–ΐΙGς]Ν`ΓΪ„‘ρ/Ώ”7D|Y$?^Ύ…½ ‹‘E¬³pƒ}P,_δΣΆ^u+&IoKSiZžδ8Ω΄^₯™ x[ΥςωΤJrΔΧZΠaΪ ’{œ _ΣωγΧ6W=ΊΟς6?}$š%I“gΤ‚“ ±λ§«­X ΫύΦhσ0Ρ²K)'“Ο€ΰ"­νκ…Mο€V&κh17hPC@‘@ψ9»Ν:p™HqHo±7Iή κGpš8†·ΘΙςw”EΉ “‰°KΎqΦψŸΔΕW/Iϊϋ+XcΏC8― Ε!sSӘ’0HςB! Δ‰›bN’›¦κΈ+±Άρ+―D4¨ˆχ™@d%<φVΛj2A¨KψCδΓ»ΟΔΏ#”Ήp:f§g *0υ±όWŒϊiέ2B™ΪM5ΡR›8†XŽνœ™ΫY2˜+,Ξ²ΐ–r «§Ε°ΊY;β?Ι_L0‘ϊ‚«R”€ύLε,ΣΌΓ³ΚΎ^’0vˆ…J h= FΪΐΰ°52ς©Ÿ}ΗΝ!{Ρ=QŸ5o4†Ί‡:΅=@Ξ* cΘ›€‚Bk©ίλ[1χ‘Ρπn7ΗΫτHB‘½I τ€’»ӝ0Y`'Q“Η*نQ λ―vRΐKΈvJ"Τl©R•ϊ?©h;ˆŒkΑ]Σ5θqͺHFN|ZΨwj"‘_ΰ`@G,Ϋη\K˜τ|‘WΟKa;—‘ήw%ζ$€§j#Μλ%©ͺŒ˜Ξ⅑́ίΐd…^ R+ον&|Su(`(^όΣΪK7‚τB˜/œ'_J…½-Jϋ²εΔΚύΒ ΰ‹&lΣIŽO…π—:%ΰγζΘ Ν ΐ˜ΟœγX4λO»ΥΕSiκι&VxNτ;ΑGΠ9jδ– ΉΒuu%$³W‰Y%QΰzΉξ$ρήJpάŸ`ν’„ΞΌ8NΐψH›Γ yᱜ`’0ΰΛD„‰'₯Y;ea·Έ6ƒŠ{ΟMcιU™σ&ΛΈ`O†OΓSV{²ƒ\Λόͺ.„KΗͺΖ€|'?‹:θ(f^YQσδ—0\LzTη56πlα΅G…R_EΈν\{F4YΓ-š4”kόRG=“œ“α¦")•΅¦k ZΪΔπ’*EŽ‘ͺ]ν@΄€—ά 2:EŒI#τ„£V’scl‰¬C~x‡Pž„=Ό €²±e!)’•6ΕZη)qšΩϊ0Œ–tR– ~OΫͺ•ΉΪψΒAσ μΎΰΞρφΜpdοb•ί7u—ψ3xνBP]TρΨ]eXΏ ZΈ>7[cΑkΕ+Q.˜Έ `ͺ"Β±†΄ν πε κdQ0_nΘE„Ύ†Ό”RXg‘*π"Π.ΠGΚgΆ¦Φš^”U³¨νε5( 2ΆΎΝΛk(•Θ>‚5|C·—Δ¨)τΈ\‚n<όŒ5Tωί-%ΌšT›’i·RTP^Τ)ej:aΈ&΄@<ΓςΠqDΆI,ιΎ¦§:e ςΛΕ@G,ˆΠΊ―ΘM…kr£C&’˜Φ ΉŽZ«0H˘τ΄S9ΒΆΡx­XzφZš˜>³*4횀<Gή€“’οΆsQΆbϊˆΤΆ:[!_t,Ÿ-=ΩΖΚ7Ψ%**ߍ§D΄€Έ.δT\ZB†fΗϊiκ'XUC˜Cšκ†χ9Z―R7ͺΐ’„zΏοO|rΰ[tνxO„2Ή¨{΅ŽOβΪt±ό€”ŸYn „£₯ZΛIγΜmIe2Χ¦ΔAiHΖ±&¦ΓΖTm|Ήc―-ω£IG?¬QβΪ €XAΓ“rΉήhKν;ΏO,ΩGJΟ“E¨θ΄ΉΚ 2bνΠCώΧΫZ)[0λΝ]`c©yEΜ-ΑΤ}?h{‚œpX$Oڌyύ4Ό‘΄A.d‹u―Σuλ%ώFρ–›Hί· Σή5s˜'±)Γ‰œϋ<Ώ•2©B’1˜ „@"@ΛΞs‘+ϊ£PΊτbΰyΧ’–―uνγΆfηe#άΆ‘‹U²,όNƏ6£d ^²ψ`υO'ΨιΊ½V~ ^¬1ha)]^rΓΞ‚pς₯δ;κΫ­PΗed³HΠE΄@΅Bm ΝsΤϊIΊa­Mϋ%Ρ–@o,Γ[GjΦsω‚Q†Ž{*%8₯4™ΒHH­Xς’βIJ՞L”@γχ…aϊ,I’—^“n1dˆ“X9ΙM'²ϊ#ΰŸΚΌ²Θt·κˆΝY–2₯(φ]Ρι ƒ€σΌΐˆΘK€Ύ‰ςΨqΆ΄ΐMΐώ†όt§^‘`ρ-–ΣQΨ{qˆiΨΆ;5${±X©τΥΕ£Ιτ‹6"₯Ε’ΰΥNvWa™Ήb΄ΖΌ 5ΘJͺή΅ό> fqΎB”ƒfδΓ\<ι"gX ΦRΥwH±"„ϊΒ•YSί2uκ;tΔE3hΦξyiο·Ε½³Γ,Ϊ‡‰₯Κ|¬αέ6θ{χΫήojtκM{[wK›.~hΉ« £#λQšny«ήαΠlχ½-βZ•οkvwύεG;Ϋνβϊmmrηοδ–6½GBΞόQϊΦΎm}―a-Dι±u ·ΪHŽυλ£W­ψϊPΓZf}ύ‡t§ƒО–¬>«oφ{ί•h nΒ$U² ­|Σ΄†G 8€ΪbΧΔήΑtΏyŽΔ5@Z§A.hd―Ισ` =lΈhC­™ΉYkO‰ ―±ι 5^ΩηΦoΣM+›„:PΤZΨmί„χ–­lž«Β‘cυ[ΗήΆzα¦aΎΥβ6£;YŠοΞRχ·ž x6υD ΛW§·D…l=Π Χ;ZΑW=KϋέφN^ƒ7χΖύΑkm–π‡zdbθa^‹ΆX¨OGΝζzΏŸ―{½vi―ƒώbd$νͺ_ςΠpχ%σNίύ­ΪλF)KΜ λ³HMvΚβ›»ŽΖΪ«knν]{=Jχ?i±οvΨί¦±ξ<Νμn(DQΗ:U χε -o΄]Ψ»₯ξΞ4Bu5ΞΦn•Rϊ "ΈNl½ΜcνΌJ³)Qϊ!$.μ%BfΝν»™_NvtΚ½‘Κ)Sΐh+{ Š)e…η«/‹ΝΧψ(zx'€w’B—{k–4uό±SN ΄>C ―B<ηπ2ν ©w‘iυР钁«_Κc½Ω]3>ΒͺYͺRpJwώ&·τ―rΟα‹ŽRP}¨ά«φ³¨ͺ¦jζϊ€‹–%₯ήnw%Ξ6ˆYAΎΡ­ςw+T½ϋοrήhΈς•·Ρ@’ δAΝAFΆ³wσοL”-κr {!œμμ0ΧΎβ!Κ›η%48“¨qόΓ>+dβ±ΆΥ:–Χ<ΣΏΉ―εxΒƒό-ώ–h"ί‹‹‹ΙT:½[ˆΎs ρχ?/>ur97³YQ‚ŸΟfn6+υy7 £ˆx^α] mΟΝ"ίό˜EN―–˜Ε8¨V*0[ μYβ…¬’Ή oyP•j=»RύgΆT;Ο–xωΦί4KEκ˜₯Ύΐ…i² ΠΝδώέY!}.7λNΡ1wΝ†³ŠΆœ7‹š;5kgUΣOt"nΦ”ΈΖ‚Ÿ›ι.Μξπߊ½$ΌVμ§ΊF_ϋ―ΦςΥŒέ=Συ¨±γΞΨρ‹I"’Λ䕬8_΄šΔ7¬ΌTζŠBqδŠR»HԏŠk.ΰΊ†Α©+ΝΡ4Ώ&»AJ,ή‚ˆ‚ζ$tM™Ήd€Ζb"φΰͺΫaΩ[Π?ψΧk»¦TΞQjz|=lΦΣ’΄Βs Φ―ς$ξ]ΰοΊψr΄Αμ…ςΗGωfτ ΉˆΊŸ±‚ΥeΓ6VόƒέGλPΕ»Η―0ί\Α|bξά—Αן<ύΧπιbπτθ›'3†ŸΏωθro_ήπ«Λ=ύ. X(0—Ή§ΑΎr?0Η.u/‘=]γ^Ί#ρΎΟt“ΜτœΗηψφOl>{«η,3ίπ`W±­‡―σ냙l_ι?{~78όb:Žάα`2=>;όΒž^œŸ»αθxt1ϊbτ•ž½>u£Σ!ώΏ»g'#7>ŽΞ/άρθN?ύžΉγ³ηŸ~2βΛ³‘;|9{58~‰wγSξtτ|p1~5šOΖ§γ‹―䦃Ισ!ΌœΈΙΨMΞ¦γνCΞΗΟ_\8ετwηŸΞžΙλ3χrςGαIϋξγΛ';t>Ά[NΎσνΓ­μ=1ϋ«Ο? .³ύϋΟΌκ%Θ#όcΛO+¦ŠέΗώ~όDεί_nΌ&ρεδ‹μίΒ_.ε[^>nφρπ―ŸώβWτδ£ϋxσovW}o΄JΈύ›Bώ―ΫΗgΏώΰ²ώζ‰ωeπuψτ»ΑΣί<#ϊAIW4‘Ή©Kή›μ£Άόž}Лy~Έ1hΧΕΈ¬>2~Ά³o.oŸς°Ω^ϋ ώ«•hέ(Αoο£jx+ƒo8rA›xΓΡjMΡHiAzeiυ‘U…^ΗΥ8ϊοΧΖοιτχΣΤ_τΝ Μ6Η,xŸώώž s•Μu€ΆjZfˆ,œ‘€†œ ‚ž‘dmŒ°ΊZ¦δ0€Υ±.7p|–ϊ1υΗ(u4sΌΦˁθf#k)±ΈU|υβ2ΩΫ@¨h™Ύ‘ζ…pίsχ P1χόYΕάiŒωŒ1'X5³δδ–H?œ,,ΣXγ Η6[f!ώy¨μŒD”TΚ7lΐAΫ^bΗMbΓb³Γ3ω³&­Ύ°MγρvmξΒ㌀i’z·n>ΥAIbC@0΅ŽΥ·u0&sΎ²%qχV'ŠIOΤ©ΥDχŠZŸ§Ιœ€Ω’oΗHό\ψhnΗωlDR670τ#6I“ˍΉΪ©1K‚p’΄ΥΆk(?o`5’Ξh'…΅mdΆœ‚ΒCϋ#"tGΨΛΈ ΆŸΗYuBωe#Κ’›;Ιύi‘’λv$ΓljΓρΔ…#<\j)χl΄ΠDΣa!π`¦οΛruoΩy¨/§^[§QH`š½d”I’‚ƒŸώΨ CΪi‘Έ3˜ο>ΝΰBΠ59m³Έ–P<~hšαΒr‰½‘‹«s[¨hžθλSΛ­ŸΑΊφφό('fh:-’§ΜθQ’έ,»Ώc†ΈΣ:©ΓΓRχeuςZ#uχό4τG0Ί”rvο*qΈΏUW}ͺ ―YσƒύBΆΫHuΪLͺ(έlZ½ή‘VXZˆ΅ΥF,[—Gd¬o?_*£Ϋj―›'½%oσ&Κσ«Λ‹ fOψπαXpŽŠŠwβΩMγŠƒ}y½qlk„΄iUύ°h=‘ΠΆ’τ;H$H~δyχ:ΙσVςTR/?H* n‰LΩ’<ο]'yήi'OŒ¦1‘°d‘ΒγNKF§τx₯»ό Γ†…-Έ»“qΏ86Ϊ«φ@œ–Αƒ_‡O-:2ΉΧ-δ^†«†gt 'h £8ΝΚλ¬–ωͺŽθj«<ώΎξ!bGAσŒΝΔΓ"zΌ(8­ΈΏΣpεŸGΝφGΙaώŽΖ4c>ρ2Μό4Ιγ€ω˜’+elD’dώΖό˜ΒoΓ!Ϋ'$†hƒθ‘π°GphΰΡd_ V–Δπy&ΒΨ)Λ¦iΞr΄ύdI‘Š1φ·˜λ™wυ+6ŒΏάΔSΟCΞέ.ΏΛ2ψ©bzDυŸŒoσšFUO=§“΄ dyκAγ΅GzΝdξδč耎ϊ–‘ήΛaK2† θz[YξξεΊb3w·ΜB/*”H3^2ρužd$θI>’y+εtΔ >;Ι¦Βΐ]oηo―y$PFWΓ ‡ύΊ΄ ;žqΖ τϋπΈ?·TΰΗi#Ïλ ³„c-,$Ήφmˆ―υΩχjΗό\3ζ|`#ή5΅χkZλ2€Κ"h’§cb«_°L^S㦧;Ζ€— šΜϊA«ύςΑ:iΟ_κ=VΣSZ―Ώ*{ΓrμSΒ‚Π‡V(‚ˆ²ιb!YΚ ^Œ>Ί4œ])ӐaφΞΠά€sL  ΥNƒ ¬М hšnβi<:‡>+ω΄ΧZΣƒζ1k³x―~AU΅sQ:vΚφ-:f‘„CzrsΧ3Hœq½œ-@ΜEσ^2ϊ+°ΊΤθΌXΑο_:ξΰΐ;Ή†HqkqrΦπ³α¬'ρΊ“€Ξz–¬Ÿ\㘭Ι{ʈu"Όι–χ Ι“8ΐβ$>ΉΆζ‚-}uH_ή~;ό=˜%`YCWoΣƒΖ…©N±―μe%΄θ₯Υ|9Šc₯žu 4.ž›‚τDΧeΡ”6Y4jΛL‘_*3p׍ΑΖ)N…STμFq χ«+Έ‹‰½LD'aΌŽχΛ^6œ LΝKf9Ήζ °― (‚w˜C<*υΑ‰;[3ΆΝμn`R1S]Ψμt…Ν⬐L.»hΓΚ€Š+G[5χ­œ)‘ΦW,Π«–λ}ΛυW,Χ{+vΫ¦R‚ώ˜ΎκΥπeτΗjAU?λ=ρΊ©ΈΧEα©θf% uΚ2£ΛUά¦α+6AQίΓ‡ΟE—ρmED†ϊckžΧ0–…v€ΘZŠd*S5Αt_¦S:LX-XξθqΉΚ„₯ΏTΆrΛφ"\UbέWΉ η0°³Ξ‘ug Ύγ+ ‚Waτ§uΨe.}Ό¬V‡ψ°¨,¬kΠb6ξ0Vτš°Ό₯ &Όvφφ`b,Ϋ5aς@“m˜k™ΒβΗoίΤ·Θ–a’dή…Vh±a’ΕθΖ¦½–ιaƒν‘ la»`<ά$ή•νa*Œ $ΓI°‘±LuΡ2ΩδΒ΅ΐ n€±πςXOΪVAjBψ£€R””Ξ2ί,“tŒŒj•Ÿ6ΣΛZ­W{ώψΡ‡ΆγΡ“₯ΔΰU•]8π₯ Œu§&0«€q †¨WμΗΩ8ΜE&@·Ρ£σž₯- eQbη KOT€Ω*α6$θ­ώζp„εˆψετ²kΧbΧgf>Ω€:*6θΟuνΖ«;Pΐ`W…»Ό\[Η8šͺhτΦ!Αyš#™pEaˆξ»^oˆ ΅§*ψ|t(πE½αmώι πWΌ¨tD5ΰmΔα™λ˜Q«wΆόOΊ/‹θΒΫψsΐΟwόφϋ|ά3fpoh/T@{ΖBIΪ­€ηΤJƒ>Q;―ΏT§~ύ Λυ·,Χίl»*xΆ\γpHsΒ&β!lA Ώ£Χώ/₯#?ήΙύ%ID|[φδ…ΚqElR“ΰΉomuλ ψ eeΥυ@2†Α–λϋ.a’ωΚn“αΦ`lβκ[p‹Αd>«eΟj±Μ±”dy3|λΟ„€ρΌ±α5 ΅TC’λ»ΚH~!οB—2ˆO“r%Qΐ Ο2q0*9˜CθN¦a—X˜ω 10€±yapF§~n:}ς.1u·K Rδ;Sζ|ΔhΆ½'ΐαkμΓ°K­†Ν‘5Uω7€>ρc7χ!46`‘‘›Κσ+~ꎧprqžΊΒΐ+ φI»Ξ?Ι#[]Μw ͺ•ΑΩgd»VΰΛ―Η™›ˆΣ_%{ΊόS2VηMμ,gΒHύˆϊΤ‚Ζ_TΠΈ’ΐG˜>Ο‰KΕι_’ΐ…εP^Ÿζn*Ο?JCΩϊ3?sσTžη² Ίs ΠA6b70•yπΟΗψ.b›ΟΔDΞC`UšGƒΤΕ ν8O!‰† - œClv•,ΎΤŕ$Aϊ1ΔήlΎͺb€νρ₯0kpHΞBΜ@±9„zρŽ‘x/οSOA)’Βy+tC§΄­1bνžeΓM6άb=φ ϋΟ`Γ―<[0ύ]™š‡HDE¬ŠB­=ξφ?ϋμφ>™}€_‰½‘}ˆq2ƒΠKH­)ιΏWC Β $6@ψ€§‚pΝLmφΞN1Χš‚LΙC™ΰb€ &&~LΔhEΎΞύΘ₯L\@΅’aΪlg3By6m³Ι0άR쁚ΐ—ηΑΧΠ*XIќΒ€ΰNΪ·³ςofάώm ·ΊρΉ œ„G@¬0r±’“ν€#Ÿ‰βΣ )­₯β1`ΙTԒ́.ΐ4₯&dbς%K Dό‘Ρ½Bvΐv…€<‘¬’K …ˆ ),ψ?–b¨l+^ σTόHΉ •Ι!Ζνo|eΥKΉηy₯ @Γς?IεM_ΟΤC9uY+7TΌτϋ?Φs•š”$qmΔ–2Φψj€ΒίΒΟUΧϋ²KΉτLΔόU^UΡŸώϊ³ΛΏΓθ/<Ξf εͺu%Ks!ŸΚΚ[ Ri΅‘i…Φ%ΔOα€ŒmD©/£γ—ΚoΫ Ω{% Ν'Ύ:ΗΘvTψ(: z3VB€ιNκΟqDδ :0μη–―W-ΛΚ—΄6OΐwUeο& © g’p>Jό‘ γI‚"ΔfDMΏΙΧ‘ΚE†ν2 _‰‚‹D] Z%ΒHΠ0ηΖβ^ΟΖp&xOB‹ OXθ±X {φΗcnpͺ„9‰Εε]ΜH ± O¨†¨z²ͺɌSšηiJΈ;%5†E@†WI–ρΪHσ A£Wn³κžj­™ˆrsK(rZxŠ%2ογ+Ÿ…Ή¦”CΛ•_ΔAψΧhH&1g ’EΚV\ُ‘Œ\1G>Lύ;βͺξβg—._ζ^§b%& φ„Ώαά&94™LΈ~Μg3°ZΏΑε‡Μ A}Wχ.ΖI„«¨4œ+˜'1­|±@b‡œΣg — ύα/~ϋKƒΘΗuŠ‚O»ΰέGΐ‘X‘ lη1κλορι΅r8nύ°—Β>\‘|€ΘΰFΪϋ7χϋNΥŏΌψυ€ΟΠEbΠIΉβ.₯Π]°Β¬†x‰~ %mϋ™Zx!“ƒ?θΉΠϋΰ:{bΛV#—L†ŠJ Ε”CΙU γ+lΑtNΖα€|ZG‘q@vπΒΒ`±6Lv F`v9[rβfώxŠαυf‹ΏΩ™i[˘ζ8(κ€ώŒAQ–Ά+υ*@πۏΒ₯ yX‰cΝ­eXˆΛΥP V1Χ&J$ή#—λϋΔ“Ή.’”ΖΎΨ†Θx %ΰ~Ξ₯B)~‡ψ,ψ*Ε)wν8»Έξ%°πbΐ>υ)O%βM!‘θž]ί¬ώο’SΆζŽσ/ώvΗXΚ`Q0ΉŽqwΓ‘γ7³‹Jx\­΅²ιpΕN@΄f0ό*Υ―v L)ήγMδ7μ'Σ&ΓUl’ZΐM »Ξψ] ¬3 φ Μ%ΔpΎψέ€€Γ(ΌΫK`ζ†9eωS˜ς)³σ$Ϊ[rξΞ5Σ.C[Lo£=δV%tb,Bg`ΟAν―σ`<tx―R¬·qΪλoŠδε0Τ«Υ8nΩ κQ0ΩυQ­ρσΓοΈ[~‰(€W;Γ'φιτŸNo:|ΕΦCwΈYϊΖm=ԟ֣ϊgV,λ†œ[ ΰF€χ˜t‡ίήΰ6Ψ^ͺ΄^θ³m|χ²fd8έWΟ»);Ήlž­@xS7“Ω@8W‘ΓκζΡCμς΄–%i§ζ±ΡI)ΕΏPθ}―ž‹–—ηΈy†ΆW69οΉW―nαN˜mω妇[ΫδζoŸŠdbΈ-Χažζ<Θ`e^ΦPΛ›κpˆ ξΆΠθˆεΏΞΧ˜T€]Œ―σEu°λ›œβ!Ξly¬φOΦΐΌλϊ°¬K%ρ–Γτ¦)DŸrQAΗ«Ϋχjέ²Ι°‰¦[Ν5D~υύŸ@2AλsΖF ƒ~E¬£%(oΆ‡|άjΈTͺ! Φ΄‘ΛΝlΒO™‹nnŽήF 0’F§žά'.IΣu…·£ϋ”A2Ξq}cΒ'™£œ}Ορά+ΐΐΔέ3Θωξ‚@TΜι³Ζ™•―@γq‹‘φa‰ϋo-έΝ N‰ΎA:πΝ ?„€dϋπD²―ςJ ’y_³¦h―”ι£Ί δΈγžΟbξVyΞ^Hφ„WΧΑύΘ‡ ΄jΐ)μπf•XΣkMΰ‘†ι•bπg%€<~OƒήέJ'Ÿ3Β'ΜζΩΒu'€w€N4ΖΞΐ·ΚηθiήΚ»δΒw˜ΓXγIHΓ§ά€(‚EΰΆω8sT$'ΝςΉΓYRΝ5‡(6vJΦ08Ϊt^¦_T­6†π•0?PΒΌp‘†.‹dkc—5±΅U·ΌmΉ~ήrύ5ΛυVμVfe_Ρ—¨εa}Ψ­ˆΎp˜Sφ³ί 1„Ε‹2 f<\ΈΛF)ΘΜƒ7‚„š$ΒΔΉτS˜Θ½σηBT<~Κ¦7¦Bqp¬¦>~Η:ŒwŽR³*Bcε0*v₯:©¨Η(R†η•3υοE‚€g–&0ΟΖΡ&jq@ύμcΜΑ1ΈΔΩ !ΑοΙ¦s?§Ό€dαςS‘R ς(52S²ΟEBάU€ΘηBξ€||„ ˆΌμ~šcΜρ\Œ"y Ξ>P+Ζ@gΒڈυšή\ΗUΕβΟ7 3Πυ<ΔΘΡτ8†0ιόe€]Δ†Ώ3ΐ°Μ€‚ι<ΌBbLŠSqΤΰzηpœΩ {‰¬Χ5½‰VŸΘXσ|«SOm;ebϋh4*z²σΧΛ֚Lψ;<έο”Ι~§¦γd’ί©§ωJ’ί)3όšΪδy~ΰ rό Eb]ΤeXe€§ ΘΧλ ΙΒγ βΊt]Έ&Γ‘Š„E6F°·tCΎk`΅Ζy]˜…wΣ"oCδl“ Ο[dŠK_}ϊuNhv4–mΡτ53 ²ωω)Νbαώ1 ίPζuσšS}E<>ίkPμ·ςπ‹Xξ w }…cY8hpXτ-=K`T48"V†ζ3¬P.Ÿ<Θ£5=uΐbAPρ/Ό%&¨0³ΔΠ„ŽΣ“sά€˜fH ››ΡhPkΎgΠ£ŒyJ3£/K&HύSAφνΘvβεΛu W‹Β%.ΰ²%`TέO&BψˆΊPΊw»Q§ΪŽtwβpž§“°IκΒΨόΑ¦Ήx©Œ'αe›’φœNsΠΙ!`4c¦ΑΒ΅ <Η½4–qP±ΈΊyδπ°\ “t‘±‡Tη”π0Κl”ΐεQrΰI1”ŝ₯Β—Ρ$ζŽrΊΐ(αN*ΦۈμωγσΠΫΗ“TΨcΞ>V˜Κkϊ8㡌ψw߁ΐ“ΟΒH&VF€ό‡S€ΝΙΰzάSk…‘ρ'Œ3ŒržFL€GPǁiοŒr΄Οh—BJϋPy‚₯ Batch Filebatcmdsource.dosbatchcolon_comment_start (?::[+=,;: ])command_terminators(?=$\n|[&|><)])set_arithmetic_operators_quoted(?:\||<<|>>|&|\^)!set_arithmetic_operators_unquoted(?:\+|-|\*|/|%%|~)ΤxΪΥ[ωsΫ6–γ€Wz§χi;±+Ζ±r5ιΤ­γνΜvΊ?tΊν¦ΩΫρP$(qΝΛ$d9Lφύ(π€‰RlW‰ˆ|ήρ½~ΨΙ?έIyݎβθΨ‰ΓЎάγŒργA’c;H™ν>=>ŜΉΗwt꟭9ν#6¦[―LΚ7›Zg%έ%#‹x…nu6έ]Ewy6έ=E§Κjt~”ω.«M²ΰΰ…Ά- ^^lΫ’ΰκ₯Ά-ξ«/·mρ₯jρJΫT‹«m[ n»Z0© ₯`4 ϋYάΤΔ'LZ^A°­œCœzzK³ ΪToRqΑΣNΛVu κiπΠ£ŠψΆζΧ±nw4)MΠV=Ύ«§R”z~Os3n¨χ5ΤUοσ'IYΨ+ΖωRΣ–jU0ϊ`R>μ4V:eͺ3Ÿ‚μIχί μςφ¬΅΄NΕ’ξώ^w?ά½aFβ`K<ϊΦ:² ’KͺiuŒλ•.«χξί4άΏ;ƒΥKΥκΗa΄’9ωΡz±^Κžg}›;ΓJ*t»ϋ»»Ϋ{·ΎΩ];²¬ ’Qδπ‘M6s™ηGΎ¬ͺŠŽ;Ι_²_ 058 ώ«5ιϋ…R9‡‘5%ˆΪ8seqΑςT>θ λhEƒ?:³ίνωAΐvΠEpS†PαξA£μt΅:Ok8ΡΛΑ΄#8c£ΔjζΌ¦B‰,» ]7v©φ›³Υ>a‚E&‚gε ·œ€>Τ₯’@Ά¦άΥ‹ρλMγo¬h ΞXŸ όhΎ³Ό€³˜ςW:5‡YΙψσ΄Ξ€Κν^™υ6kΪ[1τ{§ΣΫk\~Τͺ{πdνθΰΙήΡM«»W\¦‘J•,ͺψΨ‹ωΎLωοI@©%½•χ°§γ8u{*ιΩΗ ͺ‘«)¬]5Ή…n’ΖaΒk‚­/ι5°ω†Υ¨ζ*›―vζ~šš½6‹x΅Mτ\pVЉžξ~5ό‡rβ΄5Ν~Φ –4ΧY˜JŸkU#K€ωϊ/b_ Άπ!CΘ’2οtj°sK|£ϊϊ¬±―ΙΚ³!ξUgwcΉΩ-—'~ΦωS¬KUαywΓέJΖbD“ΕAYοimRκ-­Ιzkν–‰Ϊ žQ2E&·i‰Γ¨Αδ2'Κ|4I¦4ξέ?4H2½έirωέ κύZ“΅Vu+MΏ˜s±‚7cΛK%ΆlŠ©ΜYΧφ†α―›‡Ÿ¬"ΝιΧb|Ω4όή‰χN‹°²Σχ«M‹Υΐ“Ν£νΆ1‘žψ_ “­?:Ω{ΟΤΙή–NΆώܜμςςά3€ύ3uΎ–qΎ&£9ίϊ’ΞΧΔ–i%bT¨vV²x”:u7•˜„φα,╦ַ–ΙΌζφ~΅P‰oφλa_—ZΝL6₯ηΔ¦Ξϊ8{½ˆu²)»¬ ΄=©Ψh•uώ)AuέΉ‚jΉwρiηB5b’αŠI†ŸώΕνh©’Vλ”Ά»#΅©ͺΕυa޼˜al]€7_2ρυImμ—«cΫd0J\a»Ψ J„$©°ST³,v„Νρ?΄έ€ΤφˆΗžν’o;'£Eζ;Άθ;.s}.ϊqΜo ϊH•N„c;A&ϋ£4KyΚNe‰xlΐFΆΔƒ8R?’8εͺ>ΚX:©£p\\Ÿξ T“Α„|0Κθώ‰›PqcίAC?R7³£p@cΑ3σ#ͺdœHB—Ύ=ŠŒƒ {㸍½yΑ^1ʈ§q@壑γΤΨορόceNκ'Έ›ΉψΕωSαڜ Χ£ž.\Φ pυR›Š€Ύ (ΨΊ—.&@ώ—ŸΏ š΄λg'’“Ό‚Q©‚pΒlƒxv›…›ϊ`μtΔRάΙle’,Œ]y=Γh™"HCαžεκ‘d.ΦͺV€αν@ ^α’Ϊμ ϋ0Λ'uΔ`€·Œψ…ΰš³{}jMοΑθ'ζBμœΣ>»πμŒc―-ž#<β^Πΐ-JΠΣ%΅ΓΌ§€r@ΓΜ½A“₯ ΅”•6κA‚y™΄+ΊσψΣ„ Μ<΄*ςŸ΄η9 8*0{šΙ ΅=ŽDO ƖŐ‰Ό8ΰ`g<²C&όά–ύΙ©π=hΛσΒχ3ά€|ύΦ*όDέO΁QΐO‰›pυ…|₯+Χχ`a"Š Άέ‘? Šs‚‹KƒΓΖαϊTĞ'‚δίT`:ΤBϋ„9v_@^! ExBFž@{'" mƒςΗeρ3Ψ¬T}°σbfh— πŜ˜C%nίΏ‡ Οπ“4ΖDΤηxΞEΔψšν8ΤQ&%ŽΘgςrΚ“*‡$˜ό!ω€Š„kY“UŸκΤJ)pͺ$6‰TΦΐtΞEF•Wδζu^Η‹œœPž»P5ξ#sw²ΙΟ8οϋ“ήUίd¨rζ³1UθλΖ!ΩP^₯‚>} A’€³ w$6ΈΙ‚8&0Œψ₯;δ{ΐ¨»ΉQBtˆΨ (b·οΨωCnΛ{ι’ΐμE>χ€Ÿ#ˆ8€}joΨENΛC‘œ ˆ₯$Š'ρ˜₯ΏΉΈ& $£lθŠS`{–ž‰ΣάΚOͺθχΤ³§ tΘͺO! rG kΕ]ωKΙ;Υ‡5b)ΕTNσϊΨ§³Ψ ¨L†qΔD O]A‹iΪCΕρΓ1u—2ͺ$Ι’Γ(SŠΝΎ,$R£’₯ςάΧ߈Ύd;“κB:fΑxξ¦ΈrrŠTZ}κηκHCςž4ξΗYsΟM‘ύ4CϐA:Šlyuƒ`R`t8Jζ Ήd©‰δ™Α7‡OTΞEΈƒ…Ίρ…οαρpG"£ΰ•›,–™~Œr½)²§Ώ€XT€}e9<žZq;ρIΛ4ξ 6e%€`Μ.Ÿ'Μ‘–NΜ%‡3J―Nay₯(ͺ ‘0ΊŒrQ :X?©²Πu–œQΰC!g„Η„±t!CόχIθEΦ¨ΐFjΖΧχžŠ³‘+αI>eYnξγϋχx(ΖΆΟ Ηί ΧΨ}«"θΚ‹„J4–Wθ%Š ;ϊ™‡°φρ$,ϊ$ΤσΝΟIΩ‹δ^Ζ΅Zm7βσb­ΆϋDt·,KΎύέΣήφ—;¦M‘Mβ54αΚΤ›ΛMKάjφWgωj5υ΄ΰ6εδ?1LΎφΞέ4Κ•NΫeς«΅δχ§ί~¬ΘΏ9|‚MŒ'=ͺ§ 6τ‘Κ£ω‰²#ΎaΘ·Χ χ»†ϋw χoξ›ήΧoξoξ/zN`Ν¨F‹ϋΌTγΖ”%Ι”ΉGa”Տ”ΒνΥ:μbcύέΨ%Ϊ΅φι ‹=z£3ή† νϊΈlπ‘φΌθosΪmί¬j­nΖσ‚x WβΘ³‹Ά—΅•ΫΗΥe³GΓbΜBΡD?zVM1Τιό½.Qίm“‘·Pβ„ή5δR˜!_OΣ8₯|< U’v`4EN¨ σͺAΞ¦y7A•.ιuΞ!΄#οŒΒ~Oo(wι§%q­.‰ύ]ί,ΘXzαΏb΅uΆΆ—Τj“δίΔlονΊΫΣΗ9' W4 ±pζξγ«e|ŠπIž)ΐŽe’}˜υ”!Ουΰv_o­B2άΤηO{΄jκΙ]ž†@Τ™ϋ¦jΦK―3„±Ϊ„`πη;η†Ζ‡7Λΐ΄cRφ °ήN{Cvn»΄Ξ«Ψ΅q‘r6ψ«Ύ›ϊ,yμˆί±ξμ|u΄]ςϋΕ<~c‡·αt§§υήV›@rχŽ8Έ»συXύ@YςjΝγU—Ω­j€€πύot–ψ±eZ³•‘£1ΑΈ^™‚Ώϋύ/Ώ‰ŸΎEόψψ±ψεΏώKόπύ/˜ΨΫ›œδ~8ΆOͺgΗΛ‘΄Uή?­ΘhA,­ΑΚΦΦΎ8ΔΏε–ΘeΕΫ&‘;TO‰ίΌTΡδ[°τθ`λΡΡώ\¦Rl₯¬ž―·\Ρ>Γ·‡―wfΰΚ•¦<‘;l¬ΒbzF›,Σ{4 ²ω€ τ]D,|[€^νWσzΛ1[ςϊΞ ‰ΜΟTšeς1WθS«φΉFŸΊΆxξNξρΤΠv-»Iˆ%^―nω§«ΖS$Ό₯­…!’ΊAδ½RBZ9O;_δHΘCζc΅ΒsSΫa"<™€δ‘ >λqΑ'[DγΥςο60&Jθ—5ςh˜ΈsώψΠ*q2νώlNˆVΛΒ#™§ δλ‰ΌΞY £h«ΰς“Frΐb RΖάM$#B–’―—Šs4·|Ξlͺ#…"ϊΤe}.² ΩΉ.0[―ύτίπλfΰ]mu„·$’Μ§~”Έ›έ}‹οd!ςLψεφ›No€φ‹;ύ zΦ”PΆ1ζΐ›°›˜Z”Δ^š qψ–™ŠUi~έ†υ[¬γαώeŠJεβΪΑvΏ?l9mMΗό‚άάͺIΟΰkΛ|Ά]TމRδ₯nοbIp<“JSημ»ΩVΔΗφcΌ{"Ο* η.Σ¬½Lτ…ϊ¨RyˆΑ“JΉ22BVζ{<―ώ:κ8H} os3cN?οpŸς `}¨ >pΘβθΑI΅ηΨRΗC#cscsx source.cs base_typeg(?:(?:bool|byte|sbyte|char|decimal|double|float|int|uint|long|ulong|short|ushort|object|string|void)\b)bin_op@(?:\+|->|-|\*|/|%|\|\||&&|\||&|\^|<<|>>|=>|<=|<|>=|>|==|!=|\?\?)brackets_capture((\[)(,*)(\]))cap_name(\p{Lu}{{other_char}}) dec_digits (?:[\d_]*\d) dec_exponent(?:[eE][-+]??{{dec_digits}}) escaped_charE(?:\\[abfnrtv"'\\]|{{unicode_char}}|\\x[0-9a-fA-F]{1,4}|\\[0-9]{1,3}) float_suffix[fFdDmM]generic_declaration\s*(<[^(={};<]*>)?\s*integer_suffix[uU][lL]?|[lL][uU]?name7(?:@{{reserved}}|@{{base_type}}|@var|@?{{name_normal}}) name_normal{{start_char}}{{other_char}}*\bnamespaced_nameO(?:(?:{{name}}{{generic_declaration}}\s*\.\s*)*{{name}}{{generic_declaration}}) other_char (?:{{unicode_char}}|[_0-9\p{L}])reservedœ(?:abstract|as|base|break|case|catch|checked|class|const|continue|default|delegate|do|else|enum|event|explicit|extern|finally|fixed|for|foreach|goto|if|implicit|in|interface|internal|is|lock|nameof|namespace|new|null|operator|out|override|params|private|protected|public|readonly|ref|return|sealed|sizeof|stackalloc|static|string|struct|switch|this|throw|try|typeof|unchecked|unsafe|using|virtual|volatile|while) start_char(?:{{unicode_char}}|[_\p{L}]) type_suffix(?:\s*(?:\[,*\]|\*|\?)*)type_suffix_capture&(\?)?{{brackets_capture}}?(?:\s*(\*))?unary_op(?:\+\+|--|-|~|!|&|\*) unicode_char(?:\\u\h{4}|\\U\h{8}) visibility>\b(?:public|private|protected|internal|protected\s+internal)\bT1xΪν} cΗu0κπ‘Ψ–YΆ,[€$ Kη$EBN·MqΣ€Ε‚ΜX’°,D1\¦χ‘6MΪΨi›&mά&iΣτΛΡ€ΗΧ€iz7IŸΠ?Π?љٝٙٹ ZΨβ‚Λ7χ»ζΝ{oώ«N%Ο ^/θ­{ύΝaΧο Βυ§N؏ πi x$yήΟ6½Ask}gΛο₯Uu€Ξ™δω ΩρΒp½εƒgί΄ͺ꣆H Η Ό8nXΰ\?οc ]n’οPΓ‘ί™<Οrp½pΠ6A}»ο7‚ΦnZυ]Ισ4S€ε ΌυΑξΆΏΞBί-l …Ϋ›=o0μϋi‘“Ισ!Άˆίρ7½ΏήσΊπ €ΙhοM„~άκί+D,Ώ‚!v‚ζυς>$ιΐ)$Α 1ΛBήύ\ίςz­Žί#ν9 ’Ύ=˜<Ο°oCɍϊ!3xRi!νoγ*~XHj<£$“ωˆpέ`Χ¬Loχ6Σζ’N{ƒοζY5ιεcάό8@e­6»xη„u^χww‚~‹"οΗΥp€ν'Τpd‚Ξ«αϋ™UΓ½ ΓΝ©αތα.¨αή‚α.r4ΓuΌn£εQΣrI FfεI%™”ΛΒ…λ΄{ώzW―E±‘’–4οθaIζυ°dqΈΙΐΆ{λ½`=τ»νfΠ‘o1Y2žrώ²d|•όeΙx―δ/Kτ©όe >Ώ,Aδ7ζ/ϋV\φŽA%eΐΌ$¬μMΒS%ΠνŽΧτ·‚N H…€Rϊ͜<ŽKw½6…7o‘Γόx+Ηd0ΜnΓ_χ€φ~ΫνΓ0Ρ{HέoΛWŽ΄χφ|ε.. Χ¦λw`rnxύΆΧθψUq™“]Έμ`+h­{Ν&‰@,π«FΰdD+Fΰd «Fΰ„Žͺœζΐ€³Ϊά5-(ισ³ZPίw;Nχ¨*gΔwjAI—ί₯%]~N J¦χ9%„έCλƚ0ιρqΚ@\VnjΟΘη(Dόξ…ΘΠ„ΣβB@λΫξ jΫlηž7.BΊφγ"€c?j\„¬ΝqzM\Δ€7ώΈP.‡;mΈνδşΠΓ’aΏ7yžΑ Ζ’'«ϊ»|'~RHzπΎδyšŒ·Τ\΅?•<Ω ΒηΑp»Caυϋ…3 αLs•~@ JzϋΣBV˜΅˜J~F(xp°‡ι΄›mjΉkωΚ‘ξΉωΚT S#ƒΦr"=\ΞυΞV»“Ωζ~P Jjυ„Λƒ °Έ‘<±9diψ―ΝδIΊ Τλπ―-‰€#f% ι'OlτΘlπΐ Á6Ή) ΩΖΆ8Ν(MGΦNžΨHB‘y1yήΕ€ΐ]6†Έ.„€¦/ Ρα!ήe0†θrά!cΒ€½δy/HŒ8,HžΨ:ƒΫGΡo'Ο;P—™Α—ψΩΑΦ«΄Š~ς|ˆ€€†«ΜŠ„Rΐν@I―ΣώOζuΐ‘“|έΫ€…†‚,iτFςΔF)Φ‚†‘vΈ –3 z““3Δ&XΗ]; ¬ίka˜q‹ΘΥ0Π‡i6dξ#Y]p(hŸοT2 σaΎ"Ϊx‡~–CψΤΐ†!~Žγ)~ΨτΆ}2τŸOžXg“šΟp_HžΨΑ›Α0ά/rέίhχΌNg—ϊ%Ž ‹ψeŽεA(T-€€Σ!…“ζχ{C*ί;z[‰~#£a―‰ΨyŒ$Kuα¨Θπߝ[tΪ0†a~ƒk’&?ŠΒ0ψGΉΥkχΒ6ΰ?Y΅ψMŽΫ=@P¦Iρc³I‘ρqŽnSΰ έώ7CΨό…ώΫ&†*όλ'Έ € ζeŽJ9ƒ{%y>&cμΈΜ'ΉήwΪ` ^‡tοw8\ΝΪ+0δοrόž²S`ίγf•6ep$ό)g$V ώϋΙσq5xs\κΣΙŸΡjΛg’ης7±Γ7ω*Γ.σ‡άΊr{| φYnf©]8y•cτF}ΠχΡνώ·¨Ω½:†όcqΣ΄ω‡ΐτΦΓ|>yžΐ02δ  £ΙT GΙ Πz£ο5―ϋd”›γt{ 8PJ†_δκξ’1πŸq³’μK[A δKͺ φ±τΟ9yΰ=)« ΰ΅· °/€b‘ν—“ηρ”’Ώ―pŒRLz_Mž²Pˆnf&ΎΖa’œB‚γκβŒϋ |]_€₯ζod§‰+@Vϋ/ΉŒECQU`U‚$ΓώšCΪ0€aώ†―‹3`ΈΟaΩίc€ΏεέΧc¨orlΖ₯oqxŽtQ υZ„JzڟΏγ¨i­γΫά\" ΆžΏηh0’p\RΣw8&Ɓq•ώƒ¨sPΔAͺΕ@ΘOBCυ)΅Ÿ’η]42€`ˆNžΨEY3π…›ΚԁAώ•›„0 φoιΕ`bmοίΉ*9³ϋ.'ΗdΦ =A”μϋάΘ)kω›œƒύgςό―‚ψs€p„g‡Δ#}ΘQ^ίίpܐ”;B*`ŸΊϊή¦_ι­φFΫοW0~WšaΪξg©:[ͺ.Ε_ΌDΞζ ςΒ¨α…~Τ ϊυ¨ Ώ"ʌš[>`Π­) ΒfψsΠξ ύ¨εoxΓΞ Βϋ©¨Dp·ω½a7BΫ–/ψPΆ%{πΌ ͺ,0JvΡ&Q{#jw“ν^DΧψ(΅Γ.P±/؈F='κ ;(Ψ: ˜—(’ΰ†ίο<Šεk΄έoί€]…bΚo@Ά‡ Π^:$ θXπ0Ι^ϊ^@„@ΧMΓOσ:θ|Π„_mψ€<:Š™kσΕh°Ί8Ψκ;`p€FPμS’©φBoÏqD7ΪύΑŒκ’L?BζDΧβEjA'jμ‚ώ†θgsΛλƒιnΆ» L+=χ£NΰΑΙDCψκŽΡύ ·‚>x?‚Ζ‹>μdάεA»εΈ Π θZ5nΞu‡ξΦή›φ#Χ}ψςΆ}'ͺ­»Ϋ{ΟοΧΔSε·'@σ J7œ/]­­•Vφφ—―ΦηW*x―€ΞΌE=‹zSE=Xώό¬-Ξ»υȝάͺ3 ,2Zdœ2:Dό±δ>JIϊοζPŠ”τ§λψ$]+w₯κΚ2Χvž6˜_άV8°SΥ64Έ ‘U }d{«lφƒαv₯αoΆ{@ν@½7ΌϋΈΆ³ §ψwώ γ’`fCAΗWΰ+:a{iο1η]ƒJ³ ΥηΩ+dŠ€‰Y³Φ«„lό&ψ wΈΐ‹)$9bγz…:§«$'α,b p 1ΘͺΡfΒ-₯#/JFŽ­]ΨΤTιx½Ν!4Κ4Γ"‡ΓB₯Ε\΅’ьžΎΰέFαjΓ«<½εΗ'Ζ$Ž‹*‘ΛΏοIή\ς~Wςώ%ᅵAΟψs/³¬~Οο·›eŽ―ϊŸΈͺ‹'@Uc=ԝ£I!]­ WΑ€eκž‚α4 #Œ"ϋtŸƒΏ"6χ”Ώ¬ΐ] P« GΕη(ύK k•V­΄jεΔμPΰ­θεV–΄»‰I Λpa)Ι‡K‰‰+…δΤβ†ΧϊΜΩώv₯Ίj¨k ΌΝ¬VC‚Γjksυω9\vЈ§·ς`W+ΡςXV‘JP¨Ρ„LȘ[]¨cμΙ΅«’JόšοΗeθ”TG0°Θܟ΅’³ζ™}ε ΟHqψLρ"“Τ/η¨cF4?ά»LΔ0σ  &΅«l<ΥΡo²άFΙkAΆΘo}πι(δεμ*XΑJPH΅Ν}•™““ic}Ώ ΔΥ^Ι¬½Έœy“y8JŠcβRT9}¦ρrv`‡žil|MΖH©g2ύM{ώŽi_—g¦uμQθ1Ÿ:ƒω­D<ό$ †ύ&€ΣXUFΝT ίΙoH:΅Χuδ©LοξJQn>€ͺž³—MζΫTςi`NN ·’š9ϊΜH8žW:ž£Β΅vΖcj²pˆOiJ[Jb#W­<(¦όle:ϋŽέ"Ϋ-ς€ΆΘΛΒyΐ.0‚β ±ύΖ»aŒ’<Ιk¬,l"$―벊½‹5όqΊΜ&_Ν‰›x7>΄{ΐVΡnUΪΘ!:ΐ Ρ₯ZԌv‰eεά”²η΅―N^αΎ8„84SŽk{”ξ]Ί“ΕΑCyΊͺπK©DEγήsP†G΅­·†Υ¦’3Τ\gρJpo>ΜC²{-š™4/›ΦΘα»„8ž–Y™Μ―S‹γΘ%3γάΧς½ϋ„αŠΫI'νκ0IaΩιί§%οΏΖυI†ψΗ™#ΛαΆίΤ,υqIC_—Ό=σταΞΎ(δ cžλΖ37ΑΨ*'?Ÿτ²F Κ`Š”*“% 3€±₯ΪΪώ\}!š›s€ŠΆ2μ s©ΛΎ΄‰w·ΈSŠΆΚρ–©Δ™Ίψ™’΄Κ$·(_Ω!vδΩϋ΅Ψ °‰ΠΝJc"ηΙ+ Jγ—@bE¨x¬Ž½#URuΛsΗΨυ[³άFθ…Θρ1ϊ=κAœNFκ)d²\GΗΉ\‘°Q[γ0Δb‚­šxh‚©ά¬΄tœB\pP`ž}FŸ|Fβ`VΈMΈΒsνq)Ξdΐ»κe'-L{δ΄#;WΉNdf$ #;‘α;—γDFp†U©Ο₯ZbΦι±T;€X ]1’ΘψΗ\]KΩbh~%Μ]*ψe8―-ɞr9Τ"8βC Ρ-’jΓΎ?ZŠ΄˜\J 2Ÿ’PπNλS’£•θVoρf•δA%R6d'd"λ#”>9•1O3VωN€ -G‹#ϊf3λ„1`ζiΏ[‘Έo…ι63ΎιςnjƒBζάTcα(…y[M;€φΞ{ΤfŒ£ΞICœ63H¨Fc7©ΌΙλdθ°ΚtO•ιΰ CE'Λ‚>^“–šUόeς)DίΑΧώ€`€£&kŽ Yφ°±…;αξϋύ¬4όœ±#Έσβ48E%P²˜Χ|ri‚G%’i―Η8ψΒ–ŸS"Ω:‰1υsζ dR€ZTΦ<ͺ±œw‹8£΅#ΫPŽδΝ―₯Τ?>-"Π Υiͺψζ@§ΊΚΦ5ώL y 1Α„—qQŸδSνHξZa¦8σ1Θ5#βuΠ•€Q‚!hήA&šΔ Τξ9Tό‚t η8^G:K°½ ΩWΊ5g[3~›¦#ώ`šΪΐZω¬•oςΧ$rμέBς«Rχ#W2QΚ±–d#DΩirΣ’™°46i+d1oLbιZΤ ‘ΧΚ™%gΒΏΈ₯(uW8§h̞ίγΞΞ°QζΙ'#όΝjw`³έτ:l5X™Ϊΐu€s^'€s⌊δψ›J n’,ϋ9<FltΌMι^ζK ΪZKζˆ^π€z—ΈΪh‚~T¨ ΜΉ•―${«/q §7/ 2oe―…欕ݭϊΏι$λˆν!‰m‚Ϊςoz މΘφΙt\4šŽΜ™CVατΎΌS SL…NΚ [νn Γ]δ’Θ<΅Pͺ!,]/Χh3UQ³u# ‘/}7±ΐπ(»^Γ^²b;^Ώ_Hn€xI¬ŠS;3tΥJ…™©kΦWe*²Π5 Σz :SΉn}‘δ;Ν|μQu9Sί;η…·±8EV%σΜθ?‘XξJ,†`$vώΜθ°P™ΞΝN:ΪτέΓ¬#R^ψ^/Μc©>N΄¬–c΅œ©$ZZΚδfδ2#?ο $΄³εχRΊ`@@°[ΫΉfΩZZt·–υl ₯ ΄΄Θ8ad\ˆewήPΛL&œŠΈ›œΙΎΡ&žBp qΔƒ J=Γgυ,πl#f·aŒ5x­Ό !/Š3οMN§ΨοFE•‰œoώtAΜΖx½T3r ή7V(j9wΡ.AβtKcOudOk¬B3­ΣΝέcβ«…ΧZŽ]—nvΤ»LmΞ KΥS ¦Τ*VR’Oρ•Ί5«Άθ,οΧz©Ε~‹ύ―+μgdŸ2.£¬οι7λ2ρ4Κ₯θs’σΪ’ξeFΝ7υQ·%‡Σˆr~&S6ώdRΠΠ”D¨Ϊ”ΙΒ{΄[:›–ΒΚ’ι€₯0πΖ8+'t˜_tQHφxχƒΛρύτβP‘ΌζMβ³$ς 5Ԙ;Έό lκN‘Πΰ€1RΑžΊΜρ±ΔlŒ½ˆI±2 ’q΅œΞ}Χ²/ΛΎ¦”Uis«+u=Sή6Ιά:Vš[r84<¨Or Ή)9 ΜΜΨΆLO–ωρΚ -#oή2Š†Ρ¦'@ŸœΗmG 9t fουΩΆ[‹·ΣΌxc0zJwώm ήm0Τι[б3•Π­ŒlᑝMςiJoOMΥΆ~κχQΪμ ―γD–, LŽbUΦ@—Εqζψžφ«`ωϊ+jJ³Vn`Š$$c]₯,•L;°]¬=©ό₯.¨χπ’j²™^KΖ{―ΜnΎ 9Ζ4O³θ(υΓσ¦†Ω¬SΘ±ΙgNΩI’lDιψ.m­|Η> ΰ:ͺ¨’ό·~\θΗ/ ή±ŽΖ8¦u,χ0€Ϋρo2˜€GR- (‹€<―λ4”aKΡ€ΟGŒ,ΫυS7<Œbj0ž0&Ν™°Rš.K$ΰƒ6`š1K§Β²±sΖhΔ0—[“Η7Fπ"iΝ-Šέ²ά π‰'ŸΣΪύΩ+έ“Qdϊ- Žάž"aκΰέM†%|,Υda€·Φ„ qšέFr ~EL.°₯K9S’Ω­ iS4ε·…§Eτ/ ‡σC‚$ΐ2Šόk-E~>•S,±Yb›ΌE/‘/Tη™ξϊλ8UL 'iΝb“κFšET–’/Mc (OΌκsρτ 2ΙnΝχξ^‘,–žWεΥπ7d•wυiώ¨PΔ?Ί‚w;ςJ4Νζ< YΥ[fSŒ]κΦ N]ΉrEw‹‰{šAyΔΎΦ­ ‰ °βŠ`‘)S.Μ“ θg…{¦+WT^‚ζ»Ϋ;˜π]qηUh+hB{ͺ}§ρڜ¦φ`ν₯A€ΐΰ”ΡΝ›7…)>γtΪ=@˜έUa:Έ2λΊ9‹ήŸφck0Ψ«KWΈ/ΜS}ΐω»^:0a {-Ώ*?gBύ„>₯ΤYΖ(fοLGelήFedγͺsάdUΠ^eΕ»Y0Ήφq\o€²ƒ€+ωŽ<#\%1ζα]\ ‹¬K― Έ$ώ¨¦―9"6HξŽbξyP{m‘;˜8wWAΔΖΡ΄E+«ygN#‹Ζ—›@Ζο²_ΐex±Οy—™ΫώŠ–ξκψon–ςέσ-[Κο0•ߝ’°Žφ}:'Y 4žiFsaYΖΫ 8LξΘή„λPθ ϋ#cvΖ₯ρΑΊ€νRμ΅^‘–'Η (Υd@ψΗ»D˜#+θsDl&δ.£§θIKωώ†u£±›Φ)8žΑ¬lWε.E ΖbQ)ΎΨ—TήFΑΝpT#ƒH±ά70$ΎiiΡβ”h‘>τ>4ĈαΟ αH˜E(!@κͺ ¨#ΐHͺσθnϋ1θγ;·KfΓΈG|ΘdTtθŸΌϋBΑp%΅,Αef²ΡμΡ’‹Ξr«xw§κhLΠ©ƒO쏝 :A°]Aΐͺ‰Ο‘ΡΙΜ F׊>$eΚUΗJ +5nαιΈ&-ήΐΫ”F0‰.N£αe{Ό{j#W―XZ°΄0I jUο }r8-!‡Xθσ Ξκb ζ9ξΑΟrf25Y₯‡€φiΖΉ;nX_ˆ*ό‘ώ_VXΘ* VmJ‘'Ϋ2Uι“F]’¨ΰΩBσ-= Ξφ†ΒγΰΧο~£ š Τ?x ¬»)‚o_₯ΐά—[)΄7τy7) ˆͺζ56zύΑΉΛ[ΔtζΊ7k€ΌςΖ³εηκ{O/’ΏΒWπ—gφ>•ΉNr ΐεΑζ#ΎΨgτΕ·q˜V€Lc nRφ+β=v»~Άγ8z±γ‘Α₯γ62Ζbϋτ#c°–/Ά)d#oͺwΛC‰βG%GL3ΜM+XAHHK•i$)‘κτ7oΩbδvn αα‚δc|4ΈΒgiSε8JΣ»C’’_lŽκw9rv΄?ΎψšR»G™Ό– `$;ζύ₯½šv“‹0/ί††Έ?ΒkMS:€Ÿc’Υ9ΐ€²‹.ec²(Ί§J‚Q4¬Qϊ“G%“ oq{UήωBs{f&ά―Θρ"΄,Ψσ€άά`|ωTFΓΪtv…άηΓΝgMX›¬πc#3’Mž E”Ή^Ž!γ†hη "^όθJ²άΖ:Ύ{˜•Šύθς\Η±?3R³*\ˆδ·δ(£ήr¨H Υ…ΡtΪΎ·[Ίt6w—2sΑˆ_sΐΜΊbΓj °qπlΐƒ[‘5Γ₯oΫe―ευΖή’aχηκ]δ4‹OΙ¦b ρ›L5Όϋ"=°α#v3v‹Οq°·γp—’ˆΩι OΣ͎~Kπξ&O'§Δ„:‰X ήεŠΥ`œq±W=PΆΞ5ΌΨX “ jΧΞή •M0 ΛΙ|I#Ύ˜ξ„Ν/ˆΔ;¦†I― Ω£P‹·γ΅‚~'"Έn螴–˜Ω˜%7»kΏΧaŒiDσω83ŸThGˆπ-οFc‘&ΨL²γ7'“°M6²'˜‘€Φ8RΑ1qυ5¬Θtΰα΄)kOΎQ'C©u^6ΜXp€κ LΥwRψνο€zuΊφΓ²ΩΕUΝώΣμ-Μψ αŒŠ΅ei¬4…PΫ…Κ*saΠXrB?!R±HΈOΗλ6Zž‚Σ]bh[ΗέRΌWwκσ.μ9θψ G†Œq§βυ‚ήn7†2 O>‘ μκ“…ϊΣ @+αΌVzΘRΡ§ίθ䝎°€ϋϊs‚wϊΣxJΔdcΧΗ%}EΧΈEnΤΏΡvj?MJ˜Nrπ#Ζ}Λ1-ǜnj@Ϋ€½hΕ1Ο™*t΅έϊ“Ι6|L@=Ώ,xχŠα»_Όϋ.CΤV…’ΖC:=GΗ<=Ÿd¦β~f* νOΗšι€•MfJf §δW΅˜@)υ€?Pвlpδd|ΑG’ξό’ΰέuΑ»ΏeΊs_ΪΔ’ŒΧBΆOG΅L/IψΏ ή½,!’:Ζ#”Iθx‡κšή8Q;NΚ2%€ρ0Ο)‡™­šQ'£lΩM¦1ΔY,dM~Xπξ?$‹€σ(q"EE#ςΨ‘sιŠ"½ŠRΜ=в ά/ιLj¨ΰ˜cRˆήŒŸM›O’]xϋ ΨWΔΏRΌK©ΜΖΠζ^NΪ.Ρ5cΝ·~‹=rKΛgRηTέC• vh’³?*δκ€ψT.΅KP†M€Rs€Ν»Š ˜OΣiSPwF;ΥflΥNΘcͺ ΅άε…Λཊ‡ΌŠΝϊ³}·›»)™hΖ΄e}ΔΖ(tΔ=œ^Γοb5ς²ήνθ·i:z"ΩΙΔΫzd°υΒέĜ ’ΤR•₯ͺ‰P„tuXWφφ—―ΦηW*Œ,―&?k‹σn=rη#·κΜ#>o"δ„RˆΤˆaΔ4S-1EΜU-Z\¨JrδŒ…k§EΖCΘ8₯I’ƒ7ΉΒ)ΙPΗ›‹Ζ—TOdIωœΰέ·Ž>°Ύ–ˆ¦ΗΡS†hˆw†W˜»R)A'Ge"‰Υ’=£bk)σ@ϋΎΰBχΑcR]`©4­ Odχ–Π&·?Hbb,“·Έwk˜ό’£ίζΈ=Wr-ζŒ™ΩttYΡΆ'–b¦bΝY‚„³džBƒΞJ‚έ2eLΔi˜$Ύ˜_€ρ;G-ώ[όŸF<ΊE0‹`·.9”ζΌUk—ΈΏΟh$_%GRkκ 5gκFE^‰~FξZtυj΄Ί­¬FWW"πu%Ώ¬D³+`+ 6³+όV"sΕ4ϋώ15‹ξyX€U”AŽfa‘y'_g29—78S“!φοЈM.L½8§JΘ™Ν¬M{ςkBvvmάΝόΣ Ήϊόš{1r/^sΖέάο2ΝmΫ-ŸΥH¦α–€ ž_5tK><^“‹ Α¬°c f:c}5,’Y_ ‹z―#_ €TaΤ’H3(3šΑ‰Τz“έ»PYG%2Ζ|·ΞK)}lO‚GJΜ|οΞk{ίIέώt,₯1{€e)Μ`YΤ{}`Aά3ˆυ<ψUWε†\4PŠΩnmmΡ)Υ#·T[sΡ]bΞό’3ZγΒ֟bZ'j[iŒMΌQάĞI†wΕ?Γ4ρelVͺΈ`αh5rλΡbdΘ!Ά2e„ωh/ψΕ§3θ.°R\8;Χk’^|%.ώvΩ½Μ{Ής[ ΐΆόr|:[Η{±έυ²SBl¨ζ56zύΑΉΛ.@F1grέ›5ΐ›ΌςΖ³εηκ{O/’ΏΒWπ—gφTǟG‘Α@^ P;φμηMΞ|Z}A)2Œt'QTL›ά- ŠΦΦ.Χ¨*ΞI&΄ Φ½υ솓KOΥn~ ξΤά­uΐ ·x·r#@θθRΡ&θΧ–ΣKδ==όSγ›‹kmΔ7l€έ;•v―ρΠ½§žέ?λ<““v°ΡNvΑcοŽ€ΔmΑik9D‘/Ή‡ώϊΕW½V^¨W«Μ_ͺ‘όoN©Άρ\λέχΤ!ωξπ7d†” ΅22λέy‘”ΐQi²;!˜SάzvOežΪ$ΐ4<՞$JOHLΘπ}υZηωz5‚?αoU§ΚG HΡΑW»JppΜθ_αY6ήΓ’s­€$ΖΆ!³Gwt%F}iΐχ±fXι{;Τ]ςΈ9ά<έτ§Xαΐο’Ρψβ=oANϊu΅Κ2―PY#F7‰o*H cš!ώύ_…qvΜ’»η”άΦ‚ώdvA=΅Ϋ ˜lδhKGά—MΪοΖΌώ&ϊΖNΜΝ呬i -Ήλjθ9LΧZΤ£Ι¦δύ§ιΰ°ΌΪΪά~}χι-ΉœήPV&γ*·{e³Ζχ‡3€8β;NόQZD[²r"$ΊΓD‹•sJαΰυ7‡0) cŁήυƒ8,-«βYΊ2WͺΞΞ₯2―"Κf'ΑDΖxΘOa1ƒΧK¦‘ρR&σζμ’° †ύfœt"»VwJΠιΛj&™c_'λχ[ ’¦7%οEςΎ'yqΙϋ?“ΌίQΨ*Μ[e‹ΐΈƒ΄JΧ’8Ά9—ν₯ίΖτρtŒ΅΅=7¬λxί^|Dγ9.š•vJ§~Ή [·=ύΊ}–°§΅Φ"9­ΣZΜοΉžίmΘmΝD"1ΧrΐHω{(#8ΞΒ#d~₯ζ v υŽ ύhΙ΅ΉcΰŒW ’vWV•y‹)_iΕUaΕξ ϊ„ΰμ\ήCόΨ Zš™ƒξ$rύ…Σ3G ͺl\―ζ‘Ύ'i£Q’€ΌΒ2Z‰ψB‚ˆ†εc^sφ„IσμΩΙ{Γ=i·<Œ/&£! 'MdτΤύ‚ΰ›Xν$ι Ψιh„hŒΑΨ!=œ‰ˆj,εsΟΟjZYu)‘ΔYM„?yε† ψ₯“½Ύ;ΣfμΡΖ6έ²qVš]N„ΰ_γχŸ‘X›[’±D3ΉΔ(a: ƒ?ι(*•F¬.Σ ‰NΦςγΩDIOΕυΝp­>"€BΨα %‰υu PG7οώ„!Hί 1KΣ &ΥJ± *ΊC¨–!ΐπ―ίΛ\—*σz+ο9CIB+υΌίOΨ*JΛ5μ%)Οθ) ν[xƒή€;uZ€ XG€;všš΄^k:}{D,EEέ;—v―˜4bϘ±n΅[-ΏgBP#υ¨f>.…Ϋš…ΝœS™?¨,aΗΖ9ŒΩκδΉ$™ό²Yϊσeeδ™+η]^~° τ‡ζ špΨ…ΏBΔy3LτRv»cLχqΥ•ySΞLWδ>τ€ (ΦώΦP€ΑΦιx¬¨‘Γ™όsΩh΅»’qίqλu]h¨γξ"³A6Α£†Ѝ“¬ΑWΩǟ1&:½-ώEA8 „ώn―Κ§Δ$dT$ι‘ΣΚΟ‹ΚuGΞAX±εk7W,‹8?­ 7^‘P³aΎόωIΏ!$Γ)δ'ε8Ζ wΟέ‹άύt^ΝsΌŠΪΈ]ržβ•A9OcΊΣ/HyΏ)™”ΟηR €ϋΠ2ܜiΩΩ{f|{ϊVœΣΕζ°έ§²"ό•™@#ςš'.ζηΔ£-φ Ώπƒ·v8i80vTAkWbσWgE“§ΓKjV§ΓΣ§\™ϊJπnG^Ι­HκϊkεŽ2Šλο(wΖΘϊϋΒϊ;ΞωύI“ώΚ ΏοpαΚOMdξyvϋχ²FJϊŒΌΉβ­…Lg‘gΊb“½²σΘ*ΰΰU€ι֜"Μ΅T6('β+)) ~‚k\γ΅yIΝΙ1`¬Ήρβ@˜…“ΙΌBvFΚ'rω^“tJ&ȏsπ9hωΉ5ΈFQ¨λ~+ƒIΚ5R ΎκΏΛ¬'%u|‘.ˆ%f)>7Iΰ±HΖ1„AΑ]―Ψ™o@Η¨ΊυŒίΎfζ@³ΥlϊΚΉ‚ω σDγbΘ”¬€μOUB39©βθθT‘NΞߞΈ›šdN Šq΄Y4Ÿƒ Ω»¦PO«ζAΉ:N—JΞχώH>Ά<&gz6€u΄G¦Σr”eαI sœΪήR/Εντ(πaJy£―[\†ΩcVΗθ¨χ–r,εά Κ1ŒΆH*ΝR…ωwΠ’„φ)ύOꃃςυ£γ-›~Ξίν䁨WΦ)ΰ€‰θΨ ΓŒ Œ•”|Œl©t΅>Ό–‚nή“τφhΫlMΐiχŒΠΒAp0‡ΰv7p4m°²e$“O*e”hYΔL,fΖ₯ŒέΎ€”½2έάD—X0z<1v…½άp{ΛΨηJ€4rηΉύGigΆΫcˏaICΒ›•ΗzžόώBŽ]8CΙT  ZΘx“½bιΚΥ3ϋ0ξ΅²#G8ύΗ€t(?„ψ7†°)AρRu)Λ:Ξ^(Ε‹sKκ}¦΅}*NfsgΜ FŠŸΦs^ˌ—J+ϊ@AfδΕ½β‰ΆςE« X¦u+”Ρ&@•‰βqΩœΚDΑԐ½2Aν Λθf;ruόΗΎηΎΊoW T,§ΡxkΕϋdΗhΙLδ 1v°"λ[6X_Θ†¨Γ<Υ•¬c<Ίϋ’ξgφŽ”ψ¦«Ά£I"³Žδ™!L %0jγkΑ„ΞΤΝχΌ+οYΡ5n#P{£PΛ„ΨΟ0cn™!Ωp+h&›9olτ‚αO%O.€Vβ,ψ½΄Οά°nSKZ9<γinL> ΙΦζSΆΈώϊΌ\¦4Υaρ‘BJSqΧ9^!ηm6A²γIݞeRg0δβνΝ’e’–‰Nς²x5gΐv`‹„ 'η¬T₯7vwLg΅2H+ƒξΘ΅ζ,…+3‚₯π ΐY /η±*LskL?μΩ‡ε]Σ:ϋ’PAαΙ€>½ΐU…βZ–GΈAŒ’ΧSAΓL'8zηPΖؐιCΞ{―Γf7ωό “± –Kν*C++ cppcccpcxxc++Chhhhpphxxh++inlipp source.c++-\*- C\+\+ -\*-#balance_parentheses>{{regular}}{{paren_open}}{{regular}}{{paren_close}}{{regular}} basic_typeseasm|__asm__|auto|bool|_Bool|char|_Complex|double|float|_Imaginary|int|long|short|signed|unsigned|void before_tag2struct|union|enum\s+class|enum\s+struct|enum|classcasts4const_cast|dynamic_cast|reinterpret_cast|static_castcompiler_directive'inline|restrict|__restrict__|__restrictcontrol_keywords[break|case|catch|continue|default|do|else|for|goto|if|_Pragma|return|switch|throw|try|while&data_structures_forward_decl_lookahead`(\s+{{macro_identifier}})*\s*(:\s*({{path_lookahead}}|{{visibility_modifiers}}|,|\s|<[^;]*>)+)?; dec_digits(?:\d(?:[\d']*\d)?) dec_exponent(?:[eE][-+]??{{dec_digits}}) dec_suffix-(?:[a-zA-Z_][[:alnum:]_]*|(?=[^[:alnum:]_']))declspec%__declspec\(\s*\w+(?:\([^)]+\))?\s*\) float_suffix[fF] generic_close>)?)?generic_lookaheadi<{{generic_open}}{{generic_open}}{{regular}}{{generic_close}}\s*{{generic_close}}{{balance_parentheses}}> generic_open(?:{{regular_plus}}(?:< hex_exponent(?:[pP][-+]??{{dec_digits}}) hex_suffix-(?:[g-zG-Z_][[:alnum:]_]*|(?=[^[:alnum:]_'])) identifier\b[[:alpha:]_][[:alnum:]_]*\binteger_suffix[lL]{1,2}[uU]?|[uU][lL]{0,2}macro_identifier)\b[[:upper:]_][[:upper:][:digit:]_]{2,}\bmemory_operators new|delete modifiers={{storage_classes}}|{{type_qualifier}}|{{compiler_directive}}non_angle_brackets (?=<<|<=)non_func_keywordsaif|for|switch|while|decltype|sizeof|__declspec|__attribute__|typeid|alignof|alignas|static_assertoperator_keywordsEand|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|xor|xor_eq|noexceptoperator_method_namep\boperator\s*(?:[-+*/%^&|~!=<>]|[-+*/%^&|=!<>]=|<<=?|>>=?|&&|\|\||\+\+|--|,|->\*?|\(\)|\[\]|""\s*{{identifier}})other_keywordsmtypedef|nullptr|{{visibility_modifiers}}|static_assert|sizeof|using|typeid|alignof|alignas|namespace|template paren_close\))? paren_open(?:\(path_lookaheadC(?:::\s*)?(?:{{identifier}}\s*::\s*)*(?:template\s+)?{{identifier}}regular[^(){}&;*^%=<>-]* regular_plus[^(){}&;*^%=<>-]+storage_classesBstatic|export|extern|friend|explicit|virtual|register|thread_localtype_qualifier)const|constexpr|mutable|typename|volatilevisibility_modifiersprivate|protected|public-'xΪν=gx·±GRr‘νΈ;Ž‹LJΆtKκN’εJ‘bl?§YIœ8ΝαQτήέ΅ΦρŽΎ"JζJIμ§:±“Έ€'NwzoNο½χζτήή―χγ½μX‹ΑbχξHJζω³pΔΝƒΑ`0 €d‚Οi$]oΧκ΅i»6SurΕ†]Ϊ㴚Σ[ŽΚˆŸγθb΅^Ϊυ‘τ(RX?IOΰJvΣΙ•ŠέΆBΨ’ž%ΐ–햝kΆνR«έpšΉb½Ό?ΔYEK΅8₯ͺέlβ ݚΫr로]i9œ[vj-·β:°ΐΥ$Ν&*0Δ?‚€9->GJ©>;‹§V 9²ƒBΆBhz‰Ά§Φž5γΜΡ$ݘ€Ό} I·iΡ+νZΙ§#€ 7γԜ†[ ‹:†€ηj‹š΅χά¬ΣΪ]ηX{¬Q+fλε ξJΓz†ŠA#τοAΙπX'Ÿ οό£€qiˆ·βHQ-^πΥLlN"©•¬Δ°€“ΤBkœβœb€Ϊ5LΊQ+N5R r!ώiR9>“φ’]­†ΐ6frΊ0‹‡(Ε‚s¬Υμ$]‹7g7μYn83)&kΨYI1Y+Ο&ι&5f«a»U·6“k8¨ΫjΎθΰ2œGχZεΔET‘$mηΔΓ²V ΖΓ²v ΕΓ²».φ »>φΒ£$«½ˆΒž{1…έ υ­Φ‹v•¨nΪa!£7&@bΟJ£JDŠhjΛœ•>lΞΊtDRjΈ(U›bAΉXPF@^šxΠ°ξΝ:(Vν«q«ŠΙοω:(&ΉΫtPLf/Ζe΅ΗΩ?_o”›9Θπ½0γΒEJ `h²bΉXi€Μ:³E§Ρ$3]*9Νf½‘»>2.I…Ξˆ½4:λΛΡT謓·§Bg½?&ιfŠŽ-V Ζ(ΌZ Ζxψ8-ιΗ+' Y@‘ j8s:ΡBh΄μΕΛΌ$©ΥN=7η4|†ΏPΘ!SαΚ|I‡ΰ2gνR£:ΧιOLˆΘό$Ιό#J “'›Φ*ώ§τ ±ήΪΝ[Vךb°–=ΥƒIΡ€)¨‚)“­)ΙdQ`4ΪΘT(»M»XEΓKZ&†ΩΥiIŒSӝ–Δ8xI-Σ’dΫΡNYkK1e¬ %’ζL hΆœEƒ™λ›r…°¦8šS!ι֘BœZŒΈΝtXkΦξ bMsIš5,H–΅λΣ᳆μI‡Οθ―’t“!ΎJΠfΣ—ΑΪQK_kK€bΚπ΅a€'ζH:l„­βΓ $·Ψ\‡p =γISΗΪέRZxՌζΛ°Ϊ6IO‰€E Ο½$7\wπ†ΆƒΗr>qΠσ$ν&vQ)ŒΓ}$₯; ΣΣ³Ά[£Ώξ'ι‘μWΔλF‹ώ|£d‰‹Z ΅@RΊβΫ‡τG€L]KΘHJ=νόf…9(•χ/°4ΠΏŸF£Ωο5Τ ΰιR§I†‚=Cκ4Υf…½‰€ƒ¬ΌηCρn–”aβΝ'ZΠ3IΊ((ΊίStfž–dmQδg“τYΪΦ‘hΟ!ι34°ι·PΡΚQl QΤη’tΔ•ξ(Ρ"žG³€"ψ$Šσ|’žαU …A ƒ₯'ŠφB’h‘}Šψ"Ι LΎ…CKΊ5f aHa_3†δ Šχ’˜1»SC ΊMoe§δΞ"'h³]©Έϋ(Τν$₯ΛfΗnTχηœ}hΊj6QρLΌ”€ηB€„ήΗMq_&Η(nΡ©ΰ₯ ωε$₯[ Ϊξ$Š/y9x8ΡΗ›@νN’ΡTτά%z,uΝw“”ξ‘*^!+hoŠΒΏR»*xκρ’8―"ιœ`ΉK1^-ι'†΄­DQ_C“eΤζ’MίQDA_K³ePՎEz$’&Ϋ\χυT­κω7HζF`ψΡ_ο‘XIφ4ϊϊ$]‹!«ι7‘τTSάχ‘ΐo– iG†‚½Egܞ y+IιFφngŸ­V+o#)5δΈ¦ΜΩ­έr{ή.Υ‚³ΊW²“θύϋRΐf§Δi“‚‚½‹€ΤrΖφ²J;Ύ[p2Upʁώ’ވ}―€Ϊbv(Ϊϋ$ΓЍϊ<zΏΔu T3λτ’N‘ n­‰ϊHݜ’τ4†£Ϊ• Π’† μ₯§–τ"δ-§π‘ ‡(< ―>JRjz3w6ψ˜$²Ώ›Β}\*ˆ-e(ΐ'€ξΌΡθ>’υ ρτŸ?)URGΎY»U>%©/‘ΖOKφа^υιΘa~5wηD΅χ’ΗβΉ< k%Ή„Ο’4Ÿ „pΥLKωœ€όαR’ΈŸ—ζ4.DόHΊΡ5ZσIz έΠαNΛϊ’4V…²€Uα—u\sͺˆt§ΪtΤM I³FΈΡΆUΗ"~TΗ~M2x‘΄―λšφ‡R}}C'Ž.«3m‘qί$ι…©J!’J ϋ–d …‰<ψΆ€φ€hΏ|‡€Q!ςϋ.α»:ςδύŠτ½ψZD5ώ}ΙψˆξKPΘHv•9‡ –‹ΨCσύ»QoΧB#β‡:e¦έ5 %όHΗu•―ž"ώX² Œ<γω'$΅@dΐL ψ©Nϋ+όΎοgΊψY)ξΟIΊΔεύ«λΊΞUϊU)ζ/% QΐŒ‚Š€ΫTΰ‘μδ»Eδ•ΨxQCΧ$₯ΏΡΚξ—ζvβ₯?†€ΜQK\·τοί’τxιwβή’`Ώ“j!ž]ϊσοIΊšϋ™‘π’Λ(Ω9”μ!β捸,$‘Kΰd“ώΟR‡0Θ‹ΊφˆΥφW’>H„“Xώ7©½JΰΙίΥ5ξ΅.zχ’RC;phΫUΧf ”Y"ϊΌ)ΨΏ$#/RΥΏIϊŸŒϊƒO+τΛψ³£O6‚πΤΤΆ±ΞΞ7–Κ“e[Ήες₯‘‘ $ŒΈŠΞ»₯’)Ÿ‘έmη}“ΘΗε x‚θJ';1Ύ«Π^ώΟbkΒΓΦ„‡jv+V‘h1ψώȷ>Y +ΪP’mΙύRKNZBV”rcξ2’¦ϊdM©"‰©₯κMΧ œ<:δ䀡}Σ”Šg”¬Ρ>y>θΓS1ZK€#ͺŸϋΞγό–<"$Άp%ΰSxάΘυ«€ΝίpΐD«eξ)ŠλPΪnV5ΨΫtάŠ“…Ή…¦§‚ύστΗp‘˜BƒitΤ’5Pχž―ZϋσXΫpA¬fθΟ{yrŽα„oWaΎΠœŠοΤgf4Rt4PλΣ€όως?ΖWΈ13»Χm Ξ¬zs w/šyPZo‘NuΚή\»XuKHΡΆΠ}&*φŒ“§SΟΞ°³¦CΦd'FGGQ§Xθάs~·a°aF'χBs̀q¬evuδ‚ s“Ή†›z7ͺΌν’’%Šrθpy·†ώu±D)ϋύ&B˜΄„πΗqό@ΓϋtiŒ₯uyzRΦάM}qŠB_°z A}KΟΤΕ-*5?§+θ€+mΉ΅T­©³ΤBΤ%™47–ρλ²Ι£jήͺ μ. 5g°ΜτόKΛ XώX¦ό—ηΐι$]Š o­œ½P χNρ\cωR΅}jd{ΌP‰ΕV (}ΚΞΙ*“΄~œΓMZά>έ mύ J©Κ^x;/Έ›"z‰‹™5ΠA±C±ν4²{ϋŒHθΣ²\ΣB}_u© r΅Ησ•Γ’£I(Qy]Ά[Ί»9¦Pπ\MΠ Ή΅gSΡ­ήL7-@U=ιBηϊJ·{+Ÿ˜βzΉςaUwS€T+Ÿ°"ˆυ·υL~„’γ•½Z’‰“ΰiΪΒhΝ"6ψ+νrƒ@±Šϊ%ϊhzž’ηιtΎ\G+$μ«Œνο9μς¬’1Yƒ…؈Σut(θ¦C½o‚q9°$σιJ•PXθ}́τΡαgyτΆ…–a OT‘’ŸVVι—°Δ„3‹IοAΎ*ΔL³zΙNξΚ’UFvbvτ\ΛΛ¬x/Μ3 Iε~Γ@3ς½A"“ύύT§…ΆB`9κ†F8 ιΙΒΥ‘Φ & _q@tΏJ šŠ+ξ­»eƒ…i¨ψ7$γX* “ή&―`yγVΔ΄es cT Eο“Δžl£εiP‰¦;SΓϋΜvP5lHο,Œ›4: b%j5nΒ ˜€:ύʎ'’Ώ[£€σu=ζ&›pΏΨ±LX˜c·(»ZY£`’<δ“Ν¬",‘S«o@jMW <#CIW“Όρ*@ˆIܜ‚'…μrbJ} ©΅‘ΞY²p˜±d€κξςΤσmο­λυeΝ‹`ן›Ρ¨χE!8”]}½mÁà +ύty¦ŠZŸmΦXΊΙ–Ž»\`ρ?΄κ₯\ΥmΆD΅Κ…μΡ^ΈϊvΎΚΫΥs)5ΌρΤ91:™ή|ή ήΑ‘ρ±Sϋ{|ύ9Ox;v 6lπ θ?―0Rρr9΄4Θν( Ox…,Z"& SήΊu¨LΝdmλ ή„ι‰γ.nƒ5΄JOb, ΡW›WΆQ`ΊξΉμ¨ΟΥφ"ΪΔŽΐφhχφ«3K?X-ο.σΧλ˜_vή―2α=L!ŒT#Ό―ό ™΄MΩΡΊH©e§5»Ο«K¨ͺ7g€–[ρ&μz…ωμbR\'°o1ιnCύgώΐ/ΜwP6ΧNy·Ÿά[B=χ 5TΘ Γ›επ?Ύ#ΓCyZr‰+ˆ*”]ΎQ1ŒFπΠζx…bZΡΔΧΈ(97JΉ^0±>Ζ›ΰΫ2έ"e„»³yΡ0–έ—ΒΟ ίx«Ε­ –b­;=]š«Ά›ψτ—μκρkΰΟΤψΊκ9z:˜ϊΆρ™ΰF½šwgηꍖΞΥsrˆv-^ξλ@Οί£ˎ’./Υ„bR.93@^”1mΌΉ#fΛαnEYψ³Όg,9,Χ―Œœnηηށ­%Œ0ΨL’ΥΡ]Ό¨³6Έ@«.5QWύiZ©ήw^ν3 g…S˜4]₯β»1ώ ΦnΟ€”Βξιˆ΄1¨#z:pBQK±A/TΖγDJ4ͺ£€Dε­„k(η%εΐdGL£j|λΤΊ7:`!› Ή’Mͺήγ\;ΚΉ2Νλε9"8ΣΣpμς<>ΤΓO§*°ίεqΣ—,R‡†QtθlΰΔΔr‘Α‹Ιυ_2½ύΕ,KR½8+Η&ŽλJh@ί₯Β~@Χ&ˆΧ:4τ₯ξ$Ύ»ΥjΈΕvSO?d~Θά@«X{»άbsώ,™f(‹lŒ™š‡Œλz Ÿ’.ΥΛΞtΣ™ρΚΘδΰ¬2>YD½΅ίk·έ²C0qΚλŽ]χK­μ\W£ξ‘ΒΈ“kψά\ΉŽ―τγ›ZVΧώζμσΏ]οΦπ$M·δΥμ=¨Vχ―A©[Γ7}yψ0|AϊΪέ¨Ο£to +xΡΌή8r‘™Ϋ΄+N±]© mμ5*j‹]Ϋο!,dq§,ι( W΄;MΤPF2uΔŒιOšŒ·γ˜qZή\»Ε΅?±–Nu >΅ŠWTAs±b0<₯‰ί`ΊΏtUF§W…ΚyΘ#"ž¦ΊqΘ ² ‰cœϋo»ώΆ₯Œv΄€νΜΥ©˜ΠΔ~‡n”ΖίΈΓ{ΔLφέσw§bM‡^ƒΈ6Θκ9 |ΧS₯Z·[yξΎ[ž‘ΉCŒΆΡΙΉ«§&s#SώeœS(oD¦cٚ°΄b™ΧΔTΣπτ(Žž=B.Ε­νE£₯œwΡΌ3ƒπh ΛξŒΛ)Ήs"A“•3ƒΤdѭٍύ2; %s;DGθδωΉK§:€3G§¦οϊbί&ύΎ.Ž:še«©XAΒΙK:ζΔΉqT&δΒν:ε²Η.Œέ7Wχ1 ΡΓkv²cxLοΚZ 6lήuήψ؎φ)Ž‚ωrζπ€ &P΅~ωSœδ’UYtGΆ—χ MXbŒΠΧͺH>οMB_•3‹Ρ5ϋƌjhμRθkξη3ω‘!lmϋχCΚώέω&>f ΏΕΣ@uS6&Μ)kΙΫAΚh$yc΄ž$0ΚάA¬ͺi,γΪΏ—Ρ(ΐ―ΦΝ]šοΛυ.¦žτnš#ΣυTΜ©?‰(·Tτςψ?Z=…±ρύϊΛnI²tx.( *zΎ.»Ή0lεq΄ΠfKw‘‚—P'@Ύ†u ©Q…E£Μ1ΓΖ±`©kFdCGΆ Ϊ5δFπο₯Λ•vΫψ’c~ k}“‘z­λJκ&tΑœ7φd©Ϋi€O€ƒ` Κ=S«7[nΙτŠŒ΄Ρϊ}F\1‹Ίκ†vuT΄qgƒsk₯j»μτΊe’Δ/υ’KšΏ€-dTՌu»š)Ή†A‘„ϋAΈ.ΔΩ>-GΞ3"5bΗς¨"1ί­ΪΚΝ΄Q΄£ŠT“„`ASυΘbϋ貚aΘκ±ίDΟΔσ…δ!-ο;¦ΰ=Έ―w:ϋQ‘]§r8©Qη†ΟϊX‡Ζ}€†’ΟΞg•Ÿ¨qθΪεέQJ³&ͺxφ™²dEΥBUL'‹%πͺΘ"δ*„dτž=LeΤI'£•₯Σ—χ―Θβa*‹»ΣΙ’  ΗKχ ’2"±τ&†΄RgjV¬HcJiά“N«‡š4κ¦4¦5,V€4₯”ΦIi}EgfβM‹žΉδΊζzσ?aL Ž–/ΤΖ©zΫ™HCΏ#7T8D)άΦ¦5£˜.Ÿαi ’ŸπΜh+Œj°Ω‘ _ζΌκCMwτVVΘ/l;vcα2&HYŒχhΌήΌh0 ’ƒίςρ»4άTgΟ_h0‘Τ»TΔu;™ΑYφνρGΎιaE~»-ΈE1xϋNœ}GdΦ -οννxΕX 6)ΉthΖRŸΞš¨π―‹z―χbχ±jΆuβ[W UnR©BΉΈχ=Ζήz¬·₯ˆuT*wΏΈO₯ΛΗ²CcVwO^gŒ©θMψc_ςϊ'εΐ>ν«{ρ$τ“pR¨IμΪνjΛΓο6[fΦT€Iύ²yt₯$Κz˜¦,!œ]:Rτ§ήυΉY¨θd μΔ'>3Ӑ£ή–><9Ύ½09e%8Δ΄†q,ΰG]ρ"‘+ΞbcgqΣφ“©·$uUΟΙ¨₯ΙονΚ}IF₯.MChŽ†Λ—y@ώι)ξNηψ£Ε«2@ρςδ“―ic8bΰ' ρƒψΡ‘mn•Ϊe―ϊ…’J‹ή˜wh`œ(̏x££³_qο. )ώ]ΝΥ@IΟβiψ.γ«ζp  M!Ϊ>HύΉpώ¦H0†}φγz¨;ΐχ+ρΙΕ¦7†ίGήa‘2Ά[rΘRτ}ΠJ½1o7ΚΉ²Sͺš=κϋεKˆ*aͺβ;NŽ.$~§4ξ I¬θιάΟςŸΝs\œE΅uγΎ)a!™Z§ΖέΌ~D½š|χŠ ΗήγTθŸVi·‡'·ΦvšΌ*Ν½Ρ©WΌvyςό2\Τ|AΚτS|κŠπ¨ΞnΪΜ&¬ίœ QΞΎΉ†7ΫŽΗ3ώή:*(˜εN–G‡’66捍Η € ύ!₯ρΰ^ΔZΊtWΜG/rΉx,N+zξ#ΒθυeήΚNZS#ήδπ†)+x54;†ΦŸˆA–ΑτXβΏ‡δεt‘Ύ κξ#ŠΌη μ«, ϋ:"ψΉΑ³‹E°C†_θN:έ Spθ^¬4\΄)c¨X‘τ LΜ JqžΞˆζ!vο»ςAΟ4€ςGχ"6@ΰΏΧ΄κx‡Obό5yƒΧš8UT«θίHπΈ»χt™rΏ†r$ώm6ΰ‰!|›—₯χ•[›¦βύ™Ϊ·Ηνϊ !ΉΌμά4j · gHΕΏ…@›|¦jZIςˆαtΘx‰GHGO;τ¨ύ Jƈ- cu^œ>‘¨ γΫrΊzyύqΤί)qοxQ1c6―8ŒΤ#•V'3vέ*Λrq,P•Ψe$6*ΛΎCΚit’Nœcs±|j“{EθαYϊ{\XόZ8kΒ)δI<εBΥlβ*x€zηςBRΊ‚ψι±―ž/τάΕ¬ηφL_‚ΠP>FžGβtHš>ΠΜβMOc ܜsJ^ΊJpΑ=SΔAωαέ¬γaϋI‚΅&>ŠΥ€zη‘wΖ2όΈJΈ/ΟͺΌ\¨2Ν@ .1S‰jύ‰ςŸδί M­†§’$~>Ψf:ΏWμ9σ Œ€aΖζάm˜;M κHNζL¬ΉΫZsjΙΣmΊCΖάΒRs§&m»Š™ώ‡{ ~ΞέxYξ©rOzΑ„aΦΖ©π’σΣU*ή7htψΜΣ—ωoς_–Qx?₯Œσ~ S@ώ€όίωŸςω^JΞ~ğT‡ρχ^ψώ—o˜BSͺ½?G’₯s4ώ~ )χΏδCήƒ@~Ϊ H9@ώ»€όwωŸTiƒ±ρΨγGΨ\GΗ&ΦC07‘}ϋ—ωο֌‹U Λz―|a|»|Y3/‡ΘNšuk A4€πε1šIΈsDλ^|n ίeΏχ»jžΡ‹J–iŽ} ~Λͺ‹ΗP Ιχ ‹΅δb€51ZOPΗqNΨάse5γ5€’ΧͺΪΦΑΝυμNB§››Š[Β=ΕD—GΛΉΣ8ϋ"yΏΈYˆ7S_)ˆJ’χ΅βdtzŽ‚H=31©|‰«»!ΰi™ Ι°œΊ ¬χΥ±>˜ ¦Θ° ½fυ½N£α–SȏT«Μ·Δ1FΪ)ϋW.ςυˆX/τΝ΅6£‘°UόνβClg΅·sκr υI2ş#@όOζΞΊx†§“C!t:υi³Νς„VŸςίΙΧTβϋΆ§ύίΒ·To. '~xžW8| [y[!ΎΎ”§†Žˆ]~ψB6xjœO]wEΗgZ묎b©ΞΪΏ†«Χ3Ÿ€qλ'ω°Bp E½<)ZA[C94Y"&₯9°ΙΝ( {ο‘ψψ­AΥρwzάR+Υ«bďiPύ@μΜ™ΔθKΕ@Ήφ·σ%oOΜXλu,υ\LθΜβ18ΒH“`^ok―ϋ―ϋϋŸžϋΣ₯}d˜†ώFf6΄SΑ₯=φξh,§₯°¨&H[—ςh²._7 λζE±œ4αρ†AV€Έvε‘₯ξ?΄JRΊ—νlBΗtΏqiθNt¦"žξnέ,Ρ±‡3ϊ«Σ—Ϋl@Ϋ‘θq0•¦uαΉx†L7ψU¬XϋΏ™*kAΝ£bZδ’TϊΓί ΄Tθ[3ΐg1VQ+³‡Nΐμ›ιX ˜]^³›„ήY ˜ΥΙύ 3:w8Ή«`!q΄•3…9‘s–μΝUiyhλ(nYx¬šΪΐPș܍_΄PH(΄K/έRΗάΈ1fΞxθΔυύδ(U9‰<Ή±ΑjώgKbΚ¨ΨAΦ‘Χ9eC7$jΜ"³[ ?KωTƒ5֞0$Ζ©UΧ‰2§%…ΜΑΰΈ‚Χnf]˜1₯zKH55ˆ½€²¨,vD¬ΐŞ_4Ν~±ŽPπ$xψ ΥΊ(ας“όAQ'ώDοδΦ θ™έs2G8ΒbιX& α~=%β^d‚³‰Ή’]­ςχOSŒπΎ4έ^"JΟ3d—YnΙ£nθ4G Ϋώ£vΧ¬3[ο¨νΪ …˜ώA‘9μYƒƒρΖζ…)ο1f 2ϊ—cOμ»:¦C<x΄>­Zάέ|ΆLUπμpΉ[rμ:ڎL%¨MοΪdώϊόz5ΕΘKTžoΈHν…μL8Q―Υ5Πn '’Φ2y_F3!Θ“ ΅Αͺ"©—Εΰy+A&“KβFRΪ₯ΧGd’€cύKzX`\%bu§–μ¨ΐG3E―U΅l娀’Fγ]";9I !ωš$—›ˆ‚Ψ‹CW$&”/q)|(Nϊ“2€Φ¦‰MY‚mΘ‰-Ω H°°5y‘ηkZρi™ΠBΘNOΫ­VΓ-Ά[Ξτ4±™V=\hΥI|«θ–†uθ΄ζ< Σ遰₯lWΚΏυ§·‘iΈHΣ4Ή}η›=‰η#G{―aΜλL*ζ<ʘ9ΜΦ8 ΗύΒΆ5‰ Ϊ­«]xοβή~ͺόm; †B―’ 午‰e΄<ςwδFιΖ™Ÿβ-ΌEΏ²ΜΑΑυƒ[σ[7α’δ‚΄B2+47ψ²“dο€Ω;YQ Jpή€sεςELML(¬ ’€B©›VMκͺτβ+ΚΗψ…νD"4ˆφŒ―Λη―J YES„μlΕWπ?”ΣκήΡ@ψ‚ͺ­¬!5MVF6q>ξ΄ ΟH—ω=F:Œφ—ί]€·XgyΎ(€μ­4 ‰\†1κ*ΥΊέβMΊΎΥΐΘV5js%@κΠΟ@BψUi [’°° d(Oξ{Κζ6Ομω©‘‰ΙΉ«ΓχΕ6*hβNΘΠJ°A«#¨€#92Š—Ou»²Η‚•‘6w»²«…ΚŽ +σ™[ήΈ±ϋΜ|œPeΈψ)”G"š_Ζ}ΌΙ$%[‘{Ol]=”yά υ’ž‡lcώ¬•¦:R@nΕs+8 Η­ΤPb-Β#οΠγ³™nΩJwΙύšΞλπυ{y/ΘδϋNΪgτΤψ!ΡvύQsδ;q9<‡ηg(™3oUgBΦcv}F`u’‰ SθχSE½‹Γ--“#Ε_ιϋSτΓ₯k>ίεωjΟ»&V娔°2pcW6ά:†/l ΒΡB„א“ΩSεά¬]jΤ΅ζΕ2³„ά¨Ÿω?ς¨©CΔSU]M„1&δ XΈΘΏΗ έώηδ(M>I±έ—B$δΰj„Ϊ@Yίΰgψ€θνŸω?ς‘(;"‘tGXΨΈ‡Z…j $ ©3 O=q/$}ρ mTY+>X2 J4V’ΩξωU!εωMYϋ$ή΄]₯TχlΣ6M±ζΫΆ±S„0©ρΆd8©-αά+’ΉμLƒoe­sG—e¨)eΘhλŸηΔΛ’Σϊ#βέusΊ« _€„©›ΖΔαΧ5_]„ω’PΗ—CšΡφ’Ÿ#έ‚γmx?»~ιQ1ξΠ”°… ’£­₯?#ςLB4^hœΜ‹`wΏο†uL„πLPΩJcH/ŠA]ΊΔ'ͺZ`XΉ* ™‘7ω7ω­ξ ΉΒ¬J±φ K‘€©φ—{+Ή ‹Ό­όδΈιž2tCŒpΰ$τ›ΣhΒσ3_ΧQ|ο›GlR³€™ε¬^H,A0³0Ώ§6 ξF‡zα)™„cJ;t,δρ±W‚ϋ¬+“sc!Γ蹁μζΒ°•Gškx³%ίKο¬ ‘εά:/T—ίEvζ˜!να“"ΨcS¨Ρ²θ1/ω²ωvΝΩ7η‡Ζ7Νηκ•\•*MπXΙj>c»lfD=Υ›σ=\Έ7"oΗz±Ν}8]›Y&QΘΚ³μr dcΜۍš[›1bΘ ΎFΏ@[ž*°eDΥ…΅R΅]v<’N#1iyAρFΣSHŠΥΡ8 ιc‹Šϋϋ =ښ²`S&»K š·Όx‘žώΔ².W“(`φΜ #ό½ΒˆΰS6fΔ©jF o=\X1³Β ʊλWXAY1k̊N7σ;7ƒζ!ZoΠΡ mύΘ KS~\Ilμ>ip§τA“§Ϊ@ gΌ€Υ€<ω•”΄€Ω“8}!»κo@/3ε―ꌢΌŠ„ΟaC2ΤΘ΄Εp·έL.Ψ>³Ρz‡i»Ž ΫάC6 ΊnlM;͈ψ;G ΗŒ[v*kY–zBΏhG+φf’w!ΉB,Ί%Κζͺ]›iγφ$„€Pτο ΧωθώUn!ϊZ½R­Οη}XΐέQ(;ΰΒΒ†t…Qp©Ό£XyψΪΈ°¬³ueaP©œ5¬œΰΊΉ°€st%ΐ ·όΛκ ΉεΓJ%Ω‘ψχπ=+©8„ηΑ)JDv’N¦¬ I°3ΟŸ …AfΕ^ΆΆ+·ϊYQνήςbψΠZ(Ύμ’„ΌΣ•~wΘ€`ίΖCώ2dΑxΑK^₯α"'Ξ¬Ί%·ενuH1UQοΞΈM;Φ±ΛΣΘMˆr―RG~ίUΦpšh?©ΤB;Kτ+ΪX θψ]$‘±4pŸΩι΅/ρΪή­‰Η[ΩuΩΙ]ψΚ‘BapjaΛ¦­°L”ύƒUΚ^›QΩρ1qϋ1VΓΟgL'+μάn»±υ’iΤ9θΛΆσΡ—yό ₯DωOσΌ§p•Ζρ/|H„ Lρ’vmνv›š(`Jβ°VΌY‹Ψ²S…ω”—A¨JžLί‘NKΦυαYa{όyΤςŸ’F–8S&v·FO„T\­ /iγOΑχΎ\f¨!Zρςoyψr䦽ΔLπ‰4 5ˆΫη+v“θ{rϋL†²lαώCΚ§#ρN’ώ?ςŠyCchsource.c-[*]-( Mode:)? C -[*]- basic_typeseasm|__asm__|auto|bool|_Bool|char|_Complex|double|float|_Imaginary|int|long|short|signed|unsigned|void before_tagstruct|union|enumcompiler_directive'inline|restrict|__restrict__|__restrictcontrol_keywordsKbreak|case|continue|default|do|else|for|goto|if|_Pragma|return|switch|while dec_exponent(?:[eE][-+]??\d+) dec_suffix[a-zA-Z_][[:alnum:]_]*declspec%__declspec\(\s*\w+(?:\([^)]+\))?\s*\) hex_exponent(?:[pP][-+]??\d+) hex_suffix[g-zG-Z_][[:alnum:]_]* identifier\b[[:alpha:]_][[:alnum:]_]*\binteger_suffix[lL]{1,2}[uU]?|[uU][lL]{0,2}macro_identifier)\b[[:upper:]_][[:upper:][:digit:]_]{2,}\bmicrosoft_types__int8|__int16|__int32|__int64 modifiers={{storage_classes}}|{{type_qualifier}}|{{compiler_directive}}non_func_keywords<if|for|switch|while|decltype|sizeof|__declspec|__attribute__stdintVint8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|int_least8_t|int_least16_t|int_least32_t|int_least64_t|uint_least8_t|uint_least16_t|uint_least32_t|uint_least64_t|int_fast8_t|int_fast16_t|int_fast32_t|int_fast64_t|uint_fast8_t|uint_fast16_t|uint_fast32_t|uint_fast64_t|intptr_t|uintptr_t|intmax_t|intmax_t|uintmax_t|uintmax_tstorage_classes#static|extern|register|{{declspec}}type_qualifierconst|volatile windows_typesAPIENTRY|ATOM|BOOL|BOOLEAN|BYTE|CALLBACK|CCHAR|CHAR|COLORREF|CONST|DWORD|DWORDLONG|DWORD_PTR|DWORD32|DWORD64|FLOAT|HACCEL|HALF_PTR|HANDLE|HBITMAP|HBRUSH|HCOLORSPACE|HCONV|HCONVLIST|HCURSOR|HDC|HDDEDATA|HDESK|HDROP|HDWP|HENHMETAFILE|HFILE|HFONT|HGDIOBJ|HGLOBAL|HHOOK|HICON|HINSTANCE|HKEY|HKL|HLOCAL|HMENU|HMETAFILE|HMODULE|HMONITOR|HPALETTE|HPEN|HRESULT|HRGN|HRSRC|HSZ|HWINSTA|HWND|INT|INT_PTR|INT8|INT16|INT32|INT64|LANGID|LCID|LCTYPE|LGRPID|LONG|LONGLONG|LONG_PTR|LONG32|LONG64|LPARAM|LPBOOL|LPBYTE|LPCOLORREF|LPCSTR|LPCTSTR|LPCVOID|LPCWSTR|LPDWORD|LPHANDLE|LPINT|LPLONG|LPSTR|LPTSTR|LPVOID|LPWORD|LPWSTR|LRESULT|PBOOL|PBOOLEAN|PBYTE|PCHAR|PCSTR|PCTSTR|PCWSTR|PDWORD|PDWORDLONG|PDWORD_PTR|PDWORD32|PDWORD64|PFLOAT|PHALF_PTR|PHANDLE|PHKEY|PINT|PINT_PTR|PINT8|PINT16|PINT32|PINT64|PLCID|PLONG|PLONGLONG|PLONG_PTR|PLONG32|PLONG64|POINTER_32|POINTER_64|POINTER_SIGNED|POINTER_UNSIGNED|PSHORT|PSIZE_T|PSSIZE_T|PSTR|PTBYTE|PTCHAR|PTSTR|PUCHAR|PUHALF_PTR|PUINT|PUINT_PTR|PUINT8|PUINT16|PUINT32|PUINT64|PULONG|PULONGLONG|PULONG_PTR|PULONG32|PULONG64|PUSHORT|PVOID|PWCHAR|PWORD|PWSTR|QWORD|SC_HANDLE|SC_LOCK|SERVICE_STATUS_HANDLE|SHORT|SIZE_T|SSIZE_T|TBYTE|TCHAR|UCHAR|UHALF_PTR|UINT|UINT_PTR|UINT8|UINT16|UINT32|UINT64|ULONG|ULONGLONG|ULONG_PTR|ULONG32|ULONG64|UNICODE_STRING|USHORT|USN|VOID|WCHAR|WINAPI|WORD|WPARAM8#xΪν=‰bΫ6²Š“ήΫέήχα$MJΪ•r6ΝΡΤλψˆύͺΪͺm5m-GKI”Μš"U’ς‘ {ίχvο/x_ρώγύΗϋ7ΈH"HJvš¦%&HΜ ƒΑΰΰΏ τχ$ ŽλΤΆΫάͺŸ~¬=OδΝ-3π£t‡Xψ\,]ΣπΝbΛl};ˆŽ%ΒlΊέιˆ0§§;ΓΣaαΉXΊ–E?πϊΝ ο™~Ρtϊ]Œ‹εXε:EB($0<΅‡Xψn*(z› μažOΦw0€,X°πω¬vίi’ΛΩ±έ†aƒ½žςdfκwYψb,ι–Ή·γz-#a:ϊίcαK±δ]·e΅-ΣLTΎτ!:OηK–§&±Ά³cf«(΅ηg%"Xβ~· £dΟ₯& Q}>5Yˆα ©ΙΞ=&ρ»±d2;9[^§ς̞η6Mίw½β *yyˆL!u―°p!-“³ ™°¬ZΗυΜbΏΧ3=’χp3σ‹;V°ιφƒ’ov­¦k€©WYψώhπ­Ό)Ϊ–c „Ύ–MhΛς†mΆ’L<ρQu¦Ρτ\Ϊ4…FφƐCΦΎ™7£¬;Ζ₯ΊIΘ蛦ε8š7Gˆά±Ό9B?ž7G(λoεΝqžη8ΑΒ³κ^ί6Γκ-JMΔ‘“ϋ…rκνύB 9¨±PΟ ‰jςˆ(}D!-#I˜da1/θβSRTομHHJq@BrJ,<“Δt2ΔνΤ>…dή' ΄3’Πe’eνμhωCB΍–?ΔΌ$,Yω“νέΡa„t\FHΛ{’RRΑ Ϊp &.J7=w.%Ϊ& 5–Σ’]NMrδJb2lnBAγ=>!Τλ]ΓrψΫ«,|$|KόυRf£‰)εo§$#ŠΎ-ZΆ ‘ΝS}Ÿ…|ΌC¬Dώrš…|ΑG{όύ5ςρYσ%ώj†…άP€<Ν¬ž^όύ  ί;@Ώ`^b²ΤΞy²λ,|.9Ξ<&™xo+ cŒ. ™¨Ζ₯>:;»ι΄xζΊlbρμJ&UΖΈ—g+K-'kΈl΄hAŽΡ59„€~oˆ7±$Ωh™mžqY<Ω#τAό+R/9Τ(ŸωX²K³Fχ<ίJσΌƒψ―fπ Ν±ΐa¬IΪ’e6­. ύ~»mνςTUς‘©ixφ^Ρά=λϋ9lrŸ°π’ά`!ŸΗΌ<Ρ§,|IN$y#xϊΟXψZJzP#ετCφ}ΞΒWRςΠΡΟ±.)^Ϊρ·5>{ mu―a9pžxCRa<1δσd7%~ ξ ž€ΞBξΨ4wδZόTΧ–κ€g› %&OeHΪ™»Aψϋ†„Ήδ& •ΆΤΑΨFΓ YΥbαSαKΐ!AVLrŸΨIΆ₯^"τπˆŽTˆμ@αι6%Œ9Nx"Kκ’™ο‚ΏώBBΖ…1ΊΈQ‚-Itβ(ΨR5χ<£Σ5@tΌ€gb&mΨXjύΝb\*IΝ«σYν"tτNS†ΰ²°4„ΘΠβPz,|+Κ`ή/Yx\W…Ό'υ­©YKφ₯6θ0β‰~?9ρЎ"·ΟΒσΓΒDΦΆ€(㎑d;j' |Ιο¦Υ³i³MPK¬¬=jΉςΦΦ-©ΧˆηT/·YψlRϊ8j(¬H‚;³;i H‘·hx~ŒΈ²πέ‘ °ΖŁύˆ…―§‹σΰΗ’±¦Θ4X/?aαI±xςΎΩ»ΘŸ¦Υ&Ι64ŒΎxϊŸ±πε€τ’’gψy„ 1»νΩ₯č†_Jύ󠋏§ό %₯„.κ*΅½ν–αΉ}'ꓝ¦δSpΒoκ6ΙνΕ3ώ–…'²3 ΖοX¨+3+\9ΐοΣzΕ Οχ‡΄ζ¬pYπΌL“ζWΟυ§΄ΚMtQπœfα‹I9“……|zn0ΕW’Ϊ£NŒΊι7 pSΤ››F(’•„—%νΩFΣάtνV$Ό“ $ζα―.½fώϊ,|Hxζύ§d\mž…+'Lπ/ώ›…|.š;!Ίf`”Hg_βf)IΓύδΗ‡ΟΪΤΥ›5β8όiΈΟAΈΟAXΥ΄υZCӏ άΥξ’`υ°2¦Z­δ›D/3<ΰ2Ζ19"χ•DΕχbT0WLœ1‘C²Μ%‘Γ¦`t£ό(šxω,³±’±‚γ8«8™ΜήJͺΙΌZk§ΙϊAΐ#ν%Ή)βΓ, ZmBΧ¦Žž kΠ! Ηa :,fzU"wn₯–Ϋ/ϊΆαo¦Λe\«ΥΕξε·τš“‰ε[ιΥ"tΖ ΣΈ`9 @xxBXμ*5“Z’ZpοΎšΫ‚$ΤcRύ“‚hΟ32ΉaέJb§ΠΘ„δu tΘK‹HA1;—β~XH/Β›qoO­±^λέ.ί©oΠ.Kπ0Qk’ΊGήέ„Eή BKdw ΅^©y4…4 q'δCΑ"ςz¬°ΰ4$‘’eύπˆ ίΜ€nˆΞe,©Ϋ‹X―ά#ι‚;΄‘d7Φέo:LD95ͺiU+;][Ώ©]٘€j•&j·u=±eˆόΌ^P4ƒ― κ^όP"χ΄ΓR£‰sŒsΐ{θωΙb±‘ŽJθGCρP²θη±άDQVaόy έGCe³νZ­H΅p¬έ­Ρ1KΨ܍i•‰L-C “uτͺιΊ.+ΙPk…Lα€™[bόO‡TΏ*έ—’pTζ*QΦΗτ~ZHϋ%ΪΉί4r9^O‰ ΕύΐΜ&Uj+β.y$€σ)ΝΛρΓw™γδw5l•šaƒ·μ»M^£¦Ϋ2λΎΩA-››8ͺ…`ŽΨ`υϋV τ?iZ4„“Hγα3’rΰσ₯ζ˜Dίώ”Bƒ=ϋ $χz-ΟΐˆDΆlΫκφ\/ΐwΰbΕw_XόϋV9Ζ$r\`—αCh9xlƒ°Ÿό8ά›ž»αv€΅bž >€έ‘o΄ΝLcRGΎi%†³‡ —i`¦ΚΟΧ ”ˆ7%¦SsHΡΓ_s»ύ"O»z2ͺ‚Ž ^?θΞVχ1ΒίΙ;0Μz•ίpw)›ψ+ρΉ’ήυŽΓ1Ύ‹°’[κm=M~©υΕεwŸφW–Ϋε-Y’ΐ"3A$KmΫ5‚’0͍Π2}Ο†˜]^οU6Φ‹“SS΅Φ$ 3ΐ₯ts„WST~ΒxdA†a9ΫΠ [%Ά(€§eu¬@4πzhΫf€KI!…L@z?žU‚ M]‚=–Τί¬_Ό΄12­"†U ΓcYE5‡a(lˆa Υ»βaγΎεZ»œFρ, R»o—έ}αJ‹J{8X5'A1‰ͺqΎΒΧ’3L_Ώ $)ςXΉ|Κ–9ΚA‹NG-’$σ3cψΟw’ΰ)ο`―„—C oU£²υBR ½™¬W”_ύD<ΒΈ“α=K¦<+#Ξί0™ΩΎ«Π!έροe%|&/βΘ7mœ'ΖLˆ ΫLz₯k‘<O«Α8o”£μ7c\ΘοK*;Τξ9ΛώE!₯M(ό(yŒ›|‘_¦•ώΘh\I΅!Η†™˜hpW+ᲂ°Iι-θ]Ε~AΤ“z’-ΤΩ§`Ц„'jNι½šrΰ5ž³Η1_Bw·:)\²εw`T"ΊOΜMΙ““‘^ RMΈx"3ΊΈBπr=-U5ξ =Χ–±C‰}Λ2:ŽλD(dZ“₯ΏκŠFηΈ‘ŠΎμ»PA2a―* ³œ¦έo™w—ͺ˜Œγ7'…•‘$ψΥΠ[…€Bή?ΨBNΘπ߈σqZwΙ<=”Κ‹γΉΠ”Μ#1cκr°ƒb'›FΖ&© Ψ§Α2–­Q^R΄jκά§Їαψ>K=½t\‚Ϊ΅υv!σ—”MKK¬ξ‡ŽΒςLηƒ₯hΛ Z'»΄Έnα ρRF ― β© γ+ΩΝːgάΔh8™–ψȁH RH J2k$σ[%™ΕΡ$³tοtγW$π[%§G“ΐ3ͺDZΆ<Ϋ &nG–Ψά"°_YΛ2Θΰ2xn4<Ιΰ‘ƒ”ΑQ ‡²9€l^M6ί{ 3M‡»δ@; Gω=²">1₯τΈπ@δOd"ωόP’‹H½ωγ`\C"fU°λoΉφα^F8q=ΤΫŽpf£δnΉ΄)Ÿ)άR§^Ιή0Α›Έ8%C–C²B’JΦCιb‹eυš?™†FfιΙ 1S—I&ρG5ηίNH+ΚΉοφ½¦€ς‡ΣξW y«M«­€§ΟΦ•¦hUσ%/$ˆ=mΖυgIψŠ£p–‰ΊK»&ήH―ΰωχEΒΕ΄%ŒbIΟ‡†z!RŒααŠ†’ ž[ ςČΏηΖnξφ³IUω©’’\ϊzϊΊiOX‡r#π?†Mws―ηZΩϊς5Ώi8m΄ηf9=PRA5 βμ†ζ°d6»ΡudAδ&‹¦ΧŽ£6jXΌ <ΝΧυ9M­·‡Œu{:jj~ΟA›rmEс«Y]c΅P_³5 žt΄…Ak-R$2=Οˆ b«k"ΫtΧX»m―«#†΄h_t{h»Ρ‡ΌnΣ°M·:ϊγΔξ0bi]Υ45S3ΌΖΔ±t»Έ;†ΧbΟδ䗐η¦I³dn„ΕΑ{ΧΗ/ΓW@i‡₯ 4Lˆ!eΦ‘«ω<η φΨΫΓ«ϋ8μžζξ°žϋ55ΛζDτx€­ΉZs uΒD†,B4{†²ΘH"Όζyœ’†Οαz¦Α oDL ”Ί9*fΗττΒ‘­€EtŒnΧ`χݞj[ΆIDΔ΅g4M¨3Χλ‚Π fM0cldA½’Εe H˜7¦‡Wχpa= 71„+]G€C6±(@MδΖݎΞσDc™Φ¨sϊ]ΤΫ4tΤρŒή&Ϊ₯9Άαl>γd χ4σΛ>`ΧŽ€δ`.Δσj$ž¦ΒςΥΫΤeXn§Αy`μj-k _Η8jΫ¨MځŽκs»a§²ίD;͘XτΝϊ`Ξ‹>»α­‰΅SσΪZ3V»€μig£HΤ=Γ*‹ΆΖuF€-Β6%7±°qΆcρƒΙδ¦iΤ5rL$( °šαu έ—>^ΰ Π4’άΤ‚žλ#s ^5m& ϊΕ큆hY]ήr΄¦ΧΖΆχSpq¨ yB6½Τ»M³ ˜ijΞ6"mΫθ@:ΌΫΫM˜ 2ι­Ϋ‘iA•šΛΣ Λ7Ω`5Τ· ˆ£έχ7Cκ­–Ι9䁔b1p=„xC#π0˜ςS#DƒNi MΏ‹υΝε†Ϊ ‡PΝQ•‚¦Υ@ΐΜ(Ÿ«9¬LA‹jDεšψ˜ E;£±Dθ4O,ŠJ#‹Ɛ©δ["ύŠiΥ©β…¨"ρΐχ€ϋΤ…v5Π»hΈ{ \ςŽφ2©ia 6˜OH nh.Ϊu·±Ί20²&–aΧPφ ΚT΅Ep£š7oAWžη+AsΠq½˜bkΗr΅ψ.UɌΩΗ&?έIv,hi] πG0β‘b§Aq ’Ή ΜΑΚ2ΆΪ¬‚-h‹0ƒΧ (Јσϋ˜³θδ‰UΏΥα eΓ1θjμ· —―Ν\Ί”Ϋ |&Μ°σ>΄GΟ3bVΩcciφXlη_AwσTmbόͺib †SWΗk§ψψ{*k)•j\ŏ"Ύ†ΐmmΛ‡\†γ€­Ο2.‡\†^ύ«bEΌBη#¦νhmb`5β€uxΖ?α©H‡ΝΘΧC3 {%ή=/ρŽ,If¬PsπΥ4 ;σO:0ώI₯#IKδ:9ΔΏ^GKΥrŒρΎ‰ΪφΧ­­TηΠόtyuNά`ΐΫ£ΣΗΓp‘Χo‰ΰηΛsnͺK3k‹ΛKδ‘ΌΈ±δg€– ŽφΥl­O?ί¨νk"OΘΈΡΡj8xνΝ"νΥγ ί‹°uά9ΟC[K–½άΓLχΡΦ"•²ΕY΄υ ƒT6N°9큸 Ό‘"@UnZ[―E8%μ1Ζ+²'Υώ€Œ—λW―ΤΦ7τά;[Ávƒβ’Ή)Vεϊ[.$:˜ͺ‘–“΅Fƒ0ld¨+1¨βšΦΥ€5­R]ͺ6eξˆ Ÿ€ΦρHAεžρ9”€œgNLh Δ6΄©ΛΘΑXΝ4ΆHΧ‡ψ ˆwˆ-—nαjБγ.²Ϊ¨^!‡#"ΆƒΠί±°v6ρ-sB`Ss'…ΞX―ύPDΟ•uΛ{2'Žϊ€!΅ %MbΦ`―›ΖΆϊΗ6ϊΗΦ”&œˆ"–χ°‚ΎEEό‡"~Ηβψ)7_Ψ[":o RPa؁Ql™ΝΈ‡?ͺτgT°Υνμ#•/ε¬Βœ\>œΑε<Ε(ΡK“ Θ‰˜Έ%•Vω‹*F>$b φ•±lξ‘ΰM†ΦˆήsjθjžUTΒχρΒ—ΙλƒΏΏiβχ°,~IΗέCιOŠΥί³Jΰj†­ͺdomHΩΛbτA‹ήΪ7Mτ)€`λ揇T^^·Λ·ΟΌsφΞzΏΊ1…π•D†(˜ τˆf#ίT,.κηseλFρ Mda‘εP΅Ϋ™Ά]ΰiE}ήVΔΟ)βgρPΔ7ρ EΌκ „-EόίρͺƒL)β§ρRΔΟ+β§dΖγί‡1π¦UρN>›Μπa(d[ΖόEΌ™·εFνδjκ@R˜qŽqI,τΡ€πO±[ψž©‘ΗG@τ‘Œ6—₯[cά†N‹ψ π„L9.Ÿ+Ψ† πσ'9KΞ›QlΔΌ­'ΦΆˆσg1βσŒxs0θp‰eiو>14’"ΔÍ&VΔMΊ&¦Ά3™-θ7 #4»Ηςπ'lrύμΘU“ρOE1ΉΖΦ|§ϊΐ˜;NΓ”‘μ½Κ΄Ϊ@;JOWBˆ>*˜«˜}FPΘwΑ°B—εw©^H¨(¨Rδπ‰»#‡δχΣΟέˏ'84!|–ψέΤUΈΒ“²ΎΙk-ΥΓI%kύφΥ+ΠεB/51‰KΠum™Š£16Ύ*TG’ΧVtt© ^A¬Ζ ήU§Ϋ€@ωΩΘΖΙη_ L[§ΖŽSψλ7k:h={ΕZΚ‘_ΛΩjOΖ¨Ε2Rρο»ͺγŸb‰Ω£Π½)Φδϊιλ%uŠ·ίΝQRΜ„δ2DχXšΣΔΛ HEeŸh}r)͏CMBFρι5I_ςιαΆνξ”HΪXί απz3 OžΈR»Φΐ*"‚τj$œT1DKηυ484q Η!€ΦmΓ,_ζΆ¬[¦ΫŽrΏ¨κΫ(¬œKžˆ€ qͺd_‹ϊϋ^!ΕjˆQzNldΠ³ϊΣΣΦ-_ΖK—/ηοD£|L½fY10Ϝ~ΦΛkj*ˆWδΛ"ցιua$ΈΚ31ε5ιiN՞―Zήϊέ$9 ›Θάh„Λ‡;˜ΥΗ>TΏg6kxŒš  ©iλ7iW7Τπ&<Ζέvm€aγ5NδxΡππΠzί’uόaΨΑoZu©Z½΅‹W#†yψϊTŒΐgDzxθχOςJίθlQ•ύlZΩ±Ε|Έΐ0 ΐ[t°r™ŽF¦.γδ^αpݜNGƒ‘$ α†'ΎΧ#θλνy0»  ΰ„ 3”Bΰ@Zœ’ŒxΖqFMΦPΐΧ3Ο₯笆glzD!v9ΟH•₯6έΜ<,₯ζXf‘G†*ε‘ΡHyx¨B‘”H½κ„Σ뻟n`I‹*΄΄19…ΟΆΥsώΔ‹i|³kb‹z.֌‰cp°E=+*²·OγOλ€ιz!VXθΟΗj`@qΘy_LΣ21—3wΑΰ>s²6‰ŠE=ϋψfΟ 6A#K+Λx»)~0τ†+~¦ pα―6—SπwώNβ„/7αςΑpyύZxΜτΫJ<£c¦~‡f+qaίϋοTtς$.J>Žχ1ŽΩ«Oτͺ­e‰G{Ψ—Ž» ωIT+’Sθ l@?DGGΕ3<}Κ£v†#πΆ˜)t™˜ΰςήΞ@ΨΤ3Ό½Δ†ύ™«Σα4NUƒ|©Χδg!ΠΰμτΏΰ|Δ_ω%YKϊΐ:JΊΔδ³ ‡}`Φ³ }Œβ ŠΦ`˜ΌYψP±τM³‘Ύ½ž΅z FζVτ+\τ»|πƒΚ±ζ…θ`?υ—$>ί€³0F';ΧιX‚?ΙbΙ·­iυΎŽ¦•—iGξΉl©ΨδΔΨΔ'PΏu›‹QuZ{Δφ‘›φύ_%_p•άΊΛU’©Z’΄mβ7Ur‹ΦΛ‰Tΰ¦W )δΕΜ³iQΊΒυωΜq-SΈ}φ;Τ£Ξg=\½ν$γFηΰ€τ‰‡1EΖ‘ύc―ζζ?‰ο&ρΌfq#Z»‘ϋΛIθ½VΘ!‹²όώ^›Όrύ‚¬V¬ΆζLαNqjŸvPΡωΊͺ-vSp>˜3^UΗaβΞzΞφLγ…œΗPΔ<ƒίrό―rP-ηωƒ"ώ·Šψ?%ΐh9iŸΈύ‘Μρύ|β6ω{°wύ·™=0ω½,k0Κ#‹α5qΏQφ֏T:σΖJΜ7ω£Θ"ύίσjδŒpJ–JxΌΒέή('—~»*εΦ]―?VB3ΒΘ€)^Ÿ#.ΔAx&Ok!ΊπEX€€iχύ€»SR,r‘ξϊχε’.›»kxρΔδ”_[­,Œž``' >¬ͺHΞ!+ͺŠ”( (”ηzζ[rχŒάžθα’yTζ—Ρ2άα΄$΅5FςΉ NΫ·Έ―Oώμ§Ή&}C;!ROΟ“ΔZެOΉ‹μŽν : Οž%0βΐΎ‹DΙ½L%Šγ…!₯ιΐΏΦv~ŒMVNςωΨ)_dƒz.Ίν"=Ž'ηi,Wde6θGΡΗ‹Ιz6:Λ†ϊ™Ξzy ΚVP‰ΠΡκχČI8dI$‘Σw Ο±œN.VΌ‘^¨fΘ±C&“ͺŽ~θ ±°Β <~γιψΕΎ#–„αqU«u!ω—ζNΫVΔχS`©ΗkΗ±΄ΐΔφι'`;―φ%η$6Ÿ,όΗ³@ΐ‚wr³ΰωdLœΉ™pκ …³˜P(Ό›› ϋ]…°_Γζβ}ƒι₯4LUξ?*β§ˆσeόEίRΔίΘQω}n>En‘©Λ΅Z7fΫρ‚νΪΫΗ¦6ΠϊιβΉ Έ\’›Ρϊωβ{τy νΕφtq?M’ΎπtϋόTŸ/ήΡερSteψ gΣoΩˆα§†£Ψ8 ![Ž»γ €IχF»τxΫA­5Y{KŸΟυ;>ήΆL»5^§‡QγΗρΆ€υγ§kΕρΙ·7&r±Žσ½sεr}#gِ/¬ίρ‹γΪ΄XŸ˜MŒ‡¦ΙVT› w˜2%mΗΗ»0(μφ»Œ¨«l–”€’@₯ά΄|4œwsm"ΫF6ϊθϊ•Ρφ&ΪΆΡ6Ϊ„ΆγψΈMηeHιλλ7k“5G£»α£υ–εφw?]šsνωΞucz¦Ήκχœ:@ΐηbƒ“ŠΗξQyo¨t|iΟ?9k<'ξJΤΚ¨υQUŸŽe―sΰέ^lOϋ Ν@Χ5τχ’“4ηεBΪoΡΎRΘΫ5EWbίΖΙ<TUζϋieƎΐΊ–©~ϋΪύn½ŽŒ~ΰ’†λΪ¨~ _qƒDυ²·yΡΟ-!²Υ»0ΐπφ`Œ Ϋu:ΘίΔΗθγΕδf άμfΫ΅Z(鬃܇˾p(ΔΆ_'8υ봬~ή―“βϋ,ŽF}Ω7Zυρΐh΅Ό:>‹›†-šΫu|šΞn/¨γΟ$l5vƒg$ΰcαμ–SgΰχτδΞ…+p…¦Žγ}Š[ψΞΣ#W·έγΣ;ώ-ξδ:Ζ±Ε“5±Η Ώ’εω,Δη™γ„>>#Ώεγ7Β}/π@·dά4α‡ Sίσ‹ψƏ1τΏ£κο›ž ,Β“-0}ΔIRŠ.LΜμΚΟRΧišΒ£·ΓhGH™’;ΒΫ”Ϊ …,qŒΎZ$0 Ieg.ΠπάY^8_§Βr‘…$AŸ§θσ$ΦmΣπ9ϊΐ‘Ρ'“>…£|ύxΖ~š@ΈR]]@ €”ΥΚτΜΎ_ϊ„^Λ‹PβΒLueurΞΞΐίμάμτΪ4άΜ­~Χ•e€1{.sK Ν­MγΣΡ»./Aφ볋ΛΧώ Βςς΅iΐdayr.|ΈIΣKΈΠη>ƒ Ό./ΟΰTΝ-U‘ρ£εΩ* —Χ06•ιςάπl‘2€VζV«e(lε:~X]TW?G 7H.Ν’E@ώ Όˆ/PΗp¦ΑXVž^ΊΎ8‹Κ3δ²φYe•――Tπζ5Ύ„7Ύά8ΐΩ+Σ+ΣA@j\§εJXƒp»Š3UfΦXψΙ2†]™ΉAŸiε–+¬’ΚŒsΉBΛ¬Π4,+ΛΙ2ΠόŒ ΄ψ —,ŠF…E€•ΟŠe₯V"™ͺDBUαRUαbU‘rU %Šc[!uHPp>W£+”ΣΚκ εu…p™V 9[ Y[aΌ­0ζV–!ίάJG±[!vuρϊάlψX]β« Λ+€Πκβηsu†7Έˆ5ʚ5ΚΚ”*}¨FτU IՐ¦*%ͺΚ¨ͺ2²ͺŒ*%€ΡTˆͺrͺͺœ¬*ÐThε-Φ©žΙύκL±ξ ‰|ˆVηV>Yœ™«ƒ|―UWΓ·#’KΙ€TRς"κq!m”4F#ŒΡEɊ¨Šˆβ4q’ͺKΠΈg1f+‹8!Ε©ΊΊ„”Dh™  !ξi7Yέ)ώV‹»7ώo,­ ί΅‘§_ß[Α6’i8θΪ^`’ΛŒΫΫ ί-·ΫψC-ψΆx›8Λ'†έ7α †/e·c5 {Μ*π|ΡΈΥΐ›·ls ζk+xΦ6Œƒƒ™ν{ΔGσΦ.X–δŠγη±I ΌaaΕΕ& yΐ‡OΣπ4οφ½0"gΐfCσxΐI―Π‚α΄ΐΔ] Μ.₯EΒ’~ςαšΐν*ώΔςκj`}όΈ†Χ±ΠƒͺlξωbΦ uρ­‚/Ξ°—ϊψσˆIq$+D3LπγŠιΨ,ΔQ«Ψ₯LˆnΙ bs“ Y]$½+€58fΰΰ"€Ίο#f#ΚbVfΔo\eΧπ‰;ψf¬O―EnWΙwπ’ ο°\b«΄Ψ*-ΆJŠ­:f<)‡Ε\&{f·M¨$\šαΡ’ Œ [ΰQ,Žζ£CΚ Ψ“ψϊώ0VumώΜŠΥΪόΉ³όξ"ΎΪΚ+‰–HΎ―vΔΖέΡηI:ƒŸ'α;«₯ibϋvΊ«Τ±έΈ‰TGΐύ€Σ#[’€?Ύ‘Δ―CSScsscss.erb css.liquid source.cssabsolute_lengths(?i:cm|mm|q|in|pt|pc|px|fr) angle_units(?i:deg|grad|rad|turn) combinators(?:>{1,3}|[~+])counter_styles#(?xi: arabic-indic | armenian | bengali | cambodian | circle | cjk-decimal | cjk-earthly-branch | cjk-heavenly-stem | decimal-leading-zero | decimal | devanagari | disclosure-closed | disclosure-open | disc | ethiopic-numeric | georgian | gujarati | gurmukhi | hebrew | hiragana-iroha | hiragana | japanese-formal | japanese-informal | kannada | katakana-iroha | katakana | khmer | korean-hangul-formal | korean-hanja-formal | korean-hanja-informal | lao | lower-alpha | lower-armenian | lower-greek | lower-latin | lower-roman | malayalam | mongolian | myanmar | oriya | persian | simp-chinese-formal | simp-chinese-informal | square | tamil | telugu | thai | tibetan | trad-chinese-formal | trad-chinese-informal | upper-alpha | upper-armenian | upper-latin | upper-roman )custom_element_chars`(?x: [-_a-z0-9\x{00B7}] | \\\. | [\x{00C0}-\x{00D6}] | [\x{00D8}-\x{00F6}] | [\x{00F8}-\x{02FF}] | [\x{0300}-\x{037D}] | [\x{037F}-\x{1FFF}] | [\x{200C}-\x{200D}] | [\x{203F}-\x{2040}] | [\x{2070}-\x{218F}] | [\x{2C00}-\x{2FEF}] | [\x{3001}-\x{D7FF}] | [\x{F900}-\x{FDCF}] | [\x{FDF0}-\x{FFFD}] | [\x{10000}-\x{EFFFF}] )duration_units (?i:s|ms)escape(?:{{unicode}}|\\[^\n\f\h])exponent(?:[eE]{{integer}})floatK(?x: [-+]? \d* (\.) \d+ {{exponent}}? | [-+]? \d+ {{exponent}} )font_relative_lengths(?i:em|ex|ch|rem)frequency_units (?i:Hz|kHz)ident*(?:--{{nmchar}}+|-?{{nmstart}}{{nmchar}}*)integer (?:[-+]?\d+)nmchar"(?:[[-\w]{{nonascii}}]|{{escape}})nmstart&(?:[[_a-zA-Z]{{nonascii}}]|{{escape}})nonascii$[\p{L}\p{M}\p{S}\p{N}&&[[:^ascii:]]]resolution_units(?i:dpi|dpcm|dppx)unicode\\\h{1,6}[ \t\n\f]?viewport_percentage_lengths(?i:vw|vh|vmin|vmax)ώ5xΪν}ωŸGuψJ>‘mŒ1>°Α–|Ρ#ΉΧ²e|Θ1k°-LΈ1I€έ΅S3έ3ΣڞξV»;R‰άδωζ&7$$Ζ9HH„#\! ΉΘA ?}–ο{―Žιžι‘fυ՚Οg·««_]ο½zυκΥρώwIό^)Ÿw²(ŽžgΉΫ²4σσηXͺώnž€Œ‹(χS7ΛΗ‘_Βο“Ο›&ΰ‹,GξΘχV‚οo~ΏΏD>―·Α½ΈWŒόΘ¨ψ₯3Au—Ιη«lΠ~Α?Φ3ΪwΉ|^gΓ£$Nς―hΚtΓχS6ς³φΚΩ°Ί²/› ϋ€‚=0φ˜‚ΉJ>_aΓZ»z:œη5Σαt_ήTΗλ—T­υΤ° `ͺΘ[l°¬HHΐ§~dΰΊ&fQ)JΠWΞΥ(P 7X yκφ‹¨—πvΤ¦Ρ4`σ -€5†o”ΟWW€»EζA€α&ήΤ2ΞΝ΅―I ‹xuΫΊŒ[Ϊ¦ΠνΎ΅m έ^Σ6Εƒ*ΕkΫ¦x½Jq[Ϋ©··Mρ°Jq°mŠGTŠCmS<ͺRάΡ’I49ξlYΔšIξj›B3ΙέmSθZέΣ6…f’Χ΅M‘™Δi›B3I§m Ν$‡Ϋ¦ΠLr€m Ν$χΆM‘™ΔmΙ$ΉΛ-‹8¦™δΎΆ)4“m›B3ΙύmSθv<Π6…f’cmSh&y°m Ν$―o›B3ΙCmSh&yΈm Ν$΄dͺG[ρ f’γmSh&y¬m Ν$ίΣ6…f’ΗΫ¦Π-CΫšIVZ"W'x’eΝTol™@σΤ›Z&Π,υdΛš£žͺUz,μΥ(^O[ƒ¦ŽΓ8u™wζ!~Z§%˜/ζ¬7Ο—NσΧ3σ₯Σ\φ–ωi^ϋήωizλ|ι4½mΎtšή>_:ΝUο˜/fwΚηM5ιjΨδ]­ΐ5wΌ»ΈfŠχ΄ΧΌπl+pΝοm)}­ΐ5ΑΏΏΈ¦σ΄Χδ}_+pMΥχΧ‹Œx„¦·Ζ½’¦Ο[«ΐiœe`.πό)³Ϊ:‰f…΅ΪxρˆR―,a½ΈΞύ9ω¬vϊ SλΕέσνΰuώ?Ψ^s2k―YΉΫ^σr―Όff―ΌζfΏΌfη~νP>H™ ΗΥP`Π6…¦Α°m M… m M‡“ςyc%E0‹L “n΄Φυkk# ΑJY“¨m ]FTΫρ•Œ¬Peφ±|Vν¦a @ƒXImCΓΈ…`4MƒhPBŸj­«œΦ²ΩΥάS…ŸŽέ0Θ Sd&ŸΧ7Α— y­шmΧ »h+ΎY‹λ$?ΝνZoΥβ$ΙόΒ‹έ^Θ²ΜΔχvh]‘qhέ)N·ΦβLh-–xh-”ΞΆΦ"ιƒm ΅@ϊ‘ZZ¦ώΐίNjHΓ­ΐ5Ζ€Ά.iϊDv·{ώhhχ΅ΦΤόρ6Кš?!ŸΧΥC—Uώ|Vνέ™ϊ½«φσ" khφ3³auω?[«° l’ϊύ Nό\λ$Ί”Ÿ―­Ρ&«³ΒlXο‡εS-Χ<<ͺAκλ/Κηϊk–³4WŸ|jΥ$Ήσq⫘_²!τΚ™Šωe‹|φŠ™‚ϋωΌΦ€3–ΎΨ―ΚηU%˜ZΗR Ώ&ŸW— zύJΑόΊ|Ύ¬„λV ΰ7&3ΡkE ζ#ςye S©λoNζ‘ΧrΜoYk8κσo[#|¦.— ‘ †΄V Ώ3YΥ΅ύέIΜ©•ς{Φ°dαΠΔ Γiΰί·T€Ιe%ωQωΌFCΛ3 θc–|™°j(ΐ?°r«X3ΠZšAΣlVΑ|:όDγΘβVk:₯ΐώΨβΆΙΒ’€Λ YFΜυό0‘Ϊ£ΐ>a7ۜ‘) -v©™V)Π?±„ˆμlZANU°jυr/€’3³‘f5šm)°?·„=+PpŸ΄ μ‡1°—)xώB>Υͺi?υAƒ‹zγ Τ_Κ§ZΟRΉQœSηq‘xАΆ*Ν§,ΎžΤωδ_Yu¨jο κ―­ό&upω7V«€ΩžOΫy€ΆΤͺ}ξ3η q€j3·ΟZ,UΡυΠίZb#τ£A>¬δσ9«ήε4@Ε|ήΒTU‘WP_O΅cΑ©ΎhUΓPΪΘίYΜeΟά—,^΅΄tφe«Δ¨u-~Εj€ψiΠ³:ψW­ς υ€ŸlΪ~Ν’Fe6 €ώή’SˆŠ„‘5‚<*%ϊΧν²+π쬆TUcυvf 41”D쟬ΜN, ϊοUψκVf–Β¬ΐώy,‹ΓBt]y"Ÿj<Χz©ψW«RU5WAύ›%K¨I9ροΦx«4Rυύ›V‰‚Χ‘DΉ‘¬ό‡UρDk₯ei±E½ϊ| ʘϊ/ KEtͺˆsΐx΅ƒύ·%L…WΑ|ΛBj΄Vϊ?Vv¦ͺ`ΎmUӏ<EŽ θ;ςωΏςΉΟβς‘Ÿ³e©Ο,KύrΉ—©ι<Αο7Β—ΒθwβΏ`•u[mY¦¦j—xICΞ/6Δ{CΌbMϋgΆͺRΥΗT@w mpΉdTͺo™βι΅μ°γ<Ρ1•λŽ.aΏU”z:ε±§ή2rq‡%’Œά°\;Ÿ;jjκ DuΆΓϋŒΐήρ¦?ΎΆ–`V=qy₯•ΗΣP6‰Ύd•ύκΊ²Υ<Δ.χJ³\U‰΅3*―{¦£†τ»ε?"q~.[ͺ-ζμ~K Q•E¦έ]m ‡.[ςR[nVCό4ΔyCό?7ΔΒ"I}ϋι―ζΓ@ό΅³3¨E«¨[κ¨―§˜;-&μ₯•ZˆI¬]…KΟC6Ά‘ι—–š%Ψ%3šYιR69ξ–ίέr—»£ψ4όέΊž~—κ’iuΧ i₯²:?Ie—~P>ε,xGρεRᒁoš„{YwW(Y;SΆy_C›ο©wζΣXΌ\Q%§Uαͺ₯6‚ΞD_c{YEΐ-0ΐΐ¬>wζ±υΞΩu<°ΤvΌΌͺš}%χڎώ·SrΎ¬­τ ŸRwΦΊN?G<;k]{δRΌ€η]J…$Δ^2Kκ™ρ_mˆβωφΜkͺ=³₯ΊphFάA=ᚽθε6ϋήXΧ‹fλ(3ΊΠmΥΌΠΟ‹Vνn¨«ΪS/Τ \ΡBi\$M()QŽξΨCWCYNUΘ~Ώ‘ͺmˆ·₯"_YvΫ΅fΡΊνυK΅ΕμΈnΫ•ΝεοH«ˆmΞ`ΨvBό©Z\:-I&p6ΙnX:Ώžaβ¨3Gߘ!Mθw@VΔqVŽ».ό[]uΧΆΦWΧ’3o; ގžΕο8{Ο=««ΗŸcY/Ž―ÏψΪΪΪπΜύχ>tvυΰZΎ­υΧWψΪΪκs\w:GΈ»BΩ>ΟάΣot?°ΐ¬w Ά‡;Zδ¨c0u ςρrœύtΧh‚n‘ CξTRίΈ4eΰΉάŒxQuΤ!ηΐAψ9+ΑqΔύmήςΤu –SμζίςM°fΐ?Ά]~θψhΔOqψδ<ιρd›χΣς»η8Zν9ώεE•Ÿ2>ΚΚ·gNσgN “€{ dο% ”g¨lͺJH[\^κjsσm“2χυ†ψ&%ο…]*#nž_F\v2’ ןž!;μψOξR\ί2?χŸ+Ώ°KqτšωqtΙ"pdΖχ.ΕέmσγξœΗϋ¦Ύό•†ψoοRœœ§—/§_kˆάw ξΈ€|}>ΈήM8]^Ϊ₯Ώ{~f8ηAτ—v)Ž^7?ŽΞymZ»w Θ_ŸΫ₯8:rrώz)dχ"θ³_ΩΉ*ΠoΟώcΫnΤrTΕώ£vΎ(λ2ΑŠ EΛjƒ‘eύΈ¬€Β½³Wς]Ϊ₯ύεθEΨ_v ξΈδχgΝ Υ^Z–ψ(πΌΠηt bbMF-μ+#`ŒpGŸ€r…°²l»›ˆςΰ24ύτv«.+ςΈ΄«ήi‘Vm`]nTm^ί­jΜC;Ψ θ§»Wδ•(W,ͺ¦μVnš¬ξ&Δ?2?β[+ΐκyk¬ΣοqΙγ„§Α`˜σnœηρˆ‡~?ηΈmάOy/Œ3?Λ]άϋΟϋ ©†κ­³C=«Žπφo!£ύ–/Ρx€•’ΰ8­±”uƒžD^Πƒε–Žό(`»~4`a‘ucOΔφ‚΄ϊ΄΄Σ;Ήαz~/±PΎωˆ΄pμvSυ†2rθ³M?‚Ψ,χG'“Έ‘Ο<”σ§ύ4¦όΚΌ<“ElΐR,έ 2€L‘ϊ.QΘ«ΖΦ#CΉψω0ˆh’<5Q?N’ϊƒβ$΄8(˜ŽŠ!‡~7υ·(ω0H‘ΰˆΉA™Α“,a‘Ÿωn?NEEuL‰8ΚcƒEσ…rΆaζ¦"08„ϊ ψ8υYδY4(Β2σ2ϊ$kˆUΕB|ΘΓx τK&Tž|+©*"©οoθ·R~Kγ‹(+Șα©6Š£AŠλτ/…υ•ωis`Ρ΄™·|Ή!ώ³ ρίnˆΌΩ›KQ€Σ·„!—‘ܐ·[@)ƒ©Ÿψ9α>³TΒ;ʜρŒ’<<ΣΤH‡±œσ•8»‰λή8?ΧνY wΉ₯πMK Ώ1Uφ ξMFφ&#{“‘½ΙH«±ι©ωΗ¦ωŒKΛ₯>ΠχΒ Ηe‡εD- 9³1HόΦΆ}s6r°‰";ŸμQΣVΆO/―Z»³ΔϊΜΤίώέΘ€ožŸΟyψό£9UοέΊbυ–T8Ϋβt·ξhyλE€»έΊRρφωqwΞ»v+Žή9?ŽζpΥΊ Έι Λ‡YΘ‡[έ)‡yΥ€/ϊ*ΟDΦ¨/Μ)@wλΪwΟO€…Οι^jƒ³;Θψη» ξ₯†λοΫγί…γτζΗιΒΟ6|Ό!ώ…οΌ~\q‘hπν9iΣvKΟευ™-Nk+}tνπ}-o©PyWοίRSΝ₯σ3¬«oωζjΦ ς1οiɍόΘΗ­\LΫ ² „؍·aIγ4ϊ€iž #οHβ&r S€€ˆK12Œ₯‘ιlXΦ a™$ΈΣΒ’ ΰεž|υ/”t€ltΗW9a)[Γ χΕo¨nκα!8ζE¦‘Œυ% ojυ֞XJσ‰nlόyρWήBΕr"(€3I Š„„z:B§jDρVκΑ¨kνσάίΞέΪ ¨έ’ΚΘμι ’ O ’b”¬!…₯Q 5PyΉcNT)VΈ6Ε<°·Ή[)Kt*δ@ K@‹­§cΐŽΞg[Aφ‰–ίfσFΝ―f"Ί$&‡‹JJ^—Z€Ε] ρ(γθ<θυ|3τ󼬲™CDΆŠ—YΧ}q%₯G1ˆ"Α$fŠCŒ”’Ίϊ:»6"E–φT*BŽHdΖ”ΘYβ!λΠΘ>g]t…ΛΖq‘Wδ,™r’e7υΩ†:n*˜Ε;τ$4Ψ!‹ oί”%ΊF'.JΑςε§%B·]aΗγ”!I-SΝ8― Ϋa$κa…ŒΗ‡:“LˆϋύΜΟ9‹@κΒβ?₯_Tž”M’Υ,ΪΞ J,bωI«ΤέG1[Fpεί·xΙ»y‘ ͺ86»™–Μqš !o‚’Κτ ŠχΔ3f2Υί./3$)¨ά0‚χZ€­WG«,ƒ… ™^Fπ<.zC—‰|©ΰž-³1āΙEΒΊ,š† M K‘:πΫΉΒ:Υσ§€Ωˆυ‘ύ #ξ…0 @”Y²R!·©κ"[Υψ’,2Ζμ’ύ5v •rXˆ(“±΅]F©ξV•h&/Λ:€ζρΦ6…6#ΨΉϋ“Θ'KIƒM$€++μσ)τLωpι>c€ϋŒεν$1σ§Θ©d˚œM,ΊŽd©Ιψρ$¬#Δ‘Vώa€ˆΥ\R„Υ QLCΚε[‘°{~9ύМ!˜'aPq)υIoΕΎ" x4&uΥτZFV’e*ΡGσ!~‡žD!Φϋ…dΒp•i@LdΥ†dŠ`ΨΝJΑ­ΎωΠυ\†χΑTΣ¨ϋ=*‘V2ΏΘ†Λ<œ΅”"βu9$υ@SHυΦBό€ζό"Ε8…hޱXqT dΙiQ‰T£λΛiƒ+υA+VwOλƒ,AΕ€­H…+ύ. λP_˜ƒƒ.)ZVΓZ5–AΗ³βx“.kαRQί E\ 3fθ¨CΆ@ƒ(‘κ―Ψ«*1Π—ΚŠ8½C5Ν$ψŠ]”^θ²Έj;°’ΖGš–—―ͺqr3φ;Π}Lγdθ£Φ―ΤAΡ μεzŠ/Ί;Μ§@zψάΡ£n–,ˆ¨†N΅λ’¬ΏΩ6BF”²œFΫ„$¬K H/< @o’“ —L!ΩοΓβZ_†9ž}|Θ”Μγ}—(}Δτ ¬-4ψ‰kn2Ÿ Ι{ €&˜ίΦnωXνrŽw4tžνJ{Žέv7ΥZ±Λ5ολΰ/Mύν·›Ψ’¨‰#ΡΧ*;'¬η<&φ(žν¬Οή’x{ 6€™P@t―b… ΫΠϊ Λ•»§oά―Lψ{Vw΄Ί;°΅‡ ΉqX±a»;ηλϋ/¦ώΡΌf:Ώ―r/3Φέ`•v–ƒkΫύψuf©Βδ§vW›( \½ο‰3υΊΕιoοΧ‹«Έ$‡›£WΆΕVΕUπ¨ϋθΪφ™£GίτπΩu6€#–)°JρO=λRੇ$€ˆκ’BΖ?pβ„μ¨ΜηΨΓOUβ>AρχŸ¨ΐ?S<žͺΔ;!γχ=*<}B΄Ί‹»‡ε €eC[Q;]δ­€žδl $-ρταςfSΖY· ¦QΠ£ρˆƒΒ„»Aq)&DΓ!j’ Β@Qdb6ZxAΜ»'Χτf ]4Y{€‘/V ±Ff‡`(ΐϊ FKΆ—f/Σ>T4…Ά‰ΒΨ¨lUΛύCΑΓ=ƒΥώ` œΧpαώXΰ±Ι=ψ 梐l’=‹ΊΎΗΕb°΅τ?τΠδΣ0©Η‡ͺLV]hςΣφ~ŠΖ~ϊΐΓΥϋέ‡ΦaιΤKό`CQΥ!„ςQΘˆ4Αhΐƒ(•’UτL¬8nt=P³Η?β!λB+B€€0ΐιΥΜ i™Π€Cυ ŽBAYΫδQ,jPθƒDYς8 .NrQ›X΄μX„£ͺ8uΊ‡ T˜υn_~Ч ‡ωHšχ8(ΑΈ σ•[Ή\s•k}ΩΤj.±HΦ 7„Εζbv—]ψA+ΐςΚ6bωˆηΔ ΉΗυΜ u{b―1ΟaА‚a]>9&JΡ”Ω<η/BS]X*φό˜oSmC₯εω=œ“Ώ Ν•žίΟΤi>΅κ„Σ 0 ½S lΐ!Μ‘Δχψ}Φ,"ρ₯oΖE:Ϊ[ͺŒ*0Ώ'c(όΓi<¬#†γA,ž”S°P'L sΈL“mαdFN;¨Ντκ Ζβ>Ο ™EεμαυM}Ή‰―VΗjΦ–;{zZυhΝέU Š­@Ό4I€Χ¨g*Υ‘ιΫ™dζ•M]W)’άΉG‹&w΄ Iΰ-š z“šΦΰ_ΣΠ»`Μλ±ΤVεΥΐŠ»±ήM=v–―~π!λΠκ04νlN9_CfWκβΥnh*ΰΜχž΅φΐΊ\m=ϋŸfΏX7·_[ٍ›~jiΖΌΫήαHšΙMs€Λ²ύFen°w—Ώ5‡΅gŠS…c…E―3怫<̟»k}εqά‘;sVͺ|BOžΙi€r'ύ΄IY½Ϋ 6ŠΥΰ-Πΐ•™uiˆΣΑCΒ«ώΣhŽS‡@ˆΰτΘAύ«=€ϋγƒγž:˜wαŒΓ<OŠtm•sβ`m"άΨΠ΄S'K₯”\k6nvΛ.ΤmτS7wΕ}β‡ξ>§+1šΧΙ*œψ*Υ«AΣpžθτ†, ΜZ·’lΜZ0SνAC,~‚α σ·Θ­ŽZ3.ΫΤ96«(SϋQ₯οήWm£ι…Zz„Œ§Αq@·Δ rλ{κ¬Tg;+βΒ…΅3\œΊ)ΧHšΞωwf1ˆν‹ζάΩΔ>#fZ)'pF‘Zχn:ψ_λ~«š΄‰?χ΅ζύ,;ό„΅―šVƒC ,ψ±†ψ&ΗςΙ†ψΏjˆλ†ψΏiˆrCό·β›Š|άDΜ+JJˆm-nm’…€žJ›*$0όŠΙœUΤkšŠ’ΰSΛΊ³RΦ+'ΚΚYΨM “Ϋ¬YΦ“KMδBο΅ΉUΤmδ2ηJ…½ΊRΨ΅eaa λΕ–uk₯¬Χ•eA«`ϋ˜'N'Γ“4!^ΫΦAŸEšZ‡ΧVκ`8΅ΧΗ!œc^ge±…ή^)τ¦šBWίχώυΕ–y¨Rζνe™β ψPΜ³ kρeί΅Τ ϊ±ΈΕuO₯¨ƒ5¨ύ€yp±…;M"Hΰi‘Εχ*­ΨOˆ’‹-πήJ7"Ά@Χπ]tΠ~ψΧL-οΎ&a”ε~’-° ϋ›χ³YεάTž›ZΜ±¦φXηWΞλ›„šuιΒ |Έi8”ϋWρ¦Α0ƒ‰Α‘™'zjIίΣT’8θΩVcΕVSΛyΓRΓošΞ ΌΧΆ;΅OO«Αe ς4υρŸοGΌΎpΕΞY[BΣ!»©•:ΡΤW†PΪpqεήI"D9X\OΎ([5Ζ­ώμ4¦θϊήΦd‚͍zCίcα(‹&ί b)nΑ™|Βͺ[€[Œ` XX-Ω*X™4π¬κ;ΛαCg§m²>§m~Η6‘}¦5›^]#}wπˆΧΛΝ=ζ{[ΚΕa¦Ω§ΧλOνWάLΫ‚Oc‡ α>ͺΩagUΌ iŒί`υα=wΑρΝ-Ύ9δ›`΄ƒl[Dφΐv7β§8^]σ€Η“mήOw›†σžš>ΆX,ΌTO„N^LςΪZb‰asΆ\L¦u„>―ΥζΌι^₯gΧαΤRm9w,Ίœ΄KKugΒΝιzΫΡτ› ρΏΫχKυΏi KΕ]΅κErw8Ψ·YK'έ”αyJΌπ lg`w‚Mμί`€Oq·ΨrNͺkΝzΒ²ψ>tΊοί¬Ω\>a!ΦώŸ Ά½ΉZ½YΗQ862=(Ÿ ;Φλ²VIοUϋ¦³K»Ψ71]ΐžK Ψ…Ρ4ς₯)t­Υ4€§τη*›²ΟZgoΨΉ@z’μ\Τξ€bZš«ψ‹†ψΟNΙλ’†4Φ΅†ψ―΄¨/ύž“ϝνοξ즑Ί—ntaR\°†ŽλΔρΕ%‘αύ@ή;œ"ΐ’!sΊθ‚]ΗH‡H,°ΓfΎώ°ZΞ’(–~ p' †‚ _xΎ‹²hquYΚι¦|•ΝfxŽΌ”ž»δJ@†’tQαH—Kιl€Ό'ΰ[ V!y—…δ£N»ιϊΈ.ή…fΐPΠ.`ŽNΌ΄§ήΕk>εΥψqoΓq G…*°‰KΏX‘ηψ©Š&ΗŽς&œcI§T謳βŠύ@\Ί–“NίπN€ŽιgΛQΘ λ(k|ιεGωτ{Ές[#Ό¨΄¬&/έjwθUB''ΧvΪi"|q”e|Επšβΰ˜=F6MΫχΕk‘ηŽ¦/°a€wΗJM=˜8ZM‘HŒ;pΠ+4΄WΊΠP OnΈxΙ(X€’!’~τΒ8Β{FγΜwι^.ιή³IF9ސΫQΞZ\ιόN΅Όtβm#œt‹˜Œφ²¨²‰_GϊŽ"7 ͺƒp:ͺ§™U’_x¦³Θ³†t\ƒKžaοA™ΗEt #E˜t"oέEnyEx]iA»’δJΉZ|Mƒ,q\Ÿ?݁d2.NT ˜! '{ΜI7Pυϊ’| k°"Δ?n Ψ F—cύTψ‹Λ ͺίχS\Ι…`†Ι ©/ Ζ! jΐBJό “0xΏ+…A;#'x-pΖ•5Ί\.ΤξYœͺά†Φ@‡ ώ d" ž)ε/&# ‡ ˆ€‘Sr2K§Ψ2YYPg_Oc:δ]Y ,γΡS‹(dkάvΉbγ‹pβ#ύΤΒΐ+REr"ΰ&t Ό/€υc,("ή^ΰ +“`—βΠΕCY‰fάΛ@Φc/•5₯σ\xr“9Ίζ@8εtε΄ͺ-Ι OXTœ“οΡχ“Aζ}?όδτ¨H$}Qο–%oψ~β*ΏY!KώjΊΎ"ίΤύ5\‰fŽΏ₯λ\»‘κh§™ λΘWq±Ό#F9^ xΩ‘:ΥρO b(Ή<Ή"‹Ω Nϋi ΟTά΅…ώΊ „ɝf ά)ΩοιΛHΉ1’M3YPγδΝLHu΅Λa(xeϋ₯ΪΫ@5•qKaτn¨3Ζ< Φ )°…Ÿ3ιžhχUΎŒ₯R­!HRW5©Σ)ίr8–;€Δ ΦΩΈcΊ­nΗ[€]“6ΪσXdr$št?(£qΊ ζ pn@τ”sf‘ϊBGζδΞTƒήLSΘλ˜Μ>ϋ‰wό©χ½Εϋ{υα½·¨|Δύ|Ωy#IΖ7nM΄—·Ωλϊ¬P1un©R%qχ˜RH’ ΑΘΦ'έχs1»€GHͺ$ρšγnΧe+Κ΅RGH y{|Gη§ΐpGͺΗΙ…«πγ¦A…”λt‹³Ϊr”ήiM¬"r%PζӘ @Ψ5:+Žrο¦'irH‚rKmQYΨΠ„ŸKΦ ³0§œ;Α„Lζ$gηrc„†ί-™ yάs,—{»βՎ•ΪFαLψX=U’? FIτɁYˆa=—ϊwιp”fͺŽΰ@έbαx›g:ωŒΓ&ΰ!1Ž I‘γ Ώ†Πσσ-΄%’;ρP)GΒ9ˆ~馍T@+΅ %…£τΌ22—#žνt*B¦ΘΘ ·‘Œ‚r*g~J;SžGI'B₯·—ΞH₯*‡ώQαœUΘ‡7}™jwŒ©A‚ΜAΰς=Θt] ωμ³χΌΐΔώTΐ`}FώƒΗ eς8°²ΐ(>ΝΡΦ@w wάΞ ]ΏΗΔ‘Η3Ğ‘`ά>…kδr ρΝ%ηΛ7ϋΟ—α¦ΊΗσγδž]]©ΫŽMoΣlz|O (ŽαΞnuV9ήLsθρς’ΤYL0σ’γ¦[RM·rεeΜ¦s9»θι~ή+:·c…Κ-MXπk{ήK@Oέ υΓK Ώ‰m$j“γŽ{€Iξ%½όKΆwΫΎΰ;4’lο/M­Ίψ@±ΣΦmΜ­χ"^ΗašΖaMϋγ*ΫDM·ΰ.Ίόž½;κG+Wš'J—υΓ³oXžή‹ΡετΦΞb†‹ψ¦:Δ4DUH₯όΰΎKΓ-{#{ΜEΘύ­ͺπJƒ&Η—ί)΅Υ΄ωΙ6 QeΙΘuΆΫXpDEΝ:t§ρ΄†ώλ#εΕ°ΐO;‡–}XΙ€1ΫΜnr'αΪWb°βΛZnsΆS§ΟΌ/°Ν@;έm2φΥM2ΦnΜE#ZίPR3θˆ9G±vD†VΊ‚-seψι€$˜γvδίYiάφŒK1ξόΐφ©qΗJ©SΝ’Y)zΝ‹C*Zθ-K· ŸvΌc"Q;Ή‡Ξ6ηq΄93cu ?hXEjί}³…5­^θΤ‘οg–Ϊ τWUΚ—Z©UΫ§TΓrΨQ[›Ÿk]›,m‹ Zώ/΄._]©€S1sζrwάωζZ‚ώφ²y?Clojurecljcljccljsednsource.clojureatom[^{{non_symbol_chars}}]+constant,(?:nil|true|false)(?=[{{non_symbol_chars}}]) dec_integer+({{sign}})\d+(N?)(?=[{{non_number_chars}}]) evil_octal%[-+]?0\d+N?(?=[{{non_symbol_chars}}])exponent(?:[eE]{{sign}}\d+)floatX({{sign}})\d+(?:(?:(\.)\d+{{exponent}}?|{{exponent}})(M)?|(M))(?=[{{non_number_chars}}]) hex_integer2({{sign}})(0[Xx])\h+(N?)(?=[{{non_number_chars}}])keyword5(:):?[^:{{non_symbol_chars}}][^{{non_symbol_chars}}]*non_char_chars{{non_symbol_chars}}#'non_number_chars{{non_symbol_chars}}#'non_symbol_chars\s,;\(\)\[\]{}\"`~@\^\\non_symbol_start_chars{{non_symbol_chars}}\d#': other_integerH({{sign}})((?:[2-9]|[1-9]\d+)[Rr])[0-9A-Za-z]+(?=[{{non_number_chars}}])rational-({{sign}})\d+(/)\d+(?=[{{non_number_chars}}])sign[-+]?symbol;(?:/|[^{{non_symbol_start_chars}}][^{{non_symbol_chars}}]*)οxΪνZ[SΫFΖ@n8WΉ„48 VˆιKœΙ8}h;Σ™δ‘yιT2d‘Φφ6²δJrΘoοJΦJΪΥ$‹”‚‡a=ίΉοΡa΍?ΛΡΪ–mν€§χeΈ?tv·λsτGHω‚PΦ’υ:E9΄‡ Ηω|Ί˜ίB΄ήΞΠ9°‡Ie 3a»­η£u ‰,ςτ\΄^ˆŸΊpΌ:³‰0Io%[ρ³@wέΆ0Λ“]θΙ–ν €)›ΘυB©ΘΦ‹ΡΊDm Τ$—’΅NQX6raΩό˜"q{Ά)£ΑΠ„hyАm³φ e@£Ξ°½­υ ¨›ΐxνf%Ύ­9FqΊ@‡ΩmW’u•³-C|5ZΧ9ΔCΗφlέζΨςZ΄qvyC °ιΘfœpƒ'=!τ@"^f|K—<ΏΙ Ο»VVΊ&ΌΊ ―2ΫΖδŸμΪ[ŒWڐ¨A·EDiNwŽ‘ΨEwW1ΉZg<˜&s=Y=Šμcπ,Œz€ΛŸ€9Š3δ>‡’+ζ%ο:“ μ§–ͺeTaΣ:€6‰@#KχFΐCΆ₯ΈPΧ=θ‘η*8aέ΄9pΜ’"ΆF @`ΙO πα,ΡO—ϊi@κ„iΆ_oH£dφΥR?§ρ.0HΡtν‘£ΓXfVŠ\9Σ8ηζ&ΚΉŒƒΨ=KiΒη±ιZ2}ΟAΏ LJؘͺζ>{₯55IS΅Ξ—CmγΓΧ7ڎ¦u€SvΘ‘¬˜ΐκ@/±RM`„;y[.#:iTIλƁOj+.ΠΐD†‚Lφ€Λ³Mšf™€βΓΞr•=ΨCV:ΈΚݞγf§JhŸ–ΙΞrPτ‡hΧh)[ `Y€7f7Θ[άη !ΓS¦$Τ=.T£ΖαΑgΫ1{ΰَ2ΊcrΏAq'YΏιπΏϊof„q“ΒxD"@Σή«;‚¬jlvžVkl^ι}€}…[N WžΓ Τ+Υ’Zmu§%b.T2Qq…΅½>VΨ›ΏyL*ά6‰$Ty«Σή֌­wνRVZcκŠ‡Τnώ9f’ Xˆ"a”ζ»vž7°ο%6acΓX£t-j›·ήh”΄ΪΌΐDIΨΊ¨g$ˊ΄w.Žό "‚Φ.ޘ±ν΄ΪΝmυύŽ€υ'ΡώY‘φ}ΈX ,Tg’,φ€ YƒLgΔί#β¬V_v|υώŽCIRw:’Ί-ΏόIώΘtΆJšφI‘iΗx au£¦Κ]’\ΟΓοε¬ ‰¬ΰ„rΰ¨:Ζόβ·ΙΈΧšX’Œ φ²6h·‚/M‰~Qαϝπa1mŸύ‹Τ|όυ­$5xΊ¦ ΌŒΝ«³ΩχΉ6c™&”Ώ€w[™v-ΣξPΘkAσΥ–ίx$5_s₯ψ]‰3†QЉ,Xxzη»!β΅@ΙVηy¦iH3vύˆKHΘλΘw*ιΒSο‡ΗΨC½I žϋΒ(ьΖf+―Š±Ιp[yQGώŽ‚Ρ$ΣΉ.G AΔ±―\Σ„³ύ>-ΊPιFIΩ7HVδυ§5οpΤ ‹H‘Š«'FE)Ο“]Ϋω #œŸΉ5©cL£"5€;«ςwp9Γ-ψμNxΤJ$Σ$DάοsΉoNΘ}>ΓαH³‘°k”°—/©ΪN«ΓΏ¦=ω~RO–Μ‚₯*³`bL¨qn›Rα,t>γ¬#ΜBEΚU0 AΡYΜBEH ܌­$ίf3 qŸε,΄\xW1 M_yŸ@ΤYh’A…³ΠδTΝB΅Οf‘SΟ_#žΝBΉFε”»S7 Mlp6 ύΝBΧL2 ^Χψ&/ΎδζžQρpŠξ”₯2wj’–―PmDkמ–{ Ή'2M‰ϊΌΒŎ.5—Πϊ;±[B…\₯˜p`tk.§ςΜΟώ™¦ΈΟΎκCμrΡ!F6­Ζ^8γ ΦϋΉœΛ±l۝?β›Ahw’Τ―L€Υ ‰ΫΉςο‘ΌΔφ(Hδ"½ˆ§5M!ό’ϊff5ΠΥΑχΠͺΜSz\\’KeΫBfPCξΖW< ^ΪPΏμ7„•—eYœž- €`cy\­O7ζ”F<)ˆσ0(χTHQθ#a… qτ¬0H!‡žω‡|Nδ³8δsΓ ŸΝ! ƒ|‡<ω\y( ςQyΨFz<½crδυΦ|•¬>ΤAq$Pτϋ(8Κ[ υςL³Q―>…‡†Zξc`ΉνΖ%·―ԏ† ž(˜ιˆ©uPΗ!oΝΉε*ήΕ],R°"aQ•œσFθPDιΐ!Π€ƒ©!ζ€?d0φ4Π~Ψ,i„}€?žl€z«Τ ~pΜ[ψΗΨσ~RKσ¨~ΪΡͺy½—=τς~ΖC Ή‚C,{ξ „ΆŸ³5WΟ­Άδ}Ζά-UQβύ†l•ΓMwŠCύΌA‘κμ\ofKUΜ­XΒͺXώ{ξ°ƒr&σMώΏhΜη,―δͺ_2&9 ΦC* ΦzΩX&£Π΄€ΡΝZ½ŸΥ)εCΖκFš•4vω0{ήα“mό³G4 ‡ϊU_…šeŠƒύš―Bi‘βiΏΞž|‹cκY~Γ3όwΣ~Σ a­Ρ˜Sκψ-φδΞ ͺ뷍™eΆΈPr‘…Σο܌'©’§ΰΏk0… K6π{F[(Hθ#ΖJBφρuτ•Œ)&Rίο}KαEs¨όF‘Ό•>ωˆTέΝ!ώΠ,€z΅jμΘθxDvΜ›ΤδVEπ'Fstk"‡ϊS£‘>δ7xYκ Η‹5Ο±ηZ˜Ύ•ύs£SlVK~Wύ₯!ύs&ύ{n°ƒͺrυ―Œι£ήhΟΟT±%bŽ …Z͝. nϋ${n „Ζλέ9žγ―Ω“«2ρHPφ6Ÿ2NUϊχo .cŠάϋ[ƒΦψ'ooΡP=ÞC!πd™P+–\ΡφOb]dΔπs5œ‹ξϋtαχφδ‹e1 ο‘>kt”ARηο ~4MΦξοΝR 8‡0:eΩh7TIϋΖ¨m•s*ZdH/ISJPςŸ Α«@V[κ ρ9£₯λ+™J[Βύ P †γ ψ―_z†aώλΏ$`fc™ύί Ύ”veρώ"ˆ=YρŸ†xT Ξ俌Ή“ُ΅ήϊo³ncζcφ†j[֊ϊ_C VhφFχsώηΏή`z1>l+υ/”$χ"ubΌζ•ί3 Β~-œK3z·› Κ―ύμWΎ8PΉ} £SΕ"wWdt so@uΫ³p!Ν΄€ XέVœv‡ρlθ•­lΓoΛθ,C2ΰEŒ¦…Yi«S)κŒp»Amϊ-Ι΅*£sΏ΄r Gьή₯Šu[8‡2ξw«‘ΈΪΘ¨ˆΦ>Λ €Ω,.hΛρ΅]ψ™pz©wet)CλτΌΫθΟ5Υ=}vVTήι^ΎN‡•ολ2Ίμσ€§›ΞœΈ>£O™>@,§gK•’πχ …Χ—?Αžρ™ϋ 6ςΰΤΎΫ–δο΅ΝΖ0ρΰΌel/x £ΛP»¦p ΨcB’΅π,QŒ³Υ‡ΆίΚ―•>!ƒ&Z‡Lž0έ„―¦ΡΤ @«{;ƒΈU…5ν`??ΘύύΏŒ“1ΧΒ}Ÿώq•Dvt€PΚRsͺΞΞvΪ€¨ZΗ*ΤΒΆ6·’+”rJΉςδΐ€"ψJ@Ϊ€†Χ…αΪΖ sΧΖONxΟύÏNNμΞZ» .Y4"jγӌc>…Ξ³x{!ODažˆή|%£@©ΈLjΤΉEiόΉ4Bω>`£ D‡B)Ό‘Nh+3ƝY^Λ^ώ2ȞsdΣΫ‘#7ίrΙΒO“ψνrΗ­—ƒp,Ωp|}  ―σ—­ Žtž§†<žΒ1Š}—Τ’χi£ΔΚ·#h/ΊŽφ‘μθμΑΉ\΁ΠS+y]vt,μψΊnΩ±ί— ΄―ρ—‘PͺRYΠυ+zƞιt}_&!όK!ΛKΨ€‡7‘iΤ‚ΊΉ€­ΞDΰ›Ύ₯Σ†oΎ ΪPήο,έ6@#οοeυ)ΌΡμΠlim mSŠSΙG΄­qDͺΛυuΦ)CΜρ\‘Κφ˜aσ{ΣIŠ λΆ\Ώ οA¬ΕfbΉ™σ•ωŸK:ψ½/δ³£C…|Ξ\Έ]rζΝJ«λΌΥ‘½cΧτNžά&˜‘ψόIΦ[o`Iν§Zž8GHΓ«A=}ι’ ^wjμΠΛ‰Q»"ΎSx9φΆ(}kcŒ—«*§0›‹τ ΰγΆ°{_)εŽ6ΟK(qσΩE²Ϊ-μΞa†ίΎM‹ZQΏši“*Έi-/MkΑ’’?˜‹‚DΥ°0&²uΗ»΅Ύά¬τe)[­£Zρ©DvΞΤ…έ·qξ(QMϋ} ννQΉbΛW Ϊ(cB#kτιMsΣΔFθ|£=γΙΑW8θ’τ-TΒΫω νƒŽE8}ΰΦξ――·ŒχN'm½!E±± ϋš4ΠνΧΌΏd³>ύΫ’ WK£cμέm ₯m c„ΏπΣΨΎ„te ˜’Ώ;t΄'ΧκHjΤΌn¬Q–Ξ&"Οχi]m(ή€₯»‘θ ή€­μΉVΣΤ₯³)AΜv™ςzΫΈ{}œΝ2Ύ5bχ –xvΥ„Α*AHΌT*vjνXKφ@ΒΡΏ.φPα[œ%ΒI„Μ’β‚žn€βlsΑy7=ΐ[4”iδPŠΣΘ-PO’­z!ΟqΪl0Ό˜d)SVͺeά†ώ”θ1Μ[΄w8νc  αα5ΐΑΠΒρ> 7«Ϊ"»·ˆ…'_wέσύΆ1aϋώ. mΪΖΧ’•w% ¦5’ŸƒDnΖ€WμkFκ₯6~HΫ”Ί.ιγνγ»sΗ•€Jβ7ΈΛΑ—€? €½/N–Όoγ—δu·cUΰ‘ηoͺO<Zν™|e€Z±\v[-’co­{h·‹9Υ|HλJSόa§[yγ *έΜΥΏ€E«3εY™ΩΤrυ59±’gžςdTK=‘š‹ώ­?‘B}Tη9SmJyž¨Ϋ¨Ώ Ε7?Ε­y±pV iά_OΥό©ψΘJƒΦ HOCmh[ΓΆ^J’HUδτEαυοx£Ι;F£q΄ώFœ=ιqφτʈ£ΆO“φJΌ±ϋ™¨‚³/ ³šΦp›lMύD”¦FžΑBΜeƒ_η ±MzλBw }ΟSβ{ΗFς> Ωχ˝~‘@hΰi™έ–ΛŽ—η+£rττYFΟφΰΡΓ0 D4‹X'°T|Cx$Αy4ΗB!;ΎkΫh‘°ΏXšͺ7ΫW&ΠΥΒΜ΅‡£ρύΓΟ™Έv`οΓΧQ§{r‰τYŠΜΉ D?cP˜Α+ƒΒL2 fs‹-2*oeψ3{±πp’{Ώ…ξ›Μ泡©[«2ΕY_ςžκ_L–ΤΖ//[˜X*LΩϋ¦ζnφ¦Š°ζGΎhZzύζk©.Ι6φΕ‚lτ –e(›Οω=°Ϊ]α_ˆMOσ/mU΄μJχΗς·8Ž €%·LϋτΠ;A ωz§0N“`J°˜ ρŒΣuϋRςθώˆΣDBσΨ«½EεzšTά##]ϊޝ”R Λ…ψ]ܚ”>_ͺ€KY6ΐמ.ɝΫ2ώ΄nΔ[ς³ΠΛj¦ΦvςρΤV§K–τ₯5!ή pLW.³k€»v™…=±ΓY½‘Πχ-³³¬ A£wiσΰŸ;]π Τww’Ά/s?ξΣ΄΅¨$ŸΤ4»uKŠK›#·IΕ₯}Π’ΏΏΩ+ΩΠϋ.Τ±Ž2€‹"$m^δ$E'ͺO½Œ‡Ε|)Δ6;V/NŒUϊvήΠαD—=υCzΡΝh1œΠ8ωI'’DˆY šφ‘ Α₯³l‹Υ½αγ ΨΡ)NŒ#ογ8υ¬PΔ}Y% OŽ~ΠEΉ•$ς U δΕΖ΄§ρt­Tδβo²“ΆQΊ±χΣφφ^­8leόΆ/―NτV£Σδξ}Ά!ξΟ­ΦPp’Rx‹δ0ΎvΕ<0~ρ™YΘlΨ",]D6X†ΝΚ€0Dς2¦»βςγ§Rˆ(N’DρD΅U€k Y;.k‹N ŒΧγˆm'ρ ☜ς€Σ£βωΘ>}©σœš²dΗP==zrμ`dΦ@Γ$Œ—bP»ώΤ©"άqπ’bΦf–w›;“ΩI8ΰ$e’žLΐ3@ZχΝ‹BH#8wYΟVͺ-\΅ή˜.£Ή&‘qνΤ*NΉ¨΅ΠΒRΤnvˆ'8 JΈuœ‘ΦF@OzιφP/ΪφΈ˜xφ4 j7Š9_ρΉi(kαˆifΡΫoӐ|4I6“€»aΡεά*ΰ’ώ^L~T,΅θυHhͺŠ78¨qΕm6«Βy2κ<’W  ΙΙi/ς/ζTωΝuš.jΊSψ»Σ¬£b§έˆΛ€ΟbΟΗΨ”8£!‘&›|”cXπ—ΐ)Š‹K±Žiΰ₯†MzEwΙπξργB`bσMΪhΘyo'ηBΆ¦έρ:„ωχh˜ίαΗΌdΊ„ϊθ/ΡSΊ\_ΤO«έ6’B)‹=Y퀨Ψχβ*δušJ=›ΐz$h@E·j=(+škV―ΰΌ„iۘΞxœΜuJ5<Ζά«δκ)₯φ!Ή<σ0_yA§tHEΕς%œ-QΆVέfλkο–’\˜Γ ¨`₯“ΒL UnΑ‚γ1ΤC‰†<&F” ‘δδ΅…τ;’έΎg|™ƒKf]s;Τ¬ƒζΎήhZͺΧB$4ͺ‘pΙ9XCβυ“wk·²ϊ ˜7₯ζ£Ϊ/(Hd­ε"ζ#ΞΪM/7F,6~·Nά\ςB‚•"W4‘RΣ-^BĐ|΄½Ρ ·Χ"΅ͺυŽ+;‹nE‰ρήyzSώ^GΟΪšj4»oˆ?'›.ΉxΑE|™‰¦8_uJ%½%Ӎ‘NάɆčy¨Ϊς »³Εr³θeiΘ» ΥέyΑ$$»`+Φ»‘Μ`r–ǁŒύλzW!οŠ!aω ΘC‘έ\@d½X­ οDοˆA\ωΨEh~¦Š±'wI(ά>9‰‰^m·πΛ—\._dΨCά‰*-ΰΚʞ›2*γ•ι}»ˆœ AeLχͺΠwγύZeίͺμ+‘*…­5κӈΎ΅fHGthZr‡€u(DΗϋυJ·lžοy£ {Ξ³g½S«‘#ΈHwrςδ©±““όεδ…±±Ι³GΟΏ€&=~ζψφλΨ©Σ μΒιcηO9MΏœ}βΔωσ/Υӎ=οAž8s’>ϟzό„x9wώθγg鷝8}όΜμυ‰s<{Ή=EΊ 3U«ƒΧΊΪψ—ώn)ŞΕc˜©`M[$,^₯ ν~ΨpˆΛίK4œα…ΏG+<¦Β{€΄τ½N–ϋQnv‘&Ϋ„4λ$]Δ9ΰ&Οi—γTΫγπeϊΡpxΕυBk…eph7tH ―'τε[ɍ]΅MΊΙDF$μ^ͺ…χ‡ piΉ¬ή’ͺŸέ-Π°+μΆξΉ1‚έm{ηΩw€fψΕse‚mΰ·€4]Υ΄A|±㠞\4VˆJύχjε»ϊ!,PFπ" χ)/(HΙ— *ΎΆέPξSN%ΰ~Μ[VE™ΛΊtΪLν”„A$ˆΔQ„±Y~Η‰.•–fˆώΨtξt,ΤJ¬Γ€η Η‰²³MBŒ€§³lYEβ+’ΛΓoτ–ΚrX[ωDuLr­³DDAFmsζ…‘]δ|lβˆ(94~±PΨ5‘+μJGΖ»tkΫm•"ΔULΈR4iόβ.άo»BΨv/^m’kWΈδBNzψͺsΌp½0QΘM„·³?ξΈΤ=ϊ$ηΦ@Ι9[œ›σ"Έ$+uÎ+†ͺwS,‘χ VΦN(_1#nͺ D*²Ώ €}Uœ$τ½α^Πͺο ΗΥFΨ»œΨΒΧΆ\<μ+λqh`΅άhμPmΆAu·V9Η6»oίΎΡ\~·&θ—/J€BO7άΒ€˜ MQqM7Ϊ[O¦Ω―nβ›ͺz°žϊ΄“΅-JΦC£8ΖεڌΩ© αΑ4hΠ c¦•λšξXZΏ Œ5Jξ‘ΐ›΄*ω&'i»ETηRu* 6}ͺ¦} Θ…1h₯E…OΗ‘‚ζ ΆUΰΓά2=―ςίsφ`.œ –ƒ0ƒΐΐ‘wY5Zνa¬ŠnΛ¦MΞ~ωUδ³θύ±‹φ\ͺλΣ²Ρb’1puθE[†Ό’½C/)gΑsE7eβuΣΆ n’‚Ž˜ώˆrΜ†η7‚\ώ43…T?T}Ε•΅[%ν·8)ˆEM^E°|ΩFγ«Μ{q•[Β  Ύχ„―w!¦^οΥ@ZZQε£έΏ3θ@Τ«ίκΔΰαώ`fIαδθ½ '8:ώΚ¨νz\\ΗΩ3=˜ρ¬Z6ΠcΞw™ΙFIŒώ,6v+^W7 žΘΪν f<―Χ:Ž©il^ € €J*rΈ EqΚx†q*wn‚[ο8G±4ση;”!_Κ._ŸHžsz·iΞ0a~q $€S™Ώϋ5tžAςζ…XύφΕ ρ†λD˜h’<„½ΑeOJ' ΏH³GŒsvt Ÿ\oΓ±λσŸ)šl7€€Φ“ΚJ29_Ώk:soΈšΎ#ͺʜ hΗΒ[Ώ€}‡“”ΔΡ§š„ΊΆipnJ[”v+±Ν‚”Ϊθ3ձžΒt G/Φ+ω:睊:SzWάαc€ 5D†Ή{½Α‰ ‹m"π @Ϊϋγ°iύστΓL‹©ž_K“nυ6iΏEŽσe²xKθ΅υF­Ω$ΣJ±VΘOμ‰θ,­ϋEρ[4#­ψ¬² θzπHq£αΒ„+ΑΡΠeΐZΗ‰ρΖ9 ޏωd.™Ά~όΎΠH_˜YNc>ΩMφγψ1>!φ‘²rΔo:ΰόΓͺN9TΘN€Q‘KQœΨα.­καίΈ¬›C£ξ1₯ˆ―‘ΩρCxΏΧBγΤOJ@(―ι>`coΤP9|£=UίΤ5³Œ‡!’f?˜BٚŽη€`Βƒϋ'w£ρÏNŒ³}ΐ(υ”Λ“ % •ρB…¦ΡΤqχΔΔψπž‰ΡΡBeNŸ:961ZΝ™BUμπφΖmVΛωκlKbsμ~π(ΒC45…Θof—žwΚځׯxΟρ»'³£Wή>8ΐKƟς‰ί0Eψ«Hά>x `/ωpΩcΨ{N±Δ)žκ½Œ±δ1ž<&ŠRι=θ§ΆV₯W«‹UΒλ`…ke#Zy$Ν<†Ώ–:νΑz£=ψd>δ`£9ˆ‡λL£²―ΨΖλ5ό›;θΝύZαC…±έ€σ @Ε»[*Ά€˜2|‘i:’Z;'"Ή’ϋω鐛³~¨Xχ‹ΠΫ$‘KΟ„ίΟ!¨†ίdΨνα [b3€υϊΉKΒ¨΄Ψ…>{Ώ…™–)BΦ^š‚‹―‚=»“ζ€FDˆ΄Β}Ρ0‘ζvΫ›5L€‚Ι;«άuρχkΕK?:L‘λΒp,”΅/©ϊXluœξΧά½wiώ1 ν-½C}©œμ;”šΟi‹)4Ρα«Α4z\sJU¬&‡ #°Cςw‹~oνGβΝ6άNΕ'¦ΦδΝ@Z,“±FŒžœr ―0΄ΙՁ”πz}K_χΎUo½tMFΟ0ή†œƒνχΔDδχHƒ΅——Ό›gΒ„vžƒ Y()’`έ;r°›@^5a—« $Έ\-0ˆΖ6)«Cό‚’Ζκβͺ [ΏόΈήTο/K Δ`ΠMΠAΨΝ%ΙaŽ8˜Ό HΣxĜ+‚*‰ΔU+,d¨§uΓΔ6  3cZΗW~J«B‰8ΙbΆε’[§υΠ)έ’—ΨΡ(ζu/?€uuΏΰ;γpVxΌ€«θ†8ο"NjN@Λfl̝v§QcξXcžm΄Ϊ§κeφvά%oΗH<ΑΖάΡJžλ”ΌΟΙ&~>ή©αΟγΥ+ή§—Φ¨xŸτΫΡ:ωv†ΌΎ€A>ΟΝΤΌΟIοϋ€ί.x_/ποNJmο“~;qΉS¬΅Τ—c³sΰ'Fυ(•Κͺβ£+ή1Ί2½!α1ΒβύLSΌbδe‘35ε]¦_PΏ`¬Εϋ©zŽʟ D’’V-»ό)~ΔδχΒιΜ©IŸg<ϊ`€&›ΎγR!S£υT2_eη•€€mˆθ76e₯Έ³.OιυAHGΔ5¦ΈJμ'Ϋ­Κφ^ΜΛ_­Sξώ φsiR'p΅Ωmx¬·΅ήiΰβύ₯·΅~ŸΜM7ΟΦϊΑ4ΈΛt%Ν=f»ΓHŒΰ.θQwWšcWηέC―»χƜ“Λ7₯ΏŠ_ΚηE~1¨ΒԏSά B₯vΒbuY/wNΔ¨•syίιz9ΞS| [f€h1°ž‡έ0V T‚ΟYEgΙτzχ‘λLiός2θ5ήf²€'ήN‹Λ§¬φϊ±ρΞ… D>ΖΠψ~HWΎ’π»1ΤΫξ4žδ–©ύ~$ δ9D’a$Ρύc–]ψΞr“ "ΚΆ0’H‚„m–Σt½X„ˆ~ρφΈŸIC”h3*ΧQ•ίh‘\άQYΚΨ9ΠιELa*ή~ΥI*Ο£›Ρωi UΥ’βk뀬“‚ΌνυΙΦ\oΉ„έvz7—€ Ψ"οŽΣΧ=>ψv ΕTώτ'cκ@%Hj-£b>RAC}εΖ,.¨Ϊj9+ύvkb― Ύήaξ€Vk4ζDΥ3@lX,”*XΥeͺcdEO5š=iΚkυ= ™ΞrWR'XόˆΏ›½?σκσΠaΓΏ\ά.tά{6B•βEDΙm“]J@μ± Ω?±€.#‡ΧΨ R΄rŒΕ5,D­£Fΰu’X΅’5‘© ϋ’ψAΔ(½ΫSfͺθ΁(FEkՊΜυVχΕ›1Μ;εvjekœI/λΊθ8#Kλ§π©5ΆΞΦzυybe…Y’ή,‡ΝŽ{²όZ7Œ*ϋΩ~M,mŠi_hOψœύ#»ΊΤηhx]ΡγσŽϊw·ΩίUSVd5LΥώH[gυ`‰εβ]ΰ'Y!hΛCφ­Ήb Uh―cΕΙΐAΖί“ΕRŽžwbΠF›ZεʊΞ(…šmΊ o[,BαβRkΗσؓ̏ωQΛΡτ,a»ΌεΗάn 8„ΜŸi₯!Σι *pΐΠIg²ή;Έ7τήσ˜6‘Ž΄§w–ϋγ*ΆK5ϋΎ4LΧγβ”ΏpΒ8%‘†,Ι¨ WΧΕ‘— ά δ —ώ£°ΞϊB`+ eΙ[]˜©cFΫΩί»AΡ##υ'’²JxζfΑG,Ξ₯xaMβb/œΝξύΫΊ\υΰŽΘJ¨Ο©718–ώψTœώˆGγC ΚN »DaΘd;t^&ϊΣ¦Cƒ}5€ΊΌnvlšr9ί/l£άg4ύ~aεšΡjέ»œŠ‘΄G;cγ‹Οjυτζγhuw;6ϋo6q‘MœEd“huΗ‘Πρ/,ƒV~6φ=ΰX„Ϋ’wŽV)mζωκΘkkŒύ’Ψt©—κΈW«˜):t ‰¦ŠΥJ‘—μD n`jζ’οŸϊcΥcbΉgœ(Ά¨8„ήΖ՘%YmͺK莾Z±δαB6‘WΤ[-<χK–τ‹–τ―΄€Š%ύ?-ι«2pϊwYΰΏΞ’ώ―–τ±€ƒ%ύΧ-ιwZπt,ιl)gή’ώυ–τί²€%}‡Ÿ³ΐχ[ΰ3–τ²”3eIKzέ’ώΟ–τo³€?mI †Όν:yoΕB Xiλ6ΫQΜ¦σ,*^~{”3šόυ~Ύi'©0Λ‚-ΆΫΗc“@7œχΕ‚Ά‘ ’•=ˆΆΝςXoόΉ ―ƒŸDγΝ«—'F·‘Λ.?·8ΝY•Ά-’›% —ζ€υ†…Ψ,4sΩmαsw¦ς­:ω%fΖX8ΫP~€ς“ιεY0].aΊ<[CY;ΎLPΆάή’'7Έƒ ’I‹$sΝΘwΒι–Ω°έZ•9‰™xZΥ†6j=G£Φm*΅ γK΅‹Ÿ€tv©"ύ¨†τ­*‡—*Ξν8_[ͺ8p^©ΌΔΊ™ q[;Γ’·σZΞ,αΠ©_ξ`MQ%οΞ–άJΕ­Dm^œΞ{Δ±ό…Eψ―t©GόžŸψuF[¨aŒ{GρˆKƒζA­ΥώHϋ―8mθqXέ^ dmΔΡ°IιΓR² ?“’ZH§’Φ|΅]žι:(ζšΊ ₯r±εΖ*βΖ«@Ϊ&πΎrcψT±Skwέ Ρ8άΎ,άβ`P΄ψ’j¦τπΔ· @»ΗΣ»«Ώη?%Ώϊxςμx[κέ»ZQqΜLΛ­2‚_ed₯5Ι> ΊξΥ²;§ψcGΥΊΔςΔ\«΅OΥ­΅\D\ΝΉIŠY΄*n©3˜ 7ΑΠϊ–.­Μ‹§Œˆ”$mό₯1’.‡Θ³‰ΠΛΒ G-SΜxVlΝ"OχδYΦ<ύ¬-M²h…Έ―†EFΥ)ΥEO€c«3L n$NR‘jΛ3•ΝΛΝ’Ύ³ΘsPEuw^˜Hva0dv»P3Ÿi3τl‹Μ°ΘŒ’ήͺyΣ—nŠδ̊<ΪΝD8ΌZAήύeˆ:y“ΟvΫΕ&τ τtΒΞ(vΜΙILτj»…_Έδfyό"ύ灴>ʌ{Σέt&›φ6Ω΄z§VΓΤΖ¬:U$γcrςδ©±““όεδ…±±Ι³GΟΏ€&=~ζψφλΨ©Σ μΒιcηO9MΏœ}βΔωσ/Υӎ=οAž8s’>ϟzό„x9wώθγg鷝8}όΜμυ‰s<{Ή=εφK±I©λΣL΅…kY:ƒΩΎΥ™s›AVP³Sͺ_·Hϋ·€*„ψ šD^œί‡v’BΓ¨°>ŒAGΘΏ#v£Qα"ώ‡?žΞŌ› «B²ͺΓ#θΘAC‡ό?½H9τ‘ΩIρ)xH SΌθ½‘‡9zΑ!R ώΛ@…Q΄D…Φθ14rmχ́‹ΨϊsJrQΈt 4χ€ώ@φ$¬Άψ¨.C“]%g«δyp%Χ’^Σε†WqΜΆϊdŒ™[ΫξΘC‹x2#w³e}a.-Β-ΡΚA„’ΆŠZETƒΙSZ΅rΫΓfό^΄-„ΠΪb8ՐĢ5ό) §˜ξ²—γ΄Mc’AΡ6ΨƒΩσ£ΊYά¨ΫFα’u£^ΡΝΉŽqΆΪuϋ$Ϗ«DίuΆucά(Ε'4μ_b+ώ€EΡUO΄E­θηkEηT²±ΥΌ·0χv?rΣa\aσρ:£ΉκξՎ Ί%©ίΎ±T"3ΪΉΚΖ­`ύ«3©Ρa0€ι†Ό°θ³”76²γΓAΗ ΥΖΠ¬‡@Ϊ‰ƒγΖwζTjWΫx‘†Μ"hήmJ/Ύ·Ο₯vώ˜X ZZvIΟθύ ™ߞ₯֘–γξ―οr~:΄δR΅=_mΉ‘Kζ͚·iΞ…o›X§‚'>ύ4ZMBγ}ήΞ\κ Ρ m4&_L₯c+ύ΄‹OOρΧ}ω:φr;ƒUmέ~Ζ‚Ό§ŒΞVΑ—kΘ5ΥΚςν'νm?aΑάӈΪΧB†ΟžMWΏ8<¬;ν)G‚ZΙ—tη,ΝπΤ•ΙΛ=―•+-Ι\§™Όδ ZɊ&t zŸQ‰M%nέ/Ρκ^%E–ϋΖG~bυˆ1K ΟI*qxn#|¨2Ε°Ωg5šΪ'ς¨ληΊTEΩ*Ύ¨x­Fͺ²!α‰d-ˆqd4NΉŸ²υΘdε!­ΌPΧ8Eλ^―7«A Z@ˆnŒΡjƒiGzeήtφ©hΝ–qμg‚FŽ„;…;4Cm€–“αƒΖd¨ξT­8[ͺνstQΨj˜‰RPΕEχυβ<–-– Ÿ'3~.¦ϊπ•b­γΪ=ωt:ή―N0°F6™L½/ έέ*€XVbσ9`šΟΩΦυbίΠ"—'Eή•Θ hρΈ‚Εβ­EŠ$t—9›@Ύ-OiGΎ„n (—Ίήb—l6 ο#φέݞ՚y©Ϋ†P»p.A|pΦ*(Έξž¨8|jšA[αx9BΌ†κaΪl½|Ύ,Θ šy€μ…>EΈ›?ΆτΣν0’ŸΨϊ˜ΈAήU“8†“Τ©7:I{Βb·ej€!ίφ€‘?νΦ½ω!›²1κΞ Ψ4^Θν=T˜(μžοΞΉ΅¦Τu?,Ιv§Γψ–GC'Nuτš«t\— λ·Νκ *(’MΡM­{R ’£63œΨ]‘DŠƒ/„OμΕ•Ρ»ƒΝX€£4 ?yΣιΎΆwΆΒ‰¨7t΅μhΎ& Ν΄b›εoIj*τ1cDY(ο»ι$Ν7 D3Eύ ]7½>@©iοu@މm]ΆLWL¦t?€­²υΰlœlˆφ4&ήuυΙ―μ2Ξzu»]ΕΫ Β” °ΪwδHpkΤ‰8‰”"έ x-ΪG$]—K-”@;Ο ™/1˜•Α4YΡ‹PΓΪGΊ€Ή*b“ΒΊšDφiΉά’υ\Œσώq'…q­-3V+]—CΧΡ:„¦°2ίάνΚΌ?–ι/p7₯!J΅Ζά!ΓφΊ‘[‘έαƒ*-šB NcΖ2’’!¬ΖςΤKžz‹Ή  ι-‚˜c’>HxKpεŠjΖΗ_ψ˜‘%&ώB.Α›@…qDo…Χ­}h9ΩθiR ύψ;A|κ #Ωΰš0νrΉl‘΅\’8§ ΝχiQ&Ž8νώ^'©θλΑyζ5i‹ΫT€›Ξ‚)» ά§ < ΅έΚ›ΐW <ΦΝκΠη#TΫΏ,e«2Φm&EΜ‘Τy'…1–β%ΕŽC69ΒέD0ι_£τ4Θ™ξ-š_α@=–’=δ•©³Τ²ˆ•!…ΙΩpΏKΧΪ˜Gςq^κ•DS DMD Outputsource.build_output.dmdxΪ₯’=OΓ0†Αԁ ’]¨ΕJ–Lό‘“•₯δωc@βΗ“Β₯ V«½ε±uχή{';cqN¬ͺ^i\°q±Ν:―¬Ÿ ρŒ8—¦ΔŒνd¦O¨G¬e‘Ο5Ρ™`uΠ][™ΰ‡ΰeΫ·σΓ1zq¬θˆc{OόΰrYˆ’σ·§ΥσϋƒΰEώXΊεtE)ς»­YΉNΌ!zνΏ$ͺδ§ξΰχ0Ϊ§QύΤ±18Ύz‰‘«Ωi„Υx©ΑntΩ‰:ƈeΝ_•Eλοk<»½{]NœSk°‘ξ[θ–8l|P^”e•7»‰~"]\Diffdiffpatch source.diffΊ(?x)^ (===\ modified\ file |==== \s* // .+ \s - \s .+ \s+ ==== |Index:[ ] |---\ [^%] |\*\*\*.*\d{4}\s*$ |\d+(,\d+)* (a|d|c) \d+(,\d+)* $ |diff\ --git[ ] )ƒxΪ­–[oΣ0€Σ‹Z €νΔ*„ Σ†d§$b41ΊWώCΤΙ$³–8Uβ Mνώ;ΉΨ±&mi—‡žΔΗηφωr:0ͺgΔενm„=2τg\kS†&Τ=.‡\ͺ¦}.FϋΣSμ{άGΣΦhΔyΙeg‰‡Ÿͺξ~ΤDΆMj‰R¨^¨sΟΈœΰZΛΟ—Op—_Ώ^~y‚Μ’«sθ™pϋJ@Β 9)^ ±8©άχ)ω‘ΛEF=–!Fbκψ8 ””―ΊIZ˜Ν] >ε?Πhε―<¨ ˆόμ7j~…?'AτvhœD(Τ΄ͺ’ZΤdnn ›Zΐ™ΞJ)>­κ³ώ€#|FI@°²Ÿk*‚Γ‚§› Vž ύ†α{5 ‹=;$)sBB±M³θ7Φ™wΈfΎ.1e„=:E8_^―r -ξ₯άzΐ-χšιLΝβυ"ίv«rCΦƒV9w¦νΕ”αΦB›ktΪΟVώΞ†£} ΗϋJςίΕ/Π ςq…τjž_ε(˜]›Ά ‘€v ώF~Ύ£‚$Žμ€„X›ΡTVK0hά½;^Ί—Ρ!ΖγCŒ%UGRu§œ£€h;°Μ f=^³œt±dqlB’«tŽΝσΆΉΥΗ`ΣααQ ΓTn„ŸδΈΰ¬ά–S˜Ώw’Χu»Nξ³…ChŠ&.~ΗΡ>ߜ™ζdt€­,λΈ.λ4―£»ŸVUxwΕ‰υ7χΣ-xU2 ή ^»n#/‡x+ά-y©>Fϋ›Κ’Δύ>E}ό ™·ιυ.qΌvΈH1_.Gτκz;,ΏόλrνΏ(ΜΪΫπ»Φ6\»μ‘u]άζgErlangerlhrl Emakefile emakefileescript source.erlang(?x: ^ \#! .* \b(erlang|escript)\b | # shebang ^ \s* \%+ \s* -\*- .*? \b[Ee]rlang\b .*? -\*- # editorconfig ) atom_unquoted[a-z]{{ident_char}}*erlang_functions·(?x: abs|adler32|adler32_combine|append_element|apply|atom_to_binary|atom_to_list| binary_part|binary_to_atom|binary_to_existing_atom|binary_to_float| binary_to_integer|binary_to_list|binary_to_term|bit_size|bitstring_to_list| bump_reductions|byte_size|cancel_timer|ceil|check_old_code|check_process_code| convert_time_unit|crc32|crc32_combine|date|decode_packet|delete_element| delete_module|demonitor|disconnect_node|display|dist_ctrl_get_data| dist_ctrl_get_data_notification|dist_ctrl_input_handler|dist_ctrl_put_data| element|erase|error|exit|external_size|float|float_to_binary|float_to_list| floor|fun_info|fun_to_list|function_exported|garbage_collect|get|get_cookie| get_keys|get_stacktrace|group_leader|halt|hd|hibernate|insert_element| integer_to_binary|integer_to_list|iolist_size|iolist_to_binary| iolist_to_iovec|is_alive|is_atom|is_binary|is_bitstring|is_boolean|is_builtin| is_float|is_function|is_integer|is_list|is_map|is_map_key|is_number|is_pid| is_port|is_process_alive|is_record|is_reference|is_tuple|length|link| list_to_atom|list_to_binary|list_to_bitstring|list_to_existing_atom| list_to_float|list_to_integer|list_to_pid|list_to_port|list_to_ref| list_to_tuple|load_module|load_nif|loaded|localtime| localtime_to_universaltime|make_ref|make_tuple|map_get|map_size| match_spec_test|max|md5|md5_final|md5_init|md5_update|memory|min| module_loaded|monitor|monitor_node|monotonic_time|nif_error|node|nodes|now| open_port|phash|phash2|pid_to_list|port_call|port_close|port_command| port_connect|port_control|port_info|port_to_list|ports|pre_loaded| process_display|process_flag|process_info|processes|purge_module|put|raise| read_timer|ref_to_list|register|registered|resume_process|round|self|send| send_after|send_nosuspend|set_cookie|setelement|size|spawn|spawn_link| spawn_monitor|spawn_opt|split_binary|start_timer|statistics|suspend_process| system_flag|system_info|system_monitor|system_profile|system_time| term_to_binary|throw|time|time_offset|timestamp|tl|trace|trace_delivered| trace_info|trace_pattern|trunc|tuple_size|tuple_to_list|unique_integer| universaltime|universaltime_to_localtime|unlink|unregister|whereis|yield ){{ident_break}} erlang_macrosj(?x: MODULE|FUNCTION_NAME|FUNCTION_ARITY|MODULE_STRING| FILE|LINE|MACHINE|OTP_RELEASE ){{ident_break}} erlang_typesΔ(?x: # builtin data types # http://erlang.org/doc/reference_manual/typespec.html#the-erlang-type-language any|arity|atom|binary|bitstring|boolean|byte|char|float|fun|function| identifier|integer|iodata|iolist|list|map|maybe_improper_list|mfa|module|nil| no_return|node|none|non_neg_integer|neg_integer|pos_integer|nonempty_list| nonempty_maybe_improper_list|nonempty_improper_list| nonempty_maybe_improper_list|nonempty_string| number|pid|port|record|reference|string|term|timeout|tuple| # erlang library # http://erlang.org/doc/man/erlang.html#data-types dist_handle|ext_binary|iovec|message_queue_data|nif_resource| deprecated_time_unit|timeout|timestamp|time_unit ){{ident_break}}ident-\?{,2}(?:{{ident_unquoted}}|{{ident_quoted}}) ident_break(?={{ident_break_char}})ident_break_char[^{{ident_char}}] ident_char [_A-Za-z\d@] ident_quoted\'((?:\\\\)*\\\'|[^''])*\'ident_unquoted[_A-Za-z]{{ident_char}}* illegal_ident[^\s,:.;'(){}\[\]%=|/]+support_namespaces(?x: # builtin namespace erlang| # erlang otp libraries # https://github.com/erlang/otp asn1|common_test|compiler|crypto|debugger|dialyzer|diameter|edoc|eldap| erl_(docgen|interface)|et|eunit|ftp|hipe|inets|jinterface|kernel| megaco|mnesia|observer|odbc|os_mon|parsetools|public_key|reltool| runtime_tools|sasl|snmp|ssh|ssl|stdlib|syntax_tools|tftp|tools|wx|xmerl ){{ident_break}}variable[_A-Z]{{ident_char}}*Ά+xΪν=”Ηuΐ›HI”DI€XAΙxŽEυ$ς|–¨b«Y”lΩ‡#²φξΦ\μB» ςN\*½ΗNœj'±γ$rzβτΔqšΗqŠ^βτޜβtgΚΞμΜμΜ,€;ϊΌ]|ό™ωση?3O™.Πη&ό(Lh–m54ΟξT»v·qb{\Α q‚¬ ·q8MÜΥjΛξtΐ7Š<<ʐ{VΛ3l«ΪΥ­£{Ί&žϋd ½Υ.K΄!xή(Ibm ž7sX­e_‹ΛnSπάΞ#‚*κ–’mž{4Λυ4Λ«Ϊή²ξT;ZΛ±Γ4[€i@Ά†·Z΅@½(sΒ4ΧΟ;”i„BΆΟέκv»gκaŠm‰)½e;ν0‘”]Κ°±Bό€M€»-Ε"ΏήΚc­t a–ηΨfˆ»=χ$ΑΉ)χΤvAŸ›ύlπά)ΗΆZf―ΝΘΜs©Π)ε―M…NI]*tJϋσ©Π©Ε{},cΔωπ`ӊΧΑ¦υ¬§Α¦Υ\ˆΕgε`SΊi°)ݟ’›­IΗ Ϋ& ΊΤӜ6£ύΝΤIh ZΑσ€:‰ΜΪΆ“Krt―η0#D]:fb“„Έ‹±%Υςσ‹₯Ψj(‡ΑΛ±4ρώ#—rυΑσ6)nΟφ>Μψb dš³™™ \'2•7+xξΰ±T άΆQ)½έDTJν ‰¨”V'xξ•‘‚±΄Ωv#U7}J½'e —&, —™ζ|)2εΜεΘ”7+)©Q_•φtdLΐVρΕTθ΄’W‚η-:pξzΊΰρ₯ΚεzΆ£-‰ŽΠ«†τz]SWN6_ ž‡εib§ΨŸkΑόA}ΔPΑϋFσ:πZ0υ}Yΰ<Žΐ‘_ί%rkTΏ)xξVαΊ:DΠ ’ί<―SΠΨΑω‘Η FΔoŒ‡žmδn†δo”†K³hΪ—Yδo%'ˆ-‘ίΏClΊHT‹`~§,'/΄ί<·1Ώc‚ςnIaJΥ]`“ζw …‰Bό=‚9’&†eξχͺ`ΟEΎ/xξ”!…r@ΠΏ_¨ε˜`ώ@,fWσ– ζ "`†bCͺ ;©€V•1¨οΜuSh• ¬dΘFPί+h ρςG=•…δξ ŠŠ#i~"tQvWη˜ϊ{B Ιο°ΉAS.λ–ΛthΏ/ԐbχΨQψ=E(ή‚ύ‘Π` ’0Ζύ¨˜₯ #ˆ!ΑΉpιΊγ"oZdώlΊώΈ(-“εΤX‘―UWΊΊΈΘk˜ΰϋ₯뉋Όξ„hli‹b ΣIl*ς­LGUμ8‘¬Ψ ήA”˜δ-Eή …ΘώB­ρuBUBLΆ΅· | ±zΣΥn ΠΘ,τ…ΣeΑE^CX8] \δE (œa-Ρ%ΐB3γ_9ΡΪ.¬jP:Ϊj:’.ΡUΏt€›,d>]ς+π>‚ΘΆθ-ςF™Φ‡Pμ/ηωVAθeΎΊ¬7ΐέ+βΖ λoμΣ( ΖNADx?]Κ+θudΣ•»EήL)δt―X*EgulO‘ξsΊŽW™-ΫMμT—Α zΏ ‰‰kΚ‚$"I3–dTEζ E1δ°„iΐ!Y–GΕ„,K•“β°ΐ•KšΩ‹xv¦‡† "n―£ζνJL6ίIAslͺψeA‘#1Ί˜V`Χ «hE”ELθ"ZU΅1.S‘γΛ₯1ΊvV•m€%kζtπ$;lˆθΑQx Ζ(jΊcjΦ±Δ9^CΕΧάΥNΣ6œσ)2Ο LW@‚£.Oό EqlBm'8εΩ3gΟϊσ΅γχ/Tθc‘r ηιŠη.”‘žΕ¨FϋΏR8zDσ[—Td<’ί y™ŒΝτ§^)V4+²θ¬lXžΎ€;>pIkžC;~sΥΣ]πΕΓέzσ{ήβ½πΟΙ»αίΣ§* φσζsΥ7hΥλνW,,] cβ OFU‹AbΜeΧX²τΆί³πK\Ξ‡„œΑL±«†“+#aY†_nKΎixž©ϋ Ο5.ι}Μ”‘Yς’H—™“χ^Uή0—«(΄Qσ‡!ΩΓ*ͺΥp :"“χ ŠbΎ\όkpbcֈάΓE9|Gq]’ϋέΉKΊΩgL‘ζ]2“IκMGEΤζΐ.©ξ›n?EGΑؚ ό&5ΰ-k/PήE…)9λJκφΘ{δόBGDŠΓ?ΥΘψ`Ε”Gk:¬:ξ•JŠC(οIyx 3„ΒvJ cϋͺ E‘ίK1Š‚ΰ)ΜΓΈ’¬·±‘Iύͺ_žνΜ¦}KY2*έ³” «Νi.―w’Μˆ#Ω°ΐHΒhΧ‚`UmY_‰tSπs#Λic1EeUφθΫπoΞ΅mKsυ”Ήƒ-H§†9Šύφ”ΕήΜΫ4νΦΕQ :ΊT\Ώ…ŠŸΈΌqOG„~φLυ¬_―ωe ΨΎΆτΝoi^kΉ"ΑxaΟCΘ8‹°'$dΎv‚ΘΘVςΕΠγέ*ŠŠœYŠgUl2―₯ΫψΉξΊBΗM­©/΄/cϋi–ĝE³ΎC₯έ¬,ž’-Iͺ”΅KόCό=%·Š” ۟,ΨΕ„š¦‘ΥθοΈB>ΜfHx=‘ξŸ©έ?Y\ΉZŸ―/9γO/ߝςˆv;ˆ.‘ΙdπΧzΫEžυΟτ‘fbΏ£€ob‡’›B΅¬Ÿ―XΊd’ό"αw°uΦWZziˆ—i˜>$ ƒdbθCk΄'Sγ`G-€2Hϋoβ‡E–/fϊy41{”[E·φqmG GΖ7Wα(‡€ΒRv`{δM©a «³™­οAF΄Ψ~'‘Ηαήͺg©“Hj‰/'ˆ ,λ}%1gΏ UψCGGb ξkP ˍυClV«AMU;άJΘ~Ταζμψ“ΊίiŠˆl!c=©¦\£Rφ„`ΉΓ•‹5ΦΘ1ͺ{S!žw‘ΆM`Œά0”‘Λ!±Μ2V­έ8…}£‡9ΪιG ιd|$…IM'ŠkPh)ƒ‰“ΪΤύ§ y XvWΣ F6ΔαkΟΒX½]ΝΪZ}q4i8ΝΠΧ¨φMΞΒΐΩƒBλ}Σ“±ΉΈQ2u‡gδˆXΘSZ«‘ώžAšΩ”‹Ωˆ­ΪΊ ͺ$% ΰΥΊUΌ«ΉΛΊiΚ€}Θ„½ή,γ:ψΐ‘ι]―Ro’"θτ‡ψ^!^‰7ŒG%έbŒ™|ˆp}1ƒυSqο—Ω„dRzx¬fΞR8§bGλvAθ5 œ^%―\0‘βγ½ENdl>>›‚’J*JΊš‘8»3ΚN‰τ’ΩzeΡγw+ΰGŠςΒwΚ Œ)𛕐υj`[7‘£IKί5/sw―™»g$2W*o™K’/mˆŽ:σΔG:γΈfφΠA,|·΄π¬γ6±”[‹ιJ?Δ–,άF›„jt―Hξ_²›/ΞLA7H9Ω_{Ά JœΒΩϋŠ‚‚ϊ—UΤησ[“Ϊ1μ`έ0©ά³b‘ΗS4§ΥΣ§γM ‚ž₯ρϋqΗ)Cγ erny²rΈΦXΫ±$3HšSτc· 6*ˆG4IiŸLΆG§’WͺΔϊΓ ψ—Ωύ>*Μ΅D|G°>”mLΒΠ‡$°·‹dΤ” ȜΠ· ͺ˜χMλήR=ι!ψ‘([ oŠΡXs d+ΌZe?Ύ”hƒ„τΏ”ΐΎYϋ+ μ"ΉCρ©½Ώ€ΣΚήήz ΘΧSΧ†|ΙzΈ§%°ΏΙ¨$5Ρ°:·dΑ››―9νΪ gcd$Ι.}}zY šrΨ²TR€·ΐ_ΒτΊkΧΰ¨*Εοι—™Ά–-"ξ°>ΫY1‡―G}SΚqίgtΏ#B/ώpΫ‡α GXRΥΘΙ?xηse!εrοΎY8œ%NŸ“ΔΊ> €Μ§u³ @ζ³U+₯\ŸOF°t}ώΟ$Ϋ#–…O\λwŠ’φ42‘ΈΎK£ͺ<~)’Θ™ΆέsΈΰͺjY4 Ά˜/,τaEZί,+εΈΈ»Un#"=ž•ޚTβg’§I<θD¬Ϊ[ϋ`ϊτοsHu­d―a~•p ύΦ>ε›,P °¦δ]²uFβ*τέ:Q’ަ Jz&λnW2’4Ώ+ ΝRWςĝẃ‘禦υYΫ$#μμΩ΄‹saR†f<†mξ/κꝧ³d%NκdΜ+(:‚ίWΐ―Kˆz­7i_―bΊ!7aυΓδ-ρΠέΙxΚ#gτͺˆήԏ‘Š ²πχχː-‘ε‚'<ΙΞΡβ²Sρ“zzO$°+8™@~N±Œo›ϋ±I"~Eό»ποPΐΏOί‘a^ΘU”L}Κ‹šικΎητbΟQ/‰RLOehΪΆ©kVΤ.’Έ¬;ŽνψϊŠαωφEί[vμΛqEM*‹bŽξ“žEOΖ)ε¦ΦcO= oΎtΰ \>½ ŸΕζΓ£fΙ»±HήεrŒS Ώc΄Ϋ·4ΛΜ‚‰…m΅ƒc} β ΙμžOX3,dVγΫ§$ 6h””jR„WRήX–ςH@ηm<ׁ$ɚ#AΑ9D`‘/DΔ!μ#~o)(,ίϋ2Xν4+YΖf6 ΗiΝ ‡―Sq8)읙YωDς „aς“σGΒΆ­YΩφΎ~Ω–{ξHΈ΅mdBΦ?·’o- «ΏX•tηΒHuΓ0₯θ2ΰ ‘Ί%fΆYfΛΐ“3ί5·Χ»T―ON:όBΦ+(ŠE`q‰BΒ (“°"7²Δ¨ή³pεδρΣWט¨­!Q+•ϊς•SkMqczκWRϊ£‚¬RIφœDρΥ?ͺ?–±ϊd q‘G·„TΧ/Tζγ|Σk-βΧ±„ΝVj³Χ7 Œ*@ϊfό§Ψ ©‰>/ΞΰTφ²γ|³”Όa¬Cd’Pw§Κ³W’ŽY κΒ¬tP„3φδVGc1f^JfΩq{‘ψkxdFƒXz8R8[βŠογ‘~W8‰φ·κΔ”?‘(Ρ΄/Λ.ε‘•}3W6 œ#CSςΑΈ’Sy‰o‘–‹nΧι·άΘΥ<²rwHn–ΛΩΠμ~;Uα·d¦#Ǡγ₯)“ fΊδh ¦KΓSC£θ@œτε&… m#ƒΞ·u Ω*ΩZγέ؞B†Fο›…ϋcΘOZη°9Ε΅6€Zbυn“ΐn—ΐvI`wda΄I½X£–|Ս—lΧφf!R΅aSuu‰κ £A\i’’εΛπSΐNΏ--κCŒ„εژΚξqSΙηK`ί+½WΛ΄ι“σaΠΑk-n€ ΖπΓbΊ υŠ€ϋγς{27VΫήω ­=Η%mςύΨH`•b†κ$¬Mΰ™…₯‚B›Δ₯©άξRώ^έ''υ¦u5ά\5| Φ‡€3HΪΖIšκ@ΩΩQo‰ό¨Ί\;kΗT@Ητ ψ+ΰ?―€ί.¬§ΎCΪ2NΉ}2ξ΅>˜€ψύΫ©J|ί€«œ{>ΐ― ›½&“j:;QXw$^$Y$ΝBR?λ‡IΔF΅A― Γ@‹ΖχθΛ'€‹²βXAšp>1α‡Aύϋ³υ+‰igα?·–ψωλν©z­ή})ψ’"½³ρm}²f²_Φ”s°¦·Ά£?_©/\]OP%Ρυ-»3‰+π©.Ύ±Q³ΪšιΪ>@΄N _βθ£HπfGcΡ7uΟ·}ΫΡαΊΐ] —ωΠ•·iΏ’"d«*‘Ojo‡˜φ"ΪRπŒΉηV¬Ν1žΩ”§˜‘qŒΫ£( ;°2rm£T%βr·β——η]¬½MΟ?`˜WΖΦ+UΧS-¬Gͺjλ’ͺιuIΥ‰,Tqζα2Ρa0A< fˆ@kWfΆ–JO<υΠsŸσ~ξΙŸ}μ©'OΞ=Α|›{ζ±g_οcœΖωgŸyμΙG|θαΗ@’Η{ςœΔάƒΒηSΟ>έxζάγηζΞŸΫšΖ’JV›2kΒ”αΨ '™p,›GhVHˆ/¨ω˜`›bMf(NΩdo&KΛΓ±7Y1m“Εξ3MlG2―ΏPŸ8˜r]ف/hTΡy²ϋΘ튊ΛJSά!7_’˜ΓΪiJΎL\IAi9₯©Μσ)–υμΏvmΥγAΤC:Aΐ·ε‰ΣdΌπ°Ώq6Ήΰe η~žYHvΙ¦–|xg–*EφEΚ$@k‘kcμ^ΣΤ«-ΫΦ¬“Τ*wi%ε‡X:o`XFhΉ…™ͺ³ [ϋ­,ΌRmΪ€΄­- ΈjεͺκΈ₯ΝΦΏα ZG©άάπ-ER%4^š(5{†ιV‰¦ΠΰJγ­)Ω^·dMGs έE?,{^ם™ž^2Όε^φΛΣwΰ Ν΅Nϊ°·Ά­†§»|ο&œ%;«]ΟφΫz³·΄Ύ· Ν\}Ώ £T|½m·|έlk]ΣΣ(Θ’nωπ-gΠYρΑ[οQΏθuύe£«ƒuΟυίHqό‹Ίcι&Μ£Ό-ΫοXΊkhΎέtuη(Θn7[Ύν6‘>0ξΩΆιϊ]`ŒV˜Wΰ 1! ζατ,Έί©q\Ν5}Χκt}Χ]Α― Xδ»«–§­X$Ώ^^ρW: .!eΪcTά^]I³ϋ!Ζυ]ͺcqJΝY½!¬“Ώ·`m¨t'£fΰ¬,Χkψ˜ΧΟ-ΜW§fΑ—Κlx7ρ—GN‘ΝΞ Λ΄h6μΦωLΒΎόωρPkΛεSυ Έ€ύδΒT₯„?@ KsVŒϊ₯rω^Œp‹`·<Ν ~?y#άG&JAΡγnˆQokΥΕΉκΓ θ»Ύ’ρX§q6§¦ TΎNSΐ]p'܍wQΐ=p7ά‡χRΐΙ“-s!θ!―9W}e>Mΐ­Ήκƒ!ψNnΟU Αw°>W=‚ο!ΰ₯Ήκ#!ψ^^ž«>‚ο#`cϊŸ:Aΐoœ«Ύ*“ͺT/ΞU_‚iuΜΉκγ!˜V§3W}"ΣκXsΥ'C0­Ž=W}*Σ–μΞUŸΑ΄–/ΜU_‚i-Ήκ3!˜Φ«ž§ΰΣ΄–ή\υΩLkΩ›«>‚i-/ΝU_‚i-/ΟU_‚i-WζͺΟ‡`ZΛΥΉκλC0­ε‹ΐάayEΰ@Ra\b’R?Oόxͺ·VκMj/Ž)Τφ¨JωΙ™ŽX„ΙzΚ $―fΈ|€ψgΑίƒώόg.τΟJxͺOωΥͺxS4#Γ•RKΧƒU§ŽM/δ’`’ψLr.k,Y(nšK)£ ˆγp°Gcǝ]y<݁“Ρ“Ά₯λ ϋ^_D†d@«gΡΒ7Q#|ΘVΐƒΑ³  ξ±1…ΘŽkE!¬ΒcΫ“eΩΨ l·[€‚3θ5Γχ€Ε aΡŒΌ€+ƒ/ι~VzμΓSm½WDΫ±W³ DqΛUξ*‹π°AcžΗ'λΟhΎ’§¬/±39.XA²²²m8°9.ιόΆeΪ²@λŸK`ΚρζXu·2> kύg\­π΅FΛ†Ώ–*^Œ©x* Θ³·ηA•Š|DœK" ωb9[“z]δyA|τηθΕo2Qό0e *χ˜φ*±ήκkŒƒ2ϊ½žR΅0λiΫRά¦€Ό ’ ΈT /LLΈT-.<’…~vϊ¨.^樬[)·$1ϋ½#Γg2!›žj©79EsΜ9Θ1ΤR5Θγ)άΙΫι(γu=κWδJ,o.H`ΎySζy‘hj­‹Ύ μθYt$‘E„ΩΙbfHχGƒzΗϊ΅Tr“EP]³Αv»Ρ*ͺί°NΙr Γp/lhΛΜ©A…Ξ2’•O4ά,uχ>¦€sηβ?f=KsPήςcŠrΡΆoωq€·/ y9ky”·–vWγu fΧ‘­.’u&†φΖB^ιŸ™‰·DlΠœ‘Γ!URΏTHa]ΧJκ“-;jO~ΛΎ\ΘJ{’•x₯뭍»όh’Ί!Βτν’fb>*Iψκ άδZŸ§κωφλTRnD^σ* ­‘zrχαI`UN2ž%: ‰ζIGgxζ©aΪNV‘ƒΚ0ZL–ϊ —Ϋ&„ ω7Π^IsjΊ7₯βΪƒP\yΗ^#o·H˜Ι/OSμ;τXκeŠΥ“ΐ.FΓΉΛƒΰœό”Λ«qΆK 5vρΐΊ™mφΚη «"TbνJ>3“XΆόΘπ M¬[©nΡτTρV# Š¦{XGβ\Ή·PN'o*ή 1«%°ώΟω€7€θ~žΥ‹ΊƒœάΒ ŽρW„Ι,Α‹Ψ•΄*ž9‘’8!ΜrMHq”"έuήίΩ»γΉΚ<“9Ϋ―€Α» Wν Ίά#±ε†ηLεΉ·Q¬…η$ŠW/P˜Ύ=œΡυaͺϋcνύ!sξF…²ώ‰ώί ψ_(ΰ«€ώχ ψ?(਀“ώο ψ)ΰί£€ΏŸelΜαφ²^Ϊ/d°ά2ΨŽ‘‚„­ωπzΡ»pίύΜt°ΧΎf;KΣm»5MMy££Y=͜F  'qΩλ˜`μ^Ε)WΙAEpŸΎ΅κγΫ`αNlοd8₯ kΙξΕυ›«žξΓ›„|΄γ^AK―‘…»γΓΣ3ύ`Έoؐvπ€αVύιh]π΅©7@Μ́C±†/j>οψ–vΫ[v{}ΛnΓΛi-τ§aιK Rϋޡݐ;]oη2 ²²ι<8u²€QΏΧiBRŒΆŠ>}ω΄qόαΙε»ΎΧλ‚Zs§-ΰ“VcΪ΄2‘†Œ!iς˚Υωκ+^#hSΓΎ€·όΰξΪΊ»ΆΘ2―ρΡM°αΥ­ tΰ:e’ ž§uΊ>ύ­― Θ~6r’όΪ½ώ3 ωŠͺυ΅~W ϋ2πkύh%₯ά:‚Ε0έjΤν’·ie,Κδ…ž οψΕGθs ψ§΄œŠRι5ΝυdΣό.γVώ$”ςKψwv¦TWgλΗ*pί8|kOUJ•Y¨ˆ—ͺ%4·+]6Ϊή2Fί 7“Γ³#‚΄AΒ ΥDιi*“G\αΑ5œsΈ%ύi­ Ρ΅vΤΉDomΙ*³°ΈyΣ[ΈržwW>₯'l˜6pή•€)E¦₯z©΅¨/Ή—»―{ϊ•ΟO4WκS–±PΑ©dqΖΦΠα(ξb&Ό'gα΄Ή "ΰΛΆΩ¦Ž’J|λFˆήΙΙ%‘Φ“yΐ)Γ½¨ΨA?6~σ‘βSΙΩΠ֎=zŒΖΙ"7ίί™₯H βNόΣYςβ9±9;'Δ€BVNlιƒz¬;썇½ό§’³"~p’JŠύ§Ση$ΥίˆnS©ΘgΚβδ“Ίpιρ”ΊuΙplΦυ₯<±ζhΌΣΌυ˜s η8γkQhκ­AΫ£ΥQk?«€žώU ψ‡π(ΰ«€ί¨Xλϋ ό£ ό/Ξ  Ύδ59η:yΦCΨBτRa=Rυ©λ’ͺO[—T}zͺ8£“ξςΒΈι›%wY‘ΔYΊgν.φΪCwΏϊΪ_μ%#3$°Ο”ΐ>» °Hβ`dd€fΒΘΝ3κ«·Fw+Ϊη&1%ι²uΖ¬όJ[Μ ΄ϋΦ½1δτ­΄ͺγlFU|kΖ}Mπ;2l€έ¬ E΅Ωχ'π_Tΐw)h< €οPΐ³l^ΫΣ₯IΔ)φέaœςΌŸεΑς¬Ί6ο£ ψαŒ"‘ε ?ΥΓ―TΐB|g‚˜gΫSa›UΟϊσpieεj}aΑ/Γ ~‚ϋ~ΰB•AŽik€8ρ&:΅Χ@Xb΅cχrFwLDœ §՜Ύ*^%+5ϋΥY›X„χn!MŽ|ΒZΣυ5CqNŸ"ΟFΛξ€hŠξkέ.ƒ†nκpΠΏš8€Φπlo!_I4 ƒΐαεa6ψ+uƒ_υ€ \X"έΒ\ˆD»B*)όŠΒL ’Χpυ0€ΗΡΤλtAμ§έC£0Eω0zKs€€ λ (ΧZΦ[ΐ§ΈΠΦƒ―Α:` gΧ%έρ˜ΐQΛi’Ώ”} μώθ0ΰGλ’ξo¦Κ&Ea( Β‚m½cƒμlxLΈ J±ΐΐ±Bƒΰ;p·­ϊ(μΥς³±€{8²E‚a€‚Κ€2© «Ϋ#q3‡C(ɍ§;π&5έq= Ι<gΣK31σ‚)όΛύNΈ =σ²mτB~%‘Υή·©·ύ%ΝiΒΐ]Λ6MPwTώίν‹β=όvQ_ux#[=ƒŽΞSi€(.πFϊ˚ιωΛmΩhB‚=xlΊ [Œα| Y ι ‘‡cΊΈ²Α{ˆ s 0u4ά†fΒKεΰ ”lπ$YΓ7m†_‚€3|Ε!p”‘¨|!ag# ω‚WL˜Ϋ€1fό@'ΈƒΧ . ή`h熴π0%/Ϊ’7·_p˜ΦΤ­%oΔ²­‹0RIT% αWR9αuœΙאr.¨ωi§οzςΠΙζPjkm’;θέ‚ύ J¦ &;PCQ2ς¦ ΤΧ ~νhu”;zΑωBΆBΡƒOΤόπt}Ψ6ΰr|ΤG[ρ;ν»ΰpk&zƒ>cτλ"ύο|κΰΖ€6 ‰O¬θΰ‹ν@ YΆΖ¬hλ.ψ{ζΒτfRwYs—ρίS02OEώΪ€“ΎΰΝ΄FγW»Σ‡΄|‚οΘڐ‘7Aj‹ήΨ\]DQHM`&ˆCEΎ/šΪύ‚³Β_tx³Dm°@Ύ£.bΆτ80Λ ihΑ˜6Γθ}ΡαΒLͺ‰ˆϋΐ €ZΉΊΉώΰϊΑgfΠ«e»=vmΰ+5-ΰ•ΤβnW»lαΏ ’ ψi6όΝξ‚]Σ +€M ΊΎ{P ZIι„Ω­‚*t0‡‚wΔ ΰ–ƒΏ‚„‹ΰSπ•H6μ…τ– θG$ξφβ"¨» Ατ±ΑD Κ€Ϋƒ ψΜ Εί€5Β‹8°>ΰW,@‘€Ϋκ2Θ‰W1ξJEu³g!ζφ,Ϊ΄—AhI7\†‘ϋZuA‚xΩψ V^μGhκB†Έόβσ Š™‚κΥ²ŒχϊœAodΑ‹ίe‘zΛΕEϊoΈ=rjΨν£i»ΟW΅έΐ—Ξδn£±·Ρ^95όn€‘4¬§FŠ\]C·χqΚτv:' HTML (Erlang)yawstext.html.erlang break_char [\t\n\f /<>]§xΪΝTίOΒ0ή†?ΐ˜Θ‹Ρh4&Ζ4υQ§όΎωΈtμ˜MΆŽŒΞΐο€λΚ6αΝΎ|[ο»»οΧ6ŒΥ:“xKyΔAύΔε~ǍΌΉσΨ4ς«šώ„ts+ϊ3-‰'€Œ£΅&ρpm  4οi¨ΊξK<’˜)hj)O7*DΜάDΐ΄©)8Ω$/ BZ]bCλζAP’ϊ’Τ—χΘ·C![Κχ’¬+ω©fλυbΐγ›ύ>>`Ά{‰ŒΠ€y„ψ4 YY„Γl#RBMq.%N£$YΥK tΑσ ΣnͺΎ[½7»Ϋκ±—Τ«­Κl―©–Q²r―³€ε1j*A±³ϊ θΙΡ.`&–₯Κϊ7V– fͺ;¦*}zυAy­”“-»έžΆΣž•ii’ο$N> ,βΔƒ1γlωΉu|Ζ—eιAΞ%LΜ §!¬/—UΠΘzΑή‘Qςε\¦e—K§οTτΨ*œ]»ϋo›l–Lλ«θlΤPψXΛMS%’σ/ŽQΔΐGit Attributes attributes gitattributes.gitattributestext.git.attributesœxΪ­X[oΫ6Άε$mλ΄I—a[“±XΘΊa‚όˆNΦQ^eQΎHWQφV^07=Ÿ&ήv=Ϋ™ ?”φηLΕ›υ iM¨§UOν#ώAN*‡SβƒZβm…Ψsu8ίΤrξεœΙ¬C{XK»›ΣΖƒ³k·–U Χz$!νΥ’ζ€ωψ­C}TK½•S‹γZKψΆ–°“UςΛgŒ9 IFp—ŒJŠG~Uddωό ­m}k<菿ˆ„·ξ†ƒΎ5ΙRώWΥ꩘ƿRΛi»£π«λίH‰Vš}F‡΅{’ΧΐHQβNδπG3vh|/8¨ρgMMΕͺβ~ ž§mΜωj’ w u~’£R6”έ’ί±C΄˜ΣH#αόuUΈή•]¨v€³ZŠ,Σ HΤHςά„\U I yr.«εΔ•½1ψ<`ΖίS ―9b%—ληJΉ–’·–ŸU[8εp"f$k<ωΏ8 _”ϊl\BΓΪΤ{δΏγ–Š•ˆΚJ₯n0°¦Ψu³ϊDω―<‘‘¨Jυ‘ŠκΌδ–3€Λ€_δuŸΖ`₯‡ίτ:ίΟι?κŠQ/SςgζZλΜ 6η-½ρ”ΝX“μ±ΞZ­Ζ Git CommitCOMMIT_EDITMSG MERGE_MSG TAG_EDITMSGtext.git.commit added_by_themπadded by them|Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ ΠΎΡ‚ тях|afegit per ells|von denen hinzugefΓΌgt|ajoutΓ© par eux|@is.po|@it.po|μ € μͺ½μ—μ„œ μΆ”κ°€|adicionado por eles|Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΈΠΌΠΈ|tillagt av dem|được thΓͺm vΓ o bởi họ|η”±δ»–δ»¬ζ·»εŠ  added_by_usωadded by us|Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ ΠΎΡ‚ вас|afegit per nosaltres|von uns hinzugefΓΌgt|ajoutΓ© par nous|@is.po|@it.po|이 μͺ½μ—μ„œ μΆ”κ°€|adicionado por nΓ³s|Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π½Π°ΠΌΠΈ|tillagt av oss|được thΓͺm vΓ o bởi chΓΊng ta|η”±ζˆ‘δ»¬ζ·»εŠ  both_addedboth added|Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ ΠΈ Π² Π΄Π²Π°Ρ‚Π° случая|afegit per ambdΓ³s|von beiden hinzugefΓΌgt|ajoutΓ© de deux cΓ΄tΓ©s|@is.po|@it.po|μ–‘μͺ½μ—μ„œ μΆ”κ°€|adicionado por ambos|ΠΎΠ±Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹|tillagt av bΓ€gge|được thΓͺm vΓ o bởi cαΊ£ hai|εŒζ–Ήζ·»εŠ  both_deletedόboth deleted|ΠΈΠ·Ρ‚Ρ€ΠΈΡ‚ΠΈ Π² Π΄Π²Π°Ρ‚Π° случая|suprimit per ambdΓ³s|beide gelΓΆscht|supprimΓ© des deux cΓ΄tΓ©s|@is.po|@it.po|μ–‘μͺ½μ—μ„œ μ‚­μ œ|eliminado por ambos|ΠΎΠ±Π° ΡƒΠ΄Π°Π»Π΅Π½Ρ‹|borttaget av bΓ€gge|bα»‹ xΓ³a bởi cαΊ£ hai|εŒζ–Ήεˆ ι™€ both_modified both modified|ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ΠΈ ΠΈ Π² Π΄Π²Π°Ρ‚Π° случая|modificat per ambdΓ³s|von beiden geΓ€ndert|modifiΓ© des deux cΓ΄tΓ©s|@is.po|@it.po|μ–‘μͺ½μ—μ„œ μˆ˜μ •|modificado por ambos|ΠΎΠ±Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹|Γ€ndrat av bΓ€gge|bα»‹ sα»­a bởi cαΊ£ hai|εŒζ–ΉδΏζ”Ή comment_char[#;]copied~copied|ΠΊΠΎΠΏΠΈΡ€Π°Π½|copiat|kopiert|copiΓ©|@is.po|copiato|볡사함|copiado|скопировано|kopierad|Δ‘Γ£ chΓ©p|拷贝dateZDate|Π”Π°Ρ‚Π°|Data|Datum|Date|@is.po|@it.po|μ‹œκ°|Data|Π”Π°Ρ‚Π°|Datum|NgΓ y thΓ‘ng|ζ—₯期deleted€deleted|ΠΈΠ·Ρ‚Ρ€ΠΈΡ‚|suprimit|gelΓΆscht|supprimΓ©|@is.po|eliminato|μ‚­μ œν•¨|eliminado|ΡƒΠ΄Π°Π»Π΅Π½ΠΎ|borttagen|Δ‘Γ£ xΓ³a|εˆ ι™€deleted_by_themθdeleted by them|ΠΈΠ·Ρ‚Ρ€ΠΈΡ‚ΠΈ ΠΎΡ‚ тях|suprimit per ells|von denen gelΓΆscht|supprimΓ© par eux|@is.po|@it.po|μ € μͺ½μ—μ„œ μ‚­μ œ|eliminado por eles|ΡƒΠ΄Π°Π»Π΅Π½ΠΎ ΠΈΠΌΠΈ|borttaget av dem|bα»‹ xΓ³a Δ‘i bởi họ|η”±δ»–δ»¬εˆ ι™€ deleted_by_usνdeleted by us|ΠΈΠ·Ρ‚Ρ€ΠΈΡ‚ΠΈ ΠΎΡ‚ вас|suprimit per nosaltres|von uns gelΓΆscht|supprimΓ© par nous|@is.po|@it.po|이 μͺ½μ—μ„œ μ‚­μ œ|eliminado por nΓ³s|ΡƒΠ΄Π°Π»Π΅Π½ΠΎ Π½Π°ΠΌΠΈ|borttaget av oss|bα»‹ xΓ³a bởi chΓΊng ta|η”±ζˆ‘δ»¬εˆ ι™€hash \b\h{7,}\bmodifiedˆmodified|ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½|modificat|geΓ€ndert|modifiΓ©|@is.po|modificato|μˆ˜μ •ν•¨|modificado|ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ|Γ€ndrad|Δ‘Γ£ sα»­a|δΏζ”Ήnew_filežnew file|Π½ΠΎΠ² Ρ„Π°ΠΉΠ»|fitxer nou|neue Datei|nouveau fichier|@is.po|nuovo file|μƒˆ 파일|novo ficheiro|Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ»|ny fil|tαΊ­p tin mα»›i|ζ–°ζ–‡δ»Ά on_branch—On branch|На ΠΊΠ»ΠΎΠ½|En la branca|Auf Branch|Sur la branche|Sul branch|ν˜„μž¬ 브랜치|No ramo|На Π²Π΅Ρ‚ΠΊΠ΅|PΓ₯ grenen|TrΓͺn nhΓ‘nh|δ½δΊŽεˆ†ζ”―operator<\b(?:drop|edit|exec|fixup|pick|reword|squash|{{shortcut}})\brenamed«renamed|ΠΏΡ€Π΅ΠΈΠΌΠ΅Π½ΡƒΠ²Π°Π½|canviat de nom|umbenannt|renommΓ©|@is.po|rinominato|이름 λ°”κΏˆ|nome mudado|ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΎ|namnbytt|Δ‘Γ£ Δ‘α»•i tΓͺn|重命名shortcut [defprsx] typechange΄typechange|смяна Π½Π° Π²ΠΈΠ΄Π°|canviat de tipus|TypΓ€nderung|modif. type|@is.po|typechange|μ’…λ₯˜ λ°”λ€œ|tipo alterado|ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ Ρ‚ΠΈΠΏ|typbyte|Δ‘α»•i-kiểu|η±»εž‹ε˜ζ›΄unknown¦unknown|Π½Π΅ΠΏΠΎΠ·Π½Π°Ρ‚Π° промяна|desconegut|unbekannt|inconnu|@is.po|sconosciuto|μ•Œ 수 μ—†μŒ|desconhecido|нСизвСстно|okΓ€nd|khΓ΄ng hiểu|ζœͺηŸ₯unmergedunmerged|нСслят|sense fusionar|nicht gemerged|non fusionnΓ©|@is.po|@it.po|λ³‘ν•©ν•˜μ§€ μ•ŠμŒ|nΓ£o integrado|Π½Π΅ слитыС|osammanslagen|chΖ°a hΓ²a trα»™n|ζœͺ合幢( xΪνYooΗ·c $$ΈUΫ4U:-²‘wͺ’Jm©ͺ}U)­DήΕνέΞέm|;»Ω5v3‘ΐ`Ε¦Ζ’ Žbΐ Π­lΖ/.Ν뻏`Ι>||‡>³»³;»ήυ^U"x½³3Ο<~σ{ζ™ioρ~^ςŸ{b£yCΧ1‘φџ··DΎ·¦ŸF3:Άm₯ˆΓή­ώσϋ‘ήͺe˜&V3yƒPvΖξπŸGκŠFΔΧ6ωlπΥ¦ŠEΕηmώs—ΜY Ι—2e`Ρe{¬KΎ€"†.v ELύ’θ–)D΅#r„;₯NάMν±φέχΠ=’Χs1—ϋ½ll*–B Kτ{>Yšνδ>ΐω@ρ]1©ͺBqDιόηΡ!…φ˜αΒΖVTΫcJoΛΪSΑ΄ jΠ>3Pα₯˜EΆV$ Q(ˆ/ϋΟ4ωžΞrΓ²Ef=gΘΘά!ΏU:ι_ομ"‡‚/ΟρΫ€ιΆKΣΚν;RڟMi!₯}wŠY:¦JΦ‡GŠYΫ’l)μ·NύΞλuΨ±‚% ―e1ώρψ©ζΕhuvhυβDsnœ½c KΡ _πνΪL½ΔΟ°?W―’’… &μ]«z Rͺώ”ΨςΒ™εωΏ |Ϊύwg—} #»?Qλ3 ^–Ρ©+V·cf}ΆΙ$γ©%y6.’#ŽΜ2°ΉΓWOύDΡεΥΤ–ζΫc\o |Kπ1TΠʘΥΐ§·QύTmͺ6W«°‚F{±…ˆα0‚Œ~\«1xνΑŠCς% [μmΝΚ#ŽΡcxrš'Πγ‘‘ζ…ϋΠΩm„h–αOP¬Ν…“>>ˆΡ₯ω›&’AϊRε 5ΞM5Ν^άeŠͺbεϊ,HΥ¦AΔ- q³¨φ ήκύυαϊ'L)`π2Ai\.Ϋ¬Η HεD%όΕ)βBυ~‘2εΓ‘ΥkΒN―°ΰmp!<š“ΗQσϊBσόΩζ© ΤΌ;ϊhκ8(‘ε5ƒ(ͺLƒKΗΆ¬JΕUζͺΝΦξΧfΥΚe₯H‘Σλμ«‘―§–*—σ`AυΊŽzͺ“Κ-U.i¨΄T9ΓŽήZœ[άhά«¬|6μΨ)ζΒΫTύ„l.1l₯L-μΩμ;έbˆŸ7ωΒτ†&“κd“ΰ5f΄aΫλ/UηIQ…[ή -Οι"ΧόΓαίmΝάφ~Xͺυ΅Jύdύ4ΌΛPτœΚuεŽΘaMM‹ΎŠαŸΣ‹ςΥix]γ’s#y&2ΐ%š(ξ™ϊ μ\υJ±ˆΧσΙόeTR4Ά2<Τ87ηωΨeΗAχ7pŒΰƒWεl#mνδŒΣ–BC―ϋΟnάwΜ°T?Ι% ‰σΠ―ΕvΗ!yκ(<‘ 6qY]1MΞh¦’₯ l‹₯«Šν΅ψH‡|θ4’9eMΨΨβ=8Λ$2ή[VΛ¦Ζq4qY¬Ν֏CloU(λζ-κΎV―‰Π{ Άzg¦ΩγρΨ?½Υ`€΅PΞAŽ}_Œ’B`«—9―™¬1xοΏΣ$ e˜FΜΈΌΐQqΛς 遹8‰‘3GΟAB(6…:k ]#\-X₯«?…V§F-³κιŽΚΥΕfδi$A ’λ£ΤSρ«‘₯ʘ†(€3φΝι3+# +gΟH0λΘpSZζ-/³θάμvό?ΓuΣ°ΫΆ~ςφ¦ρQKΎΫcCίΨΌφ¦BεmΐŽ'W"\ wPΌ@ρq4ί―sβFޯۜιΪ”ŒJͺ™&ήν3«WˆŠ-‡™nΐ¦4‹Έ NIhσΛOV―ŽstŸξ3 ‰―ΐηl힏LψΩω`@&gEΚL·ΆT9ι°‡·*+W†Η_L?υψDAΏ’ 2MΠΠƒ0^0΅<Prη¦Γ’|Ή™r·!ηlq5y³λpη†ΛaWΛ:?i7¨/¦΄ο|R²|EVόppuŸΙυωλ •vΩ·/žΐάddΛ’ΦY ™Ν―†”jUuΧ Git Commontext.git.common comment_char[#;]pretty_formats_builtins*oneline|short|medium|fuller|full|email|raw$pretty_formats_empty_value_modifiers[-+ ]?} xΪνοoΫΖΥ’5jšfu:'MΫΠ–“vH'φa^f]ΆlPΘφe’bPβI"J‘IωΗ μΪ‡ύ»;ςΗ;ŠŽƒΐ-zr4ωή»χϋ½»ΣώJ6ΎΝηFᩃΉ‡ΜYŒτEρΤM“Σ§[+εΡλ`΅ςωA +πCd£0υΓΉ›ϊψ [¦Οί”Κδ1jΕo«ωό¨)]?@<ΪΪ•Π˜LλωόΈν~šΟ·ω¦ρLήVΛ`Pθm ΛwJS”ΊqG ΊSΖεη‚&P˜³hŸο ΌŒB¬ιαΔDή%ΐό*Ÿ·˜αčΝaΰ&I ό‹|~¨f(vΣ(˜ο«QJφ»'ΰΌηΗζ { Š™’Ώt  %zΏ”ε»Ψeem ΰς¨…π“dΞΜς@Πm%”π+!Θxz(xœ―MζβρxKΘίΤ›S?τ§.sφoλWΘΜ–%49p’Ζ8ΞΉίΰ·εx_|Gΰ­>―ΦO1‘…CΔθv…Τ1O°³qρΆ—ΟϋBζ;fςYšG)ς¬?ΘJ&(V8 ΘΔ₯\ξ±jΣΜ_,°UθcΎΞ$9ε6Π]γ‚f›[u#Ξ½h>hΞωξGε\-NšRΤιφsην❓κφτdΟ0*œ—4q 1ˆ3°5"`žΝ‘ŽŠ9-VΩΡ¬±ŸͺΥb΄―Gω™D› ’ΘΦΜŎ›PUVΛz½'RڊQ‚RΡ|Ι|6‹βΤΒ '<ΰ7),‘O>Œόq&vKˆ`*$Δ«Œ9‰;©\@Π',uMΕ”¬~ΏΝηΡεy{T1 Χ'#αwΩr‘Z\2Ϋ ©Χn(ΔΏΛnpή,ua¨Ož,˜0»¬†ΉοYyΙ“qΎZQΙxψTΟXΓT/dΖΖVXy΅ŽΞ@Βΰr1GQΰΞ %$݊Ϋε^Tq9:6Yηό¨ bD’t‚I©ZN?L2XΏ‰Ι€ΤρŽ@Ξ#Q]!ζ φ‡–¦hΌLamζz7Ρρ˜ξί^‹;E©ƒφ‘– θ:StΙs:BD=d)es₯i!„mŠήλώΎoX‡Nh·„“ο},‘Rn +‹ͺS”v ƒI¬6β ΤBΛσ δΊέοhqdΏ$9ω+DOλeύ₯Ewn֍ύ•‹ΆΔΆw$ο>W9τΪX.?½΄HŸZY2ΟImiN²ΔΪ-·l_[D…θωŸ5υGψγ•ˆ―δ¦2ΪRΙ€R$$ΧqΑnKφ·W‰§NύmΞW<`Ρa.Yžθ'Rgκ±,žΟΠH‘}oV±έΟ!ί¬3#­J€ώBςξžδέ–4BŽααρ’‚’N*άΘlπei•Ϋ,Žt{Η:μYΗύΪΜ ,ˆλΪδΏt‘ ―λΪ} {(θ–5©”’›ΰ’θ'?*‚έ§χnOB΄hχ±₯ά!¦e‘dθΞPUAQθvœ=ά†‰έΣ™ϋ.ΩHn8ž»c0α™Gy7M;39ΩJ{ŠXΊΉ4ϋgh©θ$'†Έγ©ΦΚ ΘωΜΓy·θI9ŠΌ/TšV6$ρΔ‹½U aŽ*œ‡θb†ΫGΌΧΗΗ` ͺkLk›O—:‹BυŽύl9ŸKιVϋ=CΝμRju… LΩΫyΧgͺήSΕf}άί+”\·kΨ‹U.’r©’¬·X2#ιμω±‘\Ε2ΊχH nr’#yPO2AΑhΉe›Χ έdοζ?]σί}ύΔ  1UWyP›Ζ+§]©©) n5Κ‹“hŠͺς·jkΡ{”}eΞΨm–3*–όm>/ΚχΘk+ώcΗy+λ?ΰD^w°έNτΤΞΘ؎†Ν–_Uѐ±z*™υ$τ\²-x,DΆ‡p”Εβ,HdγΪK²N€< #rvkΤΣΎκQIΤZQ8mγsίο[ΰGF§«e:umDδ$^ΛωλθΆΡ4]ΓΚ"ίΠbδ_ >ތ‚3dτΌ€ok ΏΤ Œ.CΥ4Ό]Υ°^mϊΐ~A|\j,Ot0΄j0šŸ0˜yrρp£YΤ₯K0lΆ1 ό€αvKӏ °‚ )‚€ι@ΕЎ5Bγ6AwΊFο©ω»ώQ…Ί††~s[¦)φVœ†ςΊΒ§4Ρηi«—kΨ3Ά"VδωvκΞfΔg/#&ήXf€‹Šk B’`CB@ΤΓa}LI(4k<ξ²Lθμ^§ξ₯…μ¨V"ώj’΅¨΅-γ’ ΕIWέ‘Y·&Ά7eu~_άfΦμZκNυ θμ_8žγ5Ψ .Σ%$»ΒεMΫο™GZίζ·χ—ΙίΣ73οJގί0 ϋ }Ω5!½ΟΐάaΏώ€ώ佊S―†©;O'Q¬Ή‘§Εϊδ"œΒΏξ½Ά_ύνΟo2@Τ―ίΌ¦ŸΗ=Kϊε˜Η>ˆS’: ½)˜YΰΡŸΩΧ‹†}€0ψ⽦xΏΣ4ω”oš†žqΉ€2ψάΐ7ˆψυ"Α*LSδωσιb4ǝML§=€YΔξΉaΧΤΠ Ex=wvb-/ ΔΆ°€ΟŠ&ζ7½ycAρΕ,·'š»hΓ+V^ΏVΝίψ-Ρύ•›ε+`基κJω|FΟ³Ϋ ]‘·Η…‹A0GΖB§ΕΕ]eKt<–Μωφ’|Vε}O @ΐŠφžwnbΐA2’ߏsΧ”’ΐWΌX/JʝͺΊέ¨ΈΨGWμ5/3εχ{₯ΛΜlΏΡά…WGΚeZ/κ4­Τί9 {ρβ…M'ς‡A‹o—ζωqΖiBk'Ζ!&Ι°ρΕͺ!λρ“ 1sŒ;VXIbθ½`Ϊ·ΣλΑ »„F *)/₯γΫ£Γ€Ϊό™ΔΤ5\aMΡγ^α.{½7.žΕDm©bΎ0°„ŠhΦχΎφΏΪ-¬Ύ}X‡_ν¨Μ°šH {δ `­q³κω/YU‘Ӎ:ͺ~½υ@ρώSΕϋ½¦vƒ 7έyiτLηΌδ @g₯˘b ?ΰ$BΒήC~•ΛC*·Ρ¦DΕ}=Oκιή­• Git Config gitconfig .gitconfig .gitmodulestext.git.config ^\[core\] variable_name[a-zA-Z][\w-]* zero_to_255*25[0-5]|2[0-4][0-9]|1\d\d|[1-9][0-9]|[0-9]μxΪνY_WΫ6· PXΧ––Ϊ„nK`φΆž³qΖΙΩΎΐx[œrδXΩ³ehvόα';–#ίΘqβΐž–‡(HWWΏϋJΤ•Ρg'qΙυj=Χq}ΝCΆ}Ί₯δ?“ΤχΘ 1 VΣq/GνΨ3ζ„Ϊ$DΤf3Ω†₯tάΚmn±γhAΟ·=:¦­•Σžρ΅εrΪsΎΆRNϋ_[MΗν<-υmΧώ]Š­1ΰgιΈ+# $_g\_Mψκ:`zΝ!Ÿςεoΐ²ιΊFΩξη`™:1!'ωƒς²ΥιψŠ―~υpj‰i1±8ΩK0¦dϋbvίL6ΡvάGΞ· `H§yΗΧ^ƒ“σΝ©ήH¨ΖŽΜ©6Ο ήΐΦDBA€mΰŽ’Aw€I\z‹Ivν=ί₯.Ž­ςˆ“κY»ΕΘΒ™8{@ψ<•ˆwψ§$hyi„@α4ο€Χδ„½ήƒ“}ϊ BS„˜Ν@jΘύc:Φ•όG ˜"}€<AΤ#ι}›κΜ)nμΎͺ¨Π"YfSSσΓ0ƒσΫ€έŒLςVE%Νφ₯q}1‚γf{pρ©ΥR  oασ!γσ[έ0ZF#f3»8[mΐTU―Ϊ< ;Μωœ>ς έrCΣΙ~䁒…Ύnα›ΨΙΟt7 aΟlΒ6ΖJ›.οΌZ\Z$sξ1 Œ *ˆ΅%ŠάWΔ?8 £Α9VΡwG-¬EžΎU0’`~Μo‡UA.IaςT3α|Σ"kω‘0o—`ž'Κ!οα‰œβ―ˆ«*e™Χ• hs¦0LNCDΤqδ’Θ½Ή‰ˆέ 'ΐ-Γδ›xΑbˆY[E¨ξ Q?gΆΪ¬Pr„ΏˆPˆ«΅γΠΎ(v“;ωψϋŽlŠ»Yφ 2]NJLΦLά OΈw…žηϊ ¨ΤQ—ƒ(cg†΄ρy…8Žϋ=άΪ4>ίbρΘ‰L`BQΤχ1&QoˆCΑτf:¨w‘ΊžϊTΎK—΅ωΐ@ΎOGvώƒλ[ΊλaQ––PΨ}2`©΅ *Šqͺ(όJ™½ώož§2ϊζΙ…/ο.›q«ΝοN,Š3b΅ΐη’¬`€Ÿ+τψ]bα¦άJ„XΝε Eκ‡%mb©s{n˜—¬0ΗIέ7‚£ΡRdN”ξdnO‘•§μ„r¦›₯LKΤXΤπ?/˜W0Ύ`Ύ¨α‡%^Φ«ΊAVΊ;|ϊTβ€²mβΎMΰ­&QξKΙάΎdξ|+¦‹μάΩne5©YKX­?_¦Eά―₯Ge}Ϊwιkϊψ-―RC±* ζ€Bœ¨ΐ‘Xž΄ιP_ΣττiM~δδυΎDOι½Yκ ²tu(NCη΄G’γP―‡ƒ€εGΛ₯³œρQ‘§ΉK£+y™ΓE ·ψZΉxΓ½–—«τυq…_Ρ±tZς¦SΝ’πP^’γšε³ŽΤ$7ΚδeD¨,‹iβO *.KMR_ŽΟΚ¬xV•Eσμ’‘₯Έύ3₯*41DZ`οδAkp±Β£βςtΥTzTGWΕθ%`Ρg€ žQ”ΡCBpœ£?Τ 8MM5%ΖZ)Οτϋydο˜Σͺ”vkO‘Z‹RkώA8ώ]Q3 Git Ignoreexclude gitignore .gitignoretext.git.ignoreκxΪ…RΛ 1 μͺψ8‰ˆ<‚=< βGx€¬u-Ί©Φˆ ~Ό‚ι’-ˆΉ ₯ιΜdšϊVq»Ν΅Εž*W£Έ½’φΖ£|Zal3ž5‘ρ8K’Α‚’QΔ•™„ϋb Ω ’d™%°:odΛο’3υώ5ύPJ„Ή`ΊΛη–δi2Ž^“Υr³žή9γΡ<οΞοΐΧδ<œ\fS}‚OšΨc)=D#ΚrspWQŽΖ+y‹άπrsdv‚ΘŸZzκά/6vΑ£—v>Ωd•/ΖSUsκ0ΎkPG"Git Link.git text.git.link^\s*gitdir\s*:<xڍU]oΣ0mΡ­›&!>&β‰ 5Lρx„*~ΓήXͺΙmLj-qBκ”ΑΏgρuν[§­_n_ί{Ξρρνω [# ΚΕΥΐ]§fw-i-a;ΠρBGφT±₯Œ+*WκψMY³ŠΦT–5δ ŽŒΛ”›έmŒ/Оέ}„Ί·{±ͺΫB”¬65€ίΉηP=Σq¬γ1*W`ιhΈ˜Βιz©£dO’(EHΞΕ£ΠΏK•«CI@V&))hUq‘‘ ΝfΊΦ]:Nfί’»Θ)zz<ίΞ0p*ξ'ωής‘ύq„ΑyΤiδ½Υ؏κrotδB)ΔSΒσœe4'Ζqηq–n‘ ϋΤwp‚u’Eηώd=?κ¨θώ.λ””rΕjeΉό}ŒάξCΓθ’'=”Ί‡ψμu«MlρΕΟα 5<ή¦―μ”φ›wπpeέkΔ―¦΄9X(pMBf‰‡p 3€KΩPΙKAΤ¬)ΈhΝα‚²ξΪέ'Ιν$ύδ©e|†Jυέώ©£%h{e6ΗξΒΧοΦου°³qiTKˆzoΟl"hτYΗe)Τpͺ0YC3Φ΅RΌ˜>q.L՝šΧϋkYώΣWqg…GΡ{ς}Πψο|2 "s(@CυίfZσΝΦEαΞ ύ§έFx mhΝι"g[ΪLlx]Š’•rU ±zμ…ίϊ~pΔΒι)όψΊ—«5ΎcχυτŽεπ¨?‹΅ο27Git Loggitlog text.git.log^commit\s+\h{7,}”xΪ­TmKΓ0n;_ζ’’ΤO~iύ$ d€lΔ-¬ekΣ+sˆέvMΊ46ΫοCš\ξξyξ’ΆSΪ₯Δ{LŽX’Δπ<&bψάqκv\sNpLW>έηEωxχ$—ϋj·%qΏΪM PΫ;O$ΦjUN»†³_e=Θ N:FβΆQξ• F£2šΔ€Κ «Tbšq$π½ΟΨhΊt™±‰ζBb "¦”яŒ—.YC•Όφϊ’+©ͺΨGŽέ\ύG‰θχί%0 œΖάΦg«΅0β4‘u5,ψ˜-s,Cδ”ΞΏκ[Λ@Ο²;oθ˩āΞ»A˜>ψ½β[χψv+qJs&ƈA”Ο”6Z9σ¬ŠΚ3:‚ CΜ(J Η(ΑœcΕq,šΡω6+2°κtn°έͺλΪΌ΄»j|z~9;Ήt]?ŒΎ^Ώƒ ŸλΊ‚λCΤΦ‡›κύ‘ωϋDA5§‘.ΌΧ |S3Τ‹εκ‹ήlήύC‰?qf‘ω Git Mailmap.mailmapmailmaptext.git.mailmapίxΪ…QM ‚@Պ’t¨cP,ΓςGtT‹­¦XΘMt„ύψΤFYEι]ήξΞΗ{3ΫΦ~θŸΟ>r¦•Ρ+’ςσ°Nά!VK[Δm­ΊR―Sj­VΡ#Ό‘=²Dπισ@Νi†κvφ/©IJWFΚmOθήW ˆ-Γ޻Ǎ}0σΦ[β –WŒ9Š—d7Έ )²cwA^AͺΙ.π2΅PZͺ;¬y•¦Z;§Ή‹ΦΒsNΦΒ•ήΖNΜ9Ι“·6¬aϋ»₯i>§ω―rΕUA˜ΩΙΦπ©p=NGit Rebase Todogit-rebase-todotext.git.rebase>^(?:drop|edit|exec|fixup|pick|reword|squash|[defprsx]) \h{7,}  comment_char[#;]hash \b\h{7,}\bΌxΪΝXmoΪ0&”Άc-έ€M›Ψ‡I-•FJ‰φmSΕX?.+rˆ¬ΔIgeϋοΛ‹\Œ!C΄ωΐ!ϋξΉσ=ηΧ³Zς½f²ƒˆCFcΗΆ1‘ώθs»–ή­θY΄οΖO<¦™ΆΒδ“£‘,Β{λL§½>EεέLΆ˜Œœ bϊύž»\©Αδ  EΜϋ…’HΫBλ«\oŸ{j žδΥfȟ΅gy–Υg™™ςξ—Ψά"Έ‰ΩόσAΓdž 6ϋΆŸ’·„99οσ©Σ"―ΪΤ’ZQκ Xάγ]wxϋWί;_¨igšˆγΫν-!R^t6¦HK2 Ηk1b΅ΔB•ΗΎαΥ\ΘIMώ) 8ΡζT’ kβ¬Τ6} Ș8€ΚΗ°αœIέθšjHYχ:ώ5=ǍάΔΏZOεn.Δ„§σO‹Œ`ς…ΉόΔδ=ώύθx¦ζΈΨCΤρ8N]0ηεdLD-‡h>vQ‚α㇓1,ΧƒσίΜϋkύΫΘuΓω«ΉΘςˆ˜‹LϊΤ‹΄ς8›’¨saΐ6-Ί5G‘Ρ.8pφΞ‘ΰ9q΄€-πx{ŽB£p”ΗΩ?GyOΞΡEΖΡp4±AΑbΧ)&)Ά*ΓRwC–D Σ΄mΟi.Ή€'Χίo=—"£]Μ%gοsIπδu2Ž<ΐ‘‡£θε,]³”˜•αIݐ§€3΅uΟ‰+pε?αmek³]p΅‚΄wV"xr„³zξψΟοJwYΉ»•’l Ζoβ‰E¬ψ/ΏίΙοπFQψ­DΩQζ4$°MIΫ IΫρ:χMΨΐοXέαΐ\&Χ£βΑ\£*^&o£βQUŽΊX&GE£βα  Ά2ΤΙ’nŒͺ‡y΄ξ2ٌŠΫ@=ΛP½%ί>ŒΚ‹­Ω_ςΕΞ¨Ό4Θί/NdίφΈ›“ω…ζ–©Yσ9ž’9_Sϋxα†oΈ`B‘ΘVέΠgΎ\Ν†φ‘Ι±CΒΧ³pz;t†=mΆ‹ρt Ɓ¦άk ͺψ#ο(eψFΏU₯K΄UJ―ao³ά>j½~-ΉC{p©¦[$G΅‘wNφn‡SnUo¦ƒˆΰu2L{κ’]τΌ­ΛΩaAϋQΩt ˜ό»ύ^7+:5œ^]MSa“:Τr*ΪU]Ψ γΘή#Α@6¦UiμuεΚΎΎΥΟήl=D¦λΞε\7*YΕΎώιiψGogo source.gobdigits_?(?:[01]+(?:_[01]+)*) bin_digits(?:_?[01]+(?:_[01]+)*) char_escape)\\x\h{2}|\\u\h{4}|\\U\h{8}|\\[0-7]{3}|\\.ddigits(?:\d+(?:_\d+)*) dec_digits(?:\d+(?:_\d+)*) dec_exponent(?:[eE][-+]??{{dec_digits}})hdigits_?(?:\h+(?:_\h+)*) hex_digits(?:_?\h+(?:_\h+)*) hex_exponent(?:[pP][-+]??{{dec_digits}})ident,\b(?!{{keyword}})[[:alpha:]_][[:alnum:]_]*\binline_comment/[*](?:[^*]|[*](?!/))*[*]/keyword‘\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go|goto|if|import|interface|map|package|range|return|select|struct|switch|type|var)\bnoise(?:\s|{{inline_comment}})* oct_digits(?:_?[0-7]+(?:_[0-7]+)*)odigits_?(?:[0-7]+(?:_[0-7]+)*)ohdigits_?(?:\h*(?:_\h+)*)predeclared_func_\b(?:append|cap|close|complex|copy|delete|imag|len|make|new|panic|print|println|real|recover)\bpredeclared_type‹\b(?:bool|byte|complex64|complex128|error|float32|float64|int|int8|int16|int32|int64|rune|string|uint|uint8|uint16|uint32|uint64|uintptr)\bΗxΪν[{ΫΆ•ΆsuΣ6νΪ5—¦q'εHΚ₯KS׎Χέ΅k»uνΊJ²CΙ΄Δ†"ŠJδšήϊΎ±ηύƒ=τaOϋ{ή^χΆ‡½ ‰ !)Κ‰³_M:88887ΠwZτΌΏ―Žλlτ Ώέ­΄<£m6nžΣ’Ο°MŸ‚ž‘@·έ^ΟthθYθ[z.~/p -Η7½Ύgϊζfeΰ{–Σ!­‰ίη9υšΫO\o΄ζ |Rε¨rLέ±ψ}NRekθ΄I#ΗUkΰ6N¨ΦΈ N*Τπ·ϋ&‘j^΅¦κΥ˜ͺSͺ5ξ ˆγχYIΗ†GΊρ’bά‹—%:Ρ7<Σ‘δφtό>ÁυŒ'cψŠDΞ¦mΆ}—"ύΥψ­σ »ηCΒ-£e›•M³mžα[.MήβχίμυmΓ7ΗhDύ.%*υέ~Επ:ΓPAΓσA­ΚΛο2rσ:·QX?T”Š9κ9$)E Ή8V Š1δ»Ρ:νUl‹VΟ7˜6I΅Πl F€Ο(c)8«ŒΕ˜ά3ϊ„€σR0άτ›R0άθ)V˜·a"``ΰ‡mŠ™Σ 1… i˜ΘK\‡Ph*Ζ``zPh —ΥJΦ pWΈ–Β₯ΰ Ω"c‘7€*Xϊφ*c76B)G__cœ]υ:cd# 3œνsŒ.½–hYŽαm‡Υ1½sŒΆŸJΒ†ήΑ”γ–τΒj‰¦ΨŸΆ]q=πΰΞέ`,8ςΌΆ‹ϋX€τz©r©BώAΥ͊ €³z†Ν2γ&₯iΫV`a”·Έ,Ϋ²]ƒ4{›;F[=Μƒ;ŒŽΊζˆ₯ιm. ΅ :imY¦‡›ό£‘1`Ο脏ΐξrϋ7Š‘½ΓX1QΈƒΰο1> ιρZžiηrήmϋγvώw\Sιφ>cŒ_p }•#˜/΅d`Γxf#›±υ1(—τ{.wϊ@ίόaS#ΐ―ΈJB"}χ³τ†qα_sYˆ&ͺΞεΛΐμY ηάˆί—’`β9ͺ،ίσɊ>ˆυψύ"»‹Ρlp’™b ΰάAτέ‡Τ ρ{!~§M?P½#r°^Λ&Φ¬€π°eφzmf,Γ '6ڌί'h8ΚΣ™ οΙLD·Vǁ$Cœ@7zΐοϋ˜Φ-†iά)ξpG΄³ Ϋ -’zέψ}…ͺΗL©`έΘΆ…³+ά€ΕXoΑl ΓΈE ㆔ΰξCΖzα c6#ƒ‰iκqΖΣΆ Ξ‰ίΗ)8Κ·ΈŒF„_›½±U}Fs!„’΄Έ8δΈΞΈκzŒν‰α΄S0ˆίg(ΐδHDT x?~ŸΓD!g@H Ίs9LJΊ±'­‘1Œ8I²mƒP_ΐΏ@„†*lsˆKΞ!δ·B’ξˆ¨††Τ–Γ8— ~_€*ΐωfŠͺοrHb¦©τρϋ-TζŠίίΕοΦj›ΎQmΩnϋa΅ƒ$<B+―αƒώΡ؝aρ…ΥπPπMI«¦³ qΞ"ŒG(™+iόg†?ΆΞ@P^”―ӈzΠ*­]‚–Γ™N'1΄ΪAh44«β CΞζTΟ@›tάFˁ΅D1n€ P¬GAO‘Ι "oDšD±[2#ͺ7Zz½Ρίωxw£½ΑŸOΐ?ʐξU@zcΤκε&ψT_/7ƒπγ₯š—Α§š^nTυΖx __uύιΑa™Γ¬9ŠY³ΡhΝ0ΖW²3©†ΎR8°;‚Αh3’„β–ΨW‘AH_₯Εp׏DK"›¨#Ο—XβC,ΈΨb%»}Jk½εE=!‰έGc4ι4Σ“TeΒ—kΗUŽ6Α³+όˆPΣ•ΠβυΖ \j”υP pΓ3 ₯2έε΄ΦqηθZΘΫG1[υΡΠ†°Ίι!o“έ=Κͺ4|.£‹ςζcό2λρ€ΖϊΫhŒݝۻA£1ή†ΎξΑυ›•wš;wΰΗ*’γM¦e΄₯Uš¦΄ΑP²H7τ v…°ό_Ο‘Ρ&,ΊΖ·ΩXΘ¨ιZ1†\$%έ„hών` FN.§ςHδπx~Œ«αΊJlkψ˜'8ΤΙƒ₯“Ϊ‘N¦rYΛͺ“²YΗ‘>_Ξ Xq΅QJ—ŸϊΊή\RˆΧu˜ύn©,₯Ηή‰ΘOιΰ`r‡,†‰°E•Σak8=‚ݍCπ1εβΝ^NΧΧKΝt²N&ν5hTŸDͺό6!ν3žΨSpTΕL'0!ALΡέφAvh .εωΫUΈ€Y…υ•’%z;R|τVt”pκyhC^Μ̊ —'ΗFͺg{€t– ^ΦR¬βα’ΑΣ›žΌΑ²hΟΦώt-M[S™rΈ(p¨u“hv¨uγlΥ²jΜΗΟͺulΛ›)±‡a’{+x―ŽΑ’θ|LikeΟΆUk|m•j“ 6Ά ;*«˜qΚiκ*ζYM1v:EΗNτκr s’KkQι±ΏPy˜ͺ–Š€š!H’κO±vΉεΊvΠΪBΫ‘‚9Ίϋ6ϊtλφ½ΐτ<Θ8x¦τΞνθ  ;ίƒnέ…Α—ΰ/ψ žφ ’©x0„pΓpA#Πa _}ςO‰M ΌV ή »A”Ξͺλˆ(1=ή5‰˜f9ΰ―ΪΑ¬c0Lxƒ BΡgΓ…πωοs$~ΎΞdγ+ΕΈηJoKc«₯τΆ½‘ Lφ9‘ΙΞ΅u·›²ΛfI¦₯±εΧGΤeIί΄€'φΣ=Ϊ›"φŒ(ͺ-έ¬·>hΒΌύ΅ϊΝ[a–Fψ,+²ϋΒΥαθž/ΩVΙ5ލQ[%a ΎΔv‰’@ηŠ0Eƒš|&‰ 3φ"η|j ρcF¦‰,ƒςfΛ=γ‘ 6{žθSH(jΛHΤεV’Ÿ€»υ,Ε’{ΜQυ¨ς―4nj~ί 7ϋAΫv˜qΰέ߁ŒmfΒ+γΒmD$6 Bq¬6½φAldƒ?mχ±ι=ΛrE8q˜3AJϜ’'CXfs’F^šs”ρbkzcrΔ‰/ώ\o­¦—:^ZΦKϋ\>τ5άΫ#‚@ω6Ε#qJWHά¨1ΗΤΈLΧΰ„χš,±gιš\™xŒYnΠP«eξ½Π'9‰P—k2›‚”Djό3§©ΖθΒ¨ρ›aΰ^Tؘ9© ΅E4³‹φΩTΞ±ό€p7AƒΚΑΨ_p—FΛσ lΗ  „ωLLρ4tζGΝze©ΉΆΖ~«―ςουω…`‡7νόΨ rŒΡaB±Y˜z΅ 5mΑlΞz„ϋθD0ρ}O<έ¨c]Δ͘μ7§ϋŸ‰XΒΠ~tΝ‘‘ΐ“lS–Ι9#|„­qvΊϊ πΧκ ΥΖζ•₯J³\Ώς΅QωώXD+1}ΨkošαΩ΄c-PίΖOy(Jδύ½ ό† ΌI#>\σcΦόTVσ™IL?8‘­M΅Ά%+έΰͺ§iΙ=Se!œ/! hΉύjŠ&‘f‡žΞFCηž Σ˜™‘— CέOρβVε΄Ί?A³B̚πVίιω εΞ-Ξ‰Wξ¨-¦w,ί=εΎ k‘'([P ΚojόG8ΗΌ¬Θψ|Rj¬}DS₯ΰ$φ‘·Θ˜Θ-ΓLR‚‘*ρ)lΩWnΰΨ€7Ρx\₯9bζΰH(Ω„π Iγ6½©Θ S Dό2FL…>β?Nπ»Σa Ρβ™Œͺ$“WSˆvώC(uό―ΠΦήΐ䱓tξγ ²1ο)ω 41 φW±ΌnfμV<₯ Ό<Γεe –ΗB…“‚4!ˆ¦?S‘―hJU κ—θьfj*ϊDy@)ΪΓ ΰTΜ”w‚ψM™6€]‚3―ά3bΧΑό”΄~^Φ:€”5ώ’¬ρ³ΤgΊ»‚ςeAω{‚ςAωͺ όΎ |MPώcAωϋ‚ςε?”((HPώSAωΟε?”BPώKAω―ε Κ-(DPώ© ό3Aωo$2'ZηΊ+(Ώ-(GPώ΅ \ω %ς|₯›β©80m¦―g£…D</z ]―u3€¬\ΏWy—œFΖΠrΆœΆm›vϋβ"ξ¬tναιw•±EΊŸpΏ΄Κ^V6ΆΙΒOAΉ”­Ή £€ƒλWsΆ}νZފω‰>‚q¬ηGBYΟ9\y{^.`ΈΚΩΪΖ[j,ε€z©ͺ—ςqΊR™ΈιJΤWςQ_Λί4ͺXΛΧςςδ^ΙΨi½’OΚVV Pθ••|μZΙi·WσΪϋϊzΏ+z~„άΟΙ„ϋ9νΡz½ž³ν 䘌ΛXzΔy΄Ήn ₯žrOkά6r$ο«Ν—ΡjαΖ0˜κ‡{½`ΗΧ±lκφ”6‡£FΌα,kθυYε¦[‚ςŠ Ό!(― ΚΏ”/ ΚΛnΧ<(x»ζMBABKΧKΚ?η£_gο»βάM'™¨άhGd/Μ\――_o–ΥΪΚ:™ιτžˆλ―jYΗύ=6Ÿn–όξ z‡ώCύ\ΒΎΏf₯+gφ{ΒͺBšςςjϊλ”e3οtG`eXΫψAω=UϊКκΞςjyw»Έ²ΔΕ%oΚK5 ―ΙΨ%Zǝ₯ώ‘ όsAω‚ς―rΠT+>*˜Ξmη―k‚ˆŽΪ΅UFpγΑ¬¨ςώ>*$βοαQ‘‚Ÿ,‡―ΞoΜi8kcj-οIΒ SΡ”’p€¬OηeΊ1[„ΜT9O»2]<¨Η§isH«‡Χ’MνZ΄‰‡φIν^ŽεΪΩ4—^]y,aΘ­X"Ιzj7Α«w₯mΣL4šΐΠ>>Θ.u–/π ZΟτMO%ŒΘΫ"“ρκR₯™JψPΏ°ΫΠƒ)7±‰vGͺζ„ΚbŽs€ΩΙ7ˆ€eΑΖEYO₯ž)N‹h tAκ¨Mλί+š Χ_Π­K†‰P'† O[€βI’”aH”HIΞ!I&ηO|LHmΖφ=MλώήΏKeπ#‘(Nmm θ5¦€ΚΉx0Sœ ΅YΦ~"ΰϊ3–ύgfΟΡχ2Oύ²μn°xIΐτ¨<)h{qσι3₯ΙΜc‹φrα}QΫw¬Lλ&/0Ϊ•ΚͺI‡|Graphviz (DOT)dotDOTgv source.dotxΪ½WέnΫ6ΆtM%lθ†aKΆΩΙ¬¬»\Φδv5`WqgP#q‘H•€–ΊepoΥCJ”)Z–"¨/Δ#ςθό|ηγ!}8¨~ΟκρQFη!Gσ_ŸΪΏƒ­,½a§^ΔςSWoΤ―χΒκντλύfυvλρΛ–ΞCΗ8ž¦2Ο–Ξl‘άDπΩΚMλρ‹Άς›‚c!£{žύωρ\Ψ2Ωυ§ήΊ…Σο{c+Ωη_¬3'I«ςΉW7A[ΠC8ΦlŽ% ΞΚ"ˆ™8Z;.-fסּγz,JΙI(ˆρ5‘Ĉ•ILccvΤ²1^ύrώʚϊΊΓ”ΐβH2nΎί±AιΟύ΄‡LJHJNΒRb±]^M0“ώΌ»Ÿ4ΉoΫ 2B1|]†žŠ ‰ΤOsθ¦ii>ΎΜ?žΜθe«ϋM—Z-ωT„ή‡CΟG˜±θΖ7μ1Ό†§//ί%ΊƒΡVίο/ΏoLLΊΉή”zM‚Χ%“8wmo[jΘg…ϋ T;XνHΝή™«„ΒYԍRhF‘Δ<ΐ"B^6%σ³§ψΥ»χͺιj?υv΅ηŒ/¦Λ­½³U—Θn5ΦTΰρ ΡWκΣ[AΧΗ£>εaη)ρ/•Σ/Δ YφΜwαΚNŸn}PmŽcΨGηyφ1½xϋQg­ŽξΡC›€φνlvr>v·.¦}ω£;yMtsτE°οNΨ†5 ΗcQ†*&“Λ„£"ΜΒ™8£¬ΠζpݞΒdciέtΠτ:ΖQ‚Ή¨:‰―oοχ€&‘‹€’Ζ³VήυΡΎQΚd]&Ώ«—ώCœ έOε:ψφ‘<]¦LYŒŽ¬ŒgΘΎ‰Z€½IH{Sv±ώ_Ϊ™”,ΟPˆ3±ŒqUσšφknzOΦΜ?]3lΝό~Η‘Χ}cμ»wΪΏέχΈχGroovygroovygvygradle Jenkinsfile source.groovy&single_dollar_interpolation_identifierD(?:{{unicode_letter}}|[a-zA-Z_])(?:{{unicode_letter}}|[a-zA-Z0-9_])*unicode_letter₯(?:(?xi) # Valid unicode letters according to: # http://groovy-lang.org/syntax.html#_normal_identifiers # Literal Unicode Escaped Unicode [\x{00C0}-\x{00D6}] | \\u00C[0-9A-F] | \\u00D[0-6] | [\x{00D8}-\x{00F6}] | \\u00D[89A-F] | \\u00E[0-9A-F] | \\u00F[0-6] | [\x{00F8}-\x{00FF}] | \\u00F[89A-F] | [\x{0100}-\x{FFFE}] | \\u0[1-9A-F][0-9A-F]{2} | \\u(?!FFFF)[1-9A-F][0-9A-F]{3} )χxΪνsΣF6!?΄Π”B'"ΕΘ?Jiˆq;…άά ΣϋƒλΝΝE&#ΫλXE–\I&IQξΓά_ΉΟqίε>Ζ½]iW«Υ$'‘Wn$²W»oί{ϋφύ\₯=_’ϋ-Λυάνγυ^o―-Μd―3zŽ(H»Νv»G»HξŸg»y£rCC˜z.Ή_ΛtFAΟ£ΎάΎα ΗvQ:δdrΏ’ςνοz~ίp,wgbνpύP­?ΓTaoŒ|+τόώιδώi¦…C―oτ,ΗI»žIξΛ²}¬ΨΆη>YΆΫGά4g§ΛHš—\<–[ΰs…έ΄σΙύ£L7ν ½q μBQ/‹>]Ντ lwΗAFίs€*#}ψnΨnˆό±η*Σy>–Š[K«j„ϋc^„/&χ‘3™€N=άOΗ\ͺ>†‘υIјŸ'^Βέχ&]‡“ΣO«aσ|VaLΜΜtΖ¨‚1πeL ‹β婇2LΏ¨>TDψŠΐT6t '>ΏΌ_ [x{oϊτͺ°a·†ε‡ ‚ ’ϊ‚hͺΑTφ‰Φ3ΌξO¨Η\ΰ'š‘>Ύ!lŒŒF€n š"ιΔ€ΤmΠσ\ ‚λ°(H“D•K·v|Ο{³Ώ ,ΤΉΜS£ηυ€e±\cd»“ΐYc4'ΓξΆΐ’D«Ηw„m**iΪoEя*gΪOL/ ΊΐiΥU~N‘Σ.uA8Š”1νsWΰ@’]ιcCxμNF]δ³Η aΙbuJŸ6……-W£t䚠λ¨ϊy}{`sά„8£gi§ϋ‚v’ιJΪχ ’Ύ±Ψϊy‚ά^ ϊ‘tF=Ύ_φ™Cϋ>”@N£CΎ2$;Λcauγ!ŒΈosͺ8Ϊc]\§Ιxμω‘1˜Έ=Όž¬γ­Χ&ΫRΰ+νΎ!ΘΥΛ™€³Ά₯σΖςm 8Α:+  Bn5ˆžkΔ:b†λHύErΡ/ζΑ¬ dΖ˜Δ ‘ΪF€΅ HPmμ τ$·-—¬x¬ϊh`»6Fτ΅Α9A*ψZ{΄Ύ¬GZ»eθ9τΣ•Π^ΊΤ΅-Λψε;γοkΖ7Ϋf£SΧΪλπΓ΅ή­uτϊS½ ½Wg…=/GΧv‡Θ·Aβ‰ΉI˜=!P=+X˜dη6θo$ˆ&γΕαΤ€1²Γύ†Β΄ιδΟ»”_Τ»ΣμlbΘ€2ΖΫYŠK*S0ά2ΝrJ^ŒAΨΓΕL€pD?¬ Κdυ …,WΒΎ( σ­L*¨φΧ’e« }u –ΔΛO΄»ΊŒrE*KΓΘR¬οSΙ6γψ€ΰP€Ζ±ΈόΟ z7ρa” `–g*s΅9+8 Τ(x^ˆWnϊεUv‘fΗ‚ˆKΟ P™,Ёλβ’¨˜°ά$Ž}rύu[˜c1+ΛΜΩhΰύο“OΗ€ΔrTΡm”8\ κp%Sƒƒ΅ °η#ŠΖΜ\Ϊnπ΄!l†b€UεοΏ3Βͺ£™²/xΚ8g²Œ$fuq’•ΐΖ8ΒGπέr2ƒΧ]ϊα^1Ψ”jΉώeΙ$K£ΠΔ1Ϊ νĐ̀!™‚!w‹1/γΔ?™Πμa<_«iπΏΫλ]ΟsεFέύE½‘εGΑό­T`4p<+ŒΟέ‰bΗΔmέά­›œB7»ΤΖ›»`ΫWu°νΈΧΜcvτU&Ϋπ+™Ϋ„ν °CCj·jΤα’―Tδa™/p]0΄Ψ‹ΟΣ ›"•Šo—rφσρ°œ™= gζΤ›ι~e‘¬¦MnN·‹Β‘ον½Μp₯³%q9f~FΚmFƒBKXΜ± ΠKYRy†8³‚γ―teT<€)‚· Ν¦ΫΞ»όjήUΠ―XΝw=}6@nΔIΙ¬§dϊœΉiΝϋ‘.UΔΜχ3ΠZr§yVVοΑ8”-ά5K|ϋ†’}'&Μeσ­Ι‚Q™š~e–K›|4£’~oβ3<7Ο(ηΝαΑaRκ—ΆdŽτ]1†-MĈ/&ξv\JθΙΰΚό{*)MsY„]μαK]ϋ3Μ™nFΰP/ϋχŸΩΏŸϋόϋ²BΩ5©,ΕI‰ψœ–Iυ1O>Ή£AΆγΈΊƒ+βΒΓ₯|ΖOΒ8g.C°³€‹‰~‘ΚΤ–ζΥz jλΥR§~HPοGhJυNσ»zތM/ΫqΉΎ,%Ου{!ΫόςKw²ͺ.wZΆ–ΰ‚ ˜J2:ά Γρκw΅yΏ¨²y/+–±κŽ­2ώ½·0‹E»°JΙΚΚΚ»“0|Ρc“Δf's*Wο:N½»rΥc-,ζDŠ_6§Χ%}ρuA&‹|υ%ΫkW‹:ΟJYύVΤ€κ£C]΄c»eΫ}¦2 fiO'A Τ­’ψ•+—ΰΒDΐcD [½ΧPυ¨cΤSά#ˆ°7«ΤΝ.ŒψŸδ¨ΉP9J E1ξ‘‹|»€Y½ŒοΦϋ5 ƒšfωΎ΅#›]18Κg2g₯ζ*1ηWŽ9―p½3Ξ:ž6Kdχ’±oΏpξ  θC)ΐa_>€πZά]ψώEeθAΗ΅AύΘκΒƁΈ!‚²²ϊ5@4Έ ώΤΐ„:©₯ΓDσ‘ŸΛš‡X±ŽcExœ:DŒS‚xŠβ•;¦ηΙ ˆiBίs!δ Υθ˜^‘Δ¨ͺ”±Q„9Ι “UΕaa<θΒ e?₯˜%9†„ΕT"+Š=6[y₯qικα©P˜+B!γמJQ0W›'M•=ξ„FγΖΪΣᙉx©EΎ’ΠΖ7yό¨_¦5›zc•σ1w<)ΪΔΎ`œ(+ŽOE‡R9dΜ8΅  ˆΚΫ’Y:§‰>gˆg49-ΔkŠ’ε(r'ŽΓ»"£‡Μ§ΣjΜΗ4SΎ&‚V%5T’x²Hη"pCΡn(Ϊ—1ΗmEϋͺ’}‘`ŽΣŠ15EϋEϋŠ’½₯hΧνχνχ h81ε+°2Ω·λΌοGΰτ†ΡρΞ~DŽ6p’L9F³‘Τπ ½σ‰ΪT€Ϋ)|»ιF]°›―#<ΤvaΟΐ~Ά&Nυ½hwh;°‰3BZ˜Ό5#ΏrαW­&mύT«+Ÿμyυ―,vΛΠp–§A3΅r 2k—9δ*Žψͺυό»bFOfpΞΜ,όuDM|―ό`w₯άβΩΜόŸρ¦Z'ς@ΐr'T™PΚ:ˆ Dζ+σδ? Ι$GR‹:ϋω^Νσ!Γζ#–f θ«4 Yι;|‚/ΞYΖ)WΘη /Uΰ„Bφ=ˎ^ΗΉ@ξŒw³Η'W)Y-^šO*΄<`₯Œ^ε4 Ÿρ₯Α'Ÿ £/+Ž»Λ$ε\F<~“I]tΰ1ˆ»šεφkΝ;cUš¦¦γLπoλυ8ΣΛΑizΌ;O‘io<»ovuΦ₯¦}/¦ΕΒDlŒ² fΜ¨X9ΖPΔ2oΓ(ŠΚ‚€'dp…Μ6~žXp“Φ=—μ7ϊ5šg ιΒΦΊϋ5; 3  ΅™r˜ςB`&¦3xJ†Wgw1³w’κKΝvήόΡyκ8=UPΨβbQ&fP¦ΌFΘΕ‡6Α4!75#ηί‰6ϋ½W5–eώ\œ#Γ’ΕOQΰΠΛΖ2aKœV8τJ|₯δŒ0ψVΩ`ΨNΙΠ³G zώ¨DŸ; Ρη»Τd›©σ3U}π!uh΄5m/ϊ›ŽάZƟΊ];ͺ‘·Α8iψATC›| Οq›kŠžλIη€±­k[/œΝΑ“gύNτγ‹hβ`@βΑ̏w'#¬2¦+@P~7aΓo½jvκM½ͺߟy#«’»z‘2SϊώΞς‡Γεήψ°dΏΣχTύ㒍žΙ€Q‹½wΡmbžΛœNη]Θλ2I$­ζtHr†,Ž&RX•\ΤΧ)¨ι’ Σ*JάE+Β^ιώ²fZ§bNζ†ΜNηήυG?.61·6ͺ€h.fH€δ}kΎ¬O‡/Η2:κy;œ”zSςͺιtΑοφ«]κOUtXύj™½;½ZΙόW²ϋ—ͺ¨ƒͺoadΞpSEcš[vζ²i,uχ~H–ωb x–V’ˆΡΉŽ‘ΝŸVv―rGЏ‹Ο+c!9ή}Œx\žξπ1βq₯S !ZΡώXΡώ•’ύ‘’½©hP•g,΅½UρOV₯'“+qνΛ"eΆΥδοοΰΣ θ@7Dδί‘γβΏ‰—WœρŸ?LCB2"ΏŸ•›aθMœώ¦e;Ρ~AΛ^ψς/N ·#ˆG‘¬U„|W‘_ίƒχbA 8ϊ <‚ π^9‹ό Œϋ“‹Oψ†Q]attribute_name_start(?=[^{{attribute_name_char}}])block_tag_nameΠ(?ix: address|applet|article|aside|blockquote|center|dd|dir|div|dl|dt|figcaption|figure|footer|frame|frameset|h1|h2|h3|h4|h5|h6|header|iframe|menu|nav|noframes|object|ol|p|pre|section|ul ){{tag_name_break}}custom_element_charΎ(?x: # https://html.spec.whatwg.org/multipage/custom-elements.html#custom-elements-core-concepts [-_a-z0-9\x{00B7}] | \\\. | [\x{00C0}-\x{00D6}] | [\x{00D8}-\x{00F6}] | [\x{00F8}-\x{02FF}] | [\x{0300}-\x{037D}] | [\x{037F}-\x{1FFF}] | [\x{200C}-\x{200D}] | [\x{203F}-\x{2040}] | [\x{2070}-\x{218F}] | [\x{2C00}-\x{2FEF}] | [\x{3001}-\x{D7FF}] | [\x{F900}-\x{FDCF}] | [\x{FDF0}-\x{FFFD}] | [\x{10000}-\x{EFFFF}] ) form_tag_name}(?ix: button|datalist|input|label|legend|meter|optgroup|option|output|progress|select|template|textarea ){{tag_name_break}}inline_tag_name^(?ix: abbr|acronym|area|audio|b|base|basefont|bdi|bdo|big|br|canvas|caption|cite|code|del|details|dfn|dialog|em|font|head|html|i|img|ins|isindex|kbd|li|link|map|mark|menu|menuitem|meta|noscript|param|picture|q|rp|rt|rtc|ruby|s|samp|script|small|source|span|strike|strong|style|sub|summary|sup|time|title|track|tt|u|var|video|wbr ){{tag_name_break}}javascript_mime_typeΆ(?ix: # https://mimesniff.spec.whatwg.org/#javascript-mime-type (?:application|text)/(?:x-)?(?:java|ecma)script | text/javascript1\.[0-5] | text/jscript | text/livescript )script_close_lookahead(?i:(?=(?:-->\s*)?]unquoted_attribute_break(?=[{{ascii_space}}]|/?>)unquoted_attribute_start(?=[^{{ascii_space}}=>]))xΪνιzΤFrlΘEHΈ!>Ο@4>8 Ζxη‚„r€ΗΤžΦH>²Ÿ»o΅ί>Α>ΐΎΝV·Τ’Ί§[#γύv>˜–[UέUΥUΥ₯ͺΦΌ¬DŸγv\w\η…aκώbκl…ζάn9A 6·Η90Σ5‚­ Χ 8παΈύ€οκ–“ΒPΓL3˜ƒj˜σ–ζ ƒy[ s•ΑΌ£†ΉΖ`ήUΓ\g0ο©afΜ!5Μ σ~ܞΰ`|Γ³zf؏΄@o§ςό |"[¦Geπ k§C·'e /υu=ΊLDHˆωΈ B²κŸΔν§27θ /₯ζHܞ•ΑRΦƒΐ³Za€R€£%65gx$€sښι†-i„n€Μt’Οςp|ψ’ΰ€ΐpΆΦπύπψΐ„ςΑŸ”« δ~JΑU‰ύtqœ„v{ΓeO΅uέ‘ζ£žξ遛!’΅£}Θ†­ϋΎ8DŠx$bBξη%я(Ρ:Έ_5©£%RΗJ"&€Ž—DL<υya€±δY†šΛ ₯Q>/–FM8Τ!E΅L5­Υ2X ™΅2X …—”k™•’ΘΛ%:Ώ(‰˜ͺ•DLΤ¦.lτ/θfΚξN [ό p(Ί°ΫSB$AC$vsZΐC#v{FΈ‡DμφaC"&vUΨ?0-;δ5aΏg°]”}]γθέdœY!¦A6D=·Ηξίο;XΘgχo ¬Y Σdoe‡™‹[ΚeΧε–°ϋ‹Α ƒ›BKα&ƒέβ¦L$Γ@„M/Ύ`€ A~ΩΈ‚Α|)μίΠ€ίvΝ,°‰ ΛLΗ½+θ‚,z`°χδ°\Τΐ`…υŠχvQΦχEΦ#0NΤKqϋγ'Ίρ•Έixΐ@Ύξ#½‹g°ίΔν‘~XAxί »znΐ€Ύ‹ΫdH O„%”lΨ τaܞRƒjθP·“ΑΏΫ9Y!nOζΐSnΒ#aυ)BθnWkΉζϋQ –υ? ^nμN’j%όΓm­«o΅ˆόνUͺw ₯ γ‰  Cϋ³d!„¨‚ώ"#D@ψ…ψU²"Fv!~“,„4ΔaO·! 2π³Έ=“,p°,αΉ'ΛC³FvύWβφt.ΗχsΑΧ‹Q ƒ{·Ηp·ΏKΔɁgΥγφ˜ ˜£Έ%q Τ…qc(‘²3…4ακ*@₯bΊ*Y.1<β…Τ–(΅ˆ‘•SG’Ԍ!Xqϋ2n‡„ Ιΰu₯ξ·»vΖWu²1 ¬DϋW=t’­K€dΠτΓG++ ¬ŸEο½Π1‚P,Χ©›hΥr,zIζŸB‡‹2TCΒΎΗvυ–νk\†‘αμτlΉ«σ£Z­QΥ΄¦i‘–€ ‚`-‹Ε-δg™uΛΆQ[·λ-έΤβΩ}Νυ΄{‹wžά‘ˆ#Mδ3ΙX`Œ¦D3Γ‚΅jcTk,Τ°¦.lŸ΄h †!΅nyΊ±†Ώž Ώθ "ZΟΡmΝ[> κ› Ή’f4W₯$"π‘AΫdβώ•>˜‰ f©ž΅η‘žηΘχ]OJγA™26―¦ŒYŸ “‰1ŸΨΏ(°tΊΟφ/RΖVΦ\u~²Vž*kƒ·‘ ƒS ΅-GΊ1ΗB[uζDώ…Ξή·[g%ψaeΞΗƒ$άξ€}Uξ#@›΅uΤm!ΣDfBϋŐ3ŠώyE­£‹~ήN–ψvσqcX"ߏ3}―}6Oπ“²ρέΠ3Pύ₯ΟΛ& J?g²*ΨΈ]ḿΞC(TkΜOŠΪΘۈlvϊIYΞuΐ°C‚Φ+%œΰ”BSSΰΒ„4ή°‚N'4,γο6»8/±Ώ$-Q_C[™Ρ**cϊ΄R@STȍΚk‚jξVδ»QώΗΑ”ρΚΩcμβbΎg‹gȏΌn"/J²#ob7Θ+γTξΏ‚S9‘ιc…λʜΚI AΩb§yΒ^εTκUj}φOžCΛϊ”sœOQŒω εΎΒ˜ϊΒ,:Σ›κPΞΌŠCωͺ²ϋ2P‰[• ρš ΒΏQΦ .˜’ε_i8$Ζ»η«ΎS°TΪ‡½K―“₯aR1iDFΞγ"K<ΗMOί^nM§Ή:²‚' 2Ηΐ¬cylβχωΡ ΕА6Λςƒœ»8²ΪHhΦYξOΝγ Cb¬Ÿζh~Ή΅-ζ˜ίJE>¦πΏ;*‰mJ 2”]–ΐ„ ‡G;A^ž›Ψ ττ·γΊ†f[~P·ΜύΌ-m§7n_Κec_h£(bφDχΩ»;ΫO >χΥ&#ΓSΕΙ·s$§’ŒZKχ-£Œ\B³MζIMc~΄Ή\«βT­ — ΖažɁ²gx²Ϊp=PQA¦ ’-ΌΚ”*ΩT ΛζƒT6šV«’Š_’φQ¦†kω4&ωk₯hΆQGTp:T˜ΣSNkΥΕξ=yϊθώ.gΑGr4 >n—0wPΒάuIίUIί5Iίlž`ΚNs9―~άW<Νh‘κyΈ’pEκ“²‡o/œ‡:š8±ΉG?ί}πΝ=όψιγ'χ֚-FΰYaQβσ“uπK΄θœ³»‹9€ώ<(9Ί ¬TΩΫ―”+©-ίўιڟ+ΛΟγΈ`r~aε’θ₯@ ~ ƒlέi‡zρ| —]Ž[EžHΙΩ$Η(.Ž/oώΆRkv.WoΥDW’ΠotΐΔ XΛz\|κ MμΖk«΄υ±ό%`ΓI ]† t-‡ζΦ2˜ϊύΡΕρΪς”vs%ΛΥŁ\½I8ͺ-ƒΒΪ‰lΘΙΐ˜oSyjέχ‘F…ŠΘg(#±’5ΔiE•μΌ‡’Ω¨U7»φ.οr,u/Φz³'bd»/γρ„κZ•Ττβ|;yœyΞy•ώ°M”ψΐtςŽςJΑ4ižψ|ψyQqs["\’{έυ~•ψ*c=Βd#9H‰;H71E*]Vπ1εΛKΙxδβ­ΚD7ηŒθ¦ι!ίΗz―g£λ^`6Βΰ*L„ιQϊˆ DNΗaΣΔ¦΅ŽM›^΅Ϊ†ή#μK  ―Ί.\υ€ΰθΫ‡;ΣΈ3ƒ;Wpη*ξ\ÝλTΈgE€|‡ΨΡΧ±γF8Ψm½„ΰ»6ξαŒ‡‚8΄νΕrœS,G /ΩRΌΕ-ΕXŸΊuΌύΗΣΫOZOδΔ(²MP€½`οσ\φΈe2ώήαψkIΝ§Υς°nx³ΥγA:ΦCΣrq Γn‹θΧ*DϊΈeZπϊ­6 C‡GP3Λ1,ba.Xœ‰ΐͺΐyZΆΝU M·έ6F H2L␰…­n[Ž-HΘh―΅Ll[πΟYΓ]½½΅Θ¬ΘΜΠΕΔ-ƒEξ“lχ,κLπΨλa/€φΒΦφ±―w{8φ!κ³q”bΒ~Ow0Iχ¬!ΈNΣmϋa ώwajΐ{8°ΐ΄Aψp+ Op8pˆΧu―ƒqρFΛ;τ&i†δ\£L3ήε4γRΗ ©Λ––d\H&–ͺΨΦ[°Βv€§*²ΰέ^Πφ\–)ƒ²ηΉmκ™}d?λΧ³uΠΠMΫΑδ n M½ΗIn΄Οgθ{ΑΤΩڐΛΡ!Ž£‡}°Αh‰ιiOΠΰ"0q@φJtΰ1μ`O6Ρ|ξωͺ2 ΌΟI€™€0#Ν4΄ΪΆƒ@?Jϊ~βΘ:,%k‡Ι0$}f6FV–-Ψhσ ’‹“•–©J«!ρΠmζΣ—•a‘ Ι·>ψ[:Ӛ‘’ΤΉKU οƒŠβ“wφŽ’’gΙΨδSμ!FužνΆlΘmεΫTΒω¨²O ?Ό_ ?’§ŽςΒFΓ‚δ/Id6[Œξb§ΙFxwL_Ψ«σο:ζ{4Xξ9δΞpJltώF.γ# θωs““]ί|ΗZ]­ϋ=dΤ7:z°Ρ»^{r<}3]#Pτ•gΐs'O’–AMc•Ϊ$tn’WΡs #£«Χ"\ΐΐ#h2oΊY‡Δδ΅•Μ=ΨΆΦQάWλ«<γ‰ύΙΘ۟„Υ€ξY–mΙφ5%}Ο9…pϊΩuΝΠF’υŽn€ό’‹]£η0OΟž€9wmΆ9~6*vbψ$χ€žδΊa Ϋ",ηψ­l’/·5Iž“ν;TΝχρρΑ!€“ωΞΟJΣ0±γ4+LΓ‘¬†Π·¬hφΊΊPSΎe‡Ω†·;'g¦ΕiKμΡ‹wbtπ’ΏlTX(»― Q–v=D9^ٟtŸ*¬νo@hu:XξAlVβΌ ίWωnΈΕ\7\πά_½Φ l{³•ά'ΎήΦ$yσaJ@"υšΤH²γŸΝ-…‘ΌPτ?Tτ―*ϊQτ?+Κ3K°5[τέ‚τΚΕΚOQςS?HϊΎΟ“Ψkx;θQE!5ρδΜΰƒϊ‚*ω§ηrψ>(γ{ϋ‹ŠχsR}žΨρy>ηζω8cY,³w{aepbg€θRq―ɐ$ϊ­§S~P)93mŸ“4+E©<£b€†πGOgˆΟwέΠ¬žήF“ρ―\A€žP€΄Œ šαzτGω Τ |}ddY{)Ξ)νfsσoSSwgŠžηšΝf^,Σώ{Siτbρz υ/ވϋ—ψώ₯Έfi)Ϋe*ηΚμ"Χ?»Dϋ§—8ψ˜˜φΓΕ"Χe)ξΏ:ΕυΟFγΟLίΰΖΉΟ;³t?ΫδLΣώΕYnή₯›1όβ=q)ξ_ZΚ3=5#ά_Š8¨]NΦ³P§ƒΈΗ+H~Α(<ŠΪc|1šlμβ$ jrηx$Ή6!lt*­ΪΊPιΤΓΐeΉtξδy.TuΓM(kΈe‡΄bk@ε¨Βm‰/ƒTvΪltt§ U\ŠB»Σ3ž›­Α!Š!Μ–™žή&‘–”£–ž² W›V@/l€―#zεΗχθo„Β•Ϋ£ψatΈ7ꄁ…L C’oΚΛͺ Ϊ— c=Δ°Ήšξ†CF€Λ­5ΒT©lŠQδ ™€|_OœόQΠuC±Aθύτ2’›^v]vΕΝψbΑΑ„΄έθ d“z:ό…‰lιlPi18erτθΉψΆώD€Jν’ϊ4BkΘ$ƒ+‚WOύŽ»Υk (4I©Ί φCpΌ |R©{&-°Ίm:dέ΅Γ.›oCtΪ‡jεb*ώΥ?iLυ›€οΧΚήΖTOw.¦$π 1•όν°"―θl+;#[«ΡL_ξIγ²Ή΄F―Ω”₯΅τ Θψ/ΚΧωz1Π!ε’&+™PΨj™ϊSδiΎΏ\ΜΚΏC ΅ςŽ€―]Ω[+·ŠjΟΰˆI@e_Η¬—3}μΈβΏEYΐ/€Ξ’Θ«α;F«V”Φϊ€΅ώ/§…ͺ0Haskellhssource.haskellO xΪΥνrΫΖ‘”?δ(ŽλΨ–ν~D‘%ΕD±·iT;,EAΗ4©’Rš† Xˆ8J €’ά\σ³ν―v¦Ο™Ύ@ž$O’;ά$eY?‚ GbowoΏw‘‡™πšξ‹ΊνΨνΛι·;N―lΏύd.Γ^£€ŸΰltΏΝG`^‚t*ΊίdΰzΊi'0WabzWΣa>#0Χa>'0ΧΣaž˜ιt˜ί˜ι0Ώ#0ο₯Γ|A`fa~O`ޏξχYΗX  ΞϊŽKKœ`ΊΕ@χ]ύ°§'Ppςh4ηΈ½ΣρSΟΧ]Ÿ<ώ‡„±‘9Ξ2ˆ€ˆmηrΟM»kž΅>y~‡Σ<Νί]ŽOVκ'ΏΚΦ{`޳u"†PLsœΐ M΄=σΠΦύγxέr1Λ<H)€{Ηΐ²2πΪϋΘq΅ο”EΖ-³ο…Α‚~p›ήIπ+ΪίΙ†rށέρΊo:vή]Σ6ƒ%aΨFΜπTFpe)ηiΕΏMβp4ΟIΛ2m7œΑCχŽD‚Λ”‰·I…ήΪ’¬Ω…aϊψϊ˜πutδŽ₯»αρCλ‘ΉJ“!.!Θ1\–;oΗΰΝ©γyΗGϋ‘dfStzfƒlSWώΦΚe9ζLϋD·L#Τy8—vr΄ςΌ±'^€DGΧήΑαƒλ? κWŽ-ιtLC†›Ψ8ϋ}Λμ ^O”6ΛΠ᫟ΧΣedP} kλml9§°:θ!@WοΐΊ.γ#κTmτγΊ3° €Z!ΐ¦εθΎ\€eΫ‡.‚ ~0νCt7˜ΰRyt‹h‰ΣΨΏΙa5©ΊWΪ6lμ~Uό©νB΅ϊ'X,½„λj7ΰφ.¬lΒ―wαζ&,Υ4l”αFE…₯§θσϊ|Ž>Ο`΅ψ6ώRExΦa©ˆξ―`coͺάlΐ­¬7ΰ^6vΰΒάΤΊΆλŸhšΆ°¬=nΙΌ7vœΐϋPΤ9BώΨρ‘ΈΧΡϋ’ΐ³ŸΘi>QΎhε ¦‘Υ—EeSWΊΑwό5IΛc©8_·΄ˆ5jϋΨTώ¨5΅:Γ~»Ε«&5z⻎%6—hλΝ ωŸgv3Φ^bΗΞ―Θ’΅V¦R"Π―xϋ$Δ >ae9q³>l<@'=ώpͺ‹Λ»%Mβ=ƒΕγα€'rμΑK“³Nm'°ΉΏ”Έυ€ήZ;S? νUώ­σ˜LG%‡pUθ”:,‘,-‘,‘οΎTx€y+RaMQΰwJ”Me¨=Υ<.€Λσiι=κšDZ›ž8sΜ ‹“φ2Ž6+Ό‘GΙ7b‰Œ†-u–ΛF€’bpή‹δ ή δ‡λF «|™Dgτ±P7h€τΡιϋ-"( ™tA“yλ‘άd`ΫΞ©=7ŸκIγA…gίu:ΐσw¬«‘x³8ԐΧ±ˆ₯J±Ί΅WάRamg·\«6Ϊ[Ϋ%X–*{*όs±^-W·PΚΪ©«₯βΊ_•«εWΕ ά«ξΰ4Y­E‹Fm―^BXΎVλ•βΞήEΦΕυJό qΧΆΥΊZέEΛJΉͺ"Ρ"ΈΠ₯ZΎTaπs}―’βΜ©–ΚΕJω[5^6Tͺ\;ΎPjLηMΛ0›Rƒέΐβ‹Lϊdi-βωW­\β± £BT0’ΟhCΘRΑ _eͺΘ. ―|e[q„‘IΜMjβόd΄ψ£s¦δΠsmΎ2t4),QW\ZΊ}8ΐ{€° „#A•%ί} #½ΎF±LO„κfεΒ)Ο…giVΚjd4F—F–©}cDdIλ~i”™všt؁_έλ ]2–H,£’I“.‡4Se^$G&Δa0ό€†ξλ—#°£{:]hš6΄Αiπ3ς$}`ωTκš`Šΐi8MΛm,ΣBΗ¨K2hv!"hC`y€βκ‡OΨ·Χ³fδPΡ*iy9\5ΪBa±iδΠΈ…’φ˜χq4ΈΓ“«|Oζpεjφ’Ž4U΅’Π•ΤwA[{ =i:΅–6°gβ "Σ0§²—Y d9ΓLή’™<ϋ¦%kG‡«γ8<gϊ€bΌŸΣ΄9$ Jγ䘣 ŒΌqΪΗMΡbΰε§9ᐩχ:η2κ|,a­~?#(&”_ΤVNV…έ`Ον8?"g‚(š@φe žΏM%ψCπŒ.βωb“›^ΏKgH…3yFZFŸΒΪΜό|S›Wpe‘|ߚu-Ξ―#ω^‘mp^BγΒΒΪ†3νΫL Í#F‡rΜ³ Ψ<Βp4 ”Ηœ΄†#Ώ—™Κ©{·“˜Βaΰηƒr †R˜UI{3FŽ=΄NFΗΩλoΑDΘ—ΑΟb―pΟ9^½ΚmWΖΣεΧ8$ηžΓ^OA0ρŒ=ρχη$\K(RΛvϊ6χβ ’v wb9MΙ―ΎxώiЍαΐ.­­ΑυαΡ ―I¦JΌbΔa&zέάq,vD'Š2οgΔ…o0ͺN©rχyLπnˆ₯Θθ+_αϋά!– ¦%ώsΤ‚‘ρΧP ₯!8^Ύ73)ΧR"+zH˜§ίYΕα#zʟ{ί?ΩΞυίŒ:ΒtІ™r"~ν₯|όΗγ€ψk‘ωκλœ cy°ό3Ας±ˁy¨€aΊ¬WΠublŽŒE(\ό‘‘KSΑκ3c5/ 2š.#.ΈΈYR0ψΦψwΦ ^ΎκΠΨ#k/κύKΒD-γ+ƒΰyAqcϊ1‘Μ£ξ‡˜³–²΄Lͺ<aρœώY&Μ g·WŒE Κό<ΞΰI½šx5°ηπγ€2ΐ’DDπΘH£­άλFΰΪ EY±ΐwƒ0€sΊτz)1SίΞ:ΔΪ3xA:-έiΘ½+Χη^’ΎζΛe-WNΫΡΈΧ―0€ΞKθ½.ξΩέαΟ}[ΥΗ2 ΥT'ŸΞd?kŠ«]Ε =Ύ΅|Λ OΖ΄Y.%ƒοI΄[πyΪ@4‘σL~ ?ΊΝuΚ·›;₯σ ΤD«„UαUEΰFήβ+zγd›·9ΦΎK#χ­"·}Ή‹ Ž Zbυž!ZΣΐτMά —%ε“i¨KHίΪ¨‹ΉιZΥO3΄½ΪΎΒρ°;|‡omˆqΆmJ_ϋ9N}ώmk T΅δ™αχUυ3z«6°*Km²*YQΆj”[;ΤΉέjβίΆ"τ’‘YY8 S=ΛV!z?*›TξFύήXκή»”αηc{•€€ΏmŸ ίΫΆu€=¬¨z™“1O’‘j΅ξzͺZφh—–Y•’9jξ™q:o‘u h΄«[χp/;Ήξq@ΥβΠ+Ϊ^Ηϊ’Atšΐe―ΫοΫΜh18΅1ZoΑs0Zθ’‡$Ύ”±ΎΨ™½3#@“π΄;ˆ(‘« cΊbIΪx Άί©$ς{΄6OȜV\~Ά? κEΕΏ6§_DhΎ<Ύ,Gx¬$άθibΘΐ!Σ{_kS&Άψ.Κq΄ΓžΦβΏ/FGžuƒ‹Υθ΅σvŒύτR8H°kc,}Ρ?Η#ηlZpŸvΒxΣ– 04"!šο*ΣPi)I³aιΊξŒ‡!O:œήΘ·N:?:ΖΈ?±HŒ ;Ξ(β3$.iL‘w)i*o QœY―ͺΌJΞ’ xIζΒyKœΩ{η―ρ§7·Ω σΡLΚΊ€ΧΘζHCΨEρŸLŠ+,nώyor[}haχ»OΒ"κρ9 ώWjζT;½£«ϋ5l}Z3¬fώEΝ|§fτα3U½yJava Server Page (JSP)jsp text.html.jsp―xΪέV[oΣ0nΪ]a<ΐ!ΤAΆU(α~΄)πΐ3UnbΪ°Φ޳ -{εwγΆ9Ή8vΪ•IHσ‹ψσΉ|η;Nφ‹±—Ώ‘d0EμξJ–ƒˆ#Ζaϋ†”TρθMΙ9|;=:bΒνα„zΗφΟ(l€F±t`έ²L6φΣ9Œ‰ΗcΔJlH0_‚ρ™ΩfΡϋˆsdϋΓN°μΎYtΉσΆΒy4³4 ’d37ΪpOŸ€™ϋι|ŒŸRζΫ”1SexεXFA?:ΗY ˆ(§ IφŒ8gΑ0ζ‹Z%γ³ΡƒΕC9…3Δ)³Q#’Υ jb‡υ•ŒD$ddρ( ΅Œ΄*4Μ­_΅›’蚣~ΟύΪ)KNίMηΤΕ―˜rμΫ>‡“zαU¨2WΚ_§=ΧSd xcĐDž pδ‘°Pωϊ<"±^1Γ›ΗNιB1»OΕ‘χ‘Η‚O0w’Ε |2,tM Όρ±7ξfQ;δΘt2 M)yεΔΡ(Ώδkn<bίτ§$ε}ΙΩm»€sΤo―•Mb:‰{žΈe[;bK‰8_zn[‰Έ(WΫHΑ}G‚ίQ˜y’ΨθεδŒωt’UεηΌu‘‘Δ%ΥΞW­R`«ž„ζuP§N;ΕΌW%¬TΔO)2'JŒtMΡ–ΥωΦξ}ο_%9«“}kJš‘ŸTmΊ3€»•ΞŸρySΘEΡUΩv—ρAfΊ¦e­ρ;§‹ͺ lowercase_id!(?:[_$]*\p{Ll}[\p{Ll}\p{N}_$]*\b) pexponent(?:[pP]{{exponent}}) primitives1(?:boolean|byte|char|short|int|float|long|double)storage_modifiersj(?:public|private|protected|static|final|native|synchronized|strictfp|abstract|transient|default|volatile) uppercase_id!(?:[_$]*\p{Lu}[\p{Lu}\p{N}_$]*\b)&xΪέ= cΕΥk'δ"$ vG²#%α(mΫ-εJ‘‘PΛΈ+im/‘w•]ɎΙz_΄ά΄΄τ€ή΄Πγ?}?δ›έσνΜμ‘΅“"ˆΗ½™yσζ½7ο½Ήώkğ»pzΤt\gΜοY^ΝmΎl΅z΅ήjך;}Δ?'ΔŽγφ̞ν:5ΣσΜ՚νΨ=ΫμΨ―D™¬ψN¨Š·­y³ίι±Γ8=€*Ρ5=sΙBϋ¬Π¦…ΐB›q:ͺ*R’ζYσ–g9-Ž&7αt―’ ‡Ψ–TPŠΞV:³ΊδφύZ«cϊΎεΧL§]s¬ΦΖ6œξ Fγ‚Θ ?&Ϋ³ΑSΔvΰτ6ήχνgΙrΈ±»YΪΫρZ³γΆ.3Н8½Cj]νYN›£β-€)Ί»€,ΧrΫVŒβΥV§ίζΖs7NχKaο|ί±|O&pŠΟ­8=&€·-„Ύσ™xΑ ‡ljρμs›”τ–Σ_‚τά Zγ!έφ*Ό=β}G ΰ½πNœ―v]‘ΓEŠ₯‹:ΕzΙpΩ—·$EnΏt ζm«ΣΛ!Q_tΫ¬‘»€ϊΑ^ βΘ/Rκ@ŽB±ƒRα‚…X#wKυ«ν,Zžέ³ΪΌR–©’Cζ.[«+ΧF:ΓuzžΫaπ‡³ΑΣξά“ žςΒH6ψϋŽe·G Οπ†άΓuΜ₯fΫ § —Σ‡G₯ΪΓFWρ1©Άˆω‰ς²Ϋ‚*ύ8Π3| 5¦ƒ’δ=!U˜Kn»ί±7V€37΅Ϋˆ©lΔώ+P•c`Pγ:(Šη`Ÿ σf8!Ε³GΘ₯₯N™J!Vπ{^Ώ%ΞM΅ΜE(nυΜE(—ž’JvЍ–@Χl]6,™hŸΙX€φδތh?ξ“œDξ²Œ‘SβΒFt&_~ŒηΈ©Wρ"No °—F€Ύ%­±§I f€baѐBπΒ?‹Sβθ‡sωξ%XšΞOb5ιAΘoγt…Œ]AͺtΐD\EΦΔι λ₯X όΥBΌT[6™·€κΤ9•€L§ΔBo»h’΄BνjjfHx Š9Ÿb¨=κ"€Π1΅ƒGJ,βt(Α:ε·\6Π6 0π ΨΛ`D#°˜Ί1 %e GΙi:Σ[θσΘvpΊWάtϋί/β  άθx§ΗdπX¦jKh°»Ψ– h(”ež ο‚Ω@§“Ύ’«Α-َΩs)ΈTέιX ˆ™‰£Gΰ|0B.d‘ιz€§dΜμ ΄ξ>Π¦€„o-Ω-·Γ(± 4˜€΅Œ‹ŸjVpΊ“E枠O―Ά$0X ΨͺlΎο΄ψzΉξΰ]©1L€yΫ+v§έ2=*9k8%†KFΣξUœŽe+,ŽΧΰ8ΘΜ΄οέ 9껀j0AΰΎΖ“-˜ο„„ϊN· @τλ‚9‰7ι„Sbπ‹ΪλΗ@6’1 ωXOδ~o fy.Ϊ@@~4эγΆΧT%πη@c$E•ώ œΑ'•Μ@ƒι]ˆ7qzH Xς-@I”€Ύ $‹ηxΖwp:"`ς.r­Ύμ„,χ> ₯α/!βl.Žθ―€`ΰΈωϊΐH‰°ό5NwP@θΨόπΏh}¦λΩKΘL_ΆΔΎύ§Ϋ)˜Ϋsyλςw`.§E@€!ΰ€Υ‡ΣA;‹­–εϋΘΎAƁ ν;T 4=©ύ1ΰ=Ύ―δωG ‰<λJίφ,‰χ'0¨‰θό³0i•°².βCΚό5QΉλ…¬…tJ€yθ˜ π<jμ?2Ύψ»Fd±O«γ˜ωϊ8έ%~ όΓ]#‰(ΠOΓΗ‘$ςνg@JQ=–Χ2}^ωRΰα”8½}_ΝΡs/rMλ?8ύ―! CP˜θΌ}ˆ—Z™ž<_励uεZ°ρη -{ΆYeΥF3¨ ΏfζŽΝŽ7ΊΧžμ―ΝΔ ϊωτZ”Ϋ¬Vi;CΓ\{|z'λm6;V½c: }ΔPυ—Νe–"ΓG¬ΎΊΫCFΚ =3†Xuˆf†zΤ³¨2%Y.πtγΏx`Jά‘^™Ύž‘Š[Φ η°’νηωOœξζqbΘΤqά+sϋΞ1v–αρΐγlςIEε&‚WƒŽμΡ€ϋV‹΄‚΄Ky{q+¬WΔ1Œ;βΔ.yͺ Ό2™ΞΨϋ cΣήI9{§Ψ€#ΝM2u¦ή)QdŒΉYŘ_Νΐ²ΑΚ’_6ρΫC̜\«Ξ¦0EZϋC@―GΜ5{‹©Ό!`5Κ”ΥUX#t]‚Ž›ΐ ‘c°I†ύGŠ^=zu»Bϊ6€¨%1ZzQc“UΤd‘¦ £GMVφΐ½!ߟ€Κ4Œ@Χ‘’β˜%-Χ(Ϊ0UͺYb‡QΆpmaΒ՘IŸ½ΏnH»y-k7ΡdΥ΄lGίΝgŒ“α~ ™Bσύ|v 7ιjΠX Nfœ|†e’Οψ‘yα±[ΰ³ΠR.ΘOk€ηGt„Žη!ˆύ‹:a‹±Η‘Λ‚˜ž„zOΔ»:υΘΥaMΘΈαΥ¬άp Ωδqt"›ψ¨7³Μ ΩbK΄D"E’A J§1~JgK±υ½:©\D+όΝ‡Λ3υΆΫo†‘'4μ‹ TδτqŒ$ύ8}x|J’ΒΟ~€°Υ—Λv(Α„CΤS0Χά΄–Z0 NkΫΨ0Μ[ƒ&£Θ‘+p:^`ΈT¦—ν;T²ύ1—~£S¬7γΠ χX*…ΉωV…ώ*τ?LQYŸ½‰n}Θ Φρ†"ӌ|@B $BdD/@ƒTV[]WΗfE—ψ‚Q):›!&θέΫtΟ–%τ z«υpAŠ’Μ·x+Z'¦΄–°ωŸ%y³HŒυ dSwRb€5?―Θ@*γΓΪ†‰g“pϋΙ’!2—QΘΐφ/Γ`Eζ(δajq…hνϋƒFFβκ88/?Rδ_Uδ―₯ΰ(΅ψή ΑΧ+FQ%0žώΨzp<ΒΕƒ―ιδ-ΆσΝ ΌσZIw^ο)ƒν†€XΙβcC.ƒ<8€jήF©XOνuΉλΤ4= +ύ]°4Βέ‡^¦θŒΠSM„Yhλ,ωeLΫλj-«ωαΪΎ¦#y"4“ίΝ ±jrUΖΙφ”:]@ΦFP³ς΄¦5ΡνŸΜΖΛά>”[];7›3Ύ"‘qώαςX_%ΔίW©ΘΣϋdέͺ΅ΜNηΊ»•}E`πλ ί…xΟˍ¨ T#!ΦTζΆ³ŒΑν:ތV_²‘Έ; lΓ] 5—'•μ‘$ΔγI~~9Zˆg΄ŽOΨΐλzόuC‰ΗΙπΒΓ; ί²¬°=Zl„& 9‰h4šαώFή.Q'Ϋ%Έ©(ϊμ εγ°ΐ†‹Ψ₯šm“D³ύL’χ IήΟ!5ςΫ³*vϊ@‘hqL’uθF0Χ£Ϋ„7T©fŒΊjΖHSΓΉΉi½VnN©zm‹ΓόΈpqH6™¨ )έ Ιϊσξϋ ΕCb‹ρN;nωΖ+‘,Ά¨Α·.γ‘ϋxDΩ8 QψαQ¨Έ^Άt:±VΦO ”·Κυ^V0Θ­°ύŒυŸLu).₯ΠζΠμ’x[γ eΏ™΄Vžˆp¦°δ Ώ”ΖYYΨkΞN~€Θ_Uδ«‚‰―(ς³)Ω’M¨υ+}Εγπš§ΐzjV;’‹fpλΈ =»ύ3~‘“”Ώλ‰ί~ΐv‘[²› ΈρΨ΅‹χψ^χ½©Z9‹μ¨θπ£DΩψCŽψnίγfζ!#ν#λΑ”‘S99λΠβΙI6λ#™JΡCO”AKe;Ο,ˆΐΫ9PDsοΰ.›Ό―•Aތ½“-^Lν1υΔλ•ιΡF½ZNΏίRυϋβη»ίFύήR†8% gXRz[* η§μ„„6ά\†δΦΫΆΉδ¦EΔΆςξ—7\Žίέ@9ήx-υ~½SΕ~«ΘeŽΊεΛ”£=†‚ Κ©<#b4šψŒ GŽΰ”μ\ΰ‰%2¬†σ`%7J^ΞέT&·DŸΜώ1|e§΄8?T:ΞγL~S7$4όq4ΓiB~“ Ι'•‡2Ί#²3›%¨n‘δ}M’·U’χ€Q΄;[©œ9Φ “±Γ@Ζβd²ΎΘf“m’ΌοΖ‘ŸrŸ“­Ηηa2Ϊᙐ…θρ ²>™X%‰Ξzh–ν s;e€Έz­=’A›lO“L¨Ό„£‚EΞΆ¨<ΏηrG-λ)ybS@Ιj˜œΔ +3ΑΨKγ§&j³Ι αθd΅Z䬞’ψ}Ζ a3άο9}Ά‹‚Kv+θzφ²Ω³‚πh="€Υβ°g€T Ω 3<•ψ«N Ε:ϋ•΅½ωn`6ΓƒΧ­^€~:Ύππ,»T²cUΤTΣu;–ιΝUΤPkΡτ…i˜οΈf/θΈΞBΗ»ͺ¨¬έ’Yb@]±‹οs‚”Wϊϊυ#N ι`yσˆ{ƒpsu± ΓύλQeγzΣπ'ͺγ¨ΉΈSθ—‡ͺӚ©¦ŸIήlΞOY Ν΅§^₯₯w¦iι,ˆξPΤρMEΎκμλeE~K‘7EώWωQδ¬Θ#ίqΉ_§RqNž–ž#ΖηΪ²y‰Cp2†ΌE’χͺ€w>Ζš?ͺi^v~M†Α.ΉœqwdP&i1qΩ‘<ρ„pf9½Ÿ²Ι(”€Q§ͺ[‘f€&]„¬ΓΪ]‘YψmsŠ< 4aаρΠt•κΑj†9CC’qΰYYα¬° Ή—ς‚$ο[)δσyΆPRχ—²ξ5’a4_FƒŒιΜΊσŠό*ς‘ΘZ‘=EώOωΚ©ΛΏ«ΘΆ"Γ΄ά’"0?Š|ΥjύS9q$ξ)΅Rβν6”)ΞνŸjŒ7ΖOtΨFώ`΅ΤνΕ>nž#·‚;|4 ΩΤΰ-hρM ο"η€U„ΫcΘFηΤ©2ΫΈΥΘΑ-Ϋxβό!η‘ηυ­`ήμψVΰτ;ΙάDOΌ q£Ώ‡«mΡφ΄¦my’Šδ7q’žΉϊΒ,šD―žέ12rtδτΥ3υ“ΡΟ38ι_jψ7’ƒ2F‚π·ξT6τŽζΠ”»8ΣXœ›Ÿ¨†Ή#Π‹‘L‡Ω3έ‹³3΅‰Ωiži΄)‚i4GΠΟ lŠϋw‚τ!κϊ& ΙΞ€ΜŽ*ŒνΠΑC³^΄²y―υEλͺ‰Μ:{Ɍ·τνJ…€§τ|Jj…υΑƒ‘dŸάΈNΚ‡e6(³”‘οZ"x o*ΠΪ–eΆ(³­@™νΚμ(PζζΒίY ΅[ ”ΩU Μξψ--βbX]5š‚hΖJύ …?Tc‘C?,œΤ’4ώ юΎic°6kΗ€m َ*Mθ1A/ΔzΜzT―:*3ν σΝF΅Ξ„βf‚  υJhqό]όU¬ CJΔ„ˆϊ—Τ‚BύΉ»²#±ΧU‘]x«BfaŠαΒβQ†ϊΛRζz)>Ά#σ΄n­—ŠΨΝy μ,Μ7²ΎΫS Μ­yIΗ”κqƒ3›#c ψΜι3³θ‘χΚLηI$ιΜΤ<¦σ0š±€",Ι€=Ι‘6&λD5˜9]{pnv""kP‰ζ¨ }¦ΡΧmυeoRPΆš²¬¦λEΣ"ΣSŽqΨOΗA0 4?žFsŸ‡K΄rt†ϋ\·mB·ώ₯l™Λu^+ΧU…­ΣrΫή2h' ϊ8})\υυΗ+ψΚ£ΉYξξ£6ϊs-dŽζ_ΓήΈUΧ*ή_5' }Έ.βΟœ”+φ’…²Υ=ΐ¦G^dψ^–δ="Ι{G¨ι ₯ΰ ΧΧ«δA‡Sόy€o?ŸdΓ}P6άτiό(^Ԋ,ٝŸλ8*ί¦•›-W±iyuI₯Υ£ΧAx5Γ"γC=3(²cΠN°Ί[’9~³ΗΨέg8ΡγˆoΡΞ<5ςω|ίH=ύ<ι—Y«Π< BsπYΗαυ&δb1Αu8άvHEœΧrG@ςaŠδhΌσ4Ή‘–5¨f‘aΒAΪ ƒ΅,πp, ŒΩ†yšΩN”Θ2Eτ¨$οίΝAǝ2Q:«½—;3=ΐ½A©7Ε£D)6¦ƒ³ΠNΘ,βMΊ ȍϊ.¦ο£ ­eΉσΙˆ€b%`­Το=>˜ššš¦zτM»η/Ϊσ‰Ή‹„O+““Αθdp~2˜B?§Toϊα/δ.#ƒάφ YY΅Δi4jZИhL$nςNΤf;-/~%ωρo°Ϊέ¬ZTiΠ§‚γN©!‘_DS™œ$ˆŽccAύWMꎻ`·πͺ¬ͺWƒΖKΑX¦ͺΠ°¬ΨΎ₯βšpLόϊ$Αi*ͺ•¨L7ΐΒϊM™₯—L‡gRZΨΛ’Ρ βΙe|hpXW[V7ή +^Ξ.“κΓ2,ž­btVYkc©­α"pΌΨa枷šn.±ϊzήͺχΆ€;³Μβ ΖΥ‘(šIVπmδϊ†F ω€4=ΛΌΜΪΉGΧN i³“-‚΅Ύ•N ¨6Ύ/Φ³z}ΟΙH„X₯IΡΘ…beμh «bλFφΌϊ ©₯νΘΡGŠΔN(xΆͺ`u|K=aΘj K¨iζ―Ψ‚„ΘPc\Fcψp>Γ*ύ)Ήy£’‘JαΩ¨΄έtΖλΈniΚΪΚ’έ±ΤR>οr‘ΨCΊΊdgμaΞŽQ#RlSτ―Τ7©MAΕ+X™’‹ν΅ζζQΨΨΊ_“_ςΎ‡cσ„RήΒMΏš?χž¦Ψ…Φ|£RoDkωΪg}kSιΛ†?H’" ,wž Λν kαwŠό_+ς―)ςͺΘΟ{YuΤλοŠ|ψ„κb}έnειΚ?Ζ,ΧE/1 χ%Ίtο€DFψ3§T(Ή«ΘΣߌ. Σ»t˜ŠΨ ͺ TR0f(Ψΰ3EώγRUξή’*€ ―9k-τ<β!<ŸΎ¨šνΖ2#ΛuhΗ33ΟZ*‡(αΫLKεfYwŽE8;}ί彦ΰOT§Ι³ι›Ζ%yyڐ«ψ+ep­p±"ΏFmfb†ρk€ϋΆ[ŸdD΅%y‹~Μj ΗΜW[mBγ¬Ύι_₯6ΝΌ+ΟΊ·=ΛWΉBλ\―υώ$4Ζ,ώΎΟ7tXΧPͺοεΏ%yο)zΩυάe49dν%gΘφ-ύ^’χRƒ>{Ά@FΏͺ$ΟJ“1N某ΙqFι›ω‡ΈΞ5δδžš’πr€ε9y. cD‚Vμj"ΑpǜLΎN S”Ν+ΉͺρfΰΖL5ο–4^β·ενΠ“΅υˆQ”W2/ok°JΓͺό{χJvRkYE½ψ›εΌ° …αR)½ž|ρhι|± ΄§UHΎ#’τ±Iz?˜ ιZ―NΔύJ7²/HςΔΝ‡υ%³_ hΜ <ΑpO°+ šΈ3oΩΘώΈφάO7;γFΨΧK΄!―žΛΈαŒ$ο^#ŽBˆyΡJSΗτ²ΖΉT—xΏΙ#BΓζυπΏΤεεΘΑn'—WΛ ™ͺ€!υ‘τܜ²^1€ϋ’mθ…tƒ|€Η§ξ=>•ςζ•©9Πΰ6^Ώ%}ΊRqΜE b‹ύίTΏ›όI^©οβˆLσ‘ΑV” <T¬ΑΔ.έƒ’φΨή\ 7L– υΚ•z3ƒx„Π¨τ7LρiQަΓ4™ϋ¦g•5χ…υγάr―΄{ΠȁΚΊ±v­~±tΪ;”£7π2ζάOβ¦5₯•οηβΪΡVώΫKlS“·›ωLyW―"—δ»uDζ¬!mθDι Λ#›ςή;©χ3X+Ϋ±ΰαBτFμ₯‡B£ 11bDΛo™]k½&HΙΞΣλΌ$ΟΚCCΕ!…ψ•@υ‚ Ύ((ΓsR’—λ(’@γ½ΌrΊtιρ Α₯ggž||Ά$οΠZ)―κ£<ϊَΗμ…œΫIcF˜YΔ%cύ¬eΕ /Θ£Sλτψ`ΌΙwβI¬Javadoctext.html.javadocid(?:[\p{L}_$][\p{L}\p{N}_$]*)javadoc_block_tag_terminator(?=^\s*\*?\s*@)NxΪέYέoΫ6—β|τ#]—6iΪ¦νΠyX%·VΆ΅OΩη‘Ψ^ŠΎδ±ξ Zb-²$P΄“"2φ―’uIK2νΈΙ0!0mκΗγέοξΘ#σB›<ίgmωί³·):iχ ²Ο0mχ‘‡|ΫυOz?55ρωVιSμΣ¨ΐιυΈŸ·Rϋpzά[ΐ­Φγήn-kχάίh„œΐn»Ύηϊ)œIλYϋHΒ€g)iκc―@odν¦€ Χ/0·ͺ19A·³φ;Cπ1&Ψ·1S•ΣΆ}'k·Κ‡ΐ»3€Ή"› ½TQx{O2»Χ‹("^“΅O³Ά:Τ`Δ}‰#paSr0蝑p’”΄%Ή |άχ{βΉ>Š0 Hν:WΰaΦξJΘΒ‚ΰν¬}^ §˜ \Ρ€ΐ i’ψlJζΣb\6%e!Mx>–& AƒTDϊ 3υϊD ΐ4 _ΒάΪ§ §¦”w»2@ h€?“’"ΒΚ²¨hJδΎΠΚ]Σe σ•EXŽΊc] „"gΓΠ"θάΚΌ0λ›rάjπ2y,i ­RiξρFηχΏΊQ«Ϋκ°ΟCsΚ€z) )’ ’Κ€m‰L£Ϋ2©lŠBC]—‚φGˆ₯‘oΣ!’nΰ[>v}7ύjƒσtN71OjIX«σkάτ|–Vύά€'t)aX>"«Hž—*G­V˜ΌSΡ/„ςjαΨΧΪtξ,ιSψΔtΝ|]́ʐψΏς’Χ n»γ Ηΐ˜Β,]ο-6ϋ0ω9‰ΖLˆŠ/¨uJΟ½ΰ\0΄Ϋڟ +(ΠRΛμ;0B-78ΎZϋσF² ΫΚΛHΎΊ΄΄gρ4τL’ΰ·’.χ€ΞiΕ‡ς¦Vϋ\QIs>%Wͺ³FMΐΜ­BΞδΗ8υPŽŸκ^5xšN½”ΞK…5€jzu7Ca)oP’]6]ιΦ²²qyˆ[©pτ£λ’.αΥ6―mU6‘ͺۚCϋu'γΠLλΜn¦—œα/ηq¬€žb"-‰ι|§X°Ά€ fΤJϊžhe1ΕlajaΙ+KΨ€΄γΉ`Ηna‡AOIpΕψΒΖa2‹Y˜ΥR0k2ό-Ϋ,Ϋζ,F8ŠΩΡeδ:8βΜz§`V2Ά6 ΟθrL‡Δl#Š ιi@β&›5Ž\vβŠQθ~ (ŽέA蝃τϋQˆm3ΞΠΓžΖ&.JήαbΟ‰ί#ŠΜΗZS΅ε“€Χ$Κ>χ%ΤΣUKαŽvΥp,gOH„ν΄ε”εJ=υZfσΖ₯i$‘Σ9HhbΟe§~δ™I+όγIqWζŽ|£¦wŸΈΎ\€‚Œ· •ή#±4ΜτQ―WΒΆ•ΧTcIΖH =v£’ζΕ΅pd(pΔ—ŽW'¦QBΜvIίnIί3ΐϋ"#δ ρuρ¦RZ€ -ΈEβD’φ¦ςeg‚ ΆΣΜ―ζu6Ηκώu’o[ eG€Ευ™6.}Ψ¦16—v}υΐ—lΔό;Fc‘½*ΏΫˆZ(σέΖ΄τΙ£~ώ„ΝjΏΛ.ΘΈ3ySOj.χ©V•Ά·JϊΰΒIπΆΆ`%³{τZ—€#Δκ°Ύ‡­όVΎ~λŸ’ \ѝ—ϋfz ~)ά`.ι¦v±πϊΌsΐώ>uΓΛγήŸ'_ΨΗΗδWΛμZf«ξ={Χ¬{ovβΪχΛΉ}Ί«-₯ž,›b―,όξΜ1mιέ+χ>½ϊνsΩmέwd*λ§ύ UJava Properties propertiessource.java-propsΤxڍT]OΒ0έDε#Ζ¨j|°FdΡΔ'βΰq€Ž θpνˆΔψߝлu₯φεlνν9·§χΆeνΖ™Δ6f/1eγ'Η*ŽλBΜ*ŽV$›ή/’GΫ/ŒΡyάQuά3ΔΥ$žJo³ƒΥc‰υl•  X>‘Ψ”ψ†Γ9_`>s4VΰQΉ³!rs΄ωsm}爣I·4nA‘μΑVο―qοο[JΌmU#υBο$rS6υφ™D‚L•Ψ–θΆθΓΦεΐ7Ώ?€μόHX(,hΔ ) bin_digit[01_]binding_pattern_lookahead(?:{{identifier}}|\[|\{) block_comment$(?:/\*{{block_comment_contents}}\*/)block_comment_contents(?:(?:[^*]|\*(?!/))*)class_element_name5(?x: \*? {{property_name}} | \#{{identifier}} )constant_identifier7(?:[[:upper:]]{{identifier_part}}*{{identifier_break}}) dec_digit[0-9_] dec_exponent'(?:[Ee](?:[-+]|(?![-+])){{dec_digit}}*) dec_integer(?:0|[1-9]{{dec_digit}}*)dollar_identifier0(?:(\$){{identifier_part}}*{{identifier_break}})dollar_only_identifier(?:\${{identifier_break}}) dot_accessorG(?x: # Match . and .?, but not .?( or .?[ \. (?! \? [\[(] ) \?? )either_func_lookahead/(?:{{func_lookahead}}|{{arrow_func_lookahead}})func_lookaheadW(?x: \s* (?:async{{identifier_break}}{{nothing}})? function{{identifier_break}} ) hex_digit[\h_] identifier@(?:{{identifier_start}}{{identifier_part}}*{{identifier_break}})identifier_break(?!{{identifier_part}})identifier_escape(?:\\u(?:\h{4}|\{\h+\}))identifier_partQ(?:[_$\p{L}\p{Nl}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{200C}\x{200D}]|{{identifier_escape}})identifier_start)(?:[_$\p{L}\p{Nl}]|{{identifier_escape}})left_expression_end_lookahead(?!\s*[.\[\(])line_continuation_lookahead{(?x:(?= \s* (?! \+\+ | -- ) (?= != | [-+*/%><=&|^\[(;,.:?] | (?:in|instanceof){{identifier_break}} ) ))line_ending_ahead2(?={{nothing}}(?:/\*{{block_comment_contents}})?$)method_lookahead`(?x:(?= (?: get|set|async ){{identifier_break}}(?!\s*:) | \* | {{property_name}} \s* \( ))non_reserved_identifier'(?:(?!{{reserved_word}}){{identifier}})nothing(?x:(?:\s+|{{block_comment}})*) oct_digit[0-7_] property_nameP(?x: {{identifier}} | '(?:[^\\']|\\.)*' | "(?:[^\\"]|\\.)*" | \[ .* \] ) reserved_word(?x: break|case|catch|class|const|continue|debugger|default|delete|do|else| export|extends|finally|for|function|if|import|in|instanceof|new|return| super|switch|this|throw|try|typeof|var|void|while|with|yield| enum| null|true|false ){{identifier_break}}O/xΪν} €Guθ¬$_ς}Ÿ˜‘dK;+ΟθΐΨXφj±ε΅θŠ%πΞjέ;Σ»ΫROχΈ»G»k·Α †$@.rBr‘Γ@w‚ω?„@“„œ$!yU]U]USΥΗμτj―±5΅SύͺϊΥ«W―^½zυκͺώ\%₯-†γ:†ησUΫ LΟ°'vήX?η ΐ“ΆΫ8‘ K @ ·Υ2ΐαΦ%Γν’pλ“αvSΈ $½^†kw³Ym{nΫτ‚ωͺc΄Μ‹3HΊ]*εψΧiWt›σUsm6‚jΓ6|Ώ:iN[N\Ε™$½TWE zIΛhΣlΈžή―ρLί·\§j:ΝΈάΩ$½L(G²I“λ€sHz₯ λzΌ €ŠMκJ”8DόΐLDk₯sIz‰PnΚ2ν¦Dβσ YWŸ―μΒ) P³iψ+ι‚<₯Ψ».$ιb©ŽΣΐ$¦¦Μχl5tΓ°νͺαMw$Ώ˜€ΫΤΕ γmzύέ†?Z& 88₯Ψuκ▍3lλ“c1Κ…·¨Λ°ΧT'- Ž3]ΖzӌΈ΅γA^\eΈ[³ΦζNž@<©©ŽJ™k…κ¬αMœ@ƒ ŽW”TJ(Sž–X9Έ"ιV±3cz’Ρ Χ•ΎZΙDtΒΰA¨ΒjΫ0ŒβbΧδ*ΖΈφZ%׊Εβ—\—šΥύ,₯ƒξqε!}}*(«υΩΚΡΥŒΙu^Y™$°˜ιψ»b°M‰`μ½›•r ƒ3¦ƒ¦Ιυi\ύ₯ψd³‡Ρh@‰ό†Lΰ +YfEΰž9 ¨Δ•nM‚bumSΆΠο΄1·Ÿ2<˘΄M$ϊ|Χζ:oP9HΊΚ™–ͺδ(Δ0RJfM!φͺνyJ±wέ”§SͺyJ=‡–ͺε)u3-΅#O©ηR;σ”Ί…–Ϊ•§Τ­΄Τξ<₯žGK='O©Ϋh©›s0ληζxΥnΖP·δ)ΕκΦ<₯†ΟΛSŠ1ΤmyJ1†Ϊ“§c¨Ϋσ”b uGžRŒ‘†σ”b ΅7O)ΖP#9Šώω9 1Ίί™£#ϋ]9 1ͺοΛQˆύξ…ΝGsb$Ώ'[!ΗmrΣΟ½9 ±Αψ‚…ΨXܟ£γˆJσITˆgš_$©*š:lΛͺΛMό”w•±ƒ\¦)”¬™"ιUB%σx‘¦R““”.~'&Z†εΠ§GHz{ «H/ Ώ‹€t½'˜(Π}$½&rg«ͺ΅-q”€ΧͺKε2Ξ₯EŽ%Ώ„A&Zβ~IλR—ˆWs΄ά$₯+IcΦ°ψ5 …{1I©Ύ< «hΌ /‘j„Ž6Όω*‚DΖφζ—’”š:π–>|€ω‡U@έ c$=W€ππ R—¨8Ω±μΐr¨κIΡ·L†ΣΈΤJΌ€fDδ_<’§Η„D IΦ$|%ΐρυ$=‡‡kΑ ˜”hΧ0‚ΖŒπͺ†DzΌ”€›rρΘΈΔρšIK» ˜Aƒ‚NICŠ.Z‘Ή‡MK]aK ™‘‰ƒTSΩΆ”Θσm?‘„ΰ |’€t%‡lzFΥ7Ρΰ¦`6IΟζΐψ¦·d!Ο‘h­Ϊζ)“‰‡€WĐ γ …vejQkR,£Ϊ2΅bΛ¬„ŒƒΧ―ϋ]ΤzHA|iRΡΩ(™Š ¨HO)Θ7iΡNΖwnsκ& +ΘfV" 3…R€9I΄(m₯ΞσL¦³RψGHzA<θ£Z(žeB‰›nuvƊαcPΘΗ€ρΚ ω—ΎLšΠL L^βψri°˜ΆςΧmΣ珓”Z&i>BŽ+z…${`Σ ˆQ#ξ£W’τ<Ϋ₯)Μw“τΩ"ŒΞC‹½Jβ#RΜ7[–€ν«»Q@:ή€g4XηΌF7’Iœ‚}4 ('- ς½j€ΟQοSƒπ½ϋύ’€μnύk»[―dω'ΰ<Σ`“ύλ$&VˆΧ“τJ%¨ΛU,¨)ψτ2-xŒθvw…ε‰χCέΌGΑδ·ΏAvΆqAaί(Iέ&…I©‘-š9«{5HqP Ε–ϊ7ήρ ?"qνhpΆ=/pɏJνk`έ‘ό˜$I„ τγΜ§ή‘Πo–„„ΝQθ'$i3%I͟”FzξN ŠΔO)ήεΪM?˜aΘώ΄ΔL ΒΤcM;|GΏEβsqW‡BύŒΔηšέ ώV‰Σ’€πΟJσ¦rΗ‡ΞΧώΌΣ ίFr†‚Ό¦ψs$½)C9φμ€9?λz¬3ž€Cκ˜6h•F›~!φό8x;I·f(Χ½²ϊΕ,o΅šΠ— ΑΈά/‘΄š±œ μΠJ~™€W'UΒ‰_!ιζ΄XΤΩfLέ_•¦Π”mDZμ:Ύε…ύ5Y–¨VdΏ«cmΔPΨί ι%2,κ~‘Φί$ι³dH${°z©gO’΄&Κ΄ΝIkω-a»kαg©wf/Ζ3ϋ»δY%u3οˆβο&ιŽΜΕ•mώm’ή˜Ήψwt<ά]ΦΛπ“uΨ{t‚±»€“³Α„Σ{%ΝΑ‚5^Σ‚I¦KN½}Ÿ4£’­_A|ΏΔδΒ^2ϊ€4Ϋ(φ¨)θοJ<.‚Ny.Σ?HΛ» jΨ‡€Ή“σzθο©Ax&ύ}5?ςώ@ 8…Fώ‡jh²c ƒ!ΘhσaI6'μͺ ν‘τϊτrΙώX’Lr)~~D&L·4|Š€Τz#,hώDz—m8ΣcΪTΝ4•˜Ι6§t½ώ1‰ιf=I(̟Jκ …q:­Ιϋk ’ž’PŸ” $I/’ΐ©΅™Β}Jβt: N όi’R.ή’όipιΥνΟJ¬Φ ΙTϜ²ζhΉ?“Aa όs’RM>φ^ !›ΘLΙ€ύ—±E¨.5όs$½V NΥ~όWΙoΐcšδŸ—€*§ζ0 φ΄Δλ˜Π™_ )5ύΗ ϊψ)³-›O«ψΗ φΏ&)]=΄]?€Ύν6‚Qb܈ΊαώF’ˆδΙAΑΎDsb°ΐ ζc“ψί’”ξDΞτι—₯·DOΡΚΆm›ρhϋŠ4ŠΠrΘ³ΔbΩμ4xώ; ₯εοW%.f¬U_“Έ˜Β—κλR’ 5ϊψ‰tΏMfͺoH“απ^#ώ{i((#ω’nJ/2Ω™šŠη7Iϊ¬δ‚ 6(FΊ$ιu‰…&-˜γ₯ώ‰€Χ$–irβχŸ3•8αΗ\ρ­L%ZάΖΏdj‰8Χόk¦2‘Ψ eώ-™αWˊ₯ΛΏgβψ5Ηψΰ?2½āΝ!χŸ™$N₯ίΞVfΎ5ι²αΏ€IK] –¦ΐܝφ.΄©]mŒˆηδI#.ΏxAχI λάΛ(όJSE|3V‡Kj x0·ς4`„=σ-'ΐT‹ςg-΄5'˜ΦΛr0]Sρ†QI ΐΌ}Ζ€(Σcz΅¬A9 ŠG΄:β·m™«ψ€Ψ[2œrϊ?›’φΈΐ‰ηηΤk1‹[s—θ₯tg`ήαψκ$`΄AǜΔΣjηυ±σ%Ϊθ|„eڀЍ)…”Ώp@”;ΊΒœnuΡ€8rΊŠHKγ‹ ό•:xqA|Ι€8ΠΊΐ9β^ͺƒU¨Ρ— ˆZBχΤε’’CA WH,.{‘0omJ‘A°r¨Ξšo>ά1†Y;αΗbc@V³ΨiαG}œVIχ>ΫΘήΠΑ †š±ώTCƁ“fΰΧ`†ή²Žβ²γ–*‰8žΟγˆeFO>6 MJqυIΨ}MŽ.›ΙV8©‘ι6°I;ͺ=F· =zδ¦>΄ƒΦx£Ώ&¨Πή¨ΡρH t:^χ‡λC•Α‘M;*%I¦—δtSΆ·πΧ«ψFl΅Ψ΁ώ·s@š‹)Œm9&ΠΌƒšφ‡™$TG8κ.YLޏζ)’Ž ׏VJ*Δy|mIσQ!|W_Ι3|Α㠁=υ€m ›Έ‘ή~τΐcπuΘFίόέΐ9Mτ}ώž{tχΝϋHzχcγ!ͺ’ήAί3ήόXX΄>³½ώX}ΦIGEc ι\Π{6ΘǚλΨσ@ΛUΌA€{WŒω`ύ†JˆFΪΉW&δ„―Ί‰DŠiτŽFr;π[ž΄ΌHIK0<ΗH†ώ9ܐυ‡κ΅Š0bU£φ/J 及ε7(ΚΟ*ςEή)E^§ΤC;eZ…šό§sΤ½žΨΉŽγK`‹Ή=ΛeμD"™ϋψ…Ψœb§&τXNΗ ›ζdT~ώ˜2:v)2ζ„M7D^8!Tν „Δ-/$ϋύ!μy‡t'$΄¦ΒΘ¦Zπϋ‰5Lw*£cθ™ –:¨&Xώΐ›’eHΜX>|yξlˆΈ ·…§\«b.DjZˆU1Œ ,ΰQκtl ϊS Ή±RΨ`XΡ# υ‹ε‘Ž7 ΔωaUΘ>Ϊ\ΊF³œS°kΦ,Ϋ6§ »o“qR¨Φ )Χρ$_P£μθΔζ{]ψσAφ’9θϋa€ iαΊ‘\ί^ί^ΛΥjΉ‚sΠΣryΣp9ΔŒU·νΈqοΓ[Γγυ±ΑΫoͺν'Ο aQΨ(†·U6V)τ¦’†μKT‘¦ζh­‡νiΠνTω w\°yΧ|ψΫFσ&}£Ό―ΉΘ?²†–Ι³hߏ(άλ•ϊρ6ZΛ *%Vω ] r¬±ΣŠΡ°:HnΌΠ±σΧ@“h}Ρ/šl^r4YΘ©ŒC|½‚Z‘GZ|ήS₯EDt Ρeb™°›φάN»'μ*Y°‹ͺΟbΥΙΣy… ςΞ.’Οu<Ή¨ŠXγΜvxδw#; α΄7HΟ· ΜYk‚t©ΰή)a~c:ζ-£έŽdgβTtΏ‰ώ±]‰79‘Rc^KqίΐΛΦ6šήΛγϊΥXP¬hM2¬…ΫΒΝ’ J΅}J‘χnEήηyΏSΚ! „Ι“;#«Ύ’Θ 3qή­‘ε§η‚>Ν{­ΒυFύ'qQA+΄°ˆΊyDΰΩρθ« Ž‹ω:ΎI‘χ‘RFΝ@₯Βό"οՊΌηa}‘uŽDEσ}WΏR‡;o”ύϊt­“λψˆ&i©œZs§’’ζρ₯Έ%°^D0ϊ<΄@₯œŠΚϊ υGiUC Ӑ[ί^Ϋ΅£\μ–IΡT) Χ–4ΔωΊΤŽΛ…%Ό$^ΎP??ίνxX稙­I³Ω4›‘Ε™)6yΥΨΑΜ-ξΫVΘ‚ΦΈZΆX© Ψτ/½Υi_¬μœΨΓ‚ωrtΤΙΥΒ ¦ΗςΆ^ΰέτŒΌ‹Oߜ½?³tΪVυ:«ΘfμEξe―ΧΌhxoEg2 [0\·$ˆΌπ™PιΩΓ–ύ‹kX(œ#„ΏΏhE/Ώ{δΧκ#•‘ϊ`ϊΞρCŠΌ·*ς&yOΛ•λTύδιθ"q:Š|πU ]ʍM[­ωŽ?.s3]Š3>.MύEΗξ¬>hTΩY½mΥ8ήΝͺŒlμr-α‡,)‘$ΤΗuύώψ iΰP?Έ^SΗ?€ š•JΤ›Š$κ·V)QkEυ_V)QwIΤ]₯Dέ]$Qm•υζ"‰ϊο«”¨Ο/­πήZ$ΧόΗ*εšΫŠ$κR’ή^$QΏ½J‰:\$Qk•u€H’ώwDΥ½σ›«΄#ο*²#q•υξ"‰ϊO«”¨χIΤ^₯D}A‘DύΞ*%κ ‹$κτHΤώ»ήͺwΓϋηz{Ι€ΊEητΘ&«εΜ₯yα2/`Η‡δžΧΥ)ιy1ΞύφnΎ„η§5οζRΊwσŠ)*οζ‹tŒb—ς Bό‰7Π[{n¨”Ί‡9cŽ!ϊnzn—²Β5ΓLΟςO&Ις'JκΧg:$σD)G;u΄ϊLWΩθΓQ—Eώ‘ώ£ΒσH/xŠδKŠdΡ%φ™w§Žr™š z¦’Κ_Wδέ―ΘϋEή1EήŠΌ·ε!€Γdx―LΕVΕΎQθπ>sHΓχzRυg22ΎΚ©|L‘χ†<΄ύͺ:H@»9Η©ϋ(»ύšΜΓΒΰ’8ςΡn² ¦GL¦lΰtŒθδ’§!«‚…JJΙ’D£<υyŠ5Ω’{όR©ΗiΉ$ΏqN}αΌτq₯Q·n λπ_X©Θ.±]΅Ϋξ΄Υ0μμo‘j¨―›Ζ†χŽw –WΔYdΛwθxš«lΌqVA!,ΌγšΚψγYΣ3(ά^Ež†ί“n0³qk.θϊΠpθνy «Ή0Ω‘ογΉπσ@ίqGθ½{σA#πŒΠς!—$Φ2:Σ(5›Ω™μ*žΙξΈƒ f-ί¬ϊ3FG5Ό0‚\3rAη©{kY‚Fv¦²Ί~\‚ž”:ΔΟbh¬„N€’쉧8exόŽ(Ά—{sAίQΞUw™P% tͺΌ‹+ι‘0ΓΓdDΜ°­`Ύ\N@~S.θaJƌuΒdN% ŠZ§ο:Ω σuž0;h―6­S Ή™ˆόΗ ξψεDθϊ…ξ؁բaV πΤΠΫ©°nFΧG%Φ]₯όεw&X£²=‘HΜ€Ζn5²“±+ΐΥ Τ2²WœGIf‹yv^“žgΡΦRWςς«…π€Y}Τσ,jμΓ IΠ?/,f ™§ά”ΆΠ„ΊVΛΔ_£N3„ΩΠτP䢎„MΛ ρq—θ{ŠUΨφΝfτ·=w EP#)Κ ΠŠ0D,Υz40ZνΚbΧ"±―γu( zZyWΈχ,# δι&a‘Έ8Q=ι+ε€ΗόΚ]MŽoτςsUYF’¨šνΌΰuzώ‹_) ε:ΎΑ\λΗLύ˜[:Ÿ¦aέΤ¬=Aφx‰c0G*-}8ΔhΡ »ϋ€7mγ7SMB΅uB‘g*ς¦y'K½²P!JΡTOŒ%ͺΪ™Jά{ά)+Ή=igμΣ-ΛΑ*»ΰ‡™kεVΞρHΛκΉ»Ί‹ζ?ΪεQJk7ͺΆ“~N‘§ΪNϊΕ’J7At³‹eΗ€c_4ͺVnΝψ^Αb“@Ευ‘,3ρ=‡mD«Κm¨ξγυϊΆρ°^―U†ΆαάΝ$w3Ι݌sλcεΪPΉ>Ύ1*Zί²²ΙSI?Τ>Σ³(¦!ΟHλE[φΘ#…ΌŸ xΥθ+ςώ(Mθg!ˆΰ σdl %MОς΄„>όΓ7<— [B½uhαλ!œ¬‰€D€όΝΚυΑ,>\Ÿ8αφυ¬£+ΔsmΛȊ'3’Φ0σΡΫC'ϊσwq܍†ΤžΊΏν¨b‚ΎΒΧΙT†*υ!œTΠτGˆΒΌ*‘’π«MΏ{¨;βŠζ <€Λƒε±γƒ•ρθώ†V₯\AίΨQ’ixοFDΈeS₯69mםَ*\]ηϘ“>Π§{ϊr£]”Sσy)DΟb&",‹^ψ2£©δˆ i΄™nΨ΅ΪZ•>u†βΐzEή«RΠ Ϊ¦{Ί"šΫΫ†ΝΆ*žX’ψ2EήcŠΌΊΠ@κ=UΌ™σΪ€NΕgΨTζ͟LhŸχ㊼Lw0=O—1nrj^>­Ρ"ΛR€ƒέΎλ5ν#ΑΘ I Ό’§2'ΫΒ‚7e<ΦTR .υBƒ€H•…%ρ Ν"b2E4ΆΞ5v±vZΪ™dK}8³L…υΑιš5ΜΉ†ΩŽvΒΌω€Φœ3Φjζ& ¨’[tCj‹"I­ϊΡΤ>bΜΖ"h0›SΫΔ6Υuc«‘wlΙlΡ²žγσώ/ξΧ«†5Zο.–œΖFiξ4‚χ€λΪ¦FAΗχ‘)ΰ₯ψb1€AŒ†ˆ!₯ 2ΰΥZΡΫEΌRΈ`@% Α Rt“sQΕΏ€΅ΠY₯|σζ|«&ρκƟ―t„Ν–£e«:ιΜ’†ΐOτ‘σΎ”y²¬Q8ν)\5ϊ(]•φ¨ηgΌμΑp70Έ»#”“Μ£ŠΌGyσύ-a;–˜wέΩ:nύ˜Τ‡—πΥέQE±Π3Œ\+X²D^c΅ϊX}0>{H―’b.Ÿ"ΥΧυΔ~KΤ° bΝΏ.evΒMΌͺό)Ζτΰf½UΎΗž>)ώ¬@άαΪ­νΞg؝O₯ωΡR―B7醛ά…ΦΌ'σΖρŠpgΟՈ.€/GHζΏ²·TSYώœRΕό€f>κg.ΜITx9Κ‚Bԟr\ Θ»x!Zβ…ŠΌTδ=!aλucΑΥΗ‰*ΉΈd_ΡΉΒπ-ήέɈ™¬‡–S8s\% _Ρ™0aΒzm)GΧλΈG<Ύξφδ+¨] ŒUμ™Ÿ–υi\ZκGƒ„NΫΆΎˆF‰ˆζμ•;mG5j(© ­‚“χk1Φ"bC5«"bόRΟ© »‹zF‡Xλ΅ϊ˜b83ˆv β(#ۜ:ΝΣφιšwq)α“n§;[Qe?L9|ήΫyΏ ΘϋyE^οΧ%±₯E‘/Mq-όκ₯Ύιό‘΄h‰,ksκ»«Š[‡εΌτ­ΏX¬Ή ¬Ή ,Δ]€Ξ.Κ¨€EŠ›~\&¬¬VΣ1ͺšΈ’SιQ―Tδύ²PŠ.·ΫžΈh .–΅Œ†τg.& Ρ¨ύ₯ΈGQ˜³Uγ™«κΞτ p)cεΜευ²@ψ(ψβ\©@;ΰ:kvͺ·[–υ6 <[( ²ΆΑ—‹–)iΉ [%`ojρΊπ%Σ ·=½£T€AΈ{«#ϋκV»zΏ€΄€ffvkΞy’φZυRŠž€<ΔΗkp9:¨—ΊΤa!MΗμ3 ­SΝt CzΛDΊ?MS@|νψcοΗ{!}«wYŒ6¨Xœ9>oW"D7xΤ71+ύGίΛΏ&>ψ=Ό7dΒϊό€―‰T‘sί“&`s‹œ5“ΜšI¦—5ΰ:I΄Dg-§‰|¨π€yΒΟxQϋϊΥ₯RΣζU¦εœ2l«Y³lۜFΡϋšHυ Ξτ•ΌyδBΧAξΝ‰‚Ζ*4£“γ‘/«ψ³ΛσΜ–BΔΪ/―ώENθV“nυ9ΛωW“>°Ζ†œu–&·ϋͦԜ©π}Dέ”»[~y>&ι}O©WTΊ>ΒβgνωΪ ς„ϋ¦uΎ‘€‘βWΰύKΉVc5. S™€=Ÿ"ΏR ΅Gε–ΤxΥβγϋyίSκ΅»ixdΓ_ςg―θ;―Ә™SžΫZςΝD?š―υ!ΝPρ­jιUΛ‰GWοUύhXραή/ΰ°Ά8_[œ―…WθOx…ίKΚπ δΦ€‚·ŽŽ/Š:$χ*$β6ꀇJ=τ¬nEΨ5+M?]«  σϋy;~!ΘD“ΏR"Γ^­y<½wmξZ›»z˜»ΤαqŸMR²+ΝC–ί05«’;BΟσOΏφΑߐ6ΧδMΜ²Έ²;z~pOϊ)Υ-{Ά1iڊ#iH3›Η…8 t§ήπ¦;ˆόźֈ©rμ6†‚ϊ2 ,ߊΖξ-vψυκK$°]¬K$ΊCoρš$ι΄νNφ±EΐξZ-v"~”η:>Uo6‹ηΊoΰ`(ˆ«5‡λό„βvCŠ˜ώIχ;8ΑόbΉv£f rΝT:ϋλψ‚\Έ¨‡Π~R€Έ0.‹š…{ρ¦]-oΥΝriχV䞟Ώ)`Έ’½ε•= ;<‘WT±Χ’ΟηV5ύ‘•ήΞΚv-ί¨–Σeδ›ΙT^JΕB$έ{ία΅ΰ–ςΪMπoώ2IRΕiτ ~”ΓrτώŽw†c»ͺ·ν¬ή61>TAYεΑz­R&9(clΤGIu;"ά&”V*΄ΔΤ™ƒΦ[Κ·΅A δί΅=ύ]+‹~Ρ¬GaUΤ@a]Œy[-¬Ih΅ιr’†W°nεbΎΫIθWmΦ₯ΡΖr 5·`iΨ κ‹Σ4a , ΰΠ"”›™Xœ˜c/™―ŒΥg Ο΅Ψ>ί–ΦsΞΘΠσ)±h­“†―ŠΪΔΞWπGXiΎΫOΔt:쎣Αqλ"*3œnq¬tΧ$"ΡE’Πζ4 M‚i ίΧyΊI0%Pž$yA.Wλ²V-΅ΈA§;^”ΉΑ2i ₯ˆfm—{PvE€X‰β€€BΈΆP7₯ ΘΨ”ΓξŠ]‘˜•S0SLο¦λeΔΕ… ‡ΥΑBΤΨʈ,:t WrLže_Qq"―+©ήο8‘ΟΚ£(+oR|¨Ο]“#Ωᣚόgψ ?Λκ1ĝΗΖ—£“+l²ΥΖ3žΔŸ5C…šσ&Jωt‰?‹{ΆšŽeΙ‘bΎ*‘" ?]ύžε.A΄[#‘˜ΉζδœΝ;i-ΠςβZVj`τͺ=ίνx =Ηυ _# ΈV―„uhχΈ|Y΄¬L‚ncΜWΙQΧ*9 g*^ρŠΌϋyͺγcŠΌyoλΉ…D¨ί’εN΅šΎ4SΘ pφζμ!τpS}{}{Ο•€ΰ|–}^&ΫoΊή6i³–―±ίΐ8ί4\I­Γv§­FδA»~Ι‘­η ΈŠ3a½χΦ8ράE…ΠΈΥ,όHΐ₯:t{½ΫuοβXίο]ΜV^3ςošucD­‘ΨMΌΧ47–>:›IK"¨Μ‰μ~Ÿπ™'o”α™Σζ\[ ς€4νέ•’χΩΙξ©NtnšΔ™bkaέI7©oΛ#y›Σ'·/'u™@ΠcqcsΩO ΠY)db―¨ίΨΝ?ͺΌ1M/P5―ΞξΒ(ˆ˜^Λr"‰­f«ΝŐYϊVokςΤδ‰&2ž5hΤ¨i±%ΘΡ*§lwΆ†1H QϊjEήw }φIi`©Σ}·‡"џ&ΡY§΅I‰$‘πj}ji‰Βo-Vό%ς I¨€:8:ΨiƒLˆΛCύIMώœ&9„α:Υ\Ά /ίn§#)Z`IΣώ―–zΕ›)ΖυΊ#γΜ<φ3°CΤ@Χ,˜~Γ@‡7ΝYΫr$UJVtτ\}¦>vΠ7ώ«V‘οσמGΤEΐ§V395π% όΊμ„Υ©hŸ£s3mƒ'•Χiΐ$ΊXβ―;@‡„:JΣ’½¨”3υΝώαYη1Ϊ„–„9<R[Ξ~ŸθDνχ€ +Rσ(Φα'ωo”žZ΄Υm¬Ϊω–φΑΔ¦ΑΔDс&.—δ?BqO c"M½>‰(ΠΦ½f"ab"€Gγ ΫuOvΪ’rZۚ­2JŽh Œ‰"¨“ήιΑdΊΕ3Ϋ΅ΊΖLv,;°Π(πΧΐ2g—o;ήwŽα4C£Ω n«mxζθLdΞ΄šτΛΡqςΟ4CΫ5š‘λ…θ ‡ϊΙpΦ°ψ:i†s·Œ;φG~Λ …†Ώ’eά&+n“γΞ†Π»Ύήlί2n'T’ζDkj~y5J|Uά¨Ρπΐ‘];αkwxΰπ½»vŽ’dχhxdxτ»ξ;Άkb7Nw/zk™r’lνEρθ™τC£αF_30ˆ,‡|Aqό5ƒΏw‡I/¦e‡ ϋ‘ηΐo”†2`ΣCZ»BX6‘ΐΠ°‘BjfΎν‘ΥκΨ ‡¦ΡΏ]mό½}ο[Ζ\6š° ΌξTƒ9'*ˆΌΣB„ό› ύ‡α΅Œ ¨‚NcσΞ8ή9rtΓ‡ΒƒwΎdβθχŒNμ?tlτήΡϋpΖwΈ4<Έτ2’G‡Fο½σΨώΠ£{φΪμ₯α‘ΓGχ 9KŒιή7έςοA&O4Wνϊΐ_‡ŒCπ}Ԙ2iΚΑbγb-ϊž-cyx€xΨ 3l€ω …\ΗΚ&Y!X¦/fΜ‡`ΎτPφL돘hˆ΅FIΦ΄p‹‹»a5λYm˜πύιΡ!£Υ~tΎ5ιΪ8—_“X>ό?Š‚ΎϋZŽ@‡yξ#¦ƒ:Θ„eI3‹‰Kσ`F‘χCž’C|exΝβ/γ^{%§lΨ6«†z&Ϊx‡ΔwνSfωh₯€(c8ΛlrΪJ—tΠ³°…Ύ_ΎMωΧmνΆ=2[‚<Ί’νLφ„э*y€ΐ^*ξ¬σ"έΨ€‘±ŒωδqΉΈ¬iϋάf$™ΠG\PΚa¨Μ.γΙϊsό"cήiμ’-gΤιϋΙ=Πωϋ\–εGρΎ;6ήX…οήπΜΆDΘF~ϊm³δΆίΆa-ΈG<«Ϋ§Lfε9fL‡Ηoο‘ϊό%6‘Oq]„™ΰže½–lΕνΉλ₯ΗFN½obτΐθΑΡCΗ–ισpοq³3–έτ`ϊŽsAχΈΨ&:TZMl$€i €d3Ε3άUΊV; :Δ&O° ιαŽε™‹c³nΜςtF•Sό0ΌιSψkgˆΜ6Ži£ΩiʚF‰šτήφ;‚―ίqNAΧ™;Q)τΗθ%ψΓ °Μm–sΠmv@τ8ξέΔLˆnζiCχ‚μ `˜ΆΒ6ϊεΑLgΰuxΣτa¨‰ΦYAΣνΡ}<|ρΐ )ι;|φ)ΣσΉtIqK‹_Ω"5fš–6ڝϋ}°‡Y «ε"‡Md, ΐ/6<YΨUΡ$oNΉPΪ‰ι({λa}εΓDp?Ξτ Lτ ³θ³ΟhΧΉTΒIΨg g@‘G# <χF…OΒv\Ψ2[7aε˜sΑ1 `}­ΙΛ}ςr½S €Ίέ-^!½^jή7 ~Ά…€MαΑ’ζ“TˆΞ«/9xΰAΠΎžι~KέeςΰΒΡΑ#vX'žMšn_„ΞZ`΅™ γ”5τΚb]£κš.Œ}nώ‘ηƒ!€ΔŒςgαψ^©]Θ¦πΙ%<υΐϋ3‹.{1{pΚ‰nˆξ η»:SSΕ»ΤτŒωsK*ιsgΰΆ¬†ΏτAβw ˆΣ½―»¬i0š-YjwVέ F±%‹ς¨ε=|h)sΗv%ΦA“\ΚXW•<}¨Σš\Βd‡ιΓx’Z²HοRŠ=°V΅,ιŽΕη”TS#`=·t§Ζ[””ΎΟœ²?2Ÿ§δλΘh΅d©½G4ήψX²Hί! ύ¦Κ0IψΤ}4³ίrsH!Gϊο™$μΤήrs%ΚΓzΐžη…»n Ÿ³›δ‘2q&όΏΟ6Zm³Iμͺen\8₯φ ”zS¬τίεΒJ φA•0χOx½°ψ Ρο3§Gaί6mΒ›ΖI”…£fP9νL/ ^7gΆΡΒϋ°‡H Œu`R>:ﰍ~ ΦAαύχν―ŒŒzž{ϊηΕΈά~·‰ΐνόjvwΑμΥs΄&ώkŸΫj»ZrB«ΙCφ{ΈDœ"S–rgͺ€Qt ιb‹~~ωάm’aλ‡EY­]δ)½9ΈνΉθhΫi7=κΔ½#ΜΕΓ`b ’Ψφ>1ΑΜπΔ.Ώ”,©΄ϋ[Ψ°ΌdιΌ_©K-οΝ‚BΒάnH EŸŸO;εŒ*OŽ«΅A‰ϋB‚ίΕiΓ(~εAΟΥΛG€ mβS™ό]©&4'α+y―U2fӜ2:vαJώΦ "¨$ ~EIΓ3_“xF<ώ;kΑΆ·tΜWΗ}ο+©?©»_ŽEκJmωPE>#Ŏ80‰ΣΣf³˜-΄α·€έ6€GRΓ&¦G/ƒΣ΄<{ ;―‘³’–ΰ0M žΛ3wΰΝΝΩ¬Ζz # kπ‹ςΠ]wɈΥς6IH΅•;ΓϊόΞ#τ)EήΕύ=)μ.ΚΉ~#(©ψ&yUξ³αΆZF€si?ˆ% ¨›Χ‰lΊ‰ΨQπΡχMξπ…<΅π’#r ι9ςžΎΙ„IΌΓ¦š6…Š"υ΄ψTδ]σ«="ο(* Ck*΄ZΜ‚Δ{̝‚½Ω0:#jMήΝ a0cω‘WFb‡E[1<q%œεlΒ3αΌeΪMŒ‰Σi‘ΤιΨ6r–7Γ),ξzμΚΚθ•>ζ‘ͺ}‹“«ΓζβΎžB#‡ςνŒUͺφν‘"¬Θ]ϊ MW»šόσΞrΦ½Q“apΨ΄οχ₯\<Πmι-kΪRL˜EΥ–t'+£Ι&p4no£W 7­Ή¨Šx¬ Lsή@ŠŽ„ΗIρ+9W)τωyBE [½Ϊ‘[ΆX…9­ρ^0I³ΦaŠσΓ Θ_ Regular Expressions (Javascript)source.regexp.js identifier[_$[:alpha:]][_$[:alnum:]]*GxΪΕXνoΫDo’¦k³vΐ'Π¬νFρ₯ψΦ½bj±†ŸBβ>7Ί8—Δ4±ΝΩξ:5ωΟψγvIξlη‰ΟsΆLσ?Ι½όžχ—δήΦβ9–τ!υΏγ)§nΜΈιŽh™=Φχ|/φΔΦΩΙΦςσωΝ’Πw_>^“τ‹‚γEπuIw$νtΖΤσΥnC;ιnS«νmp™ϊξ0ΰj· .w©{ΕY\ϊDR`Œpϋ~ρ±œRκΖ.ΆRΗφ$ύtιΨ*\ (›·Ο]ΐ2§qf‚}€ρ_BύΨλ{,=q ι=ΰ?€Τ |ar?ΖAp”‡‰£°ŸH&Ύ't¦,Ξτ^αΑόžβQOQ—Τ°nPΛ°^΄ BμWGυ~u&£ΙbIμΩ1χ―ϋgΞΔ΅_š8“›τ¨Ωiώζά>N’άΧηΣ Fσ«Έ%p‰ωaΐνKΗi!eΣjΆζΤ0i‰ZψKΡͺa±Θ₯!Γ³”ˆΔΒPΒΦZ’₯8:„@xXξλΌNΫU₯ΉUj2σ`9P°_ͺ¬d1ΕσΖi¦dF½03HψΆάZ |˜PΔ»@ΔΟVEόΈ‚Α§βΈμN TΝ(HΈ«"εΟθŸZ¦Β^S*ήRU%‘ϋ‹(—ςHψJ+φϊUΐ{X„[Μƒ^΄&ež†ŽΟ’2>O̟ϋLΌΪ0±£ErΜbΨMŽqζ§fΙ±ϋF•MBqŽ »σˆ„·ΏOυAΌώ˜:mdόŒRΑΆ5Εf `ey\% |:f=άeΟΧ”•~Χ”{΄;bR„|”CαΝꜳ€Φ:¬‘qXΦ+6SΞrŒg>΄Γ?d[αΗΉσ:Ξ)=ΙΈΘ/XΘ2Θ4σζŽΖ›k ˜ψžτ˜ςΩΠΏΦψωyΉ΅WPʜm¨œOΒ0ΰ1NΥΘ=c, ι|dΒ"ˆΝk:J΄ͺ5ίShχ§kš¦(ΏO#ΐƒ!•G‘woϊΆT(χH΅E”^"+=YΧΔΰ³υFΓ|΄@ΘCXœδlŒ}6  =υƒ­ΚύΰAͺ¦ ƒXh"ήGσχωβΛωz{’*•©LεJ₯ Ž' έζγBvxW&2ΪΣd*Ύ·°φ53W`>•0—†?΄_» η%Οk•}ώ,οsQq‰υbξθ·6Υ\|°8ΐ•Z\`ŠάŽΞ4°ΆΫ›ιρ0.Ύ–”‰Ÿ’ Ξ.΄ωM΄y]\Τ‹βaφθΖΠΩώnξl¬©YίΡ¬hΦχ5λ{šυ–fύŽf}·j.€?&jωΎφV—6” ΆΥ>uˆe)Η:Ω?«ŒΤ_XδΦ ½Ε τš#™]kh2ψμ¨#O4-:Β~2fάs5y{\: ΈΑxL5ΉZ‘af‹ύΜοd]―Iύ=4y  oBibTeXbib text.bibtexGxΪνX[oΣ0nΪ]Ϋβ&—ΑX›mΖ]BšVΔOΰe«άΤk©SgP¦ύwάΔ'uœ8 Υ&˜_ά6_|Ύσ‹ΟΆQ‹ΧM±Ώ@Τ£έ!"΄»ί¬₯Wζ` =ζ5`κzΜΐ4τ˜·€™Σcήf^y˜=ζ`Ε~7…‘8`ΈίνωΘΑΑT¨%±ίKζ:θ:e˜²)zΉ :ψ†BΊ…§+ έ.?ω¬©x ?|€}xΌͺ+ŸΌ¦`Rh]§Τ-±o(9σHμŽ7rΈεŠ-ΔΪP«Gz ͺI―rN‚ˆ­ΓαΗ-Σ¦‡Ι“Ίlβ9x†²bvmΎ‹ΔνΕΎδXͺΛ–ΰ‹}‘@ ₯@ΰ»%φQH"F?₯13  ω¬­‘™ƒ>ώF(‰>|/•΅΄uΝe&2AδAί {..ΛpυΆ3o3Ζ’ϊf.uW§―oˍ΅ŸΙƒΤ ψπDμ„ς’!}‹Έ. W!Eδ₯•‘Iρ5K0„qc,§nυ+―²Wj˜E "`χwαχϋIΡ‰{™†Cμ'%Eϊ†άbδΡω—si˜_‡9ι …].½žA΅:ζ—(Mβ6}mΠ»w¦M{NΣ΄α–ΰmς§ηC¦g¦Γάφ]βΏάP^ή/Έž2ζρ€@ «Žΐ%gΘ'h_D­ŠiT³u-f1ΣW¦$¦2Cˆδ<±ƒ½*j>ΝU3]Ϊl<ΒW!δvb6/|ηHΒΖEClELcΣAH'e£ͺ”­k)K€œOI όθ€cΣγ‹g±VυβInϋσkΐ,V3ž΄dMtμ–ŠΨΝ8Lν“£HvΛ΅υΉ< π’ΪU…φ( LaTeX Logtext.log.latex"This is (pdf|pdfe)?TeXk?, Version (xΪ­TAoΣ0NڎM€!Δ„Π4!e™b7"Δ $NœHMWΉ‰“Zsμΰ8έ"νΗγ4vβΊΙ6!|ωάϊ}ί³Ώ—χœv=Vx)£ΛbΊ<χœέ5σAΗΈ (\nΟυιDαawZ Θ…>ž*œ)4©ϊΏ+Ρ+‹„e€@ΑΊ.ֈBu ΖΔ|Η‘B/šG‹ˆžv•Cγ±ΒKT_1ž€˜QΑ1“΅ιϋ4ΟΞΟƒO‹³(ˆ‚v§%ί)ά@ŽαŠ P@ε[ίWύΨ€©Ϊ™RpL3PΡ?(L¬%;ΕD’sΤ{2κƒΆέϋ²ocYp¦°¨h,ͺφr J1ΕΫ­Ί ’IŸw²χαxΐόIzͺ…ίκΧTEΑΈi“ ‘ΌΒb@ΔFks’QE ΆOο4z3©3°\Ksf8<1γ‰B©)v}v»–khΫνqΟDΝι#3ό‘Bΰ‚œΚB„ZΰΉBL7ΰD–¬ΰ(–"‰3έ+Οό"\ψa”ψ!πIψ_9gόζβΈxj `BP‰Α>μΨ‘όŽjM|qKaGΨ1)5ϋε[Τ’1°,Ηψi¦ωo†ψ0kZ?ΕYΕα-א}aO)[¦oCγ¨ΣψNSΦ[ψZaΜς\ aρ%HX\5?α¨Κ7ό;G‘ν§50S|#ƒΓΌΔӊ›Ÿ4iwqPŽuΒξκΤη»Tp―΅B¦Γ-k^£Kςώ2cLaTeXtexltxtext.tex.latexnxΪν]‡ΫΖυ§δΨNάΖMlΗ{ΠρεPNb§Mά¦Š›6έiZ§MQIA’ƒ €ΆΣέ{ο½χή{·ΏΞt$έιNχξίπ»pwΗ E€~>6¨Γ‡χήχέ»}ό_.ϊ¬―» Ηun5<ΟX(Φ=Σ¨•mσΦK 9φ£D_FΠ#iΠ—τhτA‚^–}ˆ ΟIƒΎ‚ —§Aί— W€Aߏ W¦A_IΠηΖΧΥ ΊŒ`¦—°r^|έΜ‘f-§h:ΥbΕ­Υ §κ'O¬Š―kΨ'l·r¬X3‚Ήy/ΨΎ· LŸΟ]c€;oR"V€ΰχQ€ΰu(@ΰOrΰ4㺁γT X£ΖdkγλΕ nΦtLΟ°‹n=°\}1ΌΩFΝtJρuρυ"φIΫ-#|Ω3*΄•.Š3λυ9«BαΦ q–S±U:Ώ œψg[ŽΙyΖF-Œ±I ²6 Ι²-Ÿ6Ρ^ΊU‚ΧmS€ΐ7ΆsΜD šQράBvKlˆ₯Py 4Ψ)4ΆWΛk/ζ a ΅œ Αμ’cΰ•»…φˆ0ΡrΪ«ωχ)@`ώ1"|A‚ΐ>A<ί―AΏD‚θ]T€"  9+`¦ςŒ.V.U€€•Λ xέε °rPV)@ΐΚ °r_XΉŸ¬\©+WΙY –gtXΉΏ¬<@VV€@¦*@ΐΚ€¬\£+G `εA °r­¬ςL5δYjxΗ³…š b3ιΞφstHρΉBBXΞ,ΥΛž Ή>?Ύ“C!Ϋ豐ο υX°κ‹τX°μ‹υX(x/ΡcΑσ_ͺΗ‚οΏLοΉ ώ =Jΐ+΅ƒy_₯Ν6i½ZŠ_£Η‚ ―ΥcβΧι±@ρλυX ψ z,PόF=(~“ ΏYŠί’₯LφVmΆI“θmz,Pόv=(~‡ ςΎSŠί₯ΗΕοΦcβχθ±@ρ{υX ψ}ZΪ@΅χk‘ Ω΄PPμƒZ(θυ!-Τϊ° Žϋq-Ω2KψQ5ΌπcjxΰΗΥ8πΎOλ\Ϝ1=Σa†Λ?©C‚ŒŸ!AΚOλ ηgtHp€Ο 5χΝ ž>’τω\|έΐΰs>(V͊λλQπΟ§‚ƒ Ύ †ψb*8XγK©ΰ`’/§‚CωϊJ*8”±―ΖWv¨κ„ι•λ}MH ƁUKp_―d‚ψV4uc9δξ7βλJΈλ†Ϋ_Ι 0™($χΏ_Wsχ£™!‚ϊV Šžg&¨os‚FσΛδξw8omW&ΘοΖW2»œΜύΔχβ+™a'aΙΝ;8•γ–2ά>wŸLΊ’ϋ?ˆ―dΚzΖCjV`'―ψ!G™ε5ωQ|½°η –(™ξŒ―›9`λ/yβψJFp™‰]ϊ1§*™Π%χΒέ'ΉδώO9SPS­ς3ŽŠpΞ“άό9W θΉN‚ωη5Ρμ%ΉϋΛψzάM\nN:jF“@~Υ"‚ λTψ5 +Ήχ^Έ°³Iξώ–sΤ€+JΏγœ^Ξηο9*κFε˜1›hςώ~ά©$χοαdIΊˆρGΞ\TέL Š―d%HέFζ.’(Gζ₯ΰBΐ_ψ <7pƒ…:ώΚ‰™ΤVρ7ξ€–"χΞ½ΒΌF%hxπŠΔW²¨ƒ φOΞ5ŽuΌamƒRχ_ρ•¬jx6ΉυoΞkpά&χώΓ©@b:ΉίψϊΏœψ3’αν˚˜?J§ΙΪ(2‘\o8ΘΆΨD՜±+ό:빍ϊDX6&Pȝ΅Œ²‰•ΰ£8Ι™¬@1ȘΑΩγ 놇‚.*Jv£ζΔΩ)€Ι©>£4d―π}esΖυΜψ}˜M[sϊe²;)-ιτIΑYePec&0½%₯1Ÿ™ΖΓqŽΣΌ Ρά7½ θ™uΣΐ•fΕm8A$ŽHλetΞδRu?y YΈDZVͺ^=«25U©ά£§eJuΣͺ#”θw­Μ-:ξŸ"ίφ§4nΨβ‰δšH―KΨFΧhsnNΫy—θ@j•mdUGζ"lΆΈR…?[ι—’’εΉnM„έ }±g Y396V*Π c₯S…±0'τυ4,³YΞž˜€τ3όF½ξzAbž,VƒŽΝλ;–FTͺMgmςBαLRΊK¦"žOA5ŽY³nΧ­¬I>lMr>†οQϊAAζ gΏ'δ•žύ—9ΑYξϋ”NP5ύŠgΥΉ2_8‹}‘σΙΠΜhŠΆŽy2^u©*žΒΔσ΅¨.‡*Ίu3\_ri=½κ_K‚QK&Kp&’5Zz6IŒΔ € …Σo•pκm oŽ•n*:ͺ%„/.TŽv*—u!T.οŠ +$*HrΑVMψ₯J: N#ΛΘΘ¦Υx€&{;Cv½ή¬”φ—φg€ 釩4²fα"B“Ύ‰&½jΝΜd| ߏ¦VsUΓχυB>λ6g]Ϋpf3‡„τΗPi€Λ³ODϊ 4ι;hη ˜iΫΝ9?c}HX,•F πZλ{€‘}.¨ΩίCΒχ^*œΌwίϋ€|ίfœ02Ύ‡„ο1*,τ}ŽˆοΝχΕ<ίΡψ[σΆ,° ργT93ΓΏ_^Π}ΧΙψΎ/‘ςρχΥ"Ύ‹4ίL›εތφpe€ι‚΄»E€_*-δh‚₯žρ=$|_F₯‘Έ}DΔχε4ίΎYγmXθ>H₯΅"’ϋMχ^šn·|ΫΨδaΌψ„Y*6 ΩHϋ°•FNUΆEδί—&\I~6κ>Dp?*pό9‘\)­άΡΔj643,|_E₯‘γΘ_$βϋώΚ½>—΅ε†…ξPi€ΏVDχΥ4έL‡­ΎΜΉN³Ύ‘>$€?J#Όή#"}’&Y+αed ΩΧPiδϋ6ΩG€ΈΧ(g…{Xψ~•φπψϋsE|_Kσ½‹ζ۟kϊsx ΅lψsωŒω!aώΑT™G.˜ΈŽfžι¨ϋΗνfm_­’Ω”κАP*όξΛω"ςF“Ο΄Ϋη3Ί‡†ξ‡Siδ7k.Ρύi­Ύ`d| ߏ€Θνρύ¨œκΓ¬λ^ΦΩ;eh³V6«U«D@rfͺο6›ΜιG‚ηΗ…uHx## ηΰΣz„„72I€~6mΦΞ¦‘δΜψ‹4ώ>­ργclΨ霘roΘiXά‘ψ³™ώV71?ͺβkφ«ZρυΜ±ΚœΌx/πP8yθYΦνΛr2Ϊ»h[₯”'ήBm-c4ζΓ₯d<‹JSžΠΖ[MN\Jv;M₯)OΤ{ŠΤιΨυ–’ρžJ₯)O¦{mΌu΄ρΈ“ι–’υžN₯)Ox»QZdα„·₯d·ΗSiΚ“ž ΅œ”Ά”μv•¦`H΅K½; υλζχaε.νήςΤ―Λ[·JΗ3ε©χH€Gtm ς–ηΤ;|RΏ.o RSοO]€~ιΛLΚMŸCRξ©Σ֖ŁԱ+;‡4€ήp7€ν³6φ³-ΦYΧ6Ž i$N΅/kHKrκmO‘ΙRΏŸbΦtLΟͺ°eΈfxΗА”gœδΞΰŒ€!oϋ«PŽ[2]άϋ4€c©Ά €n]ίΉΣ‘–ό`m( Ο:ζɊk7jN°P7[χΝ5+^Τ8pΟΗ·9ϋo—Y/0Κ ΫπΪ, ϊ)ςm‡Π‘-Š~݌@gεαΛE£ΙΟβύm΄-}S -2=v/2|7–ilYiK§½J­πC–Ϋ³»β<Β‰‘6_˜ν:ϋΏξN[6*n-Ό2»δIbΩv+ΗBˆαTYhκ°Ašm·ΔηR*zTβΡcjcqΐ#‹ς„ΡT…‰±ΑWM±fS<¦1Y^TKώψXœMψ=Ϋcy&ΚXŽ*cς-΄ΆXŽm9‚Φΐ2Ir—Έͺ]œΝ€΅Θσ™GL‹– ύSτeοxοΫλi»Ρ3>ΦΆu΅ύ q+ζtΗ/μΌΕΖ Ρ³yTͺΥ·l‘h²ι1Ϋ~~K’›$Γ.Ξ†szͺηΓLΟΆζΉ±-ΝΜγΠ1Ϊαœα€ιΩ£ΉΓΣ²λ1—=!bξeΏ0}uΤί Ά‘s׎&ΆL˞Np ˜=˜θΊͺ€Γ ―3¬'yzΆwΪ'­Γ•Bal²vxwΒ?n1Β± ƒΈ6DΥQύa̚κ%½ο§”‡ή|€–w«@^8ϊ¦/rJSž7σ!QΑ δ¦ι‹ΰ¦”§n|D£(ΑΓ3$ϊ"ς ¨4εΑ /Ԉ‘_D₯)Οθx±Ζ­“}‘ϋ%‚4αnϋ—jLξΉο‹Θ/£”έ_N‹Ό^ r£Oώό *MΉΗό•#‡{{ϋ"ς«©4ε†ΪΧhŒŒ·ΥφEβΧRiΚ½¬―Σ”ΐdGk_δ~=•¦άFϊZnAξυGή7RiΧp2ςΎIγΜα>ΞΎˆόf*MΉyς-΄Θ;[EζΆPφEψ·QiΚ}‹o§…ί-Ύeχb_䕦ά2ψNM$™ο—Δο’”»υή­ρπpΟ^_D~•¦ά(χޜξ#š2yκΓ’Ι‘ΑκhΉγΠi Λ9-η‡h:€g Ο°žgt!dGΊχpΓνΠ•¬Ž6 ˜–=^9 #§Œ·Φ=Σ¨α½ͺ[i`]+h,ΡΧžΑXpρ±œς3*-€*΅Υ *TFaˆ»O|:RΌΩ(ή^ͺŸΊΎzΊ8MΤ€bΣv_ΦjΑ.-lşνBC4|³Ž†’™ΆΪ`“‰6ΘO§s—˜ο&iαη±+§φ%άJ+˜¬΅#Ββsβ?•‚ψt«£RSJSΘόˆ„K‹W•&ίyΛ­Ειύ­} Η TmΈΑš!αΜΫΫΒ½MΘ°gȞιT†¦l¦²Jε~ϊΑv±π$τΦ6 ­beΣξ…Ξ€mƒͺR+X˜pΠμ σ²ή*»†VΦ7© Iή΄|°Q]ΆœδΌQHžY«Ο±Z.κϋ @c[7@Jm*…χZάΚοΝB΅XδP(VžQςUvν*‡ ΅Ž― ¬ZΈ ΞΒ†B+ίNλ… rγ?emqέάpͺh*V!pž5x‚jΑ†Ρ8X‡”ŒFp5j›λ<ΆΏ‹`”u,•¨ΡΪ)QέΙ‰›[D†± ~«MιPwΩ§RΈ4WT₯‰τ¬Ž*Φ9γ‘=θ‹FΘ?’f7r‹j½κ‘|‹‘gqp4ςvT2Ξ6€£ ‹©CΞλ‰Ήežΐ~H!°›^³Bΰ;ΈβχΆ£-ΗΤ¦ρ€λ±X;\o֚ε¦ΟG±‰ζ-AΟ²;_Œr§dΘ.η›Œ>«ˆ ŒΒα)ύ―[ξ—If9ΎιΕ²9γz&#ΰhW"—L£Q±FH­ΡΈF#cEΓ>*΄,'τπ&_}‚Ώ‘ιm#p½ |Ί΄HνO\ΦjkΊΑ7υ6Ηυλ-{ύzcžsΔ|οL­Ρ4υC“εŒ&Ι‘φγ©UΩ«q]Ο¬›όάλ(ηRΜ6Ω£Θ ²΅Ή»κ―Θ΅υ™zœ9Ε |S΄T~7]­’ί*³%xž+hY»Nqπ΄ˆασΪa˜‰γ;Ε ‡εβ$*γ“i›οΡ} zΓξš<¦ΧΥuΩN–.ΡΆ,md€DδξnbBXjxx?SΤΤ­Al«‚ZΈψ©4νξ{1²B7§T*Mϊ.Μ½a~H„™œ/¬(Τͺ_•Ο£AΊY§ώoΡΥ¬’+J©Z~έ6°Έέ4;†η θK$jsƎ²˜5°^ρΕ¬b0~¨YkΨnδ5η'ηΙkP–V€ΥRE5ΉeϊΝjθΝjτ†ͺίπλΘ7Vα²XΘβθΕΡσsmT˜LCx=s§ζNΤf¦Q?±₯!)ϋ΅ i¨E™ g2³­fl΅•6*Œa«遊Ν1|-§υΫ t΄₯UΉ ν›‚΄ί3*―¦UކEΙsΒ_RI½βЊ{†ε›€Ίˆί ;R“‰­Γ£γšπ‘mno’Ν8㺁γ&*:x<΅0™Ζž;dφ$ΉuΛ¨’ςΏ&'Tκg"ž8xe~ίN0" |aΤCσΤΆυ'ΖεΗϋ%ϊΑC’γύψΪ²ΥB\ƒXΥηγ+½ƒUΰ 4½G„ρWζΡb»kZΧυ΄?\nIaΩ™Ξ(h/ \‘(UΒc¨έŽ#ΕIά<žŠVN7K…ρ€gˆ―Σ…Β$ΌEζ}„@XΨT™C΅ n«9ζΙdδ“wΎ+ΣxΜ bbςγέ±e•Σ¨…˜§xχ#“’μ|σΘς^ΞΧtg`HzŠ$_ΪΎ|κΧΊά’…λՌΠE‹ΆŽΟ–S±UsΦ3κsVΕOS-)F{™ΌzΩ~Y/Hk³ύ’±3τ‡‚E¬\3ΎΊŽχ»Rse[„UY c‘¬ί³+‹€ΗΚ<=Θ]Ÿ νΨy™° τpg##ι:špΣρž‰_ZHΥq•6D’ŒŸΔMŒ=θΑ±ΒH:r€΅}G¬‰„ά܎§1c{h‚Ω±2 5Κ­ΫΝl jΐ’Ά0 ο“h†M”UFα€QΈ•‘πb9…x£^Ζή€±·a― g―jϊΟͺγ7d$‰ΫsmT™ύνΕμhG4~/Φ8Χr ?δG·£a74 …}_Pης°g&Γ_R l{κ*„ gΚΒα)4―γα@žΕΚΣΙ…ύΡx$!άRšžΖcZhΔ`|ΣV‘e½LΛMΚ==φΕkՍ"±‚ΛC-ΥJέιxΒΉZη²ŸΧ^d%/Ο·“’Rσ`³bžωhΤΐLΌΎš.–™ΙteζoΥHΐ"ξ‚a "s‚~KρQ<3|%iŸ $)Μ U/ ΥΞΦj,ϊˆwˆ*Ή\%G’€A’ώgIϊw%ι?’€87¨m‡‹smˆΆZ’ή$销-₯YIΫδBIϊI>Ώ’€ί!Ιg“$}«$}£$}‹δ½w†₯·yθhΡϊ³<${nΒΡ±ότp4ί΄ζΗ][’Ξ¦Q}§κ…τΟ œ³¨ΧΚά~W;n?*‘υw’τίtZΪ™-nΤZθθ·³ΕΠ΄γœΡΞΰγΊα>wΙ’ΒΡ’ΒrΙKώ$I­$ύ’τοHοιΐαη) 0ΥXf~Ÿ“i γ ϊvA™Άr˜ΨΔΙIK₯…ΰftΚ~ζΉ’ΐ(έΌ%ψ)Ραkχ’κ£₯Ι*Φ‹φn§-Ψ•š‰iΑžΫcΛΒΓ3˜’π ΖΣΉΠN\'ε©εf₯@ηŽμ(o]™ήΑςX™―=3Χi&­ωπη>ΣΦηΈZ|rX―^Ѝ_ϋ”)ώF:ŜH»?Ε™’>΄ žΫ±Ϋ’U՘hψι±~›—Φ„μο—υΖ[ŸΗΘ΄Cμ­m>Pζͺ}pΥ·Άγͺt°§3ω%—>Ξa>ύή’|O’ώ3IϊΏ΅Tρc:MQe[όΰπΜΐ2]@i‘œΨ9ΰ*|<§ψȎYω~D3kΚJ± ’f+žΙˆzc»ςe«E–x¦ΙSσωΉ ¨>p fyžλωΖYξ„λΝΈφΖ#Χ¨Ου„Ο0ηλ}€duΉό1Q―Ξδγƒτς' ³'οʟ΄‚Ή<ή0gU¬ΐΜ‡‘Α HίpΚ82έά&^έߜͺί0†πζ”tΊ†Ϊ#M(M―9ά8wCΰ όΙp¦eκΪΚtς~ί ζš ίΏ £G*ΧβGΠKF0ηzΡ”M%J —Ν7LΓkV‘NΙ½†g‡ωωu³bφ*yEr7$wΓΆCαρFΐO˜vm*?TΏaζ:hp#~x&(œ¦'ζυ70ρ­πՎλ‰­£ΌΡσρ]Z­ Yo6ήπXobυCuPFκRyΥόu—χ­ZέΖL,DΔ4|TyεKεKς'Ν<š:©ΜεχyUθgsm„afLψΉ«‘˜η7Κ…S—^rωι8f&CbψΞ$n3…ΛΙγτʜQG-¨fD£ZΕΧψϊ ίΕ©(―&wΆΠ• §‘‘·ρ=o†*АΪΤτψd8T‘g?»ςnΈ”Ι°σ7βhΈŠŸ§^!)±=1ΜαͺƒΨ^՞Ϋ‹q‰ξzκη:φΤ#tΩχκ’Άͺ°―Υ Λ‰Ώb"β―Fο]·ζ›u/œυ©šι6τ^$i„uΡ/΄ͺ―€̞]|TnΊοj/9mwƒΪηsΒ&5ΆAtn:+l“Y>œwνπ΅Κ3]°9ΝwνπE΅‚nψC0ώπ%΅|» vπ‡ Ρσεœ4F†›Ρ#ΓU@oƒ―06XKΫN ^†ψjv…lτλ/’τH*I»$]Ά`ι’tΩB¦Je ₯ώ-I‰$ύηmΨ’i£ν₯΅ΡΠhDsυQg ˜‹Άb’&ύιiφ€ρOΌ Χ=62Π/ =Δ–mnΩ¨e’ν·°Y—―ώ‘±ΈTeXstyclstext.tex¨xΪέλOγ6Ό-Ϋq/8ΰ8ξ›ξΈ]SΦlϋŠΖΊI“φeڐΆIΣtnβΆ‰%i³zίη8±λΈ1}ΐ14K`Χώ½_ώΉέ©dγi>Ώ˜ΰvΗ'ξi3IΏύU£RŠδ Ζ# j>?.EΐU‘jωΌV€BΨGj\ςy½7"Mμb)s«@έ+ežr#Έ€Νm†°8ύH›Ϋν8Q"Ž?Ξηε|ΩT@άΧ$βΆlhh‚w&›8} ρvAβŠγ‡š . ˆ‰ώhμ'ρεΉ°ΰJ>χ †π›)€= χ$ŸWΗΰ0³…ΒpEΣ¦Ax*OW5­”Hhhρ)4S# ‘ytI…‘§λZ”¨άΠP’A€<ΣL'ANαHΝMΝ.Θν–ΐH‚=/£₯ΫvkLc„ζHσ’Œ0B$τRs*"!sTBF2mkAF$!Ιy(cκ“|ήΡRύsA&ΐ†xˆ"‚Σ`³S>6zΫ#Ύ";g‰]Υ Λ²Pp“³λμΦ47ΕI„pΟ&IFFω|€έdD°νΑ.ˆ/sˆ=.FM¨ςΡΝYΥψqΥΊ)έ”KΣ™4œKA·q΅¨½ˆ B›‡ίΥςnhς«ςͺTξ¦Έo―Œœ¬Μ:Rƒ,pζuΔβν8bEWέbΨ_ΣΤΫ.Ν E’‡šw<^TΚG™HUƒΚcΈΩcžu«•I£ͺψWο’f³2Χ πvͺDξΐEh™Θ•ΉES―;ŽuΤ³»ΒrβFέΉ°$ΒB‰O!Ί‚x†$JΖ.œšΏ{΅Ί֚Δ>ˆΉitž_Lƒ{•™«:·Ήdn\\WRΑjs Ά­ϊ1ο­­Ώκ­}φ±eΤoΟ[₯Ε0GJε3:\4f§πό‰<;οΒUά›τΉPU4ηvή(¦ό`Dη*X^μ#z7v£ή φw-·t­ς7‡ΝoqΦmΊμθeΕsaZ―\ˆU―Τ‘CΪE΄›DHQ·ξΆΑt‘ ($]Ϊ)HŸ₯νΜ aφ<‘_3ε)ρ<:ΐά~Π£ΓpΘ‡yτΜjY–Σ‘βΥ n\3Έρ†ά7zez·φI*š »Y‚Œ Iς-ƒδσfδŸ%σΔ#…Πο›‚ζϋοŽχτΖc¬DζOmΥ ν~±τΖbCpέΡ³N>m ίρδ(fDΑ'ΒΖ$‘ƒ± BψL _zbρ™Y°TAή·ŒΣψ[we 8MΦ|1τO!_€φν°Τ =ΐžΨΤƒ>[Γ0F>Αt"±|ŸΒ€¬«`ΩIΆ@Dβž‚0ΤAΗ4°*BΟ Q ΜώG}’)F½€ΣΘ ΠAΞ'μgπlrΩΫ₯$€=@δ<~ΰςύΖY”qϊΡCDε”~Ο©2ΤC†ϊKŠj±ΊpΰthۚXΆ΅€Οz(ώ…Œμ€n?οg|³έT«W*μ]θ]ηloT?wή}‹iΊutβ\7ZzkΊ¨J~jͺ»Ε7Ÿc_,₯W=»KQ1·ΑjυiͺΊxμ°&%η6Τ¨.\#fu½o²=Ύ7ξΑlθo¬2ΟήWpT’λ†ύΗ†ύ‡†ύ†ύeΓΎIž§†ύIOπ»–vK³€]‘xΜ#§ξXςΊ~eΎεBvρ`VΤbkwέˆΤ‘s| | char>= | character | characterp | check-type | choose | choose-if | chunk | cis | class-name | class-of | clear-input | close | clrhash | code-char | coerce | collect | collect-alist | collect-and | collect-append | collect-file | collect-first | collect-fn | collect-hash | collect-last | collect-length | collect-max | collect-min | collect-nconc | collect-nth | collect-or | collect-plist | collect-sum | collecting | collecting-fn | commonp | compile | compile-file | compile-file-pathname | compiled-function-p | compiler-let | compiler-macro-function | compiler-macroexpand | compiler-macroexpand-1 | complement | complex | complexp | compute-applicable-methods | compute-restarts | concatenate | concatenated-stream-streams | conjugate | cons | consp | constantp | continue | copy-alist | copy-list | copy-pprint-dispatch | copy-readtable | copy-seq | copy-symbol | copy-tree | cos | cosh | cotruncate | count | count-if | count-if-not | counting | declaim | declaration-information | decode-float | decode-universal-time | delete | delete-duplicates | delete-file | delete-if | delete-if-not | delete-package | denominator | deposit-field | describe | describe-object | destructuring-bind | digit-char | digit-char-p | directory | directory-namestring | disassemble | do-all-keyword-symbols | do-external-keyword-symbols | do-keyword-symbols | documentation | dolist | dpb | dribble | ecase | echo-stream-input-stream | echo-stream-output-stream | ed | eighth | elt | encapsulated | enclose | encode-universal-time | endp | enough-namestring | ensure-generic-function | error | eval | evalhook | evenp | every | exp | expand | export | expt | f | fboundp | fdefinition | ffloor | fifth | file-author | file-error-pathname | file-length | file-namestring | file-position | file-string-length | file-write-date | fill | fill-pointer | find | find-all-keyword-symbols | find-class | find-if | find-if-not | find-method | find-package | find-restart | find-symbol | finish-output | first | float | float-digits | float-precision | float-radix | float-sign | floatp | floor | format | formatter | fourth | funcall | function-information | function-keywords | function-lambda-expression | functionp | gatherer | gathering | gcd | generator | generic-function | gensym | gentemp | get | get-decoded-time | get-internal-real-time | get-internal-run-time | get-output-stream-string | get-properties | get-setf-method | get-setf-method-multiple-value | get-universal-time | getf | gethash | graphic-char-p | handler-bind | handler-case | hash-table-count | hash-table-p | hash-table-rehash-size | hash-table-rehash-threshold | hash-table-size | hash-table-test | host-namestring | identity | ignore-errors | imagpart | import | in-package | initialize-instance | input-stream-p | inspect | int-char | integer-decode-float | integer-length | integerp | interactive-stream-p | intern | intersection | invalid-method-error | invoke-debugger | invoke-restart | isqrt | iterate | keywordp | last | latch | lcm | ldb | ldb-test | ldiff | length | lisp-implementation-type | lisp-implementation-version | list | list-all-packages | list-length | list\* | listen | listp | load | load-logical-pathname-translations | locally | log | logandc1 | logandc2 | logbitp | logcount | logical-pathname | logical-pathname-translations | lognand | lognot | logorc1 | logorc2 | logtest | long-site-name | loop-finish | lower-case-p | machine-instance | machine-type | machine-version | macro-function | macroexpand | macroexpand-1 | make-array | make-broadcast-stream | make-char | make-concatenated-stream | make-condition | make-dispatch-macro-character | make-echo-stream | make-hash-table | make-instance | make-instances-obsolete | make-list | make-load-form | make-load-form-saving-slots | make-package | make-pathname | make-random-state | make-sequence | make-string | make-string-input-stream | make-string-output-stream | make-symbol | make-synonym-stream | make-two-way-stream | makunbound | map | map-fn | map-into | maphash | mapping | mask | mask-field | maximize | maximizing | member | member-if | member-if-not | memberp | merge | merge-pathnames | method-combination-error | method-qualifiers | mingle | minimize | minimizing | minusp | mismatch | muffle-warning | multiple-value-bind | multiple-value-list | multiple-value-setq | name-char | namestring | nbutlast | nconc | nconcing | next-in | next-method-p | next-out | nintersection | ninth | no-applicable-method | no-next-method | notany | notevery | nreconc | nreverse | nset-difference | nset-exclusive-or | nstring-capitalize | nstring-downcase | nstring-upcase | nsublis | nsubst | nsubst-if | nsubst-if-not | nsubstitute | nsubstitute-if | nsubstitute-if-not | nth | nth-value | nthcdr | numberp | numerator | nunion | oddp | open | open-stream-p | output-stream-p | package-error-package | package-name | package-nicknames | package-shadowing-keyword-symbols | package-use-list | package-used-by-list | packagep | pairlis | parse-integer | parse-macro | parse-namestring | pathname | pathname-device | pathname-directory | pathname-host | pathname-match-p | pathname-name | pathname-type | pathname-version | pathnamep | peek-char | phase | plusp | pop | position | position-if | position-if-not | positions | pprint-dispatch | pprint-exit-if-list-exhausted | pprint-fill | pprint-indent | pprint-linear | pprint-logical-block | pprint-newline | pprint-pop | pprint-tab | pprint-tabular | previous | prin1 | print | print-object | print-unreadable-object | probe-file | producing | prog1 | prog2 | progn | provide | psetf | psetq | push | pushnew | quote | random | random-state-p | rassoc | rassoc-if | rassoc-if-not | rational | rationalize | rationalp | read | read-byte | read-char | read-char-no-hang | read-delimited-list | read-from-string | read-line | read-preserving-whitespace | readtable-case | readtablep | realp | realpart | reduce | reinitialize-instance | remf | remhash | remove | remove-duplicates | remove-method | remprop | rename-file | rename-package | replace | require | rest | restart-bind | restart-case | restart-name | result-of | revappend | reverse | room | rotatef | round | row-major-aref | rplaca | rplacd | sbit | scale-float | scan | scan-alist | scan-file | scan-fn | scan-fn-inclusive | scan-hash | scan-lists-of-lists | scan-lists-of-lists-fringe | scan-multiple | scan-plist | scan-range | scan-sublists | scan-symbols | schar | search | second | series | set | set-char-bit | set-difference | set-dispatch-macro-character | set-exclusive-or | set-macro-character | set-pprint-dispatch | set-syntax-from-char | setf | setq | seventh | shadow | shadowing-import | shared-initialize | shiftf | short-site-name | signal | signum | simple-bit-vector-p | simple-condition-format-arguments | simple-condition-format-string | simple-string-p | simple-vector-p | sin | sinh | sixth | sleep | slot-boundp | slot-exists-p | slot-makunbound | slot-missing | slot-unbound | slot-value | software-type | software-version | some | sort | special-form-p | split | split-if | sqrt | stable-sort | standard-char-p | step | store-value | stream-element-type | stream-error-stream | stream-external-format | streamp | string | string-capitalize | string-downcase | string-equal | string-greaterp | string-left-trim | string-lessp | string-not-equal | string-not-greaterp | string-not-lessp | string-right-trim | string-trim | string-upcase | string/= | string< | string<= | string= | string> | string>= | stringp | sublis | subseq | subseries | subsetp | subst | subst-if | subst-if-not | substitute | substitute-if | substitute-if-not | subtypep | sum | summing | svref | sxhash | symbol-function | symbol-name | symbol-package | symbol-plist | symbol-value | symbolp | synonym-stream-symbol | tailp | tan | tanh | tenth | terminate-producing | terpri | third | time | to-alter | trace | translate-logical-pathname | translate-pathname | tree-equal | truename | truncate | two-way-stream-input-stream | two-way-stream-output-stream | type-error-datum | type-error-expected-type | type-of | typep | unexport | unintern | union | unread-char | untrace | unuse-package | update-instance-for-different-class | update-instance-for-redefined-class | upgraded-array-element-type | upgraded-complex-part-type | upper-case-p | use-package | use-value | user-homedir-pathname | values | values-list | variable-information | vector | vector-pop | vector-push | vector-push-extend | vectorp | warn | wild-pathname-p | with-compilation-unit | with-hash-table-iterator | with-package-iterator | with-simple-restart | with-standard-io-syntax | write | write-byte | write-char | write-string | write-to-string | y-or-n-p | yes-or-no-p | zerop ){{break}} builtin_types€(?xi: arithmetic-error | array | atom | base-char | base-string | bignum | bit | bit-vector | broadcast-stream | built-in-class | cell-error | character | class | compiled-function | complex | concatenated-stream | condition | cons | control-error | division-by-zero | double-float | echo-stream | end-of-file | error | extended-char | file-error | file-stream | fixnum | float | floating-point-inexact | floating-point-invalid-operation | floating-point-overflow | floating-point-underflow | function | generic-function | hash-table | integer | keyword | list | logical-pathname | long-float | method | method-combination | number | package | package-error | parse-error | pathname | print-not-readable | program-error | random-state | ratio | rational | reader-error | readtable | real | restart | sequence | serious-condition | short-float | signed-byte | simple-array | simple-base-string | simple-bit-vector | simple-condition | simple-error | simple-string | simple-type-error | simple-vector | simple-warning | single-float | standard-char | standard-class | standard-generic-function | standard-method | standard-object | storage-condition | stream | stream-error | string | string-stream | structure-class | structure-object | style-warning | symbol | synonym-stream | two-way-stream | type-error | unbound-slot | unbound-variable | undefined-function | unsigned-byte | vector | warning ){{break}}builtin_variables\*(?xi: applyhook | break-on-signals | break-on-warnings | compile-file-pathname | compile-file-truename | compile-print | compile-verbose | debug-io | debugger-hook | default-pathname-defaults | error-output | evalhook | features | gensym-counter | load-pathname | load-print | load-truename | load-verbose | macroexpand-hook | modules | package | print-array | print-base | print-case | print-circle | print-escape | print-gensym | print-length | print-level | print-lines | print-miser-width | print-pprint-dispatch | print-pretty | print-radix | print-readably | print-right-margin | query-io | random-state | read-base | read-default-float-format | read-eval | read-suppress | readtable | standard-input | standard-output | suppress-series-warnings | terminal-io | trace-output )\*{{break}}char_attributes(?:(?:[[:alnum:]_]+-)+\\?)declaration_identifierso(?xi: dynamic-extent | ftype | ignorable | ignore | inline | notinline | optimize | special | type ){{break}}declaration_keywords(?xi: declaim | define-(?: compiler-macro | condition | declaration | method-combination | modify-macro | setf-method ) | def(?: class | constant | generic | macro | method | package | parameter | setf | struct | type | un | var ) | generic-(?: flet | function | labels ) | flet | labels | let\*? | locally | macrolet | multiple-value-bind | proclaim | prog\*? | with-(?: accessors | added-methods | condition-restarts | input-from-string | open-file | open-stream | output-to-string | standard-io-syntax ) ){{break}}exponent(?:[esfdlESFDL][-+]?\d+) identifierZ(?:{{identifier_char}}*{{identifier_must_have}}{{identifier_char}}*|{{quoted_identifier}})identifier_char(?:\\.|[^{{break_char}}])identifier_must_have(?:\\.|[^\d.{{break_char}}])quoted_identifier(\|)(?:\\.|[^|])*(\|) standard_char/[0-9A-Za-z!"#$%&'()*+,\-./:;<=>?@\\\[\]^_`{|}~]Λ%xΪν=Y{άΖ‘€$;±’8§;‰ν‘([ ά²eΪ‰sϋŠ•›ΓؘA€ gμ·έ—ύΎ<μΨύφ·μΣώ€­ͺ>˜ΑEΙ[μξB£κκͺκκκΖhEώεπ£ΖaœnΈΏ/θ§e•zΌΚα—8 Σ4«Β*ΞReΉΐα78μ'Ωΰv0ΘΖc‘VA?‹ŽTΞ‹>^—S—w‰Γ―©\“8©β4NV¬ς=ΒαΧ9$aY‘€°νŒͺγO6e p,6=D<Ә; μY—M_δπj›—œ<Ζα·ί,“Μ η²W‘<5NOλη)Œ'TάΤέ/{έ†ͺ"KΤγ―xe1ϊνΗ½±ηΗAA£βa, •σ«ή ¨œe.”ΡΑηΧΌnŠ€Ažε›ή˜«ξŠC(Ζ’oxY­,₯“ρ›³e’,m–‡ EŠΞH>αeΦ™jHςIo˜κς:Tδρμ’œ&=Υ¦›žφͺΣ/ωBΆΚ¦οpψ½ωٝ6}Χ£δYRωž7 &‡g<ͺŠaDqX‰δΘ&“g=2Ί-޲"Ε<ηΡH§’–su<°3κxŒ‰HmΣγ _΅ΞbgΝc‚IfzsΝcψΜyωyΏΜ0‹ίκΚ±©ΰΊ7 Ηα Θ‚°(Β#§Ύu‡XωtΏ»ήpΛD5Κ’ΰΞ$L~σ3ίŒ³Θεζ?χx ^L—ίζP©!ΒγσY.`zeΊΏτ0–U# Ό†π+w2ϊšη―½\†˜mωΧ+K7ϋ·ž #1θ‹=ƒγίΝ"\΅γ»2‡H#•αέΪ –”|Ο£Κ ωΎ'ΥξL²Jχρ―yτ$ΐž~ύχ(G„l»Ή€r}θ ηšνν-€νŒΊΞ?x’Lϊι½6ƒ~\ GΙ˜ΧqΊη΄γϞ,ΰ,Γ¬‡U0ŽΣ8HΒtoξi\ύΕ£aωŠτ―žxcSC€γπۍ9¦ξ,Ξn“mΓ+ΝΩΥ œw=:«Žr—[έγ”‘¦qψDC>§Φ=iA™λ%QΘαSΝYφφ=)§q]›ž”«Λλ4&βπΩE/8Mmͺ±Ρ3τeF˜μq8Z©­#ΐ* _Ψyy“MŠΨ‚^δφγζίͺ%m6ΫdvŠT]Y‘»Ύ}ώουΆ¦;ίι•λέ«Χ_ΌρΪtw·»‘α½hΛ}ΤτΖt½75§XΊ«9)Τn u}υ’Χ;*=ΘσφͺΗ’x΄Ev=Μ*η{lTν½ιš*εϊό¨ΒU dy> ^jKͺk½©‚wΫ5ΐ °‘F/Ά¦Ρq―Χ·γ—;°ŸΥε)„%ώEs U0Β0Š©\QβYœΚΘΨ-·t’˜\©εLςQHk)“έIρ@¦ρa˜η€f±$γΙ‘ GYv›βE–ΛΆΙ±(LbHA\ ©ρ Eκ(ibiT6>CTΣClrΖΛZH©A"!i ϋΦΐQXΓ8I@―‰SδζΉ~£8œ@,΄ιΆI€2>-ŠΣHjxΣ/ Κψ]  ‡€”cL–BŽcYfρЊ01 ζ8θΝ*c0Ω£N‰t?.²γνΗό7ix86xŊΏΚqqgŸcqVp,5―₯˜©B³B—QU/$rNΚ³,V£`’5ŽR€WŠ"ΌMaFπΈΒ΅Ηΰΰυ'˜6©κ£JpΓUΖL”flBψ‰T„ΓHGΤΚ 2‘HE84υD…2R©8¬lΜͺkH} *0ŒTσ"՚H"QOT(S?ΠOLD=Q‘ 诈9cZ,ηκΑF`ήοΙ ­Λ2ΙPX1‘©¨z z$T<ΚRΥSL ΤUb˜₯Ί€=m˜}ΉJΗζθ₯†«ζQ<«άΰ„0§„In5θ₯›y]…  Β7T¨d[²γ²dΜXΐσJ‘“y0šηΔ„(2Φ«ΞP"£\‰ Ξηκ~Βε$ΕHrΔm Ζ  $Q$I`κ™X2sΥišΝ:₯˜ΆN²pή¦VB7D&yfκ€Hχ*ϋω8<΄S±]T Bk`§7%υq"χ:TNΖ&Ε4¬ͺΑγq–ζ2–«RΜtΨ$΅ρΗΐ#cA³ŠA‚¬μ€kA›y» ύ³ΰΰ~ E“Nš˜ͺz‚λc¨ρ€D΅d-₯υ¬GΈ'A©ΝkL*še―πτ“=“ArΎπΗ·™+?²H v<Οau Λ>P{Βj0R`¨."%CJqGGIeT)h™Μ$›Βδ‹Iκ%&Œ*yvq”e%%YΠϊ&«―tβT.Έε€ΑœWΓ$ +“œ€ρ>Ψ\@’W1‘E De"A4‘Ρ 1eqŠΪ¦γά8Nƒ™κ6,ς f03ΠξD)mP’H"J—ƒ"ξ +dύΘ 6’!&B‹β=xŸΉ„IGqARϊȎ#’V—¨•ŒεXE`—αΐ lO}%5Ε>I% Xϋ‚˜„„|9±5s€ˆΤη!‚ΞPkIC³Ίΐ*Υ2Œ‡ΤCβ_αB‘RR˜[< š=SΚι“δF©’4§άΧ@β—sUg”MIκ ΤC”RA š+γ™B)­CQΚΜJ2ΟSIΝH[εˆ ƒR€©)Na@s£ΤIΨ½ιΜέ'HFρ‘N•ρž~”ΛˆD8±a€ Cβ ω–D’’&.χΡ`΅ΙhΓ’p܏Βΐl-[± ΐΈΑΠL5Κ¨Ν½bŒ”ΩJ ±&#`Θ€βH΄Αί@2ΑHΝΡθβt‡i–Τ?˜€6ά™—&5|„‹@XψΔΔ;PŠjhΖΪƒγIRΕ aO#™¨βg¦,‡2`-e―σtZ³?Pf#ΑΜ)U’Ω ΎΘ•°’1(w“… ―;fΐ^(GYΉOgσƒό š²²r§€ά€­[εeΟjΔX<χrIψρ˜9GœZ³ƒΈΘθO@πH¨59ЍBΎ­Eηžάζ°Ε’knΐ€œ£¨ Γ€ΈΕ#a¨H)εΕ)Œc¬ζv Έ&€³Ϋh’μOφφ„1Σ<.οΘλ#Δ³«ce4a½# q'Q_ώUˆN` ΙDχ-4A¬t0© °*_χiNvƒ₯[‘Ν1ϊK³k¨zκUj2,{9’lΤ‰ΔμXV`m(ι4E™‘QlOώUkzŽΎ*£°“eο)2φ‹ΝΦΆΗVŒe\ ―όeŒ«SxΝ@T”(t YHNL©žiD ΠΒ’Nbά«€ΑχŒ¦ν*ΨΎ^=o mε’„oePp&|ŸΥ–­GQ¬«FJe%7π\ΤsKIQ 3ρΔΑ€•†%aΏΜXε€'Lo2Žƒbd”α>JmrRO gΰ€¦J£©-CšΪ@AŸ«]š/Y)_+³ωZ™|¦$4§,={yͺƒ,83š €€ QB’O.—yξ’Ι(σ}ˆεͺ­εm΄F kx,Ω0G9―ΐ½a‘‰Ž³N"ΣΤQH„bh|Bl f}Tλ‘i(ηouSv¨^’ΜΥ0ε†ΑΒ‹dγΈ3sO@ e,,RΞδˆH%α<¨’  ’ΧbΔx*8‚(5&8΅f§Ÿ’₯‹φ–Ν‹ζ8₯3RΐRO`»‘f³‹Z v hΈ£‘ɈR‘SΠΧΈ5ΒH†§%*/ΐαA+’ΔKq8H&%Š'†”iΦqEbZF+F#Πόϋ ™p0&QBI-:ΞΤ"Σq5©„›²³+€zG"Μ₯JفΈ΄ΨIο…\Ζ΄j—‚"DHΝ"ƒ Y₯ΨΒΨΥΖΒLA/‹Ppζ:n+W°rΊE³:ΎΚ3)5αY (θy`Ω¦ΈύgRΙΠiβ΄:吩ΕΤ΄P‹Δ~γ,KD(θ˜Ux(§ˆn51ζ%šζHζJa¦#€ίͺΥ5€€ϊCφ•–·ΚYϋ ­ˆXFh³’€edΰm”2T―,”#XXμ‘©΄œ“GOxΞΐΊŠU¬SQ*RGγCΩαDΠTΗ₯B ­”1‚€£ΣŽ.!1€dύ˜τž*έ₯Μ†ΥžΧ`y©ΣF^–™D#Οu€Δ‘₯ UZ©P²\6°Χ‚z˜l{FΖΪ‚Oh;Ρ ’ϊη   € ι…‡‚*;·ΆτΙ²p55ε¬BΙ΅mΙIkΣR›\‡ΠΆ"Ϋ Ή‹ΙI{χΣΝeο€2¨@ΫΈWΌ› ―LΣ>©ŒΎnbhbo˜˜RΥJqF—φ~(’ΈΖ+Ξ'Ω‘Ρͺ=₯ΪΡ©}•ΊN£³,},ŽyΤφ%χ.W%g’&ΆLY€Š‹Κ€¦6JRΝΞZΧ,„«0¦η»ƒ;*ζH0’΄3$[ΧΑρ-bŒŒβgΫ?+ά«‘όŒ9Δ_•QG5& σΠ ‘ 6—„†λ 8wξΫΌ§Ύ€œ'ε<ƒ=„‰’‡­Πξ,η%="ω¬Fp’κ½’Iͺ Œj $uFΕθΑψΕx˜€Έ 1£6ΙqC«.8³΅`ͺτΖD].Έ#"+Ψ™ΡV^λf€Ÿͺσ¨K™‡ΉmσΪXρV)xXΙΩΦ‘η₯Ž(­P»wΊ[ Rθkν*!υa+EŒXΊbf48`'‘1ƒ|h[š<`H*·ΜέrK­ GjIθΓY„Σ―„*&g,Ωρ ξH©P©Σ2Α„ šWΛd•ΘQ€Ύ/Τ‘#΄Ό‘⍩Oj€έυν›Άsηt}{|γZ·{Αs‘U6ά›7h%?ε\Βxικ–βB@upg};ΎHΔ7•€()qQΏj·‘ή κ•1―ί·¬mr+΅εbγεΨk`_˜ηιθΈAFΊ£g犫ŽΩΘ —-$j«σ«q—u₯½p"WΪZ?Φ/5ΈX}₯ωη [΅©·Zυ|M«Ψr·%ΟKΨ­« ­­4΄lQ‹Ua_³ι•λυ]…/5”υφ½&¨+.AΡq -PΎEA‹χsG[—©wk¦πcΟpΏ¨χΰWΰίjΑEόw4ΐ/-π3WδέΚ-0œ‰½0Ω‘b^φΥnζλPς„›΅ϊˆ9sJ½Π¦…ίΤϋŒ ωAcŠ˜οπŽ%lγα΄)Ώ§Τƒ’“UΣƒ‘H§;±»*fl’ΓͺOΰςΕ [ցd_/xΡjN!ͺI‘Βx’I£»}άκΐ u°% σ«Ϋ°U ςњF1ΚE•=έPnΟίpδWN zΫΠ€ϊŒ»μS½οn³EjΚξw―yίtšχ†nήa|ƒLγSΨr„φ• ˆ₯@Z™¦„Ή€»¨UίjjU{εpΝΖ—Ό cYΊ°§>1%_[iΑ‹ιχ©ΛNt žζΐε9Nρrˆά\xo\ΊΌΫ²a1―γY^©­R6ρρς’~k]Φ°ξΨR‡Šηœ:;9UΛ.Γnΐ;5°―WοZHdκaΌΩ»ΥιάΜοLΤΜwN«»gΦβ΅Σ Η–,λ πΏ6ΐ/4ΐŸk€±ώfόη πgjϊj‹ g‘}l-σύψ<-ΣΡ―Z|WΊj.Z…7w`}CΦ%4VΗž¨}ΗιΗΐC\;aπΙξζ°»=IΡ¨ΐή’ΚΎ€’ Τ]0½ ή±—dύ0ιnO%ΝŠ8―ΊΗοχ•6ύžkƒ˜Χaφ΄ƒ„η]$Θ]Θ³κΖ₯tγg »vέκΪ0 „„}‘,Τή–λBoϋφΚ½ζO—».cv8uα^Gοž₯wI_ΗρΝ‘EυΆΪΉ2ασeΈλΞ§;ΎD¦Ν,ϊξIgΡ3΅|j„3₯VνW’ιv³;οόM7ηŸoκΘ² O“σΫ9κ±6κ_¨ Εώ½SπκhΉ9 ήΗm$ήπ Έήέθ+'s.\oΥψDΣΕ™xό]ŸϊΥηƒύC°*ƒb;ΙXηRm{S›ƒ‡ΈςΥUEρ>ΘAWA܈‘3c“ΎεNγzXÐ£Χ »θΓX΄‹%τ 9 es’ γC‰(η yUd]N†ƒΪςDƒ}5—%Ϋ]fŸL uϊ‘s>Η?²γxΧHΨΦ‘„:<Λέ.W³ΚΪΝΤψeϊ’Ϊύ€Œη₯τΜͺ@9ο±3^‘ά+<Η:εηyΞΑΛ°γ©_°N’?šqε"ν¨ŽώΩ€t<υ₯sŽφΏ‚© ΄Οo2ͺ‰€|tœΙ3γΈSγ’c@ͺŎOŽI›­nίKΗ€OwIžα¦νΆ‡‹“ζi¨5€£Ÿι±Χν]Ι6·_Ύ3ŒjΌηψbη“—ΩYΝR«¦#·§ΚbζHΐΜi…μuD‡¬€Ϊ&Ϊ―·1I]:ΠC Z΄HUVςNY‘°QΎΑξK GGŠι0L›‡Υ~¬6Ή«λΐΆθ*pΖZ{Νͺ&“i:I’E•|·±|Ϋ―αφWUιu©ƒ,#I0ˆρo+α„+Gœν·;ΘΜωF|[ߐιδΡͺξΝЎoŒξ\XώƒtQ@£#’~ΡΡ‚ ƒi i̊ΧKtδ• ’y₯ͺ«ΣΥgΣψπ 9+”:chOF>z‰E­‚ ΰ^κΔ&c ΚN~Ϊϋ„Ψ1’h/R“cXD™δάξ0κHέQςk^Ν-V‹,Μ‚y;άxΦόΦr-pŽ‹˜‘i_Υ§ͺ:έm‘—1δ\8Ϟl$TFΥ΄ιmφnmφ6;g_Λ*s“υνή†VΒ¬+θκšοΩ&_Ο1)_2!α–Ÿ•‚+Χx•ν‘/O¬ΣωΘ€$¦:*p›€Υ…θΡl @©Τ!s$Ϊ:›>!]>ͺΟΛγ―€Π±2G ‡ς˜BΒj;₯MCνy\XΫ'‰}‚D« JΛTŸJPbΰ$βb˜€(an’ϊL3_P'0Ur_$&R‘Τ©qŒ.Vqdε―9d!α°oV™Ζͺcβœ’zυ˜Ό-ΗΐΩΘ”•β(`…ΗΥƒθ4€qΕW£ΗsH{Ÿ3Ύb€βθW„ηΓ=MΙ8Kρ…2Fβ+*PoΣ&\φ=LdSΙ‘N½ΧΕΡjήκ»νšζν½°|Σoάύ±«ύμœ%₯³Q38½yhνΞ΄Ζ7'|o₯mΣg~ϋŸΞƒΫͺΗ7nΐ†ψ™vzυRΕ<]3βα`“-+jIΔߝ–TΙ”Qwγ²4yιD4iŒOͺ‘½­“μl;7C…TޝH»₯€]β,Ι¬C3irΗΚ{ιφbβY­#±Χ6xm>bL#η\νΨiMσ§a@^Έ5ŠΏeLΫMβΣpΤrzί±–/θ‡qχ|8žχρρΈσΎ•뉆޽gχΰŠ½E(ZΤ…gΌ.Ψϋ,dĞ;¬ΧWšΠ‡'Ωγ1ΒΪυg»eΥ&°/§a92ψt…)θ%ΣOΜM ‘ƒ*9₯+iβrŠ—p%Σƒ¨―'UӜŸXΝζ4ΕoΌLγ!V›ΪnY§ζˆeͺ¬ͺ‡¨%GS>–·δ‰εUt&_¦:΅kv³₯σŒQ|_Ύ_žM•x;Γ²MΦε‚ VW†Ϋš*ž³‰2]zΞ™–KS©_όΏιβaεΧ‘O”Όn7£₯t_Δ΄Μ…mΥμΓ#ψ#ΒΑ¨ƒ–ψ“ ρΩ:FB•ρΨt’w·«Lš(0ŽCΪΑσXή’N|»VCπζH۝Ž&η‡σκ"BΏs§ΪΎ°2GΠ5‘ζ‘ψχζ”uΟΟH¨ΉoοΆj»ŸwZkέΧΙ‘‹ζiOΝΪk€ιΥ΅Εzήό]Μγ809J±RΦΧzΡΖNψPGoέ¬mšFυΚόQ1Θ»ΰα€ KkΌusqέιk>Ϋ΅σ±0\y-μηeiΨ4ΘxοότήΧ΄°ΔΠνυψC;½όŸο| ήϋτ£έΝ »Ωλmw·Q₯Έ…wdLίοΐJ΄­ϊ’ΝΙz|K™άζsΙkσΡm¬ί5T‘*Ÿqh+Ψ™λO*Qzƒt{ilό Œ΅tkΘτaŠ( M?€ϊ¦’F9ύpR-ΒΤσs0«ύΰ<’+Y ];/?}+ψ[|rεκΪ΅η_ΈΎήέΨ|±l½tγ΅ΧoΎ±ύf―ΧΫινώύ£9ύτ³έ‹²ώΈ$eΥrΦE›7ךq’βvΜ9Δ‹Η›HͺqΆlž•Ϊ^(₯T'­Ž}δΜl-K!Ε{LηMX5*Fφ:z£όZκ„΅‘xσNX›\ήΝ5°Φΐ^^ij?U’ˆͺ­λA‹†Φ©_[+s~gβόϋJƒ’π@8.M΄σoέ‘}KΛ|@O§6 ƒeΌ©œ_7ΐ[ο9ͺϋzk;οΆ³ξ©‚•†iύΚʜV{1¦ΕΤΘ y»ρ„ϋœ|x €[¬έzpώ>Gq¨^-‡ΐώ5ψyΛύ§ΕZxτμμw ~°β5τ©šΑΆ[χ m.¬œα Υ­4΄­©η;6Ϊ€αΰsx<΅ΦέύκTžKς¨Χ]”ζA:β‘3^¨EΛΥ mΛXdY‘οΉhsh E‡¨Μ<0Pse›MPŽiΓέ#Ο?@uu1Z`ϊPg*j™ΤBd­·BΦb†υγ―Υ7‘χΞ=£:ŽͺC­χΒ~©|Ήlϋ₯οslΐl}c”;sΚ[-₯ϋΥ…Δ­°tΧ„{έ½:?­έXi‹‹/sΈΆΣιU½΄Wt_Ÿ±’ϊ{mβp rjd5*fD½κœ–=vλΕmν±Mΐz ΧΧΊ w{εΖϊM3R±1ίa%4l.Σ<ΏŽ‡Δ&:Νθza›#BM½έhΩψζΉΉ_Kξœκrfy™,ςτƒοπvΩfI§ΒŽ,̝ιZγ §£/ΨύκAΟΠΌΎ±hΗ·‘NŽΎ]kΓo±ήlδ}—θ’Ϋίl€ΏΨ΅ώύψOΰ―5ΐ_o€ίl€oΧΰΐfie6)F7_m(ζO-¦MΣT[F+p¦ 2μ|lφ Π+ΐžTR±ίά>‘|›Χ\΅Ρ ΪΫv—… ΕanݘQηt τi:t™;wΧ|KΡ}ϋΚzc‰ΫΟԘn2q-ΐε…’πβ‰Px©Af7σl§―ύ»κΜφ‘gb6΄Α`ΰν`zG”Γ(ωΕ­_ΎύΞ.eFfϋς”²Xω7:ένΖό mΕuΆJ:ŒΎΥΚBίαp‘εq‘Y³$Xήςx6Λ5o@E-,ρWj°«-ρ‚/ή{·­Κ ι­ΉH²v’––σΞβΌ‘λ8TερηFϊ52‘MΏtsϊΖΝιλ7§N_οN₯—ίαt§SqgšΒ?q'™gœrt}νΥ€ rφ{5m 6γέ;ήgŠ6‡Ϋα―@γCη‹Πύ=hύ¬Ž}aŒϊΊtuΑ=εœ ‘fZsŽθĊΉγ'ΰΟς( ΎέuΥWF΅Ο"‘"’RvώίhΖregscνγλ/μφn‰’ί»r²¦=׈τρ€’«3Ο'Ζσža!ΫΣ ?α—κ:ˆΟ Ρ—›Ο'ζΗ_¬Αότፅo,<£ §/j~xQσΓ‹š^Τόπ’ζσpQsχ-!žlTͺΞ₯*ε­υVl'uE£ί½τΈΡΓ •€ςΘ`½?ή|ξ7+GϊDΡΏή0ΪM3ρΙxΠ[ό£ψ ώ«ψγ π―4ΐ―5ΐ›±~Πo: »μ‘Χ»qZΌν}š‹\ΪΦmηu9@wžύ\gœ:ZmόBdwΑ"οΚ5¨mYΤοVζ0N§Uφεžδ…pB‹ώόθ$ΟAέmω]΅ίΟkο²·)ύa‰ΥύΞδϊ†[χ\pΜ™Ήƒω~Έ όnς§e‰ηΜn;Ύ΅²t Γϋ¨©ϊ3C[y3Ξ2ξω¦οƒΡηΆπ?L_λ’ΘΗ0ΧΒ‹ΉΑΥΆ€|·Nrψhό˜!ω’ Πξ͟uιήͺη_˜~Ά»\VWΓυωΨΘ“p FY‰’Ι=ω³ξν7·w~ώα†ΣγS~Y§ί¦ΥLωmΠ΄ΛδŽDhλΨΏ΅Ξ‡τY Œc†»θŒd=Γ&>XdRζ€ΏΧ·ΊΫςyΦN4Ÿ¨7Ό,kϊ$mΰδ±ͺ²σεΏ—ΡC.ύwY’΄X₯žJ—tb›9διϋ›Τ+sΚίDYήj –xυ‘γΏϊθρ_5δχ? δ琖O] i« e΅£+&«ώΟ²χ£·²4q]Ί;Δu \Ÿ-]™ώΏ–#,ΗQ~§Ε`v΄*/{£hηΘ6ƒΤ†@-«±ΘΖPs’ ‡α/—¦„G>§”πΘiΡ۫퉨!΅%&™OζY ;)u‰ΊδWC€sH°•ΰl VΥΚ’Υd+~±χ«₯ χ  χ EγNcΊόwkžλ́&½N:'4M™₯nnΜε₯RΆφ=”©ΛŽο-1Ύ84βδ /<½g0paτ–ڝπ­ςΦC•iιαυVΆυΆŽ«mνTu7ΤZ<ώΌπ›iΔχ5ύΡ]Ίr—yΚ.Δ2΅ΘͺΪt-’’:ηS+›³!fwb§Φ«λΠΌFΗ»μφ`Ί#{#l[sωξJCkwηΐΉ½9φ>Ύy‘ν>pν΅.ϊΥgυ ‡ Όδ2lŒb_Δκ{2οKjζ“άM7k½Φΐ>^ΉΙΌξ{=† g‡••3ΌwͺίΔ Ϋn?=CȟΓk§κ&’3„W-n!OΦœή‡ ›†6rštέεWJ ]Δ§ž°‡Χ? 3―Ξ'Ϋψε•9Ÿΐ{ŽxŽΥφ=@#d)Ε}§j [οVmΑΩ{¬j ΞαγU[p&ΏW΅ησ‰ͺ-8«ί―Ϊ‚sϋe‹~hχΣ±ΫΊ7%~œŒΟ§Υ-\έΣG(@^Ϋ2ύ iv*>Ο Νz"ίό m΄ιz`ε‘›€έiIŠγvž8Α–‹ΐΩ@.g$1‰ύΐ3νA›Π 0JΊ=+©t::WΕGώ°Š γyI`"¨@οZˆ ΰa/H{Β p<.VlΐQš«Ψ€«GKrCkk#έ΄ΩΣyΙι¬ t/`/I>†ω~φ\Ά²]Λι=eœσΩΣΆ4Hl’ΨγŽd{%‹ΕΐHV1«K ςͺ„5²|Τv—=Ώ&E Θ6Ψ£λ’ΣKτ€AܐLΡξ’A2«›iRp©ρnIsOA₯e`·%/₯{Ό#‘)k@δ]Ιδf!Ϋ`>t~Oš8·L°1ΊΕΰ$GΝαέΟ²Αd1 Ei֐Hν%Ι䈠)ς<LŽ6ΚE^°Ε —σH$ΪVώ‘$xfΏM5‚=XRx—OβIΜΡ&H·΅•ίO%Ι2νΎΉΩ&ˆλA’šŸΕgή¦΅ώ‘dμpΤEΌεη’cΝσ ώ mxBθK‰82­ΏŠΟ“η‘Ώ`% Όu@iΓρx₯iυ΅$b›ΰ7’βg­Κ·Ρ"gΑž~'1Etb κ‘$~θΊNbnKΨfΜ:ό^’εΊξ™–=!>?‰ΟM©c’Š§χž’ΐοX‘ήΰ€M™άάLƒ­Ζ΄Υ¦δJ]’‘NΤ£γ#ͺ&Ι t˜†Νή”χψ:=#οάς’φ€•~Βg‘n{£‘s¨f2£œI§) |j&ΜγQμ›9HΜ€1L?Έ6)r96ΝΞφ<βˆMΛD–A8A’ΑHc/΄m4Lδ5τρ†§»˜jΝ-Ÿ™[^XωΈύg½ύΣΥφ½΅ΥVkF%LΙ?%³Γ,^'φΚω\όκ7ΐˆ½u0Bχ‘Γp€πHί4A­ΘΓ#Σf—YΙ©Ύλv%9=ώ.b€w}¬χψγ›6Φ‘!ξ!ΣΒ䖁μ"ξ[Žγα>TΨr‚84Ζp«=έ€ΆαŒβ“Iwώ3/ΐ€ΛΐaΣ$‡V@Z“Ρ“‘†Έο‘,ƒώuΧbΧΩ } Iϋα”ΖWj—Ζ«"ούΐ@žΊo^†/F”Μ“εψ€,A0m7 °eΪΘΗΠΏ)rΗ₯?ΐŽ8Ή}L₯ ΒΗ])jχV†-½§Ψ žΓ0ϋύΐ6Q/ ΘΩ π"X{˜2rΦ‰G!10ΡkΠT',"m€_τΙnd‘Ϊ™τo‘Iκ†Β‰‘γ<%gηr¦ „’4$?έσ‡f?ΐ]πΖΈk;pώ» 6αmV™…5Qo‹ΒώxΘ΅€‰Ψ‹ŸD=νJ6½Q›χϋH²―¬ΌΈηκΑ‚έ€¨‰^ΓJ”ό%Ρ½ήy~τΤσ_ŒwΎ-’IΖΆΜnŒ E<έ²v₯T]y*’»»jΧκ6ΒΔή&θpίρF:ψ[ψΣβv±ѐεl5½ι‚Ω% LΞ$ΣB4ώ­ƒΤ€•†‘νF–±+9χVνϊ<'ι30 Τ²zφ‹QΤΕμψ°š2 r&]²ζ’rβτϋΰow%ӏΦίdŒxTΣ΄! 0 „©žΕA1ΰ0Υƒu³ύς0eΈ G…1£5Λ­?E[$%Ϊ‰«*<'¨βI»ž4Σ¬šځi‘{<]Ηq εθ†<ξiVΡ,}YT ξI.EKΉH·D…©υνε¬`bχ%tZj5έ«ΖΏΣPΝΣ΄§"·k7-ΏςΙ.PŒ7αDγyΖCκγ&ΥH³OO‘Ψ@'W}’ ‹@ε duhόFΦp6δτΘJΰ 2€t0œ‚ΠƒΤT`εΛ7*ˆxcΉ΅™j΅(fμ.ά’AζΊ²έPΎ0Αˆ‘ @Η»Θ*$κϋ΅•ύXX(ͺ8Ps²Mz!YXqψΓδ`«₯Ψ[H5₯ xNθNVJβQ0–•’’ώ§VGΊέΨφδφΥ:9™Λμβ΄²R†κ ˜ΎΡH§]μQΡη›+Ι§eIζυω$βdΔCλd›ΗγvK·‘>@"Qwšπg‚£#œ#RΟΖG6Α59=W΅kImψB±₯fέg&FŽΓ€€ ‘ ‘œ€Άx‹ΝΙΜ%λ-Θ’ Ώ§»¨β96ˆυQ/›%^NN’νg‘ £e±•™ΜLNŸ”“ΌΘ†8_Lγxd%‰ΥΨA©»]μΞΦ€έϋJμFP{4²PE·Μα΄ΊtΧ%%BςŠ’4?WQψHᲁΈW.ί_­ζϊd3€dόXQC[Λ»4―­΄Š6³™ƒξΌ*\G\LΟΌρΟΔ½ΤήFση—ΑZεu‘2ΗQλ™‘:WΘOXζ΄iE†3`F1~«ΘΚoΛE°ΡŽͺ°δZεیš‚­˜MΪΖ–£ZΌbΡ”«ΞlozΤ_› ‘…9’kk‘Vœ›υ]Τ3u !}Œ6±6’ x NdͺhrΠ\vuJ ƒm Ωδα,Ϋ{η“Œrh°n4‰ Φζ:ΩωA·hDω/Ϊ΄k¦ΔΦQ Š”ŸHባό!”‡mή$ΣτZDΟ°ER–yJ†_jύoΑBZ7“‡H―—ΣΑg³©ˆφ;“$r6"΅\*Θ‰‡ΛρΞ™™ŠΤ­HΔ”5ΰ¦z9"bRf‡y’blމ‘IhΗΑIl NIΘ8 ‰Ε$Nα²£c%č;kτΚΆr?WfUσΒρOκcœώa¦­DωNθ% †f£μPΉšωΖˆ τγaga΅r±% ±ΦΐύξJΝΡa†“ηβef]ΟΉ?N]Θγ0Z=)ΚB³—“²™ƒγXH·;€IώYΩƒjrν½3=΄‹K*'rϋΆCΛΚ ‘ΖI›Μdˆι#«_₯Tb2ξ/š~ֈqσPΰ$G*Pv+$z₯bn^\΄l)Kʈ0©ϊΊ0κ ΑOmΠ7*… ƒώέ© yD’©υήSσmε4Iμ4΅!…ŒaRs¦6ΰ>ε€Ž?΅χ+IχDNmΜƒΚ1!’½q}jcΎΪΓνW1aŠΕ^QΊ -σιœqΰlΠ$šnζ%>Qά»‘δF·UχΝΓαR˜αŒβε© ρβή1 ώΞ‘γmƒ=ŠΡŽ+ξ½§Έw[ΐ*[-ΙρG5Ες π„Ό’Ν$³'ν ‡ϋ`…œyNif’Ξ“a=W4Νc9ΣΜζΈΖ\ΡB-¬·χnŽC@Αό₯Ά„ά/Ω"σe ±τύNΞύΗ9χΘΉyΞύοrξ‘sϋœϋ 9χΗΩ°―"ν}ˆRνΪ>‹/bm…δψ±φ\J\«X}Oqοn#gŸεάΏ\Γ΄'“Τ;Ϋ•Terbμς{žΥΉ™GΙ[c ΈgL‘ύ^ΕsmŽα§.7€λΞ‰ρΞ oNΚ›ΟtEΟߚ'™ΘΊΐ€5ΦI’:τ`6ŸαSdq™'τ±tαΉεŠ GŽ–L‹ϋŠ{mΕ½χeΌ¨θψΒ —γςς”πβήRc §Η?ψΰ/qn4ͺ$]ώξ«(KΌƒΓe9όj»ΞήJ«„ΠGe»^ktΉQƒ·Ϋ»$>ww|cwΦΆφ”Ρ₯ώ’׎°'3Ϋ₯[Ν›‚§S*³+“WOφζτ|==+Ά €‘Ž€P^ΌPž:žΒ₯.LT48ζΏ«ΑλG Μλ[sUN2ωΛW‹³²΄ψΰ—Υ₯ά93CΫI¬h΅Υ=ήLΊr―΄/Ν_9γjω`0P0έ1{“ φΰ^\Δ+π/«™\qf°Ψ§Œ1ύ¬N‰xΜ"€«zgσG >ΩΊ°)„A,•σΔχ́mϋ­άύ©„Rĝ9^«J:?3Άε ̞n1p£hSΐ8 ΄q¬Œ1²΄ΗάΥ•?mΆ΄α™~p5MΎ₯ŽH@•IΘI/ΪP"N²'‹A•έΓr―QΛB=χ:1τ¨<xTbx'³o"oŒ±*n:+Ι±iYh‘tJžΩž μ»ξΣψ€Άϊ₯φ‹WΝρ+"ε sJŸΌf\Χ8 γ0-—]W]£‡ΒˆEPšΆ’wϋΆ¬kΪųڊΆͺΩΌ€™μvΟ{α]”“ύΌΣMm¨ Y7­n€JͺΛƒΌKΝx~νςŸεW±σ;UwΘ_]ΦBν9δy΄1z m“|WMκ‘η%΄ŸJUγ¬Z m9·UOϊ‰d£‹†θk :ezn+ω7Žͺ~˜ςΩk_ΰ΅?>όαΙWΎkm{t2­¦† 1OΏ°Φs`*½` {]0•ΠOA#Ο#‘Oϊc·f΄B§$Y.ƒ₯ pτΜ₯ {Χ#ίΙστ τ,„Έ. r" }8ωπΛGdΠψ۷Ɂύ―/’δύ&υ&ν8ϊœκ³Πτμmτ€a_Ώ? wh,ͺUτΫ•1¬ƒ:ιυΌJ+*–[« γX+AΨvS’`ΌΝ.τΨιωω5±²eΞώΘ–΄Νλ*[Ε“ Make Outputsource.build_outputΡxΪ…QΛ Β0l¬θΙ“~€ ‡ΦΰΥ\ϊ!}‘ΦXM*i‚~Ό&%s™…Ω™έd}oΐLsY2Lyμ½c>ͺ½ΔBhžjΆ­ΝΎχΐςαz=gΞRsί)QX)ΪΛNΙ³’vΫwΨ Ηš~LξΓ6š‹Β΄@Οw! }|Θ£%¦JP²6ρ+Ν„K*―cFΰ‰ΆδYXαf‹¬ .XpΚ›’!“ζϋIίγ†ΐ—nE½ΘRey0΄ sΪΊcμ±Κ`»A!;`Makefile make GNUmakefilemakefileMakefile makefile.am Makefile.am makefile.in Makefile.in OCamlMakefilemakmksource.makefiler(?xi: ^\#! .* \bmake\b | # shebang ^\# \s* -\*- [^*]* makefile [^*]* -\*- # editorconfig )close\){{nps_unnested}})?first_assign_then_colonW(?x) {{just_eat}} {{varassign}} {{just_eat}} {{ruleassign}} {{just_eat}} function_call_token_begin\$\$?\(include [s-]?includejust_eat(?x)(?: # ignore whitespace in this regex {{open}} # start level 1 __ {{open}} # start level 2 ___/ _____ \__/ / {{open}} # start level 3 is like snek... (by Valerie Haecky) {{open}} # start level 4 {{nps}} # level 4 {{close}} # end level 4 {{close}} # end level 3 {{open}} # start level 3 {{open}} # start level 4 {{nps}} # level 4 {{close}} # end level 4 {{close}} # end level 3 {{nps}} {{close}} # end level 2 {{open}} # start level 2 {{open}} # start level 3 {{open}} # start level 4 {{nps}} # level 4 {{close}} # end level 4 {{nps}} {{close}} # end level 3 {{open}} # start level 3 {{open}} # start level 4 {{nps}} # level 4 {{close}} # end level 4 {{nps}} {{close}} # end level 3 {{open}} # start level 3 {{open}} # start level 4 {{nps}} # level 4 {{close}} # end level 4 {{nps}} {{close}} # end level 3 {{nps}} {{close}} # end level 2 {{nps}} {{close}} # end level 1 |{{nps_unnested}}) nps[^()]*(?=[()]) nps_unnested[^()]*open (?:{{nps}}\(rule_lookahead&{{just_eat}}{{ruleassign}}{{just_eat}} ruleassign:(?!=) shellassign!=startdirective ifn?(def|eq) var_lookahead,(?!{{rule_lookahead}}){{var_lookahead_base}}var_lookahead_base7{{just_eat}}({{varassign}}|{{shellassign}}){{just_eat}} varassign (\?|\+|::?)?=¦ xΪν]ωzΤ8w˜!άη0Ξ΄ܐp‡dšζ`ζΫ?φϋφŸ8dέέJΗΗξ±έ9–ζ φέφ1φ9V>$K²d©“Λ$φΨQͺ€ͺRιW₯Γζw-½.dχiΫ󽡖Ώ΅Ό(\{XΧθK@7θFΚιέhvΏΒΠyQΰ»ζΊλοδmΙiqϋγrZ,Γ 9ν#D{RNϋΡ~‘έ/S΄`· Z‘τ\«φ₯”kvJJŠ›’b½NKI±Zg€€OιY)ιSDz.»ί€HΧ{^+r|ΟtΌmΏeǏ„3žWηΑζ» ΞƒνxQτ’:Άμeulβ+κ<ΨΦW³ϋ ŠΗρB§ LώΨ»¦Μ‚-ύ•2 6τυμ~ΗλŽoN½ΗΩNλ»Q.δΧΩύŽϋΆνφˆ!ψ SIΚμΖT;λΚvή΄2 ne†;nΆνΐ±›nFο0xsG·sWƒ{κ<ojκ<o uŒ7³Œw1‘γΕM"’8S Fˆϋ5“eά;N΄‘q Κ³ϋ%YγOΩεξI$AΏό™Α΅Ψ zΆkvνϊιΠlΪν΅@€x~aΌU¦ωΖ[9±‘ώΚx_νΫB΅9B2έφ[vΏΖ!ΝΑQΏΛξΏkόkDΛηlΙ…&fΦτ•ΊqŸgώœ«PΟπ³ΎeoΒBPUŽ€<’1“4ΧΏσz[M€«δ;ΒΤώπSTγޘ€η9Χͺ!Χς$ίΈ&¨°Α4ΞN‘·@dΧ3@Κ‘ —χΌ.ποΛ”>¬φD›”Ώ”?ΨG§,Hκ’Ω€lctˆuQC ΏΈΨ@ε(kέ{;~Πϋ0φΪ‘Τν0vf΅xJΫ‡ΕήΨ+σͺZ’ό¬Υ4¬p’ώHή±Θ§5Sλ€S£ _·ƒN/Mqπ“Σ,hΚg€ (ΰΥΛΣ†DΞPJžΔΌ[‹3rζΧ·ŸΛ°—^ΚΩΟiͺ.px±ζ¬¦ 1܈eV@?ΌD·9F€)ώ–γ%ξ.Uώ‘“ίΰ9yšΙ’JΡjΚ*ς±ΐƒpΖ0Λ–!7Μ’&pλϋrή šd±6UΠXμ•χQρ-N‡„f•jύ±€ €»#–ˆ=3Ε¬Δ †PΖCo²3l@N΄Wχ`π(‘bž”φ―昫ΟΒΌ`εύςκάΚδbcU%)ϋRΰwR—œBΨΉ¬βΥkƚiX5£―ς“Έ5Ζ©"ΎχlH–)ΖoΙhάΗ+L YΈΑβΪ^§gw@jPδμη) nt†H™ΛιΓJ ϋ}vκ£IeΨλ&πŠύΉΩƒ;žΤ5sb #GOσK”· š;ήΊίί±.yτAψG°χ/S:ό{ΑΙ‘λϊ΄'#~τόHλ6Ο„Χΰ_]O‡Gϊ—‡Ίι#ΜψΪιjϊ9>¦ίC€Pάτ)V9r(sF9k“?΅ }πό?‡½υug7}nΪ!ˆ±>ύΙn·Ι_Β»ΐ?ώα;^ϊۍӀŒ¬ζ?8λιέΟ³½L”uh,»΅5ΚLަ>#f§ƒΪZwνmTYφ€O±­pβˆω½Ÿ}©0ζ’ΕZr˜ £W΄’Κ_\ΌƒŠ §3p΄pk W=‹Š§…U#ηlh“xPΊV– QΖΔ;,θΔωvέ3šΘΒΧΈž>u(m}₯qΝZC΄5Ncτž£bCΧω lκξx#œvέq]Ёι:TΗή«'' %'†°ΜJI―«Σ XΙΎ₯<Ιόš―ͺ'e|ItDε€5Ca§\@iΚ%[FΟ› g–h1žΫa€ζίh‚^ψ$ΞΙrΣKυσ:‰“\(S΅¬•{SS«ύδίt₯ϋ>³¨±―ƒ+eΰ{Η-Λ¨­θ«³Fa‘Iθ.K₯ή9I6ˆdΡθ†Θ?ˊeη[EŸί’υχtŽ0O¬5uκβdΊγιΡ†Β€ͺvγΜ±±ΈςΎf¬ΞΒJVΰέ°j9{ς2˜ξ‚mΰκσ:χZ[Kr%a5t% ˆiνAόΟښnŏ&rA-tR¨‚λl=τΐf½^ΧkΝ=ύΆ θolΠΪά3&ŒάjιJOδ*Ρ΄0½XBΛH FB&CBθ Ι£ώ (B75QΰbωςšΏ”΅8¦8BΎPiWΤn?Ξ_ΰa8XžyHΟ(&k Έ]a~…ωζW¨Xiw0_~ ΰ‰lΚ.zƒ3ΉN§άTωBIR žν¨-¦ ή “ž Δ:œ₯°›ά8œ₯°o΅’ π¨JwŽαξτ eT³άUλzΣoοq_ .fXοϋ•ϋΟ""EOHζβΙu‰&δIυΡr·(ρρSτչڊωjυΓόύ…†Βτo%%ˊ«ι'Ωίσ‡ο>2VΧ ₯,˜Ÿέm@ΛwΕνi™ΡiΗΒηwjVΔ—@΄SςD—ŽΛ·ΫβσXι'fβW,zˆ6OδκpWάΎ'U9•χωdbΠαχΨy<^’ή9€ήRρQ- Τ_‘έ<ΤΞϊ‚θ,θyόβΕ ‚cؚ–c•δtx0 gΙV‘nkR W>Y¬—T"8KνϋΝQΤr &©p{£ό+ŒΟΞ™-ψt¬{S\5„>5ŒmTǐ^α―σ^)f-ΌcΠ“ͺέ85G°ό |Н'Qjσ˜ll°oFLk‚:χσ©.žΖγΨίAΰ΄Α0φΖDšά‘Δ9K΄žξ› £m’/RmŸΓ‘$ž μΖ'³ρ»Tγ1pχCψ­Vήͺ•·jε­Z›ͺ΄«v[*Μ―0ΏΒό +νŽΤnKχάWp_b₯έq€ϋυ]’~•ξWψ_ᅐ•vΗϋ1ά'ΰ]‘~…ϊκWΈXiwτQ?ο{Υάw žIN&σ4}₯δ)IˆήOΘΎ 6ψηΑ„½0G t’lηΓ›Ή―qZΗΝ¬ΌΊ³Τx?ן]e_ζ*~γΛξEώμŸ―[Η‰Zχϋ‰ΥδB―kΦ¬cΕκ~xχq΅πξλK Ÿν}#‡6kϊΏΏ˜XNΧH½Ξς?ώMeMarkdownmdmdownmarkdownmarkdntext.html.markdown ascii_space\t\n\f atx_heading(?:[#]{1,6}\s*) backticks-(?x: (`{4})(?![\s`])(?:[^`]+(?=`)|(?!`{4})`+(?!`))+(`{4})(?!`) # 4 backticks, followed by at least one non whitespace, non backtick character, followed by (less than 4 backticks, or at least one non backtick character) at least once, followed by exactly 4 backticks | (`{3})(?![\s`])(?:[^`]+(?=`)|(?!`{3})`+(?!`))+(`{3})(?!`) # 3 backticks, followed by at least one non whitespace, non backtick character, followed by (less than 3 backticks, or at least one non backtick character) at least once, followed by exactly 3 backticks | (`{2})(?![\s`])(?:[^`]+(?=`)|(?!`{2})`+(?!`))+(`{2})(?!`) # 2 backticks, followed by at least one non whitespace, non backtick character, followed by (less than 2 backticks, or at least one non backtick character) at least once, followed by exactly 2 backticks | (`{1})(?![\s`])(?:[^`]+(?=`)|(?!`{1})`+(?!`))+(`{1})(?!`) # 1 backtick, followed by at least one non whitespace, non backtick character, followed by ( at least one non backtick character) at least once, followed by exactly 1 backtick )balance_square_brackets0(?x: (?: {{escape}}+ # escape characters | [^\[\]`\\]+(?=[\[\]`\\]|$) # anything that isn't a square bracket or a backtick or the start of an escape character | {{backticks}} # inline code | \[(?: # nested square brackets (one level deep) [^\[\]`]+(?=[\[\]`]) # anything that isn't a square bracket or a backtick {{backticks}}? # balanced backticks )*\] # closing square bracket )+ # at least one character )$balance_square_brackets_and_emphasisf(?x: (?: {{escape}}+ # escape characters | [^\[\]`\\_*]+(?=[\[\]`\\_*]|$) # anything that isn't a square bracket, a backtick, the start of an escape character, or an emphasis character | {{backticks}} # inline code | \[(?: # nested square brackets (one level deep) [^\[\]`]+(?=[\[\]`]) # anything that isn't a square bracket or a backtick {{backticks}}? # balanced backticks )*\] # closing square bracket )+ # at least one character )*balance_square_brackets_pipes_and_emphasish(?x: (?: {{escape}}+ # escape characters | [^\[\]`\\_*|]+(?=[\[\]`\\_*|]|$) # anything that isn't a square bracket, a backtick, the start of an escape character, or an emphasis character | {{backticks}} # inline code | \[(?: # nested square brackets (one level deep) [^\[\]`]+(?=[\[\]`]) # anything that isn't a square bracket or a backtick {{backticks}}? # balanced backticks )*\] # closing square bracket )+ # at least one character )balanced_emphasis(?x: \* (?!\*){{balance_square_brackets_and_emphasis}}+\* (?!\*) | \*\* {{balance_square_brackets_and_emphasis}}+\*\* | _ (?!_) {{balance_square_brackets_and_emphasis}}+_ (?!_) | __ {{balance_square_brackets_and_emphasis}}+__ )balanced_table_cell–(?x: (?: {{balance_square_brackets_pipes_and_emphasis}} | {{balanced_emphasis}} )+ # at least one character ) block_quote(?:[ ]{,3}>(?:.|$))code_fence_escape(?x: ^ # the beginning of the line [ \t]* ( \2 # the backtick/tilde combination that opened the code fence (?:\3|\4)* # plus optional additional closing characters ) \s*$ # any amount of whitespace until EOL )escape\\[-`*_#+.!(){}\[\]\\>|~]fenced_code_block_startR(?x: ([ \t]*) ( (`){3,} # 3 or more backticks (?![^`]*`) # not followed by any more backticks on the same line | # or (~){3,} # 3 or more tildas (?![^~]*~) # not followed by any more tildas on the same line ) \s* # allow for whitespace between code block start and info string )0fenced_code_block_trailing_infostring_characters¨(?x: ( \s* # any whitespace, or .. | \s[^`]* # any characters (except backticks), separated by whitespace ... ) $\n? # ... until EOL ) html_entity&([a-zA-Z0-9]+|#\d+|#x\h+); html_tag_block_end_at_blank_lineŠ(?x: /? (?i:address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul) (?:\s|$|/?>) )html_tag_block_end_at_close_tag(?xi: (script|style|pre)\b )html_tag_close_commonmark¨(?xi: )html_tag_open_commonmark(?xi: < [a-z] # A tag name consists of an ASCII letter [a-z0-9-]* # followed by zero or more ASCII letters, digits, or hyphens (-) (?: # An attribute consists of whitespace, an attribute name, and an optional attribute value specification \s+ [a-z_:] # An attribute name consists of an ASCII letter, _, or : [a-z0-9_.:-]* # followed by zero or more ASCII letters, digits, _, ., :, or - (?: # An attribute value specification consists of optional whitespace, a = character, optional whitespace, and an attribute value \s* = \s* (?: [^ @'=<>`]+ # An unquoted attribute value is a nonempty string of characters not including spaces, ", ', =, <, >, or ` | '[^']*' # A single-quoted attribute value consists of ', zero or more characters not including ', and a final ' | "[^"]*" # A double-quoted attribute value consists of ", zero or more characters not including ", and a final " ) )? )* \s* /? > )indented_code_block (?:[ ]{4}|\t) list_item'(?:[ ]{,3}(?=\d+\.|[*+-])\d*([*+.-])\s)skip_html_tags (?:<[^>]+>)table_first_row(?x: (?:{{balanced_table_cell}}?\|){2} # at least 2 non-escaped pipe chars on the line | (?!\s+\|){{balanced_table_cell}}\|(?!\s+$) # something other than whitespace followed by a pipe char, followed by something other than whitespace and the end of the line )tag_attribute_name_break(?=[{{ascii_space}}=/>}])tag_attribute_name_start(?=[^{{ascii_space}}=/>}])tag_unquoted_attribute_break(?=[{{ascii_space}}}]|/?>)tag_unquoted_attribute_start(?=[^{{ascii_space}}=/>}])thematic_break«(?x: [ ]{,3} # between 0 to 3 spaces (?: # followed by one of the following: [-](?:[ ]{,2}[-]){2,} # - a dash, followed by the following at least twice: between 0 to 2 spaces followed by a dash | [*](?:[ ]{,2}[*]){2,} # - a star, followed by the following at least twice: between 0 to 2 spaces followed by a star | [_](?:[ ]{,2}[_]){2,} # - an underscore, followed by the following at least twice: between 0 to 2 spaces followed by an underscore ) [ \t]*$ # followed by any number of tabs or spaces, followed by the end of the line )„-xΪν}Ω{#Ηu/HŽ,™–lKΦΎX=δhˆؘ!9IΤ ©‰μ؊e+±”ΘΔ4€&Ρ B7†€¦9qΫρžέYΌΘ‰³ΪyΉί}ΈOχνώχΎή‡ϋrσžTUwUWz)r@Ι9ψHv³PΛ©SηόκΤ©ξ:^Š>Ÿ‰―σ–λΉM+Ψ1ΊΆΥqά­ζΕ %ρ“u‰f*ΜΊL³NΗΧΗΔ¬£ΐλ9ξ Γqν !aF!3#βL*­žΧΎa|0ς;©χΎΒ¬¬Φfe]»Ώ0λ Νϊ@aΦK4λΗ ³ΎH³ΞΖΧΕ¬^―“tύΩyXŸΜΞΓ:ϋPvΦΛOfηaέϋTvΦ―OgηΉLσ<œη%šη)o”§νulΓXnΒ$Κλ§„Œ›ΆΫΆ;ΙOψŸxT±c1•θ§‹ °&W-ΑΪxB΅Τ'UK°!~J΅π§UK°αF΅†gUK0ΡxN΅ΔΛ΄ΔgUKΌBK<―($l84Ε&–™œU-Α„dN΅£j^΅’sͺ%˜Ό Z‚ ΙyΥLHTK0!)«–`B’«–`BRQΖάͺb+LHUK0!1TK0!©©–`ύΈ Z‚ ΙEΥLH–TK0!YV-Α„dE΅’Kͺ%˜Ό¨($ŒU—›ΈΔ„δ%ΥLH^V-Α„δΕn°ρ[U,ΐ†οUΕlτ(`ƒwU±»5i6ˆ 8}kΛF-²kmΓΪ μ‘Ψ;œ)ΌΎ―blP^ΫW162ΧR{% ‚aBή―IV _`hoJΉ_―ŸsVΟi'Ή>——‹υπσ|εŠΧ™μόυύ”bm}a?₯3Ώ(YW)₯ξΌ_Ο?ΞΚߐ )sΟAτX=©Π—βλΓγ…D6½_IΙθ=nIυ咜Œ‰_)ΚΙχV|}TΚιH³άΐv9J³8/£ΰ·R…•δXCkkh ΊIΝ_UΙΝκ~[%7λα;*ΉΩωΫ*ΉζŽJn­οΖWqύΤ·nYτ΅μ<¬Ώ›‡υϊ½μ<¬―υμ<¬‡f|ύ„ghm'$7RuΙ†Ξ ;θ½Ρ7ρυ!!s`΅xAoζdb\Έž“‰±ΑΚΙΔψΠΚΙΔΡNκΐΪ"zoά΄z#•ά¬+ΆJnΦ§Ντά]»oNΫh m‹[6oΕWκdi’¦ίvγλύμ[?°†ύΪ‰―Τ;Ao‚#4ίϋρ•:R¬ώΐϊ–Ϋ‘nHbΔω­h–žΤ-. BΜaίq­ΐά}iβb+Δ§GsΉΘ n-šΙ“hγό>4Λ ΎRφyΠο>PgD3¨ 1\‡»[C«}#‘Δ—ΨΘά&4C GΗρ±”}kx£γm³|£ψͺeδ3ή žGΫ+°hΉ›ρu‘Έ\7θχŒŽΧvŒMΫܝS 7-΅_ηrKΘΘ³ΠΘαɜ–܍―Ο”t΄Θ‡ŠE8ϊnΕΧgΕ"±2ΆΗ/Œ―Τ iχ|g£ίοIZiϋm+αγν’h;Œ™Ί4γοΕWκαλZΓαP„4ΫΧ% ηLšηχγλ)y8“‹f‰Δ1»•fόC‰Δ(#³ƒhΆ?’DŸ™΅4Γ7$5γμή1βΎ)ƒh#Σ\ίΚΜΕΧυΗcτχνŽcvo—ΠoΗWκΦtά²‡Rν;Ψ‹γπέψϊˆπ­Α‘ Νω=I.ΗsQ$αϋrΫB?‘ηlYΑhhϋ4Γ%¨δ lšεO$O·άiξ?•MΆΨiΎ?‹―₯δ“₯?—”ZκτϋΏΖ*1ϋΗθϋKiV4Σ_IκΕ2u’6$ι Λ³ιyΛM5-?·ΜΊω7iΌγ$4ίίJ7Ύpλφί₯±[^λΠΜ?Ž―Oge£ό'cr&eψiZϋ8ƒaυzήΆAT•fώY|2σζΙGc”,YhžŸKh ρ4ΧίK†oKύC|₯;jΘH¦_ύB#Α8¦™ώ1Ύ3b€/I‚!fΪŒ¬SΠ–bΩϊv2ΛKV&Χκ³Uβ‡h\–‘Λi‚6~)ηlUšλWρυίγ+έρ|Šρzxc4¨Ε6am©Fηί) Ρ¨:Αn χ¦ζΫνΐρ\!ο4ΧHΩ¦”ΣΏ§FΠς]#θ‰t‚Žšω3Ε s‰Ÿ»ΛλWλλgk‹«•ζνF₯nϊW:Λ4Νξ.$ΩΟ—λ–ρα5㽋Ζ+j8ovП³[Υ_U©‰ή™ε1KRgΞ9OH0u•–(bΥ7hf”σ|YGD›oΣφζΔρ![aˆ§²†.6ΖΦf?“”γz8}Cΐ'}9%u7¦ˆ,š!%I^ΨηNS"vτYDЦ™~₯Όή_=§Ο†ϊ oVgρM]kάZ\ΩΣ2?σZΛΆmΫΥ.j§­hh½ΤΆύΩ¨–U-χ3―mzxB±;ZkWσ\[σ65„Nq2R’ˆ ϊ© T'‘iyύ£ίZ^ά‹*24KλX~w‘ζεkͺΤ¬@λΩ–hΑΆΣΆWΕ,ΗΚGU3R0‹κž”ŠL ^Ζ)Έj‘”&OJS"ΕՈœϊmoh/N–ΎjB‘ˌ4bqR{ΛέΥάQΏe‰X-_σ†q£γTΫn‡J ΦΏY&΅«±Ό‘ΫZ‘ λ³iͺu”(A€ Ε³PλcBއg2ͺΎ΄šGμ|γΦβε=€| w w§@οπ<έ©š΅°^©"11;•2Ί«α[_Eξ/~ŠΝζežN+½1>Ÿςrκ»?Γ ϋNFz/#ύW©†NΜH½ŒψˆώΤΠ―Οψ6uFκ½>'ΪxρT‹†Υξ0{`Z*t.―PkΤλΩ+;#αη~ΚRς#·Œ,bο’₯Ήγ:δ—E[žvŸ8sήeΙΖ₯Tϋ‹ρ9’TΛ3\~>…Ž‘›Ιgz=Ÿ_μNΉ5s0*³ψυρτεο%=™ήΟΘΡu^#ΧΨ’?ΚΜ―‹¦2ιη+2bΝgbΟΜβΐ°τϋ<*φ»ΗV˜‹y"K0Tζ¦8;%™AΜΚ­Kt"sΪmΝBΏ}4ί Ρό³’9―!Ώ™f ¨ μ*ΑσUΛΦ0ax‰'©Άj’©ι¬YΡq΅Ϋ]$Βd–ζ˜%Νρ5δNρδͺΛȟ‘UhYk{#Τ&m›Sœh~ΪHZŽg@»?θZ>j«mΉ .Ωξy>ͺMΖxr#›pόLΗX6ΓξθœSF£_τ— Ό ΄ΣJΓSΙWό87š‚3½œ_™΄ςΙςχγ ΅•¦2εΑTνLΪΗ3›z¨”‘€ίΝH¦(­š&έ§¦I+‡’If₯‹ςQk’YlΙIhR"‡₯(ι›%μSVА$eR’ΒΓΤ΄χχ aϋ’“Θ‰Š|π²$ΜΝQ*˜›KP²%e—$Ν€KLκΐOhδdμXmκλ|;•a―h>Μ}ς‘{xf«‰=Έ¦–ύδΔƒΓQ•ΈŽ'-3΄φžMGžf,P'ĝ³Ν»`ιΡv'(yt=TnκεfS7['ΨΜ£½jš­C0Ύ>-̎«›\c3)ž”·―Ή;SƒVAƒšwgήn6mΦΖ’pόgν;\ €ŒHF8d:‹€;2ξώ_)w*>)ΉSΓNυ ϋC‰Y‡L§υ2†ˆ»aΧ=Ν±YWαΜ:¨;3λž₯ehmΧ’§θdfj†‡#Ίν`.!ηΊNk\Θηna\ sεz5g`6Ψƒ¦»NΫ€χ&’΅NΝAμ-«Ws=—=*ެΈν”v9vœgy^“¨ΙKΓˊ5€']]0ψοΊΚ|5:ζjTΝU#r–θ„uι’š.₯2κ˜+ΤΉόε3h$5ΙP\;ƒ $z!W…Ά<Π‘IκPMM‡$ΆƒS%•#Ό΅ @tWαγŠN΄"y­χΫ HwA‘ΖŠt’ŸsΐγY­‚*έ…ηRXΚt’50%έ G ΜG§h&£»³3Ρ©2λ»A^©Έ+f] λωq‘|QΪ[φlΖή QHa=ΰκ1ΗΥΉ\e’†΄θ\N8R θΠ)²MFƒ OήΫdœυ L'ϊa;rΊςMηCP§Iͺ“βΓv©Μ…:f 5vZTs-η΄ Z8ˆVΆ˜?ͺΈ Š4λ΄ zηr,šή¨¬ιŠg’θHd8EΊΣφ{Mzh+ρΆ.}Zαk₯ 퐜ΰRঈ³iΈDV)ž?E*U:Ζπ#Z:€¦_•ŸZ’OZΉh™f·q€ΛD’’φf.EB (zζ>KoTΒΞ΄sž'%“g™xœ5]± ί`\­λε…Ή‹ΰ3 v’ΟCœ@ϊδTy]/Žjς‘όεώ†$+πΐ/₯ZŸ―uhoΪCaxŠσOβγkNΉ{Ύ ΌΐαDΈ»Α&{Ϊq\w}£PΫ‰|(BRE:$θ ;u‘Q;=Ξ(V<=σ¨Ε€HžβA)šNΉ σ…˜0_,e|NY²/ΑP±J>›k•€=’cμk,T­†gΗ*Œ5r.§ή8δυκΟΣ8ΉΜOS5±!&ΙR…£N»[5O`α;z' ‰˜JxΊΪ/(BWάj†ΘζžσΊœ!ž9―Iΐο”Ήδπ0w―3@?ώ ΘΣ)izΔ-λ―tΏ—£¨ΒQMPQ14eAΛί—Z’+­WU»²lωΞaT:8ŒJ³€ :ΑβŸΏ” >C FcYa!ρœ—tνxmδ)δYϊ;·ϋδG•{žςΘ‚‚Κ»hwΜ…w.€ *193)ΓΟjώηY’<Ɉ’S|λϋn9ΉΘšϋ$$ΥflυΌφ £gί΄Σm―¬˜Ή?,€«IΕΨ•Σ©€Œ\ϋΔ‘±Žv}C>₯8ͺϋRεΙ4ϊ¦df#₯mz^€ό"ά&φN0΄ζ ςy$!ζl =^εΣυ=‰'eΊΠ΅τΟP ΨɎŽv}Όζb‡ φΚx.~œΉ{l75R:Ξm ω‘SΚVgQ'£κ)[Bc;]x₯…]M­žεήΠΚΘWεΉ½]²ε Z“%`δAB£ΙβgΕ¬g»OQMνƒͺhOΝηwΣβHζQd^EχΙΦΪ€ς†,e–9 £wQ-KυZRITΛxΫNΠ₯Ηη–ζ2λ4ηSΩ†κΌφΞΧ΄muπPt₯,•ξυ΄`w`ϋx0ΏψΞ—ίŒ˜δkφNΫδ;ν%­oνjύαp„- ΫlR’&t92γC?ΨνΩα`hλfkV'­-qAγΟ†Vό™Χ–Ή2ζΊ¦Tf…o§~Νx―Q\ζ_Ζ¬ΏώΉkο\3λωe^δΚΔϋ·Φ1 ֝U΄K:΄}?D.K§›;lY~τg‰tHxMδ1lyέ°m‘εOΨΆ1―ΓΆΧΓΏ[Co4;°ƒτάιωaΗ±zήΊ ΡοΝ°Σ ;AΈιΨ½Žoγ›-ZΊ νγͺnΣφΓΝ‘Υ·£Ώ8sw)μ.‡έ•°{)μΎv/‡XΘT’‹~‚~/t’RhΑƒVNaΟ 1†}€’aίvGδ–ε#QθZ7CΧ‹šQΠΖqΤ…h9„X|ϊ‘ά:ψί ΫvθϊΉvΓ;–Γ€0$脦> ΊθSF–Va0D?hs;υτΩh·Ϊ>Ό°Ύ¦Οgφe6<‘]ŸΔβζI†ήWq$+‡Έζcΐ‘謉U¬ ΅₯β;TάTVlŸZΎ I+”ͺ›N!Τ8‘ΛGF¨4Λίρͺ˜uVμ^όί°ƒ.’Ε­όΜMϊLIIΉΝΜν₯όΎŠmL~OaΏ!Ϋ>Λ›D³j‘n=φ’Ύαζ-h|+rΰ £šΆέλ₯ΈΈΣLςωΈ0ΆΘΧ"ŸΆΉ^ΚψπlΦi•2xWΞ❑t\ζβ™Cα’@Φͺό S†(&΅Θa΅ε"ς|F5ŸΚ6W«$Ci1B•Η΄•Ε'Ζω/³[Œκ:“˜΅³ν²mBbS[!{εA+wήhΑ~ύΦJ>'VDN¬pœX9 N¬'VΖ9±œΟ‰e‘Λ'–‚Λ‡Δ‰εqN,εsbIδΔΗ‰%N]'Μ‰lŒž'βgυTΌ‹ž= gD1λωΆΓΌζΪ>Ϊ†”PΝG4T qJkΫθl’Œ±“ΓΝ†žΤ¦„™D6’žpώ @?@?@?@Ώbτ[—q }‡φΪΈcWμΛ«˜<d/₯ˆ(…_L©»…Ξ%ζœ^MŒX2lf'p86- : : : :Ψ΄€~€~€~`Σ›Φ¬klΓοb5 xxxxΦ,    ί ±f™™΄M ζΐ€PPPP“ΠΠΠLΪco6g±i 9^αήξœ%O΅$$$$*@’>{½*ΏφNOΌιΨƒ‘έ&§άŒάhUΪ1 ^όϊΚ«•ΞΝπεΈτp m>>ˆΌƒ‹zθZ½ό#ΉΔW&ξψΰ₯|zπŒ²/z&EΟ“"=#7¦¨πH¦GΨϋ_Θ²LΧάΤφδά”WOθλ[υΉ…λWς{wςIKV€ˆiΫ@飬ΓτΞσoqo­tν>bCΫh mλFq?iφο(ΎιšΥˆΚλqΣE―5Κώ)yω /ΫβΧ·SϘΙώ€Yέ’κ{—μΎ~ΫGκδTΦΔ/d 9;ϋΟφzΕ/ „hŒΣgΟ—λ–ρα5㽋Ζ+j8ovП³[Υ_ΥΟΣBσΌάDΗ’Z «?@>?‹W•™"Δ"Ÿ‡)σx’˜ΧΙkXόι#™μ0ςŌΎP=~ gΪΨ‰¦Ÿσw—*QgTέZYΌΌwW)›V–uϊ‚*>’ͺ<_ΡΙ• }ρy\U5²ΣΒ Œ½»₯–; Σ΅·…S+Υ^Ά_£ΓpEGύXν[N/πVυυΊQ­™Ϋκku)Ρ’²YKώA«£V1tWN’ή=Ž\Ε5Φz±Ε*ufΧώΟ‘•™£v κ©Τ~ώMtžX7·kU³Λά6«ΚΨ¬5Fέ|·‘£dt«WulMΦρνnΝΝgΕΡμΑΐ_7ƒΎzαB­²ΞΥcc…Z=Fƒ43±A’SxΉ\& ρ_Κ=άήή6k:ΈθF―fDΛ –)‘†/3ΚψςΙ_Θ±kaŠ'Σ‚1I)„ΒϋςH½»O;ΘLvό¨™^&―cHή€(DΘ’x½N†xMK€ŸΎ^pΚqœ[mήψD)mnΐύζΊlVBτΗΧήΑLΉϊ€Πώ£΄ύVΉΩΤΛΝ„οΝΣΕφOet»ΩLz\oš~γ0xώHž‚œ‘ξS—ΌΉgΞΔΧ‚3g1Ε†W ™ (·7&vμΧUŒšΐWπD‡ pd#\X?{.‹³όΌΓ[έ±UaΞdλ«λΥΘ;£x 'Žδ€8ζŸQΑούΈ9„I›Š3"ώJr YΑxŒTk4_{™œŒ†>©κŸζͺΏ°ŽOAγΟ‚ΣΝΦ€*:*χΐ³VΧΧ\£™lŠN ε+Πό·„.φlΥLK“G|ςΝV4gΧΠΎ(YΠΏ/Λ€‘eœyzuSsΜv'Ψ­ΉVίNΙ5³ΏJη‹ ΖΖ#·ˆΩ”_ρΝvŸœL’yθ˜οE©šύ ”Hηνͺω0θΑ²™,ΙfiΫsύΐrƒσΧ"G­Ž>Ξ'|fš’£ΟΠ'¨’ltq|]Η'ΛΕ[`hsωηI$qϋ ƒ?ς₯Wλ$!#Ÿq#–H€:[σ‘τΡc,CqΛΜ‹Ξϊ)ίΞ GΌ³Έζo7*· šŠ€΅G΄Άμp¨ž!ύ†ž D‚ιE§FOr!ο‘ζΈ›žωSg1O1<ξτ{:Η_zN*Χ "Žί2@νΥj˜qVΒΧ$kςŒšVŽOπdLΥ΅Ψυ›£»FκŒNRŒuƒλ*ϊ65γL†V.ρꔀ1‚§Ξ7‰—L²9z©xΞζͺ§οϋ€Ί^5$Ž<`Ή[#kΛ6ΠρstΚΤ(—φŽΤΫ)>γc KGKώχ².‘ޟ,]Έ΄7γϋ‡t©*̈ KG‘Kƒέ ‹Oκέ=}uIU£"œ,₯ΊΜ₯]οw)ϊJ΅Zβ>ƒR‰R‘ξχ²FG°?φυ*—φ“ψώ±4ΊΒ³ζIΠ¨£Π(ΓύτιΤeUJ cμ΅κ*—φL|ι4­Zγ™σhΥQhΥϋΦM+φΫΎοŸ>ΥzYU΅>œ,εzœKϋF|ο§)Χ<{ε:ες=χτιΤ²²Nω'mIυ$—¦ΕχŸLΣ¦§@›ξΚTu/kκώΙ¦§Ή4ΊiυΝ4mz Ώ#Χ¦Ά€ΆΝω°} ?e?EΔ‡“₯XΟri4ΨεΣλ9ž5O€b…b G~O‘J)ΟT˜'K‘>Λ₯})Ύ?M‘žηS…:’½ή.kF.λ√έπCΏ{ϊ4lUUΓx–œ,M;Λ₯}%ΎΏ•¦is0uύ¦Uw:nϋ~²qΰdιΣ<—F?JΣ§s<_ΰɊ#Ρ'όŒ«YE2uοYa'N­^ΰ^‰οοKS«σν·WJŸ±3£θ‰ψΠΌεΕ½ˆ½Σ’ͺ!w ,αίς;ŸUŒ;§ιΑψZ6Mv€φΤ~H˜Κ:)TύΨ(΅Σχώσ β#ζY³žeŠW—7ϊhΰόXΆ «­ΗΚyU»“π}…‘ϋ„ΐ}πœrΔ>1ϊώ―(jΔζƒP,ŠB±86ίώβςM.&ΔγΔΔΔ;Δ[ηρλ ±ψ‡/;ί:ϊŽ‘"‘ι"/u7츁§YνΆ‡VZ±θkvΠΝ&­εΕDΝ½žΥ†ΥZc=§όΫdΑ‰Χ²VΔpDη™ΦΈ_6!Ό2uπΒswΫΪΥΉΨΚ')Ύ5Ξ[Ξ%φ­ZΤ"OŒν’2hBɎΧBNOσ«›΅hrc덂Π(Q™ρ»gR{˜’φ)i”·(–9ττι2ψ’—Νrρ‰ϊτ™|ω$w.dKV€Œ‚˜S˜‡ ρQδΖTΖw]yιϋ˜ΤΛ[8„@}c―Q1χ΅Γσ;ΜΒ€ωŠ]ώ5Ύ‹όίNaώœΟώ=gμxb³Σ-ό”―žEik¨λ’γaά Eψα…•ϊ¬Σa•6+Ψ¬`³Β*Vι€x€x€x°J?«τ;[£«¬Π“¦κΉMΥyτo4ͺΩΜ‘3ٍt£‘Ϊ‘ΩΛ.^»?7ΎfΪ›φμέΒςύ[)iίLIϋcεεϋ£Ιžξz-{Κ[Ρ7‰K¦ΤΛΜ¨˜KvΆέšσ|ϊVwBGn„ΜEE’Λή#ށΧχλΠσ€bΒΎ% <,χΐΨG­=+3Ž2xi/4½6א•G‡$ΑχHΐ°β(UepσvFϊŒτf€ϋιΏΘHύŒτ?ΙHχ2݌τod€mFϊ_d€u:žΙ(σ݌τ2‘ώ9mgiΗχ2ΏžS— 4τŒV!όͺˆŽ™HSqδs₯Τ†[\ΓiψσBΓτQ©z₯ΩH‚ζ¨ΕЦΉ\]K)IƒΨ]©W―4Š«@αΝRP`Υuϊ|Ό=a„FΰD„%5,©aI NDp"βββqσ• ž<³?ΫRμ{Š_Ά΄£_Ι_"jž±?KIϋΣ”΄?/嬙NΝƒ-Ώ^RXe’Ο©ρ_½QΚX$gω―^ΘΞύϊ~ΖΧ>ξ»*T‚²‚ΐmυΔχOβ…ζQ?  L0·ΐάs ˜°ΐΔΔΔƒ&<₯r΄O©<;Άί<ŸάJό―Rώ2%νo”Wβ*Ο¨¨τQ9ΩKόί(ZβΣBZŽ0 Δ½δδω ν&Knsƒ,ΊλX^IRƒΧΨ3)5βO5§›žΈ^°έ°w‚‘%Ϋώ:kψˆθ‘Α") ΔN'S²χλߘIγH9wH'κ°Q’CςΩ|”ε³™…`«XΕ€ίό6€x€x€xΰ·9~›;ρΪμΓg£θ±™ΛεœΒΪiς—§€ύ]JΪO”]/ΚΞ岟>fΊ&γzηI‘σδKEΞ“–^yοG’&· ƒΨύΎEσ‹ΤΞΥS™Λ—{3kdφϋjΙΧ₯tϊΦΤ«9Ϊ>“QΧO3³^ρωFN‚—‹Ύ>aϊ•ςB6*jvtL°’ |Ή”EΘάΡςϋ9Bψ§ΜŽ‚’·JfJΖY Ap‘α“Η·†Φ ‹”Ξ„&…‘7.½ʞτAΩz!ΞόfjŽ q€e½ώ_†U`―rΕο6.μα€NΥ¬…υJΥhθf§RFw5|λ+Πφ[₯όΈO qB")β^­ŒŽ€>[_«VL΅«ΛŠ©ψͺCγZ2ύjΧ5t[£R…jί.5xGΘρqyΥHͺ Λvκ,"NEΝGβ+9#Ηύ°ςAΎΘ/΄Ϊ}c–<΄™%d½¬ ’N4“|›|9ίΈ΅΄xyq›%ƞ¨ΈΦΌeεE|@βŠF…Κΐͺ¦ε/$y™ΐkI΄€ε JFƒΆ:Λη― ΪΣε=τΡλ¨"9Τπιώ‹4/_³Pe²x ΆΆ½*v`9ξ€(­€jF fQ½Β“R‘IΑxH€ΰͺERš<)M‰WΉ΄£ΣFΪΆ8YRψͺι™–Df0`EB¦:φbδ†ΐj‘p Q£γT#۝J  Yj;€έ°ƒoŽ)m5+‘°G†ίο6Ω"η^,ά"‹›υQδ"΄†Nkˆ4ρσ₯ΕgΒΤ/HEΙή«‘ΥγΎΏiυFΘk0°ΫΞ¦Σ&ω:όj„u­ΉΪΘ’‘ˆ9‹Z“tm•U†ψΤ¬­F¬Ϊ?—Pm΅Em•Τi€‡•LιŸ@/c‰ΐAνͺΰ5IΝ±Tj)žτMΏί]K‘ή€h9£½ΆpυΚ² "ΒGξ#―ˆδ o…­δ» vγHĘώΔ·Db#;n»7κs"Žy:·¨-,jW΅+‹ΪαΫυΈωP[¨o,4* Lά±³ xΆ‘*…αΚ$c!攆@qp΅=WߘkTζXΫoΤRk{N΅ν9±ν9j‘E1fΧ±yT™₯CsΏ6‹Ψ.KXˆ¨E„κθ.2ΝΒ+ρβ•τOkV§3DKƒω6šp·―c‡-ˏώlzn’Χ„έaΛλμ†ΘWˆΕΎ"Ωt‚έ&Έ6€τΧ°DdΪ”‹Š ιbuȝ)§ΤαΫX’oX»aο¦ ΝΊ0Δ9±!NΰI ±8g•―ΰΦΦU½Ό¦‹…ίA ΅Ρ°7α{Ω|»ͺ§·ΒgδuS€%"tŸTΎR΄4Bτ‹ ψ˜TΓgΕ…‰ΉŽΦbίοW [n—οχjη˜IQ˜₯€½Ÿ’φ‘ XΟ²₯/ZηΎMΌUWΖ­•Ε=6g»ΜRΖgŠΓtςyw*iŽnFjFζ‡Ψ«¬γφcŸr0y_τaR‘?­‚όe8Άgδπφb)z(Νβ&ΑΚ'¨›7ŒͺΎAAΰτ:ΧόνFεvAσQ‘΄ΆcEπ/α P=CήΙΣ²ƒmΫvΙ^FL‘xλ[lŽ»ιΕ6ξ¬ΒH5ψ/ω/‚œœβ>E…ύvUg2s[§yVςuSŠ\v]dglu%%Μ$z£€JάOϊcβEN}‚ Ψ° Ψ°νj@?@?@?@?8υ ΐLLL‹,Z@?@?@?°hαΤ'°iΥΥΥΑ¦›ΠΠΠlΪƒΨ΄pκΰ9ΰ9ΰ9ΰ9X³€~€~€~€~pκ˜΄κκκ`‚I θθθ&νI=υiέ u$Θιy—1+ΘΒμ$η;±7ΙK€adW›~U/©Αόσ Μ/0Ώ€u θθθθ/©Ώ000,Z°hύύύΐ’…—Τΐ¦TTT›lZ@?@?@?°ibΣΒKj€η€η€η€η`ΝϊϊϊϊΑKj`¨¨¨ƒI &-   ˜΄'υ%53Œ^0γlRίλΫΐzΘΨF’ΗœΖ4yuMdhQ%886emtE†,{εM!H]S9œ -}υΐΡG§2hψ·¬@y{RΣs4h£X5‹ΩΨv‚nJ€S9j\ϋ·₯ΪΟ‰‘8 «ΉVHdΞ΄ϊ.=Μ‚§’Ω60]sS»zam―‘Εέ-•h$ΜϊάΒυ+ Jƍο’.9šΣλΩ[V/“’™¬Ρ;“νלSŒΕ9”Γf a§”ΪΨΒ‘4f =Βq|#εYm ^[gR{Ί§–’/„'倂UΉH«¬ζ*Zί 0σ–3L“ ώd…9ύ—”΄NIϋΧ’jΠΘ>͈aζc]kάZ\ΩΛ\–σ’xΘԈ‚ΘΣ€“EhΝ#)μ!£dΔΉ$ξ=‘Ζhΰ)Σ΄Ό‡ώΡo-Σθ€BθŽεwi^Ύf‘Κd†ΆΆ½*v`9ξ€ώΈjF Άκž”ŠL v\)Έj‘”&OJS"ΕΥHό\Ών %SΰŽIᫎ#3G2ƒγΨFσ¬κΨγ0±ξ¨ίB(«εc³/jtœκΜ₯[τΛπtu} MultiMarkdown text.html.markdown.multimarkdown(?i)^format:\s*complete\s*$header((?=[A-Za-z0-9])[\w -]+)(:)0xڝ’αNƒ0Η sϊΕPc\’ΐ₯?ΊΔ_Γm.Νh„ ΪY’Ζ·ρEE½’Z /!ΏΒέqwλ˜|Ϋ>ς”K%W%Οε*IΘOλ‰Ή΄1rΉϊς[oˆάk½p Φ=Bξ έTϋmμ:°±8ΛO…f₯) /Ήή€ͺ–ΔIέ1"δ}tSΞΞβ·†ΧQσΜoι§― ½ZΖσE=‘ΛiΝβΈM ;'6΅ν#+ΠΉ|`F>"υZΉΊ¬•!ax„ΐ9jrοο€ίϊr|M‰§ι βXeΑl'έΎς›N΅€#α?KwΆynsx…‹κΌ­z…-ρR+2™£όTŠάΉΓ!W’UbΛ5₯Yσ#ϊΔ #†΅s•ωƒυ₯΅kψΐ΄~(MATLABmatlab source.matlabid [A-Za-z_]\w*³axΪΥ½[“$Η•&€sΏοάgvv8Ιn]ƒΞ9$‡,ˆ ‰Y4EƒΰhYd[ά3:γVqΙ¬¬ Μd¦™^%Σ“τ¦ύ™ή%™~Βώ™ΙLzΡ£ήτ}ίqˆΜͺμΒrΧf¨8Η=="<όrόψ9ΗΟω‡—μί?wπ‹AUWOƒ’xZ}„O£Ί,“ͺφπ₯ΓΏspKΨΡ&Y–{ΩΑ?8( m±Ώ^ψ•šUΤη@¦rŸ{~Ή‡Ύά/<ΏάΚ—ϋEχ œϋφΊnζ7‹JNοώε•œήώ+ώΦAΙ&h“jΡ6Ώzc©oσ*›KύΪσJMuϋυ£―yŠzε•υ7ŽΎΰ)ξΪήό›ώžƒ7 “‡G΅Έ‘θ&Ωοκ6žŠώφΡKQ΄N“ςαQϊΆςcΗώώZ;ͺ+Tš#Άή&m›ΗΙΓ£ώ3†βΓ£ ϋBI?Ν}ŸψBΏ\¨‹‚&‰Ÿ^ u?½ξŽ*ξŸύ†κ²#ώΘΑ?ž~s­lίφ΄ͺl²ι]|tίaS? ͺ ΨwωT?9ͺΒQqΌ¦oλΒ—ώΣη—Ž“nΣΧΝΓ#Jς§7—Frΰ’GSmώμω•―›€ ϊΊυΕΕQ'Ησ§²~49ζIθK|ώζλπB΄οqSόΕΝUυ₯Λ:ΞΣ|~ύŽΥQρ~ίL=ψ—'ž<4MέφO“Λ>iΡ‹ΎψŸ_όx¬ύΥσ‹gmΠ¬=ς₯£Ο=*ήΧuΦ—Oƒ€­»&ˆ¦ψςΡύ'ξ σ:―Ί=_ΉέΝ€4C•GΏoΊωήQ Nή¬ξ|Ϊν»>)§»ο5Σ©»‡v›ηφ0θ¦–ώΪνoK“$φ·=8šC§nKΊ<›ͺxv4šOά”\FIρ΄Θ«Ώρ―pβΖ4/0ΈέKŸγέΟ“θ΅Ϋ Ζ4―‚*Κη)rάT/Ίhσ-†Υ6™ΖκhΊ|ΖeΒecsκ‘GGϋΉ·6˜Σ2ϋϊ-οφO‹:Λ#η׏(κ‰;³ ΦώžóSχ$U‚Ω Φ0«ΫΌ_Ο“ηoަΰ‰δ%Iή 3ΰ›·›@vΣΦQu‹ωχ­ΫΥ?ΗΚΩδQŽiϊ·ΦŠ(ƒ¦YΌφoo7Ά±"`RpζbY ŠμΖςΫΏs4Sžϋ”¦Mβ<βψ<ώ„7nG:«dh1ΞΡ‘X)§Yϊw7/ΨΗ7ΧΝ4ΜήΌέ¬¨›>/σ«ƒώ—GΘ‰[ΫΤίπΦν>­­Γ‘»Φ΅ί½έΠ$έ ŠΖΦΫ·#—]ͺ7MόwnG.ΑΘυy·\ί½έ*ΤνΛ°.0ΙJω{ί»±³uο)˜βͺ§τΝχn·†nσΆΠ\m‚ράούέίΏέ4ΪΫ€H&Zχώ͌ξ6hσ ,’kŒΜί;θ7 eR†I;5αΏrΠo ͺ¬Σk›W[TwZ?pΠοƒͺΟρΏ>vΠοΌ< :½ηG·n>tΠo8Ί&Ρ­μ6ϊE}?:zŽmΧό―ϊ¨}T]SΟ\ΐΗώΑq,(˜ ‡΅zβ ίo ՍۖOτΫίώχ:ψ{GΏ? :Ξ#RX_τSηΈθQgόΘΑpπε#ζΖm.ΟΒ’Ž6gθ‹)¬g6Z^Zάζo=h–Ÿžw―ήϋωΟξΎY~ϋ―ξŸWoNw½|τΦ—(NΓ!8h¦œΕ Ψ­^gΎRV‡W–wN;“€Ξόσ†ΚΎ²¬¬Oœδε£qY.Ρt˜ŸŠύ©ςςϋaΑ=YΎsωΓοΌtψοεγ•ΰ ώΪ.»w±δηn¬ύΟnΟ^αγόίιζΎάτΟoΨΟΓ{η»―b<|υήχ§―œ χΖο&V€οJΪ³zθ›‘?σdj9πœœΫ£žyzr6Οwηη·θ_>ZnŸ;£μ¦¦=hi‚ ήΔܘZεΥ{ηχζfωά‰fΉύW·‡—pκχgσΈ _ϊΌΙ`tξ,L²ΌZ Π›ΎΎ‡ΘΓ_Fά!…ΈΕgΌrjX̞_žκjœ‡Ÿyά-žκŸρ5όٍ Θ'²Λݝέeψ½r%˜j<}ΛM”ρ6­sοtλδΥ€ΖΉΌΕβhx.(υιΥ"*0y°Κάz΅Έηsφόε Μ-¦gŸ'‡σδ$‘ψεƒϋgG%Όχζ·9[ΎcΔYχί|!½ψ㦋Ύχ•Έό/Κ+ϊrˆC£δΝψβα %τ·%ρƒkο~ωˆ,¨G w½O~αΖ>™FΕΧnέ'Ηƒγη2L£ΉΧή ΑZ‚χί‚t}—ΔO†PŸŸtγΫ΅ΆΖQaυAΔγχƒ*.’·λ²Α 0―Ζοη1φ γϋUІ«Ϋ·έ}Oΐ'±ΐ-ΦΠ?9=[oξύϟZ]lΣ][0gώΪ4(ΊdΔG%χgzα‡Ÿ’Ÿy!ϊυ†{ ρO—‹e/c«υ$A/OέqKk}ŒoίITbό^»}vI» ½ύƒΊz»nφΚz2}rPτn7r<μŸΞ ΈΣ ›!Δ†yDOτ ΙI Œ’Ύ»_ϊw(„Ρχ¬bΎkΖϝY>ζblοy¦Ν`|F1H‘ΌˆδyααWΐ7έ;Ιx~<ΩψΖψoΗοŒ7~y<ΗγωWΗσWΗσ³ρό§Μ8οΖΏΏ=~νώύγ•όΔr»iύ\~ΧœψήONδt«vˆλ!,^ΈΣœXβΏOΊ‰ψΌ|’ϊtCYώσ[œΪhYρ—_zΡΏ›†Χo<―πΑχr…{_ϊύ³yŸνϊΣ³}³kΨk»ωŸΟ~|™ΧD;!ΐ?’VWΣWό\ήvͺρύΦΤ@7΅ΟŸ΅EŠα[η¨Clz"_œΘσωŸ?‘—'ςΏp"Oδύ‰ό~"ΟNδΙ‰όΏ8‘₯ωu"‹'ςΏ|"+'ςοΘΏ"Υω_=‘΅ωN䟝Θλω―Θ_Θx"ΤΈ}ύDώΧOδγDώߜΘζ‰όoΘφ‰όΏ=‘Ζ‰όοœΘ»ωožΘ—'ςί:‘έωoŸΘηDώ»'ςί;‘½ωί?‘οΥ 7ΡΈί‘―Oδφ‰όί:‘ΓωOδθDώ– ζηgόοy;σy‡B%\^Ήμν­Έ’λ2Ο›ίt$tΊ•@γ$ϋs­žψά»ϊ·ΪΪ`›3ζγ³1―RnƒΗ*ΐ)ψΑ˜4έŽeήψρOίψΙρ>GΫƒΌ‚ζ{@lyϊδ3ΆΗ?ήAͺ~ͺ^ΉuΜ7|άΌEΊεfμŽίφ•―\ηέl—™¦κn/πϋ1~^ˆίtΓ)VκχΏSr£ηszŸ»©:/½t‚ω₯ΣΫ³?<‘»w$7ΏwG2wWςτ―~Ndλρ ΘΠmΙά)rφΑ‰όOo;Βi6ˆpΞ›h” Χ__—y5R¬Y$UΦ―™I*AjQγ4©3gΆ K:AΚδ?IΥAΕϋWζŠ‡έ@³₯δH” 8ΦΧQ]FW™Ϋ£8χ#ͺ°Υe₯k…kΫFu’ΑMqΩy;F“ζyŒ†‰ζjŒέ'Ŋ{7χξ KΫΊ\Ό=Nzˆ>β1ΞΡ^iΪσoΕKΕK·Ξ-k7šΩ˜«1E„Τ+/’4|³Ηwω•rΠ=IΫ€nλ˜iZ@*ƒ΄0i…Š=ό3!λ‚ΰŽ}Ϊ)« žTΟΎfΞY¦—?†IZ£³―gdτ»$©”ƒ·΄AL™Ϊ˜Η$ξ#s6D–ΘΥωΤωE;rH• †Y™Δ9†VYΔωΟi<4–­K΅IYoρΉ@\GtsΓuGΝΤ]o„GφΎŠΦm]±eηίGλφΎ[tfί±#ΞμcϋŽΛ Κu4!\Œω?:"ΊήdωnCώΏœηjˆfߌQΐ!τΡztlI2&œΌΌδ)Wοέ1‚w!@ލύ.G‘&:6Xoέm5Κ ήa݌έ.ησϋv?ξ‚ΌwλΌXŠπθӜ‘έΎμ½ΟΝ“9Ž!š_¦fEW‡C^Δqu ϋβpŒβ1Z'ΡΏ B[8FE„?”ΐ5oΒ:hQ¨¬   τ_η4Lήϋδ.―b|7RP¦a Fc8r†£\Ή…h’o‹1ν©€5'xˆ›0‹Γ‹!g -m φC'$ijš@ ΐ“pΘp-kLύՈAWπQόC-Ηιϋ€ GŸ,‹ߏΙ%.¬[ΠC° ΡiθC•wλΡ̍1α*΅&^β„ΙΨt\'E£‹Ώ8Z`\טλσ#&±―Gτ’5$ΚΡ&cQΧŽ’­Gh#Τu™Y²mΛ ?«„p§·k‹OΓ/œ¦ΫDΝ[Aξβ™#ψ« “γ-ˆΪηA‘ΚO—ήAA xpAΝ/pgΈΑΎ[£›6IωjB+(Ν:ΚΓυFΒ.Ψ:99«ΩΕ£ϊ―M’=Ίp 4#$Αλ‚‘θUΆδSΫR >Δk^Mτ­3ΝόltΆ`ΌQύ?` Mγt¨ςΛƒkτ πθ>Yƒ°οHWvIˆiτΊtU²γ€ΓΠ@] I»o“l€£¬Σ1Η{δΏΰΕnχOMMw–αnSσ Ώ2OΝΛ_ΠΆΑ~ " S^b]ΧΌφΊ(ƒσ7ΒΓK¬+2rŒ D[] εTΗPδ%Φΰ tYιλΊΓ  >t Ρ`I±v0wπ™ƒχ€} K^E‚¨IeΊ χΒ1,0bdt—ΰ‘ΗpΫΌρŠ D@ω"agΙ˞5B―― A!]³&QJWm Ζ!ΙρK²³f\ψrΒ‘Αjϊ’·‘­mXIΨΜ₯HQP Ι% z¬K’g;ήR=«²ŠbBxι\Η:,Ω3…ŽˆΪΊ-φ†:C}~Δ΄ˆ »‘‰*ΐ0€+‰“Υ#^ωύ²ψυ`w bŠ…mƒbT«ΕyΧθ‚i8Ζ₯Ύ"Ζ»YcόŽ ΖΟ l°*΅)"]rΜ ΒK^•g”Ψ΅)ψ”Λ†€%₯.ΗdŸ€A0QΩ ΔB‡™•βEq^ ­ΐ€_@Đί² £΅i›\h)ΫC·^%m=fVyŒΧ,ΐjaWφ£΄w††ΜΚ–l“κš΅Π+bNΘ£ Cαnλ JVLτMR€£S°”† ΏνGΠzίΤδ‹Œ“Ι‹a€Q8ΘrΌκ†Πργ”›ΖΕ<τπΒ!+9HφI*΄/ώτΎœύ„5oά€Ι‹¨‹Έ τyƒRwϊ_uuͺIDMTΤΎ¦kΓλŠ—’W€#ί\tU]U Rΐ°r ψŸ‡―ΑC΅fېc–›¦!g› L°Ω›±ŠU¦Bgvc•\φM½[Uu…€b!kž.œΩ4_Ε~¬lRΖꊌ#–Ώ‡ |=7Π¬ΩΥ%zBΒΧΏΞ«ΪζBm³ΐh@]‘ζ²Χ―Dτ{«Ω pqΕ+¦ΪΠΡ‚†M>V,PŸ&ZηXΙb(«yεtb—t£ο˜†έ…IUα;ϋ€fERCd―KŒυƒο"Lsϋ‘S…PO4XŽjΈ¦Q^KvvΤΜoΊ|Ό(Ϋρ‚sƒχ^΄œxΣEλˆ•¨/…ΫίΥ’ σRιͺYdƒKΟ?0ί’]άκCΨˆΟ 8(Έφβ€!Χ‚Q°†όƒ0ΑΑ²#ρP-|'Zΰ[―α:π‰XέΗΆKWQ—ŽΦΆ\J΄’h!]εό'λ8rUΡ’’5E;₯Nλ4.δƒF ZT."lΑκ υHΐHZΩ]CJΗ’$<]ΓU$ί:Δ,γ4Ί) ΥB*!D2l°ΥΌ KzΒͺu«_5„+UymJ‘<“~ΰή—\1(‘"ρ#R-¦1iVK-–} 2šχWάΈD΄Hiς …7Yπ‚υF t‡’9T;lx°©bq+"΅¨&[…Τj—’ˆjΤl\lώτˆλXœ‰ΌηρΉΕ³Z|@…U=ΧGDeC Ε:—””ΧΞςl‘r‰μδŒρ˜*všF$;ο",P@uM ’9‚ΊΔ•Œ6LeΣο Ή³φ[£΅J2ΤΞv‚y—ζI ‚Hˆuΐ²’uϋZfHDj•”€₯#ΉΞΈ!Φ¦μΈΌ{lYKמΐ0Y΅mξtCWi˜"»,ΐνq ,€&nή‘^©8_>ΜF€ η 0ψvΩX bk±ΊyŸ{kbDX`Ζ»Φς]ΠžϋςΥμ'܈a…+fƈŒημ£'!νV|°Ϋό°αfŸ ό#Zμ|ƒ€G£osl$3ͺEΕύ’ΠJ s8•ήtΪ£φ܏X>cξB9€xD„7jζEόv˜ &"ΙPh4rDφy£½˜^ΘKE ƒ3–΄¬XX‚I€…{KΦ°Ρ2•βrLκ2o–΄-ΗΏ^¦υ†—HWTϋK¬ ©~ΠΘ5Y™*Ύ‘Βε‘L6u&¦œq? υ\_Ε(4Ζ£ΣP«ϊξ‚δi,lΪΦΓΪ0ώ "ˆ16Gšοa©αΫyΈΝ±βηβ πXriV=J΅c9T‚UΠfΡΪ P¬9\•[U·mδ6ΪcEΣ@ξ Φ$‡IθW°Ϊ>Ά%ρΗ&ΕX• ―σ-ΑYT‘‚cή`2£Α"‰PZR)9‘xU³‘Ό©}ya)1ΚέPω;0:bƒΚο±y&hΉΞiΪiQκΫ­^ˆ…#θΈϊΑ«ΠjΔ8Ρ mšbΗκ»«ΫMΈο-.܏ƒNKμΥΪU՝0aHS΅±…π ϋΩO}CΠ·αxΫaθαoΉ*|A=ow_:‘άψ₯ƒ·ώΑό’Ω΄QG)–‡N™Ύ¨Ηχ}v³ζ›ΎδWΎδ‹7}Ιθδ°‰–„ΐ)nέ†·£―r@_SA‚^Fy>CœΧά.bΠ‡FΣ©TD/4άƒaG3ζ1ΨζβΓνηmίC°0XΧ+аυNšš»Ϊ؞¨B€φ”¨ΫZF·΅Œ8ΈPF\”Ϊ …vošΤΠ•JAξ ]; ίάβM[Ί‰ι© vΏSPžΌSeˆΨ)ρSG&ά[Ϊd§½«΄Γ!qηf΄o΄+Υη»οΘ†κ [‡Œ—5„ ψϋΊ.z=•ˆέ°v-²v-(ιY^Z~^Rrel΅Dξ ΓͺD—)έ+ƒFΡ~§Φ ΧΛ“ze€”xΕ₯„ό,ξ'y»OΩ“Υ ­ΡoΙε:,™Ψ^`ΜΙελ iEObΆK‚4@έΠƒώλ‘DΨh£-Μ\"‡ά>¬ο΅Ά‚ξXενυ»`kίD‚ @•δh$ζΚζ•j»Ϋ›μό]h O[ATΓ™!(Mcō–·xfW¬.Šx―!y%ΈΖ?=‡MŒ‘+VO[‰Ε!Β όh•\ ¬θΓ‚k,σω B–k(βΔκ_iΝ[™™€P²BJ[6υ>«¬=Ω=reoΈ)τ­θύ”ά­«£ΥetuσΊυ £Ο8v5Φ–ΨGδ,ZΆΠΓoπϊHβ˜oΌΞλ7GΟ©›α±ϋ.ŒX•¬ψ`ε ΎΉψΌί;ϊ<½wϋ΄ί^Πγ¨Ώt£l\ΰ9ΐEβSςnΜω^κF“Ο¬‘ƒKz3ΰΑjΗ~dΪ±Ηθ„λΉΤε#Νό8‘ό΄γ£aΡ H,©ΓF$e ¨hΙΛ͎ršζέJrΔ•a€ώ•3GΐτžT―Ωνδόη―*Šo­Ώη<{6΄žlΒ›θ‡ιqΞΌ7’»M²?zε@…I†»+0β Q&V".2Κ±ρ–Υc‚z}'‡Ϊδ—PΜΥζAD|Lfτ&r+7P>Œ«±!”y|–ŠΒ3ωθ`|6Σ„iΝΖ€tkPαφ±μ2θ©΄§”$’1aq!x³FφΰφΆτΕθΣvB4‚kΝ ‘›Ώ₯;ώ–Ξ} —m –†<ϊΎ2ˆφ˜"αΑoͺ ₯H’†œΦ`„ˆ¦g Ή+­5zΘ‘=IxK3t¦#$κoBΑρːτPΌPΪ@”­c˜{²)v‘$¬³Œ$zš4{δ,rΣ„γΒ$!U€Ϊwα9XCΈ1Bγ=g°>ΖωΌΑφέ_^ˆΖ°Δp‡P»PHYׁ]Ρ_#Υe\7€@ΐ˜ ¦Π\bΰ`ΞCt/ΐί#]¨ckqΑ°Ϋ<[ƒt‚ —1VRxm\# U°„(taψό\ˆTYTLT6=#δRCώŒŒ$0t>pαzUCΰ©V ‚ό Ρ‘Q‘R^BK^Ή¨ηT "±μu ͺΐ› ‘ζίύ6“O²BPuχv}dΊ6jΕ Ή5 @=΄>ςHδ‘Τ#]‘UTΜ€6”ΠHqŒφE.y)ˆ›f '~Mv*δT±Ώ¦¨¦°‚ν'δΡ„UnQ“‰M4 JΠZT|Ζ`Z=· vmΔήhΐ`eͺΆ†κDτ†m”\ω›0¨α¨‡q’ +SΉ <"¬ έΪYa‚Ϋ!ŠrΉΫΙ°Ks2tŠ#Ήρ)ty4ϊε0₯ bΠv@|•v…+ͺκˆΘΞ!‹@ά’0εΈˆHM*(q“v‘Φ–’€‘Κ‘Œc\gFP-YgΪ΄¬3Ντu&9 $ nΣα?Z‚θΎ–Χu·]΅cεΚήΔdtΚdWμG°g’•E'•œn¨¨eΙκΚιΩ:nMJτΌ€₯u4 Η 0j«  Κ•ΚLz·Ρ¦’fš&TB3ͺ>ΐE£˜Θ4w‰HφŠ΅…ΛKl|«Ύ•΄5S}l=Μλ•mΧ nέ©ͺ:ΐϊΈ=YV@R&Ϋ,Ξ]Ρƒx¨‘Tͺ έxnŒf6X„!KΛ©ͺJz˜^½‘ qu,‘8’€ °½τYi³D—΄φΨ•f1βμτΗβΉi Ή,ωOΖ6$ΕβΜ°Ζ#–‹ˆ‡(±o0| =|Ι)΅NΪ²&ϊu…A¨Οjs<»’6ŠŠ©^β@G±v―g»‘³rπ»2GŸ\zdΟεΚ© f‡`Ε7ψԍ±ˆFYΊκ―υ#jœ’muˆ$«%€AήRr˜”Ί<mΨ­τiSM •uMTΘΎiχMnΈΪ[…χCH“}9 k-^VΦ”~μUΰ΅ΠUYP8N"4.¦§QpΝΣ>ο ͺ‘rϋZ'SAιι½#d½'db>x)ϋΛΡκJ0€τΦuξ!v灸lœέν0έ{/Ή4ξ ίΏ2όJ8›ΕΊό§Φeο=ςn τΈ…π©ίο²ξ›―cΐΚ—dε·ΎA4^αBσΧ:’ΥιΠ e&Md+Ί~Δ=);(Αλ₯ΝgVfΤ‘<λΆB%ΗX|W?ΏJ'‘ꋆP‘ β³Wν!±b :‘ 0Pk0aδΦd«³iK·Γ΄M²ΪfΙ$n˜ψZ\¨ή&fDјΦLHι8›­3ε ŠuΑΈ–-V@πδ{ᨃ Π ŠΧy uŠDκσ"`!΅‰uX°λΰάΉn· %¬=u²–!/=pΖΚ:{ΒE&)$θ`Ε0]ͺžO’ιJΘΔ|=€ύWdΜ—K;<΅ο’©ΩR‘έMI_J nέΐ4OI4Ύ%œLEΒm»c½ηX2aΆK˜)αj^‡M”h–§~oβΠέ‡.;δφμ_Fet ‘7­’ £¦¬ρA΅ψέʍ|J”3ntͺ!zύυ’ GΨ ’ζΤ‚ƒ»΅a\^y‰Ό°•ρ°Zρτ@Ξ9ͺž§ŒYwa/,;_€λ²š ]ΩMΗ ΐυ7Λ„=œ”ΣnU߁ׂz»γkτ4GEΩωQ]v~t•»«.Œ σο–5^₯6.ƒKm¨ΚόT!΅=‡LhGΨDΛ±·ώνΑ΄gΘ[W‚> 1{Wv>Ό8νv€1Εώ yΊc‰°,η‰Mδ†sšcω™ΆόR'uSu±ιxΌTG«šZӌRb™9φ«JΦμ6½Ώ²!εθ•ZΊTΙ-±OψΕά§žχX€­9ΕΘMDΥR=Uς€*‡NiWsrΩϊ–αΊΐ˜ΔξπΗε» ~©PΠϊSn\ͺ( ΄†ύ²"415€ŒF•Ψ ΧζXΝe σκ,yaλΒ}ΨνAδ`~ mcUͺΑΠyM@šΜ’NςpAΈά*€Ε Ο”a!g|%ίl―εΡ#ΪΒθΤ„m Ψ (η¬HBZ€H κ$UΫπΧ]ϊoΤ{=ž` ΊsCKlc Κ’Εo΅ΎBΑz·1#‘tQη=\ΏΖ^-ΘΌ4va#ΞfBβSœΔ)Ύ!0β&TΕiKΒV₯M…ΗUA™έ@v„IέΒ645tνLτb¬ e!€K°Βr9ΠDΛβ`Ώζ»hίΧ“šUvή²θή@δ]fAn ­TWv»Π0(fΣΐΓΈ+u|fK!υ4Υζ)(° Θ&"ΛΦQΨQqHi‡h­©β!•ƒͺN=Ɍ’f/OIΓͺ(Μ [όμN­„y­?rtλ‘ΦJUΗ’}ŒO0jWΰΪ, ²ΤθE¦ϋ qλΪΕam*(Eήρ χή`eל Βc‹“α‘ϋ»±…ŸŸΕΊ»Œ{ΰžΚΧ-”±l'T² }龊{ι¦Ί}Is*pΰδΖ ΉgΰΩ‘XF°ΊFxB·!_„Ρ~~ΦT•ˆB§Ρhχγ$Ζuœx49FΣ`ΰ€qεΡΗΤΰΨB’"ŽG¨ N†Κή <‡†ρΪQ!Θ“4€)6‚Lϋ‚KœέLNWBž*Άδ§R5¨/Ί/ΨΪ₯J‡|”ΪΊBl­fhΊ.έrƒεL©W€ŸΠŒnjό=Ž)ξT_ΈG qyΠN³8tΨΦHtIˆ5yΈt΅6ΥΈ΄ϋK7ώlΑεi―σ3Wσ95•bΪ½|NώzpostοTυeϊ Dyπ{yτ+†Βaε,γ L|ψŠψπ c‰ρΦ`>Έ)ι)Ωί81L …ΑΊ2γ]πήΡP^Ψρ΄pQΤϋXςOl»ρΐΌσ]h†¬9CοςŒ,Ιόš<†=– „DNΧCš‚5βΨφ8ΠOxΒόΌ9n‘b£±‰{ŒKM΅]‹$:lΞŚ²κφΠΟ‘ε8Υ(Ό–uE–:Ύ.Kϋ #`Λ‘ ¨‰₯<ρ‘₯f ˜4glL Ψ\‘©EJžΙΦƒ{q0T°aZuΨmS]ΗjΟ 'Ά‰uΈ;›•σΨ£½αc΅8Φ…j²1hcο?τ½>BΤθ%‘›p³ixZ§μθ+uXΞω "jp"cq‘ .1/ψΛψ•c"΄ Š2ΦUΗ#ΨΒξψC²<λσMΨkΧ2DΨ6vœŽœ’NΫΟ†ΣDˆάεngω XRζΪNv6x4Q³Ή³ƒn΄νηĘΕXρ¨&₯ςΥΙ΅x„‘› S£)bHtG†G’…RJγpξ7ΉΜr ΰΘxˆΚΌW˜C Θl4 Ιu\81 HA&S§₯5O&3%βdz4­bσ‘H˜LTgS‡ΟV₯G—άΘδρ₯ΤρΦX¦ί2MLύΉ€bI₯4οZ3΄Σ\™aq^ΫA_žD«hΥδMΊ2'͝Ίx06°Ÿ_»nΦΩμ,Η•Χ m9P ’ ΌŽv1 ΉΩ.>Έΰ)€υΝEΊPOΚΜp2~4φXm†ΈŸ¬3sβοfΒ¦΅Ώ )}% ΛZŒ˜Χ^4bψ•·ξh@5[λMqΎ"jš«I ;ŽβΜ;t°œΣr£σΞ€\Ξ4YλpHϊ§ΑΕcCζXB!˜b*ΫλΞ "J­H΅’·ν³{₯œ=PI‘ς…BΣ €nF}ΥΉ€ΰ~“μi’ρΔqh?Κ ΉςO€ζ½°σ~{, W4οžΕ‘€³­l-xR΄;—½‹NΏι|Ρβ Aλ­ήC‘œ‚92 ΰZΒtC%(sO1ϋw―™κ•XœNdWΈŒG(ΉžβΣ£Yωl‰Β&W "g±9‚ΙεvAνdpΡ•–αH™ou†ανN8uτ-ΑΓΓ9•žύςhβ½Ϋ XΦυnυ™ΝχΑΊύ8tΤ­Ž64(#ΉQƒt›ΖmB—6 ²xΡzsοry’Ω…qDΰψ©]SN.2/Μ:‘«οΎHcΥΊΛΆΪ‰„ˆl2ˆk*χ³»Ά_}·φω_}Α¦σΘ<ΉtI’ #Β΅bC`E³Ί¬<9€ gΜ!…/½φ·OσH3e©TjΦfDρ“ύœPΑAκ|i 0u†fpŸ’BΧ@›…+Ωώ`A’IKW‹ˆ0Gˆt[<š›ΘΉ‘0y—1t’ΐy €ίπ+žΩURς$?Δ ΅σ'`ΣυΚ€ρ€ΛoΟ©Δ`™Ο=‡lηœςΎΐ:7Ph±b>a΄—>©KȚ4βψY΅σ3γp;νς sΩρθυ<:")YΧΚ }ίa Hϋƒ"Θ ΠqN]+©KtcζρsΣiύaAK’?Ώ.ʏžŒŒƒ§DtAi™Έω2 d{΅“v•Ε]ζΓ¨ΰ~ŸΪ…M€†oιά‰‡±%Nβξn>ΨM™ΊΗΖ/=ZΜΉ©NΌ£e#›Wž@”šha7»-‡ͺ£±άOV ¨³^α'mžšΤ :wƒφ:χWζ7†Ώϋχ j_9̌‡βg­SΊνjύφθΤ ©Ϊ%#υί™ϊο₯`ΚύρŒΈ-#τ /ΝU(r%ΐEhΆj49Ω›gfIœΫi€˜21Λ)₯Ύ›S dq1g@μM>yJO6e¨Ο§$4pKS=DόΘ)CΣϊ/yφρΉ”ΏrZddλΓ'ΝMγsljJξθ³–›žεσ5Χ³"§lš2ψp­Ά9‡•ΪϋTί£‡Ή>=RFΔ5R―,$9“!Β‚`ތΊQ>rJ۟͘C3†ή¨蠟.Η9kp©‰z»4Z\Άtx-/Έ<Κ ¨φ<Ξ:Ξ8|œBΕ93₯9Rs"8.»κI Ι~ψˌ><Όηαβž‡‡ΏxΤΡλη~Έ9wNΊ/§ϊ(ΛgͺΨ “tέΠ4ͺΖΗό°Kxzρσ—hoƒΫΩΖΗ<‘TιP0 Ψv=Φ­οςΐM‡¬5Δ€|όΑ‡<£φψƒΗΉB0σδ[=ž=ώΐN›2ηT;eσψƒw±ax"‡!HΌ#AΞTξmν·π&»jE\bP+²hΥW_Τͺ q€€wkΩoΝ-λ-±zΉά Ω\ϋ¬ ]c’ΖΈςΝ‹ώΝ‹jhάΛλώxΐ*ξxΠϋΏ^ΨήbkΆjφ…)tVιΞ!Xk±o ϋ½lί€h'=’`ς˜Σžύ=JœL‡"r!γ%ψβρrUJ’΄k7ρlg $βBθJΐl~WΆU„ar’b{iμί!α™όnA_ŒF°δ“Γ‘AaοΉ½2L;,C‹"uύΆΨ§τLoƒm&€Δ5ˆ"žΤhWaM££Ύf5 ’’ΛΌ»;kšŒX)!wI«Β%„ηkaΖZςΟ t+‚>zΠ2{^WjJ1VxΟΨ―Ι:χ»Z’D¦β]WI§Η„…*)Θe·”Κ΅²3οΕ G7ζς‘5AσλŒVίΔςώ–rη,Ι< m“,Όω˜y’{nbνœ?Ιvγ:Νη ?iΪλ¬8¨V6[yΉέšίοfK7•Mk㨑ύSΣj5mĎnΪpo7ΚRSw)sJlΫΌΫ3A½°Ό”Χ9":8Hγh!v(Τ0ϊ»“mΌŽόr,™Ξώ€β<²/–+BŽŽ&2ǁQVPc(ήΈ‰K{(p¨8¨cΪΛμy4ΏndϊݏuE€P6²ϋD^™ͺΊlιω+sŸWn«–έDΘ³‚„%…κ€)έφ–6d&_ίnkΔu Dle#KΓT›"r.cΡ’XŽ`σ%\ς₯ά9ΛΑ8φ cΉΊTύŠ©¦ESNŽ.Νσ% Pv“—L°eθ†":+d<8»LσžΰΌΫΈh<™wΊ ;ΡΆΥ[ξxΖ5OjN>AΩ6$(ž:¬όwˆ1[³6k"²υΔ69ϋηJκr%eϋκf#2ՈL5Σ­Ζ&ύ­ΪΕ;―ι;žΠα+"2E#4>iKΗγάR‰jΫ"Λo }x2 ŸS›€λt φ…R³Ϋ1“/ϊ…δΎDξ`w6μ½[³Ϊh+'V²μΠ„έ^ ›D₯ލrXrXjέ'"g¬D4Π€ψΑθPw£’υ…‹ΞVΪV-’Žˆ΅Ή|…AΩΦυE%XοcΒVN,ž εΉ-Ώ­&:Hkώ+!ΝruΈxί=ϊΖΧ|­ιΠΨγ‰GuYKΡμHnαXΞ;š+9—ˆ8]qrχ D§³‰¬ΜuέΠΚ― ‘–@ηQΨ/MΓ7j*z~Ή"ŒΖ#•!f]L˜Gͺ)K₯ΌνκvΕγP:΅R˜Ϋ.υ΅ΗVr―mΨΠΏθ=|³₯€ΑP. Pdζ¦Π΄WiΜ;S5  …‡Hƒ’o¦–ZnŸlΦv£‘`L"ž—§•Šϊ ‡a€3sx`Fƒ€ΰ]{BΎmοδέ6ΙB;ύ€]ΧξΨ#eλΘζΆ„ζ―ˆ ‹/Ό±"Ή[ΖΓdokψχgεΐœu­Ψj"<2W…ΐ ο+D4ΌyάΏηκ ύ7xNΙ‚rDν ϊBDλ6Ψ c•πσΚJήεΈΖcPEω]}sό»_œ΅ςΙΆ‰3}ρ)™ψqΗ,–%ό―«B—y¬UΈ_ο–‰gε"n–‰ΈwŽφD u7Ο7N7Ή¨ά‘ ™0Κ˜/­QKΜXUώΖ2α τE*Ήh©³)Œ0½|Bρz‡›ιθkΣ[Γ”·ρ&TSa­HΤdZ%ζ+1§X όn'Bz ΐΑΟΞ“\„6@!€Ns;Y_m©Σπ˜0uε„g‰Ήδ‘Π΅ζ[JβFKζ‘R‡>ΥJ>:W>Ύβ–pZ| <Ρ ―±† š›q‡./ΏLb‡U‘'J’’ͺBL=O”‚ΦZ%RφšBB 9Μ{Y CDaq<WŠυnK,:πΪ©Ε|ƒ―wjΚυʝ<•}f'C§ΟJ+ώ¬tεuΰ; !d9υωY{VzγΚc±J½› ·»‚~Ί‹¨έΈ§¦τwΞ»Ζ» ε]Γ]}ζWώ’™>Έ>Π>Fλ΄­Ψΰƒ·ζπˆάΰ/W?·θmυH ε ϊGΧ£νΡΎ;mVΜ)Ί9ΕY‘ƒςQκΎ’>QίGˆˆiocD$ς4$r$$ς„Σ¨1Q1Ž χtCρ‡ΰ †αα36~X„6ΫόΗ†}kθטΈŸΚΖ6Γ §±Νp@Wή±΅Μ”`ΓL Ά‹Ζ·r(‹8λΗΧo½~δΏϋ₯y8š» \δψ‚΅έŠ5{ȘœfL^4&ΉtΫδ‰˜θΎpα‘πα7ΜOόδΉcφδα={Kσ>rδF&ÜΣ›ˆΞA&ο!³3‘Θ»)oλ@tΛ§5ΤoΘ§ΚΒ}Ι5―&“»s–"Ώ)ζCΕ»ή—7~Ίε·»ΜόΪ5κύV@&Υ“Oοε…‚ͺΩω‹χ0⑬`]τΉqξdΌw™9τbg“ω†7ζp,žή2ΎήhΪ~ }tjς…3ΉΖΡα¨ζ"A˜Ώ/ψ‘žCο<&Ε’ptJ4ΏcΕγœK;Yͺ΅Ό”έζΡ£N;…―ν,φΒ (ΐTtηξ—’Ζω"ξδ ެÝΈέ2IrthY93šQ‚cš/ι[ΎθBs$nγٝvφ.8΅I™δ7³_ϊ\ΗΜΡ½w}Oυμd7!ϋp'Η™όθ/Ώιhίο›[9 •Νk!ΛPΞάάήω¦w!ηŒίœύŠšQόA’ΞxH0܁33χ#σq%I‘sΰ*§&λ}πš€/;. 0L7iμΧPΞi—§3EΧQ°εξγ|ςζύ†MnΔΌW±Ι˘9sΘΞΙ&e—Œ­aν0αh »Ϊω€Ξ΄."M.Π.|0ΫY›.’³’e,#§Œ•†άγԌ'ΡAόGοξM’†,©ϊkβ’kNδ¦°MήלπδΠyŸttPg.Š 3L“ΦE0ΧU>ŒϋΉ- …₯HΌ²£Έ.FkχΡ₯’BdΜO΄άm¨bτ‹Π:[μ‹ZԍJ㈳ΨKœGΑjo!: YφYέυv+ $Σw[―fσο«κjΜ!™Σz”*jciΞ«t€+‡ΞΥS»•Ÿ O‘5wz§>fύˆί­mξc*]Œ2–’*£¦ωδΙ'΄Ίjš·>žw ƒή‹βΒB Œ›o“sπœGwDdꏛ•uτIOuΈ‹SΰR>δ˜Kς<}΅¨Ψ“€Θ<Ε7YΫΌV₯\Φcw"9ί»©\#—χΕΰO’Œ™(Ÿ2*4ΉΟ­g}Μ‘ΌΙΛΩe/pžθ…ˆΤΙ₯՟@ι# β!*σώιk^:g—Œj’ΉK$Sœ/ν©ζ·V₯œ* hΨ .₯x(ΝΎ Κ\˜σ&ž—ή«=εrOΠL&Π?LϊBw3Us‘εSlœmP,“δ–™ΝγΰΣDi[–—:r8yρ*Ώ€\½ηζVΐ,ήεl’’ >`νΪDϋFηe^Λ±ϋhϊfζ•ŽΊ0‹gSΖ‡u/EΖ°WΠΜ$ΆΗO)½ςF;-Νq51΅€W_dΦdLΦΉ‘’Ο•“7nCΉε"6ΉDBΆT„X’B;Τ’—aέΫΨ²ΘΪC―ο hΉri>Θμ ΆPΏ‚ΖŠΨE„ίŒmŽtϋyι(ŠCΈAWoR$ηPz/\K―¦Bžθ”Pgσ]+R•4ν+]±έ™ yΈ*#&£ΘMθRιnPC5Š΄¦{ΦkΚU͝PΆ₯C%ΐx;Χb˜†Ζλ 59±¨Ά%Δpο=ŒŽL<χ)†ΩΙ ΛN¨Ϊ:ΣΦζ‡R~ΙΜ X΅kη“,ΟΦ‘σφ₯>ΨԜά§δ’Μ|₯€$―+G;Ί€ŽJ1p—ƒ•ΟX-ϋbXΩͺΑΆq.„m€x ΒvΚjm5Άok@Ί8 Ζ…―0Ty4SΔ3x‰—)Hκƒ˜;‚&tνb'k‰9VΒνx-1yŸ¦“π’ω’.sνtLΔh[vUλ0ϊ50¬’½CΓΒ\ϚοŽš¨q±t‰>‘4εgԘ5E³²V²ešΟ¨Ό KκZMΎφχ}5 =ΉG₯‹Ω•^„₯•†r8F>wC₯hο@Ψώ:ΤΏ“wSυ l†;W―pG“΄’Πn‘+=@­β•GΑΜ•ΩKςαNώ&Ý{(`„;Κ(D' ΓΘD’Žt°“,½«―@tιM Ψs-bœ…SP³α7΄¬₯Ωec^ŽWάƒ– 'σIύQξZΊΆšς~σ5ͺΓh΅έΒΡθbΌω€v£Κtά’ΰkx… Ζ~1tΒ΄ήbPq!’Γfν"·ΨZφψ}IΟx–Γε§|Ί ͺ#¨:"Έz}c¨β·Ψt¦7L0LQ™‹Α ι"ήΎ5hφ£ y΅bƒ‰x€l KΣ‡—‰šŸ"z γύ$ΎΤM03°2πΠΆΊW΄ '‘?cšmw•{`ΫτID¨ λΣ“Έjƒœg<έ*PζΗf­–{ΕϊΆšηε°λS*Άu]˜"Π©;―4`^€-6ΤΞ•Ίτ{̈uQ©ΖOΧ‡d6ίEMa =7sVUΙλFΧ‹)Ib)a°j%Ĝe3ξ†τu6r„:·ΪΐΜΩΣ:`¨2y_cέ+ς‘‡-?;ˆ™’Β)#\­[τΣ(u’3Ύ%;2ΨE—4cς‚άά!¬¬!+<τϊΗΞƒ·Z»- ΩΊXRHV.…°†–нNF{lΧ—νZž­s ΅Šόw/14~TOσ2Π©EμX½›J ά³ΣΆΤtΌ-ΪΤ_Ɯ›oΎξΔ粆jε†r‰UW T6β²sΠ>ݝ₯W|iχζ’δSΞ«Ϊϊ™Ϋ‘†2BE31Ή•σv΅ΏœΌB2°»7ΣqbςWN$μ§P’LΚG­Αhη !rϋ-e€)V Δ³€»ˆ’Κ\4δ—+tΑLγZšΚՁ€+§#ω ξiM+1Άƒ’}AΖ 1~ΓΐZΡε%TcΥδ€™ΐ`££Γ¦UΙlτWχ•{F…©MCΑ‡U q(2K^DJh’Τ*,€4(oΕsΔΧM„Ϊ’Τ׍"γα“HͺύJ]5Ε‰ΠΕΝυsRv•Ηž™OXm i­ΛAΖiC 6(ΔΝ-ƒHγ‘Β#‚΅œO6’!ŽΆο36%h°‹PΡγZnξ΄dPά!£U2n2‘Ύ±&tE Γt*aΫL—|¦Φ(Ά.πΘÊ»,ξ+ι¨K]9­νœi1°Ÿpcα;nγG΅Ϋψ £uχΖΊ{#b·±ξΞ; 杼¨ΆBp}Bj6―14φl r$p¦΄€s₯—ηpλ’Ό­ΫΟ²°{F`–YΪB>R»ΡVΧ@Q=Dx…Œ&~° C‘Έ›ϊΡkG,ς»5½e·žBD•ΊάV²₯y½¨MΖx T%+~y’EΨcdΤ&žΐ»©&έΦ^•?“cL;jα’Φ_•n©ζ’Ν±X0κˆ"V%Ψσ@Ψ§ΐ$άLζΡA?gk$ΜΏ­ό*€׌Χ]°Χž:jΨg”zY΄βA,w~½&ξWlΆ’a%MψA Dκ˜T†ΏΣ§’­-έφX°°+hοBμ6!ξT»ΰλ fπuν₯sέYΊˆdX˜ΐn]4Fh1Θ«l ϊΟE*ZUΊJΚbΚb*&t₯K ΄gθ!ΪΑΖn‘)Π`έH#Δ7 ΈΖp8ΰœeD$5Nn†0¨Μ<Τ’ά:1TΙ“hE #– Γ˜(Ύ{€hŒεT$Pυ+Kn ΈςVV6w@ κχIΔΑ, η½©b,.WiJC’k§ΎΥ1…•“…Β„E)Ο¬J³IΕ\Π€«P€R―~"{χΓΌθΥ¦@«ΐ«eDogέψ©9υˆ Ώxۍ?ΤžΓ‡u}Ο‡$9Μ(Ǎ|ύH­υG)±χD<Ίρ‰…MyΒ¨“]‘ΏW·o_ϋa|mά²kf ‹€$A$>ηcN§³,WΦ?ε ³ϊ|κ‡ιGrX‚z@,vα§οΏŒŽe­κ†[Σ ΤΠψ$ύ'fώωyΌe`όΨΉj{—’‹­@Ρlύ‡-²FίNέ„Νο›²€(€—5lΙΉ]Ζ‡dEΠ€σ{–Ή.yp‡«‚„3K8Σ}”ΨΝY = Ε>’οIj{5 όΣsGΞl4 [ojΤnF½ψΡ»ŸNΟxχΣρΓt­γ‡e¨>ΒοΣΛv2}Μaξψ™~˜ς·9εΎaJ/jβ³ήηδ@  υ©ZΪΈλόΗ ΎŸΫ’‹ΖΆŒe"ΗJσ˜3OγΓP_o%ΖΗ`꾏κΛ$b(*Χ³Τ‹T‡dδvΔΗ’-Χ ŒDuΘCοw[ͺήϋέw±£Μ˜F-ήοσ{΄oEΪνξΣ–£Ϊ2C[κ‹χερΈχmζ<ρξΘ?½—[όλΕtp©ΔΩ#ρ~eŽE™©_ίΡΡό9Žφ[EaΏ½—w–LŒžNΌηΩ¬wεπ“ϊZμ‡‘n 7ί‘Έέ7ΎΗ²ζοΓgUΝqΉ ο@f­νwžlΤLϋc†v.γhΌω9σŽ-ǏΝα°¦<*m€W{[§Y–.θ\ςˆ‚εΊ€–²AeψβΑ‹ΎwuπωΎAί¦sέ\ΜΚΫ΄ξ+ŒΡzΚ {Žδ}"\oCӁ¦}—_φΆΫ†~·Ύ|»Ύ|ςδέρ»PIV*ψV?5—y”υ˜‡φqε ώV‘ oΕρ4υ€/ζR†έΕ„ΔΕhšΘχn μχΒwΰFR1Ήπφ>Μβ;AΈLΗ«%Πi"ο£άR>θ5ΨgWΤ|,SτzΡ0Ξ•)i nΨR)’pU|–TΥz¨\Ω3­[Iίφ[ύ$94 E»ΉίΪ—Έ:dS2_bZΕfnΪΚd'MQ±EsσvΝέΨ€žώlBέχ ³²Β"ŠΠΉh¬ ¬‹2‡ άPΠ\Cΐ= fρ₯G¦œΐ#£¬ρHκ‘Π!Bχτ0Ν’ sˆΘ%ε}»c|;Πωυ>Μ蛝–}λ@0lνw°8 ²Έ”γaκΉέPΊT`:’'γJ»mŠζ ~±ΑQτΌbΕĚνΥ .₯,l„iT¦€)ΊV…αY‚˜ jgΠ>Υi—šˆ^ ¨HΜυ‹ωβγΨ€ΐNPΧ6©UcIb…;>4.β―l|μͺΟ²ΗV•Δ,+>° ]‹ν…Až \Χ–}:χ „xyœ†hJρ6L HlUUΌ°Ω» #ΤKZ’bΤ ή˜μ°οP*ΰΨ ―ziUlΏFΚEm$!ΨςxJE‹~s’X©U’i–ŒUžQΤ#„€209›Θc³αΉ θV(:Ώ_$°i\΄Μ8ι™GyΤΥT»΅A6ˆ¦rΠ@έ„€Ι# ΩΘ]uμ N&‡Œ$ϊΙ{$² ͺ€,\*َ JΔ±΄f η …Β³΅DΖςβΙhψCΖ "Wχ:Λ9T›ͺήρ˜&”ί΄‡f€<Ά³ˆΘέ‰‘lIω<3VsΉ]»ιΗ€<—­~d†ω«Nε‘]”Z,dΥ)°XDbg—’gΟ„d<ς©Hσ{—ΈΠA–ϋΐ£»Ρ_\x¦ˆΟ4N—eώΟΉV/­N¨³‰fwηTπε9έΫ/p[sœ’—D§S•GU}Ž˜ν•ΌΔρΊ;t° 5Ν›HsΠ΅ƒP3BΠΩ‹M1g:3B€­JRSsΓ* q~±k§Ξ”§ΒFbΉ~Πz (EmΝΥ‘ΧIY»PIƒ…·=΄Έu‹«Y‘, a9BtU¨iq'λXJ¬ζ―λdv:FbϊXΘWkhibΥWdΩ#ςt…58T°μ&B]ŒΈ/ΎhΔαΫοθWyζ(+A?g•Σuͺ³Τžμ΄‹ξ’βΗd#}怴;΄Š/΄43HSδ$ζŠΦj:Υ-Λ†Ά UΜΘΰEŒŠDθLΕ‰ζ$Dδl–θiVΛ#Χk3š…φšδ"»Λ1L}M~υXΙηhVn7%9Ÿ£+s Αyyν !„sd±Ξόεω>…”9?37P>e6~S*Q·&ωt™_‚±0εδΝ£ ·€χi΄‘ΗΔK):|jWοςvJvλQw’)­I{-Γ§πCΆ|Ο7qΗ:%M…ΥΘ|ο(Σ§Uσ9AΙ&zϊœ"rΞdϋ$Ή–΅Σ”ε]Ε”σ™Λ‚ήΑλAAŸy\πΪ}ζ\ "V΄μ0ιSζ˜Φ'θςœDΘ₯£f7‘5ΤCΑΤ(ή©Kτ™ς‰VZšΉ5v‡;§sΣΩGθ‘ΠD˜‹»θCΣ`ϊ^½fhζp2NΚ?šZY+ή ^sFO‹iυ—/šVmz·ΙτΞ‘—v‘|μ"ήE.°Λ.ΚΈQΪYšƒqε €‘ς|0 "2C\ΈŒA§9΅Ξΐf ˆ(ήγ) 3s'τΚ »}ΗψˆϋRg}§`NΤ$ΟLj1Φ`μ6`Y.W7ν΅eΝ"OPΡ Τ³ˆϋΝX‹Ί˜g‰@ιfη‘£υ@ΖΊ­Γ‘£Σ·Π‘bOxή¬ιηcΒ:©Gƈm!¨ό€N”jjΚƒXEGΏ΅Ε[Ό?cΥ5fzΠ@cJm~Gλά`‘Ϋ'·΅1]ψπ+j|_©ώά ΰj½U’:[? ”3¬’ŠύD‡›>οkg:  ŸAδΙ χά¦IΟ‹Ϊ=C”1”†Ώ΅¨ΑΊ0“†ˆ$Uζls)΅ ͺΤήΐbF•Ή ŠΤϊΌΓ ΖN,u5 :“Ίθ‹,w"€1χ‹xξ {άw%aΦΉ#·έΦ!hυJ?―|A2Α64³d+^X#„ΑΤδT:ΓΞ QΌd,£Πg*ΞΟP(0-'μ–q †jƒΗ+ήπιρFaόQΧB£0Nμ†$tΞ•νA―2HM’@Ζ€¦CΣ<+i&κuρ©QΩE_v}Ιu·ΠΩPΒ’’gΨ²ƒ¬Κ&ΑFΛj?wašmά6ΙΓώ+ I‹A‡ΙWκR^±]š5μ‡"ΩΕfΌ€ƒ1wtE`άmΕνςΚC…tˆ@iOaΖ¨œ±Φ8Έ †ƒ ϋΧ›dOό\Υ@€ ϊE˜γVχιJ)^;‰`@…!©φ`rψσƒPF‘Ρρ>\%Μ}t‚D™έƒ”†νPžŸρKI¦ lzΑgΝis Y+Fٜ‹ILr8§ϋƒ_Ωjs2Ι1Šέ!ϋ9χ°L8ΠΚ%β^ΚH±<+UΫWΥφY΅E͐&Ί“ηy^΅ˆ’³ΫM¨[<ϋ£§Π:vΑWd.<ΩΧCUΗ–~±­V4[LΚδjrπ©ΘΆ;‰i,ΒνΨFZƒI)κ*OIΞρjόvΕΓe]Υκ=œζχ ‘Kz"ϊ)΅yΎˆχ`Η T96θ)οΔM f¬@e-’LӘ)ͺHγC VΌ<”…ΜX†k@‹ην"G¨ α`Ρό΄:NΡύt„a θ0d°’:Μΐ u ΉθSο.&¬«(h k]~EθΆ]2Δυ4+ωρœ(»γ ΞΪIŒ@D›j"<ίFh¦ΖΔF:λt3 Ώς¨–aχkt¦Ψ©ζˆ]mb»κA,ΔΛJ!l&άΰ`tΡt-°‹‹‘πμΘ‡˜ψ»1Ίβi‘ŽΑε‹Kž"ΝϋfΫZ˜ZΝ™γΦΪΙ‘».Lα£€œ?„< iH`ΕϊŒ‡‚ rF‘Μ«%"{¦f<°¬|@ŠΦLΞ3κ5€¨|IX<YΡ”Ω'εΓ6ρ-2‚‡€<)Ry#λ!΅‘²ž΄… Ϊ½| ΄"Αt2ΐ«(¬™# [ΰV†Co/<m¬εg>R-’P6΄mμι½#7WJςύv=ϊHά@/mΧ΄ ΨFΏ4…pΆ‰c’– ΆέΐgςšλΊΏγΨςMΫρmm±Rκqΰ@7τ”μπ·* ƒ!$t©(#`EΉ¨ΘV—U4ŽL!#ή¦ ΌUC:Wqz§Υ3†l©G'iΣJαnΐƒ†Ό3\ω–΄ZΡJu‹:~―Ή<―6ŒplnqηŠu7|H`mτUw _`OΏ[—ώπ7gVGhθ#"/Wι%ΈΠnέB Ά£³X¬Υ€.©=aœ9vΗΣa[Jδ"ό(ΣΩ-ΉΣhέ!+š‹0I:8Hυ*"|!_B˜[6_BYvμΛΗ|μΚΗ`Μ‚r€ΤΫΛF-†`’M[XΚ{·\΅ζgΜ ΡηO;Tζ°551ΈωmμωifzμρAέn‰Νˆ³ΧkC'bΉAhŒUk8Υ’8lš"ρ7χςτLMΩ: ’ΖqλΤg‡wŠ―«Γ•nΥ£€ J€p.Φυ"c.ΗμΨU—βZ\xα}¦C­ΞΠ_Ηtω8꬛]kα&ykΎΌk΄α&“ΛhνLύ}Έ!ΫUρk ³’τ2O–\1΄ -ͺ\aΆ+ΨE›7ξΦ¬²δf@²?l(͚bnω-ΐfEH„ύHΘ^!dΗͺ €‘ς« 5k³3ϋΚδ#΄V8sΐ{qaJv Ο–No,ήϋEŸ:ΫΧT‡’YnΕ_ΛΑ`οMϋSw €ηΚθ6ΏΣgiεm?DˆŽ±»θFŒ?‰Ά‚ΩkνiŒt£Σ§~ ζά쬴ǀšžqς’sΈ@ΥOg’ZφPήƒ@5”UΝȏ•©O•B‹sih+SΝZΈa"¨‘CεœYς€ΔU^ΓwXΈ?Ί.―C! ϋ^1άsεD°Ί 2=+Ί\Y}€¨€z; ^ ¨—E½+Χ[±ήJ™n5κ­LκΚ€V&΅2©•Ε©ByΑν…¨}_»T.t5Τ φRκrΟΣά*$΄ͺ6ΜΑ@§#Ψ{εV•ΰ"73ΤΈSJ TΈ²Βz»νӈGΛ•τe­ωNΑXV-iiO zό`Ο)Υ„*­΅›%:½β¦««Ώ?ˆm“ΙƒΖΫΐ»†²w|˜Εΰ Π'e°V\φψ@Ιcnτ:ΎSΎφάΒi³5;‘ΦΌο©~„j"lB©„ΩToΣNp½oΜC·ΉψbέiίθΒgρ»ZέΐŒΜcηfhϋΊ·ιl 1S±άοΗ hΒ&( ή)XŒνэ:άσ¬^Wš£ΟBέσ \βλW2ζ~₯X0–©˜ŽK$4£GΩαε]zΔP‡τΜΌ•Χ(ν_Ν•ž‹OSκ1+MΗυ>KΤbDψΒΖύΐ†"TΑz€ e\—ε–’Μ0'j&*@|pβ“ Έ“:q™`k>r>ΑΌj8¬‘-yB;σΞ+±i6Ϊd₯€J°‚YΓκe Η‘ΐΩ΅χηΈΚUΓ:gf €C;ς°@³΄ŒqGΝ“%‘nqžΆφd«—AΚ%[{% [έ‘lυ–i4mνPΫj{@­εΉ= ΦQI@• Dμeθ!€yτ*ν–Œ$/Š‚‹(Τ•Ζ!IAJ‘‹ΉΑ EbΏy|±Rpv>’QόΖΫ’ΘΣ‘žΘ§πU χπΌΧ΅™5™΅˜k0k/k.k- ?ωFD–†ƒΖXΌΣΠ‡β άKF ‘¨# μB‘τ˜aΪ…$Uμ€tqD DF•Œ;QLΰ€ολΡ1bTu†Š°Hυι)ΚόΠ»ΨρΤ$κ$eaQ}ΩΘ“šίfΞPΫL‹‹§‰(ΟQπz‡² cS8L 0ΓνΉΔ"ϋ}Mwa£.σΤdηFu(ba·#ŽhΊΓ F@εξTήΌ‚3‘ER˜$εD\‹5\kk\@Β}pnλ#ΥPuΜm½ΚjK«Ξ±ωδ9šˆ-½t.h ΎΫ α&40’ƒ kA2P|}PYKb’³GˆE1w!XΩCsχ ― iΝ3€ζ!λKΘV&dΓ€·"’θBΓύ ‘JDw&½ϊ‡Pw†ξλΈ67x΅Ω–€tcΕՍ‹„ή'1+«Ρ-fς`Ή³…Œηm,KθːΩw ‘ΦMΖ­wΫ½ύ §ας\eϏ7ΑΒΥΨ7^?αgΉpβ~σγ ”ͺHΉFήsγΎ/MΚdμΆ±%σBβ6²¬πžCΪ;8φ:Κάk<¬όΒm±s6Ό› gi|΅Ωώ`ΏbfW|³ͺVdad yr,ΰEdΈŠ–΄c”$Γ$j/yαΎ‘Ή©ο“964r«t"]^€8•ΜJ·pgځ<Œ½kξˈ;LΞΕdΔK}τε *Ζ–FB·8Εz‡‹ a7¦0ΣC~yυ:«ZζΦ^4IΕ€ο\°4nί0Φ]υˆσν%ώ¬%€SΟ·―Oξ±eϊι,Jœf†ΪςΨΪbδγλˆ@βͺp΅bU’»#ϋ…υΝc{iζɝ]μΚQυ›μs–σ<6Υ}ΜϋεŽJ.uΩ™™λLΕ_6ζ‹Ε9š,^€JgΘniQΜί5DH2L#1Wξ ؚΔGτ2kKΙΥΕ80Κ%FΌb,,H`θiΞaβ0Ϊ€ M:›γ―°Κ3jΝΉg  ³ˆ>‰dγ†ξwsšΚk =ρβιﻏΡψ>tχw‰‡Ρνι5γΪ»θ3XΎύo³‘ΰΆΥΑιp Α­&ZlExΚz`LΛΦ;Gά‚ ν½ηŸ0Δ;‘ΨΆ²ήέ‚_ΝWν‚Ηe{mΫ"q}Vο;…aάΆΪρ3ΚA›MΟO-ŒκΆ₯aƒζBlΆΗžKϊE ·…jg€„žcΥݚμšΟAμΆr<*—έW;„nj£ŠέˆC½ ‹š3Ϊ‘ΏΛSeEhlC֍#r}¨ε₯έ 4a€ί ›°Ϋq0cΈΨ=DΤxt’g†CΫΚ9žΥΙ!τoC–»-4ϊ]ŽΙ³™1"ξFMΏ2/@Ξ.A=Hie† kQ™?wpλN%žΥτή8ΧιNuψ ούψ­&xpυτ'η»Wοί;?»˜3=ΐίύΚβ‰όχyVc°ε˜ξΧQφ,§¦Yάς …ς“—Nό»Vγ_ρ­Φ½ϊ…7p9ΑHC›"Ο M² 8sι`ΆδΞkž7ο;_=?{σ<ώκ½'οώδΗ_}π$ξΏyοΗ―=ψΦ—Ώό㟞Ÿύδ'χ_½—ΟξΏ9wΦ9θΑΉ@+w«Γγω›ο½ρΖψoρψwγί½1~gόΞγγ—Η/yόφx>β^Ύ:>Ο_ΟΟpωkό3…ΛO zΡpΎηhά ~f1mΠkΞKΠέͺκΗΕω½γΙ³ωG8“v¨; yvw1Bn"Ώzλ!rξυ½σ/έϋρωWΟΌΖΞϊΗΧΎφθgΪΐ»ζύ{؁ŽΙψξαθψ½±οέ ΗZΓx9ώΓ}όΟΏtώ%΄~ͺelΗ‰ϋχ_>š@SSκ†έ4f$c!5/Φ–Ώrœ‘F;–μ,[O‚|s;o‘©nΧ€ΏφMoϊΛoϊυ[wΥΞ4π˜½ω•™κS›γΦ/!”:;"ˆF¬¦ΗχαԘŸζΈoΧkΏδάa­_>Qλ[Ώύ•—Nώ{εVΝλ+φ•{oΎqvΨΞγ˜TBω¬!?€Δ¬Ώ£ΗοL=ΉμΘ™ήΆ«nωΊ?sKΐω¦φκgΐώφM’Θ7ΛoΥύσκΝγέδυ₯Α¬Αϋ䁯Ѓ@Α΄(+Ή[}>?δ§η»λďŸβτΑΥ[ήyοΑΏωΙύƒΦψΪ V«©>δδjς{ρτOCamlmlmli source.ocaml bin_digit[01_] bin_integer(?:[01]{{bin_digit}}*) capIdentifier[A-Z][a-zA-Z0-9'_]* dec_digit[0-9_] dec_exponent(?:[Ee]{{exponent}}) dec_integer(?:[0-9]{{dec_digit}}*)exponent[-+]??(_?){{dec_integer}} hex_digit[\h_] hex_exponent(?:[Pp]{{exponent}}) hex_integer(?:\h{{hex_digit}}*) identifier[a-z][a-zA-Z0-9'_]* oct_digit[0-7_] oct_integer(?:[0-7]{{oct_digit}}*)sign(?:-|\b)suffix(?:[lLn]|(?!\.))\b xΪν<Ω’άΈ‘}<gF£9€‘FRκ&«DJκΡH£’ͺΛήΨγΕ»ϋ²±Εκ6«ŠέΝ5‹¬e±€n-Fα}ΪΨχ}°#μšΏΔ  X}ΘΧtD_Ε$2‘2 t–ς―Šί›~œΔ~šϊ§³ƒG»KβΧ'Τ(™L‚8γΰ–λαSΈ•βχOΈ(œρƒ­Ώ?€&~—0kz†μ=%²† t₯ˆτ£ ] τ~ Π7θΗ5@O(Π5@ίR «5@Ow%φ¨€žνJU@ίνJz’zN>ΦK…±ιύ@»L*Χj€˜T>ΥccόΎ‡aμώLΓΈύΉ†1ϋ = γυ—zΖκzΖι›]&Oύ, ˜3¨―€ ΰd<gΕ~6OƒώV3x&ˆΫΝΰ™ |έ ž ρŽ€^9ό,KΓψˆ›ζ]₯ΚN§Α88δΰξΥΓ±i­KʘýςΣΠF7ΰ†ΈidΪ22Φά72%ί62Mί12u· €Lηm Sό–δ“ˆΣ§mΙ€ψiF?^Ξ—2ϊΤ‘œ4]šθsWςΟ£$†Ρ9€‡’Αͺ„q˜@D’ϊGVόHZΘG>––0~޲K š>όF_Ωp(άiN9\R€o%G£šΚS‰λ…ΥΡΗΟ$ΎR+’ΟΏ“h`R§Ο‹ίβ·IL‚Μw‰,έdδO’%Ž ―- l΅, »,™Γt²ΉŸ…Iμ"Εζƒxœ#]‘―q2rΈ!ωΟε˜θΊ¨rξ0JFΏ¬Nf…Ÿ Υ ―ε±Ή,)©p%l–[.5χΏζIŒέq2HX–œ˜κ·ηY'}ί9ό™σœηξOΤδμΌ±7Fύaœf;ž7°—%ΝTIMΟϋ©?ΥwƒΩȟR‚Wyκ>ζΥ›™AK¨ͺ[½—λB{ΆΥ@YξΧ+ A[―+Τ2CŒ#¨σΗ½ŽΥ±½YΛκοwmΫξαOΊ6‚oόi― ΒGdLΫΪεΔΧ4’˜ψ,˜‚XΐS”τa£wˆΨRπeΗn¬OE'C^Κ!W%HGύ28}€ΐΦi#$Πk A+₯ρ\βk%Χρ*u:Iζ3ƒJ­1Ηc›Uιa½*鐗Ώ^*pΧς,δΝlΫ‚Χ@Δδ²vdVeΗA)F‡£ƒΝx™›€Α΅ωΟΧdψŸΑHažk˜š)P»Κ…ΚΥQŠνΙΧMεΪV”XVfJ­κΜζΣi’fβ΄%Z޽p#Ύ+1σή³¬$u’$™Όι%Εγ$š|GC²ˆ±δΛ†bœxC™Λς(Ν«M&m “ζͺθΏή|½³ε;Υ R›B•Οω½>Αg]Ž οiD γ|W’Φΰe72:ϊ©€΄«™~ι+Kq5B|»dy―ΦΕcτʏl΄_‰ΜΈ7Ώ*_ΓX‘ηι.o΄lHzF/»©\ϊ₯9œΧ»6pεMSλΟ–ŒλTc;uΨ:Υε8ˆxώC"‘n)ƒf|'QwCTDR¦vHΝΊ‘Fΰ ΈΎ>pU ˜`Δ-‘+α’LΖΒΩ65ΙόmψolςJίH# …λQδΟf^Puβ³ίKLπnTι+κ^t ΉrŒΘ0΅Ε£²χ½™ΒM…ςpΚΒ#,Ήπ>σH―ΓμΈtμMŠά*Δ,ΣNζή!Υ&09{…2Iž½vΜ₯:Ν‘ξ ‚ϊπ0 R΅° <žWΊΉ8¦so7eΩι–œΫ α7v|4Έ΄^`ηφ½})κ*»Β/yŠsο‘..²zlΧ‹ ŠvEτηXu‘ΦΉOa «Mάί]rιΰ•ΚΛFό¬ΊjΑKPΒk όA<ΚFyξ`#ξ0Cj†M‹·/f^2WθF%Ž― Šw‘Š_9OθD΄ζh¨τΣQœr|₯eR«ζk²™ΞeD-2)n­„u¬V9'qm§dό4Σ·κ§ šυz-εά‹:Os[ηid»½§—7Ac¬f0ډɈi«6ͺοUδορΘ_,b-EδwΡ³ηΰߎ©P&Xoν†Φ’c†[όB)MΌh`s«mswt6χμΟΝεX“•R΅IΘ’β σς½S/Ϊ»XΛ"_΄ωσr›νίσ²A‹λΤ U-αkgΦӍz³γπ«…ͺ) Έ4 Νψ9 ΛΚ]=_t5_BAMζΐ·?3ς}ΛΔχd”ύΐρ²Ξ$p|ψwΗΓω}ίΔοaϋιι wΝΏ†ΝΫ&6‹dε²ψΌΘŒ?.Γ\2aoάv[eH׈γb2ΑGΤ†(_kκ4iWZpŠ—:A–Ώi:Af>U άͺ ST—Βψ{±¬Γ¦ΐ(8 AŸŠί-WgΤΧ•|Q²Pwͺ0œδLgρΏκY€’γDή² Β‚Ό4έ]C€|nίΔ° ΫωΥκͺΟς_OνΗz<ΊzΎΧu‹ς”‘2γ0Ώ‘3{‘ΞΛF%9ι+ŒMφλΠ*κΙΛBekUνΆ|₯7M.?V‹Εωΰ\[ΰ£³=γιdχ…rΆδ­']Ό€p4-ιΉ.@p·`"Jž€ΕzZΫrφlbZδ ΏΩTύΘkΜ‘ό±ΡalkΌ€Ί΅xυ\oλ¦Ή0ύ7”‡ω΄Eϊ{@‡sf‚‹±ςBΩφ‘RγΞI“αιψΦΨDσ½ιGU₯T Θۈ•νιZ»±•vCFr5θ«N+“¨€Cν€ΜύKK§b4Ιj‰c‡?ЦiμAμwΐw£Ϊͺᧉ•·kYΉ(uͺό… ΚίkT™;ŒWpυK«Sο ¨Ύ;?aUύ=nπΧδ/Κ­ΎΠ­RΤoRwΚU1?²ŸŸx‡ ©u " A›œK΅{Υ³π‹]c‘#0rېAΟ‚θPΘLͺˆ«ϊκΪyqλΈ|Eΰ2₯_½‚γνΨΦ¦­RυIρόŽ‘E†έ;UΛ₯Tς8₯ώ\2)K­XinθτΪ E^Υ³{κΛ+ψcζ ήƒ’NDuΑrEώρ,SεΞnCrΡχJθLρΗ‚)~ΘΡ@.pΈθ{ td°ύιΪφ•œ?.JJω“ŒDgr†99Y ο4ΧttΣ½*p}§œVp2 ¦yρAWc₯ΓΟxνf/t{ιέΣ)±„«TavΗζ%Gφχ½ώ έλοο ΈΆΑ%c>ΤιΧύ‘ζsWσΉξΖ8‡§μŸYΤa]z[=¬ΡAΦ†εy¨ΏΏ1°[6ό;›ίΒmUΗδ%΄jκ˜ψΝΧDΊYLcΠ–WQ%ΖaŠqΏͺV£?’Δ›­ϊx²- γΐϋPla¨-£_+ €8Ψ‰ΰ3…EΞh.UυυΥhΫZ9~Kg ΄‘šk²Φ·γφ\βΈcΒ!K]χzuΊh½Τ ”–Άf§“‘β =~Ϋo΅:Ο•{x+γ„ρax’oΪ“†š$TG—·N9β݈S§yHκ‘:ΊΐDήΖΘΝV‘$ՎψβE]Œ˜ιΆρΑ  Β€ΪρCGx!~βμ5λ‘f…α4€υ΅Jϋέ—{?έίn{NλαΦ}4θ£υ­ϋΫ­Άϋ°σ²»Χϋιώ[§΄ήΫυ"—ql1Վ“ Κ‚λ¨ΏξυήϊUm£v: γ •Ί Σ-‹ND78—΅ΠUH%›ύτhŽ‹ΑŽβˆΧ^8΄ΘnΩ^Ή£σξρž‘“τβΟΡaXΐΞMŸ\Ϊr‘·Ύθ(Έ&P°@ώ§ΔvI:ΉΎƒόHRΝ"ψ†ί'π¬ˆp΅αE†ŠΓ_ψ:œΧq– πΡ,@€N`Š|Š―η@€δž₯§’Ο5\’ρόž›Ζ AΑ%H³βxj. ±ε…}˜YˆoώEσqΏa± 3Dœ&l…Ώ Rrο9؊9Pœs₯KoΌFy΅α(7{Β’χˆς½δπ+³£ίcς*ώ ΑκΣί©ͺΘ‚ΪφO₯ ΰζDe©―£κ\jΫΔ*₯ΟΞY6Χϋδ7oͺ&©*΄sηΟΌΎΉ<μ΅ϋ¬ΏuJ²ΎΤd₯­*Έ!ŠŽ‚!xγ‘Σ€·Q¨]qG¨lm³OyψϋΏ:}ΥB™–ξu7ŽΰnΌΉΣΰ–ΔΏά+G6Ήά`ͺ©Ύ·fρktφ'Ό±† ρ4qτ¬½σΌkήδ½ ™œq˜Υs0DžΡσZeͺRΠψόξ¦ dα5χ-ο<늽³€ς„˜;ΖI5?K―CniΏ›& [ΗK!ΰψ‚Εu7j|RΉRό>‘’―OCamllexmllsource.ocamllex[xΪ­XλnΫ6Ά“&έ₯MΪnλV Ϋ’΄›)gςrY5XfτΟ`?g:-юP‰ςtι’Lϊ°½\Ÿd΄¬#“))ΕΨ”₯ΓΓο\ΎΓC?κ¬έb|JXΘ&ΔIΌΕ“£ΣŽ|=Δœ0(KΉn½ά1Θmγ=I. [λΪ4Λ”zξ˜eN@fΛ,s 2ΫΕψX‘IœK{A’„F’7ξΆ‘.1Ύ§uqœD› JίW Lrˆπφeι W@’^¨Ό.xͺ˜p.ITΎΌ―ΰ„hΑϋΕΧ"¬]EFφΑ©’ €°^?,ΖGJ} JiB+‹‘Cί§WAvCΜPΘτ§UΚtΕ0φ‹q‘2'IIΎ€KgσςΫbIΚάrΩ ˜ΎtΖI1ύDQϋ‘μΘΑԝW+FΨΰ\άΗ%šX iW[Ήxπ[&ΤΈa:υiPx ―Ÿ_G£«±g/ퟏμcα6Ω'cμb7MY”τ0[ σϋ:ΟΤ„π§Λ΄δN§Ρ€ΖYΰMsσ€ Α”Ί.u,ƒΌ»ΐqΏM^|§Ι‹˜Ω -yϋδψBΔ_Ε’ή’=° ΟΈ1>M¬lu‹’Τ§ό>8{fY )τ@Ατ™SNε*œMΞWƒΓ³ά·ˆ0ΧΒSγgVM·5*ρω=eφmD™=ΒtΡ\ΰGΕv•χ5ώΔι ]σΚ@o„­wK?!CΔ…ιg υΧ:SJήَOβXkŽwΨ«ΠΨBΓ}άkΆι΄ή&AΕ.I™­–™¨<'HF₯asΊ6nSη―ϋΊšλ©β§-νftΠμ‘^CΤWJΗ¬½²³Ν9ίF{8χK_ΥΊ¨ΠκΝYQ›†ΎXr—ΚMYω+ELͺΤϊόϊ΄\x„3Μ‰slΏxv1θωƒρΈ…ώˆΞιΥΒ€ nΫΏ•m™P&zίβΌ8Xjl=φšψž;πxΦΜ‰oς…L61»Ί†Ή«‘ŸΗa9rΒv;MWW(^jZ‹.Ώ ]ΰήύΡL€oλ PtcS:χ˜Φf§5̟€’= q¨<Ί·Νt‹O•Ÿ›³ w7 φχ›K€bύEj‘A¬¬Ζ4“^|DAΈΟ³š[ΩΪ³ψˆ­=―Ρΰ'Ϊ94X$Χrk=a³²α.A7&΅Lθ7x“'„%To£ŠΞνΨ’_RΪ‚-ΗΪΊνQΫQFN†§ΰΏ)Z6™8>Dœ7K6άΌ΄εlθMx™γΟΟK¨¦8ƒ1―θυοaΔQ%—œ¦ήWΨρAΑσbδ1χx¨ θ Ήζ5½μΕ’tαΉφoξ Δ3’aUι·SΖxJWώ΅ΣeŒ΄–Ώp?Γ‡ͺž«B„7στt)©œ©'#£:β/Ε‚ΖS£PιΫmΫs‰k5wu€"jr?dUη?…ίϋ« OCamlyaccmlysource.ocamlyaccxΪΝXλnΫ6φ%n&YΦ¦i»V·F$§R½,ΑΦ΄YΠ?{ˆΩN@K΄-DO’»Ήυ€>Ζl/Χ'u‘LR€Θ V6mιππ|ηƏzTΛΟσρ)πΚ <ϊqtΥ;©Ρ—@ξ[,WΟΗΗ”œ -„ vίπ@lM!‘Ί‘<₯X₯©<εOΩPžςžΚΗjŠeό-±Laν¦X¦0o+(™pξBcβ†>α±ΫωΈ[&„ξδγ#J(‚πcΗ2€•€&δ·σρ>-ΏπFkΔ‹©{‡A•’9aΜΪ,žF1cόψ32N"ό|/χσ‘£&qpI+ξ2Qœ…Π*&ήcœΒ1 ‘o­Tο3`¨Pœ0ΎjBΕΓΖHΦυXξγTεXζ!Μ:s?χ‘9rλΪ ,ΰΉ `Y5BΌA–1. AχEq―%o²Αΐ >η.Ε‘γOΜ_ζA mΣζ#*X•Άi«‡-hΏυ1~cόΤ3^‰ŸΛ~Ο8쁽μό0>lCλό‘ΚP Ή?FΑ0­)Κ, ΕΤ„‘f€ΡMΒop‚Α˜qp }“HK>Τ *άε κjΪ…wφL_jιŸ‹σŽλΥQxHͺΒΉΫcό₯εαhρJ©ͺ­$Οo‘v μουβ έ Ίά͍bo#8qj‡2¦0[»x}ŽXdΙ aoΩ¬ρAunJ―•Q(EL[lcγm…<†BνΪΗ.?~ψ}ώBŸΏuφΕ‰γΏc›ŽλΒ b/s½— &ΎσΪΖκuDΖʚ5Ι†•^/‰JHήr!οiZvA_θH’GΠIQΛAΤ]]ηr¬D΄ΣΓ±ΡΦ7qx.).B°ΆΪ\Ό™‚ξϋ―ŽX-A¨›J;7}R$c°Ζ“"½R)Ϊk9ςV%γ8Q7x‚Ξ gΊ–}_dΚ]l*\TΜ·k‚«dο'(ΘOR+”C%5φ޲±ΈG!ϊv8Τήwg‘©ΫΚ¦β?―₯žόΎΪΖΥWμη˜νΦώ^ )Vcamlp4source.camlp4.ocamllxΪ₯S]OΒ0έPπΕcB|2jΒFdA’/ˆγ‡8B ΤΈΘΪ₯-1ΖωίέΗ½Π–$ή‡fχλœήΫ–SYπ–0Ξ¦s’,ΣάzR J9ν?9¦ρ ‰Ω&ΖlNK?z€'k―TD(tžΪT0ξΨB½EΣ"€„1–*”…‘l@—4‘LΌψνhy ]υ% χμ{γ—Hv;~VΒ‰ΏΞr­Άˆ7€ιŠΝՊ¨˜³@”’Έ>¦κ6°Κ΅w«Ω――%gΣvτasϋΊms-zN³&Ά° @ΙWbN ᑝζj€μ΅ΪΛΠΨ0―σχΘ5#[Π·˜Εε¨Λ8I—΄·΅Cu{{regular}}{{paren_open}}{{regular}}{{paren_close}}{{regular}} basic_typeseasm|__asm__|auto|bool|_Bool|char|_Complex|double|float|_Imaginary|int|long|short|signed|unsigned|void before_tag2struct|union|enum\s+class|enum\s+struct|enum|classcasts4const_cast|dynamic_cast|reinterpret_cast|static_castcompiler_directive'inline|restrict|__restrict__|__restrictcontrol_keywords[break|case|catch|continue|default|do|else|for|goto|if|_Pragma|return|switch|throw|try|while&data_structures_forward_decl_lookahead`(\s+{{macro_identifier}})*\s*(:\s*({{path_lookahead}}|{{visibility_modifiers}}|,|\s|<[^;]*>)+)?;declspec%__declspec\(\s*\w+(?:\([^)]+\))?\s*\) generic_close>)?)?generic_lookaheadi<{{generic_open}}{{generic_open}}{{regular}}{{generic_close}}\s*{{generic_close}}{{balance_parentheses}}> generic_open(?:{{regular_plus}}(?:< identifier\b[[:alpha:]_][[:alnum:]_]*\bmacro_identifier)\b[[:upper:]_][[:upper:][:digit:]_]{2,}\bmemory_operators new|delete modifiers={{storage_classes}}|{{type_qualifier}}|{{compiler_directive}}non_angle_brackets (?=<<|<=)non_func_keywordsaif|for|switch|while|decltype|sizeof|__declspec|__attribute__|typeid|alignof|alignas|static_assertoperator_keywordsEand|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|xor|xor_eq|noexceptoperator_method_nameq\boperator\s*(?:[-+*/%Λ†&|~!=<>]|[-+*/%^&|=!<>]=|<<=?|>>=?|&&|\|\||\+\+|--|,|->\*?|\(\)|\[\]|""\s*{{identifier}})other_keywordsmtypedef|nullptr|{{visibility_modifiers}}|static_assert|sizeof|using|typeid|alignof|alignas|namespace|template paren_close\))? paren_open(?:\(path_lookaheadC(?:::\s*)?(?:{{identifier}}\s*::\s*)*(?:template\s+)?{{identifier}}regular[^(){}&;*^%=<>-]* regular_plus[^(){}&;*^%=<>-]+storage_classesBstatic|export|extern|friend|explicit|virtual|register|thread_localtype_qualifier)const|constexpr|mutable|typename|volatilevisibility_modifiersprivate|protected|publicΔ&xΪν=yœE՝έ$β†ϋ4af73 ’ {dQoD£"ξ$λ½›&³3ΛΩ„t’Β‡·’’‚( β*ή7^ˆχήή7βνοχύρ}_UwUuUu½ͺκžc7a'ΏlνφΤ«zοΥ«χ^Υ{Uύ'όGΚuΕZ½6U¬ΝTέ\©Q,οt[Ν©Νg;βηBνR΅^ήUZFΚΕJacn%WΧZn­ XœI-B–“ς(Gί R#Τ+›nβNΫUλ•€AW‹qώ‰ΊZŒΛO"ε b-b"βŠβB»ϊŒ’'ΫΥg΄]dWŸQωR>H¨_+ΞΊΝΉb™›6O5Tdo5Td¨>”’[sgŠxsBΪ-yΊRΧK—–9W=ͺώ «κ η‹•c-έ3IΉF¬Υpηu’ήf‹εF=”vŽw—$dx=‹”§[J«“IΫ^e P e¬·vΰ5U­\mW\²Q5°-eŒξν€<ΙΠ@Τε”-λγΩΆL`‹Άlv•$ΟKΡh#£β5‹₯*’ziνΡWξ΄%Fw₯Σ–?\σ0‹-ΙιtΚ-3)`$μHΚ PγxΆΔˆΊ΄Σ–u;I™³m©ΩBΊwm”p„U;h„Ρ4ΫA#Œœ)Ο44βΦ “©ήaCŒ¬Ήb€]FʌeCςLj€ƒg„4ΣΑ3ό[ N£v‡ 1ŠvuΨ#mž”-RΝ‘έιΫ`νIί£εrRn0΄ZgYΘφ’rΘ ZΕŸ”b€ U›«’ΚQ½}ϊzŒ'ϋυυέΟ!ε‘b=΄‡‚§¨Ϋη’ς˜X΅Έ#<₯‡Ωnβ-H…ϋ|)i8ljjΆθΥθ·W’ςφ-β^£EΏώoΙ=7-h­«HI£sMΏ|Ύ#zε±( ­ψR*Vd½Ό”4pΔGύhIm`χ ύώΕ€<Œ}_Cτr^"—€7i΅—Jγ₯Š*Ί/#εj ό£p/—τHβ($mθjRž4ό•ά™HD^AΚΣ­ΑQˆ‹Ώ’”€₯ψ{)7ہ€_CηЎ">HA_MΚa{PZ€MΌ†”§Mπ!E σZRžΑ5­­ΑRθ‘‚]GΚ5X,€F_'ωˆΙcy΄₯λ sk?Zχυ†9$GΚ(ά sΘ²£ έ i1·Ψ¨ξΙΉ»‘ j6 Σ o$εz¨"ι‚cPΨ7I3-[r§λ W |#)iœ^ΫM’¬π-Ο’=ɞK‘4Zν6iςp±.Zεύ’kA#2τϋHnθ‘Υ?(!&xh΅‘’ϊ™Ψ»T©KͺCG5‡r}„”4 ‹w?*ι Ct…‚}LšΉ ¬Ρ¨ΟΣJ—ΈN+UκΜ‘ϋ„4Yi―ΦD’&η“’¨ŠφS€A њ–ΆςuIαΓ­ΔaΏ!',„ό7Iy† hΌηoIσY[ίΦQκVQwn΅ιͺΡύ)3V°q|ο’f³ΧΓwKb.ΤQϋެˆ‡Jχ=°HχΞ΄βΎOΚ‡₯j…ˆmμ’Χ4&ςΰ‡’ς€βγς#Rž¨δCZΰΗ:τδPϊ‰ΉQ™T'ή€ϋ)W)aπŽ­yŽ[ͺΈόΉNgic.΄…_θΊVE:(ΰ/ν»ψσ+Ι΅±Ϊ»§ΐΏ&evΘiΏΡ™ ΕΞ4…ϋ­uΗΩΏΣ©`Ώ•Βώž”§°ό>+…ϊ)Χ βύύ‘”Η« γΥDΚ³TΥ‘Ό³Ψ¨·k•œ[l‘YFΌΧψ2βΟ€€)ξρΞξ•όΔiδK±―BJκΦΣ-\ϊύ}’3BΏ—fΨ_₯^Θ/ύϊo€\Α}ΝPψ;)ΰΏ”|΄’ΊΚαvo±κY•J˜J;Β΄ΪΏ$·iW±αa9bνό›”qΤ||d@~€?[θ/t“ŽvkΤ|Σ lHž,ζςh/*%x8l Γβυ‡Ότ§mδσŸAΑΉŠƒιc•Oˆ Σ,μ2“Ϋ3hυ•™˜YŸυσC…½Yσ~ΨKe£f³JΦ_ƒDn³ˆIΣ$_]Rv)λ?άΩJ΅²°Ω%ˆMˆ€· ΨGQ«]u―b·Š¬ΔF G ‡H3…I£_Θϊγ٘SΟl‘όβϊ‘0γrœ“$Eηijg‰¬7SΓΑ/ήQρa5$£7ήΚΩTρю‰VμΣ&ιΞhex<Ί(@Jlί™ΤHςΨΚcw“Ά _’7Ζι£Υββ‘g ·σ³°DŽ™Σϊεmιϊ“³bHφ:A<7₯`N!³ψΈ“LCΪo}ηΌΩ{°ςζtY#ΚKQmt«+† ޲Ύ­Ξp4‘ pΛz₯τμ;ΘθYŸΞ—‹ͺΩ«έ”£τ₯6ΰfΙ.Ν"‹nΑ»žU/ηͺ^'»U«άn$7ίΕwόj΅}¦ή>6Η#“Ήα‘M§υωόύkΖΗΆlσΓΫ7ψγkПγώΨΨψ„Ώe ϊ±aƒ_@όΒpaΨΟεК$·₯04α2hmR˜,lσΧŝ°@s>3½ί¬³ˆŠG.π*Ζ©p½•ρΓ{ΦΌ·{‹°u!-€ο³θΆ_ΟЍhpΣή}a©?mΩίβ,–YœUΓώ…ˆ Ί¨Έή8,·z:— B¨ ϊΛΊΔλˆ[g)Η]—h·H•kW†½s­ uυ>G"ξ`‹\θX'_ςaalšλ$kϋ6›‘>t―/˜γ…ωΪζθ€pτœΉγŠ„Κͺ.‚ψΒΠ&ϊ|΅b,£hsžΆ\†lΚ=“ŸE)u{mάې>+[|RΪρUpw£-l4ΫLI”΅8œ“ΑρoqkΙ©©ς\΅έΔΡ_ςžPΠ  tV„h¦{εψ>ŠF½šχfƒσ(ϊ=‘s”Σ¨›‰‹ίαVΝ$\ŒHu]&΄”~•ιcϋΗ–.©v‹!œρE[Zs±ΈLœˆtIn\‘ θ A³zδvzh4~ίσ ―΄1©΄1•6’Vu$Όo;½ŸtZ‘«lyaΙ•Iθμ„hήβ€Νͺ"Α hPz=§"ωK0‹™υR¦ψ ηl;I0IΡκRz dΠ”Σ– Ν)ωFbώn±κ]ξ6Β•ΈA%χ³I1’ό†ΤΧΜ`:³²A6+ၰ†[¬Μγa’uX.€jΒ'Ρ †άn«+@Šϋotν(ϋο[xρ|“Ρ“…μs±ΐ°!EνTΕ,ο{‚ΪcdΔΊ‚|ΣHwΣΣnW*šϋ_zΪc‘Ω³F>%0 t»Σ|—‡¨•d—χk/zDDΩ:\$T±ΓΠ€Ι= Ρڌ:Σ¬Xt€’E=δΡZΨ~φ’U:«(gX?“―˜dΓμIΠn+ΆZ ―ΤfιΣV΄@Ϋ1_ž Α›εŒφžPŸhPϋ6(ΑgœΩύ ZΤΟΤ|΄ΛUΗWšωεzŝjΊ3~p\ό¨‚―ΒAφ’΅Ηo·½J6<Ϋh7ά“3 ‘Ϋ­…`Þ"Μ»λ8ΜΝUκψΖxžζJ΅Ɵπoξξΰ·K½Ύz³ι•ύZq'ͺT«χW’«U½š‹~ Νϊ₯΅£QŸGεΦ.>‰†ω œΌα‘=¦fqΪ-΅§§ΡΖoΊUDN±ΆΗGPh・­‚Ξϊž²=σ·lmε‚Νώ/ΪΜΙFΓ2γΆόΉv‹γEš%OΪ»Œ:Y2)'³ μ؝¦δ…Α–λt?/c«£SΘr|ε•ΐXΎX%γP 7b!žEqξqQ=ύϊI½ν…mηŽΧ‹2zšcπίΛ; ϋ ‹κξΕΆΣ2¨Γ-~“ΛΎ†gRίncItήΘαϋέκ府qt2^?Λΐ {Ν(™s³O„₯Ρ4jφ‡d!C9jAζΜΟ€‘ΎSκξ$c³sΥΰ2κ’tΥώ¬V° ͺπςkq{„φ°Oγ±’r‚kΙ{§Ίcžόσ+η- j43†œΚLVO+—Ь"ΠΈ=Kΰ‡}L£Ξ“7†ΨfΒ¬ΥeΒ†"θK₯yyh₯puVmεfZIρΪΌLi˜Ž$ς]ΧωμZψRψώ.*vœ4gh¦§nΘγtTΌβL­ήlyεW9₯%I»ZUˆϊq’X΄kT0$I4‹ŽŒΧΟ%iz0ά6ŸV›€i•Ίό:κ ±Œaκ΄3Y? X ­UŠp€GŠ!‚–έΐc­܍aͺβ?*0Χ±„£##C—QΑ0—NwΓ/_W7¬4D’ˆΡχ^™\α“βΘfl–{t–ξ^Νξ‰ζL:Ρά‘«ΌΌ+’ mS@"{λ’Θή?Dφt"»sα΄ιK’yΝΩt’Y[8ΡΌwI4ο’9—N4/ƒ*εΜ‚Β½£JEH,Ο‰e#­ΪzΘKΒΩαl¦ΞΦ(œΛ»)œi}δ%‘ν‚ΠξJ'΄σKU-œw. gχ„sO:αΌ|I8ΥΒ)ϋΙ½άqοζΞzπ‰]ΰ…šΐ>•όΠΉ_‘ϋ#™\αœ‰|Ε―Bτ¬R’Ί{Ώ0^ς˜κ:βcX kΐ:υu΄ΛB~οYϋ:Ζ>’IW§‚ΰ·ί³χŠ)_p{ 1M9‚zνΗΫm°Υ3 /λrC&Β‹‡FΝ·€ΡxŸ΄ήΚΎΗ>f°‡e…ηp4w+—ŒHh˜₯δΥΝΐHΧ^₯Έ‡Q₯₯d> pŒζ 7λνFYεΑ•BΌRWy™Jӎe&֌e»~ŽcHΟRU—Y£ΐΉ/Lfɍašχ# O"―l£Ε»ιut„i‡6ιΙ99Iguœ€ο ·bζ k,VEϊ ©―b»ΪςΛΕ`IaιA(¬΄AAvΜΞΧΐΘN= u#_‘ένˆ…βΒ­βΈ΄‰Λ@­όΐσ žαμf»R`ρ:{=θΛ…Ύώ/Ή4ŽΰίΓ=|[t―[š-LnΛ&; DYΩ€ΌNSXۘΟΜ€pˆαΗτtΫ«΅dΓήYΣopTΖ&i2₯lEΏΝWδίfΛ½κΔ|ΛΝ!ΠόίxΘ3’ΩΏZΏ,Iώš‘*Σ]IU7ͺρH©›½=4aHτχO u双Xάόs-Δ“»ης΅‚ϋ½ }ΠΨ+xτξbŒΧ\.'©Π¦5ΪA• ϊsοC6ξC’0ŒώΡCΕαCoΎhϊcψΛC[²¨Ρ¬œ‘*δj<›7拍Jβ–«¦9v΅0ͺSΡtθ!΅ζ5ωaVά]“#{-χ‰2€²@έ&Η+€η―δ{0άPΔ'4wιVα}N; έ°ΉžWŽhx“tΏΤp‹;ί ύh•wψΨOσjmΧ§~]₯žqBBλΟΤ[uί›φ§.BΪmΆθ“σ€Νyƒ†‡J[=ώό―κšχ0οˆό<πόssΚΑ_h έ {•Ϊ*’­Όb5²ŠΗ@ϊ\}s$ΡyNHMn;;–IF2ΌA ξ’V΅ςz…VX–D)_³(•ς;SΚΧ€Uʐψ€:ω• Α‹KKzvκhΠF…ΖΫ³ AΊηΏӌ¦GΪX-v³ΕΏAφ›c[δ±₯Ψ%Λx›ΧCσεkόΚ½Μ/y-ό*P+(²8WΕw(ΰψ[τ¬ήΐΏμFΏν­Υέέewε§σ¦†•=HlΌrψGΓ Nξ’ωΆ‰₯’/kξ<" κ"ΥFvˆύZ»Zk5`•Gΰ‘Qw¨5οr·>ν·›^m&hΓCΔΰΛ4ΠΓ ΔCΠcs>UAΐG›˜YΘδ„DΉ»ηώl;ΌA‚E)vΥQC‘υ·\qƒ{X$occώΨΈΑΈ ·Ώ§τ+‚ΟՌΨ|QRόEDζ»r-T¨χ>#LeΏ/-3ΉΊΠΪ6μOmΨ†—ΧΑ{EΡB±)k±˜=R¨ρΟώ <†a{&»wί†Ρ‘ν§#9ΘαλwGΐηςCδŽL£ Œ}‹1ΞвŠͺ[θΕu’eЌ.μ5ϋ¦ϋΒΎŽ~΅€πlΏ`Θ$μήImψΡ6δtΓ .›³U±Π$zc°Ψ©Tθ OΑ(±χQj…ΩΒͺΉ°ͺtΨ;ζ„ιi[%0σŒρzaοZΪoΎχ4U·ΔΖވ•μύY`διd…ΛΛ^β€/ΙgΦΠ›v,ήkL(ŸXƒ/”Νκ7Ϊ³|ψ Ϊ05½«·ΟΧp#Οε=&‰ΦΆkRμΉpή–ω]^’݁•πy–ώΐγΜ͜Ž^PΦSj’O NJ? š^οŸXŠυSέΎ1ψ(Θ.ΌYβα*Q…c~/m>›O*ΝO˜–dϋιzAjΛφΣqV‰·ŸD’l?Α"xn@«Σ Gœ5ΦZ€sͺν•QΚwZΕ”xΏ2΄ωϊΤΩβw΄ΰ΅³o₯₯=₯ήν)ω‘$)7—xγΩ4«‰Χ #wΉέ#‡―^&₯‘ηxbύΔεΙ¬ ‹γOMaΝܜsΛ~ΊNpΓ=ΣΞaϋ‘mT7‹&)vΜρ~ ΘnΞnΣd…@tΌ0@c?΅R%ϋšeβ₯B—ΊL3WΒ[„ΗTΪγΚΟ_"=WΖx“»ah[ΉΔOΔ‹H£`ώ‚a\ςφ%€„†5ǎ…Ϋ ©2AψΕΘ^³Cω6Ax’ΌΘ$`V'§<)ΫΣcΛ·Έ’"Ÿ–ΏHΛȼӁ ƒ<Ύΐ)?Zγ‘z+Uξν]Œ7p{"’Κ‘_γh†R@zy΄ŠφΠX”³·¦q1eδ$±Τk…γάΟYgfXF'‡ΠRυnΎbκ³dq€ζ‘ΥΣ€ηδ{*σcήΣq6SxDα—xHj 7†t'ΨΧπ—εΕwp–βΩC!lήΘcC/UΨ$dάέȍ―‘ͺkΟΛΰδΛμΔΪl§)R˜w8Χ)ξjΎή~X!Θψ³žΧθ­z9|§ύ4 ΦδΌ ήLδЎ₯ œΕ€j„₯2ιγwkHξ†9p§zηK˜ίw+Χ«xάγΩt»K¬!έA‘:oΎSΚ–{41oƒΨθX+HCζ‹ξr5SΏ]UνeΫδχχ!½”ίΏ”ίίΣό~ΉˆΕxišoΜά‘gΞ³νρNΖύZ·l‚ΠΊ §!€p΅:$(+ϋβgiN30ΔΝΎΒ°Pγ’e}Α|1 \/§BN'I*οτΕ³χ cΤ·ƒγύž…Α;Ρ 3ήIwO5Έ,©lΘIΛϊ5θ‹ΝP: yFf½Q©υχ{†ξO7ωU¬Ν ¬ύ_ηώΚZPσ¨˜–w€ΰ½ΪjτύπιΣbj)±υΐIl}Ÿ K‰­‹.±u“0@K‰­Ϊ₯Ήΐ1»ƒ…“Ϋ Y$‘ΩξΠΰfa”*ύ²·6^Φ™0N%λ2…U–Nή\₯hήtφGι9•Ν’[S!J:N­f'Σ„ΆΈ2·ααTίBxΈc‹ψζqj€ˆ=RY¬,;Roœ26'©ϋ<«άφ:»Žvϊ'IΫd₯2u χIλς‘Χοθ^³cuέL^£x*Eβx^|Βƒ[Ήr±Z•Ξφ X~…€ΧFtΩeνϋ'Μ–†Ρ8pΧ€7t·{άΝΊ³₯Ψ՟]ž\ƒ>)v›5ƒυ_ŒYΖ›υ ά‡Ψ4.°‰ΎΥΫ䯌Xά»ZF,|ωz ­ΎrόΕ•2|ψDΩΗΚNbσ"LNθ”πFKΗΚ|ΓC3SΰkΒ¬₯(ΑrŽΜb-.MFυcŽFy ΔΉ*¬ yYšζ·γd© ΣΌRa°Γ¦{ϋΖaψYD&‡’@x Εκ˜|ΔIψ8π"Hc>WΕ =Φό%?‹)‰ω³Ž„ΤR³„œ9άΝ Ωˆy­φHAr&θ~ޚδϊ„˜hφ"ύω‚ΔΈς-.Dϊσ§M“!Iϊ3΄~3Πǟ₯ηΤ–ΝXτ! 5ΩΝL°p΄ΌΡΎOkΖ J#―&35Ul΅^©έr§¦ˆ«ΰ‘χdΌUP8`ΌΔ€+¬ω‘‰5ω,ϋzίfY"F.οLψϊΒΊ― ¬£IωβΫΠΡx“Υ›3§ΏΣΝ‘H­ ΊaϊF—‡ι~ “Q-ι4Ά σΰω/€ηΤwύΎ¦aďU1“ Ί!ϋŠηή<ΏΥ‚ξΰst§%#Fw€ΰΈΌB€^bhλΗ@ύY ώ=)Fϋ·ΐσ_Ο h›Ÿ)Β΅rbΐy|‹›ΩD‡mξαΆM–χ,ΗNq£v$nfMNΧεΖSΧ―Y€tVLm ΨJ’6xΈ\©nYπ0}γ‰Β‡FE- Γ»|‘uYpS("»Hνυ ΣwSOΔk`QˆWβθτΚE4’1ωοΊάν0χ7!!λ¦_r°ŽΡ]ύ£o έ|9Bνv#tρ r”#<ΐγKxǐ†ΰޱ5θ|„Ÿš]ψΜηο9 eQη© {“Gσ²XΐμΥΊ6x(³Εr£.)?@&Γξ ϋ³—¨θ°GAυ‚vκž^<Ώxήκͺΐ+œ΄t«Η¨!Š *κΨ[Aή» ΑΖI““@9›5Θ Ξ%BίΉ¦Ιžσ= /ΎΆΟL€ͺ—yώ¬whdmDΓΪ_ύ‰rF%»R”‚“pΊ ӊZΛB““PcyT+^9Ξ9šΡΩTΚζ‘‚Ϊ”•οJ€·: IvI. Rά₯^P&ŽˆˆnΒΗ‡? 5Ϊ=+ίΧάΉ»η‚‚ψ²ζ\}:Wε4lβλ„<•cιξŒΚξN|σΫg^‡qEαμΰ”fΫΈ1ž(΄ 딀{gΡψœͺΰ›Ϋh _gΎΨ¨y΅+Ξ¬Σw4hΰΟ³ώ¬W g­\mW\Ÿ”SH[V؝ǎ΄gΐ―(ΰ·JΖ/lΛƒ«b%L%Gš/6[©+jK+η„e±ZGζH¨μ"ΟΫUOc=θi»£αμΚfΦα9‹ΌžΝ‚#ošΊiτάYL^€#ε%ŽH™^βˆΔo‰#GͺΦ9VΝ‘‘3:žΤ—xγIc‰'1ž΄—xγΙnkžtšόΣ•5Ξή ]_‡.ξώ=πόΧΐσ?Ϊ²δ|RfŒ―o /lήoσ62qΒKΠ4ΟJ.ά’*'~7tznι9]AT€ϊ7%š³τ\Ύ„Jξϋ5Άγ‘:¨/o[iOβCb·O'vBx»afrοΎΡm†ŒλΣ₯ˆH ―Š(Σδ`ƒ=WGΠ `άήΒW|`Dh‘tαΦΒό°..D›ΈΜΖzMΪ?™ΈΦ–qΗ2Ζehτ'ΑΑ0‹όφ>/zž΅žQ\φ• ή2‰Τ½ήΨFΩθχά#usNΌ3γ»”Ω΅±]{²l[b'άbΘλδζΔaˆ,.pRκ2κι‚W8)τ/tΜ}ΐ\»Ž”i 7 Objective-Cmh source.objc before_tagstruct|union|enumcommon_protocolsΊ\bNS(GlyphStorage|M(utableCopying|enuItem)|C(hangeSpelling|o(ding|pying|lorPicking(Custom|Default)))|T(oolbarItemValidations|ext(Input|AttachmentCell))|I(nputServ(iceProvider|erMouseTracker)|gnoreMisspelledWords)|Obj(CTypeSerializationCallBack|ect)|D(ecimalNumberBehaviors|raggingInfo)|U(serInterfaceValidations|RL(HandleClient|DownloadDelegate|ProtocolClient|AuthenticationChallengeSender))|Validated(ToobarItem|UserInterfaceItem)|Locking)\bcontrol_keywordsKbreak|case|continue|default|do|else|for|goto|if|_Pragma|return|switch|while identifier\b[[:alpha:]_][[:alnum:]_]*\bnon_func_keywords<if|for|switch|while|decltype|sizeof|__declspec|__attribute__¦RxΪν} ›ΗuΨ ©Λ²dJΤAζ%©ΰHΤAŠ^ν ,±w),υΞΤξ6ΡΣ=κξΩC,&Žœψȝ؎ǎsϋσ—Ÿ‘_”wTUWΧtχΜξ’¬`)afΊ«««^½zχ{υw3όχYύω|˜€Ι½½8νέΏχχgͺ_­6ΚΒή}YΘώl/M ™ε—¦|ΰeσΐε)ΈnΈ’??_χ@^Žδ1ύωΕJ»^˜ΛΩΎάG±3κΗυη+•Άύ°gσ"υŠQ&σY™Œψl”DE”&³+hfNWOθΟΧZ»β―;ϋ„ώ|΅΅³Q‚Lκλ“ϊσ©J_ϋ£€GΟτΒ8.jŠΖv ?­?Ÿ©oμ,νŸ–/ωŒώ|nβsΓ0 ΞΪώΦYŸ΄c5Ψώ…Κ“qΊΖ³ΕιP–/ων‰Mm―ŸΣŸ_4½/OΣ¬Ÿγ dβ σήΈω@‡iΏlυ;m­μ«Ÿlke7ΝΪZ½ς}o«ΤΆzυϋN|₯Ϊ*νGϋ‘ΜΖgϋ₯ιΪΫ}yΊφvn_©ΕΥD„H?<‚φΥZͺ@―™μG=x€lϋtνͺ¦{τœέW6ΪTΝν4Ώ^ lxίПΟV[er˜₯=™ηi6;{YΚ8ο ώ›g|Ўλw§}Πί”ΟθΟ ωΑ΄8”Ωl”τβQ_i  …νΰΩsv`‡ώœ·pM”―|~Ϊ'μ;^˜φ ‹Ÿίšφ »Ώ­?―7?‘bΰcQξΕ€δG(ηχ‹φdη-.Ϊ“…G0y™«=1Ι-'uυœΨΉ\;gv /žDcφ’=ΩIΝ]΄';»οzc›ΨH…€”ζLμ₯ tbητς:±ΣΉξuΦΤ‰L&l¦W.Ψ‘Φ«μΘNν5osNκΘίIί;ίσv"ί?ίσvό?8# ·Ρ/Ψ‘ΡλμΘNν TLκ¨nύθό}Ψ ½yώ>μ\~ΟγKM}0wφ‘lή#ΫνOΧΑαǞ¬kzH‡2+"jeAhY€½4ΎGΉ£-κΟΟU£d2QΩlΙ“cΉ(]?I\ϊ(9pF°\+`κΦΨ·Σver[»Ž«“ΫΪυΊ‘?.zοή Œsχ¦ώό„½Kš’Ή½ζ=φp‘Μέ·τ§Ρ˜IΌ67oιO£ΉŒiρ¦αΊώόd΅‘}Λ†ώ4zž«΅›6›^( "ژϋ[ϊσSφ~σtl{ΛοQYΣμmπΎφ:­i»γ‰]~[G1eΩuvO”+Σρ$Ζɏˀoξžωέ$Ζ›ΗoλΟίmxά3~˜Ηήρ6χ$›IΈ_ΐ&O4=άρ„²3X]LοκΟgΊ³Ά˜ίσˆγd3ΝψψβΙ(g2υ˜NξκΟg:ρM<ζΉέ ΐ3 ύ 0h³.™>~κm|fρι¬<"ŸηπŒέLχτ§1ύΤ4ω™ώ4–šŠΡΙ4 υηWόFž±Ι΄ίӟ_oi4*JF0=ύωtΛ3¬›'ϊιdNhξJ7iK <έ“³¦sΣxί#N¦±Ά‚˜f<λ”irθΡIc•2χ#οMžΥΚ4ϋ@ΫU lΊn…ολOc~u9OμΑ‡-Kζξΐ#ΨΦβc$ή|“i—zT1™FCύiΜ/`Šϊΐ?ͺ―όΉΗˆ\C‘i“yόθ՞ΣE? *1V°΄π–Β.M³‘(ƒΒ"-_yδΑΉ žcΦT$1ή܈ίωαlOƒΪ iω/Ϋ Ug6ώ«6šΥj―4=όλΆWΧY ΝƒfϊW7ΐηίκΟoMξaOώώ n°.™ώ}›¨±κ˜ηώtκ7LϋΟΪΘCƒ­Β<ϋηϊσ›ΟΊ6 σΤПΟMxjό}‘?Ώ\χδxσΏΤŸŸΆΝ Γ΄ψžμR1]˜F5φV݈Ό’?…qEHόOή[ΗΗυמ£­ζφίx·΅‰ΔάώΟϊσqηΆ}φo=‘M[,Ζ΄ρβΙ>Ί/­ώΧϊξΖdΕζ‰wUsiυί=ρΞ5§˜6£ώGa!ΪvΣ“ΚΖό/ύωwϊσ’7c†Γ9$ζpgΜ8ΝLΜύ ]ΜΏωΣέόκσπ ]!CW`ˆφƒέ½ΐΆΏ<φmχ£K>Ζ#§…ΘζrILOϊγα\6ƒAΙήGœKχηΉσΟΨ|wηcGυώ4£Κ{°eΌQџQ›m#₯»ω5aeφ;QqΈšfƒ°―D—xΣ𧓏†Γ4+ζzq˜ηs=Ψkαe―ι3^S#;Μ…Ιι,+:4bU/ΤΞ™+HτsVζ° 4ΟΉ«pΩ§UΒqβ»ΗΧΐ€Ιξϋεt/5Lχ¬s(υNύ P/_π-—€ΈXθήψ™χ²g]Dȁs™ΖΠϊrCηΩ”/ύrσK[)Β%Ep–ΩA £ϋοξρ"™^Ÿb)ΠV4›ξ³Ό»9£±4βΠYVιΚ4@y²†€δ o (ίj£s¦ΟvRχ³™ϊΏ±·›wΎnΎ<έ ’ιίxΩγi4R l€8]9Oε; “ϊΌϋ: /8­3φψ°&VyS/8―³uψ §5%­ri”ιHFKnO[twwψαϊGχήηOψg~\έέ3o4ώ7#X•ΤŠFed’v ²t4€g^h ·"χ χ©₯|z¦aα'@¨aLΝ\ΉPΗΟMœμΩθίε:ϊ\Y’¬ΕΟάηY±œώΞ/H_-ŸLYmD…Τ3w*ήxš˜ΌώB ζξ~XJE•=δ‚χν™!α―gšωΞ₯Z0 ΖoΤ‚Ρ2ςΌ ]ΘήψlΣήΈΘȚˆ`ΒΓυ¦‘χ*γ.¨£4κ—4ΙΘΪ9pςπ@Ξ‘ζθ“£«)KθbχzQνAΰΣXKρͺ2ΨΜDωΙ₯ΊΏ<;o!-djΡ}ΠtΘέMx8ΣφW+½ύΪΞϋDιNε΅cύ°]Zwιζ»όΙ 4«€Ο«ÜΤ­ΆΛ€Ÿr'”I° &³v?=S3Πlνμ»&ϊϊ…Κ ?mχ$*Dσo–*‘1# +°8%ν§„n½.δμu;yΤ„iO‹ΙV†sΌς"Ί±?Œ³€Ά²_lβ\[.Δ ₯/’EfwCΩ§›μ“Υ'IcύΥΖΓ9㠝#B Κ{λ|žj%υΊŠ.+^λNlœΆQ#ΕFύγkΞ&šƒ&‘ŸόWΫv}ΐŸκ_5ΰκjΈώ³6iφΥΐω\-pζtΜs5’ΓΓ4,و#οΊ ]VΗΓωZΣrX€!o€mpSπμ+ C?nΈώ7ξπΜJξœΛ·šϊ)” ™ybύ½iΩ£_A’@*LΡδ©zi_ήΛεκƒ£Kβ₯Ύ^¬S5E} l>ίkΒmCfŒπlœ8„~*|ΑJi™ϋpΨO1€Ιm?Ž£ZKρ›<‘oD :–ς¨§’π>4JR€[˜Γg”ΔΰŒ‡/LGαKq˜₯ΗπyTΰΖTΪ_¨ΐ }€&™‡ϋro΄ΏjΚe “k¬‚§dˆΠυχƒρ€Ν‘H¦C­'~%¨εο±|š½χΩr9d‘†£ΒΑT R/žΑ(;ώτ›>y“0ΐ?ϋ™BΝJΈέΥοζσ ζ4iLΎjχ):Oη~>JΡ§ΧOGqŸλ}ͺυž3_ΎέΞΞτj(—J4˜^_Ψ\V[;js««Φ6|˜mZ–8=—λ»!'žΏFOWί²Ύ6ίS­xΧζŠσ¦oϋ»/“ƒR± ―ψAε›·α›kλͺ³²ΎͺΊ;·WΤ{+΅Ί°ήΑWͺΥ΅NW­/ΐ?΅Ÿ<Ό^ΐΖBwι&Όqik³»°ΆΩQ‹+7ΰγΞZχ¦ZΩ\ζ/‹+έ;++›j}ν–;„—š έK°‘’M:νƒωze0Kb‘³o_Ωμ¬uΧήYQkσΊkώλˆήY¦q¦iΓ²ήZ•½½ψφ핝χΤBΑΏ½³²ΌΆ΄Π]α5°?qFΙ0©ώ\lμφΖ(ΉŸ€ΗΙμXG—<βBl8žΜφΓ(§Ω¬ @©Hc_u›³Ϋή>T/ΤXυGό80Ÿ(C4ΰόΔ$ΚSχΌOEΗ*Ό—}₯©Α0¦p›ΠJέώrΊ ͺoύ› §ΑΒe ΖΆsXz§²&^ςΜκš£θΗ1Ct›΅Υ½ώ Χ wfR’ΩdLQ"πΉA­2\~«%οw+°˜ή5WχzK’¦ύŸΜ4ό΅ψ:¦˜¦φWόσΆ|β|°™$£^> ϊTΠΔHνlK;£ρλΚX7ˆQAΑΙ5Ώ»{5˜έξκwί ­³ο\7_)zΎΒ˜žκˆΣ­ak¦Ÿ ‘‚BHƒ‹–±Ž3Βg-1­ˆu ς!»TGf.$ϋΟV‡ΓbI\ΜgΣο=ˆ1}©‘~6™Ι(΅qi{ οΈμΎθνLϋΚ΄θRΏΜγsθGαA’ζ…cI6>h†ΠͺΧ φ«Θ0J :ŒMӛ„.ώ˜ώ•‡Aίhξ™,'gW$"#ή +Pλ5ͺ}Β§B—§BΤ―5 ‹3’N~~l t_| Ο΄_jή3κ f¦ώJbŒώ‰††aΓ²οxΓ j™L±LΚL»ωτψPΕ4¦³+O!δΕςΪωςŢƏ=„όeB6!ͺ|„¨ΏΙˆ:w>DύξΗG9‹Gω›Œ/Ÿ!―|ω׏ς7!_=BΎΦΤθΪdτpΦλ#ςΌΓgƈσ’ή΄rο#”ΌJ~|(ωƒp(ωΨƒDΙσJΎPυ¨ϊϊωPυGΤ³ξzρ%/Ž’ož%οJΦ]χ₯ί‡gpΦoϊϋ€ζ0ν&ΠΥ!ΐΞό3Υ?ς§ϊ\uͺ 9{‡³6N5oΟΰ>›c»±ΒYh`°8―TΞ;˜&ρ)}9Ξ’B*ŽTƒ 8B§*Iπ’žοAš¨cήWTτο%£8VψΕ-β—{£$ΰτωB&ρΨΐ‰˜ω–·&b†!εσ>ˆ ½Ϊhm€2‹₯TΪuΛ1WΨΉVγ\2«±Ω7βΣαa‡£'Τ†Œ–κΰ₯Α΄Α΅B΅$Γδ@v†2ŽρF*ϊψΑ­β4ێzχα«Xε°Pj™K’A Ί"Mγ½0Γ~ήA§& 2Wς€kΙpT¨X—ή!Rα%θYx½#³#υδv–E}ΐ™m€£\v)-> ΤΖnDyŽƒ’ύ;XŽ%P[{ˆ₯ξιPΒσΌοτΎ₯0Žα9° Τ²ά„ρ&UΔ[”‡αQ”fΉ€+ώ`-ΩOu[δ2[3AξΠwΦΕΝ0ι˜βF­–Σγ$NΓώ²Œ©’ŸΪΦ+ͺο/Œ―’£°p(‡0‰ΐ„₯yJχ-ϋ’›¦TκΆϋv^„υ”€μ °αμ¦N‚Eΰ2κiΚHO³ΪB;ζ‘ύΜΏωΖδ‚ΖΡζΖ]PdŽΠγΙAI8k•SqšG2qaES•v8S`ιcuτΒώs—±όiEώ֏ύπ7/ΰzβ¦qΏ6+Στύgήΐ+Ω{ε­)X}l˜iΑE9¨€λ€|ΔσFt9ύ}³D˜ωΧ5–Όξ‘IpνT1/¬Pο§]D}ζ¨ΥMχp ΈyψGΣq/ΥlƒZωα†ίύyΉΤγVryσχκβvρŸGόg¦9Έ"iλŠΤy:ΚzγΪbσ_²ίlkμΜΛω)ž©»σεM4 zffΪΜYv~7`έΜMΧήνςΕ) q•ΞΤMβΜ™‘xΧ\ώNMΉ€)ωΨΤcx²δ4ΊΞΏΒ’Α”κ\Σ?ϊ­΄<Σ”Gψ_ά†Ÿ- 3ήj"lγX>Σ0žΥ–ρT&Έ[±¦* ™ΈΦŠžm7―ή}σέ»οg©|QfΩσp¦©›Ρ€uΏW™zYηv‘~ί©τϋ)Ϋ/Aξ"οV:nΛp= žύ#·αSe§γλ=ί+Ξό¬ίkx¦’λΉψ’γΨΰΤ^F–ΨαΚ”έWfίχSΞVΫO3uNEϋκή6@}*D™ƒ(Ψ;TΗ‡Ω&Xη†1'Σ'GΠzcŠ΅«<ϋm‹Q΄§F΄©ϊ°«!hžE¦‘ UΚUαϊmξ+Ÿh˜b§αϊmwˆΟU‡ΨX ζ1γ”«wΈ`͎ì?Ϋ—½Έ9ΉnRΘόSMέ·nΈ;Mψόξ”k9=Έ―Lχ4oja6•Omnn}@ »<αŽšJκ}Œ¨ψB θ‘=dόrσ Zχ“&tΌ{Ftœθ!οώz"δ'|„l¨…ψ1βγσ5θΒ{0θψ₯Ζώ[!χ~6ώτŒΨ8Δ42ώτΧ?9Σ2'`πOo5\ίlΈώŸΠp=jΈήTƒα¨αϊί4\oͺ£r«αϊjΈΎέpύ-ΐψwΎbσvAδϊΘ·ϋa@oΓΣY­σΞZa­y{½aμ-xT±ξ^ΓυϋΣξ…ηΛύΥͺΦ9…Z*°u_ϊ©Ί·ΝΜ΄Υ ϋ˜χζgΞ7βΗ'μΞI”«yΰ δ*P`jΑqšΚ“ž*=’Y–Ξ`\ΰ­­„ӐͺωaP»ψξ°χ* ˜FLW¦“ϋ:1y¬Ώuζ±Ξx£¨ΡhΒφͺ ΛO΅οψΪδ-q0sŽ ϊ©iΰf7ΚU;Ζ2z›IΡί6Όi*UΨΈεΖVͺͺΆe‰™/Z€o”žεΒPŠ; ΞΫΝ›^7“ O,׈•ύ‡‚•[Y†A4Νΰp¦!?σΠ’ώ~i‡zςϊ§Ÿy¦Ζ( WΑξˆχζί„αWγΒΣmΡj₯d»ϋα›oΌΌxΫΥkψ†ΰΣpd7ΑuΏΜ―9‹Rg|umTM=Ύ]ιρv₯Η‡j/C«|ς`«Σ7Om±Ί*τ^¨ΙG…΄—|–ˆϋνΚtΟ#[5ςsMŒδoέ7NΦkˆ©»€w¦ WM²θυ6ΆΧBY*²ίμθEύB¦ϋg(ψt­α_ΏZ4ψόLΛ”?'UŸ–w‡ώ ρο ίEμNΌΚƒ(©£Μ3­ξή6dhJΣ"ƒq ύTΜͺέknΰ™&°NΨ›ϊί°φ`ŠΎΌ='ξέ³1ŠχξiJφ©Βε—*3}Z£0†3ψ5‘/ΟL‹nͺ–άτϊ―Ά½ΎrθΑ54¨žΨμˆx—θ¦K7π‹ZΝ ΤFx_.₯1•όΔێ °5lbBMΠOzΈ_τΓψ5Τr‹Ν(‘ΫaV¬ 0Ξ§{˜Ιςg ΆE%όςmό¦; ο―ΐkzq VŽ@fήσϋx£m0ˆe$ƒiJ޽^g@ ™±άX”ΧΝ‹e v›~kωŸ)-Iέίv|D:JϊγyΊιΘPΡ0–[ϋΫ#λνaέε:±”Eΰ/Δ2+ΆΓDΖ°ž1LξHvΣ;QOƒy…‘ExΘŒmRΣΦ»’"—…Ψ‡]ˆ›a~HίΥ§½Xώ$M€*ΔR Εz”Πγͺγ•ΈΓn³D)οωΧπ0~…l έΪ'2Έ”†€?IΑΑ«€’+ Β³Φ±F!gy‰b61r6b€#§Ωαˆ(θ6ο¦Ϋθ>θσ/ΥΜJd?υΰ  Μmέά΄Π?~£€Ž3OΜΟ5ρΚxK`2€© ,†§bC)CΆ–+ύΈΩΜ@W€¬”ΩMΎ΅χ‰(Ÿ²ο’ή`©_iΗα<›Γqσ:› ¬EΩVΨ·Ξ—OΉιΝΈFMvΫ{)pwZ9š,Py‰B%&9†Ω©Ε΅&r±Δ‚°λ7Βμ> ΦΚ`XœjαKΚΎ™Z‚¬–.χ2ͺΐΊrΟ XV0πL œ(x˜8”,PΏKΔ~Kž/Λ˜δ:Έ‰3Œ₯2ϊ@τθƒΤ_ΝΘx)ΥΗU»ΫC™t 9άIΣ’œΠώΎ$F7G‚Žξΐxer{ˆ±ΕΉBŽΙ ’}Β°=ΡΠb₯₯œS#eͺΡ^a; /ˆ‘/₯bxŠ+,ΰω ‡΅–o¦ΕT«ε_Δω~€"δ8ΰξ„ωOd–"€ΰ&Γd4:?Ε;Q2qΌφ#ΒυMΐΔˆζzφ‰η0ΌFJ__iΖ}£h†L*ΠpΓΑχΧΌ€τsύώ΅xβJS2Cφ―G{6 ³r[ιwθ[ίn^CQ΄›ΧΉδ‰ΎΚZαu m…Η–³lΠs4οΟ#rFd»w‰žΓΎ»Ι€)½Ερm³ž™ γHΦǐκά‰ϊ ΙΐσJ ·Έ‘ο€Θ8Dβ΄KYUWa=,IX;GΚκ@~D³`£½(O*"±\–y/‹H:!N·ΆΒ ‘Σ0ΚεbΨ_ΠηΜX)p5‰(/’/–ΐ¨ Γ£g·’ψ”~Γ³Ψ-(²!&&$πR’«Ά³ΐΗ©Hr†=Œυ]Yͺ`d ŒΨΞl…P€ύΈ$ζ€ζ H_ξΘoŒ—Ήίι’kv}πPKΨy˜Εβfχ{ώZ»bYU(_±ζP%˜«DNIjεX ¨#=Υ €_AF—AK>GYΞ½vό²ϋB”q—£ώ"šH(Eϋ'’Ηp‘χ’ΉΊά΄wΉΗkχ qšΧθΥΞ°žΒ–€!h±Œ€pL|aόRK”VDWW’Ύ7l,NyΉ*kΩUS ·VK‘[~^f8W|ӎD[rg΄wrκ‘zΙe…€zSΖΓ 8Δe l.:Β žύqW‘)_Oak‚τJt&°ΎsΠW&ΐ©„4ά²$φW {ιbzμ fc“XΛιαJΩ 'σΛι=ΓΫΓ@ RΞ.EnΌή(³―0v°/ cfu6Ϋζ„|33lZ½¨)¦―Μrπ­rv 1"‘M€η™q3ΒIΜ)λΒ °‡€Yu6 @εΡ a\ΓυV0]R_ΠΘ΅1kΝJl <…ηέ+„!!8­pώΆ•“aˆ2-˜UΫγdΖΟΔ)ά¦’˜ζε…€y‘d©q΄xMΩoΞ7βt/ŒI€+'·ˆτΗΩ$ €n[ώ΄†Χ­Ο!„χA>"Š.̌Lω@“~”cΙΞ‘D!XyŒEΩK²l£ƒ9Ί@Ρc?"UœG™<‘ΡgσΒΙ hΤ½Φ†[ΌΘόtŸˆ<¬"pΡΤ.ΣAB;Yκ‘ρFΰ ’ή»Ϊ"JφLt@7·YBMΓ±Ž1V­‡ΐ gτ`;±kŠ}ΰ­ύύšζς|pΨqPhŽΝ1UΨΐ Γk[§’n’ νBy۞• rkrˆ· Ό°ΎΗό‡B[”F<‘k ŸI½ΡFαv[損Υ(Λ 6 A=Χgΰ:·Ήυ‡ΫμŒ@Φ „w'=&νΎCg(RήI΄ί‘ŒDnŠδξb“ΐΆ! h8qΓζ@π@“«9<ΎžAi`½Bμά\γ1σHfÌ1’τSΠ—·a‚Λ*9 eJ€φΩ/Υρ·MRΊ΅Υ‘ͺڈΉΉk‰Bέ ήyG†χυ –΄²¨›£Ρ€IΆ ¦':7—„•ΩγTί°gˆhλοώΰ{jνψg{{I|οU2¬LjUζ›-νfει…‰τ[°C‚XΪ' -D8 άl”ΠΪ€@`"ΟqPΐ_s τ ωΖrD[Iz)$h0• 䨍2KPiF`š#PΪ›ΧΣ4ΕΥγs τeeS8š’¬σ…ήKˆgράsg,Τ©ξΘ+P eU…d…’ςˆ±$ƒ‡θo±RXΗ7£Bΰ~7ζ+ΠΙΒΌAα5όPΗ ”X]ƒ6/β3ζBDcά‰§dFν„GDπυυ`μτΊΙJb*ΏFf+{YΩ覱Μj<‘£8ΜT‡bˆl*-Γ JΦ($υaSHΐ+³rΔF°4‚ΥΜ4η_K4 Œ[IBΛ£ŒΘ4τ4t‘η ν‚MΉ±(°Y3ΑXfG>œνP&Δv€»ΝνΖ ρ18΄‚€λ dπ²qέ—'²O+GφLD200‘Ω߈δ…Ξ†|Šά"ρ)9 AŠΩΚπ μ€tτεQ))bΔWΐ3‘άXί^] ²B žŒl’J`ooδ„p©Mb'€½QJ|aε6:ng X pA΄aN½/¬ƒ“ώ ΘφΘ΅ƒζp€B©#я‘tα‚άΪΡΨ…ΡiγpιŠ—Ώ‡~δuaΒ&"C¬•χ“]u-υΚυΠK`ΜV2[Υ:yb'°Wcc ‚\–ΏΨ»(‰Ξ‹CQ€Nπ+œ‹ŠθΉ?δA…ΥΡ*1 ΞkS†ͺτΝdLŒΡ1Uea!υF6;x6θ­ϋ"l3-ς#7ΓP;ϋΙσ%YI3K‡šO³ΘςΝm.HΨα(OHν=$λγBK±!Βfςˆτ/°οYYδ+YXt(|οy p4‘―…DάηΠZ³4Wϊ¨τ ώ@¦£-πΧdGd{cν λΣΆΣ 3θ <σΡΧσΩΐnXϊCq-G#W$ύ¨₯ς•U0"ΫGΪ 6x*Ώ±fz·ωά»*ζf™½λ“mΪMΦ(™yτ!†]ΌD,΅˜y’lDƒ@[Ίƒ₯Ψ-j‹".UBd΅›2Ε#,ΎœΌΤ…~ηe 4AŽm}ύΑAFεJͺέ±F=ίnj0,½ε δβΖ’πυκ"?ΡμbYΔΚ _€2€eΪ―]A89ψ­«­"'»ύbJξB0l ΩΈ–₯Η†Zvj₯z‚Yήb˜άG‚,ΡΔa―vΣϋθuΑ―ΐΑ{ uΒ–χ₯Y€ΪŽΙ4 ΄]€€ΔOΰΊp3 Α! с¬)g»Ή½²°ΰ.[―όΰ₯™•„)Yζ’δΩ€­Ήž¦Cƒ’ʝh @ cί™`Έ­k ]Λ&)$y²$ι} β&›Q«Ηu  bαίO·Α>B^―mΣ9VθΑ=βt y&½Σuy$cΰ”(‰₯Fδ ΖΞΚ+W(š’”!XΒtζ =xμ†@γMQv c/ Ρ7Ρždγ9P<rσ`"ΈIkΖЏRBZ #Yt’Ψƒ€π†X[΅nbτΪΒ@›££¦·γτ+”¨-‚0τpλY2,,šΦΓΣtΔΎ…m€³€ϊ ή {u€TJ 31•ίμG4^Έφ ϋV΅Ζ>Έu΄›άcz k5λ‚,–μρ«ΐVΠ―ž~ηb­P4]ΕιĝM곕mΑrdD…¬Ός€r?D† WΆK Τ»λ$~ΑlYφβ₯‘[°@dγYτ ςΰj7 Έ$—–Ί ŠωFN£Ο(ύ¨σΏEεr«ΐ?hͺθλƒQ’PM%Ž:@-‚}Hl QXθv~wŸΫ@κCVTΎ9#ŽυΫξXo„³¬όͺ|U§ΫE΄°ΉΠO@^)zgMζ ΌN ΐνH_΄ŽHί—Ρΰ‡MΔ»bc.έμκ/k|”WP^}’*t‰t~nͺ•\|glρ*ō»Λό BΨ™ΈΡEυ o}θŸ™y³ΉΞζ$£Œͺ paS½ΎΠOθχqkZΨ΄;d–'+’ΫiŒSΌ ₯¬π‚ n†Ž=KfFϋ$.AuV&₯΄r•ԍξΦ­•Νjγ_LΖϊ @Έ#±h˜zφ ›ώfpa 6 +ή0*Θ‹:“ιυ˜8=ΠΤ~™ο@tŠ•­Uύtζ~ΔΊN‡ΕI'Ό$‹ƒ{έJ`Όηnω”‰).¨`Sx€±*o‘φ£αŸ„οβ¦JοT Xq+NTŠΌ^ιƒAC» =ι=Ί‡ΆY°εαΎΊ Φ²¨ Κf5ՍΘQJδ fXΊƒτΩ‘,JW²–O£ΚβŠRˆώή0θ³IYDj‹"q7(*†ka–N~σ»ϊX#QΫ£4ώΎ–h5…cΧτeκQ&#wp!Ζϋ%EšΪϊ’<ι­ΞXξΗ v07Ω`0g=6μ« u‚/"ΕMm±šG!θƒΪΨΆΚAΰ&g@E[ϋ¨ΌΡJαοφ‡³x#₯Θ_£%.ΰ²1»ŸΠ 4ΙvSΗε΄ Έε+@{ͺ.uŒ›GZώ0 Px²M‘U•l Žή‚ή1A"šΐΏWQœΙΙŠΰΠy°”/ŽφQΏθ£ι'ΣQΪ+;ΑbAΉ6ΰ²ϋ nY!3ŽA›γΐΞΚαA裐±‘XΪ·bšŸ« ΟΉ6a"ΊΛΰEΪ£ †C ΆίBi‡PPΪE£bΔ± ΉΜ £lƒΥ^gwHu'ΑEΐm^ΩΪcKά§[Ίέ4«Pμ΄C΄@ž°œ—Ι e€g5AγL7-]Ά†‚ύ*οεb3U ΈγmοB^ΖΒ*τטηDiŸSΰ66΄ΔTΏΥ‘nβ‡c}λ,zV¦TŒΐΣΓ}ό₯ΫR³KrΦΧ^ T•σƒˆ€ZiŒ‘#˜\Ro·»½”¦χ#‰Ž‘!8’Aα9……ÞB3=C£m߈¬œd\€ρPψΣ4Δ³Ί’`ΥO–cΈάΎύξ}h>¬/ Λ`|«ŸτSή€Œγb²X ”Ι2_to!γ…—#`”Ž‹Dχ.΅‘Θ‹…ΞښO…5§-„ έ΅.’ΒqaάLγ>˜`h9˜Γ–ΑpŠ&i˜g;FŠ ±;Λ|έJP§| €ΠcΟcP38I0‚”άΉcΛ$!DΫ@˜{Gτ€Ύ›5%Š ›Θ1ΨΔ†ϊ›ΜXZΐbCΐcΈ.ΑHζZmψ·B§ςx+rαΚ?›©ώ‚›”Ώ²ΏΊ"§qΞn•ΘgŽaPh$`S¦qρ€ΐΠβΓvΨ·Ό|“ύΘ\B‘›aΌoœΫDΒq†ωΝΥΥ8%-Υ¬κΛ/YΗ0bλ@ΗˆΡ3`ΡTy3Υd‚<ά½Sν^a“‹ιFU訐%΄_Π hε‰6»μ&π.2g T@}!܈y£Η911K(DΉ5€‘έ-ŽKŸ© ίΡf֊£PλξΈU€Š―% oPz€:N³ϋΛV¬ίΈl%{ ψ[9τ€ρͺ΄³ςn·Σ]Ωφ±¦‡.= ϋ •ήΦΤ#P)V€τŒ‘χΛP`C }  0ΉSφvŠcd“2/Ζ½Šy+ȍ—Ι¬žPt Š•9°`qοݚμχΛzδΧqˆc'ζμ€Pδkd­»ŠP`t0Mΰba@]ηΒΑ™Ψέ’HοHσ@켍 \Jo³ΐyKφK¦eΓΉΕ΍EfPΠ7BΛώΈΩ)o, €ύ…sG³€½@ΑxΫ@Ν ZXιΗPb~iΡήB†ίsΎg:+ŒΪΎ 3ya1)8~₯xwkGΗι€αJm‰ε"’ώŽZ μΑm0<Ε|m²b¬d¨ύξcmΗ .sςiDp©\Έ‘[±„κHΰΔu΄5ŒΌV―tΰR™Ÿo§ΰ !ƒ‡δ&C)˜DΪυ™(n/r—™ααžυcΞ ιψŽθ +…»2’°ώuΉ1kμθ‹Γ!†΅s=χœΫ=v9&η²OY©…QΦM<˜πb@ζ ?"f9›Ο&7ω˜“ρ†Ν0zΰT •κΕœY!γ–„ͺEt¦ϋ ₯λ€‘θŸ W©…ρ‚_ζΤUBHe¨«P`Ά»8°ά¦\kζP‰Hb‰’?Ω=¬ΠLIϊㆫ4£7 %ŠΗHEtŒ£6Γ‚μ£–#3OQža†I—QtΩΪ‡ατˆά#mŒ(E=Ϋ–.#ΎqFΌ αΤyο ³UE+δ!@o\xŽ+ΐCΙ§π Γ=U‰d λ›#<,b­/}'΄ΠG':ΑD_e…-ŒmVρpŸ-ϊFζH·Ζε¦―zχ1GVpl2ϋΌq‡vηŽKlΏSQž™Œ7Οf#Ÿ(Ž MΜ6τME ρ™MNy2Φh&bŒ$~· qi­Ϋ]]xWΌ’^%[Ρ[Ϋ+7ύƒΌ’²šΧr'°(n—CήŸŽ1\φ„'ι¬%!ΗΦΒf2?>]*Ώ²6 $%¬$#ΘR‰WΐqE0₯Γ€μŽn4‹Θ`AΥΙxKŽι&#ZIΞ2‰‘K”/œnτ“`ή*ΫΡ πžx,tχϋ:3ήaγXν}Œ‘£Έbchšƒ3γϋƒ#…W‘ΚqΐΔB|€Hr8(cŒ½ΈŒ2ΎΣνα>ŠZΐkΖ(-ZϋΊ"Οͺq ‚εƒb͐ύ(δ‘i£"……{Ž bψƒ‰ι€@βclΡaͺ¬KŽΫ‘ζ¦ΙD쬘ψΜ–FhV,/θ<‘T]s€œQς wεΆζ%Ί‘E}2Εt`·’{Υ&ΌƒŸ^σC$ξEΨ@zgΞΏ…©«ή4$Šη囨{7ΐL‚–ϋδr…)M  L%"p™\žΦΖί@ώ$μΦώ.'©*T’yβ8HcΐΈΰO tj¬Τršύ#κY•½³%Ώtύϊ[ΎŠ°Žj»xΩ»zݏ§U}.‚ΊΑrŒEΫ2φPqελ “d΄Γ©ΓσΘWΐ’εW­†7αƒi¬iO«Q˜ΗΛ²™φAn­²cš'ŠΉD˜ΨbΆ$ΪG,hIJΒ{ΑζF–&ΆΟ˜@KχMQΌΩ0Υ’‚Ž›. ³ΜfΆF_²<”Œ2κjΚ °TΒ‘ΰ`rMΡMY­U)ΝT6x“vζ ;gΏΐ€/$†Χ’Œ© ΛEΥKR9 ηΥλτ‘cΐh*Z •c„ik_Ο!>Ι‹ll»΄]πŒΡ˜t¦:«/Ma,7Φō-€ VΣXφ°‡BΑΖΖΐ¬S²b WT9ί9Θo{u“γχ@{RϊΉ΅e‰<’-t +Xˆœκ)6ƒΓ“p_j6ΜΝ₯γtΙCζhI› x‹Ψp™IX^ 3#U#˜ŸξžώΉφΫŒ‡‡!Y­vΐ4 ˆtJΙΖ¨;re6¬Φ‚Žξ8 ͺ›φψΒ Φ…Η‹‘"$Γέ*ΜͺΧΐ*Nϊͺuη'8/Cšu&+Bτzb4θθ2JXyύ§'Œ˜Rφ;˜Ε¨Gΐψ©q\. εoΫ τΰ@1rύE sΜL,“ “ΰB'­”ζI¨yK£aV5Μν}°$°¦Η>rs•¦±±ΘQ½!²λƒ₯Œ^‘7V)ωΗfΚa€qQ Β§―Ί‚~½£‚Ξ2βZviΔυdΈΆ~γEφ™ς{) 8<՞*ΊŽU?2+νΚCHΆ NρZy!Ό ɍεmx*”BΘΙ­Ά·7tύEτmΐ¨ΰg;ΒG–*‡UΪ$΄pjΑώ―Pό± jNΦ JΏΘ}Π«¬²ιuKu[ΡўbΣ³ )'mΖL΅mσ’?€Μi3n'ΑΝ=τŠΪZΖocloΔ Α‚Y…··2ώAZϋB …­x€ YZR7`E`ϋ±ΰ[k%EœζϋΖ"J»˜ešΤJ/°Ρ捣ΗM˜μDeŒŽ/³@Y°„ƒI’₯­+’;Δ„„:Ο©πΑ ‘,˜9Ω›SύF,U¬‘ˆξf »fXφ”T‘D€ βΨiΑ›‚e Ti#UœŠˆ– Y!ιe°Έ†O1«•T,ΐ…|AΫτͺΟ„™Y2ΡCŽΑ‘ ΖqIOό©ŠNxJ}νυ tΉ^‚k ιύ&7η ,BJ.‘ζP{Ψ δ΄^¦†Ί`˜";½ΠΉ=ΔKxΊh-Πτh;a pmΉ‘pA³ε‹~a•y6j“h$ό­Γκ„΅„)³)“¦•ƒ#έ1Χ€;ΐμώΐίP Nσ‘1‰\Ό%€yGσŠ-Tr`_zΙ†ˆ”9ΟxΞΚν%QcΖ„X€£‚wφ§Ρ 0p Λ"-tΆ™ƒtbGR„1μJAΙ i'\ά£œ(σ@QŽαΧ°lβΥAΪLi’<έ…ΒΔ“° †Ί!•°ž|•˜¨ΰ$eΏΊa'ŽQ=k‰klίJ0ΤΗJmdΝέhH³»=€l.m%ΪCQͺ-o’»@Υ³’ΫΆΔ€½CZ³bι•vλΡθ—΄F0ͺέ¬ήT/:݌»£;ό•Μ’šΥλp|ΒΔΙh«@τ“’Ύh*F…ΖΤ£Xg3™i6Ϊ‰,ζfί Z9ω:!ΰ›¬M°I¬c‚ΆKύ@Η 8o«Ψ‹bϊ}NΙ,€ˆ’³D’ΘΩ³‘u†Σ#ΘdΨ(+έ2‘Υδ$°άƒxJ%₯ήέXg–’6Μ έΖ₯(€j­KX(¬LΊaΎΈn ΎΠ‘£€kΖρ D‰!Ύγ–H±•Oΐ_¦)!o g…)hΪ‘Όp’a NΏόFYtεΟ°ΐΨ_μ–CΖ3UΑ»­\8P Ncnΐ&aEH»™ŒvΌΨβY8δš_ϊ7YΈπ-:ΨU]‹ύs€ Ψ—[ύΎλ:([μL¨2₯½Δ;5uFN†φΜΫι €Αφz"(•号GpC‡L’ Ζd-Ζc τ˜ƒRΊrζz¦ώw@ξΓ*`€€!™+ίγO˜νΙΨ5cŒμph&Ί`ΝWZύž%“Ί‘mM© s{}Ά)Ÿ αA˜X‘(­/uωmδΩ6tΧ*ΉŠ<(U7$™E)+}ΰΎ$Όƒ…ʟKΖΝ*ˆΫ°Ω$…7SΕ?Š‘β2₯4G2RθΔtΫ…Ÿ»)Ρ’°φβΆ,O©7Όύν.πβ© ¦ˆoƒ±Μ“bΝ‘ˆ‘ τ6Bqhoš/XHΌ,^v©ΧχέΧέ?pΌβώψ‘ϋγUχΗkM6·—άί«ΠΕΚ0ᖝ²Œ%†©‹Έ±Š!ΓΐDΧ«!Qιj#ρ!0.]'QψΦΒψSΚ‹ΧͺZΧ[Μ>u€8JΊ‡ΘΥuŠ–Ισ2»d)Ν²Ρ°([¬%‚LCx₯L(-u©Θh7ˍζέ±Χκ¨l·‹ +² ΑΌKλΐΥnn §Ρ―Eš7{T_χΜ ;#‹ΉŠΈΰ„Ύ¬oΓ$&ί‡ ·VΫRΝπςGi條‘I:–χγͺ»gc²Όλ«ZK3q’!·ΜνPLκ§YAγbα_«"Dρ)Α†'(₯ΡZ.α‚©+†ή· lΧ&¬!ϊΦΉόΉNl¦" 39εQε*T ΐ£lΜƜ DHόφ©σ„Ξ+ϊKo{Pݎϊ«π˜ W{₯ΊΙ―7nε³οή eϋo³M+\žΎͺ•±ΨΖ•u˜s€€€4 S ~'Hšγšύω"U3ΦRΌVrn•·πDχυZ3εΉ#L‘ˆΕuύr±Ωυ υKΫ/_m’³H½βύ~Υϋύ’―Wόπ5᧚x±­Υb‚z^˜@SFΏŸZbŒNΐΖύλ'i:0±6„>3ά}``Σ™}`xη Yx1ΉΥ»θΠ<"?Mz C,A5‡κ›NώΖπž²CΚ"a(¬”χΑςr**’>^0ζ£γ[ύνΞmρ$ΔXΣρ0R  hdΤ#1 eτnJ1›Tμ*&χΜο IΖΌ’,‹Oϊ˜Αέθν„‘rν©2a£μͺZˁ‘'0ιΊw2φ@ͺ8’OδHT*Ž‚Ϋ# PθGTέύPo‘œ•q­ώXΚaέλ‘ηšD«εTζ °¨Ώ:‘2uΣ}Y³FαoNŠΑ^₯β|€•Žγe'·Ep2βΚ°±TR!8–΄¨ΰMZPp(ΦΑό’υtžέ¨ T+ξPVlb ‹c1£°sz"Šp±Aω+¬ΗsF ‰ψ”7c’ς$# +ΓΒΩz™υ9%‚βu8γ%ΩΣίμDƒ6eφΗΚΌxςΑΨ&KtŸbr0]@€ΦΌ"z0Ζ²_q}atΆ`Δ&AΓbr:ˆz$~s¦Ϊxμ=Ϊͺχΐa½ψri³S{ύ-΄―ŠΪ[Χk.‚ p _½ΥχJ°¨A”Τ;MFΨjΑlU&œ”Jq™<@AιφqΌΪάn“ιΙ4'ͺVΉ$gŠDŒά^N1,ξ²jθ,fR„ˆΆ΄¬z…˜„ώngϊE–ώΞopŸ[ˆυω7ΞΑΈό)Aι“kΨz<Ά?ΨUΉ—ΞzζΫMΗΦƒρ ΊL$D‘ •άΛ;]gMΞ[ύο/ΥV„U7D˜νMΠ芡>ΈΎ«sܐsΎ-{a•( ‘’šΩσeemόMŽ!,˜²– GΕR‘ΟGHΉ‰BwYu’PŽtU07ΡΚψθ¨ώΦθΆφgyJ pϋ]*ŸlJΙ [ϋŽ}ΡXBξk›c@ϋ²-j>*9ιάΣ6mmDαp₯QΑ)¨+A<ε‡8 Μάj˜ξΩ|“ Š…tc&΅­ωΪ]ζgόeFω§½ΨΨβg+ΕΖF‚|Q@@αΰΈt]EΨ­.ف[ρH’AqiOkΔσΔ¨\”Ής&–’&D™«?q‚>’’Œ€³Π@;swnNΰϊEˆ Άˆκ.ΣςΒP©ebΥQ¦όs;ŠΌεRΠLζ•©Τ…”k©κsZdα–z³ Φ/$ ŠƒΞΰ‚ƒW #©Τνuqfc…YB/λΓaΫξa¦XƘŠžπ1h0°dD›ƒJ•ΓO=άlmύHTjC…`ž ©X ±^εŽΜ’ρ²A€q:ΒͺΜt"vB‘98Ξ†όF…# σΓN{Œ)υΘ€Β’-ŸNՌΈ§2Ξ–67΄A3ˆ“ERΜό!έδ²ρd]‘YΟ9-ŒBΈ§d̏•δ7g°”ΛɝqηΤ’Δ꩜‘ΜΐΓ$`Jϊ₯€UWra5HήOq0ŠSD©Τ΅«Ω΅!ζjΙœι’ π 㫇ž(,LΝγFκŒΕ“yΔ84…u”1¦ι  ώ4†„…π3ΝΰEY:”=އΥΕ‘a`ΛQεZΞΥσΐ Fδy:T­r3‹θ ‘ŒS\ΑL SI‘vQί} GRη‡άxdV·»-8mSθ]‰–|Dt[N/κ2εθ֌φ0TD$Μπ-π3ΡΞα ΈιΝ…yεT$:ϐmΜΈSx’°ρ\B[§εˆEΖ:τΐ%;ΈmEBΔ†κK+»‡T(½ -š‰©3ζSHΡ0Zπ!γcΐ ΅B±ΆΐSΎH³Β`4*BΆ-0[%Z]άF₯01D b*₯€l"ΐ+&(VRμoδιx˜…ήV&έΗnK,WτΘώΖΎ1u1“V qƒYZ2ηo'$ ’Ω>*KΛ:)₯‚k“‡Α=uΙνeζμ)θΠ©Μ&&0+=)9υs —Κ§fn`IΏεiΉ+Γ·ιi’ hS« š#X‘κiIίt>4χuΒ1³tGSŽqΦ?\™§+K–ΜαΝ}¬°',ν‘dBΕT‘Π»€Š³cΊ9 )Ζe™S¬”‰₯μrBfτrΪ2χtV6’Χuρ\ΗΓΊ”Cž(uL 1χ“^dNέ€aH 5€βul’222·Τ›|ﱄ„ MžH$Έ*rˆ₯zθ’,œƒέ(š‡¦α‚ ±‰±&2C NΈ§θ=M»)P–]j1·<ί5z–wέχΡΑ¬–zQΨŠf“|r₯Ή©+v‚΄Δ… υ!ƒμΏ5¨βPš`0up@υƒ@ζ0ZΦΠζ`°ΩΦy4’΅Γ‚Q.ΓDN°‹ΑΖ‚iεaLΟ*©+—?ΕJΜ‰G <8ΈμŒϋ!ΪC…β±' φCXBΙGΕ œFΫ  kmΉδύΤΰ,ς Μψ¦°ŸˆJΚXΏ…m^=@W^’£Jφ§π`0‚ΘΪR·€M:ό¬0–D΅ΌjoΒΥEψšT+’Ӂδ -‚λ£°d€£ι*/¦€ ΈM',kζ©HD.ύΤD&*θξ‡j¨Œ<Σ$˜ –R₯!΅έ))0κc'B¦ ηάΠ\chg·>Π{Z+βiŒϊ’*ΙZο‘Ό‹p,€Kœ\Ht”o@Pα±Ϋ‰Y1ϊLy€o0· Γˆ8v3Πιm–>1R*2τιτΰ’x•2‹†λ<ϊˆϊπ† Θ"V Q6W61S,Ώθ‰ϋΊžIˆΧΉ`hƒTbx­ ‚λme ,UΟ}#(@2=‘±ωβ5ε«Π1Ι`2ŠU·γHoΞy0@`X‡Φ5UΖ‘P|5X»¨‘BͺΑŸ‘ ΉB#%μ+-J˜§|ύοOT”/ Œ£ ΄nQ=ˆΕ=w6FΕΞ'Δ&`†H΄·‡υ³ν”76i`¨wqα[]žΡb#$ςRγͺBΥ)΄\οtΩά7˜©=*Πx³7–ΜΕ&ϋ­qhΛNzΒ9AcΩΆ•#R΄Φ± Z°S=Ή/ adυ5―PΥ9՜ŒbΗRθQϊ ”ήAb·Η›ΤU‚p7§ΧΗσr}QVŠ1UfŒΞΉ7G%PnŠΪš)φΰΫ£ ΫΚƒ8•>°ΪΫxq ƒiφœφ-Ί8‚·>aΕΌήU”k'ηix'€(7Ζ–ͺŸ―δP˜ΰ{\,ΆΊc…ΜzΑΕH¬‘Rvt"ΉssE½¦ι©¦—:C[Ÿj’€x1±Τ9šs<ΐ<ΧηΠY.’UΓP§4 uΙηfhT6£³4 α³)eYTΣ΄ΗY’‹Xk’θϊκfYЧ˜l\Υ­:TΊY•Α4•ύr3•υ¨λ§œ£œw―•‡];mΖώ.Χ]Δw?ζ^xœ±9ζξϋAΝΓ_±οwώuς'ͺ<―f6Χ›Γ“Σف,ΐΟ3‡ž³ιώμΠ!§‰^ΊΤpbχ 5'vη&‚gΞ 'χΪώ€0€Κ 9―(βϋΉˆ+̍8 ΤŒρ!ŒΘσΗΟω'šΊύP…νˆ»$ξ1·‡'Ω2.ΈƒΐυϋΎώώtΣκ_ςF˜ƒF΄<σ˜χέΌθ?6\«†λƒ†λ?kywc#*ργ@DƊV¨”ŒaA 柝»φF°›_ww‡tο}ώ„6αΗUΈuUΎΒ·@·rA›`^μζjlXv$O4,ώο gaœχkέΉπWΧ{ώ1οω§τ'Χά ]S6φGχƒφ—ι>R ™‹ψkσΜ²έϋϋ„Χί³Υ—7?ψΙπΐ> ηϊlI°Θ[‡»_« ΐNe½ΡU9°& I‹<:pΣΫ…}μΧza?οB4Αχλη‘ χ§x¦BΤvE;qd&€Vα4ν3>η’…Ψ•θf&ht—Ÿ"F<ΟΨν«h ώΕƒ  Ϋη}d0σϊ’ϋ^)‡| CΚ8mpχΎ<=mcŽPͺžΔEζGL€a†§3΅`όΘ΄}Œ<PS—λ(μ_·¬`RΏγC #χ%°Ήό`ζίβ?œiΰ>`3σG“`σ»ρ~ρ+ΪxgΰcΏ&8Χ²“ ΘΎjΨΰό›8FZcΓΛ8Η“Aƒ±=εχχάœ{ο-Ο‡xy~α/ΟDςSGš/7<σολ–Ύ*kϊ…qΡͺΊΐͺέλΏlxσ°αΊœ–ρœ{DΓsΐΥWφŒ6τυΗ ν›”½9Ε¬ύgώ΄αϊΏiΈώjϊΖΏ/»›Ξ#fΑΫ-u₯a:KnFΓήέ«W@J{ŽΩζG!—(M ž9§/ΧΡ"–•ρ™3IΤM;ξŸϊΠΏ<„Ζ4Ά‡μl‚+κψΉ‰“žΈTθ‘+”τπc%άՁώr–ΦD¦φΐ‘ιςnjL—§™¦ Ž'~MΦξς¦?pΑμΓit{ζόSP"Υ„T’›ώ&Ξο*Vη£ΚKzε ΑΠ ƒo†Κ)ΜGFx’μΕtB!Fω§ϋκή=Ό| Kπή½ ™s$vEP™zέΘώ`ζŒψΡ&σTŒX_pρcW†ΟΉœCΎήˆ!ƒœs2Τ€'ό²V#ή7λζ0νλέύΰ 9ΏlΈώ Χ‹ˆ‚5’ΠytŒ+m”Ϋτό p²Ύ¨ΌŸΈΠ€ ‰ιΕCΓΘ¬xXυ‚Υ%˜(SΚFR‹E/^ςζQοΩj5Ω>3sF« ’ΑΟέ9όο’‡φfγ€:(hŽ ήlfΏeθΥww―s°™―~ΧBοICΣR:zάQφ/ω~ίYΨ`ι7=Υ9 ΞπθΈΣRΜ^!ΨMLgΧτηΈΣTŸ…•GŸjl)Ι•&Χ€FYΓυ;3%›}Γg³γ¦?e9ew€/<„˜W6Α,θgωΆ°ά&}~¦‘ζ33ΦBεDhΡ.\>ϋΛ΅ϊF %E‡T‘c*(=ΫώJκ°V/T`υBέΒ&T%PιΟ{ ζ°N3ΆηΫΗ¦ϋkέ·*£{χ4ΝX&0ζ)κΫMTο[vΝγƒΫ9=πθ‚ggκήσ£ώžηfZ`Φ,°‰ηqΫ‚kψ₯ ώ]ωUoήKvΪƒΌ*βΘ\₯|΅βΥwΑΒΒβκ#XXXΜ>‚……ΕKSΓβ©zX\}ω7―<‚†ο=‚†>‚†M ‹3<­eώ`ά6Ψ&Wߟ7\w Χ’ε/Βυ'ΖuM! t¬¨μCοL7ηQωmO5xέf7Λ{πNO~ώBŸ«όžo Ρ;Υ™U£Φϋ«H;Ž)g\-δ§ήcFέΫέQ’Qϊ/ώ›&ς8-Θ>cA†nXύ.·+΅tσ?ά†Ÿ5ϋbώM›G1Ωυςσ™0όΕ΄`ψb‰9ο­tΤζ–ΪŒb•Dq0:`Ή[&#„L;~<ξ^°~¦’š„ƒ¨§r[‡ΙyΫ·ΪχsŸ3gŽd{.ΔΉΆΈ(±ΩΉ·|{gmσ†‚o76—ΧWvπλΚζ²ώε ωιΦTϊ: }ΣVζκaΊ§ΪΗ:Έρ©Β‚ίΗ5{ΤοZžθ* _pFˆ΅~aHX7«_SξΞ–Σό! μI‡δ~$¦0ΚώQEž?’Ά-υbψΤp΄Φuφ!RY2’;γͺ‰$·NαΕφ)Τv6έ\brΠrΝόDB™!Χ%N-0=΄τ‰+|Ύ .+`όvI’’>§“Όω£rΦ—Ξ:λ¦·6Ό5κΓ›u%o=*GcYΧ―•C_[δZtjmQ—XάΪZW•uυΑΝυ±(ΰΖΆβŒφixqω’§œ G‰'eΦ5ΒπΌ‚›­βΊ$ΦΖΟ¨*+Υ ‹©ŽΥ‚XθυF¬¦AεωΆγΡΑžCEMυ’wΈΈί-™a΅¦ΥkβΊΥ;C>Z{AΨC^ρΰΖ° °*‚)¦€'l…yΤ³iφгt©n€ΓWb)…υJA yΥΕrF}nΓη/˜B*"]YK'²r²1ί7ΕRΛ·έ’§ϋθR.―pK'ύ•*iΒu‡Ξκι‘ZΩG/~α£ΓfJθί”Ξ'Λ)Κ*ί‘ΔΪ5]ϋf‘œx™(ή\Qˆ»ώ΅ Rύ•YŸχzƒ~Ω½ “°^wζW†Θω―ψ|Ή£ ΙΎΚρ0ί %Ζ³IPsSv†ΓζjΕe΄(γΑu9»χzΧΝۍžπΎzΛ2 PHP Source source.php identifier%\b{{identifier_start}}[[:alnum:]_]*\bidentifier_start [[:alpha:]_]path$\\?({{identifier}}\\)*{{identifier}} sql_indicator9\s*(?:SELECT|INSERT|UPDATE|DELETE|CREATE|REPLACE|ALTER)\bΉ}xΪν½[cΗ™&Φ$₯ш£Ϋh€έΥ")±ͺ©j²»IŠj‰j’«PΥ`£€"€κ‹X—S¨Γp@ »Š„Ζ{Ÿ½ί½χέ™έٝݙέ°ΓŽπƒύ°~σ‹½~΅_φΕαϋΙΟώo™ωgžsP¨f“΅S 6ς2OζŸχ?ό3σ?œγΏ/Κοӝq2nχ†4έθ&ύ“φ ―œσ C^2!;-δeςρΣB^1!Ÿ8-δ‹&δ'δχ+9!ϋΡa<Žg16_Ÿ\-ΌΝέ―¬ήζρS«…·9ύΥ%9wF‘γόΣςϋω d’Ξ§*Ψ“ςϋ?X2EγYκΒύΪςpΆ>³<œΝψg—‡³ώœόώznœΞ:ƒŸ?% εΠ€ψe/`4κFύ~Τί8š†.Φ__!°ΩTΚoψ'Σ(M‘·ΏqjPλ—N j υΛ§΅εϊ›§΅}ζ·N ϊ+A3.ϊ² ϊΥSƒώΐύΪ©A_1AΏ.Ώη½ ‡σqϋΡF―3nL:Sθ)³hͺκγΑoήwАfqΟ}σΝάΆα}γk…ΐΆΚΏδ&œ—σ+bSωNΠΐ‚Oζ©&žΚν&¬ χτςp6νgr«τ(šFύ€·ΡKUΞΎ›Λ¦ κwΧο-Ζϋvη~'νMγΙΜ}ρμΨίNuζΦ–2Ύ£Y_τXσ|!w – .ΨsKƒΩ‚ύ~nΨ`6Ίεαl|—‡³CΟσΛΓΩqη…εαμ siy8;β\^Ξ7W–‡³cΝ‹ΛΓفζ₯εα~hΒ½Ό΄Ϊlρύ`it—m΅½²<œ­Ά.gΣ½Ί<œ­Ά-g«νΗΛΓΩj{uy8[m?YZ|–½kKƒYξ^[Μ2WZΜςv}i0Ϋ’6—³ jki0۞ΚΑΑΑβ>HMρaM7ŒΔ³1I&nτΨΝ~bwόA|g…ΐΆ₯έ( sΝ$1WVlc~}…ΐΆ!ί\!°m.Uωύͺ8έθL§Ιƒμ΄Ά»β–χZξψΟ’ΡF§Χ‹τόV—ίΟyA“ξΫQOΝS{Ήυn§u\,tζΓΩΖμd©Θί8Σg–ύFncœM6Ό9©y.Oθ˜FƒθΞ»Γhγy2‹ϊξ“ΦʟXfφ—|’ΖγAN*·VώΔ¦r{εOl›»“ϋ‰ΖγhKlΦ8ΖξΚ―Ώ~CΙ2 \?=-€εόΝΣBZ†N i{Θ[ςϋ[AΘ)dn£ΫιέIψžcφgςϋΌΰ-‘½ϊ76«jυol¦;«c³ί]φMA›λ­ώΝOυol~’ΥΏ±ω9Μm© αoΨΚη‰Γeg ΏίZςIv <’ί KΎ“•QtΈ⇍ΑκΫς»±Z vΑγ±qο}Db9P†γ”σΰ’εNeήW.πX~β©έuβ±ρMδχSΦ’˜ΞŒχ$˜₯:‡3\”š οΘοΌ LΈi0›ω€ •Κ―Q―u‡IοžρœžT<Ζs.ΏOjORς™χεχ³~ˆy<œΉ‚yd'ΤΈ™pΗΉΙ‘¦Ν„8 ŠX4lΖϋ]ω5Š;£α2ώοΙο§­Ώ(¬L€EOχdύ\~–NιFLίr|8Ξ―θ*`8¬Ί?πc#ΡuπgŠι”ώ¬ό~%/X˜πN~Ώ”ž΅3&μŸZvŽ"Δύ EΡN£Ω|:&ΡΘ„ύ‹ςϋ™0,τNζw‚!"ΌρώKAU)‡ ς—ƒT΄Γ„ω+ΑTžΥq˜΅ 6Τm˜0­€)Πi˜ ½ Θ±γιoBCΑͺΔ›A‹TΑ‘–\ψ[A; ΓmtRp̎LψΏ4>oαbύL ΅R0ώnηx|?ΉyψοΙ―QgΦ&ΰΖεΦ&Θί—_³I‘Gς΄ͺρΖ׈a0 πςΑψώ£ b δόi‰άoΌIΠ·r„wτŸζυ„τŸAsΔhτŸƒ²`Mˆί•ίΟΫžΰj‚ύ^Πυσ„Bφ_δ‡ΝΝΛΏ ΓZξ~?τžO&‰›•UΠ4½™ίϊΧ;‘,7Ή¦χAΡζΘ}&θΏ‘ίίΜ Άι+ΏOε†Ξ“Μ—(Ώί=νK-X™h)“F 2‘]0ΓήοLγΤ― πΗΑψblŒ“œnϊοεχ?ΘοcΑ =«sxΊΝφœ cϊ¦WokΧ^ύΡbνΪ՟€֍>³ΎΎn=žqΌgR3», 9 [ӈΚκ"‰S”όcŠ?VΒ]Xrhχ πšωΧσΧΦΊoLή«ώΌύΒ?5 .tΦ/ϋλ8sΩ|"7Δχγ«Ήe€£Ϋ,™RώŸΠ…—WAŸΣ˜+7•β§ςXψωΩͺαρeEMFά:θuυƒξcA£ΌΜEπ "A uΑK՝ ‘L;ƒθβ(ιΣlτ5ΛΦΥ΅ƒkλ0C,/Y›ΏΗ Κτ«AΊ(υ]Ο‡Cœξ0ρπC#Պ„rΡ6W Ώ’ΚΉ~Ζ‚œϋ8M†,Δ‘,6_{ΤƒHΡ„ιMήK3½t”1žηWμ†ΊΔŠΖεη(΅¬m|ΈU^4oόjnˆ³ ^M{Yyς~_ΩΨYμρχ_1φή³Λ u°f ύΊPΝΌwΡιΚ2’ς`šΜ'ˆζgΏη@έh—.FώBΨnj(KEΔIN" ¬|―Lξ.<Ζ¬ΩuZί‹&Αhά/–ΫIAEωάŒ=φ1†ί @‰‘ΌSh5GKKιSjlΊφ“₯‹Οq~—όF^ϊ¬ ύΘ`ό'κˆπψΗ¬ηΡ–'k.eΈ/κϊΛt oώμΰ νrπV^ω>ρ+ސΏvνψκ“ηΟo•·KϋΥV»RΫ¬ξo•Ϋ{₯֍σ‹σεv©Z₯ίΝϊξ^₯Zn—zΓCn—΅JmG°†€αϋo•χεΝR«ΌE€„„τΛνZ½UΩ,ΌWj4فλ·Κu/εf«QΩl‘sΏYn„±ζB©b'Ϊ2Ei;w[νF©ΆΥή»±Τ^Ή1έi•kΝJ½Φήͺ4 X©5[P4Ί±ΧΎ^©9b³^Ϋμ΄·±|€(CΈΉYͺ©Ο·J­QΐΡελϋ;βWW+δ…±F© ₯„Έ`Ϋ[νfΉΥ¬ό΄l€j½Τ‚v<ΊΌΧ¬TέG„ν–ξX&©˜•šψ;ΚσS V+Χ‹Υϊf© 5d±έλυFΐ6č₯U-Χ, @&X½iννn₯zΧΠϋ­½ύVϋΤ`*Š»•οSmε{“ σ 4ͺνŠΙl£\-—šeΗ‰πΧ¨οCsΉQͺn··κ· ‡ -ί*η υ­­,ΈΏ'X³΄W1ΞP’νζώΆc₯y·‰ Ιε~£Ϊήn”vv˘_a ΑυfK…Ω+5›i&‘υ†όΖ~ΉqWΡΝΝεέ²° ŠΠνŠΙδmθυΫΝ6΄‘­ϊn©R£ΊiΤ«U‡ ίΚΓoΧ7±Ή–`―•°νΤΚ;%”`Ω²Ct½|gΛ³Vη9δΤ&V›ež‚j˜ΝφuΈχJTC5ϊJ¨I")HΤΤε―ƒ¬PγΑΝbΠΣCΘ.η4ˆ«Cˆς& z–8ΏgDH²’Ήί Xέ YέσXmΐjσŽ(9–Λ7qό ‰ΰυ9Y΄iΦQΌjn'€aέΤΤyUNν‚@7XΩ(ομW91$MXL§J―Χi<0d΅ΌέRd£²sι°½Ν.™Ξθ·]ΪέΓ1rV°[8€τ‡+žΖ Yε£kAΑ(σ›­‚i Ξ 5· ΨΪέ“₯ΊΒλ7}j·U‘!.H’¦ ‚›kΊmT- \&ΆΪυνm¨”vϋΙÁŒŸΞϊ^‚O;y<΄ *ενRν.‹k–Δ‡† PΫ°LReZ«Zd§Ω„ #!OS―΅ͺ»BoVλPχu˜ο*α>γ… w’£a ―ήΕ‘%‘όp L΅φfN<υκ–γQ{4q‰`}ΚFψΗΞ°U†œoΝΏ]olρbΒωΐͺE9sλ[²±žΫϋ5Y\4vφEqΎΈΈ‡ςΚBε†Κ"JΕϋΥ-’$iΡa?3x£ά¬Wa$uAΎ'¬rοά΅ΎΫ0‹A‘3Έ/°`Ο€΅Y†QhΛσQb^Έ³ˆwk–n›Πήa\©Uτ‡ΰƒ™CΥ uΰf_†F‚Ίφt /Φ•ˆ~ΖΙKΨΑο€?g=e2Ό_μ…0&V*…Ύ dρ)ΗΖσ⨑‘b^[ANQG#eο}F’ΏΥy:ΌΩ¬ζ'¨m0 σ­7aωά.WΐοςεΠ@XΚσΔ€Λ½κέ|Ο[…ž¬α1ή^9q˜σ5Žίa>M·± xέ―ΉΌΒπθ έ“n΄ žlP‚σŠW<`dπ“%tΕ;ZΝ^Υ­5=LΥΒφςΕκΠ|&,Β6o„ιƒϊ―m(‡eΝΈjŒŒΗpύ:tΨrΛ΅«Ί}κ 3–΄ΦΑ'€†ΙΦ»uΥhevςΫ*ubΏ@ έ  &*DX™Χg²ώ@άU(»MZ(XΞ!XHνϊ+{7Tφ βώ&έΔ…βN₯F› ~Y*?θ·A η^ΚΐB&‡’*έVΉ ‹$(Y*ΦζέZ‹΅BμY‡υ Μm\SbkͺLνΧn‚p_σc°Ÿξך l≲έͺoΦ]{Aύ«­ώ|Τoَέ‰g^ήω PΘr€΄ͺŽwΐvΛ zm΅wαΣΚζν-X²Ν”WξX=΄Τ>Ν"Ÿ―X=œζZΦGΩ)fIΩςΘΪβενν2ι"U/·Β}ΘΘ θKΠΈD <5ιόΠΐƒJG UP~νοeςΉ‡“X©Φά†Ψ²~•[1dZj›ΤΉ>a,2l4½i”p\ΉκLWΆΘY»@ΎUkβ,s£άΞ²Œ~(νTλΧKU¦ΌΛ;[MΠj•[γΔŽΞ"ΠlTέκη-έ\ύ6ͺ[~ή ρ\―  μζN‚‘εί„{Βaδ†νŠΪ–Η( UPΡΦkΥ»~XΩSτ-Ρ)υ£¨θή­4q4ΗΥm3yβ?π@½. †€ίυΌμ„c¬ΨΨo…ά‹Gσ– Οƒe:2yΐθyω…@M3πr‹ΠNΉ Ω΄€ΥQkͺ κρKƒ΅Ϋ½60τ)Ώ0τOΆY{c±=Y)μfω. σΊΈo6ΏX…½g]ͺΠͺd­Vv+~Α:Ώ 5Β&—4­¦t 1b›š_―oέυ(¦ΰίϋͺŽj©’ζ“[’bn―ξu^$·+εκV3i` ±9°˜7ε1ΒLε΄#x5}μΞ]Ÿ=D‚ΆCXΠ₯Έ‘8QΑb(ͺνyΥ·ηHaΎΠD₯Ύ%΄ρC) Kt €r2J₯”›έμ4Γkpvκ»ΪΪoΤάδc=@Έo³ 9oΈb‡Μ^‡ι›1οͺ`©1τrLΎφγŒg•W!’ι+‚5(―ς°@l?`"ྚΧ7Ξ&—'άϊ¦ƒvΰΓrύz.Y΄‡10@kΒ²£ ΈΖΊΘλ};ρ Š’jE…ΕυjEοz€]"ΨΞ {ο°ρ Ω¦k‹ΪsΏζΌΟ*¨½w­¬ζŒ·φ\ »§ΧˍΊmΦ΄T? 1ιPš.™_1Ύ@'ό΄jΓQ6I6—­2tߐΊwVΪ£Νr7m΄lΦMόΝΖ-q΅hτ©“χŸxΚƒ"Ξ§7*0’€ ξ]Ρ:?Pγ•ο„Tj(‹–`YΉΎίδ„όXΝ'Šmύ{ΰζ[ FΎFŽTλ™°³ήdJ©p,,ΪζӘΡ˜Σ*iœμO±&`'cΛΛG­ξsγ…‘d„j)Φ€)€XsrφςqU½I⁩U«@Ω–5ΆUΎ›βM νΡK1ίCf\ Jg·4φbTLC² l}ΨόΒ’Ν»» CΈ)PΫ¬²˜2:αK:?ξοC/©ΩP‘‹Υ5©‘¨m²i0.“Κ»{­»ώ: 6ΌΐXplMjΛI7J °]-νpE’‰HΛΨnf½oeG―oΆhδΚϊΐ~ZγπZΦΫlΰže4‹y "Š-ίKBΊlmΏ¦Kυ]Ζ-ί|°wœΙžψUλ·ƒH"U£°φƒ!ρΕ,τrΉf₯ “ 5 ΌQΘ5|θΝR χΪ“Μ ˜%ή"OΆζ-τ…²Ζ·Ν› ά½™λΙ…šγα—h½ƒR©Ρ £± Ϋ0 ~dΏαeJψ Ώ0pΪv©αphH €β,V5œ }+Η­$™X[μΔ2vK;°΄«ΜzΧφw―Sζλ₯V±wEŒ²CοΣ·φy0βδεŠ΅Ν‚Βl»»± 1Œa”ͺΓ&™Α„>AYZ\²ιrb}Ψ:(ƒξ倍ςNωNž‡p^C…i³ *°-!kυ2T;ά@b‹Ω€HXιΤY¦δΆcΆ1½σSβuyν-ȝ%ΑφΪ40μ―‘TDΟDδά-5n7lgά(o*0 δΕ>Q¨]Λ>ΫAέ΅»W΅ΝE[eΜLΧζΩ±ήΘ eΌ°—['V …–qZk_§ΡΟΡ’½GC@‹νTΆ½0›Ooϋώ―_ΏμΣ{!½Πε ΚΆ>^ί»γΫ«ωŸν5·<Ίy{3 }>aΆΩnΣ.|€νξz˜lΈάά‹ξvωΊάΉΞφ–xPΔZ3Yέ²nV²[4VLXυ3™e"bO8¨±_oβ)†ΚZo–šn œH{³ΥΰAΓ‡·Κ{$(d•6ό°΅›‡³ +;θ?0·J‡RAjfΏCab‰^bcaΤΑ°ιΈp`·C¦76E"ΣΎ­νK/g W Ί~ύuVu2 Oώ†]φ蔐₯qΧt«d‹ΥnΘC:Ξΐ:λΥάΏήlUZϋ-λ-Fnm36ΘΜaν™YŒ`³.Ž\7\[ισ§°ΒRr™υŠ 5›ΦŠbnδ tΏΖcΣ  46vA"…ύ’f6(ψ›7Κ9Nƒ•ݝέ*ΆI#‹ Bvι›άͺΪͺ·°VέψdπΦ.’<@΄;qƒežδKAΫ%<$ς–Bτι>1Ή<Φ@I]-Υn65²):S Κ-ΖaTŽτYEž<–juψFx•ZsSfeθ(δύ•ΑLξΘ:m\ωΜΔ6 –΄°ld€6Z\£mζ$G€Έ#ⱉ†r—.Ώ |ŠΓ ψ―#!Ÿ!ΠΤΔ-QjkŽέ7°A€σ#*ΧpΐΡ;<τ UΩ*+Ώ* ή?ό£wYτ2ΝΘΧ75Œm_B•7C€VΟΚ"ΈQR™Ω+ΑΠ«ψkπΚΘP›—5+MUΌΚλ΅­RΉκWƒCx9υ*…Γ†χ5!/Ώ{Υ}UF¨`5Η ΛΥΧyΑ)ž3+ί¦±Ο ²VΛ^·nΧύζv»tS΅α;-8:λQΒΓ™W.[z³±yEΚΖΡΧ­·i|NΔΎͺδS/Ώ?Όμ—/Ώ\zμnιδw·^T>/Y7dΊΌ»₯ΣD%ΈŽ›‘+—]˜ζ%Mk6u{~Κ’W^yQ“|œJΘZy»±―Γ·*;l‰ο(Ν1ŠαΫ7* Λ1“έ»Ν7ͺ˜ν@AŒA y·¦Ι}P;Γ(Υ(“Ά₯oηΙϊ’D):€Ψ@\¨ΝjΕŽ’ EίƒU_0?65›β)*cxβ«=IθϋΥκΌr.e|XΩi0“@p!αq%˜½-^“δψC”Lζ{“‘lΦηx77ρ-it6I™Χjΐ‡Š78 m5HSXΓ―”g€™ Θι°G€‘Ι/ϋ UŒ’ τpΪΔσ?@₯#-ωCΈΝΣ¬c[iΔh)όbΧ#o”_¨œqΆ ύœ%ŠΪΖRž$oCƒαο΅’_ϋΌAΚ·q―|ΠxoswKllœΕV„j cB h˜Sp λ堍)&ŸΟKNx:?6A₯Ξ>jiv²~;0ύ΄²0jΔΌ^dVPπΤ0·q΅ΗΊ3λέbέPΉehΚ‡…Λlα΄h'BκλG/Λ°P“±1@:Ρ.(ρΝQ]‡Mkh'(v(¨Ζέp€`½D₯"0΄―f]fτ‡L ‰jήƒωœZˆΦχ―WΓ eoαZΤwΫ)ΧwΛl]ͺa%ΜΜλ£P“™τ«υΪNTηΛny«Γ\Žl&δ’ΉEΑJσ€m>Ψε!7X…εaF‘Αœ:° ƒΧξζ@y™ΊUjθƒaΪKΞ' ‹Sθ49c#¨`j/o…p3Ϋhq‘ £§?+ωbŒ'qdΓβ2‘b‰L‘#8Θ ·r’Ύρ€ή¬άioσž/ ²ίnCd³.ϊtέΫΚ ΧΓΆΝυ-Δ fό»!Ž{3Ιο–wΟΐΝ¨―ύLά΅Κf·΅ΊΜj> ΚͺΝδsχ>Τ‚i³žE₯Ιz(4άΈγφνϋ΄J:Tφ–Ο&(J―W7›7]Ω{t£ΌγΡM]L·uέήΎΰh77Ω`OMhβ-š)£|πQ9'θyξΐΔ†Z-6Œ"(c…Lθλ¦Ό”Ωw³4- ζ¨Eϋ9Œ‚Ζ#6§ά ΣV‹ΨΞ‰£1§βΨ«bk-CΨ0~φB^P;γ£ωνΧHE‰ΆFM³‘ΈΧάnzŠ%ΆΡΑ%7ΈΆ«h{AΠ6 Γ+΄βq¨=ΗO•’ώŒΓO«|Ŏ5†–Ρ’rVH·ϋb¬7^ΉD²δΘ]Eͺ·&Ά»!Š•,12ΈΉψΑxΘ4“|QqdΚΨt εe Dα¦K‘Nκa’ ©Χ`6(±ΎΣbΖώž¬]ΎΠ¦-R—φΌŒ‘uΩŽ ~‚•ΊάΊΓ$wr†J₯wl ]«Wιͺ Kξ–w5Ω*m]χhsTΙ ͺ^ΝΘ$¨σ•Ÿ:6$H¦¦Q t„]Ϋ έͺΧ―Σ•a¬·2«SlX­˜šπ`QΞ HjBήΧ`=˜Ζq₯ά,WY³oŠ;jdמρ‘[’ξζΐΈk[ω~΄#B A!ζsπf&xm·UΏYα9䱎RbrΥfΎΫ/P1ˊj Y#KΌ"R<„yλ•\΄ΣΞ£΅₯Ιr••ωaq\CTξِ g(GŸOΆ`!ΐ«DρpUyΗ¬elL^HΊc―ξΛxπ&DΑg[ϋ°ͺΨδΛζ$)Ο?L–Ž€rSvμ5 Ϊ@U{³©΄/η―οΧnΆKΫdΛYί4Eμ}Bζ^4[mΪ6xž"„iΐD q{ΦΤ‘xϋΠnQΩ»±HqvbυΎτςeΝC»μZ„v0ΰΒkΛoϋωAt3^ ― j(§ύ˜ƒψA½ΠMry]„·¬Ρ΅Ν”3Γ›ΊιΎ“Ιˆ•D{7—°ΉKΝ€‘<̝΄‘lΔ΅‚Θ $ήgdd―’Σm‚b—νΡ„m\Q€•.ŠŽgώB‘9χRjϋ―γp“οuΒύ½hΦ²Ζ5β’%“Mϊ1]Lμa“Η6o\9ZT* ΈxΓv“\XEβΰVΩ bή¬ςΝΊβjoŠΫ,NεΤ΄΅Μ(-nά₯S£u―s•ψ: 6l;CΆ΄<]ώW½Ϋ–υ3Ι’.6ΔR£,¨1oɝTψ{K%½Ε&«μΛΟ¦Ηξn76D›@©’ωdΣ€GS;V ­+-`KΥΠuΎwςΆyƒS*W₯”ΡA–Š-»œWE€­€ZΎλ{θ»₯s δv½‘œε’ΤͺϋΆ«y»r8DZ΅Ÿ·oΰJuHΎ–ΊSα|Π₯a[\ιΫζCa€$Mς:muζŒ‰Ά©%>iNψ,\ΘAW}™‹ΏΖ±οΪ‘»%j'{s»vƒΎΙ–P₯FΦ`8¦IlZ›εΊDͺŽσn¨­±J“w Π₯ΪJ/‘EmRm =Ό²…ƒμ¦-4€pΨ ƒ€ Η ϋx#΄!+Θ!UU3…=HŒΑvjCΫNm€;R#²φεBΫΕ<*-'A1YΧ#μq+J H•oKz5ΣύkMοβ>ΊOw`±΄ε,4_Ρ#Ÿΐ΄ΰ7κwf1DΪρ ιHΔƒW~{₯nι.θOkε›ϋ[0›=ͺ^ލi‘>"Ν' ΝΊΠœΤ%§¬‚%Ec‘Ο-ξΌ9LΞfU~TbΝ†όh η9―γΡeί¦“¨’“³ Άθ„† $Ω(Θυm2“dWƒΨ'’&M.‰ˆRΩ—AθV©a~+l^„"τδSβz ύNΡ “aM7fΙ½hόθηRσΌYρ£§Ώ<αΏ€θ?FΔΌ?8Cί*ΎΨν€qΟ>S!™ςή°0O2ώψΰΪΪ΅ψ*Δ²~Νψ-ύ‡yφΪ½ς½%/ΟΈΠφρ™%―ζœ ή₯1ο©όΘψιGCΎxξτηwΒ‡FώΉτχ:‡ΞuΑ«P_Π…{Γy?ZϊžΚ]τ?Z¬/ήZ€²O«„<ώφ’‚ρp/UN“‘k;ζuYσΎ$΄‘Ω4…ΏΚKXήKC½Ξ¬—yΡε“]τzιίΦψ„zιeι[‰gθlκ­―glτΕoΘΰc―‹υk…―Θ,ελλα0B/CEΗ½hbžF γϋφ¬Ψ2vΉ0½kmνΰ™ηΦ—ge…ΧpL«4oλfŸ΄Y6Β©‡lΛ^Γω€ΎλZάΥ«K^‹ƒ|¬ώΰoy‰MlάΗλkW―?Ήv —)ηΟ―Q@Ή΅`μ΄’Τa—Sνζ“ε}¦GYO}Θ>=φDς+ωΥjΓβα+χ“IS“χς]^…M½ 3OF―₯ΡπPζ\@7ˆΖ35O9ΜΦ°3ΜρΕΜΒGrO Fž?>wϊ°~σηϝ;m’Ι*;Σiηdιδ`ŸZE’ΌY”γ[ϊΪ²YΓ{ΡοΛΎω3Υ’žyλ”™ι΄’}ΏeρΦ#.‹\~μƒy¨n8Ύ3ΥΝγAπϋΫθu†Γβgώ2υιΈ}β}D»z‹Ίχ;™f‡g}€σ΄ͺόfqήx YZ³ŸvmΕYζΟyΉZ]~Ο \ξ-GΥΣ«λΤGIWzSοιS·E²ZN-―Υrw.`ώ‘Υ”•šΕλψ {šF³Ε|ŒFkχ;ΓΕh2;Y_ γTO7ί’_#ΟΩ,Σ\7χfΕ-υ_}` %,_Ο+πΝYϊϋ‚ecmžFλ$[­©:ΞνM0“'ι|αΫφk‘(iJΛΗήF#Ÿ―"VΌSZTΥΏγUυ']SΉzz3ω‹Ή#ρΑ{ηΝv‰»ŒitϊγͺΖKω¬―uηόΰγοΓςŒ Κ•ΪΡeρJeρ«C¬χφύDie:]6:½Ωβy–ώ ^’†λœΗγτ+σγ‹}ώ63†μRϊzQ)“§5…-έ[xMoω…tη— ΅”r°Ώ‘WΧuA|5h-wŠΛ―η6–γU[ΩTXKά—ςŠhkI[iΎρρo+εμ―ηΔΖ²Ά%q–Ά’Ύσqj+VχgσŠθy]Dίς‹θυ­Rs³QΩk}μ›Μ 9Ψ_Ν+KΊ<ΞMΖH~ΛωBnΛy;ύ5œΛ 32pšWPWςfν5()*Ό!κcίh^ΜΑώZ^YΌ€ΛβaY<‹…qζν4ŒšΜΛ 3=ζsyΕτΚ’yi³ΩόΨ·—ζ`9― .›— $Ξ2/υΣπς#…=)ξ1―ˆ~¬‹θ)Ώˆ–l€/Ϋϋ`BžςΰUΝΌmΒ¦‚—ρμ#ΜΑŠΥ”—Ÿœ ώ_:`α’ΛμX/·7&€~ΧόΈ²ƒg’Θόy‘όΊ‹Dβ9’)ˆηρ₯}d:ΣΣd>" ™$?λσΝι}8l ŸφΉ~;Ν$ψ%Ÿi'Ήœχ―dxχbϋεΟBρ,ύka&’ρiΝ…³gΰ‹Ω p<GΦ₯ηXeP8o}Σϊ>Μ͏’οs4Ώl‡³LLσρ;sΨMκ‡Σ₯|ς˜ζα±Οψμ\Κp[€e6©­ uͺ3‰?Ά,ρΛ…Eυ 3 ž΅K-oR ϋUΝχρθΤ9πΞ£™ΊοόΖτ#“7–Ϊΰθ|θνˆB[œgM‚x n™tΊvν;+XτžΑ8ϊTϋRk Όšgζo5σ…‚}ΟsηV±μɍ>ο³γexf2&‘Ο΄ήΚkyΦv•νUυ*Z²~tΆ«6άΆ~ξNъ%o§M­yόΆχwTαL|Υπό‘MaΟ6~²Ύ¬#žΪΏ•Γ±5ςξL§ΙƒΌήχΥ°pοα6υw,ν~ύ›ΖενtΖ³h΄Α žv §;ντξE³t…MωκΉ‚ζψοs VC†§Ξt0AOIs­Τœύο*™{f•Μ-5Ηύ‡«τ²GwTλΤαη£2Ζ(oBξώκOLΨυεύ“ΪϋΖJΦ’΅’φ^Ρt‘,]žXiδQŏί§sXsλμMόρ²‰δσ©ςΓ™lφ?‚σxΥ4ιΰ©£e“Θ΅Sg‘χuTθ΄S9§θН₯—Œ°-;γL{Oz6πΰΒσΦ‚py+1q{₯orσy]λNιjoΌ`DV›\$E2Έ?t<΅Ύφόισψ³ΛY—δνFσƒ•>ŸFƒθx£ γτϋ©‹Ξqnvk€η΅7£x”ΏK[―7χοΌua²bσρDA>^z(F;©Ηf¨NθΟυ‰Zq6νŒMVag3#ˆΩΕ±ΖΈΊ!ο/‰ΔKγλn:((άU!ΥbSp―ΪbŸύεi±Οώ—Σbσvαn―ڊο¬ΠVjΕϞYΫϋmcq€zο‰UΏ γqtq₯ΨπΥA¦@%“'-Y• Κih z0^aϊ<‹ajΡ©lΆMβΖ8z€ΨθBCΫ€O 'Ρί βςτ•ρ>?4gΣUH/ΓκœhΧ€Η”Οκ„»£[| ½TΘ~σ\ξψς0ηN^S,Σ]ήκΒ κBžVζωΤσqψw^~Ε&ŸE£x Β0ίπŽ. :ΌGz›Hώΰ“«6χbXZT_υ‹ŠŽ/x_2”Q8QΘOu’ ;2d+š€ΝχꑦΥ§¬ψ|p1Lέ™£!Βޞφ:“%κΓp›ζ4±9”Ψ• ³—†Πr6χ+oTxUuO4€ΉΚ7E/*΅fΉΡZπ£%‹­2ή±»ΰk΍2]‰Έ(αeΔλ« j•!‘θγ¦hL4O½ί†²t?Υμ΄sξ”aώΤAΏ§ΞΈ'ψ1*Ρ‡ΛŠήΟ’« ίτίOΏ9<χэ]ή|΄ύ&zˆ~σlžPυ);ΞΏypπμ[9Φ+ΰύη<―φςoΐψy{ρYβΒ±ΰT*›KΪ‡ΟΝ-αζ΄+ΉθΟ™aΠiεNšsΏ¬žΒb(]ΊqπφΉ‚€½[ΏΞ(.π?€Mq£υ/υς€ΚΟλQtaL‡WXM=±Jݜύς-¬[vΝοGΧ–†ΏmιKA[»bΏxΝιΤ£λ?:–?Ό±ςƒ:ωŒ|Ή€$ll™Άw½‚ΡΪxΧ+,ΣΔό[―4>m£¦Iπ}ΔϋoΌxΟ(βύ»sω}ωΥ3TjΡιτ²:@ν[ό—Η²,pΡεH…{όC΄ΐ€:^ΗΊ‡c~οZp ~ΎΚζ(w³¬$η.rYε*ŸπΚ–’ꛍσ?/ΐwIu{…XΡ…HΧΨΫXθr–υƒτ9ΊΡ^nˆLŸ;ε’P›RΡ&Ζ7ƒŽkΥ΄&αΌ)β7σz{α=Λgόs+ZΒεήΔc£ΙΏŸgeqΐ΅Ά'"™3Lή`)Β‡½ζΚVV‘:Ρ”dF2YV’ώίσͺcϋZν’ŸΣ ?qξύΆύό9ΓΩ16~~ΉαΙσηK»oμm&γ1θωεcX|‘oΜ£9Ήχ6+3>Γ„ΤdC‚Π†’Dζ † }λέ·!!ΊHυz§Ώ-θfg8,›+r!(xνF³£€zlvzG°¨T±n&Γ‘uΞΗ3΄6χV}·4›MΩ΅i’[YG 69 F€άJzs¦5΅ ½Ο‘εa€κl sфΓt„]ΐjΠϋ΅€νv&‚α\xݜαboš`Ωaεf$M ΆuΨug„StB[ͺ vϊ~g(δl^$}!Zρ(RΟ&c"γ)”2Uƒi'#,­Έ;ŸQ d€ ΔQ-ˆQ…‘ŒLŽ’Qa’ѝt8kΞN†QzEςa'«ΪFΚxŸͺέςtšLuΠξν";ΝΔ‘ϊ@ °3LΊš€«œξ9ΧΦ΄σ€z/>ް@ot¦σxœΨΚD` φ.ρΦ…$=q•Η=(‡©PΫ •:+q$ξϊ|†{ˆ” {β5›MΆ’CάfhΞ¦Qg$XeœΕv‘€έWΠ5§'|A– θy”Ξ|j/I†I' ]2[]†2…‘IU˜ΐj{"š ±Νm'ΣQg6‹ƒ6χKb§λΠk††( °Eί‘Άh0•Δλi’› ΡMhϊΖ»ύoΆ:ƒaάmWΆάΏά†Ά γFΤί‹aώ˜FΫh3™ ”‘°έ½ςN»4οΗ 4τI4ΕQJœ{°]ͺ8Šj4̎4ΫU΄XPΩͺ&½}XM ¬uΘέhΤΓ (gŸ_΄ζ¦ Λz7σ{=ːGδ&χSq‡vΘgd>M=j*.ζ89"Ή^Θ½3ϋτˆš’όh“±Θaͺ‘JίΊΖ³+—ρς‹.έm?Ρ`φᐺ;ΞbxUQΦ τƒΨ››jXFΠ@¨js΄§ΦΕVί¬lxE‚@5ιRϊΠiλ‡Χavι§ΊZnΰ4 ήψSΏ»ύΓ䁳GΟυΐΏxžHχθδ€ϊr¦-~ΣRθΔ²Γ›ν€l4Ά6ahΰπ@μL;“#vξOϊΞ[†ΕFΤƒJŠοGαm=2σ,pa=sζη™­Ο2,Ϗ*<Ο£5όΘ]΅9b…Jaά`e΄HÐF ΙK"§{ž,œxl΄gŒ³}”GŽΪς σΛkαλΠ4@Όv―k²YΪυd7 έτΠά,ρΏmZ αγšIg"4>λΈUoo•šνM’ωšσΡ¨3₯‚cΫΫξP•¨Ν΅ѐfG’I ،f3žŸ r‡ή5RT[ λ$ ‹a‚^I]%YŠœ»(Z΅UY;ΠUE&B RMœ=YΎkΦvχΜγΝ0ε]αw—ΡC£›³‘£0n',„ήwη‡(EbsjήΪε‰N-ŠξဦF0Χ5c;‘ Lf!ύTωζ0–@lw„p߈:,ΊPΓΐvΛ‰©έ·^·:δšΐΰpμ"› ―³x-ά§=©Ζγ{QίΤΗdXΟGμRƒ—PjI@ΘqΤ§qIB “ŽDLNΨU1ιξvŽΊΑ±6ym TςΒI클<)ή¬nRNšI."§ˆWθžΫ3Ά’ΡDgα|σAœ™_SӘš£Sγ݌:Σn%χN’ΦΙ΄CΉRΙv>Τ’Jo‘cW½@ΦRρήχ3³°±?ŽŽ'΄φΌΥΞ½‘δΦ+―§ς£ahC Σ6ΐ}­£Θέ¬ΆDΨ§δOJ‘+€ο c€ΨΡξΓ˜Ύzj:ƒΠ)w‘t¦c.ψtΦ—ρœ( ί†‰nB1Νβ>θΐ•>κdWΑ€ί^‘λmuη0ρ)ΨΗ–*:τ*έ{Eν(OEΈκΥΙ«ιLŠΐχΟ­’Υω’Φ¦yFЧjZV²^,`Ξ+/uP˜ˆΝ|U>Ύ]Δ‡‹i+Ÿ:·ͺφε5₯z$f’E,}ze–Ξϋj2³™A7}oύٟΌͺn†ͺnh™›α—햝zιtψαŠMΑ“ΛŠΐΣ‚ΗΆŽΧŸ?ΈppŸ‚ž~νΰ9)άσμισ#\ilΠϊ½Λ~|hAΑ_Mρk/€ž·Ÿπ7ρX…·eΉ–Σ=sĜ+5/ƒF» yyδ)}&W]όΌ=γσΤj -Kβ³Ή­ϋιG˜Βη–5 oηČtτΌmLοΫ6θωΦνΏ|ZΫ―ς‹™myFΆ `ŸjΎ3jœς(€τΆ';ε}K&ά‹Δν'sN[Øμ©qϊk{cΜ²!惂>ο…ψΌΗ•‰υτXΎ°ς@–{6 χΰGφ‘ςθ@QΞ}YΞΏΏΚΜ|ΑΪa<›ΒB–ν y₯Ά―ΆGΧ―­8SšΞΎ % AΑλ‡yΩϊ //n«ϋ$ކύ՞*,ŠϊK^Τ{¦λvAdDYΎΗ 1Œ2“ ί@&›²λPDύ˜h\’DCΡ“’#>DdάwίqHβ/;’Ισ@˜ ιƒxf°G¬σŠŽc^π§ξ;ϊhŠ%oϋιœx¦―υ¨°¬œά˜π,θ!ΑuyLo•*Ί χ˜‘χώc^Ε|Ω«˜oΜ,fΣ“Εμhš<ΰνΧα‰Κί7OM½Πθ=-θ#οΰO3ω•Lΐ2=ϊ§‡ΑgήzŽž€ηεYΑӞ€r·!ξ›•ž Ύ9-ψϊ΅'Obσ\AόqώϋΉ;^ΗG„ΦΦΧsοέ—ΣΥΈ»C£nΡvωj―-εύ N9s<ρΜGΒ]—ϊ΅lΎm9>ώQ嫨ŠΏβ5‚7υΌ ΓgcƒΠpΑFφ‹CΤΉΐT1[•δtύΪ’ ꝡ¨Σκ‚­z i<]θΆΠ‡ι‘–ΰ΅Ρ’Q₯Θ”ΙποdΖοŽθƒΊ¬fΒΰGrQ ΠΣ04hΟYr(j£C«Ϋ…hbR°ΰ‘ž©μIΆwU_»Ίvπκ:,ΌΧkίΓ[§hX$εΣOJ{ξz•ύΔϋϊΚ­ͺΦ^[/’%-ΏnχoδK2vΨ=Ψ8€j}–ηα7H₯Sκ ³±+ˆυs.VˆSZΛϊι zΠ#˜Ω2BΠχ°Α,N½Λxˆ{½0―fj…¦ φ·±α~o•ΨΊρ 4Λα@rήδρΥW_]|ώρ«?Y\‹ŸΐΏΠ)?9=Χ°Β†!-N3―V}]{kίY_ ΙχΈΏH¦‹cψί³ώ^½$ΒNώgu'7Ά”ρΏS/\NalιuάUΎ··8伏φκϋaή{δς&%-π{QrHΆ‡f88xF­˜ gΦ―%ogͺ!α«ErΰίΡEΎ+yΜ’Σμ#O•ŠΒqt|Œ|•cφV­άφς{šy7zΌΙΌΏ΅š zΆύƒ\Ρμρχ/rΊ»ήR4Μ­φ―UϋB—œ»Šμ!žλ,Lϋλη ώ–YSΩsΛώV³£>Τ­-Ϊ―’ζü͘>‡z2w€ηπΟϊ΄\Oε’πυΙbSάο'.Ζ3ΪƒΩjϋΜ|8vβΛlb=%oΗ6†χ΅+ϊΤb?ί:Ώ(/ίςB|ɟ  Β2"κ%ω01Gf‡@<…φΙ«ρό(n_(Κφ·— ^Ώ΅‡FύηŠOy);d9wΣτanJ,Ϊ9ύΖΚ²ηΤπ’ΈGPgΊ*¨>ΎY4=όυ“˜Μ“ΉƒΑJχς­φόω’‘ΐS‹›§₯P<%₯Ά\‚£Γh6PΉ Φ œMpϊΡ:“ά‡…'Msވ}$²ο΅₯›΄γ9Π#Ψ^.΅\χvswŸ€iyK`9Γν”ΩΜ}?,™όqξ­ ŠzδwςέUύΙΫ¦ab`Ο"ΰQΩ—<ϊ§ΉMˆ«Sμο―9ΐγB8&=(«~َğε±υόΦlŒKδΦΩΟ›=Β)ζ©άΦϊ'#ΰ)ΧZ{2ΟΧ"ψ-g—6νgύΝιτsη–όνρwΡΎϋΘ’YϊάπχY2K‘|φ‘%s>˜/ΌdΦY2K/ηYdΙ,}ήχΒ’>«Ώνs«²τ];μœ6―θ ψž8Γπ²βbŸ+ς”yΉwφ=ͺλώή_a,ŸbyJΘ›Ÿ½kΖΡωΚιxΟn¨HΔΘ?S 1ύΰ{Qγίρ²π™Ž-—= —EιήXΦι>ΗΣΑΑ›/lόΰ­χ.}ΚΟΓ*+Ύφ*ιΝ:…v=ΗεK۝CŒψrζB‡βˆ’γΒhη煮ŸsχD\85Ϊω8Ζ“°“$Ξμw|ΦΔx:½Ω3O=τ`Φεΰ= žd―ΛfLΞ)†σyσ@Ν/Κa†έ•Kα}ͺˆ½z[ψ—§{Ρ­PΛvlΌm-S˜PΝ/ΌΩ½ώͺ?ΪλkoΎpι­E›άλjќ™[ΗσQ4{Εμ"Ϋ―-]AŸς΄‘‰ΡΕ”5ξ!fοfŽrX];U˜¬;ύ¨:Γ₯ό^\ί :Ητ— †Ϊ«2’>}>χŽΞwσ—._Ήψβωdzώ"Έ¬,ξ£bφΐΥ7|nqp}ύΰbŽΗ“n΄ £ζs£;Έˆc,`oFε·ή|nγ­k9πf{4Η‹:Ϊx#ύϊ΄H!ΌS¦²H?xQ•λΉμ{ωλ† B~μA§ρΙYγzΤ&³χ>¨χλΑΔΏηεeέcύΡLt#:½ΏtΈάg,;½›O›ζΒ1ρΟλrxV—MϋΧVzXκ‰GšΑSŸ'|βΡ·yяΙΣZ«e&θ³ΏVΠ~Ώ/z΄πχ π?Ξ“ΚjυXΎωΰ{sŸYhMΊ΅αdƒ|±Xy„ϋΠmςί(κρžΉΉ€]$Ψχ‘><΅―œΎdi±ΌXž=ˆ©οŸα~Τχ…Σ―!mz1–MTΏ¨š_γKJ©΅e6[λ‹΅‹Ο­―Ϋν›τ' ΗκgM‹†_•ετ0ΕefφŸ šΓ1_¨u1£ˆ¦Ιx Β½έϋ•τ²ΚS‚PϟΎ–_½$\JΖ2kmνh6›€Χι΅ΓΩd§‹ΓφUΣQwΡ9œ,Ζ‡ιbνxcύΪ¨3^ ’ Υbv<š­_}ώωΕ¨gΙΥυ77ΎΦΩx·΄ρSPH΅/ώφwŸ{ώΪ«ί{ϊ­ on(aD3ΗΥ;Σ{°½7Η1θύ)ψη^0‚X-ηkΗθKν ΪKΆΉ¬jΙVzΡDZȜγν6γΐkk5cŸ8‰sb¦λ‹ή4τA2=Y$““i<8š­/@΄Η³ > ²ˆΧπœ Ϊ7ΖΙ4Z_ γ΅^4N£du1ι¬υξAΓ[ΐvβϊ‚νιZDgE£Ώc=ο‚ΪC­/fkx`/]$ύd}qΖάE4EeΩϊviΣθύ¦QŸΛš^ΓD‡rΡ:vGΊŽgmc MRπ6‘υυk –Θξ΄«Β]±ͺ*4ϋΡο­½&Ο8A υƒŸŸΪΐOKΔ₯aψΒͺ β_Πy^διr<(₯4Ÿ°CEŸ.šT~φrΕt}эπΔ§ϊu₯›Ιύ{…jθ`x™ ΪβS©vQΦβρΎιwf½ir?†vƒEŽg€ύ$J!Θ^4…F₯4Ε κ`.[˜K_μΕ.˜:€Ί»’€lDƒςρ¦‚k Ϊ_ ;Sh£¨ΟG TˆβΥ9œ+Ί΄l!'ŠΣΕt>^kEι,­Œ›ΌΥΙΝ0ΰ™ΑΦ‘οƒΎ€²˜­υ“γΕνxv©B)ΚΪj_-ͺΠ1‡ΕT X£nΌ~ρΉkNqm,³hE0λΰΫNΤε\M?‚&Lž‚Ζˆψ’Ξσ°£tqρζϞzώ­υηžΦ{κτ ΉunΙΔ[”κ³&ΥgσR}φτTo­œκ·lͺW|pνΥόΪΉ«PVd{z‘ή[^_φ>lζ°ύιΚ¨»ΛΨ{²@‚™ΰZGπ’ΝNΌNΣ§=:x–K’‹f―"Νΰή3Eσ‡Ύσ9σ`^ύΤ+—―„Ω²;„+ή πυ܎±’ιο['—BN`ž‹g’psχ)φeKx]°6p5ןΦΩψ‘±@Ύ’Kx}ΐϊςŒ¬‘πwž.kδ±8μt£α²†RhΉ“cCχPFϊ9ρ<ΔΥςΉ%όΫ«:™7ψΞψnαΐς³sgeα©GΝBϋΜ,<ϋ¨Yθ-cαΓθ?-ΐEώΟ πΉ$ν^0Bš;6=ι΅;}Ό_] ¨oχηts¬&ωr·*]ΑΫζ[ξHku¦mΉWΗs“πq[ΕJ\λ‚šˆΪF“”ZxΝ"ΠίGΗqjΓF|SΊAh·ι"Χ™ˆAόœγ°θέ+b_ Υ":θιo"SΤrPŸ~Ϋ|‡|&‡ΆάΌbπωψž£’α|4Vδ¨K7d[z>ž΅ογ}…©a‰|θmΙΉ!e?Τ\‚y˜E<τŒ#Υί(δ0žX‚ζίΤ\e`m?a‡λΔ:/ ξ1‹λ‚1κ8ξ`a)ΈnO͝Ί.ήq*Π™E&ά؝Έa5ןχTΈ9]}ΙΔ΄3v_M#¨ŸF“!_»ΰΡ9μL#\9:5—f y:RΠύ¨ Ÿœs―Νuς° "ζͺ’3P»(l&–qόΞύŽφ€α‹~'ΙσkΌRΎ^ŸβIί‘ΗΌ«Yύz!«½‘Xz*³Ύ‹G°\Α α}Η%€ΘΈ€•ξw ρΑ4ΒΨ;œ&£φΫ}‘D`Aη,a8κ€0ΌΆϋ|«₯hϊ{»?Kގψ.fHIhͺΗάbΑ―dΞMcٍ h0γ~'<αp-S†Έ­Μύrdn†!;ΊaΤχΤRvΗAΏŒ@n“« έ©Α_x\R'ρD&€…­Άΐψπ‘&‰„ΎΎΘ&nΏpμƐώ~ΔLΠ@.Y6αp,Υ―`«?FlΕ{gŠš Œ S|¦‚ˆΎ‰΅σΈ/ˆ•4&ΉA4s6́0™Άν%Pˆ³=œ!ˆ―0G‚’0 Ω¨TΖ]ρ±Z$"₯’#άΜ4e“‰γ©Ι\S©υ›Βΐά]8jΙΣφ9DΫιbeXŠΖHK5σφΜ#=ŠΈ5v,ξ…3υΨ†η ]Qω)†xT6Tτަ© Ζχν(φΏŽ½tω /CΡΠεΡίPγh ©DIc!x²0ΤϊP4Χ‚’„a•.΄~δ8™4:CUMϋΩΜ„‚r4TAχdFUH(…•f­^:™f­ω·™Dz˜!’€… 59κXͺ7žM‡–κΗa˜Θ›#L “,PEΝήQΘw’DΒΤ\.tgκ˜YIζλεΓeΗθωtΨ6³3°c‚ ΌA™— AΝ„‰cZ±“­ιΕH’"ΕΈiω„]ΠFl’f†ť@ός.·c’m<8L`)Θ{₯ΡP†8Δ 5'“™c’i7W!vŸχχžΜΩ–ΙV|ΤΔό‰LM  *σΆϊ‘‹œ<€ϋF‡τhρ‘Έƒ2ΝϊV–ήM@­2Xβg†Qφευ z^8DΑL4γφ8–·Χ<ξ˜#°ϋαόXa2O;'†Jq¬h&aFNm©‘W(<‰sld'COcEJ7Š|Ÿ¦±έgΒΑAΨ°ΐύ‚F‘Bj{€οΑΐΪι°O­l02ψhtoΖΟΦ FPЇL@ΒGSΑc :ΔmΕ½ibά&χ9:'Ξ9Kl¬Z>;έ.¬Zc¦m^ο:_Ψk…ešfdύZrφ-ŽΚy"Œ;γ„ΦUP³°Θ ˆ™Λ °tV„W’±°8ργ Σώo™9’ίνΨΑ έV?‰„‘0ΪHrΗ°¦a}’< MMΘxŒ[ΤB 2 U6‘BF'ͺ\4\"βξA δDy9%R°.ξ­4+Cΰ 0ήΝ)ŒcUΗmΎΟQ€"ΚΜ"δ¦cLj€ŒŠ „ŽBΏ#Ύ ;T{,a:<ΙΥΝΞςGύ˜¦³£iB²ε€1ώη8c)2„³qα‹jδFνM―ƒ!Vc.WP­Μμ RΝρhυό έ'M™Θ‰Q‰hh"ήπl©oŽΣ!*RΤλ“ω~β‘'σαΈ%—ψ1m‹–Ηmw Μβ˜OšβIcΖ¬žcZĎΣ<¬έ™Ος˜M]"ΰVq­$2σA|5ΫΖ“Ωg>Xή¬-†/ΔΝ¬ΥP_€B2¨Ύξα‚ΊΔ4ξςeκΎO «Q;°ž‡\»9(}—υΒIάτΔΐKΔ§ΕΑ‡βΚI}ΚojJRΩLΙƒa;8ΜΓ~y$γ€ρ₯<£π++†SyG-Ο;΅-Κσ%Ω*s ™πΌB!˜Τ16 •Cς~gƒ¦17)ΪN2C―ΌFζ˜P6Oζ\ šiRςaΠ¦ξdšj4₯•ώ¨QΙΨό*\&ώΕι;Cμh¨Σ^IΘΕžώΏlχ‰ΊσAνΑPΓΞ aDX qͺΩ7ςϊœ!#xZ`˜ ¬ςLqσΡ…Š}d’ΥΈ±ϋr~8„›ΪW_– }&,¨Ά©m-€Ψ"βΙU€£HΕφ»Ωͺ€†Ϋ! anΠρ–-—& šMη|£uΟNΗD`ΙY=!cή "·¨ˆ2WP³j’1 2~Zx΅_YϋY6kΗρ!h3@1$ p‚ΕeCΗ³Ξ`Μ V&ζ£ξΈCκv K(~°"gρaΐΩgdψ>‘€Ω;LIguΔjσlπEλΠ<±HΝC΄Έx¦FmΔΐxΚQ`ۏΣ{<›>! yΓl¨! cθCSƒ‡Όth”ΰ‡(–˜ίτ>?ξT°”o?ηkίq›έND‘~”WΣ5[ˆud1€ξž]! Eφβω ]tΤPHΤOΠ χΘĚ²hŠN©τC΄wαΈΗ£KΚ‡"΅ͺF}° ’1§I·­β!p†~AΉ/w4suˆ#σ1Š1Δ4²QΝ¦:X³‹.<>α’ZuΗ Β σΏΝτ0uqΒؐ1"ρ‘Ϋ©°›W©DέλZχ¨ΣΣn'^$mŽάσ‰θuε%"?ώ»ŒˆŸ…3MΖ^§΅ρι^΄“LξΡΓo c{ ΜiŒ"Χ}„Ά δ_ίz‘Ε# ³h·‰˜<“;‚Ιu&ΕƒKΖiu έ€R„KρδyΡ#Ξ©ρ:bQ’ά0%#$”zωbΔeΙpΘΈŸ‚ωz$θΩiσζε΄Yއ’²ΎζQ$γÞ_IŒYcPΆΰ}ΜL]PΕ‚30ΑKέ”–αcϋUŽΏ Eώ΄I`ύ“tfΦv8Δχ»σ Θά™€ΪT«α{ŠZ[Φ0 MUά$@‡’Zœρ 4r=EΐΝσ23}·\€tΒEΤffLF`ΩΩ·ν¦#(ŸXΔ‰¬Ώn'δ‘‹]nδφEς±Ϊ ιΞ#γ‰γί)œΝ†όV˜ιNCφž%Ψj£$ŒZ)3DΗP$Έ2€_Φβa-‹• $‘ΫΡ&ƒ©N£όl[a,Ν‹JiH«K’½§α F =ος(ŠεAHNqnνΣ‘ΥyFξŽΡ Τ’tF‘–Ά1mŒαB@Ψ”Žg' Fm(μr³y΄ιγv—,ΠEs™υ“•bΰAηnӍ5³HpΩ”7L ίXȝ ‰¨Ν3‘€ωά§yά§Œ@βΣ™_(b}cΙ$ %ZI腏r΄{_ϊTFθν›έh4‘@U˜,§Ι}ωA—ΔZ"¨»£’›^ΈU·οCmVFς!›•.ΪμI‹%6m΅S>'@ΞNΖέsΛήύ1…W"z”,hLd”ΟΜ#iiζbΩoΕγθAWq‡ύ(— #.H6b£erŒΖΙπ~”‡e?ηΉ[Ρ°*…₯Vt°™’zΟ JϋΤlEθπρύd8Ÿ©ϊΉΊε€B xΩkAΰ—ΉχΪS_qfμH…Ϋρƒ~v9„ Μr<θ΅ή|{ ²θdœ•Ο)ϊθ^ΰΠγξ(œ θύΈθ ά)8κΩ$hdΣΔ–%( γIj}ωό‹a )ˆ;ŒrΎ‰ϊ“dx2p΅Κ J) Θ ½°³€K{_ ›) €#Η4ς ξώc³n79Ά̝¨Ag‹ lΡΈϊV΅¬ͺZWΖΥ(k5{²ό#ŒLyd‰4SΰΊ ;'°¬=’a$MAόžωUˆ©XŽTOK;ΑP‚+ί)λσ =‰£‘’i£]Ρ Κνέ³ΕΌΕ¬‚š{2ΒQnOmΩ€Ά£μ‹°ogvn:©XΠ°ƒΜaX‰ΧšΧaΙˆuι8ρβqΔ!ξq΄{'°ΪIα[Tφ@€n;pχ­]yοp šT’ψ`ι8’>wH"ͺεσhPy7ήΘU bqή„“½‰Α‘”@3ϊΞ<…H{0ιY>=)X‰ιY[nπˆH Ζ0°dΰ­/ F'ƒΨ:Νή‡“‘9§JΆ”η©™Ικ·':fxΗ²ͺW›ΥΌHΙV­P<ηζgRηΚι E4‰:χΪ&M…aΔΑ–Š ¨’«ς@φšc@O‰:“Ψ, ‘žΫέ> zΈ"Ι§fζhβLc`Λ%lΆ€ƒzO³M!-D²ΑFαoΔ^LŽ/΅qcEφ·Œ)œ3Ξz—Φ„*cΐΒχUpƒΧœύŒ–ι₯1n° Eϊ‰43@Ήγ)0‹ς2Ž„];Q+ ‡―„L6r4dΕ‡α3r<’9LZ₯β/~=ŒλU!²?ĈŸ<‘βY@B+אXΙYVϊArκΩ+³ώ–&ύ₯£ιΤ¬Y =JŽ€ NηΝΖvζ4¦ΖΜΡˍΆΛ7>‹΄ΙΝgKάΚ_yc>A˜]1€v››“Ψ΅gΈ±‘ςΘvΑR–?2 "Γ «^rΡ{ D€Ÿ‰³Y`I§aΪψ­,7S˜SΊ|ΡΌ:—Uͺ—΄Y*wf3>™κΓύ(€gεΒαΘ₯E‹ΕαƒN,Ÿd²B²~τξύOgO ‡x›F۝Ώΐ<2="4˜ϋ‘B± βžγγԜž'YGgPdΟ›kΩVfρŸ½3xZΔWZτA{JξA ;η∾Υδ[ψ#ΰΩ°# gαθž΅>7d·ΜK {ε•υpΕ₯ύliif!Ό4-@±‘ε$«lΔ•QDγΨΌ6°6]7˜6μG:υςξΑ6JΝ²›fψ’ƒ:κωμ©o Ρ9aQδy +ο4Δκ?°ΎO#™e‘0r£+ŒϋcTπt^ΜϋΘΛ.Δ|vψ M”γ:FD!$Σ"Τ5ς@˜N<œOν•zh Η&ό¨›u>ΨΉ…‰@b[@ €Q―-Δ9—€  ‡ε£ήΙρ•Μζψ ž$―?V ζϋ ‹:Wθ-χ;œγώggZΔd aCΨΟ™«B5ύ@ΘΤ+˜Ψυȁ‚0#vθπhU½‚gΪCΟύĎ sύM@ΓΉ&]tŽWΏ³Ž‘Σ!謦Ψϊ,Υχ½¬αωΘ>…ΆEΰΡ²>λ8pΊQ°.Όζ!τq…£Όlα(LεριΙ¨› } —ΨyܘΒΤdN^‚)Κρœζ1‘ζ0‘ζ11• +»s”0μ–_›pc5‚~Λ+τΧM&ΔE’9.Θ6ΓxΖ—,;VrqΌ¦σ%Ÿ²GšE†ρBΧ:‚ dIχsΧd΄βrkž\ψaf{μνV}vο‹(»³E”;Ν·R’ψMθ“±ηφ;“φ+―ΌτC:ύ2Z|ΔK7rvΙPέf΅Δ„•…4²ΈxLωӘ'έ­IΉ?Ύd/εvΌψΛ‚ΌQ'Υ¨K™χ1½\½Ω,°ˆ½'@Ϊ,™j/«!j„χ/ΈŠ@²OΛgKΊγ⣘DΓΒ‘^‰’ „Q½rΚΙxθ‚_q›ω©΄“½&d―B*,ͺ”ζ`2˜CCw ›]m¦hCp6΄Ε M[0ΆdΝΗΙJ]Γ]ε2ύswρτŸx°‡jEd›o7d…ΥΤyΫρ&υ1Χ₯n*°φU‡­ΔsžΚΡάqGDΗt%SPώΌΰ-Weμξh8j‹-^d½Rρaΐ κ.{Y Β‡ω‘λ°RR β‘3²bΑŸΛςΛ»'Fυ"f}X±|ϊ<’©Δ >]Ά€ξχ‘#%IτΪΣȘπΏ£KlίNuph•¨h7Β+‰ΞC$œΪΡΙ$]ΛxΖΧ=υω˜-Υιψ‘¦Ζ”›aoΐ=Δ{ιωˆjτ˜μ“I2#!Γ%΄\K†3Ώ8!?Μӏk?ΘΩε>mδH0s)³”²ά"d’’2G‹Q(μ«;s₯Π‘QŽΊr³“2Ε@ŒλΠ\¬§όpχ:㎏˜Η7R†Ε07Υ­)—ƒεξ•ΖοΦWΙ1³›>@xςΝΔ,pNΜ&JΎ%Η0(§ΌΔΥ6ΫΪ†v#ΈAΜΙ|)›/F³8P9b« ΉqδG)ΖΚιXgNy„Td@‰[»:™Ο,ΰF1―βΥ’ ©8uU%|p$J‘ΟI$;03šΈp·dΔ‚$Fΰ<:dΜME’™Wψ ’r³ioξάρHφy mTB²LΓOφμΆE‹j†ή‘  Λ£Ό€šP9¦;Μ5&†6—“0­ΉDE<›‹₯#=W©|<7‹r+ďΊr-«?<ό7Ωα‘7=E―‹c˜!»Š Ύƒ Oγ―` W„9I0ΔΫΌfG£ΤΦΊ€ξ5bΏψΎx8τΟύh„Ζό‰I A;4ί§~ ˜&˜!Λχiώ”^A ¬W ΙμΪƒΉ]&A£™ #”ΉC|œοa ΐ0h~Y“‚4Ζ73‚2σ*@ƒθΗ42ΈΊvU‰Γ€œέ^šF“Λl&Ϋ Tˆ₯•-α–Υwa©W—ϋ0€_οβ+ϋ\>˜Σξw½Lm$Vr AoFF¬„­]Ά2§ΓΔ«$ςIw'·‘VΕڟ΅Le› …ΙaΪPgΈ«•^Ύ·’₯Γ(ΗR?{VΧ[Τwέ’~΅4’ρ ά§ύηΩ±τ‚‡Ϋ²Œφ†¨uχζ;Α₯+0e—ξBσΰK›yŒ Ρr›n€k‹ΟΠ²ΫfYr»žL›½₯Hδ*Έc„QΩψ”Γc&›‘£=Δ†OͺΈς7N=·M‘mS{tPa2…+Δ+†Ό²bΘ6υ0s'›€ž‚1Ύ)‘ͺшW?BΛό ŠοG%YΨίΖd< Θ'veΘΧItuρdwk61―§ψπΜ λ„y{½ςν$lέ&ΒV†'] šOP’|‰˜n‘΄aeOz&§z‰ ξ½κΥvŒ€’Ξ¦Bί#ήVλΪψiΠ΅τdn׎σϋvLW«X‹ΑXq‚[εζ—Eln93²,H%£σ %φr8ΗnΘSPπNS™±'ζyD‘’}ΑšIYq<κΘAŽ0ΘdhττŽaΌIŸγτ:Dά6―Έ˜Ύ#bOΎ')₯”χψ4žLΗ’υρ &( ±»|8»Μ₯Všσ-#lœ7ΔΖyc¬Άν鞬_ͺΉ fφΗε8;0Η’šι5θ·b#/ΏΩ6–={:'ίcv!β’!Ωσ˜r|œ}™φσ/νΎΜŒσ γ›PrœH‘zψχ3’3xΉœ=θLΗfυΝ¨½‘ϊ Μ!qϋ^¬+€;A8ŠΞ7π`Ε¨€ψφGcΖ# (¬ύ:ΜN,qff‰υŸΆ* Σ$θW“Dηΐ °GRfΜ+ž¦Δ/ lΓΰύoY{ΔΛ ΞŒΙ fLq–°žΧ4ιF>D‰˜s)‚g&ΜX¨\Ϊφα£ήμκΈMΝώ+©K‡‘ή+/‘”=.›­`ΨΉexghŽ2$Ά½¬g{€@ΗΜΆŠqς… Ω-ΝΐiΞ›ŽGΨ†ΙΗΝΛ™ ζ ƒ%Σ Ϋ™©Π`~`,oxeŸΌ±“|Ψp’ΐ#;€—?nd€ύlO&8·χ²OΨI 5ο9ή―šKΙ·°½“gΆ}«πΏ²ψNΟΘ²Α(!~ϊe#να&}=Ÿ)?¬¬0γβ—›zΘ(Šw€Ι½g*€-s‘θ™Šδπ β•½Ι…(§SΊ0ΗζAkJOR ½,ϋ4 »Αζ‡@$\+Βϊ‚LxO4K<7ΞΊ'x‹½9Lΐˆ,θBRCƒ72¨β&'t”D‘™ž„ύ+μ„©ζ4Ά~G©h2½QuF΄Τ²υ†‡μθ=qΫΖ ύ*L!•6aΗK䞏 ιoͺ»MT΅`@ΚλUΠYΝ*(<§l™BG"@ΠλhΗα5q[0n\£ 0!’Yb/Ό2(OL¦ι x―d"ΎΎ:–ΉΕ '\Λf0lύΝιλ•NΡΨ“θdA4ω3ωVž€›w‡°%Ν·ο‡žιάN(Κͺ0@LΘ (ζϋGd‹†~Zύxΐ»¬°Ϋξ! d« 20M%~djΟά‰BΪsΤ/π˜LγϋPΥζό”ηEEδ'$Β¬!'χzι₯ΛΩ*ππœZ1 Υ蔇gΛ‡qΕ;ΓΠΎΩΦΥΑ°ιŽw“ߏB4‡‹ζrΎrW»‡ρΉ—Y'¦y^RΦΉ^TΦA6ΐΟosA^‰ON!qCΟω„=²_ΘkL“4šχϋF“ρM#–B –~¦ά_zᇲ†4\ϊmΚ˜Μ§‘3΅_¦zšS=δTav\Υ ΆΑ•ΦNςU0lΟ,²ΝΟtv™―]ΓσΙxε—Oͺ€ΚΙ6`pΟ³ ‹72ϊ>‹]Y‰τ»ώm^#|P6žihcV½j’tνζ•XΧα©οiDƒ?ί›€¬°ιΠ΄ηjΘόuPΊΏ™YΒz}>ήPh$b±Φ3u6ιαIΉΞ°3E‰‰)s#;‡°jΆιβD.°b,ΝΓ oPgΡ$I#O‹γήΈ½Ω’(ψφρ€―Š΄½ 1/|‰ƒΠψ,«»3ž1‘ϊaζ TΉ$C@„ ¨ …χΜ°’Ÿ> _όd¦.™ύl€X˜Ά |D2ϋΝΚ}ω΅r.Α»στ$Ε―š‚cœ}9“Ϊ΅U$I¨@τ»ζF‰{Pά|νίDR—½_;’φm΄R1z‰¬Iym<υ`Y8;@ΦΝ°Λf‹Ψu›Cd@°ŒΆΛ­Πσ‘&'Σ›ΔXDV–6–/`©Σ£Ϋ‰θύυvΐAnœΜxζZϊΑΐί}5Œμ²O5Ϋ;kahŒSL˜ ”˜h‡‰nnH™kLΪi‹I{ω“"I1!‚#ΈŽ%ΥΔlν0!ΦLπeκ–4·β…fSHoShΧ½μΎ''Iϋ&ьdμθE>RΆΣΉ|Ή]$ζhm9Jυ\V‚«kK'³Λ’Κ_#Φ¬ΐαH  8΅{δχύ^DˆΗͺޝd~βξ™ x–?πΈgG`Œθβ…Ÿ’Yσ ;AλΌΌΈ ;gXΤM; Ϊ+…Αs£KρΨ;ΘΪeŸwιLhΓ–ΫdαžΥ€>θV“δ«q„ζ#Ρνω4vt.wVΫl=<}·c3G->©Ίϊz’σΟΡPn¬ΰ}@_PnOeʍ^/₯ώ cήίw<$TbύΜƒ©SV¨œMΪt_"n±ΰΝΛ}~Όƒ.a拁ΨΝη“Θm^@˜ι³—‡3wΚ’s$‰CήΈ&§DŽ‘UPeΣjΨ‘:?Ψ >δ…M p¦ω: ‡ΊkρπEλ’-ΫηP΅δΉAvzCEI£TaxZ†,³uε³Λ”ΉEΘ!6-‘v€9[wPΆα=hαcΘ7π“[4Y·»ΔΓ&'Ž‚d'ΥΐΔ(θάΠI+Ωyuw8“O:Ϋ`(˜ΘeW†΅΄½lubοηBχDέ6 }ή<ΜL”νފ ŠgιΘ¦‡½W._»¨NͺΛΦσ κEόxΑK/Ά§Φ΅―άL “Ί:Π°dΟ? e TK*ΣCεΒ"v» Σ¦κMΆ$±”έi!’o“cηΨοΘσq&ͺωμπA½d.)0<ΰε6+­ήιΏQζδu-sIΑ(E3k9DΞ„5’Jƒσ iζ΄!Κό)Ν9Xζ,PX—Χσ–•ΐ6Ν;VfŽ€ήVηhИ[§ΩSixbΐ@zδΨ φ"ΆΞυu1δ AΩ$¦| v_‚˜h”Υκf'ž—Δ—υ 5Σπ€εX›w₯α€TYύ Δ‰ŸZ₯‚E­υβJ7§ak€οB`ζΌMοφ|Ϋ{B }Κ1,"펺%ΜΦ7²ίΗ§ΪXλpEκτέƒ Ψ (€ΈΥΣΥ+JŒΛξΓY‚Η`¦Yfέ²K‡€ΧQLΊ š-;‡Έ}z‡qγg@ŸQ€Ω,T)ΰm\:XΆ.-[ήN=!Ι4Ε—\βƐ§Z οΝ…Μ–2BhπC―­9fύΖ̐^s[̍’wΞ‰ΆλR!ι2*Ν!€ιΟΡδΚk ·ˆΟ¬“U+s{ˆ†›”n{U™N d;Γ )zΊ+ՈEH…“m―|ΊgεαΏ ϊΧŸYlMπΊ½]›(¨‹‰qϋz}¦ήF…†έΓjwά^“d‡` *ΧΗ©Ϋθx<ž_9ΧxΡlλoemχΠ"€΄υ4jΣ…ρMτ$p˜ˆ`E0<Ρ€Ωvw%–aΰ•F+T”€y±ΝΓτeΕxE­φΣο­yκεχήTAΚSdΎηΓ\8’ΈΏς Ύ χ?fšΤ»±[Ω ›ξΏΙC@Fι.κ‹ 3λΙςN«η«^Νt  laΤ,œ ƒΚwεM+,ψ (€72">QsLΧ’θΚd4@}Kkr¦2χΣX˜_[·d4ˆ}zξΣ£Χ΅ΐ4ψb0εW%Μ'©FŒ"Β“ Ž ΏΨιθΐ{r1y$:y0>•‹š’ϊtx˜Άγ΄#ͺ?"ο™G ˜έ;Œ]qξ[kk*ΕκΘI@§>9χ²χ y΅Š+Η8pmtώDΣ­Ω«©!1|ΠŸΛtGΪLKΰ ~˜ˆnΝΗ&Oΐjšωζ8pS\hB(λkηΌ±nΌ²―«ξ#σ'α€—©vy*W½šΛW™ΕΘΗ‰†ν/;βΈk4㉱8Œ5-Ο‘ύy‘ΗωRϋΙK=Α)f^°ο•Š·=ΖgήΌΟF`„™&nr‚γέχtyͺYΕ!‘W’oΜ§A…\>—­{‡$] dŸ4&ŠWŸ+5ώ"Hοχ³ι‘ «½μ3ΰ‘ΫXΒ‘/7έι+nY Sž³7N³G#©ΈGšΝΗΖiχr ΝΒ•ž»„ΠA³_°b``ŽΜεWv»7ςBύ›E1E/zιoR9؜D#₯Ό`)`ΊG FΠK4rD™),Έω^/¦€‡€G#wM:φrt$ψ"Δ©PφρdL hάctΎ^”’ π]©T₯ Tθ±μΌ”ςΫ όHζρΔδRΓ$°r¦p+§ DΉ}ΧB°%lΝ…ψ5@RL#Cϋ+ ¦‘ΔγΙι+‰Γς]PΡoeΨGs+¦¬”Is¬‡Q’2!r>ΔαJ’…8ΫΛrfΆΝ~#?Ολ`^‡ρΰ ΩA΄P~²_ ύaΆOŒG“Λ¦“χ˜wS˜¦ΣΛ:Γ{IUhεqEEs%ˆζŠŽF’½’"Ί’#’1/f“ΓρLΓtΥβ4Β Yωbς‘Ypw ͏Dβ#ϊ{ΪŒϋζrΏ|O1ƒ3WW ―2nfXJ‹XrEαƒΚͺ+’3‰W»ΫΓ•όb¦Υα1Ξ·Κδ6ž5%€΅Ύgy ? ϋΟΩFΕηάψšzwξMTόB©›V5(}VH«\3€™ς=š„&ξΟ<ιΔ2J1,6§φMUurΟͺΝ6‰π4ΑΘ?β‡.τΡ ψ1Œ‘zχ5[H‹-š=!8τ²-Έ’H7ž2τ‘q2ΞA̦GσY?y0Φ ©υ£ ™q°xŒ¦Βσ½OeΤμxNχΫθˆ›Q ˆ6~ϊ„$£|b)U€i,B’’SΡάτDίG δΖƒ_γ²`(°β7hpΣƒYΣ.ΎwŸθ|iϋ?2Κ< r~ΪςΚ›ο§ςπ4–ηο|4`ΣSΜ †’وε\…ΐxuί!lψ-„ίξ&ΗόAOnρ„έFgtε@g|$˜.…Zx…Ι†’ f>gj” ΗIΠά¦Ρ™˜–m9CQ‘†ίΜϋ‡ζZk€‘ΌδٌWp—”σ™Γρ HόAΠΏ~9DJGΫ۝nŠ›β™ƒϋ±9>Η^=`³ΡΦ΄βq2Šy³`―3οψ,"ί™σF‡Cq|Gτ΄­‡z=…ΙΥa±aΗ(ξ– h“ΒΗtˆφ~”Ο) yhj0ΕZr9T|¦&I ;Γ~ι̎Q(Ε]ή½,αΗJT^ϊΡΨ}μ°Τ/}B‚’f,“‚σʚ<‡Hyk(,nΓς&΄ΈΐΩ›^ρ±Ιθ° 4ϊαιΒA”ŒPbκeύmMψΉ˜ω!Γr}Μ(ƒP7β³Œή›Og ²L-€‡cθu3―μ-š-kλ•WήΦS—ΉΓJ·>~X8ΞZΦΛΦGN˜ρ, Άσ)d;IΠ‰²ωΛνKyΎ³<_―ΩX<”,…ϋANަτ˜Z’η μ€ΡΜΨc3šή#ε§³>hΥΟ"I9bKΎ—D‡Ύ½η;Μω²2fˆΓπR{΄τ£sΗ‘,ΩAηέgs>εγ—’Λϊ‘t Iπt.ΊΆ|8ޝΞ]u›qj΅Υ-~Μ9ΣOδ(ώΫFΦW·^Έ B/ ŒΉ£:χD?)‡ |ο±T˜Ζp«έ‹JžSP‹χί΅ΚρΤfτ9ήN#βϋ₯Λβυeξ¬_6R:Š’)ŒkΡ‰yΨ+,PmιΈΌˆVΜFΖppxM‘όAŠjZ!ϊ ƒ‚ωφdΖϊ`Šy™zεΟΥαUa.$‰{|!‡ΫΩ7ή&w&6νCΙgžte_·δ2t^#Ne1Χf9ΞχΠ6ξ f-WζƒpμΑ|H!Λ•’tδ3Ιψά₯žΎ―ƒP―:=³ΌTΉ0xμ<ή ­Tuͺj€Fr σ1ΊφΐΓ©υpυβαŠX‘7CγόΜ¨ϋF½tˆOΣ„~ί0φ_ζGFzGt_άί;šοΩμ£'jhΐωάh‹ιyKZύ0Ώ£DΧθ!5ν]ΉLΏ|¦—ŸΕ=/"‘:iŸωhDϋhΊA~―Š»ƒœΔ’»’ΊΌtc½o‚‘ε«ΒF0Ύ.Ic3$<…65l½Δ,° {fΏ°ŽΣ£Y»Χφ0HΘΥ£ώKό―Qxβx19Jhii;5άxxΉ‹…?+²ΓΧGΉ—ζψ+υ`Δy£―³%GC}ΦγQwR5”ρ³E>#–§’ δ~τ¨sI~”ώ6‚ŽKŒΣS|­%:³ΓMŠFΔ,WΠν=:D쬙œtdΗMΦ¨3s„ 4Mf—˜‹=σπΠΜ¦Ά½’›―€³"|οδ©½Δ‘tM‡$"jO{ιĈζΣx n ƒx–Žqgζ1€τhb’ϋ~Φ5ιNep±I9ΦEoαžΧ°okp€”σφ΅OzNγžq˜w6ΌG6 _σ‚†}>CήIΓˆΥ‹.„«"i7sΫKζ=σ‚ε}Χ΅ο;—m'9†Δρp5-AήC?Μ₯'Ή~ ll'ώγΨΠ†ΨΒ γ„_X&³*)‰ύ΅Ρvδ<νbƒν Q=”MQ € ¬ ζΩ† ˜c6->hϋlnϋu¦ΟΚ3c3­ό²FΣ.θo.•Ξ|μ«»ζΧΜ$SVŸtbΓφ²©οz΅Ν΄Ώ₯ΗήΛξ=/nv'9―SΏ˜ivI„₯ώ‰»Ι)±_³m†0ΊK{‹0Œ‰UŽ׏;ƒ1·V’Νσ*=ΑGŽ,mŒ^π,ƒρ§V^³ψ+ρ cH·οϋί$ψ° ΅k™W’,β6Φ”ΘSd±'N ΒχγBς±ζiG±)¨±ξ!ˆηG™¦bΕΒΈΤΫφΎ †!SU˜ŒΡVqEήΉ[ƒ©œήxZΈ!…Ÿνm-³c{46/cZD‡fo…Ϋ©½ ϊ½LB||―νžaΪJ¦ρβΙ‘d₯W΄Ίs<½kΟ[S½Μ§dΤy7“κ|Žφ΄>+YO@θ kKfS―›ΐκ‰b|•ώ»χρ6Œ9ΝΖύdΒϋF£ g‡Πξf ΙΒΦ‡}ΊQD 󒬱ιC}9kD[uζT±ΎΤ&DŽšΉ™Jπ©œ$…’Eˆe8q$³Κnb‘“KE}Ǝhΐηϊ€@“kϋάκ.Q ΧHWΒΞLdΔ!†sδΆ'7p3Ά‡w•ˆΫt$PΣEVNm³ΩdZ^XNMΩ r_"F{ ΔXW@Y™zAg΄ΊišΑŸΙ΄πύώ1™ΪIEݏ4#M:²bνˆ±!Μ~fίPΜΐώ4…γ~0f†ωγ#Π²šΧ" 5x]ν贃φΩp‚sπ•&Dώ0`μw2"žͺs£QvΜ@`<0*ϋ•tα)s‘σށσC:Αc"P3ΓΌ@Ηφ‘CZUO£ΓœP °βΥyA,vΜ0€<΅ƒσ ΪͺbιβηΩ/ωάSٜ©ϋjρ?Μ3ϊ(²†DΗ™ιΒL'=Χ†=ڌγΧ­ΫΡΩp€/δO·EΥ*ˆy֏m΄Ν5rŒE‚ˆΈγ΄Ωi‚ “ŽœχΝ₯φ Hΰ§ΪΆ‚ […€Ÿ°\„Ο&ΟE±ΪΈCί΅VώDN­‘z’ήΎρ^“φ}z’Ε Πd$–ή>ο<ίcΦΟΓ0a±&ΟϊIΝχ“χY39)ϊˆήΣuΉ4M!0―Ζ€VP-#6κpΎElH–<x7H Mς<Ό‘ήψRoΟ―£ΐΟ²žwΆΟ©FφΙ­Hρ ͺ’2ύΌYΌ’UΎζΙέΠ³ψ33Šηf:¨qΡΕ9@Žύη–jΰΧ–­‘0@Ά\Ο)Wφ Ο’Ή=Αω敁ςΝ{¦‹.'gAα1λŽ•VMφ»`J²sG σ3†ΨρD±λa²«αaΞlˆ`7*§CχrŠ!ΘH‰#n Ϋ¬’ 2ρoΪβ…Ή₯ΥςΥaڊR{π;–t½AΞqήw NwδΣ;ŠFQξ7žΞdq% ΓUυD¦ͺο₯ ΈδΜ$vβGηαλbπ[ωΎ%΄oρ¨ο’Ά›ί•@gj0‰ځΕΌHρ.^_>;šΞ™˜ΛGb^‰Άδ’8Eω7xWn\Ό 9Υ,›ΫΦπsΛΦ»ΓΨ\ΫI―}‡3naρα‡Aρ}'Ο7\g΄Noޱ«ΏΗδϋχ£ ΉCτkσ4‚Ÿƒτ‚ύΰ1υ₯ώύ²όή‹NPί|1Ασdη’ΣSQ”xEάγsψ εΦ½§>ιρΫI³Bi†‘L˜OΎΦΥ‹qή‘3Έγ»ŒΩ4Ÿ}F~Q5c²nΈ·Ÿ³Ώϊ£ΕΪ΅ΡΥgΦΖλΦϋρŒλΰ½π΄•ΟW4m9›²Ξ-μΑΉ‚ύƒόoζTΚ/~6ΞšΝ?Z½ΎρšΛΑΑ΅΅ƒξ›“χͺ?oΏΕΏπO ˆ Π_Φ/ϋηͺζ(>χ Η½sΛΖ0:kcψΓ%%οeιŠΙΑ3λkkν΅Νzύf₯ΌΨTΛΝΕNΉ΅Ψ«7[‹Fωύr³΅ΎΎθLkχ½υœΑθ(eˆ “n‡ΦΝ…ƒνΣ9…BzΨ¨γ8Β%CοΤΛήw½άμTλΧKΥζ’½VέZ4ˍ[εό4›•zm}}=ΌA1Ÿ|₯lϊαζβI•‹ΩQ¬&ƒ/‡¬’%ΐ6°>\Ών|n½Έ;šˆΎ˜_ΐ*ΛΏ }ΰ‰M;β‘-?ρ‹Ω^‰­"y§+PHPphpphp3php4php5php7phpsphptphtml embedding.php^(#!.*[^-]php[0-9]?|<\?php)\bIxΪ΅S]Oƒ0-Μm‰ργMcŒΖΐ’υΙωΕ%TΦ…@‰/ώtτ’°Έ%z_NΛ==§χr;Emμ)Ό <ηaF―η¨œΰXλ9·ΐ±N†«Ξ’γ8-Π‡κA€,ήοξxwΏ£Ό[[\?ˆqŸxΎwf#vD™nOHž=θΥΚΧW₯εSβzωšΊzMWi¨ΧΙ5Mυš‡rMKŒ·Δx–Ύ—o·ΔΈ½ #Β’ϊFŒΐ됖ΊŠvΔΈ |GχΈJ/2όhD™4! Fϊ6¨šΕ–;…-‰έc0σμhF"ΧχŒ!=w=7BΤJ ©!qΊ—^{bΤ4Œ/»‡GsΕΒzρΉŠ- IkΦσ”ϑŽzψ&±:+C1hh“€bC8P­#4‹βw2ρι”rιΑΔ·ΗͺWFΑθ«"$Π«"“\?ΙD£1ζΟƒo!e©π²1ΥΖ΄W³ΐΏ*Ivΐ>·lβΓ* ƒW1}’N…ώŒΩ²ŠŒ`Τ`.*UΦ€ͺ­U‹Kτ³άŸ$Dp4η$pρ"|6ό{τ/Ζ9\Ώό Ίξ”υ₯+Ζ†’WsKŒρ%GkΈ4|ŠΜΜeΘCr|x=¦PΗ• !㘾»πΩΠπΚHδ3Γ£…]/eP•Ή‘,ψΊ(!ΫΦ°‰χ!_ΑUEί”IU―<#ΘxvυΏ²Ά·#mIr茞SF½Μ—BA*:ZŠγKέμ?ΰ³k£%φ_©Ω#S* €ήTδί―bδp£w©Œ@+2[c#©ζ€r/5¬ρj2Ÿ>BZŸθολ―Ξ,9IbΑΎ‘,q[ oΡ:΄»ͺΖ½ρ›νAλ¦vη›ψ=(‘Α“Η―ήΓ3ϊ4ΖHό_€[œϋ"ζO βΩ#N K9|_Œ}σ cρ›eΖI§’Š 2‘Š9žcΣ”κφTLυzΖ Χ=wi…Ξ¬‰ΖζGL•ΙΫjϊ?oΔχ*Κ¨=c‘ϋ†κ‰8ϋzΛxίπϊξ4|ϋίσ—œΗΨ’€ι‘ο8“ nxRΜxόΕό~7½/ŽO'ι½—ήqœΉ½B)άώT₯πμ“ α1²©θRιι)_<ρύ±NF” ―( ·θmνλIH—»ΚI&­YΧΞΩΞv ΓΞ8Ϋ$״Պ;‰¨φ8Όgζ73Άϋp°~>¬ι&•œ.—Σ‹ΛAϋΩΑσηφσ|οyNϊy~π<§ύμ8ώ€¦©Z,@ΪHp Q¦ΚDΐ8cfΜ€LDJΒ !:lμŠe{Κ3}³G‡ %v©ξ­δσŽ’D¨τζλ=Zρ(7LΓNωχokZ”2΅%³\Ι(ƒœK^ ½ς΅Ϊγν;Κρή ujj¬ζr½*•…¬ŽQΝίTv²KϋΧν φΫW+™5MlΥWG~±Η@%UΉ•Ξ™f© »O;jh|ΨQrvζW;?h+©RΕΌmN –³7\g±acμΏ»=tδαR₯N› ‡ža£ΎΊΨqzάΗšάW΅_qLψ/KŒ₯€u°#™Μ\›Ϊ9HdZ³2CΏ2K8%N —˜p™1JpL™‘Žv"ƒU$Χ½.S«4f°ς[Μ”ϋ Βα.…Β)”φΔ₯L`Ξ4ζœTP¬˜ΰU‘[Ώˆζ΄&΅%ΣΞ”UΘsδ‹B€+Σ5+½Ί…ΙZ.η 9e+VaίΖ%)ΛY λ‘.ΙnP° žh¦WΈP™k%™"Ω‚: Λ$(•E•ό „žΚQI2K ™σ·ϊM+_Α©—œFKoȈB-±Πό–œ…V3ΝŽ’¨]Ή₯ν <]3§‰W%YžsiH•v€f‰ž‘Ϋn@aͺ„ ΜD©Ν5UX *KNΩUXΤYς₯4`𖉨ΧxΛaI¦ŠΈœ»0,Ήγa'>χ>­ι ¬–dm“’*VΌ^―/­τΛ]1Ί·)d₯·jlΞƒxI-’>œ„AD£I†“Λ،‚Ι―Nv›‰>ό>cΒΠ›υ•?ΕΑ²ΘλŠ²Κωνkδ€SIž~ΉΩθ”f3ˆΦ2ι“ž„@ηvΉLιW½f|`ΌΞOvϋΉί»/vyΧξΚ>Ϊλ\Η₯bλRpάαασ‹ρΟlœ6Ύz1 1άϋ‹σ8šT7GλΉ0 ΐί)τη8'υ$₯Β5 |v%e*>Γ+Μ‘φ«k7αζ―ΓΙ6)?λž,²\Pω§―gεΗώŒxωόql’`<ήήdϊο8R¨F,*pΨ̝ܰ-ϋσε¨ Gί‘Π~vΈστιɝφΙΈΉ]ρθΏ½ΏυιoŸύ›ΫγίoGϋιΰ~WΓΡQ7œκά>`ΑƒλŸ½E όŸΈΑΏ·ΣϊPerlplpcpmpmcpodt source.perlr(?xi: ^\#! .* \bperl\b | # shebang ^\# \s* -\*- [^*]* perl [^*]* -\*- # editorconfig ) break\b(?!::)builtin_functions\b(?x: abs|accept|alarm|atan2|bind|binmode|bless|chdir|chmod| chomp|chop|chown|chr|chroot|close|closedir|connect|cos|crypt| dbmclose|dbmopen|defined|delete|each|endgrent|endhostent| endnetent|endprotoent|endpwent|endservent|eof|eval|evalbytes|exec| exists|exp|fc|fcntl|fileno|flock|fork|formline|getc| getgrent|getgrgid|getgrnam|gethostbyaddr|gethostbyname|gethostent| getlogin|getnetbyaddr|getnetbyname|getnetent|getpeername|getpgrp| getppid|getpriority|getprotobyname|getprotobynumber|getprotoent| getpwent|getpwnam|getpwuid|getservbyname|getservbyport|getservent| getsockname|getsockopt|glob|gmtime|grep|hex|index|int|ioctl|join| keys|kill|lc|lcfirst|length|link|listen|localtime|lock|log| lstat|map|mkdir|msgctl|msgget|msgrcv|msgsnd|oct|open|opendir|ord| pack|pipe|pop|pos|print|printf|prototype|push|quotemeta| rand|read|readdir|readline|readlink|readpipe|recv|ref|rename| reset|reverse|rewinddir|rindex|rmdir|say|scalar|seek|seekdir|select| semctl|semget|semop|send|setgrent|sethostent|setnetent|setpgrp| setpriority|setprotoent|setpwent|setservent|setsockopt|shift|shmctl| shmget|shmread|shmwrite|shutdown|sin|sleep|socket|socketpair|sort| splice|split|sprintf|sqrt|srand|stat|study|substr|symlink|syscall| sysopen|sysread|sysseek|system|syswrite|tell|telldir|tie|tied|time| times|truncate|uc|ucfirst|umask|undef|unlink|unpack|unshift|untie| utime|values|vec|wait|waitpid|wantarray|warn|write ){{break}}builtin_variables5(?x: [_0abF]|ACCUMULATOR|ARG[CV]?|BASETIME|CHILD_ERROR|COMPILING|DEBUGGING| EFFECTIVE_GROUP_ID|EFFECTIVE_USER_ID|EGID|ENV|ERRNO|EUID|EVAL_ERROR| EXCEPTIONS_BEING_CAUGHT|EXECUTABLE_NAME|EXTENDED_OS_ERROR|FORMAT_FORMFEED| FORMAT_LINE_BREAK_CHARACTERS|FORMAT_LINES_LEFT|FORMAT_LINES_PER_PAGE| FORMAT_NAME|FORMAT_PAGE_NUMBER|FORMAT_TOP_NAME|GID|INPLACE_EDIT| INPUT_LINE_NUMBER|INPUT_RECORD_SEPARATOR|INC|ISA|LAST_MATCH_END| LAST_MATCH_START|LAST_PAREN_MATCH|LAST_REGEXP_CODE_RESULT| LAST_SUBMATCH_RESULT|LIST_SEPARATOR|MATCH|NR|OFS|OLD_PERL_VERSION|ORS| OS_ERROR|OSNAME|OUTPUT_AUTOFLUSH|OUTPUT_FIELD_SEPARATOR| OUTPUT_RECORD_SEPARATOR|PERL_VERSION|PERLDB|PID|POSTMATCH|PREMATCH| PROCESS_ID|PROGRAM_NAME|REAL_GROUP_ID|REAL_USER_ID|RS|SIG| SUBSCRIPT_SEPARATOR|SUBSEP|SYSTEM_FD_MAX|UID|WARNING ){{break}} identifier\b[_[:alpha:]]\w*\bno_escape_behind(?] regexp_flags[msixpodualngcer]+\breserved_words|\b(?x: # control keywords default|else|elsif|given|if|unless|when|break|caller|continue|die| do|dump|exit|goto|last|next|redo|return|wait|for|foreach|until|while| # declaration keywords package|require|use|no|sub|format|{{storage_keywords}}| # word operators {{operator_keywords}}| # quoted like functions (are handled like keywords) {{quoted_like_keywords}} )\bstorage_keywordslocal|my|our|stateθ&xΪν=‰bΗu„('±r|Ι'$J"@d;qLρ0DBmŠdRQ@τX’,Έ ˆ€΅rΫ΄IΟ€χ‘6iΪ€MΟτΎΫ΄iΣ6ΝωM}3»³;3;³@ŠJHΛ`vήΌcήΌyσζΨ XOΨιZ«U­ΩT[L£ήRWϏ°Ο ΛΆ΅ZFmVΤZM­Ή0‰π0Μ;}!Œƒh0ƒιh WΠαYr`ήζUσώπ0―˜„‡ω0y0<ΜGΜ±π0―˜‡ΒΓ|”ΐ|0<Μζa;}Q ³¦ιM₯Σ©·Φ]E}$ ”£@Fr΄α±(PŽ>εhΔγQ ψP(G+žˆεθΕ“vϊœjSέέΦtΚͺ<Ε‘ιq‹>Ν΅”U΄ήlkzΗp‹=γ[Μiοvz’-Φκ¨z[k(΅–QZλ 5ΣRmŸŠFΨΦΪ.Ι)9TEWͺͺαΑG:ΜK BbOϋƒmͺ/Κƒeγΐ2H I9ΰΊΪRυz•…KK§­θjΛKκΙ`ιؐ ΒSBkΤ¨˜4ό§9"Ιiα˜D$Ν}†S3!ƒζ¬P4„°‘‡}E nί”°ƒaΣ¦}… iΥ_!ˆt”f,ˆ¦RoΉe^6`SΩ­¨¨Ί™Qͺ \Κ”dB8F%+€ΫΠΥuu§£YέpQœ αΰ8/lξ­¨―ΥAέΧΊ­j§΅2U₯Ρp]ˆζ`{EΨβ.XKiͺF”ΕτͺΠlu5ΤυM5£θλΠ|0z¨:Υ<―EƒsHόp48gμώH48gτ~λ©8£[1:υN Υeς£1€N߈μ°;&Tf˜SΝ‹!ςΖ…Ίlttpl!SΡj».Š αXΚBάVτΊRiP 6ι‡gCΥ՚VΝTιŽ<ΒαεM‘ήs&ΥΓr‘A,—„-rKΉ­U½ήξΈΈ¦#:gΒyΛ U6ΔΑr9ŒΌ-JxWΒB88†Ψ‘h6,„ƒγ-‘Ρ΄!μž ψίφSk¬γk§^έt‘ζ„2 UΣΊLWΈΖ¨# ]˜yq{v+°tz½ν ·μΊ ² V7†e[IuΌE;}Κ(*ύ1;}LPΊCY¦%a³Cad\χ±½;%SψU쐧Λvϊ~η©ΡQτyΌΒWZuΣ O―ΫιΓΜSΫ―!…>n§‹ aΛHJή°S ήyώ ;}”{Ξ!ό€>!.Ζ ,r8"eJvϊW¦i€H™kBzςG£»Ι‘& ²«vϊ΄ ,5¬βοp:'ž΅’Š~HPڞ­’’;}Π)ΪiΉΝRυ0eΘΤkP'ς˜tRΆΖ)ƒ[Ά₯«¬;RWντΈ§d« ’τkœVΈ΅Ξ†‹y]Zίm¨ z )ΈΑi‘Ϊ0°‘#Ολ\Q΅ύψ§-ΰΛκΰ-‡βMŽͺH¦’»³ΑI‹.ˆZΜ%ΊιS’ν-εΨΫXΧωΧu­ΫvΈhsίzΚaΫβθb 1ϊ«sΝX…¬Υa*ΫΨ₯Εkp·#δqΗN‰χ&l€.ΧmΔ Rϊ67–Κ#b›λΕ’)ΎΓl~‘ ³λΗ3=£%οr*ΐ°zuΗNŸ₯fΎ€Όι' fΪK ξϊ ȝσ’βοq½Σ6VŽό˜’ wC©¨ ςπΗΉΎ‰fΊev~‚3f’ΰ)ϋ){‚"€ΰOΪι“\A‘ΖόΧeΌARςӜθ$ΑRό3ΦD*ςΣvϊW–ΥŽŸαI!EV"‘NόœD^uψy;% !΄kσ \σx"€ΰg9tή8)ω9n,ΤΪ@WGs£_δΜΔ6)νϊ%NνΗ΅επώΛΥ€ˆr …3˜€ 7œύͺ>ζ#(;ΦόΧβT9ŠΊ_ηTNI!ΕƒSA…ύMiQΗΓ%E‹3J‚’Ψu&ε?Ο΅)ο tΏΝ5 5Ϋ'E~‡'<ᇡ†²ξPψ;}AVšΆrθ‹Ά8 »ςΏTގας_ "ŠŽ  ίγΤΡ!ŸΣ3¦ ΪQHΉ/ϋP-"ΰ+vJ€ψ?‹υŒ τ"fŽ π²κ[Φ μ²f§dϋ˜ςθλΌj3RκίωςF„HΡΰυD "ί°ΣcλAύ'η/ ”Υϊ/;ύυ˜¦θ›½dό· z|όŽ―n+`X_;}Rΰ1“ίς)μڏ³š€cbΎΝ5™SΘ;…ύ‡ά)Ϊ:⽑Βίε:€$΄FŠΟNŸχ/ΐώ};ύαd²v0& δ5Θ`MςP`*kE@ '¬·p!» ή¬D6,1Υ—ZlV‚γ£e¨fλM 05?Hγ ͺ{s·TIpγ;j‘Ξn©EΆ£¬g!ΒdΥ}ΔSC©£ƒ[Γ‡u+R“Ερœ, aMΛ„K*©ΝψΝXG©~H,C‚.ψ>š©8$‘±Ε₯ιlšˆ?Qο§ςH _υš¨'’RSc· Σ˜.…§ΓPx+@hRyd–iˆθ;&# ψυ•—δ CΤEκYͺΐ QΉΒŸ€‡©Ό9.!iPLN3*I;Aͺu”JIp‚ˆ€h’Ž;ΈT)–Ϊwζξ–KΫ#.qd €ήΊ Ζ»–­7κΊΘBŸGžšZ…‘™κΧ ŽͺϊϋΗ[ CλκU«7“8ΈΓfBΤRSZΣ»ηωcκ:αΦ%¬NR©ƒ8>u§ƒΫεΐSΎW’xš–Ά~χM#>Ν*ΰ­ϋHNπ€ƒ½oˆη:>²΄}§ΐ“DSΡ7»νlEkX8hw‰7XοHx?ΞΦ…η$±+{‘·ψΥ pήΑ”κYΥ¨*νψ5?Ξ’Yο€ΡFν/@δ&Z³1\;AΛ"Ο^#γ@ͺŸe©ξΆjPrxαc3r­tνQ)!Άφ^ρjAlή>ΔςΆ‘*5"Ζ%jΎΊ[’|…k"ι"ιθ˜•‡—ί³0υ―ίk[)5ο eF3rs €Cr Β hΧΦ5ΔΧτlΧP₯Σ ΎΦ―JŒ¨·Φ–ΉR‘ζ1žίcŽ+ž~σΜΩ‘ςΠTzͺ4Ι Ž―Ύ+A{Gf›/φL_ΪVΜΕAͺ4ιΨΰΔެ^°σu‘ΩM…%Ί–φ*ŽP8ƒKκΒF•eά&Όλί„Ϋ!›‘‘΅β·_-xwZpΘ§m†}0H’q°μί€»!πqΎΡΚκ~5ayšπL@b–}1¬4χΚ’%θΡ*!ζ…ϋΔ’υͺψiΕΏΗrY υϋ₯φι{oΉl†}*H’ θxUώΒ§$ˆ~fŸz—Œκ8*Γπ’ ·*€(χeάv‰Ž1˜Ζγ/Ό ΖΟΟ„δ>Ÿ.Ω±΅ήxܟQΝaρBϊ]t΅]~.NΪ«ΡΕ%:†ΙΗ_  Ι‘M{ΛŽLo–Je4€Crη•»&N_»›ž:—fκΝ΄?7 !ζŸ%ωuž€…Lν£σΜ“ψw΅”TιjύEΫκ/uwχ†:LQΩνYkσ‘8ϊΊ£γ'±>”Jiη;VˆWο¦Sη©bΣ¨οΐz+,··Φ«ͺ^…Pι”Η@$Έ4²G:ΰυ‘œˆ&Y½Κβύq4_αΒΜ]ύΙo@`›4œση²21ζΤΤΙ±±4©‚Y8gφH0«φdK€S$ΫDQn_Πε²x§T,wζΟΚ:s)dg~„΅¨ O?a€ςŒL*%c$3™ζΧSΝύ >ε·%4Ÿ$_‹ΜΛ ¨…Sό2B Z8°{8$f™δ!Ο :”eD Μhm}ΚT΅†ˆqό-‰$ Ώq2‚*7?!,fl/”|”γ"Ύ‡~Έ€2Nb»zqιΓKΖG\+½{_<}„τΈ” 9.•^ ^Xek¦k¬\Rϋa|L^ 7„χAG>κ΄€Ÿγδ© ς Ž…ζΨ±Βف|δ³7ΊΟξΉ#•ά,e-_'5Υ;vlΤ)LaύΎYo‘₯YkΧ=οξ‘­†₯μΧ^ΎλΡLwoxυnΐΞΎvFΨ ­kεYΌ#σΦυޝW…Έήη<Ώπς+½"{Ψ1oή,§‹γζδHy4N ^yIšΌ¦Υ[uk\ *Γη›\Ÿ =Εx~ͺ˜*‚oŽ`­μ΄κp0₯-X?'ƒωΛ[±οq5‡wyΓ:Ϋί‘δςΏ„¨« :Ι‘ιBΑξ*β^*­ζ fόcjŠZΥq†’«ΛΧζβ‘τ$OUUΤΊžfhz+w=W˜^š]\ŽGΩsɌͺ*j]¬f>6Χ'ΝrkꍒΧϊEΡ ™^ jΞ~:+Λπ‘Ιπγ c² 2λvΦίΊΩ€τ΄#ˆνη„l“ΓGώ‘?ηομ ηa9‚σH–Lύ>; †d0Ώ ι䎽g[Έ8!E6ΐ!Yφ+,ξηwΒLd­ύ­7-% 1 DrΧofΗ"q Ι`„ϋΕ‡θΐύ@ήB 7ίGΒhO0κ"?νς ΐΖoژήˆ­Ϋ7’.Fmΰ£ύδ^ΨΖ—XŽOJς7CX!όGd]υ¨Aήλ.U_Λ$œώHΒžk•Ρπ4»o[χ=mξΙ­v;₯Κ`Ώ…;ΣΛ7ώͺD)*’|%l[=θ°‰{QΪ(α§'»ΪταχοTŠDŸς‘‰‰U’H^κR:5ΌyB"%η|T˜}Ώ‡¬9‰ψ‘!ΙΣ=‘\Υjκή‘ό¨˜δ|(’Ÿ—lπΪCA?&¦z6ΥΟI¨¦’ν ΡΗΕD_Eτ ’Χκ Ψ3²“=Χ“R;‡ήφ„δ‰I.„"ω”„δ–ΦRΡ}rκ&™ήο νOˆiΏŠφgeͺέͺ©;{Gσ“a‡΅½sAžς£αΙπ³!Ι_“δ«’όuIώ‡• 1Γ©ΈWΩ²k6Ύ.<3!q¬BΠ,??cΞδ–sζεΩΉΌ97;Ÿ7sΣoηδΝΒΚ₯τκͺ‹ϋ)·³:Κ‘ΝArKW›θcaeΩ,,Οδ—–P2;>QΖ?α{Ϊ{ƒ`) έ†ͺ5ΤΆ™ \Hψ,5Uί;–L¦N₯“©d13ZžJ•(§”MK΅Υς(ΚHͺψ™‘žJ&Νdr(™½Tό‘ΑŸ£ύQ ¨&»Rξ‰Έ Pλ\ν«ή tΕԟ ώa` 6¨•  CY@iψ$s,έsΐ6ρ€Δ2₯όνŒ]‘kjΧθΙεZCƒEθšZ­7•³ κ?ι'±6ςhlHžνhΡΪAΉΎκ«D_‡cλ+€?ΤΧήτ΅Ζ뫏v&‘.”*ώ  WCCh)Sy,M`Kαμ*‚TνgΎ™-§Σt&ΡτT[U«v’0N'³Ω$ΉŽ-’Ϊ§c¨V “¬)GbCΊZBάcR·iψέϋˆ3ΈG=ψŒLΜhαb]Υ}ϋpάώδHj˜“Τplέ•€Ž»ήζωbεR9]<χ ιŽ,žͺJ½₯θ»ώ›œFό©#URUI(άΉ–6 ΣAn¨; ӝedž G&_ŸKλ#­ ΙΜλ ‘CA„jΥN‰ιp$Ί5ΉΔs'GΆ•Œ₯y!gJΎ§A&Ό§AΈ9Ω¦ΊΛcvkΜe>ΉZFŸη3o`NπΡο½+₯ΜΜ€»ύ2Φ€™U’υψΤν)kTv‡gχ›+Νd΄―]χ·"1bΊŽήΗ”^F#?‰9ρhνBˆΣU`΄Λ)XΆύΰΊ$’όΆ$Ώ9 ώσ[◝—ό$s>8’ΐ|]’;’ό—δ˜$Ώ*Ι IώoIςeG΄~Q’Ώ’ό’Œd:ur«ΐ_{ΐ¦°+―T δjwL₯‘θMS›πŠ C] }4aYΒD7fu£VΧα²L¬nhΝ6όΤπΗv >ΡS]Σ:f΅‘ͺυ‰a΄V ΌdH‘}P|­΄ŠΑπ›[&Ά"j †ΪQMU©n˜ΰ¬λ$D_64£ƒΎ,όj©;ωΰωΎm1Tύ6ώͺ­™κm₯?*»Υ0Υ΅Š+Ω©τ³mUα_«Σ0qœ]3ΧΠκ‘Ή¦ιψ£‰.p3ΧΥƒΤ" Y―Χ¬/ΒD_‘•]₯VΣέ_(ΊI~Ω ΐ―†ŽΚN\όƒΨ<Β·Άͺκ$·½·ν:Ϊm }[―k:R­ο ·ςί·μdΈdXΓ_lΪΫ]«V$C·"λzUωεVb€Έœrπ]ƒ&^ohs½Ω©£l]m›ΰ–˜8B Ÿ³.@ΓΌ₯  N s³ήh˜*ό[«λFΗ„¦Xοl˜h>μLh₯«Δ-2DΠ Η:fSi›ΝM€oMcU Πƒ½z%θ4 5±Ί‘TXΣ±:£w˜νz[5Ϋ ΡmΠT*Π‰?ΧL,΅Ξ.zά56Lμv#ׁκ―4uU±>P(ΕJcΩΔ_pνΊ ΄θκό%†ΰUΘΤU4v’Ϋ %\‹%-½‰~Κ λmΠEMCU7ρΞ‡ήRΕν`¨MΔ5$ˆkH€x„[c W G» W£ J“ JS ’&†Ϋπ†ΫΖF} }bτ¨š ‹‚& €ΫP₯ _Ί²0[1† :ͺ@EqV?HΑP%mX₯HΰΉέ Ζ<4°Όq“n HEοάΘέ&΅±‹δdQ²kΰΆ†Τ"eΧ°„· Rh’Δ’¬£Byτ$Ϊ©«θš‰υ jA©avtp>(ά­Β?KC»MΕΨ4Ρ%kπ‰±w[X“Ί-K*έͺ*ιβΪΐu‘Ϋ`Ά` } >Ό ~˜’λΠΖۊή21UǏl“υ£ΫFέ”Ϊ'‰|IΩ1lvΞΣb·8"%d1Α{x<)apΘ7d₯BC―rλa7V:Μ†3 Iά­XρωνΓy %ά8|‡ΊbB*Οί‘Pގ;7·_Cτ˜ŸΝΨο`Λ‚§Ρ΅FΦz'_Φ†ςκ ςώ€‘λa‡Œα!α%˜›A P=γΣ¦tή― ς~…!σƒ™-§ςE*ι›FEDžθ‘‘zΝΈ§_ι³1*υ‹eρ‡P©Ξ(³vΟE'αN _ΟΗ¨4μJΥΓΦ Ρ)(²υbŒJγnb•1φRCιw ”θ0d ?ΞaΆβΝvΙ(₯Kεέ€{Π³OژŒ.αT`³ŒQim΄―NΑΦ)? #π…±~©ι…₯<ΎIΕ‡ΘDy(iΫΌ$ya'šΔͺkJ·ΣΜxξπQ_3Χλΰ›uμ’iσφό„ρGΩ4‘€βιp§ήκΒΜΧr kšYλΒ\&€0mŸΫl(ΰ\ΆΤ4+€§ΊΪι"―yŒ0EγΩ1r.€&­&¦"a ΡTΪοU4ναΜ„1Ε„Y.ψΝ¦uΊΫšW™Ν]SλκΨ΅Ά+D58«Z¨*δz;πΏ“yDυ–ΉŽ¦„fΝΨ€j¨ΊcξXπΦςD½/I|@#™‚ζKZ»<μg„X΄pΦ4·Μ-ψ§›[Ϋζ֎‰\osyΓΑ;£ξξιΓ΅6LgΑ{`Ό²Kσ£'Q4€ˆvΉ ‰dΦ=OΔϊ…Σbk_[J2CZΓQXˆ…Ϊ QάZwqi3τL€. ΖGiŒυ5εpH”υ΅xHqOε‘ž FΑιzV^.‡B ŒΖαc6ΛΕ‘«O}Ε‹£>.^KbσΦ±†ΰήvCΔͺeΕylI?lHt»θμΡ‚GxΚ‘ ₯;Kq‰Ηφ‚6(―7Τ<σŒη}ρhρa'4"ˆi:a „ ΔC…<…H¨@ƒ>C›#λΧQ6ξ Šτο\LΛ#£φ•Gή©@β“ Ίΰy uIώ-Ύ‹ϊΖDΐ»-ˆuΘ`_=Jl”x9ΞΝ“ΡP\τ³‘Τ½ρ8|―‹$Iϊ|Qίή9Ώτρ κ»ΖZ­Ρ.TΗϊζς₯kΉι²;ΧΰƒΪ$Κ…ο‘€ˆK$δΔ<OΎ7Q~OΆ"ε  N†D@Žc›““²h9Ug»mAά*3>1iNL˜''ΜΙ s|Β,ŽO–e‹Ύ*Υ`Κfh­X •gKgΝόgž;gΗNN•Da¨ͺˆ΅ ;RΆ2£#ηΞ”'Μ‰@ζΓ¨―·’ͺ#Ή….“1K£₯Ρ`,0yή€aΕΎ_JŠ…=Nε¬ΫŒΰχ Ά€«Ύ!“(ωYσζ{ε½PBβ”²ξάθ9YύPYT»s½’Ϋ/I+WΧT=ͺsɟ˜ ΄0”W•H*E\ΓRe'h9°Η–~έΑ“€Π!tΠj^/έ—N„s‘RΕ^ιΰΟΈ₯S›¨Ψύ]όžj)…‹­K4ΑΏ,Θσέ•Μ‡½°W)@6ΰΏQ4θ₯w"ωΙNώ¦$[}ΔύAάKtσƒθςԘϋ#=՟ !ήΗΙΏ_Χ„:ΝϋκNEχο6—𐼬b\ŽΟΆσpΈvξΗu‡νΌνLf(Αmό#r­ΐ‘~™Ν€ΈTZH‘ηmΤΔχH4Lι0Qs {~K„Gx§pf’wΞ„[¬aέIΫφw .0ϋυWΑΫ΄ψ ΡT¨W©ξι†s™L^«a=r·Χ/Š•V_ Ν`’0ˆίہ^ΐͺ̝0@τfύ#Ρ”`°'ΡέJτZ :οσͺπ―Hξυk²[4Œ}RΥ}:ω!1~<ΧΏ/Ι ]ΑiǘΑ *ή0噍ωŸρwυ‰‰^Iγe™βE}Ώv—­ƒμHςί•δί–δΏ'Ι7%ωυ΄~Z’Σ’όŸ”δΌ$gcΠΚΜΙφjύ΅!–Ύ/ΗXŒ§ί»4>"FΣη•ΒΧb4'Σ›ΊΆaπ,ΩZH_ΣΖ>ϊ/ΏˆΖ¨RyΎ«/oΠ¬JGYܐ΅ΘΨ@Œ‹Yτt·Am·vΚΡ,΅Lb_δ}‘‘ΓέzΏ΅=΅wH—Aκϊέ)¨τ΄εpK©R±tgΌ`Hό_δ}i@Τ#š€=’O/ŸΎθbΨ45Z‰ρ'žu‚§Ψκq΄υψb ΚΡYGlbejΣ³Ίώή@γΞKύ$ωΜνr’ϋ -ϊͺ Qτχ"­1m]mλšν{nAθ(›ι’Ίμ/¦ο–ΉM¨Ύ―ζr_žΨΛKΤƒ=iYΜQWzΓθe¦ΐΥPΩ$οΙ ?έ–‡adοΎψIώΏJςM’'’ό―ω4ͺπ}Γψ$WSρœOs_K-οΠ/Ÿ—uΗ?δύ© οΟΒκι^@αD:ςΪ²Με˜Σ·Ξ‚g“ύg½†4e­NŽ;½Γ£φΌ{0ύŒt?FΟ&eΝπ>Ϊ3FυIœy|½%ŒΓ§Πώ[>gΕΈθΊ‘’ΓdUξοyα§ύΜΛT_LU QŠbjz‡=€―Έ'G%­Κμ―Coυ‘‰ξιΝD|$-)0˜4Βͺ½©§4Β‹ξdcκ_ ςώŠμ ±―._›;p‚< ȍN³±W’όλ@IΎ$–δ[ΉλΉΒτμβς“ηKςΌ΅gzω·qυς­ΒΒό}§—· Ιjk$ωw’”XΚΒΗ^OΨΪ³ώύqεxγΚ 9ξ읝ό§hvrΛΠsžψ@‰σT€8Ϋ ₯Ύgόz’θ©)±D˜†ήS‘ώŸHƒfž™ uz9qj³’ΦjͺƒΝΩ¦g$8ΑK¬Τ½PeΗ #…<•—΄Ώ?"’Βe‰™€γšžπΐ@΄@OΤξ‘Ψξ0Z Gφ^ŒāŽ£W¨Ό9ϋϋΓ"Έ*i§h‹ΎΣΌ7ΨιΑžΟRyΛφχ " Ό%©ΤssΞ%AΜνδΈ91‰₯²#S“ιΈˆ₯qέ·Βε,NΌ›ˆ sΡ‰8Υw"E'bΈοDΜϋΑ覻”nt=―ΈήΩΛ,XςWΟΡ§MΒ-|— οΏyΓπα\XΤN₯.ε―ΜΞ›ΣWσΣo›θ}ί³σ³Λζ |ΰ¬4΅ζ4tΗ]rrd" Ν―Š_spβν~ΪDΈ’€5E–Ω?‘·)ω16uυd©Χr½ji…mn‘fώΰ ΪފjqpύO5ͺ^₯½¨νμY qΣΎΆˆ€΄/ύ ­y  ΊgΛ£θλΕt9Ν.[‹zΗ’ Oτˆ_“‘ϋŸ>δ2 ~_vnb™(Ž]Lα~2†nG=μπςΐxό€ο‰ Ζ” ±,A‚s$˜4‘χBό{―ͺωΌΣΫSΉ•ε…Ή…άŒ9“/,/-|"-»Zh~‘κU@ xmΔE0”Θξτgν]Œ_rzΫΙΓΎu€ϊ–d@9αΫΜαΟΡ›–RΑ›–>ΕχάΝςFΩ0½$“Ζ7cHƒiΓΓ·„^ΥzxUλαU­‡W΅ώ¨½%T6ueορhˆ§ N¬ΑŠ2˜r8—>υΜόΚζψ8LͺNΖΊŠ$]ΪNχιΥ£αψγΖΖD„ιw/{x‰πΈ'[‹οœ.σ‹΅Τ-»φ=ϋh8žφ› ‰ΧεΜ«LpŸeΈx†&ŸΖ…ΐSf΄l/dή(¦ωsξώΤg¬wˆξ3“ƒΌΰm'¨Έz^©\.›Ήιι•k+sΉε…%3·t₯8}½ζ―›PΥό‚™_A?―ηζμͺQ57¦σ‹Λ³ σ…ΥKy¨zu:·rεκ²™Ώ‘Ÿ^YΞ]šΛ―Ξη€’όe˜ΝεgV 6πε…₯kΉεU”\ΞηgPev›_½΄”Ο½½:}5·”›^Ξ/Lκaau.y™ΝYŠsWςT=±ύ=Z_Ήv)ο`^^X΄Š &gηηrΣωΥό L7‘ ψ½bSbCY9KyΙΜ¬ς‹@ώμό΄9[Θ™sΉΒς*T;}uM[‘ *§°œ[ZΆŠ\~ήΚΆ2–ςWς7W§fςπ½°2·μV.Yπvώά,ΚtP[•Μ/™ — ζ48Θ`nυ: ΪΓ\™AEŽΌ ˜Ω…•eΔšΗ_ž[)\%—gσs4_Τzβa™Aƒ~Μ\2A†‹ …e‹¦Ε₯ΌυjY\Z˜Ξ Hΰλ•₯ά5KκΠΎsξα_Dν€ςΒ,ΦR€΅»’Bςς‹fα…εό΅ΥΛ3 Μ&̏η–ζAy‚OI{ϊ>wλΟ8ΣOλΆe«w— {S7—ns™O–§’&ώY<•{ωb©όήΤΙs₯’™JO–Ι#dΰ€Udέή ‡[Z²dIlΙΠuΕ¨0•ΆΛιcO<Η(ˍ₯2qΰH<α%cπ <ΕΦE«ΘΉΓ>Σ=K§ΣΕ‘‘R±ŒΝ7KΫw0#žwy%]SΡΝΧ 9ž΄΄0B?kέ°κš]&pΚ`–ξ’γWԜc5•½Λ¨Œ„δΫ»m—Sb<©T8—κ„jGΕ-ΰ8ŽGξ½0QιAFθΌozίΔΓGό"vQg)mγbϊΌωKʟΤιΧ8Ξε*K—7–ξΖΦαRFk@όu>ΚΚ§$Μƒ';6rΠ\ϋD¨τ~§+!³»Ÿ#\8ϊόΪ™>ϋζι3ά9eQ½ ΘϋΎΎ‡θŒ€g΄ύa»YIΦ&Ÿχ1Ώχ|~ΔλUΘΉΆKηα|ϊp>}8ŸΎζΣnΧύ‘3»"Έ§σb—Œ8χŒDj~λ—Έ2‡SΨΎLa]!?"²γ€Yͺl§‰οŒTvbβ¬Ο›φPythonpypy3pywpyipyxpyx.inpxdpxd.inpxipxi.inrpycpy SConstruct Sconstruct sconstruct SConscriptgypgypi Snakefilevpywscriptbazelbzl source.python^#!\s*/.*\bpython(\d(\.\d)?)?\b digits(?:\d+(?:_\d+)*)exponent(?:[eE][-+]?{{digits}}) format_specN(?x: (?:.? [<>=^])? # fill align [ +-]? # sign \#? # alternate form # technically, octal and hexadecimal integers are also supported as 'width', but rarely used \d* # width ,? # thousands separator (?:\.\d+)? # precision [bcdeEfFgGnosxX%]? # type ) identifier(\b[[:alpha:]_]{{identifier_continue}}*\bidentifier_constant6\b(?:[\p{Lu}_][\p{Lu}_\d]*)?[\p{Lu}]{2,}[\p{Lu}_\d]*\bidentifier_continue [[:alnum:]_] illegal_namesœ(?:and|as|assert|break|class|continue|def|del|elif|else|except|finally|for|from|global|if|import|in|is|lambda|not|or|pass|raise|return|try|while|with|yield)path)({{identifier}}[ ]*\.[ ]*)*{{identifier}}simple_expressionζ(?x: \s+ # whitespace | [urfb]*"(?:\\.|[^"])*" # strings | [urfb]*'(?:\\.|[^'])*' # ^ | [\d.ej]+ # numerics | [+*/%@-] | // | and | or # operators | {{path}} # a path )* sql_indicator>\s*(?:SELECT|INSERT|UPDATE|DELETE|CREATE|REPLACE|ALTER|WITH)\b strftime_spec1(?:%(?:[aAwdbBGmyYHIpMSfzZjuUVWcxX%]|-[dmHIMSj]))]/xΪν}{`GyψIΆ¬$δ δ9Λ±u+ωΞqDdΕIbpΧvˆξ¬ξέ­€O»—έ;KŠΗτύ~Ώhϋ+₯τϊ’τAKi …Ύ€>)}BΣBZθ ZΪ~φ›ΩΩΩΩ™ΩΩ“ΞV¬\b­΄7ίΜ|ωζ›ο›ωζKΡηΖψΉΧφ|oΑ^μ9AΥYλNΊπβŽ™Rϊ“Sώ-?bVώNZ~TZΎΩρ[gͺaΟξ9+ŽΧ “ώμ0+Οϊ³Σ¬<λΟ.³ςwΡς—™•5-ΉYωΧΠς/1+ZZ~wόΌ:UΎΥ±ΓΠαΘ8¦-Ζ¨w…Ά#Ϊ•ΪbŒVWi‹1½4~^“.ζ―’@«™H•k;-?°{~P]μ{­[΅ew:ΥΥΐξv Ώf pFškg$».~ή€ΟtχzCΦΑ„–ސ/‹Ÿ―L—tIνΐuΒͺν΅«‘ΓSεςκύVΨ \o‰+ωŠΌ’¬Λ7ζ•dδ»I  -Ωλ9νͺg―8Iσ7K±KtQΥυͺvu)πϋέθ–ψ9žZ¬F©N·c·Θ؃߁0 δ­E!φ―, Ι¨ρ*‘m5dΟΫΜaXΛζ0¬o{€r»θ+v―‡‘Βu―g―%7`½Ϊ+΄ΠρΝ=];©€ί8ΑΌ]*9jc_ ΦΕύ€ε& 1[Ρ#!C΅ΧοvΈabdΈMdψM cM ˜tς€1λ^Υ„u¬f ΒΘ~Π„MswI„CϊPNA†κ9‚w 3mT¨@έWKMw₯λ½κbΰ―Šφ5ι=*ΟUϋZm1†ΜέΪb •Χi‹1ώΌ^[ŒρdZ:Ή^Ηυœ*¨ ‹7H΅”λ…nΫ©²©s=ΈΗ€@Tξ@ΰ΄`_―ž΅;}Ž ‡‹@±Άf‹@1Ϊί« JMŠG€Σ΅ ΦkΥn΅`NŠή—[”υϊώά’¬«H©ΖY_υƒvΥ–ϊ‚q9gΐ:σ  c―4ΫΆT—½Ρ€΅π‹fΛχ`jμΫ½ΤΪν¨`€q²₯Υ›ŒŠ³ξΌYͺmVόΆ»θ¦=?―LLλŽ‡₯“ΘΣ}»ƒk‹LΊjμT;޽˜>RuΡψωr `ΜqΑ8‰JΗvΟΣ}›mΏίμ8U²6K Ώ’($λα ΑΎΙ‡dž, ΚZ=U” ²Η ƒ2ύόxaP¦³Ÿ( ΚΧo) ΚΦΩo- z7}²0θλ(θ|QabΌ©…d¬i…dœ9]’1f‘($γΛW…dl±‹B24‹BΎžBΆβη­Ή‰Bi›Γ°AνΔΟWΐ°† ±–– 1α\.Δδ-ΔDς©@LΟb‚Ψ1g£ΓŠ9 #ƒgΓ¨ΰ›Γ0"tΝa ž6‡aΓ00‡a04‡aC―g0hCψ=;£χ‹B²ΑqΦ@σ§!Y£«…AY«k…A™@erωLaP&žη ƒ2)E…A™°ž/ Κdφm…A™θ~UQabΌω꒐Œ5_S’qζk‹B2Ζ|]QHΖ—―/ ΙΨς E!WΎ±($S+ίd Š"ΘD‘|³9 Τίb0'QΦΠ·b-}[ &œί^ˆΙεwb"ω€˜4~—9ΕJίmΓ0ϊs†ΠχšΓ0|ΎΟ†«ο7‡a#κΜaΨXz»9 E??ӞΈ]œ^΅γ†œkι‡β' Δ.,¬ΨGΏύαψy9ϋ\A~ύβ'ŠqjZξGβ'u€λέ_·BΧ†0¬xQ£₯ί?i,–y‹hŸ4πPwΙ#‘lΫWd ³ϊ~L@C ΣrΤaΧμ»πA£-§K|Δ΄δΗΟk…’Μ™L ώDόΌJ(Ψ[ο:¬ΠO \ˆCΎτ럊Ÿ4ΦMC½τϋgγη μ{pb‘pΣ²ίi;-ϋnφ΄,«μ§γ'εDl)ΨΟΙ^iΑŸŸcbAΦƒŸΈ/ ΄Β?/VΗ‚‘΄Δ{ωΰ‚ ΄Θ/δŠTΓΣrν«ξ½’ΐ··•%|£Q¨”/HIIΛώRό€.@'lΩ]θAkΩf„ϋeaŒΡ2‹±ͺˆώ¦₯El=.έχά–ξgΎζχΕOκ8εbΏ6P<(ΰWIƒΕ΄π―©k'…3΅Ώ_… @XΕ’ŸνΧ…qΝ"­ΨίΛΥψψy‹’\uΥν-CxvΙY£ Ώ!ΠOΔ₯e3~ή¬)…€)Δo B”‰ή‚ˆ§ŒΪR€ ¬ΡΪߎŸ/•fU~X˜l$Q;Zτ#ͺξŠQN π;‚:ΚθΟίτη’γ9Ϋ"Èϊ=aŽ‹"uτΫߏŸΤr;gΙξT΅³ΚνR T»ؘ*Tνϊl |Lίq|ι6«μγ‚0‹DZξεεˆ^ΑS?-χGΒ€σθΧ,(Ξ$ˆGKό‰ΐ›Έ„»H ό©ˆΎ¬£LP]ςΐ-ύ AaΗ₯yάώ<ΣyS£%>)R<*‘ΎΏJ"c΄Θ_ (f\΄ΰ_ "Ε©θ·-T“‰bΡ‚#辎ν-υν%(Έ68hXΙΏ«γ\΄ΰ§βη>UΑjLjaΥE?-XJΰ4ΨίΕΟ•``pγγΉψy5_>kŸύ}όάŊ…Ι— hμ{ τΣ@©ϋiYJγtΩΟΖϝ¬lb>£0DXtψ'˜ΘΟ *Fjn|NΕ^₯ΙΥΟB2ΆφΏ*>ΐ£₯>/θme||A€Y^ύ«@b™·‘–ύ7aU‡(ΔΏkk–K΄μhkηέβ?’ ε½Α­»h‘/ κ€θVΑ υσ#™ ώ[`*ωΊι·™>ύ²PϋΊλtΪ όβηΖOΊε˜zί@γΨ΅ΤT_cκ¬Φ]ο-ϋΤgN@ιdς‘Τ-Z+έPΥΕFƒ»:€nZΗkΣͺGiΕxLˆ+Ύ’Πη=|Ÿ9ύœιρ7Θ=mΠί^‘ͺ+ͺaBƒH3€…¬c€ΗȐ˜¦ΏŒK›ΐ³ ΩZΨq[­}‡¬φ_+Ι?#œNa>£xYΕϋ*ή^Iχερ}Oh¦jίοΦΐΎΘΨNE£ΟρmPi―7]―ήiΟΜ5<Λ~'iΝυhƒ#\ωVRrڙΜξ™±DAt=°Uάv-6υj+nˆ5H5iE*_RΘ·©pιEHυ}΄P#–Nώ±vΜ0PŠιϋ χΙg.•ZΛξ΅–7*ifέ‘‹Š’ωQ‰°Ωa"l–BΨΔκμ0Oζ.+)ΠSIJ!: SQ£ƒ4³1:‹{^θΣνςΝΫ.Y`tjξ’Dpv .8s’·n4ʚaΈΊμvœΝΕeΚl<§Z6Β£’Ο§:Zήhϊ}W!€[JΖ/΅*³+Σ·[uo6;UιpΌ–Η‘ΈυΥP#`ΏΏ¨₯¦³$L')5^™©7ηλέsΗΞ/4’'όxώ˜¬7-©ςΰ{wEvβΖzBΛΠτΟυ–Αϋώb0TR½T©Ή+K uFW†‘W΄†—):σ–§Hί_,›"―Μς‘Η!ΛΣΛ₯ΔaΒ9iHΞNT‘ζͺ’VL* ƒΓσΑΝμ› GΗ ³‚Β8©·Ρ©έ)!ˆΤϊόί_jU4’Xž¬Μ0yz'κ)Ίϊ1―HΔ°jΆbU’ HWΑ΅ΔΕC&ϊg.MζΛπ³†Z“t/UMχ:“~°\©ΊV<—qŠη€%h{ΣγΩοΟ¨dα@†B…¦—t¦&tev„ͺ^Ρ²˜FQHΦm„£%ˆΔx22‘Χ%΄Ί8όVΓNͺZ䏩b1“ 7"Υ&^ζUIi'؞ηχla5«Θ‘Rͺ‰QΩ܊yfYϊΙοG…άΜw ν β΄3Οu6vΉξRƒIϊ^Ε{ƒ5η¨qŸ τΥd~nπ>§σ͚ΎoςζwqΘT‡ΡΛΓ(‘Χe2°{u“fΫYt=7τvH6>υƒ/₯̏s£Ά6['7<5AυŠU’ι\Ύ?#yχ…ίΌι]³€<δ{π³Ή½b:υ€¨=E» ΌνΆ*Δ΅NFΎW HŠν+ˆQ@DI"½—I»pžVVΥL΄Bέv⏔dbz@ΔWαSLϊ―ͺ“%ŘΣϋ2kΪvc4k`‘EΑ½Ό^|BΥ‹?QΌΧN)}p-\Χͺτ­ΩΚψψ8š˜˜Θ·L“€@ †χμΤ’X€Βλ j9πv–Š 7¦°Ί!…ΔlП΅^ xά$J5ΦY%dMίφ[ΔΈQL#ͺ γ}ŠχΏΜ‹’wŠŽΌeξώΑqJŸd@ε™x/_4&f5QΞ}ͺ₯α—z΄χlόWγܝΞσί$.ΡW‰σ~dϊΣ}eΪeYΗn …:nβη Χƒι₯λwTFO*Ξΐθη- ΄ΐžy;’δΡ±L#Θΰg!0,΅G˜ςΐR­―,ε~d`―»ŸŠ΅E»›Hh;ξΫ6~b)‰„&[P©ΥuδωωΤB ύ~ΐ| 5tνΆΣΞpμ₯I“{ζOΟ4Π4’sŽ νΊ¨OE£€ aΕ–ΖΛx+άbJ%ΛGLήl8\ξΊΨr9#Ίλ2΅΄fi#‚]L°χlΑΎ.irfΆΒΙφn‘ΉέΞyΚΧΜfη&_ΎnιL7ΒΜΧWkυωz£1ΕΎΪqqUϊή--ΒTˆπώT'©{†[tN―πΖη.ƒ«‡ΝΦ+ͺŠε‚šZνJ°N/΄eάψPI!δΟ)ήΏΏ€ΦVrχbΕ$X‘8β8ϋEώl‘ΝDΉ‹ζΝσu3t·šƒ3―ƒNotŽ‡uνήržληLx§m―μαcΘA5Η>ƒΘŸβqθuψΧAX’oΓCΡfO‹fX¬#X1"|z -uό¦έAP,κ r=δ†(:…@y!(ΩΕ•Ά υD+0Τ ΦٝˆπD9X‰mr‹bΖδ,bNϋ™Ϋ<2κΙλ€'μH0οIΒUΆ6ρ,€Ϋ°•„’v"UpKΝ¨Bix΅Γ@ˆ%Ε“-†u²3¨―šU›ΘLH)χpGψ§όΖV f%ͺ‡S2Τ!-nψOSE5Ό€h‡A±±\ΔiΓxΰTςnjvc0'€&QαΧ—΄XΪΫy! χlfό—Œχs΄Ι;?φGΓΖ/oOι†;Tζ;”œ«―‘ƒϋ‘ Ei…h‰Ύαγ_Yg=^YυΖωΖfσϊ˜‘/iδ|‡ŠΒθ[fbΈ];1Π}8ΊNkΝGn#Θ8έφSΊΉ›FtMηD /Β#J΅όYIΣ~±Θ½₯¨™o³ξA7BI'HJή £eΰυ’ΨΌΕ„αΔ‰ΕΩΈAQ/kωΜmuΫXΗ†~rΨlωψ¦„>›² t>ί—qIJ‡yC:X&tH-ϋUy €κœd|±»SbΜΣ@*#ŸW4[θΊRΚ:)Ώ ‡Δ yΩ6Σmό`IΡςpΊ± κ¦=₯Ӎ͚»΄%ψΉQζE9ί’œ<5œ’€±—BυUd²m]–Vy%ΏΘΌ'Ρib(ΰfQέSX–·πHL]βφτθμ“Έ φΆp+Ώύ‚ΠSΓr±γ―Ζmbˆ<Α³JπΕ§±ΝΑΏ i…zί;ΣSΡf–¬KBuκ›|(Οΐ‡#n4zjθ–™Ό1―Βπs|Αμ~Ψ!¦1if›Μwa˜tδyΕϋ_0Η—ώq]z4r[Χ¨)ΏŒ²Υ’Eρ>p…-B»=>>nxΖ(nc#{ή§ΐv“ΉΰŠˆά&A$Ωπ괇ΑΆI#¬Œ6V)χK_υ‡£ΧuΡ}#|]™Žjz¨l ΐ*Η²ω HψΛΆ€ }ZρώWr4Šκč© CΕή—0š”Σ'ηŽΝέ }δδά‰Sθ±γ95‡€—πΈΔώλΔάρcGξŸCGŽš;ž8zκ!‹ϋ«θω–R Ο¨ ψΙ!ƒoσΒΟ;fΓ™^uv•l8ΏUSɁ‡σ§7IŒί=\ŽνΊΰ6‘†4ήwnYB]$‚\,Ψ؈\xQfΰiM%;V€ο»8 m«r@kQ~₯¦’Ρ sΰB(€‹LiΩΎ¦)υ[,Μ§~.τ t\’†|>έ’γ“‚CΜ«~αf¬Ώ+,€/pΔ Χj†XξΨbXn@Α-• §n#ώΈά%/λα&―₯ ωsΩEζΟf­”UT,Ύ‚Ύ$[k;=₯©dΧΰ‚½Y,,Ύ0dα‹ΜΒ-O ™@[†—Π`χ4•l`{·aΟ·)K΄†EWSΙθΰ,ΩΖ€—-₯Sv„<5`G.ψ• 8­!g1uišζΓ zD·Σ˜…]'&&.\Ψυ’AdCa=V£9X½`γΗ[ίM˜³Φ ΄/ωpώ&>αβŒ+Ω΄JόΨDv/`ψ₯*>yΫˆΑ·™7 ·dψδΌ¦’]η­?ΞαΨ Ξ±­?VŒχ[–P‰ K~ΝFΰΧ½¨³ πk5•μXn1E·U9£΅4Ώ^SΙΰ–ζfΕ•΄κ/v\ωM©M,Μ§~.t:Œ+ΨδΈrΜ§œπλΔΕsb]²ˆΙFBJή0Γ·X˜4CΤΛ.2Q_(a αvlai,e&"­‰πšJv .Ψ[- ˜aα‹ΜΒ-O ™@[†—Π`M%C˜Ε^dIΎ)ϊ}šJF7Ξ’I―&ύ\XoνΆUψ°ΙQ¦ν'…ίͺ©ΐ( VΑΜ€=;Xrr3ε1γ«ΚΛcφ%*ΟkΠQΐό£‚ΦtΞKeύ㠘±‹6σΓ%֐uΔH‰σΈ‡AΡΗτ'Տyu?†™ΎGΦΛΥ8ϊ°²χ΅|*¦UujT/…/“禛5ƒͺ3¨>9ƒΒπoί Ίwν‡wώžA‡Ο {ξΑe ”˜TG»Ώ„Ÿlφ—άŒžΣ=3Φ‰§”έΝΏ Yνκ͊ £°Už²f+‹~+£ΊESy7©I‘ψψ6ƒLzJ½Jcuƒ¬χ8½σΠΊ_VtŸ$AΒ-ητΛ©ώ'Ι–’dΧωΙ–’rδφK»ΧZΞτ©YšOΊ˜4΅OΡ<ΫΔ`ν.ζ΅tyͺ₯έ¬%’r;ilŽύ€l^C©‹rJ/K$' ·Hͺ"<N[Φ¬τκ¬$“ ¦φ΅J`& ΕΥ#V#Ώ#Ά&H€IQΡ™Όχ‚u9²{εΘ&‚y˜ήž+}I%b΅\4e΅$8ޘΰ§~—γ9‘‡g ‡k%ΧtEb=wΐ7]S‚σK=Πᇦe(qωΓ3₯τ΅³ωΫc+³k˜πc»αέGPm@i·…ސ$ώΠ6:ƒ…d³ίsΠ}O°•Ž>Šξ ό3ŽwάνΒΫώβ’ ϋaT·>6LΤuΏοy}*Gš~³:α,φCς ž5‹ζ}Νygέΐ'SzτΒά,³Hψ―Gόήƒ~ίk£;>Πά[:ξΓjΕ+κ ίΕ•BgކGphΜΦη‚ΐ0ψΡθΦ€£^›ήLL~_CovΦΡ1ί?Σο’‡AΨ+‚¦’Zpπκθ8Ρԍ=‰=λx@ǝ€$F†:cŒγ C'ΐV$ΰDίλΉPσɞν΅ν Nϋ!H1:e7Ρ)ψήοχΠ©u δc^γzΜoΩ ˜ηΆόΆS™σπ=ΰΗ©ΐφBμK>Ž³Ϊ’Η>‰žp½ΆΏ’'ΐΐ=λ⾍νΆ(5*•γ°rϊY³8]@2"λaΤ±Η€εθΑ~―8(&_άtίzΟ ­Ω'μΐƒZpχΩ ‡gη¨ΠΓ«/``Pφ»G{ΨhΑ_ ”4} γ"z#Ν‘Η$iθΓ~—δυ&7x'­Π­Pο$~a!ΚΎ°€`Έ"»"Ϋ[G°ͺθΐΟ°εΊ¨ιzΡ=]"wψš?lF’ΦrέlƒeΩo£ΦJ΅|' Œoω+]|E_%Π PΫΕ΂ၬxΐΤA,³ζ΄ΘE\~APtα$—Ϋέ„’e;$o์–N~¬!·\―ΫΗχc4Ύ#Γ%χ + ’ύft‡‹kΫέq<ΤΑς"X=ΑΏ5΄(zΞZω-ψΧ… ‚P€Ό`œ»Ά>{λδn £Ψ« Q‹Σξ·πΝ08Ϋπθπίά LΘ° c$ΒH`ύνΆbšνϋ+8 =Γ|E}5 +Ψκ!zΖνςrp› ΙG} š[P¨Ώ‹IBd9r—‘¦οwP3RiMz;μuςΎΕKρ0H΅ˆ5ΎͺδΗ41ω1A{…‘’’[ΞΊΞ*ς›OZ‰ ˆΛ’dΆ@ @_~C0Η£lαΏ^6 !K½E$Σ(ήjVΉLn¬f.Ž[/ sVہo£ρž*§š©ΖŒg*fρˆ–lΞ}ρ9SεΥΊ€’‚OpŠclίXΉ\)Χ+eέ}2εΊUΆfΛ{Λ±‹’ TΈϊήΩ2χΩ[Άρ€χ@”ρ ‡w€ @‰έ.γυFωPμ!£*ΤΡq{U»ύT?μα―ΛΒΧ β@Ψά^/‘ΐόT΅1ΛˆίWκνIXΩZμύͺΫξ-“/jμK‚ž>’ωj[ξγͺΓ½ρ– ·t‘U€αP†|Π°[mgnρΑ₯7Ί~φΧή²―QψvγQXΕ„€Ω’‘sˆ©‚ι}8ϋ©}d΅έΌο+λo}θhχα“‹Ο<ωT±ΗŸh᎒κ|{ε‘£Ÿ|ͺaYΕοdή‘]6«ŸCυσΙeΜe±²Φ2Œ©Ξξμ„-»«O€ύA@§œUw'Άχ#Ύ‡M °"΄ρmLsŽΫ έPœ³ΘMδ œnΊQμm΄W_š––n«ΧΞέu\υU«X-βD@–œƒΗΰ†½”Θ σκέtCς[δΤ]Μi.νΡ5©±M~ΰt†Ή@9l’ίωΪRξGv]ΙTЇ„Š½Χηγ"»Α ₯’”ΰ3χζ_[π2γ)ŒmΡ¬Ÿ³’k-,νuΞJ·gΌ€–I*­ˆ—S±žύπάΈ3vτͺ―ϊ9²umΟ‰αTYϊIn γB”Cεω~°ΨlLŽc?D½†ζO7¬Ιqwηy|Ϋg}ώŽκݍs‡άY―OΨΝE/θmδ_ψIΪηKΞΔ¦†_ ψtε€–s‘ΕE »="Ήι’šC4ߎ½~ƒΤ)rGΞΥ ­­ [ΐdφΡ¨;ί„x;ψ/ΓεZΰ,9k]₯yQ…Ρ SR‡Ή•`ώHΩλ"±κΓ――Ž~}€~nή>s€ϊdΉ1Ε]ν₯”±»rϋ;†j‡^[mΊ½ͺZδΜ«ΊλN‘*±wUγͺ€Χ*–_WΌόJ*uΗΛνŒMΡΝΔS­ίR`³³ e>–C1ρύ;5m_―€yVρώ§οYρώοEρώ―ω2g„ϋWm—Ώ––Ξ“lcqΆRZΧȟ*Ϊύ’βύ‡οRρώο^ρώΏοŸ§ƒΪW‘ΩXΥ'5Ω«ζԈγ]³ε±!Fu•…OχνΐΡΤvΎHΧZύ€EEε|ϊ”Αx!ŸMr‘‘ΟεI]`wŸΟ»Ό’¬«ά ―ΚM=XωœΛ7[³$εϊyq7”΄Υˆ΄ysxj‡»€΄Ύ93ΈJ{šςbΣ=£[‚­Ώ5lΆκ1Mš#:Ρ&XΆ%=ΑT{ΝuͺΌΈ :έβ9“-"ι V”·‰-IχAnΐOˆ8²-ˆwkI£YSΘ_Ηm ΓώBšΚj QΖ”%© Σi/`kΗΚε=η Β†P”…Œ#ΔQψ—Ζ΅ΗN!ψ­6[žΏηπΜi Œkοt R‡―ΚιψΒΒkŠΫήrΟi-ƒ‹·θ(“•ρτ€ElCΣ]Ώ1…— ›e˜ύ ŠΠ/ΗX§]ΆΓς ŽM(γθVe:λeΌ³w’=)ρhΕ±΄³wπ­BΒ2ΫΊ‘’^«·yb ‘·&€y~ˆΓS86‡Γ΄cŠ G6,„]§U~τΔΧθόισϋ“ϋjπlАΚ[aͺχŒϋΧΚγ=Ζ恺Š‰Aζlβ"Έ|M:2Υ ™­‰)Φ8 bμ1Εb@ƒͺyΟ“.Ωυ†=‘σ§ληΗ'`©x|š° IH< ”Γ\6μρη^± ‘(έΰΥΓωΉjn—Ά8=jΠ΄ξHF²χƒΗ\zηYEο3Ϋψ₯ΑΪP« ΝuŒ™Ϊ+ω΄Ω—’ ύkKψ"'R]{‡W~Ÿ”X)iζŸ”›εD ¨.ΰΝΈΌbIν1Ύ“Ώ-yχΥΘΉM.Ύτ:fώbμ1©qaι/”ΝΤg‚ώίIσ“tς{άι1Š JJ&ΏCJ¨ƒβQ‰ŒΊξϊaΌΝ΅ ξ°κ{υΌΆ€ΪΪ•ΝLώΰ«ͺ`§σaͺHό;ŠχΓ½θ»ΘZzš§^1 Η.W‘k6ΥX%Σ.PbDŸιθlθ?|Ί&»M?άAŸ· @do›0Ρνυ²νm’½&2B*Lˆ|©Έ‘W:KxΧ¬ΫJέlζΚσ_mŒsφ4™jaξω½*LΐώͺΣ―uPΥw1Ϊ‚ˆ•μώΗ{Ϋ£½Ρ6^„·ά»^oΪ]Δwή‘π¦{m7Fρ¦~Ό=οϊ\AΡΆ\Ε’mΔΘΕ›oQΗ^iΆm½FP²‹+'w™£ΐιυυ‚uDNΐ Ό―­γ΅ηαΌEE…ΒLΎ15Β<9g:…k‘, jzΞ"ΒtF.₯©ακ΅)ωIcRmφγŠχλ;ΰ γξY Ÿη’9jΓΖPΎ±φέ(ή₯5%τ‡ςcŠdε‹³ΨΗsισR%6)ž‰Κn%ŒζμxIττδTžkŽˆbΜ¬B’re"‘ΈδŒƒB(r4ξkS '' +x€r­Œλ[Α₯σšΊΫXΉίΘ«žΤΌ>Μ3§ͺcTμΜι=f’3sΏA‡hŠ―›qΤR~>,δNS<‘˜ή1{=―’„#σZ—K‡ΦωχκΞ4’?η]ΣjΪ>§zŸˆΚλΕ'JZΆO1ϊ!6ƒς;²ψΐζ€1P ε=*™89T•ΞΘ$“LK$‘Vς—ΝώΔ₯"x›fU#{OqRβr΄G Ύe‰£ ‹3…Α3ΚίΡ΄Pρ3J̐‚πdYκ₯ψ»ϋg€" Μp*―xW.ΆLΛ+ΆV7ήŠΣ~ŽϊkGΪτoJcB¨%·…ι†Σhα2ή§4X%Ώ,°$Td GΉ©ZΛNλ ’ίDEςεΆΞt’m§€ ԁw‘δΧ` Fg$8‘_X&*όΐEH]m'ln7ΐΠ1'’U”ƒΙι‘-Λ1p7ΘΖOˆ3a\hלX9΄νžΏ(WŽΟ/Ώζ5wcvƒΊκ-|Ηβ=·x.–ε–8tΫp ςΪ;0©fςl%π€Ίλ„cΦΒ‚:χ[:r[έ5"ΧΔρ’r”‘Šφ-JpΥφ[X“φA#$tŠ^0B•–£ΝXF€ω$φΪK1νuXή_Ž%Οΐπsgœ#ϊ’ν,ΪύN/DΡΜggVΩ{²}ΊowήaΆ°偓z‘n€W * ρΜ‘d Gι¬πψ^q°β!₯H?΅μ`kU5;΄ Ϋu™ίΥt†½%±ͺ Π‘ΛBΠΒ$Λ›ek₯;<3±Φ¨Ίœ³΅(ΪvŽ sΜ؊؀¨λΌ\ΑˆŸPΌIΕϋWΌWq/z„o58\ΑΏΈ† ΧͺάΓ~y²rŒ™ΒτΘ<Ϋ*'Β¨Ε'jάiˆ<³8η²mZ3 aΊE&β`₯p’+ΰΪ j•…Ωϊ²5΅άF6 ·€£· υg±ƒΩG$1E~ς,Ω—Χm>iΐVaΖΥŽZSƒα4 &ά 2KKā-ΤΛλ„^6Ž‡R±?―Ρ’e‹‰ΗυΌυ5¬Ιυ?Ηf˜΅Θ,:T{κό8ύtθ³ύ –Q9ώ‡O‘Φν)ψΉ€oMZ8’5[_“7σΞ\cΎ:՘Ώ΅fI7Hβφk΄ Dj,gΫΡΧgUζŸzS#sζ KulΞ‚ 2/QŠά³›dt°;6"‡?Λa˜Ώ”½wS̍x«`ν촜yάΕLΤ([1#φΗάίσs5Y[Χ 'ό ΝςT¨λΐφPυυ œ•τ ”dv«œR›Ξϋ…€λιή‘ΎΝΧΫ`˜Bχξ›αa~Jΰ{«v―r‰sΨΎL4—ΰ=υtώΥgΰΗ=θ0ͺο©ΟδήK’8“²5SŽΧ§P½Šκ“δώt<ˆφ‘{ ‰Γh?ͺ#T?ή– ΛPŸmθε ˆ«ŒlJv£KRIgͺξψKnKF} y―ΈbΚT.¦ΐ]+Ά4Ώ°[»‹_¦φΫΰu5^Ε΅SgJ8ˆΤ~›JsνΞ PY‚…ω{$U‚ž΄29)ieXΗ#Mu’n ©ΧpVΫPΗ›’ν'βsGθ“tsJFdΘ»[`Εΰ=Šχ―x.ΕϋŸRΌ]ΕϋRΌ1™\ΌA3ιαϋΌhw»Dw ΰWKςOfέΜ’GσύΗ³'¬Κx"PͺιπfΩ\‘Š>SHΚ’Χ“Άύ~ryUŽ₯CšάWΧNΡβ†zσΎΖ t?.mόώ§X`ΤγώμτΙΉcsχŸBG99wβzμψGNΝ‘ΰ%<ξ?1‡:1wόΨ‘ϋηΠ‘c§ζN 'ŽžzΘβk_rΔ[)©ΗMpiˍ―7HΊτΗΝΣrόOΜ/>Ψ@ψΗ°τζ†nΧ1zrbŒΑ6"ΖbŠμΤ&Γ6’ΒrŠ ΗRͺρΕiEO;7E»± ν.]ΜΟ(ΖΞ%?tJŠΏˆ!Ÿ«Rβ€g™ρ L˜=:ΒDχn6yΎ"E“λxΉH¬τm@‡%΅(Ϋƒu΅($†η6 ƒ­ 6=Ρ‰ΨΪΏ˜φΖE ΚI5Q°plO’œJε ž(ې§¨q₯h\mΝρ„BΆκœ/iŒ-½+tb+Ψ xΟκlΠoNΡBξ ½”ρ–ώWθΔ₯±fρΎ»€7Α₯-7ί«7Μ"½”ρ~ώΌ%:±εό^C"ΖΫΥΔ`θΆ!Ζ¦ˆ!ΈB· Ύ-EΡϊβ΄’£έ·§h7–‘έ₯‹ωw*ΖΞ%?|WIρΙw…β+/(aφθ3œΕK?EΉ+t;ΠαlI- Αφ ΑW«E!1<·ΎAA‡”:1±εό\C%Κͺš(‰!Ίέˆ²–"Šΰ έvΤx&E ΡΊ4Η9…―AV‘Ό₯%oI2μ”S’“N ωΞή²2BYBξ>'Η“καTYϊΩ[^]v{NΨ΅[νύ8»φ~ΌaMŽγ+ΡΘ0ωB¬Πš€B§£―λνšσTc*ΣV|<%djςΰΎ{« ψυΰAψ³V ²ΰT\–|@iƒ‡²WΈ•qڍ1kςΒ;μ'7~Lbc‰rdLύ‹’B7ƚŽnRΗ7HΞU\¦8ΟΙ4Α΄>οhœ_‘¨LΎΉQ΅J™ͺ\I5p’μa^B΅/η)՝·Ί;u‹St— EUEˆ·Ώ€RR‘ν\:όwj˜SO“,¦[‚ƒοΧhjUςΤθ"¬]Β©θΪkΦ ο„65©3'Ν’°Κ]g@Πό?U+Regular Expressions (Python)source.regexp.python―xΪΝW[oΣ0nΧ•‹$$Ζ.hqK¬ ž6m‹†ΰ‡I< -N'7υΪh­]œtΧμΏγ¦qκΈqV,-'SŽΏγsϋŽ{Ώ2YΟRΉŠ)£G~sμG„Ϋ~‡αΡΖ^%ΏδΤ8 SͺYgSκ,˜uήKšYηƒΤYLεT%ίεΧz*οf_ΓσhOΫτ(•šΧ{ΪniK΅p/•χ5߁„dT˜€dQp¨Y€!‰ ']r>¬(552RΘ“Ψ›©ލp0 ;δ8 AςͺΫ ΄#m,H cWtχ’υ<•–…1ΘN_ές< ΟМΟ?Ži—€Φ« šG«‘ce(„>ΨΖώI({)Τβ­jκφ§ΩφΑ€ˆέν>σO ςR-Μ ΠsnΚKŠ^”ρz)Λ‹Dv9 ‘!αΙζΩΓ,”f½ό0ό›Jγžηυ²#ŠΰwpάOŽϋdφΈφ`ϊR‹κ¦=z±†lΔ}Ω[pxυ­θEj΄ZΡ¬ΥΛ”s|$Ι!χμ{ψ­σ©χΕ‹4ί΄gΘa±)z-ƒ†ΏίΩ ž$e ΉΐB-ΰdNι$ε‡_£Φ6ι²7uΘ7©ΨΙd‡-ΩG δV‚Ί“-Τ‡ϋΦ Yχ>Ή9σz² d‰L£“Μ£―VHg‚UZX‘»«nέ»WœΉi–DŠ΄δYΑ³zΔiAoί«Ξ8\³aρ€ eςΚ,«ΌΜ*§=9ϋ'ž"ΏλθU<QΧΛqCσς@ω }k@8­zώ8ςP·¨χŽ6ίRRrRprofilesource.rexponent(?:[eE][-+]?\d+)var$(?:[a-zA-Z._][a-zA-Z0-9._]*|`[^`]+`)9xΪέ}{wάΘq―΄~;‰‡ν؎ΛφΪw-f—ς97ΩXή₯Hi—1υ0‡ϋHDyŒ`†Xbΐπ‘ χ›έ―q?ΚύϋΦ―ύg(yΟϊΪηRtU‘ΡθGuuuuwα'7δο―5όiRVε8™N³Ά­šρ[ο݈βx“&™žd]λγέΌ>ήΫο΅λγmYΌ/\οΕϋβΚxΣj±ΘΚ0_πGQΌΩ²œvyUή™&Eq'iζΛΑc_ώƒs₯όІ?\ύXšM‹€Iοϊͺ†ί*’Ε$MξΨ³Aό―½Z|—©―ΏZ|Χ‘α7£ψMuq9ΟJŸΏ\­νšΌœΉύ«k£ΉL~cPργρ"ΙΛχΕέm»€ιή0Υ€±³έ›Α}c'»·ƒx“e^tyι+Η"ώέ Š¦Uš΅Η±(ίΌΛXξ{ЊSJΎK‚ίΡπο5\Γtο ’}cUt뻃·―dI‹ό½AuP³gMRά9Kš<™™‹ψύAYO²ΛσͺIέύ΄Οη,ޝ:lϊκ«ͺ)/]ΥΈ‡qΐΚ¨ο z°ρaKΟ&σμNwYϋ‚ά€‘μi·¬αOn¬ώ»›ZŽaΝιίΏqέίkλ^σΪͺXG7©QΕKnΦMeΠΝ:i²²έΜΚt³‘G‡yϊαš\XXd]²™wΩβŽτ°Νζλξ8>έlΒΪ‰³ύόε/ΨΈ¦@֍7[j¬" Kζκ ΏΈ9hΏ8±:a†Bύ$”¬‘ΧJ†DυσEW?Ÿ[ ₯Υrς§¨‘—³ξΏ λ’Ω+±ξΝAχRρ»YδeΆY.“¬ΉΣζσ’ žΈΉ2keLΊ98ά‘Έ [5LώKΧwڟ^SrŸβ°νήπφ»ο“ψ^Νh·όσλΕ·uΎI6ΟΑΑ7Χ΄ΒΧo¬ι ΛΖέωΥΩυυWΛδ5υΫα ^ψψΚ»q=οώ‘’ρΔ€–ο¬pͺϋΔΝεζmKό=Ξρ‰…Ϋ―Rσ.7_T…¦£«ΈYuΗhŽaτλšΞηΤ΄΅χ|vžΏω’7ύš«ΒΕ;―o•ο^_‡’ξmž.«.Km¬lV5Ω{ŽŽ6-₯p­!Ϊόζτ˜Š5E©²všΤY”=ΗR׍i6ΛΛ\ΨLς7θQλK ϊΠƒόΣg.Αuρerζ §΄Υ²™jyoήxΩίͺΎΝλ"―Ϊ―ω{v΄Ω'1RAs+m†Uo½6‹_Ό~¨ψΙυRšΎ λ^W•UζΡ³ΫοώψθΩΖΛ5Ο7―ΙΒP7Y^bžpπ³£gŸS>΄WΏ,±θvΥώ_―Rνͺ₯Ύμ_ΌΥΏώΟ–Ύ~r;™Lšμ,OΊ¬O&mŸL+ΉχIš>ήΖυ0iOvH P‰ϋdήd΅\‹>)ςΆ£+ βh3;]&!θ»zH€ή›,‹.$eεYήT%Ζ›ω ›νIΫ†δ%YEIΞͺf±,’T$ε|Iσρˆ¦Ή5œΤφ¬Ι§!ιι“Ρή'Q€&9΄€ΡDσAc Aε%~»ΛΊΘ§TiŒ‘ΪΩ$—Cbš@SΒΘtεŽΥKL^$$β.@EkΰzdŸ‘Z@ bdΞ5’LΉαψf±Mω)‹ι}—Ή-"Eιϊ’iͺa’Φϊρ8»XΙl@½RMΡέjΪ­xΖ "ΆΝ΄ΙfB¬u‘]0Άe„Υ·Ϋ½vH‹«.Ό±ς=ΧΌUj;¨ΥœΟf]~5‰ jj^vΩόj₯3 h՜آ’…TͺόbΝ½²bγ Ω:μJrΤΞΑm;³&K‡dnιi·’|΅ΞX Δ$νJβ•&>Λ\­Ί60h{&₯Q`m€­Ι„ ½«‡ a=Α qbΈκvτx$³_Τ šVςdΩ¦‹E{uΘ…Žυ »Σ\EKŒ M& σΞΔ k‚‡ωcΚ*>γa=‡}@α0ι€ίζί¨Až•v %… RZ εRε2€(‘AV&‰a―©iδ§±4Š['yγ"¬…=/awHπόν(AffΪhaΉWΐƒeΤ8GΕ0GΕ•+rTDœb€+™,b8•θ&EDy ΐθ=νεbRIzΓP-,ϊŒε%_H‰kCm‘D*£»Έό’.0UφΔxrΩβ+ΕξΊdjAπ`Χ5|!-€8JΥ<ΒσΙ’λkΩUE•€ z‡²ΨVΕYFP›Q‡γytBr!+φ4όw £αPΨ%ύ$'έ‘œο΅ΫΤ ‘Šαϋιέ)γ]vΡ₯uνΞ·Λ”ΓΗUΗᓆƒΡq>λφ=xΐΰ'TO“*½μ'©H NNθZ·Θ½„;NQΒ(λv³Ιrnψ!ε ΧU½ΆŸPj—‘Zΐ¨6ΩδΕ,§ΆœφS¦ &ΨΊχτjߜϊ6υ Oΰy”XPκYΓeg‡‚:™δe<Í6›UEJ=Z“k”ΝiFΡΛynΓ’;A4Χ‡‘ΐ!ΞtXκp+›žŒ»U‰wŸμVBβ^\|αmεΔT-½‘•ϊi‘%ΝΣe{|S‹i!wθ =«,eϊcRΒ€#”¦ I+΄m*½{ŠhΘDU<ΚAD'`΄\ \,¨”ΫΠ{ΥΤΥ›Ξ…ϋ γΕ`άW6ΨαZ±£@ΙuΠ#bdL=†„Aδιψ”:εωS h²ΗŒ§`t©σ~ΪTm[7UΪοP†¨ΊσrVυΣ%ΰ‚β 8…νrAASΌŸudθ‹”Ψ²ΓΟψk ͺτ‚#(ά4 {¬# Ρ”;_iN:uŽX•S@œψ‘šgΪνφ!K&J6+’Λ,έ”ΒΜΩ"~‡dO ‹•ˆ,E!μ_?Gά<‘·Sία‹K@+—bΦΏ΅rzκ<‘Z€p_Τ'Ž1`p·Αj‹δΏœ;‡x a9—V:GJ©qwΠQzU³Rb―>ύ-wχ΄©jΎΩYV΄Ώ0 «˜O©Νιβ¦Ÿι•ΉgΊzβ™˜u¦W§œ!i(‘Β{&BšLιe =ˆ†–₯ΑĞ}&Π,'ΫrŸ-κξEVN·Κ„₯>ΐe7ϋ€˜Œ˜ϊ@ΠΆύ8οŽ ΩI“fT,(B-/€έΠ0ΦυΩ kΈ‰‘«cδ΄Χf%±Ψ‹h<ڜ7y dρvθ½4ŒͺYχ‘Φ‘6“9₯=Λ©ίrΦp9Rƒž!2%D₯€"U}i p› š/AX&H’όDAΦζdŽΈN¨Ξl²Eu–9„WφΈ:70α¨— N!y44<Μ9Ο¨UΫ#m½9γ"—ιSΉρ€š¨ŠΥ~VT¨‚ΔΏ\#‘?Γ½Š¬―r₯±…/,= υ; ŽdjmHΐιFbαξ+Λ;άā¬α΅iˆαRՊ9YηšΛ½ί8°―έ΄kΓ΅ΒφΒδl˜π ―5Wͺ"-†€ζr7*ώ†»ϋ¨¦’†ΉιŒˆΌω”ώ“V‰rΟ§\€9Jέ-›ΜC[=Δ-ύήΒe0ΐmBqw?Ζ2F}kFΤ2`ΆfΥ’4¦¬]{#4*­Cd=Šρ ΘΈ£Ο1f4 qγ’¦²dιGI±dΒUu‚pŠjJIp.ΌΆ"ςpao±‚¦Ήp(!αΓqH11Α4H»«ύ–Τ“ΪjξΰΜΗ5Σ}«ΈΠ.Λ©‚ΨΒ€σ΄ŸτΏš$€+YnηY=rŎ‹+”ΊyS-kΦy»œτσSΌTΤΦ½>'μL<οΛ§ΛχΡΘ΄A‹°Q€₯Τ< ¨»μσύ§α‹’Zτ9Χ!I‰ R&*Τa¨Jm’B;˜x˜aXΕVχυ™ΓκCŒ€^β.‰±QΟς6ŸT˜2c{>m†rgοd¨«4‘ΛΝΠ™G<™¦ΐ<©soN˜)cζ›IΫLr?3ˆ.IΐuάœΝ ΑW]05˜½;7 Μ㠊]"χFˆœ­ ‹@”‘ S²Ι€άŒθύ₯Φ•ΝˆσΆ†€&’9$8qUs©š|ΚΨ(ς6Š<΄Q0δ‹\ΨH&δψŠi9‡)Ξ­EΡIzξgδΉ›‘Z–-KFt2ž·4/έ§y——)y+Ί2Gή+…sΈάa‹hκχFOXΫΦP+ε ι 8†Ζ„ž.Yv’9#9BkYRχύπΰΓύ§y>ώtIσ§R' Ρ:?!Ν$‘«;-Q}žk“’K©oΏUΚ,e?λ ΠΪfŸhΟΎH&Py%π‰’Ι‹KΤ„vοgΩ4@g&₯ Υ™HΘΝI»‘ΐ ‚Σ»DΛvΆ½ki… ”mΜ’LJ[)4€'/‰χ¨©·€g˜qˆ<q²AΓ€€«oA0Λ“άςŽZ&Ζ# ˆžqŠ ύš'χΕHΒπƒ@ΦPίΗον·ψZγΊ…Λ€7©PTηΝ`ˆCzͺEr’Ω‚—ΐΛ2?₯αˆdμU’š¨ά^€‹ΠdΠzˆ¨< :F/ΖΎBΔΞ dΑͺ0‰9J M"!0Wκ=‚ͺΔDωUω“cϊALΣ;ΘΐML@k|Ε,iAM 0ŽΊ€x]`δ!x‡:2$8ΰέl`˜Βf"$ΓζzŠg—ΡZPΊ0«_δmΛ•L3{V4“$&–ΐΚ’ˆ_ZMg¬–ν2Vh<.ΚΜη%WKΕ“6ΥbH{”uΗUЍ°€”!ιJUώxηΙ~8›#‹evΞƒ€<¦‹<Φ—¦±”Ϊ/ΝV’Λ²οΌΘžbΎR’Ι­|πδγή†–α°RΎΰΧΛΡφdυ’΅γ'E[•’!U%Ο›ΊΎ‚Ε%šuΑ,M&†¦ˆΔ³'u<ό3Ξ #wŒ«S~ex˜{&ڈƈΆhU‹ΎΝχz‹AJ0aΓQOρgθφŠ|•6ΒΨ±¬ΝR*kSnΔ”°΄šΑR@1ΩπΥ%ϋΥU'€ŸΛυ­Ύζ.©¦DAl‚XΣ,v ϋW>ολΌ&‚Θ‡]Άζ>›#χθΈ(Z—MUΐ(\qΞV­˜Σ¨ίaά•ΐχ(Α“EŒF$‚«Nž\δsž`Œ‘” •Β-mwέ[΅¦·¨R±ŠθΤ%Fχγ+&LzSL&Š(Wfϊ’β6}U4˜°:JΫU3Γd.’ο σc]ΣΠϋ*Ω&ΉŠ†s\%™` Q_i$2§γ°ΦΥs -ܝ6‡΅Φͺυ\bέή0™.λψw㦋’8[VέθΨ‚Lκά™­t©ύCΥMzvΝ|X·jd¬ΝΞmΐΎh*§=ιN§0%V”WΖG€gΠΣRΛΧSbs%8ΰ+UR.‘d²θ“žΦiL˜ μκQ•0§Λ΄ξΑΈ½$–[Έv= ͺ¨ š.ΤΠ\#“«Ο,‘'taMϊ4ύ@„ΙTœHΌ@ηr ν@†7ΌRΡ\Y©hΠIϋΘ΄Mw¦3†HαPž%»VΩ2 ƒέ‘„: £TX8Θε‘η<νβ‰ΜYΩ΄Ωr£]qtw!Cא€—ΜYρϋΨͺ&A΄ “nϊIE¨-vc†!¬v3&ZςHΑ —G­±Qϋ6.τcv­έ¬6Ή˜”τPΝl$>±χŒτ€Λ¦Τ@[0;Γ/ΰβ·Ώ‚ζ£Πe»Z’=q΅" ¬ˆ±~¦tz0jό€jo¬Ξe‡χ(V@$8<.$,/΅ δˆRυ­πq›œe|!κC`πQKœ“ΙΥ§GhΩ·΄’Ec™χ(}ššρ%QΪμΏqRT€αKP¨υÐKg €ΦΑKžfi)gΆ%"-#A/P(λ΅­ZΎΪ‘ي#1B’@Ϋ‡n Z„ ζΰΠϊΧΛϊ/δΰ’~Ή8|DB‡dΰxW—ΐ¦€φ±HZΑςΩε–˜c°œ­“q^Τna€ΖεHOή‘…²σ-ΤSJV™FώΠ)„Ωc¨ηˆ˜δkPΛ‚’8ΖĞ/αΝ¦Σ6`ˆ‡­ΚvαΎ₯ΌwrψO)ΊzΧΤϊuΛ#Υί)²‘υ¬C[€Ž†Š¨vΨd’Υχ}$%YΦ0y•€νHul BiιœV‘hθ―ω’ΟΚŠΡ†W*y§ε;Ρ`¨ €£@KΩ5]•s@ζ„Λ)› :§Ρ ‡!‘~ΔCΔUb$«ΕuœJΖΓe'1i½Yζκδ:x[χ/£―­ Ήxά.£σihώ|¦ΫΉ(*½GάέΧ"ΉϋCΑξn˜‚οž4 qŒb£bx΅Κ‘Cf ΓEŸi—5Oj΅§ΆŽπtΥLΒίώΨ΄&zΪσ \sžCΟ'C§ώjϋƒΗΔvJύfr`«°©ΉfšΜ&‘Μ‘u©Β .[§8!STΌΗ³lμζϋeͺ”Ω##ΊHΐZ U@Nδƌ0ύ6Θ*Α˜:AΦ:B˜χΆΰzcP… Γ΄ήΎΤ—uξY@؈!ΨrAj‡‚eψΞσγ\΄< ΔεαFΆϊ»lΠ[…AθΊd£?vρ6"Ί4ξd ννηQR&0Xw~K½£Ζb:BΞDGΘSJ«XHa9Γ²Ετ‹PšΗ¨θ#Ψ|tŽδ1K?£@Χ‹ rNλ5bB»‘+kgNΫΰ66RΆΘ‡β* ¨φ‚F΅~ˆΕσ–bWΉ*o+¬c9cŽL@$Λ:’qτΫαi2˜Σt’±qƒ΄(ތA:Š©v: l9Γ° ˎ€ω5\₯”‘C!et“/†»):½B’π e+²’g hρ|lΚξ͘˲”Όz‡`w–₯4†h²eω’ηV3&Ωn{ZtSC6V΄ήΣ?ειj ><|ψ/1§ͺ #π2-UοJGRμ$M.= mιQmNιc|E^8^‰ΝΟ1 γβΫΨφ’˜—MΐtAυΡ Μγ@C Dνi$U nσt)μΌΑ_eξΔ &O πμ‰!™5]PmΠΟ›±ώEB£Ž²AkŽΤKψͺV…ΉšΆςj\’ΈœŠ 9PΙ6†¨Or΄lΞϊ YΈ|‘Τ-Νe >‘ψξ½£ΫΓσU+Ξ[—ΌεϋζΝ5GνΘΖ:ύξεfέٜΏδμ)8ΓSUκ¨T—Ψ˜YMλ‚±δ"oϋm\inA·”1«”m’ϋH/σιIΫO’†_’a°G±ΊΐOnJέ‚·q•“‹ΊŸ¦ό°Α6³4~tZδ΅ΫΙGjG†q²’‰}#ΌηŽ„tcaR%/ &Ζ«Ž7"φ΄Œ$E _`’%2£ 6Aς“Β©sXˆ©ΊO<ψ=ολ9F:ζ%jνύ‚Ωz$―nΟ.ΰγɈΟΧpeλJ·ΊΕ¦˜2YJ¬•Ό"Δ›ά3‚ZΝ)ŠlTσ†— ˜ - 彇ZD#€K°Κ‘’,ͺ6Ι…Ι<,B4{η‚mτ° ‹…8ȝ’“Μ½YA[₯φFβžr[Λ5x*Οπ“Άγ¬h&ϋj”+ΓxΆ©™S«g”SŜ ”Q_W‚Σr„B ŒΥ–†Ϊο>§!¨²X— |0-–05J5JδPq—Ε5U²^Ο‘! yχ•Όy™€ΑŒ΄‘1\Ω·%Ck“R#jRδ²­©EΉ²Ξ Ιr “JK΄Γ‘5QϊΊζ˜ ΘΗ<}Λki‰4—*Mμς³Ιe9c}K²bα„."»Dx=½e-Ž/ζĘE€ΩΥήEN Kύ D²ςβ’QΎώ9Iυδ+^ͺ§Ÿ«Π2vγΛα¬°)Ϋ £Ν½έ!Ιο/w€CJξν8ή^ωa«― π‘μdTςβcςΆ=Jk΄2έN“ΊKdΛφ1φΆΈL,θ?―.Λ–νb«‘υtFwd8ΑΞy dXτΠSšΟtΨ…ν€Αɍw’xιx΄ΓόC#K»ƒΞ’ΒΤmξ7 [\Α>rZ}U„ΜBΪΚκ6ΐΠT‚-œ:XrΙ*$do&ƒΗ8BΐPΈ‹ >>δͺJͺfϊ–Ζb…ςRοΆ™P· ΪR6#p»=yœ?…|$Œ {{m°]«ΟΘξ—’!°1—&·©,JΠd}ν]²:$<ΰ-pBμΝΡ­pq9o²KΎ”pcο|Iφ · ωxZτΗYΉΘΗ-Ά΄εέΣινOwΞ8—ΊyJϋYξ»xήRœώΣ:›λ^ π/$ΈWD˜ο²g|ΎΑPΉ΅˜ΑΆ.“Ε£Ν‡»l§UΧ9lD<σ /<Ϋ°¨¬ V‘Ÿο„HΥΧ9ΙZ£<²l'먱x6\)t[ΫΣΧΪΒί¦0QΪ”vπώύUrQδ+( ωΚqD¬Νω2ŠT’`H+Ž"œŠ±l•—,`pŽέ΅ώ ΓK4— ΒβšhY…FνOΏ-π^ΛD2φοŠ]&λ<!—·+|HsHΊ!Οώ6Θ>‘*φ`¬#s ‰“Όtόάa¦₯•§ΐΰq7cΕXua_ΓoΏέ"?_‘&Y5”Eχή lΈΰG²ήtqωΒhNCύμ―‚‘> 6΄Π»ΥπΞdΣΙvƒΙ~‚ιDΫuLτ(οSΩε#ζ@uS  υšh%EB60%σ’8 9αUBΓΤ"ͺ±»\Τό>ş6UW±r‚‘"U‡ Zκ’™ηSΫOj©ΠγW@ ϊdS9αBγ,Ξν06¨8» Ή¬y˜gEͺ„,Č΄ψIΙϋ!ωXJΔ4,ηA\Ε ͺ9Κ΄N"”²ήα%oέώΰIΊs KHΓ θαV‘‹ρC±EΞς‹§MF’ΰ_ττŸΉ£Qip™uΐϋ8’9N$‘{B«uο|g inχ“–x‡δπŒK°Ό6ZtΣφ°α —Εt3ƒƒϋΆcŸ]Ϋΰ£Τsžb‚Δg € t΅C{ޱSŽΟ«xR+ͺžπJŒœ @[nϋsZ+ ˆ4kH·ΥPH¦ΊΩU6 ¨οI e%φ¦jb=R0evœ80―+λ\ί³ϋUlυœΣ’u“γ€…{ | iΤφΌδ;Ν]eζ%75Υ3φψS―ς«²9λIΛ‰$ΉΟ§£ Έ1Χ±¨K2@•ΖVm Qq9:βΆ™n…tyd’ζ=DφΚθΟά‘…}2‡Σ«’R!}O·‡SΡ’ŠΦΌ©ΰ‡₯μbwυѐŽ•Ή‘νEfΚΫG9͏yGΈl?Α+Fwύs#Z,ΞR{`./ΪPvχ“Ρ]ƒΝάz²ΰAΑ¦¦¦ρGnG38έͺΗαr—\_³I)k·aE8ό Ê!2”ώ€…Ÿ%Μν{€­l€C ά12χA«Tά VΖΉΆTς΅‚9 Ζ[Šω²%»t]VtxϊμC½μό δ”ΔΪNS2±\|$3ρ0Λ¬[t;‘φV7κ^`τ¦κΧί μηΨfa›viF?”¬ͺb"3Γ>‘³€τΛ~}ِo›D ΩnΙ‹Vͺ‰‡e`ͺΧπ ίo5ruœO|?'œr"L'°UuνD’μ€φ„m±:]NΙΐο“'Αθ₯X£"L;³‘{₯œŽ“½N³¨wώ”sTͺGςfϋ½φb9Ε{½”‘L‘m_φ`+¬`l™GΪΣviβκΤ \ώ‰6s™kύ0d]xt—Κ:ϊ₯Eέεa¬Ν¬··YΆhGΏΤw΅Μ}š5A"ΉO/ΨζλN€9Ί, r« Ξ k΄j”Ή ² Κ§ m<@Ά™Ο§ŠžΨvο6κ€ΖͺGqcΓΌgΞ'κ†2ΆΠσΦ'‰kE%άΆŽΆN’p“ΘP Τ½°l"ΘrΥ:αγ†Ύ&ŸςIΉ–§‚nΠΤB΍ξ{evs6({‚ι*<Žάžkάέ¬fsαςR;6^Λ»°.Ώgƒ¬Dκy!φ ¦Š πͺ5Yph]φΰJYΒ¬LπxVYa7€9Νχ~ω†ŸοΡ²)ύΆΆΰΝ($n|›/Αšcσb‘ΙqšΞq$“=Ρ» ¨–΄'9ΧwžD ·½·ƒŸ‚² οη'½lγkπΌ ΘZY%rΥμ;Pόύκo θΤrE>Φ"ŽVIΞB Ϊ’rAωΟ8šGΧxΡεΌ:ƒ#»†–.%ΐI"Zx‚+“Ι’}Ϋ ΰ“1ΒήΊδ-γVV„—ηD*Π’ž\yΊ€oi3j2ο·mƒSvΥ£ν+βͺ3Κκ§W<°­τ)fνΖ«Mdι”΅¬½ζΞ±¬[‰Ο―ˆsYmbmΡ? `μ•ΛHΡϋ”ڝ3K~¬μŠ%€Ρ΄ζΆςpμIi9ΝtΘ8κ i¨»΅ ž|Rf#ZMZ‘Ψ Q™ς²ΥΡ&ι΄΄F‰΅ο–9ε·υkή1Ωjι>υ―ϋaΊτ/RPͺ…% § 'Ή,ͺηƒ5uΕλ֊ΝωhΏΊ°”ΞΗXkOa.›œOΟ8,›ΤΒ·ύ;KΊg@”PΓn€lsuϋυ“€F}V]au‡˜XVj²‹ώ‡h1υT³4]€²šO.ΰrΖVh›ϋ‰ΐ~ρ˜8dαŸ(yέ?›ΝH1ΰυO³ΰ`‘£•u‘YΎz8 ΣUδ•CBX¦ΩXƒƒυ qΈƒ-©χ‘Xž5x΄=2]κΨΑ‡z Βή£Vόρ~b2Tžhη‚½nˆkξb“κc~:ίνxhΧq³bCŽ΄…AΑcΝ€k§\Σ΄άrŽ»g[’Β₯₯ŸΦ’ͺ8ςoYR‰©$—ΣB―AΖ₯ΨνS>„›2Ώχι4YNiν‰Ή…μihȊύHs’ΎZW₯HΉΥ πFΓ :Ό+ Λ_ΠΔ4 γ4ω™\D/Ν½«Α Φέ0ΪYžˆγ"Β¨FAγy,BVςZέ­bΡΪΧΜ €|NΚRˆψw…DNe&΅ΚΌ“A»Σ*m†Mw©ϊ2šghγKμo·Gμ“ˆ"‘©aμ'‰ >’;ΜΞ²;-ψ,fŠ…eŠΒ³MnγRΫZnΧU.Ύ‹L#œ„ώΆ\ƒ7 ΚΥ* ‡ΈB‘σ©’Ύ…‹K="ΐ7²ώΠπμΗσ,Ÿ`Ν–D1%ύ ›R“d3Sό!|VTCɎCcކπσ™‡ήK:†’_ƒG£]η'H|œŠ—a>0ν šyPfˆS>λγˆΒY πZfsj‰ˆΤ.›3 ™Ψ"“ΐZmŸ'cuGvΟXcΝ’EN}My£ΑgΆTaΉm–·Η™Ι=›&AΰWGq· =YπACΑίΛ>—MέίaΤ3lκE$ZΒ"<+ˆό»CΜΏ:’Zχ–)˜:Δ4pϊΣz―:ͺP8';Ρ¦0tώαHOCB Όρ0αJB\»†„p©Ž‘ž3kδΟ₯‡‚W4yFӈͺ$BΧΔςΩΡ2s€©ΈE{_Ό%Kšξ'lνΣ|kΜ°Υ叅>"μ‰₯5Wέφο id}˜ρ±‚UE?Ώ―bXŽۚ€²ŠƒΈ^,f0Υo±hΝμχTEχ±x—ι/©²ΖΚο~_Ÿ>D¦θBN]9HZ4@cŒΨΎε5vΧ°»οί†Έ z‘σ]γjtΩG μt"HďK–ΜΔ‰‹n*05:uXs΄ ώ&)¨L€g€GuŠ’ͺš)x@ 4’{x\†_Ύ?<‰ήaϊΪ€¦C‰έpRΒ*ΒWŸ“fٞ ω™™#ΜΏ:’ο@Ÿ’‡tί‘w(βτGbΣ΄"…§Kw+hκFΏpΓζ\[ˆ9GχZj΅*f°˜” ₯«|ŠΠσ °s&‹[ψχΐt™―žΛ΅Θ΄BΣ« λ‚ρ3,SΩΣήΨκL΅hmKNΡ"g‹–ωc¬8W“άόπ¦}Y@΄n»ŠX˜1~ϋ`ζΎ€Θ™ζΣN=~Dx°χtxƒυρ…X$(θ²β8ΙLή- d2ί]Αx@Ž)–Σ’LQ6„Π’lΞnA<φBΚ •ΰΨ»ηp\΄ΘS^8‰θ›πuΐ°‘κα#@œύΎΫ€ˆV7χ&!6LD©ώ‘j6Γ^+Ŝφ­Έ4^Œ±^r…fœ·ͺ3έN¬PΈ›Ψ‘ΪΡ<…4N *> ’s$·7ω κ ΅Ÿ•2_EYδp {$t²|Ύ¬–νbe$οΣ,„Γα>"Ν’Όp@t§ΒQZ†I m{S‹SΓςLςT:†‡Ž‚'Ιη[:΅†q\q!Ηt9_†Ο)Α=G _Βq ΩW(ΔlτΛΛIaCΏ1,­cˆ”²d!x03ς•ΧϋΗϋ£–.iΔ«0ΰ8[Ÿ\ςŠ6ίέΑ‚Άϋ$ΖVΕܟYJΩΒͺψέ ~@Δ'AΩς%¨-Ŝϊ΅@I-WlΞέει­v\Z‹=OLρ=ψ·aC_?€Hg(o3h›’FΩ )™μMΖߌ/ρ^ώσZZΘΛ<­»Bν—I–Ζβ‰k-SD šξ8M.ϋZ ΅jΜ’kΚ†zΘΰ©k-SΧ§yQ$y_Ίλ^¦‘΅LCE\p Tά¨…!EΕΝ—ΪlIŒη‚z>ΐ^$T…’£½ …₯ζ‡ Εέ2Bχ‘Uo`Σ3”}Cq“«€¬³iR‘©λώ±&ΕΧ)˜βαε«£¨ή%θας$»ό€ΖA ΩK‹rΠΏΦ)}-U hY@mΛ‡8T6δ±D₯žŽ© ˆιψL‹»Bq ³οb<ŽΫΓL ψL φτ©½ΔN[°}kΆ1βN\hmszγάG9κD&©,ΚUp‹MϋGuHΔ)F #ˆnηΠEx›έ©J‡ΥA†\‘n\d”xn³šΜͺ¨»ε†^Pφ-“nŸ­&/@μΥhX“'x’ƒ_aa£ŸTΒh4£Ι>]k\η4μe8^5 ێF‹|JΛθηˆ›ΗvΠ*Ό,,C1t‡ήhm ΖUrκ„sgΔl ΒF`‘κ0π»CXesXxG‡ΐΕ“δΣαa\nBίL¬Έκ ή3“Ϊ‚…£}»¬ΫΕη«±df›[†»Z†ΫYDΫ€φΑPΤΎϊšRΤΣfΤ₯ ¨»†KcxqΙMάqΨτ@Υ΅½xϊ&ΉbOFμ§eΛ΅6‡0L'†:>θh΅¨ku}Γ€ΰΎSͺ Ž‘7²ΧΩeΝΨ%όζ(nυ@λbψi½;ΘΕχ”ΰ‰\–άdwΞŸŒθΔ[g\Φ‹ώ ;Ξxg‡Τ…ΐ`b°pΨQ PUŽ)D#/.΄cԜίD4ηΝf@6//Ίω,YEŽRρCΈž5<ΌR‡q‡ €2(i«„Hΰ|' ZΫ|œ'x˜}AHΊλ9:ͺ±ͺύη΄{υ+8­(ί@NψΑ€γsΟζλ4iΔΟ< x»Ό<‡ύ‰χΧMς όΝe„¬‘@“¬ψθ/<€\!bR Ÿ“τ·ŒΆ iίφztM¬09R*±ΧΚv Ϊ+댿’‰`ŒΣjcΨF(ΫΤ§ψώFνΆ92-/ydΕΚξ+”lή­ctΌ37rψ\άͺ«nυ3kΘιjϊΆBtΏq0ΜΜΑ˜ͺ‚»”# c S?Έš.sXj<)|=^ς“z€u―|t~ŠRhΡ7&±°f‹’ƒš’Κ'g΄–"’OΛwΚzZ§<WΛnL ’ZήRϋŒΕυΏ%N|ΗζW>ވύτ}x°―ΠGl“ε¬ΓήρXόNƒ1uΌ«Žhφ²μπ7bσrž₯ΉϊΦψΏΨ9Ψ~¬ίDΌŸW;‹œE χŒ`}j ^Έ5¬»ΐ‰œ9\4ήO°o1‘£³$œ³ω!· ΎwΨ`²‡b@NV'μ¬iΙF19]ƒœ#_)ƒυ¨• κ₯Β+„ w$ §βέB|}WPIω^ΦςMAωˆž|@₯±ΣΉψ φQ±ÝΨΈϋHy_NτΎxqμμ `x Γ|>Φλβ\ΰφWΕΆΆΒ6’=§›¨TΒκϊ‹K»Ο¦eην8ψΟ₯ρ‘±|{ΞοΜjƒGD– φd_χέib9iŒnλX‡E ώtΑΝΞύQΏΊ1ΦoUςbϋ°³ΙυBωZ7­ΚθΉYœΎ‰ΎΆΧ>ΜiͺŒsz„ύ¦$Fݝg€ŸβυώL.!‡ϊΝ|γΠ·α¨­ω—€νj_*ΞL/ uTϋ\X%&E9ύ|KψEέj.τ3a©ͺ‰ Ur.ϊ˜ _’ξ’sŒš‡±C‚jWΔβ5_ΠωO—oΛ¦~΄α©!ΰ°·°[/ͺc‰ ήρ †ηiVwmH#ΕώœέK°‹hχ’Όt§ΉυΌn 6”’…’$Υ 9ΞϋτdΞw"55γ‹|Ϊ֚ `ΫΉž¦9 ‹Γ_•‘υύ&hΕhˆVrq+.σ±LΜΦ¦ΑNπmδŽ~YΓ{kΰ۟ωΎIέΈce"#’Pš@xδ‘έFΠs¬φο“δΉΨ!=X––΄Η<Κnۘ}XΥΰ{ϋ"aά·Ι °”­6cHς±Έο‚υGΤCΈά·$ΛM-δδ5fΖ5δ‰~B&¬Ώ²-τ 1ϊ~Zb‡Ύ0{ρY)ΒζŸ8,k”ωUJθDΏNϊο­ΐc―bΉ―΅ΰs("Σ—jΜ}-CΕh„]QAνS&&cΏŸOΨ;ήh8ζŠ'ΤRŒ–‡xeHuγ’£Ή±β kƒog„ςΣ}‚„ͺVΖ'Έ#ΓέψΤέΤ^£θΝJavsλ[-υΰςΓΑ'Ol(±-ΑH—$j΅ψ‹%ώϋ(ƒ&T’Άšϊ*ζΠυρ¦~σD{ΤpAhUΒNθ3΅α܎ΐ7ο ΜΞ2q­Δg•%|ŸFI~Y†pwΤO? b/š)7 ~|˜ωοL2¦γ1’ΙΆ¬ LΫ3mΩΧ9HD.BΨnμξ=΄ΥΚΩ¦ ;Ÿ)€ΦCίC“Ώ7„#ΰg™4‡Μ] “/™ˆ€Φ Zs――Ή%F£Έ:PΙ‘μ@A];πΗ7\—cLΨ€Uœ’ρ.‘ϊ¬€Ιu,‚ol~λ™ίΕ#$¦Π0’Ρt ͺWΥjΘL?χαΓΌΔb$ŒYPtΔϊ³"σ©]€Ο|ηxYž@ ₯B ε-ΥΰΤπ} δCΨήζ)O”5’Λ„'iF ΄m©zςΛΐQPQŒeao—ΡΖ›’# ₯dahσσ]επ`Εί7q‹jπ>)œ—€~\(ŽΟ΄ ³ήkωυoξΧ‚βQΈyλ;l©Δ%φΉ.η‰ΨΜ3bc‚ Ϊ₯±x Ϋ ©φΙΨήU:\π'©Ψο*ιΖ2ŸG79>³Sπ” ΎλΜq;On͏Ί{£ψG΄Μe)μ£αΐϋ€…hvN/δλ<£η΅3U;i6 h#/±’”f^Ήέ귘¬&ΨvGQ ’ο³χgyQžχnSΛ(†nœ±„SDEΎbRζσV΄–¦Ώΰ‰τ…Μ»©8NφΥΰοfπ½£αοίΫG?}“3Ύωζ»R€wξόΧ/ρίύ=Ύώ׍g·ŽΊηtkρΞλGε».ι/¬Ιώχ5$#¦nς†/ω0Ξ˜Ω6›ΧOά°FA—‰m‘Vο ›–P3|γ·5”O:K΅Ά™ΦΥ^©>,ΥΔš›λZγKΧ΅ΖWCΒ?ίp–π:οΩ1#Mλχ>8Нθ$'Q£ΙΝA³£πβ„ςΆΘΫ)eΠWΑ"ώάξΓνύΡƒώρ‡ϋϋύγmϊ?Φo7Σ€V0 _”،δ㞀J8ydδο\“kΜIS”‰οωLΌυμβ“ηGΗoΛέΞ7ϊΫ{Ar·‡ΙΩg—αΎ<‡)Ÿ i0%BA=i+ώβϊ¦΄d£Δ†Μω«dωΡ&€¦{ς KZ󒽇lΒσϋΗg‡άΈρ?¬΄TG›Gι›ύΡ„@ή=JίΨ Ο²ϟέyσ9αonΌ»²²^yeωŠϊ⚊ϊъŠj3²LΑ7βζΪΊyΕΗΎπUι?{•γ°}ͺ΄"¬΄Ÿ―­4ι?πΧχ]eL΅²6~ς²ΪxyM|Fϊ£ώ+8αϊ̌ΜYέ ρo~Žο3ψΏ\οΏxηλ·nύτΦΫ›Ώ ίΫ|Ι4ΈΓ‘`„άκodœPzŒΫφ5κ-40ΤΘ·HŠx‹ύš;œΌ[^½©©χ’ͺΎβΚs_ί™kκΣΧεkRωs½*`‰έ6ςΟV&/ϊ­I/ω«›šοC7»ΉFψςWUΞ~εG„£Iurscγ6ͺ>ΉσbϋΞnŽŸ+τ֝%δώχΟ~χϋηoώ~γσT?m0·Ÿ«ώΉgE|εbQόκWοήιο ςξ=Λ‘T^χ¦uCΫ·VU„ΦΑ:q*”ΎτCqτΝ•)_Ώ~¨‘ΪΨ7αω3qމΧΧμW_Ήf_χΜσzu­ν_ ίtΒ4Ÿ‘@%>γͺφ~+ ­σ°¦>˜Ο"Uπ«.EZ\ȎDΧ%…'’ΔΎζ›ΐγSϋΑšΤπ MŽ»&S8Kθ“ωΡuΙπyΝrηθo\Jς}Ϊ+UφΓλ’”g’Ώ$ˆΟκϊΜ­K©¨ͺzS"G)ύ΅K‰l+σϋΧ₯GD‰ύ­KŒΏ"Ά"Ή\—?%ψeΟiεΥyΞ•ΔXsγΥδϋ·½J`υͺΨ\Σ§Χ ΛΏ_₯ΐΌ\`~mUnC”Ο+‹ƒ<έ$ς£5τo­‘{ ύ;k賆ώkθ°†~k ύΗk軆ώ½5τ¬‘έϊwΧΠΏc½¨ύFH°FϊΩ³7ώΉΊxώ³—Kzxά_ΐeΦJΑEܝώΞ―½ρ‡ >‘³ ݞdέ9½ ζK±½‚ŸΈΧ8zΣ>Η}τfNψλώWΏξέ½ΎαΚπέu―Ίγ¬YέY7ρoΨƒ\Wž³ςwήywXβPΥJΤ­8ζ‘lWWέΟ~Φ½qτΖΖgmƒ―Έ6@|ζ°j»}ο^γ{ύ―ξυΏΎ‡ΚύωΟϋ#ϊ·VΌΊtυCIQ’¦žΌsο3΄ŽŒTφ7ώωwΟ?kύΨsχ>kΝΈ|όψηT!Ο?SE˜EνΩ;σ½η―Ξhσί†κEΘeΨ#NfΌΊΝ9σΪ+)& ~wϋ§„ΑΔE\7^άZ‘ƒuΖΕUΗ_ήΈFHEYϋΔwήU”ZτH,,'ΊQLV zκχκ+]ΎΪe毝7Ιωη9ΡψΖͺ±σ³Ν1^Έ΅―›Η•.Kon·.ucΥKώισ}‰gώ/U5³Rd (R Documentation)rdtext.tex.latex.rdIxΪέXέNΫ0N …mό Ψ`LγfhRΓΦh?w»a<ΓvGXε6¦D$Npœ Όί€I{€έξE–4qbβ΄ιVQš‹Ί΅ΏΪίχωψψ΄›Zϊ,gν">ιΨψœtήjς³$a$ˆž΅O%Hίυ»Θmw)κα°7²vUΣvΟ·qš«B½γ¨ω*Τ{ŽjV‘>pΤBΦnΚ(»²¨Η"*[ Ν>³w:r}&μtB†(γπΜdcΑvp£„!Ύ›+Y+mΔ!\ΛZ1|ΡΖηbŽOrΨ*  ²_*κ3Ÿ]˜ρ©ε|t(ό㐠`4 43džD€—p6{Lj—‚0ωζPŸx˜0ΣCμTΧtΘ2L=ΣkdŸ‹Η€ƒ¬Ύ‡ ΤΎ˜Κ‰CœΑΫ>υ£ΐ˜³°c‚ιόλOJ΅άK)["M<.-η€ζ«ΰυ¦―tΉ†hŒΩκHJΒT°ŸGjθG4^‚šΨλbΫΖv™”Ή‰X,MmY―δ>ςSΦΉ Tn•ͺ ρE@g_f’ώLνζNyΖΈ@^ΰβp–”‰JCœ -τmσ»0‡]šyΈπƒΪC ΏΤZ֍‘g'pΫ€‘ςBαΘΉς%ΐ§Œ«ξ!Υ0bγόΝΜψ%Mε™!Ί6μΡW`U‹οΰαΥG«eYFλΰcR_FΛΊ*œžS8ύŒŸΌ(|ΚnΥ( €ί«ή™.ꝅ. Oγ―Β%_Ύ©]άw0S΄JΫͺu`ΥθNm«œšf£τ±Κλο6λ*Š©2j:ΤŠγΉ€θ_Ύ5ηc[Άθ’bς EΊ’τσXϋ£θ‘θ₯˜₯ς@”Ου³†ωσUΉ&©@5ΧdUμt!©άΠφόΟIij$οZΦQ}΅ŽχcCŽ γ@²₯©°eGe /{£/νQ}9Γ,wf~\s“IϋΉ9Ήύ‘’S{φgPS§ρ²ˆq04L•ϋΑλσιŒΣ¦δΓ.Όη²’»ž/”w^QΓO§ Ϊ·‹”­Ξ%•z½δv†/ΏϋΤ6}vŠ©P(C›^Vk~LΠ₯EΙΔ r^Ϋ~οKόWΩu&μ:ώγΦΝψχΚώO¨φη\O HTML (Rails)railsrhtmlerbhtml.erbtext.html.ruby>xΪ•RΫN„0₯‹»Ύx‰`ΜJH@C£ΎκBbβWCΈTm„bJIτο•nJS’ΜˁΞι93ΣΩ8ϋ8Rθe¬aiQ–ή<:Σ°pnƒζ9wΐY)ά(Le²ΒΓ!ۊŒ H¨_]ΒΆXι? ςΰ_{Pω₯Βώ’Λm.Ι+eT~M]&0αω€α^ΚΒ>ŽG“ ΩΖαs΄{I€²΅Έ΅€Hκœ”%)1οςοY³‘!Hž)„Jσͺ)>†zΩfβΗΣ# ](l›ŽD–ƒyF«v,ρ]Τ•οΪΖ%~ΌΌρρΕN^ˆ―’ Ωυ‚!(ž}W”ΜΊ_-΅τI5„Œiz{φ^Γ…{}_OκήιΜΎ!ΓKΊ΅…«χ)Θ—“69…mE\g‘Zl£Ώ‡œξρ JavaScript (Rails)js.erbsource.js.rails+xΪ•Q»NΔ0΄/4ΐ‰‚’βˆNJ@± η.β+Šς0Ȑ8Ȏ >€†ψv!Y%l3–χ1³;KΆcΐ0׭Κ\ιμ枍c’ζk8ΰ!`ζσ˜]ύdm—›Σΰΰ°–„θ °l›FκNu[Ύ i 6(δCω(b³aΡ9 m)₯0ψ&W΅₯SƒαTΤ—€tSΐ(ŒΕU₯ΫΎ.FΚ ²D­΄Ϊ5…4‰U/Ϊ‹ΰœ¬ŽΎ;]v.οT«E%Ÿ•Vώ‰Cϋφυr oΕ¦ƒΎ‡ΪΑˆ–Υψx―v:FM˜%d„hΑώΗ4kΜέζ:ΔήΛΏ] ύž5Ž“_’(]οβΗdϋ”bΫz‚ΝΚ£όφΈͺdεέ™%γŒΨπ‰Λ~“jξ Ruby Hamlhamlsass text.hamlxΪ΅VέnΣ0NΪ1φΓΔ`–RI§z “ͺތ'ΰ²ξ¦41[XγT‰«1Νπμ$ŽνΨ&i _τDφρρχίn[εΊΗeΧΗ >ύŸΏ;΅τU£s,tμfχB§Υ¬σAθ΄›u> 5.w5t>Ή™FUΈοpΉΞε9³sjμή•§ρSrjl A‚I„η>‰ibΓ€šί4tyνΡΒ: ] o)ΡνӟτΘxK£ Α^χΗ‡‚Ϊ3.sZΉ؏ ώ¦~–•ۈ@ΥmΘPΐnω„€ΡdNPf¦“β5εrξ1ω"±Ψjφ™oήo`Ίaά―ƒ™LΎε_+B/ˆuΕ‘%ΔΊV‹+nΛΰ½§ς.š(Ί£,Tžr™%σ4ΰη(ž 0D‘T\S}€ά0ΙkΤsHGgt|©7τd /ρ–μ,Ά!"ρΤΌθpy…n“4EM“)`]Ά_Ά΅ΒJεUјΊ€£²F$z"sžη―§ύ,ΊΐΜNUg»αΞfΊOΠχ*omkΩͺkλΦ Έ΄Gέ<Όy!–švCίΦt’ Νό”5uΎ1함Ϊ&θ=9Œ:Žης„ƒθΙpξͺι?Λs"){X#ςW5ΘCτ5ΒϋTLT  NΟ=bϊ" β‘9N΄ΜΚςytΉ‘SλΛ² [:ž/NΟ+ι­CΎΥϊΛ·šrJ_/ΰΔuίxn>bOΖ‡^ΡňWΪA»Α;j Ε2‘,Ž›ΈfΎρˆKsΖ/"©—Ϋ¦JBΰ---'Qψ3dpGsά€ύY>υΧV.hρo•^jWh[ΏΎψqg Ruby on Railsrxmlbuildersource.ruby.railsςxΪ½WέoΫ6w>ϊεum tΐ°§0)Auί3:]1`Φ>{§%QΆPšTH*‰7g―{φGυλI"-Š’m΅h"$yχ#οwΗγ‘Ϊλ•Ο§ϊύ3ΞŊ<"η© R&œIτε/½ϊ³Ψΰ·ΊαΏ2ψνnψ― ~§ώƒίν†Φΰ―uΓgπΧ»αΏ7ψέπ?όΝnψ ώ–Γ ‘N˜ΡφI……2κτϋž~,θάΆc€·υϋΎΞE$jΓ~¬ί{ϊνr7Έ;Ίټο:s˜,ϋΜ`‰Βƒ8c‘‚1EŠH58‘²WΨΪΆςyΛΈπjόΨύDX䏃₯vΫΙΙΈŽγŸΨΖCΞ”ΰ”qιvοΩv§„¦WmVζ*όά«Ωδ‘—nς~Νd28O¨¦Ωέw3[ΫΑή«±<πN1›€p@‰=Δ&d“½ήZ«ιΥ}ΊΆ²-(ξΰύφΰΨn”‘ϊ€ Σ•ƒεϋηКKΤΥ”™ΪΦ<£—f³Χφ­irwΕΎ’g"„ΥΘ‚yΕw«·ιiKΥώ:πŽ-ψOϋύqΠχϊΰ HΜA^œPEΔΗ„ͺΕω:IΡ&=ŽAάͺ^£₯bQ«ͺYM”ba}‘Eωd’°I‘€xΛ]49Ι ‘Φ“°pΕΠV•vl‰"ηΚξƒIRΧΟόLΆeŒ«©a‘E!Ÿ₯œV›λ,QS ˆjLe˜ >+ϊ™ ’«u8ΒΖαnB ¦ ! 6“‚ρȌ+=«‰ xS’β€(Z<Dœj 4L“ΏJ?eˆγ˜Σr@’Έ θ4‰ˆCœζρF§ 9«ΒΥ₯EΊμΙΎίχFϋG£ύαq‘„nρ’Yšr‘––Ai0Εαk½Sͺœ~³Σ–Π ²%B2δiιNDbœQeIͺV™’e…΄Τ.Αη–DβS₯Q}Δ)„/ΒUh!‚Ώ†•ΊΊ1e~c ΐm{/ιZΎΠΡ’…ό€ΰ,)³LοX˞–ΨniΡ/έ·Xh‰γYCκΈΦͺ·f-ΆŠ„β±ΖSΞ&r™½XΒ²lΟ0›/;ςͺΒW:mŒΤ:/#–ˆe3ΘιϊjnXΨƒ,²Υ †$U˜…Δ:)y˜@3rpο1Σap‡N„ΠMhΒBšΙφYΞWͺ(a5mΚσ― ꉄΠ”Βq~’Ÿ$ ]™›JA•\Aa1(DyΜΰ3&Π%΅Α‚DœΡωͺ2πp]€ZDB.’F!ψΏΧV€džAEυCpKτή,Δ9›$Θ”©”L–)j±ΧΕyΦ…Φέ™F• –5§>_ο”»^­8Λέ»ΖmGώ›ξ»gΝ}α¦-xΡΈEη.ε‘η ΖιίΏ_ΐΟ‹ 4<>|ΆόΒϋjŒψ'πο’ό‘οϋ/4υηδ}HŒƒ5ή“V³οΗ_γ`3Οϊumθς„£6£€ κ妲‹γρΩΑpθψVί΅8€»ά!žuŒ ΖΣ"λž_¨ΓαΟX0ΫeIκ9ι­²<8|Z$τΛb—.-lœ~·†xΤuϊηζ§‹k5Δ?+ƒEimnϋΝπnHωΥωΆ‘tm;φΎ¨‘.³"7Ύ„k&Ԟ²AδΖΩo΅U€΅_)οR†άrγ–§?υϋ-%―vΘ SQL (Rails)erbsqlsql.erbsource.sql.rubyΩxڍQέ ‚0έJ ’π "-=@κU]υβΟΑMΪτ’·Οτ[l«¨ssΠ³³σo0ή€Όζ KKžΞΘΔ8ιu₯bΰιK•M*%€`έ:Ά4uΥ XΦ­Θ)mv'"-+I(ΛhQΠ‚Θ[…4ΧXŸSEzΡΫ/„fͺ(ΩΖ~zQ R—ΐyΝε ©JN o»D±—ε•χs I†>ΕEŸ΅RΚc—GVyΧ,ί‚΅#߁΅Ϊτo6φ₯­μθνόxaό3ΣŸΒΎΐzZ5θRegular Expressionre source.regexp char_class<\\(?:[wWsSdDhHvVXR]|[pP](?:\{[a-zA-Z_]+\}|(L&|[A-Z][a-z]?))) char_escape\\.character_quantifier[?*+]invalid_char_escape\\[xcCM]known_char_escape/\\(?:[tnrfae]|[0-7]{3}|x\{\h{1,7}\}|x\h\h|c\d+)lazy_or_possessive[?+]?ranged_quantifier\{\d+(,\d*)?\} xΪνZιSΫF·Ν(δ αI€dŒά€ν$SπPB“£”€M'–Β¬eak%W’Αρ₯yW²VZ­v-_Π΄EΌϊνξ;~ϋŽ•λ†Χ.MΧ€20LΩ:x²“_t²§ˆ,Ω”μ{D–ςΪ©™\·d­(ω*°,ΩΠΜ`ω>―½P2τZ•—τJEΦ0^ϋ½vΠk*@ΡΠΏ^;δkZΐ°vˆAίxmHG¦ Μ²lξ#§0Λ€?ŠV‚άh–‘«ό±lΠ€kc`ΚθΏαΘz¦μŠ€ϋxνN‚”΅CŒΑ‰\!ŠQ―½‘ˆL6F qIU¨ˆζ:aœ&2α ’u$HΛKP·Ύfoφ€ƒώΎE°%›¨BΌ8dˆfœ €j‡PΒCHWwm6ΤTΠ‹§;„Ψ·#α'­†`‹ˆξj₯f’°vƒ*ΰ)B «iBXœ’\x†° †ϋΒρ 7K ]―Β‘–nψ–x@υg h–r¨ΘΙC‚U³*KŠƒ3 ͺir’[,˜ΟZ£σUέGΖ<ς@ W‘-…˜Νr N•ΐȐp―^»ΚSR¨Z­«e`T Ωt$ͺ]TJŠe— P-Ϋͺ~"vΥP4ΛΦ4Ι²Ν*d»V…*΅Ot£hΧ]ϊτj’Ί%hXΝΚκVY6²UέTꍽ‡νσYCήY“RŽδSg•¬ηδp9SώπΏΌ–Λ­s‚ΐεVσ–fY΄σOψηβΩηv]8ΚgOWžŸ ΞCY(Ϋ’PΜ€mAΘΪ\nNψtώ³ ŠiΎ£)cΣΈΎ}C9%Γ•{ƒq“ΡˆΡ?ΞθΏ…s€T΄ΈˆΦ}Lθm,΄0D?Δ‘’kQaœΟΠνk­${“XόlWž‡„εΣ!h:Muΐ">d€&&οχZψΑ΄=€$ Ρ}Άό˜”mx•(²―ω+ζλΦ[{,y­’U)fU•K@maΖ>Ζl|‘‘Ω0Τ’„στ"NVU49 ½Mz6S)i#$iΈ΄pWŠΉλϊά βΝ8M,\Puι(DΏ¦o/„<ΧρΥ€»3Šς‘’)ξ-ZF­¨‚D%¨Ÿ₯ΠβΫΤk†„c6™ˆ»h;d q?ή1πσζ§/;kαΒηΗ>τ0<3Π€2 ±Έši¬Μ‡Φ –ϋuϋ΅ΏΖcΆζ^ζ>*‰pΗrki.yCΜ€Ή΄Ν-9OKΞΣ|ΜΗsηQ8‡Ο|ΞΩΊ>–IΏιz'7δChEސ₯šaή39B΅Οb`ͺVΝ@y²*rΆ —4mŠ˜-γ΅ΗΐP@A•[ଏ˜βΗΆ ίίSαΊn°‡Β υTΈkέ 7άCαFz€ >‚‘1”IŠΛέl$cλtΕ#Γ%»Χ βŸ–Ή½ύίήmΫο_οξΩ^mΏ³·~yϋvχƒύrsχύήάΪΪήϋΒΔ ΓY9υ85“ΒΉH1ΓFHG>ΘΣnj9ΔθK9ΙώMxe₯‡“ŒώΫθ#‘r`J)`yzŠ6ιυ‹˜τF “’c†ύχ;˜λ›ζ ν‘΅`Γμχδ£ωΎψ’όκψχ?φa†Pέs"¬p–ό—MώӁ˜90χfΡΞΓ'Ριsι œ.2φ qJ»}B "mqLXri1ηS²όI Uf‚žj0―Wέ$ά±n#$ΝΊω6&,x‰kL6^άΓ̐™ ›…Γ¬^7ΰΖIžΣΈ‡±B°|ΐ=Fθ4ΓOΧΉ$d˜‘μŸ&μAάΉEJˆ‚"ΆLi‰Uͺe°9] ¨΅Ξoό$3>Φκ~π +δΘΐƒh<έbšΊΏΩΦύš09Σ2qΒPDD#„·–_Ÿν {έ^΅ηΡJ=tT}―lΰGA8zpοRϊΒeΨΌο•sy₯bŠΛυΌRwZ/x·'“ΞΑ’+ˆŸΙΓ]#mšπΐ ΐ£œŠ^tOK™Q΅b–pc±ΒΝϊϊeΛΆΪϋLEOΔςr/°5ŒΟ >ψtq—ι ρζžΓΉhRqϋδ5θ+π/`±θθm]ύΘk‘[Q¬S—Ÿ,O1έͺD½¬ ;ΗΡͺ#‹=»qNαχ9§θ΄χ9αάυΩ3*ΐθ5#τEW,€›’Γ—·«cœΛ;Ζ逝 8»ι`ŠΞwΣ(Ά›^lΏά}·μ uΰ;StΧρa‹λNŽy=Β棃ΕGŒΔm:Ρμκ\>b’Pρs?H…h!ϊŸM‚‚Ϊ`c3ŸαΕΖIxˆΉ>sνŸυ]€#lOΪ[΄‹\^8αΕ¦°­WŠ8~/·šˆOrgk52nήOΌ+uΨ~…Δh¬\“Ύj©b]Vφ>y球κ] oγ«’].ώ%D<ŽJˆ«"qUB΄TBΔο¦Λ*!β9Ήΐ‚Άψžu_BΔΛGLΟXώ!Nθ=ϋ/™&©ΊΪi“Ο/#οηΘοΛjZXRΖΥ‚A}Εγ†nΠ‹[7έτΎαmϊ}!υΣ§f/6ηqνpύz3bϊ‡aΆ’T-ϊˆ¨Ξί‡9kύωVp pƒ·β„¨œpžΟeΔ\’˜,ΒPπEq{ό -–Ο-gΔ‹]ͺ™θ—υΑeΔ^}pΩΧ+Σ0w"ε³ρθκlCv91C¬φ6§;κoY•ΰreStructuredTextrstresttext.restructuredtextxΪνY[s£6φ-ΩΛ΄M;mg:ΣM6iΊ­0†΅7ϋR·§oyίGΛΖ”„‰ λ¦!ύν+0qΖk<“Ι,‘GGη|ηΣ9ΊΌ¬­ŸoΒφ\5-S1ΜΉa"₯{YK>ΉR=*U/’zG₯ERTͺY$υžJ΅Βφ«„ΤB5ΜΨφƒ°= [%ψ~™zϋ,ϊκ`ΥΖ—©ΧTlmύϊΒ`|9!…­f™dyD6ƒkVDΒP2$‘ξM!ω\=Ο*σœCΤΔ„‰ )QΈ|JŒΘvΓ/]„ Ξ"Ÿ¦»@vήz«ΕαΑ«1lTQU‘oUlOΌOφA?Β}ž2n§‘|δU[_`ίφ#–λ0ƒφ[>ΪΞέ‚μžΆύ³ςΥӏ§±GρLΨXŽ4²Ή’F<Šr΄ΧrTUX*sX¦EΠπΙqœ(G %)›ΟωlΨu’GριOύρ³έΩ#²fbf77šLΙΊ„μ_†gqψί$ΧζaΰΘEjnqΞuQlΎabd/m„‘Ύ‘;¨Š=§₯šϋ°ό?=%·ϋ‹„~„ΐiΨ’›ίΙ¦Ί@2V―Λ;/[|e Ή^:n₯$v˜d‘(Di,ff7^¬Ξrv\nn0-_[žiƒ‘8xT¦ΡΣn0Oςώχ¦ήΉχ‹'ύΝάύEη ύ_αΎΧι= 3*kΫoͺηΠqϝήΫΝΣ—=r ο<‚E@&Ι4Ά•^–M4­'*…·f™‹ΠΨ•α π†\ρεͺeΗ¦%·φ 8Ο(Ruby!rbAppfile Appraisals BerksfileBrewfilecapfilecgiCheffile config.ru DeliverfileFastfilefcgiGemfilegemspec GuardfileirbrcjbuilderPodfilepodspecprawnrablrakeRakefileRantfilerbxrjs ruby.railScanfile simplecovSnapfilethorThorfile Vagrantfile source.rubyl(?xi: ^\#! .* \bj?ruby\b | # shebang ^\# \s* -\*- [^*]* ruby [^*]* -\*- # editorconfig )bdigits(?:[01]+(?:_[01]+)*)ddigits(?:\d+(?:_\d+)*)exponent(?:[Ee][-+]?{{ddigits}})hdigits(?:\h+(?:_\h+)*)heredoc_type_css(?:[[:upper:]_]_)?CSSheredoc_type_html(?:[[:upper:]_]_)?HTMLheredoc_type_js#(?:[[:upper:]_]_)?(?:JS|JAVASCRIPT)heredoc_type_ruby(?:[[:upper:]_]_)?RUBYheredoc_type_shell(?:[[:upper:]_]_)?(?:SH|SHELL)heredoc_type_sql(?:[[:upper:]_]_)?SQL identifier\b[[:alpha:]_][[:alnum:]_]*\b method_name${{identifier}}{{method_punctuation}}method_punctuation(?:[?!]|=(?![>=]))?odigits(?:[0-7]+(?:_[0-7]+)*)path_lookahead+(::)?({{identifier}}(\.|::))*{{identifier}}Ω!xΪν=ιzΫ6Ά²έNšΜ€Ϋto’ΚqœHv€Ψ]§e%Ν€“€‹»‹ŠJI΄Ν†&’Šν„ΞLομϋΎοϋ™yƒϋ}χΟύ{_ΰ>ΕΌΑH@€‹BYIΏ«|1AπgΑ9;π―Bπ{=§TΣ2[mΓκ\τT[]Χ\ΝvZsη μ/~Ï‘η£ |ΗP§’›kš­»ͺΩΡBγ) θy/›ΐZ_ΧL—’όŽx8’ߝθyg:1α'IŽ»ŸΔ€w‘η `WuՊ£u\Όμ»“a {ΠσAVSmc«βΈΆnRl}20ΙωS)€ {{S?…οNό4Ύ'π3η8ˆ~φWfqΐΟaΰϋ…e’9΅§u+5ΥΕόiτάΟΐκ] ŒϊŠl¨’v:šγX΄υ=!)#Lϊ$›Θ†Ϊ³ Υ€³ΊV§bχΫ[!Ά‡2&$Ϊ0“ΕτHΚΓ£BICΘ¨B?– Kς}\Xά,,Ιx_rΖDχχ'ΓΥ? K4‰dX’ψΕdX’χ“Ι°Dν&Γ~ΓN%Γ>aqς`A ³fu+mΥΦ„5Τt–T€ΰgIEJυH–T€|K\Ω1©Β@ ͺν†Œ•…FI&˜I™€a6eΒΡ” λ•” ˆ~WΉκ€NrzŒ3ueuϋ†Vιj υ`«lυ9'l ˜šγVTΓαζγαˆθžδ\ΧΆΥΞeΝΝ—0Ϋ§R€S•ΕΣB·Δ€‡ΐΟMΜξτa½Eeό,WQ°†»κ$?—Jεϊaƒ‡€†€ΟΛωΚ ™ŒΜ)^S‡ ‹Bj­žt†©}kB@[[Υ6+NΏ.%­©sν P£#Ήˆ#Fϋb,1Υ“±`Δ@O yum f4dβ΄πͺjλjΫ Ή=#4ζ Ν0*—MkΓ¬ΦO₯x =q‹ΌΥZWu=‹ž»ΘWί±βΟ|³P]¨Ά©πχ—Ρs/wYΫΪ°μ.ϊ,η ¬Kκ<‡’ο>aΈ _>ωz=q‡Εο#Ꮿp:P”+Δ€― ©ž| =χ0€& CΌŽžΈƒϋVψϋ2zξ&ίQΌžΈWAχf0Μ›\10Mq τ—έΗ0o£'ξοh›=4*’Ν;œ—^ι›>-•πύΥ^ν3ό½Λεˆǝ°XήCΟΙ(9Τ9@%έξΕ θΉ/.‘‘ƒ„ͺΣ(Ψ€iϊf,Ί&zˆOΚ!ΌΔ‰§ZsΧ L = `βEπ>zξMΙ‘€’η!Q’!΄Ρ󉄴Κg(8ΩD ΊθYŒ@ΔK@CΟΗcqΔ¬HΔύA’ ¬JΔύAœ¬qΦ‰υ Κ!λ½τβ%πD/Ή€U—ΡsZ˜*A†€°"‰9€λc€Y cJJΒΔ Β’”›’#©'1?Q‚HŒOΛ‘΄% ᬁϊ9…πβεΰJ‚KΚQΥ—(D*AW% IΜ!ݐTΞ²)©HΌΆ$Υ“£ηšLκWEp]&υ+qπΈφJEάβ6zβΎp\ ί@OάΛ!H1-šIΘύz>J`%CX8ΑηΉFQd$ ~Θ™a°"hVόηΖ£‰H«'ωzξ"Iͺ†Nό"'YΤ*%ΙΏΔω"zΌΓ|=ρ89έ„ώ z>DΎm΅΅Š¬ΩϊUτΔΝΦ ½ŽΏ~ΟK8Z‚‘ΏΞ•Dd¨~=–V˜V7yύ±όυ[θy?σUΤ|ώ6WΩΓφ0DΆ ΏΓ• ;ΐίΏ‹žws߁α™aογ{œeϊώθϋθy¨’c°Δ‚”?δY##βG\QRc ΅1η£ΔΠ,Ϋ?α—JCΨω)WX4 ›ΫΟΠσ^$ χs9Vσ τάMΓΐΡ πKΞέSƒ*δWR‚ζΧ"`ƒόF€xψύ6ˆ ϋΗΑΏη¨ιΑQŸ1ˆ?pyQ πGΞ•‘όωO\i^ ΆΆ:ښetΓRϊ3—ηΟώΒΆk«Ί³BΓύ•SbŽυγΨ#ΰο\vTu(¨™>ⲋ8ώpβˆƒ`Θ’ηΏ μΟΐ–BΗ¨V}Χ] c΅«­¨}Γ5ΡΧͺ°£2Υp ΘΦ6U¬.U00 ―š°oμηT ³‚Υ ?9œ ­tFXž₯z­qTρše…ˆ– 4ύα»’ψw$΄ίCΣξ’Ηiψ—BK εzIi7”ήυσΫ­fπ.‚—₯]Rͺ)ΟΘA’dδCκ=€]Y3ŽΗs„©°‘ζnU-θw Α±!λΌΏSˆϋΣ‚Εꆆ•^ƒςGa|'¨›@ώ”]ͺ Δ_ŽD]T0έΤύ FR™3$νηH~C«šύυ6τƒ&O–‰b²QγœΝrGƒe~–%‚EΒwΆΦΫ–Qu€χ­•+} ”C„„q‘ΑCIβ ¨ ²Β>XQG₯‰s;ΐΣ ΰΤ°βj0$δ3‘Χ]«ί–s=!βϊΰΰ\σzό‘DΏίζPΚΉγκ«ΐχiiŽΨΗυΩOH:%` «b0VΏΩ2]»>wτΩmL_™/ οΐδ;U؍Y屦mͺ ₯¬―«UΌ,ΙΛ8·°δwhͺΊah« aD=ψ²Γ­RWΫt«ώXLΔΎfC·Xί\7ΌΕR]_€£wΐ_z“§^9ωΖ»―ž.R‘ε‚]ž{ψΣtΐlͺ0nW ƒcœŽ`ορ'¦ƒVŸξΎ’(€ι΅§Sxbζ‡γa(Ε]ΔЏx ψ b鼍όω¦ψμ>Β±?ƒ˜ό l>Β²I€+εχw’Λ<ΉΉCμήFYh?έ16›£dσ;Ζζ(ΩόՎ±Y%›ΏΝŸΝ1Ϊӌ6ηwšΝ uΜM†Ž%iτψ\Ϋ0"x¦IβeS1]ΔϊB£>Ωτj₯ϊdc©Φ,—λΪ…ˆš9/Η%ΈΕIζ[fΎΦ‡Ί»‰όΚtΗκ۝ ΄Ψ&œ¨ιΖε§Δ)βΟς ΓbcŒΞ5–Rf…”Ύι0λ›Pc/θρ‘y₯jΏFœ>N9o¦o‹6E¦ k#ΚτΨxώuγ}₯ΚΖνtωݍ₯ύB¦©nYLŸ%σz[4σ.ΰ[‘ύ”sΑΫΗ”9‘—‘4Λ7νev/£”sKω͈ı”§8–rΗ/G$Žfžβhζ&ŽοHΫyŠc;7qό¨ΐώpž³΄Xπ’ί›-Ν1dž1=\Θ—d¦Έπ<œ‘¬―/*{£/€˜:ύzAβ›³Nζ)χxL wGƒ™BΑΗJ»τ±–φώ$&„ς%6]J9ƒΊj[ύ^΅­­κfΌ΄ΏQόRtκ¦ΣΠ p+X9δ£|7―ΠΕπΰG3h `xi†^Š,³pΐ΄—3E67V”Q“Φ…¦Q±λ>Κ)ΜιWηUύ˜Κω~!ω˜Κ;ι$xΝzΙь•rI©–K™†#½Z­Vχ–ΰ[έ[¬-y‹ElL~˜βvٌ2 κ7ΌFeΆyΌξ) ₯Y«iŒMpΔγηCΌ71Ts΅―β—xjZ π‚hΠΡ ŽG…ΡςΈ05*.QI}“;ήφ9 (RSSHGNƒ(ήBLY–αη……²Λd¦RO/@Yιβ °lΌNfΰτԎΈŒΗ—±ΏΆ₯cυΔ ’NΒαΚ0Ψ(‰ΤKΩ–Ž}š6VV ΔΛBάδΊ1‘›Θ½1¨;K¦*²ŠJ΄|G΅mu+grξœ§cαWcΘ9K-‰Μ?JΘωa 9γΓ#ηϋ™₯°=L)ό"³ξ,Bw~•YjKΓ”Ϊ―3λN.δό2sa•GQXΏΝ\XεaΦο2V.δό&-Z\Q)N̚πhM.„­QΎ‚Ÿ“θιӁA΅_υ‘₯œ²Δω‚DŽη91ΙρXwTτΒ‘—ϋωʍΜ`'–4]ϋςΠΜ«ΊmωƒœdvΪZ‰’υΗ0Ϊϋh΄Άv₯―Ϋ ˜Βω2ŽΜMm7ΛιЊ²\_ΐΒήJ­@£?Λ’ΕΩ8`†o<±ΰ·u27iΔclα₯Νίηί%xŒΦ€ΘHάϋ„PΩΌρΤ™ΜΔMόˆ¬Θrςρ›Z!ώ”%ηήIL³VK)/dV}₯έ΅Bqξη¨οΪ–AφK†nD„ύ«B Pgμή€Λ>ŽΉϋs~ν‡jk »³Xζk*HŽœ»[yΨ”?ΐ‰:Ό‚’Ji70_D2‰ΌΚ«—d»­TP;½‘ψυ‚HγFƒ³nΖπ‹q-€ΠΜ©ΓκβΤxfΚΆ@γiz ;}Ο2^Km=xΓ₯š?σΞoήLΨνLΝΦΛΤ–; WΜNΝbΰ©t¨b‘άΗοCtΔ3ΔxKΎFχ·›ΚΖLΪpGΑ:zΌϋ3>5e Lω$o=Ν±»‚C?r$±βƒ3Nu<:ΓWeβέΝα ώB΄œiϋr!Mε½/§©žkχ5oE5­ ύπ$d ΜΟe4Μ\&%˜Ω0ΣV«tζάωΣήωsO{§/ž|εΤΉ‹/•[-ϟ©•γΟ—R8…8ζ›ο4αL ²6 ώΆΐ£ 4ΒλΰœδΗ‰’;šΧU`ͺ½ΩΣ,ϊ+ΕΞΉ­:βiΐGEu N%šωΓ%Εo>₯aŠ`a½¬Cω4ζ*Ο5}!±”¦“₯duάΫ\>%Z>훁xζ±tζeΒ9œ,œvπΈ₯31F€Sί\ΨS,©€ΏΕβTq;―…mπ€A(zΕωͺ‚7$(ΙvO5Λuψ’tΣμBΉψHœΐΖ‚(XχΌ†€§%Κ"ηε8­5αΒ…:’‚ >ΆΰeO9,ψ#ΙΟψ]C*ωƒ±-$š„‰¬:sΗΐ¨ξ@Ϋ>‘•Ό]7₯’λ ͺ΄gd₯4χ–HE1>jS§&‹>Εκ‘DV)o 0y0η.§¨Π‡΄ΛΎX<²X_ΐ^”χWα/{γ#ˆΓ‰‚Ψ‘¦Ο]X(ΓUZ†¬œΰв¨¨NHΪ Κͺίγ S”'¦šrŽωΣϋD_—Β•cbi?—?΅ϋhj…>+M'‘:dMΐ–³pdΠΎ΅°s͌‡HζŠdƒδ°,PK}Ά_K~σ8Ϋh?‰ΏϊΧ‘%ΐ~­Β΅₯ @VΈόeΑAυ"X |χW αγΗcκΒΦχž, ΟΓ–J πλJT«Χ“—y?Μ“nNωιAHK:ϋmZθϋ™³ίΨΡ>‘jέΕ¨Φ…ρP΅ŠPA7pͺ<υzΟМb RQDEL_j`pΦ)`uεdE…^W.„0²Cβ:jΠΙT¨™N6+^§\Ύ>τΙνFcAu:ΊΎΠl‘ϊψ ¨C*2Ž­+›σΕ ηΝgηύΘMeΝΟLi½HZί…S©ηŠ(υάs80œuΞ―!ΟΙrB׏Py™8―6(ώ·*0Υn‚ͺ<ΝF8‹Ύϋγμρ“€–P‰ ²ŸέαA6Π(Q mƒ¦όΣ ιψ(ΈΓΘzjΫΓυ’ׁ§·½jy`ς8zξ₯Β4]oHβ_‘ΔKEIόEIό—$ρ”ΔC5Iό_$ρΛ’ψ7%ρΫ’ψ?Hβ/‰Ώ£Έƒ¬jb¦qΌΈΨ¨άh6ΎF b3―­f«\?ΉΌ\φ?ΰZqŸ€φC‡ε3?g²Ϋqφ7qcxΪΗ°pDDώ‘‘$’^ IΏυ$ίL$Bώ-$υKqdq”Σ ;š-μ8Nδ Α±;$6ψ9IόηΉxάόόO όΫC€}<%ν"σ¦EvFεG·Ό’hLτΓΣΙ~ψμΏΠΌŸθφΗ;bŸώΡψ5‘φΙxOωϊΉWί(Π1h‰Ža&ή)G™§XId€ο‘o₯RYMdζ°ά]ί*%²6 ߍΪV ‘‡œ!y£Σϊn‰9“’Φwί‚J"1Ρw?(πέΚΖμΑ‰Ž`/ηž!½£±χΛ‰΄ήΗyΰΡΚΦH€w7εdG'Χυ<ύhΚγά€Μ™~˜³HKηX :wR>έ&ςω¨'¦WxύΝί‘[‰vœ0ΰΣ?Ϋξ%ž00bΩ_I€?f\a„r·στ©in“ΉιΦiaJο “ψρŒΔΏ3 I~t;Kς£bύt%ΩOƒΧε³ήςΩΣηϏ²sλ&ϊŒιxΝπ1ΡOδ‘ο·o‘²Έš‘ώΉΛa#O?ώkΐΚf aˆ―nOα–ς§>­'Q™?5i[Ρ·¦Μ’¨LτΩ)ΦN,Ώ6Κi£­Dχ°v’?Οp-‘τbΌ‡­δ―'’³vbtRχςτΗά|ΊseήVΉ7gΟ’†φ΄ΎXDcή΄€υΔ·’Ό’hωα]’Όή“Δw%ρ-IΌ)‰— —oJβυ˜“RžBΟ…xΆM–έ>εΑŽ£gŠ™&ω‚ˆ.₯:0]©Ί—’σ CΞΝ]Q+ΓΑ^KΠͺfγ@°%maΐ²‘­Ε£χ-Œα5θ—g¦€Μ—ƒc3 1Κv\ v~cDΠΜΜΤTΈ¨ ήιΔή[›b…7sΈ}έΙTγψ!κTEYϊ‡ 1ΖΊ£œ*CΧήΚΘ΄ŸFξhΐ羝‘:Εy‚Dr:·tΝθf€ΣOΓgI!S_­ΥρόΏ-0Ψ±fuΛΙ₯ φ“jL ρ” ›Ÿd0ί™5»žiΉžE)Ε; r2Άa­κΥ°Ξ4“]Ν`z”ζλΕΣ/»θΎxͺ,w½Β«A£±g‘ή8§%ΣόFΦυό–XkUΏͺ™e₯Ξσ…ο$Ω·ϋΊαfk"†ΪrΣbόzΘ¨fŽ ;³―½}YΒNπΗ qψςίOx,Ύό7ΥοΕ—Ρ|{|ΓΪ]ƒ+Π΄NqjCΐX”HυΚ†£7‡ ₯“±ψςךƒ±ψς·Š©X|ωkι!a…π KMχξŽΦXjρOάφϊΈA,ρ]2χ8Ο-β†φ B1χ2!;ŠΧ”œ£OσΔ Θμ"U“ίlΑU₯ό’ηπ"κ¬G‚Ώϊ…nκ°WΛJφ˜¬dχ Ι\Λ²K"(t9Ο ή”HPe I˜νΚ”i¦΄¨΄ Ιiάtaο)ΉU U>ά<< •‘Sr;«A\βΗ¦b…’˜‘©] •½ •­ΘTVξ6#“5τν'₯d”εΒ@moˆτs¦™Œμλ…˜*Qxښ^·Ί}8¬3Ξ){&0sΏψΑ˜Š‚…”jΐ·ωˆΉπœe*Η)i&\ΰ>ίΤέ=s™,§¨Ή™Xωc¨υ—…B–-%‘―Μ φxήΡ/: ―ΓjΫε€»pYα(mUΫμցg³U{«bk=P„£ͺ²Ϋ(ζβ₯ Νp"η|¨:― ΏTWšε:ρ­μΞ |΄{%Ε5ζK V0™F/b1°[opλpuΙSœriͺ¬8†ZΉv’ςή\εω£Υ’βΦ'+M01Ήy}nn»ϝΩn6gΨ­-Έ6ΓRΊι_Χ|Ú9~υz†['2ωςc΅›hŠE/΅CΌpgΟ±δύμiο„鏳ΌJIqŽ<̚ΉΒΒ €γ2Tω/n8!C•:‘e¨ς_"r’AE–lΨΓZ=qͺ ωEzd&*ΈYžήSjLΝ)•β¬2Σ³ έYεPΉŒ/&βSΕC]uφ”*uΏ(¦ψMAλB_ο―Wΰ:Οβ†ήuΧφ€ω‹’ŸEŠL¦Špۈξyμitu«ΏωΞ©WήΤN―œY}I=Ρ9ι,χΜ«ξν·ή];»~αΪ{ΣM”΄=―‚ a°§«ψΥ¨άeg`’΄£­YF7:ιΟ‰SΆ‘χ-IόŸ$ρ_–ΩνΉΈ‘*ΜΕ%φσΐγ…±tŽK0.j/ΐ­ΗΚώ€ζd­\₯Όε W νADμιX₯SrμNl΅—”ω ŽΛ²ο?Ϋ.Mω$!³τ…μ»;^FUσ¨χέE—Ώ—Ž‹‰Ϋι}wΚΰΆ;e;Ύο.$ν EZi;ξφήχŽxΚ¬ά£wŒ)σΕ;κ½ΰ)U8”γ΅ΐ(“§ς”Ί·ΰτ*9΅{F?gτ†΅Κ\J†€c­ eΣΓ`ۏ.ΎψVYi$š>1α‘ ;E&†1ΌPYΠί†Εξ{$Pyΰžwφ”5‘.λ†d›ηsΑnOΗ‡ϊ>1p†ΰpΡQ*ωHλ-ζΠ†p{Gu;kΡEμΈΜεϋ‘ό„ρΝ’w"Š‘BΤVTέπl pyξšmm”3ξρeΑξρ{οΟρw,ω2 ϋJΘͺo%ͺ‘_ΣΜΫ&!PΕ‡α­‘―#υoΰ…₯3Y―5©›xonλ[8 hΥι·b@*₯ /Iυ(¨uhάώWPΣD?Χ₯ΩnΛ‡ςθΣ’#u³«mA› ;Υ €0dό—XΪC©c ƒ&QΛZ‰Da7ΫB•$pZ*_lQiMδlkNŒ~·\+ΣZΧΑhƒΉŠΏΈ*<Ώ θ›θ;~{Qsž²y~\(ΏZςPΠ2΅ H i64Χ2ΡF<τQ‡KL‘Νuϋ½ ­¬΅b!#@ξΞ―ؚvMΓaλšf"ΎC eœ’++UMϊΙ‘~B\ι£Θκi.‚0²Ϊτ-}C΅Εΐ‡ΛEϋξ˜Ε‚9D*ΆΆn]ΥZ²‘ΙΈ° ¨’ λPΪ†ƒ¨΄|…#Ϊ Uά)Ÿ΅ 6X΅ο‚v•Z  ΪαwmSw'‡g*+6•p ? ΰ€/Fξν ‰ο,ΡθsΐΐW5d ―«ΑœXπΆμwƒp«& Mk΅π{W·Γ— ρ»Ϊœ‘ Ϋ‚Bπqomΰ’Hώ0χN' cŠ‚pΛ°:>iΨ¬ΎHφULΈΆ©uΒ@mΩ—IhΛ,Κ2θ{πFVJ†Ίήξ’Z;δI†nMdLΔL±ήϊΑb¨ltnBΉΨjhjŽW³o ΅oθ—°‘ƒlΤ > Έ‘– /„χΫi(”+’Τι©&R€:!5a5½εΐ!/`’Ω¬†M6ΐΔC^{‘ω2Ÿ6TΫά)cώwA^ΓH+WΏ3©qƒFs€†Fn Η#λΰ³Ξ;ϊ•υβ‘ο΄οζ?rΎx˜ΥυΑ ±gb€‹ς‘–ͺ=Ψ›h­hͺΫ·5RC‡f‹ή‰ρrB*W.ήΗ;tΉ…iύWΤΜ‘£τZ¦…AW_A›‘ΤΕt”&hH ι²o­ ³δZ¨DΥ.I„b‚Š˜σ7υϋϋΛƒΨ  ŠG™ΒeφXΑ4A™ Xk`’eΪψ Λ[―Σ’οN ‘, ’Λ*ξq™+”7υ[7¬κ°Ÿ R&†Fδ5k\ΩίΨ>Cargo Build Resultssource.build_resultsΙxΪ…‘½Β …‹ƒ›`’Ck#q•…½―PΪ†V4$…&@ίޟBƒΔŸ³|$ηž{/0Ν-«JP.³θ]‹ΡΥ†*γl`9³τ£ΛiτYΐΛΫ#ΜFΑœ΅₯ξzΥ0XχΌ=WŠιΎ5Ϊ―ϋ.γμ_Ρ―q ΌΪΦ²Œ!ΜKDd±OPœ§"Mv'Œπ&μΟ€αζ% ^x˞―ω’ΤL©N‘1ΏrΟΞ΄¦W_Άt~Ir˜’"Ζν|iΣ ρX`ˆέΩ8θRustrs source.rust escaped_byte\\(x\h{2}|n|r|t|0|"|'|\\) escaped_char&\\(x\h{2}|n|r|t|0|"|'|\\|u\{\h{1,6}\}) identifier1(?:(?:[[:alpha:]][_[:alnum:]]*|_[_[:alnum:]]+)\b) int_suffixes3i8|i16|i32|i64|i128|isize|u8|u16|u32|u64|u128|usize support_type\b(Copy|Send|Sized|Sync|Drop|Fn|FnMut|FnOnce|Box|ToOwned|Clone|PartialEq|PartialOrd|Eq|Ord|AsRef|AsMut|Into|From|Default|Iterator|Extend|IntoIterator|DoubleEndedIterator|ExactSizeIterator|Option|Some|None|Result|Ok|Err|SliceConcatExt|String|ToString|Vec)\bqxΪν= {ά4NB -p|S(MΪ¬“μ¦_”^šdΆ\α8ξΦ›œwΧ›ψκ΅―·iˆΒύΩχ‡Ό’mΙ’,Ω’wΣξ O½±Ghf43δΙυvzΏdϋΏcGQθvΖ‘Sοڞ·sυΑ^―‹‘GδLδ5 9›ήίe ;φΘνΦݞγGnίuBͺκ9!Κ/θ>ͺwƒΑ‘ ŸS&ȜJοo°Π#ˆΊΏ›U|:½Ώ”Ν`žΒtχμ0ƒy!½ΏΙΒxΑh:υNΠ;Θ`Ο€χσBΨ‘Ϊ'bˆuV΅!Α‹ͺ%?ΰzχ*["NJ—‹αΒο98Ω~TwύΘΩuΒΊσd:£‘ ί‘&^αξIΡΎΟΡcπ&"αk ΐχΧ€ αήŠ~?vTνύœΜ½)=)ΐc  πγ;!ZΆΏλ9#8 5.½­UŒtόœV1B‚w΄ŠέxΐQŒ%w0τκYgΞ Ησΐξ†A=Φθ{₯ €―ο—‚’ώ} Τƒ)(#“–A’ζ/”A’Φη…ς’@B‘ιξ9­€ 9Ά'ΐHf…Κς’e‘ˆ_6t’qθΧ£ƒ!₯]?V •DδpšηJ$ιΧb$‘m­ ’«YyC.•A~Œ!—Λ oaΘ^«¦,ΩλB3 ‘Ζέ¨ήυl¨g»tCšΠtU¨ζRθΜΔgΥ_šΔ΄@4z”\+‡%ˆ\η†z‹„ jš!*7”‹Vn*!²τ1ηSμΐaηϊψν-Ξ›ΨA|#όϊŽΑvZ™z0tB; B u›‡b\< υgΞmΘ6 ±ΖYŜ£†ο€wμRŊΏ\ηΪIό1€Ό0Δ‡/λ±a¨Ντ޽<€|π»fz‘z—ͺ ς)WyfψέgώθiχsŽ%©{„_ίMο/±―™ήγΤ-†nηv݈ΎΟ χΌ;†!Ώΰθ†! Š‘ώ’ή±σΙΣυKN† œ/\δ+JΗAό‚!~WŽ&Ξ¨k^fΩ Ν—―Ή±χ;CόŽ1©λ‡_›ή_Ξ^χœΎλ»Υ“‡œpB Τ!Αίε«Ιsβϋτ~&b™πG1°,‘ΖΗΚΤΟKˆBšω‘9χώGšv1ΠO\›¬'†‘ώžήΟ ‘ˆΏ†Αζ†nŒ‰\όƒ£vό’aΪ?…‘ν΅ΥβH;‚tVz…ΘsΎΝq;”ψύ6'Ÿρ{N6vDMeϊƒύ‹λT Ζ°ίζ‘I†‘j‡Σo”‰AΊœq€@rLκqeώ$†p„΅ΕaΞάτ9acάH ΄Λi΅Θ‰μΗvθڏΠb/½ΏΚ@ΒΡ6p}ΊY—Sθ΄ύwzǞ₯ΐAν‰lΧ#{ΫoqδqͺΖ:TN&1…€Ο Τ•uͺហ8P=ΰκ†A l0ΐ«‡sΒ1Ψ/σ "δŠrΊ1Ȉ«$s81DΔq*ƒ`EsΜ©q•Ηm“·€‘}ΣΤέ£…υ §ΘXηCpΚ3η”bΐ_Ή‘O;˜ζΓ* κœc8ω€i{ΔΙ§ΐcΔ Ώ₯χμ5Γιe4”ύ±ίEJ.vταxΝ3Όπ’3)vΌG8Γ~T΅νϋδ/¬<7«+_iOμοΦjΝ5ψΛ~}ΤnνΔwψΟ·Gν%°Γό½lZΣ¬Y5“΄2+@]8¦€•&.‡‰$]ΚLz\μ,ΆAρc[\S%Γ†±[α‰ΗΦ‚L†ΐΊNμœγ]b›ψ¦ώΈ”δθ7C|• λ ™° ”Θιoή8]ξΉΎ£iκfhlΞlk—MΛoζΡAΧ‡βf‘jΰ,hοXZ•0^_‘™UέJž_ y»z:λHQeαΆ?*PΞm,ΒδyͺBΊ‘/eš¦‘ο!r­dΌκΞm„Ξίλ4n$rP[3cKa>W>ήgΉŽγTν C€¬ΞΘρϊVG_ύWΥτˆz°ΔšYNΑtf΅ €_Θz•Œ1-ύΟ<—›g^YŠ'φ>οΑΟΠjzSΰ’u}š.ρ’Z3 ηD\½x\»mV[–™˜sΒΓBΦ‘ΧOΗξD^VUΜha\‡6^["γ₯ΨCγMόΓ,¦qΊ”C›!™V™ExŠGθdΑ4\ψŽΖP”…lή5$άϊΩ_O‘“2ΧTp„‘2΄β¦Μ¦B‡ {eVfNv|H(5ΪsJ¨ώ/ΥyΫ*ΤδρͺX>τ˜9ΉκξχΡ\₯Š8š@s΄7A7«„tΫs•˜TpŸv7ΝgΫMaό(‡l•Ήβ<ρHE™¨ˆ^T„lΫ‰‘Ϊ€φi Ϋ>.d?!›¦δό¦Ήι3ΎHL§fΑp†Β,TgςΘΧQΌ¨&± ‰-Ψγj/ρ>rΖI]5€“8‘lm/-·›hFΩ‚?L³YJ uškΡbV₯ΏΪ:5Ν‰Α4‘Ή1 d>€%Δ—¨<ŽRUpŠλ@.ΥhΙ:V'ΞP‚YdΚ ΧMΊ‘t]&݌§Sqš-Π*ξᫌu zcέe˜œώž€™YΦR±/x[F‘qΡψBۍ”C»eU3³γΧl¨)/QΥΟIͺώRςό'ΙσΏΡxHδBΖ”–1y?fKϊΑΤ»RŠςPš{$ό̞…,ήίъ #Η#Š―γˆM°rJ&We+-2°FWˆm΅Υ© Ηh(YΎ_­ ;ε˜Θ’\Ÿη ]ov‘½λ C'η ½«Ε Γeλ£.τƒ(rN§QΣ†V£XZ2Ιϋ„^Λκ&nšɏδN εΙ―­’«Θ.ΔφλW€ŽΨ0ˆ¬ρ+·β!ωS…αl,Œs‘€Ζ₯_c΄_€Τς:*:^2‹‹=™‚Φ.3|ͺ φ49MaJ‚ΖjΦΚLqEF웆&Et¨=’Qnβpϋτγ:ύ•yž–HIΖaΧΙMΕΛEnδ–ŽΒR½3†ζ΄ h΄JΜ4lJ²Η§Ήx8Q"ΈjΆ»,†w―ϋ”Ν˜ŸnNXΌͺ-LWIθ.K΄VuρE’„.-4!‹ZεQ΅‡V’Ή_%&'#ώŒΞΘev1`χϊ‘±ΰŽvΪι$ͺ=ψ'V܎¦ΰ½”τzPΖΏ›Y₯ݝΈ6/« €v²7K;ΥRΆ›%q9O…yΝ Ν±·ΆVξd°kΒ7H[zώδZζKŠ“ά₯ωΨε©κFI¦z|Gb’O(β(ˆ‘WΒ±<^šΐ―c„²ε‘Ί«ΎΐΗΦ~¨2p“jΈΔ²Y6Ο/•Ο"έO›όX@V­₯Φ‚΅Τnm[K«ν*iϋ2‘aζHdxΒφ¦ΩΘ)£ͺαΐΗOΤΰ¨_Œ‡Zk{Ρ²Ϊΐ²jO¬½ΓλGΐ!ˆΐUp,Β§¦Ή¨ΎŒΡƒiŒDdNjΕ4HK–›”η+Σα4E‡‹'·ƒ§+w›Eƒ±uŸ_[Ήu‡dψ$έφγ~ΘζSŸIž7su&Wω.ŠR*… Š›°B₯ς‹)šΜH΄κ_ΟΎ¨B§œϊ<,Ÿήά7d…Λgτ)­"·<_ΧΉχ'uŸ₯ϋ¬°1†i½Ϊ,αιf€3όέg€ΏhΕE΅‘X“P=›gΔUΚ&‡E„ς8v ΐΚ³H-—‘ύ%‘2½’»oωeBγΪ`ΠιS§Β(;UΙν̊iFΘ¬Eͺ½eνyn߉܁S ^͌L”ιέ{††u­4nŠX]m-LΧ~Y8xWW§ΩƟtθqJBŽPΙΤͺF>„ˆΎΒ`7α–†χyE„7H΄Cb²νε’P™§ΧΊ—?Γ»Ϋ­ϊςG«Km~yN#@£=8lπ:‹rϋŒΒ ™­TŽH§;ω]})YΡΡXv©Ϋδ\¨IΊt₯ Φ!?.”ΐϋ™ΊF©j½–ΥƒΡ.³iυ¬Œ0¦#yuξ·[Λυv3y’Aš΅ώλ λ&΅΄;'1fόqg <ˆΧγβCΖ„M‘ίΪ»œΦgmΈ»ϋ^aχ‘5i˜ˆP€=—ULj%„²ˆς‘šύ ”Rλ6Ÿ<Ο₯²UΛ>‘A-‘N~•™“’pΑ{BŠN'Šθp,A™Ηπ‘a!ŸSιΚ$kΰ΄&―•»;ίͺf`2*m=Ι―J+MGuη(2Zό`‘©UKΘXφΪtΖΕ)’j-Ύeˆ@Mΰι²²:Ά bΚ«υ“Ρεωc§‹ώ&©ΜZ!eS‚ͺ–.Μ'Θεϋh…P(sgΔ ΏC”d}”mjΡφ­ώocυĜ^—ζ·†NwΎƒω½(­φ‚ΔΧ=ΖMƒpwuυVϋƒhυ¬uxv~ΊΛ@7’ΠDΟ’Χ$x$ξŒ:=Ηs.μW\’ΦhΆΦ7·Ϋf“-Ρjυ]Οk۞»λ·cΘΨεΤέλRSΨ|kρbq΅)F°u5yϋo]nšΝάϋ}·νa˜F,δt6³V‹σΓΠιΊθ°\ ΫΤ'g\ς™PΊ™\ΰ…$CΟξ:{Χn*/’MfR@6Κ„fν’™νJ9i‹o’«΄‹Ή4Ϋ©-0ΌΕ7Q)ΫOΙha²Φ7‹“―°:Λ5.ΒgCD§Ν’P§`;uA²υzυΩj8Ÿd‹?ΑυCEk@βμڏa‰UαΙYb·œ'P·ωJ†KΦ―·œΜΜόl‚ΦφΌYΎuyc}gy±f\Y³ZœgZ€h α˜pNΜ„ΦTγWο&ό&[8Υ½ ΐG°εώκΐό.ΈCπ…„Ώπϊ]|<?χ}uƜπFνέzφό έ>ύΰταΏ¨‚―ό(_@λ ξ9}{μΑ'Qxχ‘ΐΆyv/lέχ{N‚ƒ&aHž<"Κ€­`ΰ€o6?8#TυΓGΰ~‚-Ον:wΏkG° °λ'ˆϊγ'§+Κ‡A ³ƒ&s»—u£σ§Ι€±Gω°|Yi—λxE™BΐV΄6ϋOΑ³βŒ— Gp%S—mu9yΗρκQi―άτ—η‹$d[πlǐ±Waqgې\₯Όό‘j(^]\[Συzu¬›Λ΅υΖRsF=GΛhξ8Z.GϋΌQx)ΏQ©Η·5CΈAŒ ±T€MsŠo1V }ΨLΖ$±© c’Ϋζ¦Β˜Ύ΅ηκ£ατ± έ-T’b™DΞ{™@e«8ξmΰ^»\Έ˜γήΊ _‡FΠ›γΫ` ߌα›1|3FoΖθ T­εK>ψskΉ%ŸτΓ$p¦ΠuιDͺΪβO|}uκκ“–΅‡Vσφ’ϋρuΞ,λܞσĞRΏ§:΄Φ?=C·vϊϋψzy©¬—A7šn:°OΧ’ώ]k§Ώ―—ΛϊΧq};<˜Βς€δ %ε‘›­–¬Mj-*Κ4ζ{†°νΦ4³εdmΏ/n»φ4Ϊώΐ˜ŸΏβ«ςRͺd ‘ζ;]Φ•,¨ ,σΣ2«)œΥQf©²¨K’ΐJ*‘΅άά€ς+ͺ±²€‚ŒΫ’ HI…œμΔƒ7Ώ_’¨*¨gъ?i`μμΎΑc§bαπ¬SΏψϋNρΉ· ΙM…Λlˆ—ΑuCdΧ² ;‘c?Ž«‚«ρΐν/† Ž<ΒΚ]ΟιΙΑt+or­ 0πδr™œh―XL°a‘W²NΨ#ΰϊ <1υCΏdΥ` μΞ€ΧΏσE:‚Θtχ&!©ξWAΦΝ’¨>Mzs―2¨NιγΫΊHδ>1= šμ[†Ηt<žΧΟΠ―WMα—T€τΎ+U©βΟδ˜„΅voXϋ$&ΗHz»άΉ6T’’πζ1ȝ-Ηλƒ γ =Ξ Fr ƒ3`@7Ԍζ–ΥK,@riο ΚBΆ0 ¨Π{Η „? hc»©_|)£=ZGμhΡ*Q?Ε™υ †qΟlUώ³Œιw!Ϊ`g d£_ι\?Cί(ώ€TŽ₯Μ’–mА~£ λμ όΘƒΰ‹fΟζCΣIΤ<&314ž[51ξ|vΥSQLsqlddldml source.sqlend_identifier(?=[ \t]*(?:[^\w'"`. \t]|$))κ xΪΥZ{sΫΖ§±ω‘ΨS·i›΄΄\G€dQ±τα±­:Ž&Ռ${D)iΗ°₯#p€.qπέAηόQϊ5ϊG?L?Kχ88‚ιΠν„3ΒsoΏέΫέ;θz-ύ}œo‘ˆFϋ>νvq$ψώ›΅ςoέ]C75œξž‘›ΞΞσ%:†;ψ4.ˆJ–K­$γ‚‘¨SΰφΑP²œΫ…‘dΉ ‡’έ7dZ\χχ»ˆDζνG³}`€˜0―η,&HσώRvΎ–IoI›`Άο3Œ6„—-€Š:\±tΘΰ5――Zd©…ϋ˜ϋ(Ξω~Q&"‘ΐ,¦!„ζς>ΆδemZΆ\·BκΣ2DΈΠ€β•ρΓΦ c¦Šqkβ͋ʏ†2’n ³N:ΡOb>o1o…Τ?jψE~ΣE~&κ½₯Υ>=?Όςψ’γ-ΉΞΪΝU7η5e‘fΞ Ω9N"_$ڍ·IDτ₯Q ̜)»VςQ# Œ™’ςfδͺΉΈ=\rΖGf›§"Վ˜2:^.βVpΣΜπC>Δ^# ΣM„”Μϋe₯y]0ΫΖιJ‡Ώ}F–Ÿ”u{Pa8\‡x¨Œv‹‹†Υgηγc)©°8Aσζ-ήυJσ¨8₯ZΘ?ζΘ0'FοQΙj€Ig$,,όT,ΌΗ³|‚ŸΩεŽ°ΰΏ‰`¦¬΄Vs₯‚ΆX@9M˜Ÿ»lͺvήoͺP/νZ]I\ιύ••ρΣο@ρΥ ήš „2,Ζ’Uoi‚2¦r3;w±@ Aύ•pΡh'aΈλjλ>΄–΅Žw²μΚEηΕ«Ε—Λξ’\€«ΈZpuWP/½¨{βεΠΏxε,.4Τ½tΦΊώΰΊξψΝ(Ί&}(bqֈPΓxΐNO…Χατ˜τ3cΟΎ£>΅Ϊη=LRΉ¨<5œ€¦σΐΥ-HγόξγӊΐAΎ9§ ©(Χώ\OυMΈsζώT!ΫδR‘Εr N‰;硜΄›VhπeΚΰΐp"»k€Αςœƒ:h€DB~?ƌƒ…2@΅Η2 ͺί–jΩa4‰ΑŠID^'8Έk$ π© QΤIPKc†eu:žίʘQ Γ’%!–ά?Δ]$96‘% •š<ΦΚIH·fRœΕX&Ž >Q&λμώTzj©Fkϊœ°>Βg'”™’έh»VIoεβ’/.—2ΔΏrg€ Ό0+άί φ 5ΦƒΞ³Ι•"ΘΚ€ Δ½Y΅Z†±’6B_©μιΐ… # ~ΌΦ9ϊΟNH_UkΝ&‘ψ~]­Njf¦χE ‘Iϋ™„›J%Ζθ«Ei#&r#Ί¬V{6SL¦sυμw«QΦEa‹€έΎS‡X€ύυ»9Eΐo‘l"H8…pw”†Ep>•­3‘τIΐΰΐ|@)PRAΊΚ+ͺYχxΜ°O΄Γ`i/€bͺv'†j±/CŽ;²‹ €S—FψLΒλS!) dŒΔ‘Œ©»gΰΈ„2Σ‰ƒ‘zΙΟΈ–g“R1p½VΙθ€ ƒό:£ΙiΟμ{υεϊ}’Jm»πψ1bgΠ2Λ|ΉΰqΘοΩS•αIt¦DÏ+"Ω)JcΗ(t=Ηρ‚eΧ+AOc’ώ uΎuΎ*«£™§{"2qϊΞ-62{βP[ͺRΉξZQ2Α &ξ‰ϋ#ˆϋΓŸΛ23υdƒΊΚ˜η;£σηυΏά©ίύ‚ΐαn‰Ώ ή―0$Α"α!M€Aθ<ώΒRβ(ςξήYχαοK%τ«~‘ucW΅¬\Š7J΅}*8J©J [‰Όέ™0‘Ν:ŠC~ΤΣP©’j"’³“ΩΫΛW°™sͺξ žŒΑσˆ‰ Φ€―O@5[4 /SΌd '΄Ё¨ϋ6£](QBž@eΖi?ΓZg:§H•±Τ«H uΐ`‚„ ‹)IPΤs΅ε(‘Β«£‡€ 5Ψ!Q…ΐg”sεή :J}ΠκŠ}}η„Έ-$Sto © Ί©53"B/Q¨ «¦Μi‹ψή¨l>ΎΩΪ΄vΚΞ‚tK΄Ά_α:’"»‰`U―ψηIuζœ•l.8kΰ!ν…U v”1ΆΌv™rHS­*Έͺ†ζΛCt¬‡O!’Έlaq‚±j~Š0Ž’YΝω’4h.Μ ά>蔍 ‹ΣNYο†.OωΖAΜι`p ‘q”ΆΣjw‰ˆ£a¨vŠ{ΞΝ½ο-M,; QdείγϊΞγi·€DβczTšθΏ―ƒ¨ΩŒΌAfARψΟΎFΆo¦B>Κd`o˜t#YZsδΉoК#]m䫊κ΅Dqι.RAjciM'^ZCά¬4Ά~€<΅bΎFZΞυ €οeΨΫƒΒ –BΥτζ! ²9^/qt &@γΎΫγ\½ΡIΛβ•oYηΫΏΙΞΠΐ½zιM5Γͺ<|τXΎΈωπρΛ΅GςαcωP>ΖH€+Ό/"L£³"½eΉ:pΝjψta1bq0ν—'=9Πu==tyˆτM™Ο_Λ@?έΫΩYίήέwΎy²».w7ΆΦζξ“­η0φšλ;tšλΝζΖ³mΩόGsw}Λέ׏{nω­)ΘIS& ktH.}Ψ~^–ώδ»oεΣg{Ϋ»rkc[n=ω»lξm©ν[5kœs,1_[F>Ϋ~ ζm+αϊ»υ]Ήωμϋυχuswgcϋ[Ή»σd»Ή©AΨΩΨ’{ϟhfϊΉ£,Zή~¨ HZ ½ρβ΅ςβ3h‰^·‹Bζ&¬θ}ŠτYυ8gςAω‡ΡβNά΅§βσ«΅ΒΟ4ΥxΕράκ ˆτ£χ° σ·ΈIΜ±‰ί†.Uή]&&{{operator_character}}]{{operator_character}}*| =>{{operator_character}}+| <(?!{{operator_character}}|[[:alpha:]])| <[[^\-]&&{{operator_character}}]+| <-{{operator_character}}+| [:@\x{2190}\x{21D2}#]{{operator_character}}+ )operator_character;[\p{Sm}\p{So}[{{disallowed_as_operator}}&&[\x{20}-\x{7E}]]]plainid(?:{{alphaplainid}}|{{op}}) rightarrow =>|\x{21D2}typeid(?:{{typeplainid}}|`[^`\n]+`)typeop(?x: [[^:=<@\x{2190}\x{21D2}#]&&{{operator_character}}]{{operator_character}}*| =[[^>]&&{{operator_character}}]{{operator_character}}*| =>{{operator_character}}+| <(?!{{operator_character}}|[[:alpha:]])| <[[^\-%:]&&{{operator_character}}]+| <[:%\-]{{operator_character}}+| :[[^<]&&{{operator_character}}]+| :<{{operator_character}}+| [@\x{2190}\x{21D2}#]{{operator_character}}+ ) typeplainid,(?:{{upper}}{{idrest}}|{{varid}}|{{typeop}}) typeprefix(:)\s* unicode_char\\u[0-9a-fA-F]{4}upper [$\p{Lu}]upperid(?:(\b\p{Lu}|\$){{idrest}})varid)(?:(?:\p{Ll}|_+(?={{idcont}})){{idrest}})withinbrackets2(?:\[(?:[^\[\]]|\[(?:[^\[\]]|\[[^\[\]]*\])*\])*\]) withinparens2(?:\((?:[^\(\)]|\((?:[^\(\)]|\([^\(\)]*\))*\))*\))xml_name[[:alpha:]:_][[:alnum:]:_.-]*xml_qualified_nameB(?:([[:alpha:]_][[:alnum:]_.-]*)(:))?([[:alpha:]_][[:alnum:]_.-]*)”&xΪν]iG™o[Ά;ΞAbrCdωš–<#ηΰˆlYŽγ²˜°ΰΐ¦ΗJΟLKκΈ§{έ²€Έ΅»,aoφ`9φ`Ήa !@8Β °/φ _€―φυVuwUWUWυ1Σ#KvVK=υT=uύŸ£ͺžϊ­}ή?θΆcΟλΆνψΊo:v½―»zΟπ Χ›?φn…ώ!Ίm+Aτ"Ϊ?o%<ΕΟ7Σ)½ŽkφΓμm§Ύ°lwhͺρσnŠͺ­{`ΗΌΨυžξw–ŠE)pΕw₯ΐ΅Ύ.~ΦώZί¨«}ΧπΔΜD’φKχnύ’ξz„zBτσ[ Ζ5}λΔΈΊoγŽ_Kο΅»z˜ρΜ(x;b9d`dMfDŠˆ0‘˜α΁ˆ‚Θψ8W³± Ο―w–‘¨Πνnέ3¬…„δwΪ@Πd {Ά8 ξ “Œ Ρ ˜cζg”Ψ3νE+­ΰZ†ήίΤmcΕ2m’N1π”™ WM„+‹9ΐ©ΐΟζτPΩΰ&|t¨lπh?ΓΓάl’Š3½…ξ DπlόܟGΐ–δ2γ8Ad^ό’ΚΤ2{&΄–<# ―£χ.ϊϊ£L-bm}— Β2ž(”μ―βηˆd”C %όkN~‘QKεχ7βd°Š(ΩίΖO€W E(ωί1`%HΎ„Ώ‘Ή†Ώ €oΨς]c!δIU?ΖL―2ΆΤ`z“‹¦ΖΗHΔ³γρσ`–ΑdFVμGC_£Π>”κŸŒγyΩPΪaΔ8ΗK†’~’™υ<‡šnYΞ [©ŸwfBe₯TvzμΩBι??ί„Σgψ•Ρg˜IzΡX[qάDz6~"έ0νA)™0ΟJώοΜz€Α0c"φ+‘―3~ވΏv[›Ο1'Lδτvε;‰ώ_ βΔϊWZqώ|όDΛΏ€απfΰwPέeΨώ"SV˜¬ο€)Α$όRόΌ…J$"“ξΛΜHζψΥP―0„ηCiΏΚˆ€T£}in._gr黎ο@<@ ώ›‘S@’Xzέ[λ΅<ΞΏΑHuΎ₯~!~ΞLΝϊηυ7γηD65njy1~ή“MINΰ—βη|–Οo1‘ Ώ ‘Ώ?§Λ‘³\|;~Ύ½d6(Ρ‘mηWβηΡω‰ςψ3Α<0hυE:Μ“°½ΏΛΰKμšB_™€› ₯y•™£!O!jΈ`Ά&Έρύψ‰Ά,@oMTΒYΖσ Ϋ)7JψCv.-”όGŒ$°½ΖΜ8ΎO ₯ώqό|#‘:φE₯ύ?a`’q\‘d?e ŠIFM£Ÿ1M—r=‘„?gΊ”t9‘4ΏˆŸ{ˆ4ΰ{ΣΗ¬ύ’ιLΒ…’όŠ²Θ …Ύ5S;ψ½·δ,[έzΫ`Š{Γ΄―/†‚₯ωMόό­ΒlSΆ±€‹·HQh5΄έ -šυαœ]gXΓ3ΒιΫΠέΕε°Ρ‰s«Ρ6Mβ7ήT•8cjs³šͺ’Μ(›90žγ¬·­ί™`„l ΜŽ’_Žqs…ϊ/@"~ΎD«m‹Υ V­ΌK[UU—eνωKΡg<~u_'³3»pdC ŽrΝ­Β+qŽ΅ΪάLσ ΦΏ|ny½~'ώ„?­π§ώtΰΟ'¬υcυ‡[Α<θξζ…&xsΎߟwΦ›Ν ΪŠΦΤZZMS΅ΛΪϊ‘‰γGOΟk^λπα¦ΆzωcλuπxΫcλ-πQΥIPΨόYL©sjρρΜOAΆ π―ͺ[°ΰSΣ*ۘŽEίΝŒzψ<'Ιώ&rla€:ϊ.,Α]S~ͺ4ξm#†‰/O+ƒbίΝ άϞ χŸy`]₯±‘…³K”ΆL€Άφ6ŸΦl ΆG8γ;qΠ€°°Έ\£β»Z L;5™vμtCΟC2`Ρu–ϋ€g39KŒ%Ζvθ=―*άj Τ²ϋςω‘₯&Ώ‡³;’©χ¨ΨΑγͺ–ΓŽ”y³3z†Φ ΆOθuΛcη#Μ@ΓφH93ι:PG!±ƒ άIς‰„‡692=˜Ν(*‹ŽΘΏqAσ&kΪ$γύΣiρΖ>Λ6–žΞ§΄•)ΝΓcνŠέ[ Η‹"Όφ―R*8ςδi—OΫύ’ζM4_oM&]8]&{˜G–ΒΊΔ΄ΔmάΎLυޘ χ²ηωIu/FšUuΟξέ»AOOƒCΏƒάTΊˆmL…+šB ‹Wx¦’\o‘X Αg@FΥ`](«_%ϋ’gΏpωηŽ…”Ε!ψΩd<ŠΪψβicV SjZΖώ'±ιΈƒΜiZΫ\Πڬс€Έκ|Χ± `υ&‡ωΫ(σLQ.ϋDΉhλΦ†D΄vŽšϊu…ΙνTδ―"fexμ+m@?fykoΐΝ™΄ƒΏX‚ηmWgψy#9θΒώτ8=ƒfΝ pΌ(L•ξω4δg1­Βž™ J΄‚ySc&ήM½’žΝνΤm\ΦΕ½Γ:jAƒ2Υk’Ώ"š€el‚ΩΌ–Ρ(’j_‡1ψμΠΎ•7ΡY%—€uΪ{x΄—ΰΉi₯3yUϊ·€ΏˆOor&ί(C+°+ oJI€€7eξM™2 H! vŠΜ¨€υ\ΖοεΑ ^ZC*Ÿω{•Aη5ZOƒV/4~A‡kκΡΩV~C£½‰Ψ Œ74@Λƒ•΅{ιε%ˆ©E–{ΈƒYŠz>KΚmυJ(―>…€Νcž;,i_hhύi™‘E©η„ζΫΤμγΪ:˜ν­―ηq»5YgHŽΊ@GŠ&φΈΒ 'f‚“3*;ωRƒΉν,ηJΫύάf›γšίšdέ]©ΐX3mΒ-%*ζ›μDΜ£1Ζ±+jίŒΔ}’7Qƒ‰?–ς΄Ε}d{Ω@(x}07k"³sMc Φo$&y;Δ³”ΝIAe&τAE₯LθC’\ ZθγΩΔ&τEeP1 Πψοβρεω‘ΚΖκμh4Ÿ¨GΥ{ψΨz0[X3ΗIυΆouρWCσ2ΈΥΖςς7%x«˜—π# 8iΐρ*±°”­gΐM)%˜”-φΙfu₯θdIΎbwO†ΦŽͺ‘ζΩΉMX ‚cΓ5OBΎ›h`Nq ©χμ@ifh”ΉΩΤvufΟψ8 ™=q ι9H;RΞζ΄“`kМΌ<œ¦•a'jsϋ‡Θ#€΄ηΦ[j˜€­Ω$WυaλΥœα ˜a2έδΣΝ p³ΫΤΣΜ† Z›k°β„»Luό !Βyv5K~K·—‘q|0†λuΧζry έoŠH›¨³ωίΝ0†2vά|I³“–ιΡg}8ExHy’a3 ½a‘ΉΘζ$₯Ž”:RκH©3z©3΄ΘΨδ»§>]… »;…|².χΝ±ιrΰjl’ζ~ ςaAxS0˜ ιPρρIͺI UΎΉ»‘*Ί¬κfέMζ1©Υςι?]΄[RυΩFvVŽ7LΠΪΒ΄φ±r2Ϊ*WΙξ΅υ‚»Χ’ΓύYε* ;ϊΘ‘ώ6Q"΄Γs–]΄¦Ϋ0zm£Ϋ5Ίyγ\xŒ8ο8ΩWͺΖε,ΨόΗ `6Έ;7ՎjΑ•ϊνυŽ€f¬&ƒ¨yαSN“V\|ΞH7*.3Lm$Μ²–g£`0Y}όoC7ΜΠ}γ ¨Σx[fζ|(ΝΗ’jκ©‘uΕ&ΨW―^πi,oŠ βƒπ Š/ μ'{A©Ή*Σ_V@>Θ8«rχΕόlnΊvTΙ³¨₯Y½._ΪZ]ώΦις—ͺμr$•p«²ΛQ`«Ζ³ΛŽotΰΎΕμlL1–Μ5mΉ ”!½ΎπHύlλςC)U…ΘkΐΐΕzξĈ’‚¦V°Ÿ˜˜€‡¨'Šžl‰ΩηH7q%£¨ιJr•Ψ‰‘‘;ΫfΧILϋ’n™]DPΛ:@ύQ†½qn Ι`βΞdσώK^c€©€+Žd·l~ΗΆήΰ#›υ3tΩX‘.ΫDC~rλικ+eΊ{“NΓ*ϊtΗƒ^ύ+|C›.μχ-―‘t³]‘|dΤ€Ν5© σζ‚χ?d υo¬ϊΥž΅—œΎΎίέΙ…άX·ίgρ'§ΏΌ0Υ‡ C5dK€ΉF©¬’ΘΈGFΤƒγυ‚™v(ό s”'vbJ‡2Κι τP‡Τλ' Z…¨,T JγΎ‹Λv<::]  Ak΅NΦέ-"VΪ½CCΪΆœaΐ¦Γ1Λ‰u₯TΓ JOΒΦΐσβ{hυυ”*ΎlέH©cΜΰ@}L?gƒgζ(LlrV7δΝ*Zc OEι ΔGLΚDTΎ-‡ψβxxoίΐα]v˜ζΗ¨U †¨Ν›XΙ€Okc[€­"”#τ§βΐξ’B·ρ ­6z:ΔHκBk2{qϋοΧΌΙfMkΆ†΅|GpvPT—R+ͺWŠΙe˜™4Ÿ' qΘΣ61ΙτoΉoΈjrΔόvΖγΝΑ¬λx†Μλύx‚ΣŽcΊœ^σΰQΰzΞ/9AelΗo† ½‘h… γμυg£!ΔΆs;Vro}§·*ƒr„VMŽΤ4­Ωφνw∦΅‚ΤΖhπΌx[λςύG\κvгS:Ύ²Έ¬hΪ‘έΉ‡³:7 j^ ή¨ηwΡ“σ+Βω}>3ΞΈ›sΏL‡ŠΙΏ(ΐˆ§ ;ωcAαγ₯ώΒΝΛ˜O΅ΫI0¨‘<φΗOxΝ΄,cQ·–cuA.9υ»^ λ~Tπώ3<ψPσέV42.Τ ί΄S,’;7ΐΰŸ;0ΧlŸ^z§w~ˆό'ςkv"§I2'ΙVσ_΄ή}ώάύη>δ½χt{ιύΡ=Σλο{=sΆΣšΌ¬ϋpcjSZύΐψ1­v΄5 h(‘&› Ζc‹οΠ’2ϋψtΥ§†Θ΅Μόω¬Τ­ͺ.© γγ΅π'ψΰB€1 Ρ`z’œMvτΧtσΒτ$ώk’ΦΌ0ME­‘NNΰTΪ$ψfΌΒy4ΡΪδtψ₯: τƒΝA+k^ˆB ΅@­¨ˆ£`VΝH ςΛ?Ϊ|XL«/ I7%Fθ€ΤRŒΘ¬Ώ›±sYΏ`‘»XΚJVUŽ(yΌΧ6šwnδCο5₯DQωvαzš ‰q˜_ α0ϊ[ͺ|t15TY‘‘ΎœΝσΜE»ΐERtaoεJβ―—hRξΝ[Π^Vyφ#Ύ9Žώn˜yǏ²XqxM>†Μ”Ί{^ θc ·ωaŽώ^΅ύf sτwΚΠ™ί @ε|&α0 6qbρ‰ΏΜΉ„λωΝήϊ#ΐΟ`ρ.ωύ2ŠΰcηΟ„!γ]Ž"Fε.Q·ΤΚNŠ lΠQΒΦθ¦]±ιU/ώQ)ΡΡ£˜—Ÿ(Γ έ T–Π_,V[βϋΒT9ƒδθΐμ$ZpV[Ο1ρɁ™Υυ~*†Ι§x½Ξ‘σΐYR‘œψ·Iς'C©vί%(ό_Έ…¨‚‰86EE£Šͺ>2ώΏRω_kk*’Vω4Υ*r₯D”Θ•ΉRr―”Λ*δφ„λM½γφ“ΚFΘώϋ7Nφ?H…lίfΉύ2Ε?©^ΧόaτΑπσJ\¦vd)₯ζΪ«ͺnϘ/ΔHΖ›MΒq†–Ž˜Ω–Φ[Έ\;˜ΨOG²y0Vϋ.μω»ϋή:F…Ÿ}Xε­οj χ0©βKΡ)Gύ3Λ½~jM¬FζξΤ2ΓM[Ρή'Έ3+άϊνΏRK- $…P–D;ΔΠή/ί]+ΐΏ±Ϊ1ϊܝm»qΦ=½γ:e7βυŽ9ψ―-ΊΎΉΆ5[ΛvίD±}g›άΒ'\ρθ8½>Ώ§Βe°ϋ`fΰŠ&…Ύ/δϊŒλE O½Δx«RnŠ8};Ε†ΌΑVžef•<Λ0"+ζNV›ΐΑR“αŽh3ν&W!(χλ·cC!9ά*ρ[β·Δo‰ίCγw0&£D‰*U$ͺT„*@Ρ+šή€D‰,Y$²T„,’hM8«.ΐLZσGόΫ€ΦRΡ9Dα±g H$ I@Ί€€NͺSξ’`$ΑH‚QυvWŒI΅†jα•«τρo“<ύΚ“Δΰ7{2@•SzZ› ¦§™*¨θόγ˜Η•ŽςλΙ7ΰς8K²ώŒΞx’CΪxΧ.Xh°L{±SŽ»s /C˜<•[Βaf° 7‡Ι]ρMΊα•‹œ“ςb¨+ΌΫ(Ίq:²ΐ“‰οRψχaΈ9Π7qp›;Žš“d”B«ψ*ΣNΉΒ.eΊ”ιR¦P¦+ιMCΕ8Q^υ2<ήΌΤΨΰˆr₯αωRjFΡΩΒk0$'>ŽΆ!Œχ;΄« Žγχ7ξ? ρ£=»ρΛ.zώώΖΑkψ?ό΅ 2ΡΪZw †ΐˆώk u<~Ρ4k5λS­9π·:³οΖΥρZ³{fαl+ϊ:ώ}\ yƒ¬Eœ…,€wAVφ8§=DΣd›Ζ^ξ…[«,Gχ‘ΚbφτX†nΫ)Ψ\q ³ƒ©WIH@ΪDRE‘¦5[ωΕW©—γYŽηΝ7ž.x#Ωχ퍐SsJΖG€’ώΉΰύR ™Gν˜?kψG€VΊa%*KTΨ Λz%™ΌήZ―]~Ρh/™€…"ε…ξξL &ιϋΗ'8ν8–‘ΫΑι5ί]έΰόΌ€βqΫΞB_^pΞ±ƒ3Ξ2pΞd;P^–Ύkφ€ιR^Њ—¨†ΩTw~cY†j⡊Ό%…™¬2v•Œ]%u»JΖ* =Ξb°œ=%SZk1₯΅60@ε¬{)g΅&/Ζxα˜uοTN-ꞣ‰ξά ό?ŠP~ΨίSTΞ(Ν›Κ₯|AΙgΏmNΥφ σχε­gώΎ,ΝίάV‘Φž΄φ€ξ"­=iνKiνIkO"¦΄φ6ΘΪ{9ΗΪ«0pψ#"{o‘B{οV‰₯K%–J,½XϊΧσΖΤ©ΰj„ψH=Š+ΞREΪ~AxXΰκ/Δΰ, ˆΔ­幎œb-"ς€!{ =ΤΜM»ξλ¦Uο;žΙυmΟΨwΆžgμ;3–Ϋ*rc#U(]…RY“Bι*, =ΗsΦf‹ίνϊͺ Αύ͊Rδ4:eJD@bU’tHΧΕ7‰Xόf!wgΙ·Δ₯Ι9Ξ†Qά}\j ψινή)@₯·γ x;NΤΫρβΖy;₯ŠΊŽŒ―GΖ+[Ο‘ρŠtd䢊td(‘!R“Ž ιΘ(ΰΘxe£g*qd\].†•.†ν9Uςme³sψ­a8|a`&ΥX53πό”ΦJ4”δ£Ίϊμ›=ΌηtΝΣpc+₯!?DŒ΄Hλ Υ©XΒͺR€2t\&\AN»\G&@T#2‚˜φb‘ +3ΌΔEU_ΠQ!SΆ Φ@½RƒςvJιΘα,Υ@lσΈ~Ευwβ$5©Ήn!βζaηψ` ηΕ¦εωέΟ{ψtυ•ΝΜχίί–³ykΞζM;Ύή£”Π}ψ0+Ž©φΗ ·”aΌΕ’’ήKuC’5M³·Πρ©ΐlΘ%zb&89œ8hSA=˜Ι]2m;Λv·¬Ζ-ΦeV³΅ux!M«B›εΗ1^+38 qϊΠ«ΐγ ϋp …Ζœ7 Lύ"žnшzί¦ƒ»Χψp§fθ'K10Vl獕¨ρ>2\HΊ„mԎllΑ{Qθχ²a?Gχ`τyύr$[4‚φ³ύΘΔΟ“穁ς;3―°™·…\Sj*‡‘{λ„x@™PΑQ£5ΤΡ4β56+mD©σ]=:k%γ΅ΩνIJ ύ)YΧT[²K xλLδξgZ’sγYSα)d3ΏŸJ!―Ϋ!·ΖΥh,ŸmVK6³§ηςΟC€šD9ΌY”˜vΊ»θθzΒΑο]°TΔl€ξά…ΡΥ$ξEΖ2»αΡ\¨›vΌ«‡†iΘ†Ÿ½‰ ϋψ±Έ^¬D2κf8( !­Μ/s,ΎηΙ:ξ!ΉΊ¬ΩƒxΦv LΌHgς,nHm ‘«Ή5‰Dθά₯V5Qƒ ©Šΰ[TͺΐcΈΏ¦‡ω΅“κvAk υρžα먉·ml—ξb₯|~1pΟ:*€θήηΧ•βBiŒ7’£_φg™ή6²§GόqvVœ`kΙf3½ iΕΙεδ Ή”dμfΖP›0ΔG‰πΝzs'Λ"τΫτpΩΫΊ@."νΧΤΘ{n—0Ψu˜Y}6ε‚9¬σ0²}thνeί¨‡σώπϊzΗ '2zήW @Ζ?w‚6Q%Œ ΐ’ε•ΕΦ5»μ‹Ζά0΄’Š:κηTGM€:ŠΥH§Ψφ‰ΕΓYΨ‘jΕνƒΧl, “GŽ7Bourne Again Shell (bash)shbashzshash .bash_aliases.bash_completions.bash_functions .bash_login .bash_logout .bash_profile.bash_variables.bashrc.profile.textmate_init.zlogin.zlogout .zprofile.zshenv.zshrcPKGBUILDebuildeclasssource.shell.bashf(?x) ^\#! .* \b(bash|zsh|sh|tcsh|ash|dash)\b | ^\# \s* -\*- [^*]* mode: \s* shell-script [^*]* -\*-  call_token\./ cmd_boundary(?=\s|;|$|>|<) extension\.sh identifier[[:alpha:]_][[:alnum:]_]*identifier_non_posix"[^{{metachar}}\d][^{{metachar}}=]* is_command(?=\S)is_end_of_interpolation\)is_end_of_option [^\w$-]|$ is_function<\s*\b(function)\s+|(?=\s*{{identifier_non_posix}}\s*\(\s*\))is_path_component (?=[^\s/]*/)is_start_of_arguments [`=|&;()<>\s] is_variable*(?=\s*{{nbc}}(?:[({]{{nbc}}[)}])?{{nbc}}=) keyword_break (?![-=\w])metachar[\s\t\n|&;()<>]nbc [^{}()=\s]*start_of_option(?:\s+|^)--?(?=[\w$]) varassign[+\-?]?=ξxΪν= ΣFφN-PŽrSZސΔX 2PhK‡έ^»½ΛέZ ‘m%Qq$cΙ$! ϋοήέϋ>ΏίΏΖŽδ™ΡΜhF#ΙΞΕύ•ιΝ›wΝ›χζ ½ί1XŽΆcί3:–·ΌbzVγή΅ τοΩ1Φ# !X₯€†kͺu§IΓr4Ψh]P΄ Ο3;ΆΛTεΊβJS5:K°Υ2;ν–ၽ¨ΪXΎ"­ΥΩ Λγ‚:ϊη€ ΧθσRΠWθ>XΎΘZߟ ‡›> ‡Ϋ}–‡cp$Ο“ p›‡’ p‹‡…B±Z“G„L z>η™§Φ;FÌ+ξΛ²ZQ•cŒΤp•δΈΛι„ ι$#⬬˜6ΑΒ)Ύ,vΗi0ι΄ΣwF Šι|‰ΫΧΜ΅Άa»–c«<οr–‘ˆ­ >™iŠ„bΨ„^IYσ{–ΧΪF˜πPjΫ†±huΐŸeπ΄F Ÿο¦ηBx°r.φ‡ηΖGŒγΞ‰η&Βs©?<―!γΞY–/Δΐ1Θ‡°<Β‚Zp°A±iO/œGO?f¬%xKΧ„#„ ’χŸr(…‰ωŒCiB·t—ΣRΰ€Ρϋο1>ι#ΠοΓς”” ο°<ΛBCΗCXž“Φ šωœιΪ0@―{m{§…^ΑΚ9 ηH?‚Ξΰ,ͺN;›X»Π˜ŽC 3ΦM$oΟί#Ψy1lΜύάc¬IΨ,Ζΐ —A€,ΕΏtκ¨ΞΨ'ΈC  Ζxρ$-ΚfŽ ΈhΟ…‘*&,KIU8A+ͺΏ(”ΣΠ,GE€l3¨β²PMžΥjb5YŒ‰’CρeΒ"°ϋLοGΑ#zίbΊ ΡλX€_SύΓf(!aˆ~κ0,a0 Ρ4FϊΕΜπ„`€~ΝhΤλ0Ζ‹Γ[’n–gx@ |j9«ͺgΤ1R–xΥvΤX·οΒrŒ[Ήgψκ*θΤρͺ™žCWε5ΆΚ˜q,ΊG€k `,ͺG€λ°Ό T g΅UΓ ‚Tν,Ρά#’m0–Ό#ŒΑg|_ψ:PΌ™MΦi›Γ™k ΤY‘8y̘aۏΟρΦ£Xπ˜1ƒHUΘW°|)’Ϊ#Z£KS?εiQzdψ)£8ά².Ζϋ³DΐvψsXγ|δ/`ω"’ ,~Ι œŒώ –(š’™ύšιΝTž‡€~Νκεwθ7Œ‘πR2ϋ[fψαζ€τˆυ;ΖC€JQεί'ΦKύμyυR"τφŒΞc !όΣ$γϋgFΎ 9KXε)¨i‚nl˜AωWf…ΠΐwpΰΩC[ l©.Μ0έƒεI¦βZΫιxl+ηKcΕX―›κŠΣΑXΑtk"-F dz)^΅ιΨ­uΆι1™Ή"˜Γς?°bΜ-Fy©γtΫε(θ+»Λf έ Κλšπκε~5ES~"΅1χ|xΩνυN²!ΰacÈΊ…°?I#$’OΣAγ …!¬ΛCρV›œΓ¨ΞEςΆ ΠηΚ-Γ^κKf9LΚ!Ž‘L ‘Κ‰37Δe„£9±ϋζz%—a”M+`Ρh•Q:^›K– ‰"p“tΎ]Θ ωa.qJΙχβ*™Ό#’χ»D1Υ‘&–ΒΠνα•’¦UJΥΚ‚B3ΓR£m 5CDΙk-{+iTΖΆφΙΨI,“i͝ςηU­ωΤ΄Υqk·ΘΡ.πB–m!χ#‚&žΑ=ΟΚαΫΙ"L=7(grD ΰŠBιŽGΞ>JΓ'’Ί΅yΐ½ͺϋ₯κΚτΈβΛle>C7βU…u¨¨‹£ ΄ά"½Σ‚ή>«y§¬ζΐ(YΝ.·™Έ|%Y½ ¬m;]ΰσ#Ώ?Dΰ!…ρ=Ξ³ ;ά`qFlυΩ"œCX•a―Υd=?KθΒ—ζ&;ΊΛ€ c"TŸ‘K&ΤΣlD0e~Šθ> Ώ8SRnΟjξkr·{w‡h>!¦9%ΕƒuΨ#RΓ<z·.i:¦shˆ!‰υ±n·$D‘¬‚‰ΑΘϊΈlήίV6ίίi6w½+ύna»]ιs”+}Ί|¨TšFͺhο\T*σže»»R ΑQhgCD ΥΕ‹ `ΊΥ[/‘±χ¬δiKψΫΉ?͝Τ6δΣ™Bσe°‘S2~šΤχ%ΆΉ³<Σ§Σ‡]fŸ–υΤ ’άήΜžΑμO‰ύ— ν“hΕ‘1~ \M šm‹7!„1^a§hŒAβ„Ϊ “Aσ χJχpύ 6›φ’±o²D„"Β±/‹fSε•4¬ΥΖ}`™χέΌ½j57–@?l=Ω0ύίa'ρΑd­R†²ΧRmnRWͺ₯«‘b†Љͺxκ1ŽδKέnέήΎΕΈ"wx‘0QΔT†ςκΪΥ± =Eςξ‚₯ΉΖ²Δs›…Δ_κj[’l46jΣ՚:U©κμ𛔀'σέܐ)ΝSΈ©M5X«"Go‘(.m•(D³BΣςgŒ~Iϊάu’L³Ψ@GΕ<^Η·JώΓ; Γ€v›‚ηKj—Ō²ysLY–WΑ%ͺZ,p›“ϋ%6†LΧBjΌ(6Ϊλ#D₯ωRi΄œ% €Αεt‘^–φ\.w5ΛrΌv9:―K ρa;²αf™o8jFκRΫΓ20ψ%ϋTΗ\*εj_4 Υ”Σρ¨Ut¬­Ίžgf›Π,Ϋ4tΚΛζšΡ4֊‘un­:Υ–ΤGοͺ_θlb`Ω`mίj–­VΛ\κιJ5TΠ^΄έ#fΚ$«οqX%{‰%§αef[ί­7u6 ΰ2b«a3 Όˆx©Ν_SίΠόœŽ;Ϋ\iΣV¬e³)ο‰8­‹N§9Oφω’1΄½Q«[v©:ZS+Ϊj΄8w†ρh7ž:αυFΌσ–7”.&9FvΛΙZiC°bs’έ©' ΓŽΤA² Ή«Pmp<Τ&ηYβό`’λ£Δ2/a\ΖμI’Ηhζi6\”ΠΊt½ε½†O@Γ1 L{»ΨΚ½]lεήΞ=Ί ‘ͺ£0]ΖαIΜΗB`.Ώ'›@'ρ4­T3κ‹vΗ{xωRUχkΧΤ[ϊΖυ+76ύ5mόεΦ¦ί¨꣨ ^`=rδ{όΨ`C,”ήΎΐro§b\(’}'Ώ+ˆCόώDυ•ažoΰR–™€d¬Π„XiνOύ,ξ‹I>0άχΡυœ€ΛG‚ηsdƒδβ蔦VυjΕ‘ŒŸfUε[$"ΚΩΙλ~-°T 'ϋŽ· l5ΨΉΈ 3>™Ρ―%J X’―Ν@g£έή6Κ&ΙanqΪRK³ 3˜γΎozτͺ©T’Ή™‚@)ύzΪœXωΔ큓ΫX“~ΞnΈ όQς$νΛΊ6ςf¬ΫΛϋGŠ]‹σύtΆγDgKμOiD+rο’ER”ζΉN·ƒ€ΐZ»L‰<™M¦P’Žͺiε\cs„?š—΄wy*XqSΨδS²­:MNXΪ₯ΧZΞ₯WIClsΤ.ur3sp 8γR :O’ΥMΧhΔ³ž ¦OσφPσœ.”©ιΡέD<‰*Ώ-2ξ©DAυd£u6΄ Y’4QΒC“33Εͺ?SΞί,oD]gΕ²CJVLˆ³ί•ψLrΑ;γiƒ’Θg·K`s*§0'ά°|P{‹Rϋ ‘Ω@Θηί*d&’%»λ>©§νΰX<·Ο‚η†ΰω=Ασ―ΉΚρΩν2ΒYPփǏ\$Ή<’₯qy#…Ό^˜ΨkΘΊ΄ƒςw Κ7=”©Ηf ΚDVφ WΫ%Φ Hχ~₯ΠΧqΆ‘ΆŸη.5 yZ!B[‹b[ ŽhΈΝž dƒ|•΄šVSθIlαžEΤ8yϋ»ΖšvηΫ)ϊDτ₯₯nTD]ΈΫ2'UίP΅‘–ͺWΣZ7Ζα)ς$E’`ψ*πη“ζΙgŸς:N >ϋ³41"βYΆ+šŠUΟΰŠψ`I¨F4G, δ°s§o֐ Έ{s3ΈdP:ΝΊƒ,ξΩz3y.K{Ή½΅ZΩ;Sc9~EV&ΗF0ySσgtΏF²YEι3MNΓΗ.¦PΫ%iψ0uˆ’Νξ¦>/pMl‡‡©¨ΪΑaκpAδ²sSrž}VΘΠ©φ:Υ‚ηwΔ.ySβ²τυ|nρΕΒ–7q$KΤqΧs¬ηυΓ πι ^τkRDι(₯}’τ±>οM Y(Μ™  ™b”‘ε"a o―1…7 h~žέEI{”ΖdXΪV;ž’VL½KΘHZ}HζK§CΓ9ky·Yζl½ζΨΦwΜ£lυΑžΝ¦ΜΆwΦ-Νi7dΟΙΓξNξΫEŒ%©˜ςλΐ[Ξ§xO₯€‰©DΜ₯;ΏΕ›ύ§Ηω°rŠρύT;§‚bnh1>7Δn"ζΝzZ‹±>ΝΝƒecΞ”S1Ϊ fb³Ε£·”±ΩrMΝ‘ ­~Wr2Œ1θšω$Ԍ±w$bΟιΔρžΰm9Ή- cΤ2'!ή¦oώ\RσM'ΑšŽmfdgz:Š X]ΆZ .&QΦ‰MJG8» ΦheΔΦ‰αŒ¬δ³'bqN$°osž½G μDDŒ€βČ ˆYl9«lΖ[½cχΣ‹-DΦd·θb€Δ“S€Έ‡Γ}ŽS)Ομž.$ώDΥ6³ 9’lšε!VΑjΚζLΡΧ·arηyΡJ—(εY<t*”Ε,¦qzάό5+mΔEΰ?%Ϊβ€+ˆ”‘>!ˆ~πΦ³Δγeι—λx6|Ά—σψqυ« ±‘ΣLω½œ…6•'B―Έ]H"‘>œF¦ηςψ¬π‡gρ&”RmbJ%2•‘ήΕ ά#b8SΝ—Κt°ϊ@v?§‰«ŒΔM°₯5§v-SC:耇ΗC$Υ*ψc•`tΟξbTxΕ<υ  Έ·-tšfD@Άpγ.#άΏ†3ρ™Οτ»ηφˆ]Ω†ά>³K Ό‘ΚύG€π‰Ε‚XΝ],Ь6xšδ¬6>67ϊx²zΈXGk«»˜QΙ‘ψˆήW(΅φΖ›χτ^ ώψόcς)gnšΕΡ9lη@=c•œ Ϊ©%‘ΉX‡dΛŽis\<"ΏΦ"οΩϋOρ­ŽTπM"r)ΟG8ζͺ).°εΦΦΖ‚Β¨6Η{Α{m΄1m¬κOLT}m^›―ϊWT~}ΘE‘ΑEšNΌ8d‚βρ Ιˆη€ώτνOξΑC0=4²½Τ³Ν₯Ό1‡{%χ¨SpΝyΘaJF‡i#\+U'§ζFυtigΦXwk2ΟΛ«Ρύπэ>Yι$dƒΧ·jΑΔΘ€|ή]{`z©ΪRA𓦑ηšVƒ>­§ΏE,fzݍςښΚf¨1y†bEˆ‘ke₯V›`¦u=ψ—Τΐ ›άN+ψή)gΡεT0ΣρiχR…€Ή"'ωFb‹ζƒυΠh™v#ό*Ÿλ&=#*hJΉ4­„ΡjkSŸJsWTrΣψ|•œ‡«™q88HtΐњVLλΜ7πλΊ#&¨‹&Ω8%ό~—ψΛαλ¬>ωw\―_«­}§œ‘@σ*uϊ@ΟχLRτŒš ‚‘π6Α·9E΅y ·L^)Α™ϋ;κΧΤ7ηξιSιoC CBβUJW’ΘB€΄½˜J@$λ₯Z¬ œΔΤΥ‰)M-ΞϋΑIιΫ·+ώμlŽσ¬qΔΪ”6";USΑŸ“Ϊ$ˆτό«Ω/‘Š_„ενZεΆ^υgk•YPΤ*£zΕ/}mΪΆNω£Ήσ ^΅’?X—’©[ήͺεΖ;ϊ―Μθ™ο₯‡Ίͺ”ˆΰœ˜ΡYίΎƒIWH7΅•‰lG΅W€ƒς½(Ά)•TΠ³zπαΎ₯εϋΆΣξΈ^χακΪ£w?ψθγΟξκμΆΪaF–ω>R!Ί?\ς)ŠH• A?ˆ²ΜEίφ|ΗσΝΎmϊ-Οo™ώ’η/™Κ.eη••Η XKΖδ‰|dʎ+0Pϊ΄,:—U©TύQπmΆη&ŠΕά~"Λ`Ξ©Α'[-d°{j™]Ϊ,ΣΧKh›&Ν3‡σ΅¦{VΡ'₯ΰ7GŸ§s:aœ±ήζ}· άζ<λpž= Δp ~½Άγ{#Ξ²z ‡γΨ}άύ ͺ±:FζEίήο]Τ9ΏI6ˆ€Ίeι›Α΅MιΞ“Ρ!?LꐙσH€€‚Μ7—³΄BY9ފζ±ΨKΦEIoΆ@Ε’εŠ NΈ˜χ« œώΨΧ6κœsΨΆιKpΰ†c—α ‰.A|H‘™«yνF)ؐ­ΩN†n;ŠίS©Ίν@&½ο1›MΥX ¦ ͺηά7}†φν‡gdΫ9ΨΆCN‡0ΐ패$”΄ }햐† ‚μOŽΓByέάςΊΉUςJγ©mx[«-Œ_΄ΨΤΈψξ$τˆ€Ϋ”ϋY3ν_ο‘?ΉΉΓώδfŸώ$σ`Κ©ΑI―&UΰXF‹ΎfΔFK4}ΎwP&y&γZoši•W(Ο\σ:†m:]+1T^μγυœύIνΖύ±ΰω:GΔΑOxoZ––Ασ? ž%xώ˜€0γ­WίSϊγ휌δ!ψγ,‹Τ-Ί˜o#nξ½Ϊh°Oκ’{^―ήj£JI­‚YjTΞα%Še+ΘYΦ%ηΌΈ–")$œΈv4žœs>›€™Ÿ( ϋ‘€cΛΆτ$,Ίcυ§‚η?<•ΰωΟΟ!xώ³ ΄S§§°Ρ5'•νΫj˜g]n―0ξ½[{–E•E«eͺM‘t¬6žΘg32UԏˆE0ӟη`wtHζ4β_ΒΩΓ Θ°bΙzrϊ©ΛyΆVλς’X——žιr·κRακRΣδϋVχ<9šK%Ν~u˜_ \%€έ8ό) )zR)N2R|6ΒμR―΄šO•Ο˜'Q•%ž*Ÿ/τŒrŒσtπlx!ζJ…Hό€©εAFΰΔ1ΰπΆVΈu+ i‘ω’ηύ4‡³Κ6³Χ—έdcυΝj±ϊDπJ" ϊ—Ήϊ<%‡ΩΩΡͺ?[¬ϊΕYΏX <υύYε›#ώΧ Β«φΒ³Υ~Iέvi\α DΔνό‰8’Ύœ&Z'ΈNI‰·VŸo‘βej΅ΰC%Τ“ν›^Λh[Α† ΣuωcΤ`N―ΌšΕBEsιΏ<ƒΰω―Ο“Χ“`CΏœ;.ˆDt£Π?Y—OΦΝάdαΙρ- κυ,TνM¦j _ΰΫΞνΙό+ ΅ΪψΉφύ»AΌ΅Ρ΄XD {­3Ϊ‚>χFn3:Z½~cO‰Ά¨a4’ε&tV5v=€ΰk}$Ργ<ϋηΩΏ9ΟώΒyφ'Ξ³?S(RΜ[\ΣσΑ˜Τ€~β1 σHvh/αŠΣ$%nΫδ<ϋ+ΕφiŠms-ΠΤΣΑηί)>_’ψ Μ;vkύιΰτ_§hΨ@ϋd76K ψ›ή3]ΪΠ‰'5eSWͺΔƒŠόƒΌY Νξ ³l+½•₯Αu·“Α©φ;ς‘:bG2A­eώ!ώ6:όΨηΰ?ŘY;ηhν¦kάY|gΙjΩ―»¦OωmεΙΡϋy'Ξ­ΝΙίԐTΗ₯Ίh?a²L²ώπ—παNΚΪ{ώQφν“χIΤ {•vΏ«|3·«<ΑνŒOέπOΣδ=ξ)όtηlƒ“ΩΕ=Εή&±J+ΰΪ$ή$Shell-Unix-Generic source.shellxxڍA € D΅’:KG©#D„PP)j‹hΣΡ[4Š}ŠœΝCf†ωfμVvέOk˞*Όkl―­³9˜a5KPii₯έ•p””©8γ4κ9ztŒζ*ΠΘM’6£˜ηΠVψ΅φ/τ6s~ƒχqνœΰΛcommands-builtin-shell-bashcommands.builtin.shell.bashboundary_begin boundary_end(?=\s|;|$|>|<|\|)xΪν]χ{άΔUB ½! ½Ψ/½…@€$@ !”8 ςΦV¬•IkΗ`Κ£?ϊ£χή{―‘χήϋ{βI+έΥhOΰ§_Ρε.M‘MŒBΠ† 4‰ŸOΏEί"fΔ}²ι~˘»ψΌU ϋeJ™οΦ1t-:ΫΔΠqρ!xΫΈΞΥ¨ΦΆ‹λ\%ΐΫσ;―gΘψKJ5z†ά‘ΏΈU‰3dυιVΓtlŠM;υi6"(νΔpΠ$ΔOζ‹‘GΆ{(R;σ#ψ-Fόzyψ\Š‘£h&Eg—:]cθΈψΌŸΞ£‹.Ωξ|:~ ‚Ξ|:>οΙ§Σ«jEg/>ΏAgo>‚χα/šΡmΤŠΠΎό!@‚~ό₯ΣoΒ§π'ZM6«κ}ώDk6"βLεg6hβΰ'Λ΄Tέ©R΄δ' Ϊ¬¦ρ“ε·αρ/ΉΜ~ϊzθΰ˜ώϋ£ΧB‡π― \xˆΞ¬₯Θ4™Cω%π[lfπΕναCπaΤ©•–-K 8Ξ—ь 63~θFa‹#βZ8u+zx$Ώr~‹>‹― [‘'φl~£ψΚpα!φθ.=j5Ϊω1ό³x£AˆžΓŸόv{Ζ€{l£F"ΖqqŒά!z.­°ΊU¦—°y|E@"Κρ1k΄ασωΚΆλΆ© Ή:!&·Πˆ u"VMBόIόŽZSθ“τΙόςMN ψεk4ѝόR8–L_Δ,δΩoAπYΔ_Ι<|^Cgΐ€΅tJ F ‚ŽCΗΕ‡ΰ.ΎΈλšZSιωVζΪ”*|qϋ-BΈΒQ½&Ϋ½§*_DA"F7_D!Ί‡?έκΊ¬©2-l5fЈ`΅„_λ Iˆο 1τΤ ΕdJ§O΅˜Lι‘ΣƒΞGΏŠ‘ Ό8ΐ=† ›τό8&μΠθΨΰ}Χ `Obƒ',@ΐ>… Ύiύςiμ΄δzl€y;ΑƒΟΐgΡ‘τ“ηαη0‘y†€žΗ†Π4τωVΏΐΘά‹Ό> _ ŽγPd„ΐΏ1a€_Ζrδ;i{'Xt€|« {³˜Χ° ΒM_ΗΨω·Z{;c4,2@½‰F œ7Ύ…wηžυ66₯B§  ΛρΘΎΓΐwΠρ6\,€½‹Ν=ΒRμ{XεšV ίΗ„xU€ϋΣιψC4KMΟ  aioψR€ϊλ0tΘϊ –vpΖψ)Άx€>ΓΩ4Βω9–ΘΐάhXΧiΠ—hX0ΌωΦ7Ίχ5&2ίMΨ7˜Θk °ίb$›– ΏΓŠάπυ=VδΠΑθX‘ΑΉΰXzop?aς&½*ŒmzTύΉN,Ώβ‹γoθΘυθςψ;¦3ΟρΠX ›Ζ ΔN€ϋ+8Β3o€τŸΰ8†ψΡτΏΑž3-Γ1ΘYρΏΰψ·ύΑΓ~πθFMqδR΅—Υ½χχ,Œ’K΅^StΗ.ΩξE6JEwΪ|pTΐvn!~jβθ!ο᳘Mύ;ν”­³bX mΔt+²¬¨ˆD{«ιVδ΄’"ν7§[‘3ŠŠH΄ŸnEΔ°5Œ\ˆ6«P›Do˜€«Άσ‹ŠHτ&RΊΓ’˜YSΫe™PΫeEE$z4݊ˆaQΜ¬©νΪL¨M ‹BmYSΫM™PΫMEE$ϊ‘‹t+rkQ‰~%݊άQTD’ŸI·"w‘θ˜­Θ}EE$ϊΩt+ς`Q‰~δ-݊Δj+btzΩ^%Bno:v[[Gϋ‚ΪΊU]ΆppfΪ}sζΞ?qαδvŸώ©ΑS;ΫΫ›C͘bήΎ€ά'[ͺχ5―’)[²»B(VΙgλ“₯›Γ§τMo©Λ `E©ͺΊΪψΟ°“FλUΔvUρΪY#'3uuρ©#>ΔΪ9ΙφšβS±–ψλεd]\'BΉ.Ξ£΄°uWΒuΕ«eρ!ΦblN4Ώα04oΞοkε³FβΥ²iNΤ²q„άd¦Zzά‹FΩjeΑl"^0›‰1N|ˆ 9‘ύψa,’Ί2£•5ΏΉx΅l‘΅LŒ+1Υ"WέU²’›v+kf’xΝl%>Δ–βCl›εo!ΗΎ<]α—΅V–ύ6β³½ψΫ‰Ρ–8ΔΚ•ύβS±£ψ“s’νvρ©ΨI|ˆŠ„HqIί9BƒŽέX-SσfœV^Τ;ΔKf·œHf—9φέR₯ΦWΎ»ŠW˞9QΛξrμ»₯Ζ>€nZ-­™=ΔkfŸœhf―a¬0ΆΝnፚ½Ε«eJβ+W-ϋŠOΕ~βC“ΉΉ„άΞΜΉYя±ϊτr ΟΟ©βsPNs`„άφLΕτ΅°T¦‰—ΚτœHεΰΉ™R™=§•―/–Γr"–C#δ؏9ΚEՏvο,œΊ{‘΄φΖ ρΪ9"'Ϊ9ΌΠΊv¦xνΜβHρ!ŽΞΙ ˜!wθΠΠΩ1Ψι ~ΚΓ{β§K©φτΦtΣ©χ-;dϊŒ™sζΉΣ‘uηΓQβ•4G|ˆcΔ‡˜›“ωpl„{#Δ›ζR»ήΚ'‚γΔKf~β+W2σΔ§βxρ!NΚΙ=!BŽm#T[ΨF8QΌT:s21OŸŠβC,ΞΙΔ\!Η6m4³•Ο™‹Δ‹₯+'b9%Bn'¦Xδͺι΄΄Ι'‹Χ‹’½”#δ¦2υ2sάUφŠΥ«Ή7¨K=Γ¦oYγώ΄eT― žœ(¨!·SAζάΎpμ―•ήœhEcίcΘ-,•%β₯’ηD*Z„ϋ₯ͺή/ΦΦΔ«eiNΤb caΡ[xa1Y@ο7Œ/4±XD^-Χ;mΕ‘|ΰΰΤΑΞΑφΡ”&Έj„ƒ— νΊi–Σ„”άž Œ&ΫAσƒ~-2bθάνΖΝ M―λ<οŠπ„·ϊj²YU5edT·ΐ¨½'`ϋ“m·βΈ“ΑΔ6θ=Ϋ[$Φ’TŒŒθxŒhΉ’€γY̌ΪuΫtΧ@A zOΐφƒ[xΛ}ΚΘxNDjh°ΐΛs",‘{ΣRu§:2ͺ“0ͺ~η Έ>Ι^§ά₯WΤ:εv€ην̜Φ5΅¦:‚rκwž€λ7‰zMΆ{)΅Ρw¦ί3³ju«¬Κͺίyο2Wͺΰ’AΠJΉ Y!Ά§2η•²l€jEη•ΧužΧ3y:¦"ˆ§Χuž_2Ο₯]έ‚Ξ₯]έ 8:ΜΩd)Nέ‘@·ώ7*eCw,C+U5£ΏδHΐχD£JY˜F•ržΧ0yZŠ\ΔΣλ:Οη™υWtοΖMΠjκwž€λ0ΜώŠ »(·η,ŸafT3ΊΊ¨³Ύίy³gSŸ¬‰šMnΧ x^Ε\I«’Vj’•τFfέ+ͺmτλ‚κξwž€λ…μΊ—{ Quw»NΐσRfέ;K‚&|ΕH2‰.f&³_vΩδu€ηLžKŒ.[O―λ<οeςμRuQ§N―λ<ϋ™ή‹§X‚&Όίy§GΈB&΅¦Ψ‚nο}'`ϊq„)d’˚*‹²Λ‚ή°ύ‰Ι60‡± zOΐφ<ζΜr,Y”Αλu€ηgL΅Ϊ=jΥ€ΦFί ˜ΎΙΜh―ͺ‰Ί€ςΊNΐσOΨ‘ρξdΛ’FFv+Œl³Œ_B4ΰϊΪΒ4ΰφ€ιΫL¦u}ΔΫ;Έu¦'ΫΰωUB~Ήέ²zƒ9²·euσ<‘Υ-«'˜l³Ίeu[„m6·¬Ξff4«[VEΨfuΛκάΛloY=Ν^§2·eu'3§Ωά²ϊŽ}ήΝΰ–Տ̬fsΛκ}ζJ•Υ-«AζΌΚή–Υ LžΩΫ²ϊšy.ΝΦ–Us6ewΛκUD£YΫ²ΊŽΙ3{[V/2λŸΝ-«+#\³Ίeυ3£Ωά²z”=›2·eu5s%ΝΦ–ΥΝΜΊgsΛκ"vέ3·eu9³ξΫ²Ί„™ΜμmYύΕδ™½-«ϋ™<³·e5ΐœπΩά²:3Β5Λ[VŸF˜f}Λκ&Ϋ¬nY]ΐœYΩΫ²ϊ‚©Φ,nY½ΕΜhφΆ¬ŠπΜΓ–Υˈ²·eυ“i·¬~—8?ϊ―΄ΓΙ HTML (Tcl)adp text.html.tcl«xڍVO―δ4 ŸΗ[ΑξHˆ, Wίa9―4J· “/qfή >ψτσ΄»Ί<ή„>έ}εξςςη[ΩχΣη\^je/†Τ;{κΒχΡι^Vd9Tcltcl source.tcl end_chars [;\n\}\]]inline_end_chars [;\s\}\]\\]most_likely_code6while|for|catch|return|break|continue|switch|exit|foreach|if|after|append|array|auto_execok|auto_import|auto_load|auto_mkindex|auto_mkindex_old|auto_qualify|auto_reset|bgerror|binary|cd|clock|close|concat|dde|encoding|eof|error|eval|exec|expr|fblocked|fconfigure|fcopy|file|fileevent|filename|flush|format|gets|glob|global|history|http|incr|info|interp|join|lappend|library|lindex|linsert|list|llength|load|lrange|lreplace|lsearch|lset|lsort|memory|msgcat|namespace|open|package|parray|pid|pkg::create|pkg_mkIndex|proc|puts|pwd|re_syntax|read|registry|rename|resource|scan|seek|set|socket|SafeBase|source|split|string|subst|Tcl|tcl_endOfWord|tcl_findLibrary|tcl_startOfNextWord|tcl_startOfPreviousWord|tcl_wordBreakAfter|tcl_wordBreakBefore|tcltest|tclvars|tell|time|trace|unknown|unset|update|uplevel|upvar|variable|vwait special_chars [;{}\[\]"\\]unquoted_string.[^\s{{special_chars}}][^\s${{special_chars}}]*var_unquoted_string&(?:\$\{[^ \}]+\}|{{unquoted_string}})+w xΪν[{sΫΖ'©8‰ΗŽί‘%Ω!š΄όΆε¦žx:ιL§Ι4ιL Jΐ#‰ `΄€κΤ―ήξΈΓέ€%N"όAΌ{{»ϋΫΫΫ;nΧ’γ|zή0\Οέ5ΓBαξΦίjβqE ²ΌρΨpϋmΧ£ŒΆ^Nϋˆ6σΥZΖx₯1γόQΉ)ν™rΪ'”φγrΪ§”φ“rΪg”φΣrΪη”φl9ν JϋY9νKJϋy9ν+J{.=9E‹άˆσœ/σ5‰Ξlw‚ϊmΗv9ί9_…šΩψBzΎ(P£?h›^0cK…Ό{Ϋ”β8Ο_“β C<%Ψ”:Ξ!’΄$ώΌωHθjη[±-9Š;›€ϊΊ# κω(0"/#x(IAEίmIΗhγ{ωHR³GJυX„ZJφDŠΧX)ΡS‰(•DτLIŠ=ϊϊΉδψαΔ #;š?’4/€`ΜΣ*x)!ΰ½Ψ†ι0/z•ž·Σs]Rθΐ蘎gνu"Λ©qT43‰z£Χ%hϊ׊&¬"+>'όΫy6(GbcΉuΙΣbyH}Pi‘LΤΝ7ίv_λ~¬χzš(±ͺUω˜βMM§›ϊ~K7Β:η²r%$ΣΤ¦”(tό’ΰ$ΔλHΏω¦Mϊ’ώκz―„ύUΙ/:b/b€΄‰ξΎG―xn4Hvwτ°ϋϊθXοκ½uhΌGάžl²VjΚ£‘2ΒGόƒ?₯τ#θrSw±n6χGΆƒπΐ °eDΦ(š.6dμagqΈo“—θΐŽ-2ΰΖ`cˆΗ†οƒob#ŒClL"!dy{Ι΅=φ½ JΟθ'Wγ=Ϋν£αfΧs·ο&†cRfhQ„Ν! ΄]#8ΔV[δ7DDPχϋ#Χςϊ`zŒΌNΎAο ™0‰Ϋxγ υρ>ΨΓI€Θ₯ˆ±.ཇa/Ύ"ΨΑgŽHΗΗΠΘE!:žη‘B>Δ£(ς±νZό <ψεψψߞνb'Υ‘cChR'ι=œBΚq€v ±a4Β±’œΐp‡NΘwΈΨ ‘€’ '$£1iuIΧΖ1Œ .†«=ψ‰U|»ύ½αφΆΆ‹Ή­9‚ΔoμO Sώ~μΏΊ‘qWΉ‚lΠLhŒαMhΖV‡νa"QHαzk€=(‘ο€Γ$PΔqΜΕ· PΩm|?ψ‡τγ»θγ/©nΘ}œ}?ψ+:ˆMϊ쇽·½IȞοΓΕ[βίΕή(ΡΡΔwΐ 8Γ7˜Ώί7μHΣ΄Ί”©· :Œγƒωΰp'ηٚf:ΕΨΥΓΉ[Ο ΆνάX’Υ₯ΌŠo£ΐdv\iΛΫyV%¨«>ώΈVu¬©ΧεπάͺΚ}ŽQr³€χ™yΗΗΏ¨‰ΒV»i˜ήΒ«C"œ %Δ5“ ωœIzL’ 8ΏηΗ†k $Ζ/\ϊΑJ€Όt³»Υ~ΥkiΊ™8YΞΠΓ)W?ΒD€6ό”›ο¬Πσ3—υςoΟ-β7+•ύ&sόR¦Ÿ-Π›Οσ)Ν\Ωc±γ=­Πuω›η3Cι§αN΅DηΩιΤ΄CΉ“Μ’Ϊ‘=œΚΓD…Ή³°α y”G*ΈΧ¬…ϋΉ‘™Μ“ Yθ€™•ASΗ|?ΚYYΨoΜЏυβψM?- έTN» 9rlύ©ΊϊΔMΘ‘iώίԏ΅fw‡σΫή&σάzCΜ“<™-τΩ.€²vΏcC²84ž4‹±:Lτ£c·GΏΎΝŒδB¬+Y#ЍΩR'©‘ˆjα PδΚ3Ώ[―ΜΛΏ‘½―άxzf™vΡi]“MψX₯£0—U€ΙyJmσωY£°‘σΎ²bΔU^Ύτς‘XλjmfwfΰjGW‘»•J8rh΅ΖΚ Y‘p*ΐΚ‡½Ty$˜–vHΕb#“΄π%Š ―ΧΑρqνW6XΞβ’•Α~Έ*υ¦2K•ΛW1ε¦RΠ…«4©7ρ"Τοτ½ N’BΞδωΜ:½ΈW’€!ΒΔ«θd”u΅9ύ@‚›*Υ6Ο…B(ΧD΄nσΝΥ5-D<―[΅™ν7C’?»©σΒ¨g:/jE‡rβTW°{CK:M nr΄RyΪΌ]D,dΑηΨ8r€5υMŒ'% ΊΤπ,yX‘λΩ{θό:t1ŒΠΚΝU»2―Κε§₯ςΣRωi©|RΉnbnΨ™₯`­ TβA j)N1‹–ΡΨ²«γͺvžΙ‘ωCYRΞ „’μynψ4 D`•7,ŸΝoΥς˜θ& <΄-ΧFY¨F%S:1yψqo2τkPΈ&αNΝζ›mύ~ΤέΉ£χZϊ12ιΤZεs&₯ΰςtΣS;:Œ—μΕu{UGΕ±ώBΦQ{ C΄Θ ]*ηeIN2œžP`*..Μ5Υ*Ψݜgχ…ή]Μ靐³MΝ+τoqξ βd» κfΉ³ͺ°ίP9λά)G²†ΣεgψZ](ατ‰ αLΒΣΌζ4―ω­ζ5ε€Ο€½š:YΩ#z}L-Ά*C˜²f?0Λ­Rn”ΞΒ·―³o)•- ΜΩ¦δςΧtάI&n PW?κ•—Φr)^Σ‹9CΈΫΒQ:λ¬Θy{…uξtNy{OcοΜ±·:”gΩθσA,΅Q+PsU· ]Ξ†όΑΞ TΆη·²ήΐθβ€KρI“§E™nξrχzŽΞΥ}›²Θ-Ξ"0FfΙ7³O~Ξ…ϋ{ψ‹Z—ώΩ•Λ+yeθž3™ςΐw~αΐw›)¬©χ=xrŒτQ Oτά==Ζœ•σfPb^Γ'Ή΅2υh™΅Α/UʞΗA„tύ„Wν.ͺZρό…βy₯U>*A»ΚΚM>β:Švžη(’ΣλbE«kλ•‚!ί†°VΛPJV‰„ι•Jeϊ_ Ψώr7›…(AαtU]7· 4m&΅.n ιτ†‹THΧP`[29’@ N72ΆfwλQoiŒofŒ½ξVϋΕς8―1ΞΙήm½“žUόo¨ψ`βIάWeξK’Ίh ‘©ϋί΅Ν‡χ~‡ϋ;ψΫ7Ϋ­v―zπˆλLφ&z‡]BμΪS)βͺŠ[|W]μ?fΝ‘ΆΘͺ‚\ρ·ΫXΆπrEΏά •-/p=΄-Ϊ$Λ>Um Ή7έΫΪΙώSQHpO&QΈ$4Κ&d]2`κCυ*`;GΥΆ¨™ΥA¬Ψp9ηΩ(” €ͺΤ[Έ6³₯ ΧjωctWS[³±Lk6ͺ‚^Υƒ―j…GιΏ:$εNΡΙν­Κ†ΝΛω˜-ξ–‹ ^Έ―u•%2χuWXϊ*…ΥL»λΣJΘۜΉŒ©Τ Sϋ—΅αΖά±a ΆS=ζ›—X4”7.σrΧu_ζ<[“ΥΉθ.ΦF>Kί:^ͺλΗ (w5’žtφΎk’»έήήΦ ( ]ƒlEΣή`’»@κ²Ιm©Ή$ό,Ϊ¨°΅QάMΖ‰ξΎϋ?ΥΰˆTextiletextiletext.html.textiletextilepxΪνYioΫ6Ά“¬«}Ωέέ”d-$ΛVΣu6ηPΪb +0c_&Κ-ΣΆ™r%znV₯z`ΤA™’₯ΪQ&@K$a$ΎΗΓ—οΓK΅J\>Jκ]ˆ]ά›@χφ:•lΙ‘ΉΟdͺΕ2?2™b™Lf³Xζ'&³•Τ7’Ί΅³Φ’ϊΓ΄Υ'Π#A‰Υ6vlŒ:‚sΑΎ™Τ5‘Λ_€²ήΙlͺΨx€τ‚Ψͺp›|4™«¬OΪ?(Αj­j‚EΔΗήίNžχνΟ²˜žΟ\‚Ρν,"—Œ‘§ ]—ΰ+‡φu4ϋΞγJ ¨M‘GœŽσ0m­)₯_₯ΒήΙέ©lʊ©*Ί"Ωθ*f(xitΟθgJCšΒέIj„‰MN5 'Hσ‘El/¬n ύaυvŽGΛD·ςO§ι0m]ΘΡy‡I,U‘«Ό­›9²aω8©CژL~t«•U₯ΚMWβό—+ό ‚=ά•υmγaλoΨϊw―υ«©ξ+«α-Xp—₯h¨Eδ«AœŒ©εﲜslŸh3Œg“>ςΠ M‘jA ­Κ„ΌoΌέt\UεA½H$L”υJ½V«νΤ’²+uΒ₯J u›"VΨZ“υvΪώΟξΟςλΙ›'’?GΠkJdlϋύ»sϊ?’ˆG38Bα»EnΠdJ–;s˜HxBΫ‰4›Jφš’ΖiOc)κ6Ž— EŸ’˜©4fΡ“atIME―3xθϋMΪ‹S‡vΰ)E5IR ½Φ@ΦW}ΤN3Ά1'ΘZΟ1ΫIŒ.Μ%TaΗTu… Ϋψ$ˆ¨ψz:Ο¦α|i>Άι@L‘…κiΐb·ΊΒﴃϋ€e07Z`ή3Jσθ‘aΤͺΎΝΑ½}³‘Λπ”8ΐXcΙr\Ÿξ4€ι [dCTυΪ’μJ€ύu‡R΄ˆΠ­Ξ ΛΧoψΥ%lΠ¨sšιΨB+gπο“Ϊ§ C·:ρŠΩ ΉΏX675΅Pm€|Λ³£ΐfMˆΨ dΉ˜nλ0IŒ, Η(ήSξ=εεώH)ΧiD8ηΈμGT’"ύωτmQξΦεβΣΗ5ζ›°mŸας"Θω<ϋOΰΨζƒσlаdO(Cβρ Q> ΐ‘’Χ–G:φOθbZΟπ1’eΉ!ΟΝΗ":–bcKq±ˆŠq{¨‘΅$qE’zΜXΰΛΫ!έD±'αΈ26QςJBYα”Ζ1‹ι_j\Š„θA ?αu¨Ο©F)»œ_);—`z;κ|ό7—ώ ώ―˜V͊ΞσOςKΛEΊξΎ–k±©Λβ ¦η“ΞΙqEΫ}‚@STˆσWΞ ΫBŽs‰{λcξ‘  ‘Θyƒ;1u^ξ5œΡ“oGkθ €ŽͺGΜσ§Yδ}ΧY> l–F{ΐ£-‡υ-!ύ%EΪ:?ΜΦ₯pY6@"9‡«@Ϋ)P –¨Ί€ϊeͺ}δ].ΦίΩ= •ϊtΒQzηGάK•™Οά„.₯Φ%’>β’Vz™΄₯jβΜ•E;{ΠGw`mδωo$‘εγЏ― w›‹z·LΜ»Χ β―Ju pί)ϋΞUα3ά†A―σT˜βŒ&ή‡._κUΦΈ’ nπ›ΞΊcγ~λgs½»εΤίͺψZψΠrΡΛβ5έπ*ό΅kΆ4PτŸ_Rv πυΧ:Ι|ΰΉh$ΦχTŒμΝυ^Œ!6’ζK ‰TTό¬tΡ€¬λ§(™p΄pD;ΰw,™9†VuHηΜJήΔkoρyeώQΤXML xmlxsdxslttlddtmlrngrssopmlsvgxamltext.xmlͺ(?x: ^(?: <\?xml\s | \s*<([\w-]+):Envelope\s+xmlns:\1\s*=\s*"http://schemas.xmlsoap.org/soap/envelope/"\s*> | \s*(?i:])) ) ) dtd_break['"\[\]()<>\s] identifier[[:alpha:]_][[:alnum:]_.-]*invalid_dtd_name[^{{dtd_break}}]+name[[:alpha:]:_][[:alnum:]:_.-]*qualified_attribute_nameA(?x) (?: (?: ({{identifier}}) # 1: valid namespace | ([^:=/<>\s]+) # 2: invalid namespace )(:) )? # namespace is optional (?: ({{identifier}}) # 3: valid localname | ([^=/<>\s]+?) # 4: invalid localname )(?=[=<>\s]|[/?]>)qualified_dtd_name{{name}}(?=[{{dtd_break}}])qualified_tag_name0(?x) (?: (?: ({{identifier}}) # 1: valid namespace | ([^?!/<>\s][^:/<>\s]*) # 2: invalid namespace )(:) )? # namespace is optional (?: ({{identifier}})(?=[/<>\s]) # 3: valid localname | ([^?!/<>\s][^/<>\s]*) # 4: invalid localname )ƒ xΪν[{WΫΖ·!„ζE“¦4Aΰ “W!&*χ^Ÿ „œsš#;ΩVA'²δkΙ Ήu>ZΏ[W•vΗ»’l ‘=ρΦ³³3³3ΏΝ.[s5xζTΣ2MΥQT2τη:Md΅ZšιDdΩΰy‡"k:MIuC·©­v4ӎfŒpgh†ζ2ο›1<οφΝ°»u[s€zGmΌΣbΚ…ΰy³oJΧ|gZο͈t,xή’HΫ­έ±šm[ˆv<™φ!¦½tφ‘Υ5šR]ώϊ²“y(5­nέΠΈ|ΐƒE+Υ­fΘό{€JΜ Dτύ’K@OKρ#p7Šˆδφ”­š~τ©ΆΖV’₯T{ΖVž@S~ΠC¬]ΘHŽΟAΪC‰%;Ru&ϊ `Zbq‚'n7u'B}τπhΜ¦ΤmΧD$ιfπά žYτάh. ωϋ°eΌ"€pά2²Μ+`KΡ„˜˜2X­φ< P›€ΚBSϋU7uοWwu$½ΛΝ―`³ΐƒκ§P7¬Ζ;ŒPf„΅Έ$…‹/Δ/ŽySx\˜IΏ?Zω˜£›hΣτfA7 νP5 AΠ}hi¦τ^wŽtSΒΌ]Ύ£€bΣ€ρ;V·ΦοΆ4δZ*8N*ˆΕ«ŠYΑ8ϊaξP»Q/ <•dϊiΑ°υR”Ε…Y½p|•3ώ„3Ύžaϊφ$/Χ²PX½·:Ν‚ΥΦ|ω)η"Χ€A&Ι½Αiѝ>E~‘£b£cͺFνb24u-nΟl­α=Γ%ϋB‚”ϊKΞΣΜpr,”.Λ1ύlS2B¦£¦9γ›œρŸN"D6A–SρJβ’Jy+―ŸWνΪ2^j‘ƒu΅IΎρόν|”Ύ•z^€Jx)λ$xΛΪοƒαGY­Κ€ΟΔhd#ΰμcy©·Q4h„ϋ1t α=^•‡6Ε§*g‰Aƒ€ε―<Θ u?ΈΧαhΗ!Ne3ILAπE&…Xˆζ‹³UEΜonmT6Δ<ϊ5œ1 ΦI™Ξάm©k‡Ί‡i#`ξ=ώM­aΈιΛΛσΈ`=Α‚<ΓdR{eqV’`$T(”L1²©Ε˜‹φGΜΛkω­—›•7{%±——υθ/Q¬ΦΟtΓfb6,hH±ΆLH9χΥjŒa§Œ±eΖΨclš16™IΚY^6&4JΟ³1›IΥ[‡Ό|,N έœ'z*ΥφοΫjώύΨύxPjK’}rΒΓ5Α³€ΰZΞn« Ν›έ xΌ•gύ€§Ό]σ ζη„GkB° Τ\1Ώ&Nˆ²χΙE3έ¬Ά»νͺ5ΰJž—Χ_ Ρeςˎ^TΓe9αKNΙM‰ν-ώ$’<šαΣΗέ1ΕojGWQΙ_°œ#­γξm׍R·}Zυbω|Zηys&ΕΒhZŽŽQOIvaΥBSΉ Ζ†T-ΆgΉϋ'DrΖ―qΖη8γw9γ79γ‹œρ%Ξx3Ξ{gz”Η―“8ΎQ©l—χ+$hόΕ τα1č2ΐς+ΖΨ-ΖΨύLŒΖ4θm’n.UλjΌ€WΪ­”+oόGΉ΄ί+o½*ύΌ/£gow§ςς?₯]τΗξΛΚF₯όrΝΩ(ΈΤC­ΰα;£h₯ —ΟΉ9χης/₯­^ygo»Œž―J}]~UΪ"x―ή-«©ͺ£€Œψ£-S»†½]d³œ O¨vρξD;P­ϋΌFρš‡Ζ‘ΈX;Ώ`Gτζdfσ`*Uήu’JEQψj’OΩ4ς›*ΙΩHœ’φy‘oμό³°λsbuΨ χά`ΘΈ§˜Œ€˜‹H[Ίι₯ζά¨Q‘ΌUηͺJ΅–½T½@ΟΕd ½ιΊ“ηυ‰ œΈ: Ξω‘3ž†•P ο½~±]ήμνΏΩ―”vˆψeazσϋFΑqΥιͺ΅>„Zό|RΪ.ν Dό”ω$8jŒΛ'χcί šO¨fΑ$™J;{(1lμΎ!vϋ4ΪCt€ΔσΑŽΣοT²P™Ι ˜ό+0υIΐ•Š\ϋΔΐ*θ8ˆ0Α‚š”–=_―‘:ϋ–Š^bf„αΪμΌ­£ μΞ ΅Μΰ}ςHLΚJ―έ‡ύ†q~Ξ.‡½^΅εjM€ ΟkΑ&ΒΓ‰Ϋ­ή·/‘h«„Σγw8˜ρρ»ΑzvΪϋQ£ΈM\ŠΉF₯―ξ>λ s?.ΓψεjL·θ[ΖXŽ1Ζκ Ν3Ζ2i=_“ΩuίQ’τƒk?ͺ°0q“ >w2)σΓ;?P†:'ιaš“"Yc³C’txωΈCRΒ “b¦’δ%Δ‹η™Ζ‰'ψΚv€ Λ3ΖφPEhς;L/„bœ?ΌΛφCJځ=‘spPU†=Ί`ΦΟ+Œ1V3\Κ€5e˜@”ΈΊ¦οΌ;Ής½ΐC0!“ΑΨGυTΦ Οχj'ΛξΉ½\|Κg…ŸR γΜ‘)d Σ—ΔΏٜ±³š™7ZΘσlΥ„<·˜tϊ{=ΔeΊώJΘ^Pδύy7»“»ŠίΓθΛω…ΰfΈ:Υ…Ε9XCΔ‹8ΤMΊa νtν™M²gœηA±ΏγŒ― ΑλΞxqPΣ,žΆ«=KηjώΏƒ€r΅ΕΏ“«-žΆ«=Λ€w]ψyβ9όϐτHu:k₯ογ;rΕUρσ=ΉSΌ'7|χ4ορΒRΊ½6lΥ„αaψ£.ΰ.έXJ¨ϋsγCͺΐƒΝΛT ό+tωΟΩγ™?‘:±½>σKkλΑ‰Π›?A(&q‘€Ε–ΕώΕΩ‘ΰΖΩΊ7©§¬’³ζτ·¦γ.Ζޚ^ˆq”ώK†Ό»Σ wOαξtά ±w§Sqρΐ|›]kΰEΚ‡¦[g^ΚpJΰiΓ‹‘i£Ψ«ξƒk‰° ώŊβπ—*ώSΔZmYAMLyamlymlsublime-syntax source.yaml^%YAML( ?1.\d+)?_flow_scalar_end_plain_in|(?x: (?= \s* $ | \s+ \# | \s* : (\s|$) | \s* : {{c_flow_indicator}} | \s* {{c_flow_indicator}} ) )_flow_scalar_end_plain_out<(?x: (?= \s* $ | \s+ \# | \s* : (\s|$) ) ) _type_all‘(?x: ({{_type_null}}) | ({{_type_bool}}) | ({{_type_int}}) | ({{_type_float}}) | ({{_type_timestamp}}) | ({{_type_value}}) | ({{_type_merge}}) ) _type_boolb(?x: y|Y|yes|Yes|YES|n|N|no|No|NO |true|True|TRUE|false|False|FALSE |on|On|ON|off|Off|OFF ) _type_floatώ(?x: ([-+]? (?: [0-9] [0-9_]*)? (\.) [0-9.]* (?: [eE] [-+] [0-9]+)?) # (base 10) | ([-+]? [0-9] [0-9_]* (?: :[0-5]?[0-9])+ (\.) [0-9_]*) # (base 60) | ([-+]? (\.) (?: inf|Inf|INF)) # (infinity) | ( (\.) (?: nan|NaN|NAN)) # (not a number) ) _type_intή(?x: ([-+]? (0b) [0-1_]+) # (base 2) | ([-+]? (0) [0-7_]+) # (base 8) | ([-+]? (?: 0|[1-9][0-9_]*)) # (base 10) | ([-+]? (0x) [0-9a-fA-F_]+) # (base 16) | ([-+]? [1-9] [0-9_]* (?: :[0-5]?[0-9])+) # (base 60) ) _type_merge<< _type_null(?:null|Null|NULL|~)_type_timestampδ(?x: \d{4} (-) \d{2} (-) \d{2} # (y-m-d) | \d{4} # (year) (-) \d{1,2} # (month) (-) \d{1,2} # (day) (?: [Tt] | [ \t]+) \d{1,2} # (hour) (:) \d{2} # (minute) (:) \d{2} # (second) (?: (\.)\d*)? # (fraction) [ \t]* (?: Z | [-+] \d{1,2} (?: (:)\d{1,2})? )? # (time zone) ) _type_value=c_flow_indicator [\[\]{},] c_indicator[-?:,\[\]{}#&*!|>'"%@`] c_ns_esc_charG\\(?:[0abtnvfre "/\\N_Lp]|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|U[\dA-Fa-f]{8})c_ns_tag_propertyM(?x: ! < {{ns_uri_char}}+ > | {{c_tag_handle}} {{ns_tag_char}}+ | ! ) c_tag_handle(?:!(?:{{ns_word_char}}*!)?)ns_anchor_char[^\s\[\]/{/},]ns_anchor_name{{ns_anchor_char}}+ns_plain_first_plain_inC(?x: [^\s{{c_indicator}}] | [?:-] [^\s{{c_flow_indicator}}] )ns_plain_first_plain_out,(?x: [^\s{{c_indicator}}] | [?:-] \S ) ns_tag_char7(?x: %[0-9A-Fa-f]{2} | [0-9A-Za-z\-#;/?:@&=+$_.~*'()] ) ns_tag_prefixN(?x: ! {{ns_uri_char}}* | (?![,!\[\]{}]) {{ns_uri_char}}+ ) ns_uri_char=(?x: %[0-9A-Fa-f]{2} | [0-9A-Za-z\-#;/?:@&=+$,_.!~*'()\[\]] ) ns_word_char [0-9A-Za-z\-]s_sep[ \t]+ϊ xΪνΫRΫHΦ†\Ι=™\ 2ζbΩΘ@vvvβ qς¦Ά*Kͺ–𐱠+lTcKY&ˆω…ύ•ύ€­ύž}άOΨξ–Zκ>ξΆl‘LMͺPe΅Ξ9}ϊτΉK^ΙΗ­π\0lΗήέλ8Ν_΄žaΉ»«ΫώBQΘlδS 9žο ϋM£c0σO'ΓFœ ΟΧ9Ψ¦Σ횢“D°šΥνu¬¦εiήq/β|h£Π˜)πX‹XXEq#ΩQ5§(HrθzΏ„ΊΥy• ψh ¬θ…θ’€T•’ήχ €ζD"ŽŸ@Qκ;zΏΥͺΛz]o|:),–ςώ‹₯Ή…—h4r˜v½VΥŠΎΕΛ2βd—2η£ώ­οΉxCv`bgdgDΆΤ9 WmyΗΫθšΟΰ•έΑίGRΰΰ4›ϊλb]i”Υb-―$K‡£Ε¨l[€¨#YLΚb₯LgYMδ0jŽΛ+υ4+Φ‡’Ν"nF–έŒμΝx1y}ΝGB₯;ZYΈ©τ’κʚ|ΛΔј| ΧU!+²έ=;β};ΰVΆΰt4Z&'cš&νΊνλ‡χ·Ye“ySκkŠο_ύνZWt―Q.κ­²^A±σœ’8Oš 7ωΑq[Η;0]ΐ η1³ 7ε‘H:H0¦k5 °vhΊ}ΌψB&οΗά¦/6\5W|χκ'τY«λΙ)Eτ=―W΅g―΄Ÿ ν£5Jy΅†-5‚Γ`‘Κ+܁Ǖ…{ΓΠڍOOO°cΘ~\©U_.—η—w+ωίJKEϋΎ†’–ˆΓC:\_Ξξ°‘žŽb9§ͺŠZΛ‘Ώh‡¦%;€$μu‰pƒGvλΈΖ>‚C!k†έκ;;-ΓτzŽλΕ8=YΧΡΫΉΒl'ς«Κ*»M’k΅†$’(ΐ!”†kφMχΉ'‘H W'τ$Ȉ$SLDΕ 2dΔΝψRιϊ„hY`φΔu°υA’χ˜ ύ„^νZι,¦έb Ž΅eθ"Δ‰Ηο΄(Όε%Ϊ―W+8œ‘œ|2Ώ™‹t½~²Œ¬2!Φ²Μ°γ K”Φ£U½i.αΧ§±άPO“²Jucnΐ=±œΩ±•r‘]e/ΆνΣζXρx$$f”gc/yVΖΞ[ ₯ή#‡½ηž‘8„ ‡΅μτ)μCΌ”₯ό:©Ϋ#UύΠ:8ίςυ-: άƞgΆ]S™[ΡυΝέ7½†TΧ[qττΜεw'ώ6sωΓɐνD‰GσΩM;^έ(`q-ΖΏpN@Χu¦“γ’N–ωΤ( ¬FβKC‘ς4;‰~}%:4^½']Μ—¬ιF«yΠ½βnJt±΄4Ύ†r]!™-}5Ž΄Ο4YΈŒ…̈d\ΡiΖΙ #γ!Οqbͺ ŠΞπQνŒ Υqœ£υoqQ-Ⰱ~εΣ RyTαλ[εI+]1mw)†η:˜Γn8Aβ87Z¬ $ΜngΑ&H$Θ’¬Ϋ«¬`ΖLζί0ξζ•η§,‰”a™%)τ&#Ώ[!ΔI­…Ιζs*ΞΙ_χ¨;˜€Pb”—Jm=₯0+’œηκ†M/+Qης.ŸτΛXv6“tˆR[rΰaN§$œ>Œί€ΆL χ& qNBγΎdόŽd|)ΑΑŒΓ‹ΈςͺeΑζJ,? φΜ}6ώ‹φ?ώ[+ξͺ¬η‚†Θ€^ŒF^ŒU₯y@ߍ0n”τ~ƒΔ[ά;A}’ΠΝc5—¨‰Όώ‡|\quΊ’jzRU$Η£HœΥ’ξ«~ρ…ŠBÚφ¬‘֊u­ά`BΒ9.³”aHΐ!ΊΒ>κD]Gδ… qN›JΫι΄ΒT†€ΓσP'Ο²=swWΜ¦ΥEXv Ε"ZτΜ­e5‰h1IΈΚ"p©]§e΅-D …’.?ΐ—)ΐt&…» }ΊUΤpuιέ•ΡVt΅£ŒΙΎ;RUΐ΄σΌ₯U•…τΈJؐ‚f±@½0†ϊŸO½zͺ'; c:—Έ6†sΉ˜&@ΛY§½‘ a^„—ζ{0βl΄gίΆ>ηΥ“0ΪG½$ΘϊΘ@}Χ·Jc€³£¬”Ό@X͏ޒzk Χ2pYf}Β©’ΎιIw†Θ’d|φ΄Ϊ­’ΓκhΡQŸ?†n_šD·eέ²ΙψΙxa‚9ΕUΩI".sΜό‹wmi’Ψuƒ sfεKdΉŒd[3©΅K·‚{¦7_± S₯(2熕…χ€€tπhb|ΫεDΤ2?ΙΜKΖUΙψBZη1Τ€Kκcέ•1Με›Lа8²Ρώ26ΉΟΣέ–±~5“Vœ=Ηy…OόΈΦt:ώ&ωΨ~σƍτίόψν±ή?6ϋώ{όzΛ·ύMίvόMτχCzξΐτί‘ΏoΏφΫF§oϊΑη«7[―1ŒcϋoΡί¦ο΄Ϋώ[όΏ±‘ƒ)$'―)ΕΥ=w ΦvQ W JqΟθ›ΚΣšΒ¨ †ω σƒΊUŸδϋΈχ°Ϋ(©1θΪ* wDζ|†ϊ¨kΑQ]ϋž%•"™7Aώά¨α‘†Κ ~ζ.αJ =V-κ•€‰JHΈnΎFχ|ZΖέΙ8Zbβx.ŽEV #[vΫ+ώίά„†°₯‡ΰαΣz nH+ŒMσΥfn;žb(Α;!θ-τΰ@A9?ώφ”ύˆΒ±ΦΥZ^-?0΄iΈAs9$΅ΆότDάEyέΑΨΠ-γ8„Ε;ςΞkD%@E°¨―Wω‰Ψ°μgŽ ήG ³έŠYΑΒΧ[Xo„ΰmœ!"Η Ε Ε cωΟx%X»θ2Ωͺ^ͺ5'œ€ŸΛ³Ί¦ςΡ±Νx«ΧΓσσηθKδq~·ηq0Ό!=Σ'ͺ¦;†½?ΐE0vˆΒόύ‰eΟq:¦a kμyˆΛφ=Λ6ά Ή}ΰ&Δ€žsTˆ:*8ω8²`NΡΪyν€ kmΖσ‘`GΔEeΨς9q:_ŠXmrŒž$(η@Ÿ―[œΫTiI‚χͺ ͺ‰:πtΔznΒm›’­Ι*F,ζΩΧ>¨ΕΜLz!)Z_$! ¨ύ@mc CUχ°5ŒΤe]γXρϋχSφSφo *݈a['―χo«dω-9ί4Μώ°΅atN`£#‘"<Ε6FΧνQRB‰#βν»‹KΙ|qG%’sˆœΥ,‰ί\Ȉ³$ψω xώ1—~Ε’y!RqKŽγ\bΔθ“g»°£vlΟON1iαb ±›§Ω‘±Hβœ!V}Q/ΦτΫΓzhŠ”;οJŠά₯άŠυ¨Z½)TͺεΚϋέ‘RuτDWޱfΔ Ώjdxΐ€3•HhqΑS— ¨―ƒί.'l%ρΑ`"|Μ3Υ-ہĀe"H:Π’΅•8CΗ…}Žύj&{ηΏΜσοv-Οι_χiAŽηO™<ΫΠ²”LGΕ’σ Μ‡ΧλZ]Ξ?–σΕuνLV7ςΕώφYCEFΏΖe4–©Ύα*(Ϊ+ŽiŒΊ”$₯T₯GΩ©ΐxR©zΟ₯ΐύ^Κώκ΄έd~Χ¨ί›šΪ]„έΟ[Zδ΄ωBωuO)₯Ϋ:{ω…ΠΗW­³_ΎΘ’PxB°ϊΣ&Πύξ=ž?³A{%Eχ΄ώs5eVΚώυ”ύ)ϋwRφ—SφWrΙεΏ©Υ[ByM2Ώ±ΝßΆEβ'¬eΔω„]2ˆ‘αφˆ3°L—ώ޲™8^›–R.CXtΌΑΐΖnΪUδ½—D·‚iΗDΔέ”=ιWοω‚ˆk[φ Δt₯Μ!N¨[R…4Θ‹5 ςΉRύ»ΩWΊNΓֈ³κlsOω (·Ψ Εp‹ζσŽζlhyYμs4οLwH΅μΓ4OeeO!2‡}-kN!Ÿ¬…œ§„Όζ9¦όΊΆ`ϋ…ίβΊ‰ƒΛyΆˆ‚ Ωεˆ–ΫΠ0‘Ψ+ωΘl›1€‡Σt>c0₯gΔ‰ΖΓ²^“ΗA<“gdq¦ϊ0ΝΤψ΄2έόΆ'Λό;Ή%͝׻λ­|½ΫOηΪQ¨@Σ °œ6ΐΖ—#,›(αŒφm€°bΪ,hΚΖΦΣΏ©IZA+E!»»dη\‘ΐρΫ-λ—S ϟD#δΩ3².Άυ 1mΫΆ @CFhΨω¦`ΣνQP˜ϊ bXR5‹Ϋ­s­πgl€‡3°qݜαΠ›–2Rξλ:dμϋW|ηhc>†E+ςθj““ <₯­±kcbv ΄θŒŠ‘λaΝ‹‚9>l[“Y™~pΰξ―=;/ελgΜόηQ‡σ{I:ASΗ·rџš₯Ş'§pD ώ›‘Τ Z₯Y~;e?mΚ»9­ε!⩁ί'§²€³‡³©ώOIσθάΜςΆΨΝ³„Ύ2ρ—F¬Q'j0?³αIώyΆΑIώ|.f©°ΨŠžŒ-Žƒαί…±Σρtp–ω:βŸΐ«{J€\'Υ2©ΦΘaωΓύ©“ΓZΤκ ³θ׍ΎW;xKθOƒΌ=¬6|Ή₯j£R;¬’2U€F5;8zGu8Ϊ«‘ϊoκ₯ί9u–RΥAΣλ£ ϊTͺϋ€T«UIΉRzΏgeθ]Tͺ‡΅Ϋ½z‰ΤަRΑ˜^…Υ¨°%Ν‘Έ5QάψπO[A焦ύ”qψF:ΙnAdaadbadsgpr source.adaxΪ½V_oΫ6·γ¬Ά‡­Ψ†E²!’ kΕή–΄0μμ₯QjP-‘H•€βxΈη}―}³e–ΤΘE΄€£ψηώύξNw2ڎο=£BŠ…6Š‹\/^ΎuΗG‹’rαwǎžμv΅‘Κψν#GΏv4•eΙ„Ρ~c^Π„»έγm ώͺ'Ψιύ¦Ηπ€§ηOγα»Z–…™¬“‚…4££Φω£ΆωžΑιnaάsώΥΡͺ©©©αR„[rΑ›©“ΜDfενeψY,<£ŽrqG ž…Ό(XN‹°XΞΉ˜;>VηΙθ1n©4vNμ;――ϊ7ή;²VιΞγΡ‡ΖΈT?2*Φ ΐ`>'α4ˆΚ‹_H,"ζy7vΒ‚ ζ›gT―¬šγqOj0G’ βΑ‚Š0B₯dΚ²Z1Bβ$Φ3λ— ρM"8 ’‹xsx ρ~#§ΔkώΤΧfhθ™5 ψθiί½['νσΈ_gœ3­σ:φžό«kSEΣ[š3b•nLIdΆ!$zΟ°ι'6y¬aƒ' §°°:ׁ΅ψ )+P,E‘RΝ@³‚₯ƞ"Aƒ4Ήό ΐ?Ζ¬ί»Ψn­zΗ.бŽ.Ώ@ˆ~”%ϋύc‹²*(xΙρzύ"67S•βwΤ0½ζfEHσΥ1š\Ί³O·΄_λR)Œ’EΘΛJ*σΙΟΊZΈώΖήβη]μ–sˆ ψ E$=ί4ιώœw8Ζ――€&(ίΪ>FΡ?”U[’qΉΰλ( §JΡ PΆ,lσ…aΟ% d,-¨bH <ƒoC!γ972 ΨW1ϋΒTBΔΥΨ½dΛ'»η–RΑ ζL0ΕSΘ₯‘€7Πt. SKš2ΰκΫ€,e‚­AH’FEεYPdm@ή1₯x†>ΗRMσ’‚ “}εΆ3ƒωŒLε¨ͺ’"g>α+ρ±!©‘Ύ«Ym·L­dΎ+H*ͺ,g-K|Υ‰ΩTH7"]))ψ?ΘίΠ?άΑ9YMzφΦv±¨B˜Š Apache Conf envvarshtaccessHTACCESShtgroupsHTGROUPShtpasswdHTPASSWD .htaccess .HTACCESS .htgroups .HTGROUPS .htpasswd .HTPASSWDsource.apacheconfœxΪΥΛrγΖqε΅“Κ1•Ψ±¬SeΗ.[‘·œψβ²#S$$‘Μ—re%¬0$'1iΓ·δKrΚ!—œsΚδς!9₯{ΐ΅\Ψ•J΄΅Bwc=Σ=ύθώ=ωσ=υœΝV„…Oοm|Ώx›€$Nυλ#υ|Y=Ν/©ηύ{υ?GF#5F΅ο½ΚώEϋ2<Ρ£½ͺž_­h˜,€ΗK’,YȎŽ*sλg[=£,τŒ€Œ‡Η>CκΑJήΚΝώ›zΆ>i·Ζ1_orρ{@Ro™ΫσΗ4N`ˆΌΗbκ₯<ή”lrΖšΘίΊOg¦ ΈŸ4ο³KεokνΡ`ξ & @v}Μbΰ>ΈΰIšˆs#·‚„Š_φΌ Χ:~xnŸ΄~Σ.ρςž]yχξ]IΙΒΨ‘—*΅ `ίXΊ©4Ξψ­iΜΒΕρ 2S^ω6Œ•’ϊK!ͺώdeHθώ]BχΏ›-΅ής“O>m9τ6f)m9ΈQ]ϊνvϋ2y(4R?[ςDηpΒ‹ΥW-œζιυm­‰ι‚£;΄μA΅}ξ=Ω_Ό;Τͺ d‡ΗθaλΗyDγ aŒ<₯«(O(ει’Ζω‚‡Ξ™ΉΎκΫ';~iΟ•Œΐ)€Yr‡˜ž·%Υ“τΪvϋˆ€ΛΪ½x\³ΓΫpχ²šnΒGΖ&Έ^Μ’΄0’LA Άw ‹<ΩΡζ£έύ†\»5’” JΝX”\Oϋ@Ήν[Σa<ΎθŠώΐΛ«VΗC;†–v8η9’I‚zHV4οψ>Ψg’iwIΩHei”₯Π&₯ριf²‰ ]π[+τΈO}7€`&’6Ί‘qΜ|h‘₯K9$’OχܐΘZ§4Nμ€i-(Xt5­h©\D{Ϊ‡σ4·BrΠΑ 3V KC|ηVσX·•XŸ/„Σ±&Q’]G<υ9ΏΞ’$·}y<Ί°_ΧΉzAζΣΦ(BM‚φIώ9₯ˆυ†–Π„­(ϔòa14u¨—IO(ΘύCk:εώf‹pΖhΰ'»$—}E·¨}\Ύ <τ·Fγ‹>½‘8ΐuΑ’jδƒ,₯λwέτ•r=IŽΝ@ssG άO4° ŽQ7wΑW%σm±Δ(¦πΫρfξ„άρW,Τ°Π ™K•LB„tΩ"cλV~ HzAB?  ‡¨©9J 5Κy€0‰ΑI}Θ§ 풐‡Μ#ΰbšΠB@ V$ΝΟ~ETρΕΨ„+Ήλφ/xΘγ.‹ΐώŽbŸ Z—―`Ω‰* 0˜›’’γ’ΎΌ}(wz£’©MΨΖC€ΔζŒΖ¨Œ‚$œ0R$ 9‡_λ•ˆ―.&ƒ>Ž RvHη£}yU˜Ž}!Ή ―ιζ–Η>Δΰ1­΅>ͺX©7`mΒ:c»—ŸΊ>zτ^σ UwΙL zΩ…‘{Ω**Γ>)ΏΑϊ.ΰ€εη1Ο"ΠβNΉzœο:€Ν‡ΐξZl ,°08…‰yΒ€¨­0™˜ΙΊ:‹©h¬Uέ|mΠ&ΛΆ >αρ5Δ¨Hq#S©r%.;|,'aαvo…λ.Γl₯_™/ΒΡ<ΝζsTy8ί.Κγ”“X6@σeΎύe,μb"«ˆžH>e«*“‡ζή΅e•?aα―>μ±₯#em­Ρ₯Χ*Ί΄ŠV΅ͺ€Ϋ‘*‘ωΣnrq†™ζΚ4Dx£Ϊ™~dΜ$TDΩ§C¦ysg‘c΅σ0sE…[—‹vύωVp›Ώ@ŒP ‚αώυ*χΨ»–χ?ΌƒΧΕς°J7‹#)Τ1Ԑ9% σΐψά0΄εŒ\οwGdHzρN°ΐΧΛU{E²=ΡΛΧΖ²ΐΎoV<±hhVaͺ ƒ•· μ€A–€ηΠͺJreΩJ’°άΡπΕό¬f13τF΅+:ίTοt°»³@άdμ%a-½CΈϋiwώUύ™ώG…ΉmΙζ%­Η±ͺfJVZa_Π†žt…‡UξΉBν³9MΩΚμ Μ]θJX»’¦uψ}y«v_Δ0΅[σΚΡΦΦτ{ρΰzΚBΏ7άBΗ$Ip’‚¨"lpzsΆ(©v€kι G‘tΕ›)Έ # †άκ•tΏεΠg1ΔΦc² Dν5R…<:)δ WΰπχνΔΰΫ‘+žRq6Lς4n~&ŸD΅{ϋOCν|ΏˆΤ§‘g`ά₯ ς`ͺ’{ŠήPΫ+ŸΫ½$Eη˜gˆΆΰ0UΔj‡>]Ϋ ¬£f‰ CS=%ΕM7‚,)U8e‡°Qhό‰ΏιTΓMβ G¬έ€nΉI§$   1DGW %iήBΨ­Ρ1Vθ ΠΈBŒΛ&Ξy.ΒοZΆώZ²ΥΕ·j«¬u„ ‡$Ι D"*b°HΟPλ*)ˆRΔ41ζI—rKLχI’BIQ‚±·F0F•tξ$SM―‡#ΤνrύšΜ*π)«ŸΉι±u}™…³ Q;ρεΔ2΄ΐΤ¦€d|Yβ}.e“ψΟ[°Ϊω?n0ΏΒ]Θ₯5 ζίY9E%”¦UŸX…κ#­P™Ξ‚™8„‹ŸWΉcΜ(ΟΦrσaΙMάδπΏΡ7]°ΌA€:λ s’ήiαψδ¦–Ο`Ξ’šιˆ’Y,,(ΊΜ΅‡`ύ5μΜV H-|~‹c5 Α}9ΘσYd˜ΒΘ–· ’ζ”Ÿ‘ ΈηPyΦhσXόΌ(HΩ―X©o‰Βn(#$ŒŠͺ# ΒΉΧ ( 5ƒ0r£QRΓΞNpΦŸ†YBύΒ`‘"“nDiE@% Υj@β Ω’;[’\Οφ»· ρ@ΐ‰bM.aY©iβ^|θΟxνŒΚ1вΒ, αc .&’§aύ±yTΞ&}E‚ 'w S„Β”ir¨‘–‰χL&TεK•E \Ω³&"¦λtv‡?½’ό²VΥΫCŽ»±½C₯f[±_M½Y"`Έ!ίΠ›α'+ ‚ώ”{%¨Μc%*ͺ„ίqΘσfΙ² Gt1ObMτa)ÚΪιή)§³W$‚΄βTŠ ΰ ³&•­φ„δ#Γ»»ΆϊXNG‹ͺƒDΐ²>%ιhvT&Ψ4םԷΌ%ϟž²³‘&ΓdeΎ–Η―Œq;c»EPYƒ`cΒ›ΑWΘ_d*–‚Z*·@±ΨΡI6‘'Qh ΠΝ’ˆΗ)dAΔθΎƒ’’Ύ΄I ‘pTNύΉ\ŒΘe¬ ™„‘a2ιK€¨–w@E;½Iχs!t‘~Ήτ M^FmC΅ˆm Οc-Ϋ›ψ]”‹–{JQNΰX‘ˆΜ(”]˜š―ϊ’p¬+ωp¦Γ‹«HΰNΙΈ‰#€Št-cί”Œ ΄3]ύφΌ+ͺβ’ΨΈ‚ζ¦PŽ…+΄χήiŒI6De…ePΘ‘IΒ‘;,νύ#Σ—|fΊ¬/b0s6.bνΓmD†‘JΕL#n¦ΧE;HΒ PB(πžέ0z[TUaύT³"±‚‰j†$fς$)ΕtέβL’sψ+‘υ–&Ό‚…Τnκ΅Ÿ(G$lž΅&˜Φβζȏ]δϊEpΆ€Ϊ*ž>3Ί ΔΝ’ΈΕ;Uq_Ÿ»]S,―Ζς2!ˆ<›1Ÿx΅ΜVρυCΊΰ)ƒΨά‡;ΥDޞκύΗ uξ!+„&ΕΆPMΔφI?*>»3m ΖW.H™F‹\¦¨%ΈxKε5SWήΞ’$¨?3ƒ—έΡphu'ωŸD_Ε “ *“ XΈ€βŽ\ΞRΌGΣκ/HφΘHΤΤWkΔ-\%’€qp ΙƒT p q„κ:† ‰β.XPv曆}&l [ά1 lλ²ς1#MΌ`„}kχ{] ^}%ΒγgPΆΒFΔ Γ Ί„(W…C«Αςj\ ψ™U“ψ$–έkσ©αέ 4’»j"CήΕʜƞ€€7)πƒ*AzΓζ΅,½aDœΘλH€:dΊW«ΣΥηm|ɈαŽ.”δ°-sOJζΤ§I[wΥΠ챦šχη»${ά$φΈY‚7œνΏIŸ–όFΛh&>―Ξ‚ͺεBΏ2^H_?­βγ\ήθν\~EŽvάή?Paό;>ΤήH}κ ~5Qlξψ|σ9—Ϋπ/Υ£υξεΧνVλb2Ο¦εΜ:ηΦp’ ά±Ξ,Ηr$>·- Ÿœ'§gυ$z1rU±3zϊl¦’({4”ΤN·k'Ήc FkΦιυ ‹ž œFN4lχ!ΗϊbjΉ“Ωΐš\ŒzΉΫuμρdvfχ­ag`εγΞδbfΟF94sžΝά‰cΟσΞΘ“gc+Σ 4sF£IΓ?Ζ΅φφP#bœβπ¨`Α—†ΡdΤυ5ξŽΞ&°V>±Φμ™Υq$4€₯  Χy&‹ΡTΏ³Υ;ΧκJΰ‰n•CbγΊΈu“ k¦V]¬~κΨ\¬έvgξτΘb·έvή:~²uωΝσ¬A_~˜Ÿ²ί˜aΰ}‡bj5+šnW\_ή Ν+)Λ+ߎ«{χŽΛCέχžζPψ‚œ‘DQΐΤ_`Րη$σo ?γ=8φRη³Δ_¦i>―{ΒΪ-(Cm)ŸΗ|•gXΛΞρ?0Βησ ͺΥάKD{κ•?('Ύτ2φCυ„q’”„ιqΖ9f”γRΊ€i|κΑΦ{Iύ7J—IλςΛΆΠ΅ΦεoΫΏχjΔjόέZΨ;ώD£ςEt₯υύo5—θύ˜΅JAsciiDoc (Asciidoctor)adocadasciidoc text.asciidocυxΪν[{ΣF6αΪ¦w(”– α"9±!z nJo΄εR_?6JΩVb}‘%W’I²8}Ψ?°ϋ°ίώΗ}ά}έ—=3ŒF#4rέudΖgfΞ}Μ9#žŽ„Ÿ’η„αΈNΓΟjφ³a:·έΈώl$ω9•oΪnk£Ρr»]Gs€Ν-£Ϋ³ΝψP°mωε¬Ηΐ‡sΣ3μψHτ<‘μφL'†<šΩ3|?†<=Of@ώΦw†°γ9ΈϊVΫl^ όFτ<›μφ½–ΩX3–ΩŽ»Ό=Ο$Ί΄ΟΐŠnΓ6š&αθω~ήμφ:†o1$Ύ•©νφ›¬όήΞδ]Χhy.Η»wΈۈaήΝδ/†α'~/{bΧqύž‘ΰ‘ψc$?τ™X j‚ŽηφΧ;1θ ρΤ<—ΥΫ“™ΊAρ³Θaχ›~Λ³zŒΚDΣοχL=Νιoxj9Ο8Q§ΏϊαΟ8 #ηΌΔ3޽'S`X'mΛ1 θ'BPΟ\3=€ιΟ8‹ ΪΣ΄šΆε6 §Υq=τ)Gfh8Fdl0ہ>ΗΙΊ1t>(r_θgΎ!Υ&Ώ+™ƒDn €°;#@9+Žέ˜ΰ΄Έ―u³ΡτLcƒΐ]Κ )7ΈΜyΖ½+™8Gn]倜αΞ¨Κι~tΜX­$Z&zΔr©pκŽA(}“ZΓ3Zΐn 1ΕYwˍέ*rF&₯±ΚqχΏΖi ρ§δχkœqώ–€]ηh…΅‚ν†ct)Θ4'ο6c΄op 2ύ–Ρ£CΜpDYNΫάώt9ln αΐœ3ΉΕΝf9¬3ψŒ[Β_“2œs³LΛ°m·Omφ T²ΏŒždΥG0T³œσΕβlΉΐC§o WBo§Fρ:Κχ#^ɏσœϊΕk%Έ=PˆΨWΧSΏy”K_qΪΑ¬›dŸœ‚βkŽ©u’ήε…6ς ‡³o9ΟμΩ0%+Άο8eσΝvν0ΐΖι{N (r”Ε?p*ΕδΧ{œ %Vjτcτ$]‘ ΐOQΜΚL@~ζ&ΒH6lσ9ΉέΟš&@r€n ‡9@3θQΠMτKΠ-τ˜ΣΎHCžpJ½aωm1z>ždwAΦό5@ΰˆ€fψ-Λj»-{1φΉaχΝD²%IHW­wg/iΊS§Ώ"Ψ ¬ω•ƒΜ|š ΨΥπJ”Βo‚Ε/!οAO¦Λ(‹ΰ(Y1Vτiέ―€ΠI~FΉU°ΧwZAθΫjmsΝ #&:Ώι΄ιά™Οsγ^‰m‚œZίΑC;"+  d8@@³8pl/8p•ΚƁxfh›ΆΥEq»ϊ9fLΆ}\Π>+hLΠΞλΣ%–O&,ιν6εmW¦xKβΉ0ςβ€χMΏrΈKζ.δξ‚1#݊bδˆ"2~[FΉHΧ}#Ώ*&?‰Ai&œISƒφ)ͺ\Ι4,MΈλ½ eˆΪ¨Ξ—4ΆΛϋd„jŽ2ΑMJ"Δε%ΧΆΊvF—}ΣΗι"Ρ°X%΄ΘFF'»t΄¬χ{5μςkέxZ-Cπ,μεJ'$=œΏP-χΚwGή+±.F[gΧE@³ψuό₯Έ.‚ΑK3䯚»Y5?M'§†“Kebq‰!p‡YΔIuφō©›;šZŸΥύ%XKQ―šμDΑΙ9ψ·,¨Oh’ܝƒγϊfσm‰ηΚn}ΰυ’Ζ&2ͺk%m·F•―Z_(§ZEŽ‘lτ }’ΠΎJŠs·>ςuη₯,q’τ„ΐQ$vq¬œsψ{–sX͌ŽšFkŽ6ŽƒΈ‘―QΣφ\“φH“Ύzš$π bM’ ’VW =€άφΛtΉce%‚ϊ΅πψ4%0²₯Λ•HΧP~μζ˜ έ)λΣ…‚#©ΆŒ‰β™).τα²RMΧ>ηY ΐέD:•¬H•ΤGv-ί XVZCΩuoaΦ½ύ²†,΅8/ΪHG1½Rh2’’u\4Q]ΘZpθA|J\‰3c –ςVτΔ>1Χο…’Ί™/©Ι½—iξΥϊ³WβεΕ8ž-FZ.‘ow  €(W Eω™€(cπΒ,²Ι‘ VŽ ϊΤl§ε$θ„Œp“FίΚΆζβ†?W’α…|EM¬ΊΙΟ„‚N1Aόρβ>¦ŽkυΌMΐύν.8kEν;Ύ(4ÁΓBυOFυΟΧ«_6–™οΥeILΔ  *τΫνdy΄Aο–νϊq(₯? 9ύω0­―ΕIύ£σΙs>ί|ψrψ'’¬Φ4Χ-'iEςξ•NΗ:̍E’`Α=Χ j4˜₯£ΠGφ ž_·‡γλkDΊ?"­ϋ$ϊ_Qυ%miE_——+ͺΎ¬±'W© !γπΑ uΑ‡ςΉ$εh4Ό Ι׍[e‡cYxXŠM€ˆL}‘ε¬Ί£‘n€‘ς/l£‡,!kN~:˜VΘp€„†hΈ,"εy©^ΦηΖAι@ρПV«ΤAοП†φ>Λ”“S4@p=cέ¬Ϋ=“εΎή (V½‚d@b°|_/1Ry&U©]>xΈψν`ρή£Α½ϋ>^\x°8ψuαρƒ{Ύά]xΊxοαmά3xiί8ρSYΖ·"Π–1v#r8}HqΊφβζԎ6TaAAΙa’η"6*νίbœηΛγ¬ρΆ.”Γχ4ΎŒŒΉδεxlYN™\½Ααp`¬‡Υ sΌ/ς9"!γδ›-―7ΜψP;τΩQw«-τ5“r”·žS1«{*vR‡!'φΓbg•Gψšαd½‘ΪG€ΡΎZpͺe\-(‡οQi|ieΞά‹™©”)%Ρqω ΊG…o€”u˜ŒT'ΛKu¦ˆEl՞§Ž α7Γϋϊ‚’;9œcD•}0"Rω&‡φhŸ‘h―‚£ίœΤκ―Ζ_½YސfΉlCςϊ6“‘‘4’ŒkΤτΝZE<[ΈuL£iN– Š²αS‹²pz“ωΞrφ’ ½l1€*hΏ*hUA_΄_΄Oδ(Ζ[‚>gν7νΣ‚φAϋw‚φ;‚φyAϋ’ ύSAϋ-AϋMYγ9k4˜Ή:§ινΙΊzr+Δ£Pώ‰ΖW[°ε›αmN³]‹n@Ζ*~D β\Ν-zΐΓρ£πή8ο]`~Σ³Z©Ž|tW°ΛΊ#BŠ8'Εs«μpεΓFš ΑξwΎV λZΩ²Φ85"ς’c#²ŠπbΥψQ_‚`²/uτλ$#Χ΅Φ;ιC'Nκω "Ÿ? τ_5Ό«Φ;8y˜uژ:/œRΠ‘’γθΧπ2°βzʎ’²™Γ†jf"_X\̚:«δΞ9)oDφ’9'~˜™|­I΄Κ­’oIΛΧΞ“/‘-~έ‚²i&ΧKd ’Τ~cbI%eJ „ΤΠC£3I9†Ύ-ΝΠ ”‘˜3WΤ%HΎA n9zB²p·ωλˆΉ¬πf<ΎˆS29Οα0‘nΥ—`b£ΊΆP][+αoσ·OΕ(”œž¬JΊφΈT]­4&&kγͺφbεnuύΞlœ9Λ›kLΩΙ―²΄««ͺ/nμΰ$,e¦¨C“†› ƒ§₯ςQΙ\hΎ2 uf^”½Λ (5XRχψΕιz‰‘Κ/$—Σ|š‰ψDΉ4SšKα‹φˆKΡ`{ΐ₯h$).‰bΕoνΤCπŸd=ή‰X“ Ε«ι“©έΟY^F(ϋ6TΊβύ€g SˆKω‚ :S¨ ©0T€—E)ΰhœό|γ€ά εm–δQ!»} ™κ5έ[h)†Η^5LYγlgθ*ͺΎmψbNμ9#‹‘x―†½6@H˜@;Ώ΄ί΄.hΏ$hΧνA»"h^Πώ‰ ύcY«‹oπMf₯ά/¦MΞΨΕHXήQŽηνOνίΪk‚φͺ,.³U°S θωυAΧ°μΐ¬½Αše›x·αχΜ–΅Ά­D Σ†―² Ρ>lXΠVA/uR ΄eq6όp£°«Θ}Ζ…>LRŸ}1½ƒ† KPΧ±·‘Y‚++'{_ρϋ­ΛκBzV1`γ³–a+Oμ£=Ν5ΨΕΠα8w έ61"ΪΨΣΔĎρΧΔ‘θW@f βτa a^¨ΡΡΜς2>™‰Χπ“¬Q†—w¨38.pΒΔ%nQ)Γ†ΉOτz]Γ•ΙGŽ4cm3vΙ!ψ †+"ΜaK³n\οcςaJκTrM8.p§2ΈΘopc {Knq™a %ξQ1N€[X³Ζ°NAH΅ tŠŽ%Κκ¨Ε²OάV;΄{8Ό+8²g ΐŽΒ:·w²Αώ¨-C?ΈIΡνυIAϋ‚φao―jΤ©„{ΞΙ σ ŠΪ6<›¦mCF!@yp™›mμNΑqƒ£5΅ύΟ-ι©δRώ=ΑWUšΛίwεtψέYψλHŽ d‰ίIiΪΕ™ν©»,¦―τϊ^ΟυCΉ—Μ?‘›yΪc~©TΤ{ΜχΘ.μοe%mWσ“ΆΩwμ^΅qΤXrχμδδϊΎ΄\_zΞΞ|GKYʍϷΡ^J―AΤsk'㬋‹ƒ“g]m7HΌέλPA0yΤΕ "ΪQ§NΊHη’A :TΨEΒί@Ώ€_*~'JEΡ[or":!-’&”ž¨pRwC}m©h3¦ήΥўhίοΣ―£o*’ͺ‘ͺ ”γ¬jZh ζΫΒ`Σ ˜ωάtΐϋΐΚΣ5ΆρL¨F@ މœΠ/έS6 Jΰ2cΧ4½†ώΠθ5MKŒέρL3D¨z?ητ*~ΞGœΣ„/ ‰™ΝΌ†΄l"ν/LlΆ‚ϋp?«ψΏυQdΥ„)6ΜΐSΙ LΑ2 ½WΡκκEŸ!UΖ°ρώ6κΟMϊ3Ύ%€¦Βz3Œ‘w κνΡ“ΚΰƒΦ€AΛ΅έ^Ηuΰ¬v ƒuΫυ}ΓΫ„Υ«λžΡλlόmΗνω–?0z°Go[[œό,Χ¬-pf8”pΧ” Ηέt(&>Ϊ*_¬αbςή$c)YhχŽ/ΰ]xˆ'¬Z@NΟτ:FΟWΦ]Ψτk˜Β.βΩZεR­θ8η0–•±!a{Ζ1zG,A»ψ4½ΰ š/T;Qr†ͺ7Eθπ»η™rX°[Φγ{7”ΠDϋͺΗ‚φ_ννννχe]αΏ†‰λ^ΑyΌ^Ιέ3₯oΏκ°ΰ]Eμ­cΉεν€τςφ[٘ΞΩ}X‡χj§₯’Ί₯yΊρ²γδίχ›²χ>Ι^9–ž’f©±Χ,u܈“θNUΜ•}gδ’ŒŒ/ΠΚ±ς΄4+™kdξ7Ρ >& Η™\Ω(~yνzρVγj>•|Ν(? )δˆΚ@pΦ6Zj‡Ύν0?$΅Σ―΅§j‡$χΖkDξG,ΉC;σΡ{&Aοί|ώ8Iπίz(NΦ?λՁ^ε„Έ~Όκ4ϋΆmξ>#$—”pe'ƒΈΞrtkt}ŸŸΣΤΉ9t†<΅ŒκΑΤ)΄ϋWQmδξάA₯as” $‘ƒ7‰θΗ(ή€ζ”>βδξ§ΟυPΑWώLX‰ž;νDΏcY‰Nν: Χβ ARM AssemblysSsource.asm.armρxΪΝX[sγΆ–œΝnβM;ιτ–4Σ”‰·ΐθΫγ:Ι²;ιτ‘φ-’ͺᒐ%A €.φœΏΥџΣǐ„D’½ns“ΗH|η~Θχzεο½j<D&ΖiΐΕψδ«^σ·ƒζΤτ»iΞ,Ν^7ΝΉ₯y«›ζΉ₯yΤMσΒΌέMsaiwΣ|fižtΣ\ZšwZόΖΕΊ]}·ΕirΉˆ’EΜκ=Ψ*ίΆ C>έ‘wnΑL8θυ¨ΪS\νΫU²_§E‰jSΛ`Β₯N § c›ΖB~O[Ϋθaqhσεf£jξτ|ΧόQ―v‰‘)§ΚaIΒsDκm6ΡJVz§¬N”dŠ5d₯ήΖΜo·lkΗίTγkv½Κd\$™%.OσLκ27³*οΘγxΧΧ±‘;1™Ζδ“f~~τ°`2fy&•΅AR¨*˜Ί!nω€£|ξN†υ#»b’QY6Ν² ‡"˜”™„U Φ/ΊΞ~ΏCοί­χ‚_7šF…θύΊ¦ͺΨP2C8₯χ"rξFΤθvajtŸ½ΨΚD‚%—#P ¨ιη€» $E‘ GΤƒ<‚‘ŠGηΈχtTL‡§g”Ή+fx(Ν52g³uσjΗΌB:―ΠΟΛαΥίώρχ±Έ‰– ι'ρœRΟ­†~Ρͺϋec%±‹Tθp5CώΫΦy·ΠΨ4ΙΒΜ5H H”€]Q ωBNY |,Q¬ xQŊψΝΦ°κAπ©€°ΈΜƒDb‰³9,„Ή–«fhd0!lΦ‹qΖγ˜!7μTP δΝ ΚΠ―‚D—²πkŒπ>­4ΖΑΌΐ₯2) yBAΊ7δ'Ψ”Ϊy‚ω&Α4bΒ!@ώXTՌO4φX•Ή \'WlgΕ“L:)&IIejΚH’`¦ Š Ι εXš0EԐhHL5LMxΫ‰ΘΎ – ΪTλT°4ψ‹ͺžaδυ—χy–G‡R+ _MΈ§‘Ψ€HΆΖ1VζŽ›+-I‚aRΐά₯fgy₯ŠΦ-,‰©mΛςΚ*’°5¨K!τδ8©₯#c” Φ¬ρ¦!JΠ%ΚΎ‰šFͺ\ IkHΦ¦:H«sŽ <ΙtA€‰ͺF…U+£jTψmm£’QαΣBηθαbIJfθxΤ …wϋτθ0άΦnΞ½vΓwΘL^Χl–ΩRRΩ ͺc…p°i¦Lc ͺ#²iLQ³7‡P”Έ£ŽUϊΒΜq ρ›|΅Ϊ‚ύe lQ¬θ-χ½χύωφ«JζκβΏερxΓΓ¨ΪŽΏ41ˆ,fbξiλέΧN}΄Αιο}'{§Aa_‰ŠIύ/·‡ώͺ£’°e”­o Γ³#βPoΰ‘“5όŽ–ζžΌόmΏ=`ϋm[ΰwr#ΎδHtΔ[ΧXΤΖx0πκttΫΈ·8&›€ ©q}ΏΕ΅tΡ7³zZϋ|kρΙωkξήψΒΌ‰NϋύA¦.fV‰π_²XΧAssembly (x86_64)yasmnasmasmincmacsource.asm.x86_64identifier_body(?:[[:alnum:]_$#@~.?]*)num_bin(?:[01][01_]*) num_bin_exp(?:p[+-]?{{num_dec}})num_dec(?:[0-9][0-9_]*) num_dec_exp(?:e[+-]?{{num_dec}})num_hex(?:[[:xdigit:]][[:xdigit:]_]*)num_oct(?:[0-7][0-7_]*)valid_identifier$(?:[[:alpha:]_?]{{identifier_body}})1xΪν}iƒΫDπ$=Y–εZξ%)ƒO2 A}r°$ΩeΧ6ƒ,ΙΆ]Φa{B³ίίϊώŒ§ͺuXj©uΩI <†Œνv««ΊΊξώq+|=½Ώ+[Άu¨Ψ¦©YΎwΈΣίΚΎžΟΤSuWS|}₯jž¨ͺΉΧ<½Ώΐ­™4zͺ²jκS•U{qΥ§+«ξΕUSYυb\υ·UHΰͺfώχU5θ¨ͺy)ωΗͺšϋqΝgͺj^Žkώ©ͺζ•Έζ³U5?ˆkώ9z25Ws\[Ρ<Οv;Šm©Ί―Ϋ–‡=_ΆόCΖ¬}šΌ)+έQ΅±ni«πΑ„Ÿoψ`Β/4|0α>˜°ΛK LΈηε†&ΜτΧ†&ΌυJτ~‘Φƒ”:f`ψΊ‘ΥWΧj&γΧΦj&ρΧ£χsUΝθV$πs—7Ϊ<tαΝ6O'˜Ώ½Ÿ©zΊ` ώΦόΩλ·λς#»²™2L§™‘+xΠφ§š»zβFΊΒ'ΌK6S]z·°υΈ.ΕEσ57…Ο™ΊO$]?ΛhΔθ ί ”΄­>WZ-iν½jΙ8 ₯Υ $W ΗvSΚψ#Ο1 h„wυϋc΄%v05\qΕ]ΖЍ [φukqlέJΊΤcΐΑOΪ$ΥΚC/CiFςλE”΄€'‘βŠ—›O+j ΦΦ$²ΟψOιqΉΜΈ!¦₯™Ά₯+ "W˜ΡO*tφ/Žτ€·p«Ιšgιq΅Ζ›HU›/γJ2τΝTJΈχ#nSc'ˆ+]elZͺRΰΦΑQ1βΪ3κ³Έ6bqiεjJŒ°sR΄„VŸΤc;¦μΕ]c ο!Τsρ3Ÿ2†qυΜD³4W6:Nΰ:Ά§Ε|ΖXςΥaλΊ'wL'¨ΟkTχ&IυλuͺOεΈϊŒ€«ΟeCWγŠ_rG ͺΨ‘M΅γyZββ|ΕεΣLΠ½Α؈U%ΗΣΥ†J€δοά½UƒΓ―΄‚›\ζ‡J Σέ*«•hξΫe΅Gρ—|¨γ 1° Π0~βk./fžPŽ]=ιό?κA™λΙψ½?—βΨσ53w—KVίKΐίγ*‚ΐRm%@πZΑϋά&η«αό'c¬ΐ₯τϋΏΝj; qΎ½ͺπmτΟ€Ϋ‰ϊwτώ꧎>ξXΆίYLu_σYI8ζ?Œ‘Ώg¬/Wvλ₯ύ’ψ·#šœ9X\}½Ώ]^=™²ΕΟ}½Ÿ­~Ξ‡ιŒ [I4ΰaτώ~“‡;θI¬¬εχŒ/P―ΔW›‘£χ·*šίAχγ§FΡϋΉ’§BΟVv'”Ηυ‰%£bŸV’χχψO§ ηPV[ΐ–ΕhŒ•*Ε£χn‡@={ΊͺεqTw΅hξ?>e|›šwΊ?-pχτ²ΑΞM£β§~`tdΩ(~ζ¨ϊ™½ψ£z\ΓιRό€½Ÿz £†6‘οȊޟ/z0γw،κƒjΎήz\Αa*ΈΪDχ4Ÿ1:+=3‹λΈ >ωωU\Σc, LqΠ]ΙΚΡ,°ύ€EŸ±—Q½HΔ΅Ζ8D΅T;ISσβJόYUZ0$¬” ½ΜŒ3³ψηcφηpFό z1z£·q°%šbu©ŠλʞΩ]^Ω?܏'΄~όLΖN Ξ_ˆΛγ©‘XŠΞKΊ+ΡκΖ RŸά*xΨ:ΑrF2YΙΨ A:θœoώt( “ΟπηφO‡gήύδΏ]ix^cδβPηw‘uΊcDQK‘”ξθS){y2M‰τ—8εα”οoΏ6ΫνέΔ]Υ|ΉλΘώ4ΥΧΧ2ŒΦ ,ΚώjjόξqPγιt…{ 5tq0:ΐWvH·³?―μ:0‰κ†8ύήήΕ!9’}˜ν’¨2Τ ΎF@kyŠνϋž^]χ/Bk'ŠG²Τ˜nNΘ1σ¦θΑ–_nK§:YΆ(©ςbi²K‡¨φΒ"4 ˆ« vθ £Α›)ύνAηόP$‚ζΊΆ+ΌσΒUό›΄v*>ύG ΄γ…νͺH ί΅ξBv-”ŸN2Ovͺi˜o„Eγ>žAΐ#θ²ͺ•#ΈΏΙPξ%–9dΓ ]FkaŸΨ‡Γ€€—4Ρ§ώΆsΤ'!‘K= ½βiΖfH1γ{"±]g*[0GΒi\Ǟk.φdbx€£-Α πΠΉ&4ΰ‡M&•TΝ²]“ΐ\2*πmΫ°­‰Hp@K¦†FF– b·τ;eΔρ]ΤC#Y…G,Jœγ™ΗbΗqε‰)Ηŝˆή†K€«ƒ!xβzγ΅2Ε±6Έ»MΫNŽΓgQ₯y„έΆ€N­=,ό’‘† EΒ0ruΰŽΘ™Dv™Π ρŽΝ‘mx)1«ΙnΚN±ˆΌΖ‚φ|*πQE(«cΟΧΑΰq8EE¬οIΖσ±9LηepςΉ‘ΏίzŒŽΫFgmZΌΖ‘Wv”NsΩ\!¦ƒόΗΗ1ȏ™±wGŸ3ϊϋtηΐ.Δψ\ $α ^JcŸNT” ζUλbL’Ψ­]iͺxŽjιΘi Έ`αZ²A¦Ί ΆŸ`„ΡTό€Pθ)~–kΪͺ>Φ5·τ{μ˜$ρŒL›κMΆάΰ”_n;4/δ†F770IΖ―—ԏ=Jpr”ψOΫΗ‰ ƒ3R#uχv–Η?t9ε±v/h‹Ηh ΔΕρT5g‹<ΤξΔ΅§;‚j-­mεΡ _οd8"ΫνTͺν2α[KV²+#aVύeε|ΤD:ν’±|Ώ`,λ•AΏQžίZΫ”α“xMρ?ΣϊθxΠdΡ9٘«uTY΄€%Σ²‘hπPdθd4Άό»‡*Ιτ'1 5E”šϊ«ƒΕΆ˜ Ε†Ζβοop±\αχ.ί@³]aΑΌ]ΘψΌŸq*Οςο7m£Ψ1θ¦ OΘ€4+(φ?r±΄G΄±YξΘΨα8Κ ήΨؐ}ΰ IHΔ€Ulx&Ζͺ ά=6VΑ‚MΉ{ŸjJ35•ύΗ…gS Z…ŒχΛiΌG.ψc^ “ϊ½*3p§κhσ˜ΛΪ)L?Ε½KlgΤYΝR f&μΚΟ‘8ωπμΐ/Σ£{=#ί£›lq˜ο σθb(―°ς|€ω›—θ§΅Φ:cB¨aόi»B|iί6(ΐ±&©γ"  d‘S?&AK•yB³ζΊk³‹Œ•Kp­$Mj7*A_ΏOΠΈϊ=yΌ#f”cΏΕΠ3Βt΅²yTK˜ϊdCϋοœ&Ψ„ϊ?υsP­ΥνΫŠ$^κβu0𢱕Ύuh‘ΊMπ³³œmQ]Λ6tΟŒ h5έyš‘Ϋ:֍Σœ―Ιzό”‚n-mαΚΦ$νB?Ε΄t.Țieβjšzœj†%ΝN­fΖΩΥ^ή λ[I¨^³ϊ™ΕδΚΤΓoΧV·oςΩ¨I ΄žVˆέΘA‹Ÿ;ΓγCŠ“ͺ+ŎυoVj}°’Ή”ޏσE… ͺέσΒΰό±nβc.RΡ:ΛρδΊ œΚΉ©Œ‰ n,Xο’‹Pe #ͺ0z*RΧβay^υηΡωμ'ӈ½UΠB,֏Ζ~—΅}*[!ςHZ&ŒH![„PΊΜέj9ΰuzυΤ&{΅f†ΛEd¨G°@Ζ’ 3‰ ³ΏS0Ί»eά·ΎyΘH œkΛήΫ*4› 6WΥ^εΠ2ΊλεR²ΤMϊz.!¦`Ατ6΅ZJŽCqΐ² 7’“B&Έό³μWY_€&MΦh±b Οs:τΠF9£$eΩίδψžΚϋŠΜτΘωθaXλŒF€9tγ°ΛvΘΡert…8ϋ© 9¦―‰ν…ΥΧ>˜X™‘‹mvΒ2Pν6+ˆr‚Σyž€ΖΉ'žΈΩt-f²ΐ—Ό m—UΞtd•Π~ |(bπw˜,Ό+Β_pt%σΰL"Τρ.ΞΨ±Δ=fΏGχφ»‹xt.” ₯ϊEF°1OWϋ@_΅gώρƒ!QgΔλ«³‘$Jθ ΰo*q5O쏰ʂΦQg)1‰¨tΙ*#| |έRFΊE΄Y@|έΤωΘ5MV7–Q!“q&‡…ͺΙω!08ύ½‹—†Wφ h½6ο0β«‚σ­)2ϊI>"TˆΤG, ‘ξ{˜CwχΙ^ΐ #±έ >j"{°Π(5O›Ϋ“GzΙ>–„9f,ρ™(*δj‘G‰6Ռ Ο’4%€δΙV#lNV<\Ί%gΥ“ΧsΜNdβ€φΦΔJ‹IZΞΌ‚27ΓjΚ Dγ$λ q’ΰ₯΄υ:<Ό{ύ³{‡‡δππφ΅»·>ΏώΕέλ_’CιπΛ›w>½vσπΞPpοπή΅Oo^?l½%ͺd€sl#ύnKί·ξζΖ8Ε›ηΊ|ν[‹}B«βω>Ί“Ό] βΕS»Ϊρ 3<7=œY˚†¦χnήΈπ&†=’MΓ{¦€˜dΌixβΚ£‘Γb–{Όi€Οr;ίΐΠ6 οΟxΜΘ‡β›wͺDΏΡb›˜‰–$Σ$ΊΣqΠ§»£ RbΚ,±ΩW­Q*Β(³υ2ρ™²σΘ°Ιȫܜ§Šopζ“±ΧέΩΙη/%σWVIτή<π>Š΅cΒ ƒ3ΤXl§oεΤϋΔ Ž/Q΄τrŒ“‹|‚$ζΗ½χbγ¦άΙzΩΒ~&³3ܝ%ε TŒo³ΒΧϊœy§<[ΛcωΘχΠΧs,Fπ€)ζsίοXΐΧκpέΤ±f'yOŒΫhEΕ€ώ1]αf¦Σ;ύΡ1[νμαί!D«έhMyU„‰N»3€;v: ρώ‚ήΈ(Ε}Žέ£Δc³]˜D­λfΟξ+”KUψρqYά&ωšAĞ…ˆt.#ΔΛYR₯ λk‡‡£­@œ₯Š—«Q¬C­ `rŸ₯ΎκΕΤΕV…XK«A±OUSt³&¦=Σ @>&+rmσ₯h89­ΐw«ΐ;˜#₯vF g7°ΑpΝrJΉ¦°Tυ‰ξ ‡©Ο™AγW©Λτ\δ§Ϊ²έ7EΎŽ¬•“Ζκ 38”*Hφs"λW-:πH([aΪ2Ξπ+STε  θf‹°’XNγُBT?._ “W€ ±’XΑΟQΚ…H…€"΍)PΓXQJ£πn•¦)έΒKg$ΰ†Χ‡ΰΏ•qM!ΠAaΟ+•CB~•ώtωΥ·™‘iŽ]¦‰1ƒη±~n’h…›»ΧoΜhŠ’μ_ηΉαόΨiμ2¦„xπM†mX λbVΔς@€nH€_Νj‡°>­vV¬% T*·ΉΤωΥ砈‘Hg>ωοπgO&^šΪC'[²β/œ1ƒWδ“‘*όQ–w’!εεD‹‚2œζnΰΖ“*ž^ΫΔ:ΫFK­hϋΤC€ν~9mcš=64 O­ΝΐΆ9³>„Σ1L$ΩΔάψa§₯τ-…ψΕύΑ@€Q)‚[ uΓττ…Ž<† V§vm2‹EΏKτg–.Ε»εΈιEpžM=\tΎ[ήη”w9ε3NωN9/·τ_œςo9ε8ε8ε;œςcNω€S~q«ψUDϋW8m|Ζ)ΏΚ)ΏΑ)ΏΙ)ΏΕ)ΏΝ)ΏΓ)?ΰ”Θ)ˆS~S~—Sώ§όŸœςα”_η”Ξ)‚Sώ5§όœςo8εχ9εsΚή€Χ2ϊδί‰>‘3:EΑ:ώΜ&‚b:Δ°UbΪs’θΝ-•ιdw„₯‚εψ·TEβ)2όκ-dg‚G z‚‚gΊšŸžΞg V² AΏΕ—tχ/vFΊί_LΫj§!™π„¬y‚3i’YŠ(²ηƒ‘ΧM…"ΝΒε("Žb˜1Λd4©‡2½ ¦>²MW8Κ";_σ|€Lέ xW PZtϊͺ7€GΫ HYš&sj¬Υ#ΊεiO`a·G‘kΛͺ‚έοφ¬ΎzΨFQπ₯ͺwσ%?—i^“Ίσ"ς^¨x5Άf£k^ ›OsΤν;@«@RlSχDJ8J…Ύ¦=ίνλζڌL|Le›-€&)œφ[ΰπNΟΆR¨ YΤ”Ή/¨³ž£όλG₯=,ρԞ’£χ<•ώ…Ο~φ%ͺ©3¬† yPM§?ιβ°Άζš‹gΏ¦°ΎΚ`=Yœ‚QΘƒ8’©2‘―.† ψ"1uΛ±½`‘Ζκ«XMmW`Σ[S’ψ:ή61ΏZWRxΎ•xΩR-‰,%ۍ0M!²ΧÞθ ΖR0?ca’ϊςΤΣ;"°ΒD’*L bLE_O }¨€ŽHf™qk#5…T?OUŸ7#Π!Kβځ£6sοABB<‘2ΦQqWqˆ›TςΘ^mlΩ^gQΗΚ}/z‚Ί ‹θδΐr h'Œ˜‘ΊP ͺ’”η†z $ BdtoŒΠα Γ“9…˜¬9h676ζοε°0]ˆ °ˆ€C•ΆΗ5Pͺβ@zύ¨:"Ο'ψZ‹θ7* @Ω`D90„i -ΘΤυΔ HHtOVGωώ¬EΣχ"u Ωβ•\_S’‚ώΙΊΠσώW4Δ,U˜H¦ίΧΦ…L›…™θχYΠ¨\@«ŒHί{0\ £>«¦dƒ$d΄ΘGλβ“U)έά€‡3‹g`ΕΕXΒΕod΄AF7ΥNt•` ‘ΏεeΟ•!8Da]2Lυ±ίλΈΆ/ϋZ 3ΠA›K¬œΨ^Ξ ΨΰΥ\—©;HχƒΈλ’9Kƒh)˜o20‘σT¬™ΙdˆΪDN /Γk9󻱑W‹&ΤPΥY@4š/šKΕs‰ιδ”Ρn ΔXJœΞYψΠFψπfωκL–ΦΥAЬL5y€wλDQ;~ϊΦέFg»ŠΣ4t©τέ}:£Κ[»2ΐΗ–d¦Ό½έ½ινξ‘ήήnβC€ω‡uΠ‘€π)[Σi9ρ›rύIU&ερλW%³ ’ε/:Ρκ‰:Ξ”œh΄©ŠΕrtέπcίS³“„ϊΌΦΛJAΙ8; ŠΡ¬€ϋΪc…=π\N΅PύCΫ7ά‘vμ\ ¨›ΆΗΟβŸ;D¦7j$ m~b£ΖκΦσ €‡MΥg˜ί§+0*p¬Ππ†ή“ ΙHˌώŚμλέπF_WΆΌqNυ1γ1t)ΤqŽ$’QτQ$pi1ΣΛguέM<;q˜Θη ‰€ίπ“KOΎ₯‘ό >’#ΩΣ•Τό ,Hαy‘Ε8Μ]‰nWR¦qΡ„ϊ‚24:»!‘€o –n‹4τug(!A0 ΝR6Ε‚λgjΰPOΨeαz0§SlœXψζȬݐήά%ΗFo)8»YΛ½[Κ4 3uSHΌΛ a¨Β.y@½ΎζaΎ`M†½–`Α@©Ινš’ Ό }&uADΘΨΥ4Š gD1΄%N_ρ† xΧ,`Oy‰ΰEΚ’Tsζ·7ϋŠd,-d=½eμR“a’Ά»cΚ¬£+ΝwͺΖKΡA‹ž(Ϊ\Α#P½Τb5-$9–8εΧ8εŸpΚ?έ*~α’ΩΝς^‘£mBΰ <Œ7…ίsVq»ΆqΈ΄›·M„šXί±>φzΛ~οβ•!ΩΏˆΠΙaΣ€^ΆΞέγŸ.byv!nέF=cτԒ佚=Ρ}―“5%Ή0(j–€ρ²˜άDΑ0ωΜ @¬±‘ƒΆDά₯ΈΥJ7 άX_’TO`H3ˆ)¬>φB}‰Ζ©{: …²ΞγNCΜ Ό\%ΧX_ŽnšdμΠSQΘDσaΌXΌ¦'‡₯CcΒξE»?hj hh‚"σƒΗt‰}γVΎ βm‚7“Βψc@."˜@}Xe&Bθ‘θ»θŒ1ρ’¬³Qd„ό|Q ²νc„+$ΩΥ\”Ο]('&πFΞ‹ME‡&ξ4˜½ΜΒ‚e„@κ3zθr#(I¬±ΐΔ•οΫΦΥγn›i'iΜξR―oL‡Α,œ‘«fΜΪMWR2ƒώ‹Oυ’¨PψΦ3Až%OΏy¦i˜q¦b ·½όΖΘdΤέω\»οΓΉΞaBˆgνY0 ΗBŒ¨,Fƒ!˜(η,T+Ίcce}₯σRδνλ>θRόL'©TΔΫχΪ |š’β• ; D…s7uaΐ¬Π;Ÿ)™f#ψŠ“ΘώZΦΪn6—Λ,ώ=‹2uSΎ—η9dα›z :5t±lδγI#PυΚ4όι³ζq Eσ[’ώMυ#:ϋ υ›°΄$t]Ž·lŸΠ‰)αq­g’#Ί<‚K& •ΖŠσ›u+Ί`ΣXHΛ^0Q4Ł7΅€υb‹±Άif|ξšΛμ ™"sΦΗ'Yœ€T_­Γ‚΅~΅€Ύd†"ΜM€@Ά9€:<<ˆηvίnyΓΐw‹X![”+ε ™©Θ8―cX΄πxT΄ gšΜψEšqIOk€nzQEάΨ…¨a΄Ιd?Ώ[»O{%“όxR$C΅[υ!„s =šSΤά~gΌh£l΄5cΈΣ•xάβŠL7*Ψa·ίS{sQ0³ ύ$ ͺ»=¦Ύ—±»[ΌΩφωœv ›άZy;„¦πO³ˆΩ4ήGI8;l/5ΚίNyšεjΤε₯(αΙΈ»ϊKΞ;xμ.`ΣY=ξ$kΌFš…ΖΥτLδ±`'₯ƒ+Η8³…₯cΊ‘7›1ψq#tΒfΑQ›ΣΛbο4g4³9άΏ˜‰bkΆ.΄ΈΜδ5Ϊ. Qφψ˜ β„Η¬€€ΝΐτiΆrƒ Vζ«›;€dβ·IΛ£ΐzυUKζV”V ά$Δ0ˆHα―β‰Δί… ρ`Iγά™\ ˆYΣεf3>φΰΟάp&2M}DA=~ž›ͺb†Ι"νξ‰ Ϊ2΄hΛjœEΫ;φ|ΝδΗ~1ΒX8ʈΐ_*V°”ΡΖ‰cCΖ$«Η^,PΣc ΅„gΒξqρ4ϊΥβΩ"Q <‹¨yςE8uŒŠaΏR Ξb]6ΫΔ£0Ι%GρΦκ φ;η6X\l‰ΤΨ”KŽϋΗ <Έβ&Π5S $\`“£<pΉΌόβ ]λ Χιz]GΆF„wΕ·ζ²fσΔ3.6•£Θ{ΜΣΛΎdžΆΥcύ«Φ@…5fάvfηRKP{ͺe/Έw„q―ΐƒYΧΈΊ΅7©ΫC]ί=°M…υΘ± 8¬K@Ψ›&Υ2!^Aχi„»Ÿt7ά…#θf’Dλτε$VσŒΓυ2Ρpνpš'„Z°ͺ™ΖΕΌ9GT",\K`ήΤο”…Ύh»J#­»ϊ²εjJnαΫςap[xωi„ζΊΜ?•)ΰn Mp­ ¦vΊΗŽ/h`,•‘B`α„(0η²ΗsΕ€šά"Άx2ψ€¬b>UΛΉ5s"x$‘–Γ|GΦΙτ‘κΓψJ π• ί#²λΐ2Œμ&Χΰˆφ]/π_@ƒ ¦ΆA‰ΪΒίc}&M¦ŽMaΥΥυL%Ž ¦wδ€?ž ½‘μ{ ŽŽ .§ΰαxBγ*»Kά^{μΰΣέΞ‚BpΧ‡G5΄βIαΞgXqτ†š?šotaέeΡ”G˜Π&+³\Mβj††w―Ž΄ ^Fk©4}»E²•ο-[bΘlχΒDhk ₯h#}γ]ό³³«: Τέζσ˜ˆΪJ€£©-qό–±₯¦ΰψn΄šƒϋοA\MFfΤ} d#ΐ-Ua YΪΒxL,1LφΖ›πD*-πΙάΡΥĞ›-΄"›ΩΦγ”οmΏ*οH‰σŽϊΫƒΞω Γκ[έV'N^m‘hπ³gΙY±ί? L ‡ FΌͺ›Μ_σΧ'ηΎϋοι!ωθ#ςρΗ•Β‘ξ/tO«θDΌwcL’Ž?Ύ]:δ…m&'²ΗβZςlΡΉδ-YuΟηΥ. OΰNŽo~G;}ύfΥδΰ˜ιVΡ=ήjΐ‘™δ7f§Št€Ϋ ΌΠƒΨ%Ό£ΰŽαLAέΑΝΏ(‘μvοΎlΣW]Θxeœjκ˚χiγφ Ί{/άHBΝβ2ΦκΛX­§.·^8ΗγGa-ϋ½=XV†βO΅e‘mžΉΩ&ϋÏΒQ·syX·cαήΞB0Nΐμϊ6 7ς‹5`-ι–’{Όcο_Nΐ=ΐΑqϋV >vDΙ“΅PΟπ p+Pڜ΅4ΗqΚ5Nωœς!§άn ΦCGΎΓi…³’a z—½₯KDW‰˜`˜]βΫG85¦γΣSp$±δ~χ“Œ(—]kΡπ" Τz·`lqΤδa†ˆ―Σΐΐ\„ny2(q²„ι²ο2Τy–‘΄+⍠xΒh4Ίωλβ e‹£›F9TΏχ•χ°­ςRκ^Τsu ˆμE<…χΨπˆΒsžΛts•s\­Υ₯Κu¨ λ“EcΓ»Οψ?œςΊχ³nν έ«Φd€yΣ­οkbQf3)ι_2RŒχΛ΅M!Ρ0ρƒ!¨ϋžΑΟ―[‘&±€O΄ΒϚ»—z„Δx²Tώ‰2υžιFš+,₯eL¨<΄8ωψUšή@₯e“Ή₯άJ"ι%u\nŒ©Ό6Wή=~ΨΔW)š§Τ^Š+€šΒSέ0²κΡ_’CKkί?8πΆι-„*}λΠ"u› πjQl‹’0θZΆ‘{>^JΊ¦ΕΜ;Β +%_ΝAˆC«»γM0uοδ&Πfž§§,–\9;ŠEA†U+WΣΤτΕΡ,ivj5ƒ4ΞF6κ}ΥQ7Λ―4ir†ˆΏζYΎ\ιφόΪfωYήψuΞς•2ΊTΝςΛtΣο^bh»”t‰βΥ!ξ;\βρIυ²Λ!±n–•Ϋώ’!Ω›yΧM·#P5πΩπΑ6¦Œ~Ξ4—κŸΐΣ~ Dx!C„εoHœX„Š Xo΄βŠŒΩ–ά FhΦٟz°> ιρ‰[θΑΔ) Χܟμ)ό‹2ΎR@Fw‚λ~a ξ“K‡—J­Δ•#O =Ρ4x9C“΅μ(H 3b4›ͺ7ϋ" nŠOχι΅­Ϊ₯FΚ uΕC[Š!Δ#½δž†—άσ.saon*Œ²] f‹Dsρ Ό±μΛq`viΚαr…ΗζŠ“₯[Εα/½ μ»R‘ψ5†^ΫβψMSŽΗΤhα­[ΕλšΚ)ŸnΏ*Χm~Ÿ6iƒώ“kΣ^amΪ‘ζ§­Z§ΒͺΡκuνΪ™AψCŠΖ°H σώ¨4ξЏ8η™ IIͺΑEΏœ²:&ΛΜ¬ΈB[I‘WœΩώ?ΉχžUu§ŸH&=_ήZΒ»Υ*μΝ­&%“Ζτ<γ³θυ2λΫ‘άa }€Gξͺό-C©ubm’™SŒ’έN΅?e€±# Τν‰\GΛ])G͝cΝ=x‘τιρN…4¬ϋM΅πRϊ‘‰kNΝ²Μ’ωκ8Š–ŠέΨXˆUΈK-ξη@dΓ.rΒΒΎ€ ΥI”3Μ USγ±ΕτΣι¦yQ\|½CβF.γΝƒ.ώWyε %ΚΫ…›ψbηΕξyapώBBάΨŽ G™₯©ΙΝIŽΠ‰ε·ΗΧ/(ΉΡυ‰ΕPΑκΗΐ–ΰ;ψšΪVιΨγŽ‘5[™¬ΛΧ8ΝΤή5$ζV}ΣyŠΣΖιŸc,I`ωžθ5ΤwΆΚ\Šΐz‚ϋΌΎ+[%/Οuπά³ι ‡‰„%»‘GŠ:ΔΓ™½w/όΎ Ώ`Ύ’N<Œβ9"QuΎπήαŸKwε~@vϋ;KτΨ'c‘ΉvνR’…"W?™FΕœε.Ω*Τt/εΠVςWuͺEΧ«y9i€Wΐy'[”@‘Γx‘†ξœσT@‡_ά€ZΚπάEžΡ}‘§Έύ^ηβ°Ωb)„ρ w`ώ/;œqyXpSB 4Ό€’#ήςxhšψa§σΑ0fCΒβ^‡1<νo­(„ϋ. χAt·ςB!ο퐽έτIοWƒŒ.—.„ψ qDwJ°½!QΖΌ½‡ΰσWtNQqΓσυπV€ΘΥͺwjBŸθΖPυE―)8i«ŒΌτœœŽŽb9Ηζ$]u±Χϋ—‡ΝdPΥFΑ€Δn^(uYJŠ‹΄±ζίqρ€" y3Ζ3½ ŸΛυoυψ}ϊΧνοΘΰρ5όͺ`ύΘΥ9Ό^…DΩ³η Ϊνο##χ"~ξομό k•™˜t\]ŒŒΑ―zα}ι0^³p $§NΈΧ“ΣρΐC0cΪ€Ρ–šžΤ&ίhηv<΅Α=μ3ζ± (.Ό5s‹#βg2ς˜― WĞk!?πg›j˜ͺ$ΕŒώŒ4c€Ðh>ζ‚/^BbP€Ύ?Δ3zΞΔ<’ϊ‡’e‰ƒAΠο,U}’ϋΓαbx‰mR¦2@Υ7Γ㽇(N§Jε·[ `Q:F‘>σ·J»·ah‹­Aέ0΄ωV/.£Δώ”1+4~΄²Ι‘Š‘μΚ_‘”I ΓOu>—Α2{&°ƒΗ6G:ΫγΕ»·Vd2x&‹ΰΡτ>{β;υ΅GRΑ™š|P[ωΜΦδδTΕ§-]Nΰ@Ϋγ±(%œΙ[iͺσdΕ#‰Φn±@ΉŽδο±₯€U9z)ΞHtϋκζυ^ΏΩΎU!Kι/nάΌNnήΈ}|zγή]rηώ½―οί;όβΞ7·έ[χύ,ψώ½ΟιŒB>ΧΙ½·γ°ήΎ ˜θλ;wo|{H ΫΓ<Ÿ‚yξu„{νζ½oIξήΊφΝ½k7o|y›|ρ5ΉρΕύ۟­η™œ――έ½›nι£ΚRΓΌ >„ λœΡL• Μό΄ s<”=D˜>PGIŸΟ¨‹Ώ€zFΙuλΞηΧΣέ;Ηκb¨Ž9Nμ@>W’Ήjό-^γc§jΐ‘Ρj½P*‘Tv±G7μI.b-Ζ , Ÿ…˜²*§yΝλψ)α?ju”CFMLcfmlcfmcfcembedding.cfmlattribute_name[_[:alpha:]][[:alnum:]_\-:]*μ xΪνΩbΣΖV±Ν²'@)$@μP9¬B–½·”φΪR’$•m%QρK†€€_qολύ‚ϋύ΄j;£ΡθŒFrd; θ1£sfΞ~Ξ,‚7’ϋ zν€ZoΤWΛkjk½]ΣκζκME >γ dΉQk6ꨬšfK/΅MΝπ±’`έ¬L¬Ϋ€•M‚u°rI°ξΦ‘$Xχλp¬OλH¬ϋ€u4 Φΐϊΐk‡xXΎj?δ˜ΞZ»^6uλ'<&‚$Š?Ξ™ή‡$ƒž‚’QO A‰ ‚Γ9-%ΦrFJLdPJμbHJŒaXJ,ΰ¬τ!€žι•ˆuD4θm’ΧσBP’Χ BPBΐ¨”θuLJτzQJτzI$+2Έ’L‘’Μ~YIŒκŠ’ΨΤ„’˜Τ€’XΤUŽ@υΊ©΅ΦΤ²ζ•kŒshMΥ«>Τυ((bHSŒKT£m6ΫTΘΛGΓ‘ρ ŒΩj4΅–Ή¦ΚιHd¦ ˆ3|œ‰˜₯œ‰Xh11Φ™HΔno&@"&|‹c˜€δ+η6“r³­΅(°;‘`Dkw#ΑˆžξE‚Ν|Β±J£ά›”υޏ†#Τ=ΐα5» € φ!ξ¬mΓlΤdS]§@g… dφGLrqA΅-S«V¬`žC^ΧκZK/Ϋ°>θƒτ ζήU94„τ ‹T±―Λ!ΕΩh©λZ±Φ¨θkΊε΄οK ή‰σ@–=‘’ΰj%A©Σ§Π|n‡ζσHί©7‘yιK/4_Dϊ.u’Š˜ΘψL˜AΨ{χŒο½ΰž&γ= ΓiίLjφwYκMD»‚τM€Ρ&‘Ύ«2r 0ΖﭝΥ`` ΎΰμHdΡ)W;iν± ΡδΜΊϋl/y‘δ93+ΚFoiβΡΚξϊ)9£lΆέSgΨ=1­Sι’}H(ά*qϊΫ{OV…€²:ΙΚ½γΠ%i±OΚξ’δ‰ΡΥ£:ζc€O–"ΣCjs‘Ύ™ΐά»ͺcn"}·DͺΨΧuΜΰΎO‘lpΏ―dz)ΤYΛΔWCiU3ηΈ4D&>μΜbG©½χ²*ρƒψΜτB~n¦χΨς ~ξΜ!£p₯0ΐ]σβ‡ε ƒ ι˜.Qa"[Y>ΰ2BN$QFN΅TΉGK›½ώ·| ψWΎ8 u&‡k™F£έ²κlc³ŠωΨF(Ψ84€hq~nΖ›sρ–‹2‡»Wœώ*§_‰c—½ΥζT=Κ3vοZpQ―V΅u΅Šf1jƒͺtΒ½sbπlΨΗ]Θ=βδΓNž†ƒΣ»wηˆΡ»υ[,UεWΡφ‚’e9Ιΐθό€]ζΘΔ—ΊsνΈχ™dsΏ6ΒFnYχŸΆd©»Wa%ΔΟΩ gE$ώΓ1n€$Q`ƒχ±p`Γ$ΕσŒΣ3<Ύ€FΗ·\&αǁξΒ·―±ς(‘ρ|qG©$lNšΰΟy* —Ωd€ž/sΏIηKŒR:%τPιnν|-qθŠΪΪΙrpj4ΰI_ΘK+Š17³πφ³ιτˆ Τ—)Ÿ ¨₯&Ηs"―Yβ₯X–Ϊ#Mοn»+₯ΧjK)2Ξ±ΉΧKμ›ˆψΥBψ€λφϋTžρ] Gf€;Ι5ŽbHΙ»;΄;φ¦vA”p Ž1*ϋ-‚}Q*ˆ`)‚Π;ώy8p( _ϊΥJZ₯b‡*πΆIτ`¬ώΗ£œ'ΈΨ³ΧzπύUA),v Φυu1)6cΓ!ΖΘΧΊ…ξπ•‰ΑΧY_ `l(Εu6Šmχ.Ή³¬©8ΧΧπr@ξEςK ±δ–‘7¦Ÿ°£ ŒŒΔq ή τΐωš+'ξυσ΅yαλ½Ώϋ)ΨGZΫqrXΐ›†Bήλ΅>:Σ(&¬ΠΜΕ##a{"œθν°μ>O:΄[‡λ M‘{-}τ¬1L0α 7˜k]‹r­¬ TϋΌο}γ‰!£΄Γ5οδ—ΈΡμLΘڜ%Π^¬τGΩΡqŽ Dbϋ—9ύKœώί9ύ-NΏΚι_ατΔι―pϊΧ8ύ띄»4ξRμٍAδ₯ΈL…Χ4p²Ύ'-ύvcŽΆΊτ)μ΄Δ±¨8ΗΞ3Ύ{A ί’Η–(wΎ»±Ν,\{Η€{ΡΘξwθ=NZ^Rε?—oΌΗΏBαΐ†μάλ8·“Σ\ž~Fι'έVmύ(ςκςt—ΓφOτΑ3]ŒΏΩSΒ6F1ΗΞ’Ξ•{Νs*«¬qF­ΰsΚ¬ϋ›ΡoOϊ‚3ρQ $ω‡TΦεζ3·ΰιΐ8knp•Ωwάζ’"η 'ήΧΑηB1j«gAjœ#ΌπύΜpζŒ†γΤVΒ@%ΈgΦ»a:Ό2ΥΣΎΜΊ«ψNΚ’y‰ŸZί™G¨Uv1πkŒ@Α“ψ-FφίQF%ξ‘zβˆ«…**•VϋβόŠbLηg”静™έ::h™Ji'ONvΤ’aΪΧή-0ΏΣ¬Z τP{YŠqcηm‘ΐ{ݐ»±α<Azη¬mlZk](ΤΖ§.TωXŠ«6rΟ@±†ž$ΛU8`βP`l2χYΉAώ29Ιzτ ΥΨ`οΜ†N«ο  9­¦ΎβΙξ³(Ω‘ΖΌ»ο¦0¨†'RŸ§Ξκ¨ ίΠd1[Ψυ§+©|ŒΓ»,ΤΕΟ΄Piμϊλ¨TΎχ]:(ώE”ƒgγ„yˆŽJiiUiΎ}ςΧς’ΣX<ύkU‘g—§ύ+[—!ΥuΊσχ•„ ;…/ΈIaŠNcξώ™fξ”ΧάύΞϊ‘―YΨ8ΆΎFο©e‘ν§ΏυOίFΩANφ%―η'' K[/–­ dΓͺa‘Δ;1°ΛΫ†Ά₯V΄²^³Tl_{`λK£ Γ™ai&ΰ.Χρ€ΎXb±φnΚ—RΉ.”ΚΑ’H"αΣ8‘Πy¨/E'9·2‘Rώ³nάF4ΠΑΐμξXΫ|'νοΗ«κΰ³?ιΨcqχCFML Script (Tags)source.cfml.script.tags arrow_func_lookahead&\s*(?:{{identifier}}|\([^()]*?\))\s*=>attribute_name[_[:alpha:]][[:alnum:]_\-:]*constant_identifier$[[:upper:]][_$[:digit:][:upper:]]*\bdot_path_identifier[_$[:alpha:]][_$[:alnum:].]*func_assignment_lookahead\s*\bfunction\bfunc_lookaheadd({{storage_modifier}}\s+)?({{storage_modifier}}\s+)?({{dot_path_identifier}}(\[\])?\s+)?\bfunction\b identifier[_$[:alpha:]][_$[:alnum:]]*line_continuation_lookahead„(?x:(?= \s* (?! \+\+ | -- ) (?= != | [-+*/%><=&|^\[(;,.:?] | (?i:in|mod|gt|gte|lt|lte|and|or|xor|eqv|imp)\b ) ))param_attributes1\b(name|default|max|maxLength|min|pattern|type)\b sql_lookahead(?x: (?i:select\s+($|\*|top\b|{{dot_path_identifier}}\s*(?:(?:\s+as\s+{{identifier}}\s*)?,|$|\s+from)))| (?i:from\s+($|{{dot_path_identifier}}(?:\s*{{identifier}})?\s*$))| (?i:where\s+($|{{dot_path_identifier}}\s*=))| (?i:(?:left\s+)?(?:outer\s+|inner\s+)?join(\s+|\s*$))| (?i:(?:order|group)\s+by\s+($|{{dot_path_identifier}}\s*(?:,|$)))| (?:SELECT|INSERT|UPDATE|DELETE|DROP|CREATE|REPLACE|ALTER|WITH|DECLARE|FROM|WHERE|AND|ORDER BY|GROUP BY|INNER JOIN|OUTER JOIN|LEFT JOIN|TRUNCATE TABLE|BULK INSERT) )storage_modifier9\b(private|package|public|remote|static|final|abstract)\b storage_typesY\b(?:any|array|binary|boolean|component|date|guid|numeric|query|string|struct|xml|uuid)\bn1xΪν}ωƒ#ΗU°v}$Vβœvl'v"½^i֚uηπ¬Η›ΔΙfmΦkLΝΪ-©5ӞV·Ά»5‡·Ν ΐ„#!„ψ€@8> χυqώί/ίΏΐ{―Ž*U«»5z ;φͺ«ͺ_U½ͺzυκΥUYcoεΟ»œ žΕŸƒa8ŽΫƒqΠKŒμ˜ΫςadΌ5ζ½ζmω0ο0·[»²η$½m³+ο(•½υvƒ¬8h8ΊA’ΜύwL‡“ε5¦ΓΙΈΣ J 7 €Μ*^*”5ίU(«Ύ»PRΐ±@IχJZ8n˜0θ{8oΤ…§Y*[ή2fT»\ +Λ=Q +;υήbXΩ―νbXΩ΅+…έ Q8Y*1Έ―T"πΞBP9Ίο*•ώέ… rήί_ϊ~ϊžBΠθ{σ@γ$χ’0Κ(ρ}… ’bή_*GλBP9Z«oa ξώ(rγ—ž8qLΫ ϊβ§ ξΚςΙˁΜ[ΑPγ6–Ξ"ΫΌf¬;FZλ² 2V2Z_ξΦ ^`++nΫλRήΐs#…i`Άό²ilkJώ†n’UΘLΩeνΞ”]Ψc3e—DwΪXvσ³g ώ`ω<²•*ŸG6νΓεσΘφ<^>δ})ŸG2ΑbΛ³γμ…Q?n'α¨ν»»Bεg¬œΖc;μβc… ²_Ο‚Κξ|bh”‘!πd!¨Dΰ;¬«šΔ¦ΐvΞΚα6Ωvcο·ίΞψ]–ο)ώΌEΟAαQrΠvz=Θ‘Ÿ/.[πt)pٍίY \δ3₯ΐ%-~W)pI†/.ΧγοζΟ7iΰr]Qϊp£Rv_Η:λ΅­δ½Y6‡¬γBΩr”žεΟΧYrd˜<7 JΦξπηmTδ[νψ’ίξ‡γ―Πy·(C 5C/̐Aυ§AIl]+I0q£ ‚G’τ Έ,}«Έ†νRΰr²x₯ΐεdyή*“pπ ׎Uθ‰Η£Q%D>l…T:Η·275K;,†•½ΓΚ. ‹aeŠaeη]œΪΦ‰•Ξ"[—Ξ"œX%šΔΩjoΉΑŒw ωξ8qΫ½¬1‘7RdΫ1ή]"»™w·z^Ω=ώΌu"―p`@7«kΏΌ, ΌμΖψσζ|ψ ™K%€%&i `‰Ζ‹%€%ύ~O `Iΐί[X.”ίWX.“ί_X*?PXͺ?XX*―?dq7 œθ KΌ£i°?̟Β0ώμ³CΗ ΔΫαΟWΙ·°ΞE‰xύΏψSw\‘ΪέΘινΈI{Žΰ’Α€B@ώ Λ³fš@?Ο―Ρ€Θv-@>a¬ώωY‘γ'ŒΨΘ‘)B"ΓOς§°ηu=­%άOΨ*&^ς Η27ρ슭R€όŒ 2ϊ B"ρIc$€φΔλOρ§πc«€xiώΌ!{Ο xΰgM2ˊωΉ‰2ΐ α(•όόdΒβ!@~ΑX\”€hκΈ~ΖhšλΗJ›Ώh1(.J€υB?+θ—ψ³žr­C@|Φ ΕΣu·²iυΉ)p‘λμΈΟσηλ&αΐš# ΎΐŸ·X‘ΪAΨΖΡtψ/ση›'ΑMΠ_1˜‰΄=ΗΫώWωσυ“π*ΨkΊΔa3W Ψ_ΛGA3m ψ/³Ψ ―"σλΡ `κ%ΫQ8ή’ _6zΜbσ ΏaŒ˜nλP_1˜œfγ@Ώiτ4*›Ϋςk–Θό5ώlLΛ¬ΑDΎίβΟwLΛ7Ι6ΫXΞdΆΘMΖQ ³ρί1(ΚΆΤχ`ύuocŽ ›Šx»Ζϊ3isΏgpbu5ό}ƒTIT€|έ‚ζςƊŒ‡έl0ώ?…»K5Š˜os"Ο"ΰΘΰp£0NήώδJυΗ_‚‚¬pbŒŠa;`j0|KB^π RΌARξ%Π €ν5ΙΰΟ φ›Ωğ=Λtrρφ/ ˜΄ΘoΣ3†Ά;[N™ίš¨ UjρφΫEΟ”~τ—v ¦θ  Ώ2oΒ„ :P/ρoŒΡ3Teφ·+ΣUdυwφΒE°Ώ7ΘZU/Μ?lΦ’e ΠΜ΅ ζ?\ͺ@'Ωώ™?oŸšMΟσρΤDtτ/Ζ3•1χ―&œ!Β Έ3XίyŽBn,#β½mωώόOώ'Φ\eΞ|TΆj5g\Vˆω‚‘©Ήξ­6Ψx,w Ω±`άΦΛ„=wΏηŽ€Δ`cf WδCΏ½Γ>)ΐΫί‹ΐΰ•^΄τ Καt.Ё§}ŒQ»€|-Y>9Νv£θ\’*c<…Sεςδe4φ5›΄:OαΐΞ—†Ή€Q‡LΆΓΜ_€«(nΪΒυ)oQšΡμΐj~ηΙ™.Qšάkt;₯4ΣN€PžL8·11—α{ΛUσv i{:*r²5λΜ¬Ξ5.•‘QY'•Qο2+»IεnŒγN(»/£ϊcrΝ<εΆ[Υ”p)GΟ; ΟΧμ/ΧψέcVv«Ϊ1Έ£†β+q ίaGυ²Ž£ΐε *.ρž—τΆ/£ή9_š8YΛAΤ\όnΦ&QΆ¬rΛVΰjIt0sAoT ’5ώμ…i νο›OQε MΧΞw–Ÿπ0€άŽιZΙh₯$IϊsΔ¦3ώ’%ν³ΪΉ1«Vcgμ'3T}dJΥ ±£ύQΙω₯ΉΈϊa{oΫσέ…²³Œo`Z₯lsΐΦW©=Κ€έ–3`~ŽlΨ}©δh e TϋΓNάΩΦj«χh“-Ίv³έ΄―X θ΅’Γ†%ΟΚΆ ]†Π“ΦRμ†PοΛgνΤμ‘|ΗΥ k¨FβwΛξξτ—sM^έ&CΧ«Ψ½ζΖZΕ§ ΝυύUaλŒ>όΒp7:':'i£έn΄(ί6w5R l΄O,Ÿ<φΠƒkχ€:ΝSχ¬oςwhΠρ‚tφΣ­ώwS?έΤ ϊi₯ϋπΟ½Έ›zΓ°rΘͺ·Š·y|©μΜ戬Βς?““ώ[sΗΰΪ θOH+HOcAYgϋ/ς8Π–h‰0½ζ+ρ…Ά'@%=έέ–q’"[²¨·”Ω¬JΕ’‹ΧfδΩ ΒΏ’φ+@sΑ|tΎ‹άv-ύs§Θέδά*­psΝμw‡•η獝ΆϋT©₯Œ$žΊάf+}ή$~ƒ\wrz;7KΙλ₯‘; !•9­S²T¦N,NO΅έlΤ β=}νg2αš^μ„ϋ–ωR3ƒ¦@KgΑ x]νv‚τTΑnΖo«YΛ.ν₯€[₯kδ’,KŸ'IAœΛε…ΊήT&1iX$“X%牲Όύͺ%ηͺ%§š%gΞ”_>jEpΜ²yή\†Gε[Yε‹€Γ·ri­<„‚ΌˆΉ.‹95ν!˜άW‹¦Ώ3G%ΚΈ­‘ΞΆ#Δw>}ϊΙΗ>:} ρqξ‰'ΣGϝƀs§Ÿ<σπ£§Σ‡Οœ?}.}ζρσ¨GΟ<|ξtϊΑsO|,}ζΓ§!ψπΩΗ'Ξ=vϊ\ύ‘§:χΔΣO6 πψΩ³§Ο5>ςΔγgΣ'ž>/‚gNπ< ?χτΩG‘’Ζω‡9s:}δι3m0„Zrίίhs±βΡ7U+?Ef9ΒακΉ:E^ώ)ςΧ‡™"Y›AP.«Α\~W±šγα[3Ii₯|G·|F9ΌΛ›ywρ’Κ½uJΉE:†ύΘ°Ήmך~^XkκΠΩZ’νR[Άδ„²%χ] ΪΦ}S[¬·ACόκα σvr½#ŸzԞ?Y Ϋ‰+φ<+bt_YŒžwvυt‚Ε‘tO1'§Yy\ID°’§τ‹0ŒΝXCε₯sA–±€VRzxg)f=₯W^6žύΎ <Ϋ†UKΩΛτ‰”ΧVg“TEuζέx»Cη‚ηήάρT _wε«'ΒΖ΅«^Q·ω¬Ω7ΪG ‰³΅ΒN~†.xΕrΟΚrΟ₯όΆΛ3΅γ—{SΓ?%ί”‹τΠ‹ωNœ{^­Υ6β>[aψ5ΕθaQΝΆ}’™)[‹ν\]›Γ&zΧmjr[Χ8ΰΦ.Μp“,iςέΫr{Ÿ}X§Ήο.jΌ­}f».+ΪE³iaΞ™τΜξːžΆ]χŒ¬ΖΓc Ρ²βΆ7είι§Cgqƒ­d;zA:¦ΰFAŠΤΣκtqhΠ·qιT'ΨlΩΞ}{F­&:ˆ²:ωtqtt‘5C\΅<]Β:1ν+˜ξαηθ\•·f|―F?wΘηO»sΑ'wϋώZΑ"Vy΅]Ψ·2ίgIϋlΩ5X~°Ž#~ΰ;g6άη&z,¬3~ΰεοŒ+€!MUEά›UδηSο/‹Θ/εV•ΥΖJl«ζ§ΔΖoUΉ ŠRύώD^φwK.iβΈΖ*hώŸ­5?R›kϊSvQ\h†sW΅S¨μ°{χ΄ΫΈDΝ’vdζŽP'ΘFρYρ6„lp―ͺ‚] :Τm46<_mI»ažσΑd+z^k©u–΄7ZήdI{s•>Φ΄§²Ÿ5ψ³π»`+CŸΗ’―UΔ½ψέ!ά‘|σw{WTΧέ<6ςΉš5άsOځLσΒD ~Έε©q†šξΠΪΣ΄:’΄pυ β_–ΝYšrΥέzĎύVύΨZ£ΡHw5²"τy[ΫI; ΫΈ«β]0šΦο©έY^«}’ t»&'Χθ]9hΣ0?­χρ>A¨>b;Qa/ zΞ,Cύfu¨ΧΦx»Η8όێ}@!ΊμΞJΠkb8JA³‰ΈS7!~6άH‘N*₯l1>T œΥJ•*σωx~§Νz1n•;ώ9΅γΉΎΓΞ(D³‰ΗωψŒ]”l;)­ονR¦N΅cπϋγΈ1}b. h°™y#–Ρ„j°CŸœΏΟΞnZv»Α9<ξ"ƒ z±ύ9α?mXjαΚ’»°«”_ Β]Žc}oͺΝAΦΤDδχH"$+οΤΟ’NΧ‰"η pχJήx³†Œ’>]F2eSiΙ/΄nΣͺ>•UΛνZM(quυπ5ή~xj™έΙgSο°€½}€™ž^§1Ξx sΩ’°HΥΚw‚­1― άq£VX²­‰oΛ- Ν’n5ŠΒC@πΠ ΎΞΖJ¦LΑoπ6‹ύ•k7|邐3’œ5u’-Ίt!N3'iŠϋ4ά(νmyiΟχΰmΪ ΓΟMx‡@:£!ξ.^ΰψ)ž­εΖI»Ρ.dŠΩυΰ)6lIι8ςSp oύ8.FTέ }ŸL½Un‰Ζn†·X_εG·Rψ醑ο:Α Β›2Π ²΄ƒ“£›ϋ οDq”Α,/Γ.ϋώ$«ž,α*ž˜kυB ΊuΝοͺ&ΤpŠh¦^ΨΖρ}–΄χ[V«Œ£Φ@αω™τ7kc_ΥͺΊ_+ιžJ[U?Q₯Ή^Ι§{+ζ„ ]M™c˜Λρ™eš“§Ÿ~Α’VΙδς`r[©˜Ÿ^° ΦλώŠΡ, (Ί΄Ρ₯κΆ§o,ύΌΫα”fϊ/δ€INϊΟη€FNϊε€]Nzή-5?ž“ώ‡9ι?“ώοFΊν,ΈΓš©Μ2~TΝψšŒβ6N½ΨκlZο–ΝψΉ<Ω°}³μˆxu^y΄ςΗ9ι?•“ώo9ιš“ώ›9ι_žΓΜzύ.ωεΓr£eˆ,©Ϊ+ ©CσΪΓ Σ—ζΥ#ZDΉO3oe>UΛιΚ/ΜPω<‡γΠ=b½Xrν!S7²ŸJ VόpΟόF¬Κ|*kmsϊeμjqU³V2±Ϊlι3wκš<=e–Ά΅Ϋζ$™Ά#qΖΙΐΫ7WXy{β‰Ξ‰9WЎλUΉΫ΅Vι/(F‘k©XίΛφŒ²ΘΙ~.³σΣ^–­›g/ν:YZΪ™r9Άά}ΚΑf/€μ‡ΝόY-gͺžΧ9Δ%‘y4/j“ο+žnσk΅ XΌFPn˜vͺ`ώΝΩδΈ %M8“Ά‚*`ΗΦασΌβηηrρ/l ϋώRρzΉŸMηέ'τ»9ι’“ώ―*_ϐkΞ|Ω ΫΩwΘμωΗw6:›xJ0@Ωέϋy]ωΥΌόυ δ­ ©·HΞC[…qWx'θ\ΚΆ ηn¨3Έ†ΊŸ³€9΅Yž§Φ5qq’Tc”vε)_›–΄ Uš₯pδξCvGζϊͺ€τέAΚL‡)ί]“Κύ¦i)skμυS.’§Η.@2ε&eΊ¦ϋC?eKΉζ'R۝ع£ψ‘W5ΡG­Y―}½^ήnHΈ΅LUX+ ΜrξΥΛ™vΖL ¦όΫ,>ΣονΆΪω©ž4Φ“gςο«(–\SΊΰJ·eΆ€uΪ”ClZζqΗΆ9„6²8Λ@Ώf«gώ–ΧlΧΜ·ž}θK@zβoΨ°φΖ‘oYθν—G*Ρ†­}ϊˆ™gKε5K#θοκ΅ W―eXΨ΅ ¦`+b㡦νtΛΟ‘2WςΘy>})E]CWηΠ+|UωώM³°νΧ2>ΎqαψζςρtiγΒζςR:UυZMΧZσά1€ͺJjΛ–΄-KΪΆ%Ν³€ύV£r„ΨRzΌxGΕσ–΄okΉ„Ž€·ύW·WΧ&ΏΝzqΙ€xζ[Zj΅‚γδΚΟεΨ“΅S!MXοvύXΰΩώ‹<Ύ<©ƒ€LiήΊΘišΏέΘΎ±€Κω•š!!;n€ μj ¦Ρv—&γπ¨Ε?^'cΟρMiW €ή[l@‘Ÿ³ςψKy­‡–΄ΤΉ>kπ ŽE£’ίΡg~r\ξB§ŸβOχ`΄“‚#€Υ*i¨š Ρ°ѷ舊c.Zϊq³ceϋ~j4+5ν¦; ι~KΕ e£H`©³»•φΐ@₯ς@žγρΙΎ›ˆ‡“πι:½νzκξ’ύlΰωΐlΡ¬Ϋ§ΗχΕ“CcL£8I·άg6Xδ`ϊξΎ»οΕI\‡H 3jσb’έ>„άα(9H}'Ζ£Œ‚tθŒΨ™Ξnί˜ςΐ<³ν γ‘‚ΏŒΪΉύqΟ­Γ3φ^pαθ ±‹'&dΔ`’†Τpˆ?Ό±„ρ0χ $τ9x°΅₯UO{Πz?yδ8Dχ`Λπφ{xύCό0jΚI§Soag w9wσ\hΎΪ/Ξ^aLοΰυYo₯°.ρΠhœ@σΆΰ-O`θŒ:’ ~ΧM΅"«΅΄2k)}Π Ές&bzΑ !φρ"£*ώ$Ή}mσzPβώ3΅26”†ύn@E€ΐ1Bό©Σo<‚!˜f!7b©x€ά~?e灹H«0˜Πλή`@‡bΙΐ‹„Κ`qΐR²>8 GqχαΘw3ώΒΘ‡†™‘1D-FŠŠ\„«§±—„d7nᘰ %Žτc§€A' φΔ©3NΆΗ@έiζAβl!`]D¨& σp#'ΩN»c˜ZΠγœQΐ0a€tzKGπž"ϊΐΒκΩPJ¬p‚»ϋΰˆ“΄7ctΡτΖQD'Π;ΥΠθ{Œa V„)Ψ³ΰ²C«Ή»ίsG„°WPI%D.Ž)Μ'Ρ :α€Os@$±1ξ4‰euΞ`³η±¦Ϋ -;ύ„š†q"fΛίy;₯φhvΦ'R|΄ή§tŒŠΛ”όŒΕϊπη€πd)ΤέΦY|Xƒ7J}ΰ6H΅C˜]Ρλ^Ωω—Ήϋ‘Ο8¦¨GΟ.,@ρήΈλυ`ͺ7ΐ(UR§ ]b … ;P` :ΛqμτρVJ₯ Y6m\Β+(C.±ψθ…>Άn$’XDΜ#;nΈ>ϊ£­rΰu€Κ`‰Μ ‰.=ΗƒΨ$ϊΤ Z˜φ½Ίa‚ΰΆ‹G΅aΘƒΎ@u‘ΐ‘ΤΜ{^Ζ{ xjL“¦ΡΠΩq©ΰbdιAB‰Η‰„“6paΦƒ‹x0,XLH˜11ξς€dšο½_ρaB»ˆιACl9°$¦TwΣg‹ͺ‰ηψž“ηΊ<@[Τσ„&‰άώ("‹›οa₯Φ•”¬I=˜.`SažΈŽ―Šk.’,CΚλ:£jφΛΊŠ†aߏ‘Ί­žO?ŒΗΈVŽΑ5Μ΄Ξό ύώ>ˆ,έ1•’ Y‹IZ8[ωΊΝH‚M)ΥΊžRoδ€3Ύ7Ϊ}oϊ| ‹€`³N{%š`»Έ\Έ}¨IΌ@ξΰ ›Ξθ{HςSύ0A*Ηs €ΗVeΕQΣtΙ‚„%<ωKξαεΜFΙΓUŸ”y•‚Μ‡΄Γγ&T‚η%qχ0r!θζΰYa°Na?άΪ‚y€΄/‘ύ†Έπ³}CŒ§ν‚Gό;έΓQ@‡3ό“g€aΊ«ŽO`:C|8Hπ€₯ϋψi+EfkHτΫ8 νxØΙJΔΰ˜\_·Kψ 9‘4Ÿ#Μ›b;ŠζvWπ‰λrΊΕιhΨΑΙΉόΩ3)ΙEy•Ž1ƒ‚κŠ$ž„Œ°©\4ΆddA†^‹Σ‚5ΕLCi ^EC!ͺs ΊNSΕ_ž³!`»»^O9Ε™,ΙΒHU(”C7τ`ΔˆΘ€³ϊc<‘ Ήψ/ Μ‚‡-ŠΤ‡μw4FΑ“I˜ΠHΛό89@₯Ψ*x‡A !όn…=KdΕΒ¬£X˜ ΓΖb΄ZsQΦZ+Έˆ…3ϊΰ²&+ΤΒ;€S ­=—΅F/ίΑδΙTšš’ΦŽΖΠ•ΤΑ5ΘΘ—˜khj-€‰’‡λ;58Α ΒP&2λ?˜‘@WλN”q^αΈjJŒΈ\Α5ϊf'–}OŠ’ʘ`V‘Q…Άd‘XιNŠωΪLMΝ‚œΗςV–Ω°,ŠΕPπγΰDΖΎ#’4‘Ψ°)TΓVhΤ‡&ζXoΩ"Γf0k&ΞΫΣΆ(pμ.φu¬γλψΔ >!t˜θΡπ=:ΰPŠ­DVL²·A>½AκZ6`ΖqΠι1΅œ=2 KRŒ0ηΓΟψ«PφQZT5~6Ϋ±σP ~zf½m@…J;‡“œŠk€{ΐ¦t6{ D”O)0ΤέΓ ‰ΉΕη‘fδP˜*> ψρˆ–QŠκiΑ;h/4κBœK/ϋ‰ο–j1y…ε‹μ†τ)X }₯°jδΎ$ρΆπ JRΒq›'Χ]ώθsε]πG¦ΊγZ‡₯n{~BΏΒ:ˆ γΐΠ{Έ"’A3%ΗΘa†bž„”Iλ―ƒ4ΰtažφB6Y'” ™¨ͺ>ΐžwφοPdΠͺfŸ€ΑΜZ"¨lԜΈ—’€™:Iv]\ΪX—²Žΰή]/Α+ΰ1tβFkJΗ½ΑGζYΐ::q@œΕ·±σή(γ­κmÌyδOXϋiΡαK*Ν%JΣ&‹σ ”% ag1NήYw]± Ρ“/ƒeζMάήΒ,&@ ½8lΉξΆw™d†)€ Kq(2Q`IfΓ9Ε>Φ£υ§½„ψ/μΉξNK Ν›z–oΓ4ι,™$`Ρ ΫmfΙ(―υ`Yςω˜²‡“ly 0xμ+m^fUŒς™ΝW$Νx‰(ΣrP"$ή+q[₯’O\1‹Ρ˜Ε…%YΔ…"X—ŠXΔ €}^' Α%IΨΠ€—’#ηΎ +1έEp—ή"B=}ιY˜ $Z,“Βe2:IοS χϋ@‘2†=.#ϋC=b)rŸhO ΊπQqcgδρΩDaΑ/q(©Ιϋ#όμ‚³/YE% —ͺ:…I€e! πΐ _O0ˆkp1κX²ΫΕ¨ήaˆlΕ€ Žp6`ˆ˜‘pŒE”49f¨Ϊg„i>€eŠΡ!u‘‚*?Ϊ•οx£ξAΒΜ. vΘkeAζaπ]¦ΛΦ_·¨.AX 5)Bs!L46»ή>ˆλ! £2\ψPXg,aΤέι`­Λ”'U‚«ω6žΕŒ?χί—n^Ί Ό Eβ#Œ4‹QP%Jλ(Mxpf ΝP/>C@Θ$‰‰%lB‹„WπL‘:‘™@EΟsVΒ«σ©ρΈe„”1ŸsaR°I«]½σΎΤ™Πί;yc¬’Eκ<–Φ)Ap8P‘ΖQ8‘ί“ER„ pa e‚‘ΜA]£d’ΈτπΈZ—H&¬c*Š ;‡Nΰ ΠZŠ΄Λ‘z”’—·¬’»‹{pΚ΅λΰΉ1fέ ž ­γ}V?OA™KPXD½ ¨ΒφN (<'B²Pΰ9ΜΠ’œύŽ©Έ/NI#?e“ζΜΜρR&“k$f0™)ӈH;N|€tΞθΊΌΟ=%ΰ ‰Ι,-—μT_Μ΅₯œSQRΖƒD ³ΦS•rhΜ…ΰǍͺά»Β\ŒŠΓ‚\bάθa!z@[€•‡^@~Γ25₯eLΖτ ‚ωΠ³β!ΖΞ‘ ΨEP cΏ‡nΜ d¨τΡβ§%14+bhΤ^EΦc α8AΟ*Hζ)»·ΨΥyX|*ζ¦μ…ϋΰ‚μ2«žKΌςWc"ŠqΤΖA6$ΐΘ먱( YšQ>Kω•{ngCP)"N·“Ϋ‰Γώ ‘„ΟMΘΘμ)ΐ›΄3ο4 Αa³„xάEI¦,&ΠΗ[°ΞνΕHUœœb .Ή²ΆΘM 7elφΉŸ«+7°ΞιŒΤδ†ΙύΰύΦΜW©tiΝhΗͺO3d₯ŠU™fΊB©ͺŠ©PΣλRΧΖΕΙfΧΝ²­'δΞ7m‘ ΈΦΉ΅…οjϋτ(qŸ,I‰2“sθ)2MŸόQ’’E}›”MΥΑlh¦X5³<ŒH]΅ N‡ >ΙGd}Odζˆdκ·Ζ¨ V}f­*_ͺW£JξC"‰>G=ΰ&ΊIEωO󌳚9Ά^8›λ|Ν·ΪΦ5³­i΅‡ίVZΥ& ψΈ:ˆ-[¨‰οͺdzwλL"f#υ˜ά-] ͊2σmυ Uo·aά ƒšΟ‹WQ#|΄1ILHf7%ŠΖэ(ΰl₯ΖsaHΆ #Μα…T’1€ζ*| †… Γά€Ε‚wSτGΌβά#™=3 ΤuG ΠšΛ Gˆ¦'“τ³0k`=«ΥM}2r©}άΩΖEηRžŒ»‡ΥaœꆃϊĎƒά ή±#‘ž·%!Η™"|o΄A2W―g"΅ά>©ΙΕά2?}ߝΗlΨΉ›nƒξ;PfCž²s’N’¬E5?+˜W‡.Ατ[Υ"KZ\En½F`Υ/-̊ΙξWήx–o½Ο6ή?Ϋi―ͺ›ϊEωόΜ²)Z‘ p›Ξ0›ϊ-ΔΈf•»Ÿ2/Ω0Op²Υ1Ϋ —·½»/G{΅Φ΄Νιβ“ :Ÿ’9νC8ϊ؈_1q~…zfˆβLΒ©ηW\²€₯Z[VuTьτ2ΰω’%ν{4ΣM#ΆS•κ‘Έ‡?Ό‘œ8ψα«rZƒ€€N.φtςψ„ ‡O0Ε™NξQπφK›έ!DΉΓeOθbόaΈςKGΨV6}ف»―‘ΐaL?Τ\n…κ† Εβ­Ζ`^OΠ3‚Cώ@ς“Θ―θA„Ν ζΦ/΄HC%C{·βXς§|!`c`Œ…#fΑfΎ₯ Ԑ˜ϊHA+8ψ.\²ί3§‹Ζ‹‡WΉ Έ….λ jΑΝ₯U~Y.όΈ#NΘRM£Λμnΐσ/F›φΨ{$X±μλ”Ο] َ 0ΐϊ” [©{¨0|@Ξo ΆΨτ± ¬δ„\Ιh1@‚‘£4f:U,¦Qš€a wΟ £©άVaΧ₯ŸŒ2ψ4‘“h ρΰ–tuψ=ΪIω”¨o€/FOδ ΐ­ΧN]κ›ΔΈ1PlΛ,ΙΞmάό‡j³΅:ηο psBΨώόYώάΩύBXύ’ΨόόYόΩϋ’XϋBΨϊBYϊόΩωXωbΨψBXxEφ­λ㇑υχ-i33by7γ:ž_Ώ’{S€<ΙΘE^g‘k2ψaKZ₯#«Ω½PŸT3ŠC\ΜλνΩΉ ««ηΚ©έ­\¦œιΪΗd‰vHΈΡQξS§;Θ£™ΚΝφܚ5T8ΰv{Ή‡=Žΰ{±8ΘΒ4Ÿ{7‘τ¬%oδOύ6λiz’<΄υΏLzΉ CFML Scriptsource.cfml.script arrow_func_lookahead&\s*(?:{{identifier}}|\([^()]*?\))\s*=>attribute_name[_[:alpha:]][[:alnum:]_\-:]*constant_identifier$[[:upper:]][_$[:digit:][:upper:]]*\bdot_path_identifier[_$[:alpha:]][_$[:alnum:].]*func_assignment_lookahead\s*\bfunction\bfunc_lookaheadd({{storage_modifier}}\s+)?({{storage_modifier}}\s+)?({{dot_path_identifier}}(\[\])?\s+)?\bfunction\b identifier[_$[:alpha:]][_$[:alnum:]]*line_continuation_lookahead„(?x:(?= \s* (?! \+\+ | -- ) (?= != | [-+*/%><=&|^\[(;,.:?] | (?i:in|mod|gt|gte|lt|lte|and|or|xor|eqv|imp)\b ) ))param_attributes1\b(name|default|max|maxLength|min|pattern|type)\b sql_lookahead(?x: (?i:select\s+($|\*|top\b|{{dot_path_identifier}}\s*(?:(?:\s+as\s+{{identifier}}\s*)?,|$|\s+from)))| (?i:from\s+($|{{dot_path_identifier}}(?:\s*{{identifier}})?\s*$))| (?i:where\s+($|{{dot_path_identifier}}\s*=))| (?i:(?:left\s+)?(?:outer\s+|inner\s+)?join(\s+|\s*$))| (?i:(?:order|group)\s+by\s+($|{{dot_path_identifier}}\s*(?:,|$)))| (?:SELECT|INSERT|UPDATE|DELETE|DROP|CREATE|REPLACE|ALTER|WITH|DECLARE|FROM|WHERE|AND|ORDER BY|GROUP BY|INNER JOIN|OUTER JOIN|LEFT JOIN|TRUNCATE TABLE|BULK INSERT) )storage_modifier9\b(private|package|public|remote|static|final|abstract)\b storage_typesY\b(?:any|array|binary|boolean|component|date|guid|numeric|query|string|struct|xml|uuid)\bH1xΪν}ωƒ#Gu°ΦX`NΫ`ƒ<φz₯YkΦcπ¬Ηƒ ΛΪY―γΡ¬έ’Z3νiuk»[sxΫΉ“/!‰BŽBδΛ!Η—Θ}}9‹ο—ο_Θ{―Ž*U«»5zμΨ«ͺ~]υκΥ«Wο¨ώΟϋ{;Ώήιaπώ ΓqάŒƒ^βAΡ½ηkϊ_αχ‰'ŽπλMϊQδ΄}/q#ΗΟͺΏͺ°¬ωκΐοΐΧ”~ΎΆπύψΊΐοΐ―αΧ·Z€“ƒ‘g΄xm!¨€Δυ… ’υBPI…Χ‚JΌΎTRΰ~]2AΓ=Ι=νΎΫσΘΡyο UŸ”τycΥ'%ΉήTυII½7W}Rσ-UŸ”΄}«uΊ~ΨΫiΗ½pδfΔΌΡ9Ϊs|e6ή”#IϋΆ|IΔ›σa$ΉnΙ‡‘„Ή5F’ΰνω0˜wδΓΌOΐάf%eΟIzΫ&)o/•Τz§ΑV4έ Qζώ»¦ΓΙϊΣαδάa0₯„…@f /Κ–ο,”MίU(9ΰh dƒ» %/³Lτ=œ7κΒΣ,•=o3Θ*«].†•υ/†•D½§V΅] +I»RH‰Β‰BP‰Α½… ϋ AεθΎ»TNψχ‚Κy!θϋθ{ A δΖI4ξ%a”qβϋ A%ΗΌΏTŽΦƒ… r΄V ΩΒ@έύQδΖ1.=qβ$. ˜Άτ3ΔO•=',ή †š΄y¨τ#²ΟkΖΊc9 4ΞΘxͺT"π]ΦUXΝ bSa;k•p›l»±χ’Ϋogς.{ξi~½Y.‚Κ£δ ντzπD~ΈμΑ3₯ΐ%Ώ»ΈdΘgKK^όžRΰ’ ?^ \ΗίΛ―oΡΐεΊ’Πp£R’―c ιυΪVφή,ϋ„lγ|Ω'δ(=Η―o°<‘aςό4(ΩΊΓ―·P‘l΅γ ~»Ž»ΎΒηέ’bH¨τrπΐ2¨ώ4(‰­ke ¦n΄AρHτ”—΅o•—Γ°] \N―Έœ,/Xu>αγΪ±*=ρx4 £„Ψ‡­ q|«pSΙ`‡Ε°’ŠA1¬$aX +ι7*†•Δ»0•Φ‰•~Dφ4.ύˆμpbΥhg«½εn3ήI€η»γΔmχ°ΖDήHΡmΗόzW‰ΗΝgw«?+{ΊΗ―·L<λΠΝΪΪ//λ?(/Ιψ"Ώή”Ÿ!s±°Δ$-,Ρx©°δίο+,ψϋKΛ…ςJΛeςKKΓυ‡JKΣυ‡KKγυGμ#ξF΄q‰w4 φGωU8Ɵ{nθxΈϋcόϊyΦΉ(·—±ΰO†δσ«p(kwτόϊ: ˆ\δΖ’žοhOό€±Odφxΰ§ψUΈιΊžF: χΣΆŠηV€ΌΜ―"ž2KάϋγqΕ)@~Φ }!‘ψ€1@{βφΟρ«Og£Έ)~½>»ΟόrΰηM2‡‰ω…‰:ΐOα(όβdΒ‘!@~ɐψΊ}4u\?mtΝυc·= Gβώ/σ«p<‚ΰ’BΰX/τ³Š~…_λ 7&Δg ŽPά+]w+›-ŸΉΞŽ€ϋΏΎaœ4κσόz³ͺ„mMG€*ΏΎuάύ‚!#, νΡ8ήπΏΖ―oœ„WΑΎh(6/”€ύυ|4•€’1‹­π*2Ώa0έ¦^²…γ- ς›Ε,,ϊecΔt–€ϊŠ!δ4Χ•ϊ-ƒJΣxό«όzt l{ςΙWœTβα―ρkcΪÊoK<χΫόϊiΟMŠΝί1V)ωXδ&γ(ΠΕψ68Κ±Τχ`ύu1Η…«Dά=cύ™t₯Θί7$±ΊΘύΑ*Š‚)@ΎnA―†ω†±γa7Œ?δWΕR}ζ›ΖœΘσqψ?2$ά(Œ“·?ΉRύ±!— "+ܟ£bΈ؟ΐ’‡WόƒoP€{ τ`ϋcM3ψ3Cόfξρηe™©-ξώ…Α“Ύ€ό–1=cθ»³εκœων‰ΖΠRwΏ3Q™ηΜ–@ibφ»ϊ+cπ&<π―συΖ=Γ`kˆ2έςPg―Lp„ϋ{ƒ­U«Qΐόƒ!f-Ζ³ύΗPΛ`ώ“!₯ L=ρΨ?σλmSӟωΏΖxjš·ϊcŽ™6–€ϋWΞΠΜάΏ’oΧ‰πUΨd’o0y Β0mp a€Κ„YΊ\ s˜ΊΏ’>8eE»ΪΒ²o΄”½ΙRφY“’7«#(u©nΨ?Xˆ’ ΐ΅YοiιRΟlγKο΄’­θ‹Η^dΦU7$Ÿ“Ά‚š’Ÿ’wŠ`ž ύT{1Ψ…-Nθ šqezIΞHΛD”+50}Yϊσ9τώΤ…†Ρzζ¦p.·pjΑ’ίl‰>Υ@Ψ$ΩΨM]Bήf)»ΉΤ<#Λπqj§)ͺΎkΚhm³qTΖ2Έ₯V’Ϋ–ςϋžωγ Π²ΆΚ0 λ’e˜ΠK›ΦZ„^j·Lγ{*;έ|–~k―6Χ€χξΨX{x³•6W1½Ϊ’ςοΘΥ6PΗ ŸΙΑJˆ‘†•Ιx‘u•ρ¬0Ή£qEXν+™Λx…Ε‹θρ«sšΆS*mο:ώ8[Λmάς…€E ‰yrž,+Ϋ―xrxrͺyrζόAωε£VτΗ,›ηΝexTΎ—Uή8|/—ΡΛCΘ‹˜λ²š“Σ^‚Ι3„9π½bnΆΔ*τ#‡ŸΏxx\"'Α§W°4N†oTN•Δkτk¨u)“Ρy¦ζΖωf _†kαγk—π“~·Φ;2ό¦νΘmΧϋυ<©ϊχΖ_zλΧώϋŒήχ\½Wρθ}ο‚Fο[―žΡ˜ˆC!w?YΩN†ώ„Κ¦ θσΟ?/k8’SεŠEΞ+jCδμA@£οΆτ’²ψWΥrωKω{M6V€JΞ>μ£6κjjΊ²σΫΦΤεns=—ΗgWl+6Χαl.3ΐ­l?[ΰ€Ι«γεZώŸ•—–Lje±Σm]e06nάsΐGΆ“Ι=ΚkK~ΤiQξWEϊΨ±ω!}μH/θΕ}΅jϊ;}•D·5ΤΩv„ΨυAb@δ§Ω\ήΥJ;ΛiŽ@ ȍρ©ΌΎ O91όLYΓ[λχ€’βψψ ‡­V+εmcVi9·Aj*wŸ£«Θͺήα–©˜μ1hΙw ϋf5@&υ‚€­υB/hb‘₯Q|"κ»QJΒΓiέƒ’8ΐ£‚P²ΒΥ§O>υΨΉτ‰3OŸ:{.}ζ©Η9w*} ρrφΙ§ΗΞ’³§ž:ύΘc§GNŸ;u6}φ‰s¨ΗN?rφTϊΑ³O~,}φΓ§ ωΘ™ΗΣ'Ο>~κlύя§:ϋδ3O5 ρΔ™3§Ξ6>ςδg'Ÿ9'’§O}πK;ϋΜ™Η ‘ΖΉG=}*}τ™Σm0„Zzίίhs±βΡ7U+?Ef9ΒαΚΉ2E^ω)ςΧ‡™"Y›AQ.kΑ\†qW±šγα[3ii₯bG·rF9Όλ›ywρ’κ½eJ½E6†ύΘ°Ήmך~^XkκΠΩz’νR[Ά1δ„±%χ]ΦΦ½S{¬χACόΚα σr½+Ÿ{Tʟ(νΔ•{WžΗ1Ί·,F/8»Žz:ΑβPΊ»Œ³Σ¬2$"—YΥSθ"c3ΆPyι\g,©•Τξ+%¬§Pε“Ωο« ³mψ_ρ”½Bο™Hmqmu6mρHUTgލ7±;t.xξΝOΕρugΎy"|\»Zεm›Ο˜΄Ρ^JHœ­vς3ΰU+=_,+=—ςϋ.ΟԎ_ιM lΤ|c.Cmζ=qξy΅NTۈϋ\…αΧ £GD3SΔφρfώ«l-Άsum›θ^·ͺδΎqΐ½]ψΐ²¦Ι{οΘ₯>{±N ήUΤy[Μ~]R΄‹fΣ4Ɯ3λ™'ά—a=m»ξiٌ‡Η@’g ΤμoΚίΣO‡Ξ>ώ;ν[Ιv:τ‚tBΑ‚Ή§ΥιβΠ ;nγβΙN°Ω²ϋφ¬ΪLώ;"teuςωβͺyπEΦ ρειΦρioΑt?Gη©Ό5γϋ5ώΉ]v8ίyڝ >Ή‹ΨΦ ±Κ«νΒή•ωKΩgΚΑς…΅pρίΉΰ°α>7ΥcaΔψ‘Wž—@>, š ͺͺΈ+61«θΟ' ξ_,V‘_Ξ­*«•ΩVΝW9&˜UεJyLτΟ–aΝ#΅’?[G~¬6ΒτχΈΒ‡έh§‘h›5KΩ‘™QWΉy£ψ`wB6ΈΧTAΘn²κΣ16<_k)»~žΜkΞξžΧXΪƒ₯μΝ–²·XΚήZ…Ζš©Sφ―ΏΎΔk•Ύσxρυ*€ψΎ$ˆ§l(/θέ–'ΒΤE2oβVCC°ξέw§ψΟτL΄ΰ‡[ψghιv­?MΛ !JΠΎ`ώ5α†œUϋ(Χά-GΔΜΨoՏ5΄qg#«²A‘·΅΄“°[ ίgύξJНε΅*ΠΗ«@·+arbξ•ƒ6½θӨπ j{υq σ΄Φ‰{aΠsfκ·ͺC½ΆΖ μ^;ι=hπ?μ;€ˆ!HvG%θ51₯ ΩD ά ©‡;v‚ίρm€Π&ΥRΆš‡ΞZ₯F•ω|,ŸθC³^Œ«[eΒ?―ώ!AœΘυφ²!šM<«ΘΗc$Q²νp qΫuΛΒ#ΫóԏG"mΑ½ŒŠšx¨1StτΊ™Π@΅Uf³6fΕ¦Ύ0ΰΑ~ŽΔi?t9ίΒ//U±9š‡Mίνy±7G½^ΓeφΛτψ7ΩEΑλΝΠβ«)<|B ZίΫ₯.LjG4ΰ9φΗqcϊΔ\ΠΰΰςF>,£ ΅`‡>.$Ÿ΄:΅ξvƒKώxά₯ΣΔ6θΕs"ΨΩ°*Τ"ξDR w)Ξΰ½±6]SS‘ί+™\²SίaJ;]'Šœƒΐέ+ωΩΎ›4dσ±θΛ!Sv€–|κV­ι“YΣθ]\ΡΎ 5ΎΕΫΟ-³Gδl†ΰν–²wΞƒƒ4?Ρ4Αa.[ iZωN°5FO3AšnΠ*KΆ5UβΉu! YΥ-FUxbžΜΧΩXɌ€)βηΆΝjW•ڍ_Ί 匀dMh‹Ύ§YD3ΕMn”φΆΌ΄η{p7ν…αŽη¦<π?„Ρ·ƒ,pόΒrγ$έhŠΩ·ΌSμ(8τqδ§αξϊqΆ‹hΊϊ>c˜z«άxΨz«°Ί°’δΛ~GL6Kh³€8Ρ–O΄r—·Σr’ι &|q’³ΜΎώv²#}ͺ|…!OΤΏKkκ¬Ήy6¨Ωfύ‰σl㓆"`ά›U:΅•%β<ί#ΞbG ργΦδΑ2§©G ™έl³(UvΘ^Ž\²”έ₯uώ&³oςƒjŽδτα6΄²OLCν¨₯μX­Β]―d­³SΜ«Ÿvnsn6-e-KΩ½²ΧI\ϊa•CΌE­fνχYΚήm){₯μ~ 3Υ―Ά βΆU=‘ήk){ΩRφ͚MžΝxΰy2̄̍*2γ«4ή υ Nœ¬Ÿc°‘Ά<j―7Q›%Ϋ<>% Η$сϊν9­”ρν[Σχ6ύFYΩ§%ζΦ|»°yA©Ζ™·qΒJINψΩZq¨5―•Θ'ΡΨΝπλ«|CV*?έ0τ]'XAxSΊ^Φ6pprts_Έ¨Ž0λΛ° ΖΎ?)ͺ'«CΈŠΗΫZ>€Αtλš/AM˜α”ΠΜΌ°γϋ,eο·”­VG­ƒ"ς3o,ΆΖΎͺ5uΏVΣ!"•Ά¦~²Js£’Oφ–ρnqŽdŽc.g]–ιNž}ϊyKY%—Λ›T€Ι= b~zΑ.x―ϋ+XD[°( κzΠƐͺ۞Ύ τsJl'IšεΏ”Sώ'9忘SώεœςΟ)»œςΌOΚόDNωζ”LNωΏεΆƒΫ沋κugmœ|©ΥΩ΄~π5“δΜzθDoΐ6K<<ΓάzmNςxβsΚ:§όίrΚ4§ό·rΚsή΄π}ψΟ_"Iρ«‡•e―]ŽώR4žGφ/Άq»—3ΠΆ­¨'k9L=o†«-ͺηΦ―4=lΪ.φ#žΑΛξ™/\U!υ§²ή6§ΏžΕΎΣg7ΏLΞW{HλκεwώΫΪ‘Ω`ΞA‘‡Πlq‡ZBλ3#”Ώ©μ:K;΄”}ΘRφaKΩ–²XΚ>:s_’/l+6ž"―§ͺ½ZTxLοœ^¬&|ξΚ±(ΜW,ˆ?`){€–³:|mΦ±šœ­)AyΗ·Δτ|΄ i„<& IκlΑΧ T΅oΟJe+ϊJΪ fΠ€΅w€D ϊ1Ήp"]tmΙN5[ΥύL6Β™†˜βδμB(p'ΕΚΌ`\ΝρšΝΕ5θtΓ()QΝΐŸ\Υ'b•κ)Χυε¬ /θωγΎ+ˆ}ݚξpδγ'#’qΰ†D>ΦZσΖ  Ώe± φEˆβX†ωε>§'ρΠ₯λδϋ*ίlϋTNωοη”|Nω<Ύ#ϋOκƒw–Z…@Έ4σίk3u”±cm­Ι3">f);S…;fΪ]ς3/ZδIŠM‹πŸ<»Ύ„μΚΚrKsoη»fžm_–}ίkΥρμ΅G7ΪΗ7[똦ύ χξoάΫ~Πi@_nhw6Άέ}<ΌŒΎΩy΄³‚›Η 0ά?Ί²΅XyπΑd—Α5ωΛ­uψJ4Β¨ΑžlΥ[fτXϊΚƒρЍΔ£³ωOτ^όΩZΞ<ΩA³ DŸYi™ΐXέ©τ†Š»mMžB2KίΪms’LΫ,8 γdΰν›‹«ό αρΞρ9TWЏλT‘ΉΦΩ΅Vι—F‘kiXί›ΚΆs²ΚI:—Ω”i―ΛFζΩk»VΦ–vζ€\Nμ+w ±Œ}Ω«+ΰϋ!>3ΏβUΛ™ͺη4Dρ±ΝΌž±Λ‚ βΜ«ωYkΝ««Σ6νfˆ§HΫψxmΚ_ήϋ—Ÿ:΄,j“χ+žσλ΅ XΌNPN؟v:_ώAϊΟΩτΈ ₯LΔyΆ‚*`ΗFπy~*ηrρ/li±ψΫtΉ―η}—ηχrΚ%§ό_U Ύ‘!לω£}lΣέ!Ο?†·³ΡΩΔΣvΚyΟ#εWσHωΨ[SRo–2œu†vρβ†νNΠΉ˜νδΝέλfH w?o)sj³"€άα(9H}'ΖS†‚tθŒΨΩΘnίΈςΐΣ<·‘ γ‘BΌŒϊΉύqΟ­Γ5φ^tαθ ±‹‡dΔΰ’†pˆ?ά±‚ρ0χ ­$τ9Έ°΅₯UO{Π{ίFδ‚<Ψ3ό‡4`―cŠκLO)Ο[HLα.—nž έWιιμζΔΙ ^ŸQ+…u‰§FγΊ·wyΛ1κ<‰.ψ]7Υ.ˆd¬ΆΚΌ₯τ%ΰΚ»ˆI’‚ B€Ι"§*ώ$]}}σzPγώs΅21”†ύn@E‚ΐ1C ό©Σo<‚!ΈfαirΔRυΘΉύ~ʎκr‘Wa0κή`@ηUΛΐ„κ`yΐRŠ>8ŠDqχαΘw3ωΒΨ‡†Ή‘1E=FŽŠ\„«§±ΔKBς·pLΨ„§mΘ±SΚ€ΐ ˜=qκŒ“ν1pwΪ…y8[Xj‰|άΘIΆΣξ¦Pœ † 0”NwιΤžΒC<δ)XY=J‰Npwa’φFγqŒ!šή8ŠθΊ'²}/‚1 £΄Š°) !;τš»ϋ=wDȁpeUAδβ˜Β|½ ΓGϊ4D#…Θρ I, ˆ8[€Νžsl̚n'ΐΆμ`κζ‰}˜/ηέμ΄’~Ψ£ΩYŸ(ρΡ{Ÿ '.ΏP9Θ3–λ{ œΒ“•PXRΌ[gωm ή(υAΪ ΧavEŒΌ’ψ€%yψ‘Ο"e[ =„πΔl§.2Τw˜OHPΖ2Ο:‹ΗΙΰΈ{C¨‹ρ~œb`F‘ζJΥΥΜ6<…ΗΉPI~έQ©CΦM—0Η*$ΐK,^z‘½‰,Vσ̎Ο3€ώh+†ψΐΰ2Xbƒ€πC’KΧρ`>‰>uƒ¦}o C˜Η³~ Ήνβ)j˜ς€V¨. 8”ϊπžΧ‡ρή™Σd£i4tv\κΔ€ƒEzP!εq"α€ \˜υb# VfLŒ[„=ι…ζχΛ5>Lh1]hh‚-–Δ”ΪN`Ϊΰ,pΡ4ρίsbŠό ΄E”'¬°H<폀#²Όy&!pj])ΙΊΤƒι>uPFΰŠλ(ύͺh±ξ"Κ2₯ά3fΏΌ£ϋ‘¨`φ]`πΉΫωτΓxŒkεbQC!Lλ,ΪοοƒΚS-©Π΅˜¦…³•―ی%Ψ”ςhπΠ¬λΉα υF^8#γ{£έbX„˜uΊH•hBμβrαφ‘%q₯{€‡_:£€”§0ϊa‚\ŽGȈ­*:9Š£ώ¦ι6² $ KΈς›<ΒΛ…!Œ’‡«>σͺ0y †ΗM¨%Οkβαa”B@ζΰEΟa²Ni?άΪ‚y€΄/‘ύ†Έπ³}CL¦ν‚Gς;έΓQΐ€3ό“ΗsaΘUΗ+!^$Έύ’Gς΄•’°54ϊmΠvΌaΜt%pL――Ϋ5|МP›ΟQζM΅Us»ΒŽ«ΔΔu=]¨βtjλΰ€«δ\쏙–δ’ΎJ'ŒAEuEOBΖΨT/ [2²$C―ΕyOfΑ–b¦ι‘Ά·’‘PΥΉ]§©κ//ˆYP°έ]―§œZΖςL—diδ*Tʁ =1b2¬ώOΓ_ώ‹ ³δΐa‹"ѐύŽΖ¨x2 H€ΌΜ/α`€“Yj­b€Χx€ΒWVψΨ³BF,–f„biόaR ΛΡjΝUiXh­ΰ VΞψƒ7Θ2X¬p 'ηZz.λ;Œ(~ΔSπLfͺΠ”ΦŒ΄H4†δf¨Αƒlq‰y΅†₯ΦHΠ(zΈΎSWπ‡3¬` e"3ϊΑl Ί9QΗy”Fxή( >LΰrWTΤθuXž.”E“1ΑG…eD ΪΘ2±BN™ŠωΪL]Ν’\ΖςV—ša]2‹‘ΰ'΅‰,Œ}Gdi"±aSΈ†­Πh!LΜ- ±ή²E†Ν`ΦMœ·=\§mYΨ]€u¬γλψΔ >”!t˜κΩΘ=:{Pͺ­ΔVLΊ·A?Τ  ‘€–M`˜q\tzΜ,g—ΜΐЧΜ9&π3ω*Œ}ΤU‹ŸM&vμ2˜Ÿ΅ ŠPιηπbSqtΨ”Ξf€ˆΣα*†:γ{$1·ψ<œŠPΕ T?Ρ2JXQ;-ΈύeŠF]¨bιe―"ρέR-¦―°SvQΌΒ°‚=+‘ͺ6—4ήžIF8nσδΆ£Λ/}nΌ ωΘLw\λ°ΦmΟοB +¬ƒΨ1 ΤΓš)ω8Fsμπ$Μθ KZδ§ σ΄²Ι:aΙBΥτρπ‚³x‡ ¨ €V-ϋδΎΠ Αt`£ζΔ½ΜΤI‚΄λβΖHΚΑ3œ]/Α―ΐeθΔ;ŒΧx†¦O£ο ’ α%DkΖKβm?`׈ψ=r‚uA±ε,šί€yo§?޲2₯t/€& ‚Μυ|Ԏ{ƒ1ŽΜs€ut ς€8Λo#ρή)žγ½κmÌyτOXϋiΡαK*Ν%KΣ&Λσ ” cg9ΞήY2w]ρ Ρ•/˜ƒeξMάήΒ<&ΐ ½8lΉξΆw™f†%€ Ky¨2Q`IζΓ9ΕήΣ£υ§έ„ψ/μΉξN–O Ν›zVoΓ4嬘4`HΣ ΫmžfΕ¨―υ`Yςω˜2‚C†iΆ< <‘‹6/3‰*Ǝ_ωΜζ+’ζ<‚BΤi9(Rο•<ͺ­Θ'©˜εh ΜςΒ“,ςB ‘Œ€"1i†Χ‰DgCpIφ4ι₯ζΘ₯/θJΜve€Ÿτ©ŒΎΜτƒ,M-—iᲃ$Lφ)•ϋ}ΰH™CŠΛΜώPΟXͺά'δ¨.|TάΨy|6QZΘKJκςώΈ`Υμ‹σOшΒ₯ͺNiRiY G| 0ΙΧLβZRŒK~»Ν;L‘―˜¬ΑΞL‘0 Ž±Θ’%ΗUΐϋ,‘0Λ‡¬LQ"R%h2πSWYερŽ7κ$Μ­αΒ`‡ΌU–dίeΦ±Laϋu‹ιτAΔP—"tΒDc³kΰνƒΊ«0.Γ…•u&FݝώΦΩΊ,‰qR%Έšoγ1Ιψs½ιφΠι₯Ϋ Rd >ΒΘ³˜c0Q²΄NΡ„gZΪ υπα3„>@š˜XΒ&¬HΈΧΉΊ \τ%Ό9Ÿ:[FΘσΉ&›¬°Uρί}χ¦~Μ”ώށx6Ζ&Y¦Ξs™c „„j…Ο{²Jʐ’ L`₯L1”Oi”‡(/#<―Ά%Κ„‚ 똊"Î,Η‘xτ–"ο²ΘQ⌢ΡηΘΒF₯‰Ρ ΛBHπ˜“1 ύJ1M9]rƒBŒ€ώ ψ1Ωθ΅`#«φ³ž†’, Z©JEθιŒΰ:τbτP±gyω’<…ά΅+“¬Rž2¬²)[ RΨΐt­œ¨΄βΥe–y‘Θ7ήh;‹·°Γ'DJ1el‘‡ζϋ †cθαv -ΆƒŒΆ“Εθ(ˆpνgŽΆΗŒθH(D¨#αO8$o€ΘkŸ— Nƒ5¨,’έ Tα{')Y)ΘζhQŽeΗRά§”Qœ2‰Ιrfξxi“Λ53˜ά”iD¬'>@;gό $οσH CbrKΛ%;Υsm)η\ [ET”Ι QΒΌ«υTεs‘ψq§*°£° wϊCZ¨Pα`εαΏQ^Η°Lΐh“³#ƒΰ>τΗ¬zΘ±#$(wLΒΨοas@Š9*}τψiΕΔE ”Š˜υD”CΡυXA8N0² šyΚNνΗ-vuž―ŠΉ);=D‘>Έ »Μk…ΗΈΩ«ό֘˜bάc΅q ς:Z,ŠA–fœΟΤR~ZžΫΕ™Ξ4ŠHνΑΔδ~β°ΐR¨αs2 {Jπ.νΕ,:CΔ¬ wQӁ)‹τς¬s{1rg§τ€Á NDn¬-rSΖ…ΒM›}.ΕλκΚ—Lηt|irύδώ ˆ~kξ«T†΄fτcΥ§9²RΕ«L3έ TMΕT˜ιuiλ g‰d³ΫfΩΦ η›ΎHP\λάΫΒw5‰}z–€OV€d™KŠτ¦OqΘ(I ΥΖbΎM7Κ¦Ϊ`Ά 4SΌš[F€ϊi§C…˜dN ²>K$2 D2s‹{cT«>³U•oFΥ+ΩQ%χ!‘FŸcpέ€‘ΐβ§yΞYΝ[/ιœΝ Ύζ{mλšΫΦτΪΞ#n+½j|\Δ–‚-΄ΔwΘT2£»uf ‘°‘vLξ–.ΠfEωΎΞϊ„)ƒža “ZΜ‹ „TQ3|΄±HLHζ7%ŽΖρH(ΰl₯Ζ aJφ 3,ΰ… 4’1ξ*ΌŠ¦E Σ܁ŒόαXVN^ZLππ«S ιYͺ4πγM7вsΒ΅_—ϋζ˜ΡΓmwΟbξ¦κ1x%ΈG:{ζ¨λ>R ΅AŽMW¦ιgiΦΑz:‘W«›ϊ&tδRϋx°«Ξ₯"%v(«Γ=Τ υ‰Ή ’%bGB=oKBN0EΔήhƒd&^ΟTjΉ}RΣ‹Ήg~ϊΎ¦:Ω°σ0,ά))=v (Μ†.ΣM#ΆSΥκ‘Ί‡?Ό£œ9ψΉ«rzƒ€¦N!v‘|ϊ8ψ” ‡UO0%˜AQπφK›έ!EO‡!κž@bόaΈς”ΠKGΨV7½Ω»―‘ΐaL?Τ]ξ…κ† Εβ‡Α½ž`d†β'‘oΠ…›UΜ½_θ‘ŽJ† R·βXς«Ό!ΰcΰŒ…#ζΑζΎ₯ΤИϊ(A/8Δ.\ςί3Φ§‹PΖ«‡7Ή Ή…!λΰj!Ν₯W~ΩSψrGœ§šF—]Ψ=ά€!ζ_Œ>ν±/φH°jΩ Φ)Ÿ»€²ΰ€υι)μA€ξ‘ΒτΏ1 lΈG~tΪbΣΗ.°š %£Η†ŒΣ˜λTρ˜FiŽ%ά=/œ¦r[ €]—~2ΞΰΣ„6N’4Δƒ[=΄αχh'ε‹Pό# 0ΩHoŒΟW@Z―ΌΨ 6Ipc’Ψ—YRœΫ€ωΤfu ώktΙίΰζ€…ˆύω‹όΉ‹ϋ…ˆϊE‰ωω‹ψŠχE‰φ…ˆυ…Šτω‹σˆςňρ…ˆπŠβ[·Η£λο[ΚfΔς³‰λxtύJξGδIΐ.ςKΉ.ƒ΅”}‘ ŽΧΦμQ¨OͺŠC\Μ/Ο³sVW'Ξ•SΙ­|η8³΅Κν‘8 q££|κ\œξ d&7ΫskΆPα4‚Ϋμυφ8‚ΫνΥβD Σ|>‰ ΅g=y3Ώκšžf'ΚC[ @’j6TestBoxtestbox‚xΪ½”έK„@ΐύΈ(ˆθ(zπ”3zLˆ{ͺηƒ{ \Σ δ²;\ όγ;uVΧuE3Έ}™efχ7;;S©Xyα—+ΥΧ΄΄’Δ‹j–AŽAβ8ήΖΤ¨pw?ΌπscjVAŽ@²nGάU² w;Έœ»Όχ}LˆΛ…2•ΔKf^.ƒ7ή³ΔEHY &Ιϋφ›5΅/™Ί}+¬β€ύ°xtP SΪ¬ώ3Oz™Ξ ‚Φ Υ0‡œC(δ\Άd1SŸ±η.AΎ‘T[>!‚₯σΪΓG‚΄Ž:E SΊIN£]y„X)²3‰«³°uΚΘ—"W9)Ϋχ!©’('ΟY™sμ:9ŠπEλβ/e Ίν$k'Ni΅5Ν6VΞ•ε‘eΦBπcΥΖ€90o†‘'…ΐΧ>@α―βƒ.R]oΛ/cκpΘFθή!?$Α‘©[‡ήΧ–‘u7§Θk™xώΖ€©"Ÿ3δ&e&’p-χίΑs&ACυpω œΝ CMake C Headerh.insource.cmake.config.c identifier\b[[:alpha:]_][[:alnum:]_]*\bgxΪ­SKNΓ0­Σ ±C$Δ’]@Ÿ τˆ `Žγ@”ΔŽͺͺnΰβδγ©+΅κ,όbΟσ|^Ζ“AcG§THαg4ώΝλ mœ[ΰ ~ΞpΌ~Ξ=p†ΗύΪή‘ΑΙΖ[hͺ4Έš}uμ\ν²‘½ dFVΠέ₯Α„/Ώ€ ±Το\α •,Αu%˜e4α-Eͺ8Jm=Θb_ρ½VόSƒ/€˜_‘iΉΦ·CΕ‚_“x9εA˜3Π‘kŠsΕs%/ ©pF™’˜Νœz™ZΙΗY.‘Ψ&f}5oDη±ΑOͺb€άκΩ°P§Šk8ΎψCE.BΟΫGΞΕ9έ~UYΣί‡fέsώΣsν Ξ‘ΰ‰δ«‡΅ά`Ή<–›9 ΓδBΗz‰Ν8v΄ςΊ^”­r~όΈƒ[Ω‰ΑB~(f’W“Εoν)κ·9 vΙ‡ΆΞJGೋϋrΗ¬oCMake C++ Headerhh.inhpp.inhxx.inh++.insource.cmake.config.c++ identifier\b[[:alpha:]_][[:alnum:]_]*\bxΪ­SmOΒ0¦€`Œρ›‘hΤ£_ώ?ΐψ¬.])Ψ°΅KW4„π§ό…ξ₯GΆf#JΈ»uχάswOoέFnΗΦχ©T ©ήm”­σTyL³σ ˜–υλ½,ΡΆυέM46T8°bjΗI­²Vρ$䆬`Ίkλη|ω­τ+σΙ5φΕζ8볐ΞyI‘”ΗU©¬ο‹ΏYβοYAβΑι'Ο,{Β§Bς{β!§= ΉΉ‘8<Šρ8V‡”i…ΩpxλtΜ”4ZX„‘‚vσ‚)Ίοπ<±ώ‹jAύ€ζΆ(T©δ>_nQ’Λ‰εkξ£ζx‡šξΌPvš9²ηX-4ΛFWφS‘d$ϊ«rAPrC―–!BΘΩΆάΣͺ\¦ΒKη‘sΠΝ#Ρκeν½η>yΌ&‡ρA@&ΉΒ,±€!ΗΞε4«~γβU!gΣ:ΨΤΜYRφt™§bζ.n½U­v»±[EτοŠ‡φύbΕ6ΐ~~KΦRCMakeCMakeLists.txtcmake source.cmakegeneric_named_parameter$\b@?[A-Z_][A-Z0-9_]*(?=[^\w\-<>=\$]) identifier\b[[:alpha:]_][[:alnum:]_]*\bunquoted_argument{{unquoted_argument_element}}+unquoted_argument_element [^ ()#"\']~ xΪν\‰WIΰ} *ž+J‚&+ξι!b֐`Oγ$ 0Ο0a'“u}Λώο_ΟΡ=έΥΗL"hψήζ½u΄ϋ7ΥΥuvWχμF žΊΥ²juΫΠ?ΥξΦμOšΑ ΰyž5Z[[†ε€λΝVƒ’8<Ο ΑMΣ2BμPπ<°–cZ w@#Œ ž'œΡlS΄Ι1„ΞαΰyŠΓ˜λ!₯#*‘u4x³(km½…€άΨ ι‹BšΗƒη‡μX ΗD'DODB Υ“B[@Pz§ Bι΄P_΄₯7μVHμŒG蝕α>ošMJ·Γj‘7ψτqœBΞ)a„Ϊyα¨Ό*.¨q„ήhπΌΚΰ6 Λ°u§e§Ώ·m£έfh_ŒηzΗl€]Υ­΅pˆΛ±ΰ„ϊ0kn§u{£6-6\ƒ&΄―Αθή2‘q]§L«Ρμ¬ή°!΅1‘!ΨvC ## ]ΈΖ„D(M sΫp|±!;!Ε› xpΉ%…!§„†ΦvlΣΪHΩi9ΖZz­Υ©Σn™Άΰ["SB Λ§Β§cΑ ﷁωψπΏtΫΤΏιv§ήvL§Γzν‘"@ΰI+@dψ Θ@5€NΣΒ½?‚άSCσΠmwίͺρμ:]‹P˜±ΐwfΣΨΠ›ιz ρbo7uΗΐψ{ kzYwώΘλτΜ #~sfΦτ HCτ:c~ωηuά7ίΟpσ{πΔK7 γΎϋ »}H k_0ΰЌŸΓqοC zΏ—!πH+LΪ1 ‰„C}xIwΞ!α$‰ϋŸπύžωαώ,H>F»‘o#›7ώμVΓ r| ΜLcθ3θfT± ΑΠΛv‘,žΟΠοΆuΣnΟXΡ……Ί1#ŸC"Hš³<Θ ’б€\'Β'}„ƒσ'-ΐΘ# ΗbؐѦΉ±ΩD9H«[f£Υ G-OΌ8νͺτ€\ά½οΓθyΏ1‰χοALΪΆ[NΛω²M¦»<ρ eaά₯₯„ΟLcX;³,ΐ  ςωΉχΦ€/ˆ<Ζ~βΣ;Fθ@ Oc\β~—ωŽ—<}2Ύ|nΩδFπΔ !aNΗΰ5`$Lœ4ΐ4ΌNF«λΨ+ƒ'ήγ΄»e8z†„–†ήlf[ϊ'Lα Ž‰_2ΊHΞΝjΙT"A3@Yܝ{‘;ξ%Δ?4s£%q3^n»ΣκθξΜ2mΓ›af[· «©¦ΜTΖκΟp8Ί‚eAΖ[;@q%hξ°x΄UmF[Ε]I‡kΖΊi™ή_ρ(-δi>†npγΨ`…jiλΑdŠ•έχ6‰ƒϋΗ$~Oτ‰ξO™ X} h[ξ9έ?r|ΤΟr<Ύ|x‘_dvrΘ¬Π/2;½dΦ7Ύyφ?;λZf#ΩYΧ2;ߟ2ε\?η…Ρύ#ΗΌ m²p–£¨θΔο]†$xΑNΫ=ΐΉ+œšŽ;žjd™&.Ι4±Βi «©β”MQ6$jLnA.ΪJΎΒJ―$ϊ7{Δaι ΐ…]m%9;BΎΐπ3%ΰ˜ΪΐϋΕ"†i ΟΧF±έkνΫ\%8KΠΙύ˜½=ΞgcΆ±l’5M‡-Iιb*ΦΜ•‹Tl8Ϊ'‘φϊώ ΅eAΫrϏOœ΅ΊV_ΡΆ)ό[[υŸθ"ϊΗ΄Ϋ3ΠΈP™i9›†¬H_ϋl›ŽA«zoνψ{ΚxŠˆΥW‰>qΙύγ\οmo]°yˆœ$Φ?|–/δ–³ΥηD\”r…„θ–­oχx%ƒ_χω΅q”"ωQyιγιJ΅œ/.FΏ$"ξΏ¬βόi©Tθ‘sχUHš–{ΎXΝ•‹ΩBrΗ―«„³ςAk―NG€/ǘΦ_zΣ\ΛŠ”‘₯’£"oΔp έπΫ―YΩMucψίΖ??ΪV! —‰"½%ˆ—ρΟύΈ₯Nxκ@“ί•UΌΫ‹’φ5Iϋ€Λ3μDΡ‘%Ώ’‹qΥσia{Ζ@ρΩ'/μ#=ΞΨϋα#tM[y8–LMŒkαπѲڎŽΞΒ›h»‡ΌΚΞψwF^ΒυYšhh€ΠA#i]¦ΛΩΫΡ’;ZjG›ΨΡΖw4mG³Rœk„QΚ} Eο@.Ϊ)o'DςτiLDΏΞψ«Θ»φu:Ž+―vβ;Μ!·|ηΟΖ“1ΉIE<©#emh°Œ’δ‹έ.—ΊC"YΒ-ϊχZxedΚξΏ…ΧΊ ­«]Ν€dͺοΉwΩ`nuμ†ΑοΝε?‘€μ†U±i§β˜v Q‘iσͺ™’„3₯υ/>)dΣm³­²εZ―ϋŠ­ξΜάΖSΉ#™ Y:΅Ά Λ½–γω>'›nL< ΛfJ«{HΓ¨€ΧˆΑEžŒ{©Σn53Œrf‘p4. ψP;ώ *nFaΎΜ„ρ!mW½pχ΄ΐ·S@uK8ωΑD\vˆeL¨Bΐ†š‘^‚‰χ;ΓΎΖΛg hΑ؁~1‹1œbΔ ΥέϋΔ‘.K„ΰ’"κ‡ΰpηilΨ­Ξ6MFΑοAɜη$ν?ΕΙ'˜y³³SFXŠι!‰ύKΩ!ΑρH‚ζ:G²w-Βα―*΄H–ιρpT¬GB¨M>”΄ίί Νw#ΧaVδ"=o+œl 6BΎΗ½27Β1Dήπڝνν–퐸“‘Πόθ™Ώ“?Ϊ&―Θεi’§v)θγΟB+δεA#8;³{œyw}£ΣFF06ά cƒ"@Ϋsws>¦i“O>8Άυ°O6ιέω4#dΞ—―IdΜ:rB"βspΘέΙψL!‹TzκωbΘ7@’M­{&ŽFEBΓ¬η‹œΰΘΏ^ΘWͺ•ά­hrή Šωjn©;Šή Šεlq1ΧEο Υhθλ"ŸΨxΝ'Τ§oq3o’φΩέΞ`l\α3„4βτ ³ϊ {cυΜifόςF’ALηKΖB&‘‰™ηž'$’_£YQoκ‰1ΨξIMvιd¦7i^”;p+χwIΰ>Ό uΙωγύΨ?ΎIŸΤ&SΙGαiΞ PΉm<%»R" ωνHω¦€"©izŸ˜ΔΈGrQeaƒ°Α“ΜςρΏmIΥύMΗ1χΨχœ˜Ή•7hm/ι’$’Ξjυ's+Ωτ{$τηέτ}$ԌN?kιGg΅ΙUͺφ/ΣmCyκ’φ‰“AwΧBCΕwζ5#šΧεD―|β<„»ρΥΏ―Ycς#½CΑ.WƒΜFW4οΎmp'θGˆδΌΠƒz=  †­ό“³φϊBξYΎ˜[ˆ΅ EΰœΪΙAb½R-η^ΎΚBŠ“JŠΟ‘Ν'ΌΑ‘=M“Ν>­” ―ͺΤώo*Š.~…#σ Ζ8k˜Š”[ PTε#…@—ζw£2όί\’OΠΜ-―h¦7ΰˆ{P" ΧΎ₯ε*Š«q£¨?Ρ ~Iͺww\σ—h΅Κ|i™JΕw£Ιƒw£”s•W…jνuΆœΟ>-t7 x7B+c Idμω(u:`ΓΨ‚Έ:+m»2^'Ύ}“"λ[™Πχ’Θϊvo€φWd}s Ίd'ο ‹•<< ―$αc^nHΪ5Iϋ3IϋkI{U^‘΄/ΙmTz@τ‹€ύΧGQ^©ξ&jg’VΫpxGηbBED¬[‰.ψι1qy žuT•ί°¨[dƒ*‰φzχ8(‡ηŸΟJεωξΞ?½7•€εl9W¬ΒlžŽ&LΏ¨8±Ο’mTW{oDΦΝDœπap²οΟuIϋGI{½W§γ>Hιιƒc‘€’‰^™‚_Iο>o©žy ·θteμ¨χ™ΘΤκνθΓ•iΨ9&·Γή>¬ Y|%"ϊD°,ΎΙηžW抯SsIνŸπΨrp€ŸχΤ:"“εΏΞ€Η•πb)"ϋχΘ„κx ψj#Ζ睞ƒ]xƒ΄μ’½q–±”†Γ] CΌΏό‚t{{A$+iΗk΅H: CMakeCacheCMakeCache.txtsource.cmakecache# This is the CMakeCache file. identifier[a-zA-Z0-9\-_:\\/ .]+ΕxΪ­TmOΫ0NZ`C›¦νΓ4i$€NSΩd—}\₯ ρ7 ΞQ,;ΨoβΗ“R_q¬*Ώ½¦dμτ°Xƒ§MXϋ)ΝWGΐξΨαϋ—±|še“~ό‡ς~£ΉΆi`†|Ύ‚aΊtE+[½γεd|χ(U»²ΰ²,qe?Ρu„ψOΖ―§]ΏΦ¦ΰΊΖ…`经bΈώ†ΕΗ]Xg€šρF]6Ϊaζ¬υ¦­:gΧχlw©ώW`$΄o Ÿ΄B‡flΎν ^\υ°­ψέΨXqOο’ΧG CMakeCommandscommands.builtin.cmake-+xΪν}u|ΗΆΏ}KiSJ›¦Ζ&i“&4½πnymλFΦͺ+)±ον{ϋdyγθF’UAΫάΗόξcfffffϊ=fff†ί,ΝΞΜΞ~gάXφnͺό£φγο=gζΜ™3τζΙ οί½ώΟΔΑzg΅c·λ͎}jy‚'Αœ1›‰ϋ$Κθ Αού2Eέ†PTΰν5’ξ@¨3!κN„:’ξB¨s!j BQw#Τ³!κ„Ί’Ά"ΤsΛ‚σd’F½°Šάx?BQ^ uΠƒE΄ ‘¨ƒB(κ ‡Š:h;BQ=‚PΤA;Š:θQΰ jΗ«)κ ΗŠ:θ „’w"uΠ.„’ڍPΤA{Š:h/BQνC(κ ύEt8ˆβ `u†:θBQF(κ #Eυz‘¨ƒŽ"uΠ1„’:ŽPΤAO!uΠΣEt8ˆ~βIΐκ,uΠ3Et ‘¨ƒN#uΠBQνΟ uΠY„’:‡PΤAηŠ:θY„’ΊD•°:GτF„’zBQ½‘¨ƒή‚PΤAοPτߊPΤAΟ#uP‘¨ƒ."uP8ˆͺ5 X§2Š:h‘¨ƒfŠ:h‘¨ƒ Eτ6„’–Έ„PΤAE„’šG(κ phVΟR•Š:θ„’²Š:¨‚PΤAU„’ͺ!uΠe„’φΊ‚PΤA E΄DY½°Ί@τ„’z‘¨ƒή‘¨ƒή ‘¨ƒl„’zo„’ͺ#uΠBQ«6Š:h8ˆ‚ΐκ9κ «E΄‚PΤAΧŠ:¨‰PΤAοD(κ λEΤB(κ 6BQuŠΪ~5ψ•T¨΅ΊΙNŒfA/%‹›Šͺ =„’Nμ#Uk€PΤ‰C„’N|‘¨_A(κΔWŠ:ρ0*5Δ»ˆΪα}ˆšα}ˆZαύˆαύˆΪΰˆšΰˆ6γ ڊ?8ΉS |H2£hͺψ‘D½ςaD½ςαDuϊ’^ωH’^y7Q―|Q―|4Q―| Q―|l²WθΗ}\2£h~ψρD½ς D½ς‰D½ςIDd’^ω’^ωT’^ω4’^ωt’^ωŒd―P½?3™Q4)ό,’^ωl’^ω’^ω\’^ω<’_χωD½ςD½ς…D½ςED½ςΕΙ^‘*}I2£h&ψ₯D½ςeD½ςεD½ςD½ς•D½ςUDMπΥD½ς5D½ς΅D½ςuΙ^‘Ύ>™Q4ύϋ’^ωF’^ω&’^ωf’^ω’^ωV’^ω6’vϊv’^ω’^ωΞd―PFί•Μ(šσ}7Q―|Q―|/Q―|Q―|?Q―όQ―ό Q―όQcώ0Q―όH²W(ζG“E½ κ• κ•Ÿ κ•Ÿ κ•Ÿ κ•Ÿ κ•Ÿ κ•Ÿ κ•Ÿ jρŸ~ΓEWΫ„ύ…ΰχ.ϊΧώ ή„ώΑoΈV_^Ά«νn³εΨ«έAs΅Σ?Qο­τCό/Ώ²ψa°ΪvΙΪυΞ2₯ΰwGN΄Xqϊ—ƒίν zΩΉΪμ4γŠόJπϋ‡ν:e§Σh:<ψWƒί‡°σͺΣκK-‡ƒώZπϋ m5—zυή χλωύαr³η4«ψ7?ΊΰΣηΏώ7ƒίp±±>|Υξ―{ Η–sύ­ΰ7\¦]6[ΛR7όvπϋ‡μΤΫό·Nπ.Μ5ΪυλŽ}m΅?°ϋ7ϊ§m7;WW{νΊλŽςwƒίe›x=lΫ=η₯!ω^§ί ~ŸΰHΊυ^ί± nΨv:ή‹Ώόnγ)V[Νo˜?άέXν\m {Ž}΅)ΈϋEΕ{N}ΰxΞ Œίj ~ϊ#‘…4<°gRχΗBkφqTϋ'’Ζφe§W_α‘όξη N»;Έa/5;€&4—?“Κh;νΖ5§qƒώy𻋃ΣΠήλ’χΞ_" vμ~£Χμς6όK© ϋ-ΗιrΈΏ’γάΖαώZl>nΈΤnςΐΏz‚ŒυΕΏ•ςv—Iγΰ€—l­ΦωΦπχBkπβi½½ΥΣπžϊλtά0e·κ•‘ΨώQπj€uΥhvV8θ? ΊΊΠU`₯Wosΐε{‘SΆατy·Kπ»•b»«‚sώ5ψέΗAΒ¨š΅-ψ χφΔ:οΏΏχS@g9ήΕCψl% ι)vλλ’ΝK&·[\γP-e'1χˆΐΦΰΊύJ―ή΅‡MψΏΒΰKΖO;‚²fτBlsα44ΘIΒmg,‰kPw¨πς‚Υ ΛΙδ$―½K"εύ†Έ›γ›+BNtΫ$ŸŸΈD~ζ Ηί>Ι'ήν’Rτχf§Ρ.Gγ­Ψ"ο π{Όσκΐιuκ-»έ'rήIh9²»ΘzΞΚ°Uοςnτ+qPέ"l%lvHΰk΅8Μέ“|`$ρωžI>>‡Θ Eςΰ­“|ΑΎιyμ½γV³s=Ρ‚χMςαΚϋQ„ή?ΙwΨ@όΐ$Λݘk7κd8γ` Τ‡I²€mπφΰΩ4ϊ!Ao―ΧΙΗΩ‡{΄λ½λv½oΧ—_wB΄]ψΘΆEA›41ν˜δc°ŸΈsGH˜m­έα€ff’φς˜ XΦ°΄'˜ΑκΰFΧ‘[β&ωρϋ₯Ψ]~œί)Έ2Δ p—π‘=§MR$²{’‘>$q±'Ζq0μρ¦Ϋ+pμ;$Iu“Dy–ΊOs}YΤΫϊ~‘φ“βہI~,νσA΄Ÿ$ΰ ΰ~,ŽŠ‡ŠΗY IEžδGΕ~“Ψ(6Η8"~©―όJouΘ7‰'Οτ=1‘9*tJώ$ΌrΗ„ΦμCyΜq!Lφ §ΓIMθ©€l—œμ*™PtŸ§yZgΩΜϋ„\;ՐuR ύ…₯‘ΗκSΒ@ΚRΘ>ζt€ίΓγΙ0šΰ™l8‚ƒ¦T~β‘g„ΐ3 }/`ΝαΞ νΒΕ‘9 ‡9`ΒέγΓN_(\œBώΜaΙπ²"‘•μ:~VψŠα Ωj’Ι›τ‚ΝΌL,ο₯χAάζΏω91EΏR4ψQεBΌ}₯ηvΦXκό¦φζΰ7<”πŒυ“W‡†7ή4H†pΛGƒ?ό€8Π3 ήΏ°fuτ­oyρ豉ˆ.’εŽΖβ‘ο?ά?„Y¦&δd L²€P›ΓXB·vέΟz₯Ž“}ΗϋΒ“$π;ώΙ%g₯Ω Ύ4IΥ_œ˜H‡ΝξSΩl³Ό=;N½}2%6»3;6»#-6Ϋ’›έ™›έ“›έ•›έ››m™LJΏ6‘7>7ޝ–¦Ώ-;6»'-6{8;6ۚ›=’›έ››=š›έ—›TΩl³|";N½?-Nέ•›=›νɎΝL‹ΝφeΗfΫb³Ω±ΩΓι›;ύϊDJάx8;nܞ–¦dvlφHZlv,;6Ϋ‘›=•›=š›ΘŽΝK‹ΝžSΩl³<•§>ž§NeΗf;Σb³³Ω±Ω΄Ψμ|vlΆ;-6»›νIίάι7&RβΖ7eǍ{Στί’›νK‹Νޚ›νO‹Νrٱف΄Ψ,Ÿ›L‹ΝL•Ν6[Α™μ8υPZœ:—›N‹Νή–›I‹ΝŠΩ±Ω“i±Y);6;šΎΉΣoN€Δ/dǍΗτ+Ω±Ωρ΄Ψ¬–›=•›]Ɏ͞N‹Ν³c³i±™£²Ωf+ψbvœz2-N}―μΨμ™΄Ψμ½³c³Si±ΩRvlv:-6[Ύͦ7wϊ­‰”Έq%;n<“–¦ί̎ΝΞ¦ΕfΧ³c³si±Y;;6;Ÿ›­fΗfΟ¦Εf’²Ωf+ψ΄+ΨΟN«»–V7̎͞K‹Ν^ɎΝޘ›έȎΝή”Ύ‰ΚoO€Δο›7ώNZlφώΩ±Ωο¦Εf˜›ύ^ZlφΑΩ±ΩοO€N₯_J‹?,;nόƒ΄Ψμ#²c³?L‹Νޝ›ύQZlφΡΩ±Ω§Εf››ύIZlφ™*›mΆ‚Ÿ§ώiZœϊIٱٟ₯ΕfŸ’›ύyZlφiΩ±Ω_€ΕfŸ‘›ύεDκTϊε΄Έρ³³γΖΏJ‹Ν>7;6ϋλ΄Ψμσ³c³ΏI‹ΝΎ0;6ϋΫ΄Ψμ‹³c³ΏK‹ΝΎ^e³ΝVπΛ²γΤΏO‹SΏ";6ϋ‡΄Ψμ«²c³L‹ΝΎ&;6ϋ§΄Ψμλ²c³žHJΏ’7~cvάψ/i±Ω7gΗfš›}kvlφoi±Ω·gΗfž›}gvlφi±ΩͺlΆΩ ~OvœϊŸiqκχeΗf•›ύ@vlφίi±ΩeΗf“›ύHvlφΏ©SιWΣβΖώ/-6ϋΙμΨl"-§(~:;6›L‹Ν~6;6{CZlφσΩ±Ωm―ε΄Ξ€ΐδ‘I‘ΦΎύήXm·λe’Ρ°ΩPΔLΠ#τ/ˆ<μθzoeΨv:ƒΎΪε“ ^;=i±_>Vόβ’Y«–kΥ—BΨήΰχεz―Y_j9sλD²Σ;ιCI·Q^[)―Ό9?Ÿ+MGΜφ%3 °1n[(·œ5[‰XνNfεc|¦|ζs…’=m”΄QΚ/F,&³hΐ7ϋ ŠΦ7Ψ·ϋ)·‹‹eΛœε« ΓƒΙ #xŒηvΚ³0_.ς…ͺSυX2g‘(Ζʊi]*”fνι‚e䫦ΕXψx²€•’]₯ͺv»"Xμ±™BΡΠυ˜‹q»—r»lXsΥΒ|Δn2»γυΗ\Ω΅·Vτ‘1^G(―ZΕ¨ΨUÚ/”rΕ}A³…²ϋS,TάVφ΅86α3š2nΰ³ͺ€“zaΖ‡ΖxέGy•-ΓΎX++HfGΡΐ‰.¦X(]rbέΈlVͺ’Š Gp–ηΖ [Ωaᨋ‘κ»@,G< €?Τf-wπΪ&8Σ#š±%Ζω1±% Α+pBΩ¬pœŠμ[1kVήΠkcvγϋμΖ&Ž+ν.6έυ¬BιΜTδ•= 7ΉHΠFηsy³²@ΒmišMŽ d‘‰–±/Φ¦ {Ζ2ηm.€‚DK$½•δd¦U5¦΅zkcςlΡΌΘvS0&ϋΠ―»™ρ’«hωΗCnς8Ω R%!-―e μY™ΛY†^κζC―y2Φ°Νπς‘ή.£˜Y+]*™WJZ13ΐfͺ•3“ε‹o##΄ήdΩƒŽ¦Ηx’|ΈP"θL.ohεΓ½ρ}«q°}nΜΧάΑ~MTΆ(εζ ­²… qξόΓ­4S˜­Y$„™%¦Ω=‰˜²$›υފ™Ννl{Ω&χŒV>ΒQŒtΞύ εE&?n<³ωΦ}8™#Kp«{φΆ ina•ZQΟώ>Œ/Τ Ά_ΡΒCnΌΕ9DQŒL+\»ή—¬y€YαΚm&WΝmΓ²L+βx(™#ƒΏΥΫΰ–ΡΩ?ͺ qαT…d±$βRΡδR\JΖ-.Έ˜l‰p1‹h©’\«Μiω.hS6ΛZΪά&η;χ2γWyΡ,΅ςυ ζηF%Ÿ+φ 5³ΚΦaΐxΘQ€ϊ<―&ˆ‘Ο+t$mŠT€ »R]Τ¬!p›[/T­œ](y©΄ž­Y 0‹›©•ς|BZEήδͺ@ΤR„=h)ς•…υ\Ξ]¦}οL17«7υ‘' vΌω\–齡ω‹†ε§z†£KΝξJΞ*‘©MEk©Y Ά΅ŒjΝ*Ω—sŚžmY‚ίG£v•+œaηηs— 1»z΄8έΖχΰ-£ξΑ~•_―ͺηAG ’ΜΞ, Sω} {)Ληπ£j[μΌ₯ΐv[8o)Hzν-JοJ8ρ*ζ.Ŋ/zλΔ¬υk½·βs[ϊ[q€Y±τ|η!Α¬ŒS ΜΚp―ͺT­Β΄ζ8βAAμŠίZ±?ΐn±όpKΚό·‰ΊΩ^hМS0€s { œ9 P/η,²„`ν’q™e ͺγ< X!sͺ]4sz»•(d™•όœα.ωΩ©ω›σZY¦@τ­TΝ²]-Μλ­&Qτ†ίicƝ9δΝ»!πe ΖQ5Υ’Z,©hΨdς–7*­Z,ƒίˆΆrΛ― Eν•Tdς—΄Ϊ«‡ά ρ7υ½θnΉ5I`―κΥB<$ͺͺІfUΕE‚uΘ­E1Π‚"Δ+ΉNΕάβΈzψ Ξ$# σӹʜ]+σƒ2А%λΰ,Μ.– ­uπΥΖχ„q^?ΞλΗyύ8―ίΤΌ~\ΫAΩήzΦ£S=Voj&}³ΫΈξ-Ψω^yΎω=ΉQ\“μ:q-ωŒΝz5goݍ8Z»L\ :υ“³ Ή‹μΖtκ'ƒq+Ÿs!;Ξφ(j <›g– «Ί¨y6ΟΓέs†Uΰ6˜Γݝ$³ ƌ=mζ5O’Q8Πr¦V, ,–½Ι{Ί#―ω+Žl^ Α―«ϊΝϊtχΟη―­ 4·NeξΦΦλ»«~#Ο{Ί)ΈYΣ;ο`A ρ·―­…4άώ’Ήœ—ΑH˜ƒΉO"x‘δ*Αί p !TΧ‚/γ™RZBΚυ~Α ښFpΠ³ΙBΚzX©ͺ¬b›Π£™ΣΑ< “΅y½ω­@j dd$ ΡΖΞl‡γ)O5ΚΉƒΠΏζ§Οiυ/‚1¨2—;­ƒ\ Ύ}ejκ¬ξν+ͺΰuξΌ6―sη1―3΄υ"PΜλάι)]^ Zƒ+Μζ,ΆkfΛl&ςc­¦δ'±›ΐ³œŠŸΜv?Ξz*~2ϋέΗε0•jnΎ¬·ώ’AͺUσZύ‰ΰb\vQ.d:i[$μΡ ¦άδξt2λ$☼έLQ1‹—ΙZ‹w‹n‘ΐ)”X$PΗ$ξμTyΨ―€/5š;»g)‹…|Υ«ά²de˘),h͝ΦάάVvΔ5rš{“,ˆ³΅œ₯—iyΘQήE+x`½φ ΗnΟφJΊ9g΄g;’Μ$g‘YI2ΦPηI€§έΔEχΖ‚cθŒi‘ωŸΦκCΡLǜ/»CΆξώ=k[%^Jp\‹wΒ½‘5ηω3ώΐšσσύΗ|ξέωΜ>{sTντ€λτgΦ½se“‚%ΏzΧ²τΖο©Ύ‚ωΗdDξ ½ŒΘE‚@Κš7yΘφΜm'»R›™),hqp%―ΉŠ’G{ϋLR6žΙΉΡŸz‘½}< Ψ#S ηFιrΑ2K‚œ)(GNVΏΦCΈi™Ε! 'ɐϭE¦ΒžγΜ&s™ΝΈv7žŽG§ρμpCΗ1tCΗ1tCΗ1t3bθΖή[»‰οM­~₯¨VG‚W‘$Ϋ΅ΊΎρώΎg΄6ٍΒZ{›€'‚˜·Uͺzo«,TAΝΞb_ΡΫQ`Α·ρέ|7zAΝ8άΪU3ΑθL{Ίή™‰w”ΝZΉyέe.Ώεν"lώ~κΓJ–ΆxOυ&δ•γ·^Λ[λ{jl½^.XΏž²ήo ¬χ+QόδΣρSv—ήV~„Σά`ΗοΌώ2TΌb™›©²L@ίφ ^4fLK/ϊPS½y“^Lυ ›ό–sΉQΜ],£¬iΆVΠ»#Τ’YΜUέMΧz2ίκύό Φw£ΊAόζo]4 φwki`7F±E-n?ρ/Σ;βcΡΘD2YΓ}ͺCod Ρ(.y7ˆιΕ%Š^6΄ —έƒΥβΉ<τ²!G‚j•΅‹ΕB>ΖΥ*Y ΈΫFΜQαn›„,u4w,ζπΘcαύ$žτŠ–ΗxxWF°HσŒ=ςsΫ™άjf™d~ΘN,Ž‘hΔ)φλzKπ'@ϋu)…ηΚ₯Bymœ] PΥ n“«μγšqψXΈ)$ •DΝz”Ε’›;·~Ο.fηΪnΒθΦJ*ΊFΌΙOW¬‹ΗΖzkλύˆ˜Ϊ¬ρ‘±ΥλꁽΘλΛΞpEΛλΔΠΥξ ΩnΎΛY֊‘ ’ʊΣqzυ–VT °›|ά&JhύΧ΄Z ^³š/\½ω«LοacW‘Ψ ƒ…¬$±ΎO±―ο•Sλχ¬ ›”¦5σhyRP64'¬>]λΰί‡Wΰͺ8θZ‡―XςPΉͺζK 0Σ΅2™IεΈkU+9GTπzχ‰έλ<,Ί¨Œ+) ‹Κ„‚Β&ŒΫδ¦ν+…κ\μΦφcΘ<ш{ζ#bΤπŸY#σ+½6£Ϊδ,&ZP T΅ωEf° Θθ|Ε„π5α SΥv»ήYξŸ\6[ƒfΗη%ΣόΛ&œ‚}kσΨ‹Kυεe›0κ6[ŽνŽμ«~άύa·»ΪPӝ”P1φc›λς„μίq†ύΑjΫΎ)ή‚ε*pD Ίœ'i0 -ΒΔ·Š!|…όγδ?“Ώμ\mvš‚Ž ι …Bφ—p²“Θξ:e§Σh:ύψό2AxD’ώ]œτ1ιΞ«Nc8p{IΌHeG Ι\—₯#Ι­ζR―ή»ο€b΄Bζc [χ‡KΛ͞Σ¬²‚‘­Y…τ“²(I8ύA<‘Ju‘ iӜ΄]Ό΄α«vuΨk8Άδ{ŸJ”,!ShρvN‹G8-άΨΈ+‡’Δsx…ά—8ΉIδvHȏΧB„Ί`…Δχα$ζ$z”φ΅ΥώΐξίθœΆέμ\]ν΅λˆψ21% ½B―χγτΪ#Ρ«M"U{ΨΆ{ΞKCβΦεψFΟ…DB…&ΐi²[’ ˆϋŽMΗύψγ" Št =>ˆΣc»LΥV³q#Ύι IΌWHύPi««Ν•aΟ±―6΅"-O όα¨τœϊΐρβIΠ΅[M6 %·)‘B“1Ώα±ςΊ›FΜgΠ ™ΖvŸ 5¦ΖΨ.P(d ςyΐιeRaYΡς9G όρœδCΙN»;Έa/5;dΨ”g°rr…VŸ¨΄GΫi79λΪφ ’?™“ΌW"™΄gš4Ίͺ6A…₯B—OYHΐqΨ±ϋ^³;ΠΘBD…τOWφΑ~ΛqΊΪ}ΠC+d~–Z&ΙΣϊ2]΄Bζη (οs.΅›(ΟΐR?δ>>Λۏejδy_ όΞaw™„jνοτα ©_€!΅΅Z_^ƒTϊ₯ –{3.2χV»NopC#–  Ω_d;wΒc·κ•!Μe  Ω_ βfΐΙ5b³³’7y…δ―~v§zυVHυDΓΟ,\!υk‘­½ ¦ηΆ†ΣΧ™  ΩίΐΙΎ_νrŽW!%"½Η’Ύ‰“tP")œΦ&¦°x)΅B§oαtΊ—Σ‰ΟMw& ΧΘHΏ“²MYΰ}Ι’¬Bήw€VμρˆB‘zΥ†οVIνΦΧΉp₯p…ΤοUΩΆ[\Σ΅­‹UΘϋ~εWjGϊƒHjkpέ~₯WοΪΓ¦ŽTϊÜTΎRJͺŒv0Œ A‰•8‘Bƒγ4ΨΣ€fβ-N -β„ M~B‘‰Ϋ-έ²‰WŒ^νyΉ¦&qB…&?Ϊ‚Λ0n‰ƒHΎζχ 'u_LjP(sΏF’Α3H©B›Ÿγ΄ΩΣΖ/ƒK9ލ:pη(…*ΎΗΝΝσβ…°4 ωw4;Φp9ͺ[rγh’ $T ξβt8 ΥΑy•,5uκ-»έ'_φNΒ9ώTv’*qb…FwkhΤsV†­z0οφH†Δ%•Ε‰mε4z@ЈΜνZ­ψξ‰x©ΕΡκΟqΆH!QkŽ 'χ1©ά`€ΣYΥIβ€?*•ξχmόY PΘήΎΌΥμ\—wΑΔ/IwpwΔ₯ϋ©'ϋ0”M ’η$ί+Hfηό;“ε)gϋ;9)|}Α@ۍ:)‡iΤ"°Bβn0ΊϊLΔœƒX¦ΦϊΝ^ΰG/_’T,ύΘ($ον·]ο]·λ}»Ύόr½Σ`WJžL–Ν“(€­¨Ν%ξ;“%*sφ# ·I η&%‰8@*dεdρσi‚Ζ|Ϊ*$η$ρλK«ΓAw8 +UbΜO\_’)τxX76ΰ'ZWot†“ΕWV_ψӚFW§šΛ 2Oƒrag^ϋU"•σ3  υœ6YΡhC>P!ι'ι ‰$ωfcXκφƒ< Ώu0μu΄ΎΥ*$½|kίq7E €‹±‰ί'RhπfNƒ}‚’I)7n?“¬‡œT‘Ν{€‘ΏΆyd_Φτ<'υ`L*3μKΝ0…”H VθtD~l^ΨԊ€R:…§ΗΈdv(7ΚSP L‘Ε,§_Qλ7Isη·’μKbς ¨ϊώ\ι­»:퐁+€^q§?θqk ‰qΗ*$Νs’ψάΞίNT¬urtž@!Ή FfŸQ_cd Y'‹Ÿwύ ά¦)QηέΙΔ ͺœF{‘FW:@΄Φΐ(Ί\ζtΩƒt‰m}=‘©ŠήξΧ΅Ÿ`ρH姡אޑφSςDZε§5Ξ§ίŒ,GΙ΄ϊiMtgΧ6§ΗΞD=τχIK¨:Τ9φΛt °°υ]sκΛON)4‰Σ*τi€8πτγΏNε ’―r’ωYΗ€€\ΑwhΜ:΄Bζ5»].½aG#vH…¬wr²ξγd ;}vϊ$IN!§ΕΙαk ΓΎc“BΙJ‹Μ:ΙL»QkI; ύ ΝVsp#hν‡'PHξq’ω•‚πTF8ηξk¬ΔhςΰΛ)―WκƒΖ5/η ’_ζ$σsηWzn‚Θ/}'Ν#°Bβ«‘°[ζŠNζzΆ’‘Σ»ΒΙC’Lξ–tNΫΩ„NΡ©8c‘liŠs―5·6š§η―δ¬wυΒΎdf=;\«Ξ™–cŠžζHΐuv£4m–eκ=kΑΑiΣ™\5W™‚Σ¦ ^sSΆŒόZΉ‘ψρEy#‹{ΜΣΓΉl-7kθ]bHΡ Ή§o9oοKζ`Χr>’ύ—dΑwŒ[ΗXZϊYt~ΈV*,ΨΑ™`­σΓ,xόΰJ‘4m^©ΔYƒΗšMΞ@’Q-Έ[Ά`θ]Α7ώ ΆΚ³‘ρ…Νγ ›γΆΊω›]Ά ΌμJΥβ’Κ#*–Ε(―ǎρdε 66'ΰΆ“ί݁;('˘­s–νN͍ Ÿ~?•Μ6N†βͺeh^ΚL€ Š·ΧμE-DΌ³fcόuŠυΧzέ΅Ύ·±άΚΕ\^—›‡αZ'οZJ-NŒLήίΉaΏ‚™,CX_‹ζήΆΌYΚητ24 Ύ²jΝ+μ%pΰ+,δV#Κλrσ°ΰ;oώφ½(OΤ.ŠΩΘ“)΄\PΦjΉTΏf’±` ό@υ‹ΑΓηΐηΛ9K―ύXΧΙΘRъj.h5kΉͺf °ΐΖ 5v"|ΰ!Aτ(™Uˆ!Τ^]3ΨΗƒΨjΆœη6Ρv"Ϋ#J &pŽξ¦œŸ>§u7%Α‘σζr§υnΜ#@4kœΛMMΥ›5zP―sη΅y;yΉ ­b^ηNOις"PΠv]a6g±ύX3[f3‘k5%?‰έ~œεTόdΆψqΦSρ“ُy˜₯’/τfq‘πšz>{Cσšϊ t{žΏξθφΌβšw£’Ο• ϋ…šYΥ| •£mΩ"εASο  |›+–ηrΩϊπmF·£zνŠΑ>uH₯ ‡~v/&¦ω²–Ÿ)DΰZUο‘[‚χizOwζνΒ΄Qͺf μ8 ξӌQ_Σ},§&{,'² χΔq™Λ―)zd;Χ³BQΟ2aΠscyπ-Ώβ1κg3Ψz₯aZά+/°^ιƒ7ω6ί¨—x7άΞθφŠFuο!½ΊŠ…qzονh>ΖιaΗ–½u,{ΗλΠ²‚f7υίΖxιNΦKλτμίzZaά/GΪ/Η^J©—ξz½FΟhnζ=!&ͺζf <κν£DE«Ψ&h»‹ηK nϋ―5r«˜§2$Δγθ0Žγ¬ulΩ[Α²άΥGQ”Ο{ε₯™bnVο±Qv4š΅jΉV΅γ―άƒ °·ΏMοyβγφhd²ΊV(Άχ}Axυi`‰88Iΰ 1’QιIΕ¨$‹„ή‘7Λ‹6&¬khΰ?ŠΟΥΰ›pž€±8Y%…άœ5m[dν«`±Υ_dρ8]LΚγ‘”…$η$#£ŒIz"’T›Ξ!QΟQRR?εmc‘j”„ׁΡF z˜|³Œσ“ΨL€χΓΌ}d̏* #ηΎ1ρrΛθγεΖΔ 1)‰Ρω”Z’*J2βv|‰ΌaΥJΙ6ސЁ•Œœ5«·gΓn|ϋO:cy“;ͺ£Hζni)Uν 7τf‚,Αψ\ΩXΪkΨηΌN;ώ’4&ŒΞComma Separated Valuescsvtsvtext.csvfield_separator (?:[,;|\t])record_separator(?:$\n?)xΪ΅U]oΣ0m±±–"ρ<0@΄X¬νΣκaeΙν°XμΜq€Iϋρ8‰―λ‡mυΛMrOΞΉΎ>7™ š5ΦρuΜ8‹ΦΣ³θ# ΪΛƒšoPA7j±A…έ¨ε5Τq_Η(ΚbΚ0»§γΙ2ӏt|¦cΚΛΛkˆnJ.!UPAΩ8›­ƒ#ΠΚΞ1ϋΨ—]`φΠ—]bφΘiCΞ$0Y κXΗ-‘€„ ΅ΘcK.π…Ÿ¨‘9ύ³{:vΚΞ—\ήζ€€':NS„Ξσ dLjέg$)~bIE™η\HRqƒΐ₯5φ tnzθΝ+½‰£·.Y")g;\ؚκό”™$¬Μ@ΠdGšK[σάώR^ <‡Ϊ χΡ΄WΧ;γNƒ„ί²ͺΟΞmW±φάδs‘ξ.ω:υJ"Ψ½DΈ{‰αH„.cΛοzΰ(3ήτ•΄ίͺ}9]}žΞΏΌtw!ΏΞξΤυt•Ώ™]°Υlζ7y§ϋG†Σ"ΑR^yΆ‘¦ £¬ϊˆζγxψxCˆšφxθΜίI]έ”ΐxΘ™°Ώ9v_O<ώzβ{βϊκψόΩλc‰7ίΆZ{΄mΜzΪςX§―ώm/π½Cabalcabal source.cabal$xΪ΅TmoΣ0nJ/π!!$-ŽΆTΐΔί )‘›\Ϋ¨‰ωE£(?'΅ΗΝ`Σ΄ϋΠKsΎ»ηž{œ“ΡΑžjJβg$>_ϊ6pζœρ΄?Ρ>nβ&:ΦώQε3aΒ΄Ÿho§šwOLŒ¦2‡˜ΰΜ‘‡NoƒεL{ψ]RixHεa‚W8u‡½±5€wͺ~ω—ο’‹ˆmhlŠΧ˜άζ·n:ΉEΣƞkο/Ύ~Άœ•ΏψX)o:ΏΦ~ϋ+ʐ–ΐ° ,άbΎƒΦ‘Π)π¬έTQ¨δ£Μk.ώ‘ZϋaQ’YΦ?J=ρ§sτe©τ…C―§¦ΒΛvxΚπτ§Έιω \Ÿ CoffeeScriptcoffeeCakefile coffee.erbcson source.coffee ^#!.*\bcoffeeΣ xΪέZλrΫΖ¦$;7qνΨ½%φX6% LX–\§QLΡvc·κ$VǞL:εR ,ɍΑ]S΄V} ΎC_ ?ϋ}ˆώκΩ—€HeδN' K€gϞλ·η,t΅’ό\KΗͺMέwYάρπώAΜ"μξ‡Q@ho½W™όωlb‘|ζΩbŠΓΊ]ŒΗSρ£‰)›Π1Νb9Ν}E³TN³‘hΞ•Σl*šσε4Ν{ε4ΏU4ο—Σ>LξωζηrlςΦΟ–©€XNG‡IηF–Σ·ΫY8tl?SxIΙ.<§{Sq»,ΗβΐQS-_Vς8oˆΕΌeΤ :žiΌjρBμΘ1[.g7]πKΏk….ογ»Μ)πω„\*ξάΉσnΌk]˜εΒ. {λΦ» Ρ₯,D­wiΕ9:ρ£,©χύO6Gσ¨–‚ΊΥρ˜σz–i”™«ΥͺΡάj-£¨]CԜi¨Υ“ ₯dΠ­€vΗhXS¬V2Ο²ΐξa+‚6₯,²S^‚GβιbS·Έ‡ύYω 4Ύw΄yά"ƒή¨}΄~χΑρ$(ωηkfΉ«v9Ω–Ϊƒ,; IJƒΈ„ΑdA†WyIί+’Τh‘6:n£°ΦΪj΄gϋζWιψ†,p-ζγΐγž„WJΌXςό“’η•<Ώ\‚ΏP]D2ΏFƒσΒYA«¬d4[+ζɞ»4ŽΘb^yG¨/§ΐ‘ζΩI₯@™…^*Q\%ΔDA'(YΘa„^Ÿ(ΫΔμΩ›\m.ίtpΠωσUζ–ξYΔ>Ί‰iTM«–D/’MEyCpPlAMάΑA]H*ΝΒ‚¦ΠΒδ₯ΉδVk<6–]ϋ€ώΧ}΄τ6›z¬gpΗ"(Mmw[ͺ˜;Ψ2CΛD¨’£™>=EyXζΜ…ΚiBZ|iζ©θΘhνf»ΦD¦ m΄υφΆ©ΓΔ=B₯‹3ψKY/–ψχ–nh’±5‹%h;±Εjs–¦U‘x*¬hΈΕ²„Ϋk¦RΗƒM.οišμs,(Uη³²m –-Ρ#ΫπcίgA”ͺΛšςόμΐ`b§8UΥ}v2,ςώ(ΑΉ ώs°W5e γLqNde’œ―YΥΠΡώ*“‰‚΄2kCœ(+›j*θΤBaγ^mνθΈΩ嚭=„ΪχZ€7H \A’ ψzύ‹Ά9W =ςο™'Ν ΛΛ¨#\ΪHXi›ρ0<‰ˆΗ=Ζ|ξ2B4€₯)6€ΐA:7¬m™¨£ό₯3B°€yΣ*ώ{RE›Ί Ξ‚ΏΙWωmŽφ8ͺqt¨n6QΪ69ZCkpαγo$Οn6ψ£ί†«`fΫb|΄ΝρmΰwΨYΘ2e69‚_Ώβ²k4Έ, σ^ƒ―6€9όΥόΆδƒφΰnΒφ rΑ€€›άΕl\<<Έ°xΏ4βΠRq€NδΜ3£YΘΩηOΚ>i‘•ύ6l ­€6fMμu`ό­-Σ0ΆLn4Z{Π¬‡π2¬lˆMAe4xέά6Ν,?Υ7Ά\Γ”ζάRIΞ͞zN›q£°T[©ΠΜPc{1>―M›a§±™VǘΧ@!ίƒΒ ΅ΠΈͺΩy™φrkgΛ•ΑΔϋΜΘdd Θ±ΩΘΉR>‘I8νί-εaω½˜ΒλnM Αf \&»<­ΜY,© ΐ…$Yβ·¬VωS*•ιΈ'„vεΑBsqΫχ!){8β> αΓ#Ο)•¦•iΞΔη&(TIӜ¦Λ₯*m“΄?PXaΞ(α0Ε;Kγœ^Ν6²΄νσlΪ‹ΕZΖΒψ-ζ°›ηΌd|•ΎG`AΨδ/χBSX¨ HAςmζPΟ ‡DxλyΐήBwς ƒΡ]p“Τ `)JόHΙ!=xt†Ya&žΆΜ?tΛRaά Ήν°δ‡†ψ8-/ς m&"ΦC.)‘υƒϋΌ -–„±ώΘ‡A€όέ_—W_\7 ωXϋ^΄‹3DΞΕ’rΝπβ8‰₯εšP|PgΒΥF€nΣ&ψR7AΎYΟEλ^`±}Ό°_˜!ιν©ΌœL‹pmΌKνPΩιΔ2Π¦&Aι”ΣeΜΫμΕψ—ϊ+‡|אζ—έ€ηEΖΌTEz·΅ΜΕΫ=}?—uΤ·d@ΔIboƒ}‚`–ξ:M R„ΉΣ|TaŒŽ8:Φρ[²κΐ{ °Lx£¦™'L—αXnΤβHΌVΣ=”γΔvpς›κ³~EV)h'ΪΓ?dqΥνŠΨQu£Υa‡mή}aΧ»OκΟΫkΠƒ‹Ϋ6œίZΙ(Hqk ΥΫMuolŸY|¦ŽsΊcϋωί‘έ‘㇕yM§<œ?Γ€SmCœm―εΞΆη8‘(;œ=UςΏl2Ϋ“CpuInfocpuinfosource.cpuinfo¦xΪ…PK‚0mΑθΞ½]FΐΖƒ¨«m”Φ”Vβν%:%u‚α%ΝK:ο3™˜|1ͺ†I%Θ/Γ΄΅ΜX?¦ΐ3ΰΠΗd4πSΘΐ^‚z–ΐ­v¦ζyύpR]t¨ψpW1%/’Έh\&‡²8mΣc—ύKς,MφM±I‡άP”pγ―N›s­ΰΖχνϊ_l\ϋΝ¬‘κŠτOvwόsπ7φχ/₯Crontabtabcrontabcron.dsource.crontab cron_illegal_punctuation (?:\*{2,}|[/,?-]{2,}|,(?=[ \t])) day_of_month(?:[1-9]|[1-2]\d|3[01]) day_of_week[0-7]hour(?:1?\d|2[0-3])keywords?(?:reboot|yearly|annually|monthly|weekly|daily|midnight|hourly)minute[1-5]?\dmonth(?:[1-9]|1[0-2])words_day_of_week (?i:Sun|Mon|Tue|Wed|Thu|Fri|Sat) words_month4(?i:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)xΪεYOΫ8oΫϋΒΨΖƒΣzΗ΄5@Κ—ιt7€©‡4M'΄@štMAncZ‹Τιθ]ξ?;΅SΗ΅KΫ!mAα₯φΗο=?Ώ/޳œλ^sœμγc@μ°ƒ Έ8ήDΉμen `žΣ… °ξ·Z»6 m /HοΔPπ”ϋ$§χϋΰ“°ΗvJ«ξ¨yPώΔι N[a€΄ήL{C‚”ζiNSsΐ-Ng9Uζ…”ρ·$›θŸατΆθ|l3Ÿjz[™pqAΗφOl #MΌΓι’ ¨*wW1Ή<ΰΒS»ΗιNε;«L>Α7ύ(@Šΐ9 r€2."AΐK̐‚Θ²…pD €rzδ„«ΕβŸV±Όΐšο“ΈAΰub€q<ϊ=₯,½QβΔ‘‹Q£Ib–ͺΌŽeU ©₯β&%ύ5υ%L‹ s&€hΐRXoB7ςR#¨^ŠΠpD€ —\x’d@ϊ(βZΆα„ΖB²ον+Ž‘—™Ψ»bk9΅λc©ž[ό,Ο’N9_₯­8Ψ «}9Β¨ψˆβU6"Ξ[€M9m&γιWXqpSΙD¬ν„k9]vN λ,“Cδ„L€2 ―τl™7ΨςΕ`[ŠŒ¬Ι²vSƒ²Β”ΞNš"WŒnpΗ>^³ι2ΉΔžqƒΥΧR}ZžNΫ ΔJ!m ―T§υAV‘ΨΐΟΔuZbμΤώrjͺΏ"Lgƒ\jίvλ€ΥΜv2tΦ.\ ;IΉΩky9I6Bπ‚r Γd΅Ί ^f ²²%y‡*ΰLΝ[Γ8vS²ΞκΏΫλΕ•υ²]MΧιB$)Ϊ²Τβ'ζ<6€7Έψέ–%ΎNΝYdybΛ~]ινͺγΖ―*›[TXΡΆŒ}½%XVΜ'M”κjΊe|>„άΚϋOU«ΫΛS»y=#ήΚΤΜ­2-•Ϋ4L_υjt¦mμ,πP ͺ ΛΗQώ‹œώξVηξη Wί»HΖz$[ŒFΏ˜Γ¨{>ω ’TζΆμίͺΤΕ»ΥSό;t――3sW3cψIa€Ÿ|#οFk™|Ϋ}GΩ’™p[})c»Ν#9γfx^‰ϋό!±G;{Ηο`-ώ‚x·PΪ‰χθΞi/ςβέ¨ΐvΌ_'ρG,~ λ’ bωϋvNݏ †=ΣθΞ;›ϋ!w9rΓ¦}έΙ)5λͺγn¬ΫΥ΅Λe<Τρf—ώ;/ΝΒt0―Ά/ΪMQώXVg//LvaΝ uvJKoŸήΨ*³Ώ˜6³&Hοοb7ιv H‡CηΰΡ»“…°.ΜοˆC½~¨€·„L½›:(žsΡμ>Υ‹vΉ8€v A¬ΓεΒΨsƒ $ύz5Ή^‘~¦}E W–™ϋ8ηγ•£oΚN/ω¬eήΟΰl“=ST”ή΅ΨCέg,Σχœ'Γ›¨ιGΕ Λ>kVρΝε'θNΣ£r^ pΟDŒGη"=ΒΞΉO_ύ6쉂}§ζ¨Xœζώt‹'Crystalcrsource.crystal^#!/.*\bcrystal’xΪε=ΩvΫF–’ε8ΆgιtwœΔ‰)Λ’Q€%ΫρBsρ&Ηv;Ž—tΟτ’h,–•<}ζœωŒyν˜χω†y›Χ9gήζΜOΜ-UŠ(€€HŠκζ±ΌΈϋ½uλV~1γ½>υ ²nθυ-ΕTZF³Ύϊz&ϊ:Su[1»†&ΫJ«ή4w-[Φ‚kfύγΗ‘k:²ͺ0Ηψ0kfΞ?ž‰‘ˆŽ'QL$]!@'€ € “ @ί S @Χ Πι θ£ ›―EΗέzΝόcͺ¦OψˆP«|šD­ςY%χy΅Κo€¨UΎH’Vωm΅ΚU~ŸD­ςe΅ΚYΎU¨Ύβ#ΊJ­ςu΅Κ7 @Τ*η€(Oί&Q«|—D­r>ˆZ%“D­2ŸD­r!ˆZeo*άE>’kΤ*‹ @Τ*K @Τ*—€¨U>ίTί"†ͺ{™C΅εΓPe―πa¨sLΰy0ΊbΩυ†)7ί(Ά -y&Άβ€ΥόrΰfΎΚ€œxΣ1΅έr ¨HYoΥ-EΫ .ΉΒd‘žKB|_Mƒ 1}I¦!XΝnΫΰχLdCτ―§€†ΘίΰƒveSΡCΖ»Ι·΄bαV*pˆ‰B¬L₯­μΤ-§ήN€1Yτ€p¨»^K~-ωΗι―P%™6ωΉΜΈ½b5ε.¦Άd“ΐT~uF~ΎΓx@\UF`οϊGR.…9½Η€ˆο ϋώρΣ8 ΊJΐ$‚QΙΦύγι0˜λΆβ!γ31qC@`TŽσˆC™zμO…a°/€'ώρ#  σ.%σ4ΔσWςcœEˆ g @”ΨOŒLԍ ΐsψb&ώ…‹ωcαΔΫ…J§pQ€§`μa¬g‘μ-Γ1›JήχΡΌi(­–Κ{ηΓ€ηΒ€ >™aΏΘΘΫuτ¦νΘΆjθyKiΊGJΞ§Λϊ!„I"‘ΰλ(Άœ7•·ŽjRΑΈ:ό8’C$TJ "+A“WτwͺiθE·sοdS•Z:/T©΅ΑlI†5Λ6U½'Ÿ8šΗ“ir )Ζ²₯lͺΊκΩΤ£θΙΦΌΛ±f…sώΑ8„-O©°‡°β” ϋμ@ΒΞ†σΡ,vmJ„e©~ΞMώέ|S“-KmJ=ΜΛαrUQ;Ίa9;΅eQμ‘{vrμΕ‹}i&I+Ο“Mκ³Ρ1Z93Ξ#CΜ:Δ„DŸuŸs¬ϋxςΥ¦GΎυqΘ'N|?CΎςτΘχτ@ςΝ†sΟ,•oνpεΓ/½pk«MŒ#ƒo[F+Ώ­Ϊ[9Ωl;ΈΪ²ΒΉΏHsˆVaP—Λp₯bˆxιwtC(%j%Κ}ƒΥWΫ[Ηΐƒ‘aΓτ3―©€Jv§ΫUΜΏ½j` ’•w ’•‚7+zΛpBσ'œΏ%ޟR‰ΠΨS^"’fl+ιcξΨ³˜ϋ"I’Do;Εo:\‘Ϋyά"”›x,ρš†T€Ή8½ό8~½”'€—ς(υςdόz©MH/΅Qκεώψυ²?!½μR/G¨—hΝ;φκΎζ¨^ςΡs‡\ξΣOfΥB–leΗΞw5XΫθ!σ9%S [T;]ΊΐkͺΞ£†vtίΤ]Σhƒ”Ή†f4ίτκ;,Vv:* ΅°ew4©!’ω?έωΟΟΧ3‘“b,ω°όί°?~£ιin‡―L!QήΞν>΅CωpΉbό%m$„΅AVK$kYΊυ•1wBXyš¦@Ή˜¦9λmβΎ +~„τFΪgΖ­·¦e%κ ~„τF’ΫPoΛ©zλjŽ…’΅—Ν%ν‘½x~@ν]HΥ«΅/#Z;J:#%ΤζuΆ¦³Χ=v6¬΄Χρqzβh J΄0ΪœR•Φ–RGΩ-EλgΏ‰Œ³.ΔYp8v@έ‘–Ξ˜ΌΩ΅ΫiZήΦ4%ηλ3­ά$8/₯κδR²N‚ι“mR’T½“βΜϋπKHMψ~cqo#iŸέα2ύΞ·*0ŒσœηθΟίΔ7+χTgΙ ΄!­M…>&%wΨކδ31\E?D>AB½²Μrvtηn(Ψ†™g·5ΡOφΫWλrξΧ»Ήͺ‘«Ή[΅e‚l\§xΌ”™Γ‡˜'—­ Η]|ƒ%>zΛ ιt.ΞςΖ’N‡υύsQίχeρŠŽ肝€cΔ₯ƒ6ωGWŽF`Γɜ Έ+V¦_ŽΆLGsu/.§μυδJ2›θΌVΥ4ΊJ’χ8:~( »<ž:ΈML‚΄νSύ[̜>œ:Ž~ΨΗΝΡ(c|ξP$HΫΨΏυΛcζτΙΐΦ7GΓξXιίϊγ– m3`ΦΗΜι[ά »K­λ[‚~·Ί2«ƒdG8©­sξήπ!nQαŠ•+<Ϋ‰§|,ΝψΏ­΅mN· s1Y‚½DΫΔyΛ,ΗnΌ…ur³τ†­0·€]šιƒ9χEΊέ’$T ΥΥ܍ΪήΪΚΥ}΄S•Zrnσnξ!>qeεΕ!ηp©,ΉβF±˜«HΫΩTιUnχΡVε‚΄'Hϋβ`χΗEv€Ήο¦·YΞ΅Ι€α{Χή Τ7Θ1”cσΈγi8Š›ή¨²pG¬z͞zMΪ^fgcL³ΗTδΦΆ©Ϊ L±£βr›R)MΆο(θσ€Εx—xŒ$ͺq2(]ŒeπRƒmΝh„Ϊΰ#η05α_ƒ³/TvΔΣ™ΜόA7ήΉΩR‚X ΞΉ FpήiΪΘсΡύ1‹„?ςžΙTσX9igοζκ~k«α΅_«ζ₯ν˜ΣΛώu‚$ΥΙΚΣ†d’¬(‰._a’.—BQτx%lKi›Ο…ΟG˜‰ZV²VΒdύ""τ…bQ/œ0ɜ»kŽ\ύ!'}ϊŒz—©:ΌCΆ’υΜΙaΨ=5ΜE§$γG£ΚE†j-£εh „Lά=>RbγD( &rΙς WΠ@ϊ"Hž”4’Nr"ι;NPD/gCιz§˜ ψΤUVη+΅ [τχ„aWi‚‚ψ~q&°Ÿθ$@M'ύi;„ϊ$7ίJŠ6ΡΘ£δ„ KΣoy.U t1=§•ε ΒvsŠζiνM= 1(Μ£;h ύ‚.!)‹€V½G%tIZA·‘”GETFu$-#ι"’*¨€. \uUn=TkέwA ΌΪ§XP"ε\6Cmέ‘‹x*ˆΡυg₯jj|žgŸέiΖ Μhs>OΙ2e&xΙ“!£νˆήD΄:•`tοWδ€β_Ž‘Αχ(‘ζcH 13Τk!#λ£ ©YύΥ5mΖ62[ŠΦΝό€«mΗt:rfSV5x³lL­XΪ@P‚ @O₯ΒeΰŒŸ#ΰ,'εφ”΄ J‚lφ'cΖΛμ<Μ€σoͺ;ΈΫ8i\  ”εTϊžΐ!β˜**•JT–!_’b©ŒŠΥ"ώX]\ϊ岄jηr•*οQ5—­έ© ©*Υ`1«±/VȈΟ_ώj˜žυΌzΠ'sΪνϋJAx¬:”vνŒϋ\H8c©VfS$·ςhžpΪφdΪΞή<ΧΗ 3ρQ6ΌτρI$}όίίW˜Ε6'fΣfՌdΧ2CΏ<ž‘RnΒ»ΧΑα†OsύΞ₯³\…άΒνš8(‘ŽόπC»"ΐ €– μΥ4:ψΆ¦Ϋ4’M6’yωU$ :Κ€AT6†·:š8_C—΅Œ»Σ#clf gd+ž‹yVZ™Ζ.Έ΄•γO ‰Yay—F’0q~~`»¨άgc@0ζρˆΐΉŒ©33ν«Υ¬I[ ςzEΪaςΡς>·D(0ςΈ'²Q-ΈξU¨Iέ½g­ύšH!π:€²^ΓΪ«„.+h΅ΪΈW«Υ²hΥp7θdE‘^œ›ΘY»Žœ«WsύRo"ΎͺπU…―›pάΌ~ lΟgَ4P‘ŸάŒ©š‰B #Ώ—½.FSϊ&E_Œ₯ΉD`sŒ+ΡΎ"~θjΫ}t^vΪψΫKο›l²@ώΆ8·υž&Τr, “d!~7Χ/“da%B€¬@-ξτ±—j„\δx\T'ΙΕqΕIrρ a’\œˆ8EΉ zά‰“dεÁΤnxδ/xγπoΤv‰ΈP¨c4hTΉ%½[ƒΕΒΓΐ mτ7Ή†²₯Bykθ²y©Z*ΏzRu-έωΓ¦*Y·k°Žh~΄"ξ’—=η.Δ1ηΌ•Ί@EgNω½ςŽl7·˜Ÿ 3ΰ₯ašβΦ~Nf°θ-ζb¨ζ#gς5P‚²γc\πk’(„Υ”uζ"Λiτž™gN΅{‘Ϊ1`Ε$λΉΖ“#ζΓ…‘ku¨¬š[†I™Ωπ΄½Ύεt5X sKx]i‚)`eΞ*Έ Χ Ό‡IΈ‘»ρΪΗ„2eρ·ˆ©ρ‰ˆρ‰¨‘=™ά7άp.‹"ˆ–³{ϋ•Ϊ4<ρœ™'γS•9ΩΑ㏋‰§y\L4mΔγb’CΨΗρƒ‡yƒΗ™b€Εκ‹xυf5Ξ§ΙΌLΤ]?Kζe’ξςy2/M&Ώ‰ψ$ΚΛ!ψο')?o·­Ϊd½χ·IœLΤ_~—ΔΙD£θχIœLΤoΏŒ8αδάφl„ΐϊGΌ‰¨ ρ€ν:άkƒξM΄σζuέpΟΞΊs§2(hΎT!;xDΆ‹¦ΚΕΩMΠ5Y§ZV™Π}tFaw[$Κ’_»εmK½P_S‘ ξrEΊ b~Ω{ ‘€WΨΝlώΒCΧψΈkΧPΜξ:₯*~)Go‹d€Ϊ¨ΧρώΊ€§FΦ@οεΕΤΧΤσυ‹ΕœpL‰oR¬C€gλH|τσOaaAZ›h؟‹Θ$³ψκΕ!pψν ήυjς~7‡ΟŸOžΓσί₯p8yώ2ωdώΰσ“WθΙέ?έ}uεγη?‹“ηw>B`!™ί'/ώΈώςΟ“gςB„€˜ͺΤWΠ«GλOŸ‚>I”/xο΄Ή!l1/K%h‹‚΄'ΚΡR„ΐΗQ₯Mœ›K‘-ώ%i΅ $νIρ ϊθŸηΗcJˆ0E:j₯2»/ž t…sοdΝQB _DcΕb -–Π¦Λ%·l…χ,όεΰoώϋœ*G΅ζF6θΊ+ΦPQIDeο*‹PH£r WΨ{…/šορv‘ˆR…wε*(^΅BΫ3ζb2Α8ŸER·Ÿhi >βήtD—|ž6|ή8ΐ dΦ(€ο,"iΟ{ΰM~ΜΓzπΊχ$a]DKαά­΅ I]S5Ϊ±· £»ΞL.₯£ Lή‹†>‘‘χ¨\N•Τί5Κe§ΐ²οξ<4τ)$·“ζ ΈάV8’υ<σb2KΧJ3Yrsχ£τ‡‹{;Ε…=kΰέΔ!ͺ’ήηΗ!’MSήMB$ IμηA=›ͺϊ{T ΅lz ¦}pRq~†σ:T.O%W«ƒs΅7~Φ’Έ:vX\] cLz8ΡTθπκTZφΪΰ\ΗΟΥχSΙΥυ©δκΖΰ\ γηκζTruk*Ή*$qu‚“γξrΞGž±NΘ Œ₯VVX7hΡ†jhζψρχ#ΘfC΅MΩάΝ™J&„‘·΅αjŒB3Κ$œs£GL‹₯*ή΄Q‘ …žjΜαΘ³μν™!}jgϊρˆ#˜ι=žt7ϋ‚(YΥ*}ΈΣJ&v•ω\  vφV½Eˆ°QσΫω‡ΩΛ ” ίDartdart source.dartxΪΕY{wΫ4Oڍ½{΅]·ŽΡv]k'‹;`γ1Ϊ†ύ€Γβ>GitβXAvš†iγ«sεXŽ-[vZxηΔ|ύ»ο«{΅'•ι΅ݟ!zΗ °ψΆKώρΛ~%}=Ν§ξP§Aݎοτ(ug_U£ϋ’φ«νBtΏ“’ν €Θ£ϋ§)²"ތζJ.”0βϊ3²«…d_J²O ΙΎ’dΧ ΙΎ–dΧ Ι^I²…d―%ΩΝB²o$Ω­B²oϋŠM₯ΖΗ‘]εΫۊ’Ηή‘―?Sx!Ο£ υόΎΒ^Ϊ@‚|WJ£€Ί§H› 'Is_ ξό@•ΤωbjβΉΔΓ}%ŠΗdX@Π!―Σπ‡Ψ!Θmœ!+΄¬˜,ŠζΎ"΄GOΖ”uβΟ*ρœτΖͺbξαΘs‚QhoIςHqάΤί T€Ω°―(s-E‹°ݟ(}?m*+τ%τ«$(eN§2ΧνΖk ’R¨¨:XςZΟηE‘ψ3T9ΓωΚ₯8?Pς$J―|IS6’X΅bAW*ι«ͺx‚ Ά‹-τ0³|:bYWΤ)㜜œdy&ƒx€du°γ"6‡ΝεΧ?Δ UΜkΩΆ BΔCe!—\¬iœr7ΙDΖ©έ6Ούσι`ΣnW•,‰’/² ) ¦*.&₯έNε‰5M&κ’w,X‚Ν;t$L_θh™ς›››FscΣ,vχcΕdsαΓ‹y…ΨΩΩ!v.(ΔzZˆ?F΄άΥ‹Ω ”FΛκΕ΄Χ&Υ(³˜Ν›iψΤ“νU•ό%ήrINJΈzx,6œYΔΩQaζ ΎGΦ2+j|•kŝيσdΟΗ—΅’S!«š*·šC+.Ω$J~E͈ŠŽYEar»ˆ8)Ρ[¨ρηΫΖο‡uωϊIl`ΚΠ)Ά‚Ι[³ζ0Qbσ˜€φΩ—ξΪ5ΨΚ«Š%›. ƒΙtΗΣm<Οr6žξ„O`δ†’[Έ―Y_šΧ˜‹3=K]T©\uw·uanΤ«IŸ”βV‹p4v»—$”³aμξšVΝ4šƒ7[qM―VFςώT ‘tQ­lψ.ς{37η‰v5Ή Λ¦ΡάΫ°· •06ΒΌ‹\soδΊb©)^©Ι/'ΛEήιHdƒύŸg‘{ϊ–Ρ3-jάμιP[Tγ₯qΞ3[/ί£FχmγηΓšΙ Cό}X·­fψ –lkΊfš†ωO¦aΧyΓlF‹ΝŒLΛͺ¦΄ΎŒ8ͺHΏ$DŠJ@ošF ~k-QCR/jΌ #›έ ΰΆψzPΌΤΪ€έ³TDΗ₯ώˆe0ξΔϋ|cŸον7ωΑ~ΣTΟ²pt0„8𳾍V½ΆϋΌqΘν }λsθ ΐANΔ²Νb,nΉˆ @εV\ΫvƒΫu»£™:4β9,Μ–ΔυτIλξ”Ϋ5nο‚ςπσ|i΅:Ηnπmˆ#ψWξm—žeJΠσlύƒ’3έ@xΨWj“PΘΪ!]‚Yy{έ|sFI‡CΑΘ€) αΰ:dd@DύΙ™[ Fpρκz’VNΦGΖ³xγVmžΈ2κ`ί£ωœ{eΌϊB‚Ωγhα’6CΣκ /‡$Φi7ΌC‰k kiΟS~.ͺiγ$‘ςfΥυGšυ;šυ‡šυeΝϊZ%ž>½P'¬δ ˜ ‘κψ΄ϋ‡Ϊ‰Ογγ"Kέ°Sg4(9-IνRx{Λ0μqέδφ;£uτξ=ΜmφϋY'Ί ΘPU¬w’?ΠοQV-^Ž<ρŸ13egΓy44:=$zψϋβ΅S™u#‘γΜ„³εάθNΖGjΈWΎ‡Cγο?IQΘπgσ°Ύ–ι<\―k₯Ά9θ]ϊύΕB,uι‡7 — ~+Ÿqω‡r¨¬ό hŸΛDockerfile (with bash)source.dockerfile.bashembeddable_directive,{{onbuild_directive}}(?i:run|cmd|entrypoint)from_directive=(?i:(from))\s+[^\s:@]+(?:[:@](\S+))?(?:\s+(?i:(as))\s+(\S+))? identifier [[:alnum:]]+nononbuild_commands_directive(?i:maintainer)onbuild_commands_directiveh{{onbuild_directive}}(?i:add|arg|env|copy|expose|healthcheck|label|shell|stopsignal|user|volume|workdir)onbuild_directive(?i:(onbuild)\s+)?xڝVΝOΫ0οƒΑ8νλ°ν€Δ€Ε fƒc₯-ΫušΈp[C+71Uǎl·¬"HϋΣχR쐘¦₯σ‘Ώτωε}όόήs[χλ₯ΑcΜΕT’HΣ9Q£/¬U_šgV³½Iσάjv ξRLΉένά+w•ΖRΫνΗ"^Ψ½gŸŒDšs|Ž9N_$2ΠθE‚k‘ΘžΖζx±‘\K‘Ϊ½}ΗεsΜh̜μ«Υό_,ψΈDλ WΣ²†έƒp#kP‰™Œˆ‹hJδ5eΔc•l¦²εPιώJ坆 wδ{ ςύωΑΞ½–ύΠƒbCžwŒό/HϋQΘƒ’νvΧIΤβ™ΑlΖ#=Ú ξί$T•a Σt¬ΟŽ)ŸTΘν4ŒϋΖƒ¦λ­p“kΚις±Ωΐ#"j6“!πΰyν{‚g”Ε(T§(($rΖσ(s0/™ \#ŽK‹νŽήœ’ō±_L)X%Β¦ͺ―i5Β•β8Ξ±œ@€σ<Ω"‡y'Ι‚™N’„DӜα1aΉJƒ_-2E'³|¦ˆΜη‚ΝR’C”S˜₯`·Μ­ΣPπ›ssΩψδΌ!tB€―`.SΜz)Ρ‰ˆΧPcΗΔΟZ8ojŠ|?α!‰νΞα ήΦυΣΉήƒ0»ύu?wW§^Π\ ΜτΏ_!/Ό;h1Kας{AH&σΜπμXIΰΚ!φ£±ΜπO+Ύb"ΓH½“%Jq¬—Œ£mψ +Ή4Λbε‘a₯9†-Έ‡J©f`„εVK AΣhμ §Πήdνθf}6οYμ[ζχΪh'.BώƝf“W^³δ4₯0 ω©u—¦^H~™Ίρκ…ώ ”Μ ‰ LIΓ&Έώ]‡)˜ΑΒN„v;1<ωCڎn‹ΗψžρΨ±ΜXζχ{p΅Otl]\Οu_zŠqH¦M‡Žš–ο:0»N°ž#ΙkU=‚P\wΫΘΈθαf½iν4U{·‡Ι~5υψΆArΨΛΞΥιΆΔ½ό4β˜quΌ#ρX"‰<ΰ?΅;θ¦ QδΆΥo§f­LΓ›ουσ\F ž1Elixirexexs source.elixir^#!/.*\b(?:elixirc?|iex)id_begin [[:alpha:]_] module_name\b[A-Z][a-zA-Z0-9_]*\bμxΪε‹bΫΆQ²»vνΦiσhή±έΨ€lΙq’>βꑬM·ni»ek·UUJ€mΆ©TdΟ°Ώb³?Ωο ˆ€’%ΩΛXWΘΓέα8άδ ]οΔεŠαΈN³e;†wΨΌηζΨK΅E ςqω>Υv=«ι:q0DΈ J±.Ζε{ ¨iν6[·ύ³?DϊZ$Εω‹4ΘϋςυΈό5 ιΆtߐΓPŠΏ”ΓPZoΚa˜·δ0 Μ―βς³ΫwځΥζš ΥDΛ πΎεYiΣ³φ¬ƒ¦ν–Χs;F`™Γšo[“ γqkRύfܚTpοΖεUEMΟ ›w!cΪͺχ2V y?cΪ†‹PXΑ<ΫΩ“(λΨUi».Ηε5UUFtW²Φ 4>ˆΛλL †«cΨސΘΥΜU(•kΒΑΣ5lgˆφΊ†βΉ!‡‘Κ½)„Ύένu,"JτV`JύΆΠσ(ο¨ (%n\±PΩ²Œb[Q‚QΡ|¨£½ύŒZ»U%ΨGlM φ1Σ”`Ÿ0] φ)+(Α°u•¨Ψ6TΘξS]•`TW%%%Ί©£ΊΊ§£ΊΪR‚Q]έW‚Q]=P‚Q]=T‚Q]}€£ΊϊX₯+*OTΘP]}ͺ£Ίz€£ΊΪV‚Qή>S‚Q]••`TW%ΥUU FuUS‚Q]=V‚Q]=QιŠ6τ·*d©>W‚Q]}‘£Ίzͺ£ΊϊR F›π;%ΥΥο•`TW_)Α¨ώ £Ίϊ£Œκκ™JW΄_«}DuυŒκκ[%Υ՟”`TWV‚Q]=W‚Ρ–ώE FuυW•Ψ(Τw*(ͺΠοUPTŸSAQuώ=.ίf ‚>vh¨šώ—$Θj†>yϊC\ΎAŸϊαδq«E£δ)ˆK %BKˆKR Γ?±—$°Δay֌KβZ~Ϋθ!Ÿ³½oxζΗΈΌΒΑΈγ§pƒ“± V\_VϋνΈΌ ¬άphΖεM0Φm»γϊΈ4έ~«c‘JVΆJψcXi7.―‹+‰Z±—$š±—$Ό„Τζœμ~?qέΟιw-Οn“Η?sϊοaeυ ¬/ΪG:L$q–…n\^b`$=Δαz! >uΑ>νΕεEζ)Υ“‘TΣ 5l»οuhΏτΤ°žΫwh3|Ν|_yΡ7<ΚD—ο²ΐ]Χ΄wmΛ£ΒξΗε8Τ4³Ωs{ώe\’\Ph›ΘΓA\Δež|dlJ‘*s ‚ι:ΥͺV[ͺκ‰6ΪeJΘψ؎~%Έ“ΰ_Θε8>6Θ—«\,s‹€ήk‰Ύρs_ς>“π#d··³SK2™Dœη[@μΧΟΦαΐυΜRpΨ³JR±.&ω"Ή4­VΩ€ΥͺΞ2,kjxΨΊQόg£ΕFA«m }hΐ\Χ‘†Ÿ4`°λ@Χk”‰Žω3’C~ΜΞ™}ΉΌΘ­‘ΫdΕ,‚ψV˜‘+ “5aHlνΩΤ±ΜK:= €ι„L“:nίk“vΙes5ω„₯’—ExKV·e™¦e’Ζ/ˆŽiΒ!sγωΌ…lfi†‰ΧιΈNwY‘^€H«Z±Š|‘ΑΎε Εϊ”D~1Q;YςΑœΫ³Pεzq +Žψ/s•H<ψΠ)Ή‘ ِΒQ:+Imbi\’JΎ‚βH·7Χ…φ&Υΰ2,―eδN.Ζ)™O½ζ—gΓΌ¨#2Φ–θ]+Ρ,ι54γΫ0mήK³ΉK|{O•²Κ§MΈΜθ[4Ί•±iXΌlΓ$Νζ3‚χΚψ>5Ά{%—'²φMaH²ϋ2—zev ?T W\›σ}α\ε΅zZy 'μ €sϐ7=yhSμ?Ηg$Ž`zβ(LQ3Nj鉣¨@ΐLmdP;θhz£p²₯aK]ΟΨ³’…1F œΤo³²‰§«h&CώX7F¨ž“±‹Μκ|’›b_¨žQ_π§Χ6§i9u}€ξWo&o$ς(™ό‡Lƒ[BΑ2οeο+RRχΕ€Φf@κ‘P}›3 τ±ΈQp€‰IΝ€ΤgbRυͺˆI•g@ͺ&&₯Ν€Τ“œΒ”Θ,™K3BJΟ/έ^jŠω‘c#γit’0#³cΊœ=uΛ2™Χπ³Κψ‰πιKimRϊh)­”Ξ&&ό”« oθ˜ΞΙ,ˆ ΐ|"%^4?ΰ―§Άι·9‰ a2Τγχu͐{œc6qά”ο¦ή’‘οη8wiξoζ^ΎylΑ|Cων HΒλt!ϋ4Δ4ΓΎ<E<>B˜bΨ^@s!„)λ'Bυ\aŠQκη2yV y%ΉlΦwά€φυδIΪ§ Κ·†κ›py­‘ŽΰKa+gfύ^LjaΦWbR³³ώ &5‹0λͺ>(I{Ή΄Q€œ•Σ=FL­V„/žλΧ+G^&%υ³˜”Ž; «­YπίεN'/^nγΆ$ΉΎβ‘=jkRαΜ{AvΊ+gΝGpNψxqNψπSψ˜Ι4χΝi§Ήoη7Νύy~ΣάσωMs™ί4χל’+z ΰ;qCf±π½˜Τ,–ώ>"(|Νb `Eά¨Y,ܝߠ]›ί Υη7hΧη7hK9Ε •Ν%ϋ9Υ57ίo?šoΪουfΰ›ώ)w:yρr·%ω„TB<“ω¦I”“ω¦ΣΙI$ωΙPζ‘ž υΰL©Ώ8SκώΆ₯}Ί±2Ÿ7έζ» ψ7’q__Y>“7η»΄ΈΜUΈΖ΄ΝzΡ·œ6Z©Α(€νέέY°&°|dgŝν0„»BTψ%qόVϊ™β`„F†q’Ά£?,‚Ωx‘O5?dΓαEΛe­ΆTΦ3z9ρα ό,δEΙψ‰œ€δΎμ0ŠžδώŽδ~Sr ΉίI2~#O†ty ”τp»7DέΆ ί‚»ν]ˆVwMΨw:–οΓΐ;„žΥΆμ—豑 £=ύψ[―~ΖΫ³ρwΌι—¨†λ™ψώύvΦ3ڞU1­Ž΅‡,ώn΄­Φ ώαΎ΄<Ο6ρ‘ψη^ίπLTΕ:°hμ" ‚xρΫ} ±΄χ‘ΥAL{†?­¨ φ=w ›/ϊΆgA£c>μ£Ηαό„Ϊ•~MLp`ϋX΅₯zmi»‘gΫΓ‘π+9^¨ γΙο5X°Ž>άη~…ΓM7•Œ 'ϋΔϋζΣΫϊx&Dύ€bΥ»ƒ΄ŒdΊk qRA4FΠEŽα ΝμY£hυ!ΪfSϋόΙ³gOŸΓ§ί|Ώώφ‹οž=…_|υ\o64θ!r4 πXΣΜ`Pΰ7‰S,‘œB!=Ρ`]¦ωC¦θJΠͺΜυΡmρΜλm£τ½T†nΛbλ™Έ`b°Ž₯6 ¦σόpς™?δ@( 쌨κͺ˜•ήπ­\Χel λ.ŽLΔΫ“ #›Ψ5>JfyΚd―"χο„‘ΩΦ5τW«ΦAοθΩqσσσSΕγ Vπ«’%n½ATa₯R©Α%όQ.W«θ£ «¨<99ΫΫ° Š@…ώN`nB€.  €κ—@©†ώ`ΧF―ΦVΡνu°Ž>‹ ˆ>Ρ5τΑ| Αέ8Ηπ.uΠ€`uΤjϊθa’׈Rτ?ždEVZ,3Δ_(Ρ„A½%ζ3ξyώ¬8%GΊνΏ ­¬θ₯B΄985~γ0:ΆcQ2…­»ilE(yQωmοΤο€ ±Χ4!s·EΜ9ύnΛςŠΎ½7+'§αjΪAM•OŠ_ΕέΖΡΦΖύc<0†·ΠTλ;_ήΠQ |†sRΚ™WάΨL΄9νBR™Τ}šΪ‘J2ΓρΓΥϋΔg›βI?2FaΠs> #Ψaœ̊έΨA˜ ή©όu4Y‘ΎA [|rš¦CTcόΓΚΣ°ψ³i’Ξ9³Τλ·:μιiΉΙwΛ„Τb„τˆο2Cώ,Ε΄’“gΏDaΕ\εč}¦§‘^ϋX‹ƒ&όš§^3έφν$zG’–<εIFρ β†λI#dAωΛάΈŒ&f’a}s¦ΥτνZ°uXΡ7Σ~‰²dVξ›°c9{Α>¦=sPWG(»0<΅aΘiGΈCDΒκ"'±05—Ήw3†RΓxi₯ R»Υψ«©<¦UɐG*wPέb|8aŠΞίΞ [‚_AωkΙorŠικ•ΡΧ…WF_ο«τΕ¬‡!zμυεF‘¦γ―Ισς€Ν•1ŸVΞ1Λc™tΣΤX Z# JΎψuήτʌ¨K―̈Ίόa―Ό2ϊϊ ³LμΗY9G`yΔWEρ%\ρ’ΙαΘσΫu’5­R‘XMχ>S%ά^Ο©‰WfIόFRD7 ώE 6αFΓΩ֝edΉ5όΎ}Οΰ‹ „Γj₯@6θύΠ?ΡDPGz)Y%–ŏoν:θΖ¬s3s紇»—ΜJ£€‘YK¦€ π^«~o«±οΉθώ'θ 0C(`κ -Η ‘|έzΪ¨Χ5ζΆ`­yμ<6γD‘LFΉ‹ΥΤ8ΚπΠ2ό(b ΚUώΔΝ QόTDL£΅~ΛaN±ζ°Κ/. Φ{‚ΠžδΦπr, ]†ΗiΕαΨ½~GΒ±xα,URZθΆδ’ͺTωΰ` θŠ=ΓδHZOα ZΈ[…x)μ$υΤ^Xl_ΐε;TόαZa΄jx2^”½8bΣπ‚άR₯Qυ2JdUj|Š|tΪν’μ­ν‹”ρ€"-WΒe+} §–γhιΛ£e8&ϊ ΄\oΰ2U.wΟn‚7BΘD„Ζea³‘Κ?β=ΨGј$•+ιX|ΌΈ–X`ωL΅6™x‰ %J-1&ϊjΫŸ’£r[?‘eIžR6{β{½n2蝜A1„ldΩc»VΛλ"|ˆ·˜Χυϋ2Επ/γIο2εγΌη…°­ΐ:οY™’Ύχ(9i΅:†ν’ίΎO G«„†žS΄#άD,ναœΪ&‘ œ–o=·|„u›B}DΏΞ©=}ΐˆ‘ ώˆΪaB±οuΟ—η”9Έ92+φ ΅ΫX‰Θ€O)x‰– Δ*&?™πEή‘S|Ώϊu,£#ΐf)ύ΅)ŽΊ€θY+7£λuɌ»”F΄½°Υ±B /τ%E|Ξξ)΅M+*σeF¬ΛoAJΏ¦Œ(ΦNςΛ{Ττκ{νXP–¨ eτ– (¦:6ΠΕpΘ―EΚμ§Υ­NY$¦FθΕlPςΟ4dπ2΅σžα†φsۊΑIι)#A†ΙΤ0`6P&D;7 'ήΨ7r=θo™βθ+”ͺ0§eiuxΏOΉr"ΗHδ΄=}λ`Κ–c_Ϊώ\j‘|FkAΩάΪήήiFۏ=Ϊ=ŒnνξEEQXSΔxz…Z~ž’β3λε…η·ePŽΠχ₯,&4Β¦nΟ5ށ$I¬/^daΜ§ζ£έΠ&/λmό*(kš(Žξ\Ή΅@ "Z.:όyg?j<έί‰žόΊΫŒΠϊꑨΟ…yš«lά’ «ΠΠ΅6 72hTŠπSˆi«°Γ—²kt,D>pΝnΘ”Œ›~€8ğ+SͺT†¨ΔπΏ5WoΜSφΑv_Žέ–mΗ±N '³‚Δΰ~5‹%\Z,Dμj[Οm;&Ωp]/|GVRͺVηr€'CΜ=BLMSΫΑ….Fπt©j§J}ν΄qκŠτή_]~/^Ώαο¦ΦνiΫθEŽΤ#MΣGΤ3!ΆπH(σl"‡ΰ Ž9‹₯Κ O-Ÿ5“GΕk₯©H^€yʍΛ@Ό ky.―ΟqΆTLΠWΚοBΟςJΈ˜ΡΫiJAτΚ§Ξ5Ž}ϋ„σ}™σύ³4•c-ΧΙΣ]Ž«Αm9ί ρ£v ΒΒH,αAθ9‹,©^œ§h‚©:Œ y˜ λ^Μ<œΘ(”έ^η„6°Oά’2SΣeϋ;΅HBϊb¦γ‹„γ?ν<άέίxϊ>­ΗXϊk€xSN«kf„QPΦ„{’ [³–N΄Άή_~°z…T΅έ£†‰Φ-p΄NΰΪ ΛμωΑΖ•)ηW©ω„ϋ/ ί6Ž‹¨.{φΒT³Λ›$ λ9Dތ–΄“uius)άc:Οsθά`cŠb)L‚.I‘4e]Q7ξκdΖΗ–Δ₯‹’’ψζ\ξUΙ’†ee’₯ήb ,―ς#a't,ά)½›―Kμ_€h”ΈMAVbλ"ΡΞ-φις 6 γIΤ¦xrXηxY>¨JΪΊ~”&)dί₯Œω±γ™g¬Εv<&ΐJΎ³#KMψΞ—άUzόλ–ςU˜.εa―—±°^Š5M©A^ΪTrMW-ͺγB\ΚΖ’MEXΓ6|Gšͺi‚ΨΏŠŽΎ’•z%9 ΠT‘Ξz²N₯lm D+μω–Δ -Χ1‘­gr?>œ ΗήržA(ί5Mbaz“‹B5ΖMZΫGδ0τ:ΆΙ’γά,֏« «œυ‘R?ά=Κ…g‹ΖBŒ†αUS+”Αf0c<~Ik¦ )πC΅;Αε/OΧΖIρ[]T&f?5`Ό\G³ΦH0GgJΔYd8―ΛˆθΑ*©^ΛΉ0 ϊ„…±_#†c‘:y0™Ž Ξ ΰœ―cb.¦η°ΒΐΙXϊz*2Pΐ2Ζwη #š±1)ͺ+>wŒœV5½ώρ~Φ76DΘl™Ž9@E,ί6/!@φΑšvg$yJ€“ά •BS0ϋ―+Š¦§™ΪJ±ρ©DIRμΧβdŸ#p ›ΏY›/i:ΰ˜i~Ρ— *Ω'υΘUސφά3Χ»p₯τ Qe†”ψΌ©dQ9φ’ΪN…²χ4±`ε|)̘Ai(ΝΟτœ:c,ΊΘzΰυ|Φ±Βό\ΡΕRΦχσ3ΥO;βΕ«qh䚧PΎΐιΨ:±έ’g YO―χ-―yλ2¦άj7b™QάϊγΩΏtΪδrV μNΧ±&Z“’vζ¬ρ­AΉ»’΅Σ…Φόβ:HŠ“‰Φ₯xCΣN fΊQ« ’’J?θZ»Ή |θ (˜Š?FόlHΌLd3 ;ηϊΜίΦ―”HRVΔZκδ'βδ[ΏΖ±—”*Σƒ £΅eŽmΜƒ±0Χf#"3%D5 "σζFNΎ¬‘tšΙ šΒ Ηςdό’°πηIΒ4δϋ«E!aγ³Άΰl` ϊΛ"ΏΏYΛα)βPΒאΚΧΦa†Ej&ψeih ΨSλβ•2œ π7•T΅E‰MΔΩ,Mνrώ―ο” pB|‘N“fWh¬K40phυZiœdωϋt‚Θ>™“8-yUΘcΊ–Α?:DWqΈ`cC* ΐ?:Ύΰ?΅.y%’4Υξ”•φ[μίΏλšV[,V¨Μ™]ͺŠ»Ύ‘βbατ7ςΨZe©J|mQmŸ/.t:Š)0Λ%(φ1%Vt_x!%γ]π)BϊtAδ(+η)xFˆ ‰Vδ䛃4†Y ΡϊΆ<΄‘BΜδgΧR₯''2ο@:ρDώK„Κ:fOERΌ―LJiΨ7Ε1σ$clΙΚ‰²}y½2_Με]ž`χZΘtKt65ά—yΫ)αε~₯Οlψ^£c„ζ©„Of'*L&‹Αί.ΪsmŽ %ΧΊΐύ‡ΕNφw|«Έu‚D?>G±:`½ čjSynj_{-FM…μ@§›ωθ%‡Βέv|¦%’RμΫ^Θ…ψΟΉTX‘βcˆ‘ϋ"j]άΔ/›ƒH»ήa€zt₯‹"|€„’žΔaMˆp]–ΐQl Κ”σ«3šŸ=VHfrͺ|™g†96λ‚ž¦yi.yˆK$υAŒΒΟ9Όš.· šΩ *SC¨Ξ Bښ˜Suϋq-γΫ“‘:&2¬ηκt•‹Ώ*κΨΑGΏΈ”Xle:γƒ.ιYήα8B™σύΞχۜοpΎΞωΎΘωώ)η»ΐωώ!ηϋ=Ξχη»Δωώ%η{ήρ.ϋμT,JU{.vήΰιŽύΌœ’ΔTθ˜d‘vTmžγ”Yί™cξC(:Xg„bM¨ƒγΰv“EwtRό©–1ΖΎε2ϋ.ΩPPΊ!Ϊ‰έ ”εq—ΚώγΦ“Γ­ƒΓΦγζaττπαχJτt»mμ=„όάΪ7~ƒ{τ㓃yGΟOχw·΄νν>Ϊ=lα?έ<άώ9:ΨΩ~zπdχρΎΈQ’eeͺ“žίΙk+—©έš+KUΔΙ‘ζŽQλbf.yύ₯;όSνt§β:ΞΧ₯χλDΔ=i#EAΓAΞΟ¨ rΡΘm„¨2=Ί¦oκ©-]Ήn[]ίBεκΆŒΠ“Ž½žΫ6rŽ$' §ͺϋ&7cvΰ†Uu ~βJΩΰΐT…ΐoMčͺP7ΣDΞ#tήρΙ„‹u₯gΆ·”1ψceίΝcUƊ’ššΠρ_P Λ"TlΪ`~DUiθ ύ_δ ;»ΨΉ“Θ“6ήnηGΩIΑ+avF’KΧ™Σ)ͺ£±\Bς§γΌ .L‚Šq™0ό 4q˜­Uε;«pJύ Δ`2›“1}I ώΫ „+EE3ΖΡΐχJk »Ήk]¨‘@Š›Ήr"«3MwiθX%έλΌσΥ‘Ί/8[)Kώː »6ˆΩ€Ί6xpΛΦxσ¦œmΚω‰χΉΜpυO zϋΤ†€+ΐσθJkΝΝ螘߬…& ζυh‘a†ή'ε+―41&+3’γτ|Θ3-·cmbƒυ1ΛΐΊr%6h£<š’ϊF*QrδXŠρώdΟϊ. \UElm Compile Messages$text.html.mediawiki.elm-build-output0xΪ΅VKsΣ0Nϊΐ0ΐ`•vŠ=™¨τΜψSoτΔ1ΞC±7©&²d©i†rα—γ8’γψΡtxθuΌίjί»>h¬ΞKMψ $”>ŠΖζ©ΐœL³sn0;υ˜ ƒiΥc. 晦{šRΎαξjΊŸqcI„!sI^Ԉœϊ ©…!p‰ε€o”OπvFв )9S²‘oεψ\ΣΎΗν«Π=v2ΞNφτBSο[»{κα^B'™ΙbͺfXρDjJς3-[±VύFSϋŠ:ή(VΎqμΝ³‹O3x«₯ƒ„O™EΒ± j4˜Kήλ@,` Y’0X€i,Ε2„ŠW‘„ ΄6›…b5ίε͊aF‘‘(iZ'ΐ$ί:φΥαp»†Ά¦3Ε}©ˆ€ΗŒ)§ι£ σΚ iζ Q”Κ οlβ©ΣG?.VͺΟΛ·ŠΜχ›%³΄…ς΄fκRs€ι”ŒΰHήB―*‘ 4ωήΩΪN^ώ°μ؈EώτΡfά©šfo'yNγ[θΗ¦ŽΉγUΑ‡“ͺ±0ğ‚ŒŸnΘkcΘΘ ΪN~μ8iΣ’§Ysr‚ ~9Ν‚}Ε”Na1D 3ͺ’P—ξh•&’Χ«R…„ζζΛqΏ&ωǚJΈ—ψV† ‡P2§Sϊh«ΤŸͺfΨmόυ₯ dφGίv]m5bσόjšŽΎwΠϊ‘›€πCΒΨ…Q@Η4SΈ’±ˆB4Όf!Ί!Sΐ±1ΒΚ‘Υχ:^§‹zϊ²―«Ν„H@T‚°l„ˆ„£ήΉ‹Φƒ='‚'`gΕΈp‘~a=$ "g‘wζ"Βh5vεb–Σu{Fk‚Θ†«eγΆ“½t‘$+Αv;F’€Ώrά5ώ“«Υ,C`ΩIG也 wΩo+nNΧΓυ#¦Bn™E‘φ5²œΤIaΐ˜mY;8‹S!V³tf}»ŒYνή)JS~G 0e &„α4]΅νZœͺF:€™Ÿ,W«NkιŠgeώnτΣ>QφjbΎuΤν©`]›nN˜Vφ•ΡέΪΰ&~ίl, Elm Documentation%text.html.mediawiki.elm-documentationΆxΪ₯QΡ Β Υ5ͺ‡θ#Š“~’}E0l’M wΗΡΏGu³|iηε€Ηs=ηš“7VΘ[.—Ία bΰς~ ¨cΈ†ΥWf<“¦Ιι$Χ#Ό&²δ’­‘«4Λy‘a½M£› ¬ΟiΗΎΔ“n…³¦§“~` hĈΆŸM‘_!V »x μy™Δ‘3Y~#³‚¨ ρvΓΫΧϊ¦kΚ‚C@ ›Κϋ;σ»κ©°ϋRΈΊžC°ΠώΩκj]{ԏ΅™΄T°°°0&’w·²SAx6²Ί‘Ψώσ/sΆ^lβϊ³'ΈΎύ;ΡΧ³m\Ϋϊ―UŸβυΪ&^―γ'ΫxsΆ76pυ9‘ΖυŸπγΝ~\½K^χΘλ>y=ΐ[kOqύ-ΒgWΧΘϊ3ΏXΗ΅zoΤρuόΌŽ_Τqύό˜pnθνžεx― \‚·›‘³\rͺEjΙc]’¨:…ήνθC$„³άi¬©ώ° !άi5EŒδ Ι/žc›ΌC~ ΕTύΡ-ψίηeAΈπΩΪp!™ξzeŠ+­σj²fεc\υƒVeΊ„ϋ•¬π†νŠxφαΤ,Ÿ–uYO Ϋ~A‘oΏΦυ»fItβ0Kξ'Ɓ·C‚αΣ€o„₯ΐοLΆ£χ‘₯ΐ‡‘.³ΧSΌάEC „νψ‹./'ӊ/Z©#»Δ8HΤ#λ₯eο‰* !˜—”šS’peΕΠ΅GN‰ˆόIλUŽes,Yϋί¨ rcQ90«Lή"Κ„ΛΤ„‹V…ͺ*Z)ŠΡϋΩ™¦a‘0…ͺ]έέ₯BHKπδz€zΞρIΎu oάΊY^ͺφθαΧ«Ν2T0Λd‰|νZV@ωSΜΈΟΙύ'Ÿπ^aέψK‰ΊYͺ―ŒΙbΈFΙ4.EΎ AφF6²‘n‰š3υΖXΩ(fγ€½"ftS·ϊ#šOF„“ ;sΆ@½κx˜¦N2E”• ϊ%‚[¦Ά΄§›™”P0|(^IH΄»T<ˆ©¬@κ'ͺ8>Hδsΰ©Θγ  ³BΊβ8±ΜL+TARτάΡΠoφ#Χ:ΘuΡGΑœ›SrηΒ•$P$PθR)ΈW>xF‹2¨Ηω”`g/FτRT8AGwΆ{ΨD6,Ld ζžfF<σ2z˜X™.J²9'°k~όηaΜ¨A+xjΑ ¨Φl”Υf%ψTpπAό;lKΓΥ ct΄žiλbΈžN0:/cΔ³˜fZΚΞHa έF}ΓΚr¦C™•τ“˜Ο! ¨ΌVζΐyUVζŠΕ,ͺ΄;Vί5‹ό³X\Χ]£S¬’Ζ˜bβχμω€α`޲}Ÿ !ؘ1&(ΎΌ5ΏqwCaΕΞ_αt«ξkηΞωˆdΟhτώ!˜Ρ€©lJ»‰‰a’G<{ͺi/ކ«&€ζ θΡή ΕZ~e΄Iΐ¬}!έΛ2k_θU+ h¬ΠPsό¬˜ ©IŠ]Ω„DyΠxΑfŠ]ƒ$ύžc΄ΎνΩ-wΠΆMQ„‹©Gwl3ΰuθύ*w•΅έ°‚9™ή©ωΝ“ΰ^)Ξoσ’[p³x")S'η‚ρ+΄mBΠΙ&ΊΜ1Šδ»Kε]Τοή†°΄ίLž!a&HtϋΧπψ |»_\‰:½.2α X\―Ι: n{,ΜΡXoŽ_JζΥγ.r w²I‘s~RKBφ£9Ι3Ζ”œ½5Ι0Οΐ”HάΰKεη‚ΰ~$?MΙ›%ΏQM: υ>ϊiδΡjηεpυ'nr§αΊͺoa‡ώ›&3ρyχ T0,ςNŒΩU}^i—9+έ1tzμμ#‹6ͺΨ•‰χΰνή6ϊͺξ8φο<μLu5;%E[sγ{­NqtbΕ8­$nsXψ·§„!±oi γ .v&ΉΛ‚KFqΞr²Δχ?jσδ/Emailemlmsgmbxmboxztext.eml base64_char [0-9A-Za-z+/] base64_stringV(?x: (?:{{base64_char}}{4})+ (?:{{base64_char}}{2}==| {{base64_char}}{3}=)? ) boundary_name!(?:[\w=?:-]*[a-zA-Z0-9][\w=?:-]*)day3(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)ipv4/\b(?:(?:{{zero_to_255}}\.){3}{{zero_to_255}})\bipv6¨(?xi: (?:::(?:ffff(?::0{1,4}){0,1}:){0,1}{{ipv4}}) # ::255.255.255.255 ::ffff:255.255.255.255 ::ffff:0:255.255.255.255 (IPv4-mapped IPv6 addresses and IPv4-translated addresses) |(?:(?:[0-9a-f]{1,4}:){1,4}:{{ipv4}}) # 2001:db8:3:4::192.0.2.33 64:ff9b::192.0.2.33 (IPv4-Embedded IPv6 Address) |(?:fe80:(?::[0-9a-f]{1,4}){0,4}%[0-9a-z]{1,}) # fe80::7:8%eth0 fe80::7:8%1 (link-local IPv6 addresses with zone index) |(?:(?:[0-9a-f]{1,4}:){7,7} [0-9a-f]{1,4}) # 1:2:3:4:5:6:7:8 | (?:[0-9a-f]{1,4}: (?::[0-9a-f]{1,4}){1,6}) # 1::3:4:5:6:7:8 1::3:4:5:6:7:8 1::8 |(?:(?:[0-9a-f]{1,4}:){1,2}(?::[0-9a-f]{1,4}){1,5}) # 1::4:5:6:7:8 1:2::4:5:6:7:8 1:2::8 |(?:(?:[0-9a-f]{1,4}:){1,3}(?::[0-9a-f]{1,4}){1,4}) # 1::5:6:7:8 1:2:3::5:6:7:8 1:2:3::8 |(?:(?:[0-9a-f]{1,4}:){1,4}(?::[0-9a-f]{1,4}){1,3}) # 1::6:7:8 1:2:3:4::6:7:8 1:2:3:4::8 |(?:(?:[0-9a-f]{1,4}:){1,5}(?::[0-9a-f]{1,4}){1,2}) # 1::7:8 1:2:3:4:5::7:8 1:2:3:4:5::8 |(?:(?:[0-9a-f]{1,4}:){1,6} :[0-9a-f]{1,4}) # 1::8 1:2:3:4:5:6::8 1:2:3:4:5:6::8 |(?:(?:[0-9a-f]{1,4}:){1,7} :) # 1:: 1:2:3:4:5:6:7:: |(?::(?:(?::[0-9a-f]{1,4}){1,7}|:)) # ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 :: )(?![0-9A-Za-z:])month33(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) zero_to_255D(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9][0-9])|(?:[1-9][0-9])|[0-9])Ε xΪνΫrΫΖU’e'QnMΨIlΗ°dΗ€(@Όι‹a;žI2nάΘ3mCАXI¨I€]θΉίΠΗώNΫκY‹Λr—)E•ΗΒΨΈ<»ημΉοΩkSαu;Ί/θ–mν΄lγXnΫ–‹,W6Πξuܝ’7•½rτ)‘>Σωϋ”IŸ™ό}*€Ο•θΎΘο³οv;ς/žν"Cξ9¦εκ­Jf7;ιρ\―FχΟ† Ό–³CŒα­θ~3Σuu³#λ†α ~υ“ρߎξŸdΑ­Άmΐ mΗHΏ“8&d.ΊίΘο#έ@ΠήννΙΠοFχYΠzΗK‰α½θώ!6EνϋΡ}> †thΊϋCδόAtΏ•ιΩwrO6l€ΓήI—)ΪΒ.žc¦ϊ%ӝŠEΎύˆΰ Τ—|ύGŠQ-½V«rΗ΄ΉNρ°…€ΝHFG=Τvε°ƒGΑ)ΥκΨνW%δλi’sΩΑnЈvθQzΙ„dH`?₯X3 φeσ<ΐa“žŸSμΝτ4»ϊ^ I”α ’7όmJδXονXδw(呬”€}A)tΖΰΠ]ŠgDκ˜JΣέυΪi[1Ό@υγΑS’ΎGuηv£DI$#Žμ‡₯eΩΑΑάH…θδκΟΗ}Š£άQ2’έ₯Q½xhΏ€”lYΘ1ۏδW=ωr#DΖ0EΚKe]ͺGϋQͺο΅BwKf‘2"0Κ7QΒ]’Œ‰οcI™2*sΟ²pͺ=ΩB‡Ψ§Ι=žmλ0F’PL4-Ω5»œd·'ƒQΉϋr™2… $~’ν]ΩЏ |‘bUώι, όΥNϊΕƒϊšœXžq #M:_7t#-]ναyDβ…t;­@΄#Zη΄_ŸΣ[cbΊΛi_γ΄ίI“υ~β»j›Zύ¨ΫΡZΩ΄‡e9S©ΆΡ3©©L§3ξεn hΣ&θώζ½'?>~ρ·ηί ψ£”{ΊLζ ϋ•3—ΝΈZ°τ»aβ_,–]ΛΛ²·.Α³Œ6™EπΥί—ΰσ‹ν·&ŒνA {¬ŸŸ WΟΘΩlœΖ Q”ΟrϊT8ν_pΪ79폆ΰΞ$’d‹Nά¬K˜a­Ζ°ΌpFJAΓΣήΘΒΰήΞP&¦ r³† Ϊj₯μš…―γOΝΔiHΡc*―œ •t–³DEckIp%—ˆH‘X¬ixe’Šž»+―ϋ‡¦eΨ‡}ΉT^)ωfί rΈΧ,@„ͺq_ώά žγΡ―ώ>μ"ϋτΚY^—Ε£όΥ,Υ“$Rρj4H] OCίΙf=#‡ΌB­o.E0±榆x²L$'Β‚_x2 ¬±of|‡ΑΜΚv§ΘbP ’Τ²vXR+Bš΅dExe νΰ­0Ϊ²«Η₯ΡLƒ}±>f¬³ΐ*ήΞ͏δ\y4ηpgώ‘ξΆχao%Z=Ό ό[ΙΏ 6x…zΛχυ-ι|9Œ5tψ1§ύαί«^9W½qιUOαUΗΤΜιυι$8gO‡σ³QŠϊfΫφύ ’Ÿpޚη)}ΥνΜ€—!ω\t3S0½αΉxιͺμvlέΊŸso¨Π Τ†”¦“-πάd6@ΤmQψδ^(qφιŸ\›δ€δΦxα(Π;Ή«ΉNk ,ΡσΘΰPZ]%’w‘:–¬6ΕΤΜξi}Ώ–ψ‘Ž\oΣΆz ftθ˜.V'ŒK…j χϋζžžΐαύ{L‹4A…©j­ ˜eq6τΟO»λΏ°ύΗm›vΫ’»ahδrv Ν:ΫΣΡ[¨sF10ŸΫ½ΟwΫkύ΅]<½ΰ\ήβλ<Ιχ3“όGb‡Gͺ;8[?=–·‘ήρΓmόεT·<0 ΅ —B}―γφ₯¬qτΧfK7YZ„‡'6>ώ:φŸόπέ3YXω‘δm0έυ„;ώ„ΪΘ<€|}ϋωΣΉ¬φœ"Ύ“Œ¦ουzΆγ*»˜gQΜΎ€!~β|‰ EP έϊό`Θ™$‚π ¦YΓN&lΐ/™–316Ε‘œώˆƒΑ_πβŸ&x©€™σ¬%ώΏ~―[ώSΤςŸιŽΏΥsΰ~μοYπΏγoy{ώ6κω?Ά]Oφ΅Sι;7A*ρδ¦p$1α<ώ³*Ω‰-55Γ/Γk₯) Β‚°o{ώN•β=Ω‘„θZΊ …ίΫ³!,zAθ# ΡD»‡%§wbΐp_WΐιSτ¨Ώ•–ͺ' ž]|0θv$8»ν•JΉvƒ}ΰΰΟθύΊό‘nfβž4ξά‰O1Κη€7Σ ^ΪQ”Oόr1ΈηQΰβ9ΡI2(±Q›x³“X9ρK wεfHξ˜(xI8?ρ‚TmBŒD”eΤ¬iξΔΧΏΘ|΄†π>ώW^ LIςρ3έάΰ]©}ΧνυλκθΣ §|½$Χ―*πζF~Ecκ9šƒF#fsfsifsx source.fsharpΥxΪνkwΣFΦI -…ςhK[ @(‘XαYΪΫ@Λ£{Ά§ίvχlδ8²=It°%W’ Y&ύϋwφ?νΨ;’f€ΟθαΨ Π'–=šΗ{οάΧάΏ”ΒλJtΏaڎέ2۞οšΏΥEΫ–mω”έ~]β/‘ |μχ‘ΧΪΪΒ‹›Μδnr‡6™ξ7M\Τqά.Ψι™ΙC8έ?ηΫϊΎk΅‡>JφQt?ΟΥμ8ύ>²ύD½Ρ}a€άΪ–έ΅μ)²NlΘζqΑ†wiΓO 6ΌGž*Ψπ>mψiΑ†hΓΣ~Ož‰ξ—e ₯,ρYήŒg₯L$£ρΉ¬š¬ΟσY5/dΥdd£5ΎβkεxψBΊw\«#oςeξ&lžs7aώ*w6σ―₯4ν£~Ής©|“·›Ι%ΖQ §;μ%εΘεΤj¬·+©Υ.Ύ•‚™&ρζmΑ@Ή& „kαY;Άι]p] zX?ˆωΤjlτ…Τj ‹©Υ#ܐVς#ΫΝΤj ΆοR«1Ψn ΛƒU΄,»gΩ¨Ό$p“€nΫιξΗ 4ΕΓώpΠC2β”mΣjυMΛ¦O+‚JiΑΘ¦λΣΗΛ‚h(ZuE¬:ͺΑiΥͺΐΛiš›ΆΡ…klZcU˜h½ΈμιmA[wvΝψαA?R%OŸίh€TC΄Α=A*ZσΎ€6¨9°zDδX€ ίzOπ Œ;€RίL€ω½€£QΈ Ϊ΅λ Ϋΐ6ΎΥyE«ό θ8^[ΠZ? `K„1­Ί& χΪί#k”>έ©½•dΟu£β˜Φ¬ Œ NϊΈ.t€f΄† E±Gλ=Œ$}όDθ&”­mΗνλ"—Φ{*tΙϊψ§θ~&~Μδ­σstΏ ©ΘZρ™€i½a+ύΉ ΩyB«½xπ΅ιZf;θ—Ρύ—θ>#h*Aτ˜9υmγ ”hAΧ0'E ―’νYώnΩhγΦύ΅›eΦhFoF`γˆλ’±fi‚ q•‹εχ“ΐPjFγνν•;emΓΌύλΑνκK[›zkΎΉ\&€•5­±@ΐ5Ϊ0ΤΪKV)τ) Ώ(@ονχΫN/9‰DεKMτ°v³E ζŠτ.‚DΥ ΘEΛίΧmθYχχHθ;ΦΈΡτρς±‡ό42©—gP‘\„>θ’§jHgκ¦$œ]τ‡V­gΓxEŽEΣu½<μƏhh1Y=9θlIΑδ/Kςk&Ω(©:“7jCε’_I:ίZΚ'’'.°q\k$ΦTΙεJ–"¬ΤΓ s>ε4Mc:Œ+H).jP{ΓΑΐq}=^Τ†’H`ŽζT9u£‰f)•ΞλΒπT|GF•ήξ9W’ηδ΄-œΔ‘Υ$-Κ£«l4P³΅ΉΆ80ΙHΝ‘χoΨBZ7Τ¦’π ά ώ6ΑnΧzmϊ[6Η6{xϋ¨Vgb{νΣχ}n”2€ΏL€qQDš$E7jθ ¬ΗΐχO°N‚s°€Gήά’„nk}·Α’ΒA²MοΒ‰έLl;>†β!£ί‡`Oϊϋ˜δ9Β2φνΎiΓ:λβ.κ‘Β5Θφ‹l‚NŸ9RŸ‹σ‘ε3eκΛiY˜ "Ρ·:σa&Žn6Ϊ—§₯S½—2ΥY•€iΤDέ…‰Ž+˜•4#τζaκΏuu`Y䚽Ό;(Ϊb πΕlάΠ\ξ€·’HŒŒ€@vWϋY„±hoK’#IΞ°A?žΌŽΙΈ­Δ9W€‡ƒ^f~ΛvX\œΦ€EΊ=:•ƒfοHΐη‚us1Ω¦H1Ί #΄ξ7ζ ΏY‘ύκ’~cΏ5κΦΪ±U‘,Λ’wΏaKKΆίv›ψΝ†Yέ~R}Bͺωφξ&ί~pp8V '‰i.]ΔΈeΏΥΡΥ­^™;°G@JKΟzšW΄L9hψμ=€γOΊOφ/Ke, γS/Μs†nI,υ%³-*₯° „t±Θ œΉP—~[66Œu½BR5ˍ`oΈEQΌbθ­-Γ'“^UΉηιΆh1/0w κ‰\έ«YʍΘS1"053y$3Ή!‰3]ί:Λ@Ν\nh(3&Κδۏrwϋ·ίzϋv{θwž!›ΘμΤ'’ρcΔDq»:H„ΰΔ„I3~2Έΐnμ—Gω_ uζμN->HMEμΡP@X9Ɛ{>ρΖfεbχS3\Kΐ¨)])C¨”œ₯2­/gqc-Ψ›]k6+Ή”ΨX¨;]Rˆq=  ΌgT`¨φ(ΗΙ†α ΄ωθN$Zœ£©ήΙ-‚㐉cας3nβΥΡy8‰zd2•ύΨήφ)cΕzBΖ“:1‰IMχxqjε“>gK)k…3πο2jh7¬m|ΌΰΣCτŸv—όθY;»>Ύa;{¦k˜‘t>‘;£³Χ:dš‘Ι$Ύ]hΓ2Ρίiνjcƒ„ΩΘG« [Γ†qθYscΉΪlpυΚ ψ‡UΥ`Α^y7„ΎέsL X-–VmhΪmν ώG™τΖ›ρW2 † ώTxH=€…mό ο@ٝ°ˆ‡ŽWVGv²vΙ"δ_£ ^A…ν,„·MΒφ°ΧΓεψ΅cuΫVΕ‘—­–œ„Ώ4Γ†μ!>ΚΒ‘C!/Β€8|ωωσ>Ŝ#Bλπή D³ΝaΆΒΞkδΊV7θiˆ›e``L3’€'Υήoƒ„ͺŒΝj 4|G‘©f"DeΈB6Ε₯ƒπUpxf`x2SΘKKυφ’ωd…φcφs’¬Mlη8Ϊ£Κ°nΚΪέ PΦ΄H†Z±Ζlyz™dט“;ΟMξ?ρŒΨؚ­αϋΤΩu%=+gXM/p4=Σ”μ(νρ9­Γ`JΪη₯ΌFKΨΪϋls Τ ω*κA†’Pϊσηγ”FvŽπ 8Ο\Ξ§XLˆθlO> ώEY8―ςCŒΐ}ΙMωelPΩε;‘ΤŠ₯]κxίB½ξBxÁz½ι Aπ°oϊέ8ρΖΩ&IΠ „β1X·>Iα Μέΐήv\άF;πŒ_¨όfOΧ!Ɓ±€]δ]›}Αͺδ ’ήCν ίέΗ°}nφzϋ\ΠΖ„?θ,JΪΫ΅@ͺSι³@Ϋ&Tλ:6ωΨ³;¦η_θ ΑtύuρNΟiJzζΏφρpT³Ÿ$i,I3’Χς΄P%7Χβ "©cωή_qœ9ύ<¬―Ήρ™©³π a ǝګ¦„9βId3Ž}΄τjiD " ΑΪηκ<Αά-’*’ IА£R‚ψ ‰ ©ΰX—~ΒK Ef(N#Ωˆ7ΉΈ,„IΕ€Δ …ZΧα9'ΐ…&ρ}gΛA₯DλS&Ύuλ6‚ ‡Θ?όΗΰυυu\―Χ‘ώͺπ·nTρZ― ψΐΖ&/‚z„ΧλΈ†‡Ν‘£·ψ€|kaC7tl¬`cšc£‚Uθ- θ¬nΤΘι–τ ?Θ{eΘΧυq^.“š•1“ΐHήc(ͺΎγ:ž²’(W[©+ΚUΗY~T”7εOε?+Κ'y\ζ“‚4γ^ήψ!š†ίp(šςέΰ:ό;«ωB©&k.Ž§ͺ‚ζQ#1rΎ^ίΝ9vZ9J(z|r>Τͺ ³…8|ηn€cΡl cΒΈΚθqZΌδ-λ“ ŽdΔ8Dςο–­ΡΛ†Ε%g•ΛrthB£‘yώœ,)―L*22ώŒp3zέ7 ι,ˎψ―@ 7GNˆϊ ͺεj–3UΨY‡‡Gή]<9VωΆ”².₯©zš1­=κ«₯Ό2β?W\SίΤΏžDP^aΛ΅ΛΒ±€πqZ„:;­#ߚɐ…ͺΟηfΧί(ςΏ»έ€}>£» ΡxΝΔ>y½–ώάΖΟ1ΒΟπ~…ς6ξ`ƒ ‰aO;xeΰZΒφ΄Yn>)|\^\^?id_var\wint [+-]?[0-9]+nl_s\n\)nl_w {{nl_s}}#op_s;&op_w[{{nl_w}}]|;|&(?![|>]) op_w_pipe{{op_w}}|{{pipe_w}}op_w_pipe_redir{{op_w}}|{{pipe_w}}|{{redir_w}} op_w_redir{{op_w}}|{{redir_w}} param_sep/{{ws_sep}}{{nl_s}}{{op_s}}{{pipe_s}}{{redir_s}}pipe_s\|pipe_w (?:{{_redir_base}}|&)?{{pipe_s}}real)(?:{{int}}\.?[0-9]*|[+-]?[0-9]*\.?[0-9]+)redir_s<>redir_w{{_redir_base}}|&>>?ws_sep[^\n\S]ηxΪν=‰ΗΥk›+δ(α`[Ιφ l ŒQ“Άι‘ή4mZ­LeymoWʌ‘^Σ6_4ISΎ¦W€G’^iϊ?~³ΗΌ™ΩYΙΖψ«~ +ζΝΌyχΌ9φ?Zψ9=GvΫΎΡl//7μy½Ωh΅tΣΎe9m{Ω΄»7Ξ­jτGnΓ ¨ΑMaΈΑθyD ·lv1‚C’€ΩI@i§$ΐy °+zžΈ]τ΅αΜλs­vσ¦n-θ–έ5»ΡŠGΆ»§f`Ό{zj¨πPOΝmφφΤΜάΜΓ=5s7σ—m&ζΞ£Κ ΐ‘Η’gAΊύ”:,τ»OΨΈ:,π|Ώ:,0ϊ€:,pχ :μΣφ uΨg0μ!uΨKφ°:μe ϋ€²H{(w;"yTDς˜:,ΰ|\Dς)eRθ ePζ“Κ  Λ§”AA”‡•AA’G”AAG•AAŽ lο) vcٌςiUHΔ’*$ˆαUH€’*$R™c1dLœ1  ΛΈdB¨‘+!* @ KgBΉ+snΧκt-TΔ;'΄›d|v C…ΨSŒι«YφΌy[7owΆKaržŽΆ,ΫΤ›m»kΩ+ υ l°,7,’ΞEqΞӌ½λtMXι gq…Ω3²ΠΗ%Y΅Λ² hWd!@Κ¦YΛ@ψ,%)~5£~»CshF>Pιš\} QU>PθΣrυ>ΟΚΥ|Žυ‡a}«cbμš‹>ύuT`Ω‹1™>ΓλV>υsrυ¬ΟΛΥ²~^>υ rυ¬_ŒžϋΈυcΊ|)½Πγ6€κ9ζΌε˜MŸ£‘ΰλ­%wΌέ‰;ψ²" τψE@`ΕW'_Sζ|]Έτ E@ˆγΎ©QάuE@ˆαΎ₯ά‹LΘ‘μΆυ«eκσ¦Ϋt¬N·νθΞ’‹Π·σΆ²τΌ-€P½ΔDxβ:ξRB Ύ› π^.p@Ύ– τΒΘΪQž9pŠυ³κ°@΄κ°@±ο«ΓΉκ°@«Ήθ9’λ[η„„5U!NσB:5•A‘ΧU|7‹ͺΐ™%UHΰ‹₯ &ώeUH°ρ7U!ΑΘ·T!ΑΚ/«B‚™·£ηd,ͺνΜͺ %Μͺ ―dV9p2«γέΜͺΐιnτ₯BψΚ‚εβωLŠ7ΏP&§T©Υf ΫΈ^G”§‹†wυZ½ υαΫ)€Έb\―zF©2f”Λ¨Γ«6`΄Π²o5ZΦ|%’ƒp€δ FΡw-¬}g?VZ<ŸρΗβb΄ξM{ΕRuΈζ!|<„0ϊ―vNΏ\/Wύ―MοΪ΅²gΜ³U―Xž—^εΪ΅jξQΌ›aχ:έ4ο¬ΆωJ»cJ]iΈ΅HppdΓaFv*ΰυ‚ΚGHΙeΏ‚e?!$wΕς`ΜπΨΟp`Y0CS^0}²πΣ7”°ε?K‘žw‘'qηq―\—Jv»‹F7(pd`¨Κ¨₯ih``ˆ‘βΖρq,‘Τ"7Θ qB$ψΑ_-9Ibš=™Ϊμ\ΑKkΙ”]š€[Ώ‘•΄ΐ­αˆΰžQτ Γ°%ε‡―QΜa†Δ0SάNΗβfΪσf,_)”=žα ώf- )ΘΟ)†±ώΤΔi·όηΌεΧo΄l΅{¨aγyP ρΕ+Mϋ&`¦6ZŒ}βΐ @Ξ‰Gˆ±β†L)΄γšΛV³έjΫAKO‰”WO“π‡4YAx˜²;£ΣΕz†2‡ξτUτφπ-Χ Μœ;M -"Κ^‘ΪΏ%«φύBέΗ[>κ[K‡¦ˆ°Ÿ―CήφW’GDςςš¬ΌŒ²ΚexuΟZπΓnwΜ°=ΓG’γK@aGπΑΫ‹ύ>θΡυ΅μ˜ΐ΅D’ϋή¨ϋ€"ΝΓH>Ar:HΕUζΜEΛNΌB8»`3“‚ΝύΡ³Ό#G)–™>υ{F|πYŠ`L[Λά‘0wε1Γ -Ε¬m–8”TwΥκ6—Ά‰μIŽ+;lyœͺΑiΛΫ_<¦‰'% P^ןs“`8sZŠQBήXLΕϋ"8,‡Ε§‘n?E/<4\…vΉ Hγ  )ε(e§χΈΓΊΓΒςΖ†< w A€P툱¨φ%ςκλΤ s‘Ωζ4ΨV›†<‘ Ψ.=]{šg+Λ£Až#ή.΅/yΜ{Μ؟LϊiŒω6ρΤ„Βγ^³}υaνΏς'λПdϊ ΦφnΜ’PZŒ"€Όf‚1¬DȈμΣWDX@ξ')TΙ΄_¨{ΩΒ}\ša}ρφΑg΄4LgΧEH•Fς‰dR¬6":˜›HΑηρ˜$„뎱‰E4^†ΔΫy(ΑC[έ;‘ ‹L~ώͺ,οΈοF’W·ϊ+YaΩ€)χύθΛζ~RόΒπΑZΨ~IΎΧ˜as² mGηδ7w?hC>έ@£ΪΖσιa-CΝ)ΧeΩΑRΟ›](έηf• έφAθ§(2πfο½.Ι IΖ#9ς2ƒ;œκcEtΡΈ¨δΚ₯ δŽ1„pCG―“=›¦ Ωτ™€HHΨొΫΘVΨ‘DΏεD’|o"o“c˜$—Ύ§H8’%ΈΘ ΡϊΎωκž,bκ‘8).₯lq)jΌξŒυΪl²»±Ό–'Α87±ϋ£B§"ΩQ§&θI)α3Z Sx>Ν½YΌ«•ξχ-γ–qό[6εr^O¦€”)_ζ¨,2G2@χί"μ$ ΆΰŽΝ?ψ]‹Ώ »γWΰΞOTή,^*ΨΕu=u•Έ£ΰt:m§ΛwΧt»4ȝF­a‰―WΖϊ΅­θƒ90/h©b$ζŒ‰μˆΣ°Ν”ΌΕλζ,(§&ΎXΙjγz½:Υ2κuΟΗΆΜnƒ½±Qvΐ±š¬Ε’]ǐG†'ΰ…Κ&‹αΨΜϊΩ°ΩΐΊΈΖ¨aψsT™ep% ΣŒLζ›p δv ™†ΦΕ X fPh5κ!©Λ>Jτ€δ‡z豌JάF€ƒωχa€­ξιΗ%ΰγι2¨`Κβt=(pΖ—Δταδσ^nΟ103ΞbεθdΊ;D=0žrΙ5[ eΙ! †ό¬;N»iΊ.1l‡|cM{Τ7ŠHd)ZΘΤ―4Ν4j΅nχ~SΛΗaΛR <ΞiφUB,°’P" Δ%Š/€ΈBΈV£~σβΒ1\8^–[3œRbι–3ι λΤ©xή-$Φ-.S5“ŸΣμΟυ(ΐνξΈΌk_6C`|ΟͺαΫθ.υϋ&Њ»Z!ŒH»VkήLΧ†+š ͺ’Ύa ―τοm…kγπΪά,/ξU—‘F”{AΪβFΙ’2₯η\βωpώ5υk Ρσ?3C̈I«Iydαژ~–Ε5E²:•M]α˜Ιί^b«"‹@ΝG‰m„΅3#~εΣΪ–P©ό½OγHιΜH!“+ΠΔ&΅GMέ€0FΪύH#"σŠϋ¨(:w)XGΙΞYo¬gHσ‹,Μ_΅΄\a™Πb?\Gβ³{·fς$ /Χδ6έχ+‹Π‘§&rwA_ŠEώηΓeΈ£ΕΊκ‚ ΩΙδη9eŸ§ &c”‹EΟπB¨φΝ3_ΠdMΛ&,ΈύT 2·±0?”Kί—Χ΄ύ¬x3Ξ•ˆ½pWΈN[Ξ{Œn*n9›;DŸω{μ]TIΙ#9τENΩο8eΏ—iυ‹ž₯½ΆS6ζΰv'j§~mTόνƍΰˆxˆρΊΪΖe,ΈόΫ‘z ˆ_ΠšΊ­o†„«3η–ΉυΘvΏΒ){‡κagά Σ_%+ψŸi±HΔkYρΕ›ˆίσh"‡r2-«iu… ',}ώΨ—nύ;su›Ι–x33IC1ζλ™ŒΩ7™h‘Ηšo°¬ΉͺN£φJW7ου§_eζΌ—ƒ9SRΜΉžΙœ‡β&‡•Νžoυ=¦γάφψύ*³η}¦ί)Ε~Σ³΅i"mτŠXHηJ’Y” GD5‰ΡWD„™.*iκl ‰`ΆSV™WΤdv‹§¬ΞκτŒΊn…ΧkWlιΡφρwΘ₯S0x 'C]λΝμμρ?Υάγο:¨v£k>¨μA›0>ɝŜ!jl8[†cΩx―g¬'uΟL*"˜½,ENq“ΉΜΒΪϊXUΙŒ6DԞ'—'ώ>ϋcώŒνˆΔ(= ›χΟ­ζϊ!Ή››vΏ ©»ή¨mMέ-%£~^Ύb‘Sφ§L~&ΐsUK)½ΐ Ηe‰ΘΓz‘]ήΨν’ίsΝdήξ±Γά’Άιͺˆφ””hίΜ%Ϊισ(žp·8eοk=Π1Χ€κν;μYRΞ*t…Xύ‘ϋYρΠ N₯Ρp"4ιGλΖυ±^ό> HχI"IRrdυ”s,=WD‘η΄G†0δΑoΩI*Vϊ˜ θ»inq!ΙλsHΖ_ΙΰŸ©φBΝρLΙhΆΪss¦£‡!³θKΝ‰N’ψo–λ΄[αŸθ Œtκu-ν#βκίΘ €!lhdA]τsη4ŸΪgp[Ην’.8Vp `5γŒ€‘;=%ΉτWλhΕΨ(WΖ²o5Iλ1έJ Ή8i—$Ι\ξtοp·K-]¦ιΠE©Ύ­E»“xo˜ΒMΌπκ6§μ§μZnZρ„TQοwfh…κi₯ΤMOΔeΝώ‘Ÿuε£4ρρρ|ϋœΒNεΞFe™"²;ςκ {k!ΙϋΰΑύH;ɁaσΠ£BušPΕ±œ#½ο’Π5ŽŸ—θΆοJμqΚΦ9ewY%–%RTxΧfͺ0‰4Œ‰άή…zGŽ;‘ΓT{6ύ³½§*αn.•έ[ŠQΑ»&`o$?'Dωυ³FΑX­—·„*Μό„AŠΪŒ’|Γc:v3ΨΥ²Hς‰«7¬L›`ΏΕ©λπωg·½β [γ.™œ›ξΔ^`ωͺ&_π‘Όιj}|&ۜiœ2ƒiHPly5VΔΉ«Υ΅l/ ΐ=σΆΩ„I»UΥΣΛJ[ž°Ύ'eιm·?c»ά΅–Mcn  GE'δςˆΒCoΈœυͺCaΓ;ΣΔ…’%ΈCͺΪ~Ÿ•…Ιs™#R•ƒ'’”ε§lœΛ\? zΞξΰOpΚtNY…Sv6ΊΤ™fΨΆΠΐ ή δY ήBΫρΒ—rxΔ½Ϋc₯ZΈε½O·Š¦_ζ₯|—¨TœkάcΤΨƒαεν00œ€ Ζξ˜hΛjΏφLίjoœx”ΧC±Κ’b­L¦‘yŒͺA+Φ‚bK'©㖐ž(6uŠͺAlδ ΥM±΅}T β>uΜAΕφ₯YŽA_―Συ΅[Ϊœ#BΗlάτ|Α³μΣsΜξŠc—sξlηΎ ς΄4ρ#<±aTΡκzUζΜsΐ~Tς|?ΎΟ'U»§Τϋ―αβ3œώ7ςH\©t^rCšΤ‹.πšτ?Β ?-Ÿφ† œZΪΐf”ύ{a21Ό¨q‰œ{‹;#εT`#Βαi΅gύkAω=YfΖΗc9Žf%,γ3ih‹–‘z9V{U4ϊ‘ύΨu=»Γͺ\LŸSŽ{– Cβfώΰΰ9iΥΙφΨ»©KKΑzϊ"£HC{:kv‚0αΌ39’©/‰€Dϊ,ΡxŒHMρ½HB¬>KΥ€[nͺWόמyώ»—ƒk¬n»'kDζ8P$2*‘ڟK“«9™,2η΄|ΪŸ”›„vEΉk–ΔiŸŠj–rfEΖ1ƒΌ\ΈqYυωφŠŸΑΛ{wΡλyυ^η’›"•ϊΛ07$‹?£ΙZζ‘όXΫΠ—«HΡ<€jθ__ΫΌZΰšŒ"-ΒΌlA›SΦα”½Β){—j]'τ‡ΕΛ@iΈ+<3ρs8e.§¬Λ)ϋ³ (‡"ΎΩ–¨d±Ÿσ\UβΠέ—©ζˆ-s“U©“a_£ΰ‰ωΏ³Ο“<ΏτMͺ‘ƒbIΘήΒχ"§μiFΒ9&vφ!ή‚ζ…σ βGχΎo+]Λސ½9%qΚƒmJ—l‚:(!7œxι±Ϊ7έ³ΰˆς_·(5I’|SΔ·5°DΤώ+dh R‡^’j({&w‰œκΡ?žλ³ΕŒCœGΣ·ΠX ™"άl΅]SΈίΰϊψ¦ν2Ν|O2«ο œŠQ”r*ίΥR φC£¬ΈYc-Έ˜b=[gf5žγ­U7~sgΜœ]ύ#BΑ6‚ 4ΪDβ‹qYξs`}ΉA0Ζ,>=6,qzLΔηZF½Ρ‹QŸKΣκUβ›xAR“SF_G Ξ κe[pΞ(ςe!Εl’,sΚlͺAι°”·Αδ”-pΚδCUμβ#Ή–~qœ²-mΆϊ{ ¦»†3Rw‘βK$Υoi܎Fϊή‘δ&κpŸΨ΄#Λά›¨qπνo’ΆΓ(δίGM:HΛ&R·M ˊπ±TσLο%1ζ‡š„‰“ >ψ…΄%c­\ΒΪT.€πΆϋ€1ϋŸΕϋΔ'3‘›C‡ru³vDλjmrr 2c-0…ώ"¬α³^.ηάΞγο*_ΓΧT·ψf½XΓ”ZΔ[£°Ω’3fŒωsίΰŸΨS μΰΘ$IΓιUΉ4Ξ<ƒ0+kΓΡ3ωDIF€εWά„€α‰/aξγ•Σ ΌΚrΓΉΙΘXš#Έϊ~»Ό٬ƜΉ`;έ[§ †1V-•ΧΦ‘!«£π΅θMœ©ουόZwOG_nΏTχο³ϊσ }‘Ύ691΅ώpNΖσ|ψη ]ιBXϊ"]z),mΦͺϊέ\6S΄³4ΣθΫ’mΦˆ;&ί•!vαά€€d¬ωcMvψH£μ‰œ©Mœ1κλœι—νΞ­ΝDuΖΚμB;;εmΏUdώΝ΅$…χ¬>šΟQΡμ£g€Z’FIγJ§ s½Ε[X¨jθ&;~‘Ϊ'ͺΝrœε4ŒΡ|„σœζΧ(O К1]ΊοGΠqš£Ή~}ί’”~“~¬η΄,HŠG‚ΉpσQBX-€UϋIΟύΩ1„Ό£˜b3£g)Γc œ–y„ƒ YΰXˆe—"G©Ω·ύ³cˆaΡΥIΣ ’ R’‘ΤΕ@Αά±ajN…cο”γ4φΓqύrלϋaSuƒΈ€ΨljΘέ;οϋazڜϋηγί@χύJΛBͺIpYΗA΅\D4°Σ+ |>ΣΤάHΑ;’(Vz`‘ W0κΉχVfσΒgώzn|ar£ZΠCE€ΑŽχΜ‘zžπ S‰τ\46°jz―Ργe-‚9φΒψΠ?νχ½ σ3„Ιt²8χαQύ§Λί^)53ΣrŽs9ΈWθ»ν;M‹&)†Σ"PΦ¦Su5Lοu‡˜ΊΦΉθχws fίΕΩ£σNfουœ~zˁϊι"άr€Ά}ραρpΰΫό6­ΒδΆΆD‘ι&²ό/*λLeŠB6šJ†}q(θ»> Ϋχ^ψϊ5M“›ϊαΨοKε­a6,‘ψL΅0yj]`Ι C)ΜΟͺφ-ΎΉ¦yˆAͺλΥυΛZΕiަ8(nΐΪΜi\.Mٞ5d_΅4"AI0w˜NΜξYcZ˜ fΨpz½g #@ζYB"RΤLMiŠy0πMΎν΅πM›==I7σ[(Φ#[8ψiXuη!ΛpD&$ͺΤv…Βώ’Β₯βœ==χͺ@Ω@ΈbO…=>8dΰ‘fz“d3τSx=πe­ζMβͺγ3”EMέΖ­-ΐqRά)ΔKΑ€L#ΙklΫͺ»ίνo«Y.P²V_υΎβg'‰,ι7—Βn‹˜ΔI¦¬όi"idΫ8m‘`o+¬ο½Χ[+€»w―7sR{††?Ύώ3τB\¬^οτΥSΝρ^«_FΨ ―5/LΥCB?χϋέLyθά–όΚΩW«l gΎZ§ζκύqC½/ξΔ»ΝYΆ‘ύOpl©QΎΙA‘G&' QςN\˜Lc#όάRpNδ4qΝC'γcͺfτ€§kΒ΅^’έξη—¦sH(ΝΪΌNš»-nν 剴£ΞDWYχoΙ¬ΜCŒ‘iΚ ΚeΰFRΙFyьd8ΑQ$FήΘ πž«κ:ͺΨ s|Ζ31©z7Χ3&-Ί‰,\Ονeβ5q]ΙoxŽ‹2O%p(#0‚p‚ίA9œ9„σΓ2%[IžΌn ΐοζtέ1XΧΌ“ώκ„Ώ>©±ί6IyΨMβΚξtτ²“έ™?7β(°α5(σΩππ\%N}ήγAθΫCq+ΝΛŽΟeG‘^‰ΰ·&«uLžPˆv€±%ΛπΚ•ˆ η€ϋCy esT= ͺ‡κιψΨΏέΏk‹ΘAiΜiΞρ%O *9-ψs#S κ|y·—W‚Ξ [^ B\ηΦ?5΅Έ€§8}E h+„†xΑΥh^§ψΌ*€]:VD˜?S“ΧΩaτΧMΠY^­vοήaγU£ $₯…ς%‘§$I98XˆpՎ&ά(>΄=ΛΩΫL€ͺ4{Ϋς‰­¦ T&KA슁¬ΰ˜”Δ’³ πΌ6Y»-d=2Ιͺgk£μ‰EΩΚ€%Ώv;)ί±‰ΰN‹{ΏΘΟVDΕԐBβάθ©»}ΥΟρn/ Ρ"ω ½TWd ρKSˆz’a‚Ζ8i“δνi}μπTΞ*₯zξ O”N r"―²Mϋ›cΡkΡ(©ύS l*θ2 fv‹ΩNν§΄ Ϋ°eTQ%\Ψ Q`ΈKr…œF˜Χ3pΌ€+Τ%ΐ‰Ί#gθͺ<Άμδ1¬;Ωσt…=QB!ΜΉwmκΌM–\ TεπνΑξΡ Μ )ψuN ξD·(ώΕ XΕ@†—Χˆ}’”lφπZ ‹^Uέ·A·™ ΊΆy!ͺ­έ•Κ+8Ιηϋ \W=ΎZoΧc}«œLΝuΕιΊνD—ΪΘͺmEUϋZ‘Χί\ς Ώ©]$ž@r,r2{Έ¦’©r#qtί6OW†λqP‰ ‡*! ΅3Υη-`ͺήΞ­—@?jτΕzŒδφ*Wϋ«ϋλ1•“vιέ‡ 4έΉw΅iW»ν#P±#γά{Ή~Δ,έλνΡ Ur\‹Z>·\ˆ ‘Ν]ΖaUΡXΟ…Ζ~[]GiεΒα&±ηvιή σsqhΑYŒ=ΊCX ˜6ΨT}ΎδrεAAΘl™Κε/PΞ„žοΨ΅mσ €Ή3ŽΘMα a JΕ5‚Œ{!ΚD?Ly,βEHrx % X„†|Ž A‚?.ϋΛ<]€ΛΫΑσ7<#L`Ss ‘ »+Ληt;А‹+Ά0 Τ«ΊΌδβ7ψΞ NΞD5B|Ώϋ–‹^πqv™\t‡οl;ΈύδΔ Ε?”¬HT›Λͺ'Υ;R]ΑMCΥ§#ζη<²MΥ›Δ™$BfFg‘@XtΈ΅œάlοgΌΌ%υψ«cς·"ͺ­Š¬8NŽšΏ •?mΧRUυ©νΐ1™Bέ•γŒ‘φzf%H–"h#lλŠe ašΎ―+bΆ ­•gOv-.9ΟξoI}ήχ*Žqu.OΛ[]H>³΄­Q½υJXΈ½ϊ_Δζ‡ΫΒƒΛΉ΅nGΰIad³υ'ά:ŽN?o±™υΞΠPόIΓ%Θ†φ€ΩΌΣ>ZΫaςιdFortran (Modern)f90F90f95F95f03F03f08F08source.modern-fortran attributeΆ(?xi) (?: allocatable | pointer | target | equivalence | parameter | external | intrinsic | save | optional | contiguous | private | public | protected ) char_lengthF(?xi) (?: {{int_literal_constant}} | \( {{type_param_value}} \) ) char_selector§(?xi) (?: \( \s* (?: LEN \s* = \s* {{type_param_value}} \s* , \s* KIND \s* = \s* {{int_constant_expr}} | {{type_param_value}} \s* , \s* (?:KIND \s* =)? \s* {{int_constant_expr}} | KIND \s* = \s* {{int_constant_expr}} \s* (?: , \s* LEN \s* = \s* {{type_param_value}})? | (?:LEN \s* = \s* )? {{type_param_value}} ) \s* \) | \s* \* \s* {{char_length}} \s* ,? \s* ) construct_keyword<(?xi:associate|block(?!\s+data\b)|do|forall|if|select|where)construct_name(?xi:{{ident}} \s* (?=:))declaration_type_spec_part1Ϋ(?xi) (?: {{intrinsic_type_spec}} | type \s* \( \s* {{intrinsic_type_spec}} \s* \) | type \s* \( \s* {{derived_type_spec}} \s* \) | class \s* \( \s* {{derived_type_spec}} \s* \) | class \s* \( \s* \* \s* \) ) derived_type_spec(?xi) (?: {{ident}} ) eol_comment (?xi:!.*) escapeseq(?xi:\\ [nrtbfv0''"x\\] ) formatdescr4(?xi:(\d+)? (/|pe|[aeigfxp]) (\d+)? \.? (\d+)? )hexadecimal_digit(?xi:[0-9a-f])hexadecimal_number(?xi:{{hexadecimal_digit}}+)hexadecimal_string)(?xi:('|") {{hexadecimal_number}}+ ('|"))ident[A-Za-z_][A-Za-z_0-9]*int_constant_expr (?xi:\d+|\w+)int_literal_constant (?xi:\d+)intrinsic_type_spec‘(?xi) (?: \bCHARACTER\b \s* {{char_selector}} | \b(?:COMPLEX|INTEGER|LOGICAL|REAL)\b (?:\s* {{kind_selector}})? | \b DOUBLE \s+ (?:COMPLEX|PRECISION) \b ) kind_selector…(?xi) (?: \s* (?: \( (?:\s* kind \s* = \s* )? {{int_constant_expr}} \) | \* \s* {{int_literal_constant}} ) \s* ) modifier,(?xi:elemental|pure|impure|recursive|module) octal_digit (?xi:[0-8]) octal_number(?xi:{{octal_digit}}+) octal_string#(?xi:('|") {{octal_number}}+ ('|")) program_unitS(?xi:block\s+data|function|module|program|subroutine|submodule|type|interface|type)specification_expression(?xi:TODO_NOT_IMPLEMENTED|\d+) stmt_label(?xi:\b \d+ \b)type_param_valueN(?xi:) (?: {{specification_expression}} | {{ident}} # hack | \* | : ) valid_range_symbol$(?xi:[abcdefghijklmnopqrstuvwxyz_$])@!xΪν=]“ά6r«/Ÿ%ί·εoŸEieνP«i%Ο·φzO–ΧΆΞ²δ“₯;Ÿ5λ1‡Γ™₯Ε!G$G»λπžSIώ@ͺRy½Κkͺςž•‡<$ι’³šuRΚ¬JC¦4Fw£<^’oζΟe'ŒΒžΗΞ~ΫύΤw{'υ!ρΚώ’όχc)OίΜ‘όω’γ:‰ΧKΌΐsΣ(.€ζΟ_IΐΟ œ˜ΦξO γΔs‹LΗfΘ΄Ζ2Ÿ!ΣU–ιΔ ™±LΟi ΰά(Lxκ¦E[~Ԙ·αωΐχ“ €9Ξ§ςη«%ΰIbgά›KhΏΠ žcώγfπωŸδΟWψ4ήο%©“zcx/Πωi#pŽΝΟςηλψpΊΨ§m'M1CRTπs-1yΧ ‚ψΪβ'Ρ€ν€mhs;Ά?τŠΏΤβ?‰}ΐZΣάσηi <ަPv?v\Oΐό΄σδρΤ‰½πKZΊi ±Η€>Rzg₯ša³₯L¬ΎηyEzγh0 Šf¬° ΝΑ>Qš Α0A|ͺΜ­ώxψ.°‘(ΔyKΌ<PδI ΏW±` %,>S ‘?Λp·qΰ‡n0hΖμη*–@žΧ¦ŒΥή4a wζ“A)Ά)Ϋ²,w›d‘lΛ²|‘pŒ/°οΆ?(s^jRμp»§tώψ:¨Gn)πΛόyRγΥάϟLu¬ …Η~βφ†A΄‹"/#ŽΜ•!ηcη·Η^κ0 ?)ΐ€Κφ•Ro8 ¨‘ŒV&σh$΄―•*Ωοε’ζOfρE0WπbΊω“)•Ή*οφk{ͺtπ‰Ο©Ί­T\Vώδ7Κl β¦ ΠΚ“’=e\Š0=/Ž£xΧ‰C‘ΧΏUζ~)C>N¬“?—+`{‘Ίh.<ς ν+<¨, ΜUΔ³dς•?™ώ?ΡΒ ‚Z4δNAΕτΈ¦μ)ς"φi¬ΡΨ† ₯E{‰ΑŒς'S„¨:ΫΣk­; ΧKFς•X*ε»όωΗο#΅qζd@H:c…‰’i(’‚ cΔ‹$±C₯Τ©Ž‘ΒŠ5Ηΐ&ωσρ’όwDaΎ\xκl±N>«c–£bΜtΉk³βZœu`*žμoH „WR|#+“x$ƒͺ&΄€AϊΈς|‰r­Ν=½Ϋ·nZέ>Ηρ ο‡ Ξo’E:aΪ!ξ4—£vŒΗZέ½ΔΚψ•¦‰‡έ BNSΒ―„Z(ƒm«›\΄ZωσαφΧNϋϋή6{ΉώνφEΫ²yσ)wDOœΨw€=;œ―*G•ŒΌύέ(t˜|ξx0”‚„eS+δz=Rι~A©Fή”LΖ“ŠκΪέdΥΤvžϋˆ‘ε4₯Ξ¨SxΪD̎–{Τ.%…―³—·LΤr£ ΄»MΌ¬’'θšxmAΗγE ™Nώ‘šρΌΐ_ψaŸjmŸ²,ρ½ΫΏωι{7nήίΊ,HxNό΅&“'MΔΏΫ[wπΟ².–Ύ~ξGw{wξήοέϊό‹Ϋ[ŸoέΉΏυQΦ¬Ϊ§2Ρχ¬΅lνΐ”F ΊΙcύ”}ŠΤp‰|~vλΞGj΅PhΦέ…‚­,Gο‡@(Ga½@Κή΄jπͺj/0oμHb{S‘ήΊ\94μPλ'υΪ«ui!Xwχb‰+Ωr Φaw·Ν;}“ΰ˜>Txσ.VπUv jψdλ^vϋξ'·nήΈέΫΊqΫF‘ΎΉ^T€‰l,ϊ θHM™κ ‡t‘F΄—²PRPRτ ?)‚ΦGw|x{ ’W-Ω/ξmέΌυε­»w Θ>kΚJρVY,€ΔBJ,€Δo)A mΧ =έ”@½I’ω–7–vΧμOs3,Š‘GΤ+2Ξΐ/i-"QΗ’4Vn(βλλΌσŠr˜{h:ΤRlkTDIgomnΤ(Ώ3v'TΤ-Q·δ‹ t• LzyΤ ^^Φ·|Z.«ΜZΕ–κγΔ}i¬ωxΕ–ω"L«ύeΥ"~€*[Ε²Ύ«±εΟR‡Ωψ`Y£ΗΎΣχFΎ¬¬λϊηΉ%C ίΧG’UFH¨©ΦdˆΦ +ιΩΫ4³UZŸyΗΪά ‘CΈ²·OŠf2ΕΫσ†a‰H›†ΙσKO…ψ±&ˆo-)φΧ:_}ΈϿ΅yD..‚'"DΤK™?Μ¨«+Ϋ~E—@α¨8kh47nk›~Rj7k Μ ˜―`„Oΐί3θψAΰœ`ιΨ!wτ›"½j†φl6Ύ‘§– ‘ž•~Ι8hη~Ψ6ϊaEαίkΌ΅ς%ι}τΦ6Fχ‘Ζέώ¬ΓΙ$Υ~όΤtόRDŒŒŽ|hdl/£ nYN€¬p™βkώ#Ξξψ½½x~_ς΅vRΦQήΘ1?yκ–²YIΟαG”Α 28£DΩΉ$ζ`s­Έx}ΰ©Ά˜—t£_Μχ3 b]~°ͺ= R[χLMͺΓ NΥOiςΐ±ώ€•™Όœυ~Q­Λ»ρΟ© —h"· ιΧ*Xν„˜ ¨b]»Κ{Ι}Υ+] πUσ₯χ μš‡έΙίάώKo»»{ΆΑi 3ΪF}Η΅*Ί@\Σ7uα²ράυZD‚•ύΌFŽΝό³$§EQ$΄4O²QΦ‚ŽQm γ‚£~­ϊυ‘s>4 \πlηqOFσ1­Έΐ dW₯υsαZJΫb5Οs6―Ÿ·»‘†‘MςNYμG]#_ω/δyΡ"ε‰zΧ[JƒΉ,&U6ιη4έξ$ΐυ~ςHWŒŠπ††˜tp%B\aΑjXΦ`-Z 6ή”Ρ“ΦkλρΫ>άΥE-“)Λ©"’&SΖ‰€œZΖ"PŒΥ՚.’%5³O_Yͺf»Q]ML°W—šΠ܏XxKi:=1γtϊΆeΝ†§©3^VδF‹zΰθnύLxΈ‹΄M™\²E@₯žLΣ4wάXω¦‘d+>bΘσΐ€$‰¦±λu@ίχβ°-°σ‘₯Ί?ΎΆΤGς·t΅ΥΚΓΨ½lΰ±W›ψS Ÿ-y‘LΡ@£}Υ$ ΜPνΰ:Φ¨Yά€m]V'χJ‘ΪLœ,5&οiN^BέB•&α†ΎάͺjVΔ^ό†ŽTξ–±‘«ZπΡΉˆoΆh„˜‚ Lώ^ζl½ρ–*O0’Βζ<… ~«P$ί4TŽ™j»ζHγΉ!Σ,gκάHΏˆFΊ―N¬ZF»Φ)κΐ9Sƒψ~ ΣPhb/7λ‚ΗBkΙ‚Δ7§ŠE·V…sŠυΠΊ œ³n‘ε2’D°'‹(y)δl‰b“EΤwΉ/Κs°ΐUΚkik ξQ6qυ~6rΎ&2O⇙%˜ ΩΨΩΛΖ~h7~ ψί«έG—Έ¬šktρk•ve•βνJEΎ «lu ΈΕQ=nθΧΣjΟTΨΎΝDΎj”hκ„ϋΌ ŽΟžΕ؍άⲩT†©ΕAοΓΰ£ζpKšˆ­zοΤΡΖξty†ΐˆSd"ΫΨcΜ €FΞW‘ αχŠ2 Έ_’mWKXЍZš³¦αΰΒIφCΧ¦C‚¬<ŒaZM²±7Žβ}[lρ[πJ±(½g²Jˆiΐϋφ|mίΚ½Š7uƒ VCLψΒ57„Mj Eζ3;ρ£ι€Σ‚AΙCΒl‘nWXψ‰œΡOa9ΐΥYrη5>=lƒΎ Fζ%Ÿ­%ήJc|_ΗC-Ί%Οf_/Ϋ&‰? ΐ Mm"OΣb;Zc['‹1@ς€§•?EΝ–ζh'“μ˜δθλš™Wιψk2u˟$κόͺŽτ«:σβpiΫ σ*.]+KΪΫΉIt^UY²”έxi€N’¬lw<½²sUΫOy³YtέpΚGŒ€c†Ξ{CS¬vΰτ½ΐΤΛε.g=j`q‚Γ g#ǚ2΅ΘΪ’k ’b³ž’ˆ”Ϊeg“L²›1›Ξ݌,΅\’ΫQԈ*BύP€Φ3ΌͺT™Jͺ-Β6‹Σw6½τΡZ5mΛΚ=!¨›bš5‰Θr,yOaiΓKΙ+Έ«|XχB7cŽ/ϊλΌ…N@ΎπM”δ[β<‘9’ Υ†πηhMZݞDίɎ₯<9ί­„Ρoέ~ΙςΘ Ύ%θk#…Ξ軎igΉϋ§ήmPWε1=³CFͺ.¨ZΏ±·Q£³›Μ/‹ƒGIt0TΛ2Ÿ„'xRznFX§‡OΖζ2κ¦q’ˆ:-½ιμ%C«ƒβ5.ϋΩB–ަΨή™†φ?_žP]lΎX„U/ΒͺaΥ‹Ν )± )ρLoΎ°m­ξ&: ΄Ϊ”V£ϊΟ£…FE—cŠή™m9†9큉˜ν` "‹Ϋ±ˆO_ΐΨ+ ΊΣC²ADΧβh)π{\J ;(€«θ¨κ,κVκ³vύtΗB—ƒS¬3ρ†Kε”βxSXτ―2Δ²\JE‹­)XhΚ%mΨ(ΠΠ lO©7p%΅ΖNκξXιŽΏ§ΣαΠL=+ νξ#+Z±7ςφ,Π±-'΄Šσ„r°~'μαo=mν<“΅¦d»T΄L™ͺΉ*dk ο”V—J)¦b₯B― Ωraoα‹}J5Q¨Ωi‘N¬Ν§[8|έΰ7DͺmttvΗΣΟU»+œŽ½ΨwU*sdσu/ 2m'δͺ4˜ρTƒjaτO‡!ŒΦ‹£Bψθ8τκ΅z‘T'†(―—Dܜ6gD~ΩΊny ›]μκJ 9;ž3@©γ ό;€ˆ‡πXB`Ϊ©B$Ma1―Hλ§ΨθΗiΎI#υe³ΏΞΕΊ‚hδΓ―•ΐ‡ΛBo™…Ώ7ΐ$?ρHΒ€gi‘œψΗeΖρgWf˜Ύ„΅_ςžΝ²7©>¨oΗΘTΙ«ν%U^1Α€*Β‹?΄Ή’E‡:LΌ/Δ7˜όV\ο«?cθΊόπΘΩ€φeΕ/ΩΒ£'σUˆUsΐR­Σέ~…Ελ °dš•\4Βθ,ιTˆ³€ά­a”έ @ρwή5ω¬VE’|”P:gib™ζΐoVπΔIξ{";ΑDεε&αSnρ΄˜M?Zjj6ύ£‚$”Ορ<›½—ΡeΗμBvξΕZPšiyΥK_ΪΪHβK„x‘1!,•=ςdwœύ”£ί4»ΒMόxNÏ<”FΚijωO«Z.1πM£π'Φ\K]†— CF»-·›‡$2­–& ΓΩ΄ž₯?bαεQ₯FΛ{dβΖyM kz]S–gšύ^—»7_`nΒ\dητœpoΜc8ΑΰqΏσXζ–₯$ϊRrΟOYJΎ Όλ6y©ιχ ι ι_ί4€ ιΎ!ύcCϊ'†τ†τ›MeΣe-󒯐ΕΠƒky(F§78ϋο)?ΤUSŠ€).ŠΉ$P1”Žπ­“bw–*hdΪfς;CϊfSzKΒ’{ŽZ™-4ΩΊ6|΅u§ΖΰαrΒυ ?ΎeΙΤ¨»KCdEFd₯z˜¨‘/ͺ‘"οœΊbΏ *Œ%;™uΐ'ΨW;ΩΞώ$J³ϊχj=ώwΙGmXo0ψ30l{δ-ƒ@΅#ΉHyφQή§Α­?Εj”‚r… 8d“˜ω3Ξ|’\9α~惑̟ΰψ>ƒ’ύΰϋlμ$ςg0§ŒΌ^ίO“,DœΌπ€„ω΄αަ ޞηβ<ΔKjO@4*]ΡKόοAŸJzE@Λ|ωPΫήEέmνόΌv?ίΉžΕžΐ|δίΦΎΛ"[LUs[Ό\υο5U»;`ΟΊxΘ-¨$DƒρoΉ‡$†ΠΧ§@B)ηΕIUήΝ]Ϊψnެε»/ΩΥ΅»Ή›ν˜ϊyc!bΙtE"μΘηξ³z«βMͺT…ξΉ¦hž—'9’’|“dεj8™τŠ™νΈ¦Tό“"<Άΰ ζΫMT•ηΨΑ']£%.’&‰ΎEnh‘•7rHFvt“W鈠ΣΚ¨0μ’ϋWmρΈˆγx`uθ„Y荀‘Ÿx=”ύN=žϊ^J~™€ο‘όŠ6ύ§ψα°ΘΘζ)ψ3‡ύή‹£β› J~%±»ΰζ¦Ή™|€ΡΏ¦mkθ+I³4’5M'΄2°ΣwΓΧ₯οΆaΰŒh―!OL“wΫ]mρωYCΩΐβ`VΫΟiχfι Ϊωκ큼̀aς”iΛξ‰:hC/ικAσ€¬sil’­½Ήίa˜·8Cž$γX—΅Ά‡DΟ’Η1†ϊΠΞ“œ4}ΗΑ˜F&Θ²yΐfn4Ωοαΰͺ.½bV)nh£b”Φ4ςRπ*₯6ε6ΦΌ¨Δγ΄‘ίh·νΗT›’Ζε‘Ιρ‘ϊf ΏPε©-uM­­ ΅Θ€JϋšΙˆŒv偩Ί₯ν3P@ϊPΕ^Ϊs† €€ 2Ξπ€Ž υέ~ξΊσ=šΈώ©ώ<Ÿΐιœesv;˜ ?’‡αzdԁ„ŽΞg²γ«ηρ)`5€%Π@N7ίΨω²˜pA£FβΚY`ότ*ςXg υ“ΜΑ]qπ έο„ψιŽ'ΑŒθπ;%h‰ όq6οευXΆ±έ§G.Ιθ؟žΧtϊ΄ηγ€ |E1uάFσ©Νd!‘Ψ‡δγ*ΩΧK,GXΠD ―]ΙŠ˜’„#MΚωΰφ-n`ZdΞΰ»iv!}ΖIτιo>ύ„!±ΦaΨΛzœ`X`XНA€}6‰ Η; Œ0“ϊΓύωΰ}NƒwΰΝ‰=>ΥŽ"ͺZxT’œ"Θ±y  ͺΉM7Ÿ  …́zΘΩ7ƒ,θ£ϊ‘%;ͺώθɚ’”ωΤ}^S7qβžΠVΒΆΜ§‚ίθζmβ·ΜΌˆ>ɈsxN5^QΜΩƒξBΗ|ͺ±uLΑΦΑηΤωΥ:¨υ“/“ΰΓλΘНšϊc`Ύύ°rq]›ŽŒQ˞‰E’qΦωϊ¨άΣo‰§Ε•λ£M—E¨ΩςαCŽ*£:JQ…TUΩ˜ΐΌƒΗ ?;|Ό1LΙPΒ5 !xηbΚ7ŒrO©ΙΒ?œΨ?CΨΛΞ"|χœ²άrλJ7—Ξ|,γ/“Ά‚– y«Lξ`ΤΘͺŸ‰Η°ΨaΩβ1Bξ’νZl]l [l [l [l]H‰…”XH‰g}λhώCs³K{μ’>Παχ:S ,­JIΌ‚₯CM‡J— χ–T%nύ‘Σwήp΄γχ(‡Ρδq VΞ“έ½ύο{η·ν|%―m ·κ²ΨΪ°ŽΊ)XΠβκhΎ°Ιcs:RͺšoΌWΚu쀡ΐiD–YλZjΆθΕ“"y £uΕ²Ή&AΆPΪΣρb:^LΗ ₯}!%Rb!%žωσ^τŽg³kφH.ZrηEΥ)ψ·$ N95—l€Ν ’δοˆϋόL8slΆ΄£ϊ–‘~hξb)M“Ι’ΨLϋ½_T« έ`:πΔϊL;«sΠκΠyΩN’7ιΆύT]ΟσHηό/Βιm)j°§ˆ]s #‘ήšqDY†UOΘ·:΅ιNZgVξSX¦zο>/›u7μΘ”L‰λ’A“άΊœΑšωCΗσGΓ½ΙΆ-άΩδ_lυŠS#^βΖώ€΄gR£Ψp5Œώ¬ΉΛΛŽώ0}ΛK>w΄δ (οΧzCΧ)2ξς­ΥΟqVζJœZσψ¬"{`‰ΛΜ°=Άp% ‡γΦF ΏSͺsβL‘Ξ]ΗΗΎ] rΣd'σΓΗS?φ …0»‡’d%Α<Δiv•ΝΠΑnE1Ζdeήγ,H³ΐΛFi6ς2π)xŸΐγρ“\{΅<¦^τ……_Λ$ςύU!φo*v₯χΟvwΙΑ wΊ<=(³Θ+>‹ο–‘5 ΦδΧ:ψ™ΏcΦ‡ή`ϋa{u{3dϊC΅HD‚χPŸΪ¬\2_λ\ι ϋεR‘Ω+FiD†H·Ι)ԚΦ7mt`mΫλv²ngθΰρ(»ριΐB‘Ux²υUφ΅M΅ΒΦJv޽Gπ€ΣnΫ«6h#ψ#λ]φΧ4[^ α,žkKŸ)/[βœσ&ξx{¬Δϋc'Π4v€4φγw ­lεJΨΎeΒ6rSOυΌY Ž―7ŽtΧ‘HšUqλJƒΛ8Žkς·%8U’)AqHΫAH4Œ₯ΘWzπ«IΞΓ8T‰‘9£h|]ΣΟΒ …›G-ΩιHΘ!Ž jH}KΞ―_ѝ €ŠΨΧuj§EΦ]€¨=A£ΐ]«ΎVή!¨Ζ‹`Εμ–»0‡}ώEY—ύNιsέΒbzwIWb·ΦHe0nσkρςαƒΡ?ω+»Ÿ! ‹"“ό•Lˆω;9ψŠΝqŒΗn€$“Γhˆ@ρ;=Ή†ϊδΡh: EΊšj©²Gˆ…}9λ•“<έͺ9™kΩΜυjέ DωΗOp`…ΝνV¦‘r,kw½ͺx¨ν3L#ξbfyͺοΖΡέΌ§Φvόΐ΅™d\σ[ftq½α4ζΆ›£Jχϋiηsz·”=ΌΔ"† Βe#g­Λ—ωλΖEκ|nΰΗψρ>ωΐo’{œ2™E?PAkΓΛVρ;V[‘X" Ό!Οδ΅₯π_υΛƒ"MόΥ6εΛΝmΧυ€ž°MπHH/ nΖd²ΗGμΉΣ8ΑSrŽΑOϊ|±Ηhˆ΄DZ"-ΒRb!%RβYWDΕg“6υρƒ;7οC3²/|xοξƒϋ·ξlqp΅FQΖγΈ³ A.` τcΰOŒOX–#Šl³ ƒŽΈVΕW<ϋ­ ,kψnKWOπr8X³IΙΡ«Κ™Ϋ¦Hτ—T?»MfΌΆN݊{ι4›lE’3F[”78°51θK8ϊ¬αύ§—*τ$ Nς±zττ܊£υ( 8ΧIΚΧίβΡzyψϋβŒ=ωl<$Ι!]{N^€ zXίvBή²a  ΈΜ6Άω`{¨n3ήJ;ϋ GάKU#Ξœτ†!ύ-CΊeH?kH_6€ΏmHΏhH_5€_2€· ιCϊUCϊš!ύΊ!ύΧ†τw ιΏ1€ΏkH­!}ݐώž!}ÐΎeHԐώ™!ύΆ!ύsCϊ ι_lHhH#CϊАΎcHΏbHw ι“Š±ͺί€ΈR‚SΐX‚(vœ«Ώ Τ™¦₯Ϋ‹¨ !:¦«Ί{{ΞΈχ«8δΗK\΄$R‡F{a± T!κZΓ8νŸ\YY9·Χνn‘h«΅Uτaφ”ΓΦ5Ρ­ηδ€jŠΠώšSd₯»rD]ftI΅E“ dY)%I Γ&Υΰ[7Ϊ¦ΊΘϋVβξgΏ*Q#?œ ”’iŠ{IΩύœΔ%jΚμχθπ«θhρuΗλšΡ?Z&ς¬!w滃§ –jε^p3\Κ)…Α~ώΊŽΧƒ7±%™~%ΧοkyQ!ΪΤ|χχ|` †cu ‹³c:~‡nΐΦb¦nPΓߐ³iqg$^£7ϊνΖ~κ±›„‰AP/tω΅9ρ‹“šFortran Namelistnamelistsource.fortran-namelistident[A-Za-z_][A-Za-z_0-9]*xڝU_“š0½»N§}οS[΄{ιCvœ~…>Φ0N€¨L!α’0Vη>|#Q wy`WvχχΫ?a½”η’λuŠbr4Ο mε1‘Μ–aišb’ΝΓJΎdDσ Α\°˜l•Ο¨’7•¬³ίρ\Ζ™ρ·Fώζ±jiZ¦‰?0Κy£ψhΞB 6” †ˆGPŠ“˜‹Ίkϋ±j$Η6γΫfγ@“λ|f)ΕyYIg™.>Ί,΅eX'ω€Κ)r*pΚat’ λdjPNπ½ΞžΘk!Σwˆ‘P`0Q†KKŽ‘FU#pΰΔmfΔ‘X΅~4@ΰΈw, Ύsΰ΄7πΆαq΅–ΆΠQΓcͺ'ω7^8π³kC>³ΥOο7ςŽk_)χή7ζjtkh0(9©δ|ΨS”f˜qD’‹Ύ™s}Y(C[ ΔAŽQ9QηRζ2Z²/KϋQΚώRμJΚΟ#‡" ΠΆ·χF πCŽή‘Ό ό’”wOίu]ζΊόx`9†ΰ‚δ-΄@ΐ@>70pΝAιO(Ad›ŸίΑσJέΠ`%[ ό ήΨΔ#yŠYvΑύjLmω} χm―ΌΉΏ΄mFsδΓ~΄ υ$ΟΏmιι¬pδξς…{ŠYΓύIq[…Ξ*‘HΘ₯δe4–――'Ω½ΗΚ?…η챩ώΪ»ΗPF%+ΝvΉΜ¦Ζ2ϋΥZ4oGFortran Build Resultssource.gfortran-build5xΪΝ’έNƒ0†aση L4ρ ‰Ρ†zΞ‰Gz«,…m€-)νtoΡ²uΝ¦§~ yHϊ½?Ξ£Ÿ9s\.9fbνΟωφ΄ΧXιι8vqk€$θhςxΘ4}σj²ŒTΔ; Ψ˜σŽ·QsβF™,%‡y¬J'Ί)‚Ν•' λyΩn³ŠζD™ν5iΛΈBͺς]»4²= 6­Ώͺ6ΒˊhεVωj‹6xνoS}`‚Σ&§ζΘπΑ›P”Ί^wqŸlΫpJό₯Z­™ΧΛVΆΦl Ї¦B²Œ΄»’ΦξrZw‚^=­‡όAΐίνBγ;/SΚ] ύ)££0²,K·Z=@_Σ6τϋΐQg% –/³YQΰ IFe†τΘθ΅‚Ε₯u4₯£Ή!€₯!š\Œ•‘…\L“„±¬^‘„ΛΌΨ/ΡΌΨ•Ι0εŸEƒuYέΚ™ŸQς,b°»•‘ΒΊ즽Γΐρ‘έΐžχRg„i4€ΝχX€ ΐ>x{&α^Άe\φ-LLLΘρ woμ1~…ώoΓaΨl 5²„κ,ϊ2x³Δ8»Σ:I‘\ς@“ή€ Ν.σ5‚Vν'£’Š“^ςˆΌ‘m;ΓύΟΊ’‘¨‘ŸΠ―jθhθηJt}_3ζ’†γŸΥΠ/iθ—5τΣϊ…’5œΥŒΡΡΟkθοU„Εά1±ψ¨dm§*ޟγΨΐΗΩλŊlζtΙf&Δ©LΦπα2hlε‡>½a‡0³b@,¦–Y~Ϊ¨ύαΤ^ΩΟΨ?_ΦΎΆl)¨ͺ9GΩ#Iώ’Γ:d¨p–ςρU†δΪf(ψΑ!œ€vϋB άp±Ÿ΄+“Iόΰgφ^€δk•bγUΗΰ–ύ€PΑ–ε Ός†uόšυ»#πε₯Ώ @ΟkœΌl„LβΖΘ’ΉΧW€Όw…N βdDϊd{θyjPΛ9†δ•,9NΒ¨ ω9Ύ—ŠΒhnΖBg~ Uά˜μ…†}δRܟςnbY—Ζξ@έX½yu8Β vhΪ?Ά7D›ΝŸ[χuD•7·Ν_6ΫˆΤl»Σ^oo Ώ5Ϊ[φÝvσ Ϋ‡ψσ›ός}\18Œ‘έ= ?υΞmUͺ›ΏI(~ 0Ήa°ΰŠζΨ7#œvͺw-‘Δdή,ΎFξ ‘‚jεB}5w"r/^έβσβᎹζ―.ε’Ψw}"a0C4V:MKηVDΏ™ΝΡGheΕξš:y’¬ΤΞ [#Άd%+ ¨©—Πœπ”βyGΚSC¦SΒ”ΡNX)d…FΧJR―ϋ±•Έ½|­ψΎτaΫzV“”/Fσ,B`H?w/_CΊͺ£lΈTεƒήχδκsΏ8j™+Ψ6ψ€\Ψ)ΙΡ1&¨¬{nŽ‚ΉΎψ‚" όLJL0Ζs€γέΑΨΏS³ή•ιφ~\'l:χΕn½ι‹…ΓΐjŽ’―₯Lsρ‡ΐ(BŒΡ,pθώBΛ?4›Κ’ lο—οh|ΗΘλ­7 MΔzΖhίΕέ€μ]νΔΫ¨ΐ» Cπ€άOžΫY™Ϋ:Ÿp2™ΕΎN―^„7z―…eψ‚:Naπ,ρξ₯‹Bšu(δX›„/_ΏM΅)8/“ϊŒIςe8rN@ΧspρΆ’škVz~HώU^‰ς£” ˜ax#Β &ˆ‹v•'棃υμ΄Δn@4Π€d<ΓδδδwNΕK ”O'βφΑϊΧ~L-Zujq)ε梎Ζk’–?#±―€θ )Εƒσ% ’½`ϋ8³―ν₯©Ή½΅ ­G‚ί§θ ηθ”θUQ$ΨjHZζJyδ[|«3PN3l]Ξvu­υ"X§y°©mΦΝί«ΩΧτχΦD9ΉήιZ7SbΌg•nςGLSLvsfsgsvshfshgshvshaderfshadergshadervertfraggeomtesctesecompglslmeshtaskrgenrintrahitrchitrmissrcall source.glsl-[*]-( Mode:)? GLSL -[*]- basic_typesV(?x) # ignore whitespace in this regex \b( void | bool | int | uint | float | double | vec[2-4] | dvec[2-4] | bvec[2-4] | ivec[2-4] | uvec[2-4] | mat[2-4] | mat2x2 | mat2x3 | mat2x4 | mat3x2 | mat3x3 | mat3x4 | mat4x2 | mat4x3 | mat4x4 | dmat2 | dmat3 | dmat4 | dmat2x2 | dmat2x3 | dmat2x4 | dmat3x2 | dmat3x3 | dmat3x4 | dmat4x2 | dmat4x3 | dmat4x4 | sampler[1-3]D | image[1-3]D | samplerCube | imageCube | sampler2DRect | image2DRect | sampler[12]DArray | image[12]DArray | samplerBuffer | imageBuffer | sampler2DMS | image2DMS | sampler2DMSArray | image2DMSArray | samplerCubeArray | imageCubeArray | sampler[12]DShadow | sampler2DRectShadow | sampler[12]DArrayShadow | samplerCubeShadow | samplerCubeArrayShadow | isampler[1-3]D | iimage[1-3]D | isamplerCube | iimageCube | isampler2DRect | iimage2DRect | isampler[12]DArray | iimage[12]DArray | isamplerBuffer | iimageBuffer | isampler2DMS | iimage2DMS | isampler2DMSArray | iimage2DMSArray | isamplerCubeArray | iimageCubeArray | atomic_uint | usampler[1-3]D | uimage[1-3]D | usamplerCube | uimageCube | usampler2DRect | uimage2DRect | usampler[12]DArray | uimage[12]DArray | usamplerBuffer | uimageBuffer | usampler2DMS | uimage2DMS | usampler2DMSArray | uimage2DMSArray | usamplerCubeArray | uimageCubeArray )\b before_tagstructcontrol_keywordsœ(?x) # ignore whitespace in this regex break | case | continue | default | discard | do | else | for | if | return | switch | while identifier\b[[:alpha:]_][[:alnum:]_]*\b modifiers`(?x) # ignore whitespace in this regex \b( layout | attribute | centroid | sampler | patch | const | flat | in | inout | invariant | noperspective | out | smooth | uniform | varying | buffer | shared | coherent | readonly | writeonly | volatile | restrict )\b non_func_keywordsif|for|switch|whilereserved_keyword_for_future_use.(?x) # ignore whitespace in this regex \b(?: common | partition | active | asm | class | union | enum | typedef | template | this | resource | goto | inline | noinline | public | static | extern | external | interface | long | short | half | fixed | unsigned | superp | input | output | hvec2 | hvec3 | hvec4 | fvec2 | fvec3 | fvec4 | sampler3DRect | filter | sizeof | cast | namespace | using )\b βxΪν=YcάΆΡ+ΩN\§‡'ΞιDς•₯δ]Ϋ’Ϊ$ΆεmbΩ­[;q,ηh΄²ΚεbWŒΉδ†‡Ž˜ρψήΏΗοε{θkb’ r9‰£mcΰ`0˜Μ N=­₯ΏίeΟs¦λΉ[Η³žl]yVγ'y ί΄ž 0Θαf²ηkœe¨ΡE=3rΒvVŠΣςδ²8θαάΡμipp]34AθGVω(Θ^ 5Άk‡6† ˞―sz‘kΈ†e:NόR`JΪΛΩsNœΣθxέύΌ’γΩσliΉ‘集iΏ΅$₯υDφ<Ε•μ;^Ηtαώε•ΌR J±ώVΚ.υΝu‚Ά*ώžΖ„"—i"|=ΓCωhθ{ Οo•ι#’ğ,/Τ΅³γ n^Σ³η²ΊΠΐ΄|/•jΰτς"Ϋ μ.ΓηW³ηb*΄bΙP€ˆΞWF‘—…Ξ<_VVTBφΫκ‚^ΈόΌΔιͺ%¨lή¨Zb JΌY΅Δ2”x«j‰•gδ’Ί„9ˆͺMC0S9Gή™εΤ»“b’<#΅΄L©IΘυޘh[ήmΒ\φlTE„ΨR Ζd~$΄)g'@B›s.{^-A‚άu;?!"Ϊ¬ "’M»˜=λ‰ΊφΑxεiCκγ•§τƒŠ^ͺX^¦h γγ νXmΛ%A&*‰5,H’!΄F_ZΖ‡¦ΰΕS $ΐN4»,Δh[[Σvαλ!(ΫΪΒUωα3Aa‘°iڞ ΖbΕ$ry&ΈzΫ >†ο+B0ΔΖΕσ'D#πύΟB€gy.&ŸψPΰ‘Π±μ#ΑΉ‹q2 Dφc‘+‰°L4IΘ%a,κη Ώ&˜„ςβΘνBαλ‚­-η‘ΰ !C¦ομγπλ[@βΚ‰U!š•€άS.Μ –_¨Β{€‹ΰ—eπXΊ‘νFΚ|"Δκ€J|*°J` GΆζRΊ%θ}Ϊ{αλšeAώΐάο ΰΰΫ‚ °Χ΅{6ςμŽΐxfΰ ͞λΫ.֐‘ƒB„#\  ώ&τ™'hΧσ»”w³'ΔρΆ,2Mψ{φ„‘$k5ώ!τ;h -|OΠnl@χΫγFƒƒγ3‘oˆ|3τr€Ο!₯c"ψϊ@`θΠ7ϋ Ι§|!Δ?œυMHmE ΆΌό Ά[]Ξξ5°έs-ΓΊ`Γ«`Θ}`y$Δ)j,Ε²_‚ΧP—U•`΅E‹5-τιx€Ώμ?Ξ”[σκ*€Θ€ΏΥρ9Έ!ΘΑŽIʈ ιΛ9ΡŒ$_ΎΨ%7³η)+³W}ί‹†I™σή€PΙΝΚμ''ŽΥλψΘ8GΥς ½{yΙzڍϊΖγϊυΝΕΤςΔΝ…§†!ν7,K?ͺ)zΘnMν f€¬«λΞHY—D―xΦΖt*2•ώpBΥ&‘L­3F•Έ@ΠoιŸpt§–iΗ³»Ή‚™Ό»³š$€MΠB©UΓͺCτ­½_ŠΫ†aˆv•Z9Κ ¦Ž2O^Α8kΜ’Ζ•ΤiΫ™³Λ΄jΊί¬ έiŸkΞ—¦+LhRΚ"T³eΜ™ΌoL1Rδˆ³ΠnCp6f ΖHξW}ζΎ”«YΫ5FTv°_DAλDCA-Kι=Ν*";rΝΙ5η[E―ύ’6²‡«5+{©'²ŠΙο]e“ij )ΦUδ#Eώ7,Υƒα27!Χ•u…ŒΪψ—’ρ/ΣΖc?ΥQwλγ™Μfδ~yx]'‘ε4ν΄ι"lΣ1έ~Dœ²VψίΥΖcΊŽ”Š•U‘+•—P=ͺJοYΪMς?Ρzf+MX8k&tmK4έ, ¨A½ά^0š8PZΈl”»Ÿ™Y…ιΑ/̎_TβšΦ΄vwLΗξ6mΗΑK”V#Όξ‚νžŸ΄Ά±˜¬b¬Wn|k‚μ¦ή;_‘Ί—Nψw‹έ„O—ο9’6Μ+ΫΠ΅ΝΎλ!hΚA7G"mοζšρž²xQά‰Ί¨Π†ρ4Ίƒ—Ί^S³†1ή±¦°YoΥdυܘz=o‹UΜσ2Θ$†aJζΞh™r±±Εψ—-Λ““Μν7°ΡG£ιζ$4ΙΌΓ„qέl%ΣςŽ’{Ϋƒ‘η‡Bdz²@ψLNܞR LΡή­•ώdΕΞθ€9ζŸΚύ όφ—φξ+zϊΗY†ΤηρΖΦ—υC•·‹€ΦGž~[•'‡ ©VΘχΗSΘ9πΡ©(δc…BͺuνPQ_dE=;ž’žϋι,ηξ‘BΎΘ ya<…Ό¨Z,WfK|‚|l¬“ͺ^Y˜q¨’¨d}<•4~q*ytš*9n q¨ͺ¨κβxͺzιΠzΚςΕPγΰζθ¦7—όŽS†πKUΚYμNνWΣT«VU­ ©«'δΡ΅ΦκuCΩρα “ ΈΩα~ΣΕσυιή‚lK§`` ΚΨ‚u”” άΨ έs γŒB΄ΐ²RΌΘ·Šl4[u₯V2Ž…υvΣΠqޚΗRlΧsͺ–θrfb/=ΐΘ.’2ΐ2Ρ…štrq€ΘΉ$aMAΧ” w0¨xY«ΜKJΐ†~u[Ψ[†™Κ4Όšw‰μTgLŽxm†Š€YΗΨ ˜ΥyŒ­ζVλXiš -ά/VηπϊX V…u,U}Ÿ5»‘g5;ΐMΧΕκ’—/.DaŠΖΩ#‘β ―•°šΫέΆC M ΝΩξ\Έms>κ£½ssνNίΩͺγ—ΉΉϋζή-Η>ΐKδ(˜‹iž7θΏϊν‘ΓwΨς‰©g@Φ|sχΣ¨ΧC>“y‡œmΔMΓ°=Ο`4CΟ%r{v›MgUάςΘΩΠBΆ¬ζ쓐ϋ•ιογυ‘;ŽgrΩΘΡή'!^<ι²5•€…vΰΟΨpœώΓΙΎ &‘6έr (.^ψ’ಓ]€‹jΧSςqacυz{cΣek"݈ΥIi¨²±Q*έΰΪ;κήΥώπ²€'r€Ο xDͺ”Ϋju!‹*Jύ3 ψ¦…zλZJQ\Ή;v|d>I4ψ₯τ%;až$2―•ΎΫeϊέτέKdΘ’Ό`MMžv/yψλΆ›Ό»vhm'―˜(άάc[ψՎDΫ’DέΊXίσ‘k­ZHr,gΦu δ§:Λ s°"ΩΧΨΊΞςd+χΫ^7ΔπˆΆ3 0ww1η]dF£oΑ‘T ΰΤ0Š{k?•nΏΝ½ώH!ŸͺO«izΙI…06Kz˜'Eώ’"O‘W‘™"sEώEώŠ"Y‘ƒ"C–‘Tž—F8Α•« Xͺ γΗΝjqVmΛβ¬ζμΘΆ{‰λLο Ιό(¦5LBž,mb­ΫAΩ›ε˜ΈήΘΝΑ‘H6Ϊ… Ιu$€€―>JG‹Y²ο…^φj»$tΛΗ%‡QΗ±­,ANS9μ»\Βt(Fœμ™΄2Ηsϋ€cGΩϋΆιέ={uiCΜWšΔς‡σ0‚β^ζ‰νd-1οΛΜϋ TΒΐτ˜˜δΎyν!6”8·μdc·@Δ`₯*΅"ΐ1—]P¨– ςwP·γ,}€ΪΪΏͺΘ»ΖBq.θλ―5a3΄§ˆD»ψ’¬6ςSVŒŸ‡%?>ΕΗJly%ŸuŽϊΙz)ΗxHd:±λ‘= ΓΨΫAΎowΩ±9°³πnxΡΈΛ§†Tφ,Υα80Κfh=—ŽTα[]½œΦߌL«Rσηθθv=΅ΥtμdZ}uΐšξ>5κ65φx ΩNnλ`ζrT–οQΠE}ΡΑhχNw/…jpŒ±S+Τυΐ>‘ο#jŸΡή0£73 ε Ηρ<0{=²Ρή±—t2όƒŒ]»nƒgΑA;6—Άi#™œΫ Ψ β!2 Ύ§ΑAnŸβqπ, ƒ’,ΗληoЎ‰G΄dœ>Όc’ ΌP1 lšηusχ «•Mšα°­ώ!χaώΖ‚½ςψ^7’|z»ΰ|͍YF]qΟΙ½ N1Ό ΆΝ·{uMHή£Bκ;I–Έ΄&$‹LK"&άθ+}xxξ5¨#G&7Wυ0RΰS΄‘4WK³ΉΌ蚘–€±-Ι±-―‰i HΫ²Ϋ­¨ƒŠ9 ιSC/@%)ͺSά‚u;R#$?XGxœ.Ί΄wΛύϊΪQΖρ*֟zϋ±ν…c꣝ϋŠšΈQ;,;Ζμ0YJ!sώ.S­2Ο'GTλqŠΔΘ¦«dΨ.UΐΆ*`+?AνbΗΠΌΎ¨\ι§Ή2η†’2₯­iτμ•Σ³δχ”Τ=2¦ƒYI‹$£΅šτe¬ Ει xk‹ΜCd ”Zφ)νdfͺlOW―o1 Ι VγΔλ–*–ίζψ|’‘WΎ–Ϊ)—άGšsh~YS‚½ Κ[Ο3|Υ-£¦έŸ‘Ηm«QΎ ͺΏτcVhΔ4ξ5P4χΉγ ,UŒό­Κν³5–OΎΒcׁςyΔ€w˜υ/μκ'+b ³‡σšZ…φs“ΏΚSρΥΦ†_{Mz:ΏJ·©rΗpΙTpZ™v Π—5‘jυvcηYͺuΊΓζd―°x°CΊͺ8lRu€W9^TXeΥΣu¬κΥoO*ΉpzB+)‰ΦΗ™ϋr…δχzΑ}ΑŸΈ›V_Ό ο‹΄>mw|νgΩΗωKZ*?Ε5O·αpVπ&ͺ¦WϋΛ(l[ŽΧΙ+ύΙ^Ρ§ωWWxγ0Φα8•Ϊ½^Qmβͺσ_ψMζb€ ήό€ΉΞ‹Ύαυτ"…Š+γ§D›–ύ)ΝiY΄sz‹–Υ6Zx!*ύ]S\ΏŠσΏCX§ ΧqTΊΆ%nτŒ5T 9ΝQ†Ž¨]™”ρ}Ο―Δ‹ωwEi9ςΗ‘E™ψ;ΏγμΉ…>ŒSό•H,Ρ?ρJq‘oκτOέ™κηˆ4ƒΕϊŽΠιμίAΘ’χ(lͺΌ πΞ!#x·τ«gΔ|eFΌ.gΔΒΥ…ηY¬ψΰΐŠ…Κ¬˜tοΝβ“Ζ/‰Ψ¦ŽXΥRb Θ*ς#MͺΕώE~εi†όΞμzŽ*·F©ΨtΉ²L­— ΪΡμδϋώ;žΗάδ{ρσΧΉIŒ0'kφ#kc)?;έ!m ιHHΜPH.ν-±‰e6±’'–Y°el™[aΑVX° Φ%Έ™χe权Ω[βRΛ\Š…\ζ —9Θer…ƒ\α s ³SWΛ›pbΩ&χΆq9s 9aΔ{σIΓεΠΪ–6Χ>ρ}sŸ―QΘΝ ?eΟj$\­ωώ:_/M3…JΕL¦₯X1“mΝzrφ]Ζ Ω—Ό©²―€U~±-aQ†ΆDˆ’m©‹r΄•‚”K–в(K["LQšΆJœRyΪ*J%Ч–Ά΅ΕX«HΖέ¨Θέ¨ΘέHδn$γnTδn€βn$ηn$γnTδnTδn$r7Rp7’r7Rp7βΉ›‡ŠιqίQPΤΉ¬^ζ²ΖΉ’σSΣzrΛsθ%$\’yίλ"‡Ώ‹ƒ~+fί'—“Ψτ"’΅ŽpΣ5ύ}=ΉtΏ^…ήΚ€Σϋ1!ƒ)Ώ††αφCΣν£BΖ:w}Ί½Ό_ι‡Bz]H?ΚwθΝ(ψ-ΉA4O’«H…¬Bύ)LN{‘ N―Ρ IαΖΠ$Žω8γŽiε§χ’•¬ς’|AZIžT\wέTTw‘ƒί3χiGΚ«.dxQ “ϋ Λ[goZcr ¨‘1Ε€Ί―l΄{?ΉΝFž{7½@Gϋρ\+"‡R~&w˜€λr Δο Z`•«-FNh?B{‰.n\i|ΑαgΙ==\‚#<ΝZ·L¬~ή!5q½ŒΙzXΜZ/fAw{ΰεώ&ygϋJ’Qp’»ž_,τΐ Ψ ψφΐ&'dοέΝσ€2Ρ‹’’Κ/νb ˆ1ž #z D·8DΟ>1Λδ&CdiΚ–V]hξο$οCdMή‡¨β.γ΄κώbƒoσŒͺΧ;ΆbΩπυ=f‚PŽ1>‰86 ψŽ1a,rν8£t—Bqτžλ’ ΖW…<;Γjj–·n «Š’’ΘΘΫο › %Μz’ρU}Κ0ΏϋŒ%TD-――κ΅Τ6Ϋπ}‰quLP2™QΏOFςYακ΅αΨ=³!ž¨§˜Q™`d˜yΪΆ”€ω1ΓKk΅Τ¦¦ΨͺΎτ £ͺ~ЧŒgΓΠ=c9ωtaHί3ΚΐPΐL΅fΨͺ΅­4θ©ώ±χ„΄#ΌΚž3zjΉš°½if IΌ‚Ώ1r½wTkbρ³$: ŝYŠd† l±f0S1ˆfYnΞY„Τ°/ν„ε*3ϊυγGΓ4šž9f¨ „σŒ½1Ρ ΘuϋdaΘFέ„  ‹ŒŠ OrGׁθ%Ζ†rd― Η`΅Wν=!O₯ΊΏf+€φ—ήsIΒ?9)ΗZΙΝ©•S˜vΫ¨—KVJΫ,ϊ/S₯ηπ>Y˜½ΛΆ‹°a Κmw[ͺ»¬δKiοΎΧƒQs=‹aαΎaΓK@€pΤvŒ†νψ$ww1˜N[V&Νϋ@sB8šΓ_btp’/΄ ©‚Q¦α T7DΫ΄δwκ^°šΤ\ΤΧqP‘dfیω½cΪjSnΉ ˆ¦k†Jι“Vi­–Οη)€a_s3,Γ–» OΗnή’΄ϋlϋ¦…Ψά‹Α†­χΉ‰vlšŽ7߈D§°9!0FyάpS=K΄βΤv?>ύ5ύhΕμͺ圣ψ=xBBJ«]hMYΣuuGΡωά.nωZναΦΆaΩ›"ζV“Νm>0ŠτDΤ]ŠΌε&‘οΨΙJξm~Oβm‚1π)ΌβΎ΄υ£­πsκWrεήCͺσ€γώ*ψ€)ψ\ {ύŽκ&‹FCMŸ ‘ ΗO†Α'²ŸlΟΤVγkφΛΛa‘ZJ»νΩΜΑ“» ŽD0J–ιέuL,ΧέΗf·₯#=‡S‡W2ƒCΝBm¬XH7eΔhsCŒ&yŠ 9:azπX6Ι rXΤEΪξξΗ@r37!ΜΘΤω„δ1Q’>θ| f1‹φ‘9)ξƒ ‘?~λVΚnέ’ψΩ`έn©;š‹uθ3šŽUΘζϊp\7’”‚οŽ:vL¦Υ“¦‘<λgΠΤ5Ω§€΄BCkαEvA&&›V Γ Š‚Qa2‡π8Δ άK˜5ό3ϋΑSΔπθθίΧ++κΎY_+―U]ξΟ­Ξ―Tίϊ/‹ΥΚBwq₯όςMey­ΎPY¬.Wƒo mυνJ₯ΌΠ­./U—+uhvωvWη_Uή”έGy©Όύuξue~-ΰfT^yΉΞ2―.―UVΛσ•ξϊ²χ^Y^γSGyi½β~v}­ήγΌ°|‡‹Ψ¬³ε²%ΠcΗρφΛΒvΘTιζ!QϋtηΦξjFCwšj·©Άέ3Ε](^˜:¨’„dΫ³9άΚ ‘ν8νΆiΩ}¬2ηύ€\x/R―IŠgΣwHΫ}Ξ9βδƒΪŒ ,€~L@ƒϊ`2G|ZxTcz·κg°ή…Yq6GΕ!pώΑο¨ς~μ¨Πο,μΰΰ€ν')ΚΞ>Ζoϊg) (BΑ!Oθ1ŽΠΠ?SΉ§)θ£Δφεxπ ψa™ŠπΥ>άΖN«}θ/ ϊφXJλ²ΛώΟHœΝGϊ« 7'Μ“gwej`fμπψ;κtΡ‰”OΙ/x–<Ξ±δ>‡ΨS˜sHΫ°{8€ΐϋ…p¬bΜΫΊψΧνEFΩήџZΰ¦ήyιhg,=c½ίΏμoΦψe9L¨“ζ’E5Ρ>ζY"ΉŸ%ξ‚W84„ΗΏ€΄#mΕ#Ά ,œ €iϋZΕ@Ι]wΦ΅GμΡΰζXά‚ϊ ΅šΌQϊΉ£ΈG8 Ψ]zƒpλοD9”ΰgjYτGx¨ύZj³ΓzQ8V161ŠΨΊmΪ·Kαg€QιίK€νUj—›μ†0²gκ›•IО @ό$”‡8/E‡Ό wl΅μg€ώFŽηΓ‘|Kl»:CΑ*©η±x`F9`¨³RŽv!!Ό§H[…‚ i IΨxΈ'γp¦}YHπ#%:'± Η2±K ΡWQσπκˆi³ΕΑBdF9!Ζ‡¨6ύ-WΪ½4²i‹Bω,!Κο₯΄6»€y΅ασH’Μ­Έbf”D=ιc―vwQ7»»κŸΣvηLSW£[]ΰžHA”#;α°3„+bpE9JΡ1.’”΅*RΒgkω·j-w#αξ ›βΟ £.šΣ+ecχ~£₯λH›ψΫΚמό°"n"Ξ£ KyΗ,5έ €ό³―’¬ϋΟTwγQιωf­9Y,j«Ιή‹§žŠΊΉQΊΏ9λ½ΟvΩ–"/$€Ιω·¦TKkΘ۞/@VO‹+>Θ‹ΰ;μυnΚ½νΖΎd gψ^OcΫrΤ$ρrρVΰe2LεΆ’wΈ#LĎΰ³ΘΜg^eΗGΪSΞ(tyθ>ίξ{Χ}’…ε σΊ™ υ­ΔχŸ“œLƒT‹’ uSβ'5EΞPpσ8ΩH·„»θμŽαξΔaύ`9ΦΣ Groff/troff grofftroff123456789 text.groffάxΪνYνOΫ8O(cŒΑ€ρ²ƒ1`Π‚š{•§!έι*:Υ₯MZ"Z§—€γςαώτK›Ψ±]Ϋu-|X>βηχΌΪ~²―ΕΧ\rί6‘ /M―ήnΪ0Έόϊ?Ύh\Υm6Mhω)N—γΎAΈ±δ>/ΐα 3ς ΏEΈq9ξ;„{"Η}prάχTŽϋα&帟ξ™χ3ΒMΙqΏ άσδΎDαj. ς½ή›VcΞ$χeOύBηžU ‚]?§ΖώŸWγ x©Ζ‘° Ζα°¨Ζ1±€Ζ±¬ΖΡρŠQ4ϋηΐzΎεΆΠxΝ„HŒ μ‰"±"Ζ`ϊ1Ψ‘kb φγ1»o[d'hΨ΄rL_^6M’Ρ·Lͺ_F2½ o2ŽŠ'nj#/ ρ-fά2ƒ.=4ΎΝδεJΪa݁]·=ržχL₯$UάeͺJ±ΗΌέ±4Λ2΅ [rΙ}ŸY%cšv`±L£ξΉ΅šFΡRA­κŒZόd6Λp »n6Œ6¬6\ίΆςΤΌιdθύ-Ρ°½΄Νΐq‘aΩ5:ݟΙ46΄Θ©t&=:~‰|o4hnpe{b…τĜ¬)[fšΏξδ<κ1uιΔ+T4eœάΗ ΒυΧ3λΆάΆ’?‡%Dub‘$Ων)>Ϋζ<{Οy–£ψΟt³Ε9Pώ>VNg|¦3Ε„RΖ·«]‡uΥΡ 4)}\"½8tιO$Ο₯#;_Ϋ·7gΥ¨,xnΓ¨5άΓΏ…nΛw|9 M‰;$½)’ήΙίΉ4–6d<σ†ˆ(žψIΚ ³€˜BX(„ΏYkŒ,·e{fdx£ϋŸ\Π%h…t^ ONΒ³bxvž€ΘU™zr‰Ο)‰hgnB`dΖyΣV("!Mp)™ ͺΘπ+ŒΞ˜-ͺnNpk@³Ι φJ[ε*‚Χ%‚ύveΈΒρ ezΧν–QqV*p\ πέ½ΨύΪ<ΠxΜΘ‰Ÿς" s‘­ »8zΆΥ†–-T±2:ωωK1HΘu‘ .„Τα™H‡eڝΊRiΈΥλήΪFy¬›ήG‡%c―|r* ΜΗR₯( KsΗyœYJ£v΄MŽΜ‰βλι# ›}³cVΔ~fοQΰUSώ™‘ς'ω0%„Ϊ`qά46V)_~V>Œ!ΓllΔςO—4Αυ%ϊΪξέΞ­){O}έ~ΐ?m7°-ΓrΫ|„&D}i^pšμξ4:XE΅HpυΚτΜjΙ΅ύͺΩRΆg™ˆ=”mNΙΎϋώͺ{₯m˜CjFN€Ω»%Δ$’ώτ'ΣsΜNdαπp~PΟA6Δx‡G’λυθS•W*uA*ξ |ŠΪ ΦmšYΊΦοβΥξ·20χˆυΟ)ι_±λ$ςŸGBʘ2Rύ’Œ½½2˜ΝΎœ *‰*thK>Α"£(6BrηΆ”’ž~)c2₯3ͺ«YχBmƒ°ΎΚ—ΨN.ΛqξwΎKτ„δQmŠ ›ͺS1_ŽŽκNJ}Ο5œϋqΧ΅ιZNΝ‰ψuΎ‹ΘϋΣͺνz|6|ρ3”ψ9RόΩqXζ5‘ωO‡/}AlώΣ˜Q,ώlΪ/‹½g!<ƒΪ½Uάϋ²؏Έjΐθ+¨mS’O‘w*β₯KΆέ<Οή›ώχ°¨‰Ότš’&i2&sΆa²ύι³[˜α)@ik»<„΅p…’?ŽΕ’Ζσ/ωκͺΖg ²†1θΙ!Γ‘P; —„,Χ ΦNοcφ7’ٍAfΟτ†€=Ο―U‘wςφξfxqUΎ»‘'ρdqφ ™ςœΰςν–Ελ9σέ“1vήΕ”δώΞω_΅ίκΧΝ?Κ EEn@ΆΒβ*;υ€LζΉL²£¦1Η7Hι.§k^ σ ψŒ$|¬5w£_ΝUN0€1ΙΘο;+:ΙΜ Ϊ£”ζ”˜&±ΣbšDagβΧK9ΟwM»§NΠΆςcΰψΘHΗ>[ΤΖƒ'N›ΟγΧσΉ6ΎήSLCΡ}hΫ|”Q>™λΉjτΙΌΟ3σι_™=Ew]}δ₯¬|ΙvœΑΩΎγ€τΈβ 黦ε#ΧS^ιnO 2βΉΘŒ%h“6ΈΔ4Μ6μŽo:6Ϋδ²xΚ}έλ£Μ”―ˆIzΗu2€W…eH‡`Œlu娝!r}3ΛΗ# Ήηλ>ώ2c£ΉΔ@3½―”Σ&φuΑΠωι·« όν€7θOΏΎΞ ΄‘a μΗ@”hG˜šI€AΏ—@ώ/3@‡~΅Ξ0 ύφΣ)ϊέMF<`ΤΐJϋ5o vPͺ‡ p†’nς$! %yΔ8BH²‹F―ΧHˆΌ~"Ψ‘$Mžlφ ΤIεΏΕ›έwR ¨<ͺΈ(Υ7<=₯€EΙ3w¨(ε·Ό Δ CižΔ―OγΧ9Ζ ΘΧλΠg]·GυΎ?°j)αM ΓΟtr–Ԑ7dI»-K[rςυ!f€9Ϊ‡D݁N4^7PΧ΄Νπ-š ;Ο4[Μςηu@Hυ6ς_!d (CέtΓv L»³YΰΥm}€’1MΑΪ\Œo,Μ1Α.‘ηΠE Ϋς<Η­ο ,VΈ Z†š;Kšš‘ιάΘ”e|ƒa_φz›βZ iυΆεtvλ/ΌμΤζ²S£ ΄υ ,©ΝΖ†ΧqΝ‘?>Λ3Rρ,)/Όωl«‹¬"ΐ!hο"ž‰Χ²&žD>iΖ:`ηΛs$Τεw₯œ_dΥy>ΟςlΪ–iW2EdIR7Υ Y}̟a™wό>rί_aŸζ:ΛξB–]šͺ)Šζ­o•:ΫJ5gΛBu*E‘έΠDΡ΄_κ–iΤMΛB=έͺ·uƒ&AžβΈΚ“§Ÿ=Ž&°ΐΐš@©WχΚ •6-Ÿϋ„!* Έ’jn>ύγ“gώώ72ΫiξCvjΗr<ΠOΪv(m»VΦώxŽβl8ΌuYR—oΙΪαΗƒP y\ΰ ίp:ώΒr‘Σ$qMmn‹(%₯λ•ενηΛ[­υeJB“Φ(«©Gk€z΄zH80 ν»&ΙOuΫPž>{κq¦q5q’(Ɏ>Β-ΕΠarμ\rΚ€λ²V+7›Ϊ<='p;¨ήρΌ:]¨ϋ+]XK Θ­ˆayώΘB2Ι±(Aš-«Iλ…ˆJ ³YSΘ7Ο:ˆπ7«˜+ςœOj‚Η˜2N¦fΫΨΘ(c\η"Π:”ρΤ3Σ8—·‘UMd%αͺA؊ς(όΓ“?}χύ3‘‘Μ1vΰϊ»˜2΅Dd΅9ΞΦ¬υϊY‘^f/œs²(MYœ?XΗΊ(r¬p\&¬Π1€ ΉΎJΩlRηΑζ5Y³ΥΦ/%xΕζ0ύŠ +žKf°,‘Θ+'Χ cžΊ‘­i΄ΆίξE:―1ΞΔ–’Ψλί+Έ~‡Ήώ7κ”Ά” mΙzX]’ž“p«64•ƒδ?)U ½Hιu([I QuM 96h* ΗΘύ©‘€ G+Zφψ£²SŒ9E9&rΫ5Q@€|¬–§XΛΥμFΛEΣ/σ‚!…ΕŠXISAE­ΐΟZ=V§αΘΰσγΪ_ ]Um’ΧΌΜsM;€\(gφμ°³ύh§€\ςό]άξομΚJϊrŠ²<œΘŒ¬T˜kU…ρŠτΔΈHI5„•J‘L£>…’•«K6κ©’|+ε%©…’eέC,ΥλŜΗC.*ΧH(UšNT…―6΅χi:ΤΉΓΥKRςW^™~_υP@ΦΕΣ:š }£Ή†—‹Φ1Υ*U’@υL»0ω9W۟jόσ΅I½~žUŒοtΛτ|ͺŒ_‰«L7ΧχʏNδόˆμyΥΙ†C–£Y©Sh­Y,„Œh$22w·3x$Έ~Wpύ‰ΰϊ¦ΰϊCΑυ¦ΰϊ–ΰϊcΑυ‚λχΧΏ\ΏΟ“ωΝβδg¨‡[\υh?,tšΒ/I²‘ΣxšG¬hoJb­Ψ΄“”1kl—²6K7Α€zAXτ ΪΟΈ†[ΎE±^Μ#" u©bΎϋ+7ΌͺŽVζΘΤϋA½υ~ϊA½ο›zk― ΥGŽpŒE‡“\Ε•‡†’υz8P‘ΎMhž2)ϊζWφ4]ΨE£xQ•f Ή~φ›vμNΌŸΨ ~ΐŒJ!«nR@χΡ`hι>ͺg¬-Σ&§φd+\ΥήT@—KθύAΩ³Qφ~}όCό/γΏΨgωkΕ\6Wί…Λ6ή‘+ΟZw“Ϊ΄Έ]X +,Π[`S‹l-kΩm45xΘςAΖrΆ!ζ9.`ξŸηεYπ\γt5'Ѝ,69΅œlNIΞΥΚΌŠπjρs7Χg΅έΛή»ΐγ5'aJ(]—₯m]ωι±ς—[ΚΓΦ Ό²Ώξ‘7Ί}¬όΆuC–ΙμΩΰδΰQ§‘₯‘₯Ÿ «ΐ’£%{§™.¦n™1FΆήι1}0„π¨Ηεe~¦Ξ7/ςν©,9Fjdε»ΩΊ’T›ΫΟ·Zλ[ νφΦΜΞjΩzώq<™ƒ¦Κήΐš―ηΌfšσψΝ{4έ$o,)J):MpBT4ϊGΉŽη“ΡKǞς€ΠњΐϋΧ²ƒ­¦θύ\σnΘ*1ΕΜα/­-©K‘!nΜΞΛOβ‰&ωqNrΧ…“‰O<½•ΩT8ώ$šN.©O<©±‘Fσh;Ζχ‘n` Lgf“Xͺ„wco.9\¬ύsl.ΊaΈΘσp˜‡ω6 l˜/±aaΓΗ]Y†‡ΰγp—,K’gr­ξίΖύ;Έχοαώ}lFΆΡਘ‚ q`a}8΄ ]ζƒ\ΕΕ}ƒοxθ’J‚\-dΊqΜvrE Ξρ{x’ΜρύanL”Xo·]Lnτ²G¬»HΗmάΦ=>uΫΗmΓΑm³‡ψΎcγŽ>$œγŽ ’'χSΒ“Eώ{ ±@ ]#>ι 1;lbsΠΓ¦= |xφ° ©­φπnΫΐ–ή†v,!cΓ– φ.θCLD ψ €3τ£Qœˆ‡pΩ‰Δφ Όβ˜ΚCΡ‘7Π- {CέΖ$άEδΕ±{8Δμmψb_‡\ϋ‘ψ&‘7”„ίuϋ}ψ#S2ϋ>πKݝ½φ― ΄ΟΉ{„§ώΓ9υŸΝyR.k˜ρ4D0Ώ„7ƒ#’X$qcγ+86 3mˆΌΔ‘›ƒΡ– v}ΑΝδΒ{lې–ξ"Ώΰƌoά—εέ5NdΟEϋτ8e“wœR$Ξ΅ͺ\ΘEΔuΊZB¬―gο»v²h0ξρΓΖꍕμ¦ϊαHcΉL:ICap˜Ϋ–άTKY¨|RΔΑι\·4»UY˜πά ˆ‘3• βνŸΥ:;1ooοΧη•yKnθlSΘΥ‚Έμ­»16F˜Ό ±r|ΉX 0œi@€"Gœ›επΎR Σΰ‚{Υ-"q~Q$ΞΓ°Ό%Έ>Ν=»ΒεN‘ΜΟ$XΩhnkž&i―΅νΝ›-9½?MhΧ ό8:Μ#[dΚ2ϊeec€’Τ^―(εSρόo9ƒŠΜՍš‰(M™Šs›”ˆb," ™Χ-HPνr;Ϋ±QXρ:YkΑŽΠΝ1V•T’,ˆΫήΫnύ=£@:"ΦκZkλΪΊ•­Θ=υθ­¬2ΓfˆΩsŒ 6μΕΈf‡³S+TΩ3ΌΑπiΪΆ£ν½~Π}£ΐK·ϋ˜΅5mΉ₯ak―W5/ϊ Ν“%½ν‘œέτ!ω aήv€‘¬ΒZΙυ|όΒ1m¨½nΎπ £\KήAv˜Χƒχz™‰…μdΒ–σ VAΆuVΡiς²Κ}μκ―°‹^B aHΠ!‰χΧσξ!δz^’>› ‘FΥ†CωΙyqΩ&ϋJE ωϋΖI7Όˆh«I֚^²q›|ƒ–¨§V…yΡ{!r»xJΦ11(WŸίΏ¦Ÿ_[χ;}XΩΩ W?2 ˆΨΠɚžvp‘;‚%_W,?oZ‘]„ΆVίC¬Α Ψήκ$Ζb™πήZ¦ڈ,iRyΨ*΄ΆΡΝb8Λl`–#Ϊ₯ʐ;|VVIv•,m–2ΌXY†λšI8&2 Ζ0τG`ΗΖPŒpΓ…Όco?ώ1φ·γ8•$NQ SόǝQΗB±ϋ˜/‘όό.ΆΑ¨]ΐΪΤ tϊ˜aiΒ+«m8ς.E΄¨C±#Ό9 Σ=βλ βŸƒ{Ο=ηre­‹ΣͺΧcκ­1―€Uα™·rF―Tfτ?F‰q‚›C‹$›zΰ;(DΔΨΒ΅Ž|›@$”qψCKa%›Cmg“J%”­:PΖ‚B§Ίχ0@0ΐ1 #ύCM‘$ˆΘ΄ηΈrΥ‘/‹Fn›0 ‡˜aŸ#ζnΚMάhͺx ώα‚νψΰŽMόφ|”Γλ!Π…ΏυθΙ‹Ύ?!KEήΤR"₯aP‹7–\aAΕ›˜H ˜IM-$Λ陀Μ¨ΏΛϊQAΪΈΆά"ŽQ'Ξ" #$cμ±1σ’ˆ=žο|[Ή71{8eŽqςζ«˜θf λ ε*ΗδDhΉX„–9nί°‘²H’q̜"Θ…ˆZ—έΫQι‚ sΒ]Y}°BΰšίGΰJ%²ϋ–Ε‘ ς οvς³ˆΪK9γ;27p΅o&Ε‚άM–Φ&•υ@f&έΓa/Λ“φ²Μλek㸏TοΗzŸ€6{Š―~cο‘)8=ΌNμ›Σ¦ΰτθ>8=ΆoN«Ε΄‚Ύ:γ²\BrEσ)N²'VΔπJ­2SΛo)jo΅_«y-ήhostshosts source.hostsxΪ…QΑNΓ0 m‚ €Έrٍ@HHpαCθ˜ΔƒhiRΕ©Ρqُ/m“*«6Ν—η'ηωΩΞ$ιγΒγrYR‘ΆΙ~\U΄ΤΨPN=ž{Œ₯g'ΙαH#}κ{Œ΅ΙΘηΚ#κΪ0 _-ΖυγOΊ=υθM:^%μœί’y^{dΊ,AY"…’겓‘ψTQ‡79Ξ§οΩΛβορώi““ΣyΣ¦4[½.ξfΑωfpVξ‡œ΅s#εάbδύFǩԌΚvΑFTΟ™ΤΊ*([{²_rLAOJFΡVVβ§γTJ₯9` FΧΜ@»6…Ρ”·Β–Ξςb|΄5ό~kΓ»sל»φ ψ¦|Rv“INIiniINIinfINFregREGlngcfgCFGdesktopurlURL .editorconfig .coveragerc .pylintrc.gitlint.hgrchgrc source.ini{xڝ“AOΒ0†7@PF^<λLzπb’1»ψ/’fTΈuΠuόp»ŽΪ $λεέΎίχ~O·Ά³^]₯“I‚]9W―άΝ8b\o»J;JMkKiΫ©_αwU ΫλX}ϊJ³4g†„swϋ2sώ;TmβΪcœ+}3ί{ωθ{Aς| Bθ2—J£4I0ε0&Γ '$Jγ”Κ²ΥYλ@ι<§Ο'βό‹|ΤΕϋ&ΥЌŽ€ύxαȈΠA%‘ž"ΑAŽf"]$Ω:Ν²%Z–σL©ˆNψ<ΩnάΓNyeA―wm¨½ij^i4Έ hπ‘ χ(Ι½ZξIͺO`_¬Sň‘k ΦSΣ4gι3Α¨†βυn6‹<帎ι‰OΌόNΩR”ΰ:‚ϋΦ?°|7»}x‘£8+Œ]ΛxlNώ…β\–ο5Œuhω.τΟΜ‘³υΤe“£†MμKΌ«|uε₯Wzy1Ώx­ρϊJavaScript (Babel)jsmjsjsxbabeles6cjs source.js^#!\s*/.*\b(node|js)$\n?©xΪν=K{ΫF’”%Ώ”ΨN2ρ;v$?dB)?2I,‹RbΗIœIlOœŒgBH2H‚$, Π’’φμiχΆ—=μaΐώ„=ν}Δώ–ύΆ@7ΊέxP’γμZ31ΘfuwUuUuUυ;₯πογθyΩ°{½Ω3<―7ύΣͺ΄ΜΆe[ΎεΧ±Δε«vƒT+Tν&©v P΅[€Ϊxτ<#©6pιϊ–ιΕDMDΟχxx§ί7mŸ;˜G©==OρpC··]iΈFsΓd[==ΟsΠힳιo̊aێoπ£p$zž•WIφq4z~$―Π29ΠΙdώ:”ςw’η9yΣΫξ;ξ χςnτ<-―α;¦Νr,8Εηx.p*o'rS9{/ψ'όύθyΪMΜD–‘•|7]†τFͺNYρΖ°zΗ5έ½Έ—SΑhk'SΑ(CO₯‚QFž–ŠΝso«bΎ4zCΓ7[•¦Σ2c4ΟH5Χπ|Χ²;•CjΕΞ lˆ+ψF§bΪ θ9FΤσ ׏‰Φ^ε€{0ίθU Χu6+tŒzFΓμ1CJTλbŽΚq­ EjΡ»X€ΐ₯Ό ΅“#6•˜β3˜’q)0•¦ΛRƒJDdΨτ7ΖόŠT:H•6 z5”’8#Ύ(¨J*I§/±Z _ΞOΡςΑSζΟ¦R z£2'ω¨Hθ|*t8ΑΗΠ•<Π”Θj*΄kvΜ­AάφB*thRbθλιΠ›–ίdfΈy )ή7σ@Σ‘Ή•*aΎΩτΐx&ψ€P5ŠΫ₯ΈΉΞΠnI|ŽO₯³£χbhΈ2ε3©Eχόν^`όϋΗζ½±ΟsV θίΞYrw1gjyξδ¬@]‚%©]󆃁γϊΗε©EOβ^―χ Λ&Ώ.GΟΓτΧ`¦"?―DOβ:’ Ώ!Œ–ΒΙ&ΰ_ ξξm5:&½+ΈK’#Nΰξ (ǚόώUτœ Ώ»΄ϋΡ“8|Ό³M Ύ Lο3μ7Ά€1…ϊ&z,…kzCύ·‚E”8λτAτ|_qϋNΰ¨ΜΡ&°Rυo΅€aVΫ2]ϊ}τό@₯Ύ8ό!zž!C?–€=lG†Jͺ=Δ3ςΙϏ…9 {[†φ§1Cςbul, ώΟY<Ό Θ…1η )zO’η» f%+Ÿ?IϊδύSω³0θ Ώ”ώ%zΎΓFώ(y= œvU°Μr·Ž@-z^H…ަkRιΞω"@uA0%NΥŠ€¬ †CtQܚ`EVΣθQI[ Β#ΰΟhΒ0CΡβ†Ή½ιΈ sΨPPΣž›‚ΰς^j SN ew†ΠkΘz#Φ3«ΒKΓ΅ŒFβΫVΰ{ΥQŒ|4%°#ΠU5贆q·–Κφ±y{.hΒs gΤ7€0 ω6s°§ d€εcΘ™αΎΕΠ»$PΆ*4ΚQA(DMpΩψ …¨‰Cμ 3+λWxb}Σ ₯ͺ ­Qφϊ﨑0ΕΞ {)4™NθΣg¦€MaDnά,q―8Λ΅­ |0τkτά‰žc‚!a7ͺ^Χ εΎJ&ΡκsΒΗ qα8ΣR^©ιήlύΞΞͺF;@jΰ‘gj±ό‘’ό’ό+EωΧi䱞^3¦ΡΦSIςŒf<>Ηύ]Συ‘rΨώoV5 %ΆΊΖΣθz•E— Οo|H>-ŠVͺžΣά¨Άœζ ζ ―1/‚€>»@a8¦I™1SQ5ΝͺƒηήΆΦ{Rχ₯«ωPVDλ;Ž˜/U<˜^5ˆέΘ:•‰ήiΆ“ ω¨u!v€=‘σlΤžΗ‘žS±Ω‡,~‡i|"bIBˈδ_–ŒŽgnnLI + νdYTVΜoΎ'8Υ+ίAmΧιkκ7rΧε|^ͺ½ΚθQe€ΎS”ΐvDbΒr}ύŠQωυΛΚ/«υ+ϊζκ¬F ώdUnWqˆZ%θ+ƒIΓυ<бόΪ$#SX‹Œΐwy}ι$_τΥ7'ν΅[гR!&1Ά Γ,FﳃbuΚ);bωχŠς―R˜xxD&–%Ld&Γ8)–ΖI•zΐφx,f΄^Υτ*ώŸh@’„B•ΔΒUς˜F‹œœ†‹88$hŒιΰΖs<ΑŽyςaN*\ΈŒUήζj™όΏ¨"<ΞF’Gj° ώƒΨgˆc,ΖΡθ₯β#t|jυy-KvE—ςΫq”(MσmI½gςnώ!*ΌΝΦ‘Nή•)/YόNŠ?Z‹ψhrοΏα€Ÿ~}€Δ’nB’«Υ‚ΐ:^|6lεοS©$WR,}άk`ŸΆrIkœΑYšj˜ΰc‘₯_τ™ΨfΔQŸiθώTRznβa|ς₯… ύ«ΒH¬(OAbŒ•η1¬•…²~S+/k¨Ό°Ο= y|—•XΐόΈ’Ξ< Υ0;–My—ΡžΤ… ΟQύR6:Ρ@Nμik|ͺ©'ωθ/ž ΰŸ`Ή$m8N%j©¦k~jΛI7B|^€ ¬TyΧ‰τ*₯κ‘ΠΤ))φΏΔ§XΔiŽώwEΒ)ο=œ4hώπ?Ζβ&ΪRάvjΣχ')ΓΉλjŸ5³ο%&Œ₯MζL—€„ξdvvVE(±Ίͺ/—J9'­ƒρ€΅3b~ƒΛc|‹]X4Κζ,Ί΄<ψ˜{`9α‹κ§P{IlηdRςψVπψˆ¬Pε¬ΏMaϋaE_YIo}έS”©(Ώ«(BQώ•ΐTΞ½΄‚5a,ρΒ|švŸ€τNσ:We”NNΆΏ_ΩφΛr†ΦAWrθω’|ώ A+΅<Ε\ζνΞb'82.5Ω6Gbο‚εΡάφŽφUΕδ„}e™œ™R^“Γζ³²Έ EΛϋi–€χΎRΖζplΔ²QΜ³~…ήS ςz±8'Ε"v^7>§₯ψDNΞλBFTN!€ώΥQ…e΄œ3ΰ“i‡4_ΜTUYgΕ ‡UΑ{ΛL•…p„ζŽ³DKΧyŒ<©Ί X+ίϋή’`?ά]“Φ ΛCΧ;V›1Δ™"-/’Κ4P`Hxӈ8p3‚t*Θ£ω†<>}BEWΏΙέή_ڈűlG«U΅z=³ΩOΫάμYΆR<7ΣΔ3άΤτ„bωPŠΓ>zϊ7K)†EεήΎ’­ŸU,ςά›†g"fcΨσeξϋ˜‚"ΕxΏ•λτψΡ’q«€`§—Χj2Δ-ζL–ΛΪ<(›gΚΡ#(œβ5Π²!Νλ­F¨‡€ΚMvά₯IΩ&ΫΝ:λΟD—œlΡ¬6»`ύ›x‘Ατš³6Μ·p%[ /K‘φ† βήa υY’ωGiΓΥ±\LγeW9ξωΣΦΣΩ₯ŒΔ· £–ά|zΛ)“Λ>;ώ"¦η•˜†›'s‘š½&}&‰jΤ~\9+˜ΨŽyaœμ8C›Jΰ“₯‰―–­Ιδ;9#–>Ρ©twŒGνΉ‡±{K"K’rŠbχz<ΣDΔ‚ ΄ @‘Fd˜²;₯Ρx½PŒΧYh,‰τ_aY͝V¨ΒœΫ­n'ΨEˆΉ~,iφΖJ]ΞΓαV@lχχ«άΖYΌΤΒόάμši»& 1―^•’/PΑz^iώ;*β[{/©Ίep9 x\ΧPQώRQώuJœ›OΈ–ΏψBΜρ‘0‰€\ΣΊΆνΫ]*―BΜ|^Κ^ !VbCˆ°wPΖ(ώο$cΪκ«—­+2+΅‘L¦σC΅CΫΪ&Λε•εŽι#Οέ›ƒ‚•εΙ©©rωš†ͺ―]ΣυU€ƒG?«A™†‚/E?^b~ΌD~LpRoΝiΪ$ΛBŠμ; ΞΡl*_ψбλΈ7“Ke‰ύΧΈ‰Ε.Ϊ0Έƒx‘hχPN‚#Ε:Ί ‚&…Ίπ mJ;ŐRΙ6oδžs²ύZEyR!Κͺ!=°«!/Ζ½‰] ιΑœΪA‡‹tdΝ-£“{#£γ₯Ό…ΨΞGY”•εh" Ο7›P&nι&F²ο΄‚³ΧŠ–΄IΓΫΆ›L; cΛ΄‘D‹Ξ€α4θ‚^Φς7G½ΓYq³™);¦MχNB`oy©Aύ˜”‡‰e»Hmk«Ωs7 Ρι ^ρ g}d£=‘6Ϊ\ŠˆˆΧ‚>«Γl>½ν-η>ƒ£ΒŽC€r0ΘμϊZΎ³’ξΈWœ+_Y^šTP₯²¬‰«oόΙ‘ίΗ[2wΟ‘Xšθ ‘…­ Ρ_Ό’ιφJ2OV ςΞ-gRQρz†ΧeΡΫ=:Δΐ•/OΛπ9-ΓΗλš Γξμ1* vK<₯.–’(o)ΚWεEω–’ό±’#σNΪ¨LdΠΰœ€ΐ/φ6j8N/ψΗ4lΤ·ΆΜ oNAa”…^:V‹J’¦k‘ΔέΆϊ–R5šdV'Ύ '^ލJVFRεœΡ ω²τzξέ΄‘T(\­ΎΈ‚f JΕ―€κζA:Ε9Κ:š ’•δ6%BΙ4ΟυRφ@D[^βA ήQ}vqeU!ΉœRD‘r9mFϊς·/9ψšFς8Χ4Φϊλιύ„Όχςλιύ=iο΅μσΧ»ΙΐΏ_RX>Υ™^•Λ”vΦwlDΆΞJΨ*?λ›ΕΫJ)θIO•‚6Οu^τžeZ…9ˆcLυg—£Γ•™mœ*εε=¨+ήφž~w+§α~?9ΧTΈΙ†t?‘Εΰ/Lοξ B~~T”YQώEωΟ#Θ''ΔɘIΎ2αzεφκΊ yqtyKοΞiwDDΆ»(δΟ BύŒώdφŽ˜²w5ŒVΕθΓxzFxΘΰμ›νξΞ€Ψ-ΊŽL/ͺ€χLnι₯›κxu/½Œdœ\WβwΆ°v©mξޜ–Taz.·™"gΠΚK\F€re±ŠΥU<Β!†`oΘ‰VΞKΕaIτdD…Α­Z6ήGΣƒi!]cΈ -‰Η£΅EI’ Ÿ γc /0ΐr2.©•uΌΔ¬²•΅Υ9 ι₯ʍem6>X‡Έ°•sιEΕ|w1ˆ©–.cqcݟ‹rŠγ°MηΓΣOӎ|97‘h<ύ2ƒŠZι§JcyFάHθυ•:ΓUΰ=ΔΨezhE Ώ'Έ?WπGje2άuQH +†%ν(¨8&J7–9ό0žΕjrΓ*w\gb„ž°C# Ψαέ©ζEN5ϋ)94wŠΥά”γδcGί Λ> Λ‘‘¬ΡΡ]Z£^αΫ/λsπ7¨‚ϋQς σΑέΩ„9›πl/‡%‡ ΘuΓo6[ό–γuh$΅<ΌK΅,ρN/Bό;οΚνΧ6²@ŠΓGΒqAΩίUΟΫ-hoΆ ‰»*σŸς}wwΖυ#N£ώνΝP f9ΗKcΗίκΥ[½Ϊg½:6$x|o'A.₯—\*‡”Eΰsh¨œ·lMScφͺφDœ”‘₯r_.Ι€iyVn¦JŠ?υ^QΫάΔf©P^0£\ž<­ς† Υ4―δFσ½ΔP΄7Ο™j3r¦Ίη8ƒΜ¦aΖIOŸ7τ“^e"š°ΌŒυΩΰxM]χΚK«ZhΨ-Pleύ&€ΌΞ€ͺdηΪ }¨Αͺq.sƒϋ―άXξE–DΜqBΡh#₯tΠU-ήζHφ#G’%ΎGGί=:WΑοKω§<βϋϊΕυΘo$oRDŸ%D‡G’‚§ΪTB4[Κ;ΧΡ…Eι§—qΐ‘iβ ­βp΅3τΉσΥJίιCΡμ€LdΆOΙ½Œ'χΣx>•ΐ•sΘ§ΘΡq₯w’FZŒΥΉ ¬žiβ^# R°ώΩ1[τEe»Η*Ν]ϋή)ϊΝG»τN(τ6μ}φξWΨ›5Se¦8±73Ε΅RΚLΑ€ΗΤ,ΡDϊλhΝΜ ώ‡τ΄ˆj¨ΆŒτ§αύh-zκO£³ΠZ΄ϋvIφŠsΉQŒΕ'Mƒ­Z¨gϊl_‘’BO¬,Λξγ {N`(›†ε£mΛμ΅΄0ε.Ζ.©fJU°‹3σ”Ktb@7Ί"ζS ΏNIΈo΅‘ΩσΨσ νΑ³eΙ6žΟΘΥπ›]v¦Αmδw!„|w›ιζΌ’€ *σ}|.ι£αšΖΒυ,{h’–ƒ:‘ΝΥ3‘p\ήΤDάγ}I¦=μ£π­h0lτ¬&Ν N4p­—0Ε#š2B8>3›`™ξΕΫζΒνšι™ξKρ ±“ Zfc…+9a'^˜σ*2χ £-|θΆ»s#°«΄˜m>ζ9ˆkΩΨj…ΘHύ°EMy­\Θ §ρΖΟiήξΕΜΌu8%Y˜=!en» ώήO ΅οYœ©£Y€θ΄KWΘ:‚ί6xMΏ”ΩjPƒo6‰«=μυ$2žlfY$°»ΑiΝEe‹Z~B'nφ‘ρiπŒEΓNΥξœμΗL7aWΑk©‚ΫH$"!#™Κaγ–’$2JΆο œ8§l;€δΫ=§nΧοZžd,“Νbΐά­zf―«U Θ·ΚΒ©”υυ ο΅Ύž‹ψV)rAƒΜΥθ’C~Ι&…Λγ՘Ζ9Λ<"ΐέfΟxoΌq,nμ ›`“Ϋb±WCβϋ"F/½LΩEΔ†hAŸ­Ξκ³ PĜ6<¦°9―gR€βˆ‰ρž*fc»b1[ΑΌΊβ‰ΩŽδ$θθΪeΌW„ 1βS‘NJ!₯ςV*œRΎ`u0\¬δuΉζlR0 )YϋΥΣ΄e|wΪ" } &x…ΛΠe\«–‰ΛˆΎ¬ZdN‘ή€―u1ύYΥ&₯žαd"3J0€ι’νpι„‚½§EKϊ›{™KOK Šhν2{˜Ξekηrqœgχψ›Ιξ˜Sσ<§6νFο.xSsτZͺσΚCς^&ξΫΒ₯Ÿζ•&@ϊψκdn’ΓoλF†'q2"ζRέ6ΞΐΝQ$, »hwλ•ΉU¬iΧ·κΧ+·JΏ¨¬ί…²zp1ρVΪΔk €y.θSΧάβρΈLϋbϋ [Uτ1•Ρ‡ΣτΕΠ₯1*Vθ‰}…'xŠzγ:ξεLxSβίε©$‰άνΜ°Οδ`AΏ!TΜ'$B°k:‰ΏιwυjHJ΄fV;Υ©κνΫ·CȈ ε¨ΈΗ<$bΰωΰΓ”γN…5΅²‰ ]‰XΈ"ιÜ»qσΦόΤύ <&οE§(α.ΗΧ³²Ρ+?°OˆΝ₯%N½°ΒŠ€SΕ“»‰γŽDGZ&>Ώ‡Θ ΄œ6|DΆΉ‰ΰSx­Ap³ΒΊ,Ή*0‘22ΒΪˆ§kξυœŽv’b;~ΐOΧκtύŠοTzfΫ'ί'gfπo,Όa·x †Α8ψή€c'ΒΓΑ!ΰ0–JpUͺ’5ΒΣs‹₯§Πƒ;ŒW΄§€τ°ζ|§sάηŒ1}^­E,ΙΣεδL!h}ΆVzt₯& Επ^+„7*½΄TzyΉ4/(>εβc ;ψ)fΞΎaιοD·–Ώiyf†..- ΰ^Χ ~–ͺ"PVΊHΫ3"βιFaM€ήŠŒ‚Β„Πy+„ή•‰αα?Y ²Dδά5{FΈό’ξorΉτT‘ΆΙΔ–:Ӕō€_«EΚbΎ‚7βo“ΩUŠΰt!θaUΞΆΙ¬ž:“x|$ΌΨθ•~1ρeΥ―R‰l™M׌UΚ^08w&TGΗ ΤŒ>T³μ"Υˆ,΄¬—~υz*;θΐϋzS©Πϊ,ίΪΐΊY0τ*θ9bΩ[α‚cjΫ"•ή°αγ«>H…‘ΕοBd"ΊbΔƒ――,f*5€±KΛ·pLπ«‚{‘2ƒ o‹œ-Ε•aΥ"αnΞ€2٘&ΉΗXHj“Φ£†q:;Όά¨Μ§Ό™ϋh‹νΡfβ­Lξ5€/!Šq IIK‰Ό+φΚ«;iο_΅ιC,ˆ=δ‡Μ€›KjΟK_6Q Ύ·Ο ΜkίΘ;guqv‡™°τ\Fσh½ΒΫhξ %΄Œ–jhΉ†j54ΕηPι³θ*Β†U*h @—αΛh&Ψw³†¦ΡίΕm8ΰ£ ϊΣ`;ΐ1τ§ΑVάπnw-jv-hu-jti>”C7 ­ν­…Ν­…­­M†ωŸΜΓιΜ“πιμ£,ΕVؚlŽy‘€ψΫν΅G{ƒήυάθ%7ύ„o#άΧχήȍή^½c0qSŽΑ,~~’†0·½‚XΚυΩhsώϊ½…?Μ¦¬!G f’Qጠ°πIΟdriγΣΰ^`RŸεwrΑ.y0ζ€BEφθ-”Ÿs”W„†―όΤΚΚ‰Œ!wbΔκ€bZgIL™’‹psbΉy›γζη*nζΊLζ™ΪTςΖΠ΄Eb9‹₯ΌsγΥ1‘Τ/]ΧΨFΑΏw‡νΆι’»Ρύσ_Ύρ Β«―πΎπ―{ŽαίΊ‚_>ύ$ϊ!ˆΘΒ|πo|ώI%ψψyψι»'’ŒόηwΡCγ!zήr(5τ―!©ŒŸ[ΫθG³έΓ₯?šϋ[τΔτΡ“π6ό'Ϋύ†Σƒ‡#~‚°οΎλ:.ϊيΐŸ ψσηΜΗ{=|n+,yj'ό|bϊ’ yK@θ·6†δ…όgrρδζ>ΜnθGH>˜˜Σ5!&€mίΨ F?ψ@[ Pgz=%νΥΔP|ŸδpO°Ž!ΣΜIi3ΆΣΚw%ψϋοUΜ&RόŠ5h hˆ?έ#oF@kτ#ύΔόΨwdbώt οΡ¦ύ8ς?‘ε}e Φl=,–χ˜δl΅84žΘ`ψ$ Ουw?X‹ΖΊƒ|η{Τ̌δΕw’C;κ:Ψζώ¨-9ΦAψEΥO:ލ$g@wάύΎΩ²°Ϊ„_q܈‰ ΎύdυMgθ#2ρ–kβέu1<ώB αs›"ŒΏδ^L +αN305°Τm·œMΙώξ]‘νo9}ΎιO%MwΒYφ›οέύς{δ:ŽΦΧ[–‹{π©mυLό1…Χl—IrώY*…`«΄`[0L| Ω ¨  gh Ά …ήsz=cΰ™­πλ}»…,»ν XΗ„q$Oό›J BπOP„έ4΄iΈΆ¦­0ω Uμ{1…Ζ= •’wΓψ‰‰ΘΖMSfβcύn³‹`rz‰)΅­θπKdn™Ν/qώπpsΛςοΑp‘ΎaΩ?D§‹ ‡ηβΆγφ‘η·`$πpπ/–~ΘωΨKΣΕK5δ‰οΘ1xS³‹Η―ΉΩ ZGΣο@‹ψΗΝ߆PΠuƒΑΑ¦"ϊa‚Τ7ϋŽ»ύ³‡6Ωζ¨Qs«nΓ£mxaΓΎαm α·€ρƒ:1Β F|άγ$vzOyE!‹Βγ„^…{ɼ耕ˆfΧκ΅`φBδw’ΈΦΈjφ¬K>ΥΈBέ”ΆLΜΥQr}jg'1-ŠžWόψΏΧΜž HTML (Jinja2)htm.j2html.j2xhtml.j2xml.j2text.html.jinja2^{% extends ["'][^"']+["'] %}rxΪ…Ž;€ DA–z―`aλa…‰‘Π-<^ΫΒΑ¬Dβ4/ϋ™έ)Ε­TΚiγƒx«y¦;ιβX‚Θ­XŠoIζ—Έ‘zEς§i>hXΘ­ƒ5ήκ‘οδΕΣ†Ώ₯ά+ΙβΕΨ'κ6ιχ¨'πmψJinja2j2jinja2jinja source.jinja2*xΪ՘KsΫ6€υπ3N›G“N&Ν΄uΕ’‰všΦŠλ™NŽ9΅—Š DAb PAΠv*蜿]ˆ"ψ€‘²ΗnΒΘ!»‹%χ ³λ~pί˜ΰ6ΌQθΊH<ΎόTH^ZΙWR²˜%y %KY’‡R²œ%ωZJdIώ$%Wƒϋν„δ Ψ¨Χτ2αxΧυ2αH7τ2α7›m»όzK±Φn» P&?o) kƒμΆν Ÿ”o#›taBφ+Εlδ@)ρ΅βπ8μEΖEΓ‘Ϋ3ƒ”Ί« ΨeαΎόzO™Hυ*Ζ(MV+)¦τ™^‚ϋΘΓ6σΓ2 @j~@ψ8(IαιΰΤη©}. “λ‘JΎKL€ωGμš]βuθΡ²JO3Q«)¨]ΨCωqˆ»‹ΠοεBwΕs~τέύAΒΎX¬y™χ―Κ˜Λ`Ύ« 7› ‡3³γϋ4P`Rp‡H€}+©Ζ•šεΦ«Βχ+“h½•{ςΎ-Σfˆ}LDΈ”ƒ†ˆ‰ τKJGiχ~<'΄kΪ3Jœ oωJfΤ‰LsŠΦ!2ύΗ;Ω«Ό’‹+°Ÿ`{,³΅:Υ!°)Ήu―Έ­έ „oΫ­zΝκ„šJ.Nœ%ΝoX.πδRςyΚX?[~F°>O[Oΐφ#¦λFiŸ,€EΈΟΈΘ½QΤΗ QtYϊF¦γ£†5Ά*ŸΆ΅·ΈzΌ-$š/­ω=ϊrμΙ‰tY§ p—CΗ…υ8Β\T?„2Ž γ„r mΊθ ςsΔUβ±Ϊ±πξT-Ό`.ŸαXšό>²άό“΅¨yσ]―¦ΝχΈE0Œ©}€¦ΰΎϊp^ρ³H±CȈ»ήRξB§ΗΕάΪwωιωτ–’>œ<½z9ΐτiRߩѐ’­jνqK„Aέͺ‹†οοσ}^©©υ…tͺΨPΐ5…v6{dΟ«~ͺζ5]Pe\%Φ₯l„hήβ IΗc0’ +ζά²+,Ι’Ϋ²$―Π`υΪ Σ Ž―Ν`bŸžόˆ‰ηΏr‹σ΅ά’‰‘Ee΅ΡΰG ήxˏψ[ΎέΘ^7’Z‰ιw…ξ9­²s#{υ‰³₯>φΛ­–죁zΚ€ηλλμ#œαγrͺώέ$XI «ίχ―ŠμyV ©UFQ…ώFΖTP«Ι…ΊΞEk ΘαwŒγΜyZͺΧΩ_O·?ΞaΉR[°‘PΙpeηo4Χ\±ψG˜$- ϋ΅ eΝnOύΫίΏνψmΟog²Τo™ίžE±»₯‰]ω«ΡΧgž;CΝ_΅–ΩΏμSΈƒKˆ³3YΓ?ζ ”¬,­dv:šP²ͺ‰ρCŽ\œkšDΆΨξ„)h}iOφφ ”‡—K+˜ΞcLΑ¦ζ‘W@!σ¨ΜΔ·”ξΩη& t‚Ύ[KOΰ€b» #R’=&ˆΗ˜ξd7ώώΆζ½όuόΗη‘Ijsonnetjsonnet libsonnet libjsonnetsource.jsonnet‹xΪέWέoΫ6›ΆΩ¬†u[υ‘YΩ¬ C7ly1’%Aӏ₯ؚv›ε΄t²™P€BRIΌ±/{ʟ½£,Ι’ͺ8…§Ωξψυ»Gς΄²4ϋέNεαaH(ΏX*VςV₯‰ΤYs«μ‰0ž7ίHεΝT‘—Sωq*εc/QΉ¨ ΜΘ•[o₯ςƒTΖό$ό‹Κ¨•₯ϊ_«0ƒVj­Jo©2Σ;Kœ#%8]μqω―U˜ΥΕewΛtFLxΗE;Uζ%Ίnw=―»ρώόmλύbχ―2ΌQΫυΧΪƒΦzΓ>:ύŽ;jUϊy‚c` ]‡ ©—žϋρλAΞΠυ»άF°χrΨsν:0ƒSiaΫd€ ρΎ”Gι3qr¦DQ’RŽ/RοœΔ„‚̈(ψρQ*ΆΑ>” [S ͺΖ—*Ž"!΅ΔάΣTπ‚ίW z@™ρ&D‹ Κ΅±|=£άW―©ž43φ²j ”G"ψ=Ω‹[DML±b[0F€*Υ=AΜRΕ‹©žތΞλwθœGΑΑNυ\ΏB/”iΘΔs™€­oJI¦ KB`«`>KήV—!ΡΝyUFT%v U[B0ΐX j7κ―q8BrT폎ΐΣ¨ΜΌbŽpέ >ΦΓ(e˜›C‚ΧŒέΫ*»p€{œšL·+΄sžgλS)Ύ²ΛšUύ2;&dy͟$dΫΒ+•q^@ΒfΌŸΦπΦT)‚"ϋ؈ήγ>œg…§0E‹ώ·φ^νMLˆN …ίŒΕΏU"Y³] ΜW¦XΨd,-?&j•ͺΡΕzCͺμaΘ&J²EmίΣx‚DβΜD2ζ`$αcΈ¦­’@|ΆiX‰Φ1QyID’vΐmŒ*:Ά/|Π‚Q£ιϋ ­z"υ5-j’N$‡“™]ξΏLl˜‘ώDŒx`TŒ}₯±'ͺιFΡΣLΜιI3ϋUœhz FOpŸRΖOθƒ—»?‘ Ρ»/ηuεΎ™Ω9ΧFKδٌΙΚόφz8œ#d—Ϊ)‘”Œ8 ƒ &cXx HοοΝή_‡C«|Χϋ9Ρ»κΆέφΰMΥ^ˆͺλυ76ϊύVεfΖσ“κ©ΓI‹81Ο hh'hfW©ΰ„Οσ”MHKά.Y ؝9Xf²’%CΗ0=w„ž€¬AωtŽ’€alΗx-wšωσ^az†ΰ3φ†0΄HξΛ 9L,΄l±Η0›Γέ­ e6ά=έ`²wηhZΖHŒXzLε7Υρ‹γεwRαu·»tUφ]J‘σοΧΨ•ƒoΧφX½rά­Ϊί^9ξζeŸ ³ƒΣρElC»ζSay±ΑΉdΐcΥuΧG—zhΪρ 6{»Γ½νδ‹ς f6%^+Ξ,ί«Y Or#ƒ7Ή‘xX5ΚO £ΎCƒ1©ΔΪυΈ`υΰ‚ϋedΑοωαxIΜ'ώψŠΔJuliajl source.julia^#!.*\bjulia\s*$ base_funcsώ\b(?:abs|abs2|abspath|accumulate|accumulate!|acos|acosd|acosh|acot|acotd|acoth|acsc|acscd|acsch|addenv|adjoint|all|all!|allequal|allunique|angle|any|any!|append!|argmax|argmin|ascii|asec|asecd|asech|asin|asind|asinh|asyncmap|asyncmap!|atan|atand|atanh|atexit|atreplinit|axes|backtrace|basename|big|bind|binomial|bitreverse|bitrotate|bitstring|broadcast|broadcast!|bswap|bytes2hex|bytesavailable|cat|catch_backtrace|cbrt|cd|ceil|cglobal|checkbounds|checkindex|chmod|chomp|chop|chopprefix|chopsuffix|chown|circcopy!|circshift|circshift!|cis|cispi|clamp|clamp!|cld|close|closewrite|cmp|coalesce|code_lowered|code_typed|codepoint|codeunit|codeunits|collect|complex|conj|conj!|contains|contractuser|convert|copy|copy!|copysign|copyto!|cos|cosc|cosd|cosh|cospi|cot|cotd|coth|count|count!|count_ones|count_zeros|countlines|cp|csc|cscd|csch|ctime|cumprod|cumprod!|cumsum|cumsum!|current_exceptions|current_task|deepcopy|deg2rad|delete!|deleteat!|denominator|detach|devnull|diff|digits|digits!|dirname|disable_sigint|diskstat|display|displayable|displaysize|div|divrem|download|dropdims|dump|eachcol|eachindex|eachline|eachmatch|eachrow|eachslice|eachsplit|eltype|empty|empty!|endswith|enumerate|eof|eps|error|errormonitor|esc|escape_string|evalfile|evalpoly|exit|exp|exp10|exp2|expanduser|expm1|exponent|extrema|extrema!|factorial|falses|fd|fdio|fetch|fieldcount|fieldname|fieldnames|fieldoffset|fieldtypes|filemode|filesize|fill|fill!|filter|filter!|finalize|finalizer|findall|findfirst|findlast|findmax|findmax!|findmin|findmin!|findnext|findprev|first|firstindex|fld|fld1|fldmod|fldmod1|flipsign|float|floatmax|floatmin|floor|flush|fma|foldl|foldr|foreach|fourthroot|frexp|fullname|functionloc|gcd|gcdx|gensym|get|get!|get_zero_subnormals|gethostname|getindex|getkey|getpid|getproperty|gperm|hardlink|hasfield|hash|haskey|hasmethod|hasproperty|hcat|hex2bytes|hex2bytes!|homedir|htol|hton|hvcat|hvncat|hypot|identity|ifelse|ignorestatus|im|imag|in|include_dependency|include_string|indexin|insert!|insorted|instances|intersect|intersect!|inv|invmod|invokelatest|invperm|invpermute!|isabspath|isabstracttype|isapprox|isascii|isassigned|isbits|isbitstype|isblockdev|ischardev|iscntrl|isconcretetype|isconst|isdigit|isdir|isdirpath|isdisjoint|isdispatchtuple|isempty|isequal|iseven|isfifo|isfile|isfinite|isimmutable|isinf|isinteger|isinteractive|isless|isletter|islink|islocked|islowercase|ismarked|ismissing|ismount|ismutable|ismutabletype|isnan|isnothing|isnumeric|isodd|isone|isopen|ispath|isperm|ispow2|isprimitivetype|isprint|ispunct|isqrt|isreadable|isreadonly|isready|isreal|issetequal|issetgid|issetuid|issocket|issorted|isspace|issticky|isstructtype|issubnormal|issubset|istaskdone|istaskfailed|istaskstarted|istextmime|isunordered|isuppercase|isvalid|iswritable|isxdigit|iszero|iterate|join|joinpath|keepat!|keys|keytype|kill|kron|kron!|last|lastindex|lcm|ldexp|leading_ones|leading_zeros|length|lock|log|log10|log1p|log2|lowercase|lowercasefirst|lpad|lstat|lstrip|ltoh|macroexpand|map|map!|mapfoldl|mapfoldr|mapreduce|mapslices|mark|match|max|maximum|maximum!|maxintfloat|merge|merge!|mergewith|mergewith!|methods|min|minimum|minimum!|minmax|missing|mkdir|mkpath|mktemp|mktempdir|mod|mod1|mod2pi|modf|modifyproperty!|mtime|muladd|mv|nameof|names|nand|ncodeunits|ndigits|ndims|nextfloat|nextind|nextpow|nextprod|nonmissingtype|nor|normpath|notify|ntoh|ntuple|numerator|objectid|occursin|oftype|one|ones|oneunit|only|open|operm|pairs|parent|parentindices|parentmodule|parse|partialsort|partialsort!|partialsortperm|partialsortperm!|pathof|peek|permute!|permutedims|permutedims!|pi|pipeline|pkgdir|pkgversion|pointer|pointer_from_objref|pop!|popat!|popdisplay|popfirst!|position|powermod|precision|precompile|prepend!|prevfloat|prevind|prevpow|print|println|printstyled|process_exited|process_running|prod|prod!|promote|promote_rule|promote_shape|promote_type|propertynames|push!|pushdisplay|pushfirst!|put!|pwd|rad2deg|rand|randn|range|rationalize|read|read!|readavailable|readbytes!|readchomp|readdir|readeach|readline|readlines|readlink|readuntil|real|realpath|redirect_stderr|redirect_stdin|redirect_stdio|redirect_stdout|redisplay|reduce|reenable_sigint|reim|reinterpret|relpath|rem|rem2pi|repeat|replace|replace!|replaceproperty!|repr|reset|reshape|resize!|rethrow|retry|reverse|reverse!|reverseind|rm|rot180|rotl90|rotr90|round|rounding|rpad|rsplit|rstrip|run|samefile|schedule|searchsorted|searchsortedfirst|searchsortedlast|sec|secd|sech|seek|seekend|seekstart|selectdim|set_zero_subnormals|setcpuaffinity|setdiff|setdiff!|setenv|setindex!|setprecision|setproperty!|setrounding|show|showable|showerror|sign|signbit|signed|significand|similar|sin|sinc|sincos|sincosd|sincospi|sind|sinh|sinpi|size|sizehint!|sizeof|skip|skipchars|skipmissing|sleep|something|sort|sort!|sortperm|sortperm!|sortslices|splat|splice!|split|splitdir|splitdrive|splitext|splitpath|sprint|sqrt|stack|stacktrace|startswith|stat|stderr|stdin|stdout|step|stride|strides|string|strip|success|sum|sum!|summary|supertype|swapproperty!|symdiff|symdiff!|symlink|systemerror|take!|tan|tand|tanh|tanpi|task_local_storage|tempdir|tempname|textwidth|thisind|time|time_ns|timedwait|titlecase|to_indices|touch|trailing_ones|trailing_zeros|transcode|transpose|trues|trunc|truncate|trylock|tryparse|typeintersect|typejoin|typemax|typemin|unescape_string|union|union!|unique|unique!|unlock|unmark|unsafe_copyto!|unsafe_load|unsafe_modify!|unsafe_pointer_to_objref|unsafe_read|unsafe_replace!|unsafe_store!|unsafe_string|unsafe_swap!|unsafe_trunc|unsafe_wrap|unsafe_write|unsigned|uperm|uppercase|uppercasefirst|valtype|values|vcat|vec|view|wait|walkdir|which|widemul|widen|withenv|write|xor|yield|yieldto|zero|zeros|zip|applicable|eval|fieldtype|getfield|getglobal|invoke|isa|isdefined|modifyfield!|nfields|nothing|replacefield!|setfield!|setglobal!|swapfield!|throw|tuple|typeassert|typeof|undef|include)(?!{{symb_id}}) base_macrosβ\b(?:Kwargs|NamedTuple|__DIR__|__FILE__|__LINE__|__MODULE__|__dot__|allocated|allocations|assert|async|atomic|atomicreplace|atomicswap|boundscheck|ccall|cfunction|cmd|coalesce|debug|deprecate|doc|elapsed|enum|error|eval|evalpoly|fastmath|generated|gensym|goto|inbounds|info|inline|invoke|invokelatest|isdefined|kwdef|label|lock|macroexpand|macroexpand1|noinline|nospecialize|polly|show|showtime|simd|something|specialize|static|sync|task|threadcall|time|timed|timev|view|views|warn)base_module_funcsα\b(?:Base\.(?:abs|abs2|abspath|accumulate|accumulate!|acos|acosd|acosh|acot|acotd|acoth|acsc|acscd|acsch|addenv|adjoint|all|all!|allequal|allunique|angle|any|any!|append!|argmax|argmin|ascii|asec|asecd|asech|asin|asind|asinh|asyncmap|asyncmap!|atan|atand|atanh|atexit|atreplinit|axes|backtrace|basename|big|bind|binomial|bitreverse|bitrotate|bitstring|broadcast|broadcast!|bswap|bytes2hex|bytesavailable|cat|catch_backtrace|cbrt|cd|ceil|cglobal|checkbounds|checkindex|chmod|chomp|chop|chopprefix|chopsuffix|chown|circcopy!|circshift|circshift!|cis|cispi|clamp|clamp!|cld|close|closewrite|cmp|coalesce|code_lowered|code_typed|codepoint|codeunit|codeunits|collect|complex|conj|conj!|contains|contractuser|convert|copy|copy!|copysign|copyto!|cos|cosc|cosd|cosh|cospi|cot|cotd|coth|count|count!|count_ones|count_zeros|countlines|cp|csc|cscd|csch|ctime|cumprod|cumprod!|cumsum|cumsum!|current_exceptions|current_task|deepcopy|deg2rad|delete!|deleteat!|denominator|detach|devnull|diff|digits|digits!|dirname|disable_sigint|diskstat|display|displayable|displaysize|div|divrem|download|dropdims|dump|eachcol|eachindex|eachline|eachmatch|eachrow|eachslice|eachsplit|eltype|empty|empty!|endswith|enumerate|eof|eps|error|errormonitor|esc|escape_string|evalfile|evalpoly|exit|exp|exp10|exp2|expanduser|expm1|exponent|extrema|extrema!|factorial|falses|fd|fdio|fetch|fieldcount|fieldname|fieldnames|fieldoffset|fieldtypes|filemode|filesize|fill|fill!|filter|filter!|finalize|finalizer|findall|findfirst|findlast|findmax|findmax!|findmin|findmin!|findnext|findprev|first|firstindex|fld|fld1|fldmod|fldmod1|flipsign|float|floatmax|floatmin|floor|flush|fma|foldl|foldr|foreach|fourthroot|frexp|fullname|functionloc|gcd|gcdx|gensym|get|get!|get_zero_subnormals|gethostname|getindex|getkey|getpid|getproperty|gperm|hardlink|hasfield|hash|haskey|hasmethod|hasproperty|hcat|hex2bytes|hex2bytes!|homedir|htol|hton|hvcat|hvncat|hypot|identity|ifelse|ignorestatus|im|imag|in|include_dependency|include_string|indexin|insert!|insorted|instances|intersect|intersect!|inv|invmod|invokelatest|invperm|invpermute!|isabspath|isabstracttype|isapprox|isascii|isassigned|isbits|isbitstype|isblockdev|ischardev|iscntrl|isconcretetype|isconst|isdigit|isdir|isdirpath|isdisjoint|isdispatchtuple|isempty|isequal|iseven|isfifo|isfile|isfinite|isimmutable|isinf|isinteger|isinteractive|isless|isletter|islink|islocked|islowercase|ismarked|ismissing|ismount|ismutable|ismutabletype|isnan|isnothing|isnumeric|isodd|isone|isopen|ispath|isperm|ispow2|isprimitivetype|isprint|ispunct|isqrt|isreadable|isreadonly|isready|isreal|issetequal|issetgid|issetuid|issocket|issorted|isspace|issticky|isstructtype|issubnormal|issubset|istaskdone|istaskfailed|istaskstarted|istextmime|isunordered|isuppercase|isvalid|iswritable|isxdigit|iszero|iterate|join|joinpath|keepat!|keys|keytype|kill|kron|kron!|last|lastindex|lcm|ldexp|leading_ones|leading_zeros|length|lock|log|log10|log1p|log2|lowercase|lowercasefirst|lpad|lstat|lstrip|ltoh|macroexpand|map|map!|mapfoldl|mapfoldr|mapreduce|mapslices|mark|match|max|maximum|maximum!|maxintfloat|merge|merge!|mergewith|mergewith!|methods|min|minimum|minimum!|minmax|missing|mkdir|mkpath|mktemp|mktempdir|mod|mod1|mod2pi|modf|modifyproperty!|mtime|muladd|mv|nameof|names|nand|ncodeunits|ndigits|ndims|nextfloat|nextind|nextpow|nextprod|nonmissingtype|nor|normpath|notify|ntoh|ntuple|numerator|objectid|occursin|oftype|one|ones|oneunit|only|open|operm|pairs|parent|parentindices|parentmodule|parse|partialsort|partialsort!|partialsortperm|partialsortperm!|pathof|peek|permute!|permutedims|permutedims!|pi|pipeline|pkgdir|pkgversion|pointer|pointer_from_objref|pop!|popat!|popdisplay|popfirst!|position|powermod|precision|precompile|prepend!|prevfloat|prevind|prevpow|print|println|printstyled|process_exited|process_running|prod|prod!|promote|promote_rule|promote_shape|promote_type|propertynames|push!|pushdisplay|pushfirst!|put!|pwd|rad2deg|rand|randn|range|rationalize|read|read!|readavailable|readbytes!|readchomp|readdir|readeach|readline|readlines|readlink|readuntil|real|realpath|redirect_stderr|redirect_stdin|redirect_stdio|redirect_stdout|redisplay|reduce|reenable_sigint|reim|reinterpret|relpath|rem|rem2pi|repeat|replace|replace!|replaceproperty!|repr|reset|reshape|resize!|rethrow|retry|reverse|reverse!|reverseind|rm|rot180|rotl90|rotr90|round|rounding|rpad|rsplit|rstrip|run|samefile|schedule|searchsorted|searchsortedfirst|searchsortedlast|sec|secd|sech|seek|seekend|seekstart|selectdim|set_zero_subnormals|setcpuaffinity|setdiff|setdiff!|setenv|setindex!|setprecision|setproperty!|setrounding|show|showable|showerror|sign|signbit|signed|significand|similar|sin|sinc|sincos|sincosd|sincospi|sind|sinh|sinpi|size|sizehint!|sizeof|skip|skipchars|skipmissing|sleep|something|sort|sort!|sortperm|sortperm!|sortslices|splat|splice!|split|splitdir|splitdrive|splitext|splitpath|sprint|sqrt|stack|stacktrace|startswith|stat|stderr|stdin|stdout|step|stride|strides|string|strip|success|sum|sum!|summary|supertype|swapproperty!|symdiff|symdiff!|symlink|systemerror|take!|tan|tand|tanh|tanpi|task_local_storage|tempdir|tempname|textwidth|thisind|time|time_ns|timedwait|titlecase|to_indices|touch|trailing_ones|trailing_zeros|transcode|transpose|trues|trunc|truncate|trylock|tryparse|typeintersect|typejoin|typemax|typemin|unescape_string|union|union!|unique|unique!|unlock|unmark|unsafe_copyto!|unsafe_load|unsafe_modify!|unsafe_pointer_to_objref|unsafe_read|unsafe_replace!|unsafe_store!|unsafe_string|unsafe_swap!|unsafe_trunc|unsafe_wrap|unsafe_write|unsigned|uperm|uppercase|uppercasefirst|valtype|values|vcat|vec|view|wait|walkdir|which|widemul|widen|withenv|write|xor|yield|yieldto|zero|zeros|zip)|Broadcast\.(?:broadcast|broadcast!|broadcast_axes|broadcastable|dotview)|Docs\.(?:doc)|GC\.(?:)|Iterators\.(?:countfrom|cycle|drop|dropwhile|enumerate|flatmap|flatten|partition|product|repeated|rest|take|takewhile|zip)|Libc\.(?:calloc|errno|flush_cstdio|free|gethostname|getpid|malloc|memcpy|memmove|memset|realloc|strerror|strftime|strptime|systemsleep|time|transcode)|MathConstants\.(?:catalan|e|eulergamma|golden|pi)|Meta\.(?:isbinaryoperator|isexpr|isidentifier|isoperator|ispostfixoperator|isunaryoperator|quot|replace_sourceloc!|show_sexpr)|StackTraces\.(?:stacktrace)|Sys\.(?:cpu_info|cpu_summary|free_memory|free_physical_memory|isapple|isbsd|isdragonfly|isexecutable|isfreebsd|isjsvm|islinux|isnetbsd|isopenbsd|isunix|iswindows|loadavg|total_memory|total_physical_memory|uptime|which)|Threads\.(?:atomic_add!|atomic_and!|atomic_cas!|atomic_fence|atomic_max!|atomic_min!|atomic_nand!|atomic_or!|atomic_sub!|atomic_xchg!|atomic_xor!|nthreadpools|nthreads|threadid|threadpool)|Core\.(?:applicable|eval|fieldtype|getfield|getglobal|invoke|isa|isdefined|modifyfield!|nfields|nothing|replacefield!|setfield!|setglobal!|swapfield!|throw|tuple|typeassert|typeof|undef))(?!{{symb_id}}) base_modulesb\b(?:Base|Broadcast|Docs|GC|Iterators|Libc|MathConstants|Meta|StackTraces|Sys|Threads|Core|Main)\b base_typesο\b(?:AbstractArray|AbstractChannel|AbstractChar|AbstractDict|AbstractDisplay|AbstractFloat|AbstractIrrational|AbstractMatch|AbstractMatrix|AbstractPattern|AbstractRange|AbstractSet|AbstractString|AbstractUnitRange|AbstractVecOrMat|AbstractVector|Any|ArgumentError|Array|AssertionError|BigFloat|BigInt|BitArray|BitMatrix|BitSet|BitVector|Bool|BoundsError|CanonicalIndexError|CapturedException|CartesianIndex|CartesianIndices|Cchar|Cdouble|Cfloat|Channel|Char|Cint|Cintmax_t|Clong|Clonglong|Cmd|Colon|Complex|ComplexF16|ComplexF32|ComplexF64|ComposedFunction|CompositeException|ConcurrencyViolationError|Condition|Cptrdiff_t|Cshort|Csize_t|Cssize_t|Cstring|Cuchar|Cuint|Cuintmax_t|Culong|Culonglong|Cushort|Cvoid|Cwchar_t|Cwstring|DataType|DenseArray|DenseMatrix|DenseVecOrMat|DenseVector|Dict|DimensionMismatch|Dims|DivideError|DomainError|EOFError|Enum|ErrorException|Exception|ExponentialBackOff|Expr|Float16|Float32|Float64|Function|GlobalRef|HTML|IO|IOBuffer|IOContext|IOStream|IdDict|IndexCartesian|IndexLinear|IndexStyle|InexactError|InitError|Int|Int128|Int16|Int32|Int64|Int8|Integer|InterruptException|InvalidStateException|Irrational|KeyError|LazyString|LinRange|LineNumberNode|LinearIndices|LoadError|MIME|Matrix|Method|MethodError|Missing|MissingException|Module|NTuple|NamedTuple|Nothing|Number|OrdinalRange|OutOfMemoryError|OverflowError|Pair|PartialQuickSort|PermutedDimsArray|Pipe|ProcessFailedException|Ptr|QuoteNode|Rational|RawFD|ReadOnlyMemoryError|Real|ReentrantLock|Ref|Regex|RegexMatch|Returns|RoundingMode|SegmentationFault|Set|Signed|Some|StackOverflowError|StepRange|StepRangeLen|StridedArray|StridedMatrix|StridedVecOrMat|StridedVector|String|StringIndexError|SubArray|SubString|SubstitutionString|Symbol|SystemError|Task|TaskFailedException|Text|TextDisplay|Timer|Tuple|Type|TypeError|TypeVar|UInt|UInt128|UInt16|UInt32|UInt64|UInt8|UndefInitializer|UndefKeywordError|UndefRefError|UndefVarError|Union|UnionAll|UnitRange|Unsigned|Val|Vararg|VecElement|VecOrMat|Vector|VersionNumber|WeakKeyDict|WeakRef)\blong_op€(?:\+=|-=|\*=|/=|//=|\\\\=|^=|Γ·=|%=|<<=|>>=|>>>=|\|=|&=|:=|=>|$=|\|\||&&|<:|>:|\|>|<\||//|\+\+|<=|>=|->|===|==|!==|!=|<--|<-->)symb_idH(?:[^\s{{symb_lang}}{{symb_op}}0-9](?:[^\s{{symb_lang}}{{symb_op}}]|!)*) symb_lang(?:[(){}\[\],.;:'"`@#])symb_op)(?:{{symb_op_ascii}}|{{symb_op_unicode}}) symb_op_ascii[-+*/\\=^:<>~?&$%|!]symb_op_unicodeΖ[≀β‰₯Β¬β†β†’β†”β†šβ†›β† β†£β†¦β†β‡Žβ‡β‡’β‡”β‡΄β‡Άβ‡·β‡Έβ‡Ήβ‡Ίβ‡»β‡Όβ‡½β‡Ύβ‡ΏβŸ΅βŸΆβŸ·βŸ·βŸΉβŸΊβŸ»βŸΌβŸ½βŸΎβŸΏβ€€β€β€‚β€ƒβ€„β€…β€†β€‡β€Œβ€β€Žβ€β€β€‘β€”β€•β€–β€—β€˜β€β€žβ€Ÿβ€ β₯„β₯…β₯†β₯‡β₯ˆβ₯Šβ₯‹β₯Žβ₯β₯’β₯“β₯–β₯—β₯šβ₯›β₯žβ₯Ÿβ₯’β₯€β₯¦β₯§β₯¨β₯©β₯ͺβ₯«β₯¬β₯­β₯°β§΄β¬±β¬°β¬²β¬³β¬΄β¬΅β¬Άβ¬·β¬Έβ¬Ήβ¬Ίβ¬»β¬Όβ¬½β¬Ύβ¬Ώβ­€β­β­‚β­ƒβ₯·β­„β₯Ίβ­‡β­ˆβ­‰β­Šβ­‹β­ŒοΏ©οΏ«β‡œβ‡β†œβ†β†©β†ͺβ†«β†¬β†Όβ†½β‡€β‡β‡„β‡†β‡‡β‡‰β‡‹β‡Œβ‡šβ‡›β‡ β‡’β†·β†Άβ†Ίβ†»β‰‘β‰ β‰’βˆˆβˆ‰βˆ‹βˆŒβŠ†βŠˆβŠ‚βŠ„βŠŠβˆβˆŠβˆβˆ₯βˆ¦βˆ·βˆΊβˆ»βˆ½βˆΎβ‰β‰ƒβ‰„β‰…β‰†β‰‡β‰ˆβ‰‰β‰Šβ‰‹β‰Œβ‰β‰Žβ‰β‰‘β‰’β‰“β‰”β‰•β‰–β‰—β‰˜β‰™β‰šβ‰›β‰œβ‰β‰žβ‰Ÿβ‰£β‰¦β‰§β‰¨β‰©β‰ͺ≫≬≭β‰β‰―β‰°β‰±β‰²β‰³β‰΄β‰΅β‰Άβ‰·β‰Έβ‰Ήβ‰Ίβ‰»β‰Όβ‰½β‰Ύβ‰ΏβŠ€βŠβŠƒβŠ…βŠ‡βŠ‰βŠ‹βŠβŠβŠ‘βŠ’βŠœβŠ©βŠ¬βŠβŠ°βŠ±βŠ²βŠ³βŠ΄βŠ΅βŠΆβŠ·β‹β‹β‹‘β‹•β‹–β‹—β‹˜β‹™β‹šβ‹›β‹œβ‹β‹žβ‹Ÿβ‹ β‹‘β‹’β‹£β‹€β‹₯⋦⋧⋨⋩β‹ͺβ‹«β‹¬β‹­β‹²β‹³β‹΄β‹΅β‹Άβ‹·β‹Έβ‹Ήβ‹Ίβ‹»β‹Όβ‹½β‹Ύβ‹ΏβŸˆβŸ‰βŸ’β¦·β§€β§β§‘β§£β§€β§₯⩦⩧β©ͺ⩫⩬⩭β©β©―β©°β©±β©²β©³β©΄β©΅β©Άβ©·β©Έβ©Ήβ©Ίβ©»β©Όβ©½β©Ύβ©Ώβͺ€βͺβͺ‚βͺƒβͺ„βͺ…βͺ†βͺ‡βͺˆβͺ‰βͺŠβͺ‹βͺŒβͺβͺŽβͺβͺβͺ‘βͺ’βͺ“βͺ”βͺ•βͺ–βͺ—βͺ˜βͺ™βͺšβͺ›βͺœβͺβͺžβͺŸβͺ βͺ‘βͺ’βͺ£βͺ€βͺ₯βͺ¦βͺ§βͺ¨βͺ©βͺͺβͺ«βͺ¬βͺ­βͺβͺ―βͺ°βͺ±βͺ²βͺ³βͺ΄βͺ΅βͺΆβͺ·βͺΈβͺΉβͺΊβͺ»βͺΌβͺ½βͺΎβͺΏβ«€β«β«‚β«ƒβ«„β«…β«†β«‡β«ˆβ«‰β«Šβ«‹β«Œβ«β«Žβ«β«β«‘β«’β«“β«”β«•β«–β«—β«˜β«™β«·β«Έβ«Ήβ«ΊβŠ’βŠ£βŸ‚β«ͺβ««Β¦βŠ•βŠ–βŠžβŠŸβˆͺβˆ¨βŠ”Β±βˆ“βˆ”βˆΈβ‰‚β‰βŠŽβŠ»βŠ½β‹Žβ‹“β§Ίβ§»β¨ˆβ¨’β¨£β¨€β¨₯⨦⨧⨨⨩β¨ͺ⨫⨬⨭β¨β¨Ήβ¨Ίβ©β©‚β©…β©Šβ©Œβ©β©β©’β©”β©–β©—β©›β©β©‘β©’β©£βŒΏΓ·β‹…βˆ˜Γ—βˆ©βˆ§βŠ—βŠ˜βŠ™βŠšβŠ›βŠ βŠ‘βŠ“βˆ—βˆ™βˆ€β…‹β‰€βŠΌβ‹„β‹†β‹‡β‹‰β‹Šβ‹‹β‹Œβ‹β‹’βŸ‘β¦Έβ¦Όβ¦Ύβ¦Ώβ§Άβ§·β¨‡β¨°β¨±β¨²β¨³β¨΄β¨΅β¨Άβ¨·β¨Έβ¨»β¨Όβ¨½β©€β©ƒβ©„β©‹β©β©Žβ©‘β©“β©•β©˜β©šβ©œβ©žβ©Ÿβ© β«›βŠβ–·β¨βŸ•βŸ–βŸ—β¨Ÿβ†‘β†“β‡΅βŸ°βŸ±β€ˆβ€‰β€Šβ€‹β€’β€“β₯‰β₯Œβ₯β₯β₯‘β₯”β₯•β₯˜β₯™β₯œβ₯β₯ β₯‘β₯£β₯₯β₯β₯―οΏͺοΏ¬](>xΪν}ιwΥ΅―,s —$$„0Μ€Ά‘ΐN.I· Ψΐυ‰ξΰ6’Ίκt«PuU» pΈ—QR«™η0Δ$¬nΩ $€™yλζxΒ[{­χν­•Oογ[λνsjθκRWwΛ6„X[vŸ³λΤ9§φ{Ÿ±γ]ΨW+¦eŽ*—Ωƒlͺl3ΗΡΡα¦JOσ_›Cλϋ‡Mώ󢒎3ΧiΔΫΫή_ίϊ–ώT«Tbf<Ύ³Ϊϋ‹βϋ‡ΐώQ“?ΝRΧΦΝb,Ζ³;ωŒβόN`_Ϋδ³ΰ™ͺ‹y3¨*†1¨ΨEO²2X΄-―άψΜ9}}›ΐγlz²΅F$ΰxRΑ#ΦΟ=©ΰ[Βΰί=©ΰ? ƒ/°/kάTJ¬‘άοw"Jαyέ†ˆυƒΐΎ0=Dƒ‘vα9βεό.·§ Mζό¨)ΌαW‡2\4κL¦ΡpΦ₯4œk[f°0%«ΝΦ{J9rœ /OΛ’²’Ϋ2η{W™σ7BοFT—\uφ˜οΝ9ΒΘ<ψPξ`ξΠ CΏΎ~Γ}·\}(#œ7mΌ1—Λή;Όuδ?·]wΝ΅Ό?•¨,ώχ1˜yfž‡™aζ5˜yfή‚™w`ζ]˜ωΜ> ³Οΐμσ0ϋ"Μ~³Αμ ˜ύf?ΩOaφ3˜ύfΏ€Ω/aφ+8ς!ωŽœ?#ŸΒ‘ΟΰΘηpδ 8ς%ω †…G`αQXx ‡…'`afaαIXx ž†…g`αYXx^„…—`αeXx^……7aαw°pή‚ΕΗaρ XœΕYXœƒΕyX¬ΒβΣ°ψ,,>‹/ΐβΛ°ψ ,Ύ‹―Γβο`ρ,Ύ ‹ °ψ.,…Ε%X¬Αb—aρ,‡Εχΰθpμ}8φϋϋ3ΓΗαΨGpμϋŽ}Η>…cŸΑ±ΟαΨpμK8φŽ?Η…γΑβ 8Ž\} Ηgαψ―ΐρy8^…γOώυ«Ϊ_ΏZ†Ω7`φM˜yfΠ¬ΑLf–asώs˜Αά{fΩΗavfgaΆ³U˜}f_ƒΩΧaφ-˜}fNΐΜG0σ)Μ|•ίCε-¨Ό ss0WΉ*Μ= σ30?σΒόγ0?soΒšOΑά"Μ½ s'`ξS˜ϋ ζΎ€Ή/‘ςTƒΚγPy*3P™…ΚT*P™‡J*OBε)¨< •g‘ςTž‡Κ Py*/Aεe¨Ό•W‘ς[¨Ό•Χ‘ςTή„Κο r*ο@ε]¨…ΚTjP©Ce*Η r*€Κ‘ςTή‡ΚŸ ςg¨|•‘ςTN@εc¨|•O‘‚©ϋ*_@™ό ζ†ωG`ώ1˜ζgaΎσU˜ζŸ…ωη`ώy˜ζk0 ζσοΑόϋ0'˜3ΜσΒόG0ͺOAυY¨>Υ— ϊ2T_κ«Pύ-T_ƒκλP}ͺoBυwP=Υ· ϊ{¨Ύ Υw ΊΥE¨Ύ Υ£P]‚j ͺu¨.CυTCυOPύ3T?€κ‡Pύͺψ•‘ϊ T?…κgPύͺ_@υK¨b£˜ƒ#8ς<Ό{Ž> G£Ώ‡£οΐΡ8Ί΅w‘vju¨-CνԎCνPϋ#ΤήƒΪϋPϋΤώ ΅ φ!Τ>‚Ϊ ¨} ΅O φ)Τ>ƒΪηPϋj_Bν+¨? υG ώ(ΤƒϊγPκ3PŸ…ϊΤ+PŸ‡zκOBύ)¨? υg ώ,ԟƒϊσPκ/Bύ%¨Ώ υW ώ*Τ υΧ ώ:Τί€ϊ›Pԏ@ύ-¨κoCύ¨/@}κοBύ(Τ— ^ƒzκΛP?υγPΤυχ ώ>Τυ?Cύ¨υ ~κCύ¨ υΟ ώ9ΤΏ€ϊ—P –†εG`ωQX~ –‡ε'`y–gay–+°<ΛUX~–Ÿ‚ε§aωX~–ŸƒεηaωX~–_‚ε—aωX~– Λ'`ωcXώ–?…ω·aώ8‚1ΧayωΏί…ω—`ώe˜ΜΉ:Μ-Αό‹ύ>Μ½s/ΒVΔG‘‚5μi˜ ζ±Ÿ†κ pτS8ϊ,ΝΑΫ°τ,-ΐ",½ KGai –j°T‡₯eX:KΗaι°τ ,a!=΅G‘φΤζ‘φ$ԞΪ³P{j/Bνe¨½΅Χ‘φ&Τ~΅·‘φ<ωΥ_°"=s―ώε˜«ΑάQ˜ζ_…ωίΒόk0:ΜΏσΏ‡yδ=όζΰ l―ΨJ°Ζ=Υ¨ΞB΅Υy¨V‘ϊ$TŸκσpδ9xχcxχsxχKxχ+8ϊ=K³°τ,½K‚₯?Γ°τ!,}KψκcXΒΤ~KXΏ†ΪcP{jU¨=΅§‘φΤ^€ΪKP{j―Aν ¨ύjG φ,#‡OΑΛΓ›pδ%8ς2y–ŽΐΜs0σΜ">ΌGή‡…9X¨ΐΒ<,TaαyXΐ>»‹OΒβS°ψ ,>‹/ΒβK°ψ*,ώί€Ε7a;ώίΓβ;°Έ‹€Ε?ώυ«ϊ_Ώ:v(sΣΰ/9<Δϋ33Ή!BABABABABABAR ׎˜Ω˜Λδ†Άε2+¦P“σ­ηu3ߚœώόמv—OΙΏpαo.|›β0~›m)šͺ8.ίa©Ώs;ίι+-ω.=―ς݊;Ά=\ΜΟwγ\+ίη*κψ~[Q™ΓχM;|˜ΝΝαΫ-›‘έΜδςλ»\ιpqrKσb–'–ΊψΛπV,t97ΘQTΕ3$‹,B²Ι"$‹,BΚ8     ΰRΖSw9τv©˜^Ωbi°’’ΚλXφfΉΝ[!N“ΊΫ~gΗϊ“P»M7Ο υy›XΠ=Πy=w_Ϊzσ|8’Π~«ΗSωΦqέr…~n ύ ψψbσΨ™Τ΅ϊτ$’Τ©Κ΅ΚΧΣ°>Ώχ€”έαΣΕw|―Ul°mΥEΦάrSλΰטWu›W΄Κ«Σ›MμΫ›M—œΩΤτ"άo“s6F[ZDcmxΈσ¨ςΞφ¬υώ²–VR«ζΧΈ΅μŠ΄dύέl-ϋ»Θζ+Ο¬lnt•ΝNΙον"Βd˜όΧΡΑ}νό›ο뻐φυΡ ‘Ρ ‘ΡΝ!Ύ>BABABABABABAR ΧΒΎΎ.6υ]}Κ§«_q Ρ%Ύn^3ΣΈ=‘±ξ¬φsmζ\cѝΒωΒMSα!7b‚ΏύΙζατ}2Mώr–U-Skά3²raΡΊx¨Δbΐ³Ξ‹V$8Eβ‰S$N‘8Eβ'‘ρ„P1ΌΈi™33™Έ‚PάοΪρΒ Uh‘ΦIΆΡΩ›ΏߚvΪngYu¬βΎψΌΨςσœ³Qμ ©ƒ€’:Hκ ©ƒ€R» ׌ΪΝ‡‡y|xκ<Ύήv½ΛΒ‹Œ…ώ98yγyx†ΐΚνρΆmM6Ÿ5ΤΣsv¨β“bKHHHHHΈ†Φ§'爣³e£Ο±™ΧVοΖ.4ήPωlsΔbw+Ι[-cOvΊ Γ_η°€¨ΆΥr‘ϋϊΣΌΠ½—ց“ΨBb ‰-$ΆΨBb ιν€€€€€΄όδΥφf ΈΥ~θUgή¬η *»Σε`Uϊeqη€Q±n½α#ων–>»ΧΊ γ»Ύ­{5»Λ›ςυ†ξ²,Y4]ν †Ο3_υΆϊ‰Ώ3~HπΫ4$ε°Γ3UΦ-ΛΞP;ˆτ4p~ωό&±i˜E?κKƒ[cΣ:μ ωΉ―]›ΡXA7u?YώUIΖ‹) ϊΝן παΎϋΎΩ$υt›΄Ύζ€φ,‘(ΝςD?ž7,u<εψŒ0e6l8Ω”­Ίξνκ΄\ϊZrcύ·=7Ύ–Tχ~Σ©N‹ θsΒwρΈώ©‹Hδ_Έζ π1I™9x¦dgψ‘\.ϊΠU­Z¦γ*¦;€Ž‘€ J‰ΔQ•ςΚλ»ΙŠΛΪeEλ~%dθ κUΊΛ…υίξ\8Ν©νύfS{z‘α."‘λENΆωφfβίΈοpξΨw\νj5au:xου‡άrC€†Mκζ„bθZSκŠ™ψ»0žIlͺl3Ηiy1ΰ)LόΖ’=… ILΫέ*ΦΔτ9ΝΟ4ΔNCμ4ΔNCμ4ΔNCμ4ΗLHHHHHΈ†Φ†§Φ„šεΆ&ρmΛ[‡#Εχ'½bw²γεζv˜§Ύ₯§ν_κ†κ΄CΞ'ΪFΧέ5χί=―‘PR•IR I$’HR U™TεΈήyλΧ―*ίφνP•{IU&I$’HR I$R• IUξFUήώνcO!Ί–·uMŽ1› ͺ†β9i[PβΓΉ;ži³ΆΌ±λ8~ WJΦίΡCΚ;Ι.$»μB² Ι.$»ςNHHHHHΚ{\y_ίA΅ΛoώΜ―ͺψΧyPW«‘ƒu)C‡[ψί lΗςμψιSλz:ύ΅Rβοlηω»q‡σΒ ίΉ!”_²·l#‡DqHΔ!‡Dρ Χΰ•`WΆP’UeŽƒ:²fuZŽήό70άΕrwΥ2,Σι³r|vlΚ|ψΜ–ŸφΏά_•f‘'£ŽœΝ tώB_ΪςΆ₯hͺβΈν§β4%οœ&o|Ύχ?ίΫm8ΧVL§l…kΦ―Μω!ρ―c;eCqWœJ ίl #Έ(°Γϊ’’A[₯Ϋ–‘• $Δ‘GB q$ΔΡ(     ΰΪ\©ͺ ·W0Wκ·Bο°σξ·ΙΗχbrιη(fzΊίb§ιExΒ}.?ΐL-“Λsδα`.“;t¨sή\Τήέ±p5DοjC4-ΣΨάΰJΙ;Έͺ O,πΰ%ΟχΧυ‘›§ΊΌlλ%έΥ'˜|‹άwΑYj~ώKO[,Θ<ΌmžΜεςbw^²4Ο`\^|ΐ}–N+—6xΠ,^°lΈkOσΙ1݈'χΒΔ§TΛtmΛXΥΗΪΥ’hάe ύ˜ψνk‰}$-9θmYcs»Ή !Ί0­›­o—Τ¦!Β[ϋ^1P4»zΣΐΆώl6“C›ΆI{Ϋπΰƒ?»α!ž•ζΥΒΜμΛΉ‡πUiψšLΞάΦh<λSO8nͺZ%qC␑›lΘτJyf:zΡl=πvM‹‰έ—FΦΤ9­KT'τ »ΣC¦RbQn&z³v•!Ί_δκlσΝέq€ N1biL-΅¦«Cbίέt2Ή‘ϊ•θΊόua7=•9wΐο+‡2Hnξ»Ίo‡βŒ1§/ΟάIfφaZ™­«}Ξt)oNίΐζΝ}ΩΎΝ£›3}ŠΝϊΓ°&™ΦΗ&˜=-;ό‘sϋϊnΚΌip³PΜF·I*³‘χΕξΛλ¦bO Ώϊψyδχη-όZͺ«ΒλΤΑœ¦ nΌ#π=ϊξcSθ_ž+‚β­&=ζ΄d¬±θ‡6oΎA~F$rCΒh8eΆeΆ‰ ›7Λ@h fό―2T5mk °ς{·šΣ}V‘»Ρ>%oa§_°‚\ΜOχ±M›·ό΄Ο²ϋ„C±oΐ·ψ κ’Ά° LΛυ+ΘΉ™$ΆGΧβ…ΆͺKQ7:iDΖ Šα0Ž_ΣΝ"/鎸‡ΓγδeΟ‡Ή^βž‰•”ί₯ά%~›oζO·σζŸρfAόΠMtE]oέ{η>Ύ}τ»vρΫοΪ±σΦ»FoΫ³Ι{ψ=·ξ½ϋΦύΜοή»ηΞ½·ξ½cηΫωΎύ;nί»WX;οζžϋω=·οέ·sΟ]1ΰΈ8™†b=₯ΘV•νϊΣ-ρώέoΡ,5ηl²•Ι 6π{Θl“δ,ό‘ό.4ΣΕΠ³»f"œfΘε¦rcny(Γ‘<˜ΛmΈ^ΙL۝8Τyδκd^­ΈD Qλ^»Λϋ—Φw•˜K‰9€‰Ω|Γ/όδxςαguNΙ–Žμx¦ZΪ|σ`^wSΦ}L?έSΣνIMΧ«†‚V‡λU£έ―y\»“ΊV-”6AΓeW„½?ΞμΡ؍Ρ؍Ρ؍Ρδ     ΰΪ™<£\„‚„‚„‚„‚„‚„‚€•5„s™άΠΆΨnΏΤλ6ωΈ¨1‘H0J0J0J0J0J0Jz$      M'      ’HHHHHHx¦N'v7™x~σdβy΄;‘`”`”`”`”`”τH@@@@@ΐ5©G ΜΪ”Λt£Lώ¨ΙΗχ{Κ€³1{πήμΘ‘ξ/υμx‚ΡΚγ3-r ¦Sμ’'ŽqsšNϊ[—’sΊ>Νν‚Pc&a„HX a„– ΧΠ¬k“ͺ*–—φ„bλβށ‘²b+%ζv<Η›TΟG‚σω†3€lΦΦΦΦΦ’²IHHHHHΈ†”MžΪ&ξGΪ”εƒYžΫ˜ε7βόεπ/ΛοΝςΏœΘςk³|λΦ,?4r<Λ―Λςα,ώp–α˜γόΊλψΦa>2Œτߊ7ήΘs›r›ΈŽίαΩ,†Κς~ωγ[Εo$d„—————χLC\„Έplw$ύf΄ήΔEqΡνaαmΏͺe„7’]žΌσΜΏbΜΏθ±υ5i]IIώn»υLg·ΊŸLl‘ σ σ σ σ σi˜™$$$$$$$5πLΏŸ,œ_ΌΆΝi EΫςΚM'-€ΝL~Ώi:ς 4ŽŒΘ#ή¦8LκŸJήαψΫ"Œ²βŽqEU½’g(.‹‘ύH[Ž44i –+ ι :ͺ44i’ƒ¦1s­ϋ-έDΏ†!~ύΒ`‡=E>y¦~ΨΓ/™EC˜Σβ‡>ΚefjhΫΕ’2%-έ䊣κ:šL•†&MόŒ#ίι¦&Mα0mͺ%₯NλJC“&ϊqΩ”Ž<Ή6+Ί)Θ)ζ𼒎»Ά’2€f*%$τ"ώ0 VIGΆσ:†š`ΆΓ$iΉ"―r\[7Ρ³m)šͺ8nƒκηygΚO»ΜΩ2Ζ¦|J™PtCl\βͺ⊟:6Ϊΰ@ΝΫθ¨q•ιW‹†•Ηo«cLΟ[ž©9>œatκXΙBŸcV©,Lί(Ϋ¬ OIρ 9irU·UΥ*c> ΚΣ nƒŽŽψ•uŠˆO˜θlΰ -ΝI[ΗT«β½₯Μ [5¬If3Νp§ΛY–U@PžΘμΐ/YXTαR*"%–yΏ4ϊ…ι*ΊιH³Δυf‹Μ{ <Νƒd ιθES%D ¬Ž²ΎΚκŠ†H‘%ΊΒΝnžd Ν~ί΅LζδΜΆkˆpΖ΄Š8E —›$Vl#e[δΎoχ ΒρJ%m›a|lJeeшΘΙUœq1V–‰ΡXq‹­hhL49ίV\A‰ͺgŠ₯H» ~[c¦‡-JΣ 4Š"/} ½λΆ¬ΊšξˆΪ5Šy#rΗ¬¬‚(ΚthΛЎώ€ 'ΔΟf%a…1,Α”m•5½„Αdr†,`ΙIΫ―‚Ω$‰’¨Κ’²­Ii;†ϊοπ3X˜!κg₯²;ν›ύ›Ό3©cΉ0Σ+‰…ψή*pVv8³mLΊ4KΦρ€E?₯Œισ›PŒ‚ŽiDΩ20bΡΖΩTYό6ί$Μ-Βΐn@V%$K›…‰₯n ΨKJhχσΦ9ΛMΎ Φ€‚†u‹˜H_Ag†ζΧ!IΚ<(Η'­BΑa‘dαl0l­L2Ώ‘0€Ρ/L9σ-ρh*†οΕ'Δ+SS€S+θΆγJΚPBτ—έοΨ;Άο`bϊ$ύΓ£@Σ/ΘΆsόm†θT|K<κeΩΘ X\ί”“„.έ±X †‡­­€ΩX° ͐&ΊZΆ({΄=ΫΕJΝ°`‹‚)`φσM€6ΓRyώ¦x‘™Ξt -Wόϊ…!›ε¨γεM¬ X*ΒmΜr\ ~"gΣΒ*뚴l±VλZ­Sl kλ8Ž,AŒ CC«$b•QΘ1ΡIcί½Eφέ ͺŸc·Λ°Νρ1›&›ž'LiM—1½:6bWΗxτΓΚΔ1+1SD{τ—πΏR䘍Ί©φΨgbƒ`¦:9υ\&QϊΔJŒΉ‚Άe»ΨΡκrω’ŠΜasψ„ύjD β' -kœ dw„— ™)ν‰ΎGτΎ< )ΩύΚ‹,Φ” $ [Τ ρ}G ``ΎσX γΨY!©Š\χ)μΟ a[¦jcψ•λ―Π–ύ˜΄mί Α>Κ%$YŒλ!jΰ³ί‘ - ΄'f–mΑ’–τT@/½„©”έfAš.+2; Djυ ρ[¨#-Χ•oe₯A %,α!^ψ-)ΆοX1GDA9%Ω; }. ‚›ŠΰD0ςύˎOW‘²4vLΒ,ΛΔΉΰ—•SΆ&·ΛΦKΊ`6ˆŸε₯πˆφa[˜Ψϊ΄€Ab3›Θΐy†ύT˜}HuΝ'<Ÿ)v%αΧ5ωQE„Ψq¨γΣ’°½¨–D-Τ§Vΰζ§IdT⍠bΝ°C) _Ζ‘Iyi Γ¬Ζ^r%€ ]Sa­Χ]@D}‘†ΜΌq„Z§ΨΘaH^ΗEο;nc«F?—]©0όΔPKάΠD_e`va1ω2BψΰK 3‹Ώ¨hΕρF˜eanαzQ~Οk”\ Λ†hίθί΅ΖxIQmΛ‡*.DY)Ε’αwͺa 3ΗΓr@Jb¬ΓE5δ>‹ώz Ε‘ΐξ—„ιϊ½8ΦΆ"σΝ~ί’QΒQt„+ζ#ώό¨|»_ςA}/‹[—y]w±Q–tΗ~G" [PC« ½0φ±£©„υΏ4ΑE·Ž2€¨¦Θ ³!;šάcJΑDΰšŸ*A ‰]ΨΨL|[ˆh¦eΌΚ’ΗΚ%~%Ι/6Bδ„›"χMΏ[ Δτeεο ˜Ζ-T‰l‘pX…¨Μ²> !%[Ω΄dƒ΅dC-+XΜh y/°5YPώ怇ίΒGš.Κ’ΕιώψCmΣ³π€εTΰeΖΖyΤ‹„Μž/tό_fR`+Eρ %t„`.…uμξ{΄`[₯QΜΤ'Π +"’•…Hθ‹’HΚϊ,έυcΑŠ. «(κ )”σEoŒ€―γ )Δ/6A‰bΆ(6Ώ+“¦aϊ6’Šθ1°01Q!ίΕmΟ4E=”eνΛβh–,—…6z1ΞJΡ“,Ο°&ϊŒ²LΏ4£t"&ΤΖ€ΖQfί‚²;Ϊ¦& S˜Ψl©»ϋœθk₯Ρ/Ν†κ'ž9BΎ'(Q(Β–‚“ di…„Rγ’@˜A-Qvδ5ΪB V[”°΅›ž±7=ZM–ηΚg?ΝAc3Tˆcκ„ΝPjACT,2α~WΈ—D…¬ˆ7‘ŒBΪύ!Ρhχθ td4~ΉΨR8―\©F m f|Ν;°ϋCBTl¨oώΕMΒ2~)-[Zžx+LQ=lΡεΪΎbϋ}.Φξ`‘KA&Ϋ€Γπβ~Χw‘ !F&δΐ„—pDSVsiK„CJθ»Ψ ‘Z)Ν’›Zφ”‚U¦Ε£Tπ»_bLΕ ]ιΠh_NCΠ•o’$;¨ψKCV9Aψ•腁€8aι]΅%%¬¦ΒŸπfͺ@Όσ--°± επ‹}AC>c 6ΨL…½“3Žy- ! :’ ±E,†ο,7ςYt~ίuzήNPά‰:κ SΛ/UiŠφ㢐ε$)TIȊKRFΒΒAμ–¦?ό"KΛΧG%:Θo;AAQyΖ€±ΐrx €ϋυΚρTΡ3q1 Π@|Ζ‚υd)a5C±B›.ωξΫA6rg?VςKΝUΖ1©bHKŽhΙ-40Ϋ… …C0ͺb`3Άl;‘~…-•$‘ “Ί†ιœ–ε&1W£86!lmRΑ\Dm«ͺY\k4-Χς°ncιF$ EOΎ0„¦#PΪ§ΚbΜECι₯RίΒΆg)1‘νßȐ†κ"ž€ό&!gHŸ=³YρGΰ΅LίμηΑˆ’o‰Gω Ο”b‘g:J†γDΑ£ΰh_ ‰^…ˆ9`πBφηtkΑ³ΘϊψSΐ€4)$ΉΰΑϏΰaF9/’…’‚~“τdυoΐεwD( Λͺ„ΆΘe©{N`_4‘³I.‹rR1€l69¦cιaι3±€mrQΕEŸβs λ״Ԉ₯ιZ\ΚΣ~Ι> —3όΆpTSŽ·ν ΙQT5|τGš,W0–α;,Υ‘qh–šαwn—t†οt}‘Λ'ΗW„ΒΥiU„Ζ¦" LŠꉆŠ †(KϋH_Bς”P1 ΐˆ FvE#’†‘LΪ.=―ϊ_ΕˆΐζfZώΖ¨κΓ$[°δ˜ƒc(ω!J¬€βPZ%kBHΦ%ό·X‚~Χ΅ ²Υ!Qφ ΩΎύ^Πoa+ΚπέΨYmφ&Ή‚£ΨΆΜ*»¨`―Β‹¨ˆ„λ ₯G‘‹›Ψα„;₯„jδΒγq μ²8OΗσΟμq˜΄NΡΆΌςPžυΨρ=ΡΑ:qζ.ό63wρι`ξ»η…GΡJ_gHœ!q†ΔgHŸ'$$$$$\Cϊ<Ξ„Ίζ%=‘ΨΊ’7ΨPY±•s™(¦λΫ¨ΈΫ¨ΈQ+ξ°9œgΞ(yΗ΅Υνs§ΛŒ—ΑδΫL.~φ‚dšέ1f―8ΝΚj|&―Ψ¬dižΑΈL W-Σq935Ξ¦Κ–νςpo1/V^1Έ^’Ξß₯’CIQm‹‘φ,—q›Ήžmς€[ΟΡΝβͺ™Ό-Ζ€Ν”q*:&ψsuΣc\³83& ½ΐ Ί©Ζ4/X6ΗGמζ“cΊϜ ίQΩ–±βΛ?j|y9c³Ew”“ˆ©νmΉηΕ$䜍(8’dI’%I–$Y’dI’% ­‘><Μs™Lηετ¬§ύ υΣsΝ@OΫΏυ]­ ψNΘjΉƒ#HΉQlۚl±Icj]βΈ4Ή>":'ΝPJyM‰₯½§Εrϋ”-ρμŽgΥύ-άτžDNs$'‘œDrΙI$'‘œD€€€€€€kp FͺξžIΎόa\ω”Σφ+UΞ֊{ž™Zwψ½ρ… !'‡{Ίάαώ½ΖΤ»δ/“s6₯τvHΦU 65¦Šν„$RίJŸ/΅p³zΪ€€i0„φκ“€B’ I*$©€Bͺ:     ΰΪ½‘:ά«ΏΊ+¦ˆvυeΡ–όŒ˜T'Œ%Œ%Œ%Œ%Œ%Œ%%“p Ν E0—Ι4―V^·>eυͺ–‡'ο >5E6ΙΥYΑΩηδέΥ+Ό΄‰&v${WκΚϊMν&y›ζΗO|ΰ–ΜNYoώυ€b~~LΫο• ΖGGwμά;:Šφ;wέ.‰];ος‰έ{vά4ΛE[1Δ–z—i!…Ό;\qf»hM›*W\«€‡–ΝΚ†’²ΰΙ™Tʘ幍Y~#ώΗ_²όή,Λ‰,Ώ6Λ·nΝς‘ρC#Η³όΊ,ΞςμΨVΎ&#sœ_wί:ΜG†‘α[ΡαΖynSnΑρ#<›ΕPYή/|λΰ ψt‘΅}iIΜΫ–›tRr·}ΥΘ”sš2%ϋυ1ԟG°υ’YΒι‚$oϋμˆ7 ’”,R²HΙ"%‹”,R²Ξ0%λo/ aςΫ!qΒ{Β{Β{Β{Β{Βϋ3οΣ:ν·CBMG¦D α 3-_W,„k:ύ5m%ά =m¦šΈ8—Ž;!ΐ'ΐ'ΐ'ΐ'ΐ§eD€€€€€€kn‘؁φ`&Τ^_*#+υuΞ¦‹0­T,ηiψθtJOŠκΆSZΟj©:ŸζKS{Nr½ˆ©$I$A’I$I*MHHHHHΈfOMQ’»?14‘7bnΉΙε˜©‰c.Pƒ?˜Λδκ<…έζ.–W<ΠF9obwsƒ+%οΈΆ’Ί}"εΌδΉb»MΊyͺΛΛΆ^]}‚Ι·™ξn)IΣά'›xΪ`Aͺύ<:IΕ`8 /Yšg0~Ψ³\qΌˆ`ι΄ςpiƒΝβΛζz»φ4ŸӍxr/L|J΅LΧΆŒn?ΦςŽ™ͺo莘vγ‡)γ&i{¦Š)ξ§Έ­φLM₯Έ§νu:Ω}H4Db5‰Υ$V“XMb5+Ρq₯PKο~ιλZ+1ΤΣrEΖΑnNυuΨa™*λκC7φt»—ọ!9rŠγ9Σν>ά›tχ΅ΫΙ;F‡›t³ΨUκojϊrX¬χέχ5|js»τžΥ*½B~ΏWΗΰ“M«…7Y,ڐfyβ„ ιγτρσ&¦Γ£bς™ wπ^1jΩJ‘ωc΅ρ”τ&Šΰ›Nr«’uŠν37ΕΏlJρΒ‘± n+“œτH? ύ€τh€Œp …|ΖͺΎΏκzx&δzΓ†Ξ4}ν;ξaš-M̟¦Ωπ–έךτV)iλ”Ϋg~ΚΦ”ςσiΨ†€V’ZIj%©•€VΆ‘a@@@@ΐ5¦JqΟχ‡Rάy"k’9β©ξ7΄ΫνpΉΰΗ|^ψΑpw‘³‰nλ&QD=υHΤ#QΖ: ΧXGG-vΕψGo‡ρ(d_BŸΥ˜j(Ά*ϋ‘Ώδ. lfΊΊ;=$w’%υκV£4)Α—7tήζΓ~Hχ%θ'θ'θ'θ'θ'έ—p­κΎ—ΆΠ}±ƒάίFnŠa ³.άδ?ωΑΎtΈ)\wΊρe έΈιX\RI2 Ι€$’ H2 ՘p­ͺΖ—ΔUc©έ† cΝΈ―•fά"‚λΫ(Ζ-Ό'?wU ½ΈE°UO'/„!½˜Δ H, ±€Δ‹ iΚΨW8#ρd¦Œ[Ε0ΠI3NψοfΚΈUΈξtγv›ΔσΡ~fnSΖo³-ESΗε;,Υαwnη;]†Ό[ΆΓwιy•οVά±ν–ιΈŠι:|7ζ"ίη*κψ~ΤΩ™ΓχM;|˜ΝΝαΫ-›‘݌]‘ή6λxε²eγΈΌ@΅ΓρνΤ΄Aϋ~'– [ƒ‘„[m[™ζαΣφ1Ε4™Ά£‡ΊκΖœ² y‡a)·;mΏH•FT˜7κXόΙΦ§’Η»sŒžχ*f‘EOϋX#ζ}r?}τxΐΤžοaκ{wŒtΐⷚȬ]τJXsn·mαβ'έq˜-xυoΣ‹~RΨi +Θ"$¦‘‘D}›ehx¦ζψ‘lWLΛΤUΕΨijl*t+»žΝ΄Ϋ§TV–7εnWl—9ΊbJ_MΊ¨.ΫU‘ϋΫύψφ‚d+,!Y2ΫuδP%ej)ΓΒ¬‘¦O•4¬g†ψ”U*βΎ}Ηζ›#ς§["ςζŸIr˜vGx―ο »,Ζ·eͺžm3SΎG· ₯‘yψFΣ}?eΧΦτBApεŒaeFK€ΙLjπ‹r»η§Σ“‰ρ©ρόDxτxAT–Ž)›α„ΗΙ ¦Š«μχ ο`¦Γόb“dPp’ŽκGψ$JPVν:Φ Ήί­;%Y[ΡΕAcBטŸΐV ›¬OίΎηŽ€0½—d#βTΩ2Eo₯·aW°§PN6—΅ ΛAΪXΖˆrώNΓΚ+Ζ^VΰΌχ.ΎsώΏΝ+˜ζ΄Λ¦\€°A0₯Δwj2 ²*E5Ιά₯› 3Xϋάi¬K;M6…-Γg'6‘Έ›·όBZ7 9CωBS:³"“>™m{e·‘Νζ„bθφwρΊλ~Ν¦ύΟμR˜š1²ζ·^Αγ]^)Ομ»,ΝTμ°!μΒnΧΊ{ηξΫyPšΨ½ŽYZ`―uGΝΪ 6vϋWQί΅ί+ AC HΛ!όoσ=Xi‘WŸ§=ž»§°›•,;`|Ο³±NϊOw+Ί0lQ²Ώρtu|Ÿ¨›w3»δΉLUΗ―wλX#οΆ-L‰s‡’ρ.ΰnΧζΏgŠΘTο ³j―2yΗΎbiLΗY@7|Ν°>و1»,uœ‹²KeΚ7ύ~v/ΓΞΖtψ^Ρ+aw‹ψχ±’θύδWξP<Γε’Ϋ§M¦ρ}V‰ωh՜Μ}.+ϋωQ»˜ΙEjLσ“<2Œτߊ7ήΘs›r›ΈŽίαΩ,†Κς~ωγ[Εo$d„—————χLC\„ΈτϋcΒη+’Χ}”ύrCͺ˜ τ|/ό¨ΑRΉΰNGŽΉ·^φΧEυ+n"#ΕΉΣΓσU­`8Ε†σ-zθ-ω‰ΏΖarβ-Ά‹Ϋm²]―σϋ^ΈpΡΩ80‰L2œ<―KΙƒ‹γ£φ2Τ j(žŒΡ_˜Θ"ΜΧs>εΫ{Ϊώυv•šsΒ«l·eiΌƒ€/’ΎHϊ"ι‹€/π'$$$$$\C{Wh‹I­s€½Φ™ΊΨ¬ιΕ₯‘ΦIKKKKKK:'     ΰ9ΕLκΆα­Γ>02,Ÿ#Νq}B]ΧjB΅ΘL&vYΛγjZN$mΪρςs›§Έ“ηΔΆ„T,MSήΡ€ŸM*/!>!>!>!>!>©Ό€€€€€€kψHΨjlλEΌ±υ½!jKotlinktkts source.Kotling xΪνZ{sΫΈ§y\ž—χΓ—‹_ηVD;Ο»Ψ–5ΉΆ™ι4mΘtΪ©™8Ω¬iRGRv4†Ώ@ΏZΏT—€$”cλz3Ub‘‹έΕβ·‹7•ψs=Ή. ΗuΆMω>φ·W­δ?b²g”l’”μ9%›,%{AΙ¦JΙ^R²ιR²W”μ\)ΩkJv>Ή~›'sχχ±d,r!ΉήΚΡα/}ϋΎε:‹ΙυFŽ΄7pΜ OψM!³σ₯ BfιΛ„ΜΦW*™΅―V2{_« dΏ.΄ψv°g™λΠη3]`Οo"§Ϋτγϋ΄ΛΪ]˜ioΦξŒ|«vfξΫ΅»0Γί©έ…MΑέΪ]ΨdάγΜwqΠ>φϋΘΜBΒ}!ey@›Ÿ…U”Μψ…kΤ<ΛΩΙ0œ)%cάΎ+%cΣχ¨”ŒMΩχB7 †}άΕ½ŒpΛι˜t³ά‚Jι2ΜζJˆ§ω"¦εB ΣqQΈfg‘Ž•λ‡ B&ΫR!“οI!“Q­ d F« dΛd™ƒώνν}d9τiƒόmp δτρSξqPθγ&h ‘ΟuϊM€ΖeV8$ΟDJ²Κρ`K žqBPl₯ϟs@&@Jϊ‚SΧΪο»^*νKn€=<φh«w1XnΑθΪN‹₯>ͺ”ϊΌRβJ9•n§΄AŒ#b¨dΔN5ŠGQžΖaƒΚC(,3+καΊΥΓu‘G>F5Ÿ’I9)q³\€η%ZO MY‘γOuΝx%5γ‘Ψ|23-δΝδ»°,Ύ­w›cΰΑη”ΣΆΚκΘ ΛΎαΔ§N™„E½c»ζ^f­PΪ ‘ .―Φ&oš¨τØ8ˆ—"ΰΉεXΡ-7]goΌά²­ςΡ‡†sρY¨–!Σm™"Ÿ+‡’KΚ τΚ―  W•θ5±Τ­j©ηeRΓ:ΆvœŒ_ΙΖΎΤEσ©‹ͺΘ7κΘΛ9 Ί«T· }Γho‡†ωWΡ|lŸΙCZ„ό4ϋLtνΒ~Žα΅tŽH«^άά¨Λ<;»Uιέ›ΊL/ρ¨rZX!eό”l~… ¦DŽh“Π Ψw-1ta^Η½Rož^n)uΝz“Ÿ/BpJσV7F—1œ.›²Š)!–άΙQŒwοžtο՞λS‡§ί„σ|UΖ8 ή=%†FZ§…ΞσŒkZ”:-iΖuύ— ΙΎμZΰ›ΕΪϊdCp¬ρ‹Š4tVyΡ‘Ό·‘ΘRάΉ°4έΠ)ŸΩδJ«\ΊΉ ŒΜφMΤΟs᳌Ό »ξ ”€Β†Ό·`jAξ…¦fOΞΠ‚Ώ–’"5>Ÿ‘’³i €Ιλ ”φ€a‰6΅φzSͺ7 ³Ό€#cό)dυS'ΰ·!‘ϋΥΐ8gλζe±/WEzϊδZΈν·λ ΅4ΛΉθΥΤEνΘ²ΟͺT±”~Μ‡|{1U:2Й諉υKVΌ¬Τ]='ρ™ϊ¨τ$Gqϊε  Η\Ύ™G¬5πν/κBΗi– ¦Nƒρ(šLHϊΌΠf!Κwž‰υ?<_ώωdC©![N ΅½1·Ά¦EΫf΅½ΖΞζˆτXN«”’TδIr¬Λ…50R]&ZξL“ADͺκʊ¦/ǎa8νtΝΚNg“+FΕΙ^ ιƒρv%ǐ#ι1UΛ³©(a.ζ 0ι!ΫΗΔΨ6ύOό l&C»ΟDORZ9;ƒπL΄₯ύ=e­ͺ_Θ?΄­ΥζΤμ½mΎϋΈ Hͺ†ΏC¬kG7a“‘Ηmš¦ͺ˜όASijν€±­©[ονw½Z;•θ/‘3Ψί ( t'hλmσŸΓ/`Ό œSvwxv’”3jξ0d„"ΡEE²μe`Έ&i_‘΄λ’φWu—{¦,Ξ-υψδ¦z5£ΤΨ1η=ί*u¬"8Lχfρ‹Ρqς*Κh‡Δ·Rg„š#˜34~U[ Ζ‘…LσŠhnAŸ ‘?ž9 n+u}žΚ εŠ_ΣΡ Ώ±υivpΓo¨ΘΧΪ•p[–¦NŽ@+Ψ\eύ?©M“­ι²[&ι{ΦΤHΰ ;z¨t κΐ> 0θ|ŒlhΕ€`ΌΪ!(€mxg}γΈAδΪΔ=ΐžgu1„Φ0pΐςvΰqIΌ ™uQ€H€,ΫΓ&‘kχ¬/$72΄°έ%‘ #ΫB~tηφˆ‡Γw[Ίύ>ΘΠՊP+{ fͺ0qQXζn¬€=„ΐβΉ‡ΆKœΝAΊΐsm=κΥΔ_LάΟzU:Κz:ŠΥ#8Œ\‡»– Q 4νΊ I0πhΓΡ—‡IΗΓh/T?°œAΆςpW"CaΜω̘9—9Έ’πΏΡ&α«s‘›¬Vΐ«oΆλ€ŒyEZΡ₯E6ZdΎαœͺr+%ažε‹¬•Ωk`K•ς™fX½¦cιOθ)#~·*%ZΑa‘;²4Ϊ°ί’ύΛ€ρQ;θ Δ .3R\IΟ₯’€fy$cνKπ–ΝeΖ€i4‰Ρ0ŒUCΖΚrL/z·° ΆŽοŠŒo0ƍ1šπ· +©iR7ς¬`*Δc*›=c>©ξ€›‚\σzͺ;h‚|δ‡~ž (·ηYZ"ό«φΫέ±Ld—ΈύzAΗl6Ψ½()\9JΕή/[Œ-}ύm!UϋΘά,Χ’Δ.l€ΰΊΎ¦Δα+–§[ R†dψl„εe)Ρ©vEρzŠμ}άΡ‹Ξ#’ήWJDΛΥΛǜχ>P„ƒ·Ζ2ψCE2‘UIwΙΉŸqJS΄ ’±”΄―KΪ›’φg’φ–€ύ…€½φ‹ £¬. ¦xΦΣΑ;VΥΞωS‚ο„όŸŒQ‚GBώŸΗ(ΑχJ‰—Lˆ /ήΌΒGnΥ;χΗe#δ*aŸSpύ '¨@ή:Cς7Њ|ˆT"ΏƒSΟψ—vLLώθδgΧ΅1r’δ½ $ΏŠ_δν"θΆ ϋ<ςσΆ=έ! ΆefΠZΈο ,»k P`+•~λyhHG„"Δw‘ρ],L|IίFb%,@Άθ.#Ψ\™`($.ŠχΧTΌDΧΆq„hδ½[΄?£>ω€α:Bδ‹ΫβϋπQrRPk5n–Κd5™ n8—σŒιΈ«O@ζs#„ΦqΗκBΫ’PX΅Ήω•ې²Υw7·ϊ’ +=M¬^„΄ά«ό-Β˝Lesslesscss.less source.lessabsolute_lengths(?i:cm|mm|q|in|pt|pc|px|fr) angle_units(?i:deg|grad|rad|turn) combinators(?:>{1,3}|[~+])counter_styles#(?xi: arabic-indic | armenian | bengali | cambodian | circle | cjk-decimal | cjk-earthly-branch | cjk-heavenly-stem | decimal-leading-zero | decimal | devanagari | disclosure-closed | disclosure-open | disc | ethiopic-numeric | georgian | gujarati | gurmukhi | hebrew | hiragana-iroha | hiragana | japanese-formal | japanese-informal | kannada | katakana-iroha | katakana | khmer | korean-hangul-formal | korean-hanja-formal | korean-hanja-informal | lao | lower-alpha | lower-armenian | lower-greek | lower-latin | lower-roman | malayalam | mongolian | myanmar | oriya | persian | simp-chinese-formal | simp-chinese-informal | square | tamil | telugu | thai | tibetan | trad-chinese-formal | trad-chinese-informal | upper-alpha | upper-armenian | upper-latin | upper-roman )custom_element_chars`(?x: [-_a-z0-9\x{00B7}] | \\\. | [\x{00C0}-\x{00D6}] | [\x{00D8}-\x{00F6}] | [\x{00F8}-\x{02FF}] | [\x{0300}-\x{037D}] | [\x{037F}-\x{1FFF}] | [\x{200C}-\x{200D}] | [\x{203F}-\x{2040}] | [\x{2070}-\x{218F}] | [\x{2C00}-\x{2FEF}] | [\x{3001}-\x{D7FF}] | [\x{F900}-\x{FDCF}] | [\x{FDF0}-\x{FFFD}] | [\x{10000}-\x{EFFFF}] )custom_elementsS\b([a-z](?:{{custom_element_chars}})*-(?:{{custom_element_chars}})*)\b(?!{{ident}})duration_units (?i:s|ms) element_names\b(a|abbr|acronym|address|applet|area|article|aside|audio|b|base|basefont|bdi|bdo|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|content|data|datalist|dd|del|details|dfn|dir|dialog|div|dl|dt|element|em|embed|eventsource|fieldset|figure|figcaption|footer|form|frame|frameset|h[1-6]|head|header|hgroup|hr|html|i|iframe|img|input|ins|isindex|kbd|keygen|label|legend|li|link|main|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|picture|pre|progress|q|rp|rt|rtc|s|samp|script|section|select|shadow|small|source|span|strike|strong|style|sub|summary|sup|svg|table|tbody|td|template|textarea|tfoot|th|thead|time|title|tr|track|tt|u|ul|var|video|wbr|xmp|circle|clipPath|defs|ellipse|filter|foreignObject|g|glyph|glyphRef|image|line|linearGradient|marker|mask|path|pattern|polygon|polyline|radialGradient|rect|stop|switch|symbol|text|textPath|tref|tspan|use)\bescape(?:{{unicode}}|\\[^\n\f\h])exponent(?:[eE]{{integer}})floatK(?x: [-+]? \d* (\.) \d+ {{exponent}}? | [-+]? \d+ {{exponent}} )font_relative_lengths(?i:em|ex|ch|rem)frequency_units (?i:Hz|kHz)functional_pseudo_classesY\b(dir|lang|matches|not|has|drop|nth-last-child|nth-child|nth-last-of-type|nth-of-type)\bident*(?:--{{nmchar}}+|-?{{nmstart}}{{nmchar}}*)integer (?:[-+]?\d+)nmchar"(?:[[-\w]{{nonascii}}]|{{escape}})nmstart&(?:[[_a-zA-Z]{{nonascii}}]|{{escape}})nonascii$[\p{L}\p{M}\p{S}\p{N}&&[[:^ascii:]]]property_names\b(?x)( display|width|background-color|height|position|font-family|font-weight | top|opacity|cursor|background-image|right|visibility|box-sizing | user-select|left|float|margin-left|margin-top|line-height | padding-left|z-index|margin-bottom|margin-right|margin | vertical-align|padding-top|white-space|border-radius|padding-bottom | padding-right|padding|bottom|clear|max-width|box-shadow|content | border-color|min-height|min-width|font-style|border-width | border-collapse|background-size|text-overflow|max-height|text-transform | text-shadow|text-indent|border-style|overflow-y|list-style-type | word-wrap|border-spacing|appearance|zoom|overflow-x|border-top-left-radius | border-bottom-left-radius|border-top-color|pointer-events | border-bottom-color|align-items|justify-content|letter-spacing | border-top-right-radius|border-bottom-right-radius|border-right-width | font-smoothing|border-bottom-width|border-right-color|direction | border-top-width|src|border-left-color|border-left-width | tap-highlight-color|table-layout|background-clip|word-break | transform-origin|resize|filter|backdrop-filter|backface-visibility|text-rendering | box-orient|transition-property|transition-duration|word-spacing | quotes|outline-offset|animation-timing-function|animation-duration | animation-name|transition-timing-function|border-bottom-style | border-bottom|transition-delay|transition|unicode-bidi|border-top-style | border-top|unicode-range|list-style-position|orphans|outline-width | line-clamp|order|flex-direction|box-pack|animation-fill-mode | outline-color|list-style-image|list-style|touch-action|flex-grow | border-left-style|border-left|animation-iteration-count | page-break-inside|box-flex|box-align|page-break-after|animation-delay | widows|border-right-style|border-right|flex-align|outline-style | outline|background-origin|animation-direction|fill-opacity | background-attachment|flex-wrap|transform-style|counter-increment | overflow-wrap|counter-reset|animation-play-state|animation | will-change|box-ordinal-group|image-rendering|mask-image|flex-flow | background-position-y|stroke-width|background-position-x|background-position | background-blend-mode|flex-shrink|flex-basis|flex-order|flex-item-align | flex-line-pack|flex-negative|flex-pack|flex-positive|flex-preferred-size | flex|user-drag|font-stretch|column-count|empty-cells|align-self | caption-side|mask-size|column-gap|mask-repeat|box-direction | font-feature-settings|mask-position|align-content|object-fit | columns|text-fill-color|clip-path|stop-color|font-kerning | page-break-before|stroke-dasharray|size|fill-rule|border-image-slice | column-width|break-inside|column-break-before|border-image-width | stroke-dashoffset|border-image-repeat|border-image-outset|line-break | stroke-linejoin|stroke-linecap|stroke-miterlimit|stroke-opacity | stroke|shape-rendering|border-image-source|border-image|border | tab-size|writing-mode|perspective-origin-y|perspective-origin-x | perspective-origin|perspective|text-align-last|text-align|clip-rule | clip|text-anchor|column-rule-color|box-decoration-break|column-fill | fill|column-rule-style|mix-blend-mode|text-emphasis-color | baseline-shift|dominant-baseline|page|alignment-baseline | column-rule-width|column-rule|break-after|font-variant-ligatures | transform-origin-y|transform-origin-x|transform|object-position | break-before|column-span|isolation|shape-outside|all | color-interpolation-filters|marker|marker-end|marker-start | marker-mid|color-rendering|color-interpolation|background-repeat-x | background-repeat-y|background-repeat|background|mask-type | flood-color|flood-opacity|text-orientation|mask-composite | text-emphasis-style|paint-order|lighting-color|shape-margin | text-emphasis-position|text-emphasis|shape-image-threshold | mask-clip|mask-origin|mask|font-variant-caps|font-variant-alternates | font-variant-east-asian|font-variant-numeric|font-variant-position | font-variant|font-size-adjust|font-size|font-language-override | font-display|font-synthesis|font|line-box-contain|text-justify | text-decoration-color|text-decoration-style|text-decoration-line | text-decoration|text-underline-position|grid-template-rows | grid-template-columns|grid-template-areas|grid-template|rotate|scale | translate|scroll-behavior|grid-column-start|grid-column-end | grid-column-gap|grid-row-start|grid-row-end|grid-auto-rows | grid-area|grid-auto-flow|grid-auto-columns|image-orientation | hyphens|overflow-scrolling|overflow|color-profile|kerning | nbsp-mode|color|image-resolution|grid-row-gap|grid-row|grid-column | blend-mode|azimuth|pause-after|pause-before|pause|pitch-range|pitch | text-height|system|negative|prefix|suffix|range|pad|fallback | additive-symbols|symbols|speak-as|speak|grid-gap )\bpseudo_elementsš(?x: (:{1,2})(?:before|after|first-line|first-letter) # CSS1 & CSS2 require : or :: | (::)(-(?:moz|ms|webkit)-)?(?:{{ident}}) # CSS3 requires :: )\bregular_pseudo_classes¬\b(active|any-link|blank|checked|current|default|defined|disabled|drop|empty|enabled|first|first-child|first-of-type|fullscreen|future|focus|focus-visible|focus-within|host|hover|indeterminate|in-range|invalid|last-child|last-of-type|left|link|local-link|only-child|only-of-type|optional|out-of-range|past|placeholder-shown|read-only|read-write|required|right|root|scope|target|target-within|user-invalid|valid|visited)\b(?![-])resolution_units(?i:dpi|dpcm|dppx)unicode\\\h{1,6}[ \t\n\f]?viewport_percentage_lengths(?i:vw|vh|vmin|vmax)ςBxΪν} €GuθJ²ΐ8Ζ€lKςΥ#ΉW²εψX#―ΑΆ€ΐ9»‹S3έ3ΣΪ>Fέ={H%r“ϋΎrίχEŽOξΘ}‹BN’pδNH!ωοΥΥU5έ3έ«YI+ΝΨΪξ©yuΎW―^½χκΥΝρΟ³Εσ6'ρS$wΣaθgOωό9σSw„Ϋ%žΟ©€SJά3Ύζ{%άeγαŽJΈ½γαξ“pOχ‘ξιγαξ—p—‡{@Β=c<άƒξŠρpIΈΟmΈl8$ižΉ’ϊ±†λ+ΕσZ+GžΊέaάΙψ¦€ŸYXαςͺΐ ‘ΟΟ ΰφ0σ VπZ»Ÿ]3ƒjΞsJ‡¦$ƒͺβκΊ9TΧΤΝ‘ϊύάΊ9I_[7‡"ξλκζPdώΌΊ9Α__7‡"ύκζP“ΰΖΊ9ΤtΈ©&‘(t<Ώfχ*"ΉΉnE$·ΤΝ‘ZukέŠHφΥΝ‘ˆdέŠHΤΝ‘ˆδΆΊ9‘ά^7‡"’;κζPDrgM"Qƒ{WΝ*Ž*"qκζPDͺ›CΙΑΊ9T?ΥΝ‘ˆδξΊ9‘Έus("™―›CΙαΊ9‘©›CΙ=5‰D Υ½5«ΈOΙΡΊ9‘άW7‡"’¬›CΙύus¨ž?P7‡"’kΚπPΝ Š¨jfP4υpΝ Š€^P3ƒ’¨c₯βQ‡„Αλ‹― ΰ$LR—x'†Yξ§eRb³|вm–OΡΧ ›εSTφ’fω­=Φ,Ÿ" Η›εStτD³|ŠœŽ7Λ§¨κΕΝς)βz‰%ΘιωJΘδ₯΅ΐu|T-pE] \ΡΒΛj+xy-p…ω©ώ±΅ΐž_Q \‘χ•΅ΐV_UΞ2’(ςγάm‡Ig΅ΐι“βωάRΰ0ˆύφγΔσ&6M²ΜνΟ/αH_;‹"›OΟkΜ,!JΥ‹eρά_3Ÿͺp₯aFUγk›΅T βSΝς©ύδfωΤό&Νς©‰ήn–OΝψN³|jκ{Νς)ΰ7Λ§˜A·”wxID4y£ Μ^-pE}ρΌήο‚4S.hυΰUω'κΑ+ͺ[­―¨-¬―¨,ͺ―¨+―¨*©―¨i ž¦έK‰ =”`ΰdέ iέ Yέ Ήx^gδ"+[T†u UϋΧJ[Γ‘3?/)½nUΗ†xήbζˆmƒ$$Ήο•­›Mr©ΊN5Ι₯prΊI.…Ϊ$—š%gJe X83—„Ιτ%όu“aUΟ?e2¬κο§N†U½ό΄Rzb°%3θΣKY$ƒŽΘΐ]#αPοΰgˆη %ΰΑpUP΅“HΛπ™Υ­Y#i@Ϊ†τYu ΥΎΎ΄ΓΟ­Fρsκ@+ω\ρΌΪ„yӍI€χπσΚΛ €IθfyΔ½ϊσλ@«ρψρ4E½ΘχβžϊιfQπ–’= βˆl”π/ͺςΕ₯Γ1H“Ÿζ>_2 R•ω₯“ ’Ώl€Bς—O‚TώŠIj‘όΚIjyόͺIjaόκRΖ% 7ω$uΧS2€οΕΨ~M)ρ 2θ%n'$™ΑΊΎΆ΄ΒΖΧ•„ ­ ϊ:…+Ύ‘΄Bβ7ԁVˆόΖ:Π ™ίTZ!τ›λ@+€~Kh%1kh%'[)zRΏηo J¦χ·ΧWΘρ4-Ϋ%"ΑwNT%~WιT(Ϋϊ}χ$HUζχL¨\‘ΫχNT”φ}‘}@E_?0P‘ΦNTTυCAύπ@EK?R*{ Σ°„~t2¬ΒϏ‰ηM#°ƒΤοeΛΠkgQ΅όxi‹` /)ώ'&ΓͺrR<₯ΕSOα¦RώϊSβωtυk–“4—??ρ”$ξ…Ύ›o| ρ&k)^ξ2$Ψ ϊΣβyΉ šΙίF<―-~WŽΈ€D·ώYkzzQHȟΟg*HΝΗAύΌEd#¦ ψ Vi†I@ύ’xΚύd•JXΒxψ‘Ξ²x>Λ€)φWΔσJŒKΚζΝ#EEq=? "ή$Ψ[μnλjM τΦ‘ϊ u¦„ωU‹^Jt’τΧΔSΊΝhͺ@ ςλv0Ε6έvJ:ΜoΨƒ[‘Ό‘πΏiM.―„”“%μoY£gil$Ψo‹§t‹±5 ξw¬ιΦ  k}ΊύxJχnκƒΐw6 ¨ίOι0!+rγ$gS…κA(F’’yήfM¨Q½„ό}« ¦@BύUήθ>^Bώ‘Υk©χημ²β,‚asϜμlξ™{0ΤzioΟλ4˜Ρ}΅„ώ«ξU³ ;GtVώ©E―‘χςΎQυ;¬ζιc σNkxΝ ±„ϊ3«Y ͺθ‰6Όο²ˆOm™Γ$YT‰nΡ²΅΅–`aqΚ‘-΅όΛ²~Œ Ϊ_•A©«„ϊk‹DŠ «„ψ»cλ)‘ή-žCQ_ ΦBŸΆ• g ‘΅―”`o•£ΆEƒο±š ~t¬±~―U ^¦€==ήgN±3“ο·x ΅#λaε$Ξό?XS€|'‘Ρn¦­ ύ'«Οζž@Bύ³]‡μZύ‹UΨΙ!L£n3XηΟjfν$ΨΏ€eI8δŒRη·κ”Ό ΏhΩˆη3,(π»F’ˆ„z(‘ώΣ*&"λe-ΙΓ8θ$ΐSΠ[=Ζ'‡ γsΖΌψ Ε—tAXΒ|hΞ\ΉK€Y ϊ?VqΊd*a>l5͏=JV’ϊ_ρό?ράeρ²ΘΟΙΌ#ηA>˜Σΰδ7Z²œt--Ÿ~x₯₯~ά­ήδ`;ΠΉ–³μ(˜]»­μΆfk‰Zgae ±=rΎ ΡTΜCωψ»]ͺτvΣ€ηy$Ψk/M†ƒωΆί bΩΫ]G³=ΏΥ0Ψšώn+γUz§x₯ΦΰξΡWφbΉ% Έ½N?α¬Ψέ“š€§Πjκ΅e”0i·xχ„11πΟΙdω΄E#²Κ*•ۏ±C%waU₯λ-ϋيœ5·”N†dˆΒΜσΝΡ©±§!}όjέ.؟]φ²ΝΛ—K(₯N ϊ`Ÿηjθqm ɜ-ΤΥ3U>₯›'pλI €ό6MΒbΔ΄Κζζρ4­Š­ž—O³GαζRΜYν¨ΛΛ b}x5ύUw) {IgˆΛ¬]οεe“€‚‘6%*;ύCιS‘ώΫιV‘ώk žW6AΔψ΅5 OΧ‡Az-β2αΐͺεΓ>€γΣ Fα”’K!;M01‚6aϊ4 ±\\ZΙ^V2mπsSYΣHΪc8Κζ±›ΚοͺΏ‚`v›ΘΥΆ\H„σIήχSΊΗ½£.W™mLότΩPέ΅’Š’jMΉΟ³iΰi:’&‹gΫ·wιΥ]΅Kγ‹ ––άευ•₯εΑ闝?/Η?O⟏9sηKK ―%Y'VΰC|yyΉϊž»ο?³΄o9_Ž—»+‹tyyι΅ψΊά_i΅Qw‘ϋqO½Π}Ν‹ή†Φl΅vvUp~yB&Mo ’&1θΈRD`ΉX¨―ΡΡΊΰάέ’ˆ]Dnkbe‡ΗO ’Άƒ<%馛ϊ?η‰m‚ΰηΊ2‚» T‘ψΔΫ^‡*Ω{Κ΄*ΩΊξŒn:Cίj κdΤ˜–Ϋ!Φ‘ΖΞf’ΏίκςψEx[ι8[ίk” 5WΝ5ΖΥΣ«ˆ³5yώuEO¬"ύ_’γ;υ†]!:4γ΄’ΣŽη§`V ΪΓάWό΄’dž5WρAΰgθ ί«ˆc£΅άvΨg1Xπ#κoΠNŸ¦~Τ‚TΚRΧΦιZŸΑήώβ‡ND£ˆžٌr:θΠΑν¦Εοžί£¨ο¦ψ/¦qρSF£¬ψφ’Stυ%§΄Œƒ€z(ή  >h£=}εΆ€θhΈPΉgKτ– Ίm:/ώ‘"ύ½ιož0_vΟzNsžuωVyVΞώ¨!oϊ†Έg šΨI8»¦9Ξφž«uζέ5p°“ΖϊΪζcύ΄σ=ΦΌΘpπΌζ8Ψ²\5­uε=ιΎΘpsCsά<γ|γζ}ιοΈΔqyΣ9œgη g;7wΝνΠ†ίœ¨Ξ™°ς¦‹ŒHφ5λ- +ΣbΖ\ΐτώŽ‹l¬oo>Φη]0|Σ%²`έΉyQ]4t Χφ™ιWmύͺι`θW₯C‡ΤJ}wδš—Ž]–vqo…»[:zJΙχήΉ:οZρΌΫ)88΄Χ₯·OΐϋHkμƒ4 ρpύ:ε§ +―(ΛσΧHLz$ΕΪ½ C Sίe˜φΜ4ΐ^,RX)~ή’tIz€žŸ€=ήόήπτ8Ψk WϋψΪχΫ©ΏΞ²χƒ*މ€IŸh πz‚ HμgΎΫMRήP•Δ<•±Jβ˜x„½εdU/M&ΰkΪΗα“Τ'±Ϋ'qo…Ι'HEͺ¬CΒG1LΦAŽ'α€Υ'ΎXε ½ΤχWΥ7<ΡUό–&‰YQP0Ω„ˆ΅(‰{IΘˈ6I‘ή’4ΨΔj`eΘ•Ρΐντs€ŒTc΄²“C’ϊπ’“(@Πά‡½!Ύτ b'Ϊΐ‹xαyJΌΡT£π!ž$R£!Ύ£Αdω7ލ“Xg χΤe #ρΨΙΕfXΏ―ωϊrEEƒίΪhέΉΆX=“Θd¨|(ρΌi MΉό/V€OkΛ±SŐϋ·N&[^ντ¦εt±ω}<ΨΗWNΗΫ-Εύ}Ez•*`’½›}/Xn_έn†TΌε7»ΥβfRΈ.|Α3KΔ>P”ŒGΕ!QPCΔκλ9[ŽΉ“¨t‘9•Ξ4Σ;\3ύπ\Εη‚P#Φς'Ÿmξf›»ΩζξxΈfŒ&Œύ‡'ΗYͺ_•‘ΌΕκ&k›χ’a;τέ,$YŸ…+ΣϋΌ«”tγQκΨI3ε.ΰ™τ4lΥLiacRέΦLaC%£ϋβhΥGώžs‚δWλ΅(‰‚Ν²ΣΚwύPI]™pWWΊυ0Θς~άΨΟξf·ν1f?Pƒ@πsciSε]cΥ—ͺΩgda­Ϊγ=ΆνUaΔ ,IΞ·3qzΚ]9ΤBX˜Ϋψ€ήoγώ»ςz{i`ϊ±9μ:o+Œ(“ φόšΧBυ½¦ŠξFˆIΞ`ηaΚ#7:‹ΡΒν­Ρύn-i¦VΖ‘>«Ζ•ό₯lU² ϋYa•…ϋΙsε|kχXΖ׈›ν7$υ"“OfΏ†¬Χd½ΰ…‹›φE‚›=[ΕMΥ’χ›.ΞΌKm>±”9Π£jZσ)¬Gƒ˜=5½ΈάјzqύrQ7ˆ ½έKmJ½τ’Ο;5ή› ”}ލϊ–άC+θ\Έμj-:qΛ ΣΰΑ’(ίd…κ+ιΗ!œA°šJYh|ˆΛιvӟ³ϊ8 |wΞqp’9f±dΆ8ΦαLοM•Ω;ρŒƒ*zΏΨ.`žs±Ε K›υGœο±~KΓyΠ4pγ;Λ:ΈάΦaΤ9“ΚY~R:%”7'³σnαΨrz^A$§ό υΓ0€ύD«}½^IŽ銟Ga±Ψ+#<~` °''B'‚At’4πz|– bDh@F܈+.%R^kNΚ[vQhJ²MlonΘa/ΆέΝFs\ž³ΥoZ8ϋχ†΄b°+IΉK`¬Z9δlŒΨϋFtβŽηyq€m:‹™yζ.μYzaμςμŸ½EύeΥTZš|υS ˆ+‹ΜSa>α&/Ο·f§‰ωib5Θφ•‘6«{ΏΣ‚–έ€8Α1Hͺίh,V’ιΆ–κbιΆX Ό©‘HΛ~΅ΞΪ)ι¬ϊΪm˜UlδΟ/ 6ςiΔU:Ή{ΖHfŒdΖHv#1.6·ϊ»Ώα‚>ώ|sYξyt|‚?-šclFν€Ε7Ί₯Wγ7²s [qΠ*•£«.Δlͺ[« T΅{9›8nzϊ_Y#s>ΰˆώWΉΫΕύ£U\-:Π ΎͺŒ’Ηή«^ ‹•΅§Ω·ΧDvQΞΩ^Ϊt―ϊώŠτjHΏQΫ•{ΥΛ%·Ÿ±zΖκν©1>Π4\z§ΛΡ/δdw―7ΗVŒ,?Α€γ’Φ’Βh₯d}„s”ŽάšŠ.Q―Ήd؍~W­Fgπ~vΎk;=W‚Ώέ³i?yΪί\1νρŒMq+p X‘%άTΊξt„0gΉΓΧ!¬JͺΊ έQ›„*ςΣ"ΟIsurλlCλΚθϋ₯΅Oρ¬…q.AΞ4΄#]f$ 3~·³»ξ·Wƒά₯nβΆΕ}Ο νbψC™δFΙ)νwφdožΏt|ψ ήϋ>³^ή§$Ή|,‘ƒ`Γω{Kδ₯,Ξθ φόΦ"’8ιτΣ$ςiκgI8Δ2hΜΓξ€ξ₯G³‰i’°Ω`s…8^±¨Ζχ2‹,ͺ(95ω^@ΚΞKάR–w P€ξ Τl(…vγ\v{ˆώΕδΎ[QΫΑͺRδ4$±Γ5π)τ²£š‘c+κοӐtόΦ–-zμσlY#pς΅œΓ-φTxΨ3u, 6δeP€φ±a!iχ# £U†ˆ&UN%Ψύ{'Θ³;͎φΕsVΓwΐm3΅ΜυZΐW μJ+’Ύžύ»l0N­Ι€θ;άr>)Vͺ­ΆjΤ9EΕ>š΅έ™>ΣZ)S’ž•’ŠΎtnμ§T.0#Ϋχ«Œώ9Όƒ¨r ΐΊ *φ‡§DυοΦ;zσnΩΡ™θŒ’3Μ°C³±Q†Ο[άΏP_ΠTiSΕΨΩG H|ΊU>½υi>I―7ΛcΒΦd‹Ζ:T“νw‡uA\/Fy΄]ΚfΈt¦I8DlDΰ‘ƒά₯tυO5ιdŠΞMΔΡ―›«ΐ νsΡπxΫvμ ?ΨΈIη=€ΐŽ‹ρ sc?»§C*—m7^ͺφI§_wάόύ¦ xώ²Οφcέqxϊ–ιαiοΆΰiΚηQ₯&Ψα‡M½ƒNάbj1ύ$ͺκΥvθej8zΝ…:†}nOή©CΠ©X―υABl«΅ΥΟaθχ 4ν”mΉΰρv«Sρ£άq³ηληκ­J:ή/tύΥw̝έΜ?~ΰοάjlT˜AoWν’Σο©•Ω&Zl’Ϊ:Ά±Ύo“‚#Ψ ŒϋJͺBͺΠTΎF)+ίώρSH΄ΈRΊϋW½τΩ]MΆeK`LAΆPΏξ }νν+‹ΗpΩVΈ­:Vq—½Ϊ*+H%­”1Εο1ψz‘]@-ΩRπRθΰβΔΆTd«Τ}?H7;Τlyeyι+[ΦG½»¬` 7ΆœΡεRοωa«³ΒšfLf!₯!wΤαA£!ŠΚΌrͺ|πgΘTΓΉώ}L­Ά4‰ϋπΌBwΏ%‰σuŠ­Ε+¨=΄O}Κ@―hΑž1Xπόν₯Δ£ψ/¦¨¨lΫKވ^°&$7NœWΉΖ”­8… ΚYk0 ςΧ;7Ήgηκ4=ϋHνfΰΏcKGϊ«]—Κ—ό‡:iεΧ<Ϋm5È#ο+vœGΩA@ψΗ=[i”œ’I =T;}’f~NQpbXΡ.¨έ.zB.·';]έdΎ4o“ά΅=¨jž—S%UoΡΝΟ+j  §Ζε«Πξά‚΄ˆΈ”»ΆθLe#U6­E†|ω΄Mn•ΎΓ­IΘ·οΑέ:)ΨΖΙplk†Q₯/U9—^!nf­’Ac·VΉgN"v†YžD.sœΦfQεŠdθ*Υ)J€f/ι #ξj9q.ή>²¬ν™”†g«RS‰IΙ½] Ί"―ͺ&τCΈΞlK/ŒkΚζ³ΪΙτύηη Π.žΜ¦"YΨφtξ₯d&:Lj΅NφOθCεq³ο€±ΌΝ6ΏZΒ™šqvιήΉΈΚ₯ΛN«†ωόŽ Δ’6έεaƒWuiΗLͺ(Ν8θ^\TΞ)m@zœΘ’d±ΠrΊAšε,Ί!wΘΣ‰ληΎ ƒƒυlΟΈLT=ΩMΎΉl@Gœ/*swες&Ž L…wΚ²Ά‡υ”JώxWιΧF‘“ΔMR8υΣ7Z]Q¦ͺ0ιιλΪ6EΔ•΅»«yν Ά…"£vW=Ež QAvl ž9ϋ΅w=ΣΟW€bEϊ―U€NEϊοW€AEϊV€}Eϊ‡*«ΞAό’>0Ο.0Ρ Be-\άT… =Ο6P έ“,€f«ͺηWU%ΐΗΦυ|£«GκΚ¦YΩCUΛ6£vN΅ΜU‘+I#’[UέR‰.ΉC[ΩΥ₯L* Π{N·ηuέUΤ½Jƒ£μ€jθΓ“'π―uې§$ΞpˆΖΆα:£ Χm`ΩC’ϋΞQ―΅8έJ―7*}^I₯K―ώ€•ιΦy£Qη­Ei’σ _ΒZΆκ―OΏξ›η*X?V7έͺn5ͺΪW2΄―‘°l²#ΥΑΪ”‰i βc „4Υκn3ͺ{6¬8OF§[αF…Χi,vΨ:nΫ?Τ_>ς BW”qυ9UΜ(ΛύA6ŊVh dbΥscU=YŸ Ζ3Ό»«ϊΔ M^=σULΝ ‘=΅ T-‡ƒ$άμ%ρτj:Z΅ζI―7²8TΣƒ[ΣGVΥ”ϊdΩ­”X1ΠΒΨz˜«ψŒ“™a‚wκΆaΗΆΰ‘q-Ψ[ΑOSߍοΗ΄}JΒAŸPRΡ,dΕΨF-VΝ•>Τ֟^=/4κyHγ1 Ol'DCܝΗ`=€λύ χΩ[;$UφΆ”…λν•ι΅θ±*Άžƒm‰ΒρόιUφDKo‡~μΚΣ«ξō‰}iΩ]>tp…©ΘGoύΩ έο­ ©΄Χ&‹ΣλδKŠ΅}EΪ_oO―ZΉΐ|Ί9½j^nTsmQˆZΣ‰6W§WΫΗVΝ}–uzυΌr5>M{Χ3ύŠmC­ΝΙ!ጁ3Εξ°ΣΟ‚¦μMΑ,Γ ςa;“&ΐVb²ΆI“–% υ|:¦ƒƒφΐΦ'Χό”ζ>ΨΧ‘›°l'λš>θ^«ηΚΝ{Ύ~΄γβw€žΛ’Κ<§Ι^£!`“3tPٝϊΌjμ4:ˆαυΤ0υiΫ Ήν μqάιϋ £τV˜}-HB°·ΣdˆaΒ4M<Ϊή•³βΡ‚œ§ώ0ΓΧZς1νΐ0„ψ7ξBOύ”CΒWŒUΪIƒ(ƒaλl’˜B§VΩΟψ’RzIθωq 5±o8μό‡^Όρ€Υ>Y Ψ[κ8'μ!£€Xᯝ~ΐ‹Eμΰ3cύε―>)r±]†jϋ¦Z"Ύ‰Fΐsr˜‡cζωώ`Δ«μ%[έδ%/Ÿ˜;ρzb|@‹μ·Σh Əc dy?Λy£zδΛv’&΄ΧO²œΰPΡbΌ$§0Κjθƒ­{ΣσΧα%gΝ b0ΠΔΨy|λ%4XKMΚ2$Š θUΎ@Σ²>|[έϋ0V0„έ\OYγΩG;EL²7Υ4Ρ(žˆc ήψlβ―"‘΅“½ άπw‰ώMŒ(’£•ΕΑ.Γ `ՐȗεΕπW°†‘6SxΛΟ_ ρ/bͺσ/ͺ‰β«’ ρ}€^ϋ:DA9ό;§DNx±^ΨψδΤ'Ό:M0Cι,`μ‡œH85ΐ`c+΍Ό”΄GΒE³°§,θ…}c Β·’9ψ­hΜ€ Θ&*°ι&ώ`Ψνβφ{Hͺα0’ƒdέ€ „μCγ$L²MΞ@d“pDdΔσBŸ§ gΐαœFxΙϊ€.ΰ’~*‘^ lωιY θΥΗΊ `£4οΓB»ΐF’-ϊ,&ξzΆœWgQ²*6+JγΪχOζΪώFŽ“Hrm!δΨ'UχkOg˜¦@‡aΚΆσ’šΡ–ξ«±^€^$ ‘Y±U―Τk` p0χ=CαούgΖωžIW ¬„--nF•VYψ#Ν Q4]wΦ²ZvkΩƒgJNU΅ŒlWΣΖ‰ΊΐŽ–Α»kZ*3Lžy™«rάρλ·@B^>XΣφΥI"ιR)^=Y[Ψ—©Γ‡§XύΗΥ^Ϋcu€λd ΊΏΗ "ao­lΘΗΧnΘ΅%€˜»¬PƒΉΑL<ό,=†ΖZ[υ1•τΥθ¬AY—?q\—Λ½OΫ±oΚ"©ͺΘ;!πbΝ Y™υŒνo6Ή<γΦν²–~>ŸΎ·@PΞqO­0ŸΑ ΥsΙEW#ξCΛ§yΡgVΨepΛΛΛσμe‰₯?vδŒΛ^Ώ_πτΗιΗΝτγ"ύήγΗυτ£GD9GxάHΰ8KΏηΈ/TΜαεq#ύθq‘~ί#ύ^ώ½χ‡λ\ί‡E#ά¦v8Ά§ζ(0*~B«'U'ΗYά1tΑCG,@:¬ΐ`d@:@ΊT8χiζ2Εζ­ΝΣο:]>Žœ‹ 4w[ ΌϊΏΕk5Η“SΜi1%ˆ{nkίIκbμφšσόζͺy.αΗΞτ“sυΪ€e‘p{ڐΥζ6zt7!{[ƒ±0;h°ƒΜfΙΩΜ’SƐ}Ζ\ƒY‚ΪmιM-A>ΆfQΖ+mœZΟ ­§!{aζ7³pΥ°p͈r DI!sπΖλfΜώ,pfnΜώΔΨYΘ» 0t{šD4O4½ΝΦ6Kήιcή>^z;mΥ•Œο­Ϋ°oQ§νUϊυ7@ή‘%jQLY[§k}Ίό!<±Ρ(’'AΞ’‚:t°A»ιNΣ)ΎJ ͺ₯SœΪ(\¬!^'o±Fς›-“b™޽4ΫΚδΛ%[›|syžxK:Ž!Ύn™·ΝΩ™·Υ@fΰm&?uάf¨ή~a—Zڐu°x‰ΩI0nfΰ_YΝYMŠq'Ε~\‹―­,Ÿ Œa볝/ ƒ;HΦι ΐ˜‘Œ² [cά™‡d“Ζ~ηŽ@Y `O%ώr£^ΒΦiƒ†Γˆh±»Ω Eχς> 2ΰTmΨε³€βΩ ό‡/ZΓΰ›ψ•ΰŠœρμΖRχ#Grs.Ι/eΑX¬ hωˆηΓΎž=‘QψήvΰFuλ„Γ kρ!?lΧ0Κk·λ§Ί”jP<’w˜ςh΅PC'aΦdf;֞ܺΜ"Ž„γΎ‹ΰμƒCG-,φ'hΪ2f;–GΪYΛΡ7ˆUτ(­Η#φεSΪ@4ε;‚έ5ž0uΕπ8κότΪΤ)=ΡΖ‹Δ31ΈŽ\OW¬K²–»Jε-N;m˜«~žιH/±,¬Θ·«uΊR™1ΫujQ}£Kζ SΙε»”p7[Π`A«1EjήMwυld­{8Aužύ½STc vHψŠ5‘bš₯\σ3ΖqMS —σt ¨„u―%\ο³pΖ*Ϋ$–ŠΫ a‘ΆψWq0σςu&ϋώ5·0–ΘgΦ^G^/ž‡Ε]ΧτΊ|.»Λ.Ε-‚?τuτΨ±c§ϋρcτΗθ#πΰ?ός}}„ξ§wήI—α?ΊΌΈΌ@ο8ΐ?χ½mφε6<“”=`ψΩQPl―­hΏN,S›Ο½«t6ΞvbϊŒ\^•”ζζΞfV'Βs3αύ³ŒV=G"rΆ kˆΗ;°ι#ρυεH|t†ΔfHά&Ρ½ mŸm4βf΅ύΎ eσΥ…b}ΈνΙλog–ΰ–Γ\Xΐώ>ΐ χzΰΑΆΉ BtνΣω%΄ο³}π ΙXιTάύ°#gολ €Ήδ`Ώ”ξΞ`ξΟ »Vs9VlfšBl'nœ‚M+ƒΩ―ΉRœ[Ϊ™Ξοԁuήe)βkC·_΄`@<έά)-όΎδ9¨εΕ7ήώ…eōv€φ|°™χπή ^ΦΒ.}pΩ-αΠά φθM8Μ/Ϋh―@|£’ςNθ“΅nμ<σΠf{|`¬ Q Ηθ;DΩ+ΟΘ†>Λ7CΥ"–nεΙ σuΐ@ϋ4…‹zΌ†‡5FΟ~PwEr”b’h!{Η!sY)o,ΛΕ›U2Ρ.f˜fe Ψβ§d r!ΐ Α†ƒ BδT££Κِ0ϊ —bΌυξρΥΥ3ρ‘$l{μϊkΠζ²άŒaάƒχΔ0Λƒξ¦+ΠAΉγ–l²^VÐlU/Š.ϋ‰§˜βXŒ’]7zV’B΄œΌΉ^ς=―έž#K;2žIO)“Ϋ‡’C­ψ™‡ ,U[:?˜ ˆΛvκ“Už_‹›@ taa$Ζ=ϋYnv AϋŽχ»ΪόgT•²[…ŠήΐςpψYŒσ¨Σ)zš'Uy¬]:’N“άΟΠν†ρˆ€ΫΝόv8ΐ…XN~m¨+\Ϊ/²LVL‘Œ’€^΅]€‰<6F Ξh»l·H  Zν$žοΆ/Πiy€,δI˜;iΣNqκ$ύ_\ Auφ„ΣΨ5<ΦίpY14ΐkΊήCΌ[‚·CΙ F«œσψ"Œ ΓNί%Ό\V PΣΊήF‘'cΜ»¨ζ%GˆΛΣLΆηs2†”žΟڌε³ΙΒχΚΤpŒcΟ™S¬Νš Fk8gMηΕΚΞh)ϊdΣA«Q.J±Lς(²ΰI:} ?Ξkd\³˜dΌaβVqθ9¨Ϊ#Ήf(ζΙςH˜ΩγRΧΖα­o2QŒ΄ͺΣgΤΔη¬[ΜΟvΩ”ϋ—«Y ‹FΆ*ΝΪ‰Ϋ}‘„«(“Uί1ΘFYͺ] »¬’!―4λ§θzΗήΫ χΞψ«FΘ9Φ8»Ε4†;Fέμ+·3¬‰"‹tή•žϊ Ί‹[AUaάΫΞν»\S?Σ/Μ‹a$θ•»4Ί? 3±€xΣee€a€uŸQ0SΖ=Eφΰ‘%ςγ -&οη˜¦ζύG$2žG±^₯\Ξ’φ ΘΣ™ ―)γL˜¦°0―‡ΑΐΥ€XMYm«~K«M0αύ,νRvύ–X B7sJWΐΫ΅fHϊΠ§΅ψΕ¨Δ(€ΰjZέ‚Ϋ€j΅4˜ΈΗH’XΤDA˜z"A‹Vρ&ΏFΘ—BXr™’ΟižDٍΗΪΌ1ϋŸ ӎΩρE¬ΝmNθŠK £|νvsΑd`~•$np ό Γr΄sAΧBν;§ΔGύόΧΈΣGαxA%`uϊxΩ#i6œ €,Όy9Gm‘>»YE0mϊ8©yρ‚ΐΜa¬·ΐα%θΊ 4)ΣΗηlQ₯λ4Ζj儦₯P}™`tΞvQ1ϊπχΨτΚJεw“Ž$mIrΊ™M§eѐ\b0Y’‡YLΩ uβ bπψ­m…ΑG¬Λπη<Sρpa$ε+πϊ”Οu‘7#jdYR²ΞωΤ$5šΎ9 «₯pv€6h9•{Kώ.wŒ|[ΒΔ>aωŌ$b£ηΫEœx.Έ>“cqπ ψ8j›<3Ώβ‘F²ΘΕηhήΤ£“ΆBlΞφ&fΎ›Dl"3S’ ύΜ³‚qΛί|τκ…šIlζ6f’AJϊ/b†αw1ECŸγ!γz )€εΨORΐslΖ z`ΛiKζ“—j>Xb›T ͺ6υΕ6ΒJς •ͺ¦§υ"ς[’ /\waY ΕΣY’¨™,—53•ΐΔ³(?°L™‰Ώ˜α!OKa ΅OΦθΛ(η+Ξ*#ζRΡmgί‘™zόŠS”}!Γ<±ϊ Υ~μς[[εWΩ9±„†Πί€ω +φΌ8ΛΥ–ŸOwΨOχπ©Ύ’Ηνlΐy0G’\:3 ‹αΗφλ}Σ‚σˆ‚—“SA4f; + Λίd_θ ΉIžŽΐχ‚(„r"ΫΜkTΙk<Ζ Ν†]|Θsν»DξΓ·o }a‹_Ά΅ΐΤsΐψ½xα€.α"Νψuή”uκ βλZ΁ϊn₯6’³u@¨‚~Ž14z‹οΊ@[όΉsuM£7—΄AΉL<εψysuΝ²ͺζ»ΖΉVTυ~\>΄žΣη ζ*f<ŠΛε^5[¬°TV²ύՊτT€ΏΏ"ύO+€"ύ7+’"ύg*£"ύΧυ1k~iμ ₯*=ž;5\{ͺΐ>ίY^$R2Δ{½Ϋ)™ή‡]n;Ι2ί£ Bπϊ~θQΌiΰirB(>€gΰΐχaœ£Θ·¦ω;ΫgΥ•Λ1ށM,γλΝζΔx5;H…Ηη΄BχUςξ¦`]εzoΘiώΒΉΊlI‹΄[τ%7ϋί` ‘ύ πΖΆα‹κ0({x~·"ύνcΚzzEž7U€^Eϊ;*½"ύΏ*ίW‘ώžγΑ>2ΞΤvžΈ£΅“ŽFΫ Jω;3¬c‘ΝJ#ςͺϋˆe€­ Š#P•³φKŒή|MΑgΦέ™uwfݝYwgΦέ™uwfݝYwgΦέ™uwfݝYwgΦέ™uwfݝYwgΦέ™uχ’΄ξž½ά—z9©ωdQ=y€0*Β…%-~εΐ찏›aή ±§D…;yΆΈήM5»λδ*%2 ψr£έϋ€FόъπvΗ«€§τpπvwϊ £)Ϋ[F%ϊλΝέ}eˆ+»dΓͺs|·FΥh₯Ρεˆ§A5ρ‘.Z&΄Ο§mii‘Ž˜ύ/Φ/ŒΗ°mt J¨•`Θ))η‰ΉXι@C>pd*œ§ˆΔ ³*­ œŠŸ”Ξ€ΉšΙD(τvrΝ‚-D94ͺ;ά’ΟωC‹κpeΓ3ΈcdίƒL΅uΨvP2β“ΩΥwκ,>Μ4 €Ή VqΆαž”ωUΠbΛήl ƒνϋYZ'ZΒ‡EΑ€j… a‘ηΜ6oA(³ƒS01G3KI#aKνώΉ?€λ° ƒ˜ΑJάπΕy|K¬ώ‚‰ŒH£ΘAφCOΆ©8 1 x^Θd βΥe‚žσdi $ζ`…#ζœρ˜vjG°PQ8kŸH¨δ€IΓ§&>€ΫƒžHΓAΑ5Πrγ0yΧ°ΥΒL‚ΰ$†O­#œ Œ²˜‚’™π ΏŽ§Ύ ?uωžΒάN„ΕW Œγθ`𠱨<ΙHXdX'@¨λdm“ ½zΉœΛϋB\ElΣ α\εC‘Άb?Hocd˜)θ κ)…%τ ¨‘πγŒΣF€΅Κ㩝 νHo Π5xρΝΗYΈιΆΡ›Ά/a0γ’αŒνœYX Σ~©–eyώ‰ l†±a }‹˜,ε™i(”ˆΎΚMΠ%±£ΐmŽŸ3fΝο O0+{M£αj_ϋ>¨hΦΕΎ&…Šcβi'Z λψ#¬h. κ)° ai\‚Υρ{ΛΙͺ^šLΐΧ~$$†U˜ $vQj†EαEς R‘*«e{>ŠLη»ͺβ[Už€1ΒWΥ7\σ‹ί`ΣIb!NƒHk °φ`]aeD›$†υItΑ&ΒR rα*†WA™#e€£•Β–±Α(ί ‡½!γA$`ΜV+Q8r˜ΡT£pΖ=ΤhˆoΕhπΩώχ³°CKΛΩΓ§[‡WZv Ζ‘γ_J‹ΝBΈ[ηΐ^VθΟƒ… ψ’ ς`Π₯ό/ oΒ™@Š"?Ή€{]npv‡:³±τπέΛρ™ΣE‹n©js€PvœΚΓ&Ζυδ2«5΅œ‡'Ÿ}^©ξ_νΦγ„Όά.IηQM¨gΣ―Σδ?Σ*ξ+ΠΤώf„&Ημ½­€Εα’U_Ηb…=βkζΖ~*ο0~N©]e?4ζΰ0gίHnžR`Ίu°ό`ΰZh{ŽΘN…ŠτΏ©HοŠτͺ‹dί\‘ώιοHozρμ_U€QΦ·υŒλ,„ϋψξΒZ9Œ™βΑΟΙ.Χ38‚ΊΞ°β"n#.X<†^βςΈΘγŽχνoj…Ža"_kταf³ΙΦΕ‹VΛί`΄όjk°aΈ°šϋFs3›»΅Λ,/¨ώ}³ΡΏύ»ŒώΝ}œΔnκaoχΩb―–σֈΛWΞΏΥΐωMœΟ.:ήAKΊxŽ.LλW.ž#ξR¬¬7š’Ϋ{zam/g|ΫάͺΣfέ9hϋΈγ·3εΉcϊv!φͺή•5oΠζ?ρ°oŸ³ b½/.c8\Βf-³RˆWfPΧΥί³οN|ά+o­ί·;}ΌΉž)Ψ‚²Έ`/)ΘχgˊpζyTŽ`†£§…{Ήu  χ F:{¦½ΰ4¦Ήf+U=J½₯Ψσ̜Κ%ΕPgώ.:KtjΨlΤ½ΈŠ "BuΣ$q?`fd"•o~ΦΜI½2*―6)Κ¨M Z€ °Aϊφα&‹μT€ =φtΓ·ΟU|FFOΞI‚άή›‡½A@½A'‚?ƒv“π5HΦMΒ•½:ŸtΤΆAƒSΠΟ>­p›G`’=C—^wˆ±ŠύKΰ[:o_g΅…’Τ¨^οLΣeΚяP¨Γϋ^——ξ«BΕbZe{ €‡­ίλ*₯"ύŸ+rBnΓ‹γΩεg‡ΣΓΛ˚kL» Ζ’šgκ Ζ=p'λ”Ÿ_ΒVs3j―ϊN£)Ί2ϋΞΙίjO<ŽDh™!<ύΏΛ¨ϋž½Z―aII» ΖδNšΔ›ΊΝ££ Ν 1€ž$h^…mα焇^Π6s1gΨωΝ6ρ =θQζŒΗ}‘ΐΈI‘xtϋm‡ΐ>)£¬ήΑνVGœΔά„.½΄πFZφνωΤƒ «ΒΏœaF½.zXa˜&=x¬Q~E―Uα½IΏU–‡;†38š»Aν^ƒžlŒ°ι³ΥέΓ°°Ώά_ΊΗ½…’΅Ÿ “Ÿ7΅oy€Z=ό>v‡9όάτ ΄Αc’ˆ£%η鬝΄~¨s·Ν0Χ sj`Ž_΅tΦhϋαΉ*S;]—Z#6V;ΜmΡVΜ>²ω―­m~―ŠYXιρw6vϊz‡Τ•]±νχ"΄XσxwY„σ±ΏŽŒ˜αcχ¨₯z:Z"§―ςΏΐΈQ,lΤΌŸ<ΰō^Œ΄ΌŒΙɑΏψJW[yQΩ»ζΚ?#9}ράnœ ΔσζˆsƒΛΗξΜωτΏ1ΌΌ)°΄ΈυrΈ|HΌ-q"nwq…ΡΩaŽΫ?πτΦbενqΖ%$cέ&[VN50f՞sΟ!}ΘΕ’΅Ϋ•»‘s$Σψq”σ–ƒμ+guVΚ(Xϊ½ΐFi˜†–ήυΦ¨)<λ€χ£sc¦»Qsϊ…λ’Ռ[Η4Γ:,Qښ7Φn6 ‰Χ [OΤ_^:[‡ΉαΡ†΄ΑLLVMll source.llvm.xڝVKΫ6ήM‚>Π\ €EίEπ:°±ν‘HΣC’Km"G6kŠΤς!Ϋ ώ„ώθ~€v”έ6­`rF€ψqfψ͘χΞΊη~/ΏcΪθ’fR—½ωΌΧΛ"Ο³η½|œužY?Lίιε½^ž.½;™ >ο₯σVκυς*Ob)L(-•j볓wNM#Ηιa—ΥjΉΎϋ¦—άhX­ύ’o˜eά“]’γ¬Αv-Ά»{vΓs~²ίy?υljΧGƒg&X~τεόμߞσ'¦‘—]ΞOΞ8?ϊΐ¬Κ"2₯ g‘i¨nc#σ¦–ΌΆήΕRz̏₯G^7{ΎYGΊŠ΄GΔΠϋ9E5ιρ΅e*P¬–ΔJΘ6V€9λ bΥΰCτή8™EΘΒΝce©Ž• e\Σ€‹©(Τ₯ Z8(BZβ†IνȎtoR{oςZݚ-EGA­†‰¨Lκ’ΟΙMQ»]Τa \3kBσΡ(H‰ycρ±ΩΘDo€-ΉP„.yθ`bβ’sn£ΠBU)j1 '½©šθξξ’Ώx…Σn‡o’7± GHΐFvΝw­ƒ €ιšοl Ϊ Ybΰu™ζτρŠ!νΤ²‚ΩuάÐkΨy&<Έrσg>λε–;ΈΌDDa χ莺GšΏΈw€Ώ*,©p2go]ΓpβLIζRΏΦ]œγ[¨;vpR+ ‹YΣP>›γjͺVΠ•  ž°ΪΥ±W· –œ‹εGyδι‡f”Θ’Ζ8δuRZ²λΔ ΑUμϊP&šj€‚Έ6y©¬Ξ Φ₯‘žΜΩ4μ yŽΧ9GŸMnΘ:₯?Δ‡'χF™5Ύm¬l“qπΘGxψ}!¨•NR·xŒμ4)9Μ`71—Σ6aa§ΈΒοZΗ*κ˜ν˜–vYǁtbφp|χ›„Ž‚‘³ ςͺΰ«“‚¨ͺr-AΎδr’‹ŒkR³¨ΘJƒ„AΑ¨<*OΥid-RΫ3©Πϊ>v›ω¬QTdƒΣDB£;4©6€ώρ  |ΨDzTŒ]ǞΦ(ζ%”ΜθΤeϊμ¬τ”c³ϊS‘™ ƒέιΥyΡΏ]“5Ι‡$eς'ύ†σΙx0–­i ξΙJβoyRw潜½ϊώΕλW ΆΈ~Ήψγρ²8Υ/?ΏžΟΏš_<wψx²CŠΑύ·³±ͺ΅FŠ(WβΙj>† wΔνn%ψΟϊαΗ§σΝΣΛΨ4Ό‡κz?œTRj4⋍`zΫĚGοκλi/[f%Λ—§[ ?8BΏ†`ΈΞώγς!Σεߎ˟_·α~ΨΛ_–σΩσϊΩγαώxρ«ΣeaΊξΑxπιΔ—θf΄xž\[•Δ—Σ»£ΖΐJΎΜĘ"~u€`βεlΏxΕΥΛΕ―ΙΉSδ―oCNε|ύvΌ}λ½νΚ8>+ΰ‘wLeanlean source.leanΓxΪΥXέn5ήmhKiKΫ”"₯Τ¦ΩmΨiΛD-αOH !• €νβ™ρf­ΜΨƒνIvUWBBB)7<7}„ά >@’OΒρμx~<³?*!FΚΪρœ=ώ|ΎοΫ{΅5{ήΙΪ[ˆ2:τBζοΕ’S9ΌwΤͺ>W+Άγši;kί­šβ‘DFΏG.¬Oeνz՚ω5ΏkY{‘b!B ›7ζΫά76§ηΫ|llΞdν΅ͺ ΎnvΆ16BrBχΎΤΡ,Lί΄όΣyΝΫs–Γ!8A\šΧoYΐΛL›σΦDώμ΅8²ΎkμJ “‹YϋΆ1©0wd½5  ƌΕ%‹“ςJ/[sU"kŒXXK=²TsΥήzuωN*'ĈΆJ–kee!φξV‡ΪٟΙΑξγΤ—!Ύ°C:³Π ΅y0€ή·…„b'`‰βžζ †νT›‘Kg7ΪΉέ= Ύ–…g#k ‘S‡³Ξ(‘Ύ¦9ύn»d\‰ΟσγϊόϊΉΡrE’EΉγˆ€χŒ°DN!iΡ †μ2²nώ‡wHδΨυ”λα‰Δ4ΠοοΈΚνΈ}χΙΛΏ{πΩ ‘2΄ ֊3θEθ6rW“ώ½ή§_τΎA½Ρ Τ=±η»Ήη€Ωσλ›ο’rπ2–β2lΎ^`­]Άη$γε9>_ŸΉeηΪάΙZΦ$ηZ+ «0u··ΤιB§η,χβœρKsΖΧηŒ_™3Ύ ωJZΫλu—”[‹ JΎΩZ$•΅E«² οšχϊwž?{~ %Ώλ>qŸφwDŒ|Ό3xψςχΏ^ΏόγΧέΑ<“Α•wΰRJδΕϋΩRφO­,©΅\RΛ5΅ΦZ=Ϊ δq‘μγΟ< έ7]§Ϋ!4H Xω¬θCΕ€^Β±’cΜ8Žš–} …<γ’²―B ϋΉ*4 »Š€%Υ―!B™Ϋu=Wlwά'ύΗOwά§έݚΰμφvΦξγι!γΓ_pœhŠeeσΜ+αΞbυγ4Ζκγ]ΫJ*!G{Ψ‘Σϊφs=χƒ$TX/‘X/οŽΫο?vAvnΎΣ\³ΌΑΩ›Œ,Γςh¨ύόδ.>©1sr€$Vϊ¦’’6T1‡³μt’iγD"8u”Π±Β JΞΒr/[@ŒσiΙ« =‘($CΒο‘Πφπ)6€J­­©’Δ ₯ζB+$[‘jͺΏ‚λrͺˆ¨ΐqίΰθ€@Ԋc˜„=ΖώΎγ0VxB€l:gψ€³ύΣ%gƒ,ΑΪΔ‡I₯δΤΞΈJNζQαͺlώjLέhWBwb8κ€"0/zByxΠέ ”ΐώ¬`1hXY<3ž]+ΐ‰Ÿ˜EΐgVΈτ'y@…βθPρ„ύ(ΠΘ`>KΏ³ΐ‚ˆ€bwš)g„»gϞϋ9 }Ί”όŽ₯ν Λ󽝎Υ}ΉV4Ψ‰βΠρϊ;ηž-ŸΖΫώ¨γ²‡#?fφԜε΄ύ}aŽγΕ, |Χ’)σˆEέΠ βΙ΄# M;/§­€ν›…iCΛρ& _ͺ“ΑyΉ~Μ9ζ•ϊ1ε˜WλΗ\’c^«σ9ζυϊ1—ε˜£υcΎcή¨δ`ŽΥsπΝ~wLωφ­Nw0ί cωϊ7iϋNΪ–…KŽ{;m?HΫοaΐ¨ϋαΞ#+t,ˆΨ³,9ΆJεΨwKsΨ°ΓlΓΊώpΘΌ ΟχφγςΈ(°ΊΣΓί/w€­εuΩ”ΰΦH°ώaIFσ”ώ¨Dio4d‘Σ}VZAXΕΤg%…—Μ“XοxΦ0Cύ“΄ύ΄€ύeN@λΙBz²¬>ΩΪrnJΥJΛ4U3:kξiΆΫj~Ήf½³iŒΌn<²bΗχt›υΟ·)Μ³s‹™p"=Ή9ωuWͺ9ώβPΏikšΚ^λœφ§«Ϊ K롟\ΨηxΌΠΖε‹φ“sgρ|χ—“~ρ ΡΌu Mz―«§“yΝ²ΌXο¬ΠκBu``¬Θݐ –…SB\“ττGa7?]—Ϊ£'―ςδ9’§—|0χg’τLI#ΦmΆ\γσψ¨S™wκaΰΦοcκ7ΧςΗ2ŽΫ’w\Ώϋ F ΛIλ`6̍™„S–EΉx• Κu˜»)šΑ2[}¦ΗcHŽεy~œ€žΐ)‹ύV+UpΐBfϋݚ­6&ςΜ™3/ή`œ9Θ`ŒτJǏΏhΣ±’™ύΕι}αO4gρ•χο ΒYah5ΧΑLΛ]DψΝφφ΄₯Ι[”tυΩ^0„JŸΌΪ΄œaLdΉ΄°={?ν yy±Xύͺ\ζΉ΄²ΨeΤ₯[Qδτ=a†m–„½£°ΰΞς$z₯ŠD¦Ϊζ~ی­ΝζΑΤoΣφοϊ‘­ϋ„&}– ύ€†ηΤτ«ι·¦γωlM9Θ¬΅5eSώ’L͟%€Ζσ—ΐ₯Šν-Χϋ£RHζLΕEωAυΏε\ψPNΔOόή›P²˜ 3YΈ€°TαΈ47ŽZ¦u–φψͺφΧ“;ν–Ή{Rk7Tε xVΌ0$²eκοLj%`-{7„3ΠsΉοBμ-Πbv€‘Ο%πΦwΌ9ˆ·<7ρ€©PŒ­50X9‘κ ΕnžTMO<‘Ι½ŒN=¦#αν°P#[™Ο/—K:πΐ•Ρ7£_ΧήΞm uά5΅6€V-ΫΑZρ”΅ŽΉd³:o9a>™)ž &|urYΜΣ²„σΔL‹΅²΄¨u€ΝόŒ;Λ’{κΡΥΥ5£υTk?9'°m6 τπ­¬gM<› <ψͺb4Wρ“„φ{-ΘX›[žάψa:‘l½8½σvψaœΏ7W-Χ+ιΌ₯­o4Nέ;½΅έδ0SΌ„­js€• nž2O\ J[MΜVΪ€ΈxRɍ&­ΙΦ‹Σ;/m"ω{Taϋ„RΆ4ψ(„OMu2Υι|2—φHbŠΉhŽ›™n˜™BΈ° ΦIΣKK•&π„ͺkζ“œ1ώG,ˆτŠblρ§|ν)Ί¦’Ά_Έζu%5 jΫλ“ΈσH Fσ2μHkΊN<Φ©NY5m‚Ώ $ν LΝέulΕΤQΛP³• NΘ€wž'+π{¬°šd―J™μ((7?ax:P$F‹ ŸΝ”œ.δŠœAxDu—.‰‘¦š‰Ζ§%μΧeύb’9Y}‘šΚσ ^.¬±H™δωβρJ₯“˜£>ρ|Ρx΅’[fk¦³z­0b3m)o†`ΐΎ67λOφ6 ΡΊgšν–Σ¦ω4 IΒU$.m•f͝ΊO€θ•ά’¦7γΧ—ͺ"šY¨*¦¦¦&7ΆUn›λΈpΜŠΞ§ΤΧlς&_kς­&GD΄E ZŒΨ¦vk›oΡτ–*`›mu;ΉΩUΧΠ―΄žΒ]―«θ4πΠM]1uΥΐNqqwœh6“™ŠΊ¬›ΐώτ&?έακ½ζαΔμς!υh’[MKΝλΟ­Τ\ηιί(t‹FƒX%Z£™γ΅θΙσ^p~S²>ΔηγtYEαΎΒΔdyΔ/L\ο¬NR²ΩΊͺ „Θ8 ˜EB«Š*%ω–U–]ΛλΘŠv|ίe–§Σόj[›Z φΕο!ΰρ+kΜ\L¨^νσ©ΥΌ η#ί±+–Z«]ŠfU―pfj…Δ` ?šΗŠ₯>++yΆTε*·€ψ ο`vDVzΕ(VŠuQ*¦D/ε΅'Eεσς)Θ ηK5fκwU΄<»,Ρk’Y9±,Σ§k’'Ηƒ5wΚΩqη3ΕeNeΆV·ψ€^ξfž”γ]ώ™3A€kr•qΉΈ^υz€}Νυ;όZ"ΧόkΚαmΏ+ά(|+]oHWι7½Xω#?™_Όΐ/_Rh·,8[VΐΏεw»σ3ͺό»Πίσ;¬}/ΰίß~/R~Žœ&`δγΩ\~tͺ tλ›ΏΔqp‡=α ρh ωL13G„·&%-ΓFspŽΧI‡/vP ρ³ Δ›žΘžΗό[λ["™fv…ΦM+ψ ω₯°^αeQR""―DVκMΰΙLϋl αoάn”…[( 7gHηϊrΧTi³f ¨—%½ ίΦa˜ί†%λ)ζnξ—ύ―ΧΑι!4uΊγ >)³V€@lιΩ“Θlq“N€ΛœΛA‰ެpφ1zέιςΫ5ύ‡=u.E§"όΚ^*qR˜pv8ο{…5.ΔZΧ*Έ­•_ΨΙIχ—΅>˜2πZŠiζšΚ[JϋWJ’wd‚XΉCΣPΥ$PyΛ€ “e?2;ι\Rδ)δ["£$ ΙΤͺHΣ¬1Ι,“”3Men–Ο³|F”nn"|έX7΅Sζ½­νvk΅‰3ŸΦύύS ΄TCΔΎ!’ύ–ήnέΣΫΌΉΚΓκΊHσΕE£ŒKT8ͺΤ•œFpΣγζ ŽƒuvΑ|.Φω%¬ΙNnψκΞ‘*2―g¨¨O € AΙ 6?œ}%΅ˆ«ΤRΜ)‚Ύk…$=irŸ³0„΄Δΐ)Χ!f„AεpΜ,ŒΥœOpΉ’rδ *q]όρŠΌƒΌWqZ )‚έaΚ§?»CjT#3pΡΐιΕ©-‰ό!]ΒXΪτΕΎς2Έ+ZθfšrjΙi™ ιN Γz»wTMΔESgς1ΝhΔwΠWš2>Š4–Ό₯ ­x:ͺΞ%3βœό ΅΄²Μ$9wΊXΆCΤβ)•¬Ο8―*΄όο…Œ=JΧgρΑ²’|βΰ‡‘twΘSH.cd&[—DΪ”λ3FN"Ω=*έ7B1Τ\λ‰ί3pQE$ZT“„pŒA(JωG χ*§Ί«3θ~Pφ2“©ώ‘’ldbΪp€¦—AήΦΡu μ›°‰b$Lό Ο§φ°γV–Β*ό?']/d–™Lkο]OŒ&ΩgalŚΒΣ–k +[ Δ™„ΐ‘Η š 7ΚdHͺ?™°+7(–ag1ͺaΑn«€ ςYs’u!Ζ$_Uc$σ³eRϊƒͺ£6©wΘΑKŸ .ό½κnΆk:‡;y%)rQ¨BίQ·ΧCjv|qE99δηZ{?΅Uκ΄΄ήUνFς* +Ÿά$s¨’ΚZHΪ†b¨­Ι© GVUJ»ςπΰώ·Ώ₯ys©ζ7…‘,ΡεI―”ϊ>jG%βN]μ8«φ3΄NΓώΌW‘Manpageman source.mancommand_line_option(--?[A-Za-z0-9][_A-Za-z0-9-]*)section_heading ^(?!#)\S.*$«xΪνYέrΫDΆβ$Mϊ“΄)m“¦?)Ι€G’ό΄₯™‘&M™ΊtIφΘΆ’jjKB’Ϋ†Š ž \20\”§ΰ‚[ξσπ¬d­v½kY νU5“‘ΌϊφœoΟ9{ΞYe₯ΠΏNΖχeέ²­FΣnο5οΘ‹y0σ`Ζψ˜Sδc>Μ8s0|ΜMΐLς1·sŒω0S|ΜmΐLΗχΣ’ZvΫΐ–>> •ΨϊΌ%Qv·«[m©cZ†d;Ύi[’νJŽι€Ε·‰©ΖsΗhωCžy*ΎΟ³f:Ί«w ίp1–0GΰwLΧσ‘Œœ₯ξ}d_Ώ‡a§‡Β㜑ξ}˜γΪΎνο₯M1GEA£ΡΥM ޞ₯όίhxΎξϊπϊ-*CgΓ»s”ΰΎϋΰνωψΎoωnƒ)¨8‹§xϋ”Kf¨χAyZ‘a=•žκ.ΌΎH±G―MΧΆΊ†ε‡0SovŒDγ"5‰@0γεE:pw™Ϊ 8`q… ȝžΥЬΦ;]₯ό“vνeˆ8„ΰυ5jΗ&‘³Oνp‡·gَg&`[ψ—ώΑTͺlΤK•kΛ’Z“WK•ξϊŠ(& ±‘DΝcQ,iyΕ½aφ†Ωλ`Άί‘  ΥCRΦΥ’ΌͺΚͺύ eJUϊNCŠ’{~׉ŏ¬%CPθ΄@§±Z€D (yBœ£θ4)PΉeaΣί“-”,eF–•Ρΐ0J„%€ŸͺqmX@₯<'ΜΙ==’ζQz–›ήzbψžlXνˆ/Σ—ΉΎ$SdχΊ’>{Wʁκ!Gͺž( TΤvuχIΟ‘zΫ΄vedڎQΒ‘p¨žκ1Μt*εΦZ0Κ4'°ά¨%=1φžΩn[ΆΓΥ}ۍ¨ ©iž) ½G ͺ±RΧΦδ’Έ€•A5΄3Π"ΘIEΗ>ŽΙΔb‘­wAxA£F8ŠxUV_.ω†η“NEτ4![΅*ω—+€ξis. Μ%-βΩ=·e;‘u±\vΆ#θ'€*Ξ›λ΅o·οUΫͺθαaυ› Ά…n΅ΪVPϋβοŸͺw··ͺΑΑΛƒ_~?ψγΰηƒ_£η—ΑΏΏύωΟ_ϋΙYdοhq/Œ1–Q`ŒAώƒ+΄Β%|]«~ΎωΏp• ‘CfS\>»ο^uϋnMT›„ έJhœ1Άΐ"DψχRŠΠζφ£­χ·οmn?T½ς£κƒ­κ§_nΦDz'RμP?”Ψ$cl‘EμXšΨiLŒ¨ό™ΦφΗ‰GgŠ1vEg:Ǟ!ξ6¦ŽJrYvΩ΄Z^ΫP›ΑrΫΨAe=½§žοφZ~RŸ•Qω+κ‹Tšη­αxj hξ°Φpβ°ϋ|QB β•ΜΩ,G•€cοšθάΊ€8 -ZBΙ8FL$ wC)κƒφ8Ι΄ΨQΊR‚ήEPΣΨ5qΓΔβ{‘Γ/D…Y‚ΨR–΄·~,)ΊτCCE½ˆˆ,…ΖθNλ0 ΐθϋθZΓοž(6ˆ‚ͺάΡδS%P5-Ϋs—σXB`ιΫνΎϊ0E¬£Η;hbΆξωCλ>“μŽ1μΫbΈQ"OΠc³/3(Κfτ˜49Θ΄ψœΤBŸ|5/I+jst(‘IC#VΑ °­ΧsΫυε„λ›N.†SiΔhΘ ΕωuιΆ„ΞR(ͺ+jwˆyŽ0EF†SΔ†˜ιΉ|[Ÿ–2΄Σζdω ™ϋ'¨Μ`?ΕDlŒΚo„Ν;…7dxζeVΎ^ΞĐτφk#U£¦―ΒƒCΌ$ψœΞΓ’­βœEτ.3ƒqΫω@ƒ©'ϋςΐɞ΄h§§”Ό²7Γtρx( O„»†eΈf+₯§8 λ“aŒ² ΐcIς€σm ΥPIͺ`ίiJϋQ[=ς)| ”†*ΜΈ|«%±€ΤΕθQ$’|œεπ!Ŏ.;Ύ#· ΟλGxžT€°xPwφΤίχlίhγr3ž3·±’c–½½Ι£;ο ΔΉηΚ¬y7!Ϊ›%μΰΘ(aUθ1μ”ΥΘ)‰Θ ŽGζ•ώ{ΐrJΎ˜Γ<―$΅Ωκu£m€°‡bΒΰΗ‰LΣÏz!+υ_ΙγήΙ4 94Ζ-$FΉ3»ΞΡB`{ΜRΪΠQ%PΛΩ}η%q#‰ύu₯Ž‚/N ’ΤΡχEqx.Κ\ΨΥΡΖ£z:½Žτ‹«œρσœρ‹ώΕόv\_Ξ΄γ\ž8)f&”ΏΊ­Ύ<ό“GκFMediawikerPaneltext.html.mediawikivxΪεYΝnΫF–%Η?J;-R€S71GtκφR!©(Πk―€lPΤJZ˜?ΉŠμ†ξ3δΠSί£―ΦsgI.Ι]q)*H`7!&gfgζ›™Yέo$Χ­τΎoyΎwκ`ομτΕ»•Π|ΟhΦδ4nj¦)§ωΡ΄δ4?2šυτΎΓΡ„δΒAΉ7*ˆ2­7*ˆ2΅7+ˆ2½·ϋƒ",:t»q¦c»q¦λΝΔ™Ξ·/œžΊφή ζnf_Cb„}Ύ-0c„#φuW€Š.ΜΎν ߊ‹ήΠ‹5gο šqf1’{ιύΎ˜ΩjˆX:v­1ηψ λ.b‹>5 λΕ°7½«½s­­š‘f(ύgmUQΙdζ< ;QόΛE Γδ)ψΑZ[‰Τ'$rЈD6ς "ΐşVˆ¨λ’p6€SψFόiDΠ9ιΠ‡Fˆο&―“η˜ΫxΡω©¨υΤσž–1=?RΏΌ‚Χ'}KίXα_؎†ό+x4ϋπG;64s˞ΰPvΧϋtζΩdfμ{ϊ°‡γGbυ)ž’άΡMA[β ]ΜΑcΊν{$𝀑Έ!ΨηZ‚„'Υ(9σΊDrfΛΑcΟΘr7Ηυtή €`ΫrrI‚€§ι$@ΑšήΜEΆ³x’IΞ½)p–α“ τ`‘Κρ_l "ͺ˜ Ζ9ϋΆΐώ]₯'ψ₯Ϋ+ρHΞyo ΌίŠj'fSΟyKΰά_‚]Α؝z‹–pή^)βμ0μΔY™ Ψ¨UK—ποI|’€ζΗmMγΐYΘ΅|ϋ6£χNύd{gV,ΩρεΥΆΫVYΉUγΔ4Μ>)%~‘υEνν+Tώs%œZ6 Ÿ+–wA&`{CλuίμkŠδ’lǁE–}†πhYΝk ¦Ώ·α-IrLœ4ΤKBW¬[_74Ίb²λΰ‘Φ2ŽΗEŽl=βΩ€|+lΑω‹Η0Νθv ξZφ…&q­2 |W‰βΖΙ%ΐVh//₯-m]Z-‡΅$©ζZΑΩl •vτ˜+φ¦[ΉW,ι2”„Tε£cCRZDM‘jVεχH—cΏr¦[’Hٚ€ψF’:ΛΝZTŠλύΠj—ΨqΘ²oΦ·le™πŠsL£"ϋ ™˜Ί Ί»’•λθ\ΞΙ鼞CωA¬¬η‘_ρΉ4π‘>!n•Κ¬ΧRVΠ9Y ρQ8E6.ϊ₯Tη]‰Ξx‘˜@?g/Σz'ΧZν=>0NϊΪ•h―•Š„‚š9 όΩx²hΚZΡ”5Φβ©/TσXϋ97£)1c‘ΪΌ— ωeš’|€6“ έ£ {k]ϋςφΦόΣΆχAI†]ƒδ’„/K“«F»"}?—tΊχ™₯“hoΡξ’~Ež;1Yτ FπN‘L~•u2;UΔM‰†{’χw+dέ(Ύψ›έΎ Σ—‘ΙΪqŠ<Ύ‡Žmͺρ먏αψΚψ χ逩©]M‹yΨΜϝΟΫw|/9O[:&h‹=ΏM΅z~‘Y2^Σ°Š•NGeιkΥ*:ΨΨZω Ρ Ÿ  dqΓ_πl«oίVŽΕ%Ώύt‘‡•!ικl £l:ιimŠ}•π|:7ΫΡ’Q6ϋe3ΉυŠCS³“ήΩy ˜XΔ/ϊ{QHKi•ƒž 'Ύ*Ό^+β$M<)Nέd—ΞΞ4φ`&Wΰ°yΐqu’‚Š(ΆEΠΨ.B8z ΅n’ސΙιœ‹ŽΣ0•c`ξHU0όσβͺ«΅Νπ™R+΅τ΄<τ8Ί,νΈβ° ’R¨bzˆ—^!d6–΅΅†UΖυ‹,\˜?;±?;~Πaώ¬{ZΐζR'κΨqΠζLΪ#=ώ=ζ7gΩIE^Ε€§ΐ«Χ―mIύͺ{j"Λ‹&ŸL:$„ηά0ηζπ°cκύΓξΡQΏ#9ΔοjF§ϋڜλ>9<κ½zΊŸ Δ/rqφm~ΠΈ¨6zq>—Νύψ”`ο{+ΤZ±‘©κv+Ί Ώ1…Θ\Λ΅7cœ-ΌΑ-|/ۈqW}©†Q2C@{|εύ±Μ€MΞ€/xόͺιQt6^gΆΧ1&·―*&Ϋχ˜Όω Δ$ϋA²ρφ¦uψ MediaWiki mediawiki wikipediawikitext.html.mediawikisrc_tag_after_lang"((")((\s+[^\"]+(="[^\"]+")?)*)(>))src_tag_before_lang/((<)(source|syntaxhighlight)[ \t]+(lang)(=)("))εxΪν]ΛwΣH—„W§iϊAΣτ‹nCxH v @wcn“H>'@ΣvΒ§ΨJ,bKnIςEιΥ<6³™sζœYΜ¬f=«9gv3ΒΜv–³žΏbͺJͺRUY%•Ψ‡ ©κVΥ­ί½Uuλ‘+wΘ}\G5Σ2Ÿ­6­ΪΖ³K?Δώ’ˆ.c’}1D“˜h ΡL4Ctˆ!Ί†‰Ζύ€‰Εύˆ‰Χ“D c½ΡnˆΨ)r‚έΑυΛxr’ύˆ=ΙC9z"¦£rτDbΙΡα“£'rόXŽžˆτ9z"έOεθΒτŸΙΡ_ΗτΗ₯ԁΐΉTφ“DNΘΡuψBŽžπsRŽž¨Γ—rτDΎ’£'κπ΅=Q‡oδθ‰:|+GOΤα”=Q‡ο€Τΐω½TφWˆ:dδθ‰:œ–£'κpFŽžπ?*GOΤα¬=Q‡srτDΞΛΡuΈ GOΤA‘£'κ J©gL*ϋ«DΖ₯²'h^”"'`f₯Θ –9)rε„9AςΧ?3δn«Π—“(Iλ˜L’$νβJ%iW“(‰°―%QΉύDIDφc%‘ΦOI”DPΧΉΎ¦4\½υ¬―¦α ΄i8”©”ο5%‘̍˜†ΠΆυgN[«ιυ°€›\! 7Μg ΨvSsu'L<Ε™~βšΥjι¦KΡέβL(Ÿi˜”=]ӐΚύ,¦! WΣU»-¦!J6-¦!κ5\Y+Ωq7›zX±R ©Ωΰz,Šˆdu7ŽŠδu/ŽŠΰ4Γ!ϊ%†ˆ y?†ˆΐ9CDπ|CDZκ| i€ 1D€}>Œ!"έηŸ‚λ‰"ƒWβ²1‘Σ’1‘Δ’1‘Θ# b"™ΗΔDBO$ˆ‰€~• &{*AL$χ›1‘`%RΜΆJ·j ‘Ψr ‘ΤJd§ˆ{Ο°Δgρt€Π?W<%φ¬₯&ŽΥ‚λa븚νβθΥΰŠ'ύ¨cΗ‘΅ΰϊ1š˜¬\GX20Τa =Έ~ΝPD T8ΕWy~ΐΑtλΑυ”€Ž˜p’FpΕ x@Βρβ‡aϊηβ† JΗ±Α/Ά@eΓqΝΰŠΧZΪΊQ{φ²λ$σ—œ¦ΙI )4Ž΄8εc΄΅ΉnβΘίΉzcΰpΌ\sρΟښ­΅tW·I-L\ρBΆI΅–³υΊaλ57Χ7ΪKcΘρ²ϊα‡ͺΙν ββΚύŠ.ΧΥΦsŽΥ±kzXς>Š˜3εζ„ͺtZMUΉ₯’|‡Ήπυ[Ύ ZΣ¨ΓΖ–΅ŸK3FλΩfΞXrIyn‡wP*“πk’eφF§kθZέ0Χs—Y`h†i΄7θ,±ήMm]ή:cJ‘•?«v1Θ–Y …ί ‡“;βpς5pxeG^y ^έ‡W_‡ΧvΔᡝpˆSœ`SΐA*ΊΏ:(`nM¦cF%_¨ŒŽ-η a³OΠί|Η²gΉ έΞ9m½fhMΏ‘Ζ‡Χ‡’N₯pΏ₯΄7έ†eͺŠrόUρΚJυΜςΈ2uΖΏ9£Τ1Ψ{†Υ9(¨ΞI2xΩP.Ώw,W―‹{N™~ο+Ο³½­*(*υ>J<Δ₯ΑsηvΗ¬Ή ;ΉΠξAΉ¬κ놙ƒΩΠ i©|ΐΘ/―) “ξiβώ9ƒ;^ŠSžk/4§fmwšπΟΐ³TjΤΣD}ŒA―+Z ζ1Pϋτp‘ΐ@»έΤψ§6z΄Υœφχ4qΟEγ^·œξiβ>ΑΰN ϋšΣΠμΚ§ ύ₯h•―΅Έ§Šϋƒϋ8Α½i=οΨϊϋ4±P σΞ ›Oχ£ ξd6U ž&κEΊέΤΜυτiBŒWBY·°§ ϋΗΡckCs6τfs€}šΨΒ`ΟU’Λπiit7Ώn[Φ‹ΝτiB=FR‡^ OωγΡ½ Ψ&L_Sώ<™B5;ƒ^>UάΏˆVψ–Ά1X3Hψ“ΡΓkKs›Ϊκϊ4‘2Zη­Υηƒ}ΨTj(±jZk0‹Jω―£{›ΆζΤ΄τ©BMtoΣλeΰΣώ[xbRΆS>UάO1Έ“Uy{€zš¨=ΆΪšΡμB₯Š|&Ίƒ·;«ƒe²T?­ςΠ€¬€Šό™h•_՜Ζψ4Š΄iœίΆdͺΈŸVxw|ΚΐŸ‹Vx·6ΐ=UάΟGγώj°P“.ξ’;šΝΑ YΚΐ+ πʄI Oy5ωΚ x€|šΘ3Θγι”‚<ψοθ{Ξ¦ιj―ˆ“ ρΔϋρΠS…xό{w9ΐ³>š\ΌnΦQα‘žΖθ*λζ ΓΆLθ…#§·Vυz(œVqΘήy 8 ’197ϊα7•ΒΤΝ ‘tB¬? μΉκ‡Ψί~nΤs_Y?Ξ²γα»ξψ7ίγΙ|ϋηίCήOrΌριπ†ξwΗγβαΏLπŸΎΟ%ςMu°Ÿ²\ΧSβ/ΟΙ-Τ?Α,l‘At:άγ#¦-ΰώ|"χλVΘωg,η *ΏζτΈχφœ‘ΆOŸxΡόΈ€%‘x5dώs–y™ηxξoϊΦv §PΫƒθtΈΗ‚*ΰ~2‘{WεΒrθPdX‹οΨZpdιΤOί½<03„½<ŒK‡οΏβψμ]ϋαΉH‘φ£Θt8ΗύJ±oΔ›Mˆ8ŒK‡oό|IΐχΕDΎαΑΌ5£I4_²Μ‚tj€ίhΎΥwΏγŸpφ;At:άc—Ώ'ϋΦxxHL¨ρ(2Ξ±Γή¦€s5™sxΚ*dύΗ:ŠM‡χIWο]gόsJβΉ“χΨΕπ‘Ύuυκ ŠL‡sμμψοϊξ%ۍΆ°—„qιπ]N£€οδΩ‡-œ}Ψ)ρόsxJΐs²ύώάΪοΟӚηύ5.Gΐu.ιΞκf2 Ήšƒ<$I§x4ύΈοŠX΅P™ηΨ+υίφέ«£ΓΒ^ݏM‡wμ½ϊ_ϊη½ΑΜόxήιΝϋ8^{οΑΖ―°g„qιπΝ»ο]Σ]†qNΣέt8‡v—Τμ`ίW;ŒKvμηό’φd³ΝC_ΡφgΆ‚tj€ύ©_ξ[q6λ‘SœΝτŒGμά}\ΐω9μΡ&ΐͺζ”υώ}„(Ίtκƒ „Cύ75‘q“ΟΨYηΗσ>N6Ό;ꎹaZ/Ν¨νŸ.Υ}1Θ?$―Ρ>h―ΛάΊG–¬xλ@&’k:Π «ς WŠ&zུ›}¦š#žgh©­"aύ›ξ»[―[ΞͺζΦΒn€Sƒƒœ­ΕΧ yΦQΟ:jiΩλx7μŸϋΦfΙχxW7.ζOό=n°ΦԐΫΡ>ΗχpT—2aΪΏ“ΔόΦ6^θη·Ά»SΨ1ΟX@xAζΔήs?a‡Ύσ 'ΉσbP.ρ’λ-5/»Qμ"’Ψ9ΫIΞ:CgmλkΊ­›°Ή[¦ eι’ύŽ12)ε$Wδ!Ζ^6ϊ)κL’;a2ΦaΏΘ. ‘F_uρO%ƒ~‚=L:ΐ>ϋ -œιΆξŸ2ΈϋΙ˜ΗcΖχ,`_,ιΠgο]ΜN!‚Ξt]πΪ›,ΎΓt²Ο|ϊχcτΓΆΞ όΈŠRΉ³Ά 6O½Κ¬±άΦA/›WΥ‚RY©VͺΛU―j.w4‰―1™…ϊ1ι˜u°Ηc˜pGάάϋω '1Αv¬ϊ¬—Μ\̩ĚՀOς€(rΌ0Ÿ€‰:*ϊ­xt„Αψ -ψM΄n­€³’ϊ,αΥ¨κ%Gζ{^0m£­'Χφϊΰ'ύΩΌd&HUΣ£XŽώ`Π9VLθ³<” ŽL«fΦ °qΌ’ ν¨ Πʍό²ΪΫWu¨žβC’af–χnΌΞΖεΕ)#•γΑQX|Ζ―ΐV*+£cωΛ‚$―| ӈηΣS7Ό|²ž¨q΅ΡοhΝ¬c¬›Ιsƒ—θωx‰‚~©£K4‰C΄I’!ψ •­½τMO‰b? Ti%“$‡έ+ω(₯°δξΆ“T8>\|1(™]~LΔ;›γΑ­˜nθζιl—ˆΏεl˜hΈΙ ―˜ΣΦ³ψkŒYΛΞNΟ—Š<'Γ4οΜ‡ύ 8ε Q4γΜΘώ·Wκμ#+™ε±%£ΈNkΥΫ―ΊσΦΰΗ ΑŠ γίy«– Ζu$γ)6\Άρšϊšλω―gZ¦Ž’ΐτ\‡γ†ηtVΑ_ΔΉVΫƒσχ,ΌiυzfζΊVΛφοQκΚ₯μuΠ/”W5|hΏB‘p$šΑ+ …!ZΣejMΝq¨ T9ΕΗ ;fτd‡Ρ— 7τMψQKdΘΪV3̚eƒuΧ   ϊuAPβ±[M 4mέ_u!" d_θΆk0l z3ƒγj L³Σm°`ƒu΄ξR‹ ‡ΉΤγ‚π»ΪE‡cό…Ββ—Ε…x:Tέ0ω\ς³±H°Eτ”ΩQ$ν‡\Ϊ3<Ϋ~΅!i–My”K9š ;ͺ²Ι‘ςXOWsœ,j‰a|ΣS⊎HvaXg”κςΦδvςΘ}Šξ)aSφ?[›ΣΜΝ(3ŸΆq—“ϋ‡šΦ†χΩn³1 ψyH ;Α»g ~Φρ]»θƒ°|x{(bπ†6&ϋ)ΘΣ4‚HΡPΣΓgl!sς#`ςT­zΫΠόW•<©… ψ)…ΡLfΝΆZ/γZ`„ͺ¬l/©™θ€‚t4@»½-" hkMΛ€™U[«m裎tΟgχχ£@Γύ–NΚ΅V½ Ϊ3Οi·€φΗι†πνΌPφ=Ψ£`:ΌάΓχ<9ΦΩΎo?« ΰWυϊΔ…“ίζλζ™F šB±vΑr„nrΥ$sΉ-θλΓ–ΐΜ¨ˆ’exŽNΙπv‰»+ΘΨΎiH8IX΅šυ\χ!†e2‹ΌpαΒn}LΆ§ε6† Œ¨ZΧ…\ƒ‰ι…ΚΚ…eυp?Κ 1Ψ…‹>Ÿ±>Ÿ± *`Ώ·:IννξΫ/¨@?o‹vΜd?Ύχk(zUΩ΄PœREeΦ¬ήKuϋφούŠνrŸσ&ͺ|.±Κ“;έJbz?0Ψσa[υΖ»-τοΩϊ‡†ζ;]λ―ΨZΓuΓwΊΎ‘Zξ[VYΗέ«tƒϊwΥΰΫ[>Ό&― ΒΧίr³αlΕt‚}‘=θ‰+cΜKDs©“‘6‚Δάο ρϋΞq’ οa#.­*Ώ/&œ¨ώοΆ 'ͺυ»jΒυ€εο  ·«υ?πφΥΏWƒCdXΌϋkpŸ³eΞJ mwRϋ ^UbΧοJδ˜˜"Žk΅³u½i΄ xΖ—+:δυ:)slVMUΞ\X.¨ŠRΘη `}=Vqπ γ§ΌΚ­3pΑv,Ο. ZΑ)3Xœζ‚n΅γκΤ&§πHε8‹΄_* aέJΘΒηͺ¦7›Α)\GƟeŒH•±ΠΒ]š2VͺnfyLɍ©J‘•?« •Αo΄ [ΛΕ8νdΖη…w_hΆR΄5xΚ*$jIΑ†MD 1‚ ~YΑQR–#Ϋz)VwκtyY žq­z@Η«YΨΪ<ψ|ΪεyήιΣ;l|P’1ά EοΙ-σή”F/1Ϊ‘#NΘτ(x·$„υe« ―Yιm†ϊκπя[¬€B–Γή$±cΎΧ{σ@£ζ!Ρ/μvώ"ΠhDlί–wΐ₯NQ G >σ;)Ο?”)x[™λΎ#r‡cƒ·}q0\LyHεΰT™cΚ©hμβΫI¦«Τ[mθ#­3γσθ_ƒf¦L?*—KσKOKΕ²ά?X˜_ΊΗ<\fžζ‹J]wKσLXρφνrιq‡ΝŸR·“δ~α LgΌ4ήί[xD˜{R*έ§i—ŠfΌΉ…ιβͺΊσ«ή^¦ξQ)μ#d> ρYχ ίψf2(2ΓΒΜΓ豋ξ³$6`uqv©„’-–ʏKεΰ‚BffΛŠεϋπZš^š]˜GO‹ΣεΩ‡K‹ F‹KOηJθ.€€\tή4`<Ξηο>*ή-eθο!™ΙΠΝβμo₯ΰS{Λ K~s₯Η₯9MBJΏ>œ-?AΣΕΕιβΜμόέEPΏι"0ΝΒβQζψ ’/dθΗI*!Μ?_¦ ©Gφ@F=Βef‹ηŠO—f—ζ`ύfJwŠζ–ΚKμΣύΣ0`ΊΈTΊ»P~κ“eΌωGn—Κ wPδ©X^šž£ξΜO₯™Ω₯πιρlιIψY₯2šy0;O=€—I&Ν<ζˆH †€? @ΏΌπθ‘>”σ‹Τ=Π§Ε‡ΕιRΎZΟxwΝΝΑ\ς‰‚ΫΫΕΕυΈψθ6ϋτ P*$ΐ‚ Y*Ξέ§Λ =€3R*@Άρ“_Ÿ<)"$Αh“XyΚxΥӞι佦U=ΌέΜ{k¦SΣLΛ4H°ΡΤۚΫΘ{ΰQ7kV]Ο{šYkXvπ”ρόcΏf§•χFλ ΗτŸΑƒƒ@I5ψ·fΨˆιΤΰŸρΪZž°ΞΓtΰ܁5Pό:°qntΈX”χ Δ‚%”ΌΧrΦMpq:«0GG[Σύی7 ½w΄uPκh`Œιp¦lyωeψŸ-m^@ΗΪσΔΌ: lžνe`G)ΥmxΚŽyΫ τ|£\β”Λ~‚œ+‚sΉˆA)„ρ)]τή~Γc§Y3Θ7 W‘Ί3 ή‹ή’ ΓMA8γ; Ÿ‡…L$ΆͺΫUxb―-=΅^ƒΫΠQ6ƒθχE8OVύ7Υͺ/«Ydqͺjΐ<œ0Σ$0£Y m―w.:Κ1±ιNΜΟρ”;Ξ½>|ΫΖρ_·‰€B`ώyH`έ05&žΕΓΌWu”Σ±m μ}j“WΟo5ρ“†@ιϊέώŠBk_‚ΒσΘ§§hβY‚ψ%G-Žψ(pœŠ‘*£ψlrosFΠΫEŸyŽβ“ύα“}™‚rSU:π=·ΤΔΖΈ›ΗΖΔ_Έξ£TQ­Y™βΒejλς6zΫpej97―Β $4$J„ΫkθZ. 'I\νr5ΩΝΥδλβjXΘΥ•nΌ.ΉΊΪΝΥΥΧΕΥA!WΧΊΉΊφΊΈbύq‘…ΗμΦΥ‹Ϋ•LΥλŽ>US-ΰ Ύ€›—£ΓΖ΅μΘaΰ©ga*_@―μζ jbyxHΠQ― Β„3oΝ τΓΘΨ» œΦE―βΙ}kJ€LG†b”€‰ΔΒcm)‚ο5«ΊZYΉ΅μ‚+ωe›7δ«Έξ„sΪ¬ΫΝΟιfε»²BXJΉα8#ζG°αΥ{J^ί ΐ%;Πw"άXρΡΈ½ŸΎaD@]+Ψ{ν2J„ΧU―OhΌή[WO"¬1X©|#D«t7₯ϊKphP• bδΑ‡Π9L &b3?ό6α͏ί ™ΜΛώ‡ϊdρ° ϋuK˜„-οΘ!‘>F+#yΊυ €Ήg€)jγ?0mό Zη€ΠΪτŠπχγΰΧ5‹Βμ­€EΫ±Q’§Tς¨‘άπεGΗ’ŠΙΒζ‘ιΕ[“hΚ™6œzeW³%VΞςq€1‹&ΔϋTν«U“'Η7ιȝN‚wΜΝΤnrΓ(ν~(‘[q3«gxcβΌRΡ²)fC>zΌΡJp}o΄μZ1{μ9άΊϋ¨5ΐΊG ξ QxfƒLgωΓWQN”΄V,Ωkf=w„Ξz„ φππ§*l]ΊθoXύ‘|RGΰMξσe]£3αR5r-+ΫΜMΌYΧ#½‘ΰQς[Hΰξ˜h.σ‘Ϋθ-‘σ«Gem ΒAΈ-Χϋh ̊α?aΉ"#ΥJ΅’Š<„Xmέd=„(θDJΰς₯AΝ‹δ―εbu—Θs t ·υ=—H –RnHD^9M=Jϊ.f„FMο~%Ιq:6β8uQFΒΞtkKsϊ!JΩ^Ζ›A)π6OA²Λά—=τ€VρΌΟ@#΄Η™α„žDΛPχ{sxί Tέ_^ρξΞDd&ΕϊžΙ©ΘΘιη}R O(§ΌοHθΞκ^Ζ΅2N§έΆuΗρ›`Ζ²35Πν[φ&‘’Tq5ο7Ηε1μzešaΆΖ£@ όσ»cu ζ)Θ(T£Ga:μ˜Ξ‘+wH E…聾F’WΚ{σŸΓΠ’K]0žY„'tIˆρ”u`tV0¦½l€<ηΝ–ŸάτοχȎϋ―ύΧNύβήfΪ4 ¨ηKxH£>ž­ζΐΟΔ„ΧŒ¦kεΥJ6sυeξβηΖ' SηGΥΧ΄γu™φΘ³WU#Ύήέ^ƒDυžaκ}‰Τ[ΆΚU₯ *έ7WΓRΖςΰ쟑αω…₯…iοΞByΊoΰίό:‰η[τζKO‚ΫΉΩωϋ ²+ΰnqnT~κέ›™)Αcv ,86 .KeσE‡ Γ°₯ioq©nKσ3ήμόLιWθ_AψμtΉδŸΰ„‡‹nΟήU}G•.=πnq³2^z<χ%΄VpaV;ʌ’:5‚νΏ([0ιυ*Ωƒ1q`ŽΡiΌΚ-jDμg Sx'[Tπ¦ΰγΔκ;|7•U¬>Yΐ|₯ΧzήΠ f’ όΒTΰKΆ†§·Β JΊ»y"'ΩχΝε]}ΑJΕύ8Y:žΒυ^–εS£l:{™σ η_°œ»O {«υ½\‡y¦ίr]±ξ9-°Œέ>οεš,059Ν5„Άfzk`σκΖ‹τ;‡ͺ“bΧπAdœEfq eααI€kλzϊΨτε&E”ώΔ t’E L—ήmΉΛΰπ)‹ƒοž0΅ζί»WDQ-ξ1΅Θπ΅0ΜZ³zεΰj™ΝΝ½ά§Ν2΅ωŠλνP5«j―]†Ϋ·Xƒ…³Ώι€ΧiΙ—V^£%ΏΘόZςKLވ%Ώ7ΊίGq’|μψΗLή&;ώ ΓωΫiΗΚΤαmΆγŸ25ΨρCCΏ1ˆΌΏjeˆΚ»―γ‘»‘- WγΖf΄ΒΪ»Λ“κ,³§ˆ α«Ά[ΛΥ- θ-όͺν KƒΒ‹›Όa ˆεί΄|Ε/έB?ΩπνP±oCiΐ—£ΠωAγPπΆΊ Υω’ ~€fœˆ¦€qοΆβ ½FBKv"‹•κ6ΤSΈιˆΎθ…žα°"ΰ9˜"<γ2π sΌBp‹³wZ§ιήWDŠ>Ž%ύ]ƒ»%1‘3CMemInfomeminfosource.meminfo§xΪ…PK Β0MZѝ{]»h+ζΩx΅%hΤ I M-^£'Άθ€Δ‘βƒπ σ>Γ€δƒ)pUi‘LGΎ1¦΅Ξ‡1žΗΦ8%γ ‘ŸBφΤ3mγŽ’i©•9ΫXρρέ?ΡxΕE ΰ2Ϋ•ό°ΞχmΑϋ—±"ΟΆš―ς!7A%ά䳡ξΔ¬ΏJϊ6ύ/6.Γfή)sAϊ‡Έ7ς}π Κ0SNSISnsinshbnsibnshnsdinc source.nsis definitions\$\{[\!\w\.:\^-]+\}dollar\${2}\w*escaped\$\\.language\$\([\!\w\.:\^-]+\)uservar \$\w[\w\.]*variable(?i)\$(\{__DATE__\}|\{__FILE__\}|\{__FILEDIR__\}|\{__LINE__\}|\{__TIME__\}|\{__TIMESTAMP__\}|ADMINTOOLS|APPDATA|CDBURN_AREA|CMDLINE|COMMONFILES|COOKIES|DESKTOP|DOCUMENTS|EXEDIR|EXEFILE|EXEPATH|FAVORITES|FONTS|HISTORY|HWNDPARENT|INSTDIR|INTERNET_CACHE|LANGUAGE|LOCALAPPDATA|MUSIC|NETHOOD|NSIS_MAX_STRLEN|NSIS_VERSION|NSISDIR|OUTDIR|PICTURES|PLUGINSDIR|PRINTHOOD|PROFILE|PROGRAMFILES(32|64)?|QUICKLAUNCH|RECENT|RESOURCES_LOCALIZED|RESOURCES|SENDTO|SMPROGRAMS|SMSTARTUP|STARTMENU|SYSDIR|TEMP|TEMPLATES|VIDEOS|WINDIR)ϊxΪνZύrγΖ‘_Ε—ψκξκ>œϋόγRqμJ@o­Ό»ήl֎c €" PΖά(1$Q’dσω'―“χΘλδΧ3„${³N%©ΚΚ^Lwc¦§§§»§§Α7οΙΏQν;aš₯§«0NOώξήφί-}Υ}vξξσΈξσ­»ϋ|PχyC΅ίQν©x_ΏύΥΎΩΌ-Κ0/λΧίξtkύNgh-π©Ά(σ8]μώΊΚJνFYu–°έ΄ˆ‹{­oΆΥQsψACΨι(¬Ζ¨Ϊu•ΞΚ*,γ,ݍΨΡWλ˜HhΈοΤ›š¨ ŽΛ\½–ΠDτΆP $]HΧΰv‹igYΔΈœ~;@6΄zLCq»ΑZ\Z‹πΗIͺ€ς…# ξ¨|žβλ‘Ej―΄# ±6ͺfeMŠsŠ3V9œ€Αu§ ,½―ΖdφΠξ;ͺ’2n$[ Όh–ί?ϋεUΒzΣ³ξw“sv΅Αqί½BLξu2ΣϊHΥΜ4Β½JΉΠ6ΆŸgΥz QοI{ζ₯DZ2ό―ja qy΅KAe·£»ςόΎ+yπuή “Pκμ  ”ŽlmA]€W™ί՘Jΐ¨ΞΖ!e-zvŽ»π’ ΛλUρE,Qu.O‡ εΆJν#%Ι…²T`erVcj2΄λPΨ,Οxλ‰ œ3œΓΟ—QΞΧyΈX…Ό[‚P*ᜭ89Η‰DY ώ­…pU i9¦<£°[ Υ5αœaΡRΰ[Ϋ½υΌwο†ξβ9MΟSΩ౉ PΌa „ΐΒβykΞμΜ G.σ,ιΞϊVwΦΝύιGψosΏ+|!ƒέYE—ΝΏͺφ³·?ώδΕήΟψǟπω'5‹οwΧΏfyˆ‹]—‘ξΈΈι?QίΙΟ„χ”90YΪZί;έ‚@S₯ΐΙ€›^ΊKcξ¬4HΆσT—Νۊ{χk‹Q]Ξ³-ΞZ•Nw{{³ϊfYπšReΆͺ±¨ΉR*‚΄$Ί|*B"ΣCed8ΦζqΎ‚­€ι, WΡΣ'*u’„Θψμ‹4ΟΩηρϊ1ŸΙ‹ ŸS2Κ—ˆx,–H†`H°adlƒ8Ν-«ω VŠ3=aσ’'ΘΦ²4ΉβΙηπ’”‘«Q˜J)Œ§YΎΒ₯&ΝΚ'[%o yμΚ&ΙœΞcΑ¦DbWbɘ'§sζΡCzώ„Οθq„ωB~ωμι-„–ΉZ\žΔg­ϊώv8–^ΦyΔž;»T½±΅K}O?°ŽpΥ€g?ΨžfA}ζ ΄;κTψU$ΛJi“> όέΒ}ͺa†„β©”XˆΦB­ύƒ@Mζb9ϋ„ωf€9Μ}ϝ8ΐoδϊ’'©Ÿζ ‹†&j@±U6Zec…ώœΰiΪ6F`žά?&C7©υάc¬Ώ?±ƒEά‰tM@bΈEPs)‹nLψ›ωm=vZܟΎ/\wΰυ‘ͺ‘Γ|a#cμ ΄2ΧΡ'ΠψˆΛ5{tώŒ›N`›J+H–κ:Ίπ<_y¦ρχmw€Ζν[ΖY οΊψP z•ά8œš…=ΣΗθvŸΓ.{&ͺμ:|¨'@Ν?Ψ‚‘+x…yQγχ]Ϋ‚!ζ‘Ι₯΄ΐю8ΆΫτΔΆ…˜χ _άοqΠχ΅ι^·ζό―ξœ(`’V0λΞς‡{υ'«(oιΙOW_hƒ0MYδρJ€Ζ”N—΄>#/˜ΈQΊŒn…¬‘ zΑUΖK­ΧΉŽΚΊ˜,nŠ~ν{“+ΤPΤ->ω Β±BQšWy9ΥΏΉΈ^S–ί£ ε±9nίKqa₯kVΡϋ끁ίψss :ϊψ·ΫυR’fΝ5'+E‚¬’θ‘‚ΞBT΄‘ν1€?α?ζ&ςτ ;sœŠ:τ<ĝ™6)αΗK,=¨γ Ž ‹yΈ¬rq—³eκŒKΝΘ8*`ЁšβεJ†šΎŠPC*΅`ΙRPTcgΩΊ3­›ί\ΖΦdŠͺΌ²ύ;μjΔθ£N¦Υ7&ƒ,šjGHήP‘@$d+„T,R={―.ΛoοEd€ MΧιαΛΛ³|ϊ=aœΪΟ3d‡τίIVRP™AΩΈbiT oq \υ8U κλi}'#r#‡mhΔ70Νίά± ­_j6C²ΙGYQφP\νA½ω²]ΊΗR¨ύ„?γΘ ?ό1πόπ‘φφϊLσ#j„ΣΪδNπ„Λ„ρdά#>…Sͺθεί@ϋΙb£XΓ»ύ=B@Ku)&ΕZθs„FŸΐφΔwό¬wΫn‰[)Oή,ύ½o €q—nUύ@z'¨|ϋ“w Z^• τWŸόoκγολ_BΌώ%Δ_σ—/Kgν«? ~utΖP"»ρ‘Ώύvξ?ϊ‹ΝΏs+χ_ύΕζίώqΕΏΧάΚίι풐΅ϊθέή4έΫιT“κŸg$8Τδ/v:ς½Βο<Ν †ήŸΎχ΅Šψ&ΈKΝΔΔ.‘nginxconf.erbconf nginx.conf mime.typesfastcgi_params scgi_params uwsgi_params source.nginxjxΪν\λo·—βΌœΨy9qœ·,ΫΡιd,Λvn ΄h‘EQ-P Ze±·Λ»[hoΉYξΚ:g“~oϋ±`†ύή!Ή|ή.oεœ“ΆΉβ#‡sœίpHΞpHεΑ\ͺΏo)Nύi§ώ¬™Ÿž}Α³^_nΰ‘=γ`’=]p0έLΟ:˜Σs¦{‚ιyΣ}Ατ‚ƒι`zΡΑτ‰`Ίθ`ϊT0½δ`ϊL0½άn9L—Ϊ;Ί+­rΩΑ$­ςŠƒIŠ{ΥΑ$­ςšƒIZεu“΄Κ&i•+&i•7L*o9˜€UΆ[EŽΐΫνH«\s0I«Όγ`’VyΧΑ$1½η`’VyίΑ$­ςƒIZεC“΄ΚG&i• “΄Κυv«Hε6Ϋ;Ί'­rΓΑ$­rΣΑ$­rΛΑ$­ς±ƒIίr0I«τL*ΫνΓ$;κ·σΘ~vΪy€qo·σHΫξΆσHΣ¬ ŠσœI‰ˆra{..iΈ;–Oπ™,ΡΊo9ί'E’ωεšτŸXsΑ’υžεNƒ<†‰bΈ_?¨ΏΧ­ε?EE0qZ ³b€NQZA:ŽΣ³5νΒω²¨xߚ€υZψΊ΅u'E‘=%yb ΘΚ4,Κ ˆq:ˆΠ(NcV#Υ*WτσΠ-φήJμJμJμJ쓉½Φ΄+³ ‘ΥΆΈ»»[_mΪ(¦ACττμ“lχ!ŠΒ†[gγ‚μC πn ϊφfβι"ΝA§h–Σ!ΚwIάΨι ϊ‡Ϋ€gZ έpA2=›έΕsσΘѝen56 5ήjTγ@.`ΐš‰‹Ω ¦ΘαΝ›ι·)"σ9Y<+–Ηΐ’θTξ-œΚBε4{„σˆ‰Οqβ–zې*]ό7 ·Ω]ƒγί n )N+”žV–c?Γ1l„Κsœϋ Wq&e„*sψ£8AΥ4 ΰvό,Η!"€Κβ¨"$ρ…Žͺ"žBcŽNJ:ŽU +ΌO€f₯ŒX41΄,qnΤYΏˆBžΔΣΈπCœ#‹”bΘ$Β&Ÿ‘4‚%Εΰۏβ…0;fΫήp‘eήΆ,ΓŸ"·mΖK q†(+όi Σ«+~„’`V;Ψ?₯b`ΐ"tšα$ρΑΓ§cQη>ͺBzεδλ•H²ΦΥΊqZ&Eμs‘U^ΐΐΠΑIq]Ζ°οŽόH°[Τ‘bŽ6ΓNpQ«J£Jθ€Λψήjί)ŽJˆ›μ[ό¦Ρ6bΞ΅­gΥhΗΈ ’8 U8)ΣωE€d8Qb6-Β$ ώG3?NΩ€φqšΜμΗωΓr?79 #ƒ^ iζgA11©°$pYΪόΈ‘ΊΕβŸgΌΞ*GΦ*N8"τŒνΣ­―ͺΧ‹8ƒ=±ŠG>Œn<Ša@@­(°έεiT'e0b§– ‘±½FH%G0ΕΜ–$ΘΗ0ρT‚6ΆΡ›xΌ’а €x ΐ΄₯ή:Βiu*ΩͺR I {O ›Ραp™F¬FΚa ­š’Φ³5«δhDηm…acΰζƒp‚μΊΟŒΜ‘§0JΊ!Ω §0&PXΑ瑌Oέ l‹8/θ$Κ·H‹‘-q ”9‘γ©l + ΩP£‚)G‘Bί$Ψ dAQŽqQπad4ί~BvEΙE+lσΤ@λeΊ˜? Θ„ΝI†pΎiX†'¨0Z |‚RRaVγ»/g%X₯ΘglPF’ήFF…iD7|BqΠn‘UΎ š—c5It¬C“Φe‹Ί±h‹2Ÿύ4mPΖYoν=ή…€‚ď3”γi%*rNH _U]χ;¦ύΖ p—o2ν@7Φl4ιly€¨k" vϊη @·4@e“ qX©"]§9›M]PΊ‘”½»‘>o ύΤ@ QUDέΏ(Αζ[Ÿ€ŠHcΟ„Π.ΰw»‚睻±Ώ``†= Ή#Λρ#ΘYuώް‰ΰL$“Yε<]TΪι€Rέ­[‘ …>S ΡΌ ¬Αͺώ†}!«h|“Η‹£X#Ο:ˆκς ΧΊ‘_4 Ώͺ CpQΜό11–6=d—nH/ώςŒ„4‚³@8Žύ!Μ±JV΄ΘΖ€YηΨ¨ωΥ’°PΚ$At‚#bS…‹6Ι@’/U[wά’Ζέͺτ‚ΞΧ¬¨Mθα[²β€h:—QP0Ÿo·ρ_­S|Ψ! Ž6DuP,~d†1x)ΆΖ+…“ͺ/ŽΚ’šAFP―bTlπŒ&b`6·Ψ €Θhn¨D¨`+eΔ’˜%RΫΒhŒ°’τˆgΤ|ξ"$QΨΛ[“uΧξπ²±.ͺ59FΈ ”­NP 37ŒΛŒ3 Ζγ8«θ?r‘± $A3?UΒλ"Βg*‡Πx’Qθ*Jΰ‹ŽΥα(~'^a±/BΈΥ) θuΣϊρ’ δCν/M΅ι/ θ’ ‘PW-φ:kQCq+σͺ‘Μ5ΝΥF‘X’!dy“Ό^Δnd―Θ^VΘΨFΨΜv'0β‘Χ (w”ϊ‰Ύ¦Ι©zj+Ϊcœ"UΔηΌΦϊžήTJζΚ©3ΐ[ (υ>ZQι΅ΌVΙtϊΖ¨ί·A3x?rΪ»ωωžΆ¨˜`™L o„σiPπƒ<«ΛΓόςvqθΧ φMμ ±(Ν{{7~Ύϋη`χρέΟ‚{+c€UώŸΧΕπϊ£ N,t²š‹Ά“εEXL‚{AΏc,θ7ΥφΖ¦ΨΤ‘Σ M™²Ψ °>†½Qx Q§Λ„Μ„Ί!Ώg@~CA† ‰ΰ’ΉEΩ “Θ™’2£—ƒUٟ'œϋ€‡s£h6ϊ½ΝΑΞaοπgΧ=o{³ΪR•­ͺΧƒΪv]υˆzΣΨzγΉ„ηzͺ΄‘9)b'€4υHDONΥΫ•°REፈ™Ώ"σ™*¦"VŽ‹4嬈°"MΩ*b'§H[fŠ4€₯HcNŠ΄$€Θ|ς‰ *’ςPD&‘ˆ"Νι'š{"s‰'2—]"*…DζςGD&μ›œ;­Τ-«Aζ”>4fο΅Jy~Œ›ΣΌί ‘ή­ΪG΄4Wπ ]Bη•˜.@αι!Zbιώ:΄Όxzvcή00Sǜ°*!Κ ΈιM΄UηK—ψz±Y£I=§)KœM؜€εœw1η&.€uπΔqΒkΠΓm,—’S"X|“JHκυ€QδD—m–9Ί ž]o b~H«―z» Ίέ Ρό ν&X7 XG ½ŒΩ3ψς#L—’VgΧD•]}Χεμ “EΊ/Χeͺ\’εέ|ς~έΊέ4tϋ»ςnε#"ά[]Τό›N‘N―Y³]§σ9§•…“ΣIt©θuαζ šπs:‘¨FPžN§rWWS,_Η©Ί³γ”&og΄GRmΗΙ ―nΰOgς}«~·›±¦ac8ωώ!ΚrHu―¨Q ·Ψ@7Υ1#'ž±&1Χ¨•…o$mΊ4zJ­©««μvZa»ΧΒ-c-\•λ|Π‡)κ'eΰ³?ŠπȎγ5€Ψx~%Ϊt λΏ€AΞ 2o"νΎP¦uŒΏ(λ²eθςΊζӊrΘnJ²Ό+ ­S7¬žλs°ŽwΌ½£:QΉλ Ό:j?Θ››ν΅–eΎ¨•[6βOΒ‘xΕΖqοT8ώfφΑ·ή`qΉ’Ε`wτ9θΫƒ!` wΏέ†cΥ΄Ώ‡Η‹QWΝ3PL_±ες‰Œύ+qς”’–SΨτΓAGΉ}q`¨φΕ!ΓGρΗύ£α/N~3ύνψΛβδ“_GΏ<¦ΗΏ9Ψλ `Ο±0l ‘„G£ͺΘKz雀‰΄γʞ“ —4•m½ώߌΎωCXώ|•Ώ˜­Ό½z{¬LPŸδA™=7₯‹ΞgUρš’‡4’Z±"„ύ?¬δw+šq¨R Χ~p-WΙίK ‘ώπΌAίΫ¨ΌοΌ>όSyΧy ΎΊœ–UβYχΥ θέ<ߏη°ͺmαν5rl-όέΧ‚]o 8ηοAΤŸσ:‚©υΛz­Nimnimnimsnimble source.nimηxΪ΅Ym—ΣΖ^οζ…@ Πš–v +­±Ψ% N6. !};Ν99΄Ν©ΗqΗΨV4Ξh΄^—K?ττ¨Ώ¬w$l%Λ’Γz„ζκήηήΉo3zo+»ή{4βQ/€~Τ;|±UΌJhŽ4Mc6ž/‘Ιm― Κ9ν¬ Ί£‰ήXAτ‘&z³wΞθ­jšœΟΫΥ4kš3Υ4Ÿhšwͺiξjš³Υ4χ4ΝΉjšϋ/ŒΉšO_ΖΣ6θ₯σzφ‚‘}―K*€žώ™!€Ε.3―玨Π4ΥZdi6Ύg8ΠΑlty²H:1'JΒ>­ΨFN˜oιιΘ·84ύU#·œƒ.Ω³sΊ†!RΦl'‘+*}9ψ‘Ÿή. ή^|Yq,θ0€‹˜v1iŸ$N›<ϟn/έ‘έBθ5,iΊnv]ΡJtΘ„œ>»ψΌ…ΓΡαcΌžw›ΆζpS―W$}9uΈ1αP)…ίO$kE4dN¦Cj۝E鿞1RGCηΗ„Kζ9Oϊs˜«±½°D³ωόωδΒtAφ•U²_FnΓ0ηEΓΤεcΌ_ψF©ΐύE΅3iAWg£Πΐχ?ؐŽŠ$κJ\žΒB”a.¬ΥωžμwӟfΫ~ )ζUmRΫτΟrΣ^2¨.MσΙ‘Ί[Ν«ΦQ]”%ΟΗ΄$<\ΈU¬ίZπΎRχ\e ΡVϋψΑ†φ¨ε}vΞ›τω€τ_·€Wί0|א:.ΞΗ¦΅w6”™^{zU•₯΄[έ&‰›–Ω8Τ¦φχgγS6pα9.€ΰΒΉ³©›†Bu6ΑŒ—³IAΐΉ‚obTοvλ΄aδ¦*΅†ŸΕ<nާ±Uw••₯ «ˆ/”†ιDιj^ζqaÁ<ΟPYαDl’u…„u~ΞΝύ² 8ˆos¦·j™bš>2Αd""ƒχΰΟ]³”V3U0l–}JΩ oΐ£+\ΝN>ΙΩνΧ²“΄ŸTrQΝοδo9ΏΫ΅όN˜ΎKƒ*Ύy‘'dwΉέ«βš•ψV1Γy1έ_Ÿ_VΑKω™+~Ψϊ΄ΫΤLzο©*γϊ! °Ό&¬Ϊ’τanΡ½ZΆ4@“Vσκ±Αjχ©ϋ4Sw6φUΞοF-?Œf—ηΜNΏλ*+>l=¦­AχٝηšυυZΦ#vZν:dC•–{›κΜ§f¬EŸλzEφH‡ΔΦ“o}’{άnΟ³ώvEεy©MEIα0ϋ6ΒLΤ‹iΈxύF£ΩΫ35pšV;|pΓ&QΫΔ\Ή󸻈ΉRω›«•7Ψlͺϊ|A/Τ³—r6Qˆ…cά)΅ͺΊ‰[λ«•3›ƒ½šƒ]ZŠƒ%δ7ꐯ³ »«ρΎ–%Θ#τqΆκz„bg‘›‚Y³~ΝhΓ«˜Ό] ˜j«Ά?»^ΊΆ-βuzΔλXq»¦₯R^‡4I«ΫΦ³ΈPϊάΆ­ύΆ₯*ΆυΡΈϋ1έΉoΫ€ΌG]»m;OKΈZLψ38•Ξ¬J©WώΠΘ¨ήόώ …fuό?$UψξΓΡ]HA*€κ™‚h—ΈΡ$ΓHe`ZŽτΙ:H9v`υ^ ςήΖπvλΰqW.ϋv `VΎ°;‡G ΧΡΖ°φκ`υύˆŠ©λλ;ζ†xnΤα)_Α―λI‘0Π fΰGˆόsjqΓ(“9š€FΓ;jCό/rρΎά»Α±mMF,`“~πUΉχW³Ράɍͺ:3~EΒ8SHο—ΰpiΜ~bο@όa[|LٝλΩγj”˜αWζlΜκƒN¨/‘pχ)τ£OAΙσ#t‹<`§.KΐβBƒ` ‚ϊ¨LΆ©)¦0ωƒ©Ο―ή§VlΫ<κοχ*ΰΝG‹ρ_Δ%ΜώπpΚE5Ϋ<ύΤ`ψ˜‰t—Ση<`Τά3ώoTž'€Ζ€lBίΜ JHƒHύͺ=€ΥZύfRˆά•xs‚FOB΄ϊ˜ ‰ΊAβ1˜„Π?UΪυ`Hˆ^5–Χaρ(ΐ?€Έ[938‘λΰ’i€τμΈ¨υέΌYξ[θΎ`iB Θά†ΟΰsψπoΈ Βu m θχ<ΐύΊ=?€Ύ\eκςύš…γW=ͺ ‘s…ω _T?TWR;ˆŸL€άξ6o΅—Ώ2l―‘€GfBn“IvδΥ>žΙ~uw–Ί/ @9J; V-οjg¨0δ»C׈Ž!‹T9UΞΔwΠ°οQΰ‰D¦‚y0ρε(ύΑgkΈ°iέΧύκΏυ‰Ο ΰλ/{* pH"uCγ£˜;␢׈KpΕΎJS#vάΨI$“q6z|‘α#ωΓ|RŸ―—_υρΨΞT—―ϊϊ’RϊΘe…R–• ­•½!mVνΕΫb7ΰΡά$Τvάx6ŒTώqΥ«nμ‹e΄aΚ άμ '›ΠχIφv2{=ŸρΟ^͎K A§ ,d€&’λYHyτ§’α>*Kw*©yx€δ‘TΙ³l44ΆšΘ¦λ­¬‹sŒ™Gυ1κ5C.–3³«Τ»Œΐ~ˆMu‰Ω€€&ˆ(–FŠŠaΚVN€τ˜§._πJΒYΨΏ«8ƒMf©Τ7ŽΆΒ,ζ1©+ψK­Β%T 3”™ ΣΓNΈο½VΛ<ͺGΡyΨϊGWύΰ–«‡SkΕη_Έ’±JΥΞΌE/ˆ>^S4™¬!σ’!3UΉ(οσ5φ"«D©οPV.π·†ΐ|•1ΦZ™ϋTlΡ^sΎ@‘‰5ή,~Ωΰ³ϊNω‹ϋ΅/>ojS—Y’όHώ({ι8Ν6ι¦u·Ύ¨―kυ ”oPώ~ΚΤяΣζc­ς‰&VπλD}…Γών΅‘Ÿ/ΒώšwΙ>Zυ'π‰ 1Z>ΦAi]³F2 ΰ~ˆ±Ε0 βBχθ™ΧΧ¦KσΕU­q ϊΩCύNinjaninja source.ninjaΑxΪ΅“KNΓ0†ήH€„@,ΩΠEΓ#’,#UΉbƒΔ¦)‘“Έ­!±#Η‘ΊΧΰΌ8©:₯A­Pg‘ίςŒΏΙxΖ»­™)½˜ΰ χί­Ί-‰ικK鞠τkο–ύΚ›3@™vo+έQjΥ{»­εfηk9^;^ΟΆ«ύ-]ι₯½(υÎηF$MŽE ³Όψ Q₯ζEC‹ĐF¨ΘI…²$&h>‹TD3ˆ™ν‡ϊ†Ξ”ΎΓ―OBc‡°1€Fψ Τ Ω@…Ηf…²(6ώοYΖΊ1­§g('œFPΡ ³YyqVJSψΝΰ₯+ΫΉξx©ΫΆ}μiΔ₯bda βiι]ŽFXA­…ΜZΫJ3Ž#ΖA12N ‡£r©©%d~»‡Uk)O lNUXSžΏΊΦpku›§,ζxC)λν½ž°r”Δ’¨VΎ!ΰ G ‘ΘyXBΧžΡ έXΟνχ܁πΕ€{ϋ0΅‹χ’ΫΦBTΕΚfοωξ@ΏšφlHΦμTΏ½φαΣκpίΟ&SωyšwƒM:Wϊ(a.εΌβLL#IΣΥQ?}Fι3Nixnix source.nix xΪν\ Σ67+ƒ Ά1vqŒm΄”6—]]…ΒNΆΫ8ƈΞIάΦΓ±ƒ¨»―ρ~έWŽ-Y–%KN“Βϋ{—φW΅ςσH=—ξŽζ’ςœn;φšξϋΩ |Cνšv_]wj< tΛ[»π%ϋ9Εα4νMΓ5ύ”α€$ΓEΔπš$Γ%Δ0#Ιp1LΚΕƒgψjίX7mΣ7[νΊzΟP‘aύtD―ΕŽΗw()O ΨΣΛrΰ>ސεΐB|3)O29ΦWυΧH1‘£ΗˆŽΚΡc*$Γ*;AI‘Ωž―Ϋ>©N q‹§„Xυ§)1‘ρlθž9<δ!„Dt6CŽδ£vώσ8Ζφ‹΄γ3”ά|)ρ'IYa ƒΩ§γρcα}6?–ιY¦=1ψSΘ³,εœ4 vNšϋωΌ4 φσσΜΉ ³δγξBRΦΨ ›†ή7\΅g9ž‘HάvTέέH[@ΣVCΊ…mΣίΜΆQaζt‘γ&RΞ*%+6§oΈΣΦ­l―΅ςΌΨκεy±)4€dΨΎiΕΎœ“Ή*%s²…ΌΜ΅b™uWp‘ιE’%f6ηL9.Θr`ω^€ς‚˜Γ\OΫΌΔ£ΐm\ζQ`M\αQ`όœ²Tͺegaβ_“ς]‚8Ja#Γ„ 'Ζψ[RΎGΡ₯³9’όrΑбέγAs?’»O)›‘s#”cwυΎ sTΓέJ»}H©ΗBœλ‚±±r+Δ»AΉx>ΟA”›<)δ²/Δa&%ΪΥ2ΧΡ“Ώ)4-ΛΨΠ-τψ eπ™YI‰Άΐ`.€ ’mvEΣ:zfSmgςDδP σՊPϋξ;‘˜u»γSjΞq|Τ±OΉTٜQyIy‚I•νS]Ζ)zP±†ΚGΩΥH<ν’§Ϋ”π2ω"zFΕ½νMΣ7Ό!αΟ“%sΔ¬H^$εŽΒώ μ*cdΰ*&9ΐΰ!'©adΑΑΘ¨΄Δ#‘΅hΖΦlσΩkˆ'²:d³πΟ\1ž$ΐ²ΝW„ΝΧΝ{ΖΘw5δΔ A4ΙyQ7$79ψŒΐ±ρVZΝΆΎΈ‘>k*ΩΘAZd΄S°D;CVJ;W«9‘Β©ξ£pfxγ’6™’qэ>δtφλΒ}%@dlλΣD₯ :Υέ«NΊΓςŒFR» ΊUΈvιΘ±;–§¦Ή–€₯άΰρ›¬…3ώŒsUΐNu‚£αΩό™vcΤך`W ήTdU”kw’Γ*­€}5ƒ±€Πuθ ₯‡rπ'ΖσmΗνk£Δ₯ΘŽςβήο{d(ΪRzς˜„ΦΖΩ!²β“9eΊπj`7s1Ι@ώžNΕΙoΤ―ΑXj§6βΡBψ³Ω^mvͺ!˜;1Ω‹”¬viΒͺΨ™ίΙP\"jΡ—μͺέhu$::Ζ³·‡,5χ*τtF±₯»¦ή΅ ηΰiv0Пw"yWΩ«'LΒhονggMΫΘΨ ‰ζx†ΗDΊD#?£ΠεtLL–|EJOα…²¦ξϋ\ζ–˜ωƒΝmͺΡ6GΌχφ„I6ˆ3ΨFΞ”• ˜ς‡ΚΛΠ%$»°ZΧrzO\& ”8X*ξλΥΧͺ/Λ΄ad]Έηβ™va·©›–η«rο‹DΫ—½=ιΞŽίۜϊmN½Ε©Χ9υχ9υΘ’?* λΈQ"¨…Νf8 ΏCp 4α\ΚλαΒBΰW¨Βί—–BΠ AΤC5΅pi$ ΥZ'Œ­Έ sΔzU*xΜ°0ώΙΑΞΫ9π8υϋ:u=~U:;8ιΞ:μxΥΤ$ŠΟ”1tΓέ·[ ννιYEV$’]’ΥEΝMUQ WŠ—Wβ½tŸ­h}u₯(79§π€οˆ%u^™˜Dp Ά"μu~_i}―΅Lg²NΒGΦ¦1‚©θΐ˜€φ§¦fΣυ©ΪτX1‡‹΅!ΒZ&8]¦—J jRΦη ©; sζuΦ“5η7Ξڍݎd†$»„ev‰£+0v’=āΧεk Ξσœ#π?8υ&§~ͺΉfƌΰžτϊ4.gš9Ša^kϊ›UÞF—WΈ]VΥ3¦Ρε犬'½…ενoBeE¨Žgo«‘‹aA,‘h^–rςU¦"ξL%\SdCη,Gb¦–:ԐXΎ|Mƒ °ΗΎ2ΆΪ±οΡ/³γκj˜\ͺ2Ζ8>§ΌΪwφuϋiβ‡ΌςWu:Bg]ς#nDΧ>χ{š)―ξ‰k ˜˜Δ“ηωb €—έ₯'Tt·=ΎvͺΕΧN΅ΎD‹3*ϋŸa’ž’n£NΊNϊ$ηΨΡυ €†D'άθύ­· —‘½hix=}hπwΟ­iš§#Ό‹`Q(UJ4ρ\:z‡¦hFύV˜"b:ΑTzfΖfΚδ81΄JkΜ‡`1Δeξ8λ%Ζ™³€cd·i§―Ί5Н=Ϋk ψχΰr"ε―‘—ŸΗpt9δΨ?Ϊπœΐνεn6ρ?,7I‘) μ.§ώΆΔ ³Rk ½}žΫŒA―πFV(†Lo(·%.ꕇ5Š6Δ«όΥs^ΡŠmακΉ ]cΓ,ŒB_H5³ππ‹%ω₯tλΨ^ځKžςρ0]+J΄Εƒm*ΐω½Υ’Z™]έΡGέΩPΕkοΣ懻Ρ~^ΡBϊ%ααΩPKΪ8Kό3˜R‡²Ο*B ·ΠαpΞ p&x)=€ρT·9¨dGb/?φΜ^…"k¬Ό·8ωvl[/ŽξhΑsώΗΜ4›εЍzγΣΝ,‡Β/ΫΟWŽρLΏ²‡£uQ*ϋ1Ώ˜Œψ_‚Y&AηΰΣγ±’ŒψgŠ/δ~ΏΑ±EnUΰ6ŠHΖ…©qΆ ½\Ι3ζŸ¨ZPQ½€ΞΟEUΚ€}΄6X’qGΫ]ϊhΟŠ6;ΊΔ“ηZξ3δ€tΡXl tεΎϊ ‚—τΖ‚)/@ ΓΥ})0 79Ημ8v+UΌ”:ωŒͺή¨š²QΝqqv±γ9mŽƒ¦ήhšr3gz¦Μν»°V@]#ΗGο£’½hJЬsόά¦ύ rz؞rα:ΡΠ+š ‚₯§ CΙ0%όŸaβΙ―’q'έ[ŠήΡ&GΗ)Uδ‘Jœ4’v£ΘΌŒ|)„dΰŸ-9Ӝ²(ϊΓΡ%oλO5ΣΛ΅„6χ˜Œ„ΚyκZ­έoŸv4nε₯˜ρσoͺΒΎ4έ¨UY*ΣΟ|Ωή”Ρ•H8:}}©φGΣ|ύθώIKŒ"―ν•C#C7ζ‘α2¨΅LΠΘl/€Χ ρwti £™@ν―΅§&ς<_Άφ}xλ`΅ΛΙ=EΑO©•Α‚‹kΏοΆ’>ˆΫ⁹σ`£ζ»qΨ FlΨ°*<< *¨ϊ‡`~ΌŒN.ύΰ…jΤ^?ΉfΈ=3—7hί„κPdd#o—FΌ>5Ω@u Έ CΉ’T5τVΥTΗq›.ŠqΧ!oŽ“ψW8<-θο6AC#x ŒΆ¬KŠωώη;—‚ΜY L•¨4βvζΗϊΟ+kΝΚ―Ώ­oΧΏΧ7·κƒεϊΪv}Sšhυ!BwŽB—6σzC6•*8ε4B{q{'-·ίہ&κY9!„JΨQlloΤ7·Wκ[n,DΤΞSΤ.(ς1!˜¦ά!–~΄ς“o^Dh.pwfβ}ˆΜEαA8Κ5ΓfDBYHΙάΝ”>]ρp9Ψn§:–(u—y%ηF$Ζ%JŒJ¨Ÿ9ΑR\¦€xœ+,³¬h…5IC·λ'XͺθK+Ύ*aχ A—Ε*Wˆ TbP±τ|c΅ŽQ©’{5Xj‰4π¦w‚β”>LœSηχΐCΒ¬ol―¬―Αƒχƒ<ό«†|§)2`yiuURGΥ9\Œl›WΡR|ŏΒWœ°²Τ½AŠ!ίtH΅.(ΊΤ²6Ϊwάί™Π0'ΜrŽfΩw“[zΤ{_šPΥ4ώ₯ ,£’•l"βF˜%~“&ί Œ₯^R§'%€,yΟŠύ;ϊΪh™passwdpasswd source.passwd9xΪ΅“oOƒ0ƁMΖfŒΎ†‘ψVΎΚ"K…‘ΥΞπQψΆ2Χ+εΨάΜΆΎyξΪϋέέΓά۞ΠθjUΖ[oxf6Z+"„}ΞDUQnÁѹќIš)!H˜ -X‘)R—κΚhdτ“Τυ·φnˆςκwZ–-b…šΊ―!^||§eί°a&ζ„–Qs7aρ΄Η$»n';ρέ7'ƒ‡ ‘ešΌ>Bϊ΅ΡnΉL51'EΧNǘΖΈ…a*Ιxkώ₯…’ωΩQΧ¬–ΟO/=Λ½υ<οώ β’πB“ ζOŒ‘T:h&σA›Νγ–φ'Ό€q’ΓtΖΧ€dέΤΒ~ ΖΫH“E_ηΑθšHFήΚΝ€egREεΩΝ1=ΒwΨ\WT²l σq]s PowerShellps1psm1psd1source.powershellUxΪν\λ~ΫΖ±§$;i[δ47'±,Λ&D“‘άΔ§Um3΄DΩJ)‰₯89-ƒΰŠD0.ΊT«ρ+œχθ£τΧGθΗΞ,° °κ–ΨωE°ΰb±»3;—t;η}”3Ša;›δ…§ΩΔY†‹κjϋdgώe.ώχnμΕum­νΉ‘† xΓΙ |/ΦP5ϋ}bΈ5͈τ9”ǚvL―­“Ώ{¦K: θήθήΈ”οΔήΨυ nΒvWgΫSœž«@烆oεΔj†KlΛΤ•x―oεobϋŠiσ«τ6!‹ήJos—·y;½ΝŸx›_§·ως₯π,‘ΝWΌΝoΣΫάγm~—Έ¬Žjk–ΫΦMuoΐ‚ί'ςΤρΪδΠ)tb<}'qlχȊ,»B9$ΟΌα„Ιn; =C­ήΦ~‡‘ΚŸΎ/,φΎγ*ΆϋR Š―a¨ΌΑA@ΙWŒŽΓŸ Μ"ЌjΏM:Y6Υ°ι‡Β:G”θ₯ θœςaεy)(ΩG©-«ŽͺX$ύeόω5‘vρŸ βΣ*ήθ3A³£KρΉ P†Χ'Ά¦.™,‰.ΙuM‘δM¦…©Δ„‘7Ί!L…?›:π M5;ΔgotSΰΨΎbkQ†Μ ‹ΕŸ―›uΫ΄ˆνρ–·‚ςΆ`}ΉDτ‰«”μ@ J–y@l§Gt=iΟɈΙzΎά_Ό)…Υ“αέZPΚΕ|Y[\3;žNZo4 Ε Ίι§ιk†ζΈΆβš6mΰ€«ϊ-Œ \€Η!ύΆ~/U;±$N{˜v§dΊ=bG§=ΞγZ8ΡϋΣEInΛΦqν€@εN!_^”KPJs‚€q>–,ΕV€5 }s†ˆ²9!hcl¨Σ)œŒr–³9/·BΎNLέσr.(-Τ%)BΙ!L­Jm[Qχˆ["F'2ξδΠZΙω‘ar§¦k›žUj“fδMD(z9$ CME+ΒιI™ΣΛgN/β ~νω?‘Τh 3y4Έ(£Gt_Ρ=²k›}K³ˆ†sΈ¦}dΪg€π žΫmΨEΕξzhwj™l šC\φV‡μ*žξΥ;že™Άλ8=ΣΣ;0 6'¬΅X…nΨ­’·5£ƒ5@΅εΩUMcW³ϋZίRT—Υφα}₯KJΠ§ •σ€rΘαΙΑ»*I.vsKT`ΰ2Έ€€νȝΘΫSΡW?ˆ;―²qΔƒqvvόΗΜΓLΫτ§Ρ‚z >Λ[at«΅I }Ζmίήώ™ήGητq³žΠϋε™uqk“θΙΑ2Ž©ŽcŒyΰώ,Ι;}}Ήtœfζ¦Gσ#•Ρό˜HζGΒ²^2?’|`ΦΟ·&Šm+GΕAδ~-ώ±γήia˜ŒΠGQˆW™–\Β ±‰eΒ όTΰό8.¦žj4*ώŒˆηT|;ΙδΫΩvYYB07,ކBπzΛ@2mσΟƒ|ŠΪ4€AT.±½*’Dλ'XSƒO6h5—ˌ{FQ<‘δU«z0#!n–η˜œ$ΙN&ψN–o%ΑνΊΆ©§{IψLκίΠdW“–όΩzθpͺφ ΐ$TBϋ @ͺΨ#†ιž‹ΏMΐ»,χ(¬VMΟpΓ_€gAίΊyΐ^ew¬ΉjκΊ―Έ‘Jί€ήeΖ:όi+F—„Ώ,€Ÿˆm„Ώubtέ^ˆhzGUμŽ# °“TλΞf%+Ίδ1W0?υH…“ΦtbԚ^Vόk’kεb>0bΊC‹T–©Ό(ΝΙ²Tf ½XιthΕqŸ0¨έvι# Ι³θ#tƒτ‘¬’K=’ξY&tI'Š WΣ!t vŠν— -ώ :Έa#–° Λ}μ;(Wεχ[&άYGt™΄½.\ Ό΅t ΝAέΓR ϊΫ>“ <  Uƒ=―bLJ«‡XshH‹p™€ψΣξ+.} ’φ„―ΰ£θ­CθjŸ΅[Εέ#HΚ? CΕUcίά#τ ™Φ΄>t]Cv¬Ερ€β5bƒ΄­±©¬!οΦΙέ°ˆšCOžKλ(°uΣ’pγβόλ>hNJΈlΆ•ΐ)"”.]8b6Iίd• ξέyΦ°ς…GJΤΈβ0P˜:kΚY J‡₯Η^et4h€•S{P nAΜi@Gžy@{šE–„6X? P"Έΐά^ιoxŽΕ^9Π\μεΘPιNg χ/tΫ`ϋ&(ŽmΈ}>nA­pξl6'wΫB%₯Ϋ SOλ©‚C ΜήFL½5<ΧΑΚΩ`ω΄I_5ι˜1α0ψσζσy₯Mv ΫέΏ}Cΐšͺ'7[w€us\†ΎΚgμ d ±½67œtWΣΡ²γΩg3žQΎ½]ΨϋQΣbΎ«›mE§ΰVαl‚-[Ϋ*-Β)Λ n Ά|Έ«+)«KI°δ’4f„ΐ’6N Ν!Τv5ΰ0μμ¬Qg+|Hϋχι}(Κ”6πAP<†|07ψω— ΫMΡ:!7νΐ=Z?›R#₯ώZJύSκίK©ŸI©4₯ώγ”ϊ΄sΰO]ϋYΧ.Φ΅Ώγzh‡“vƒηΠ$'.u’o§M2?Ω$KYϊ멞.Ÿνιn&Zvh–ιε..eπ7±x;tdθΗbdL]†ϋ"Σ‰%·L];~cΗg¦β`f˜RόΗ|ρ/rqG.΅ R:ά-€O ŠkŸ1–7Ž‘ώ3C°ΩΣ6 ({TeŽ p‘;ZW3“₯ηT>ΐš(C…p²œδ?ΔF–ςΕβlΠ]¦=cœό]L §…) Ι= 6D°8«R˜$‰ώ―ΐ[UW'dXRa(‚Xh Θ”Ρ w¦IAJ*ΆΖ2β5&G%R™*x‘™¦2Θ]sTσ»„AššΪB•Ό  nΝήjΊ€EωΘPκ`Δ}_aaΕ@oA΅$PK‡PΔ_,d£tξ ήH˜ΰˆ²;>’Σbμ84”g(φQς(·FΑƒ°@3=4퀑fFΝαvςXσ c΅q°6ŒΦΖαΪ0uzχμaV¦ŽΪΦάΝIɎϊ aΤέαΞSQ,kQάe§#ΙCπ`£Y˜ϋ’Ψ*? ΝΒs³ΕΦΩ’#=sg.Σγ»'τ^ώ:*0T€ΐŸχ°·N`Λ-0}ίƒλ}NοP™fΚԘߐΘ}]³ΞεbŒ‹œ§ςMνŸSŽ…Ηbΐο{Ϊ,ZεyΠάCϊΤW―w+Ε•BDΫΤ£5 g/5Ί­S―F=ΦΆiΝ£ϊ6Υ=LΙefa―ίu­V~a9’dΑgS₯9Ό€ƒχ\ξi‰@ RtΑAO)ΈE ¬­2Κρό\‘»t™vθퟍΐ™41ε΅›τΩ‰άL[Η6}Τ,\βN§ΡgͺnΜ΄Ίo’¨,XΈ RΉπΪ¬Zm]h^_Κώ:‚²&Δ’f½²„ΤΗ δRΤκG‘Np 1\&L;›€α6ˆ9>—ς—>ΏσΓwN?½fζτΞ’”6ΑwGM0vžΕ‘‡ηž|μ{Ύ…yπx§ί’Žξ|yBηΛrχώΒCψρΥ‰tήδϋΒQ1‚:ŽŒv|ηήIiπ —Ν`ΉVcv/‹Γ}μ§X¨Ό’ "°Ž)b[Ά‡ωƒΓj)Υ5‘l6^ž%#Ξ΄’Δ/ς r4τqUΫ61)‰¨Ύ½a9tιΣΑKŸΠϊκ2­;ώ­|νΌΕς™όO —%+ͺR,„…ψup›r„S),ΰ+Ο1 „\+ΔLMα{ͺ>Œ$ΉΏODXˆήτζ³rK’ΘΝZ±»,«Μ1u²ψΜ:ζEUχ ¦‚α•=gw @τ‚Q0υ«ŠΛͺay.­)Ž‹IbKf‡Π5 v‰C׎0ΣKυZΧ‰γ’NΏβukd$Έ‡CYX‘Ζ#Σ3:υπC\X³%–"‰7faRX½ΑrΨψRΧ«©@±δ―†ΊβφπΣwVmš&ΎΊ½Ύ|Πa)Y0ν;άaω· .˜?α*ΘΓΪκiŒ’•LI³Γ5S<Χμ#\σЉΚ?'m ς λ6Ω8 Q>Ά‘ίL+ΜX‹΅ίjδ H¬2ο͈π³ώV ?BŽΏV3»Α’>!Šξφ|AΤΦ΄]’φ>¨ΰˆΠΪ―n R·―$Νy΅πšr¨υ½~st—όŒDΏfΩΦφI¬†‘«Y `ͺXε ―£Xέ·Αβψ•+ Lp΅ͺͺΙr„AΞΣτ`Ω|Cνω?†ΗQν+šή φ>H}¨.ώ‰¨€θΥL»Ž0>ϊTOxκk.ϋΑπψŠΘ’―αΜj„–’yρG˜Ε 8ήET?2XκΆιHΝSΕ6βσxΪSάΥέAΕy-ω5QA.Υ™]-;α&TRΎIα€)–­€©π¬–΄?ΘoYΜ‹όΛ¨₯e΄œβƒήσσξΜω.WΞΝtg:Λ^9Ϋ›ΟNZspyή’π“ρ±ΈώΖ«Θυ3Δ7Sg]81δΤ_x½qξ•fXέ„EΚϋy(•ΈMι £»P₯ϊ[’R%0χΥ9ΓςΌͺσ³‹?7.#ώƒΞŸ&ΘΜεξύ,ž#XΜ\֟("Μεώ—Θξ—ΘξuŠμNα ~œπ-—{,n^Ξ„e†§―G€•ΊoΎ€ˆ)δΘ՟U0šu@uυάϋ°’Έγ0―‰@fmƒ“2ˆNmΌΪbw}̐βΒβˆΟƊ#Ψpΰ8ΨMProtocol Bufferprotoprotobuf protodevel source.proto'^(syntax)\s*(=)\s*("proto\d")\s*(;)\s*$ident\b([A-Za-z][A-Za-z0-9_]*)\bƒ xΪέ[y“Σ6·h)εXv[ άεŒχΘ.…BΉΊΣΟΠΪЌγh·Ϋ΅Ψ-ι'‘Ά’uXz‘lΩ 0SΟμ8#=λιϊ½§'νK‡>kμ}ǏβhΔΣ)ŠςlΈχΑQέCNη²χ…E³i9V‡½―¨4G9ŠΖΓQ<>Ζι0‰“ς‹.{ίTΎ8Ρd<τσ< G³e Ÿ`οΛκg³Ιd'yˆGώ•τ'ΩϋœBN“8ΝKͺ/΄"Nύ0*iΎ4ΣUbοσ* Κ2PšΤWμ}V!‹#”D§΅3gB ͺ―ΩϋΥ[2“ΨžΡΞ.ρƒ7ΚμΞjύ"EJί’qIwNO—Τΰ‚Ž³»°@—ψ©/9њv~„mHσ»PI&l±Υ_†=+:,ΫΠSGΉTR}όdX؝χ~ ήύθ Iγ<–ϋ0>ΗDήΔ6ŒqΌλ1ό”Α$οππΘ žΐ')Κgi$πα)πώ MΓ žx ¨α' ΌϋΠ!…LήϋφPΙ{_°χKφv0Hλ»φ ύ:%§V4Ρ۟>Ώλ ’}ΡΣ‘Gή#&qπ¦fhnŸΑζ Φm2‹‚|ζΟκΡA…ΕO>:W™ΐy±LsΏO`2w‘ϋˆlIQΡ{,ΓT¨€£: #ΖN’Δύ’SξΨό/*rψί'ΪRœš‰Cω‘? byΚχ«ς”‹ Π/cMύΌOΘσζ1f0καΩω³I>£$EŸ£ρœ {ƒΤV6KHθθιˆ<”kׁΚl» ΌΘ ΙYμyœφ)ͺ™‡yνΜ5θURDVϋŽώΡ©¬+πΐx^oyoΠΗ κύώΛΞoώΞί―Ω{oηΩπυ&ξπΔv»ΐŽ.‘Hηϊ2uΐW4cψA€c(VnρδΞS§·~ϊ£ κϋQη~i†ŽΞILb-A;A/C–D΄ ;ZV¨rQTΜΡZrΥή6λΉ‘}³Σιρe1θ βcΟΙΧd( &8Η_6 μΩΰ&Λ ­"Α}ΫH ΘR€rΛΚ·‘…r²‘d»N’ΖPΖΉΌΰ?ξhfœ£tF‹(]‰ͺΝΒ.NίΗcΔ -?Κ›»m£° ΑTε_6ΔF[­~.ΈΌ§‘½Œ°ΰγVΘΙIqNζΗ42q©*V{p Οke»…χ +Iη6mόŠ0«Ι:vΪ:•Θ„IαΌlpwέ6‚΄“¦[ιxύ&X:l ˜_ζ'[ΰώ_³oϊγxF@H‘gaώb9Έν8 βρn2ψ»f@<eŸ ―[ψA lžU>Ž”ξ¨=GλEmiIžkγΞΒ·ταU ,ž₯²sΉNέ£σμoΈ¬ŒφŠΰ΅Ε7θψ]œŽqŒE4ξ”uί*Χά«˜uG‡ƒ»»–Π,*$J7ιC}ΈCξ6[ΥKL\ά&ZWˆ{±{€‚#σ Ϋ¬ˆΫbSŠq =)ϋIΥψ rόWk?:y;P–΅£jά²Ι‚Q“πάbK)0.Ξ$ψ¦ΚvB£œŸ4m74m=MΫ₯֎tFr€’%Ιrψ„ώ¬ZUΚΣΡΜ隦νΑ0#‚ϋ•₯YΟ"Άw·ήSέ*UKχώdž’ΏfaŠ j)J©¬ΙkΣ5¬Νš$Lβ+Οϋ¦¦νV­M.”“ΖG;W^ΦoR`E°@<†@ξW›|pzο*2ς―HZQ―Σ†€ε5άΔλE»εΆVͺzΪ8ύ‰U8}uΖα~nΈλ΄DržϋŠM7ErZfo•ΐΤ¨N»g™ςΛυ`›€ζ€ΣvjR!ƒS`θ½Cώ›y‚waΰν[d\§"7,TJ‡¬N4ΜΨ§“τ ’G—5λ€?mX/ ν ν· ν¦ Ψw†φ{†φ«†φg²πOKλαZ@†ƒΞ>1^Q₯υΩVΕbΐ½οajS$kt Q₯ŠμΦ…­MΕ~%UA>δlΤ u^ς₯cΠaΟ’zΝΌΒ½ΑxΛ“΅€‹ Καb―λΔ->αpFψŒ?Δϋnq'lRŸ·Ίσˆœ•ݐ¨Φή)§šh³φmXΠΧ+E‘) όlΉ#cθͺmRΚzVchέ*ݎωψς›ΉϊΤYΝ ϊ ŠΤζθ”NΉΝΚ^\Ά–e―¦θΊΥ½Ϊ―7p%xίβnKKqσƒIμησQOζ΄6γΠƒυH%7‡kΫ7›gή~ε½G?̟l]+E€‰|Η°Θεΐ5%ΗΘ5;„ΣN―>άΆ‰PT] RqrφɊ¦’ έ\V” ΔZΈ5cRϊΧMζ€€Œ«ΏΤ1ο{[j˜dί]Ϊαš•>ΤΞȜδ‹λm]ΘΰΣν€ζli{vaYγ*NΓ«&ΙΟ:ιDξr[Cž+α7§=λ£v“η”9¬•,ŠΪw†} [ž‰ΧLH2'Ας1β’€Θ½mtΈ‘‰β¦ͺψŠK ₯ώQΣφDΣφ΄‚9Τ-,w«ψR\o±¨ψžΧΊx‹„β#–=kξm¨χYl„^kνΎΌDΔώΣf—*κ0’Υ€x’Α]ΒήT«΅”Tͺ`χL>R©BΉ1³’RΕ…Φ>°p Ε«φOv Ε&ςn΄žΝJ.ύό|εY«\u^:†^卲œόϋhΝProtocol Buffer (TEXT)pb.txt proto.texttextpbpbtxtprototxt textproto text.prototxtexp(?i:e(?:\+|-)?{{integer}}) field_name\b([A-Za-z][A-Za-z0-9_]*)\binteger(?:\+|-)?(?:0|[1-9]\d*) stringEscape7(?:\\(?:['"\\/abfnrtv?]|[0-9]{3}|(?i:u|x)[0-9A-Fa-f]+))φxΪεXos›6'ν’6mΣ΅YlYiΣ»Ψq`Ιe·uΎnΎΎιΨ^μf|œΒΡ Dζ4τ›ψΓNH;Ωތ‹‘"=ϊι§ηyτθ/”τy•ϋΨA¬“™Β?»œνΗ“°S₯`.‚žS΅²ς₯Dθx΄όΐšψ“bΔFΣ§lΔfVΎβF„$@xd9~tξAkyyΓb’;+ Λg»[7,€/ωl_¬4,ŸmK˜Υ²ΖaΦ»-€[„uίV:74뼟•;Y™dΊ }[%™Δ f‚ι‹~L ΰœΐCΔΡ85"“x$PœΫy&xΰnΉΣ αD ω8+ΏδδΚΞ2$˜Λ”•ωDP5εzΦϋTθεqχƒLŸψδj’―σ«¬|–•n6ΔqΡO˜ψσ¬|‘ΘUQE"ω>γΆ©9d»ΊΓVa›D€ tFσκά• ˆ#]κ”δ%΄c†φV‚Fν@ό ˁ fLΩνώΟζ―aI…%Eλζ{Όί‰ΞŠyJΒjz;Ÿuά{Ϋ1qaa7UQ―άΤ1C^ΓjΕΊs|X„1ΟΫƒϊ@4ΜΚύ'kxΤ‘¦‘kSm Jcελ¬ΌΤK Ÿ\ΐΐHh…`Šφ%«Ά Ðښ *4τυrΎ ω[9₯1Lvͺΰ@’Œ!T2 ΑHζ‹6lΙάνsC:ΘNJΘ6‰*Ψo·Βmo‡ς/ε}.PE>Ž‘†·κ ;δΗ|ΗυL“Ύ‡oLσ;pξβ€\φ‡ρ€zΒπϊμsάξ£^O;IΓύ#Πέa·Σa$ήǐa_Πcκ0΄ΑΚb «™¦ΑpΞ²az† Η@žGΐ3"@Ϋaτ :zΊR½8gΕ*GυϊΟTΧhΗίUVˆτεύYyVΡΎΧΘΆιYτ?·ν!«Όkd[^u,½u–~ΎΔM°Υ Œ' cΣ‡ε†N η%ͺ²μ‘ιa[Yƒ+όXs·ήXi:rG/·²Ž}8’Ηβι&O’κγρ^*UΩ¬¬’Χ+ƒ₯N‚:ͺΜ€’.N”D0ώ-y‘Ψ^γσ·[J^Šρΐxqe‘νoX 2»±ήιΣ)h¬A؍ι/YθΥΊΐ;iŠˆ^h‡^#aΚ9ΠK m$7±5x΄nΘcIβVεU|‚»Έ‘Oκ}Έ”O7tγΦΪ»šyD»Χ‰“kΛuό>?ΓΪ΅όOx₯Οο¬|ΠiIθνHΪΈΛΟΊA~›HŸλ†j.% ƒη†"›ούΏ6ίf•ŽV΄W₯HU꣊φ§νχΪ¬φP]ε΄ή]Α6Λ?dˆνώυξiZ’ΞΝƒ)­œΔƒSšΔ™Ξ­†ιt“`Λ2QϊΏΫοhځζ!šΖOϋ‘ hŽOzšqF`χ{ν”ΦθΟ₯sΖHm—ΒπΟθ‘{ΨΣNkQ‘N9Λ'ΑœNzŒ7Τ)qH‰—βΰ«ͺxμz>(YtCbΖ‡΅­u ·Ι€ψRU‘ζBc―«4†0#Θ1Ά«Ϊ'Ιeβέ°ΫΐΎMθ- 7€z3πh³½œΩ`ϊϋ»κχ«8^ΐιr†έf ΛXλ₯!ηjŽNyHz°BH’¦²ωϋΈ~ιΩ%¬αYqGΉ)―όrΨkΔ‹Ώ6dΙΎό+ܚ/œPuppetppepp source.puppetσxΪΥXYSάFή]ΗΎb|ΰ‚±--YΩΉΚ•­­δ%UyLή‚ΘΦ¬4ZThG²ŽfxΛίΰΏ¦Gθf΄Z’Šͺ`@κιι―οžυNφ<ΝΧˆψdlϋΙΔΓƒχ‰c{Ε‘K¦γ·§ϊs³Άg†\RtΥ4_qšžšζkNsIMσ §ωLMσ-§Ή¬¦ωŽΣ\ΙΧ• Α(a< ‘…£ΰΥ|έh vIŒΓΐχ{WμΌ–―U;χq\9θzΎn6’ˏZjB “ΚA7šεΔςcΈRΧj;a ša ΨΨA‰β£ ͺΒ[Rί‹ΐΧΤΎw[°Υ8΅!zG0ΞxΕ(ŒωηΟ•Z>ο$Ž8Αέ|]ΞWYpΪ{xY(­X{(δ4χΟ%xlω³&…PΛ‚Wρ¬šͺΉ'z―«2’šΕNΟ»svs&NφH°O“Ορ=εgξs*HΊ*#’²}"Hπ­SAb[™OqΪg‚Οd_ VΟ…¨ύ ….§8|~]H|OjμŒμh#s(#H‚ǝΚžηj<6ŠέNύαk\ ±βΕO ЈKάτΟόpLμόΘίΜΌMτRρύšpΨr6©Ο·φ%XjΒr`fMρWεΚmζDUΩ-E‘„ϋε*wώ6Ϊ>ΦEεt€hο*Π>WΌ_žΗ7›Ν%{8tγH7'f΄uΖRβϊ°π?DSlΜ|Ϋu\Vv+™@¬ΕΗ—κβBIτΦ[Poι3(ρj£αΞ`όΣΰ4ψπvπύ†±»5κ}ρ¨£+ψU²ψal°ε‚]’9VŠΙaΜe”]ΑΤ‡%ψ6¦ι mμΦRϋ‘'κ―ΏXwm›Ξt… ͺΎ˜Œςa°2υNΖxΗGkŒ\œe€λΝά«ͺ»§vΒ §Viν‡ΝΤζ»Sazλ)ŠV°E<Ξhv²β&(j•~j F‘ψR˜Ώ§ΨΣΏ7ω”)d(†Œ8~C²―Ήπ9X~U’«ΛTU&Ζ3@v^oμ[μχχP¨―‚ςκ:Pώ<E³j Ώ\'uΩΡˆ]!σͺCϊήΩZπ+x°οHί-:ιnŒτa:5mρ±©=ΘςΖ£Ν₯“ͺe½[υήa½#qgμ–…ζS ρϋΪ Κ΄WΚY€‡ έ.»΄˜T'υy^Tmv–dβ”Εά•ZΜ•WhζΑVvu²ύ#sNΎυ±Xδ³Ϋα¬E— όYΐ€ΰy’‹7GΏ ά6§˜Ξ0ύ»τΒ¬« Σ(™PδaP―ΧkΤΖ“dJ‰»4ui&΅)žαpJqRΉ¬©K[Ύ)&μΖ|™8>yξL#ŒBkΖhΚ~XλγYΐΪ?Šƒ€ u”•Ž―Έ>Μο„€Ω²α+F–γŽ`heΝΌΪQ<ηΑόΪβΜwZ3Ώ~‘Μ—g΅f~γ"™ίlbώ™"ο<—qέ«Iγ%L₯“ςs4sGŸ›„8Eγτά¦ψίκ΄I«Mϊn?8ŸίΔt»Ι`=’{ŠχΟZπJŸw……6uή!Ύs‡ŽcnξR(ΏΥΎ±ώ₯_ζ-^Ρ…«^ΘƒφdRlL=‚Όy“ΖΗήlJζ1»¨–#)ήK°hfYJDΣ;4ηp!ώ£Π+ PureScriptpurssource.purescriptΊ xΪΕkwΣΖIθ.Ο[εUBΐ&ΨΌ‘€@šB ‘$‘Ih{εζ(φ*Q‘%G’Πνύtοίΰ·ήΩ•v΅km).ηϊœdεΩΡΞcgfggΧΏVβΟρ€7]Ο]ozν6qΓ`ύΦΗJφσ žeΩ)ΚPΞ ΄MΫMq†υ8·ΈηŽΐ9 ΗΉ+p>Σγά8Ÿλqξ œ/τ8Ξ—I{,ƒ„Ύνn*Z<ˆΘσaDο!Dp0ύπ#R½Λτ}sο#bξ¨ΪYoz. αΚ!Ž vc,―σ½-ϊ…|Dβ”ύρψα8šŸ–š’οzΉEšN½zΎ@ψ'2bY’λ+ΔtΥΥ±O"Ε;ά"rΰSHƒqof€ΣHΒŊάfh{rŠΞ ωˆ΅EίΧHΙ¬―k€³HΣ)άλ€.Μ@ͺρšjβϋ©šΞγ!Xg‘ H™ΰͺ’λ"bt“ΈΔ·›ΐΖ{SRωitΣρ6LGτ^BκŠ{»μm4 σz‰k{>‘S?†Όƒwfζn)$ΖΐD&ΠΤ©žw1Π6χ6ˆθΌŠΰ!b Μ@YaΫkE©»f[’ͺa><Χl‰Ξλ˜ λμ’2‰ζ °<[ŽqMHάΫ5HΉs‚Φe§ ±ΐ˜7ˆ/»o"―υ:Δ7‡Ώ…^οψΔ‰ZR·QlKΊ3ͺΏƒ88X’»Θ-0^έtBβ»fhΏ—του}§Σqμfζϋ(δt½³a§Ρς έȞη8φ;9ϊΓ~/3dΣσε²π- o]/d,μЦ]ΨJ΄›κ‡λωrάοϊ)Ε')ϋ ¬Δ†'ύΆΌόy†oΊ-OΚ3Ό3ξΝΨΪχΘylj3Θ‰}²IvEη(˜πΞ •gΘΝc Lδy%»˜ϊ$ ώ{’Ά5›΄'0 ‘οΙPώK%=u }™΄"ƒ dyqfδ™CŠ…n,Μ+43qή$zB Ζ½]ƒΌξbƒ'_’{>w” N‚¦Ω!mM^θ›Mι~‹hςxgFΨ7hςb ΜκϘHΤq$‘%<λμb‰ΓBsΌόϊ°ΙΉYΑƒ1΄ΐή„@ω’δ[4E V[ακ—€ύ5iE²/’ž$Sll8^σ]£ƒMίξ„_ΌΓ?b6κΖ_8\Ιω α1ΞXφ½‘dԊFθ"£i“Πl„«³/Β†3T…rŒκψ©w‘ΒΪyGφv 6ΈG)Δ2|γ$`|¦ς-²κκκLύw³ώαVύQcνzΝχe_dyAΤιx~˜°ίEz€kώŒj%oΒT)d0D°―šp6Ιy][5v§r”a ›g‘–“Χf\›Απ r‰ΐTnOMΤςΝO_žg„ι͍i˜‹ŒΔμϋτ”Q•@#ΈpΪhԌZmΊ―BΔχ,Γl0ŸΖ–§Ό2™σŠˆ98Dl―–«žsŠ$Σ„;.&`¦D&x‘ίεC•~ŸΌEτP/δa G5π#dΝL…±j¬α5XT€Ίœ.ϊ΄c ¬κ”ŒQ—u¦Θ«—…Hδ:%džυΖuAεŒ NdΫ%ωcKρ4κ}g¨ηtf$?ž M_)ϊ ύγdΡ™<œͺwΦ² aW”+βͺH=e g»Θ”΅KΩ3fρ΄~fFψšX!]²7·Tφ―υfίޟ₯( ‹‡P(Žι(– ¦SΧY ό\QuJ·|―= υ1z¬Q$ΥJxε•uH±,‘ yRšVΖ…’Κ8Ÿ2eΘζΦ,;— α–ονπG…ΣΛZ•0Δς:ιθβρPαx|B ’°m–{³8 ‡&ΆΙ²o`ƒΥΐ/eZɚm—η;{Τ5έ’qQΜA|6S^χIIB–κ΅ΘΫ₯9*Ÿžy° waA₯ĝς)ν΄ƒŒY ζν˜~@^8žƏs€~΅cΫ¦ί^Ψ»€νŸ4팧HΠ(!€nŽΖ5π‰’st,UΨάβ±(ό)Ό_νbωΩVωIzš„2‡mνΕ”]²?°|όΉi‘₯ȍΏξ° ,βΎ½Ήλ›3„KyΛΡΏ AˆY‡ ΝίQxΣ…‡lRY—βZ§$ΘcYΙωFόSRΟ” eI¨‹}ϋ§dΰσ γ <όσ\±e°2˜[X¨ƒ%ϋYΙ‘.q•[Ϊ'evΐ:‘ΎΘ%ŽCγx ”αy*,l ™σΆIgνTΊW$  ΐƒƒβIφ9=Γ%ρGJβcΎΖ{M,/aλ―ΘD8FώOϊ(!ŸΞˆΎ¬hVœcψ¬~\Ώ©Οkΰ·4πψm ό°ώ•~JZ?―_ΐΗ4π«ψu |ZAQI_Τΐ—4π•όO―,ηš^ν1–.}!]O’[αD‡ί‘)Ÿθ(;2>eϋ²yφT$Ω'Q|ΔΧ5Τ:{Α§ς»³Ι’σΡHγ“ψΪ ™§m³3O²ANNθžνRΛsZσjξn!±ϋ#εΣu ΌQT²“Κ”Γ£mξ„{E6ρΝ¦Jσ|…˜8ΙμΓKΚ$‘“)‘U8Ί]›€·ͺ«»Ώ­±/fݚ©ΏΠͺ·ΘΧ&k "ώΙ­”ΨEΏ|&cBF#n««dvmu²Ύ6―MΣψΓ»Ν₯‹²ΕφtϋχκUzωΚΔψτΏ'§ tϋδρΝ§†±6‰ΕνJΨ±Ξ;ψέ’Φy0UkvUνώ’›L…x?¬” Χ>΅»£Χ‘ΥQΔ’ίΣhδΎώ@¨«?ΐ§4πο4πΗψ όiΡ™V.ˆΰπs³Ÿ•Ϋ‡UΩ»₯θ¦7ΛΣ}«š»,ΔNh°εΐŸOΑεgάkž₯πm‘w-oψ·ί<ήόΞήϋŠΈ‰]¨,ΟϋhΚ;»dΙ8e-d)ΌeLzjαϋF_6’«šΖΨ­xŸP†°Ές9Πζ“0ςտ֏lρ…?CσQJΣ%›ΐ:·“·“ηφ{ΦΜ{όΫ|Δ-dAb-GEN"ƒϋ*ίTΨ‹Ϊ―IΠ€έfO/‘Pžͺ<Ξn—aŠ­Kƒδ΄¬NΗ‹u ό¦u?ao•§}?₯νΨVΧ -PόŸsΙΆ¨r˜|f=eΤ²―š¦’vΝ—²εΥΒή(Cψ^Ÿ©\77\β7Š Ÿ·Εs|LQ›)— ¦SΥ3 όyQU)Kμ»]x7Ι/Qp„Νv“p€Eω8”m Μ&Y‚“ι4$AXd³Tœ _hΰ/‹jpBY³Ν€Π–G‰­mQΨϋ9$€žgv™ΝŸ8Εχ+K«σ”ΈP^Σ¦lz`Οι›ŽC“Zλx”`νƝΈρ©(EΣxοΜN0ΨφŠnG&Δ'›±―βΚXαͺtι™˜Σΐ_‰Σ©2–Wθς ­Λ+3μNK‘t›u°½TS±i~“E&ΤγGλςN;ή;"žΩRcψ‘ Μσq?/β}yb,DIώ±_Υu Xύ–ιΟ0Ϋj‘έEk™‚†sς q7Γ-h½¦ι–·š>ξNH•Ι2 e†47ΪB?i °'‘―½H Bοm§ΓZί.W“Λh₯η±Τ…8QLι}!nƒlΪnŠτΑJQΕΛκ…Q½F1jτ&έ `n4DίΣ[4R*ήϋ«¦½ΐΓfΞlBΚՈ³Qήgίhΰ?οcύYaΏμ(Όώπ߁”ŸcεBfΑUνRSž VΚrQ₯\Tœ+ςύ=HEϋΑξΠ™ςƒžaφ3—ςZΔω•ωμ%gv‡žέ4Η‡X›₯£ΚΥϊ^˜Ι!γ“§5Ός3Έτη6κΙΫgΘυφyΥZwŸM{Ϋdd0zΚΓr(Ώ•vΨ_4π•Ά™!"ξ΄Β„ΧŸΦŒe Ρτ}ΨδπΫχ=dD=½/νχΉ Ωϋ’ώώU1QMLqml qmlproject source.qmlλxΪ­Vέ’Ϋ4vβma Π.t`θ.μμ¬Μp“ν’α–G Κfd[IΔ*R*ΛυtΛsπTΌ’b9²ΦޟΆšLNbŸο|ηHƒύzRΛο!et±˜.~ό7h―Ÿ¬Ξ _ηg«3¬εγZ.Μ{ϋ6¬εΝΫB@.μλ#OΊ[y†m0/k™±ΝQ‘€„eΧIΞ²R…3šΌήΐΩ6pΆ!ΡΈy6t<΅Α ΌΩ2.|ƒ‘kΠM7“βΆM³~± 3P$σ³gΘΟ@’Ύβh:ΡaaΟ~;cn4η£8žΪ¨ΎκˆŠΒ *Ά0C:ΎΑ‘”•'΅Tθ`±3›’Œΐ’Π»†žςσ]ͺ*₯ΰ₯ VŽ3­zΊ_Φςν*Ζσ„‰5βbG δ©…0§³+p:?§χƒθ€’σ?ύA؏͒ΣUςΊdεŠOeJPBwe>8λNβxE!ρ‰7t‰χi-/d4½Η²—€Ÿ4ˆV5υ”΄^ΏξπΊ…\…)ίC7μξYγp…±ΫvBφE-ί@Ž‘†΅±ίΌ³ž;Ν%2ž›l8¬δϋžόζϊ|ž0Έ·“S:³>¬εŒ’ιwγψNgνe=ŒΗΙh_R»η…7ϊ¦¨fκy‘(΅69‡7κhΟO]ό&Α ΡGπΎ,η HM·‚jR«ql1,·ΖhΣNμίXΞFΡ•«ΘG±iΜθΫΩ;m¦τΔΪ‹p˜θί³« PθΙάXύΈ5Nς[;αΈ³[ζ«m™ Λρϋπ{-―tdΣI”£%,‰ΑœQ²ΣuŒ§Ρ–³-βΒόΥj`5!₯9g^_U67ΊύΉ›”έ―Μ›μ½kv½Šα}ξ9bόP_Ά§μήj¦§₯@ηfκΆ >9τΖ~θ5P)Μ›yυ©Ή,iζ^QΊ©5δƒΔ©Τ…Χ₯ΌDr I$- ‘%UETγ WεWcVΎaXdTΒB"uˆKu’S” ™*]Λ ͺΩZΏ˜*s9JΛΥ qiι–#’†΄Μ™DΪ‘² ΩΙ%γ/%¦κ£/ bKIQ₯θ)JNeQamW¬q‘Ύ8«€ΰ;©+§τͺ5&H*uμτΪ3—–ΤΫNνžB ]•š!Eθ#‘oόs―ͺΞH›8ίˆc‹ΉΏ”€janvͺc/AϋT1©ΉεηcυEΗΝ’qPκ‡ε‡ΐΩ„z#[ΉΪ;Iε…ΞyΟ2W²d>ͺ Oβ6§γγIγγΥ%HQΤΌ{kO%Σq.τιαο³ήλIΊχ,>΅όonX Racketrkt source.racketbxΪ΅UλnΣ0NZH€ !„Π.I«DέΟΑ‰Χ Ξ*Χq+«‰½9¨`ήeβI±;Mάt΄Y­N|9ίwΎs|9ςκφΨΨRFη$t>½ςΊ­gΝ‰]γ{ίΨωυΌϋ ™-δΒN½glΫՎ9D‘±ˆ¦"Ι ΕIΖP₯{PF“’Uα„C΄ΖΒkωϋmU-ΰYρι]h31hΣ½vθ9CλΏd°ς€ Ίΰnk{ϊF»›ΟΙΓcwBρ½CΝoA_ν‹λF=ω¨½ϊ™±³sŒ”₯c0Š8ίΑ΅vdρ't•\VLΰL΄ZδΈ›ηaΓφή&6 3ΌT ε$œΑψΗ—ψλ4>ƒψ LΞΣ‰»•,°€Ι7Θ άaπ{‚|aμoΎ3žu½{©νBΔ&‘°ΐ{ψΆŠ>φ)RΡ΄¬(Ϊέ·£ιy&ΛΧ[UΞ ‰κ2±Π―Ϊj·»Pπ΄GΨ\ΰmτΏν%Ӑ,e‹E%b4“uY€v‰,±Μ±ΠŽ‘6Η9€+ΙρeEΈZˆK!q. WŸ\χkXƒ΄Ώc˜XΪ‘:’2…ΟΜ%ζœq©Ρ#[”φ–ίd‘t’ηOςΆI ΊIQ‘)APΛΒΕ…ΨHZεΉ‰κΰQΫά₯T=ϊξV’*ΈΪ{*Β69˜Ÿi\,ΥOR³ƒόΊƒήΨHά} p¬nΉItϋ΄/νAZ„SΞNβΣt¦yΣq……ύΰΒRυr‚B^aξlOC?@MΧ %Ϊ&B‘*E5˜γoΩǞdQ’iΛu«}w<οΟοψΌ³όž”τsΑΗs‚£ρι’³ϊ=[ΡI•€|VkuKzPρ8Ζ”ι^IVTa©ŒxΏ€JbΖΟl E^mύ€‡•˜ƒιZ~`™ΙοΆ°LzIn„¬Δ‡ΦΦζ…YζyOˆ4žeA$Db%*ωckχ2˜ +ζ\EdldO-Λ±€xΒΘΒJs+-ί›;…ƒiΖCE$™‰NCs―™os„{‘ο4β^%Ψ3κΉƒΆcζΐŸW|Θ„"Q‰ œ];wΏy±π²bt­J4_•4Ιο“αβJ™RN‹ey4αQq`}Ή₯wp}ζXί‘£2ΙΑr­`+‰œXD€η8­λb‡QHfΞ‡—)Γι4έΑٚfSΑ˜Έƒ“ψΧΛωΓ—L¦\ͺQ©'8qΔΤQs’'œc‰C8 -΄υ&«BcΩχ²ε1§ώkμOίψξώΎ/$=?|~=|!=―xΪ½WλnΣ0n76Ά ‰\~ •u°€%ή}ˆށŸuWΉ‰ΫFMμΜqΖ: ³7γMpΪ8M²άV!,΅'=9>w>έ-Φ³6‘€ο ‹τοkΙ•!s$eκω2ΗRf-_ζDΚ¬η˜J™'ω2gRf#€›!νΟίί§ΈO£·GŒί§ΨP|λVH·S+!½AΜBƒ‘O nQπ-g0|ν[ ;˜pOγ·ΌΫΏΟ²TψQ>|©(τΡ\§‡]Δ§μ‘ήυH“t_=5^O™‘τ ΣΚ"‚Cφ&ζskq ™/Μ@„PΎΠSϋF<φ?cύφb§Ρ°מιδΰYš{ƒ™'¨xA=)βڈ)sDэ±E,†mŒΌΛ›z;qΞR©;εcaeθΫvœ+ΓΧIŸ–Ϋ–;„Ύά΅£ΚŒν¦»ΖFdδ£.ͺ닐v:}φE|ΎŠΟοΞμ]Gͺ•εžΰιΚL@]Όθ›Ž,ΩEΪε“²[ή4—Mcβ‘E¬Epf‘ΰ‘%ψΤΜκ…z¬aΣ`‘rjί:ε‰ΗG8΅žpκΉt (z§©ΞέΉΨS#k‰³ρ>€‘ωkŸrl%%€ξJΕG!5( F80Ζ Žΐž\œkd΅š”ή+rμVHKAYJ²_=-yFΦWκΊκiΙ±›HK3 ά XΕ¬0)υxR–π«άύ³bχΏσ]HΈώ6JΌ[ΰoυJΎ”Nk-MmΤΙΊh€VcΈΆ­ε„qZΖβΠ»Ψ=>?Ɏ"¦λΈBJ²5-;h3ΊΠhH"CzΥSρāg+C6X―δρ‘>3Šq,e!έfm5‹ΨNfAuK…f» M€έA­lυZιι#:­”E£…Χ§&؜ΡΒkλuΜΞμꚦK[½μιΡXR‘ΒβS ΛQΊΩσΚΊ{—GΆ[~dΚ'ΆEΏW½έ’KŽ&ΚΘβ°­ΟΖ#؞y7D|ξl« uqpΰχΆΤuR±‰οŸ˜˜ΝOΏψšΘZ†₯τŠΠ–¦ΏAOΥ•1η§Ο†ά¨+ϊB†υξτφ€ήμ ’FjϊೇιΤD;²Ύω‡MΌ%»A+š}¨AΠk-~τ€₯Γ|΄w‘1γ 6οΣ*WΥeyγ”[ΙΰžΥ9IŒΩŠΊxOUΰΟrΤ^1ΣiuŸ*αEšά“ZΦ¨‘4WϋOsHސU‰ώ*ύω¨&Θresolv resolv.conf source.resolv#xΪ…ΟNΓ0 Ζ[†ΰ€Wξ\ψ£Vœφ4HS–X[΄$.Ά;T)o³#/IΊ₯S¨†πε';ώ>ΫYT§ΈΙ\­Ό²αPύŽΫσ+‹"™žλΜλΜRz•Ή¨.G]θλμ1ΧV³9χ™Œ=ih έΎlψ;ΚU5]œSϏ™ώxj_'εc¦Fο!Hλl€6τ~ Τ°έ„Βα-σ9( ΄ŠΗ/Œ Šτ62’8Λ±‹_¦)™;ΎL«1‘+ΜΏ'sλ~ƒAα(Φφ•ψ.E Δ€ή‚ή5ΗMbZY–ΡvΛf=° ›cšLl±½Θΐ~œz4Ÿ}RΜDμ ŒBq¦I5bΟΠμυX#p¨ΜωΈ»Μτ}V†vάιtΨ) ²Robot Frameworkrobotresource source.robotζxΪ₯TmOΫ0nې6ioΪ„΄K›β" “¦!PBμΛ¦ImHqŠάΖ”h]Ω¬ͺϋoψ°ŸΉ ‰CZuFτΞυωρ=Οέu©–­ΗΉ]!Œ³Σ˜Dμtγͺ6Ή¦Δ΄LL}vΜ¦‰Ή7;fΛΔ,̎yobsϋ ·§Χηζτ~n§R‘*— HωͺΉ²T!υ,·”©H ]FbκvϋDΚZ)°^–ΚPΕγΙ―ώΡb±ο:φMΗ6,Ί<Ž&β“άΆm―eΣΑnϊwGP#―νΕΫ«3°^ζφ^rΊ]Ξ”ΰ}WπŸόά gΠkεhs­*Cu•κyα«―ΝθbΙΡ₯7‰ΥkσV½Τ^Վό§g³Gεΰ]ΣJ«xdγΠΡπ… ›zΓομώF+pΐείΐ]pν>Iύdύloύ0p›_ed0LΉ,‰©ˆΊ9Ε…βΥE#dΏΕ#_‚܁ƒΗΘ`-ηφ‚ˆˆtϊΤ}¬¨Έ…Ά|S»ΖΠΌήΞ.†…Ώϊ.Ν•pr½ΐٟF%Θt‡ζ"N–ς€D·mc ΪDž›£ΦΪΦΨς-©RλIOΊΰζ ž’RY]"α[d[^~1…M¬‘W―Θ*•΄L'χœ’Š’\+eρΫy6Ψχx7I§¨ˆ3xX:syNΞΔƒάΦV:;+1ψ-˜£LMPpe.κΒDΔ~)_Θ ϋφ1ιI}DU2ΠΗ”ˆ_2pβAŸ(ͺ£˜ςDι=Ρ»¦#υwˆ αΰΦd(.HΊj8 ₯GL-Χ—¨#ˆZ6Pπ"TΕΌ–mв]‘μ²tθIϊp–28δ“Ή_©"!QD0υΧGI€h~-σ HΉm[4₯β"TύΩ/Ζ―OX/‚%nVρ³œςr€—Χhcw΄•¨αc ƒπΡόΚ/ND4Κ’ύ9Ί L<‡ΒBέI%‚M‘λΣi­Ϊ Γ,ΥΏ©ύPSCSSscss source.scssescape(?:{{unicode}}|\\[^\n\f\h])ident*(?:--{{nmchar}}+|-?{{nmstart}}{{nmchar}}*)nmchar"(?:[[-\w]{{nonascii}}]|{{escape}})nmstart&(?:[[_a-zA-Z]{{nonascii}}]|{{escape}})nonascii$[\p{L}\p{M}\p{S}\p{N}&&[^[:ascii:]]]unicode\\\h{1,6}[ \t\n\f]?FxΪν][άFvžžΡΝc[²W²eΛ–=ΊnSΗw―=‚1Nž“IήvZ+°ΙšnZl²—dk¦₯_ΘΏH~NήlX yN€} Θ©:uο"Ω=Σγέ" i²Ί.§NλWΕΦή^οˆΟ;Q^δO£:,g©ž~ώφΥPο Y―'>ίm¨§:ά쨨zάκ¨ψ₯¬x£βW²βωŽŠ_ˊ:*~#+^μ¨ψ­¬x©£β―dΕ7:*~'+nwTό^V|³}ίjοπK΅‚owTT+xΉ£’ϊJGE΅‚οtTT+ψnGE΅‚Ώθ¨¨VπjGE΅‚Χ:*ͺ|―£’ZΑχΫWPqηz{=ŜΪλ)ή|Ψ^O±ζF{=Ε™Ϊλ)Ζ|ά^Oρε¦3ΎͺWΝ¦Σ’¬«p•$7¬Ω'Ξbb‹ΈͺΒI‘Ψ†οΣΞͺJΞw:«*IΏΥYU­ζmoΥ I(όνŒ”sMλΞͺŠΦ»ŽάcΥiYLIY§&ξuΥT}ήοͺ©¦ΛšjφύšJšƒšJžtΥTύ°«¦’ιG]5•T‡Ž Z5ηασ(›‘π¨Œ¦π¬WaΧqIOŸN’4—ί~ζψ‘§O«:*kωυηŽ\ §³~β“rΕ©~Οq(ζP 9Lσ”ίŽΚb6έ’Qš·KόΉ g·šY•£Ω„δu΅ΐ΄·DvUΡ_U”·{«©Π4”Ρ\τK=©Ϊ{aΒΑΡ“ƒΑτε_½‚?Νώό=ϋσ7―ξί?ψΝΑ^TΕiΊχ. ΥƒΑψ叾}u°3¨ωΰπΙ> ~Γnγ'Aπ†ϋΌΫ§Qψβ/Β_―±λ3 φA %CΖχU]¦ωhw–vVΤD¨α–­W–η^+ Ί·Œl/v½λσJ΄nžBΕ?]BΕc‘αmΗ|ΔbΔ°@σΕfšW΅>Ζόw΄χŒ*πžƒκa₯ςσπϋ§α“ύΑƒ`_³e«-Χwy]`2*Λΰyƒ‡ΙI™ΖaMΐ­“B”—Χ»Y”fшμ¦ˆ…ŽkΫ}EO¬Gtœ&Ĉ>i —Υ Yέv£i-†‚ϊGi= }Ν±ΝŽ}Ψ@λΔΛ³X|ν—6Φd«-›ιΈωKf*=^s¨΄nρΪώ·Ψv₯΅'SήX»΅·τbOήάρtTΘΡΈω=Γ‡™gΏ»ϊsŽVΨυŽΟ_ΔΆŸΈp ίΆ³€Y9|•Π‡t7h΅Ž›>Y³£P˜°tœ"Wv‘ε}^ο/o:γfΛΉ½nΛ)Ήl)'&nIJUθξ²*» “€¦ΟtœΆ³δ$¬κω’@ni–ƒp |i6»VωVΘέί\6—•υΛ›νΚ[Άμš‘GύƒxVΥΕ$δθNw$!Γ…ΨK.Ρ›O;n·KκΆY3.»\Έι‡ŽF^^²¬JSΜΰ^n`e1O]έq­@ε ->SvZ΅―ΑόΏίPώo ύτ–p#μΊξcFΜ..ΆŠςΞ’~ΑXE‰2cί/Ι! 4&4Ν³4'ъ ΄`…“YV§ΣŒΠbΚΊŽ˜‹΄ΨŸσ¨»>ςMΟ†(\MY1„vE’Ι*)κ1)½)ΛJAΝZ‚‘?.)u+© θώaΙ"ΌΆ(£;8νάΞ›VψrΟ°•―Ct’ϋŽqh.@9z.D7ΚΣ NŒγc3…Ύj.λ^Q@Ωκ²ΕνŽ$?k¨¦u•σ°$SRcal(7‹>luM"Ύt(qΓ7$γL5…wΨσ Γ~qJ ]EKx{ΥS¬3{ΓςFz͈ά0k k»Θ€μŸXΥ†κΧvVχqۚΰώώdοnπ§ PO>˜\„#‰Iς"―δΈV0ƒ#_료_2‹άbΪ†1‚ˆŽ²be: ’ȝg΅•©’Ž“‘ξή\N₯Π ‰3™pτ€m‘ώδ[W»Κ|Σ;!A )«φ₯]Ϋ>D#°(mcp7°aφƒΑ`큹?Κ4rk.ζ€am“ΫνΐTwmψπΝ /S^ΚΊν#ϋYλΐRyΣΏ(Ηulχ·wΰκ‡Gdψ,­Ca°e}ΰDǁ*%‘ψ_¬˜ηiLΰ›ώ˜€£qM€Σ¨š‚*„gΐ&Hr Aΰ*₯€C φqK'φxΗt4ΙΓ Yΐ?ν*Χ57Ι… Zc₯".œ„ψ°ƒΕΒf[+ αwώ«A?ήjQZλ+•aοqπi°„‘YΑn6Ρ`y!iEϊ°$Ή‹Ϊ΄sέkωF=‰UDξ)ƒςtπψΥΓMκq£υςB,όθRΟ―ΛΦόϊ8Α€Λ£/+™έP~}Ε£±'=’Λ―››’―ΑmnχΩ‘ͺΧΌ@ ψ’ύ[{»'εΚl<δI]=Ν‘©Sϊ FήΝΏίθv ―Ϋt·YΑτZ[·ki‚4Φ)ί6ΜFΎτR³vc*'ŒkΎ|žμ³ΆΚν[Kzlƒ΅_Sο^ŠχΝ9ωώAŸ½ec@QM'I³β¨/τ…ž“mp‘}½cPyX”τhœfδΟ…Tλύί©ι!%τνˆOƒΰ{mΓC’"XζΔ_·ˆΧ ώ(*sJΚ²( Ίo5Π-χ:X£3§ωƒ ―qš2œ–`³:ΎΓꏺΰο5ό‘EςeƒdFJQΤΡw;ˆ-ΦF³Ά'o›Ζ€οZdέι ΛΨζ:KNή°8Ή#)f$Ocΐ:$Θπ#σ|d‰<χγŽΩωΞν¬0›sNS)βΤ,ΤΞRΫτ?²¦ί7§Ÿζq6KΛË0ρώ`7DΗeΓω Ώ+“ΦKmιXDύΜLs!˜¦ιS¬Ε§…‹ΣΉ©έΆ‰γ6eͺHIκY™― "ΨΰΜUΔ^\Ι5q΄?ƒ'π‘`©™v3άY ΑfMMσ2ή-Ϊ\t¬ΝͺΗ¦ΘCφυΜρ-ΜُΗQY‘šͺ† ηuxΘp4˜rη|?κ˜ο™v΅^gΨψ۞΅jΦQhΎj,uνο§{·ΑΦz:ώΌΘωόθλσk2­ φεΉ"7>ξkXό kρέSι'ΧI,Ν!—J“έ4ΛΘ‚@kH΅usAΥ¬“xώ¦M2ψ¦%ƒ*”εiۏζ9kC‹6š:{Ϋo8Ašε©ιnMμŠ…ΜσΧλWΙ+Φ Ϊ†OΗpΛgΪΥXKμ?^΅δμ‘­(μLo Žcοΐ’–μG’Γš–lh§ίάι`<9Ό~4΄ΜςxΚ›>vN+2KŠ0Ξ mcε΅F·&#Ÿήjš›Χotή³fπ–1FΗZό²θθ¬R Βtγ Έ=³ƒ\Ÿ,MΒ{†Άz‘«§δ˜}Ψ‚edΥ<ΕӘY.­.MSώ΄mΚώ_ΰyyš#m[‹ύβΘΦ–K1»<ΨΫοΞό{Cωͺ/]ixy껆ϊΩPώ εΨπχeCω7 ύό‘ώΧ-‚pα„<βΧίΙ…²ά6Κ2ΝJHm‡eΔ’!J&Γ’ͺHBΗQžŒI–Π)μOΦμΜΜOΈϊ΄ŠKBΰcJH<¦u=§υs£‘pΘΒωύ –”lrς„ΒζC^Τ΄Θ³ΉΡιŽcΥΙ—¬₯±·kuξω”ο6ω΄dέΆξN›βo―(ϋΦiΘ{šΑ’™€ΩœΓ5οΖ{–ξή—ψN4zj-Τjœλ=k‚χj8π΄\’VΣ,š‹γqΓ(~Ζψ˜'!?GΕαΉiQq&Sw^p± Πέ©‹)- „ΓKγYYAs£?uFc0ϊ<­aš±ŠΓβ8¬°-Οϋ<{ξ10hƒ=€Π°¨„e y‰Έg£±χdΓ±¦`% τ„υ^ΰ>YXԐπΛ'€xΣημηβ( «εTφΔFύΉš„½ A!€Β2JY₯jaί 8€x’bπ8#QΙΞ/†‚έlςγ()ލˆ1xb\Ψ1Sδ·Ψ³ž£ ’"^ξ΄Ξ"p­ζ£ ­ao#,`Ύl{Ž#Ίη_€Vζ ͺ8^$(δχŒ₯ Νb €@φΞ)σQa’Κϋ`6„^’jΕd˜Β~Aΐkφvσ‹Έ£ϊ9–5ϋ|-ΏΝι!GΝoΝFΘΊiΑO†δ9{ΩΩΣ«ρa'ύ `‘τpŠε¬kM²Ω†/²3ΌθΪχ–ι•ΒUœΐφΧ…Δμ@JˆΡΙMƒK Ά¨ΚXΆβΜΑFf‰& Ž¦αΊΞŒξkΆS‚I(f΅e²T­ε°$Ρ3l/…%,€BΨ* ±Γ4ρΦ ΨͺΠxf°uhθ?—ͺΒRj‡x”–ςΈε ₯Ρ3Λ’Ύƒ…t™‹ΔψTζΐmDqxΘ tύ&oN˜–Κ !γΩ'οΖ~υΧΪνΐ^<‹gΡN˜ΩΥt–§q‘p˜&©)Λ }1›$+Cs°ͺ†Ϊ)K]”S+4 τͺσGˆΆ'`Y‡`cΙq¨ΔŠ[%`ε3ƒ)°€ Λ‘Ω% Œ18Ϊx]@λbΓϋεΓ€4™“αiY2nΌυΠ —Έ !G…‘C0HUšN3λŸίH*E‡LόŒ5fΌGγ”‚isΤ’ν8'»•“ΧΛ"JLeκ`Œ¨ΈΛY)ά$2B7‹κ:ŠΗ ΖΉΥΤJ†„IvHK2‘>COήFΦ}΄ΔžΉzθ&ͺ‰.|ͺ`§‰Iκψ-π†<¨’|]΅–‚Σ¨ž‰Εζt²έΉHA―PA6ύŒ„ !†ͺrμ+u;³™β Υhy†χΓ¨J+Ό5Dš™t\54·¬Œ―—nώ˜Γ–DΝΞ¦σ']ŽD¨rώγ%Aͺ:£L΅ίXƒXh«fŒ-¬½UQ1Ρ(ΕeυΈHh§&:b₯?AAgX0ω8av)'PΛS§±ˆ¦¦ήΨσηYΊU&„o’8•)[X”|pό Mad@Ώ<…ΗΈB _˜uqΩQ@{©g”ΆfΈ@Μχγ·y¬¦hƒq₯λ”ο΄³ΚΣƒ++χ–ΉKdXSώ‡7¨‚Ξι±Μ(0FYr/~ŽeSνM^ΒίΤ 4¨Ž,DΖΤΘX‘Πb$‹x-±,κqχͺˆ2N™h™²9ΖD5ͺ03ΊΡ:x2ΥΙ-ΓΤ\HŸ©ŠyPB­ΰƒ.ΔNΈ‘"š!9L‘Ψ_ͺƒ,ε‘hN Ο„Φp^2»pΛΡ)‚:e SγI…ΔΪqχB€œrζ98ΕύjV†.’£ˆGP|k8Β8‡ο*qΈJ†σ:Ύ“‰£€7$<©RV•¨ŠΖLΊξnΓβI Ε2a( ζΈTš ±X’ŸY§<„Ÿ˜ ”e‡Η˜@ι –‘Δ dͺ ½hμ Wd{T›"ά‘z›ƒψ²©ωΖΦΗ›Ε~‡A2%U"ƒeΉMDpZ?SάN$Ώ₯ώμέΞΌτ…›—bΏMa½Τ€½¨“£R W2@6jA`φ…fΕέRΟrw„a>ώs'L7•Δύm&y<£η)€~5•σS»Τΐ9΄^б]NqηŽ2ΐqTκ$‹ΉΌ©GͺΆŠ8\+±#*S_ΟγΎΜBζκ$­t!α]ΏŒlΦ%56*0zό”ϋΏT¦Ω ψ ³XΉ§‘bκ T܊δMmsΔχ{h΄€Ÿ)wφnŠ…·ΨΞΜ„ΰž:;–zŒZϋ¬b 1Nj$‰ό–βΎ—L·εΰ|ρΒgΰJr3‘ͺ šκtΩΚ”Ω5ΆVΐ-£sζ‰ΆΪ‘Ϋ4Β…%R%Eu[Jθ-ežIq§ ²ΘŸ%{|h‚)>š¨'θΏ„8Ό)£ϊ―‚ΐn£Βλ‹' ―otΞΚ ¬­ί€Δs<–MτžΌ\%qqΫψλšξ‘Ϋ«n’₯mτό)¨ΌΨ-,χӚ BςΘZΑΛϊˆZRΊόο±u―q£Τ†-η―ώ_όͺω?Κμ­υטšxΊ»Ρzqώޱ ήSasssass source.sassabsolute_lengths(?i:cm|mm|q|in|pt|pc|px|fr) angle_units(?i:deg|grad|rad|turn)break&(?=[[^-_[:alnum:]\\]&&[[:ascii:]]]|\Z) combinators(?:>{1,3}|[~+])counter_styles#(?xi: arabic-indic | armenian | bengali | cambodian | circle | cjk-decimal | cjk-earthly-branch | cjk-heavenly-stem | decimal-leading-zero | decimal | devanagari | disclosure-closed | disclosure-open | disc | ethiopic-numeric | georgian | gujarati | gurmukhi | hebrew | hiragana-iroha | hiragana | japanese-formal | japanese-informal | kannada | katakana-iroha | katakana | khmer | korean-hangul-formal | korean-hanja-formal | korean-hanja-informal | lao | lower-alpha | lower-armenian | lower-greek | lower-latin | lower-roman | malayalam | mongolian | myanmar | oriya | persian | simp-chinese-formal | simp-chinese-informal | square | tamil | telugu | thai | tibetan | trad-chinese-formal | trad-chinese-informal | upper-alpha | upper-armenian | upper-latin | upper-roman )custom_element_chars;(?x: [-_a-z0-9\x{00B7}] | [\x{00C0}-\x{00D6}] | [\x{00D8}-\x{00F6}] | [\x{00F8}-\x{02FF}] | [\x{0300}-\x{037D}] | [\x{037F}-\x{1FFF}] | [\x{200C}-\x{200D}] | [\x{203F}-\x{2040}] | [\x{2070}-\x{218F}] | [\x{2C00}-\x{2FEF}] | [\x{3001}-\x{D7FF}] | [\x{F900}-\x{FDCF}] | [\x{FDF0}-\x{FFFD}] | [\x{10000}-\x{EFFFF}] )custom_element_tagsC\b[a-z]{{custom_element_chars}}*-{{custom_element_chars}}*{{break}}custom_elementsS\b([a-z](?:{{custom_element_chars}})*-(?:{{custom_element_chars}})*)\b(?!{{ident}})duration_units (?i:s|ms) element_names\b(a|abbr|acronym|address|applet|area|article|aside|audio|b|base|basefont|bdi|bdo|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|content|data|datalist|dd|del|details|dfn|dir|dialog|div|dl|dt|element|em|embed|eventsource|fieldset|figure|figcaption|footer|form|frame|frameset|h[1-6]|head|header|hgroup|hr|html|i|iframe|img|input|ins|isindex|kbd|keygen|label|legend|li|link|main|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|picture|pre|progress|q|rp|rt|rtc|s|samp|script|section|select|shadow|small|source|span|strike|strong|style|sub|summary|sup|svg|table|tbody|td|template|textarea|tfoot|th|thead|time|title|tr|track|tt|u|ul|var|video|wbr|xmp|circle|clipPath|defs|ellipse|filter|foreignObject|g|glyph|glyphRef|image|line|linearGradient|marker|mask|path|pattern|polygon|polyline|radialGradient|rect|stop|switch|symbol|text|textPath|tref|tspan|use)\bescape(?:{{unicode}}|\\[^\n\f\h])float4([-+]?)(\d*(\.)\d+(?:[eE][-+]?\d+)?|\d+[eE][-+]?\d+)font_relative_lengths(?i:em|ex|ch|rem)frequency_units (?i:Hz|kHz)functional_pseudo_classes`\b(dir|lang|matches|not|has|drop|nth-last-child|nth-child|nth-last-of-type|nth-of-type){{break}}ident*(?:--{{nmchar}}+|-?{{nmstart}}{{nmchar}}*)integer ([-+]?)(\d+)nmchar"(?:[[-\w]{{nonascii}}]|{{escape}})nmstart&(?:[[_a-zA-Z]{{nonascii}}]|{{escape}})nonascii$[\p{L}\p{M}\p{S}\p{N}&&[[:^ascii:]]]property_names)\b(?x)( display|width|background-color|height|position|font-family|font-weight | top|opacity|cursor|background-image|right|visibility|box-sizing | user-select|left|float|margin-left|margin-top|line-height | padding-left|z-index|margin-bottom|margin-right|margin | vertical-align|padding-top|white-space|border-radius|padding-bottom | padding-right|padding|bottom|clear|max-width|box-shadow|content | border-color|min-height|min-width|font-style|border-width | border-collapse|background-size|text-overflow|max-height|text-transform | text-shadow|text-indent|border-style|overflow-y|list-style-type | word-wrap|border-spacing|appearance|zoom|overflow-x|border-top-left-radius | border-bottom-left-radius|border-top-color|pointer-events | border-bottom-color|align-items|justify-content|letter-spacing | border-top-right-radius|border-bottom-right-radius|border-right-width | font-smoothing|border-bottom-width|border-right-color|direction | border-top-width|src|border-left-color|border-left-width | tap-highlight-color|table-layout|background-clip|word-break | transform-origin|resize|filter|backdrop-filter|backface-visibility|text-rendering | box-orient|transition-property|transition-duration|word-spacing | quotes|outline-offset|animation-timing-function|animation-duration | animation-name|transition-timing-function|border-bottom-style | border-bottom|transition-delay|transition|unicode-bidi|border-top-style | border-top|unicode-range|list-style-position|orphans|outline-width | line-clamp|order|flex-direction|box-pack|animation-fill-mode | outline-color|list-style-image|list-style|touch-action|flex-grow | border-left-style|border-left|animation-iteration-count | page-break-inside|box-flex|box-align|page-break-after|animation-delay | widows|border-right-style|border-right|flex-align|outline-style | outline|background-origin|animation-direction|fill-opacity | background-attachment|flex-wrap|transform-style|counter-increment | overflow-wrap|counter-reset|animation-play-state|animation | will-change|box-ordinal-group|image-rendering|mask-image|flex-flow | background-position-y|stroke-width|background-position-x|background-position | background-blend-mode|flex-shrink|flex-basis|flex-order|flex-item-align | flex-line-pack|flex-negative|flex-pack|flex-positive|flex-preferred-size | flex|user-drag|font-stretch|column-count|empty-cells|align-self | caption-side|mask-size|column-gap|mask-repeat|box-direction | font-feature-settings|mask-position|align-content|object-fit | columns|text-fill-color|clip-path|stop-color|font-kerning | page-break-before|stroke-dasharray|size|fill-rule|border-image-slice | column-width|break-inside|column-break-before|border-image-width | stroke-dashoffset|border-image-repeat|border-image-outset|line-break | stroke-linejoin|stroke-linecap|stroke-miterlimit|stroke-opacity | stroke|shape-rendering|border-image-source|border-image|border | tab-size|writing-mode|perspective-origin-y|perspective-origin-x | perspective-origin|perspective|text-align-last|text-align|clip-rule | clip|text-anchor|column-rule-color|box-decoration-break|column-fill | fill|column-rule-style|mix-blend-mode|text-emphasis-color | baseline-shift|dominant-baseline|page|alignment-baseline | column-rule-width|column-rule|break-after|font-variant-ligatures | transform-origin-y|transform-origin-x|transform|object-position | break-before|column-span|isolation|shape-outside|all | color-interpolation-filters|marker|marker-end|marker-start | marker-mid|color-rendering|color-interpolation|background-repeat-x | background-repeat-y|background-repeat|background|mask-type | flood-color|flood-opacity|text-orientation|mask-composite | text-emphasis-style|paint-order|lighting-color|shape-margin | text-emphasis-position|text-emphasis|shape-image-threshold | mask-clip|mask-origin|mask|font-variant-caps|font-variant-alternates | font-variant-east-asian|font-variant-numeric|font-variant-position | font-variant|font-size-adjust|font-size|font-language-override | font-display|font-synthesis|font|line-box-contain|text-justify | text-decoration-color|text-decoration-style|text-decoration-line | text-decoration|text-underline-position|grid-template-rows | grid-template-columns|grid-template-areas|grid-template|rotate|scale | translate|scroll-behavior|grid-column-start|grid-column-end | grid-column-gap|grid-row-start|grid-row-end|grid-auto-rows | grid-area|grid-auto-flow|grid-auto-columns|image-orientation | hyphens|overflow-scrolling|overflow|color-profile|kerning | nbsp-mode|color|image-resolution|grid-row-gap|grid-row|grid-column | blend-mode|azimuth|pause-after|pause-before|pause|pitch-range|pitch | text-height|system|negative|prefix|suffix|range|pad|fallback | additive-symbols|symbols|speak-as|speak|grid-gap|grid ){{break}}pseudo_elements‘(?x: (:{1,2})(?:before|after|first-line|first-letter) # CSS1 & CSS2 require : or :: | (::)(-(?:moz|ms|webkit)-)?(?:{{ident}}) # CSS3 requires :: ){{break}}regular_pseudo_classes¬\b(active|any-link|blank|checked|current|default|defined|disabled|drop|empty|enabled|first|first-child|first-of-type|fullscreen|future|focus|focus-visible|focus-within|host|hover|indeterminate|in-range|invalid|last-child|last-of-type|left|link|local-link|only-child|only-of-type|optional|out-of-range|past|placeholder-shown|read-only|read-write|required|right|root|scope|target|target-within|user-invalid|valid|visited)\b(?![-])resolution_units(?i:dpi|dpcm|dppx)unicode\\\h{1,6}[ \t\n\f]?viewport_percentage_lengths(?i:vw|vh|vmin|vmax)‹KxΪν}€ΫΖ•(%[V\bΗݎcGΕ…” YΆœΨήΔή$Ά•άύ$—‹οίΏΛrν „(ά"ςλυή{ο½χήΛΟυ^υš»Λεzο½)˜1$°Λ•΅2ik §Ώ7o^›7·οkΠηeό«qԍβθ97s’qθ§Οό²†ω±δ{PζΥ5·δSξŸ‘QΥxٌŒɌ—ΟΘxJf<0#γΓ2γ32ΎJf<8#γ«eΖ—ΜΘψˆΜx匌ΚŒWΝΘψ˜ΜxυtͺiΌfz…)ΎtFFΑkgdTM_7#£‚ΰΛfdTΌ~FFΑfdTΌqFFΑ›fdTΌy:`Τ o™žOωΦιωԐo›žOψφιωΤ€_>=ŸοΣσ)„}E‘^•/Fq’₯ΞΘMόH#RwfT–Θ§7ŽΊYo*σ]2+~e…Μ &ŽgξŒƒ0 "•_λχαŠTwŽ”NMIΥΔΡͺ%TwW-‘Ζ}OΥ ₯ο­ZB!χ}UK(4oV-‘ΎU΅„BύcUK¨EpΌj ΅$ NΕ&rŠ~’j …$T-‘zu²j …$V-‘δ‘ͺ%’œͺZB!ΙΓUK($yUΥ I^]΅„B’G*"‰šάG+6qJ!ΙcUK($YͺZB!Ιkͺ–PγxmΥ I―ZB!ΙUK($YZB!Ιλͺ–PHςϊͺ%’Ό‘"’¨©z²b+$yͺj …$OW-‘δtΥ IήX΅„ω›ͺ–PHς>'WxߊRύ—ŠN½Ήb…Ro©X@aΤ[KΩ£vK―χ«Y‘ΕΫ <•Θ‡qβΈή™qšωIKυώυΚ©φή^―œBΖgκ•S(ωυΚ)Δό―υΚ)lϋΐzεύ·zεξ}P½r ?Έ^9…‰οί·–”+A“•JΩv΄+eWH±Z)»Β…g+eW(π\₯μ ςR)»Έ[)»‚s§Rvήn₯μ ͺ^9Ɉ‡C?ʜNwΧr˜ϊβϋ¦ΜaωyޞψΎΓΜ›Δiκτ\Ο/!_ύΚEΪ Δχf(0Œ=SΟΜΜͺj=SΎD`iΔCΗ}n έ,N΄&Φκ•Sν…υΚ©U0¬WN-‡¨^9΅.βRάςβ‘«m^ωtŒ*eW³pV|ίfdοΑΦXΎ%Υς«ϊΣjωΥμfΥς«YWΛ―fs½Z~Ef6ͺεWtf³Z~EhΆJH/‰£lϊ?Ι§ώάΜ¬j֟ί&Ÿ'›wά€?FtΣΰΚͺ–Pmœ/-ΡO\/@L.ΑwV-‘ΪψοUK(όωUK( ϊŸUK(ϊ_UK(,ϊίβϋ£D0tϋe$ωTΙ­ζθCK{Γs§~VR‡U-‘Ϊψpρ}Δ,βΠΝ|OQ.§{[y[!Ύοš]RΓ”¬SJυς£κ”RσΡuJ)¬ω˜:₯ζ|¬ψΎΑ(…{ΈΉC}γόΈR¨ί 4K‚¨Ÿηώψ*ΉΥ<}B)!ϊ^ΰ:gΗ~’οKw“a έΝΜϊ€JΩUG>Ήt:FI<ς“,Π§γSfεTu~꬜ πŸ6+§φ§ΟΚ©ό³r*’π™³rͺ-ε³fεT›ΙgΟΚ©ΦΟ™•SρͺŸ[Šθ"η–³ξ†cίΩHάΡHί«>―!G©?φb§ΊiͺCχσ«δVώ‚R$+ζV•a•ΚR|Q•ά 1ΎΈJn…_R%·B/­’[!Ι—UΙ­εΛ«δVΘςUr+„ωΚRπ$~ίί•Œ―ͺ”]«ΕχFφϊΰVΊ„ρψšP‘’ά_[Ί=Rcψ:ρ}ύd‰‘;ͺώϊΑςŒΑ&0θ 6 σμί`ο7Οξω½<χ7VΙ­&ς›μ)r l_ΑΊΎPΏΉF!Υ·”ΟΞδ­32ͺΏ­”ziU•ί>+§ͺσ;fεT$β;gεTδα»f HUωέ32ͺΏgFFEkΎwFFEfΎoFFEaΎFFE\~`FFEW~pFFER~H|›*q–Π“žWΑόGΔχyG‰ί Κ8œ­\D΅ςc₯=ZwΛ¬ψ?>;―ͺχ'fηUφ“β[Ί=χκδ―?%Ύͺ_ΣΜM2ωσί7Ǎϊ‘οd[#_ζx—ψ–ώ@ϋAώώΣβϋζόwευ€Œ„‹π–™¦°Ύ&]$dΟί/U95™ιη X6‘χ—ΎP›‘Β—™~A|Kωή¦Β•ωqzώ‰Α’ψΎΞΘ?Qν/‹ο—Ωώ&gΘTΎ_ίΧωΜ<Ώ:ΡδpθΒfC dΆ_+N”™~}’½\M)σό†ψ–βG‰QfύMρ-½4Ε‘Μς[Ε Ά(Τdώί.¬‘_1΄(‡ΙΌΏS@|/€:S―0w=›Μφ»pυA2ίομ…1`ΏΎ~_|K'΄^βƒΘu·Œ\P˜7MI$³όaa•MͺzdΞ?ί―(ζŒβŒ!ͺρX–ωγBν“Κ™σO 2Υ2ןκ›TVȜV˜BžSŸœ?/Φ ά£εn—Ώ(`3²}€›^Ϋ»ΕχΛ΅<εJYβ/Εχ-ΣJ¨>όU‘·kώV/$]zθGύl`tφ=…ΙΙ52ΗίΐaκdχŠoι£ͺo&[ήΠέκψN†~κ‘½–ΉΠiM !³ό}aΤ 2Ϋ?jŠΖΓNVXdρ“ [ ‡ThzάΤ-’Ρ?ζ2žeŽ)¦‚Πά…UΉΪBϋΧΒΜ• Ω2χΏ»iδV•ώ{aΜ¦Ψ&sύG±2žKPQ•ν? •»aΠ ou²)½¦eeaNωVOdKγpΜ Š6ΟϋE6Ι;”ΚzΚ»zŸΩASΖSΥϋΜ55)Ϋ)ίj‘σJ='ΚtΚ§Ί0ˆ‚,§<ͺΛϊ₯€2εN]6Τ’`₯\ͺΛͺœ Wν3qŠr₯έ$eζ<Υ†{uY8φMfΎ¦¬ΐ~nG۟_ZΜ%I"Ϊ±-Ξs‘ ^W¬†θ‘ T9RͺΙ`Γ6ιz‘A21γ(θΖ@όΰiU¦φ™ή8:;Ž‘8Ck] §ΤEΌ±€ͺŒ™ν¦}排Λ%ʁZδΉQΛS.”Ά§PΞό+ιΧύΘΓι§•σ΄Θtϋ>cηDάΟά‚«?α»έΑ „ΆΎή//<α_L—μ€AC›Λ7—‡Kw·Zκ§ύκI νN3ˆZνŽμγΝωΞΈ'ή Ής.ξΣΆ«βɎ‰Ο>m>+u8²_·ΜΔo4¦ΟD1ύΦ}υfτrKϊe–τ–τ+,ι7Y―*ΰΜ­:Ξ(f©αμΧηY"h;=6δS»)[”^Τ#llLόΥ 豟ΔγΡ‰Žί’ι8qY£€‡νCQlςΔ ±ΐ³.^Τ…σUϋκαΧΏ[ί«EnIΝε%ǁ?++N{cu₯=zώΝηαΟ[πΟ3ψη­ηο½weeιY7νΑ*|do·ΫƒηΌΥηW΅³vΤξ­.³v{εY|lV[­γΜY¦jŸss―wή1Ηͺw‘·ΗZ3n2φ‘’άsdΈ¬lZ―³€η·υιVΈ­Ί§ nIη-οΧ±χϊ2β½Σ%8 ‹h')k”ΛμmœΩΆ¬υPΙ,δRη‰|dωpεΫ…›ΒvΡN7W8’t{ΞY=Φlk-«αν»¬0’"=“ϋ ςI €/ύύ)[fߏHΒ@φ˜r_f‘0R8'2YγD0D•—#Ι¦’MŠΕ€₯ƒxƒ @zΥΆΓ»,έΕΌζN―h”₯ΉdƒNa»™ΟΨ~ˌέnιVR:gΫ ΰe}?ؘι5H`78ΈΌΑΌiύ‚vO‘έΣWhΞ!₯žp’Τ“Τj4ΫXKςαhIE©’Q=X^\8;Ρ΅m:3ρŸ—•ν]s—8Ps‡’„U€§ΦT’΅Ώ +L^:$·5a‰PN@ύψ{±Φ{«S΄ ]9o‚&ΉΦXΤ™Β¬«`’-Ή»*ŠwuΔΦ%›˜‘οg&ŠΔcTΧ€t½5‰0—ms*Qτ2Β°Ώv7ihά|]K¨³Hω9{{mZΆW59ZmeΈyd:μT΅vΌ|i£Pe}V³ξΞyu-ξ,E‹ΒΘ­­oƒΡύϋo/λ€wI*,6ώ’ ½ξbΏΩB”o±€₯ž}ˆ;~n-› ΞΎη‘σΔχB™ hxtV>hΊ> "΄]0P4¦ Ϊ`1&Η`Ω…>‹GˆΙ.RώΌ}——,]όάQΦSΎ/.Αš kq*Σ§δϊγlΰ'₯B-^b.<ΐ{k’U₯…!ΝVE„Έb‡«²ξΰθz?©u&*Ό`’‰In-7 Λb‘Ρ#`uΩ–ΐ]7K+7 0ηΔ :\—šχ· /―<Ώͺ­M[[LG7ιYβ&[NβόŒ'v΅…@t― !§ξ6―LΎρσς²fΙΨ:r»ΣΉάΊ;Dέ%[eΥPω²!ŒP;1O–«β²·ι4•…­;₯?cιωΟ6Κ?ϋ›BU4Ήπ¬Σ‹‘ΕR5€Ώ™)©»ήΚ ΣGΚ$νȳ@\ΰΞNΪΆ»b΅ͺnšτ)$Κΐυ+s\_ΉΏέZ-ƒώΞuRΖNJλž¦>Λ’±Ο’qjͺkΉQO*Γν‹₯¨Qš­ΩΈb:Ξμ\³1kλΨ)ϋ/…!OΧ\•­b\:%Νν+³J󕍝ΑκŠ]Ϋ³φ›ρΌaI·qPΧθ{ΊΤv.„),L 20ŽvΖ™―D+jjL‘Y†ςδ«lεh^u>Νε`Ι2“u,ρ‡-He”ΊΎΑΦlμ„πΗέΜθΩpΘΞ‚26κ²Ρ&λ%ωοžίgθ΄Κπ_6N’ό§” ΣόνMηΨΪ›ΞiGσFP½7A{u»£Hέ„ϋ!π―½^°Y ˜u½ΙΏZς“%ύWg,޽FˆŽΤ'D·KˆκΒζΟυΤο]b°Ή»>l.Ÿχ&ρήKlNο­?§ζ=§ΧԜλ›φθ\7λΟυΆ™mωKϊ?Φ€E{ߏՇΑK.}·ΑζŸ-ιο© Λ½ ³ϋλΓlΫ{ς6υ`σh6{₯γΤGͺΉo|6€zΧ%†$֟λΉo|/vœΊˆρύ=—Ψ\Ώͺώ\_0!².Ύ_jΦ#{U…Αεaϊ,”šE₯¦œi2”šσPͺ4₯+Oρ ˆ©Ν;Cαώ–žRτ}²Q§φz\Ί„Χγ^Αkχΰ~υn½ςΠϊƒω Ο }F‘jΠeεYη9IήzΎέ^₯υ―–?kΏcΒΖ'½Ή₯e> †xͺXΆζDεfΗ½ŠOμβJ€£ δ޳Έ&\Žΰ’L%fp;X^μLιλvq‘Ση„/Τy5α+ύ€LO˜]‡ζ?_bP~C}(WΦoηxΎˆ³ω‚˜>œ’gρˆ%A±Nœeρ…~/coΕOX7ŒS?ΝŒΟΓz@ης­΅W Λ,T,~v$’ΟΪ†ωŠΎLlκΑYΤέΔν]'ˆΌ  †m7ϊQΰFπΨρ£ΎπΤu‡Ψγ©έ ι†>Α»gΦΟοC7o>B.άr:‰u"qΰ»λ~©iζ!MqBίυp>η'1Υ—Χεωλnδφέ[χ‚Ρcœψ‘‰g¦T#‘B΅ψΩ ˆGxΏέ!©οΗIŸwΏ?>C.sτ˜ Ηk|ψΔί βƒ †#Χ ’xΰj πxΖΉ‘ŸϊN/NxGUJρ4ͺc͍"Χsι)sΧτΪd> <œψnδ Π*Μ+ϓϸ–TΩ,€‡.ŸΕ0ή‘Ε GԞxΛ‘Κϊ‰ο―©7Œ„“–ΔC7’ͺ bw ώ!Τ†qԏC^Ηpˍ†nOqla3°²@”JƒαΘιs¦ŒTcΆ³c7ρα!s‡fΝόpάγΓΐEθdA¨―Ψ³ ¬} ψ³ΓΜΨX½)#Fγ]…abtΧ^<ξ„Ύ“†n:yαΠΎR&±`/­ˆΑE°"κbψŸΧ€bU|Κ"Aμ/¬šyQΞΚΕ¦<£·2ΟϋMͺ#Gω@w)ŠϋTΰ”-έbeΧξ[TΆΣΚφ ₯;Ϋ¨MιζΈ3lγςZζ ΛFι2λe£ΦCv[=κ’³½°΄>ΐgΛ·9Χγ‹`qΤΥ¨^jΒΙΖE Ύ_jΚ³­‹˜ζΜ²€».ZΟοb?qΖ_Ϋ C=}€›σ³Ίψ!£¨*+T¦ή^ϋ±P€βx«žΩ<^’τž›‰N^›ΟmήΟΒοŸ ΆCv,Μoί(€χ–ͺΰέ]Δ<ί°@»—Ώ--Γέ—ΗZ}XΝζ©l3TΪt ΏlIKΊΝ ήζ!]7ζn߈{•ŽψςΚ²vg4#χi7Ϋ­ΥγΉQ%F±-Ϋuινκ ½/BŒͺ½ή¨½)μXGBŸW)Θ£ι͐Οa]³₯ΌΔ4[b¨α@ͺΰrGδχ5Z'dΕαX:(ˏΞfρθ‚{θΧΥwΎXΞfΟϊΨyΑN5ΝfτΙϊΧχPε¬ψλς% Ÿα―"ζ~±!ζksΜZΝO-0? ƒQZ;~@Lύj5AydzΔU~R‚ˆ6=κrWφxDί±y>ς '‘Θ―GA  AΛdDGΈj±(*.Š­Ώ(.X€ΰΊφ–νΪUφΜ>|2Μφλ’ΕΥ²c+'ΗV·š›';iˆΡxΨκEιΓ·84…cΆ^+ΉΞ‰»'ΤΊ.–¬p[E-΅χ¬8οŏլݹQθψ>[ρ½cZˆ εΒ,q^^p•Α­ϊ|—TR‚)τΩΖ₯ρή°omΆK£‘ϊ•]Έ!Υ†ŽŸΦ˜ϊΩ_μv…ά§7ctMތ‰³Y1mΫ΅Νπχ―5ύ Kϊv τΉsΏώ‚/GΎΌΩN/ζBD:†&·ΓK­m»Ωτ7Ξ°1O΅@VΊœΌ@lςλΏM!‚‹2ΥΛΤ ΎŒn0©o»ΕH+n^st‡/ΏE}ήΦ4foi³Ό›g3e3n„ίΉhzkEuϊEΠΥλfθbχ }ρA‘Λη £ύϋwθάeκoοU ~ιή€ τ‘Β3 W0 †‚ڜ ’o-,•Τ™˜d0E½Ψι† tžνΟ·η@ϋε΄Wμ hOε ΕΘΞl‘λΐœ>RmΫl8ΗW—Qρ|yΤ"] ₯!—~ ΥQšbπ`ܱšFΓͺ›ͺ›‹ Α &ΖΫΫΑΪCΚA'©9 )Q΄ΜŠπ QqΤ‚DœΒΠοC·eέ΅½zί]θυ\Ž“νΉΓ–_X‘Τΰg―θ$ΏΊΡ¨K +Gήi€Γν{όΨPο ƒ½Υ^cUm±ΚΪΖίΐ‘ΖΖτέ‘ύ„„…{UYŠf½m %ŸIZ›ν»[Νέ9ι<φœϊ˜ gυ˜0c©Φ.³4/,λ@’]4xςΝ³Ό,=U5`Ωβ.΅-#ΤΛA· κ±PmnG·Š (,»‡ΐ±©Fd}‡ν$_>Ε%°Α«bΜωχΖt‚JŸ…oHΉoΘM⻨n%`M‹ do‡„zbӐX”cς$Ν5η°gJαΫgQΰŠ«Ρ₯½΅±2ίΤ°|&&μʜiYΉΏ½ &·J€γR ƒˆRπψY¬Β,E}±ω—μΫ6ο³£vΎΰq-ŒξKqoΕynυxQx3.vp3  q¦yŠΩPο»σμοe ς=›|―²ϊκ βΠ›v¨νDζΞQMΡε•"·`!sb,Σ0ν;«bΪzwσy±uό@iΗWλwΌ”ΗΊχΛYέΊd(')ΙΉβΗΨ³w―.?ެ³šxێ{ŸψžΤWYq₯ ΏKΗνΐώZϊW‚χYΥ΅ˆΆΎX>%Ήr)5ΰaιφj{εΎ#«;Ά©γVΧNY{΅Š1|A½+PοZ˜Ύ«{Ϋλl±^*¬—{ͺ¬—ιΎΉšΠ*νH ήΞ!ΆWl ?’wEgρψ.N€ύΨ`{ `?Q`sfφ;z…υΉόΙ†eφ©z‚·Ξ¦ΉθΫ8œΏ-Ι‹))€ρ8ιNͺ)ퟲiψ©i™Wή“§ωr4Ϋ'Zm½¬Wό§W₯w@ 6)οΈ‘Δx?žίgˆαΏlœ H§T+-iψ‡ίM‡%Š^ͺevφœW2ΛΪfάΤ|λK$ρ‰Η©ΎDx]_"†ΏZξPΟΠλqκ3ΨCRγκ6Œ'ϋgτΙ6aμΝάz1C/ΤΠ?"Ύi, ƒ<4ΖηXάΒ݁›€~Ζ€aΐQζτ0”AE‡σٞXw̘”^τH΅Ι˜Β`δο/²Π·€hQ.BΖPΑXΚΨ[la”φΘΦ2?ιή~ž\<¬^kπ‹ΦoŠ;–”ΎŠήξF“Κ€d b(iΛ‹ΪpΠύΦx\tθςuέqšΕC‡Β£T]kF}e-^mδxX£^ά%§ΓΊMYWυ,ζK6Έ;ΛϋZc 6Œε 1,DΥ‘V‘λGf –·Έ;C½Ξκ[Μ‘jα†0 :•φΠ».½`ΐ–-ξΞ Ό¬«Ε lkY:Kl³F3Ϊω(―7FΉeξXjƒζ<λbCβa#–οB½¬έԝSl‚Π,‘9gšηΊ«.Ϋ—T[Z ,žέ`ΰΩύζjΉ}Ÿ<μZR€™υšs37ύC3¦[ٝY™ι‡VμςeΣ9qL2•7Z·[šθΒQ`ΩΰξΠ¦›ŒžZ3„ΣŽΗ)ΪΫ-κζ†ε£ Ψ‹"Ί52τSχ-HE|χυΣ–3ΫΪ5»ΰ•‡{m>\τT@x™,jidD.₯ ΑΌS{pΧ΄֞υB?gI·1ϋMKϊοYΔ’ώ§–τ?³€Ϋ.½ΉΩb"΅™NQŸ˜ό Ο!H#XάaƒΟ=‡ \Ÿ·$ŸBS―°5%²OmΛ1ΪΊa’­tž½―m`ιΦ°‡smλ- Έβdθf…¦ξ²‚Kjb¦6vΤhμΊΌ±0ξΊα|ΫΊΗhλΎΌ-Ulž’H’‘ί<ΏVνC–ΈQŠS4΅χ}Έ-οέΜožςZΛσmΤΌo-itεƒ>xuΎm7Ϊ|eήfgΌΑwγšωσoϋDΓBϊ±Ήω6uhκPΙΤΎƒΑΆI±oƒυ9#ΣC6Δηψ”7ίζ6š»I›V\'Ρω6ψj£Α[4;ξ]§γŸ ͺoY0Dη©iν=f#Fiζ96τ‚&€&…v^nk'Έ£ιοqΫx‚΄ζσkgΩFΤ&oŽ™Oƒ―·m‡£8άκƒIpn-=eΫ ³ΈίŸΨμ8AΉ§ΆtΪΦRβό‰mΧΚ±bDμ©νΌ©aωL8ix Ό[΅˜wjήΟhV‹‚Θ¬ΓΪΕ»skρmΣΖ|ΐBΑίcύΔχ#Φ Η>sΓΡΐenUΤ’hζS;υώΆΥ9€Φσk磝Η4ͺζ‚•’d/’v$ςΣ=n@@Ε§NθvΧθi% 7:«σλΡ΅m$Ye ₯ηΟ―±fΫDΐκy.£―ω5χΑ•——:ήε?ΆJV•VM8MόΎB«μΥ’P4!©ϊ¦Κπ,ψ™τ;ξςόflΕhXΣK €ZfƒΞόΪZmX\?q·ζΧΜsF37η͈ΫΊΓ­΅ω΅ζΪ _;έΚ¨­΄m5A[}κ<ƒΏ―>―ι–€NOω½ο³Ρ8…x ˆΘAΈξ',σݐοl Ψ»x£n€Ώ‡ x˜Ο MτΖ©ƒοž›x%•ώ°Ζ0CX[|―mψΩ±Οϋ‡£‡‘<ž'>λψŒ©€§%κ|Ο ‡1(A±ψz‡~Ζ:IΌ{8 ΗλΒΆ”Qυθv’%>:Ψtq#`ΑΜUˆ#τντž^aΖΦX7 †)Μmwˍ j~Ζ•ΗύQ-ΡΒ†? |ΔOZΈk= Αe.=Δςάtό±;x΅BόNiΌόΡwσR$²ͺΎΡ›κ‰xήαμ8RžSΜ™ηϋ£Q­ΡCΊΆΕk †ΌόΖ±ΧσΏ“€˜0i0b ϊiΖ;ΥwAXιΔIΜϊƒ8Νxœ*–ΟεδhΘ¨…Aω[žΏu'ˆΐξαΰρ©³`=NΆŸΘΠΕ Xπ^`ρ]KπΆ‰ΕαΓ\Αφz’U’ΞΣ;DH“κšθOΔ9O|ΙρG‘Hύ€'ώ,ΓίČςύUV"«ζ™UG†Ύ¬/‚ΏΠ.<j+…'Pyώ(pˆΏzΐ_TΕ«Β ρ>ΒCKzŽsψ;ΗΞ0π"5½ dέΔw‡π”f[IŒβnΧM’Qξ™˜cL6Δΰ$ΛK܎ [X£θφ9ΎΠuŸςξΰ[ή™‘;r·\hb·;{=ΤεŒjއlox•‘}θœ$•qΊΕ HoΉ©λy‘ΟSŒS p"ŸšFxH. ΅~ΉL=ŸΨς9ΠΣΐ«ΟuŽ@FY6€9„~e1θ6c–Y,܍Șœ §ΓxMRuͺͺ.iυlΞ}ˆ}IΪŸ[ŒιzΪ ΗIΘϊ$–`€@ΉΙ6_yΈΒΞκΊΐ ΝήΥ0xΙ@Lh‰ΎΏR؊2gξΐšϊ°UE]*Γ`τ@ζz }¬’΅₯Ώ“•τ§q€₯&ΏόγšοUn^“)»°S0T—)ƒ‘°ο[;―ά‘›5LXj5Ή£σ7ΙΓkf€X©ΈŸjέwΈWn:•#­‘§lΘΑ΄!’βsς!Γό“:Ή§nβ5q+:ηœtko>ςδ9Ώz;΄B/Ož<οΠΓS―ΦRŸzT€žΦSO‹Τ‡NŸΞSO5œzδ)-υ‘Σ”ϊΰi-οCΠ₯ΒΓSZκ©Σ"υα“Zκ#Όή‡|T«αIΡΪC§ŸΞS‘ RκSh­~Lδ=ύΤ“ZκS§EκιΣyΠ‰T€AΑγva91αΟμ30œξ»—5JMΊ @1ύ•γ96·n4§™²cίαG{ζΨΪfeΚ’ˆo#*k½Ψ«/xhΠΚ±Wm³:50§α+ϋδf•‚±Ύι[{ΣΉE€Ϋmn½cbξ­sϊβ‹j;ΘΠPΟ:Θb(-Ωqι`έK€^ƒ ΙΟm+ ο/· SZn~μŸ—αΫgIWΟiiς8‰ΰWΠu0 t œπ΄ ιNΫ†$σO™w}jZ»€ n²;}ψϋ€ujWϊπΏ*cˆ~Ά½Χζηκφ*χαΖBœgLgχγΓ¦υΓΖΐΫgΜ+@†ΓΎ,υž^YΎ+ήjΰ}³Θx±»ΏnI―ΔηγŸτΑ•ŸH«u²mκu »F—’2Ζ«ˆΤϋP—_°ΙΖ»Ζ/4;εXΥeξΟ·Š·ξU˜zu kY'>Β†ΊΧξ›½ϊισ.-πάQ$?ϟ8v~ακvi»ΊΝγšε4πκ»ΛΠhαasIyΨΜk>ΚΐšOl”aΝ^0μΟc.>ژ‹c₯+haO܁=q@ϊH·4JwKX@Kj}μ4ΎΓEeH~ E–ΔC–Ε%:/Ι/ɐΎζmΏ₯lε―5*°³Σ:vn‚¬©Βσ‡Μί„Mθΰ°Ε0e}ƒ­Ψ:mψγnςΔξ ‡μ,o6Ϊe£MΦKšΏm(·ή^ΒΊΟ‹k°.’k°ΚUi+Ε%S¦–œ-,~\£ͺΤ€ZΎ―’Π$n{œέ‡o”Άsdήν|BΩρSrKΰ>^Ση μΦσ¬}ž½F•Φ­b„Ϊ1J©υZ¨΅MΉρ–τ+-JŒλ,ιb©η―-ιeImKϊO[KŸΕϊ‹oŸJj+ίE/a‰δ’ίΡφZ΅Β ε‹α:mX) ½ΩάF•fφ7¬«ΒϋŠmb”±‘Θ$!sΗ’“ΈΨ?υ:qš‚d3p#oΰOgτaΛHβ3œΚ0!ά₯#ί‡}'Ρ0[/ Γ<0ΈI'‹}²ε Ύ<>F•»¦ΓϋΔFΥ As­€χχyΪϋ€*[C·~ί’ώξ)u΄”ΉPξ+ΕτΆΤσζƒ>ˆοmρΣχ΄ΜpMΖνΊ‰ω6ζρEoϊΎzΖF`Ϋ8θσΒ.φ,ή|ͺb€Μ@dH jAPm±ΐΛ¬γvאΐE", ψ€ Ε)Q?yΉΩ0ε=oPRCg F’ŽP …L‘ΈVΩΧ„r4†Aˆ;ρ¦“η€ύ£:H­Ζεe€Υ‚aΑ€ή:”"ž±5Τ–;ƒΌ#ΧσΠ&JωΞ9¨xά”ω;q–Δ.ήx?ψ E7Ռ°―χ1*― [‘4Ώά­Ψ=DΣ)θ?e.^·Ρή€xc’ρnΖb -κˆιΖΑ“ο·2P’ΨΔι‘€©§+΄d(½P:tG©―Γ&Τ™ώ&(σ`Ό$Œ:#ͺ§TXdRL=€gœR`DΌ².γ>₯’_€€:pΑŽΥ©Rˆ#0)ξlΨΠLλΉfGΥ³)sΒμ,Ε|λΓγ3ͺͺβS7ŠΊkΜ_‡>—•ζΩβΐT‚gΖiτ@ΕΜΑΑΈFvY―›! šU—ύΔΣrHq(AΣ<ΰH’W 1D+Ι» z\Ξ΅{ΓK€IW–’Ια…τ”Ό™;rPu¨UŸ‘Ί 4Ύ[ I7θAΐR@Xv@kΎΖΛKdqbθa€šuB1ξσG₯Ι?Q{ΗωŽΆώ «Šy–Oπ&Φ‡ΣO εQΎ΄zš'ƒΗRΏt Η¨Έa D#β^/it# BT’GΘv$+₯ύ"λ€jςdτΰΥ›.V`–ΐ$Β}χ‘μζ lέΨσNΰ:.OΤ…4IfζvmΩ)J'#ΰχσ)Θ‘N―<Κ1U4ΦίtZUa€Ζ|τΐƒόπ~Θ*9ΒhsŸ'€~tά8.―—šlΪΠCiP2"ήyΣ°.9@Ί9BΩΎΟΡRx>υλ§IΒU&naΥ`ŒsΟ‰S€­°@ήp:N]ηΥΚΑη`)ϊbΛAkQΝ.M₯Ψ&ωDδΕά,s» BΕ[$ͺ™/2ή1yƒbΠ6”{†"žTFζυh =nυΤcRΚD1Π«ξ€°‰―?Ψ·Θ©€ƝiΤ*…M#]ΐ¦~bΓΕ±HD„]Τ;ρšοL°*ΛfYj±BŠ’LHΘM ZιΉγ¦AΚ5”F’Ξ‘ΖΙ-¦μ»ι5ρ¬©τ–§σN¨τΔοω`Vε;¨ͺŒ½ΔνΛ 9ρΑ΄³އ_Ή₯Υιϊ`A; °7=ͺ£λ’Υ! ¦9%κ)ŠχέOδΎ^“φsfΜGŸsruB°”—Qd€7)·³Έƒ?,gŽ4Ό₯”aBLΎ€‘ΦΓdΰn’ο¦ΤښŸD’Ζj Lx2@{.° »AHWOΙ5%|³0VͺΦ ‰ϊ²Ώ•δTMk[P{#£šD- .ζ#”Θ75Q¦ž‚iο0ω:DΊΒ&Ι}Mσ$FΑύ΅ucŽŸT•Fšx{s‡£š§q«!ΜΧ.ςDΦWIβ&‡ΠΔz^vŽ hαΥή9 Μ8€pοηΏFέ"‡ fP `§‘H ₯i:e6Dްπ`”εmlκ«›‚e3ΐEΝ«΄V‘ήA[„£Gΰ€L'ŠΟΙ’JΧqŒZ刦₯0}› <'»a„ώ8}Z^i)Ώγl±‰€ΝΧ o€Ο£&δ™ε4’E)ΎF³€}GΔbp-Π“XQψl" ‰ΤLqLθώ’ζ„[ώζ£s΄μFf‘90 T; ΗυPŠΙψΊ~Œ‰κ§ŠC?―Bκx‰­(ψ΄Ζ‘$ްΈq ©ζ“%Δ€|R΅₯/ĈBͺΰ ©jy~ΰLj |Γ– B•§Ϋϊ£Ξ:ΐKς 5“εΆf¦Ί°π iŒeβ·lε+<δi HΠ°Pξz’‚r½βͺ2R`-εΡ6pz‡nκEπ—(½Έγ,.Œ;ͺύΨγ1₯ε«œΨΒςC ΆFΉ~Ιςaΰ*W"?_ξ Oυπ™Ύ£GtΔi0’ά:2σιΗώλcΣ'‚Σˆœ–»η‚αˆνΘ^IXώ,( ½°Q|“tΪΒη)„r"έJjLρkό–VΖΥjLΊ{y¬δ©ί@ϋB›ŸΈ£Ž©οΡ{ρΐ ‡Tέ)ί˜‘Τt6?Ϊ£S΅« ’ΜΓωο/X%nΡυžRVaθ‹w[ΡΡΣ‰\6}γ§JΖχ͍EγΟU§…Ϋζ–ZσCι >ΥΔoΜMO ηBΑΉPp.œ ηBΑΉPp.œ ηBΑΉPp.œ ηBΑΉPp.œ ηBΑΉPpNΥδ] ή§<ιρIΗΩωωL&NkΖ-MpqROjJ-«>_Vβ5:xE]u)0ρJJZPΎpaέ_₯TeEτgύ–ήξΝφέ- 7 Π8ι<φœσ·α¬›Τ·G,kPg?μ†n"οξδ ηq†τ3μ~L+ά«-ΪCe+ œY˜ͺ /Σ6۟e ωγTjsl‹mJ‰‚‘ͺUg Εaΰ7vr΅Ύ¨— rVdEX‘a™ΰY «cπJ“l’L"[j»X C ’ΎΧτi9NZ(–«H•VM(q g–‹Ώ¨u+*ύψ;S\"±-Μ`OΨWR`H/’‘ώe9¦φ,₯VgUŸ|γγ’ς§PH ΟΈΪ‡σ!|Ϋ#±CjγΉ}C₯ΉRš€tΖ-4Lg/‰³$E(bΈTFά3&₯“@•fœ#αOL“Ι4‘P“-ID£ΙΜ9)Ι„Hf ωMΏΞtUža]•.bYδό Χ—)ΑFJ>βε"g8€Hͺ¦%Oeκ‹ςW¦ΤJšvLΣ‚)ˆ ΛΣτuΔ‘odΘπ‚r‰Η’ck.η„ΘξD -Ιπη -…D*0•P«DY!βθb™ΠΜ› Bρ&τΙR€z.3I ‡ά&#½:±Š `šVOs£° *.bε2.v •ΜLιh€r&ΧξΡ€€<ΘrRΔ :,7„0M­―|ΝxΒC­p‹)J&d)•"ΩiiHbυuώΞΈΑ)ΧQ#+—οMΩ\(ΗΈySXδ”6˜iŠ1Vb™‘yΤpΜP’Ϊ1NVŠV"υ.-Δ}. 2 Νpm*:ΙΝδˆy$σ“RΤ‚“γSφ¦i!I[4‘ή ΒκΞΈm! A{Lυΐ€΄oj–Τ+SΖ$RθJν“ΒqΑη–› ΩΆ Φ² ‘xB=¦Ι»šΪ2מ ->–b&q₯arg1€SMΝeTρ(Δ;e"&· ΧW 5£MΪ΄·YM{ΖG¦+ ΰ™lšΉŒ–Xa%γZP¦‰‘τΘΈeL δ²qžjš'indJΖfΉ@mΘψΒ4γ lΛ|s&Q\YJ˜Π~jlŠ62MΚ—³0:ρέRJ’ŒΫΒZνΞ‘?Ϋ`ί Ύ ±αXγΚ<|ΈM’h5Ο·ZfΕ^ά{ύς™£*2ΦΖIQ~ΖΨ ‰$|μ߁ΰR<©X3^^ρδηE!‹ί Yμ —-ΒΜh”Σd³Ο1 ¨ΕηΖO5l=2ϊEΧ³alΕΪΟmL9κit[ΟП :LMn‡Ψ9ΎΤpΕy\5Š!P›Π9wdpα΅Ε₯‘#k-‹l°4;xζU₯ˆεή„ 6όΤW?lΈ[@’(Ξ$ΘXύ.†pΉήiKsSo¨γ&Œˆ¬f=Ό¦ FΜ!Zκ#X.(έ›‚R n?ίՈΣΤ²oΈ‰‡d1$šœ<ϊHό:0ŒΘiw ˆ¬ζœLΙ 5^ά]k:𓕬? ‹ πM?‘ΙDΆ›Χς…ZΛNSπݜΕ+Έ΄tŸ€¦τ–€2N“ͺ‘ZZ%~@4MΙ¬HFp5’ΣαOΕn²άuJΉ*‘\W[˜τViΚ–5 O#M p-†¦ξIΰ―γ,k*ψΰ°-wa?i…i yaΨ”Œkγr±,xvdϏϋ Ι”b##άΣaι:δ#lxΈ”3AA帍·€aΙŽ;rδΉΑ ΖFs'€d^μυ%–q|m6cKœ†\ ŒΜj YΕτΛ–ͺ*†Cb—$w<p³Έzπ„xΐc‚X™JG#NAΈ©Υ‘τ=vΓό"Š.b556ιψμιŒ iρH>€isΰ“=· ²β|Ύ<\$τxA·α^ΒχsΰƒΘx>.6J’ 0xE_LΆ΄‘B:,qέ–h€2s–€0u€>΄τR&Brl”³οb΄ΚxŒνš ς4Ϊ€nBα }σAGaœEπ ΊI,j  S`v MωPƁo†’)Ϋ‰Γ–0!³ε;Π4rdOGή“βg²„8ρXΠZ³Ž›RΜqg Ÿ"1?ΦΑ³Σˆ%.tm0˜ήΔm!~JYyΑp΅ƒ ^V†eŽž˜ ’ΗΒίMŒζ Κ ˆ£»]’TθΜJβ–Ι[‰IOΞX·XN zΈά4“¦2©5‰7…1_ͺb„Γ¬¬ NˆPσ—$69A“? 8•μϋ1μΉ ?Ώ Đ %cLΖ΄hρ@εω΅+Κ”Τ4ι6ŒΕΉΑ?}€lDAC’ψαδ;€€_ΌΆ`&Hώθ ΫDZš‹Τ:ΐηp²Žhp0ζ₯‰B΄†ν•)]!μvŽ•kΊ„-lΌΌT$vpmΓ1:».Α ±7˜ U€’o€›(‚K`ˆ[γA`%˜1}/Z«TτΔ”u‰ζˆ„ 7 Υs*J1ξ˜μ]mΓ­φMθ 8#*ή₯ίΟiσδΓμ‘GΩ£§Ψc'y!‘ Υ-Z^σύ‘#mό!Q]IV—Ε[*Ό KάP fM%JV™2y·”ƒΠ:5Ψπ}ΉςΈόMŸ½ύoΘΒκ@)χδ#΅؅Ώ°‡ΐί ?ιΊψ”¬¬[^r "s’-””όθj’±€ WΫδ».f’CΠ\šk3UΙ€'(‰uU›D.H,ε$“;ΞΠfΓsϊΐ7 QŸδ‰εΎΤΕ²zΤΣ J ΖΝΘS0…CδoFb_‰b¨EˆΜH š΄Ν‚ΜϊJ›/kς]Ž;ΛTΛάδ&Fag9;ΣMν†?ηό$†ο8XŒ…Έρΰ™τω10pgΕΊγΨ’ΉΧ9iγČΟ,°q\‡LPWκ;„Ζ@` α!R΅7k*Œ91zθ3¦<3ς%ΑΚ@₯Dž_ϊa •£β¨ F-ΧN¦R{Ω$&–£6(aZΊΛ}5άκQ\ήWžzW)‘Œβ—F€ ¨©χ€z–ηH|Ξ#3r½”Ν &9ΊN‰κ“ΈxKO}Πϋ yiš8ρ–™Έ—hΎž(γ€·&Ψ ΊZ‘ΟpSΥ–HVe*°(Ύ³Σ$jˆ\Έύ‚‘+f\Ί€―T±<'αZΣYΩάZ£Θ―ΡhrŠΑxu-UŸΜ†A€=>η:oΙΒ.$}πΌ(ň§¦δ; ‚U2Ž€ω΄'C&\­ε¦Τ,)Α#ΙЈ‘ήU\1& 2άΖ}ςά(—ΒšΉμ™¨Iœ;”‰ά°£γ»!j!ο fQ±*΄W["«ΰΖ0 %Eΐ@υDRώ4ΛOΠ ¦@ξίth}ηΞ‘$©69ͺsϋ K#tHŒ1Ί6βίΗyάIaαsM¬όl#ΨΡQˆP2Gάώ€_ψ,‚ΨΨ„(¦VfCJΡ”|^ž˜‰.Ν`k"Qα4E$έ5ι Μ©ό$w&½$…y a¦9N V5‘M ετ‘ΕtΏKε:fP "dM̜Ώ©κλΈΣ$ύ4-fG—Χ3Ά,4!ƒΉΞ˜$Ξ}(Ήσ²\dο4ΐ|Iκ[Β2’ς$J>„ΚΖ°Ρsb›u!”·K3'bMM;,uΤ-%ύs₯ΏΣ€ςdϊFNγ[bχDd‚Ezμ°z²Oƒ  “ΰсζ…ΔSΈΝοDjΌ2œ‰°¨"ΰ„Ηtl **§ώ †ιˆJˆ‹GΈ4ρ ¨=h‹s1εT†šΔο.‚°’ƒ‘@8€±q”«)μ*†„,– $&Ό@ΰo Ζ©€§—)Lq"·‡η―€§ΡRρ6±©΅4UΫ‡EŒ$Ίϋœ³zΌ@[nΆΡ:Ά^Œ[„9ρ,;όqwE’9νTΕΧTF„W]α\0bςΐ‡γoi–2‘vΓCΠp±)=ΰŸ³c°~ytξ„'~ή™»SR˜ΟΨα.2¦Γ7χρ7—ΒZ /y| ΑϊKΎψ(₯θΨΘΡΆœž₯Γ +ξeάW4Ε7τ_Ι―oFG0,a-"ŁNφΆςWα'”'@oSνμyYώφyς)‘ο.ίΕ]Œδ–#βόpŸςΰx\_’~ΗΕ?L6M’’ <АρYΕ θ: [AŸϋ™α?²όCχqDόΜ*%’n€ S { ΘΕLόψj$Ξ«ŽΈA(₯ΗΔη.„πd€ΟŸ€ˆρ_A™ˆ/τŒk8Ί"†’D9~π'Ώ˜ …)£c°AΚ©*ΓγθΒ"'ΐJͺτP«yΌΙs€= oμ&Ί*³ι: ΄)†7ρ«‹ΰ_ˆ!Ή‡β0¨Ο=‘ρɏrΟd!Ψ9EG=?-*δdί₯σ£x(Tœ•ΏΉž.λψ €_Œ|Κa\δ„NΞ‰>4*ίπχx`₯wΖ μZ.ΉύwcςΔ€Iΐ―¨lΟF Ώx|DΏŠP†Να‘2–ž„¬‹‡AΰOΤ>0w.TM±Κp!ΊΈ–\DRαάEš;λ88ΥβQD«ΕήΉ©€VTΕ&ΨN₯™6βυ΅•‰—4€ςC„*›M9Wη°[±ŽšGςlcϋΊΚcΛ/?˜εΖξτνλ·Ρ·t‘΄ίpτα+ R5„Š–fϋρV“­oΝFΕΫKΨcq >8Ι•Nƒο77μ}?^£ο¦ΦΛnwό[¦ΔeΧ`νc¬ν΄†o‡?μ3o7ΦXω‚Υ¬€4δ/Βξaοd?ώ8ΓΩaόqφΪΗΩπΏžΐψς{-{‚fχήΛΪπk/·—Ψ=CoΰŸσ8»Ύ:`Τkwΰ;Nθ ϊ‹_”‹/7Ϋϊ\θθ)ΥΡ%tpΆŽwΖΔa›Jθt#‡2`.^–0‹š—φΑ*ΐ_«=οΔ•Αζ*as°Ή&Ψ\ζεjpΥ c*ρJru"―§mψ;Uu°ΈiŸ} ]ΉΛΊυrξΈj_E:~Lj²pAΆ…e¨j@iR.¬H|y…²Sγ0L]·,ΊJOΨ7‘KιΫυςΏSηΩΚ;^yŸͺ΄9}.Aœθ Ρ΅ΨΌ>6Ψ,ž/skΌZm=―œ8Ϊ^Ήwušσ#VSτެJhώΣ’ώ:8n2Ί,6ξ`΄•υ«0ΒNYΛΞFŸƒZy­+^Q² @`θΣυόϊ8ΏΥθŠξNzομ†νŠΜ! νξŒ€ίf΄ύ΄Qwš 9v:(&&q΄5ΔθxR eΛ― €6x>€U—Η—{AΜ:#‚ώP΄¦†Ϊρ =θ3:MΛΥ%ΨΫbP=Ζ/ ΐ@`KΧβρhD<~,ώγg`δ1K”³ιος<Œ€27Sζυπˆ$^oβ†qΎΦ™Ώβ±sqό|(žSΘ'فΰ๑^Π'‡ /;#εPΐ^‚aΖθ/f¬<θΌz•αq&Ξμ xWπ” C€>„ΚΓ>°g£1©K@Β•%kU/}TΔΈEJlΰξΒ€ϋ> ](hƒξ*½ρ΄Ήλ,ŠyoΰŸb‘abςŠaΥψH@Α1$CPWuΙ›cDψI@v–%#†qρ².M†rυ¦"l• Ώ'BσαξoΔ‚γ9:Gp܁Γ!žXKΧϋ2F!aBζiρ AοBθ•αΜ3Œ³Hœxs κ.Γ’SVk,&S,IΆŽΗsΨ Υ&Ɵ’'t˜φmΤφ‰TDPχΚ ν<θGοΗ'¬ΟΒσΏoχ{LήBρ?nςFyψQ…KΧdΘ<΄΄cΌ½p«σo*ΘΟ9ΎQ?5)’(nP>”QΖ{άΜ¨―ΨοXF“9N}ΰ"[Dυζ½kώŸMΛo΄l"SφŽο1θχΣ ϊ½ ί ϊ}±ο₯…οζςέά rύ½ΉΎγςΉ^λΉΎXΙ5.JyΈΙΣ;βΠ§ΔΫ>`R‰a¬b“έϊ>ƒ}Λ‚-ˆΠ‚]ΌDhqΘΛ*Žοuό~ƒ:~Ξe κΈ Ž κxqRGΤ–Vw… ό€An֎`%•T± Œ$˜΅OΏ΄΄έcN?·)nππΔ"~ŒRηe‘ ¦3mgΏΛžσϊοΠ» q―1B†ρ. ΒxHηtJΉ™uιιτθ}?䝈ςνq\H0η.β δpβ‡(¨άΪΘ4WJ€a™Α TKQτ΅άΫ'*#Δ™±βΉ-!5ebdl%Φδ=όΩΤ·_ώ‚ZΏLpέCήσC¨SMLsmlcmsig source.smlxڍSΝnΣ@ΆK?BάΓΕJΤ+•¨”ƒΕ₯΄’ qˆΦλ1^aοšυ:?hήƒWΰ1oΧ‰k*΅#Ο~λωŸρψΨ»‘ηί2©δͺdBNz·ι±Γ•ΥwZία“½Ά6L›N}δπΨaίυΡ@Χ…z搫²i¦uYx=Ώ_Tηγp/<ςξ Ύ«ο<‡•xƒJž:¬U£9t…ψή}δχͺκIόή΄-ύqΆqDŸΏΞ.πγu4ϋ]γE4ŸγεΥe„σ«O²€6šq#”΄χ]ΘdΪ2+j…LkΆCVc™€‰RrVςœiL™aΦ'UI|α—Α–CeΓVbΖZuF—Ζ27JcNi @‘‘τπ’IιMfb{sjƒ‹šΕYR+k$•A…*CUΡ’›*m³©5θB±+έΖΡLPΕΠΐ‰3¬© !`-,Kfj’Fb…F7ά8°ς&q*“S2’ΪV) )ξl_›Θ|“ jn#LnkΉQ: γ€ϋ’―ώ„]«™φΦζ°aέηŽ“ΕιδύςέΑύdΏχ’ώ!Z|Ω” 89˜MΎ-:·‘Ζ½J^v;ΥT•fΪV;σΒα(ˆγ.Ύ–αxτίNΪ <χ\ο]ϋΫτΖa@Ύ!~8Η³3Œρ't=»―‡“hΧ“φτ‘”Ψ°i Ruby Slimslimskim text.slimxΪΝZέrΣF•m „παŸ8†Xr"hKKˆ“ᒝιτ¦Ω‘ν΅#%W’ iξ:½θctΪ’―Σθ tυ³kνzw₯›V(•vϞύφ|ϋ­ͺ+Ιu+½ΧLΗuφ:ΠΆϊV;Ί7lκζή“ }Iρ­ΎTίαΛι}ΒΓ~ v:)|€χΫΨrθ \Ϋ Ζ^8“ή/R/τMΛaΊ1O1ζ\zΏΔΑ†f$ y θΝJ@_`Π θK š“€ΎϊȌœzώ‘ω‘ϊƒ.K@ί`Π θ]Ο ‘ιšCTšcˆHΧΕ’Ρ 1†H΄ Ζ…nŠ1D E1†θs‹Ρ)ΑDΡo[E7^*χ(œx–ΣΣ;ξ°eCύ§‘‹–Ξθ;²w|τ睻άu˜=έ Π‹­a!uYV{ρΰπ―χ™υ΄‡Ί6½ό€Q§ν:ε ΝΐrIuXΓΈ%9…qU9qΛLhS>†A5Ζ βXΠΗΏ?bΒ{Μί0π1γrYW˜F<Χ τΆmϊΎnut4/XgΨΰΒΏ«Μΰ…Ζj|,2Ϋ`€’BƒVCŒ@~0μv1`-½λLϊΑaο»C― hPž ΓG“§d^ΐ9ˆ2  ©ΫMu „κv㑦iRΖ/FΒΛΈΪμώη Ž§Θ`?θΫB3„ΑΡΣ΅gΗWRθ«Δ,ΠΑΠi‰>lΗwcΤδyS”pΎ~ΡΖ%ΛϊdίI]ΛF뜝˜RV–~λ΅Ί]UΑSΰk!πιδπηζϋτα―Μθ1Ύρ§EΰάC`žψwΏ,ΠhΩnϋνXο₯Oμ]α υΞ=’IЍ³ψΉ-UN©9N‘/3D³}טΉΐζί‡i “Νp&KA ΩBa-άυπCΈ‚γμ† nο€8ΪΥ¦«Œ`x±¨;ΰtvW΅Υ1y†ωE Q%- UԘʎ©όJρ‰ώ΅§’†utί&MV˜ΆKŒ"YιΐεXρŸH:‰m–™WqΆ‹σψ‘α˜}γ#,Ϋέ uƒ}΄βHΪΣγwα»h9ΰ…ΐα%ήM©‘ΰQΦ2hΠ?œ0)•γ/l "N—A¬ΥΟUήT―γ?rψ wκ[ŽΈΡ7) ‹Μ„Π²gι~Ύ‘T ,‰ζI—DQέVO’¬€iώ œc-Νπad2Σ ²ΜŠru>‰·ΦνX?Μ5ς9&(ΦΑVq§.&½š}ۈέU:#sΔκu]ΧΠ'W~\ ϊh]˜=ht=Tυ‘§€Ήœ’ϋƒ ˆπ0βνHΫνv!τ۞5¦΅+ΐ)ζͺ šc"}Σ{Ϋqœi‘XOώ.pτD j[#|„σ— xβώ}szώLώ#%0EώH>—°ατό–>ό[ΠkM£R&RŸ@=8ΰs©Ψ7’š<1χˆBaσΗγ$N»jǍύ%e‡ό³ @Έ'8m΄BYJοoααλuŒθ<Ζsm#>΄Ρ“]=q%›qkFͺ λBΈ$ˆΗμ ΡxΘa΄‘>°‚}ύiαXβ₯V.+’έή ±£αo5Φ5Ασ†ΒΏJΜΚΎ³"Πw–²i¦`_Όνϋ}₯/J*T[΅έ‚›”:'|80½x7Ÿ=Β₯Κ&9Œj5w|JαρZέΙm΅τ ­εΆZ.ά*v·ΔΌ΅8šπq™ˆbEF‘βwšκ ͺΖ3΅yXΫIοο£?L½ϋJ.*Ω_jμšFၒ Κν}0ν( §^μOeAΜ-Λέ'ΣDεΤof<mΔr /΅lφLΫh™έμ η›©ρ)ΕΒΔ4Q‰ZZnQŠΪF)“β ο<^«hykj Ϊ†`?P,u2kΆιτ†QeΧγΌ³Nϋ³υΫ4‘7ζ;3©O Σε΄F-!wŽ"7ͺMΤσ5ͺηZ–€p+,ΙΊ\YΘ£6OQ[€©αR0ΉU99QiΘ#v"6Οhζϋ…9­δ6^¦πθάP$K-ͺφ&΅Τx•#Π‚”P{‚„ *tSF(ͺ'EˆWYς-Κ"Υl“Š N‘Ι£sK@§Ί€©δΣhDŠYβΝρgnr&*t§œ˜ib”ΊnΠͺ¬GFˆ Ό\]‰.™ΚΟGŸ«χ₯BPί&H^{έM=?Ež§ψΏΠ»ΝΥπCώλ³ΩEg΄ΒΓΞ+΄` λ‘fΉ½^ Υμ “/ ΊόˆhΏ$;=ΕριΎcΜ‰§#聊k”©Μd‚ς"±ΖΉ_‘—GQ±§HΞάF*‚kl_‡Sz<{ρ|‘>τLΒ{ΔY¦£ͺ Θ€₯/©•ρcΩ ;\Ωπ2€6›aSS7·Β­Νp³ΦΡΏα–ΆκΉ‚έ.,^κrς΅kyτ }N Ό! »¦νΓΠ±lm;²) †θcώηΤ“ωCωqΝ2ΈI2 ›aeNtO&ΩΜ ]ώ±ΰω’ΰyUπ|Yπ\ΝΙ.©[Stracestrace source.stracexڝ’ΑNΓ0 †[:ΰ4. 8pAœ¨y.―A=ͺ41£bK Mγ‘φ””‡4¬š4ϊlφŸz”όΖ‘Σ²\ςZ­“~ϋlcΉ±”NŽœ†­Έ±¦VsΚfQgi@O]]LN’-Ζ4I·F λraΑp„FΦ»ŠΆΞωI†ΥgN‘š€yο?7PιΒ©Πͺ{We™j—hjA»gžvβτiRπό d9» 8ηN_qυ‘dΟ½ψ‘†λξ³dΐL>ω9-@ςόyv»—™±§ωγΖΜζΤί‹6|ŽΜή°‡ ΒΛήa±χV[”LκΆZ„?ŸZzWC»0Β]Ελ‹ή1,†ΰΡ―Ής "rk'Stylusstylstylus source.stylusΕxΪν\ΫrάΖ™¦(Λ±;Nb;Nœ‰’ΒP’O1%fβ$eoΆβΧΞΥr(3虁‰Ζ†δH-_μέήξέVνψEφφ-φ φϋ»Ρ@£˜>¬+¬βh4ϊπχόϊΙΏΧσγ¦ΕΡg^–%A–17e!dqςΩέ―Φͺ+ŸΈ§žΈ’_©<1ˆΓ8q½pΖ²υυόψc£ξdΒ’L«w΅‘ΝΘ² ŽΌP«ϋL~|΅Rw8‹TΥxaXVΎ–_T{ιΨυ–jν>›_[¬κ³a‰‘”ΥΠͺzA΅ηjGDK¦qθUΫ~>?ώ€ZuŠωρ…JΕ‰hu~Ψ\§έ Νuξ«:/6ΧySΥωQs·T—šλΌύ•Α/5uήωΚ NMwUŸ6ΧωΝWkόΌZ‡ωη~1cΙά ƒ4+ιωJ-KiυΛͺ―¬Z¬ΐόΛͺΣ”Νό؍b­Χ–ΦΜΖe͟«"k&,›%όΒΰYk–hRτΊ!"Ÿ ͺ»Ώ4$β³ΟΜK2uϋŒρ.κUσWΖjι:EΥyΓl%žΊωkCΨ”’Qχ­…J£κ\7ζʁ7eκξ CπΨι4AͺΖ¦!.Ε€*έ4h)$Uε–!.†fQΥnέU4Šͺ΄eθ•B“¨ Ά±F‘fވΉ S#‘cH_QσˆΝOβΔ/*n75O©σ8)jξ”/jNͺ›Ν% ,ŽεŽat¦t kB§ͺt ecŠΌͺ·kˆ¨^/bP2θ]Cθ’Ω„%Αΐ`γ{uŠ©&lΘ Ž»oπ£tuχMƒK…‘jΌΥP#«o=H‘ξΎcθ0%΄XŽΙ4ŽtρzΧ¬D£–-žEUυ7Ϋ¦Π ΡD3ζ«JοεGε@'©[{†€{IΰυΓ‚jςγΓόxΕP–yEMΤI³y8KΧ΄§Uğςgz‡E•+kΥΏ+†HMIώgBΪ:₯ψv@‹ ›γΰη}-(‰·»χ{Η'Nm/Δϊ¦c&Nτ[ϊ“Šbφς°»ο,LΔ<*{“ xGΙo>ξ«u=ΎW7ΦΞJšύ¬Β Y$ωAοi­ζΡʍ κνc†ϋ½Γ^zθTp)}ڏVΩ‚|)γl̍§"oΒVόZ-s9+»Ύ³œΉ¦^‚Ξ‘δΣZϋŸ‚D§Ž΅iMfa)΅6b§VΩ’5‰}ΆΡλoΨέ½»Ϋ6~οuξΊο>ΉwηώSbΝ½ϋψGΡ[‡’œΏΓΫ‡Žγτmϋύ:ίψΓύ’€Χ Β­ΦUΩ”|υ„ΗΡIF}©sΚ9ν*'Μ$΅Ι)Υε ƒ βŽpa N9Χ8wΪU%ŒEω#Ϝ{€Χ.2νv•ϋε₯ύΗ9ΈWrJΞ<όήέ»Ξ- †Η±hΰ³eU½š+YψΫ΄h¨ηΊο/ΧύΣΉœR(1ΫΎΫνuγμ8Η{PSέ‚[Φ o{ͺ¬λη…Σ±·Μζί3†JΡπό@ΦxpTγ`UlœβŒήvow₯Ό΅ά ͺŽMσg΄΄ήΰ=ΨέΙήM‡λžW­χ°iŒJΕΣΒΕ¬D5“_―›ΌέsV»eηvV5}όZ`ΊΚ7~CsΌmmέΈΡ;€σuΉις^Κ%9 ZVύžŽΒυ₯œOcRƒΉΊΨʁje{9…r·M`Kš;<―CΏΆΤ36Λ«πcsjΘ΅Φ{|ΊRnΆjf’²œΖ€Ο|6eΧόFoψϚr$Ν·A6Ρ>θ`νwqΕeΩXγp{«RvγΰэΓνΞ†#μž8ƒ~¦A“€³ι4Ζfσ)λq΄ζ}›ϊUαUy”‘b ¬zω#~<λ˜ΓΌ]KdKŠLU”°ώ€NζηΦώ”‡dμδοχžšΧ¨IκΨr6 ’<Μσ2f*UJ€Œδθ‘’«x– Xγ$Ύa&ήlKάη ΟmB;“°²έ—ͺν>+·ΚΰΌΧΆυ«­·i»ΣΆνηŒ‘·#ΘχΕFώ+ϊψ—€_|βύόΈΑu†‚ͺξ=νlηΚF–uΆ»{ΛΩέ띭r^ω΅ή§hΟί±{ό:έ[|˜ΔžΕ¦¦­β0Q0#`z˜”Φ ή,Ώ[§b:gGzΦ‘žgλ¦%΅ΠΨ―‹X‘-§Ž₯5وa½V4πϊ#h•'" ιξΑ΄Β[Νw—c»~Z‘מďyΜ')?aύ£ γGγl:ξR»~ ζŒΝ–apΊHλbΕΦλ΄Ξ)hν=¬΅ƒ•‡P˜_q θε뺚μuŸfˆ“YΘ– yk΄ΆF/”\©Τϊ Y}wIΣυήι׈mšƒ»Ϋ@{Λ”Ή—Ή‚Ξb“g•Ο­8\HΧώΑ“‡KœQAέ@ˆc…sŽ§KW0ά›%^Θϋ‰„!γpbβ4e>{‘?f‘Ο§p>3όƟK?‡§Ux–Νyvμt‘gαsχ|αuƒn‚[,ΰϊa< ˜MόΚž:0©V§~ΆΦ°.Ϊςιλ:Ωχ€±pƒϊ+Έv·mGηδΪYv]&RΟ~ΫƒΫic}ΤΞg―oΗΎΟt70y5•”PπŒΪξ]Τ·?,–?ZlEνϋ™­¬άΝ*ΊΟχg?u†ž[>Ϋl)ΦλΘ“[Šo3J;“ΎoǍmOœ†ς; εχΟ‘4<γ6Θ\±³-"ޝΨόW§5ΉΦblUρ;H\οπp»wΈZGœ-kκyUdδσRΐ½/fο‡ήΰˆώΞ‡³Α8 <>JΌ9{ψγ/‰aω"οxΞγ08fysΰ΅ο%Ύ+ӏκ]Α§‘Χε€Ι½°κ={΅εUΈ΅²Ό…ξR"Ψ™ι ΑφvZ S›΅Z_k`λ{mΩMe}aςwπφΝ‹Υjs)φXμμφΆW2ω™v šhv΅΅(ͺ΅²2ˆΌv;ςYNη,L™C"ΪKν'…λ’#Ÿζφ‘ )ώgIφ3­‡]˜Ύ‘·δe FΠZΚΉ•‹ω“‹Ω˜εvCωυ†ς&—e»‘όvCω ε{ ε7Κ›l؍†ς[ εί€Νš¨pύVΊNΩ­ά~NΖ|ώr5ά΅Φl―’!“bŠ΄‰Ϋα½²’ϋŒΞΒzΆu…d₯ήrjH²v·‘ΖΎΣ£{Ύυθ/jΦaœ@{bΝφ?β$ˆ¨ψkR¦­Gͺrΐαγd 96τ>faxΎ Θθ«rCΝΕξυ η³e&§΄4eg+f\ΆhΝ]&ξc|<ˆxΚ€8\8υ΄^1:xιBσ/”ρ’ΡL$j·πš)R‘ώTMDΉΛχψuώ%ονp—ΘzΫΐ^ΐ=»όΊŒ‹Δύ!-έάGeο{ψ±LΌΟΰσ~ΰn 8 |”QRοΗ‘o³„&ΡΗ(α;O0›<ίǎ§γφγSTΛΖτ“~ο'Μ;r ΅’g4;G ΘΌ0xΜψ€Q":'7‚dΧ|πω‘‹>cΈτΣq0@‘›°TΤΖ,Ό)δσIΣ±ΰ‘Y’’{οcο,ζ³ύΠ ™Gr³$V…8½Y˜q?H‰W|:ЏBθ1N‘¬“κ…!ΛhˆZI:υL+ΰ>&KΝ‰^ΞΤpMΣ4H!ΜQζ₯sPΥF,†a πq‚ΡKT”ŒhAF[0Βςψ˜f'8„S> #oδEž$ρΨ+.ω8N‚ΗX L² +Rq΄λ†ΠJ`#A1£1–₯rz  šιb,‹ mΙ ς‡”ѝ”˜DΌSP.]~-V\,χ€>K³`8ηG^ζ•ΣP—όˆ±©`– 3r£1Q^tΛ|oβ,'ρl4œπ]Δ Ζ1¬‹>εΜε9…Gω9½ξεηΨςςσGO&nΦηa–pB'g>Ι±šZIΕ’,‘Z܈•g'Έ‰LλϊΨ cΒ¦ΜΛxtRԊ#ϊIˆ!ύ4MτνγόΤβq? Ύ€ή§‚ŸΗΜώ3ύ „7Δeζ‰γ§SΖ|‡Η³Œ¨N"; © Ε4ςΛlΧ­RΉy<’Pχ Ž)¦ρΉ§κdžŸπ„¨Ž_’wΓO²Ϋ©₯ΣMΑCžͺ[R»π΄ HΎ„“ IΔ=εPGP2)Βχε.8ΙΟ γ鬏’_Zt—‘€btZΖq&V3žA έꂦ—υέ$D šΉΉήη–‚Nx=rDΏΑ© P@*yQ–Ÿ“ uΑ:ς\²‹<—μ"Ξ»Σλ€ΐ0F]YQw4’cΘ5ΝΰcΦΔη«ηŸΒ~1ά-¦yβA°φ ΉK¨+A5β{Ψ;lϋτ΄ ͺΫ’\κ_qΛΖΆR§yCκ"•]”ς Σe¨Ύ-Sk`–bSW4g₯ikIό}œΙυ²GfPΈBΧΐŽCθ,wH3Η}Wnτaͺj/ΞεGξP,A‘ζΫ믌%n68.jΟFχ3Φž-ό s›XΗyœΎV¬τK2ˆΪθύ¬³h³‡ςBe$Ÿ‹HΏzΈO{ΎOσlͺξΎΘ²: lΌ­؈"Ί-΅Ί{τ&ˆΌΐ£ήv6VG;/5pΜYΓτwτžξ\)'di-ςn7ΩτΪ€ώŒˆ<ΰ‘f–άκCύF\+ZΤΠFΠO@π–X6ρ¨ŠX·:Ρ*΅‘œW‹LVAoΔ ’ΘbσχIώΠ ³RΖ,Ο‚wΞ-lυ p5„<β˜nTϊO@ωŒ­ ƒbΓπαh“―m©0Z›ώ‚τ4₯½ε‘Έΰχp¬O{»άHόGnϊ²a[³½!Ω¬ξXgXm+Nθžg=¨Κ@o‡Άa΅vNZΒ%²&Α)!QΝjΑ*²Ή–μ"EN²ŒΞ6λ<ΓBGCšPvΑ?ν[Β²`¦‘¦šW«aŠVεΎ6<I&ςD5Mΐ 1YΐrMmκ‹ PCδε²ΠKΪύ‘ΖBmxζ‘|—n{—χž ¨΅W²WP}%νΣmΨ§β’gnM™Ύh*ϋ΅hhWω†dIΧ¦ΎλπάΩ‚`k^hυΩ>₯=ΑPφωώ\Ξπ-§ZζŒτ‹]-=ΨΊq(w~$7ε™cq©‹"ΈV[ρ@FfA:†Δd'ŒψΔ ΦRn…υ7ŠΘβδo’ ynPŒrΎ.…hΈ†~3ζKήΔ$~μrεSpwBž«YIΔΏ*,Ίˆhα;Bφf2τ*έκά‡4"<8α‘–1©π9•ƒθŠ+8π^ŠΖ§σκγ"Ί(Γ†2,(£‹Ε€£Ba”yι‰—žfνΓ¬ O²Ÿς©θ€lK‹Γ+mhAyϋy4π8Ž'.ΌgqD¨B;t}ρΣ UgОρλXΤ.ω£8σΒμΓpŽTό‘ ‹σ?QΈ(=:¦Ž MΌr^yιG±ΘŸΙ―ώJaτύ€@*ήμμ[€`ψΰuΐX@°ρ‘#@υΨοCl^γ(:όΘƒ‚<- βόmiΩΨ./Ki’Ξ£γΫ–‹Oώ1g)ϋ3ζT’N±S*Άϋ?B0(J(upωbf_oγhίχΉ<ώ>?~˜?ΑρCo–b·5ϊ}8£ύi  Ǐ’½QπΟΠ₯t3N¦cLvψƒύe8$ΧΘ>&‘’γОC€;˜!ΆΡ&ρι4.ΖϋW’.³€8‚½I4Λ&Šx’8siΕΧ–dŒ΄Λ4Τ4ΰΞ’•Œ’Ώτ)“ŠψHπ”ψύ 5>b€MABΝΠ•—|˜„’ »Ρ¨ŠCzΔ)‰Βΰ|!₯— \ΩθdJŒ$~ŠVp•QΣ8œbyύP»^X4ŸΠθˆ)E·ιρ¨l"= ²Α˜§σ Δ+†ρ#Έ6K0‡ r…Έ–"Ϊ`Σ±˜R)ςšp2Ν!4Ύ/4 7Ε:” =ό@Νa]<Fx3?ˆy_ ‰e3tE”ε}?ΐ?*ŒSBϊΑΨbI„QΌ0EΰΟrxY¬ fΰEΗ€D½©J’` ˆΧ …τ/!AβR= R@"ŒΈŠ3Β3/!¦ΓˆΑ|ΗάGq™’S6­!Ά)ΐu,τ#5œΞ–Γ\h Βj¬%"Z<5ΎΗΗχωψM>~‹ίζγwž‘ƒ|œC8Λ&€σx`΄LF€Φ¦3»X€`œς£Ύψl>’. ΄iš0ΰ‚Ύ‘΄έe3τ pδT0'ύ}ΠEf~¦FΌΚ…ίE™°O}MΦ’XΞΕΠωΑˆ””,P,9XR€ cJŽœΖα‘/N)]‘•φ žL8ρd֟s`GήdΚσ>ς #ΓEZ:‡ευ Œ„Kΐ‚ “‘pΑα„51€ δ>j$•ΤD˜%Ρ' JĈ™‰™` `3©`ϊŒΦ™λ²š‰5Μ(χ0=ΞD°@&> 9|0Θ°"~2žN¦Ξ†ξ!ΌLοt6Sσ=8eι‘̊/r7j ήΑή—ΏνlχvΛBHzjAxhLsκ |ͺ¨$~½΅r;δΙΠN₯Šs6E^€1Β §x ϊelξ#ό=#°ΐK#‚oeΦΨ;¦Fη„ʍΰN’ϊH΅aY52ά"sL<j#Χσών<ρXΡςφ6­Ι>Β:ω¬$ήμΝK‘†φŽθe“dΣϊΓ§ŸZƒΠKυaw<χρϋξΏήuίϋŒ`œMΎφόζٞD}Œ†‚‰«–Ω"טšqΊZΰξΑ,Ρ,1]‹π-KΰΘ4Ω\λvωψmΗθνΆ‡w,™Rβγ‘Faσ΄—Οή·XςΫ€Z?ΤψΟυ‹9'ήΑ¨BbX ΕkλΙΑ[ΆΆ(@­YψwG)&’› ΝE¬oσ{–άλ’uΈΩZήP‹'6Β2Αqnθ“Zυπno›6ή·wσ‡σd*IυœΥD¨„nΣ`5Zjo«±!,ƒh 4ύ†B&m₯9ŽΒ^!‘QS–ͺυΡΣΓνύ`ΜGD|©,ψΓ!Ά›| KΡΆ€MJ9zRY Z|Εͺά|‹‚]ΦetηeΥ!h¨ŒBυ”’κ1#ŠTτ]rΎR9OΦόό“J …b6ŽD €i³6[3·±ΝΝψ†Ž_nB‡ΟšΥ”μtΦδ¦$¨›ϊ€ΛΜ3ϋ­.ΑeΥϋγOΝ ›Ϊ,γ­ρ••7OΧΎy΄(―5ό-tς²Φ XRΎ¨@ίεψή.Ή\Θπ•eΣ­[Λdέ«ΫΘ1‰zΆ·δΚώ«²]#”=Nϋ©£°, ό°}v pΕNα˜‰ˆω$πα’z)’jlQώ†“Ω΅°]?`gM ,lOhwX€(uνθ†φoα¨π8‘¨Σ«μ&¬zύzΙϋsϊ—³W«ΫλΫτ`B0Τ‰/L~)Θό,2ωqϊήΰͺW^Iͺέmχ¦Ζ_ξm::”iΣ'_ΡΩ?tν|ƒΠ?²σμE ρƒ‹βΉ βω‹’Φ_²gΨΪίsyO ŠG#64Φ%PYœ–ί2Ρ€Z~ΗI’Υή3‘ŒMQ,Ά‘€+Mό°ΰ˜“ι9†νd–ΓH£nB˜εŽϊΣhŸ’ΑI7εGέ|LJ{Qέ–oΖ5jν_˜^‚`šΓ*E]±KŠMGα‚BΣε2’>”IXιrU²₯ίPΜ·ηΨyˆDr’‘\)›sΙ«a€™‹Π4TηρΠ%ƒ)―ψp†ω«ΌΓx0Kω˜RΏ8Ωoυ†YCWΎθDυΡ,§ͺΝ<ΕΠ …Dy qͺjHμ;3ΰ,*”νώς]ρR²8;IMΨ³€ή©Κ³ΗK±ΫE‰\Ψ ΐn˜ eE!tΣL‡zΗvΩΎqώ)Zr¬β”›š©y…΅x=­Κ4ΚΧ΅χΊX5‰ApjC½Χ~¨9tόυ v§,Ζ*ω$OQ•©>‘ž"JD;ίΑ)¨ψΝ†tWŸ@Μ`Sf’…pb{Žώυ»k 8χ”Φ/a&u‘Θς§υPΔtVeχ›$8ΟλΪεάΦΦ€:‘w²c»ψATπχuψϊΦΑ„ήΦΦΛίZ«[0p/ik*ή00ή4½ϊύ[<½f―­΅%Ϊ\#šxIcœC:Σ¬']*ΣXά \ή*/α΅Ξ&‘ΦžΈvZ/Ο9δwwq~ήzqT«Θž•ο)­ώΐωήΥϊΕ²Am4ˆ¦ΥPΎΥPώ«†ς7υ‹Z”ΫOjΐΏc…iΉ‹΅θ«*mE{…‡&RΉψΎ‘ρ‘―²ΛΝφίS–ΨΤERq.ž†s¦œσ₯ί\4υζ2nΞ“rsΑt› ₯Ϊ\BšΝΕSl.˜^sΤšKH«ΉxJΝ™iΤ‹~eZΝ…SjΪ₯ΣDYSNΝeδΣ\B.Ν…ςh.šCsΑό™‹ζΞ\0oζ935/(λo*dήhΡt©z3/β,ΙλΊc₯5­<ξΝϊ–o΅h9¨ΩΣϋο5Ν؞Ή4rZδZθ9­ς+Ϊχ‘ηT¬tqΫ:s½!ZkzόκΉ{j*ίικνφvυρRUεε"–”ŸŒ‘…[…©œιλ3νΆ¨B™Wϋ ŸΈΦ˜R5’ˆϋ ½nΉ[]|Xr–„­Ώ’τ­9δυ΅ΆΑŒςλνΒ­/ψδU“‹?†πž{Soliditysolsource.solidityabstract_keywordabstract attribute+(?:indexed|memory|storage|calldata|payable)comparison_operator!(?:\>(?:\=)?|\<(?:\=)?|\=\=|\!\=)contractcontract contract_likeB(?:(?:{{abstract_keyword}}\s+)?{{contract}})|(?:interface|library) custom_type(?:[A-Za-z_][\w\.]*) ether_units(?:wei|finney|szabo|ether)expression_keyword_binary_logic\b(true|false|null)\b!expression_keyword_error_handling\b(revert|require|assert)\bexpression_keyword_main1\b(new|this|selfdestruct|delegatecall|selector)\bexpression_keyword_otherC\b(now|delete|addmod|mulmod|sha256|keccak256|ripemd160|ecrecover)\b func_modifier>(?:public|private|internal|external|pure|view|payable|virtual)func_modifier_overrideoverride hex_number(?:[+-]?(0[Xx])[0-9a-fA-F_]*) identifier(?:[A-Za-z_]\w*)logical_operator(?:\!|\&\&|\|\|) math_operator$(?:\+|\+\+|\-|\-\-|\*|\*\*|\/|\^|\%)number#(?:[+-]?\.?\d[\d_e]*(?:\.[\de]+)?)?opcodestop|add|mul|sub|div|sdiv|mod|smod|addmod|mulmod|exp|signextend|lt|gt|slt|sgt|eq|iszero|and|or|xor|not|byte|sha3|address|balance|origin|caller|callvalue|calldataload|calldatasize|calldatacopy|codesize|codecopy|gasprice|extcodesize|extcodecopy|blockhash|coinbase|timestamp|number|difficulty|gaslimit|pop|mload|mstore|mstore8|sload|sstore|jump|jumpi|pc|msize|gas|jumpdest|push1|push2|push32|dup1|dup2|dup16|swap1|swap2|swap16|log0|log1|log4|create|call|callcode|return|revert|suicide|staticcall|delegatecall|returndatacopy|returndatasizereserved_keywordsŠ\b(alias|apply|auto|copyof|define|immutable|implements|macro|mutable|partial|promise|reference|sealed|sizeof|supports|typedef|unchecked)\bspecial_functionst\b(?:blockhash|gasleft|abi\.decode|abi\.encode|abi\.encodePacked|abi\.encodeWithSelector|abi\.encodeWithSignature)\bspecial_members_keywords\b(length|timestamp)\bspecial_properties£\b(?:block\.coinbase|block\.difficulty|block\.gaslimit|block\.number|block\.timestamp|msg\.data|msg\.sender|msg\.sig|msg\.value|msg\.gas|tx\.gasprice|tx\.origin)\b super_keywordsuperternary_operator (?:\:|\?) time_units*(?:seconds|minutes|hours|days|weeks|years)typeQ(?:address\s*payable|address|string|bytes?\d*|int\d*|uint\d*|bool|u?fixed\d+x\d+) type_modifierF(?:private|public|internal|external|constant|immutable|memory|storage)©xΪνΫ–ΣFΓB@α°ΗΨ0C rΏlδB2&²άφhG–Iž tΞΩ³ϋΊŸ°―σϋ΄ί°ί²Υ’Ί₯nu[—‘6'$ΉUέ]U]]U]ΥF-ΤVδMΡΗ ]PgKΤ~ Lβ”QΠO„9M₯>TΰΟίΟ„§Όvό\ fδ:Wgκώ AέΓcίρ·Fl|"ŠDš£_ ₯ΎΠλΰκΧ‚Ψ†OS[=gά΅Pλ·±γ3ΤΎΙ¨CP±Ξ·i,Ζ±7τ]t=ΐ=εΜίƒθz4 ’ο{M|gpχ́dΜη˜‡M~ ₯?YŒ Ÿu<€˜P ‡B oNώ,κΊξš:avΥ_β¨D¨—₯"ƒmm˜ώͺ€M` ­Λ8»,XΠΓ™v ƒΖγσŠϊŸ,ψ υkt=&@y#dΐ¬58&θ‚vάX5IΛߍFM~ΜΤfΔ©ΘΦΣ3‘—bω‘D99˜ο'Ϊ]Λ1ΦΪ=ΗŒJ@Bβ ktmξ*-§n鈘qP½έC}Σ6ƒ[Ϊ ¬…BΜg‘εΠ؍Ž [¦Ϊ‘†ρ,έ[U"A9―Ω©’£φ¦΄ƒίiΏ§%Dz(°ΟΡΐ1ϊώ±Έ‘(?_`vΜJ)Yž$4)JΪD‡$ΘaΝ\αεQΔ³YΑ,^P”_/Α±“©σ£-jχ(w¨›­_X#5‘‘kR.7(μΉ\\φ+ΏΜpγJ-΄Φό*­K»¦~¦a}€ΪΔ›QρI-ƒS;‘Δ½Š6ξ”ώVΥ³b?γήGλΈZw²T_― }RyΉ“*Šm»Φ­Γ2Έ‘yΝz½s[ουˆQΧΌΉ‘ΎEl7ŽJpθφαΌŽΦ›Γ¦ν“Λ8ΊvΗΒγNίάD=­Χά„C59 “Wa"ˆ`‰ xΊΔ†θφ` βσωš”­‰΅&9΅ΰ/9ΝΑ_rΊŠ΅GX{k稝δ·ˆœθ0Ϊΰτψ«Cδ›FŒδ‘4’ΪF3Ζa&qƒt€.έoύ’·―,ksΙVD’fψaͺ.O’ηŒ]cφL+ ’>d:γεZ lEnΣ°/°|.“ΫΗ$*­MWι*4ASeŒ^­Pυˆm+ΨηΡ²lgκζ -¦1R΅yꒁiJΕίZmΗψLΛ½:”`fώΆΆ¨2σ³)hYύlhκ,iu­‘]ΡΪΛ5qΤc_€ήB>=ƒ έCΨƒΥŸ±ŠΑcΧΗ–ίˆ-ΈΊΏΣ{XS0FΔΰαΨΒήΈ‹{ζ:φΘ Β'Ψ#'xJ.@.ΰa²ΠD›°4ξaΛΗ{pρΰŠ~Γ¦χΉΦα`Έ lΗΜ φVυλΜήtuΠυ D“$rƒKl ξz:Δ©½Η~xζγψ‰αŒΆ°ατPX 7AΙ@χF -†μit’° λ¨cΪ]ΒCbβ`€†#…€ }X„?ƒφ,‚‚ξx 3$E—[@=)τΒΒΏŽ‘r2ρΘ;42Π ¬•ηƒσBpΎΎ€{γΡ<9…w7aHu( η…πώ&ΆœΑ5rš'§·±α" ¬N„8•ΰ‹i±i˜PJBH¦@φ…P/ψB3FΖ? Κ 1’¦ΘHΌ0V˜±<]Œ­U¦a.`_εF£ΠkŸ)ΚΏNΞβ|v58ζγωf£ 쯚ΰ$Αt&ƒH‚U<7α "Γ\σiφ„yN˜yœ¬έew‹Ϊ"ΦΞΑ=νη 'AR bΥ€n…vk—΄KXƒ?ešΪŸhκ6Φ:l²9u+ψT^%RΚΪ»(Qκ’πD`iXΫ’•α]”ΩΈ³J{α- ύu•EZΞδκDΩΌ”“ΉLεωX–Ωm˜σ‚€ξƒw!}—^* €xym[Ζ³η³$ΟHΚnIΚ!†cμχ11 |dQΣυ‚Τ8ΈέΝ“70<΅ rϋ:Λ„₯»Υ  nφ…¦ΧˆWp3³ .h’lƒ8­ηΝNnG5δ'9Φ|9Κc’χTL²Š¦γ₯G~gθŒŸ5…ε(βο—βYΖ3±ψY]CQΎ¬(]Q>―(TQώ’ό­άΪ»‹£*»ŸŠvENNν’μ+΄Νyΰ<%!Y|ύA3gΫ9Y%²ϋ=EyWQ~UQώc‰aΛυt™ΘIŒ2ς΅“¬Z»Ÿ­@;H°•dwεΞD§)/&_*Κ?P”ŸR”ί(¨Q.*Κ_IR{„QKμ“iΓ ‹—΅ ?YΌΝΓν]ˆZ°$/’”œ–”])Mέ>¦g΅Τ kμE‘Uέ4J‡λτΞ "ϋEσ;ϋŠτΛ1ιt‚vˆIȝ·L‘Ιpέh(Pζδ«HΊΔΡq0F3\Uδ Δζt~/•ζήt\ŠΛ5…Β«ΒΜ,KρŸVh³²t<ΧΠ)6YΘ&Τ ™U ‡*ρ(‘B‹HUeΡΊαΖ­¦mΊΙ=²P˜9Η ΊΘρW‘KδhO^ΐάΎ *Π’Žζ|#Ύƒ:₯μ¬D8qΰ%„‰ζ”OψοJόiK“βA2}μpP‘υ|M1`*O«-ˆ ]ώ?yοΖZ‰δ'xσγχίΓΉ«a2ᚭεŽΦ†,ξ’Φ[AΛs$FΧ†{΄ aψMΜ db$maο±ήu0"„€TΗξyx$„ρ*dύ<άΣ·<ΌΠš‡·ξzΉΒ‰Β/˜3˜`FNΏev‚άUαΙ=δ$εΟHφŸ‘μ’‘μ΄ny> 0EξhΪΩς‘―ƒ€Ϋ›x A hάΉζ {σ7―aY$ÁdQΞNƝE&ύ66!εE’πnΎΜγ±Έ >ˆφLςYNas8ϋΑVs8²ΒWΓπP7 IIŒΐ>™Ί…G34=’Hλ#‘쀇t !%-FŸšΗ wV‘±†z μ ’Κ§ ͺΉλ(Ι‰lζΤƒŒ=πWγA\T€²χα‚M²{rΞΩ’bPύ땬$Β㊴4Yο…š·iƒTAΩΚ·μ3­~ΎB;u­ž?^™9 Κ€l(ίαΈσ„› ρ6L²ζ@}λ]Φ(ΨΛάΓLΈ†|d —,ω b,’EsͺάΨ:ω΄E#ˆξΞiυLΟIΉΫ1…ͺΙΉ*#ySωπP‘ν$&Π–ν“βQ/ΉKJΕd±Ήό3=­ΔδθΪ­œΥzF(=¦4§π©ŸΊfhSΥk+E^TmciρE{Uαͺ˜oEφϊV£B?Χ¨ΥΡΈk™„²Μu²C<ΨhCl‹μΧnF ρΊ ‘HjvΦMpΆd{ΎO%Αƒq§$„θš=Ί8‡ΡήDNξΰχ=Θ=4΅FbΩ“©†RςΥΕθσκπ£JπξΤ‚p#Ιέ£Iξ 8^6ͺJ '­tκ[*b'·J~pό—κˆέ_=„λ±ΉHP¨¨F’›–Xκ©$BΉΌί©"Β•Vw±€Mw…'ˆœΨ l¦=ϊxΖ]©³ŸΟvΌ’SΌί˜“-ͺ8Π3ΎξΉ- !ΪU½»5)nOcέs[Q~§€FΛσΪv™—W«²?ΥΚv~:Φ’AΪ½~mιαζrcιZλ]½ΥΏίϊxe9ήe¬ŠaΤvΌ䜒όB²Α}ŒQfΏΪdHω ƒ4‡+¦π{TΰD½χ‹τΎOΞέΛ“Ύ|Αχ!UX(Až±‡ΛνΣκνΉΞ„ύζ•M xŸe˜A.>šι>yαή/»TΥ₯ε―ς/`QΑaΗdύ0†ήŽΓDRΏ(ϋ‹€7#ςΰ“ΊΕ‡ό`ι!ΏλAy¬Υњm£]νh‹ΩŠ{b60ημ,π†Μ5 χ)$€Ϋ©χŸ˜΅ΰe[j*^ΰ&‚γΝκ‚γ[ΘZί0ΆΣf%ΐφN’·Ψe₯y_9š;€ςξ ΘΨ"₯ ?‘«–ΉEDΑƒ_w…Υ}7fΒ·?Οp€Lλ6 >ζ΄"yζΤ«*Κ―μσ—V1οΗšΠ³ΜW 8JVYR=8X¦&υΖ/JηyΫχ€`Β%οωJ@TFW―)8£—ΰnpœ₯T.iξέ]Φ;:™°u­ —πLβ\™Z*‘§ΔΕΘΪΔ’ ψw›ΛΤΩ…w™cΟ3ψ?¦™‹sM=§‚/YόYs σVypervy source.vyperassignment_operator(?:\=) attribute+(?:indexed|memory|storage|calldata|payable)comparison_operator!(?:\>(?:\=)?|\<(?:\=)?|\=\=|\!\=) contractlike(?:contract|interface|library) custom_type(?:[A-Za-z_][\w\.]*) ether_units(?:wei|finney|szabo|ether)expression_keyword_binary_logic\b(True|False|null)\b!expression_keyword_error_handling\b(revert|require|assert)\bexpression_keyword_main1\b(new|this|selfdestruct|delegatecall|selector)\bexpression_keyword_otherC\b(now|delete|addmod|mulmod|sha256|keccak256|ripemd160|ecrecover)\b func_modifier6(?:public|private|internal|external|pure|view|payable) hex_number(?:[+-]?(0[Xx])[0-9a-fA-F_]*) identifier(?:[A-Za-z_]\w*)language_keyword+\b(if|for|return|or|pass|not|from|import)\blogical_operator(?:\!|\&\&|\|\|) math_operator8(?:\+|\+\+|\-|\-\-|\-\=|\+\=|\*\=|\/\=|\*|\*\*|\/|\^|\%)number(?:[+-]?\d[\d_e]*(?:\.\d+)?)opcodeεstop|add|mul|sub|div|sdiv|mod|smod|addmod|mulmod|exp|signextend|lt|gt|slt|sgt|eq|iszero|and|or|xor|not|byte|sha3|address|balance|origin|caller|callvalue|calldataload|calldatasize|calldatacopy|codesize|codecopy|gasprice|extcodesize|extcodecopy|blockhash|coinbase|timestamp|number|difficulty|gaslimit|pop|mload|mstore|mstore8|sload|sstore|jump|jumpi|pc|msize|gas|jumpdest|push1|push2|push32|dup1|dup2|dup16|swap1|swap2|swap16|log0|log1|log4|create|call|callcode|return|suicide|staticcallreserved_keywords“\b(alias|apply|auto|copyof|define|immutable|implements|macro|mutable|override|partial|promise|reference|sealed|sizeof|supports|typedef|unchecked)\b self_keyword \b(self)\bspecial_functionst\b(?:blockhash|gasleft|abi\.decode|abi\.encode|abi\.encodePacked|abi\.encodeWithSelector|abi\.encodeWithSignature)\bspecial_members_keywords\b(length|timestamp)\bspecial_properties£\b(?:block\.coinbase|block\.difficulty|block\.gaslimit|block\.number|block\.timestamp|msg\.data|msg\.sender|msg\.sig|msg\.value|msg\.gas|tx\.gasprice|tx\.origin)\b super_keywordsuperternary_operator (?:\:|\?) time_units*(?:seconds|minutes|hours|days|weeks|years)typeQ(?:address\s*payable|address|string|bytes?\d*|int\d*|uint\d*|bool|u?fixed\d+x\d+) type_modifier<(?:private|public|internal|external|constant|memory|storage)ΌxΪΝioΫ64nzŸι‘^i;τXg'³šX±fK½b@?θ† 2ƒ–h›ˆ—”’ΈaΕΎνλ>η?ξQ%ŠcΩi‹)H‘ο~τƒ…τYΚΪΗ(ƒϊ>"Φ]?\(?Έη‘΅wKpύ8p"mD±†ωD֞ΞΪnΧG$³‹Y{&Ÿe’‘œ>™΅g³V$ηOMΜENΎ^nz.k]μ„E!=Τφ•°Ηp{Ž΅ρkr~D1c‚W8^μβCm‹ Θ<ή ©+!ΟkΈ₯τδό…¬½ͺΝη•€΅-'Υ !/imΩ έ±ΊlrηI +Y{³ h‚BiN·Ž„ΞΙ”―θΰG1 Ϊ >ώa]Σ„:Δϋέ φ{8WρuΝ–Tσ»‘ΩIyε²f$#(ς5œ+¦£0r“Έ₯€iGXΟmm{Q δμΙΩΈ0ν»š΅€³%…h\* mα)ͺθοi°»ˆΤσp•Μοgν-(¬”½Τκy‘³cΉ‘“h9A‘ƚκ‡Τ£ύs³³±υΊύ΅?t·ν½ΥVc’ ’υ>#μφ¨ΜγH!-ϋ‘ψ“‹I ‹ŠR,χI@’€nJVCӁπH€³=ΫΜCl¨ςΠ¨βΞͺ.5t{Ι™Ωꯏ_Z¨~ͺp7 8nL¬-οΙ˜:ΨΪϋ¦Μv/Oχ•ΐ%ωTλρI==φπ€F"ΚO¨Η ͏ήĈΎ±0‡:’η₯$₯Χ/ΙŒpUΪGζιQDΗ­–Ν֚Ί£΄μ^ŽυD…ΆΥP–₯$L``Dc+@>Άΐύ[œ‹ŸιN½”;5δεΆόΠ%}6ί†hšMϋmkBΕS‘]18ΗyΓψC<8(7“uRχ|ό˜Μ{%Eo­΅·;Ά»e»]Ό½ Άe»k­Nζ=L8˜_€Ηœ}@½γhˆi‹ΓƒŠ&pχIG˜ρ!Έ)γ.3Ύ‡ργcŒ(«eKy¬ SA6Δ”8:ό•² Y‰†^‘±r-lΨkά^―6ό§―M1―Uρz–τΔΌžqϋ/nέ₯)7 !τˆβΝ‚ά }§"π‹]7' LΗ‘.Τυyέ ηeΓψΥ – JΆž΄>/τΰ= γ {}§9š»ΨΓ¨D$f°4ƒ ~¬ ΞΓ™U±οCEF―RAuΈύSήΫκx¨ˆοΆI^8 @œ‚[aί~Θν§φSnΓί<¨Ξ)¨6ΈέiMg{ŠcŸW~/€ίΩ@+Υf«#4ΟFxZhπήό άsUΔaΡΔYΫ CΗ>ΩΗ.ψλΎπΩBCWuoςP0ˆ!Ζ)D―„>§….‡ή’.ˆχiθsβBΥ2€σRaRʚe-؊ZΥ’5φ—±Ξ_Τα^‚(J$Ÿϋ±'6Dί}‚ο`ΗA;’GΙϋξσλ;βέ.·ΩJ±Ε°(ρΎ … Γ5ΕΉ\ ωΖ˜ΏApDδAμy3*ϋοςbFޘ£8 ΉŽΖaŸ'Eeϋq”˜"¨έKN ΰ‘CC.'„ (q1˜ ς8>|„QάΗP+0Œ< $0 fρHXγBι°΅±³ƒ]…š‹²Π³ΐ0έΕͺHnœx8DClω#Y^8¦;'Φ¦ ωWuΒδ€`C&!AΩ7Τ}βΔ^4–#Δ<β“H~§6ω•“Α}6€ε(BiAa`iŸ Ξ.ς@ŸIΠςh?iGρpςRU€ΒΡ5]ΛΞ‰mξrε^!PIuQ75mιΥϊ’^”T‘&ΉΛcΧ*ΖL§#8ΙσOΉRω·{ –U{^0ΥόδŠ(uΛ-{ΟΆΆAμ-‘{Άš°¬eo·:9+' Z±Fž›-pL.Ψ†QΖ ±¨Κ[.aŸœ₯jΣλ•³3h¨dyUΡ”ϋ~•΅κ! ŠΡ€MώGΒ.j€Ο·•£κΊr-ŸΣ•—χ§•ςgρΧγHς΄ πNΦ6Ÿή”…ΨΝιΓhxϊ‚Ηυt,ς„I]WK9ΜQ—(\„u܏8κېβ!³%}ΘdZW$’–:ςήfEΘΔ8J*,I3—NΓ %-o©αq:‡OMEGmEM9­rυΘ[²&π.j,«βŽA#}q>MBΦΡ=¬γΝυl+Ξ§ρu ^KρωΒι3§5ΟDψg·Β"²xδy§Έq©ƒε€!Ÿ+/Τ³β™§ΎOLbωqbh* %@–ǝΆύ*Ρρ+•Ž 櫃›•K•Έ¬δm\s}λΟύνΦΦzϋ%jχ_·ίt·'/-υ’«\2u>οE¦Ιn.ΜΛψ=ρͺkΘΩψλ»*ύ·̏iΝ©X>eΐqΪ0~Χ0~Ζ0~‘N4™E-'š[πλΗ7ΫΦj'ν亐‡­―aυQв”7FΙϜ'Ρ)~>νμYeΨ+%N.UΊš“Υ¨GV½­f‘_ΔζΙ‰ =χ Fuv:šAΚc*+3πρ3Ÿ’’gY 9₯£Ύ8ηλw-“ηιΤΘΖ.pJQjq source.jq5(?xi: ^ \#! .* \b(jq|gojq|jaq|yq|xq)\b # shebang ) identifier%\b{{identifier_start}}[[:alnum:]_]*\bidentifier_start [[:alpha:]_]₯ xΪΕΫrΫΈΥrξΩά6—M6I·Χm%g­Ϊ™ΞvλΤu_ϊΦιΛ>š.$! 6IΠh[³Θ/ω{@$“’œl§š@‚ΐΉŸƒs€·kϊwΫτa˜!’_΅wκ―\ &μηιοš>¦Y†sΑνχuΣeϊOHN‘y=ε†ιo™–cf?ή4ύ}ϋρ‚ˆ0b(Ζ—ή²ώŒ\SiY»ηΞ)C—w–I™Η!Πzι?τΎ‡ˆMkFξy“Iή¦Τς°α}OK*p’X'‚h (H>½τ€χΘ_y†²†ΐΓcf9rxθ± 3\)<Ί‚&NΛ‡$+h£ςΗ0’s’&)΅vΣ?βΖΎ6ύ³φά”δ84φd§>νΖΝs€υΜΣΓ žŸS–Τψž{ίSD‘΄ώώΒ³=ΧΎρtM X*(«Ώτ&Œ *ζE­₯W$M{ˆyŒ ΰŸ–8olζ[Oczvν΅ΗςbE)ήnόΜN}cϊ·kέΏΑΪΐ'±φ†/žešΣ’Εx||κ~μ _2yΠ΅ϊwφα=8©(‘ΒΈ‘Ηؘ”‘ωΣEΘΧ݁‘νφƒQΐ·‚θ0(~ωΧ§πHχΠό^`|΄”ο»­[.ψ‘ρG©ύq€qmώ'Ψψxτ>Ψ€·Λ<^ΔΫ wΐ2 kwH–γΈκ΅O#<%ω"Ω>ZλΔqhηώ~ΞVΐς°Λ/«pR…Φpά_ΩJjόŸΩ¨‡η‰Βή²1`ŒdpTkz0θπVΧΣIΫIΖ$Mρ₯ p₯4>πλΧ£hUωUZZΐΑ'Œώ/ŒVΡ€±εΕτ/4`Ϊν3ÍU²Q‘u|jρŠLπ±λcz³υ©˜aVR™‹b¬ρφΧ5˜ΎΘe!ΫύM₯*b>ΞQ†]˜šΨuΈAŠΓ£FfŽToΥq"˜―žΆTΆ#˜9ξ9θqΟ{]F‘~ί/.Ί„mƒ  >8Rέ^cλ=FπΫeθ΄™ωΛ»γ Zι†―ΚF˜χ?*—ι»…ˆlBHΥZσ 6–[ŒM§ln°ήΆ—›΅sύ\;ιΣ²^iη}γΚX{–Ν‘m7³ο8Ο΅ΌκΏεΐfcύŒ«xoωFόUkΖFΝ}ς°’Α½κpQ tXΪΦB0₯ˆZ»]•^Zη²τ`­GŠ―»„±χe,¦ΰšam™ΜΪ™‘ΛɍkΤ―.ŠΑJ’θΨ•ΊœΕB8¦Ώ*g/zƟ»Dάn\(ψΤ΅X*Έv|j‡„W½\Bnβ…›ΧδτφgJΐ‰mΪKaΧUΑ/ ΜΏΡc:-‘κ2d ηA›Šj‘C΄ yν™W«‹ΜΦΎ6‰‰i.M-ή–SΪ5ύΕΥΐ–“‘Ό2ίZlΒe*W}Nα*ΓlŸέIεpi°z­sa½ΡύΡτΐ#ΘdΟΐb΅I꓁*glΘΊfΦϋωΆ‡μΚΗ5ΉΊ–Vg5žιΆjτ{΅Χg{›£ ?θk“K}Κ1Φηbγ„–*mhΐ_±PλΏAΠΤͺ£₯­2Θ°­κ.Ρπ˜0‘ηy z2―ea^H^5°ΤT5ͺ΄JiŠQΞeΔ1bΐTT’TΐA­{%Γ2Ž˜1&©„𩀬€βUσh1ηdšKE_E^‚£r mͺώ3.†3‰³BΜ•¦ω93x8“˜MΤ?††Q&ρE‘ώ»;ͺύ š”Β^}Ά+'J “„d²r /„q!')Œ $ &R h€λIF©QN˜?a4 !2’ΐKϋaύ@8ύιǝέκ½ςυΞ‰Q&§(ΨS,ΒγӐ2α¨zƒ3γ©ϋͺ²T½+Θi&H†ε”Ρ²£Ήœς2’3”Šͺ 5χ3Δεl^P‘6׊q€Hς_¨–ΐ)τšwx(J‘Ϋpφ§R`σZΔηea¦GΤ2uπ. Χ* άBα @žƒi@«„•Κκβ8—Η;ςxWης˜9`ΞΌjΒ2ηLp"SŒ¦‰.˜$Τ’¦ΐxͺ₯¦»Ι”dfΣΨVIιTύAγͺ-TϋA5‘LAEJτhυΧ·'˜©0ό•,•ž3•,ΒγI”>QM™b•ϊHΕYZ‰ζ°}ΐΣ…@ΰ―zτ±DjΆ9τ0žΛhΟΛTT’δ’FΗpήΔe₯OΝcAβYΐlψ ’†¨—ŒΧ}ε“π’%ΐΙpΑ>ΓΥ,­_¦γΘΙ,ί°γ€›L,ΤκS‘nΣ\υΠΰˆƒN››ςGΈš‚/‰TΞ_ωΎRWΥ(IρξQt NΥuQ¨=“  lhJ½Ωu©‘ϊB€-«ΈRπK!…ΦΊ ΅§ Zω™ξ¬— Zω˜ ΖZ5V=)@¦Ό  (Α`ηΤ-@νDΈͺΠK ͺ0bŠΕ²“Ÿ’Ήΐƍωœ£τΔ„lΕkMΰ|GΞwε<οΨQχb}Eί‹UTζyΗxΰδL'([7Ω‹Σ1„f+žRλϊCΪυΟϊΦw―ϋx]SF1μ|· ²π2J[Ψοήνϊ’Η7β*.ΪΫΔŒ•ΚαίΆ΄°δAPόCΛ»Ι9ά~Ώυ§£εδ€;Οΐβ|ƒϊŒβψFΞΧΦ{Œ€oό¦GΓKΧ1L δžα8Σ[€%h8^^um.­Ίt—,Ί>,¬Ύώ°Rυ΅τ ρΩΪίj‘φ+m―»7ƒZR_²¬_±[uΘχ³w„π_&ΔΫkSveltesvltsveltetext.html.svelte(?i)<(!DOCTYPE\s*)?html ascii_space\t\n\f attribute_name_break(?={{attribute_name_char}})attribute_name_char[{{ascii_space}}=/>]attribute_name_start(?=[^{{attribute_name_char}}])block_tag_nameΠ(?ix: address|applet|article|aside|blockquote|center|dd|dir|div|dl|dt|figcaption|figure|footer|frame|frameset|h1|h2|h3|h4|h5|h6|header|iframe|menu|nav|noframes|object|ol|p|pre|section|ul ){{tag_name_break}}custom_element_charΎ(?x: # https://html.spec.whatwg.org/multipage/custom-elements.html#custom-elements-core-concepts [-_a-z0-9\x{00B7}] | \\\. | [\x{00C0}-\x{00D6}] | [\x{00D8}-\x{00F6}] | [\x{00F8}-\x{02FF}] | [\x{0300}-\x{037D}] | [\x{037F}-\x{1FFF}] | [\x{200C}-\x{200D}] | [\x{203F}-\x{2040}] | [\x{2070}-\x{218F}] | [\x{2C00}-\x{2FEF}] | [\x{3001}-\x{D7FF}] | [\x{F900}-\x{FDCF}] | [\x{FDF0}-\x{FFFD}] | [\x{10000}-\x{EFFFF}] ) form_tag_name}(?ix: button|datalist|input|label|legend|meter|optgroup|option|output|progress|select|template|textarea ){{tag_name_break}}inline_tag_name^(?ix: abbr|acronym|area|audio|b|base|basefont|bdi|bdo|big|br|canvas|caption|cite|code|del|details|dfn|dialog|em|font|head|html|i|img|ins|isindex|kbd|li|link|map|mark|menu|menuitem|meta|noscript|param|picture|q|rp|rt|rtc|ruby|s|samp|script|small|source|span|strike|strong|style|sub|summary|sup|time|title|track|tt|u|var|video|wbr ){{tag_name_break}}javascript_mime_typeΆ(?ix: # https://mimesniff.spec.whatwg.org/#javascript-mime-type (?:application|text)/(?:x-)?(?:java|ecma)script | text/javascript1\.[0-5] | text/jscript | text/livescript )script_close_lookahead(?i:(?=(?:-->\s*)?]unquoted_attribute_break(?=[{{ascii_space}}]|/?>)unquoted_attribute_start(?=[^{{ascii_space}}=>])$xΪν=i{Ε™#Hp lΜαY2֌͌dl,l cY ‰‡#4ΒτL·4z¦›ξΈœ{ΙMHBξMBξr’ 97Χ~ΪOϋφΛ~ά?°UΥ]Υ]5Uέ]γ™‘&ζ±§ZΥο[υήυvUWΝ?sΑηΚ°Ρvγ\UΧ|νάψK9φ³…²λu£αG`°†οΪV6˜v€m Λλ0έϊ«ŽQDΰLη—„ε x]3Μ₯rΪνer˜Cζ r˜Γζr˜[ Μεr˜ΫΜf9Μσ&9ΜΡ—Έ{˜Ϋ_βŒΰFΖiz΅’ Εν:Ά₯ω¦“θ›ΓςzΓ«Ί¦γ«–νE_[ˆΰ·dƒ§ΪΈ*,·Šΰk~=fVW‡ε "Π'΄%-ΈŒɈ@‰ΩšΪΙΆ°ά%B°΄ΖBQσ}Χ¬4}#"λZ$JΪv$Jήu Hԉ憀HΊQ5uΓΕDlέ †G9#ΆΈ'#νp‡""νq§""•η.ED*Σ݊ˆ4€ά€ˆH£Κš6(‹{Τπ(‡Γjx”Α5<Κί^5<IoVΓ£ΡuŸΈ£jxΗ^>3-#/,¨αQŸΨŸΩΠ<ΪαEDΪγ-ŠˆΤD‹ŠˆΤFKŠˆΤHΗ©•Ž«iƒ²xP rxH 2xX ςw«υΒΫΤπ¨QΓ£^xT zανά8ΟΰΩ~Νp#Ο;–4Ψβ”V L( QΟΉCœ¦Ύ,‰;Ξ |!lqn7+–Q|²iϋ†αœHΒρΰ—g’ΛΤΞ*„­z^8•HY½3zΜI ΉP–ˆέ•‡t*;₯m:;υδΣ\Π‚#NΒf”Π(Woϋ‡ vχV5<ΪίέjxT’oSΓ£|»‹gΤπh\ΌG ΖΕ{Υπh\ΌO ΖΕ³jx4.ΎCΙΜ¨ϊξWB£Ϊ{@ *οA%4ͺ»‡”Π¨κή©„F5χ.%4ͺΈ‡•Π¨ήɊΖ&•*‘Q/ŸΝj]\JYVΓ£ύΝ©αQ³|L Ϊε95Ο+£RNAXξnA5u9­T°(™οVΑ’ΎGͺ‹ΐ₯DΎW‘ω>EDJκϋ©Ω| ,Ι"Ρ9Ό€Bξ~0,ί@οzΎζϊδφΏ…%Y…Β‹lδζΣnΈΈFn¨ε6^-#·?ΜέWΙΘ폄εφ6YD#` Λmb°bΌΙ…εl݈xϊΈ¦‘Υi;ŸK²\fXp Θ±r™°$K\F½bθE―jG€|’o’α›Ύixδώ§8ξM(YέΤ|ΓZχτι°$ ‰qΝ>–dΙ¨uIŒ@>–dαŠ_Ϊ"pŸ Λ+98¨φ¨±ΟrΜΗΦ½ΘηΒςj$Z"€Ο‡ε΅, ;Α@€?–Χ €γώ ΰγΦσEΞ2βSfζKb‚Ω!™Λ1βΐ!τ+ΌΔψ‰1ψUΞDbφίΕ°ΜDύgαto!_ηe€1ς°Όœ…ρ¨νΏΠBW묁ύfX^Χ +ω·Αγ*6oΛQώG@Ύ#$V¬ποrƒετύ½°$ ‰|ΆV¬ΫΊ9o.ΪχΓς Κ mW[ Δό€7I"Iΰ˜BR”@Œ…%YoGcUN ^δΌ@μP~yU”O65‹6ώcŽIF<ϊ„“’4σ$?εό#4‘¨λŊ­―°ŸΙΑβΛΟΉ!'… κ„ΏπoλΪjΕ(z†5=2¦΄—9λ$"Ψ_ Αe€τW"BΈδ•UΔ―Šΰ1βŠψ@Βτ˜ ό–‹ΌΒ•Ώ–;“€9^π܊ηαw™0βϊ-,w$b0|ΏΞέ|ΖKΰ~ΟEΎ–Μ˜εφq2ΰqF–Ϋeΐ Ε„Rω³*.°ΏpcI7ηη ΐŒšΛ— θ_κβSkVH5—ΣίF-Lή Β?ΒςŸa9ΐuˆ/ΑVJήBέ*αάΌ„­>VγH^j6‚Aƒ$ΠψCή`›››$υδΙΟi6ͺ~§%ݘ7&ΎDύ؂› ή“ΰΖΉπΉ T±μκbch0ή=Qwώψžba*_,–½ύ“ >Θ ‚”d©ίl@ω™zΙ΄,cA³JM/†½{EΫ-žš>ωΰILίh2“„ΒhD4qŒkncž‡-5@Uσ«΅B€ϊΥk˚ι3ΊδœΗ’Š«U ίΓvΈ+~?m44«θ5+π飴N’'“?Κs„Ά›.ζU\Ž[# zΆε§H“»ω@θΈ†γΪUΓσ fD4^"ς§ςΤΕ»8‰―pρO[|ύΧ8–v΄ΔvίmBR\£€5V₯2η›ύ…€ώE»λψξ‚ ½N»z9cWΧ‹»š·έzΗΩjιΛlXfΓθ _7HϊRb,kgΫeŒuΌ§%=ω8fvͺ·ΤK’έςήςήΌkxώYΧv<ΰ οοŸ4€£Ωƒ&|°.ιΆeinι O<€·DHU,NςΑΈ5cRΜOb$\ ωγc…|0ΟTHΟͺnN…cΑl*"'<³ΉZBY{Ξpο-Ιg\aWε\,l„rΫwΞI’•o¬Τ–π4nθ”φM’&?$©Œ€ώΩγLi .£*>Q~ ΐ΄1(οΦX™ΰ'Kvqΐm)²ρμ¦[5 Ε³²iq¬qœ:‘Ÿš€6SΈΒΤρ1ήY‘ϊκPΔrR«’fe'4¬Θ¬™ #zL[6ύZπ¬F­aPDλ r±WΰKžαhA Σ΅Xk9™clΟeΠΊ ωy^žέΒ€Δ\ΏΨƒΎ{ €λϋV_8SzίIQθ³’&ΫΚ₯eB»1w±ΑQψ…Ε=±:2ϊΏ’°8,‘εMlX΄Μ%ƒ T‰αqG ’@ΦBΈPτs j1·_LcwοLγ¦X]βˆ9$ъꈹNM‚cΓοS6Φ»eονeί«#―^%²μ}­μ`M’jΟΟΖ†YtΓ,ς½3‹±:ς:Λv‘Yμ”he½Λrοdy0V—˜W’Θr#―θ©i”zgc±ΊΔΌb\’•ΌbΓ²³[φ­½³μΫbu‰yΕ‰V6ςŠž™Εν½3‹±ΊΔΌβ–’2’Τ§“Lw0LτΣ$ΣW¬‘‹+-όκXψΊKψ²Kπξkςb5ia˜\μKv«°‡δ•ΰOq‹Ι ^·ΝFήh7ΘSqϊ―g°L™λί«#οΌ*rύ“ΛΉžΌ΄,αΖ€α½w₯:μN p›)K-KΈk½Ζ’S‹^Ε’Κ@ŠΎέύ{ ώΣύ*ώoIά(΅λ€θσ Q‹Ν„ή’»Ψ (όˆΒαύ±:"­#’pψ@Š(Ι¬€Ρ_ρ°O,βν½³ˆ3±:²;£(²ˆ{$:ᙐ ›6Ρy›Έ―w6q6VΗΓ16ρ‰Nv²6α؞ίg‰“$ήy}ΞΖ:΅ν‡zgΫοŒΥ‘tνDΆύ.‰Nx‹Π6,’ ρHο,β­±:²YϋDqwŠE¬SQΞφN”σ±ΊΔτr!›sm€—]±ˆs½³ˆΗcu‰ι₯&ΡΙFzΩ›¨φΞ&τXΗΨ„!ΡΙFzΉaΫ*ΆmφΞΆŸˆΥ%¦—‹l€—½°ˆzο,’«KL/ηHΘHRN8; }4αό½[α|"p2―9ΐmqƒ3Eπž¨DενzδE‘ή•΅ΚAŽ"ώ`ΤB΅’Ψ‚?Ρ&Ή³eΏά(Ό±©IQl%^1;<ϊψρ9ήύψ}ώάΡ‚ώ| r'ΐ' ˆ‡j1΄b@βŒΫ,VMWΩΖ°K#Ρ§ U‘ΐh› ΏΛε$°ρκB'ΘK λΚε•Gk™‘Σ-ΣσK¦ήΓF{΄―ΩΈ‘HξΊ²"^dδmšθŘܿδπ ΐg_ "/αϋT9φ-^L/ΜAρρτμCwΉϋxΰ‘<}OΜSw |΅œε—πΰτ §ίΦέ#θΔQ^³BkΌ¨UƒΑL² ;ˆfOՊOΝΝ>>ŠŸœΫΟη‹P ž―A9Δφ“ΔψTU Γ­dΚ|P*Μ(^ΰ³ΎΒψBΠωιφΞθΎψ΄Ε Y,›φ‰δF†m ώ+ƒgρ’zN8\ξ™]yxPΘίQΰΣTͺ‘j *΄ΞRxlXΝXΡΠΩθυΠZ₯Ρk8Ω¨Hs‚Π%Β„ΤΝ^8‰anj°ϋF ³γΕcsqφ₯r΅9’£αΎΒ,t!θH<[{SΩBΣμϊzb*ΙQ[>Β)Ωcυ@,σπaI½μXΈ§%υ‰DOϋ=^ž*δWκV—t²ΩŠ?Ύ/~¦ͺh Ό”‘ι₯ΊGΗ΄… Φh²μ1&HΟ΅ΞπͺΘ΄Žέ1ώo”πtš$vt//pΗp["ΘΆ‘Έc2Θp„£Lμ6ΤΒΨT tΤ;¨šP+BitΩΐ‡₯ ·+βρ2†Ηζy\™Ψ<4€ιΊkxΠΗ2| ΉΎY΅  y¦n<βγ‰GP5ΠωΚ@ׁnΒΒ\:œ@ρΑΌΉPΥΔΊ„TyΫFσ.$8ψφ`Γ΅ƒ vΤƒΪ­ v¨ΑΒ…pfg|š ‘-†ΰ»ςΜ€m8°έ07MkσZ¨c·D­g‹TΑLDQΥFζVsϋ§72<[xBgώB£0,ΐZ°wS"{Μ‘Δ"ώ.gψ[ΊO₯β­κڍΥ:tCZS7mPΝ3πΧ<|¨έ„a½Ή FUƒσž žS5‘‡ΩΠγtMKϊšiy@Ÿo@GΣ,{P¨€ Μϊ00α’€n¬€ΕŠ,ώk,‚ΊζΐξbΰVθ φP(,C Β#@oήԁcβ`ž\ώ«·YYπ΄ΊB`¦ƒ|ΰ9Z E†EvcΰaxΝ ό_‡]Cό¦|Ί6>Όε£‡Uΰϋ  –4,ΑψbƒεŠ»y=Y†ΰdl‘elf,γia`… c>T-šζGλtPUNΣ–V†sέπΑ©@Ϋρ\ ΛŒΑnϊqν™=ΓBqκΟ±4h'(ΣC–Ά&‚J\ͺO½‰‘άž–˜‘­S»R¬!‘£+Žξiα¨ 0ψ?P1>/ψ8Ήπuΰ£±ψ5ψ9ΆΏ&ƒΐždξΩ#ΞEΈ’‘q-(ČpΒcͺXh{΅KψβδΟu?gΘΪ"$«ΓdόYPχ—xŽ,=ή‚΄v|’Qό ™Ω€λc(W3~‹₯εa’NΏœοήr3{ζœψΣ21DfiΠςcϊ)σΚ 1ω(ς-›Gέ’K`L6γτyIύ—%υ/Jκ)θ}ΦϋωMWηϊ”πkrYΝψŠΘΈΰ7š¬-W@Ά—‡‡Ψ8¬Έ°?Γ–Lμ΅99Ah&Ήη]—$=fF‹Έ¦ο$ΔΠ/σS{Ξ“w‘ΞE?=Ži½PεΡŒς(n©fύ{“€ζuΏΤ½Ξ0t?Kp\Πi*ιq`Duόο ΄Eπ–ΰθΔΞTr#PDlτWRGΫ"υKjeΠ©Tb(D ΎΘ@ΫΆhKΨ κδωΆ:Ir‡z6Sχ1ŸψNyΪbU°£δL-” E·:άύ³ϊ|‹ƒ§΄+yΩΡNάm6W‹@)½YΈ_’”cIΡBόίΪ%)™CΫΙA.'ζUF†jΎοxccu8Ήδ5Μωω’ηΥrMσ—JΆ»06ύR{A៰†Έ0‘yn³ŠgR (Ί­ Ÿςœš@Xΐ¨Φ΅B€ 1ΐ6訽ƒε\O½m.vŽΌ5˜’aήΊ£ύΙN§ϊ‘παnEˆƒlΔ¬ΫzΣ2ϊn@ω]£g KΟ$…}v­· Αx_ z θ:aŸλΕθπ₯vGiνΔT‹,z §ZŽg₯¬eχM>yτ ·p_"ΊNδTiν8 “™iΈ&n»ψρͺ~² ύ%Π`U ΕέΩ.Ύ’Οw«=HίS“ΝY}SR]I½κœΥ:ίυ?•dMλmζ眜 5™ω™N’ήe γ:Υ$υ‰‘g TfGf:1ΐ‘Γ5 ΣBΒ΄L„=Ψ ΒΠΉWι“6F@*3φp[„έΙI Ώ”.3 †₯†―2χΆΆΘ;Ε’ž”J_‡ /3Pxo[*¦./΄ΥI’3ή͊'k™<’B)€ŒΎωh[<ιΤ2Σ©ΕιΜζͺ΅ŽΡ™Ι_)d4”Νs­ΆθΌO$ΟldšΥ‘k‹ΪϋΤfυζ80₯7»_WΦ΅_χIjΥΘ%Δ£υ6_e'Λ¬½˜%6Iρ1ΌE§¦3Ω^{fΡξ¬@{½)ZϊwΪ΅t©Ε}kω2(δσ³'‹O+Ξ(¦$/Φ m"e—ΰNDGY‰·Τџk:Žνϊ%ΊM!ΟφΗ.Ζ#ςz±r’ΐ0m―R`Tφ@KΆx/΄ οBJήψ˜$Ύς’ ύ€FΧΠτeΧτ”‡―fΆ‹QVnpκ±b6t€O_κy΅Ο#ρ`ΩtLŠΫ©’ΨCC² ™Kz2«@²5ρ{‹θ%Ο†‡‡ 5Μ:z]±ι}/ΰ™)#i7A—ηΔcσs’ϊJκ$©€ώχ’ϊ—$υ•ΤJRJVλ"(W°‡Fφ²/ƒ½`”δυ~"¨ϋq.ΊœlψӜDjόVΧτCΘ8 δ’Olωtί—JpΎ*’GϋσΚ2™x9Q?£οΗgϊΉŠΖΆτ½Υ“sι/6³ͺ9%ΝΥ&aλ“œψφ^–ΤΏ(P!ϊΘ6JΕΊmΙg·Ε₯ Ωσ‹ΧΘώˆ)n‘0Ψ”Θ­Φ›–o:0£ H(–}Α΄Œp•Εͺνπ«Q5ίƒ­ ΝΟix@)―œΏλθ…`=°\.—πΕ,?5~‘ˆ/¦„Aύτνaύ [?Φš™‰ΧΫ9|tš©?:ƒλΞ0π‡`ΗΈ^L3υ‡gΒϊ[Η™ϊ£Aϋ‡ήΞ΄s*μχΠΜιx=$η Ÿ>Κτ;s,„Ÿ™>ΕΤOΟ„υ33qzŽ‡§g ¨>[χ36v8X¨Ahd±‡¬l9nwφγ3]BΰσXχ:!Pc]μγ }IbfUv#χ$Α4hMί&oŠ3k»°f₯ —αAΕjβύHUΓB…ci«Θ@ΒKΏζΪΝ…¨Φΰ2‚”ͺe{hΏR=½βFΥ¦Bθ+ασj•h³KPβ=„θjΕτρ…ehKΎ²—Β{π©ΘE7mγ7ƒS:ΒφΊγ›†`“θσ2oCk 7Ψ„vΰ «ΫΛ ΤΌtπNxΡt€ek:ώ‚λš―…—(Σ? κ6Μ]I#ψ€~|Ѝ/λ6ΉB)pp±Dΰ`‡Έ\†…r4ψ@²Ε_p€ŠΆϊ@N‰]Όk~›Oh–v_Ζ’‘£FΠΒ χy5{xHλrθ€:ڈU‡φš0πBα£}XMGΗΫ‡μ(tΤΘ’m5λ€?t: lqsA-Χb;ζZΏΤύ:·ΆΉΦo;—kqΈˆ\λ₯\+Λqˆm­­‹tΈ«KόψeaΎΆ)‘ΦΰHCUZ•5#βk%+_«)φ’¨·2ΩI*ǘd*>2₯M‰½*¨{m½κυ¬^•mξVş$ϋεσ½2ΙΔs˜–²Ÿ–:"IˆDDHσ‘5~μz*'tγŽχs>'½cH³»Tο$ͺ,WL=G2Sόψ]Q„ω£ ξkμ§Κκ§{RύTpϊpN3\θ‘½Ώ»3φώž¬ϊΫΧzΊLΈ[³ ²Ψ’^ελ5Ω&$>œF ’yFΌDͺ–ϋ²'ν½ο‚ΊΏεΦΦϋ‘Υz3,NΉΙάχ½±:rπΓŠβ€ο‘,ΗywŒΦχg₯υ)6πlνˆSwiftswift source.swift ^#!/.*\bswiftΔ xΪ½ιrΤFΪ@ΘIBα>m°#ΩΡΨ·±=`Ž*ͺXΨ*`XΖΡhzΖ]h€‰/MžeWΪ7Ω―5juλ“z€1Ԏ«Fφ§>Ύϋκφ“©Ρη—μyΝρΫ Cgߊχ‡d{ιΣTρs’82ŽCΪIbeΰ‘μyͺ0°γξ;Λ βΗrπαΚύέ K¬t†y${ž)ŒμR7¦ο„έ―²η₯βπΐM8ŸTΖζhφΌX˜ΤKόt«K\Ο ΣΉrΞΧ•xεsB%ž²Ε7ΩσjaxŸψ$€5„ε$&‘;%‘BΟ·Ωσlaž~όwΩσta|ςϋ–GaŠγΙΡί7½,F€Hίή8Τo!J·a'ŒΕλ‘z8K’ΘςΘ.ρ¬AΠ₯=JB1ψ§μyR iΌ«‚! ωΠγˆ©ΓbΔΟx±(’}Ÿk@i±ˆ‹ΉšBϊ*ΦμΠxF€΄ΠIDuΑ Δ _Η:Aΰ'gθ)$ϊNθψξŽ\IŠύ;²Ώ„έOHˆB#]'7ό bœ4ΎOhγγωΟ##υVω{‘¨<¨…ΧΓԚvΛl»=gς±~žιQΤ]KΝEŒkΕΑ ΄Α%€ΚŠi‹!—ΎΚ’ž^A»"·τ ½h₯;ƒ§‘8{^γΐ‡Ί3«ό„8%-w@ »/]C$Uy61φ:" y41lιˆΞ“‰ρsHΫhH.πς7„$νι₯m s€ƒaΖU䘈κ}‚™>Τˆϊn8ΪΦΜ~ΓΊ΄PZ:&} IθwδΕ0UA,dBˆάzvXDNΙ ϊΤuΌΒKH³Ό κyΌŒ"ͺκλ@fδS“}0ŒΜMd‘β½5Ξήn!m†©ΉyfήFΞ<Ψ%!Ρ^‰wίtΊ{E₯aH4υ_κΆχ;†A€Λδͺ6 "Zς›+hYπqύ²KΌT”Ρ$ρΘU€hΡι8iχσ=אΞFCβR§$ΌuΌlγτ‹τΆϊΕ¬AŒz€όD΄GΗF₯‡H&°XκN1±H;UΜ!wΛίY₯^/τ8{>ɞ‡ N+M*Z€{/žRΖ‰,6ύˆDΥX7σ1‡Π’‡Pœr皀ΊžνAόξhŸΓb<§ΫέZοrY‘΄ΐ’ύ4ΞD£%K(‹?μ2Ζx‡›wIϊt„ΌΨΣ’{6#El 2¦Μ1·L€ΜςCU,·ηk h' Έmυ©Š% /„φΗzΩ/Τ!"° xJΥ™ˆ|A­½Z…Ήάh2t§+ε]ȌΎ τW'‘~‰2YόsEεvU>UFώ¨Š˜εF{uMњ©JήΝ)«¨π»ψ¬~ qε|%£D―FoD…dGσF{ΝώPCΑ#΄σ5ug]ξψUχήxωk1˜L§/¨TMHτ!f=97Ζ““‹ς ΞψœJHΡ[£_£ΧyH™©΅I‘}ΩΊ%ALΊ`|IΗ#Ψϋ Άmcs)φC{ΖώΝΆ·Ψ{{ηΓY›Ωxάύhb…*ς 0owdβ5-ΉΞPˆδHΎΝΧΉ`£z1ˆͺ!J†Όώh©β ο‡`H΅CϊTρ‡‰γΦ rφ ³m{xκο:νΆ(”γ}.DEn-³9―•ωΊ ’TOL€ΓF3ζM–U‹¦ITžμIθ’²ΌτŸ*‰›j€Zϊu€έ1 9υΩ„B]ΖλDΘ}=Φ£’c2f–=MΫ^±ˆΔΐκΆXN0=Λ©[AΌΊ^Ωi«z-†¬¦7Χlkaz~vu}ŽΩonm™†½ΐl‹ΩσΜ^4vΥυs ³lΌ%;|avLςξ!ϟMcUjήaζEšΗλ5ΕΗσ.UxΫΡπ–=ΥX^7η2›e««l}ρ—Μfl~³½vPώηMΡ:ώ,^Τ“†ρά°―o.YχΆΡΞ¦½χΦξnΑΎην³7ώ,Βώ΄7L˜€ψΩ#]Ν½WZ†Άr%–₯N₯ΰζΖ‡I4ο~»αl%Κ6Π‡’7ΉχΉό«Uφ/οΖkψj†s%ζ κv'Ή¬Σδ¬%?‘£νωRܚBŒYϘb)Ρ@!7v?Kg‡ a=Η‹x(Π±$Ο{²ƒ…¦–¦‘?lŠψOρτP‚uν 9Ϊ{ϋΪΌιίJ‡N$F™|¨Ο?¬:9ζux!'Δ#ώύ¬_U8"{œWά © i5¬Σ‘5­ͺΟ7Uƒσ7ΦΨ΄ΉΆΦfΨΏ ΟΏΧjœΐŒΞ (‡LiΠoЦ‚RΜ¬η76/ή ƒ€ΏΓB'‘?ήςRηVME‘~nI6­mΪ‘ao~ψύώ π§Μˆ……”AvdΪ[ΣAΈ4)s&=kA~έ£ο[‰"’HάQ5Ά"…:‚(Φ#1)ΦͺΨp½…­ά»‘c45πλM-"VΤΝƒŒβμŸί%¬»ο;(ΐ%Aΰ9ήgΟ›νA§'‚L0~ΔΒ‘hζ_ I—ρ;ΜMό`Ο']ΓH`^δτˆΩf{ ΞŠξ˜EiΡPu 3‘%€)«Iz~©Κ—α†&ž§HA“χœΦΐ/jΰΛψ ό–~EIE<‘.~δΓ»„ΫνΘ•“χ1ρωΡNκΗΩΘί°τ½Gbιι³ &‹Q‰άc&ÏΌ$ί‹xEžώ’ϋ2ΚςΩΌd:“ͺ}Χ‰Λ;ΰwHO m•ΖΔB/β$R‚0λ °Ρ 'Ά.›ΐ7ήΐ@βYΪϋκ'NΨεKΐ>άQ ΰ}α_•*a½$±ndεβk`£σΙ0 ‹ˆΧc―ψ§μt©2ΜθχϋΊ_Έ”χW %e]Ϊ}’λ.G¨θα;HΈ8{1Λ‹U(] RͺΧ‘—”ΥkΦ .ι¦Eπ¨OΑBΪί%€ t-ΫƒγPΐB‘οd5}γ ξ¨FΑΧΐg4πψ |}ͺaX΄¦σΓ 6Π³λ£9ΐsR5 *Ον‚ͺ²σš$’ίEw]u8Λί}―aηš~^E_Τΐojΰ—5πΆήΐi৚ͺΙ7ΉD|κ•c ΄VΗ4Έ\ΠΐOhΰKψͺΎ ίΡΐοkΰ'5πγψ†ώXΏΤT&Χ€•δΞ/sp#Ώ™9@Ε^.Vϊ°άV'±Ργrχ—Yγχγ°·LΛΡYœhƒυρžΙž+aΧψ§+:$ξsπh¨Α½‘ό4Ώ^Υ πέTS5Y–‚‚d’=εΒ§5{•^ΰap’Η‰λLμ_ν~ζiNUD>¦U1`’ j‚˜έΥβ-(ρΗ*ΙE’€—ι'Bi±₯Ωρ˜\Υb".μ¨σΦΈ6 U΅Ρ¬\/έζ*ΑΩuš²zyΌjλWl†ΆτpΫΫΖΣgϟ°ηΟ^σμ雏^?{ωΒάή:ώU=\~ιpž=”Z+ΪDiI‘τ‘²j"/2d1’—Uv€6k'Αθ‹ή†Τ9–ο;–+’AY•’Φ9’ΌIK–1±Gδj£Ή1bVWρ0Οn³έα6CΝώ)δ ©ό= άΐΟiΰ·5π•¦ςψUΚƒFΠ]t€1mh(BΓΔ7₯ΛLPώ«EεΔ’™Υ SystemVerilogsvvsvhvhsource.systemverilogid[A-Za-z_][A-Za-z_0-9]*xΪν=k“άD’ν'` ,`0{όθΣm{Ωε1fܘ5,»ΐςfYFγΆΊ[έ#¬–z%υŒχε".β~Δ]Δ}ΊˆϋrqΏζώΝeU©JU₯*©€i›a±ΐ#u©TͺΚΜΚΜΚΜJύ­Eg²σͺFαΐM/N}ΈΊς?-ω0UΌΚ*VP΅;φ&y‹‡³σΣrΕh6σΒ4Ιλ)―Η_|4;?₯Τ Gnš·v,;Ώ¨ΦJΨυΓt0 ’ѝΌώρμό€RΗ‹σJ”Tβύ{4;?+Uςξ¦^dFAήήc•Uy«'*«ώ–U}Ό²κλ¬κΩω”Tu²GέΤMξtηQœvύ>ε½f£π¦ωOUΧεCόUv~^_WξΔΣΚhε 6―σŒΉι―Νu8@Ÿ5Χα|Ni/«'ƒδωͺšΌoΏΡ"2«ι%獾PY•·ϊbeU>π—΄ΨΛͺΞέ؝ε=8©­;wGwΌq׍cw/―ϋ²Ά σ8šB“2΄^©¬ΚvJ‘#Z5vΓqβύ=oρUm5` ~8ΨΡi-5B΅Ε(ν“σ§₯­h{I+δ9FΛζΘl“~ΆΌυͺ–σΩ›7xN‹ toξαφδNž―Λ;p‘Ί.'¨‹ eΛu“½Ω0zΡVxσ€Μ9v·£0εΐۍSv{Mα±ntρ‹Vα’ZΙ8Vα5eΪέΔλb²›Ή1«ΣU:1r“θˆέξ)οΰβ‘UΈ¬ &ξΨύ+ ¨˜cw―ͺΝcρζ V‘Ήόc5^WΘL•¬ήοΉJ„»ω{e^šGsv E2 ²ˆUyS™nZΔ*Ώ₯H".#†ΡxUzΫTi€ΐ*­+8%«sΝԐΨ₯wTψ`“b… …νάρφv£xά€§qΔ;t=;3-G€ψΎ"T3F<τΓ±@sο*”ku1γrωλn(’‹!Vγ=w‚ `Uώ Q¬ΞMe’„^Šg#»ύΎΎhξΕnŜ’?Pή! Vη ΚϋœL?TϊRdδ%όRF*VεΟJ ™pa·?RDL#p§^βO|/ξ&{IκΝ`ζψAΔφ±"ΩSΙ  δ“μ|RyƒTΔ_”žgςŽέώT‘qIΞ±JŸ)δ«ςΉZ…τ…LdVε Υd’‹χKLζ±ϋ_ι§ΪΧ ­ˆ²ˆΥωF™K² b΅ώš™p]€ˆΐ]ρC =‘~ΏΝΞΛΞ‡A7σR·7O‚ž„œ–P›1VιρkΌδ0ΏeggΨ=hΉΑ»— θ–»R4ΒlνϊιΆ’8J<4ρ‚`Z„© ‘7‰b…ΐˆ΄¦ ΰ‰{ΘΡžO½Ž3dέxIζYša½Ζ|K³jωΊ‘ό·χˆ<ΙΆ³vΉΓkR?€ΜΊLςφˆΤ“ί”Γž©·œd­έvv/uπΕz§ΣΗg†ͺIΰΣbζε=8Ϊ’»aVj3-ϊκ§{€~θΞ<ω‘#ΚC―*dμU~κ¨ςT%ڏπ±<—%°Mh=έΠ\" βγ=l@Aε{φhχΝΈ;=3η”HR ;Ρ*Νθˆ-χaZU»ΏήήΌΡύΞνώ0ΨbWΊoo­uΪλxB˜ξς—1PΓ ‹9fκ=Μf{D–Ε9#ŸUί½&T”n{qΟᯟ§'j»¦ 7λσζ‡D$°.“ΡΐjVwSιΓEκYΎΰ(Sδ’*)°…ΜλΎ «Ώ="}rixχaέ,'4IΧ1ζž>&v‚aΪω‘΅Υ1α:kΧ ΗJΫ‡uψΊj˜NŸΚ―Κ?5”`1]Ες/ εŸθŠ€rcUΈlr-fΫL’\ΫΒςJΝ±~`QtLd’5¦%53«–‰ν¨”“Νt"6‡!/›ΖΡbΌQ|•8€G[ϋΑ‰štV—žLtyΙPώ‘ΡDΊ,ߐ?™ XO&δO4A~xS72X0€€€Χ»~0Ήρ˜‹ZX,-Όpδ‘™›ŽΆ=¨‚) ρF)‘Ώ 2°Υ5\&.–\δ† R_VΙ•0kP•¦8θg0ZΩƒN?šγ—tœ^₯œ2i-j?4ΈVeΖΜ7φ±n‘λ{ήufεh›Ί(κžδνσΐ‰F Β$°‚€U»S>HcεbΣ(r5γ:jPQrπ;ˆ g%<O"SFΩ¦Pΐ±²Ωιku hψ=ΠX‘—΅Zέ۟š}RFCΰ½ΐVŽRKšεͺ²“ΟhΠmS„€IΉ=θxc΄γΗX±EσE,j±Vΐ&έόE|6ΧlΛΔtOˆγα,Ψbΐ²ήρΈτާψ;rΣθ²ήτDΛΐˆίPH伈sΣΖ[DΥcώ‹Cy’Ε]€Ρ S@soJ²αj˜|ΗΘέrvΤ0IW²σƒ\*(&·^ώjoΟjΨ,Ǒ̍ tςŽD‘Γ|ομύ2©ίpΪθZη!T¨΅k(BDsωU@|³ΪXuA7vl”Μl’&ι)‡Zβr~Ω\α•œ6«§΅i”ϋΗΧΧ-ΓQX7œδ6LŠ3š^aΕ΅Π)y™ΎR`έ ͺzdΆΨImΖΒL'―ρβ‡άήΩίΘ§¬~‘&)ψρ288±ςΑ³ΨO Δ"€RσΒWͺŸ8RΕ3πρ²VΈΫ­ζ΄$YώA2ΟΥc‡5 αν₯3υφ-…Rΐ·Mδμv&μˆœ}k­{¨h>T4*š_Ρ4+'t/f™.ˊι•ϊθke\ΆD»ΠρΫ·DΜςΨ<<2Φβ’@kκΐ―mώCeκη(Λίz¨LόcXν€܍ί)εΡX›·ΐhnA?gλη:νώ'μ¨ΰυΓ7πΗ½Μ‡Ϋ[„C7pΑE;ξf‘ϊ₯~K˜{ΊUήΣ­ϋέS­Ζ*[:PΚ€β“"g₯RΊΥ$#~c’cIε|Y^$τΪυ•zψΘΟ&.tΫ‰³aK e|5η%μ±U₯Q¬<@ξ&PχZ='pKZ3½ͺ!Iao)ΥY΄Τ5i­λxοh»₯CˆˆΝMτvΣP.ιΗ\‰F*ϋλxͺlΆ1hδGΫΙόψcμΗwΆ:ˆWΒ Ά.uδB`΄ δ"°bόhQ"XӎεΌFΐbΡρ•ZΖΨ–›^Έ˜AΝQΓ€‰Ψ §ςΠξκ`_QŸ2©ύμU )β½#½fK§w εŸT²BŸJ…eσιχˆS»_ ΨO΄‘(ŒhœA-–ζΑ>j Λ‡ψά·ΩΞB[šE΅hCυ ― ϋ$TȟM*Π2c(M‚Ι ’mk:Ψ*Ο)“’Tž§ςδ*ύ–*KΘCνηΑh?§EςΜΆΤ‘(QKώϋL:/ΈφLΧNΙλβ‹Ψ|#ΫΜ«ψ…z¦κ¬[ΈϋͺΧΜc¨JγN—΅˜#[Ι†W0Ψο#?lΜVλ¬ΛΛΆΓΰγ,ήάΨϋϋ"Jau=ŽΓΪKΌ³.’Φ`Ϋ2 ["²>ύΒ§ΗΪdϋγΉΆ6ΪΆ6Φσ’‘[0σεHω>;·ϋw;ηO΄»}¬DχWtΗκ 85όΩbΆ2ρ½`Ό²λΣν›ΓχFίτޟ|0ύγφ‡Ρ§σΟ’/_ίύφ‡οΆΘCΠ'xmc[Α„xBέ> h˜σΐyΫQ0. Ξv͝Φw²ντςJ«+σΨωΈG'6iΏ·²gM}νUχuD…)ΕΘΦσ›ΑΗ³O―vΎ9Ώ΅@π%‰š­Ϊ<*Σϊΰθ6έέΛkžO΄tKυ–›¬yΓ6ImmΘbΧΑΠc!Σ¬8Š΅@+υ{œ―”Βu:~NΖά|IhzΙύΉnnκΚΥMO«:š£po-lw6žΰθ₯z{σ@Gφ܏Mπ₯W5TΟ β€IΤ qR@ηγ|0'εΐxΓ_ήΦF>š‡8Uj9+Κ$ωy”}©)ϋZ%Ž3 Zψλ$}γ ΕΣͺf%adΏ¬aˆΙ©’…¨?IΜ‡ΙΤΩΐΛΎb9-­Mœšgλ}«ύ„U˜HΑΓ…Y-fFNk<~ZΧOάΆ₯=δ‚ψZ^γ^#αcšδ[†C· Ι?Κί(iK»ΰZ’ 5i2Wkj,Άζ5f†“±?φΜ)Τ:Φ@*žιkκβƒωk“hJblΜ‡Žς:M(ο/†ςKΪ’π°Τœ%Ɏ[ί4Sx(Χ/™ΐ»ELnΤ2ΗZiχθMiΛ]jΩλωψ.ζΐΟΣθΰΏRςDv"Ϋh‘Vΰ59ρμ,_Φ¨ΟGΙ Tx`—/“ρΝ’!ΤΞtά0Κ³©`Κ L4iHΰ‡^f λ&›l—¬2ΝΡr΄θ3υk„–γuϋfβ>ςρ΄ˆ2gγ¬@ϋCD΄Sϋΰ‘2φϊ˜šrDάοάο‹άΈ ъɢυ\Γήqc΄λΗ^VXγΦία`2©ΥgUB₯ ι€η‘τΑΠKΛgΣ {ͺB'Wϋ[G'W§UΣΰ΅|ίΌ€₯a½ρλ½Ÿ”P³Dκς©\βU»Ψ!“­Ωηs΅υ½5«&΄ίj·•χiΐx~dωH–•‰;b…$΄ΒΧev­αMπph²bν/Ζα&™ΦŸΕ€&†$^δx1§VœRΌˆ(O›ΦY–Wϋp#–PΜ~€βuLŽ(opD1 c%*d:cž>¬»τ²ΨL'μ7T&Œφ©&(Ί#oΡψ/*²έΨΤs³”f&ΐmΩr%Ύό»§·LΩΜ†ήΤ-IμXY?$Ο2δ:CβQ»ΨNϊΰάθm^ι^ŎΏώΎΠΛ5χ£O³ϋoςϋoŠχΗ7³ϋoσϋo‹χ·?dχέξδFχƒΌύΝκvΪm½ίi;—P·ΣΗχ·ˆΘ?sο”­'5Sv.n^!άR%y‘₯‘ovžΝ™FΫo:γξx±ί9ϋ0ΎΖ»;7ΎF€ό-y“LM‚ωʟΉV©νI‚ζ ΄HΠ,AI§―…—€ώΜμ“~>–-Dΐ`zϊΏ’6M•(ƒ.@¦‚Άoϋ˜±θΆ$>œόIH~f+©A–cΪ~QίΡχάΜYͺθ(ΆTλ2'ϊ2πΣ"οΊ=½aζςξ:CΖs^Η3;ίnΌ  ͺ ΒiίΕHPρF8†2?‹±‡°˜@al7 C’wj0ŽύΕ^*F LUΙΘ%ΙWΥJ ‚cΒ%ά69Ηή lΩ%ΦΑΘ΅@h΅a$PΟνΫ6 S!ΝΫΜΕ‘±q¦Sά£Œ)£ €6Ύ"χ{ΆΓEθρ ρΌ]SSeZΛ­\ΔΪ'Ν"ΖΦjYΚ±<ΩٚΐRž[«ΜΒ₯8‹Lϋ›x;jlެρˆΪAλ29T‡2H₯°΄ύdpξ-M? Xλ­7UΧYιkŠ@oi4Iφ ΛΚ0eRζtΊάο€Ωφλœ`Σ€˜ ζ–ΈΙφΎI»Ί,΄l“ώ^Ξή’(!‘eλN’Iа4Β‚ —Έ£m4φ’ΧΞxΟ6vΩ€PρΑLή8Ιh1Zκ:ΰ+ *ΦL$NΣυΦY,!z?Œ|¦|ε6.)r<+}ž£χ>οΚ~€eΫABlCϊR·οͺμα_I££Ή‹Ό  Ϋ+/W3ΤΠΜ©–š”—JέΟη³`}-¨ΐJΦ]Α!>@™‚†‚σ₯6Ο(’λ±e’k#»«ΥC’@[&χ{JΒΰHKιU¨ŸφlgσΦΩ­KpΖh‘ˆ’W6Ο'–‰gϋν*²Y$Mωލ*’@ΓMHβx“‡iςΠ£Mz¬ΙC'–97~ΥΊšΑΣM5ƒJyΞβM+Ϋ^Y”eu@me\ΏΈFε>6;ζʏ6)•QάHζ}ωΫdΆe9%©ΒSiL’v‹ΣNrۘΎ[΅">Ν7Ε9―BοŒͺ ½ά"’™ΥΐθrJ,pέw88L>Oλq>¨Ο-θ™μ‰β;’pNλw’œn κέ€fδɈ·D"όgΰ†{τ"ŒBος½ Α―~Έΐ’°ΕcξpKΜλ§Έd„]η‚±Fύβ ωƒ-8ψσm`±χάνnϋ)Δ&όIbζΉΩŸ»δοόΣ3Ψ%οΕ^ΊˆC4kΠ„Αδ‡ °Eά@„MkΜ0ΔμΡ@DΔβDήωJZcί±‘v'9x1³B2‰ΏoC>Λ‚Σ’‰'ι€<‰άR4CtC’Ϋ’ Fš#¬αά₯ξ`€¨u₯Ϋ`ώ˜nγLƒΨKΒw@’_`Ζ‚&b?Š1K%lΩ‚› ~Cΰ<<Γ@@―‚VchWάo”μ‚ό½;¬νJκΙ>κ“}1/τve‡Ύωˆ@ˆΰ—ΜjYΛNWςΞaΣάLΪMφe‘ΚΈΞEƒώρ¦‘όš‘ό+ρεw$. : λ+"m|/³σ+έ―5 εΖ 3)ή,_s7.ήΑσ‡η‘Ő߰ωž‘όΟ†ςΧ ε―ΚM’?‰Tτ‰Š2 Ρލ­ΒT«bΆyΖ„©:Eq­‰CΰkY„½Β˜±Lό)pfΊ'³h’Ύ.θοL0`–M«β>a̛’8ͺ?ΩCdƒ#Ιoϊ,g±―yμǘ‹§8Cψœ‡ΆχΓ9vγ=D<²4ΣΈ’“νhw„끽l μδH’ξή Ι·>ε’±‡Χσ;¨]ΜAε§YΧπ™*ϋŒ(‹x$ΒxιιZ]UXρ–< lˆ‚M_žΒΆC!ŒγβH)ΘwJαΛ©LςΕΠͺ™4€ΕTbη>[ϊJΫΘ°ψ§κδΫnΑώƒQΌΎβ’;Ω‹‘ˆΒϊš­©iPu{Ϊμϋx© ”ΫξϊΨwψˆ1•šZ~l²\™Š›“y;§aF·9rΜφRRs\nP£v·α²Φ9GšOα%8ΜkΌΪFϊ›˜œ€ώΨi>@ΑD!ωͺ:όΓΧΓΕΚR|φ'›Wnα_ΩUάί η£­Y 0¨¨πŸ²›ΐŽƒΕœœΖΡn( ¬:­Ά>¦ά΄‘*i€’ ›'άDyJ*6{r \φωŸΓ/ЧIΛΆLΏuj@rά°dΩ—Nκ uΩι»ή7ΰς[—²Γ/ŽθZ―S±—W²!΄?:aJ‹WυΕorΤΘνωlKϋΰfεƒΟI5˜οt³₯ͺχ#Lέ=–£· ‚ή2œŒΊΜŒ»–ΩH0« S¨ψ(…nτ7€žςΠΩέκοΗjύJΗ£Ελ;7'ψ#ί:Lορ†δrCO.ΉMα uΓJ>­ ώόέ?Λ„z§ͺ;}±Fή‘ώ‰F›’–•gSGΊ’Οg-gΟmΊΆ©ΪΕT ¬Fζ‘ZΉƒM“λω–α(pBFΨ·Θ’ ηl₯ΎιΫx]…Ϊ›0`ͺ]`ŽD#YΚμψD―nήZέ*nkm pΤ@DQΚͺm猎vλ@υ ”WrΚ,½ΐzί²ΘζHsΈδψ―Jž@Φ9gΈ…Φ"œ˜qΚ6όΙ-Ζπƒšla§Œ6pB–—Ϋ˜•[ΞΎ-§ήζ°3Y$­qΌ―iΧ,φq[>IΩύH£7šω₯2φ qEoΠ^΅ΤˆŒƒ2d‚Φuο€5χbΛv²t·l/{ΓΆ6Ÿ·1vάγg·9ωHCEa™!λM7g_1bĘzJώΤΙα}j7<Μfβ›Χ’οΦξ~ΕŸv8Κά‘tuΖΪhώΑo w6Πuψ‹w*σsŽ’Μj?)|S6οΐώ’κζ¨Ι^³£Έ˜$΅½ΎΦ/γ\™—mΊiϊ/ξ'l;]δ\BΞr.£wΧΡy‹Žƒίq8BIl'ƒ|ϋ Ίp9π_!^΄Π,΄ΰJΆYr³0‘C,‘ν?dχ2Mqη‘s ύSu‡~Ίλ'ζ­c<ΐέΉ‡~μ4J₯k¬Φ«ϋ†=ήΰ­©άΦr―}ͺΜν—F…w½ΐέ[šqVψ*χ*zwΏ`+“ύ5L8/·J$Ά¬σί9Ρ‚ΦiϊΚ!ε·J–¦»Πϊ€92x :ŒΣq._ΗYwΊΞ₯ΫΞ9'ΩZsΆ°δΧ)ν‰MΔjΫp³,-A¨³βΟικί~24?Δβς°xΪ ‹ϋv‘|QΒ<$ŽtCκq™‘`¦]w/ΙNPJ†μz2aW ‰’Ζύ 2vš}ڊ&œ’ο₯5υς—ό΄ŽA&V ‹eγ`tBγ•–-ήί41ͺŒIKμQd Dg9Ψ6 γΥ²aH›xΎΛ)AYJ d†³ΜΌ±Ώ˜‘ΐΑιŒgQ°GΌ’ ΎFα”;(ΙΕηή!Ϋώtϋ|U’KΏNΠeΩ$Ϊδ9Ω­JΐΥύΐG’ν¬κZŸ†«»2`)ΘώQ>`ά‡¦;„Q‘k–`˜0}³ΰ! 4b“s}¨Δ³u•ν©›z€TΖ“(ήuγρύLΦuί·ϊηΐ|Z0šK’¦ŒοΥ”}#ΡΞΙύŠ}fKYCΞ%v±KΚρ :/ιίΨ›"όc~καΨ΅ΐPπ9Ω†I@ `ˆ`Ν††{©GΛcΔλh ͺ7ZAΫς©ρΆG“VrΊe«\qs‚sρ^§2q\φy”:Ή V¬»τ)d|-Έα››½l>‚Vo’ƒƒjL(ξ―„;•”ιQ—Ή4ΐ?ςh}r‹μ I$qy6_iiφe_ϋΎΤΟ-€»ŸmX%†aπχ½ζ¬―bίΦ%kͺπ,Ύ³Ω[λc—ίZgMί”Z‹€E―‘ tΡΉΧιԌzΤ€η›MΤr‚ιλ*εξ05”m…=UaU‘XΗ «fΐij|Oš’–D¨]ΘAΛ„”~CΛςviώ?Φ^σNavigational Bar SVtext.hierarchy-systemverilog³xΪΝXλrΫDŽ“^BZΰOϋ耋›F²GjZ.fκz m)3dΪ™ΓΤr<²΄Ά—θ†v• ,<Οΐ3„'βM8’΅Ίl΄–ζG•D«hwΟωΞeΏ=««+‹λjΪvLΟχΖ‰½ρφΙJωͺs—iΙΗάγcVεcΎΰcΦδcΎδc.€ν‡₯1„†Ψ›‘φΕ΄½”ΆγDΜ‰πφrΦK¨α5ΧUœΊ.Œρ"w‚BΒ»ίZ?@‘Iύ|ΐ†0?EΞ»―.―VΑM%ΏjωU+Ε/+)7Ε8μe3[-! ΌU3°~hΐξ™.ιq€τ9ϋBk~¬‘cB‘{€Bμψ³΅wϋWRμA‘¦ΨCφR;Έ$…§’¦N°8Hs0‘²ΙE»Χ+νφN½ZYΉΖ΅a/ˆ(σ#7Ψƒ•#ΉΕmŠ‚ΐιP\Ξ]aLθΐ›ΰX2eθΑ}‘Š,D¦Γž[Xδ-TcΒuί“ϊ“P[_κΙ'άΘΑNEegGUΙ£Azεΐ^Ά]εbωρ½¨vU˜Η·ŽύΠΦω­š»&Μέi”L˜ ZΣαύ(΄R΅‹κ#Α}†.sޚΔyooΘͺ̐4o'm―Ύ‘eΙ<|¬½βϋΆφ`<κζΉz#m-ί‚χ¨ξΣ9 υЬ”QŽψ~cEΞΛ—›¬qQΰ‰’Fx2Łγ6&€wύbΌ“Άgδ°W•Jš.i œΫΟΣšZJΏΏDγYIύV‘ΤΡEžMšϊΕbΈ9{šVΑθοσήxujj»ΌBW%F*2šjΈ+yšDmb€Υnήη•§Ξηœ8‘τί"ŸB„l?š8;½|I\cEQy‚ˆ#xF‘gΡΘ€Ψχτ$)pς˜b€PWοy@ Cη2·D.±ζq>AΔ2EŽ+€ψ―[©›Š60μž:hW]Ά έΘmO1rμφ!Άι|c8ωΖϊΦ~‚žNŸΝΎ›?χ_/Ι«θ§£_~=J&&PKΐΆvΨ 1‡ώ ΣBsί±«Ή0ΉL9θjŠ‘ηƒ:ν DŽm ΈGι\V½λΤρM*EΜKζΝ‘σƒ»K<ψystŽΰ"6Εb{¦ƒm;š™N#aBΆ$‹g]’Χ|?£@TΛHͺ΅Rw΅ ;ˆx*z#΅§ŠάsΦλ*ύσ·š2|Wτ …Γz Τ‹άlzžOKΩ5Γ}ž΅0ν Σγ₯Υ…Μ3ε«Sδσ€zμ€]p ™Ζ|5ΙΎj¨υ&v+ΐΉsίnj^εφ»\DžΧ‹A’ΖGΆŸƒgΛ™Ί^ςl·&Ϋ$λΞeUXVKXΎ.Ίf%§|Ά›ψ•°—PΩφ κ Σ!μϋ„T,ύ‹’—Τ#oX¦ε‘β«sοlGv.Ÿϊζ@MηœΥ+kΥj·›αΠ«³Ά‘ΉPΓk°½aΤ :Λw]HLΘ―ΙΩX ½Ryχ/ίEŒI²Αm)d{ς2cΈ­έχαΑ(~/» ϊύiύ¬~±ί~’φ?ΘϊϋηΟyΏ©MkΟςQ‹ωXUQ{ μΪcš:ˆϋGQάάbΖaφΕΰSq„οVΰKΊSρΊnkΈ8«―S’ΰΰ •Ζ'Α—Ε°‡†=ށŸΖέ€jΠQ UσA&Σ’‹Ό-iC©βΒ.{£(Ά§L σ‹s #κ  €#SB±‹šΦ₯“dvΨοχYώnΖΏ}φ°ΟΑ=ReK>#CX p:Β$.}%g)1ˆˆΡeΖφ€?b›υ @8Γž³$Ÿ²sήMvϋ63ΰGγršΔγι’Έd2cΜΨcΥΛ„,=ΔD‰K™#ώ`ͺ΅ίŒ€aΆS ΞžKΕρ'₯σΆΐ„|k‰/Š+P~ΜΊ›ΆΛY4Þވή3Φύ²pΈšTOMLtomltml Cargo.lock Gopkg.lockPipfilepdm.lock poetry.lockuv.lock source.tomlHEXDIG [0-9A-Fa-f]bin_int0b[0-1](?:[0-1]|_[0-1])* date_fullyear[0-9]{4} date_mday [0-3][0-9] date_month [0-1][0-9] date_timeL{{offset_date_time}} | {{local_date_time}} | {{local_date}} | {{local_time}} dot_peek_key"{{ws}}(\.){{ws}}{{peek_key_start}}exp$[eE] [\+\-]? {{zero_prefixable_int}}frac\. {{zero_prefixable_int}} full_date2{{date_fullyear}} - {{date_month}} - {{date_mday}} full_time {{partial_time}} {{time_offset}}hex_int'0x{{HEXDIG}}(?:{{HEXDIG}}|_{{HEXDIG}})*integer4([\+\-]?) (?: [0-9] | [1-9] (?: [0-9] | _ [0-9] )+ ) local_date {{full_date}}local_date_time${{full_date}} [tT ] {{partial_time}} local_time{{partial_time}}oct_int0o[0-7](?:[0-7]|_[0-7])*offset_date_time!{{full_date}} [tT ] {{full_time}} partial_timeI{{time_hour}} : {{time_minute}} : {{time_second}} (?: {{time_secfrac}} )?peek_key_start(?=[A-Za-z0-9_'"-]) time_hour [0-2][0-9] time_minute [0-5][0-9]time_numoffset$[+-] {{time_hour}} : {{time_minute}} time_offset(?: [zZ] | {{time_numoffset}} ) time_secfrac\.[0-9]+ time_second [0-6][0-9]ws[ \t]*wsnl ([ \t\n])*zero_prefixable_int[0-9] (?: [0-9] | _ [0-9] )*XxΪΝZKsΫ6ε&Ν£ΞΛy'N9‰H«δΨ}₯υΤ£Ι‘ήΫ^B2J‚eN$R₯¨$N”_₯kX VEYr^HΛΕ·O,V+亞έwΌ Ϊ^y'ζΪ{³Šxέ;ήΨοšγ8ςƒ~N«eχ‡­ ό™±Χ σ :yλ Ζω7U)ώ›œv#»_h!Š/Ѝφ)ΥΉμ~>»·ΫCΟf`τK6;޽(žaΚ$՝Όέ/ς“‰Rg`β«μΞ+“\+uΒp€<†ο2X«‡(ˆΗ3ΐš²ιy±gΖ'#Δ(6LυνΡ ¨Κx4=¦€«ž? Ύ7 ΣΧ€weζ$ΖηUqΰενNin‘ω₯έ‚Έ‚υQ4,¨#α―ιΤ- 19e΅ΛRŽrΏge)’ςΐ{’‰£{θ^" `0nπΤaC»ΐΚ"–ONˆ…8§D) ™ωKΖn1YU”―‹-ΔoΦ™ ¦(ύΏΰ8·²μmuaχ͜j<*p£ΡXΕaτJa‘p‘ƒͺΚ@ΥλυUA)BSν mrΡ2hN’.bβh•E—&±ξωJ d’WΪΠ σeυύ€€Ty]M2φ°ΧΉΟo`‘ͺ‘xFΈκρ"/£ŒӊΜ2βEEvή5§%Ώ―ΘpχRΆΫτR>l+“B+ν_Τ.zMΠτΧ·ˆm€šΨΡ;-O»a€Ο*Al Ό ?ρϊ$,ͺ₯ής±οΦnΎrU±ς6[9-­$[ΑdΨAyϊ€~΄S¬VΚ+ωTiΈ‹ŠtqC1~A1ώD1~E1~U1~S1~YfάLΗ­αΑSc.³,ιεψm‚Τ‚‘ΛήτΦ{£fο™?ΉΏϋT3“Η}7}'/ίf/vόGΝMΎΙ’—οω—²½uPs¬τΉY3Zι»ύα•[›Φ즩fb$gŠ€ι©xΓΞ Β0>F‘•“³υ Tr]ͺα~βΌKžπ³ν4ΣmDΉχ>FGΪΩ“!’SΤ΅\„9Κ]όR†ΚFΏ`+Ε”©]ΛS§’&’Ξ₯ Θ  qΚAmNEͺj˜©jΩŸ[ί…QΟ GˆnB~|<Δ6κ‚lΉΝ¬ͺ_O\Ψhι~p4 Όΐψœ Ε;=*κ|>Wν$7Y¦0 8Š9ξΠ |εΚ JŽ€γ’§:U ΅%Ϋπr§Τ4½πœ %ΟNΈhY&Ι²2ρ#ΆŠε/%* ©1ψ ˆ]ύAk ”•Θy(°+ΊΊSbWZΖ”«“ρήϋ$y½4υΜ#g5ξmΪζ^Œέ”|ΊβΑε Bσ"Ÿν€™έ'³ϋlφ”‰Ώd–ΪVe©¬‹Ίzž’±ΖŠ=ά„θ[Μ*ήΚνlΏ4_yζ,`»Q7ΉSE‘IΖξ_]ζΈ§r(+ΙJVn,ΨιΓ]…+.φΑ*PόuŽί/ΘB² •-§KΣmΒ ΰ~|b%ΝΛΤJκCύmž9]Ιω½ΉΊ ΄uyΑ=ΙXωNΥΊ£m/άΡJΊ&=YMBλ‰yήfI ±Hjφλ†`‹ΠS–Ψ•γgY–ͺAuΠ\φ(ω,ΧΎͺBAyωΈŽΣ\†ώψτZΆΫͺz0pΌ‘Ώ«ΏVΦ“Wj©ϋϋ {Χ…|Ο3Ύ Ο­2Ο…»Υ\•yώ ±γ-υ1|Λ €Μ3ʈ$q²ΌΞα7:Yu#ξK·9ug€§DIΖο=g¦ Z‘‚Έ P‘’ηΤ;9ξR:RuU8(εŽμkk‘.UϊΧ3‘¨’όμ°Άn§°μ·„΅­t’Θ0§©’ΠPvœ€οΔΑQTw°sMœcάDšώ‰o?~2`ΰ³ςΉ{Œ}Ί‹χ5‹ό$ ΫΠ¬Nr˜+ΦH·&)N/΄Θa…5ραΌ >'#¨Χ)ΒΝbΫρ‹ »)΄Δ3‰’kK.†T€KP€ΕπŸ•Ώp₯ ­R±>^˜όhψγ½Ψu›ŽΫZGJ[β @χ'ρ  .QxTXk.€ΣzΘ±[ŽM|#ρνe4΄1$Ίc;vΩί,$\–«”?μTdq —GΨ(ƒπtΨθŸe*l”ζJSON (Terraform)tfstatesource.json.terraformlxΪ…Α € †gFέΊuο |%‘0(PaΪ›ω€Z±ΔκΏ|ŒνίΏI8Υ΅vfυžκοnLΣΥΔ–Θ­ QB]‚ων(½PδŒΔvœ­Ϊbπ*YD³t|π]όδό7τ™W{`’z ₯~υ Terraformtftfvarshclsource.terraform char_escapes\\[nrt"\\]|\\u(\h{8}|\h{4})exponent ([Ee][+-]?) identifer0\b(?!null|false|true)[[:alpha:]][[:alnum:]_-]*\b named_values$var|local|module|data|path|terraformpredeclared_funcs!abs|ceil|floor|log|max|min|pow|signum|chomp|format|formatlist|indent|join|lower|regex|regexall|replace|split|strrev|substr|title|trimspace|upper|chunklist|coalesce|coalescelist|compact|concat|contains|distinct|element|flatten|index|keys|length|list|lookup|map|matchkeys|merge|range|reverse|setintersection|setproduct|setunion|slice|sort|transpose|values|zipmap|base64decode|base64encode|base64gzip|csvdecode|jsondecode|jsonencode|urlencode|yamldecode|yamlencode|abspath|dirname|pathexpand|basename|file|fileexists|fileset|filebase64|templatefile|formatdate|timeadd|timestamp|base64sha256|base64sha512|bcrypt|filebase64sha256|filebase64sha512|filemd5|filemd1|filesha256|filesha512|md5|rsadecrypt|sha1|sha256|sha512|uuid|uuidv5|cidrhost|cidrnetmask|cidrsubnet|tobool|tolist|tomap|tonumber|toset|tostringterraform_known_blocks>resource|provider|variable|output|locals|module|data|terraformterraform_type_keywordsany|string|number|bool] xΪΝisΫ6֌§gŽnŽΪNΫ؎JŽιM¦ιμxβθΛξ§έΩ?`ͺˆ„$ΖΌ–‡coΰώ…ύ5ώϋ@$u€-=HπααέοΰρZ~}_΄ϋΘόJ’Θ¦  ΛΒq<ψλΝZύϊΆ?tλΌ€^3 [ @oΠzΡ>–Yηa?αˆΫ(ΪϋuθYη˜‡»]΄jp£Τ·'π9ΐΝ’½WœΰہUέ‘‚9^Dό΄_4‚•‚ω²hŸΤΑ|Χρ±„ι―Šφ‡x0ό€­d0 ’Ύ #Π!pV ϊZJJ>ˆΓύM#XI1SαέXˆ"Μ “½}ZƒŠΑό1°—ΰ( \”ΤθΌ'•E1Ζu` rΉ)ξK§HΠΕJQ<t=xΘρΩΫο`r%μυ_„‰EΗap…Ά‚³ρΘρΚ5ƒ}$Xifν7‚#άε_–Vq#ˆ‹YsΑΫΩt(œƒάPαΰΉ).‘φ„ˆΔ›ΤΎ JyΨΞΗ"<φ|«Βτ\°0?υpδX₯ρ3ΈΑz€€ΏlΏ>ΗW/ιΟ^λ‚ς‚hJ‚¨θΞ•ΗφΆ+x…,0ΨCA‘B ``―”2ίg°GBψJBLeπ1ˆμ‘Q΄ΗkςKγ²T «9Τ{»~κΊdτa’D)ξœ™α§]χσ~ώ}=8κwΝ‘&˜λŠ4t±$`½!4ΐj„€―LžΥά¦}¨ ΖΗlΧ(lΖ ‚+π°;³« >QHΔ`Κ5βT#"Ρ—χp‚ *QP%²rξ=MbH£Aš‚QEJ#WΎ1ΔcΗπkœη‰₯Ζ Δ"'Ή2¨ο.b—#c}š±OšΰΨgvP۝X‚ƏTΥ;Χβz°TXFQ}UE_&΅ίΜXtx‰x΄ ‡’ FŽ']±–8cσ7†Σ˜‰3rΖ“€»•œΑT_ΐάq|ϊwJQ[Œ¬ώœ‘”wo˜Ώ\Z-<3›•TKΚ™Qmšg~”μ™fŸ˜fͺ›“O»&πϋσuιPlA\ξμXyf3pl‘KΕ/°€ZmΛKšΥ,>4 ϋXz±ΝΟ8H# Λ“†ϊ’…»οš€εE³!jaΚς=1«Iη_k=?ΛL’wzsΦV4ϋτςτsφ«yJΜχ}š†D(㑍- ͺΩ¦Š–ΕS―˜Ϊδυ%₯ΘÁR‡°E<φλ‹ŒυVŠϊ_©¨‘;Ν™©’0 .G„±H‚4 Σ„ΐv(xB§DΚω ’95έΡ{§g΄χΜ£³ΚΡIΏjΤιLΥ’—Q’[)Ο* ~<½Ν+3y­΅Ι³9«ΝθΉΧ…**6ζwό3ΦύͺMl[mޞŸWβ΅NHˆΔšzξπLΡ€Φ;Š1{ŠώŽ’{EΏθ¨θAΡίmΑCv±U΅9tόι£™©ˆ‘=ΙdΞαUxΔΘΓjhν̘ь³„“9U3Λ€6Ϋ’΅νΗί΅ŸιύLΧΡ0&v€7€ͺ ΖΔC—Δƒς2 >ΤSX“ΐ iΩι‘€h\'N ΅!|€»ΑGˆΧœ”]ζΏ°Y 7PιB<‡½l'!PιEψ‚ΔιξB— ΐρβΒ€!(¦Jύσ Ή Κ3\ή½@ΣΦ·PΦ$pH^:ΰΦP'cΣ€!”$ΨΟhΌ$ μ˜ΈΨ'’αvΟΣ˜₯‰5ΙΰΌoŒI§Ψπ‹/pŠq’­+ŠˆEŸ!;Ω)L·©ŸυΉeNЁδΗaσ#aς_'€“ QŒω*…ΐΖΕXWc€#V|Q@|ˆΑ«Ϋ4άβξ ynρžή½ Ν‡ΆΡ Cθΰ"ίΞfΙϊFŽ›ΰKCœέ#Y›“BΨ%ΝΤ ™tεx`rvΦB!ν1β zσφ—κανλ7dhEW!΅ͺuP@ΪαΩo‹φuNO[@Qˆ(Fΐr†z_“ͺ€HSΗΞ~.ήΛ±£I@­n|œx(>ΟξΑτΰ‘$Α0\h2SHͺ $K‡γbΈ‰3|]!ΰ²snΝΡ R―*ˆuEΑά:ΛΣ©6Q‡©γ&M[K;b@˜ήέXΊκTeΰΝ΅ΆψοeiχώŽzΕΆ9³Νξ©zLSHs*¬OΎˆΪΫ($r§΅DΨb‘²ΕΥ­π”€Σj·k[°›rY«δπ™‚Γ|Ω ~њAfvϋδψxεEθW­ΙxT₯[j_…©Q«λLŸM•ςcŸ/΅Ι§›Š¬―:·ΪUτΏRτ¨θ7ύΟ%4K΅ΐ*Ά­h)ϊRτ?Vτο΄Uc·R#„Ί|ρW[ϋeَ_Άχ΅jk/ž”$˜φ‘ŸύχϏϊ=؟Ά«ωž‰ΆΔ>‚ΊŠ?ΕW~ _™³΅ $qZHΧϋ5 Mƒ¦χNDZaGc~jU!θe#΅₯―Ηo­ŒΩ;<³Σr‹o·ΪUΘΥ<0hžVΥAΑΧk F?―#Φhρun΅Ρ8γ =»Κ/az§ζugΉΓ™ςŸώ¬;{’Ά{ί4ιβ,™οΝΣy׏uο–EpΊ,‚έ”ͺ8œ½ «Ρ χ8V3¦£•aκ ΣρΚ0,‹©TΩ σΕΜς–μŽ₯Ψό(“,…¨δmw5hή/g‰ο–ή[hxΉ/eΠΏε(8Yhx«€ω9Žψο5LωJζsbtͺπ}(2*9±mKΞ½ΦδLEφCΉϋ­ Yy=ρ υΤεšs¨#Šδ,’b³ƒξƒpesσ‘FnŠ?+7ΆTodo.txttodo.txtdone.txt text.todotxtdateE(?:[1-2]\d{3}[-/\\.](?:0?[1-9]|1[012])[-/\\.](?:0[1-9]|[12]\d|3[01]))nxΪ΅U[oΣ0nΊ]‰ΫΣ$.b{HZ5m·'ϊφ„x ‰8«άΔt¦]bgλDω;ό„ώ>œΦφ«)έ΄YŠΎδŸΫwŽƒΪr=“x %ύ˜¦)"œυ;σZy=/ν㐍ϊ %θf£S½‘Σ„ήl¬K|$±ίO!&J»%qWk‡Wκm‰{UΒJΏ#ρ±DLNΠ"ΉWΉ2£«¨ϋus+niCQίάRX΄•φǘ ?‘ω`ŒZl Ω…¦0ˆ―Έf˜:f”o7H{Η ΦΤΝP―V…*rδSnϊο6A·‰ωR’ˆ‡ω΅_ΠςP!νedϋέ]±·XOTϋΠ”›y:΅-ǘ{fΧ¦V* έVbWβ$'1Ο!Η”ψ ϊ ^Όͺ–‡cUk3ή6/4Ώ=ΐfη3πΙsΑGπ₯ιiΗͺVαΫr› LΕdΑ‘’P€K J·ΦΗjnλX"γ&CWN9Jδ‘Ρ'ύ‰b#ΰS‰`ΰΈχνμσW ”ΛC‰#t}E³Δ§όeΪΧΔάθε•:`Νπ°^ΤμIτš€5–γ©\Ώ“x 3 ‹ ΛΎ!U rŽΚΓ²nc²μΉή©οUΘχ7ΠΏE©(\τΝOΨmD ω}ϊ'l΅π#!λBϊ!šuΓNχ$ς ΕRv “Ω©PGžηέ·3/π‚Mn<§^1_―΅ΏaEςe8Φ=K Gυ»UQgγ{b€Ϊ°87‚8ΰ†g­οΕί;—:—*Ύυ/υޱ8‰h’‘‡Ro[Ύ·ΙC2ΜαΠ<Ύ˜fβ&©bL_ψίΩE TypeScripttsmtscts source.ts!qxΪν} `GrΐGαNχκNZ:r―(έγƒΈ€@”pζw)ι„©Ωέ0βbg΅³KβΠΞηΔ‰8NΫyœίym'qœ?ηqβΌΆ“8vό]I§ͺϊ™ξήιyŸσ@βNOO?ΥΥΥΥΥUΥέ/ŽŽΠί {ŒuΪ~ϋš³Ρs»Σ~Ην:=Ώ;]oωλΣN0νΧίr½ι–ŸΦ΅ηώ܈ώwT/₯Ϋuv¦λ^»ι΅7§;Nr΅§~;θEYyύ#OΟe:ΐŸŽΙ4άAώόˆ™ΨΏ9½Ρo7zž―}(Kκ"υaώ|:&uΧνυ‘½½Ž;]χ›;QρηΙΉ’ σηϋ΅ υΣΈξφ‚(έ#Ιι$ΨοβΟχhιŽΪ1cφ4²œwΗ6€Ρr‚`ΊιΒθGΓ(μρ˜ ξ­NΧ -ύ£όωLLz L― }½α4LΏ7W6ٜχΕ’qLΆ-·λυœM₯‡ήoΑ²ϊΫΫn[Aκ“I@>˜˜μy‘μCρθχ۽ߚzNΟΥ«Μ(ŸeΐžbcΛyežΈψΣΙY$χTΘζ3ΖlΓ²xq3W€§•ΈόlzZ‰ΚΉΨβmΫ‡Τ‹YsHxNlOΛαΎέwZ)¨š3£¬q>Ά3DF6ϊ ΏŸ₯έtoˆ ήKΣ³l;ŽΫdbmlφEC:Ω[^۝©I‘”S†D ’B‡ΆΏA%?mΜ„"ΉΛbΑ9+ΙΌΐ4’ ΩKόω¨–°εΤ]eπŸ•(`lω―šnΓ°ˆ²½K\ƒΩ’―dΝ!‰c9k9H>‹O„<θXρω•±<΅νή4:λœ19³t|)Vvn‹Ζ­)!ž7& ΔΌ.N)½ Ζ/²PRQ‹Y€Ά¬d/e©q`)ϋycFΧrρ΅μt‘¬ Y€€›UώόHBQu—cη(žzΫέ«ςχ• ‰%―&Α!Λ’_Λ’Z–ύz–Τr\|!Ψ2ρΛI{-Cb)ώΦ2$–2πz†ΔŸ‰―fHό‘ψZ†Δ_!Ώ™!ρgEb'v’‘"ΕtŠ¨ΞŸeKφ΄ΑήΘ— ώfμ4ε§)i·ύž1d]Cδ]U›ξψπ¬·v¦™fθ¦ΧΫ’2γd *“ŠŒ²o•]―-ώ|<1{TΗŸGττz{c5aoΕδ·a]ΤτϋΪ’όzbκ~ΤΤ­X λnΊ·’DΫ ‰$>ΪόωήΑDΚκΔOJ%Λκ$₯’\θνΨPU ΉQΪڍbQ€&•°φψσ„–”αyšδ?Γ’Ή³Ώ½@Ρ. ±¨Ξ~ls­Έečlι% 7³₯—轕-½δσ;ΩKVN,Ϋ„T€5 ·3$–- 3$–ΝΌΓŸŸˆOτλAΟλυΩbΡd§_şρ™‰“KψκdXu²όόωώΨΔQΊ_ɟ3uΫNw'–;ύͺXAŽqσ–ηXuΏ:O.Ω=Ώ&O.ΩO_ߍΙ3ίόΪLΙ%LΏ.–k²δέΝ>φ™2σ|m,©s–ΓΛVΘ_Ÿ-½„ζ7πη3ƒι78k‹›Ώ.W6YΫΧηΚ&;δ7ς籘lBUbgΖΏ)V°ζŽ2~CΌ²™Ώ™??0˜Q_Έ~cJBYβo‰%(!“£’2kjRYκ7ΩI1F_ωΫ²€–e³}TΔΤ·πg%69: ULT‹}+~p°€^Ώ£ "Ώέ ¨DDK’δΏ#–‚©ΑX‘Ξδt1Ώ+9$ϊoKN''ΓߝœNN‚Ώ'9\κόήX‚ιΈ€a,Μ_Άτ²ύΏŸ?Ÿ΄₯΄ύόΜYd-0s‰πoηΟ§Μ,”μ“ΐ Β A|³ό).Π³@|3Νε"ΑŸηΟ²-!reuΛ:[ρ –cz"ˆtΡΰΘW‘ό/—ΰB ²όecTρ…’ψόE#¦‘_$ό+ό)ά7"γΎHρ½όωn%…ΦΏΚŸοŠ’0»ΏHπ׌)<Ζx/’ώuuλ»Hώ7 ~eIγ"ͺβo#'ήζ.R-£sβSkόmώOΟ’7ώ!­υ"Εί5†‰°n‹οΟ Pӊ,ύ}CΊ΄‹”ΐ€iΪΏ?€Ό¦kͺ¦H’Mϊ‡όωΨ`v)†‰΄ΘθΊ(ν%δ£}‚\¦ώΗqD©_ε˜ίο-7a(”yώ‰1rΜΚ"α?5zB˜‰ΕχfΜ RΨSGώ?·%Β…ΆHτ/Œ!‘%±%lΑΏ4π©'‡ΉwΣ•χ―licόύΖ Ž±‹€ΪΦ,\ˆDΖV^$ ‹€?ΐŸΫ“jhύ·Οςϋωίρ§p1SνΒ"ΝΏ7Ι uW€όόω„žrΠ8+2όG£ρ1FY‘τ?}€'…’ϋΔιZఎξ2α΄τŠ€?̟ΟI-^‘ν?›}YvE’bˆ†EW$ϋ―#ΊΨkΙ‰ʓ€W$ψoό)|2Ιr+>ώ¨1½Βʏρ§FTyχΏD3hK)άΧ³°HώFσc ―"ρOάI\ΕχŸ2ΘΏέή`΄ς§n©€†™μKF3x²Σ>υβ€,ώ? ov©§ΑΒ“ Β"ΟβΟ£ΙyTC°Θϊ3Ιΐ+…ŸM.v©πsyπ<1κηωσ½zJΏ0’Λ©–\‘ρN7Άέ $ZΘIηtžψ!5±ί;ͺO“1=π>ƒΊL ±t.Υ'―`Λ­;νMΉJζŸ…f2³½MΊ›σĊ@ΚM²©2šΚ0+έΚGυ ƒγ=B›4œ¨ΩΥUΠΊ3ΩΰGFu6‰HδΡ…ί.ϋΡQ}’gΙ7poΪζ€ ω¨>ο “τ7£YΦ€k8Oτq3Qœ=Lz†ΫJVIθγ<Ρ‘ΈD‰Ε?=ͺΟ[ƒ1ι&>ͺ‹½-/0»«ΔΣJ…q|TŸƒγ­[9άθ? g>j vέ<%=ΓyͺΕ¦–Ÿ0†>ΣΈυ½VΟ“Ί-Yξ1ƒzLσ•τ7F†Ε$ΑωΙjΙ‘~ΰ<ΓΣi4~2Αs½KΝ₯ΞΛ“οRl3Ο;ΛϋιΈΞlχŒ1ΨS­*Α;Ώ@ΏM―ƒ@ΐ#ύΌγ€ξt½mu2Α;υ:Η{ήΰ˜‘GϊrΗ΄\±ήH/ncΎμΓl8tΣ`Ÿ2ψ0‹H?mƒ"Mσ†tΞ6FDŒΑAϊfσ€GνImrΣg ‘!Ξή ]΅yΪωSμzά™aΔΗq2Σ>)”Xμ€?ρR»#“ŒŽθβύ™AΡc†°Oƒx†ΦμPΥ‘y›)GΔ”}0žυTxfSΰΡeΪΨmπ}RΆΘθύ χŸN;–8X‰ρΔ1l£S+@Ϋ…;€ς§λΪ ΎŒ?j@ξί4 ~HG8B•ͺΥω°v;,_­e¦ g I. ₯ώ$lΉ½Ζ\HC?dJ£UΗ‘T2„`+κ·άGpθ€œ€²ZΘ&d·R &+ofΓΎhiπΜh|όXIKόἈ;€"Nl*—NVkwΒΪjBγΥωJQγ΅ΫπZ…ΘJίfΧj³΅‰υ”Π²ο΅΄ΰϋFμƒMcZΛ^FXS ˜2πς„Š6εΟ`§ΖβθΐB\*+κ„ s'Δώœ˜M)χΟf-wL²Š|‹^Β2š5gp’NκAΉεΪ|e€3™Ο r&'ec}P ΣF8Q]hΉΝ_ΉλUΕ‘Ψcg£ύUl|ϊ―Ε #lα Π‰X0Τμο±”ϋγ–ψΆΔSKόcn{Τ?g‰c–ς²€nKϊ?>2χOΤψwfdMί±νZ½X™ΊS[Ÿ«MΧ&ΧΓCbα ΫsΟΒD·0Ηήζ$ &7ΞΡζL™1p“υsζσ~ΞΫ#fΟ&Ζμab¨Τκiμ=if|DxHiλν!’Ώl‰· *D@Έυ–Χ=[λά>wg]ΰηυ‰ ΓpΉ6―-ΤfPž&ΦπsσΞ: UŒ°δ/Γ·ΪδKHS™€=8Ο…ξub½μ & ° BΙρΡΎ"TΊά¬¨””\Ψ­•|Hvτ₯Ξ*Οθ­ς{[nwΖk“ ¬“σ>Χ•Ψ(KθIΈZ”3N0$’Bˆ5(aνq`μ£ͺρd–- °0νΏg”φώXΐuPGο¨fξ§ ΠPΑ<Γ4σΣtΞdo,׌Yc;• ~kTΐΪ‹wPH#–χ€ρΏXq$oο…ŽγC†xφHι–¨Κ½ƒœ(9Φf1Δ ΅RBπs&₯…WaΜͺ"ΝΰŠPηGdε(εΝΰHB'ΗαY)ϋ@YV.?g™mlbˍvSΫοͺz?6ϋ;wΩμ²Ϊl©θ΅tό ŽηR‡Q)ƒΕ6Z~)©©A؞Ψέ#•Υ^κα~ѝ¦6λA₯?ϋΛs”~Η5[›λΑ2‘s½τpM£™fΑΚ'+ε»α‚5ζZg_:`ΐ†Χzeσq$HšBI«–ρΡs65θXδMΊ6ς¨ιU<>mŽΥw«τƒ₯$‰dv>• ΩΔΘ~ Δ»E‚LΆ}@τ†Σo‘σQ=ΔΨf“akb9~Χ«χ{̜¨£ζΰ΄US,Ώξξάτ»Νa%›1ΝΫlsιs$VΔΜΰHT1λήrΐξΐ³ Α‘ς£ϊR8¨κcŒ?A ¬ΑjlR~ˆš%4"΅—d-‡ΚσƒΛΆ‘Œ„Ε+μ£9§.ΆΩ‚«ίκξ¦Χfε˜D=“§t&γΘΌ€΅O,.Χg/M¬σZ»:±^»:»^™H%fΡ“ίο‚*ύؚM·©­/G§ ξ§ΘI²ι `PΤ‰J­ΚHF3«t›©φύ2κ>λ KkβSΡ¨5 "\»zϋNm­ΆΎ8ύ†3ύΞ΅gΣμ%M-ξ1YΑK°,›•€0iYκG α@ΜΙο ­‡φ±‚œΛk2ϋZνζ³3X θ1LΓ‘œώš€ώ ξVe¬\[C5–·>9(+•ΰ‹,”2ώ-υύ΅ϊLέι–Έ7Ÿη%ττΪ%ώGAŠΝ”rώQΩ3§ `Ήμm–€˜ErΠ+zl΄‘ZΙ_ΣΪ†οW‘ λ₯3lώ‰**έpZ}7*~ŒεΈΌε–ΌvΎ“΄Vτ₯ž_ z~§ψ/m;½ΖVΙuΊ­’Σ+MΜ:š˜’νχX*ˆenjΝΫ}ΏηTvya~ŒΑu„„―Ή¨Ζg+€\¨Υ |ΒΐΧjΠS GJab«Ž@³Ž@»˜v„κiςς[Κ?–<₯όγPώρυ*σΠΚ―­•ŒC™₯ΪΊ­ΤςΧNL=ΏΎ^ZD:*qƒ;/ί(Ό0=(€ΦΦf&π£΄₯±&4t*Tώ ·»ƒ„ΊYr[K₯V°“+c•…1‘d˜Ν#΅€±Z€ €² KΞ2G[DΔ—’ω©PqNrΖ,˜,wˆεΣγΚx0σxΘH9Ÿ tœ β?l™άΌ6δσš3^«εn‚ŽΤh=η–σ7>°άxdΠU#Ά§ ωbTΨ(Λ΅hŠηΛ.m¦?0\Ey$qζNfLΙ"ογš zΙΕO2IYΛNωE5§T3άNΛ2ͺm2β±Λ&> Σέ±ίφ ›0τ‚¬e/„C”Τ²,EΘ–°CYOURެv’0± ‹€`$Y`«DΤwtΑ*ζ…ϋ*pρε,h0ν8EUΚΥpN‹ψfζηr:ΛεqΎ”"ϊΠί_xZa+IΘΥΎΐό£P£s΄$ζΰRΔMKαX ²§\¦©'‹¦ό)‹θ>U>  Ho|˜”q6ˆ suΎ‚Κ–TΦ3!λ)Ÿ”"ς"z“ΕAKncwίαΪmš€.ΔτIʘ€\«¬kαšMΤ0e…ύhΔd%,όΗ~ΰ{υ$LΝΥ΅«'!Qκήƒ Qσμί<ΙZ­ΌNsfy [[g”#©%W;¨œ9·Υ"3WOΞcCxξ“‘θ rY…‹Ϊ>Y«DυMB5“#ެ « 6"ΧξŒ•ŠΗGKAΌΑ(oi—ƒδAΙ½αΆKήF©:_ς‚p’Ά{³„–˜1b Ε`(Ζ­2nΡrΑF.nŠ_`ΒΘΪP^«`ϊΉJ)ƒΤ2ΤίΡRΉ2Η'ΆTb,Ζ>wΝUφ’V@Zζ ež™anKsLCζg}΄•ψ)dki‚¦Ρƒ&49α„$,˜‹ρW€?ώφaπθη£ ­°œa|—wƒΎ<ψ£1-k$$•+°Ψ8R{s=μf₯R^¨UsΦis{?‘ο]—-1 u83 ΗΩί?Α…ΦfŒ­ΖH2a€m†Gωcƒ7W: L΅ŒsFψ*>$«e‘)Z‘ͺ U€™Ž‘ΌΕ˜(_₯π©KΞKrΓ5l沇Ν“2~š›Z¨UΚwšέΨbˆš΅ΥŸY«w–O°άŽΛ €§δQ ΕJ«΅Xiέγ•V4«σΉ»›U<1n'ηΛ•)ΰ0“…§ΰ,g)8K‘Γ)@-t8…§ κB‡Sθp Ξύ£Γ±Ÿ°!ΌxžT]nSqvςL/ΫDΤ=,‚Χ&μ*πŠ9NΓά…9‡CδjΫζ"_B}‚i>GCŸπseϋ£•$Š£ti[ΘΣςΈΖ‡CCΖMCš u% ΅π;un:^Ο<`EΐΘον™Α‹E,ν+§ϊόŜ³Υεξfj2ηFΌύbw›Φ*»#]ŸMχΝz"’vJβ'kΕrΉlwαVάIτS©O™˜ΌtΦ€[JߞΛ%\˜ΤT.%Πvν ·²CaΓλ4QδβNVΐο+™`·Sσϊ₯φΙΪ|m p΅βΕ|x :οL8€iΑΘg―όs*tI΅‚SYϊaQ_ΰώ%ϋ Ωj(€yˆIξ΅rμΙ oGίw—‹ΖΞ2κŒπόHŠ’/-ρΟZ¦’Iη kw$νPψξCΕlPΜΕlPΰώœ Lξψ―ΪΆ»oSWQσχX '^K&nΰαΎυΤΜχΙύ˜ω†ŸαžT• ½6R2ΈΤΐHΪωMχΝφΏl{5ώ₯gώΉ’'cQέΟ“tfΤ£ vv –νΤ{\νΰ₯H ™ι¬Ύt]ƒΠŠXvx+υΉvΔΏΝΚΏή§—8" Χ†ϊOE0λ.Hoƒtΐ†%\ΆMˆζ.B‘VR ŠΡ5‘7ϊ¬†§ήˆ¦gA¦6‹ξ]΅Ω lV•Žζe| η1˜δB6Gsξš-―57½ν Ώ³>²μxχΰ!v#°gϊΕι7p›Χ³λ•t 9–L!όΔvf‡½Αs6>ϋ‘¬»NχQφ}¦ΙΫΖ. Kp’g+Q'L€ΣΫ³™pλΖξx}ΏA«μ8K ίkΜNΪΦpƘ“Ky^uW9œΡ ‹―¨cϋκ7Ψ&ίΗΤŸUFM:PDϊGŽ―§‹'m€šyŸΉ8ΤVίθϊΫ΅z*ΑΪΤ٘έΦ₯?dα]J—ς{•an£[θ²έα³χΓ+­73΄€„†Αh“Λ{c&—έ ύ½( ώ¬z τ—Υσ¦DeΝ‚KΟ›xšΌvΘ$ώέ—ηr Q–&'ςKΌNΠ@–gr0 \ r²LRoΙΙgιŒmοQcψ‹k/»΄œ(1γaIWš^Ζέυ•… ά XOˆn2™QG'”I0ΧTk>?laŽυ†ρΡxΊO;αΡΦiΦ랬#-㙍~·΅wD¦¨‘φrͺάκυ:ΑΒά,#²nxˆ…’£SθΚ ¬YH4GγΉPΛk_ŸΑϋ»ΡΉ‘20Η€ΗΖae° μρl_ΚCˆ’ΉΪqJ Zα}Λo¦{vν‘³“)h8†Œ’Ν vΥ£2*Β‚USαW@Έ{?B(•Λ @jΓθ›τΑήOΊπα¦Mq’}a—Ύ*Ώ<ΰα 7ΊβŸ8=­νήL½2σGw%£d"”B6IΊκOqD#n*]Ωώ3ϊž„κ4-Œ¨»<—ύHW}β…Υ‡WR}Z–»šΈv£ΧHrΕέNψΣ p_\ΦτΏξwηf2ΝψAs&Ϋ£)Œώ~PzήήͺδΠ7ΰ)~l{n…ν¦ˆM˜[·'£Κ΅ ~,s“(N€,N€ός>‘ςGY[X`b{_±½OΩήΗφΕ§+ΒΕ‚)€U­³©¨³‰ΝΗhΓ72ΌH,-K₯Δ“Υ κ€΅:’uΖΟ©šψ J͝ŠΝρόž”ϋΐrτŒκb€‘w|lπγ΄h τAβωι‡slš¬M/ό&l Ψ“λΓΏλ.΅αSqm`›;+μBή’©;λμδrqŒyeOΏ™€½·Γ¬γDS Ξ§΄xζ>jΩ~Νp„‡―J)NαN•|iWKƒ{±4ψηιLoF»λ$Άφ|kΝοΫ“:•+U2+es—AN‹Νp­yBΗ τTœ­Ν†δJ·O(}8{7ίo8ρŠ92ΩΪO,μ 18#‰“υPœΒ΄Ÿ§0 ΜΉΕy5±ΚTήΤ&λ;£–‘Ο=₯f§θμ»ΠΩ†νμ=π$M£‹£# t+υν©ΎŒjmA χ7‚ήΎ0b‘Ÿ§œB·F±ί²XΙ³ςΩί3>œ‘‘ϋg••ŠE Γz* >£e…n9ΆΑχ‹ͺΘ|αήXΘ~1wWέeΤ/…T₯RΥE]g\bMUΨ.ϊζΧχκ’·ϋN’ƍήΣRοΒφ$³*Ν‹žί‚4w+ζ@ΒιŠ'€Ό‘R&—Ϋa™œ[L—ζΫ’{¬€aœ{»p‡rv‰XΈG 9°HWξ“e9§,£…oŒbqΟ4ιΪο€Ρ"ο˜?B*GάMW«΅QΩ ‹Bϋ±OKθ‘Μ«žΫξMrHΆtϊ‡G³4= Ι“š.Μe2l=˜mςߏχείBm7Ν&π»ήμ 6)¬–΅ΧΪΨC’†3Θ΄G“[Θͺffόƒ€§€›c*Ψk`EΔ”vχQcΛAΦλv§‰‹Οn/¦γqΎžŽσιδf˜Υ+ ’Ώo–3Πά ,¦jΘ₯Π;δφ wΒ[hώ_œ>λLo¬ί~ώNΨWί?y‡Td΅ΖΪβτd@]qmš±9Ϊ½ϋβD#'³αΆλ΄a±Μš8ϊaγfY²”˜AΑκΪ0”!£Ψ5Δ2šfή {F7h8 ԝΖυš°ΕK84,Μ‡‡…ω‘]ΓλϊθP’aΪdΚzšT§ ^ \ΌU8Ύ6γ»ύΉydνφ§ΦΓΩΩHήΏΌ8 .-Šχ37ΪΦV…G\©š H“>%ϋx›N%Ή€ItΣ¬g™Θͺe?,‘­ΖνπΕ?ιqΣλ5Ά¦~z.UγgPηώϊ h;Œ?«b?›=Œ΅+σΙOs·x¬˜½QEή‰Εγν½Β£­ή[#–ΖςΎWŽvIs2Ώ‹‡L<¦ΙŸζ]ύPDψρ&Αf~Jj8 ‹² §ίκ‘q½’Ρ>U,H%:[ξhmbνΪm;Ή0:Ϋ†σr?pnSΤ9Λ6QΈkD$vυ-Ht—”όŽΦξ,τϋΨΰΨΉτC–Ή&¦^λ SΈχ\Ξ]‰ £δΫ‹ή<QBaΗWX€εNΛιΉI/ žήŒλ+ΡχrυM‴ΚDtjZe‘RήΕ±i‘9}šΗ ΔtœΦΈίεYΪYΪYΪYΰώ~:΄σΝ”‰ι£Γm¨<Ορ{ΝM·9­N σO!2N!iXj ;Y—vLb¬ƒ:Ά5› ›ζήݘήN$Oΐ*MΒΟ.ω΅p|χB‡Θϊf*θ)J?³Ξ°ŸΆΈ|ψΑlΞS)Ν‰“4ϊ«©vΫU‹ΗB‰M;­.Λΐέs‘Ms_xCΆ.³Ρ€o7ƒ¬λh“ μI²D7n‘;m_‚ά{PExζ+9W»š’φρΈ^tΑΌκίΨο«uγΊΠ_U;Bj.Gίtϊυ–Χ;]οhΊΰιγνυnS7K°“€X^Ύ} ¦σp.ίyUεή–$Π#Ρα>έ»η¬”B|±Ϋ‘ΖπԟςZeEγ%έ¬6ρͺ<)σΰ§Ή©…*¬Υδ{enΜPDE^d E±ϊ3·π¬8φ/γ‘‚²†ςIMζ)ΆG;Ή£ά βJ°bϋδ~nŸTwPΆL¨ ’ν`¦Ω ;κ…ς¦m9YDςpΚ–ΣήμΣ‰OΐR!ιΏ›RžΩΒ,G+GŠ„8ςe7ΫΜέΣή°Ω½R.¦οKΊηΧ"Rδ#1²§reΠH¦;/>8 iυϊΝP‡ce¬τΝ±Y. 1\YϋZQΐ­δo!ͺ-°½ώsΩ―XQωAΛ©»­!/™1λy:±ΏEMΓKνF§i«Έ?­·P1zωκόά±π6κΌΈ©α1»Ψξ¦#Ί„"βΌ-QQρΝςό…ρ|Ό²VgmTψo]έ»‰§qβPhhΦe©ψ^ οδ:ω‰œ£˜'Τ}t#)]…‡ιœΓΘ«ˆ˜/˜;QoIΏ&?K؟ήR ΒiΗSš–hLΒΎ‚˜)Σ¬γ}FREΣ§“ϊ]κP?ό-KόWXΈΜ\–Kαδ–β)&ΚVΕ]›³|γ“Ή#ξ†qΪϊmΆΆ>²©ΈΜš’₯θ j4w†»ΧWl‘y5όyo’ΜKŒξ’ έ~²aβutιΰ$2:δPΏL92«c€σRtήϋ ϋΖ{‡ο’Œ kϊλ–ψΟ<Έlψχlxwl8/M˜lΈd°αiv Ζ΄\η¦νEϊ\„ΘιΕ©*ͺΞ†Bb ‚>[4 h@Ρ+s΄8Šθώδf·/ %V§ΆΆ[ˆ\ίΕέ(χφQ Ÿύο1iρOœΦψύnÜννqsδΙύύ6e:Λz*΄q¨TˆVΦΧ=²P+ u²P0 ΅rˆ{]³{rgΆ@§6σ”fΦ&k“ατt…ά?ηͺε)0pLŽƒέβͺsΣρbY}•KΐŸyόΥΟm5?³θ«½­sπ+‹ΎκΕ” qWdβ!ξ*ί³6X‹?vŒŸ>1°{Ϋ&”νrυHfŠ{Lv…a\¨­₯»ξ§iyΝ|C·hkε_­ΝάJαΈCDΆ–NdI ~4“ Ρ>^UpžΥκκε]‰Š~<¬―»^τ·gΗ'Z’fδ#’Ν·*%qyWUJl&½SΗΫM ΅TRuŒ]μτ»n)Ψς{%jiI(‚’{Γm—ΌRuΎδ%Ώ]j»7KΈIoŒyŒž …EδD$Α}‡πN,j €ΐ,0ρxjΘβ4W)eΈΗl¨Ώ£₯reŽΥΕYuΚ•κΜΤ ˆ 1=-ƒπΜ β ΘR86vΤm₯Ž0ƒRΟ/5]²J(V•nz½-$&QŒΏΤψρ·ƒGχ_šcw^€ŒοςnΠ—σ„1¦£^ˆ€r…_•Ώ?vuδτB­B˜Σ°†H›Ϋ{οͺ½λς£%ΆΠ‘ΗnFoΝώώ (ΰ± cŽ©‚ζΠχ(hΗIyΏšΎ1οi£F}ƒŽmΥΞ,r?­dqλTΖνκGm+Šψ=˜q >œY€βڜΈ*OY„ŽΨκxHύ¨~xnˆ­ Ϊ§Χ‡ΠshœSU‘NxV…Ε#–Ά§]±—t©šKϊŸ΅€KόίΆΔΟ%τΕ½jΫΟY§%ώο Ρ6M)p%7υΊ}7'‘σ§<£UΊ"Φ}Ώε:0Œ‘PΨ^Ν Ψ†Σ ςBv$2*5qΔnΪ½=’Ζ;‰εά΅΅ΤŒοΙΚΨ>" Ε{ވυ27†"Εΐ{œ@ž|j5"Ηl+qψρς»0'”5θι1gͺESuΙΪΜdMh²–•Š9ψ]~νάόΔBν¨8―CB-ήa-©MΧ¦+XΚδ:ΌΑsz"*¬λ€jO.ΤhηQŽΛ™°j£­1 žQ1^½SMXmΞο dοN’zΫέΞ?ufτΟ€HaLˆ|6Πm₯‚Ah˜ gΧf'”ΓΠY°ŸΎ Im.ߚȎ(·χΔ{’zβpΞ‰σ/«=²ΈθjΔ‚VΥ]YkS¬'ρŒe2ώKY)ξ CQœNJ&!­Ό k§Ω΅šFORT†MCυω£™Gίέ;ω½™aΪ¦ 'ψTτ8kΡ‰·Ψ?{vςq’•Πδχdϊ#­θ5ΖgΣwŒŽ'w‡8|έέ΄b €γeΈˆOt½z©Bn{m§ΕVY¨k™EEt‹MπΘ IοGγθ]@‘^fΦΏΊα³₯h|6δ|PCΞσ9WΧJ΅ή:ŽςμlšΈkΥBϊ~£J Π7·Όσ‹”ˆαΆI‡ΥYχq$ΆpΨή94|οήΗήωPΐzeξzΒ2oό3΅€·ςσž†Σkl…€<§ΥΪ ™ŒΪλξδ]Ϊ›§ Š’τEΝ―Ξg½λ:ΧΡc·η΅ϋnΈιχ|œΛμ6Ι½:ο£––΅|ΏCΠI›˜"ψ»F@Σ'„0ΪZnήήJi“SCHl4τΜ5’­D₯αcZaΓ Œθ‚_n1€ΎΛ~έ@¬ˆψοUΘ‡9Κ”‘·‘Ϊ§-ΠΒ³ιΙMu mΌ–4΄Εν±bY:@Cΰ ¦©λ0δ…ιƒ6v§‚³–œ¦[οonΊέέR» J”–έμξ Τfόk–ψO[&Ηο·€σ–ψ±Δ}KόOZβXΰω–τΑTΔ8ÐίΪΒ΄ wέ³p*7Θ΅—R ορDQΜNqI’8M―Ί¨€] ημž†ρž‰Ρ™±πk§ΆμC½kιυ>žΟθ0±:L·½Ϋ{οΆ7μ%ΗΆ?1’»UχΏ3βΗ’ΊQ?²ΑF+­ςσž·=£Σήύ10ŸΌGσ©‘GH"ΝΊBΖ²‡{Α“f§3Ι}ήov½ž›Τυ`s?ί\iρΛΪΪοζΟ« ¨™εδsVVnΧm7άΠΩnN7έ( αu‡^Ω¦ΤJΕΐ?Άh7jΆύiΎˆ™nyυαšΛ€»tΨ‘#ŠfηsŠv­ωϋxΡΤ‚s’fnUΖPΡ… 7B§γU*c€«±ςΰA?l«|Λ’¦ΠPŒ‚ϋ­ ι7LΪ;–20©ΩΩdΉΝZ…kΠ‚Μš5MΥkYUΉ‘cΑιχΆό.o=:^}©œœŸ˜]'·ζ9x§·]ΣfΧ+cΌ§ΉησΙ swΊ΄‰žG/i‰¬‡ξ d‰9~ΐ>γςQ‡r `EΉξφΈ ±ξnzmVŽ©1΄ά|μn;^ ՜Χgϊ0z»€π€L¬ΝδOΖ4ϊύλΝ~―ϋθhTJΤρ¬£qτʎž¬0Ώ²“½-§WB„!#™GB)•–qΐ-H+Κ ’’$‰~IΔz §PΔDΖΚ’”WͺCίΉ·΄ ‘Κ3σΌΆ?8΄±εgTΞ;β)ΔWΒ\Ρ–PY9|ΖEˆ›$ΰχS‘ƒ*ΊεFη/lγέFέpΫ»’ΥΐΉ Ψ2€Κ}p8u°³]χ[±œϊ;GΈ.gΣΔ~–¬œ‹œͺ[½^'X˜Ηΰ-γΑD4 Ι#΄D'Ž-}nυŒίcQ)g|LŒζΕΎΧ,m£ΖΦ!₯:( Ξε†+πK8Λtz(ΨΐΈGGϊλA…η• πχΠVζν—Ό62½ΰ.Έσbι¦ΛΎ•`R άhΚύ›βάS°P©~Λ PΪ%αείtƒFΧ£ΣΎJkΫpqι΄~ϋ%(χ/ΰφKP‚βOΓoΊθ΄ ¦^(Α«W­ΞŽUεΫyΞ#4nSE”˜ugΈΫΊ―ϐ@γ&œC»eP›τ*.£bD{΄tΊΩο–Ά} £N Θΐkbι¨E ˜μ±8ύ†3ύΞ΅gΧ•9ε¬Χ z%y·ϊ\©ν·§ω•ξ%δΈΡ7,’vσΩF#Q+ Β—ό ₯>&Ϋ :QK‚jy,‹Σκn ZL ύ_šβR ;{ΰ@ʘ«άg<ι±x0:΅­‰ ˆ΅—* wNw3„}”ΟωΩ9’‰s>±fZάΣa8cŠ€©bLΕΧƒ‰ͺΗ” ZLEΈόZ¨ζPˆέέYz\›₯―( ƒaΡΤ‘·ΫΫ‘ξΎί1pDΓΐ΅R;•,O…Βyε~>”pΦi.;!Χ‘#»Pqs–,Iƒ…0θwθ"ΕefBΎ‹$$§Π`‘ϋ«G5¬>’…¨ˆdˆοδηn;PΞξb4μoŒSI ΖΩς›B¨ jbr&vτΠΫ}ͺ„0ή9lˆ‡ύΐ TΖ„3\GίΎƒ"Βz),1ηΙϋŽΉεžη?­³ O‚Μι}·²¨n¦έπL”γε΅γǏ¬Wξ7)‰΅›V’kβWp*JΫπxVΛYρ)DԐ€%*ΧPΜ€ύΙsφόgΥ%βK΄C?:¦«ι»θx‘67±CόΐHυκ}ΰ«’Ÿ0ΥVX mΘΥa½_‚’ΒlΆ@ώGΐΔ9€ψ‹λ‰–ΐ‹6ΌMsT. SΉUΓομt½Ν­^I:‹π'ufΘ§PΦΒΕAΦO)«—°ιAƒ9Χ£Ω†/ˆiΕΝ=%Ι5&Ψθ:‡Ήk  Τ[ˆ# |A ?xΝ Ο½ΙΌ½8o…LΔ9K#έtΫLŸnΆό:€άςΠΎ5Ÿ˜¬·Ω±^ϋ0θ5Όήi?·‘Λ½ήΪ™ζ:,:αΚ ƒQx²p QA 97#ΑΑ·qΉ&4’‡s^RY7ΰFΜΐͺΆ@™ŠΫ>£©Άίπ[-§Έάξ –Ϊ~Mu76`’‚‘gχHΜqw!όψ­X”ςOΉ[Ξ π³9€Φ&}ED’"@Iœ„Ά΅‹ώ:ΤE;vSΜ=kΝ`]‘` <Δ;((dύD75θoo;ݝ’"Tπ™.]ψM?b-th₯œΪΪhϋ€e*ΞsΘy"ξSμ'Όαu/΄B2β\D „¬Ί˜¬\Ηj#‚ύ˜EeΈeαΪOΫgώπχZΘΚf#ϊ)ΊξιΦζ.φn±}'Θ–’½-%”6Εξ}² ε±ΈŽΓζΕψό>n““xzΫd‰Λί€γ|3F½‡y|Hή–±‡φl›Π‡-œ ¦žˆCΌ=¦§>fΓ>cvš)uch<’όd °αΐΌβ«tξ}γΣΉΰ •}ΐ€ΝΕ‘Ÿlk»Θ ω0BΝJxϋΪp[έdγξ£ρr i¦ccθδg<‰’v{‚έ―\UΟ₯0θς„SΉIρπœ>Kμ5Ψϊg" Γ1'Θb‰w–ψœPΗ£9λΘ»³έζχω7T@Ύ>?Θ~8#ΧjεΜ±«}Y{ϋκg’•RΎσΫΑ½/.5Κ~ΠΈrΣΨδYO£Γ κͺβ >v,k 3ۈΘIΚ''’Λψ’“7ςΕμ3fwοUψ’ž YOq=^jq=ή=ΎγβDΖΤβDΖβDΖ‚¨‹‹‹ορ‰Œό’nFzΡi‚(l0πζJ'©–qΞ(_Ε‡d΅,4%C 2T•‘ 0Σ±β"ς‚ 3F±Ί;‘ΛαXΟέέ¬β‰y<ξδ|Ή2f²Παœ₯ΰ,g)t8¨…§ΠαD]θp N‘ΓΉt8ι>n9ΖM;{Bž!ͺ7”Ό@£»―­O”Ϋ|γ[μ©ZΎzx ς€ 'RRϊαE°=7ύ,ό3ƒ‰yRv0 mθE L QίΧά₯υ΅Ιιυ-•X A!zbζΔδ Φ’sλͺΥ3QA§ς‘d…({!’€–e)BΆμ„­ΚzͺfΡ=Ÿ˜±a';±°H:ΞΛX%’Ύ£Vγδn­vƒΚ$TψΌƒzήL;^αš^<‡ϋΕp*¬έ‘VΙQΏ‡· ΝŒŒdd-_͟Y/‘υ»8Ώγ‘Ν΄6y’―0UαBΊ©kLJ»ΈYGάdΑΘlFΙ7αΩCόKϊχYW,ρί«(EΠ‰\j·Œ·ρNύ]ZNΈ˜ {zaμƒ‰«Bc‹§LL’ΜΦ89^j,1 ά›­\††ϊ‘Χήp»΄›^΄-΄~_ٜwkεχΨΥηkS€«50_Ο‡Η€γƒ&)yBrHβΦΡό6[θ’jM₯κ‡E}ϋ–μ+΄€BJ‡˜gˆ:IΨf›ZŠoΉx,1Sςε>‘†όamΜ IS§6™HE@frιώ a¬ŸΖSΝ`’*ρͺν“’¦›[γ42γ™j8f[†σƒŒ\›Ϊ&γzό£ͺœ"&ζΔΞΛθ̐ρ²ͺ?œ[~Λzžs5η―i½ΕΡ3“Dg•ΰ€2 l‡νΆ…ύfό³Δή‘8L•ΚΣo%±έ₯4x΅6£ήi6@¦™Χ‚Iω$(Ϋ–χΨ]h‡s·η‘aΗJμ†ΗGFγ¨zb8dΕμνŽ'θ(ΊΨ+ΓU2QI"q9Տ#3&μ2ξα”•Υ,ωŸΤ‚‘Έ@0Bƒu7€²ξPύΑ¬,jKϋ!χ'Lp_ᡊ¦ ‹›žͺsι+΄gT<68oχnάmF‰'JΨΈκK#YΡψφPhΔ=  ƒΝΙ²ΧΦv·ΪΞό°nΉΧ\Ω°›c’OκˆC–bnά²Οοιϋξ-ύ·˜ΤΪjA¬ σ°Ό\_Ÿ,Χ°ίͺ·_‚ΞΓ{νCό‘›;1Πiαm‘βzΓhŸvΙδ„ŒΉ(qςK m»ΨN€Θ€άλnO WΉΦ,p6WA.H½Ζ­€‚΄Κ·+όFCl8< „€Κ‚‚ΥΘ6ΈŸΛT£ίmν$5.νfD³ώγΙυzm΄“€ί?}*3?XΟ/ME§ δ^ρΫv’δ?|ΑπΣ™ώΥωžqI„lόϊ΅h™$.T«`Ό9/œ₯ύ’Ύ{‘ ΙqSdμ……²U =r&3k²hνεΫx+ιΥ;`ˆ‘‹Γ‘K&™ )qyν 5gΌVΛέtψϊ‹Œˆ?–ε–c.Œ1šρ:π½b6΄-eF›hR²H3'Ξ&ΊΎAω±΄œΊΫJ؍ο2&rΩZyVkZ)cKξA¬ΆΝροK–ψ?c‰iKό§,ω°€.K|ΙRΞGF㇁8#πϋ]ίI—'ώ]Kό‡,•~ a²†ι ™τ­|‡Ψ—‡η©χψΪΞΡSΣθΌ›ΗEΙ8†ψ…ΐμώoβθγsΉηΒ=8ϋξξ°ϊGhςχΕΝ φAŠΦη?sΰΎλbyο-D·έ›9;˜Q›`‹$y4Qα+RΈ΅Dn-Μ4]ψΰ1ƒ”sΚΜ†fΫrlα$Λ'™~θ~δ$±ιφΒΐUΧ β|VΖŠ3Š3Ύ¬ΜΈ‡§eΰ Δ•b.@ύe3Ηκ=‚?7’ §Π–y]ν¬©j1ι“^1ινγ€G©εΪΙυtGΓ—3βw€Bfnο稧 : NΗυ[.sΐ§/9ώζz7껹џX«;M~ef Ώ*1œ½¨£Ψ+KLΪ1Σ–φΛάΎό§P·ϋ­VΞS¨E? ϊy`a‰.‡ΤqΠΑPS•‰R L»Ώ ΣjcfΛ½…ŠU[W<Kl?šΆ”πκ^Ϋιξμ%„q&ΞΛΦ΅ψ9ΆοŒ«Š>r¬ ™`οdΙfήΓwποI•ΓLιm3:7²”ψ“ŸΉΡςΆ½ωq° ΐ½=?ιαlΓ"om‡†ͺνπ΅=4Tm•λ‘!a|ΧP΅ YΫ»‡ͺν=CΦφθP΅½w—ŒΪ?šM<…œ 9eŒΗν2†³λ;V–Ϋδ:°“¦[aςxCέ’ω_oλψbΞ.Φρwe?—a—ΰΕΛ¨ύYKόίΆΔΟYΌ5IπΦ(8FΑ1 Žρ€qŒσ6Žρs–ψΏ³‡c΄ΰ g(8ΓύΙ.ŒŒdΉΙ%qεpγ΄;{Ν|iΞΥ^»ι΅7§;NΦ§νΏώ–ΫHΪϋω_ΝΌ”ΤLm8'š™rΚ¦8}‘|\ K^)κΏXΕχ;dna{]΄E緌¨L?νΖzO˜ar&·2fΐŸιhێŒ»t4‹P–ΫNLαέ―φM€-H3F}ΣΡϋρš†χ½EΊm,gΓ†ύ”ζx$$(”ξΡωΛ™yΣVϋ*ŸΏcα£Xˆf…hVψ(>Š’bšΛΛξ.ˆφΔEp%iF{ŠьίjIi₯Z[K_έ\ΡRΌ'ΚΌΖΟΥL/βU-ŏΠΥΕYL‘_ΎSdϊθxCKρ”`xSΤΊcL Μꚸ¦₯xI9[+ΖΙlWDOΜUΜΓVΘΒΝ—Ϋξvœ¬[Δ?6˜kΊ…¦qXΗ‡ŒρΘΰΨ‘\1ώ¨Ύ>N9ͺ&΅΅ΙwiV&Š›3 !¨Έ9£Έ9£Έ9£΅Έ9£Έ9£ κβζ 7g7gμןύ挻Ύ\Λ|EΖ™Θ<ΌΫUZΖFŽέΘƒj36XR ZζρΆŒtπ@ΠΝ_M+οΣ©Ff†ͺ©°v'd‚oΨ™ΕŸ‰œθ±-ΐΞ9Žπs.R\d5ͺρΣ’i}/―ŸBΗ/ΓΞGΒ&ψ‰g.±Ÿ1:Ύ3wΘ%¬6JYΧ(₯€¨f΄ ιΪ£«±)ζ¬$ σhJΎ*LίpZύ€-‘ΧF,*ξΜήsvη”΅½wNI;¦ΥpN^ξμ$΄Ύ>2boε^έ¦k;„ο=–τ#–ψk)ηoZβ粞oχυωG‘8©(”Ηρc‰δAEΚ)ΝΈ}:gŽτ-Β™ψΛW?£+1wΣ@γό%ά…ꇂͺα\>—ˆroΛ ξΟΈG˜sΩ«:Ήž‹l€ε^ΉΈ―ΈX=ZΧBλZh] P ­k‘u-ˆΊΠΊZΧBλzh]=2sΪmΏG ~”?6xs₯“ΐTΛ8g”―βC²Zš’‘ͺΚP˜ιΙ[Œ‰ŠΝlκ’σ’\ηπe–Ήμa3Ζ€ΜƒŸζ¦ͺ@•ςf7Ά’¦Eνcυg^'žε“DΦƒΐe ΕJ«΅Xiέγ•V4«σΉ»›U<1_ 1PL‡™,t8g)8KΑY Nj‘Γ)t8Q:œB‡Sθpξ#Ο9iΜίƒΫζ¨άσέnl‘NΚ¨ηHTΦ Π:֚@±ΧARbT$ΈV»ω,θ η¦Y“dκulγtΧέp»ne@ΐΆS}ΰPLϋ,ϋœ@)Ώ\kNNΑΏŸ‘UjwΐŽbN[ΦΫ}θ&P`EΚΉaκΡ qHΓ"£‹γ…*‰.γτ{’½œ―€ίx4yho‚@έα΅›BΜt–¬0 A ΓwΣ±ΧF‰[Ύ}ΪΩΒ'X>ΣπS‰ΟΧv7ξτ@¦1h<‘βΊ»*RžΡΔάD–š΅l ΡΧh\ήθ[&YtaΩφtcΜ@ΥžμΩƒ)c%CϚD1“%k۟s™k‘ΔgΓIGkΛ»$•―UΚ΅«J«m‚x QΖO6ρ<ζ^μMG!f[#ή6g6ραΡ «cϊϋH$έΑκS[{ΦVοŠj=Π|4ž»Fo$ƒΠh“ύϊΪ\xLJ«^Fl΅wmωœΕ4žΥ$EœΕςΡρΚ Δ”6ƒ7‰oΣj Ψf‚-·&ρ€ΣoΖSF/.λβςyΎ«k₯Zo}Κ³³t³ͺ!_ͺxm4"9-†VyN/ƒJ €7·ΌžtP—#Lά£6›γτ©85ύ>0›i&τ žnž=‡,Δ¬)Dγ›.π“cρN™Š­³α³Α_†$ϋIβ]rύ«–ψΏb‰γ–ψο΅Δ¨%ώϋ,ρο² ΫΩ._LhσAKοΆ”5f‰XΦ‘+¦(XC€,Β>θω’Πυ…πϊό:[z<79^€π§YΔBψΒgx`ν“ά…Β3‘Α"ͺ· ύ™/Ÿ‰xcFu]Π.&\%EHΈΊ³]χ[αe˜ šfl#ƒ (Ιι–³-r…―ΉΞu„ Ÿ«x]“Ρ₯R]ΏVο{­žg\Jξε'₯ς §…¨‘Ι)\rql• lχœ[ΤΘπΚΚrea μ έ? £‹iu_Μ!τΟΆκ²lxι°Τz­?92‘7€H»eΒ "ι²·νϊύ^%ΔI½ι:’ΠiF}†WhγeHωHœ;t±Έ1/8‹ςˆzΑηBŠϋΐ%ͺgAE]χνΎΧuΡr±έ°ίζ₯Bΰ†Π&@a0ΰζΙ₯8Ψ*8Ί4#8οτΆ„˜˜εβΏ²SB§α³Ÿ­Π Ό6ύ@¦9ϊyž~·ΒF½Ϋ Χ ­w^x>Δ\” Έm8?Ϋ'Β XˆwΓ ²†[;ΏzΫύVΨς7ρί‰ηθ·ƒΏΟ‡Ϋ@Κ`ΐ;ώΝ°λ΄›ώv8Ζrβ9^!‚BoCΕ ΡλΒ*cαXy) ¬¦[οo†M―“ IΩΑ~Oϋ­–Σ ά&{]κπΪ>RΠz€ox-W<ρcηΩ°ƒ’~( ž«=ΰρ@;°Ζ o:έvIΚJΔΪx»οI|₯»žξƒ•`›U|ζβyRPΰVΓν0,ΓΫ+ήζ֊\–kˆ[ήξ΄Θ{Ž:c8΅Θ‘XΎ‘~^΄2.ϋΧέ6KΉ λΩ`‰Z}[ξΉΫ,ΠSšέd8|HΨi­6€!ΐ§–³CΨ9γήπ.*ȐΖvxKA!“ρΞΘy τίAaԈ’Vΐ¨˜3ήYΑ'Dΰ,Ψ[΄ˆΛ~Ώ±½αtπώ<³ΣvPαˆ=έ%H /1Ό†LDΓ ό Vΐή8έRψ2 0αY ƒ.’)’PMΊ½Ζ+ε,.ΟJλ“!ͺ“ή-Π‘1QPfXέ °Σ’ ~: ΟβZς,πP/UR“_vΆέŽΣΟSύ^5₯썁ω²λ·ό#6ΦΥ θ@Zn7_Ή|ώά"9φpό±¨λ„;rI5βԊφζΐ0TίύζŽφN©1Œ'huβςΫe ]φ l’έS3A,j€σ} τœΏ©ΗάΠ*–‰/jΒ%Π7Ո³žΫj‚ͺV‹σΫΖ{wϋ4[ F“π“Vσ+_z0߁hQ½ν–ϊΎ|·Ck1Θ‡΅ˆv§ίΣjΆιj½qnY{sκVΛ9k σΪΧΥw`SΪ+ΞYZη]½§Ξγn-ΒΧ*Έhv#ΣΩk1͚Fœ' mL‰2»βbΏ‘…bPΨμ:-3r[‹θΊϊ«Ώ‰]―ΐ§EΛ νάŒ6f[πω>ι iξ€WFΣ«…½vάφ™S+ ωα#” MγNƒΙπώ*0o« X^^QDΣε&;ZCH³ΔNy½m(”0ƒΨ!ˆ"i~α #ί`r”Sχ@$ƒtcμ―Υg­–φrΉλmb…ΠξΊοtω<„ ƒΘ5<ΣQK™οŒwšΟ‰)λός™εEZιŒQk›“‹qOB‰ _Ψ§7…ΡD¦¬Ψ7’ί(PŸ‡ΪŽΤ1»ΚŒΌΡ;Hpύ@1?ƒΦˆ°7ΌΝ~—7Šγ©VΠSez±ΟuΆΗԗ؍ω]k5€Λ‘Ϊρr DόπΌίd3ϋL"½X‡₯Ψ †G0θΒ 0Ν4±t2£Κ₯ A ύn—D‹nΤήnτM•Adδς™±θε·UG1AΐmΓ;ΆeSpΉΗ ΑψBrΥΏ­ ‹§·ΌV“ηDχά_ψ\άΨ@"ΎXDA<"$ύ^ Xz\ΐΔ΅ Γhqq€bρ[ΟƒA€J;Ut„ΥΠ,y.9;D†Ν&NβU tω€Ω”ά—”•³f"§AR0M\H(Ρηξυ1-ΒuπXC5Šcϋ&6v°TI"1qφ‰V-΄‡¨s°¬(ΖσaY‚ƒŸ#–ΗΌζάp[ύM°Π]ς=όβ“COζwp *F²V&ϊK|!(l ‹7.„0§bE1Z[rξŸ‚·SωƒΕυ5]Ω΄m™λ0 !-πBΙ`½βΎ₯r΄Kύ`+ ­Έ›P γœ“…+—OŸF―d’l—^5ώ—\·Š1œ!aΜ]λι+ΐ+t\ω‡+׍ΠΨZ!k)γ.cKΐiβ<Ζ•ΐ‚BsuΎϊς’˜j1άήήÓ(vΘ%‡=sήΧ$Ίθ[ΨF΅ς©iΦΦ~'JΤmκ`S’ΡΨŽΣ—uŽtΟcƒQ„ %–»— Δ˜ιˆ„-‰ΠbЁ.[A¨΄ϊVΠAEyž(QŒD‡^™"lAάi―Ϋh©H>ές:Θ™Tό2™GItΖέ΄Χ ‘ΌjA(.PΛg” ΖΏ•/Κ²iLΌγ2ΧH‚QΈlrz1.(k%z΅Ϋˆ‰½υτϊΊ.˜ώυeΔ«νyΉ΅-𝫼”¨WΎT\Κ»Άό‚w…vtšΑιMM―N7¦‚σJχΠ»\Χ^IOˆ!ψ 3U₯NŒFΉ\[§Ζ»₯@kgΣΧ?΅vZzlŒάΔiΕ4LτŠŽ’τ•FΈΪ[Οοh―B6Ζ^wZd’ηaάΥ›ͺr”rκR".―Έκ«ΊψΒw˜―Έ₯2Ύ‹FY½γuƒοbΘj/’d„hΒmd½ͺΥ‹ϊrωzδv%Υή"­¦­ͺ΅κ €‘‰w,d Χίns’VεE+¦¦4gmΊs}E’ZeΨβΙyˆΤR)aV@ΏˆεJΪH„ΐŽ Π5tΡA‘V•μ„h*ƒH5/†A*W¨N±ΖΰΝu_sZΨ΄+Λ,ι•ΥW9#~uεŒt@{ͺ.•BX3z ϋ§΅‚’(HιπVΎζΦ_>Η~¨Ζ_F_zgΘc/|Be5R I{uf‘’+`¦6«ŸζfŠΕ~)X†pΓC!1\^?beFφˆλ~ΎV’₯Χ/σ(A§g]·IςE_i{DΝBπ§HX΅dδα>˜ρΡ—V©φUΏqένE‘ƒ―^†š‘σω²σ52%ρ*"?ύIώ’k:Y5^PηŠΐ¦ΧhΑσ:κΰz!°λ―ͺώψuTς€Ή­ε½½NάVΊ ³w‹ϋ-@σλ«η.sΡοV]%0οΐcE|,Φ·ˆ₯¬€ίωΎ!Œυ‹—/―,ŸΊryιΪ…‹g–ΒΣg//^[]:}yωβuρόω₯ —ΩΛ™‹§―ΠΫΩ•Ε—c’υ·Λ_ΈΔΚ%£Κ*Τtαεk«Λo,][ZY —Ξ-Ey –X-Ό²tvieιΒiΪ+ΛK+‹+§_ΑŸΏ²΄z™ YΎpfιuY&¨8.\Y]Ί΅Š₯Sπς™k§_Y\Y<}yi…b/\ΌF]šθœŽΧz$Ά­ Ÿs7xθ²ίc‘ΧΌfo+tnyAˆŒh“yxFAZt(ο$¬… μώQίδ_Αt?€aS>/ΆYΩ,†RŽρDύΈ‚0ͺLνΕΒ«ϊI„±‚±μ3Π#[!¨ΔZΛέ°αp£b­—œ&Z(Π/H& Ё|ΒVŠ^μ ή±-˜gž\/ΩΆ@α6Π™ΨFα“z†ά%‘²Jl8+uΩBc:τs {€+lΠ*9DgϊAL²ΪΑ°_ή.aφd(t0,=T€vΒ_1ΪεNeΔΒΎέsωc©Ό«ξ6αS§6˜ΐ•Qalβrέ4Ω,|n8ΐz9εEο Qό•)ι•wRω‰7¦/θ¬ΠDηyψ•+μ°IΆ§EIΠ응ρ#BfA b„^ͺMnAEy’ι¬ΝM&l„MΏ± Β>Ι)JΈ`9ΠeΟ ΔKι› CuΈB…όΤ‘r @ωIeŒ51χVWπδ›6ΠΉΑG ΊΑβΉΝθ=RΊ…΄ΨΪφZ;\…ΙoŒB―±‘K.ώ‘a 7ΊΖίSlάm¨F-z Β-'8 ­£ΐVΈEvxaΕnqέύ–’?ώ`[]wƒ~p/LΈEΫΓ-0‘€Ο^gινΎw#τšπ³Ύu ΨCΖ1Ί±ή#½Έ‡r*ηD¦Ύƒ0ͺ‘=R ·Π‚R­b’0Δtμ‚ \ ±ΣΉXR'BhΗν―a=l!ΰ—βΖB\q@ x~XΧ`(€ί GΜ‡Ζ"ͺ`[„v©ŒΊYόφ&μ!p3θΦΡα6pc―ΝXΰγu²"_\Q’‘”Yˆ‘ςΆs‹­ΓmT\Γo»Υn»½-ΏnΓθD(ƒpF“‡-c‘ŠήΤ™ψRR‡Τ•AΔ]mmρgΥ«·ͺΫ|N’αlάΆύW8Ϊ>a@€ 8[–Ω\&ή &5° †μ(ΥΠίΨ`ŽLLRΗΚ|¦°φΫx@ψ’Τ γLb%.·όNp‰ϋϋ\ρθΐΆB&Έΰ τΒPΖ+˜„mΊΓΨ>λ ρFΘηa†}ώ‚θοΥ­!到|œ:€¨ζsH`cό…Φ%,Θ₯κˆ©„}X΅θe†}ΦρnΉ-ΖΟ;ΧΑ‰!0£ ν1– $E"H» ›€Η L 2p†υωΤ7A5*ž°Ž3έμaε‚ΑνN?‘δχ s?£}™Ι~± <‡pΟV[t^H’wa$vΉBύ2ρ":„o„]ΒύŠRΧΏΙF(ό‘ «ΫoΡ0Ÿn£'fšYΊ„±Ψ\œ>κ[»"ΡL?»"jƒχ~Œ2Š――|&‘\hΊ!΄ΈΈ †έEτΖΔΫ)’qˆ™*>D5 γ6θί¬οΰ:-`“{`o³-¦’dΉϊ†d@@ Ψ†αΎ’Α :…€e§ηlX„g2'α°w 8d&”γΟ"Iœ:ΓΆOcΫπΫΫfi"­Iο,*zhƒ {¨\ { ηE A/ŒRnώ†fφΫ,–Ο„ύΚrSΥ••sψοJ›νΪ‚„ΉΰΡ]άΔZ1$ہ/|…7ΐ7ˆ₯Π/±˜<›ΐ…Ω©ϊtoΐςš΄;α 6Ρ~ψU€QϊΪωΥυΘ%εκιJαδ\€šΰδœy7Α>;ΤΆΏ†iYͺ±ϋ'›Ϊ‰Ώ9άΖ1ξΪlφqΫ7`-ΰ6ρ+P‹―‡Λ—" Γ’γpdj)ΐ μ:΄e dvœPšΈέ²ΧY‡³mΙΩ3ΐ;oθ’LPWΰώ½-\ 5nΒ‡ƒCΥ†kΑζ:¬Φ6ϋλN /°8ΪΒ"|ΫΑλ`Μys WΠ‚dΕΛ(,ϋΫ`TyΆςmuρξdίΙyΔFΘόθ}ήχnίΞ³©#-ρpΦΝQ–ˆHΏ%*ˆ†…&ϊœCδ6ΡObεYpρ&’θ©dΚ\Rw@ΟͺΙά“7K§ΐπ^d°Εtb¦Lσυό‘!{ώπn`YΛί›€>_>wρΤ"Τ(“]»–ΊδΪ5Ρ;|ο™”A3ΘΏρΓΉtΣcΔΡΚxΗχˆΨ`Εέΐ@ ψtQε„A%A GαλAφ`"1 #kLxq⊹Κ#g*δh,@.T‚UT›…ϊφάF ,–Α6˜ ^΅ϋ’QλJ—MυiΛ —SšΊ€ ±°t–ŠZ‘˜]~ͺΥ‡ –(ω‚Θ “\ΘτWόΑš²*V κWΠWάV‡Κaξ„!_α=Μ¬¬Σ)z{ςμ§AƒpνΒ€yO6‹Bν`€ξς˜°ŠWκ£wΩ’uσ λΡş~¨"θ¨4xiŠD¬ΓX¨IO˜_§gκ-PN@lΟΊaAM—8‡γ 3 ,“BΙ υ¦Ž‚'tό’₯&d§sXΨ’hάβΤΞ³Q˜uΝ"ΞT0oΡ²ε`ΛΓeΰ–&D@]07tε΄”wB?[ςΗλόyjη)’\ƒj±†ό^φa>ΕΥ&θΛ―»΄Ξ»μszxkΊ΄ƒ₯ [ΖαœJEB[Xžΐ?ΘΙ΄.ν]zτΨ€ŠηP,̝‡)Τƒ΅©ί}Ω*‚vŸTτ―ΐΒ’zjή Ώ€›ξΟφJ ΠA/W.ŸΞV +AΛΜ(ΤΈ―ψ½λθ>ΙύtίŽ\̎ΚΖ+Ρ·Λ1/ε 4‚„›€G²Ή$O¬n£icΛG1€μ†KκV6—4κτƒςΞ"Σ°/’ŽiTbƒ >0DŸ@όAšG•?…€©H€ΰ•΅λ „)·a±ˆK~§Ο†%{§,άlΪσ/ŸΏΜΝΟWΠƒ‹yρ[δ_ιι“Fσ°7‚Jω5†ΣZ2Ρ)€ Ν:ι;/n„^,A ©~^βΪΰΣ¬%a³Ώ jk·η zΏΝΘΛξ·YΑύφMs²ƒ›΅μυ·|ίF κμ βͺ^Išή‘Έ%[;"…ΚfOͺ‡δΡ5LΙm‚‰ς*ύ0ŸΆ\‡Φξ@‚h31‚ΚΕ€ΠΕΩbͺ²)pš:#ϊp…Z$ήoΉL N“˜ „Šυ»7Αl‚G–lŸζ42¬0υ-²©Șy ­`΅`ƒ“e Œt-—c&$wQuΘΙͺΛ&1φ8΅Γΐ%ΐ–ΰ΄!;£šiB».κ |’τO ζ‚»ΐ εulϊαfV¦ΐ†σ°XθLAŽhΒ†ήσΧSffX•a,φ 2η‘-ώ΅Œ/„‹­–‚(N€8zξ C€@,’λί(θ iΫ`qj­ΕΘhΉMΛΤΰ`’μωNX‡Uέ#€b„ODh˜3Ν’BιΫΦ β2S†Α|η4}‘'$ ς DBAήM4BAf`a2ίΥIϊϋΘ™Ϊ—ΐήΐ w¬Λωͺ—xΥ―ι,0s£hr₯QβЌ&|_Ϋ£‰™ KƒΛη&΄:N!ζ_JFEφ weΗ²pώΊβύ)4ί‚Ύ‘{RςX‘5“~Ώ<žƒΕ<ŸΑ§ά{τ!g °ΘΟγ&_#½Τ’8b²£-γ.¬ςT|3ŽxCgΎ FDρ«Q!§ε"wF²R+¨ΏΚTQΪήI>}p{šφ&Α\’Ν"Ρρ_Ζ΄#RE,,BΫ>Η’4ύ¨˜ «θŽΫoΕτλ"ΝΎq2`σbδ_•vwς8”nΉLZaΖρ,Β‘—ύ±8Δί@ΐAA§μ•Ζ Βz‡X…Qa¬R6!ͺ 4Ϊ:r(7ΝF£FΨj£,’Νe‘lFP²νCΚ.3ΤΗ±Ž3ŸVI5‚¬oΆ§r Š{ΟC™™vΡ²‹ώ²™0ύ¬Ίξuέ¦‹B0π‰%lΠ&_Αψ&ΎJGγ€ήδ¨P_. W‹Α©‘@’Z½xG6ςI ΧQн…c5εD_©.á ²{fΉΝτζΌcSz”žΪYnŠ’xTpjη΄τ‹Π’c.s Η@ όk mΜ†'m¨/ΡΤ„/Έό9#ΦQAΫ֐5γ &ϋ˜Αρ_„nυͺR_‚ ζtδ‚φt8―KΣ:;‡zυfŒPΩͺy±ω ‘g¨AV`$¦Υ‹bk]ώBŒiDE…ρΊ1ˆŒθdϋœaξ„έ’ΐ†vmAM^@έΊάf,Δ Vσ”q Λ†–Š5žΔ.ίΏήο\PΝΙX‹ΎΔμ˜4›γ¬NS=NϊχΪΥ†1¬|!1DގB‚uιfλξ6Ή ‚΅™\ͺΙ‚Μ$^ΥL ͺ„Ό@:~ΠγϋΊP ξ0£)Ήpp|IΣ«Δ“ˆ•‚]N³#Žcηmτυδ|EΘθ˜_Gy/3+¬ʆΤX&„Κ"ΩH€™C{CNΣ%GdζΐωuΚh•0Eά%n)Ž&Θ³]¦˜a}n7β‰fά*aΞΒΊΘ•D}Ιέτωθ…FγζS κ€LŊ’΅­ΒηyŒΚ滀°t Υ²X@}ς[Š΄ ¨GξΩΏ}OnΖάΖΜΤς((§€έρ₯c-0Ή}0ΘιΣΓ«θ^;iC6b–˜6€}αaΞ_Ξ`•Ας’ˆ#0ˆΒqŸΐΑ—©θUfηY ½ρz¨ΘHGΒ­γnη *‘0p₯C™εmrw!i§γπ}vψA}gͺRΩI Q׌’u½Λ9Β{Ξu—νΜDλ9»› ­ίt ­ι},mΫ=s“,γ\5@λή Ό‰V-φΫjΛUj#hΡ+bx•##QR:t™φΆ\Μ18*Υκέ[ϋγΈΝTAΜpšιtβ΄λ '₯N±qΚ€ΜVωPλ ?―6ΫYήC  έSh£‹ήM€κaΪ7F,IΧ;>©‚)οΫ³ήΎP~3έ΅]αΗφ°ΟΰŒ©τ‰³ *εiΪhbŒ3ΘΜΖΠΟΰ…V²€΄›­~e΄ΠߏT-[Q€±F ΄ήO ύ‚‡*v¬1§r„%ž„¦xA§'ΏέΪ©Τ‚IΌœΜVΖ}ε°Λϋγε=΅“΅ωΪΰo.Ϊ=† c•°F·I†tρ/ΏΛs=w{`DU+x±gϊaQ_ΰώ%ϋΚN#R‚<ďήLŸPnk)ώμ‘ΤɁΞR­άΰv·+pq»7Σ―CΛ)΄Ϊxζ$iS[ˆULνΩΪνθLΆόB²L,›V.΄I“‹ΏͺX.Δ‘εW<0ψΥ™!ξQ―±ε Œ'ξm+Ίxx!}ˆˆΥπΰh«οξ$ΐϊ«2Γϊιά+εή–˜ξiβtϋΑ •0uβ-Oﳐώ-ρΟ[ξΌϊ’%ύ Kϊc–ψKό –ψ)KόqKό΄%Ύl‰Ÿ΅ΔWΤnΌš»Λr’Δ«±c²(9(Pq*ΕJΝΏp›9†Hη\³ “Y―™ΫΙί>τx¬3ΗW’X ίΥΚ’€ŒQd¨Τκπjg«jΣσήοΐ ˆα£iΈ‰9Œ@½m‘ύ (瞈αξμ†Ρ–η ,γWd˜ŸθOά‡}·oaύ΅X#(ξFεΏ.3G•—YŸ€kΔ€+εna„ƒ‡ͺ’Ε(H Ύ6 D^Ξ?œe婍~<±3,œbάΒΙΚAnεo2N]x­• –ώV nkƒ‰oo͊›Fœ{MέήΞΪeά—ήnΘψvΓΗmΔχλ3ίΉ‘xΉƒΆ§!x9]%Sημη€]θ=`»Ζq\˜ΝJhρœE}Δ2°»hlψϋΊ‘}ΒS©v§ω{έΜ2\Ώ^kγΧΙ6ήͺ”qBq₯5ΊU΄Laˆ]«¬“½½ρfG:v&•œψqnj‘Ί^ •˜ ^―π¨ ΰ/Ψθbω•Ϊ‚ί8’u’”—„C]ΩgΙ§γfzΉ8sΐ°™„ίo‰›‡ͺσՎμi΅Ώ9 )™%DξΥ_ξ$M#–β‡Ή“ό±(@J’ Σo²:™ΎέT\< ±Y·Pνσ>ΈF5£S„‘^°·ΒΛ7jέQΚ„ύ“ΩyΪrωϊ]mξoњϋβξ‰MbβΰύNf‘0 fR[«3tbFyIΚδ隣g’ϋΉŽ»Έ:φ·Ž$0Γ‡-άκ“*0ο“Δp,\δ…CΛΥ6ˆ›Vš`XωΎUωΝZi―Fά?£°C:œ‚χ³6X •«S•θ2uam’G7²»…dΟ ΎŸ”£#WS¨ŠΟζ‡BΉν]Ή*yξwΧ¨J.ηO¦KI{ˊΏ%iΔΖs‘rκΘψ:™ΤΡ1l†œΰψΦ$84Ωδ[sw$­θ~ί@(ΓΖΕ;~Γ₯.€ΆN?©μΉU6‘§”Θ78`1S΄8ύ!Ϊ‘/Ί§κ Ν +±4τρ,4―oοΪόέ€τΰΛΨ9y»εΰƒΫ-v_ύ]ή€œσFV€(|n5?£Ν UfrΜΘ~c~Zε۟ΫμΘτΊ·‰Ϋpκόξ€€NφNxΓχ@c†&AƒFΧ εΥ™ tfq£cb#Z$w[Φ‡c–ψgΥ3Κ9b-uŽxlpŽήξƒq"a’ψν™'«Χrχ(σžΨ+5o!Υ˜Πάί‘ΉΉoδnTηζ€F‘,‘η5I†&KL$IMMτ5μκήΫΆnΰQ•nfuΊΊεwj)~σ~ΒNΨ₯Uξ€ ,¦V―δnΖhZs~wuiέτνO‹¦ήJς;&AyμhI¨ΞJ0=x›tγh,ΛU,Γ<ΏΣn°Φ“ώ±,rΰ’Ύ|rBͺ<•“2.ΑWši6+,©¬gBΦÜΆηžE‡žβtΌβt<υtΌ΅Σ½C₯ΨΪ:£I-ΉΪAεΜ‘ξB-1Cξg΅ Ο}’"΄='.ώ/jϋd­Υ7 ΥLŒ8²*¬‚<؈`\»k0V*b-αύb₯`Λο•HΗ.ωFPΒ=8%o£T/yA 8 XVJxο1b0γV·cjV›­!ρΦ&°Pt;›₯& 7Π νŒ)†°9 Εώό-•+s|a34c1φΉ €ΩƒZ΄`œƒ–Axf†­η˜…†ΜΟϊh+uόώuK=Ώ„»s½zF•nz½-$€h1ώ PγΗί> ]‰ 4W+gίεέ /§·ΊΣ‘~‘TԎ׎ΤήΜο]Ύ;χwάS!ΜiXC€Ννύ„Ύw]~΄ΔΞ—’ΗnFΎ΄Ώ‚Š%ω[3Œ‘dΒH/ς‰Cωcƒ7W: L΅ŒsFψ*>$«e‘)Z‘ͺ U€™Ž‘ΌΕ˜(_₯¨ͺ»‡αμ‘ΰκa:zn΅}¬ώΜλΥ³|’ΘΊψ”5+­Τb₯uWZΡp¬ΞηξnVρΔ|%Δ@Ή2f²Παœ₯ΰ,g)t8¨…§ΠαD]θp N‘ΓΉt8vIα’π€κx’8NJ«^π1Σ ΛοmΉέθŽͺ^ ΌΓ㏰ztό>ΝΠ.ͺ±ΫΤ­9°—±Aϋϋ“<4?–ΝC 6ŽΒxα&PΜ?Ε³XbKΜbάKΜb‰Yu±Δ,–˜ΕσAYbn…›@1c+­ΒM p(8KΑY ΞRθpŠq[θp NAΤ…§Πα:œϋ_‡“~fjΛzŠ€Yς1Ϋ™Όt72„'ε€f‰^Ί iφΕls‘y‡ΏOΔ€vψ½@@ΊkΑώΰΰj8x&ՍbΟόd|ƒρ4yΊqίZόνY\1Μc[ŽZŽsyΜΕ¬BL+ǍTΓρJΉŠTVŽze4ΞΐVαV_σh‘LeΒΠ@~ΏΒ}β‹ς?—'‚TypeScriptReacttsx source.tsxΞtxΪν½ `Gv:ΰ!igW+νκXέKN@”΄ ΒIΒ.―HI+ HυΜ4€Σ£ι’›λΔGβψΎ―Δq;Ž;Ιχ•8vN{γ8‰νΔYΗvn;‡c;ρνΨNβδΏWWWΥtυ1xμ6$NWWΧρκΥ«W―ή{Uυ‰‘ω› Β»ν΅/Ω«=§[ρ:NΧξyέJ½ε5.WlΏβΥίv½JΛ…Οvλ3« ώPKιvνΝJέm7έφZ₯cχ W»πΪ~/ΜΚκ/<™œ5Μ΄‹=ŠΘ4άnφ|XOμ]­¬φۍžλIEοI“ϊO½—=ŸŠHέuz}hoo³γTκ^s3¬γ.φ|4>W˜αnφΌ_ΙPοڍΛNΟΣέŸN€ύžH-Ϋχ+MžΠο VŠμωHDηZ§λψΎ’ώ½μωtDz (· }΄j7tΔΌ/S6ќ{#Ι/"ΫΊΣu{φš„Ωχ³η}jVocΓiKTz_l2Θύ±ΙžεΙ>~―έλz­Šί³{ŽZύ΅'Ν€=EΗf˜ς­ ‘#C9Lψ {>%τ{έ~Hǝ6TJE δαΘU³t€Ϊ6θ’°¦eΚ&j{$r4ͺΩΨ]Χ·$x4K.QΧcΡ]βvAΊWiP>ž”R”ωDδπmz ­“ŸŒO'Κ{*> Η§γΣ=ΗΣ•βΣ=ΟΣν‹Oχžn$WqΪύh.t ]zΡώƒι <|8]zC-°τΧ:^·έ‚Γisˆ6”5Ϊ9Ο³΄DqVϊ<’žΡτyΎΖ"ωΨͺ봚Ρ͏$ŒUΰΡ-Ολ„ι*ριΠ‘rŸ¦+ »%Ι“)‹’ŸI‘XΰαHŠΔ‚hžD΄H‰·η"9―Θ5?ŸEpO‰l>’M 4‹»5#½œVΰςΕδ΄• ξ†yH½”6‡€gJcSJ睾έ2HA/gΜ(jœŽμ ž‘Ž~ΗW£³΄›Ξ5Ν#Α›Ρ˜ŒšeΓξtœ&G#³Οj"ΟήrΫN€&‰R^Ρζiž:΄έpΌUB‘aς9mήβΙΉX ΞΡHIζm¦U8>IoϋΧ*Ξ»Υk‚X”rΧζ³0Μω8έ7½>Lφ•wϊdσΝ'εσα'"ί #„€Φ ,nΊn½ί“e†“‘γ9άθ!ͺΖ»ΤLWέήΊΧοIΥ™ΚYΠ¦η€rœcΟϋ’r†Ι>›LŒšS±ΙΛ8͞χ*ΙZvέ‘˜MΤ‘‰€{Κ\Ui[ ³μΉΑlaŽsisˆf~"mΡβΕHκ@ΘύŽq<-EΞ©mηͺ6XΟkΒMΗVώ|Eξ΄ίΦW4Α 6o§‹"EoσŒ‚ρΧΨσ©E„Ή^O΄AρFšTŸΤd-%ΣATβεΝ! t³ΜžΗVW‹”QXκ g£.―ΏVR$p\Œƒƒ'E_J“Z”ύVšΤb\Ψ)ΐ‰λ) ‘­‘"±Xώ4S$k 'EβxβΥ‰_δ‰ΧR$ώ(OΌž"ρK<±)h‘²’ ½{›=Λ†μIƒύrΆόυ·"ΕΈ0?‘μvΫλiCv£ Κ"£#O€•ŽΟzk³B5z8a’2£dξΆ •qE†Ω½‘²‹αΥaΟGb³‡Υ½)hνΤ`v#ς;ŠΌ¦φcSS)+Lέ‹ΊΞšs-LԏI$πq…=ί?˜HZ^K%ΚΊ—Jp‘ΝȐUΗ Ή“Ϊϊ.{>`J&½ž˜Tΐ°η%)“f‰όΟt˜dξμo`/h‡ ±°Ξ‘Νρa4Φ£–‘ŸJ—^ϊyι τώ±tιŸγι Vω‘lRuZVS@|AŠΔ’₯_˜"±hζ±η‡£ϋύΊίs{}ͺ,ΠΩιŸ`ΟΡθΜ„γKψ“ρ°ͺdωΕμydβ0ݟbΟΗ΄tέΆέ݌δN_)ΘQnήrmΓ’ώK³δέσeYr‰~ϊrφόPDˆωζ+R%0}e$Χ€Ι»k}μ3iζωͺHRg,†5–- _.½€ζkΨσιΑτ«Œ΅EMˆ_›)›¨νλ2eςυμy("W•™™ρ7D ΖάaΖo̘Q4σ›ΨσƒΥ…λ7'$%~Kδ,AR9*,σO'&₯ώ3)Fθ«Ώ5MjQφŸ5Š(‚ϊ6φ΄"“ƒ ZεX΅θŸcΟΠλwdAδΟ!•oI˜ό/DrB05i+ςΏŸN ζΫγΣ ’Žψtb2όKριΔ$ψριΔRη/GrLΗ$ maώ]ι‹φφ|ά”~ΠφχWSg΅|wκ,αίÞOθYH:PΓσ„Yγ]y ώΧη ύuφδώ—.mΨn›ύμy·ψ M·Η?μΙ΅mv£leΓkΊ`Ριςdί«qΜt"<χχi’BδJ‘'ώ~ Σ1ώ$<Λ°η½J ˆdΟχ‡‰$ηžκojt`qΓκΆξhοžκ‡τΚύΝvcΛ[λ m-Μ“ύ°†ΞHυOό#z™žΧr좎ΏΓžά—„{πο—=Ή£LΓ«ψ{Ξ<υOjZ©ΰ§Ψs_r΅ρ?­χ†πΦΰ)ώΉ6LΈwώ/4 Υ½xΊŸΡ€‹A_žς_j0 RϋgΨσπ@ `ίm:ΊjŠ@’I?˞fbOϋ―΄ ӞC>Ϊ'‹Τ?§G˜ϊujMZhΒP Pδωymδ Έπ„Ώ υwΰί΅6'aOωΖ”Ϊ<ΡΏΥ†„’pD—@’NΓ§šζή5GάΏ7₯hπΠq„OϊMΝΒEOτ‹¦ςBi˜'ύ%φ|ĜTAλx–;ΨΟ™=ΉοŸμΐΣόm ZχyΚʞͺ)σ<Γ/k0Κσ€Mλ#5)”άχNΕ‡qtͺΗ ₯Ÿ'ύ5φ|ZKj°πσl]ο‹Π²Ο“όMDΠ,ϊ<Ω―T±#’Ο†6' >Oπ›μΉ[$ΈΖ?ύ–Fhϋm¬»­&°-žζ·# ‘υܐYŽF?ƒΞ<εοjnr ΰιϜ^qΰι§&.0k6όϋ£πΡΪwΧΪςΰψζ‘ϋF BυBΰ){>fLYq[-g-·F‘ώ <ρ1?θ_ΐsό{–sDΧψΩ“;mώρi£IΕάOK½ςΒjdDEι ΡVψ­¨ˆΑ@x¨ψŒ΄π Ηυuδ–}αͺ>’Ž“v&!­•w¨γdwz²»΅f°dΗ<Β.}χŒ¨mίΎι#κˆσ<ξι,ρψ<²ΗπTN[’Ύ/ΈΘ5ι½y°<SαϋYΚχ«)5tήΗRν‹LU1Sίύ#ͺ0 Xw…oϊˆ:Ή$Xu…‡ϊˆ:ί…Ω έό€ΦΦ0ƒ<d©J©β‰θ‘΄ω΄f1’ Fp 0φI½P)-mαΌ1?9‘οlΈ ―’χišTΓ²π_7€’3΅π^Q§ b².λTδ#Θ$€ξ’ Ρu–ψ.9±X—d_ί+Ύτΐ‡5κMΒ}DΌόu§n·…Tq˜}ζ*πΤ†]α„Ξ ΰKO! ‹¦ZZS)f…sΉ6a0Ό‡hsό†6{LcT~θNgƒγ„DDΆVWY\Ά’Mr<#ε "Ω„†{έ,άΚ΅y—[2…'ΉΦΕ„+<ΘY’'υDQ†WαIn*Y&‘ηX’ύQ‰b‹^›·M―Βq\-zλ―wΧ š%Γψ’6G›Q…‹ΈΦΞό’6ΨU;¨πg©ˆL₯¬e_Φ†>UνφέVΟJTQξ΄F=ΊTΈyk#Γ`±.ήΪόd4 §n–α©€ ?y…εzœKž—η4ή%…vώτHΗ’:s°έΗ΅ΑžhΎ.ΫQψϊmΊ α©t§λnΈ¨όήΩQ­W9ή«Η Ν…ΒΛ:’ε’™PΈTkσeϋ«ΐ‘›ϊϋΈΖ‡ΈύMxSk©ΫΡ„;΅6"",[Β©Z»#’šδ¦³šΘeΨ.Υ,ν'Ψ“oζμzܞ ΔΗp2ΡσΉϋIΝχ “?ώR»!’ŒΤ?ώ^* ΘύdOνΦ΅‹gBξ¦K…ˆΒwG΄’Π3 ©RνٍώˆTΈΤνψ'I ΄H Ϋ¬‡δΠRζLψ jμ:FΨ?“φχk°{Wu˜ο’βξεΩju&¨]Κkώh™κΞ "žB_΄œ^C/   JΚMΠ5`›μ·œr`ƒΈ€"[@ηeΗͺωc–₯bNoΩ§ ->>K†τΛxfΜν‘1Ηχ–Λ³ΣΥڍ ΆdAh_uΖ j_ν:ΌV!²πmrΉ6Y]IhrΩΠ΄74α3σˆSxΧέ’›Φ(ŽjˆyLF ϊ'°W£‘΄λ!―J‹;.Μά°CG'Κύ»iΛ- v‘­ΰHz%ŒνŠL$πnA]Qϋ`$έα ΨΔx~"Š*°‰S@o£‘pΘΩο-ΚέeυΏfH †ψQC9/βΟβΏΧPώ†τېώϋ Γq³Έ)NŽz$εHϋ֐ Υό`ωekόFmeͺV©­/„#ΝnLΖ=;Eί¦G!~6ŒAQvΔx εG:'cΌJeeŒU…Ό‹2QΚ»€ΟY΅z·ŠγτχΘwIm½>δ ϋc†xΣΜϋσ2ά[½Ό|ι`­sύԍ€Ÿ37VF-Šαrm^›­Mΰόθ.γηζ2aV1Ώ ίj³/&5 EλGvkΓ’?ΉK±ϋmN`Ρ™φ˜ΰR–G"8 ΧUbz½ͺ}qιΉι_ΞΞ·f πΏc σzλNwΒm'$΄\rΎ;ͺ;N+Œλž™ΚqO°ΖemRάlΐ[Sάΰ­ύρŒ›ƒ`bέB+ξ‘ kΐŽά$`υμOjΐ‘u‚Y‹}θ‘uΜ9`1ΰ”kiƒ<‘~SXΐςΛ7Pψ Όοc„‘’Idχή’EΌ₯ΙΠ”Αξu± Κœάψ•²\ΑΨΘU'±«œιΤ\„ tΌŠtƒΛ•3YΘΧQζ›ΐŒ¦χΑΣ*{«@ i€ς{3Κ0ŸΦ~Xnx΄γοmΩξ(l­έ–άn‘Ξ4tύv# #D«•c2Δt%iΆ(²O·K-³­Ϊ¦ ]§klξΨ±ϊΎΟΡ±ϊύ…νi·2οƒ #ζ}α6;RSIœΊΚΣVΉλ¬:`ϊ€yΧή@OXkαu“ΌΉ9-uΑW'WΓιΩk*ψ» R"sλ™δ ΚT±ο“i‹‰#ΚδL"'Ά•’PhχΦ‰`γm½jχ[θmSπ6[η݊°zαiΨΩ=oUΦ/;›W½ns‚Ϋ…&Bΐ°ˆ8 Β€Τβ\³ΑμLGL#ŽC½Hυ•`P©Eώψ‚DΜ,ΤΖΔ‡°]άΊU; „ 6~ΔzyfpE§γα uQ§U ϋHFO7²LΨh š¨;kn›–£SφD–r`θ…˜Œ"υ§”φq;δ2ΰμ•ΡΰaΛGWΑΛ'W¬ΡDzζV9ίλwΑΨ€[Ν¦ΣTž…Aα·Α|σU6ΏŒŠ΄GΰR©σaΑo&₯~Σ5œŸEύg\t)M|" ‚TΛ―ί¨-ΧVζ*oΪ•w/L² ό¦\άƒ’8 ƒW`₯6)haLηΚ ξΝθo·©{v°œžΛΛ"ϋrνκΑ ,#Z;…@ΙPό»9pΧ¬bΉΆŒ*¦"–·2VK%ψΕ’­ΩRΚΏ₯ž·\Z™¨Ϋέσ`sΏ„žrn»dΓ(±@Ρ΅‰RΖ?RφΔQ(X¬„›%!΄C‘ tk”AΝ6T­μ5-―z^Ϊ°R:N§ °’z²;aρEšγόΊSrΫmψNόΞ Ν°Θ/υΌ’ίσ:%ΐiΓξ5ΦKŽέmm–μ^itΠΡΔ`­§© –Ίf5Kďέ'e—ggŠύD›ͺ†aί€Eτ ΅„χC[ zjtv)ˆmΥ~hΦ~h—μ_ΟΚ?l(°\ώα„ςCω‡WJK²?>+ΏΆ\j@v e–j+¦RΚ_>2ώμΚJiι¨Δ Μ¬|­πšOu€vP[žΕΒlD›δ“‘c’ςη―8έM$Τ΅’ΣςRͺ…l­Ω"Wΐ‚,L'’šOΩGΝGb͊’ΣŒΓ‘½Iρ•x~Κ•ŸB†Œ1s&Λ¬α‘|z_ ‡dܝ~ά£%Ι;NQο5ΜnnςΉΝ ΆbTk=ϋš τ;ή΅ƒμX‚1Ά«5 c„c΄\{ŽΜρlύ₯Lυ»†«HI{8Ύ;¨•6'σΌ*B,θ*'$ηΐXΝA&3ζ§εœBηp=Q2+%H²J3JN¬ΧrVƒΝ v`«'S Εͺœ‚Υ”·‚Ύ,ψBφ"j$H*[ ηξ―½΅’½?Ά"$[Π 5‹`NΑ"mjϋe‹νλς%ͺ"N “ΐqvφ3@2(Rq΅hQ„ېQZ₯ΰMK `†Α`ρψ\Ÿ†ΖEhV„ͺ"d3-я2Q& ³YTL‘BΔfϊ]β¦Ζ˜ΘƒŸ¦Ζg«@•βL΄T'M ΫGλO­S:Α& XιEe“δa Ή „όύΥ™Μ ˆV<:ƒΖει™²55–/σεbΎ\ΜAΝ—‹ωr1_.ζ ζΛΕ|Ή˜/Ωrʼݜ[«Ÿ-Λ’;? mΛ|Ήμ΅Ν™mάvšΛwΤήrݝn ΚQ7‹„3|Γ|Œ*KcŸπμ’[ε4’γŽpα˜ΝΤϊ¨φ ‰Š”ήςŠη •ΕsϋZΩWm·§:ΐd·Lΰu¦–έ\”{ˆBΥεr:Φ‰BŒƒKδf«š΅%@"1vj$Ω *νI!ΚqXΟοUϊ τεrΩμΊ(Ek˜΅ˆα›₯ŒMHΜΛΐ8…1»Fs «. Κe ²eqΥιτΐ λΨM”Ύ˜γπΫJ<ΨκμEΝά ˜ΝΤΖWΛ iΜ‡ σΑάC”QYΖ²‰,ϋτ ]R΅pVΛQ?,κsάί±do 1 IA’B|­ΉωψΠΙρζrΡΘiFžž)βoτψgˆŸ2LEΔ)©œ5λ—ϋ½{σι Ÿςι Ηύ9θμρίΗ,#”ν&ί*―€fn±DNx-±41»σ&½£¦ΎgwbκΫΒχΈ„©Tψ5Ρ’~θ›Gμv ― AΈmΆ½€σOώECίό 'ODβ$Ό’!φά”{%τl.Σ Η:ΌΘπ†ZΙt'W%kx ΓώF©B'F ρŸ2±ϋdϊβ{d3m(ύHΘΣξqW‰x±€Λ΄ύFί>ΓυKΕQΊΗaH/*˜κ} ςΆIt.©MŽbΓͺd{:θηk8Α\Πyt%œϊΠρ²Όά\s7όώζΚX@³γYΫd;„θ άΐXμΚ»s•7qΓΑ+™Hm:¦ϋΦcZόQΏ΅nΉΪIUΪg Μ“΅Ž^=;μqOZa?Œ&έ‡S‘Χ‰ήπυbι–`S#j3•²;’²θΨSςŸ•FίEƁ '”Hγ-yŒ_ςΌwΣL<*wϋ€4v’"`α•dω`ΚD―©·ZςσjυΥ·Q«'R­IΏΩϊ«&&u*»Ώu-ΨέvΪλv`”%uhŠ6"’ ΚDσώˆ‰f«DHώ^扇?ΥYύΩv³.ciηΰrτ*ž»¬ž»&wΧmvxν―h…)Β#»58nO¬΄8ŒΉ―mΰ‘Qgβ,‘|SJ!£14²Ι/Ε>Κ›L/J&$™φ‘'₯Φ—q«©5ƒ„έہ„ύ&$π±D΅‹ιΡGώŽH³b¦=ιΤ«?6ΜΆωΠς œ4ιτ3SΗoύ0Ή”ΗΗ5ϊέΦfΤρqΌ†ΪΙ2TΉήλuόΩ©IάZ2pp†DNh*ƒ.g6qμˆfH-·}yολ†gκνJΑ?|βTƒτΠq;Ž~ZΡΣ2ψSxΡ+5?Ο(L t)聓·±Φ‡ Χϊ­Ά«TωUΝpHΓ2Δ~ͺv±¬$ΈŽ…7₯§υ©Οr_裋πXά–lœ¨Λ8I§<%"ς€P‘δˆ•₯‡:TΙtC…"˜˜8rŸ2σ ©E‘lΗt%ƏͺJΙ–θ‘ίΎW.ί Λδ”΄΄O¨pΘ³0£˜Y…H‘R…8‹MUImE:Ι˜βKT—aiΜ錭L遀μΒ†XHŸ™Ν0g_λ@N* ιm‹©€>| €VŽuΒγ_ΕiΘΐ{’&mδΦ“+³3Cr—?4ā!ώχ ρΣ»†ψ]ˆώθ›―νάWžζ+―ύUdώ7AΞ…ΐω ¨Xε)b2†ωta+ψƒG~7‰Ιζ&9’£§§ QΕΪ,θ2'Χ Θώύ΄»v‹GσΔfό‘Ώ REΗw―ί«¨$)ΙΏν_›h¬»­fΧ‰ζvβϊΌιΙ›ΡAw¦–ƒργ‘!”£iO6‘¨υɁHŽΞE<%«~žη†ϊ ©~H'WC°ϋ½Ωuwδτ©6σ½ΛΐΨc0Ηώ~[+.ιP{E„ύ§‘ΙzΧ­ •Xξ6KF If»‡!³=Γ“ΩήτdvWv2»{Λ8,ΎD°Ϋež€²7η+Z‡ΛΙgyΐ‹α/σθ‘-;Sέ§ 1χžΎLu+’ώμSͺt«Φt«Ώ]H)²dZΣώxL©wπY+΅ιm>cυnYžOZCσζ*‡#J„ολ^3Ν–νΪΟ‘+#­vφQ ΓςY)v§tfΘAάŸ’A ™r ”Κhϊ:uŒ·“―ΟpŒR±§7S₯0³EίτdŠΫΙρ‹―mη*QηΔͺ~Eξ–ΜŠΦԚP€εŽP°Ζέσ« Ί{ΒA7žμKτ^CΧύHLuŠaYΘSιΟkWeS}x%Ί ΣBhKSΨV ΅±ΫwΎ~8¦nΛ‹#·;„οٌ¦H²Τg΄mšΚΘί/Š=†Χ¬ ¦S< —‡cΡswHΔL1ΎΣQεΪ(;ρ–ϊƒη‡Mη‡Mv6} OšΝΞ@~¦I~¦‰t¦ 0@φΔτbrλα‹+\{MςΝ!l>J½υ¨–ƒΘν²Ψ²Ϋ°hŠΏΚBΞ!Ο[Λ…΄‚IF]ΕξΈ­#t’g’έqQλ‹w"ΌŠθρΑ―ήθ‡Ψ΅τS!§θlY%ΧΊΡιΘͺ6½2μzρ 7«‰j=Ϊ†κ†y[Ζo¬P1Ώ­ΔΪ–Εp*uά|6νpQ†IŠγ·SΣvžxφ«ΔΓχ5ΚΤbϋ)ι6QΚέ[[(μڎ…‚ΫŠΗ¦±ϊl«ΟΟlO₯j©55‡ΉΉ(£/ڐΝyTő؞5Y› ΘBκέι{’ό}ΙξgL±“ωR/μr4”Aι‘wωΉΈ;y.ξΐ,›]ΐ—SΛle]™΅oŒ†>Ϋΰ)”=yoί„ήή5tooΗΪK e(ΔPΐ.–½ƒΤϊ–“?’·9ήFiг Iϊρ„cψ’,ζ –­,Λ >ζΠ-n£5W"+‰@πƒ―R]lΌœήΰH}…ρφ˜ΟΈνSik•GdR JΌπŽ‘΄ Ξεq‹žqβίΜΚv]οzϋ©G’ψΒc#·΄Τ›q8ƒ^—²o˜œGŒE(ΎYΤΝ„ΡOav0*‚iζzP&>0Ίg uQ[ΐxΜb˜ί ρ‰ ύ\˜γ ρs5Μ&Νςώ‡ ΡC&σξΎ™€ΌŸ¨"ρ@‘Z­ΪU,Ϊ‘s*ΈrΙm_±[nsΒm΅œ5P‚΅«dσ₯©ηΗF΄>Ε6ž±LŒ_wjσ?'N%ωœh€’m]φΧΑ;ΎΑ|…Σ&›»GΠr Iχ@|iΥ΄ΒL½#žn†™a»ε5m·{¬“λ6²a§[‘ΞηΎΣ‹hΔξhœ―$γΌί ½z©AδοΔl45K¬r+τ$Ήώ܍ΰΊ ΜUNΨ•Υ•λΟήϊςϋσ7ˆς¬ΦXž«ΌIl¨GU(»#§Em½8ήΘ±tΈνΪmXCΣ&·PνΣΛ₯Lΐl φΩ††€ωa 4£n5gtό† Bέn\φ‘ 묄=ΓΒΌwX˜οΪ2Μ‘ώ«†“%G΅‘§y²ΗΘKaϋ–§‚Cμπ3f;YΎ~γερ•`2iΏΒ‘νεεAPp±ΑA\¦™e·ΆΔu;όnυtPκ<πIΡΛδΆ" PωBϋ–I°Jώ½άjΤAGψ'œ&Ί½ΖzH¨η’œ“£ο0Ψaε¨₯—δHg0£-K}άίcΪ ΞG-f»•ŸWˆDευmC₯©β?V0΄—€tΔ@’{ϊΝwtλΆμς²$Z/+€CεψΈυrνʝ έaψ£3`™/Όi›yF^·nZ :‘-0šμDϋMi^Φ{wfBAc BυβφΨ™σ崚„P?:= SRΑŸM?Ντibf_S0Μ!©ΩO7΅-pffIF¬Ξlqς4Λ„}α±!^ΌΪ0“gΧ/iΘzx Zӝa[―3±·dz|άnύ‹itŸΜΎκ =š‚Y"—Η‘Λ Ζ ϊςΜTm–5’h_ΩVO™@Τ`gΆΗXωŠΑX™Δ,@Oshί”…ού,m^€‰Ž»μFΔί[ˆšήn’XίeX#ώš!ύ7Δ‚!ώ₯‘ΎN—&‰ ~ά4ΡψTRΖΝ‡¦`€η)C{Ÿ6Δ§ž?·xN]κz†βαQ₯*Ÿd;ο’ΑΣ!‹wWΦα»ύ2œβφπ¦ΔΫSš©ρZ―vΣO»ΎΦΉΐΐ>'γΙw/¦Ωη φ2T +λ"XΡε>Υ“c½+ƒ;‰οŠdWΫΰ±@ϋ[μ;ΎΖz"mtϊυ–Ϋ:]χ (Βΰιυ€γ:MΥ€A­’yΩ0˜έƒ©l‡c•{λw8±‡ΝΈ7«Œ‡M[₯ŸΛτΚΩ"1T^ΆVh4„YmόU-xLδΑOSγ³UXΒ‰w ‹I…DXψ€ ‹’υ§nα ~Π`ΚC E εiYβχκζ»πvržΌΟtΘu2ϊ3ΐA@Ωί“OύΡ%,ΣΌά"%@lΩν΅>9PFQΤ9ΧI%κΝLuoΈ’όΙΒg™ΊΕ4π°ήΗbRŽβΛΎcΕQOwT»R!Υ=q L΄½~gpOΝήΘ)6y»eͺ›ϋt±;uŸK:™ΕμβSμUž΅YΊ‡|*ύν„2ohΩu§5τzMOΗφΊ¨kxΩ-NœφPπF•-hl«3S‡‚λ¨aZθ;D%oΊλ™'韧\°τ bkΎlœ³V§”Έq]ή ˆΗ?βŽBhiZqžh}^nd:ZˆΈPΏ™Ϋ¦Σh.bϊϋ›1ς""fΰ ζŽUe‘Ώ/ΜΞv¦·dsayˆΊ‘’η—5ƒκ΅ά―₯•?Q Šo—Gόα' ρg œζ\š –Ε.Υq*΄Φ–ψ φ“)«γY$ξ©°γϋ¦Ζ>΅ϊ‰¨ΜΚ’΅%‘ι8 l΄†[ΫLeYΏY―fΟJOl•ιNςbΒπΘήcΘνM}޲eZΗϋ%Ρ)πWξΎ‹ξ<^ό&φτO ρ§ο`^ό—s^Ό5^œ•(t^ΌOγΕzΞBE,}χ±|,μ€ΠQεερ**Φ†Βb†Ξζ-Θ[·@΄ ŠΙ< TO2⏡# ΕЦ€Ά‚ΆUˆ|Ι8σŝ φ³1Έ𝛾Χο6&}σ_ΤLω7 )#_/MjiO!Φ- ΠτΦu› dζ:gkζΪgsp»dzΗίτ†ΙΔvώ‘ΤΞΪXm,¨T,β)8U-ƒdlΨ6.ΪWm7B¦₯Ρ™0<π™Ε_άtVsπ3ΎΨ[οzWΏθ‹nDΉwˆv β.²OƒΕΡψC‡Ψ‘Σ£Ϋ€MΒY)B8Λ²·šζ}‘ΩjΛΙΎή‰Ί_=γ°ϋ™ΪΉλs€#©ΫΙύ:₯-'SZ¬ξίΞξ8p”%΄§ηj΅Ί|‡T¬ Ο„³"·U‡ΚmίYΈρφ₯°ε›οαΝΎf•ψ5R™›_΄fKtR½aνΓ 6 Α€€j‘^1δχ»NΙ_χz%ΨW(ψ%ηŠΣ.Ή«₯κLΙυK^»Τv–p—W‘Ίδg›ηΗ°‹cΨg$˜c ^&€Eb‘£˜$ŒB$°šςVΠ—qΟ?g/α%DRΩbΧAeο-"½P³ζ¬!¦Άί+lϋΊό@‰.ΎH‡c7£Waig8δyΡ’|:Qξώεπ5±©&ο+{Z«RέY"ΔUS½{S―ξ ΧΧΈλ'εΆλƒ¦EŽaaŒw§^|@‚qyŠί'­ ¦:ξ’?ΚN α{―|zcύ Τ3ͺPRОQ‘r‘ρIWΞΕ]0&Ηο7ΔΏΟύ†zΚ.¦3nUΫξ5Δ€‘ޟ’mЦβBfBλuϋNF*γWΤ‰I…χdέσZŽ  Υ¨ν΅Μ­Ϊ-?+hA#₯Ə„Θm§Χ IμγžHφ][NΜψžB ώ«“Δo₯Θ£Ύύ&xˆδZβΠ,ž ~;L.OŽJ''ο)ΔΟ™;cnKkςσU¦Rz€qΜμTŒλΑ½™ΟΙpΟsӊPTd’ 8jeχT΅Q‘~£Η œλGΣ’έ'‡";•žtjZžΎBθδrM!*“.‹ωpέώήBZlάΔσ_ί—¨aΊ:ƒι ΠΉ¨ENΕΔ.ΪΆ3RcΝ@†6Ώ?Ν Ÿη#–ˆ°Hœέ7™ΌOl|‡π›cΐ»O)χG;^―‰E'›W,β£ΥΆ[T`Ε•λ$,ϋΒSLJιΑΣ‰ώ`Ρs0΄τΪ£·A6<*Ψ 1αη~?όΈ―ςΕεR­·‚| <9ƒ)ζF3›Όεd4κ«λnϊΑ \ Π$‡X™ψcιή=tνΩBνέΙ.ϊ@ά{Ÿa&›4L"Z.ΰνμ\¨aχλΰΟn΅™ΪV{έΝ¬«%ύœ.u@Q€MJό‚μ€ΦΑ$~ύ4{n»οk^ΟΓ™ΝlxΪ³²14­εy(²ŽέΔ’ΐΫ2 šΑB£εdν°€VI5„ψAuLCΟc…”]°ΪŠΧΖ|P)mu˜Ρ_°³ρ‡Τ#ĜS)5ώτaΆ΄ΓΪ,pW³‚ϋ΄\x6έp_•D―g‡ ΫE°X–ΡΨ‚9λ2L YzΐΔφx–³ΓΣtκύ΅5§»Uj£7Κπ2ΈάD)ϋaζß0ğ2Μ“ΑώοβΓ3†ψ=†z?jˆeC9Υ/eΔΨΓΫΪ@U7ߟl<3Μ΅WIοΡXΉ,†ζŒ£9Ei5'Α] ¦ΜfΡiα)z‘ Pφ,μ@½ΛΙυ>œO«0Ρ:tW­λ;ΰͺ5τͺ¦6¨Ή]w‚ Ϊ#q]© ’QΡd­Fyzϋ[ŸΦQλφžή’αωΨΡ§ό©s.‘²θcΘσ„ήοTJAŸη«]—ž½ϋ³ͺŏG·X˜VR7ψ{Ωσ"¨q&MΓrkΥι:ν†ΨΝJΣι€N^7Ι+έ’h•q± ŒdμMτƒΆWa ›JΛ­ψ—ͺX&ρζί’9Ιfrfp_€QYΉuέΰγq#EΡΊL ΊΉfQ†ϋB Ηχ»γZVU,Cύυαs]m%†χμ¨Αίφ›^C§ΏC S•’ν5š[―Υl¬£Νͺκ•¬²Ι°`χ{λ^—΅=θ.ΎRσ§gF'WˆGλΌ“·]&W¬Ρ"δ#޳ΜιuΪ"η_]„~e#†gΠAV λΫY|Ί°γΈy †¨='k0Ά\vz6ΉIΉξ¬ΉmZŽL4\©κlΨn • —'ϊ0|»DJ Π±6‘<6Oλχ/Σϋ½ξ‘_‹o•HΗӎΖα+:zΜb.޽u»WB„!'™AB)•mšqΐηΗO*ΚυΓ’‰μ½“Iδ)ΣδΑ‘‘²²°ΕmΝΠwΞ5mG¨ MœΫv‡&Άό€Μy D|%lΐer)•₯½ψ0.τ‡ίkT»Jκ–nΗίΐ{QΊΑ†{ $¬mψΨ2€Κ½s8΅ΏΉQχZ‘œϊ{F΄λ;cΣ„ύ(]X<ϊ}ΟVΧ{½Ž?;2‹Αλ‹ύΡpΌ9‰π@ιcKΗ½†‹R9ϋŠ|4Ο]ράfiuω°")ΥA—u.ψ0ό[ΎWΒY¦ΣCΡΖ=:._φ-–W€ΒήS™Χ_qΫΘτJ€;ΖΛ₯«ύV‚IΙwJ AχςσΑ€%ϋ‰ΞBiηΈWuΣρ]—UZξt†ƒ‹¨•λ―@Ή7XΧ_"Μ^Σ!NΛjκυ\0ŠΥκτΈEΆ“γ4Bγ4eDρiQeqš{γžΫŠπ44jΒΩ³UυˆN―όJ΄Jg‘›½niΓ2Ίb·€ ά&–ŽJ%ŸΚs•7νΚ»—HsΚ ·λχJβζ©RΫkWΨ]Ρ%δΈα7,’vυΰ₯‘°ˆEγKήͺT•mVA΅\šΕnrΈ-¦†ώ/3)H†Ύ†p eŒ­ΫŒ'=MZ§Ά±±φŠEqgwΧψΧG₯"˜8γΣ!k&‹|r6JQ’4eŒΙψΊ3Qυ 4Aσ©Χ_³Υλι Ž7w–~Z™₯/H ƒaΡΤ!?N··IΊϋvΗ@IΑΐw©”, Βyεv\wθiin=S™#»qqΪ(šNύΩΐοwΘl ΚΤ2οΜk? [€ύY6„ng¬ξS°zχˆ‘‡΄\Vίύ5ІέjΥaˆ›;όΐΩpρ—H…«.ΰ†!έΗ½qσ‘ΌΘEE  CτX― ?wΪΎt”₯aou) 49λ^“ • aBMTΞσz§Oj!ŒuβAίw|™«Qα ΧΡΧo ˆ°R JTFΐy`μΆcn™ηωT6!.ϊž‚9½οX³€κ`Ϊ ΐD PP^>|xŠu» Hq¬]‡ΠŠ―‰έά')LΓcΏ2<β“‹¨–PΉ‚b*νέ™³ηΟμ–—ˆ―ΝΩα©mLMGΩEΗ ”Ή‰žιζ’[ο_ό„ͺΆ‚:(i¦ξκύ:ΐΰ—$f³ς?Ə…Γ_\Od‰ΌhΥ]Σ'@ιn!™[5ΌΞfΧ][ο•„ {’Ξ Ψ4ΪZX’ΨΘϊIEκ%hΊΠ`ΖυΘlΓΔdΕΞ=%Α&ΨφΙ1οS—fWA©72FπΩ‚~π<’+s•ϊ1ή ™η,…ŒtΝiS}F°ΦςκrέEkkΨ|Βdέ΅6ˆυςά‡A·αφŽΩψΉ ]ξφ–7W`Ρ ―PfΐŒΔ“ΉW]€ ΑΉ)ωsΎΛ5 <œ1π’ΜΊ7|–΅Tάφ(M΅½†ΧjΩί!Αb©νωΠTgu&i q€‹ΐs αΧΪ„E ¨³n_q ώq6‡ΤΚ€/‰HB(ρcaΠ ²|Φ[Αs`ΊhΥnςΉgΉι―H’ΜCΎ‹Ψ£§Ε΄?@‚¨³¦ϊύ »»Y’„ Ά S₯ ―ι…¬…œa(¦Ά6Ϊ?`™…„Šσržϋ”8ϋ Έ]ΰ ­€XrΞ"P\V]LZc4 Α~tOŠ!3ά²ΚpΝη±S·ω[-d₯3}‘]·u› υX§ΗUς=*Θ–βέ0”&Εξν³a周ΎΓFΉ?j’•xӌ `ψp°ofοΗ° Q-ΑΰRvΣφν+zؐΓφ£:κ±(δ ΰ£ΊλqSP¦§UW‡Ζ%q–+cΙΤ{ΎJŽA#ίΨΌΞ™„΅Ψ4ω?ςOM²|ΒeA&€κΥ°&Ζφa•šGΆαΈci_Ή†Gψ’γCΘ©ΐx @νϊ(½œ΅sΚδ ΖΙqΆ·κπίδ)cϋiΑΤCε4¬GŸ/ήŸ ρ?SΗ½λΘΊ©ΨδϊOe@Ύ,;+H`SreΜ±΅­\!—s WNΩNσ„χΆΈ'ύ9ԍ\`_gν„άOͺς«Ίθ™΄%ԌΓs 3)O†—v…ΖnξŠ8ΰˆήΡe±«ΐx=£’žό­[pλ·ό0ΆΤό0Άό0Άό0ΆΤό0Άό0Άό06~»K–’^xŒŠB«Ό)`©Μ0ψ,‚λΣΠΈ͊PU„,`¦Εόά\ΘίΉ»rϊ«3™­xtΖ 0PΆΖ’ΖςεbΎ\Μ—‹9¨ωr1_.ζΛΕΤ|Ή˜/σε"[N%{vd952qΫ57rνl ²υ_œΣ ιΣ] Ε>+4:E™Ύ“JΤ›™ιϊB‘8’Ϋζ€LσΛξo1ş>‘|βΛžxt[φK *Ռ뻿’o’U@>lsΏ²!˜ƒΫρΉν:(LΙOe‰83¦‰—7ΧF“mΓ§ž-άρΖ’Ι$mψί5d“τ|ϊΖjα‰B·½eθΌΥƒΞ[έςqzά»<5”ϊ!·ρΨγ…kpžΟ '萢Θμ€P”™—Lž*²ίs€ΫΆ3Βy0"±X …ŸbΞ n―ΤM™έLΛ.ζ]~y| τž++)œςβW‡ρHO1ΛܚΔ"ZΣό0ͺΜό” ƒΙTtœίA‘Sλ/NŽ΅Ρ*mCٚ¬΅1ψW©ςRΛ¦R%ηTάzαυΫΖ*A‰«Ατt5˜™ΑπS ͺϊi-©ͺ¨»½«ξΐ]ό2‰ιi,ώ%²-^ŽΏξφ΄Έοc΅Z φΑ?ςHτΦEA τ=Gσƒ1±ω€…™€L,­λ΄μΘC\Ÿ I³ͺ“fm?o²J\žΛ“D&ΐ›¬δfO˜€iyknƒB’§¬τ‘ήωΉ z:tέ†:4ω‰*΅}αMΐ³΅Ω,m°Y4| ˆJK,(šΕ)¬ΥŒnέeT*‰§Τ4FΧ‰(‚/uπθΔBάvt!ό†‡΅Ρ`2¨aY)»K*삉^-v+ϊΰΖ+ΐΖL|$ߘ’βH2, CΗ4 e»Ά: ΄vΛεΙνΚ°}2ζn₯Κϊ-CόhΖϋ‘LβΡ ρΣ¨‘ήΏgHCϊ½†ψ_7”sŸ!ύΏ2€·†ψ‚‘œ Cό#i/dϋYi·.›σ³©·tε;~°N΄ž|Χ‚7¬εg*/Ω•ΥΉΚ‰•0xie΄άf›DjΔ:¬δ«G!ίΘp$!₯œΫΧ3•±π³€όšθ©Z `bhˆόΎμΜ―,UVf•D€D+κ‘‰#σcΟKŠΝ­jgL„Ν†Z’τ…0ˆβZ–¦Ρ²#¦bHΦ£VF}}dΒ„xtμDΒ"hθ8 ,E+€ΎFSλV f›ΜΪd،„JβYL»Οbjb<Ηφε`<¨έΑˆQΏW  )yΛ‡SkΪ›ξΌ.NύxΪ)Ω0/XTΓ8›l.›³ΤnͺΧjPR‰CΙέ…lSžιΒ±_2€°!ύ¬!ώΗe…ˆ:šMW—ςΞΐΚ^NΠ©ε˜Ϋ^°―gg‰•1vlYdx±”± "ЁMO ™ΝΕΝ,sΞ*—‘₯ήjΰΆW.Ωό/Κ€˜Ώ­,Χ[5¬²Ή{¬σ3΅qΐΥ2Αg‚CΐτY”(…βaΕl¬Ω-ΏΠ%U 9κ‡E}Žϋ;–μ-βΌLBR…¨‰Ÿ|ΰ{pŒΏ}ΑnM7Nςc§UΔΜdBLβY²· †{7£Οm°ε,=žP“|Γg„« …Ί»`άM©)5­!ΤfΥZέ]%½…/“•κΎΪυͺϋ iuEί1”Φ/Q…\«—ιΡΚ©³„βΗV»ήQ ςŸ‚5wΪ­0©ƒ;«@ΦK§-Ϋϊ˜υ@Ω—βϊO1½|λΝμ?ΤΞƜuMOoΖ_vœ>εhε°ίξω,ι7]οΏ?‰Ÿ+dέFΏγ» X!³άcΐΡφβ]¦ΞDWμ0ΠαΛ ρ}ΛmIk³ϋX£Αμ νœΠ†#4%L§žQ„ͺΊHbRυ—"δΑKΜ@Uγ€2)΅?-'όώ!IšŸLK?βςjΆhIw@VqυPΊ“Οβφ‰'{Š3ηujη6σΑ[T) Wθ@©0»>ΘU¦ύέΡ{¬φfoΣ]C™ΘM}ODχ萋ظό“Sx“KšϋΒ’8γ)'z€G†Yώέ›0²ZΞώ›\π=(^i3°£R™wbώJZn΅.ΐυ£ΜΛuΩRTfQσΥlu*y —εl†‡§tΎέΌΈ"ώ‹)€Εδ;Ca=ΰA*‘ce·­μβ4waάVΘo51"8ΛδΫ{ ά±3η§ΨjnθΔΩΈNT–εθ‡5θΚΚXΉ†WMw±³₯Ομ‚+R6#]ΒΖ.€2mΡ:’ ~/;=ŽaιB@½ΐΙLeBΏŠΣWωΊΕn³Β†Γƒ  ΐš•P ;°˜ω3ι€jτ»­ΝΈΖ%݊΅Ϋ0½κ₯χ„'ί=ϊJj¦°’]Ύ χύgV ˜6S qά€‘εs©[ώyΩ[žr±„^W캝pΕ/Π±0ή–L’ݐΎ[£2ΙrMXδMU’aq½r45γbUνδurΑόQv» ήΙΩ™VŽ§n gϋUΆ₯dvκp°?ΈLβ‘ “A­JΩ‚ˆ«8”αυε£Ε$Μ"B‹¦ HZT@?yMi©σ •ΕΕeΞ2(WBκl,ήΛTɚpχydέqg%(θδ©€UŸ‘:N¦¦Qκ˜Ξνu–)Ο@ί%PY$Δ?V *‹μΡ)_―-ΟVg¦@ H Џ$ΈHΆΡ°›PΘ€F_dΧ"|fρωυΨ ψ‡‹δ ΊΑο4ϊ’E vίtάEeΩ[lŒx‹Yx5dι@©εy—Kφ:,νΡ‰³νυˆgEθRςV©ϋCρc<―¦&­7³uD2“¬>?Οΰ2PL2:GxRΦtC†X^θ‹ƒ υΕ¨ˆρNn\ΒΠυ09Ο₯ΝΈ·IEƒ 'ήRφ±Τ$Q–.p½“8ΑΝ£ŒŠ“GγBκρŸ—―¦βη‹^O>Iθ‘²lΩu§wlP4ω‹l¦vžQWJΩ–[γΔhΪts·ΑDπw ιο2€Έ!ώCόΚΑ~|€Iόd2ίλw)‹»ϊχŸβ-C­‡cΞ RPΝχρ3ƒR+ž@kΔOΓ–/₯7Œ-§QuQ,.άˆ‰έnίν7€Jˆ†jίTfεήvf}³TWƒuθοΧr$yS:ώχvέvύ,.p‡θΆs5c/ΣCάj£Τώ#ΞΝ=ζsηώйߚŠzΙrνΙ’ŽΦ[›ς8 ?ω„ΒO*wݎό"֜^ΰ;²9d”ί½@9D~ž]~žέgυyv·π0;Ό]ΔΚηαΤΟ©y8ς¨ygΛφNΔ‹…ν…²ξλ*ΒVσ©/Ÿϊς©o§>²9―\›^IVAžM=ˆίš©νχ τΨ\ΏεP§sqxϊώΓo­€ΨXzsOα"μUQύ›Ό”Ι― $§Ζ0ͺ,ΆΛέ,ρςCΟ§n`φ»eΪύV+γέ2Ό§=Ϋ±°xθ9‚Γ4Τ|₯#U@ΣξoΐδژXw}«©7žŽ$8–Ήξ‚}«§ͺ¬Gkž&u³Σ€u·mw7·ΖΡ(c'hc―ςjΌFnφέ>(—$5e1rρ`ϋΔΑlξ‹ΰ>ψχ„‰Ξat7₯kyΈ£;―εnΈ=β΅Nsw½Ψ ARŽŒΜυνΎ½ΓΦwΧpυέ=\Ά{†σ=ΓΥWΆΎχWίϋ†­οήακ{VωΆ6œzφΫχΞΨg2Jš%{λw*.΄‰cΗfF ž2岇;dQُΊ–―ρσI<_γί”5ώT ί’Χ †Qϋ>ƒ«ΖOŸ3€*Ζ΅#η9ΗΘ9ΖΖ1.˜8Ζ½πΣΫΘ1Frΐs†œ3ܞœα΅B!εΘ}P¬i¦ΨαžΜι%K2_ ‹Π¬UEΘfZ$’e’άΉšΞ’bŠ"6“πu‰›Nc"~šŸ­UŠw2ΡR9œ4-l­?υε›$ž€,jΘ…ό[ δ‡θ―Ξdf@΄βΡ+ΐ@ΩŠΛ—‹ωr1_.ζ ζΛΕ|Ή˜/sPσεbΎ\Μ—‹άaDΨ¬Άγz DΫθnΝbœδ<ς˜ξ… Ξ C£SΤvβ€υf>i9jΫs‘π…ΟmΫά­%—‡urC8b‰/o‹€’Y―σΓ¨ς]Zω.­;μΘ™Λ&_£‡‡τkΩŸ₯;β€—V‘²‘œΚWošόišΪEv ‡π8Θ6RC&ΞΦ(V0Μ‚ΔήΕƒω»^?ώάwβQ¦•―³ήz[§*6zRΖl~υ_jΤ}ΊœΜuΞ;©sNdXΙη˜Έƒ§°„ζ.`-IΈΕ:ŠIδl"g:›@;;،Œ›$κŽIΌzΙ€h…Qό›,/7Χά ΏΏΉ2ΠBΑl‚Γ½JvΔYl,Ϊ•wη*o’ξβΰJŠιm›:’―`η8²Ψ›E¦nŽŠ(’x«nυd>·CΡ¨ŽΔ3U–lRwˆΊ―ΔQ·r‡ΪΉ@P[ΎϊΊΏΤ<ήλΆ―¬BK'xΉfΟπ°Nzv纍·l;έ =)Άλ¬9Χ:'%—‰ζτϊs7‚k¨Ε,¨gW?{#θΛοΟί°tή-ꡉ3wκ»GΤΧX”―€(‹ο&(k·(K aΤ\Œγ7l˜λvγ²ΈX,Oλ{δˆχ…=P? ˆΏΤšTλbϋc»±NΤTZ=ϋΓ²Ž€"²Φ’½ R%C ΑεΪΥƒ Fœ˜nuJ< K5€Χ±•³κt6 „3<Δ©Pί#‹‰C`ω  teώr­96|?ΆΧ@Ίξ°ΪuY¦’&+ŒBΜπ]Ε΄~°-•oEβ–η]ΨλΈ›ζΣ­AVtΎΆ³€\q*Δ^¦U\wΦAiΚ2κ˜MS³R‚‰!^Uh\άΔX&2ιμςν)θƈk?Ρ³»ΖJŠžΥ‰b"MΦΆW“™c ΨgΒΙ5₯-οTΎl•k₯V›ς’Œž vˆ2βNΣ5["fS#6υ™8b©Lώε;X‰*λΠΪΝΡ΅_W Ό7  ›GPH!6Δj`_ž ρ£%kLΑTϋ»¦Σζέ†:φΚ*βŸI;‚ΉF kˆ ΚΏ0€Ό>»BΧ ΟŒCŽη ό˜ ž{‘–Ÿgξž4ώRΎIϊO―†y1δ‘)5x~˜Ήι^θA·’< ½†,:jΒ~Cό“r‹?&œΑ1ΜέΐkHΔA³ΔcΊΆΏvŸ88dšτ@bΎγšŽΚΥΜύSΆ»k}δbΎ₯χΣΖ^y4ΠΎf„WŸιVˆ9<% ΏGϋ«°@ ζzή†Ϋπƒ£ξΪB»Η/χl€ΉH&ΰΉA~6Ž«°2ο«Δ^¬ovΌ^ΰnτ[AΛ[ΓGž!Ώό}6Ψj³FΠρ]»έτ6‚"Ν‰§Ϋ Δ*Fh½.`Μ*Ες|pκ ”xκΜ³Α©³'<3gηƒs Α'ΟΉτ,y>‹R2'ΨDay€’ωΔΏ¨’“ΜS¦;ΪΝS{ ”Γ!Ϋkΐš"ly@υTfΕη―u…— «Κ&RˆγΗ@„›Yaν}„Σ«TΣέμτ<φψΈ³λƒaƒV|όμi’5!k §C± o―Ίkλ‹Ž^, na£Σ"Ύv€30†Q‹‹7ΤΑ‹RΖyο²Σ¦Ι#ηaλ―"QΛo =gc ‚ζzj@³›‡'„νΦR8|jΩ›;ǝ+nΓAεΨ&k)h*p>ޜ‘bκ;θ’aΤ"X~sΪ;MΓωœ‹Œqήλ7ΦΓ7œρC֟Η7Ϋ6*#±§»„ η)^L‚D:‡6@ϊ嬀Ύ1Ί%ασDˆ NtM!E€Ϊι5Φi)'p}x‚,±>"u’7N 䍠 1aPdXΪτ±ΣΒ ~: OΰςςπP2NU’&Ÿ΄7œŽέδΟ£ύ^΅¨τ‚yρZ^ƒνj*θFZNΧ^=ϊΤρbψ+¨cs„’wδ’rΔΡEεΝ†a(Ώ{ΝMε@&ΗPž Τ‰+r‡*{ι+°‰vOΞt±¨D:τχ4ΠsޚsE©X$ΎΘ ηA“ά”#NΈN« j\%ΞkkοݍctQδkMΒOJΝ―*X|θA Dυ6ZςϋΒ άL­Δ V"ڝ~O©8ؚ£τΖ©εΝ;J-§H―€vΚm_–߁M)―8g)užvԞ:;ΐ•O©ΰ¬ήTŸ―ΔtzdΦΤβ\AhE)Jύ^ˆƒ2ΐZΧξ¬λ‘JDΧQ_½5δAJŸθ{=%ΥR£λv”Κ–œ–Φ0G€D€Δ¦€Δtl₯ΫΘΜ­T}ε»cΆŒ)ήi΅#½Α8F‘‰"^%,LJ+±¨6‡Δ-Ρ.PβAΠΩ Nwκ{O«$‚ΛJ•t‚ΉΠΎάφ*U½ζ6‹Ωώ:ŠkL€xΥEί0$?z¬ί…Y% ½ξφΦ©Qˆœ:π»"ΎΜ·―Έ]›Ž―ΐ§y ν\Ì6jvπι>Q#’Ή^)M/AϊΪqΪǏ.‚I„WŒ‚d·TΆ€χΧ€yCXnΐΒΒ’$š.4ιρ\š%|α¨ΫہB Sˆ]‚H$™_θΘ7¨eΧ]Ι ]‘~`U’6­ΥR^Ξwέ5¬Ϊ]χμ.›‡ar NΑtΤ’ζ;νL‡§ψ”uzαψΒYλIk›‘)γΨAη}NZ9Ka*rJD ¦‰ )ϊ΄έ½\T"Oj”£Ζ±o"cK$G Γ>Qͺ…φκ,+Œq=X–ΰΰgˆe1―ΫWάV ,wη<ΏxΔγŠ%σ:89#YKύ9Ά:Πω“ ˜Σ}Ύ"  Y[2΅SϊƒΕq jΊ²hΫSc0Έ΄ΐ %¦μEηm™£λϋλahΡYƒJ(ί`œΌ,ž?v έ— e;δUα/qΞqΊ! Γψ°"Œ`C€Y£>ω πΓ WώΑ’Νt#dl-+*ε.Eα@`7qcΚ`AΎΊ–^;9Η§Z ·Χ€χ“€ &B;Δ’CŠŒ9ν)]ψ.lC‰ZϊΤΤkkrŸ)jžμώ “’Ρ Σ—uЍŸ‹ƒQAR,s=ˆΡΣφ•$"@s~Ίl‘Rκ[Dηι{©„1je’°qΗάn£%#ωXΛν g’ρKe)ΡqgΥW^ύ†τͺ‘8_.ŸR2(–ΎHΛ¦"Ηe–£pΩdχ">œ‘Φ>RτR·{‘λͺυuw­­.+ ^nΟΙΦfΈΐw¦ς’’^ύ8¨Έ€weωον¨4ƒΣ›œ^νnD§₯ξ!οΆYy%zB Ή„ίΘ0“jC’T‰Q+—iλδΒnI ΅Ήζ©ŸZ›-΅& Fnb·"ΖIzQΕΏJQκΚ #ε­ηu”W@+ΧΝ±Ϊ³° ξUU9Rqψ’"Ξ/:«ς«ΌψΒw˜―}Έ¦2ΎσFZ½γyƒο|Θ*/ΌDoΒed½&©υεβ;τΘνLKͺΌ…ZM%ZV*δHύB&ήb@‹žΗ]κx­‹R:™J¨œΆθΞρ$Ij‰ϊhσ'γ!BK]”Β΄€~Λ”΄‘A~@ΧΠEηE²ͺ€Ÿ D¦2ˆ$ΊFςΛΎa”ΛU§ΨExsœΧν6νΒMzaι5ƈ_[<ξϊОΚK₯֌.θώΙZΑ P”€tX+_wκ'OΡίΉͺρΠύ„ΌSδι ›Pi$†H{uj!D€I˜ΌΠ™Xώ<07“Xμ7ž‚†a7\(Γeυ#Qf€/€Έξ'ϊ`%™γ<‹βtzΒqšDž ΡΪ.‘f.ψ“HX΅ΔΘΓό3££ΟΞ/‘Ϊ—ΌΖe§†| Ύvj†ΞgΛΞΧ‰)‰=PωΒσμEΥt8x‘4:@E‚M^ΓΟ¨ƒλuΈΐΎΚϊγ7PΙφΆ–ϋ.TταΆΒ‘˜ΎƒXάošίX:už Œ^ΧτH:Ε`ΐΎ[”!ρ‘H#–8΄~Ο}CXμηΟ_\8zαόό₯3gΟǎϝŸ»΄4μόΒΩ3,κμιΣσgΞΣ—γg] o'ηNFD«oη?yŽ–KΜ*KPΣ™“—–ޜΏ4ΏΈ̟šσ@Μ±JxqώΔόβό™c ΄Wζ珽Š>qa~ι<)dαΜρω7D™ δ8saiώRΨ*šμΑ Η/{unqξΨωωE{ζμ%ΨΉS§ΞΎ>œΗ>{|αΔΒ±9‚υ΄ϊμ…3ΗiEψΊtαάΉ³‹ηΓs!ΪΞ-ž=6Ώ΄„-^8MΏ ‘τ< Bz}ρ,$ƒbˆmυRƒ*Ρƒεk›οv½ή…–Th@ξτΨ-lΎCί| \TΣυ΅ƒeϋΚ κo £(Ά[³π‘ 1ψέ馆Y‘ΎΗ€g Η,V»ατΦ½f°£‘τƒ M.ΆŒ†:(|“ΞĐ“:$@ΊƒΈ!£Β-ώ,ΉυRu›ΝI$@p€:nΫή«HmΔ0 R)8ΰ››ι\Ζί &οu°τΦΐ[]₯LTVΗΚ<ͺ²φΪxΘψ&9T©AΜ3–Έΰς:ώ9ζXξ1Υ£ηΫ <˜ΰΊœ'Š20_Αtΐ­ΣΚφiOπ7‚|¦Ψg/ˆώPέ2RΛΗι CTΥμq ¬Θ^ΘΚ„™\έA•`Φ->zšaŸuάkN‹ςσΞε†δHΜ¨G†v‡0? ͺDwWA;+.Dΰ8νβhίε(ΒJNχ½‡΅ 7:=φDηO˜CΨ9ο τ\χ³mΰ9χt½EŽιBς.ŒΔ.S©Ÿ'γ†Ώα+A—`Žός5RΧ»JG(|ό!V·ί’σa>έ@_6\ΟR2 h¦A%4ˆ@ηΰΌπPγΪυY‰Ζ§ΪE^Όχ»°dP΅Έ |e3πδ\Χ ‘ΥΐΗεeΰSμΞ‘ WδoG‰ŒC(*γTΤPnƒ.ρΝϊ&>‘Σ|:ΙΡφ6 ‘ε΄O$_¬Ώ!Π?P6`ΈoB…ΔδBΒΆΣ³ΧΘX„§PWα w8d&(ǟ9"qbθ8έamΓWlo›¦ υ&½¨vθ‘ΊτP½τ@Σ‹@ƒf( 3HyΈCšΩo»°L[8τ;(ˆύVOαΏ mΊ‘ ϊΔ̏ξά֊!Ρ|aγΈ\‘_!,…ό6“gΈ0} U_a‚ξX`ύΐfp…ΞFdΫό ’QΖςι₯•Π)ε]ΣVξιœƒγιœz[ΑŽ{?bΪrΓ { ™½”4?6܎2ζBL΄4σΔΑ”h4Ρ^ηΝ$Ρ6-Ο;Ε’ΡΠΕ \―w]aμβ6zX΅p¦9ξΠ'{_΄―ς( ž|ΦL'/΄ί…ύ…ˆνG*gP\ΡΆqv‡ΫΖΩ‘ &ϊ=N§Γ.žΐ9.Δ―ΰϊ Œ‹ψhΣ)Θi_Σ˜Γ―@eάκ\€ ‹ώΓ¬…dΣ°c“\ Έγ¬Δݘ½&<Œw &IŸ>^‘C{ξμ[ΗεPγ*Yύ0pH΅Α²ΏΆΛΗΩε΅ώŠ‹s$ 4Žlξ9Ύνςΰe°ιƒΠΉ«… θ AΖσ.θ-ϋ`[Ιlς[οβοοIΏΡ󀉔Ωαύ¬nι.ž'7 Κ½iχJyBJύΖμ»ͺ –œθ‘„ˆRP,Λ‚Λ8±$E―} U&κΕ„πp›Τέω”ΦZrf λJ [TO¦Λ΅;cοΆχn ΌBa9{'}zpςΤΩ£s _£ˆvι ]/—.ρ.`₯„αΑ Ώϊ‘LΊκ"aneΌ¨x Dn°—β–a |i:¨‚Β ƒ’! saλCϊ "2 #—Lx;δ’Ύκ#ξUΘάh€8UaVUmκwθs5²Xέr‚zΦ>n^F-,ΉΐͺO6‘0ΉhΪ'—Z‘y–ΐ]Q+ΒΣϋΆϊ0Ή‘eJΒ ‚Β„P}{Π¦,ρƒϊUθ«N«CΚ‘†[αš=ΰΞΝ΄¬c)ϊ²μΗ@£p™ξΛ€9P4‹Bm‘τ˜°πW¦ϊ#οD‡KμΗqN䇂Š!) ^š<ν0j’'L5€Σγυ(+ Ί‹³ ¦sŒΣ1©S–IB Ι 'Oθ&ψ%Ά›€j NaasΌqs«P;ΛFΒ΄kζp‚)Œά’[φΧ]\{WanΤω>uLηQvKz'θ§‹Dφxƒ=nž#Š)—Ǡځ―)?ɞη=˜Zqυ ϊσΛYχχ˜K=Ό5²°ƒ₯ ]ΦατJŠ„Άϊ°\“=Θ:΅xtΘ£GηW<²bvκ4Μ¦.¬U½6θΟ–Ψ΄ύDe*,4)¨§‘ζυΰ“Έ3D Δ9ζΒωcιJ‘%(™)₯΅ξ«^ο2:T2Οέ7Ήk΅¬ρJθŠYκ¨ί² rŽOGdsNJ Xέ@SΗΊ‡±$ΞΛ›Ϋ’a'?(ϊΜQϋΡYƒb”Ψ C§‘HR !Ν£ŠƒU@c$ϋDα*lΗFiSlΜ’ηΌNŸKϊN²0CjΟ<ž<}ž€/ OυbΊθΏΠ'ΞSΐήx*e»Φ(N{hΫD7φΛ5νDyv5p{`juτ<Σ£- šύ Pc;=›ΫΤϋmJώXvΏM ξ·―½'8Έ}ΛΖ^Ϋ©πm`ΌΞ*²ϊ ρeš₯ θŠλ\ΡεΣΣTHΩtΰ u‘8η†*½u0Qt%?ΤΛ„.ί‘u€;#ΪT˜ εb€λf ΩbͺΆIΰιŒπΓ"ώ~Ν‘Jq2‰`€šDH±^χ*˜Qπp“cŒ†ŠͺΞE6#tΕ5·‘UL ¬ubi£]ΛaØΚΛ]T%2²κIŒ>Žn²p °-Ψ­F@Ο·¦šΡ2{Ÿ(ˆγ“‚3žc½²:ΦΌ`--S Γω8X0T¦ F4Α†ήsΣ[¦fX‘aΜυ Rw=γ·”/s­–β(N€8ς Ί4 ±Hœ«ϋ^   _ˆφ Φ ζš ˜€s©ZL”=Οκ°Άͺ{` ‚π‰*ωBM΅DA „Τlqž*Η`Ύ³›O‹ρDBAήMh„©=‚†‰9―ND¨Ώœ©}μԐG»œ­€ ΡZx:¦c$š8ΧHqhVγή0œν‘‰™–‡ΝMh…„7: QSbd€Ώ>rWzv γ―(δEs.θ™o%‹εZ4α ΜβXΤΚη|Θ½GΎ δω άφ«Ε‘ίZGX€θh‰G‹Έ3K,۞ΓίΠy€m‹αQl+kXΘ11‡ˆ½’τƒΠͺ―"UX„²›’MΜΎ¦Ό 0ηΙφ‘π¬0mΪα©BŸ‘l¨£QŠΣ~XΜ™%τ Η Ή|z‹tš¦ίΠy1τ8 K;{YR·œ'ZbΖρΜΓ‘G“ύ±8δΔή@ΐεAN§τ•Œ„υ Ρ ΓΒh₯tB”uhġŎRfͺ G ·έ†1X$ΛBٌ’ΔΦ)»Τp LΗ:ΞllZ%Zd…lϋ=)’˜/ύ)”Ω©©-½θ? šΉ ΣΟ’γ\VmΌ(Ÿ˜Η­±<oβ«p=φΙ›ςΛbΣUb°ΗxAr$€E^ΙxGŸ6β£@œIIμ5«>/'όJκβΖJϋiΪμ4pΖ;Φ„ιΡΝ…&/ŠEωG7 ? %z0ζ<³x ”ΐ>Π–­Ϊπ$[lψK85α .ŽσuDlȚq‚€{˜Ερ_ˆnωͺ’_)‚ ζXθ‚φu8― S;=0‡τ ͺΠ(‘Uσ\σmBO,Pύ‚¬@KLV4ŠuΩ `4HFTX«ƒ8ΐ½’ΡΜ§όγΤύβ ·CΨτΑΞΝ©ΙυI·.΄) qύ%Δ<ɌΈ†eC@–’užˆ]žwΉί9#›—±4}ŽΪ5Ιl޳:™κqΈWήHmCΛηCΨαν0ΔY—jΖξnGB°>'kbQ¦―lΆUB@ΌB:žίc;½P ξP#*qι`ψ¦X'Α+)Ίœf“ΑΗΞ;θύΙψ —Ρ1Ώς*^0€$¦VY%† Θ±TE‘3‡ς†œ¦K\“©Ksθι)’eΒδqη˜ε8L#Οv©b†>ΤΉ]‹#HΤγ–X νtVEΆ°$χ‘άMž<y!£‚…q;*†uB¦’E‘΅­ΔηYŒΜζ»Da₯θ@ͺ₯°ˆzď)Τ. Έyο τ=qΔ‘»ΠIuŸl€Q;KP>‚ϋSΓ_άe‘Gd0ΕΕ}ΖΫΘgΛo%»Όσ#ώθήφ œ7₯n±Χ@±\Ž6ΗHγΜ3T4x'–(!ρr¬?•1δο—χπnͺ–Hΐξ˜γZυGюΑΒ³–oΤ€\!Ζ[Ε3L7‘Q^ΠΚk·6­š?†œ™ΚΈ­\Άx+½Έφ³6]›©ώ–ΙΝ½‡ΐ tΘ jδfΚ€\%Μ]ΙάSU ο ΝQ?,κsάί±doβDBBR…¨C[ΙSΚ()~pOβτ@[­ζά.ηv9·Λqq»·’/TΛ*Άš˜ζΕ‰›Κͺ€―ejkΧΐΣωςσρR1‡¬"έ„“(‰|ɍ˜/ΎsϊπO¦5Ό—}_Y`P1Χ+XƐŒg“Η _^<ˆ†ϋξf°_’Ψ2―˜{λ―{«ρƒπocΒΤρwDέg Oβ_5\u·!ώ€!~ΪάΏ`ˆ?jˆ―ββg ρσ†ψYΉ/fξΖ²˜+ρ–νˆ,R’θ8‘f…–ˆέ,ΈAύDB―]½si/ͺΫΜή@τ€¬SwX"ΜΆλ•F!£θ`ΥκπjfrΫ³^A!ˆβ¦‰Ψ*DœW ίΩH•uE°yz]iΛ΅ύ8Ζρ₯…3ωγΧkίτK]ΏBkwΖM©ύ+SsVq;φτ` °Ι„ω ΐλΰα«hGς“§ͺ―ŠƒQαΓ糏ͺKiωEb«νΗxΡΐŸJΛIeo3Nbx1–¬Ϊ-_ήFΧϋΫ›/&-9iuτewΫ;—q{»ι#άG7ΡίW§¦ΏSCqu­@vƒsurϋL1‘i³ΌK£;zυ b]Ί_ΫΧζ]Y ϋaZ`7ؘpψ΅…ΒUΙV©]Ct½žgΘV~Κ/­Όf•q«Σlu₯erKi™„!vΩZ!φ8ϊΖF¨ψ“rβΗ©ρΩκŠH1^±X”Eψ 6ΌHΖ%·ΰλ i'Lqύ8Τ•~Ζ|:jήK6 Ÿ±ώΖBΤ”T¨·°½υ~SZRέx~HςΥc);†‚‘ψa;ί#GΜqβδΔδK°¦“7¨ς;ˆ8σV«ί4·K«(δx’lι·Y˜ωf₯OJ©Ί`:=sΐpΏΙ-ώ₯Ε/oθ2vίδΚΌ SΓΣteJ!JΘκΙΊ₯R|gΧqΟW\οώιB gΌΫΐΊ>&CsŸ ˆCΑΚ c^ή6ό­Jqœ`ν;WηŸUŠ{-œ RΚ?Δ8Q"° XIOHΚΥ(‹χŒΎ 6eeRΰ…₯Μfn#1}ώc$ScH/eCΊQ^Ί‰y»ξWHK,χ§“E§mfΛί7p£ΉI9q|<(O-ut'› lq€όΉ8@ε›2χ%Y6»ƒ}3ΫΗίρ„!΅q.‚LeΧΟ¬"0ΙAϋbΩ,jΚζ'H„;ϊyOcκdu΅>}Ε—§ƒΏ? ιk|qφΎ’: κ¦μ‘¬}³ϋΞξ›ΓodΖ0kDΖi$5b$ž·”λf+=Q¦δΕ_žbΩκ6=†½ξαFž:»ΐ'§Žv{3ΈβΉ [Γ-— k#WeΥq2R΄k~Kd|+w€°}†dΙ\Z•€˜0–'Œ‡' >Ψ3βfŒ?Ÿzκz=sŸRΟ‹ν §hqνύ ©Ϋϋfζφ έoF‚δ q”ΰk’ΔxͺT”I_$ΰnΏEμ €ι€Vh'«dώ’’β«vv‚^²s€ΝΤκVζfŒ$5η/Ε‘—M_ϊ(oκ΅8―e":”Έ~­“„»FnR½fΉΚt˜e˜ρ7Ϋ Ϊz’₯,σΈΰ/O Ε¨τaLΔΕxZSύ§E“ŠzFE=ΤΥpvcκ Ί-Χ¨FΆ ‘λ΅εš’Νζ[EΚ™"KXΉth"ΞJ5‹εž&J€<Ηj3ϋϊ/Υ¬°Ύ1¨fŒΐˆ˜΄hY<΄B—oŒ–Εϋν@ ο©*ωλ^―D―‚NόξΫ(Ή«₯κLΙυK@9 p/αy±EB0ωƒωووEaK©M֐xk£X(ϊ'M’F!·[ ν%σΘΠbigώ”ΚΦc2”#Pcx³ ΅"Θ:a Zα‰ Ίl˜’vd»ˆ­il½–1fJ%>^Υ™•­5]Z‰+šΐr@ψ₯ŽηγYΆN©η•p{i£WB_žU··ŽΜ’ψ°ΚYAj4+؁q¬*Τ€ζj嬦Ότet³ζμ%Τ–"’ΚVνpmν­μnΡ[σΫΖ}Αœ‚5DΪΤφΛΫΧεJτ€$αΨΝ(>–vφ3@Ύ,Rq΅hQ„ώ[( ­Rπ¦€₯0Γΰ°x|OCγ"4+BU²€™‰θG™(eΩAσFˆρEΠ=4?Kn­?υRι›${D Ή „όύΥ™Μ ˆV<:c([γ@Qcωr1_.ζΛΕΤ|Ή˜/σεbjΎ\Μ—‹ωr‘-§ΜnCάπφ„la•ό…„{XιΧ]ΌήΊΣ ―w$ά{1z«­Ωvω]ŠE‰›±ΝΖ#c{vmo{Lπώ•8c˜bΜόͺtΖ°Ϊ>\δ±|‰“/qrPσ%NΎΔΙ—89¨ω'_βδKœTKœά"–[Δr‹XnΛ))_.ζ ζΛΕ|Ή˜/sPσεbΎ\Μ—‹±±][° %™»τ²›6ϊ±ςΠΰg}ϊ«ŠΙιYa-CκμσωζLσ{Ϊ †§mΑA +Ϊ‘α»4<h4άΎ6?έf<\”άž³ƒώž4–G}OξK†½Ί£†ψO§έκW‘v’Vƒ}VΉŠ΄V ϊ’ΗςLΐPW‚Fγ­ΎktUιPτΧ˜ο7€ΈΣPόu^Α΅ΚζτVerilogvVsource.verilog xΪΝYλrΣFΆΓ­ΐL/3P ShBΈH6VΰWJbθτΒ?ώτGΛ8kim/‘%³»ŠqΊν£τ=x¬ΎAΟJ»Z‘|k†©묀£sωφœ³gε«΅τσ₯’»(ŒΒžΗ8δ¬χψcmώσΕγ”„Cƒ­Ύν‰fΫRτ’’½ή‘Pί=§θ₯μ.γˆr}ϋΌ’—EAΠβ³ fšα‚’Ÿ)ͺ½ωXΠͺ™Ί΅Ξ›Š2Q4Δ­qδ“Α΄uŒ) ’αΗ‚Žk~iP‘χrA‡‚EίΎ’θΥ–ΧηέpϊAδ9JvΝ`›₯At{O½0™ϊό’“8τxŒ8‰BΗΗ’d¨+•[ζ£ίΞω⼏#Ž}Ǐβ~€Λlά*Σw©…φb •vϊsFΞα:ZΪN†h‘žy#D‘Η1u0σΠ$·όάr_ŒΧπυαΫΧZ‰Quc,s¦˜+E>Χ8E1υ搩ז}κFnλA)σV…q—+Ά‚¬9­{nγŒ¨ΚΟςJkννΩNΓjŸέ³έ°}z^SΩ ±Κ» imυzΑΨ͌>·ϊLΛ»Ϋ&ϋ’o]Φ° ’Ζ©τˆ %cΠxŒm—5έΎΥA­“—­7½}\Τj―Μμ³…Ύε,Θ‰ύΜυν Χ΅ŠΜλσ^/΄Μ ΟΣL΅d3Γ6J‚ΫwŠbΕ<Γbι €Άj@†ΒΗ0d  sΒ,ΙϋC8„Ύβ‡Ρ‡2“«l‚=2˜Ι!OΩε€ | @ˆŒLj 2€]$τ|B% b_ž¦‰€τΒΈ€Ρ™€ύ R«ΖΘ£‘ZC λqA1 ’'c, ₯ /}1/S;(ijIκgβdς`Μ°8y/—ΤζΣώώ­θ‘%34εΡΠ 1—h u9 8Θ(‚8Ιωα ₯`)¬t1’Ϋ¨,ΠδGaiύžO‘Ι‡ΨdΰTN™υ²Z@κŸbJ7Π\ІŽϊMVΗιvzF'ΈήBQί‡«lNVš†ό΅‚Ήύ»X3>VžΥ€²ͺΨ0ΚΆM06vNύUv8†Oφ|c΄ jXΟdC εe’'KΖΚ‘lζ"@Γρ²δ=Υπυ Ÿ6ΜE/˜ jΥΦώΎΨ‡οŽόίΟχΕΕAV•v«TΒ&bƒ°|£e€˜νΠέ–p›ΒmwOά_.ςHΌ‘ϊퟡ#<.όΩK 2©DΪΧZš%ά·β/ρ?n[<³ΧEά¬qΆώΪk΅κ^Lƒ²ψR†¦%`ΟΆyϋ_*³#ά|j"“½α¬D¨ΞS«σΓ£\ζ­Σ}†ΜΞ%;3kWΌϋφΊ+ώI^’˜ObU7=Β©@ΠO„Ι~ψ Ώr܏pKJΗOΊςLh»NΌξ8b‚SΒΉ$κ&t}A hΫίwτQ΄k;ͺε„ΫŸ%hόθη ΰP™#^λΒ5Ι€ͺ]υΙ6±©C―r©th.Ŏβ‡Έ²Γ‹Εθλr;χ(β›YΈ†CΣp—γΈ‘›ZhGL…„B*Τt™ζΈͺ£ŒtiOgΊΪΪΕD,eέPτTά£H–T“Οπ¬Ι§ο)šŒγRBΏ/j₯ΝΨ^XZτbI¦ZNAήξχqφν€"i·Φ’ν2Fΐ)qz…«°BMUόWP­ {UEΐ’mW1B9+Ռш2‡ uFΙΘθR%΄oͺ& =άχΕΏ‹Dρι–ψK‘ άVʞγmA.s$ͺO1^#ιλ(–΅Z”αO0&Q%;‰²Š/-F³ΟT-QI~ξY­œjΝ&άWQ"T[ΌˆΡή=i«Ένλl‘V³•φΓ4=Χd#™cΤ\ρš ΎƒtτΦ‘‚ζ(ˆ³„μΉ˜Um9°2›z.λRΛΟ9hp()}#‡ΤX š¦νZh²\NΨ k ͺ2¬Œ…†/θ…šΑ`,AΙf_ (ΤΆξ\¦Ž(±hZ”iΩrŠOυBθsΉσZ/©eΓ™bϊ„βύ―/•CIίτR΅t΅3΅TΦwΥ~VW8‘^Oλ/κ§υ“ƒ:ΉΨ·a¬6π€UήμlΎεN› Ÿh+GŽ怌²bτ43A„9Q"ωuH TΤ7ΞΑ­σ’μxΉzΎΨψν‚½‘’‚ΤLλŸeZBΜ1ΏςZ€Ϊ<>@y³YP’› ό1q 5GvHiCΙ]ΐŸˆ‹Vb.ς―€,aΞy—œ3Λsœ±2@­y†”­ϋ½VVV“2.‚ͺηɐ͛†«Ιξa8P―o©ζ@ΧήTŠϊb0#«? ȟz°²«–;…ΔHŒϊηD‹_₯§ψO¦ψoφOOŽN~Π7ͺΕΐwΥκj:κxΒ™Ό:>¬Ώ:­μ7ꇀ}HM‹jͺC»qψ΅tψnĜ"GƒπJIlCύLnŠ₯²P©>[―ΙMYΩέ#›ώt|ϋ‘β“€)ΜQλύΨήΛό9τrY0†(χͺ–k†ΛnτzpΡγ² i£.G²ΐEŽAψ" Π²±¬δΥ9ζυυ©DΥκ#Χ»ΤΫXβz^ΈΪνZΌoy;τ͘=PΈ^σžή3Έ ·D0 `ΦC>pΝΊ6ήNLXΎ»M1ʚΆ"μ%Σ1½BWHΑ|až+"ΉΨ―=hœΎ:ϋγθECΔ῁[.ψ+ΈnόeϊδΠ3~Δlπ Τ֐Λ7Ϊ@΅ Ϋο">όkΧϋ|e‹δ.xWΣf€ΠΐqL[β=Ηδ}Γ„2ΗΥJ…#ψ—cθν!匎m\ΕΝΦFρρξ^I8Η|L;|ό{7)/`’R–I° °`πΉ&‘­(ωtw­α¬ξOΆœ`VimLvimvimrcgvimrc.vimrc.gvimrc_vimrc_gvimrc source.vimlcxΪ­]oΫ6Πnϊ½ΆιšΨΗSœ,‘œEΙφΆ Φ>l/Ϋ0¬ΓΜR J’eaεQT/·ύ1Ήž,QrΛ΅NΌ»άοΣ{­β|YΒΚ>fά“!~ψlςpώy>kέ<χK8Δ4δŠΪ.αƒŠšJ*€"ίΡΘ^njWδ­ή-!»‹™†{XBe€’ί+αS>πhΝ4£wt¦ΪΣ™fβΆΞ:¦‚ΖιL3ηY C…œ 4ΗiBfΣI"|E~¬ωΈψ’Ÿh<<‹]&#v₯8ž,ηkυκMvK˜Jς`πO–Hζό$s#6ΣYΞ›βwΝ»­YPς ΤΦ=Χ`šΗ‰=~Ÿκ²J>9Wϊ^4ΘΊ€"€ >μhΑΡιΚ·=-k•ό˜Ij*ΝΛ0ŽZ œwΛ@…ŒΨΔ¨˜Ϊš\Ώ.α8ΡΉτ:σΜyf1ΙDjΊ, Ν΅6εI/ «~ϊ=ύχυι_ƒηD)ψ\—‘œšΕi~l΅–œΆfkξ”ž-Ν…O“Lx¬z€vλC§½πrzΫXiٍT~g§έŽΩ%V|qh(ŽΟnΆ3/EsžΉιάΐJΦZΊ~­b 6ΐΡτzΔΆΰΐ°€μΓ+xiτΘΨV~οΑΎρuΛiΕ%L!Ly"Α6Αξ‚mΓW•Ή{UΩ$‚Gj~NJh»d˜…΄qŸ a˜α%Ω° Ϋύ˜κΥ‘~Έ9`XZvΔκay΄΅aSVo­—ςι)ζ(ρΧΤώνB2ΚGΌμ[vz‚Z—” RΧ)ΥՏӐƭ΅ΣXM«S{rkk-P=Lήϊ6 Ζ*ΦΎ}hŽ‘\ͺJln­](MΟYέΑ”<”±žΙAΎα&£0b0LH1Αd&8Θ‘H&σtFŽœVp!f9ΝHH²±,JYΞƒh?ƒG₯747€)\,€ώξΝ9Œvs)’hΙc―hw텐ι]s«¬Ώέ€ή€Τ€Ϊ€€ά€oςk§’° Ώ―ΏΫ€Ώ»n!ͺΈž_mbXΣέͺH8.±˜ΥΈX1z&ξ^kVdUζ–νŸά.>M.nlΈ9‰5eο«’$6œ,°yύΦζNψΙ;ŽΡνθΛA±₯εξ›Εφ·I›Qύϋ˜ίVyŒ*W«,–ΘMTͺ~έ.Sηϊ›Ξ”Οg· 8CΞτ4`Ύ™Ž7Ρ|]7¨”I%ψs‚(qi„}&bςžGΉ}oΨ±!rI―%"υF,f`OΊ1η€\Α.ρŸ‘Ψ#x™dωΘφΘ(’«ΙΔ‹}X>―υΉΉ;*!_š]λΥǚ;?ΧoDcΒx–ϋ@Fφ`Ο°RFΆαώΧΙ†€ wΨ€ΓΠΙ›x7α0κ#{‰ι.ΤΎΒk΅Λobΰ‘Œύτmπ£ϋfςgτ}}ω‡sίC1α‡ε‘a`ˆΪZ―«4&rΔΔ‚ήχΆVΎ Vue Componentvue text.html.vueattribute_char(?:[^ "'>/=\x00-\x1f\x7f-\x9f])block_tag_nameΓ(?ix)(?: address|applet|article|aside|blockquote|center|dd|dir|div|dl|dt|figcaption|figure|footer|frame|frameset|h1|h2|h3|h4|h5|h6|header|iframe|menu|nav|noframes|object|ol|p|pre|section|ul )\b form_tag_namep(?ix)(?: button|datalist|input|label|legend|meter|optgroup|option|output|progress|select|template|textarea )\binline_tag_nameQ(?ix)(?: abbr|acronym|area|audio|b|base|basefont|bdi|bdo|big|br|canvas|caption|cite|code|del|details|dfn|dialog|em|font|head|html|i|img|ins|isindex|kbd|li|link|map|mark|menu|menuitem|meta|noscript|param|picture|q|rp|rt|rtc|ruby|s|samp|script|small|source|span|strike|strong|style|sub|summary|sup|time|title|track|tt|u|var|video|wbr )\bjavascript_mime_typeΉ(?ix)(?: # https://mimesniff.spec.whatwg.org/#javascript-mime-type (?:application|text)/(?:x-)?(?:java|ecma)script | text/javascript1\.[0-5] | text/jscript | text/livescript )not_equals_lookahead (?=\s*[^\s=])unquoted_attribute_value(?:[^\s<>/''"]|/(?!>))+LxΪν]i{·΅¦δ4i»‰8ήm-‰EΪΚvΌΔ²%Ε‰Σ6mΪ€Ϋ&w8’c 9γY΄Δp—tKχ-]nχ¦νύrΐύϋξσάΏqΏτc@™fC MRb>1Οή¬όk)~νKΒY½γtnέφ5?π¬NσΦΩΏ•Ψ—Œπ!œθAxžNφ |†ξJΒ= a[·:)Όδ4Ω‡’p―€†&τ`Mι‘"*ί‡sˆ¨lη] D»sˆ.’Gδ%@!ν‘ΣPD{ε4ΠGδ4Ο£ršK„ζ19ΝεΏqκ! y–Πμ—Σ\!4'αQ–&τέh lΊπ}ΛΙ(ΥΚ,T3(³ΠJy’³ψ†gΉΦ Ϊv θ`‘ήΦΧυψ1e8€Θ@ρVd θ$αqƒ­wšš φ\Β:Z€‰B;&,Ϊ,“ Λ^šΟqešΛ .·šΝIušΟ”24ZΤΣΚ,΄1Ο(³ΠΆ=«ΜB›ϊSΚ,΄ε?­ΜB Α)ejζ”Y¨™(smŸaq‚VV½*yjlΉ@€ϋ§ 0Qm9#Φ°¨£ΤL'¬Ϋ@»:0ӌ>šΗγ£7&μ“ύ` ΡΎŸV{Rδσ=©vŸ•ΐΕ„2;rN‡:Ο.ž.+ςŒ*Νγ‚Xο4“‹Κ,4—KΚ,΄/+³Pς¬2 5!W”Y¨ YPf‘&δͺ2 5!Χ”Y¨ YTf‘&dIU_h΅,«fržκΛsΚ,T_+³P`Ο+³P}yAUzΚqC•ƒ*Ψ‹ͺTΏ>¦ΚAΥλγͺT»>‘ΚA•λ%Uͺ[ŸLΒΗ\οτ©γ(λœ^Vη‘jυiΞ=‰y½©Άξϋ)‹ΆΫa&³Οd€9Ύ"eλ Θs|΅ #Νρ³iϊ\AFΪ(^γά±”± :ΐ³ Ή”7 ³R9?Ÿ„'ΊX-SžαŠpΡΌΎ(-šXί€Ω½^‘ζψFAFZ‹od€΅Έ’„'YFΠvm=ϋ5΅BlTΎΥ’Θ΅dΩΊΌ›· 0ќn‰k\ΜD³ϊR.š—^ ­±z&Z[F&Ϊ™˜hw 0Ρ©Q€‰vJΝL΄_j`’]“•„‡ΕLd$ΥΌΫIH¦άnE36δΫ΅$|ˆ~‹ψ½€|m'!™eΆ4ΧqΙχmώϋN`πΙχ$$³/έ¦±£·‘v’LjYν60-$–½•ΝΤMB2u»«#”w’πα”2™/ ΙΔfΆh|Ξ L/ ΙL[2Ξ4l2`„.LΒ½Σn§‰­'α#,ž£"$IΈ%IgŽαf` YΣFˆ·8#xBϊvξaI#߈ΠάηΝ:8„ŠσŽˆΉΌο%!™;Ο ν—Ε΄ΜΈœΠ~…ΣΎdτΜΧαWyΡc2¦ ΏΖιˆ‚wΊpu¦ νΧ9uοv\ ε7xΝIVBςMaΖβ:ω–0cQ•|; Ɍ5ξ³irTθwΉ:ψ „τ;IxDNͺ;‘nΣΔΏ›„‡r8Ϊ Π ύχ8;*uˆ Γχθ9ώ@€žwDYτ? η9²θ$@/tu ÏΉΖ(τS ρO’πX1'ΑO2wσdeψYΝε`€x³³ΌσKθ~ž„%tφ_ ‡!ΟΒώ%Χ₯‰pBύ+ΞΔήlΨh‚¨ηξ_ Š˜χŒYΑ~#P+ž#+Ϋoj%τ½ Γο8Aύ.³ω{ΞΊ¦”Œεό_sboœ‘―9‘σDˆΔυš]N!|Ÿ3ρ”0#ϟΉ|=DVΡς€Xλ4‘Ώ$α_Kμk‚Σ!ί =ToϋUΠΣf₯—₯dΨfhΔ„$a2‹ο†#υω*U4¬Ž=Ζέ`tΜ*v+&K’“kαΖ+/ά|γΥ+$5β|GS*[UZ2P#£ !&ςαξ]ήvΙ@‘Tλ iuR'†σ@&ŽΜ΅‘‰δ‰,α“₯ΌΧ FU${χhB’l€…XV,™b#Sƒ}ο^‘d:°DY€BγOΩΪεU%”Δϋ9{₯Εγ―½V–h–χ°ͺN‘ΪAyΕedΚχ(Εg‘ξzΩM[υς΅ωxb]Rθ;™Jœ“¨$ΥINΌ΄ˆΨ2͊g§SNVЊ睺꜁ΊHž¨­\έΣ4^_[™Τ˜Ύ8[ΗJ u.cή”΅θAΒ„DYί–TeοΌσšΐϊΐ »¬ΠN”ξ·eζΣ,Χt&Ž,ή>&j“3jm2³6Ιϋl‰†Σh0ž’μtν~jtΪύt&Ž,-=)ξS’Z9Ιͺ…ζ΄“ό@5† εΡ©ΖΙLά'Ο©ΖT€ EHcΪσŸa„§žW.ΔυNq(άfϊ[zή:Jπβέjπζ†―H+όj_­p>GΞώ¨ž@Α―C¬6ό^ώΗ‘<ˌ—x‹ζ= s”fAΧβDΔ΅SΝΒωϋ1 οΘΤb€e ³ ߐΤcΟ¬σk’Ϊ+^(¬=.gβώ3yώ‡¨=ސ%ηGγ‚ ΗͺIމN<;:Έ’‰γιX()ΩhΌlτ˜(Δ΅Ρ)Δ’ͺB,Iκδ«γcΦqw9n‰jλCcLΤπϊθΤπωLΩΕϊ"5|A’\εΩ`ΌtπίΩΪ}ltjφρLΩΏxI€fŸPS3ΜMέՈOŽN#.fβώ+yΦDq)„"€ρ"~š‘aŒ†ˆί–5^ΩΔ‘pOJ|€"Ϊͺ”[θΫ;©t_Π‡:αΔλ’Ό>£Γb+Ϊ{—ψ$W’Jήζδ)Ή>K Φ•mΪkώΑ”νΰα μΦΖ¦:†f[~P΅Μq0\ύa‰ε"“ΩιΌτΏ¦}* ηXY!ώΓ1FՐλ!Ψ ·£<°UFμ‚Ψϋ%I ΆdN؟$•¦’{ž»Q’…άΚΣ;¬ί—z½D£z&ާcF!†€4ιΑMΌ£Π·Ϋ=₯Η© u I=—N§j™›l‘½‘·uŒ―(;_ΕΑθTΌ‘‰ΛUρ¦ŠŠ»aσ½ž^X£Σ‹/©κ…>H"ιύΞλJ€ω°i_›.z,Z–ώ&ύ§iiΝ/Η&όΦ*~GV|αΦκi>kΘ¨·ϊJͺŸ;•+’ιQF¦}T¦JOΦ%kuŠ—€)-NLΰ#γLσδe—Άφσς&›ψVΫΙ?τ*NrΝ™έ~ŒQ[,tέ1·` θ&Δ© Ω‡¬­3ΚIτ#Ρςm’AήΒξ©)έ4ρυˆPw]PχΛ°Τ}Λ0:8MpB!4MhZ(°Φ‘iC3€ «iθ.–?"`°α8˜²α!Μρ»nƒ­σ°υ l]€­‹°u)*MDgΕ„Θ„…°£―Îσ@§~tlθB₯λγۚP6‘½{ψεBRώέ‡½EeΏ)ϋΗΊ΄©ενt φ3ν’&GlUξπ…9™+ s²]$ΝγŒ4―OΘΪB½ξAέπœΞV΅ C=4-Φa]χAτΦp:¬›ϊGρV"CG½²I30,ά\Τ|L€š2}–νC³ΡA­F·&¨δp2Ԝ@ Zν&΄:>΄Π:‚ 6αZέ„Ά…ώ:k°­»θί[‹Ϋ~C9΄!6ͺ¨΅ΔΖ bΏΊ ]+2πτ\θθΟ€^Xί‚>τυΆ bσl―†@ίΥ;{™kN§ £.ϊaύ·Qֈ?ta`‘vŠΚ} Φ ΒuέƒλΘX8p£ξνή>U\ζ$R…Uؐ™E4 P]β«@πrͺ7  ­ΧQ•"Χ Ν3αςGζΛqƒ¦η qβΪwΒSΊžΣŒμͺllΕΘDΔ>4V­”ΤT~Iυl51Eυh— Π‡/Βρ•‹Γ ώ«]ψ Τ΅ Έϊ’Λ‘`υσ ά‹Α …ώp+ F`°§σeeo―Ιϋ0#/ηz£©κwŸΡ²‡οz“ΖαG/‘λΟ@VU‹p|c#;υ!s7#ζ¬˜t’haθRΙόkφ¦,‘dύdι:=›u]YΕ—£ΥAc@쾁Μ]Gό+oυξέή«­O”$/ιM7hρ %SJΎό'9o£ϋzΓΒ#ηTφ)*^ΠX(£εŒJ΄žT₯RNF1ε₯ŠτΪr†:YS˜x 0ϊ>―BμK=ω‰I…Α/PιœΰΥή’ΔCIό»’¦0ίΝD%Iλέ©‡ΜŠ w€Κ³ŒΚά§‡zW|p­Np«mϘbu\>‹.{4,3ρ·ΘX“Εψκ 2ω^σ―-ΝΟΝΝ¬Βy΅T©œ©ΐΪ\LS›ƒ3ρΣ kdw πΔύLχφ%[zC>Ύ”cL?)ΰœν η9gΰηγ |Œ+ππΜυ…'gΏ‘(“ΝΎ2£¦[ι³ιβ«GήtOηefΉoN2j—εΝN΅‚ΐυζηΫhlλw¬F£κ»ΐ¨n΄τ`Ήr^s~6ύ SE?©€xQ xΞΜ2’²ŽΖu€½ ›ψΆεέΡΦ+1/β€S˜h>Mο\­Šj/fΎγ‰ΣVΉ»’ΧZζΖV*ΤΔΗϋΜ°ŒΖUΦRΆ3΄s{›Ή˜fό04d²Θ–ΰΚshΉέΰz \Ψ*δ₯Β½yV€Έ1ŠNδnΏˆΤf[db?ZΓάΐ1hΚφgu%βE s™^ΧΥ­ρRΰρC¨-ΓρΩsφuIό·$ρΓ†νπσšUeνΫƒ™sy`™ΙάΛ¬YΕδ»β˜;γ8T°€ΟτeδxTFOTF‚ΚPBυb_¨Έ_|WL\M„,zRΐφR_Ψ\[rEEm-ωΐ[τΓ&zθVΒ„ΡKΎRηr_β<'G ~ WήΥAθ'Ύ‰‘ΗΔΐp¨€κΉΎPτ?ήι+“ΨXμO•ϊ³ΨΫ2†}9,3‹Υ½Θ­νΡ6ζqƒΥΪF ο° Ώά κό7ϋΥωlΒJTϊ/’ψŸKβΏ#‰΅$ώ’ψŸ¨κ9]Ž©G§ζku~KxžϊF,ωΫNΏ'ˆϋn^IŽ`Ϋπχ™LχfΤΕ?[Λβͺδ_Δ­™PpkξΣu!γZέ2ΣNgVAω-3ΏuRχ‹mΦυ_υ«λΣ=u=[;_έΏ0"ubuWρβs―?κΏ-δ.T䡟t8M\σΫΨ³SΒVτ[AάoΆΉύίVΤΫkΰJ€4Φ~Ϋλ™8²Νψ’,αΒΖ¨rCΤΐ°Ύ©ŠuERΚ=Ξͺ/ΙΒ*½$³ΆΪ΅·©λΧ‡³Ό*;!@³Φ «μυU ΤWR₯ΥΆV$k%Վ“[[ΑΧ#ε―­` ΌΆ‚C…yζ·q½§€/°¨ά°Ωc1*lF QaS’9HΎέξ±i·£…H»­©Υ€‚³ροχ•IiœnΊ]R΅­d5&’”—ΰTE錡jiŒΦβ–JŠwφeΕaμΩΞS«—Χ΅•ΪFm‘VΕG•R‡mJΥ<ΙΐάaC’΅ηΛ πΉJη™δHAφyˆ‚R9§—+GƒJ‘ Zigzig source.zig‚ xΪέZ{sάΆ—,Ώc'޲₯8±%Yρρ€£dwΪNK§tάΞτNϊϊ«ΗΣ ΙƒNρΘ+–eΑύfϊn]€IΉj2Ιy|δΛί.»‹έ…ΦηςΟέβΊfa0rόΠ=mŸΟ‰Ÿ{‘N§(Hβ’nΎžξ₯»ROχš-Χϋέ‘‡όρhŒ\Ώδ|΅Έ>)ΣΐM<Έ£Γ’φZq}€¦MNg¨$ΎafGφtδ{qRRή(_”qyΑ„ΣΡΝZ2¦’[΅dLC·%1G£©ντιg’h#°£„>Ύ#)$[υsΙ Ύ,ξΜΩMP4B±kΟPL ?—&F—ρ\šΑ-φ<)8‚{$0 ΰDΦψ\’ƒΞxœN§§ΒlοKΣBAJΦDΆΚ ₯΄₯sΙ‚θό™]ΈΆΟˆI¬xC£4‹ΕuIA3²‰&33bzx¬γL,’=)Λ*"%μ’΄>Ηθτ$ŒΖμω²dΎν 6Ρ―$βυύTZΨpšNˆ!-)»τJρd¨32›Τ&’$Ο$ށƒ=aϊx.Qρx4 Η,nDιV*0™'ΡΗ«ςγt6 KOY“¦ϊΎ<ΫρK'xQ\Χηԟy.κ νX F4ΟQσΧΥͺzΜeλn:ΰ•(6Q06?x“+τ5‚/;ΖΌ€υΒSMœΝ‡nJ~εθΕ‹>Ο‹N•ΠιOw^VΠgOπ\©Έ$α8Ό π{*π·q½Άθϋ»χα‡ήΏFÁub»xίZ57¬U£oΕέN§³iΰΞ.όΟψ”K» YZΙnMβΖl!9Ί%₯ ‚Ι 2ƒg’»›Τ;M;޽Ii­Ι`TZΉΖέσο|₯†Xjb“ZXJP.e΄qΠ ˜›φΑKϋxN3ϋ UπApŠΫ€ΑΨΜ"‚XnΏ~΅-΅UO·ΐΌlε_›ΰW»–ΑωΥ•·_5;Θ%­₯z"μPζΏΣ0Ac3†{Ώβ²•}Y™ΌπŸσ/Ρ–58°^³―nŸΚBwp/xgϋήΨτ|MlίdΙ`[ρΗaκ΄υη±Rό09*ˆ/q™ΧψΜS-ωΠ4*ΣΘeΊœŸkϊ¨φ³:br₯•cZg—η’/jβQ‘ν8hβ²ψωΥ*γ&?°ΐ,( @4‰£• g/yνcθ„e ¨ˆBm4BΉvy‘$-`2/ΕI=`b;©O£v•YV{4Ηvcߎ΄’½€`έF°<ˆυ2§K·Ϊ0+Jΐ{ π=Xξα½?YγαΩλάh?Bο=¨ ½)D {‘a§Φ‡ώjσw­KαP·U[[[~.F‡»μΝΑΑΦόφŸ?Ύύ±C `7ŒnγΫ užxƒ «εt‚Τχq@₯ ^6ΖI”"|hϋ12,§Z_κυν`’’ΐ"ͺςa Ϋλ¬ρhΈatϊ+–Ιa=•± u€"Ο5½ A$»r Ή]Z— ΈΣ &`«MΰΗ$lχ~―Β_mΒέ€‚ΜidΫlΏR―5;^`G§ςoι΄{}ΛΙu 5‘ejοÏϊγp°Ρ₯θWX/λXϊ‘HίςΕΕΘ9σ«ΣΜώ:Μ„¨ΰΫzτK&Yχ5~ΰο₯έΨ(χSλ„ΫLI~wwσb½‡`ΰΔ`4†ΦΙ‡ΣΆBξ°ο Ω! ²σ’S3€ ΔΜH%)qy’@–”ΊIU”E…(9­$Λί.Oξ«JςP! ‘”δψώS䈒0j· ©Δr­d™#uΐΥ|™QιΊ‹ͺԊ1•¬'ŠΛv!―ŠΥ­„Ϊi­Ÿο:΅©xŸhƟiΖW4γ_jΖοiƿЌ―jƟkΖ—5γ_kΖΧ4γ5γw5γ‹šρGšρšρsϊ}ZH#Ύ£!χ[ρ1[Q9»΅bΉP‹­»`½Y|ν`β8ƒƒέ½j”¨ξΰΔCυqu^•5¨=‡xκωfολͺZΕΣΦnQσMΡΤAΡ'utΡΥΉΆš^)C„rvy8²:•ΨΓ&Α:R΅•ΐ”‹K‡d—ΩΠπΆqiI—x™d₯ͺΒ5₯—™ΤΥ‰Eίͺ±NΌV·Bβϋͺ°(m)άYa}`MΎΓd«fτΨΆf¦z«t{αΌ ³Τ Ψ—ΙΉΉ‘!„)j>]ΑPšΌ―΅‘\Ζβ_o½ψϋmŸ<,Φ_GσλXoΑiή–λ}rδωP§…v"dγΌ§Ιy@gΗS %Š0dωM%ΤΕ«Έό4;‚…rΆέ-9ΫρiΰbϋΔφ§ρ ϊΥ8ι]„bHΰ9ό% ~#qY/Ήx‡A Šγ/q *=ΕMξΒ‰΅ι3 ΈŽ=b£•φϋ;ϋή”œ<β}χΟμ&pύtŒ%’ŒŸΏ«/χR!A5†μ™|.ΫSΆω‰δΨCŽK–Ή)P aGπa·vp}NžξR(οΞpfs–Σ‭ƨdοR%ΌΩ±xΫμΈB,ΌQmδΦ΅ƒλŽP„ώΙ5¦τ•raλ…’[ΦΩέ…#–Ό‡ί»}CnT`όpβΉkΎΓΉ&8 )“΄ΞΗ ²_"Ξ+*ΩQa½7p[]ΓZογ-ΌŽίΌΑ{{ψ[l‘c!Θ7ρΠΐցΡί5.x Κ±\βX όΐ.· Όή:ς’#8ύσδPB›ΑBn"4΅rbβ†4όŸfύ;^rβΕHSΞv¬ ˜ƒΥ΅ΊΈ·‡-Σκ“―’5<‚πόμυζo>ΊPΓ8—g"?m’N«–γ²ΓΦKΝoΜΥψέU•[oΆηΉPyω{YίόΛ0·)΄Ϋτ=ύW\(3RAŸr2¬΅!ΙϊNΙΊy¦·χ ΜΛΙίdLPœT›ΥΒ›„DRήmφ~ή.+«”=΅RRF7Θ θ…έbοgέΓ@ΩeRuK„¬MΤ€ jŽΥ’₯e ‘ MAψ•₯N³Τ4Ž~ν{9±ƒŸΕNg‰7Eψ]§e$qΊI€ααqaγ89‚δeμ‡°ΑΑS?<ω€’Π¨nt:τΞ.p˜£8΄ΧE$αΨ’ω«ΫηΜu―ή(—―Β§ρεΫs5‘PXΊΌϋ€χbbS¨’΅όoμZφ(„[¦΄ƒ0fίΫ½ο†Usgϋk3‰|žrXΉΌCzC»£€*:Ÿλ)ώΖ¦<ΊdpΪ…±–Δ+οΘf@ω·}” Command Helpcmd-helphelp text.cmd-help absolute_path(/{{path_atom}})+/?allcaps_argument_name[A-Z][0-9A-Z_-]*\bany_word[A-Za-z][A-Za-z-]*\b any_word2\(?{{any_word}}\)?color_code_begin (?=.*\e\[.*color_code_end.*(?<=[0-9])m)ellipsis\.\.\.home_relative_path~{{absolute_path}} leading_word[A-Z][A-Za-z-]*\b long_space |\t|\nlookahead_long_space(?={{long_space}})lookahead_lte_40_chars (?=.{1,40}\n)lookahead_no_period_2_space (?!.*\. )lookahead_single_2_space(?=.* (?!.*\S \S)) option_break[ \t\n,=\[d΅<`ψ„λaΧξ„ζ"Γ}ƒλiό~SίŠOΕΫϊS ΈΙ™γΘ:ώΣρ:τ˜άβZŠDχ­ΧzΟ|€·9δ@’Q?γ<2΄:Ό»ΓAŽF€e½ϋρ]Ž›φρΟ9G ίι­SΞςWΙΫγn’G½·#φ”Λ ·%LγΪ―8_ˆiCSš=BuŸ3#Ez=ΰ†"γ}οkn˜©l$ η3tΒ γœΨψαDΒ~ί<εΨM‘…SΨή£ "}ΧlοXεJžOΉ|'Ɂ3–m[νΐρΗœ§ΠΤ£›=½Υ Γ‹4=π*ηzNphytLhΌ € N―Dc™ΛJΪfί’…U8TnoΰC ₯QU9TηNpμ{λ\\ΉΗΑαΘ·]ΣΓω6ΞuœΑΕ&=¬sι wΠ¦3ςΧ±?L―kΆzLΗ6γv« ώ E:™Œ™œ0OŠlNRG1b‘κ)Ζ‚ώαkŽXΏ*œUG3ΏQίω|ΜΣΑœXo£έο`GκΉ pUΡj.eιeš2ΟNγύwS«ΩΨПώy 7Λ¨υ\EFψG«Ή\OnF©€ϋqo¦s,†!P?šsVoSG Γ+!]­ο*Š6p04ͺlh4ΜCΠ—ώ˜Y)[φΒ[a{ed‘†QήΖέύi”ΥϊΞnΨσ¦ΦΧR‡i½"υΩ\€>9»T%)usγμb ϋτϋ|?k‘Oζ!#ݚ3 Ν Ι4ΌDΛƒ^’ajΆΏΚP\wρ$½' ύβΓ‚$T#)$1€Ξϊi±/2EiLT?Η °¦κ`&VΰBvvA2°ŸΠŒϊμ~”ΏυfECͺ:ς8€!ί¨ m"m!M­χk«š–:πΕΒ Œϊ1Νψ_Κ¨o7«O6N­&βΡLM4ͺ‚Τ:™…¨H«kεZΩΰΏ°7Β; \\ΑΰγύEΈκŽΚ$"`Ϋ7½£kπ―!όΐ Λ€| R¬ΐ4"ή άΟPθϋRξKί vŽ~·ˆ=»΅oΎ²΄ZhΪ Ά*˜ΘH3Q׎φό;ΑΊ*Ά—Ά:ΩxBžε²€P”Τ¬χdΉΗΘkn™GΚήoΏΌψαWεŏ{/”@bψƒV―Ϋ‡Σ ξ2Œμ‚2ν>²G1š‘?₯/—%φΈ.yώ@ςόΙsMςόΪ 0>Ȉ}ž/]@{E?Hc XΎ“΅{΄qP†(βΤΐ―&Hj-'`q‘sg%TŽόŠŽ’½9)(UŽΚ θϋw‡“ϊ΅ͺ"zΚ€"œΆŸJA[ΚΗ–ΪGήA?Λΰ L]™θ Fyήγ΄1I¨^­?Δ χ=EΑžͺώcvά³A“bΉλ4Ae‚‡)ͺήΨo((@vu5vΦkΓ&^ΩΕ³yΥtYŸ5ΔQs± ŸM΄b²"€ρnΉXΈzŠM€mΡ<‹…XΙ:θ‹ψ<‘£\τя€Ÿ?Δν)TXνWFtsΠ9Ξη,ΰž°ΰ!vΔ]Y–_Ψbμ¬Εm~1v»0ύ’‚©θΐΆ„ΫjN]™bΆpD±.φχ77ρ°ΤΩWpUhλdJŸΚdlWŸN+γ&#ŠUϋ(Θδ¦ll%ΜΘbMœΗΙͺh‰€μ§ϋ’Χ9’:hx΄Ž;‚gw³θ-‰œRQ[f°ΈεVΪΐF¨‹αˆνΗFxΐx9°£2•1:ρOsλ“,¬X_Κ2jΛΛ=¦ 9W£©p"ΤΨŽs~ΓtΔT3sΕn*ί#‘sQΓ+c\Φa§ 8^†2ΩK_‹L¬λ:k’,š£ί’!*>‘ όcqΎ°μŽξΌŒ―μψYχρ0—‘ VΦ@ώrίώ|$J΅)œ=Ό2”·Κθ…2ŒύΉQž%€zΥΒ άkf„U‹hosώΠ™δΉc”λΟη™ΈR―Ν"Ψί‘.1׏ΰDΆ?:Χ^^0£Λ‡ΏτKH_Ξb°–/°)nSΎΓ]»~³’βΩΈ<­D3vώX•T¬»Šγ))œ ―Ι ½“!zžΑϊΆPΘΈ}i¦o_– cX-β£Ίι6όχω0)h¨dd]&¦Αšυ¬Š‘ΗΚzV½γmv΅€Ώ8’σκ y³2ΕzF>^|§»Χ‰wΌέͺnŸδr‘odJ/?‚Χ‹Μp‰5ωXΗEVuβ!ΰ§*Ο"»tή₯3πΞdmE’)‹\,λ ‡£ŠΓΒ‡΅άυƒZ*ίC!_5•oE–^wzU¨S™žoWnΚ’ηΙσ[’η›°”DΉΫΠρp‘!Υlι`™f―eεžhΜΠ«λρ^σα=ΡΚz9YβlHj%νCΣ3ΫAX/‰Ύ‘2ΰ[¨Δ΅Aψ–Sxψ}Θ’ e.S’Θoυœφ‘})kšv§g΅LΟOr²ͺq}~ΏŒ©κοχ«ΫpόθΏ«=Ξ’Ξ}+ΞB‡©<ΉWk‚Ϋςω#†₯ltΘ\™}­W-dœ7ιΉ‰ηaͺ0ΧΖ“ŽQn V3Η)“όŒYΝώΚ\ΗθUΐδώ>ς₯yΦλAΧ³: *_«½77Η'ž9Ν.υŒlYβsyXNρ)"IŒ qo’Vδ—ks υ@΄šΤ<_kΙ«*k3Χψ//Ε‚—gnuplotgpgplgnuplotgnuplotpltsource.gnuplot xΪΝYλrάΆ–μ8u”‹ΫΞΈ·€c:φΈ»rΕHς%NJFM“ŒfμIΗяNEYΕ’Ψ]xI€&Aνr‹ιΟΎIŸ#ϋ}˜~.—Ϊ•δŒ GΒˆƒƒs΍Ψk+Υ󁅷ό8!Œo~Ώ2,ΐΩr8«ΛqΆΞ₯ε8χΞεε8χΞ;Λq8œ+^ŸΓΙeΖψΰ8E/¦3ί= 9GΣDώYkΡ±ΩΩΝ^maƒ Ι€›~―%BsιZ‹0/’Νάμϋ­ DJ3"E=ο”ρ‘…s’~ߚl!U":€,ΌΦ:ZΟρL%ρ±²e‘QŸIΝάπ"…\i¬»Ϊ΄wώΑQ²Ϊ217ξX˜»Tδ#Ϊgœ™nFψ€ϊ”GnΟKn±Vl[eνχ,yα’χ-βπ±λάZΐjNSbNΗrκ4sΉ&σ;§‹^ηlLχ6ώ~ŒΧ»A/ΘΧ;;Šρ£ΣΒ’1‚³ά yΞ<‘\.₯ώK§Ζ]φψπEwR¦h78:ͺ©nZΘψ ‰Yδ³8¦ϋt’PhÐޘ 2·‰£ςΙb“˜g«‘Έ+?esx“Ηϋcΐo-Ρr,²Θ§~>c‡ώZˆ—ššψE-ΒΝΰV·ΣΩMίξ|·;€mm΅ysαΖTϊ γxΌ F>YΖ^όX<όf­ΣΊήΫΤQ•όW…€%ϊU9WGŽΘ§ηΊsχlwΆ»·ύyΞYƒΰ0ΈύOƒ ΰGmS GEx ‡π8SζΣ<$)=;ˆΝ ]εΔEB―.ιoSθ΅Υ%lmΙΞ.ε’ΘΒ9‘VWΞ{FsŸ«+―΅‘ž½Ύ„εχΟIΉΛR΄y~>Λ‘}‘ΩάΦ6Ώz©ΕŸƒ7Zξ%δ6rͺi/_ΏHκΡγ‹tάcώ©ααΉFτζX˜ίαrνVώτ&σ|\‡‘'7ƒΫέB?»ώz‘ΪΥd(SʘW•ΌΊΎ©­guΙ!ή9[Ž%sω”¨0™Χ΄‡† Ή\›Ρq"W$ΛΔX‘B ('¦ͺG²\υ@f“1‹δP…1ιΡ€₯*δ2ΣΉ=Q‘ˆEtΈ„λ¨ˆ†,!±VƒŠ‹ξE**’€T”‡"BœP}&$HˆTA YQ~OwrT eΞ¦T±\δ$I5{MU›ΗΒπ‹AΕhBΒL€Υ„d0[˜Y(-LHšκQδXTΔ’i(Ρο#1εJdL£‰B¦…T)(KI•"΄…*Mΐ]*—†·TΔ$S)‚žT™±[%+PTΰ€N³(—%8Ξ‹¬OBΰ³07‘Cwbz %K(L6IM―ŸH@ ŒFΗjR¦1αTMΆ#"‰š˜Ά¬₯i§Υ`ZΝoWZ›T ΄Γ²S;œZ€νŠηIJ;,+0΅Γi’ΙΆ ™T ΄Γ²S;œΐ…CΧ=Χ)λW₯λLλWna½Ξ-«WΉEυšj‰]P‘[δ Υ":΄ΘΒ€‚v˜Ψu‘…vl‡‰%YhΗvh)mOi&Θ„‘[χΚΩΛ²ξMg/gΉW iΑΉωοΊ9¬WκΜ{ΪΙ;Λ/a€`dΪs)¬–Nΰ}ΖϊsΣiœΒ‘μ›hοxUhοΔFΝ<λ«―χŽŸξ?Ϋ?0½g{Ϋ?ψκΉιw°χs{Οώό—½ ΝtΏήϋςΰΫ ει·ίT¨_>ίλušt~F‰žrί@I―$Μ_έT}Ώr…oΗsυ &™U =όo¦C€ EΥ τŠ R2 †Θ¦Ω6νPυhώrΣ΄[Ί-MΏάR!eΠ%Θ*4λλzMU?"Sfλα»R1;HΘ@iΑρΕ€Wp@D53δXΕ›ώίΪTfΞ¦Db•#šj^ «ω« aμj>Ίq•w^€©Θ€οtΈ@-;3΅ Μ‘τaΚ,¦\όαdŠ ΚΛ\Di›&oμ{cΩΎΆ.<½ύ΅Υz{ΑuFΪθΔeh&gΥ‘ΨΐeέE|€˜φa¬l0”8ŽΌ§€H‘Ά€‰{₯Γ;‘Η!Bύ™ έ§zέs³ΚFπΝ`ύ\˜’6tC ) uκ¨rΰZ|+«ΐŒX$|SΦ;›W\P>$<€Ί:7κϊ  qn²LΡ—¦_QŽΗ …~ά._*+Χ«(σί3e=Ψ‚Σθσ‡Ÿ+Βϊ‰"― ’zL2’"‰tΚΞο‘“{*šΐziŠ GτI'ЦyLl7‰[6#}`ύxςhs‘b ˆMd˜n?άΎ·gΰύG67υΫθ%š΄ŸΖ/H_—€~_¦t Fα±€£ϋ›“‰%u·β|% „Θix¦•1“ή^’0~ ¨―RœQ*r™‡K`¬ in[dρQ^%9όi€ψšSdR„C}Γͺόd )*­„Ž ·65œDAp’ΚQHpρτ­e.ψˆ‹1W'(F œ’}†ν›ƒΩ9F3Ÿ,:ϊ»«d‡ΙNL»»θsmqf ΖΦ‘Cσ¦Ήκη –Ά4 ΐκ Ž±Ώͺ|A!A„ NTh}F³μV]}εζ/ n4v§²ϊ*Fί9&KΛ>’/Δ₯ -j—XKδΈ<'ΗυΕr€ςO“ϋwζΈγχˆp΅ ϊ‹ΈqϊΓ¬Ί½θž²’$Τ2ώ¬,yNέi½wi₯>†«}ξΡ‰Δ-<ΊΚŸ7vh&jθ…ΔD,rƒΩ}ΌVal6P=]’Ϋχjφήχ}\xϋΎ9άΪψΣ‘[ΎWίDX„ ͺγE_Δ±ƒΉ^iˆλˆ‘ Y{>OeΕK·ΕQΰ78ΒΟjLD5α»‹#.’Ϋ€ ιWGN!τ˘Ώ»q΄Ϋ¦\+Ο»ϋΩFjΩΈ έέZœ„Œ(Ξ+.—υ±¬ΝaΥxφΦΑΣυ§ζ FοΆ3]q_u… bΰYφ΅ο|CΤ΅£ώ΅£ΎP_μ¨'κɎΊ£ξάQU π§›»jCλ*πΡ|€@ΠΌΠπET–ήγΨίHύΌLz"Ξ}δ+|©_Ν‹ίgί=ϋ*Κ–πΊ–{χΒ^zρ›η7ȞϋY{εsΊ΅ΟHTTP Request and Responsehttptext.http-request-response(?x: ^ (?: (?:GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH)\ .+\ HTTP/\d(?:\.\d)?$ | (?:HTTP/\d(?:\.\d)?\ \d{3}\ ) ) )content_type_sep (?=;|\r?$) end_of_body(?=^{{http_version}}[ ]\d{3})end_of_headers (?:^\r?$\n) http_version(?:\bHTTP/\d(?:\.\d)?\b)media_type_suffix_prefix(?:[\w.-]+/[\w.-]+)multipart_form_data_boundary (?:^---+.*$)ΏxΪνZλSΫF·Mδ Iσ~ρΔΒ‘^I ΓΈ)ρ4ι¦q?!ΜΘ’JlΙ‘dηc¬Ξπ§υN֞NΗIgR}9ι΄Ϊύνήήξޝ^ζzΧp؎kΆco˜­†il螷ρ|?Ώ’§0ΆΧ9„[~«±,ˆ( ρ°βP~ @žI§#όΞ¦Hώΰ‘[Βρœˆ’π<Ά£ΚV§ι[mΝυεχŽΫ’ ΝΧ"ƒ?$/„ν Ξ‡ν¦fQj\’—Βφ.‡τSΗtχ<ί΅μ͈χε>? €Έ.ν W„„γ5.aΫu|Ηίk›Η!!α8Μ5W댫ll΄AχηΙ[ΟGγ ―b<·α{πξ&c`έ±}ΣφeŒhn1ŠΡ42š—@w›Ρ+F‡'ήaL#ό@ψέMγ‡'ή Ϋ!Η½α»ϋŒ‚±ο—υΝ]bΖ ϊ55j@0Νl»‘51SΔ; xΜL°(zν3ŠΖ("KŽr9Π&clžΰƒqf*SσHž0γw`ΊαΧ”‰&YΫθMQ xΚ]Σu^ί25Γtεm­Ω!>.±4Ύί–{„ΔŠS̜ h‚y­;MyQZ‘AKΜ€³μχΌ{ΖΌ£η²ΜΜι”!PΗδΚ §cšKζ{™™zmΗσ¬FΣ”ν²'1ΩsΖΰ$zΑ43όœQa"¬kzmΗφ̍†Ήι;ΛlB₯;‘6Η ξΈΝ ΣΣ5Mυ- žgβΰŽζΪ aϋ2—|ειπΛbe©^¬,¨7΅ΪjY5π½’REmHk#λͺρyφ‹DΎ*τΕ[ŠxχΕώ{γ/Ηψχ'"«Œ“l“Œ}‘ζΏP—eΉ€L+­…'h »ίB£ γM‡ϊΓΏ~`Jμΐ r«ξ΄Z¨hSš–m*ޞνk»²ozΎ$ΧDyΟσeHZ4’ͺ φgΥδx€ΈΨο‡Σ΄ΝσΤ―§[*ŸΛoHήdΝ\P<Υ'Uob½|‘’ιew₯cκ8Ύi(Aύ”`‡F«4ŸK»ϊ§Zš½œΰ°:ΐ΅|ς°εs’‹7J7’ˆ fo™Ύ¦ΰ_rš~_1U’œJN‚;FΓ Λήώ,«€Xk·›–ω¨(.γ₯F@ο‘_Swy½T[I-α7s±«Ί•0πΗ€8έγτI1§yxvρκI-‘%F~Μ,ϋŽPφo\Ω ίp-±{0„`fΈ`䝝ήzΥ¦«n#³π‡Bα°,’EJ™,R2‹»/χ”λ„ΪΆζιΥφ3KΌ+”Ε`hΡκ=³ŒΫB·£` ΎΓΕQL€XΒ‘„# ±h>Dp/Τ ^ΥΎΙι{œKˆS'L‘‘Σ’ΘθiQdμ΄(2~ZyrZ™8-ŠLφ«HD— ερ4'Ίx0sTμp hΒό±A€ϋ XZδA86ˆg¨φŸπήγA<{lΟQ}#αύUΔσ  ²ύεCAδτ)<θŽΝΊ©ΎhΒKΗρ2§o†ρΚ±AΌJυΥQ1ˆΧ2@<ͺέ3ΰ‘₯Ή;m%8-SšΞfίψ¦8`awŒ¨C΅Τέ£>fkΜSΧŸ­ƒμ₯°mwlέο ?Ε3Ρ‚Sσ‘Ž-΄Đ>š{²p*ζIj£Έ&«;h}^\"VΝγ@ GŽΫškiθxMΑP*GŠs²|@_„sΗq Εi›=4t\·i[’Β­,Ϊ۞ΗFλq!\ πη”―+Dθ`­‘+–T/.‡ηα5t¬($Υ›Ϊu–΅‹Ώ& ύ ½ιΟΔσ©Ž"p€ Ά[13ΓQq­Ύ€'Π±¨θ6fψόΐwξγ Σ΄OτNŽό³Δ&j S·ZZ“ΟNΎuτΰkΘ‰ΡΗ¦kιJΒ£Ή³η‰ρ™€©߁ω6Λ§ΜIζNƒ›`€ψgv@›š½ΩΡ6QΔc~ŒΠ91ΜKψŸ‰#HK,©ψ@@ΈΙύKΨβό{΅Φ}S}υΊ»ΊςΦ]ύ»Φ}]ύ³Z«v—WήΎ­.ΧΊ+«΅?VήΎλΦώz΅\νΎͺ-Ώ‘ Μυ’+Ζ‚ΜΥΰ£*%%…ΰI”ΘW6$9ν,ύ’~QJθŸηq,γf@Ρ ©­­ω[ŠaΉ¦Žžφ„šƒ΅rMeοaVΆn*ΤO-)• Ο<31BMœ¬UΚΡΡΪ#Fm‘* ‰;)Me™Iup9‘0 ώΰ¦B\옟Ψι5\†“ΗCCͺ?”΅‹•QU‘ΤΖ±dΑδγο~OΖΑ‹κγγΠ?Η1΄aΎ·l+Έ…ΓοlΎ?”„b’Ά—pn «ΙΨyυR4©²ΦήΌH1 Μ^$Ε\Ώf‹Γ/YŸδ™’ΚρӚ^ΖΈžλ?'¦Ν„s‚Ÿ‘ ‚Κ;kΣ3³λβJζ§o.†φlΔsNΜοE~σb~Ε4~ωTAι-na—œ KRe€€¨h@aΔοx2>½ε;Λ«"E`S©w^‰]€ΐ&R>m’λ3¨eΈ )‘³ŸuoΪεyρ§8!©[ŸgΎ$Υ2c¬ρ/«šŽγQοΦ0σ·šyvιΒΑβtΘ³ˆ•ΣΒr:όφ*κ 7loglogtext.logdebug\b(?i:debug)\berror7\b(?i:fail(?:ure|ed)?|error|exception|fatal|critical)\bhours_minutes_seconds)(?:[01]\d|2[0-3]):(?:[0-5]\d):(?:[0-5]\d)info \b(?i:info)\b ipv4_part((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)warning\b(?i:warn(?:ing)?)\bίxΪΝΩrΫ6P”έΨi|Δ‰€m8‰cΡΆθ3ιTSWΡΌ‰2"!‹cŠdHΠΗXκΏιΟ @$EiόPŒGK‹Εή»ΐΫJ26)ό\Ο5lί–ΐ0„‘q2ͺˆ£χ”α*n ΈQΰΤAΑ ήσB4¦\₯πεΆˆ·@α3 £l—­.RΈ”†ˆ-$A Ž$Š?³EΨ‰ ΗvαH’Κ€·Ό¨γ@γGδ!hα“Ϋ½fΈΛ5^ P{Nα:…vΏ-sδ<Ύη$ έv»ž@η…+ ³ΖHZcg9– ήB'¦”’­Jg¦h)ƚ€h^ωλ$kD zΞH²π―<ڝz^„ ‘1ΆeƒΒ·ι–‡4ˆυ dχ‘ByΫπJ²˜υ;0H₯x-Ι9Ιδ¦$'9†­mIΊ]z$Ήύ2‡Ε―οH¦Ή‹ύGϋ$wUβ ΠlŸš[»½Π°ώ~ηΑ5ΫEπC šv8­Β…) *!Βt됅π/šž‹γΙE„, lS»NcjcŒI]cΫ?25G‰"€lΟΥR“α―tMŽŒB/‡ΐ4ρΏŸ ΔοΑ{PFΜmτήγιΡΕp.5°M§Φ£χ> †ΰ&ς΅Θ΅`@œGΓ?7šPO–±š•ΒkΝΛVsW;jΆZzψW[°%gΥ¬EnLœ“nl3Ζ?g*Œa'ζ D‘]+fΏš₯Š•JφP8υΘ{Φ3pωψDπ1…)•iCαςƒ\|2‘b©OοθΦγΕ°ŽΟθ/6‡ή|W€”»3Ιx3„x Ν“εU₯€ίγ˜Σγ/ΏΗ)Ώ˜½Z³Ρ:9mλΦΰ¬uR?o«x¦ώO ίκT oUςb\ΧC‰;Η½C=‰F1σάSŽn–ϊ“BKz -ι8Κ₯oύ#£υNΦ«ΩΓYΗΔKƒ‘ |9uIΈσ’H£>eb/#κ-Ψ΅];I‰œa_€εΈ§šKΛE‰#{ ½ΛaˆτfOƏEδΡψομkμΈ±W_΄ρϟνqτfό4U]SΟ‡₯±;Σc@οΗU‚λε — υρμθېVΟ2D•’Τ)δΥΏ)ΌΒ'jDv£ lŸp-΅9ˆύbοMθ³ Ίg`ΨΣLΰLHYΝ`θyΖάKaΧoŒ3‚Ym–:ζΝΤc63Ž!nVŠό‹©δ·2ΘΗΙ«ύ₯©τ‹LωηΣsQ‘€}PΌOΚF[ΒI’•©„P:΄—(­ ”¨!…u‘Y•Ά― Ϋ™’Λο―δχ-|ʐΣΜjΞόF‰τ“·Gžί, ΅ΜO°jϊέ‘Z»L½L©JΚ· °)€gΖ©Ζf–w±^γ>άy₯y>L:l†φ΅Ϋ‡n¬I“ΦφΥZλjΏ} β―β2βο€ η2½_ͺάuΰ΅νςμΜU-³Κμ.Ή©wΉ’cΠg9σ+9σ―sζΧxVΐΦoγ:qž^―>ˆξ/]hB³ϋΕMΰN₯„?ΗC£πϋLύaa+L’η2Ή!;#κ%^+tΉ-fΩV!ηrQ;ΉWkzGnp'«ΝqΒΩεy¦}yΧρ’oΚΚbŽ›³—‰‰–½B˜žΣ{όΙ—§οΨΝ–ρ͚cqnfψԍFˆ61Π;™O‚&Kέk%GΏ₯E3ΊΔ3:ζp'ƒCv+wχZΘs?!Η°΄QkφŸg},ΈL77Κ‡%υn|=οΞ S‘Ov}"“ΝζK™e΄γΪ:TK> y*¬[_ Ήοί'…‡‘™?Ί9φT|S8VΛ @ί΅vε“&.€ψΑuf;q%v|­³<ο›YmΒ”rΪΓc{|Ž–9‰mh]1dŒω₯¦ξ΅ϊ?3Ύ–ςΛr4Ιƒ7kN…τ‘ͺ¦Uμx«`Ϊ/ε*RLRΛ©^ΗzΨ>L*•’f!‹ςΆ,ϊ>•p―τζ0ΧCΐFC<Highlight non-printablesshow-nonprintable whitespaceexΪ΅’ΝJΓ@€S½Ύ„YEρθkΨH™l§Νd7l&Τ*BO*‚ΰ‘7=ϊ⡏’'1₯»5Ά[”η/0;ίΜώ¬zγX7l4rθύŒI6#ΠdΣ5Γ5ΓjιŠαͺηŽZ₯ΎfΣ΅ήTŸMΓn$³8V³σ£:ηπ·E³MF™­κR;ίπΓνfyš*M¬•KNBI–EͺλK%S-$A#Ού},Ά_1x+ύύbπn₯G†\ΙςΨ%1N¨fRtΨΛoΕmŠϋϐΎξ–t†ώ™Authorized Keysauthorized_keyspubauthorized_keys2text.authorized_keys-xΪνXέnβFύI6›¨½kΥ.»v6vC²i+$ΔτΊRΘ’Αs€Qνοx–.yΊHUkβγΑ€E²HΛ͌‡γsΞχŸ9pΌwω.[_.x7"ŒwΟξφςŸΓœL’$γƒd!VΙΦsb7$LΑ±b‚ΒΥΒ •>GαύΒ(ό€„π;~ZBψ…Ÿ•ώ…Ÿ—ώ…J‰ΒίXΎwg±ΕoΏ΅œνꨩΐ΅’š@™ο-ΪMυ/,υYΚάYωt”­&―'θ_ZΆrXο,-ΗV::θ(β‡ŒƒOR5’ύ ΤϋΖΖcW?&{ΖϋΖ~ π?Λ–}~lo…Μ–Α:·I΅ΟVœšeŠΐ[Έy›­έHHκ‹$QBϊ$IΨ€GΐΥ ΅%u§Έρ³5Ny R2 ‚Ÿ@Lξu&π!@±FΤρ&—ώ‡T( >i/„u©š@ΡΗN§Žzέl tb(’qCνW @ϊ$†@ηΚ@)τgχ˜ο}N—”ζά,ŠΝγ3»Ρa‡~jœ^άβwg6c<@²ΐg\Α@σF!` ·΄ϊΫΒκ»Ϋ«³Ζωu‡^yzqΪΝμ`Άσ.υΞΥΎίΊmΤαmτލm y… ’έtήΧ―ίΊNΣuΫΣΗG—·ξΔ霸ξόν}K Ώš-&K‹‘H–ͺͺj½·]Όk––m#h£9™wWΙΘ΄CΒ)€?b! ˆ€« ΏaRΜ΄ο.΄βΛ#QD8Βrκ_¨ρ<`ίf@~ΰΐP- τΐ8ϋ+Ϋ*"Τύ †/" Known Hosts known_hostsknown_hosts.oldtext.known_hosts‘xΪ­VέNΫ0N›Ά‹mbW  φ£₯΄ c4 uοΡ”ΚMLc5±‹γ΄C”·›EΪ©γΖi©πΝqbŸs>ŸσωKφε8βφ+ΐ3 "hj£‰=a?Ε±…ΟΉπ©qϋΆΰ„Wqλܚάλb΅Αν~Ύ3@™Xnr{ΐm±wOρ‘Σ˜Jό“Ψ p†xcΘb'ΛβŒ1™-Ο’WSΥGn-·ί²ΊΦEΛrύ»σΞοϋV«›{5”€ΒΪάNμ±0D°γΓk„Ρb3Šπȁؗ±Τ• §%Ab80BΣΩM±ε*œ·Αiν1spAŠ<aG¦˜<° Ε*Κ‰˜|γv og„ϊ™ΐ%–ŒW ³lΏ(λχ|el5©Υ*sΒΙ½εΕT;ϋ™οαΛ7 a0…Μ‚τΨΤe ͺΥ½μΜS*ˆaz§έΎΐψ]W£ }PΏΌHΩ8–O"Μ[kWqΦTψ+ ύ^σώCY­;»3ΌΝJφGώόZy―ήο22Τ4>¦†8οΈeπίZΥj;Ρ―Q΅ΉCPΓν‰8g[ ΑŽ^kqΓΠ4Άp³ΪΉxΝ3Ωj·“ž;kŸυο~ύΉΏ\!’ύΠ]-2ΌNbd—HZ35 ψ₯ϊΰ²ηl-ŽE,ˆͺ€oϋόMΕσΈ( ζƒ°@¨½3š[f @”ρE€9§–P°Ζ3ΔυPƒXΪ²ƒ.Ζιͺγφά8ΦΏ,²β…ή€ς‡A½t…ΛΒν•eύΝ~(œ’1τη€Μ 2ήΚ*σΕσ‘|N€1a@₯ψΊME`BΝΆϊσώKΚƒθ΄(>[ές_ Private Keysource.ssh.private-key#^-----BEGIN [\w ]+ PRIVATE KEY----- xΪ΅ΛjΒ@†3΅΄oΠM7ιe‘θŒ)]”J±4)H)EπΞGΤ‰ffΟχ“MβmεΏωηςη$Œ@WŠΖSΆ4’ΊήTΉΐžΠe x©½PLϋBσ@νˆΟ1ŸEξJΟ!ˆσ.ztŒ=2 wV8σςTΣqC?οA±Χϊ΄Ώσ³R˜΅΄ωϋ—/ζώmσΗ.ωEνUJζ‰uβΔρΩμ»N5I‡²[·ΎwS»πu~Λ{mYΑp–ƒe Ύ¦³΅ωSζΕZ$ίSs+σΌH~ ήSΪσV?Rx”ud#ι Š|Ğ― χδm‘6e4ˆ¬$,²Ν»{jy SSH Commontext.ssh.commonipv4+(?:(?:{{zero_to_255}}\.){3}{{zero_to_255}})ipv6˜(?xi: (?:::(?:ffff(?::0{1,4}){0,1}:){0,1}{{ipv4}}) # ::255.255.255.255 ::ffff:255.255.255.255 ::ffff:0:255.255.255.255 (IPv4-mapped IPv6 addresses and IPv4-translated addresses) |(?:(?:[0-9a-f]{1,4}:){1,4}:{{ipv4}}) # 2001:db8:3:4::192.0.2.33 64:ff9b::192.0.2.33 (IPv4-Embedded IPv6 Address) |(?:fe80:(?::[0-9a-f]{1,4}){0,4}%[0-9a-z]{1,}) # fe80::7:8%eth0 fe80::7:8%1 (link-local IPv6 addresses with zone index) |(?:(?:[0-9a-f]{1,4}:){7,7} [0-9a-f]{1,4}) # 1:2:3:4:5:6:7:8 | (?:[0-9a-f]{1,4}: (?::[0-9a-f]{1,4}){1,6}) # 1::3:4:5:6:7:8 1::3:4:5:6:7:8 1::8 |(?:(?:[0-9a-f]{1,4}:){1,2}(?::[0-9a-f]{1,4}){1,5}) # 1::4:5:6:7:8 1:2::4:5:6:7:8 1:2::8 |(?:(?:[0-9a-f]{1,4}:){1,3}(?::[0-9a-f]{1,4}){1,4}) # 1::5:6:7:8 1:2:3::5:6:7:8 1:2:3::8 |(?:(?:[0-9a-f]{1,4}:){1,4}(?::[0-9a-f]{1,4}){1,3}) # 1::6:7:8 1:2:3:4::6:7:8 1:2:3:4::8 |(?:(?:[0-9a-f]{1,4}:){1,5}(?::[0-9a-f]{1,4}){1,2}) # 1::7:8 1:2:3:4:5::7:8 1:2:3:4:5::8 |(?:(?:[0-9a-f]{1,4}:){1,6} :[0-9a-f]{1,4}) # 1::8 1:2:3:4:5:6::8 1:2:3:4:5:6::8 |(?:(?:[0-9a-f]{1,4}:){1,7} :) # 1:: 1:2:3:4:5:6:7:: |(?::(?:(?::[0-9a-f]{1,4}){1,7}|:)) # ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 :: )ssh_fingerprint#(?:AAAA(?:E2V|[BC]3N)[\w+/]+={0,3}) zero_to_255D(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9][0-9])|(?:[1-9][0-9])|[0-9])“xΪνZλnγDNΊP »”έVhΕΕl©δikoβ\ΪUQA B„΄bSγIkmˆ₯ρΪGžt#δΡ6οΖς“Xζ™>ερ˜o›˜<εD‘­‘MΣEž—"ΏΛ'9m".z–ιΦp6YΓ‹&­Ϋˆε&S7«αώ¬†φ”ηΗLδ ‹$Γ…½W(!υΓY°φ,Ψ&ΧΪ†½Y>βFΔΊφ!§`θ %υ2 < qŽ ₯΅9.ή¦œΝOσ›1a9εb…2κ[6βΒκSΞΉn&leCHXΙLΘΙdrPιΰ*Σ­³Ε›X)˜hυA”Ja˜ήP;‹²VΠηΫπ«XvΝΧwDν₯ΨQεν%θ€Έ¨c«ί€Do•3ƒ‚lΣA>”!Ǝ}‹˜a™Δ8«o!—±(ρ£Oάw*πωΘρ‘Ι΄X+2ͺˆˆ‡4ΣΘςΡ•Οθg›?U&ϊωmξθΒη³Xj†¨™»@μώόˏ:;G]ΝΫ{¦ΪψK–ΊžƒΙIβ!\ Ω(XγEεnHqO£Θ΅z2™ˆLΩD=Λ†ƒv© !ρ‡γΒS$ێΉl„-–΅{KΩMWΦ?4oGάZ:+L4ͺl8Β=E˜‰ΘR`…―TCΎŸY/V–φbƚoo§5ΥΚ –ε7Π΅YP~Y–LηJGM~”V·&΅t0ήΙkS'£Ουπ5ύά­§#‘ΙΰΊ1yš€fΠΡ‚ΒΩ–μ δ‹&λ³ε&Νί)·’hyΔω¬θγn]Ρ5s¬™t4#±κ^Α΅2kk Ψ©β‘!t!Y²ΘΫωαΚYͺͺ\žKFΰψgds!ΩE¬ΌΒύοfΔΞ•₯nαF 8ξ“'x―]Χχšp]Ϋ«OΤHάN§ Ι³%¨D[Kf~RXTX^›©ϊμkm8"S οm!ΩQ ‡EMΙ'€{H~Z ‹γΘ¦`lPκλ!‡„½Pάvϊ•Z­šΖΪP›ͺZ?T䚬ȍ† ΄›„΅C#[˜ϋD,Ύ )Γ4)ΗS”§>:¨dΩ B­9َΚήe-μ£ξ«ΫΘ?«……iQ]XκI:{% œπώ 6αΒ#ΑΒ&ΊšγΡύ½ύI ,;v†ΔΊͺ„ό΅Τv0Έ@“Ξ²¬¦xH³,ΤχΪ‘Ύ@«(l?SD ζ…Ÿ2Ι…h₯Y!?‘,iδƒ4S,„“ā4ΐ4σa)LDH|ΑΑ4΅ς”( #0Nη€Z  ΪA0©s‚‰2ρΕA΅€…‘«‚όΩ‚-œCΩθVc΄xq›₯l2VΘES³σ$(œ)J­'P`₯„ά^}σ͌Z”Ω±ΜŽev,³c™Λμx7²£¨ι7ϐ…t΅EΗ<τĝZxΞΐς’z6Wώφ_š·Λ€]&ν2i—I»LΪeΎI›žLΧƒεξ@“UœM‡«[tF­ σvΞ¨ΫwζŒZ€2qω±τƒ~­>#9[ ψλΔΰΪΦ-ch£tkΑ|G πl`ΑΝλΌKάυe―‹Φ㎴δ-½žšί™ΆπŠ·RJΙCΔ εχqχ»ουΖ― «]ξ>ΧwHΎj€lkρ θZΠ Ψ₯Μ—V?cωί‡Q)Έf\«,럯ΣΫ¬πκ»c©bΧ³ΟΜKD7ΰfφό‹XfοΐM²£ΊWΰ Ζ‹― SSH Config ssh_configsource.ssh_configL xΪε‹nΫFR’γ:q“&iλΌΣ2~€¦e υ5WΰŒ3Η‰#ΉF°βp‘k¬Θ΅D˜Z²|ΨVΛϋ€ϋ±s?«³$—ZΈν8(šHHνΞΞΞ{fg­U’η~ϊ^@Δ!ϋΗ±1"šγ–C4Χύύ―O+ωη֘%Cθj!tμYΖt­ τƒž*ύ7})}ίΘAχ? ¨‡4L§οΟspΆc Ϋpϊ}DΜ!μG“a3jgχlFO3bZ”\NΞ—ΛΑgψ―”ƒΟδ1[ώq9ψ' ώj9ψΏ3ψkι{.OΠ!6S]rΒω€Pπηœ F”t}2l&Δ‚bχ`‹°Ω›‚*χχύy›ώT .ο κ3α]ΰl§ΕΧΠ#d‡ψTΧέ" νΨ zZ0p-=ά…&AΆλmΌC j½]₯YΔ°CgHο ^HύŽΝέ,†ΞiΘΆ?\_°ς¦γ˜π@U ΰ’ ΐΙ°<XgήΟζΏΟζ5ΗΣ,7/χ/ͺy―g0Šΐ5oL„x{›œœ4qžίΑbEΗbp‹‚ν&pψZΰβ!ΰ’ ΐœη1 Η‚Σ_ Fα:ΦΑއ΅dίΌ - βζΐ > 4ήHTΑ›),±5δη΅²"h…wsSœP£\κZ˜††οχφAV·Κ‘―¦ ’˜³η·ŠμΥυv½*8…E·e6,ΫΖ]ds{$ωOΔ~‹ΗΞ€ w–›Φ:ςU½SlA#AΓF€’.°ƒ‘mr.E·ά\χ›‡jf S#_ηΰιά"ΏτΗ‹ό`[fis’ρU~·λ™Ru³Ύάάx«ϋ«σ{jUΌ™™°O}1υ¬€ΣηΩϊsĐAˆ¨ϋ7L|`‘8L5όΐ£\upΧ"•ΰϊRΐQ;‹/1ρΠ3pχ;Ψ4){=lΫ#jdφΥ$>sPΝ‰ύ΅@μΨπ%QMό°’mιν–Ω³lβzoΒ=²(gτ‡ ¨Ψ7‹₯IΊ!«—›|€λͺ>DχW 3,4V 3d‹ͺ½”τ₯σ8H­26dL¨#TηΠL΄šͺ ΦΧEΨ$ςMaI2Ύ<†Χ©2k²PΔ>Τ‘ϋΨ‹ Ύ~11πΔδψπ Ξ]HΨΉbόΟ}ήχ;P§6ββV«eT©’ρ―ώ!gfrzw±¦ΘsΔ³“HΡΝΌ4σϊ­V&=EUΑΝqΐ9”«±Hr²>«(?ΡBλdψV&­°sˆΡ 8Τ<…£­΅ο;žmυ$fΕ»ΨwA`8ŠΧ(/;摁ܬ# Ή}}—‰|΅ΉΫήTe3 zp|·ŒΨE#e!‰'·οyζ&œΝƒ(ύρο΅5ΐσΖ }p΅mA³ΐΫ΄νtlΤOwWžŸXΑk’Nl#Λ=Lρo›~ ς”žιώε˜8Ϊ’= ΑΆ~ΑΫΐL‡―θxΓΖ!εy§m9}ΧΓΎOιŒ<'β|»ύβ%΄­.‰ΎC>Fƒ–γ~τω½—Δ9&tΉν˜”ΝΐΒώkbί;t./ 8ޚŠ*ja―oρο­δ΅θ‘πo›.( ΑΣ<Œϊ1ΨS‹˜?Ϋ"‡Ρ›­ΦKŒέM›JV•`Ζ‘ί-Ο:² šΒ&%6Ας£ε‡Θ¦d2τ]»½ΩΪ‰ j€η'€ ”=Γ΄* π–‡c‘© ~v‘΅rŒ¨† μοbjD±ώž}ίVAΙ°@…ƒX|¨YYήP›³Γδ[μ»VY„τœγ°£ΤTpα$Y†ϊ±οβ$a€¨AΑ΄Ρ$qKήιͺ₯n#}gήš΄Œ ΥAl|ΐTτ#Yι(•[NT^AUJ jxΜ£R`?"Χ X”f‘΄ŸX*^Λ²Ιx+O ψφ›‰ˆ#ι$LΨ„ >’ŒΟ”Ρή–ή"ν—Mν?k{υΔTΖ–ΓW%ŠΛu X§R_‰τ¦h8#Δ[Άi@β(6ΆόϋXα±.M,γΡ\TΥϊ[ΊόŠ ί[Η/KΖg%6yM2~E2>'Ÿ.kΫ¬ΕϊSjΚΤυh‚T9—«V%6}·ι€€¦k9)ͺ‚φLlΨTζTόΓvΎΠ'(²ϋ’f'ο]rηˆZ(~λ‰<Ό’Ξ{œΰqΆ ίΡ…²v( {ΝΥ½¬mΙ‰«Aƒήƒ@Vθ`»X£Κ\ ¨έ9γΚ8˜—ψ%εβ ‚… .ρήώt₯lpΈUeŽŸ\–“ $fέόumυ›κ υWψ?ω‘FqQΊ ψVί΅±²Σ:zΒXλ6ΎΦώ±ΎW_―«υτδΠ(·ΰΫdτΘUEϊ,(ˆ ‚HVΑΆi %)–)Η=+€Γ2θ:ΨheΜF#[)Q '+pΐ³κΩΪρΣ‚. ›iηb‚°1z‡«Hdšτ$Υ8zΒ!˜:‚o9—Μ†ΕN σnι΄$HΚ[Οεœ–‘ψό=λ‡RΖg₯+?8S ϊH›γnΐnKΖοIΖη%γΛΖ”Ή‚`ί—ͺ8 ZvρbŽ[Qς0xŽέΘΐsΖ&Kϊ‹•q~ZΌσEfχ30Ό” Π0ˆ­KΞο咍t2±Z¨Ό‡2CΈŠΆνw?|ήΙ‘4X *‚kΔ£ŸδΣΚ»C”'ύ3 .ΖθσςžJΩΝj‚>J^€œ΅V αΛάΨH'˜ΌRδEΒ©K]Ί΄$Φ8[DΧΗ<]χrve‹γYέΨšρη – #βjΞ%n‹Ζ9Im†>φ.b·k•²Q–ΡE»οΦ+zίΎ§|ό /Λ±ΈžΦΠQΫυŽZΗέΜσΧ’qE2^—Œ&\2~g “ξΏγηY&ʍ‘$!,FΓ8F,Š…Λ :ώA­,Š-.΅7Ιύd -nLΦb9”Γμr¦jΉ$φ‘«₯Ό^ηn” Χ‡€ήόΏzη«ίƒη²L SSH Cryptotext.ssh.crypto}xΪ­XέnάDΞiK B !„¨‚›V`Λc―έJQ•nr• $0]9φμY―mlo²+ω%Έλ%Α >VΟ؞ρΜψ7R¬(3η;ΏsΞ™{Ÿ”Ο'ΥψƒFα|γψα\{ >-2ˆΚvΛθTζ¨[Ζ 2ΗΥψ¨ηŸr?ͺΖnj›fN’Qφ‰$Ζ«RƒΟͺ1MWŠλΗ+œ€ο%«_p"kΌSœ`%~ΆΪ0Ι'Υψ© ΉW²}Œ™ΠΗ-ζ6ŽΫbξ©›όrΙ;¬ΦχE.α²χ‡°υψm=y@[O{lvθx κ”₯gN‚…βψΣ5[‰£` Νl€ΐHγωn”`ˆδœΑ)Ζ^ဆ²»hαQxͺ=₯i¬M#{ωβυΩ?Ω©ύύŸ/i•Ώ’gβ6Ž£$SΫΠΝό(TΛ–δ*_YΓΓiNώ•9¨f\ ΚjUΞYƜΔ]DΫ„Ž O§ ’ίΡ]΅Dε¨"ωiƏΐ!ρ°pθΔV o(χ=μ”Œjςpαα<ρ =eŽƒ}κdQb«Ώ΅Υ΄f3  «’[ZЍk£@ƒ[JS]σe{¬·„Š_¨xMSύΆŠ]~xλΎ§z8N°λdΨkΦΌo§sΒυƒ»Mn±nšh9_‘½7‘σΐΏ)9J–ωΖΎώυ‚ΙO&ΣBΪDzξω‹…meΫkγ„°Ÿ“hΫ ήΑ^ —˜y+Xο’QЈMF Ί2‡L™χ4eL'#%»«¬‘¨¬ΡΎ¬qΎΖ”εtΘΤt΄@ν »ήͺ\­­ [5lΊ­j0j³ξ|ύ4»Ρ £ N΄¦δYMΙu›ϊZŸΆ€m6c8'š OZ@¨h„*6ASG 03OάeΆβ‡‹2ΒiΎLS>K΄…l₯δH;£Ξ’ίΜλΰΞΌΌ›^ύ½vφφN /ΟΞxyΦΑ’eΖ’ΝΠ,qQΒkΨ|R4N6ΐ—[œ¦ϊωΖΙ2[έΊ­:iΆy’:HΣΛU!BιZuΥ4Μ’m<1gθΤB»:[€13?άΣγ΄ν λj>₯ΈΣήΰoψQG$κ=Q‘‡ͺόβ]I²Υΐ¨HΪ6Κΐ€ΝΒdΠD[Οw_]Yο»c?ζ*›,uϊ šΛoα& {'°o5$Ύ†6₯«ίDοa£: šh§€–%‹Ι1Zδ`ΙN­t =}―,ujHb±ώΊBΙ x€ΏδKΊΰ`―Ό0x’;‚R^–Κι2JALΧ4$¨J`$ω)@Y‘­>w,|θ;S›έιθα’Άκζ’†‘\r N΄ϊ@€xΨf΅Άϋ₯tX’Οy•ώ’ΔνΦw܎€5εŠKS¨΅€PθΜqŸrYH £mλω¦ο j¬ͺο zwΔ­XϊFgŸάγ?pmςΣ[]šPΥmPO‘)2ιӝ1IKΓ ‹@C_H΄­Μ¬!+ζιRž&»F’Gψ)€ϊ%ψπ%‚8hΙ–Πή 5€άRn iM†΄&™¨]l ΄(}c)ŒΧzjM:νX“6t&χzέ~κεšώ[ώu§\φΖ3s6#^Eͺ³ŽΏƒ—ψ1ήx,M¦ΤA’£&%ΗtώΜjλεβw‘{ΎΨ΄δχ+Bο” SSHD Config sshd_configsource.sshd_config all_optionsΘ\b(?xi: AcceptEnv|AddressFamily| Allow(?:AgentForwarding|Groups|StreamLocalForwarding|TcpForwarding|Users)| AuthenticationMethods| Authorized(?:Keys|Principals)(?:Command|CommandUser|File)| Banner| CASignatureAlgorithms|ChallengeResponseAuthentication|ChrootDirectory| Ciphers|ClientAliveCountMax|ClientAliveInterval|Compression| DenyGroups|DenyUsers|DisableForwarding| ExposeAuthInfo| FingerprintHash|ForceCommand| GatewayPorts|GSSAPIAuthentication|GSSAPICleanupCredentials|GSSAPIStrictAcceptorCheck| Hostbased(?:AcceptedKeyTypes|Authentication|UsesNameFromPacketOnly)| HostCertificate|HostKey|HostKeyAgent|HostKeyAlgorithms| IgnoreRhosts|IgnoreUserKnownHosts|IPQoS| KbdInteractiveAuthentication| Kerberos(?:Authentication|GetAFSToken|OrLocalPasswd|TicketCleanup)| KexAlgorithms|KeyRegenerationInterval| ListenAddress|LoginGraceTime|LogLevel| MACs|Match|MaxAuthTries|MaxSessions|MaxStartups| PasswordAuthentication| Permit(?:EmptyPasswords|Listen|Open|RootLogin|TTY|Tunnel|UserEnvironment|UserRC)| PidFile|Port|PrintLastLog|PrintMotd|Protocol|PubkeyAcceptedKeyTypes|PubkeyAuthentication| RekeyLimit|RevokedKeys|RDomain|RhostsRSAAuthentication|RSAAuthentication| ServerKeyBits|SetEnv|ShowPatchLevel|StreamLocalBindMask|StreamLocalBindUnlink| StrictModes|Subsystem|SyslogFacility| TCPKeepAlive| UseDNS|UseLogin|UsePAM|UsePrivilegeSeparation| VersionAddendum| X11DisplayOffset|X11Forwarding|X11UseLocalhost|XAuthLocation )\b6xΪνYs7·Ci!…+ΠRΰΚέ@)wqΐΎγ~ΜMΗg L’Ζg›NΫ8dδ]ΕΦd-mWΪ$ξθολΐΥ'νΚΡΚ^gCσC§“ύ!ς>½}zοσΎIΚ½RςάHΗGˆ2Ίη±ρSΑχώύΎ”}rψžΎr:~‘αΫg‘‡3’ώ‰Μ₯tό2Γ;ΔGΔ«²Pxr_*Β=Υγ£"ά1ά—Σρn†{Œ„7ͺzŒϊD±[h|\ŒͺΝ'Εψ§ϊ\qΦΩ^BΝμUGκή(fzΩbœdζ?MΗkιh;η½3χ—tΜgΈ;ΞΞrUQγχŽ$γΫ Ο7h`ή;·lOV̟Ž›§‹«α»εΰ–¨9ώ<ο€cΘΒκ:ΈšHΜoŒΎ=ΛNρ±¨fŒΈνXͺ˜iPE< —‘Γjˆ„ΐΡ‰¦wœπμŸΜš »η€IΝo²qQ Ε58ͺr2€5ΞG>€6έ'Γ²•¦εΤ{Ώ:pκη]κ»ώ`₯~LΦ–X_k#·CψӁΐΦϊΘ^οGΩ‹!Qλ$bTύήij“ΫΔWi%Utι›ˆ+ ΙΛ>όb‚y,νxpNtc%%ΟθΫΑ@ή$ ³μΰCπ€―½³ΞT‘‰γ;έ†σε,du{ ΗBΑͺπ¦ΕƒΞ "ωƒ‚C½*‘Λ•ώΐ4‹¦§bj€΅ ‡šιV£˜nΟ2­ζΡΌVΓρ˜@wΨE§Ήθ4ζ’Σ\tš‹Nσ‘Ζ΄ŒΏΫ_QΒΪ5}Ά²Ώ5Η0Ξb(K5 g°Δ―ρ‚²uɐ9ͺΒY-N;…C·jiˆc4Tm-«ζ’έΙΆu έ=ψΉ ΄˜YeKYWςέyhυΏ6 όΛHcκ‰X;₯ζγ}BυΡΉ–@k Ρ‘±ΞV^ζ€ΊRΆί­Μ΅ΠώψrιxάXIΥϋ9fΒ5ŸΕΠ‘fΤLΏ»΄ˆj! κgœΉ”ιSΉR―}S1‚ΏJGBΑoΔ―θζCδNJ{cβ"φUΦψ˜¦ζάLέΜΑΨ]Ξ^6/lΏΘ‘ίY λς<›Ί—¦°Pu,Υ ’A r*ωό©ω±:ǝ<)e ŒγŸcL=œ#Ν¨Ψ_•ύΊ‘ψ8O³#ψT»Ya.τWOqτϊ1*φύ'S‹έ‚79κ ΚwAμ‘ρ<ΰΞ’E9GσΟrbτVΆΠ:)Y.φΜ«WKEa2|oϋ|uεΡ΄ξ”ΛŽτ%'θŠάˆ­.σVŽ=Ω'£σ¨:—K‚D?l{VκdΝΎf@ίίyΠ»«+ίVκSK9ΆήŸΧ!mοΉι ›Θfp…3/Ÿa+ ψEd©0"χmDvPυ—Fυ§g»Oώq·œq‡΄αͺΜdΒβ"vηdΩ·'λ&eμμN²Οf§σΜΝμE#=sabψŽΪ#Φ>έ}r†CΌF·TόσίΫ Ο°ΤωΞΟ°θ‡nAEƒι°w―·φGdγ€χΔ›x7·z#€ύ!―1χP8ΗΖί₯Υ—Ηsyslogsyslogtext.log.syslogΓxΪ•UKΣ0nϊά—T ]―J¨NJ₯ΈΒ…cέVNc²Ρ&Nδ8[ͺ?Ž+Ώj­'qά€›ϊΠ©βρΜψ›o>ŸΆΆλ\Ϊw˜Ft™p–xʈ;v1Ηˏ[ε΅ίύΈž•ά9ωΓ‹νzŸƒE'L%mυ`?[ Νηω žI»Š¨`Θρλ’ϊ"΄έœ^‘Ή΅oe;Ι‘eNΓΙe~ά0jN]ξι‘D«₯CΝJ8Sκ—UίΘφbΞ™ο€œŒ© «-Gͺ5jŠ9jvνγ¦˜!”Œ;²„1‘{χωοDω΅ΰΨSPΒ±-D‚p_Τ» S—¦!aώ ²·΅*Α>ΡcjDͺτSςΦυͺ_‰ΝβΡŸ4ξρ ±hrΦcA䉉f–™iŠΉ΄¦ζμυ€˜O£WƒΑ+ΰ4Ž#ΖνίΩ eΣ%%»’jνΜD/Σ­Ψwm‡x>•§;špU@3η­Ϋ υ³θ‘#κSNΌ\‡^Φuϊ)΄₯ΫHCΤZ ιt^‰‚εUm=n¬Νω5ƒ8fƒ7JEΊ–[ε₯Šψ/«’g‰Ω­¬Κ»rKψ‹ό―λBok€©—bμ>ž0‹Θ1Ώύψn!ηA6Μ‚θuΓ~Q–Ώ­άa‡1\}ytάΫΘ©ί~ΚwIuμhˆώΣFε<šp¦varlinkvarlinksource.varlink field_name[A-Za-z]([_]?[A-Za-z0-9])* identifier([A-Z][a-zA-Z0-9_]*)interface_name0([a-z](\-*[a-z0-9])*(\.[a-z0-9](\-*[a-z0-9])*)+)ΗxΪ₯U]oΪ0M ΄΄Σ¦=μ2­“Ϊ}$΄ΙϊΊJš΄_±$BN0ΜldΜ&&ώaTβœΔαCυΧαΪΗη_ΫVΦ^«xƒ(£ƒ„Νf˜ŠΕΰώΡ*ΆSƒ"²ΆŠgyv!n¨ΨR1ž²dΙ¦Š/τ€G(Ε†œ¨ΨVθ=–paœN Ώ„ΏΩΠγX,y>x_¨(Ω \X’]ZB¬ζrη₯ΩΰΖu‘?%ϋC–,Σ/$£ώ_ΔεΏK›iλv΄ΣŸ=|pCΪΟ3 ΛΠτωΆb[6Β*±|šΩ’'Xgd[ϋš­ΉRγΰf Ή–>€….`}TqΎ€‰XfΦ-p²‰cΞ–sΣaN½QErισ^€IqcL*Ov©l’ς4ίΪo‘λφυ ΘΗΑοςώGN0ˆϊκγήϋΉ½0r]%q‚β)φηˆ#Yμ˜ηZš•}»ƒΞ;£-)„`»Ž¨sσ|—›Ά©βn σΙ°π%›.œ½} jKΫ|•η‘:ikא½Ήfyΰ’T–ŒRΩ κ₯Ίͺφ^W˜A₯ρ­I£Β©Ψ5,ΞΠ―}ΏΟφŽn€<Žυβy»}irbσSγCΗΰƒ>ή:θ¨ψ sΞψ±’―tΙ„£4wMš3˜Ρ—Ρ… ‡©.]gΗΎ]Ž[ΑΨ½ΰή‡―΅pgΚ_η£³œΠρ:flΊ–'{=š2$Φ,ώ#Ÿtwϋ8Ύ1™[}Υ`˜a΄ƒ =νφ+Χ2@ΝؐŒˆρ•νly‹θΰκέ@>ΧDΉλWGSLwgsl source.wgsl1xΪέXYsΫ6Άμč8Gdz€iš‰‡΄"*‘8™ikZΝCϋΦ§φ©"£(Pβ˜"UVά ?£¨ΟώQ]@ €Žž3ΡΨXj |ίξX,togρΉΟεFα`Dξωΐ¦S¦ΙΰωΥΞςgeο’w£²·—…nκΓƒ‹‚@Βήες^eo©γ—ϋ\Sδ‡βν5.ίΛί&)ŠSρϊ:—‡\’4ύa–βδJ½Νε²wW ό—.˜˜"©Γ fΩν+eψ+οp¨ΐγΛyςχ7Ή<β2πC\2φ–9^G ЌZ!jΔ•β‚ˆ]z9+ΒuGρΰΕ>E‡»ΚΌŠUρE9f¬ΑβlŒ"7£_™Ζ|œ;Έ]yŠu`Ÿ΄sέθI]UηJ0Ώ_Ιόοp=!Η)2Δμt ”eBΑnλy—†² ΕχGε™3†1rΟqšq”…#FUiξ- «Ξ Y³FΏ_£?¨Ρί¨Ρί©Ρί­ΡίVbρ°2ά#μω‘_Ή’ͺƒώφοέΝβΰςέϊNEl5cŽjβ(|K’,vq>=uŸ†”ΣΤάΏ²%—΅ou­ͺυ3jύ:pšΊθ󁼌ς#‚YΧΨU P—ΟΠF4Γ1J£XRuπ'\BςΣK#DS¬πνΥω³τB,…Ά})jƒDWŒΎ.]βεΟA1Vλ=ΆOτ΅γ«¦hiώ:bŠZ={ΨήϊΚaΝ‰mH_`φπwNΏΩrzLΡΤ‘³ΰψ4wq6!-±ο^‘TΓ3.)έσ7 ΅ΌW­ο¦=$ ‚–Yς’°d¨Ξ}‰i„]Š•«)Β”-¨BbΚώ:ΥݜJKγ  Φ ΌΟUΌ…㠍±1Œ’£P\΅­ΔΎ{ Œ§ΫJ³΅β«Ϋ?Wl…<ƒηΉtgλs―n%ξnœ,Ύ,Bθ…Ί4Uχ¨D;Υ 'χjœόHMιΗ†Wνΰڈ\ϋg#²·*"wdΕED†~κ’$%,·aŒΡ9&° R?Μς?8ˆQ€dδ'.ŠGΓZdο²‘Ο €±γ ρ’˜‡ t ’hFf±RL€iĚΑ<φΩχ4‹C’@Κ…ΥK’96!YθΚ”Μ'>€CΜΟΗ€=#lŒ΄ >T&†G₯έτSα8J¦„m2ŠΐψlJ&(Ι₯`$†]9¦VΑQ(‡BΛf˜ΔΎf ΘvΙE䏢7ε¨0%ΐ)Ί0v•ΜΏΌΞ(‚(Γyœ j• }(ε x-αͺ‡$Ε‹•–#mIAc·!νΊ1Ε­‚"Τη¦Ι£$‹ΞΣμη4^XLβʍ.ώLdLϋ5± όAs|LNOΙΩy¬Γ©jιk+Œ ϋn9υ‹ΣωPϊΗ–£«W―Π0Šγhn ‘( ¬§ΉM‹΄,bŸX€m‘§πτΪ"Η ˆV[`Ά΅ž%‰?YM’πˆˆk½ΣΗύΣ3G·hΘYŽyΌ&ώ%+GCTš₯YzPΟtΘ`2ε²τMμ†BjχΫ$*Ν£¨œ4­ί|κmQΝu}1…p<΄%<΄α‘­λj X"ƒ<2QiD oήΨ ΙΥ₯H‹­Π:k(η\„­ŠδάΓΛmΚq‘±““vΫ8)—‹²”ώffώ[I€’INJϋ‚|ϋ――ZuΌηlΏ*nΟΤγδNRƒ.Š‹ώΫߜ-o½U(šξl[¦μ•ΌψFM―2D‚§~]rξΫ}ΫqΤέRi@Ι#Ζu§-ΛKVΛΡirΪΘ!(§ΌfΧܐχ₯β Jpβw;$ƒ―Ϋ‘ͺ„Mަ{’$ό{/Ν-A~(@ Xιψ΄dι²Φdm'c֚¬νxLΓZ“΅ Ӱ֜liΐ;ožΙ.—&“]οr}—λM7Ήήδzΐ™p.Ν Ηα²ΛεBor½Ιυ€³­#—"Ωο΄L‡"±‡7¬έPͺp OO}wΛρ7₯ρqŒ.·ώ N/DNq+‚‹yΉ’―1Up«N’Σ‚ 6 ύ‡Γώ΄ήΧρ8 57¦w‚ώ‰ƒ$]pφφϊω-­°G\RΕ/ΥRqΌ°ζOε‚@‘ΜI//home/zydre/repos/bat/assets/syntaxes/01_Packages/ASP/ASP.sublime-syntaxN//home/zydre/repos/bat/assets/syntaxes/01_Packages/ASP/HTML-ASP.sublime-syntax[//home/zydre/repos/bat/assets/syntaxes/01_Packages/ActionScript/ActionScript.sublime-syntaxY//home/zydre/repos/bat/assets/syntaxes/01_Packages/AppleScript/AppleScript.sublime-syntaxW//home/zydre/repos/bat/assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntaxJ//home/zydre/repos/bat/assets/syntaxes/01_Packages/C#/Build.sublime-syntaxG//home/zydre/repos/bat/assets/syntaxes/01_Packages/C#/C#.sublime-syntaxI//home/zydre/repos/bat/assets/syntaxes/01_Packages/C++/C++.sublime-syntaxG//home/zydre/repos/bat/assets/syntaxes/01_Packages/C++/C.sublime-syntax I//home/zydre/repos/bat/assets/syntaxes/01_Packages/CSS/CSS.sublime-syntax Q//home/zydre/repos/bat/assets/syntaxes/01_Packages/Clojure/Clojure.sublime-syntax E//home/zydre/repos/bat/assets/syntaxes/01_Packages/D/D.sublime-syntax N//home/zydre/repos/bat/assets/syntaxes/01_Packages/D/DMD Output.sublime-syntax K//home/zydre/repos/bat/assets/syntaxes/01_Packages/Diff/Diff.sublime-syntaxO//home/zydre/repos/bat/assets/syntaxes/01_Packages/Erlang/Erlang.sublime-syntaxV//home/zydre/repos/bat/assets/syntaxes/01_Packages/Erlang/HTML (Erlang).sublime-syntax\//home/zydre/repos/bat/assets/syntaxes/01_Packages/Git Formats/Git Attributes.sublime-syntaxX//home/zydre/repos/bat/assets/syntaxes/01_Packages/Git Formats/Git Commit.sublime-syntaxX//home/zydre/repos/bat/assets/syntaxes/01_Packages/Git Formats/Git Common.sublime-syntaxX//home/zydre/repos/bat/assets/syntaxes/01_Packages/Git Formats/Git Config.sublime-syntaxX//home/zydre/repos/bat/assets/syntaxes/01_Packages/Git Formats/Git Ignore.sublime-syntaxV//home/zydre/repos/bat/assets/syntaxes/01_Packages/Git Formats/Git Link.sublime-syntaxU//home/zydre/repos/bat/assets/syntaxes/01_Packages/Git Formats/Git Log.sublime-syntaxY//home/zydre/repos/bat/assets/syntaxes/01_Packages/Git Formats/Git Mailmap.sublime-syntaxX//home/zydre/repos/bat/assets/syntaxes/01_Packages/Git Formats/Git Rebase.sublime-syntaxG//home/zydre/repos/bat/assets/syntaxes/01_Packages/Go/Go.sublime-syntaxN//home/zydre/repos/bat/assets/syntaxes/01_Packages/Graphviz/DOT.sublime-syntaxO//home/zydre/repos/bat/assets/syntaxes/01_Packages/Groovy/Groovy.sublime-syntaxK//home/zydre/repos/bat/assets/syntaxes/01_Packages/HTML/HTML.sublime-syntaxQ//home/zydre/repos/bat/assets/syntaxes/01_Packages/Haskell/Haskell.sublime-syntaxZ//home/zydre/repos/bat/assets/syntaxes/01_Packages/Haskell/Literate Haskell.sublime-syntaxK//home/zydre/repos/bat/assets/syntaxes/01_Packages/JSON/JSON.sublime-syntax ^//home/zydre/repos/bat/assets/syntaxes/01_Packages/Java/Java Server Pages (JSP).sublime-syntax!K//home/zydre/repos/bat/assets/syntaxes/01_Packages/Java/Java.sublime-syntax"N//home/zydre/repos/bat/assets/syntaxes/01_Packages/Java/JavaDoc.sublime-syntax#U//home/zydre/repos/bat/assets/syntaxes/01_Packages/Java/JavaProperties.sublime-syntax$W//home/zydre/repos/bat/assets/syntaxes/01_Packages/JavaScript/JavaScript.sublime-syntax%m//home/zydre/repos/bat/assets/syntaxes/01_Packages/JavaScript/Regular Expressions (JavaScript).sublime-syntax&N//home/zydre/repos/bat/assets/syntaxes/01_Packages/LaTeX/Bibtex.sublime-syntax'Q//home/zydre/repos/bat/assets/syntaxes/01_Packages/LaTeX/LaTeX Log.sublime-syntax(M//home/zydre/repos/bat/assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax)K//home/zydre/repos/bat/assets/syntaxes/01_Packages/LaTeX/TeX.sublime-syntax*K//home/zydre/repos/bat/assets/syntaxes/01_Packages/Lisp/Lisp.sublime-syntax+I//home/zydre/repos/bat/assets/syntaxes/01_Packages/Lua/Lua.sublime-syntax,V//home/zydre/repos/bat/assets/syntaxes/01_Packages/Makefile/Make Output.sublime-syntax-S//home/zydre/repos/bat/assets/syntaxes/01_Packages/Makefile/Makefile.sublime-syntax.S//home/zydre/repos/bat/assets/syntaxes/01_Packages/Markdown/Markdown.sublime-syntax/X//home/zydre/repos/bat/assets/syntaxes/01_Packages/Markdown/MultiMarkdown.sublime-syntax0O//home/zydre/repos/bat/assets/syntaxes/01_Packages/Matlab/Matlab.sublime-syntax1M//home/zydre/repos/bat/assets/syntaxes/01_Packages/OCaml/OCaml.sublime-syntax2P//home/zydre/repos/bat/assets/syntaxes/01_Packages/OCaml/OCamllex.sublime-syntax3Q//home/zydre/repos/bat/assets/syntaxes/01_Packages/OCaml/OCamlyacc.sublime-syntax4N//home/zydre/repos/bat/assets/syntaxes/01_Packages/OCaml/camlp4.sublime-syntax5[//home/zydre/repos/bat/assets/syntaxes/01_Packages/Objective-C/Objective-C++.sublime-syntax6Y//home/zydre/repos/bat/assets/syntaxes/01_Packages/Objective-C/Objective-C.sublime-syntax7P//home/zydre/repos/bat/assets/syntaxes/01_Packages/PHP/PHP Source.sublime-syntax8I//home/zydre/repos/bat/assets/syntaxes/01_Packages/PHP/PHP.sublime-syntax9_//home/zydre/repos/bat/assets/syntaxes/01_Packages/PHP/Regular Expressions (PHP).sublime-syntax:O//home/zydre/repos/bat/assets/syntaxes/01_Packages/Pascal/Pascal.sublime-syntax;K//home/zydre/repos/bat/assets/syntaxes/01_Packages/Perl/Perl.sublime-syntax<O//home/zydre/repos/bat/assets/syntaxes/01_Packages/Python/Python.sublime-syntax=e//home/zydre/repos/bat/assets/syntaxes/01_Packages/Python/Regular Expressions (Python).sublime-syntax>M//home/zydre/repos/bat/assets/syntaxes/01_Packages/R/R Console.sublime-syntax?E//home/zydre/repos/bat/assets/syntaxes/01_Packages/R/R.sublime-syntax@X//home/zydre/repos/bat/assets/syntaxes/01_Packages/R/Rd (R Documentation).sublime-syntaxAT//home/zydre/repos/bat/assets/syntaxes/01_Packages/Rails/HTML (Rails).sublime-syntaxBZ//home/zydre/repos/bat/assets/syntaxes/01_Packages/Rails/JavaScript (Rails).sublime-syntaxCQ//home/zydre/repos/bat/assets/syntaxes/01_Packages/Rails/Ruby Haml.sublime-syntaxDU//home/zydre/repos/bat/assets/syntaxes/01_Packages/Rails/Ruby on Rails.sublime-syntaxES//home/zydre/repos/bat/assets/syntaxes/01_Packages/Rails/SQL (Rails).sublime-syntaxF\//home/zydre/repos/bat/assets/syntaxes/01_Packages/Regular Expressions/RegExp.sublime-syntaxGc//home/zydre/repos/bat/assets/syntaxes/01_Packages/RestructuredText/reStructuredText.sublime-syntaxHK//home/zydre/repos/bat/assets/syntaxes/01_Packages/Ruby/Ruby.sublime-syntaxIL//home/zydre/repos/bat/assets/syntaxes/01_Packages/Rust/Cargo.sublime-syntaxJK//home/zydre/repos/bat/assets/syntaxes/01_Packages/Rust/Rust.sublime-syntaxKI//home/zydre/repos/bat/assets/syntaxes/01_Packages/SQL/SQL.sublime-syntaxLM//home/zydre/repos/bat/assets/syntaxes/01_Packages/Scala/Scala.sublime-syntaxMR//home/zydre/repos/bat/assets/syntaxes/01_Packages/ShellScript/Bash.sublime-syntaxN`//home/zydre/repos/bat/assets/syntaxes/01_Packages/ShellScript/Shell-Unix-Generic.sublime-syntaxOi//home/zydre/repos/bat/assets/syntaxes/01_Packages/ShellScript/commands-builtin-shell-bash.sublime-syntaxPP//home/zydre/repos/bat/assets/syntaxes/01_Packages/TCL/HTML (Tcl).sublime-syntaxQI//home/zydre/repos/bat/assets/syntaxes/01_Packages/TCL/Tcl.sublime-syntaxRQ//home/zydre/repos/bat/assets/syntaxes/01_Packages/Textile/Textile.sublime-syntaxSI//home/zydre/repos/bat/assets/syntaxes/01_Packages/XML/XML.sublime-syntaxTK//home/zydre/repos/bat/assets/syntaxes/01_Packages/YAML/YAML.sublime-syntaxUF//home/zydre/repos/bat/assets/syntaxes/02_Extra/AWK/AWK.sublime-syntaxVY//home/zydre/repos/bat/assets/syntaxes/02_Extra/Ada/ada-sublime-syntax/Ada.sublime-syntaxWE//home/zydre/repos/bat/assets/syntaxes/02_Extra/Apache.sublime-syntaxXG//home/zydre/repos/bat/assets/syntaxes/02_Extra/AsciiDoc.sublime-syntaxYM//home/zydre/repos/bat/assets/syntaxes/02_Extra/Assembly (ARM).sublime-syntaxZP//home/zydre/repos/bat/assets/syntaxes/02_Extra/Assembly (x86_64).sublime-syntax[Q//home/zydre/repos/bat/assets/syntaxes/02_Extra/CFML/syntaxes/cfml.sublime-syntax\]//home/zydre/repos/bat/assets/syntaxes/02_Extra/CFML/syntaxes/cfscript-in-tags.sublime-syntax]U//home/zydre/repos/bat/assets/syntaxes/02_Extra/CFML/syntaxes/cfscript.sublime-syntax^T//home/zydre/repos/bat/assets/syntaxes/02_Extra/CFML/syntaxes/testbox.sublime-syntax_S//home/zydre/repos/bat/assets/syntaxes/02_Extra/CMake/CMake C Header.sublime-syntax`U//home/zydre/repos/bat/assets/syntaxes/02_Extra/CMake/CMake C++ Header.sublime-syntaxaJ//home/zydre/repos/bat/assets/syntaxes/02_Extra/CMake/CMake.sublime-syntaxbO//home/zydre/repos/bat/assets/syntaxes/02_Extra/CMake/CMakeCache.sublime-syntaxcR//home/zydre/repos/bat/assets/syntaxes/02_Extra/CMake/CMakeCommands.sublime-syntaxdB//home/zydre/repos/bat/assets/syntaxes/02_Extra/CSV.sublime-syntaxeD//home/zydre/repos/bat/assets/syntaxes/02_Extra/Cabal.sublime-syntaxfK//home/zydre/repos/bat/assets/syntaxes/02_Extra/CoffeeScript.sublime-syntaxgF//home/zydre/repos/bat/assets/syntaxes/02_Extra/CpuInfo.sublime-syntaxhN//home/zydre/repos/bat/assets/syntaxes/02_Extra/Crontab/Crontab.sublime-syntaxiF//home/zydre/repos/bat/assets/syntaxes/02_Extra/Crystal.sublime-syntaxjC//home/zydre/repos/bat/assets/syntaxes/02_Extra/Dart.sublime-syntaxk^//home/zydre/repos/bat/assets/syntaxes/02_Extra/Docker/Syntaxes/Dockerfile-bash.sublime-syntaxlY//home/zydre/repos/bat/assets/syntaxes/02_Extra/Docker/Syntaxes/Dockerfile.sublime-syntaxmE//home/zydre/repos/bat/assets/syntaxes/02_Extra/DotENV.sublime-syntaxnL//home/zydre/repos/bat/assets/syntaxes/02_Extra/Elixir/Elixir.sublime-syntaxoP//home/zydre/repos/bat/assets/syntaxes/02_Extra/Elixir/HTML (EEx).sublime-syntaxpb//home/zydre/repos/bat/assets/syntaxes/02_Extra/Elixir/Regular Expressions (Elixir).sublime-syntaxq`//home/zydre/repos/bat/assets/syntaxes/02_Extra/Elm/Syntaxes/Elm Compile Messages.sublime-syntaxr]//home/zydre/repos/bat/assets/syntaxes/02_Extra/Elm/Syntaxes/Elm Documentation.sublime-syntaxsO//home/zydre/repos/bat/assets/syntaxes/02_Extra/Elm/Syntaxes/Elm.sublime-syntaxtJ//home/zydre/repos/bat/assets/syntaxes/02_Extra/Email/email.sublime-syntaxuH//home/zydre/repos/bat/assets/syntaxes/02_Extra/FSharp/F#.sublime-syntaxvH//home/zydre/repos/bat/assets/syntaxes/02_Extra/Fish/fish.sublime-syntaxw`//home/zydre/repos/bat/assets/syntaxes/02_Extra/Fortran/grammars/FortranFixedForm.sublime-syntaxx]//home/zydre/repos/bat/assets/syntaxes/02_Extra/Fortran/grammars/FortranModern.sublime-syntaxy_//home/zydre/repos/bat/assets/syntaxes/02_Extra/Fortran/grammars/FortranNamelist.sublime-syntaxz]//home/zydre/repos/bat/assets/syntaxes/02_Extra/Fortran/grammars/GFortranBuild.sublime-syntax{V//home/zydre/repos/bat/assets/syntaxes/02_Extra/Fortran/grammars/OpenMP.sublime-syntax|D//home/zydre/repos/bat/assets/syntaxes/02_Extra/Fstab.sublime-syntax}H//home/zydre/repos/bat/assets/syntaxes/02_Extra/GLSL/GLSL.sublime-syntax~N//home/zydre/repos/bat/assets/syntaxes/02_Extra/GraphQL/GraphQL.sublime-syntaxV//home/zydre/repos/bat/assets/syntaxes/02_Extra/Groff/Man Page/Man Page.sublime-syntax€D//home/zydre/repos/bat/assets/syntaxes/02_Extra/Group.sublime-syntaxJ//home/zydre/repos/bat/assets/syntaxes/02_Extra/HTML (Twig).sublime-syntax‚D//home/zydre/repos/bat/assets/syntaxes/02_Extra/Hosts.sublime-syntaxƒB//home/zydre/repos/bat/assets/syntaxes/02_Extra/INI.sublime-syntax„Q//home/zydre/repos/bat/assets/syntaxes/02_Extra/JavaScript (Babel).sublime-syntax…\//home/zydre/repos/bat/assets/syntaxes/02_Extra/Jinja2/Syntaxes/HTML (Jinja2).sublime-syntax†^//home/zydre/repos/bat/assets/syntaxes/02_Extra/Jinja2/Syntaxes/Jinja Templates.sublime-syntax‡N//home/zydre/repos/bat/assets/syntaxes/02_Extra/Jsonnet/jsonnet.sublime-syntaxˆJ//home/zydre/repos/bat/assets/syntaxes/02_Extra/Julia/Julia.sublime-syntax‰E//home/zydre/repos/bat/assets/syntaxes/02_Extra/Kotlin.sublime-syntaxŠQ//home/zydre/repos/bat/assets/syntaxes/02_Extra/LESS/Syntaxes/LESS.sublime-syntax‹H//home/zydre/repos/bat/assets/syntaxes/02_Extra/LLVM/LLVM.sublime-syntaxŒC//home/zydre/repos/bat/assets/syntaxes/02_Extra/Lean.sublime-syntaxI//home/zydre/repos/bat/assets/syntaxes/02_Extra/LiveScript.sublime-syntaxŽF//home/zydre/repos/bat/assets/syntaxes/02_Extra/Manpage.sublime-syntaxX//home/zydre/repos/bat/assets/syntaxes/02_Extra/MediaWiki/MediawikerPanel.sublime-syntaxT//home/zydre/repos/bat/assets/syntaxes/02_Extra/MediaWiki/MediawikiNG.sublime-syntax‘F//home/zydre/repos/bat/assets/syntaxes/02_Extra/MemInfo.sublime-syntax’H//home/zydre/repos/bat/assets/syntaxes/02_Extra/NSIS/NSIS.sublime-syntax“S//home/zydre/repos/bat/assets/syntaxes/02_Extra/Nginx/Syntaxes/nginx.sublime-syntax”B//home/zydre/repos/bat/assets/syntaxes/02_Extra/Nim.sublime-syntax•D//home/zydre/repos/bat/assets/syntaxes/02_Extra/Ninja.sublime-syntax–B//home/zydre/repos/bat/assets/syntaxes/02_Extra/Nix.sublime-syntax—G//home/zydre/repos/bat/assets/syntaxes/02_Extra/Org mode.sublime-syntax˜E//home/zydre/repos/bat/assets/syntaxes/02_Extra/Passwd.sublime-syntax™I//home/zydre/repos/bat/assets/syntaxes/02_Extra/PowerShell.sublime-syntaxšP//home/zydre/repos/bat/assets/syntaxes/02_Extra/Protobuf/Protobuf.sublime-syntax›T//home/zydre/repos/bat/assets/syntaxes/02_Extra/Protobuf/ProtobufText.sublime-syntaxœU//home/zydre/repos/bat/assets/syntaxes/02_Extra/Puppet/Syntaxes/Puppet.sublime-syntaxT//home/zydre/repos/bat/assets/syntaxes/02_Extra/PureScript/purescript.sublime-syntaxžB//home/zydre/repos/bat/assets/syntaxes/02_Extra/QML.sublime-syntaxŸE//home/zydre/repos/bat/assets/syntaxes/02_Extra/Racket.sublime-syntax C//home/zydre/repos/bat/assets/syntaxes/02_Extra/Rego.sublime-syntax‘N//home/zydre/repos/bat/assets/syntaxes/02_Extra/Requirementstxt.sublime-syntax’E//home/zydre/repos/bat/assets/syntaxes/02_Extra/Resolv.sublime-syntax£D//home/zydre/repos/bat/assets/syntaxes/02_Extra/Robot.sublime-syntax€V//home/zydre/repos/bat/assets/syntaxes/02_Extra/SCSS_Sass/Syntaxes/SCSS.sublime-syntax₯V//home/zydre/repos/bat/assets/syntaxes/02_Extra/SCSS_Sass/Syntaxes/Sass.sublime-syntax¦F//home/zydre/repos/bat/assets/syntaxes/02_Extra/SLS/SLS.sublime-syntax§B//home/zydre/repos/bat/assets/syntaxes/02_Extra/SML.sublime-syntax¨C//home/zydre/repos/bat/assets/syntaxes/02_Extra/Slim.sublime-syntax©L//home/zydre/repos/bat/assets/syntaxes/02_Extra/Strace/strace.sublime-syntaxͺE//home/zydre/repos/bat/assets/syntaxes/02_Extra/Stylus.sublime-syntax«W//home/zydre/repos/bat/assets/syntaxes/02_Extra/SublimeEthereum/Solidity.sublime-syntax¬T//home/zydre/repos/bat/assets/syntaxes/02_Extra/SublimeEthereum/Vyper.sublime-syntax­K//home/zydre/repos/bat/assets/syntaxes/02_Extra/SublimeJQ/JQ.sublime-syntaxL//home/zydre/repos/bat/assets/syntaxes/02_Extra/Svelte/Svelte.sublime-syntax―D//home/zydre/repos/bat/assets/syntaxes/02_Extra/Swift.sublime-syntax°Z//home/zydre/repos/bat/assets/syntaxes/02_Extra/SystemVerilog/SystemVerilog.sublime-syntax±S//home/zydre/repos/bat/assets/syntaxes/02_Extra/SystemVerilog/navbar.sublime-syntax²H//home/zydre/repos/bat/assets/syntaxes/02_Extra/TOML/TOML.sublime-syntax³Y//home/zydre/repos/bat/assets/syntaxes/02_Extra/Terraform/JSON (Terraform).sublime-syntax΄R//home/zydre/repos/bat/assets/syntaxes/02_Extra/Terraform/Terraform.sublime-syntax΅N//home/zydre/repos/bat/assets/syntaxes/02_Extra/TodoTxt/TodoTxt.sublime-syntaxΆI//home/zydre/repos/bat/assets/syntaxes/02_Extra/TypeScript.sublime-syntax·N//home/zydre/repos/bat/assets/syntaxes/02_Extra/TypsecriptReact.sublime-syntaxΈF//home/zydre/repos/bat/assets/syntaxes/02_Extra/Verilog.sublime-syntaxΉF//home/zydre/repos/bat/assets/syntaxes/02_Extra/VimHelp.sublime-syntaxΊH//home/zydre/repos/bat/assets/syntaxes/02_Extra/VimL/VimL.sublime-syntax»P//home/zydre/repos/bat/assets/syntaxes/02_Extra/Vue/Vue Component.sublime-syntaxΌO//home/zydre/repos/bat/assets/syntaxes/02_Extra/Zig/Syntaxes/Zig.sublime-syntax½Y//home/zydre/repos/bat/assets/syntaxes/02_Extra/cmd-help/syntaxes/cmd-help.sublime-syntaxΎF//home/zydre/repos/bat/assets/syntaxes/02_Extra/gnuplot.sublime-syntaxΏj//home/zydre/repos/bat/assets/syntaxes/02_Extra/http-request-response/http-request-response.sublime-syntaxΐB//home/zydre/repos/bat/assets/syntaxes/02_Extra/log.sublime-syntaxΑP//home/zydre/repos/bat/assets/syntaxes/02_Extra/show-nonprintable.sublime-syntaxΒY//home/zydre/repos/bat/assets/syntaxes/02_Extra/ssh-config/Authorized Keys.sublime-syntaxΓU//home/zydre/repos/bat/assets/syntaxes/02_Extra/ssh-config/Known Hosts.sublime-syntaxΔU//home/zydre/repos/bat/assets/syntaxes/02_Extra/ssh-config/Private Key.sublime-syntaxΕT//home/zydre/repos/bat/assets/syntaxes/02_Extra/ssh-config/SSH Common.sublime-syntaxΖT//home/zydre/repos/bat/assets/syntaxes/02_Extra/ssh-config/SSH Config.sublime-syntaxΗT//home/zydre/repos/bat/assets/syntaxes/02_Extra/ssh-config/SSH Crypto.sublime-syntaxΘU//home/zydre/repos/bat/assets/syntaxes/02_Extra/ssh-config/SSHD Config.sublime-syntaxΙE//home/zydre/repos/bat/assets/syntaxes/02_Extra/syslog.sublime-syntaxΚN//home/zydre/repos/bat/assets/syntaxes/02_Extra/varlink/varlink.sublime-syntaxΛC//home/zydre/repos/bat/assets/syntaxes/02_Extra/wgsl.sublime-syntaxΜbat-0.25.0/assets/theme_preview.rs000064400000000000000000000002541046102023000151720ustar 00000000000000 // Output the square of a number. fn print_square(num: f64) { let result = f64::powf(num, 2.0); println!("The square of {:.2} is {:.2}.", num, result); } bat-0.25.0/assets/themes.bin000064400000000000000000001175271046102023000137540ustar 000000000000001337½xΪ΅—½kAΖo£ψΏ ΡΏ0έ J «4VZX4EΐΘdonoΘξμ:;›p­" (χ,D΄²²‹,‚Ϊ% Ψ˜˜„u6ϋ=·3{ΊE&w7Οogζ}ζw΄ν•πΉ8<|IΫ}ΈιΤι+ˆ:Xoh««Ώ|­ΏΏίηύτ΅‘‘‘ρΡFGGύψΓ…ψK±SΤξŒZέΆ,DXς³eYΎ\΅#j]F11’_Χ?ΏTˆ$―".ƒ„βYˆb=ι·ωδŽB~P”›4PΡΏ{™λ{$ϊC’^o@ u†hE’θ6k€½K†»+j§!ΕpLGωmσ±_)Ԝ±i-ΫΔD*—Ω4·"J“Κφζe€5T»ώαΧn/ 7 fM@ …€nBΧM:ΞΎχ9 GΘΆΦ`Βb†jΥ"ΦλHΑ`κΡΆ‰ΐ.Ζ!!`ΐαφ°PΖΪΖ½λͺ%Ω_0 N£q’hA γ[lc¨ΰΙƒ·ίU¨x«ΉžγΨ”΅―E½΅Π>ήIΏ•́Ύ§ΜX‘>k,±ο>ρ]Ήΐ«SΚ1A™Έε‚ώΫ$„ΎBB°Φu頏…šO²\Ή§]™διšb²gΥCž‹ͺΠNΓIΓόξ‡xJt|œQ3Π,m Ο)hη£Φ ΌζΑΐnΐEΑ&βΩ%ήؐΜ΅!Κ™²θτK| ,μκ@O}" ΟI j;ˆ²fušR!eˆΊMX5Μw£†§AOI²γω90d9&d„γ`3Ψ¨t­4m}*§Υ^ΏRΔθHώt ζΔ¨mζΛ7gˆΓ’iBζ_.+Ε„82y”q£ƒύίV7σ ΘQΥ%cq½F›QsŒΉ―ΏŒ“Ω8Η€ͺM³h<W°ϊδ¬.(qY w)N‹‘­Ϊsmθͺ_~šFRPCE:7­@ροΧό€œ”­H6₯ΤPf—\υ)Λnqϋ!ρί}F-N* χΏΌ}@-†”ΒfκkώTJk’φ’¨½¦X\\TdΐΑόΉWTέ€Τb]GM½G+ŠC₯Ozμρέ+Ώ “ΚX»έ«\dΦ“ήK-UβcΠβWAΟα7yjΐΐμ–α±l…§2Ξρ<—'άbΠό'Πω€ψMŠŜ…JΓ±i1§Υju`ӈγρS κSΕ€±±1…9vgg Χλ²ΐ;‚‚΅ςΛd4Δ sφκμέVέοz ΠaΤχG½ΓPχ†Zˆο_‘ΥΩ Coldark-ColdDxΪ­Y½’έ4Ά7 dΨMv7Γ&μΩ0!!dΖβh*:†š]KΧW\[2’Ό›exžš&=%%υΆΜPςΙς΅d9Ω[ΨχΪϊΎsŽtt~tÝ ϊ|ΝRω:χp―~ψΟ EOΎ]‘”δ9“αώρgΧα?ύ]}ϋϋκί« χ ƒ~}Y^ύξηπΛο²+ύνΊό]ώ(G~_#ΆσΦχχ껐œΡ$°ŒΪο™ΌΘΑBιήΪΘοΦwœε+(ˆ°Ρί3鉄)‰{Γn‡ΰϋυ=fY†©l_«ιΈξF QZR βδ0–˜·#_―‡V€E sμΙ³?δI!M ˜tψβ,pΰχ†xZd˜wS7Ώ?„3Ήκ́r/ψΓQ0ˆYΚ:Šύυ˜ό-Їυ»Ό ±, $Œ„—„ύuB@σ{w(€γΏΚ=W§QO9‘—€Β ƒ₯V§―ΐ/ΑοŠƒ }9Œ±ηDŸŽp\jΊiW₯μ–@ιR•œH„κQ H§Šp—sΗLαC£\…0Μ;εΗ[σsχ246Ν3aΫt ³tς2fΌ†l  Coldark-DarkRxΪ­YΛn5>“ΆP‘΄Ήˆ΄δBΣͺ΄”Jcρ ¨<ΦΕgμsމg<؞€ι‚@bΑ’%kx¨HHμΊ­T –Uχ©=·3žc{=―~Ίσω£η“Ξ'’ΏΏ|X>&ΡϊΞΑΣθΗ_ώxWOΚ§~όPόΊF¬MΜOTΏί«ίBr–Ν'ŽUλυ;UB9˜*:‹"ωΥϊΣ|.ϊk&=‘’€³μrδΎ_Ώ–¦8“νŸΥqœ/WυQ;-*f$ Θa"1oWΎώυ΅‡`ΟI°H`ŽyΆϋ<fσΞ—ψ—>υΰ·ϊψ¬H1_έόzΞδ’sΚΌ<ΰ­`0Κ–?ύsb‘X  ΈQ-/²DP–„g$#ϊǁ šί7ϋp<ΗOςΐΫiΔS†EδΘ`ŠΑL‹Σΰϟ_x(v-ϊ!r˜ΰΐƒ>²p\Jζœy¬Ύ§‘l›6 [ǏfϞœ>ΛC7Ώα€ƒ„B!Iφ\$€Όδ$Τωφ]~Οά0=S,0₯·Ϋ[)»%PšT΅O,Θ<Σ«¦0*Β}[˜~œ0=Β‡ΗΉ a˜/…··ώ>ζϋώkht§ΒΊΉΡLιΠAͺ˜ρΝHh0DarkNeonΣxΪ₯XMlάDήYV!‘m’Šh«&€$ΦΚ±ββp+$˜΅g‘ΆΗŒΗmVʁ  ¦¨εGͺψQ8 ¨\@‚φB$βΰΘ!‘Έ₯‡f:φϊoΖΫ›”Μ=ίχ~ζΝ{oΜtƟη!½xφEDΌΰβΔ#>ώ&ώV:κ¬ςτΗωτ‘:)LF“Έ.ςXφzss“ƒ₯₯%!MJFΓl”½=88ΰΠ(π"]&ΤΚ^wylN†&ρ%N[ψΌ'>’šΝΫήήζFψΨTΓƒ.2ΨΘGΩ<ΞΏβ»MF‘οΚX£―‘)΄siΏώς^c˜α 1’m5Ε„0XŠλ»ΧλpS™\Š=;{»Λ‡m΄M₯^θ"ŠΝάIΑ]:ό±dτCΟd!dXμ“Β€&#/AŠαΐɝ{ϋΦaΊ Ɉ½KΠΑ–a!Ÿ"2”‡ςέW SM‘œ2`ΗA6t$8ΈΠΏπCI‡n2φ’‘‘ –9„ΤDΉ°›ίOλ­8%4aλˆΨ±°€o:02ΜΗ―žžΚυ€Ίμ±rTkφφφͺ|ά›˜ρTyρ™ρˆά²¬ΒΊtnά¨’Ϊ­ _ν&Π°€ΏOH,E6Ϊπ³Iύ8ΰΉηT *±‹κώ0Χ!…& †ζI¨Ϋ£’ϋ F%G΅"Zzh@:ΐŒB:κSδc[…έψ›:Ο=RΙhSζώ»ύΩKqΥ›ΣӜ€Ιœ¦ΔφΞΦ3“ΗD)gl}τA«„£T¦(Ι‰ϊ―Ψ(α+°Ε}_)π4E&!‰€'40Ÿ&zιP֎=†άΩΏV·‹Ϊ‚ YŸ†:)—Ντ@›ΎΞδΌύώη»,Φφ¬Ξ¨hUD‹OœqLΑ_ΪήψŸΆκ’εt‘2Σ0MHν0Ί~<ο%m–’ϊqΎκ²Ό:ΡXGΠ*œ†£ 0»ό4/qίY…71‘/Ξ|*ψb†ηfgx§%θF=[%xαΩΌρώ#!ΐ^ –Ce8w~™7LR&ŸyϋLτ8&ƒΔ±(hj^hθ ίΛbR΄w'Ηeό!aμίqpψΟ'  Χmηϊhρk©κٚš|ψχ-Μ~―ζ’Lqœƒ n€ΌώΞι!IαεlΖΛWoς†Ύά“"ΚΧ]―}±ΚΑΚΚ Χξ―“E‚h½ a<±‡ΨΡφ•a˜•P`I­ς²)i’ΔΞ/πΞ=|&DraculaζxΪ΅X½5ίY6 „γNά…'„B€u‰Ώ BΊ& ςzΌ»fg<ƒΗ“Λ*tΤtΠSΠPΠ¦FΤ Ρ\€κŠ6o<;φΪγΉάέ;;Z~οΓο=?Ώΰκ όά˜δ^­ήοSž|ž9NO]·ο|Ό‚_―‚{Ÿά_©%Ε?Aύk ~‚‘ϊ~ς£UρKKDpxΈWΰ‚οŽΆ >­δύSΏΧz‘$Ž)—Νίρ=p9a[Υ3“‚ρYσο?OΏYΉe½ΡΘβ™Δ\"žΗT0¬ϋωΫ:ΰ;&<Β|–γ5πC~ΧΔƒΣa7$βu‘Θωz΅Gέ—«η,žD΄½Β…yίΐ”‘ 8<LRΔ”"dmςꧨا‘ƒπ¦ΣfD3‚SΊlίχ!MΰΠΝ[’ sMΓ ‘O–k{—ΏφDθM|9£SD"œeŒhδ=Θφ¬dqŽ…‘ηΡQWώΤi· ΛγD„Ίy^T&юϋΚ).Ψk: Ιεzχ‚―zΨ‘ ϋ¦‹8Ži–b›eΧΖ’Άΐ°aδK~¨QL.•A©ΒΠEπJυŒ©Δ(Εrή,˜ώφ€ ψŽ.ΉΜHΖα2Ϋ”Ψrqέ°X1Ν9‘,αΝΪϞ>κΪΝ]³F€—`U«0•EΑιΛm‹Οϊ†ΣΫ6‡` 1Ι%t}m©O„,OΣDΘM_”ώ썯‹U³nρΗ3[ΉΨȌ ίΞ sνuS–ΆρeωΣ¨—N;ΛΡπ–•a3=ŠΤ%„ρ8bλΒ£ZŽbγύWAQHSA –Τ`QΗb਩ο΅ΣͺhNd.( ™Ϊw,–θΛ,αϋz™ύ*O@ “ΌˆχbA#ρργ_:Ž|-ιC6<Τ,Ds8s[)₯ϊ!§kκF!Ζb‘§ΰ™ˆΆέ]Υ·u0ρT΄Ρ*‡ϊІSšΟZΰ?—ΰ;ΥΣμΘPΔ8drO Ζ¦Œ‡cΖΗSΡΜΕt₯QC’Ή§3²VA Χ*G·βΧ›ύΚ²β@‘B$λΝ:½{·#(nWΟ΄(69.βv ¬dκgs:c\ŚK‡Ό‘ y’ρZ=?μ₯εα…iœœœXzYy© ·SΪYο/Σ~ϋ¨ϋπQKζy~ίκ§»γ†dOζ« γωτR-Γ†^[/¨Χ9u±–Λ+gΠε|ςνΥkδ‘qρ’EζeμσFY-“»0οšΞΦβšž$Qh@ƒžr™„ƒτ•kœ€ΕΑέΆΨ^‰κχΊ qΔ2ωτω1*ΨΓδ˜{’Τμ,+₯TΥjΦ”Γ•‘οTvθ4‰²P„›JΜε—ί]*~hq{‰―Ρ© wέJϊP’ΉŒ£F…έ`‘“)ΪOˆot`%>ηΠ}iπ²­φΔς•£šue§θ2μΐGS γ–°1Σ>ΟP³;wΗα9ν ΛΖp¨žΉ|qvα„7,vbB GkXwήμ·£³Ύœjkƒ‹nž[U2JΦ T6xk6ψΈΩήυ²A«Φ“λ°ƒ‹BΓ†ΰyCΉNSϊjϊ½€ηͺ2aΉpv³ν˜1fwx―7ϊD΄§«w\}QY_CΙξ#fίΒ\Έ4žnmκ 4‡%h’³HΒeE@vzfέTΫΖzˆd=·wΟb›•¦tΡsƒšl€GitHubVxΪ΅V½nΤ@ΆοPAH ό$„Ρά9‰'@‚’†Ž νωφ|ΦΩ^g½›δ^ΡB‘:-AΕ#D”ij¨Μήy½±χφΗ)pαyΎΩofΏ™YΙ+―W}Νžίοχ ΏΰWωφηχΒ«_~qςΉόΗίΏύ<)Κ»vvV>― ½ζU}_Ο' J©ό}πε€;θP«β9AΣ=L†gˆ@Љη°ΟY–aBA€ΣœΒΪr_nsκF–7%Λb˜† †θάπΓχ™ƒŽ#LAΨs˜ε<–Ίw½λM ΣμβX‘šVDeΒ^Ο]H"8ˆœ3›l1›Ώήxό¦ŠΟ  ’ˆ€KαTBΊέEG·Ε“+/’Sr/ .TΜR#N·l©RΈ@Τ! U ΣϊV©φšφ˜Žyv’”ί#І½ †y^ΗΨΈ/«ΥΣΫ5rGCν(kDwkΛ²αk9Rvɝ;Y½)KxΟ!λ….!Bνp·Τu‚1fΐuιRNI”†ͺUGkuM|e31ΨHγϊ‹O6‚Λ G€ νg¦U΅ΖνC΄Ί±Εΰ>k£'Ι ”v>M8–Ζ‡^){}Bεf$@¦8.‰'EϋT(Η ™ω=΅m•Μ32›^΅N2oYf7Χ‹‘-ƒjΌDι.Œ#9…ό{ύ―θz”rυƒ£w6ψύΕΝC4ŠhώZχd½«&ουp†»pa˜(ne ”6οh•›ΊΆ )η7`υ›%&†I€j°J!ν0ΜΉΧ2SZpϋ¨Eϊ–}eΎZŽbޚ±³!4ŒυCUͺΤ"‚6S…§ ηΓM…ΚxUΊͺvύθ(ΫYCλ*ς‘‚”$$š7(ΦϊϊTΙͺ  "χΈZΖxLAˆ’ΆN7τνzγ`2w¦φSšΦ•`«£ΕlhL=₯³ΓKožν1Μ'(ŽΫRΉ«ίtΕ‹+‰VWωφ£mυ«υςF£‘iΑUΥŒžŸ1|Άσήr\ΌQΑ!™°ŒΟšΥZ₯ΏΗsδΗΗ…sΰ QšsMΦψίΚ9>>^Α»g+ηττtEͺ/~ι8τέ€Ό8CςυΟ―ͺΟ+ηΚW^_9?ψΙΟVΞ£GVgΏ’w~ώ­νί o6£;ώ~ΎΌ‚Z1JŠφλςΙ·Wj©ΛΝk^ΰ0™ΆίΎχΧB#t­*Ι /)ά€ŒύφΉ?όpβC…ψuQ<ς’iιMΡΐ £Βs3Œ2œϊ(ΟSl9ΰ q@ζaΟ/VxU”H‹Β=ηχΤΓ‘7ސq~WE~΄Υj΅2―ϋ-)Ϊ―2ΆΚ‹3šΥRŽRμE^Μ-–ΩZvς—€μ–c0 8gX,έΔ‹‘λG^ž Cΐ>@Œδ† ό Œx¬_ύέ¬Λ*¬[e&eβašJcά—-―e–ξ£7ολL²-Ρ’π¦Ά«qOf―€P—UpΆs‘!—Y–β’k‹zm¬εiΰˆςC“c5ς¬c‰ΟΎ$Ž%Yx₯ΙwαΪht ΩηE„‘”2Ÿ˜‚Ÿ°^/q .FStž΅½λλY½β ΄qΏyΝͺ….½j­έMΒ$$o{’]ζνOΟΝ’χ$`ΊQ“$%’CkIύόϊγθgBs’°XΟή~KγzλδNκw₯ώœ˜Ά}ς»η¨Rvs‡YΑAΠΦ…(™θΌrΗ^ϊ7E'―‡G΅BΊ."yΙrœ"Nm2@\pja₯0Ϊι^‡ \/a΄ι$οP—KKμ#χ,wQRΰzŒ14Δc BθšΡwX‘š `σj{]οŒ+ΆΝ HμeY•κ<‘&»|¦hςD–cB‚©²΅‘O„9zR"RεζO[Ir,¦€*ωΖ¬&ͺ–ϋόt2Aλ={Ώ˜h ~ΤΌvj‰φΟGuΓ"›e¦pRΘWŽΓHΆ*WΩUπ0φ–aΥΚ…Ε&@Λλ-[Θf7”…w εs±²σ7Σ%‘MΠ”`»ΪŒΖβ@ΰ5Ξ-UFc!κΔmΡ?H!– ‡‘ο—\lSΧ;Ο0c›θΆβξͺrΙ@uΤ²P …“°Ή “λBeGΆ*Ή¨2e'ΐΊV°k‡Υ<)»!Π³8Υf'ΓΚλΫi΄ζ’ξύμazFMm -ƒ₯ΉΓ.«5βRί›ΠH¨₯ Ϊ >Μz7EΊ=νή’Ζ(ΘΓqcϋ¬α€°]‰ΊαuB’œ;κ«Z‡ lCe%DoFΔžΓaΜ4+Θ=³ͺΝι/?5Γ@Νz#Κ―ς#.<œ°wΓȘ€ΔW ω<»l@“!ΎΪέςζώŒώςš h-9fZ†PΫΌ0tγ€%i=ΟCϋpΪ1e„λϋsΆΟvΗ>Έ§}μk|¦‘ρ] /‹™Ί’Ϋ— ‰K+{¨ΚΣ(C±ΚKS6΅Δ#Ÿ0&L¨WεX/<ΑΠJΤΡW n:χQ&1LCκ*–4KξίΈ‡ΥBΖΗC‹*γ΅6Χ`Κ1€#ˆ6@l:ι#‘TΫΌΖ°σΚ,ŒΌ‘€»­Κt†έ½Bn$@I7Fx”‡S‹Œ³₯ςΏ>GΪ:;ΩisΪٝ†u―΅Ί(χ½Œwηo―h8iGk;Έ/†λΤΞ¬PΣr. $)`Υ‰ϊ!Kœ­Α§YΈ‹°˜Φ½&WΟϊ;b°HdX6JΛͺ°;IεŠέRΠ›n½ξ*dΐή;8Žjμ=N]tp)­ϋΈa€W΅ΦiC2άX΅1Ÿν `~ΟΦG‹"φΝ3δ‡^4jΆ‡φεtήΖgέφΔΰn”[ΖcΡNο?ϋžξΠμ$Δ;ΧταaŽ=sΣΣW’ύΧPŸ©W­ͺ*3H‰a†F€φZJ]ΆboΡάΩk‘υεӍΉήbPΖρ’dήΡͺ‘y‹ώξΏί±i7˜d7 Ή0*ኧ‡Ϊ§_θ2Š ΰŽ ΅ΐηυΎ%>ήN¦ώ€ρ¦8έ§°‹σyORwξ_ΰ…!n…ν‘γ8‹’Π«‡b‚υ”š‡–zW‘5_ Ώυznσs€F˜4£U^`8* ϋrΠ5½αάC§…Iφˆ¦†šRš )a2wΑΟ"₯.CΛε¨"—Μ¬}N_d½’7Ruλ Ψ1Δ]½‹…χH‘–;©šώœΉœαp¨ξ8Z¬"εn©¦ΜΞ7λ_ο‰ήΣΠOβΊων™ k«ΣκίΆ:J-ΈίlόώΥƒ•³ϊκΓ=γ΅)‘\ˆ½bζΗ·λϋ”ϋ›­£ηΟ+›ΐΖ8*eΨΎΘ a§OךωθώFηγ2Œ ¨ςŠΔ‹Σ=ϋζIŠcΨ;σHϊ­gϋ#¦Ί=Θ‹.XpW"r?­:.)…Ι(JӌΗewε3θ šr¬9άΪVbSυt ɐ)΄΄3{Ε ¦ϋz™ϋ^ΧάΎ—CΉRί`Φι΄§Mƒe?sŸH9†Πλf―ΐIηhξ(:!ˆΏψΜ²Κ»^~Ϋ³μό?ϋύƒŒ?³‘Φυ·2+Λ63kii)³nέΊ•Y«««Yώζλ^οM!Υκ5εσβκFa1­^§—ήΙτ¨βšP‚°_½½χ 5€φU’pB¦NCH[ϋκZf€ο—αΐ~ |(αm ώ€ŒwΗ€—BΣ ž’OG·Lw—Έ^aλ#ΪΤΚ θzυφίγ$3 JNΰϊ•ˆxMX+*‘©+±E؞&Μ‘λρ;ϊω/†έΡfΑby!tά$I5πσίF`λ–šΉ9„Ω?’Π¨Έv긞VLf”b—²½)qh•q@²±3 aΝ₯¬?yΦ€’Ε,(π»ZγˆJ!€²]9L)pΊk)wg’ΖqDθ¬. γvΖ—›FΖΫmŽ%πuΗ’Ηξ•e5 ίβ…ΟHΰBi]Ά©­Œ~»€(ќ‡V_{$>\‹«AΎΨ―ΐš' /₯…¬C8n3ψ. ~Q\™Ώξ³N⇁γE.·œ³=Ν쉫™έΰ2 μ˜†ΑAΕKΑ)σ=ΆM>u΄}ΤμΝ)+ρ°‚€©n“Θ…I’@ڝ‘ζυmΗΌ’2ŸHΖ²’kW³©6eΤ²ΈΖάωR‘@8Bε·ά­X₯“ΉŽBα6νλρ-{Ι–2[Ύ@—₯GΗM’nρ]›πVΕU€vT)‰β$eω…Eό«E?uΦ·U›6&PX9"%eί,±c€κcΉ=a9ΘΫ”η:HQ ΪPΉ¬ΘML{Q ]tršItεσΑ¦ ‰O’4>¦Ι‘Σa—A6„ucΟas°[6ήΫςRr–0-VͺEAaͺ9Φ‘MΈχσΙκŒx΄Ξ˜cIš; ~Κ{ŸζΒ•žgI³« ΏΒΕXc0gίΎΚE9ή ΡΪ4bYΧΉa`9¦` ΜΣΈΓ!τXΙΦ:ΑιΞ½wcΤ‘-@˜ιΊΆσφ”Η–φjX@Y$eΖ¬2o²δ}“nO/7φtn’”@ΗCω’YwήM"ΌΨHIΞ₯4bRXζMΉ-ψ€Jβ;ίzΒ'λ<4υ4χɝ1^­Ξ7χΛe'2Ic¦™ΦΥbξΤš`„Άjhsμ’D³¦ϋ5pΡ²o[? 3ϊ!\N5μ•ο6 s,=‡Β5šΧUŸ­]Ασ―ž`sω\a dg/Σ©ύyφΜ\Μ‡KNΓpέαΌƒ!`R±z.cίΡβVηgξU†"K2¦f΄m½»yκ=’LΠWT8‘ˆ>΅ςI^-¦θ‰΅ή°¨–ϊΒ,Ρ-ΟAtz–θχ—ζ :3KτΣΥΕ9ˆ^œ%ϊφR’³³D_ΒCs½4KτρΫLD{₯(EYpλξ‘'ίέ£@ Ž–ΥΦΖ hʎ\Ic·œ)Iσζe2x.ιrh!ΐyνέSζέ2 "w’ΜͺΎεDΓ4‹6슸ŠL*κ„'‹v.vGsπx›―¬g>5]ΡΐΔ.KρΚΌ`ΩΆi)Ÿ7λ=@ ½ΘŽΓYξoή4δΖγf^Ν„e–²U©*ΙςT[»b>+qΔΘ8Έ}{ F§Lߜ:ΚΎ@Ό|ςp{ Rτiό”Υέužα ϊMή—WTψiθΨa™Ήnώ!Ε:Q…9>’ύ”ΦOmΝΩa)Τ‰‚LEdΝ€ ‰ΪLΕ“gΊ<ΘΗQσ\ΈpΑΐsDŽ₯”} ™ΜΓT;ω[OQ"±‡!3Ϋ+ήαΑ±ΖGΗτx5'κŽyτψT/΅<.iœι3rqS“ΦΡcϊͺθs―ΓμXiM2ΟCΞ¬θφMonokai Extended Light xΪ­[Mˆ$IΞ,Ϋ™•έωŸι™ιιξιΩυgv°²qΗ]DΑƒ"¨Έ"ρΰš•UΣω7‘‘Σ]β‚βΙ“ŒΒ‚0^ΦΓ‚^TO"–Uπκΰ‚²^φ΄ΰ €‘?U3}θͺ’β}ρβΕ{ί{ρ"ΛίτšΏσ,?αήgŽ0Θbο}ΞζΨ?Σ~=ƒx^M‚(OχΛoTώη>ϋΙΪψπaνO§QνΏύχίΧl$ύβ5ίοήyμ­ηΨϊŸί―ιηΪ?ώΒ§j;―ό¨φίψγΟjΟΑ½—©ΌμWgkw―mΧήύvjίΊΟΗΫW’S 2ά]έωZ­—:ΦΎ–ΑlΦϋκχφ B§ϋ©²‡²*FύΈω‹―ρ‘FόŒ,ž„Ω¬ gΐ³€‡A@ς”eŽ'<+OΝCF ݌'e‰ΟZq}wCΓI¬λ;) ˆ³QΧ²οϋXζ(ξΏώχU©ηˆΣ¬‘ς΅bO‰b^KYο»Ώ ²ΎΕ,Δ9!^Y˜‚ JΒ²μΞ~쀑`[`F `FώC β± λ˜λΌB™i•Eζ™„‘5ΖYyΫ βUΔGΉ­ϋSα™LrJ‘g»qEe“PžTŒ)œλZΊ.«’ΘΪ’Ω\gω.pdω‘Ν±Zyή±δ±'δΉ„·xα¦$ά­ΫB~ΌŒ0RRζSˆzhνuB ˜£’τξλg²fδ%XhγjϋZЍBΊΧA ¦0ƒμνŠhΗO”ξ ΤežΧ‰ίε,M‚8θξGiβi,p‘}Ω{Τ(Οdη8MΞ)Ύl1eΌχ<"žzُ]ΜΝ²·Δtγ6I*$GΞ’ζυ­Žc^I—“€ΝςπζΧ[&wVχ“$˜iϋ‘ί<+ΠhΗΒA!X`Šmט‘#s Ž‘`–0:';yΓ8"ͺ)Μλΰœ•q“4ο—³f` €+&ΐ¨"Ό„ΐΊ‹ΌΨΉ\^‘·Λ€“R^‰ΦωΒϋ΄XšΨIŐk|7L* ϊ—&·Z4άέN•½Στ¬"³Μϊ–½nNmŠš€̌Ά{\8tΒ!Η2Ρ<,Cωϋt¨»fTj©ΣiΟ.Νfci½Όη–iwΪΧaΡΜΓ,Nΐ$DΛb¨)$Fβ“‹6’.N˜[uΕbK$©04%Q§P π§<cT%  ιφ€CΥΕ(OΊ―₯Eλ¦X΄ ˆhdGeΉλ0ΆΜ"{Ϋ#YUΎζ0‹βXd՚―ΒΙVδ@xΡΒ•Άύ”=•iΝ\‹έN4«Xͺζ±Μζό€’–§λυK`)bš#Ɂx°ζ<­ ₯gσ‡(C¨*rΦ)Μuρακτ|8ψFQ‚*ΞΗΔ£δύΡ>μŽΖΞ„΅οŽΕ;»-έvŸΟΙ ΩLgΟΈ¨RΚ)θ™˜Όf6αΈσ°°ΎΫ§pmOjΆς¬K ?ΛΥk[0€‘υ,ΝB“6Ω½φ΅εςφzf πD«ΛΘΡ’”2ΩΚϊqζκφY³‘θ­φKδ¨–ΊrΌΌLY­` ²ˆdS%ϋ ƒΆ ΄$G °.kdfΡΧΏΤjζ?6LΛCΒEE“ΟΫκ&ύwJh’‹bαqΪ_ήΨ©ύϊγΧ·¬—ΠR–†xδΪ77’Ί€ΫžΩΓθ€Ϊ„t$’*Φ†νS‚i~w©ω_φuE2©`‚IρUΞA"?ΣΆβ•@–£”4-D$σ™ΏΎΌιžŠ’νν°Ξ†Ϋ‚+D9muεh ³q’η…ˆ₯KςΓA[’Wυ½{Ϋ*lͺ_Ž₯ α*\γʞu‚i ξ•Μ}ehξ(,IΨ<\fiK'šΗ‹ΥΜ½o!ε|I ŽH¬,‡{`yΰ`٘Ѵ D΄†«6lδ§EKΓ’;G?ς³ΈH7Οͺ°ZJ“`,?{Ω1…ΒΜr@Wή Q,a©*lο‚Δ/Ν*Μ"Θ|PάqΊ+™9%…ΪΫΞΈλŽCœ)Gjœ[·n90y_ub‡YηΊΪ†(γ²Ι΄ϋΫ+ήϊΪIˆν΅» σ$~@Ζτ£e“΅†Σι7ΐ΄hx£§E©υΜΪ ?„ΤbšΚi΄—:€χφή‹£9-η’χΟ§UμDΐΫ7άl½€ωΧΆ—”f‘„ΈšτΟ{ž΅(`dWzπkoεlbxLρΔ$hΝΒ1¬ εmFj†#‰ ώ?ΚδMonokai Extended Origin2 xΪΥ[OˆdGοΧ»Fe“ΜξfgfηοΞNb2Yμ7Έk<(ζ zβ‚γλΧΥέ΅ύώm½χv¦AAΑ‹GΡ‹ΔƒgΟbz ‘θAqρ":_ΥϋΣUυκ_wBφ0=CΧχ«―ΎίW΅ήv―ϊχΉ4Ig>ϊτy’}žΰ NΌλυχ\LΛ‘¦ριΚ ‘œqx―Ώώί…χΜΙρ~{Έπžδν# _όΔσšίzμמΧg?ψΞ‚ώέRΖg?σό’η_§τήΏΈρΛ^ουξ^OόΧόύώϊ؊QR΄_—χΏΌΠS=RζΑΙ€ύφΥΏ’ΛνVI^Iα'eŒΫuΏψΖΒ@~E&‚dR$Ρχ5τWeϊp ,ιi(—)bΊ\maχυ烀ΰ`-Ή\ΐ?XeSΘ ΝΟR2jΏώίΣdaWc^€„ £oφ¨HζσlI;ώσ€φ’M`5Έ˜ϋI#?Œ‚τuϋ"ψ‰ 4¨°Ρa]S03.“°ΐi"ah…qU˜Ÿ}Ĉ3οοί0‰dCΑEL\΅±§HP€ Λ (œλY_ΛΛ,KIΡ•E₯\gϊΖdϊΎΝ°jzް䡏Ι{ Š·Xα–D\ MvΊžƒΓαδAα₯Γ±`L5f·˜šΤ‘Œ 0λQX€AΡ֟`i΅ ‹’ „™Β2χοεi²#D\~™Β.ώ(-©‘νŽ/½τ;Cό ΏΫΗ=‹΄ ύ) Fœ/˜3D;γ€ΜΚ $!^,OΨ©q’#Β“3λwέβ|2αˆY–ο}KŽϊušς#œ€–ρ lŒ“Ρ'ƒ1ŽPCz_ΛGN©όΨ`ΘΗͺθυ/άvΆƒτ%!θΌπ§EωΓ Ηα‘=Κ°Υ’°/H»\0ο²Η›Δ@Ξ²ƒdΞžΤK2›Κ€Z;Ψ ³_kK"(’†dΙ½]8O;α@m'ЧΞη4¨‡fT*€Τρtd§fΣΡοZιΕsh½β@›}p―Q„†YZζk?»bˆA{šδ’@’IŸβΝͺIjώ0JΓ(( *Œ*…hέd‡‡„ψ‘4DyžR§2BM_Wd”έ‚€Qσ΅thέ6W„0α0„šΛσόΠΑΉ΄΄ζ.7vQT\Z{8”tH?/L΄ίŁφ[—ΟFG>„ξΣ.ϋΔo‚νŽ!`Ξ‘ιŽ(χU„Λπb€=ΤEψI”ƒH’N Ώ΄:\«τα˜Ε+3+Ηfβ1ήUbǜΟ€pΙδ‚ΞC”)c ½;†˜Ηpt"ΉTrυ°ΌδI=v3ΎkLΐӟκnΖ7JΛΡ3"Ϊ!~ƒ!U<ύŒfΟΦ2 ‡j ˆMŒ’&κ#9@·5@C―‡sͺ<ŽήRn겦€α6_­y°›,ΏΊΙδx"a±0¨ŸE¬rέb’“ϋu‹ΐΫ€ΆϋΘΓGyd’ρx½}jˆœ[2XΫΊ‘r8οYΦ©Γy"ΛΌΓΥHV λ“ν‰ΚO›Ψ.¦ƒ₯» Έζά΄%;‹RH΅5ρIYav©ΥΨ5M6ιλΊ†䭐ƒηιφήΥΰT9Πāx»Λ- ΨSȎKΎ’εΥ‡‹ψ\_шύί*\ά”(‹Ύy†BDƒΪ`WΠΎ:œ·ώΉ o»²sΧΜΝγ‘,§Χ~έtιrSαβI“ΙjV‰Γ&χ8,Ο\οCsl¬j9§΅π(=K,¦oh―L«βšgPžΣ Ω"λΉ;k!oς~=*γx^½!B52kΡ_ωχΛ†šθ2ΗΕd= χζR^/΅ šΥ}γκK݈’ΨV΄xΖl[ςςφ0Υ;;{9+ξϊ‘.ΠΏ{ΈΠν.Π?Ώ΅ΏН.ПΎΆ³ΠG»@ΏΉΏ½Πs] Ÿ£Ν5€>Φϊή—š€p=(ϊΏώι’H ΡV~LζΩ¦_5)άω@ Θϋ·εͺΔ7 ˆ³%ρο?•»<„¬‰ΩΕ„Ξw-WNl2ΓΊ’·άΐ™Έ°Ρ՟u"¨―Έq2σ!:DZ^ϊŽκ ρ–¬]g.Ÿ5 ‰ΎμxϊΌΨ5AΘΗ”ΩςΗ( !+αΌ~Ώ―ŸLY2«X—J»ΆŽ³π+/,Όγγγ…5=»cZ&ŠΒ}Nϋš…—ΥϊcCο₯’‰Β›ω_έ:Xx‹ŸμjeέδΪΊUΒ= ŒK’r€uΈG"‚βτΑrΟ?έXλhX⨀š+Ÿ’H~DΉβG’’f"’ΉΥo^W£]‘΄ΎyΡΙp_Pb˜9\Jθ»Σ(M3K—%δ§4B[nW φ[Ω*dͺ?Ž₯ψΰ [γɞu‚©κμ•Δ½ΧwδPV―M<νκHΣΡ|5qŸZΒi:Α0Κ s˜~εyW–ΛΌεγ«·Œͺ+€u.λMΉcl+Nordc xΪΝ[;“#I–΄Ίεq»Λ>˜έΩΗΜΞcwΨΫAp·?‹ό»(u—€žiuχuWΟΓ<‹‹ΰlL,π x؜q&>8ψCVWu«ͺΊ^-ΝΑ‘iI•_feeefe₯†γϋϋaVDΓ{όΝw‹ΔαήχCΌχcREq6όΫίq5 ή|ηŠ=}οοhψ'tŸ>ώσgW”Ž= ‡Ν£πTΏΤ ʌ~:¨_ιΛ/κΗί‘Ÿ—Y=ς.h ω/ρaΆ\β” ΓvωΌJCR!giαYœΖυ£B=DιΗW+bμnΛ3- JIVK\Δa;ξw?ϋ…όžJž t^‘9n~τΛΏXθ«τα($Έp’|…σΟΏώΤ‚σDΕΙΘ0ς…x‘%.<ξhΪQΤbάΪυΗδ2HΡa‚Κ²ψσ?όήB_C_’’ ‰'ΐ] †υ$ΧΙ_₯`TΠ“ΕΎβoiθγŒaΛ(c ‡}t@.s_‹|&“3;ŠSx Ž&}–σλIftӊeώΖ±gj₯Φ‘žpΟmp[.ϊRζεκ₯£fοy˜Ξκ4ΕI;πύ~m‘ ΫuΈΟ*}Mgrhξ)SΕ!BŠxZ<‘hžΚlδˆΣ3”ΔQ' ž£Dς^u¨sz !ΒyC–/ƒΤNΤ%Ζ)Ύ<‡PLΧ“YS 5ύΥω"=4 ΕΛ<+|­Λm9Ά'ΨmE"9Έ0Ϊ›ΏΦζΈ@Βfuι±€‹η©-Γ0“‚\,1Yε*ιΆ‰t“σΈΔ½ι’l‡«%7ω ]Uibώ§U,0Šβtμύ‘ΓΘ8q—b&Δά).V»ΖδφD*•Ζ‘lΌ-CL!Λ ]&ΘΙbϋ\XΝαΨ΅«Β΄Δ…θ~υΗOόuα‹Δ΅Sς%†1 ΔφŒξ–Lόa•‘•?eΙρΘY8iΞaΪIœ­ψn—`šdα©§VD•ΌΓ`ψ―ηΚ(κ–ΖM•8GVρPCΩΦ2NE*ΖΨΘωΐΖΉφΉqΚ>vm…!.Λ¬πάΒOμ^ΊŒGŽ%(Ax8ΖH™£i΅›±Λ,ŠgqΗ‘Ώε˜6d]ΰn˜aFA Ο τ’‰²jΪ—ήδfšZΩ ώ“T)#RόƒIο‡φδ S<f΄οS_—u[žPηψ"χt:­iT9Ν5Ί)­ί9!οyjΈ£ƒaV‰oyK!–ΞNvΫκ¬5‡₯‘Γ|Ύ Α‚,“`ŠJsžρeqψΕ2ρtVfΞ “A°gμ&½­ –€’szlΗΫ#υs»a6θžξ‘^¨5M-JΟΒΝ}•ž:|Θ ½k%[ϊi,1M‚<1:“θΉO^σjρ+ 1~Βς±Φ)šΔιd'Έ›™ΏεΌD$\ΰνr7!W:Ζ=Πϊžκέdœ0Œ€‘²Λ¬*B8Αορχϊ£dQaRE0Nέy7 xM< CIσ"cωAnΫYuX4"Uaq||ΰ)τρ±Iμ.ζ–Yπγγ'ΡWŒx cδ©ώG °t*κ£’Ηv A@V.ίπ„.Λ]Mœ QδrΒ A«θ‘β½-γ•hž»KdFτ”π ˆ¬˜ΐRΞβ QBΎCFήπͺ“hyϊ-ζΣ ”`ͺΎJΨΡƒΰDπ⾚½Q4²*ΫΧBŸΏNΚ‡1J&υ'“Φ²ϋθύΠΔ₯]Μu4σΒUR>šEί‘=3Ώ…(qe¬t,Y sΚώκί7ψ D&$x<£υΣ΅ξτΦ-oυTυ3‡œ’Š?ϋIήKΕοzΨ ΌPq#T} [ΥαΈV΅”hƒΈ―–ύ@eŸΥ-μ8ΐQtφH >τ¨H@ε€^ˆτŽδΐό€L‹f4Y*²e8¬½g·ΘϟC§lβπ_‘9Μ³§Š…Ά7,Σ*N C„›p '’]ΥΓ W¦Μ’θΨžSMη‘Ξ ₯iF˜JNΠθŽμ*4 φzσ~GΪԁ ΖAd,vΠs„š5ΰž…§΄R#ινη†ή~(εa»υM;+ρ€aEί¦ Ÿ8ά«nΑμΖ¦Ηλ ͞œhP;w΅₯I>•ωE$>z=/@‰Ÿ©¦ίž`Y’ηa#τ}sW‘5,Όέ»¨ΤF%Ψ‚i Ž ¦ΊUΈθ«Ÿc“2KwEWΟ.ˆ«‚ϊΡΪ₯‘β²uΰBΦ#›…‚Yd{Π•-(*^β›Œά.ƞΑ[―J¨†juΆ±G^ΐQΘΚ~γ%».=l,Θzϊΰ1Κ”ΰίοxzρeηι;;z―fžΜp Σaσoh½Ή½Ϋ‹€‰Χ '―Vέ«2»υRΝq˜lj”,7V…0˜έσΗ>z9ϋxνε*~!O[Ίο…΄0ΫΠξ|τ™€[Η[2³Ϊ}΅_ΎΆOΆΜ2…’ί·zOώ₯ΈΕ zΚoQiΗQΧP5γυu{$ΒΗKšί]+ώ«ŽψPϋ…£{½3P‹6-›šλϊψ‡š ΡΞ+Π7{σzνΪLΐlS‡υΚƒ‡ΝMΉ9Ϋ90+Ϋtοψ0ΩlEkp›Nε›ž|t³1δ€λιoΥy@hR? q’\σρή@Ξ€><·›£TZ©Y&ϊK’|\MΕαd §†™ ‡#C\j.ιE^D©‚|‘jGυ2zkېΑ5p|αΓ‘Z©ΐΟΠ?:ή`ΒΆs0PΓτ_§)Ž1Ϊο•Θ<Όύ¨΅+Ζ²νκΥp9ΤΒsξό’,²τ‘hέB•ˆ}+Ωώ‡Jh;MΔ²=6B½γι”ΦΨ0ΣFΧΚδˆ&)ΫωΫ«Y½E5W΅bο(ψuΡ_„8ΧΙj/`h<Π1P`{«h%»Σ½°ͺΊH·u½Κ»RTΣΛ—Ύι mίR€^@ΩuΧ£|ΠΥΖ•¦Φ τŽιoφΔεqd”sΨγΰ8κe:fTo‘m©@β-Ά£σέ…ύΨ†MΌp„*Ԝώ{LΘΙτΐΝ”FˆMXͺ‹ρ?™§Κ΄< m. ”–ΐ ŒˆΎa—@ͺο¬1s#ί—^|ΥΙΧώήΌ³Ÿt‰–‰λ‡!φœΥF]©JκŸBΥωXpŽŠTμQ·w#n›pQ]φ6μΦ xψ<Νhωb“ζ[ΏμΏ9|*γTp9 χ2z${#ΤE"ή“²χz*Sγζ:»¦ήζΓaͺ6ν$εNρ€l:B馄:ΖΞ8'ε}Cψ8)›BοΈέΓ‰zo*™Κ%φγύyΰžΰBE›n‹ώ‘_Θ”»6ύ!Β·œi½ς,A=eΏ&˜ϋ2 T(sŠ!ŠήꍈΝ~2τ–ŠΘg}Οθ²W]ζΒΉ vαΧ›mΎνϋ/ίpžΒ OneHalfDarksxΪΕW?o1Ο₯ZΪ QͺŽ ΤbB¨HH0 Ν›ΈρΩνkρ)ؐΩX˜HL| 0σ‚szηœΟ΅κΤwΏχ{οωχž_ΌωVςyLΡCHvξCΡχ¦{OέΌ6Ÿτ`ΈyGςmΙ(ΧίAˆξzίώyΧoάyo?|y7ooη―nΖoΎzσnδ=xτbΤJώƐ’y­ς'ϋLΊϊ, Uωγη>ΩQYϋP`Ψ!p(`ˆ`'’ΎΒŒζq(nώ>˜ςΗ_~Τ f ώόω/i،Άš:P¬†€j—'ό51 ιͺ£ƒ@ ½ Τr€EFœ3‘rΫα–6Πc‡Βχ΅§§,– K>RΪhW*Βͺ\ͺ¨!w ζ'Qω+>½¬9³Ε–8ΐυ²:S=-1Ι‘!©ΞhΫ!4©˜€έ‰#Μ`ΛEWCΘ9¦] ιOηp‘wΚtΩ’ΓeάΒωϊΛ°§Ο¨T*@£ μ7Μx&HΚ(:9Θ¬αdCΨR•naΧ¨~WΣJΡ‰– ΙνD mUθΩ¦₯ ·%€[]KW>VCγ Lqό51Ϊ0#‹EΉJD―εm¨sΖ"υsV_J=-³zο·l±]¨8!‰jl΅Ά€Ο§«B τTHΐ°MŠΙ³Ϊ|™§ΓHΰκγ–‘iŽΫσIH±‚δ°§Fμh=+ebS‚ ZίFζŠΒΈ~CάB™w/bΚE9cd‘πΨ…ϋpiβ∷ΛM:Ύβύœ¨z昞hur»Γ‚α4ds™,9ŸO»2+Όš™JΏεθumλΔΔ–4-‘«m °BG0}ΉΪ4λμκΒ/ڝ2QλU‰Ϊς!!ω™CXVϊRkνζχίs{j*²γNψ œχͺI_USςyΉ`‰ρ₯ž₯x­βJ«b­žε¬U“5ϋ|ΒΟζ5νbρ4ξ ɜ‹²[†J ΆlγτQΧUΨοAΪ-€›M/Ι€«EΤEΌ‘ΧW5Ο›¦Π·K$}Θog?7Θ¦ϋϊz &u!)e>Ɂ+™…Ž`}Tώύ›δΑ5ΣdΔςaράF.F"ŠCNΠψG½i'žώρ$ίƒ OneHalfLightLxΪΕW=OAΎE’   (‘PΩ1΅1Ζ¨•&&˜ΨΟνΎά 773ΜΜ[ώƒ–’ύΆ&jL,­hM,΄§¦Yηφ‹έΉύΊq‹›½Ω}ήηύ~g™Vt­3x†ιζ ιjηNΌω’³Υ'hu£‹ϋ«•x¬8ζυα‘sΑΣΐ9>>’»£££ 9Nfq&βΝπΝΓΓΓΐως3ZΡox‘˜Μiε―δ₯xuyΏL§ί| ΚQ‰ ;Xά¦€–Έ$Ϊτ™« g)dh@=»\zιγχήW ¦,ώτωŸWΟ μB l1^‘D3*θkc’λ0’°ν ­·(_.u*a6X3ΊόΔ@gs…¦³–$—b₯Κh Μͺά,聰PΞ·}§"—³ŽΈœ9βΊkςF p ¦ΕnͺΛ₯ΉΔh˜=σ%ajHz1%•„u§λ 8]Ξ”ΖL#ζχA·‘Ο&γ•qη™²”l›+J'ά±Š²—Δθ(°6ΞmϋΦ†,=&J$­ΤKBΔ++Š»ρ*†Ωΰγ°n=Ψ$Œ„·‘Π†™ΝΦ† IP+;m+’W,–=_ .`Ο€ΩJ΅vρ[eΆ]/ˆ‚‚€wJ{%―V›S― –θš…–ψbď)јž”Μ˜ΜƒkZΔBžXβ]D%™Jͺ.χιl\―!n&Ο»νs]GyΑ βΎtmα<7’ΓνωμvΤoΓύ”¨xdO΄8Ίέζή`²i‹Lε”Oμ–J €βHbήͺιIe¬#ž¨ΉHSv»’h8…θ[Ε’y{ΛhVZ.rԚ‹)Mc~f•ηZ`›r·χψNιΫΙ±ΘΞΪαηοE›Ύ¨4Ζδ]Κς ΙΘαπM\ΌT0zŠX‹Ο\₯U“4ϋτ€œœ«Œš‡‡ΩZ“μσK2e˜2&ΐɌzϋ}PΆζ΅g¦}ό›ϊΝΑn³Nόχλλ§Œθ j’¨{’α Ή―©ί ΅Δξ°]‚r±8™:Σo>5πa;fΌzˆP LΣΧΒ/ΣΠu.H$΄%οΛ ύP&ΰš%ΐ!ΑΕΩ Τ Ήa ρι Γob[Ώ½_AλY­Solarized (dark)ΉxΪ΅ZKoEχ&QKiΪ¦i’6Ν£-…¦υV*R%\ᆐ8w'λmvgΆ³»M 7*ˆ#Α1‚oΐ n|N|…ποΓ3γy9–j»Ωωύη~Μ8X4―Oi†Xϊ%Žο>Œ;z4^πγY0xόό,ψχŸΏΞ‚έίΟΦƒΏŸ==H―ΰβσΞΑ“O>ƒχΟIέ>ώ’}Ό4P–·ŸΫψζ9&Υΐ°l½ύΜq…Β˜F5_Œͺ”’~e³g` p‘ύ,+–’€zpϊ“tE… 'ψ€πΔnχ‚‘²B€ £1b(ͺ0 q‘χ€F—&:k*²³4κΧe/΅ΐίj?_QΡ(›νϊΰ»?,°λ ,<¬I$©ϋ—o‹ΰ3D’%³ύ|ώ΅ίΉΕžSχΏω™οzAAuΞuYτ’4/(« „ΤύΆδe!h»b4k‰˜P;VTxΘhn‚n(PZΑ3μΫέ1l‡ͺ!«AΗ)‰²:Ζ&ψΎ .mόφρ¨zΩStZ`†*Κ€j^€ΡΛ™«xCQY¦ ±₯3”₯ΥΜ.Δώꡇƒ•€έ²q0W0Ά¨0§qz˜bΦ―ϋώτΰ+ψ¦ΑQ’›dξœΤ’V“ άhαλσKν΄·4€jR((G¬οΚDZO&πžV8Κ€μigGG U~Gu…‡’μ-SΛ.ϋΦ…-€VεeSαjΠ•³;Ξ†FΡ ¦Τ.ϊ «§΅/ŒρaJιΧΉί0΄μ¨ ]YqΉT_~ΤDnLspΑpΑh„Λ’2O1oh4UbYQMj2΅·;uz§2°:r +'e‚ϋ…M­6νΌ*«―ω¦―ͺˆι–Š &U]ΣE/J”X[>Ÿ?‘p\噉σ»nψ')qU# “Yα·wwk“{Fη;^J e¬­h _RΛέ¦½i[Uκ„˜V)pK“‘B|αB”,;rYΰ(EΩBsLcOR]"MΙ+”₯³* α³3c$lτ ˜vΞ/k ₯χZΘP~˜Ύ YΝήtοٝJiώω`cf)‘ Œ!½¬3ςΏ«υ’&υpόΤ:xΑαΟΒތΦΔΨΎjΦG5Λ&G’Υ°j‚lΫ€Λhtdή³Ϋ„G°YyžPΛl"kZΎ%ΟȚeišQc†ώPφ`ŠZ„ΈkNqαρѐP2δ΄`b††‡yΨΘ»‹’ά­ΔΘs€o€[q˜T)"Sΐ©RƒQG¬’Φ Ό,ƒΎ§$›«εΥ#AxCοK―„–ꖁ^ΝΩΜpμ©Π{²tΊ^r‘6wίƒ^ͺ2g²Φ±’ΔuL‡­MF =(q£ϊQ{θΟ—u°x²WΊα’ΑcΊ§Β'Uγc#T¦Ρ 1~8ιfO] γ t]₯„Θδ?ρ…ΕΈPδ6ΝEχ5U±'(΄adςn)ΜdˆλnΫΝQΔθlOΓωά’?  rΏέX'«†IΥ-œt]ήΣDϊ\KތŠo΄Ο}―}`€TΨψ­©_μNλΠΐσQF1›ύV%Γ9}ε{I‚’8Vψ4υ{Ϊ\*τΗ!€Δ£PΤ†X2½j)[ eΘBλΐ—·‚•_J‡~7E'j3•JQ?Ž€Έ)ΗLcͺUγhάSst?ΝςŒ,—}BhWVŸΏηΨlΤ΅bˆΉ«b=…·†§›ϊͺ VyΌ£‡%˜ΐ~φΓwTψμ.nN)φZΆˆύMyεύ2’E(ΏΔΚCmήζKE©£W†F8Σ‡¬έ]4œCϋΜ‘#HaΦ‘Ί’;Χ?Œ°BΗή}ϋ./Φ»&bςόυΆm0+Γ‡ K e—ž„cΝf†‹ ΄qΖΓ£]pΦTY±ϋ Ά»s “ŒŽ@ 2Ϊa‘=E©ςιͺJΛΗ»b=)#ΚE‚ƒŸ” 3J‹°γΜ8l«žάΆ]sΐφFΡ°*ρ°5­,ά6Ai<Ρς`ιS{"Κh’FΠθγhάΰ†—‡ƒDέ›&σG{}ΣIp{Ηэ;iΚ»½>ώβΙ€ο?Lϊg|4ιψΑ{λύίίΉ?ιI―ώίώ6iίzρcσσgΝΟK=eyσyΆω i–aRφ ΛΦ›Ο —(ˆhXρΕ¨L(ιV~σόωdP œi>‹’%$ξ~=xώt^ Ηψ$χΔnw‚‘’D€ Βb(,1 p’w€Z—&:—T:dgIΨ­K½°ΐ_i>ƒUΡ0νzϋλ_,°5V$”ΤύΓΣή"ψ‘ΈBρl_|iΑ·nq„ΗΗ”EέΟ_}Οw=£ Zη:'zI’ε”•Bκ~[ς²΄]2š6DL¨+*8d43A7(-GΰφνΆCε€U γ„„ia|ί—6οόρ¨zΩStšc†JΚ€j–ƒΡ‹™«xCQQ$1±₯3”%εΜ.ΔO[n+-Ίeν``lPAF£δ0Α¬[χ)©Ύb€o,¦ ΊIζΦ©A-I9ʌ^›_j§½₯”γ\A9b}W&x2χ€ΔΡ@&eO;;:R¨„τ;¬J<eo˜ZvΩ·Κm!΅*/› ίsUƒf­,˜έq64Š^0₯ΆΡŸsX5­}A„’LΏΞ%ψš‘eG]hˊΛ₯Ίς£&r`šƒs†sFC\”yŠyY£©ˊͺS“©₯Έ¦Ψ©Υs0•U‘SX9)|ά-¬k΅iηuUY]Ν7νxAEL·T5©κ’.zQ¬ΔΪςιό £2KMœίpΓ‡8Nˆ«Yπ˜Μ Ώ½»»d0ΉgtΎα₯ΐPƚŠϊ%•άmΪ›ΆU₯NˆiΕ‘·4)ΐ'!Ξ5!ΰJΙ²#9” 4G4ς$Υ&„6DE^㇓χΤ΅0Jk*%DΖ§‘³™¦IN­χ’’%$M>₯•RέW ŸVΘ+rό>,œ qAz΄uohszΫqAδ ΫVX’aHοoxx’MξUUe'YΊψ˜κJRΆF-`Υ°3΄£“m{ξά­&Ψ•:‰”΅vŒ’G“ gCHΖ!{SΆΈŒϊŽ΄΅Θk’EchΌ―Tφω‰/ΘGΉ"·i.Ί₯©ŠAq  B“wKa&C\‡tΫFh†BFg{Ξη–όYh•ϋνΪ:i9ˆΛvαΌ  μς¦&ηZςzT|©}nyν#₯ ΒΪoMύb{ZWk$‡žr0ŠΩμ·*Ξθcί“ώW%(Š"…OS/±§Ν₯B@Jμ9 ΅AmˆΕΣ«–’±PŠ,΄|iq+X)έφ₯$QqθwSt’Z1ΣQ©υγHŠ›rΜΤ¦ΚP9Z€ΖM5Gw#Π,ΟΘrΩ'τ;veuω{ŽΝZ]+†˜» ΦSx«yΊ’― *m•ΗλzXŒ ΰ§7|G…Οξβζ”b―e‹Ψί”WήZ #Z„ςK¬<ΤζmΎδP”:z₯hˆS}ΘΪέeAΓ9΄Χ9‚δf™‘-ΊsύΓ+tμέ—±iΣρ"a½k"Φ*Ο_oΫ³2|¨°TΣYvιI8Φ¬gθ Cg<<ΪΥgM•»―`Ϋ;· NιΤ £ΪS”*Ÿͺ΄μqΌ+Φ“"€\$8ψIΘ ₯4ŠNσΟΆκΙMΫ5ln]+π’κQΣΚΒ5”Fc-&ή·'’”ΖI>>Ζ nxy8HΤν±Ήa2xΡ7M‘·Η36κS“’_΅šΤzI]Œ0Š„;ϋMΖΕ98ƒ 7ίΛƒ6 gˆA{ΑiO)˜Ω5­€‘FΒΖΎ§mepB ΜΔ­νRΆ>FŒˆυφ­We0fLΈl΄Χ;e_n)a_u΅£p7耋豒Fϊ}Oώ§s˜§ήΞ+Z/αˆZ’ϊ+&ΰ9½p·Πο/9rqƒ ˆ ~oGs‚·―–štŽ5E@Β “· Ώ'tΏλ7p”½SΥ?PΥ qE‚χ1Cω¨£" Q•ecΎ dU†Ρ슀yLΞΐw{QΡ\’x4}O…Bή΄'’φNS:ΖHRά|!/Tό…§6Tm6’ΥςΑC>ΐh לΊ%Rj!(,:提ΐ‘’)"―κ‘tψ. ξšΧ‰φP½uωŒ8:<Sublime Snazzy’xڝ”±NΓ0†“ (P Œ©y‘•‹›˜Δ8‘s)J‚΅ˆ‡aβi( ”cΔMLœTxˆ%ϋΎ»Λέ6{Ζr “±O|:€h:M s±xηζΩω7g³Gn n¨Λ½pyzXͺFωΎ™οv˜‚Όφ<λ©nΎΗΐuενΗΧS΄'CΡ‹&fΔ–vσω[Ύ―β>’n‚\, /?οίΡπ}•·=Đ ˜’§!x+λ<œ.έ­|Ÿ FΠΨΗe‹Άfάβτ.dŽΌζW#ήήΒBV.GFιƒmW1 hΕ>Ό~ v£­B1R‹’[ΆβXqΠΡ98©:Θ k*Ύ°3¨σΥΥω:¨Iζ:‘6*>΄Εθ+έ²"‘—Δaς›η¦’μΦdΘ­ͺEŸΐq]Aˆω'€ΏξΦύ—bΞβ$ŠBk‘ιϊ|!•ο΄ +ηΛΒRmwΤX•Ζ7Ώ'G »¬ΩζΠ ς‰Syˆ²ρiLŽZŽΆ‘oε^α4žαCTwoDarkκxΪΝYKoδ4Ÿ΄³/φΥέmΩ–ν–j©Δ.e‚\Š„„B‴]\8ΰ$ξŒ[ΗΞ:N§Γ~Nά_Έ‰3p_‰ g$nœ‚“8Ηc')νv;‡ρTώΏ?ν:ηzΕηΓ1}°=gCώύ€zqΊώ>H]Ώ ƒaφσ-δcšOΓ{ΞΧίώ˜:w_~=u|ž¦Ξζ«o€½ϊΗΩΪΪJ£ΤyσνϋΥξ{εΆN.Χ[rέ C7 „Cζξ$Δηˆ’Š%3’Χ›³H*ύφ†πž…lMQ&=™7€;ˆ ό§Ζν|βGiΟιΫΜοΛ•P5;m, rέƒ“1eK#Θ§¬#ϋΉ:{΅ύλΑγσZ˜«ύ?q"Ψζ-l‹rA|β‘™™΄θ<—δ*’\&ˆΑ^Kφγ$Š(γ•lΙ@Ρ©ƒΰ›ΏΣiΐuI—5I>qlS{ΝΰV#Γ³>‰ZΈ.ΞrU$ύτ¨!]Ο¨1¬ιh©ŽU½ΈψHtRAlŽh[‘Ε’6Αv,΄KF+ΊΎϋΉ‘ΰΞVJ"C[`—ͺV'1„—nNBβ^Khd6 DΔ7β0Τ£όε/“NVϊI 1~EχϋW; μFΠ8v–σš‘ٚJ 5ΐhƒσZΩτ΅(μ˜kΑιI. lɾ݌ς…ΠŽΉ¬6c 1τU΄nn‡†Όι-PβJ©NIδŽ D+΄[’ΚŽ†€Ζ°ΖΝfΨόΌ.WΈ;β!v3Ύ€ŽI2N―³ŽX‰π«c‘\¬* h;n,ATY%@Ο΅ΥD‘q€§νΘb¬3·Τ΅ΊbΖΓ0Rͺ«€Ήώ`e΄žΝψ—š—r ͺŒw„Š j[©΄΄£–oŒbήQγ₯:ηΓ„ς`z₯ŽِͺlΞφφvΪ «eΑX έ0θxΰhΝR™›έ֘ύ CΨup\ΤNY1>ŊϋΕ™ή†Ÿ²TΒƒ¨#οŠ^XΟ€Ÿ]`μƒjrleΏj¨b €. =ЊεπW]Qϊ#ŠAm°ωαώ»ŽUDφE·.ΒA5¬8/nΎ–:Œ?K[ΣXJπέƒSυƒΑ uώύβγ΄iKŒτZHΉ<ϊΐ.dI"€:Œ0ΜξLΊœμ.8#g^λβ˜&Μ‡ξnLΙ’Ϊc!ˆ’¬ZΔ±oΤ‹(ο]αM²„d-ΝΠ·λ]«υ6g‰¨έεεXaΐF+•Hi¬ΉνϜ€±έ$5ώgOŸK'™Ρ²μoΚu:'agϋ< x»hUθ”‘0g)‰΄ ½.©ޏӞ2ΪΥΥ»ΔκΓΤΧ ©q"n¬dQΝTυFPμ=oή+_‘bIvGρΩw&IΩ2Μ7Ίb2fΰŒ%Α -Vω#‚¦Χ|"Ξ5ι-ƒ Ώ)Ή˜‘P―«h. £ŠkͺkωeYnΌb8ZΥιΆΈa"$ypˆfΒl~ ωΆ ΊΫ’M¬,ι)α/Ψ &ΩΉωΔJτκLs{ FώZCS{˜ϊ{9ν²­«cd<-6τΓ†λjπ2œ‹#PP―™00λ₯UΗ» ŸI FLٍoΨb²wLΙ‚9Ÿ.Ϊ0zΪάΩGΚ†ώX[(7ά…rΉ’š!ΎΔI!Ύ7ŒQ‡d1J²FC!΄χκηqaJΎ]Ψ«rε ·Tα $`ΰA\—iθ?3Cε­ωMvΎΡΫe³·a4φΥeΏžρΩPX‹{ÎHcΔGƒ),νΖ‹zH”fhρώŒMMUΡμΝF\ι`μŠί$°oϋ ΓΧn}ρΊ;A~\~τŸŒΛΊEE SoWάJŸZtWΝ#­*ξbΛυΦKˆ†‹Ζ8Ν–ί1LΥ[NF3(ώ§γΓf§Ϊ>ΒΆΔ)1γΔ;½ό{:ωx…ηΟ=ωλ¦+ώ9<{ύΆήλπtU3LΈX™΄Š!»œημζŒ#Κ«ΏσψϋΜ <v%Visual Studio Dark+HxΪ½XΏoδDŽΓ HŽE@.°:~…•Ž ]Ðϊ­(`֞ΨsρΘρL.)8₯+θ(hr΄€ ‘€€@qεΡ€‚0Ο»φΨ3ρΨΞJw[¬Χžωή7σζ{ߌΧ¬,>š*_y[ͺ€ς+;Xμ]υ)Ϊφi€{έ;==ΝΌαp˜-~­――g+φΗΫ~σ@?}£|hw*%Οg3Β€nώΰΣλtrΑ.–γΒ‚βiLtϋΣΪp%έ9ΌΙE ›ωδη6Ψ– CCVKΰ]υ»6όš^.rΨυlXΨθ.%’/ώ9sμ‹tPίT’`μΗΰ}ηρ€εH§³ήΧ…4d:β•[&βV“ V­DΞu™’Ή ‹S4ΉJ€„¦Ζ]Ο­Ηj©$ϊ΅–nιRόγήX§¬ŠΞ†¬zΪ²&²ν΅Γ–mό™ν²ƒΰΪanTjŒφogέϋ;eϋ8¦YΛNΤΆ‰Bxρ1”’Σ,s|3‚H\ωεŠ—]»–9ey‘ΈJr › ΧΖΊaH±‡1TύF£QζTΙ ^³x\ψsm{±!—$ߌτ’θ½6‰5pΏ:Χ@λ¬Δ;::j£Ϋh C;ομΈ(ŸqSš07εΕ:₯ΔaΧ"Φ©jέΛ™ypcW©Α;Œ}«ΙΨ±AM•$γ<œ†|φΫ_m9~ΦTγB‹5•{<¨Δ•€Ν6\$+ wrr6—'ʌëJPDpPWdG&ΦLτ|}}θ1ΣΤ:$ŸA–IΌdξE1lω±=M»Φυχ?Z&μkέλΣ $%*ΰΦΖΎ$η°gΝz—dy‘KŸι”χCkošΧ>l1ς°W 6±sz»α΅:H(ΈJ^²xτQ]wƒ=Fdύ’ΟaKD_”™s6M²κTΙ “;νS{Ρ¬inίύh²hΚϋGΖχJρ xGӘϋ{Ή)«όΆ8~•Χ,σmςŸ χιωζΪEΗσ»:œσxόόΞ·ΩΒη(Ώά«C*ί•¬ΰ½Ώ·EKœΛfΚRbs /@ύo·,lŽσω­ϋǁ?:ΈhŽ3™LZβl™q(ϋ{ΛD*Οπ,¦•’ƒͺΧ«£·²sa―Φ°οΎx>μΈκυΥ°©/U”ansiΖxΪ΅VMsΣ0΄ΐ΄₯ f˜&3ܘFÙÉaΰRώ€locMdΙ•δ¦ωχ(±μΨͺe9|πϊCow½ϋφYh2*οξ~’―φζ/d9#Ύ-~€’ͺΕ/s―Ώ]άΕ)dζρoͺΝc»7Hd0hΉGΗ«Ο֎;–ξŽΦΖ"Λ€λ‘gΩ'kσ‚ΗΊ š ŽΈ§œξ/4·ΐΎ˜kΨn„LκΧ§{sβAέXkβP½Εœd€οwι˜|i_X›&XΒCA%ψΦΞ¬UEž ©kߘπν8HΕ!ΣIoM§™2σ…~cν#‘”D pN€iυΚ³½™x\:ΉΗŒ(5:"½^ΐϋ€ήζΤωsT½δ€—σ6?°Π)H¬rˆ)aέ­QMi!Ι ͺωPΧ*8έπ1υ¬*)_ωκσž<4αΊϊΜm /Sζν’–ΚΝ™jH–­†¦πڍϋ̸‰6©’"ώδ₯“δ@ΨUcIέ „zΡ³"mΊ–Ld³Η¦‰―ΩϋE·t:p.›J¨€Al&bΰ8ττ́ͺ―«pD‹§@3 Ώˆ]ε+Ηێ¦*θΥξ4P@†5u$Υ›ŒΚΟwΘπΛWο³ώϊ“”‚Δo7?bA²›Ÿκ{ΖΩνΝο0ΖDύό‹HυDiρ&@αMΘ+εΣώhγγV/Ό£ΖΟ·ΥksΊ/υψ‚@@ΡOA@‚…Ÿ³PΞjΘt5Œ-LS=†δ\ΥβY[ŠC―y ,ο2^*W=Δ2jΧ2κΨkΎDGJ˜š`op›γΠΓhuͺ4vκΣFψ“AšͺK.pŽΟι@μ;ΣΌς^@Xάω0 !EƒΗΆ„»ZύβΪEhU’κ@Xί; SφSN‘u.rη±ͺ?aJ"ŸPŠsXŸxOλ:φ•±b_ kΝ*›ΈO}+‚S!4iεΕΜEra(ρVΐβ"lς¬Ξ/Κ€Ϊ base16-256IxΪ΅XΛRΫ0$”w t¦₯ιΆžΆ3eΡe»μtΥώΐ}‰5‘%#Λ@ώΎr,[±d§S²@ΑΦ9χ©#)ήή ψ|‡?ίNΏ|½υ>ιG0N(Hό6ύ ’NͺSΞ§Ώƒcυψ‘κ₯ω› o¬@^Ž,ΎνΦ>ήiωΒ;«=Ύ._›Συx‘ΗfύΔ(Qψw $ᬂŒWΓΠΒ4Φcΐγ™X¦]ι1ΙΩ3Θ ψ!ήFV_ ΄Žtd!{η&K₯ lnσδ½\fdπΆ?ΈΑU±~ιƒ°4ͺnλŸm=2Ξ°'δD \>rϊ7ŒmY`―υ¨Z’Θ₯ΟTUΦΦ…‰9Π£* ψο3"¬MT.Ώ4K.dΕν[ή(‚ˆ?Έν pβ)…jβΔι‘αI@!΅v_›1'ΰM @.εm9Cά«'Ά %=±oMσΚ{A~ηΓ4€ Ϋn»FhQτσkk’UIΚauο$LΩO8…ƹȝDzώ„=(}B)ΞαωΔ{\Υ±«Œ%ΓLπ²Ζ¬’‰»Τ·$1@½‘V^L\$η‰oυϋζa“gu~ω   gruvbox-dark!xΪ΅\͏GŸΩ˜8qΗ±ΧϋαμΨ$f<ν$DIX8 \Έ#Τ53½ΫγώΨέE Dœ8ΐDˆ$NHΐ Eβ€Δ…ό œΈ‚Δςκ«§«Ί^Uχ:lδΝn½_½zυΎκΥλoŽψΧΌ¨ƒόt²Ώ8z0Ω:‰β:}0~MόύΛEμg“o8IV“ύEU-ΛƒGζq΅¨/ΜΣG0 !ε#σ`όΟόζ½ρώώώΩψ—}οlόΕwή:˜ρo78ή₯IλkQ₯ΙδΫΚ―&“ΐζE^gΡ4Μ“Ό8˜|ϊυ€ώχm όλ,˜½Ύ­uιGQœΝ&―Ώ±A γjε=ύ2φΐG€π‹kύυ‚ΒΣ!`WΕηYδEδεK œ7‘ί{Ι³‘`Ο‹ί[A€DΆ°™}ζΒς#Ό₯V ‚SIž7ΫkΤtZ‚@C˜uγ†:UΕΞΨ`#―΄G‚«ΣΈ"θ{ο―Ρ0–uV5σO^I¨/¬pq*Œ9G?'>[Shκ|‘”Ώ‡O5Ϋ'm˜Ιntdi()$ ¨φφ €6_`4/uΧ»2‹³˜ύˆ0i£>Yΐ†–KŸ:;΅”8e4›χM%ΰ…~’$!Q3І‹ΡψΒBύ‚*NOθ76َyΈgΪξΏώρηgk ΐ4X"±ˆL,*C'θN‰‰F’pb£/k£i‚½mτ1ΛΕ2ΚCϊΡέ·«•„£!0x^ )ΤώσγՎ‘%@©ιjŒrΪЌVΰΡΩρ&Χψr£ΎΝ “£ηgYΞΙ@Ÿg3BΚ°ˆ—•KΎ F˜ψeι–-Ιπtiτ”#„yVV>μiβgσšœ›\†/XιP«2μͺγΉ¨β ΎƒΕCΆDΩnhώύρ£3%§ΛB·EγX:δΪ15†μ“€‰"ΉόXeœΟZζ”S”δψ<φα¬$€QIΚζ[ZςΓ?Ό{Άφ_Ί½Κ½>,nΑͺ²ͺΘo–δ'7tγ•ΙΚ!Ί₯U’‘#\Hd1+6|c$Ιη1œ"Όε mΤ/]Ÿ"'›5Θ.…ϊ/Σ²^.σ’ςft#©ΣΈ ]vΝs `;Ÿ{ ?EΉWr&jεΘcΖ)“ΞΒ?E'œXθβ,LκˆXήλAoa{’m€Τ” ςίl>β‚›%FS7-’ &ΆR_{σl­VΊšmš•ZjάΖ"[!¨θr΅š“,ΒΣaG©YΫψΟ/ί9[Ÿ1Ο£σ™‘—Vθ$]¦’ξ¨'kβΜ•«—θF »Θκr™+d΅…ͺ3(<θΣΘ–K-Ξ²О}Ο$ ζ΄nš‘ΛUδΙ9±»9°‚]9Frέ(f…-8θbK…^Ρl₯a& σˆL Hΐ¨υΐšOβ_X’Έ‹ͺ‡Α¦ή49’uΪ‰‘έ2‘- zόŽ‰ζA>ΥsnQ-„#μλ³28%Y–zχΉΙ ΊŸ΄ΏͺΧ8gω§^Y)MΡjJ»υS ·2δ—šϊUβ` ‘šΈŒ`μ¨ `Ωτ1δ+PΨMόΒͺP/IΉ]Š Š??pΡ—κ"2Ζ³Ž y:•aΝε΄Z9αΤv¨zFΣ(L nu΅%χEΩΥQ · KΧ…–-ˆRD«2π«­"=ΐIσΊZΦνΔΥͺΣ›8PΩ>]Ύ‹-%Ά—±@ΫzΝ9λ޳_O=rΔAΧ–<ΔŒ6=ΣHΗ‚μ ‡)ΨM³‚EyώαΊiuμ/υ5!πφFυϋ?8[―LŸΔ䙀ώυπ'ΫπN‘UΈ.ρhQΛΓεΩGΛn„@i›«kO©δsβiB‹ιΰΏΔΑŒ0ωz€΅‘ηη먁jσϋͺαΪΒλ’9hŽχϋϋgλ‚ζd]yδU]œ™Š=9_1ξΜΘ‘ ¦δΪɌY³kΊp™zΧmΨXΫΖ¨Ψ₯³-ζ‘σ±Ζΰωΐͺͺά–}_ΣuH–;›ωুtΧ"‘ίpθGΫΉΆnΣμ u2Q^½€ t‘ΧλΫšlXβ„C׍Σβ\GνΜ³Ο|τBI²γζI›¨χ}Y«ΐΐŸπXηΔ&5ϋ₯€ΙXuε–IΑš6qMA°~kkc{:ι%!ύΖπ8‰“(τέm΄šq`Γ/©Γ-#±~ΏšR&ξ¦fI'›\OSgΔΤ[―k‡+ΈM–χμjdιΤE`HΘΪ’uIΠΆ]ω”œή7αͺ5+qΠh±:εcΧΧ΄Ϋv#²!-™<Ηψ­©Z|ζvπ 2Ωgz8ΚΦCƒ _—Ι~ŸΉJRGΉ½j±ίΓH4vυαΚ†εΰlΛ„Φ‡ ‘cNsksžj›φΣ‘ΖC“ΧσtΝϊάδ}£3(α20κYαFΩ±£Ψ χΝ}4)O σλ½lΚσ ’χς<™²4<νxi^“8Ί*nŠtš¦o΅½Κ―tΛπ›ϊΨ5ΆŒgΪΓΫυZ{OŽς4-+ηc<Ϋ©\π–RugpδPt`δW>¦Fβ9κt—Ϋπy\ΗΕzϋω ³Ξ‰;԰ƜTŸ?lτ–JŽrPf›yμ•ϊxwΙ₯ϋ.ƒ]»Œ­ο;Ψwξ=»ΒΩ.€γΎ[YΏί8ȏ[);טmΚrAοSΧKΨΣ΅Ϋ”Δ£1~RλڈΎΌώαHǜ8ΐ±<~ ƒνQ§ρMά[––@}ΓΈpEt˜ευ•ΌΉOfΓΝΐΑpεu]'ˆό<Šg³f}‰ϋwΖ»Xƒ@5+ςt:‹[υϋ]ίΔn]8ϋ%ΔmŒ―*WaμMŽKDΜ~„~‘Γ{ΪS#₯θZεα”^ΔΠYj­ΞUs‘₯§§γOό([nΏΫνޜjd_ς`Pχz@ΡΞϋuΏ#g2ζl°CJΪeΏ7Φ.Ε[FηSikλ(ˆΈ ―€rωμJV#Άn¨%^œwέ΅CC΅©γy–ϊ+2Pβ«*1TR Y9κM.Ο£ͺρ|‘ΐ?ZDk'Ύvy λ"Y=9Œ’{9`Άp˜ςqν·2Πs³»›|0κ•·f‡©3ζ#:vζ⨬ƒ$NIž(aΤΖ.T—œU˜y]ΡV2ŠΦS·qvΔ›ΫzΪ‘4Ϊ‘Ε=BfΠϋy’Ÿτ&—‰Κ‚œΗθΌfš‘μ΅€l.aPœδΗ£½oΠΩΌΊ7Ϊϋ&‰iή>”>,h˜ΎMh’,G{σͺZ”O<˜Ρj^O‚(Oΐ€„”$Π½αW>xτ“αύ—“ασψdψ―όρ`†ΪxηG­―y•&£΅_F“0:˜yΕγ(Oςβιθ Σ'dNΏl T}χφŸωΧEΗ4›=½σξβXγΞk ;,(δχή}Ιγe°†kp+ˆN5—θ¬όΜςŒ`c^”ŸΜ‡ΔΤ§ωΫϊΑΰ‚A"ύάΰšό-€Υ2xV‡% ΐG€π‹Λύ &E¦?@ΐ.ΙΟ²<Κ‹8Θ8/#Ώ2’gλ‚½*οQΉ…Νr–α “°šœJρ|³-±FMΗ%4‚Yobά0§S£ ’ΩίlδΕφHpυ4₯AΧΨ{­†±¨³¨ͺΉ JΒ|a…‹ScΜ;ϊωٚΒPηs₯ϊ=„|¦ΑΨ>Γlvc"+CIΓβUΒή€ƒΤfsŒζυξ:`W¦4£όG„IυΡ6΄\„Μ‘Έ©•Δ£Ω¬οh& ³ˆ$ ‰›Q,\ †g7κΧtqRΏ±ΙΆνΓΫvλ띬,Σ`…Δ#2q¨όU“ ;%&E"ŠΎ`Œfi6vΣκcσEœGμ£{Λ­V Ž…8@ΒlΰU-€0ϋΟ—ΫV–₯f«±ΚiΓ0Z‰Ηf?šZγϊB4#\ŽA˜eΉ }žN )£‚.*Ÿ|5Œ( Λ2Ψ/[’ιΰŒ'DyVV!μif³š²œ›\…/XΩP§2μθγ…¨hίΑβ![bl74>Όv‚ηe[&ΓR±pσ<‰qσΨ΄1Ξ‚΄ hN|ΞQ1ψίL?$WI3πY‹œqŠ’ά‘Ÿ‡!œu' iTD‘ςω£––|ψρwOVώΛ΄W΅ΧϋeΓ-XUVyL“όθͺiΌ*YΩG·τœN2π„ …,gΕ†οbŒ$ωŒΒ)"X,!ΡFύω)s²qQƒμR¨„*--λΕ"/ͺ`Κ6’I1₯eδ³k‘Ϋω,˜‡)Κ½–31Γ(giΒ| χF¬΄ΰ£ΤάWΓγ~£FqΛIΉ¨gkyLšrιΜΓctΒ‘ƒŽfQRΗΔΙπnzΫ#c#•¦Tf³qL a–ύuΣ΄Tˆ‚˜Έ:H}:xρd₯V¦šέ΄+΅ΈƒEΎBPΠεj9>$YŒ§Γž4°Άα_ίΈ}²:1bžΗδ3#G>­0I”!ϊLΕ4άAOΦδ™ *WG>13Œv‘Χε2_Θj ΥdPzΠ‘-WFœε ]χž)Μi]·C—Λt’'§Δξζΐv δΙ«˜]ΰΘ’‹+zΣ°•†Q˜0Κc2. cΦk>nˆ0ω…#‰;§{lκ›6G΄J;1²6²EΑŽίτδ…žsΛ2h!a_ŸέΑ)ρΐ±Τ«ΈΟΕH^3ύ€{ψ%sΈΑ‘<˟ρxe­4Ε"¨-ν6O5<άͺg]jVI8ρ…k5όΓc[_Ο¦!_ΒnN…Ίf%bτ)‚,ώ4ώΐGg]ͺΘΟ"8&διX…5ŸΣΦhΥ„cΧ‘κ%C£0-ΈΡQΤv–άeΗD±dά>,SZΆ K­ΚIXEhιNšΧΥ’n'NΎ‰•νΣεΉι±£Δφ†5[o8gΓsφλ©Gž8θΫ’ϋX˜1¦ηιY[α0»nW°8Oΐ?\±­ŽeM}Ν'ϋx{£?ϊω/OV+3'±y&₯=ΐϋ›- x§Θ*WB—ΔŒ¨εακμcd7R ΄ΝUгާUςρ8aΕtπίβaΖ ˜b=ΚΪΠσσΤ@ω†}ΥpeαuΡ4‡ΛκβΙͺ`‡9Y_yΙ”tg¦‚’'η‹ΦxTΑ–\ϋ"™5kφ-Γt>SοΊ k[ΏtvΕ^ΓX{>°ͺ*weί—MRεΞfΰ―ΎϊΜα Pϊ5έ΅Lθ7<ϊΡφCΎ­»iw&™,―žEP:&šƒ•EΜΘ  β’ές’3Η”ΟκάQ4|±"E.κΚίςœ‚9•Π ’YkIbΎΩ |žLΌc¨½--ΥΞ‡Ί:N”%ˍy!'_E !ύβ}”τΰ˜ ήmΟ ”5Ψ[U-Κ£tX,ΩόPΗΝ3^d€‘Θ›ž‚Μ Ί>π •n}°gVΪΫn7b¬Δ}΅c–Te«$•gYΎ V70 εmλ,κΙγ|‘{ ¨υζxNέ»v|€ν°₯Ήε2vΛEtτϋR0π\\» Ν*Œ­ςΡ:~1`½~%όbήS)Luκl¨Eiύν>JΡ;Ι`Ά±–†Ε„V8ŠqA€’CLW[‡¨€`\ήΆoDR |PB³lW.λ 6œόdZ› MY λΕ[Λ™¨Ϊ=γζ³½ΪmDτœιm9AνσŸa=Χ?tία)·άXPg4\ Τ΄6‰Ζ 9 γn€ΖΫs΅c€aΎ‘¦±HŽ2χαϋ}!pdZεvΏz†5”b€ΫnF4¨Ώ}’ κU Ρ‡Ϋ βΧπμΠγ'0θ`ό’ »¬sR„GD Χκ;uθ=ͺ›XΛ.ΎcτψQ`ΰN6€w<»˜δс>‡8’υT¨„–•Η¦6pΚ‘›96δΰ%f{ΛZίi6aœ­βο|λ7 σΥnDg3ww,σ^u¬6ΗNΧρ»ΙyΥΑέ•?^0»€―™\Θ”ΗXδΝΗΫΌυ(ϊ -Ζn€U*c«(:»6]„ŽvU'Υϝε‚D4LΖ’m‹RWΠοΤ=ΜΫ"υuΖ ΅eί*!Υ Ο’eβ0VζBξ²Ξ!λΎ…kΊ˜mΐήςμX²λΫ¨7’΅Χ§υΨΖ6~]Ω`8k/`™8HλJktpηJ Έb3œυψΆ•ϊΊο]— Νe \†΄π{ΥBPκBH}Β¬Χ· ΩπΔ =†§εΉ†ΖνΜ³Ο|μBœ’υΏΧu y–oLΰΤHσPχίΜ“ƒ))ΟΡτψ:²`gPΌΣƒΝu’^oΌυVnOνz>I²νηɘ¨χ}Y«ΐΑŸσXηΕ_OjξK›pκΚ ›‚5mↂ`ύΦΞΖυtλBφM<ΰqD“8 ύm΄†q`ΓΟλΓ#±~ΏšQ&ώ¦fE§š\SoΔ4[―G(ΈK–wέjδθΤE`HΘΚ’MI°Ά]υ”œΩ7α«5kqΠj±&εΖni§νFT]CZry  ˆ[S½ψ,μΰ%d²/φp”­‡Φ2|S&{}ζ*Iηξ όΫύqδ~cHχ{ ±ΨΥ‡«`=,g·lh}ΨΨvzζ΄χxρ6η±ΡΈι><4y½HלΟMΎe•b%\ŽF=-ό(Ϋn—αΎiΈζΑ!νId~³—M{~Aρ^ž&SV†g/νk’ηB_ΕM“NΓΜ­vWω΅nqSΒ»Ζ–ρR{x»^λξΙў¦εε|l‚—Ϋ#΅ qβΑRͺξ žŠ ŒΓ*ΔT ΓȚxž:έ…6|AžΥ΄XmΏ8aΦ92c‡ΦΈ“κσΰ‡‹ήQΙΡΚόq³€Ώ’Γο/Ήtίe°γ–±σ}{ήύaGzC˜§"ΫπάwkλΧϊΧςγNΚΞ5f›²œ³ϋΤΥvAν6%ωhL˜Τ¦6b†‡/―821G^ˆF¬5žΈ†Αφ¨Σψ&ο-KG Ύj]Έ&:ΜςϊJήή'³αg` Αευ]'Θό<¦Σi3„½ΔΗΧ':ぎ_¬A šy:žV½Ζ}Χ7rΫcΞ} ±‰ρUε:Œ»ιΓs‰h‚ΉΠ―uxβOΫ`j€]«<³‹£ K­ΣI«sΥ^dιιιΔ?Ϊ–»―Ζv:E4§ZY—<ΤέP¬σ~ΥΑοΙ™¬9쐖vΉοKgωV§ΑιΔ FΪΪ: "/hε+ |~»’5ΘΧ[7Τ’@/N»nƒΪ£‘ΖΤt–ε…ωŠ ”ψ’N •HVz“«3ΐ„SUs:›'μMhΜU„³žώs‰κ"Y>?Œ–{y`nα0ε³:le §fv7ω `τ+o7ΜSgάGtμΜΗQYOš’„?QΒ/¨­]¨>9λ0³Ίb­d ­§ nαμΘ7·υ΄#e ¬"£vώ„Μ χ#ς$?κM•99>€θ‚fš‘ό΅€|>aXPHΫώŒƒ‰φL]rΜ’εb@ΕNε32.HU«›(φn6Ώs9k*nbσ5-M•S%#qΉηαώσO|9κ$•ε¬ΐ¨ ΫΑ²wuΚεο btkty±Φλ ϊέ'?λαΕωΎ")Ÿ!X@NΫ6·"z^\2©Κ S£ΫPοχŽςtΑ£ΎνN\zB«ΧGιΠn7₯B΅Φ€Ιί#ΓD0Σu0Ό‰lΛ‰Ζl΅‘πtΆέr"%«7ˆ“ƒΏEΞίB£Μή£EN½RD“³½6Υ³ν±υ”˜I©ΚmœίφΣdξ‡n·™mΟќy“x#^ulu-cxφŽ‚{zenburnΛxΪ­XKlάD^‡Š"(4…–¦/pVB°£πΌ†ˆ $DsBp#ΜΪ³›!φ؏³YNAA‰‚ •Β)=τ Uβ„*AJ(›Η".pCt™ρΪή±Χ3³‘ΨCœ]ί7{ώλ`­y‘FL‰5“~ lΟΔΤΗ`ΫΣ. rmH\Ϋ\άΔόK£cΏx˜Ψo€i`ΏJa'yφ< }ϋ°gPμCB¬έέݞ555Υ³ΊέnϚœœμՊŸώΫDneeεΛμηW²Χeρτ™ιマΛ_―mφΤ¨ΗΣg‡Εα€51ΑΙΏ!E! EΝ‘·―’a<š>ηQ§PlQΞ…nΰδ²o^ΊΘ)Əθ•*Y8 Ί=‡ŠBθ 2ΪΪψυ5§+Θ"δ$Oδ7λ"7Η¬――ΰ˜(ˆ)׃ƍΞ0Εφκ#D«θ[S‘Ρ"<QΔœ”Jΰ1έƒyʐˆAΒ€3)tΨmΠη2A’P ¬Šςέ™?Ε€₯Šζα‚ˆΙB0ΙaέU]z―F%’σQΤ’ZΣ‰Œ%Γ€r7eζrW#Š•ξγeχ”δ­΅ξΆfΩ{JpΣ2eυ$λ6{5Λ29iR JΣͺš¦v—‘€ΉiŠg–Β|FO%~*}ςŠΕ¬“jg#f<Χ‘rȝξUM*œ­Ά’"θΆ)ο'ζ:eΎ1Cρ€š MίbΥL S_"Ζκ-Χt±/w€QΘ€ζΌ··Wα„ΜˆCΕ8ΠχžVP‚¨γ7ϋ₯‰—@Σ xχ#­z`9‡»‹n­Ίa-ΎίθSe_Ύ'ƒ-X'DΖzIeΣ]œΦLάiάdn«χΟM¨HΗƒQ’4”Šλ₯ε M²WπθLZ]Ε eŽΆœΦ[Δ©i§΄³¨‚~,}O/.Ύ’₯;μJ ¬σΡ΅¨°LΒ[[[[ΒΥ^ro–ψύ©d„•‹‡›dιŒ¦ͺΑŸ©Ζ3ΡŒΰ!_僃ƒό³οΕξΎ’­|ΚiΪ$7 CαS£ΘΉ)~PΕ5' ω8uG,γ©Πρλ+ΗzΖ†>PhŽΟσάΛMψυ&–Zπ 4½xQϊkBΕΖ‚"Χ;Χ>4q⒐π(&ɍQ.ώΡ­ί8˜ͺΨ‡t>Ε1Qq†-Έ*ΧHIσP‘ΖEbΙ}€dΉ? hΏ½RΤBKƒέχF0­Ω4«ΒH˜QH;u~ΧΔ›JaϊκέY αSϊή€eζ©υΆšωL₯ͺωυHi ώιϋ-Ολ΅T‘κΏψ‹ΉάευΩΡα1α=JΔ^’3pΦM?fHXΦΛ°#•—ŽσΉpkڐR~βwεL3΅.ΡKΕrΌ ›όOΊ¬QΊ(‡τΛ#—Σ_l ϋΘ£MJ ΄!%R…XΏoΥ4DOκ‹_μ}³ό\ν•­ςNTj׊™θ"‚Hn"ε&ΤV"J₯K₯[Ά°ρ?Ε«^zbat-0.25.0/build/application.rs000064400000000000000000000053521046102023000144330ustar 00000000000000use std::{env, fs, path::PathBuf}; use crate::util::render_template; /// Generate manpage and shell completions for the bat application. pub fn gen_man_and_comp() -> anyhow::Result<()> { println!("cargo:rerun-if-changed=assets/manual/"); println!("cargo:rerun-if-changed=assets/completions/"); println!("cargo:rerun-if-env-changed=PROJECT_NAME"); println!("cargo:rerun-if-env-changed=PROJECT_EXECUTABLE"); println!("cargo:rerun-if-env-changed=CARGO_PKG_VERSION"); println!("cargo:rerun-if-env-changed=BAT_ASSETS_GEN_DIR"); // Read environment variables. let project_name = env::var("PROJECT_NAME").unwrap_or("bat".into()); let executable_name = env::var("PROJECT_EXECUTABLE").unwrap_or(project_name.clone()); let executable_name_uppercase = executable_name.to_uppercase(); let project_version = env::var("CARGO_PKG_VERSION")?; let variables = [ ("PROJECT_NAME", project_name), ("PROJECT_EXECUTABLE", executable_name), ("PROJECT_EXECUTABLE_UPPERCASE", executable_name_uppercase), ("PROJECT_VERSION", project_version), ] .into_iter() .collect(); let Some(out_dir) = env::var_os("BAT_ASSETS_GEN_DIR") .or_else(|| env::var_os("OUT_DIR")) .map(PathBuf::from) else { anyhow::bail!("BAT_ASSETS_GEN_DIR or OUT_DIR should be set for build.rs"); }; fs::create_dir_all(out_dir.join("assets/manual")).unwrap(); fs::create_dir_all(out_dir.join("assets/completions")).unwrap(); render_template( &variables, "assets/manual/bat.1.in", out_dir.join("assets/manual/bat.1"), )?; render_template( &variables, "assets/completions/bat.bash.in", out_dir.join("assets/completions/bat.bash"), )?; render_template( &variables, "assets/completions/bat.fish.in", out_dir.join("assets/completions/bat.fish"), )?; render_template( &variables, "assets/completions/_bat.ps1.in", out_dir.join("assets/completions/_bat.ps1"), )?; render_template( &variables, "assets/completions/bat.zsh.in", out_dir.join("assets/completions/bat.zsh"), )?; println!( "cargo:rustc-env=BAT_GENERATED_COMPLETION_BASH={}", out_dir.join("assets/completions/bat.bash").display() ); println!( "cargo:rustc-env=BAT_GENERATED_COMPLETION_FISH={}", out_dir.join("assets/completions/bat.fish").display() ); println!( "cargo:rustc-env=BAT_GENERATED_COMPLETION_PS1={}", out_dir.join("assets/completions/_bat.ps1").display() ); println!( "cargo:rustc-env=BAT_GENERATED_COMPLETION_ZSH={}", out_dir.join("assets/completions/bat.zsh").display() ); Ok(()) } bat-0.25.0/build/main.rs000064400000000000000000000006571046102023000130570ustar 00000000000000#[cfg(feature = "application")] mod application; mod syntax_mapping; mod util; fn main() -> anyhow::Result<()> { // only watch manually-designated files // see: https://doc.rust-lang.org/cargo/reference/build-scripts.html#rerun-if-changed println!("cargo:rerun-if-changed=build/"); syntax_mapping::build_static_mappings()?; #[cfg(feature = "application")] application::gen_man_and_comp()?; Ok(()) } bat-0.25.0/build/syntax_mapping.rs000064400000000000000000000220341046102023000151650ustar 00000000000000use std::{ convert::Infallible, env, fs, path::{Path, PathBuf}, str::FromStr, }; use anyhow::{anyhow, bail}; use indexmap::IndexMap; use itertools::Itertools; use once_cell::sync::Lazy; use regex::Regex; use serde_derive::Deserialize; use serde_with::DeserializeFromStr; use walkdir::WalkDir; /// Known mapping targets. /// /// Corresponds to `syntax_mapping::MappingTarget`. #[allow(clippy::enum_variant_names)] #[derive(Clone, Debug, Eq, PartialEq, Hash, DeserializeFromStr)] pub enum MappingTarget { MapTo(String), MapToUnknown, MapExtensionToUnknown, } impl FromStr for MappingTarget { type Err = Infallible; fn from_str(s: &str) -> Result { match s { "MappingTarget::MapToUnknown" => Ok(Self::MapToUnknown), "MappingTarget::MapExtensionToUnknown" => Ok(Self::MapExtensionToUnknown), syntax => Ok(Self::MapTo(syntax.into())), } } } impl MappingTarget { fn codegen(&self) -> String { match self { Self::MapTo(syntax) => format!(r###"MappingTarget::MapTo(r#"{syntax}"#)"###), Self::MapToUnknown => "MappingTarget::MapToUnknown".into(), Self::MapExtensionToUnknown => "MappingTarget::MapExtensionToUnknown".into(), } } } #[derive(Clone, Debug, PartialEq, Eq, Hash, DeserializeFromStr)] /// A single matcher. /// /// Codegen converts this into a `Lazy>`. struct Matcher(Vec); /// Parse a matcher. /// /// Note that this implementation is rather strict: it will greedily interpret /// every valid environment variable replacement as such, then immediately /// hard-error if it finds a '$' anywhere in the remaining text segments. /// /// The reason for this strictness is I currently cannot think of a valid reason /// why you would ever need '$' as plaintext in a glob pattern. Therefore any /// such occurrences are likely human errors. /// /// If we later discover some edge cases, it's okay to make it more permissive. /// /// Revision history: /// - 2024-02-20: allow `{` and `}` (glob brace expansion) impl FromStr for Matcher { type Err = anyhow::Error; fn from_str(s: &str) -> Result { use MatcherSegment as Seg; static VAR_REGEX: Lazy = Lazy::new(|| Regex::new(r"\$\{([\w\d_]+)\}").unwrap()); let mut segments = vec![]; let mut text_start = 0; for capture in VAR_REGEX.captures_iter(s) { let match_0 = capture.get(0).unwrap(); // text before this var let text_end = match_0.start(); segments.push(Seg::Text(s[text_start..text_end].into())); text_start = match_0.end(); // this var segments.push(Seg::Env(capture.get(1).unwrap().as_str().into())); } // possible trailing text segments.push(Seg::Text(s[text_start..].into())); // cleanup empty text segments let non_empty_segments = segments .into_iter() .filter(|seg| seg.text().map(|t| !t.is_empty()).unwrap_or(true)) .collect_vec(); // sanity check if non_empty_segments .windows(2) .any(|segs| segs[0].is_text() && segs[1].is_text()) { unreachable!("Parsed into consecutive text segments: {non_empty_segments:?}"); } // guard empty case if non_empty_segments.is_empty() { bail!(r#"Parsed an empty matcher: "{s}""#); } // guard variable syntax leftover fragments if non_empty_segments .iter() .filter_map(Seg::text) .any(|t| t.contains('$')) { bail!(r#"Invalid matcher: "{s}""#); } Ok(Self(non_empty_segments)) } } impl Matcher { fn codegen(&self) -> String { match self.0.len() { 0 => unreachable!("0-length matcher should never be created"), // if-let guard would be ideal here // see: https://github.com/rust-lang/rust/issues/51114 1 if self.0[0].is_text() => { let s = self.0[0].text().unwrap(); format!(r###"Lazy::new(|| Some(build_matcher_fixed(r#"{s}"#)))"###) } // parser logic ensures that this case can only happen when there are dynamic segments _ => { let segs = self.0.iter().map(MatcherSegment::codegen).join(", "); format!(r###"Lazy::new(|| build_matcher_dynamic(&[{segs}]))"###) } } } } /// A segment in a matcher. /// /// Corresponds to `syntax_mapping::MatcherSegment`. #[derive(Debug, Clone, PartialEq, Eq, Hash)] enum MatcherSegment { Text(String), Env(String), } #[allow(dead_code)] impl MatcherSegment { fn is_text(&self) -> bool { matches!(self, Self::Text(_)) } fn is_env(&self) -> bool { matches!(self, Self::Env(_)) } fn text(&self) -> Option<&str> { match self { Self::Text(t) => Some(t), Self::Env(_) => None, } } fn env(&self) -> Option<&str> { match self { Self::Text(_) => None, Self::Env(t) => Some(t), } } fn codegen(&self) -> String { match self { Self::Text(s) => format!(r###"MatcherSegment::Text(r#"{s}"#)"###), Self::Env(s) => format!(r###"MatcherSegment::Env(r#"{s}"#)"###), } } } /// A struct that models a single .toml file in /src/syntax_mapping/builtins/. #[derive(Clone, Debug, Deserialize)] struct MappingDefModel { mappings: IndexMap>, } impl MappingDefModel { fn into_mapping_list(self) -> MappingList { let list = self .mappings .into_iter() .flat_map(|(target, matchers)| { matchers .into_iter() .map(|matcher| (matcher, target.clone())) .collect::>() }) .collect(); MappingList(list) } } #[derive(Clone, Debug)] struct MappingList(Vec<(Matcher, MappingTarget)>); impl MappingList { fn codegen(&self) -> String { let array_items: Vec<_> = self .0 .iter() .map(|(matcher, target)| { format!("({m}, {t})", m = matcher.codegen(), t = target.codegen()) }) .collect(); let len = array_items.len(); format!( "/// Generated by build script from /src/syntax_mapping/builtins/.\n\ pub(crate) static BUILTIN_MAPPINGS: [(Lazy>, MappingTarget); {len}] = [\n{items}\n];", items = array_items.join(",\n") ) } } /// Get the list of paths to all mapping definition files that should be /// included for the current target platform. fn get_def_paths() -> anyhow::Result> { let source_subdirs = [ "common", #[cfg(target_family = "unix")] "unix-family", #[cfg(any( target_os = "freebsd", target_os = "netbsd", target_os = "openbsd", target_os = "macos" ))] "bsd-family", #[cfg(target_os = "linux")] "linux", #[cfg(target_os = "macos")] "macos", #[cfg(target_os = "windows")] "windows", ]; let mut toml_paths = vec![]; for subdir in source_subdirs { let wd = WalkDir::new(Path::new("src/syntax_mapping/builtins").join(subdir)); let paths = wd .into_iter() .filter_map_ok(|entry| { let path = entry.path(); (path.is_file() && path.extension().map(|ext| ext == "toml").unwrap_or(false)) .then(|| path.to_owned()) }) .collect::, _>>()?; toml_paths.extend(paths); } toml_paths.sort_by_key(|path| { path.file_name() .expect("file name should not terminate in ..") .to_owned() }); Ok(toml_paths) } fn read_all_mappings() -> anyhow::Result { let mut all_mappings = vec![]; for path in get_def_paths()? { let toml_string = fs::read_to_string(path)?; let mappings = toml::from_str::(&toml_string)?.into_mapping_list(); all_mappings.extend(mappings.0); } let duplicates = all_mappings .iter() .duplicates_by(|(matcher, _)| matcher) .collect_vec(); if !duplicates.is_empty() { bail!("Rules with duplicate matchers found: {duplicates:?}"); } Ok(MappingList(all_mappings)) } /// Build the static syntax mappings defined in /src/syntax_mapping/builtins/ /// into a .rs source file, which is to be inserted with `include!`. pub fn build_static_mappings() -> anyhow::Result<()> { println!("cargo:rerun-if-changed=src/syntax_mapping/builtins/"); let mappings = read_all_mappings()?; let codegen_path = Path::new(&env::var_os("OUT_DIR").ok_or(anyhow!("OUT_DIR is unset"))?) .join("codegen_static_syntax_mappings.rs"); fs::write(codegen_path, mappings.codegen())?; Ok(()) } bat-0.25.0/build/util.rs000064400000000000000000000010641046102023000131010ustar 00000000000000#![allow(dead_code)] use std::{collections::HashMap, fs, path::Path}; /// Generates a file from a template. pub fn render_template( variables: &HashMap<&str, String>, in_file: &str, out_file: impl AsRef, ) -> anyhow::Result<()> { let mut content = fs::read_to_string(in_file)?; for (variable_name, value) in variables { // Replace {{variable_name}} by the value let pattern = format!("{{{{{variable_name}}}}}"); content = content.replace(&pattern, value); } fs::write(out_file, content)?; Ok(()) } bat-0.25.0/diagnostics/.gitattributes000064400000000000000000000000241046102023000156540ustar 00000000000000* linguist-vendored bat-0.25.0/diagnostics/info.sh000075500000000000000000000142341046102023000142630ustar 00000000000000#!/usr/bin/env bash _modules=('system' 'bat' 'bat_config' 'bat_wrapper' 'bat_wrapper_function' 'tool') _modules_consented=() set -o pipefail export LC_ALL=C export LANG=C BAT="bat" if ! command -v bat &>/dev/null; then if command -v batcat &> /dev/null; then BAT="batcat" else tput setaf 1 printf "%s\n%s\n" \ "Unable to find a bat executable on your PATH." \ "Please ensure that 'bat' exists and is not named something else." tput sgr0 exit 1 fi fi # ----------------------------------------------------------------------------- # Modules: # ----------------------------------------------------------------------------- _bat_:description() { _collects "Version information for 'bat'." _collects "Custom syntaxes and themes for 'bat'." } _bat_config_:description() { _collects "The environment variables used by 'bat'." _collects "The 'bat' configuration file." } _bat_wrapper_:description() { _collects "Any wrapper script used by 'bat'." } _bat_wrapper_function_:description() { _collects "The wrapper function surrounding 'bat' (if applicable)." } _system_:description() { _collects "Operating system name." _collects "Operating system version." } _tool_:description() { _collects "Version information for 'less'." } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _bat_:run() { _out "$BAT" --version _out env | grep '^BAT_\|^PAGER=' local cache_dir cache_dir="$($BAT --cache-dir)" if [[ -f "${cache_dir}/syntaxes.bin" ]]; then _print_command "$BAT" "--list-languages" echo "Found custom syntax set." fi if [[ -f "${cache_dir}/themes.bin" ]]; then _print_command "$BAT" "--list-themes" echo "Found custom theme set." fi } _bat_config_:run() { if [[ -f "$("$BAT" --config-file)" ]]; then _out_fence cat "$("$BAT" --config-file)" fi } _bat_wrapper_:run() { _bat_wrapper_:detect_wrapper() { local bat="$1" if file "$(command -v "${bat}")" | grep "text executable" &> /dev/null; then _out_fence cat "$(command -v "${bat}")" return fi printf "\nNo wrapper script for '%s'.\n" "${bat}" } _bat_wrapper_:detect_wrapper bat if [[ "$BAT" != "bat" ]]; then _bat_wrapper_:detect_wrapper "$BAT" fi } _bat_wrapper_function_:run() { _bat_wrapper_function_:detect_wrapper() { local command="$1" case "$("$SHELL" --version | head -n 1)" in *fish*) if "$SHELL" --login -i -c "type ${command}" 2>&1 | grep 'function' &> /dev/null; then _out_fence "$SHELL" --login -i -c "functions ${command}" return fi ;; *bash* | *zsh*) local type type="$("$SHELL" --login -i -c "type ${command}" 2>&1)" if grep 'function' <<< "$type" &> /dev/null; then _out_fence "$SHELL" --login -i -c "declare -f ${command}" return elif grep 'alias' <<< "$type" &> /dev/null; then _out_fence "$SHELL" --login -i -c "type ${command}" return fi ;; *) echo "Unable to determine if a wrapper function for '${command}' is set." return ;; esac printf "\nNo wrapper function for '%s'.\n" "${command}" } _bat_wrapper_function_:detect_wrapper bat _bat_wrapper_function_:detect_wrapper cat if [[ "$BAT" != "bat" ]]; then _bat_wrapper_function_:detect_wrapper "$BAT" fi } _system_:run() { _out uname -srm if command -v "sw_vers" &> /dev/null; then _out sw_vers; fi if command -v "lsb_release" &> /dev/null; then _out lsb_release -a; fi } _tool_:run() { _out less --version | head -n1 } # ----------------------------------------------------------------------------- # Functions: # ----------------------------------------------------------------------------- _print_command() { printf '\n**$' 1>&2 printf ' %s' "$@" 1>&2 printf '**\n' 1>&2 } _out() { _print_command "$@" "$@" 2>&1 | sed 's/$/ /' } _out_fence() { _print_command "$@" printf '```\n' 1>&2 "$@" 2>&1 printf '```\n' 1>&2 } _tput() { tput "$@" 1>&2 2> /dev/null } _collects() { printf " - %s\n" "$1" 1>&2 } _ask_module() { _tput clear _tput cup 0 0 cat 1>&2 << EOF -------------------------------------------------------------------------------- This script runs some harmless commands to collect information about your system and bat configuration. It will give you a small preview of the commands that will be run, and ask consent before running them. Once completed, it will output a small report that you can review and copy into the issue description. -------------------------------------------------------------------------------- EOF # Print description. _tput setaf 3 printf "The following data will be collected:\n" 1>&2 _tput sgr0 "_$1_:description" _tput sgr0 # Print preview. _tput setaf 3 printf "\nThe following commands will be run:\n" 1>&2 _tput sgr0 declare -f "_$1_:run" \ | sed 's/^ *//; s/;$//' \ | grep '^_out[^ ]* ' \ | sed 's/^_out[^ ]* //' \ | sed "s/\"\$BAT\"/$BAT/" 1>&2 # Prompt printf "\n" 1>&2 local response while true; do _tput cup "$(($( tput lines || echo 22) - 2))" _tput el read -er -p "Collect $(sed 's/_/ /' <<< "$1") data? [Y/n] " response case "$response" in Y | y | yes | '') return 0 ;; N | n | no) return 1 ;; *) continue ;; esac done } _run_module() { local module="$1" printf "%s\n%s\n" "$module" "$(printf "%${#module}s" | tr ' ' '-')" "_$1_:run" } # ----------------------------------------------------------------------------- # Functions: # ----------------------------------------------------------------------------- # Tell the user if their executable isn't named "bat". if [[ "$BAT" != "bat" ]] && [[ "$1" != '-y' ]]; then trap '_tput rmcup; exit 1' INT _tput smcup _tput clear _tput cup 0 0 _tput setaf 1 printf "The %s executable on your system is named '%s'.\n%s\n" "bat" "$BAT" \ "If your issue is related to installation, please check that this isn't the issue." _tput sgr0 printf "Press any key to continue...\n" read -rsn1 _tput rmcup fi # Ask for consent. if [[ "$1" == '-y' ]]; then _modules_consented=("${_modules[@]}") else trap '_tput rmcup; exit 1' INT _tput smcup for _module in "${_modules[@]}"; do if _ask_module "$_module"; then _modules_consented+=("$_module") fi done _tput rmcup fi # Collect information. for _module in "${_modules_consented[@]}"; do _run_module "$_module" 2>&1 printf "\n" done bat-0.25.0/doc/README-ja.md000064400000000000000000000625301046102023000131000ustar 00000000000000

bat - a cat clone with wings
Build Status license Version info
γ‚·γƒ³γ‚Ώγƒƒγ‚―γ‚Ήγƒγ‚€γƒ©γ‚€γƒˆγ¨Gitとγι€£ζΊζ©Ÿθƒ½δ»˜γγ cat(1) クローン。

η‰ΉεΎ΄ β€’ 使い方 β€’ γ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ« β€’ γ‚«γ‚Ήγ‚Ώγƒžγ‚€γ‚Ί β€’ γƒ—γƒ­γ‚Έγ‚§γ‚―γƒˆγη›ζ¨™γ¨ζ—’存γι‘žδΌΌγ—γŸOSS
[English] [δΈ­ζ–‡] [ζ—₯本θͺž] [ν•œκ΅­μ–΄] [Русский]

### γ‚·γƒ³γ‚Ώγƒƒγ‚―γ‚Ήγƒγ‚€γƒ©γ‚€γƒˆ `bat` は倚くγγƒ—γƒ­γ‚°γƒ©γƒŸγƒ³γ‚°θ¨€θͺžγ‚„γƒžγƒΌγ‚―をップ言θͺžγ γ‚·γƒ³γ‚Ώγƒƒγ‚―γ‚Ήγƒγ‚€γƒ©γ‚€γƒˆγ«ε―ΎεΏœγ—γ¦γ„γΎγ™: ![Syntax highlighting example](https://imgur.com/rGsdnDe.png) ### Gitγη΅±εˆ `bat` は `git` γ¨γ‚‚ι€£ζΊγ—γ¦γŠγ‚Šγ€ε·εˆ†γ‚’θ‘¨ηΎγ™γ‚‹θ¨˜ε·γŒθ‘¨η€Ίγ•γ‚ŒγΎγ™ οΌˆε›³γε·¦η«―οΌ‰: ![Git integration example](https://i.imgur.com/2lSW4RE.png) ### 印刷できγͺい文字γθ‘¨η€Ί `-A`/`--show-all` γ‚ͺプションを぀けることで 印刷できγͺγ„ζ–‡ε­—γ‚’ε―θ¦–εŒ–γ§γγΎγ™: ![Non-printable character example](https://i.imgur.com/WndGp9H.png) ### θ‡ͺε‹•γƒšγƒΌγ‚Έγƒ³γ‚° ε‡ΊεŠ›γŒ1぀γη”»ι’γ«ε―Ύγ—γ¦ε€§γγ™γŽγ‚‹ε ΄εˆγ€`bat` はθ‡ͺθΊ«γε‡ΊεŠ›γ‚’γƒšγƒΌγ‚Έγƒ£γƒΌ(δΎ‹γˆγ° `less`) にパむプで繋げます。 ### フゑむルγι€£η΅ あγͺγŸγ―γ•γ‚‰γ«γƒ•γ‚‘γ‚€γƒ«γ‚’ι€£η΅γ•γ›γ‚‹γŸγ‚γ«δ½Ώγ†γ“γ¨γ‚‚ε―θƒ½γ§γ™:wink:。 `bat` γ―ιžε―Ύθ©±εž‹γγ‚ΏγƒΌγƒŸγƒŠγƒ«γ‚’ζ€œε‡Ίγ™γ‚‹γ¨(すγͺわけ他γγƒ—γƒ­γ‚»γ‚Ήγ«γƒ‘γ‚€γƒ—γ—γŸγ‚Šγƒ•γ‚‘γ‚€γƒ«ε‡ΊεŠ›γ—γ¦γ„γ‚‹γ¨)、 `bat` は `cat` γεŒε…¨δΊ’ζ›γ¨γ—γ¦ζŒ―γ‚‹θˆžγ„γ€ プレーンγͺフゑむルを葨瀺します。 ## 使い方 ε˜δΈ€γγƒ•γ‚‘γ‚€γƒ«γ‚’θ‘¨η€Ίγ•γ›γŸγ„ε ΄εˆ ```bash > bat README.md ``` 耇数γγƒ•γ‚‘γ‚€γƒ«γ‚’δΈ€εΊ¦γ«θ‘¨η€Ίγ•γ›γŸγ„ε ΄εˆ ```bash > bat src/*.rs ``` 標準ε…₯εŠ›γ‹γ‚‰θ‡ͺε‹•ηš„γ«ζ§‹ζ–‡γ‚’ζ±Ίεšγ•γ›γŸγ„ε ΄εˆ(γƒγ‚€γƒ©γ‚€γƒˆγ•γ‚Œγ‚‹γγ―、 γŸγ„γ¦γ„γ― `#!/bin/sh` γγ‚ˆγ†γͺγ‚·γƒγƒ³γ‚’εˆ©η”¨γ—γ¦γ€ フゑむルγδΈ€θ‘Œη›γ‹γ‚‰ζ§‹ζ–‡γ‚’ζ±Ίεšγ§γγ‚‹ε ΄εˆγγΏγ§γ™) ```bash > curl -s https://sh.rustup.rs | bat ``` 標準ε…₯εŠ›γ‹γ‚‰ζ˜Žη€Ίηš„γ«θ¨€θͺžγ‚’ζŒ‡εšγ—γŸγ„ε ΄εˆ ```bash > yaml2json .travis.yml | json_pp | bat -l json ``` η©Ίη™½ζ–‡ε­—γ‚’ε―θ¦–εŒ–γ•γ›γŸγ„ε ΄εˆ: ```bash > bat -A /etc/hosts ``` `cat` γδ»£γ‚γ‚Šγ« `bat` γ‚’δ½Ώη”¨γ™γ‚‹ιš›γδΎ‹: ```bash bat > note.md # quickly create a new file bat header.md content.md footer.md > document.md bat -n main.rs # show line numbers (only) bat f - g # output 'f', then stdin, then 'g'. ``` ### δ»–γγƒ„ールとγη΅±εˆ #### `fzf` [`fzf`](https://github.com/junegunn/fzf) γγƒ—レビγƒ₯ーウィンドウに `bat` を使用できます。 そγε ΄εˆγ€`bat` だ`--color=always` γ‚ͺγƒ—γ‚·γƒ§γƒ³γ‚’η”¨γ„γ¦γ‚«γƒ©γƒΌε‡ΊεŠ›γ‚’εΌ·εˆΆγ—γͺγ‘γ‚Œγ°γͺγ‚ŠγΎγ›γ‚“γ€‚ γΎγŸγ€`--line-range` γ‚ͺプションを用いることで巨倧γͺフゑむルγθͺ­γΏθΎΌγΏζ™‚ι–“γ‚’εˆΆι™γ§γγΎγ™: ```bash fzf --preview 'bat --color=always --style=numbers --line-range=:500 {}' ``` 詳しくは [`fzf` だ`README`](https://github.com/junegunn/fzf#preview-window) を参照してください。 #### `find` or `fd` `find` だ`-exec` γ‚ͺプションを使用して、`bat` ですべてγζ€œη΄’η΅ζžœγ‚’γƒ—γƒ¬γƒ“γƒ₯ーできます: ```bash find … -exec bat {} + ``` [`fd`](https://github.com/sharkdp/fd) γ‚’δ½Ώη”¨γ—γ¦γ„γ‚‹ε ΄εˆγ―γ€`-X` /`-exec-batch` γ‚ͺγƒ—γ‚·γƒ§γƒ³γ‚’δ½Ώη”¨γ—γ¦εŒγ˜γ“γ¨γ‚’θ‘Œγ†γ“γ¨γŒγ§γγΎγ™: ```bash fd … -X bat ``` #### `ripgrep` [`batgrep`](https://github.com/eth-p/bat-extras/blob/master/doc/batgrep.md) では、[`ripgrep`](https://github.com/BurntSushi/ripgrep) 怜紒硐果γγƒ—γƒͺンターとして `bat` を使用できます。 ```bash batgrep needle src/ ``` #### `tail -f` `bat` γ‚’ `tail -f` γ¨η΅„γΏεˆγ‚γ›γ¦γ€ζ§‹ζ–‡εΌ·θͺΏθ‘¨η€Ίγ‚’使用して特εšγγƒ•γ‚‘γ‚€γƒ«γ‚’ηΆ™ηΆšηš„γ«η›£θ¦–γ§γγΎγ™γ€‚ ```bash tail -f /var/log/pacman.log | bat --paging=never -l log ``` ζ³¨ζ„δΊ‹ι …οΌš`tail -f`γ¨η΅„γΏεˆγ‚γ›γ‚‹γ«γ―γ€γƒšγƒΌγ‚Έγƒ³γ‚°γ‚’γ‚ͺフにしγͺγ‘γ‚Œγ°γͺγ‚ŠγΎγ›γ‚“γ€‚γΎγŸγ€γ“γε ΄εˆγ―ζ§‹ζ–‡γŒθ‡ͺε‹•ζ€œε‡Ίγ•γ‚Œγͺγ„γŸγ‚γ€ζ˜Žη€Ίηš„γ«ζŒ‡εšοΌˆ`-l log`)しています。 #### `git` `bat` γ‚’ `git show` γ¨η΅„γΏεˆγ‚γ›γ¦γ€ ι©εˆ‡γͺζ§‹ζ–‡εΌ·θͺΏθ‘¨η€Ίγ‚’使用して特εšγγƒ•γ‚‘むルγε€γ„バージョンを葨瀺できます: ```bash git show v0.6.0:src/main.rs | bat -l rs ``` ε·εˆ†ε†…γζ§‹ζ–‡εΌ·θͺΏθ‘¨η€Ίγ―ηΎεœ¨γ‚΅γƒγƒΌγƒˆγ•γ‚Œγ¦γ„γͺいことに注意してください。 γ“γ‚Œγ‚’ζŽ’γ—γ¦γ„γ‚‹γͺら、[`delta`](https://github.com/dandavison/delta) をチェックしてください。 #### `xclip` `bat` γε‡ΊεŠ›γθ‘Œη•ͺ号と Git ε€‰ζ›΄γƒžγƒΌγ‚«γƒΌγ«γ‚ˆγ‚Šγ€γƒ•γ‚‘γ‚€γƒ«γε†…εΉγ‚’コピーするγγŒι›£γ—くγͺγ‚‹ε ΄εˆγŒγ‚γ‚ŠγΎγ™γ€‚ γ“γ‚Œγ‚’ι˜²γγ«γ―γ€`-p` / `-plain` γ‚ͺプションを使用して `bat` を呼び出すか、 ε˜γ«ε‡ΊεŠ›γ‚’ `xclip` にパむプします: ```bash bat main.cpp | xclip ``` `bat` γ―ε‡ΊεŠ›γŒγƒͺγƒ€γ‚€γƒ¬γ‚―γƒˆγ•γ‚Œγ¦γ„γ‚‹γ“γ¨γ‚’ζ€œε‡Ίγ—γ€γƒ—γƒ¬γƒΌγƒ³γƒ•γ‚‘γ‚€γƒ«γε†…εΉγ‚’ε‡ΊεŠ›γ—γΎγ™γ€‚ #### `man` `bat` は `MANPAGER` 環咃倉数を設εšγ™γ‚‹γ“γ¨γ«γ‚ˆγ‚Šγ€ `man` γθ‰²δ»˜γ‘γƒšγƒΌγ‚Έγƒ£γƒΌγ¨γ—γ¦δ½Ώη”¨γ§γγΎγ™: ```bash export MANPAGER="sh -c 'col -bx | bat -l man -p'" man 2 select ``` γƒ•γ‚©γƒΌγƒžγƒƒγƒˆγε•ι‘ŒγŒη™Ίη”Ÿγ—γŸε ΄εˆγ― `MANROFFOPT="-c"` γ‚’θ¨­εšγ™γ‚‹εΏ…θ¦γ‚‚γ‚γ‚ŠγΎγ™γ€‚ γ“γ‚Œγ‚’ζ–°γ—γ„γ‚³γƒžγƒ³γƒ‰γ«γƒγƒ³γƒ‰γƒ«γ—γŸγ„ε ΄εˆγ― [`batman`](https://github.com/eth-p/bat-extras/blob/master/doc/batman.md) も使用できます。 [Manpage syntax](assets/syntaxes/Manpage.sublime-syntax) はこγγƒͺγƒγ‚Έγƒˆγƒͺγ§ι–‹η™Ίγ•γ‚Œγ¦γŠγ‚Šγ€γΎγ δ½œζ₯­γŒεΏ…要であることに注意してください。 #### `prettier` / `shfmt` / `rustfmt` [`prettybat`](https://github.com/eth-p/bat-extras/blob/master/doc/prettybat.md) γ‚Ήγ‚―γƒͺγƒ—γƒˆγ―γ€γ‚³γƒΌγƒ‰γ‚’γƒ•γ‚©γƒΌγƒžγƒƒγƒˆγ—γ€`bat` γ§ε°εˆ·γ™γ‚‹γƒ©γƒƒγƒ‘γƒΌγ§γ™γ€‚ ## γ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ« [![Packaging status](https://repology.org/badge/vertical-allrepos/bat-cat.svg?columns=3&exclude_unsupported=1)](https://repology.org/project/bat-cat/versions) ### On Ubuntu (`apt` を使用) *... γ‚„δ»–γDebianベースγLinuxγƒ‡γ‚£γ‚Ήγƒˆγƒͺビγƒ₯ーション* [20.04 ("Focal") δ»₯降だUbuntu](https://packages.ubuntu.com/search?keywords=bat&exact=1) または [2021 εΉ΄ 8 月δ»₯降だDebian (Debian 11 - "Bullseye")](https://packages.debian.org/bullseye/bat) では `bat` γƒ‘γƒƒγ‚±γƒΌγ‚ΈγŒεˆ©η”¨γ§γγΎγ™γ€‚ ```bash apt install bat ``` `apt` を使用して `bat` γ‚’γ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ«γ—γŸε ΄εˆγ€εŸθ‘Œε―能フゑむルγεε‰γŒ `bat` ではγͺく `batcat` にγͺγ‚‹γ“γ¨γŒγ‚γ‚ŠγΎγ™([δ»–γγƒ‘ッケージとγεε‰θ‘ηͺγγŸγ‚](https://github.com/sharkdp/bat/issues/982))。`bat -> batcat` γγ‚·γƒ³γƒœγƒͺックγƒͺγƒ³γ‚―γΎγŸγ―γ‚¨γ‚€γƒͺγ‚’γ‚Ήγ‚’θ¨­εšγ™γ‚‹γ“とで、εŸθ‘Œε―θƒ½γƒ•γ‚‘γ‚€γƒ«εγŒη•°γͺγ‚‹γ“γ¨γ«γ‚ˆγ‚‹ε•ι‘Œγη™Ίη”Ÿγ‚’ι˜²γŽγ€δ»–γγƒ‡γ‚£γ‚Ήγƒˆγƒͺビγƒ₯ーションと一貫性を保てます。 ``` bash mkdir -p ~/.local/bin ln -s /usr/bin/batcat ~/.local/bin/bat ``` ### On Ubuntu (ζœ€ζ–°γ `.deb` パッケージを使用) *... γ‚„δ»–γDebianベースγLinuxγƒ‡γ‚£γ‚Ήγƒˆγƒͺビγƒ₯ーション batγζœ€ζ–°γƒͺγƒͺγƒΌγ‚Ήγ‚’εŸθ‘Œγ™γ‚‹ε ΄εˆγ€γΎγŸγ― Ubuntu/Debian γε€γ„γƒγƒΌγ‚Έγƒ§γƒ³γ‚’δ½Ώη”¨γ—γ¦γ„γ‚‹ε ΄εˆγ―、[release page](https://github.com/sharkdp/bat/releases) γ‹γ‚‰ζœ€ζ–°γ `.deb` パッケージをダウンロードし、 欑γζ–Ήζ³•γ§γ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ«γ—γΎγ™: ```bash sudo dpkg -i bat_0.18.3_amd64.deb # adapt version number and architecture ``` ### On Alpine Linux ι©εˆ‡γͺγƒͺγƒγ‚ΈγƒˆγƒͺγŒζœ‰εŠΉγ«γͺγ£γ¦γ„γ‚‹ε ΄εˆγ―γ€ 公式γγ‚½γƒΌγ‚Ήγ‹γ‚‰ [`bat` package](https://pkgs.alpinelinux.org/packages?name=bat) γ‚’γ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ«γ§γγΎγ™: ```bash apk add bat ``` ### On Arch Linux [Arch Linuxγε…¬εΌγƒͺγ‚½γƒΌγ‚Ή](https://www.archlinux.org/packages/extra/x86_64/bat/) γ‹γ‚‰γ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ«γ§γγΎγ™γ€‚ ```bash pacman -S bat ``` ### On Fedora 公式だ[Fedora Modular](https://docs.fedoraproject.org/en-US/modularity/using-modules/) γƒͺγƒγ‚Έγƒˆγƒͺから [the `bat` package](https://koji.fedoraproject.org/koji/packageinfo?packageID=27506) γ‚’γ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ«γ§γγΎγ™γ€‚ ```bash dnf install bat ``` ### On Gentoo Linux 公式ソースから [the `bat` package](https://packages.gentoo.org/packages/sys-apps/bat) γ‚’γ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ«γ§γγΎγ™γ€‚ ```bash emerge sys-apps/bat ``` ### On Void Linux xbps-installη΅Œη”±γ§ `bat` γ‚’γ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ«γ§γγΎγ™γ€‚ ``` xbps-install -S bat ``` ### On FreeBSD pkg を使用してプγƒͺγ‚³γƒ³γƒ‘γ‚€γƒ«γ•γ‚ŒγŸ [`bat` package](https://www.freshports.org/textproc/bat) γ‚’γ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ«γ§γγΎγ™: ```bash pkg install bat ``` または FreeBSD γƒγƒΌγƒˆγ‹γ‚‰θ‡ͺεˆ†γ§γƒ“γƒ«γƒ‰γ™γ‚‹γ“γ¨γ‚‚γ§γγΎγ™: ```bash cd /usr/ports/textproc/bat make install ``` ### Via nix `bat` γ‚’ [nix package manager](https://nixos.org/nix) η΅Œη”±γ§γ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ«γ™γ‚‹γ“γ¨γŒγ§γγΎγ™: ```bash nix-env -i bat ``` ### On openSUSE `bat` γ‚’zypperγ§γ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ«γ™γ‚‹γ“γ¨γŒγ§γγΎγ™: ```bash zypper install bat ``` ### On macOS [Homebrew](http://braumeister.org/formula/bat)で `bat` γ‚’γ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ«γ§γγΎγ™: ```bash brew install bat ``` または [MacPorts](https://ports.macports.org/port/bat/summary) で `bat` γ‚’γ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ«γ—γΎγ™: ```bash port install bat ``` ### On Windows Windowsにbatγ‚’γ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ«γ™γ‚‹γ„γγ€γ‹γγ‚ͺγƒ—γ‚·γƒ§γƒ³γŒγ‚γ‚ŠγΎγ™γ€‚ batγ‚’γ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ«γ—γŸγ‚‰ [Windowsでγbatγδ½Ώη”¨](#windows-でγ-bat-γεˆ©η”¨) セクションをご覧ください。 #### With Chocolatey [Chocolatey](https://chocolatey.org/packages/Bat) から `bat` γ‚’γ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ«γ§γγΎγ™: ```bash choco install bat ``` #### With Scoop [scoop](https://scoop.sh/) から `bat` γ‚’γ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ«γ§γγΎγ™: ```bash scoop install bat ``` [Visual C ++再頒布可能](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) γƒ‘γƒƒγ‚±γƒΌγ‚Έγ‚’γ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ«γ™γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚ #### From prebuilt binaries: [γƒͺγƒͺγƒΌγ‚ΉγƒšγƒΌγ‚Έ](https://github.com/sharkdp/bat/releases) γ‹γ‚‰γƒ“γƒ«γƒ‰ζΈˆγΏγγƒγ‚€γƒŠγƒͺをダウンロードできます。 [Visual C ++再頒布可能](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) γƒ‘γƒƒγ‚±γƒΌγ‚Έγ‚’γ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ«γ™γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚ ### Via Docker γ‚³γƒ³γƒ†γƒŠε†…γ§ `bat` γ‚’δ½Ώγ„γŸγ„ζ–ΉγγŸγ‚γ« [Docker image](https://hub.docker.com/r/danlynn/bat/) γŒη”¨ζ„γ•γ‚Œγ¦γ„γΎγ™: ```bash docker pull danlynn/bat alias bat='docker run -it --rm -e BAT_THEME -e BAT_STYLE -e BAT_TABS -v "$(pwd):/myapp" danlynn/bat' ``` ### Via Ansible [Ansible](https://www.ansible.com/) γ§γ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ«γ™γ‚‹γ“γ¨γŒγ§γγΎγ™: ```bash # Install role on local machine ansible-galaxy install aeimer.install_bat ``` ```yaml --- # Playbook to install bat - host: all roles: - aeimer.install_bat ``` - [Ansible Galaxy](https://galaxy.ansible.com/aeimer/install_bat) - [GitHub](https://github.com/aeimer/ansible-install-bat) γ“γ‚Œγ―δ»₯δΈ‹γγƒ‡γ‚£γ‚Ήγƒˆγƒͺビγƒ₯γƒΌγ‚·γƒ§γƒ³γ§ε‹•δ½œγ™γ‚‹γ―γšγ§γ™: - Debian/Ubuntu - ARM (eg. Raspberry PI) - Arch Linux - Void Linux - FreeBSD - MacOS ### From binaries 倚くγη•°γͺるをーキテクチャγγŸγ‚γγƒ—レビルドバージョンを[γƒͺγƒͺγƒΌγ‚ΉγƒšγƒΌγ‚Έ](https://github.com/sharkdp/bat/releases)γ‹γ‚‰γƒγ‚§γƒƒγ‚―γ—γ¦γΏγ¦γγ γ•γ„γ€‚ι™ηš„γ«γƒͺγƒ³γ‚―γ•γ‚Œγ¦γ„γ‚‹ε€šγγγƒγ‚€γƒŠγƒͺγ‚‚εˆ©η”¨γ§γγΎγ™: フゑむル名に `musl` γ‚’ε«γ‚€γ‚’γƒΌγ‚«γ‚€γƒ–γ‚’ζŽ’γ—γ¦γΏγ¦γγ γ•γ„γ€‚ ### From source `bat` γ‚’γ‚½γƒΌγ‚Ήγ‹γ‚‰γƒ“γƒ«γƒ‰γ—γŸγ„γͺらば、Rust 1.74.0 δ»₯上γη’°ε’ƒγŒεΏ…要です。 `cargo` γ‚’δ½Ώη”¨γ—γ¦γƒ“γƒ«γƒ‰γ™γ‚‹γ“γ¨γŒγ§γγΎγ™: ```bash cargo install --locked bat ``` 一部γγƒ—γƒ©γƒƒγƒˆγƒ•γ‚©γƒΌγƒ γ§γ― `llvm` γŠγ‚ˆγ³/または `libclang-dev` γγ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ«γŒεΏ…要にγͺγ‚‹ε ΄εˆγŒγ‚γ‚ŠγΎγ™γ€‚ ## γ‚«γ‚Ήγ‚Ώγƒžγ‚€γ‚Ί ### γƒγ‚€γƒ©γ‚€γƒˆ γƒ†γƒΌγƒž `bat --list-themes` γ‚’δ½Ώγ†γ¨ηΎεœ¨εˆ©η”¨ε―θƒ½γͺγ‚·γƒ³γ‚Ώγƒƒγ‚―γ‚Ήγƒγ‚€γƒ©γ‚€γƒˆγγƒ†γƒΌγƒžγ‚’ε…₯手できます。 `TwoDark` γƒ†γƒΌγƒžγ‚’ιΈγΆγŸγ‚γ«γ― `--theme=TwoDark` γ‚ͺプションを぀けるか `BAT_THEME` という環咃倉数に `TwoDark` を代ε…₯γ™γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚ シェルγθ΅·ε‹•フゑむルに `export BAT_THEME="TwoDark"` とεšηΎ©γ™γ‚Œγ°γγθ¨­εšγŒε€‰γ‚γ‚‹γ“とはγͺいでしょう。あるいは、 `bat` だ[θ¨­εšγƒ•γ‚‘むル](#θ¨­εšγƒ•γ‚‘むル)γ‚’εˆ©η”¨γ—γ¦γγ γ•γ„γ€‚ カスタムフゑむルでさまざまγͺγƒ†γƒΌγƒžγ‚’γƒ—γƒ¬γƒ“γƒ₯γƒΌγ™γ‚‹ε ΄εˆγ―γ€ 欑γγ‚³γƒžγƒ³γƒ‰γ‚’δ½Ώη”¨γ§γγΎγ™οΌˆγ“γ‚Œγ«γ― [`fzf`](https://github.com/junegunn/fzf) γŒεΏ…θ¦γ§γ™οΌ‰γ€‚ ``` bash bat --list-themes | fzf --preview="bat --theme={} --color=always /path/to/file" ``` `bat` γ―γƒ‡γƒ•γ‚©γƒ«γƒˆγ γ¨ι»’γ„θƒŒζ™―θ‰²γγ‚ΏγƒΌγƒŸγƒŠγƒ«γ«ι©γ—ています。 しかし、`GitHub` γ‚„ `OneHalfLight` γγ‚ˆγ†γͺη™½γ„θƒŒζ™―θ‰²γγƒ†γƒΌγƒžγ§γ‚‚γ„γ„ζ„Ÿγ˜γ«γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚ ['ζ–°γ—γ„γƒ†γƒΌγƒžγθΏ½εŠ ' セクションに従って](#ζ–°γ—γ„γƒ†γƒΌγƒžγθΏ½εŠ ) γ‚«γ‚Ήγ‚Ώγƒ γƒ†γƒΌγƒžγ‚’δ½Ώη”¨γ™γ‚‹γ“γ¨γ‚‚γ§γγΎγ™γ€‚ ### ε‡ΊεŠ›γγ‚Ήγ‚Ώγ‚€γƒ« `--style` を使うことで `bat` γθ‘¨η€Ίγθ¦‹γŸη›γ‚’ε€‰ζ›΄γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚ δΎ‹γˆγ°γ€ `--style=numbers,changes` とε…₯εŠ›γ—γΎγ™γ€‚ すると、Gitγε·εˆ†γ¨θ‘Œη•ͺε·γ γ‘γŒθ‘¨η€Ίγ•γ‚Œγ€γ‚°γƒͺγƒƒγƒ‰η·šγ¨γƒ•γ‚‘γ‚€γƒ«γƒ˜γƒƒγƒ€γƒΌγ―θ‘¨η€Ίγ•γ‚ŒγΎγ›γ‚“γ€‚ 環咃倉数に `BAT_STYLE` γ‚’εšηΎ©γ™γ‚‹γ¨γ“γ‚Œγ‚‰γθ¨­εšγ‚’ζ°ΈηΆšηš„γ«δ½Ώη”¨γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚ [θ¨­εšγƒ•γ‚‘むル](#θ¨­εšγƒ•γ‚‘むル) を参考にしても良いでしょう。 ### 新しい構文γθΏ½εŠ  / 言θͺžγεšηΎ© `bat` γ―γ‚·γƒ³γ‚Ώγƒƒγ‚―γ‚Ήγƒγ‚€γƒ©γ‚€γƒˆγγŸγ‚γ [`syntect`](https://github.com/trishume/syntect/) という素晴らしいラむブラγƒͺを使用しています。`syntect` は、 [Sublime Text だ`.sublime-syntax` フゑむル](https://www.sublimetext.com/docs/3/syntax.html) γ¨γƒ†γƒΌγƒžγ‚’θͺ­γΏε–γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚ζ–°γ—γ„ζ§‹ζ–‡γ‚’εšηΎ©γ™γ‚‹γŸγ‚γ«δ»₯δΈ‹γζ‰‹ι †γ‚’θ‘Œγ„γΎγ™γ€‚ ζ§‹ζ–‡εšηΎ©γƒ•γ‚‘むルをε…₯γ‚Œγ¦γŠγγŸγ‚γγƒ•γ‚©γƒ«γƒ€γ‚’δ½œγ‚ŠγΎγ™: ```bash mkdir -p "$(bat --config-dir)/syntaxes" cd "$(bat --config-dir)/syntaxes" # Put new '.sublime-syntax' language definition files # in this folder (or its subdirectories), for example: git clone https://github.com/tellnobody1/sublime-purescript-syntax ``` 欑γγ‚³γƒžγƒ³γƒ‰γ‚’δ½Ώη”¨γ—γ¦γ€γ“γ‚Œγ‚‰γγƒ•γ‚‘γ‚€γƒ«γ‚’γƒγ‚€γƒŠγƒͺキャッシγƒ₯γ«θ§£ζžγ—γΎγ™: ```bash bat cache --build ``` ζœ€εΎŒγ« `bat --list-languages` とε…₯εŠ›γ™γ‚‹γ¨ζ–°γ—γ„θ¨€θͺžγŒεˆ©η”¨ε―能かどうかチェックします。 γƒ‡γƒ•γ‚©γƒ«γƒˆγθ¨­εšγ«ζˆ»γ—γŸγ„γ¨γγ―δ»₯δΈ‹γγ‚³γƒžγƒ³γƒ‰γ‚’εŸθ‘Œγ—ます: ```bash bat cache --clear ``` ### ζ–°γ—γ„γƒ†γƒΌγƒžγθΏ½εŠ  γ“γ‚Œγ―ζ§‹ζ–‡γ‚’ζ–°γ—γεšηΎ©γ™γ‚‹γ‚„γ‚Šζ–Ήγ¨ιžεΈΈγ«δΌΌγ¦γ„γΎγ™γ€‚ γΎγšγ€ζ–°γ—γ„γ‚·γƒ³γ‚Ώγƒƒγ‚―γ‚Ήγƒγ‚€γƒ©γ‚€γƒˆγγƒ†γƒΌγƒžγγƒ•γ‚©γƒ«γƒ€γ‚’δ½œγ‚ŠγΎγ™: ```bash mkdir -p "$(bat --config-dir)/themes" cd "$(bat --config-dir)/themes" # Download a theme in '.tmTheme' format, for example: git clone https://github.com/greggb/sublime-snazzy # Update the binary cache bat cache --build ``` ζœ€εΎŒγ«γ€ `bat --list-themes` γ§ζ–°γ—γ„γƒ†γƒΌγƒžγŒεˆ©η”¨ε―θƒ½γ‹γƒγ‚§γƒƒγ‚―γ—γΎγ™ ### η•°γͺγ‚‹γƒšγƒΌγ‚Έγƒ£γƒΌγδ½Ώη”¨ `bat` は環咃倉数 `PAGER` γ«δ½Ώη”¨γ™γ‚‹γƒšγƒΌγ‚Έγƒ£γƒΌγ‚’ζ˜Žθ¨˜γ—γΎγ™γ€‚ こγη’°ε’ƒε€‰ζ•°γŒεšηΎ©γ•γ‚Œγ¦γ„γͺγ„ε ΄εˆγ€γƒ‡γƒ•γ‚©γƒ«γƒˆγ§ `less` γŒδ½Ώη”¨γ•γ‚ŒγΎγ™γ€‚ もし、異γͺγ‚‹γƒšγƒΌγ‚Έγƒ£γƒΌγ‚’δ½Ώη”¨γ—γŸγ„ε ΄εˆγ―γ€`PAGER` γ‚’δΏζ­£γ—てください。 γΎγŸγ―γ€`PAGER` γ‚’δΈŠζ›Έγγ™γ‚‹η’°ε’ƒε€‰ζ•°γ¨γ—γ¦ `BAT_PAGER` γ‚’εšηΎ©γ™γ‚‹γ“とも可能です。 γ‚‚γ—γ€γƒšγƒΌγ‚Έγƒ£γƒΌγ«γ‚³γƒžγƒ³γƒ‰γƒ©γ‚€γƒ³εΌ•ζ•°γ‚’ζΈ‘γ—γŸγ„ε ΄εˆγ―γ€ `PAGER`/`BAT_PAGER` 環咃倉数をεšηΎ©γ—てください: ```bash export BAT_PAGER="less -RF" ``` η’°ε’ƒε€‰ζ•°γ‚’εˆ©η”¨γ™γ‚‹δ»£γ‚γ‚Šγ«γ€ `bat` だ[θ¨­εšγƒ•γ‚‘むル](#θ¨­εšγƒ•γ‚‘むル) を使用して設εšγ‚‚ε―θƒ½γ§γ™οΌˆ`--pager` γ‚ͺプション) **注意**: γƒ‡γƒ•γ‚©γƒ«γƒˆγ«γ‚ˆγ‚Šγ€γƒšγƒΌγ‚Έγƒ£γƒΌγŒ `less` γ«γ‚»γƒƒγƒˆγ•γ‚Œγ¦γ„γ‚‹γͺらば `bat` γ―γƒšγƒΌγ‚Έγƒ£γƒΌγδ»₯δΈ‹γγ‚³γƒžγƒ³γƒ‰γƒ©γ‚€γƒ³γ‚ͺプション γ‚’ε—γ‘δ»˜γ‘γ‚‹γ§γ—γ‚‡γ†: `-R`/`--RAW-CONTROL-CHARS`, `-F`/`--quit-if-one-screen` そして `-X`/`--no-init`。 ζœ€εΎŒγγ‚ͺγƒ—γ‚·γƒ§γƒ³οΌˆ-X)は、530 γ‚ˆγ‚Šε€γ„γƒγƒΌγ‚Έγƒ§γƒ³γ«γγΏδ½Ώη”¨γ•γ‚ŒγΎγ™γ€‚ `-R` γ‚ͺプションは、ANSIγ‚«γƒ©γƒΌγ‚’ζ­£γ—γθ§£ι‡ˆγ™γ‚‹γŸγ‚γ«εΏ…θ¦γ§γ™γ€‚ 2η•ͺη›γγ‚ͺγƒ—γ‚·γƒ§γƒ³οΌˆ`-F`οΌ‰γ―γ€ε‡ΊεŠ›γ‚΅γ‚€γ‚ΊγŒη«―ζœ«γεž‚η›΄γ‚΅γ‚€γ‚Ίγ‚ˆγ‚Šγ‚‚ε°γ•γ„ε ΄εˆγ€γ™γγ«η΅‚δΊ†γ™γ‚‹γ‚ˆγ†γ«lessγ«ζŒ‡η€Ίγ—γΎγ™γ€‚ γ“γ‚Œγ―γ€γƒšγƒΌγ‚Έγƒ£γƒΌγ‚’η΅‚δΊ†γ™γ‚‹γŸγ‚γ« `q` γ‚’ζŠΌγ™εΏ…θ¦γŒγͺγ„γŸγ‚γ€ε°γ•γͺγƒ•γ‚‘γ‚€γƒ«γ«δΎΏεˆ©γ§γ™γ€‚ 3η•ͺη›γγ‚ͺγƒ—γ‚·γƒ§γƒ³οΌˆ`-X`)は、`less` γε€γ„バージョンだ`--quit-if-one-screen` ζ©Ÿθƒ½γγƒγ‚°γ‚’δΏζ­£γ™γ‚‹γŸγ‚γ«εΏ…要です。 ζ‹εΏ΅γͺγŒγ‚‰γ€`less` γγƒžγ‚¦γ‚Ήγƒ›γ‚€γƒΌγƒ«γγ‚΅γƒγƒΌγƒˆγ‚‚ε°‘γͺくγͺγ‚ŠγΎγ™γ€‚ `less` γε€γ„γƒγƒΌγ‚Έγƒ§γƒ³γ§γƒžγ‚¦γ‚Ήγƒ›γ‚€γƒΌγƒ«γγ‚Ήγ‚―γƒ­γƒΌγƒ«γ‚’ζœ‰εŠΉγ«γ—γŸγ„ε ΄εˆγ―γ€ `-R` γ γ‘γ‚’ζΈ‘γ™γ“γ¨γŒγ§γγΎγ™οΌˆδΈŠθ¨˜γδΎ‹γγ‚ˆγ†γ«γ€γ“γ‚Œγ―1η”»ι’η΅‚δΊ†ζ©Ÿθƒ½γ‚’η„‘εŠΉγ«γ—γΎγ™οΌ‰γ€‚ 530δ»₯δΈ‹γε ΄εˆγ―、そγγΎγΎδ½Ώη”¨γ§γγΎγ™γ€‚ ### Dark mode macOSγ§γƒ€γƒΌγ‚―γƒ’γƒΌγƒ‰ζ©Ÿθƒ½γ‚’δ½Ώη”¨γ™γ‚‹ε ΄εˆγ€OSγƒ†γƒΌγƒžγ«εŸΊγ₯いて異γͺγ‚‹γƒ†γƒΌγƒžγ‚’δ½Ώη”¨γ™γ‚‹γ‚ˆγ†γ« `bat` γ‚’ζ§‹ζˆγ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚ 欑γγ‚Ήγƒ‹γƒšγƒƒγƒˆγ―γ€γƒ©γ‚€γƒˆγƒ’γƒΌγƒ‰γε ΄εˆγ― `γƒ‡γƒ•γ‚©γƒ«γƒˆ` γγƒ†γƒΌγƒžγ‚’使用し、 ダークヒードγε ΄εˆγ― `GitHub` γƒ†γƒΌγƒžγ‚’δ½Ώη”¨γ—γΎγ™γ€‚ ```bash alias cat="bat --theme=\$(defaults read -globalDomain AppleInterfaceStyle &> /dev/null && echo default || echo GitHub)" ``` ## θ¨­εšγƒ•γ‚‘むル `bat` は設εšγƒ•γ‚‘γ‚€γƒ«γ§γ‚«γ‚Ήγ‚Ώγƒžγ‚€γ‚Ίγ™γ‚‹γ“γ¨γŒε―θƒ½γ§γ™γ€‚γƒ•γ‚‘γ‚€γƒ«γε ΄ζ‰€γ―OSγ«δΎε­˜γ—γΎγ™γ€‚ 使用しているOSγγƒ‡γƒ•γ‚©γƒ«γƒˆγƒ‘γ‚Ήγ‚’θͺΏγΉγ‚‹γ«γ―δ»₯δΈ‹γγ‚³γƒžγƒ³γƒ‰γ‚’εŸθ‘Œγ—てください: ``` bat --config-file ``` γΎγŸγ―γ€`BAT_CONFIG_PATH` 環咃倉数を使用して、`bat` が ζ§‹ζˆγƒ•γ‚‘γ‚€γƒ«γγƒ‡γƒ•γ‚©γƒ«γƒˆδ»₯ε€–γε ΄ζ‰€γ‚’ζŒ‡γ™γ‚ˆγ†γ«γ™γ‚‹γ“γ¨γŒγ§γγΎγ™: ```bash export BAT_CONFIG_PATH="/path/to/bat.conf" ``` ### γƒ•γ‚©γƒΌγƒžγƒƒγƒˆ こγθ¨­εšγƒ•γ‚‘γ‚€γƒ«γ―γ‚³γƒžγƒ³γƒ‰γƒ©γ‚€γƒ³εΌ•ζ•°γε˜η΄”γͺγƒͺγ‚Ήγƒˆγ§γ™γ€‚ `bat --help` γ‚’εˆ©η”¨γ™γ‚‹γ¨γ€εˆ©η”¨ε―θƒ½γͺγ‚ͺプションとそγε€€γ‚’ι–²θ¦§γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚γ•γ‚‰γ«γ€`#` γ§γ‚³γƒ‘γƒ³γƒˆζ–‡γ‚’εŠ γˆγ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚ θ¨­εšγƒ•γ‚‘むルγδΎ‹: ```bash # Set the theme to "TwoDark" --theme="TwoDark" # Show line numbers, Git modifications and file header (but no grid) --style="numbers,changes,header" # Use italic text on the terminal (not supported on all terminals) --italic-text=always # Use C++ syntax for Arduino .ino files --map-syntax "*.ino:C++" # Use ".gitignore"-style highlighting for ".ignore" files --map-syntax ".ignore:Git Ignore" ``` ## Windows でだ`bat` γεˆ©η”¨ Windows 上で `bat` γ―γ»γ¨γ‚“γ©ε‹•δ½œγ—γΎγ™γŒγ€γ„γγ€γ‹γζ©Ÿθƒ½γ―θ¨­εšγ‚’εΏ…θ¦γ‚’γ™γ‚‹ε ΄εˆγŒγ‚γ‚ŠγΎγ™γ€‚ ### γƒšγƒΌγ‚Έγƒ³γ‚° Windowsには、`more` 归式γιžεΈΈγ«ι™γ‚‰γ‚ŒγŸγƒšγƒΌγ‚Έγƒ£γƒΌγ—γ‹ε«γΎγ‚Œγ¦γ„γΎγ›γ‚“γ€‚ `less` 用γWindowsγƒγ‚€γƒŠγƒͺは、[γƒ›γƒΌγƒ γƒšγƒΌγ‚Έ](http://www.greenwoodsoftware.com/less/download.html) または [Chocolatey](https://chocolatey.org/packages/Less) からダウンロードできます。 γ“γ‚Œγ‚’δ½Ώη”¨γ™γ‚‹γ«γ―γ€γƒγ‚€γƒŠγƒͺγ‚’ `PATH` γγƒ‡γ‚£γƒ¬γ‚―γƒˆγƒͺに配η½γ™γ‚‹γ‹γ€η’°ε’ƒε€‰ζ•°γ‚’εšηΎ©γ—ます。[Chocolateyパッケージ](#on-windows) は `less` γ‚’θ‡ͺε‹•ηš„γ«γ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ«γ—γΎγ™γ€‚ ### 色 Windows 10では、`conhost.exe` οΌˆγ‚³γƒžγƒ³γƒ‰γƒ—γƒ­γƒ³γƒ—γƒˆοΌ‰γ¨ [v1511](https://en.wikipedia.org/wiki/Windows_10_version_history#Version_1511_(November_Update)) δ»₯降だPowerShell γδΈ‘方、 γŠγ‚ˆγ³bashγζ–°γ—いバージョンγθ‰²γŒγƒγ‚€γƒ†γ‚£γƒ–γ«γ‚΅γƒγƒΌγƒˆγ•γ‚Œγ¦γ„γΎγ™γ€‚ δ»₯前γγƒγƒΌγ‚Έγƒ§γƒ³γWindowsでは、 [ConEmu](https://conemu.github.io/) を含む [Cmder](http://cmder.net/) を使用できます。 **注意:** Git と MSYS だ`less` はWindowsδΈŠγ§θ‰²γ‚’ζ­£γ—γθ§£ι‡ˆγ—γΎγ›γ‚“γ€‚ もし、あγͺγŸγŒδ»–γγƒšγƒΌγ‚Έγƒ£γƒΌγ‚’γ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ«γ—γ¦γ„γͺいγγ§γ‚γ‚Œγ°γ€ `--paging=never` γ‚ͺγƒ—γ‚·γƒ§γƒ³γ‚’δ»˜γ‘εŠ γˆγ‚‹γ‹ `BAT_PAGER` に空文字を設εšγ™γ‚‹γ“γ¨γ§γƒšγƒΌγ‚Έγƒ³γ‚°γ‚’εŒε…¨γ«η„‘εŠΉγ«γ§γγΎγ™γ€‚ ### Cygwin Windows上だ`bat` は Cygwin γunixι’¨γpath(`/cygdrive/*`)γ‚’γƒγ‚€γƒ†γ‚£γƒ–γ‚΅γƒγƒΌγƒˆγ—γ¦γ„γΎγ›γ‚“γ€‚η΅Άε―Ύηš„γͺcygwinγƒ‘γ‚Ήγ‚’εΌ•ζ•°γ¨γ—γ¦ε—γ‘γŸγ¨γγ«γ€ `bat` はδ»₯δΈ‹γγ‚¨γƒ©γƒΌγ‚’返すでしょう: `The system cannot find the path specified. (os error 3)` wrapperγ‚’δ½œζˆγ™γ‚‹γ‹γ€δ»₯δΈ‹γι–’ζ•°γ‚’ `.bash_profile` γ«θΏ½θ¨˜γ™γ‚‹γ“γ¨γ§γ€γ“γε•ι‘Œγ‚’θ§£ζ±Ίγ™γ‚‹γ“γ¨γŒγ§γγΎγ™: ```bash bat() { local index local args=("$@") for index in $(seq 0 ${#args[@]}) ; do case "${args[index]}" in -*) continue;; *) [ -e "${args[index]}" ] && args[index]="$(cygpath --windows "${args[index]}")";; esac done command bat "${args[@]}" } ``` ## γƒˆγƒ©γƒ–γƒ«γ‚·γƒ₯ーティング ### γ‚ΏγƒΌγƒŸγƒŠγƒ«γ¨θ‰² `bat` γ―γ‚ΏγƒΌγƒŸγƒŠγƒ«γŒγƒˆγ‚₯γƒ«γƒΌγ‚«γƒ©γƒΌγ‚’γ‚΅γƒγƒΌγƒˆγ—γ¦γ„γ‚‹/していγͺいに閒係γͺγγ‚΅γƒγƒΌγƒˆγ—γΎγ™γ€‚ γ—γ‹γ—γ€γ‚·γƒ³γ‚Ώγƒƒγ‚―γ‚Ήγƒγ‚€γƒ©γ‚€γƒˆγγƒ†γƒΌγƒžγθ‰²γŒ8-bitγ‚«γƒ©γƒΌγ«ζœ€ι©εŒ–γ•γ‚Œγ¦γ„γͺγ„ε ΄εˆγ€ 24-bitγ§γ‚γ‚‹γƒˆγ‚₯γƒ«γƒΌγ‚«γƒ©γƒΌγ‚’γ‚΅γƒγƒΌγƒˆγ—γ¦γ„γ‚‹γ‚ΏγƒΌγƒŸγƒŠγƒ«γ‚’δ½Ώη”¨γ™γ‚‹γ“γ¨γ‚’εΌ·γζŽ¨ε₯¨γ—γΎγ™οΌˆ`terminator`, `konsole`, `iTerm2`, ...)。 こだ[θ¨˜δΊ‹](https://gist.github.com/XVilka/8346728) には 24-bitγ‚«γƒ©γƒΌγŒγ‚΅γƒγƒΌγƒˆγ•γ‚Œγ¦γ„γ‚‹γ‚ΏγƒΌγƒŸγƒŠγƒ«γδΈ€θ¦§γŒζŽ²θΌ‰γ•γ‚Œγ¦γ„γΎγ™γ€‚ ζœ¬ε½“γθ‰²γ‚’γ‚ΏγƒΌγƒŸγƒŠγƒ«γ«γ‚»γƒƒγƒˆγ™γ‚‹γŸγ‚γ«γ€η’°ε’ƒε€‰ζ•° `COLORTERM` に `truecolor` か `24bit` γγ©γ‘らかを代ε…₯してください。さもγͺγ‘γ‚Œγ°γ€`bat` はどγθ‰²γ‚’使うγγ‹ζ±Ίεšγ™γ‚‹γ“γ¨γŒγ§γγΎγ›γ‚“γ€‚γΎγŸγ―、24-bit γ‚¨γ‚Ήγ‚±γƒΌγƒ—γ‚·γƒΌγ‚±γƒ³γ‚ΉγŒγ‚΅γƒγƒΌγƒˆγ•γ‚ŒγΎγ›γ‚“ οΌˆγγ—γ¦γ€8-bit colorγ«ζˆ»γ‚ŠγΎγ™οΌ‰γ€‚ ### 葌η•ͺ号とグγƒͺγƒƒγƒ‰η·šγŒγ»γ¨γ‚“γ©θ¦‹γˆγͺい η•°γͺγ‚‹γƒ†γƒΌγƒžγ‚’θ©¦γ—γ¦γΏγ¦γγ γ•γ„οΌˆ`bat --list-themes` γ§γƒ†γƒΌγƒžγ‚’ι–²θ¦§γ§γγΎγ™οΌ‰γ€‚ `OneHalfDark` と `OneHalfLight` γƒ†γƒΌγƒžγ―γ‚°γƒͺγƒƒγƒ‰η·šγ¨η·šγθ‰²γ‚’ζ˜Žγ‚‹γγ—γΎγ™γ€‚ ### フゑむルエンコーディング `bat` は UTF-16 と同様に UTF-8 γ‚’γƒγ‚€γƒ†γ‚£γƒ–γ«γ‚΅γƒγƒΌγƒˆγ—γΎγ™γ€‚ δ»–γγ™γΉγ¦γγƒ•γ‚‘γ‚€γƒ«γ‚¨γƒ³γ‚³γƒΌγƒ‡γ‚£γƒ³γ‚°γ§γ―γ€γ‚¨γƒ³γ‚³γƒΌγƒ‡γ‚£γƒ³γ‚°γ―ι€šεΈΈθ‡ͺε‹•ζ€œε‡Ίγ§γγͺγ„γŸγ‚γ€ζœ€εˆγ« UTF-8 γ«ε€‰ζ›γ™γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚ γ“γ‚Œγ‚’θ‘Œγ†γ«γ― `iconv` を使用できます。 δΎ‹: Latin-1(ISO-8859-1)エンコーディングだPHP γƒ•γ‚‘γ‚€γƒ«γŒγ‚γ‚‹ε ΄εˆγ€ζ¬‘γγ‚ˆγ†γ«ε‘Όγ³ε‡Ίγ™γ“γ¨γŒγ§γγΎγ™: ``` bash iconv -f ISO-8859-1 -t UTF-8 my-file.php | bat ``` 注: `bat` γŒζ§‹ζ–‡γ‚’θ‡ͺε‹•ζ€œε‡Ίγ§γγͺγ„ε ΄εˆγ― `-l` / `-language` γ‚ͺγƒ—γ‚·γƒ§γƒ³γ‚’δ½Ώη”¨γ™γ‚‹εΏ…θ¦γŒγ‚γ‚‹ε ΄εˆγŒγ‚γ‚ŠγΎγ™γ€‚ ## ι–‹η™Ί ```bash # Recursive clone to retrieve all submodules git clone --recursive https://github.com/sharkdp/bat # Build (debug version) cd bat cargo build --bins # Run unit tests and integration tests cargo test # Install (release version) cargo install --locked # Build a bat binary with modified syntaxes and themes bash assets/create.sh cargo install --locked --force ``` ## Maintainers - [sharkdp](https://github.com/sharkdp) - [eth-p](https://github.com/eth-p) ## γƒ—γƒ­γ‚Έγ‚§γ‚―γƒˆγη›ζ¨™γ¨ζ—’存γι‘žδΌΌγ—γŸOSS `bat` はδ»₯δΈ‹γη›ζ¨™γ‚’ι”ζˆγ—γ‚ˆγ†γ¨θ©¦γΏγ¦γ„γΎγ™: - ηΎŽγ—γι«˜εΊ¦γͺγ‚·γƒ³γ‚Ώγƒƒγ‚―γ‚Ήγƒγ‚€γƒ©γ‚€γƒˆγζδΎ› - フゑむルγε·εˆ†γ‚’θ‘¨η€Ίγ™γ‚‹γŸγ‚γGitとγι€£ζΊ - (POSIX) `cat` とγεŒε…¨δΊ’換 - ユーアーフレンドγƒͺγƒΌγͺγ‚³γƒžγƒ³γƒ‰γƒ©γ‚€γƒ³γ‚€γƒ³γ‚ΏγƒΌγƒ•γ‚§γƒΌγ‚ΉγζδΎ› あγͺたが同様γγƒ—γƒ­γ‚°γƒ©γƒ γ‚’ζŽ’しているγͺγ‚‰γ€ε€šγγιΈζŠžθ‚’γŒγ‚γ‚ŠγΎγ™γ€‚ 比較に぀いては [こγγƒ‰γ‚­γƒ₯γƒ‘γƒ³γƒˆ](alternatives.md) を参照してください。 ## ラむセンス Copyright (c) 2018-2021 [bat-developers](https://github.com/sharkdp/bat). `bat` は MIT License 及び Apache License 2.0 γδΈ‘ζ–Ήγζ‘δ»ΆγδΈ‹γ§ι…εΈƒγ•γ‚Œγ¦γ„γΎγ™γ€‚ ラむセンスγθ©³η΄°γ«γ€γ„ては [LICENSE-APACHE](../LICENSE-APACHE) 及び [LICENSE-MIT](../LICENSE-MIT) フゑむルを参照して下さい。 bat-0.25.0/doc/README-ko.md000064400000000000000000000716321046102023000131220ustar 00000000000000

bat - a cat clone with wings
Build Status license Version info
문법 강쑰와 Git 톡합 κΈ°λŠ₯의 cat(1) 클둠

μ£Όμš” κΈ°λŠ₯λ“€ β€’ μ‚¬μš©λ²• β€’ μ„€μΉ˜ β€’ μ‚¬μš©μžν™” β€’ ν”„λ‘œμ νŠΈ λͺ©ν‘œμ™€ λŒ€μ•ˆλ“€
[English] [δΈ­ζ–‡] [ζ—₯本θͺž] [ν•œκ΅­μ–΄] [Русский]

### 문법 κ°•μ‘° `bat`은 λ‹€μ–‘ν•œ ν”„λ‘œκ·Έλž˜λ° 및 λ§ˆν¬μ—… μ–Έμ–΄μ˜ 문법 κ°•μ‘°(syntax highlighting) κΈ°λŠ₯을 μ§€μ›ν•©λ‹ˆλ‹€: ![Syntax highlighting example](https://imgur.com/rGsdnDe.png) ### Git 톡합 `bat`은 `git`을 톡해 μΈλ±μŠ€μ™€ ν•¨κ»˜ 변경뢄을 ν‘œμ‹œν•©λ‹ˆλ‹€ (μ™Όμͺ½ μ‚¬μ΄λ“œλ°”λ₯Ό ν™•μΈν•˜μ„Έμš”): ![Git integration example](https://i.imgur.com/2lSW4RE.png) ### 비인쇄 문자 처리 `-A`/`--show-all` μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ—¬ 비인쇄 문자λ₯Ό ν‘œμ‹œ 및 κ°•μ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€: ![Non-printable character example](https://i.imgur.com/WndGp9H.png) ### μžλ™ νŽ˜μ΄μ§• `bat`은 기본적으둜 ν•œ 화면에 λΉ„ν•΄ 좜λ ₯이 큰 경우 `less`와 같은 νŽ˜μ΄μ €(pager)둜 좜λ ₯을 μ—°κ²°(pipe)ν•©λ‹ˆλ‹€. λ§Œμ•½ `bat`을 μ–Έμ œλ‚˜ `cat`처럼 μž‘λ™ν•˜κ²Œ ν•˜λ €λ©΄ (좜λ ₯을 νŽ˜μ΄μ§€ν•˜μ§€ μ•ŠκΈ°), `--paging=never` μ˜΅μ…˜μ„ μ»€λ§¨λ“œ λΌμΈμ΄λ‚˜ μ„€μ • νŒŒμΌμ— 넣을 수 μžˆμŠ΅λ‹ˆλ‹€. μ…Έ(shell) μ„€μ •μ—μ„œ `cat`을 `bat`의 alias둜 μ‚¬μš©ν•˜λ €λ©΄, `alias cat='bat --paging=never'`λ₯Ό μ¨μ„œ κΈ°λ³Έ 행동을 μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ### 파일 μ—°κ²°(concatenation) νŽ˜μ΄μ €(pager)λ₯Ό μ‚¬μš©ν•˜λ”λΌλ„ `bat`은 νŒŒμΌλ“€μ„ μ—°κ²°(concatenate)ν•  수 μžˆμŠ΅λ‹ˆλ‹€ :wink:. `bat`이 λΉ„λŒ€ν™”ν˜•(non-interactive) 터미널(예λ₯Ό λ“€μ–΄, λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ‚˜ νŒŒμΌμ— μ—°κ²°(pipe)ν•œ 경우)을 κ°μ§€ν•˜λ©΄, `bat`은 `--pager` μ˜΅μ…˜μ˜ κ°’κ³Ό 상관없이 `cat`κ³Ό λ™μΌν•˜κ²Œ 파일 λ‚΄μš©μ„ κ·ΈλŒ€λ‘œ 좜λ ₯ν•©λ‹ˆλ‹€. ## μ‚¬μš©λ²• 터미널에 ν•˜λ‚˜μ˜ 파일 ν‘œμ‹œν•˜κΈ° ```bash > bat README.md ``` μ—¬λŸ¬ 파일 ν•œ λ²ˆμ— 보여주기 ```bash > bat src/*.rs ``` stdinμ—μ„œ 읽고, μžλ™μœΌλ‘œ λ§žλŠ” 문법 κ²°μ •ν•˜κΈ° (참고둜, 문법 κ°•μ‘°λŠ” 파일의 첫 μ€„λ§ŒμœΌλ‘œ 문법이 결정될 수 μžˆμ„ λ•Œλ§Œ μž‘λ™ν•©λ‹ˆλ‹€. μ΄λŠ” 보톡 `#!/bin/sh`와 같은 μ…”λ±…(shebang)으둜 νŒλ‹¨ν•©λ‹ˆλ‹€.) ```bash > curl -s https://sh.rustup.rs | bat ``` stdinμ—μ„œ 읽고, λͺ…μ‹œμ μœΌλ‘œ μ–Έμ–΄ μ§€μ •ν•˜κΈ° ```bash > yaml2json .travis.yml | json_pp | bat -l json ``` 비인쇄 문자 ν‘œμ‹œ 및 κ°•μ‘°ν•˜κΈ° ```bash > bat -A /etc/hosts ``` `cat` λŒ€μ‹  μ‚¬μš©ν•˜κΈ°: ```bash bat > note.md # quickly create a new file bat header.md content.md footer.md > document.md bat -n main.rs # show line numbers (only) bat f - g # output 'f', then stdin, then 'g'. ``` ### λ‹€λ₯Έ 도ꡬ듀과 ν†΅ν•©ν•˜κΈ° #### `fzf` `bat`을 [`fzf`](https://github.com/junegunn/fzf)의 ν”„λ¦¬λ·°λ‘œ μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄μ„œλŠ” `bat`의 `--color=always` μ˜΅μ…˜μœΌλ‘œ 항상 컬러 좜λ ₯이 λ‚˜μ˜€κ²Œ ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ˜ν•œ `--line-range` μ˜΅μ…˜μœΌλ‘œ κΈ΄ 파일의 λ‘œλ“œ μ‹œκ°„μ„ μ œν•œν•  수 μžˆμŠ΅λ‹ˆλ‹€: ```bash fzf --preview 'bat --color=always --style=numbers --line-range=:500 {}' ``` 더 λ§Žμ€ μ •λ³΄λŠ” [`fzf`의 `README`](https://github.com/junegunn/fzf#preview-window)λ₯Ό μ°Έκ³ ν•˜μ„Έμš”. #### `find`와 `fd` `find`의 `-exec` μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ—¬ λͺ¨λ“  검색 κ²°κ³Όλ₯Ό `bat`둜 미리 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€: ```bash find … -exec bat {} + ``` [`fd`](https://github.com/sharkdp/fd)λ₯Ό μ‚¬μš©ν•˜λŠ” 경우, `-X`/`--exec-batch` μ˜΅μ…˜μ„ μ΄μš©ν•˜μ—¬ λ™μΌν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€: ```bash fd … -X bat ``` #### `ripgrep` [`batgrep`](https://github.com/eth-p/bat-extras/blob/master/doc/batgrep.md)을 톡해 `bat`둜 [`ripgrep`](https://github.com/BurntSushi/ripgrep)의 검색 κ²°κ³Όλ₯Ό 좜λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ```bash batgrep needle src/ ``` #### `tail -f` `bat`와 `tail -f`λ₯Ό ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ μ£Όμ–΄μ§„ νŒŒμΌμ„ 문법 κ°•μ‘°ν•˜λ©° μ§€μ†μ μœΌλ‘œ λͺ¨λ‹ˆν„°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ```bash tail -f /var/log/pacman.log | bat --paging=never -l log ``` 참고둜 이 μž‘μ—…μ„ ν•˜λ €λ©΄ νŽ˜μ΄μ§• κΈ°λŠ₯을 κΊΌμ•Ό ν•©λ‹ˆλ‹€. λ˜ν•œ 이 경우 문법을 μžλ™ 감지할 수 μ—†κΈ° λ•Œλ¬Έμ—, μ μš©ν•  문법을 직접 μ§€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€ (`-l log`). #### `git` `bat`κ³Ό `git show`λ₯Ό ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ μ£Όμ–΄μ§„ 파일의 이전 버전을 μ˜¬λ°”λ₯Έ 문법 κ°•μ‘°λ‘œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€: ```bash git show v0.6.0:src/main.rs | bat -l rs ``` #### `git diff` `bat`κ³Ό `git diff`λ₯Ό ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ μˆ˜μ •λœ μ½”λ“œ μ£Όμœ„μ˜ 쀄듀을 μ˜¬λ°”λ₯Έ 문법 κ°•μ‘°λ‘œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€: ```bash batdiff() { git diff --name-only --diff-filter=d | xargs bat --diff } ``` 이것을 λ³„λ„μ˜ λ„κ΅¬λ‘œ μ“°κ³  μ‹Άλ‹€λ©΄ [`bat-extras`](https://github.com/eth-p/bat-extras)의 `batdiff`λ₯Ό 확인해 λ³΄μ„Έμš”. Gitκ³Ό diff의 더 λ§Žμ€ 지원을 μ›ν•œλ‹€λ©΄ [`delta`](https://github.com/dandavison/delta)λ₯Ό 확인해 λ³΄μ„Έμš”. #### `xclip` `bat` 좜λ ₯에 쀄 λ²ˆν˜Έμ™€ Git μˆ˜μ • 내역이 ν¬ν•¨λ˜μ–΄μ„œ 파일의 λ‚΄μš©μ„ λ³΅μ‚¬ν•˜κΈ° μ–΄λ €μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€. 이 κ²½μš°μ—λŠ” `bat`의 `-p`/`--plain` μ˜΅μ…˜μ„ μ‚¬μš©ν•˜κ±°λ‚˜ κ°„λ‹¨νžˆ `xclip`으둜 좜λ ₯을 μ—°κ²°(pipe)ν•˜λ©΄ λ©λ‹ˆλ‹€: ```bash bat main.cpp | xclip ``` `bat`λŠ” 좜λ ₯이 우회되고 μžˆλ‹€λŠ” 것을 κ°μ§€ν•˜μ—¬ 파일 λ‚΄μš© κ·ΈλŒ€λ‘œλ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€. #### `man` `MANPAGER` ν™˜κ²½ λ³€μˆ˜ 섀정을 톡해 `bat`을 `man`의 컬러 νŽ˜μ΄μ €(pager)둜 μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€. ```bash export MANPAGER="sh -c 'col -bx | bat -l man -p'" man 2 select ``` (Debianμ΄λ‚˜ Ubuntuλ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ `bat`을 `batcat`으둜 μΉ˜ν™˜ν•˜μ„Έμš”.) 포팻 λ¬Έμ œκ°€ λ°œμƒν•œλ‹€λ©΄, `MANROFFOPT="-c"`을 써야 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 κΈ°λŠ₯을 ν¬ν•¨ν•œ μƒˆλ‘œμš΄ λͺ…λ Ήμ–΄λ₯Ό μ„ ν˜Έν•œλ‹€λ©΄, [`batman`](https://github.com/eth-p/bat-extras/blob/master/doc/batman.md)을 μ“Έ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 참고둜 [Manpage 문법](../assets/syntaxes/Manpage.sublime-syntax)은 λ³Έ μ €μž₯μ†Œμ—μ„œ 개발 쀑에 있으며, 아직 더 손봐야 ν•©λ‹ˆλ‹€. λ˜ν•œ, μ΄λŠ” Mandoc의 `man` κ΅¬ν˜„μ—μ„œ [μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€](https://github.com/sharkdp/bat/issues/1145). #### `prettier` / `shfmt` / `rustfmt` [`prettybat`](https://github.com/eth-p/bat-extras/blob/master/doc/prettybat.md) μŠ€ν¬λ¦½νŠΈλŠ” μ½”λ“œλ₯Ό ν¬λ§·ν•˜κ³  `bat`으둜 좜λ ₯ν•˜λŠ” 래퍼(wrapper)μž…λ‹ˆλ‹€. ## μ„€μΉ˜ [![Packaging status](https://repology.org/badge/vertical-allrepos/bat-cat.svg?columns=3&exclude_unsupported=1)](https://repology.org/project/bat-cat/versions) ### Ubuntuμ—μ„œ (`apt` μ‚¬μš©) *... 그리고 λ‹€λ₯Έ Debian 기반의 Linux λ°°ν¬νŒλ“€μ—μ„œ.* `bat`은 [Ubuntu](https://packages.ubuntu.com/eoan/bat)와 [Debian](https://packages.debian.org/sid/bat) νŒ¨ν‚€μ§€ 배포 과정에 λ„μž…λ˜λŠ” 쀑이며, Eoan 19.10 λ²„μ „μ˜ Ubuntuμ—μ„œλΆ€ν„° μ œκ³΅λ©λ‹ˆλ‹€. ν˜„μž¬ Debianμ—μ„œλŠ” λΆˆμ•ˆμ •ν•œ "Sid" λΈŒλžœμΉ˜μ—μ„œλ§Œ `bat`이 μ œκ³΅λ©λ‹ˆλ‹€. λ§Œμ•½ μΆ©λΆ„νžˆ μ΅œμ‹  λ²„μ „μ˜ Ubuntu/Debian이 μ„€μΉ˜λ˜μ–΄ μžˆλ‹€λ©΄ κ°„λ‹¨νžˆ λ‹€μŒμ„ μ‹€ν–‰ν•˜μ„Έμš”: ```bash apt install bat ``` **μ€‘μš”**: λ§Œμ•½ `bat`을 이와 같이 μ„€μΉ˜ν•œλ‹€λ©΄, ([λ‹€λ₯Έ νŒ¨ν‚€μ§€μ™€μ˜ 이름 좩돌](https://github.com/sharkdp/bat/issues/982)둜 μΈν•˜μ—¬) `bat` λŒ€μ‹ μ— `batcat`μ΄λΌλŠ” μ΄λ¦„μ˜ μ‹€ν–‰ 파일둜 μ„€μΉ˜λ  수 μžˆμŒμ„ μ°Έκ³ ν•˜μ„Έμš”. 이에 λ”°λ₯Έ λ¬Έμ œλ“€κ³Ό λ‹€λ₯Έ λ°°ν¬νŒλ“€κ³Όμ˜ 일관성을 μœ„ν•˜μ—¬ `bat -> batcat` symlink ν˜Ήμ€ aliasλ₯Ό μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€: ``` bash mkdir -p ~/.local/bin ln -s /usr/bin/batcat ~/.local/bin/bat ``` ### Ubuntuμ—μ„œ (κ°€μž₯ μ΅œμ‹  `.deb` νŒ¨ν‚€μ§€λ“€ μ‚¬μš©) *... 그리고 λ‹€λ₯Έ Debian 기반의 Linux λ°°ν¬νŒλ“€μ—μ„œ.* λ§Œμ•½ μ—¬λŸ¬λΆ„μ΄ μ„€μΉ˜ν•œ Ubuntu/Debian에 νŒ¨ν‚€μ§€κ°€ λ°°ν¬λ˜μ§€ μ•Šκ±°λ‚˜ κ°€μž₯ μ΅œμ‹  릴리즈된 `bat`을 μ›ν•œλ‹€λ©΄, [릴리즈 νŽ˜μ΄μ§€](https://github.com/sharkdp/bat/releases)μ—μ„œ λ‹€μŒκ³Ό 같이 `.deb` νŒ¨ν‚€μ§€λ₯Ό λ°›μ•„ μ„€μΉ˜ν•˜μ„Έμš”: ```bash sudo dpkg -i bat_0.18.3_amd64.deb # adapt version number and architecture ``` ### Alpine Linuxμ—μ„œ μ μ ˆν•œ μ €μž₯μ†Œκ°€ ν™œμ„±ν™”λ˜μ–΄ μžˆλ‹€λ©΄, 곡식 μ†ŒμŠ€λ₯Ό 톡해 [`bat` νŒ¨ν‚€μ§€](https://pkgs.alpinelinux.org/packages?name=bat)λ₯Ό μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€: ```bash apk add bat ``` ### Arch Linuxμ—μ„œ 곡식 μ†ŒμŠ€λ₯Ό 톡해 [`bat` νŒ¨ν‚€μ§€](https://www.archlinux.org/packages/extra/x86_64/bat/)λ₯Ό μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€: ```bash pacman -S bat ``` ### Fedoraμ—μ„œ 곡식 [Fedora λͺ¨λ“ˆ](https://docs.fedoraproject.org/en-US/modularity/using-modules/) μ €μž₯μ†Œμ—μ„œ [`bat` νŒ¨ν‚€μ§€](https://koji.fedoraproject.org/koji/packageinfo?packageID=27506)λ₯Ό μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€: ```bash dnf install bat ``` ### Funtoo Linuxμ—μ„œ dev-kit을 톡해 [`bat` νŒ¨ν‚€μ§€](https://github.com/funtoo/dev-kit/tree/1.4-release/sys-apps/bat)λ₯Ό μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€: ```bash emerge sys-apps/bat ``` ### Gentoo Linuxμ—μ„œ 곡식 μ†ŒμŠ€λ₯Ό 톡해 [`bat` νŒ¨ν‚€μ§€](https://packages.gentoo.org/packages/sys-apps/bat)λ₯Ό μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€: ```bash emerge sys-apps/bat ``` ### Void Linuxμ—μ„œ xbps-install을 μ΄μš©ν•΄ `bat`을 μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€: ```bash xbps-install -S bat ``` ### Termuxμ—μ„œ pkgλ₯Ό μ΄μš©ν•΄ `bat`을 μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€: ```bash pkg install bat ``` ### FreeBSDμ—μ„œ pkgλ₯Ό μ΄μš©ν•˜μ—¬ 미리 컴파일된 [`bat` νŒ¨ν‚€μ§€](https://www.freshports.org/textproc/bat)λ₯Ό μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€: ```bash pkg install bat ``` λ˜λŠ” FreeBSD ν¬νŠΈμ—μ„œ 직접 λΉŒλ“œν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€: ```bash cd /usr/ports/textproc/bat make install ``` ### nixλ₯Ό μ¨μ„œ [nix package manager](https://nixos.org/nix)λ₯Ό μ΄μš©ν•΄ `bat`을 μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€: ```bash nix-env -i bat ``` ### openSUSEμ—μ„œ zypperλ₯Ό μ΄μš©ν•΄ `bat`을 μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€: ```bash zypper install bat ``` ### snap νŒ¨ν‚€μ§€λ₯Ό μ¨μ„œ μ§€κΈˆμœΌλ‘œμ„œλŠ” μΆ”μ²œν•˜λŠ” snap νŒ¨ν‚€μ§€κ°€ μ—†μŠ΅λ‹ˆλ‹€. μ œκ³΅λ˜λŠ” νŒ¨ν‚€μ§€λ“€μ΄ μ‘΄μž¬ν•  μˆ˜λŠ” μžˆμ§€λ§Œ, κ³΅μ‹μ μœΌλ‘œ μ§€μ›λ˜μ§€ μ•ŠμœΌλ©° [문제](https://github.com/sharkdp/bat/issues/1519)κ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. ### macOS (λ˜λŠ” Linux)μ—μ„œ Homebrewλ₯Ό μ¨μ„œ [macOS의 Homebrew](https://formulae.brew.sh/formula/bat) λ˜λŠ” [Linux의 Homebrew](https://formulae.brew.sh/formula-linux/bat)λ₯Ό μ΄μš©ν•˜μ—¬ `bat`을 μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ```bash brew install bat ``` ### macOSμ—μ„œ MacPortsλ₯Ό μ¨μ„œ [MacPorts](https://ports.macports.org/port/bat/summary)λ₯Ό μ΄μš©ν•˜μ—¬ `bat`을 μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€: ```bash port install bat ``` ### Windowsμ—μ„œ Windowsμ—μ„œ `bat`을 μ„€μΉ˜ν•  수 μžˆλŠ” λͺ‡ κ°€μ§€ μ˜΅μ…˜λ“€μ΄ μžˆμŠ΅λ‹ˆλ‹€. λ¨Όμ € `bat`을 μ„€μΉ˜ν•œ ν›„, ["Windowsμ—μ„œ `bat` μ‚¬μš©ν•˜κΈ°"](#windowsμ—μ„œ-bat-μ‚¬μš©ν•˜κΈ°) μ„Ήμ…˜μ„ μ‚΄νŽ΄λ³΄μ„Έμš”. #### μ „μ œ 쑰건 [Visual C++ 재배포 κ°€λŠ₯](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. #### Chocolateyλ₯Ό μ¨μ„œ [Chocolatey](https://chocolatey.org/packages/Bat)λ₯Ό μ΄μš©ν•΄ `bat`을 μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€: ```bash choco install bat ``` #### Scoop을 μ¨μ„œ [scoop](https://scoop.sh/)을 μ΄μš©ν•΄ `bat`을 μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€: ```bash scoop install bat ``` #### 사전 λΉŒλ“œλœ λ°”μ΄λ„ˆλ¦¬λ“€λ‘œ [릴리즈 νŽ˜μ΄μ§€](https://github.com/sharkdp/bat/releases)μ—μ„œ 사전 λΉŒλ“œλœ λ°”μ΄λ„ˆλ¦¬λ₯Ό λ‹€μš΄λ°›μ„ 수 μžˆμŠ΅λ‹ˆλ‹€. [Visual C++ 재배포 κ°€λŠ₯](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. ### λ°”μ΄λ„ˆλ¦¬λ“€λ‘œ [릴리즈 νŽ˜μ΄μ§€](https://github.com/sharkdp/bat/releases)μ—μ„œ λ‹€μ–‘ν•œ μ•„ν‚€ν…μ²˜λ₯Ό μœ„ν•΄ 사전 λΉŒλ“œλœ 버전듀을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. 정적 링크 λ°”μ΄λ„ˆλ¦¬λ“€μ€ 파일 이름에 `musl` 이 ν¬ν•¨λœ μ•„μΉ΄μ΄λΈŒλ“€μ„ ν™•μΈν•˜μ„Έμš”. ### μ†ŒμŠ€μ—μ„œ `bat`의 μ†ŒμŠ€λ₯Ό λΉŒλ“œν•˜κΈ° μœ„ν•΄μ„œλŠ”, Rust 1.74.0 이상이 ν•„μš”ν•©λ‹ˆλ‹€. `cargo`λ₯Ό μ΄μš©ν•΄ μ „λΆ€ λΉŒλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€: ```bash cargo install --locked bat ``` 참고둜 man νŽ˜μ΄μ§€λ‚˜ μ…Έ μžλ™ μ™„μ„± 파일과 같은 λΆ€κ°€ νŒŒμΌλ“€μ€ 이 λ°©λ²•μœΌλ‘œ μ„€μΉ˜λ  수 μ—†μŠ΅λ‹ˆλ‹€. 이것듀은 `cargo`에 μ˜ν•΄ 생성이 되고 (`build` λ°‘μ˜) cargo 타켓 ν΄λ”μ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€. ## μ‚¬μš©μžν™” ### 문법 κ°•μ‘° ν…Œλ§ˆ `bat --list-themes`을 μ‚¬μš©ν•˜μ—¬ μ‚¬μš© κ°€λŠ₯ν•œ 문법 κ°•μ‘° ν…Œλ§ˆλ“€μ˜ λͺ©λ‘μ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. `TwoDark` ν…Œλ§ˆλ₯Ό μ„ νƒν•˜λ €λ©΄, `--theme=TwoDark` μ˜΅μ…˜κ³Ό ν•¨κ»˜ `bat`을 μ‚¬μš©ν•˜κ±°λ‚˜ `BAT_THEME` ν™˜κ²½ λ³€μˆ˜λ₯Ό `TwoDark`둜 μ„€μ •ν•˜μ„Έμš”. μ…Έ μ‹œμž‘ νŒŒμΌμ— `export BAT_THEME="TwoDark"` λ₯Ό μ •μ˜ν•΄ 영ꡬ적으둜 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 밖에 `bat`의 [μ„€μ • 파일](#μ„€μ •-파일)을 μ΄μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ λ‹€λ₯Έ ν…Œλ§ˆλ“€μ„ μ‚¬μš©ν•˜μ—¬ νŠΉμ • νŒŒμΌμ„ 보고 μ‹Άλ‹€λ©΄, λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€(이 경우 [`fzf`](https://github.com/junegunn/fzf)κ°€ ν•„μš”ν•©λ‹ˆλ‹€.) ```bash bat --list-themes | fzf --preview="bat --theme={} --color=always /path/to/file" ``` `bat`은 기본적으둜 μ–΄λ‘μš΄ 배경에 μ ν•©ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 밝은 배경의 터미널을 μ‚¬μš©ν•œλ‹€λ©΄ `GitHub`μ΄λ‚˜ `OneHalfLight`κ³Ό 같은 ν…Œλ§ˆκ°€ 더 잘 μ–΄μšΈλ¦½λ‹ˆλ‹€. μ•„λž˜ [μƒˆλ‘œμš΄ ν…Œλ§ˆ μΆ”κ°€ν•˜κΈ°](#μƒˆλ‘œμš΄-ν…Œλ§ˆ-μΆ”κ°€ν•˜κΈ°) μ„Ήμ…˜μ— 따라 μ»€μŠ€ν…€ ν…Œλ§ˆλ₯Ό μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. ### 8λΉ„νŠΈ ν…Œλ§ˆ `bat`은 트루컬러 지원이 λ˜λ”λΌλ„ 항상 [8λΉ„νŠΈ 색상](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors)을 μ‚¬μš©ν•˜λŠ” μ„Έ 개의 ν…Œλ§ˆκ°€ μžˆμŠ΅λ‹ˆλ‹€. - `ansi`λŠ” μ–΄λ–€ ν„°λ―Έλ„μ—μ„œλ„ λ¬΄λ‚œν•˜κ²Œ λ³΄μž…λ‹ˆλ‹€. μ΄λŠ” 3λΉ„νŠΈ 색상을 μ‚¬μš©ν•©λ‹ˆλ‹€: κ²€μ •, λΉ¨κ°•, 녹색, λ…Έλž‘, νŒŒλž‘, λ§ˆμ  νƒ€, μ‹œμ•ˆ, ν•˜μ–‘. - `base16`은 [base16](https://github.com/chriskempson/base16) 터미널 ν…Œλ§ˆλ₯Ό μœ„ν•΄ λ””μžμΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” [base16 μŠ€νƒ€μΌ κ°€μ΄λ“œλΌμΈ](https://github.com/chriskempson/base16/blob/master/styling.md)에 따라 4λΉ„νŠΈ 색상(3λΉ„νŠΈ 색상에 밝은 λ³€ν˜• μΆ”κ°€)을 μ‚¬μš©ν•©λ‹ˆλ‹€. - `base16-256`λŠ” [base16-shell](https://github.com/chriskempson/base16-shell)을 μœ„ν•΄ λ””μžμΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 16λΆ€ν„° 21의 일뢀 밝은 색상을 8λΉ„νŠΈ μƒ‰μƒμœΌλ‘œ λŒ€μΉ˜ν•©λ‹ˆλ‹€. 단지 256-색상 터미널을 μ“°μ§€λ§Œ base16-shell을 μ“°μ§€ μ•ŠλŠ”λ‹€κ³  ν•΄μ„œ 이것을 μ‚¬μš©ν•˜μ§€ **λ§ˆμ‹­μ‹œμ˜€**. 이듀 ν…Œλ§ˆλŠ” 더 μ œν•œμ μ΄μ§€λ§Œ, 트루컬러 ν…Œλ§ˆμ— λΉ„ν•΄ 두 μž₯점이 μžˆμŠ΅λ‹ˆλ‹€: - 이듀은 3λΉ„νŠΈ ν˜Ήμ€ 4λΉ„νŠΈ 색상을 μ“°λŠ” λ‹€λ₯Έ 터미널 μ†Œν”„νŠΈμ›¨μ–΄μ™€ 더 잘 μ–΄μšΈλ¦½λ‹ˆλ‹€. - λ§Œμ•½ 터미널 ν…Œλ§ˆλ₯Ό λ°”κΎΌλ‹€λ©΄, 이미 ν™”λ©΄ μƒμ˜ `bat`의 좜λ ₯도 이에 λ§žμΆ”μ–΄ μ—…λ°μ΄νŠΈλ©λ‹ˆλ‹€. ### 좜λ ₯ μŠ€νƒ€μΌ `--style` μ˜΅μ…˜μ„ μ΄μš©ν•˜λ©΄ `bat`의 좜λ ₯ λͺ¨μ–‘을 μ‘°μ ˆν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, `--style=numbers,changes`λ₯Ό 톡해 Git λ³€κ²½λΆ„κ³Ό 쀄 λ²ˆν˜ΈλŠ” 좜λ ₯ν•˜μ§€λ§Œ κ²©μžμ™€ 파일 ν—€λ”λŠ” 좜λ ₯ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. `BAT_STYLE` ν™˜κ²½ λ³€μˆ˜λ₯Ό μ •μ˜ν•˜μ—¬ μ΄λŸ¬ν•œ μˆ˜μ •μ„ 영ꡬ적으둜 ν•˜κ±°λ‚˜ `bat`의 [μ„€μ • 파일](#μ„€μ •-파일)을 μ‚¬μš©ν•˜μ„Έμš”. ### μƒˆλ‘œμš΄ 문법 / μ–Έμ–΄ μ •μ˜ μΆ”κ°€ν•˜κΈ° λ§Œμ•½ `bat`μ—μ„œ νŠΉμ • 문법이 μ§€μ›λ˜μ§€ μ•Šμ„ 경우, λ‹€μŒμ˜ 절차λ₯Ό 톡해 ν˜„μž¬ `bat` μ„€μΉ˜λ³Έμ— μƒˆλ‘œμš΄ 문법을 μ‰½κ²Œ μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. `bat`은 문법 κ°•μ‘°λ₯Ό μœ„ν•΄ ν›Œλ₯­ν•œ [`syntect`](https://github.com/trishume/syntect/) 라이브러리λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. `syntect`λŠ” μž„μ˜μ˜ [Sublime Text의 `.sublime-syntax` 파일](https://www.sublimetext.com/docs/3/syntax.html)κ³Ό ν…Œλ§ˆλ₯Ό 읽을 수 μžˆμŠ΅λ‹ˆλ‹€. [Package Control](https://packagecontrol.io/)에 Sublime 문법 νŒ¨ν‚€μ§€λ₯Ό μ°ΎλŠ” 방법이 잘 μ •λ¦¬λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 일단 문법을 μ°Ύμ•˜λ‹€λ©΄: 1. 문법 μ •μ˜ νŒŒμΌλ“€μ„ 넣을 폴더λ₯Ό λ§Œλ“­λ‹ˆλ‹€: ```bash mkdir -p "$(bat --config-dir)/syntaxes" cd "$(bat --config-dir)/syntaxes" # Put new '.sublime-syntax' language definition files # in this folder (or its subdirectories), for example: git clone https://github.com/tellnobody1/sublime-purescript-syntax ``` 2. 이제 λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό 톡해 νŒŒμΌλ“€μ„ νŒŒμ‹±(parse)ν•˜μ—¬ λ°”μ΄λ„ˆλ¦¬ μΊμ‹œλ₯Ό λ§Œλ“­λ‹ˆλ‹€. ```bash bat cache --build ``` 3. λ§ˆμ§€λ§‰μœΌλ‘œ, `bat --list-languages`둜 μƒˆλ‘œ μΆ”κ°€ν•œ μ–Έμ–΄κ°€ μ‚¬μš© κ°€λŠ₯ν•œμ§€ ν™•μΈν•©λ‹ˆλ‹€. λ§Œμ•½ κΈ°λ³Έ μ„€μ •μœΌλ‘œ λŒμ•„κ°ˆ 일이 생긴닀면, λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μ΄μš©ν•©λ‹ˆλ‹€: ```bash bat cache --clear ``` 4. λ§Œμ•½ νŠΉμ • 문법이 `bat`에 기본적으둜 ν¬ν•¨λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•œλ‹€λ©΄, λ°©μΉ¨κ³Ό 절차λ₯Ό [μ—¬κΈ°](../doc/assets.md)μ„œ 읽은 ν›„ "문법 μš”μ²­(syntax request)"을 μ—΄μ–΄ μ£Όμ„Έμš”: [문법 μš”μ²­ν•˜κΈ°](https://github.com/sharkdp/bat/issues/new?labels=syntax-request&template=syntax_request.md). ### μƒˆλ‘œμš΄ ν…Œλ§ˆ μΆ”κ°€ν•˜κΈ° 이 과정은 μƒˆλ‘œμš΄ 문법 μ •μ˜ μΆ”κ°€ 방식과 맀우 λΉ„μŠ·ν•©λ‹ˆλ‹€. λ¨Όμ €, μƒˆλ‘œμš΄ 문법 κ°•μ‘° ν…Œλ§ˆ 폴더λ₯Ό λ§Œλ“­λ‹ˆλ‹€. ```bash mkdir -p "$(bat --config-dir)/themes" cd "$(bat --config-dir)/themes" # Download a theme in '.tmTheme' format, for example: git clone https://github.com/greggb/sublime-snazzy # Update the binary cache bat cache --build ``` λ§ˆμ§€λ§‰μœΌλ‘œ `bat --list-themes`을 톡해 μƒˆλ‘œ μΆ”κ°€ν•œ ν…Œλ§ˆλ“€μ΄ μ‚¬μš© κ°€λŠ₯ν•œμ§€ ν™•μΈν•©λ‹ˆλ‹€. ### 파일 νƒ€μž… 섀정을 μΆ”κ°€ν•˜κ±°λ‚˜ λ³€κ²½ν•˜κΈ° μƒˆλ‘œμš΄ 파일 이름 νŒ¨ν„΄μ„ μΆ”κ°€ν•˜λ €λ©΄ (ν˜Ήμ€ 이미 μ‘΄μž¬ν•˜λŠ” 것을 λ³€κ²½ν•˜λ €λ©΄) `--map-syntax` μ»€λ§¨λ“œ 라인 μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ„Έμš”. 이 μ˜΅μ…˜μ€ `pattern:syntax` 꼴의 인자λ₯Ό λ°›μŠ΅λ‹ˆλ‹€. μ΄λ•Œ `pattern`은 파일 이름과 μ ˆλŒ€ 파일 경둜λ₯Ό λ§€μΉ˜ν•  κΈ€λ‘œλΈŒ(glob) νŒ¨ν„΄μž…λ‹ˆλ‹€. `syntax` 뢀뢄은 μ§€μ›λ˜λŠ” μ–Έμ–΄μ˜ 전체 μ΄λ¦„μž…λ‹ˆλ‹€ (`bat --list-languages`λ₯Ό 톡해 κ°œμš”λ₯Ό ν™•μΈν•˜μ„Έμš”). μ°Έκ³ : 이 μ˜΅μ…˜μ€ μ»€λ§¨λ“œ 라인에 λ„˜κ²¨ μ£ΌλŠ” κ²ƒλ³΄λ‹€λŠ” `bat`의 μ„€μ • νŒŒμΌμ— λ„£λŠ” 것이 쒋을 κ²ƒμž…λ‹ˆλ‹€ (μ•„λž˜λ₯Ό λ³΄μ„Έμš”). μ˜ˆμ‹œ: "INI" 문법 κ°•μ‘°λ₯Ό `.conf` 파일 ν™•μž₯자의 λͺ¨λ“  νŒŒμΌμ— μ μš©ν•˜λ €λ©΄, λ‹€μŒμ„ μ‚¬μš©ν•˜μ„Έμš”: ```bash --map-syntax='*.conf:INI' ``` μ˜ˆμ‹œ: `.ignore`(μ™„μ „ 일치)μ΄λΌλŠ” μ΄λ¦„μ˜ λͺ¨λ“  νŒŒμΌμ„ "Git Ignore" λ¬Έλ²•μœΌλ‘œ μ—΄λ €λ©΄, λ‹€μŒμ„ μ‚¬μš©ν•˜μ„Έμš”: ```bash --map-syntax='.ignore:Git Ignore' ``` μ˜ˆμ‹œ: `/etc/apache2`의 ν•˜μœ„ 폴더듀에 μžˆλŠ” λͺ¨λ“  `.conf` νŒŒμΌλ“€μ„ "Apache Conf" λ¬Έλ²•μœΌλ‘œ μ—΄λ €λ©΄, λ‹€μŒμ„ μ‚¬μš©ν•˜μ„Έμš” (이 λŒ€μ‘(mapping)은 이미 λ‚΄μž₯λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€): ```bash --map-syntax='/etc/apache2/**/*.conf:Apache Conf' ``` ### λ‹€λ₯Έ νŽ˜μ΄μ € μ‚¬μš©ν•˜κΈ° `bat`은 ν™˜κ²½ λ³€μˆ˜ `PAGER`에 λͺ…μ‹œλœ νŽ˜μ΄μ €λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 이 λ³€μˆ˜κ°€ μ •μ˜λ˜μ–΄ μžˆμ§€ μ•Šλ‹€λ©΄, `less`κ°€ 기본으둜 μ‚¬μš©λ©λ‹ˆλ‹€. λ§Œμ•½ λ‹€λ₯Έ νŽ˜μ΄μ €λ₯Ό μ‚¬μš©ν•˜κ³  μ‹Άλ‹€λ©΄, `PAGER` λ³€μˆ˜λ₯Ό μˆ˜μ •ν•˜κ±°λ‚˜ `BAT_PAGER` ν™˜κ²½ λ³€μˆ˜λ₯Ό μ„€μ •ν•˜μ—¬ `PAGER`의 섀정을 μ˜€λ²„λΌμ΄λ“œ(override)ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ μ»€λ§¨λ“œλΌμΈ μΈμˆ˜λ“€μ„ νŽ˜μ΄μ €μ—κ²Œ λ„˜κ²¨ μ£Όλ €λ©΄, `PAGER`/`BAT_PAGER` λ³€μˆ˜λ‘œ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€: ```bash export BAT_PAGER="less -RF" ``` ν™˜κ²½ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” λŒ€μ‹ , `bat`의 [μ„€μ • 파일](#μ„€μ •-파일)둜 νŽ˜μ΄μ €λ₯Ό μ„€μ •ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€ (`--pager` μ˜΅μ…˜). **μ°Έκ³ **: 기본적으둜, νŽ˜μ΄μ €κ°€ `less`둜 μ„€μ •λ˜μ–΄ μžˆλ‹€λ©΄ (그리고 μ»€λ§¨λ“œ 라인 μ˜΅μ…˜μ΄ μ§€μ •λ˜μ–΄ μžˆμ§€ μ•Šλ‹€λ©΄), `bat`은 λ‹€μŒ μ˜΅μ…˜λ“€μ„ νŽ˜μ΄μ €λ‘œ λ„˜κ²¨μ€λ‹ˆλ‹€: `-R`/`--RAW-CONTROL-CHARS`, `-F`/`--quit-if-one-screen` 그리고 `-X`/`--no-init`. λ§ˆμ§€λ§‰ μ˜΅μ…˜(`-X`)은 530 이전 λ²„μ „μ˜ `less`μ—λ§Œ μ‚¬μš©λ©λ‹ˆλ‹€. `-R` μ˜΅μ…˜μ€ ANSI 색상을 μ˜¬λ°”λ₯΄κ²Œ ν•΄μ„ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•©λ‹ˆλ‹€. 두 번째 μ˜΅μ…˜(`-F`)은 좜λ ₯ 크기가 ν„°λ―Έλ„μ˜ μ„Έλ‘œ 크기보닀 μž‘μ„ 경우 lessκ°€ μ¦‰μ‹œ μ’…λ£Œλ˜λ„λ‘ ν•©λ‹ˆλ‹€. μ΄λŠ” μž‘μ€ νŒŒμΌμ„ λ‹€λ£° λ•Œ νŽ˜μ΄μ €λ₯Ό μ’…λ£Œν•˜κΈ° μœ„ν•΄ `q`λ₯Ό λˆ„λ₯Ό ν•„μš” μ—†μ–΄μ„œ νŽΈλ¦¬ν•©λ‹ˆλ‹€. μ„Έ 번째 μ˜΅μ…˜(`-X`)λŠ” μ˜ˆμ „ λ²„μ „μ˜ `less`에 μžˆλŠ” `--quit-if-one-screen` κΈ°λŠ₯의 버그λ₯Ό 고치기 μœ„ν•΄ ν•„μš”ν•©λ‹ˆλ‹€. μ•ˆνƒ€κΉκ²Œλ„, μ΄λŠ” `less`의 마우슀 휠 지원과 ν˜Έν™˜λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. `less`의 μ˜ˆμ „ λ²„μ „μ—μ„œ 마우슀 휠 κΈ°λŠ₯을 ν™œμ„±ν™”ν•˜λ €λ©΄, `-R` μ˜΅μ…˜μ„ λ„˜κ²¨μ£Όμ„Έμš” (μœ„μ˜ 예제처럼, 이 μ˜΅μ…˜μ€ quit-if-one-screen κΈ°λŠ₯을 λΉ„ν™œμ„±ν™”ν•©λ‹ˆλ‹€). less 530κ³Ό 이후 λ²„μ „μ—μ„œλŠ” κ·ΈλŒ€λ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ### λ“€μ—¬μ“°κΈ° `bat`은 νŽ˜μ΄μ €μ— μ˜μ‘΄ν•˜μ§€ μ•Šκ³  탭을 4 슀페이슀둜 ν™•μž₯ν•©λ‹ˆλ‹€. 이λ₯Ό λ³€κ²½ν•˜λ €λ©΄ κ°„λ‹¨νžˆ `--tabs` μΈμžμ— ν‘œμ‹œλ˜κΈ°λ₯Ό μ›ν•˜λŠ” 슀페이슀 개수λ₯Ό μΆ”κ°€ν•˜μ„Έμš”. **μ°Έκ³ **: (`bat`의 `--pager` 인자 ν˜Ήμ€ `less`의 `LESS` ν™˜κ²½ λ³€μˆ˜λ₯Ό 톡해) νŽ˜μ΄μ €μ˜ νƒ­ 길이λ₯Ό μ§€μ •ν•˜λŠ” 것은 νš¨κ³Όκ°€ 없을 것인데, μ΄λŠ” νŽ˜μ΄μ €κ°€ 이미 슀페이슀둜 ν™•μž₯된 탭을 λ°›κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 이 κΈ°λŠ₯은 μ‚¬μ΄λ“œλ°”μ— μ˜ν•œ λ“€μ—¬μ“°κΈ° 문제λ₯Ό νšŒν”Όν•˜κΈ° μœ„ν•΄ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€. `bat`을 `--tabs=0`κ³Ό ν•¨κ»˜ ν˜ΈμΆœν•˜λ©΄ 이λ₯Ό μ˜€λ²„λΌμ΄λ“œν•˜μ—¬ νŽ˜μ΄μ €κ°€ 탭을 μ²˜λ¦¬ν•˜κ²Œ ν•©λ‹ˆλ‹€. ### 닀크 λͺ¨λ“œ macOSμ—μ„œ 닀크 λͺ¨λ“œλ₯Ό μ‚¬μš©ν•˜κ³  μžˆλ‹€λ©΄, `bat`κ°€ OS ν…Œλ§ˆμ— 따라 λ‹€λ₯Έ ν…Œλ§ˆλ₯Ό μ‚¬μš©ν•˜λ„λ‘ ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜ μŠ€λ‹ˆνŽ«μ€ _닀크 λͺ¨λ“œ_μ—μ„œλŠ” `default` ν…Œλ§ˆλ₯Ό, _라이트 λͺ¨λ“œ_μ—μ„œλŠ” `GitHub` ν…Œλ§ˆλ₯Ό μ‚¬μš©ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. ```bash alias cat="bat --theme=\$(defaults read -globalDomain AppleInterfaceStyle &> /dev/null && echo default || echo GitHub)" ``` ## μ„€μ • 파일 `bat`λŠ” μ„€μ • νŒŒμΌλ‘œλ„ μ‚¬μš©μžν™” ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ„€μ • 파일의 μœ„μΉ˜λŠ” 운영 μ²΄μ œμ— 따라 λ‹€λ¦…λ‹ˆλ‹€. μ•„λž˜ μ»€λ§¨λ“œλ₯Ό 톡해 μ‹œμŠ€ν…œμ˜ κΈ°λ³Έ 경둜λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. ``` bat --config-file ``` λ˜λŠ”, `BAT_CONFIG_PATH` ν™˜κ²½ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ `bat`κ°€ μ„€μ • 파일의 κΈ°λ³Έ 경둜 μ΄μ™Έμ˜ μœ„μΉ˜λ₯Ό μ‚¬μš©ν•˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ```bash export BAT_CONFIG_PATH="/path/to/bat.conf" ``` κΈ°λ³Έ μ„€μ • νŒŒμΌμ€ `--generate-config-file` μ˜΅μ…˜μœΌλ‘œ 생성할 수 μžˆμŠ΅λ‹ˆλ‹€. ```bash bat --generate-config-file ``` ### 포맷 μ„€μ • νŒŒμΌμ€ λ‹¨μˆœνžˆ μ»€λ§¨λ“œ 라인 μΈμžλ“€μ˜ λ¦¬μŠ€νŠΈμž…λ‹ˆλ‹€. `bat --help`둜 κ°€λŠ₯ν•œ λͺ¨λ“  μ˜΅μ…˜κ³Ό 값듀을 ν™•μΈν•˜μ„Έμš”. μΆ”κ°€μ μœΌλ‘œ, 쀄 μ•žμ— `#` 문자λ₯Ό μΆ”κ°€ν•΄ 주석을 넣을 수 μžˆμŠ΅λ‹ˆλ‹€. μ„€μ • 파일 μ˜ˆμ‹œ: ```bash # "TwoDark" ν…Œλ§ˆ μ„€μ •ν•˜κΈ° --theme="TwoDark" # 쀄 번호, Git λ³€κ²½ λ‚΄μš©, 파일 헀더 보이기 (격자 없이) --style="numbers,changes,header" # ν„°λ―Έλ„μ—μ„œ 이타릭체 μ“°κΈ° (일뢀 ν„°λ―Έλ„μ—μ„œ 미지원) --italic-text=always # Arduino .ino νŒŒμΌμ— C++ 문법 μ“°κΈ° --map-syntax "*.ino:C++" ``` ## Windowsμ—μ„œ `bat` μ‚¬μš©ν•˜κΈ° `bat`λŠ” λŒ€λΆ€λΆ„μ˜ 경우 Windowsμ—μ„œ 기본적으둜 잘 μž‘λ™ν•˜μ§€λ§Œ, 일뢀 κΈ°λŠ₯은 좔가적인 ꡬ성이 ν•„μš”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. #### μ „μ œ 쑰건 [Visual C++ 재배포 κ°€λŠ₯](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. ### νŽ˜μ΄μ§• WindowsλŠ” `more` ν˜•μ‹μ˜ 맀우 μ œν•œλœ νŽ˜μ΄μ €λ§Œ ν¬ν•¨ν•©λ‹ˆλ‹€. Windows용 `less` λ°”μ΄λ„ˆλ¦¬λŠ” [곡식 ν™ˆνŽ˜μ΄μ§€](http://www.greenwoodsoftware.com/less/download.html)λ‚˜ [Chocolatey](https://chocolatey.org/packages/Less)λ₯Ό 톡해 λ‹€μš΄λ‘œλ“œ 받을 수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ 디렉터리 μ•ˆμ˜ λ°”μ΄λ„ˆλ¦¬λ₯Ό `PATH`에 λ„£κ±°λ‚˜ [ν™˜κ²½ λ³€μˆ˜λ‘œ μ •μ˜](#using-a-different-pager)ν•˜μ„Έμš”. [Chocolatey νŒ¨ν‚€μ§€](#on-windows)λŠ” `less`λ₯Ό μžλ™μœΌλ‘œ μ„€μΉ˜ν•©λ‹ˆλ‹€. ### 색상 Windows 10은 [v1511](https://en.wikipedia.org/wiki/Windows_10_version_history#Version_1511_(November_Update))λΆ€ν„° 기본적으둜 `conhost.exe`(Command Prompt)와 PowerShellμ—μ„œ 색상을 μ§€μ›ν•˜λ©°, μ΅œμ‹  λ²„μ „μ˜ bashμ—μ„œλ„ 색상을 μ§€μ›ν•©λ‹ˆλ‹€. 이전 λ²„μ „μ˜ Windowsμ—μ„œλŠ”, [ConEmu](https://conemu.github.io/)κ°€ ν¬ν•¨λœ [Cmder](http://cmder.net/)λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. **μ°Έκ³ :** Gitκ³Ό MSYS λ²„μ „μ˜ `less`λŠ” Windowsμ—μ„œ 색상을 μ˜¬λ°”λ₯΄κ²Œ ν•΄μ„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ νŽ˜μ΄μ €κ°€ μ„€μΉ˜λ˜μ–΄ μžˆμ§€ μ•Šμ€ 경우, `--paging=never`을 λ„˜κ²¨μ£Όκ±°λ‚˜ `BAT_PAGER`을 빈 λ¬Έμžμ—΄λ‘œ μ„€μ •ν•˜μ—¬ νŽ˜μ΄μ§•μ„ μ™„μ „νžˆ λΉ„ν™œμ„±ν™” ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ### Cygwin Windowsμ—μ„œμ˜ `bat`은 기본적으둜 Cygwin의 unix μŠ€νƒ€μΌ 경둜(`/cygdrive/*`)λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. Cygwin μ ˆλŒ€ 경둜λ₯Ό 인자둜 λ°›μ•˜μ„ λ•Œ, `bat`은 λ‹€μŒκ³Ό 같은 였λ₯˜λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€: `The system cannot find the path specified. (os error 3)` μ΄λŠ” wrapperλ₯Ό λ§Œλ“€κ±°λ‚˜ λ‹€μŒ ν•¨μˆ˜λ₯Ό `.bash_profile`에 μΆ”κ°€ν•˜μ—¬ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€: ```bash bat() { local index local args=("$@") for index in $(seq 0 ${#args[@]}) ; do case "${args[index]}" in -*) continue;; *) [ -e "${args[index]}" ] && args[index]="$(cygpath --windows "${args[index]}")";; esac done command bat "${args[@]}" } ``` ## 문제 ν•΄κ²° ### 터미널과 색상 `bat`은 ν„°λ―Έλ„μ˜ 트루컬러 지원 여뢀와 상관 없이 λ™μž‘ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λŒ€λΆ€λΆ„ 문법 κ°•μ‘° ν…Œλ§ˆμ˜ 색상은 8λΉ„νŠΈ 색상에 μ΅œμ ν™”λ˜μ–΄ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 24λΉ„νŠΈ 트루컬러 지원이 λ˜λŠ” 터미널(`terminator`, `konsole`, `iTerm2`, ...)을 μ‚¬μš©ν•˜λŠ” 것을 적극 ꢌμž₯ν•©λ‹ˆλ‹€. 트루컬러λ₯Ό μ§€μ›ν•˜λŠ” 터미널듀과 더 μžμ„Έν•œ μ •λ³΄λŠ” [이 κΈ€](https://gist.github.com/XVilka/8346728)μ—μ„œ 찾아보싀 수 μžˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©ν•˜κ³  μžˆλŠ” 트루컬러 ν„°λ―Έλ„μ—μ„œ `COLORTERM` λ³€μˆ˜λ₯Ό `truecolor` ν˜Ήμ€ `24bit`둜 μ„€μ •λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•˜μ„Έμš”. κ·Έλ ‡μ§€ μ•Šμ„ 경우, `bat`은 24λΉ„νŠΈ ν™•μž₯μ—΄(escape sequence)이 μ§€μ›λ˜λŠ”μ§€ μ—¬λΆ€λ₯Ό νŒλ‹¨ν•  수 μ—†μŠ΅λ‹ˆλ‹€ (그리고 8λΉ„νŠΈ 색상을 μ‚¬μš©ν•©λ‹ˆλ‹€). ### 쀄 λ²ˆν˜Έμ™€ κ²©μžκ°€ 잘 보이지 μ•ŠλŠ” 경우 λ‹€λ₯Έ ν…Œλ§ˆλ₯Ό μ‚¬μš©ν•΄ λ³΄μ„Έμš” (`bat --list-themes`μ—μ„œ λͺ©λ‘μ„ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€). `OneHalfDark`와 `OneHalfLight` ν…Œλ§ˆλŠ” 더 밝은 눈금과 μ„ μ˜ 색상을 μ‚¬μš©ν•©λ‹ˆλ‹€. ### 파일 인코딩 `bat`은 기본적으둜 UTF-8κ³Ό UTF-16을 μ§€μ›ν•©λ‹ˆλ‹€. λ‹€λ₯Έ λͺ¨λ“  μ’…λ₯˜μ˜ 파일 인코딩에 λŒ€ν•΄μ„œλŠ”, 일반적으둜 인코딩을 μžλ™μœΌλ‘œ νŒλ³„ν•˜λŠ” 방법이 μ—†κΈ° λ•Œλ¬Έμ— λ¨Όμ € UTF-8으둜 λ³€ν™˜ν•΄μ•Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ `iconv`λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ˜ˆμ‹œ: Latin-1(ISO-8859-1)둜 μΈμ½”λ”©λœ PHP νŒŒμΌμ€ λ‹€μŒκ³Ό 같이 μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€: ``` bash iconv -f ISO-8859-1 -t UTF-8 my-file.php | bat ``` μ°Έκ³ : `bat`으둜 문법 μžλ™ 감지가 λ˜μ§€ μ•ŠλŠ” κ²½μš°μ—λŠ” `-l`/`--language` μ˜΅μ…˜μ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ## 개발 ```bash # λͺ¨λ“  μ„œλΈŒλͺ¨λ“ˆμ„ λ°›κΈ° μœ„ν•΄ μž¬κ·€μ μœΌλ‘œ λ³΅μ œν•˜κΈ° git clone --recursive https://github.com/sharkdp/bat # (디버그 버전) λΉŒλ“œ cd bat cargo build --bins # λ‹¨μœ„ ν…ŒμŠ€νŠΈμ™€ 톡합 ν…ŒμŠ€νŠΈ μ‹€ν–‰ cargo test # (배포 버전) μ„€μΉ˜ cargo install --locked # μˆ˜μ •λœ 문법과 ν…Œλ§ˆκ°€ 적용된 bat λ°”μ΄λ„ˆλ¦¬ λΉŒλ“œ bash assets/create.sh cargo install --locked --force ``` `bat`의 pretty-printing κΈ°λŠ₯을 라이브러리둜 μ‚¬μš©ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ§Œλ“€κ³  μ‹Άλ‹€λ©΄, [API λ¬Έμ„œ](https://docs.rs/bat/)λ₯Ό μ‚΄νŽ΄λ³΄μ„Έμš”. 참고둜 `bat`에 라이브러리둜써 μ˜μ‘΄ν•œλ‹€λ©΄, `regex-onig`λ‚˜ `regex-fancy`λ₯Ό κΈ°λŠ₯으둜 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. ## κΈ°μ—¬ν•˜κΈ° [`CONTRIBUTING.md`](../CONTRIBUTING.md) κ°€μ΄λ“œλ₯Ό μ‚΄νŽ΄λ³΄μ„Έμš”. ## λ©”μΈν…Œμ΄λ„ˆλ“€ - [sharkdp](https://github.com/sharkdp) - [eth-p](https://github.com/eth-p) - [keith-hall](https://github.com/keith-hall) - [Enselic](https://github.com/Enselic) ## λ³΄μ•ˆ 취약점 λ§Œμ•½ `bat`의 취약점을 λ°œκ²¬ν•˜μ˜€λ‹€λ©΄, [David Peter](https://david-peter.de/)μ—κ²Œ λ©”μΌλ‘œ μ—°λ½μ£Όμ‹œκΈ° λ°”λžλ‹ˆλ‹€. ## ν”„λ‘œμ νŠΈ λͺ©ν‘œμ™€ λŒ€μ•ˆλ“€ `bat`은 λ‹€μŒκ³Ό 같은 λͺ©ν‘œλ₯Ό λ‹¬μ„±ν•˜λ €κ³  ν•©λ‹ˆλ‹€: - 아름닡고 λ°œμ „λœ 문법 κ°•μ‘° κΈ°λŠ₯ 제곡 - Git과의 연동을 ν†΅ν•œ 파일 λ³€κ²½ λ‚΄μš© 확인 - (POSIX) `cat`의 λŒ€μ²΄μ œ - μ‚¬μš©μž μΉœν™”μ μΈ μ»€λ§¨λ“œ 라인 μΈν„°νŽ˜μ΄μŠ€ 제곡 λΉ„μŠ·ν•œ ν”„λ‘œκ·Έλž¨λ“€μ„ μ°Ύκ³  μžˆλ‹€λ©΄ λ§Žμ€ λŒ€μ•ˆλ“€μ΄ μžˆμŠ΅λ‹ˆλ‹€. λΉ„κ΅λŠ” [이 λ¬Έμ„œ](../doc/alternatives.md)λ₯Ό μ°Έμ‘°ν•΄ μ£Όμ„Έμš”. ## λΌμ΄μ„ΌμŠ€ Copyright (c) 2018-2021 [bat-developers](https://github.com/sharkdp/bat). `bat`λŠ” μ—¬λŸ¬λΆ„μ˜ 선택에 따라 MIT λΌμ΄μ„ΌμŠ€ λ˜λŠ” Apache λΌμ΄μ„ΌμŠ€ 2.0의 쑰건에 따라 λ°°ν¬λ©λ‹ˆλ‹€. λΌμ΄μ„ΌμŠ€μ˜ 세뢀사항은 [LICENSE-APACHE](../LICENSE-APACHE)와 [LICENSE-MIT](../LICENSE-MIT)λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”. bat-0.25.0/doc/README-ru.md000064400000000000000000000703511046102023000131340ustar 00000000000000

bat - a cat clone with wings
Build Status license Version info
Клон ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ cat(1) с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ выдСлСния синтаксиса ΠΈ Git

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ возмоТности β€’ ИспользованиС β€’ Установка β€’ ΠšΠ°ΡΡ‚ΠΎΠΌΠΈΠ·Π°Ρ†ΠΈΡ β€’ Π¦Π΅Π»ΠΈ ΠΈ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹
[English] [δΈ­ζ–‡] [ζ—₯本θͺž] [ν•œκ΅­μ–΄] [Русский]

### Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ синтаксиса `bat` ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ синтаксиса для ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ³ΠΎ количСства языков программирования ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΈ: ![ΠŸΡ€ΠΈΠΌΠ΅Ρ€ выдСлСния синтаксиса](https://i.imgur.com/3FGy5tW.png) ### Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с Git `bat` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ `git`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ измСнСния Π² ΠΊΠΎΠ΄Π΅ (смотритС Π½Π° Π»Π΅Π²Ρ‹ΠΉ сайдбар): ![ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с Git](https://i.imgur.com/azUAzdx.png) ### ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π΅ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅ΠΌΡ‹Π΅ символы Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ `-A` / `--show-all` Ρ„Π»Π°Π³, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ символы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ: ![Π‘Ρ‚Ρ€ΠΎΠΊΠ° с Π½Π΅ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅ΠΌΡ‹ΠΌΠΈ символами](https://i.imgur.com/X0orYY9.png) ### АвтоматичСскоС Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ тСкста `bat` ΡƒΠΌΠ΅Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ Π² `less`, Ссли Π²Ρ‹Π²ΠΎΠ΄ Π½Π΅ помСщаСтся Π½Π° экранС ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ. ### ОбъСдинСниС Ρ„Π°ΠΉΠ»ΠΎΠ² О... Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ :wink:. Когда `bat` ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ Π½Π΅ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ пСрСнаправляСтС Π²Ρ‹Π²ΠΎΠ΄ Π² Ρ„Π°ΠΉΠ» ΠΈΠ»ΠΈ процСсс), ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° `cat` ΠΈ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ содСрТимоС Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ тСкст (Π±Π΅Π· подсвСтки синтаксиса). ## Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ВывСсти СдинствСнный Ρ„Π°ΠΉΠ» Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ ```bash > bat README.md ``` ΠžΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ сразу нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅ ```bash > bat src/*.rs ``` Π§ΠΈΡ‚Π°Π΅ΠΌ ΠΈΠ· stdin ΠΈ опрСдСляСм синтаксис автоматичСски (Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: это дСлаСтся ΠΏΠΎ Π·Π°Π³Π»Π°Π²Π½ΠΎΠΉ строкС Ρ„Π°ΠΉΠ»Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, `#!/bin/sh`) ```bash > curl -s https://sh.rustup.rs | bat ``` ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· stdin с явным ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ языка ```bash > yaml2json .travis.yml | json_pp | bat -l json ``` ВывСсти ΠΈ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π΅ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ символы ```bash > bat -A /etc/hosts ``` ИспользованиС Π² качСствС Π·Π°ΠΌΠ΅Π½Ρ‹ `cat` ```bash bat > note.md # ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ создаСм Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» bat header.md content.md footer.md > document.md bat -n main.rs # ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ количСство строк bat f - g # Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ 'f' Π² stdin, Π° ΠΏΠΎΡ‚ΠΎΠΌ 'g'. ``` ### Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°ΠΌΠΈ #### `find` ΠΈΠ»ΠΈ `fd` Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π»Π°Π³ `-exec` Π² `find`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΡ€Π΅Π²ΡŒΡŽ всСх Ρ„Π°ΠΉΠ»ΠΎΠ² Π² `bat` ```bash find … -exec bat {} + ``` Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ [`fd`](https://github.com/sharkdp/fd), примСняйтС для этого Ρ„Π»Π°Π³ `-X`/`--exec-batch`: ```bash fd … -X bat ``` #### `ripgrep` Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ [`batgrep`](https://github.com/eth-p/bat-extras/blob/master/doc/batgrep.md), `bat` ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован для Π²Ρ‹Π²ΠΎΠ΄Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° запроса [`ripgrep`](https://github.com/BurntSushi/ripgrep) ```bash batgrep needle src/ ``` #### `tail -f` `bat` ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован вмСстС с `tail -f`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ содСрТимоС Ρ„Π°ΠΉΠ»Π° с подсвСткой синтаксиса Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ```bash tail -f /var/log/pacman.log | bat --paging=never -l log ``` Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ пэйдТинг, Ρ‡Ρ‚ΠΎΠ±Ρ‹ это Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ явно ΡƒΠΊΠ°Π·Π°Π»ΠΈ синтаксис (`-l log`), Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ автоматичСски ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС. #### `git` Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ `bat` с `git show`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΡΡ‚Π°Ρ€ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Ρ„Π°ΠΉΠ»Π° с Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ синтаксиса: ```bash git show v0.6.0:src/main.rs | bat -l rs ``` ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ синтаксиса Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² `git diff` Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. Если Π²Π°ΠΌ это Π½ΡƒΠΆΠ½ΠΎ, посмотритС [`delta`](https://github.com/dandavison/delta). #### `xclip` НумСрация строк ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ затрудняСт ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ содСрТимого Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Π±ΡƒΡ„Π΅Ρ€ ΠΎΠ±ΠΌΠ΅Π½Π°. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с этим, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„Π»Π°Π³ `-p`/`--plain` ΠΈΠ»ΠΈ просто ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²ΡŒΡ‚Π΅ стандартный Π²Ρ‹Π²ΠΎΠ΄ Π² `xclip`: ```bash bat main.cpp | xclip ``` `bat` ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ тСкст Π±Π΅Π· выдСлСния синтаксиса. #### `man` `bat` ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован Π² Π²ΠΈΠ΄Π΅ выдСлСния Ρ†Π²Π΅Ρ‚Π° для `man`, для этого установитС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния `MANPAGER`: ```bash export MANPAGER="sh -c 'col -bx | bat -l man -p'" man 2 select ``` Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Π°ΠΌ понадобится Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ `MANROFFOPT="-c"`, Ссли Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ этой ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ [`batman`](https://github.com/eth-p/bat-extras/blob/master/doc/batman.md). ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ [синтаксис manpage](assets/syntaxes/02_Extra/Manpage.sublime-syntax) разрабатываСтся Π² этом Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ΠΈ всС Π΅Ρ‰Π΅ находится Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅. #### `prettier` / `shfmt` / `rustfmt` [`Prettybat`](https://github.com/eth-p/bat-extras/blob/master/doc/prettybat.md) β€” скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `bat`. ## Установка [![Packaging status](https://repology.org/badge/vertical-allrepos/bat-cat.svg?columns=3&exclude_unsupported=1)](https://repology.org/project/bat-cat/versions) ### Ubuntu (с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `apt`) *... ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ дистрибутивы основанныС Π½Π° Debian.* `bat` Π΅ΡΡ‚ΡŒ Π² рСпозиториях [Ubuntu](https://packages.ubuntu.com/eoan/bat) ΠΈ [Debian](https://packages.debian.org/sid/bat) ΠΈ доступСн начиная с Ubuntu Eoan 19.10. На Debian `bat` ΠΏΠΎΠΊΠ° Ρ‡Ρ‚ΠΎ доступСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠΉ Π²Π΅Ρ‚ΠΊΠΎΠΉ "Sid". Если ваша вСрсия Ubuntu/Debian достаточно новая, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ `bat` Ρ‚Π°ΠΊ: ```bash apt install bat ``` Если Π²Ρ‹ установили `bat` Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‚ΠΎ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ установлСн ΠΊΠ°ΠΊ `batcat` вмСсто `bat` (ΠΈΠ·-Π·Π° [ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° ΠΈΠΌΠ΅Π½ΠΈ с Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ](https://github.com/sharkdp/bat/issues/982)). Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ симлинк ΠΈΠ»ΠΈ алиас `bat -> batcat`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… дистрибутивах. ``` bash mkdir -p ~/.local/bin ln -s /usr/bin/batcat ~/.local/bin/bat ``` ### Ubuntu (Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ самого Π½ΠΎΠ²ΠΎΠ³ΠΎ `.deb` ΠΏΠ°ΠΊΠ΅Ρ‚Π°) *... ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ дистрибутивы Linux основанныС Π½Π° Debian* Если ΠΏΠ°ΠΊΠ΅Ρ‚ Π΅Ρ‰Π΅ нСдоступСн Π² вашСм Ubuntu/Debian дистрибутивС ΠΈΠ»ΠΈ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡΠ°ΠΌΡƒΡŽ послСднюю Π²Π΅Ρ€ΡΠΈΡŽ `bat`, Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ самый послСдний `deb`-ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΎΡ‚ΡΡŽΠ΄Π°: [release page](https://github.com/sharkdp/bat/releases) ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ: ```bash sudo dpkg -i bat_0.18.3_amd64.deb # ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ ΠΈ Π²Π΅Ρ€ΡΠΈΡŽ ``` ### Alpine Linux Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ [`bat`](https://pkgs.alpinelinux.org/packages?name=bat) ΠΈΠ· ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… источников: ```bash apk add bat ``` ### Arch Linux Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ [`bat`](https://www.archlinux.org/packages/extra/x86_64/bat/) ΠΈΠ· ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ источника: ```bash pacman -S bat ``` ### Fedora Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ [`bat`](https://koji.fedoraproject.org/koji/packageinfo?packageID=27506) ΠΈΠ· ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ рСпозитория [Fedora Modular](https://docs.fedoraproject.org/en-US/modularity/using-modules/). ```bash dnf install bat ``` ### Gentoo Linux Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ [`bat`](https://packages.gentoo.org/packages/sys-apps/bat) ΠΈΠ· ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… источников: ```bash emerge sys-apps/bat ``` ### Void Linux Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ `bat` с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `xbps-install`: ```bash xbps-install -S bat ``` ### FreeBSD Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ [`bat`](https://www.freshports.org/textproc/bat) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `pkg`: ```bash pkg install bat ``` ΠΈΠ»ΠΈ самому ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ: ```bash cd /usr/ports/textproc/bat make install ``` ### Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ nix Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ `bat`, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ [nix package manager](https://nixos.org/nix): ```bash nix-env -i bat ``` ### openSUSE Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ `bat` с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `zypper`: ```bash zypper install bat ``` ### macOS Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ `bat` с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ [Homebrew](http://braumeister.org/formula/bat): ```bash brew install bat ``` Или ΠΆΠ΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ [MacPorts](https://ports.macports.org/port/bat/summary): ```bash port install bat ``` ### Windows Π•ΡΡ‚ΡŒ нСсколько способов ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ `bat`. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ установили Π΅Π³ΠΎ, посмотритС Π½Π° ΡΠ΅ΠΊΡ†ΠΈΡŽ ["ИспользованиС `bat` Π² Windows"](#using-bat-on-windows). #### Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Chocolatey Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ `bat` с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ [Chocolatey](https://chocolatey.org/packages/Bat): ```bash choco install bat ``` #### Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Scoop Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ `bat` с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ [scoop](https://scoop.sh/): ```bash scoop install bat ``` Для этого Ρƒ вас Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ установлСн [Visual C++ Redistributable](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads). #### Из Π·Π°Ρ€Π°Π½Π΅Π΅ скомпилированных Ρ„Π°ΠΉΠ»ΠΎΠ²: Π˜Ρ… Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Π½Π° [страницС Ρ€Π΅Π»ΠΈΠ·ΠΎΠ²](https://github.com/sharkdp/bat/releases). Для этого Ρƒ вас Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ установлСн [Visual C++ Redistributable](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads). ### Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Docker Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ [Docker image](https://hub.docker.com/r/danlynn/bat/), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ `bat` Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅: ```bash docker pull danlynn/bat alias bat='docker run -it --rm -e BAT_THEME -e BAT_STYLE -e BAT_TABS -v "$(pwd):/myapp" danlynn/bat' ``` ### Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ansible Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ `bat` с [Ansible](https://www.ansible.com/): ```bash # УстанавливаСм Ρ€ΠΎΠ»ΡŒ Π½Π° устройствС ansible-galaxy install aeimer.install_bat ``` ```yaml --- # Playbook для установки bat - host: all roles: - aeimer.install_bat ``` - [Ansible Galaxy](https://galaxy.ansible.com/aeimer/install_bat) - [GitHub](https://github.com/aeimer/ansible-install-bat) Π­Ρ‚ΠΎΡ‚ способ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ дистрибутивами: - Debian/Ubuntu - ARM (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Raspberry PI) - Arch Linux - Void Linux - FreeBSD - macOS ### Из скомпилированных Ρ„Π°ΠΉΠ»ΠΎΠ² ΠŸΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π½Π° [страницу Ρ€Π΅Π»ΠΈΠ·ΠΎΠ²](https://github.com/sharkdp/bat/releases) для скомпилированных Ρ„Π°ΠΉΠ»ΠΎΠ² `bat` для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ. Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ со статичСской связкой Ρ‚Π°ΠΊ ΠΆΠ΅ доступны: Π²Ρ‹Π±ΠΈΡ€Π°ΠΉΡ‚Π΅ Π°Ρ€Ρ…ΠΈΠ² с `musl` Π² ΠΈΠΌΠ΅Π½ΠΈ. ### Из исходников Если Π²Ρ‹ ΠΆΠ΅Π»Π°Π΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ `bat` ΠΈΠ· исходников, Π²Π°ΠΌ понадобится Rust 1.74.0 ΠΈΠ»ΠΈ Π²Ρ‹ΡˆΠ΅. ПослС этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `cargo`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ: ```bash cargo install --locked bat ``` ## ΠšΠ°ΡΡ‚ΠΎΠΌΠΈΠ·Π°Ρ†ΠΈΡ ### Π’Π΅ΠΌΡ‹ для выдСлСния тСкста Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `bat --list-themes`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ вывСсти список всСх доступных Ρ‚Π΅ΠΌ. Для Π²Ρ‹Π±ΠΎΡ€Π° Ρ‚Π΅ΠΌΡ‹ `TwoDark` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `bat` с Ρ„Π»Π°Π³ΠΎΠΌ `--theme=TwoDark` ΠΈΠ»ΠΈ Π²Ρ‹ΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния `BAT_THEME` Π² `TwoDark`. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `export BAT_THEME="TwoDark"` Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ вашСй ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π΅ навсСгда. Или ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ [ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»](https://github.com/sharkdp/bat#configuration-file) `bat`. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ просто ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‚Π΅ΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ (для этого Π²Π°ΠΌ понадобится [`fzf`](https://github.com/junegunn/fzf)): ```bash bat --list-themes | fzf --preview="bat --theme={} --color=always /ΠΏΡƒΡ‚ΡŒ/ΠΊ/Ρ„Π°ΠΉΠ»Ρƒ" ``` `bat` ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ смотрится Π½Π° Ρ‚Π΅ΠΌΠ½ΠΎΠΌ Ρ„ΠΎΠ½Π΅. Однако Ссли ваш Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡΠ²Π΅Ρ‚Π»ΡƒΡŽ Ρ‚Π΅ΠΌΡƒ, Ρ‚ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ Ρ‚Π΅ΠΌΡ‹ ΠΊΠ°ΠΊ `GitHub` ΠΈΠ»ΠΈ `OneHalfLight` Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒΡΡ ΠΊΡƒΠ΄Π° Π»ΡƒΡ‡ΡˆΠ΅! Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ‚Π΅ΠΌΡƒ, для этого ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ [Π² Ρ€Π°Π·Π΄Π΅Π» добавлСния Ρ‚Π΅ΠΌ](https://github.com/sharkdp/bat#Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅-Π½ΠΎΠ²Ρ‹Ρ…-Ρ‚Π΅ΠΌ). ### ИзмСнСниС внСшнСго Π²Ρ‹Π²ΠΎΠ΄Π° Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π»Π°Π³ `--style`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ внСшний Π²ΠΈΠ΄ Π²Ρ‹Π²ΠΎΠ΄Π° Π² `bat`. НапримСр, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ `--style=numbers,changes`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ количСство строк ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Git. УстановитС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния `BAT_STYLE` Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ это навсСгда, ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ [ΠΊΠΎΠ½Ρ„ΠΈΠ³ Ρ„Π°ΠΉΠ»](https://github.com/sharkdp/bat#configuration-file) `bat`. ### Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… синтаксисов `bat` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ [`syntect`](https://github.com/trishume/syntect/) для выдСлСния синтаксиса. `syntect` ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ [Ρ„Π°ΠΉΠ» `.sublime-syntax`](https://www.sublimetext.com/docs/3/syntax.html) ΠΈ Ρ‚Π΅ΠΌΡ‹. Π§Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ синтаксис, сдСлайтС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅: Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ с синтаксисом: ```bash mkdir -p "$(bat --config-dir)/syntaxes" cd "$(bat --config-dir)/syntaxes" # РазмСститС Ρ„Π°ΠΉΠ»Ρ‹ '.sublime-syntax' # Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ (ΠΈΠ»ΠΈ субкаталогах), Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: git clone https://github.com/tellnobody1/sublime-purescript-syntax ``` Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ эти Ρ„Π°ΠΉΠ»Ρ‹ Π² Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ кСш: ```bash bat cache --build ``` Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ `bat --list-languages`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, доступны Π»ΠΈ Π½ΠΎΠ²Ρ‹Π΅ языки. Если ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π²Ρ‹ Π·Π°Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ настройкам ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π²Π²Π΅Π΄ΠΈΡ‚Π΅ ```bash bat cache --clear ``` ### Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… Ρ‚Π΅ΠΌ Π­Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… Ρ‚Π΅ΠΌ выдСлСния синтаксиса Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, создайтС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ с Π½ΠΎΠ²Ρ‹ΠΌΠΈ Ρ‚Π΅ΠΌΠ°ΠΌΠΈ для синтаксиса: ```bash mkdir -p "$(bat --config-dir)/themes" cd "$(bat --config-dir)/themes" # Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ Ρ‚Π΅ΠΌΡƒ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ '.tmTheme': git clone https://github.com/greggb/sublime-snazzy # ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ кСш bat cache --build ``` Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `bat --list-themes`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Ρ… Ρ‚Π΅ΠΌ. ### ИспользованиС Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠ΅ΠΉΠ΄ΠΆΠ΅Ρ€Π°. `bat` ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠ΅ΠΉΠ΄ΠΆΠ΅Ρ€, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния `PAGER`. Если ΠΎΠ½Π° Π½Π΅ Π·Π°Π΄Π°Π½Π°, Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ `less`. Если Π²Ρ‹ ΠΆΠ΅Π»Π°Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠ΅ΠΉΠ΄ΠΆΠ΅Ρ€, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»ΠΈΠ±ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ `PAGER`, Π»ΠΈΠ±ΠΎ `BAT_PAGER` Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² `PAGER`. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΠ΅ΠΉΠ΄ΠΆΠ΅Ρ€Ρƒ, пСрСчислитС ΠΈΡ… Π² этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ: ```bash export BAT_PAGER="less -RF" ``` Π’Π°ΠΊ ΠΆΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ [Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ](https://github.com/sharkdp/bat#configuration-file) `bat` (Ρ„Π»Π°Π³ `--pager`). **Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅**: По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΠ΅ΠΉΠ΄ΠΆΠ΅Ρ€ΠΎΠΌ являСтся`less` (Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²), `bat` задаст ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„Π»Π°Π³ΠΈ для ΠΏΠ΅ΠΉΠ΄ΠΆΠ΅Ρ€Π°: `-R`/`--RAW-CONTROL-CHARS`, `-F`/`--quit-if-one-screen` ΠΈ `-X`/`--no-init`. ПослСдний Ρ„Π»Π°Π³(`-X`) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для `less`, Ρ‡ΡŒΡ вСрсия Ρ€Π°Π½ΡŒΡˆΠ΅ 530. Π€Π»Π°Π³ `-R` Π½ΡƒΠΆΠ΅Π½ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ воспроизвСсти ANSI Ρ†Π²Π΅Ρ‚Π°. Π’Ρ‚ΠΎΡ€ΠΎΠΉ Ρ„Π»Π°Π³ (`-F`) Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ `less` Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚ΠΎΡ‚ сразу ΠΆΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ, Ссли Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π° мСньшС Ρ‡Π΅ΠΌ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°. Π­Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ для Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ², Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π²Π°ΠΌ Π½Π΅ Π½Π°Π΄ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π½Π°ΠΆΠΈΠΌΠ°Ρ‚ΡŒ `q`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· ΠΏΠ΅ΠΉΠ΄ΠΆΠ΅Ρ€Π°. Π’Ρ€Π΅Ρ‚ΠΈΠΉ Ρ„Π»Π°Π³ (`-X`) Π½ΡƒΠΆΠ΅Π½ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π±Π°Π³ с `--quit-if-one-screen` Π² старых вСрсиях `less`. К соТалСнию, это Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования колСса ΠΌΡ‹ΡˆΠΊΠΈ. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ всС ΠΆΠ΅ Π΅Π³ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ `-R`. Для `less` Π½ΠΎΠ²Π΅Π΅ Ρ‡Π΅ΠΌ 530 ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ. ### ВСмная Ρ‚Π΅ΠΌΠ° Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ‚Π΅ΠΌΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ Π² macOS, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ‡Ρ‚ΠΎΠ±Ρ‹ `bat` использовал Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ‚Π΅ΠΌΡƒ, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π½Π° Ρ‚Π΅ΠΌΠ΅ вашСй ОБ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ сниппСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚Π΅ΠΌΡƒ `default`, ΠΊΠΎΠ³Π΄Π° Ρƒ вас Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Ρ‚Π΅ΠΌΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ, ΠΈ Ρ‚Π΅ΠΌΡƒ `GitHub`, ΠΊΠΎΠ³Π΄Π° Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ свСтлый. ```bash alias cat="bat --theme=\$(defaults read -globalDomain AppleInterfaceStyle &> /dev/null && echo default || echo GitHub)" ``` ## Π€Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ `bat` Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ кастомизирован с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Π•Π³ΠΎ мСстополоТСниС зависит ΠΎΡ‚ вашСй ОБ: Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΡƒΡ‚ΡŒ, Π²Π²Π΅Π΄ΠΈΡ‚Π΅ ``` bat --config-file ``` Π’Π°ΠΊΠΆΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния `BAT_CONFIG_PATH`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. ```bash export BAT_CONFIG_PATH="/path/to/bat.conf" ``` Π€Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Β«ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽΒ» ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ создан с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Π»Π°Π³Π° `--generate-config-file`. ```bash bat --generate-config-file ``` ### Π€ΠΎΡ€ΠΌΠ°Ρ‚ Π€Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ - это всСго лишь Π½Π°Π±ΠΎΡ€ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π’Π²Π΅Π΄ΠΈΡ‚Π΅ `bat --help`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ список всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Ρ„Π»Π°Π³ΠΎΠ² ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π’Π°ΠΊΠΆΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строку с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ `#`. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ: ```bash # Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΌΡƒ "TwoDark" --theme="TwoDark" # ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ количСство строк, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Git ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Ρ„Π°ΠΉΠ»Π° --style="numbers,changes,header" # Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ курсив (поддСрТиваСтся Π½Π΅ всСми Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°ΠΌΠΈ) --italic-text=always # Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ синтаксис C++ для всСх Arduino .ino Ρ„Π°ΠΉΠ»ΠΎΠ² --map-syntax "*.ino:C++" # Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ синтаксис Git Ignore для всСх Ρ„Π°ΠΉΠ»ΠΎΠ² .ignore --map-syntax ".ignore:Git Ignore" ``` ## ИспользованиС `bat` Π² Windows `bat` ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ работоспособСн "ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ", Π½ΠΎ для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… возмоТностСй ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ настройки. ### ПСйдТинг Windows ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‡Π΅Π½ΡŒ простой ΠΏΠ΅ΠΉΠ΄ΠΆΠ΅Ρ€ `more`. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ установщик для `less` [с Π΅Π³ΠΎ сайта](http://www.greenwoodsoftware.com/less/download.html) ΠΈΠ»ΠΈ [Ρ‡Π΅Ρ€Π΅Π· Chocolatey](https://chocolatey.org/packages/Less). Π§Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, скопируйтС исполняСмый Ρ„Π°ΠΉΠ» Π² ваш `PATH` ΠΈΠ»ΠΈ [ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния](#ИспользованиС-Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ-ΠΏΠ΅ΠΉΠ΄ΠΆΠ΅Ρ€Π°). [ΠŸΠ°ΠΊΠ΅Ρ‚ ΠΈΠ· Chocolatey](#windows) установит всС автоматичСски. ### Π¦Π²Π΅Ρ‚Π° Windows 10 ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ†Π²Π΅Ρ‚Π° ΠΈ Π² `conhost.exe` (Command Prompt), ΠΈ Π² PowerShell начиная с вСрсии Windows [v1511](https://ru.wikipedia.org/wiki/Windows_10#ОбновлСния ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ°), Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ Π² bash. На Ρ€Π°Π½Π½ΠΈΡ… вСрсиях Windows Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ [Cmder](http://cmder.net/), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π΅ΡΡ‚ΡŒ [ConEmu](https://conemu.github.io/). **Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅:** ВСрсия `less` Π² Git ΠΈ MSYS2 воспроизводит Ρ†Π²Π΅Ρ‚Π° Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ. Если Ρƒ вас Π½Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠ΅ΠΉΠ΄ΠΆΠ΅Ρ€ΠΎΠ², ΠΌΡ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ использованиС ΠΏΠ΅ΠΉΠ΄ΠΆΠ΅Ρ€ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Π»Π°Π³Π° `--paging=never` ΠΈΠ»ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ `BAT_PAGER` Ρ€Π°Π²Π½Ρ‹ΠΌ пустой строкС. ### Cygwin Из ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ `bat` Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΡƒΡ‚ΠΈ Π² стилС Unix (`/cygdrive/*`). Когда ΡƒΠΊΠ°Π·Π°Π½ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ cygwin, `bat` выдаст ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ: `The system cannot find the path specified. (os error 3)` Она ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² `.bash_profile`: ```bash bat() { local index local args=("$@") for index in $(seq 0 ${#args[@]}) ; do case "${args[index]}" in -*) continue;; *) [ -e "${args[index]}" ] && args[index]="$(cygpath --windows "${args[index]}")";; esac done command bat "${args[@]}" } ``` ## ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ### Π’Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρ‹ ΠΈ Ρ†Π²Π΅Ρ‚Π° `bat` ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρ‹ *с* ΠΈ *Π±Π΅Π·* ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ truecolor. Однако подсвСтка синтаксиса Π½Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° для Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ² с 8-Π±ΠΈΡ‚Π½Ρ‹ΠΌΠΈ Ρ†Π²Π΅Ρ‚Π°ΠΌΠΈ, ΠΈ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρ‹ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ 24-Π±ΠΈΡ‚Π½Ρ‹Ρ… Ρ†Π²Π΅Ρ‚ΠΎΠ² (`terminator`, `konsole`, `iTerm2`, ...). Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ [эту ΡΡ‚Π°Ρ‚ΡŒΡŽ](https://gist.github.com/XVilka/8346728) для ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ списка Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ². Π£Π΄ΠΎΡΡ‚ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ пСрСмСнная `COLORTERM` Ρ€Π°Π²Π½Π° `truecolor` ΠΈΠ»ΠΈ `24bit`. Π˜Π½Π°Ρ‡Π΅ `bat` Π½Π΅ смоТСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ 24-Π±ΠΈΡ‚Π½Ρ‹Ρ… Ρ†Π²Π΅Ρ‚ΠΎΠ² (ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ 8-Π±ΠΈΡ‚Π½Ρ‹Π΅). ### ВСкст ΠΈ Π½ΠΎΠΌΠ΅Ρ€Π° строк ΠΏΠ»ΠΎΡ…ΠΎ Π²ΠΈΠ΄Π½Ρ‹ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ‚Π΅ΠΌΡƒ (`bat --list-themes` Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ список всСх установлСнных Ρ‚Π΅ΠΌ). Π’Π΅ΠΌΡ‹ `OneHalfDark` ΠΈ `OneHalfLight` ΠΈΠΌΠ΅ΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ яркиС Π½ΠΎΠΌΠ΅Ρ€Π° строк ΠΈ тСксты. ### ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² `bat` ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ UTF-8 ΠΈ UTF-16. Π€Π°ΠΉΠ»Ρ‹ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ°Ρ…, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, придётся ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ распознана Π½Π΅Π²Π΅Ρ€Π½ΠΎ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ `iconv`. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: Ρƒ вас Π΅ΡΡ‚ΡŒ PHP Ρ„Π°ΠΉΠ» Π² ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ Latin-1 (ISO-8859-1): ``` bash iconv -f ISO-8859-1 -t UTF-8 my-file.php | bat ``` Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Ρ„Π»Π°Π³ `-l`/`--language`, Ссли `bat` Π½Π΅ смоТСт автоматичСски ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ синтаксис. ## Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ```bash # РСкурсивно ΠΊΠ»ΠΎΠ½ΠΈΡ€ΡƒΠ΅Ρ‚ всС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ git clone --recursive https://github.com/sharkdp/bat # ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΠΈ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ cd bat cargo build --bins # Запуск тСстов cargo test # Установка (рСлизная вСрсия) cargo install --locked # ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ исполняСмого Ρ„Π°ΠΉΠ»Π° bat с Π΄Ρ€ΡƒΠ³ΠΈΠΌ синтаксисом ΠΈ Ρ‚Π΅ΠΌΠ°ΠΌΠΈ bash assets/create.sh cargo install --locked --force ``` ## Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ - [sharkdp](https://github.com/sharkdp) - [eth-p](https://github.com/eth-p) ## Π¦Π΅Π»ΠΈ ΠΈ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ Π¦Π΅Π»ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° `bat`: - ΠšΡ€Π°ΡΠΈΠ²Π°Ρ ΠΈ продвинутая подсвСтка синтаксиса. - Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с Git. - ΠŸΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Π°Ρ Π·Π°ΠΌΠ΅Π½Π° `cat`. - Π”Ρ€ΡƒΠΆΠ΅Π»ΡŽΠ±Π½Ρ‹ΠΉ интСрфСйс ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. Π•ΡΡ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ² `bat`. Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ [этот Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚](doc/alternatives.md) для сравнСния. ## ЛицСнзия Copyright (c) 2018-2021 [Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ bat](https://github.com/sharkdp/bat). `bat` распространяСтся ΠΏΠΎΠ΄ лицСнзиями MIT License ΠΈ Apache License 2.0 (Π½Π° Π²Ρ‹Π±ΠΎΡ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ). Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ [LICENSE-APACHE](LICENSE-APACHE) ΠΈ [LICENSE-MIT](LICENSE-MIT) для Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ³ΠΎ ознакомлСния. bat-0.25.0/doc/README-zh.md000064400000000000000000000540521046102023000131270ustar 00000000000000

bat - a cat clone with wings
Build Status license Version info
η±»δΌΌ cat(1)οΌŒδ½†εΈ¦ζœ‰ git ι›†ζˆε’Œθ―­ζ³•ι«˜δΊ.

δΈ»θ¦εŠŸθƒ½ β€’ 使用方法 β€’ ε‰θ£… β€’ θ‡ͺεšδΉ‰ β€’ ι‘Ήη›η›ζ ‡ε’Œζ›Ώδ»£ζ–Ήζ‘ˆ
[English] [δΈ­ζ–‡] [ζ—₯本θͺž] [ν•œκ΅­μ–΄] [Русский]

### θ―­ζ³•ι«˜δΊ `bat` ε―Ήε€§ιƒ¨εˆ†ηΌ–η¨‹θ―­θ¨€ε’Œζ ‡θ°θ―­θ¨€ζδΎ›θ―­ζ³•ι«˜δΊοΌš ![Syntax highlighting example](https://imgur.com/rGsdnDe.png) ### Git ι›†ζˆ `bat` θƒ½δ»Ž git δΈ­θŽ·ε–ζ–‡δ»Άηš„δΏζ”ΉεΉΆε±•η€Ίεœ¨θΎΉζ οΌˆθ§δΈ‹ε›ΎοΌ‰οΌš ![Git integration example](https://i.imgur.com/2lSW4RE.png) ### 不可打印(non-printable)ε­—η¬¦ε―θ§†εŒ– 添加`-A`/`--show-all`参数可δ»₯ζ–‡δ»Άζ–‡δ»ΆδΈ­ηš„δΈε―ζ‰“ε°ε­—η¬¦: ![Non-printable character example](https://i.imgur.com/WndGp9H.png) ### θ‡ͺεŠ¨εˆ†ι‘΅ `bat`δΌšεœ¨δΈ€θˆ¬ζƒ…ε†΅δΈ‹ε°†ε€§δΊŽε±εΉ•ε―ζ˜Ύη€ΊθŒƒε›΄ηš„ε†…εΉθΎ“ε‡Ίεˆ°εˆ†ι‘΅ε™¨(pager, e.g. `less`)。 你可δ»₯εœ¨θ°ƒη”¨ζ—Άζ·»εŠ `--paging=never`参数ζ₯δ½Ώ`bat`δΈδ½Ώη”¨εˆ†ι‘΅ε™¨οΌˆε°±εƒ`cat`δΈ€ζ ·οΌ‰γ€‚ε¦‚ζžœδ½ ζƒ³θ¦η”¨δΈΊ`cat`使用`bat`别名,可δ»₯在 shell 配η½ζ–‡δ»ΆοΌˆshell configurationοΌ‰δΈ­ζ·»εŠ `alias cat='bat --paging=never'`。 #### 智能输出 `bat`θƒ½ε€Ÿεœ¨θΎη½δΊ†εˆ†ι‘΅ε™¨ι€‰ι‘Ήηš„εŒζ—ΆθΏ›θ‘Œη‘道:wink:。 当`bat`ζ£€ζ΅‹εˆ°ε½“ε‰ηŽ―ε’ƒδΈΊιžε―δΊ€δΊ’η»ˆη«―ζˆ–η‘ι“ζ—ΆοΌˆδΎ‹ε¦‚δ½Ώη”¨`bat`εΉΆε°†ε†…εΉη”¨η‘ι“θΎ“ε‡Ίεˆ°ζ–‡δ»ΆοΌ‰οΌŒ`bat`δΌšεƒ`cat`δΈ€ζ ·οΌŒδΈ€ζ¬‘θΎ“ε‡Ίζ–‡δ»Άε†…εΉδΈΊηΊ―ζ–‡ζœ¬δΈ”ζ— θ§†`--paging`参数。 ## 如何使用 在终端中ζŸ₯ηœ‹δΈ€δΈͺζ–‡δ»Ά ```bash > bat README.md ``` δΈ€ζ¬‘ζ€§ε±•η€Ίε€šδΈͺζ–‡δ»Ά ```bash > bat src/*.rs ``` 从`stdin`θ―»ε…₯桁,θ‡ͺεŠ¨δΈΊε†…εΉζ·»εŠ θ―­ζ³•ι«˜δΊοΌˆε‰ζζ˜―θΎ“ε…₯ε†…εΉηš„语言可δ»₯θ’«ζ­£η‘θ―†εˆ«οΌŒι€šεΈΈζ Ήζε†…εΉη¬¬δΈ€θ‘Œηš„ shebang ζ ‡θ°οΌŒε½’如`#!bin/sh`οΌ‰ ```bash > curl -s https://sh.rustup.rs | bat ``` ζ˜ΎεΌζŒ‡εš`stdin`θΎ“ε…₯ηš„θ―­θ¨€ ```bash > yaml2json .travis.yml | json_pp | bat -l json ``` ζ˜Ύη€ΊδΈε―ζ‰“ε°ε­—η¬¦ ```bash > bat -A /etc/hosts ``` 与`cat`ηš„ε…ΌεΉζ€§ ```bash bat > note.md # εˆ›ε»ΊδΈ€δΈͺη©Ίζ–‡δ»Ά bat header.md content.md footer.md > document.md bat -n main.rs # εͺ显瀺葌号 bat f - g # θΎ“ε‡Ί f,ζŽ₯η€ζ˜―ζ ‡ε‡†θΎ“ε…₯ζ΅οΌŒζœ€εŽ g ``` ### 第三方ε·₯ε…·δΊ€δΊ’ #### `fzf` 你可δ»₯使用`bat`作为`fzf`ηš„ι’„θ§ˆε™¨γ€‚θΏ™ιœ€θ¦εœ¨`bat`后添加`--color=always`ι€‰ι‘ΉοΌŒδ»₯及`--line-range` 选鑹ζ₯ι™εˆΆε€§ζ–‡δ»Άηš„εŠ θ½½ζ¬‘ζ•°γ€‚ ```bash fzf --preview 'bat --color=always --style=numbers --line-range=:500 {}' ``` ζ›΄ε€šδΏ‘ζ―θ―·ε‚ι˜…[`fzf`ηš„θ―΄ζ˜Ž](https://github.com/junegunn/fzf#preview-window)。 #### `find` ζˆ– `fd` 你可δ»₯使用`find`ηš„`-exec`选鑹ζ₯用`bat`ι’„θ§ˆζœη΄’η»“ζžœοΌš ```bash find … -exec bat {} + ``` δΊ¦ζˆ–θ€…εœ¨η”¨`fd`ζ—Άζ·»εŠ `-X`/`--exec-batch`ι€‰ι‘ΉοΌš ```bash fd … -X bat ``` #### `ripgrep` `bat`δΉŸθƒ½η”¨`batgrep`ζ₯显瀺`ripgrep`ηš„ζœη΄’η»“ζžœγ€‚ ```bash batgrep needle src/ ``` #### `tail -f` ε½“δΈŽ`tail -f`δΈ€θ΅·δ½Ώη”¨οΌŒ`bat`可δ»₯ζŒη»­η›‘θ§†ζ–‡δ»Άε†…εΉεΉΆδΈΊε…Άζ·»εŠ θ―­ζ³•ι«˜δΊγ€‚ ```bash tail -f /var/log/pacman.log | bat --paging=never -l log ``` ζ³¨ζ„οΌšθΏ™ι‘ΉεŠŸθƒ½ιœ€θ¦εœ¨ε…³ι—­εˆ†ι‘΅ζ—Άδ½Ώη”¨οΌŒεŒζ—Άθ¦ζ‰‹εŠ¨ζŒ‡εšθΎ“ε…₯ηš„ε†…εΉθ―­ζ³•οΌˆι€šθΏ‡`-l log`)。 #### `git` `bat`δΉŸθƒ½η›΄ζŽ₯ζŽ₯受ζ₯θ‡ͺ`git show`ηš„θΎ“ε‡ΊεΉΆδΈΊε…Άζ·»εŠ θ―­ζ³•ι«˜δΊοΌˆε½“η„ΆδΉŸιœ€θ¦ζ‰‹εŠ¨ζŒ‡εšθ―­ζ³•οΌ‰οΌš ```bash git show v0.6.0:src/main.rs | bat -l rs ``` #### `git diff` `bat`也可δ»₯ε’Œ`git diff`δΈ€θ΅·δ½Ώη”¨οΌš ```bash batdiff() { git diff --name-only --diff-filter=d | xargs bat --diff } ``` θ―₯εŠŸθƒ½δΉŸδ½œδΈΊδΈ€δΈͺ独立ε·₯ε…·ζδΎ›οΌŒδ½ ε―δ»₯在[`bat-extras`](https://github.com/eth-p/bat-extras)δΈ­ζ‰Ύεˆ°`batdiff`。 ε¦‚ζžœδ½ ζƒ³δΊ†θ§£ζ›΄ε€š git ε’Œ diff ηš„δΏ‘ζ―οΌŒε‚ι˜…[`delta`](https://github.com/dandavison/delta)。 #### `xclip` ε½“ιœ€θ¦ζ‹·θ΄ζ–‡δ»Άε†…εΉζ—ΆοΌŒθ‘Œε·δ»₯及 git ζ ‡θ°δΌšε½±ε“θΎ“ε‡ΊοΌŒζ­€ζ—Άε―δ»₯使用`-p`/`--plain`参数ζ₯ζŠŠηΊ―ζ–‡ζœ¬δΌ ι€’η»™`xclip`。 ```bash bat main.cpp | xclip ``` `bat`δΌšζ£€ζ΅‹θΎ“ε‡Ίζ˜―ε¦ζ˜―η‘道重εšε‘ζ₯决εšζ˜―ε¦δ½Ώη”¨ηΊ―ζ–‡ζœ¬θΎ“ε‡Ίγ€‚ #### `man` `bat`δΉŸθƒ½η»™`man`ηš„θΎ“ε‡ΊδΈŠθ‰²γ€‚θΏ™ιœ€θ¦θΎη½`MANPAGER`ηŽ―ε’ƒε˜ι‡οΌš ```bash export MANPAGER="sh -c 'col -bx | bat -l man -p'" man 2 select ``` οΌˆε¦‚ζžœδ½ δ½Ώη”¨ηš„ζ˜― Debian ζˆ–θ€… UbuntuοΌŒδ½Ώη”¨`batcat`替捒`bat`οΌ‰ ε¦‚ζžœδ½ ι‡εˆ°ζ ΌεΌεŒ–ι—ι’˜οΌŒθΎη½`MANROFFOPT="-c"`也θΈδΌšζœ‰εΈεŠ©γ€‚ `batman`θƒ½ζδΎ›η±»δΌΌεŠŸθƒ½β€”β€”δ½œδΈΊδΈ€δΈͺη‹¬η«‹ηš„ε‘½δ»€γ€‚ ζ³¨ζ„οΌš[man page 语法](assets/syntaxes/02_Extra/Manpage.sublime-syntax) θΏ˜ιœ€θ¦εŒε–„γ€‚εœ¨δ½Ώη”¨η‰Ήεšηš„`man`εžηŽ°ζ—Άθ―₯εŠŸθƒ½[无法正常ε·₯作](https://github.com/sharkdp/bat/issues/1145)。 #### `prettier` / `shfmt` / `rustfmt` `prettybat`θ„šζœ¬θƒ½ε€Ÿζ ΌεΌεŒ–δ»£η εΉΆη”¨`bat`输出。 ## ε‰θ£… [![Packaging status](https://repology.org/badge/vertical-allrepos/bat-cat.svg?columns=3&exclude_unsupported=1)](https://repology.org/project/bat-cat/versions) ### Ubuntu (使用 `apt`) *... δ»₯εŠε…Άδ»–εŸΊδΊŽ Debianηš„ε‘θ‘Œη‰ˆ.* `bat` θ¦ζ±‚ηš„η‰ˆζœ¬οΌš [Ubuntu 高于 20.04 ("Focal")](https://packages.ubuntu.com/search?keywords=bat&exact=1) ε’Œ [Debian 高于 August 2021 (Debian 11 - "Bullseye")](https://packages.debian.org/bullseye/bat). ε½“δ½ ηš„ε‘θ‘Œη‰ˆζ»‘θΆ³ζ‘δ»Άι‚£δΉˆη›΄ζŽ₯εœ¨η»ˆη«―θΏζ‰§θ‘ŒοΌš ```bash sudo apt install bat ``` ι‡θ¦οΌšε¦‚ζžœδ½ ι€šθΏ‡θΏ™η§ζ–Ήζ³•ε‰θ£…`bat`οΌŒθ―·η•™ζ„δ½ ζ‰€ε‰θ£…ηš„ε―ζ‰§θ‘Œζ–‡δ»Άζ˜―ε¦δΈΊ`batcat`οΌˆη”±[ε…Άδ»–εŒ…ηš„ε―ζ‰§θ‘Œζ–‡δ»Άεε†²ηͺ](https://github.com/sharkdp/bat/issues/982)ι€ ζˆοΌ‰γ€‚δ½ ε―δ»₯εˆ›ε»ΊδΈ€δΈͺ`bat -> batcat`ηš„η¬¦ε·ι“ΎζŽ₯(symlink)ζˆ–εˆ«εζ₯ιΏε…ε› δΈΊε―ζ‰§θ‘Œζ–‡δ»ΆδΈεŒεΈ¦ζ₯ηš„ι—ι’˜εΉΆδΈŽε…Άδ»–ε‘θ‘Œη‰ˆδΏζŒδΈ€θ‡΄ζ€§γ€‚ ```bash mkdir -p ~/.local/bin ln -s /usr/bin/batcat ~/.local/bin/bat ``` ### Ubuntu (使用`.deb`εŒ…) *... δ»₯εŠε…Άδ»–εŸΊδΊŽ Debianηš„ε‘θ‘Œη‰ˆ.* ε¦‚ζžœδ½ ζ— ζ³•δ½Ώη”¨δΈŠδΈ€η§ζ–Ήζ³•ε‰θ£…οΌŒζˆ–ιœ€θ¦η”¨ζœ€ζ–°η‰ˆηš„`bat`,你可δ»₯从[release 鑡青](https://github.com/sharkdp/bat/releases)δΈ‹θ½½ζœ€ζ–°ηš„`.deb`εŒ…εΉΆι€šθΏ‡δΈ‹θΏ°ζ–Ήζ³•ε‰θ£…οΌš ```bash sudo dpkg -i bat_0.18.3_amd64.deb # adapt version number and architecture ``` ### Alpine Linux 你可δ»₯η”¨δΈ‹ι’δΈ‹εˆ—ε‘½δ»€δ»Žε˜ζ–ΉζΊδΈ­ε‰θ£…[`bat εŒ…`](https://pkgs.alpinelinux.org/packages?name=bat): ```bash apk add bat ``` ### Arch Linux 你可δ»₯η”¨δΈ‹ι’δΈ‹εˆ—ε‘½δ»€δ»Žε˜ζ–ΉζΊδΈ­ε‰θ£…[`bat`εŒ…](https://www.archlinux.org/packages/extra/x86_64/bat/): ```bash pacman -S bat ``` ### Fedora 你可δ»₯δ½Ώη”¨δΈ‹εˆ—ε‘½δ»€δ»Žε˜ζ–Ή[Fedora Modular](https://docs.fedoraproject.org/en-US/modularity/using-modules/)δ»“εΊ“ε‰θ£…[`bat` εŒ…](https://koji.fedoraproject.org/koji/packageinfo?packageID=27506): ```bash dnf install bat ``` ### Funtoo Linux 你可δ»₯从 dev-kit δΈ­ε‰θ£…[`bat` εŒ…](https://github.com/funtoo/dev-kit/tree/1.4-release/sys-apps/bat): ```bash emerge sys-apps/bat ``` ### Gentoo Linux 你可δ»₯δ½Ώη”¨δΈ‹εˆ—ε‘½δ»€δ»Žε˜ζ–ΉζΊδΈ­ε‰θ£… [`bat` εŒ…](https://packages.gentoo.org/packages/sys-apps/bat): ```bash emerge sys-apps/bat ``` ### Void Linux 你可δ»₯用 xbps-install ε‰θ£…`bat`: ```bash xbps-install -S bat ``` ### Termux: 你可δ»₯用 pkg ε‰θ£…`bat: ```bash pkg install bat ``` ### FreeBSD 你可δ»₯用 pkg ζ₯ε‰θ£…δΈ€δ»½ι’„ηΌ–θ―‘ηš„[`bat` εŒ…](https://www.freshports.org/textproc/bat): ```bash pkg install bat ``` ζˆ–δ»Ž FreeBSD ports θ‡ͺε·±ηΌ–θ―‘δΈ€δ»½οΌš ```bash cd /usr/ports/textproc/bat make install ``` ### OpenBSD 你可δ»₯用`pkgβ€”β€”add`ε‰θ£…`bat`εŒ… ```bash pkg_add bat ``` ### ι€šθΏ‡ nix 你可δ»₯用[nix εŒ…η‘理器](https://nixos.org/nix)ε‰θ£…`bat`: ```bash nix-env -i bat ``` ### openSUSE 你可δ»₯用 zypper ε‰θ£…`bat`: ```bash zypper install bat ``` ### ι€šθΏ‡ snap η›ε‰θΏ˜ζ²‘ζœ‰ζŽ¨θηš„ snap εŒ…ε―η”¨γ€‚ε―δ»₯δ½Ώη”¨ε…Άδ»–ηŽ°ε­˜ηš„εŒ…δ½†δΈδΌšε—εˆ°ε˜ζ–Ήζ”―ζŒδΈ”ε―θƒ½δΌšι‡εˆ°[ι—ι’˜](https://github.com/sharkdp/bat/issues/1519)。 ### macOS (ζˆ– Linux) ι€šθΏ‡ Homebrew 你可δ»₯用 [Homebrew on MacOS](https://formulae.brew.sh/formula/bat) ζˆ–θ€… [Homebrew on Linux](https://formulae.brew.sh/formula-linux/bat) ε‰θ£…`bat`: ```bash brew install bat ``` ### macOS ι€šθΏ‡ MacPorts ζˆ–η”¨ [MacPorts](https://ports.macports.org/port/bat/summary) ε‰θ£…`bat`: ```bash port install bat ``` ### Windows 在 Windows δΈŠε…·ζœ‰ε€šη§ε‰θ£…`bat`ηš„ζ–Ήζ³•γ€‚θ‹₯δ½ ε·²εŒζˆε‰θ£…οΌŒθ°εΎ—ηœ‹ηœ‹ ["在 Windows δΈŠδ½Ώη”¨`bat`"](#在-Windows-中使用-bat) 。 #### 前η½ζ‘δ»Ά δ½ εΏ…ι‘»ε·²ε‰θ£… [Visual C++ Redistributable](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) εŒ…γ€‚ #### 使用 Chocolatey 你可δ»₯用[Chocolatey](https://chocolatey.org/packages/Bat) ε‰θ£…`bat`: ```bash choco install bat ``` #### 使用 Scoop 你可δ»₯用 [scoop](https://scoop.sh/) ε‰θ£…`bat`: ```bash scoop install bat ``` #### δ½Ώη”¨ι’„ηΌ–θ―‘δΊŒθΏ›εˆΆη‰ˆζœ¬ η›΄ζŽ₯从 [Release 发布鑡](https://github.com/sharkdp/bat/releases) 下载已经编译ε₯½ηš„δΊŒθΏ›εˆΆεŒ…οΌŒε‰ζζ˜―δ½ ε‰θ£…δΊ† [Visual C++ Redistributable](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) εŒ…γ€‚ ### δ½Ώη”¨δΊŒθΏ›εˆΆη‰ˆζœ¬ 在 [Release 发布鑡](https://github.com/sharkdp/bat/releases) 中可δ»₯ζ‰Ύεˆ°δΈΊε€šη§ζžΆζž„ζž„ε»Ίηš„`bat`η‰ˆζœ¬ε’Œι™ζ€ηΌ–θ―‘ηš„δΊŒθΏ›εˆΆζ–‡δ»ΆοΌˆζ–‡δ»ΆεεΈ¦ζœ‰`musl`)。 ### δ»ŽζΊη ηΌ–θ―‘ ε¦‚ζžœδ½ ζƒ³θ¦θ‡ͺε·±ζž„ε»Ί`bat`οΌŒι‚£δΉˆδ½ ιœ€θ¦ε‰θ£…ζœ‰ι«˜δΊŽ1.74.0η‰ˆζœ¬ηš„ Rust。 使用δ»₯下命什编译。 ```bash cargo install --locked bat ``` ζ³¨ζ„οΌšman pageζˆ– shell θ‡ͺ动θ‘₯ε…¨ζ‰€ιœ€θ¦ηš„ι’ε€–ζ–‡δ»Άζ— ζ³•ι€šθΏ‡θ―₯方法ε‰θ£…。但你可δ»₯在`cargo`ηš„η”Ÿζˆη›ε½•ζ‰Ύεˆ°θΏ™δΊ›ζ–‡δ»ΆοΌˆ`build`η›ε½•下)。 ## θ‡ͺεšδΉ‰ ### θ―­ζ³•ι«˜δΊδΈ»ι’˜ 使用 `bat --list-themes` δΈ€δ»½θ―­ζ³•ι«˜δΊδΈ»ι’˜ηš„ζΈ…ε•οΌŒη„ΆεŽη”¨`--theme=TwoDark`ζ₯ζŒ‡εšδΈ»ι’˜δΈΊ`TwoDark`,也可δ»₯ι€šθΏ‡θΎη½`BAT_THEME`ηŽ―ε’ƒε˜ι‡ζ₯选εšδΈ»ι’˜γ€‚ζŠŠ`export BAT_THEME="TwoDark"`添加到 shell ηš„ε―εŠ¨θ„šζœ¬οΌˆshell startup fileοΌ‰ζ₯ε–εΎ—ζ°ΈδΉ…ζ•ˆζžœγ€‚ζˆ–θ€…δ½Ώη”¨`bat`ηš„[配η½ζ–‡δ»Ά](#c配η½ζ–‡δ»Ά) θ‹₯想要ζŸ₯ηœ‹ζ‰€ζœ‰δΈ»ι’˜εœ¨δΈ€δΈͺζ–‡δ»ΆδΈŠηš„ζ˜Ύη€Ίζ•ˆζžœε―δ»₯η”¨δΈ€δΈ‹ε‘½δ»€οΌˆιœ€θ¦ε‰θ£…`fzf`οΌ‰οΌš ```bash bat --list-themes | fzf --preview="bat --theme={} --color=always /path/to/file" ``` `bat`在默θ€ζƒ…ε†΅δΈ‹θƒ½ε€Ÿεœ¨ι»‘θ‰²δΈ»ι’˜θƒŒζ™―δΈ‹θŽ·εΎ—θΎƒε₯½ηš„ζ•ˆζžœοΌŒε¦‚ζžœδ½ ηš„η»ˆη«―使用δΊθ‰²θƒŒζ™―,可δ»₯θ―•θ―•`GitHub`ζˆ–`OneHalfLight`γ€‚ζƒ³θ¦ζ·»εŠ θ‡ͺεšδΉ‰δΈ»ι’˜ε―δ»₯参考[添加主钘](#添加主钘)。 ### 8-bit 主钘 `bat` θ‡ͺεΈ¦δΈ‰δΈͺ [8-bit 色彩](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors) 主钘: - `ansi` ι€‚εΊ”δΊŽε€§ιƒ¨εˆ†η»ˆη«―γ€‚εƒδ½Ώη”¨ 3-bit θ‰²ε½©οΌšι»‘ηΊ’η»Ώι»„θ“ζ΄‹ηΊ’ι›ι’η™½γ€‚ - `base16`δΈ“δΈΊ [base16](https://github.com/chriskempson/base16) 终端θΎθ‘。εƒδ½Ώη”¨ 4-bit θ‰²ε½©οΌˆεΈ¦ζœ‰δΊεΊ¦ηš„ 3-bit θ‰²ε½©οΌ‰γ€‚ζ Ήζ [base16 styling guidelines](https://github.com/chriskempson/base16/blob/master/styling.md) εˆΆδ½œγ€‚ - `base16-25`δΈ“δΈΊ [base16-shell](https://github.com/chriskempson/base16-shell) θΎθ‘。εƒζŠŠιƒ¨εˆ†δΊθ‰²ζ›Ώζ’δΈΊ 8-bit 色彩。请不要直ζŽ₯使用θ―₯δΈ»ι’˜οΌŒι™€ιžδ½ ζΈ…ζ₯šδ½ ηš„256θ‰²η»ˆη«―ζ˜―ε¦δ½Ώη”¨ base16-shell。 ε°½η‘θΏ™δΊ›δΈ»ι’˜ε…·ζœ‰θ―Έε€šι™εˆΆοΌŒδ½†ε…·ζœ‰δΈ€δΊ› truecolor δΈ»ι’˜δΈε…·ζœ‰ηš„δΈ‰δΈͺδΌ˜η‚ΉοΌš - δΊ«ζœ‰ζœ€δ½³ε…ΌεΉζ€§γ€‚εΉΆδΈζ˜―ζ‰€ζœ‰η»ˆη«―ε·₯ε…·ιƒ½ζ”―ζŒι«˜δΊŽ 3-bit ηš„θ‰²ε½©γ€‚ - ι€‚εΊ”η»ˆη«―δΈ»ι’˜γ€‚ - θ§†θ§‰δΈŠε’Œε…Άδ»–ηš„η»ˆη«―ε·₯具更协调。 ### 输出样式 你可δ»₯用`--style`参数ζ₯控刢`bat`θΎ“ε‡Ίηš„ζ ·εΌγ€‚δ½Ώη”¨`--style=numbers,changes`可δ»₯εͺ开启 Git δΏζ”Ήε’Œθ‘Œε·ζ˜Ύη€Ίθ€ŒδΈζ·»εŠ ε…Άδ»–ε†…εΉγ€‚`BAT_STYLE`ηŽ―ε’ƒε˜ι‡ε…·ζœ‰η›ΈεŒεŠŸθƒ½γ€‚ ### ζ·»εŠ ζ–°ηš„θ―­θ¨€ε’Œθ―­ζ³• ε½“ηŽ°ζœ‰ηš„`bat`δΈζ”―ζŒζŸδΈͺθ―­θ¨€ζˆ–θ―­ζ³•ζ—Άδ½ ε―δ»₯θ‡ͺε·±ζ·»εŠ γ€‚ `bat`使用`syntect`εΊ“ζ₯ζ”―ζŒθ―­ζ³•ι«˜δΊοΌŒθ―₯库使用 [Sublime Text `.sublime-syntax` 语法文仢](https://www.sublimetext.com/docs/3/syntax.html)ε’ŒδΈ»ι’˜γ€‚θ€ŒεŽθ€…δΈ­ηš„ε€§ιƒ¨εˆ†ε―δ»₯在 [Package Control](https://packagecontrol.io/) ζ‰Ύεˆ°γ€‚ ε½“δ½ ζ‰Ύεˆ°δΈ€δ»½θ―­ζ³•ζ–‡δ»ΆοΌŒζŒ‰η…§δΈ‹εˆ—ζ–Ήζ³•οΌš 1. εˆ›ε»ΊεŒ…ε«θ―­ζ³•ζθΏ°ζ–‡δ»Άηš„η›ε½•οΌš ```bash mkdir -p "$(bat --config-dir)/syntaxes" cd "$(bat --config-dir)/syntaxes" # Put new '.sublime-syntax' language definition files # in this folder (or its subdirectories), for example: git clone https://github.com/tellnobody1/sublime-purescript-syntax ``` 2. θ°ƒη”¨δΈ‹ι’ζŒ‡δ»€ζŠŠζ–‡δ»Άθ½¬ζ’δΈΊδΊŒθΏ›εˆΆηΌ“ε­˜οΌš ```bash bat cache --build ``` 3. ζœ€εŽη”¨`bat --list-languages`ζ₯ζ£€ζŸ₯ζ–°ηš„θ―­ζ³•ζ˜―ε¦θ’«ζˆεŠŸε―Όε…₯γ€‚ε¦‚ζžœζƒ³θ¦ε›žζ»šεˆ°ζœ€εˆηŠΆζ€οΌŒζ‰§θ‘ŒοΌš ```bash bat cache --clear ``` 4. ε¦‚ζžœδ½ θ§‰εΎ—`bat`ζœ‰εΏ…θ¦θ‡ͺεΈ¦θ―₯θ―­ζ³•ζ”―ζŒοΌŒθ―·εœ¨ι˜…θ―»[ζŒ‡ε―Ό](doc/assets.md)εŽε‘δ»“εΊ“ζδΊ€ [Syntax Request](https://github.com/sharkdp/bat/issues/new?labels=syntax-request&template=syntax_request.md)。 ### 添加主钘 η±»δΌΌζ·»εŠ θ―­ζ³•ζ”―ζŒοΌŒη¬¬δΈ€ζ­₯δΉŸζ˜―εˆ›ε»ΊδΈ€δΈͺεΈ¦ζœ‰θ―­ζ³•ι«˜δΊηš„η›ε½• ```bash mkdir -p "$(bat --config-dir)/themes" cd "$(bat --config-dir)/themes" # δΈ‹θ½½δΈ€δΈͺ主钘 git clone https://github.com/greggb/sublime-snazzy # ζ›΄ζ–°δΊŒθΏ›εˆΆηΌ“ε­˜ bat cache --build ``` η„ΆεŽη”¨`bat --list-themes`ζ£€ζŸ₯ζ·»εŠ ζ˜―ε¦ζˆεŠŸγ€‚ ### ζ·»εŠ ζˆ–δΏζ”Ήζ–‡δ»Άε…³θ” 你可δ»₯用`--map-syntax`ε‚ζ•°ζ·»εŠ ζˆ–δΏζ”Ήζ–‡δ»Άεζ¨‘板。εƒιœ€θ¦δΈ€δΈͺη±»δΌΌ`pattern:syntax`ηš„ε‚ζ•°ζ₯ζŒ‡εšοΌŒε…ΆδΈ­`pattern`是 glob ζ–‡δ»ΆεŒΉι…ζ¨‘ζΏοΌŒ`syntax`εˆ™ζ˜―ζ”―ζŒηš„θ―­ζ³•ηš„εŒζ•΄εοΌˆδ½Ώη”¨`bat --list-languages`ζ₯ζŸ₯ηœ‹θŽ·ε–δΈ€δ»½ζΈ…ε•οΌ‰γ€‚ ζ³¨ζ„οΌšζ–ΉδΎΏθ΅·θ§οΌŒδ½ ε―θƒ½ιœ€θ¦ζŠŠε‚ζ•°ζ·»εŠ εˆ°ι…η½ζ–‡δ»ΆοΌŒθ€ŒδΈζ˜―ζ―ζ¬‘ιƒ½εœ¨ε‘½δ»€θ‘ŒδΈ­δΌ ι€’θ―₯参数。 δ»₯δΈ‹ε±•η€ΊδΊ†ζŠŠβ€œINIβ€ε…³θ”εˆ°ε…·ζœ‰`.conf`ζ‰©ε±•εηš„ζ–‡δ»Ά ```bash --map-syntax='*.conf:INI' ``` 把`.ignore`ζ–‡δ»ΆδΈŽβ€œGit Ignore”关联 ```bash --map-syntax='.ignore:Git Ignore' ``` 把`/etc/apache2`ε†…ηš„`.conf`ζ–‡δ»Άε…³θ”εˆ°β€œApache Confβ€θ―­ζ³•οΌˆ`bat`已默θ€η»‘εšοΌ‰ ```bash --map-syntax='/etc/apache2/**/*.conf:Apache Conf' ``` ### 使用θ‡ͺεšδΉ‰εˆ†ι‘΅ε™¨ `bat`默θ€δ½Ώη”¨`PAGER`ηŽ―ε’ƒε˜ι‡εšδΉ‰ηš„εˆ†ι‘΅ε™¨οΌŒε¦‚ζžœζ²‘ζœ‰εšδΉ‰εˆ™δ½Ώη”¨`less`。`bat`提供了`BAT_PAGER`ηŽ―ε’ƒε˜ι‡ζ₯δΈ“δΈΊ`bat`ι€‰ζ‹©εˆ†ι‘΅ε™¨οΌˆδΌ˜ε…ˆηΊ§ι«˜δΊŽ`PAGER`)。 ζ³¨ζ„οΌšε½“`PAGER`θΎη½δΈΊ`more`ζˆ–`most`ζ—ΆοΌŒ`bat`δΌšδ½Ώη”¨`less`ζ₯代替δ»₯η‘δΏθƒ½ζδΎ›θ‰²ε½©ζ”―ζŒγ€‚ ```bash export BAT_PAGER="less -RF" ``` ι™€δΊ†δ½Ώη”¨ηŽ―ε’ƒε˜ι‡ζ₯ζ”Ήε˜`bat`δ½Ώη”¨ηš„ηš„εˆ†ι‘΅ε™¨οΌŒδΉŸε―δ»₯εœ¨ι…η½ζ–‡δ»ΆδΈ­ζδΎ›`--pager`参数。 ζ³¨ζ„οΌš`bat`δΌšζŠŠιƒ¨εˆ†ε‘½δ»€θ‘Œε‚ζ•°η›΄ζŽ₯δΌ ι€’η»™εˆ†ι‘΅ε™¨οΌš`-R`/`--RAW-CONTROL-CHARS`,`-F`/`--quit-if-one-screen`δ»₯及`-X`/`--no-init`(θ―₯ε‚ζ•°δ»…ι€‚η”¨δΊŽι«˜δΊŽ530η‰ˆζœ¬ηš„`less`)。兢中`-R` ε‚ζ•°ιœ€θ¦εœ¨θ§£ι‡Š ANSI ζ ‡ε‡†ι’œθ‰²ζ—Άθ΅·δ½œη”¨γ€‚`-F`εˆ™ζŒ‡η€Ί`less`εœ¨θΎ“ε‡Ίε†…εΉηš„εž‚η›΄ε°Ίε―Έε°δΊŽη»ˆη«―尺寸既立即退出。当文仢内εΉε―δ»₯εœ¨δΈ€δΈͺε±εΉ•ι‡ŒεŒε…¨ζ˜Ύη€Ίζ—ΆοΌŒε°±δΈιœ€θ¦ζŒ‰`q`ι”ι€€ε‡Ίι˜…θ―»ζ¨‘εΌοΌŒεΎˆζ–ΉδΎΏε°±ζ˜―δΊ†γ€‚`-X`εˆ™θƒ½δΏε€`-F`在`less`ηš„θ€η‰ˆζœ¬δΈ­ηš„δΈ€δΊ›bugοΌˆδ»£δ»·ζ˜―δΈζ”―ζŒιΌ ζ ‡ζ»šθ½οΌŒδ½†ε―δ»₯用`-R`ζ₯ε–ζΆˆ`quit-if-one-screen`εŠŸθƒ½γ€‚οΌ‰γ€‚ ### ηΌ©θΏ› `bat` 使用四δΈͺη©Ίζ Όε½ηš„εˆΆθ‘¨η¬¦οΌŒθ€ŒδΈε—εˆ†ι‘΅ε™¨ε½±ε“οΌŒεŒζ—ΆδΉŸε―δ»₯用`--tabs`参数ζ₯θ‡ͺεšδΉ‰γ€‚ ζ³¨ζ„οΌšι€šθΏ‡ε…Άδ»–ζ–Ήζ³•ι’ˆε―Ήεˆ†ι‘΅ε™¨ηš„εˆΆθ‘¨η¬¦θΎη½δΈδΌšη”Ÿζ•ˆοΌˆδΎ‹ε¦‚ι€šθΏ‡`bat`ηš„`--pager`ε‚ζ•°δΌ ι€’ζˆ–`less`δ½Ώη”¨ηš„`LESS`ηŽ―ε’ƒε˜ι‡οΌ‰γ€‚ε› δΈΊεœ¨θΎ“ε‡ΊζδΊ€η»™εˆ†ι‘΅ε™¨δΉ‹ε‰οΌŒε†…εΉδΈ­ηš„εˆΆθ‘¨η¬¦ε°±ε·²η»θ’«`bat`替捒为了特εšι•ΏεΊ¦ηš„η©Ίζ Όδ»₯ιΏε…η”±δΊŽθΎΉζ ε―Όθ‡΄ηš„ηΌ©θΏ›ι—ι’˜γ€‚δ½ ε―δ»₯用给`bat`δΌ ι€’`--tabs=0`参数ζ₯ε–ζΆˆθ―₯θΎεšεΉΆθ©εˆ†ι‘΅ε™¨θ‡ͺε·±ε€„η†εˆΆθ‘¨η¬¦γ€‚ ### ζš—θ‰²ζ¨‘εΌ ε¦‚ζžœδ½ η”¨ηš„ macOS ε€„δΊŽζš—θ‰²ζ¨‘εΌοΌŒδ½ ε―δ»₯δΈΊ`bat`ε―η”¨εŸΊδΊŽη³»η»ŸδΈ»ι’˜ηš„δΈ»ι’˜γ€‚ε¦‚δΈ‹ζ‰€η€Ίζ“δ½œδΌšθ©`bat`εœ¨η³»η»Ÿε€„δΊŽδΊθ‰²ζ¨‘εΌζ—ΆεŠ θ½½`GitHub`δΈ»ι’˜ε’Œζš—θ‰²ζ¨‘εΌζ—ΆεŠ θ½½`default`δΈ»ι’˜γ€‚ ```bash alias cat="bat --theme=\$(defaults read -globalDomain AppleInterfaceStyle &> /dev/null && echo default || echo GitHub)" ``` ## 配η½ζ–‡δ»Ά ```bash bat --config-file ``` 你也可δ»₯用`BAT_CONFIG_PATH`ζ₯δΈΊ`bat`ζŒ‡εšθ‡ͺεšδΉ‰δ½η½ηš„配η½ζ–‡δ»ΆοΌš ```bash export BAT_CONFIG_PATH="/path/to/bat.conf" ``` 使用`--generate-config-file`参数调用`bat`δΌšεœ¨ζŒ‡εšδ½η½η”ŸζˆδΈ€δ»½ι»˜θ€ηš„`bat`配η½ζ–‡δ»ΆοΌš ```bash bat --generate-config-file ``` ### 格式 配η½ζ–‡δ»Άε…Άεžζ˜―δΈ€δ»½ζŒ‰θ‘Œεˆ†ε‰²ηš„ε‘½δ»€θ‘Œε‚ζ•°εˆ—θ‘¨γ€‚δ½ ε―δ»₯用`bat --help`ζ₯ζŸ₯ηœ‹ζ‰€ζœ‰ε―η”¨ηš„ε‚ζ•°ε’Œι€‚η”¨ηš„ε€Όγ€‚ι…η½ζ–‡δ»ΆδΈ­`#`ζ‰“ε€΄ηš„θ‘ŒδΌšθ’«θ§†δΈΊζ³¨ι‡Šθ€ŒδΈη”Ÿζ•ˆγ€‚ δ»₯δΈ‹ζ˜―δΈ€δ»½η€ΊδΎ‹οΌš ```bash # θΎη½δΈ»ι’˜δΈΊ TwoDark --theme="TwoDark" # ζ˜Ύη€Ίθ‘Œε·ε’Œ Git δΏζ”ΉδΏ‘息, δ½†ζ²‘ζœ‰θΎΉζ‘† --style="numbers,changes,header" # 在终端中δ»₯ζ–œδ½“θΎ“ε‡Ίζ–‡ζœ¬οΌˆδΈζ˜―ζ‰€ζœ‰η»ˆη«―ιƒ½ζ”―ζŒοΌ‰ --italic-text=always # 使用 C++ 语法ζ₯η»™ Arduino ηš„ .ino ζ–‡δ»ΆζδΎ›ι«˜δΊ --map-syntax "*.ino:C++" ``` ## 在 Windows 中使用 `bat` `bat` 在 Windows δΈŠεΌ€η±ε³η”¨οΌŒι™€δΊ†ιƒ¨εˆ†εŠŸθƒ½ιœ€θ¦ι’ε€–ι…η½γ€‚ ### 前η½ζ‘δ»Ά δ½ ιœ€θ¦ε…ˆε‰θ£… [Visual C++ Redistributable](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) εŒ…γ€‚ ### εˆ†ι‘΅ Windows εͺζœ‰δΈ€δΈͺζδΎ›ζœ‰ι™εŠŸθƒ½ηš„εˆ†ι‘΅ε™¨οΌŒδ½ ε―δ»₯从[θΏ™ι‡ŒδΈ‹θ½½](http://www.greenwoodsoftware.com/less/download.html)ζˆ–η”¨ [Chocolatey ε‰θ£…](https://chocolatey.org/packages/Less) Windows η‰ˆζœ¬ηš„`less`γ€‚η¬¬δΈ€η§ζ–Ήζ³•ιœ€θ¦δ½ ζŠŠεƒζ‰€εœ¨η›ε½•εŠ ε…₯`PATH`ηŽ―ε’ƒε˜ι‡ζˆ–[εšδΉ‰εˆ†ι‘΅ε™¨ε˜ι‡](#使用θ‡ͺεšδΉ‰εˆ†ι‘΅ε™¨) ### 色彩 Windows 10 从 [v1511](https://en.wikipedia.org/wiki/Windows_10_version_history#Version_1511_(November_Update)) εΌ€ε§‹ shell(`conhost.exe`οΌŒε‘½δ»€ζη€Ίη¬¦ζˆ– PowershellοΌ‰εŽŸη”Ÿζ”―ζŒθ‰²ε½©γ€‚εœ¨ζ—©δΊ›η‰ˆζœ¬ηš„ Windows 中你可δ»₯η”¨η¬¬δΈ‰ζ–Ήη»ˆη«―ε¦‚ [Cmder](http://cmder.net/) οΌˆδ½Ώη”¨[ConEmu](https://conemu.github.io/))。 ζ³¨ζ„οΌšGit ε’Œ MSYS η‰ˆζœ¬ηš„ `less` 沑法正η‘在 Windows θ‘¨θΎΎθ‰²ε½©γ€‚ε¦‚ζžœδ½ ζ²‘ζœ‰ε‰θ£…ε…Άδ»–εˆ†ι‘΅ε™¨οΌŒδ½ ε―δ»₯η›΄ζŽ₯用`--paging=never`ζˆ–θΎη½`BAT_PAGER`为空字符串ζ₯ε…³ι—­εˆ†ι‘΅εŠŸθƒ½γ€‚ ### Cygwin Windows δΈŠηš„`bat`εŽŸη”ŸδΈζ”―ζŒ Cygwin' unix-style θ·―εΎ„οΌˆ`/cygdrive/*`)。当传递一δΈͺ绝对 cygwin θ·―εΎ„δ½œδΈΊε‚ζ•°ε€Όζ—ΆοΌŒ`bat`δΌšδΊ§η”Ÿ`The system cannot find the path specified. (os error 3)`ηš„ι”™θ――γ€‚δ½ ε―δ»₯`.bash_profile`ζ–‡δ»ΆδΈ­ζ·»εŠ δ»₯下函数ζ₯解决这δΈͺι—ι’˜γ€‚ ```bash bat() { local index local args=("$@") for index in $(seq 0 ${#args[@]}) ; do case "${args[index]}" in -*) continue;; *) [ -e "${args[index]}" ] && args[index]="$(cygpath --windows "${args[index]}")";; esac done command bat "${args[@]}" } ``` ## η–‘ιšΎθ§£η­” ### θΎ“ε‡Ίε†…εΉε«η³ŠδΈζΈ… 当输ε…₯ζ–‡δ»ΆεŒ…ε«ι’œθ‰²δ»£η ε’Œε…Άδ»– ANSI θ½¬δΉ‰η¬¦ε·ζ—ΆοΌŒ`bat`δΌšδΊ§η”Ÿι”™θ――ηš„θ―­ζ³•ι«˜δΊε’Œζ–‡ζœ¬οΌŒε―Όθ‡΄θΎ“ε‡Ίηœ‹θ΅·ζ₯δ»€δΊΊζ— ζ³•η†θ§£γ€‚ε½“δ½ ιœ€θ¦θΎ“ε‡Ίθ―₯ζ–‡δ»Άζ—ΆοΌŒθ―·δ½Ώη”¨`--color=never --wrap=never`参数ζ₯ε…³ι—­δΈŠθ‰²ε’Œζ–‡ε­—εŒ…θ£Ήγ€‚ ### η»ˆη«―δΈŽθ‰²ε½© `bat`δΌšεŒΊεˆ†ζ”―ζŒ truecolor ε’ŒδΈζ”―ζŒ truecolor ηš„η»ˆη«―γ€‚δ½†ζ˜―ε€§ιƒ¨εˆ†θ―­ζ³•ι«˜δΊδΈ»ι’˜ιƒ½ζ˜―η”¨δΊ†ζ²‘ζœ‰δΈΊ 8-bit θ‰²ε½©ζ”―ζŒηš„ι’œθ‰²οΌŒε› ζ­€εΌΊηƒˆζŽ¨θδ½Ώη”¨δΈ€δΈͺζ”―ζŒ 24-bit θ‰²ε½©ηš„η»ˆη«―οΌˆ`terminator`,`konsole`,`iTerm2`...οΌ‰οΌŒζˆ–δ½Ώη”¨δΈ€δΈͺ [8-bit 主钘](#8-bit-主钘)ζ₯ι™εˆΆδΈ€δΊ›ι’œθ‰²γ€‚ζŸ₯ηœ‹[这篇文章使用θ‡ͺεšδΉ‰εˆ†ι‘΅ε™¨](https://gist.github.com/XVilka/8346728)δΊ†θ§£ζ›΄ε€šζ”―ζŒ truecolor ηš„η»ˆη«―γ€‚δ½ ιœ€θ¦εšδΉ‰`COLORTERM`ε˜ι‡δΈΊ`truecolor`ζˆ–`24bit`ζ₯η‘保`bat`θƒ½ε€Ÿθ―†εˆ«η»ˆη«―ηš„ε―Ήι’œθ‰²ηš„ζ”―ζŒοΌŒε¦εˆ™δΌšδ½Ώη”¨ 8 bit 樑式。 ### θ‘Œε·ε’ŒθΎΉζ‘†εΎˆιšΎηœ‹ζΈ… θ―•θ―•ε…Άδ»–δΈ»ι’˜οΌŒθ―΄δΈεšθƒ½ζœ‰ζ‰€ζ”Ήε–„οΌˆη”¨`bat --list-themes`ζŸ₯ηœ‹δΈ»ι’˜εˆ—θ‘¨οΌ‰γ€‚ ### 文仢编码 `bat`εŽŸη”Ÿζ”―ζŒ UTF-8 ε’Œ UTF-16γ€‚θ‡³δΊŽε…Άδ»–ζ–‡δ»Άδ½ ε―θƒ½ιœ€θ¦εœ¨δ½Ώη”¨`bat`δΉ‹ε‰ε…ˆζŠŠηΌ–η θ½¬ζ’εˆ°UTF-8。 θΏ™ι‡Œε±•η€ΊδΊ†δ½Ώη”¨`iconv`ζ₯把 Latin-1(ISO-8859-1) ηΌ–η ηš„ PHP ζ–‡δ»Άθ½¬ζ’εˆ° UTF-8: ```bash iconv -f ISO-8859-1 -t UTF-8 my-file.php | bat ``` ζ³¨ζ„οΌš 当`bat`ζ— ζ³•θ―†εˆ«θ―­θ¨€ζ—Άδ½ ε―θƒ½δΌšιœ€θ¦`-l`/`--language`参数。 ## 开发 ```bash # ι€’ε½’ clone δ»₯θŽ·ε–ζ‰€ζœ‰ε­ζ¨‘ε— git clone --recursive https://github.com/sharkdp/bat # ζž„ε»ΊοΌˆθ°ƒθ―•η‰ˆζœ¬οΌ‰ cd bat cargo build --bins # θΏθ‘Œε•ε…ƒζ΅‹θ―•ε’Œι›†ζˆζ΅‹θ―• cargo test # ε‰θ£…οΌˆε‘εΈƒη‰ˆζœ¬οΌ‰ cargo install --path . --locked # 使用δΏζ”ΉεŽηš„θ―­ζ³•ε’ŒδΈ»ι’˜ζž„ε»ΊδΈ€δΈͺ bat δΊŒθΏ›εˆΆζ–‡δ»Ά bash assets/create.sh cargo install --path . --locked --force ``` ε¦‚ζžœδ½ ζƒ³ζž„ε»ΊδΈ€δΈͺ使用 `bat` ηΎŽεŒ–ζ‰“ε°εŠŸθƒ½ηš„εΊ”η”¨η¨‹εΊοΌŒθ―·ζŸ₯ηœ‹ [API ζ–‡ζ‘£](https://docs.rs/bat/)γ€‚θ―·ζ³¨ζ„οΌŒε½“δ½ δΎθ΅– `bat` δ½œδΈΊεΊ“ζ—ΆοΌŒεΏ…ι‘»δ½Ώη”¨ `regex-onig` ζˆ– `regex-fancy` δ½œδΈΊη‰Ήζ€§γ€‚ ## θ΄‘ηŒζŒ‡ε— θ―·ζŸ₯ηœ‹ [`CONTRIBUTING.md`](CONTRIBUTING.md) ζŒ‡ε—γ€‚ ## η»΄ζŠ€θ€… - [sharkdp](https://github.com/sharkdp) - [eth-p](https://github.com/eth-p) - [keith-hall](https://github.com/keith-hall) - [Enselic](https://github.com/Enselic) ## ε‰ε…¨ζΌζ΄ž ε¦‚ζžœδ½ ζƒ³ζŠ₯ε‘Š `bat` δΈ­ηš„ζΌζ΄žοΌŒθ―·ι€šθΏ‡ι‚仢联系 [David Peter](https://david-peter.de/)。 ## ι‘Ήη›η›ζ ‡ε’Œζ›Ώδ»£ζ–Ήζ‘ˆ `bat` θ―•ε›Ύεžηްδ»₯δΈ‹η›ζ ‡οΌš - ζδΎ›ηΎŽθ§‚ηš„ι«˜ηΊ§θ―­ζ³•ι«˜δΊ - 与 Git ι›†ζˆδ»₯ζ˜Ύη€Ίζ–‡δ»ΆδΏζ”Ή - 成为 (POSIX) `cat` ηš„ζ›Ώδ»£ε“ - ζδΎ›η”¨ζˆ·ε‹ε₯½ηš„ε‘½δ»€θ‘Œη•Œι’ ε¦‚ζžœδ½ εœ¨ε―»ζ‰Ύη±»δΌΌηš„η¨‹εΊοΌŒζœ‰εΎˆε€šζ›Ώδ»£ζ–Ήζ‘ˆγ€‚θ―·ε‚ι˜…[ζœ¬ζ–‡ζ‘£](doc/alternatives.md)θΏ›θ‘Œζ―”θΎƒγ€‚ ## θΈε―证 η‰ˆζƒζ‰€ζœ‰ (c) 2018-2021 [bat-developers](https://github.com/sharkdp/bat)。 `bat` ε―ζ Ήζ MIT θΈε―θ―ζˆ– Apache θΈε―证 2.0 ηš„ζ‘ζ¬Ύδ½Ώη”¨οΌŒδ»»ι€‰ε…ΆδΈ€γ€‚ ζœ‰ε…³θΈε―θ―ηš„θ―¦η»†δΏ‘ζ―οΌŒθ―·ε‚ι˜… [LICENSE-APACHE](LICENSE-APACHE) ε’Œ [LICENSE-MIT](LICENSE-MIT) 文仢。 bat-0.25.0/doc/alternatives.md000064400000000000000000000170331046102023000142520ustar 00000000000000# Alternatives The following table tries to give an overview *from `bat`s perspective*, i.e. we only compare categories which are relevant for `bat`. Some of these projects have completely different goals and if you are not looking for a program like `bat`, this comparison might not be for you. | | bat | [pygments](http://pygments.org/) | [highlight](http://www.andre-simon.de/doku/highlight/highlight.php) | [ccat](https://github.com/jingweno/ccat) | [source-highlight](https://www.gnu.org/software/src-highlite/) | [hicat](https://github.com/rstacruz/hicat) | [coderay](https://github.com/rubychan/coderay) | [rouge](https://github.com/jneen/rouge) | [clp](https://github.com/jpe90/clp) | |----------------------------------------------|---------------------------------------------------------------------|----------------------------------|---------------------------------------------------------------------|------------------------------------------|----------------------------------------------------------------|-----------------------------------------------------|-----------------------------------------------------|-----------------------------------------------------|-----------------------------------------------------| | Drop-in `cat` replacement | :heavy_check_mark: [*](https://github.com/sharkdp/bat/issues/134) | :x: | :x: | (:heavy_check_mark:) | :x: | :x: [*](https://github.com/rstacruz/hicat/issues/6) | :x: | :x: | :x: | | Git integration | :heavy_check_mark: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | | Automatic paging | :heavy_check_mark: | :x: | :x: | :x: | :x: | :heavy_check_mark: | :x: | :x: | :x: | | Languages (circa) | 150 | 300 | 200 | 7 | 80 | 130 | 30 | 130 | 150 | | Extensible (languages, themes) | :heavy_check_mark: | (:heavy_check_mark:) | (:heavy_check_mark:) | :x: | (:heavy_check_mark:) | :x: | :x: | :x: | :heavy_check_mark: | | Advanced highlighting (e.g. nested syntaxes) | :heavy_check_mark: | :heavy_check_mark: | (:heavy_check_mark:) ? | :x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | | Execution time [ms] (`jquery-3.3.1.js`) | 422 | 455 | 299 | 39 | 208 | 287 | 128 | 740 | 22 | | Execution time [ms] (`miniz.c`) | 27 | 169 | 19 | 4 | 36 | 131 | 58 | 231 | 4 | | Execution time [ms] (957 kB XML file) | 215 | 296 | 236 | 165 | 83 | 412 | 135 | 386 | 127 | If you think that some entries in this table are outdated or wrong, please open a ticket or pull request. Some other alternatives that are also related, but not yet included in the table: - [lesspipe](https://github.com/wofr06/lesspipe) - [vimpager](https://github.com/rkitover/vimpager) ## Benchmarks The benchmarks above have been created with this script: ```bash #!/usr/bin/env bash cd "$(dirname "${BASH_SOURCE[0]}")" || exit if ! command -v hyperfine > /dev/null 2>&1; then echo "'hyperfine' does not seem to be installed." echo "You can get it here: https://github.com/sharkdp/hyperfine" exit 1 fi SRC="test-src/jquery-3.3.1.js" cmd_bat="bat --style=full --color=always --paging=never '$SRC'" cmd_bat_simple="bat --plain --wrap=never --tabs=0 --color=always --paging=never '$SRC'" cmd_pygmentize="pygmentize -g '$SRC'" cmd_highlight="highlight -O truecolor '$SRC'" cmd_ccat="ccat --color=always '$SRC'" cmd_source_highlight="source-highlight --failsafe --infer-lang -f esc -i '$SRC'" cmd_hicat="hicat '$SRC'" cmd_coderay="coderay '$SRC'" cmd_rouge="rougify '$SRC'" cmd_clp="clp '$SRC'" hyperfine --warmup 3 \ "$cmd_bat" \ "$cmd_bat_simple" \ "$cmd_pygmentize" \ "$cmd_highlight" \ "$cmd_ccat" \ "$cmd_source_highlight" \ "$cmd_hicat" \ "$cmd_coderay" \ "$cmd_rouge" \ "$cmd_clp" \ ``` bat-0.25.0/doc/assets.md000064400000000000000000000150211046102023000130460ustar 00000000000000## Adding new builtin languages for syntax highlighting Should you find that a particular syntax is not available within `bat` and think it should be included in `bat` by default, you can follow the instructions outlined below. `bat` uses the excellent [syntect](https://github.com/trishume/syntect) library to highlight source code. As a basis, syntect uses [Sublime Text](https://www.sublimetext.com/) syntax definitions in the `.sublime-syntax` format. **Important:** Before proceeding, verify that the syntax you wish to add meets the [criteria for inclusion](#Criteria-for-inclusion-of-new-syntaxes). 1. Find a Sublime Text syntax for the given language, preferably in a separate Git repository which can be included as a submodule (under `assets/syntaxes`) using `git submodule add ./assets/syntaxes/02_Extra/`, replacing the contents of the angle brackets as appropriate. 2. If the Sublime Text syntax is only available as a `.tmLanguage` file, open the file in Sublime Text and convert it to a `.sublime-syntax` file via *Tools* -> *Developer* -> *New Syntax from XXX.tmLanguage...*. Save the new file in the `assets/syntaxes` folder. If only `.tmLanguage.json` or `.tmLanguage.yml` file is available, use [PackageDev](https://packagecontrol.io/packages/PackageDev) to convert it to `.tmLanguage.plist` format and then rename the converted file to `.tmLanguage` file. 3. Run the `assets/create.sh` script. It calls `bat cache --build` to parse all available `.sublime-syntax` files and serialize them to a `syntaxes.bin` file. 4. Re-compile `bat`. At compilation time, the `syntaxes.bin` file will be stored inside the `bat` binary. 5. Use `bat --list-languages` to check if the new languages are available. 6. Add a syntax test for the new language. See [below](#Syntax-tests) for details. 7. If you send a pull request with your changes, please do *not* include the changed `syntaxes.bin` file. A new binary cache file will be created once before every new release of `bat`. This avoids bloating the repository size unnecessarily. ### Syntax tests `bat` has a set of syntax highlighting regression tests in `tests/syntax-tests`. The main idea is make sure that we do not run into issues we had in the past where either (1) syntax highlighting for some language is suddenly not working anymore or (2) `bat` suddenly crashes for some input (due to `regex` incompatibilities between `syntect` and Sublime Text). In order to add a new test file, please follow these steps (let's take "Ruby" as an example): 1. Make sure that you are running the **latest version of `bat`** and that `bat` is available on the path. If you are creating a syntax test for a new builtin syntax (see above), make sure that your version of `bat` already has the new syntax builtin. 2. Find an example Ruby source file or write one yourself. If possible, the file should aim to be "comprehensive" (i.e. include a lot of the possible syntax), but this is not strictly necessary. A simple file is better than none at all. Also, the files shouldn't be gigantic. 3. Save the file in `tests/syntax-tests/source/Ruby` (adapt for your language). The file name could be `test.rb` (adapt extension) but can also be adapted if that is necessary in order for `bat` to highlight it correctly (e.g. `Makefile`). 4. If you have copied the file from somewhere else, please make sure that the file *may* be copied under the respective license and that the license is compatible with `bat`s license. If it requires attribution, please add a `LICENSE.md` in the same folder with a text like this: ``` The `test.rb` file has been added from [enter source here] under the following license: [add license text here] ``` 5. Go to `tests/syntax-tests` and run the `update.sh` Bash script. A new file should be generated in the `highlighted` folder (e.g. `highlighted/Ruby/test.rb`). 6. Use `cat` or `bat --language=txt` to display the content of this file and make sure that the syntax highlighting looks correct. 7. `git add` the new files in the `source` folder as well as the autogenerated files in the `highlighted` folder. ### Troubleshooting Make sure that the local cache does not interfere with the internally stored syntaxes and themes (`bat cache --clear`). ## Criteria for inclusion of new syntaxes * More than 10,000 downloads at [Package Control](https://packagecontrol.io) ### Manual modifications The following files have been manually modified after converting from a `.tmLanguage` file: * `Apache.sublime_syntax`=> removed `conf` and `CONF` file types. * `Dart.sublime-syntax` => removed `#regex.dart` include. * `DotENV.sublime-syntax` => added `.env.template`, `env` and `env.*` file types ([upstream PR](https://github.com/zaynali53/DotENV/pull/17)). * `INI.sublime-syntax` => added `.coveragerc`, `.pylintrc`, `.gitlint`, `.hgrc`, `hgrc`, and `desktop` file types and support for comments after section headers. * `Org mode.sublime-syntax` => removed `task` file type. * `Robot.sublime_syntax` => changed name to "Robot Framework", added `.resource` extension. * `SML.sublime_syntax` => removed `ml` file type. * `wgsl.sublime-syntax` => added `wgsl` file extension. ### Non-submodule additions * `Assembly (x86_64)` has been manually added from https://github.com/13xforever/x86-assembly-textmate-bundle due to `git clone` recursion problems * `Nim.sublime-syntax` has been added manually from https://github.com/getzola/zola/blob/master/sublime_syntaxes/Nim.sublime-syntax as there was no suitable Git repository for it. The original syntax seems to originate from https://github.com/Varriount/NimLime * `Rego.sublime-syntax` has been added manually from https://github.com/open-policy-agent/opa/blob/master/misc/syntax/sublime/rego.sublime-syntax as it is not kept in a standalone repository. The file is generated from https://github.com/open-policy-agent/opa/blob/master/misc/syntax/textmate/Rego.tmLanguage * `SML.sublime_syntax` has been added manually from https://github.com/seanjames777/SML-Language-Definitiona as it is not kept in a standalone repository. The file generated is from https://github.com/seanjames777/SML-Language-Definition/blob/master/sml.tmLanguage * `Cabal.sublime_syntax` has been added manually from https://github.com/SublimeHaskell/SublimeHaskell/ - we don't want to include the whole submodule because it includes other syntaxes ("Haskell improved") as well. * `Lean.sublime-syntax` has been added manually from https://github.com/leanprover/vscode-lean/blob/master/syntaxes/lean.json via conversion. bat-0.25.0/doc/logo-header.svg000064400000000000000000000566031046102023000141440ustar 00000000000000 image/svg+xml bat-0.25.0/doc/long-help.txt000064400000000000000000000245141046102023000136570ustar 00000000000000A cat(1) clone with syntax highlighting and Git integration. Usage: bat [OPTIONS] [FILE]... bat Arguments: [FILE]... File(s) to print / concatenate. Use a dash ('-') or no argument at all to read from standard input. Options: -A, --show-all Show non-printable characters like space, tab or newline. This option can also be used to print binary files. Use '--tabs' to control the width of the tab-placeholders. --nonprintable-notation Set notation for non-printable characters. Possible values: * unicode (␇, ␊, ␀, ..) * caret (^G, ^J, ^@, ..) --binary How to treat binary content. (default: no-printing) Possible values: * no-printing: do not print any binary content * as-text: treat binary content as normal text -p, --plain... Only show plain style, no decorations. This is an alias for '--style=plain'. When '-p' is used twice ('-pp'), it also disables automatic paging (alias for '--style=plain --paging=never'). -l, --language Explicitly set the language for syntax highlighting. The language can be specified as a name (like 'C++' or 'LaTeX') or possible file extension (like 'cpp', 'hpp' or 'md'). Use '--list-languages' to show all supported language names and file extensions. -H, --highlight-line Highlight the specified line ranges with a different background color For example: '--highlight-line 40' highlights line 40 '--highlight-line 30:40' highlights lines 30 to 40 '--highlight-line :40' highlights lines 1 to 40 '--highlight-line 40:' highlights lines 40 to the end of the file '--highlight-line 30:+10' highlights lines 30 to 40 --file-name Specify the name to display for a file. Useful when piping data to bat from STDIN when bat does not otherwise know the filename. Note that the provided file name is also used for syntax detection. -d, --diff Only show lines that have been added/removed/modified with respect to the Git index. Use --diff-context=N to control how much context you want to see. --diff-context Include N lines of context around added/removed/modified lines when using '--diff'. --tabs Set the tab width to T spaces. Use a width of 0 to pass tabs through directly --wrap Specify the text-wrapping mode (*auto*, never, character). The '--terminal-width' option can be used in addition to control the output width. -S, --chop-long-lines Truncate all lines longer than screen width. Alias for '--wrap=never'. --terminal-width Explicitly set the width of the terminal instead of determining it automatically. If prefixed with '+' or '-', the value will be treated as an offset to the actual terminal width. See also: '--wrap'. -n, --number Only show line numbers, no other decorations. This is an alias for '--style=numbers' --color Specify when to use colored output. The automatic mode only enables colors if an interactive terminal is detected - colors are automatically disabled if the output goes to a pipe. Possible values: *auto*, never, always. --italic-text Specify when to use ANSI sequences for italic text in the output. Possible values: always, *never*. --decorations Specify when to use the decorations that have been specified via '--style'. The automatic mode only enables decorations if an interactive terminal is detected. Possible values: *auto*, never, always. -f, --force-colorization Alias for '--decorations=always --color=always'. This is useful if the output of bat is piped to another program, but you want to keep the colorization/decorations. --paging Specify when to use the pager. To disable the pager, use --paging=never' or its alias,'-P'. To disable the pager permanently, set BAT_PAGING to 'never'. To control which pager is used, see the '--pager' option. Possible values: *auto*, never, always. --pager Determine which pager is used. This option will override the PAGER and BAT_PAGER environment variables. The default pager is 'less'. To control when the pager is used, see the '--paging' option. Example: '--pager "less -RF"'. -m, --map-syntax Map a glob pattern to an existing syntax name. The glob pattern is matched on the full path and the filename. For example, to highlight *.build files with the Python syntax, use -m '*.build:Python'. To highlight files named '.myignore' with the Git Ignore syntax, use -m '.myignore:Git Ignore'. Note that the right-hand side is the *name* of the syntax, not a file extension. --ignored-suffix Ignore extension. For example: 'bat --ignored-suffix ".dev" my_file.json.dev' will use JSON syntax, and ignore '.dev' --theme Set the theme for syntax highlighting. Use '--list-themes' to see all available themes. To set a default theme, add the '--theme="..."' option to the configuration file or export the BAT_THEME environment variable (e.g.: export BAT_THEME="..."). Special values: * auto: Picks a dark or light theme depending on the terminal's colors (default). Use '--theme-light' and '--theme-dark' to customize the selected theme. * auto:always: Detect the terminal's colors even when the output is redirected. * auto:system: Detect the color scheme from the system-wide preference (macOS only). * dark: Use the dark theme specified by '--theme-dark'. * light: Use the light theme specified by '--theme-light'. --theme-light Sets the theme name for syntax highlighting used when the terminal uses a light background. Use '--list-themes' to see all available themes. To set a default theme, add the '--theme-light="..." option to the configuration file or export the BAT_THEME_LIGHT environment variable (e.g. export BAT_THEME_LIGHT="..."). --theme-dark Sets the theme name for syntax highlighting used when the terminal uses a dark background. Use '--list-themes' to see all available themes. To set a default theme, add the '--theme-dark="..." option to the configuration file or export the BAT_THEME_DARK environment variable (e.g. export BAT_THEME_DARK="..."). --list-themes Display a list of supported themes for syntax highlighting. -s, --squeeze-blank Squeeze consecutive empty lines into a single empty line. --squeeze-limit Set the maximum number of consecutive empty lines to be printed. --strip-ansi Specify when to strip ANSI escape sequences from the input. The automatic mode will remove escape sequences unless the syntax highlighting language is plain text. Possible values: auto, always, *never*. --style Configure which elements (line numbers, file headers, grid borders, Git modifications, ..) to display in addition to the file contents. The argument is a comma-separated list of components to display (e.g. 'numbers,changes,grid') or a pre-defined style ('full'). To set a default style, add the '--style=".."' option to the configuration file or export the BAT_STYLE environment variable (e.g.: export BAT_STYLE=".."). When styles are specified in multiple places, the "nearest" set of styles take precedence. The command-line arguments are the highest priority, followed by the BAT_STYLE environment variable, and then the configuration file. If any set of styles consists entirely of components prefixed with "+" or "-", it will modify the previous set of styles instead of replacing them. By default, the following components are enabled: changes, grid, header-filename, numbers, snip Possible values: * default: enables recommended style components (default). * full: enables all available components. * auto: same as 'default', unless the output is piped. * plain: disables all available components. * changes: show Git modification markers. * header: alias for 'header-filename'. * header-filename: show filenames before the content. * header-filesize: show file sizes before the content. * grid: vertical/horizontal lines to separate side bar and the header from the content. * rule: horizontal lines to delimit files. * numbers: show line numbers in the side bar. * snip: draw separation lines between distinct line ranges. -r, --line-range Only print the specified range of lines for each file. For example: '--line-range 30:40' prints lines 30 to 40 '--line-range :40' prints lines 1 to 40 '--line-range 40:' prints lines 40 to the end of the file '--line-range 40' only prints line 40 '--line-range 30:+10' prints lines 30 to 40 -L, --list-languages Display a list of supported languages for syntax highlighting. -u, --unbuffered This option exists for POSIX-compliance reasons ('u' is for 'unbuffered'). The output is always unbuffered - this option is simply ignored. --completion Show shell completion for a certain shell. [possible values: bash, fish, zsh, ps1] --diagnostic Show diagnostic information for bug reports. --acknowledgements Show acknowledgements. --set-terminal-title Sets terminal title to filenames when using a pager. -h, --help Print help (see a summary with '-h') -V, --version Print version bat-0.25.0/doc/release-checklist.md000064400000000000000000000062711046102023000151420ustar 00000000000000# Release checklist ## Version bump - [ ] Update version in `Cargo.toml`. Run `cargo build` to update `Cargo.lock`. Make sure to `git add` the `Cargo.lock` changes as well. - [ ] Find the current min. supported Rust version by running `cargo metadata --no-deps --format-version 1 | jq -r '.packages[0].rust_version'`. - [ ] Update the version and the min. supported Rust version in `README.md` and `doc/README-*.md`. Check with `git grep -i -e 'rust.*1\.' -e '1\..*rust' | grep README | grep -v tests/`. ## CHANGELOG.md updates - [ ] Go to https://github.com/sharkdp/bat/releases/new, click "Choose a tag", type the name of the tag that will be created later, click "Generate release notes". DO NOT ACTUALLY CREATE ANY RELEASE IN THIS STEP. - [ ] Compare current `CHANGELOG.md` with auto-generated release notes and add missing entries. Expect in particular dependabot PRs to not be in `CHANGELOG.md` since they are [auto-merged] if CI passes. - [ ] Introduce a section for the new release and perform final touch-ups. ## Update syntaxes and themes (build assets) - [ ] Install the latest master version (`cargo clean && cargo install --locked -f --path .`) and make sure that it is available on the `PATH` (`bat --version` should show the new version). - [ ] Run `assets/create.sh` and check in the binary asset files. ## Documentation - [ ] Review [`-h`](./short-help.txt), [`--help`](./long-help.txt), and the `man` page. The `man` page is shown in the output of the CI job called *Documentation*, so look there. The CI workflow corresponding to the tip of the master branch is a good place to look. ## Pre-release checks - [ ] Push all changes and wait for CI to succeed (before continuing with the next section). - [ ] Optional: manually test the new features and command-line options. To do this, install the latest `bat` version again (to include the new syntaxes and themes). - [ ] Run `cargo publish --dry-run` to make sure that it will succeed later (after creating the GitHub release). ## Release - [ ] Create a tag and push it: `git tag vX.Y.Z; git push origin tag vX.Y.Z`. This will trigger the deployment via GitHub Actions. REMINDER: If your `origin` is a fork, don't forget to push to e.g. `upstream` instead! - [ ] Go to https://github.com/sharkdp/bat/releases/new to create the new release. Select the new tag and also use it as the release title. For the release notes, copy the corresponding section from `CHANGELOG.md` and possibly add additional remarks for package maintainers. Publish the release. - [ ] Check if the binary deployment works (archives and Debian packages should appear when the CI run for the Git tag has finished). - [ ] Publish to crates.io by running `cargo publish` in a *clean* repository. The safest way to do this is to clone a fresh copy. ## Post-release - [ ] Prepare a new "unreleased" section at the top of `CHANGELOG.md`. Put this at the top: ``` # unreleased ## Features ## Bugfixes ## Other ## Syntaxes ## Themes ## `bat` as a library ``` [auto-merged]: https://github.com/sharkdp/bat/blob/master/.github/workflows/Auto-merge-dependabot-PRs.yml bat-0.25.0/doc/short-help.txt000064400000000000000000000050621046102023000140540ustar 00000000000000A cat(1) clone with wings. Usage: bat [OPTIONS] [FILE]... bat Arguments: [FILE]... File(s) to print / concatenate. Use '-' for standard input. Options: -A, --show-all Show non-printable characters (space, tab, newline, ..). --nonprintable-notation Set notation for non-printable characters. --binary How to treat binary content. (default: no-printing) -p, --plain... Show plain style (alias for '--style=plain'). -l, --language Set the language for syntax highlighting. -H, --highlight-line Highlight lines N through M. --file-name Specify the name to display for a file. -d, --diff Only show lines that have been added/removed/modified. --tabs Set the tab width to T spaces. --wrap Specify the text-wrapping mode (*auto*, never, character). -S, --chop-long-lines Truncate all lines longer than screen width. Alias for '--wrap=never'. -n, --number Show line numbers (alias for '--style=numbers'). --color When to use colors (*auto*, never, always). --italic-text Use italics in output (always, *never*) --decorations When to show the decorations (*auto*, never, always). --paging Specify when to use the pager, or use `-P` to disable (*auto*, never, always). -m, --map-syntax Use the specified syntax for files matching the glob pattern ('*.cpp:C++'). --theme Set the color theme for syntax highlighting. --theme-light Sets the color theme for syntax highlighting used for light backgrounds. --theme-dark Sets the color theme for syntax highlighting used for dark backgrounds. --list-themes Display all supported highlighting themes. -s, --squeeze-blank Squeeze consecutive empty lines. --style Comma-separated list of style elements to display (*default*, auto, full, plain, changes, header, header-filename, header-filesize, grid, rule, numbers, snip). -r, --line-range Only print the lines from N to M. -L, --list-languages Display all supported languages. --completion Show shell completion for a certain shell. [possible values: bash, fish, zsh, ps1] -h, --help Print help (see more with '--help') -V, --version Print version bat-0.25.0/doc/sponsors/warp-logo.png000064400000000000000000004030151046102023000155310ustar 00000000000000‰PNG  IHDRΰ-κ0ΉΠeXIfII* ΰ†Œ”(1 œ2ͺi‡Ύ77GIMP 2.10.382024:11:10 20:02:15 „ƒ₯„iCCPICC profilexœ}‘=HΓ@Ε_S₯R+‚vqΘPμΰβX«P„ ‘VhΥΑδ/h€Έ8 ?«.ΞΊ:Έ ‚ΰˆ³ƒ“’‹”ψΏ€Π"Φƒγ~Ό»χΈ{υ2Σ¬ ιΆ™JΔΕLvU Ό’A `2³Œ9IJ’γψΊ‡―wQžΥωܟ£OΝY π‰Δ1f˜6ρρΜ¦mpή'³’¬Ÿ›tAβG+Ώq.Έ,πΜ°™NΝ‡‰ΕB+m̊¦F 9Β6bKGD ½§“ pHYs  šœtIMEθ ’G€ IDATxΪ\½MΣe[rτd½Ο[uο΅₯™ΐΑaΐΦ@–Τj΅e όšϊόΖό"2Qh„$ hάέ·ήχμ½>2<ΉΦ©FŠŽθ{«κΌg―+σωJω_—Ω% TͺŠ’2¬u¨&ηq υU…Γαξθ½!₯pwΜ1Qk…™#η ηψ@Κ pGJ sLδ’srJp8TΑ}7δœas"₯„{άhwγηΛ ξ€€Ύ9?ΟY+RJψxG9*¦»Γ̐RBλ G­ό9ΜαY0ΖΰΈLs˜ΧhΈ{Γf€™ΐέc ؜€Ξγ„*  Hž "ψτφ†·RPTρ¨’€>TξΡqυŽξ‚'ξϋF΅VŒ9sEjB "‚š D€9'j> "p ž€χη…T Ϊέ7$π\δ”0ϊ”\ΠΪ σ*hg±ΦQΰ|{ η‚”χuγωΌ IρρρΔσωDλΐ΅œIα>‘šEaΣ δΜ³ίz Π’MΠ€°Ιο―”‚ZJœwƒ« œRV€€0sΜiθmΒ ϋœ½!«B‡ '@ψ ‡aNƒŠΐωΤ *Έοηyς]Λ χuAS‚JΒ°`šνwQSBzœHgΤα9aΞ 8€δ@JψΕΏϋ%š&ά61Η@λ6»`΁ΏSΏΓχω„<ξqCTΠ{‡‚ο£Ήa C©6 ’οGΖu](I ’pžANχ}Γ]ω>‹πρΙΪ49ΜΡ‘r†HBk7J)1­Γ§#APR…#ž©fXδRΰ»‘κ8λλωδ91‡;’qD\L A*ΓxQ(ΧuͺΡ@£™Α%aΊ£χ 7CΞšΨ,Β…ώμ°ψ|*‰ο³Z˜ΣαŒ9`ξ0sŒ9ψσ¦EΞΔw>'°ΉLY1|²Ήœ¬?ΐΜQJEo ͺŠZ ίi7ˆ(ΰŸ†Φ;ΰΆk¨π]J‰ ž(ct€’a21l@VLuΐžI’fŒ9as ΗgU$dΝp°1r†Ή`WS†›cΎ”lLΈϊθ(G¦±©@SΖτ‰i†’ψ}*g=0mΖ³už 7θγd³ΐΝaξ8Žƒο˜Θ)"sbΆ‰’2ά m^f£Γ]4#ύωΟϊ₯δ‚"_΄Αβ¨υˆ’ ¨θ~’ŠUJΌΡŽσ€›‘–ϊš(˜OˆΔ΄PRϊ”3r)h­ΗίΒΏ_δ”!‰”ˆ’”Š14₯Έ 3Dυ(°Ι/θΎο˜„,&&Ί”2Ƙ8ŽΒ +~͍Ÿ³δ€…ν<+ΰ†#W$Uΐ GΝHͺ˜ζ¨΅ΒέpŽZYΐx{œx;<ŽIrΙΈο'r.c’†«ί—"ϋrεΝpwk|ξ,sΒ§ADΠ{cю—9׌·σ 5””²’vfŽσ8ΠΗΐσΎS‚ͺBTa“/˜Ήcτq@DαΣ0zΌ,ͺ0c=ΖΐQ*ϊθȚΰΒI³ΟIπjΣ σDσΦΩUρηε%w”‚λΎYμγt­ΌΟS’’–Š9Ξσδμ,ΒYy©HtRό^:rR ›Pαdb6αΟΠΗΘ‰ΟΠNˆσ IωβΈ£Φ΅–θŒg6!ηΔΛ&\X λζΑuΐ'/›£Τ”‘5C]‘E qI6 ‚ίώ!ώΑω_γΧηί Onj–Α£qΚ9aΜΙη&‚a†\xαΤ=i³ŠΟ1ρ8NΨ4ΎgΡ Šͺiwžλϋ^…¦ Ώr.PˆsΪζΘ)3kbgoΡΨ¨ΐxpx1ωδd“ϊœ˜ΰχh>q·vΥ. ₯΄»#»@UχE3)T9υ'ε%¬Κiʝ”€w‘Έ£έ θ‰ΓYDs†™οχ\D ’°^₯x|²ŽπβT€”Y ϋ πx< ΚίΜ`ΰŸi1­l&Ξzžvmι1I• ―σK+IγΛs¨ςRΘ‰ο—›!—Μ>Υ nώMγΑι]D!*lšΝ£Φb7ΩjΌΠK)°ΈPDΚή2κίύ»ψΗμρoς/γε9l’Emc χ†acΧ!wή šW|ίi5kΣΏώ_FΌU£ΐ/Ψ纟(v»¦Υ}ρh*aQΎΤΡ•εθϊ@§Δ‹8ΗΨɚB<ώΉ›‘χ‰Β9Η„―‡fΆ!)έΕ0`ͺ(°G­πΔEG˜ HI`67άζζ„@ˆ8TbTœE tNΘ)!‰’έ74ώzΚ8j…ΝuH£ ζ q~¦1'Μ9†ΊΓ’+zο0›—ίeΒ‡-ρ»σ9œΗΙ Ρq+Φ΅Ό'Žσ¬1eIt\…; qΐlςσLΪϚί'‹‘Γ1'‰ΙQ•ƘF˜Πωςέ톁]¨¨βqœp€ 4ι~ޚ20 ³˜>ŒM‚(¦MhΚπ˜Xω™ωΉrfG›PR^cj)„zΗ4ΓqQDΨ5«*r*h½ανρΨg£δό:ƒšVΩFΚ5`Ξ‡¨&”Βσœ Œd…ŠβΊnηƒgM€’ž3¨ρ3Š;lNΤ’‘“B!<Ξζ}Γ>Ύ’]΄@%gδ’‘™}9*ΏΓœΩΗ9uwτΦ u˜E²&ΐœp„›M^@sξοWT’9˜cπBš†”ΧυD*%~.Ε=ή₯‰ιΐt“γP ©ΐ€*ΊڜFVU^œq†ο獣T$z'ŒΜgŽέP±ρΰ»=zίΠ” Π{G-6Ž9gŒι(™xL#‚⁠€ΒI²ίu1ŒΑ©Tυu˜O^RξΘ…₯ˆ²™#—LxhΜ}εT’† 6άƒ-ͺςy6Ύχυ8Ψτ\¦11zg³’•0ΗύEDQWξZο₯9ί§œ>'›ΒLΪέprΞhοψΏώκ―x6ΧδuΞΖ₯ρRk4༏Z‘ '‘Mϊυ|"ύφσ/6&JΙPᇲ$θ³CsΒ°‰1; Žn“]§+θ>`*n0 ›€ΐΰzΗΑZίtΈ$nρ»wN9qΘBtɍ¦1aΏ¨ωΥ}ΕνΜš·τώ!ΘΉNpCΡ€{ktγαcŽϊΐ솔 JΚ(‰/q֌”2ΪΈqΤπVOˆ“χψT ΞzΔĐ+Ζ6>ζDNT­χΐ‘Fλ°θšΦMon,ͺž0°S2G@Š£*jΰνk"\MJζŠ90‹‡…δz>c Ϊh˜>ΡZ‡(! Φj.±ƒ— »X‹Λ]Γ׏―£‘¦Œ£–θΒz<7ό’Ιβ†’*Δ9Υ–ΔbήG²ξ€Φc7`Ž˜£hΒτψΎΜv·>xyJœT;Χ8μόβštUaΑƒΉζp8ZΏ‰σNώ}cΗΑο΅dΈ 8 ΰΎ/δR0‡Ψq ΔΙs!‡2ζΨşΠξ„ρ~=‘’ χ;ϊ4rU WL!—!qyζΰAJΐaŒΑ ½dLρψsο&¦0• ΟΆ;¦¦$iξ°ιМQKΕυlH©ΐy˜’ 2κœ”Οθ8ΞΧh³³^x\4ξ˜cΐέρ΅} €ŠTFk(™œ„cΏͺ˜ƒU!^tΉ /Σh8́œ JI€O^Οxqlμ’ω}ŠΚ†tΣΨβFολŽσ db³ΈκbJ)s:O9cb²Αι“Πp-θ­mζmC{GN9‘+ž#¦Δ¨|˜1‘šIp΅FhNάΐ†. ·zT˜;žΧ…TSΤΜΈΙ(•οWοό;ήήήΠy&ώY«¦§Rpχ)©ή;ΞγD›lδ“°6Πl°δZΨ|ώ«?ύγ/ξ|‘’fvŸήν摊·X“Ψ¦ »ŠuΣ«(ΞΗ UΕ‘ rβuχ%σ%cΰρxΰύ†Μ‘}ΛkQ‚‹YΕλ&ΧΌΔHΊΘ>Αλ?μz:α)[lήΰq γoΫRN9ΈςrψKΙ€M<ΞΓqT$J@<θμžrΚ}ΐά£cNvυ½w”Zp=/B}‰…nΑ₯ͺ€qΊ[³Eρ—€}RNΘ₯ΰ< 5§…’ž Τz`#| Bœί­5\χ΅_¬9Fqα:Δ%xΗμœ8‘jMC%τ8:zŒΊ9gΒWJŽŒ;ζ9&ΰJ8@μ²–8*xήOHβE²:ΑEtΪΊ( ¨Η±»ΪuΉ,hξξ )8€zπθΐgg·Έw€Ώ?ΞJ*9>H,›vΘ}πb9$WΌt_7 Υΰ§ϊ˜8:rήXΊΕ΄¦’² “ΓΙ$J¨¨d΄6p'rΙ„5σ…]δhΐaK| Β"ΊŠœΝλƒο9;Κ Oω†GΖμ¦mξχkL Α j}πΩΗ”F1 yΑzg—υΌWK­‚«u>Γ9y~6hΙK¬€· ³±9wœ0ή‚έrπvcάX ±α,’κ6κA‘Ηœ¬Gλs"‰%x9$“ΝZΙδRsa7~ω%γwΚgzοl”…υ‚ίΉž”ά#λλ@Sp')…h‰Ό[ο-¦‹—πt˜ρ|0£θA ύξΘ₯ΔΈg‰ζ|ΑR,φγμPM4Ύόsί E‘DgΖΡ^ΆRΐCρ•3| gv»ΣYzο(%ΓάQκ±Ώ&έ?Σ >σ˜ΠY)Ίvv+ηqDqšΡύ°π·ϋΖtΓ0ͺ‡(8¨Έο €π³(‰|–θ€ΰ „ΕΠ8FΪ όpΦͺΐΫγΕβ+”?“ρzήTϊˆ‰αΡcR₯ΐζΔUܜIYΠF~qAΎE UIΒWo˜φβMιρ€ε€Πr&τdc"‰r#Ίbϋ©ΝβςΡ‰—”ω².ό5ž9Šrw”ZΩAg4œDά Σ…"eα1•`N|ϊξ ε,ΈΎ>yfΝp·ŽΗqβn8΄‚*ž€p!φ₯¨9± HwwΩQhGη…[sΐ—FB•ͺΌ˜αωρδΎΰΎZ`ζQόέaŽM^OγgNtŸΩ‘²Bƒk˜˜[YJ5>`xΆ(Pͺρ^`s.Σ Gπ'˜―ζμΤ'ι’6ψ.ώό.3λ†ρ=ΨΣGΐ`c¨fΨ0”’ƒ7α9H)νsC5aηHΏ!νοτFUB “2ΙεTΘΝHβ„Ϋ[ί|ŠΈ@ΒΜ]³Ψ4ρϋsjΙθνFk7kV l–MM›ϋ|‰°‹PT“4ΡŒFHΟθΒΟe6yΡfΒvœμ ΉfLiΩHΜΰC=ΞυŒ«7lic‚HεSRAŠ›}τŠvηλr ΚAό[\ ’6~ LΜiAˆΟ(τŠήξM,½FΟ„Rjΰ‘!­άdω“9r.paAΟ5u›ΘY0GCεde‚RΈΧ+₯’Τƒ‡1:‹ ³xβ‚£"bΜ±;Ύr KBMIB˜—9+ζμB˜žLξϋ~)―ΖDΝΓ&ζ•Jt‚― ‰Y¨*Ζ$~›%α­’δ―™cρθ†ί3%O\Χr¦ςeΜˆ£#β>' Os,­ΡΗυTϊ쐬ΈϊΝλœώϊέpϋ@χih†σφxΔεKΙθu]ό^5ΕYAΪ’c’9οΧ4+‘'|ήκ Κοf9+lŽυΞ¦£·φ Ι‰€ύV1+ρyΑεθKΞ›GΛ© _˜‚œ+|R€BrwΡzgCHRA»αDŞ”’ κ>GΞKΥ;μ˜ή δμ‚ΒΏ ΛΑA•Ώ'Ύ_~€Œ+iΌΈΧ(4»€Ν ψĜŽςφˆ’ί”“ζhΨƌΖLFφ€Rnx­ΔβTΞF,y@kIQŽ‚Δ’(υ£Φ½©T“T HΈοŽ€y«Γ¨hArΪ1αΟ⢚—š«Dƒzπ;pJŏz η*ΆάΟHL δ’ιœ“—ƒ­έP8jɜΎSB‚ΐ!d θkI—= α\ †O¨JV 3tp1<ρΟ~a:j%?Δώβ³48,›Ψ ˜!ν•(μlDΨ¨,dH=ς.‹(r}ΰ8OΜaζ(‰€;ΰθ£Γ&±.ž'NσΧuAƒh“²Βεl~U4UŒiθ6ρφ8)>ψο쏿¨R9πm‡?—Œ/0²1([P? G덊žΑQP*I9$zc<ΖΒ2ϋΨ0›μϊΎh,Β{ΔΛΟ HvΗ΅nFj˜stŠ€šœa‘ή3FJ„RΔC‚Θ?Ϋ^#oΘ–W§bsΖΠν<ΤΞΟόιΣ'¨*ΞγΰŸ—Κ΄Π{ÏΟΐyP>>>ΨIη‚ηύd‘OΛ3Π“Pa±ΘRΫ<ˆ±+ŠΞϋ<dU|ωsπ&Ψ αΎŒ#ΰ ξ{†ΚiΗ}w˜s,¦NžΕ8+»Ρp‹Gw—Β³γΒs@/‰S’Ϊ£χ M©¦­nq\OqΰK-°i˜0vήI^έbΌXˆI ηωΝ΄›Ά¬σε%Αo¨‰V!½ο‹MGό{Σ8–Φΰcu‡ΔιΗΒ₯S¦’&.›9 ²±_¨"׌Ρη†-¦‘~ ίΕμηœ T1ηšβ5Ξ1₯ΊέFΘ±Hi+o4ρEFŠ3› › λP§©d <Žχ“ΚI6ρΨB! Ε•Α£PNkNx|έ”^Ž”–w·Ρσ˜τηfZo€q"Φ”ΘρμGΤBΆΛΌ˜-„.ζ/ώτΛƒ„œΟ]ζž₯4pYR.v}?ωνŸl˜ζή …yvbwoo'M%~·LdͺμΔUω ¨ 0pMA†ξŽ|‘ ‘$a‡ΕŽο>}ήώ}?IΪΔoύδw0†…"„ΏŸάB υIΪEΖΰ―CΈ»[Ϋ“ΙΩ|vΤͺ³σAθ`΁{4πά*ŽσΔuίKD:w£J¨5ΈGQ5N )/ώG!BUF Ωσγ¨ψτφ†m―Υ,₯ˆzXj+ ΏΖ•\k7«Ε ΙΓΆ`¬1&R΄ϋ†$ώsž‚)Ž)T˜˜ΟuwB Fω.ΰTμΔ9²θ§Ν ±Ω8,©c)Γω½NP΄d˜kjѐ|/ΨtΞ‰Z^ΞqΤΗί7ζFΨρ’Η3$§Ζ³EφΤω|ΐyΫO°Οf-±Lω1jXH<Ÿο„ΰf_ΰŽ,гπΉ.hΟ-‚”wSBο 0αlUœ„)xSžPΤ;Ÿ―Δ{±<09 0C‚, "/G'‹­όNNs’|χCœΩŽ«_hƒ’lž#^ΪΟ‹¦Iώš…ΏΘ@Ÿ’ Γ΅ΰ=Μ έFΰρTFΝaπχή1|βΊ?ψn+zΛΠΌψΠΡzHψν_ 9B₯‚/'ς#νΎ©˜ ΅T)™Dw|Φ%ΖYο­$έ"ςŽ$! ‰κz¨‘¨’±ΝΟπω!Jϋ©}Aί&ΐtC*iΓΙTςς\“τΛΨΛ?oΑ· ΦbXXΒ‚²kί7lxFςύΓwΏ λ€)T`cξzNVabŒH…μχv©βJ­pQ,†¬$>Γτgς_ι)!=#žΆάά(Ϋ›”ρυ@k7Ύώψ5Ζ9ί^”·ί€A²bˆ±i§Έ 'ξΦCΚ[6μ‘±KΊΥ—{=‡ω0$ΏQ!κqΔ‹dα“p<r’7UΕγ<Π{ΗοόύίΕσύ+ΰΔ“s’Ν—! ’ ξϋΪ±,©©*Ζh„1⽞Q°–G5mΘΕl"gΕγ¬xΤ“/lot<ΗhKυ$_ΐšJx$2 BgύT wΈ3.J‰ξ()9˜£>’0NΒ]"0λί\ώ ΑqžΌD8SFJΚI0P•ΔȌ… %Σ^›Rhn_όa[fΊπ[ΦίB„>˜˜ΠΗ@VvkΉτ»…{\QkΕ}ݘ‹ˆw@CDCε“όn3^Θ;^BŒ …G¨ηΉ Ž)<―+œϋ"μώS¨ύ¦ϋ†ΚRLsά–oΰΨΩ'Z£ρQ0ΆΉΝcbŽŽvΑ«ηΫcΏμ Άdσ11– ŚνqΙ}7(χέρφύwψρWΏDŸζ„ΖF˜ΖΜ wkQP‰Χi{R‰§‰ ±THLχΩ9qΦΘάΌH$ §MΊ|ι΄pG—žSBp΅π?ϋOπγ/~I1ŠMh\%₯8ίDHΞ“Ν‹€„“ξχ0ύ6‹λ{PPb-nT7Υ²…-πaH’ΰ“ίί2[ηLΗΎ¨b†QΣέƒGδΤ’ΰTά}#| ‚λΎ αΧphΤͺΝ/―K?gͺEpDΣDƒiΪ|Ϛͺ!u‡_w‘h&Α³]¨εDo„]U>G€Špϊ5wδJ„δ<Μ1A­ωm”Ό!­%JϊΟω‰±yƘYX±΅EœΝΐH—C:Gχ΄U£wzVGέ6Ιδ‹ ŽrΔ―ΗΑOtˆ―yjZθοΓ Έέ™ϊ2­[q©qJ₯©G~‘ς…Ÿ‘Βψε/~› Γχ₯$Ρε, α6’αΆ‘3’NΨΔο&β<Ž(f‰νNΜE·c ^  \†Ν‰Nνˆq{©dXDΨ)fM¨5£Ε§·Oμδs¦zmvœηA2/\ΛΣ b„sZ»‘rF»)nΈ{G›#"bd“ιk(™fD£YU˜‚α؜!1^ηšp֊,―3€‘šsM¬a”ͺμδ=TpΣ1έaΙ·΄΄”² i:Β%k Β^1·ΰΣξu]Θυ .ό)„ξlήk:ɚ½̦''ΚaόAέ>Lλ/ύώ’~¦Μ_ψψΨζR3BK° •Q[a© ¨(Z»_0_’τΊm~³8£*TφήYŒ Θ%‘Ν†\εRΚ±Ή ―”δ0’¨»7B.τΈ>~ύ#IQ„Z»·rŠΘA ™πŒχœš%Ύ/ώ{B„BaLŒιΐΧλ₯τΟΤWΏΒ—qΰξ`Ž$ υqΰλΧwψ /Μƒ 6ϊ9sŽPaΙφ·π”,!‹!GA_—u stREIΌw΄š»uΗ¨‰Ό'a oJ.,¨‘"u‘]?άm66δ[γI„ •’šP3%T_Σl}uHΠPsَ+ςi»X—G‰)7ηŒaΡ*Ζ>ήΏς›pNΜοS% Ό4έΝ―š;η+ΙcN?=”«=ΌG*‹ο<ύΕΏψι—η΄ή"Α9ֈΏTšδe %ƒ‰αZJL=:Aͺfο±T IDATά-πk ¦BUAΘVK)α’‘I§»rMD4pΪ&›F`Υ+žƒ_¨lγQ-%<„½–Vœ&Γ#.ϊZλ>4 Ε}ί8Ξ6mG>,Œhχυ3kδ%ΗΑΒ±.ΘPΫ,’퍲ΏΡαFό\ΦgJΊΎ4 13kI‡5b:$&ΓZJŒμ‚ΟŸH²δΜB9`π0+KŒ’άπΈγj7ΔοΟ ­―Œ'Ζy,eœ£³ΘJUhw»‚{`”ΝvTλ=κsŽP ΅Y/§φΐ .»0“ΰv )₯ΝΚ' ιοr'S,ρ:‡‹°ΰΠ”h[L("‚zΦ-m]™GΕΒC†κQΐmΪ7κDΜb^&ZB­wΤσ`ΰ"=Έ&%Τθ>ac`6E£΅­\„Ή†Ϊu5esNΤΗIi°qβ_Q!ΛIέzG9*›θ°U™ηΕ‰Ž/8;ε‚rgΆΖΠ΄ή_ 8»ΟhZζΈΫΝΛΨͺ. ^n—°  Κ‘'ΥžΧΈΩpυŽρMyρπ‡MΤσDo5ξηsOV”·ς½œγiMG¨)γ7’ΫAδœ Α‡ £(¦δ©δ©$ιV”ν~G$nˆHΌ$ίίΏFD‹ξ.Λ3†Π5aΗΥ wΕm}ΞmΔ^rƒ£Φ AέQ>ζτͺYgτœ/y6χ…mΞη'ΑyšΣ!…M @HMMίM2'**½zkqμω]Œ1b \p¦ŸŸ5h49 sKΩ]d^˜ͺxϋτΆ]²ξLu]qτK 2£x˜Ρθγαψ]έι}7J£CuΧ.Yͺ­{4|ύxίρύ3X…ΟN#ΏHv7³XΔ± ΫEΛƒ<₯ΌωWΟΡ¬γχ.°Ζ.M/Ό<ŸW»%SXvΌχ4 ψ$©žrΩ†Χ₯Ϊ+₯0¦b™K Ήƒο‰‘㍄| e @—}ή#δ FΐI+ΒμΦT½ΝY3Lmƒρ.iοŽλz²Σmwd½ρ½xψΐυΌBκICμέnr‚Ρ€πΉF‘_0.hή“c.Γ·—θ}S5Ή`¨λΎρόψΨ°URέ \0=5cXπ_―Λΐαθαν ΏΦ£€₯ΡΚαο‰ζnx€Šš2;”Κ’_*W €xVnŽ>'ξ9‘κ|žτcδΡHλdƒΈ ¦ϋΎPJΖy2Μζͺk“Š£BΠnΠ7δ·&Υ•)ΖΔr΅ςύξσG2(?όξο€’άΥΔΥΊ₯οϊηΤθ†"L%Θ9㬬›Ν',9YPήή ₯’'€H˜άs)αρω-ςΈ:zoaC Τ‹€ψΗhχvέ(τ›ΝKoδ}έ0’ΐ“"©ζp­Σ…oΣ6!zσvV<Ύϋ! Y†l¦ŸμŸ}±(’½7B+™dιΙ‹&©%½½ο›·«1—₯ub­eατ‘ŒΑ *4½₯€£΅œ»v%PEzGΉϋŽτ^ϋClΑVΌpΪ‘|pέΨνΎ³βz^ώβΎω BXj†$vΚΛ™½Š…PΛΑΩ ŸΏϋLuSN‘ΏΕξβˆd፯:hτ ίBΞ Π7<ύR4Έ‡Ηγ‘•Zλή !*8rΒί}ΗΌ¦D–π; wg:°#ΜP쒘|+ψx>™CfΐΧχ˜’oB$/c_)…Ny‘H5΅ύLJ©8κΑXςΈͺY6<Δꉳrr’ύˆΠΛ΄ύ7ͺΞ‹<Μt ,BAœ@¨«„π"T{­£E€βj¬ΨP ϊvbΙYΙυ%ΰιΌό‡M€R(:H”ƒO \BΖζ-ԈςGΏχ…2Α›ƒ#ΧσψΖΕ»^ΔΆ”6M=ix2ηo/”1Υ₯ONQlVζV "–»{ΤLͺΑΑΘ&%Ί‡•αU#`M#zΩ6ΖιΎΡε…¦ωΏ1ω‘ΉΊ•”rL$sJΈγπˆvΠC);GD=k$ /R,E—^ΚjΘK ύΉ*¦0υXƒ\SU|ϊt"ΗB­ι†ΦΖΞVZΙ½9ΣεœVct‚Σ&žοψώγˆ_ύΏΏΔ4Cˆkoy;j@^‘ν―g~„k6^†zT.Α‰ φνAυUZ …μ•Iτ •%Δ »c\ΓάRΚ”nŠι©δBwxγ ςόψ#°Χ&Α%Γ]!‰ Ή»)Bθl:6φγ”Aή±‡€]7αΌHIX$q»[ψN―2Yΐ~ChKAΚC,ω{»ίƒ\Ι jfτŽλ⢏ͧ9‚\­Wkρ“?ππΜήγ³šwF·ίƒxΌ¬ψ~=ώ»ΔsΌžΟύmOE`λΛ―Φ{γΫψθ;΅Ϊζ$ζjDšM}οY€χu‡Š" *}+ SDϋ,B"~₯wΒ₯+>fΑΓ3V”ώtC9†6Ά C-žΧ Δn™jΈΉRΈn³ίs―Rή™pΑ-r{τK–f4cˆT^ΆXοk¬vΥHœ]Nnώ;ΨόεRύ€ΧFHέWQfcM ωTΩ©ξssBΪ+Υ’·Ά“rf@fN•yrβπ˜n-’Ση 'oεψQςMγ¬ΕDY–@)&³—ίu_‘8”ˆΘχWΦYD’ŒXϊƘnujˆ.J©”Uη4Ηά;~j%D–ώωΟ~Kή.ΗΌ`LζΥΨ @sΡqΔ‡Ώ§½4τnΝ!οŠΒ_‚OcΰˆYmΈ(I<{Žgp Παz* ΊMHΞxήwZ¦;3 !aU λ(¦Ά'#P=Β΅ΌcηL-£γώOxft ‹γθm„€Q‘RζΰžŽA‰[Ν•zτ1)FΨF ••ΔοΦCΞμsN—¬!IF›Ο~ΕΎeίY\³"e GxβΚPΓwλ[©VkAΏoTMά½}ύΈπήn€z8‹ ‘I5£έL Ύ.*šΨ­α—/mΨjΚ'9–oΆ ΊG°Ϋp\σ&OΡfD0¬ yΊSS%”99Φ²jH5ˆς~5LsτX5š‚§ςΠ²/Cœ¨tE‰χq;OρcΖ4<οΧυΔέo<ΎΏώϊ„kΒ³uΈ&LξA3—#½²–4Τ{\\΄v°Π€gϋ^–γύnt¨Οwf’Ι)αξ#¦ίΙ†λžIΩk)va¬)cq£Ήš οCŠB?βτΈΨ{0W„ͺ«›ΓB!₯ΩjχX9Ό&ύΕhόΪ+°Ά¨*›¬©Β;W€ Έα49%°k²€η1λƒ`™Υq·'R\EΝUto€α{)“˜ϋ„ΰη$’BJN{#γ N݊LQΤTBӏν ΚΑ«δ’v=X0ωŒΛ]CΥΨ#‹ŠΙΧ%6r’?[Ή[’doMiεL¦zkŠσΐν—}NξI²0Ϊ.šΑ Ёγz^±6’Vβ"Θ©μΘ™Wδ sλŒΞ[θ€aΡ 1†%dεΠΔΜ·xΟ>‚§K%#2θΡb£lϊιώΣ/K‰dfθ}lΜΊyUI "6γ"}iΣe%©JžΔNsDEGέ[Ύ4|"‘VζXͺ’υŸδΰrf[$ΦJYd‡"Ζf―΅Κ1FuِΕKΖyC“μ]μΛ!ΎΆ‘ΡiZ"$Πφ²<*]F&™5ηŒΩθπ^/—J€Δj ž( lΡEϊ‚'"Zͺ0%yΫηά9\ηy’–jΚ ηœT 7ǝGύ9g_F€g»ΘkΜ Ψb_ΈχΪΩ±vb/Θ-Eˆέ2•žΗΙ|ͺΨ]RjŠΟw°@»^3¦ή―wά½Ώό!{ΦΔΞ7ητšψfΓyœ»³Y w³₯[λ•[kτŸ@β2¦Tχνν ΐόΝsξφh­c Ϋό οΧ…ϋΊ(­ Ψ³δΉCqΡ‡€Υχ‘΄χ!8ηΫ Ι χσ UP}AO±ιo΁’9bYΠmΜMχ>ΈϊΫsS U*₯$Ά-χwI ɊΦoΉ]&Lg.w\xLy7lΣ§”œQ•‹ŸŠ¦½Ύw9ύ™»ΧπφιmΗάμDλΘΡ:Ξ3[Ίει)εH'ώΏhTΥΫ 6LTψν=%ώB[–{["‘·έάK£‘­&;ιeteϊrL5™Rό1,V<ψ^αΚηH·ω2Ζ%υ]k<¦ΉuŽΦ±ΙsXrΕΥ ΰ;½vω,’Ώ‡ͺsΥCwηκγ@5zx{œq1*σΓώψ~οΛ2ύ­‘·ΔΞέUdχ~αψƒ™5C ϋ\{αΦθωΚχ-ќ‘―³:χ.ΰ…1<Ÿ«naΌΈ–άwΉ'UIΑ°Ηξšι―hx(b7ΗκŜ'?"@1 Ζ[ρ,‹tLAœ/Έ¨­ΜύθΒζθ„*ŒΦyž›Γ)GΑμsw0Ό°t»WΧ2ΔeŒHbuqƟ„1ξνρ±}ηJ}ΓχcpηjΤ1"°­I‡qΏϊρΗ=ς{ĞK@p+uyuŒ ŝηIE]\E;&J‘f™ŸzΠI·N‚Άnα«•qθkXž—zT”’8λA—w¨ΌΖθcβγγ«‘eGΌφZGςjD¨δœ‘! X/Χκ.σXέΉBύ¦AΦύ; nDwcψŽΆ³!rq<Ξ’ψh Sΰωq·‰ αΐσω±e£ΧΕIΚ8“Z+žΟfEΊυΪ‘2Ζΐy>’©Ρ“—»o6CΉ”—™φ<ρέχ?`φFB6vb¬νž?όδ·p½_h­αρxΐ‚ΛKε8zμ̱͟hd/υIBŸNqμ˜ωfυςžv.Ξ1δ’Ρ&ΟEIeϋ_F|W+θ2—΄#“ L]n³a 6M> †·ΗβΎ?wΞ‰aŒόΦO~ £έάa%Qαϊž―0ל3–z?Φ²ΉΠA1A‚.m‹Xψ|ζڍΎŒΧΧΗσε.·—ΑxΖTγΧmκμŠFδ‚² — βƒpKY™+πβ^U0ϋ]Uγε½S@r $Ε7L“gήκ΅»΅X#M•e=λžf Hϋ’«!m&W£Ϋή‘ώπχΫ/Μπ―q{Χέ[†#°}›Ζ ΕήΩυŠRƒξBψΑζ&½WΌϊ*Ν%—υΪή²sϊ‘א?2HΟ"Jdρ_ŒC_kΕu·Ψ2VΡ}`¬χΠΜ;b+W€mΊΝθHοΨGΒ‹buW‹υ¬ΊQ΅‘b/τ& έΈŠUh Λ‰ψ½™sƒΨ°ˆέ¦dnE$ψ7J±₯>Ρΐ`ϋΌΡW©ͺƒ{ΚZcKYuŠΟvυσ‰GΒΔYHŽΦ%o—ΎMΓω8πισ•ZA&#.ΰ΅^tq:΅Φ‘/¦‚σ86™.*@Κq’jFrκιJT™©ΰΧοθ¬&U``|ϋβΉJ-q† ΞR·†OΕ݈3χΨfΉ„9Hμή3Α”#ϋYOn§3μ€eQ…–„gkxΆ›κΊugψβš„—±φVΓ¬hά#‚TG4J9^ψ‘ΨpݐZΠF¬1μ(=ς‡Φφdξ°ΞμβTΓΐYΈ“e›ckV ΈΗF³nIρΛ/΄PFυή1Α%]tN³ψ]οO kP “f˜;8c? Χ£ΎφΗ_²r’De/›Cπš„σ>_«ω’ΨϋΓm›BξQ¨xK%Γ"oφΎ·φ™“ηβͺ[ξ¬ik£ƒ71ώف•\p>|Ό3`eSmι›υΖ0 lVΗΔe ?ωώ>_½ΏV ψнΖυ―"Ρl!_ΟNEjΗπ·ΚπM4™R€{ŠΕS˜―΅° “ΰxaΘΚf~‘63¦ο>;FμH±ˆ‹χui>m’»‡hCΠŠΜkkh Q’p κ\ιΙ‹oΕΈ{¬fœJH@ι~Ÿ|Y 7ΫμϊΊ}λθew’*±4'°Κow*<ΞΗk λQ_Ψ(VθβΛΌ΄ Έ8œ ςY:xΟχ'Gξɘ‹νbkGΙΒνr.x>?Bž·φIHD2ΔZ,jζk}ν έi§k\ε ΝF=ΚrεχrI™y;A¦Rσ7‰˜Κς|K2z,βα„eη]άzVJŠHsΧ··7HސΌ Ί±φΕιψ¨%%X§ρl­0ΥΨ9Οvαγz‚eτώY#ͺ{Uͺ/%P@5δV(7~|zC:ΟΙυά82/Ία‚―‹‹sž‘Ι΄L‚Γ^^’f“₯œPγg±3ž»OΈ“αγΊΒc±Άe¦ 6%ΆD–0pFβ€piξΪ³–ρά­νD…―_ί·ρ,kΪ{ΰaΎ§―JHΨ“Ύ ΔφΌW„GtΜΎ 1B-°ς·OŸq}<Ρϋ §Ε|ο²±ηΖ" k.83τχ+³kΕΫΟ΅Ίum\ϋ/r‰δ†Hk^œ‡Ε’ •ξIΕ;3."vFŸ93χε+²=miμks&’@ϋΎτ=š"ζ΅Ε€ŠΗ΅ΙΚwZ2{ Ο yΒΉΟ M©ύ­Syͺ…ΝJ’©Έ–ΌγήSΘp{λΑ_”­ΐΜ±xνωνίύ{ΈΏ~D@a qΑΝ»c^- β‹pq(­ΦjΨRΨl§@/Ί~ςώ}\οα\Ζ&Šγ87€9aHYΉφ²Ό΅€α[MΑ\!¬}ΔuFζ—Zh¨ b…₯ž„|#=ƒΌάŒυΔ!φ gωBX»’ rμάUIΠίBppEy©h±lMα@=Ψ•Ώφ&ΔξήΨ10ϊˆ°ΎYζ~WΫͺ‡%σΝ±Z•±ΟρΑν΅˜Κ,φτδΠpD·Φ2ΈNσϋώώΡϊŸSα2ΠEG·Ι%MΞQσn7²FΗ), «γΦu_τX΄ΆΥΛα»FωzΤΧ’•oςs–—ΕζΛΰΈΘcμeE3^T―½±Πέ‘„˜/?a:†ΕρgΏ8‘΅ςΧ±Ό-9F€ΡΞθΥ.ό{©θG0 IDATq,nΤε/grŠx ŒψqRήψι»Οψόω;΄ήp”ŠR*aΌΰEΦ₯τV+ͺ JΘ₯― ‘₯ΠΓ"‚(,δ1ΦεR°’$²xΆ€#ίΣζo@†<71΅Šβn}K šUoo!ˍ̧sρO¦I6ˆOYk9γό1½—¦Ίγ ;οίΓ§ο>“{›#όP}΄MΠ[,`ZiΠ} <'‚OίΏ>%Τ`Οη“Q]a€'”φ¦Λ·Ηυ<6ΜΉdλ’YŽcNœΜgψBΞ΄ZJΖ΄>°‘0ΓγA‘ΦΊ9ƒRΈΣ½ζΊW»¦¬8Οov΄s₯ΗΞYc*ΒkyΩu]‘ψ0£v|||P^ ­Μ % tN`Z °Σގ·€£ΉKŠvw\sb ώ?ή΅YΆ,½ΚσΊ2χ.!­¬& X Ÿ|γb,΅$€n ύΞ―„ΐΒv8PK]έUgg5―ώ0ΖϋζnκK©UUημ“ΉΦœοeŒgΰœέ•—¦xΜ9IΟ±·νEI?nh­‘–ŠοΏύΉ“ ŒŸvυQZΜΌΡΕ"°Π5ν–ζΒΧς-Κj‘*sN\_h­‹0Ή§ˆ ·ϋ]~*Ο{γž+Fk(Μγ­άP2Ώ›€iЎ›€Κ[E¨(c!W,3pΖHπ΄φΒ׏ο5™αz‘–Κβ5F\Χ)n’rX"dμ€",ε„\*Ο½υ’œη”‘~ό“ίως|>ιj†ΐLSkqφh κ–λ/ -+foŽΖΰ"Ί5U―ς?$φ…ν£+[žυk£δ„·ϋνUΰώ~ΗΥ)+·Γ8¦€λy½B™&`ΟόVN δ~OHZ²ΗΩHkcH’eΘ2ΌΝ5ρφvΧ₯3=8l―––Ϊpκ€ύΉμ3²±aΚ ΟηI@€\Κo·»SƒΫMέ#χ}C‚ˆ)€0ŸT)$nγk‘nΘ Žρšc@U·7ζ’Σy‹ΣV½P0°ζ^ΚLg@/BŒΈ7©Ξ’Μͺ‹£`¬ι{$λφ§Λ`YΰWˆ€λ’£z‰AL”γZρbλ­_>ž½S)†$ Εΰšqσ8nE7OΏhΝ₯Π άeλ—Ψ˜dEέκ %$₯pwAΉގƒc§Z_QΑ‹8•ϋνΖͺRψ‡RͺœηoΈεŒΥ^Ÿ`™Η“€Q»Α­ΝπΛ»¦’ŒwVM³ζ@-$χρ"ξΪ|ή_q¦‰;4’+!qμ₯₯aJ™rΕήdWΣ\ξϊήJγώε:/&(¦€Λœ˜¬]Mtχ·7ΔJΚιu5Λ*0 ‹OΚ―v]―έί`Γήa‰‚ ζœγΩ₯0¬Η!9¬φa»ϋύνΝΣCL€+­Σ.š­e¨1ΥΦx]Νο³±•‘Ύ=kZ@ΧzxESΡ–©œKμ·γζΡ¨U€ `Ήϋˆ:LcŒ4ΫFώΜ„£ϊ ΦΔ FH.5&Βe1Υ³υ_"_η©wπE$NΪ/ZίοεΘ|YσO~‰°^b‘ ΓΌ–}ΪΕ ©ν20Ι;τωΔHnE*Σ#kΧδΕ2±Po‡.ΚΓΕD— ΩΡΊG:ǁ6†ς_ˆΞ―Ή(fbρ³ΨŠ\ )Λ΅$Խ蜷σ­ΐš„˜ΥΒχœW,ρ^PE~Ξ;σ2OπΏυ%iτγ(kiςγζδל+eƒ)‘Φκ½‘ΰ’’ΥδΎ Λ„•[Gb !κ™‹/pΩ.ΓΉ\}LΔ’1Ά…]e%„ΒΘIϋˆεΚ&3ΝO[ο9!evS%3§Γ0#v?šifRT ‘ ˆ>°ξβύνΝwCΥλ˜zΈ”ΥQ•q>Χτ…[”²ΊαWX˜ZξݎR9ΉΩΝ•JfToΙΠΩΊbώRŒάA);δVΧV₯ϋEνμεΜb 1š·ϊh£œuZvŠρΖΦ¨%ρЏ 9<ΟηΛ§£ά‚«1νΠώʐ>Ž[*>WκθΞ2&F5&eΐMρΚάέhff9už³₯rfŸ(“Ύέn ΑJžOL‡…§mΑ ­“ ¦,Rm†OΆψμ֎Rρώ~Χ^+a‡γνΞqΘ՜V0Ηĝφ{,œ“8χEψžν Cθ σ]—²:–:œ­P0ΰΥ—Μ.Gs1ΐŒ–ecί!©4ōω’5ι>ΠϊEŠΑ€αΊ„ΉΌικW|υQ ΆKΗνσJΈU’ύc}VEPφM-c›κl“]Y½œW™Β‹˜Rg7β.ω(±¬·’dΑ‚°;0}FεΘx*ύΠ& Iγ'zΖ΄ΰE–‚%α‚ΙΝ-©’ ­’^LdqHV  ·ŒΰΛ‰τ Έ8:·ΏΨ›FΧωD)·γ†°ύ,π¬#֘Κ†cΖy0$―ΈνΑΆCΐ@kΛMk$ΡNΡXω°πٚ'ΪdΌ-Ι·Ϊΰ˜β?£‘fx{ΉχΖXLωΓ€λΧ0Ην³œΰ²ε›‚›…΄Θ}R "ψ|5Κ}SΒΫ½2ηEžΌnŽ€ώ‰Pϊ^ΨKΛΦ°•>7JI•_BΝ‘Žπ°eθ+’$n΅ϋQRβΉί–7³+vΆΖΛ%Ψku+7©θ@EΛx{»1ΚQfrης˜½sμχΈΏ„ŒI‰²Ψœ3‚"dcЍ%£–"οΗT& ;šTΤϋžοŒͺGβΎΪψ‚OΚ9σ€ŒyπΖD 9%΄Ρ—ϊνΌtω-Wη /Φ6Zp²kŠUΟo=*ά9!fξξJΞψοώη†ο~φθνΔ5q< ο²|ta/ρKτπ2΄’σF“™ΙΆ!n˜6κb“aoΏ”x0Ž—²1υΕ§{ž'=-5Ϊή¬FF&œΧC ξωφZxΏί‘…)α³ΥΌ8©%{†‡ν—21Œ€>αWŽγ f>GΔΚΙΓrVJΚ[kbνΰ1μΜ*ζ&†H ͺύKtEeŸƒΣ6υβΔq»‘Φ‚v‰βωέΤ\GŸυ€B(α+*)Άΰ~Ώ«ΫΞ°ϋWαi­*8ηϊΌŸx\d©mœŸrΩΆ‡Ψ•R±7³c°t)ζ€―­ΨpSΞIο&:owš*νόά†_‘rΥ¬%q‡…yzύ\Ό―vaΚŒΘ‚B!3J¦ίύέςΕnsL©Qhΰ‚§}ΕOΜ—”"–Ογ¬5ά ρa†§ΟyŠ]”–{/f3œO—c–emΉ$Ν5ιIc³Άw/–$·Υ>¦3ΥXwuRCJ_μiΙoσ ΅‹™5ΌκY‹ˆ~Žϊpi°δίNψl`άFήΎœω€e7+ΆΙ±J.Ιct{8ξbάHκ·Ή†¬%KYΔjΗπη)23α₯€Έ)NΨR"m¦{»ί½ZΚZ”ηqΤ;[εMΎVJt˜9‚Ω|†^h.»y8,†½‡ήΌ 9»έˆΗš'KTͺα7Ώφλ¨Ηο~ώ-_Hρθ Κ>‚ŠΊτ“ˆͺ1‘WΦΗ…z°uGh]ΟΡ ¬–΄„δ*!lxΑaΡΓaC#,Žφ\xcŒ―αφούb&F>|όβη8Oδšq>OlβllΰτΤIyiτ‘Ώ7³Ώ_ΰ˜’³œ^0?ΞαO?ζRΠGσΓJ¬{y^˜sƒoΞ. ΎRΖIήΤ–4§ΜgC*Lb|TΠΔΜqvH―ψY-ž“IN… ΙzwsΞ ΖΐŠνϋ•ΤzΆΛS휴@¬ήΪΥ‘~ϋ·ώρ»‘,όύύέυά–IQ”³]RρΆΞΜgL9cbΧRͺ‡,YΥQ•!y9†WγΨbΜε||€RΜ±&5ΘxΉ8§οB’s₯Μ\VςC†§„‘™ί‡ތKe•­₯ξ$9„?ͺήΉn’·Rυrγšς§Œ€ψ &|?³χ+frIϊg#…fΖ­*™/› ŒIΌ1kLGAI7³]JΤ»+πˌa6Ξ°ήfZFΩM&QΦ.'‹ΔΛy’ωΘͺ<UY9Ρ»ΰ Ϊή€UͺγΡΟΞ%z4ρςEτI©4˜Ω,ΩΡΪ)βρρDŸ?ΩΟπ‹oΏ}νPΤ΅2IM.qε΅›άΌδδ> ξm’(†bSΗ8ΟζaJΖs²ΩΈΏ(Ίπ Ηq”‚¬κ΄h6cDΉU)~φηξQΜΧ`4jψσΊ.™F‘”JΑεπ ΞCXξ[ŠΚκ&ƒIά«ΔLχŠ,^ΤΡάψ2χΪψ‹…ξ‹pSZ'oΩ5ήʁΏυ›΅&œΟ‡{JΒ'`κ²οk |SοL ΤΕαΟί€Š*frxΧ %”ΡnΉ?Υθ\μ±Φ€Σ`q)G† Βθ—‹£=Τ¬ήΤ…ͺˆSπVτΒ(ϋ ہ}ŽŸώΉQf½e‰yνNρ‰ΰΐgfΊͺΡ(Σs κ¨}ηgκοθΞMϊ3ΑŸ ›;})_„])}@.&0j³ Ϋ!DLq»Ύ'’?Ξvκάώ™9BΒΨ‹šΔAΣU§ k³Υΐ¦u£ t›RBϊßόΞ—>†?€Ap-ΛO™šύ΅&ΗΊρ—<ɍ)πGU—ΝΐZτ‘kΊ©,iƒ~‰6ˆ'lΝΧfwΔ*ͺ’VβΒK’Sέ™0šF•V6ΟΆXQC₯˜ΆŽkN΄51#ε­½γΈ]>Νq%άjžiG9ΰωδ˜0ξUβεΚ—₯Qy²—{N `.$uR>6₯GΪj(…#-Ίp9z*Ή~^<Ψ–-§φ +ΠDΊ'½κΜ"V=)%άΥbΗάΠΘό Ζ}~|<½ϊ­₯pΌ§@±€£β»‹ŸΙ­Θ%ΣΥ―N“:Αnvo|‚Ιoj šΓLΖwΤο#|{JʚΨ1|άU†}~/…#A”Δ” Μ1car£y»μ ¬ΐηςQζœ·πψώΓγfίξoωL³[₯ωSŒ]@I…LM™‰‘$^’δ„4Κ™“ό”%:‘Η –c³w+μΏUΔ1fgS1£[§11WΗ­2α‡Φβ;Œΐ‘Gγά‹™*p,U΅TάήοΈΞ ©TνQ".©ͺ_9G%EμΐnΙφ]czά¨˜[FρޘXΈΩ0Χ@"ACΟΩR9ΉΒλ²5DψΖ§h€½·η-€‘ΆΠ³Ϋώv;>ΑΩ¦§tm9"νC§qpΌ° Ϊτχή4•Ωf(ϋ[νάVzt1YT1X&9M_Λχ%fz3γτ"Xv»e:˜βΛ^°_τόB؁nΉ CπΌ΅6Žγ¦7Γ|¬r%^e.90u©-ΞΩ‡PχΆΘούuϋηl/5έΆ{‘Υ0ΠvΗΤ’©kΑk‡Ή‡i^LuŒFͺn’Μeζϊ½)kωμ·γ¦y©Ή ΅7  \Š1ΟjS΄ΨαΛ\«VY5ρE4.Π–»Κ:1s†ΫwξελΤ‹6&΄-ςvNBΰηW|oοC>JOs-4zFλ‚7Χuϊ>ΜΌ:|cΔΗσΤ|ZπΒ@WάωΌbΎˆTΐŽωR4hkέΥL4*n'$ΛΚΩλEovΚ»σΫν¦hXIˆ7—Σ·zpN―š Έ„\’ χ” Λ4:drƒUςέ`~έύ)$WψXζwˆΌδ=ˆGρŸkΫg’6C”`Θ6Ϋ”kšs©ησ©p$ΙL£5 l+)!ƌΫύ&ΦUρ€Η\ˆρΨr§TΠ ύjΈ•ϋ(i/QsQZ0Χ©jΟ6Q&Ην ±ΞΒp\}xEΉ7p=ž.ί5΅ »8² T3)‘“ ^(ΗqπBΧ%p{;πΌž±;&•3a11πj§«–\υΠI«fΠ&y,;’‹6€υΑŒ&fV ΄IzoHα—‚‘’”TSοΥƒcn€RqυT ϊZŒ ΦΞR£εD΄}½ΚΙ“M§NUfΚκ΅j)‘˜›ξόΔp»α›ΏςW˜sž4—Φ‚η} |xΰ|ž@ Έ'²°0S’βηωΐ,hΟσ€46$f‘ š4y„—XB“$RΔΪ―?KJ«³Ί>nΜΠ™}ψ ©ΫJ%AO ΉΧΥ|W2lΰΦ!“iύ<εBΩν€eΜA&— Ύ(JwΚ!m:χ‚nR6OUιtΨαΦ3Ό‹PξY‰pšΒημΉ‘λαή³½7.3"‚bž©z«₯ΰjMx}ξ<›Šντγ? Ξύ&ύ2•μ€δ |υhΘ[ ³₯,Ύ„6#•&/ασωΔάζα`†΄ελ ΧΗ!\ΧΕ-‚Ly67uCτt-VŽ%Ιaž“/H­s)©pΑ᱐{Cω4pνMNR¬ˆΗθΐ ΜΣήόςΧͺ†Mή'Ωͺ$ƒ{+§D/ZΝΔi\£‘Ύ†/|¦'Ζ!{”‚Z"6¨Όf€LœcΕv@άΫY=ω¬·χ7G6Dε+¬υšeΪx )ήΣϋμ ςjσEβν kΌ˜νsJjμΰ’\cν¬9q―wfΩΛΙϊys’Ί “²;x>žš4σƒυ1°ΣkΉΝ3a›εW•Γ±€Π’gΓwO­u„°•œ˜S’?BzD—΅&*sŒZdSzœcBͺΉVξλφΒ¬{kΈΏΏSβΉ€4šDί3ψI‡D΅/ψθKο ΑH”ϊ(Hš uZhή]›3ό₯ξΓ(ΧΫ’sχtGx©†δ/ΎWΘ…ΡΖkm*«$jˆ’βZΞΞqΏαzžzΞi‚Μ2 m’hμgOL‘T-o£œο;pW΄πΝ―ύ*R½α|<؝FΰΑ"€3ί1(N»ž9T[1«†,]° hŒbΐϋΫέ)ΐ­Ρ“³h0‘Ÿήλ@ηΰεzŽFEίΪΈ7χD,Γφk|eΩu‘»•[uŒ»R'sβnhn&ΞIeίΊ`‹\V>jNEγς$ΚrTœ­½FtŸ;lμHυ‘εsNνx–&QiœŠπP@έ\τίmι^šΝαΉ%ιΗπΫ_nξŒ,N˜5¦Ώ΅ΗΓ|ΛP"Ӎ6KF9Β“h ―.ΨΫήΟ“H€ηyαy^˜"‚†πu‘ŠwΨ3CΖπxοv5Olεώ&2¦?όρoΑ~Ή[S8ŽΒ`pd³EˆΒq³S«Ό6³φvΆΚΒΖ³=qކΗω@λWΏΘn㩏Ž±Β_ΠΛh’–gUk—KUχ§Ω06G/Sν_ʜ›C³sˆ¨J]Ύδ{1cŒ†Ρ›Rσ ϊ\8Ο‹ψ„λ"ew BώΦΔ΅©’bΛΉqυSc°ΝŠ1lτ΅ΠΦD_‹¦§°π˜ Οή‘kALΩ7²a#c£:%aοΰrj2­Φ§ΌQnw3ΓO.7δrθϋΞΞκZΪƒX₯ΫΖΐ.ημΨ1cnFݎ~JΉΔŽΗς΅Η’$s―%u•4oχ›ŒpΫSίvX8η…”+%ΐϋYΚv9aNŽz όHhŒ%MB–―9Pδƒ Ψ˜«‘VΊΜϋ’g$€XPςrΠ4Ή°9"Υ ό|>il”Š9"ζΗΰn%—EΨ9Πτ‘PλAypΝΨc" χΝgd«κOΐ\θηk ͺαbDg Ϋ<,@‰[yΕfχ)yτsΨμ"6Š"\Γf‘rά―89Μβ=‰9eʟ\Έ| {Ё&ΥT_Ο'Vr€Dsΐˆ”˜Fpά„Ή9Έάο¬% σλsVπZΥ» „γWfξιγ2λ’‹H枈9ΰγρAV™όΆxƒ8s鳡v!„8š]c’& @ˆ§I!iwuθ:e ;p‡•‚X0Ξ>ΩqEεΞλ’vΟ 6ζΟ…¨σξύЬ|ΒϊdFΜ>>±†¨ τΉAΣ Lˆ}Mυ&Ξ™δI; ξΰγ΄\*ϊXΘ)Ίp`ψek’₯€P@ΑJ$ƒK€“Υ1YwΘ,‹θΦ‰λΊ\€ί½φ%‹iEŠΝR#‘Ω?#Œ€‘I–3–Η}pvF|ς…>ΉΣxΩQEΕ€·ƒQ:¬ΝHΚwQ2θb9ο ηΗχψϊ‹ŸΣΜ (–˜ΕΪu5Δ©βV+Ϊω$ςBδ @Έ•‹Β;^>­8Š οοο£γjέ/Ζ(Υ^tZwĎp…P=nXˆx(·‚LRe»fEΉΆuϘaδ󍗇0Ka ΅bqΆK^°.Ι»_ΩηΒ¨œαΠΣ"‹m€Θƒ}Ύ$ώ•¬ο-jΏIgόAρΠθˆ™77ϊ˜Ά.‘d³aω"Β$ °h†NŒΙd2£ kqyz(Dκ^OrΒa¬΅‰ŠiCU,pδœ­α§ϊ§"ΉFFωΚ¨ωR°Q ?j±ͺTD™Bη•ˆ 9σ‡XUс{·γPJ’œΡ₯φ9>φTυ—μ>ˆ09M<°άχ΅΄ίΨ%Ω‰θŒPv ˆ%‘­ωλ!2―δγγCŒ8ŽηϊΥψηVa:GχΜρP2Q•ΡFγΎΤ±@ Wλήι|¦π€ΎΉ8 Θ)Έχ(Zά\hΧ…ϋϋ›ŠŠFoNζυ ͺ91ϋtμˆ-ŸΒŽ:'€Λ,[λ@Ξ@4 μ@ˆΗq#}8nΔ₯p…h£Z0MŒmM G„q«7`‹»‡M[„Ί™ΡI³ή‘FΒ‘©Μ^άΦΜw’ ‘y°±sΆ“]ߝοΠ–’‚ rΒL­›†‡€Αo}I‰.†1h³_c:NΚ©QηXκΰΈ&΄v!‚Υgψτά΅ΠͺΡ­m†$©c μΚdHχƒσx:\™‚SBλ” –R±ΗbΥ.²0γŠ.Νΰ‘Y†ž0Β€³άˆ©χΕ1… Ϋ}0{vTζ‚·ΫAαEkžg°)!V0Y’"&’_ˆΡίS@H™€@y)θ— 4μ€₯μs‹§δŽŽΈΪ…£ςI-bρέ3œΎαc\ΆΫ;CΩdΖ³΄Oγyήq»ί„Ζ  $”ΰΑA­ Δ”1χζχœ……d7ͺN w{cΈ9φ  3½F¨κ,Ϊ Zδ±πVΩgx&ύeΔ₯Θε¨L8άΜ9!¨"’uͺΙ<ΓC8βγ…Χ³ήZΓM;ƒ’#zΧΒy(QNe3ΰY`VΞIB"JV#ΗE1’¦<h<5δωΨ€ΛkQΐ` zΔ r1F1'u‘φGk‡˜τΈš¦κΫμz¬cm½σSgΧZS!Θ±a띑{ϋ3fE²Ω R‘Τ7&žk4m/χžδœρρψΐ7ίΌ{ GϊγρΟΏŒ>πφvWϋΖ9ιϋϋϋKvψK-_p₯Ώ< Ϊθ8OFv^ŠšΌ€;ž‹κšv5ΊΜχΒy5)cšpΡ1C\›(Ϊ­ύίS$’tΗ¨ας§\hνzνB8V“+|ΡυάΪ₯‹€ξMR:·£š-ͺΣφN§υΔE Ι‡<‡δ κΆvHx^BJƒ3EQmxςK1ňχzΓ–;hl7ZΗά’8O&ΝΕΘtu =δΫscbΨ ΓπŠ™ν_΅vqαΆ†”[* ­ŽΒ²Φ‘η<&yK„ώ‡7ζ1™’¬šAͺNι6>Q@₯Αw,ΆΰvsL€ΝJΥPτ4$nίŒώ•„DEKT– ³iΆΜ―ΖλΈ‹GΧξLή’ ŽBχwŽΜj·v;ξς Ϋ7 ;γj/7.ς\O%cτ…_ύζWπ?ό/k`)αΤv–S†G©…Μ(·•­rυ†³„ }.Š bBˆ %WzΓT„D‰:,‘bMeeρL©A“ώ½­Λ–`Φδ#.CθΫ‡0ΜΜwrŒŠX`oΎ[ao„œ”Ξ=OŸυ(θ‡sχΚb:Θ‰˜―γ™…Ξ…9 °³2Ορ‹Ν1™ ξ ΛΑΠͺΣΊ:Eά‚eK•9G“7―ιη_ˆ%ά*Η%f”D‚ͺΉ¦-4jJZΉ΄,κc(E,ΰ“ΝW*˜˜›!%ί<0ηΔwί}OΝύškαω8}fΊ…:ωψxΰ‘εγΒΖγρδ?_t„φΦ4ζ ΐ0ΎΞœ]π1^χ·7Η¬€t ¦‚” j½!AήηbFŸ[각ηu±λƒξχ5‘JaŒ–³•XgoZz 1l2φάhk νڜψx4ΙΡΩΔ9Ψ%ΤR8ΫτTaκ:J@]ψœ#½#Ξ9pφk.4[z-V!}mμqφj8ψαΠN³„9Ο“±¦{βkΐ³=8“–‘”<2ξ9VβαVΔjSΐvXΫ; ψͺ΅bφILB|Ι―-#†ϋ°­J]PχBM k τσB²|U—·ΫMPΛCj’€ |σΝ7T.Ε…ησ{ξFd€Oάn\’=Ο“;„Κy?injμ΅Όaκω<=Φ€M\cŒ{gJγ?Œ4`ζ;Ή”•Σ‰>'ΞqΡ• Ύ€ aΌΰZΖΕΉ|ΙΜȒĚʡψKhr„€³Xa£Φ;ΡuκK‡ |„~} JηώvΏΙHΘεž)½6^’‰n’βK(%J…ε˜Λ»―οΎϋ"ŠeΒδ€Μ ^ΔΦp‰hνͺ‡KΕ±‚δΧ4ρA~CγL-… Έ$B2Σέλ9RΩgJ³ £θμaσΨka€έ‡a:‚«΅4 έGX―Έί€\ RΙ΅‘•K±{/…«Q„±€ςK9£>Ÿ}tΒ:CBIΩRQί΅q―’ό /ƒqr:­Ι> }n>.kƒΑq5DΕψϊρΐŸη?£λZb†œ q9)γ’e-‚wΨO\ύRΗΕvΫβΖ%—ψΖΜ‘σVϊ€u1“2πίώΓ€ŸώΗθ†Θ$ߏ)ΪΈ¬ηsUR^Τbϋ D8ZϋW#yΫ_LΉΡ£@‘V`νŸ٘-S…Ο¦yƒvρSΝΛ›ηθ³]Nχ(₯p쩍1&ΞλtΘ%/ή‚Z£RόOsjΰγρ€―μ~ςΫ_’ΪΊήΈ·Γ|I}eθθ‘ —Kσ΅Ο ±1&>žΌl4ΣΌΛ•C½!ΌχΖ’N]Ήι)ϋ%±…0“W­U0Ώ π¦μKΡR‹#+8*κN’[¬<ΥΖbΠ%F%64v[.… :Žy^l Ϋy„ΐ‹!*ΆΦως§@_ζ‘Lξζ.lLr—ψXQ3qν˜ΠΓ5ϊγyDRXεΕ‘"ι½ufo(NΈχ‘<ψ .Nπ\loo•i°Bΐ <@φξow=ΐΣΡέΐ5U₯›ImνT8?}©λB½ίh’\”!2λ 8εΣ~} ^4γc %'KF΄Μςεh›Ή&fΨXΦΪ'aμgΦ|©4φΈξ₯ΰοόζίΑΧoΑnδν.ΥΜλωϊζ―ύ Ϊσ’ΩQNύ9B’iNX‰”c[sΒXp$]vΑ2^˜Ω,3]τΆ 7Ω·)kΦ~}O±Ί’‹ JiJ:ζ—OΫ€q'ˆMOΕ'„ΏΫΚΣθZς/™\i΄H‘y&s3H*Ψ™” לΰ6BŠκ2£:A{φŒΟΕ€ΡεΐG3ϋΩBΈ΅†\«€­ΐΗγAOΒάΈΏΏ‘Ÿ7DSΠ’Χ₯Ξ‰οΰΒ@ [Nτh™E{c퉡H;6³ͺωތ —RBΏNœδL՘Kρ gψςpΉ5¦'₯ΖτI6™Ά£²σšΜ=IΪ-°i/xΆ©©J˜6Έ(ƒϋξPRL~9{ή‘yΉΤ•Ρ™>^NυegcκΌHά#’KbΔy29·ΈmΞφύ_ρο}y»ί15Ÿ7=·νzοΌΑε˜kψ…°~©ξ1†ς;8›όx|¨ 2Oξ@¦Ό§Ϋλ{8―‹Ωͺθ“Y}N6W–dX²Mν',.Ά«¨₯?―Λ―Φ™7 lJλ]£~ φϋwΝ"λqhΡ$Ε—–έAϋ[Ϊ_}hφhΤΚΝ9ΧξsΈ_…©hδ%$°₯€ T―Ιε»>ΏΈα¬;Sζ,•Τ–΄3 iΦ«Ω.’±]ΘΞt»rΩۘ˜`μθZΐQΪn((#;Υ«Kξ!zηlυΆT†QζΠΗ’FΙΎG45ŽJ ­™c ν­ά ζ‡x¦Jy₯ιΉ«Yμ«πƘ˜ ‘σΈέτLWξœ2|Qπ―ρ3"Ε•wΤ«3( œ7,5gUΏIΡ·QΉ2TυΕ’3•APΆx±ΨVΧσ!ίr.\JΜ•· ¦(ςΦΖV¬Δkžwb/Κβ-—ΗάΪC‡mͺΩΓ²BNTΞθ":κ13Ηeοΐp*)9ι’ Η8”Ή½ߏ1†ΤO/χ΅ΛNSΤ³ΉDλ|<]B­]΅DχKqZ°_ ΙΥ§Τ‹δ―ςΕΤ…,I“™E2=5uλΒ ΰ~e‡ #'φ„_6Δ‹Π@"ύ,ησD©ΏcNάo74=οQγΜΩ‡ή­„±θΛY2-ΠΐyLŽπk-Xž­ΩΧ‰Ή†ΜˆΛύO,`ω.ξΉ;-εΥΥ—μ­]­Ι££δΦΒΟ7K QƒΔ €5)ZςΌ•(ΰ£Ύ‹@Œ ]ξηΙ]q)c¬Έ€ρ‡?ϊRς!ŽΚΦ―9­Ϋ Π‚•9ΏΫQ|ϋ‹_˜ηuR"8!i.\―myΉΌƒcΐsΞ ΌQ¨όՀܐΞ<'΅ΨΕ Β€;κρΒ»[6Ί^ΚΉ&žηCΩ[•Χv\2Σ·C[Δπ7?4›³{Εμ›7UW„ΛšM«υ—Κ'jα~ šGΥ!BζŽQsΠK3fώ”Γn_R™ ζ^|‰[ϚΘKI―π-=‡Œ_’<ί*Ζ‚Ϋ’Δ@)ZD:sbχ‰ ζmXΆΗ^Ό4‹`k[8Œ1¦πΧ…ϋŸ”ΠWw}Ό‘ΐιUYή‰va‰’Ω‘υ֐Rρ.R1›ς\Rζ…fmχ㺐ŽΜ.!&”Β1θ\Ϋ%ζCΖ±0I_Θ1ΉXδ–+².)ΜΙ‘yqΣH$‚pѐ‚‹ζ^(΅`L=O›ΤU‹Ÿ-’vΖΝ=Τp‚k‘εμ{¦±dέβšρ<.‰’>υΚvαΈ9Hb½΅7ζˆΦ€«33ί©Τ’Hπs­…τΗτ»_²ΰwŽ+–[yLςP’ΰ|Χ˜sϋΨg̎σjxœO^0'½ΧΥΥΕdΟΨθν4C„;[ι«uyH’ΖYππr}HΆϊCΠ6cδΛh±»UνΊFcͺ͟x<δςΙΐ_όεOD<OGr_§X=sxΧϊ€6°p~ΣfΙJLcHOρ@1Šƒ°ƒT\[YΝ@Ν…ΐB…o­½+ΆΦ˜³ύ<‰ΘHΪ›Ψahsί-3TΙδ>嘘 Ψ₯>z`9–SlY‘΄£`‹Ω°ξ–B@Νι…O±-ή§Ώ|“^>AαΕΉεβΆΛΕάΉΦUœηΙSl-”T4ŠYΈ7Š|zγΥmˆF?(GΕ5Ηΰ|»Ώy&Ί +66vŸ¨19vžso-»:ΙΗQ}ioαLSŸ½Σ4"™Bm *¨Οκω|(₯OΉ±‘Xž‰π!66²ΕsP·yάn―Φ" /Τω)¦Ψ3Ζ±ρdd%3XiΓ€ ΫΏϋ΅ω>.y7κqΰjMΙyΓZ³u*ΗRLνΛ―΅t^Πt=ό-Δ¨π‘鉇΅„r/Μyν,ΈΝƒ]±q― IDAT΄δŒTδIΩYξψ–›NTŽEg7Α2Ϋθf|2<«2βAJ ΧσAc ±₯„CjHΥ–»k8ψΏώ#όωϊSΖ»΅ξEγTqx^4δΙy­ˆ›kPωxψσ]‚#œκQ]f?τϋ-—θ+JC£&ψ.…{”9'ƞŽ‘βh—κΘg»”·ΒΆv°S1βQίη\Œ+°½”ž?dV$ζά ”Χuai»άΟ† zŠ‚.WΨ©Ϋep«˜‹’Ϋ·“jjΜα˜υ’ƒ}c²λTXYΚηγ|Ό„χ-΅BšcΖq»ωΑgf=S<"ŽΈQ3McλjxžOVζΎ,ή>J6^JΜ$I‰οΗύvΗθ εΈ‘/Β)`αΔabϊ»πύΧΤΨ4n%Q# S,€v™₯V‘o’ –AA\ΌJκAyρM‘}ψ£6ΌΏΏ³X“>IΫ„²ΫΧͺμ/QŠ3Ά.δ΅Ή+t[JŽ΄y<ω\ΓkύΈG|ΏΏγ:Ÿ(₯Ru†5;–v‚FΞ₯eϋ_ώٟ)ΌͺΠ%w~ΜE,ͺν]%4-₯cb§UrΕq»ΣŒ)5”©’š°MTY*Ό*`ŒΖ{Ώίπχ~σΏΗwΏψ9ΝΘ ΈkΑ‰Ό6&ۊ!؍ϋμ±AΌφFΚΟΦ™ΊͺτΕΡyΦlΎ²θ5.M1²@.ιό7?ωΫpχτZ/ŽΣ’#Φ*κaμ{ιύ―~aΘ΅>Φδ\iy} wd²Rδ!Q:‹ΉίΈ4ϋ›”ή±TρŽγζ3ω·ϋ]‡;ψ[­ž}ΤΓOIfΛωrE[\ξ)˜ΨPEέΗ@L4‘ Dud¦Ί]XyωYΦ_ϋ•oπώφ†Ηχ_±ε“YQVŠί֜69χ'γ(ΩΣΫ°7—ΰ˜5΅HŸέ/άυ ΣΝ₯V"t_|’ΔIΝ MN8110±χ3}3Gωω| ΑQΘ²½ΔV^ΰΨc£z3f›ΌΦ’™;λόΆΤRvι₯ZP εˆI ±’ΕoŠ|@18dj»$χoPnaΕd‰~)΅B4”+„ό y’_{ˆ³ΆηFά 3wu΄"Υ[“ΔΪϊ/ν2iŸμ¦v>VBνΌCKn γˆΑ4Ϊayj?hOζΠ_ΓcoΗ‘ΡΟRφΔα?γy‰ΦΚη†Ω/ΒΌW<ΞŽγN5ΦζEv E Ψ>FfΗν£f—Ό’ΉC‚Ι»΅Ο AΔψ–ΌŸχ,Ύ€^€2tΨ¨φ$²‹/(ǁ DώZ Η۝ώ¨Ξ₯5"w‹W»xP†­|:η-θ̌Αdεi‰—“›‹pVευv8εΑΜ΅{m[αhΐΜ9djŒ―NΙIΆΣ|8ΑΩX­wύϊΜΧƒ$·|Οι;‰‰{ᑈ “ΤόΫoΆ^‘ΟΉοΞۍνΠ”η~θs²ƒ–?§)…,Ο•ηωΔάTE–bŸΉˆΔk `γy^x;Ύ»τ“}‘ϊΰ₯'7ή>PԐ?•5}΅ΖŒΡρυλ‡|'6ˆήΨ{α)ω…9 1h!€_»V*dŒfYύHn<³D8“'Ϊ—V“Ϊ;—q·γ`–„ΎS„m-«ωw:z/E›^Χ₯ό†B§²ͺ\ͺ±’©k-ςτИ€5j‘φθ_ŸO\’5št4De+ψg̑܎ˆ”˜*h!φόRhΐύ~Ηyž< άG9\:!TΏΕͺκ3°$Ό XαΞ¬ϊr°½ίoτέ\—g“«£„H‰^Ί"T’Ξ|1$-@β‹%ωlˆτƒψξ'…΄5ZI)»4wccφ‰"'ρ^K0Θ(αΑΦ8Ά fΗfΈ †αršbžω½v*­Rrƚ%.GuΩζ\ mfKlv9ε¨ΊΠ§g₯“π±87±YΏ+Χ’biΝ.G£"G–Œ)ΑCdœΖsK =ξͺ¦Λα >Έ™Pkm'' ^΄ΜށDσƒπgd,Γ–?cJ–“iƒτη4Ε$‹‚F7:Ÿ,ΙΤ|Lk‘¨°h`—T•=ρΧύx<.‘6γ@›Γ½cNΌ½½αρρπ=ˆyΘLY8'?‡«QυΕ”Ab†Φθ Z€O©(9Ξ’ΑωμMAnYωθΕR.Tp%QΦsΦeΚ8„Φ›t”8›Μί•·ηΠΫΫ ηΥρvΏΛJ°‘ώψ~τ%πΣζΈc΅ή<ΥnΚ }‰ Ϋ;σŠŸΚΛ8ϋ…ΦzŸΠΩμ\σCΛ™λΠ£-oU&+zσΨ’Uξ άξ7_—ReZcεΑqΓσρΐŽdΊ\½QηήΩφσΆνn sΆΆ£>Φ†#>μί‹>;B8€00'ws €RΑIGCΙ…₯‹Bzπ=©Ι%π³#δ€Γ”#ξ”Ni·§ΤcO±g>·‘‡Ι;χD›GΉ Μ±ΒB[]mpχωο“τאˆ²Ψ ω(ΊΰγΕιWH+"Ε­₯ 9b­1 )ΘkΩΒ &–„k]¬ ·r{-Ώ`tA3…½˜όη5ΐ!Ϋƒ‰_Α\£»J§wξπΜ0γqvη΅%λ ωG‚φ!Ϋ/ξςΨΝ¦cœ?ρψΨΩm,δΒθζ2f#,tκŒπ°-5,g YΞΡ΅FΙΉ’±¦* Ηƒ1³ ΖX.ϊ0)όγωΠΎ!ͺp0Xv΅dL/QŒ™]ϋδ8…IY/I˜‘APcίdK% z2‘Ž©ΓΈ8ewτIζΪ6'εΒ₯ώfπΫ Ψ σ”,·#&ΖO―δ| Kό`τος² Ψ ι_ροαaέ5•{Ž@-·…|<>xy<Έ4Ο9αγγΙ;*Gw³>OVρη󡈑ό’3Ί’²Ί‡ΫνΠ?Kx{S•Ο\‹RŠΈFK•ό]ωϋεϫэ.g&l>Ήyž'UΚτh­1“XKΛ1‡·θL›ΌΉSΤΑΗΦϊοώπΧq~}rŽ(΅Κj„Υ€K+βv»yξΘΤ1l©cΒΘ`σω”l—)l­5τΡ΄P“lΫ»Λyΐ'#’1ΛΜ@ΕL•εXq¨ΥNͺ@¬j›\₯Ϋq nΘD# ΡR5[_Ό=QJU–ΚςεŸq™l³φΒ Kΰ❉ρΜΘ9ϊ@1αQΐΊ©œ•C» KPγ38@Σ~~BωD)ˆ―D‡›³».ƒ>‡GM°πeWe»Aη Š,£θη*0K=Dλα6φέΧ½δί‰Ί„SΚ/5[ žΎ„ejΚ@_{β8xIΕ,Șθ‹Οeϊ—ψ£/TLoK(ƒερρ|ΰω|’υŽΗωΔσωΔΥ.|Α΄°―ίεB·] β₯`yαΉ©±¦kχGγΑΆΧΖϋϋ›FOΛχ]³xΤ9'}δ(…Έ’}‚1RNr@‘>ΗUΆγy<ŸzxžΝ…‚ͺ[D¦ƒ‡–XZ$ηLόI-Ώσ£αΟτ?βλΥ=Γ=¦„ۍFΓλbδkΡ’¨|>Έ΅dδ˜Ye퍷··—;TγηIΈασωឍZ λt<>)[xaqχ”•ΐhΰΌ7ŽZΟ« ŸψοKΗέΦP6Η³σ‘²μ°#βζ”ž]cEƒr„-VΩI₯’_&Αγ@›έ1ϋYcΗλbΘΟqθeύd’ŠκΔXFW€©vH>εahβ체Žly\)τF‘5 #ΎϊΐMΉΩΥi’`ہݎ«CΨ(ΟQŸœ—‡Oέʎπ]rΕgλJJ©\ͺ+z،sΨ4δ–Μ1cΞό ·‰vψ%tΪ…˜ *ξJ­ΞϋϊσoρŸώδί³r9` †Z±$±]‹AGE¬·σω|Α75Ζ€Zέ ΟјόgcΓ}pΧΐgχ@Sˆ…£MewΑ·9₯…BL6ŒIΘ Α+ι–¦R4Υμ;W~,κNρ½Leœ4΅’ν(’ύώ›#И2ž‡ς…’.€υΉ`φξξ^›ŠΜ5™#“Ήο‹€–]J-&bΔ ΏWν‹τ1Pο7―ώ)Rβg3 Z*α^JŒΔιXΆ‰χ[g6Ό(1Βe¦Φ‹R…<Ε2[Θρz<žό.2ΓΊζθΒ8ιG_ Ω€©9¬ξ“™mtb¦ωΙ₯ί²LιήΉΤΫ‹9F’›]lΆέ ‰ιl½Ϋώώφζ3mΫ5„pΏqtΫh ΙvΟƒŽͺ-[bAA({oœΟ&E!²kΪΛ ηΙqWΡμ/Ι¬h1ΈφΑ¦”ρoέΏΗ9gϋ%‹ ΚMM‘’–ΫLR£wΤrp)œψEΒ#HρOά›<[—¦Χ]λνφ>ηήΜRΈϊFUvYVguYX6„,d["˜2c‚Αˆό0 ˆ`#LΒ’%ΫΫH*©ͺ”••ω}χž³χΫ2XλyΞ-ζ†T(ͺςήsφ~ί§Yλ·"ήΏ1––΅ΡFΟ¨m`Ϋv]hτ_„Qυϋ†΄' θ‹0Ό"Aƒ‰K΅Ά& ”eŸOU₯ϋΎ)σ#iι ŒΪΌ“Γn’,[ράτ˜’ζ”-R’Έ]hƒΠΚ΄lε⾐(!ЇkaˆCΆοσ-ΦΒT^A*…/Œ±ƒΦ”|³yΘbD,… ·B^PΙΩ—ϊ½ΡΘYκ †τν¨{‘ŒωμiΫ²βD₯¨‰Ic½΅ΜλHEž2Ϋε‰Ο~`Ε<ίΌΠ­s.ή怄Z$œ.v—S ή0¦4žΣ<}E8›¦_ΖΟ & IΝ‚–ΕLϊ”s:eH‘οΰXC* †5υ5t ͺ«2ΏSˆήυ—¨ t°0lΔώπVIhUρ“Π#Y9eκΤ²π3 ŠlΫεΚξaΠ”i˜φΉxθepgP‡bΚ†§re§”ωXΧ›"Ώ_zΘxHx[E0žή‘'©8[«Ϊ§ρΒΪ·’wϋvA@‰Ο™IΉ‡ω°Bxx‚Œι6Ÿ˜ρέΗ/·Wvu£c`"oŽv1β—υίΒδΆaJb`§l£{v[ΩζB\^―WvJ‰gξ o˜e*Βxf―%|FŽΐό±ΌlΌ[ΚNJρβYŒ΄6ώ½χo44‹ƒΜ‘JμευU8“FΆFd‰ΌŒέrάOΙwJ&%³ ‚™™² Δ¨d»‰¦Εš©uB ≑Λ&\ƒ!V¦ΈUϋΎ!„Hƒ‹ΨA­u'ΜΆV`5j;ΕκƒΎ‡ ΓΗ=91†\*™’b;χύβσά }8ΐŝͱ-—ΒΔΦ*>Ό’Ώ Ήω±HΪΫ{Ηύ~0Rχπαηπώ‡?κD#ŸHiω|d"rteFΉ­·Λξߝqͺb4Q@‰Κ4 @œΑ•ΡΉ6ΧcRΆkitλMbίΤ.G‡γεΝk‘nn.*ƒ š95ŸcyŠ'ή`%ΓΆ³bͺΦr‘·Ιˆ9g€­H9ΟΦk`τ©TNξq‡ΰSΟYמ¨Kј3³ΤƒLΛΙQD†@ξ³Δ΄F)ϋ¬£š‹SΪΠŠs`±6D—0B•½‘G=5ώ|qMό‹?ψΌΎΌΧ»IΖ)μKΐΥo1Ώ6Β5Q‡ω£Laͺ9gΗ N](£>8­kŠΏϋqΈ™:¦„Z Ο­­ιϋ HΏωwύ# §‰Α`†ΕάξΜ- ψμέg\μΞ…γΌ»:ι<Έ»0BeJ‰ϋˆςzœ_LiGΐΔ7ΏώU†­,.’žž―^™fίHF½\v-’ω₯]―W½Θ]†8.yŒΕO,IΕλˍJ­| ίΙΘμižiRŠΖ'Rϊ ΣύKΪzž'Ζφ‹¦’R&]&[)^5Ω―΅°)‹"₯ˆ Ότ Dΐ’ΝΧ’zhNVρΗyΚ]Κ1°΄‹Iϊ9nαNP6¨rzp€…ΩΊΓξΊφ0–©Α=J’_Εά»)DΤ^]εχΫY]ίλν& ύςgΤ•e%#„$L<Ε+„<›#ΎIΈγnhrί‘}₯‘ τ1r:•Ηη]ӟ4Βͺ½RΏoάι䬀]#ΣmΫ€>TΕεŒ$δD §w„1ˆή,ε‘.ρ(_ΐή!)ך‹ΡδJ W/ΙeψŸV«2]‚“ ֚Έ}ϊn―7ν‹LuKκ±ωΘ§Qϊuƒ”¬7W‡qο21GΓΟύκ_Γ§,τ ϊ|fΛc—’’ΣžcNέφƒΙγq“ΎlŠ8ΊaΚ\ŒŽpΜ™ήz•ΡΦφaΣQδ&kcϊ.ΗψhV$8ψ±6yœΈΘžsaVψ[)ŒdΠwo*/fΪΠΉβƒAe , ½).‘kvΠΖιέ`ΚQϋ:σΚM΄ZYΨκΨΚΦ•z?NO3ŒRsΖ”Ιψ’ƒΎΚ}W=*³’ Hšb|ƒΕŸ’όΒMΛKR~#ΏέmΫώ#+ό3’ΊhyFΖpI:¬ρϊzC)wωcΖμ² H›φZ“pΨ#ίϊσ£©ΚnLV—·ϋ‰ϋyxΛώz»!—Œγ¬Έίο‚ϋ-τ.K»~@X.Χ ξχΓ+ (Ε…e9π³χ¨] 5±ζKήέ‡nRϋpΜ`κ#ΚΩ—σ4Ύ:<ρώzG,™³»΅ΘΣRΕ`P6;l)ε«J₯~Σ»Ϋ²—rSβΘηθψςŸϋY²²n¦ΥF³ ½Lyb{›9˜©`.i^ςΛεΎF•-IΉƒS&ΩΖ—½€ςθLcΒ~Ή*DˆY)SNα:Σi²δ–;y“’ύΈμΛ]Νϊ'βςƒSνc8sΚζHŘÍ^ΗPR•X} l9c“΅(π§5ŽάZo M[ΊΠαΡΒK$S2¦¨j©’K›‚½($wFΘη ΡxΏ^$U(θ/o”‚JiΣπgEΜΗq!"ε mΠΫ0ζRήx$ŽΌuL@ΚCs$οΰS"ΧΛ”iɟ2qPΟE6¬†©’$°‘ڍW(A$ε)ρ@χe1ΗsάΡνεκίΗ‚œΧ“£Ό»` fΞσ<epγ ξ=¨ΓνβΩσ6'pΉμϊ Ά}σ1 b€„W—΄[zg‚:2N‚@™Σ/©>Ί«œψ™π„8σk)ΎΌs’Ν!©·–δς{4ε­ΈΠγ©‘"Ξσ†’7όΝίϊψΉΏϊ+ψgψ·ρz{aρ₯ύeLχίψWπΟ%Ί‘X£*ΚΑεƒJξŒbΎέ 2δnjί3ψ]…¨ bΙ―dΑ^΅Szj?ΌIsvΜΑ,ϋϋYύά採ˆΈ‘ρΉηgΜ>‘~λ7γ#SΛήqoτ|΄Zq΄Š1&^_nά#¨ςΗβ˜"$Ξβ»δyKφ~«@§Τ Vi)Dϊ.—]ΎŽ )\&Ξeή€Ήπt2ζlΰ²! ΤiœΈέξθ½γευζΛυΰ8ιI1ρ œŽjf1}Σt‰eO ΈœΩ”JΑλλgoΨ―€Θ«ΎlηA#ΪΜo½zjb²,ρœΡζc‰ΪjΗYΩνge›­Xτ9ηŽ&-Ξ|³@phtΉ˜I!₯˜Y;joŒqΉ4콑§w{ΗΛΧΛUγ¬ΰYκ­QΙecλ V„W΄›ΨMY<+C·'E™Z±9ώγb‘•…`£Kœs9f&ιΰ ‚&Γ¦ z&ežΚΐqVΟih­­Θ\ΙAͺhnΚ¦”“Ώ4–πh;Ί₯Β.hΏ\H0}S€Lσ=ΐΩ‘—G .z’eJQημΓΙ½APλM²Οΰ©™6ίFbP !0ˆΛaΕDΕTŠœΙEHώsξ9BH (㟐Th=ˆ b.ViEŽ΄$Χ΅οXG䬫!r3γ5©’νg=³μβˆ%bšΈ>m([Δ•…εmΣ¨¨λ]θ}zcOc>-›ƒΨfFL0©>»ι€^EhύQΘ‰ 85ώΆ½δœ,Ύ–ήUCξ·Κ’`­Žϊς Ύϋ?ΒχΎχ]τ>λ‰ΒπϊgΏΟ}•ΈZC£Ή¦2ΧbŽΒŒ l“ͺdΩ΅ΧZ}oΆo;³U…K¦H’^{ηm­ͺ Kω*Ι;7‡l…έ1ΕF―ύΪ_ϋh­…Ϋν†ϋq§δυ¬8Οο^_Π†Ϋqw:'GAνυƒlk!χΖΕ1f’₯—‹ΛRΩy@F•φ&P†™%sΎΊ0J,‡Ω=Ζ¦ ©΅²ϊ‚λ9ΠD8]&wΏ.'΄]‹klœ$©δLœ‡Πε²itΒεaΪ.xϊΰ ΘtHοΫΖͺC£={HmΔ† Ϗΰκ“γΦΩχ / ·-c΄Žλεκ ζσΰΘF4ΰ oKίΏΎrtb]ΖνNυSΚh΅ϋR8eI-Œ'rΌΡ]ŐKΖνΰ‡ΫκλεΚ,’Μ‘ΘeΏ°š’vάr$ζ˜’Ρ²M„‚’²‚ͺfΜχσΐϋ—Wb›ί$Ž9lΝgυQόE_*E,Θζiƒ)ι ¦)Τ“RζάtΆbbq?£];‚Bχχ\Ύψ΅ζ<ξ&ίΡwΞ%΄©`Έ_%"<ι₯‘IψπhžŽξj$ο .aνοGIuqΌΫτ“ͺœsFΩ/",g―ά³. ΛΛr5&r―7~Š@žk8ͺ»Χζ*Ί!Χx γ£αθŽ1ΉS!V[Ωθ7Ρ%έ4ώΈ>=1Ν­u9ιrΘ~ψZ4ΐS]ΐ#ΕΞ“mΩl.ϋ>Ζ4³β#ωϊίεœ]’<„DΟ[ΑJύδa7JDK.θ“hCΎ›12†θξf{&ΦhQ(ρ#=<σqy2Y”£Cwπg’"Μ'cί•κ˜sq['"c…IξΒΑs΄3tq±Π€4˜ιal™3V[S…!›6]₯΅joF…©νΘL>΅ψ^ΛΜ—CTΜpCuΆΜrωΩ81Ρaοq³A‘Ae² (Žo:¦‘‚ΔPFgm8ΟΚ½jNLXΤΞg £_2eπφό˜ΚΌΘ½ η 9I^^A’n^;»8[ηq *Θ.ύ/ύΜGΆ,?Οκω4­4§κe}[ϊXΣχ˜Χ J.Ϋϋ)ΉΰœSωΞZ˜…€vžΈ\―([‘ŽP€e“ϊ™ΥF*­™λ±ψ>ƒςέήpΏίifj=‘D2„~λU‹σεΖ§ρ&υƒ?ΐhΝqύ[)¨£Ιν‹Nύ !iΦ œ·;lΦ© .9ΙΗ4ήΔ,'§΄ΦTθB Κ& ’4ο·ξΕέοcz…9υχ ”Ν ·}rΧυ¦ [s*2šR—;ίΤƒCω,Ψη”u©P1˜αZ&Ϋ’\»‰Όsγ€3Χzt,ςοώΤnΚ™–d¦τΤΠΉmΰΎ(ͺσV JΩx†τ†”¨ncŽ~wO¬.Ί°*ψPρgΣFB3bΈΘ‘n K+ l©nOUέ6†KtM±f £&6σΥϋvy! R\lΒΒ…τΪiΪ[RΪ™;~΄ηaj‡ΛΟuίw΄zς^ωκάYΨ1ZK―Q’ΐB™E S—ΤΒυrA‘{‘‰yΙIpIFG,zm$OO9atŽΗ‚Ц¬nnκ†:©Δ‘ Ί)•γZ ι—κΟΤ₯°x­7ΙΠΞ>ά…CΤΓ]@ͺΑψ­vUŠΕΝ5}Οb6£ZŒΧˎ²gd΅”RάMmΞmc…ΐ½„σ8˜Ά%DΐqX!β~?0SΚΜ3qœτ‰°R'”mΞ…Λ~EοlϋκΙ‡}Α(›D« ‘α§0£O<==cŒŽΛΎΛχQ\ώVΆm…!BΑ€scvΤv2ψ~’ΆŠ—Χ"&VeΖ―α‘0Σi½CŒ›,csώAy*$ͺ?’W₯$zzzbτ¦F\¦r žƒΡo•/…JέgΐSX[@-iSLDf+φ\ϊ9gufέI΅ήYLvQ9L™%yθμJ‚›,ΛΒΞXRέqΏΛΜ•ήψ$€ώΈmΫ6zIUr)G4,{λ(™ςlŽbΩβ+ ΐŠžα5Œ”›„Τ !+$xΨΙΦ΅πνŸό|ϊƒΉqz?BTα@ΟΓq]\ΆΝι½c± YR1"a<€‰κSΡΜ=?ψKΜη(δK_~μK_Ζ»O~ΐ±μɝ%«”V“a&_ƒžΧ¨οlhGc[²ΫŽivŽxrNψη·πύ?ϊ—Ϊ#ρg©ηcήNrΗBX€&#šœ}Š‘5P[GλόΗ#^λ‘Ȇ&ε‰3ύ"Ά΄Ήjˆ  ‘νM,£δy\τΜΫh½²kκέ₯΄F`!€1nI”/‡ΰhΣ%o!nYΡ‹Ήπόό!Ξ“¬»6šcPζm^Ό9'ΦX8›ρ»Xηα€N$†γb‚’i«.–mΫυ»φ%κF`—λ˜>Ξ;Ξ[ΩpΤ»Λ‰*αڜΈwΟS!bI^’_ώ•_ψθ8Θz!yα~;qVfF„ΔeΚq>2ΪάGɜι€Νh-°kkj{ωοωsŒ‰œφ‹θ¬ϊsm.Ξ0 ‹ͺGAΗΤκšC{,ξ4ξǁzvχκ8Ϋύ.HΤ±&Φ‘ρCKKΤcθΓb—hIΞlC­ —λΖGbΉΙ"tΩ7=μ4Γ™αΛΎ΄³VΤ:p»ί=ΆΥ†V»ΗŸgs-{T@—α#ZλŽ6Ÿ:€’•ι0ϊr<8ω—ŽxσE”RhΓrq+²„~TŸoχ©ŽΦ8γ &―ŽDMΚKb!w­5\―OΘ95Ύ&φ²ωΈΒ€±Ϊو₯_AΰΊξhmΊΔY]•mSujδ‚[φε˜<|‰)‰?FJ‰‡ ([,yw€Β¬π1χ-uνπβ’T‘J9cΏ^$2ažE)Žρ‚’&Ύςυ―α»όΙ=H9&}γ‘i’"h πηύf`%«MΟ@ΞΜΖVΧ05ϊz›nx}ΕΛgŸaΞ‰ϋˆ’λσ³#-ζš’β‘!>WŠ tΪΚ¦C“»©‹ΫιΠkβυε=ž.φ½ο<¨ΑHKγœͺΡΞ\χQ1Ζ>΄bΫ ξχ“ΖΠΞ|‘ 3πt(fΙe₯ΆχJ9Pκm P¬…{½#εŒλε‰δ^S!†¨K–‡ΡΑρfάΎϘ$[8ΗLx!0;gΙ„mL―YΤr»$§„/ŸGίυτΡ”š™yΕT·Gsxν,άΓ}μj;YξΛhΠL? ?ύ‘i±[₯‹8κ€nδtΊω0rfEgUwxδ-Φ9ι‹Ω.›·Ÿ₯δ'&3収Μꦣ}ίΡ*—ΰ%—@|˜ΨŠΆ“­}«ΐFp)4Ο ZπΩˆΝ”9&‰΅Γs‰wc#‹]œ{ΓlgQN/ϋU{„„)Ω΅#Λ^/WίEΑΨ†v0"κΙhΰ &”ν1ˆ9ŒφνΓ»¨·ΚΓƒ—’I –μ³Φ†­Ό©τ%Λ5£#πόtυ|“B†€©Ή― [δΞdLζkτΡΡώ%3BΣ†y7ΏH. ’Φq&qI—νϊΡΰΝ‚5%ŒΪΔNkRfρ»‰1ΈRΗ^n¬ER¨b_ηN>° ?§ΜΉΈ–β1&χχt―1dS‘‘“ό ±ΩΆm€΄ “σ<1Β!h‘?<ήΧ~ιŠ93Ύ§ίE@b—Ζ,η‘|υΜί=…ψ KFi1£dQ-3°e±«Ήd?Ϋƒx0¦(ΔVM7Ρ4σFΐ—Ύώ5Nκ‰λυκ¦ΆΌ¬i(σΗ>Šͺ©’q‘¨κfTύƈΟ>ω!§ BΗhr&*ΐ²Oε€Ό’p@εšhβΩ-ήLš½•ςψ³1”ψˆ―0ηBX q)‡E^&‹l5U§ΕοfνIΟC &eΖήƘ)Daί}ΆžLC„ΈrT6_Δ/ψ?B›έ3Λ«$ςorI¦›rGh<1ζ‘D™Œio˜o¦Cυ¬ˆξυd1•’/ο[gρΈν;jώšΩ°^Α"u'E:ˆ·γΖ½΄ΖͺΦΡ€ŸωΛι£Ϊ:ή½ΡΓ!γθŽHoζ’Φ:ΡΫAΧ±₯§C€Δτ¨JM²™ΞΦr¦χz½β²‘Ά{Ή^ˆnάΞ–ΧVUX Ω[Co\~GΕΆνΎP»λ_ΗβΓͺIG=«Υ₯ά5α/μOγυΖT»€‘Z˜ΖτπΫΎαωƒ'”’±οJΩ(q³e΅δ―)rD0C2δ½rŸPeΤε^`Ύ1 3Ά·lDy[.Θ”ͺΗ2} μZσΝθIX—=;œζ5Ύ—[αχ4Vw²τύ<τ>$wvaΩ?ψπ―σΆ˜ͺ|Œ₯€˜€Š ¬ΐ½ήy2MΠ ˆΆ£Ut­ϋΈ±΅F₯ΰq Пi90˜’ ˆΐ‘5n6’€ ΞٚΒΝ[WS4Φo œ³˜ƒλGB¦9;πΞΞ”{y+Βϋ―7b‹ΘIsˆ>`˜(v@KΒ‰΅ŒWάl:τœYz¨I΄Mω•ώβOό…ζXˆΆ:ksyγμœΞ.'§ψ)¦EOϊl΄AKQ›Ί°Ω‘’‹cMͺ³Jf₯Έε"K=oέR ξη2ή­xς\_C&Ε*?Κΐq«Έμν@Uμd€hͺ1Έαm78Ìcˆψ{ΞίΓύ_ύ7θψίύτA}7ΜBδ’?•΅―ΉŸφ\|Δ`KMŽ9(*€ΗyΌ&Žϋ‰›΄ώ ΓΑq Ο–KSξGμ²»^Ÿ$FΫʏ D*BΊ+LŒDΊ‹qcmn.Ιγ7ι% ¬μϊ…€π“Π”ά—’cgrζN&ισΚ9αιϊΔηgtH%a»n΅»Ζ45οǝ.<²Φƒ†€Φ ‰Y!Ε‡Ύ_ž Ž “|6αR|7RrρΦύ<[ςϊώEjθ.iΎ°αG=hΔGIπ3Y³δ33εCH~€„€A΅U_.œυ| χ5Ζλ}bΞΞ…ώ Aμ½aφωΨΑ‰,Όν›h§u₯Bά$ρΘΜ Y;1μ&  Œwψί{-Ž:§| 93ΌjΈ*.¦(aXΐMΉ4S;˜9ψmθT€2νμτzΎΌ) pΖΰςθΦ:ΞγπΟz¨kόbHτb„ε ܜΉ‡όƟ /Žzˆ%I„@zν όόsΚ’ΤͺB—0%)EΠ A{ΌIQ€ΛjsNˆ!ϋR<©»=ϋιQΗ–ΣcqΈeΫΊ§nψ‘Q4\iU+ οΧΫέ15&9ΆN!&sρGWJ†(υ"Ύμτ%U₯–DΟHŠ Θ,>‹b%bL–Β…Nφ¬XˆΰΓΡFX΄l΄W€Ÿϊ™Ÿψh¬{ή3vƒΟΑ¬ˆήδ.–’aIΦvΦΓΈ1†κΑe€ftc&σŽ"Ξη~μYUpΩ£Ϊ₯/Κ ζ‡ΪπCcλθτEάξ7LEεΆSsN9­“δt&—hZ5“bΒΆoψs>αη~φ'ρΟwρΫΏϋOHžKUε¬ϋΎαωƒ°•"X"Ώ€}Ϋ±I1α06±l]Γλν† l•Ϊ*Ξγ$[FΖή₯ά @“ ^B1«j0ΜΘΠ7Š­DΖs§›KσbŒH~“IΗψ―5–’θξ;Υ&> ­|•ϊ‡σζΪΜŸ<ΔkΫ6wΌΫrόrέέ!oσζœ₯ΧΧ8FGI…γ‡Ρ1Ζbφ»d§I‹|ώiΦ=ζ#v™j4,•%a±ΓLH,X‘\¬e˜’1Έ[˜μ\»ΖXs= …°^ f-E0χGVxŒδ}ΩH‰…Cύ‘ό nΨφ‚+,G€\DΠ*;FhBPΡJΞ$ΙώN‚“.τΉΕEoΫΓd»„hίJqh₯›ψ$˜ ”@`z›J)8»1n<Šρβ"eΣχϋM±°Λ•L)r©\lέ“Iτfξχ ±k\΅|ω½οršήμF‘μz*ƒO1JήΉdω ///BΊ/`ΕΗ.$bί…BΏμO8κa|­!•‘:η”φ}§?D" G(?dΉ'’Θ©ίZΕY›Σμg‘κΊΛΎ‹hήY@ΧΌWχΣ•’ά'/O§lΝ‚€’i5o!I]'Ή29oTϊωθzšΉw2sLο€Lνi 7NjŸπ€ΞΓ ο˜ι§~φ'?κͺήMŽK]2έζ ΣuzukσΐR Η1$%)WL`-ΤσΔΚΑ ΔZN3Σά.-ΛDΨ…:Ήί‡ ΆΦCΒν~cδηŒEΥ|rœΫξ#κοcΔ]YΖ|sβγO>Ζφώ!~ϋŸόΚΖ[ΈμΩχ8OΟΟΨΤ ]/Wμϋ.=΅2’5¦.žO†ω j«Ž¨ψΑ~HΈ›Λ<§:VΆχγτ±Γ#Kziο”…ώαηnξ΅Ψzrρ,m«>ΨmmΘ…8z»΄,\giά”RΔ§Ÿ}†Ϋλ«nˆΠψ-qaχ¦Βή,6WŸε&ωŸW»‘¬Q γ£ ό#֘Ύ a6Μπ.Α² ,ά¨Ά¦GςΩux³μ΄π°χR:ˆ<!Q³LΘέέχyY|©,CκCAΗnΗF8V u&Mjž9†Πξ„Ύsy™Εh›Z€†hΉΓw)Α.,UΐtNi(Zβοό²<ΞγtQΈΦ¬>-}@HΞφοηι8Κδ³οζ,έsIΪjPHσX‘eΪ’€ΰωφγΝ~±ŽTΞvϊΈ“~š‰Xςξ˜εηT™Α Ÿ©ΆμBΔ›ΚΈϋ˜=匭dτvb¬ΰ>Δ F—ηδDΜ|GMŠμΩυΖ†ΣΏW%JΨJρΪ.a3g)ΨΌ]Εo)œ$τΚ’ΥVdyn‰P:]˜iPŽς)Ι½9ν‘<ΨΠ+]hΧΞ&¦„³UϊΊ6vϋ­6lΉ!βR6?%Δο_I‹ΛΓ!Θθ$]'!1Ή€ΫξΛKo­#}ϋ§Ύύχ Σ.­ « yΨ!Ν»ΝήJαrΫηpFuΥΓ›·ΝρκoΔE‹©mί±mΙn1_δςD‘> ί”‡Ό‚Ϊg·ϋα9ΤviX0Pk £7yΚ9γυυΥ1¦DZB(l%αέΛ+†HŸΟ>Σ¬@γUf`ΤΆe‘LmξNυ‚1€L@w:Qsϊ)x™η‰ ~}6tU ]DΣγ8ύ’LΞς^I–Β|9JI|Α«yκΉ;6=LOOOΉ‘–kc™©Ey1ΜΊΤ=΅V¬H<0ΚΆaφ]ψ sΆΪnjίw> )`*„fΖ₯< JQ·Β–7JΩ‡˜•ΠΕ²Π€)ηοΙlWJ £FuS#Ν£σaΫvΎl];Σ­QgwJ ―‹œΛQ,½+–αaKςΌo㡊X²2(!%£δ*²L(ΦΒ±f’~ώ8NίΉaPjώS;…΅‹αήjΚ―ΈQ3lΔ„ϋy’"†Ζ%Œ ˜ΊΈYVίφΛ•Ύœ)–θμ›1(±O‘&Xx8ΌC‰2Κγ£Β₯Ν\ ε·ΪWε˜‘@ၱΏjm.GnϜηɌŽ„C’1U“όd6Φ5{H€E¬s€Ϊ2_4eΠ0›=KΥ(εΟ< λθΪχCnΠeοp(3Δv iK~ &A-Η@NC—φΆQΑ™u‰ΘΡpχ½ ΟM :Η,ΒΧ" ξǁ•dTς⠁$”"Υ­Q9!΄+μ8jC_”ˆDlyC˜όΡ1Ι|DοOJwdgΜ=WΩv·mΐdΚΤϊρg5}ώ”Ο „ενg“‘ς›XΖλ1H™ΙΠ¬Ϊ¨ͺ6³\Π—Λ…‡uxzζ|Όž4ύ™tΦ±ΦΕΰΕ‡Ό:‘φυυU ”ˆΨτX )§Ϋ‚X昸έnάθΰίwJ7³LP΅UWa­I6NΞ…;=–IβKΚ}CΏΫΰ(Ζπ%΄ΚΛλ+ήΏοnχO?ύmπ€Œͺ”fηNδέ§Ÿ!ΔΘ'ληΧbmί/.N¨υΔYOτΦ‘·¬έά3ΑD=ώ\<ΌƒΠ-Σ%ΧSNq›·fu“}R9faF1E9Mͺκ%fΛfΨΑncH mρŸ„51QG}tž£NΜϊJΙ\λG–ε&+|0ӘZh)q)sΤ³o›Ο ›œŽ‘q ¨υ– w½>1Ν°wfΑSϋ° QŸŠ„ EOΤx!•"γf|³”gg_„Ρ1Ι°wμ’’w™΅|δT™ Ψ»>c={& ΰΛmy+MΚβͺ"Žn)‘¦~L'±š’Ζ«k.Žμτ{™ςΟΘΙΦaΪό~ΚΔ 3ΐ*ΰ-ε„:f$‘ωεΌγVyινϋ&Χy”8%9aΰ~p:ψU+Η¬[Ξn ³ϋaˆˆl„ƒϋqΓυ8ι»½5…±δΣβΖβCˆ%6το3γˆb=œμY‚Εt“™Ο¬Y<π»*Ή0ή@¬4£FœR·²[o<'Γ ΝK˜ψΰωηqJ‘XcPχNκψ°oRŒψμέ{ΰά#? Z«β&ψ_ΚΠ SτυrEΙ[adE|§‚ψwk-€oύΕo}t‡ΰ‚ ³asΆμΡ±ΡU7F±E—φ ¦ΞββgΈcϊrΉ`ίΘ/*…­gHμ> eθΆνΘ[ςΛΙφΦφ΅Ξ|‘>jνŽ zωhΘβ @gu8Η.KΥσ|@Sth]LŒΞ<ϊmηXνz%„sΦΐ–9GΟAΥθ’ζ²Όχ^ρ‘ /――Š8ώ…Ύχ‚³Z\lpwTφ²Ί½Y@E•ψ\oζ–LEά4ΞbiιkΫΆαͺΨΪ)όD*ŸSsΉξyVΌά^ΔΙaΧ₯wzzΦ\ύ?±Φ= bFͺ]0αh…R6Ω0±m8€pN&ΦΦ=ΒdΟΆ<ž^ANa…¬j€χΏΗ4μr3G&σ1Ž£σ³oK4hΉ•’‘Δι ¨ΗΈFΚ¬ρ&“=πw‰!px₯—όα£Xθ˜s ¦©:ψΚ›Ζ½Ί\φGά¦κzo挧λOOOΨ•ŠΈmΕι}Ϋ}ξniV•Ηps-܏;ό£{όμν8Cril•Prs IDATi ₯bmύ°Be­Δ°ο]G-»ΜšEyρ\:GδΜPŸύςΔşωZt9Ο10;«Όϋqσ|‰©.Ξ*—œ 2x^―WθξΥ ΥϊΎ_$Γ%· vΉ^πΕ/}ο>{' ά(·:ΕQG0|aνβ:ΟκZτϋλ ήϊ©Cξβ‚ˆrΩά;₯v©΅ϊ‹žΗqht“α1¦’4»Ηyκ₯! ¨3"‘–Y eγΘΚΜ°CΑZkJ]˜γεβ{VRAXόΟΒ ^YΕηΜq…0YFύyž2&ρŽθz½bL:­ηXώ³šaί/8!1b+<Ό!8ΈΠxn]5>ˆ‡€«ϋΎιϋαŸΣkΓnrρ1ZΦΰώdΔrm§3™llb?Ÿϋ˜ (4%F³TŸ&’=\ƒάζ‹ͺ­TŠGΑjcE?Αο:Ι'³@ŠFΞΙKϋk—±t©€,Βτ8 Hgδ9ΈΆ ΐ²cΈίLώͺξ­μεG"ŠΖಘ€rπv»Ήςiί/’‹πΜΘHΥένυ bQ#ύΪ#ΐΑ4ΙΦ*žžž0'"—}G―' j’(·ž#Ι!Ζή©p.‘r€φJ_Φ7> Ίuiί½υUQ Ι’vyXX”yzλΞ α#I%c“Αn+ΕϊTEΦ\ήvJIM±ύk΅)ŽΖqœΞ šBe›΄q(|gΘ1Šόω˜KΫ¬Am’όr)ψΪWΏŠO~π e‚RDΉΆla.ώ]Ϋή8}λΫίόhΞξπ; …Ϊ{lΒW»£T―)Șϋφ ϋΎSΛ 1œŠj‡"„vΏΰ|ζ…1φ½(Ž·ωΌœ/9ε§%']°Mn² ΞσΔqœΰά–β₯…ρΒqžŽRζ%έ΄lλ@#ωχΒ‡7eδœˆœΘ γH͈¬r—+βςΣO?C Tήd ΜKΜ&_ζϋύ‚ ηzVTI΄Ήlf|ι‡| QNΔΐd \b»KτύΩΤ 9‡μ9#–Aσ’ˆ²΅£'²fξ­wœgu]zR©ν…BˆžHhf§²7ͺΜbŠH%i šDεώć΄’/ͺ§`‘K&Α³6<¦"ϊšŠX₯±΅vΕ$kΗ•εSŽ{Ή Φ‚‘Ύψε―βεύg†ΤΖο+ω PΡ̍9cI6g&Λε„³qt4&β${©i΅γk_ή½{οyκgoϊsd\4Εr<‘ƒC;ΙΌ'g…9zXΕX,ζ —|Š Y,°I8{#/L -ώ™‹ΉθβCYtρύ]%[ZC,¬EσκΆqΟQ[Εεzq‘„εωΔ@ ΒΛΛ+ ωq«|O&@r@HίψζΧ?~³¬Υnς3ΰZNY δβ•r² %?ΪηqΪΘQΡ€Α/,ΎπQ΅ϋν=žŸωΑ,so€Z»K)O1―˜#|GsφtAλ0Ί’κ‚–WAΔZS;-K’ΣΒݘ"Ν8RŽΨ·Μ™{ˆΨ/„Ž]―οJΎψ nΛ‰…Χ—›Π$Œ¬¬΅‘·ξDΨ”Σƒ5€E˜άl„b>σFXυfIwc ξgDΧά,΅LJ₯§§'ΗIEWˆH™•EQ$°ν²lΌΦZE Ÿ}φξavίkΞιψ‘$%Ψ[I·,”ˆΟ₯„Λυ;·ΡܘWΩΈ”MgΤΈ7 U©½³ς«ϊY zηΛδœϋžsςΛΉwς‹H8o‡ς3&‚.9¦KmΉH>"₯™ρ‘φYx Ϋ ’·– ›ΐκm+?φ!OΗ§Ÿ~βj2vͺΊ΅€/σ&…]ΥgΒ=Ηß‘ϋ8OŽ|₯¬yς"9όΔ_ϋ΅ίΐπgΘΩ*W>f 4£τμ™Ξ₯΅χσ@ Ω}.άeϊr_½RvŸXLν’Jα;ΥδuΑ\˜ς=Jί ƒ|μ\λΚοxΈ‡"J†½\ε‡aG΄ο<=}€/|ρ‹ψξŸ|ΗΗΐ1] Υι½CωΰCα_7`Œ3uύQΎ+d’ρΝll²z6܎WςŽZH5œηι'㬑¨!@§Gφ}φΪέΠwΥw?&ά°sΓΨ]ΦMωδŽσΔΎνΚ³ρHΑ8§κ†(Ιd³Ω9:ηκ]B š Έ‘1ημμμΣW~ό«­ρtnΥ-ΉŠ«ΰζ"“£MVχγΠL]¬ωHΟΑE»ƒΦφˎ¬ΚΈ΅†^;ώO|ρτβψ‚1ψrΤΪw}»ίQOΖmΆ“lϋZ+ͺ"wMΛ>ηtj)ΕlNl„ί’ !PΙ€ͺcΫ6¬°\†·ν{)Ξ 262βŽρp Ύ(,…Έ›β\&¦^Μ©…iτC! S½Ζ$F°€Γ)s\νHή}\Ρ,ΕΘδΈ<’`h$RΠ {xvBoΓ=JΖύ’₯b,Ώ4£Ύw,qΎ4nœΰ8hHrkx•Ϊͺ^lŽlϊš>ε˜η»ό‡x=n.oT].αVUn1ΎYŸ%bΠξGb}Š 6(6_Vΐy*~ΑB±ά \ ;ΕR€…7—΅©—rΞϋYߘο؍ίt™2bΊ=.oEυ<ρ'ό‡oŠΚLϊZΨ•S’OCΜ+‰T£(†w< a6Ό!©;$ *Φ‹Šχσ<ι ρJ­Mαp 9}/ΟVΥ,ΐ‡χQ1ώžkοkη“νλRαΏwž„rφ9݌cDϊςΧΎϊ‘΅α\D-Ÿι½m9<όFψoω,’4κπΆκt šq˜W‹-Ή2k­ψΓ?ώ^…±¦' OVUχϋ)%FF·q€dfQ;‹ΪΊzΈf½l—‡>ΞΩ%Ÿ€*[φοTπΓΟ}Ž‹IWwI‡™%νΒΒ"’‰ζ_kα”cώΈH₯ΰv»«s’2₯„wο_p½\P;;ͺσδ|χz½β8NψLvlvPIP Ή\ŠœRBɜo™Ω―}ε«t€N*r™ iΉχƒ£«¦L Ζ±rTh€;ΛΑ^cαƒηgΒ"υΉ.₯ε”…LyΐSJΨ΄πƒd’fθŠYŒ>}”3ΧΒΡNΤ1<.Χf­PΒΤεD΅Jt·U³–’"ηη֊ΣΜΖΕp;Ix–έ>Χδ’PέM—YΣD ΨΡΜlWφέΙΣ>¦MQξl<„ˆͺΚ‰1d=€ZΛΠΫΣAŸUjΘΩΥwšΗί Zδ’™'^Ψ±%e€τΩ=£‚ΉξNf£»ΖrN`κ#«›¦ˆϋΉ(ɏ*―hΙ£+xgp»ίΩ‡%\ΙΠn(( Œ8“Ϊ++ΰ1qΤΓυwFψ%±™&Ή\2bbœmΞόη+D,)πr*ZϊƒAOι!―6£³]4£μ[ΑΎψ|ψΉΟαέgού=3χy ‹2Ž”Ε+D LͺlΦΎΡ£S‚ƒ5—#cΜlωθ6φοΪσI1pνGv”ς>λ>†SrΙΈ½ήρόόμ L› ϋΖ3m+YDgΊΗ§[///Έ^8β"‹žΎ³vη,N-J`Δ―ΠqL€œ ι+ίψŠ/Ρm†m»ŽΣζ§‘R5“αMkΆ<‡›/rŸγ’)\70q}~)ΐwύο'ξχ;ΆrΑύ^Q«Hs8…u*νΝΪΆόf.Ρƒ»΄‡–…1Z€Μ’#wχλε²{@’- rΞΘZP?]―δΨ§Σu=Ο!gaB¦ζ&ΕδcwbΠ_ήΏzΜνqPέΣ…dXJVσ—:<dχΘ‚nΈ!!4σί=8A?FΞJ)Έ½ΎβωωVδAFk R₯qΧαd69Fί©pΏΕβιzUΐWAΩ7ŘRΖΊ —πΘloΠ3΅Τ)ΎyqΈ(?Ž£ yj3ΏUHν”aORR,^‰…°₯,eΡζpβ6Ο½·P$kεΓ κ¨ Y|χ€VΦ ΗύpHN„-zτoɞ=>υΦω­51ΒDI›rθΚ*GΡ\mΉΤFž‹*2cz%Κ―Y½λRα—$δ /―7_€F_‡ρεχ–ϊh•·y,^ΥάΡK†Θ‰Κ1{„ο K—ΐP荕Vά"$Ÿνcβΰ¨~aφ―³<¦ͺL:μ›θΛCϋνΚL:^k}˜¬½ƒ?Ον Ό€Ρ.+ˆ˜D—2ψώΰ‡†?ϊΞb€ŸΏ©ƒxg6qπχLͺ2“Λίn7Be‰kTˆ‘1Z OΟΟΈέnψω_ψ+ψΑ>–ϊΈ\/Ύχ>2νχŽ"Ψ3„„,naΆΚ=*»ΪΖRΖ·ΩάXϋ~qΔΙΒΒ‡~(€[-’]»;’Ν>ϊDΪ6χόΧ§'ΤVQΫΐwΏχgL_ΆMA9lƒΟγΐεruE‹ΝΣ«΄έΩΓ¬φ­ΰ¬-„@‰°εIΫΦT0\ž>ςjBh<=_hΩw]’» ’Δ°ΨRΫ-cœ­α~EŠ_ϊόηπg?ό ŸΎ{χPϊ¬Ι¨Σ>q»έέ]ΎΐLΡ†~Ɓ«Cmρv'O—9灰.ΨφΝΏ›―}νΟγK_ό’»εΛ&YŸ>+;°Ύψ₯Es—:Θ1UΝ*ƒ;§θ#Λ$‡>«7ΰυέ§8ŽW%™qΞ”φ˜2•lι Κa­…6¦W¦†ΣX}Ί΄4/^>KΊωΪN 9DŽxL¦JΆ¨moψπι‰.ζ2( n ³Ξ€ ρΫθβ8OΝΥα»)†t)W>&τΕ1ΉrΜΈŸΆ\˜;οΙo’’Ά† βdΞx­„ψ-,€’qΏέ™Q-Ύ\.ηyΈSΌ·EoΐMXο"Ϊ|cΌ( UŸKΖ»wοq½\p½\πςςŠœXiοβΈΝ)SXο\d/Ž1zml!kA 8δAΒόθ€–΄­6βλώˆtQεmXE.οΡθM‘sEΔΈ0fεΑ΄mδŸI83΅§°£#Ύ[νNΌυEwIˆ)γυ~G ₯7μϋEΏKj@U0\!ώ"*¨ ŌΫqʋ2£Ε· λwˆ‰έO*ΡScNΌΖΐκg-ίΏDα»ΏΡηMγΡ:rΰ¨0(fϋεΈ#¦„ΛυCΰ~Pθ"ΏKœdβ].Ο6©Ίb0ψ₯%ΑFνG2Nωl,½ ’I^o7”Λ†ίϋ½ίΑΏ£²oΊ°iŒόρ―ςέ?ΕΆoΈ>=a7/Z;%}$9Ε,FτΕ­ε:4325*'ΚV€'·ΰ€„wοήqώ.Y˜.vΚ…&hʝ~yΉγ²ο¨η{ EtΙκRHψδ‡ο•ώ§έGΉd±°†H¬…^ έ₯ΎQc’ιωΉ&‘–1α<Wš’)$Ζ2Δ|/Ι4HΌνσΈέο(ێσ~GνwΦ£<½Ρ£eΔMύΩ*'‘*²Ό“_gŒ΅ΫνŽΛuW†SGΩhΏΈίμϋŽ\>}1F<=?α~αΉ·mΈί9‰)%c F*/,Fά ;ŸRFVΐh‰Ž΄€/|ω %ΝΖ‹BΑ:Pφ+”"~‹rΜΐζyζΓJ“Y­νΝ‚‡J•""μ˜“ΔJ—ΟQ±qΦ¦¬ Qk§–‡jαLb·δύ°‘š/ώ-Kιho»Y…`Rd_”ΗˆλeΓ“9» —Γ­±ϋ²Ή¨ΝJ›φ1χϋ+~σ·ώ>~ϊgόŸώώροό>Γ| Γκ-ς8OI“«pΜΤΖί….Ysa½-ζΥ‘&Ί₯―— rIψά‡ŸΗίϋΝΏο—ΝΏŽΏbŒ(Ϋ†ΟαKψ™ΏόWπξ³OρΙΗί§»Άlξ°Ά|ˆψκιk9Ρ‹Rτόž)ež[G«Uc‘μ;∨ύpΔνυŽ‹φ.1΄³!…„»'N7Ϊ1K,³mEy@KΨ–δ¨Ϊ«OU陦φ3AΠHΛΞκ “λ6Qρ…₯0³γυυK{Π,&YGIξϋˆΫrϊΚΧΏϊQoD S7ήπΦ#p^βΆm¨ηιŽν %ΪεʍλεJl€09‘+4”ς·΄Χ¨ύC΄ωθrΔ” υ<₯‚‘’JσL{αΒӞα(Lf7Ίν ,'ݐQΨ‰xΟΆmΨχ‚5JNΈ\ώgμϋD½ό­Uœ­‘―†ϋ_ύ>ϋαŸβωŸWœ_θΛνΥόΗΑ‡}Λ욒P0t―kΤ₯KβrαxaY荐V―5+«‹ρg~κηπkΏφώ»ύλώkΫw|λΟώΟϊ»XΣτθ JΩρ]Ÿ©)™Μ¨jΎΦ*Ξ£ϊœ΄Μp9zοΗ!΄f3XšΌΧ₯ΌrRg΅Ϊ¦αr‘£CΗ˜Ό;hGΦ€rκŽ†οBi€œ„wŸx~zΖqž^Τd₯nΪ^lŠdkœ¦1JNtΙAωŒ3”- §dΞπΒLCf:σΔτή±ΖδRY»Ι>ˆ‡ …!F'eγ}°ξ½s"³€Ϋνξοω˜τ,Q μΎ©ί‚\σk> ŽΓ³1ΪhŽ222px½4*³`£&BΒλΛ /)½nχ»ηhΨΕjDgΖΒŽσpφήΣυŠ£ž*ψtŜπωΟ?φηΎ€γώŠϋyΰz}rŠΖψ¬žU©©Q\eπX&ΊήkŸX%YZF[Et—ω} ΄“y]2ϊ·Αe›C9Ž›άjTλΙπŒτεo|ω#» μ Xβ·p!ύΈ˜+]#ž €μΘj‘/ώ0­ΕDHdκ<Ζ μυπP¨ΕΝ₯ଧ»βΧ‚­–τςN¨5ι¦TxCN5ƒ›Uœή5¬ι£-“!CΎmΫd\šo?ζΔ Pι“‚ζργΡΎΌΕΛνΔ?ώ½†6&nΗ]—r€<+ψ2έˆ}eΥ8Υ);zλΨwςh²hφ=Άž΅‚_ω•_Ε/ύ/γΛΏJΩπΥ―τχw*€Ά’]Kpέ2ό‚pΧ6z2Ί°UΝφ{ݎΗλ‘Δz™ΰΠ½€gΡΊ]:ω7Τ‘1ΗΎ!(„ΘΘΉ΅vΗ”Qsγ@;ΟGjfXΈŸ'†TKmoΡΖ@]»’ιΖ3Ζ.ο’4όuεg­ΜCyγXί/,΄μη2J@ο ctΌΎϋ ηρŠώΰϋxχςžq]νIθ]c!yžΥΟ3“₯οeΗhh‡Άκ|0pκοƒο>•a΅6δΛl #GΤΩΠFεώ5‘;FŠn­Έμ» †Z«˜£α²_N™€-Vα~?|Lίώζή=ΨκΎσό΅φΪ{ŸϋΠIHB @<ΜΫΜΓψA°cΗ‰IμΔNμĝΙ8™žJg¦§SΣ5ύ˜I΅έIzͺkvΊ*qu’ξΚΔyΪqb·ΑΖ€1 ή’„$τΈΊχž³λ9ό~k+ξ±§ ζTQq@Ίχœ}φ^kύ~ΏοχσεάxοC>8;”Rj«Ιλtί“χiG0–ξρ²,I’žΧy‰ΆιΡƒmα]`„=?MΫB­\³κί$€βœiς&θμI8;μr`Odœ6m4šΥFμ(eΧeUUhš·|χEΑΊφΐ°Ίo¬δ‚TΌ[+>Zksς]ΚΑ’qσ ζI]‘`sEAΔSZt‘ϋ©Jl ¨*Κϊ˜˜˜@UQi]ιrΑμ„›]ΉD΄ΙZ™‰¦iζ¨1;7G [@3Κ:ΑχRΛMλ2λ«SΕ•z“)Ύ—xTEφΏLNN2r"r΄§ΐ―~ζ7Ζ‰wˆ/)%Ž=„γGe—’”Γ‘fU““ΤϊIζC†v¦Hΰ΄)ӏ[9μNO^Ιbˆͺ²‘nbb"Ÿ •TπI›”ϊο ΡS™_ΌB *o!Π #gΈΟ‰›=·MΖ Ό0ΎΟͺ*·|\τ\R"°'ΐεο<‘σSφX]–Ψ^1† νϊ.«"{cHzΚ€ΰDZ :ΙζHΟ|£[PjRξTΕ οΖ”bΎΏƒ'›εω؈K΄ϋ›qΑμœ‹“ξΟDg vσ‘Ψ΄θœΛ„ΣN œOBtαΚ£7Φdƒ2Νύ11¨αψύ*Εώ¬tX•"«“””Ψχμn<φΠύ8|δYπΪUπaGBc―ς\‹+]ΎΦtΨ‰ή£¬Jš3ΙΪ”aτœ—΅΄ζˆΛ(Λ‹zp.§ͺRL†gΡ9τMNa΅ Ν΄y1Ζηψβ”κθœη€'RNRUN€΄‘€υš’ΌeήdΫΟhΙ0H’>;LΤ5+4©•£oΑΎ'Aό3TΚΌ“&V’i&4²* 2αρ .LƒΗ€Σ1[ΕrŠύι©ιS€Ž‘έ±‚p!"€1Ρ‚r©uDežbΌC€Σh §„Π'¬r‚*6M“MŽŽwmk(’±¨KŠχ¬k”ƒš“ΟΖψr%dΞ πΜ_J’Ίc4Ζ`8šG@δ>dνqβδ€ΤΙ{ΐƒHΗύϋfΤ°ͺθLGΉά/₯΄J"άE …ζζ[LNMΡbfzΖLNNΰ’‹/‘lisM§₯žΕ‚Γ§‚w η!EΜ±±‰#–2„NmΐΚ«ΉΒPhF=Ό:ΣΓΗσ„ΐ‹žcΜ8έ#σR(ψ Π[ $"χQ8ω ϊΎC”6zu•ο»ΐ\ c‰1₯€β˜a ηzoΡy ‹€QίΒ"ΐΕΕϊύΰιyJžδθΰx`…ΊžΘζ=)¨­c?ΦΑ8]Uυeκ₯€ -“ ›uΣ]SλΆεk0ZHxλ K"Ο;φεΠ¦΅ ΣΒ“ΘZ“‘41Fxc‡=ϋ"¦ή8Λ½ωΊSš‘Ηόό|ώo–竃Τ$ΓvΊ`CDŒσPŠ1]—Ϋ’tΝ=bΠΊDkΦ•hێ«EZl½sdVs89j1;j„F„€*4Œq?ΟΑS+UxR•QBζZHDοAM©1N'‰=‚’œ P¨€ΐ£‰Ι š‘YΛ  (+YΒGId[ΊΚ4'΅$ήpΦϊFΠeΎ§΅©ͺtd‹‚DΊ*σ=Ρ[‹ή΄]ŸC₯ϊΎgΟΟ“6#ηBΆ5$YίΫ<Ο”’£¬η–o‹`e…ˆ"-Xž+$Χ“Ωi.QˆΞz’κrw ͺz‘%—‚ΞZ ΥααOΧtτ1ΓΜRΎƒHΜ'n(VΚ$oJRs€‰/€€ŒŒdHh6ίΡ?ώχιbθš†Zš“Β¦''PΧ Fˆ\Ωτ½Α ͺ²Ω,EˆzN/“R‘„pΤΠPΚ’]z:Ρ]³οΊρέX·v¦¦—-ΰ‹ΰT‘ ώcΘ\\πgr&ΎώυΏΕΎž…΄‘^qΩ5?² $Ήc³šMHζZ!oξ1–Θz(OζΎDM՝R.ΏϊΤƒ)lή΄ ‡FΗ-Θ;Ώρexn•βΊΘ‰ˆΞ9ΤU•Υ(‘₯œ!ΘBγW|•[°ή|ιy?|`Œο¦ #Ž-θΪ%{ŠR;φκkί…‰‰Ι1•gkΟ=΅‹c]j Ο“ͺ-Αξχ5kΧγ¬Νη`zω ,[Ά‚/όκΫs³'qςδ ΨƒΗvνΔμμI”hM=έΡh]T~XΩΫθd0³Έπ‚·αškoδΑbjλ μyv ξψκ—8α’Pα_K΅…θaΏ ”"hQα¦[nΕ²e+Nωόm3Β£ίΕC{a©‚Mƒω²ͺ²ίcωŠ5ΈζΊ[°ϊŒu§UΜMO/ΗkΟ\~ΥΫρ}ίπ>|χή;qδπΛ(΅Ξœ§Ύο11ArΡ¦iIο―θ0eΌΐ;»Ÿψδgmϊ»˜™9ž³ VM­Γ­ψiάxΣ{9τKœfξEονΚ+߁™™γΈηž;πΛΟ£ο{bJ15 w8ε9₯€ΐΕ_ŽK.Ήό5?5βξoώ-­Α«Gα¦[~·}ΰ§Pσ!u©Χš5λςΒχΎ[?ˆ£―Ζ·Ώυ5<ψΐݘ›ŸƒR«W­DΧw$QvZΨΘΜΆdV]0s–ζ,‰ LL `z›Χ–Τβχμ-+Έ;±0/§,©uO{ΚS¬vQ`n4Ddi΅”Jš.ΝW|ˆ(΄BίY^§$[’’yΓ*svγΤM‘‘5©­(„Θί…Τ,Ή½˜a¨JΫηΠ!·VΛ²„pJ±°'ziΣΌ ΅L/θt‘‘6­iΎͺЍ“Ρ"Δƒƒ;Β[Ϊ‘-Γ€”Π}pDTτί’ΰtC•/FΠWFd<@Α³Œdφ!@aΤΛ2›QCNo% œCY3κ˜]΅BFDαα\O!σAfΚp© ¨R£eh’ΙI̟œ‡σBh[~VεΏύΩίΕωΫ/xΓλαpˆC‡ ƒεˆλx±ωQ½BŒπI#c>m U°8!"z‹(i#%(Α‡€(HRωθqΞΉηŸς³‹Bγάσ.ΒΎ½ΟπF/!₯†σ”2Υ۞buU(€JΓeΔΉΫ/Je.…ΫΞ½Ίž@g-zη2Ά:©T£ξ­± ώ€οΌν[191΅ha››Eί5΄Y”s˜$Κ’N|υ`€λo|?Φ­?‹Nκ?p‹~ζυ7Ό—_y-ΎφΥΏΐέw}²sΌΓΔΕ1§™_Ϋ†’t‰Ξ9<στ8τΚKXΏqσk~.gδ‚ͺωK.½?ϋ‰OcŊU?ΤΑaυκ5ψΠ‡>Šφα+χ%ΚξpŽ271ΥRΒ_ш Κ…j""ΊΞβͺknΖOέώq,_Ύβ‡j₯*₯pζϊψΨΗ nΊε6|ρΟ>σtY£PZγhя¦£ΉC5θ{"G.{>§r,qˆΝhD^FΨ@τΖBσ,²πˆ;gα,|=φΘΞ1Ϋ;TeΕ³ƒ€€•«Φΰ½·}λ7nω‘6ΧΎ&&&qϋG?…Oύ“FΡœBmΫyδ!Γξ‹/ΒΙΩΉ%ž1ή9άςήβSŸώŸ~¨ΝγΤMΎΐ9眏ŸώΘ'!δΨΣ4-oΖD­&sc8=ιΐ9|δφOβ>ω+?Τζ±Τf²aΓYψΏωαΦϋIΜΞΝ‘ν:4M €ΠώΥ BΫΆ°–HžΞ³©7¬,DΆ.ŒF#xΞ9GpΎmˆιYζ³rΥςwUhΎ£vfY•YπD)N …©y― !077?Ύχ8–ΆΤT½\t=κͺ&’nί1Lp&’Ο`ΟA= <‹€ŠΔFγ{s4"οZ ¦wœ3€2 Φ9ήτ°Φ`4?‚L=Ι²½ΘΩΰ}grož ƒ2*λzΐd\^$ΨEžδœΦZLNMΰμ-›‘ΛeY‘žΐ%5’/ٜδg9γΈ’]Ξdwkj‘.Ρ’l.cY žώ/΅!kΆ τHΎτz0 ^U‡©·PZ³†₯o„Xξ™ F›5–œͺ οKΧsF—>τώγβ‹.yΣλ'ž|μWύ΅ΧΎσG:ΣjiώUΘ"€Œ±Δ”ͺJH’Δ±œΊ7Rζp8Δ‘C‡ρτS/ϊωμΈdά[/ ΜΝϳَώήτ(4$G'€ugžEΜ©Σ,0goΫN}l6³:ο(”‰(–1Ϊ}gΠ·ζζfqΕUΧ-ϊY]ΧβΡG`Ή)-N}ίgΰž.+Όϋ֏`ωig:υuhšF£!šf„ΆmXΖ»τλͺ«ίO}ϊΧΗΘ)3p4)o‚˜ƒ,‹Eν«ό»Cΐ;.Γ?τΣ K~―ΞYφ,Έπ>ΨtΦόάΟόbΞ›Πe‰Θl%Σw|0 ‹ ιuλmΑΝ·Ό=?§ΏV}ίe‰ώλš]ΛŸψωOγΆΏ²TœΓΜΙ“pŽIΈJ’λZ΄m‹Q3bjπX₯Όη :IφͺΊ€°1N*$TΜΚΑ‰ΑϊŽΎ²’TΗΤIjΐQΓίoD6sƞοiGυfΤB%%9ΖΘΥ‚DΧv°ΦηΓ[U•πžΤr£!Ž@•ΉΉωΈEώ’£vλš…PsΓ!ΊG3jˆΠΐξ㠊’άϊi.δΨ]JΓ(„TcB,ŸΦϋήdκ#a¨?¨Ψ}žζ)Α,bί)! (άtÍψβύ8ξΓ₯Τ<;:Σ°Υ{o= ΖFΝ8iλΖ`AΟJ•$;ΉΗMΪρ‰‰ Φ/8ˆ PVšck‰Τͺ5 ΟΘZ@…ΰ"œL /*Ηͺ₯m‰oΥχ6W-£Ξ@Ζv°ΦβςΛ.SέΰίΌλNtΖ’Φ$γ½ξΧγGύ’y’*ΘΛ8uRyη!΄\ΞhΠj: LNMαδΙYμέ»ξΈτ”Mqrr ;.Ύϋχ=ΝΖ.’.Zλ191YP5’€„•ήœΉ~Σλ~›6ŸM’ !xψLτh"Π¦$E!œκz›6Ÿ½θη>t33'P•%Œ΅4ΐvNο»ι½?z0±δ{8πΒ><φθƒ8~μζζNB₯ ₯±lΕ*lΫΊΧ^wκzρβ~Ε•Χβ{^…Ηv=H|v6·ΝB*LMMBλ mΫΏΞQ]βW~υ7PΥυ)zvξ$ώώNμέ»σ’ƒΦ­=[·ƒKίve2Όφ΅eσ6άrσϋρw_ϋkD–‹₯FπMΫ‘Τ:{°^»©ίςξ[—όΞ|β1<²λaΌzδ0ŽΌzZ—Π…Ζg¬Ε¦Ν›ρŽwΌkOΣΖBΰCϊi?v >όaδ₯z­=J&=k–λΑ$ {BΖG²f]π Γ΄.Ι§…"ƒ¨#±QŒΊ¬.%$δά–|Θ%©Ι‚€([#Αb«ήӁ΅, HτA‘Λ¬\’|ہΜβ’σ{\€„ΙΔΝ“R’0–fƒΊΰη”:9R}η ‹* žΪ(@7u2%ƘΓ`KΧwŠΙεž26 Ηͺ€€(ˆ1b0°Ί!ΏH(ImۏΓh”"^JΒHkM –@κ @bφδƒŠI«Τ’›Yυ@tηl¦bR†‰FΧ48‚ ή΄…Ίλ:<ΎϋqΤυD XΎ|6/±¨ύ΄Ό¬€cΣRo2έ5HBw€έι‘«V!Uζλ3'ga­Γή=O“:ξ5­’›ήυ><ϊΨχ0(+xΦΠ‹‚7#QU4xμŒA]U8oϋΕ―ϋ–W­^ƒυ6α•—Œ«(ΦξGF‰ Aχά­·~e5±d₯wπε—_Ξ”αšs«½χΨqαΫ°fνϊ%«–»ΎωUμΫσtφxPό/ω0`-žίχ*<,v>p>ώ ΏŠM›Nύž•RψΤ/ύώνΏΪƒWΝ4ίoLΓUUητkΎ4|κ?ƒ©©ι ‹{ξώώλŸό>ΪΆ! €² xη}uχί…―~ωKψ™Ÿϋ%\pΑΧψςΛΑ=ίωζηη‚…χ–¨ΏΙOuš’¨ͺNέȞ}φ)όΥ_ώ)vήmΊΚ 0%‹Œ‰ΧΊΐοώwρ‘Ϋ?όψ‡±aΓYKV"?ϋ³ŸΔ3O?Η_HΆ ’*=Ω”Φ΅#hŽ’MρΙ=;λΑ`ά αV• ]ίf%I)*7„˜Υž€`ΎηqOΝ›x©5Α4yT@FΑν$ƒ‚ηΡΙ“D’’1ΔŒΝ‚„‘O*0η}n‡ε™5W‡it "1ΌdV:FxgqΕeWαρέOb4lx†γ07;‹ε«–ΡH"0* ©3δTΧvθR$ΈuΩΕBfκ"QδΈB„±}–ύ’‘Wΐ8‹ο=τ}ŒFCϊ;l‚Υe‰ΎλΡ΅δψ&™ΓνJqžΆΌΙ€Α£&‚n “ ZιL§L,ΗΈ€dλ'ž–dΚ,W”-DΉΙƒ£ s\ΘCΜαφŠ+ !¦£3έ€TΊIΌ‡ϋP]©ƒΑDφ’€‡Β;kˆ[pz_ο ©‹ 091Mν+FΌ€]z8?byςρΝz½όςΛΉο-Ιw—jό£ϋ@Bΐάhγ,€–δ‘0Ζ;„  Λ±πΤV֏± f₯πAHά{ο·W «VcΕΚ3 tΞZκ«KL);VΑXk±γ’+–πͺ,ξ៻}κΑ€\ώύκ‡RΞXξωί°qΡί?zτžyζqτΖ ψ€3'iΈθ,ΆmΏdΙ6Ο£»vβΘ‘ƒl «ψD.ˆΠ+$=ˆ9;xͺXώτΏώΑ’ν™K.½Œ( Ζρ3IU΄1€΄‘Jœv氐%χΕ/~χχnTU…ΐQ₯….Ρ6œθŒΕ°khqγ ξŽ;Ύ‚ύϋχ,ω³―Έόjn₯F”GΘBC-½,-Θψοίψ*ώί/}'fgΡφ i΅Œξg7Ώλ½0ΞΑXlπˆŽζρ[Ÿύ—ΨΉσ»KώŽ .Έƒ‰ε$ε­kxžu]ŸΓ’œ₯™fΧtΠJΠRΓ³ X@p –ΰΉNΰ 0ΊͺsW$ΝjΛ²„.ze%ƒͺ²‚ι-„ “ H‘UΧ5o`!‘ŸψΠ•ψU 0™XWS)*Z0V^#FΑΨ$E3_©`zΗ±Ω”ΩΆΕC‹‚AΆΰK@ΐ™ηθ:y^Χ{cΡ‰‚Η)§<ρŒ˜šΟC•d°£vUȈφͺ(̎‡Z…Φ$ Sγθiα,αMŽε}jΞ•ˆž†κΙ/@ξX—y5‰wEΠ1•σΤ€.ΛΨkwsή³. +š$ωQ|κ £“HύC¦χ¦ΉΗpΨ Τ €ΖHXhc lοή΄E:„€'žΨ‡ϊ]ία‚σ/ψ‘ΠΣ4˜P΅j)]Mj•«΅ΎνQjMm(³oΗG#ͺHRαξ[΄ μΈθβf9ΟδΤ:£ΩŒ*¬^½Έ όζ76σ‚ςlej “S+˜ΆΛ­6u΄pϊ01΅_#ƒ€]?HΰΒ9ο†NΖ]ίγ¬Ν[}7mΫΰ±];³’%ΙiCDlz‡Tf…ωΉΩόsxκΙέ‹ήΗ€(²1«!=WϊŠΩ[―·`ΐCί_ως—ς’‘H¬™;ϋ#ζ;8·mηώξοjΙϋΪ5gbΥΚU„'‰ͺpΖφυί{χ>‹/ύω3h‘p0 ˆD.ψΒοG|㎯“bˆ»#Ζ:BΦp%ϊ…όqβΔρE?»ψ™ύ[ϋ•*°ϊŒ΅‹f‡½Œ£―^΄ œ}φΉpΞRf—#ε8ό'ε €Όρdh’~EνE1ލ§„Ό r UΚQͺΰ?―y€Ώ {"ΌyΘ«―Εώύϋ2>|ΫΦs±ώΜ o‰ $΅£tAΧάg2ωhHΊzΏŽSΪΆΓ¨i’ΐ¨iΠκΥΞΞΝΰΘ‘#KΚDW¬\M ηιΤ<¦¦¦²ν’‹/_4€F˜=‰ž_τ3ίvΩU|`!’mšρ%¬nΧuΈςŠkύ½¦ipπ₯ύπŽψ@RHœ8q'Ož„΅_ύλ?ΕίεΟπ½ξΖώηŸΕΙ“'pψ΅΄&¨!8"Υ‡€ΐ™žiΉ1o(i#9zτΘ’Υ΅λΦ“ŸccΣfž2Ν_ουψγ»pτθ!–wΆθlŸ«Žή6jŠΈaΖ΄]›#¬…ˆ8qβΨ’Θ•+V!¨ m[ρPQ§+ˆΩυ0Fν$φuB* κΟ#=’§,‚BI<™œλͺβxk~‡½²δ@ύŠΛίΣΎ¬‘6ŽγlŒ¦λ§hzφ–³qΑ…;8€ŽζΎeY2B'dυ)A-$’’•ώ1½5䫨ƒ¬B μwKςo€ΪΌΞc09 ©4ΕV—dωΪ9OΥ»c¨+™}Ζ3IΞ‘‘ͺΘQΓαgFœ©Ξ>ΉΘΓ\±ΖπDŒ¨ ¬ͺUΚœYί±E‚I―€()IΠR±˜Lƒ’PΙ^p†EcK"ε8Pf±’α’ρcΔEpN2Ί:Bp *4B΄Μϊw(*VFqτ§ζ`(<ΐEFrΕGNKο)Ε;ϊΰsΆŒ2§‹y8<‡>kˆΜAΊDΫ4DΎEuU’m $(ΙΜΆΦ8ψΑ¬o‚I2J͏†oΪ"ύύ‡ΎΗρ°$ |ϋUΧα-Π½βSΏΜΥeΚo¨ͺŠτβΞ018Έ-Wk”νb„,t]Βψ€Ά§JεΞ;Ώ†‹/>Q―u‰K.ΎOμ~BΠέ±Œ"8Kήvυ’χχμ3»a­Αύ{πφko8εΏm;η|”Υss³ΉζyhYθkΧ¬Ητ²e‹~ζσΟοΑ‰γGΉOΥΦΚε+1κ8οqδπAœ˜yφ? !"’`qˆJπœˆβˆγΐ₯T!я¨‚θZ ο(`jjšιKH˜ͺͺ’Vpy,…„ΰƒΔιεΧφη₯Ι#€Ρχ  ,₯$ &h»ΰ8εŽξw<”σθΫ^|7nBΫ΅8rδφΏ°O?»σΓy2΅‡'ž{ŠZRΦ/ωbŒψώÐΒΞ{TA%š…€1œŸΒ&·zP³ ›8’Ϊ’λZάϋoγcύΔ"υΪΩ[ΆβΫwžYxQLjόΨ­οΗΎηŸΓΑWQχΓ¨Κ/ΨΌψ€.2MœNι –ƒΦΩ1ζ]₯Π΄i[27OηJΝΝczJ“j4%_ςϋ©&¦} zd‹₯9[] `Y阌€%ΗΜ&!”₯X±|G^=‘u\B nŒcΙ°Κ5…£₯”I!8―%Π¦EΰM21λ’‚1…±„«š7’jC'1‰ˆ²€@ψ(RiVψq.G ]‰Œ{Φ2ε,'s–d‹©?ΫΆ-ύv©;Gς`₯Bφv$tTς€΅Φ…FίwLLd9^ƈAU‘7… “U!ŠL%$|Μii©'95/ηpΦBdΕQ£YC~ο…~σ†θ?ό&''Ρt€RΈβς«pڕὉ9,¨ͺͺmš6s!(»ŠΔ9γΑjyOΨί{ο·π«Ώϊλ§H;•RΨΎ}{τ{πΦ£P$· ΚͺΔΚUk099΅ψ”½ϋϋˆΨ·ο4Νθ’W\yξώφί‘ν {|ΐ!E6n9εΟ§Χ·οϊzλ1(%J­Ρ‹ΛWΰΨΜρ|Ÿ«Β³UhφjPfƒ*°ΣAu=₯4tQaΩτ2L-›Ζ«ΧbνΪυXwζ†Μ[ΚΙN˜Œ.C-“4ސχφ΄²Ω^ΐώύϋP–UVυhMrwkΚA͈:­‚»EA$”E‘qύwα‘οί]—˜Ξs,­eΉ6-Š 2™ —ͺbή΅“ι Ά£sQHΈŽTmNI©ΰ£GΧv€B6ΚΙHτ^ο΄ΠΈλo,Ϊ@`υgpœ΅³M0ΈβŠ+qΫϋ/<ˆίό lΫς‘ΒabPC’°ξQ`b0@oI­Χuδ­HTπ”θΪpNV%»ΰΩ€j Q‹…ˆ΄ήLMN’Ρ‘₯ο{ΘH"ZK rΞ;G8y>τ'ωnŠŽˆPRΐ»uUBIΒK$ uΔδΔ$V\‰ύ/μΟΗΔlλ».› `KIς(΄†ι{Nbτ&;{’ο- …‘P{Ž2T ͺ³γα·GJΖ£6aΥΟUΘΉ˜%ωYΞ[W5ΪHdΜΤw“Š.X)©vά*ς Ω㏽罸γ›ί"ωfIaςΉ—¨ΝTs«ibbR²Π;­”‚,αΆ υ?EAŸ3=°δ%uΜ8P&B¦Γ‡%•>oΔ«iΌτKd «+”Zcυ«ρVyι’`[-ώIΎ¨u‘Kμ²ͺΰeV(~“I­½α‘Ί5πŽ«#žzκ \~ωU§όν睏ωαƒ’ ½!^–w7“c~*₯ζζNB ΚKxlΧχρŽλo>eΩvΞyΈο;Ež)P;‹2ΨΟ;οόS.  ρτ“σ`4@XͺˆŸρ’§όmž'h]ΐ:Cͺο`œΕΊ•°uλωΨ΄y¦§–a0 'ύh>†Hl·–”"§œ£…ώ4―/Ύ7:Ŝ› •Φšqλœ@θz”:δ&D sΞ’„Ο±¨₯.Q†Γo’Δ«sœΓρΪΧώφeͺ’θΰ–²C| ­CͺTΡ°ήζΔDΣSGUUΡγιgŸΔόό¦§O­ 7mΪL›Œ¦M½¬4Ž9„£G_ΒsO?Ρ° •Βόά“ΣSτ2Eƒd΅ΕBπσοΌ‡ΤγP;!$Ν8prn–θΊbj2΅G ­ΡŽZΤƒ:g%#6Ω)˜.ΘBθtqJ ^†+nU9η`\€/zBjxΫlΈ–B`ζδ ζζζ²0)ΝošΡ(££θ0BΕbRͺF6<&‰Oy9ΙΥΨ@H—€Θ:hγ(ΣγŠH~ ΑYΘeQ J Bs&Hd=Ε3ϊŽOτ>²Αoœ=άχf Iδ !ω,Š’Θy#iπ έ@ϋφξΕΆ­[°χωύΩ”Sh=ήHΈ’*t9ŽβPOLp¦;yPͺΊΜAM¦λΈΗκrΞ‚€@Ϋφ³( ˆ$#u–ƒ©ήœΘάό^>ψR–EN―^† λ7Ύe6ξζ‘ͺjXG^’ ‘Έγφ"IU9„+Π&άv’ ŒΊ‘I_¨»v=‚Λ.»ς”φ9ηœ‹eΛW  '(RYλMΫcλΆσ »ΨG‘κρΐηqΝ΅7δΆn;1P?”uLδ ΧΏσ]‹>ο‹žΗΙc‡U ”ˆ\κDNB²g "bΥͺ•Ψvξ\tΡeXΉκŒ7Ξ‡#:c)^Y)D tμKΠK°»RϋβπαΓLOOB©‚T‹Μ«ͺ mίgytΦΚΤ΅ΚΕdΚϊFΑΟ1ΓΡuΤO—$š°žͺŠ₯*’—^~mΫ“0‚σΝEΑΩ&BΒ»₯4d°€άc1Ι8υ”rW ήφtπ ―ΎzdΡ²ζŒ΅Δε‹Šυ8xpΏωΏ&1ϊ€ΐττr¦Υ–h™qΡtQ g{8ϊ,Δ<8>ΐ›‘θƒAMΎ“Dο”0¬Σu™γ­£’0Ζ‘+˜pŒ !@W5‰OΠςό!Ι}“)Θ –λ€’\†"ΐΈ|η§,V$γ ΣYDιJζρq†ΠΆ-ͺŠZˆ9ΛιvqόΠK‰ͺΗZΰ„ffVJς‘’& pG₯d‰―wŽΫ ψUiH©Š"+Ή2nεΒ©εR"χΥ—o)_ύΉ}ϋπς+‡ Jš‡€c¦˜₯vS€…&˜ZUq‰F@:­5 ™8"5½7ΟζpΏišL?υ¬ήH;ΏυφMY gNΜ`~8ψ|‰m[Άarrς-³Π@Žs—]ΰϋCρχFPΗLulΐτΦ/ήΜΨ1œ©°λΡ‡Ψ½»Pu€pέ΅7’i:ͺ|™ΐpΡΕ—/z_ϋχοΙ$XĈ#GRςΰ)“3°α¬-džλΊά~Ϋ΄yΦ¬Y»θσn;g+Όςr ގ£,j8Ζ•ΪΐδΤ2άςžαcρΞήσ†n©Šl$·².Σ3pϊωΗ‘#”"9‘ƒΊk»¬Ίjš†₯Αžσ0Εκ"MΦΪ1B|A΄+υΩ‰Φu‡ΕS-Έ:]€ΐjB 1Ž#m ž½΄@φ°Ζζ™#Uw%.IΕƒ~Γ­τB ΜΜΜ,ϊ]““Sθ»–™WL™>=œœ hΪ–i»iφHΐLΚo—ΔU’™)·#^ΞHΕ󿈾﹡›Μ€=bˆάΤ‘­Έiš’ {ϊœo¦cΪ9eΰrΈGžύΌaΔ\$R7y‹6oΨ„χή| ©ΔFꝣΠ=φš€0ΑΠζyήJ·q’! XFβ¦BάΫ2”žoΔUΘZΟGδ„«TH,ω’EΜς:ΣS9ky!NyΗ}7Žκb|(BδΨH’Π…K@2±ΰΟΙB‘K2`fυΖrή3r?7 Βτ=1hx‘³†nŽJk”ZΑυ4žΎο‰~Ή`p YΝxs£χθ,ml2Ύ9 ¬~ΗΧ³t΄ο;άrΛ{π–zqɝςΛΩZ‹²,ΰE§vcγ“Ο†9`~nDύθΈι^|qffNΰΜ3OŁ\wέMΈϋžoΐ:‹ΙΑR\zΕu‹8JΖ<χά“ΉLŠ8~ό(^=rgo=η”?ϋήχ}O=υ8J!Έώϊ[–τΩ;zΖR‹‘7μT%b€YΠ`b³ssΈϊšpλm?‰©ιe?Τ%m›ŽŸ8†Ω“'13s£f„Ι‰i\wύ‹>'mT1ϋR+•’άi7ύ—_>ΐ67Ž_U’žιΒEAνηΑ€\T…hMθρ„>B„Β'ΈΌσˆœ"•‚*—žΫum ηq;V>Ί*3§,5œυ˜žžΖhΤΒΉˆwήτ|ψ§>~ZΊ, ‡s˜Εα#/γΰΛπβ‹ϋqbζœ΅˜›ƒΦ:O―ΌϊxΗυ7,6rͺψqη<&'&1ŽNϋF ΄*αΰα]  AΝτκαχΉίΕδδ$¬1X»D ςψρc˜˜œζ ;“ Ή7†L˜mΆmΡ0ζ]$ήίΙM‡m‘[H! lŒ1 κ|ΟSL­‚ΚΊBYy3+«Š+oΛyπ*_w\6†™ό‘3 $΅κ€Ή}˜5ΩxΝ›m]ΧlΏ 5[:”ZKk¬’΄™J)ΙnzNcy% }`δgί ;G)ΩO“9D'νZ†`l/2ΜNp™dM2 Qe@P1Bo§;aD’o@IΆορΕφ'π|*]ΨM}ΐBYE#•ΜΑP„HαπŽ*,N3)I6ηœƒ³&;‘₯$§gΟ ΊΈ Κ³›΄ηœv ­ hϋ.WY©¬υœσ\E>uΏ‘―ηφμ‘θ§8Π‹.ΑΔ όΗv’K6Ό f„…ΰ‰ρΓx”' €„ι)_BEŽ™έΌi3V­\•ρ4}o`ŒΕργGρΚ+iω―Όκjv\+L/[™£MΣk~~/ΌΈ©˜˜Œ4IΓΥS½5.½τ2Τ5΅P֯߈իΟx£½Γ£ξ‚„“Xšκ}ΐ¨i091@QΈυΆŸX’SΦ4#άyηWρΗόŸ°{χC˜Σ뺱ØωlΦP&·ηŒ DpΰXΪ‡Γ-fΙ3Dο<‹IΤiΕήΤς‘ΦE3jΰ\`ƒ ™Η¬±hš‡©I₯Π4mŽ~mF-„ X‘ZΙι@ͺΉ=#Ω±=Τ‹2dέ ­ ΄M‹Ά#Uf]+¬,i#U…Κέ‹” Ϊ6-³»ͺR’ΐ™ίΓΊu‹Γ֎Όz„ή'ΟdS«Ν g-†£Q¦2s­ΗόpΘsήXt½ιΙxH9I‘‰%«³ WaΦΊ±Δ—Ρ'$rŒRς|]c¬| Ό‘τά{O‹uΧt92ZrΐŸd”g3―g€­T)«ž ƒLσ0,PJωOeIFΡΤIι΅R( ~σώ‰<ίqž@Ή΄–ΙeΚ/!E¦!”:Α΅ˆβH% ‘¬ιrŠWβ YλsO— .F XλJFΔ£ΗŽΓ(E5„ˆά–²<UJΑ˜žτ‘B BΘκ,Q(Ae’P’`Šμ–M}χ²ͺ¨I&DП₯@λ ¦³LΧνs5D‹Dδα•£T„ΜύΑS2ΐί0uSΔ‘#G(υ¬’“Μyηn?EAτ–’Η@@­OjC‘ –T5ŒΕ@Ϋu€JyΞŽe»σsC ηGR£ν(’@Σu8tψΠ’ίωφk‡Ζy\wέΝ‹N΅333hF#„ Π5=Œqˆ‚AƒΦ«5―λΏ 3σ³hϊοyߏ/žK΄ ža/Zk€@kzΰ}D©+DΉyύ†³°ύό —hXόΕ_όyδ~:ΐΨ1ε:xzp•@LσCK!$Φ9sΙΌŒΐHΣYnΑ°½yέ`*ΑL§D’J 0+ΙZς((Aσ€vΤ‘¬](^XΙ›aΨ έv„±™›₯V­ssσσθ­…(+¦ <‘œhήΥ™½·Ω”`œ‡ Ζ[4m‡ήηθη„˜³Υ)ζ67mŒΕ»o|ΟgΆ’_Ο»1Τ–ŠE(ˆΖx·KlΕͺͺ#?|„%-sΰ¬ ZD0™ΐ„iAMν/¨O,€`ŒΘ&D)pΚ`Ω…˜ί"•βB°"+ΐYr„η3…’ςJ0Ά —‰¬J›CπaŒξζΌΰιx Χe4DπΔ“‰\ς₯°yκ=ϋ1–ΩϋEŠ‘7Bέτΰƒ;Ρ›RH4Ν_| ήj―ΔνιϊžΪœ`'₯ΚQœ}ίSjžˆ˜›fόͺLŽ;ŠWΝJ«Δ[λ;ƒ―}ν«‹œυ°yΣ6h­ρŽwά΄Έ}υτn(Ζm[Kˆυ¦m"tΎ{ί7mψ6œ…¨vΥ•Χ,1Sy3'OπM§Χ€£eƒ'γά;oXZδpΟ=wβΰΑΩί€”DΫΆYέ"$΅I€Rœ2η8ν2’m¬ί°ώ4Σ pžHΘj ςΖ}šss΄χΆGoz4mΑ€ΒήζΎ3Φ9nλڜ Aˆ˜ν`Œ#…TΟ¦P9ͺd¬e³›ζΚr)―7_K^ΈŒ1 Γ]ς;€V^oH”‘rW’ϊH|ω+wΰ»χ?ŸϊπνK~ξΓ‡³zͺΘ³Έt―€ηΨτ]Χ‘mی-Gd~_ Jcπ‘u€bΰ ™CeAνS]KPk šκ™hlευ2)έh†TΥ5Œ14, T Ψ A ¨Θ³p›*UeΘ•›*™D…δŒ$‘ο‘Ί¦<'η©}Υ[ƒηφμAoYaΚΎ6Η€dθNΘϋTu‡ΰ!ϋΎgΕ•βˆF n Lθ 1 ΅9ƒoΟΣzοB^hΙ@YιIΖGύnΟm§0nε φΘ³ ꁦέ9Ι>©'NΠΓΤsNY Ζ@MŠ1I$Γχ$SVEŠΤΤ¬Ξ  Y#x2\e’pΪΠ"ςΐ7iΞiξ‚,KLύ >°{ω­@ξ½οn:‘†€•+VαΒ .|Λm Ι˜δœI†Ψ2„Ξ9Ί/Œ₯E*DŸαp„q§H€ͺ*³Q)?₯ψΞ}χ`fζΔ’Mλ·]‰·. "ςήaηΞ{2υ9ω‚§Γ‡ΔΛ/XԊ{ο{~[Ξ>““‹Ϋ„υΧ_Šε+ ο=αΈAͺ«TΞχ½Αφν‹Ώ#czμΩσ4·”ΈΒwl@eφ–ΰ{΄ο;΄m“#S‰‚ZΰΒ .Zz#ΰStRφP['@βu… (HΥ`ΘJ§L *o4ŽŸ]Λ½Ύ§ά ηQmkήv=U›†Ϊ!½εŸ˜”‘±τϋΉκŠ«rkM ™ΝΉyx-ξ:¨ΙxG‡SEΚNκβͺΧ­[sΟΫΎδχπΠΓ"Κ—R‘Z“Χ·΄Fδϋ¬(ΰx±lš–"z{ϊŒ)$DŸySήzθr,|°ό>=Ορ,―W)6ΖΓ'%«η*2Λ‰•Κ’§¬ΌL*„Θιτ€@/υ4x²\η`œγV“䔀'γΝH|@΄Ρ3ΩΦ{Bh§\tt"υυe₯ΉόNXλh°<•Q½!˜c£b{€™Kςhž[žηΔ1œ›η–\Ÿ/ΑΟ νHζŒΛΉμιδκΈjš†’sίΰ δΙ§žΔόp.π­†C IDATŸ2―Ίκš_Nε7ϋ•θ€–O2©eI=c‹Ύ·˜Žψ&¦ΆUg,g«8@J8OŠ-₯θ+™Ÿ–\έ?ςπ’Εώάs·γΌσ.\4kxι₯hΫ&KΟΊŠBρΐ»’ΐ£>Όh#άΎύœ³mϋ"|Ι+―Δξݏc4R€YgP–VŠQ€ΠKFΨzοqrf†)³‚gŒz‘Š{β1oNΦsεωT|γο{ݐ,οBž?H5XkΫ§e™π3@ΘσCΙm*Ύ30ΖΓ»ΘΟ>…^Ί/‹’‘{”΅έšŽ””Ιm;β3)©rΕE,©₯_η{v\x1в€l k‘t(T9€PΞEz’JΥs%  ϊmΫΰφΫ?Άδ}vv=Ά Ξ“*4΅dŒqˆAΒہΑ X` ­9Ԋ£λΥre2œ’λZx0޲*Ι—Ϋ€©’I$gΝΌx.‘G:H[>ϋ@Q²}ΧηΘhΣχ`1zC]Γ›sΜκu%‚ΉdβΈsT5Κ’ vWoBPfOY•ˆ>SJ”šc{5e<₯ΩZ’τϊΤ‚K枴0F^΄Sώ†υIΦE‹d“ηώi@€Ε#τ|ΊJU€Φš§ψΙ‡CƒpΗ»}RšΟΥ { ‰·|μ§ΈRpΞBͺ‚?xΕΓ@6*%:,㨉―οNiA块νMδ–y–“Ϊ]SΣΣ°†~—gSedΧ©ζ¬βΊί”\Žϋξϋ&'¦²ςζoΖ[ρε½GΣ4(TΑ,"ϊιJ£iZtΜi2Œ™Nθ Εjη#—Εd2σ—>‘ǞηžΛ°ΈτΪ²ωl\~Ω―ΉφϋφναφXO4TkQsCˆ°Μzκι'aμ©›ώφνηγšk]ΒΡώ¬£‘) 'HξyΈή΄”4—Β}–¨Σα‘f?Νz& !Ρυ]π³άZ‘¨SΈνΆΎŽˆAQ{)x4mKΧΎΤ|Ογτχ¦<˜N§M:\%£°δƒœb—cƒmϊbŒ˜Ωο£ΡuιαœaΙ| ₯¨$8k\œ^ŒρkΏόk˜š˜Fˆ –μ{κ¦ZyŸθΙ)‘p‹νΖnΑΟότΗ–όώη†Ρ¨Aπ ‰n ΉXj#i]’ˆ@+?ϊg εΡτ=šf”[ο¬aθcΜν:j=vήεvΏaA©9GΓΊƒαp΄ˆΔ#Υ+yA<xc!:FBΥ5q λͺΎτΤJ§ͺ@f!Rκ’(₯²Jο΅²γΎ£τJΙ±ΑΙmžƒίP“pH*ZHZ8χ΄ E4Ζ”(UΕ*¨žO)Y U t—ίT’χ™jΈ•)Ώ¬WNή ςŽΌM9μΘ₯?8=†q)Γμ–w¬"9#ŜΖάΓ3}<<χ“œΤY:58gܜΖ̞œεAYΘ¦­”Eœ*ΒΎΔ1«o„4Φβ‰'Ÿ «œΆl9ϋ-Ή€ήqΧχˆhΪfΜ½ΩkαcΰY ™8‡Γe²XŠGφ πώ %“rhξύΞέT9,xmάΈ ηŸΡk6³€'žάΕ§Έ€ηΣΟοΊΓΫ.»‚]κΟ‘kΫE.ελήρΞEŸoχ#x:ΡušD _“<Ξ[μέχά’kTΧΞ>ϋΒ‘7-·‰Υ1 ηB’]•%‚wψωŸe¬]³ξυΎŠ;e eš!γXœΆe΅Σ‘K&'WzκΙ§TQ₯ιΐ¦5ω_fΥv=Ϊ΄ZR)₯JΏk G#Tu…fD•ϊλ!V―Z_Μ?£dΠ’ΐδΤ$¬qΩi­Š‚b¨#Ÿ’K η<ƒ|ˆ8χœσπ―Υo-ΩN>rδ0ΎφυΏ§άxŽ_ξΉ:H(€e‡:‡ΚEVr¦D—eEχ₯ —Ϊς`u’χf–¬pΪ¦Ν΅Dc¦j©*+ZΰynΫ2^^ ]ίεyEUUy [Ύ|YVPΊΰ΅Χη“kωώΒχ»±&wZΪ¦Νχ…`!GrώρQ2B’ΈJλ"·Ύ’CJΖ?K¦₯Žš]o`S†±‘(ΓΆ§‡Η³)faΥ–.ΜψHρ 7•Tž”aΓ]°Š$°²*εˆ8O*!%bζθϋr  U:…P‘ψΑ η΅—άš " ’S:ΊQ<ο°!ŽσF"{EOλΙ*»γ3‡‡7²½47?‡ƒ‚ DΠ\»vΝ[rIΪs­IΊ(…ΜCυ˜£jSφm³iHj ’SŸU±OσɈ/x―]œςZΦSΣ6xφΉ§©ΏŸ76“}GΖZμ~ς1DŒF#<φΨΓKž„_λhΚWώ–•‰ΦZ΄]Η³9 ηh±L,¨]|o‰9‘ΔM7Ύu5@Ο­k,ίηcoS΄τ=ΊΎΗΟ~ό—qΥ•oH ZH=|Iq¦>žΆ…•R‹Bg9o’| )pΥUWeLMR_y²GG ŠΌNΈ!₯ ΊΦ!b4’π5ΗΎ’"ͺΊ'%ΎΞλ’‹/ΑΏϋWŸΓ¦›ΩΘ¨hΑ€‹6€Ήjœ(Λ£ΡώΰνψΒ翈ի—ήυνoγΘ‘#,;f•QQ€Θ₯ 2τ-_>«―ΈŒ+.κ†Ϋήΐ ‚D !l€3dΔ€ΕTδμρJW0ωc*ήx‰ί&­i)Ρ•!UœI+…`κ­Μ"Λ–/G=¨y賈詉›f9Α±DΟ‰€LΚ Ο‹z@DU¦\ uΌ«RΏΪΓ8ΟQ’€΄μ³ ‘δψC‚*’WΔ9Ÿy1i(½pHj™δΌ©tIά›YŠRCΤΫΌSk-°*εuΔΑL.’(’““ΪI¬Ψ8“R “ -Ν}‚’˜1‘O EQŒ7! ίΐLτfΤΰΰ‘WPΈΜϊ °nέ™o½Ν#œ8q!DτΖb8f'¬1‘\V(t¦m SΩμ’Ο–*( 2εθ„Ίa³κ—Ώό7ΰϋΉηξoQ k{σΌ,aΎ“ˆ#E{ήΐ½ΰΟ|τ±GπκΡ#„θIq³…‚ˆdΰ­γΝƒήηύ;Ώƒ£KlvΟڌOςŒ©ΙeTνNηc±™·<Άm=λ?ΧΈρ†1N₯iF‹Ϊxiqάοo›|%uUγt=£Θ1ΈJ$ΧeΟIQ€‘]@Α¦1ΊŽ©Κ›LhšŽ6ŽΆ§–OL‰“"{gbˆhΫͺΠ?tτΒσ/ΔΏϋ7ŸΕ/~όΣXΏn=¦§¦h‘BR†Έ ƒz ηo߁ϋw?ίόΝ‰•+W.ωσxΰ~|ξsgΖ#‘Ιl’Ӎ:HQ`Ԑπ£ ±kΧC”Γ­¬Ί k{H$[Λ¨&„ˆfΨ°‡N=Χ:¦θŒΆΠ$ΩησmY@αΣ±Σ<8’|€_(ς£=v σΓa>D§!y‘5Ι‘^–%€§Ι&5βBάΌι©B²Φ’ΉpA%<φv5Ιΰ™DDΞRl!„ ²t’–‘΄ς©…EŽad-6X&«ΈDΆήd―FπD‹ŒήΓ ΒC'ΓWj i©σB“ŽεΓ₯fVπΉTN)wI¦›B!Q©Ί, B@‘+r9eQ$ϋO”Rކ¬ΐ Ή¬λΪ–i“τ`i|Β \¦¦M1xRΟ‘ ‘ύΆ0?υτS<€§ώι;—@XΌ5θΟοŽΏ?RΌAHŒF ₯9ZOAb ƒ‹>`Τχ,Υε5K=ηΐ=tMSπ ψT·sηύψ•α3¨λϊ΄³˜gŸ}Š@ζ¦9˜ηF—0Φjή{ΗǏ]2G=½|p'Κ²‚ˆΘ§ηΑΖ¬€z0IŠλι†Έο»ίΑ‡β#‹ζ›7Ÿώ/ώ-ž~j7vοή…™GqόΔqh­°zυfœώΕΨΆντύιοΙΘ&D|β#Ο4!O:Α.\Xœ#Sr:vYήΓ[B’”U™ιR˜››ψwΞ/uμψ1œ±ΐΌ959…Ϋςv|聠i:r£αΛ—-ΗΪ΅λ0=5…Ν›·Ό7κθΡ£ψχΏύY”Ί€ϋAͺά~§?ρ»Τ5†€³ΦoΖ³ϋ^@©+KpΝΆνς‘²΅†Φ'PΖΉJF’7y†K4q‘Ϋ@}K(₯(Ώ(mo2mAςv«Ίβ™ΟŠ;Ν‘Ϋι`Eτξόxšωi6ρΆΌ¦)­˜Λ5ή0wŒροžδΑiœr’ς^h6ˆ’ΩEJˆ"δ™:[^ΐΊŽƒΑ§@œ˜Ι’i "ΨύΘ'ŽP,x ¨ “†ρΡ„'¦›7΅Ž¨ΏG ±s ΕΓY0 +%fYk‘y§φΞΜ½[°mΩyφΛœkν}ϊτiI­V«e KΎ`Λ7,b;En8)δ…ͺHU$•Ό©8U$~IšPδΑ0ELA€Ž©!yH(ŒΑ_q|vΐΊΨΊΈu³ΤVwŸ³χZkΞqΙΓ}«₯&€*Ί ,©»Ο9{­9Ηψοκ=ΫΆY\³Θ’ΊqZ+xϊαCœNgη1Δk³·΄Ο πΓ΅Ψ†—άb"₯0μ­όͺΗ‹όΥύ―REdΪ·όΛίςΟδςξΑKŸψrZ,ξ’5Υ8_ΞXӊν²#εHΛς―j1υŒ5›-8.ώ\iλk}Όμ=ŸϊΤ'ρΗ_Β—}ι—}Α?Λ«―Ύ‚O' &!ςθΡ#ΌςΉΟ!εˆΣε‚ΰώξ„γΑjeΛVπαψ /ϋϋ;όμΟώ Ή>ƒ―Ž77HTψ©7]˜πω²a]2ώόŸΣψυούηπΞw~>ousΌΑ{ίϋMxο{Ώι“ΫπηώΗ?ύSl΅IΤb{ΗΟψ<†όΕ]Yώ’)„f­VΦ[‡U^²‡σΙΡοc΅p™{i Ψ͐{<BΒᐱΒωBœ~οίωgΎίϊϋΎΟΉ#*z³Šά½ψ`nKρΟέΜ¦Ϋfm°‚—uA(vώκr7o]Eb/K‡ΕθGςg…9…K^\Ω§sNgcN&ήθυILρΥjaΔΚΒ>Υ\¬λκοηΆοˆ‡ΓΡ ‘ZΡZql»*ί…Ώy vθοΫΞu«S]2ϋΝγ³­ν/’΄ξυ₯}’ΦbβA26>Δ½u\8I7έx[Λ§±  !˜q¦wW~ ƒrπ# v_ŠPπ£βtΫvF‘X—{EHɈ_9eχ™˜ž» =uŒΏjSύΔϋαπά[ŸΓ /ΌπΟάερΙO}ίυέ9eˆ―ύΪ―·Ί\Š)€(«­ωsς±)'ԞP‹ | ¬Q@„fΑ†yΏ΄pBό΅6z5Τ½ K,―άRJΨx~ζ5bΣΤ;E ‰—²E~0k§5ϋ°@˜Ζy ©«Hrΰ‹T½ Μ΅~ΰϋmΜΪdp·ξΘr±l$ΓΟ‘ζ†G€ΗΔ°λj˜_ŽjCO§“}~x8˜>YpΟΝJFEWρ 0‡ΉE·΄Vύ °Šξξaq5:ψu¦ϊθΣfLοωΚχόͺ›₯}τcƟώ3Ÿωμ/‘Φj‡1‘ }&΅ΫΫk#ΗμΖΖΌBLΆ°9o§—§΅jn^φBμS²λ_ύίώΚώ™ΎοϋΏΧBοOXΧžz€ϋΛj0ή£ΡΣc 8ώ‘Ώύ†‘ίσ7ώξξξΙΩU5»’·ξ+ϊ ]¦¦Έ—^ϊώΐφβοώέϊ§ϊŒ?φ±ΰΏϋ“ ?φύ ŸγώςΧΰ˜uζ;4ΏWoτ—Ά¦Ζ¨eΙΈl›cφv½]v~Α*S'£§•ΑWnΖΜBU£‘ζξ>άίpЊ!βύz?~ΗοώψήΏω½Έ»Ώϋ§ Όφ*Ύλ»ώώƒίϋ{πΗ½όΠmΓ’,Y±χ!ΨΤΏ3+Ζΐδ ƒ¬+α:]†Ίœ,bž±N1™Σ»“wΥ!ήzΓιώμC±% qϋΰΦΔΥ>ί€ΰƒŽ ;:_μL50αx<Ί·δx<2 Ήϋy¨Kg]I˜Sά“’%οΫ>:[κ~4‘Ρ0Ίιšg΄)―μlM)γνΟ=‹ζΏ~o}φYƒκ νEO,’&8S%ΠΦ–i’Ρ˞Ωen΅5Δ<ΚdLυ”Σςα‰SΗyνΜάκ¦Έ2<—†Bώσ9/V"R ^³i—X`Ϊ-lY£―Ψ—ΛO?1(’V $l—uΫ•ΫŽςλαhn|™ob’k5z‘Ž»c;ΨδΆϋ₯ϊ+ύλ₯—^ςΌμο~Χ»―Μ@`‡!°ρ‹χ=—}ABΥ£σ•†@Ιηs §Σ=ώήύ>όευ»iι˜}Σ–τ<Σ$§N“mΫππαΌόςΛψ£μΰG~τπΫ­ί…ηž{ΫμmΧ_wwOπΪγΧπ·ώΦχΰ‡δϋΡzυνΆ·†ΣωΔ`Q`YŠ*ξ˜RΖΖ€Σ鞩»pι¦oφΚ$r±pΑŒuΙ.17 >°Τξ¦]ϋξϊ·(^ΩΜΘΆ¦Υ”[Υ„4ΚZΎ`˜β0ΣYϋΗώδwΰ»ςwγίέΎϊ=_GO?ϊ‚α”ό?~ŒΧ^{eΏΗΟ½}ψSύŸpθF0MDΊο8¬ΦA°%5―Τ]ΦΕ―jIec ΌdhΘ e3£γεtρνϊp8˜Ÿ‚Νš­7,œδсŠ R1υ–΅έm²ˆ—*›m{Ω‘Σ‚‚]ξ½#²˜Z΅Β’˜"+2:ΰΞ}©όbŠŽ ₯UθbΘΑaΌΦΝω,4Υ‰₯€ΔˆΧ^}οϋρΕγ'νΈxηW}YwΌQMBnαζζ†<Θθς¨T°€œ9uF!μβ[7ˆΓαθΔΌiΔρ;°{oŽΨ/ξȞ#˜bŠ.ŸU½’HτΞ,+½±L F#ώL₯˜ή]ξU3ϊΔ‰S±SΩϊƒνΟ*’iY2Ξ§ςbυΎ±Γ/±˜">σΉ—ρΛ/}ζW¬jϊŽ?ώψ³ΣŸΕαp@)oώνxξ­ΟωΔ›ΧΕBοΌΈ‘A“Α‰~™˜¨½gONͺPDŒ y«sJUΐ†ŸF€λμ†ΧΏbΫγΊΰΒζΎήnnnqΩ.ΦΑΊβήr΄l΄»»bλŸά‘U›€οοOθ½γp8˜ΡŠ1Χt’Ή‹OΉ­U|ι»Ώ ƒΣιOžΌŠ|δΓψΤg>‰Ο}ξeυI|κӟΐӏ8.ψά+O,¬V¬«yΛTΛ .5 d;HonŽξψΦ…ZΩσ"₯θF—ψΝΝ €γ͍q΅λ‚ΓΝΡ|$­αp˜uYQY¬χκ“Wρ‘Ÿϋπͺ„ώqώ*₯ΰ·ΫΏόωΪCήΝ-Όδ ΔHΨ͈½ΒDΤV«_΅5o5Ζt ^”9'¬ΛŠmί jdYΨαx0Ymλ8jβŽλΑ;²…ΣŠ€Ό?ŸρΰφΦ<ΕdŠϋf/Μkγ©·husΞΓ.΄Œ»ϋ;Δ°0Βz˜HK«|ΎΊΗΓΗι#mžT½ζ5Qάήήβp8X,5•Cδ †—Λy1²”ŠΧ^yΝJΡΆΣaΗe» ·ΔΥίΖu%ζΊΒC½8t!4^.&ΪHΜ :©άJ 7Oέ`]Wδq8η =ΰpX=κ>$[ΏžΒΪΩΆ §οAϊ#Β7:Αrθm©μg¬Η^lxΠαk—Άγtΐfζi³δsB *βΡ!ό.”ΒA<¬2uε)$Ξg€`cΆWθV(ϊΰΌY{¬u~ŒΠΖΘH“u]™ΝσUoV,eχŠr„ΐΨwƒk5xG‘™‚ΒτAΜλ¦_Ρ" fr;ςpfV$˜·›„ξF~w<χά[‘b€f99©ͺtΡ%l«#Λ‰l;'`YόόΠa/±8‘ή R•ς4JJVœ΅(ρcp•‚BΛδ–ΞΙΘ@ \Œκxκφ>ςяώΚόχχψ±Ÿϊ1bΪΙMO@…LŠΙ c6nj₯TNœ#}Φ2ΏšC‰™Σw‘ΟΌx­ΫΨ€ΓΊϊΛnΜ;³d©Φ†††ΛysΕxΨqΊ?‘‹l8°\8, \œž+ωmδ0Άα’;.mΉYΕ“Œ1RvίvœΞ€hΫAρB+Λ5Ϊw;8ΑτSDyYp7ΈB;Υ0NΪ—:ρ"Α§YΙΘ;ϋ£•³Υ[Γνν&¦Fοξ0ygτΌ°››[ϋ¬NΆiςΝ«sλΫ~a«gυΐSFΖbh‹$5Νp\ ’Šΰ˜’«ΫΔωVϋ3«m‰)3Z&Qώμς ήρό³xρΏόΓHJΧf_„zΨk©ˆ9βξΙ½•wΥo>΄ ϊΙέ½qμΊοά$ΏΠ_κq\œξ*sͺ)²Θ1a]W,)c!`—£ Ÿ= N§κπp<ή ή“ ³uYΙ«š©sY²‘ΛκηAόδξ }u¨Χ(j΅ϊ₯¬B^±Β0γ3―–}Ηνρ‘pΊ …aΆu/ΈœΞ^Z’˜sF#£‹Iύη:/ά‹Γζ­Ϊͺ+Ί"{cZaΨ‘–„DρSπ6ʝ”Œβ‰IΘ–SΧ½Ρ0=υ–G/š3» ›z·mχu\Ώ€3ο¬[4§vp¨I€¨Υ&y1B5'›NT·-Ώοϊ5_Œ²mΈ;mNόΙ}ŸΩMm‹°Qϋ}%Mά;p³ZOΗa9pcΰ6„ϋφ$$œΟχ Ρ‹SΕbi‘TΤt0ΣΗ^F{θVxΆIuXx΅_ύ5xΟ{ήσO}|ίώ~όδO½Η››ϊά>ΐρ`νf777φ§Œγα9en‹«]f^£ςr”όzή3%‚'•[VKs’νΧ}ΝWγ«Ύκ«π‰O½„†€Žθ?χΎΫΤ|XVœNg<ύθiγΜr₯β°ν«mΡΚŠΑ‡ΓŠϋϋ{›ͺCš_«_`ΚbY,…]ŒΡ<λŠe5!Ε²f”½‘/λˆ|αl“θΥ.λ8kΈ?έγx<βtΏΑψqσ83Χ%kŽέ͞ηΦέα—_ZPJげhT ¨­8O΄,Ω΄σls[&ΉμB΄KξxsƒΗ W.2'ς°Έ{rA+φ{f8SΈ=›•—nα»X‘}̬ˌλ(|$QA[#IšΥ51αΙέοΠ‡πΚk―ΊZ1§Œ·Όε-„U²Wΰ6q#- 6k—t! •tπ―ό‹Ώ_τŽ/³}’ IDATϊΌg/ώ₯Ώ8.§8^p;?v¬ΛbY]Τ4ΫΆFΖνή¬§Ν²0_¬0t5ω°h ŒΑkm΅-Δ έDO³5“`v(>„Θ~L޸̈QέέΊ5 Z gφΘ$™–{‡:Lh"Δ₯NΑ†…ώή*€ξ‰ΕΦyTkρΛ°S)n[‚¬Ά‹½―N#€΅= τ‰cϊ―-(ΡpθΝ¬eGxΧΧ~Eο΅‘Χ†OέβΙγ'θlΩλΔBυθUy{γŠ7G{θά$DΞ¦œF·&£QινPj§¦ζΐtK[k3ƒΨ«]‡ƒm.½7|‹q8ZΉύΞ ΜΞ±OV|]@Α}α”Ωxˆu——^E[πfw΅BX$|τ _χλπέα~CΒολ―ΟΎόYrακχTί»bζυ™Κ7σ?ψψφ?ϊνTΑ“h5-Δh2B#C₯CNΣΔ’q=qώά"― ίέaI«oc½±Έo¦„Σι„e΅’/ΰ`@_«ΦA:QΊ£“¦`„α°•Κ7uVΩΩo°PσnCHO?z`ΠfoxτθMν±¬KΔ²f<9]—χο¬χOxh—\έ&Ε}»8 9λη΅š‹="„δ°_ΰCcD^ν] λaAŽΖήάάΰxXmzfυs^{ꀐ΅α\ΆΝ6•`Ι°e―ώ^Όφκ«v μ…xڊTaΌW₯P)Ԙl >ΓsΒ‚$χƒKk^E•‘νq]<όΫρα|ΨΣ5hΊκ‹CΛα°βx{΄ά°°ψ―ΎνE|σ7}>„υ[ΝΓ$§½[X y4 ’ί’7„˜p9Ÿ}“]XE\ʎ§Ž7xαν/ΰύxΏωRΘ(χI\‘]ρJΚ«χNƒ1xŽyEwΤ@±Ϊ―Γ€μa|^iΥkΆ3ν‘°žPHEi&/)gy+ eΫΘAοSL(½Ρ„έ°ςςn΅]E³k«Ω)/NΨ4WΥvΖΜ4ς¬»₯¬“ΪΫ–Υ|¨Ώœ/φ^O¦B7L…UkΕ’2žΫσψxω8Nη‹KΩZkΈΉ½Ε™Ar"΄3!Χ―>Δ9ώ£M6χiπΕ_–Σ%ᝡΤRφ‚ΌF€΄ϊϊS;άμ»έΚ™Jƒ}·—~ί¬Γ·υζώουγΟθnηΆϋ΄,Gƒjͺ%df*z,+Ίš „Έ Φ°Iρp8ΰgώΑίΗ··ίŽoϋOΏνσršώqώzφ-Οoω'Ώxށχς.ͺεRLΨφΝsx\^ΝΛt£LsY³“Τκƒ Ό¨οNgά„ˆ²ίΊ•5ŝζΞJοΜΊάGΒη!ΑΊQ"i #€le‹όWτ‹'F^”2RΊo;Ž·7¦­ΟφŒNgΦ‡ΓΑέΒλΊ’nχψoΑχώΐχ™…q…—UΞ– ¦«j;.„άάάΨ…ήAž-;·'IΡΎνˆ9;Œ°,ΖίTλ±,!ayΌΉΑΎoΨwΫΪΛ^¬έ³\w:YνεtΊ©‡6¦V› Ξb|Pj$‰ιm:aTμŽΣηΥ·„€½UμδD ^ <μΙ”+ηΛ†ΛΆ£Π}έaώ βώώ‚ΣyγŠί­+>gΚBmF¦Ω‚…γαhSΠΔ©•Z\Π`ώŠ„„ΣύΩ7AλξhH1ΫwΓL©S ψήΏσύŒXŒ)1gΛβΨkυKpEΟΩX’ΝΆήρζ7½ O?zdA6¨SΨ―’o54₯œέxk ϋf&»Z*Oέ`―_{Œν²1₯Ϊ.­ϋϋ{œΞ'χ\6ƒΥZ±a©qKSfXe―ˆŒ‹Φ£“<ːξxΌϊιe¬­Sh⸐L—ό5’oΨʎ#Φγ1Gζ›ί€ΠCGνVαš#‹k1xeY²ωBφΒ8‘7Μ„Δz0τ DಝyΙ%YPlλO‹™z^Έ­X›hيυΜpͺίθq“AΈ0²>6’YeY*2Yoυ‘%/³ί,EAdόωtB@0a λЁΠΟ€δΟΤ~ήP/;bκV°Δˆΐά¬Μ­jΏl¨–Γ₯W콑v`«™ό™=/ΆΑ¬θ19Z΅wο΄`(.*Z—R)@ƒyzθηΎθ’b±.°ή‚ΧU”6}ΕE5nƒ­6Ϋ@€6\Ό±ΞΆz ΜΆοΨ&£XΞΩoλZ βdθSμΊ›σzGΔXΫΤό%7lλ‰—ΞΎΩdC@ ^‹86ΒΌΊbΪϊŽ»Υ3ξλρ`R»%{c™ω> B‹δ2šOK›·ŠΩ «¨ιR VF²’θrΠk]„°B*7Π„έώχξΟΰ{Ώοoβ[£Ο?<ήφΆ·νεΚ™qm萟γΪΧ|ΓλΎ)t‡>φ±αs―|޽ cΥτ©Ž$[Γ Τ­R88TΓΐύe0«0·ρ’œ7ΓoΡ:vζπ¬«ΕΈHnθ@O1bM«MGΫv%ƒ΅a;Ÿ€λβωδξ –eqΥSνδ­’<@ΤΉocέ!Φu=b2RΫ= έώ¬Ÿ•Ν*WΟη3 ³‘ά;p:!±ωMΣΦG>ϊQ,,Φ1§]F»Ϊβ€ wn7Ηίp€=%Δ5αρη^ΓΝρ`P_ΐρ!Αk_3.ΫΕC —uΑ!XqUEσ!XήλΪχ!XΪ΄ ΉJuγ ½Bύ”q·Ϊ<Ρaίm3Q³h«pSΪ…EbQQΡ;rR²ογr15šrΉμBˆŒθοoθWR,QŒχηiYpΌY†ί*˜gΜ’=,WMρ¦››ώ~–Ρ•Svθ\ΓΜρxc‡/έθ /Βk*ΤΈZ›•k³3£ςσ!z—Μ’ωQ,.Qf½Λ )XΉW*ΪR’ ΕH{ω/Ιπ”ŽΗ«I`Η‡T[΅1$΄`΅­3ƒ°Ω“SFαΰΠ»½«,ΛβgΰvWΉιΧjC{L‘ŠHۊ—Ό ΑΤ± S”h#»…πA«=ΩƒΦY.²SΥΨΚUΑU†D@―|DΏ&–ZCœ k­Ur(Ν«h Γ£Š¦φΚ‹’;~§Ύe#)>!`/±wρNƒO―έϋΑ;PMρΣΈ))›¦΅†²bδφμq„lΫΕéρΗ΅X’q&Πψ? ?oύ‰;„5 Ba¦:ͺnτqnˆΪΐeI>%ιEњ]φΒφ³έc–cŒήE -3ΡvΫ7Ζ5 ³»μΨφRΒΝbbBpΘKΏΦ²Ψα›9i_.Rng9“wΖ‘ΔΙμ)Ι`nRΟnςޘ"ώΥoω|ίώ;†½+΄™+ΕHΒu]<ΘσrΉX?‹ί·3;¨m81²Ή ΅ŠΛΩj€‘—9Τb‹XjE]ΏΆϋ™¬™ΣόQ›ΙSkΑωΌΑΎΪξqθχχχXy =|κκΎγ‚‚›–ρθΝΟβΙvοŠ1σ¬7ΠάuXxνρƒΈ$cXεΖ,N@bƒΖηγ2e»…Ζο$^4‰jDγ˜dxτ)”j>aχϊοJx5‘‹ͺJ₯JΖ”―!°G#ΐޟ}ίp|πΐΆ•7Έ@…mΫ†/yα­ψ’w ~δ'ή‡ZΊΓs‚³<&^dz­H„Ϋu>,|NΟ'kΜ)SΞΊϋ€Φ)zΧΉtΕ ρŸΡPR ZΙ6–§>eΕQD"ΜR`Cζ₯]άΰ&*©Cο^+»m yI=OHΛΤ1PφήΌΪZβ„}ί°¬+bνhΌ¬·}C+FΎΧV±€ηύ,φήtJoΥΧdρN¬ZˆΆνεeρLS΅V^uv—bA΄υ4XΈ\΅"χ8IxUw+–~a^‹}¨Ρy 4‚­Π;U0cξφ „R{Σ&'VkYή+BlxΛΓ8 qώξΔζ7_ξή`°K)ΨΈ4Κ0MUΥι¦LΈΉ9ψMJ$ ƒLηίΈ?έΑΈΘp xm₯v<Ί½Εƒ›ƒ½Έ! †Œ2φV-vž>–Λε‚σffΆmΫp:YVΣι|Bi֞www‡ϋϋ;μϋ†m;{Λύι„Λn|>γtΒγ'qww‡mί κΑˆ‰Y–Ε[ΔΤ½νœ7¨ES}4¨Hm"όΰ/ώξ.θ cΪκ^ΠK'<±cί .Ϋζšσ}Ϋ±+s2ʊ'ο½ΩQδc)?τΓ?0s]WΦw6—gNyʟΪχβQ$ΪΥ[σ‚ΚΚγήloΨ‹΅nΕςƒ.ΫΕͺ—9½ος/€΅ŠTŽΨφβάBof†Ό\vl[e,x@k ~lZΪχg3–΅p.Έ»Ώΰ|Ϊqή*΄qΉ4l[Ciχη ‡›[ΌφΪc\vƒ•z^αl&Βέ:(ΊAG σœ)Α ]ΒΖ’‡ε|:‘OΨ?#αy ΚΈ«ν‚*6Ί§AS«ΝWƒ”;Μ1;_.@·-ρr:!Τφ†Θόϋ?Β›ρu_χxpsγj±ΐ¬­hAaΩR!i\zCiM’ΑλauOΝ^v *‘J₯A"‘N΅Χω²™Ηƒ°*h°>Mwίyywη₯.—39({—ty\./O³mΐ6Δ² -Œ 9&„ΞΘ¨Ϊp\θŒ?=i΅[r‘oγrΩΊJŸŒ'iδ•ΚΞά―huŸ8s΅wηΜδΪο2»€d(Ί” ΧzCzΣso~qί‹―j‘λ ”š@”%S<Ά{φoY™j΄ΦΧ:Ey“|Zp»V"!"+™ηa~Σ·όkxω—_ΖγΦλΑΦΆ6’ŒezTτDο λzπ•Sνq>aqσpι*_ΆΘιρ aβΖ ”`Υ|*ΐξ=οώ"ό‰?ϊ‡π/|σoΐχΐα|ήΨbn^Ω{l‹’Š9ύwΒ꒐7ΑΜzΛδ³ Τ3€?χMN€Ξf Ε¬Θ΅οj,Ÿ2Zϊp¦Ν.uΫΔΐφHφP³¬5+SX—…νΐ4Οd/ιnpθΕέΏ ησΕZΧΞg3βΥΚοm’)Rgγ¦’η«υ‘Όlofβ!Η.h…|νŒL‹UΖΌΖuY“Š"u_g»ΗDΈd΅Ηχό |ϊ—_ΉΒ!·νBEƒA3½šΤQ1ς€‹Fε*8)Τj|…έΘΓU·«€p*ͺRθXοmdsRΩ©δ S1FάΟ”ΧZ(°—κΒζΆω‘ Δψk³‡vίχ)υ΅!L)ΒΫvρία˜ŠΦšŠF·ίT,š΄eΚpt8PyHߟN~βӁ ©ZmΊ»lKRζa¦IλζφΖ p:Ÿ-»uΒ0ΕLCQgΕlˆŠL!PmρΎonœμTŒΣΛ‘Tg„@΅•αΟyY\»±}O—$Δ•€¬†ΉκΨ_>Ώ:Μ€Lι8ŸOfΞάw―Φ­₯βt9γξξa…ΫΎγΒjΤ%g“¦σΡΦ/˜S~Ι4)‘μ@ΑCJlž£ΪQΘ ^qͺ-ˆy\΅U―f­”‹κ–όΥΊζOΨ‘&ΦΜΖ£―λΑŸ=Α>ͺ²>ŸΟΆIŸOώ̐zΟfΗ‚ΪLΰ°—*›αυζ?ƒΰMwy3Ά§υ†•FLγrΊ]­ΛJςψβj)θ2!›ή₯Β¨ν.T‘Ro$q›ŠqYVŽ{G($°Mpχg^²ό•ƒΪωtΖΊ. HlŽ’œΟ'GΆmwγb @"q[άχέ Ϋ|ςd|n Γ”Λο„{εi©„ˆ cgΉbάΓBΐLσoxηW}i/ϋ T΄ήιφκ­‘ˆͺ6εi“˜ΤVZ_21Ž-DXόόο)—~g€c«Υ’€AΝ•σp8ZP!υϋ+ΥYή•ΞLύJ\±°§S›/μB«Ύ§”J/Oi°υ‘˜T§_~Α~κ4)₯ - .[Α»ίώ^½ χ§ΛδT’eΖG[vΨθV±ηnlT&?^ύηΙΩ*xgΙFΈ6%χφŽ+oΗΎ‡…]―nΩήm*–τΑψ γΝΫeΓρζhdζέ=–e1ΕZ7Μtί6οsΙ$NΟη3n<ΐΆ“‡*em— •2θZŠ5φf?Sr­›€"3>Ζω.%“ςΐ4'υ—Νšπ–%γζφΖ₯΄=ΨΆ–sfQU°Ο“ςϋΣ½aψ*6ς€υdλ? žΡο­η¦63Ξε…’)Ξ"¦ΐΔ€ζ\‚Τ:™›z^ά<Έ%ޜ]Δ`ρ9ΩIάΛωB•• ?κ―Ρ;$¨h;_pΈ9²αΈ$^ι )FœO'λσΦ€Φ/μŠj+Θ1S­·ω—( έ)¬ηC>XτέΔm¨ΰ°2 @C@­ οzΧ»ρΒΫ_pδUοϋٟζVΪ¨~Š8.X–ΥUb‰<‘ΥψVt1PΟBΜ’3ΆΛΕ”ΓΊΊ<ΆΈ-Ρ…Ώ{ͺnΚΦ"‘ˆ:Sfc΅ψ§½μL¨Xs@Eš§,ΒEͺͺν%>Jœ”ΆΆΛ>.1K€ΘL‚°σJ?―`uΟω*|η[©LF_©t²sΑΗ­”1,IL-g`wŽNq&‡ΓbjN-΅"Όγ+ήΥ₯ν7=qυ[]ΉO])‘ς‚Π€nQ ‹³φ~ˆς°Ξt|wͺA\Ν&ϋΎϋτή iΦ•+`DgyK£Γ3₯Œ½l”/ΓΏΓΨj:?œ«¬)κˍ?‰#…Raή ˆ *ΉRF)eBHΨ<ˆ±"φΖ—3 ΖΕ«#šΓ s˜Ϊ wp8Ψ—έ̚jwκΣu`΄ΦΗUā A`…—²Œ@"ω‡SLπό/½{Ωq{{γ]ζ αK1ΩχC‚vί +ORd>γ•RΠΆβΑ‚χOξ-ž¦VΠκ“iΡεΛΟΒ‚.«΄6e—βŠ+έ‡ƒj9Ϋχm0‰„5΅Ήƒ¦3ƒΓμΆUl·<—Λζ*•}Ϋ]'/I¬ό-:@τ žqE%Α‚ŽμβΆό4`9¬ˆ9γ©ȟ!#Ϊ”L[-Όs³+.둨₯q£kδY a©ζ)Ήϋf‚†Πj7ρ‹ΦUrc^–ζΪ=^πςζ"©k6݊›Τ–22Γ*ŽΗ73ΦvΒ«!o fκΘλκλJζΖΤX*eΫ7V°ŽΌ¦}ί‘γpcRΤΉΗ}B’<9σά‘ΧΕӀ藐όnu’Ή–Ι7’³¨Υ‚gήβ•'g―—Q}{{ƒχΎχ½ψ‘ωQͺ΅&Y²‚evξΝγؚQ <Η”Π΅².λ”‘e~N;Ϋ₯Š!\™ 5 uzύΚΎc‘γ?ɜMξs/ΗΓ‘ΓΣ›TέGzπθι[.•QσόξΔ¨:ƒ{26­υΎ.Άζ$§}Θκ!ξώβI.:€…£&W_|ˆΑΤϊ"°˜‚“ςSμxωͺGk=tηAd2Ε&‚ΏΏw>8¬'βŽsjK |¨YvapaυiZ1(žΓdΚpΨ/Ό>r0ž6)#π¦–6­šΐΐ,sΚΓ¨ΔΙHp‰.ŸF΅Ξ’-gHκ-/μŠΑ]΅(—ŽS ²"ςƒ χχ'$O0θ|ώΊC}­],«oΞχ3aL3Ίάε½X˜ΌΣ¬j9>4ΌΦv…/ ‹>ŸΟv13ΑIUΒQ{±Ψoqe1Ev2XŽR£d²χƒ― sί­ΣΤc‹.ΔΕ‡y3zόφ²,f’+k&~ΎΗΰ₯΄nγΐ:μίpJ‘άSσ7=ύΛΊZ<ίΫπΰS½œφ½uη3sJxΣΐ2R[Ι›PΩΣUΰFΏ^%rΠΏSt¨Qέτφω7ίΞrΉœfZ©jƒRDb5k₯ΨΑx ϋLΏlτ1qyQ^?JΑhƒ§PnJϊ3ɐ7KζΝ`ρ»~ηοΐOότO#ηΕ»>/…}μ])>HHΟ>q³Υ}Zθ₯_Ž H6?›DΖλωŒQ‰ό‘ΤSrqΚΓΤυσL”½‰ο…#υ¨ͺ=Ξλ ια›½ˆ)n—3v«»k­P@‚+=iέArΌπaΦz Λ$r©iBŒΆY„˜ΌŒGΆΓMˆβ6Dθκ…U  ±οƒδ‡VyΈŠΜΧα«U_yK"ΤbWzuύσ‰¦5 Πt“\©ΠY/Ω¦‹ΣixRί1¦œ— zŒςξ9‘F¬w(hΖ’ά©²B5μlYΟή‰p…ιΊ™Ϋ_«vηl„žIvmγ[—Υ/v½€β­–œν2R 9ξžά9ί5’+KΎŠfΚΑv© ΫGCa#γ+§„μλ≫‚ ΫE~š$#Iϊ²χύτn΅±€ύ/Ϋζ‘ΰ›R—½bΉ^Œ8M€ΚV*ΤτΓϋVΰŠΕDg$ΩΕ@ω°…-vOƒPd‡ωl ΆκΛ‰api†,5A±··ςοGΈgόK­Ϊϋ²0Ζ|§‚Λ¦ν@”αΝώΌ£;¨ψ†25Ρ74% \.«`³waGW‰yWI3ιj˜žzN†Δ6{πfτ^u ψ–δƒ7LH €ΰD. wueΏSO{žŒ¬ŠZAΘψ™πΠzrσ³ή5]4…|–%!/ŸΖdj§H.§ΛsFC£X)ζΙ8‡:Sb”½Z^ίΓOαt:ϋ―[ΩwŸΧΕcςuΉ™χ$LΑ‘”εσΩN$ψsΆLΓΌdηSCHžyψ’2γη8γFΆΰL=΅tΨϋASG¬»Šiͺ”α£\~₯χ:―Ϋt)/Fρ³ξΩρΒT$\°r’Μy“>χά[ρΰζ―Ύφͺ_£κΦ3ΓcδΑΡAu ΘΙEЁ¬2‘ιχlS.‘ΰΓ"§fF©†˜SΥI|_6ΣzΧι{Π—ͺ‹A—„>o%!'7 fN"ς8¨χEόKPΘ”ς*O}}υ+³Ss·½0f!’ϋ¨NάΚΌ9_άσΕζ.©·$/Ι…z6€€‘RL›‹ 4ΫT­~ΥΌ +eΖ;ΙΛ@ΟGγο|Σ7}>ϋςgέIœSv΅KΚ iςTς 2β φh“<΅SΊbτξ…οJ Ÿ τI,ˊR›‡ΪiσΎ\6Ζ­WΆ:¬i,<΄» Œά£œv¦ ίέίγώtb m™$½#ίMRV=KM $ƒ=[Ο™•-u/³jθΝ`_5_‹—_ώ,JλH«ΥhˆŠŒ»—Ϋa!<©Ϋ R‰1aEW}qœυ­ "ΘΘΨΗ£KYΟs—©πagξgCˆY°Ωί€³ΒC(ΉA­λŠΪ+CXλΔKv€Dw'rΰΫ>/Q•άΕ%£PΔΰœQ•ΥIQΥ%α€­m0²gIr\ 1•8qΆ-Η†ΞΑιLΩ~Ξβ>)ΒΩΊ ›h PCξ“/ε£κ6Χδ₯Θ'g—ηvΚε’G9H>ͺP‘‰7{Tε8¦i΄5ν(u½aLάR’B…ΑQ‘Q %Ι*|³)^ωΜ£gx0ζ«KQk²jKƒΫψΰΚ‹Z‹‚RdUΊ€Νΐ΄{“©T64n\ξGCZwRz>›¬k™]r΄ OeκpΧΛ)c—j0?(5@6ͺۜπ6€ο"pšvš›CΕvΉΨ”ΦF–Nœ\ΠR¬‡N§“]$aβœΌ€ΆM‘”$ξϋΖnνβ‘’.)α²BεβpvšΦμpθτ1Ώ§n™νrqς·VΣεΤϋ~ —ΛyLγSBm-HRΡ•κ“N˜AP'Δ)#’Ώ·}ΓΊXόˆ`ΨD)¬U*οŽWoΫnυ¦ΫŽγαΰzkΕC˜ΌΥS[K-ήa!¨―6+DJ9γφζJl}9ΡeΤΑέ€žλ鲐2Oι«κqΕ₯bς„Οs[’&ψμg?k©°½ϋͺ‚)ΐ4ΕkΒΟY`F₯R#ΎšΰηΣjAŠΑ€ƒ0 'λ)g7kΉα’_kέέξJΡ “3ΘIGRob‘‰ͺ{cΒ¨¨™Nξΐ›Σςθ`‘zΓ2Î+_‹OGΊΐT2΄Κ !β|:3oqywgΊι^φαΐ'Ÿδ¦U¬)+Ξ:8\€ŸΩhTΗI”1ΔΦRXθj–„Ρ^‚‘μ*LΟώΌ'«r]W\Ξ‹―aSΐsoy<ΐγ»;/8’zFwo/Aιxžͺ’cŠΔΰΣΈKζβί ZrC©<„“«‚Lι―2ΔζgτIψKίεƒˆN²* V΄bΝe~«­riΫ‹RΊΕ ΈΰBοέχ~ίί$œ’‡±‘Ω]2χjšΆx|Αθ™I)ΛbJ°"j―.SΥσƒpέοξ<έy£€ΊϋŠ‘:[Uϊj‹w¨οC­ˆ.t™RΉeQ’Ρ6Υζ<ΑΒξkη=Ω›ΟμN)±ΙŽλTΔW]½WkηίmωΙκԈκ[ΌsΡΜσgΝΟRΓu ιuβ‡ζC΄†‹ή‡z,ušyj‡°$λσBͺ̐Χ'Χos3`# Ή€0P)–τΟ‹π™γ£₯Ί‘1Ι#Κ\Κki’Α `΄…(  ΆΡζ… 2ͺ­Ή IΊŠ‚ΰ$NΦΚΓ}$}`ρκE–ζ»£―Π $N?‚κΤn¨‡³qCΘΛκΧ”α N2Π₯UI†zηό^< Λθ3=θ‚’lνS€EHKrUVmC  •Y&ƒwΥϊΟΜοpί‹g |b$_ΈŠΘΦσΡΥeΞ%n‘Rά`Ψ|¨ξ`¦δδMƒ½uKCΠ Ÿ’Ϊq*ΤΦη[4ΏΔ²ο&!\>ά“aΏΖέι„Ο½φšΓ±‘δΎ:RΞξ @ W”†³n\–Ε*˜ωύ©Γ¦‰#’J̞½ : 6 d€•ΔyδžYjξlS~SiΥ?'—udtŽ Αϋ^ '/Υ9«œ3MφpπέR0skΪϊλ”δ­‘EZ$3Œs)3„‘FΤΪΖ9$8φκ‘!> 1Ή½Π“t44ηΐ"ωύ,^y[4|)onV€ͺ½ (†!Uχ!žΞ’1<Ο2ώΦ+-Œ\’ό6 ΐΔω(·m@Ž­’ £’΄“ψŠy1˜4ΌυΝΟΰώtA‰Π `B“FΙ²ψ–Nx! 0[NΎα1z/Λυ’…j’­κh}’󝾺α%ιΝy!†9υ(€8ο«=ψΛ§,š0FX ¦ŠT8νά±qj[–ΥCΞζVΔΌδ+U‰ΌjΛR&b쁒S<ΓJϊ€€.―€hνjΈΥ$ί½Š»[¬½mϋξΓΰœI%CυV,~Eπ•ŸW_y…ΡHΡ‘‘‡ƒ‘sΔ=ˆX(xӟ©ZŠnΪ΄T€Ϋ§Ÿ~qž Ψ τ@εƒzžΩœΦ©τιffšs©FkήPE˜η ςΑͺ Έ‘τ'˜r2•Θ’³Gτή|s™ 5"$%σmޘ<^IӐ8=μ¦ΩΟ<”•³Ή] Υ–ΑmΝΥZώ2iγDοΡ)ž©,·«7tXYOθΡnT3uu’7wΤλκR̝]ΰ«}ω²XΣ]oΏα›ΎΕώϋ±€>π‘»a(瑦 c~ιk΅U_€ υ€pCβΓ6oΆΦ)ͺ»ψυ€ό¬±`ΌΜŠέΦƒ © .ρΜ5 Z΄ φ΅€œωgQ£_½’š^h”r(p}Gˆc΄ήqΩ7Šh  ƒw <ψ Zic;bϊ.³0σh1yWŽβ&Qlˆκ X)Άοl΅^’JC/KͺΆΛΩ‘:I›c WP’¦d)}Δ h OΡΎg)θζΖ;}g’ϊ₯θn]žfΌ$¬_m’³Kd βYJBΕγhβW…΄«κ’< j₯Δά}7^x u‚Υό½䘘ώ Ν}6:zρ/MmΆ!*x°^EγtUϊ3 ϊR&ήmψsς΅Ι­™dΰΨχt>ZLqΎG›žrΦ΄9κΩk<—Όn–Ϋν¨aՍ=Z=i€7ΔHclλΙΊ]΄ιμ— 1›Ω4i εε"‘šQΑYϊ9«eW„υυšΤδΧˆ!!vy¦Rh]՚« ϊ”OUYZ\\]εa·haΒμϊΊV­μ_$(%Σ­.d•¦©ΓΌgʝχ ‚Τ\:Θ'ΌΑ«p%{σΘ˜Ό Q*‡½ŒHωXž}λ³ΎΆk2V«˜Μa)©mw^CZs7.ς°0‡oΐ o_ϊkή‰oψš/§ΩW^1LΜΫύ >υoΫfοd›Σ,ΕV›`dpaœrΗ” lς@;°_ˆΨž#Ο&γ_ ]©\”λ²:Χ€ΘϋΛFS‘_P’μξ#\πͺzy|wβΟ”6όz_Ννν­}‚cψςx5UGͺΪu %-Ν·p¦εΆ†Κa%Ρε,Kmχwwώ’WB*ΪΔΗΓ$Io6ͺƒΉ–κAOς2dO!<ζp%w.Κ>Υ₯ςίζ "ώ}W‘_™η4ΨIνW&Ή―8₯}ί‡ ‹κ9΄Q*ƘŸ­Θƒ5rH-΍ ρ(δfΫΈ3k”έŸ₯RXFF3³§)x΄LΈ‚«•ό|XξΠη.8+εd*Rΰ*½Α6ŒΕa¦σεΜΡέΒ Bά€.°ΰύν*ƒrγ0λ5,>ˆο./Ίe]­7YO/<uHžΥTΈQΚ™.T’UK«n΅ϋ³.NHΟD‘W&₯„tϋΜΓ?`_{Ι Œˆγΰ+βΌqΜSWWξR€;Lδ”σ|wσ“CjtΫχαΥ .©°|³i“Škœ Σz΅Yd  2˜γ"¦:^ηZZΏβP”Ω%βQΞρ2“pςτꁆ θK)³|fsiΒ%₯½–3Z[8Δαf›„ Sΰ'?ωI|ζ3ŸΓωΧ^{r?°\¦w’8ζ#/μυnώVΫ0ztΝh€ΜάHGTKpY&:˜Α3Άλ ‰ΊϊΜ5ΦbIΐ½uχ;Μ|Y˜ƒ ›’ŠΎ €=θόμRΞώ{KE§ιfΖδ½Λ€άAŸ"«‹Gz¨aP—„ύοvΨY>ZφξzODfχτ_4ς?ζazΥTκ•<ΗƒC9DH³™&e/ #Y½3Κ]ωN–Ί0¦uΑgΎ‘O½σΎ)Ζp½uψv kCIΏ\ζΎμy8œw σs9~φΝ w?πτξλκ$―WπjΛα@aA@βΕ£ΟΜώ™ξ) ²¨+|όΌL&»‚ψj–lNΡxΎ<ŸzS$žq.ΡΥkΦ³’ ΪlΥo[ΧrυNdωάjυΈΈy΅ ο\Τ?Δ4jTϊ@ Έ’Ԋ%'†ΗΠL$Δ7Λ:½gό}ΎωM/ΚDβΚ)’ΖKψŒCnڜ@λώπωTΟΥ]/ž] 2ΐ4?΄;o=M=ω*3* M;siF|‡Κg$§΅H‘β†ΎαςΦα1’—1γj/ΆΉΚxš^χ0λπW–ώ|.i¦KΣ·OΡnn ώb[œΈA8‰a“²άv‰SSNeΤHϊΜN›ŸΔθ­4|ΰCΑ+OH)΄/>ΙιΚb']\Ύ:ΟJβΝ=ΨK²,ΆιΥV†,°6Δ}eΧD₯žη>₯Φz$:_4ρ3&.(Ku›HΙΑƒr©VΚυ"κœεFfQέίπλΎΔΗύYΎy8ϊ€d¦ΆGΉ5`‰tœe`ˆ)΄Έ47%O“Φζ ϊΦ»Λΰ‡ωΠdΔ…—ΆβwΤo?ͺ¦ΩW‚s…*αšΣΖA¦ο¨{bœ=-ψ+{ζ–K _Wό!L .Βu A1+όΣj[™†6q•λΊ^9Σ]ς¬–p§.έr’†#-x4tΘPωq…m‡ήEΤFΛ‘Τ_γ,9œΤƒL‚Β5§FΒώ˜.YA^)cvd#ζρxΓO΅Β5PAΔμ9€ε’]+μ²]υšSΜ$ίιϋ1ψ9ΈqΥω9ωU‡rΈzo­0Šž²Gkk‹’Λa4ς*ς ψΑ^+"‰AiΑ//|[ƒ&"xXœLVƍ°ΤA¨¬‡Γ4ε±ΡŒ€ΡEΙΊ―©ύ―΅`Ι««7t8Ωη'γΩΐΞλ”ό9―Ν:˜e1o…R9φβΥο·,‹+αΔ ¨O₯΅†Ο~ζ³W]‹ΓsήSF7΅…•Όšb—xyyΏλΩ _'»2q|^’FjP0>0{¬†D)Λ2~?tψϋXφ‚˜νηQƒΌ%:4φmχ‹X”>9e£5N­‚Ξt`ΎώΒvHƒxύf>Λi½7§χ«αm6"[ΠdQI…7Ζ ePηΜ^vŸ€s&ΜF~ΆN&NΟ\λάό—!FΛοβ`—cb7ϋ,Κhξ‹Π «­ψJaΙsΒ␠{BF»" υΌσ^ΠZ¦"Mœ™{sb˜ Ε#L.πΰɁΏξ>©Jα­“•C5ΥȌΩoμσ©ΥΊ~4`Z\œ›φα€U:K΅9JP€η# έ>zψ’§x†DχjΊαšˆPχβ7α˜2FAδ­+-zwEπ$eί ώš>ŒbSlJω4RΞΜLRΑ4o³‹$]₯ =ψ”Γ Ψ<n’Κκζ“3?0œNκ+°Ψυ1οnΟ@=x&;¦8EJΨΟ; ±β|)σeطݝΞnΝ—Ϊ+`”τά0DΔ™ο‚DƒL|σKbρςΕM™F¦Ϋ&HE ;€»+`fcgkΝ= ΒΌ'0Α sTΊF½3¬€‹kΞξqθ…•βhΠ Rׁy8!Ÿ/gͺk6ΆΆηό€ΎΡe―&ΚLšϋό۞³ΞtΦΓκ‘Άsϊ•lDY4ΗΥuΙK\Zu|!XΊ.“’/½‰½εηΛΩzjβ(τ ’x–œΖ½ήυ/Ό€_ϋkΏ/½τ’ο3”₯Kι*_NίW›ώ3† _κ5'Π•΅d{n§ƒY―Ώ¦lyΑ–œMq&H3g9χ¨hŠ'&£«δ2ϊ-Dpχn—Ρ2Κw’]2М ͺšά—uςΏTΎΫ)»UpϊΊ¬ώž ΅ρΛd hυB6ϊUfυ–]έϋAβΈδΕk4BHξ“Ρχή}ΐ[Ζ@M§I«?ϋG7f€₯‰+nγ\ΦΆAE˜δλffΫθ΅9?#[ΊyτΤ‹ΊΑe΄ρξœ€r©¨&špPΈκ"z4pΚyκς…Η,gυ –ιΖ xΣ›žΑέέ½—gi W£W'l¦ ξ9±%rς!ω€XίΔ‰—s™=¦ΐŠ0%νJρ0ͺ==8Q=Α ’ΐ\­δ&šœΒ‰R ¦ŒS ˜9I±τή0Φ]Qu…ΏJ‰x5Eι’«5/ ŒΌ"’QF&—G•&‚C7ιρT•——ές°ΠΩwΡ«›έuΕKs4“j»Ri[Υs#Άω&˜―qbϊ=|ΫσνŒmσνmή=LΣ‡’ϋΣ‰ί+ΥN„€&α*ιeφ€SaUEœ‡Ω1 λ―αt8š<΅π%žΕrO‡)ιΈΟc^ˆΛΊψ0’Λ[0γkOžΰ£ύŽλno-…Ž`;A¨ΪN#βΟ΅©4\ɚώš#Ψσ8τe¨U$|σzκθKηsS«Š£—‚qρΜ^ˆθ±0τΓΚΡ€Ή0GLhƒηΌq+2±a„ƒjԁͺA±Na¨­6‡ϊ l<=sςZRΊš―«Ιλ.νβJ£CΦ!vfΈtn|Iφ+՘sP3hƒ“qΠ7Έ˜ΈB'O-VιŒ M:jY@ͺ―9N꩎ΌfΧλkκO )FΈ΅ΰFσc˜΄ζCjNSΦ!?ϊš_,Ϊ¬$=MW[ι¨;V˜ŒœͺCC(uqi’aί§˜ ₯;7n!ϊ5d΄2ŸΚbν‹«9λ1mθ^Φ$ΐƒA‡I‰ηπΎ”Πϊπ*Q”†¦QΕψ\•tΥΑuiR.΅ΰΛήύ₯xφΩ·ΰ³/Ώμώ)=£‚ΝCQ‡„W€ ν©Ρr]Φ«KCNζ αΙΝΨέ‡ΒΚ<°‘]J±¦ΰQGvζΤΦ¦Έ•Q’ +$UdΊy†| )…0LŸb_Ίχ_8Ο"Sa%rfΨ}Ϋ­Θ£u’“Οx%mV€ρvΝίc/λ#άίυρP–š\μ&U§ΑžλUΏ‡-ΞΟ4/ΣZG=oπο+_=[NΡςŒcyšΈAκΔtσπ©S²Aš’Υ0η&©w|lΌΕRΖ^v?ˆχ²{ΌGwς½i˜Ώ¦¦ˆωΑΠΖbDŸ€‚:€4Α)– O„Ho₯ŽVF7j>mπ₯Χ|Η”œ+“ds₯ƒX•œ‘Η₯ΪΊμζ .ƒm¬Ο΄΄β OίfœΟ€ΌΖ\+A"jη댜P²nγTΩ“δΠπ€ρΦΙ€§KΊLE9½·«ΣΗ«b-M_"―K)ΦΒθϋpεIpWucς°`ΒΖuDΌŒ. AZ³"FNλ™w˜₯­Κu:ŽHς?Gοξ˜?³o}ΖκCΈφΕHm3σz³Sy6ίutB-mT}κΙF΄οš-yρ­L0­›άΔc΄ ‘Μ‚wcLž-eΫJu“.ΠmΫ{WΡΥνρΚη~Ÿϊτ/‘΄cƒΌςνΰͺ…QΡ+αίIU §lK–*­τ]Yk‚7@ςpΑeέ}‚‰-gώ½f…˜ΜΡ­3Ε/•ŠΨ’—‘>ν4DΑAσCΩί³)αY°Ÿε„ »φL)ͺEίΕa= μ»Ί‰>.m…Υ=nΈŠ”qh+-¬VθδΉ]εAΈJζŽ“C]²eYnŸ~ψbUŽ3ε£0―‰Μ–€ͺΘ^rZE;bφT܈θT¨Cε₯΅@—Ή”σ^gNFΫ§4Φ9ΨΠΎLΫ:$Ÿu™,y8ηΰLNΡ8Ež€‡φXχ¦ΜQݟΟ9 RΈcρ3q)ξη·ύΦκŽλ‚ϋ©ŸφdΡ2υ}θb’;άδβΑK£ά©L²,k)—V7¦·τΤΓφ5;Z§vλΗΓρŠνq˜sfZnυ\ͺΖ’±νrρι5’WιήzG"¬ΥlKλŒ^›Σ€t™‚δ^―XΪy$%Ί±³»rΚ)ς.xlώ^ub~ή„δr9«VN‘#hp(³άG’W—ίL0[MiτΟH›ŒΙ‡+γφΫUΆΧ²*Βƒ5a@”˜‚GkνΓ4ΚΝ|]’ΡFΘ§“±n懋#γίχb³Έˆg³AJjΨ¬νjχ2sΘj˜€ύοΆdηrV'n:$ΥΧβΎR εvπ‹ΞA­k))“·F6F­Λ­ΞΰMOΥhSΝ‚ϊ•*Ο»l&¨OŸMg֟NWc…ˆˆΐτ„Ρ%${’’–υσ/λx‡Τ“ώΉΌ±BϜΗρLπ™žY‘zvrNWύOs;©xύ»`iW`Ώ[3ΔP ³x΄φΕᑐ'Λ“!ρΘ*Έ ΑZPιΉGžPαΝ:”ΪD4* DάΦZΝοf8ΈΟΐ!΅6’, %ŸͺΖρT˜άνRJΜkoσœϋd ² T π©Jω_zηxŽ”ς„ή+Άύ‚Σύ+8_ξ,-q’ιFΞߟOΎ)Hμ&6Ύ¨Κ’σYiž’ν-¬ΏŒ!L13ΝU!& „PvΧλΟηޚϋ5b ΈΏ?α|>ΈΏΏwΈ#NAzK2)·5™7GAΈ7ζάΐ:s™]egΙ4Ψh8΅.‡<%οVœ/μ¬;•›<Σ©Ÿ%¦ΰ Α9xRυμΟhΊ‚ΔIhCΖα€Œ…*@Λ£DJ„€WΘRT œ'k³‰{]WΐΆ)™ΥZE­ςnˆ‡ZD΅T>$7΄†A—i¦ˆσωμ’€²—+I¨>Λρ<ΞΓ§H‹QžΕοOP[y?Θϋ,|HΰEHB8i*—0ESS“iqq%¦ΤK^mΨ)EFΖGηyLEΨq)Ε{}*yF  ιT°eΩ zΚnοόbΌυΉgGυΟi’:G―VNάl’gŸΝ’…^ ֊„§šŒΖψ›αΫD-»{ΑΆΛΕύsRJdR\IΦάH 6ͺ`―Άζ½LVC°ϊy¨ν[P·~Mυ?U*RJozΗσ꣜ΜuΑς^xGΑι)όN&ΜN‚£bœ…T„ƒ)¨Nky˜ *9O/—‹o0ύΟͺ},΅ω4ˆ`ερšpJ)aˆδ†h*ΫΆΝƒ—”Η!6υ Ο2EΥgͺμfΙ+ƒΤΊ“ΥžkkˆS±}@ 1Ο<υΏόΚc€˜Ρ†sƒσ©lΈ‹ΣΑκ/e€ύ»œ¬GœLΊζΒΠΨ«ϋ#-Ι4ηl"\—υσ~Φ1±Ψεb?{ΈnΛUοή•ώτΰωIΒε%›Ϋ`K»«―Ώ€U³;έθΡš\ΥΫέZGN9/8_ΞΉνΫ$Ήρ^Φ†φ1ύ@§#WEVή΅"1%”+·½ΛE§!·ΔΙsΚ9”T«U ίάά8qƒ'Σ8›’ W₯μ~‘ ΧΓd(”Χ`βŽTΒΠϋŸ9±χ©pkiˆs’ί) γΛΏό+πsϊ‡’žteΖYΟ}žzoΐC/Ί<Ϋx†ξB»hΫh>₯9n£Σ\]ϊw3«Μ(»Σ+%aO!„Βg¨KΎ$ο0"$u” ρ€€ ²υ!•#9wψ‡’GοTΩ¦m_‡₯:‚BΊ&)Ήj»6ΑzήXo&κ£bV~OXή6TB‚U7G6$1ο„’¬λ”qΧ,ŠIΘK“±ππΰζE€0T->5I–(y© 1ώjϋRά‡+gΎΐ‰VφǞέθΩ8Αƒε\="Xˆ_bmόBrφ¨œ—{ι 'Χ°β₯΅~Λό7z1Τ,؝tKa$όVn4­#ί­’Τ IDATΠΞΗQIIwfGχCπ*ΊΪυλΡΧJϋ²#ŸΦε€²_©υΧΕi?[ηDGίΉ•ƒ7–)IΆσ‘μυ°»‚(gώ:*ή ryΌΞ»HZ&ιθ) ιcr’Yλ·Ύk‰1€œ“[‘ƒnάS0Νs"δΜ§PC?΄₯β–*­rβ·Ό€έež Q”ŸC$q$ΑŸΟŽ8zZBfΊ9[τ­^Ή¬Γ4H5ΥΒφ1hΔ§κ!Qž}‡γΡ½*}2%Κ‘άκ0ι™Nη:‡­ω<=’³œLί+&·ψVιΡ„σ’²CV+ΘZΖ$%A€=pU₯Pή#EPZ†E™Ϋ ":‡’³M^―Ω―Œ<ύ¬ͺ‡­»€|•ζx?ΒuHγμοpCβrG3¨¬zjEœ οp%ͺ€ς©ΜT?Ρά‘£ΔΫ6‚»Φ½ #ΐϊϊ΅―b¦¦vΦΰ™…Έ ΏL,Χ “bΜ«Œ;fΟӝ{ϊΝozQΣΚΉ,·fᒍ΅ŽΑΓΆt°J! ΄]o= πΨ‡ΰάΐPI">μ¨:|88Ζνάζ%‘Hη0•=)κΒ&•μζŸ°Ι xWyΈ<©_ϊU?6\ξ«Xn­7䘜+˜'Dmt‰…HΦΕ²cΙ«ΛΌ·š„Ώ]rΥW]/‚ς€Υ©¦΄γŠ4ˆQΖ)…μŸ ιjΛΆιρ$SΟτε²yσapoooέ$ͺηFFu™[Έdς`Κα§ @O^{Ρbζ‹Δ‡‰C bμ!ΉΉΝ §> £γcN>ža+qs“δΜo©dκJzλQƒΗ“Ψ¦Κqδ%{7·Ζƒ38° OΎ{RηΙμεyfšp1R€Ν’aP~(οΑ@ d±πχώmN.1ξV&ŽHe\³*Ÿ•ΞεWsrot”m eϊ¬\Αɚηƒ—€‰;qX0ΪEbBα• lΦ;ΌUΟXsΥ ‡B‚]ύ§g© nC\Η²¬W>%‘λ~9Mώ8uφΤZRΌv—»¬Ί£OF`x§ŠšΛzΓ€ ›‹Νl‹„ΓωRΤZ)aΆον@α€,tsε[σσΩ‹¬B@:<Έ}ρ 5†©ΑJκ{Hσθΰΰ-;;YG/E`ΰ–9|χmw·΅`•O|δE•l•\ΡtKχ)‘σ°t|ƒ\φ¦Ca@―#θov9KQ‘ΝΖ=Ό>|Κ&ZEžΗhΞOφi(nE\Ϊς<γGΦTb₯ܚZ+ΚΎ!AΡ$itHΈ ά+fp₯ΙYοΊσ>ΘΣ(WŸζδ1d5¨./ΛΆI45ν>΅ΔSٍ¬tˆ ΚμVΌ£E&MχŽαzΞΨΐΖ₯7Ώ½½ΑΆνFόy’l`€ζ±+Ϊ¬?Β£lκTμSΒˆΡp'― ‚˜qΩ –ΨρΟγ―ΗG>φqηPRΞSρΧθ­Ψ·mJx₯$’ζEEΟΟή“λžϊξRܘF¬όl’•ˆ!Gs|«ΰ+²ζXNψ:EσˆœΧΕl‡ςΠδ‹³0Zχτ`0ꈻ ·2w’k»Ϋ§8z)σ΄‘9Οχ'NΥ±£|iχηΥ[σΌt.^žjS[—՝ϋ£F…Gf„Ι—εΏGŒή΅aU±…εIΙγο[λ„°FK &u 7³bUΒΥΖS―ώ\#Α 9ά©MbŸΝ«l»_mͺ—Μš;™J~%xhW4‚C~Μ½RiΪ!―ŒA΅1–R=ΩC6–ΪͺKΣ1 JΌΠΗ°0ڞMcož~ψb›ny­ηΑΏψt%u›~οψšχΌ‡υ€Ο½ςŠΏΜjךc7νT΅‚eNFγ@”§CdύΘaΔ€Σρ$p©šŒTγΕO1Foƒ›CΞdF²θηΡ§ΤαήLϊ98Όξρσαι1ξu΄σvƒ0Τ„K±±. ήυkށW^y Vm/VsύΘ$§΅Π-’Ίr; ¬h-έ„™CP%ζΒTQ?ˆΉ½©½ΠGΚ$gΥNλ ” ΣE9’tk«φξΏN’—νt:Ϋ…°,”F―nδl£y­ΟώžθŸm!”~KQP\Π½M½±T'α£/}βJͺZΨϊ8ΆΗz (Y©?GόEόΗ§?c»ςθ`Χσ(—zVg EαΊv8Žœ9Χeφeΐ|ξμ.Ε%ςϋΎ{ZC$›ΙlL}λαθΫΕPΞ-Ο¦r€wΥ !Xς0/χ%‹H.ƒχŒ(BγώM|QJ&π`WŒοΊμΕ‹½τžb2‘φ…wϊα– 4€ΝSς!N—›’jRNΞ‡)ƒ­{)ΪΰhΓφ객€ΊjیιϊΌŠ†AU™Sg-’žΠΝσS‘’Ν՜ ΐ€Βf-R η;nβ”l1ΞHx#ͺN)ΧAύ8nbξƒί₯ΐ*ΐ”βadχH=|Q„χ0FΗψξšk¦ˆησ―Όϊ*ΐ/nMM—ΟΤ˜–ΕήΌ€‘Λ4›ΛHXΚ‹Γΐm%ΰ„ίΤb¦rA IΑQ?R*RiSbu‡ΣNFΈ݊L\Z'©x ΩννcΠul[€!ΕOŠ`€1.κy€Π<­΅–ˏΓδ7ΆMσΡ³†j16{ς9Έ^―Όδρύΰ5ια*3yϊτ Ή»»Λ(ππsΈ‘Ψ-XμΟb`5DΙΖX¬o›άίί‹­)ρτΘωόος»όŸΙ;Ό(Μ³–{‰BΎ£srΩ6™λ-˜dJ³•ͺ¨Θˆ ˆ E‘(7vO‘Ρ2†τΛ£GΟ·­³υE;ΖƒϋΜΛBΣe˜Ρ6z[ ˆ‰ ¦ ΄(ƒΚU‹ŒΔί¦*M±x Mgt‰ΗKoJ†?-†dΉ’• ₯ɐ!ό<8ΤPe Ÿώ•R_(†@λΔσjT`ΪδŽ₯EΧ’$ƒε#ΆΦ4.ꭌ­ `A§ƒ<ξ ―κΈq‘Δ°88Ζ6O _ j‹%α£ΫG)ε/Σ܏rΘ%kjžθΗJoΟ$R;ιu֝Kz`­ύ@EΕ½ζdβ$ŠGͺŒšηο…Τ΄\ΙύUΆΛ…‚ dΫ3”^Θ―¦‚'^Δ±τŠΔŸχ"U0φc—“<:Ι‡γαDν/v<ΜΈ‰w;–œ'8Έλ¬4qS:OBςϋ}Ozν~0B§„Œaώ )jEΣƒ„›αkiΈƒμ>ω"σBRΡ @ βEΕ»r‘hc‘(0Ίs΄‚©%Q“nώ@|Tι1ΊΐšˆN°i“χ\ ΏΨι"Δt«O‘ΝLΎπωΟΛλ»Χ²οW.άωyF·tέ‘7iP©E1ΆΧυ8ΒΝoςι·ή·>Ωδ_ώαΛ»ο½<νί’0x‘αέ©"e•D`!ωx$ΔζΈ‹V m]q PοΩ—>o¬,γ7‡§£υ.λ8œ·2Ζ TΤh0%S_XVΪΜe"ΫΦγ%I³}αˆiΏ ‚Κ5; „»Iͺ»VήΌ­ΔρŠHJ[&Ν-sΦΎW{‹΄_§Η°H!F;U+ ΪA”-Ζu ­V‰`γ…ͺ¨–ήy¨ΰ²λχKH‹οοοσ V|ΧV_©Φ›βπpΌL`„ZSΖv‘}EΒΒg²dMΧͺ"šπig“)²Eφϋ{±AlpssλΎΡ ύ‰CAOυ’Μοΰςζζ†Ήέ=ͺ9W v ¨κ™{Ώmr;eY}Γ#β¨ο=δ<άΏΏ¨y£IΑ ?fΦȁ_’ρʎڏ=Ί γψ³fPPf~sΓBi•Κš Mν|Α³#LΚέέ]&/†O F£[ͺΎŒ!QΰΠ; έho%Μ+>WŒpζ:bιKk˜<₯mU•¦πƒŒθψ/—‹¬"ν¬.c&viZΈSΈόŽΘ˜9Ž]φύ AŒx.Ζΐc99E-<$½qg“bˆΖNΔmGٟ,^,ΨΣrΟ'Q‚ξc.h[₯mƒh,ΚED4¦#^Σ6ψn@Eδz½nΖ ŒΰΜ–GγΞδ@? ­ω§ (€:Ξ(yeD8Ύo[Γ ‚oΏ}ϊψΉ-‘ΆFΏ|oάΠ—ΐ|Σ‘.zβ>ρΖ:2F̚ψnqΈ―…J σB‰jž2Ζ@ΨO'ΧΖGYΎ@‚ Σ+ΩΞCP[ξ ’ιwω€΅8 …ζβ ώše{Br‡=²! MEGUtqΔ€ΠAΜ$ΗI6—¬”»Φ,πޚ|ϊΣΟδζφF^Ύ|’]₯"‚Ύ +ŸLδŠ@ͺ4H…UδM˜ƒVΜhΝΟΰ‹ξ2ʌCΝ鴃?#ά½Χλ•ΐF΄ΔΧλ•Ό$Œ­ T’’o0£°˜η;bf G=>[hϊ‘XAά&FaPΓ‘Κ!a“κΊd #€”DuŒ.k™ίR@ŒΨq]χk<=;ΣΉNώŸ­k"r4:xʎ=ΗΊk#-r]‘ά)‘xŒ‘_YόbžI zk%ŠA [ € ŒUVζ4ˆq·‰_ο­₯(F–uׁŽΎ2ajιαRΪ•Ή.eβ 6UY*rέw—$ ŒΨ0ΎΑςYPͺלeν,,fL$*Pη¦ύ;JΑ§)4…0¨Ύ{ZδΆψΌiς•Ο}J>ωΦ[ςΡέ5Lœ₯n*˜‰HˁζχΗ ˆ§φ’JE«Ÿ#$ά];¨ΜK˜y&ItgARŽΑ-DUpΥ΄IΏ}ςδ9TT$Ι›ŠγvΪιΠ@WᑏY*½g£acΦΘκ²7.~‘»©ΞmΝ&r ­ƒwg8± `"m™ΥP&mJζ†8PρΟ: ¬ŒςBqΓ –JȌP©ώ+£Αn C\.XΆ!λ „t1CΫ’#…vQEδΕΗ/δΕ‹TΎ_Δ©D©Λζνr‘Ÿ₯Ε©zΧ}gϋ›‘Ν,TKW T ovˆ1ΒΚ αΜ5y:­δή[!#―‚šOΣςφ㐛ΫΫ“sΦεβ—}O…œͺΟΜχiΐ[ b +J΅œεXm₯‘̊{Ω"©2²8&‰ε)“1ʍκ²rΈ‡™  φβVΛJfMΠFρ<ψΕΈΨ―VkβQΗLUΒm 9t ”‚GΟ*‰ G°Z JΕΟ£3„Ό{[_™]!^ΰR<Ί`Ž‘z΄I 0Sf­5Ή½Ή₯[Λ„¦‘Ϊ„Ί _xe΅pWγ{θ­‹€‘_:ζœpθ‚λss#οrq*)Υ«£‘ζUž{όαχCϊ†yΥT- 7%Β|‡tΐ5'½ ΘrFd©Ko-²•^žΙπJ³ž”άω:ώΡΩ!‹T‘«Κ5Ρύ₯ΥεΉ7—™6Γ μN\ώs±cMςoUue叱€£€‰ƒŽη›V¬•ngO½k…̐&Š-τͺ²gCΩΉg€ŒΖ|χd¨ΣAf[₯ΙτOh…ρΟT‘Εέέ}I`vωF§ΌMSςŠεΉYμη6Κξnμήτ4J‚·IDδK_ό‚ŒΛE^~όBL3·g-K%pšπΊύpi‹¨\―B….φτηΑ˜?οŒ‹ ;c7„ZI δi–ž7UYΦDZ/!+skz—χή@^½|ΙJcΌΝ Ό΅€‘Ο”­i.>ϊ:Λ\'ΑΊΐrL¦7βˆοψΨ―%ΛΎΝ(ΧkHZU«@0₯Rmdsρ³B~.6ΥS-ΰΤ}–Όρ9‚ϋΌΟΊnxΩ8‡—QγHάlδE,…h2x:) ωaqAΊ0oe”sδεVΖ”T†‹Ψ&F§x(_ͺC<ΐn«J7“4Bϋ™=€―o½ωf$όeΒ“VΙ±—)±ΞB>υσ„|Wϊ Ά³υ՘ΕsT§’Ν=Ψ<ψϋ ΓXfrΜ=Ό ?W‰ΐ±©a ½zFsk*oΎρT^Ώ~ε1Ύ+%‘5œ‹Ε‚ qΨ5tϊ‚¦/tX΄φθ$+„ c3Λά 9cŽΓSέΜwdl2 ¬&ϋΎˆρφ²:ώE2&™&?Π₯cΌ)ΏnμŠp!#7H v“}Θυ8<‚6ώ;•]n₯£ΣSf=,œ`1}ŒόύΏχχδΫςν8š#WBœΑn,žύzIΑQŠ'Φ8<`S’Ό[1ϊC|™άΉΐΖθ«ΒJΕL>~ρB>όΰ#GΑlϋCxΟ9ΠItΗ€½‰xT n L‡Ψeb€s@5£’­€§½nγ”5"8‚ˆ2eΗ+z6"֘>žB<ΐήΎ7FΗΨοΩ³Oϊ>θ8€Iγw γυZ‰³GπΊ6H0YΩŠ€Ύ_ž³ΖΟ~ϊ3ςΑο‡ϋ{χT½v¦o")Π–ΔΛkŒΌΤ6άl—}dΕGuΧθΜΨΐώ ΛaΥκhDNΨgaεss٘eο‡ΈQ‘³‰Θ2•Γ2ΫδλώߐΏ|ϋν“‘ue«υj’BŽK ο©#!Γ¬ΎΖΩA# 3ΗΘ£ FZ‡!+βoιΦ΅„‹"߁F\όώ§‡!“μ$ΙΈX-cI8qaΠl‡Lϊ"#%ΓiM9Φ$Ψsτω% ‡LŒΤpP³ϊŒη@4²ΆXDμ€ΏύοœŽ΅Ra‡qœ”)w†„³“-φ|]v££€D’ş»ΕΘ,G΅ώ™9ΡβšlŽ ’ϋŒ…7­}όω€Όέ‚°@cQW‘xIΣa)tŠΙ“γ{I‘cŠ› J˜Œρ™Β /‘–Ek-D>y©Τ‚β“ΫΫΉ^―(ύ©†uρ‚•ύ°°τWάτZ²Β¦z0vΚύι[ŸxžΑ8Κί0±R䩍봊`†¬³’Χ‘dˆ/ήB­σΧΆ9ΰHΑ2°‹vΞΰΖʜe)'D70>hsΛ¬ˆΎΉηλ?υΣςσ?ϋ7δ»ίϋž·‰@A”ΡB­Ρ©ΐύ­β‡Ρ₯x‘΄Ϊc2Ά₯FiΨSDψ pۜO[ŽZ晣cΘ»οΎΓρV8‘,/?σα‰@Qb+RΤ²β“#δΣ ¨rY]”2ΪN‡Ω-°Ψ‘š;%UΑΕ’¨Κ?ψΝ_‘?ϊΦwDΕ₯«Η<δνΏz›1ι¬εZ+Sc δFηa ΄;Η=!¦ΐΛ|Z –eόeμf]ζΡ* ;ή3Ή’V‹βhσŒ‡Ϋv!>ΓDбθTt£χΧ{Ή½}δNζϋk Δ‹iΩSΰ™wΈtΤ2λe¨!IάI΅’ ³8ΪYd‡ωeσδΙSz”4ί7 9XΦZwΈ•ω*x–ζϊλ³_œe΅N‘±žΠw”7§ϋ~εΨίΡQUΐγΰ0Η{ίGO>_LB΄@(±Ϋε~ο[\"”t3έΩWτŒ'yϊaq”Ρtλsw•—ˆ–”SΪ’ΰDƈ‡‘₯ȑ澌m“p"2;₯i†lαBm• l?Ηγp” d…t†–1nΫ‹o m\G…Dc„P«„νrᇛr5‡%ΓJ²ΝΡΣͺ,ϋψ:ραiΌ¬ ½/:όδ—~Y>Ε/ΚοαΏ”%zΠ²kha\68"ΐ·aƒΫv„TΡ«T8φρb6p†ŽΔY¬¨60―Ξόoチ΄ˆQ’‹π–ΈΝβpξ™ T.7zVPΉ’[˜σͺ±i«˜fB2[ £αh₯βξ­(<*ΎFUδ€ς¨uΩg— Ί[KΎωΝ?‘MlνδŒaΆχ,_ΐ™Kl(©nnnό@/ζL ΙαEΡΥJΖ<.σ‰ws₯ }‹Ncτi—‹¦N‘€ŒŸVΣ£©l—ΉήίgqfΗJ5R₯ΑOšΔoΧ§΅V ά5Θ*··˜₯’eΧ0ˆ+9˜Π)”¬KIdΌ‰j”ρΞθ’‘ŠŒ}ߜΧ»…μψ ΚΓλ#‘’@ϊ‚ŒaY\ό#W;Δ½ψ›π.€Κ‹±^ψθ˜|ν­ψΉF2Έšž².όίI~&ύ!Tg'"m΅H‹Ο°3Ξ"Θΐ”‰«ψLΥH—)L·Ζρηΐ(/h\RΰΆβ Wm £΅άγi|Χ[x`ψ\ΗχΨZξ± Ό,ΙXpΤi,ϊKΗ„Οά±GWβM¬Dαbά"oήxςU_βLRU9Xάq€σΏ—ε?S’‘*sUeζ gˆΟ φΟ*κ, + ‡ $V[‰ΓFBςύoΛούΑ'=f©ZvbΙ€Α€Q•P$‰λ§[aε`Ή‰9#xπ·„B’ MͺgvpρUP:΄Z1ΕΜrC&y\"Uˊ΄e`—„RηΉJ…YμΚƒ­?ς\,<2 Εb™6:8U>²Ϊq!ͺrΔHˆ:r+Ιlš;Ÿa8)Μ¨δ67wύQΙ-­e²υΝ‘%–:vLLυc¨Tης£ž kO ε_ƒΠAƒρn:Š+ŒNx(D,BE%E'W)ΩνβX±₯# 2•J&ΈJJς]βœ4Y˜ο°;Λ€!)y3‘§ϋ+‹CΡκ#RGGώγSώκνΏ*γ·θτΒp·οG w™vlj-εζπΧ4"…’L΅\•Ε{α²³˜j…ρIλJD;.βS•7 ΌΜιi‚’a‰ϋuw’ΘΜ%BvZΎΪVˆ2’Μ¬'bhΰǜ/Tda/hn Ν*Na<’Όl‘p‡£RzLv°{\ΛdI.¦>F…©γ•0¨υkgTuό‰7ž£ σο'4νˆ™]ώ β-uνΘƁΥ#ihDYΙ»†|οŒ”5ŽY4‚Lͺ2ϋ£9&–? NJ7*Ίω©ΙΦG„ΐHy(«D€i}Oƒk1‚χΟ(ΖΛθμE­(¬R’‰yykι0"—Υύύ½όΰ?ΰ—s>NηXΥΞΔG€–”ΝΦ€©Σ Α΅γθ<– δβ!Κ·5³s–ΐ‘[ƒΪ†Χί§Π0‰’Ο–E*€VFJ,Ε RΔέ\ΤR]m%Έhgw‚γZ‡§ΨσANNF\;ιΡ‹gφœ™“*ΣydΤΤWμFΙm/Ύ˜go>’―ώδεέ>‹]‘bb>j ω†qWE€]―‘0Φ2Γ£&ΖνJz?°ί€€裁ΰφ±H“>³ #Η(ΓlɁ[5nT$Ξύ` +>;T§’*Ο6†lΫζΛΈ΄$‚’L–› [ήp[γΛ’šωΫΗ,xνHωVΈΤ$ͺ[26ώz"%fι>6Iœ δ{• Ϊq —ψN\ΎLά<=ΠΥN†ΓTαA’`1Pωάr–\η)Χϋ«/•!₯ŒύΚ2Λ…9C‡\ir―WN{ΙlN„3\Θω%ΆTd.Ώt[οbΪd?¦\Γ‰”ΈΔβΒεr‘ύώšμ΄ΦdŸS3iΫ(%(v±5e‹Εςζ@θφj”ΤU)ώΞΓίqσzSbŒŸ»…άBΡ‡w 0Π’jψKŽ}ηŒώˆ@cLλΤΙ IDATΑœ,H3#MHΐΖώκΊ_eξ»$)1ΉΖΎρΊοLμ\‘ΡqDΖ8.‡³φΦcD ό “·šΚΕ| υ™Ιυz_δ‘οa‹.FθΩΐ ‹ρ7¨―-FΒΗαί%vG2΄˜~1σp©τqi-=0UeξG†άυ|fkΆ:zŒό Ύ‚:[£Eεz₯ΗeE6€ͺŽ κ-ΦqNΆΩšΩ‰s…χD ρg’‰ΚυΞSG-:˜‡›mšjΏbΆvω©―|Y~σ7syωβcŽΐZqΌ hΫράρs{λσŸ5x{&HŸ3ηi0°δ-&”l‚PΛΠμ0°Τ£Θeϊ €B_gœΣηΎΧϋ{Ž+ͺ{ΫFΘKΝ%±ΘLnPX‰hίX}aQe{;UŽΦ‚™π²ΡοBe…ˆτν"σπeΤ³Ϊϋ„—)›<&.γ\XbWωκΎά­ ΰNΒWš{pAΕ„ρ‘eξ‡αωΨF°|¦οΗJVq­ξ¨Ez[uψΛ^Νf~pq@eΫ1ΎžΧ±ο']Ή—šσδ…‘Diξjqυ²³¨€KΉψΑjΫΨΡ€ξ y:Œ]Ψ₯Μ㐛±Ή<:ͺz°ΡFD $†}qό„Ο F-@ ύbΘ™χ έΜav'΄KιάK *V<λ[d0Gg₯š‡°¨Δχup—δΥνL­{όΗΚε½Xζ…p—ΕΚΎs /F<( [<§9*’žSδηˆeV:D‹Ή=Z|#h‡<ϊaΏE‘¨„g©Œ„γαͺ{§cϊr?φ Mt‘˜š Oέ»ƒNεf›+Uπΰ‘TΤ_~²Ήδ`nNβΦ™Εc‘c8ŒoωΩ‹2`t’f; Ε;S€)―ΠΠπA•X„‰°ϋqψ$£ΘγOσ†e²ΦU–ˆ\Ϊ%¦1V_郂τ!wŽ2yγΙσJ₯χ\oLΞ‚/€D+26τΈKnς«£z…‡²[Μν΄8ΓΉ|+ΛtΜΎ›xώuΜ‘2^S•y P€d 'κΩηBLμG]HΙΚ ͺόπ&M{8ψ{ΖΟ;1§κ$F0Ψ₯ΔZ©Η>›vΌηxŽςZλ ²‚c]ΛZ«ΫR’7§cΜ±kΒ,—Qΐ ₯φ!ΗάΉ‹ˆ<6‘qβ‡Ζd²‘Ωdρ0Χς.χΠE«Š\ο―ΤχcΖn‘ψ@΅N jUΊD‘Ρ@…^TGU£άWΎπEyϊτ©ΌΌΏ;u³BtώυΊΣ|y΅’AΦxι 7Α_¬ψ}…k—^>{ϋ/¦IΦΞO!©Ό=₯•ξίτ5-ξ14v%˜€#Yx˜χθ*§-ξkp>ΐ|ηI›0a4ω&ΜQΎΤhήω'ˆΤaυ")“ « bμΫVΙέ±B:ΐώ 7 y:ΆPXαlΉΖΞΟΦΓšΨθ°{kͺ’±@‘ζζ²ήX‚πχΨΆMφλ}1JƍƘc#Hσ|„Π¨ψ‚Ψ ―ά³βώ<˜ψ΅P=,ΐZŒ‚„a1­\6£ύφρ_αoiρmΔί‘‘LV9PΌ&Α4FgΟήό„<}ό(έ\:CωΖ¬Π–ωμPΈ`—Β˜!?ΩΝΗ ·t:ό΅ωΟϊύwί‘οθ‡'³!Ύ«,Z’Ξ ίθ­ΥΜε’ۍ•"+ΏRΠdΖGg&άΖu‘͌πΒΊ»»OU[|Oχ1& ²iπ{ ^&Ψ‡-ކLίl~‰™ŸέυώJMΊΛ!Ξ(‡³Έμ΅fˆ‹h―5>#―Β"FέιCš„Λ¬χΣFΚAmε9ηχ‰–fFΧ:έ…F!€:(3ΑqVΡ4:Ν΄?χ3?#Ώϊ+S  Πiκ;φ#eΤ=εε’"ΏώkΏVhΆ3F“c©ήGvΈθ6 *œA φvmΨηM»cͺΠΌS3 ’ƒƒπš†+εBj5ΈΘYτ">rίΉδΈξμψ§2FΣ)sά7i,θaό&)>#Q•ώ荧ϱ‰Šΐσr%η… Ό)?θ΄Π"‘Ά@ψ;ώΩS¦z„!‰•εa|5›YΛbπ±{8‘ΗšΖ ΊyΕ§%Π   2ΡKΌ (τV‹KΚ$TΙΑͺyθw&ΉZL\λ=b3ΓY\tί€ΉŠ=Θ#NPί±‰a xτό€ΠΥWΣ«ο3`+r?‘–•Ό₯σW,Gs-‘’NL3ηtΣM–ιΣΫr³ ωΟύ…LΎαJ±—¬ͺ’£¬…ψو©7;IXρB­ε‘ΐ”z­%Λ_HNοM!Ζ’‘)BFk„.^―χ±Ÿi²ό7η s~Άά‰E4@W^ώψά΄uωΪΧΎ&|πΏ'T‘;Sω€uΟ’„u5ΙΞπ’,oŠHO‹±GΧ)δcω·ίύŽ|τr±£p±ΆJfT₯VΈφk'Ÿx–Q1ΓΟ’»…δKUΜ}bφΫ)³œΖڱ‡'FΉ¨Π©‚zΝ¬±x‡-Εώ}ΝuH“%’›k†l‰˜Κ‹W―ε½>»»;?¬gΪHΔ„€aKBJoςαrΌΤpώ95πKΨρXŒ―υŸ•’£ž‰?Α”#G†š5?ό ΡΕΈpΛgGφYQΆ2i³(ͺ@χhΡ-χψΧΡΊ¨vωβ>/a?/5ΊzI‰ΗpQί6rΜ―O?σ)ƒq »‰š“Ω; /…k?‘1Ύ|©c©ΥjjUTζ.‘Ώ6ΛNIu)Ά¬h,bKχ«/ΔKδ)β!+cψ|οtSjŒW2 ήXΩΒv– ΞpGKi‹O†κΡ¦υπ }σxΚ rίcό edαΪbΥΞ‹N©•ITžήvκΨΗ>Χέ’&ΐ`$‘ήόΧ`nΩͺΕΨθMζ޻Kύ"£έββ]kΙΦV,ΑoIR …F3—ΟΧΉδXFΗψr_T†@‡΄ζξηγ"ΧΤηά”»}—Ϋ››ΐ΄ΜˆNξDύά¨Κ"ϋ8œgŒ3?¦ωΌ7ςPΰξŸδ­TΜ‡¦Ώύίό#ωΏώι?ε’²γžNώΦ4ΖVΉΏ‚'#³&”ο"²JΘv $ϋŠgYS.ې»λU– QYμξ,0θ€;#λη8‘JaBμ& ΟF>ɚ‡ŒΛFε%σrηΠΏϋ2Η’˜.ΰD©―1 ΣΤ=g’€qρHBpΧΚΘPV@%wF SQv1-8pΆ2/]"t Έ•~ϋΖ“η9„°“ρF6ΞycFϋΉgoΙoΦ?ηwώΉˆ‘’LΘΨꁇvU³-7βI:ι­bιτ^1ΣσίΣUm*]Σν­"§‡ΘiS4TY똱p·ε/S ³χΒχ©2ͺY[  Sv>i€Œωxω[΄αΫ6ΈΗZ»Ψάβεβγ$)‚Ό(χ>xΐρ £’YΑώZf–JT”Nτ<δΏύ‡PώΩούθΨ|Fzδž†Qbω™ι?Χ±(ΝD± λΡ1Ϊ’»cΚ”¬Ϊ4²ζχιͺ»Ωΰ΅»[‘DKwΟά {šΒε‹Ρʎ ΪψμrΉ·=ž7 Μ;xyπωβΐ–θ–™GQ2Ο₯„₯,Ο­ψ‚€° Φ\JAS±λkQΙΗ%vSώό­¦*'‹Σ—ϊΗΎsΔcΠνΟt?WpŸV™*TxŠ‚,/Hόs½uϊ}π_ώ—䣏>Š ΌΙΆ¨’˜sΕ΄@Ωύe&*v+9ή/vŽΏθΛ’Θ_³œ''vωπγ‘jœD2MVμΘ’MΖΰN3%έ’#ŠŸMΈ,,&γΟ#U‹)ΐš{5‰¬˜D§τήY°‘ΓVΘέ\–ƒ KΞY}†Ηοb!%i₯f¬θŒZO‘οKχΖΝLzȎΙ0EXiX±¨Γ?ΗΒc «@-I7?πΜδΕλWς;Ώσ/D ί%Φ#£ΑΚZIUΊͺ&­ΧQΉtβ˜e›Κ§ž=“—/^²TάƐO|βςκΥ+.Α‰BK}ι]=~œ™θη ‹°@_.E’χ™O?“―^ωŽ₯¨’ŽύœΉΏ΄½ŽcRΫ­¬~s˜xl<υ)y}wΗ' ¨ζλ μ;φέ;i™{ €`·77r=φθΐšΨΪΕtΘ\=ΌrΚ΅Pό³±ΨQΣB¬ŒΆ .θl’C˜……φ-l¬!Ϋk$ψΊQl0]™˜<Ί}$·77ς*T,ά₯~Ρ‡’% [βΕ|τδ±άέίQƒŠσrsΓJΡ ƒ1J‡h₯/$—•Ζ*Ό‘κ˜He‰ΉΆ6?°ΰΑ ³·\ˆ8ύΐ3:hΕiμŒκNΰΥ±Bqωqοp ;ΐ.•%’Uj!ς¦|ωά~ƒ%EΣWο'§;#vI[5btκˆ‹Μ‘n>α{ δRRα֐qΨ1ύ»+#TŒ©©©ς‚9U4£HQΑ" RIrNF˜Δw£kB)•γ†EA€Α;‚F€?OkMH­‹Χͺ†HAvn–αXΎDoόϋΧb¦#Œ]Κ8tΝΈπfΈ£ˆ…’Τc9’#…6Ή¬ίΚ₯\DYδκ!kHŠ’R#|*iΈqVΜι¦ΩXφ―ΉΈΧ΄“Ρs†x]Of«zκxl.Ž—C@³σœ%xžω@₯0‰rMo3wΎQ-₯j `ŒNƒ Ί’—’PγwήZ˜¬―ΎσΡu8ΰEβ6ο(wyΕkͺύ?οΧkΩνšt Z,•†ξ‘R‡)Φ n.Χ’/|ξ³ςπoʟώΩχdΕΛEέttλӌ—„„λZΛ’©ΆϋX~UŸƒΔ Ί“uΤ8Β°Κ£‘‚ΝF­¬-.¬4ΐω}½Κλ»;Ί?{|Q¬RQέ–©_oΚΨΦ—/^.ΦBώ+¦$Ν’C…ωn|6ΠνΣΝKΤF. mωΒ:γm…#_ζ`ž‹΄¨fIΉωrϋΘlž0θ¨.ΨyΔηδ„+• ` OKE₯ρΉx˜θ@\ξ‡κ©Ÿh!βA*ΐπϋχ³υ!λ˜ώ’Ά.눽Iόϊ―}ωΛr½^CξΫυzRΪV€}rŠ­Ž]Ω‚ηΓ3VκΟΔ]AG>x]λ€pϋ‰ŸxζςέT,r₯Δ<χ²i!œΘ¨ήσδN“k&5§}ψΘn.+ή‡d„‰Ν`LΒcAζζXDδž/BΣΑΚ7+μ©%?o³@hQoGδ©[ r&Οu…ΉY8t‘$ŒQMS €]­bη€ύߎšcr€ΌΒd Π$CΦTŠΪ­ ‘οϊ •εٌ‹.¬Œλ #ο@/•Ψ <,Œ„#FΠ r4€±k³sŠͺ%ΔΤΰ>οΡΕ“P¦ΔΨ+Zμ*Πq5˜ž)ΐ0&£‰ΔJԍΜ~ωRώόίύy,ΐ”}T2bΖC½ΕμŸΘήΟσΰK7)aF5έmΖ‡ωΒ„ΒDδΈ:Κ€h‡–μ~Hzξ†‡ JΔ–%β ¬LPΤ<€,ΥY+’_["†“{Μj>@;8—Hό΄4¨QΚΈ ~mv|αX"b‰Ώ `—Gy¨I6 C.¨¨,q(¦i+SΨΌL(œ„ŒωβZM•–Ωπn`Δp„UmUΈ΅ μϋ.s:ή€Fž’ŠΫχ+γn–ζQYΕΠτ$5Io©šΊ{dQkA©[AΏzυŠ9χΩΉ€/οYΩCΰΦNΕƒμ{£œšΜ­κSΒΕ(Ιh"‘ψαwί. =RΑ‰ͺ—.ƒD‹cq"ΐμϊΘΥAR'w­ΒΥp˜BΝ8Fη剀O+ΨrΚΪΚΏAπ2;epγ@‡ΗβSΰ΄ΟΛΝ(Δ€άW s,w*,©‘ΑI…!€¨Βμo—ΎΚΨ\Έ„Q™UT‰yΑkε³#εZ²±ε G$'Φ"£(#²Ϋ/Έφέ D'~ω*Υ'NΪ<tζ½eQ9γΧ΄‹ξοbΏyςψ9^±ΊΌRΆώ޲^\`B· #ƒιγ0@ϋLZΌ4Χλ•ν»Ζhͺ΅ιy@α'ΛΎPL‡¨^μVtθΛX,@}&Τg³ϊgŽHΟ D²ΊLd†Κ2-im‰%ΑsΦ#ZΦJ[묑Ώ’kΥ\ΔηzΞv.ΎVH`Sή©ήΖ ςW¨·κ‚]y8ΈΜ1Μω λ»\ψ’΄Κ,uĎ«ζ¨[ΜR»vV:˜CDΠΐx„’‡—SψΦδs7ƒ,&KΠk4=1—θΒ‘ίΑŽΞX%ξXKΖ7}1œ7'’©Κύύ=Ι·­Μ-*K7Vz—ΈΑ/₯_n;χz8T©Œ!Ř^/4°¦0λ––ΒtΞΧ}OŽ[1²Β«‘ΕτkΩ³mCΖr½Ώ?ΕΘBθ’Yρω@z‹Ξ0ΓΦ\Ά*Z’λ$ΛEΡP!δΔ£χ΄0FWyΓQW%%•”έ‡yΩu_A₯ΆfP!&Qΐ-iι@ΐ«²’ͺEk³@Α»6ϊ !”ή²UπΉ”–³Σw)08c’sΚN‹βBiι˜Η‡sq­€ΘEcr˜)3άkΔYΞ  xrδ©άSυ›ΗŸct@₯RŽ.)ΟλΠΪ—e[+ά:σ­y֘§£ ΰ JŸYGωηΞώŒRΣό3…PπzDΥM?~3*²^˜³Ζ€Wt7.?Μ3Ώc2‹ί αLGΡx'•°'μrxP»]B» d8ΦiG‚K_‡$₯»PΗ¦ι~sM²uΘκ\šͺΘ²;"³k™¨Fŏv[,πηΰνr‘―~ρs²u•»λG,ϊσ‚o"‘ 3Je„Π5ΕBe€€ΠňL‰ri¬hkwΕ5φGf^π€uΤ ή;wSΈ”M§TbT¦.ζ‹|φθƒ!c8ΠζLΉ#^­9˜΄W‘Œ‰§λ7ήπE{ oμΒ€τ6ΡΡ BuΌ‹†ž΅Έ/he ΩZ'ς{ UGfx10ΓXPιΠR€2OSrοZ™όδ˜δ8φ“Μz y= 9ξλDͺOF΄JI8 qJ M€ΆkΕ΄1ƈdΡ`μετ]6ΥΒT™9"Tˆ™ζFΚ΅ρL½a+χηΌ‘ΊΗΓ@Ί//ώPjΕtΑΡ9J_ΰ­Ήœš¬5˜ωκMRβχ"Ι‚ψ€<οAj°8C„ΔδΓΜ ft΅μ°@2τΖΟ}³Ÿ3Οq²LΕƒ­ζ Ί‡6/₯τ΅GΕ§§KrΠFͺjgΈ˜4H#«ξUSΩΥArpj' hα*m%Fvlγ„GΈξΧx™6>4ΐ¬dM:eI«ŽYTΰ>’•Ε,|Œ8’#K­‹ΫΌχΑ]ΪzΜ'1&ΒC‡Υ αΐ DoΐWΕν½h|\U^<`)fx|1yˆ„ίŽσ}ίe΄Α–ύΕΗΚΛ—―ά©^Ϊ*bkΚ/ώβ/ʏ~ψCqΈΣZ“ϋϋ{ω•Ώυ·δί}/bζΌXyΥA;Η‘ͺ·ΙrξΠœρ>2ΠO±ΙρυEϊͺβΞ=ΘΉa­%„τf¬J˜Q*”KΨ΅²²^E*ΏΚkφfωnA‰™;sΫcΒΌήύΒ*.nQνRΝΕ©Η^hRΩ…=\ΡΏΤαΗ‚ŒΛj<Þw²—l af†•ιEk=9Π©d ω/ΤgPΥsιgύAρ^΄"ͺi=€XσΧ„Yp^w"„p±Τ¨λc.ʚ±ˆ‡)ψ6`gζI+Δρ€CNˆ•M{TΔ yr ,z>ΰAΚΙLIΖΨ ¨©>όΒB>χFμ‹η£·”yš§>fžJ'W/εΖ)Rθ·Ož4$IjGtΘXWΗρύοΏxu„(Έ·ίώΑδΩ#ΫθL6„^έVΖ"·’©j\Έ+ž P_ρy;C^Y(Κ5Π #ΖS˜έ8ςŠδ»Ιͺwδ’Ω1< œΙ ͺbyέ4G©b&pbq ۏ΄aŒGΣkC:Ψe«8ο‘Q’[“j-'ο πύM‹*‡hρ#»³¬ψ ˆœΑ%γ=©Ry”§ΜΆ‘ΘΊIXβ⁌Xτd5DcΏ$Ω=`)ͺ§ξ]šrΗ‘δ˜₯κςοώέ_“?ωξwYψb―!EH€Ο’b[Ή ¦9y1=ί—8‹8©±L²Δ_™LA0 ΙΩ2i•ƒ―£ ΐA˜dŒκΕwˆEρ¬JvœZrBφcΚ΄]ώηᔏ_Ό”χή{‚[ζKt JΠβΐE;§ζσK-‰Ε<πΔͺ‡˜Y!EΎ‰*–­VΈNfɟ)σy+α7½πtJψ]ŽYP‰Άšϋά2Ψ^O…I\F ίA¨Rέw  †d17ΥB=χ²:ξΠ³η%Ξ„ƒœ‘Fε.ER„™• 9a^ΥLfQ+Ϋη\8 /p(͈g)ΛŒ­VΕ°[J–±°χb‰™txωυˆπTο Ι–Šn ’‹9σ E>wˆ2°<’J?φΙ ͺ:ζΓΆJQΉΐlηΜz)i{ΫΨNΪQ:ήγΒ@η•H°™φ'σ*ηαyΐν‘+½Bڝ‹GαΑ^GSI¬Έ W‘%dejŒ«­nθ<,ςΰ€Tξΐ¬X!@(Ζ(MΟ%.Β-( ZΒέzǎΘLj’%Rθ!ιAEDW … b…’f"GΛχΒK«μ"QγΧ"Η¦œb΄ΊρRx|Ή•gŸz&Ώ|‘‹τ(ΎωΝoe4ΒLw9Gρ’”¨ΣΏM…ί’€Εή=x\VΌ‰ΛΑ9ΘΛ\ˌ$ΰdνR€l1ι9! bΧ‚‹±UΟPΉΔ±‹ͺό8 αgρχ;ζdŸChMώνwΤ‹#Δδ6uRΣ ΑτΩθ,Ωλτς β†σ‡θΓ‘‚¬όH΄ν'κ¦ΙYέPg…XxΦLt@ΐάαU?Œ‹Ψ ΠγQςρχƒτNJ&…–ƒp=Θ¬ΦZ&ξaαM/ƒ΄« R/ήN&1&URλDcX0gZλ.—+τVϊ€ω)έPF˜u伟dγžDαžyxΐ0ši1’@¦Δεβ] fΒΗZrΩ..)%M@ItUyν˜<3 IDATγι“nšgΐ Ug©³Έ7[V$M3Ο;ςAV!•"5Eγ»Δ‘₯'ω¦Fόοδ2=©ΌcŠήGdͺGˆX|FΘθΖξαι“§ώμΕ†’—έόWΊƒ$Λeγ{3 YοΚΕ€/»―χ\²r‰ΡΠ~pix†’2―HuΘ―'’~‘ΤY.0Έ›™{rΐ„—ά―κ–Ζ₯Έ‡/‹¬8xhΚXt•RUQ₯zʘGB†e΄6ςD\ΕΓέ ψ4^`eϋAΏ˜Ω’_|,3θή;sαΗ~ˆi|YQ1²ψ\vN |h%­€]Bόw(ΘδCΡX’ZαΗξ΄ΒR!un1 ΈΜA;¬±Ύ+>Γy,fΰ\.—"ήh©Έ’Ψ@˜ι’Ϊ~ϋG?"BίGε1 ήέ>ηί•a(˜ΧI¨( ΔΗLs1JΤ€ΖhςΨ΄2&Jx_^«₯ΤΟ΅Ξιπy·uŽ f€§i±oš)UUš›„Κ˜ GΕΥ*”•Q˜™ΔNKΪQψύό}‹χΓάvξ0PQα‘D―ƒΚΪJΪ^/ͺ‹eVΜOvμ2“ΪτΡ;—΅Xδrfί€aξ|P\ͺ9YIc&ξΗQ*ρĜ@›c­'A€˜ΩBF –O+‡ ½9Q0 mRΚVέCΒ˜ύΰ( j.«vmlΥρίΥΰ'ζ²KͺgκΎλrΉψ―™{.ΓUe•΄: ΎŸ>}*―οξˆΰhؑԊ§2©q«bΉTeΘQόo«ΘΆΕD–$σΜΚ»ƒ?‹#βp³/π‹’Κ± α‘•γΊˆ½ρ!χ‘½,A”ΈχZφ@ͺN’ΘwA«ΕΚ*<˜QœŒd8Ε"αu˜ͺ·’€θΐ(έ`R°ςyyžιψl{χgR υΆΚ†I‘ŠψW&Ib™pθ2B`'z>I;–’θ—φvRφc£€½•¬qT―Ax–θάφύZ¦ +P1ƒwσ:η?ϊ {oτŒΐ~―oO=ΗεΰJ?-eΤ2'Z{ ^ζ‰Œ%+‡φ© κ¦‘ζΌάhωλοw[Η2ί—l™Φ%ΏžaφFτ@Β’„?Χά§t^F)…j¬ki3-όϋθ[ξ[²«IΗ9’ΩPΓΘΫ~ΊαλeŒ Sh―™Ζx85σ(‘QΜ—^S~ώλ_—wίy—‹c«XχήSΊr.;… 6HS±όΥtΔΉ˜ŸΙs©ή`—‡…υ1ΉGκAX]e+±˜@βkβ‘Ιi6G0qik)j0«Ÿ%oqΉΈΜO#₯‰wHUΘΧgυΥέ]IΒKΝ…ΛπsFp―³β"’Δ ψ’ΟΧ“Β‡ϋ/didΕΫOO ;5£"IΛH=­‰΄1«;f߁ΚύŠd"έ²sΤκΚJ8»’Pχ”ΰ΄*+ζXΊjI6m ΰί‡_εφ­!°W’Jϊ’–|ξ3?!σ˜Α6Svj|†WUieά‘(*ζ ζ–f”­;”…Ξ€)|ΐ9ݘQvΞΒqw–ΰΘλΡΒ”«†δjœEwΐRˆ ²““‚$iωΨP’œτj-„‚„Έ¦ΠJβέιΫ£›ηh1ΦPΎΠMLτ”–†°'…^Έ(₯H¨΅\θΦη΄\/.NόžysήZ.ՍͺΜΚỊֽ5ώšqŠ&9ΞΠ•5φ.‘Η';fŒPγdkξ‘–“qΜΥξ Nω€Ε²Έ= ge5ΣNΜ9-Q“Μ8f6‰₯―Eύv d»Κ;οΎUΨΜ<φα=²Œ‡ˆWλ3ΝhρgaδXƒ²ό‹ε»Ά€yޱ‘Ÿ†₯xbψ³}Φ²W©ωPT!€ΛΊ#$₯•£uN°Βfƒ]!T>ΥlΧƒ5ΆMFqcY>ΒΩbœΉZ–0Ο[`,&5΄eΉ€M5ˆοΰ Ϋδ{\x³PlΠ #˜<Ιɏ+πθžΦ—/8_ωπ)Έχhε,€¨šΝΆLš\uAk9=˜ψ9Β@:Št—Τ_Wwˆ΄Dz|πηpΦbΗW’TXυžau½qj8dυ2%ΣaΒ¦©ΙΛW―dίgH„aJ>’ ԏ­GΕ–ηcΔε)3άΫGμ'W9/γŽEΆ]NQΌνA c‹-X”-Ν‰&'Γμ胆oΰΛb42£΄σμΖ$L@ͺ-±.υ;ΧζΟlΏyκ>ΕLθNC†/)*™l[!ΠfŒcΊGψd†ΗζŸώ„’!G‹†%L>Έ<φϋ{ΖΨ’©P„IZϋ΅(7N@h°±πjM€E["d κσωχ~o—/P‹ω1}α2½ΣθΈΜ’°΄™%°»'ώ³k9αΤόΟ‚¨ …χΰ=Δ€ «ΖžŽΧ™Q=·Π Ώΐ Oj²§±Bm}‘…‘›ΙΝRΊθΧ ύΒ±žXΑΔL»PrΞ½NXp˜±rl’„εθw޲Š™ΛΪψWΜsΣd™‹L˜CΓ#\­;2Š₯ŸTΓ`t39·―;„vΚ­ΖηŸXŽΞˆp’’BΉŸ‹Ψ#;ά¦-ώ»Γ³Ο χ £Όœπ΅Σs%’Ay0v€\££YN`Ύln|Εt~0ŽgqšΧQ–­•·ρ’xν£³₯:T­Δ\ΟΔ€Dšγ™{Ώbηϊψɐ."wϋ”qTzI₯ƒƒ`Ν°¨θΜΛήQ‹tΪΥ‘1>‡±rVOŒ…ΪΡσ’0…EάΎ{Ÿένν­Χ= E-’£<ό«Ώ‡4]i5)DΆ·€1cτΥJ\?‡ΈD£ Ύb7U‰Ρ,EϊΝΣ'Οy p!L^ΓPΚ,3G;ΛkΏ½|Yιυ{ŽξŽσˆEœϋΞκ’F­’υ²©ζXͺUsAθƒ6ΊŽ}Ύψ₯/Ι~%Ο sc>¨ρ €€εΘ φ,5ΜGγE}ƒ™Π‘‹ZŒnΰ‚Οπ¬~2xᰟΥyΉ\(§λͺrsΉαΑoο=0Ξiš¬©{l«%σ.Z›ΈΒΨQ᠜kΊ„ωτχ3ζ$CΧ_5ψΙΓj'Fr)hq˜ΔεVΛσ΄ ΚjΟΩI’y ύ„’ΑA\εŠs.JVαNΪ%…3u!‘Ώ'π¦©4Yα†\›Uc=xqiΑΠ#A/ΐ}.hP’»)ynžρa¦§#₯΄q±3 J3<(Ν’rςeWψθ"GI΄ƒR Dgj.g]‘’ꯊΓ9«krDdJ+¦<[V’ ;yjΐ‡hιΌPΧ1 P1ΨQ!`MUεεύ½όoλ"_ύςgδύƒoωߝŠζž ˆcŽΒ«€„QδήHLΕψ Ύ³jΒ¬ψŒΒ*$”k‚ΐͺ`lΘ[Ι05οX˜)TOAύ Υ&NΙΜY™­^Π&τ5x‡Xb,Š4Ξ± ¦ΐ"ͺ ί+ΔZmςΡ‡:«(ͺ£Χ‰ΆοrΉxΠόšΡ€1 ‡Ε(γ'ŒΎ2οωΘXUΙ vAQ…/Αγ3d­ΙΕ33†Ρͺ‹Θ'ίzS^Ώz%]U~ξgώ=yωρΗ²―Μλ°΅€!\klE­‘ew”NR‰hb^ 1Δ,]€vaΊT4ΘΞj4… d–…θΐΝ†^b!>β’ψΪ—Ώ(Η~οσ΅(ΡΖ‹ ȟ½Fΐ8Μ%*Š•Ζ‚B,σ7κ"6ρ rΊT˜‰^\η³p§[€½ω,9…v4Ρ8³ήΆKΙ›ΙT8tcl\"Συ,š•ο‘ΛγU’π„ΈξƒŽUXg?¦Š Ž™lˆBΘ₯½iλ”‘£ŒΏ‡…‘ω$‰ΉHD°¨Σ€Ί ΠS•“πF]ό³ψ{§7’δ™Š„Rή ³ι£K—?ώ7"oθߝςβ[Dœ¨¦C{ƒc‚œΉΞΕKΙ‡9Tc7Ϊ#»όˆόsˆ*ύ· Sˆ υ~FŒXqροΧ«Τ%‰ΖθgEX΄k tK"o4Τƒ"(―{L10αοXϊ¦*¦Fω;ΌΎ=zτ\γ/žsE`8ό_/—K! f²*άσή΅–\ΖζΈ\Μδ'ΏψyΓœt‹…Ό—ž‘½V("„škwRΞ±aυaΒΜ’΄σg~D•£IqΘOΖ=&Š3h*  a³ΰ»’ΕωΎ€Ε‘\/€2KΠ^χΦ9KGφG ΰΧϋHŽCφ5ε.”?Gf[+ ’ΐ³°Κ?Κn¨S ¬e,†χ4wŽ Œ£4qqΰe]fδXfαΐDK"σ‘+_󐻄_ΥTξξξεGο½ΟC™{•Σaα;ΖΘsa4gμsZΉ΄€ΦJꝝ2ΊOaIeΜ†.‡ΒΝN·Vς8ΤΰBΛj.ίCI/P ΰ’pn§ϋ‚α‹ζ₯¨εμ½E$oΒιΕψ3|/­ ip1tΈΤ{§ έ& ω*τ–@iΉΒτSq/yiηί5Ÿ +X•’¬š‰–§²Š”W#fΖXŒ,©J*•’ψ9\¦[:m$ΎωνοΚΫο~ΰ—mo'―%Ε₯0MͺΑ*JΠŽ P*φG8<΄\ΠV”ƒ­©Λβχ#¨Γ%ρ³+:‰ŠbBi0¨zG,πβEΏέDLB(Ώ€PΟ1KYΕ|hΕW„ BυN3gF~ ¬r6e~β³?a5ύ <,x0pKcަŒ•”ψ!EΣή,π­wωΉŸώiωΦ·Ώ-€…Ž‚j―vͺ€Oω`Iaρˆ½Iu·Ν"jB ·y8€l z2μNπ€ŸO«ΜΏq3DFμ4wD°/η먘Q¦"J8C±S#iq°`\a’­_Τ3M“E:‰έΟvΩxŒΨνλˆ–z+ίW€υn(y,d•k*F$θλΑŒ•N]+α˜[‹ˆ\C.›gD7M:ΊΊΎ±ς―g†l2EωΑΩ_Νo'―QΩΣalΓ½M,Ϊ>煁•μpŒ˜πxζι¬ο¬FGOaάβζˆ<†»rˆΚθ5/ήTXY‰F.ωΙOR~Φ΅fGΝΙ†‹»ΔέάίZ¨ΎˆžNB¬#°μ(Ι€<ΞЁ©Ω?‹IxrϊDΰΰ.Ρ_ΙE–{Π2 θ‘Λeϋ±€¨š―"’‘Žτέ@€ΆLή|σ ωθΕ‹ŒMJίδ4†β$ŽT₯’«i½Ώμ•L9κΕο#8abvφΒ@ κŒ‰Ζ Q0+Pk)γB„y §Π4*΄& Bt(†°Σ³$/₯ΰ‹ΜŠB€’j VλMϊερΝσΌ˜TFίdίο)Ÿk ΛηΖΨOT°³T―)Ο6V-#ώ"ο~π>χ by»k\8jΚ«² #€Ε–4ptz.ϋ*FΎ^ †bnŽnͺfq#ΫΉ+©°Tc%;¨bˆHHοH†θ3£™ΜΌ™\π¦Ώ#3;R±˜Yδ©DB7wΠίaΕہN;E6ιΰχsIȊ£aΡN$YΛδύ¨™ΝΞp=­ά£#(" Y-cU}ϊμ-s ~gӜϋ™ ΌtQLHA T cΫΈ\΅R9α‡Β|δzdg\³E•Ήwθ­“¨©Λ°Jnͺ±M³H™₯)Ÿ9|J p-aΊZq’bͺΑχ߁’•KͺŠ<ΗΓΠ–l}“·>ω¦ˆ™όπwrΉΛρYδ€·TmX©NP9Ž1Δ’υ—Lοϋ¨z|‘kTΔΈ}γb¬΅MιΰK3Y ŒΙͺ—UŒ*zq[piWΗe;!ΚaΘΚ*/:+ψ”*@j¦ŠjŠ9³’’υEςhξK‡3WyƒΑθΈΆ[jo|_RΌ‘TΖα`s•TΟ‘EΜΒgMι΄τ$Υ‹”Tί"KΖ³Wr%³Β™Ή;αx^_Ιες†μΆ€ˆ(ŒgE‘0{Β°ˆN}‡ρ^θi”›’νΊ΄GG„±ή(–€)‡_?sk‘ΜεA€†dΏaœk'oG§•‹»tVZv`5qqπ`5šhϋh>Β299Ρ‰ ‰"QΥSήΗτQξ\λCλq ύWΕS¦PJΞb‚ΔH”>Ιμ$Ÿͺγ’MΚΌitN—:φW5E„ŠJΏ<Ί}’9 s_[0’μ(0·˜™ၗ8ͺJΚΌHތ‡~Ϋ„3QY±δKΖώ:Wλ …2c  hiΐ5˜œ(’½u#hH±λ1_κn—r˜6LzEFλrΜ«Lˆ$3ΦL ³“AΥ{€;„‚žhΉlεΈbςκυkyωκuͺV˜₯¬`‰ ƒζ bτDO>1σ=σ‘ΓBΊrΟxnηUπ`¬ρYk―H­ϊcAΜέΫGt»0 –ζΨχ’ .Π+FΥ>hPΤ€Up@£’}“΄ν4/, Ϋ›ϊχί΄ΉΠ"i|ζZ €M=ωΠbG3χέ‹•ΥΕ «›Αb²8³ra4Vβ˜ΓWQAΒ]<œ7bhpαI<,rt0W[s+"4dž‘ΙgRΙ{²³δf₯DΣι8€ΩIKMaξ:RŽ«"’™*_Ά‹d’mOCαIΘΰΟSoMbf—ώ:§+.-oΒgLΓTΊΚΩA9¬ iΜΈD“L€')οQrRp¨ƒΆm]δ1›ΌtέnςλΏφwδ_}σδ26}°“g°V€ ΅όΑV‹kΙΔOaΚ€ρ{πΆpΟ₯ΪHplau­Z• D±υΛ ζΰ§έ>yόœς΄™@Rm‘%rUΛHDγ|;·žšΊ|e₯©€BΒg« œK…σVφ.…%f£ep©’ΜΦ‚“Hf?°ˆΒΕ ‘WCώΛίψ yύρ y£½Βޱ!jŒ¬={ ξΑόAλΗΚΝμTE΄–^hΪΡUt*RŽΣh.t'oD9@9ΦΒ B^φHώyΗΆ,J,υgΑ…Χ›|6δΗΜ~;΄ψ_˜k@JQx‘S›œ ŸvΚ+Ρ“Œ1>˜Sώ‰εxF²€n€0Ψ%·r¨“E%.`μWj• ζΪ}˜½7ξΕ`d΅βΌΖΆz(ΐbΆΕJw‹χUΰg0¨<«εΘΞ #؞QΙuτ—ωΩ-άή>’9΅i§Qte2 ϊΘάψ2ϊSmt‘γ²Θ\u“ύΨ™η!f§j\Γx‡Yύ ŠhF^»Ÿau―°Δε6a’,ΡΛ0μhŸb/ΰEpg$,D1χSθXGN[ O&ρuΖekuΧί†ΨΪešΠη#ρύ}ηOώD.—gΠΞέ:mΈ\.Ω™Γx¦Ϊ››Ω―ΧςΌžs~ZΛsΠχ©9&·’<šˆy;e&Ρ#ˆΟvε~€Α+Q·λLϋΒEjͺΞ­‘k‡iŠ)ρ­&,Œ&°tΥδΪY|˜Εb9ˆ‹ ’ΧqΉΘvs‘ή‡\ο―eή§fΓ“Q°Κ"©†B‹ŠyΉτ&O=–ίψ;[Ύώσ_—Ήƒ¦ ή>Ÿγ˜yΑυR^8Εχλ5 = ‘VœΩJτ Ψ^[όαζF•Ή “<$)Yμς@’έΩaͺμW?ΖΈ82ά»5©*Τͺ²+£Πt+[FΙΪ*i‰–„ά…Π"N{χ=ΡΨ6-„ΊΞŽRΰ}1κ*.l0ωV1ηΡ,Ε?Φr΄8ΊΣLΟmn?€$ή8ŽdƒŸίRc&‡R\YH‘δgΏϊYω'ένΟwΕΑƒ£Mf)Ϊς°–Σήζώώ>Ν½s§ Sl•]cΉn…OζΕaρυ<@™΄­θzvΔ`d!τlςEίnožC‡ξΗ ϊICͺ^QŽ 2Υ°ξ+ΨL$ΈF+Ό&ι’ψ³s41σΟ±”*ώŠω*lό’zv‰q”=kNΝΝl0猾ΙH'ΈX‘κs60g”²ίjέΏΤvZHJAxHqΆ“rJWͺœά£»Pƒ€9_"Ζμ060Ί˜―«ΣΗΘ£κΜͺ"(pΙP–Uμ@‰"I§{|^£Ω’ŠΖ ΈΣa.ςιgΟd­%οπ>ƒ‡zΜΊ›ζRΥγ%ΈI·΅XόIŒŒψ•¬ƒ&ισ€¦ήXΡMyΙβ”Ήd›\χ«HoiΜ,ΈmnΐΒnΙ㊽hθμΞ Ί§πΏυš7—KΒδˆ)Ιe?XjΥμ†Λ Œ{R"RΦ#?ƒμ|ŽTφλυDΖfΔΆ …‘(;vDΏ"Ηܡܝ$HρTelBθ1Γ°[UwR(9.ŽΞΧ2›Η¨`œ’eΏ ’Ό+aGη…/YΓΣc%ŒΛ*x*˜ Bc­”3Γ&& σσŸώΞςΜN½΅Σ`a Ε1Ϋ60ΟΐΌ=…Y—£ύνryφ—IŒΛ<«έ'β‹ŠU\D'n• ΗΣhρZQOνDaNA€‡Δμ5Ϋ”χφά(+Νxk\#TžpαΦQμg‘ε.aΝ„†;+¬₯–)ηΎ °μO]υƒΞΚΎαε«WrwχΪ ™…›₯5Ε±μƒ°ΜΞ³@ΦΚ(Π ‚fΕ;s«-/qψnόΰ˜”?zEέ[`deΰ΅μHΜ‹ΓΌ rφ? f™šχΘƒpF˜q)_Α–ψύς—’ΘS•7δ”@‘hΙ(7Ξκ‹’'>“Z}vh9;—“οΑ?·Da/(ΥΌ9ηΙr+i†Fγ‘ϋiΦωb’ΌPkόj­ΠψΚ­EU<…4!Z¨‘―ωέ¬ΣBγςXζbqR/ξ+Š0aaΘ¨Χ‚}ύ8φIDATɌˆόTΟƒ\䀎ΓήPΩΆψ%¬E•Ώ^ό{^Aϋ8σπκΨY?5qή¬ά]†\φαδ»φ]ΉΉΉ HιL#§Υμš ωάκΩ§δώώρΪGͺ³μyΆŠ^βƒYΗJeͺ6±Σ?“J:œψ0SΆ-$Q47ζ¬’“P‚δχ=[Xθ ͺ&οLζασLδχŠ«)œΫΆε’Œl!#k±΅xθ•*ΐGΫή°°ZKΦ±σa›ιι£ΗlΓUΥ‘0N-oη£nΧ©ξώλ{©ARΕc°Žι£€¨ˆ;˜ϊP«œžBNΚ±I8:cμ&½ƒf( SR_>œc1ΦΓΓ‹έ1Wš—bΖ "©•rλ[Qš@-‡?OEdD؏-|·φΓ–±’EΗƒ1π2\NƁ τΏ/e—\#έRlqΔΧ<φ¨t“ΰκ9\<Βϊ˜Α%οPkυζΚ1μIέUbΎΌ½eΑqK¦οK‹Ά=ς)*_etu(*ΝΗLν²m%k½L5g™ΕΘ₯§¬ͺ;tfζsrΙ³ξŽF˜oWρDΤ€°egŸΖ)ΐυ0„M;c Ή8!ΞΈ½½%tQ΅Ιe»H›_Lq©Ÿ žΪD΅Ηx Α~ΉŽmKTϋZeΜTΘΧQ˜ωn¦p„κ­ΙΗ/?&,•8χΙU/Gπ―_ΏΞεxtWψgT™ΠΓΙsέHψΝθ†Ρ{±JDρ-‘3'iD·¦ίCϊΈlΟ΅šνŠΉ­‘―—”0ΖΘΎαœlkM~λ·ώ+ωζΏϊψE9\*ΦΚΌλV*2‘JXΪzΌˆ¨Nπ{ΡεfΫδιOε£—/ό _ΩS?T5ϋ@₯β€2GDŽAksvkΜΣ|Σ fu‡Š·/ΟήΉKΐΛE*-*ώ{u,Š£ ؏KMgc¬ΈB–ˆTΏSW―₯Fc;6Ώ„H• Z\|^>J°ΒRRΚ¬“ ΧrΟ€6ί Εη$ηΟMΦ:‘Hˆ ͺˆˆ8΄Z,χzμ•°ΐΕ΄[].Ωi «φ.εœζα6B95Άq’³φΦ …ΨbΌ:qVψβ4hM3·‘•΄K‹UΉ½Ή‘ή:‘σ«ΐ:«˜ΗAδVς9Ύ’ΔσKQξΝβΚ§ω3ή9ΜΦW-2j•ycV0žZο$WÌ9(0Y$Χχy: 1B”tΣΣYTG)5ΩtΝ¦{ΰVΠoΫ&77Ήξ;GuœŸS¦ϊVj5Λ%"{vλd΅{ΰ™ͺώtpθrŽcʻ゚`JJ•Π³&NΘΠ:BδͺGf™„‚ΟιΎ3+Fd9ΉΟW,όMς]&O¬Ζa)VU‰ύω/|γςώ»οΉŸβ$νJικ1Q%d””Š˜|λ[ίrοP§ ιΔͺm–²RΧͺ³8›KΎο‡Ό|υ*ͺΈσL„J)•\_aΞμc(-E‰φN’©ž8Xf‹Ψ9şg‡μ, Ζ›£#dF‡;Έ&©79οy.aψΓ‚¬Jaηώ”Ss9ΨbǐaMθ[@Šiώ^ΉL.ςSaT•t5ωOέεΓΛ’‡ °χ.Ϋ6δ²m9Ί ΧΜ;\²[Θp½ ηMΨeω’5uλcτ%›C}ίeΔςœΘpΝCγΔvkη^lDXϊ mO[ L“Sr‘ζύA.£†Ξx‘Oϊ™ΘjPd†k *Ι|«ŒQ‘ΌΙδΐΒM*l,h{žW.’€ΎLμ%ΕΤRΪ_RςVtΰΏωN£sΙΜ \ψΔrΜ“]ίέ1ΉΏΏ§¬»JΨγοՊ!;'<ŸΚ8WΉ]οοι‡Β8jŒEρ\ ¬υΛƒΒ „.œ…>>“BWPŽΦp¨Χ0*=uΩρϋŽΖΟB€Ό<³Q˜Tζ-Λsίι]1ΓWΎσΛBΖΫ{—Ϋ›[JώœΫȌ‚”3ηyœcΓΟ±΄μ‘‹1‹[χ+_ωJkCφΘK·kYŒb…Ή9\mε‘b-φ…’ΞΡ Z$)ӈΙEUŒ½F`⛍v0Ί1†k²κ’pOw’'z>P+C­κ僃”ξΩURΰŠbjΩ*ΩJ^_ΜtˆψWd*€ο”‡F&2˜O€ΪiI[Ι¦@όŽ™•GŠF|Σε$€lVΫ΅¦οaΔ!w+ώΞwwχςκυk9’ŠΟ p""D.ϋ¨ŠFOžσΧ‹9oίχψ 7„Ρΐe»$ψδΙωΥ_ύΫφ˜—FσεδΑˆ>2Ϊ±D₯»©ˆA •Ξsͺ·A‘Δ²τΎX,%-Ό?ψΛΏ”οΰϋr½^cλΔj¬άКΟ4Mr5²!Vσμΰηβ4:%cΊgF €¬Ρ+ΔκθΈ$RΗξkϋQmIΓ)Β’uψs΄ββΟ™ΊR}i’ΡdξΝBn°tσEQƒύΒ<ŽS–8σΖ}’š?E7H ΅UˆKφΘΑEbδͺ-vκR/ΛγπΡξJώΧ΅\ =›sκCΩΕJαZ^l™y”ϋ#ώœΊ—Πή#šb1RaΣ ™/}βgEα3I³6yλΝ7ε _ψρζ›ςήϋοg‡XFrV6[™αςΧζ\ΐc?D{DGjyοŽci=]δξ°χΟk΄.Ÿϋμ3ωψγ—D―ΤΏ/ΝΡρμΏ|ω’ηrkCώόΟ"D:^pŒΡeξSϊvsσ<#ΣωœΩΧrZ–VOR%3aΫ6—ΉΕΏ²Mj]>ϊθCv1Μ„†žšqœ™>—Š€’„XΪ_¬‚L‡[Ύ)Aό^Œύ„άΟμΤ.)"ž½π"-.TIEZτ­Ά¦P1%yΧ²Σΐώ§·ς³¦BΝG]3ησsεΟn™νA4nbΚ‘+YΆψkA8g»ŸGΌ­•0šβνΐ³Π’™–ΫK'Ή³ΰž£¦Uͺtθa^ΕNŠ9ΧE΅dΜ~ρκ‹˜α>s1@,ψκWΎ"―^½’»»»—Ÿ₯’Ή€•j>»έ7‘ΰ@•XΛYλδ΅A…1Ϋa+ΉJSnΕ s,Tb%FŠΧ*jP±Σ#δΉ/!³YfΪJ—v]“?·Ό·Χϋέf˜φr£ίψτήzΆΔ ‹Χ T!ΐzφά€Ψ³ΑF±ΘU_E`A³εZΗΫCΔa~γΑVΣΤ=ϊΒ;ο]@›ΐΤ ²ΆD‹δ@rΗKΚρn‘€hbF@—!½ηχ)||†β½©σ~Κ3F―,κBPα€gΕ= wŠ1ͺUΑS΄Γ *eΐ”z:;c­8 ΛMΦWTvιβρδIυ[ߟ›Έ‘r€ έ”[0cwε`¦T‰‹"Δ— ¦ΏϊŒG4RΜΖβ@Χ9A•β"3Œ »¨Ζ΅E‰ίΒ₯½4cββΩ¨’wΦ¨έ ―€˜ϊšΦz•{v¬ŒγEδ‚fQBΆ>ΐ•K‘ψ–ΨšD-yfƒΨÞI;Αnοa¦™(R €_˜u”œIuLθΒα]jΞeEu¬œ•z²_*”HMβ.=nOOOΆ|ΩΣσspŠWϊyςοUλY$ΜuЎ0w{ρ]Μ3:Œ­ၖάδ¨,Cp)1“"WL?Aa<"nζR1“ΏƒΜύώjί__¬Χ–'’ÈnΠκΧz =АFκ„Ϋ/θšY B*|h%A΅ΆΥ4λL*ͺ`.m™{Ψx~h7έοΗπ[[8&Ο› 6ΓΧ²&fE¬™νέ(”<ͺ‘‘1½πaP‘ζ ³σ\{:όΗΝ>ی™CωξΚψ—uγΰCΕ‹†:ƒσκ!Αη:g2=:²/Σ<½6 ¨#|>%–»1ζFWˆqΈ%<ΊΥΓ Χ0n“^IENDB`‚bat-0.25.0/doc/sponsors/workos-logo-white-bg.svg000064400000000000000000000067101046102023000176240ustar 00000000000000 bat-0.25.0/doc/sponsors.md000064400000000000000000000012561046102023000134370ustar 00000000000000## Sponsors `bat` development is sponsored by many individuals and companies. Thank you very much! Please note, that being sponsored does not affect the individuality of the `bat` project or affect the maintainers' actions in any way. We remain impartial and continue to assess pull requests solely on merit - the features added, bugs solved, and effect on the overall complexity of the code. No issue will have a different priority based on sponsorship status of the reporter. Contributions from anybody are most welcomed, please see our [`CONTRIBUTING.md`](../CONTRIBUTING.md) guide. If you want to see our biggest sponsors, check the top of [`README.md`](../README.md#sponsors). bat-0.25.0/examples/advanced.rs000064400000000000000000000010411046102023000144030ustar 00000000000000/// A program that prints its own source code using the bat library use bat::{PagingMode, PrettyPrinter, WrappingMode}; fn main() { PrettyPrinter::new() .header(true) .grid(true) .line_numbers(true) .use_italics(true) // The following line will be highlighted in the output: .highlight(line!() as usize) .theme("1337") .wrapping_mode(WrappingMode::Character) .paging_mode(PagingMode::QuitIfOneScreen) .input_file(file!()) .print() .unwrap(); } bat-0.25.0/examples/buffer.rs000064400000000000000000000007551046102023000141220ustar 00000000000000use bat::{assets::HighlightingAssets, config::Config, controller::Controller, Input}; fn main() { let mut buffer = String::new(); let config = Config { colored_output: true, ..Default::default() }; let assets = HighlightingAssets::from_binary(); let controller = Controller::new(&config, &assets); let input = Input::from_file(file!()); controller .run(vec![input.into()], Some(&mut buffer)) .unwrap(); println!("{buffer}"); } bat-0.25.0/examples/cat.rs000064400000000000000000000005251046102023000134130ustar 00000000000000/// A very simple colorized `cat` clone, using `bat` as a library. /// See `src/bin/bat` for the full `bat` application. use bat::PrettyPrinter; fn main() { PrettyPrinter::new() .header(true) .grid(true) .line_numbers(true) .input_files(std::env::args_os().skip(1)) .print() .unwrap(); } bat-0.25.0/examples/inputs.rs000064400000000000000000000011621046102023000141640ustar 00000000000000/// A small demonstration of the Input API. /// This prints embedded bytes with a custom header and then reads from STDIN. use bat::{Input, PrettyPrinter}; fn main() { PrettyPrinter::new() .header(true) .grid(true) .line_numbers(true) .inputs(vec![ Input::from_bytes(b"echo 'Hello World!'") .name("embedded.sh") // Dummy name provided to detect the syntax. .kind("Embedded") .title("An embedded shell script."), Input::from_stdin().title("Standard Input").kind("FD"), ]) .print() .unwrap(); } bat-0.25.0/examples/list_syntaxes_and_themes.rs000064400000000000000000000006361046102023000177470ustar 00000000000000/// A simple program that lists all supported syntaxes and themes. use bat::PrettyPrinter; fn main() { let printer = PrettyPrinter::new(); println!("Syntaxes:"); for syntax in printer.syntaxes() { println!("- {} ({})", syntax.name, syntax.file_extensions.join(", ")); } println!(); println!("Themes:"); for theme in printer.themes() { println!("- {theme}"); } } bat-0.25.0/examples/simple.rs000064400000000000000000000002611046102023000141320ustar 00000000000000/// A simple program that prints its own source code using the bat library use bat::PrettyPrinter; fn main() { PrettyPrinter::new().input_file(file!()).print().unwrap(); } bat-0.25.0/examples/yaml.rs000064400000000000000000000016211046102023000136040ustar 00000000000000/// A program that serializes a Rust structure to YAML and pretty-prints the result use bat::{Input, PrettyPrinter}; use serde::Serialize; #[derive(Serialize)] struct Person { name: String, height: f64, adult: bool, children: Vec, } fn main() { let person = Person { name: String::from("Anne Mustermann"), height: 1.76f64, adult: true, children: vec![Person { name: String::from("Max Mustermann"), height: 1.32f64, adult: false, children: vec![], }], }; let mut bytes = Vec::with_capacity(128); serde_yaml::to_writer(&mut bytes, &person).unwrap(); PrettyPrinter::new() .language("yaml") .line_numbers(true) .grid(true) .header(true) .input(Input::from_bytes(&bytes).name("person.yaml").kind("File")) .print() .unwrap(); } bat-0.25.0/rustfmt.toml000064400000000000000000000000251046102023000130540ustar 00000000000000# Defaults are used bat-0.25.0/src/assets/assets_metadata.rs000064400000000000000000000054231046102023000162630ustar 00000000000000use std::fs::File; use std::path::Path; use std::time::SystemTime; use semver::Version; use serde_derive::{Deserialize, Serialize}; use crate::error::*; #[derive(Debug, PartialEq, Eq, Default, Serialize, Deserialize)] pub struct AssetsMetadata { bat_version: Option, creation_time: Option, } const FILENAME: &str = "metadata.yaml"; impl AssetsMetadata { #[cfg(feature = "build-assets")] pub(crate) fn new(current_version: &str) -> AssetsMetadata { AssetsMetadata { bat_version: Some(current_version.to_owned()), creation_time: Some(SystemTime::now()), } } #[cfg(feature = "build-assets")] pub(crate) fn save_to_folder(&self, path: &Path) -> Result<()> { let file = File::create(path.join(FILENAME))?; serde_yaml::to_writer(file, self)?; Ok(()) } fn try_load_from_folder(path: &Path) -> Result { let file = File::open(path.join(FILENAME))?; Ok(serde_yaml::from_reader(file)?) } /// Load metadata about the stored cache file from the given folder. /// /// There are several possibilities: /// - We find a metadata.yaml file and are able to parse it /// => return the contained information /// - We find a metadata.yaml file and but are not able to parse it /// => return a SerdeYamlError /// - We do not find a metadata.yaml file but a syntaxes.bin or themes.bin file /// => assume that these were created by an old version of bat and return /// AssetsMetadata::default() without version information /// - We do not find a metadata.yaml file and no cached assets /// => no user provided assets are available, return None pub fn load_from_folder(path: &Path) -> Result> { match Self::try_load_from_folder(path) { Ok(metadata) => Ok(Some(metadata)), Err(e) => { if let Error::SerdeYamlError(_) = e { Err(e) } else if path.join("syntaxes.bin").exists() || path.join("themes.bin").exists() { Ok(Some(Self::default())) } else { Ok(None) } } } } pub fn is_compatible_with(&self, current_version: &str) -> bool { let current_version = Version::parse(current_version).expect("bat follows semantic versioning"); let stored_version = self .bat_version .as_ref() .and_then(|ver| Version::parse(ver).ok()); if let Some(stored_version) = stored_version { current_version.major == stored_version.major && current_version.minor == stored_version.minor } else { false } } } bat-0.25.0/src/assets/build_assets/acknowledgements.rs000064400000000000000000000146251046102023000211400ustar 00000000000000use std::fmt::Write; use std::fs::read_to_string; use std::path::{Path, PathBuf}; use walkdir::DirEntry; use crate::error::*; struct PathAndStem { path: PathBuf, stem: String, relative_path: String, } /// Looks for LICENSE and NOTICE files in `source_dir`, does some rudimentary /// analysis, and compiles them together in a single string that is meant to be /// used in the output to `--acknowledgements` pub fn build_acknowledgements( source_dir: &Path, include_acknowledgements: bool, ) -> Result> { if !include_acknowledgements { return Ok(None); } let mut acknowledgements = format!("{}\n\n", include_str!("../../../NOTICE")); // Sort entries so the order is stable over time let entries = walkdir::WalkDir::new(source_dir).sort_by(|a, b| a.path().cmp(b.path())); for path_and_stem in entries .into_iter() .flatten() .flat_map(|entry| to_path_and_stem(source_dir, entry)) { if let Some(license_text) = handle_file(&path_and_stem)? { append_to_acknowledgements( &mut acknowledgements, &path_and_stem.relative_path, &license_text, ) } } Ok(Some(acknowledgements)) } fn to_path_and_stem(source_dir: &Path, entry: DirEntry) -> Option { let path = entry.path(); Some(PathAndStem { path: path.to_owned(), stem: path.file_stem().map(|s| s.to_string_lossy().to_string())?, relative_path: path .strip_prefix(source_dir) .map(|p| p.to_string_lossy().to_string()) .ok()?, }) } fn handle_file(path_and_stem: &PathAndStem) -> Result> { if path_and_stem.stem == "NOTICE" { handle_notice(&path_and_stem.path) } else if path_and_stem.stem.to_ascii_uppercase() == "LICENSE" { handle_license(&path_and_stem.path) } else { Ok(None) } } fn handle_notice(path: &Path) -> Result> { // Assume NOTICE as defined by Apache License 2.0. These must be part of acknowledgements. Ok(Some(read_to_string(path)?)) } fn handle_license(path: &Path) -> Result> { let license_text = read_to_string(path)?; if include_license_in_acknowledgments(&license_text) { Ok(Some(license_text)) } else if license_not_needed_in_acknowledgements(&license_text) { Ok(None) } else { Err(format!("ERROR: License is of unknown type: {path:?}").into()) } } fn include_license_in_acknowledgments(license_text: &str) -> bool { let markers = vec![ // MIT "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", // BSD "Redistributions in binary form must reproduce the above copyright notice,", // Apache 2.0 "Apache License Version 2.0, January 2004 http://www.apache.org/licenses/", "Licensed under the Apache License, Version 2.0 (the \"License\");", ]; license_contains_marker(license_text, &markers) } fn license_not_needed_in_acknowledgements(license_text: &str) -> bool { let markers = vec![ // Public domain "This is free and unencumbered software released into the public domain.", // Public domain with stronger wording than above "DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE", // Special license of assets/syntaxes/01_Packages/LICENSE "Permission to copy, use, modify, sell and distribute this software is granted. This software is provided \"as is\" without express or implied warranty, and with no claim as to its suitability for any purpose." ]; license_contains_marker(license_text, &markers) } fn license_contains_marker(license_text: &str, markers: &[&str]) -> bool { let normalized_license_text = normalize_license_text(license_text); markers.iter().any(|m| normalized_license_text.contains(m)) } fn append_to_acknowledgements( acknowledgements: &mut String, relative_path: &str, license_text: &str, ) { write!(acknowledgements, "## {relative_path}\n\n{license_text}").ok(); // Make sure the last char is a newline to not mess up formatting later if acknowledgements .chars() .last() .expect("acknowledgements is not the empty string") != '\n' { acknowledgements.push('\n'); } // Add two more newlines to make it easy to distinguish where this text ends // and the next starts acknowledgements.push_str("\n\n"); } /// Replaces newlines with a space character, and replaces multiple spaces with one space. /// This makes the text easier to analyze. fn normalize_license_text(license_text: &str) -> String { use regex::Regex; let whitespace_and_newlines = Regex::new(r"\s").unwrap(); let as_single_line = whitespace_and_newlines.replace_all(license_text, " "); let many_spaces = Regex::new(" +").unwrap(); many_spaces.replace_all(&as_single_line, " ").to_string() } #[cfg(test)] mod tests { #[cfg(test)] use super::*; #[test] fn test_normalize_license_text() { let license_text = "This is a license text with these terms: * Complicated multi-line term with indentation"; assert_eq!( "This is a license text with these terms: * Complicated multi-line term with indentation".to_owned(), normalize_license_text(license_text), ); } #[test] fn test_normalize_license_text_with_windows_line_endings() { let license_text = "This license text includes windows line endings\r and we need to handle that."; assert_eq!( "This license text includes windows line endings and we need to handle that." .to_owned(), normalize_license_text(license_text), ); } #[test] fn test_append_to_acknowledgements_adds_newline_if_missing() { let mut acknowledgements = "preamble\n\n\n".to_owned(); append_to_acknowledgements(&mut acknowledgements, "some/path", "line without newline"); assert_eq!( "preamble ## some/path line without newline ", acknowledgements ); append_to_acknowledgements(&mut acknowledgements, "another/path", "line with newline\n"); assert_eq!( "preamble ## some/path line without newline ## another/path line with newline ", acknowledgements ); } } bat-0.25.0/src/assets/build_assets.rs000064400000000000000000000112771046102023000156060ustar 00000000000000use std::convert::TryInto; use std::path::Path; use syntect::highlighting::ThemeSet; use syntect::parsing::{SyntaxSet, SyntaxSetBuilder}; use crate::assets::*; use acknowledgements::build_acknowledgements; mod acknowledgements; pub fn build( source_dir: &Path, include_integrated_assets: bool, include_acknowledgements: bool, target_dir: &Path, current_version: &str, ) -> Result<()> { let theme_set = build_theme_set(source_dir, include_integrated_assets)?; let syntax_set_builder = build_syntax_set_builder(source_dir, include_integrated_assets)?; let syntax_set = syntax_set_builder.build(); let acknowledgements = build_acknowledgements(source_dir, include_acknowledgements)?; print_unlinked_contexts(&syntax_set); write_assets( &theme_set, &syntax_set, &acknowledgements, target_dir, current_version, ) } fn build_theme_set(source_dir: &Path, include_integrated_assets: bool) -> Result { let mut theme_set = if include_integrated_assets { crate::assets::get_integrated_themeset().try_into()? } else { ThemeSet::new() }; let theme_dir = source_dir.join("themes"); if theme_dir.exists() { let res = theme_set.add_from_folder(&theme_dir); if let Err(err) = res { println!( "Failed to load one or more themes from '{}' (reason: '{}')", theme_dir.to_string_lossy(), err, ); } } else { println!( "No themes were found in '{}', using the default set", theme_dir.to_string_lossy() ); } theme_set.try_into() } fn build_syntax_set_builder( source_dir: &Path, include_integrated_assets: bool, ) -> Result { let mut syntax_set_builder = if !include_integrated_assets { let mut builder = syntect::parsing::SyntaxSetBuilder::new(); builder.add_plain_text_syntax(); builder } else { from_binary::(get_serialized_integrated_syntaxset(), COMPRESS_SYNTAXES) .into_builder() }; let syntax_dir = source_dir.join("syntaxes"); if syntax_dir.exists() { syntax_set_builder.add_from_folder(syntax_dir, true)?; } else { println!( "No syntaxes were found in '{}', using the default set.", syntax_dir.to_string_lossy() ); } Ok(syntax_set_builder) } fn print_unlinked_contexts(syntax_set: &SyntaxSet) { let missing_contexts = syntax_set.find_unlinked_contexts(); if !missing_contexts.is_empty() { println!("Some referenced contexts could not be found!"); for context in missing_contexts { println!("- {context}"); } } } fn write_assets( theme_set: &LazyThemeSet, syntax_set: &SyntaxSet, acknowledgements: &Option, target_dir: &Path, current_version: &str, ) -> Result<()> { let _ = std::fs::create_dir_all(target_dir); asset_to_cache( theme_set, &target_dir.join("themes.bin"), "theme set", COMPRESS_THEMES, )?; asset_to_cache( syntax_set, &target_dir.join("syntaxes.bin"), "syntax set", COMPRESS_SYNTAXES, )?; if let Some(acknowledgements) = acknowledgements { asset_to_cache( acknowledgements, &target_dir.join("acknowledgements.bin"), "acknowledgements", COMPRESS_ACKNOWLEDGEMENTS, )?; } print!( "Writing metadata to folder {} ... ", target_dir.to_string_lossy() ); crate::assets_metadata::AssetsMetadata::new(current_version).save_to_folder(target_dir)?; println!("okay"); Ok(()) } pub(crate) fn asset_to_contents( asset: &T, description: &str, compressed: bool, ) -> Result> { let mut contents = vec![]; if compressed { bincode::serialize_into( flate2::write::ZlibEncoder::new(&mut contents, flate2::Compression::best()), asset, ) } else { bincode::serialize_into(&mut contents, asset) } .map_err(|_| format!("Could not serialize {description}"))?; Ok(contents) } fn asset_to_cache( asset: &T, path: &Path, description: &str, compressed: bool, ) -> Result<()> { print!("Writing {} to {} ... ", description, path.to_string_lossy()); let contents = asset_to_contents(asset, description, compressed)?; std::fs::write(path, &contents[..]).map_err(|_| { format!( "Could not save {} to {}", description, path.to_string_lossy() ) })?; println!("okay"); Ok(()) } bat-0.25.0/src/assets/lazy_theme_set.rs000064400000000000000000000061431046102023000161350ustar 00000000000000use super::*; use std::collections::BTreeMap; use std::convert::TryFrom; use serde_derive::{Deserialize, Serialize}; use once_cell::unsync::OnceCell; use syntect::highlighting::{Theme, ThemeSet}; /// Same structure as a [`syntect::highlighting::ThemeSet`] but with themes /// stored in raw serialized form, and deserialized on demand. #[derive(Debug, Default, Serialize, Deserialize)] pub struct LazyThemeSet { /// This is a [`BTreeMap`] because that's what [`syntect::highlighting::ThemeSet`] uses themes: BTreeMap, } /// Stores raw serialized data for a theme with methods to lazily deserialize /// (load) the theme. #[derive(Debug, Serialize, Deserialize)] struct LazyTheme { serialized: Vec, #[serde(skip, default = "OnceCell::new")] deserialized: OnceCell, } impl LazyThemeSet { /// Lazily load the given theme pub fn get(&self, name: &str) -> Option<&Theme> { self.themes.get(name).and_then(|lazy_theme| { lazy_theme .deserialized .get_or_try_init(|| lazy_theme.deserialize()) .ok() }) } /// Returns the name of all themes. pub fn themes(&self) -> impl Iterator { self.themes.keys().map(|name| name.as_ref()) } } impl LazyTheme { fn deserialize(&self) -> Result { asset_from_contents( &self.serialized[..], "lazy-loaded theme", COMPRESS_LAZY_THEMES, ) } } impl TryFrom for ThemeSet { type Error = Error; /// Since the user might want to add custom themes to bat, we need a way to /// convert from a `LazyThemeSet` to a regular [`ThemeSet`] so that more /// themes can be added. This function does that pretty straight-forward /// conversion. fn try_from(lazy_theme_set: LazyThemeSet) -> Result { let mut theme_set = ThemeSet::default(); for (name, lazy_theme) in lazy_theme_set.themes { theme_set.themes.insert(name, lazy_theme.deserialize()?); } Ok(theme_set) } } #[cfg(feature = "build-assets")] impl TryFrom for LazyThemeSet { type Error = Error; /// To collect themes, a [`ThemeSet`] is needed. Once all desired themes /// have been added, we need a way to convert that into [`LazyThemeSet`] so /// that themes can be lazy-loaded later. This function does that /// conversion. fn try_from(theme_set: ThemeSet) -> Result { let mut lazy_theme_set = LazyThemeSet::default(); for (name, theme) in theme_set.themes { // All we have to do is to serialize the theme let lazy_theme = LazyTheme { serialized: crate::assets::build_assets::asset_to_contents( &theme, &format!("theme {name}"), COMPRESS_LAZY_THEMES, )?, deserialized: OnceCell::new(), }; // Ok done, now we can add it lazy_theme_set.themes.insert(name, lazy_theme); } Ok(lazy_theme_set) } } bat-0.25.0/src/assets/serialized_syntax_set.rs000064400000000000000000000014231046102023000175310ustar 00000000000000use std::path::PathBuf; use syntect::parsing::SyntaxSet; use super::*; /// A SyntaxSet in serialized form, i.e. bincoded and flate2 compressed. /// We keep it in this format since we want to load it lazily. #[derive(Debug)] pub enum SerializedSyntaxSet { /// The data comes from a user-generated cache file. FromFile(PathBuf), /// The data to use is embedded into the bat binary. FromBinary(&'static [u8]), } impl SerializedSyntaxSet { pub fn deserialize(&self) -> Result { match self { SerializedSyntaxSet::FromBinary(data) => Ok(from_binary(data, COMPRESS_SYNTAXES)), SerializedSyntaxSet::FromFile(ref path) => { asset_from_cache(path, "syntax set", COMPRESS_SYNTAXES) } } } } bat-0.25.0/src/assets.rs000064400000000000000000000535561046102023000131330ustar 00000000000000use std::ffi::OsStr; use std::fs; use std::path::Path; use once_cell::unsync::OnceCell; use syntect::highlighting::Theme; use syntect::parsing::{SyntaxReference, SyntaxSet}; use path_abs::PathAbs; use crate::error::*; use crate::input::{InputReader, OpenedInput}; use crate::syntax_mapping::ignored_suffixes::IgnoredSuffixes; use crate::syntax_mapping::MappingTarget; use crate::theme::{default_theme, ColorScheme}; use crate::{bat_warning, SyntaxMapping}; use lazy_theme_set::LazyThemeSet; use serialized_syntax_set::*; #[cfg(feature = "build-assets")] pub use crate::assets::build_assets::*; pub(crate) mod assets_metadata; #[cfg(feature = "build-assets")] mod build_assets; mod lazy_theme_set; mod serialized_syntax_set; #[derive(Debug)] pub struct HighlightingAssets { syntax_set_cell: OnceCell, serialized_syntax_set: SerializedSyntaxSet, theme_set: LazyThemeSet, fallback_theme: Option<&'static str>, } #[derive(Debug)] pub struct SyntaxReferenceInSet<'a> { pub syntax: &'a SyntaxReference, pub syntax_set: &'a SyntaxSet, } /// Lazy-loaded syntaxes are already compressed, and we don't want to compress /// already compressed data. pub(crate) const COMPRESS_SYNTAXES: bool = false; /// We don't want to compress our [LazyThemeSet] since the lazy-loaded themes /// within it are already compressed, and compressing another time just makes /// performance suffer pub(crate) const COMPRESS_THEMES: bool = false; /// Compress for size of ~40 kB instead of ~200 kB without much difference in /// performance due to lazy-loading pub(crate) const COMPRESS_LAZY_THEMES: bool = true; /// Compress for size of ~10 kB instead of ~120 kB pub(crate) const COMPRESS_ACKNOWLEDGEMENTS: bool = true; impl HighlightingAssets { fn new(serialized_syntax_set: SerializedSyntaxSet, theme_set: LazyThemeSet) -> Self { HighlightingAssets { syntax_set_cell: OnceCell::new(), serialized_syntax_set, theme_set, fallback_theme: None, } } pub fn from_cache(cache_path: &Path) -> Result { Ok(HighlightingAssets::new( SerializedSyntaxSet::FromFile(cache_path.join("syntaxes.bin")), asset_from_cache(&cache_path.join("themes.bin"), "theme set", COMPRESS_THEMES)?, )) } pub fn from_binary() -> Self { HighlightingAssets::new( SerializedSyntaxSet::FromBinary(get_serialized_integrated_syntaxset()), get_integrated_themeset(), ) } pub fn set_fallback_theme(&mut self, theme: &'static str) { self.fallback_theme = Some(theme); } /// Return the collection of syntect syntax definitions. pub fn get_syntax_set(&self) -> Result<&SyntaxSet> { self.syntax_set_cell .get_or_try_init(|| self.serialized_syntax_set.deserialize()) } /// Use [Self::get_syntaxes] instead #[deprecated] pub fn syntaxes(&self) -> &[SyntaxReference] { self.get_syntax_set() .expect(".syntaxes() is deprecated, use .get_syntaxes() instead") .syntaxes() } pub fn get_syntaxes(&self) -> Result<&[SyntaxReference]> { Ok(self.get_syntax_set()?.syntaxes()) } fn get_theme_set(&self) -> &LazyThemeSet { &self.theme_set } pub fn themes(&self) -> impl Iterator { self.get_theme_set().themes() } /// Use [Self::get_syntax_for_path] instead #[deprecated] pub fn syntax_for_file_name( &self, file_name: impl AsRef, mapping: &SyntaxMapping, ) -> Option<&SyntaxReference> { self.get_syntax_for_path(file_name, mapping) .ok() .map(|syntax_in_set| syntax_in_set.syntax) } /// Detect the syntax based on, in order: /// 1. Syntax mappings with [MappingTarget::MapTo] and [MappingTarget::MapToUnknown] /// (e.g. `/etc/profile` -> `Bourne Again Shell (bash)`) /// 2. The file name (e.g. `Dockerfile`) /// 3. Syntax mappings with [MappingTarget::MapExtensionToUnknown] /// (e.g. `*.conf`) /// 4. The file name extension (e.g. `.rs`) /// /// When detecting syntax based on syntax mappings, the full path is taken /// into account. When detecting syntax based on file name, no regard is /// taken to the path of the file. Only the file name itself matters. When /// detecting syntax based on file name extension, only the file name /// extension itself matters. /// /// Returns [Error::UndetectedSyntax] if it was not possible detect syntax /// based on path/file name/extension (or if the path was mapped to /// [MappingTarget::MapToUnknown] or [MappingTarget::MapExtensionToUnknown]). /// In this case it is appropriate to fall back to other methods to detect /// syntax. Such as using the contents of the first line of the file. /// /// Returns [Error::UnknownSyntax] if a syntax mapping exist, but the mapped /// syntax does not exist. pub fn get_syntax_for_path( &self, path: impl AsRef, mapping: &SyntaxMapping, ) -> Result { let path = path.as_ref(); let syntax_match = mapping.get_syntax_for(path); if let Some(MappingTarget::MapToUnknown) = syntax_match { return Err(Error::UndetectedSyntax(path.to_string_lossy().into())); } if let Some(MappingTarget::MapTo(syntax_name)) = syntax_match { return self .find_syntax_by_name(syntax_name)? .ok_or_else(|| Error::UnknownSyntax(syntax_name.to_owned())); } let file_name = path.file_name().unwrap_or_default(); match ( self.get_syntax_for_file_name(file_name, &mapping.ignored_suffixes)?, syntax_match, ) { (Some(syntax), _) => Ok(syntax), (_, Some(MappingTarget::MapExtensionToUnknown)) => { Err(Error::UndetectedSyntax(path.to_string_lossy().into())) } _ => self .get_syntax_for_file_extension(file_name, &mapping.ignored_suffixes)? .ok_or_else(|| Error::UndetectedSyntax(path.to_string_lossy().into())), } } /// Look up a syntect theme by name. pub fn get_theme(&self, theme: &str) -> &Theme { match self.get_theme_set().get(theme) { Some(theme) => theme, None => { if theme == "ansi-light" || theme == "ansi-dark" { bat_warning!("Theme '{}' is deprecated, using 'ansi' instead.", theme); return self.get_theme("ansi"); } if !theme.is_empty() { bat_warning!("Unknown theme '{}', using default.", theme) } self.get_theme_set() .get( self.fallback_theme .unwrap_or_else(|| default_theme(ColorScheme::Dark)), ) .expect("something is very wrong if the default theme is missing") } } } pub(crate) fn get_syntax( &self, language: Option<&str>, input: &mut OpenedInput, mapping: &SyntaxMapping, ) -> Result { if let Some(language) = language { let syntax_set = self.get_syntax_set()?; return syntax_set .find_syntax_by_token(language) .map(|syntax| SyntaxReferenceInSet { syntax, syntax_set }) .ok_or_else(|| Error::UnknownSyntax(language.to_owned())); } let path = input.path(); let path_syntax = if let Some(path) = path { self.get_syntax_for_path( PathAbs::new(path).map_or_else(|_| path.to_owned(), |p| p.as_path().to_path_buf()), mapping, ) } else { Err(Error::UndetectedSyntax("[unknown]".into())) }; match path_syntax { // If a path wasn't provided, or if path based syntax detection // above failed, we fall back to first-line syntax detection. Err(Error::UndetectedSyntax(path)) => self .get_first_line_syntax(&mut input.reader)? .ok_or(Error::UndetectedSyntax(path)), _ => path_syntax, } } pub(crate) fn find_syntax_by_name( &self, syntax_name: &str, ) -> Result> { let syntax_set = self.get_syntax_set()?; Ok(syntax_set .find_syntax_by_name(syntax_name) .map(|syntax| SyntaxReferenceInSet { syntax, syntax_set })) } fn find_syntax_by_extension(&self, e: Option<&OsStr>) -> Result> { let syntax_set = self.get_syntax_set()?; let extension = e.and_then(|x| x.to_str()).unwrap_or_default(); Ok(syntax_set .find_syntax_by_extension(extension) .map(|syntax| SyntaxReferenceInSet { syntax, syntax_set })) } fn get_syntax_for_file_name( &self, file_name: &OsStr, ignored_suffixes: &IgnoredSuffixes, ) -> Result> { let mut syntax = self.find_syntax_by_extension(Some(file_name))?; if syntax.is_none() { syntax = ignored_suffixes.try_with_stripped_suffix(file_name, |stripped_file_name| { // Note: recursion self.get_syntax_for_file_name(stripped_file_name, ignored_suffixes) })?; } Ok(syntax) } fn get_syntax_for_file_extension( &self, file_name: &OsStr, ignored_suffixes: &IgnoredSuffixes, ) -> Result> { let mut syntax = self.find_syntax_by_extension(Path::new(file_name).extension())?; if syntax.is_none() { syntax = ignored_suffixes.try_with_stripped_suffix(file_name, |stripped_file_name| { // Note: recursion self.get_syntax_for_file_extension(stripped_file_name, ignored_suffixes) })?; } Ok(syntax) } fn get_first_line_syntax( &self, reader: &mut InputReader, ) -> Result> { let syntax_set = self.get_syntax_set()?; Ok(String::from_utf8(reader.first_line.clone()) .ok() .and_then(|l| syntax_set.find_syntax_by_first_line(&l)) .map(|syntax| SyntaxReferenceInSet { syntax, syntax_set })) } } pub(crate) fn get_serialized_integrated_syntaxset() -> &'static [u8] { include_bytes!("../assets/syntaxes.bin") } pub(crate) fn get_integrated_themeset() -> LazyThemeSet { from_binary(include_bytes!("../assets/themes.bin"), COMPRESS_THEMES) } pub fn get_acknowledgements() -> String { from_binary( include_bytes!("../assets/acknowledgements.bin"), COMPRESS_ACKNOWLEDGEMENTS, ) } pub(crate) fn from_binary(v: &[u8], compressed: bool) -> T { asset_from_contents(v, "n/a", compressed) .expect("data integrated in binary is never faulty, but make sure `compressed` is in sync!") } fn asset_from_contents( contents: &[u8], description: &str, compressed: bool, ) -> Result { if compressed { bincode::deserialize_from(flate2::read::ZlibDecoder::new(contents)) } else { bincode::deserialize_from(contents) } .map_err(|_| format!("Could not parse {description}").into()) } fn asset_from_cache( path: &Path, description: &str, compressed: bool, ) -> Result { let contents = fs::read(path).map_err(|_| { format!( "Could not load cached {} '{}'", description, path.to_string_lossy() ) })?; asset_from_contents(&contents[..], description, compressed) .map_err(|_| format!("Could not parse cached {description}").into()) } #[cfg(test)] mod tests { use super::*; use std::ffi::OsStr; use std::fs::File; use std::io::{BufReader, Write}; use tempfile::TempDir; use crate::input::Input; struct SyntaxDetectionTest<'a> { assets: HighlightingAssets, pub syntax_mapping: SyntaxMapping<'a>, pub temp_dir: TempDir, } impl<'a> SyntaxDetectionTest<'a> { fn new() -> Self { SyntaxDetectionTest { assets: HighlightingAssets::from_binary(), syntax_mapping: SyntaxMapping::new(), temp_dir: TempDir::new().expect("creation of temporary directory"), } } fn get_syntax_name( &self, language: Option<&str>, input: &mut OpenedInput, mapping: &SyntaxMapping, ) -> String { self.assets .get_syntax(language, input, mapping) .map(|syntax_in_set| syntax_in_set.syntax.name.clone()) .unwrap_or_else(|_| "!no syntax!".to_owned()) } fn syntax_for_real_file_with_content_os( &self, file_name: &OsStr, first_line: &str, ) -> String { let file_path = self.temp_dir.path().join(file_name); { let mut temp_file = File::create(&file_path).unwrap(); writeln!(temp_file, "{first_line}").unwrap(); } let input = Input::ordinary_file(&file_path); let dummy_stdin: &[u8] = &[]; let mut opened_input = input.open(dummy_stdin, None).unwrap(); self.get_syntax_name(None, &mut opened_input, &self.syntax_mapping) } fn syntax_for_file_with_content_os(&self, file_name: &OsStr, first_line: &str) -> String { let file_path = self.temp_dir.path().join(file_name); let input = Input::from_reader(Box::new(BufReader::new(first_line.as_bytes()))) .with_name(Some(&file_path)); let dummy_stdin: &[u8] = &[]; let mut opened_input = input.open(dummy_stdin, None).unwrap(); self.get_syntax_name(None, &mut opened_input, &self.syntax_mapping) } #[cfg(unix)] fn syntax_for_file_os(&self, file_name: &OsStr) -> String { self.syntax_for_file_with_content_os(file_name, "") } fn syntax_for_file_with_content(&self, file_name: &str, first_line: &str) -> String { self.syntax_for_file_with_content_os(OsStr::new(file_name), first_line) } fn syntax_for_file(&self, file_name: &str) -> String { self.syntax_for_file_with_content(file_name, "") } fn syntax_for_stdin_with_content(&self, file_name: &str, content: &[u8]) -> String { let input = Input::stdin().with_name(Some(file_name)); let mut opened_input = input.open(content, None).unwrap(); self.get_syntax_name(None, &mut opened_input, &self.syntax_mapping) } fn syntax_is_same_for_inputkinds(&self, file_name: &str, content: &str) -> bool { let as_file = self.syntax_for_real_file_with_content_os(file_name.as_ref(), content); let as_reader = self.syntax_for_file_with_content_os(file_name.as_ref(), content); let consistent = as_file == as_reader; // TODO: Compare StdIn somehow? if !consistent { eprintln!( "Inconsistent syntax detection:\nFor File: {as_file}\nFor Reader: {as_reader}" ) } consistent } } #[test] fn syntax_detection_basic() { let test = SyntaxDetectionTest::new(); assert_eq!(test.syntax_for_file("test.rs"), "Rust"); assert_eq!(test.syntax_for_file("test.cpp"), "C++"); assert_eq!(test.syntax_for_file("test.build"), "NAnt Build File"); assert_eq!( test.syntax_for_file("PKGBUILD"), "Bourne Again Shell (bash)" ); assert_eq!(test.syntax_for_file(".bashrc"), "Bourne Again Shell (bash)"); assert_eq!(test.syntax_for_file("Makefile"), "Makefile"); } #[cfg(unix)] #[test] fn syntax_detection_invalid_utf8() { use std::os::unix::ffi::OsStrExt; let test = SyntaxDetectionTest::new(); assert_eq!( test.syntax_for_file_os(OsStr::from_bytes(b"invalid_\xFEutf8_filename.rs")), "Rust" ); } #[test] fn syntax_detection_same_for_inputkinds() { let mut test = SyntaxDetectionTest::new(); test.syntax_mapping .insert("*.myext", MappingTarget::MapTo("C")) .ok(); test.syntax_mapping .insert("MY_FILE", MappingTarget::MapTo("Markdown")) .ok(); assert!(test.syntax_is_same_for_inputkinds("Test.md", "")); assert!(test.syntax_is_same_for_inputkinds("Test.txt", "#!/bin/bash")); assert!(test.syntax_is_same_for_inputkinds(".bashrc", "")); assert!(test.syntax_is_same_for_inputkinds("test.h", "")); assert!(test.syntax_is_same_for_inputkinds("test.js", "#!/bin/bash")); assert!(test.syntax_is_same_for_inputkinds("test.myext", "")); assert!(test.syntax_is_same_for_inputkinds("MY_FILE", "")); assert!(test.syntax_is_same_for_inputkinds("MY_FILE", " bool { env::var("COLORTERM") .map(|colorterm| colorterm == "truecolor" || colorterm == "24bit") .unwrap_or(false) } pub fn env_no_color() -> bool { env::var_os("NO_COLOR").is_some_and(|x| !x.is_empty()) } pub struct App { pub matches: ArgMatches, interactive_output: bool, } impl App { pub fn new() -> Result { #[cfg(windows)] let _ = nu_ansi_term::enable_ansi_support(); let interactive_output = std::io::stdout().is_terminal(); Ok(App { matches: Self::matches(interactive_output)?, interactive_output, }) } fn matches(interactive_output: bool) -> Result { let args = if wild::args_os().nth(1) == Some("cache".into()) { // Skip the config file and env vars wild::args_os().collect::>() } else if wild::args_os().any(|arg| arg == "--no-config") { // Skip the arguments in bats config file let mut cli_args = wild::args_os(); let mut args = get_args_from_env_vars(); // Put the zero-th CLI argument (program name) first args.insert(0, cli_args.next().unwrap()); // .. and the rest at the end cli_args.for_each(|a| args.push(a)); args } else { let mut cli_args = wild::args_os(); // Read arguments from bats config file let mut args = get_args_from_env_opts_var() .unwrap_or_else(get_args_from_config_file) .map_err(|_| "Could not parse configuration file")?; // Selected env vars supersede config vars args.extend(get_args_from_env_vars()); // Put the zero-th CLI argument (program name) first args.insert(0, cli_args.next().unwrap()); // .. and the rest at the end cli_args.for_each(|a| args.push(a)); args }; Ok(clap_app::build_app(interactive_output).get_matches_from(args)) } pub fn config(&self, inputs: &[Input]) -> Result { let style_components = self.style_components()?; let extra_plain = self.matches.get_count("plain") > 1; let plain_last_index = self .matches .indices_of("plain") .and_then(Iterator::max) .unwrap_or_default(); let paging_last_index = self .matches .indices_of("paging") .and_then(Iterator::max) .unwrap_or_default(); let paging_mode = match self.matches.get_one::("paging").map(|s| s.as_str()) { Some("always") => { // Disable paging if the second -p (or -pp) is specified after --paging=always if extra_plain && plain_last_index > paging_last_index { PagingMode::Never } else { PagingMode::Always } } Some("never") => PagingMode::Never, Some("auto") | None => { // If we have -pp as an option when in auto mode, the pager should be disabled. if extra_plain || self.matches.get_flag("no-paging") { PagingMode::Never } else if inputs.iter().any(Input::is_stdin) { // If we are reading from stdin, only enable paging if we write to an // interactive terminal and if we do not *read* from an interactive // terminal. if self.interactive_output && !std::io::stdin().is_terminal() { PagingMode::QuitIfOneScreen } else { PagingMode::Never } } else if self.interactive_output { PagingMode::QuitIfOneScreen } else { PagingMode::Never } } _ => unreachable!("other values for --paging are not allowed"), }; let mut syntax_mapping = SyntaxMapping::new(); // start building glob matchers for builtin mappings immediately // this is an appropriate approach because it's statistically likely that // all the custom mappings need to be checked syntax_mapping.start_offload_build_all(); if let Some(values) = self.matches.get_many::("ignored-suffix") { for suffix in values { syntax_mapping.insert_ignored_suffix(suffix); } } if let Some(values) = self.matches.get_many::("map-syntax") { // later args take precedence over earlier ones, hence `.rev()` // see: https://github.com/sharkdp/bat/pull/2755#discussion_r1456416875 for from_to in values.rev() { let parts: Vec<_> = from_to.split(':').collect(); if parts.len() != 2 { return Err("Invalid syntax mapping. The format of the -m/--map-syntax option is ':'. For example: '*.cpp:C++'.".into()); } syntax_mapping.insert(parts[0], MappingTarget::MapTo(parts[1]))?; } } let maybe_term_width = self .matches .get_one::("terminal-width") .and_then(|w| { if w.starts_with('+') || w.starts_with('-') { // Treat argument as a delta to the current terminal width w.parse().ok().map(|delta: i16| { let old_width: u16 = Term::stdout().size().1; let new_width: i32 = i32::from(old_width) + i32::from(delta); if new_width <= 0 { old_width as usize } else { new_width as usize } }) } else { w.parse().ok() } }); Ok(Config { true_color: is_truecolor_terminal(), language: self .matches .get_one::("language") .map(|s| s.as_str()) .or_else(|| { if self.matches.get_flag("show-all") { Some("show-nonprintable") } else { None } }), show_nonprintable: self.matches.get_flag("show-all"), nonprintable_notation: match self .matches .get_one::("nonprintable-notation") .map(|s| s.as_str()) { Some("unicode") => NonprintableNotation::Unicode, Some("caret") => NonprintableNotation::Caret, _ => unreachable!("other values for --nonprintable-notation are not allowed"), }, binary: match self.matches.get_one::("binary").map(|s| s.as_str()) { Some("as-text") => BinaryBehavior::AsText, Some("no-printing") => BinaryBehavior::NoPrinting, _ => unreachable!("other values for --binary are not allowed"), }, wrapping_mode: if self.interactive_output || maybe_term_width.is_some() { if !self.matches.get_flag("chop-long-lines") { match self.matches.get_one::("wrap").map(|s| s.as_str()) { Some("character") => WrappingMode::Character, Some("never") => WrappingMode::NoWrapping(true), Some("auto") | None => { if style_components.plain() { WrappingMode::NoWrapping(false) } else { WrappingMode::Character } } _ => unreachable!("other values for --wrap are not allowed"), } } else { WrappingMode::NoWrapping(true) } } else { // We don't have the tty width when piping to another program. // There's no point in wrapping when this is the case. WrappingMode::NoWrapping(false) }, colored_output: self.matches.get_flag("force-colorization") || match self.matches.get_one::("color").map(|s| s.as_str()) { Some("always") => true, Some("never") => false, Some("auto") => !env_no_color() && self.interactive_output, _ => unreachable!("other values for --color are not allowed"), }, paging_mode, term_width: maybe_term_width.unwrap_or(Term::stdout().size().1 as usize), loop_through: !(self.interactive_output || self.matches.get_one::("color").map(|s| s.as_str()) == Some("always") || self .matches .get_one::("decorations") .map(|s| s.as_str()) == Some("always") || self.matches.get_flag("force-colorization")), tab_width: self .matches .get_one::("tabs") .map(String::from) .and_then(|t| t.parse().ok()) .unwrap_or( if style_components.plain() && paging_mode == PagingMode::Never { 0 } else { 4 }, ), strip_ansi: match self .matches .get_one::("strip-ansi") .map(|s| s.as_str()) { Some("never") => StripAnsiMode::Never, Some("always") => StripAnsiMode::Always, Some("auto") => StripAnsiMode::Auto, _ => unreachable!("other values for --strip-ansi are not allowed"), }, theme: theme(self.theme_options()).to_string(), visible_lines: match self.matches.try_contains_id("diff").unwrap_or_default() && self.matches.get_flag("diff") { #[cfg(feature = "git")] true => VisibleLines::DiffContext( self.matches .get_one::("diff-context") .and_then(|t| t.parse().ok()) .unwrap_or(2), ), _ => VisibleLines::Ranges( self.matches .get_many::("line-range") .map(|vs| vs.map(|s| LineRange::from(s.as_str())).collect()) .transpose()? .map(LineRanges::from) .unwrap_or_default(), ), }, style_components, syntax_mapping, pager: self.matches.get_one::("pager").map(|s| s.as_str()), use_italic_text: self .matches .get_one::("italic-text") .map(|s| s.as_str()) == Some("always"), highlighted_lines: self .matches .get_many::("highlight-line") .map(|ws| ws.map(|s| LineRange::from(s.as_str())).collect()) .transpose()? .map(LineRanges::from) .map(HighlightedLineRanges) .unwrap_or_default(), use_custom_assets: !self.matches.get_flag("no-custom-assets"), #[cfg(feature = "lessopen")] use_lessopen: self.matches.get_flag("lessopen"), set_terminal_title: self.matches.get_flag("set-terminal-title"), squeeze_lines: if self.matches.get_flag("squeeze-blank") { Some( self.matches .get_one::("squeeze-limit") .map(|limit| limit.to_owned()) .unwrap_or(1), ) } else { None }, }) } pub fn inputs(&self) -> Result> { let filenames: Option> = self .matches .get_many::("file-name") .map(|vs| vs.map(|p| p.as_path()).collect::>()); let files: Option> = self .matches .get_many::("FILE") .map(|vs| vs.map(|p| p.as_path()).collect::>()); // verify equal length of file-names and input FILEs if filenames.is_some() && files.is_some() && filenames.as_ref().map(|v| v.len()) != files.as_ref().map(|v| v.len()) { return Err("Must be one file name per input type.".into()); } let mut filenames_or_none: Box>> = match filenames { Some(filenames) => Box::new(filenames.into_iter().map(Some)), None => Box::new(std::iter::repeat(None)), }; if files.is_none() { return Ok(vec![new_stdin_input( filenames_or_none.next().unwrap_or(None), )]); } let files_or_none: Box> = match files { Some(ref files) => Box::new(files.iter().map(|name| Some(*name))), None => Box::new(std::iter::repeat(None)), }; let mut file_input = Vec::new(); for (filepath, provided_name) in files_or_none.zip(filenames_or_none) { if let Some(filepath) = filepath { if filepath.to_str().unwrap_or_default() == "-" { file_input.push(new_stdin_input(provided_name)); } else { file_input.push(new_file_input(filepath, provided_name)); } } } Ok(file_input) } fn forced_style_components(&self) -> Option { // No components if `--decorations=never``. if self .matches .get_one::("decorations") .map(|s| s.as_str()) == Some("never") { return Some(StyleComponents(HashSet::new())); } // Only line numbers if `--number`. if self.matches.get_flag("number") { return Some(StyleComponents(HashSet::from([ StyleComponent::LineNumbers, ]))); } // Plain if `--plain` is specified at least once. if self.matches.get_count("plain") > 0 { return Some(StyleComponents(HashSet::from([StyleComponent::Plain]))); } // Default behavior. None } fn style_components(&self) -> Result { let matches = &self.matches; let mut styled_components = match self.forced_style_components() { Some(forced_components) => forced_components, // Parse the `--style` arguments and merge them. None if matches.contains_id("style") => { let lists = matches .get_many::("style") .expect("styles present") .map(|v| StyleComponentList::from_str(v)) .collect::>>()?; StyleComponentList::to_components(lists, self.interactive_output, true) } // Use the default. None => StyleComponents(HashSet::from_iter( StyleComponent::Default .components(self.interactive_output) .into_iter() .cloned(), )), }; // If `grid` is set, remove `rule` as it is a subset of `grid`, and print a warning. if styled_components.grid() && styled_components.0.remove(&StyleComponent::Rule) { bat_warning!("Style 'rule' is a subset of style 'grid', 'rule' will not be visible."); } Ok(styled_components) } fn theme_options(&self) -> ThemeOptions { let theme = self .matches .get_one::("theme") .map(|t| ThemePreference::from_str(t).unwrap()) .unwrap_or_default(); let theme_dark = self .matches .get_one::("theme-dark") .map(|t| ThemeName::from_str(t).unwrap()); let theme_light = self .matches .get_one::("theme-light") .map(|t| ThemeName::from_str(t).unwrap()); ThemeOptions { theme, theme_dark, theme_light, } } } bat-0.25.0/src/bin/bat/assets.rs000064400000000000000000000036111046102023000144340ustar 00000000000000use std::fs; use std::io; use std::path::Path; use std::path::PathBuf; use clap::crate_version; use bat::assets::HighlightingAssets; use bat::assets_metadata::AssetsMetadata; use bat::error::*; pub fn clear_assets(cache_dir: &Path) { clear_asset(cache_dir.join("themes.bin"), "theme set cache"); clear_asset(cache_dir.join("syntaxes.bin"), "syntax set cache"); clear_asset(cache_dir.join("metadata.yaml"), "metadata file"); } pub fn assets_from_cache_or_binary( use_custom_assets: bool, cache_dir: &Path, ) -> Result { if let Some(metadata) = AssetsMetadata::load_from_folder(cache_dir)? { if !metadata.is_compatible_with(crate_version!()) { return Err(format!( "The binary caches for the user-customized syntaxes and themes \ in '{}' are not compatible with this version of bat ({}). To solve this, \ either rebuild the cache (bat cache --build) or remove \ the custom syntaxes/themes (bat cache --clear).\n\ For more information, see:\n\n \ https://github.com/sharkdp/bat#adding-new-syntaxes--language-definitions", cache_dir.to_string_lossy(), crate_version!() ) .into()); } } let custom_assets = if use_custom_assets { HighlightingAssets::from_cache(cache_dir).ok() } else { None }; Ok(custom_assets.unwrap_or_else(HighlightingAssets::from_binary)) } fn clear_asset(path: PathBuf, description: &str) { print!("Clearing {description} ... "); match fs::remove_file(&path) { Err(err) if err.kind() == io::ErrorKind::NotFound => { println!("skipped (not present)"); } Err(err) => { println!("could not remove the cache file {:?}: {}", &path, err); } Ok(_) => println!("okay"), } } bat-0.25.0/src/bin/bat/clap_app.rs000064400000000000000000000764561046102023000147320ustar 00000000000000use bat::style::StyleComponentList; use clap::{ crate_name, crate_version, value_parser, Arg, ArgAction, ArgGroup, ColorChoice, Command, }; use once_cell::sync::Lazy; use std::env; use std::path::{Path, PathBuf}; use std::str::FromStr; static VERSION: Lazy = Lazy::new(|| { #[cfg(feature = "bugreport")] let git_version = bugreport::git_version!(fallback = ""); #[cfg(not(feature = "bugreport"))] let git_version = ""; if git_version.is_empty() { crate_version!().to_string() } else { format!("{} ({})", crate_version!(), git_version) } }); pub fn build_app(interactive_output: bool) -> Command { let color_when = if interactive_output && !crate::app::env_no_color() { ColorChoice::Auto } else { ColorChoice::Never }; let mut app = Command::new(crate_name!()) .version(VERSION.as_str()) .color(color_when) .hide_possible_values(true) .args_conflicts_with_subcommands(true) .allow_external_subcommands(true) .disable_help_subcommand(true) .max_term_width(100) .about("A cat(1) clone with wings.") .long_about("A cat(1) clone with syntax highlighting and Git integration.") .arg( Arg::new("FILE") .help("File(s) to print / concatenate. Use '-' for standard input.") .long_help( "File(s) to print / concatenate. Use a dash ('-') or no argument at all \ to read from standard input.", ) .num_args(1..) .value_parser(value_parser!(PathBuf)), ) .arg( Arg::new("show-all") .long("show-all") .alias("show-nonprintable") .short('A') .action(ArgAction::SetTrue) .conflicts_with("language") .help("Show non-printable characters (space, tab, newline, ..).") .long_help( "Show non-printable characters like space, tab or newline. \ This option can also be used to print binary files. \ Use '--tabs' to control the width of the tab-placeholders.", ), ) .arg( Arg::new("nonprintable-notation") .long("nonprintable-notation") .action(ArgAction::Set) .default_value("unicode") .value_parser(["unicode", "caret"]) .value_name("notation") .hide_default_value(true) .help("Set notation for non-printable characters.") .long_help( "Set notation for non-printable characters.\n\n\ Possible values:\n \ * unicode (␇, ␊, ␀, ..)\n \ * caret (^G, ^J, ^@, ..)", ), ) .arg( Arg::new("binary") .long("binary") .action(ArgAction::Set) .default_value("no-printing") .value_parser(["no-printing", "as-text"]) .value_name("behavior") .hide_default_value(true) .help("How to treat binary content. (default: no-printing)") .long_help( "How to treat binary content. (default: no-printing)\n\n\ Possible values:\n \ * no-printing: do not print any binary content\n \ * as-text: treat binary content as normal text", ), ) .arg( Arg::new("plain") .overrides_with("plain") .overrides_with("number") .short('p') .long("plain") .action(ArgAction::Count) .help("Show plain style (alias for '--style=plain').") .long_help( "Only show plain style, no decorations. This is an alias for \ '--style=plain'. When '-p' is used twice ('-pp'), it also disables \ automatic paging (alias for '--style=plain --paging=never').", ), ) .arg( Arg::new("language") .short('l') .long("language") .overrides_with("language") .help("Set the language for syntax highlighting.") .long_help( "Explicitly set the language for syntax highlighting. The language can be \ specified as a name (like 'C++' or 'LaTeX') or possible file extension \ (like 'cpp', 'hpp' or 'md'). Use '--list-languages' to show all supported \ language names and file extensions.", ), ) .arg( Arg::new("highlight-line") .long("highlight-line") .short('H') .action(ArgAction::Append) .value_name("N:M") .help("Highlight lines N through M.") .long_help( "Highlight the specified line ranges with a different background color \ For example:\n \ '--highlight-line 40' highlights line 40\n \ '--highlight-line 30:40' highlights lines 30 to 40\n \ '--highlight-line :40' highlights lines 1 to 40\n \ '--highlight-line 40:' highlights lines 40 to the end of the file\n \ '--highlight-line 30:+10' highlights lines 30 to 40", ), ) .arg( Arg::new("file-name") .long("file-name") .action(ArgAction::Append) .value_name("name") .value_parser(value_parser!(PathBuf)) .help("Specify the name to display for a file.") .long_help( "Specify the name to display for a file. Useful when piping \ data to bat from STDIN when bat does not otherwise know \ the filename. Note that the provided file name is also \ used for syntax detection.", ), ); #[cfg(feature = "git")] { app = app .arg( Arg::new("diff") .long("diff") .short('d') .action(ArgAction::SetTrue) .conflicts_with("line-range") .help("Only show lines that have been added/removed/modified.") .long_help( "Only show lines that have been added/removed/modified with respect \ to the Git index. Use --diff-context=N to control how much context you want to see.", ), ) .arg( Arg::new("diff-context") .long("diff-context") .overrides_with("diff-context") .value_name("N") .value_parser( |n: &str| { n.parse::() .map_err(|_| "must be a number") .map(|_| n.to_owned()) // Convert to Result .map_err(|e| e.to_string()) }, // Convert to Result<(), String> ) .hide_short_help(true) .long_help( "Include N lines of context around added/removed/modified lines when using '--diff'.", ), ) } app = app.arg( Arg::new("tabs") .long("tabs") .overrides_with("tabs") .value_name("T") .value_parser( |t: &str| { t.parse::() .map_err(|_t| "must be a number") .map(|_t| t.to_owned()) // Convert to Result .map_err(|e| e.to_string()) }, // Convert to Result<(), String> ) .help("Set the tab width to T spaces.") .long_help( "Set the tab width to T spaces. Use a width of 0 to pass tabs through \ directly", ), ) .arg( Arg::new("wrap") .long("wrap") .overrides_with("wrap") .value_name("mode") .value_parser(["auto", "never", "character"]) .default_value("auto") .hide_default_value(true) .help("Specify the text-wrapping mode (*auto*, never, character).") .long_help("Specify the text-wrapping mode (*auto*, never, character). \ The '--terminal-width' option can be used in addition to \ control the output width."), ) .arg( Arg::new("chop-long-lines") .long("chop-long-lines") .short('S') .action(ArgAction::SetTrue) .help("Truncate all lines longer than screen width. Alias for '--wrap=never'."), ) .arg( Arg::new("terminal-width") .long("terminal-width") .value_name("width") .hide_short_help(true) .allow_hyphen_values(true) .value_parser( |t: &str| { let is_offset = t.starts_with('+') || t.starts_with('-'); t.parse::() .map_err(|_e| "must be an offset or number") .and_then(|v| if v == 0 && !is_offset { Err("terminal width cannot be zero") } else { Ok(t.to_owned()) }) .map_err(|e| e.to_string()) }) .help( "Explicitly set the width of the terminal instead of determining it \ automatically. If prefixed with '+' or '-', the value will be treated \ as an offset to the actual terminal width. See also: '--wrap'.", ), ) .arg( Arg::new("number") .long("number") .overrides_with("number") .short('n') .action(ArgAction::SetTrue) .help("Show line numbers (alias for '--style=numbers').") .long_help( "Only show line numbers, no other decorations. This is an alias for \ '--style=numbers'", ), ) .arg( Arg::new("color") .long("color") .overrides_with("color") .value_name("when") .value_parser(["auto", "never", "always"]) .hide_default_value(true) .default_value("auto") .help("When to use colors (*auto*, never, always).") .long_help( "Specify when to use colored output. The automatic mode \ only enables colors if an interactive terminal is detected - \ colors are automatically disabled if the output goes to a pipe.\n\ Possible values: *auto*, never, always.", ), ) .arg( Arg::new("italic-text") .long("italic-text") .value_name("when") .value_parser(["always", "never"]) .default_value("never") .hide_default_value(true) .help("Use italics in output (always, *never*)") .long_help("Specify when to use ANSI sequences for italic text in the output. Possible values: always, *never*."), ) .arg( Arg::new("decorations") .long("decorations") .overrides_with("decorations") .value_name("when") .value_parser(["auto", "never", "always"]) .default_value("auto") .hide_default_value(true) .help("When to show the decorations (*auto*, never, always).") .long_help( "Specify when to use the decorations that have been specified \ via '--style'. The automatic mode only enables decorations if \ an interactive terminal is detected. Possible values: *auto*, never, always.", ), ) .arg( Arg::new("force-colorization") .long("force-colorization") .short('f') .action(ArgAction::SetTrue) .conflicts_with("color") .conflicts_with("decorations") .overrides_with("force-colorization") .hide_short_help(true) .long_help("Alias for '--decorations=always --color=always'. This is useful \ if the output of bat is piped to another program, but you want \ to keep the colorization/decorations.") ) .arg( Arg::new("paging") .long("paging") .overrides_with("paging") .overrides_with("no-paging") .value_name("when") .value_parser(["auto", "never", "always"]) .default_value("auto") .hide_default_value(true) .help("Specify when to use the pager, or use `-P` to disable (*auto*, never, always).") .long_help( "Specify when to use the pager. To disable the pager, use \ --paging=never' or its alias,'-P'. To disable the pager permanently, \ set BAT_PAGING to 'never'. To control which pager is used, see the \ '--pager' option. Possible values: *auto*, never, always." ), ) .arg( Arg::new("no-paging") .short('P') .long("no-paging") .alias("no-pager") .action(ArgAction::SetTrue) .overrides_with("no-paging") .hide(true) .hide_short_help(true) .help("Alias for '--paging=never'") ) .arg( Arg::new("pager") .long("pager") .overrides_with("pager") .value_name("command") .hide_short_help(true) .help("Determine which pager to use.") .long_help( "Determine which pager is used. This option will override the \ PAGER and BAT_PAGER environment variables. The default pager is 'less'. \ To control when the pager is used, see the '--paging' option. \ Example: '--pager \"less -RF\"'." ), ) .arg( Arg::new("map-syntax") .short('m') .long("map-syntax") .action(ArgAction::Append) .value_name("glob:syntax") .help("Use the specified syntax for files matching the glob pattern ('*.cpp:C++').") .long_help( "Map a glob pattern to an existing syntax name. The glob pattern is matched \ on the full path and the filename. For example, to highlight *.build files \ with the Python syntax, use -m '*.build:Python'. To highlight files named \ '.myignore' with the Git Ignore syntax, use -m '.myignore:Git Ignore'. Note \ that the right-hand side is the *name* of the syntax, not a file extension.", ) ) .arg( Arg::new("ignored-suffix") .action(ArgAction::Append) .long("ignored-suffix") .hide_short_help(true) .help( "Ignore extension. For example:\n \ 'bat --ignored-suffix \".dev\" my_file.json.dev' will use JSON syntax, and ignore '.dev'" ) ) .arg( Arg::new("theme") .long("theme") .overrides_with("theme") .help("Set the color theme for syntax highlighting.") .long_help( "Set the theme for syntax highlighting. Use '--list-themes' to \ see all available themes. To set a default theme, add the \ '--theme=\"...\"' option to the configuration file or export the \ BAT_THEME environment variable (e.g.: export \ BAT_THEME=\"...\").\n\n\ Special values:\n\n \ * auto: Picks a dark or light theme depending on the terminal's colors (default).\n \ Use '--theme-light' and '--theme-dark' to customize the selected theme.\n \ * auto:always: Detect the terminal's colors even when the output is redirected.\n \ * auto:system: Detect the color scheme from the system-wide preference (macOS only).\n \ * dark: Use the dark theme specified by '--theme-dark'.\n \ * light: Use the light theme specified by '--theme-light'.", ), ) .arg( Arg::new("theme-light") .long("theme-light") .overrides_with("theme-light") .value_name("theme") .help("Sets the color theme for syntax highlighting used for light backgrounds.") .long_help( "Sets the theme name for syntax highlighting used when the terminal uses a light background. \ Use '--list-themes' to see all available themes. To set a default theme, add the \ '--theme-light=\"...\" option to the configuration file or export the BAT_THEME_LIGHT \ environment variable (e.g. export BAT_THEME_LIGHT=\"...\")."), ) .arg( Arg::new("theme-dark") .long("theme-dark") .overrides_with("theme-dark") .value_name("theme") .help("Sets the color theme for syntax highlighting used for dark backgrounds.") .long_help( "Sets the theme name for syntax highlighting used when the terminal uses a dark background. \ Use '--list-themes' to see all available themes. To set a default theme, add the \ '--theme-dark=\"...\" option to the configuration file or export the BAT_THEME_DARK \ environment variable (e.g. export BAT_THEME_DARK=\"...\")."), ) .arg( Arg::new("list-themes") .long("list-themes") .action(ArgAction::SetTrue) .help("Display all supported highlighting themes.") .long_help("Display a list of supported themes for syntax highlighting."), ) .arg( Arg::new("squeeze-blank") .long("squeeze-blank") .short('s') .action(ArgAction::SetTrue) .help("Squeeze consecutive empty lines.") .long_help("Squeeze consecutive empty lines into a single empty line.") ) .arg( Arg::new("squeeze-limit") .long("squeeze-limit") .value_parser(|s: &str| s.parse::().map_err(|_| "Requires a non-negative number".to_owned())) .long_help("Set the maximum number of consecutive empty lines to be printed.") .hide_short_help(true) ) .arg( Arg::new("strip-ansi") .long("strip-ansi") .overrides_with("strip-ansi") .value_name("when") .value_parser(["auto", "always", "never"]) .default_value("never") .hide_default_value(true) .help("Strip colors from the input (auto, always, *never*)") .long_help("Specify when to strip ANSI escape sequences from the input. \ The automatic mode will remove escape sequences unless the syntax highlighting \ language is plain text. Possible values: auto, always, *never*.") .hide_short_help(true) ) .arg( Arg::new("style") .long("style") .action(ArgAction::Append) .value_name("components") // Cannot use claps built in validation because we have to turn off clap's delimiters .value_parser(|val: &str| { match StyleComponentList::from_str(val) { Err(err) => Err(err), Ok(_) => Ok(val.to_owned()), } }) .help( "Comma-separated list of style elements to display \ (*default*, auto, full, plain, changes, header, header-filename, header-filesize, grid, rule, numbers, snip).", ) .long_help( "Configure which elements (line numbers, file headers, grid \ borders, Git modifications, ..) to display in addition to the \ file contents. The argument is a comma-separated list of \ components to display (e.g. 'numbers,changes,grid') or a \ pre-defined style ('full'). To set a default style, add the \ '--style=\"..\"' option to the configuration file or export the \ BAT_STYLE environment variable (e.g.: export BAT_STYLE=\"..\").\n\n\ When styles are specified in multiple places, the \"nearest\" set \ of styles take precedence. The command-line arguments are the highest \ priority, followed by the BAT_STYLE environment variable, and then \ the configuration file. If any set of styles consists entirely of \ components prefixed with \"+\" or \"-\", it will modify the \ previous set of styles instead of replacing them.\n\n\ By default, the following components are enabled:\n \ changes, grid, header-filename, numbers, snip\n\n\ Possible values:\n\n \ * default: enables recommended style components (default).\n \ * full: enables all available components.\n \ * auto: same as 'default', unless the output is piped.\n \ * plain: disables all available components.\n \ * changes: show Git modification markers.\n \ * header: alias for 'header-filename'.\n \ * header-filename: show filenames before the content.\n \ * header-filesize: show file sizes before the content.\n \ * grid: vertical/horizontal lines to separate side bar\n \ and the header from the content.\n \ * rule: horizontal lines to delimit files.\n \ * numbers: show line numbers in the side bar.\n \ * snip: draw separation lines between distinct line ranges.", ), ) .arg( Arg::new("line-range") .long("line-range") .short('r') .action(ArgAction::Append) .value_name("N:M") .help("Only print the lines from N to M.") .long_help( "Only print the specified range of lines for each file. \ For example:\n \ '--line-range 30:40' prints lines 30 to 40\n \ '--line-range :40' prints lines 1 to 40\n \ '--line-range 40:' prints lines 40 to the end of the file\n \ '--line-range 40' only prints line 40\n \ '--line-range 30:+10' prints lines 30 to 40", ), ) .arg( Arg::new("list-languages") .long("list-languages") .short('L') .action(ArgAction::SetTrue) .conflicts_with("list-themes") .help("Display all supported languages.") .long_help("Display a list of supported languages for syntax highlighting."), ) .arg( Arg::new("unbuffered") .short('u') .long("unbuffered") .action(ArgAction::SetTrue) .hide_short_help(true) .long_help( "This option exists for POSIX-compliance reasons ('u' is for \ 'unbuffered'). The output is always unbuffered - this option \ is simply ignored.", ), ) .arg( Arg::new("no-config") .long("no-config") .action(ArgAction::SetTrue) .hide(true) .help("Do not use the configuration file"), ) .arg( Arg::new("no-custom-assets") .long("no-custom-assets") .action(ArgAction::SetTrue) .hide(true) .help("Do not load custom assets"), ); #[cfg(feature = "application")] { app = app.arg( Arg::new("completion") .long("completion") .value_name("SHELL") .value_parser(["bash", "fish", "ps1", "zsh"]) .help("Show shell completion for a certain shell. [possible values: bash, fish, zsh, ps1]"), ); } #[cfg(feature = "lessopen")] { app = app .arg( Arg::new("lessopen") .long("lessopen") .action(ArgAction::SetTrue) .help("Enable the $LESSOPEN preprocessor"), ) .arg( Arg::new("no-lessopen") .long("no-lessopen") .action(ArgAction::SetTrue) .overrides_with("lessopen") .hide(true) .help("Disable the $LESSOPEN preprocessor if enabled (overrides --lessopen)"), ) } app = app .arg( Arg::new("config-file") .long("config-file") .action(ArgAction::SetTrue) .conflicts_with("list-languages") .conflicts_with("list-themes") .hide(true) .help("Show path to the configuration file."), ) .arg( Arg::new("generate-config-file") .long("generate-config-file") .action(ArgAction::SetTrue) .conflicts_with("list-languages") .conflicts_with("list-themes") .hide(true) .help("Generates a default configuration file."), ) .arg( Arg::new("config-dir") .long("config-dir") .action(ArgAction::SetTrue) .hide(true) .help("Show bat's configuration directory."), ) .arg( Arg::new("cache-dir") .long("cache-dir") .action(ArgAction::SetTrue) .hide(true) .help("Show bat's cache directory."), ) .arg( Arg::new("diagnostic") .long("diagnostic") .alias("diagnostics") .action(ArgAction::SetTrue) .hide_short_help(true) .help("Show diagnostic information for bug reports."), ) .arg( Arg::new("acknowledgements") .long("acknowledgements") .action(ArgAction::SetTrue) .hide_short_help(true) .help("Show acknowledgements."), ) .arg( Arg::new("set-terminal-title") .long("set-terminal-title") .action(ArgAction::SetTrue) .hide_short_help(true) .help("Sets terminal title to filenames when using a pager."), ); // Check if the current directory contains a file name cache. Otherwise, // enable the 'bat cache' subcommand. if Path::new("cache").exists() { app } else { app.subcommand( Command::new("cache") .hide(true) .about("Modify the syntax-definition and theme cache") .arg( Arg::new("build") .long("build") .short('b') .action(ArgAction::SetTrue) .help("Initialize (or update) the syntax/theme cache.") .long_help( "Initialize (or update) the syntax/theme cache by loading from \ the source directory (default: the configuration directory).", ), ) .arg( Arg::new("clear") .long("clear") .short('c') .action(ArgAction::SetTrue) .help("Remove the cached syntax definitions and themes."), ) .group( ArgGroup::new("cache-actions") .args(["build", "clear"]) .required(true), ) .arg( Arg::new("source") .long("source") .requires("build") .value_name("dir") .help("Use a different directory to load syntaxes and themes from."), ) .arg( Arg::new("target") .long("target") .requires("build") .value_name("dir") .help( "Use a different directory to store the cached syntax and theme set.", ), ) .arg( Arg::new("blank") .long("blank") .action(ArgAction::SetTrue) .requires("build") .help( "Create completely new syntax and theme sets \ (instead of appending to the default sets).", ), ) .arg( Arg::new("acknowledgements") .long("acknowledgements") .action(ArgAction::SetTrue) .requires("build") .help("Build acknowledgements.bin."), ), ) .after_long_help( "You can use 'bat cache' to customize syntaxes and themes. \ See 'bat cache --help' for more information", ) } } #[test] fn verify_app() { build_app(false).debug_assert(); } bat-0.25.0/src/bin/bat/completions.rs000064400000000000000000000005471046102023000154730ustar 00000000000000use std::env; pub const BASH_COMPLETION: &str = include_str!(env!("BAT_GENERATED_COMPLETION_BASH")); pub const FISH_COMPLETION: &str = include_str!(env!("BAT_GENERATED_COMPLETION_FISH")); pub const PS1_COMPLETION: &str = include_str!(env!("BAT_GENERATED_COMPLETION_PS1")); pub const ZSH_COMPLETION: &str = include_str!(env!("BAT_GENERATED_COMPLETION_ZSH")); bat-0.25.0/src/bin/bat/config.rs000064400000000000000000000131441046102023000144010ustar 00000000000000use std::env; use std::ffi::OsString; use std::fs; use std::io::{self, Write}; use std::path::PathBuf; use crate::directories::PROJECT_DIRS; #[cfg(not(target_os = "windows"))] const DEFAULT_SYSTEM_CONFIG_PREFIX: &str = "/etc"; #[cfg(target_os = "windows")] const DEFAULT_SYSTEM_CONFIG_PREFIX: &str = "C:\\ProgramData"; pub fn system_config_file() -> PathBuf { let folder = option_env!("BAT_SYSTEM_CONFIG_PREFIX").unwrap_or(DEFAULT_SYSTEM_CONFIG_PREFIX); let mut path = PathBuf::from(folder); path.push("bat"); path.push("config"); path } pub fn config_file() -> PathBuf { env::var("BAT_CONFIG_PATH") .ok() .map(PathBuf::from) .unwrap_or_else(|| PROJECT_DIRS.config_dir().join("config")) } pub fn generate_config_file() -> bat::error::Result<()> { let config_file = config_file(); if config_file.is_file() { println!( "A config file already exists at: {}", config_file.to_string_lossy() ); print!("Overwrite? (y/N): "); io::stdout().flush()?; let mut decision = String::new(); io::stdin().read_line(&mut decision)?; if !decision.trim().eq_ignore_ascii_case("Y") { return Ok(()); } } else { let config_dir = config_file.parent(); match config_dir { Some(path) => fs::create_dir_all(path)?, None => { return Err(format!( "Unable to write config file to: {}", config_file.to_string_lossy() ) .into()); } } } let default_config = r#"# This is `bat`s configuration file. Each line either contains a comment or # a command-line option that you want to pass to `bat` by default. You can # run `bat --help` to get a list of all possible configuration options. # Specify desired highlighting theme (e.g. "TwoDark"). Run `bat --list-themes` # for a list of all available themes #--theme="TwoDark" # Enable this to use italic text on the terminal. This is not supported on all # terminal emulators (like tmux, by default): #--italic-text=always # Uncomment the following line to disable automatic paging: #--paging=never # Uncomment the following line if you are using less version >= 551 and want to # enable mouse scrolling support in `bat` when running inside tmux. This might # disable text selection, unless you press shift. #--pager="less --RAW-CONTROL-CHARS --quit-if-one-screen --mouse" # Syntax mappings: map a certain filename pattern to a language. # Example 1: use the C++ syntax for Arduino .ino files # Example 2: Use ".gitignore"-style highlighting for ".ignore" files #--map-syntax "*.ino:C++" #--map-syntax ".ignore:Git Ignore" "#; fs::write(&config_file, default_config).map_err(|e| { format!( "Failed to create config file at '{}': {}", config_file.to_string_lossy(), e ) })?; println!( "Success! Config file written to {}", config_file.to_string_lossy() ); Ok(()) } pub fn get_args_from_config_file() -> Result, shell_words::ParseError> { let mut config = String::new(); if let Ok(c) = fs::read_to_string(system_config_file()) { config.push_str(&c); config.push('\n'); } if let Ok(c) = fs::read_to_string(config_file()) { config.push_str(&c); } get_args_from_str(&config) } pub fn get_args_from_env_opts_var() -> Option, shell_words::ParseError>> { env::var("BAT_OPTS").ok().map(|s| get_args_from_str(&s)) } fn get_args_from_str(content: &str) -> Result, shell_words::ParseError> { let args_per_line = content .split('\n') .map(|line| line.trim()) .filter(|line| !line.is_empty()) .filter(|line| !line.starts_with('#')) .map(shell_words::split) .collect::, _>>()?; Ok(args_per_line .iter() .flatten() .map(|line| line.into()) .collect()) } pub fn get_args_from_env_vars() -> Vec { [ ("--tabs", "BAT_TABS"), ("--theme", bat::theme::env::BAT_THEME), ("--theme-dark", bat::theme::env::BAT_THEME_DARK), ("--theme-light", bat::theme::env::BAT_THEME_LIGHT), ("--pager", "BAT_PAGER"), ("--paging", "BAT_PAGING"), ("--style", "BAT_STYLE"), ] .iter() .filter_map(|(flag, key)| { env::var(key) .ok() .map(|var| [flag.to_string(), var].join("=")) }) .map(|a| a.into()) .collect() } #[test] fn empty() { let args = get_args_from_str("").unwrap(); assert!(args.is_empty()); } #[test] fn single() { assert_eq!(vec!["--plain"], get_args_from_str("--plain").unwrap()); } #[test] fn multiple() { assert_eq!( vec!["--plain", "--language=cpp"], get_args_from_str("--plain --language=cpp").unwrap() ); } #[test] fn quotes() { assert_eq!( vec!["--theme", "Sublime Snazzy"], get_args_from_str("--theme \"Sublime Snazzy\"").unwrap() ); } #[test] fn multi_line() { let config = " -p --style numbers,changes --color=always "; assert_eq!( vec!["-p", "--style", "numbers,changes", "--color=always"], get_args_from_str(config).unwrap() ); } #[test] fn comments() { let config = " # plain style -p # show line numbers and Git modifications --style numbers,changes # Always show ANSI colors --color=always "; assert_eq!( vec!["-p", "--style", "numbers,changes", "--color=always"], get_args_from_str(config).unwrap() ); } bat-0.25.0/src/bin/bat/directories.rs000064400000000000000000000030351046102023000154460ustar 00000000000000use std::env; use std::path::{Path, PathBuf}; use etcetera::BaseStrategy; use once_cell::sync::Lazy; /// Wrapper for 'etcetera' that checks BAT_CACHE_PATH and BAT_CONFIG_DIR and falls back to the /// Windows known folder locations on Windows & the XDG Base Directory Specification everywhere else. pub struct BatProjectDirs { cache_dir: PathBuf, config_dir: PathBuf, } impl BatProjectDirs { fn new() -> Option { let basedirs = etcetera::choose_base_strategy().ok()?; // Checks whether or not `$BAT_CACHE_PATH` exists. If it doesn't, set the cache dir to our // system's default cache home. let cache_dir = if let Some(cache_dir) = env::var_os("BAT_CACHE_PATH").map(PathBuf::from) { cache_dir } else { basedirs.cache_dir().join("bat") }; // Checks whether or not `$BAT_CONFIG_DIR` exists. If it doesn't, set the config dir to our // system's default configuration home. let config_dir = if let Some(config_dir) = env::var_os("BAT_CONFIG_DIR").map(PathBuf::from) { config_dir } else { basedirs.config_dir().join("bat") }; Some(BatProjectDirs { cache_dir, config_dir, }) } pub fn cache_dir(&self) -> &Path { &self.cache_dir } pub fn config_dir(&self) -> &Path { &self.config_dir } } pub static PROJECT_DIRS: Lazy = Lazy::new(|| BatProjectDirs::new().expect("Could not get home directory")); bat-0.25.0/src/bin/bat/input.rs000064400000000000000000000010631046102023000142700ustar 00000000000000use bat::input::Input; use std::path::Path; pub fn new_file_input<'a>(file: &'a Path, name: Option<&'a Path>) -> Input<'a> { named(Input::ordinary_file(file), name.or(Some(file))) } pub fn new_stdin_input(name: Option<&Path>) -> Input { named(Input::stdin(), name) } fn named<'a>(input: Input<'a>, name: Option<&Path>) -> Input<'a> { if let Some(provided_name) = name { let mut input = input.with_name(Some(provided_name)); input.description_mut().set_kind(Some("File".to_owned())); input } else { input } } bat-0.25.0/src/bin/bat/main.rs000064400000000000000000000352421046102023000140630ustar 00000000000000#![deny(unsafe_code)] mod app; mod assets; mod clap_app; #[cfg(feature = "application")] mod completions; mod config; mod directories; mod input; use std::collections::{HashMap, HashSet}; use std::fmt::Write as _; use std::io; use std::io::{BufReader, Write}; use std::path::Path; use std::process; use bat::theme::DetectColorScheme; use nu_ansi_term::Color::Green; use nu_ansi_term::Style; use crate::{ app::App, config::{config_file, generate_config_file}, }; #[cfg(feature = "bugreport")] use crate::config::system_config_file; use assets::{assets_from_cache_or_binary, clear_assets}; use directories::PROJECT_DIRS; use globset::GlobMatcher; use bat::{ config::Config, controller::Controller, error::*, input::Input, style::{StyleComponent, StyleComponents}, theme::{color_scheme, default_theme, ColorScheme}, MappingTarget, PagingMode, }; const THEME_PREVIEW_DATA: &[u8] = include_bytes!("../../../assets/theme_preview.rs"); #[cfg(feature = "build-assets")] fn build_assets(matches: &clap::ArgMatches, config_dir: &Path, cache_dir: &Path) -> Result<()> { let source_dir = matches .get_one::("source") .map(Path::new) .unwrap_or_else(|| config_dir); bat::assets::build( source_dir, !matches.get_flag("blank"), matches.get_flag("acknowledgements"), cache_dir, clap::crate_version!(), ) } fn run_cache_subcommand( matches: &clap::ArgMatches, #[cfg(feature = "build-assets")] config_dir: &Path, default_cache_dir: &Path, ) -> Result<()> { let cache_dir = matches .get_one::("target") .map(Path::new) .unwrap_or_else(|| default_cache_dir); if matches.get_flag("build") { #[cfg(feature = "build-assets")] build_assets(matches, config_dir, cache_dir)?; #[cfg(not(feature = "build-assets"))] println!("bat has been built without the 'build-assets' feature. The 'cache --build' option is not available."); } else if matches.get_flag("clear") { clear_assets(cache_dir); } Ok(()) } fn get_syntax_mapping_to_paths<'r, 't, I>(mappings: I) -> HashMap<&'t str, Vec> where I: IntoIterator)>, 't: 'r, // target text outlives rule { let mut map = HashMap::new(); for mapping in mappings { if let (matcher, MappingTarget::MapTo(s)) = mapping { let globs = map.entry(*s).or_insert_with(Vec::new); globs.push(matcher.glob().glob().into()); } } map } pub fn get_languages(config: &Config, cache_dir: &Path) -> Result { let mut result: String = String::new(); let assets = assets_from_cache_or_binary(config.use_custom_assets, cache_dir)?; let mut languages = assets .get_syntaxes()? .iter() .filter(|syntax| !syntax.hidden && !syntax.file_extensions.is_empty()) .cloned() .collect::>(); // Handling of file-extension conflicts, see issue #1076 for lang in &mut languages { let lang_name = lang.name.clone(); lang.file_extensions.retain(|extension| { // The 'extension' variable is not certainly a real extension. // // Skip if 'extension' starts with '.', likely a hidden file like '.vimrc' // Also skip if the 'extension' contains another real extension, likely // that is a full match file name like 'CMakeLists.txt' and 'Cargo.lock' if extension.starts_with('.') || Path::new(extension).extension().is_some() { return true; } let test_file = Path::new("test").with_extension(extension); let syntax_in_set = assets.get_syntax_for_path(test_file, &config.syntax_mapping); matches!(syntax_in_set, Ok(syntax_in_set) if syntax_in_set.syntax.name == lang_name) }); } languages.sort_by_key(|lang| lang.name.to_uppercase()); let configured_languages = get_syntax_mapping_to_paths(config.syntax_mapping.all_mappings()); for lang in &mut languages { if let Some(additional_paths) = configured_languages.get(lang.name.as_str()) { lang.file_extensions .extend(additional_paths.iter().cloned()); } } if config.loop_through { for lang in languages { writeln!(result, "{}:{}", lang.name, lang.file_extensions.join(",")).ok(); } } else { let longest = languages .iter() .map(|syntax| syntax.name.len()) .max() .unwrap_or(32); // Fallback width if they have no language definitions. let comma_separator = ", "; let separator = " "; // Line-wrapping for the possible file extension overflow. let desired_width = config.term_width - longest - separator.len(); let style = if config.colored_output { Green.normal() } else { Style::default() }; for lang in languages { write!(result, "{:width$}{}", lang.name, separator, width = longest).ok(); // Number of characters on this line so far, wrap before `desired_width` let mut num_chars = 0; let mut extension = lang.file_extensions.iter().peekable(); while let Some(word) = extension.next() { // If we can't fit this word in, then create a line break and align it in. let new_chars = word.len() + comma_separator.len(); if num_chars + new_chars >= desired_width { num_chars = 0; write!(result, "\n{:width$}{}", "", separator, width = longest).ok(); } num_chars += new_chars; write!(result, "{}", style.paint(&word[..])).ok(); if extension.peek().is_some() { result += comma_separator; } } result += "\n"; } } Ok(result) } fn theme_preview_file<'a>() -> Input<'a> { Input::from_reader(Box::new(BufReader::new(THEME_PREVIEW_DATA))) } pub fn list_themes( cfg: &Config, config_dir: &Path, cache_dir: &Path, detect_color_scheme: DetectColorScheme, ) -> Result<()> { let assets = assets_from_cache_or_binary(cfg.use_custom_assets, cache_dir)?; let mut config = cfg.clone(); let mut style = HashSet::new(); style.insert(StyleComponent::Plain); config.language = Some("Rust"); config.style_components = StyleComponents(style); let stdout = io::stdout(); let mut stdout = stdout.lock(); let default_theme_name = default_theme(color_scheme(detect_color_scheme).unwrap_or_default()); for theme in assets.themes() { let default_theme_info = if !config.loop_through && default_theme_name == theme { " (default)" } else if default_theme(ColorScheme::Dark) == theme { " (default dark)" } else if default_theme(ColorScheme::Light) == theme { " (default light)" } else { "" }; if config.colored_output { writeln!( stdout, "Theme: {}{}\n", Style::new().bold().paint(theme.to_string()), default_theme_info )?; config.theme = theme.to_string(); Controller::new(&config, &assets) .run(vec![theme_preview_file()], None) .ok(); writeln!(stdout)?; } else { writeln!(stdout, "{theme}{default_theme_info}")?; } } if config.colored_output { writeln!( stdout, "Further themes can be installed to '{}', \ and are added to the cache with `bat cache --build`. \ For more information, see:\n\n \ https://github.com/sharkdp/bat#adding-new-themes", config_dir.join("themes").to_string_lossy() )?; } Ok(()) } fn set_terminal_title_to(new_terminal_title: String) { let osc_command_for_setting_terminal_title = "\x1b]0;"; let osc_end_command = "\x07"; print!("{osc_command_for_setting_terminal_title}{new_terminal_title}{osc_end_command}"); io::stdout().flush().unwrap(); } fn get_new_terminal_title(inputs: &Vec) -> String { let mut new_terminal_title = "bat: ".to_string(); for (index, input) in inputs.iter().enumerate() { new_terminal_title += input.description().title(); if index < inputs.len() - 1 { new_terminal_title += ", "; } } new_terminal_title } fn run_controller(inputs: Vec, config: &Config, cache_dir: &Path) -> Result { let assets = assets_from_cache_or_binary(config.use_custom_assets, cache_dir)?; let controller = Controller::new(config, &assets); if config.paging_mode != PagingMode::Never && config.set_terminal_title { set_terminal_title_to(get_new_terminal_title(&inputs)); } controller.run(inputs, None) } #[cfg(feature = "bugreport")] fn invoke_bugreport(app: &App, cache_dir: &Path) { use bugreport::{bugreport, collector::*, format::Markdown}; let pager = bat::config::get_pager_executable( app.matches.get_one::("pager").map(|s| s.as_str()), ) .unwrap_or_else(|| "less".to_owned()); // FIXME: Avoid non-canonical path to "less". let mut custom_assets_metadata = cache_dir.to_path_buf(); custom_assets_metadata.push("metadata.yaml"); let mut report = bugreport!() .info(SoftwareVersion::default()) .info(OperatingSystem::default()) .info(CommandLine::default()) .info(EnvironmentVariables::list(&[ "BAT_CACHE_PATH", "BAT_CONFIG_PATH", "BAT_OPTS", "BAT_PAGER", "BAT_PAGING", "BAT_STYLE", "BAT_TABS", "BAT_THEME", "COLORTERM", "LANG", "LC_ALL", "LESS", "MANPAGER", "NO_COLOR", "PAGER", "SHELL", "TERM", "XDG_CACHE_HOME", "XDG_CONFIG_HOME", ])) .info(FileContent::new("System Config file", system_config_file())) .info(FileContent::new("Config file", config_file())) .info(FileContent::new( "Custom assets metadata", custom_assets_metadata, )) .info(DirectoryEntries::new("Custom assets", cache_dir)) .info(CompileTimeInformation::default()); #[cfg(feature = "paging")] if let Ok(resolved_path) = grep_cli::resolve_binary(pager) { report = report.info(CommandOutput::new( "Less version", resolved_path, &["--version"], )) }; report.print::(); } /// Returns `Err(..)` upon fatal errors. Otherwise, returns `Ok(true)` on full success and /// `Ok(false)` if any intermediate errors occurred (were printed). fn run() -> Result { let app = App::new()?; let config_dir = PROJECT_DIRS.config_dir(); let cache_dir = PROJECT_DIRS.cache_dir(); if app.matches.get_flag("diagnostic") { #[cfg(feature = "bugreport")] invoke_bugreport(&app, cache_dir); #[cfg(not(feature = "bugreport"))] println!("bat has been built without the 'bugreport' feature. The '--diagnostic' option is not available."); return Ok(true); } #[cfg(feature = "application")] if let Some(shell) = app.matches.get_one::("completion") { match shell.as_str() { "bash" => println!("{}", completions::BASH_COMPLETION), "fish" => println!("{}", completions::FISH_COMPLETION), "ps1" => println!("{}", completions::PS1_COMPLETION), "zsh" => println!("{}", completions::ZSH_COMPLETION), _ => unreachable!("No completion for shell '{}' available.", shell), } return Ok(true); } match app.matches.subcommand() { Some(("cache", cache_matches)) => { // If there is a file named 'cache' in the current working directory, // arguments for subcommand 'cache' are not mandatory. // If there are non-zero arguments, execute the subcommand cache, else, open the file cache. if cache_matches.args_present() { run_cache_subcommand( cache_matches, #[cfg(feature = "build-assets")] config_dir, cache_dir, )?; Ok(true) } else { let inputs = vec![Input::ordinary_file("cache")]; let config = app.config(&inputs)?; run_controller(inputs, &config, cache_dir) } } _ => { let inputs = app.inputs()?; let config = app.config(&inputs)?; if app.matches.get_flag("list-languages") { let languages: String = get_languages(&config, cache_dir)?; let inputs: Vec = vec![Input::from_reader(Box::new(languages.as_bytes()))]; let plain_config = Config { style_components: StyleComponents::new(StyleComponent::Plain.components(false)), paging_mode: PagingMode::QuitIfOneScreen, ..Default::default() }; run_controller(inputs, &plain_config, cache_dir) } else if app.matches.get_flag("list-themes") { list_themes(&config, config_dir, cache_dir, DetectColorScheme::default())?; Ok(true) } else if app.matches.get_flag("config-file") { println!("{}", config_file().to_string_lossy()); Ok(true) } else if app.matches.get_flag("generate-config-file") { generate_config_file()?; Ok(true) } else if app.matches.get_flag("config-dir") { writeln!(io::stdout(), "{}", config_dir.to_string_lossy())?; Ok(true) } else if app.matches.get_flag("cache-dir") { writeln!(io::stdout(), "{}", cache_dir.to_string_lossy())?; Ok(true) } else if app.matches.get_flag("acknowledgements") { writeln!(io::stdout(), "{}", bat::assets::get_acknowledgements())?; Ok(true) } else { run_controller(inputs, &config, cache_dir) } } } } fn main() { let result = run(); match result { Err(error) => { let stderr = std::io::stderr(); default_error_handler(&error, &mut stderr.lock()); process::exit(1); } Ok(false) => { process::exit(1); } Ok(true) => { process::exit(0); } } } bat-0.25.0/src/config.rs000064400000000000000000000075161046102023000130710ustar 00000000000000use crate::line_range::{HighlightedLineRanges, LineRanges}; use crate::nonprintable_notation::{BinaryBehavior, NonprintableNotation}; #[cfg(feature = "paging")] use crate::paging::PagingMode; use crate::style::StyleComponents; use crate::syntax_mapping::SyntaxMapping; use crate::wrapping::WrappingMode; use crate::StripAnsiMode; #[derive(Debug, Clone)] pub enum VisibleLines { /// Show all lines which are included in the line ranges Ranges(LineRanges), #[cfg(feature = "git")] /// Only show lines surrounding added/deleted/modified lines DiffContext(usize), } impl VisibleLines { pub fn diff_mode(&self) -> bool { match self { Self::Ranges(_) => false, #[cfg(feature = "git")] Self::DiffContext(_) => true, } } } impl Default for VisibleLines { fn default() -> Self { VisibleLines::Ranges(LineRanges::default()) } } #[derive(Debug, Clone, Default)] pub struct Config<'a> { /// The explicitly configured language, if any pub language: Option<&'a str>, /// Whether or not to show/replace non-printable characters like space, tab and newline. pub show_nonprintable: bool, /// The configured notation for non-printable characters pub nonprintable_notation: NonprintableNotation, /// How to treat binary content pub binary: BinaryBehavior, /// The character width of the terminal pub term_width: usize, /// The width of tab characters. /// Currently, a value of 0 will cause tabs to be passed through without expanding them. pub tab_width: usize, /// Whether or not to simply loop through all input (`cat` mode) pub loop_through: bool, /// Whether or not the output should be colorized pub colored_output: bool, /// Whether or not the output terminal supports true color pub true_color: bool, /// Style elements (grid, line numbers, ...) pub style_components: StyleComponents, /// If and how text should be wrapped pub wrapping_mode: WrappingMode, /// Pager or STDOUT #[cfg(feature = "paging")] pub paging_mode: PagingMode, /// Specifies which lines should be printed pub visible_lines: VisibleLines, /// The syntax highlighting theme pub theme: String, /// File extension/name mappings pub syntax_mapping: SyntaxMapping<'a>, /// Command to start the pager pub pager: Option<&'a str>, /// Whether or not to use ANSI italics pub use_italic_text: bool, /// Ranges of lines which should be highlighted with a special background color pub highlighted_lines: HighlightedLineRanges, /// Whether or not to allow custom assets. If this is false or if custom assets (a.k.a. /// cached assets) are not available, assets from the binary will be used instead. pub use_custom_assets: bool, // Whether or not to use $LESSOPEN if set #[cfg(feature = "lessopen")] pub use_lessopen: bool, // Weather or not to set terminal title when using a pager pub set_terminal_title: bool, /// The maximum number of consecutive empty lines to display pub squeeze_lines: Option, // Weather or not to set terminal title when using a pager pub strip_ansi: StripAnsiMode, } #[cfg(all(feature = "minimal-application", feature = "paging"))] pub fn get_pager_executable(config_pager: Option<&str>) -> Option { crate::pager::get_pager(config_pager) .ok() .flatten() .map(|pager| pager.bin) } #[test] fn default_config_should_include_all_lines() { use crate::line_range::RangeCheckResult; assert_eq!(LineRanges::default().check(17), RangeCheckResult::InRange); } #[test] fn default_config_should_highlight_no_lines() { use crate::line_range::RangeCheckResult; assert_ne!( Config::default().highlighted_lines.0.check(17), RangeCheckResult::InRange ); } bat-0.25.0/src/controller.rs000064400000000000000000000226571046102023000140120ustar 00000000000000use std::io::{self, BufRead, Write}; use crate::assets::HighlightingAssets; use crate::config::{Config, VisibleLines}; #[cfg(feature = "git")] use crate::diff::{get_git_diff, LineChanges}; use crate::error::*; use crate::input::{Input, InputReader, OpenedInput}; #[cfg(feature = "lessopen")] use crate::lessopen::LessOpenPreprocessor; #[cfg(feature = "git")] use crate::line_range::LineRange; use crate::line_range::{LineRanges, RangeCheckResult}; use crate::output::OutputType; #[cfg(feature = "paging")] use crate::paging::PagingMode; use crate::printer::{InteractivePrinter, OutputHandle, Printer, SimplePrinter}; use clircle::{Clircle, Identifier}; pub struct Controller<'a> { config: &'a Config<'a>, assets: &'a HighlightingAssets, #[cfg(feature = "lessopen")] preprocessor: Option, } impl<'b> Controller<'b> { pub fn new<'a>(config: &'a Config, assets: &'a HighlightingAssets) -> Controller<'a> { Controller { config, assets, #[cfg(feature = "lessopen")] preprocessor: LessOpenPreprocessor::new().ok(), } } pub fn run( &self, inputs: Vec, output_buffer: Option<&mut dyn std::fmt::Write>, ) -> Result { self.run_with_error_handler(inputs, output_buffer, default_error_handler) } pub fn run_with_error_handler( &self, inputs: Vec, output_buffer: Option<&mut dyn std::fmt::Write>, mut handle_error: impl FnMut(&Error, &mut dyn Write), ) -> Result { let mut output_type; #[cfg(feature = "paging")] { use crate::input::InputKind; use std::path::Path; // Do not launch the pager if NONE of the input files exist let mut paging_mode = self.config.paging_mode; if self.config.paging_mode != PagingMode::Never { let call_pager = inputs.iter().any(|input| { if let InputKind::OrdinaryFile(ref path) = input.kind { Path::new(path).exists() } else { true } }); if !call_pager { paging_mode = PagingMode::Never; } } let wrapping_mode = self.config.wrapping_mode; output_type = OutputType::from_mode(paging_mode, wrapping_mode, self.config.pager)?; } #[cfg(not(feature = "paging"))] { output_type = OutputType::stdout(); } let attached_to_pager = output_type.is_pager(); let stdout_identifier = if cfg!(windows) || attached_to_pager { None } else { clircle::Identifier::stdout() }; let mut writer = match output_buffer { Some(buf) => OutputHandle::FmtWrite(buf), None => OutputHandle::IoWrite(output_type.handle()?), }; let mut no_errors: bool = true; let stderr = io::stderr(); for (index, input) in inputs.into_iter().enumerate() { let identifier = stdout_identifier.as_ref(); let is_first = index == 0; let result = if input.is_stdin() { self.print_input(input, &mut writer, io::stdin().lock(), identifier, is_first) } else { // Use dummy stdin since stdin is actually not used (#1902) self.print_input(input, &mut writer, io::empty(), identifier, is_first) }; if let Err(error) = result { match writer { // It doesn't make much sense to send errors straight to stderr if the user // provided their own buffer, so we just return it. OutputHandle::FmtWrite(_) => return Err(error), OutputHandle::IoWrite(ref mut writer) => { if attached_to_pager { handle_error(&error, writer); } else { handle_error(&error, &mut stderr.lock()); } } } no_errors = false; } } Ok(no_errors) } fn print_input( &self, input: Input, writer: &mut OutputHandle, stdin: R, stdout_identifier: Option<&Identifier>, is_first: bool, ) -> Result<()> { let mut opened_input = { #[cfg(feature = "lessopen")] match self.preprocessor { Some(ref preprocessor) if self.config.use_lessopen => { preprocessor.open(input, stdin, stdout_identifier)? } _ => input.open(stdin, stdout_identifier)?, } #[cfg(not(feature = "lessopen"))] input.open(stdin, stdout_identifier)? }; #[cfg(feature = "git")] let line_changes = if self.config.visible_lines.diff_mode() || (!self.config.loop_through && self.config.style_components.changes()) { match opened_input.kind { crate::input::OpenedInputKind::OrdinaryFile(ref path) => { let diff = get_git_diff(path); // Skip files without Git modifications if self.config.visible_lines.diff_mode() && diff .as_ref() .map(|changes| changes.is_empty()) .unwrap_or(false) { return Ok(()); } diff } _ if self.config.visible_lines.diff_mode() => { // Skip non-file inputs in diff mode return Ok(()); } _ => None, } } else { None }; let mut printer: Box = if self.config.loop_through { Box::new(SimplePrinter::new(self.config)) } else { Box::new(InteractivePrinter::new( self.config, self.assets, &mut opened_input, #[cfg(feature = "git")] &line_changes, )?) }; self.print_file( &mut *printer, writer, &mut opened_input, !is_first, #[cfg(feature = "git")] &line_changes, ) } fn print_file( &self, printer: &mut dyn Printer, writer: &mut OutputHandle, input: &mut OpenedInput, add_header_padding: bool, #[cfg(feature = "git")] line_changes: &Option, ) -> Result<()> { if !input.reader.first_line.is_empty() || self.config.style_components.header() { printer.print_header(writer, input, add_header_padding)?; } if !input.reader.first_line.is_empty() { let line_ranges = match self.config.visible_lines { VisibleLines::Ranges(ref line_ranges) => line_ranges.clone(), #[cfg(feature = "git")] VisibleLines::DiffContext(context) => { let mut line_ranges: Vec = vec![]; if let Some(line_changes) = line_changes { for &line in line_changes.keys() { let line = line as usize; line_ranges .push(LineRange::new(line.saturating_sub(context), line + context)); } } LineRanges::from(line_ranges) } }; self.print_file_ranges(printer, writer, &mut input.reader, &line_ranges)?; } printer.print_footer(writer, input)?; Ok(()) } fn print_file_ranges( &self, printer: &mut dyn Printer, writer: &mut OutputHandle, reader: &mut InputReader, line_ranges: &LineRanges, ) -> Result<()> { let mut line_buffer = Vec::new(); let mut line_number: usize = 1; let mut first_range: bool = true; let mut mid_range: bool = false; let style_snip = self.config.style_components.snip(); while reader.read_line(&mut line_buffer)? { match line_ranges.check(line_number) { RangeCheckResult::BeforeOrBetweenRanges => { // Call the printer in case we need to call the syntax highlighter // for this line. However, set `out_of_range` to `true`. printer.print_line(true, writer, line_number, &line_buffer)?; mid_range = false; } RangeCheckResult::InRange => { if style_snip { if first_range { first_range = false; mid_range = true; } else if !mid_range { mid_range = true; printer.print_snip(writer)?; } } printer.print_line(false, writer, line_number, &line_buffer)?; } RangeCheckResult::AfterLastRange => { break; } } line_number += 1; line_buffer.clear(); } Ok(()) } } bat-0.25.0/src/decorations.rs000064400000000000000000000104121046102023000141230ustar 00000000000000#[cfg(feature = "git")] use crate::diff::LineChange; use crate::printer::{Colors, InteractivePrinter}; use nu_ansi_term::Style; #[derive(Debug, Clone)] pub(crate) struct DecorationText { pub width: usize, pub text: String, } pub(crate) trait Decoration { fn generate( &self, line_number: usize, continuation: bool, printer: &InteractivePrinter, ) -> DecorationText; fn width(&self) -> usize; } pub(crate) struct LineNumberDecoration { color: Style, cached_wrap: DecorationText, cached_wrap_invalid_at: usize, } impl LineNumberDecoration { pub(crate) fn new(colors: &Colors) -> Self { LineNumberDecoration { color: colors.line_number, cached_wrap_invalid_at: 10000, cached_wrap: DecorationText { text: colors.line_number.paint(" ".repeat(4)).to_string(), width: 4, }, } } } impl Decoration for LineNumberDecoration { fn generate( &self, line_number: usize, continuation: bool, _printer: &InteractivePrinter, ) -> DecorationText { if continuation { if line_number >= self.cached_wrap_invalid_at { let new_width = self.cached_wrap.width + 1; return DecorationText { text: self.color.paint(" ".repeat(new_width)).to_string(), width: new_width, }; } self.cached_wrap.clone() } else { let plain: String = format!("{line_number:4}"); DecorationText { width: plain.len(), text: self.color.paint(plain).to_string(), } } } fn width(&self) -> usize { 4 } } #[cfg(feature = "git")] pub(crate) struct LineChangesDecoration { cached_none: DecorationText, cached_added: DecorationText, cached_removed_above: DecorationText, cached_removed_below: DecorationText, cached_modified: DecorationText, } #[cfg(feature = "git")] impl LineChangesDecoration { #[inline] fn generate_cached(style: Style, text: &str) -> DecorationText { DecorationText { text: style.paint(text).to_string(), width: text.chars().count(), } } pub(crate) fn new(colors: &Colors) -> Self { LineChangesDecoration { cached_none: Self::generate_cached(Style::default(), " "), cached_added: Self::generate_cached(colors.git_added, "+"), cached_removed_above: Self::generate_cached(colors.git_removed, "β€Ύ"), cached_removed_below: Self::generate_cached(colors.git_removed, "_"), cached_modified: Self::generate_cached(colors.git_modified, "~"), } } } #[cfg(feature = "git")] impl Decoration for LineChangesDecoration { fn generate( &self, line_number: usize, continuation: bool, printer: &InteractivePrinter, ) -> DecorationText { if !continuation { if let Some(ref changes) = printer.line_changes { return match changes.get(&(line_number as u32)) { Some(&LineChange::Added) => self.cached_added.clone(), Some(&LineChange::RemovedAbove) => self.cached_removed_above.clone(), Some(&LineChange::RemovedBelow) => self.cached_removed_below.clone(), Some(&LineChange::Modified) => self.cached_modified.clone(), _ => self.cached_none.clone(), }; } } self.cached_none.clone() } fn width(&self) -> usize { self.cached_none.width } } pub(crate) struct GridBorderDecoration { cached: DecorationText, } impl GridBorderDecoration { pub(crate) fn new(colors: &Colors) -> Self { GridBorderDecoration { cached: DecorationText { text: colors.grid.paint("β”‚").to_string(), width: 1, }, } } } impl Decoration for GridBorderDecoration { fn generate( &self, _line_number: usize, _continuation: bool, _printer: &InteractivePrinter, ) -> DecorationText { self.cached.clone() } fn width(&self) -> usize { self.cached.width } } bat-0.25.0/src/diff.rs000064400000000000000000000046761046102023000125400ustar 00000000000000#![cfg(feature = "git")] use std::collections::HashMap; use std::fs; use std::path::Path; use git2::{DiffOptions, IntoCString, Repository}; #[derive(Copy, Clone, Debug)] pub enum LineChange { Added, RemovedAbove, RemovedBelow, Modified, } pub type LineChanges = HashMap; pub fn get_git_diff(filename: &Path) -> Option { let repo = Repository::discover(filename).ok()?; let repo_path_absolute = fs::canonicalize(repo.workdir()?).ok()?; let filepath_absolute = fs::canonicalize(filename).ok()?; let filepath_relative_to_repo = filepath_absolute.strip_prefix(&repo_path_absolute).ok()?; let mut diff_options = DiffOptions::new(); let pathspec = filepath_relative_to_repo.into_c_string().ok()?; diff_options.pathspec(pathspec); diff_options.context_lines(0); let diff = repo .diff_index_to_workdir(None, Some(&mut diff_options)) .ok()?; let mut line_changes: LineChanges = HashMap::new(); let mark_section = |line_changes: &mut LineChanges, start: u32, end: i32, change: LineChange| { for line in start..=end as u32 { line_changes.insert(line, change); } }; let _ = diff.foreach( &mut |_, _| true, None, Some(&mut |delta, hunk| { let path = delta.new_file().path().unwrap_or_else(|| Path::new("")); if filepath_relative_to_repo != path { return false; } let old_lines = hunk.old_lines(); let new_start = hunk.new_start(); let new_lines = hunk.new_lines(); let new_end = (new_start + new_lines) as i32 - 1; if old_lines == 0 && new_lines > 0 { mark_section(&mut line_changes, new_start, new_end, LineChange::Added); } else if new_lines == 0 && old_lines > 0 { if new_start == 0 { mark_section(&mut line_changes, 1, 1, LineChange::RemovedAbove); } else { mark_section( &mut line_changes, new_start, new_start as i32, LineChange::RemovedBelow, ); } } else { mark_section(&mut line_changes, new_start, new_end, LineChange::Modified); } true }), None, ); Some(line_changes) } bat-0.25.0/src/error.rs000064400000000000000000000040531046102023000127460ustar 00000000000000use std::io::Write; use thiserror::Error; #[derive(Error, Debug)] #[non_exhaustive] pub enum Error { #[error(transparent)] Io(#[from] ::std::io::Error), #[error(transparent)] Fmt(#[from] ::std::fmt::Error), #[error(transparent)] SyntectError(#[from] ::syntect::Error), #[error(transparent)] SyntectLoadingError(#[from] ::syntect::LoadingError), #[error(transparent)] ParseIntError(#[from] ::std::num::ParseIntError), #[error(transparent)] GlobParsingError(#[from] ::globset::Error), #[error(transparent)] SerdeYamlError(#[from] ::serde_yaml::Error), #[error("unable to detect syntax for {0}")] UndetectedSyntax(String), #[error("unknown syntax: '{0}'")] UnknownSyntax(String), #[error("Unknown style '{0}'")] UnknownStyle(String), #[error("Use of bat as a pager is disallowed in order to avoid infinite recursion problems")] InvalidPagerValueBat, #[error("{0}")] Msg(String), #[cfg(feature = "lessopen")] #[error(transparent)] VarError(#[from] ::std::env::VarError), #[cfg(feature = "lessopen")] #[error(transparent)] CommandParseError(#[from] ::shell_words::ParseError), } impl From<&'static str> for Error { fn from(s: &'static str) -> Self { Error::Msg(s.to_owned()) } } impl From for Error { fn from(s: String) -> Self { Error::Msg(s) } } pub type Result = std::result::Result; pub fn default_error_handler(error: &Error, output: &mut dyn Write) { use nu_ansi_term::Color::Red; match error { Error::Io(ref io_error) if io_error.kind() == ::std::io::ErrorKind::BrokenPipe => { ::std::process::exit(0); } Error::SerdeYamlError(_) => { writeln!( output, "{}: Error while parsing metadata.yaml file: {}", Red.paint("[bat error]"), error ) .ok(); } _ => { writeln!(output, "{}: {}", Red.paint("[bat error]"), error).ok(); } }; } bat-0.25.0/src/input.rs000064400000000000000000000240421046102023000127540ustar 00000000000000use std::convert::TryFrom; use std::fs; use std::fs::File; use std::io::{self, BufRead, BufReader, Read}; use std::path::{Path, PathBuf}; use clircle::{Clircle, Identifier}; use content_inspector::{self, ContentType}; use crate::error::*; /// A description of an Input source. /// This tells bat how to refer to the input. #[derive(Clone)] pub struct InputDescription { pub(crate) name: String, /// The input title. /// This replaces the name if provided. title: Option, /// The input kind. kind: Option, /// A summary description of the input. /// Defaults to "{kind} '{name}'" summary: Option, } impl InputDescription { /// Creates a description for an input. pub fn new(name: impl Into) -> Self { InputDescription { name: name.into(), title: None, kind: None, summary: None, } } pub fn set_kind(&mut self, kind: Option) { self.kind = kind; } pub fn set_summary(&mut self, summary: Option) { self.summary = summary; } pub fn set_title(&mut self, title: Option) { self.title = title; } pub fn title(&self) -> &String { match &self.title { Some(title) => title, None => &self.name, } } pub fn kind(&self) -> Option<&String> { self.kind.as_ref() } pub fn summary(&self) -> String { self.summary.clone().unwrap_or_else(|| match &self.kind { None => self.name.clone(), Some(kind) => format!("{} '{}'", kind.to_lowercase(), self.name), }) } } pub(crate) enum InputKind<'a> { OrdinaryFile(PathBuf), StdIn, CustomReader(Box), } impl<'a> InputKind<'a> { pub fn description(&self) -> InputDescription { match self { InputKind::OrdinaryFile(ref path) => InputDescription::new(path.to_string_lossy()), InputKind::StdIn => InputDescription::new("STDIN"), InputKind::CustomReader(_) => InputDescription::new("READER"), } } } #[derive(Clone, Default)] pub(crate) struct InputMetadata { pub(crate) user_provided_name: Option, pub(crate) size: Option, } pub struct Input<'a> { pub(crate) kind: InputKind<'a>, pub(crate) metadata: InputMetadata, pub(crate) description: InputDescription, } pub(crate) enum OpenedInputKind { OrdinaryFile(PathBuf), StdIn, CustomReader, } pub(crate) struct OpenedInput<'a> { pub(crate) kind: OpenedInputKind, pub(crate) metadata: InputMetadata, pub(crate) reader: InputReader<'a>, pub(crate) description: InputDescription, } impl OpenedInput<'_> { /// Get the path of the file: /// If this was set by the metadata, that will take priority. /// If it wasn't, it will use the real file path (if available). pub(crate) fn path(&self) -> Option<&PathBuf> { self.metadata .user_provided_name .as_ref() .or(match self.kind { OpenedInputKind::OrdinaryFile(ref path) => Some(path), _ => None, }) } } impl<'a> Input<'a> { pub fn ordinary_file(path: impl AsRef) -> Self { Self::_ordinary_file(path.as_ref()) } fn _ordinary_file(path: &Path) -> Self { let kind = InputKind::OrdinaryFile(path.to_path_buf()); let metadata = InputMetadata { size: fs::metadata(path).map(|m| m.len()).ok(), ..InputMetadata::default() }; Input { description: kind.description(), metadata, kind, } } pub fn stdin() -> Self { let kind = InputKind::StdIn; Input { description: kind.description(), metadata: InputMetadata::default(), kind, } } pub fn from_reader(reader: Box) -> Self { let kind = InputKind::CustomReader(reader); Input { description: kind.description(), metadata: InputMetadata::default(), kind, } } pub fn is_stdin(&self) -> bool { matches!(self.kind, InputKind::StdIn) } pub fn with_name(self, provided_name: Option>) -> Self { self._with_name(provided_name.as_ref().map(|it| it.as_ref())) } fn _with_name(mut self, provided_name: Option<&Path>) -> Self { if let Some(name) = provided_name { self.description.name = name.to_string_lossy().to_string() } self.metadata.user_provided_name = provided_name.map(|n| n.to_owned()); self } pub fn description(&self) -> &InputDescription { &self.description } pub fn description_mut(&mut self) -> &mut InputDescription { &mut self.description } pub(crate) fn open( self, stdin: R, stdout_identifier: Option<&Identifier>, ) -> Result> { let description = self.description().clone(); match self.kind { InputKind::StdIn => { if let Some(stdout) = stdout_identifier { let input_identifier = Identifier::try_from(clircle::Stdio::Stdin) .map_err(|e| format!("Stdin: Error identifying file: {e}"))?; if stdout.surely_conflicts_with(&input_identifier) { return Err("IO circle detected. The input from stdin is also an output. Aborting to avoid infinite loop.".into()); } } Ok(OpenedInput { kind: OpenedInputKind::StdIn, description, metadata: self.metadata, reader: InputReader::new(stdin), }) } InputKind::OrdinaryFile(path) => Ok(OpenedInput { kind: OpenedInputKind::OrdinaryFile(path.clone()), description, metadata: self.metadata, reader: { let mut file = File::open(&path) .map_err(|e| format!("'{}': {}", path.to_string_lossy(), e))?; if file.metadata()?.is_dir() { return Err(format!("'{}' is a directory.", path.to_string_lossy()).into()); } if let Some(stdout) = stdout_identifier { let input_identifier = Identifier::try_from(file).map_err(|e| { format!("{}: Error identifying file: {}", path.to_string_lossy(), e) })?; if stdout.surely_conflicts_with(&input_identifier) { return Err(format!( "IO circle detected. The input from '{}' is also an output. Aborting to avoid infinite loop.", path.to_string_lossy() ) .into()); } file = input_identifier.into_inner().expect("The file was lost in the clircle::Identifier, this should not have happened..."); } InputReader::new(BufReader::new(file)) }, }), InputKind::CustomReader(reader) => Ok(OpenedInput { description, kind: OpenedInputKind::CustomReader, metadata: self.metadata, reader: InputReader::new(BufReader::new(reader)), }), } } } pub(crate) struct InputReader<'a> { inner: Box, pub(crate) first_line: Vec, pub(crate) content_type: Option, } impl<'a> InputReader<'a> { pub(crate) fn new(mut reader: R) -> InputReader<'a> { let mut first_line = vec![]; reader.read_until(b'\n', &mut first_line).ok(); let content_type = if first_line.is_empty() { None } else { Some(content_inspector::inspect(&first_line[..])) }; if content_type == Some(ContentType::UTF_16LE) { reader.read_until(0x00, &mut first_line).ok(); } InputReader { inner: Box::new(reader), first_line, content_type, } } pub(crate) fn read_line(&mut self, buf: &mut Vec) -> io::Result { if !self.first_line.is_empty() { buf.append(&mut self.first_line); return Ok(true); } let res = self.inner.read_until(b'\n', buf).map(|size| size > 0)?; if self.content_type == Some(ContentType::UTF_16LE) { let _ = self.inner.read_until(0x00, buf); } Ok(res) } } #[test] fn basic() { let content = b"#!/bin/bash\necho hello"; let mut reader = InputReader::new(&content[..]); assert_eq!(b"#!/bin/bash\n", &reader.first_line[..]); let mut buffer = vec![]; let res = reader.read_line(&mut buffer); assert!(res.is_ok()); assert!(res.unwrap()); assert_eq!(b"#!/bin/bash\n", &buffer[..]); buffer.clear(); let res = reader.read_line(&mut buffer); assert!(res.is_ok()); assert!(res.unwrap()); assert_eq!(b"echo hello", &buffer[..]); buffer.clear(); let res = reader.read_line(&mut buffer); assert!(res.is_ok()); assert!(!res.unwrap()); assert!(buffer.is_empty()); } #[test] fn utf16le() { let content = b"\xFF\xFE\x73\x00\x0A\x00\x64\x00"; let mut reader = InputReader::new(&content[..]); assert_eq!(b"\xFF\xFE\x73\x00\x0A\x00", &reader.first_line[..]); let mut buffer = vec![]; let res = reader.read_line(&mut buffer); assert!(res.is_ok()); assert!(res.unwrap()); assert_eq!(b"\xFF\xFE\x73\x00\x0A\x00", &buffer[..]); buffer.clear(); let res = reader.read_line(&mut buffer); assert!(res.is_ok()); assert!(res.unwrap()); assert_eq!(b"\x64\x00", &buffer[..]); buffer.clear(); let res = reader.read_line(&mut buffer); assert!(res.is_ok()); assert!(!res.unwrap()); assert!(buffer.is_empty()); } bat-0.25.0/src/less.rs000064400000000000000000000076551046102023000125760ustar 00000000000000#![cfg(feature = "paging")] use std::ffi::OsStr; use std::process::Command; #[derive(Debug, PartialEq, Eq)] pub enum LessVersion { Less(usize), BusyBox, } pub fn retrieve_less_version(less_path: &dyn AsRef) -> Option { let resolved_path = grep_cli::resolve_binary(less_path.as_ref()).ok()?; let cmd = Command::new(resolved_path).arg("--version").output().ok()?; if cmd.status.success() { parse_less_version(&cmd.stdout) } else { parse_less_version_busybox(&cmd.stderr) } } fn parse_less_version(output: &[u8]) -> Option { if !output.starts_with(b"less ") { return None; } let version = std::str::from_utf8(&output[5..]).ok()?; let end = version.find(|c: char| !c.is_ascii_digit())?; Some(LessVersion::Less(version[..end].parse::().ok()?)) } fn parse_less_version_busybox(output: &[u8]) -> Option { match std::str::from_utf8(output) { Ok(version) if version.contains("BusyBox ") => Some(LessVersion::BusyBox), _ => None, } } #[test] fn test_parse_less_version_487() { let output = b"less 487 (GNU regular expressions) Copyright (C) 1984-2016 Mark Nudelman less comes with NO WARRANTY, to the extent permitted by law. For information about the terms of redistribution, see the file named README in the less distribution. Homepage: http://www.greenwoodsoftware.com/less"; assert_eq!(Some(LessVersion::Less(487)), parse_less_version(output)); } #[test] fn test_parse_less_version_529() { let output = b"less 529 (Spencer V8 regular expressions) Copyright (C) 1984-2017 Mark Nudelman less comes with NO WARRANTY, to the extent permitted by law. For information about the terms of redistribution, see the file named README in the less distribution. Homepage: http://www.greenwoodsoftware.com/less"; assert_eq!(Some(LessVersion::Less(529)), parse_less_version(output)); } #[test] fn test_parse_less_version_551() { let output = b"less 551 (PCRE regular expressions) Copyright (C) 1984-2019 Mark Nudelman less comes with NO WARRANTY, to the extent permitted by law. For information about the terms of redistribution, see the file named README in the less distribution. Home page: http://www.greenwoodsoftware.com/less"; assert_eq!(Some(LessVersion::Less(551)), parse_less_version(output)); } #[test] fn test_parse_less_version_581_2() { let output = b"less 581.2 (PCRE2 regular expressions) Copyright (C) 1984-2021 Mark Nudelman less comes with NO WARRANTY, to the extent permitted by law. For information about the terms of redistribution, see the file named README in the less distribution. Home page: https://greenwoodsoftware.com/less"; assert_eq!(Some(LessVersion::Less(581)), parse_less_version(output)); } #[test] fn test_parse_less_version_wrong_program() { let output = b"more from util-linux 2.34"; assert_eq!(None, parse_less_version(output)); assert_eq!(None, parse_less_version_busybox(output)); } #[test] fn test_parse_less_version_busybox() { let output = b"pkg/less: unrecognized option '--version' BusyBox v1.35.0 (2022-04-21 10:38:11 EDT) multi-call binary. Usage: less [-EFIMmNSRh~] [FILE]... View FILE (or stdin) one screenful at a time -E Quit once the end of a file is reached -F Quit if entire file fits on first screen -I Ignore case in all searches -M,-m Display status line with line numbers and percentage through the file -N Prefix line number to each line -S Truncate long lines -R Remove color escape codes in input -~ Suppress ~s displayed past EOF"; assert_eq!( Some(LessVersion::BusyBox), parse_less_version_busybox(output) ); } #[test] fn test_parse_less_version_invalid_utf_8() { let output = b"\xff"; assert_eq!(None, parse_less_version(output)); assert_eq!(None, parse_less_version_busybox(output)); } bat-0.25.0/src/lessopen.rs000064400000000000000000000324341046102023000134510ustar 00000000000000#![cfg(feature = "lessopen")] use std::convert::TryFrom; use std::env; use std::fs::File; use std::io::{BufRead, BufReader, Cursor, Read}; use std::path::PathBuf; use std::process::{ExitStatus, Stdio}; use clircle::{Clircle, Identifier}; use execute::{shell, Execute}; use crate::error::Result; use crate::{ bat_warning, input::{Input, InputKind, InputReader, OpenedInput, OpenedInputKind}, }; /// Preprocess files and/or stdin using $LESSOPEN and $LESSCLOSE pub(crate) struct LessOpenPreprocessor { lessopen: String, lessclose: Option, kind: LessOpenKind, /// Whether or not data piped via stdin is to be preprocessed preprocess_stdin: bool, } enum LessOpenKind { Piped, PipedIgnoreExitCode, TempFile, } impl LessOpenPreprocessor { /// Create a new instance of LessOpenPreprocessor /// Will return Ok if and only if $LESSOPEN is set and contains exactly one %s pub(crate) fn new() -> Result { let lessopen = env::var("LESSOPEN")?; // Ignore $LESSOPEN if it does not contains exactly one %s // Note that $LESSCLOSE has no such requirement if lessopen.match_indices("%s").count() != 1 { let error_msg = "LESSOPEN ignored: must contain exactly one %s"; bat_warning!("{}", error_msg); return Err(error_msg.into()); } // "||" means pipe directly to bat without making a temporary file // Also, if preprocessor output is empty and exit code is zero, use the empty output // Otherwise, if output is empty and exit code is nonzero, use original file contents let (kind, lessopen) = if lessopen.starts_with("||") { (LessOpenKind::Piped, lessopen.chars().skip(2).collect()) // "|" means pipe as above, but ignore exit code and always use preprocessor output even if empty } else if lessopen.starts_with('|') { ( LessOpenKind::PipedIgnoreExitCode, lessopen.chars().skip(1).collect(), ) // If neither appear, write output to a temporary file and read from that } else { (LessOpenKind::TempFile, lessopen) }; // "-" means that stdin is preprocessed along with files and may appear alongside "|" and "||" let (stdin, lessopen) = if lessopen.starts_with('-') { (true, lessopen.chars().skip(1).collect()) } else { (false, lessopen) }; Ok(Self { lessopen, lessclose: env::var("LESSCLOSE").ok(), kind, preprocess_stdin: stdin, }) } pub(crate) fn open<'a, R: BufRead + 'a>( &self, input: Input<'a>, mut stdin: R, stdout_identifier: Option<&Identifier>, ) -> Result> { let (lessopen_stdout, path_str, kind) = match input.kind { InputKind::OrdinaryFile(ref path) => { let path_str = match path.to_str() { Some(str) => str, None => return input.open(stdin, stdout_identifier), }; let mut lessopen_command = shell(self.lessopen.replacen("%s", path_str, 1)); lessopen_command.stdout(Stdio::piped()); let lessopen_output = match lessopen_command.execute_output() { Ok(output) => output, Err(_) => return input.open(stdin, stdout_identifier), }; if self.fall_back_to_original_file(&lessopen_output.stdout, lessopen_output.status) { return input.open(stdin, stdout_identifier); } ( lessopen_output.stdout, path_str.to_string(), OpenedInputKind::OrdinaryFile(path.to_path_buf()), ) } InputKind::StdIn => { if self.preprocess_stdin { if let Some(stdout) = stdout_identifier { let input_identifier = Identifier::try_from(clircle::Stdio::Stdin) .map_err(|e| format!("Stdin: Error identifying file: {}", e))?; if stdout.surely_conflicts_with(&input_identifier) { return Err("IO circle detected. The input from stdin is also an output. Aborting to avoid infinite loop.".into()); } } // stdin isn't Clone or AsRef<[u8]>, so move it into a cloneable buffer // so the data can be used multiple times if necessary // NOTE: stdin will be empty from this point onwards let mut stdin_buffer = Vec::new(); stdin.read_to_end(&mut stdin_buffer)?; let mut lessopen_command = shell(self.lessopen.replacen("%s", "-", 1)); lessopen_command.stdout(Stdio::piped()); let lessopen_output = match lessopen_command.execute_input_output(&stdin_buffer) { Ok(output) => output, Err(_) => { return input.open(Cursor::new(stdin_buffer), stdout_identifier); } }; if self .fall_back_to_original_file(&lessopen_output.stdout, lessopen_output.status) { return input.open(Cursor::new(stdin_buffer), stdout_identifier); } ( lessopen_output.stdout, "-".to_string(), OpenedInputKind::StdIn, ) } else { return input.open(stdin, stdout_identifier); } } InputKind::CustomReader(_) => { return input.open(stdin, stdout_identifier); } }; Ok(OpenedInput { kind, reader: InputReader::new(BufReader::new( if matches!(self.kind, LessOpenKind::TempFile) { let lessopen_string = match String::from_utf8(lessopen_stdout) { Ok(string) => string, Err(_) => { return input.open(stdin, stdout_identifier); } }; // Remove newline at end of temporary file path returned by $LESSOPEN let stdout = match lessopen_string.strip_suffix("\n") { Some(stripped) => stripped.to_owned(), None => lessopen_string, }; let file = match File::open(PathBuf::from(&stdout)) { Ok(file) => file, Err(_) => { return input.open(stdin, stdout_identifier); } }; Preprocessed { kind: PreprocessedKind::TempFile(file), lessclose: self .lessclose .as_ref() .map(|s| s.replacen("%s", &path_str, 1).replacen("%s", &stdout, 1)), } } else { Preprocessed { kind: PreprocessedKind::Piped(Cursor::new(lessopen_stdout)), lessclose: self .lessclose .as_ref() .map(|s| s.replacen("%s", &path_str, 1).replacen("%s", "-", 1)), } }, )), metadata: input.metadata, description: input.description, }) } fn fall_back_to_original_file(&self, lessopen_stdout: &Vec, exit_code: ExitStatus) -> bool { lessopen_stdout.is_empty() && (!exit_code.success() || matches!(self.kind, LessOpenKind::PipedIgnoreExitCode)) } #[cfg(test)] /// For testing purposes only /// Create an instance of LessOpenPreprocessor with specified valued for $LESSOPEN and $LESSCLOSE fn mock_new(lessopen: Option<&str>, lessclose: Option<&str>) -> Result { if let Some(command) = lessopen { env::set_var("LESSOPEN", command) } else { env::remove_var("LESSOPEN") } if let Some(command) = lessclose { env::set_var("LESSCLOSE", command) } else { env::remove_var("LESSCLOSE") } Self::new() } } enum PreprocessedKind { Piped(Cursor>), TempFile(File), } impl Read for PreprocessedKind { fn read(&mut self, buf: &mut [u8]) -> std::result::Result { match self { PreprocessedKind::Piped(data) => data.read(buf), PreprocessedKind::TempFile(data) => data.read(buf), } } } pub struct Preprocessed { kind: PreprocessedKind, lessclose: Option, } impl Read for Preprocessed { fn read(&mut self, buf: &mut [u8]) -> std::result::Result { self.kind.read(buf) } } impl Drop for Preprocessed { fn drop(&mut self) { if let Some(lessclose) = self.lessclose.clone() { let mut lessclose_command = shell(lessclose); let lessclose_output = match lessclose_command.execute_output() { Ok(output) => output, Err(_) => { bat_warning!("failed to run $LESSCLOSE to clean up temporary file"); return; } }; if lessclose_output.status.success() { bat_warning!("$LESSCLOSE exited with nonzero exit code",) }; } } } #[cfg(test)] mod tests { // All tests here are serial because they all involve reading and writing environment variables // Running them in parallel causes these tests and some others to randomly fail use serial_test::serial; use super::*; /// Reset environment variables after each test as a precaution fn reset_env_vars() { env::remove_var("LESSOPEN"); env::remove_var("LESSCLOSE"); } #[test] #[serial] fn test_just_lessopen() -> Result<()> { let preprocessor = LessOpenPreprocessor::mock_new(Some("|batpipe %s"), None)?; assert_eq!(preprocessor.lessopen, "batpipe %s"); assert!(preprocessor.lessclose.is_none()); reset_env_vars(); Ok(()) } #[test] #[serial] fn test_just_lessclose() -> Result<()> { let preprocessor = LessOpenPreprocessor::mock_new(None, Some("lessclose.sh %s %s")); assert!(preprocessor.is_err()); reset_env_vars(); Ok(()) } #[test] #[serial] fn test_both_lessopen_and_lessclose() -> Result<()> { let preprocessor = LessOpenPreprocessor::mock_new(Some("lessopen.sh %s"), Some("lessclose.sh %s %s"))?; assert_eq!(preprocessor.lessopen, "lessopen.sh %s"); assert_eq!(preprocessor.lessclose.unwrap(), "lessclose.sh %s %s"); reset_env_vars(); Ok(()) } #[test] #[serial] fn test_lessopen_prefixes() -> Result<()> { let preprocessor = LessOpenPreprocessor::mock_new(Some("batpipe %s"), None)?; assert_eq!(preprocessor.lessopen, "batpipe %s"); assert!(matches!(preprocessor.kind, LessOpenKind::TempFile)); assert!(!preprocessor.preprocess_stdin); let preprocessor = LessOpenPreprocessor::mock_new(Some("|batpipe %s"), None)?; assert_eq!(preprocessor.lessopen, "batpipe %s"); assert!(matches!( preprocessor.kind, LessOpenKind::PipedIgnoreExitCode )); assert!(!preprocessor.preprocess_stdin); let preprocessor = LessOpenPreprocessor::mock_new(Some("||batpipe %s"), None)?; assert_eq!(preprocessor.lessopen, "batpipe %s"); assert!(matches!(preprocessor.kind, LessOpenKind::Piped)); assert!(!preprocessor.preprocess_stdin); let preprocessor = LessOpenPreprocessor::mock_new(Some("-batpipe %s"), None)?; assert_eq!(preprocessor.lessopen, "batpipe %s"); assert!(matches!(preprocessor.kind, LessOpenKind::TempFile)); assert!(preprocessor.preprocess_stdin); let preprocessor = LessOpenPreprocessor::mock_new(Some("|-batpipe %s"), None)?; assert_eq!(preprocessor.lessopen, "batpipe %s"); assert!(matches!( preprocessor.kind, LessOpenKind::PipedIgnoreExitCode )); assert!(preprocessor.preprocess_stdin); let preprocessor = LessOpenPreprocessor::mock_new(Some("||-batpipe %s"), None)?; assert_eq!(preprocessor.lessopen, "batpipe %s"); assert!(matches!(preprocessor.kind, LessOpenKind::Piped)); assert!(preprocessor.preprocess_stdin); reset_env_vars(); Ok(()) } #[test] #[serial] fn replace_part_of_argument() -> Result<()> { let preprocessor = LessOpenPreprocessor::mock_new(Some("|echo File:%s"), Some("echo File:%s Temp:%s"))?; assert_eq!(preprocessor.lessopen, "echo File:%s"); assert_eq!(preprocessor.lessclose.unwrap(), "echo File:%s Temp:%s"); reset_env_vars(); Ok(()) } } bat-0.25.0/src/lib.rs000064400000000000000000000031261046102023000123630ustar 00000000000000//! `bat` is a library to print syntax highlighted content. //! //! The main struct of this crate is `PrettyPrinter` which can be used to //! configure and run the syntax highlighting. //! //! If you need more control, you can also use the structs in the submodules //! (start with `controller::Controller`), but note that the API of these //! internal modules is much more likely to change. Some or all of these //! modules might be removed in the future. //! //! "Hello world" example: //! ``` //! use bat::PrettyPrinter; //! //! PrettyPrinter::new() //! .input_from_bytes(b"Hello world!\n") //! .language("html") //! .print() //! .unwrap(); //! ``` #![deny(unsafe_code)] mod macros; pub mod assets; pub mod assets_metadata { pub use super::assets::assets_metadata::*; } pub mod config; pub mod controller; mod decorations; mod diff; pub mod error; pub mod input; mod less; #[cfg(feature = "lessopen")] mod lessopen; pub mod line_range; pub(crate) mod nonprintable_notation; mod output; #[cfg(feature = "paging")] mod pager; #[cfg(feature = "paging")] pub(crate) mod paging; mod preprocessor; mod pretty_printer; pub(crate) mod printer; pub mod style; pub(crate) mod syntax_mapping; mod terminal; pub mod theme; mod vscreen; pub(crate) mod wrapping; pub use nonprintable_notation::{BinaryBehavior, NonprintableNotation}; pub use preprocessor::StripAnsiMode; pub use pretty_printer::{Input, PrettyPrinter, Syntax}; pub use syntax_mapping::{MappingTarget, SyntaxMapping}; pub use wrapping::WrappingMode; #[cfg(feature = "paging")] pub use paging::PagingMode; bat-0.25.0/src/line_range.rs000064400000000000000000000211361046102023000137210ustar 00000000000000use crate::error::*; #[derive(Debug, Clone)] pub struct LineRange { lower: usize, upper: usize, } impl Default for LineRange { fn default() -> LineRange { LineRange { lower: usize::min_value(), upper: usize::max_value(), } } } impl LineRange { pub fn new(from: usize, to: usize) -> Self { LineRange { lower: from, upper: to, } } pub fn from(range_raw: &str) -> Result { LineRange::parse_range(range_raw) } fn parse_range(range_raw: &str) -> Result { let mut new_range = LineRange::default(); if range_raw.bytes().next().ok_or("Empty line range")? == b':' { new_range.upper = range_raw[1..].parse()?; return Ok(new_range); } else if range_raw.bytes().last().ok_or("Empty line range")? == b':' { new_range.lower = range_raw[..range_raw.len() - 1].parse()?; return Ok(new_range); } let line_numbers: Vec<&str> = range_raw.split(':').collect(); match line_numbers.len() { 1 => { new_range.lower = line_numbers[0].parse()?; new_range.upper = new_range.lower; Ok(new_range) } 2 => { new_range.lower = line_numbers[0].parse()?; let first_byte = line_numbers[1].bytes().next(); new_range.upper = if first_byte == Some(b'+') { let more_lines = &line_numbers[1][1..] .parse() .map_err(|_| "Invalid character after +")?; new_range.lower.saturating_add(*more_lines) } else if first_byte == Some(b'-') { // this will prevent values like "-+5" even though "+5" is valid integer if line_numbers[1][1..].bytes().next() == Some(b'+') { return Err("Invalid character after -".into()); } let prior_lines = &line_numbers[1][1..] .parse() .map_err(|_| "Invalid character after -")?; let prev_lower = new_range.lower; new_range.lower = new_range.lower.saturating_sub(*prior_lines); prev_lower } else { line_numbers[1].parse()? }; Ok(new_range) } _ => Err( "Line range contained more than one ':' character. Expected format: 'N' or 'N:M'" .into(), ), } } pub(crate) fn is_inside(&self, line: usize) -> bool { line >= self.lower && line <= self.upper } } #[test] fn test_parse_full() { let range = LineRange::from("40:50").expect("Shouldn't fail on test!"); assert_eq!(40, range.lower); assert_eq!(50, range.upper); } #[test] fn test_parse_partial_min() { let range = LineRange::from(":50").expect("Shouldn't fail on test!"); assert_eq!(usize::min_value(), range.lower); assert_eq!(50, range.upper); } #[test] fn test_parse_partial_max() { let range = LineRange::from("40:").expect("Shouldn't fail on test!"); assert_eq!(40, range.lower); assert_eq!(usize::max_value(), range.upper); } #[test] fn test_parse_single() { let range = LineRange::from("40").expect("Shouldn't fail on test!"); assert_eq!(40, range.lower); assert_eq!(40, range.upper); } #[test] fn test_parse_fail() { let range = LineRange::from("40:50:80"); assert!(range.is_err()); let range = LineRange::from("40::80"); assert!(range.is_err()); let range = LineRange::from(":40:"); assert!(range.is_err()); } #[test] fn test_parse_plus() { let range = LineRange::from("40:+10").expect("Shouldn't fail on test!"); assert_eq!(40, range.lower); assert_eq!(50, range.upper); } #[test] fn test_parse_plus_overflow() { let range = LineRange::from(&format!("{}:+1", usize::MAX)).expect("Shouldn't fail on test!"); assert_eq!(usize::MAX, range.lower); assert_eq!(usize::MAX, range.upper); } #[test] fn test_parse_plus_fail() { let range = LineRange::from("40:+z"); assert!(range.is_err()); let range = LineRange::from("40:+-10"); assert!(range.is_err()); let range = LineRange::from("40:+"); assert!(range.is_err()); } #[test] fn test_parse_minus_success() { let range = LineRange::from("40:-10").expect("Shouldn't fail on test!"); assert_eq!(30, range.lower); assert_eq!(40, range.upper); } #[test] fn test_parse_minus_edge_cases_success() { let range = LineRange::from("5:-4").expect("Shouldn't fail on test!"); assert_eq!(1, range.lower); assert_eq!(5, range.upper); let range = LineRange::from("5:-5").expect("Shouldn't fail on test!"); assert_eq!(0, range.lower); assert_eq!(5, range.upper); let range = LineRange::from("5:-100").expect("Shouldn't fail on test!"); assert_eq!(0, range.lower); assert_eq!(5, range.upper); } #[test] fn test_parse_minus_fail() { let range = LineRange::from("40:-z"); assert!(range.is_err()); let range = LineRange::from("40:-+10"); assert!(range.is_err()); let range = LineRange::from("40:-"); assert!(range.is_err()); } #[derive(Copy, Clone, Debug, PartialEq, Eq)] pub enum RangeCheckResult { // Within one of the given ranges InRange, // Before the first range or within two ranges BeforeOrBetweenRanges, // Line number is outside of all ranges and larger than the last range. AfterLastRange, } #[derive(Debug, Clone)] pub struct LineRanges { ranges: Vec, largest_upper_bound: usize, } impl LineRanges { pub fn none() -> LineRanges { LineRanges::from(vec![]) } pub fn all() -> LineRanges { LineRanges::from(vec![LineRange::default()]) } pub fn from(ranges: Vec) -> LineRanges { let largest_upper_bound = ranges .iter() .map(|r| r.upper) .max() .unwrap_or(usize::max_value()); LineRanges { ranges, largest_upper_bound, } } pub(crate) fn check(&self, line: usize) -> RangeCheckResult { if self.ranges.iter().any(|r| r.is_inside(line)) { RangeCheckResult::InRange } else if line < self.largest_upper_bound { RangeCheckResult::BeforeOrBetweenRanges } else { RangeCheckResult::AfterLastRange } } } impl Default for LineRanges { fn default() -> Self { Self::all() } } #[derive(Debug, Clone)] pub struct HighlightedLineRanges(pub LineRanges); impl Default for HighlightedLineRanges { fn default() -> Self { HighlightedLineRanges(LineRanges::none()) } } #[cfg(test)] fn ranges(rs: &[&str]) -> LineRanges { LineRanges::from(rs.iter().map(|r| LineRange::from(r).unwrap()).collect()) } #[test] fn test_ranges_simple() { let ranges = ranges(&["3:8"]); assert_eq!(RangeCheckResult::BeforeOrBetweenRanges, ranges.check(2)); assert_eq!(RangeCheckResult::InRange, ranges.check(5)); assert_eq!(RangeCheckResult::AfterLastRange, ranges.check(9)); } #[test] fn test_ranges_advanced() { let ranges = ranges(&["3:8", "11:20", "25:30"]); assert_eq!(RangeCheckResult::BeforeOrBetweenRanges, ranges.check(2)); assert_eq!(RangeCheckResult::InRange, ranges.check(5)); assert_eq!(RangeCheckResult::BeforeOrBetweenRanges, ranges.check(9)); assert_eq!(RangeCheckResult::InRange, ranges.check(11)); assert_eq!(RangeCheckResult::BeforeOrBetweenRanges, ranges.check(22)); assert_eq!(RangeCheckResult::InRange, ranges.check(28)); assert_eq!(RangeCheckResult::AfterLastRange, ranges.check(31)); } #[test] fn test_ranges_open_low() { let ranges = ranges(&["3:8", ":5"]); assert_eq!(RangeCheckResult::InRange, ranges.check(1)); assert_eq!(RangeCheckResult::InRange, ranges.check(3)); assert_eq!(RangeCheckResult::InRange, ranges.check(7)); assert_eq!(RangeCheckResult::AfterLastRange, ranges.check(9)); } #[test] fn test_ranges_open_high() { let ranges = ranges(&["3:", "2:5"]); assert_eq!(RangeCheckResult::BeforeOrBetweenRanges, ranges.check(1)); assert_eq!(RangeCheckResult::InRange, ranges.check(3)); assert_eq!(RangeCheckResult::InRange, ranges.check(5)); assert_eq!(RangeCheckResult::InRange, ranges.check(9)); } #[test] fn test_ranges_all() { let ranges = LineRanges::all(); assert_eq!(RangeCheckResult::InRange, ranges.check(1)); } #[test] fn test_ranges_none() { let ranges = LineRanges::none(); assert_ne!(RangeCheckResult::InRange, ranges.check(1)); } bat-0.25.0/src/macros.rs000064400000000000000000000003041046102023000130740ustar 00000000000000#[macro_export] macro_rules! bat_warning { ($($arg:tt)*) => ({ use nu_ansi_term::Color::Yellow; eprintln!("{}: {}", Yellow.paint("[bat warning]"), format!($($arg)*)); }) } bat-0.25.0/src/nonprintable_notation.rs000064400000000000000000000011221046102023000162150ustar 00000000000000/// How to print non-printable characters with /// [crate::config::Config::show_nonprintable] #[derive(Debug, Default, Clone, Copy, PartialEq, Eq)] #[non_exhaustive] pub enum NonprintableNotation { /// Use caret notation (^G, ^J, ^@, ..) Caret, /// Use unicode notation (␇, ␊, ␀, ..) #[default] Unicode, } /// How to treat binary content #[derive(Debug, Default, Clone, Copy, PartialEq, Eq)] #[non_exhaustive] pub enum BinaryBehavior { /// Do not print any binary content #[default] NoPrinting, /// Treat binary content as normal text AsText, } bat-0.25.0/src/output.rs000064400000000000000000000123621046102023000131570ustar 00000000000000use std::io::{self, Write}; #[cfg(feature = "paging")] use std::process::Child; use crate::error::*; #[cfg(feature = "paging")] use crate::less::{retrieve_less_version, LessVersion}; #[cfg(feature = "paging")] use crate::paging::PagingMode; #[cfg(feature = "paging")] use crate::wrapping::WrappingMode; #[cfg(feature = "paging")] #[derive(Debug, PartialEq)] enum SingleScreenAction { Quit, Nothing, } #[derive(Debug)] pub enum OutputType { #[cfg(feature = "paging")] Pager(Child), Stdout(io::Stdout), } impl OutputType { #[cfg(feature = "paging")] pub fn from_mode( paging_mode: PagingMode, wrapping_mode: WrappingMode, pager: Option<&str>, ) -> Result { use self::PagingMode::*; Ok(match paging_mode { Always => OutputType::try_pager(SingleScreenAction::Nothing, wrapping_mode, pager)?, QuitIfOneScreen => { OutputType::try_pager(SingleScreenAction::Quit, wrapping_mode, pager)? } _ => OutputType::stdout(), }) } /// Try to launch the pager. Fall back to stdout in case of errors. #[cfg(feature = "paging")] fn try_pager( single_screen_action: SingleScreenAction, wrapping_mode: WrappingMode, pager_from_config: Option<&str>, ) -> Result { use crate::pager::{self, PagerKind, PagerSource}; use std::process::{Command, Stdio}; let pager_opt = pager::get_pager(pager_from_config).map_err(|_| "Could not parse pager command.")?; let pager = match pager_opt { Some(pager) => pager, None => return Ok(OutputType::stdout()), }; if pager.kind == PagerKind::Bat { return Err(Error::InvalidPagerValueBat); } let resolved_path = match grep_cli::resolve_binary(&pager.bin) { Ok(path) => path, Err(_) => { return Ok(OutputType::stdout()); } }; let mut p = Command::new(resolved_path); let args = pager.args; if pager.kind == PagerKind::Less { // less needs to be called with the '-R' option in order to properly interpret the // ANSI color sequences printed by bat. If someone has set PAGER="less -F", we // therefore need to overwrite the arguments and add '-R'. // // We only do this for PAGER (as it is not specific to 'bat'), not for BAT_PAGER // or bats '--pager' command line option. let replace_arguments_to_less = pager.source == PagerSource::EnvVarPager; if args.is_empty() || replace_arguments_to_less { p.arg("-R"); // Short version of --RAW-CONTROL-CHARS for maximum compatibility if single_screen_action == SingleScreenAction::Quit { p.arg("-F"); // Short version of --quit-if-one-screen for compatibility } if wrapping_mode == WrappingMode::NoWrapping(true) { p.arg("-S"); // Short version of --chop-long-lines for compatibility } // Passing '--no-init' fixes a bug with '--quit-if-one-screen' in older // versions of 'less'. Unfortunately, it also breaks mouse-wheel support. // // See: http://www.greenwoodsoftware.com/less/news.530.html // // For newer versions (530 or 558 on Windows), we omit '--no-init' as it // is not needed anymore. match retrieve_less_version(&pager.bin) { None => { p.arg("--no-init"); } Some(LessVersion::Less(version)) if (version < 530 || (cfg!(windows) && version < 558)) => { p.arg("--no-init"); } _ => {} } } else { p.args(args); } p.env("LESSCHARSET", "UTF-8"); #[cfg(feature = "lessopen")] // Ensures that 'less' does not preprocess input again if '$LESSOPEN' is set. p.arg("--no-lessopen"); } else { p.args(args); }; Ok(p.stdin(Stdio::piped()) .spawn() .map(OutputType::Pager) .unwrap_or_else(|_| OutputType::stdout())) } pub(crate) fn stdout() -> Self { OutputType::Stdout(io::stdout()) } #[cfg(feature = "paging")] pub(crate) fn is_pager(&self) -> bool { matches!(self, OutputType::Pager(_)) } #[cfg(not(feature = "paging"))] pub(crate) fn is_pager(&self) -> bool { false } pub fn handle(&mut self) -> Result<&mut dyn Write> { Ok(match *self { #[cfg(feature = "paging")] OutputType::Pager(ref mut command) => command .stdin .as_mut() .ok_or("Could not open stdin for pager")?, OutputType::Stdout(ref mut handle) => handle, }) } } #[cfg(feature = "paging")] impl Drop for OutputType { fn drop(&mut self) { if let OutputType::Pager(ref mut command) = *self { let _ = command.wait(); } } } bat-0.25.0/src/pager.rs000064400000000000000000000074251046102023000127210ustar 00000000000000use shell_words::ParseError; use std::env; /// If we use a pager, this enum tells us from where we were told to use it. #[derive(Debug, PartialEq)] pub(crate) enum PagerSource { /// From --config Config, /// From the env var BAT_PAGER EnvVarBatPager, /// From the env var PAGER EnvVarPager, /// No pager was specified, default is used Default, } /// We know about some pagers, for example 'less'. This is a list of all pagers we know about #[derive(Debug, PartialEq)] pub(crate) enum PagerKind { /// bat Bat, /// less Less, /// more More, /// most Most, /// A pager we don't know about Unknown, } impl PagerKind { fn from_bin(bin: &str) -> PagerKind { use std::path::Path; // Set to `less` by default on most Linux distros. let pager_bin = Path::new(bin).file_stem(); // The name of the current running binary. Normally `bat` but sometimes // `batcat` for compatibility reasons. let current_bin = env::args_os().next(); // Check if the current running binary is set to be our pager. let is_current_bin_pager = current_bin .map(|s| Path::new(&s).file_stem() == pager_bin) .unwrap_or(false); match pager_bin.map(|s| s.to_string_lossy()).as_deref() { Some("less") => PagerKind::Less, Some("more") => PagerKind::More, Some("most") => PagerKind::Most, _ if is_current_bin_pager => PagerKind::Bat, _ => PagerKind::Unknown, } } } /// A pager such as 'less', and from where we got it. #[derive(Debug)] pub(crate) struct Pager { /// The pager binary pub bin: String, /// The pager binary arguments (that we might tweak) pub args: Vec, /// What pager this is pub kind: PagerKind, /// From where this pager comes pub source: PagerSource, } impl Pager { fn new(bin: &str, args: &[String], kind: PagerKind, source: PagerSource) -> Pager { Pager { bin: String::from(bin), args: args.to_vec(), kind, source, } } } /// Returns what pager to use, after looking at both config and environment variables. pub(crate) fn get_pager(config_pager: Option<&str>) -> Result, ParseError> { let bat_pager = env::var("BAT_PAGER"); let pager = env::var("PAGER"); let (cmd, source) = match (config_pager, &bat_pager, &pager) { (Some(config_pager), _, _) => (config_pager, PagerSource::Config), (_, Ok(bat_pager), _) => (bat_pager.as_str(), PagerSource::EnvVarBatPager), (_, _, Ok(pager)) => (pager.as_str(), PagerSource::EnvVarPager), _ => ("less", PagerSource::Default), }; let parts = shell_words::split(cmd)?; match parts.split_first() { Some((bin, args)) => { let kind = PagerKind::from_bin(bin); let use_less_instead = if source == PagerSource::EnvVarPager { // 'more' and 'most' do not supports colors; automatically use // 'less' instead if the problematic pager came from the // generic PAGER env var. // If PAGER=bat, silently use 'less' instead to prevent // recursion. // Never silently use 'less' if BAT_PAGER or --pager has been // specified. matches!(kind, PagerKind::More | PagerKind::Most | PagerKind::Bat) } else { false }; Ok(Some(if use_less_instead { let no_args = vec![]; Pager::new("less", &no_args, PagerKind::Less, PagerSource::EnvVarPager) } else { Pager::new(bin, args, kind, source) })) } None => Ok(None), } } bat-0.25.0/src/paging.rs000064400000000000000000000002111046102023000130520ustar 00000000000000#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)] pub enum PagingMode { Always, QuitIfOneScreen, #[default] Never, } bat-0.25.0/src/preprocessor.rs000064400000000000000000000156111046102023000143450ustar 00000000000000use std::fmt::Write; use crate::{ nonprintable_notation::NonprintableNotation, vscreen::{EscapeSequenceOffsets, EscapeSequenceOffsetsIterator}, }; /// Expand tabs like an ANSI-enabled expand(1). pub fn expand_tabs(line: &str, width: usize, cursor: &mut usize) -> String { let mut buffer = String::with_capacity(line.len() * 2); for seq in EscapeSequenceOffsetsIterator::new(line) { match seq { EscapeSequenceOffsets::Text { .. } => { let mut text = &line[seq.index_of_start()..seq.index_past_end()]; while let Some(index) = text.find('\t') { // Add previous text. if index > 0 { *cursor += index; buffer.push_str(&text[0..index]); } // Add tab. let spaces = width - (*cursor % width); *cursor += spaces; buffer.push_str(&" ".repeat(spaces)); // Next. text = &text[index + 1..text.len()]; } *cursor += text.len(); buffer.push_str(text); } _ => { // Copy the ANSI escape sequence. buffer.push_str(&line[seq.index_of_start()..seq.index_past_end()]) } } } buffer } fn try_parse_utf8_char(input: &[u8]) -> Option<(char, usize)> { let str_from_utf8 = |seq| std::str::from_utf8(seq).ok(); let decoded = input .get(0..1) .and_then(str_from_utf8) .map(|c| (c, 1)) .or_else(|| input.get(0..2).and_then(str_from_utf8).map(|c| (c, 2))) .or_else(|| input.get(0..3).and_then(str_from_utf8).map(|c| (c, 3))) .or_else(|| input.get(0..4).and_then(str_from_utf8).map(|c| (c, 4))); decoded.map(|(seq, n)| (seq.chars().next().unwrap(), n)) } pub fn replace_nonprintable( input: &[u8], tab_width: usize, nonprintable_notation: NonprintableNotation, ) -> String { let mut output = String::new(); let tab_width = if tab_width == 0 { 4 } else { tab_width }; let mut idx = 0; let mut line_idx = 0; let len = input.len(); while idx < len { if let Some((chr, skip_ahead)) = try_parse_utf8_char(&input[idx..]) { idx += skip_ahead; line_idx += 1; match chr { // space ' ' => output.push('Β·'), // tab '\t' => { let tab_stop = tab_width - ((line_idx - 1) % tab_width); line_idx = 0; if tab_stop == 1 { output.push('β†Ή'); } else { output.push('β”œ'); output.push_str(&"─".repeat(tab_stop - 2)); output.push('─'); } } // line feed '\x0A' => { output.push_str(match nonprintable_notation { NonprintableNotation::Caret => "^J\x0A", NonprintableNotation::Unicode => "␊\x0A", }); line_idx = 0; } // ASCII control characters '\x00'..='\x1F' => { let c = u32::from(chr); match nonprintable_notation { NonprintableNotation::Caret => { let caret_character = char::from_u32(0x40 + c).unwrap(); write!(output, "^{caret_character}").ok(); } NonprintableNotation::Unicode => { let replacement_symbol = char::from_u32(0x2400 + c).unwrap(); output.push(replacement_symbol) } } } // delete '\x7F' => match nonprintable_notation { NonprintableNotation::Caret => output.push_str("^?"), NonprintableNotation::Unicode => output.push('\u{2421}'), }, // printable ASCII c if c.is_ascii_alphanumeric() || c.is_ascii_punctuation() || c.is_ascii_graphic() => { output.push(c) } // everything else c => output.push_str(&c.escape_unicode().collect::()), } } else { write!(output, "\\x{:02X}", input[idx]).ok(); idx += 1; } } output } /// Strips ANSI escape sequences from the input. pub fn strip_ansi(line: &str) -> String { let mut buffer = String::with_capacity(line.len()); for seq in EscapeSequenceOffsetsIterator::new(line) { if let EscapeSequenceOffsets::Text { .. } = seq { buffer.push_str(&line[seq.index_of_start()..seq.index_past_end()]); } } buffer } #[derive(Debug, PartialEq, Clone, Copy, Default)] pub enum StripAnsiMode { #[default] Never, Always, Auto, } #[test] fn test_try_parse_utf8_char() { assert_eq!(try_parse_utf8_char(&[0x20]), Some((' ', 1))); assert_eq!(try_parse_utf8_char(&[0x20, 0x20]), Some((' ', 1))); assert_eq!(try_parse_utf8_char(&[0x20, 0xef]), Some((' ', 1))); assert_eq!(try_parse_utf8_char(&[0x00]), Some(('\x00', 1))); assert_eq!(try_parse_utf8_char(&[0x1b]), Some(('\x1b', 1))); assert_eq!(try_parse_utf8_char(&[0xc3, 0xa4]), Some(('Γ€', 2))); assert_eq!(try_parse_utf8_char(&[0xc3, 0xa4, 0xef]), Some(('Γ€', 2))); assert_eq!(try_parse_utf8_char(&[0xc3, 0xa4, 0x20]), Some(('Γ€', 2))); assert_eq!(try_parse_utf8_char(&[0xe2, 0x82, 0xac]), Some(('€', 3))); assert_eq!( try_parse_utf8_char(&[0xe2, 0x82, 0xac, 0xef]), Some(('€', 3)) ); assert_eq!( try_parse_utf8_char(&[0xe2, 0x82, 0xac, 0x20]), Some(('€', 3)) ); assert_eq!(try_parse_utf8_char(&[0xe2, 0x88, 0xb0]), Some(('∰', 3))); assert_eq!( try_parse_utf8_char(&[0xf0, 0x9f, 0x8c, 0x82]), Some(('πŸŒ‚', 4)) ); assert_eq!( try_parse_utf8_char(&[0xf0, 0x9f, 0x8c, 0x82, 0xef]), Some(('πŸŒ‚', 4)) ); assert_eq!( try_parse_utf8_char(&[0xf0, 0x9f, 0x8c, 0x82, 0x20]), Some(('πŸŒ‚', 4)) ); assert_eq!(try_parse_utf8_char(&[]), None); assert_eq!(try_parse_utf8_char(&[0xef]), None); assert_eq!(try_parse_utf8_char(&[0xef, 0x20]), None); assert_eq!(try_parse_utf8_char(&[0xf0, 0xf0]), None); } #[test] fn test_strip_ansi() { // The sequence detection is covered by the tests in the vscreen module. assert_eq!(strip_ansi("no ansi"), "no ansi"); assert_eq!(strip_ansi("\x1B[33mone"), "one"); assert_eq!( strip_ansi("\x1B]1\x07multiple\x1B[J sequences"), "multiple sequences" ); } bat-0.25.0/src/pretty_printer.rs000064400000000000000000000305541046102023000147140ustar 00000000000000use std::io::Read; use std::path::Path; use console::Term; use crate::{ assets::HighlightingAssets, config::{Config, VisibleLines}, controller::Controller, error::Result, input, line_range::{HighlightedLineRanges, LineRange, LineRanges}, style::StyleComponent, StripAnsiMode, SyntaxMapping, WrappingMode, }; #[cfg(feature = "paging")] use crate::paging::PagingMode; #[derive(Default)] struct ActiveStyleComponents { header_filename: bool, #[cfg(feature = "git")] vcs_modification_markers: bool, grid: bool, rule: bool, line_numbers: bool, snip: bool, } #[non_exhaustive] pub struct Syntax { pub name: String, pub file_extensions: Vec, } pub struct PrettyPrinter<'a> { inputs: Vec>, config: Config<'a>, assets: HighlightingAssets, highlighted_lines: Vec, term_width: Option, active_style_components: ActiveStyleComponents, } impl<'a> PrettyPrinter<'a> { pub fn new() -> Self { let config = Config { colored_output: true, true_color: true, ..Default::default() }; PrettyPrinter { inputs: vec![], config, assets: HighlightingAssets::from_binary(), highlighted_lines: vec![], term_width: None, active_style_components: ActiveStyleComponents::default(), } } /// Add an input which should be pretty-printed pub fn input(&mut self, input: Input<'a>) -> &mut Self { self.inputs.push(input); self } /// Adds multiple inputs which should be pretty-printed pub fn inputs(&mut self, inputs: impl IntoIterator>) -> &mut Self { for input in inputs { self.inputs.push(input); } self } /// Add a file which should be pretty-printed pub fn input_file(&mut self, path: impl AsRef) -> &mut Self { self.input(Input::from_file(path).kind("File")) } /// Add multiple files which should be pretty-printed pub fn input_files(&mut self, paths: I) -> &mut Self where I: IntoIterator, P: AsRef, { self.inputs(paths.into_iter().map(Input::from_file)) } /// Add STDIN as an input pub fn input_stdin(&mut self) -> &mut Self { self.inputs.push(Input::from_stdin()); self } /// Add a byte string as an input pub fn input_from_bytes(&mut self, content: &'a [u8]) -> &mut Self { self.input_from_reader(content) } /// Add a custom reader as an input pub fn input_from_reader(&mut self, reader: R) -> &mut Self { self.inputs.push(Input::from_reader(reader)); self } /// Specify the syntax file which should be used (default: auto-detect) pub fn language(&mut self, language: &'a str) -> &mut Self { self.config.language = Some(language); self } /// The character width of the terminal (default: autodetect) pub fn term_width(&mut self, width: usize) -> &mut Self { self.term_width = Some(width); self } /// The width of tab characters (default: None - do not turn tabs to spaces) pub fn tab_width(&mut self, tab_width: Option) -> &mut Self { self.config.tab_width = tab_width.unwrap_or(0); self } /// Whether or not the output should be colorized (default: true) pub fn colored_output(&mut self, yes: bool) -> &mut Self { self.config.colored_output = yes; self } /// Whether or not to output 24bit colors (default: true) pub fn true_color(&mut self, yes: bool) -> &mut Self { self.config.true_color = yes; self } /// Whether to show a header with the file name pub fn header(&mut self, yes: bool) -> &mut Self { self.active_style_components.header_filename = yes; self } /// Whether to show line numbers pub fn line_numbers(&mut self, yes: bool) -> &mut Self { self.active_style_components.line_numbers = yes; self } /// Whether to paint a grid, separating line numbers, git changes and the code pub fn grid(&mut self, yes: bool) -> &mut Self { self.active_style_components.grid = yes; self } /// Whether to paint a horizontal rule to delimit files pub fn rule(&mut self, yes: bool) -> &mut Self { self.active_style_components.rule = yes; self } /// Whether to show modification markers for VCS changes. This has no effect if /// the `git` feature is not activated. #[cfg(feature = "git")] pub fn vcs_modification_markers(&mut self, yes: bool) -> &mut Self { self.active_style_components.vcs_modification_markers = yes; self } /// Whether to print binary content or nonprintable characters (default: no) pub fn show_nonprintable(&mut self, yes: bool) -> &mut Self { self.config.show_nonprintable = yes; self } /// Whether to show "snip" markers between visible line ranges (default: no) pub fn snip(&mut self, yes: bool) -> &mut Self { self.active_style_components.snip = yes; self } /// Whether to remove ANSI escape sequences from the input (default: never) /// /// If `Auto` is used, escape sequences will only be removed when the input /// is not plain text. pub fn strip_ansi(&mut self, mode: StripAnsiMode) -> &mut Self { self.config.strip_ansi = mode; self } /// Text wrapping mode (default: do not wrap) pub fn wrapping_mode(&mut self, mode: WrappingMode) -> &mut Self { self.config.wrapping_mode = mode; self } /// Whether or not to use ANSI italics (default: off) pub fn use_italics(&mut self, yes: bool) -> &mut Self { self.config.use_italic_text = yes; self } /// If and how to use a pager (default: no paging) #[cfg(feature = "paging")] pub fn paging_mode(&mut self, mode: PagingMode) -> &mut Self { self.config.paging_mode = mode; self } /// Specify the command to start the pager (default: use "less") #[cfg(feature = "paging")] pub fn pager(&mut self, cmd: &'a str) -> &mut Self { self.config.pager = Some(cmd); self } /// Specify the lines that should be printed (default: all) pub fn line_ranges(&mut self, ranges: LineRanges) -> &mut Self { self.config.visible_lines = VisibleLines::Ranges(ranges); self } /// Specify a line that should be highlighted (default: none). /// This can be called multiple times to highlight more than one /// line. See also: highlight_range. pub fn highlight(&mut self, line: usize) -> &mut Self { self.highlighted_lines.push(LineRange::new(line, line)); self } /// Specify a range of lines that should be highlighted (default: none). /// This can be called multiple times to highlight more than one range /// of lines. pub fn highlight_range(&mut self, from: usize, to: usize) -> &mut Self { self.highlighted_lines.push(LineRange::new(from, to)); self } /// Specify the maximum number of consecutive empty lines to print. pub fn squeeze_empty_lines(&mut self, maximum: Option) -> &mut Self { self.config.squeeze_lines = maximum; self } /// Specify the highlighting theme. /// You can use [`crate::theme::theme`] to pick a theme based on user preferences /// and the terminal's background color. pub fn theme(&mut self, theme: impl AsRef) -> &mut Self { self.config.theme = theme.as_ref().to_owned(); self } /// Specify custom file extension / file name to syntax mappings pub fn syntax_mapping(&mut self, mapping: SyntaxMapping<'a>) -> &mut Self { self.config.syntax_mapping = mapping; self } pub fn themes(&self) -> impl Iterator { self.assets.themes() } pub fn syntaxes(&self) -> impl Iterator + '_ { // We always use assets from the binary, which are guaranteed to always // be valid, so get_syntaxes() can never fail here self.assets .get_syntaxes() .unwrap() .iter() .filter(|s| !s.hidden) .map(|s| Syntax { name: s.name.clone(), file_extensions: s.file_extensions.clone(), }) } /// Pretty-print all specified inputs. This method will "use" all stored inputs. /// If you want to call 'print' multiple times, you have to call the appropriate /// input_* methods again. pub fn print(&mut self) -> Result { self.print_with_writer(None::<&mut dyn std::fmt::Write>) } /// Pretty-print all specified inputs to a specified writer. pub fn print_with_writer(&mut self, writer: Option) -> Result { let highlight_lines = std::mem::take(&mut self.highlighted_lines); self.config.highlighted_lines = HighlightedLineRanges(LineRanges::from(highlight_lines)); self.config.term_width = self .term_width .unwrap_or_else(|| Term::stdout().size().1 as usize); self.config.style_components.clear(); if self.active_style_components.grid { self.config.style_components.insert(StyleComponent::Grid); } if self.active_style_components.rule { self.config.style_components.insert(StyleComponent::Rule); } if self.active_style_components.header_filename { self.config .style_components .insert(StyleComponent::HeaderFilename); } if self.active_style_components.line_numbers { self.config .style_components .insert(StyleComponent::LineNumbers); } if self.active_style_components.snip { self.config.style_components.insert(StyleComponent::Snip); } #[cfg(feature = "git")] if self.active_style_components.vcs_modification_markers { self.config.style_components.insert(StyleComponent::Changes); } // Collect the inputs to print let inputs = std::mem::take(&mut self.inputs); // Run the controller let controller = Controller::new(&self.config, &self.assets); // If writer is provided, pass it to the controller, otherwise pass None if let Some(mut w) = writer { controller.run(inputs.into_iter().map(|i| i.into()).collect(), Some(&mut w)) } else { controller.run(inputs.into_iter().map(|i| i.into()).collect(), None) } } } impl Default for PrettyPrinter<'_> { fn default() -> Self { Self::new() } } /// An input source for the pretty printer. pub struct Input<'a> { input: input::Input<'a>, } impl<'a> Input<'a> { /// A new input from a reader. pub fn from_reader(reader: R) -> Self { input::Input::from_reader(Box::new(reader)).into() } /// A new input from a file. pub fn from_file(path: impl AsRef) -> Self { input::Input::ordinary_file(path).into() } /// A new input from bytes. pub fn from_bytes(bytes: &'a [u8]) -> Self { Input::from_reader(bytes) } /// A new input from STDIN. pub fn from_stdin() -> Self { input::Input::stdin().into() } /// The filename of the input. /// This affects syntax detection and changes the default header title. pub fn name(mut self, name: impl AsRef) -> Self { self.input = self.input.with_name(Some(name)); self } /// The description for the type of input (e.g. "File") pub fn kind(mut self, kind: impl Into) -> Self { let kind = kind.into(); self.input .description_mut() .set_kind(if kind.is_empty() { None } else { Some(kind) }); self } /// The title for the input (e.g. "Descriptive title") /// This defaults to the file name. pub fn title(mut self, title: impl Into) -> Self { self.input.description_mut().set_title(Some(title.into())); self } } impl<'a> From> for Input<'a> { fn from(input: input::Input<'a>) -> Self { Self { input } } } impl<'a> From> for input::Input<'a> { fn from(Input { input }: Input<'a>) -> Self { input } } bat-0.25.0/src/printer.rs000064400000000000000000000765431046102023000133150ustar 00000000000000use std::fmt; use std::io; use std::vec::Vec; use nu_ansi_term::Color::{Fixed, Green, Red, Yellow}; use nu_ansi_term::Style; use bytesize::ByteSize; use syntect::easy::HighlightLines; use syntect::highlighting::Color; use syntect::highlighting::FontStyle; use syntect::highlighting::Theme; use syntect::parsing::SyntaxSet; use content_inspector::ContentType; use encoding_rs::{UTF_16BE, UTF_16LE}; use unicode_width::UnicodeWidthChar; use crate::assets::{HighlightingAssets, SyntaxReferenceInSet}; use crate::config::Config; #[cfg(feature = "git")] use crate::decorations::LineChangesDecoration; use crate::decorations::{Decoration, GridBorderDecoration, LineNumberDecoration}; #[cfg(feature = "git")] use crate::diff::LineChanges; use crate::error::*; use crate::input::OpenedInput; use crate::line_range::RangeCheckResult; use crate::preprocessor::strip_ansi; use crate::preprocessor::{expand_tabs, replace_nonprintable}; use crate::style::StyleComponent; use crate::terminal::{as_terminal_escaped, to_ansi_color}; use crate::vscreen::{AnsiStyle, EscapeSequence, EscapeSequenceIterator}; use crate::wrapping::WrappingMode; use crate::BinaryBehavior; use crate::StripAnsiMode; const ANSI_UNDERLINE_ENABLE: EscapeSequence = EscapeSequence::CSI { raw_sequence: "\x1B[4m", parameters: "4", intermediates: "", final_byte: "m", }; const ANSI_UNDERLINE_DISABLE: EscapeSequence = EscapeSequence::CSI { raw_sequence: "\x1B[24m", parameters: "24", intermediates: "", final_byte: "m", }; const EMPTY_SYNTECT_STYLE: syntect::highlighting::Style = syntect::highlighting::Style { foreground: Color { r: 127, g: 127, b: 127, a: 255, }, background: Color { r: 127, g: 127, b: 127, a: 255, }, font_style: FontStyle::empty(), }; pub enum OutputHandle<'a> { IoWrite(&'a mut dyn io::Write), FmtWrite(&'a mut dyn fmt::Write), } impl<'a> OutputHandle<'a> { fn write_fmt(&mut self, args: fmt::Arguments<'_>) -> Result<()> { match self { Self::IoWrite(handle) => handle.write_fmt(args).map_err(Into::into), Self::FmtWrite(handle) => handle.write_fmt(args).map_err(Into::into), } } } pub(crate) trait Printer { fn print_header( &mut self, handle: &mut OutputHandle, input: &OpenedInput, add_header_padding: bool, ) -> Result<()>; fn print_footer(&mut self, handle: &mut OutputHandle, input: &OpenedInput) -> Result<()>; fn print_snip(&mut self, handle: &mut OutputHandle) -> Result<()>; fn print_line( &mut self, out_of_range: bool, handle: &mut OutputHandle, line_number: usize, line_buffer: &[u8], ) -> Result<()>; } pub struct SimplePrinter<'a> { config: &'a Config<'a>, consecutive_empty_lines: usize, } impl<'a> SimplePrinter<'a> { pub fn new(config: &'a Config) -> Self { SimplePrinter { config, consecutive_empty_lines: 0, } } } impl<'a> Printer for SimplePrinter<'a> { fn print_header( &mut self, _handle: &mut OutputHandle, _input: &OpenedInput, _add_header_padding: bool, ) -> Result<()> { Ok(()) } fn print_footer(&mut self, _handle: &mut OutputHandle, _input: &OpenedInput) -> Result<()> { Ok(()) } fn print_snip(&mut self, _handle: &mut OutputHandle) -> Result<()> { Ok(()) } fn print_line( &mut self, out_of_range: bool, handle: &mut OutputHandle, _line_number: usize, line_buffer: &[u8], ) -> Result<()> { // Skip squeezed lines. if let Some(squeeze_limit) = self.config.squeeze_lines { if String::from_utf8_lossy(line_buffer) .trim_end_matches(|c| c == '\r' || c == '\n') .is_empty() { self.consecutive_empty_lines += 1; if self.consecutive_empty_lines > squeeze_limit { return Ok(()); } } else { self.consecutive_empty_lines = 0; } } if !out_of_range { if self.config.show_nonprintable { let line = replace_nonprintable( line_buffer, self.config.tab_width, self.config.nonprintable_notation, ); write!(handle, "{line}")?; } else { match handle { OutputHandle::IoWrite(handle) => handle.write_all(line_buffer)?, OutputHandle::FmtWrite(handle) => { write!( handle, "{}", std::str::from_utf8(line_buffer).map_err(|_| Error::Msg( "encountered invalid utf8 while printing to non-io buffer" .to_string() ))? )?; } } }; } Ok(()) } } struct HighlighterFromSet<'a> { highlighter: HighlightLines<'a>, syntax_set: &'a SyntaxSet, } impl<'a> HighlighterFromSet<'a> { fn new(syntax_in_set: SyntaxReferenceInSet<'a>, theme: &'a Theme) -> Self { Self { highlighter: HighlightLines::new(syntax_in_set.syntax, theme), syntax_set: syntax_in_set.syntax_set, } } } pub(crate) struct InteractivePrinter<'a> { colors: Colors, config: &'a Config<'a>, decorations: Vec>, panel_width: usize, ansi_style: AnsiStyle, content_type: Option, #[cfg(feature = "git")] pub line_changes: &'a Option, highlighter_from_set: Option>, background_color_highlight: Option, consecutive_empty_lines: usize, strip_ansi: bool, } impl<'a> InteractivePrinter<'a> { pub(crate) fn new( config: &'a Config, assets: &'a HighlightingAssets, input: &mut OpenedInput, #[cfg(feature = "git")] line_changes: &'a Option, ) -> Result { let theme = assets.get_theme(&config.theme); let background_color_highlight = theme.settings.line_highlight; let colors = if config.colored_output { Colors::colored(theme, config.true_color) } else { Colors::plain() }; // Create decorations. let mut decorations: Vec> = Vec::new(); if config.style_components.numbers() { decorations.push(Box::new(LineNumberDecoration::new(&colors))); } #[cfg(feature = "git")] { if config.style_components.changes() { decorations.push(Box::new(LineChangesDecoration::new(&colors))); } } let mut panel_width: usize = decorations.len() + decorations.iter().fold(0, |a, x| a + x.width()); // The grid border decoration isn't added until after the panel_width calculation, since the // print_horizontal_line, print_header, and print_footer functions all assume the panel // width is without the grid border. if config.style_components.grid() && !decorations.is_empty() { decorations.push(Box::new(GridBorderDecoration::new(&colors))); } // Disable the panel if the terminal is too small (i.e. can't fit 5 characters with the // panel showing). if config.term_width < (decorations.len() + decorations.iter().fold(0, |a, x| a + x.width())) + 5 { decorations.clear(); panel_width = 0; } // Get the highlighter for the output. let is_printing_binary = input .reader .content_type .map_or(false, |c| c.is_binary() && !config.show_nonprintable); let needs_to_match_syntax = (!is_printing_binary || matches!(config.binary, BinaryBehavior::AsText)) && (config.colored_output || config.strip_ansi == StripAnsiMode::Auto); let (is_plain_text, highlighter_from_set) = if needs_to_match_syntax { // Determine the type of syntax for highlighting const PLAIN_TEXT_SYNTAX: &str = "Plain Text"; match assets.get_syntax(config.language, input, &config.syntax_mapping) { Ok(syntax_in_set) => ( syntax_in_set.syntax.name == PLAIN_TEXT_SYNTAX, Some(HighlighterFromSet::new(syntax_in_set, theme)), ), Err(Error::UndetectedSyntax(_)) => ( true, Some( assets .find_syntax_by_name(PLAIN_TEXT_SYNTAX)? .map(|s| HighlighterFromSet::new(s, theme)) .expect("A plain text syntax is available"), ), ), Err(e) => return Err(e), } } else { (false, None) }; // Determine when to strip ANSI sequences let strip_ansi = match config.strip_ansi { _ if config.show_nonprintable => false, StripAnsiMode::Always => true, StripAnsiMode::Auto if is_plain_text => false, // Plain text may already contain escape sequences. StripAnsiMode::Auto => true, _ => false, }; Ok(InteractivePrinter { panel_width, colors, config, decorations, content_type: input.reader.content_type, ansi_style: AnsiStyle::new(), #[cfg(feature = "git")] line_changes, highlighter_from_set, background_color_highlight, consecutive_empty_lines: 0, strip_ansi, }) } fn print_horizontal_line_term( &mut self, handle: &mut OutputHandle, style: Style, ) -> Result<()> { writeln!( handle, "{}", style.paint("─".repeat(self.config.term_width)) )?; Ok(()) } fn print_horizontal_line(&mut self, handle: &mut OutputHandle, grid_char: char) -> Result<()> { if self.panel_width == 0 { self.print_horizontal_line_term(handle, self.colors.grid)?; } else { let hline = "─".repeat(self.config.term_width - (self.panel_width + 1)); let hline = format!("{}{}{}", "─".repeat(self.panel_width), grid_char, hline); writeln!(handle, "{}", self.colors.grid.paint(hline))?; } Ok(()) } fn create_fake_panel(&self, text: &str) -> String { if self.panel_width == 0 { return "".to_string(); } let text_truncated: String = text.chars().take(self.panel_width - 1).collect(); let text_filled: String = format!( "{}{}", text_truncated, " ".repeat(self.panel_width - 1 - text_truncated.len()) ); if self.config.style_components.grid() { format!("{text_filled} β”‚ ") } else { text_filled } } fn get_header_component_indent_length(&self) -> usize { if self.config.style_components.grid() && self.panel_width > 0 { self.panel_width + 2 } else { self.panel_width } } fn print_header_component_indent(&mut self, handle: &mut OutputHandle) -> Result<()> { if self.config.style_components.grid() { write!( handle, "{}{}", " ".repeat(self.panel_width), self.colors .grid .paint(if self.panel_width > 0 { "β”‚ " } else { "" }), ) } else { write!(handle, "{}", " ".repeat(self.panel_width)) } } fn print_header_component_with_indent( &mut self, handle: &mut OutputHandle, content: &str, ) -> Result<()> { self.print_header_component_indent(handle)?; writeln!(handle, "{content}") } fn print_header_multiline_component( &mut self, handle: &mut OutputHandle, content: &str, ) -> Result<()> { let mut content = content; let content_width = self.config.term_width - self.get_header_component_indent_length(); while content.len() > content_width { let (content_line, remaining) = content.split_at(content_width); self.print_header_component_with_indent(handle, content_line)?; content = remaining; } self.print_header_component_with_indent(handle, content) } fn highlight_regions_for_line<'b>( &mut self, line: &'b str, ) -> Result> { let highlighter_from_set = match self.highlighter_from_set { Some(ref mut highlighter_from_set) => highlighter_from_set, _ => return Ok(vec![(EMPTY_SYNTECT_STYLE, line)]), }; // skip syntax highlighting on long lines let too_long = line.len() > 1024 * 16; let for_highlighting: &str = if too_long { "\n" } else { line }; let mut highlighted_line = highlighter_from_set .highlighter .highlight_line(for_highlighting, highlighter_from_set.syntax_set)?; if too_long { highlighted_line[0].1 = &line; } Ok(highlighted_line) } fn preprocess(&self, text: &str, cursor: &mut usize) -> String { if self.config.tab_width > 0 { return expand_tabs(text, self.config.tab_width, cursor); } *cursor += text.len(); text.to_string() } } impl<'a> Printer for InteractivePrinter<'a> { fn print_header( &mut self, handle: &mut OutputHandle, input: &OpenedInput, add_header_padding: bool, ) -> Result<()> { if add_header_padding && self.config.style_components.rule() { self.print_horizontal_line_term(handle, self.colors.rule)?; } if !self.config.style_components.header() { if Some(ContentType::BINARY) == self.content_type && !self.config.show_nonprintable && !matches!(self.config.binary, BinaryBehavior::AsText) { writeln!( handle, "{}: Binary content from {} will not be printed to the terminal \ (but will be present if the output of 'bat' is piped). You can use 'bat -A' \ to show the binary file contents.", Yellow.paint("[bat warning]"), input.description.summary(), )?; } else if self.config.style_components.grid() { self.print_horizontal_line(handle, '┬')?; } return Ok(()); } let mode = match self.content_type { Some(ContentType::BINARY) => " ", Some(ContentType::UTF_16LE) => " ", Some(ContentType::UTF_16BE) => " ", None => " ", _ => "", }; let description = &input.description; let metadata = &input.metadata; // We use this iterator to have a deterministic order for // header components. HashSet has arbitrary order, but Vec is ordered. let header_components: Vec = [ ( StyleComponent::HeaderFilename, self.config.style_components.header_filename(), ), ( StyleComponent::HeaderFilesize, self.config.style_components.header_filesize(), ), ] .iter() .filter(|(_, is_enabled)| *is_enabled) .map(|(component, _)| *component) .collect(); // Print the cornering grid before the first header component if self.config.style_components.grid() { self.print_horizontal_line(handle, '┬')?; } else { // Only pad space between files, if we haven't already drawn a horizontal rule if add_header_padding && !self.config.style_components.rule() { writeln!(handle)?; } } header_components .iter() .try_for_each(|component| match component { StyleComponent::HeaderFilename => { let header_filename = format!( "{}{}{}", description .kind() .map(|kind| format!("{kind}: ")) .unwrap_or_else(|| "".into()), self.colors.header_value.paint(description.title()), mode ); self.print_header_multiline_component(handle, &header_filename) } StyleComponent::HeaderFilesize => { let bsize = metadata .size .map(|s| format!("{}", ByteSize(s))) .unwrap_or_else(|| "-".into()); let header_filesize = format!("Size: {}", self.colors.header_value.paint(bsize)); self.print_header_multiline_component(handle, &header_filesize) } _ => Ok(()), })?; if self.config.style_components.grid() { if self.content_type.map_or(false, |c| c.is_text()) || self.config.show_nonprintable || matches!(self.config.binary, BinaryBehavior::AsText) { self.print_horizontal_line(handle, 'β”Ό')?; } else { self.print_horizontal_line(handle, 'β”΄')?; } } Ok(()) } fn print_footer(&mut self, handle: &mut OutputHandle, _input: &OpenedInput) -> Result<()> { if self.config.style_components.grid() && (self.content_type.map_or(false, |c| c.is_text()) || self.config.show_nonprintable || matches!(self.config.binary, BinaryBehavior::AsText)) { self.print_horizontal_line(handle, 'β”΄') } else { Ok(()) } } fn print_snip(&mut self, handle: &mut OutputHandle) -> Result<()> { let panel = self.create_fake_panel(" ..."); let panel_count = panel.chars().count(); let title = "8<"; let title_count = title.chars().count(); let snip_left = "─ ".repeat((self.config.term_width - panel_count - (title_count / 2)) / 4); let snip_left_count = snip_left.chars().count(); // Can't use .len() with Unicode. let snip_right = " ─".repeat((self.config.term_width - panel_count - snip_left_count - title_count) / 2); writeln!( handle, "{}", self.colors .grid .paint(format!("{panel}{snip_left}{title}{snip_right}")) )?; Ok(()) } fn print_line( &mut self, out_of_range: bool, handle: &mut OutputHandle, line_number: usize, line_buffer: &[u8], ) -> Result<()> { let line = if self.config.show_nonprintable { replace_nonprintable( line_buffer, self.config.tab_width, self.config.nonprintable_notation, ) .into() } else { let mut line = match self.content_type { Some(ContentType::BINARY) | None if !matches!(self.config.binary, BinaryBehavior::AsText) => { return Ok(()); } Some(ContentType::UTF_16LE) => UTF_16LE.decode_with_bom_removal(line_buffer).0, Some(ContentType::UTF_16BE) => UTF_16BE.decode_with_bom_removal(line_buffer).0, _ => { let line = String::from_utf8_lossy(line_buffer); if line_number == 1 { match line.strip_prefix('\u{feff}') { Some(stripped) => stripped.to_string().into(), None => line, } } else { line } } }; // If ANSI escape sequences are supposed to be stripped, do it before syntax highlighting. if self.strip_ansi { line = strip_ansi(&line).into() } line }; let regions = self.highlight_regions_for_line(&line)?; if out_of_range { return Ok(()); } // Skip squeezed lines. if let Some(squeeze_limit) = self.config.squeeze_lines { if line.trim_end_matches(|c| c == '\r' || c == '\n').is_empty() { self.consecutive_empty_lines += 1; if self.consecutive_empty_lines > squeeze_limit { return Ok(()); } } else { self.consecutive_empty_lines = 0; } } let mut cursor: usize = 0; let mut cursor_max: usize = self.config.term_width; let mut cursor_total: usize = 0; let mut panel_wrap: Option = None; // Line highlighting let highlight_this_line = self.config.highlighted_lines.0.check(line_number) == RangeCheckResult::InRange; if highlight_this_line && self.config.theme == "ansi" { self.ansi_style.update(ANSI_UNDERLINE_ENABLE); } let background_color = self .background_color_highlight .filter(|_| highlight_this_line); // Line decorations. if self.panel_width > 0 { let decorations = self .decorations .iter() .map(|d| d.generate(line_number, false, self)); for deco in decorations { write!(handle, "{} ", deco.text)?; cursor_max -= deco.width + 1; } } // Line contents. if matches!(self.config.wrapping_mode, WrappingMode::NoWrapping(_)) { let true_color = self.config.true_color; let colored_output = self.config.colored_output; let italics = self.config.use_italic_text; for &(style, region) in ®ions { let ansi_iterator = EscapeSequenceIterator::new(region); for chunk in ansi_iterator { match chunk { // Regular text. EscapeSequence::Text(text) => { let text = self.preprocess(text, &mut cursor_total); let text_trimmed = text.trim_end_matches(|c| c == '\r' || c == '\n'); write!( handle, "{}{}", as_terminal_escaped( style, &format!("{}{}", self.ansi_style, text_trimmed), true_color, colored_output, italics, background_color ), self.ansi_style.to_reset_sequence(), )?; // Pad the rest of the line. if text.len() != text_trimmed.len() { if let Some(background_color) = background_color { let ansi_style = Style { background: to_ansi_color(background_color, true_color), ..Default::default() }; let width = if cursor_total <= cursor_max { cursor_max - cursor_total + 1 } else { 0 }; write!(handle, "{}", ansi_style.paint(" ".repeat(width)))?; } write!(handle, "{}", &text[text_trimmed.len()..])?; } } // ANSI escape passthrough. _ => { write!(handle, "{}", chunk.raw())?; self.ansi_style.update(chunk); } } } } if !self.config.style_components.plain() && line.bytes().next_back() != Some(b'\n') { writeln!(handle)?; } } else { for &(style, region) in ®ions { let ansi_iterator = EscapeSequenceIterator::new(region); for chunk in ansi_iterator { match chunk { // Regular text. EscapeSequence::Text(text) => { let text = self.preprocess( text.trim_end_matches(|c| c == '\r' || c == '\n'), &mut cursor_total, ); let mut max_width = cursor_max - cursor; // line buffer (avoid calling write! for every character) let mut line_buf = String::with_capacity(max_width * 4); // Displayed width of line_buf let mut current_width = 0; for c in text.chars() { // calculate the displayed width for next character let cw = c.width().unwrap_or(0); current_width += cw; // if next character cannot be printed on this line, // flush the buffer. if current_width > max_width { // Generate wrap padding if not already generated. if panel_wrap.is_none() { panel_wrap = if self.panel_width > 0 { Some(format!( "{} ", self.decorations .iter() .map(|d| d .generate(line_number, true, self) .text) .collect::>() .join(" ") )) } else { Some("".to_string()) } } // It wraps. write!( handle, "{}{}\n{}", as_terminal_escaped( style, &format!("{}{}", self.ansi_style, line_buf), self.config.true_color, self.config.colored_output, self.config.use_italic_text, background_color ), self.ansi_style.to_reset_sequence(), panel_wrap.clone().unwrap() )?; cursor = 0; max_width = cursor_max; line_buf.clear(); current_width = cw; } line_buf.push(c); } // flush the buffer cursor += current_width; write!( handle, "{}", as_terminal_escaped( style, &format!("{}{}", self.ansi_style, line_buf), self.config.true_color, self.config.colored_output, self.config.use_italic_text, background_color ) )?; } // ANSI escape passthrough. _ => { write!(handle, "{}", chunk.raw())?; self.ansi_style.update(chunk); } } } } if let Some(background_color) = background_color { let ansi_style = Style { background: to_ansi_color(background_color, self.config.true_color), ..Default::default() }; write!( handle, "{}", ansi_style.paint(" ".repeat(cursor_max - cursor)) )?; } writeln!(handle)?; } if highlight_this_line && self.config.theme == "ansi" { write!(handle, "{}", ANSI_UNDERLINE_DISABLE.raw())?; self.ansi_style.update(ANSI_UNDERLINE_DISABLE); } Ok(()) } } const DEFAULT_GUTTER_COLOR: u8 = 238; #[derive(Debug, Default)] pub struct Colors { pub grid: Style, pub rule: Style, pub header_value: Style, pub git_added: Style, pub git_removed: Style, pub git_modified: Style, pub line_number: Style, } impl Colors { fn plain() -> Self { Colors::default() } fn colored(theme: &Theme, true_color: bool) -> Self { let gutter_style = Style { foreground: match theme.settings.gutter_foreground { // If the theme provides a gutter foreground color, use it. // Note: It might be the special value #00000001, in which case // to_ansi_color returns None and we use an empty Style // (resulting in the terminal's default foreground color). Some(c) => to_ansi_color(c, true_color), // Otherwise, use a specific fallback color. None => Some(Fixed(DEFAULT_GUTTER_COLOR)), }, ..Style::default() }; Colors { grid: gutter_style, rule: gutter_style, header_value: Style::new().bold(), git_added: Green.normal(), git_removed: Red.normal(), git_modified: Yellow.normal(), line_number: gutter_style, } } } bat-0.25.0/src/style.rs000064400000000000000000000262651046102023000127660ustar 00000000000000use std::collections::HashSet; use std::str::FromStr; use crate::error::*; #[non_exhaustive] #[derive(Debug, Eq, PartialEq, Copy, Clone, Hash)] pub enum StyleComponent { Auto, #[cfg(feature = "git")] Changes, Grid, Rule, Header, HeaderFilename, HeaderFilesize, LineNumbers, Snip, Full, Default, Plain, } impl StyleComponent { pub fn components(self, interactive_terminal: bool) -> &'static [StyleComponent] { match self { StyleComponent::Auto => { if interactive_terminal { StyleComponent::Default.components(interactive_terminal) } else { StyleComponent::Plain.components(interactive_terminal) } } #[cfg(feature = "git")] StyleComponent::Changes => &[StyleComponent::Changes], StyleComponent::Grid => &[StyleComponent::Grid], StyleComponent::Rule => &[StyleComponent::Rule], StyleComponent::Header => &[StyleComponent::HeaderFilename], StyleComponent::HeaderFilename => &[StyleComponent::HeaderFilename], StyleComponent::HeaderFilesize => &[StyleComponent::HeaderFilesize], StyleComponent::LineNumbers => &[StyleComponent::LineNumbers], StyleComponent::Snip => &[StyleComponent::Snip], StyleComponent::Full => &[ #[cfg(feature = "git")] StyleComponent::Changes, StyleComponent::Grid, StyleComponent::HeaderFilename, StyleComponent::HeaderFilesize, StyleComponent::LineNumbers, StyleComponent::Snip, ], StyleComponent::Default => &[ #[cfg(feature = "git")] StyleComponent::Changes, StyleComponent::Grid, StyleComponent::HeaderFilename, StyleComponent::LineNumbers, StyleComponent::Snip, ], StyleComponent::Plain => &[], } } } impl FromStr for StyleComponent { type Err = Error; fn from_str(s: &str) -> Result { match s { "auto" => Ok(StyleComponent::Auto), #[cfg(feature = "git")] "changes" => Ok(StyleComponent::Changes), "grid" => Ok(StyleComponent::Grid), "rule" => Ok(StyleComponent::Rule), "header" => Ok(StyleComponent::Header), "header-filename" => Ok(StyleComponent::HeaderFilename), "header-filesize" => Ok(StyleComponent::HeaderFilesize), "numbers" => Ok(StyleComponent::LineNumbers), "snip" => Ok(StyleComponent::Snip), "full" => Ok(StyleComponent::Full), "default" => Ok(StyleComponent::Default), "plain" => Ok(StyleComponent::Plain), _ => Err(format!("Unknown style '{s}'").into()), } } } #[derive(Debug, Clone, Default)] pub struct StyleComponents(pub HashSet); impl StyleComponents { pub fn new(components: &[StyleComponent]) -> StyleComponents { StyleComponents(components.iter().cloned().collect()) } #[cfg(feature = "git")] pub fn changes(&self) -> bool { self.0.contains(&StyleComponent::Changes) } pub fn grid(&self) -> bool { self.0.contains(&StyleComponent::Grid) } pub fn rule(&self) -> bool { self.0.contains(&StyleComponent::Rule) } pub fn header(&self) -> bool { self.header_filename() || self.header_filesize() } pub fn header_filename(&self) -> bool { self.0.contains(&StyleComponent::HeaderFilename) } pub fn header_filesize(&self) -> bool { self.0.contains(&StyleComponent::HeaderFilesize) } pub fn numbers(&self) -> bool { self.0.contains(&StyleComponent::LineNumbers) } pub fn snip(&self) -> bool { self.0.contains(&StyleComponent::Snip) } pub fn plain(&self) -> bool { self.0.iter().all(|c| c == &StyleComponent::Plain) } pub fn insert(&mut self, component: StyleComponent) { self.0.insert(component); } pub fn clear(&mut self) { self.0.clear(); } } #[derive(Debug, PartialEq)] enum ComponentAction { Override, Add, Remove, } impl ComponentAction { fn extract_from_str(string: &str) -> (ComponentAction, &str) { match string.chars().next() { Some('-') => (ComponentAction::Remove, string.strip_prefix('-').unwrap()), Some('+') => (ComponentAction::Add, string.strip_prefix('+').unwrap()), _ => (ComponentAction::Override, string), } } } /// A list of [StyleComponent] that can be parsed from a string. pub struct StyleComponentList(Vec<(ComponentAction, StyleComponent)>); impl StyleComponentList { fn expand_into(&self, components: &mut HashSet, interactive_terminal: bool) { for (action, component) in self.0.iter() { let subcomponents = component.components(interactive_terminal); use ComponentAction::*; match action { Override | Add => components.extend(subcomponents), Remove => components.retain(|c| !subcomponents.contains(c)), } } } /// Returns `true` if any component in the list was not prefixed with `+` or `-`. fn contains_override(&self) -> bool { self.0.iter().any(|(a, _)| *a == ComponentAction::Override) } /// Combines multiple [StyleComponentList]s into a single [StyleComponents] set. /// /// ## Precedence /// The most recent list will take precedence and override all previous lists /// unless it only contains components prefixed with `-` or `+`. When this /// happens, the list's components will be merged into the previous list. /// /// ## Example /// ```text /// [numbers,grid] + [header,changes] -> [header,changes] /// [numbers,grid] + [+header,-grid] -> [numbers,header] /// ``` /// /// ## Parameters /// - `with_default`: If true, the styles lists will build upon the StyleComponent::Auto style. pub fn to_components( lists: impl IntoIterator, interactive_terminal: bool, with_default: bool, ) -> StyleComponents { let mut components: HashSet = HashSet::new(); if with_default { components.extend(StyleComponent::Auto.components(interactive_terminal)) } StyleComponents(lists.into_iter().fold(components, |mut components, list| { if list.contains_override() { components.clear(); } list.expand_into(&mut components, interactive_terminal); components })) } } impl Default for StyleComponentList { fn default() -> Self { StyleComponentList(vec![(ComponentAction::Override, StyleComponent::Default)]) } } impl FromStr for StyleComponentList { type Err = Error; fn from_str(s: &str) -> Result { Ok(StyleComponentList( s.split(",") .map(|s| ComponentAction::extract_from_str(s)) // If the component starts with "-", it's meant to be removed .map(|(a, s)| Ok((a, StyleComponent::from_str(s)?))) .collect::>>()?, )) } } #[cfg(test)] mod test { use std::collections::HashSet; use std::str::FromStr; use super::ComponentAction::*; use super::StyleComponent; use super::StyleComponent::*; use super::StyleComponentList; #[test] pub fn style_component_list_parse() { assert_eq!( StyleComponentList::from_str("grid,+numbers,snip,-snip,header") .expect("no error") .0, vec![ (Override, Grid), (Add, LineNumbers), (Override, Snip), (Remove, Snip), (Override, Header), ] ); assert!(StyleComponentList::from_str("not-a-component").is_err()); assert!(StyleComponentList::from_str("grid,not-a-component").is_err()); assert!(StyleComponentList::from_str("numbers,-not-a-component").is_err()); } #[test] pub fn style_component_list_to_components() { assert_eq!( StyleComponentList::to_components( vec![StyleComponentList::from_str("grid,numbers").expect("no error")], false, false ) .0, HashSet::from([Grid, LineNumbers]) ); } #[test] pub fn style_component_list_to_components_removes_negated() { assert_eq!( StyleComponentList::to_components( vec![StyleComponentList::from_str("grid,numbers,-grid").expect("no error")], false, false ) .0, HashSet::from([LineNumbers]) ); } #[test] pub fn style_component_list_to_components_expands_subcomponents() { assert_eq!( StyleComponentList::to_components( vec![StyleComponentList::from_str("full").expect("no error")], false, false ) .0, HashSet::from_iter(Full.components(true).to_owned()) ); } #[test] pub fn style_component_list_expand_negates_subcomponents() { assert!(!StyleComponentList::to_components( vec![StyleComponentList::from_str("full,-numbers").expect("no error")], true, false ) .numbers()); } #[test] pub fn style_component_list_to_components_precedence_overrides_previous_lists() { assert_eq!( StyleComponentList::to_components( vec![ StyleComponentList::from_str("grid").expect("no error"), StyleComponentList::from_str("numbers").expect("no error"), ], false, false ) .0, HashSet::from([LineNumbers]) ); } #[test] pub fn style_component_list_to_components_precedence_merges_previous_lists() { assert_eq!( StyleComponentList::to_components( vec![ StyleComponentList::from_str("grid,header").expect("no error"), StyleComponentList::from_str("-grid").expect("no error"), StyleComponentList::from_str("+numbers").expect("no error"), ], false, false ) .0, HashSet::from([HeaderFilename, LineNumbers]) ); } #[test] pub fn style_component_list_default_builds_on_auto() { assert_eq!( StyleComponentList::to_components( vec![StyleComponentList::from_str("-numbers").expect("no error"),], true, true ) .0, { let mut expected: HashSet = HashSet::new(); expected.extend(Auto.components(true)); expected.remove(&LineNumbers); expected } ); } } bat-0.25.0/src/syntax_mapping/builtin.rs000064400000000000000000000063131046102023000163250ustar 00000000000000use std::env; use globset::GlobMatcher; use once_cell::sync::Lazy; use crate::syntax_mapping::{make_glob_matcher, MappingTarget}; // Static syntax mappings generated from /src/syntax_mapping/builtins/ by the // build script (/build/syntax_mapping.rs). include!(concat!( env!("OUT_DIR"), "/codegen_static_syntax_mappings.rs" )); // The defined matcher strings are analysed at compile time and converted into // lazily-compiled `GlobMatcher`s. This is so that the string searches are moved // from run time to compile time, thus improving startup performance. // // To any future maintainer (including possibly myself) wondering why there is // not a `BuiltinMatcher` enum that looks like this: // // ``` // enum BuiltinMatcher { // Fixed(&'static str), // Dynamic(Lazy>), // } // ``` // // Because there was. I tried it and threw it out. // // Naively looking at the problem from a distance, this may seem like a good // design (strongly typed etc. etc.). It would also save on compiled size by // extracting out common behaviour into functions. But while actually // implementing the lazy matcher compilation logic, I realised that it's most // convenient for `BUILTIN_MAPPINGS` to have the following type: // // `[(Lazy>, MappingTarget); N]` // // The benefit for this is that operations like listing all builtin mappings // would be effectively memoised. The caller would not have to compile another // `GlobMatcher` for rules that they have previously visited. // // Unfortunately, this means we are going to have to store a distinct closure // for each rule anyway, which makes a `BuiltinMatcher` enum a pointless layer // of indirection. // // In the current implementation, the closure within each generated rule simply // calls either `build_matcher_fixed` or `build_matcher_dynamic`, depending on // whether the defined matcher contains dynamic segments or not. /// Compile a fixed glob string into a glob matcher. /// /// A failure to compile is a fatal error. /// /// Used internally by `Lazy>`'s lazy evaluation closure. fn build_matcher_fixed(from: &str) -> GlobMatcher { make_glob_matcher(from).expect("A builtin fixed glob matcher failed to compile") } /// Join a list of matcher segments to create a glob string, replacing all /// environment variables, then compile to a glob matcher. /// /// Returns `None` if any replacement fails, or if the joined glob string fails /// to compile. /// /// Used internally by `Lazy>`'s lazy evaluation closure. fn build_matcher_dynamic(segs: &[MatcherSegment]) -> Option { // join segments let mut buf = String::new(); for seg in segs { match seg { MatcherSegment::Text(s) => buf.push_str(s), MatcherSegment::Env(var) => { let replaced = env::var(var).ok()?; buf.push_str(&replaced); } } } // compile glob matcher let matcher = make_glob_matcher(&buf).ok()?; Some(matcher) } /// A segment of a dynamic builtin matcher. /// /// Used internally by `Lazy>`'s lazy evaluation closure. #[derive(Clone, Debug)] enum MatcherSegment { Text(&'static str), Env(&'static str), } bat-0.25.0/src/syntax_mapping/builtins/README.md000064400000000000000000000104631046102023000174220ustar 00000000000000# `/src/syntax_mapping/builtins` The files in this directory define path/name-based syntax mappings, which amend and take precedence over the extension/content-based syntax mappings provided by [syntect](https://github.com/trishume/syntect). ## File organisation Each TOML file should describe the syntax mappings of a single application, or otherwise a set of logically-related rules. What defines "a single application" here is deliberately vague, since the file-splitting is purely for maintainability reasons. (Technically, we could just as well use a single TOML file.) So just use common sense. TOML files should reside in the corresponding subdirectory of the platform(s) that they intend to target. At compile time, the build script will go through each subdirectory that is applicable to the compilation target, collect the syntax mappings defined by all TOML files, and embed them into the binary. ## File syntax Each TOML file should contain a single section named `mappings`, with each of its keys being a language identifier (first column of `bat -L`; also referred to as "target"). The value of each key should be an array of strings, with each item being a glob matcher. We will call each of these items a "rule". For example, if `foo-application` uses both TOML and YAML configuration files, we could write something like this: ```toml # 30-foo-application.toml [mappings] "TOML" = [ # rules for TOML syntax go here "/usr/share/foo-application/toml-config/*.conf", "/etc/foo-application/toml-config/*.conf", ] "YAML" = [ # rules for YAML syntax go here # ... ] ``` ### Dynamic environment variable replacement In additional to the standard glob matcher syntax, rules also support dynamic replacement of environment variables at runtime. This allows us to concisely handle things like [XDG](https://specifications.freedesktop.org/basedir-spec/latest/). All environment variables intended to be replaced at runtime must be enclosed in `${}`, for example `"/foo/*/${YOUR_ENV}-suffix/*.log"`. Note that this is the **only** admissible syntax; other variable substitution syntaxes are not supported and will either cause a compile time error, or be treated as plain text. For example, if `foo-application` also supports per-user configuration files, we could write something like this: ```toml # 30-foo-application.toml [mappings] "TOML" = [ # rules for TOML syntax go here "/usr/share/foo-application/toml-config/*.conf", "/etc/foo-application/toml-config/*.conf", "${XDG_CONFIG_HOME}/foo-application/toml-config/*.conf", "${HOME}/.config/foo-application/toml-config/*.conf", ] "YAML" = [ # rules for YAML syntax go here # ... ] ``` If any environment variable replacement in a rule fails (for example when a variable is unset), or if the glob string after replacements is invalid, the entire rule will be ignored. ### Explicitly mapping to unknown Sometimes it may be necessary to "unset" a particular syntect mapping - perhaps a syntax's matching rules are "too greedy", and is claiming files that it should not. In this case, there are two special identifiers: `MappingTarget::MapToUnknown` and `MappingTarget::MapExtensionToUnknown` (corresponding to the two variants of the `syntax_mapping::MappingTarget` enum). An example of this would be `*.conf` files in general. So we may write something like this: ```toml # 99-unset-ambiguous-extensions.toml [mappings] "MappingTarget::MapExtensionToUnknown" = [ "*.conf", ] ``` ## Ordering At compile time, all TOML files applicable to the target are processed in lexicographical filename order. So `00-foo.toml` takes precedence over `10-bar.toml`, which takes precedence over `20-baz.toml`, and so on. Note that **only** the filenames of the TOML files are taken into account; the subdirectories they are placed in have no influence on ordering. This behaviour can be occasionally useful for creating high/low priority rules, such as in the aforementioned example of explicitly mapping `*.conf` files to unknown. Generally this should not be much of a concern though, since rules should be written as specifically as possible for each application. Rules within each TOML file are processed (and therefore matched) in the order in which they are defined. At runtime, the syntax selection algorithm will short-circuit and return the target of the first matching rule. bat-0.25.0/src/syntax_mapping/builtins/bsd-family/.gitkeep000064400000000000000000000000001046102023000216050ustar 00000000000000bat-0.25.0/src/syntax_mapping/builtins/bsd-family/50-os-release.toml000064400000000000000000000001241046102023000233410ustar 00000000000000[mappings] "Bourne Again Shell (bash)" = ["/etc/os-release", "/var/run/os-release"] bat-0.25.0/src/syntax_mapping/builtins/common/.gitkeep000064400000000000000000000000001046102023000210460ustar 00000000000000bat-0.25.0/src/syntax_mapping/builtins/common/50-apache.toml000064400000000000000000000000521046102023000217640ustar 00000000000000[mappings] "Apache Conf" = ["httpd.conf"] bat-0.25.0/src/syntax_mapping/builtins/common/50-aws-credentials.toml000064400000000000000000000000751046102023000236350ustar 00000000000000[mappings] "INI" = ["**/.aws/credentials", "**/.aws/config"] bat-0.25.0/src/syntax_mapping/builtins/common/50-bat.toml000064400000000000000000000000731046102023000213140ustar 00000000000000[mappings] "Bourne Again Shell (bash)" = ["**/bat/config"] bat-0.25.0/src/syntax_mapping/builtins/common/50-citation.toml000064400000000000000000000000451046102023000223570ustar 00000000000000[mappings] "YAML" = ["CITATION.cff"] bat-0.25.0/src/syntax_mapping/builtins/common/50-container.toml000064400000000000000000000000541046102023000225270ustar 00000000000000[mappings] "Dockerfile" = ["Containerfile"] bat-0.25.0/src/syntax_mapping/builtins/common/50-cpp.toml000064400000000000000000000001751046102023000213330ustar 00000000000000[mappings] "C++" = [ # probably better than the default Objective C mapping #877 "*.h", ] "YAML" = [".clang-format"] bat-0.25.0/src/syntax_mapping/builtins/common/50-diff.toml000064400000000000000000000001411046102023000214520ustar 00000000000000# .debdiff is the extension used for diffs in Debian packaging [mappings] "Diff" = ["*.debdiff"] bat-0.25.0/src/syntax_mapping/builtins/common/50-f-sharp.toml000064400000000000000000000000331046102023000221020ustar 00000000000000[mappings] "F#" = ["*.fs"] bat-0.25.0/src/syntax_mapping/builtins/common/50-git.toml000064400000000000000000000006311046102023000213310ustar 00000000000000# Global git config files rooted in `$XDG_CONFIG_HOME/git/` or `$HOME/.config/git/` # See e.g. https://git-scm.com/docs/git-config#FILES [mappings] "Git Config" = ["${XDG_CONFIG_HOME}/git/config", "${HOME}/.config/git/config"] "Git Ignore" = ["${XDG_CONFIG_HOME}/git/ignore", "${HOME}/.config/git/ignore"] "Git Attributes" = [ "${XDG_CONFIG_HOME}/git/attributes", "${HOME}/.config/git/attributes", ] bat-0.25.0/src/syntax_mapping/builtins/common/50-json.toml000064400000000000000000000001651046102023000215210ustar 00000000000000# JSON Lines is a simple variation of JSON #2535 [mappings] "JSON" = ["*.jsonl", "*.jsonc", "*.jsonld", "*.geojson"] bat-0.25.0/src/syntax_mapping/builtins/common/50-markdown.toml000064400000000000000000000000421046102023000223640ustar 00000000000000[mappings] "Markdown" = ["*.mkd"] bat-0.25.0/src/syntax_mapping/builtins/common/50-nginx.toml000064400000000000000000000000621046102023000216670ustar 00000000000000[mappings] "nginx" = ["nginx.conf", "mime.types"] bat-0.25.0/src/syntax_mapping/builtins/common/50-nmap.toml000064400000000000000000000001221046102023000214740ustar 00000000000000[mappings] # See #2151, https://nmap.org/book/nse-language.html "Lua" = ["*.nse"] bat-0.25.0/src/syntax_mapping/builtins/common/50-proxy-auto-config.toml000064400000000000000000000000631046102023000241370ustar 00000000000000# 1515 [mappings] "JavaScript (Babel)" = ["*.pac"] bat-0.25.0/src/syntax_mapping/builtins/common/50-ron.toml000064400000000000000000000000741046102023000213450ustar 00000000000000# Rusty Object Notation #2427 [mappings] "Rust" = ["*.ron"] bat-0.25.0/src/syntax_mapping/builtins/common/50-sarif.toml000064400000000000000000000001401046102023000216450ustar 00000000000000# SARIF is a format for reporting static analysis results #2695 [mappings] "JSON" = ["*.sarif"] bat-0.25.0/src/syntax_mapping/builtins/common/50-ssh.toml000064400000000000000000000000551046102023000213430ustar 00000000000000[mappings] "SSH Config" = ["**/.ssh/config"] bat-0.25.0/src/syntax_mapping/builtins/common/99-unset-ambiguous-extensions.toml000064400000000000000000000001731046102023000261100ustar 00000000000000[mappings] "MappingTarget::MapExtensionToUnknown" = [ # common extension used for all kinds of formats "*.conf", ] bat-0.25.0/src/syntax_mapping/builtins/common/99-unset-ambiguous-filenames.toml000064400000000000000000000003521046102023000256530ustar 00000000000000[mappings] "MappingTarget::MapToUnknown" = [ # "NAnt Build File" should only match *.build files, not files named "build" "build", # "bin/rails" scripts in a Ruby project misidentified as HTML (Rails) #1008 "rails", ] bat-0.25.0/src/syntax_mapping/builtins/common/xonsh.toml000064400000000000000000000001151046102023000214600ustar 00000000000000# Xonsh shell (https://xon.sh/) [mappings] "Python" = ["*.xsh", "*.xonshrc"] bat-0.25.0/src/syntax_mapping/builtins/linux/.gitkeep000064400000000000000000000000001046102023000207150ustar 00000000000000bat-0.25.0/src/syntax_mapping/builtins/linux/50-containers.toml000064400000000000000000000003641046102023000225650ustar 00000000000000# see https://github.com/containers/image/tree/main/docs [mappings] "TOML" = [ "/usr/share/containers/**/*.conf", "/etc/containers/**/*.conf", "${HOME}/.config/containers/**/*.conf", "${XDG_CONFIG_HOME}/containers/**/*.conf", ] bat-0.25.0/src/syntax_mapping/builtins/linux/50-kubernetes.toml000064400000000000000000000000571046102023000225660ustar 00000000000000[mappings] "YAML" = ["/etc/kubernetes/*.conf"] bat-0.25.0/src/syntax_mapping/builtins/linux/50-os-release.toml000064400000000000000000000002621046102023000224540ustar 00000000000000[mappings] "Bourne Again Shell (bash)" = [ "/etc/os-release", "/usr/lib/os-release", "/etc/initrd-release", "/usr/lib/extension-release.d/extension-release.*", ] bat-0.25.0/src/syntax_mapping/builtins/linux/50-pacman.toml000064400000000000000000000002211046102023000216470ustar 00000000000000[mappings] "INI" = [ # config "/etc/pacman.conf", # hooks "/usr/share/libalpm/hooks/*.hook", "/etc/pacman.d/hooks/*.hook", ] bat-0.25.0/src/syntax_mapping/builtins/linux/50-podman-quadlet.toml000064400000000000000000000004101046102023000233230ustar 00000000000000# see `man quadlet` [mappings] "INI" = [ "**/containers/systemd/*.{container,volume,network,kube,image}", "**/containers/systemd/users/*.{container,volume,network,kube,image}", "**/containers/systemd/users/*/*.{container,volume,network,kube,image}", ] bat-0.25.0/src/syntax_mapping/builtins/linux/50-systemd.toml000064400000000000000000000005141046102023000221050ustar 00000000000000[mappings] "INI" = [ "**/systemd/**/*.conf", "**/systemd/**/*.example", "*.automount", "*.device", "*.dnssd", "*.link", "*.mount", "*.netdev", "*.network", "*.nspawn", "*.path", "*.service", "*.scope", "*.slice", "*.socket", "*.swap", "*.target", "*.timer", ] bat-0.25.0/src/syntax_mapping/builtins/macos/.gitkeep000064400000000000000000000000001046102023000206600ustar 00000000000000bat-0.25.0/src/syntax_mapping/builtins/unix-family/.gitkeep000064400000000000000000000000001046102023000220200ustar 00000000000000bat-0.25.0/src/syntax_mapping/builtins/unix-family/50-apache.toml000064400000000000000000000001601046102023000227360ustar 00000000000000[mappings] "Apache Conf" = ["/etc/apache2/**/*.conf", "/etc/apache2/sites-*/**/*", "/etc/httpd/conf/**/*.conf"] bat-0.25.0/src/syntax_mapping/builtins/unix-family/50-fish-shell.toml000064400000000000000000000000451046102023000235550ustar 00000000000000[mappings] "YAML" = ["fish_history"] bat-0.25.0/src/syntax_mapping/builtins/unix-family/50-korn-shell.toml000064400000000000000000000001621046102023000235750ustar 00000000000000# KornShell is backward-compatible with the Bourne shell #2633 [mappings] "Bourne Again Shell (bash)" = ["*.ksh"] bat-0.25.0/src/syntax_mapping/builtins/unix-family/50-mail-spool.toml000064400000000000000000000000721046102023000235730ustar 00000000000000[mappings] "Email" = ["/var/spool/mail/*", "/var/mail/*"] bat-0.25.0/src/syntax_mapping/builtins/unix-family/50-nginx.toml000064400000000000000000000001111046102023000226340ustar 00000000000000[mappings] "nginx" = ["/etc/nginx/**/*.conf", "/etc/nginx/sites-*/**/*"] bat-0.25.0/src/syntax_mapping/builtins/unix-family/50-shell.toml000064400000000000000000000001361046102023000226270ustar 00000000000000[mappings] "Bourne Again Shell (bash)" = [ # used by lots of shells "/etc/profile", ] bat-0.25.0/src/syntax_mapping/builtins/unix-family/50-wireguard.toml000064400000000000000000000001021046102023000235020ustar 00000000000000# see `man wg-quick` [mappings] "INI" = ["/etc/wireguard/*.conf"] bat-0.25.0/src/syntax_mapping/builtins/windows/.gitkeep000064400000000000000000000000001046102023000212500ustar 00000000000000bat-0.25.0/src/syntax_mapping/ignored_suffixes.rs000064400000000000000000000063011046102023000202170ustar 00000000000000use std::ffi::OsStr; use std::fmt::Debug; use std::path::Path; use crate::error::*; #[derive(Debug, Clone)] pub struct IgnoredSuffixes<'a> { values: Vec<&'a str>, } impl Default for IgnoredSuffixes<'_> { fn default() -> Self { Self { values: vec![ // Editor etc backups "~", ".bak", ".old", ".orig", // Debian and derivatives apt/dpkg/ucf backups ".dpkg-dist", ".dpkg-new", ".dpkg-old", ".dpkg-tmp", ".ucf-dist", ".ucf-new", ".ucf-old", // Red Hat and derivatives rpm backups ".rpmnew", ".rpmorig", ".rpmsave", // Build system input/template files ".in", ], } } } impl<'a> IgnoredSuffixes<'a> { pub fn add_suffix(&mut self, suffix: &'a str) { self.values.push(suffix) } pub fn strip_suffix(&self, file_name: &'a str) -> Option<&'a str> { for suffix in self.values.iter() { if let Some(stripped_file_name) = file_name.strip_suffix(suffix) { return Some(stripped_file_name); } } None } /// If we find an ignored suffix on the file name, e.g. '~', we strip it and /// then try again without it. pub fn try_with_stripped_suffix(&self, file_name: &'a OsStr, func: F) -> Result> where F: Fn(&'a OsStr) -> Result>, { if let Some(file_str) = Path::new(file_name).to_str() { if let Some(stripped_file_name) = self.strip_suffix(file_str) { return func(OsStr::new(stripped_file_name)); } } Ok(None) } } #[test] fn internal_suffixes() { let ignored_suffixes = IgnoredSuffixes::default(); let file_names = ignored_suffixes .values .iter() .map(|suffix| format!("test.json{suffix}")); for file_name_str in file_names { let file_name = OsStr::new(&file_name_str); let expected_stripped_file_name = OsStr::new("test.json"); let stripped_file_name = ignored_suffixes .try_with_stripped_suffix(file_name, |stripped_file_name| Ok(Some(stripped_file_name))); assert_eq!( expected_stripped_file_name, stripped_file_name.unwrap().unwrap() ); } } #[test] fn external_suffixes() { let mut ignored_suffixes = IgnoredSuffixes::default(); ignored_suffixes.add_suffix(".development"); ignored_suffixes.add_suffix(".production"); let file_names = ignored_suffixes .values .iter() .map(|suffix| format!("test.json{suffix}")); for file_name_str in file_names { let file_name = OsStr::new(&file_name_str); let expected_stripped_file_name = OsStr::new("test.json"); let stripped_file_name = ignored_suffixes .try_with_stripped_suffix(file_name, |stripped_file_name| Ok(Some(stripped_file_name))); assert_eq!( expected_stripped_file_name, stripped_file_name.unwrap().unwrap() ); } } bat-0.25.0/src/syntax_mapping.rs000064400000000000000000000213521046102023000146570ustar 00000000000000use std::{ path::Path, sync::{ atomic::{AtomicBool, Ordering}, Arc, }, thread, }; use globset::{Candidate, GlobBuilder, GlobMatcher}; use once_cell::sync::Lazy; use crate::error::Result; use builtin::BUILTIN_MAPPINGS; use ignored_suffixes::IgnoredSuffixes; mod builtin; pub mod ignored_suffixes; fn make_glob_matcher(from: &str) -> Result { let matcher = GlobBuilder::new(from) .case_insensitive(true) .literal_separator(true) .build()? .compile_matcher(); Ok(matcher) } #[derive(Debug, Clone, Copy, PartialEq, Eq)] #[non_exhaustive] pub enum MappingTarget<'a> { /// For mapping a path to a specific syntax. MapTo(&'a str), /// For mapping a path (typically an extension-less file name) to an unknown /// syntax. This typically means later using the contents of the first line /// of the file to determine what syntax to use. MapToUnknown, /// For mapping a file extension (e.g. `*.conf`) to an unknown syntax. This /// typically means later using the contents of the first line of the file /// to determine what syntax to use. However, if a syntax handles a file /// name that happens to have the given file extension (e.g. `resolv.conf`), /// then that association will have higher precedence, and the mapping will /// be ignored. MapExtensionToUnknown, } #[derive(Debug, Clone, Default)] pub struct SyntaxMapping<'a> { /// User-defined mappings at run time. /// /// Rules in front have precedence. custom_mappings: Vec<(GlobMatcher, MappingTarget<'a>)>, pub(crate) ignored_suffixes: IgnoredSuffixes<'a>, /// A flag to halt glob matcher building, which is offloaded to another thread. /// /// We have this so that we can signal the thread to halt early when appropriate. halt_glob_build: Arc, } impl<'a> Drop for SyntaxMapping<'a> { fn drop(&mut self) { // signal the offload thread to halt early self.halt_glob_build.store(true, Ordering::Relaxed); } } impl<'a> SyntaxMapping<'a> { pub fn new() -> SyntaxMapping<'a> { Default::default() } /// Start a thread to build the glob matchers for all builtin mappings. /// /// The use of this function while not necessary, is useful to speed up startup /// times by starting this work early in parallel. /// /// The thread halts if/when `halt_glob_build` is set to true. pub fn start_offload_build_all(&self) { let halt = Arc::clone(&self.halt_glob_build); thread::spawn(move || { for (matcher, _) in BUILTIN_MAPPINGS.iter() { if halt.load(Ordering::Relaxed) { break; } Lazy::force(matcher); } }); // Note that this thread is not joined upon completion because there's // no shared resources that need synchronization to be safely dropped. // If we later add code into this thread that requires interesting // resources (e.g. IO), it would be a good idea to store the handle // and join it on drop. } pub fn insert(&mut self, from: &str, to: MappingTarget<'a>) -> Result<()> { let matcher = make_glob_matcher(from)?; self.custom_mappings.push((matcher, to)); Ok(()) } /// Returns an iterator over all mappings. User-defined mappings are listed /// before builtin mappings; mappings in front have higher precedence. /// /// Builtin mappings' `GlobMatcher`s are lazily compiled. /// /// Note that this function only returns mappings that are valid under the /// current environment. For details see [`Self::builtin_mappings`]. pub fn all_mappings(&self) -> impl Iterator)> { self.custom_mappings() .iter() .map(|(matcher, target)| (matcher, target)) // as_ref .chain( // we need a map with a closure to "do" the lifetime variance // see: https://discord.com/channels/273534239310479360/1120124565591425034/1170543402870382653 // also, clippy false positive: // see: https://github.com/rust-lang/rust-clippy/issues/9280 #[allow(clippy::map_identity)] self.builtin_mappings().map(|rule| rule), ) } /// Returns an iterator over all valid builtin mappings. Mappings in front /// have higher precedence. /// /// The `GlabMatcher`s are lazily compiled. /// /// Mappings that are invalid under the current environment (i.e. rule /// requires environment variable(s) that is unset, or the joined string /// after variable(s) replacement is not a valid glob expression) are /// ignored. pub fn builtin_mappings( &self, ) -> impl Iterator)> { BUILTIN_MAPPINGS .iter() .filter_map(|(matcher, target)| matcher.as_ref().map(|glob| (glob, target))) } /// Returns all user-defined mappings. pub fn custom_mappings(&self) -> &[(GlobMatcher, MappingTarget<'a>)] { &self.custom_mappings } pub fn get_syntax_for(&self, path: impl AsRef) -> Option> { // Try matching on the file name as-is. let candidate = Candidate::new(&path); let candidate_filename = path.as_ref().file_name().map(Candidate::new); for (glob, syntax) in self.all_mappings() { if glob.is_match_candidate(&candidate) || candidate_filename .as_ref() .map_or(false, |filename| glob.is_match_candidate(filename)) { return Some(*syntax); } } // Try matching on the file name after removing an ignored suffix. let file_name = path.as_ref().file_name()?; self.ignored_suffixes .try_with_stripped_suffix(file_name, |stripped_file_name| { Ok(self.get_syntax_for(stripped_file_name)) }) .ok()? } pub fn insert_ignored_suffix(&mut self, suffix: &'a str) { self.ignored_suffixes.add_suffix(suffix); } } #[cfg(test)] mod tests { use super::*; #[test] fn builtin_mappings_work() { let map = SyntaxMapping::new(); assert_eq!( map.get_syntax_for("/path/to/build"), Some(MappingTarget::MapToUnknown) ); } #[test] fn all_fixed_builtin_mappings_can_compile() { let map = SyntaxMapping::new(); // collect call evaluates all lazy closures // fixed builtin mappings will panic if they fail to compile let _mappings = map.builtin_mappings().collect::>(); } #[test] fn builtin_mappings_matcher_only_compile_once() { let map = SyntaxMapping::new(); let two_iterations: Vec<_> = (0..2) .map(|_| { // addresses of every matcher map.builtin_mappings() .map(|(matcher, _)| matcher as *const _ as usize) .collect::>() }) .collect(); // if the matchers are only compiled once, their address should remain the same assert_eq!(two_iterations[0], two_iterations[1]); } #[test] fn custom_mappings_work() { let mut map = SyntaxMapping::new(); map.insert("/path/to/Cargo.lock", MappingTarget::MapTo("TOML")) .ok(); map.insert("/path/to/.ignore", MappingTarget::MapTo("Git Ignore")) .ok(); assert_eq!( map.get_syntax_for("/path/to/Cargo.lock"), Some(MappingTarget::MapTo("TOML")) ); assert_eq!(map.get_syntax_for("/path/to/other.lock"), None); assert_eq!( map.get_syntax_for("/path/to/.ignore"), Some(MappingTarget::MapTo("Git Ignore")) ); } #[test] fn custom_mappings_override_builtin() { let mut map = SyntaxMapping::new(); assert_eq!( map.get_syntax_for("/path/to/httpd.conf"), Some(MappingTarget::MapTo("Apache Conf")) ); map.insert("httpd.conf", MappingTarget::MapTo("My Syntax")) .ok(); assert_eq!( map.get_syntax_for("/path/to/httpd.conf"), Some(MappingTarget::MapTo("My Syntax")) ); } #[test] fn custom_mappings_precedence() { let mut map = SyntaxMapping::new(); map.insert("/path/to/foo", MappingTarget::MapTo("alpha")) .ok(); map.insert("/path/to/foo", MappingTarget::MapTo("bravo")) .ok(); assert_eq!( map.get_syntax_for("/path/to/foo"), Some(MappingTarget::MapTo("alpha")) ); } } bat-0.25.0/src/terminal.rs000064400000000000000000000060011046102023000134230ustar 00000000000000use nu_ansi_term::Color::{self, Fixed, Rgb}; use nu_ansi_term::{self, Style}; use syntect::highlighting::{self, FontStyle}; pub fn to_ansi_color(color: highlighting::Color, true_color: bool) -> Option { if color.a == 0 { // Themes can specify one of the user-configurable terminal colors by // encoding them as #RRGGBBAA with AA set to 00 (transparent) and RR set // to the 8-bit color palette number. The built-in themes ansi, base16, // and base16-256 use this. Some(match color.r { // For the first 8 colors, use the Color enum to produce ANSI escape // sequences using codes 30-37 (foreground) and 40-47 (background). // For example, red foreground is \x1b[31m. This works on terminals // without 256-color support. 0x00 => Color::Black, 0x01 => Color::Red, 0x02 => Color::Green, 0x03 => Color::Yellow, 0x04 => Color::Blue, 0x05 => Color::Purple, 0x06 => Color::Cyan, 0x07 => Color::White, // For all other colors, use Fixed to produce escape sequences using // codes 38;5 (foreground) and 48;5 (background). For example, // bright red foreground is \x1b[38;5;9m. This only works on // terminals with 256-color support. // // TODO: When ansi_term adds support for bright variants using codes // 90-97 (foreground) and 100-107 (background), we should use those // for values 0x08 to 0x0f and only use Fixed for 0x10 to 0xff. n => Fixed(n), }) } else if color.a == 1 { // Themes can specify the terminal's default foreground/background color // (i.e. no escape sequence) using the encoding #RRGGBBAA with AA set to // 01. The built-in theme ansi uses this. None } else if true_color { Some(Rgb(color.r, color.g, color.b)) } else { Some(Fixed(ansi_colours::ansi256_from_rgb(( color.r, color.g, color.b, )))) } } pub fn as_terminal_escaped( style: highlighting::Style, text: &str, true_color: bool, colored: bool, italics: bool, background_color: Option, ) -> String { if text.is_empty() { return text.to_string(); } let mut style = if !colored { Style::default() } else { let mut color = Style { foreground: to_ansi_color(style.foreground, true_color), ..Style::default() }; if style.font_style.contains(FontStyle::BOLD) { color = color.bold(); } if style.font_style.contains(FontStyle::UNDERLINE) { color = color.underline(); } if italics && style.font_style.contains(FontStyle::ITALIC) { color = color.italic(); } color }; style.background = background_color.and_then(|c| to_ansi_color(c, true_color)); style.paint(text).to_string() } bat-0.25.0/src/theme.rs000064400000000000000000000461431046102023000127250ustar 00000000000000//! Utilities for choosing an appropriate theme for syntax highlighting. use std::convert::Infallible; use std::fmt; use std::io::IsTerminal as _; use std::str::FromStr; /// Environment variable names. pub mod env { /// See [`crate::theme::ThemeOptions::theme`]. pub const BAT_THEME: &str = "BAT_THEME"; /// See [`crate::theme::ThemeOptions::theme_dark`]. pub const BAT_THEME_DARK: &str = "BAT_THEME"; /// See [`crate::theme::ThemeOptions::theme_light`]. pub const BAT_THEME_LIGHT: &str = "BAT_THEME"; } /// Chooses an appropriate theme or falls back to a default theme /// based on the user-provided options and the color scheme of the terminal. /// /// Intentionally returns a [`ThemeResult`] instead of a simple string so /// that downstream consumers such as `delta` can easily apply their own /// default theme and can use the detected color scheme elsewhere. pub fn theme(options: ThemeOptions) -> ThemeResult { theme_impl(options, &TerminalColorSchemeDetector) } /// The default theme, suitable for the given color scheme. /// Use [`theme`] if you want to automatically detect the color scheme from the terminal. pub const fn default_theme(color_scheme: ColorScheme) -> &'static str { match color_scheme { ColorScheme::Dark => "Monokai Extended", ColorScheme::Light => "Monokai Extended Light", } } /// Detects the color scheme from the terminal. pub fn color_scheme(when: DetectColorScheme) -> Option { color_scheme_impl(when, &TerminalColorSchemeDetector) } /// Options for configuring the theme used for syntax highlighting. /// Used together with [`theme`]. #[derive(Debug, Clone, Default, PartialEq, Eq)] pub struct ThemeOptions { /// Configures how the theme is chosen. If set to a [`ThemePreference::Fixed`] value, /// then the given theme is used regardless of the terminal's background color. /// This corresponds with the `BAT_THEME` environment variable and the `--theme` option. pub theme: ThemePreference, /// The theme to use in case the terminal uses a dark background with light text. /// This corresponds with the `BAT_THEME_DARK` environment variable and the `--theme-dark` option. pub theme_dark: Option, /// The theme to use in case the terminal uses a light background with dark text. /// This corresponds with the `BAT_THEME_LIGHT` environment variable and the `--theme-light` option. pub theme_light: Option, } /// What theme should `bat` use? /// /// The easiest way to construct this is from a string: /// ``` /// # use bat::theme::{ThemePreference, DetectColorScheme}; /// let preference = ThemePreference::new("auto:system"); /// assert_eq!(ThemePreference::Auto(DetectColorScheme::System), preference); /// ``` #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub enum ThemePreference { /// Choose between [`ThemeOptions::theme_dark`] and [`ThemeOptions::theme_light`] /// based on the terminal's color scheme. Auto(DetectColorScheme), /// Always use the same theme regardless of the terminal's color scheme. Fixed(ThemeName), /// Use a dark theme. Dark, /// Use a light theme. Light, } impl Default for ThemePreference { fn default() -> Self { ThemePreference::Auto(Default::default()) } } impl ThemePreference { /// Creates a theme preference from a string. pub fn new(s: impl Into) -> Self { use ThemePreference::*; let s = s.into(); match s.as_str() { "auto" => Auto(Default::default()), "auto:always" => Auto(DetectColorScheme::Always), "auto:system" => Auto(DetectColorScheme::System), "dark" => Dark, "light" => Light, _ => Fixed(ThemeName::new(s)), } } } impl FromStr for ThemePreference { type Err = Infallible; fn from_str(s: &str) -> Result { Ok(ThemePreference::new(s)) } } impl fmt::Display for ThemePreference { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { use ThemePreference::*; match self { Auto(DetectColorScheme::Auto) => f.write_str("auto"), Auto(DetectColorScheme::Always) => f.write_str("auto:always"), Auto(DetectColorScheme::System) => f.write_str("auto:system"), Fixed(theme) => theme.fmt(f), Dark => f.write_str("dark"), Light => f.write_str("light"), } } } /// The name of a theme or the default theme. /// /// ``` /// # use bat::theme::ThemeName; /// assert_eq!(ThemeName::Default, ThemeName::new("default")); /// assert_eq!(ThemeName::Named("example".to_string()), ThemeName::new("example")); /// ``` #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub enum ThemeName { Named(String), Default, } impl ThemeName { /// Creates a theme name from a string. pub fn new(s: impl Into) -> Self { let s = s.into(); if s == "default" { ThemeName::Default } else { ThemeName::Named(s) } } } impl FromStr for ThemeName { type Err = Infallible; fn from_str(s: &str) -> Result { Ok(ThemeName::new(s)) } } impl fmt::Display for ThemeName { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { ThemeName::Named(t) => f.write_str(t), ThemeName::Default => f.write_str("default"), } } } #[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash)] pub enum DetectColorScheme { /// Only query the terminal for its colors when appropriate (i.e. when the output is not redirected). #[default] Auto, /// Always query the terminal for its colors. Always, /// Detect the system-wide dark/light preference (macOS only). System, } /// The color scheme used to pick a fitting theme. Defaults to [`ColorScheme::Dark`]. #[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash)] pub enum ColorScheme { #[default] Dark, Light, } /// The resolved theme and the color scheme as determined from /// the terminal, OS or fallback. #[derive(Debug, Clone, PartialEq, Eq)] pub struct ThemeResult { /// The theme selected according to the [`ThemeOptions`]. pub theme: ThemeName, /// Either the user's chosen color scheme, the terminal's color scheme, the OS's /// color scheme or `None` if the color scheme was not detected because the user chose a fixed theme. pub color_scheme: Option, } impl fmt::Display for ThemeResult { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match &self.theme { ThemeName::Named(name) => f.write_str(name), ThemeName::Default => f.write_str(default_theme(self.color_scheme.unwrap_or_default())), } } } fn theme_impl(options: ThemeOptions, detector: &dyn ColorSchemeDetector) -> ThemeResult { // Implementation note: This function is mostly pure (i.e. it has no side effects) for the sake of testing. // All the side effects (e.g. querying the terminal for its colors) are performed in the detector. match options.theme { ThemePreference::Fixed(theme) => ThemeResult { theme, color_scheme: None, }, ThemePreference::Dark => choose_theme_opt(Some(ColorScheme::Dark), options), ThemePreference::Light => choose_theme_opt(Some(ColorScheme::Light), options), ThemePreference::Auto(when) => choose_theme_opt(color_scheme_impl(when, detector), options), } } fn choose_theme_opt(color_scheme: Option, options: ThemeOptions) -> ThemeResult { ThemeResult { color_scheme, theme: color_scheme .and_then(|c| choose_theme(options, c)) .unwrap_or(ThemeName::Default), } } fn choose_theme(options: ThemeOptions, color_scheme: ColorScheme) -> Option { match color_scheme { ColorScheme::Dark => options.theme_dark, ColorScheme::Light => options.theme_light, } } fn color_scheme_impl( when: DetectColorScheme, detector: &dyn ColorSchemeDetector, ) -> Option { let should_detect = match when { DetectColorScheme::Auto => detector.should_detect(), DetectColorScheme::Always => true, DetectColorScheme::System => return color_scheme_from_system(), }; should_detect.then(|| detector.detect()).flatten() } trait ColorSchemeDetector { fn should_detect(&self) -> bool; fn detect(&self) -> Option; } struct TerminalColorSchemeDetector; impl ColorSchemeDetector for TerminalColorSchemeDetector { fn should_detect(&self) -> bool { // Querying the terminal for its colors via OSC 10 / OSC 11 requires "exclusive" access // since we read/write from the terminal and enable/disable raw mode. // This causes race conditions with pagers such as less when they are attached to the // same terminal as us. // // This is usually only an issue when the output is manually piped to a pager. // For example: `bat Cargo.toml | less`. // Otherwise, if we start the pager ourselves, then there's no race condition // since the pager is started *after* the color is detected. std::io::stdout().is_terminal() } fn detect(&self) -> Option { use terminal_colorsaurus::{color_scheme, ColorScheme as ColorsaurusScheme, QueryOptions}; match color_scheme(QueryOptions::default()).ok()? { ColorsaurusScheme::Dark => Some(ColorScheme::Dark), ColorsaurusScheme::Light => Some(ColorScheme::Light), } } } #[cfg(not(target_os = "macos"))] fn color_scheme_from_system() -> Option { crate::bat_warning!( "Theme 'auto:system' is only supported on macOS, \ using default." ); None } #[cfg(target_os = "macos")] fn color_scheme_from_system() -> Option { const PREFERENCES_FILE: &str = "Library/Preferences/.GlobalPreferences.plist"; const STYLE_KEY: &str = "AppleInterfaceStyle"; let preferences_file = home::home_dir() .map(|home| home.join(PREFERENCES_FILE)) .expect("Could not get home directory"); match plist::Value::from_file(preferences_file).map(|file| file.into_dictionary()) { Ok(Some(preferences)) => match preferences.get(STYLE_KEY).and_then(|val| val.as_string()) { Some("Dark") => Some(ColorScheme::Dark), // If the key does not exist, then light theme is currently in use. Some(_) | None => Some(ColorScheme::Light), }, // Unreachable, in theory. All macOS users have a home directory and preferences file setup. Ok(None) | Err(_) => None, } } #[cfg(test)] impl ColorSchemeDetector for Option { fn should_detect(&self) -> bool { true } fn detect(&self) -> Option { *self } } #[cfg(test)] mod tests { use super::ColorScheme::*; use super::*; use std::cell::Cell; use std::iter; mod color_scheme_detection { use super::*; #[test] fn not_called_for_dark_or_light() { for theme in [ThemePreference::Dark, ThemePreference::Light] { let detector = DetectorStub::should_detect(Some(Dark)); let options = ThemeOptions { theme, ..Default::default() }; _ = theme_impl(options, &detector); assert!(!detector.was_called.get()); } } #[test] fn called_for_always() { let detectors = [ DetectorStub::should_detect(Some(Dark)), DetectorStub::should_not_detect(), ]; for detector in detectors { let options = ThemeOptions { theme: ThemePreference::Auto(DetectColorScheme::Always), ..Default::default() }; _ = theme_impl(options, &detector); assert!(detector.was_called.get()); } } #[test] fn called_for_auto_if_should_detect() { let detector = DetectorStub::should_detect(Some(Dark)); _ = theme_impl(ThemeOptions::default(), &detector); assert!(detector.was_called.get()); } #[test] fn not_called_for_auto_if_not_should_detect() { let detector = DetectorStub::should_not_detect(); _ = theme_impl(ThemeOptions::default(), &detector); assert!(!detector.was_called.get()); } } mod precedence { use super::*; #[test] fn theme_is_preferred_over_light_or_dark_themes() { for color_scheme in optional(color_schemes()) { for options in [ ThemeOptions { theme: ThemePreference::Fixed(ThemeName::Named("Theme".to_string())), ..Default::default() }, ThemeOptions { theme: ThemePreference::Fixed(ThemeName::Named("Theme".to_string())), theme_dark: Some(ThemeName::Named("Dark Theme".to_string())), theme_light: Some(ThemeName::Named("Light Theme".to_string())), ..Default::default() }, ] { let detector = ConstantDetector(color_scheme); assert_eq!("Theme", theme_impl(options, &detector).to_string()); } } } #[test] fn detector_is_not_called_if_theme_is_present() { let options = ThemeOptions { theme: ThemePreference::Fixed(ThemeName::Named("Theme".to_string())), ..Default::default() }; let detector = DetectorStub::should_detect(Some(Dark)); _ = theme_impl(options, &detector); assert!(!detector.was_called.get()); } } mod default_theme { use super::*; #[test] fn default_dark_if_unable_to_detect_color_scheme() { let detector = ConstantDetector(None); assert_eq!( default_theme(ColorScheme::Dark), theme_impl(ThemeOptions::default(), &detector).to_string() ); } // For backwards compatibility, if the default theme is requested // explicitly through BAT_THEME, we always pick the default dark theme. #[test] fn default_dark_if_requested_explicitly_through_theme() { for color_scheme in optional(color_schemes()) { let options = ThemeOptions { theme: ThemePreference::Fixed(ThemeName::Default), ..Default::default() }; let detector = ConstantDetector(color_scheme); assert_eq!( default_theme(ColorScheme::Dark), theme_impl(options, &detector).to_string() ); } } #[test] fn varies_depending_on_color_scheme() { for color_scheme in color_schemes() { for options in [ ThemeOptions::default(), ThemeOptions { theme_dark: Some(ThemeName::Default), theme_light: Some(ThemeName::Default), ..Default::default() }, ] { let detector = ConstantDetector(Some(color_scheme)); assert_eq!( default_theme(color_scheme), theme_impl(options, &detector).to_string() ); } } } } mod choosing { use super::*; #[test] fn chooses_default_theme_if_unknown() { let options = ThemeOptions { theme_dark: Some(ThemeName::Named("Dark".to_string())), theme_light: Some(ThemeName::Named("Light".to_string())), ..Default::default() }; let detector = ConstantDetector(None); assert_eq!( default_theme(ColorScheme::default()), theme_impl(options, &detector).to_string() ); } #[test] fn chooses_dark_theme_if_dark_or_unknown() { let options = ThemeOptions { theme_dark: Some(ThemeName::Named("Dark".to_string())), theme_light: Some(ThemeName::Named("Light".to_string())), ..Default::default() }; let detector = ConstantDetector(Some(ColorScheme::Dark)); assert_eq!("Dark", theme_impl(options, &detector).to_string()); } #[test] fn chooses_light_theme_if_light() { let options = ThemeOptions { theme_dark: Some(ThemeName::Named("Dark".to_string())), theme_light: Some(ThemeName::Named("Light".to_string())), ..Default::default() }; let detector = ConstantDetector(Some(ColorScheme::Light)); assert_eq!("Light", theme_impl(options, &detector).to_string()); } } mod theme_preference { use super::*; #[test] fn values_roundtrip_via_display() { let prefs = [ ThemePreference::Auto(DetectColorScheme::Auto), ThemePreference::Auto(DetectColorScheme::Always), ThemePreference::Auto(DetectColorScheme::System), ThemePreference::Fixed(ThemeName::Default), ThemePreference::Fixed(ThemeName::new("foo")), ThemePreference::Dark, ThemePreference::Light, ]; for pref in prefs { assert_eq!(pref, ThemePreference::new(&pref.to_string())); } } } struct DetectorStub { should_detect: bool, color_scheme: Option, was_called: Cell, } impl DetectorStub { fn should_detect(color_scheme: Option) -> Self { DetectorStub { should_detect: true, color_scheme, was_called: Cell::default(), } } fn should_not_detect() -> Self { DetectorStub { should_detect: false, color_scheme: None, was_called: Cell::default(), } } } impl ColorSchemeDetector for DetectorStub { fn should_detect(&self) -> bool { self.should_detect } fn detect(&self) -> Option { self.was_called.set(true); self.color_scheme } } struct ConstantDetector(Option); impl ColorSchemeDetector for ConstantDetector { fn should_detect(&self) -> bool { true } fn detect(&self) -> Option { self.0 } } fn optional(value: impl Iterator) -> impl Iterator> { value.map(Some).chain(iter::once(None)) } fn color_schemes() -> impl Iterator { [Dark, Light].into_iter() } } bat-0.25.0/src/vscreen.rs000064400000000000000000000704571046102023000132750ustar 00000000000000use std::{ fmt::{Display, Formatter}, iter::Peekable, str::CharIndices, }; // Wrapper to avoid unnecessary branching when input doesn't have ANSI escape sequences. pub struct AnsiStyle { attributes: Option, } impl AnsiStyle { pub fn new() -> Self { AnsiStyle { attributes: None } } pub fn update(&mut self, sequence: EscapeSequence) -> bool { match &mut self.attributes { Some(a) => a.update(sequence), None => { self.attributes = Some(Attributes::new()); self.attributes.as_mut().unwrap().update(sequence) } } } pub fn to_reset_sequence(&self) -> String { match self.attributes { Some(ref a) => a.to_reset_sequence(), None => String::new(), } } } impl Display for AnsiStyle { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { match self.attributes { Some(ref a) => a.fmt(f), None => Ok(()), } } } struct Attributes { has_sgr_sequences: bool, foreground: String, background: String, underlined: String, /// The character set to use. /// REGEX: `\^[()][AB0-3]` charset: String, /// A buffer for unknown sequences. unknown_buffer: String, /// ON: ^[1m /// OFF: ^[22m bold: String, /// ON: ^[2m /// OFF: ^[22m dim: String, /// ON: ^[4m /// OFF: ^[24m underline: String, /// ON: ^[3m /// OFF: ^[23m italic: String, /// ON: ^[9m /// OFF: ^[29m strike: String, /// The hyperlink sequence. /// FORMAT: \x1B]8;{ID};{URL}\e\\ /// /// `\e\\` may be replaced with BEL `\x07`. /// Setting both {ID} and {URL} to an empty string represents no hyperlink. hyperlink: String, } impl Attributes { pub fn new() -> Self { Attributes { has_sgr_sequences: false, foreground: "".to_owned(), background: "".to_owned(), underlined: "".to_owned(), charset: "".to_owned(), unknown_buffer: "".to_owned(), bold: "".to_owned(), dim: "".to_owned(), underline: "".to_owned(), italic: "".to_owned(), strike: "".to_owned(), hyperlink: "".to_owned(), } } /// Update the attributes with an escape sequence. /// Returns `false` if the sequence is unsupported. pub fn update(&mut self, sequence: EscapeSequence) -> bool { use EscapeSequence::*; match sequence { Text(_) => return false, Unknown(_) => { /* defer to update_with_unsupported */ } OSC { raw_sequence, command, .. } => { if command.starts_with("8;") { return self.update_with_hyperlink(raw_sequence); } /* defer to update_with_unsupported */ } CSI { final_byte, parameters, .. } => { match final_byte { "m" => return self.update_with_sgr(parameters), _ => { // NOTE(eth-p): We might want to ignore these, since they involve cursor or buffer manipulation. /* defer to update_with_unsupported */ } } } NF { nf_sequence, .. } => { let mut iter = nf_sequence.chars(); match iter.next() { Some('(') => return self.update_with_charset('(', iter), Some(')') => return self.update_with_charset(')', iter), _ => { /* defer to update_with_unsupported */ } } } } self.update_with_unsupported(sequence.raw()) } fn sgr_reset(&mut self) { self.has_sgr_sequences = false; self.foreground.clear(); self.background.clear(); self.underlined.clear(); self.bold.clear(); self.dim.clear(); self.underline.clear(); self.italic.clear(); self.strike.clear(); } fn update_with_sgr(&mut self, parameters: &str) -> bool { let mut iter = parameters .split(';') .map(|p| if p.is_empty() { "0" } else { p }) .map(|p| p.parse::()) .map(|p| p.unwrap_or(0)); // Treat errors as 0. self.has_sgr_sequences = true; while let Some(p) = iter.next() { match p { 0 => self.sgr_reset(), 1 => self.bold = "\x1B[1m".to_owned(), 2 => self.dim = "\x1B[2m".to_owned(), 3 => self.italic = "\x1B[3m".to_owned(), 4 => self.underline = "\x1B[4m".to_owned(), 23 => self.italic.clear(), 24 => self.underline.clear(), 22 => { self.bold.clear(); self.dim.clear(); } 30..=39 => self.foreground = Self::parse_color(p, &mut iter), 40..=49 => self.background = Self::parse_color(p, &mut iter), 58..=59 => self.underlined = Self::parse_color(p, &mut iter), 90..=97 => self.foreground = Self::parse_color(p, &mut iter), 100..=107 => self.background = Self::parse_color(p, &mut iter), _ => { // Unsupported SGR sequence. // Be compatible and pretend one just wasn't was provided. } } } true } fn update_with_unsupported(&mut self, sequence: &str) -> bool { self.unknown_buffer.push_str(sequence); false } fn update_with_hyperlink(&mut self, sequence: &str) -> bool { if sequence == "8;;" { // Empty hyperlink ID and HREF -> end of hyperlink. self.hyperlink.clear(); } else { self.hyperlink.clear(); self.hyperlink.push_str(sequence); } true } fn update_with_charset(&mut self, kind: char, set: impl Iterator) -> bool { self.charset = format!("\x1B{}{}", kind, set.take(1).collect::()); true } fn parse_color(color: u16, parameters: &mut dyn Iterator) -> String { match color % 10 { 8 => match parameters.next() { Some(5) /* 256-color */ => format!("\x1B[{};5;{}m", color, join(";", 1, parameters)), Some(2) /* 24-bit color */ => format!("\x1B[{};2;{}m", color, join(";", 3, parameters)), Some(c) => format!("\x1B[{color};{c}m"), _ => "".to_owned(), }, 9 => "".to_owned(), _ => format!("\x1B[{color}m"), } } /// Gets an ANSI escape sequence to reset all the known attributes. pub fn to_reset_sequence(&self) -> String { let mut buf = String::with_capacity(17); // TODO: Enable me in a later pull request. // if self.has_sgr_sequences { // buf.push_str("\x1B[m"); // } if !self.hyperlink.is_empty() { buf.push_str("\x1B]8;;\x1B\\"); // Disable hyperlink. } // TODO: Enable me in a later pull request. // if !self.charset.is_empty() { // // https://espterm.github.io/docs/VT100%20escape%20codes.html // buf.push_str("\x1B(B\x1B)B"); // setusg0 and setusg1 // } buf } } impl Display for Attributes { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { write!( f, "{}{}{}{}{}{}{}{}{}{}", self.foreground, self.background, self.underlined, self.charset, self.bold, self.dim, self.underline, self.italic, self.strike, self.hyperlink, ) } } fn join( delimiter: &str, limit: usize, iterator: &mut dyn Iterator, ) -> String { iterator .take(limit) .map(|i| i.to_string()) .collect::>() .join(delimiter) } /// A range of indices for a raw ANSI escape sequence. #[derive(Debug, PartialEq)] pub enum EscapeSequenceOffsets { Text { start: usize, end: usize, }, Unknown { start: usize, end: usize, }, #[allow(clippy::upper_case_acronyms)] NF { // https://en.wikipedia.org/wiki/ANSI_escape_code#nF_Escape_sequences start_sequence: usize, start: usize, end: usize, }, #[allow(clippy::upper_case_acronyms)] OSC { // https://en.wikipedia.org/wiki/ANSI_escape_code#OSC_(Operating_System_Command)_sequences start_sequence: usize, start_command: usize, start_terminator: usize, end: usize, }, #[allow(clippy::upper_case_acronyms)] CSI { // https://en.wikipedia.org/wiki/ANSI_escape_code#CSI_(Control_Sequence_Introducer)_sequences start_sequence: usize, start_parameters: usize, start_intermediates: usize, start_final_byte: usize, end: usize, }, } impl EscapeSequenceOffsets { /// Returns the byte-index of the first character in the escape sequence. pub fn index_of_start(&self) -> usize { use EscapeSequenceOffsets::*; match self { Text { start, .. } => *start, Unknown { start, .. } => *start, NF { start_sequence, .. } => *start_sequence, OSC { start_sequence, .. } => *start_sequence, CSI { start_sequence, .. } => *start_sequence, } } /// Returns the byte-index past the last character in the escape sequence. pub fn index_past_end(&self) -> usize { use EscapeSequenceOffsets::*; match self { Text { end, .. } => *end, Unknown { end, .. } => *end, NF { end, .. } => *end, OSC { end, .. } => *end, CSI { end, .. } => *end, } } } /// An iterator over the offests of ANSI/VT escape sequences within a string. /// /// ## Example /// /// ```ignore /// let iter = EscapeSequenceOffsetsIterator::new("\x1B[33mThis is yellow text.\x1B[m"); /// ``` pub struct EscapeSequenceOffsetsIterator<'a> { text: &'a str, chars: Peekable>, } impl<'a> EscapeSequenceOffsetsIterator<'a> { pub fn new(text: &'a str) -> EscapeSequenceOffsetsIterator<'a> { return EscapeSequenceOffsetsIterator { text, chars: text.char_indices().peekable(), }; } /// Takes values from the iterator while the predicate returns true. /// If the predicate returns false, that value is left. fn chars_take_while(&mut self, pred: impl Fn(char) -> bool) -> Option<(usize, usize)> { self.chars.peek()?; let start = self.chars.peek().unwrap().0; let mut end: usize = start; while let Some((i, c)) = self.chars.peek() { if !pred(*c) { break; } end = *i + c.len_utf8(); self.chars.next(); } Some((start, end)) } fn next_text(&mut self) -> Option { self.chars_take_while(|c| c != '\x1B') .map(|(start, end)| EscapeSequenceOffsets::Text { start, end }) } fn next_sequence(&mut self) -> Option { let (start_sequence, c) = self.chars.next().expect("to not be finished"); match self.chars.peek() { None => Some(EscapeSequenceOffsets::Unknown { start: start_sequence, end: start_sequence + c.len_utf8(), }), Some((_, ']')) => self.next_osc(start_sequence), Some((_, '[')) => self.next_csi(start_sequence), Some((i, c)) => match c { '\x20'..='\x2F' => self.next_nf(start_sequence), c => Some(EscapeSequenceOffsets::Unknown { start: start_sequence, end: i + c.len_utf8(), }), }, } } fn next_osc(&mut self, start_sequence: usize) -> Option { let (osc_open_index, osc_open_char) = self.chars.next().expect("to not be finished"); debug_assert_eq!(osc_open_char, ']'); let mut start_terminator: usize; let mut end_sequence: usize; loop { match self.chars_take_while(|c| !matches!(c, '\x07' | '\x1B')) { None => { start_terminator = self.text.len(); end_sequence = start_terminator; break; } Some((_, end)) => { start_terminator = end; end_sequence = end; } } match self.chars.next() { Some((ti, '\x07')) => { end_sequence = ti + '\x07'.len_utf8(); break; } Some((ti, '\x1B')) => { match self.chars.next() { Some((i, '\\')) => { end_sequence = i + '\\'.len_utf8(); break; } None => { end_sequence = ti + '\x1B'.len_utf8(); break; } _ => { // Repeat, since `\\`(anything) isn't a valid ST. } } } None => { // Prematurely ends. break; } Some((_, tc)) => { panic!("this should not be reached: char {tc:?}") } } } Some(EscapeSequenceOffsets::OSC { start_sequence, start_command: osc_open_index + osc_open_char.len_utf8(), start_terminator, end: end_sequence, }) } fn next_csi(&mut self, start_sequence: usize) -> Option { let (csi_open_index, csi_open_char) = self.chars.next().expect("to not be finished"); debug_assert_eq!(csi_open_char, '['); let start_parameters: usize = csi_open_index + csi_open_char.len_utf8(); // Keep iterating while within the range of `0x30-0x3F`. let mut start_intermediates: usize = start_parameters; if let Some((_, end)) = self.chars_take_while(|c| matches!(c, '\x30'..='\x3F')) { start_intermediates = end; } // Keep iterating while within the range of `0x20-0x2F`. let mut start_final_byte: usize = start_intermediates; if let Some((_, end)) = self.chars_take_while(|c| matches!(c, '\x20'..='\x2F')) { start_final_byte = end; } // Take the last char. let end_of_sequence = match self.chars.next() { None => start_final_byte, Some((i, c)) => i + c.len_utf8(), }; Some(EscapeSequenceOffsets::CSI { start_sequence, start_parameters, start_intermediates, start_final_byte, end: end_of_sequence, }) } fn next_nf(&mut self, start_sequence: usize) -> Option { let (nf_open_index, nf_open_char) = self.chars.next().expect("to not be finished"); debug_assert!(matches!(nf_open_char, '\x20'..='\x2F')); let start: usize = nf_open_index; let mut end: usize = start; // Keep iterating while within the range of `0x20-0x2F`. match self.chars_take_while(|c| matches!(c, '\x20'..='\x2F')) { Some((_, i)) => end = i, None => { return Some(EscapeSequenceOffsets::NF { start_sequence, start, end, }) } } // Get the final byte. if let Some((i, c)) = self.chars.next() { end = i + c.len_utf8() } Some(EscapeSequenceOffsets::NF { start_sequence, start, end, }) } } impl<'a> Iterator for EscapeSequenceOffsetsIterator<'a> { type Item = EscapeSequenceOffsets; fn next(&mut self) -> Option { match self.chars.peek() { Some((_, '\x1B')) => self.next_sequence(), Some((_, _)) => self.next_text(), None => None, } } } /// An iterator over ANSI/VT escape sequences within a string. /// /// ## Example /// /// ```ignore /// let iter = EscapeSequenceIterator::new("\x1B[33mThis is yellow text.\x1B[m"); /// ``` pub struct EscapeSequenceIterator<'a> { text: &'a str, offset_iter: EscapeSequenceOffsetsIterator<'a>, } impl<'a> EscapeSequenceIterator<'a> { pub fn new(text: &'a str) -> EscapeSequenceIterator<'a> { return EscapeSequenceIterator { text, offset_iter: EscapeSequenceOffsetsIterator::new(text), }; } } impl<'a> Iterator for EscapeSequenceIterator<'a> { type Item = EscapeSequence<'a>; fn next(&mut self) -> Option { use EscapeSequenceOffsets::*; self.offset_iter.next().map(|offsets| match offsets { Unknown { start, end } => EscapeSequence::Unknown(&self.text[start..end]), Text { start, end } => EscapeSequence::Text(&self.text[start..end]), NF { start_sequence, start, end, } => EscapeSequence::NF { raw_sequence: &self.text[start_sequence..end], nf_sequence: &self.text[start..end], }, OSC { start_sequence, start_command, start_terminator, end, } => EscapeSequence::OSC { raw_sequence: &self.text[start_sequence..end], command: &self.text[start_command..start_terminator], terminator: &self.text[start_terminator..end], }, CSI { start_sequence, start_parameters, start_intermediates, start_final_byte, end, } => EscapeSequence::CSI { raw_sequence: &self.text[start_sequence..end], parameters: &self.text[start_parameters..start_intermediates], intermediates: &self.text[start_intermediates..start_final_byte], final_byte: &self.text[start_final_byte..end], }, }) } } /// A parsed ANSI/VT100 escape sequence. #[derive(Debug, PartialEq)] pub enum EscapeSequence<'a> { Text(&'a str), Unknown(&'a str), #[allow(clippy::upper_case_acronyms)] NF { raw_sequence: &'a str, nf_sequence: &'a str, }, #[allow(clippy::upper_case_acronyms)] OSC { raw_sequence: &'a str, command: &'a str, terminator: &'a str, }, #[allow(clippy::upper_case_acronyms)] CSI { raw_sequence: &'a str, parameters: &'a str, intermediates: &'a str, final_byte: &'a str, }, } impl<'a> EscapeSequence<'a> { pub fn raw(&self) -> &'a str { use EscapeSequence::*; match *self { Text(raw) => raw, Unknown(raw) => raw, NF { raw_sequence, .. } => raw_sequence, OSC { raw_sequence, .. } => raw_sequence, CSI { raw_sequence, .. } => raw_sequence, } } } #[cfg(test)] mod tests { use crate::vscreen::{ EscapeSequence, EscapeSequenceIterator, EscapeSequenceOffsets, EscapeSequenceOffsetsIterator, }; #[test] fn test_escape_sequence_offsets_iterator_parses_text() { let mut iter = EscapeSequenceOffsetsIterator::new("text"); assert_eq!( iter.next(), Some(EscapeSequenceOffsets::Text { start: 0, end: 4 }) ); } #[test] fn test_escape_sequence_offsets_iterator_parses_text_stops_at_esc() { let mut iter = EscapeSequenceOffsetsIterator::new("text\x1B[ming"); assert_eq!( iter.next(), Some(EscapeSequenceOffsets::Text { start: 0, end: 4 }) ); } #[test] fn test_escape_sequence_offsets_iterator_parses_osc_with_bel() { let mut iter = EscapeSequenceOffsetsIterator::new("\x1B]abc\x07"); assert_eq!( iter.next(), Some(EscapeSequenceOffsets::OSC { start_sequence: 0, start_command: 2, start_terminator: 5, end: 6, }) ); } #[test] fn test_escape_sequence_offsets_iterator_parses_osc_with_st() { let mut iter = EscapeSequenceOffsetsIterator::new("\x1B]abc\x1B\\"); assert_eq!( iter.next(), Some(EscapeSequenceOffsets::OSC { start_sequence: 0, start_command: 2, start_terminator: 5, end: 7, }) ); } #[test] fn test_escape_sequence_offsets_iterator_parses_osc_thats_broken() { let mut iter = EscapeSequenceOffsetsIterator::new("\x1B]ab"); assert_eq!( iter.next(), Some(EscapeSequenceOffsets::OSC { start_sequence: 0, start_command: 2, start_terminator: 4, end: 4, }) ); } #[test] fn test_escape_sequence_offsets_iterator_parses_csi() { let mut iter = EscapeSequenceOffsetsIterator::new("\x1B[m"); assert_eq!( iter.next(), Some(EscapeSequenceOffsets::CSI { start_sequence: 0, start_parameters: 2, start_intermediates: 2, start_final_byte: 2, end: 3 }) ); } #[test] fn test_escape_sequence_offsets_iterator_parses_csi_with_parameters() { let mut iter = EscapeSequenceOffsetsIterator::new("\x1B[1;34m"); assert_eq!( iter.next(), Some(EscapeSequenceOffsets::CSI { start_sequence: 0, start_parameters: 2, start_intermediates: 6, start_final_byte: 6, end: 7 }) ); } #[test] fn test_escape_sequence_offsets_iterator_parses_csi_with_intermediates() { let mut iter = EscapeSequenceOffsetsIterator::new("\x1B[$m"); assert_eq!( iter.next(), Some(EscapeSequenceOffsets::CSI { start_sequence: 0, start_parameters: 2, start_intermediates: 2, start_final_byte: 3, end: 4 }) ); } #[test] fn test_escape_sequence_offsets_iterator_parses_csi_with_parameters_and_intermediates() { let mut iter = EscapeSequenceOffsetsIterator::new("\x1B[1$m"); assert_eq!( iter.next(), Some(EscapeSequenceOffsets::CSI { start_sequence: 0, start_parameters: 2, start_intermediates: 3, start_final_byte: 4, end: 5 }) ); } #[test] fn test_escape_sequence_offsets_iterator_parses_csi_thats_broken() { let mut iter = EscapeSequenceOffsetsIterator::new("\x1B["); assert_eq!( iter.next(), Some(EscapeSequenceOffsets::CSI { start_sequence: 0, start_parameters: 2, start_intermediates: 2, start_final_byte: 2, end: 2 }) ); let mut iter = EscapeSequenceOffsetsIterator::new("\x1B[1"); assert_eq!( iter.next(), Some(EscapeSequenceOffsets::CSI { start_sequence: 0, start_parameters: 2, start_intermediates: 3, start_final_byte: 3, end: 3 }) ); let mut iter = EscapeSequenceOffsetsIterator::new("\x1B[1$"); assert_eq!( iter.next(), Some(EscapeSequenceOffsets::CSI { start_sequence: 0, start_parameters: 2, start_intermediates: 3, start_final_byte: 4, end: 4 }) ); } #[test] fn test_escape_sequence_offsets_iterator_parses_nf() { let mut iter = EscapeSequenceOffsetsIterator::new("\x1B($0"); assert_eq!( iter.next(), Some(EscapeSequenceOffsets::NF { start_sequence: 0, start: 1, end: 4 }) ); } #[test] fn test_escape_sequence_offsets_iterator_parses_nf_thats_broken() { let mut iter = EscapeSequenceOffsetsIterator::new("\x1B("); assert_eq!( iter.next(), Some(EscapeSequenceOffsets::NF { start_sequence: 0, start: 1, end: 1 }) ); } #[test] fn test_escape_sequence_offsets_iterator_iterates() { let mut iter = EscapeSequenceOffsetsIterator::new("text\x1B[33m\x1B]OSC\x07\x1B(0"); assert_eq!( iter.next(), Some(EscapeSequenceOffsets::Text { start: 0, end: 4 }) ); assert_eq!( iter.next(), Some(EscapeSequenceOffsets::CSI { start_sequence: 4, start_parameters: 6, start_intermediates: 8, start_final_byte: 8, end: 9 }) ); assert_eq!( iter.next(), Some(EscapeSequenceOffsets::OSC { start_sequence: 9, start_command: 11, start_terminator: 14, end: 15 }) ); assert_eq!( iter.next(), Some(EscapeSequenceOffsets::NF { start_sequence: 15, start: 16, end: 18 }) ); assert_eq!(iter.next(), None); } #[test] fn test_escape_sequence_iterator_iterates() { let mut iter = EscapeSequenceIterator::new("text\x1B[33m\x1B]OSC\x07\x1B]OSC\x1B\\\x1B(0"); assert_eq!(iter.next(), Some(EscapeSequence::Text("text"))); assert_eq!( iter.next(), Some(EscapeSequence::CSI { raw_sequence: "\x1B[33m", parameters: "33", intermediates: "", final_byte: "m", }) ); assert_eq!( iter.next(), Some(EscapeSequence::OSC { raw_sequence: "\x1B]OSC\x07", command: "OSC", terminator: "\x07", }) ); assert_eq!( iter.next(), Some(EscapeSequence::OSC { raw_sequence: "\x1B]OSC\x1B\\", command: "OSC", terminator: "\x1B\\", }) ); assert_eq!( iter.next(), Some(EscapeSequence::NF { raw_sequence: "\x1B(0", nf_sequence: "(0", }) ); assert_eq!(iter.next(), None); } #[test] fn test_sgr_attributes_do_not_leak_into_wrong_field() { let mut attrs = crate::vscreen::Attributes::new(); // Bold, Dim, Italic, Underline, Foreground, Background attrs.update(EscapeSequence::CSI { raw_sequence: "\x1B[1;2;3;4;31;41m", parameters: "1;2;3;4;31;41", intermediates: "", final_byte: "m", }); assert_eq!(attrs.bold, "\x1B[1m"); assert_eq!(attrs.dim, "\x1B[2m"); assert_eq!(attrs.italic, "\x1B[3m"); assert_eq!(attrs.underline, "\x1B[4m"); assert_eq!(attrs.foreground, "\x1B[31m"); assert_eq!(attrs.background, "\x1B[41m"); // Bold, Bright Foreground, Bright Background attrs.sgr_reset(); attrs.update(EscapeSequence::CSI { raw_sequence: "\x1B[1;94;103m", parameters: "1;94;103", intermediates: "", final_byte: "m", }); assert_eq!(attrs.bold, "\x1B[1m"); assert_eq!(attrs.foreground, "\x1B[94m"); assert_eq!(attrs.background, "\x1B[103m"); } } bat-0.25.0/src/wrapping.rs000064400000000000000000000004751046102023000134500ustar 00000000000000#[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum WrappingMode { Character, // The bool specifies whether wrapping has been explicitly disabled by the user via --wrap=never NoWrapping(bool), } impl Default for WrappingMode { fn default() -> Self { WrappingMode::NoWrapping(false) } } bat-0.25.0/tests/.gitattributes000064400000000000000000000005741046102023000145210ustar 00000000000000# force LF EOLs for test fixtures examples/** text=auto eol=lf snapshots/** text=auto eol=lf syntax-tests/source/** text=auto eol=lf syntax-tests/highlighted/** text=auto eol=lf # Linguist overrides benchmarks/** linguist-vendored examples/** linguist-vendored snapshots/** linguist-vendored syntax-tests/highlighted/** linguist-vendored syntax-tests/source/** linguist-vendored bat-0.25.0/tests/assets.rs000064400000000000000000000021521046102023000134700ustar 00000000000000use bat::assets::HighlightingAssets; /// This test ensures that we are not accidentally removing themes due to submodule updates. /// It is 'ignore'd by default because it requires themes.bin to be up-to-date. #[test] #[ignore] fn all_themes_are_present() { let assets = HighlightingAssets::from_binary(); let mut themes: Vec<_> = assets.themes().collect(); themes.sort_unstable(); assert_eq!( themes, vec![ "1337", "Coldark-Cold", "Coldark-Dark", "DarkNeon", "Dracula", "GitHub", "Monokai Extended", "Monokai Extended Bright", "Monokai Extended Light", "Monokai Extended Origin", "Nord", "OneHalfDark", "OneHalfLight", "Solarized (dark)", "Solarized (light)", "Sublime Snazzy", "TwoDark", "Visual Studio Dark+", "ansi", "base16", "base16-256", "gruvbox-dark", "gruvbox-light", "zenburn" ] ); } bat-0.25.0/tests/github-actions.rs000064400000000000000000000024471046102023000151150ustar 00000000000000#[test] fn all_jobs_not_missing_any_jobs() { let yaml: serde_yaml::Value = serde_yaml::from_reader(std::fs::File::open(".github/workflows/CICD.yml").unwrap()) .unwrap(); let jobs = yaml.get("jobs").unwrap(); // Get all jobs that all-jobs depends on: // // jobs: // all-jobs: // needs: // - this // - list // - ... let actual = jobs .get("all-jobs") .unwrap() .get("needs") .unwrap() .as_sequence() .unwrap(); // Get all jobs used in CI, except the ones we want to ignore: // // jobs: // this: ... // list: ... // ... let exceptions = [ "all-jobs", // 'all-jobs' should not reference itself "winget", // only used when publishing a release ]; let expected = jobs .as_mapping() .unwrap() .keys() .filter_map(|k| { if exceptions.contains(&k.as_str().unwrap_or_default()) { None } else { Some(k) } }) .map(ToOwned::to_owned) .collect::>(); // Make sure they match assert_eq!( *actual, expected, "`all-jobs` should depend on all other jobs" ); } bat-0.25.0/tests/integration_tests.rs000064400000000000000000002773221046102023000157500ustar 00000000000000use predicates::boolean::PredicateBooleanExt; use predicates::{prelude::predicate, str::PredicateStrExt}; use serial_test::serial; use std::path::Path; use std::str::from_utf8; use tempfile::tempdir; #[cfg(unix)] mod unix { pub use std::fs::File; pub use std::io::{self, Write}; pub use std::path::PathBuf; pub use std::process::Stdio; pub use std::thread; pub use std::time::Duration; pub use assert_cmd::assert::OutputAssertExt; pub use nix::pty::{openpty, OpenptyResult}; pub use wait_timeout::ChildExt; pub const SAFE_CHILD_PROCESS_CREATION_TIME: Duration = Duration::from_millis(100); pub const CHILD_WAIT_TIMEOUT: Duration = Duration::from_secs(15); } #[cfg(unix)] use unix::*; mod utils; use utils::command::{bat, bat_with_config}; #[cfg(unix)] use utils::command::bat_raw_command; use utils::mocked_pagers; const EXAMPLES_DIR: &str = "tests/examples"; fn get_config() -> &'static str { if cfg!(windows) { "bat-windows.conf" } else { "bat.conf" } } #[test] fn basic() { bat() .arg("test.txt") .assert() .success() .stdout("hello world\n") .stderr(""); } #[test] fn stdin() { bat() .write_stdin("foo\nbar\n") .assert() .success() .stdout("foo\nbar\n"); } #[test] fn concatenate() { bat() .arg("test.txt") .arg("test.txt") .assert() .success() .stdout("hello world\nhello world\n"); } #[test] fn concatenate_stdin() { bat() .arg("test.txt") .arg("-") .arg("test.txt") .write_stdin("stdin\n") .assert() .success() .stdout("hello world\nstdin\nhello world\n"); } #[test] fn concatenate_empty_first() { bat() .arg("empty.txt") .arg("test.txt") .assert() .success() .stdout("hello world\n"); } #[test] fn concatenate_empty_last() { bat() .arg("test.txt") .arg("empty.txt") .assert() .success() .stdout("hello world\n"); } #[test] fn concatenate_empty_both() { bat() .arg("empty.txt") .arg("empty.txt") .assert() .success() .stdout(""); } #[test] fn concatenate_empty_between() { bat() .arg("test.txt") .arg("empty.txt") .arg("test.txt") .assert() .success() .stdout("hello world\nhello world\n"); } #[test] fn concatenate_empty_first_and_last() { bat() .arg("empty.txt") .arg("test.txt") .arg("empty.txt") .assert() .success() .stdout("hello world\n"); } #[test] fn concatenate_single_line() { bat() .arg("single-line.txt") .arg("single-line.txt") .assert() .success() .stdout("Single LineSingle Line"); } #[test] fn concatenate_single_line_empty() { bat() .arg("single-line.txt") .arg("empty.txt") .arg("single-line.txt") .assert() .success() .stdout("Single LineSingle Line"); } #[test] fn line_numbers() { bat() .arg("multiline.txt") .arg("--style=numbers") .arg("--decorations=always") .assert() .success() .stdout(" 1 line 1\n 2 line 2\n 3 line 3\n 4 line 4\n"); } #[test] fn line_range_2_3() { bat() .arg("multiline.txt") .arg("--line-range=2:3") .assert() .success() .stdout("line 2\nline 3\n"); } #[test] fn line_range_first_two() { bat() .arg("multiline.txt") .arg("--line-range=:2") .assert() .success() .stdout("line 1\nline 2\n"); } #[test] fn line_range_last_3() { bat() .arg("multiline.txt") .arg("--line-range=2:") .assert() .success() .stdout("line 2\nline 3\nline 4\n"); } #[test] fn line_range_multiple() { bat() .arg("multiline.txt") .arg("--line-range=1:2") .arg("--line-range=4:4") .assert() .success() .stdout("line 1\nline 2\nline 4\n"); } #[test] fn squeeze_blank() { bat() .arg("empty_lines.txt") .arg("--squeeze-blank") .assert() .success() .stdout("line 1\n\nline 5\n\nline 20\nline 21\n\nline 24\n\nline 26\n\nline 30\n"); } #[test] fn squeeze_blank_line_numbers() { bat() .arg("empty_lines.txt") .arg("--squeeze-blank") .arg("--decorations=always") .arg("--number") .assert() .success() .stdout(" 1 line 1\n 2 \n 5 line 5\n 6 \n 20 line 20\n 21 line 21\n 22 \n 24 line 24\n 25 \n 26 line 26\n 27 \n 30 line 30\n"); } #[test] fn squeeze_limit() { bat() .arg("empty_lines.txt") .arg("--squeeze-blank") .arg("--squeeze-limit=2") .assert() .success() .stdout("line 1\n\n\nline 5\n\n\nline 20\nline 21\n\n\nline 24\n\nline 26\n\n\nline 30\n"); bat() .arg("empty_lines.txt") .arg("--squeeze-blank") .arg("--squeeze-limit=5") .assert() .success() .stdout("line 1\n\n\n\nline 5\n\n\n\n\n\nline 20\nline 21\n\n\nline 24\n\nline 26\n\n\n\nline 30\n"); } #[test] fn squeeze_limit_line_numbers() { bat() .arg("empty_lines.txt") .arg("--squeeze-blank") .arg("--squeeze-limit=2") .arg("--decorations=always") .arg("--number") .assert() .success() .stdout(" 1 line 1\n 2 \n 3 \n 5 line 5\n 6 \n 7 \n 20 line 20\n 21 line 21\n 22 \n 23 \n 24 line 24\n 25 \n 26 line 26\n 27 \n 28 \n 30 line 30\n"); bat() .arg("empty_lines.txt") .arg("--squeeze-blank") .arg("--squeeze-limit=5") .arg("--decorations=always") .arg("--number") .assert() .success() .stdout(" 1 line 1\n 2 \n 3 \n 4 \n 5 line 5\n 6 \n 7 \n 8 \n 9 \n 10 \n 20 line 20\n 21 line 21\n 22 \n 23 \n 24 line 24\n 25 \n 26 line 26\n 27 \n 28 \n 29 \n 30 line 30\n"); } #[test] fn list_themes_with_colors() { let default_theme_chunk = "Monokai Extended\x1B[0m (default)"; let default_light_theme_chunk = "Monokai Extended Light\x1B[0m (default light)"; bat() .arg("--color=always") .arg("--list-themes") .assert() .success() .stdout(predicate::str::contains("DarkNeon").normalize()) .stdout(predicate::str::contains(default_theme_chunk).normalize()) .stdout(predicate::str::contains(default_light_theme_chunk).normalize()) .stdout(predicate::str::contains("Output the square of a number.").normalize()); } #[test] fn list_themes_without_colors() { let default_theme_chunk = "Monokai Extended (default)"; let default_light_theme_chunk = "Monokai Extended Light (default light)"; bat() .arg("--color=never") .arg("--decorations=always") // trick bat into setting `Config::loop_through` to false .arg("--list-themes") .assert() .success() .stdout(predicate::str::contains("DarkNeon").normalize()) .stdout(predicate::str::contains(default_theme_chunk).normalize()) .stdout(predicate::str::contains(default_light_theme_chunk).normalize()); } #[test] fn list_themes_to_piped_output() { bat() .arg("--list-themes") .assert() .success() .stdout(predicate::str::contains("(default)").not()); } #[test] #[cfg_attr( any(not(feature = "git"), feature = "lessopen", target_os = "windows"), ignore )] fn short_help() { test_help("-h", "../doc/short-help.txt"); } #[test] #[cfg_attr( any(not(feature = "git"), feature = "lessopen", target_os = "windows"), ignore )] fn long_help() { test_help("--help", "../doc/long-help.txt"); } fn test_help(arg: &str, expect_file: &str) { let assert = bat().arg(arg).assert(); expect_test::expect_file![expect_file] .assert_eq(&String::from_utf8_lossy(&assert.get_output().stdout)); } #[cfg(unix)] fn setup_temp_file(content: &[u8]) -> io::Result<(PathBuf, tempfile::TempDir)> { let dir = tempfile::tempdir().expect("Couldn't create tempdir"); let path = dir.path().join("temp_file"); File::create(&path)?.write_all(content)?; Ok((path, dir)) } #[cfg(unix)] #[test] fn basic_io_cycle() -> io::Result<()> { let (filename, dir) = setup_temp_file(b"I am not empty")?; let file_out = Stdio::from(File::create(&filename)?); let res = bat_raw_command() .arg("test.txt") .arg(&filename) .stdout(file_out) .assert(); drop(dir); res.failure(); Ok(()) } #[cfg(unix)] #[test] fn first_file_cyclic_is_ok() -> io::Result<()> { let (filename, dir) = setup_temp_file(b"I am not empty")?; let file_out = Stdio::from(File::create(&filename)?); let res = bat_raw_command() .arg(&filename) .arg("test.txt") .stdout(file_out) .assert(); drop(dir); res.success(); Ok(()) } #[cfg(unix)] #[test] fn empty_file_cycle_is_ok() -> io::Result<()> { let (filename, dir) = setup_temp_file(b"I am not empty")?; let file_out = Stdio::from(File::create(&filename)?); let res = bat_raw_command() .arg("empty.txt") .arg(&filename) .stdout(file_out) .assert(); drop(dir); res.success(); Ok(()) } #[cfg(unix)] #[test] fn stdin_to_stdout_cycle() -> io::Result<()> { let (filename, dir) = setup_temp_file(b"I am not empty")?; let file_in = Stdio::from(File::open(&filename)?); let file_out = Stdio::from(File::create(&filename)?); let res = bat_raw_command() .arg("test.txt") .arg("-") .stdin(file_in) .stdout(file_out) .assert(); drop(dir); res.failure(); Ok(()) } #[cfg(unix)] #[test] fn no_args_doesnt_break() { // To simulate bat getting started from the shell, a process is created with stdin and stdout // as the slave end of a pseudo terminal. Although both point to the same "file", bat should // not exit, because in this case it is safe to read and write to the same fd, which is why // this test exists. let OpenptyResult { master, slave } = openpty(None, None).expect("Couldn't open pty."); let mut master = File::from(master); let stdin_file = File::from(slave); let stdout_file = stdin_file.try_clone().unwrap(); let stdin = Stdio::from(stdin_file); let stdout = Stdio::from(stdout_file); let mut child = bat_raw_command() .stdin(stdin) .stdout(stdout) .env("TERM", "dumb") // Suppresses color detection .spawn() .expect("Failed to start."); // Some time for the child process to start and to make sure, that we can poll the exit status. // Although this waiting period is not necessary, it is best to keep it in and be absolutely // sure, that the try_wait does not error later. thread::sleep(SAFE_CHILD_PROCESS_CREATION_TIME); // The child process should be running and waiting for input, // therefore no exit status should be available. let exit_status = child .try_wait() .expect("Error polling exit status, this should never happen."); assert!(exit_status.is_none()); // Write Ctrl-D (end of transmission) to the pty. master .write_all(&[0x04]) .expect("Couldn't write EOT character to master end."); let exit_status = child .wait_timeout(CHILD_WAIT_TIMEOUT) .expect("Error polling exit status, this should never happen.") .expect("Exit status not set, but the child should have exited already."); assert!(exit_status.success()); } #[test] fn tabs_numbers() { bat() .arg("tabs.txt") .arg("--tabs=4") .arg("--style=numbers") .arg("--decorations=always") .assert() .success() .stdout( " 1 1 2 3 4 2 1 ? 3 22 ? 4 333 ? 5 4444 ? 6 55555 ? 7 666666 ? 8 7777777 ? 9 88888888 ? ", ); } #[test] fn tabs_passthrough_wrapped() { bat() .arg("tabs.txt") .arg("--tabs=0") .arg("--style=plain") .arg("--decorations=always") .assert() .success() .stdout( " 1 2 3 4 1 ? 22 ? 333 ? 4444 ? 55555 ? 666666 ? 7777777 ? 88888888 ? ", ); } #[test] fn tabs_4_wrapped() { bat() .arg("tabs.txt") .arg("--tabs=4") .arg("--style=plain") .arg("--decorations=always") .assert() .success() .stdout( " 1 2 3 4 1 ? 22 ? 333 ? 4444 ? 55555 ? 666666 ? 7777777 ? 88888888 ? ", ); } #[test] fn tabs_8_wrapped() { bat() .arg("tabs.txt") .arg("--tabs=8") .arg("--style=plain") .arg("--decorations=always") .assert() .success() .stdout( " 1 2 3 4 1 ? 22 ? 333 ? 4444 ? 55555 ? 666666 ? 7777777 ? 88888888 ? ", ); } #[test] fn tabs_passthrough() { bat() .arg("tabs.txt") .arg("--tabs=0") .arg("--style=plain") .arg("--decorations=always") .assert() .success() .stdout( " 1 2 3 4 1 ? 22 ? 333 ? 4444 ? 55555 ? 666666 ? 7777777 ? 88888888 ? ", ); } #[test] fn tabs_4() { bat() .arg("tabs.txt") .arg("--tabs=4") .arg("--style=plain") .arg("--decorations=always") .assert() .success() .stdout( " 1 2 3 4 1 ? 22 ? 333 ? 4444 ? 55555 ? 666666 ? 7777777 ? 88888888 ? ", ); } #[test] fn tabs_8() { bat() .arg("tabs.txt") .arg("--tabs=8") .arg("--style=plain") .arg("--decorations=always") .assert() .success() .stdout( " 1 2 3 4 1 ? 22 ? 333 ? 4444 ? 55555 ? 666666 ? 7777777 ? 88888888 ? ", ); } #[test] fn tabs_4_env_overrides_config() { bat_with_config() .env("BAT_CONFIG_PATH", "bat-tabs.conf") .env("BAT_TABS", "4") .arg("tabs.txt") .arg("--style=plain") .arg("--decorations=always") .assert() .success() .stdout( " 1 2 3 4 1 ? 22 ? 333 ? 4444 ? 55555 ? 666666 ? 7777777 ? 88888888 ? ", ); } #[test] fn tabs_4_arg_overrides_env() { bat_with_config() .env("BAT_CONFIG_PATH", "bat-tabs.conf") .env("BAT_TABS", "6") .arg("tabs.txt") .arg("--tabs=4") .arg("--style=plain") .arg("--decorations=always") .assert() .success() .stdout( " 1 2 3 4 1 ? 22 ? 333 ? 4444 ? 55555 ? 666666 ? 7777777 ? 88888888 ? ", ); } #[test] fn tabs_4_arg_overrides_env_noconfig() { bat() .env("BAT_TABS", "6") .arg("tabs.txt") .arg("--tabs=4") .arg("--style=plain") .arg("--decorations=always") .assert() .success() .stdout( " 1 2 3 4 1 ? 22 ? 333 ? 4444 ? 55555 ? 666666 ? 7777777 ? 88888888 ? ", ); } #[test] fn fail_non_existing() { bat().arg("non-existing-file").assert().failure(); } #[test] fn fail_directory() { bat().arg("sub_directory").assert().failure(); } #[test] fn do_not_exit_directory() { bat() .arg("sub_directory") .arg("test.txt") .assert() .stdout("hello world\n") .failure(); } #[test] #[serial] fn pager_basic() { mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { bat() .env("PAGER", mocked_pagers::from("echo pager-output")) .arg("--paging=always") .arg("test.txt") .assert() .success() .stdout(predicate::str::contains("pager-output\n").normalize()); }); } #[test] #[serial] fn pager_basic_arg() { mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { bat() .arg(format!( "--pager={}", mocked_pagers::from("echo pager-output") )) .arg("--paging=always") .arg("test.txt") .assert() .success() .stdout(predicate::str::contains("pager-output\n").normalize()); }); } #[test] #[serial] fn pager_overwrite() { mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { bat() .env("PAGER", mocked_pagers::from("echo other-pager")) .env("BAT_PAGER", mocked_pagers::from("echo pager-output")) .arg("--paging=always") .arg("test.txt") .assert() .success() .stdout(predicate::str::contains("pager-output\n").normalize()); }); } #[test] fn pager_disable() { bat() .env("PAGER", "echo other-pager") .env("BAT_PAGER", "") .arg("--paging=always") .arg("test.txt") .assert() .success() .stdout(predicate::eq("hello world\n").normalize()); } #[test] #[serial] fn pager_arg_override_env_withconfig() { mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { bat_with_config() .env("BAT_CONFIG_PATH", get_config()) .env("PAGER", mocked_pagers::from("echo another-pager")) .env("BAT_PAGER", mocked_pagers::from("echo other-pager")) .arg(format!( "--pager={}", mocked_pagers::from("echo pager-output") )) .arg("--paging=always") .arg("test.txt") .assert() .success() .stdout(predicate::str::contains("pager-output\n").normalize()); }); } #[test] #[serial] fn pager_arg_override_env_noconfig() { mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { bat() .env("PAGER", mocked_pagers::from("echo another-pager")) .env("BAT_PAGER", mocked_pagers::from("echo other-pager")) .arg(format!( "--pager={}", mocked_pagers::from("echo pager-output") )) .arg("--paging=always") .arg("test.txt") .assert() .success() .stdout(predicate::str::contains("pager-output\n").normalize()); }); } #[test] #[serial] fn pager_env_bat_pager_override_config() { mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { bat_with_config() .env("BAT_CONFIG_PATH", get_config()) .env("PAGER", mocked_pagers::from("echo other-pager")) .env("BAT_PAGER", mocked_pagers::from("echo pager-output")) .arg("--paging=always") .arg("test.txt") .assert() .success() .stdout(predicate::str::contains("pager-output\n").normalize()); }); } #[test] #[serial] fn pager_env_pager_nooverride_config() { mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { bat_with_config() .env("BAT_CONFIG_PATH", get_config()) .env("PAGER", mocked_pagers::from("echo other-pager")) .arg("--paging=always") .arg("test.txt") .assert() .success() .stdout(predicate::str::contains("dummy-pager-from-config\n").normalize()); }); } #[test] fn env_var_pager_value_bat() { bat() .env("PAGER", "bat") .arg("--paging=always") .arg("test.txt") .assert() .success() .stdout(predicate::eq("hello world\n").normalize()); } #[test] fn env_var_bat_pager_value_bat() { bat() .env("BAT_PAGER", "bat") .arg("--paging=always") .arg("test.txt") .assert() .failure() .stderr(predicate::str::contains("bat as a pager is disallowed")); } #[test] fn pager_value_bat() { bat() .arg("--pager=bat") .arg("--paging=always") .arg("test.txt") .assert() .failure() .stderr(predicate::str::contains("bat as a pager is disallowed")); } /// We shall use less instead of most if PAGER is used since PAGER /// is a generic env var #[test] #[serial] // Because of PATH fn pager_most_from_pager_env_var() { mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { // If the output is not "I am most" then we know 'most' is not used bat() .env("PAGER", mocked_pagers::from("most")) .arg("--paging=always") .arg("test.txt") .assert() .success() .stdout(predicate::eq("hello world\n").normalize()); }); } /// If the bat-specific BAT_PAGER is used, obey the wish of the user /// and allow 'most' #[test] #[serial] // Because of PATH fn pager_most_from_bat_pager_env_var() { mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { bat() .env("BAT_PAGER", mocked_pagers::from("most")) .arg("--paging=always") .arg("test.txt") .assert() .success() .stdout(predicate::str::contains("I am most")); }); } /// Same reasoning with --pager as with BAT_PAGER #[test] #[serial] // Because of PATH fn pager_most_from_pager_arg() { mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { bat() .arg("--paging=always") .arg(format!("--pager={}", mocked_pagers::from("most"))) .arg("test.txt") .assert() .success() .stdout(predicate::str::contains("I am most")); }); } /// Make sure the logic for 'most' applies even if an argument is passed #[test] #[serial] // Because of PATH fn pager_most_with_arg() { mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { bat() .env("PAGER", format!("{} -w", mocked_pagers::from("most"))) .arg("--paging=always") .arg("test.txt") .assert() .success() .stdout(predicate::eq("hello world\n").normalize()); }); } /// Sanity check that 'more' is treated like 'most' #[test] #[serial] // Because of PATH fn pager_more() { mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { bat() .env("PAGER", mocked_pagers::from("more")) .arg("--paging=always") .arg("test.txt") .assert() .success() .stdout(predicate::eq("hello world\n").normalize()); }); } #[test] fn alias_pager_disable() { bat() .env("PAGER", "echo other-pager") .arg("-P") .arg("test.txt") .assert() .success() .stdout(predicate::eq("hello world\n").normalize()); } #[test] #[serial] fn alias_pager_disable_long_overrides_short() { mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { bat() .env("PAGER", mocked_pagers::from("echo pager-output")) .arg("-P") .arg("--paging=always") .arg("test.txt") .assert() .success() .stdout(predicate::str::contains("pager-output\n").normalize()); }); } #[test] fn disable_pager_if_disable_paging_flag_comes_after_paging() { bat() .env("PAGER", "echo pager-output") .arg("--paging=always") .arg("-P") .arg("test.txt") .assert() .success() .stdout(predicate::eq("hello world\n").normalize()); } #[test] fn disable_pager_if_pp_flag_comes_after_paging() { bat() .env("PAGER", "echo pager-output") .arg("--paging=always") .arg("-pp") .arg("test.txt") .assert() .success() .stdout(predicate::eq("hello world\n").normalize()); } #[test] fn enable_pager_if_disable_paging_flag_comes_before_paging() { bat() .env("PAGER", "echo pager-output") .arg("-P") .arg("--paging=always") .arg("test.txt") .assert() .success() .stdout(predicate::eq("pager-output\n").normalize()); } #[test] fn enable_pager_if_pp_flag_comes_before_paging() { bat() .env("PAGER", "echo pager-output") .arg("-pp") .arg("--paging=always") .arg("test.txt") .assert() .success() .stdout(predicate::eq("pager-output\n").normalize()); } #[test] fn paging_does_not_override_simple_plain() { bat() .env("PAGER", "echo pager-output") .arg("--decorations=always") .arg("--plain") .arg("--paging=never") .arg("test.txt") .assert() .success() .stdout(predicate::eq("hello world\n")); } #[test] fn simple_plain_does_not_override_paging() { bat() .env("PAGER", "echo pager-output") .arg("--paging=always") .arg("--plain") .arg("test.txt") .assert() .success() .stdout(predicate::eq("pager-output\n")); } #[test] fn pager_failed_to_parse() { bat() .env("BAT_PAGER", "mismatched-quotes 'a") .arg("--paging=always") .arg("test.txt") .assert() .failure() .stderr(predicate::str::contains("Could not parse pager command")); } #[test] #[serial] fn env_var_bat_paging() { mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { bat() .env("BAT_PAGER", mocked_pagers::from("echo pager-output")) .env("BAT_PAGING", "always") .arg("test.txt") .assert() .success() .stdout(predicate::str::contains("pager-output\n").normalize()); }); } #[test] fn basic_set_terminal_title() { bat() .arg("--paging=always") .arg("--set-terminal-title") .arg("test.txt") .assert() .success() .stdout("\u{1b}]0;bat: test.txt\x07hello world\n") .stderr(""); } #[test] fn diagnostic_sanity_check() { bat() .arg("--diagnostic") .assert() .success() .stdout(predicate::str::contains("BAT_PAGER=")) .stderr(""); } #[test] fn config_location_test() { bat_with_config() .env("BAT_CONFIG_PATH", "bat.conf") .arg("--config-file") .assert() .success() .stdout("bat.conf\n"); bat_with_config() .env("BAT_CONFIG_PATH", "not-existing.conf") .arg("--config-file") .assert() .success() .stdout("not-existing.conf\n"); } #[test] fn config_location_when_generating() { let tmp_dir = tempdir().expect("can create temporary directory"); let tmp_config_path = tmp_dir.path().join("should-be-created.conf"); // Create the file with bat bat_with_config() .env("BAT_CONFIG_PATH", tmp_config_path.to_str().unwrap()) .arg("--generate-config-file") .assert() .success() .stdout( predicate::str::is_match("Success! Config file written to .*should-be-created.conf\n") .unwrap(), ); // Now we expect the file to exist. If it exists, we assume contents are correct assert!(tmp_config_path.exists()); } #[test] fn config_location_from_bat_config_dir_variable() { bat_with_config() .env("BAT_CONFIG_DIR", "conf/") .arg("--config-file") .assert() .success() .stdout(predicate::str::is_match("conf/config\n").unwrap()); } #[test] #[serial] fn config_read_arguments_from_file() { mocked_pagers::with_mocked_versions_of_more_and_most_in_path(|| { bat_with_config() .env("BAT_CONFIG_PATH", get_config()) .arg("test.txt") .assert() .success() .stdout(predicate::str::contains("dummy-pager-from-config\n").normalize()); }); } #[cfg(unix)] #[test] fn cache_clear() { let src_dir = "cache_source"; let tmp_dir = tempdir().expect("can create temporary directory"); let themes_filename = "themes.bin"; let syntaxes_filename = "syntaxes.bin"; let metadata_filename = "metadata.yaml"; [themes_filename, syntaxes_filename, metadata_filename] .iter() .map(|filename| { let fp = tmp_dir.path().join(filename); let mut file = File::create(fp).expect("can create temporary file"); writeln!(file, "dummy content").expect("can write to file"); }) .count(); // Clear the targeted cache // Include the BAT_CONFIG_PATH and BAT_THEME environment variables to ensure that // options loaded from a config or the environment are not inserted // before the cache subcommand, which would break it. bat_with_config() .current_dir(Path::new(EXAMPLES_DIR).join(src_dir)) .env("BAT_CONFIG_PATH", "bat.conf") .env("BAT_THEME", "1337") .arg("cache") .arg("--clear") .arg("--source") .arg(".") .arg("--target") .arg(tmp_dir.path().to_str().unwrap()) .assert() .success() .stdout( predicate::str::is_match( "Clearing theme set cache ... okay Clearing syntax set cache ... okay Clearing metadata file ... okay", ) .unwrap(), ); // We expect these files to be removed assert!(!tmp_dir.path().join(themes_filename).exists()); assert!(!tmp_dir.path().join(syntaxes_filename).exists()); assert!(!tmp_dir.path().join(metadata_filename).exists()); } #[cfg(unix)] #[test] fn cache_build() { let src_dir = "cache_source"; let tmp_dir = tempdir().expect("can create temporary directory"); let tmp_themes_path = tmp_dir.path().join("themes.bin"); let tmp_syntaxes_path = tmp_dir.path().join("syntaxes.bin"); let tmp_acknowledgements_path = tmp_dir.path().join("acknowledgements.bin"); let tmp_metadata_path = tmp_dir.path().join("metadata.yaml"); // Build the cache // Include the BAT_CONFIG_PATH and BAT_THEME environment variables to ensure that // options loaded from a config or the environment are not inserted // before the cache subcommand, which would break it. bat_with_config() .current_dir(Path::new(EXAMPLES_DIR).join(src_dir)) .env("BAT_CONFIG_PATH", "bat.conf") .env("BAT_THEME", "1337") .arg("cache") .arg("--build") .arg("--blank") .arg("--source") .arg(".") .arg("--target") .arg(tmp_dir.path().to_str().unwrap()) .arg("--acknowledgements") .assert() .success() .stdout( predicate::str::is_match( "Writing theme set to .*/themes.bin ... okay Writing syntax set to .*/syntaxes.bin ... okay Writing acknowledgements to .*/acknowledgements.bin ... okay Writing metadata to folder .* ... okay", ) .unwrap(), ); // Now we expect the files to exist. If they exist, we assume contents are correct assert!(tmp_themes_path.exists()); assert!(tmp_syntaxes_path.exists()); assert!(tmp_acknowledgements_path.exists()); assert!(tmp_metadata_path.exists()); } #[test] fn utf16() { // The output will be converted to UTF-8 with the leading UTF-16 // BOM removed. This behavior is wanted in interactive mode as // some terminals seem to display the BOM character as a space, // and it also breaks syntax highlighting. bat() .arg("--plain") .arg("--decorations=always") .arg("test_UTF-16LE.txt") .assert() .success() .stdout("hello world\n"); } // Regression test for https://github.com/sharkdp/bat/issues/1922 #[test] fn bom_not_stripped_in_loop_through_mode() { bat() .arg("--plain") .arg("--decorations=never") .arg("--color=never") .arg("test_BOM.txt") .assert() .success() .stdout("\u{feff}hello world\n"); } // Regression test for https://github.com/sharkdp/bat/issues/1922 #[test] fn bom_stripped_when_colored_output() { bat() .arg("--color=always") .arg("--decorations=never") .arg("test_BOM.txt") .assert() .success() .stdout( predicate::str::is_match("\u{1b}\\[38;5;[0-9]{3}mhello world\u{1b}\\[0m\n").unwrap(), ); } // Regression test for https://github.com/sharkdp/bat/issues/1922 #[test] fn bom_stripped_when_no_color_and_not_loop_through() { bat() .arg("--color=never") .arg("--decorations=always") .arg("--style=numbers,grid,header") .arg("--terminal-width=80") .arg("test_BOM.txt") .assert() .success() .stdout( "\ ─────┬────────────────────────────────────────────────────────────────────────── β”‚ File: test_BOM.txt ─────┼────────────────────────────────────────────────────────────────────────── 1 β”‚ hello world ─────┴────────────────────────────────────────────────────────────────────────── ", ); } // Regression test for https://github.com/sharkdp/bat/issues/2541 #[test] fn no_broken_osc_emit_with_line_wrapping() { bat() .arg("--color=always") .arg("--decorations=never") .arg("--wrap=character") .arg("--terminal-width=40") .arg("regression_tests/issue_2541.txt") .assert() .success() .stdout(predicate::function(|s: &str| s.lines().count() == 1)); } #[test] fn can_print_file_named_cache() { bat_with_config() .arg("cache") .assert() .success() .stdout("test\n") .stderr(""); } #[test] fn can_print_file_named_cache_with_additional_argument() { bat_with_config() .arg("cache") .arg("test.txt") .assert() .success() .stdout("test\nhello world\n") .stderr(""); } #[test] fn can_print_file_starting_with_cache() { bat_with_config() .arg("cache.c") .assert() .success() .stdout("test\n") .stderr(""); } #[test] fn does_not_print_unwanted_file_named_cache() { bat_with_config().arg("cach").assert().failure(); } #[test] fn accepts_no_custom_assets_arg() { // Just make sure --no-custom-assets is considered a valid arg // Don't bother to actually verify that it works bat() .arg("--no-custom-assets") .arg("test.txt") .assert() .success(); } #[test] fn unicode_wrap() { bat_with_config() .arg("unicode-wrap.txt") .arg("--style=numbers,snip") .arg("--decorations=always") .arg("--terminal-width=40") .assert() .success() .stdout( " 1 γƒ“γ‚ΏγƒŸγƒ³A γƒ“γ‚ΏγƒŸγƒ³D γƒ“γ‚ΏγƒŸγƒ³E ビ γ‚ΏγƒŸγƒ³K γƒ“γ‚ΏγƒŸγƒ³B1 γƒ“γ‚ΏγƒŸγƒ³B2 γƒŠ むをシン γƒ‘γƒ³γƒˆγƒ†γƒ³ι…Έ γƒ“γ‚ΏγƒŸγƒ³B6 γƒ“γ‚ΏγƒŸγƒ³B12 葉酸 ビγ‚ͺチン ビタ γƒŸγƒ³C 2 3 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 고양이 4 5 1 บวก 2 บวก 3 บวก 4 บวก 5 บวก 6 บวก 7 บวก 8 บวก 9 บวก 10 บวก 11 บวก 12 บวก 13 บวก 14 บวก 15 บวก 16 บวก 17 บวก 18 บวก 19 บวก 20 6 7 Π‘Π΅Π»ΡŒΠ³ΠΈΡ Болгария ЧСхия Дания Π“Π΅Ρ€ΠΌΠ°Π½ ия Эстония Π˜Ρ€Π»Π°Π½Π΄ΠΈΡ ГрСция Испания Ѐранция Π₯орватия Π˜Ρ‚Π°Π»ΠΈΡ ΠšΠΈΠΏΡ€ Латвия Π›ΠΈΡ‚Π²Π° Π›ΡŽΠΊΡΠ΅ΠΌΠ±ΡƒΡ€Π³ ВСнгрия ΠœΠ°Π»ΡŒΡ‚Π° Ни Π΄Π΅Ρ€Π»Π°Π½Π΄Ρ‹ Австрия Польша ΠŸΠΎΡ€Ρ‚ΡƒΠ³Π°Π»ΠΈΡ Румыния БловСния Бловакия Ѐинляндия ШвСция ВСликобритания ", ); } #[test] fn snip() { bat() .arg("multiline.txt") .arg("--style=numbers,snip") .arg("--decorations=always") .arg("--line-range=1:2") .arg("--line-range=4:") .arg("--terminal-width=80") .assert() .success() .stdout( " 1 line 1 2 line 2 ...─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ 8< ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ 4 line 4 ", ); } #[test] fn empty_file_leads_to_empty_output_with_grid_enabled() { bat() .arg("empty.txt") .arg("--style=grid") .arg("--decorations=always") .arg("--terminal-width=80") .assert() .success() .stdout(""); } #[test] fn empty_file_leads_to_empty_output_with_rule_enabled() { bat() .arg("empty.txt") .arg("--style=rule") .arg("--decorations=always") .arg("--terminal-width=80") .assert() .success() .stdout(""); } #[test] fn header_basic() { bat() .arg("test.txt") .arg("--decorations=always") .arg("--style=header") .arg("-r=0:0") .arg("--file-name=foo") .assert() .success() .stdout("File: foo\n") .stderr(""); } #[test] fn header_full_basic() { bat() .arg("test.txt") .arg("--decorations=always") .arg("--style=header-filename,header-filesize") .arg("-r=0:0") .arg("--file-name=foo") .assert() .success() .stdout("File: foo\nSize: 12 B\n") .stderr(""); } #[test] fn header_env_basic() { bat_with_config() .env("BAT_STYLE", "header-filename,header-filesize") .arg("test.txt") .arg("--decorations=always") .arg("-r=0:0") .arg("--file-name=foo") .assert() .success() .stdout("File: foo\nSize: 12 B\n") .stderr(""); } #[test] fn header_arg_overrides_env() { bat_with_config() .env("BAT_STYLE", "header-filesize") .arg("test.txt") .arg("--decorations=always") .arg("--style=header-filename") .arg("-r=0:0") .arg("--file-name=foo") .assert() .success() .stdout("File: foo\n") .stderr(""); } #[test] fn header_binary() { bat() .arg("test.binary") .arg("--decorations=always") .arg("--style=header") .arg("-r=0:0") .arg("--file-name=foo") .assert() .success() .stdout("File: foo \n") .stderr(""); } #[test] fn header_full_binary() { bat() .arg("test.binary") .arg("--decorations=always") .arg("--style=header-filename,header-filesize") .arg("-r=0:0") .arg("--file-name=foo") .assert() .success() .stdout("File: foo \nSize: 4 B\n") .stderr(""); } #[test] #[cfg(not(feature = "git"))] fn header_narrow_terminal() { bat() .arg("--terminal-width=30") .arg("--decorations=always") .arg("this-file-path-is-really-long-and-would-have-broken-the-layout-of-the-header.txt") .assert() .success() .stdout( "\ ─────┬──────────────────────── β”‚ File: this-file-path-is β”‚ -really-long-and-would- β”‚ have-broken-the-layout- β”‚ of-the-header.txt ─────┼──────────────────────── 1 β”‚ The header is not broke β”‚ n ─────┴──────────────────────── ", ) .stderr(""); } #[test] fn header_very_narrow_terminal() { bat() .arg("--terminal-width=10") .arg("--decorations=always") .arg("this-file-path-is-really-long-and-would-have-broken-the-layout-of-the-header.txt") .assert() .success() .stdout( "\ ────────── File: this -file-path -is-really -long-and- would-have -broken-th e-layout-o f-the-head er.txt ────────── The header is not br oken ────────── ", ) .stderr(""); } #[test] #[cfg(feature = "git")] // Expected output assumes git is enabled fn header_default() { bat() .arg("--paging=never") .arg("--color=never") .arg("--terminal-width=80") .arg("--wrap=never") .arg("--decorations=always") .arg("--style=default") .arg("single-line.txt") .assert() .success() .stdout( "\ ───────┬──────────────────────────────────────────────────────────────────────── β”‚ File: single-line.txt ───────┼──────────────────────────────────────────────────────────────────────── 1 β”‚ Single Line ───────┴──────────────────────────────────────────────────────────────────────── ", ) .stderr(""); } #[test] #[cfg(feature = "git")] // Expected output assumes git is enabled fn header_default_is_default() { bat() .arg("--paging=never") .arg("--color=never") .arg("--terminal-width=80") .arg("--wrap=never") .arg("--decorations=always") .arg("single-line.txt") .assert() .success() .stdout( "\ ───────┬──────────────────────────────────────────────────────────────────────── β”‚ File: single-line.txt ───────┼──────────────────────────────────────────────────────────────────────── 1 β”‚ Single Line ───────┴──────────────────────────────────────────────────────────────────────── ", ) .stderr(""); } #[test] fn filename_stdin() { bat() .arg("--decorations=always") .arg("--style=header") .arg("-r=0:0") .arg("-") .write_stdin("stdin\n") .arg("--file-name=foo") .assert() .success() .stdout("File: foo\n") .stderr(""); } #[test] fn filename_stdin_binary() { let vec = vec![0; 1]; bat_with_config() .arg("--decorations=always") .arg("--style=header") .write_stdin(vec) .arg("--file-name=foo") .assert() .success() .stdout("File: foo \n") .stderr(""); } #[test] fn filename_multiple_ok() { bat() .arg("--decorations=always") .arg("--style=header") .arg("-r=0:0") .arg("test.txt") .arg("--file-name=foo") .arg("single-line.txt") .arg("--file-name=bar") .assert() .success() .stdout("File: foo\n\nFile: bar\n") .stderr(""); } #[test] fn filename_multiple_err() { bat() .arg("--decorations=always") .arg("--style=header") .arg("-r=0:0") .arg("test.txt") .arg("--file-name=foo") .arg("single-line.txt") .assert() .failure(); } #[test] fn header_padding() { bat() .arg("--decorations=always") .arg("--style=header") .arg("test.txt") .arg("single-line.txt") .assert() .stdout("File: test.txt\nhello world\n\nFile: single-line.txt\nSingle Line\n") .stderr(""); } #[test] fn header_full_padding() { bat() .arg("--decorations=always") .arg("--style=header-filename,header-filesize") .arg("test.txt") .arg("single-line.txt") .assert() .stdout("File: test.txt\nSize: 12 B\nhello world\n\nFile: single-line.txt\nSize: 11 B\nSingle Line\n") .stderr(""); } #[test] fn header_padding_rule() { bat() .arg("--decorations=always") .arg("--style=header,rule") .arg("--terminal-width=80") .arg("test.txt") .arg("single-line.txt") .assert() .stdout( "File: test.txt hello world ──────────────────────────────────────────────────────────────────────────────── File: single-line.txt Single Line ", ) .stderr(""); } #[test] fn header_full_padding_rule() { bat() .arg("--decorations=always") .arg("--style=header-filename,header-filesize,rule") .arg("--terminal-width=80") .arg("test.txt") .arg("single-line.txt") .assert() .stdout( "File: test.txt Size: 12 B hello world ──────────────────────────────────────────────────────────────────────────────── File: single-line.txt Size: 11 B Single Line ", ) .stderr(""); } #[test] fn grid_overrides_rule() { bat() .arg("--decorations=always") .arg("--style=grid,rule") .arg("--terminal-width=80") .arg("test.txt") .arg("single-line.txt") .assert() .stdout( "\ ──────────────────────────────────────────────────────────────────────────────── hello world ──────────────────────────────────────────────────────────────────────────────── ──────────────────────────────────────────────────────────────────────────────── Single Line ──────────────────────────────────────────────────────────────────────────────── ", ) .stderr( "\x1b[33m[bat warning]\x1b[0m: Style 'rule' is a subset of style 'grid', 'rule' will not be visible.\n", ); } #[cfg(target_os = "linux")] #[test] fn file_with_invalid_utf8_filename() { use std::ffi::OsStr; use std::fs::File; use std::io::Write; use std::os::unix::ffi::OsStrExt; let tmp_dir = tempdir().expect("can create temporary directory"); let file_path = tmp_dir .path() .join(OsStr::from_bytes(b"test-invalid-utf8-\xC3(.rs")); { let mut file = File::create(&file_path).expect("can create temporary file"); writeln!(file, "dummy content").expect("can write to file"); } bat() .arg(file_path.as_os_str()) .assert() .success() .stdout("dummy content\n"); } #[test] fn do_not_panic_regression_tests() { for filename in &[ "issue_28.md", "issue_190.md", "issue_314.hs", "issue_914.rb", "issue_915.vue", ] { bat() .arg("--color=always") .arg(&format!("regression_tests/{filename}")) .assert() .success(); } } #[test] fn do_not_detect_different_syntax_for_stdin_and_files() { let file = "regression_tests/issue_985.js"; let cmd_for_file = bat() .arg("--color=always") .arg("--map-syntax=*.js:Markdown") .arg(&format!("--file-name={file}")) .arg("--style=plain") .arg(file) .assert() .success(); let cmd_for_stdin = bat() .arg("--color=always") .arg("--map-syntax=*.js:Markdown") .arg("--style=plain") .arg(&format!("--file-name={file}")) .pipe_stdin(Path::new(EXAMPLES_DIR).join(file)) .unwrap() .assert() .success(); assert_eq!( from_utf8(&cmd_for_file.get_output().stdout).expect("output is valid utf-8"), from_utf8(&cmd_for_stdin.get_output().stdout).expect("output is valid utf-8") ); } #[test] fn no_first_line_fallback_when_mapping_to_invalid_syntax() { let file = "regression_tests/first_line_fallback.invalid-syntax"; bat() .arg("--color=always") .arg("--map-syntax=*.invalid-syntax:InvalidSyntax") .arg(&format!("--file-name={file}")) .arg("--style=plain") .arg(file) .assert() .failure() .stderr(predicate::str::contains("unknown syntax: 'InvalidSyntax'")); } #[test] fn show_all_mode() { bat() .arg("--show-all") .arg("nonprintable.txt") .assert() .stdout("helloΒ·world␊\nβ”œβ”€β”€β”€ββ€β‡βˆβ›") .stderr(""); } #[test] fn show_all_extends_tab_markers_to_next_tabstop() { bat() .arg("tabs.txt") .arg("--show-all") .arg("--tabs=4") .arg("--style=plain") .assert() .success() .stdout( "β”œβ”€β”€β”€1β”œβ”€β”€2β”œβ”€β”€3β”œβ”€β”€4␊ 1β”œβ”€β”€?␊ 22β”œβ”€?␊ 333β†Ή?␊ 4444β”œβ”€β”€β”€?␊ 55555β”œβ”€β”€?␊ 666666β”œβ”€?␊ 7777777β†Ή?␊ 88888888β”œβ”€β”€β”€?␊ ", ); } #[test] fn show_all_extends_tab_markers_to_next_tabstop_width_8() { bat() .arg("tabs.txt") .arg("--show-all") .arg("--tabs=8") .arg("--style=plain") .assert() .success() .stdout( "β”œβ”€β”€β”€β”€β”€β”€β”€1β”œβ”€β”€β”€β”€β”€β”€2β”œβ”€β”€β”€β”€β”€β”€3β”œβ”€β”€β”€β”€β”€β”€4␊ 1β”œβ”€β”€β”€β”€β”€β”€?␊ 22β”œβ”€β”€β”€β”€β”€?␊ 333β”œβ”€β”€β”€β”€?␊ 4444β”œβ”€β”€β”€?␊ 55555β”œβ”€β”€?␊ 666666β”œβ”€?␊ 7777777β†Ή?␊ 88888888β”œβ”€β”€β”€β”€β”€β”€β”€?␊ ", ); } #[test] fn show_all_with_caret_notation() { bat() .arg("--show-all") .arg("--nonprintable-notation=caret") .arg("nonprintable.txt") .assert() .stdout("helloΒ·world^J\nβ”œβ”€β”€β”€^M^@^G^H^[") .stderr(""); bat() .arg("--show-all") .arg("--nonprintable-notation=caret") .arg("control_characters.txt") .assert() .stdout("^@^A^B^C^D^E^F^G^Hβ”œβ”€β”€^J\n^K^L^M^N^O^P^Q^R^S^T^U^V^W^X^Y^Z^[^\\^]^^^_^?") .stderr(""); } #[test] fn show_all_with_unicode() { bat() .arg("--show-all") .arg("--nonprintable-notation=unicode") .arg("control_characters.txt") .assert() .stdout("β€ββ‚βƒβ„β…β†β‡βˆβ”œβ”€β”€βŠ\nβ‹βŒββŽβββ‘β’β“β”β•β–β—β˜β™βšβ›βœββžβŸβ‘") .stderr(""); } #[test] fn binary_as_text() { bat() .arg("--binary=as-text") .arg("control_characters.txt") .assert() .stdout("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x7F") .stderr(""); } #[test] fn no_paging_arg() { bat() .arg("--no-paging") .arg("--color=never") .arg("--decorations=never") .arg("single-line.txt") .assert() .success() .stdout("Single Line"); } #[test] fn no_paging_short_arg() { bat() .arg("-P") .arg("--color=never") .arg("--decorations=never") .arg("single-line.txt") .assert() .success() .stdout("Single Line"); } #[test] fn no_pager_arg() { bat() .arg("--no-pager") .arg("--color=never") .arg("--decorations=never") .arg("single-line.txt") .assert() .success() .stdout("Single Line"); } #[test] fn plain_mode_does_not_add_nonexisting_newline() { bat() .arg("--paging=never") .arg("--color=never") .arg("--decorations=always") .arg("--style=plain") .arg("single-line.txt") .assert() .success() .stdout("Single Line"); } // Regression test for https://github.com/sharkdp/bat/issues/299 #[test] #[cfg(feature = "git")] // Expected output assumes git is enabled fn grid_for_file_without_newline() { bat() .arg("--paging=never") .arg("--color=never") .arg("--terminal-width=80") .arg("--wrap=never") .arg("--decorations=always") .arg("--style=full") .arg("single-line.txt") .assert() .success() .stdout( "\ ───────┬──────────────────────────────────────────────────────────────────────── β”‚ File: single-line.txt β”‚ Size: 11 B ───────┼──────────────────────────────────────────────────────────────────────── 1 β”‚ Single Line ───────┴──────────────────────────────────────────────────────────────────────── ", ) .stderr(""); } // For ANSI theme, use underscore as a highlighter #[test] fn ansi_highlight_underline() { bat() .arg("--paging=never") .arg("--color=never") .arg("--terminal-width=80") .arg("--wrap=never") .arg("--decorations=always") .arg("--theme=ansi") .arg("--style=plain") .arg("--highlight-line=1") .write_stdin("Ansi Underscore Test\nAnother Line") .assert() .success() .stdout("\x1B[4mAnsi Underscore Test\n\x1B[24mAnother Line") .stderr(""); } // Ensure that ANSI passthrough is emitted properly for both wrapping and non-wrapping printer. // See https://github.com/sharkdp/bat/issues/2307 for what common use case this test tests. #[test] fn ansi_passthrough_emit() { for wrapping in &["never", "character"] { bat() .arg("--paging=never") .arg("--color=never") .arg("--terminal-width=80") .arg(format!("--wrap={wrapping}")) .arg("--decorations=always") .arg("--style=plain") .write_stdin("\x1B[33mColor\nColor \x1B[m\nPlain\n") .assert() .success() .stdout("\x1B[33m\x1B[33mColor\n\x1B[33mColor \x1B[m\nPlain\n") .stderr(""); } } // Ensure that a simple ANSI sequence passthrough is emitted properly on wrapped lines. // This also helps ensure that escape sequences are counted as part of the visible characters when wrapping. #[test] fn ansi_sgr_emitted_when_wrapped() { bat() .arg("--paging=never") .arg("--color=never") .arg("--terminal-width=20") .arg("--wrap=character") .arg("--decorations=always") .arg("--style=plain") .write_stdin("\x1B[33mColor...............Also color.\n") .assert() .success() .stdout("\x1B[33m\x1B[33mColor...............\n\x1B[33mAlso color.\n") // FIXME: ~~~~~~~~ should not be emitted twice. .stderr(""); } // Ensure that a simple ANSI sequence passthrough is emitted properly on wrapped lines. // This also helps ensure that escape sequences are counted as part of the visible characters when wrapping. #[test] fn ansi_hyperlink_emitted_when_wrapped() { bat() .arg("--paging=never") .arg("--color=never") .arg("--terminal-width=20") .arg("--wrap=character") .arg("--decorations=always") .arg("--style=plain") .write_stdin("\x1B]8;;http://example.com/\x1B\\Hyperlinks..........Wrap across lines.\n") .assert() .success() .stdout("\x1B]8;;http://example.com/\x1B\\\x1B]8;;http://example.com/\x1B\\Hyperlinks..........\x1B]8;;\x1B\\\n\x1B]8;;http://example.com/\x1B\\Wrap across lines.\n") // FIXME: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ should not be emitted twice. .stderr(""); } // Ensure that multiple ANSI sequence SGR attributes are combined when emitted on wrapped lines. #[test] fn ansi_sgr_joins_attributes_when_wrapped() { bat() .arg("--paging=never") .arg("--color=never") .arg("--terminal-width=20") .arg("--wrap=character") .arg("--decorations=always") .arg("--style=plain") .write_stdin("\x1B[33mColor. \x1B[1mBold.........Also bold and color.\n") .assert() .success() .stdout("\x1B[33m\x1B[33mColor. \x1B[1m\x1B[33m\x1B[1mBold.........\n\x1B[33m\x1B[1mAlso bold and color.\n") // FIXME: ~~~~~~~~ ~~~~~~~~~~~~~~~ should not be emitted twice. .stderr(""); } #[test] fn ignored_suffix_arg() { bat() .arg("-f") .arg("--theme") .arg("Monokai Extended") .arg("-p") .arg("test.json~") .assert() .success() .stdout("\u{1b}[38;5;231m{\u{1b}[0m\u{1b}[38;5;208m\"\u{1b}[0m\u{1b}[38;5;208mtest\u{1b}[0m\u{1b}[38;5;208m\"\u{1b}[0m\u{1b}[38;5;231m:\u{1b}[0m\u{1b}[38;5;231m \u{1b}[0m\u{1b}[38;5;186m\"\u{1b}[0m\u{1b}[38;5;186mvalue\u{1b}[0m\u{1b}[38;5;186m\"\u{1b}[0m\u{1b}[38;5;231m}\u{1b}[0m") .stderr(""); bat() .arg("-f") .arg("--theme") .arg("Monokai Extended") .arg("-p") .arg("--ignored-suffix=.suffix") .arg("test.json.suffix") .assert() .success() .stdout("\u{1b}[38;5;231m{\u{1b}[0m\u{1b}[38;5;208m\"\u{1b}[0m\u{1b}[38;5;208mtest\u{1b}[0m\u{1b}[38;5;208m\"\u{1b}[0m\u{1b}[38;5;231m:\u{1b}[0m\u{1b}[38;5;231m \u{1b}[0m\u{1b}[38;5;186m\"\u{1b}[0m\u{1b}[38;5;186mvalue\u{1b}[0m\u{1b}[38;5;186m\"\u{1b}[0m\u{1b}[38;5;231m}\u{1b}[0m") .stderr(""); bat() .arg("-f") .arg("--theme") .arg("Monokai Extended") .arg("-p") .arg("test.json.suffix") .assert() .success() .stdout("\u{1b}[38;5;231m{\"test\": \"value\"}\u{1b}[0m") .stderr(""); } fn wrapping_test(wrap_flag: &str, expect_wrap: bool) { let expected = match expect_wrap { true => "abcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyzabcde\nfghigklmnopqrstuvxyz\n", false => "abcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyzabcdefghigklmnopqrstuvxyz\n", }; bat() .arg(wrap_flag) .arg("--style=rule") .arg("--color=never") .arg("--decorations=always") .arg("--terminal-width=80") .arg("long-single-line.txt") .assert() .success() .stdout(expected.to_owned()) .stderr(""); } #[test] fn no_line_wrapping_when_set_to_never() { wrapping_test("--wrap=never", false); } #[test] fn line_wrapping_when_auto() { wrapping_test("--wrap=auto", true); } #[test] fn no_line_wrapping_with_s_flag() { wrapping_test("-S", false); } #[test] fn no_wrapping_with_chop_long_lines() { wrapping_test("--chop-long-lines", false); } #[test] fn theme_arg_overrides_env() { bat() .env("BAT_THEME", "TwoDark") .arg("--paging=never") .arg("--color=never") .arg("--terminal-width=80") .arg("--wrap=never") .arg("--decorations=always") .arg("--theme=ansi") .arg("--style=plain") .arg("--highlight-line=1") .write_stdin("Ansi Underscore Test\nAnother Line") .assert() .success() .stdout("\x1B[4mAnsi Underscore Test\n\x1B[24mAnother Line") .stderr(""); } #[test] fn theme_arg_overrides_env_withconfig() { bat_with_config() .env("BAT_CONFIG_PATH", "bat-theme.conf") .env("BAT_THEME", "TwoDark") .arg("--paging=never") .arg("--color=never") .arg("--terminal-width=80") .arg("--wrap=never") .arg("--decorations=always") .arg("--theme=ansi") .arg("--style=plain") .arg("--highlight-line=1") .write_stdin("Ansi Underscore Test\nAnother Line") .assert() .success() .stdout("\x1B[4mAnsi Underscore Test\n\x1B[24mAnother Line") .stderr(""); } #[test] fn theme_env_overrides_config() { bat_with_config() .env("BAT_CONFIG_PATH", "bat-theme.conf") .env("BAT_THEME", "ansi") .arg("--paging=never") .arg("--color=never") .arg("--terminal-width=80") .arg("--wrap=never") .arg("--decorations=always") .arg("--style=plain") .arg("--highlight-line=1") .write_stdin("Ansi Underscore Test\nAnother Line") .assert() .success() .stdout("\x1B[4mAnsi Underscore Test\n\x1B[24mAnother Line") .stderr(""); } #[test] fn highlighting_is_skipped_on_long_lines() { let expected = "\u{1b}[38;5;231m{\u{1b}[0m\u{1b}[38;5;208m\"\u{1b}[0m\u{1b}[38;5;208mapi\u{1b}[0m\u{1b}[38;5;208m\"\u{1b}[0m\u{1b}[38;5;231m:\u{1b}[0m\n".to_owned() + "\u{1b}" + r#"[38;5;231m {"ANGLE_instanced_arrays":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/ANGLE_instanced_arrays","spec_url":"https://www.khronos.org/registry/webgl/extensions/ANGLE_instanced_arrays/","support":{"chrome":{"version_added":"32"},"chrome_android":{"version_added":"32"},"edge":{"version_added":"12"},"firefox":{"version_added":"47"},"firefox_android":{"version_added":true},"ie":{"version_added":"11"},"opera":{"version_added":"19"},"opera_android":{"version_added":"19"},"safari":{"version_added":"8"},"safari_ios":{"version_added":"8"},"samsunginternet_android":{"version_added":"2.0"},"webview_android":{"version_added":"4.4"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}},"drawArraysInstancedANGLE":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/ANGLE_instanced_arrays/drawArraysInstancedANGLE","spec_url":"https://www.khronos.org/registry/webgl/extensions/ANGLE_instanced_arrays/","support":{"chrome":{"version_added":"32"},"chrome_android":{"version_added":"32"},"edge":{"version_added":"12"},"firefox":{"version_added":"47"},"firefox_android":{"version_added":true},"ie":{"version_added":"11"},"opera":{"version_added":"19"},"opera_android":{"version_added":"19"},"safari":{"version_added":"8"},"safari_ios":{"version_added":"8"},"samsunginternet_android":{"version_added":"2.0"},"webview_android":{"version_added":"4.4"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}}},"drawElementsInstancedANGLE":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/ANGLE_instanced_arrays/drawElementsInstancedANGLE","spec_url":"https://www.khronos.org/registry/webgl/extensions/ANGLE_instanced_arrays/","support":{"chrome":{"version_added":"32"},"chrome_android":{"version_added":"32"},"edge":{"version_added":"12"},"firefox":{"version_added":"47"},"firefox_android":{"version_added":true},"ie":{"version_added":"11"},"opera":{"version_added":"19"},"opera_android":{"version_added":"19"},"safari":{"version_added":"8"},"safari_ios":{"version_added":"8"},"samsunginternet_android":{"version_added":"2.0"},"webview_android":{"version_added":"4.4"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}}},"vertexAttribDivisorANGLE":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/ANGLE_instanced_arrays/vertexAttribDivisorANGLE","spec_url":"https://www.khronos.org/registry/webgl/extensions/ANGLE_instanced_arrays/","support":{"chrome":{"version_added":"32"},"chrome_android":{"version_added":"32"},"edge":{"version_added":"12"},"firefox":{"version_added":"47"},"firefox_android":{"version_added":true},"ie":{"version_added":"11"},"opera":{"version_added":"19"},"opera_android":{"version_added":"19"},"safari":{"version_added":"8"},"safari_ios":{"version_added":"8"},"samsunginternet_android":{"version_added":"2.0"},"webview_android":{"version_added":"4.4"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}}}},"AbortController":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortController","spec_url":"https://dom.spec.whatwg.org/#interface-abortcontroller","support":{"chrome":{"version_added":"66"},"chrome_android":{"version_added":"66"},"edge":{"version_added":"16"},"firefox":{"version_added":"57"},"firefox_android":{"version_added":"57"},"ie":{"version_added":false},"nodejs":{"version_added":"15.0.0"},"opera":{"version_added":"53"},"opera_android":{"version_added":"47"},"safari":[{"version_added":"12.1"},{"version_added":"11.1","partial_implementation":true,"notes":"Even though window.AbortController is defined, it doesn't really abort fetch requests. See bug 174980."}],"safari_ios":[{"version_added":"12.2"},{"version_added":"11.3","partial_implementation":true,"notes":"Even though window.AbortController is defined, it doesn't really abort fetch requests. See bug 174980."}],"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"66"}},"status":{"experimental":true,"standard_track":true,"deprecated":false}},"AbortController":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortController/AbortController","spec_url":"https://dom.spec.whatwg.org/#ref-for-dom-abortcontroller-abortcontrollerβ‘ ","description":"AbortController() constructor","support":{"chrome":{"version_added":"66"},"chrome_android":{"version_added":"66"},"edge":{"version_added":"16"},"firefox":{"version_added":"57"},"firefox_android":{"version_added":"57"},"ie":{"version_added":false},"nodejs":{"version_added":"15.0.0"},"opera":{"version_added":"53"},"opera_android":{"version_added":"47"},"safari":[{"version_added":"12.1"},{"version_added":"11.1","partial_implementation":true,"notes":"Even though window.AbortController is defined, it doesn't really abort fetch requests. See bug 174980."}],"safari_ios":[{"version_added":"12.2"},{"version_added":"11.3","partial_implementation":true,"notes":"Even though window.AbortController is defined, it doesn't really abort fetch requests. See bug 174980."}],"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"66"}},"status":{"experimental":true,"standard_track":true,"deprecated":false}}},"abort":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortController/abort","spec_url":"https://dom.spec.whatwg.org/#ref-for-dom-abortcontroller-abortcontrollerβ‘ ","support":{"chrome":{"version_added":"66"},"chrome_android":{"version_added":"66"},"edge":{"version_added":"16"},"firefox":{"version_added":"57"},"firefox_android":{"version_added":"57"},"ie":{"version_added":false},"nodejs":{"version_added":"15.0.0"},"opera":{"version_added":"53"},"opera_android":{"version_added":"47"},"safari":[{"version_added":"12.1"},{"version_added":"11.1","partial_implementation":true,"notes":"Even though window.AbortController is defined, it doesn't really abort fetch requests. See bug 174980."}],"safari_ios":[{"version_added":"12.2"},{"version_added":"11.3","partial_implementation":true,"notes":"Even though window.AbortController is defined, it doesn't really abort fetch requests. See bug 174980."}],"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"66"}},"status":{"experimental":true,"standard_track":true,"deprecated":false}}},"signal":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortController/signal","spec_url":"https://dom.spec.whatwg.org/#ref-for-dom-abortcontroller-signalβ‘‘","support":{"chrome":{"version_added":"66"},"chrome_android":{"version_added":"66"},"edge":{"version_added":"16"},"firefox":{"version_added":"57"},"firefox_android":{"version_added":"57"},"ie":{"version_added":false},"nodejs":{"version_added":"15.0.0"},"opera":{"version_added":"53"},"opera_android":{"version_added":"47"},"safari":[{"version_added":"12.1"},{"version_added":"11.1","partial_implementation":true,"notes":"Even though window.AbortController is defined, it doesn't really abort fetch requests. See bug 174980."}],"safari_ios":[{"version_added":"12.2"},{"version_added":"11.3","partial_implementation":true,"notes":"Even though window.AbortController is defined, it doesn't really abort fetch requests. See bug 174980."}],"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"66"}},"status":{"experimental":true,"standard_track":true,"deprecated":false}}}},"AbortPaymentEvent":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortPaymentEvent","support":{"chrome":{"version_added":"70"},"chrome_android":{"version_added":"70"},"edge":{"version_added":"79"},"firefox":{"version_added":false},"firefox_android":{"version_added":false},"ie":{"version_added":false},"opera":{"version_added":"57"},"opera_android":{"version_added":"49"},"safari":{"version_added":false},"safari_ios":{"version_added":false},"samsunginternet_android":{"version_added":"10.0"},"webview_android":{"version_added":false}},"status":{"experimental":true,"standard_track":false,"deprecated":false}},"AbortPaymentEvent":{"__compat":{"description":"AbortPaymentEvent() constructor","mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortPaymentEvent/AbortPaymentEvent","support":{"chrome":{"version_added":"70"},"chrome_android":{"version_added":"70"},"edge":{"version_added":"79"},"firefox":{"version_added":false},"firefox_android":{"version_added":false},"ie":{"version_added":false},"opera":{"version_added":"57"},"opera_android":{"version_added":"49"},"safari":{"version_added":false},"safari_ios":{"version_added":false},"samsunginternet_android":{"version_added":"10.0"},"webview_android":{"version_added":false}},"status":{"experimental":true,"standard_track":false,"deprecated":false}}},"respondWith":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortPaymentEvent/respondWith","support":{"chrome":{"version_added":"70"},"chrome_android":{"version_added":"70"},"edge":{"version_added":"79"},"firefox":{"version_added":false},"firefox_android":{"version_added":false},"ie":{"version_added":false},"opera":{"version_added":"57"},"opera_android":{"version_added":"49"},"safari":{"version_added":false},"safari_ios":{"version_added":false},"samsunginternet_android":{"version_added":"10.0"},"webview_android":{"version_added":false}},"status":{"experimental":true,"standard_track":false,"deprecated":false}}}},"AbortSignal":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortSignal","spec_url":"https://dom.spec.whatwg.org/#interface-AbortSignal","support":{"chrome":{"version_added":"66"},"chrome_android":{"version_added":"66"},"edge":{"version_added":"16"},"firefox":{"version_added":"57"},"firefox_android":{"version_added":"57"},"ie":{"version_added":false},"nodejs":{"version_added":"15.0.0"},"opera":{"version_added":"53"},"opera_android":{"version_added":"47"},"safari":{"version_added":"11.1"},"safari_ios":{"version_added":"11.3"},"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"66"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}},"abort":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortSignal/abort","spec_url":"https://dom.spec.whatwg.org/#ref-for-dom-abortsignal-abortβ‘ ","support":{"chrome":{"version_added":false},"chrome_android":{"version_added":false},"edge":{"version_added":false},"firefox":{"version_added":"88"},"firefox_android":{"version_added":"88"},"ie":{"version_added":false},"nodejs":{"version_added":false},"opera":{"version_added":false},"opera_android":{"version_added":false},"safari":{"version_added":false},"safari_ios":{"version_added":false},"samsunginternet_android":{"version_added":false},"webview_android":{"version_added":false}},"status":{"experimental":false,"standard_track":true,"deprecated":false}}},"abort_event":{"__compat":{"description":"abort event","mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortSignal/abort_event","spec_url":"https://dom.spec.whatwg.org/#eventdef-abortsignal-abort","support":{"chrome":{"version_added":"66"},"chrome_android":{"version_added":"66"},"edge":{"version_added":"16"},"firefox":{"version_added":"57"},"firefox_android":{"version_added":"57"},"ie":{"version_added":false},"nodejs":{"version_added":"15.0.0"},"opera":{"version_added":"53"},"opera_android":{"version_added":"47"},"safari":{"version_added":"11.1"},"safari_ios":{"version_added":"11.3"},"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"66"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}}},"aborted":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortSignal/aborted","spec_url":"https://dom.spec.whatwg.org/#ref-for-dom-abortsignal-abortedβ‘ ","support":{"chrome":{"version_added":"66"},"chrome_android":{"version_added":"66"},"edge":{"version_added":"16"},"firefox":{"version_added":"57"},"firefox_android":{"version_added":"57"},"ie":{"version_added":false},"nodejs":{"version_added":"15.0.0"},"opera":{"version_added":"53"},"opera_android":{"version_added":"47"},"safari":{"version_added":"11.1"},"safari_ios":{"version_added":"11.3"},"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"66"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}}},"onabort":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbortSignal/onabort","spec_url":"https://dom.spec.whatwg.org/#abortsignal-onabort","support":{"chrome":{"version_added":"66"},"chrome_android":{"version_added":"66"},"edge":{"version_added":"16"},"firefox":{"version_added":"57"},"firefox_android":{"version_added":"57"},"ie":{"version_added":false},"nodejs":{"version_added":"15.0.0"},"opera":{"version_added":"53"},"opera_android":{"version_added":"47"},"safari":{"version_added":"11.1"},"safari_ios":{"version_added":"11.3"},"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"66"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}}}},"AbsoluteOrientationSensor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbsoluteOrientationSensor","spec_url":"https://w3c.github.io/orientation-sensor/#absoluteorientationsensor-interface","support":{"chrome":{"version_added":"67"},"chrome_android":{"version_added":"67"},"edge":{"version_added":"79"},"firefox":{"version_added":false},"firefox_android":{"version_added":false},"ie":{"version_added":false},"opera":{"version_added":"54"},"opera_android":{"version_added":"48"},"safari":{"version_added":false},"safari_ios":{"version_added":false},"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"67"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}},"AbsoluteOrientationSensor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbsoluteOrientationSensor/AbsoluteOrientationSensor","spec_url":"https://w3c.github.io/orientation-sensor/#dom-absoluteorientationsensor-absoluteorientationsensor","description":"AbsoluteOrientationSensor() constructor","support":{"chrome":{"version_added":"67"},"chrome_android":{"version_added":"67"},"edge":{"version_added":"79"},"firefox":{"version_added":false},"firefox_android":{"version_added":false},"ie":{"version_added":false},"opera":{"version_added":"54"},"opera_android":{"version_added":"48"},"safari":{"version_added":false},"safari_ios":{"version_added":false},"samsunginternet_android":{"version_added":"9.0"},"webview_android":{"version_added":"67"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}}}},"AbstractRange":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbstractRange","spec_url":"https://dom.spec.whatwg.org/#interface-abstractrange","support":{"chrome":{"version_added":"90"},"chrome_android":{"version_added":"90"},"edge":[{"version_added":"90"},{"version_added":"18","version_removed":"79"}],"firefox":{"version_added":"69"},"firefox_android":{"version_added":false},"ie":{"version_added":false},"opera":{"version_added":false},"opera_android":{"version_added":false},"safari":{"version_added":"14.1"},"safari_ios":{"version_added":"14.5"},"samsunginternet_android":{"version_added":false},"webview_android":{"version_added":"90"}},"status":{"experimental":false,"standard_track":true,"deprecated":false}},"collapsed":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/API/AbstractRange/collapsed","spec_url":"https://dom.spec.whatwg.org/#ref-for-dom-range-collapsedβ‘ ","support":{"chrome":{"version_added":"90"},"chrome_android":{"version_added":"90"},"edge":[{"version_added":"90"},{"version_added":"18","version_removed":"79"}],"firefox":{"version_added":"69"},"firefox_android":{"version_added":false},"ie":{"version_added":false},"opera":{"version_added":false},"opera_android":"# + "\u{1b}[0m\n\u{1b}[38;5;231m \u{1b}[0m\u{1b}[38;5;231m{\u{1b}[0m\u{1b}[38;5;208m\"\u{1b}[0m\u{1b}[38;5;208mversion_added\u{1b}[0m\u{1b}[38;5;208m\"\u{1b}[0m\u{1b}[38;5;231m:\u{1b}[0m\u{1b}[38;5;141mfalse\u{1b}[0m\u{1b}[38;5;231m}\u{1b}[0m\n"; bat() .arg("-f") .arg("--theme") .arg("Monokai Extended") .arg("-p") .arg("longline.json") .assert() .success() .stdout(expected) .stderr(""); } #[test] fn all_global_git_config_locations_syntax_mapping_work() { let fake_home = Path::new(EXAMPLES_DIR).join("git").canonicalize().unwrap(); let expected = "\u{1b}[38;5;231m[\u{1b}[0m\u{1b}[38;5;149muser\u{1b}[0m\u{1b}[38;5;231m]\u{1b}[0m \u{1b}[38;5;231m \u{1b}[0m\u{1b}[38;5;231memail\u{1b}[0m\u{1b}[38;5;231m \u{1b}[0m\u{1b}[38;5;203m=\u{1b}[0m\u{1b}[38;5;231m \u{1b}[0m\u{1b}[38;5;186mfoo@bar.net\u{1b}[0m \u{1b}[38;5;231m \u{1b}[0m\u{1b}[38;5;231mname\u{1b}[0m\u{1b}[38;5;231m \u{1b}[0m\u{1b}[38;5;203m=\u{1b}[0m\u{1b}[38;5;231m \u{1b}[0m\u{1b}[38;5;186mfoobar\u{1b}[0m "; bat() .env("XDG_CONFIG_HOME", fake_home.join(".config").as_os_str()) .arg("-f") .arg("--theme") .arg("Monokai Extended") .arg("-p") .arg("git/.config/git/config") .assert() .success() .stdout(expected) .stderr(""); bat() .env("HOME", fake_home.as_os_str()) .arg("-f") .arg("--theme") .arg("Monokai Extended") .arg("-p") .arg("git/.config/git/config") .assert() .success() .stdout(expected) .stderr(""); bat() .env("HOME", fake_home.as_os_str()) .arg("-f") .arg("--theme") .arg("Monokai Extended") .arg("-p") .arg("git/.gitconfig") .assert() .success() .stdout(expected) .stderr(""); } #[test] fn map_syntax_and_ignored_suffix_work_together() { bat() .arg("-f") .arg("--theme") .arg("Monokai Extended") .arg("-p") .arg("--ignored-suffix=.suffix") .arg("--map-syntax=*.demo:JSON") .arg("test.demo.suffix") .assert() .success() .stdout("\u{1b}[38;5;231m{\u{1b}[0m\u{1b}[38;5;208m\"\u{1b}[0m\u{1b}[38;5;208mtest\u{1b}[0m\u{1b}[38;5;208m\"\u{1b}[0m\u{1b}[38;5;231m:\u{1b}[0m\u{1b}[38;5;231m \u{1b}[0m\u{1b}[38;5;186m\"\u{1b}[0m\u{1b}[38;5;186mvalue\u{1b}[0m\u{1b}[38;5;186m\"\u{1b}[0m\u{1b}[38;5;231m}\u{1b}[0m") .stderr(""); bat() .arg("-f") .arg("--theme") .arg("Monokai Extended") .arg("-p") .arg("--ignored-suffix=.suffix") .arg("--ignored-suffix=.foo") .arg("--map-syntax=*.demo:JSON") .arg("test.demo.foo.suffix") .assert() .success() .stdout("\u{1b}[38;5;231m{\u{1b}[0m\u{1b}[38;5;208m\"\u{1b}[0m\u{1b}[38;5;208mtest\u{1b}[0m\u{1b}[38;5;208m\"\u{1b}[0m\u{1b}[38;5;231m:\u{1b}[0m\u{1b}[38;5;231m \u{1b}[0m\u{1b}[38;5;186m\"\u{1b}[0m\u{1b}[38;5;186mvalue\u{1b}[0m\u{1b}[38;5;186m\"\u{1b}[0m\u{1b}[38;5;231m}\u{1b}[0m") .stderr(""); } #[test] fn acknowledgements() { bat() .arg("--acknowledgements") .assert() .success() .stdout( // Just some sanity checking that avoids names of persons, except our own Keith Hall :) predicate::str::contains( "Copyright (c) 2018-2021 bat-developers (https://github.com/sharkdp/bat).", ) .and(predicate::str::contains( "Copyright (c) 2012-2020 The Sublime CMake authors", )) .and(predicate::str::contains( "Copyright 2014-2015 SaltStack Team", )) .and(predicate::str::contains( "Copyright (c) 2013-present Dracula Theme", )) .and(predicate::str::contains( "## syntaxes/01_Packages/Rust/LICENSE.txt", )) .and(predicate::str::contains( "## syntaxes/02_Extra/http-request-response/LICENSE", )) .and(predicate::str::contains( "## themes/dracula-sublime/LICENSE", )) .and(predicate::str::contains("Copyright (c) 2017 b123400")) .and(predicate::str::contains("Copyright (c) 2021 Keith Hall")) .and(predicate::str::contains("Copyright 2014 Clams")), ) .stderr(""); } #[cfg(unix)] // Expected output assumed that tests are run on a Unix-like system #[cfg(feature = "lessopen")] #[test] fn lessopen_file_piped() { bat() .env("LESSOPEN", "|echo File is %s") .arg("--lessopen") .arg("test.txt") .assert() .success() .stdout("File is test.txt\n"); } #[cfg(unix)] // Expected output assumed that tests are run on a Unix-like system #[cfg(feature = "lessopen")] #[test] fn lessopen_stdin_piped() { bat() .env("LESSOPEN", "|cat") .arg("--lessopen") .write_stdin("hello world\n") .assert() .success() .stdout("hello world\n"); } #[cfg(unix)] // Expected output assumed that tests are run on a Unix-like system #[cfg(feature = "lessopen")] #[test] fn lessopen_and_lessclose_file_temp() { // This is mainly to test that $LESSCLOSE gets passed the correct file paths // In this case, the original file and the temporary file returned by $LESSOPEN bat() // Need a %s for $LESSOPEN to be valid .env("LESSOPEN", "echo empty.txt && echo %s >/dev/null") .env("LESSCLOSE", "echo lessclose: %s %s") .arg("--lessopen") .arg("test.txt") .assert() .success() .stdout("lessclose: test.txt empty.txt\n"); } #[cfg(unix)] // Expected output assumed that tests are run on a Unix-like system #[cfg(feature = "lessopen")] #[test] fn lessopen_and_lessclose_file_piped() { // This is mainly to test that $LESSCLOSE gets passed the correct file paths // In these cases, the original file and a dash bat() // This test will not work properly if $LESSOPEN does not output anything .env("LESSOPEN", "|cat %s") .env("LESSCLOSE", "echo lessclose: %s %s") .arg("--lessopen") .arg("test.txt") .assert() .success() .stdout("hello world\nlessclose: test.txt -\n"); bat() .env("LESSOPEN", "||cat %s") .env("LESSCLOSE", "echo lessclose: %s %s") .arg("--lessopen") .arg("empty.txt") .assert() .success() .stdout("lessclose: empty.txt -\n"); } #[cfg(unix)] // Expected output assumed that tests are run on a Unix-like system #[cfg(feature = "lessopen")] #[test] fn lessopen_and_lessclose_stdin_temp() { // This is mainly to test that $LESSCLOSE gets passed the correct file paths // In this case, a dash and the temporary file returned by $LESSOPEN bat() // Need a %s for $LESSOPEN to be valid .env("LESSOPEN", "-echo empty.txt && echo %s >/dev/null") .env("LESSCLOSE", "echo lessclose: %s %s") .arg("--lessopen") .write_stdin("test.txt") .assert() .success() .stdout("lessclose: - empty.txt\n"); } #[cfg(unix)] // Expected output assumed that tests are run on a Unix-like system #[cfg(feature = "lessopen")] #[test] fn lessopen_and_lessclose_stdin_piped() { // This is mainly to test that $LESSCLOSE gets passed the correct file paths // In these cases, two dashes bat() // This test will not work properly if $LESSOPEN does not output anything // Need a %s for $LESSOPEN to be valid .env("LESSOPEN", "|-cat test.txt && echo %s >/dev/null") .env("LESSCLOSE", "echo lessclose: %s %s") .arg("--lessopen") .write_stdin("empty.txt") .assert() .success() .stdout("hello world\nlessclose: - -\n"); bat() // Need a %s for $LESSOPEN to be valid .env("LESSOPEN", "||-cat empty.txt && echo %s >/dev/null") .env("LESSCLOSE", "echo lessclose: %s %s") .arg("--lessopen") .write_stdin("empty.txt") .assert() .success() .stdout("lessclose: - -\n"); } #[cfg(unix)] // Expected output assumed that tests are run on a Unix-like system #[cfg(feature = "lessopen")] #[test] fn lessopen_handling_empty_output_file() { bat() // Need a %s for $LESSOPEN to be valid .env("LESSOPEN", "|cat empty.txt && echo %s >/dev/null") .arg("--lessopen") .arg("test.txt") .assert() .success() .stdout("hello world\n"); bat() // Need a %s for $LESSOPEN to be valid .env("LESSOPEN", "|cat nonexistent.txt && echo %s >/dev/null") .arg("--lessopen") .arg("test.txt") .assert() .success() .stdout("hello world\n"); bat() // Need a %s for $LESSOPEN to be valid .env("LESSOPEN", "||cat empty.txt && echo %s >/dev/null") .arg("--lessopen") .arg("test.txt") .assert() .success() .stdout(""); bat() // Need a %s for $LESSOPEN to be valid .env("LESSOPEN", "||cat nonexistent.txt && echo %s >/dev/null") .arg("--lessopen") .arg("test.txt") .assert() .success() .stdout("hello world\n"); } #[cfg(unix)] // Expected output assumed that tests are run on a Unix-like system #[cfg(feature = "lessopen")] #[test] // FIXME fn lessopen_handling_empty_output_stdin() { bat() // Need a %s for $LESSOPEN to be valid .env("LESSOPEN", "|-cat empty.txt && echo %s >/dev/null") .arg("--lessopen") .write_stdin("hello world\n") .assert() .success() .stdout("hello world\n"); bat() // Need a %s for $LESSOPEN to be valid .env("LESSOPEN", "|-cat nonexistent.txt && echo %s >/dev/null") .arg("--lessopen") .write_stdin("hello world\n") .assert() .success() .stdout("hello world\n"); bat() // Need a %s for $LESSOPEN to be valid .env("LESSOPEN", "||-cat empty.txt && echo %s >/dev/null") .arg("--lessopen") .write_stdin("hello world\n") .assert() .success() .stdout(""); bat() // Need a %s for $LESSOPEN to be valid .env("LESSOPEN", "||-cat nonexistent.txt && echo %s >/dev/null") .arg("--lessopen") .write_stdin("hello world\n") .assert() .success() .stdout("hello world\n"); } #[cfg(unix)] // Expected output assumed that tests are run on a Unix-like system #[cfg(feature = "lessopen")] #[test] fn lessopen_uses_shell() { bat() .env("LESSOPEN", "|cat < %s") .arg("--lessopen") .arg("test.txt") .assert() .success() .stdout("hello world\n"); } #[cfg(unix)] #[cfg(feature = "lessopen")] #[test] fn do_not_use_lessopen_by_default() { bat() .env("LESSOPEN", "|echo File is %s") .arg("test.txt") .assert() .success() .stdout("hello world\n"); } #[cfg(unix)] #[cfg(feature = "lessopen")] #[test] fn do_not_use_lessopen_if_overridden() { bat() .env("LESSOPEN", "|echo File is %s") .arg("--lessopen") .arg("--no-lessopen") .arg("test.txt") .assert() .success() .stdout("hello world\n"); } #[cfg(unix)] #[cfg(feature = "lessopen")] #[test] fn lessopen_validity() { bat() .env("LESSOPEN", "|echo File is test.txt") .arg("--lessopen") .arg("test.txt") .assert() .success() .stdout("hello world\n") .stderr( "\u{1b}[33m[bat warning]\u{1b}[0m: LESSOPEN ignored: must contain exactly one %s\n", ); bat() .env("LESSOPEN", "|echo File is %s") .arg("--lessopen") .arg("test.txt") .assert() .success() .stdout("File is test.txt\n") .stderr(""); bat() .env("LESSOPEN", "|echo %s is %s") .arg("--lessopen") .arg("test.txt") .assert() .success() .stdout("hello world\n") .stderr( "\u{1b}[33m[bat warning]\u{1b}[0m: LESSOPEN ignored: must contain exactly one %s\n", ); } // Regression test for issue #2520 and PR #2650 // Syntax highlighting should be the same regardless of // --map-syntax' case or file extension's case #[test] fn highlighting_independant_from_map_syntax_case() { let expected = bat() .arg("-f") .arg("--map-syntax=*.config:JSON") .arg("map-syntax_case.Config") .assert() .get_output() .stdout .clone(); bat() .arg("-f") .arg("--map-syntax=*.Config:JSON") .arg("map-syntax_case.Config") .assert() .success() .stdout(expected) .stderr(""); } #[test] fn strip_ansi_always_strips_ansi() { bat() .arg("--style=plain") .arg("--decorations=always") .arg("--color=never") .arg("--strip-ansi=always") .write_stdin("\x1B[33mYellow\x1B[m") .assert() .success() .stdout("Yellow"); } #[test] fn strip_ansi_never_does_not_strip_ansi() { let output = String::from_utf8( bat() .arg("--style=plain") .arg("--decorations=always") .arg("--color=never") .arg("--strip-ansi=never") .write_stdin("\x1B[33mYellow\x1B[m") .assert() .success() .get_output() .stdout .clone(), ) .expect("valid utf8"); assert!(output.contains("\x1B[33mYellow")) } #[test] fn strip_ansi_does_not_affect_simple_printer() { let output = String::from_utf8( bat() .arg("--style=plain") .arg("--decorations=never") .arg("--color=never") .arg("--strip-ansi=always") .write_stdin("\x1B[33mYellow\x1B[m") .assert() .success() .get_output() .stdout .clone(), ) .expect("valid utf8"); assert!(output.contains("\x1B[33mYellow")) } #[test] fn strip_ansi_does_not_strip_when_show_nonprintable() { let output = String::from_utf8( bat() .arg("--style=plain") .arg("--decorations=never") .arg("--color=always") .arg("--strip-ansi=always") .arg("--show-nonprintable") .write_stdin("\x1B[33mY") .assert() .success() .get_output() .stdout .clone(), ) .expect("valid utf8"); assert!(output.contains("␛")) } #[test] fn strip_ansi_auto_strips_ansi_when_detected_syntax_by_filename() { bat() .arg("--style=plain") .arg("--decorations=always") .arg("--color=never") .arg("--strip-ansi=auto") .arg("--file-name=test.rs") .write_stdin("fn \x1B[33mYellow\x1B[m() -> () {}") .assert() .success() .stdout("fn Yellow() -> () {}"); } #[test] fn strip_ansi_auto_strips_ansi_when_provided_syntax_by_option() { bat() .arg("--style=plain") .arg("--decorations=always") .arg("--color=never") .arg("--strip-ansi=auto") .arg("--language=rust") .write_stdin("fn \x1B[33mYellow\x1B[m() -> () {}") .assert() .success() .stdout("fn Yellow() -> () {}"); } #[test] fn strip_ansi_auto_does_not_strip_when_plain_text_by_filename() { let output = String::from_utf8( bat() .arg("--style=plain") .arg("--decorations=always") .arg("--color=never") .arg("--strip-ansi=auto") .arg("--file-name=ansi.txt") .write_stdin("\x1B[33mYellow\x1B[m") .assert() .success() .get_output() .stdout .clone(), ) .expect("valid utf8"); assert!(output.contains("\x1B[33mYellow")) } #[test] fn strip_ansi_auto_does_not_strip_ansi_when_plain_text_by_option() { let output = String::from_utf8( bat() .arg("--style=plain") .arg("--decorations=always") .arg("--color=never") .arg("--strip-ansi=auto") .arg("--language=txt") .write_stdin("\x1B[33mYellow\x1B[m") .assert() .success() .get_output() .stdout .clone(), ) .expect("valid utf8"); assert!(output.contains("\x1B[33mYellow")) } // Tests that style components can be removed with `-component`. #[test] fn style_components_can_be_removed() { bat() .arg({ #[cfg(not(feature = "git"))] { "--style=full,-grid" } #[cfg(feature = "git")] { "--style=full,-grid,-changes" } }) .arg("--decorations=always") .arg("--color=never") .write_stdin("test") .assert() .success() .stdout(" STDIN\n Size: -\n 1 test\n") .stderr(""); } // Tests that style components are chosen based on the rightmost `--style` argument. #[test] fn style_components_can_be_overidden() { bat() .arg("--style=full") .arg("--style=header,numbers") .arg("--decorations=always") .arg("--color=never") .write_stdin("test") .assert() .success() .stdout(" STDIN\n 1 test\n") .stderr(""); } // Tests that style components can be merged across multiple `--style` arguments. #[test] fn style_components_will_merge() { bat() .arg("--style=header,grid") .arg("--style=-grid,+numbers") .arg("--decorations=always") .arg("--color=never") .write_stdin("test") .assert() .success() .stdout(" STDIN\n 1 test\n") .stderr(""); } // Tests that style components can be merged with the `BAT_STYLE` environment variable. #[test] fn style_components_will_merge_with_env_var() { bat() .env("BAT_STYLE", "header,grid") .arg("--style=-grid,+numbers") .arg("--decorations=always") .arg("--color=never") .write_stdin("test") .assert() .success() .stdout(" STDIN\n 1 test\n") .stderr(""); } bat-0.25.0/tests/mocked-pagers/echo.bat000064400000000000000000000000101046102023000157360ustar 00000000000000ECHO %* bat-0.25.0/tests/mocked-pagers/more000075500000000000000000000000431046102023000152260ustar 00000000000000#!/usr/bin/env bash echo I am more bat-0.25.0/tests/mocked-pagers/more.bat000075500000000000000000000000171046102023000157740ustar 00000000000000ECHO I am more bat-0.25.0/tests/mocked-pagers/most000075500000000000000000000000431046102023000152460ustar 00000000000000#!/usr/bin/env bash echo I am most bat-0.25.0/tests/mocked-pagers/most.bat000075500000000000000000000000171046102023000160140ustar 00000000000000ECHO I am most bat-0.25.0/tests/no_duplicate_extensions.rs000064400000000000000000000023441046102023000171160ustar 00000000000000use std::collections::HashSet; use bat::assets::HighlightingAssets; #[test] fn no_duplicate_extensions() { const KNOWN_EXCEPTIONS: &[&str] = &[ // The '.h' extension currently appears in multiple syntaxes: C, C++, Objective C, // Objective C++ "h", // In addition to the standard JavaScript syntax in 'Packages', we also ship the // 'Javascript (Babel)' syntax. "js", // The "Ruby Haml" syntax also comes with a '.sass' extension. However, we make sure // that 'sass' is mapped to the 'Sass' syntax. "sass", // The '.fs' extension appears in F# and GLSL. // We default to F#. "fs", // SystemVerilog and Verilog both use .v files. // We default to Verilog. "v", ]; let assets = HighlightingAssets::from_binary(); let mut extensions = HashSet::new(); for syntax in assets.get_syntaxes().expect("this is a #[test]") { for extension in &syntax.file_extensions { assert!( KNOWN_EXCEPTIONS.contains(&extension.as_str()) || extensions.insert(extension), "File extension / pattern \"{extension}\" appears twice in the syntax set" ); } } } bat-0.25.0/tests/snapshot_tests.rs000064400000000000000000000033751046102023000152570ustar 00000000000000#[cfg(feature = "git")] mod tester; macro_rules! snapshot_tests { ($($test_name: ident: $style: expr,)*) => { $( #[test] #[cfg(feature = "git")] fn $test_name() { let bat_tester = tester::BatTester::default(); bat_tester.test_snapshot(stringify!($test_name), $style); } )* }; } snapshot_tests! { changes: "changes", grid: "grid", header: "header", numbers: "numbers", rule: "rule", changes_grid: "changes,grid", changes_header: "changes,header", changes_numbers: "changes,numbers", changes_rule: "changes,rule", grid_header: "grid,header", grid_numbers: "grid,numbers", grid_rule: "grid,rule", header_numbers: "header,numbers", header_rule: "header,rule", changes_grid_header: "changes,grid,header", changes_grid_numbers: "changes,grid,numbers", changes_grid_rule: "changes,grid,rule", changes_header_numbers: "changes,header,numbers", changes_header_rule: "changes,header,rule", grid_header_numbers: "grid,header,numbers", grid_header_rule: "grid,header,rule", header_numbers_rule: "header,numbers,rule", changes_grid_header_numbers: "changes,grid,header,numbers", changes_grid_header_rule: "changes,grid,header,rule", changes_grid_header_numbers_rule: "changes,grid,header,numbers,rule", full: "full", plain: "plain", } bat-0.25.0/tests/snapshots/generate_snapshots.py000075500000000000000000000027621046102023000201220ustar 00000000000000#!/usr/bin/env python3 import itertools import subprocess import pathlib import shutil def generate_snapshots(): single_styles = ["changes", "grid", "header", "numbers", "rule"] collective_styles = ["full", "plain"] for num in range(len(single_styles)): for grouped in itertools.combinations(single_styles, num + 1): generate_style_snapshot(",".join(grouped)) for style in collective_styles: generate_style_snapshot(style) def generate_style_snapshot(style): generate_snapshot(style.replace(",", "_"), "--style={}".format(style)) def generate_snapshot(name, arguments): command = "cargo run -- --paging=never --color=never --decorations=always " command += "{args} sample.rs > output/{name}.snapshot.txt".format( name=name, args=arguments ) print("generating snapshot for {}".format(name)) subprocess.call(command, shell=True) def build_bat(): print("building bat") subprocess.call("cargo build", cwd="../..", shell=True) def prepare_output_dir(): shutil.rmtree("output", ignore_errors=True) pathlib.Path("output").mkdir() def modify_sample_file(): print("modifying sample.rs to show changes") shutil.copyfile("sample.modified.rs", "sample.rs") def undo_sample_file_modification(): print("undoing sample.rs modifications") subprocess.call("git checkout -- sample.rs", shell=True) build_bat() prepare_output_dir() modify_sample_file() generate_snapshots() undo_sample_file_modification() bat-0.25.0/tests/snapshots/output/changes.snapshot.txt000064400000000000000000000011151046102023000212070ustar 00000000000000+ /// A rectangle. First line is changed to prevent a regression of #1869 struct Rectangle { width: u32, height: u32, } _ fn main() { let rect1 = Rectangle { width: 30, height: 50 }; println!( ~ "The perimeter of the rectangle is {} pixels.", ~ perimeter(&rect1) ); + println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; } fn area(rectangle: &Rectangle) -> u32 { rectangle.width * rectangle.height } + + fn perimeter(rectangle: &Rectangle) -> u32 { + (rectangle.width + rectangle.height) * 2 + } bat-0.25.0/tests/snapshots/output/changes_grid.snapshot.txt000064400000000000000000000022131046102023000222140ustar 00000000000000──┬───────────────────────────────────────────────────────────────────────────── + β”‚ /// A rectangle. First line is changed to prevent a regression of #1869 β”‚ struct Rectangle { β”‚ width: u32, β”‚ height: u32, β”‚ } β”‚ _ β”‚ fn main() { β”‚ let rect1 = Rectangle { width: 30, height: 50 }; β”‚ β”‚ println!( ~ β”‚ "The perimeter of the rectangle is {} pixels.", ~ β”‚ perimeter(&rect1) β”‚ ); + β”‚ println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; β”‚ } β”‚ β”‚ fn area(rectangle: &Rectangle) -> u32 { β”‚ rectangle.width * rectangle.height β”‚ } + β”‚ + β”‚ fn perimeter(rectangle: &Rectangle) -> u32 { + β”‚ (rectangle.width + rectangle.height) * 2 + β”‚ } ──┴───────────────────────────────────────────────────────────────────────────── bat-0.25.0/tests/snapshots/output/changes_grid_header.snapshot.txt000064400000000000000000000026221046102023000235300ustar 00000000000000──┬───────────────────────────────────────────────────────────────────────────── β”‚ File: sample.rs ──┼───────────────────────────────────────────────────────────────────────────── + β”‚ /// A rectangle. First line is changed to prevent a regression of #1869 β”‚ struct Rectangle { β”‚ width: u32, β”‚ height: u32, β”‚ } β”‚ _ β”‚ fn main() { β”‚ let rect1 = Rectangle { width: 30, height: 50 }; β”‚ β”‚ println!( ~ β”‚ "The perimeter of the rectangle is {} pixels.", ~ β”‚ perimeter(&rect1) β”‚ ); + β”‚ println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; β”‚ } β”‚ β”‚ fn area(rectangle: &Rectangle) -> u32 { β”‚ rectangle.width * rectangle.height β”‚ } + β”‚ + β”‚ fn perimeter(rectangle: &Rectangle) -> u32 { + β”‚ (rectangle.width + rectangle.height) * 2 + β”‚ } ──┴───────────────────────────────────────────────────────────────────────────── bat-0.25.0/tests/snapshots/output/changes_grid_header_numbers.snapshot.txt000064400000000000000000000030121046102023000252550ustar 00000000000000───────┬──────────────────────────────────────────────────────────────────────── β”‚ File: sample.rs ───────┼──────────────────────────────────────────────────────────────────────── 1 + β”‚ /// A rectangle. First line is changed to prevent a regression of #1869 2 β”‚ struct Rectangle { 3 β”‚ width: u32, 4 β”‚ height: u32, 5 β”‚ } 6 β”‚ 7 _ β”‚ fn main() { 8 β”‚ let rect1 = Rectangle { width: 30, height: 50 }; 9 β”‚ 10 β”‚ println!( 11 ~ β”‚ "The perimeter of the rectangle is {} pixels.", 12 ~ β”‚ perimeter(&rect1) 13 β”‚ ); 14 + β”‚ println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; 15 β”‚ } 16 β”‚ 17 β”‚ fn area(rectangle: &Rectangle) -> u32 { 18 β”‚ rectangle.width * rectangle.height 19 β”‚ } 20 + β”‚ 21 + β”‚ fn perimeter(rectangle: &Rectangle) -> u32 { 22 + β”‚ (rectangle.width + rectangle.height) * 2 23 + β”‚ } ───────┴──────────────────────────────────────────────────────────────────────── bat-0.25.0/tests/snapshots/output/changes_grid_header_numbers_rule.snapshot.txt000064400000000000000000000030121046102023000263040ustar 00000000000000───────┬──────────────────────────────────────────────────────────────────────── β”‚ File: sample.rs ───────┼──────────────────────────────────────────────────────────────────────── 1 + β”‚ /// A rectangle. First line is changed to prevent a regression of #1869 2 β”‚ struct Rectangle { 3 β”‚ width: u32, 4 β”‚ height: u32, 5 β”‚ } 6 β”‚ 7 _ β”‚ fn main() { 8 β”‚ let rect1 = Rectangle { width: 30, height: 50 }; 9 β”‚ 10 β”‚ println!( 11 ~ β”‚ "The perimeter of the rectangle is {} pixels.", 12 ~ β”‚ perimeter(&rect1) 13 β”‚ ); 14 + β”‚ println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; 15 β”‚ } 16 β”‚ 17 β”‚ fn area(rectangle: &Rectangle) -> u32 { 18 β”‚ rectangle.width * rectangle.height 19 β”‚ } 20 + β”‚ 21 + β”‚ fn perimeter(rectangle: &Rectangle) -> u32 { 22 + β”‚ (rectangle.width + rectangle.height) * 2 23 + β”‚ } ───────┴──────────────────────────────────────────────────────────────────────── bat-0.25.0/tests/snapshots/output/changes_grid_header_rule.snapshot.txt000064400000000000000000000026221046102023000245570ustar 00000000000000──┬───────────────────────────────────────────────────────────────────────────── β”‚ File: sample.rs ──┼───────────────────────────────────────────────────────────────────────────── + β”‚ /// A rectangle. First line is changed to prevent a regression of #1869 β”‚ struct Rectangle { β”‚ width: u32, β”‚ height: u32, β”‚ } β”‚ _ β”‚ fn main() { β”‚ let rect1 = Rectangle { width: 30, height: 50 }; β”‚ β”‚ println!( ~ β”‚ "The perimeter of the rectangle is {} pixels.", ~ β”‚ perimeter(&rect1) β”‚ ); + β”‚ println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; β”‚ } β”‚ β”‚ fn area(rectangle: &Rectangle) -> u32 { β”‚ rectangle.width * rectangle.height β”‚ } + β”‚ + β”‚ fn perimeter(rectangle: &Rectangle) -> u32 { + β”‚ (rectangle.width + rectangle.height) * 2 + β”‚ } ──┴───────────────────────────────────────────────────────────────────────────── bat-0.25.0/tests/snapshots/output/changes_grid_numbers.snapshot.txt000064400000000000000000000023761046102023000237610ustar 00000000000000───────┬──────────────────────────────────────────────────────────────────────── 1 + β”‚ /// A rectangle. First line is changed to prevent a regression of #1869 2 β”‚ struct Rectangle { 3 β”‚ width: u32, 4 β”‚ height: u32, 5 β”‚ } 6 β”‚ 7 _ β”‚ fn main() { 8 β”‚ let rect1 = Rectangle { width: 30, height: 50 }; 9 β”‚ 10 β”‚ println!( 11 ~ β”‚ "The perimeter of the rectangle is {} pixels.", 12 ~ β”‚ perimeter(&rect1) 13 β”‚ ); 14 + β”‚ println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; 15 β”‚ } 16 β”‚ 17 β”‚ fn area(rectangle: &Rectangle) -> u32 { 18 β”‚ rectangle.width * rectangle.height 19 β”‚ } 20 + β”‚ 21 + β”‚ fn perimeter(rectangle: &Rectangle) -> u32 { 22 + β”‚ (rectangle.width + rectangle.height) * 2 23 + β”‚ } ───────┴──────────────────────────────────────────────────────────────────────── bat-0.25.0/tests/snapshots/output/changes_grid_numbers_rule.snapshot.txt000064400000000000000000000023761046102023000250100ustar 00000000000000───────┬──────────────────────────────────────────────────────────────────────── 1 + β”‚ /// A rectangle. First line is changed to prevent a regression of #1869 2 β”‚ struct Rectangle { 3 β”‚ width: u32, 4 β”‚ height: u32, 5 β”‚ } 6 β”‚ 7 _ β”‚ fn main() { 8 β”‚ let rect1 = Rectangle { width: 30, height: 50 }; 9 β”‚ 10 β”‚ println!( 11 ~ β”‚ "The perimeter of the rectangle is {} pixels.", 12 ~ β”‚ perimeter(&rect1) 13 β”‚ ); 14 + β”‚ println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; 15 β”‚ } 16 β”‚ 17 β”‚ fn area(rectangle: &Rectangle) -> u32 { 18 β”‚ rectangle.width * rectangle.height 19 β”‚ } 20 + β”‚ 21 + β”‚ fn perimeter(rectangle: &Rectangle) -> u32 { 22 + β”‚ (rectangle.width + rectangle.height) * 2 23 + β”‚ } ───────┴──────────────────────────────────────────────────────────────────────── bat-0.25.0/tests/snapshots/output/changes_grid_rule.snapshot.txt000064400000000000000000000022131046102023000232430ustar 00000000000000──┬───────────────────────────────────────────────────────────────────────────── + β”‚ /// A rectangle. First line is changed to prevent a regression of #1869 β”‚ struct Rectangle { β”‚ width: u32, β”‚ height: u32, β”‚ } β”‚ _ β”‚ fn main() { β”‚ let rect1 = Rectangle { width: 30, height: 50 }; β”‚ β”‚ println!( ~ β”‚ "The perimeter of the rectangle is {} pixels.", ~ β”‚ perimeter(&rect1) β”‚ ); + β”‚ println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; β”‚ } β”‚ β”‚ fn area(rectangle: &Rectangle) -> u32 { β”‚ rectangle.width * rectangle.height β”‚ } + β”‚ + β”‚ fn perimeter(rectangle: &Rectangle) -> u32 { + β”‚ (rectangle.width + rectangle.height) * 2 + β”‚ } ──┴───────────────────────────────────────────────────────────────────────────── bat-0.25.0/tests/snapshots/output/changes_header.snapshot.txt000064400000000000000000000011371046102023000225230ustar 00000000000000 File: sample.rs + /// A rectangle. First line is changed to prevent a regression of #1869 struct Rectangle { width: u32, height: u32, } _ fn main() { let rect1 = Rectangle { width: 30, height: 50 }; println!( ~ "The perimeter of the rectangle is {} pixels.", ~ perimeter(&rect1) ); + println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; } fn area(rectangle: &Rectangle) -> u32 { rectangle.width * rectangle.height } + + fn perimeter(rectangle: &Rectangle) -> u32 { + (rectangle.width + rectangle.height) * 2 + } bat-0.25.0/tests/snapshots/output/changes_header_numbers.snapshot.txt000064400000000000000000000013271046102023000242570ustar 00000000000000 File: sample.rs 1 + /// A rectangle. First line is changed to prevent a regression of #1869 2 struct Rectangle { 3 width: u32, 4 height: u32, 5 } 6 7 _ fn main() { 8 let rect1 = Rectangle { width: 30, height: 50 }; 9 10 println!( 11 ~ "The perimeter of the rectangle is {} pixels.", 12 ~ perimeter(&rect1) 13 ); 14 + println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; 15 } 16 17 fn area(rectangle: &Rectangle) -> u32 { 18 rectangle.width * rectangle.height 19 } 20 + 21 + fn perimeter(rectangle: &Rectangle) -> u32 { 22 + (rectangle.width + rectangle.height) * 2 23 + } bat-0.25.0/tests/snapshots/output/changes_header_numbers_rule.snapshot.txt000064400000000000000000000013271046102023000253060ustar 00000000000000 File: sample.rs 1 + /// A rectangle. First line is changed to prevent a regression of #1869 2 struct Rectangle { 3 width: u32, 4 height: u32, 5 } 6 7 _ fn main() { 8 let rect1 = Rectangle { width: 30, height: 50 }; 9 10 println!( 11 ~ "The perimeter of the rectangle is {} pixels.", 12 ~ perimeter(&rect1) 13 ); 14 + println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; 15 } 16 17 fn area(rectangle: &Rectangle) -> u32 { 18 rectangle.width * rectangle.height 19 } 20 + 21 + fn perimeter(rectangle: &Rectangle) -> u32 { 22 + (rectangle.width + rectangle.height) * 2 23 + } bat-0.25.0/tests/snapshots/output/changes_header_rule.snapshot.txt000064400000000000000000000011371046102023000235520ustar 00000000000000 File: sample.rs + /// A rectangle. First line is changed to prevent a regression of #1869 struct Rectangle { width: u32, height: u32, } _ fn main() { let rect1 = Rectangle { width: 30, height: 50 }; println!( ~ "The perimeter of the rectangle is {} pixels.", ~ perimeter(&rect1) ); + println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; } fn area(rectangle: &Rectangle) -> u32 { rectangle.width * rectangle.height } + + fn perimeter(rectangle: &Rectangle) -> u32 { + (rectangle.width + rectangle.height) * 2 + } bat-0.25.0/tests/snapshots/output/changes_numbers.snapshot.txt000064400000000000000000000013001046102023000227360ustar 00000000000000 1 + /// A rectangle. First line is changed to prevent a regression of #1869 2 struct Rectangle { 3 width: u32, 4 height: u32, 5 } 6 7 _ fn main() { 8 let rect1 = Rectangle { width: 30, height: 50 }; 9 10 println!( 11 ~ "The perimeter of the rectangle is {} pixels.", 12 ~ perimeter(&rect1) 13 ); 14 + println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; 15 } 16 17 fn area(rectangle: &Rectangle) -> u32 { 18 rectangle.width * rectangle.height 19 } 20 + 21 + fn perimeter(rectangle: &Rectangle) -> u32 { 22 + (rectangle.width + rectangle.height) * 2 23 + } bat-0.25.0/tests/snapshots/output/changes_numbers_rule.snapshot.txt000064400000000000000000000013001046102023000237650ustar 00000000000000 1 + /// A rectangle. First line is changed to prevent a regression of #1869 2 struct Rectangle { 3 width: u32, 4 height: u32, 5 } 6 7 _ fn main() { 8 let rect1 = Rectangle { width: 30, height: 50 }; 9 10 println!( 11 ~ "The perimeter of the rectangle is {} pixels.", 12 ~ perimeter(&rect1) 13 ); 14 + println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; 15 } 16 17 fn area(rectangle: &Rectangle) -> u32 { 18 rectangle.width * rectangle.height 19 } 20 + 21 + fn perimeter(rectangle: &Rectangle) -> u32 { 22 + (rectangle.width + rectangle.height) * 2 23 + } bat-0.25.0/tests/snapshots/output/changes_rule.snapshot.txt000064400000000000000000000011151046102023000222360ustar 00000000000000+ /// A rectangle. First line is changed to prevent a regression of #1869 struct Rectangle { width: u32, height: u32, } _ fn main() { let rect1 = Rectangle { width: 30, height: 50 }; println!( ~ "The perimeter of the rectangle is {} pixels.", ~ perimeter(&rect1) ); + println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; } fn area(rectangle: &Rectangle) -> u32 { rectangle.width * rectangle.height } + + fn perimeter(rectangle: &Rectangle) -> u32 { + (rectangle.width + rectangle.height) * 2 + } bat-0.25.0/tests/snapshots/output/full.snapshot.txt000064400000000000000000000030411046102023000205410ustar 00000000000000───────┬──────────────────────────────────────────────────────────────────────── β”‚ File: sample.rs β”‚ Size: 533 B ───────┼──────────────────────────────────────────────────────────────────────── 1 + β”‚ /// A rectangle. First line is changed to prevent a regression of #1869 2 β”‚ struct Rectangle { 3 β”‚ width: u32, 4 β”‚ height: u32, 5 β”‚ } 6 β”‚ 7 _ β”‚ fn main() { 8 β”‚ let rect1 = Rectangle { width: 30, height: 50 }; 9 β”‚ 10 β”‚ println!( 11 ~ β”‚ "The perimeter of the rectangle is {} pixels.", 12 ~ β”‚ perimeter(&rect1) 13 β”‚ ); 14 + β”‚ println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; 15 β”‚ } 16 β”‚ 17 β”‚ fn area(rectangle: &Rectangle) -> u32 { 18 β”‚ rectangle.width * rectangle.height 19 β”‚ } 20 + β”‚ 21 + β”‚ fn perimeter(rectangle: &Rectangle) -> u32 { 22 + β”‚ (rectangle.width + rectangle.height) * 2 23 + β”‚ } ───────┴──────────────────────────────────────────────────────────────────────── bat-0.25.0/tests/snapshots/output/grid.snapshot.txt000064400000000000000000000020011046102023000205170ustar 00000000000000──────────────────────────────────────────────────────────────────────────────── /// A rectangle. First line is changed to prevent a regression of #1869 struct Rectangle { width: u32, height: u32, } fn main() { let rect1 = Rectangle { width: 30, height: 50 }; println!( "The perimeter of the rectangle is {} pixels.", perimeter(&rect1) ); println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; } fn area(rectangle: &Rectangle) -> u32 { rectangle.width * rectangle.height } fn perimeter(rectangle: &Rectangle) -> u32 { (rectangle.width + rectangle.height) * 2 } ──────────────────────────────────────────────────────────────────────────────── bat-0.25.0/tests/snapshots/output/grid_header.snapshot.txt000064400000000000000000000024021046102023000220340ustar 00000000000000──────────────────────────────────────────────────────────────────────────────── File: sample.rs ──────────────────────────────────────────────────────────────────────────────── /// A rectangle. First line is changed to prevent a regression of #1869 struct Rectangle { width: u32, height: u32, } fn main() { let rect1 = Rectangle { width: 30, height: 50 }; println!( "The perimeter of the rectangle is {} pixels.", perimeter(&rect1) ); println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; } fn area(rectangle: &Rectangle) -> u32 { rectangle.width * rectangle.height } fn perimeter(rectangle: &Rectangle) -> u32 { (rectangle.width + rectangle.height) * 2 } ──────────────────────────────────────────────────────────────────────────────── bat-0.25.0/tests/snapshots/output/grid_header_numbers.snapshot.txt000064400000000000000000000027321046102023000235750ustar 00000000000000─────┬────────────────────────────────────────────────────────────────────────── β”‚ File: sample.rs ─────┼────────────────────────────────────────────────────────────────────────── 1 β”‚ /// A rectangle. First line is changed to prevent a regression of #1869 2 β”‚ struct Rectangle { 3 β”‚ width: u32, 4 β”‚ height: u32, 5 β”‚ } 6 β”‚ 7 β”‚ fn main() { 8 β”‚ let rect1 = Rectangle { width: 30, height: 50 }; 9 β”‚ 10 β”‚ println!( 11 β”‚ "The perimeter of the rectangle is {} pixels.", 12 β”‚ perimeter(&rect1) 13 β”‚ ); 14 β”‚ println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; 15 β”‚ } 16 β”‚ 17 β”‚ fn area(rectangle: &Rectangle) -> u32 { 18 β”‚ rectangle.width * rectangle.height 19 β”‚ } 20 β”‚ 21 β”‚ fn perimeter(rectangle: &Rectangle) -> u32 { 22 β”‚ (rectangle.width + rectangle.height) * 2 23 β”‚ } ─────┴────────────────────────────────────────────────────────────────────────── bat-0.25.0/tests/snapshots/output/grid_header_numbers_rule.snapshot.txt000064400000000000000000000027321046102023000246240ustar 00000000000000─────┬────────────────────────────────────────────────────────────────────────── β”‚ File: sample.rs ─────┼────────────────────────────────────────────────────────────────────────── 1 β”‚ /// A rectangle. First line is changed to prevent a regression of #1869 2 β”‚ struct Rectangle { 3 β”‚ width: u32, 4 β”‚ height: u32, 5 β”‚ } 6 β”‚ 7 β”‚ fn main() { 8 β”‚ let rect1 = Rectangle { width: 30, height: 50 }; 9 β”‚ 10 β”‚ println!( 11 β”‚ "The perimeter of the rectangle is {} pixels.", 12 β”‚ perimeter(&rect1) 13 β”‚ ); 14 β”‚ println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; 15 β”‚ } 16 β”‚ 17 β”‚ fn area(rectangle: &Rectangle) -> u32 { 18 β”‚ rectangle.width * rectangle.height 19 β”‚ } 20 β”‚ 21 β”‚ fn perimeter(rectangle: &Rectangle) -> u32 { 22 β”‚ (rectangle.width + rectangle.height) * 2 23 β”‚ } ─────┴────────────────────────────────────────────────────────────────────────── bat-0.25.0/tests/snapshots/output/grid_header_rule.snapshot.txt000064400000000000000000000024021046102023000230630ustar 00000000000000──────────────────────────────────────────────────────────────────────────────── File: sample.rs ──────────────────────────────────────────────────────────────────────────────── /// A rectangle. First line is changed to prevent a regression of #1869 struct Rectangle { width: u32, height: u32, } fn main() { let rect1 = Rectangle { width: 30, height: 50 }; println!( "The perimeter of the rectangle is {} pixels.", perimeter(&rect1) ); println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; } fn area(rectangle: &Rectangle) -> u32 { rectangle.width * rectangle.height } fn perimeter(rectangle: &Rectangle) -> u32 { (rectangle.width + rectangle.height) * 2 } ──────────────────────────────────────────────────────────────────────────────── bat-0.25.0/tests/snapshots/output/grid_numbers.snapshot.txt000064400000000000000000000023201046102023000222560ustar 00000000000000─────┬────────────────────────────────────────────────────────────────────────── 1 β”‚ /// A rectangle. First line is changed to prevent a regression of #1869 2 β”‚ struct Rectangle { 3 β”‚ width: u32, 4 β”‚ height: u32, 5 β”‚ } 6 β”‚ 7 β”‚ fn main() { 8 β”‚ let rect1 = Rectangle { width: 30, height: 50 }; 9 β”‚ 10 β”‚ println!( 11 β”‚ "The perimeter of the rectangle is {} pixels.", 12 β”‚ perimeter(&rect1) 13 β”‚ ); 14 β”‚ println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; 15 β”‚ } 16 β”‚ 17 β”‚ fn area(rectangle: &Rectangle) -> u32 { 18 β”‚ rectangle.width * rectangle.height 19 β”‚ } 20 β”‚ 21 β”‚ fn perimeter(rectangle: &Rectangle) -> u32 { 22 β”‚ (rectangle.width + rectangle.height) * 2 23 β”‚ } ─────┴────────────────────────────────────────────────────────────────────────── bat-0.25.0/tests/snapshots/output/grid_numbers_rule.snapshot.txt000064400000000000000000000023201046102023000233050ustar 00000000000000─────┬────────────────────────────────────────────────────────────────────────── 1 β”‚ /// A rectangle. First line is changed to prevent a regression of #1869 2 β”‚ struct Rectangle { 3 β”‚ width: u32, 4 β”‚ height: u32, 5 β”‚ } 6 β”‚ 7 β”‚ fn main() { 8 β”‚ let rect1 = Rectangle { width: 30, height: 50 }; 9 β”‚ 10 β”‚ println!( 11 β”‚ "The perimeter of the rectangle is {} pixels.", 12 β”‚ perimeter(&rect1) 13 β”‚ ); 14 β”‚ println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; 15 β”‚ } 16 β”‚ 17 β”‚ fn area(rectangle: &Rectangle) -> u32 { 18 β”‚ rectangle.width * rectangle.height 19 β”‚ } 20 β”‚ 21 β”‚ fn perimeter(rectangle: &Rectangle) -> u32 { 22 β”‚ (rectangle.width + rectangle.height) * 2 23 β”‚ } ─────┴────────────────────────────────────────────────────────────────────────── bat-0.25.0/tests/snapshots/output/grid_rule.snapshot.txt000064400000000000000000000020011046102023000215460ustar 00000000000000──────────────────────────────────────────────────────────────────────────────── /// A rectangle. First line is changed to prevent a regression of #1869 struct Rectangle { width: u32, height: u32, } fn main() { let rect1 = Rectangle { width: 30, height: 50 }; println!( "The perimeter of the rectangle is {} pixels.", perimeter(&rect1) ); println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; } fn area(rectangle: &Rectangle) -> u32 { rectangle.width * rectangle.height } fn perimeter(rectangle: &Rectangle) -> u32 { (rectangle.width + rectangle.height) * 2 } ──────────────────────────────────────────────────────────────────────────────── bat-0.25.0/tests/snapshots/output/header.snapshot.txt000064400000000000000000000010571046102023000210340ustar 00000000000000File: sample.rs /// A rectangle. First line is changed to prevent a regression of #1869 struct Rectangle { width: u32, height: u32, } fn main() { let rect1 = Rectangle { width: 30, height: 50 }; println!( "The perimeter of the rectangle is {} pixels.", perimeter(&rect1) ); println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; } fn area(rectangle: &Rectangle) -> u32 { rectangle.width * rectangle.height } fn perimeter(rectangle: &Rectangle) -> u32 { (rectangle.width + rectangle.height) * 2 } bat-0.25.0/tests/snapshots/output/header_numbers.snapshot.txt000064400000000000000000000012471046102023000225700ustar 00000000000000 File: sample.rs 1 /// A rectangle. First line is changed to prevent a regression of #1869 2 struct Rectangle { 3 width: u32, 4 height: u32, 5 } 6 7 fn main() { 8 let rect1 = Rectangle { width: 30, height: 50 }; 9 10 println!( 11 "The perimeter of the rectangle is {} pixels.", 12 perimeter(&rect1) 13 ); 14 println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; 15 } 16 17 fn area(rectangle: &Rectangle) -> u32 { 18 rectangle.width * rectangle.height 19 } 20 21 fn perimeter(rectangle: &Rectangle) -> u32 { 22 (rectangle.width + rectangle.height) * 2 23 } bat-0.25.0/tests/snapshots/output/header_numbers_rule.snapshot.txt000064400000000000000000000012471046102023000236170ustar 00000000000000 File: sample.rs 1 /// A rectangle. First line is changed to prevent a regression of #1869 2 struct Rectangle { 3 width: u32, 4 height: u32, 5 } 6 7 fn main() { 8 let rect1 = Rectangle { width: 30, height: 50 }; 9 10 println!( 11 "The perimeter of the rectangle is {} pixels.", 12 perimeter(&rect1) 13 ); 14 println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; 15 } 16 17 fn area(rectangle: &Rectangle) -> u32 { 18 rectangle.width * rectangle.height 19 } 20 21 fn perimeter(rectangle: &Rectangle) -> u32 { 22 (rectangle.width + rectangle.height) * 2 23 } bat-0.25.0/tests/snapshots/output/header_rule.snapshot.txt000064400000000000000000000010571046102023000220630ustar 00000000000000File: sample.rs /// A rectangle. First line is changed to prevent a regression of #1869 struct Rectangle { width: u32, height: u32, } fn main() { let rect1 = Rectangle { width: 30, height: 50 }; println!( "The perimeter of the rectangle is {} pixels.", perimeter(&rect1) ); println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; } fn area(rectangle: &Rectangle) -> u32 { rectangle.width * rectangle.height } fn perimeter(rectangle: &Rectangle) -> u32 { (rectangle.width + rectangle.height) * 2 } bat-0.25.0/tests/snapshots/output/numbers.snapshot.txt000064400000000000000000000012221046102023000212510ustar 00000000000000 1 /// A rectangle. First line is changed to prevent a regression of #1869 2 struct Rectangle { 3 width: u32, 4 height: u32, 5 } 6 7 fn main() { 8 let rect1 = Rectangle { width: 30, height: 50 }; 9 10 println!( 11 "The perimeter of the rectangle is {} pixels.", 12 perimeter(&rect1) 13 ); 14 println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; 15 } 16 17 fn area(rectangle: &Rectangle) -> u32 { 18 rectangle.width * rectangle.height 19 } 20 21 fn perimeter(rectangle: &Rectangle) -> u32 { 22 (rectangle.width + rectangle.height) * 2 23 } bat-0.25.0/tests/snapshots/output/numbers_rule.snapshot.txt000064400000000000000000000012221046102023000223000ustar 00000000000000 1 /// A rectangle. First line is changed to prevent a regression of #1869 2 struct Rectangle { 3 width: u32, 4 height: u32, 5 } 6 7 fn main() { 8 let rect1 = Rectangle { width: 30, height: 50 }; 9 10 println!( 11 "The perimeter of the rectangle is {} pixels.", 12 perimeter(&rect1) 13 ); 14 println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; 15 } 16 17 fn area(rectangle: &Rectangle) -> u32 { 18 rectangle.width * rectangle.height 19 } 20 21 fn perimeter(rectangle: &Rectangle) -> u32 { 22 (rectangle.width + rectangle.height) * 2 23 } bat-0.25.0/tests/snapshots/output/plain.snapshot.txt000064400000000000000000000010371046102023000207050ustar 00000000000000/// A rectangle. First line is changed to prevent a regression of #1869 struct Rectangle { width: u32, height: u32, } fn main() { let rect1 = Rectangle { width: 30, height: 50 }; println!( "The perimeter of the rectangle is {} pixels.", perimeter(&rect1) ); println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; } fn area(rectangle: &Rectangle) -> u32 { rectangle.width * rectangle.height } fn perimeter(rectangle: &Rectangle) -> u32 { (rectangle.width + rectangle.height) * 2 } bat-0.25.0/tests/snapshots/output/rule.snapshot.txt000064400000000000000000000010371046102023000205510ustar 00000000000000/// A rectangle. First line is changed to prevent a regression of #1869 struct Rectangle { width: u32, height: u32, } fn main() { let rect1 = Rectangle { width: 30, height: 50 }; println!( "The perimeter of the rectangle is {} pixels.", perimeter(&rect1) ); println!(r#"This line contains invalid utf8: "οΏ½οΏ½οΏ½οΏ½οΏ½"#; } fn area(rectangle: &Rectangle) -> u32 { rectangle.width * rectangle.height } fn perimeter(rectangle: &Rectangle) -> u32 { (rectangle.width + rectangle.height) * 2 } bat-0.25.0/tests/snapshots/sample.modified.rs000064400000000000000000000010251046102023000172460ustar 00000000000000/// A rectangle. First line is changed to prevent a regression of #1869 struct Rectangle { width: u32, height: u32, } fn main() { let rect1 = Rectangle { width: 30, height: 50 }; println!( "The perimeter of the rectangle is {} pixels.", perimeter(&rect1) ); println!(r#"This line contains invalid utf8: "ψˆ€€€"#; } fn area(rectangle: &Rectangle) -> u32 { rectangle.width * rectangle.height } fn perimeter(rectangle: &Rectangle) -> u32 { (rectangle.width + rectangle.height) * 2 } bat-0.25.0/tests/snapshots/sample.rs000064400000000000000000000005511046102023000154720ustar 00000000000000struct Rectangle { width: u32, height: u32, } fn main() { // width and height of a rectangle can be different let rect1 = Rectangle { width: 30, height: 50 }; println!( "The area of the rectangle is {} square pixels.", area(&rect1) ); } fn area(rectangle: &Rectangle) -> u32 { rectangle.width * rectangle.height } bat-0.25.0/tests/system_wide_config.rs000064400000000000000000000016301046102023000160470ustar 00000000000000use predicates::{prelude::predicate, str::PredicateStrExt}; mod utils; use utils::command::bat_with_config; // This test is ignored, as it needs a special system wide config put into place. // In order to run this tests, use `cargo test --test system_wide_config -- --ignored` #[test] #[ignore] fn use_systemwide_config() { bat_with_config() .arg("test.txt") .assert() .success() .stdout(predicate::eq("dummy-pager-from-system-config\n").normalize()); } // This test is ignored, as it needs a special system wide config put into place // In order to run this tests, use `cargo test --test system_wide_config -- --ignored` #[test] #[ignore] fn config_overrides_system_config() { bat_with_config() .env("BAT_CONFIG_PATH", "bat.conf") .arg("test.txt") .assert() .success() .stdout(predicate::eq("dummy-pager-from-config\n").normalize()); } bat-0.25.0/tests/test_pretty_printer.rs000064400000000000000000000011031046102023000163120ustar 00000000000000use bat::PrettyPrinter; #[test] fn syntaxes() { let printer = PrettyPrinter::new(); let syntaxes: Vec = printer.syntaxes().map(|s| s.name).collect(); // Just do some sanity checking assert!(syntaxes.contains(&"Rust".to_string())); assert!(syntaxes.contains(&"Java".to_string())); assert!(!syntaxes.contains(&"this-language-does-not-exist".to_string())); // This language exists but is hidden, so we should not see it; it shall // have been filtered out before getting to us assert!(!syntaxes.contains(&"Git Common".to_string())); } bat-0.25.0/tests/tester/mod.rs000064400000000000000000000057651046102023000142700ustar 00000000000000use std::env; use std::fs::{self, File}; use std::io::Read; use std::path::{Path, PathBuf}; use std::process::Command; use tempfile::TempDir; use git2::build::CheckoutBuilder; use git2::Repository; use git2::Signature; pub struct BatTester { /// Temporary working directory temp_dir: TempDir, /// Path to the *bat* executable exe: PathBuf, } impl BatTester { pub fn test_snapshot(&self, name: &str, style: &str) { let output = Command::new(&self.exe) .current_dir(self.temp_dir.path()) .args([ "sample.rs", "--no-config", "--paging=never", "--color=never", "--decorations=always", "--terminal-width=80", &format!("--style={style}"), ]) .output() .expect("bat failed"); // have to do the replace because the filename in the header changes based on the current working directory let actual = String::from_utf8_lossy(&output.stdout) .as_ref() .replace("tests/snapshots/", ""); let mut expected = String::new(); let mut file = File::open(format!("tests/snapshots/output/{name}.snapshot.txt")) .expect("snapshot file missing"); file.read_to_string(&mut expected) .expect("could not read snapshot file"); assert_eq!(expected, actual); } } impl Default for BatTester { fn default() -> Self { let temp_dir = create_sample_directory().expect("sample directory"); let root = env::current_exe() .expect("tests executable") .parent() .expect("tests executable directory") .parent() .expect("bat executable directory") .to_path_buf(); let exe_name = if cfg!(windows) { "bat.exe" } else { "bat" }; let exe = root.join(exe_name); BatTester { temp_dir, exe } } } fn create_sample_directory() -> Result { // Create temp directory and initialize repository let temp_dir = TempDir::new().expect("Temp directory"); let repo = Repository::init(&temp_dir)?; // Copy over `sample.rs` let sample_path = temp_dir.path().join("sample.rs"); println!("{:?}", &sample_path); fs::copy("tests/snapshots/sample.rs", &sample_path).expect("successful copy"); // Commit let mut index = repo.index()?; index.add_path(Path::new("sample.rs"))?; let oid = index.write_tree()?; let signature = Signature::now("bat test runner", "bat@test.runner")?; let tree = repo.find_tree(oid)?; let _ = repo.commit( Some("HEAD"), // point HEAD to our new commit &signature, // author &signature, // committer "initial commit", &tree, &[], ); let mut opts = CheckoutBuilder::new(); repo.checkout_head(Some(opts.force()))?; fs::copy("tests/snapshots/sample.modified.rs", &sample_path).expect("successful copy"); Ok(temp_dir) } bat-0.25.0/tests/utils/command.rs000064400000000000000000000022311046102023000147420ustar 00000000000000#![allow(unused)] // Because indirectly included by e.g.integration_tests.rs, but not everything inside is used use assert_cmd::cargo::CommandCargoExt; use std::process::Command; pub fn bat_raw_command_with_config() -> Command { let mut cmd = Command::cargo_bin("bat").unwrap(); cmd.current_dir("tests/examples"); cmd.env_remove("BAT_CACHE_PATH"); cmd.env_remove("BAT_CONFIG_DIR"); cmd.env_remove("BAT_CONFIG_PATH"); cmd.env_remove("BAT_OPTS"); cmd.env_remove("BAT_PAGER"); cmd.env_remove("BAT_STYLE"); cmd.env_remove("BAT_TABS"); cmd.env_remove("BAT_THEME"); cmd.env_remove("COLORTERM"); cmd.env_remove("NO_COLOR"); cmd.env_remove("PAGER"); cmd.env_remove("LESSOPEN"); cmd.env_remove("LESSCLOSE"); cmd.env_remove("SHELL"); cmd } #[cfg(test)] pub fn bat_raw_command() -> Command { let mut cmd = bat_raw_command_with_config(); cmd.arg("--no-config"); cmd } #[cfg(test)] pub fn bat_with_config() -> assert_cmd::Command { assert_cmd::Command::from_std(bat_raw_command_with_config()) } #[cfg(test)] pub fn bat() -> assert_cmd::Command { assert_cmd::Command::from_std(bat_raw_command()) } bat-0.25.0/tests/utils/mocked_pagers.rs000064400000000000000000000052601046102023000161340ustar 00000000000000#![allow(unused)] // Because indirectly included by e.g. system_wide_config.rs, but not used use assert_cmd::Command; use predicates::prelude::predicate; use std::env; use std::path::{Path, PathBuf}; /// For some tests we want mocked versions of some pagers /// This fn returns the absolute path to the directory with these mocked pagers fn get_mocked_pagers_dir() -> PathBuf { let cargo_manifest_dir = env::var("CARGO_MANIFEST_DIR").expect("Missing CARGO_MANIFEST_DIR"); Path::new(&cargo_manifest_dir) .join("tests") .join("mocked-pagers") } /// On Unix: 'most' -> 'most' /// On Windows: 'most' -> 'most.bat' pub fn from(base: &str) -> String { let mut cmd_and_args = shell_words::split(base).unwrap(); let suffix = if cfg!(windows) { ".bat" } else { "" }; let mut out_cmd = format!("{}{}", cmd_and_args.first().unwrap(), suffix); if (cmd_and_args.len() > 1) { out_cmd.push(' '); out_cmd.push_str(cmd_and_args[1..].to_vec().join(" ").as_str()); } out_cmd } /// Prepends a directory to the PATH environment variable /// Returns the original value for later restoration fn prepend_dir_to_path_env_var(dir: PathBuf) -> String { // Get current PATH let original_path = env::var("PATH").expect("No PATH?!"); // Add the new dir first let mut split_paths = env::split_paths(&original_path).collect::>(); split_paths.insert(0, dir); // Set PATH with the new dir let new_path = env::join_paths(split_paths).expect("Failed to join paths"); env::set_var("PATH", new_path); // Return the original value for later restoration of it original_path } /// Helper to restore the value of PATH fn restore_path(original_path: String) { env::set_var("PATH", original_path); } /// Allows test to run that require our mocked versions of 'more' and 'most' /// in PATH. Temporarily changes PATH while the test code runs, and then restore it /// to avoid pollution of global state pub fn with_mocked_versions_of_more_and_most_in_path(actual_test: fn()) { let original_path = prepend_dir_to_path_env_var(get_mocked_pagers_dir()); // Make sure our own variants of 'more' and 'most' are used Command::new(from("more")) .assert() .success() .stdout(predicate::str::contains("I am more")); Command::new(from("most")) .assert() .success() .stdout(predicate::str::contains("I am most")); Command::new(from("echo")) .arg("foobar") .assert() .success() .stdout(predicate::str::contains("foobar")); // Now run the actual test actual_test(); // Make sure to restore PATH since it is global state restore_path(original_path); } bat-0.25.0/tests/utils/mod.rs000064400000000000000000000000501046102023000141000ustar 00000000000000pub mod command; pub mod mocked_pagers;