bat-0.24.0/.cargo_vcs_info.json0000644000000001360000000000100116650ustar { "git": { "sha1": "fc9546854f5a7b38823f4990453c6cde386bfd3b" }, "path_in_vcs": "" }bat-0.24.0/.github/.codecov.yml000064400000000000000000000000171046102023000142360ustar 00000000000000comment: false bat-0.24.0/.github/FUNDING.yml000064400000000000000000000000471046102023000136330ustar 00000000000000github: [sharkdp, keith-hall, Enselic] bat-0.24.0/.github/ISSUE_TEMPLATE/bug_report.md000064400000000000000000000025201046102023000166710ustar 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.24.0/.github/ISSUE_TEMPLATE/config.yml000064400000000000000000000000331046102023000161640ustar 00000000000000blank_issues_enabled: true bat-0.24.0/.github/ISSUE_TEMPLATE/feature_request.md000064400000000000000000000001711046102023000177240ustar 00000000000000--- name: Feature Request about: Suggest an idea for this project. title: '' labels: feature-request assignees: '' --- bat-0.24.0/.github/ISSUE_TEMPLATE/question.md000064400000000000000000000003701046102023000163710ustar 00000000000000--- name: Question about: Ask a question about 'bat'. title: '' labels: question assignees: '' --- bat-0.24.0/.github/ISSUE_TEMPLATE/syntax_request.md000064400000000000000000000012271046102023000176220ustar 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:** [packagecontro.io link here] bat-0.24.0/.github/dependabot.yml000064400000000000000000000007321046102023000146470ustar 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.24.0/.github/workflows/CICD.yml000064400000000000000000000464741046102023000153160ustar 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: - 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-gnu , os: ubuntu-20.04, use-cross: true } - { target: arm-unknown-linux-gnueabihf , os: ubuntu-20.04, use-cross: true } - { target: arm-unknown-linux-musleabihf, os: ubuntu-20.04, use-cross: true } - { target: i686-pc-windows-msvc , os: windows-2019 } - { target: i686-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true } - { target: i686-unknown-linux-musl , os: ubuntu-20.04, use-cross: true } - { target: x86_64-apple-darwin , os: macos-12 } - { 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, use-cross: true } - { target: x86_64-unknown-linux-musl , os: ubuntu-20.04, 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 }} unset DPKG_ARCH case ${{ matrix.job.target }} in aarch64-*-linux-*) DPKG_ARCH=arm64 ;; arm-*-linux-*hf) DPKG_ARCH=armhf ;; i686-*-linux-*) DPKG_ARCH=i686 ;; x86_64-*-linux-*) DPKG_ARCH=amd64 ;; *) DPKG_ARCH=notset ;; esac; 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@v1 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.24.0/.gitignore000064400000000000000000000002501046102023000124420ustar 00000000000000/target/ **/*.rs.bk # Generated files /assets/completions/bat.bash /assets/completions/bat.fish /assets/completions/bat.zsh /assets/manual/bat.1 /assets/metadata.yaml bat-0.24.0/.gitmodules000064400000000000000000000266211046102023000126410ustar 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 bat-0.24.0/CHANGELOG.md000064400000000000000000001263321046102023000122750ustar 00000000000000# 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) ## `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.24.0/CONTRIBUTING.md000064400000000000000000000046471046102023000127210ustar 00000000000000# Contributing Thank you for considering to contribute to `bat`! ## Add an entry to the changelog If your contribution changes the behavior of `bat` (as opposed to a typo-fix in the documentation), please update the [`CHANGELOG.md`](CHANGELOG.md) file and describe your changes. This makes the release process much easier and therefore helps to get your changes into a new `bat` release faster. 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 follow this format: ``` - Short description of what has been changed, see #123 (@user) ``` Here, `#123` is the number of the original issue and/or your pull request. Please replace `@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.24.0/Cargo.lock0000644000001220420000000000100076410ustar # This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 3 [[package]] name = "adler" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aho-corasick" version = "0.7.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" dependencies = [ "memchr", ] [[package]] name = "aho-corasick" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" dependencies = [ "memchr", ] [[package]] name = "ansi_colours" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7db9d9767fde724f83933a716ee182539788f293828244e9d999695ce0f7ba1e" dependencies = [ "rgb", ] [[package]] name = "anstream" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" dependencies = [ "anstyle 1.0.0", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", "utf8parse", ] [[package]] name = "anstyle" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23ea9e81bd02e310c216d080f6223c179012256e5151c41db88d12c88a1684d2" [[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.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" dependencies = [ "anstyle 1.0.0", "windows-sys 0.48.0", ] [[package]] name = "assert_cmd" version = "2.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0b2340f55d9661d76793b2bfc2eb0e62689bd79d067a95707ea762afd5e9dd" dependencies = [ "anstyle 0.3.5", "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.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" [[package]] name = "bat" version = "0.24.0" dependencies = [ "ansi_colours", "assert_cmd", "bincode", "bugreport", "bytesize", "clap", "clircle", "console", "content_inspector", "encoding_rs", "etcetera", "expect-test", "flate2", "git2", "globset", "grep-cli", "home", "nix", "nu-ansi-term", "once_cell", "os_str_bytes", "path_abs", "plist", "predicates", "regex", "run_script", "semver", "serde", "serde_yaml", "serial_test", "shell-words", "syntect", "tempfile", "thiserror", "unicode-width", "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.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" 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.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" dependencies = [ "jobserver", ] [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" version = "4.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d04704f56c2cde07f43e8e2c154b43f216dc5c92fc98ada720177362f953b956" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" version = "4.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e231faeaca65ebd1ea3c737966bf858971cd38c3849107aa3ea7de90a804e45" dependencies = [ "anstream", "anstyle 1.0.0", "clap_lex", "strsim", "terminal_size", ] [[package]] name = "clap_lex" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" [[package]] name = "clircle" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8e87cbed5354f17bd8ca8821a097fb62599787fe8f611743fad7ee156a0a600" dependencies = [ "cfg-if", "libc", "serde", "winapi", ] [[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.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d79fbe8970a77e3e34151cc13d3b3e248aa0faaecb9f6091fa07ebefe5ad60" dependencies = [ "encode_unicode", "lazy_static", "libc", "unicode-width", "windows-sys 0.42.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 = "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 = "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 = "dunce" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bd4b30a6560bbd9b4620f4de34c3f14f60848e58a9b7216801afcb4c7b31c3c" [[package]] name = "either" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" [[package]] name = "encode_unicode" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "encoding_rs" version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" 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 = "expect-test" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30d9eafeadd538e68fb28016364c9732d78e420b9ff8853fa5e4058861e9f8d3" dependencies = [ "dissimilar", "once_cell", ] [[package]] name = "fancy-regex" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d6b8560a05112eb52f04b00e5d3790c0dd75d9d980eb8a122fb23b92a623ccf" 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.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" dependencies = [ "crc32fast", "miniz_oxide", ] [[package]] name = "float-cmp" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" 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.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" dependencies = [ "percent-encoding", ] [[package]] name = "fsio" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dad0ce30be0cc441b325c5d705c8b613a0ca0d92b6a8953d41bd236dc09a36d0" dependencies = [ "dunce", "rand", ] [[package]] name = "getrandom" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" dependencies = [ "cfg-if", "libc", "wasi", ] [[package]] name = "git-version" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6b0decc02f4636b9ccad390dcbe77b722a77efedfa393caf8379a51d5c61899" dependencies = [ "git-version-macro", "proc-macro-hack", ] [[package]] name = "git-version-macro" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe69f1cbdb6e28af2bac214e943b99ce8a0a06b447d15d3e61161b0423139f3f" dependencies = [ "proc-macro-hack", "proc-macro2", "quote", "syn 1.0.104", ] [[package]] name = "git2" version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12ef350ba88a33b4d524b1d1c79096c9ade5ef8c59395df0e60d1e1889414c0e" dependencies = [ "bitflags 2.4.0", "libc", "libgit2-sys", "log", "url", ] [[package]] name = "glob" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" [[package]] name = "globset" version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc" dependencies = [ "aho-corasick 0.7.19", "bstr", "fnv", "log", "regex", ] [[package]] name = "grep-cli" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fe4bdbf4300c8b039f5d7eec7fbc6760d2c85bb15ac7499c4d235667f6d747a" dependencies = [ "bstr", "globset", "lazy_static", "log", "regex", "same-file", "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 = "home" version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" dependencies = [ "windows-sys 0.48.0", ] [[package]] name = "idna" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" dependencies = [ "unicode-bidi", "unicode-normalization", ] [[package]] name = "indexmap" version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" dependencies = [ "autocfg", "hashbrown 0.12.3", ] [[package]] name = "indexmap" version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" dependencies = [ "equivalent", "hashbrown 0.14.1", ] [[package]] name = "itertools" version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 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.147" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "libgit2-sys" version = "0.16.1+1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2a2bb3680b094add03bb3732ec520ece34da31a8cd2d633d1389d0f0fb60d0c" 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 = "line-wrap" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" dependencies = [ "safemem", ] [[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.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" [[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.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if", ] [[package]] name = "memchr" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "miniz_oxide" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" dependencies = [ "adler", ] [[package]] name = "nix" version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" dependencies = [ "bitflags 1.3.2", "cfg-if", "libc", "static_assertions", ] [[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.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c073d3c1930d0751774acf49e66653acecb416c3a54c6ec095a9b11caddb5a68" dependencies = [ "windows-sys 0.48.0", ] [[package]] name = "num-traits" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", ] [[package]] name = "num_threads" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" dependencies = [ "libc", ] [[package]] name = "once_cell" version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[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 = "os_str_bytes" version = "6.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" dependencies = [ "memchr", ] [[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.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" [[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.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bd9647b268a3d3e14ff09c23201133a62589c658db02bb7388c7246aafe0590" dependencies = [ "base64", "indexmap 1.9.1", "line-wrap", "quick-xml", "serde", "time", ] [[package]] name = "ppv-lite86" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "predicates" version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09963355b9f467184c04017ced4a2ba2d75cbcb4e7462690d388233253d4b1a9" dependencies = [ "anstyle 1.0.0", "difflib", "float-cmp", "itertools", "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-macro-hack" version = "0.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" [[package]] name = "proc-macro2" version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quick-xml" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5c1a97b1bc42b1d550bfb48d4262153fe400a12bab1511821736f7eac76d7e2" dependencies = [ "memchr", ] [[package]] name = "quote" version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" dependencies = [ "proc-macro2", ] [[package]] name = "rand" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", "rand_core", ] [[package]] name = "rand_chacha" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", "rand_core", ] [[package]] name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom", ] [[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.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ "bitflags 1.3.2", ] [[package]] name = "regex" version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81ca098a9821bd52d6b24fd8b10bd081f47d39c22778cafaa75a2857a62c6390" dependencies = [ "aho-corasick 1.0.1", "memchr", "regex-syntax 0.7.2", ] [[package]] name = "regex-automata" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49530408a136e16e5b486e883fbb6ba058e8e4e8ae6621a77b048b314336e629" [[package]] name = "regex-syntax" version = "0.6.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" [[package]] name = "regex-syntax" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" [[package]] name = "rgb" version = "0.8.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3603b7d71ca82644f79b5a06d1220e9a58ede60bd32255f698cb1af8838b8db3" dependencies = [ "bytemuck", ] [[package]] name = "run_script" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fdc55b3a7ad58e02de47eaf7a854c6791c8421da48ff296c152317d3beaf230" dependencies = [ "fsio", ] [[package]] name = "rustix" version = "0.38.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0c3dde1fc030af041adc40e79c0e7fbcf431dd24870053d187d7c66e4b87453" 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 = "safemem" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" [[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.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" [[package]] name = "serde" version = "1.0.163" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.163" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" dependencies = [ "proc-macro2", "quote", "syn 2.0.12", ] [[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_yaml" version = "0.9.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a49e178e4452f45cb61d0cd8cebc1b0fafd3e41929e996cef79aa3aca91f574" dependencies = [ "indexmap 2.0.2", "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 2.0.12", ] [[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 = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[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 = "syn" version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae548ec36cf198c0ef7710d3c230987c2d6d7bd98ad6edc0274462724c585ce" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "syn" version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79d9531f94112cfc3e4c8f5f02cb2b58f72c97b7efd85f70203cc6d8efda5927" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "syntect" version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6c454c27d9d7d9a84c7803aaa3c50cd088d2906fe3c6e42da3209aa623576a8" dependencies = [ "bincode", "bitflags 1.3.2", "fancy-regex", "flate2", "fnv", "lazy_static", "once_cell", "onig", "plist", "regex-syntax 0.6.27", "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.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" dependencies = [ "cfg-if", "fastrand", "redox_syscall 0.3.5", "rustix", "windows-sys 0.48.0", ] [[package]] name = "termcolor" version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" dependencies = [ "winapi-util", ] [[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.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", "syn 2.0.12", ] [[package]] name = "time" version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c3f9a28b618c3a6b9251b6908e9c99e04b9e5c02e6581ccbb67d59c34ef7f9b" dependencies = [ "itoa", "libc", "num_threads", ] [[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 = "unicode-bidi" version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" [[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.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" [[package]] name = "unsafe-libyaml" version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa" [[package]] name = "url" version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" 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.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" 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.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05b116685a6be0c52f5a103334cbff26db643826c7b3735fc0a3ba9871310a74" 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.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 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-sys" version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" 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-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-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_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_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_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_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_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_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_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 = "yaml-rust" version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" dependencies = [ "linked-hash-map", ] bat-0.24.0/Cargo.toml0000644000000072400000000000100076660ustar # 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 = "2018" rust-version = "1.70" name = "bat" version = "0.24.0" authors = ["David Peter "] build = "build.rs" exclude = [ "assets/syntaxes/*", "assets/themes/*", ] 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 [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.6" features = [ "wrap_help", "cargo", ] optional = true [dependencies.clircle] version = "0.4" [dependencies.console] version = "0.15.5" [dependencies.content_inspector] version = "0.2.4" [dependencies.encoding_rs] version = "0.8.33" [dependencies.etcetera] version = "0.8.0" optional = true [dependencies.flate2] version = "1.0" [dependencies.git2] version = "0.18" optional = true default-features = false [dependencies.globset] version = "0.4" [dependencies.grep-cli] version = "0.1.9" optional = true [dependencies.nu-ansi-term] version = "0.49.0" [dependencies.once_cell] version = "1.18" [dependencies.os_str_bytes] version = "~6.4" optional = true [dependencies.path_abs] version = "0.5" default-features = false [dependencies.regex] version = "1.8.3" optional = true [dependencies.run_script] version = "^0.10.0" optional = true [dependencies.semver] version = "1.0" [dependencies.serde] version = "1.0" features = ["derive"] [dependencies.serde_yaml] version = "0.9" [dependencies.shell-words] version = "1.1.0" optional = true [dependencies.syntect] version = "5.0.0" features = ["parsing"] default-features = false [dependencies.thiserror] version = "1.0" [dependencies.unicode-width] version = "0.1.10" [dependencies.walkdir] version = "2.3" optional = true [dependencies.wild] version = "2.1" optional = true [dev-dependencies.assert_cmd] version = "2.0.10" [dev-dependencies.expect-test] version = "1.4.1" [dev-dependencies.predicates] version = "3.0.3" [dev-dependencies.serial_test] version = "2.0.0" default-features = false [dev-dependencies.tempfile] version = "3.8.0" [dev-dependencies.wait-timeout] version = "0.2.0" [build-dependencies.clap] version = "4.4.6" features = [ "wrap_help", "cargo", ] optional = true [features] application = [ "bugreport", "build-assets", "git", "minimal-application", ] build-assets = [ "syntect/yaml-load", "syntect/plist-load", "regex", "walkdir", ] default = ["application"] git = ["git2"] lessopen = [ "run_script", "os_str_bytes", ] 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.4" [target."cfg(target_os = \"macos\")".dependencies.plist] version = "1.4.3" [target."cfg(unix)".dev-dependencies.nix] version = "0.26.2" features = ["term"] default-features = false bat-0.24.0/Cargo.toml.orig0000644000000057300000000000100106270ustar [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.24.0" exclude = ["assets/syntaxes/*", "assets/themes/*"] build = "build.rs" edition = '2018' rust-version = "1.70" [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 = ["run_script", "os_str_bytes"] # 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.49.0" ansi_colours = "^1.2" bincode = "1.0" console = "0.15.5" flate2 = "1.0" once_cell = "1.18" thiserror = "1.0" wild = { version = "2.1", optional = true } content_inspector = "0.2.4" shell-words = { version = "1.1.0", optional = true } unicode-width = "0.1.10" globset = "0.4" serde = { version = "1.0", features = ["derive"] } serde_yaml = "0.9" semver = "1.0" path_abs = { version = "0.5", default-features = false } clircle = "0.4" bugreport = { version = "0.5.0", optional = true } etcetera = { version = "0.8.0", optional = true } grep-cli = { version = "0.1.9", optional = true } regex = { version = "1.8.3", optional = true } walkdir = { version = "2.3", optional = true } bytesize = { version = "1.3.0" } encoding_rs = "0.8.33" os_str_bytes = { version = "~6.4", optional = true } run_script = { version = "^0.10.0", optional = true} [dependencies.git2] version = "0.18" optional = true default-features = false [dependencies.syntect] version = "5.0.0" default-features = false features = ["parsing"] [dependencies.clap] version = "4.4.6" optional = true features = ["wrap_help", "cargo"] [target.'cfg(target_os = "macos")'.dependencies] home = "0.5.4" plist = "1.4.3" [dev-dependencies] assert_cmd = "2.0.10" expect-test = "1.4.1" serial_test = { version = "2.0.0", default-features = false } predicates = "3.0.3" wait-timeout = "0.2.0" tempfile = "3.8.0" [target.'cfg(unix)'.dev-dependencies] nix = { version = "0.26.2", default-features = false, features = ["term"] } [build-dependencies.clap] version = "4.4.6" optional = true features = ["wrap_help", "cargo"] [profile.release] lto = true strip = true codegen-units = 1 bat-0.24.0/Cargo.toml.orig000064400000000000000000000057301046102023000133510ustar 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.24.0" exclude = ["assets/syntaxes/*", "assets/themes/*"] build = "build.rs" edition = '2018' rust-version = "1.70" [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 = ["run_script", "os_str_bytes"] # 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.49.0" ansi_colours = "^1.2" bincode = "1.0" console = "0.15.5" flate2 = "1.0" once_cell = "1.18" thiserror = "1.0" wild = { version = "2.1", optional = true } content_inspector = "0.2.4" shell-words = { version = "1.1.0", optional = true } unicode-width = "0.1.10" globset = "0.4" serde = { version = "1.0", features = ["derive"] } serde_yaml = "0.9" semver = "1.0" path_abs = { version = "0.5", default-features = false } clircle = "0.4" bugreport = { version = "0.5.0", optional = true } etcetera = { version = "0.8.0", optional = true } grep-cli = { version = "0.1.9", optional = true } regex = { version = "1.8.3", optional = true } walkdir = { version = "2.3", optional = true } bytesize = { version = "1.3.0" } encoding_rs = "0.8.33" os_str_bytes = { version = "~6.4", optional = true } run_script = { version = "^0.10.0", optional = true} [dependencies.git2] version = "0.18" optional = true default-features = false [dependencies.syntect] version = "5.0.0" default-features = false features = ["parsing"] [dependencies.clap] version = "4.4.6" optional = true features = ["wrap_help", "cargo"] [target.'cfg(target_os = "macos")'.dependencies] home = "0.5.4" plist = "1.4.3" [dev-dependencies] assert_cmd = "2.0.10" expect-test = "1.4.1" serial_test = { version = "2.0.0", default-features = false } predicates = "3.0.3" wait-timeout = "0.2.0" tempfile = "3.8.0" [target.'cfg(unix)'.dev-dependencies] nix = { version = "0.26.2", default-features = false, features = ["term"] } [build-dependencies.clap] version = "4.4.6" optional = true features = ["wrap_help", "cargo"] [profile.release] lto = true strip = true codegen-units = 1 bat-0.24.0/LICENSE-APACHE000064400000000000000000000261351046102023000124100ustar 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.24.0/LICENSE-MIT000064400000000000000000000021111046102023000121040ustar 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.24.0/NOTICE000064400000000000000000000003701046102023000113610ustar 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.24.0/README.md000064400000000000000000000710251046102023000117410ustar 00000000000000

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

Key FeaturesHow To UseInstallationCustomizationProject 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 is a modern, Rust-based terminal with AI built in
so you and your team can build great software, faster.

Feel more productive on the command line with parameterized commands,
autosuggestions, and an IDE-like text editor.
### 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 'col -bx | bat -l man -p'" man 2 select ``` (replace `bat` with `batcat` if you are on Debian or Ubuntu) It might also be necessary to set `MANROFFOPT="-c"` if you experience formatting problems. 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). Note that the [Manpage syntax](assets/syntaxes/02_Extra/Manpage.sublime-syntax) is developed in this repository and still needs some work. Also, note that this will [not work](https://github.com/sharkdp/bat/issues/1145) with Mandocs `man` implementation. #### `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)](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/community/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 ``` ### 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.70.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`). ## 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` looks good on a dark background by default. However, if your terminal uses a light background, some themes like `GitHub` or `OneHalfLight` will work better for you. 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). ### 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). **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. ### 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 the `BAT_CONFIG_PATH` environment variable to point `bat` to a non-default location of the configuration file: ```bash export BAT_CONFIG_PATH="/path/to/bat.conf" ``` 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.net/), 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. When displaying such files it is recommended to disable both syntax highlighting and wrapping by passing the `--color=never --wrap=never` options to `bat`. ### 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.24.0/assets/.gitattributes000064400000000000000000000000241046102023000146460ustar 00000000000000* linguist-vendored bat-0.24.0/assets/.ignore000064400000000000000000000000241046102023000132370ustar 00000000000000syntaxes/* themes/* bat-0.24.0/assets/acknowledgements.bin000064400000000000000000000231031046102023000160020ustar 00000000000000x]rIrvgGp\7!shI@: э$41~?rfVUw5RGϞs1 ÉQi&y̾ytb'fd_AYd\,$ gs{DD&E.Ri86\㨘Qu:1@@E3qbL)WҴ( +&!6=*r2/.)P:Q@ ŶGGЗH\(oɢ>0sECޙ$@2g9||DQrS'$e8~ Fɥ( VU Eb$50v+3rX02Iis ys/N{Msyg6Ġ{'tzmWx?<99vF'_yׄ~ӅYsEs /Ar}jy$<^٠h{.ӫ-Tѻi p6G?y,zD/2'/4$–MT9z&p|6H$ ]U!ʦjV ͆x+ %Trd)Sȍȡ |igGa+K!a ǁx%c(4 9}7I 9HX\e9fF n5G#9= i8GC,!&X6 I=G!jiK^jYEgZzӚ@VX8~G )K($z8 U!HapSs+|@> iw|w}xX@D)& <S ?Z\զx{Pu6 C2g3<ze&:-D3vsؤ -~>>BuzCo08;ED:=j#l }Xkh? iQKjyPBgGu{ބ>~Ȉ;~ .->~aaf"Y&wCėR;kF?.Rӈj~ @kLU `4AiW{7IZEH ;6v2T[7-k|,w@2 Q3H6*7o8 F^= \d1*ҙ} jK̟O'rQޘz#_E1ô/??ߗF0r.ֲZձu\;}cGYHA|faۙAm MLJX50P4F XIѦQ~/iq` msHtWT::::7ljHIeR@r!ɔI100lB-C 1xr<(I"Hv5Mä*i oADC4 uVIq1RIl~\ȾAgzcfϊ`& 0'%#Ntndv7Ƕěo99nN$99ڜI1]-b"v/b"v/Ϗ//5a  dlI&D2MEb 'm!b[hY^ Obxn92Jy%~B ðeð2 ;JWҹ\Rn=O/\ 5:}`"7y%)9elaWجfysyCp_)Cǖp!]BpFIcF <̥`U[&Rxm983IX b.c4<N0c>)ݔJryI1KD5ȹ>$X U  +]t"|OvA7tJO@Px 'h3 ZU(~BIL"e?"K =N Ur ^  X2 vF{= Nz5):RhLAgڮƁ0|~" 3GI1끁m44}X}7m\M~#[Ӝ16ų>Tj›q<+XB]fEhr$c>ZY-.~JU!M(T00[e|AiTNe,(~]ؖffr2CڇK2!vO="j}7j}QD$d-$Z1pEᓁa(&NaC͹ 6֦G! T 5pB3TM6- DZ>Oҋ P/iĪ pZ%iHuc2#+Ȉǁfą5- !9-&a:X,#JZk,  m|!Au>@^h`> 2Yh[ +Z.y8[`V<{*/CZJb !Ij<4qD5݈^ g&t5i!7뵣J)AJti/A|A' z:̢Sui0MµȒBdZzxKR[W|]*$8jkB<<њi)QZB#'ud` ArF# ¬2mwL#$sbӞnK%,!` ">2)T>XS_DNUi蟹nE%v}1 `0*!z@D@L(9yc777@{Eup|tg TF]Fʭ1vcE-!(l-j>4@X}< &GnT$t *@,\u<3 ZJ\Q=(k` IJ95İDe.=4dYkr@EjĦn1HoiH9M}E#CقR6ʫ>L_02b@0W uPH<].JtEY?i}ڰJ:M'Oo[WY8H&C{~@WG5LU;VjeecA*4T:'ZRQɘVvQ\=+A9JrsoS P m-Z- Y jEf6-$s"k-o;`5Sp8Rю9uRd!0C1G+YD}&u۩eJKe-dX5٪5W&NU/hHJj]YFUc뎜w30jTFochȼmx@N XKRއK|BRbia/b|S,2ٌ-'- #UquC(4 Hhѓ3W*}fAPƷMϤY zdz>}:<\`ЭNL-+Mi>iK%?Y`xZrT+Gz)J=Y#Mfne P ՙ>xO˪[Z\0-Y5}+: MTit_`{]7m<1N%3n9*">Dz@ag\<7|hq7C$3%jU# 0%tRԁ"3* \,S<ӄ]t_k:U$:JX;кi*}.OMK0w;'y_j cKrH0Pn b9Bо-n͕[z~>JQ@~HQ-L9@n)mHY>)c, c xuǷ͑pll8(* b@N7j}n0ntW*fxWcx%j%KŴp7KŰ$Wad'e03veBHn."(2Mձ̀qQA_w6Jgz0&F H&9ܠWuC4Ǹ'  bj|{]\׃ی:'򂒧l'+mSIxPG#4rj[EGK*"kd1H{2sQDnh*j00^%Wh )S$jh#+R:,BN\5i4^t(J蕧bF)*|FWNp + Ќ'[\A $2uIJ4es V9ʉnG+lTZ!*ōXE1SߛHop [R\$<^w\}M0juR2M25A0J)3~u2R3wa&BUmYtC췓_@Nf*Tr&qڶ,ʊ:=YBɨW Ti'5(N*.CU]FތMhRMh_܃1xzS~ae<^S]KL#֊`/+M*(cK)ClYw*|Ϛ.*^WV~]WvQ_X~]5Kix^ x` wW1Z`Ũ죺|3ua{kP&ɣ0%8_%8_%8_%8_%8_%8_%8_%8_%8_%8_%8_%8_%8_%8_%8_%8_%8_%8_%8_%8_//qmL`Hś$WErɹ+\nIyi~o+l$O.`9?Tq+""5+|w|w|w|w|w|w|w|w|w|w|w|8߁8߁8߁8߁;||ct:臆u:X[NAТ ,>UJA^_/V/dp}O1s}Z_ݹa]d%%XčEF:%d >Mt5Z1-VzPjoG*%%8Y%8Y%8Y%8Y%8Y%8Y%8Y%8Y%8Y%8Y%8Y%8Y%8Y%8Y%8Y%8Y%8Y%8Y%8Y%rʗC%^9ZoYHGq v B<^XS4=߶{`u<#3838k_7`T!ZLƌ12ƐIa Ms!/wfɡ7Ner[J)ɡ7MirCU?L(Y˦)E-ޣe/&3<^!4P!1}㋩:>m.*O,jnu>] 8[;0GmXUQ )s8ZœL\c'f-pt0NgXcT:Jj' ;bM~FHqP6 +-`ιԠ|8$^&XTs,q1 <}S (?Zdզx֤u6 C:g>6φxI[u[D-Jn7MR xpvHt3? V^mu=*P?]`;(V8խpXQKjyPBfGu{|gpS#C-ui%E[? kw4Z4߈AE 5OB< ;):wzjRco;M<>Ss+C]IeaO6 {7PX.*#~a<: 0蒚ګt$J}g " " " " I6QVM>J.w sv sv sv sv s[ sv sv sv sA2J`|)$ WUʳR  caaaYAr+E6@Xt|N#6<ڂ+]:fj!f/\9^gj0fqlK!UA`|- N;ލyw>]DZ5HWQaoq {⛽nbCX $>ncN(w0{Co6z U6n|Hx;<<y}g|#;=<supy AG5C] _+^eYb'RD@KV2 A:+oVVVV6`*>pI\f$r2}~S!gX3O}BCWA"Ew]|-Ew]|-Ew]|-Ew]|-Ew]|-Ew]|-Ew]|-Ew]|-Ew]|-Ew]|-Evm+ ׮~vط+Pޚu\F{QQk"Am}9_R.&Z\ QQQeUVKSoS8S8S8S8S8S8S8S8S8S8S8S8S8S8S8S8S8S8S8S8SzR~Y_/4n<^ Q|߆Cuv]<yx Sg']2Q-|E:!݂-5^zZNErc c c'-ee4ȯՌ8o|z#^6f~ ^ +`Xaamg `.NׂܵdH2qx5ˢ'A&P,Nt5~\000| yg_cJW%LxhhhhBhg+`V$yKDy[HySLy;PyTy`X-= 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 | \ --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 "$("$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 --terminal-width --number --color --italic-text --decorations --force-colorization --paging --pager --map-syntax --ignored-suffix --theme --list-themes --style --line-range --list-languages --lessopen --diagnostic --acknowledgements --help --version --cache-dir --config-dir --config-file --generate-config-file " -- "$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.24.0/assets/completions/bat.fish.in000064400000000000000000000201471046102023000163450ustar 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 ' # Completions: complete -c $bat -l acknowledgements -d "Print acknowledgements" -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 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 -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 "(command $bat --list-themes | command cat)" -d "Set the syntax highlighting theme" -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.24.0/assets/completions/bat.zsh.in000064400000000000000000000113611046102023000162160ustar 00000000000000#compdef {{PROJECT_EXECUTABLE}} local context 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)'--source='[Use a different directory to load syntaxes and themes from]:directory:_files -/' '(--target)'--target='[Use a different directory to store the cached syntax and theme set]:directory:_files -/' '(--blank)'--blank'[Create completely new syntax and theme sets]' '(: -)'{-h,--help}'[Prints 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, ..)]' '*'{-p,--plain}'[Show plain style (alias for `--style=plain`), repeat twice to disable disable automatic paging (alias for `--paging=never`)]' '(-l --language)'{-l+,--language=}'[Set the language for syntax highlighting]::->language' '(-H --highlight-line)'{-H,--highlight-line}'[Highlight lines N through M]:...' '(--file-name)'--file-name'[Specify the name to display for a file]:...:_files' '(-d --diff)'--diff'[Only show lines that have been added/removed/modified]' '(--diff-context)'--diff-context'[Include N lines of context around added/removed/modified lines when using `--diff`]: (lines):()' '(--tabs)'--tabs'[Set the tab width to T spaces]: (tab width):()' '(--wrap)'--wrap='[Specify the text-wrapping mode]::(auto never character)' '(--terminal-width)'--terminal-width'[Explicitly set the width of the terminal instead of determining it automatically]:' '(-n --number)'{-n,--number}'[Show line numbers]' '(--color)'--color='[When to use colors]::(auto never always)' '(--italic-text)'--italic-text='[Use italics in output]::(always never)' '(--decorations)'--decorations='[When to show the decorations]::(auto never always)' '(--paging)'--paging='[Specify when to use the pager]::(auto never always)' '(-m --map-syntax)'{-m+,--map-syntax=}'[Use the specified syntax for files matching the glob pattern]:...' '(--theme)'--theme='[Set the color theme for syntax highlighting]::->theme' '(: --list-themes --list-languages -L)'--list-themes'[Display all supported highlighting themes]' '(--style)'--style='[Comma-separated list of style elements to display]::->style' '(-r --line-range)'{-r+,--line-range=}'[Only print the lines from N to M]:...' '(: --list-themes --list-languages -L)'{-L,--list-languages}'[Display all supported languages]' '(: --no-config)'--no-config'[Do not use the configuration file]' '(: --no-custom-assets)'--no-custom-assets'[Do not load custom assets]' '(: --lessopen)'--lessopen'[Enable the $LESSOPEN preprocessor]' '(: --no-lessopen)'--no-lessopen'[Disable the $LESSOPEN preprocessor if enabled (overrides --lessopen)]' '(: --config-dir)'--config-dir'[Show bat'"'"'s configuration directory]' '(: --config-file)'--config-file'[Show path to the configuration file]' '(: --generate-config-file)'--generate-config-file'[Generates a default configuration file]' '(: --cache-dir)'--cache-dir'[Show bat'"'"'s cache directory]' '(: -)'{-h,--help}'[Print this help message]' '(: -)'{-V,--version}'[Show version information]' '*: :_files' ) _arguments -S -s $args case "$state" in language) 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 ;; theme) local IFS=$'\n' local -a themes themes=( $({{PROJECT_EXECUTABLE}} --list-themes | sort) ) _values 'theme' $themes ;; style) _values -s , 'style' default auto full plain changes header header-filename header-filesize grid rule numbers snip ;; esac } 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 _{{PROJECT_EXECUTABLE}}_cache_subcommand ;; *) _{{PROJECT_EXECUTABLE}}_main ;; esac bat-0.24.0/assets/create.sh000075500000000000000000000034611046102023000135650ustar 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.24.0/assets/manual/bat.1.in000064400000000000000000000260001046102023000144670ustar 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\-\-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\-\-theme\fR .IP 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="..."). .HP \fB\-\-list\-themes\fR .IP Display a list of supported themes for syntax highlighting. .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\-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 .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 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.24.0/assets/patches/C#.sublime-syntax.patch000064400000000000000000000011061046102023000176350ustar 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.24.0/assets/patches/Groff.sublime-syntax.patch000064400000000000000000000011011046102023000204460ustar 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.24.0/assets/patches/JavaDoc.sublime-syntax.patch000064400000000000000000000010351046102023000207200ustar 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.24.0/assets/patches/Makefile.sublime-syntax.patch000064400000000000000000000064531046102023000211370ustar 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.24.0/assets/patches/Markdown.sublime-syntax.patch000064400000000000000000000163711046102023000212040ustar 00000000000000diff --git syntaxes/01_Packages/Markdown/Markdown.sublime-syntax syntaxes/01_Packages/Markdown/Markdown.sublime-syntax index 19dc685d..44440c7f 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 @@ -1152,7 +1110,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.24.0/assets/patches/MediaWiki.sublime-syntax.patch000064400000000000000000000007201046102023000212540ustar 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.24.0/assets/patches/Monokai-Extended.tmTheme.patch000064400000000000000000000024141046102023000211650ustar 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.24.0/assets/patches/Python.sublime-syntax.patch000064400000000000000000000012341046102023000206730ustar 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.24.0/assets/patches/Rust.sublime-syntax.patch000064400000000000000000000007011046102023000203450ustar 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.24.0/assets/patches/ShellScript.sublime-syntax.patch000064400000000000000000000013001046102023000216400ustar 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.24.0/assets/patches/TodoTxt.sublime-syntax.patch000064400000000000000000000010241046102023000210140ustar 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.24.0/assets/patches/TwoDark.tmTheme.patch000064400000000000000000000013451046102023000174070ustar 00000000000000diff --git themes/TwoDark/TwoDark.tmTheme themes/TwoDark/TwoDark.tmTheme index 87fd358..56376d3 100644 --- themes/TwoDark/TwoDark.tmTheme +++ themes/TwoDark/TwoDark.tmTheme @@ -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.24.0/assets/patches/XML.sublime-syntax.patch000064400000000000000000000005301046102023000200500ustar 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.24.0/assets/syntaxes.bin000064400000000000000000033741451046102023000143500ustar 00000000000000 Plain Texttxt text.plainYxڅA 0 + >/<*9|efIƸy=->+؂\m (vp{Ц}Mgq/a SCASPasa 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Ƶd7Iqv7)Y3iZV$JH(۷H.E ,v0s???g](53@>ggs9~i؎]7>q]wV6~g ~e r6{BLfbEKNktz>^}ױmyB@J}#vt@#G=x q(4mlzr_f*6fӯa3d>`6-DB6l<7Fϕ<[N2zf+-SZf[X'-?W2[1NRԣvL;´RnQZ8v:[u]] *n2'Ju91`eV;5o &e[L"!qJ*]w fVR:bSҤ 6D gFW\Cf_HzwJ.w0-6m;Uɔ<$Ƭ0KwJұd!oH"<4~MR`h,(WqI((,I&UAYh#$#`e\Sqf$.@sJR6upqIn$$|PJYے$.Aܑ$sz}v}W1 -Vܓϴ,r`XTcfܗ:y`0o$SAdqk{hڠ&V(M#Ζ Eջ;RiC</2E?d@xGs>~5X%u`Hߩ<1eIfޔADW"٧}Y]ItuA֥($$<,uzZ'qtz ɦ$qx*pvs>9k Eؗ7PE^̧[-Ҋd8 iP)a*\tB+"54~xh ofn>.L0?`1@JTL̨ Bkqd)9jZջ9 jIΫoiq`oxU6A2Y9bi㈈ʘv,AA?7XXg$&P*Oj,h=0K2ǯ UQ+WMPc'SCJMf+l?؄U0g]x^`)Lf2*_řL)*0*&>YabII!\O[@5jR( @zYsIc, Y F,do磍ZHQ-k&rw0Ӟb!q!OSeL#ڣ,S*ʓ?Jfx.3TR!FwDrgRC-kL0\Z[5[@\E&KtɈ0%B)E9N)1'پg&3 S!@״i+tX%y"b}\4 #M63*+DYѨߗ9TV4N1>j]sSdUgpfB~~#G-J?(c2 A-kwȄ$Nk` 9lΦ$G?Qq4ڽ0uxVr\)} Ťk!9C^ \&-@fv->z77۵~}[[37&>RbCMUk2vV[R(w \\k ྄4!{sR鴉}MGlH ͈L찱IpX7,l3҂[y i-1JehߗM u%@Ɠ|1-'/{EZ6v5ÛG1n"5?5~v{ذ:iBduq\{kvv%YADlƖt ܬ:?le ^W"TFfa##\ 2.`W+$ݶ-|G=s5ys!;8&-p`q7 &JNlo!L}_`{tJFW{w%Y->c%MgL ԥ Bzgr !+15}&;Zo?9ROFFBAྨx.dZ*#Y望6&<ϱ/TFp T|8 IjaxV;JiXɯP ۝9b oQMw)1TfSuNaj*҄;o(l&܉n Vɤ>u @THѹe%#*^ !Ğ7,AfyI9wl"ZO׉Hj-S#:í.ٿfb挘 }F.޴ybםXS ~o 4`i9oF5Edz Qkɔges#0H^ʗ^a fAi LAPԯ6i&؇:=.Ȉ*B(x]5mz"MH/_l;4z$X,b_7*g}їVaEO@3 W#п;0@: љnxoxTBElB?^1{X]6I7 c`Av6`s5K q`2vzL Ϝ76C!.ˀYF<^ ṽ;j5{}7ː[ƟWis?- zRYTt4 R vA)sO$>x.H?/(U_٤R6!4rh(+mGb^},UjH+(jWKO0Iʟ\ҁ0Iz=G,CSx-n~ ``A V_#.cX\ (6 =&:`poA3 , ё:AA! EN/ض۬\ܞ v8C[@bQJ2qB+?aEyGfkaܱCV)(V,`68#4?f2!ܗQA]7,t^ *-ų>^ߗ)^9S#f2٪8YASK!ܲczLy{p&zG瘻u|ݘ%G|qE\x3Mi4BU\;w +mS|y -~?<+8+~N2*gdzcZőHBDe KsUrX nNV&d p+ pI! 'QiSOar&OOXc$b_e,h_Ŀxb'5AOtT *rfC=>Jkp^EZ)̓~Z8o ffQ[8fZr֮9T>A`8ޤ8棱E k״;o|4l ˟2Ѩ˧_߆+J?R!PxfydGoG>¬Kh㚒 ,Qƙ }sN,NMG:1tsZI5 ,; Al٢:ΜU(h6 p#,hHpW\.,L0VW@q'QH^vzsG4)fo eXz`4g`X=WM^^=rySac&covW5v$z>`(nts "?Ғ5.,`o35"|q׊U'WD UBp HTML (ASP)asp text.html.aspxUKO@Zz11IkDjXcbj"քlaSB`1ܡjslgf̲|ю&Q`^HRDS7c1^HG^R,\zF9]Mem{B<ں+6$^|KB#@ۂUM'CMAUڬM߂FQ.!؏hu@6NFlAIRHi5[z \ʈh@BxǯdS#IZh7ۭƥ\jXUAJpXq@:/"GY/"K,*sZJ4mJ5;x lf8JߧWG-60"dTfu{}ZCǽٻ}2oCh,OԺ>R:Y0n dD t8hpubsilT\e+hrjQ:+xǡ1uL=0AOX\ Cyda'+<-'V ActionScriptassource.actionscript.2x[nFvn~$H ?Yo֛-wd{@h[3GZ3c6d+6ICRy3{lvK lYuKgagUdO{g|wML^,N dĺI㪴US03nL t®a6̝l\ p$9Bj‘XiRJm@s{Vbu,WN`yZӍ>i01R J8=WWW(k?Mx*jc8LO{7uayfWB`:a9AqL :I^eGy'D_+6;q1V '$ˆ1VTZHrFѷMhM >``e-Θ^||% ;cz Blb.RztxV~$HwdEJ$u/]k-ӐlƦFeKS]_wSUM +¬/,NI-x!0iJ=@QV{\:"[#DD Dvb%M0jj)CsQ 6VVk"V`Q̧f YC"š%nís݋q7$.5i%E&|1aK`܌Ȫ9}A]nT6R[)IU4-DCQqL5-n 0 iT_L=q}wHLr|C`a ~)\PL+ v~[,y_4V aM.W E?}Vl!>1`00*S rjN8bSxWIP_w:$Ƕ+7NGA~x`kM]|-h,K&G]`ڄ/7D|Y$?^ Ep}P,_Ӷ^u+&IoKSiZ8ٴ^ x[JrZa { _6W=6?}$%IgԂ 맫X h0ѲK)'Ϥ"MV&h17hPC@@9:pHqHo7I Gp8wEKqW/I+XcC8 !sSӘ0HB! ĉbN++D4@d%7[ck+Q. `"± dQ0_nERXg*".Gg֚^U5( 2k(>5|C)\n<5T-%TiRTP^)ej:a&@*4횤<GހsQbԶ:[!_t,-=7%**ߍD.T\ZBfi'XUCC9ZR7zO|rxO2{OtYn ZImIe2צAiHƱ&Tm|c-IG?Q XAÓrhK;O,GJE费 2bCZ)[0]`cyE-}?h{pX$Oڌy4A.duu%FH߷5s')É<2B1 @"@s+Pbyufe#ܶU,NƏ6d ^`O'V~ ^1ha)]^r΂p;ۭPedHE@Bm sIaM%і@o,[GjsQ{*%84HHXIJ՞L@a,I^n1dX9M'#ʼtY2(]頃KqMt^`-Q{qiض;5${Xţ6"NvWab 5J޵> fqBf\<"gX RwH"•YS2u;tE3hyiŽ,|6{ojtM{[wK.~h #Qnyl-ZkvwG;mmr6GBQ־m}a-D鱮uHWPZf}tО>o{ߕh n$U |ӴG 8bty5@ZA.hd`=lhCYkO 5^oM+:PZm߄l¡c[޶za6;YR x6D WDl= ;ZW=KN^7kmzdba^XOGz{vibd$_p%NF)K̠HMvګkn]{=J?ivߦC B<2 wi钁_c]3>ªYRpJw&rዎRP}ܫj%nw%6YAѭw+Trh@AAFwL-r {!0׾!ʛ%48q>+dⱶ:<ӿxƒ-h"ߋT:[s ?/>ur97YQfn6+y7 x^] m"ENҖ8V*0[YⅬ oyPj=RgT;ϖx4KE꘥i Y!}.7N1w͆7;5kgUOt"n֔ƍ.ߊ$V짺F_=I"䕬8_7TBqRHԏk.+4&AJ,ނ$tMdb"a[?kTQjz|=lӢs ֯$]rGf e6VGPŻǯ0\|bܗן{,3`Wl_?{~78b:`2=>;^xt1b>u!g'#7>/N?~2˳;|9{58~wSt|p1~5OƧ㋯䦃!MΦC_\8wΞ3rGI';t>[Ní=1? .ϼ%#cO+~D_n&_.[^>nWxovW}oJBgeu<#AIW4Kޛ죶}Ðy~1hŸ>2~o.o^ h(ojx+o8rAxjMHiAzeiU^8_ 6,xsujZf, dmZ0ձ.7p|1(u4sf#k)U|2@hps P1Yi1'X5H?,,X 6[f!yDT7lA^bMbb3&Mvm㌤izn>AIbC@0շu0&s%qV'IOԩDZɜ٢oH\hnlDR670#6Iک1Kpնk(?o`5h'mdC#"tG˸ YuBe#ʢ;iv$lj#<\j)lDa!`ruoy/^[QH`dI Ci3>B59mP<~hrs[hS˭('fh:-Q,cӏ:ReuZ#u4G0rv*qUW} YBHuL(lZޑVXZF,[Gdo?_*j'%o&ˋ fOXpwM㊃}yqlkiUh=ж;H$H~y:VTR/?H* nL<]'yi'O1d®NKFxÆ-q86@_O-:2-^gt 'h 8j<!bGA"zΌ(8pGGa4c>24+elDdo!'$hGphd_ Vy&)˦irdI1w+6SC.2bzDoFUO= dyAGzdč褎aK2 z[Yb3ẃB/*H3^2ud$I>y+tĠ>;ɦ]ooy$PFW  ;qƠ?Ti#Ï c-,$mj\3|`#5kZ2"hcb_L^S;Ƥ A:i_=VSZ*{rS‚ЇV(b!Y ^>4])ӐaܤsL N М hni<:>+ZӃ1kx~AUsQ:v-:fCzrs3Hq-@E^2+X_:;Hqkqr'񺓤z\㘮{ʈu" 8$>-}uH_~;=%`YCWoӃƅNe%|9cu 4.Deє6Y4jL_*3p׍)NSTFq +LD'a^6 LKf9 (wC<*;[3n`R1S]tL.hʀ+G[5)W,Ы}W,{+vۦRejAU?=Ef% u2Uܦ+6AQÇEmEDck0vZd*S5t_S:LX-XqʄTr"\UbW 0Ρug + Waue.}V,kb60V &v`b,5a@mkoȖadޅVhaƦa la`<$ޕa* $ILu2µ nXOVAjBR2,tj6ZW{чU]8 u&0q W8E&@ѣ- eQb KOT*6$pkbgf>٤:*6uƫ;P`W\[8h!y#pEa^o *|t(Em WtD5mQwO/sw|3fpoh/T@{BIڭJ>Q;T~ ,l*x\pHs&!lA /#?%ID|[qElRomu ee@2.an`l[pd>ejdy3|τ5 TCH~!B2Or%Q2q0*9CNaX10yapF~n:}.1uK R;S|h'kðK5U7>c7!46`+~ꎧprq+ I?#[]w gdҍV˯Ǚ_%{S2VM,gHԂ_TиG>ωK_P^n*?JC3?sT s A6b70y.bDC`UG 8O! - Clv,r$A1lb0kpHB@9zx/SOA)y+tC1beM6b= `ï<[0]HDEB=?>}_}q2KH)WC  $6@pLmN1LCb &&~LhEȥL\@alg3By6m0R쁚*XIќNڷofm G@0r# )1`TԒ́.4&db%K DѽBvvJ I"fDMבE2 _D] Z%H0^p&xOB OXX {cnp9]H OzɌSiJ;%5E@WIH AWnjrsK(rZx%2+C˕_AhH&1g EV\ُ\1G>L;g._^b%&&94L~g3Ź A}W.I4+'1|@bg /~KuOGX l1r8n>\|F7NŏEbI.]¬x~ %mZx!?:{bV#LJ ŔCU +ltN|ZGq@v`6Lv F`v9[rfxfٙi[˘8(AQ+*@ۏ¥ yXcͭeXP V1&J$#ē.ƾ؆x %~ΥB)~,*)w8%b>)O%M!]߬S/vX`Q0qw7Jx\pN@f0*կv L)M7'&UlZM ] 3 %p݀(K`9eS)$[r5.C[Lo=V%tb,Bg`A`<txRqo0ԫծ8n Q0Q[~(W;'No:|CwYm=ԟ֣gV,놜[ Ft6^^m|fd8Wϻ);l@xS7@8WC%iI)ſP}yW69WnNm妇[odb-a<`e^P˛p ˜T]Eu!lyOK%)DrQAǫjݲɰ[5D~@2AsF ~E%(o|jT!ִlOnnF 0F'.IuA2q}c'}+3@Tƙ@qao- NA: ?dDJ y_h飺bVy^HWȇ j)fXkMࡆbg%<~OJ'3'u'wN4iʻwXIHç܀(E8sT$'YR5(6vJ08t^_T60?P¼p.dkc5Um~r5VVfe_a}حpS 12 f<\F)̃7$ĹSȽBT<~7Bqp>~:wR*Bc0*v:(R3Eg&0&jq@c1 !ɦs?dSR (52SEBUB||~c\"y >P+@gڈ\U7 3<80e]Į3̀LSqzp {5VX|SOm;ebh4*z֚L;<~dߩJ)3y~ r Eb]eXe t]&áE6FtCk`y]w"oCl [dK_}uNhv4m53)b1 PuS}E<>kPX w }cY8hpX-=K`T48"V3P.<5=ubAP/%&0Єӓs܀fH hPkgУyJ3/K&HSAvu W%.%`TO&BPwQڎtwpIx'eNs!`4cµ <ǽ4qPy\ tT0lQrI1ŝ—$r(N*ۈTc>Vk8㵌w߁H&VFSzSk'3rFLGPǁirhBJPy Batch Filebatcmdsource.dosbatchcolon_comment_start (?::[+=,;: ])command_terminators(?=$\n|[&|><)])set_arithmetic_operators_quoted(?:\||<<|>>|&|\^)!set_arithmetic_operators_unquoted(?:\+|-|\*|/|%%|~)x[s6Wzi;+Ʊr5ԭv?tP$(q$d9L(RlW|~?Iyݎ؉ЎAc;H>=>Ŝwt꟭9#6[L7Zg%%#xnu6]Ewy6=Eʏjt~.M- ^^lۢꥶ-/mjJTm[ nZ0`4 Y'LZ^ACzzK ToRqNVu inw4)MV=Rz~Os3n5U'IY+RӖjU0`R>4V:e3I NŒ^w?ܽaF`K<: Kiu.4ܿ;Ka9z^žg};J*t{]; QM6sG;__ 0585R95%8seqT> hE?:AvEpSPAt:Ok8#8cj漦B, ]7v>aE&g >ԥ@ՋMoh X hW:5YҴ΀^6k[1{k\~{dMW\ҦJ,؋LI@%8u{*ِ )]5nak/5ը*v~6xM\pV~5r5~4YJkU#K/b_ !CȢ2tjsK|ʳ!Ugwc-'~SKUywJbDAYimR-zk행 Q2E&iè2'|4I4?4H2ir ZVu+Ms7cK%lYᯛ"b|4NMͣ1_?:{Nܜ33uq&9Ėi%bTvVx:u7,╦ַɼ~Poa_ZL6Ħ8{u) Ҵ=hu)AuݹjwiB5bIhV딶#a޼˜al]7_2Im엫cd0J\a J$ST,v?Ǟo;'E;;.s}.qo HNc;A&4KyNexlFă8R?8>X:p\\ T|0PqcAC?R7p@c3#dHB= {㸍y^1ʈq@ceN'Sڜ .\ pR (.&@ g'Qplxv`tRle,]y=h"HCd.֪V@ ^ 0'u`{}jM'B>c-#<^-J%ür@̽A 6Ay+ӄ <*9 8*0{ =DO ҖŐ8`g} A w$6ɂ8&0;{QBt (bCn{E>#8}joENC $'& $lS`{OԳtȪO! rG k]K;Շ5b)TNا LqD O]AiC1u2$ɒ(S;,$R߈d;B:fxrrTZ}HC4YsM4CϐA:lyu`R`t8J d7OTEpG",~r)XT}e9eYnx(ƶ  }"ʋJ4W% ;$,$Iً^ƵZm7bDt,K;ҦMM54MKjWgj56?1L4ʕNe~ȿ9|M'= 6ʣ#aȷ w ooo/zN`ͨFTƔ%ɔGaՏ:bc%ڵ =z3ކ losm߬jnx WȳeGbBD?zVM1.QmP5R!_O8|jl9' W4 pe|I)e}!v_oB2O{j]@ԙjK3ڄ`;Ƈ7cR N{CvnΫصqr6,y߱|u]<~ctV@r8X@YjU٭joteZ1^/EK/ۛ~8OgˑU?hA,־8Ŀe&;TO߼T[`\Rl\>÷wfʕ<;lbzF,{4 ]D,|[^Wz1[ Te1WSFxNv-I%^nS$!ARBZ9O;_HCcsSa"<䑠>q'[D60&J5hs*q2lNV# 뉼Y hFrb RM$#Bs4|l#"e}. ٹ.0[f]mu$̧~}d!LNo; z֔P1Z^ qUi~݆[eJv?l9mMܪIk|]TRnbIp<JSVc{"* .ӬLRyJ22BV{<:8H} os3cN?p `} >pIRC#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} cu0ؖY,[$ K$EBNMqӤłX,D1\6Mi&m&iѤפiz7I??љٝٙٹ Z7{oN% ^/{a N؏ i x$y6Ask}gUuΙ pg꣆H 8nX\?c ]nPÑߙ$)$ 1B\z#9 =<ϰoCɍ!3xRi!o*~XHj<$p`Lo6N{Y5c8@e6xu^ww~"p'pdΫUý ͩތ.ނ.r4unQrI FfI%…{zWE4aIdq{`=fСo1Y2rd|ex/Ke >,A7/V\A%e$MS%N HR͜&c'w`^tw8\+0rS`f6ep$)g$V q5xs\jg77*.ܺr{| Ynf]8ycF}ٽ:cqӴ|>y02  T G z5dt{ 8PJ_1qK[A K 9y=) ൷ /b헓pRLz_MPnf&aB |]_od+@V/ECQU`U$C0a3`accorlƥoqxtQ ZJzڟi\" h0p\Rw8&ƁqsPA@OBC)]42`NEY3ԁA0 o`bm߹*9.'d =A)kgspg#}Q^pܐ;B*`ަ_FW0~Wag:[._D ¨~ "ʌ[>`Э) fs ox Dpa7Bۖ/P%{ ,0Jv&Q{#jw^D(.P/؈F=' ;(: (x?Ƌ>dA Z5nuޛ#}}'{S'@J7/]VW*xμE=zSE=X-λȝܪ3,2Zd2:D>JIP$]+w2v6_V8S64 U }d{lvo{@@7 w `fCAW+:a{i1]J +dYl& w)$9bz:$',b p 1Ȫf-#/JF]Tx!44"B\ьFjë<'$*˿I\~W%ᅵAs/~﷛e'@Uc=ԝI!] WeꞂ4 #"t"6] P G(K kVjPVI pa)ɇK+vjk ͬVCjks9\vЈ`W+XVJPLȘ[]cɵJeTG0ܟ}HqL"/cF4?ܻL0 &l<oFkAo}(*XJPH}ic} ^ɬyy8JcRT9}rv`il|MHg2M{i_guQ1:D<$ &XUFT oH:uLJQn>MTi`NN 9H8W:µvcjpOiJ[Jb#W<(le:"-y.0 ƻa<k,l"$벊5q&_͉x7>{VnU!: ѥZԌve絯N^884Sk{]CyKҩDEsPG3\gJpo>C{-4/Ễ8YSȮ%3I'0Iaߧ%IǙ#,qIC_=ξ( c37*'?F `*%3\}!s2 swSę$(_!v Jc"+J@bEx#URus[F1=ANF)d\Gǹ\Q[0bxhܬtB\pP`}F|F`VMsq)de'-L{#;WNdf$ #;;DFpUҥZbT;X ]1\]Kbh~%]*e8-ɞr9"8C -jþ?ZҘ\J 2PNSVofA%R6d'd"#>91O3VN -G#f31`i[o63njBTc(y[M;{fIC63HFc7dtO CE'˂>^ҚUe)D`&k Y;4#48E%P|riG%i8–S":1s dRZT-" i@5L y1qQSHZa81Θ5#uЕQ!hA& 9Tt 8^G:K W5g[3~#`Zo$rBR#W2Qʱd#DirӒ46i+d1oLbZ ʙ%g¿(uW8h̞ΰQ'#jw`:l5Xus^'s⌊J n,9<FltM^K ZK^zh~T̍${/q 7/ 2oeݭ$!moz t\4̙CVS SLN [n ]Nc$ZZf2#? $R`@@[fZZtl 8ad\ewPL&ɾ&Bp qă J=g,l#fa5x !/3MNFEotAxT3r7V(j9w.AtKcOudOkB3c⫅Z]nvLm KS *VRO5,z~+gd2.724ʥsڢeF7Q%ӈr~&S6dRDڔ{[:ʒ餥08+'t_tQHxPM$ 5Ԙ; lNँ1RlI2 q}ײ/˾Uis+u=S6:V[r84<Or )9 ضLOʮ -#o2Ѧ'@mG 9t fٶ[ҋӼxc0zJwm m0[3ЭlMiJoOMն~Q D, LbU@q`+jJVn`$$c],L;]=.j^K{n94O(SȱgNIlD.m|> :~\/ ޱ8u,0o2GR- (<4aKѤG,S7S,YbE//T8UL 'ibFET/Mc (Os 2n^,W7dwiP?w;J4< Y[fS] N]rEw{Ayľ֭ `)S. g{+WT^;]qUh+hB{}ڜ`A͛7)>t=@Ua:29ޟck0KW/S}^:0a {-*?gB>Y(fLGelFedsdU^eŻY0q\o+<#\%1]\K $9"6HbyP{m;8wWAѴE+ygN#Ɨ@_exyώo蘿n-[0ߝ}:'Y 4iFsaY 8LP #cvƥR^' (d@ǻD˜#+sDl&.IKu)8lW.E bQ)ؗTFpT#H70$iih>>4Ĉ HE(!@ #Hn1;KfҸG|dTtŸBp%,efrxwhLЩO쏝 :A]Aϑ̠F׊>$eUJ +5n&-۔F0.Ne{{j#WXZ0I jU }r8-!X b 9rf25Yi;nX_*_VXΘ* VmJҡ'2UF]B-=~ ?x )o_ܗ[)7y7) 56zˮ[t7kҼƳ{O/Wg>Nr #gŷqVLc nR+=v~8z62b#c/)d#owCG%GL3M+XAHHKi$)7obvn c|4giS8JӻC_lw9rv?RG`$;v0/߆?kMS:c9.ec(JQ4QG% oq{UBs{f&ܯ",`|TFtvgMXc#3M E^!h "^J:{\DZ?3R*\(ޏrH Յtڮ[t6w2s_s̺bj ql[5åoeޢa]4Oɦb L5"=#v3vqp O͎~K&O'Ą:X `qW=P5X j M0 |I#/;I ٣P~'"n螴٘%7kaiD83ThGˆ-Fc&L7'M6'8R1q5t)kOQ'Cu^6Xp LwRzuòU-ᮌei4Pۅ*saXrB?!RHO6Z]bh[RWw.9 Gqn72 O> ꓅ @+VzRѧ䝎swxJdc%}E׸EnԿvj?MJNr#}1-ǜnj@ۀh1ϙ*t6|L@=,x_.CVC:=G<=d~f* O逕MfJf W@)?Plpd|Gues_ĒBOGL/I ޽,!:#Ix8Q;N2%0)Q'lM1Y,dM~X?$(q"EE#ؑs"R= /LjcRތMO]x WĿRK^N.5c~=rKgRTC vh?*T.KPMRsͻ OiSPwF;flNc ཊ})hƴe}(t=^b5i:z"zdĜ RPtuXWW*,&?kn=r##>o"Ra4S-1EU-Z\JrkEC8I7)PǛƗTOdIݷ>ShwWR)A'Ge"բ=bk)@BcR]`4 Od&?Hbb,wkߝ=Wr-挙ttYѶ'bbYdBJ2eLi$_;G-[F~FZtjFWW"u%D+`+ 6+V"s415yXUAfay'_g2978S!ЈM.L8JșM{kBvvm {1r/^s2m-H _5tK><^ c f:c}5,Y_ z#_ TaԒH3(3zݻPYG%2|K)}lOGJ|k{It,1{e)`Y{}`A3$r3G l\摾'iQ2ZBc^sI{=i"B %u PG7!H 1K &J *C!\*z+9CIB+O*J5%)) [xޤ;uZ XG;v^k:}{D,EE;v4bϘn[-gBP#Ҩf>.ۚ͜S?,a9$Yee+]^~  p؅By3LRvcLqՕySLW> (PxÙshqqu]h"A6ЍWٮǟ1&:-ҁEA8 nʧ$dT$ϋuGAXk7W,8? 7^PaI!$)'8 w݋t^sڸ]rA9Oc/Hy)R 2ܜi{f|{V"@#'.ģ- v8i80vTAkWbWgEKjVӧ\JnG^ɭHk2(w;I pOMdyvFJ⭅Lggb*U֜"̵T6('+)) ~k\yI1`@ɼBvF'r^tJ&ȏs9h5FQ~+I5R ˁ'%u|.%f)>7IH1A]ؙo@Ǩ߾f@lʹ DbȔOUB39TNߞdN qY4 ٻPOA:NJH><&gz6uGreI sR/(aJy[\cVr, 1H*Rw)Oꃃ-~䁨W)उ Ì |lt>nޓhlMiAp0v7p4me$O*ehYL,fƥݾ2DX0z<1vp{J4rGigcaIC›zB]8CT Zxb30#G8t(?7)ARu):^(ŋsK}}*Nfsg Fs^ˌJ+@AfŽE Xu+&@qDԐ2A f;ruǾoW T,xkdhL 1v"[6X_Ȇ<cS\4aBJSq9^!m6AIݞeRg0͒eNx5gv` 'T7vwLg2H+ȵ,+3 Y /*LskL?ه]:PAɤ>UZGASAL'8zPC{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=gxGRr;LJtKNJbl?YI8Q"JJI:'NwzoNޯXbHJp`0 di$]oi6Surņ]㴚[ʈb^(RX?IOJvɕݮB%햝kRpb?YEK8l ݚr뵜]i9[vj-:$&*0?9->GJ>;V 9BBhz֞5$ݘ} Ii+Zɧ# 7Ԝ[ :jܬ]X{Q+fJzA#AX' qiHQ-^LlN"İBkb5LQ+N5R r!iR9>]6fr0(łs$]7g7Yn83)&kYI1Y+&&5faU6k8j2GZET$mòV òv ò. >£$ž{1 ֋vna!7&@bJJDhj>lκtDRj(UbAXPF@^xа:(Vq:(&tPLf/e?_o90EJ `hbXi:E$3]*9f>2.IΈ4:T謓Bg?&f-V (Z x8-+' Y@ j8s:Bh$N=74|P!S|I2gR:OL$#J '* [Vךb=IѤ)))dQ`4T(MXEKZ&iISӝ8xI-ӒdNYkK1e %L hEr8šS!֘BZtXk bMsI5,H᳆I诒t!JfӗQK_kKba'H:l $\p =ISRZxՌ˰6IOE Ͻ$7\wr>q$&vQ)}$; ӳ['WF|dZ @RۇGL]KHJ=f9(/4пFң5 RI=C4fCna'Z3I((StfždmQgY֡h!34PQl Qt("Gҳ"$|U A 'Bh}" LCK5f aHa_3 1SC Moe"'h]($fnT}hj6QLBMq_&(nѩ $[ $/y9x8Ǜ@NT%z,uw*^!+ho¿R*x8"`K1^-'DQ_CғeMQDA_KҳePՎEz$&\T7HF`_XI4$]!7TSo iGEgܞ y+IFngV+o#)5並٭r{.WRfirJ;[p2Upʁވ}bv($<zu T3N nHݜ4ڕ 쥧"- (<>JRjz3w6$}\*-e('> ҟ?)URGYU>%/OK^a~5wD< k%ϒ4pLKR4.DH5ZIz N4VUu\sttM IFѶU"~T~M2xR}}C'.ҫ3mq$酩J!J d <h|Q!.:ZD5}KPHv9 ؝CQoB#:e5%Hu"X <'$@dL N+gY)IUU)/% QTExQC$v?QK\ߒxwޢ`j!]I(9!捸,$KdR0W>HX7J5.zRC;phUf Y")ؿ$#/RտIO+O6Զ7ʓe[򥑑$λ)m}xJ';1^bkքjv+Vh1ȷ>Y +PmRKNZBVrc2dM"M <:䤵}Ӕg>y>S1ZK#<"$p%SxpDe)PnҍV5tpBitԢ5PZXpAf{yroWaМgf4Rt4PӀ?W13mάzs w/yPZoNu\XuKHѶ}&*SΰCd'FGGQXs~aaF'BsĚqevu sz7%rpyuD)&Bq@tiuyzRM}qB_zA}K-*5?++mTB%47ɣjު . 5gK XX$] oPN\cR}jd{PV (}*~MZ>ݠm J^x;/"z5AC4{HӲ\B}_u râI(Qy][9P\M gSѭL7-@U=BJ{+zaUwST+"L~Zih"6+r@%hzt\G+$91Y؈ut(Coq9$JPX}gya OTVVĄ3IA*LzNʢUFvbv\x/3I~@3A"TB`9F8  & _q@tJ +ei7$X* &`yVĴes cT EĞliP;SvP5lH,4:b%j5n :ʎ'[u=&pرLXc(ZY`<ͬ",So@jMW <#CIW*@Iܜ'rbJ} Ypdme͋`ןѨE!8]}mÁà +tyZmX\`?\mDʅ^vs)591:|ޮ S{|9Ox;v6l ?0Rr94( Ox,Z"& S޺uLdm ބ.n5JOb, WWQ`"h3K?X-._vޯ2=L!T# MѺHe5ϝK7g[&zbR\'o1nCg/wP6Ny[B= 5T Û?#CyZr+*]Q1FxbZ׸(97J^0>ƛ2"ey0ݗ xŭ b;=]k9z:Fwgꍖsrv-^@ߣˎ./ՄbR.93@^1m#fnEYg,9,ׯnށ%0L]6@.5QWiZw^3 gS4]1nϤ1#z:pBQKA/TDJ4D孄k(%dGLj|Ԯ7:`! M\;ҹ29"8p<>O*qӗ,RQtlr_2,KRҽ8+&Jh@ߥ~@&:4$jvSO?d~@X{bs,f(lz .tә2>YDkݲC0q]K\Wk\ZV]$M=VA[7}y0|Aݨϣto +xѼ8r۴+N] m5*j]!,dq,(W;MPF2uO®qZ\ŵ?Nu >WTAsb0<`tUFWy#"q  cov~n߸{LwbM^69 |SZ[y[Cɹ&s#SeS(oDcٚbT(=B.ŭEwѼ3h )s"A3dѭٍ2; %s;DGK:3Gb&.:eXAK:ĹqT&:.7W1 kvcxLZ 6lu؎)r &P~SUYtG MXbתH>MB_35ƌjhRk3!lmC&>f @uS6&)kAh$yc$0Ai,ڿ(].n#T?(T?Z=nItx.( *z.0lqfKwP'@u QE1Ʊ`kFdCG 5F˕vc~ k}zJ&tҜ7diO` ʮ=S7[n􊌴}F\1vuTqgskje/K-dTՌu)AA.>-G3"5b"1߭ʹQT`ASb貚aD!-;=w:Q]r8QX}gqQJ&xdEBUL'%"*d=LeI'ӗa*ɢ  K 2"&RgjVHcJiܓN445,V4Ii}EgfMz?aL /ƩzۙHC#7T8D)֦5.i h+jّ_CMwVV/l;vc2&HYh޼h04Tg_h0ԻTu;YGaE~-E1xN}Gd֠-xX 6)thRΚzbju[W UnRB=zuT*wODzCcVwO^gMc_'>{$pRIj6[fTIyt$z,!]:RYd '>3Ӑޖ><909e%8Ĵq,G]"+bcgq$uUɨ}IF.MCh˗y@)Nū2@ic8b' mneJwh`(̏x_q. )]@Ii.p M!>HpH0}z;+Ŧ7Ga2[rR}J1o7ʹS=K*a;N.$~4Is\Eu)a!Zݼ~D| TVi'v*ͽѩWvy2\|AS|n&ߜQξ73:*(NG66捍 !^ZtWG/rx,N+z#eNZS#)+x54;֟AXt# , :"EC_N: Sp^4\)cXL JqΈ!vA4G"6@״xOb5yך8UTHtrr$m6!|[ڷ!4j gHſ@|jZItxGHGO; Jƈ- cu^> rzyq)qxQ1c68#V'3v*rq,Pe$6*CitNcs|j{EY{\XZ8k)IFGtH>MOc ܜsJ^Jp=SAݬaI&>Հzw2J/\2@ .1Sj M$~>f:W9 amҜ;MHNLZsjmCRs&m{ ~xYrOzaƩU*7htψӗo_Qx?~ S@^J~ğT^oBS?Gs4~ )Cރ@~ڠH9@wTiG\G&C07}֌U z|a||Y3/Nuk A41IsD^|n ejыJi}~˪P b51ZOPqNse55תNB[=DG˹8"yY7S_)JdtzH=31|!i ɰ ձ> ȏ fNSȏT̷1F)W.X/6UClgsr I2ş#@OκxC!t:i͐VT·To. '~xW8| [y[!]~B6xjO]wEgZ묎bڿ3q'Bp E<)ZA[C94Y"&9( {AwzR+իbďiP@̙K@%oOXu,\L18H`^okӥ}dFf6S=h,&H[h._7 E4AVv塥?JRlBtqiNt"n,ѱ3ӗl@ۑq0uxL7UX*kAͣbZT T[3g1VQ+NX ]^Y ծ 3:w8`!q39sUiyh(nYxPș܍_PH(K/Rܸ1fx(U9Z|LUp[r:ڎL%Mdz5KToHL8Q5n '2y_F3!ȓ "y+A&KFRڥGdcKzX`\%buG3EUl娀F]";9I !$؋CW$&/q)|(N2MYmȉ- H5yҡkZiBNOۭV-[4V=\hI|薆u< 遰lWʿiH4}=#G{aL*<ʘ98 ¶5]x~m; B 午eH=F:]Xgy(4 \1*պMV5js%@@BUi [ d(O{6ɹ6*hNJA##92Ouǂ6wʎ +[޸|Pe)G"_}$%[{Ol]=y lc:R@ns+8 ǭPb-#㳙nJw{y/Ng!vQs;q9<g(3oUgBcv}F`u SSE--#_Såk>jϻ&V娔2pcW6:/l BSܬ]jԵ2ܨ?CSU]M1& XȿǠ(M>IݗB$j@Yg?(;"tGXظZj$ 3 O=q/$} mTY+>X2 J4VU!MY$޴]Tl6M۶S0d8-+LoesGe)ehˢ#us _5_]PǗC#݂mx?~Q1Д ?#LB4^h̋`wuLLPJcH/A]'Z`X* 77 ¬J K{+ 2tCp$h3_Q|GlR^H,A006 Fz)cJ;t,W+sc!蹁°Gkx%K :/TEv!"cSѲ1/v77\*MXj>clfD==\7"oz}8]Y&Qʳr dcۍ[1bȠF@[*eDՅR]vipA@ gՁ<ٓ8}!o@/3ꌶaC2pL.>zi C6 nlM;͈;Gnj[v*kYzBhG+fw!B,%揪]i$P Un!ZR}XQ(;†tQpXyڸueaP5ູst% J%١=+8)JDvN I3ϟ Af^+YQbZ(쒍ӕ~wȀ`C2dxK^"'ά%uH1UQθM;ֱMrRG~Uph?B;K+X ]$4p/[u]ʑBapja˦LU^Q1q1VgL'+ni9˶їy DOp/|H Lvmv(`JVYزSAJLߑNKYa{yF8S&vFOT\ /iO\f!ZoyrL4 5+v{rLlCʧ#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=b6$MJڕr6ڪm5m-GKI̚"U {v/x_7H"HJv%&H  $ ܪ~=O-3tX\,]bl};Ҏ%lݮ0;aXE?͠~t]X:EB($0<Xn*(z aOw0,Xviٱ݆adfwYb,閹z-#a:cK]e-LT!:OK&cf(g%"X~dϥ& Q}>5Y =&d2;9[^̞6Mw*yyL!up!- Zb3=p3;VovkWYh)ږc MhmLd'3eehCB΍?$,Yat\FH{RR p&.J7=w.%& 5]NMrJb2lnBA=>!]r۫,|$|KRf)o$#-Z S}|CDr|G{5Y%jP<ͬ^  ;@`^by,|.9<&xo+ c. >:;xlbJ&UƸg+K-'klhA59~o7$hmqY<#A+R/9(XKF{ mua9pxCRa<1d7%~ B4wZTזg %&OeHڙA& F YbSK!AVLrI^"T@6%9Nx"K꒙BBƅ1Q-It(R5<5@tgb&mXjb\*IͫY"tNSರ4Pz,|+`/Yx\W'YK60~?9Ў"Dֶ(㎡d;j' |ճiMPK=j-׈T/YlR8j(H;;i Hhx~ݑŁǒ4X/?aIxȟ&64xgy 1٥č_J󠋏 %.*}'Spo63'3 X+3+\9z pYLWMtQfI9|zn0WڣN7 pSԛF(%FtV$ $.f,|Hxd\m+'L/|.;!f`Hg_f)ILJ՛58iAAXմZCӏ `2ZD/3<219"DbT0WL1C%`t(x,88JZkA#%), ZmBצ k! a :,fzU"wn/oe\["t Ӹ`9 @xxBX*5ZZpҾۂ$cRh32aJbȄutKHA1;~XH/›qoO^.ߩo.K0QkG݄E BKdw ^y44 q'C"z4$e ̤ne,ۋX#;d7o:LD95iU+;][]٘j&ju=e^P4 ^P"Rss{bJGCPDQVay GCeZHpݭ1K܍iL-C u.+PkL[bOT*ݗpT*Q~ZH%ڹ4r9^O ̮&Uj+.y$)ww5laM^2A-8``V ?iZ4H3rDB= $z-Dl\/wbw_XV9$r\`Ch9xl8vb >ݡoLcRGi% i` 7%SsH_s"Oz2^?V1;0zpw)+񹮒1[m=M~wW-Y"3A$Km50 2}φ]^U6֋SS$3tsWST~xdAa9 [%(eu@4金zhfKI!L@z?U M]=߬_12"U cYE5a(la ջaZF, Ro}JJ{8X5'A1qע3L_$)X|ʖ9ANG-$3cw)`C oUBR W_D<¸=K<+#0پ!e%|&/7m'L Lzk<O8o7c\K*;9E!M((y|_h\I!džhpW+I-]~Aԓz-٧`'jNr51_Bw:)\w`T"OMɓ^ RMx"3Br=-U5 =זC}2:D(dZF縡PA2a* ow7'҅$[B?BN߈qZw<=ʋД#1crb'F& ا2Q^Rjܧ>K=t\ڵv!MKKL烥h Z'n RF +ːgh8ȁH RHJ2k$[%$ttW$[%G3DZ< &nG"_Y22xn4<Q 9l^M6{3M@; G=">1@Od"PH`\C"fUo^F8q=pfn))R^08%CCBJCbe?Ff 1SI&G5NH+ʹW yMhU%/$=mgIpK&HEŴ%bIχz!Rኆ [ ČnIU\ziOXr#?MwsZ5i8mf9=PRA5 d6udA&׎6jX <9Mu{:jj~ArmEсY]cP_5 tAk-R$2= bk"tXm#h_t{hчnӰM:0bi]45S3ıt;b䗐Idn{/W@i 4L!e֑< ë855DxZs uD,B4{H"yz oDL9*f‘Etn`ݞj[IDĵg4M3 fM0cldAe H7Wpa= 71+]GC6(@MݎDcs]4t&ڥ9l>d4>``.j$eXny`j-k _8jۨMځsaD;͘X`>ᭉSZ3VigH=*uF-6%7qci5rL$( u ݗ>^ 4Ԃ#s ^5m& 큆hY]rƶSpq yB6ԻM ij6"m@:M2iA 7`5Է 7Cꭖ9䁔b1p=xC#0S#DNi M PQ@(9LAjD E;D4O,J#Ɛ["iթⅨ"ԅv5лh{ \2ia 6OH nh.u20&aP TEp7oAW+Asqbkr.UɌ&?Iv,hi] G0bAq 2-h0 (ЈU e1j \ |&̰>G3bVcciXl_AwTmbib SWk{*k)j\ŏ"mmˇ\〭2.\^bEB#hmb`5ux?HC3 {%=/,IfPs4 ;O:0I#IK:9Ŀ^GKr׭TtyuN`ۣposnK3kK䡼g lO?ߨk"Oȸj8x" ߋu9C[KL"Y T6N9큸 "@UnZ[E8%1+'W7;[ÁvⒹ)V[.$:F0ld+1դ5R]6e HA9gNLh 6X4Hׇ w-njÐ.ڨ^!#"߱v6-sB`Ss'XPDϕu{2'Ҏ!%Mb`ƶ6֔&"EE"~)7_[":o RPa؁Ql͸?gT#/œ\><(Kȉ%V*F>$b lMsjjUT—i,~ICO߳JjdomHbA7M)`揇T^^ϼsz1D( f#T,.seF MdaPۙ]iE}V)gP7 Eꠄ-EL)R+d1UN>a(d[EFj@RqqI,ѤO[G@6[c܆N L9.+؆ '9KΛQlļ'ֶg1xs0peiو>14"&VM&3-7 #4'lrUOE1|;NÔʴ@;JOWB>*}FPwBw^H(R#ˏ'84!|U“k-I%k+B/51Kum16*TGVtt ^A Uۀ@_ L[ƎS7k:h={Zʑ_jOƨ2Rﻪb٣)%uQR̄2DX HEeh}r)CMBF5I_HX z3 OR*"j$T1DK484q !m,_涬[ێr(K qd_^!jQzNld-_K/D|LfY10Ϝ~kj*W"ցua$315iN՞Z$9 hˇ;>Tg6kx i7iW7&s6E=f 6A#K+x)~0+~p6SwN/7pyZxJ1٫OeG{ؗ IT+S l@?DGG3<}ʣv#)t@34NU|g!|_%YK:J }` } `YPMz FV+\|ʱ`?$>ߤ0F';X?bɷiiGl'PuQuZ{_%_pܺUZm7UrˉTW )̳iQq-S};ԣg=\$F1EƑc?&fq#ZIV!^rVLNqjvP-vSp>3^UazLㅜPH!+( (z[rܞyT2$5F N۷O짹&}C;!ROZŞO :Ϟ%0DɽL%!v~MVN)_dz."='i,Wde6GNjz6:ˆzyVPČI8dI$w ϱN.V^fȱC&~  <~ž#qUu!NVS`kDZ'`;%$6,dz@wrdLp P( ]_}4LU?*eERQ}n>En˵Z7fǦ6 \{y tq?MtT/Ste goوᧆ8 ![IFxA5Y{K;>޶L5^Qkɷ7&rsr}#gِ/ڴXMVTw2%mǻ0(l@ܴ|4wsm"F6&ڶ6ڄMeH7k5Gw?]sucz:@bQyot|i?9k<'JʨQUҎes^lO @54BoѾR5EWb-u|n/$l5vg$cSg΅+p}[#Wݮ;-:Ʊœ5 ,>>#7}/@d4 SƏ1 ,“-0}IR.LRi£hGH;۔ ,qZ$0 Ieg.Y^8_r$A$m9'>|x~@R]]@ _^ˋPLueur4̭~וe1{.sK ͭM./A볋 idayr.|IK> ./T-U* 06l2VVe(l:~X]TW?G 7H.͢E@ /PpXV^83YeT578++A@j\JXp3UfX2]Ai+sBˬ4,+2 ,FEϊeV"DBURUbUrU %c[!uHPp>W+ upV 9[ Y[a0V!JG[!vulX] +su75ʚ5ʔ*}FU IՐ*%ʨ2*%Tr*ÐTh-L|VV>Y|UW÷#KɤTR"q!m4F#EɊ4qKиg1f+8!ũDh !i7Y)V7o,ҭ ߵ_ß[6i8^`ˌ -C-x8'7 /ec5 {*|Ѹls k+x6{G.XI aa& yO40"gfCxIЂ] .E’~*j`}ױlb u/ΰIq$+D3L,QҥLn bs Y]$+58f"#f#bVfo\e;fOEnWw \b*-J:f<)\&{fM$\ђ  [Q,Cʠؓ0Vum"+HvI:';ibvԱ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}GuJ>m1>|#ײe|1k-L1IݵS33ڞV;R&7$$9HH#\! A ?}{f՚g_]zwI^)w(g4Xn(S7ǡ_ϛ&,GVo~D>WȨ3Aul~?3w|^g$NhtS6ٰ/ =0J>_aZz:5t_TT԰ `[lHH~d&fQ)JW(P 7XyvԦ4` -5oWWEA&2͵Ixu[ڦm ^6Ń*kۦxJq[MJqmGTCmS_:U/fwM5j]5wf׼l+pm)}5}_+pM׋xƽ[ie`.):fxR,a9v Su?^s2kY^rffff~P>H P`6m Mm Myc%E0L nkk#JYm ]FT񕁌Pe|Va @XImC`4MhPBjֲS0 Sd&7yшmנh+Y$?Zo$‹^Ȳvh]qh)NLh-xh-ζ"m@ZZNjHí5.iDv{hh6К?!CU|Vݙ" kh3au?[ lN\$&lXS-<a7ۜ)-vV)?lZANUjr/3f5šm)?=+Pp 1)xB>ժi?Az _ʧZRQSqxҐ*ͧ,_Yuj ꯭&up7VٞOy}3 qj3Z,UZb#A>94@|TUWP_OchUPYeܗ,^teĨu-~jiг:Wl~͢Fe6ޒS5<*%+TUcvf 41D쟬N, UVf¬y,Bt]y"j,xGRᢁo{YwW(Y;Sy_CﮩwX\Q%U᪥6D_c{YE-0>wumռϋVnS/Ԡ\Bi\$M()QCWCYNU~m"_Yv۵fѺKnHm`vBZ\:-I&p6nX:a3Gߘ!Mw@VqV.[]u׶Wג3o; ގ8{=ǟcY/Ï>tvZWs\w:GB>ot?w;Zc0u rthn CTR߸4e܌xQu!A9+qmu SMf?]~hOqʷgNgN { d% glJH[\^jsm2&%]*#n_F\v2 ן!;OR\2?+Kqqt"pd.moR/_kw |}>M8]^ڥ{~f8Av)^7?ymZw _ۥ8:rrz)d"_ٹ*ocnrTv(2 Eje½W]ڥE_v g ^Z(t bbMF-+#`pGrl24v.+򸴫iVm`]nTm^߭jC; W(W,Vn&?2?[+ykqㄧ`n~?mOy/3?] ꭳC=o!/x8uD^Ѓ(`~4`aucO;z~/PpvS2rM?,G'<4ʼ<ElR, 2L.Qȫ#C0h<5Q?N$8(!~7(0HA,an?NEEuL8cEra"08 8YY4(22$kUB|x K&T|+*"oR~K(+Ș6A/ҕis`Ѵ|! nِKQ!ܐ[@)9>T;ʜ<<H88?Y wMK 1U MF&#{HǦK˥> eD- 91H}s6r";QVO/ZȀoy9UݺbT8thyEݺRqwλv+9?pպ ˇYȇ[)yդ/*D/)@wwO^jҳ; ߅6|!~\qh9ivK-Nk+}t}-oPyWRSͥ3oj 1iɍǭ\L ؍aI4i #H&r SK12lX a$¢|/tltW9a)[ on!8E% oj֞XJnlyWBr"(3I z:BjDVk ݢ O b!Q 5PycNT)V6<[)Kt*@ K@cg[AfFͯf"$&JJ^Z](<|3󼬲CDY}q%G1"$fC:6"ET*BHdƔY!>g]tqW,re7ن:n*;$4! oߔ%F'.J%B]a!I-S8 a$a:L9@?_TM,ΠJ,bIG1[Fp߷xɻy 86q !o 3f2./3$)0ZWG, ^F<.zC|-1āEº, M K:۹: #0 @YR!"[,25v rX(]FVh&/:66#'KIM$++)Lp>c$1ȩd˚M,d$#đVa\R QLC[{~9М!'aPq)Iož" x4&uZFVe*G!~D!dpi@Ldd`J\TӨ=*V2<"u9$@SHB"8hXqT diQTi+A+VwO,AŀH+. P_.)ZVZ5Adzx.kRQ E\ 3fC@(ث*1Зʊ8C5$]^貸j;Gqr3;}Ld֯A z/;̧@zѣn,N뢬6BFFۄ$K H/< @o L!Z_9}|Ȕ}(} -4kn2 { &nXrw4tJ{v7Z5/Mآ#*;'<&(ޢx{ 6P@tb  oܯL{Vw; qXa;/Ѽf:r/3`vkufvW( \3o׋$WVUGu6#)JO=Rੇ$B?pOU>A?S<;!=*<}B eC[Q;]l $-fSY Q„Aq)&D!j @Qdb6ZxA̻'f ]4Y{/V Ff`( FKf/>T4بlUC=` ׏pX= 涐l=b?0LJLV]h~~݇aK`CQ!Q4h(UL8nt=P?!B+B0 iФC BAYQ,jPDY8 .NrQXX8u Tn_~ H8( [\sk}j.H 7bv]A+6b u{b1aa]>9&Jє</BS]X*oSmC= ͕i> 0 S l!̑},"oE:[*0'c(i<#A,SP'L sLmdFN; > EM}҉Vj֖;{zZhU @4Iרg*աۙdM]W)ܹG&wI- z_л`VM=v~!04lN9_CfWnh*\m=fX7_[ٍ~jiƼHMsFenw5gScE3椫<̟k}qܑ;sV|BOir'IY 6-uiC«hS@A=:w<Otms`m"дS'K\k6nv.mS7w}>+1**իAp, ZlZ0SAC,~ ȭZ3.96(SQWmZzq@Ġr{Tg;+…3\)Hwf1>#fZ)'pFZn:_~?,;VC ,&ɆjirC|D+JJm-nmJ*$0UkS˺R+'YM ۬Y֓KMBﵹUm2JRصeaa ŖukוeA`'N'Ó4!^AEZV`8!c^ge^)BWŖyRe P̳ keߵ uO5yp;M"Hi*O-J7"@]t~L-&a~-YTẔXW뛄u |i8W0'zjIT8VcVSyRo ׶;OOe 4GpY[B!:WPpqI"D9X\O([5ƭ4d͍zCc(& b)n|Ҫ[[` XX-*X4;Cgm>m~6}5^]#}w={[a٧OWLۂOc >agUi`=w-9`l[Dv78^]ǓmOw>X,TON^LZbas\Lu>^gRm9w,KKugz Ki K]Erw8طYK'ݔyJ lg`wM`OqrNkz²>t߬\>a! ZYQ862=( ;VIUK71]K ؅4)t4*қZgoع@z\bZN뒆4/ϝ즡ntaR\%@;"!s]HH,fZ΢(~ p'  _xhquY|fxJ@tQHKl'[ V!yN.ޅfP.`Nk>qoq G*KX&&cIT@\NNgQ (k|G{[#&/jwUB''vi"|qe|=F6Mk玦/awJM=8ZMH;p+4WP Onx(X!~8{Fw^.޳IF9ސQZ\Ntm#t_G"7 p:U_xȳt\KaAEt#Et"oEnyEx]iAJZ|M,q\?݁d2.NT ˜! '{I7P|k"?n FcT S\Ʌ` /! jBJ 0x+A;#'x-pƕ5\.Y܆@d" Ҟ)/&#  Sr2K2YYPg_Oc:]Y ,S(dkvbp#+REr"&t /c,("^+`CYf@c/5\xr9@8t崪- OXTA}?H$}Q%o~*Y!Kj"5\f\h Wq#F9^ x١:O b(ҹ<" Ni Tܵ ɝf )H1M3YPLHua(xe@5qKan3< )3hUR!HRW5)r8; ٸcn[]6Xdr$t?(q pn@sfBGTLS>w{ί||y#I7nMP1unR%qRH's1GH$ne+ʵRGH y{|GpGɅAtriM"r%PӘ @5:+r'irHrKmQYЄK 0;L$grc- ys,{ՎFLX=U? FIɁYa=wpf@bxg:&!1 I -%;P)G9~T@+ %22#t*BȠr*g~J;SGI'BH*QUȇ7}jwAA=t] T`}FǏ e8(>@w w ]3Ğ`>kr %7ϗᦺ]]ێMolz|O(nuV9LsYL0[RMre̦s9~+:c-MXk{K@O K m$j{I%Kw۾;4l/M@m̭"^aaM*DM.;G+W'JóoXދb:4DUHK-{#{EJ&Ǘ)6 QeuXpDE:t#O;}Xɀ1nr'WbZnsS/@;m2M2nE#ZPR39GvDV-se$vYiK1qJS͢Y)zC*Z-K vc"Q;6q93cu ?hXEj}5^ԑg WUʗZUۧTrQ[k],m Z/._]S1srwZy?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}}]*)xZ[SF@n8W48 VK8}h;әyT2d6JroJJծ$a=߹a΍?me?tvsGHP֢:E9 |B9Ie 3au ,\^p:0Io%[@wݶ0˓]ɖ )B֋ѺDm $NQX6ra"q{)ЄhyАme@ΰ xf%9Fq@mWu-C|5Z9ClZqvyC fp'=!@"^f|K<ɠϻVV& 2[WڐAEDiNwEwW1Zg<&s=Y=c,z˟93>+%: 짖eTa:6@#KFCP=*8aݴ9p̢"F @`O ,Oi@i_oHdR?.0Ht푣XfV\98&=KiZ2}A LJؘ>{55ISΗCm7ڎuSvȑ@/RM`;y[.#:iTIƁOj+.DL˳Mfr=CV:ݞfJhrPhh)[ `Y7f7[ !S$=.Tg1{َ2crAq'YofqxD"@ޫ;jlvVkl^}}[N W +ՒZmu%b.T2Qq>V؛yL*6$Ty֌wRVZcn9f X"av7%6acXt-jhڼDIغg$ˊw. ".ޘ폴m'Y}X ,Tg, YLg#V_v|CIRw:-ItJIix au]\ r:ɸX 6h/M~Qϝa1m|$5x 6c&w[v-PkAՖx$5_s]3Q,Xxz!@VyiH3vKHw*SCI(ьf+p[yQG$ӹ.G Aı\ӄ>-PFI7HV5p H'FE)ϓ] #5cL"5;wp9-NxJ$$DsoN}>Hk/N=~RÔ*`bLqnR,t>#BEU0 AYBEH ܌$f3 q,\xW1 M_y@YhATBfS_#BF唻S7 Mlp6 BL2 ^&/Qp2wjPmDkҞ{ '2MŎ.5;[B\p`tk.Cr!F6^8 ˱l۝?AhwԯL ۹(H"5M!ff5ЪSz\\KeBfPCW< ^P7eY- `cy\O7F<)0(THQ#a q0H!|N8s ! |<\y( QyFz<cr|>Aq$P(8[ LQ>Zc`%ԏ (uP!o͹*],R"aQFPD!Ф!?d04~,i}?žlz ~p[~RK~Ѫy=~CC,{ 5Wϭ}-UQlMwCA\ofKṶXªX{r&Mh,_2&9C* zX&дZ)CF4v0{mG4 U_eBiiΞ|cY~3w~ aјS- 뷍ePr܌'k0 K6{F[(H#JBu)&R}KEsF>T!,zjxDvVE'Fstk"S>7xY Nj5ΟZsSlVK~W!s&{nrhT%b Z͝. n${n 9ٓ2HP62NUo .c['ooP=ÞC!dP+\Ob]ds5te1 >ktAR ~4MR 80:eh7TIƨms*ZdH/ISJP @V[ 9+J[ P  _za$`fc ve"=YxT 俌ُonccj[֊_C VhFs`z1>l+/$"ub3 ~-K3z ʯW8P} S"wWdt so@u۳p!XVvl蕭lo,C2EYiS)pAmϊ-ɵ*sr Gьޥu[82w> ,.h]pzwet)C5=}vVT^N2󀧛Μ>O>@,gK ח? 6Ծ0el/x Pp cB,QՇʯ>!&ZL0 @{;U5`??1}qDvtPRsvڤZ*¶6+rJ"J@ڀׅ sƮONxÏNNZ .Y4"jӌc>x{!ODa|%@LjԹEi4B>` DB)Nh+3Y^^2Ȟsdۡ#7rOrǭp,p|}   t<1}Ԣiʷ#h/\΁S+y]vt,nٱ PRY+zƞt}_&!K!K7iԂDӆo P,6@#e)lim mSSGqDu)C\a{I \ AfbҕK:ҽ/䳣C|\]rJՑcN&I[o`IZ8GHëA=} ^wjˉQ"Sx9(}kc*0 㶰{_)6K(qE-aMZQi*i-/Mk?Dհ0&uǻܬe)[ZDvԅݷq(QM} QbW (cB#kMsF|=W8-T 탎E8}N'm!E4d>ۢ WKcm mcؾte ;t'HjԼnQ&"i]m( Vԥ)Avz۸{}25b xvՄ*AHT*vjXK@ѿ.P[%I̒₞nlsy7=[4iP-POz!ql0d)SVe܆1[w8c  5> 7"'_w1a. mƮגw% 5DnƀWkF6~H۔.sǕJ7? /NoucUoO<Z|eZ\v[-co{h9|HJSa[y *տE3Yr59gdTK=?B}T9SmJyۨ 7?ypV i_OJ HOCmh[ö^JHUEx;FqF=qʈOJ/ plMDFBe_砱MzBw }S{F> ˝~@hiݖˎ+rYF0D4X'T|Cx$y4B!;khX7W&̵ϙv`Q{rY̹ D?cP+L2 fs-2*oe3{p{泵[2Y__L//[X*LnGhZzk.6łl e(=]_MO/mUJ8 %L;A z0N`J uRDBثEzT##]ϊޝR ˅]ܚ>_KY6מ.2n[jvVK5! pLW.kv=Y- Awi;] ww/s?Ӵ$4uKK#Iť}+.2"$m^$E'O|)6;V/NUvD=Czh18I'DYlս )N#8P}Y% O~E$ UƴtToQ^8le/NV}!ϭPpRx0v<0~Yl",]D6Xʤ0D2R(NDDUk Y;.kN m' Ҝӣ>}󁜚dP==zr`d@$bPԩ"qbfw;I8$eL3@Z͋BH#8wYV-\ޘ.&q*NRnv'8 JuF@OzP/x4 j79_i(kifoӐ|4I6a*^L~T,Hh78qm6y29^m\._dC܉*-ʞ2*} AeLwZeߪ+*5ӈfHGthZru(DJly {γgS#Hwr䩱䅱ɳGϿ&=~ة cO9M}/ӎ=A8s>ϟzx9wg8}s<{=E 3U׺n)Şc`M[$,^ ~pK4ᅿG+<{NQnv&ۄ4$]9&iTepxBkeph7tH 'ҝ[ɍ]MDF$^ piޒ-а+1m{wfsemව4]մA| \4VJj!,PF" )/(Hɗ *PSN%~[VE˺tL프A$QY~lj.ftt,JÀ ljMBlYE+orX[DuLrDDAFms]|l(94~P5+JGƻtkm"ULR4i.oBv/^mkWBNzsp0QM?=$@9["$+uÎ+wS, VN(_1#n D* }U$^Ъ Fػ\<+qh`hPmAuV96o߾\~&/JBO7¤ MQqM7[Oٯn⛪z-JC8ڌ٩ 4h cXZ 5J*&'iETRu* 6}} 1hEOǡ U2=s`. 0wY5ZanM~U\b1puE[C/)gsE7euӶnr̆7\43T?T}ŕ[%8)EM^E|F{q[  w!^@ZZQݿ3@ԫ`fI '8:ʨz\\3=Z6cwFI,6v+^W7f<:il^ J*r Eqxq*wn[8G4;!_._Hszi0a~q $S5tA慮X DhM1>!ro:êN9TNQKQ.߸C1CxBOJ@(>`coP9|=U5ҳ!f?Bٚ`ƒ'wÏN}(˓ % BqBeN:961Z͙BUmVlKbs~(C45ofwځׯx'W>8KƟ0EH>x `/pc{N)꽌1<&R=觶VWU`ke#Zy$<:z=d>`9L5;ZC݀ @Ż[*2|i:Z;'"鐛~X$K!d [b3K¨>{)B^=FD}0vۛ5L;ukK?:Lp,/Xluܽwi1 -C};ҏi)44z\sJU&#Cw~oG6N'@Z,Fr 0Ձz}K_UotMF0ކDHg„v Y()`;r@^5a $\-06)C [T/K `MA%a8 HxĜ+*U+,du6  3cZW~JB8b[)ݒ(u/?uu;pVx8"NjN@fl̝vQcXcmڧev%oHީ+ާ֨x:vA>ԼI.x_/NJm~;qSԗcs'F(+12!1LSbe35]_P`zŽʟ DV-)~̩Ig<`&R!ST2_e畤m76e.OAHG5J'^_S siR'pmxi~M74t%=fH.QwWcWCƜ7_E~1ԏS BvbuY/wNĨsyz9S|[fh10V TYEgzLi25f'N˧΅ D>~HW14䖩~$ 9Da$c]r "ʶ0HmtX~ICh3*Qh\QY9ELa*~I*ϣi Uբk뀬\ovz7 "=>v T'c@%Hj-b>RAC},.j9+vkb ΎaVk4D3@lX,*XecdEO5=ik= rWR'X?aÿ\.t{6BEDm]J@ ?.# Rr5,DFuX5A(Sf΁(FEkՊVś1;vjekI/8#K5zybeY,͎{Z7*~M,mi_hO#hx]wUSVd5LH[g`]'Y!hCbUhcAߓRwbFZʊ(m o[,BRkؓ̏Q,an 8̟i! *pIg;76w*K54L┿p8%,ɨ Wš  B`+ e[]cF߻A##'JxfG,ΥxaMb/\Jϩ718TGC N Dad;t^&ӦC҃}5nvlr9/lg4~ajݻG;cjhuw;6o6qMEdhuǑ/,V~6=XےwV)mkktW):t JD n`jccbg(8՘%YmK莾ZB6W[- ղ;cGպ\Oխ\D\͹IY*n3 7.̋$m1.ȳ G-SxVl"OY<-MhEF)EOc3L n$NRj3sPEuw^Hva0dvP3i3l̰Ȍުyӗn̊<D8ZAe:yv& t(vILj_fy">ʌ{t&6ٴzVƬ:U$cr䩱䅱ɳGϿ&=~ة cO9M}/ӎ=A8s>ϟzx9wg8}s<{=KILkY:پՙsAVPS_H* D^߇vBè>AGȿ#vQ"?Ō B#AC?H9I)xH S轑9z!R @QD14rḿsJrQt 4@$.C]%gyp%ע^Wq̶d[Cx2#we}a.--AZETSZrf^-b8ՐĶ5) McA6؃YܨFu^͹qu$ϏDuuc('4_b+EUOEkETռ0v?ra\a:Վ %߾T"3ڹƭ`3a0醼76A Ь@wTjWx"hmJ/ϥv˜X ZZvI ߞ֘r~:R=_mKҝi΅oX'>4ZMB}\ m4&_Lc+OO}:r;Um~ƂVk5'm?aӈBϞMW8<;)GZɗt,ԕ=+-\ ZɊ&t zQM%n/^%EG~b1K I*qxn#|2Űg5'TE*xF!d-qd4NȮd!P8E^7A Z@njiGzeth͖qgF;;4CmdT8[stQjRPE<- '3~.b=t:ޯN0F6L/ *XVb9`b"'Eޕ hE$t9@-OiGn (bl6 #ݞ՚yۆPp.A|p*(8|jA[x9Bal|, y>E?0AU87:I{bej!?ֽ!1 4^=T(ιu?,vGC'Nut\  *(MM{R 63]D/OŕѻX4?y龶w‰7th& ʹboIj*1cDY($7 D3E ]7>@iu@m]LWLt?ll4&uɯ2zu] ” wHpkԉ8" x-G$]K-@; /14YыPG*bºDiܒ\q'q-3V+]C:2ʼ?/p7!J![*Ү-B Nc2!Kz -c>HxKpj_%&B.@qDo׭}h9iR ;A| #0rl\Ң8 iQ&8^'y5iT΂) ܧ < ʛW <#Tۿ,e2m&Ey'1%C69D0_4ș-_@==䕩Բ!pKGq^DS DMD Outputsource.build_output.dmdxڥ=O0ԁ ]JLc@Ǔ¥ Vu{';cqN^i\q: 8ČdOGe5љ`u][e۷1zqc{OrYEXtE)YN!z$0ڧQԱ18zixntى:Ʈe_Ek<{]NSk[8l|P^e7~"]\Diffdiffpatch source.diff(?x)^ (===\ modified\ file |==== \s* // .+ \s - \s .+ \s+ ==== |Index:[ ] |---\ [^%] |\*\*\*.*\d{4}\s*$ |\d+(,\d+)* (a|d|c) \d+(,\d+)* $ |diff\ --git[ ] )xڭ[o0ӋZ * ӆd$b41WC$8UM;ر&mir:0gm=2g\kS&=.\}.FS{Ghyeg~DMjR^sϸZϗOp_^~y̢sҙpJ@ 9)^8)EF=!Fb8 IZ] >?h< 7j~?'AvhD(ԴZdnnZJ)>#|FI@k* V {5 =;$)sBBM7֙wf.1e=:E8_^r-z-L"vrCփV9wŔBktVΆ} J/ qj_(] v F~$쀄XTVK0hܽ;^!C%UGRuh; f=^tdqlBt`Q TnܖSwuNCh&.~>ߜdt,.4VUxwʼn7-xU2  ^n#/x+-y>Fʒ>E}.qvH1_.Gz;,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=uHIDIXAxE$|bYlه#\B N\*Nj'$rzqq^ޜtg,;]|?3O.&(Lhm54Tvqb{\ q q8MҜjt7<<ʐ{V3l{&d ծ.K!x(Ibm 7sXe_nS#*m{44˫޲T;Z˱4[i@Z@(s4;iBvgam)e;0]BM-"ct af=$)vAl)ǶZfs)MNI]*tJЩ{},c`ӊΧ\g`Si)ݟҭI &Ӝ6Ih Z:ڶKrt0#D]:fb%j(˱4#r6)n>b d \'27+xT ܶQ)DTJ V'xv#U7}J'e &,|)2Ȕ7+)Q_tdLVT贒W-:pzz-Ы҆z]SWN6_ ib؟kA}PF:Z0}Y<_%rkT)xV:D <S FomnoKhڗYo%'-߿ClHT`~,'/<1cnIaJ]`w B=9&e`E/x!r@п_`@,fW  "`bC ;V1uSh dFP+h G= #i~"tQvW{B ﰹAS.th/ԐbQ=E(ނ` 0 #!p"oZdl(-XUWk뉋hlib Il*LGU8 A-EޠȮBuBUBL | zn ,eE^CX8] \E (a-%B3_9.jP:j:.Ut,d>]+>ȶ-FP/VAe7+ o( NADx?]+udӕEL)tX*EgulOsW-MT z k$"I3dTE E1䰄i!YGń,KKًxv "nJL6IAsleA#1V`נhEEL"ZU1.S˥1vVm%kt$;lQx (jcj9^CN6)2 LW@.O EqlBm'83g/Tcr .ŨFR8zD[Td< y^)V4+lX;>pIkC;~s]z{ɻӧ*s7hW,,]cOFUAbeX߳K\·L+#aY_nKix5.}̔YH^U0(Q!*p :" b\kpbcֈE9|Gq]KgL]2IMGE.n?EGؚ &5-k/PE)9J{BGD?`Gk::JC(Iyx 3vJ c EK1)øI_}KY2*ݳ i.ẅ#ٰHhׂ`UmY_tSs#ic1EeUoεmKs-H94Q :T\qOG~L_e ؾoi^k"xaC8'$dvV*YgUl2BM//ciĝECݬ,-IKC=% ۟,ńB>fHx=?Y\Z/9O/v;.dzEϮfbobBXd"wuWZzii>$ dbCk'S`G-2HoE/fy41{[EqmG G7W(Rv`{Ma AF~'ުgHj/' ,}%1gUCGGb kP ˍClVAMU;J~il!c=\R`Õ51{S!wM`0!2V8}9G d|$IM'kPh) y XvW F6kX]Z}q4i8רMكB}ӓQ2ugXSZAٔوں $% պU˺iʤ}Ȅ,:]Ro"^!^7G%b|p}1SqلdRzxfR8bGvA5 ^%\0ENdl>>J*J83Nzew+Gw )j`[7IK5/swg$2W*oK/m:G:fA,|6[J?Ė,FjtH_/LA7H9_{JU[1`0bS4ӧM q)C ernyrX۱$3HSc 6*G4IiLGW >*̵D|G>mLЇ$dԔ Ȝз MR=!([ oXs d+Ze?hY+ "Cz S׆|z%ɨ$5Ѱ:d9ڠgcd$.}}zY rزTR_k*-">Y1G}Sqgt#B/pۇ GXR?xse!rY8%Nĺ> ̧u @泮U+\OFt}$#O\w42K<~)șsjY4 /,aEZ,+常Un#"=ޚTgI,P ]uF*:Q Jz&nW24+ RWĝw̮禦Y$#ٴsaRf<m/d%Nd+(:WKz7i_b!7a-x#gԏ ː-' ãfɻHrS c۷4ˮ̂mc}OX3,dVۧ$ 6hjRWRXH@m<ׁ$ɚ#A9D`/D!#~o)(,2X4+Yf6iΝ Sq8)읙YDaG¶Y~ٖ{HmdB?o- XtHu02 %fYf35׻TON:B+(E`qB ("7ĝ޳pWט!Q+SkMqczWRRID??d qGT/T|k-ױVj7 *@f >/T|aCdPwʳWY ¬tP3VGc1f^Jfq{kxdFXz8R8[~W8Ĕ?(Ѵ/.呕}3W6 #CSSyon۩J|߀{> &j:;QXw$^$Y$BR?IFA @'XAp>1A+ig?z})"m}f_֔sҷ?_/\]OP%-3+.Qښ>@N _HfGc7uϷ}] Еi"d*Ojo"RV1ٔqۣ( ;2rmT%r◗]M?`W+US-Gj뒪uIՉ,Tq2a0A< f@kWfJOxΟۚƒJV2k” 'p,GhVH/`bMf(Ndo&Kñ7Y1m3MlG2P8r]/hTy튊JS!7_iJL\IAi9)vmAC:Adq6e ~YHv|xg*EE$@kkc^ԫ-֬*wi%X:o`XFh [,Rmڤ- j긥 ZG-ER%4^(5{VJ)^dMGs E?,{^ם^2^w ͵N|&%;]z \}T|m|lk](Ȓn-gY[QueuHqc&̣-Xkhtu(n7[6>0ٶ]`VW 1! ,ߩq\5}t}] X仫X$^^W:.!ecT^]I!]cqJY!`mҨt'f,k-Wflx7GNΠ˴h6L¾PkS T?@ KsVr^p`< ~?y#G&JAnQokŹ 軾Xq6TNS]p'܍wQ=p7܇Rɓ-s!!9W}e>M!NnU w>W=!ॹ#!^^>#`c:Ao*T/U_iu̹!V3W}"Xs'C0=W}*ӖU/U_i-3!ҝӴ\Lkٛ>i-/U_i-/U_i-Wχ`ZչC0ayE@Ra\bR?OxVMj/)JəXz $f|g߃g.JxOժxS4#ÕRK׃UM/`Lr.k,Y(nK) pGcǝ]y<݁ѓ ^_Dd@g7Q#|V  1ȎkE!cۓe l[35 aь+/~VzSmWDW DqU*Ac'h/39.XAm89.e@K`Xu2> kg\Fˆ*^x* ȳA|DK" b9[z]yA|o2Q0e **k2R0iRܦ T /LLT-.<҅~v.^樬[)$1#g2!j79Es91R5)(u=WJ,o.H`ySyhj Yt$EbfHGzTrEP]v*߰Nr p/lh̩A2O4,u>s?f=KsPcrѶoq/y9kyvWu fס.u&B^韙Dl!URTHa]J-;jO~˾\J{ҕx뭍h!fb>*I ZTRnD^* zrI`UN2%: IGgxaNV0ZL & 7^Isj7ڃP\y^#oH/OS;XeՓ.Fù˃˫qK5vm "TbJ>3X M[nTV# {XG\PN'o* 1%7~Ջ W,ؕ*98!rMHq"uٻ<9ۯ W #L幷Q$W/P=ac!sF _( ?( )ߣel^/d2zpt׾f;Km5MMyY=͜F 'q`^)WAEp`Nld8 kÛ|^AK3`oؐvVh]7@́C/j>v[v{}ni-aK R޵;]o2 <8uQiBR>}q廾Zs-Vc2!i˚+^#hSþ2Mխ t:e u> ~6rڽ3~W 2kh%:0jie,䅞 Gs R5d.V$KwvTWg*p8|kOUJY%4+]62F 7ó#A Di*G\5s%i ѵvԹDom*y[rwW>'l6pޕ)Ez/{O4WSPdҐq(b&'gᴹ "˶٦J|F%y)ýA?6~S֎=z"7ߙH NY99;'ĀBVNlz;썇ҽ"~pJ$nSg䓺puplH`ddf3꫷Fw+&1%鮲uƬJ[̠1lFU|k}M;2lݬE'_Tw)hc"|Ƥ6 O@ Yh.{fRwYsS02OEڀʹFWӁ|ڐ7Aj\]DQHM`&CE/_txDm@.b80ˠih6}L ZgfЫe=vm+5-nWl i6]Ӡ+M {P ZI٭*t0wĠSH6 G$"Dʀ ߀5‹8>W,@ۏ2ȉW1JEug!,ڴAhI7\ZuAx V^GhB ղAodezEo=rjiWn^95n4F\]Cqv:' HTML (Erlang)yawstext.html.erlang break_char [\t\n\f /<>]xTO0ކ?ȋh4&4QtM6;|[ﻻ6:xKyA~Ǎ4ts+3-'&pm  4iK<)hj)O7*DD)8$/ BZ]bCAPԗȷC![+fb㛮>>`{Ѐy4 YYl#RBMq.%N$YK t n[7걗ԫlQr1j*A.`&7Vf;*}zAy-žii$N> ,ă1lu|ƗeA%L !/UzޡQ\eKT*]olLlPXMS%/QGit Attributes attributes gitattributes.gitattributestext.git.attributesxڭX[o6$mIa[XȺaNQ^eQHWQV^07=&v=ۙ ?LśiMUO#AN*SZmsu8rC{XKƃkU z$!ՒC}TKSZKUg9 IFpJG~Udd m}k<菿5RW꩘ƿRiHV}F{HQNG3vh|/8gMM~mj w u~R6ݒCH#uUޕ]vZ, HH\U I yr.ĕ1<`S9b%JU[8p"f$k<8 _l\B{㖮Jn0uD||>;^U"x3<~{io~^{byC1џDF3:mޭުe&V3yPvGF6lզEmsY ɗ2e`e{K".v EL)D#r;NM=s1ll*B K{>Y>@]1BqD!VTcJoS j>3PᥘEV$Q(/4ròEf=g!U:_"/ۤK;RڟMi!}wY:JևGYےl)Nuر% e1huvhDsnc K _Lϰ?W &]z R™ |wg}#?Q3 ^ѩ+Vcf}$%y6.#2WODԖc\o |K1TʘQTm6WF{0~\1xC% [mΚ#cxr'㡡mhOPͅ>>ѥ&AR 5M5Ν^eb,HզA- qޏ'L)`2Ai\.۬ HD%)B~2ákNmp!<PrÒ|r!lq5ypaW:?i7/|R|EVppu 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[-+ ]?} xoՒ5jfu:'MЖvH'a^f]lPebPI"JI ڇ;;-zr4޻J6FYEMӧ[+`A +Cd0ù [ߔ1jo)]?@<ڕИL~ϷLV`Pm wJSqG S&Ph BD%*ča&I |~f(v(QJ' { t %zeem d@m%+!xz(xMxKS?.soW̖%49p8ιx_|G>֮O1Cv1OqB;fYG)?J&(V8 ĥ\j_,Uc$96]f[u#νh>hG\-NRs❓d0*4q 135"`͡9-VѬbGD ŎPUVz'RڊQR||6 'Ґ<7),O>q&vK`*$ī9;\@',uMŔ~y{T1 '#wrZ\2 n(Ŀnp,uaO,0YyɓqZQxTXT/dVXy@r1GQΠ%$݊^Tq9:6Y bDtIZN?L2Xɀ@#Q]! hLamz7^;E :Sts:BD=d)esi!moXNh},ҡRn +SvI6 B hqd$9+DOeEwnĶw$>W9X.?HZY2ImiN-l_[D5G2RɀR$$qnKWNmW<`a.Y'Rg,H}oV!߬3#JBݖ4B񒂒N*lei,t{:Y ,t} {(5'?*nOBh!edPUAQv=܆ә.Hn8c0Gy7M;39J{X4gh$' yI9/TV6$ċU a*bG` kLkO:Bl9KV=CRju LygSf}+\k؋U.rX2#\2H nr#yPO2Ahe d?]}Ġ 1UWyP+]) n5ʋhjk{}em3*m>/k+cy+?D^wN؎͖_Uѐz*$\-x,DpŮ,HdKN<#rvkӾQIZQ8ms[GFe:umD$^4]"b_>ތ3dok .C4]հ^m~A|\j,Ot0j0Қ0yrpYԥK0l1 vKӏ  )@Ў5B6AwFQ~s[)V§4ik3"Vvfg/#&ޮXfk B`CB@a}LI(4kS: )Y}0⽦x4oq27"*LSb4ǝML=Ya Ex=wvb-/Ķ&7ycA,'h+V^V-+`基J|Fϳ ]A0GB]eKt<|V}O @wnbA2ߏsהWX/JʝݨGW5/3{l܅WGeZ/49 {M'AoqiBk'!&ɰŪ!1s;VXIb`ڷF*)/ä5\aM^.{7.Dmb0h-}X_H { `q/YUӍ:~@Sv 7yiL @g˘b ?$BC~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]xY_W6 PXז҄nK`qپx[rXٳehv';#q(HWWJԕg'qj=q}C}? 1Vq/G3$Df3نtmnhAϷ=:ӞrsRN_[M<-m]1g+# $_g\_M:`z!oF`:1!'~pji18K0dbvL6vG `Hy^ͩHƎ̩6 DBAmAwI\zIv=ߥ.Y™8{@ rC~nt7 al6J.Z\Z$s1 *%W?8 9VwG-EU0`~oUA.IaT3|"k0o`'!ቜ*eו hs0LNCDqȽ '-xbY[E Q?gڬPrPо(v;lY 2]NJLL Ow Q(cgy8=4>bȉL`BQ1&QoCf:wTK@OGv[aQP}2`*q(Jo2Ʌ/.qN,3b璬`+]bJX E%mbs{n0I7RdNdnOrLKX?/W0`%^֫AV;|T⤲mM୮&QKܾd|+ne5YKX?_EܯGe}wk-RC* BXP_iM~DOY tu(NCGPG˥QK+yÐE Zxýq_ѱtZS͒P^峎$7eD,iO *.KMR_ʬxVE좡3*41DZ`Akp£tTzTGW%`g QCBp? 8MM5%Z)ydvkOZRkA8]Q3 Git Ignoreexclude gitignore .gitignoretext.git.ignorexڅR 1 8<=< Gxu-ֈ ~- dҚVq͵Ş*W|Zal358KQĕb  d%:od35PJ`i2^r9<<\fS}Oc)=D#rspWQ+yrsdvZz/6vv>d/SUҏs0kPG"Git Link.git text.git.link^\s*gitdir\s*:<xڍU]o0mѭ&!>& 5Lx*~XmLj-qBgu[_n_{[# ]fw-i-a;BGT+*WMYT5 ˔m/О}{B65߹P=q1*W`hzdO(EHţпKCI@V&))hUq f]:Nfߒ)zz<0p*'qyi؏rotB)Se4'qqn wpuEd=?.디rje}C'=uMl 5<ަwpekį9X(pMBfp 3KPKAԬ)hႲ'$e|J%h{e6qiTKzol"hYe)p0YC3ֵR>q.L՝kYWqgG{}|2 "s(@CfZEΠFx mh"g[Llx]rU z~p)5c?27Git Loggitlog text.git.log^commit\s+\h{7,}xڭTmK0n;_O~i$ dl-ek+svM46C\ySڥ{LX<&bqv\sNpLW>Ex$j%qM P;O$jUN_e= N:FQ F2Ā Tbq$htBb "я.YC+G\G%0 g04u5,-s,Cο[@Ҳ;o˩āλA>[v+qJs&ƈAϔ6Z93: C(J (cq,6+2tnݪڼj|z~9;t]?^CևDA5. |S3ԋlC?qf Git Mailmap.mailmapmailmaptext.git.mailmapxڅQM @ՊtcP,GtTXMtFYE]{3~>r+N!VK[mRSjV#=D@iv/IJWFmOW -޻Ǎ}0[ W9d7 )cwA^A.2PZ;yZ;sN•N9ɓ6ai>rUAp=NGit Rebase Todogit-rebase-todotext.git.rebase>^(?:drop|edit|exec|fixup|pick|reword|squash|[defprsx]) \h{7,}  comment_char[#;]hash \b\h{7,}\bxXmo0&c-ݤM؇I-FJmSX?.+rIgeˋ\!C!=׳ZfCFcǶ1sޭYO<,{L>EL b\ EHB\o{j fȟgyg"Ad 699"ԢZQ X]wxW;_ig-!R^t6HK2 k1bB\IM) 8T kҬ6} Ș8ǰIjHY:5=ǍĿZOn.ĄO`=xC8N]0dLD-h>vQ1,׃kuLԋ8sa6-5G.8pΑ9q-x{Bp?GyOEp4Ab)&)*RwCDӴmi.'o="]%gsIu2<,]Iݐ3uω+p?mek]pwV"xrzJwYloE/FQDQ4$MI I:MX\&\*^&oQUX&GE 2ɒny2ٌ@=P%>ʋ_Ψ4/Nd斩Y99_Sxo`BVg\͆ɱC׳pz;t=mt k #(eFUKUJao>j~-C{p[$GwNnSnUou2L{]aAQt ^7+:5^]MSa:r*U] #@6Uiuʾl=D\7*YžiGogo 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)\bx[{۶su65q'HʥKS׎׮ݵkuJCɴĆ"J=aO{^ !)ʉ_M:88887wZl ݭÁ'cDm}"󠻮C-eMm[.Mm7hD.%*~:PAA2r:QX?T99$)E 8V 1:UlV76Il F(c)8Ř3R0R0)Va"``m 1 iK\Ph*``zPh J pW "c7*X*c76B)G__c]:cd# 3s.hYm1sJ†j؟]q=`,8򼶋XzrBA͊z2&iV`a,۲]4{;F[=̃;戥m. :imY1`r7X1Q1> Zirmvw\S>c_p }#/d`xf#1({.w@aS#JB"}q_sY&Y ܈ߗ`9،Ɋ>"lpb A݇ {!~M?P#r^&֬ezmf, '6ڌ'h8ә LDVǁ$C@7z-i)pG -z}L`ȶ+ܤXol øE ㆔Cz c6#iqӶΉ)8ʷF_U}Fs!8θzᐴS0g(HDT x?~D!g@H s9LJ'18ImP_@*lsK!BԖ8 ~_*frHb-TjQmna$<B+؝aPMI q"G(+ig?@P^ӈz*]ÙN'1Ah44 CT@tFˁD1n PGAO "oDD[2#7ZzxwO?ʐU@zc&T_/7㥚^nTx __uaì9Yh0W3R8;h3WAH_p׏DK"#ϗXC,b%}JkE=!Gc44ӓTekU6+PƠ\jP p3 2qZG1[!o=ʪ4|.c2ƏhݝۻA1ކw;w*MeUPH7 v_ϑ&,ƷXȨZ1\$%݄h` FN.Hx~Jlk'8ɃڡNrY˪YǑ>_ΠXqQJ\Run,މO`r,Eak8=ݍC1^NKtN&5hTD6!3SpTL'0!ALAvh .UY%z;R|VtpyhC^̊ 'Fg{t ^Rӛht-M[Sr(puhvulղjul˛)a{+x|Like϶Uk|mj 6 ;*qi*YM1v:ENr sKkQ鱿PyҪҊ!HOvvB96t<8x ;߃n݅/ x0ppA#a _}OMV AΪ(1=5f9c0Lx BgÅs$~d+ŸJoKc L9εufIGeIߴ'=ڛ"

(-ݬ>h¼[aF,+/V5Q[%a v@0E|& 3"|j cF,f= 6{SH(jHV,Œ{Q4nj~ 7Avqmf+mD$6 Bq6Ald?m=rE8q3AJϜ'CXfsF^sbkzcrĉ/\o:^ZK\>5#@6#qJWHܨ1ԸL,g\xYnPe'9Pk2Dj3Ɛa^Tؘ9 E4Tαp7A_pF lǠ LL4tGze~`7 raBYz 5mlzD0}O<ݨc]͘7X~t͑lS9#|qv  敥J\QXD+1}koٴc-POy(JI#>\cTVIL?8M%+i=Se!/! hj&fFC Ә COV?AB̚V -ΉW-w,= k'([P ojG8Ǽȏ|Rj}DS$Ș-LR*)lWn؀7x\9bH(ل I6 S D2FL>?Na $WSvC(u䱓t 1) 41 WnfV< qGBY9\y{^.`[j,zqRJWQ_4X^iOVV P蕕|ZiWz+z~Ʉ9z䮘Xzyn rOk6r$͗j0{`ױl6F,kY[򊠼!( ʿ/ n<(xMBABKK?_gM'hGd/\_oΚ:jY=6nzC\¾f+g{ªBje3tG`eXA=UКjyw%oK5%ZsArT+>*mkڵUFp>*$Q,҇oi8kcj-I SєpOe1[T9O2]<ǧisHעMZI^4^]y,aҭX"zj7wmL4š>>.u/ ZMO%"RJPЃ)7vGbs7҈eEYO)Nh tAM+_ЭKP' O[IaHHI!I&O|LHm=M޿Ke#(Nmm5x0S Y~"3gf2OnxI<)h{q3cr}QwL&/0ڕI|Graphviz (DOT)dotDOTgv source.dotxڽWn6tM%laKɬ\v5`WqgP#qHepoCJ)Z"/#|!}8~QF!G_ڿ,a^SWoԯfv˖C82ϖlDMc!{\2޺Ӯ{c+_3'IW7A[C8l% "8Z;.-fסּz,JI(5ĈILccv1^rʚÔH2n߱ALJHJNRb]^M04o 2B1|] Osii>?eMZ-TއCG71//%V/oLLޔzM%8wmo[jg T;XHޙYԍRhF<"B^6%ջj?v/˭Un5T W[Aǣ>a)// Y̮wNn}PmcGy1xQgClvr>v.};yMtsEN؆5 cQ*&˄"™8pݞdcit:Q:o&ƳVѾQd]&C O:<]LYgȾZIH{Sv_,P3qUknzO?]3l~Ǒ}cwڿ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} )xsF6!?B'"?Jiq; E\I&IQ_q>ƽ]iWծ$'Wn$Wo{\=_-^o-d3z(HvGHgyrCCz._tFAܾ vQ:drz~p,wgbpP?Tao|+iCo,II˲}ض>YG4gH\<[sL7q BQ/>] lwAFs*#}nn*y>[Kjc^/&3N=O\>Iј'^&]Oa|VaLtƨ1eL 婇2L>TDT6t '>_ [x{oa hT3O\'>!lFn "Ām\ (HDҮKv|{ ,ԹSe\cdYc4'Dwm**ioEя*gOL/ iU~N.uA81sW@]cCxNF] abuJ6-Wt䚠y}{`s8givJy^ tF=Ҿ_C>@NC2$;cau!os8c]\x1=&R+!˙m 8:+ Bn5k:bHEr/dƘ F HPm $-xh`6F9A*Z{GZe9ӕ^Ե-;k7fSõޭuS Wg=/GvȷAI=!P=+Xd6o$&1´ϻ_ԻlbȀ2YK*S02rJ^ALpD? d ,W¾( L*גe }u OrE*KRS6P z7a `g*s9+8 (x^WnUvfǂK P,Ё⢨$}ru[c1+hOǤrTm8\ p%S #\n!lbҀU3/x8g$fuq8Gr2]^1ؔje$K1 Đͤ!!w1/?a<_i]sFEGT`4p<+݉bmܭB7ƛ`WucvU&+ۄ CCjjTa/p]0؋ύ "or񰜙= gԛ~eMnN¡p%q9f~FmFBKX̱KYRy8teT<) ͦλjUЯXw=}6@nIɬdi.U3ZryVV8-5K|}'&eɂQ~eK|4~o3<7(aRꗶd]1-MĈ/&v\J{*)MsY]K]3̙nFP/ٿB5,II1O>A+|O8g.C~Ԗz jR~HPGhJNzތM/q,%{!Kw.wZ J2:ܠwyy/+ꎭ20EҁJʻ0|cf's*W:Nrc-,D_6%}uA&|%kW:JYVԤC]ce}2 fiO'A ԭ+DcD [PcS#Ұ7.䨹P9J E1|Y5 f#]18g2g*1W9p3:Ҟ6Kdop C)a_>Z]EeAǵAƁ!5@4 :D˚XcEx:DSx; iBs! ^ĨQ9ɠUaa< e?%9T"+=6[yqP+B!מJQ0W'M=FᙉxE7y_5zc1w<)ľ`(+OER9d8 ۢY:>gg49-k(r'"̧j4S&V%5TxH"pCn(ڗ1mE}`ӊ15EEh h81+2ٷG~D6pL9FT)|F]#3BZ5#rW&mT+y,vpA3r 2k9*bFOfp,uDM|`wZ'@r'TP: D+? $GR:^!#f 4 Y;|/Y)W /UB=ˎ^ǹ@w'W)Y-^O*<`^4 '/+$\F<~I]t1k;cULo8iz;Oio&3xJWgw1wKvy8=UPbQ&fPFŇ64!75#߉6W5e\#âOQ2aKV8J|0V`NгG zD; d3U}!uh5m/Z];8iATC| qkI礱k[/gNh`@̏w'#2+@P~7aojvMߟy#z2SdT㢍ɀQwmb˜N]2I$tHr,&RX\) *JE+^fZbNNG?.61ҷ6h.fH}kO/2:y;zSt]OUtXj;ZWoadpSEc[vi,u~HbxVѹ͟VvrGЏ+c!9}x\1qS !ZXhPg,UOV'+q"eӠ@7D⿉W?LCB2"aMe;~A^/N#GU|W_߃bA 8 < ^9 OQ]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}}=>])/xzFrlH6! $g c<sAB9cFjkΏٷo``f[jIӭ~;L˭RUk^Vq;;0@1u@n VipܾρwuIaaA5 yK s``Q\g0af!5 ^ܞ`|ózfخ@o||"[GekC'e/u=LDH B'27 /HܞRփZaR%65gx$sښ-intOp|p ~JUtqv{eOu棞遛!}Ȇ8Dx$bBg%я(:_5%RJ"&DL/FM8!EL52X 2X k%:?/DLԦ.l/fN [ p(SB$AC$vsZC#v{FDaC"&vU?0-;5ag]}]dY!A6D=;Xgo Y doe[e喰 BK&L$@M/` A~ٸ|!Ѐv, Lǽ+,z`\`vQE#0NKq.'ix@#g_~XAxzneH O%l aܞRjP9Y>nOSn#a)BnWkA ? ^nNj%moUw ㉠ Cd!,#D@E"Fv!~,4aO! 2=,p,'CFvWt.s׋Q {pIɁg %q ԅqc(34*@b*Y.1<Ԗ(SG!Xq2n uvWu1 DW=tKdG++ E1P,שhr,zIB2TC¾vk\lZQմi `--gu˶Q[-}{wܡ#M3X`D3jcTk,԰.lh !ҵny  "Zm[> ꛠf4W$"Ad> f硞]OJA26Y 1ؿ(t/RV\u~V*k S -G1B[uD޷[g%Aeǃ$}U#@um!DfBŐ3yE~NvqcX"ߏ2}>' ne3Ylܮ6@!5'EmmD6;,:`!A pJ)paB oXA'  w]_h1}R))*F5Aw+(?xl1vq1߳3G^7 %ي7q*_?eN处S<r**>'ϡe}9Χ(|r_aL}aMu(g^š|Y}JxMP(돆LI4U*X*^Ұ@4"#q%&o/7\Yc`ֱ<6hbEHeA]Ym$4,!1Or4so"S6%.K`Bã /M WPzWq]C-?[~ޖ/岱/Q1{"Hj[9IFGF.ى&󀇤1?\UiqV0ώ@3 ~k#(:%Zt@]WVׂʂԖht폕q\09rIR ?ACx>. ǭ"O䃋lcǗ7]5;j+I7:`be=.>uЦNvUX$. CskxmyJ@@$ՖA@Ddd`7(- .ѽzJ|a".+red[:ӚԹKU w'S!FulmTO ?_ ?FÂ/Id6[bFxwL_ث:{4X9pJltF.# s]|Z]=d7:zѮ^{r<}3]#Pgs'OAMc$tnWs #"\#h2oY䵕=ضQW<۟դYm5%}9puFn]0O9wm9~6*vb$a ",l/5I;T!OK04+LÑзhPSeن;'giKwbt𵢿lTX( Qv=D9^ٟt*o@hu:XAlV Wn\7\_ l{'$yAJ@"H-P?T*V?+3K5[݂OQSK˓kx;QE!5*r>({sR}y>(cY,w{aepbgRqɐ$S~P)93m$+E#0a>'0at0#0|A`fa~O`ޏYX KK`@]'Pph4總S]<92mrMk>y~<]OV'{`u"PLs M=xr1<H){2qE-~pI+Ɇrށo:v]6%aFTFpe)iſMp4I2m7CDҔIڒمaut䎥CJ!.!1\;oͩyGdfStzflSWe9LDL#y8vr'^DG? W-tLC8} ^O6᮫edP} kml9:!@W.#Tm3 Z!\e. ~0Ct7Rythؿa5W6l~UB'X,j7.l¯w&,4lFE|>`6RExa`col7^6vh=nɼ7vP9B񑸁i>Qh堦՗EeSWw5Ic8_5jT5:~ū&5z⻎%6h gv3^bίȒVR"Яx$ >ae9q>l<@'=p˻%M='rKNm'Z;S? ULG%pU:,,-,Txy+RaMQwJMe=<.ˏi=DZ8s 26+G7b-uFbpދ F |DgP7h-"( tAyd`Ω=7IAgu:wx8ԐJWRamg\6[%X*{*s^-WPک⮺_W ܫ4YEFm^BXVEJq׶պZEJ""ХZTas}̩J[5^6T\;PjLM0RLdi-W\ BT0hCR _e.|e[qIMjdssm2t4),QW\Z}8{ #A%} #FLOf)υgiVjd4FF}cDdI~ivt؁_ ]2H,I.4Se^$G&a0#{:]h6i3$}`T`i8Mm,BǨK2hv!"hC`yOط׳fP*iy9\5Baiиq4Ó|Opj4UЕwA[{ =i:6g "0Y d9Lޢ<%kG8<gbӴ9$ J䘣 qMb9:2|,a~?#(&_VNV`8?"g(@e M%C.b^KgH3yFZF|SWpe|ߚu-ί#ҝ^mp^B3L Í#Fr̳ ublE(\KS3c5/ 2.#.YR0w ^#k/KD-+yAqc1̣L<aY& gҷWE <Ix52DDHF EYw0sz)1S:3xA:-iȽ+^e-WNѸׯ0K.}[2 T'd?k] =| OƴY.%I[y@4L~ ?uʷ;DUUEF+zd9־K#"} Zb!ZM܏ %iKHڨZO3;|omqmJ_9N}mk T䁙U3z6*Km*YQj[;Թj߶"YY8 S=V!z?*TFX޻c{m ۶u=z1OґjzZhY9jq:ou h[p/;q@+^Ateۮh181Zos0Z$ؙ3#@;( cbIx ߩ${6OȜV\~? Eſ6_Dh<,Gx$ib!{_kS&.qÞ/FGuvR8Hkc,}?#lZpvxӖ04"!*Pi)Ia!O:ȷN:?:Ƹ?H ;(3$.iLw)i*o QYJΒ xIyK{7 LHCEL+,nyor[}haO"9 WjT;5l}Z3fE|f3UyJava Server Page (JSP)jsp text.html.jspxV[o0n]a<!AU(~)3Unbڰ -{w98vڕIH|;NΏd0EJ#aTM9|;=:bz(lFt`ݲL69cJlH0_fsdNYty44 d37pO|R۔1SexXFA?:Y (I8g0Z%уC93)Q#ՠjbD$dd( *4̭_蚣~)KNMůr>zU2W_=Sd xcĐDž p䡰P<"^1NB1OšǂO0w |2,tM 7fQ;t2 M)y(kn<b$}msoMb:{e[;bK8_zn[(WH}GQҘytUu%WR`uPN;żW%TO)2'JtM}_%9}kJTm3ySEUvAfe; 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= ck'"$ vG#%(m-JP˸+im/w]Ɏz_ܴ޴?}?ݝ졵"y7ケkğpzt\gΜY^mlzjך;}?'̞:5՚=دDNy8=*5=sBЦΐBq:*RYg9-&7t ؖTPV:ZcL]s6 F ?&۳Sv6grYZ.3Н8Cj]YN-),rVVs7NKa|߱|O&pϭ8=&-x ljs_ Z!*=}G Nv]E:zpٗ$Ent m!Q_t۬^ /R@BRႅX#wK,ZݳڼRC.[+F:uzaܓ H6eG u̥f ӇGFW1ۂ*83| 5=!UKn߱7V37ۈl+Pc`P:(` f8!ųGȥNJ!V{^%ME(nE(Jv@l]6,hXތh?DSFt&_~W"No F%I fbaѐB?Ss%XOb5Aot]AtD\E X BT[69LBohBjjfHx 9b="1GJ,t(:\66 0 `D#1 %eGi:[vpWt/ xdXjKhؖ h(e @-َs)TX G|0B.dzd >Цo--( 4jVpE枠O$0X تlz]1Ly+v2=*9k8%KFUe+,8̴ 9껀j0AƓ-N @97Sb@61 XO~o fy.@@~4эׁT%@c$E '@]7qzH X-@I $xwp:"`.r,> /!l.诀`H5NwP@h}KL_ľ)syw`.E@!ՇA;ȾA ;T 4=1=G[];73"qX_%WdݪN纻}E` ߅xˍT#!T涳:ތV_; l] 5'$I~~9ZgOzuC; ߲=Zl& 9h4F.Q'%(mDL I!5۳*v@hqLuF0ףۄ7TfjHSùiVnNzmpqH6 ) CbN;n+,.xD8 QQ^t:VO ^V0ҭLu).x[ eVp YYkN~_U䫂()٢M+}zjV;fp뮸 =3~~v[ ص^Z9DCnf!##S99ЮI6#JCOAKe;,9PDs.Aތ-^L1FZNRFR8% gXRz[* 섄6\۶EĶ7\@9x-~S~e˔= ʩ<#b4 G\%2`%7J^T&D1|e8?T:L~S7$4q4iB~ '2#3%n}MUQ;[9 @dfmƑra2ᙐ >X%zh s;ez=AlOLEζn#;|4 -hM "UcFԩ2۸-x!`V;DO qmmy7q,D12rt338_j72FT6Д8X#ЋL3݋3iҞi)i4G lw!&΀̎*C^yE몉:{ɌJ|JjdܸNʇe6(Z"x o*ږe(@(PY[ U--bX]5hJ ?TcC?,Ԣ4 юic6kǀm َ*M1A/zzT:*3 F΄f  Jhq]U CJĄԂB#U]xBfaQRz)>#ny ,7S̭yIǔq3#c 3LI$<0",=ɑ6&D59]{pnv""kP }meoRPE"SqOA0 4?FsKrt\mBlu^+Ur2h' 8})\+ʣY6s-d_޸U*_5' }.Ϝ+=G^d^="{G ׫ASyo?d}P6i(^Ԋ,ٝ8*ߦ-WiyuIAx5"C=3(cN[9~g8o<5|H=zM/󉹋O+dp~2B?To/.# YYi4jZИhL$nNf;-/~%oݬZTiN!_DS$ccAWMꎻ`𪐬WKXаؾpL$i*L7MҥLgRZˢ e|hpXW[V7 +^.2,btVYkc"pa枷n.zު; ա(IVmF 4=˼ڹGN i-N6/ֳz}HXIȅbeh bF GN(x`u|K=aj Ki؂Pc\Fcp>*)yJ٨tniʢݱR>rCdgaΎQ#RlS7MA+XQغ__cRM?؅|RoDkg}kSˆ?H" ,w kw_+){Yu|b}n?,E/1 %tDF3T(ߌ. ӻt TR0f(3ERUޢ* 9k-{@F$J1N某qF5r9y. cDVj"pǜLN S+fL54^ГQW2/okJê{JvRkYE弰R)|h| UH#Iz? ZNJ7/H͇%_ h <pO+ 3oҸO7;FK!˸$^#ByJSƹTx#Bn'W !ܜ^1mt|ǧ=>敩96^%}RqE bTI^LV <T.݃\7L ʕz3xШ7LiQ4g5r{ȁv~t;72O5VKlSLyW"uD!mD #;3X+۱BF쥇B 11bDo]k&H$CC!@ ((sR(@㽼rt gg||$Z)<َ셜IcFY%ce /ȣS`wIJavadoctext.html.javadocid(?:[\p{L}_$][\p{L}\p{N}_$]*)javadoc_block_tag_terminator(?=^\s*\*?\s*@)NxYo6|#]6iڦyX%VO^ Zb-$P"2uIK20!0m#B0H:WaJ}^ \рilJb\6%e!Mx>& ATD 3D ΐ4_ڧ w2@ h?"ʲhJ]e EXc] "g"ʼ0rj2y,i RiFQCsʀz) )mL2lBC]Go!n[>v}7jtN71OjIXk|Vܤ't)aX>"H*GVS/jt,SĮt|]́ʐ n ,]-609L/uJϽ\0ڟ +(R;0B-78ZF Hg4Lි.iŇV\QIs>%WFM̭B8P^5xNK5jzu7Ca)oP]6]ֲqy[p.6mU6ۚCu'Ln/qb"-|X fJhe1laja+K؀`naAOIpa2YR0k2-,,F8e:8z`V26 rLďl# i@&5\vQ~ (AQm3&.Jbω#ZS哤א$>%UKvp,gOHJ=Zfƥi$9Hhbe~I+IqW|w\ #4QW¶TcIH =vŵpd(pėW'QBvInI3"# uRZ -EDeg ̯u6uo[eG6.}ئ16v}l;Fc*ۈZ(ƴɣ~j.3ySOj.VJI`%{Z#갾V~럒 \fz ~)`.vs>u'_WZf={׬{ov˹}-,b,1m+>smwd* UJava Properties propertiessource.java-propsxڍT]O0D#ƨj|ҰFd'q pߝлul9eƙ6f/1e'*B*V$/G/yQu3$Jocl  X>ؔ9_`>s4VQ!rssm}爣I4nAVq[JmU#B$rS6DLؖ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;+Xj%j;ӻROGk $@.rBr@w?@$!yU]U]USj5SիW^zꪁ\%-:U Lϰ'vX? 8 K @ 2%pvS $^kwYm{nc3H]*iWtUsm6j6|:iN[N\ř$TWE zIhlL߷\j:͸$L(GIsHz z MJ8DLDksIzPn2D YW) Pi+<ػ.$b$l5tðMw$Šmz݆?Z& 88u3lc1ʅ˰T'- 3]zӌA^\e[N@|U@ݠc$=W R8ٱrIѷLӸJfD_<DŽD I$|%$=k h0ƌDzrȸIK ANIC.ZMK]aK TSm? |t%lzF7`6Id!ϑh)WĐ vejQkR,2bˬ]zHA|iR( HO)7iNwns& +fV" 3R9I(mLRGHzABҎ+z${` Q#W<ۥ)w"CJ#R7[Q@:ޤg4XF7I}4 ('- jQSnk[d'<`$&VדJ%U,)2-xvwCݼG䷿AvqAa(I&I-9{5HqP 7?"qhp=/pɏJk`ݑ$I ̧oQ'$i3%I͟FzN O)M?aL cM;|GEsqWB VӒJrLJӠFrs$)C99?z3C6hF~!8x;If(׽,oЗ /J~W'U_!XfL_ДmDZ:5YVdcmP %2,~$dH${zgO&ʴIk-akgwf/3Y%u3&ŕmmޘwt<]u{t{%5^ӂIKN}4_A|^24()J<.Ny.?H˻ j؇zAx&}5?@ 8Fjhc !haI6' rXLr)~~D&L4|z#,hDzm8cT46t1f=I(̟J q:kP $I/}Jt: N iR.ޒipJ TϜh?Aa sRM>^!LɤE.5s$V N~Woc䟗*0 Й_ )5 )-Oҫ &)]=]?6Qb܈FADsb cߒD闥DOʶmh4rȳb4x; W%.fU_—R 5tMfoH^#{i((#nJ/2ٙ7I䂁 6(F$u&-$ir38\L%Zܮƿdj8k2ؠe-Wˊ˿g5?2ā!$NVf5ῤIK] .]mI#.xAI (JSE|3VKj x04`=-'Tg-5'r0]SQI }ƀ(czA9 G:m[2r?k1[stg`$`Aǜj%|eЍ)p@;œnuр8rHK :xqA|ɀ8к9^Uї ZBCA WH,.{0omJArΚo>1Y;bc@ViG}VI> TCƁf`޲ⲁ*8eFO>6 MJqI}MŽ.V86I;=F =z>x&H t:^CM;*%ItS׫Fl΁s@)m9&м$TG8.YLޏ) ׏VJ*y|mIQ!|W_3| =m ~cuF9M}{tΝHzc!A3XX>X}IGEc \{6ǚ@UA{W`JFڹW&䄯DiFr;[HIK0|yl \b.DjZU1 ,Qtl S R`X# 塎7 aU>\FSk,6 oqR )$_P{]A9a i\^^jsryp9Uq[o'ϠaQ(U6V)KThiT w\y|F&}?ɳhߏ(6Z *%V ] rӊѰ:Hnб@h}/l^r4YC|ZGZ|SEDt ebN'*Yby .u{F'qQA+yD :IRF@"Պa}uDE}WR;ot&iZs%^D0<@ GiUC Ӑ[^۵\IT)ז4Ԏ˅%$^P??xX稙I4ř)6y-VȂָZX /i_Ârt ^􌼋Oߜ?tV:fEe׼hxoEg2 [0\$PÖkX(#hE/{#`C*&yO˕T"q:|U ]ʍM[?.s3]3>.ME>hTYm8ͪlr-,)$u iP?^S? Jԛ$V)QkE_V)QwI]D]$Qm"䀹/Z$*ۊ$R^$QJ:\$QkuHwDս󛫴#*#q"OI^D}AD*% $Hުwz{ɀE&̥y2/`LJ)y1n5Rw)*tb B7[{n9c!nzn5LO&'Jg:$D)G;uLWQEH/xKd%wrz_WݯE1E!dxLVžQ>sHzRg22ʩ|L<:H@9ǩ(ࢮ8nGLlt䒧!JJɒD<y5٢{Ri$qN}qQn _X.]0ojƆw WYdwxlqVA!,Y3(^Eߓn0qk.py0ّ@qG{A#!$2:(5ٙ* f-߬3FG50\3rA{kYFv~\:bhN8exό({sAQUwP% t+0dD̰`\N@~S.aJƌudN% Z: u0;h6S  D؁նaV ۩nFG%]w&X=H̀n5+ 2WGIfyv^gRWY},j IЮ?/,f ЄV_N3P䶎M q{Uf=w EP#) Њ0D,z40Zb"u( zZyW,# &a8Q=+]MosUYFuz_) :\L[:aԬ=Axc0G*-}8h 7m7SMBuBg*y'KP!JTO%ڙJ{)+=ig-*kVH깻?QJk7~NNŒJ7AteǤc_4Vn^b@,3=mDm^U$w3݌scP>1*Z߲SI?>ӳ(!HE[# x+(Mg! dl %MО>7< [Buh!D,>\8+smȊ'30C'wq܍ԞbT*!TG¼*M{; <˃フV\AQixFDeS69mםَ*\]Ϙ>Ч{r]Sy)Db&",^2 inصZ>uzEޫR ڦ{"ۮۆͶ*X2Ec@=UڤNgT͟Lh㊼Lw0=O1nrj^>"Rݾ5# I 2'7eb"h0S6ucwllѲ/׫5Z.Fi4ڦFA)b1A! 2ZER`@% RtsQſY||&Ɵt͖e:̒OyQ8)\5(]gp70#̣Gy-a;w:nԇQE3\+XD^cX}0>{Hb."~K԰bͿ.evMό)fUǞ>)@ڭg؝ORB7醛ּ'pgՈ./GHTSYRf>g.ITx9ʂBԟr\Ȼx!Z⅊T=!auclj*d_ѹ-ɈS8s\% _љ0azm)GG<+] Ui\ZGN۶F;mG5j( k1"bC5"bRҩ zFXb83v (#ۜ:wq)n;[Qe?L9|yyE^%E/Mq-꥾h,ks껫[X ,].ʨE~\&V1SQTP.۞h .g.& ѨGQU㙫p)c@(\@;:kv[6<[( )i[%`oj% =TA{#VzffvkyZRoW"D7x71+G˿&>=7dTsߓ&`s5̚I5:IDg-|yxQեRU2lYlۜFH yBA͉*4/ҫ̖B/ENVn9W>Ɔu&ͦԜ}Dݔ[~y>&}OWT>g uWKVc5. S="R GxyS굻ixd_g;ӘSZD?!PjUGWUhX/శ8_[WOxK ր/:$*$6҇J=nE5+M?] y;~!DR"^yUo6o`(ҫ5vCI;8bvf rT:\~R0.{]-oriV䞟)`=;TAYzR&9(clGIu;"&V*ԙ[A ߵ=]+~GaU@a]y[-IhrWnbIWm֥r 5`i 4a ,"Xc/g>ߖ֮s)hWGXiOt:쎣q"*3nqt$"ѮE4 Mi yI0%P$yA.WV-A;^2i ҥfm{PvEX⤤BP7ؔ]S0SLeŅ Bʈ,:t WrLe_Qq"+8ʣ(+oR|]#ᣚg ?1Ɨ+l3ğ5C&Jt?{eɑb*" ?].A[#;i-ZVj`=x = _# Vuh|YLncWQ*9g*^ycyoDߒN4S p!pS}{}{ϕ|}^&o6i84\IvFA~ɑ睠3a8Eи,H:t{uX]V^3oucDMא47>:IK"̉~'o\[ 4ݕNtnębkaI7o#y'/'u@cqcsO Y)db?1M/P5®(^r"fYVok&25hi%*lw1H QjEw }Ii`}"џ&YI$j}jio-V% I:8:iLCIM&9:\ /n#)Z`Izś)#<3C@,~@7Yr$UJVt\}>v7VמGEV395% թhs3m'i$X;@:JӒ3Y1ڄ9<R[~D +R('oZmDс&.?BqO c"M>(ֽf"ab"G uOvrZۚ2Jh "d3۵Lv,;(2go;w4C nmxLdδq4C5蠇pְ:is;G~ e&+nΆлl2n'TDkj~y5J|Uܨ];kwxvdhxdx;kb7Nw/zkrlECF_30,|Aq5wI/e o2`CZBX6аBjf ѿ]m}[\6 T9'*B  Nc89rtǃwdN?tlpw4<2GFУ{G 9K7A&O4W_C}Ԙ2ibb--cyxx 3l \&Y!X/ḟ`PL돘hFIִpa5Ym!~t58_X>?Z@y#:ȄeI3K`FCC|ex/^{%l6z&xwSfh(c8lrJtг_Mm=2[S -^!^j7 ~MTΫ/9xAо~Ke#vX'Mn_Z` 5b].}n!g^]Ȧ%<3.{1{pʉn :SSŻsK*sgඬAw ӽi0-YjwV F%=|h)sv%A\XW<}Ӛ\dxZHR=V,TS#`=t[Ϝ?2hdG4XH! 0I}4rsH!G$rs%z煻n 2q&6ZmIen\8 zSJ A0Ox3Ga6mIңfP9L/ ^7gH u`R>:~ Az{Ÿ~jvws&kjZrBC{D"SrgQt b~~maEY])9hi7=ҽ#`b >1.,[ذd_K-͂BnH EO;*OABi(~AG mS]&4'+yU2fӜ2:vJ "$ ~EI3_xF<;ktW}+?_EJmPE>#Ŏ80f-᷀6GR&G/ӝ<{;0M 3w٬z #k]wɈ6IH;#)E=).ʹ~#(&yUZFҤsi?% ׉lQM<#r 9򐞾ɄIæ6"T]="(*Ck*Ẑ{̝0:#jM͠a0cWFbE[1<q%l3eMi6r7),z>摪}B#U"] MWrֽQapش\<m-kRLEՖt'+&p4noW 7x Ls@I+9W)yBE[ڡ[X9^0Iaà_ Regular Expressions (Javascript)source.regexp.js identifier[_$[:alpha:]][_$[:alnum:]]*GxXoDokv'FֽbjB>784:5vIlsL?ɽ9!)n̸h=|/w_>^EuIw$tnC;nSmp0j .w{Y\DR`p~R.R$t*\ (]2qf}_B{,=q =? |ar?ApH&'t,^QOQ԰nP˰^ BWG~u&bI1gĵ_8i>N F%paKi!ej0iZKaȥ!óPZ8:@xXNUUj2`9P_d1idF03HZ |PĻ@VEN T(H"Z^S*RU%(HJ+U{X[̃^&eϒ2>O̟L0ErbMqfɱFMBq 󈄷OA:mdR5f `ey\%|:f=eה~ה{;bR|Cꜳ:qX+6Srg>?d[ǹ:)=ɸ/X24ƛk yWPʜmO01N=c, |d"k:J5Shk(O#ΐ!GwoT(HE^"+=YF|@CXl}6=A Xh"Gz{*LJ ' BvxW&2d*53W`>0?_ %k},sQqb6\|8Z\`܎4ۛ0. .My]\ԋanlYѬh5{ff}j.?&jV6 >ue):?_X Š#]kh2#O4-:~2fs5y{\:xL5Zafd]I=4y oBibTeXbib text.bibtexGxX[o0n]&Xm]BVOekSgPw'u8 &_6_|϶QM@ԣ!"߬W` =5`z4cf^y=`~78`T%K::e)z :B+ .?x ?|}x+`Rh]-o(9H7r-PGz IrN-Ӧɓl9xbvmΎžX˖}@ @%QH"F?13 >F(>|/ue&2AA {..p3o3f.uWoˍɃ D!}. W!E䥕I5K0qc,n+WjE "`wIщ{C'%Ebsi_9 ].A:(M6}mлwM{NӴmCg]P^/2@ %g'h_DiTu-f1WҦ$2C<*j>U3]l*)4++e@.ֈBu |ǑB/GvCKT_1Q14σO(v%)@ P@[WڙRpL3P?(L%;Ds{2ꃶocYph,r J1ۭ IwxIzTEib@FksQE O4z33\Ksf8<1B)v}vkhqD#3BBZBL7D("3+"\a!I_9gxj `BP>ؑjM|qKaG1)5[1,io0kZ?Y-א}aO)[oCNS[Za\ a%HX\5?7;G50S|#üӊ4iwqPuTpB-k^K2cLaTeXtexltxtext.tex.latexnx]NMl{PNbMܦ6iZMQIA {{t${ ;pwR$MZc:|qx}߽p\6b3Z6oc?J=}AA$eiЇ4+ zy}zE} zeU}n|]͠fz +jrS-VZp~Ī}v+NJ5#KtH`#yqWPG 7J5$[_/apcz]t:6jPOn˞QtPYϨY ^ݨm'8rL36j`MZ(YHm(@ҭ nc&ՌCXbC,ʫPNٰZ^{ Wc f-G(@^̿O)@ q~ Dt5MY3gtr\P rHVT(@} `*XZ X< ` r2=@V& `ZX9+T `ArV@3:\+Q*@  XyLѣ9}(kZ0f5bO$cuH MZ(8-Z(Z(8P`Z(} Oi@}I  fUiR)ަOBAC ^Z(ZBת Z(:Z(:le2M۵P Z(ZBWG ^]-xkq-xP t&sC ^OhI-xBA-xC ^OikS  o NT|i Ȓ68gq T;%IwCxrf^sPyu >_|_ǂU_ǂe_B{ =|z,xXP^JmI;Uz,Pj=dx V_ůc7@XMz,Pf-`hMDoc@Xz,PN=(~ [ߣO ޯbBAjևPpkɖYqU?Ɓ}\Xz3\ d R~J9?C#}FoVgAjV\\.lTp0R_L|)חS}%CU'LXBR0ZZ|%ķ!w_W]?0JfD! 7[P<3A}4_&wyk2A~'d _ {8 Knɩdҕ~|%S3R#;y8|,E-8DtW|['xwW2LЏ8UɄ.c>%™j%rTsϸb@u9f/_snpQ3Y?WXɽ_…Mr7&]Q-r>QQ7*njDN%NHEJVmd"rg^ .s7X௜ImE^Aj)r+kTG|%: M`\Xf6(u_*g[mr? $ˉ?#^t"a`MT˱¯ۨOec܉P(X >=ΰnx(袢d7jNB3JC W6g\ό߇ٴ/=_&ҒN$UU6f[Ri<8 } Y7 \iV܆D∴^FL(UKe5ճ*QS=zZT7:B~ܢ)mJ-Hmt6wVFVqd.f+U~)j!ZDؽ{5ccR0V:U sB_O2 H?o$VbcI׫N`sx=1c'(^ʨQۆ?={3<˅4XNe)n%jda/yܭ/mD1^Dثmxzc1xiwi7AFPs(&`;|Q>m45үT5DA13hSCC4]8:8]wՔZ-QJKWBH^B4ξAXkNX&=ݓ·!e4#Whmµ9a0tJ1چi -R BXan@bRUZ˅BOM+~Y?E#;wo1wn.NcKyye6324:|<OZo_ m\N׈f:kg]Hh:y5AX3ؼci4@t&/$d*T5}ʚ$cdp{B^ NOUӯxV=+: ͌a'UPg)L<_ڱr[7%gCЫ$`g"ZWaH@P8V XB3ZBBhrYB򮨰B$lՄQ4lZh3dJiiF~J#k>."4hҫL(*m5W1| -nsֵ g6#}HH4F!HGDeB&XCT{#w#k 4փEtKo<0Kf!iȩʶ+F݇K?+r;X͆f﫩4r E|OZ粶ܰ}*׈辆9i2҇Pi?HIgJxCBTMDi5YH=,|B-\>c~HFх &g:qY[W_6:4?J#r3aT͚Et?\Z/C#4CE|?20뺗uDNڬj* Y,2+y<3JsE*vፌEp~b~?3~'1FF" أ% :2!5#a8J^#,IፌEKO@#rodx-^x##`MEmVFBK^7!,፳^Epp_.gB=њ aoe$,8'2+Ugx##`"bNFPTq[Xž:$Λ&sQqa9!ፌEMui(93"Okv:'frwlM̏jſV|=sG2'/ '/=}YNF{mT[ieƜ`gQiʓxiIKn4zO:{R2S4tO6w2RӨ4 o7I,8*MyRvҖnҔ'=ncKɀOҔ'w"wܥ[>uy@x<"mAz@ Ca/}IsH#B=CZbڲ8:veGƂ}~%:Ʊ!ĩe iINi #YS̚Y T#mJqK{t"֢ԭ;w:Ԓ Y(* }CTԍb%xxD_D~><B" 4/Ҹu/rX&m=}Trh Dnɟ_N)Bcpoo_D~PjھH*MhܯҔH_O-*Z.CF7j9D)7OygʾV*Mom·^oҔ[ߡ$Tr޻4Ҕޓ}DS&A}X49t#X-w:-a#Ml.HnƕӲ #dֺg5S~FTzA( qSG;JS7TOPLbZ-إ]hoP2Vl?t$-\(vԾD[iUV`$CC|NB'SnuTjJI#c pY;o8 7C3$y{[ 3ДOQSO?.:&UllڽЙmPUj d^[e&5!ɛ1֕7 3k9V+E}hlHBC[Y 3Jʮ]pCVU wYPhi0Abg-NM*DγOP-P:됒ѨFmswҢ5Z;%;9q`06o)./T抪4qQ#g<}GznAW=o2 FގJp4a1uy=1)vkV|Wv4t=kZ\(6Ѽ%YvQE|gQ8S3oKU[es-k)1|^; 3q|\Dc|2m=#DbAڣ.%ږ- \]MLK g5#mUP ?}>#+tsJT܋D*ABU<uF]*mcMcxD6g(Y_*㇚F^s~reiQ !UT[߬^ѬFo |c.,P F41wjDmf[_Zp&3jV[iS BAp:Q BG[Z{ Ҿ!HjZh`Pk0X@{Dqe-u]Om錂ʕQ%<1Rht4QOz:](L[dGM9XකcLF>y*- v &?[X9Z!yw?2)0,|mqaqHe˧q-Z^]ܱhl9Q5g=>gU4Ւbɫ6/+1C(X5x+5WEX8=۸HzӃЎ Jw62 7TWiC$hI؃+#GZwĚHx36&+Pܺl j >9fAYe[ /S7e { r_:~CF‑=F^̎vDbs-C~t;vCPWu'{fa2%Bp,Bz0TY<\=G­i/m+&M5jXQ'Y˴ Ѥc_V(+ y]EVLq;))52+ᙏB GPbLWf.V,.H 2'3W JBPPlƢxg[Ur/I%GCIrv$׆h%GOIRM.oKI|6IҷJ7JҷH{mXz0O⡱&OGMk~ܵ%lzw^H9zwZ+IuF~0[ M; >s,* *,OH(I$"<s2 d|A.(V89i)܌N?,s=8˝pt5|= W?&ՙ||^Ua]V0權048NGīSӜNP{5n?δL]WNO\WZaH:z\/DIix*)0?nV,^E:Hnv(<xӮM%7\ n"Ӽ&q"u7z>K4MM~S]*ڕUۘ*||iGS'mAdS/o6!_H)?bB+xp% eqx2YGkqZ GummBplqTN8 [gNOmC:x' L0̌ )w5FpK8dH ߙmp9y^3լhTB8D446^PR *gW 2v& W+$%V'9\u۫a{1.]OlǞz.^]6BUa9WLDը|>U3݆ދ%.V4ٳM]Z%rP\Nؤ6Mgm2+Ї>Cy v C ow4zp3bd hmeki K_ɵѮ~EIO$,}_.[_IlԿ%? [2m6hΡ~" sVLԤ?=0 &Psؒփrfغy$9ܻ7gKW &j9 ħ-L665B昱TeXstyclstext.texxO6-q/88]SlƺIeڐItn%iz81}14K`_ݩdi>v'i3IUR #j>?.EUjVBGj\y7"Mb)s@+er#m8H8Q"?|T@$lhhw&8}vA㇚ . h'幰J> )= $W0pEӦAx*OW5Hhh)4S#ytIZPA6z#";g] ˲Pp47Ip&IFF|dD.ˆ/s=.FMYqպ)ݔKә4KAq BnhTo:R,pu8bEWb_. Ew<^TGHUccuIWf2 vDEhȕES;urFݹ$BO!x$J.{֚>it_L{:dn\\WRjs 1ﭭ}eo[0GJ3:\4f<;UܛPU4v(`D*X^#z7v w-t7oqmesaZ\UԡCEDHQt ($])H̠a<_3)<:~УpyjYӑ n\37zezI* YI-f%#cDOmՠ~bCpѳN>m (fD'$ BL _zbYTA޷[we 8M|1O!_Ԡ=ԃ>[0F>t"|¤`I@D➂0A4*B Q G})F A'glrۥ$=@<~YqCD~ϩ2CKjpthۚXz(n?g|TW*]]loT?w}iut\7ZzkJ~j7c_,W=KQ1jix&%6Ԩ.\#fuo=7lo2WpTdžeþIIOvK]x#X~eBv`Vbkw݈ԑs|Ztߌǭҧ_[ۙO>^S6ruݠoL̶4bmW5WgYLs_ٌ 6Ul7q.5ةm*Cyw~lO2?r-~XջM8~_?>ja>lb[?Y`:S}iZl=?3{?v4yvRёjڄH_?viƣc~Oɮ1\]۽iw}E'|\o[5GWeYi$*٢WF0pOȸZSW6A*n0~dT#<걪3rg2.lJMDNJW6|\7/ח>|{LϔGsqC="MX}Km| Ʈ)v?)Yk~m.P*MK9%6gL06߂ W.`LitFRyb9Qy[ eԷ?4r;glпt~n<;Cif(Y9+1`w8_1dίrvSϿX/v&'řdh`q҇hpi?*7s!,dK!ƽ3 tP+UC`^WK~ZS^caOT~q6Dv| u }Djb Gt 4qH}[W4b!TS>hi Dč-pyю 0sR}HYR!8f9xץމ*%CalI Z Ų' #jߍNm_^L$uS $ҡq\Wm(;BPsƒnΖoqq Yr""(N(?BGG&7݅~<i0MC;aN0gRN ΁zGY4hI$cJQ1wnf {2mQNPm.?}Z&[*#n`Y)A՜ ۷"6Y_Y8M& ~݌; QOG XHt/UzC4Ӝ9)c/c###G$b6⺦ D,^T犓kP;ٓK.L=)I9^vX\(5x[,@BL=lK:8(QJUI"  %RR$ iǞ/Ń"4z&xPʼn[L]H"| I2 C+]yHh"5XZdhb&JI*{[֦$3X`ǬޑГpcm &5' u!/D먄z\ ӊ:{lzCj*VXSVR(ANC/kPj(35PZ8|(i -\+tʸQD>r+ eꞌЃbбISO*+IBȚºU@Yco9-U]r:L z[!9bJN9{=XLhbTCV4E"*L,)ZG3N,P\,"Mkm%e,Ƈ(aGZ' 1 .rʞB`90Y{Ku!zhC30(cIkD "*\V0-cvJdB%FooXIlc^'] e{.ܖ?Y{KPȝf0"y9wkS1'Gz&IHhoC S8?gYF}WVהsRFcYEtYMx `<`f}|_0Nh[N!YֶC0L!|e)RHS!4.CeaHR uy Pr4zؙepVv;I]p"$@n~yk,BfkUN CSh'FLBӽJ͊-] -S}=}54VӚVɤ6a)渥?[ە~lH?zUcJ=oo{էprs"m^V6y\bVo#6 oO#=ӭx˰o?~,l> % C7 ;X$v[ɲ Z ӽ1M6aIV<(ɖ-wOheG>{)F>?תM^Κǰ2; ׭<#^y?8?E‚#t_ߛfcZ_w%i<9QI y*s4%>5ыC,8Gd7P"+#@P'dA4!EJו ("q[-H拰/-_孀ѽqI"2/Kپ%1ڄQE\2xXش*(%Jyi51x|8.~q-6eK'$_>w\x D^kU/ŜO4!Lualua source.lua dec_exponent(?:[Ee][-+]?\d*)function_args_begin(?:\(|"|'|\[=*\[|\{)function_assignment_ahead'(?=\s*=\s*function{{identifier_break}})function_call_ahead(?=\s*{{function_args_begin}}) hex_exponent(?:[Pp][-+]?\d*) identifier+(?:(?!{{reserved_word}}){{identifier_raw}})identifier_break(?!{{identifier_char}})identifier_char(?:[A-Za-z0-9_])identifier_raw,(?:{{identifier_start}}{{identifier_char}}*)identifier_start (?:[A-Za-z_]) metamethod(?x:__(?: # special index|newindex|call|tostring|len|i?pairs|gc # math operators |unm|add|sub|mul|i?div|mod|pow|concat # bitwise operators |band|bor|bxor|bnot|shl|shr # comparison |eq|lt|le ){{identifier_break}}) metaproperty,(?:__(?:metatable|mode){{identifier_break}}) reserved_word(?x:(?: and|break|do|elseif|else|end|false|for|function|goto|if|in| local|nil|not|or|repeat|return|then|true|until|while ){{identifier_break}})reserved_word_statementw(?x:(?: and|break|do|elseif|else|end|for|goto|if|in| local|or|repeat|return|then|until|while ){{identifier_break}})xxiufs ,``gaZvY_JZoiF=3 Iô]ߐO/HU?k^-uu̬]J#~~%?iD|N{M; 8&uC L=rB~ެ~=y{_g`TWTVU_VI8_ΩF%pN7+sI8[9߮~4>{x=@#d)}j [Vm{j U[p&W-8߯ڂse~hӱۺ7%~ϧ-\G(@^2 iv*> z" mz`塛iIv8@.g$13A 0J=+t::WG yI`"@Za/H{ p<.VlQ؀GKrCkk#ݴy t/`/I>~\]=eӶ4Hld{%HV1K 5|v=&E 6أKAܐLA2iRpnIsOAe`%/{#)k@]f!`>t~O8L1$Gҝd1EiH%䈠)?McXML҃ƴզJ]Nԣ#&tޔ:=#~gn{sf2I) |j&Q9H̤1L?6)r96<MDA8AHc/m4L5񆧻j-[^XgVkF%L?%,^'\7u0BpH4A#fYɩv%9=.bw}6֡!!䖁"[>Tr84p=݀ⓏIw3/a$V@ZѮ,u׮b } IᮔWjƫ"@o^/F̓,A0m7 eп)rǥ?8}L ])jV- 06Q/ "X{2r։G!10kT',"m_ndҡڙoI‰<%gr 4$?f?]Ƹk;p 6mV5Qoxȵ؋D=J6QH݀^J%ѽy~_w-Iƶn E<ݲvT]y*j6&pF:[vѐl5% L$B4ԀF+9V<'30 zQ2 r&]row%ӏ֮dxTӴ! 0 A10Ճu0e G15˭?E[$%ډ*<'I4ځi{<]q <iV,}YTI.EKHD`b%tZj5ݫƿPӴ"k7-.P7DyC&HOO@'W}@ duhFp6J 2t0ЃT`7*xcj(f.ܒAP0 @һ*$XX(8PsMz!YXq`[H5 xNNVJQ0VG:9ⴲR H]Q+ɧeI$dCdvK>@"Qwg##RG659=WkImBfg&F x%-Ȣ 96Q/%^NNg eLNȆ8_Lxd%A]րJFP{4PEᴺt%%B4?WQHW._d3dXQC[˻46*\G\LϼFZu2Q:WOXiE3`F1~oEюZیMƖZbєloz_ 9kkV]3u !}66 x Ndhr\vuJ m ,{瓌rhn4 :AhD/ڴkQ H!m$ZDϰERyJ_joBZ7Hg;$r6"\*ȉԭHĔ5z9"bRfyblIhIl NI8 $NᲣc%;kʶr?WfUOcaDN% fP agar% Jaef]Ϲ?N]0Z=)BXH;IYكjr3=K*'rC Id#_Tb2/~ֈqP$G*Pv+$zbn^\l)Kʈ00 Om7* ݩ yDSm4I4!aRs6>倎?+IDNm̃1!q}jcW1a^Q -ql$n%>QܻFUR 1 Ρm=ю+w[*[-G5Ҽ$' `yNifa=W4c9\B-nC@/"e N9ȹyrs 9"}R>/bm\J\X}Oqn#gܿ\ô';ەTerb{չG[cgL^sm.7Ή oNtEߚ'5I:`6Sdq't GL{mŽe Rc ?/qn4$](Ke9jJGe^ktQۻ$>ww|cwֶѥ׎'3ۥ[͛S*+WO|==+ P^P:¥.LT48G[sUN2Wե93CIh=Lr/_9j`0P01{ ^\+/\qfا1ҁNx"zgG >ٺ)A,́mRĝ9^J:?3 ̞n1phS8 q1Օ?m~p5MH@II/P"N'ArQB=:1<xTbx'o"o*n:+ɱiYhtJٞW+" sJf\8 0-]W]EPwkųڊټv{]Mm Y7nJ˃Kx~W;Uw_]B9y1z m|WM%JUZ m9UOdk :ezn+7~k_?>Wkm{t2 1Os`*`{]0OA##OcfB$Y. p̥ {# ,.r" }8Gd۷/&&8ma_? wh,Uە1:J+*[ X+AvS`.5eȖ*[œ Make Outputsource.build_outputxڅQ 0lɓ~\!}XM*i~&%sٙd}oLsY2Lyc>Bhj;z=gRs)QX)Nɳvw ~L6´@w! }|ȣ%JP6+̈́K*cFYXf .Xpʛ!InERey0 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]z8w!0ܐpd`?8dJ9 19V>$Kd$QRWw-.di󽵖(\{XK@7FhvyQmiqrZ, 9#D{RN~/S` Z\kvJJbNKIZgOY)SDz.ߤH{^+r|tmeǏ3W滠΃xQ:eul+T;vҴ2 ne;nnF0xsGsW{<oj<o u7w1M"8S F5e;Nq %YOI$A zkvlڮ@x~aU[9x_B9B2[v!QkkDlɅ&fqgPeoBPU<14z[M;STγޘ9ת!$߸&4N@d3@ʡ .˔>D?G,HـlctuQC @(k{;~Ю0ڑ0vfxJۇ+Z4pH5SS _N/Mq,hg(ӆDPJļ[3r˰^i.px欦 1܈eV@?D9F)%.U9yɢJj*p0˖!7̒&pr d6UXQ-Nfj #=3ŬĠPCo3l@NW`(b昫¼`bcU%)RwRBعkƚiX55Ʃ"lH)oh+L Y^gw@jP) ntHJ}vIe&ك;5sb#GOK ;޺߱.yAG/S:{ɮ'#~H6τ_]OG#j9>CP)V9r(sF9k? }?ug7}n!>n_?;^ۍӤ?8Luh,5ΚL>#fZwmTYOp}0Zr W_\ 3ppk W=U#lhxPV Q;,v3׸>u(m}qZC5NcbC lx#vq]Ё:Tޫ''%'JI Xɾ<'e|ItD5Ca\@i%[Fϛ gh1ah^$rK:\(S{SSt>+e{-˨諳FaI.K9I6d?ˊe[Eߒt0O5udц¤v̱fJVݰj9{2m:Z[Kr%a5t% iAښnŏ&rA-tRl=f^k= ol3&jJO*Ѵ0XBH FB&CB ɣ (B75Qb򚿔88BPiWn?_a8XyH(&k ]a~WXiw0_~ l.z3NTBIR - :8o Jw eTUzoq_ .fX""EOHu&Ir(Sչڊjo%%ˊ'>2V ,m@wiiwjVė@SDX'fW,ҏz6OpWܾ'U9dby<^9RQ- _<,y cؚctx0 gVnkR W>YT"8KQr &p{+Ι-t{S\5>5mTǐ^^)f-cГ85G |Н'QjlloFLk:.A0Dܡ9K m/RmÑ$'T1pCVުjZv[*̯0 +nKWp_bq]~W_v1']~WXiwQ?{w IN&4})IOȾ 60G tlqZͬx?ן]e_*~E[ljZBk֬c~xqK }#6kXNH?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 )3-x}{#u'/#K%[u!@ch$Q3CMdV,[Ď 41$5I'ƹ'EĹo>/٪B_ CRnr9:uίfzn vmuwyŒκBf]YbQv0q&Vk4>y{_aVV _uf}0%ӅY_YbVI<fa}(;g}.;y.usw8m5-nIkWinٷ~` v|+z:9ۡI8-. Baq79ՓFVp9L}6'C?~I3ݭվPFҠxtKѷ7;W-#13kioKjٽcLsQf.߷;ؽ=~@_q;JIc/·*4$IDAm 54=g FCۧ~$A%g`,"xNshNY|}<%ߘ,|R4V?F_JBJR/ג<[T7s ?N VX.ZfLV1aLΤ 3VDUi!3otl% 3 D#d?Wۅd/$1c+"(%bơ1!o'fer>k$~((H`?\Js2*ȧ7GZlVjtpojq mJ9j3L'ɑ?0swij}l^niLsB|n]7޿h֨Kf5uY#pF! E&͌r/h]ޢ8^#d+ TVņG`rr\b/gE#dFs]}si_.m >|SkZgIkmE-5 ڶղ~-O(vGkikkޖ)NFJQA?u$4۫"Cw4/_PfZ϶@ v.v`5P>YT/eR2HU4yR)Fo{C:]R Ez,3fЈIu-wOsG=$"`|ƍSm*)XԮz ˆ]_HSs3D:P< >%xd>Kp.5nT/#;zNŬr)] *ztL'B^湴қ)_Sf2?He3R/!>?53͞Aϋv^<բa; +zvK9IYJ`䶃E]4w\hgһ,x`&b|$U|_Lcf^[n,~}zsIO&9.k[Gul",qEFLLyYP`7 1O]r ,g$3Y}NdAY跏/4'57Ӭ]%xj& !Qd VL455:vD29)\u 3 jmoڤmsOI h]Gm-w9%=GաOndsJbvNixFSp&k "V>Y~ Dy0U;&xfSd(3)JIiڡhYĢ|Ԛd[rHa)J:fɄ7!3Hʴ$9O aȉ|$o`n>,AɖU\4.1?coHl~0kɇ᙭&n>ZrGU:{.y@MUw6G۝PMl`3izX)V7ƦfR>2-;o;SAfn6mƒpg\ HF8d:2LT|8Rr0SN% ®{-,b̙uQwg=#JکEOѥ<Gt\A6 ָ ¸ʍJlLwI 8-$kVz.{T9Xq)r8?&yබU0X`-ޯܔܵmu>oEݔci߼8mB<Śz`HqVLFHZh^˸AoӬNljo`]rn#[]y<|PcPFBwᝀe5`?(1SN0Q9pNheQmY3\5]3Ѕ HwYdO+13\5q6-hkGJN^@-@ӯO/ɇÌ\r8&_"QI{"! =&7*agѴӒɳL<Κ؆ob;!N }rbdCuVH>?^޲z (bs =}u7 UYm"$sRXUZLiᔛ0_ g2>,H0TrGr쑉BjxnX#rꍣ<| 1I*(ݮyxr  Jx/+BWjM!єI┹Ig~S[^sU * **F+hRKtjW&FaT5  ˜T@@seeyqw9B z\7_PyV#c(?p\m )J9L0³Y(O3, pBBRmVk4z-; VXP9gkBh7%S 8*O1%3)umnػJ7фqx9O$LB=C1`7;/7.+8G5GN);X_@>l tv5z{S+!_H˖jM & f>iD55>Sݴ8rTW}u6aKeN]TJT2^ǎtiŕ:ͥT:Mk[<])I{=->/շ#&۶N{E[{F8DKcƅF.Ef|{=; ml-褵.YЊ?K*WДʬԯ7\˘7pf=\xfvIe#cc-ˏl! <-- 6uzw{av;=?8VF!vza'm|MAb|Bmy~5vgհv/ݗ JtONT -x)9!T2b$ ]VzQ!8 O?[{aQ!^`r0ԇA`* mnV‡6 ę} 3)WqσΖ8Q Z[!Of#ېBBzdJ])]gŎM;"YOݤϔ;^&2o"ͪE=KCmȁ7j6vN3a"_@~rds&YXgs&w,Ie.9. dOfbRV. oTlsJ2PyLodqQ'fBl[d~BdzɗK+ref,58h,xuM#VO*F}4S{}_7* e kc*,Zhg[, v.v`5P>3)eL =$Rp")MD 6 ms^.)| OcX7FǩF`,l嵐Q.J}B*S7z2$NbKBn(7*%Y7y-ӨdmXhA"S[!{A+wh~Z>'DNqX; N'9ωU'VĉqNsbE ljN]̉l'T= gD1Ò>چPG4T qJkl͆ԦD6p @?@?@?@bېq }ڸcW+<d/(_L%^IX2lf'p86-::::ش~~~`,klb5 xxxx, fM PPPPLco6qow. Q_Q_{'tnSnFn*/~}_J r\G86DE=F^\+w}R>=xFiHȍ)*?W""G(KxXkX#0ŌP=~ g؉K*Q`T^^޿):}AIUZ*ʄ<iaR;©j/#KWtԏo]ߨӨQ7"-*:aCw YU\cܩYgvM~cPH&=;6yzD`ܩU .s *a4u %[cko|pkh>'f7F j ~+1 KHRΎYE7z%#XL4|WƗ&Bmx2-ЙB(/D`Ǐ% 0MB,dלD@ǹ̤ \r;)W*5zyn7IMoS3}7ٵZp,ؐ $S`':d#sX s [_ݨD9q$'1 ~O&m*Έ+1d0_{>ᪿOAςִ*:*V7F!6,JW.o];٪&hή}Q)_I"8duSsv'ثVN5?YKcc[lʯf;ON&<tT%Ryj> zl#KY\?ܠ|:ɆCg܈4|$}P2~Jw2(,;"im-;\gGg`ziѓ\{9ES 񗞓5 P{F5ɚ<<SC~stHInp]Eߦ`^C0F&I6G/\}TKđ,w{dm:~Kޓz;g]:z]?$%K{;(M*Œt4 ޽ӧQT5*R\)իA6)4Nb=å|)ֳ-|}#'DYA2 ޳<0NZ-qit4:3EP#YaŶ0)\i]P^i,zK{CZQ ZuUG|)EUeN6-siHi6x< t4^^8lO'wJފᅴTe1+TGT^v/~nSPV5̛jU.jϘjGjfŬDFbo!c^U*'Kj\4AzH4N$vKoHo ߏ\DB։VQk<_:mBr[|N^]Ҿ|g:d"uNoQeqou5HڨC,>7ȱVze&3v }Zݏ;' bq2!U|!YŸSe%dNBlֹܨaH0Ϛ8Gڰ]l=VΫ+ 4&k㋉rE1 8&"6b= oǯD;x԰a;FU^<&nqOmb+][HZˋ|{3 FNwɂe2ql4Bxeގ!rOR|->'K;E%eЄ].W-6k2 ϧ,)i(9ORai.Dqr0;ȍٌUR/oaW|/9);zf2ZŔj끮A Eݬa6+ج`*VxxxJ?[ГMyo4*̡3tڡ.^??f[R0%;ǒ=ݍZ"%nEI1 l5?x~UEba~B'u yR1e߀{`VD^FcّPa$QqL2f;?H0#鿗'^F36#/2&d~FzQx9rҎd*13^b*Lj-.^40}T^n6jmi+W!ԍWU ?((:}G^0B#p"’԰'"8OYm)v=/ۉF/Ny,%OS|>jlŒ*|NK3,KY9'|㾫B%()(VK|$^h*s -0` L@<@<@6K=Qqy5 uM_H2גh?Am}_7QEr4/_Pex v.v`5(jF fQ̓RIxHER<)MWFV.)|LK"3"!S{1rC`HqN%,n7ǔ6ȚP#OMV\-Æ;>l+\JhD`# 7vwjjAgDmJ&-X`тE ,JbĒa3fY9i۴f X`٦,9999X~~~~'ŚeFld6%@@@@LZ@?@?@?0iI$Mf#ANϻYiDfG8^n%]mT /05bttth^RPPPlZi=M /5 /I &-~~~`Ҟԗ0zI}oG!csCQ0^]ZT 8p9b5qTUOQPn8459DgGn`MFcMĜ=:LJNdt> ٞVHXtVPN_)6u% \J l:d 0`gU%UmPf͍U+z6j~#4v`B+f/\Y?XPxQlG28Wo2>jHx] műd۞2V}jhf4Ia> n˗Esuvh _C_Hz(rZC5 D3aRQ7jdoY 춳崉ED]k7h(bNUkUs VjN#58D`JzKjWIjRKoX &EW! *"|~8HXzA`/DO|K$6{1'☧Um]jW5·q\\nc;g$lCU ÕIr) 82k{(/;ިjۋbۋ"bn`@6bcTp,a!4 ċWAY27뛍F w]geno! -Z,s!3xg|L Y7ZfKɦ0!%"Ӧ*!wRocI ag*4KW XJWpktM jao!nEOo-fJD>|hi)ąbW[njOQNI릤TPs%ުFZu͙Ůg2>G٤9ebۏ}>H}_IE2l؞ۋ@>6G+n0NX\w;GEڎM+@ y'Ovl%{1EKl9۸ #U,9*w*:;:ͳR";c+)a&*q?鏉Ad8 6l`6l`'x000,ZhSTTTlZ@?@?@?ib©O`O`I &-'ԧ 3ԑ ]Ŭ4" $/]mT /05bttth^RPPPlZi=M /5 /I &-~~~`Ҟԗ0zI}oG!cspN5Etؔ7 u pG߳͠ݖ^AXƎtS"Qڿ+~NIX͵B"s/p<Ͷ[ Xݙ |JLûKNzˤd>kΤE5Fq封YCؚImlPk =q|3Yu/=W F“rR*+ַ̼ ӤB?YaN5%_RmF5hc05nW弨25 4dZH;F(q.{O1x4۫4:c*,TӶWHC̓RIC"W-IiJ뷽d 5)|qdHfphU{&[h"`|lES}Ԧ_ MultiMarkdown text.html.markdown.multimarkdown(?i)^format:\s*complete\s*$header((?=[A-Za-z0-9])[\w -]+)(:)0xڝN0 sPc\?_m.h YƗMEZ /!qw|>K%W%*IO뉹1r[okp =B Tm:8Of) /ޤI1"}tSⷆQo ZE=iM ;'6#+й|`F>"Z!ax9jrr|M Xel'ݾN#?Kwynsx꼭z-R+2T!WUb5Y# #sk~&MATLABmatlab source.matlabid [A-Za-z_]\w*axս[$Ǖ&sgvv8n]9$, Y4EhYd[3:Vqɬ d^%ӓ%~Lzѣ}q̪rf8==")5өv0視oK$=8CnK/Gȉ[>áֵ߽$ ۷#]7MwnG.y\߽*˰.0J{߻u)nn\m߿4ۤH&Z͌6h ,k;7 eRI;5ro kW[TwZ?p>v< :Gn>to8&6E}?:zm}T]S\q,( zo ՍۖO:{G? :#RX_SQgp#m.¢6g)g6Z^Zo=hwY~WoNw|֗(N!8h ^gRVWwN;ʾOqY.ta=Yst.wnn^o{绯b<|ү &VJڳz蛡?dj9ۣyzr6w箷_>Zn;즦=hiܘZ{f܉fWpg _`t,LZ Л_F!grjX̞_jy-5ٍ 'ˮer%j<}M6stƹhx.("*0yzs -g'$gG%9[cY|!/+rC %%k~,G wO~>Fn'ǃ2L Z߂t}OPt۵QaA*. 01 U۷}O'-?9=[oϟZ]l][0g4(dG%gzᇟy!{ Oe/c$A/OqKk}oITb^һ}vI znz2}rPn7r<  !ĆyDOI _w(bkϝY>bly`|F1HyW7;x~O:OD gy;yB%\^2ϛt$t@$s`31Rn*)4eO>Gۃ{@ly3?A~^u7|ܼEf\lҗn/1~^t)VSrsz:/t۳?1^ioKK-k7٘1E+/4|wr=IۀniZ@*0i=3!}) ҞTϾfY?IZgd$ALژ$#s6DE;rH Y9VYi<4KIYo@\GtsuG]oGm]eG[tf߱#c u4!\?:"dnCjfߌQ!ztlI2&)W1w!@.G&:6Xom5 ޮa݌.v?wXӜݾ͓9!_fEWC^qu p1Z' B[8FE?5o:hQ   _4L.b|7RPa Fc8r\ho15'x0Ë!g -m C'$ij@ pp-kLՈAWQC- G,ߏ%.[C iCw̍1*&^t\'E8Z`\ט#&G5$&cQGh#uYm ?pkO/D[A# -AOAA xpA/pg[6IjB+(:F.:99ţM=p 4#$낡USR >k^M3lt`Q?`Mtk >YHWvIitU@] Iol1{nOMMwnS 2O_ж~ " S^b]׼(7K+2rD[] TP% tYà>t `Iv0w}K^EIe1,0bdtpۼ D@"ag˞5B A!]&QJWm !Kf\r¡jmXI̥HQP % zKg;R=bBx\:,3-:C}~Ĵ *0+#^`wbmbTyi8ƥ"ƻYc l*)"]r K^gص)ˆ%.dA0Q BEq^ _@Đi\h)C^%m=fVy,jaWwʖlꚵ+bNȣ Cn JVLMRS Gz䋌ɋaQ8r㔛V,P&ZXb(ytbt݅IU;fERCdK"LsSPO4XjQ^Kvvo|(s^xE눕/Ւ RYdK?0ߢ]C؈ 8(⮤!ׂQ0#P-|'Z[:XǶKWQֶ\Jh!]'8rUѢ5E;N4.F ZT."l HHZ]CJǢ$<]U$:,4) B*!D2l Kzªu_5+UymJ<~ޗ\1("#R-1iVK-} 2WܸDHi 7YF t9T;lxbq+"&[jjl\lXZ|@U=GDeC:lr*vF$;",P@uM 9ĕ6Le [J2vyI HuuZfHDj#θ!֦츼{lYKמ0YmtCWi",q ,&nޑ^8_>F 0vX bky{kbDX`]'܈a+fƈ'!V|f #Z|Gosl$3EJ s8tڣ܏X>cB9xD7jEv &"Ph4rDy^KE 3XXI{KѮ2rL2o-ǿ^HWTK~5Y*L6u&q?\_(4ƣPi,l0 "16Gayͱ XriV=Jc9TUf P9\[Um6cE@ $IW>%&X -YTc`2"PZR)9xU}ya)1P;0:by&hiiQۭ^#j8 mb껫M-.܏NKU՝0aHS O}Cзxao*|A=ow_:ٴQG)N}v曾W7}䰉)n݆r@_SA^Fy>C.bFTD/4܃aG31mC0X+ҰN؞BZF8PF\voJA ]; M[ vSPSe)SG&[d!qfo+Ȇ [5 .z=ݰv-v-(Y^Z~^RrelD êD)+F~ ˓zex,'yOٓ o:,^` iEObK4@ЃDh-\">ﵶX`kD @h$j]h O[ATÙ!(McōxfW.x!y%ҁ?=M+VO[! h\ Âk, Bk(_i[PBJ[6>==reo)ܭetu 8v5֖G,ZoHo7Gϩ.X` ;FKz3j~dڱ#8aѠH,F$e h͎rJrĕa3GT*o<{6l›qμ7M?z@I+0 Q&V".2ʱծcz}'PAD|Lf&r+7P>!y|3`|6ӄiƀtkP2詴$1aq!xFvB4k ;} m <2"oH`g +5zȡ=IxK3t#$oBPP@c{)v$$z4{,rӄ$!Uw9XC1B=g>_^ưpPPHYׁ]_#e\7@ \b`Ct/#]ckq<[t1VRxm\# U(ta\TYTLT6=#RC$0t>pzUCV ѡQR^BK^T "u 6OBPuv}d6j 5 @=>H#]UT6HqE.y)f '~Mv*T'фUnQM4JZT|`Z= vmh`eDm\0ᮨq+S <" Ya!rɰKs2t#)ty40 bv@|v+!@ܢ0HM*(qv֖ʡc\gFP-Ygڴ3u&9 $n?Zu]cdtdWGgE'ne:nMJu4 Ǡ0j LzѦf&TB3>E4wHKl|5S}l=m nݩ:=YV@R&,]уxT xnf6X!K˩Jz^ qu,8 YiDؕf1i ,O6$̰#(o0| =|)Nڲ&uAjs<6^@Gvgr2G\zdʩ f`7ԍFY#jmu$%ARr<mحiSM uMTȾiMn[CH}9k-^V֔~UUYP8N"4.Qp> rZ'SA#d'db>x)J0u!v灸l0{/4 2J8źe=n cʗd巾A4^B: e&Md+~=);(gVfԑ<B%X|W?J'ꋆP W!b :0Pk0adiKôMڏf$nZ\&fDјLH83 u-V@{ᨃ y uD"`!uXܹn %=u!/=p:{E&)$`0]OJ|=Wd̗K;<RMI_J n4OI4%LEmcX2aK)j^Mh~o.;_Fet 7 Aʍ|J3nt!z G a\^yZ@9Ywa/,;_벚 ]M 7˄=nU߁ׂzk4GEQ]v~t. 5^6.KmT!=LhGD˱g[W> 1{Wv>8v1yc,MscR'uSuxTGZҌRb9J6!ZT-OܧX9MDR=U*NiWsr ~PSn\("415F Xe ,ya}A`~ mcUyM@̒NpAҸ* a!g|%l#m (HBZH $U]o{=`sCKlcʒoBz1#tQ=\^-ȼ4va#fBS)!0&TiKVMUA@vI645tLb e!Kr9D`恻hדUv޲@]fAn TWv0(fø+u|fK!4)( &"QQqHih!N=Ɍf/OIê( [Ny?rtJUǒ}O0jW, E qam*(E `eלcź{-l'T}龊{馺}Is*pƮ g١XFFxB!_~~TBh$ux49F`qB"G N ))81L 2]P^pQXOl]h9C,<= DNC58Ox9nb{KM]$:lŚϡ8(uE:.K #`ˡ glL \EJփ{q0TaZumS]jϠ'u;أc8օj1hc?>B%pixZ+uX "jp"cq .1/c" 2U#C<Mk2D6vNφD܏ngXRNv6x4QnĘX&ɵx S)bHtGGRJp7r xʼWC l4 u\81 HA&S5O&3%dz4bHLTgSVGX2MLbI4Z3\aq^A_DhM2'͝x06_n, m9P v1 .>)ΝEPOp2~4Xm3sfҵ )}%Z^4bh@5[Mq"jI ;;tr\4YpHcCXB!b*Π"JH{=PIB nF}չ~iqh? O潰~{, W4šl-xR;N| AC92 ZtC%(sO1wXNdWG(ӣYl&W "g9vAdpѕHouN8u-9h Xn8tԭ64(#QtmB6 xzsryمqD]SN.2/:Hcպ˶ډl2k*_}_}a>KȚ4Y3p; s<:")Y}a H"ȠqN]+KtcsiaAK?.ʏDtAi2 d{v]è~څMo܉%Nn>M/=Z̹Ne#W@ha7-OV^'mԏ :w:W7Ґ j_9̌gSj %#ߙ`-#/U(r%Ehj49ٛgfIi21)S dq1g@M>yJO6eϧ$4pKS=D)C/y񹔿rZdd'MsljJ賖5"l2p9Tߣ>=RF5R,$9!‚`ތQ>rJ۟͘C3ި蠟.9kpz4Z\tx-/< <:8|B939Rs"8.I~ˌ><➇x~9wN/(g t4Kxzhoz2{^WjJ1Vxد:ZD]WIDŽ*)eʵ3 G75AVr,< m,y{nb?v: ?i8V6[yݚfK7Mk㨑Sj5mĎnpo7RSw)sJlۼ3A9":8Hh!v(0mr,ΏA6$(:w1[6k"69Jr%ef#2ՈL5ӭ&;;+"2E#4>iKRj"o }x2 St R1/ҾD`w6[h+'VЄ^ DrXrXj'"gD4ЀPwVV-|AE%XcVN, -&:Hkώ+!rux=|GuYKHnX;+98]qr Duʯ @Q/M7j*z~"Œ#!f]LG)KvP:R.Vrmп=|P. PdдWi;S5 HoZnlv`L" a3sx`F]{Bm6B;]#e涄 /"[dokguj"<2W҅ +D4yܿ 7xNrD BD6 cJcPE]}s_ɶ3})q,%ByU_g"nwD u77N7ܑ 0/QKXU2 E*h)0|Bzk[Ô&TSaHdZ%+1X n'Bz Γ\6@!Ns;Y_m0ugе[JFKR>J>:W>pZ|< q./LbU'JBL=OZ%RBB 9{Y CDaq<WnK,:ک|wjΚ<}f'CJ+tu; !d9Y{VzcJ ~wλƻ ]]}W>>>F봭/W?mH GףѾ;mV)Ί9YQ꾒>QGiocD$4$r$$Ҩ1Q1 tC 36~X6dž}kט6 ұp@W̔`L Ʒr(8o~y8 \݊5{ȘfL^4&tp7Oc={K>rF&ÜӛA&!3Ȼ)o@t˧5oȧ}5&s")CŻޗ7~巻5V@&ՓO兂0⑬`]qdw9bg7p,2h~ }tj3"A/C<&ŢptJ4cK;YҵѣN;, (Tt" ެÝ2IrthY93Qc/[Bs$nٝv.8I7_\ѽw}Od7!p'Ǚ/h[9 k!Pw!ߜQAxH0܁33#q%Is*&}/;. 0L7iPi3EQ|MnļW˘9s&ea0h δ."M..|0Y.e,#Ԍ'AGM,kkN䦰MלyttPg.3LE0U>- H.FkѥBdOmb:[ZԍJ㈳KGjo!: YYv+$w[fj!z*jciΫt+SO5wz>f߭mc*]2*'j>w ދB osGwDduIOuSR>K<}ؓ<7YۼV\cw"9߻\#O(2*4ύg}̑e/p腈ɥ՟@# !*k^:gjK$S/V* h .x(; \&ޫ=rOL&?LBw3UsSlmP,䖙Di[:r8y*\V,l >`DFe^˱hf敎0gSƇu/EưW$O)F;-q51W_ddLֹϕ7nC"6DBTXB;ԒaزC hri> PƊEߌmty(CAWoR$Pz/\KBPg]+R4+] y*#&MRnPC5{kUPC%x;b 59%p=L<) N:R~ Xk,֡>ΨԜܧ|$+G;J1pX-bX٪q.mx vjm5ok@8 ƅ0Ty4S3x)H;&tb'k9Vx-1y.stLh[vU050C\Ϛqt>4gԘ5EVeϨ KZM}5 =G^r8F>wCh@:ԿwS l;WpGn+=@G̕KN&Ý{(`;(D' Dt,@tMs-bSP7ec^W܃ 'IQZ~5hbvtܢkx ~1t´bPq!f"Z}Ix| #:"z}ct7L0LQ "޾5hybxl KӇ"z $M032W '?cmw{`ID ӓjg<*Pf{S*u]"Щ;4`^-6Ε{̈uQOd6EMa =7sVUF)Ib)aj%Ĝe3u6r::`2y_c+-?;)#\[(u3%;2E4c!!+<΃Z- ٺXRHV.NF{lחZs w/14~TO2ЩEXJܳӶt-_Ɯo粆jrUW T6s>W|iSΫ2BE31vB27qbWN$PLGҭh!r-e)V ij\4+tLZՁ+# iM+1}A 1~Z%Tc䤙`æUlW{FMCU q(2K^DJh*,4(osMڒ"ғHJ]5ʼnsRvOXm iAiC 6(Į-H#O6!36%hPZndP!U2n2&tE t*aL|(.Ê,+K]9i1pc;nGuƺ{#b; 杼Bp}Bj614l r$pspϲ{F`YB>RV@Q=Dx&~ CkG,5eBDVyMx T%+~yEcd&&^?cL;j_nͱX0"V%@ا$LA?gk$̿*׌]מ:jgzYA,w~&Wla%MA DTӧ-X+hB6!TfusYdXn]4Fh1l E*ZUJΚbb*&tKg!n)`H#7 p8eD$5Nn0<Ԣ:1TɓhE # ({hҌT$P+Kn VV6w@ I,罝b,.WiJCk1„E)ϬJI\ФPR~"{ü@eDog9 xۍ?ԞÇu}χ$9(Ǎ|HG)DcN,W? |GrXz@,ve[Ӡ$'fye`عj{@l-FN݄(5lɹ]ƇdEФ{.yp3K8}Y = >Ij{5 sGl4 [ojnFѻNxte>v2}a~9aJ/j@ Zڸ ےƶe"J3OP_o%`꾏$b(*׳ԋTdv- DuCw[w̘F-{oE2C[宏m<?[tp#~eE_9[EawLN٬wZ쇑n 7ߑ7DzgUq@fwlLcv.h9-Ǐᰦ<*mW{[Y.\庤AewuAߦs\۴+z {}"\oCӁ}_ۆ~||PIV*V?5yq V o4/Rhn wFR1>;ALǫ%i"R>5gW|,Sz0Ε)i nR)pU|Tz\3[I[$94Eڗ:dS2_bZfnd'MQEsvҀlB "йh 2P\C= fG#H!B0͢ s%}c|;>蛝}@0lw8 aPT`:'Jm ~QbĚ .,liT)VY jg>i^ HؤNP׮6UcIb;>4.l|ϲV,+> ]A \ז}: xyhJρ6L HlUUٻ #KZb ޘP* ziUlFEm$!xJE~sXUiUQ#209c V(:_$i\8GyTA6r@# ]uN&${$ ,\*َ Jıf ³DhC "W:9T&ߴf<݉lI<3Vs]Ǥ<~dN]Z,d)XDbggτd<H{A_\x4NeϹV/NfwT9/p[sDSGU}핼;t 5HsеP3BM1g:3BJRSs* q~kFb~z (EmՑIYPI=uY, a9BtUiq'XJdv:FbXWkhibWd#t58T&B]/hWy(+A?guԞ촋d#}怴;/43HS$j:-UEDLʼn$DliV#k3"1L}M~XhVn7%9+s yy !sdό>9?37P>e6~S*Q&t_0ͣ iK):|jWvJvQw)I{-çC|7q:%M|(ӧU9A&z"rd$Ӕ]˂AAy\}\ "V0S'Dȥf75C(KVZ5v;sGDC`^fhp2N?ZY+ޠ^sFOi/VmzΡv|"E..ʸQYq |0 "2C\A9f() 3s' }Rg}`N$Lj1`6`Y.W7e"OPXg@f硣@ƺáӷСbOxެc:Gƈm!NjjʃXEG[?c5fz@cJm~G`'1]+j|_ jU:[?3D>kg: A ܦIϋ=C10$Uls) bF Ҋ N,u5 :,w"1x {w%aֹ#!hJ?|A264d+^X#T: Qd,g*P(0-'qj+FaQB0N$tΕA2HM@ƤC<+i&uQE_v}uP¢gز&Fj?wam6+ IAWR^]5"f1wtE`mCt@iOa8 dO\@ EVJ)^;`@!`rPF>\%}tD݃PKI lzgis Y+FٜILr8_js21!9L8%^H<+UWYE&y^M[<:vWd.<CUǖ~V4[Ljrȶ;i,FZI)*OIjve]= Kz")y` T96)M f@e-LӘ)HC VR-P6m#7WJv=H@/m״ F4pc gMmmRq@7* !$t(#`EȐVU4L!#ަUC:Wqz3lG'iJn3\ZJu:~<6plnqu7|H`mUw _`O[7gVGh#"/W%nB XՀ.=a9va[J"(-h!+0I:8H*"|!_B[6_BYvǮ|Ǯ`̂rF-`M[X{\g O;T551mifzAn͈kC'bAhUk8Ւ8l"7LM: qgwÕnգJp."c.UZ\x}C_t8꬛]k&ykk&hL}!Uk 2O\1 -\a+E7֬f@?l(͚bn-fEHH^!d 5k3#V8sΐ{qaJv ϖNo,ޮE:TYn_`MSw 6gim?DF?kitӧ~ 쬴Ǥqs@OgZPރ@5UȏOBsih+SZa"CYU^wX?.C! ^1sD 2=+\Y}z;^ E+[Jn5LʤV&2ũBy텨}_T.t5 Rr*$6@#{V"73ԸSJ TzӈG˕eNXV-iiOz`)Մ*%:⦫?mɃw|'eV\@cn:Si5;ּ~j"lBToNpoCbigZcfhl 1S h&( )Xэ:^WB \W2~X0K$4G]zP̼(_͕OS1+M>KbD"Tz e\喢0'j&*@|p :q`k>r>j8-yB;+i6dJYe ǑٵU:gfC;@qG͓%nqdA%[{% [ݑli4mPj{@=֝QI@ De!y*햌$/(ԕ!IAJEby|Rpv>QےӡȧU ׵5k0k/k.k- ?FDXЇKF # Baڅ$UtqD DF;QL1bTuH)л$$eaQ}ȓfPL(Qz cS8L 0"}Mwa.dFu(ba#h F@T޼3ER$D\5\kk\@}pn#PumjKα9-t.h &40 kA2P|}PYKbҳGE1w!XCs  i3!KV&dä"BJDw&Pw67xٖtcՍ'1+-f`m,Kːw Mƭw۽ \eϏ77^?gp~ HFs/Md춱%B6C;8:k<ms6 gi|`bfW|Vdad yr,Edc$$j/yᾡҩ964rt"]^8Jpgځdwsk =>tw53Xop &ZlExz`L;G܂ 0;ض݂_We{m"q}V;aܶ3AMO-궥aBlǞKE jgcݚAr<*W;nj݈C 3ڑSeEhlC#r} 4a q0c=DxtgC9!oC-4]ɳ1"FM2/@.A=Hie kQ?wpN%8Nu &xp'W;?3=yVcQ,Y NV_ֽ7p9HC" M8s`k7;_=?{<'_}$yǯ=֗㟞'_9w9@+wow߽1~g/yx>^:>_pk3O zph ~f1mkKݪɳG8v; yvw1Bn"z!r/W׾g{؁ Zx9}Ͽt%~el_>@SS4f$c!5/֖rF;,[O|s;on׀Moo[w4S/!:;"FԘoka_>Q[N{V+{oqvTB!?ĬL=ș޶n?sKgM7o䁯Ѓ@(+[}>?ď[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<ْܸ}<gF9FR&DJH65en-F}}#  X}tD_$22 t򯏊ߛ~~GK'(L8SO(?&~0kz=% t] ~ 75@O(5@R5@Ow%JU@JzzN>K@L*jT>ccaLø1 = zz]&O, Ҙ3 d<g~6OV3x& | ^9,K]N88ñiKʘýF7id2272%62M12u Lm SӧmiF?^Η2ԑ4]sWϣ$9q@DGVHZG>0~K >F_p(iN9\Ro%GS$R+Ͽh`RϋߝILw,dO% - l, ,tI"x#]q2r!躨r0JFNf 屹,)p%l[.5Iq2HXY'}9󏏜O7Faf;7%TIM?wȟRWy>AK[B{@Y+ A[+2C#ǽձYwmO6oi GdL4,XSawRenOE'C^!W%HG28}i#$k A+\k%*u:I3J1cUa*鐗^*p,lۂ@vdVeA)FxdHak)PQMVXVfJif%Zp#+1$u$%$|GCbxC(ͫM&m |; RB>g] iD |We72:~+Kq5B|dycʏl_̸7*_X.olHzF/\9׻6pMSϖTc;u:8xC"n)f|'QwCTDRvHͺF >pU `-+L65molJH# Qf^PuKLnT+^t r0ţMp#,>HtM*,N!&09{2Iv:͡ 0 RU-kgӍz) 4 9 ]=_t5_BAM?3}d$p|w}a wͮ&6dȌ?.\2aov[eH׈b2G(_k4iWZp:Ai:Af>U ܪ ST{(8 A-Wgו|QPw0LgYD޲‚4]C|n _Oz<zu203{F%9+M*BekU|7M.?V\[=dr']p4-.@p`"JzZrlbZTk̑alkx\o07E{@sfBRIDGUT ۈZvCFr5N+C̝KKb4jc?iAwwڪᧉkY(ukT;WpKS Ҿ;?aU=n/ʭЭRoRwU1?x u "AK{ճ]c#0rېAςPLyq|E2_֦RIE;U˥T8\2)KXin E^ճ{+c ރNDurE,SnCrJLǂ)~@.p{ td?.JJDgr99Y 4ttӽ*p}Vp2 yAWcxf/t{)Tav%G %c>遮sW8Ya]z[=Aֆy1[6;mU%jDYLcЖWQ%aqV?ěx- Pla-_+ 8؉3Eh.UhZ9~Kg kַ\c!K]zuh f=~o:ϕ{x+axoړ$TGN9݈SyH:DV$ՎE] ¤CGx!~Ґ5f4Jݗ{?n{N}4ۭ["ql1Վ ʂ먿Umv: 㠕 -ND78UH%h^8n^񞑏aXM\r(&P@vI:HR"'pE_:q,@N`|@䞥5\ A%Hxj. }YoEqa 3D&l Rr9؊9PsKoFy(7{’+c* ߩȂO De\j*Y67o&*sϼ<uJd*!!xӤQ]qGlmOy:}Bu7nĿ+G6`fkt' 4qk你qs0DZeRd5-<늽;I5?KCni& [K!u7j|RR>OCamllexmllsource.ocamllex[xڭXn6&ݥMnV ے)grY5Xf`?g:-юPtL\d#))ؔ\C?ꬮb|JX&Iœӎ|=Ĝ0(Kn1m=I. [4˔zeN@f,s 2XIK{AF7.1uqD JWLre W@^.xp.ITh"]EF ^?,GJ} JiB+CߧWAvCPUt0q2'IIKgbIr tI1DQW+F\%X iW[x[&a:iPx _Gg/ퟏc6'cb7MY0[:Ԅ˴NрYMs.u,qM^|ɋ -yB_ޒ= ϸ1>Mluԧ>8{fY )@SN*MWóܷ0SgVM5*=emD=t\Gv5 ]@owK?!Cąg :SJَOXkwثB}k&A.I<'HFas6nS-ft^CWJǬ9F{8K_պYQXrMY+EL\x3̉slxv1¤ nۿmP&z8Xjl=;x̉oL61a9rv;MWW(^jZ.]Lo PtcS:f5̟= qD7K6ܼlMxK81aQ%WAb1x 5Œto 3aUSxJWep?ÇB7t)'#:/łSPmsk5wu"jr?dU? OCamlyaccmlysource.ocamlyaccxXn6%n&Y֦iVF$R,ִY?{N@K-DO>l/'uLR V6m|ƏzTˮ) <qt;ї@[,Wǔ - v@lM![&#J(c2&>-Fkċ{A9a,F1c32N"|/&qpI+2Q*&c1 oT3`P0jBHXTX!:s?9r , `Y5BA1.AEq%o >.šO_A m#*Xiҫ-h1~c3^~8쁽0>lCP ?F0), ԄfMopqp }HK> * jڅwL_j韋QxH¹chJ$ov ͍bo#8qj20[x}Xd ao٬AunJQ(EL[lcm6ʵwٯ%gvasms-zN& @WbN j05#[з8ICu{{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=yE՝$4af73 {dQoD"$&3لt‡( *7^7}_UwUuUuc7a'lԫzի^{U'GuZ6UT\Q,t[ͩg;BR^UZFJacn%WZn XI-B(G R#+nNU땤AWqZO" b-b"B'g]dWQR>H_+κ͹b6O5Tdo5Td>[sgxsB-yRK9W= 狕c-3IFpufF=vw$dx=[JI^e P ev5U\mW\Q5-e<@-ٶL`lv$Kh#5*ziW%FwӖ?\0-t-3)`$H PxĈӖu;ImBwmpU;h4A#)44 aCb]FʌeCLjg43[ Nv 1vu#m-R͡`IrRn0ZgYr Zb UQ}z'!b=X#HA_Ma{PZMM!E ZR5R葂]G5X,F_'cy sk?Z9$G( s i1بɹ j6 o$z"cP7I3-[r W |#)i^M-Ϣ=ɞK4Z6ip.ZkA#2Hn?(!&xhػTKCG5r}4 w?* Ct}L ѨJN+U̡4YiD&瓒SA њuIía!',7Iy hoIY[QVQwn)3Vq|fwKb.QJ=HδOʇjm4&#RCZ:PQT'ހ)W)ay[Ngic._VE:(/+ɵڻ&eviљ 4uٿө`>+)ǫ DʳTՑبk[lYF2Ϥ)iKBJ-\}3Bf_^/o\}P;)࿔|voYJJ;´ڿ$iWa9bq||d@~?[/tvk| lH,h/*%x8l mҍAcO ,23hYCY~KefJ_DnI$_]Rv)?J%M GQ]ubF G H3I_٘Sl0r$Eijg7S/Qa5$7TюV&hex<(@JlߙHcw _7g DmbH:A<7`N!LCo}{tY#KQmt+ p4 pz;YΗ٫ݔ6f."nU/^'Un$7wj}>6#MkǶl7kПe a_@paК$042hmR,l׮@s>3߬G.*Ʃp{ּ{u!-ҳ_Ѝhp}a?m,YU 8,z: B ˺[g)]hHkWs u>G"`\X'_aal$k6>t/p㊄ʪ.&|b,hs\l=E)u{mې>+[|RUpw-l4LI8oqkɩ\_P  tVh{>Ff(=sӨV$\Hu]&~cǖ.v!E[ZsLtIn\ Azvzh4~ 116Vu$o;tZlyaIhͮ" hPz="K0R l;I0IRz dДӖ )Fbn]6•A%I1`:A6+ၰ[auX.j' n+@ot([x|ѓs!ET,{cd|HwnW*_zcF>%0 t|dk/zDD:\$TЀ= ڌ:ӬXtE=Z~U:(gX?dIn+Z fV@1_ PhP6(g Z|UWzŝj3~p\AoJ6 =fq-oUDNGPh・=lm/F2vE%Oڻ:Y2)'؝t?/cSr|XX%P7b!EqqQ=I҅m׋2zc; Ŷ2-~˾gRncIt府qt2^? {(sO4jd!C9jAπS$cs2tV kq{Ork{c+- j43LVO+"и=K}LΓ7f¬e"KyyhpuVmfZILi$]ZR.*v4ghntTLlyW9%IZUqXkT0$I4%iz06Vi: a3Y? X UpG!c܍a?*0ױ##CQ0Nw/_W74D^\fl{t^L:ܡ+ mS@"{?Dt"sKytY[8ѼwI49N4/*̂½JEH,ωe#zKl(˻)i}%J'KU-w. gsO:|I8)ɽqz]>й_#\ᜉ|ůBR{0^:cX k:uB~Y:>IW߳)_p{ 1M9zm3 /rC&‹Fͷx>fep4w+HhH^Qd> p 7FYBRWyJӎe&֌e~cHRUY/Lfɍa# O"lŻuti699Igu b k,VE b`IaA(AAvN= u#_툅­@ fR`:{=˅/4=|[t[-Ln&; DYـNSXۘ̀pt۫dYopT&i2lEWf˽|!x3Z,I*]IU7H=4aHO u双Xs-ē }+xb\.'Ц5A sC6C0CCҁohcC[Ѭ*j<7拍J▫9v0St!5aV]#{-2@&+{0P'4wV}N;ݰWhxtp; hwOjmק~]qBB[uߛ.BmyJ[=0^m&hC4àCcs>UAGYDl;AE)vQC\q{X$occظ +Ռ|QREDr-T>#Le/-36Om؆{EB)k=R<a{&w߆ѡ#9wGCL}1Ğ[ueЌ.5¾~l`$Im6t .U$zcةT O(Qjªt;i[%0zaZo4UވY`d^/gЛv,kL(X/7ڳ| 05p#=&ֶkRpޖ]^݁ҕy͜^PSjO NJ? ^XSݾ1(.Y*Qc~/m>O*OdzAjqVDl?"xn@ G5ZsQwZŔx2w൳o=)$)7x4 #w#^&xbɬ OMaܜs~Np=amT7&)v~ nnd@t0@c?R%eBL3W[T_"=Wxah[ҹOċH`a\%5ǎ 2A^C6Ax$`V'<)c˷"HȼӁ <)?Zz+U]7p{"ʡ_hR@zyXq1e$kYgfXF'Rnbdq{*cq6SxDxHj 7t'wpC!lcC/U$dȍkl)Rw8)j~X!z9|4 LЎ Ťj2wkH9pzKw+׫xtK!A:oS{41oX+HCr5S]Ue!߿~xioܡgγNZlк!p:$(+giN30;°Pe}|1 \/BN'I*ų cԷ; 3IwO5,lI5P: yFfQ{O7U _ZP󨘖wjbj)Il} K.u0@Kڥ1 Y$fa*6^֙0N%2UN\htG9͒[S!J:Nf'ӄ2TBxcqj=RY,;Ro26'<:v'Id2u I^cuL^x*Ex^|ƒ[rZ X~Fte'̖8p׀7t{ͺ՟]\>)v5_Yƛ ܇4.䯌XZF,|z rŕ2|DNb"LNFK|C3Sk¬(rb-.MFcFy Ĺ* yYd ӼRaæ{aYD&@x ˜|I8"Hc>W =%?)R9 وyHAr&~ޚh"ĸ-.DM!I3~3ǟԖX! 5LpѾOk J#&35Ul^rdUP8`Ĥ+5,zfY"F.Lº Ix՛3͡H aF~ Q-4 /waďU1 !<Ղst%#Fw฼B^bh@Y=)F_h)µrby|ِDmM,Nqv$nfMNSׯYtVLm J6x\nY0}‡FE- û|uYpS("H wSOk`QWE4107!!_r]o |9Bv#t r#/zQ\ 2F#usN3㻔ٵ]{l[b'ba,.pR2W8)/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 ˲dJA%HA^ ,w),6=C,&ȝ؎ǎs_wTUWt`)af^z{w3Y|ɽ8ݿg_6}Yl/M |e)n??_@^1J^پG3+g"Q&YlDE&+hfNWOZ;|QLJ_G8.jv ??o,ퟖ/|ns0 Yc5ʓqƳP/Mmӟ_4/OӬ d @il;m쫟lke7Z}oԶzN|*Gg}yvn_DH?\~KM}0wl#OǞkzH2+"jeAhY4G-Ud2Qlɓc(]?I\(9pF\+`طver[?.z sK=pݷјI67oOid}ˆ4z6^( "ژ[S~tl{QYm:i]~[G1euvO+$ɏˤo$ƛomx3~6$I_&O4=3X]Lgd3(g2Ng:M< 3 0h.>~m|f<"L1444 WFɴӟ_oi4*JF0=t3'dNhJ7iK <ݓsx#Nf<irIc2#M4@U lnOc~u9O-K#c$|izT1FCi/`?Lj\Ciy՞E? *1V.M("-_y cT$1܈lOڠi/۠Ug66j4=WY ̓fW7oMaO n.}t7LC<Ϻ6 ПMxj}?\xԟ͍ ôR1]F5V݈?qEHO[מxq}o=M[,ƴ>/dwUsi=56Ga!vӓ/w7c9$pg8L ]̿ ]!CW`ݽ#rILO\6AGK|wcG4{eQџQm#5ae;QqfDx𧓏4+zqs=ke3^S#;̅,+:4bU/+HsV 4ϹpUqt/5Ls(N P/_-Xg]DȁsrCٔ/rK[)%EpA "^b)V494YV4@y䍠o(jsvRwn< xi4R l8]9O; : /83&VyS/8u5%riHFKnO[twwGOg~\3o47#XԊFedv t4g^h " |za'@aL\PM:\YY/H_-LYmD3w*xB~XJE=!gΥZ0 oԂ2 ]l޸Ț`*.449p@Ρ蓣)KbzQAXK2Dɥ<;o!-dj}tMx8W+DNc]Zw 4ϫÜˤr'I &v?=S3l& ?m$*Do*1#+8%n.u;yԄiOVs"?_l\[. /EfwC٧'Ic9 #B {|j%.+^NlQ#ŮFk&&Wv}_5j6i\-pts54,و# ]VZrX!ompS+ C?n7J˷Қ)ybi٣_A@*Lzi_ꃣK⥾^S5E}l>kmCfl8~*|JiҙpO1ɝm?ZK4JR[g/LGKqyTT_ }&roje kd͑HC'~%|r9dT R/(;>y0?BJ 4iLj):O~>JѧOGq}3_j(җJ4^_\V[;js6|mZ8=!'FOW߲6Sxo/R Ak몳;W{+WյNW/?<^Bw&qikQ+7ZZ\/+;++j};KM:ze0Kbo_uYQkkYqiòZ핝B]5?qF0\l(XGT/XG80(C4$SOE*}0pJr o e ƶsXz&^̍ꚣ1Ctս wfRdLQ"A2\~%w+5WzK4:W||$^> THlK;X7QA5{5w \7_)z˜akBH3g-1u !TGf.$VbI\g=1}~6(qi{ LʴRsGAcI6>hЪנ0J :Mӛ.Ah,'gW$"#ޠ+P5}§BBԯ5 3N~~lt_| ϴ_j3 fJbaòx jLLLP4+O!ŶƏ=eB6!|Ɉ:w>DG9G/!|׏7!_=Bdp#Όgƈ޴r#J~|(p(؃DJPPGԳz%/o%J]߇gpo0&!3?\u 9{6N5o>cYh`8T;&)}9΢B*T 8B*IAcWT%8V-{$B&&b!>hm2Tu1WعV\27a'ԆB$@v2F*4ێzXPjKA"M0~A& 2WkpTX!R%Yx##vE}m\v)-> ƮnDy;X%P[{P09 Բ&U[Qf+`-Ou[2[3Aw0F$N+/p(0yJ-Tv^ NE2iHOB;̿]PdAI8kSqG2qaESv8S`cusiE֏7/zq6+g+{)X}liE9|Ft9}D5IpT1/P]D}Mp yGq/lZyVryvGg9"iy:zb_lk)M4 zffYv~7`M) qM̙x\NM)cx4ο¢\?<ӔG_܆- 3j"lX>0ՖT&[* ֊m7}ݻg|QfpѤuWzYv~ߩ)/A"V:np= #Se=+kx^FʔWfSVO3uNE6@}*D(;TLJ&X҆1''Gzc~l '2?I+³ֱF!gyb61r6b#(6>/Jd?  mܴ?~3O5xK`2 ,bC)C+@WM(`_i<q: EVطΗO͸FMv{)pwZ9,PyB%&9٩&rā7>`XjKʾZ.2rΟ XV0L(x8,PK~K/˜:32@_x)UCt 9IӢ$F7Gxer{ŹB Ң}=bS#e^a; //bx+, oT_~"8Od"&d4:?;Q2q#Mz0FJ__i}hL*psxJS2CG{6 r[w[n^CQ׹䉾Zu mǖls4#rFdwþɤ)m Hǐ܉ J 8DKYUWa=,IX;G@~D`(O*"\y/H:!N0b_X)p5(// ãg~ó-(!&&$RǩHr=]Y`dlP$ H_o鮢kv}PKyf{ZbYU(_P%DNIjX #= _AFAK>GYνvBq"H(E'pwk qΰ!hpL|aRKVDWW7l,Ny*kUS VK[~^f8W|ӎD[rgwrzezS 8e l.: qW)_OakJt&sW&4ܲ$W{bz fcXJ '=@ R.En(0v/ cfu6|33lZ)rrv 1"Mq3I) Yu6 @ a\V0]R_ȵ1kJl <+!!8ҭpa2-Ud)兀ydqxMo7t/I+'$ n[׭!A>".̌L@~cΑD!XyEKl9@c?"UG<ghԽֆ[t<"p.AB;YF ޻"JLt@7YBMñ1V g`;k}|pqPh1U k[nBy۞ rkr B[F4s eeS8Kgsg,ԩ+P eUd$oRX7B~7+¼A5P X]6/3BDc܉dFGD`Jb*Ff+{Y覱j<8Tbl*- J($aSH+rF44_K4 [IBˣ44tM(Y3XfG>P&v 18 dqݗ'O+GLD200߈Ά|")9 A tQ))bW3X^] B lJ`oopMb'QJ|a6:ngX pAaN/ ȵpB#яt؅ip鮊~ua&"C]u-K`V2[:yb'Wcc \ػ(CQN+?A*1 kSdL1Uea!F6;x6"l3-#7P;%YI3KOm.H(OH=$BK!f/YY+YXt(|y p4DZ4W@-dGd{c  3 <nXCq-G#W$U0"G 6x*fzܻ*fmM(y!]D,ylD@[-j".UBd2#,ԅ~e 4Am}AFJݱF=nj0, Ƣ"?bY _2eگ]A89"'bJB0l džZvjzYbG,avu{u–Yڎ4 ]Op3 ! )g.[ख़)YـCʝh@ cߙ`k ]&)$y$} &Qu bO>B^m9V=t y&uy$c(F +W(!Xt=x@MQv c/ 7ўd9P<r`"IkЏRBZ#YtX[nb@+-0pY2,,tľm  {uTJ 31G4^ V>uczk5,VЯ~bP4]ĝM곕mrdDr?DWK Ի$~lY␥[@dY j7 $ FN(Er?hQPM%:@-}Hl QXv~wۏ@CVT9#Xo|UEНO@^)zgM N H_HߗMĻbc./k|WP^}*tt~n\|gl*ō BؙE o}y$ paSOqkZ;d'+iS  n=KfF$.AuV&rԍ֭j_L @#hz fpa 6 +0*ȋ:8=~@tUt~ĺNŐI'${J`n).`Sx*oោJT Xq+NT^AC ==YᾺ f5QJ fX١,JWOR0IYDj"q7(*kaN~X#Qۣ4h5ceQ&#wp!%E<X v07`0g=6 u/"MmG!ضA&g@E[Jx#_%.1 4vS +@{.uGZ0PxMUlނ1A"WQy/Q'Q+;bA6 nY!3AA裐Xڷb Ϲ6a"Eڣ C BiPPEbı ́l^gwHu'Em^cKܧ[4PC@ eg5AL7-]*b3U mB^*טDiS66Tաnc},zVT}RKr^ T󃈀Zi#\Ro#!8A9ÞB3=Cm߈d\P4ij`Ocܾ}h>/ `|SޤbX 2_to!ㅗ#`D.ȋښO5- .qaL>`h9Öp&ig;F;|JP| ccP38I0c$!D@{G5% 1XZbCc.HZmBx+r?"qngaPh$`Sqvط|\BaoDq8%-լ/Y0b@Lj3`Ty3d<ܽS^aFU%_ h6&.2gT@}!܈y911K(D5-K f֊PU% oPz:NV߸l%{[9񪴳n].= #P)VP`C } 0Svcd2/ƽy+ȍɬPt 9`qݚzqc'PkdP`t0Mba@]HH@켍 \JoyKKeù΍EfP7B)o, sG@x@ ZXPb~iBsg:+ھ 3ya1)8~xwkGJm"Z m0<|mbdcm .siDp\[Hu5VtRo!&C)D(n/rc  +2u1k!s==v9&OYQM]*6 $%$#RWqE0Àn4`AxK&#ZI2K/n`* x,t:3aX}bch3#WqB|Hr8(c2>Zk(-Z"q b͐(i"{b@claKۡD쬘FhV,/<T]sQ w%E}2t`{&^C$E@zgο4$囨{7Lr)M  L%"p\@$.'*Ty8HcO tjr#Y%t[jxٻzݏU}.rE2Pq déWW7iiOQAnc'Db$G,hIJ{F&Ϙ@KMQ0բ. fF_<2j T¡`rMMYU)T6xv ;g/$҆ג EKR9 ch*Zcik_!>ɋll]јt:/Ma,7ō- VXBSb WT99o{u@{Re<-t +X)6Óp_j6tChI xҋpIX^ 3#U#!Yv4 tJƨ;re6ւ8  օNj"$*̪*Nu'8/Cu&+Bzb42JXy'ŒR;ŨGq\. o @1rE sL, B'IyKaV5}$>rsQ!냥^7V)faqQ §~2Zvid~E{)8<՞*U?2+CHNZy! ɍmx*Bɭ7tEmg;G*U$pjP jN J}ЫuKu[ўbӳ )'mLm?i3n'=Zoclo Y2AZB x YZR7`E`[k%E"JeJ/捣MDe/@YI+;Ą:ϩ ,9ٛSF,Uf fXTD ie Ti#U Y!eO1T,|AτY2C qIONxJ}t^k &7 ,BJ.P{ ^`";й=Kxh-h;a pmpA~ay6jh$ꄵ))#1;PN1\%yG-Tr`_zɆ9x%QcƄXw 0p "-ttbGR1JAi'\(@QװlALi<݅ē!|$ea'Q=kklJ0JmdhH=l.m%CQ-o@ճ۶ĀCZbv藴F0ݬT/:݌;̢p|h@h*FXg3i6ډ,f Z9:!MIcK@ 8o؋b}N,Du#d(+2$܃xJ%Xg6 ƥ(jKX(Lan Бk D!HO_)!o g)hڡpa NFYt_C3U\8P Ncn&aEHvY8_7Y-:U]s ؗ[:([L2;5uFN z"(号GpCL d-c Rrzw@*`!+O5cph&`WZ%mM s{}) AX(/um6t*<(U7$E)+}$ʟK*۰$7S?24G2Rtۅ)ђ,O7. o̓b͑ 6Bqho/XH,^v?pUkM6߫0ᖝ%!D!Qj#!0.]'QSʋתZ[>u8Ju2d)ͲѰ([%LCxL(-uh7ˍl +Knn ѯE7{T_ ;#o$&VRGi涝I:gcZK3q!PLYAb_"D)'(Z.Ⴉ+޷ l&!ֹNl" 39Q*TlƜ DH+Ko{Pݎ W{ɯ7nޠeoM+\ƕus4 S ~'H"U3RVrnDZ3#Lur K/_mH~W5᧚xbz^@SFZbN'i:06>3}``ә}`xYx1ջ<"?Mz C,A5NC"a(r**>^0[m$X0R hd#1 enJ1T*&IƼ,Or2aZˁ'0w2@8OHT*# PGTPoqXaDT :2u}YFoN^|e'Ep2ʰTR!8MZPp(tݨ T+PVlb c1sz"pA+sF7c$# +z9%u8%D6eʼx&Ktbr0]@ּ"z0Ʋ_q}at`&Abr:z$~sx=ڪariS{-[k. p _JA;MFjlU&Jq<@Aqn4'V$gD^N1,j,fRzngEop[7)Akzsܐs-{a( eemM!, GRGHBwYuPtU07gyJ p]*lJ [}XBkc@-j>*96mmDpQ)+A<8j|ғtc&]geFg+F|Q@@t]Eح.AqiOkĨ\&&D?q>@;swnNE .PebQs;RL敩ԅksZdz /$ W #uqfcYB/aaXƘ1h0dDJO=lmHTjC` X^́Aq:ªt"vB98ΆF#N{)Ȁ¢-NՌ2Ζ67A3ER!d]Y9-Bd̏7gqԒ꩜$`JUWra5HOq0SDԵٵ!jɜ 㫇(,LFœy84u1  43ΝEY:=őa`QZ Fy:Tr3蠡S\LSIvQ} GRxdV-8mS]|Dt[N/2֌0TD$-3 ͅyT$:ϐm̸Sx\B[E:%;mEBĆK+T( -3SH0Z!c BSH`4*B-0[%Z]F01Db*l"+&(VRoxV&nK,Wƾ1u1V qYZ2o'$ >*K:)k=ue)Щ&&0+=)9s ʧfn`Ii+÷i hS #XiIt>4u1tGSq?\+K}',dBTлc9)eSrBfr2tV6u\úC(uL 1^dN݀aH 5ul222ԛ| MH$*rz,( &2C N=M)P]j1<5zwzQf|r+vą !5P`0up@@0Z`y4ÂQ.DNƂiaL*+?JҮ̉G <8!C' CXBGŠF  km, JXm^=@W^J`0RM:0DjoET+Ӂ-룰d*/ M',kHD.D&*j<$ R!))0c'B\chg>{Z+i*Zp,K\Hto@PۉY1Lyo0 8v3m>1R*2x2< "V Q6W61S,I`hTbx me ,U}#(@2=51`2UHoy0@`X5UơP|5XB B#%+-J|OT/ nQ==w6F'&`H76i`wq[]b#$RB)\t7=*x7&qhNz9Acٶ#Rֱ ZS=/ ad5P9՜bRQAbǛUp7r}QV1Ufι7G%Pnښ) ʃ8>xq i-8>ażUk'ix'(7ƖP{\,czHRvt"ssE驦:C[jx19s<R k̲߳՗7?> lI[_ NeU9&I<:pۅ}za?B4 xBvE;qd&V43>ؕf&ht"F<h Ń }d0^)| C8mp<=mcPEGLa3`ȴ}<PS(_`RC #%`?i>`3G`~+xgc&8 Ⱦj8FZc8ǓA={-χxy~/DSG/7<떾*kqѪlxẜ{DsW6 훔9Ŭgijƿ/#f-ua:KnFݫW@J{G!(M 9/"3IM;п<4l+T+c%ՁrDnjL '~M?pit{SP"ՄT&*VKz o)GFxtB!F=| K޽s$vEPz`&TX_pcWϹCވ!s2Ԁ'V#70 9l ׋5yt+m p CȬxX%(SFRE/^Qj5>3sF9f:(hlfewws~BICR:zQ/~Y`7=9 R^!MLgTGjl)ɕ&פFY;3%}g?e9ew/<W6,g&}~33BDh.\>˵F %ETc*(=JV/T`B&T%P{ N3Ǧkݷ*{4X&0)MT[v9=ggfZ`,qۂk ]UoKv*\|w#XXX>KSzX\}7<=>M 3<e`6&Wߟ7\w /'uM! tCL7QmO5xf7{NO~Bo ;ՙUH;)g\-cFQQ/&8->cAnX.+t?܆5bMG10Ŵ`b9tڌbDq0:`[&#L;~<^~r[y۷s3gd{.Ĺ(ٹ|{gmo76Wv T: }Va:‚5{Z* _pF~aHX7_S! I~$0QE?-bpu!RY2;$N)v6\brrDB!%N-0=+| .+`vI>r֗:릷65Ûu%o=*GcYׯC_[ZtjmQXZWu(ƶixq G'e5$Ϩ*+ ՂXFACEMw-ak;C>Z{AC^ư *)'lyԳitnWb)JAyrF}n/B*"]YK'r17R˷ݒR.pK'*iuZG/~ÏfJ')*ߡ5]fx(\Q RYz~ٽ ^wW|ɾ0ߠ%ƳIPsSvje(u9zۍz2 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")jIjjP`"XSp@{߽ݙٝݙݰ~~_ogsPfS 62O?3?/ӝq2n4& C^2!;-eB^1!8-&'+9!aHMaM7ij1I&nΝ~bwA|g( s$1WVlc~}!\!m.U8LɃ촶ZϢF׋VyAQOS{nu\,td8gFncM69y.OFλhy2ʟXf|AN*VĦr{OlhKl8ʯ~C2 \?=-BZN i{[[A)dnIcg-76jol;c]MAOol~տ9m oeg ZIv< KғQt⇍Z vq}Db9PNeW.X~uMSΌ$:3\Li0 ʯQuITobL R0nx|?yɯQg&&ߗ_IG׈a0 b ioIзrwAsh`Mߕj^B_˿ Z~?O&U4;,7A}&近 +OΓ̗(=K-Xh)F2]0Lԯ bln?c =sx cWok^b՟֮>n=qgR3,9 [ӈ"Sc?V]Xrh oLޫ?5 .t/8s|"7㫹e,RЅWAӘ+7X٪eEMF:ucAE "A uK L;(l5յk0C,/Y A(]χC0C#Պr6W ʮ~Ƃ8M,,6_{ԃHфMK3t1W솺Ċ(m|U^4ojn ^M{Yy~_Y_1޳ uf Pͼw2`'g@h.FBnj(KEIN" |L.<ƬuZߋ&h/IAE=1 @Sh5GKKSjlq~F^`'Ǭі'k.e/t orV^>+ސvoKVR۬o{֍vZ^ZnzCnJmGoREZU,Wj4ʍu/fQlsYnBb'2Ei;w[F޻^1ikJު4 X5[P4׾^9b^ۮ촷|(CYϷJQ;WW+䅱F `[fլljԂv<׬TGX&;S V+f 5dF6čU-, @&XinzV`*Sm{ 4l\-eljרCsQn -*,'XW1Pcy ~nvv˘_a fK+5i&~qWݲ m6nRiԫU o7`;%`ٲCt|g˳V9&VejuJTC5JI")H寃PbC.4C&z8gDH X YXmj(97q9YiQjn'ayUN@7X(W91$MXLJi<0dRds鰽.]1rV[8+ YkA(i Π5 ݓ7}jU!.H kmT- \&mvÁ^O;y<*R.kP۰LReZZdل #!OSBoVPu*> wa %pLfNM xݯ ݓn lPW<`d%t;Z^խ5=L|&,6om(e͸jp:tr˵} 3'uhev*ub@ &*DXאg@U(MZ(X!XH+{7T &ąNF ~Y*?A^B&*V $(Y*ZBY m\SbkLnp_cךlݪo]{A|oَ݉g^ Prwv zmw-XҲ͔WX=>"X=ZG)fI2"U/} KиD<5JG UP~e򹇓X܆ز~[1dZjԏ>a,2l4ip\LWY@Uk,sβ~(TKU;[Mj[Ď"lT-\6[~ޠ\ N{aږ(UPkջ~XS-)ޭ4q4m3y?@. co܋G σe:2yy@M3rN ٴQkK۽60)0OY{c=Y)f. o6Xg]ЪdVv+~:5&4t1b_o(j[bnu^$+V3i` 971L#x5}]=DCXХ8Qb(yշHaD%C) Kt r2J4kpvoc=@o 9ob^1`1rLgW!+5(@l?`"ྚ7&'vrύz.Y10@k²}; jEjEz]" { ٦ks*w挷\ ˍmT? 1P._1@'jQ6I62tߐwVڣr7mlM-qh􁩓xʃ"Χ7*0 ]:?PTj(`YX'm{[ FFT뙰dJp,,Ә*iO&`'cGsㅡdj)ր)XsrqUIU@ٖ5UM K1Cf\ Jg4bTLC l}’ͻC)P۬2:K:?C/P5mi0.ʻ{: 6XplMjI7J ]-pEHnfoeGoh~ZZle4y"-KBlmK]-|wɞU뷃H"U!,rf 5 Q5|R ړ %"O-ƍ͛ܽɅhR  0~deJ 0pvphH ,V5 }+$X[2vK;zwSVwECy0劵͂l 1a&>AYZ\rb}:(倍NNp^Ci *-!k2T;@bـHXYc1Suy-%40쯑TDD-5n7lg(o*0 >Q]>AݵWE[eLٱ e['VqZk_ѢGC@T0Oo_{! ʶ>^߻۫5an.|zlvܹxPZ3YݲnV[4VLX3e"bO8Ҩ_o)Zon H{AÇ{$(d6 +;?0JRAjfCab^bcap`C76E"ӾK/gW ~uVu2 O]蔐qtdnC::ܿlUZ--Fnm36aY`.\7\[Rr 5֍bn tc 46vA"f6(79Nݝ*I# BvܪڪVd.<@;qeKA%<$B>1<@I]-n65):S -aTYE<juFxZsSfe(L:m\6 ld6Z\m$G#ⱉr. | #!!-Qjk7A#*p;< U*+* ?wY275m_B7CV"QR+ЫkP5+MU뵭RWCx9*Æ5!/{}UF`5 y)3+ߦ V^nvtS;-8:QÙW.[zyE׭i|NľS/?/\znw^T>/Y7dD%Έ+]%Mk6u{~ʒW^yQ|JZy÷*;l(17*1ݻ7@AA y}P;((oD):@\j E߃U_0?65)*cx⮫=Ir.e|Xi0@p!q%-^CL{lx77-it6Ij78 m5HSXïgG/ U p?@#-CӬc[ih)b#o_q %R$oCﵒ_Aq|xoswKllVj cBhSp )&KNx:?6A>jiv~;00jļ^dVP0qǺ3bPehʇlh'BG/˰P1@:.(Q]Mkh'(v(p`D"0f]fL jރZWàeoZw)wl]a%PNTny\l&EJm>!7XaF: @yUjaK' S49c#`j/op3hq ?+b'qd2bL#8 rެio/ nCd.t ö- f!{3wLܵfj> ʪs>ԂiEz(4ܸJ:T&(JW7қ7]ٮ{tM]Luh77`OMh-)|Q9'yĆZ-6"(cLw4- E9#6 VΉ1ثbk-C0~B^P;HEFMnz%%7h{A6+q=OO|Ŏ5ђrVHb7^D]E&!,12x4|Qqdt e DKNa `6(b]Ц-Ruَ ~ܺ$wrJwl ]W Kw5*m]hsT ^$:6$HQ t] ݪׯӕa2SlX`Q HjB`=q,WYo;jdמ[k[~#BA!sf&xmUY9䱎Rbrf/P1ˊj Y#K"RiN,\AW}Ʊڡ%j'{svɖPF`8IlZDnJw ХJ/EmRm =-4p x#!+!UU3=HvjCNm;R#B<*-'A1Y#q+J HoKz5kM>Ow`,4_#7wf1D HăW~{n.Ok[0=^ލi>"'ͺМ%%Ec-9LfU~Tb͆h 9eߦ 脆 $(m2dW'&M.RٗAVa~+l^"Sz N aM7fɽhRY<ῤ?Fļ?8C*q>S!ް0O2ڵ*IJ~-yڽ%/ϸ% ޥ1GCxw‡F:uP_Ѕ{y?Z]?Z/ZO<p/UNk;uY$4KXKCάy]zze[gl꭯glock,0B/CEǽhbF Ҭ2v0km֗gepL4ofY6©l^ZիK^|oyMlkW?v )ϯQ@`촢aS}GYO}>=D+j+IS]^M 3OFP\@735O9ְ3GrO F?>w~ϝ;m*;id`ZEY[ڲY{ˮ3բy딙鴢}e#.\~yn83Aug2}}Dz;fg}fqx YZvmYyZ]~ \-GӫGIWzSSEZN-rw.`Ք {F|Fk;h2;Y_ TO7ߒ_#,\7f-_}` %,_+YecmF$[:M0'|k(iJF#"VSZTտU']Szz3#{vitKu ʕeJeCDie:]6:y ^+}63RzQ)5-[xMot痠rWuA|5h-w˯6U[TXKܗhkI[io+Ʋ%qqj+Vgy]DҭRsQk} 9_+K<MH~Bny;5 34kPRT2xCǾѼxI7²x ,2i25fz%fo/?r^A\]6/AIe^G {Rc^XS~-_?4svIK>Nr9;_˟YL$Ӛ= gx>Kʠp > }Eh~9gw氛K1c=HlRZATglY fd L"i*۫UdlWmm5KNZ;m™:Cž7\md}YG< ~+ckݙNya7lX7gh<@Nw݋f s. O`>Z9U2*[jWe֩GeQ4!՟'EkE-콢BY<ȣ$-OٛeS3)%hSG&k"irN=С;K/a[vƙ:l:VbJ֝x6Hdpxj}g.4+}>F?#SkoF(^oy:d㉂|PvRP7=+lfFcquC_tPP+BŦ^>b/^Y+Ԋ=*H "1~8J᫃LJ&OZ*@`yԢSl7 čq39N+1|~hΦ^9Ю) wG3zaΝ>>XՅԅ<M>Fa]@ux6'WmŰ_e(p!:$vd:W4ICM!OYb83G-E7+^ ;,st>wE6MoתiMySo{V˽F?kmO@HZ01 #%$;p֜ (NU41Dv#@(`gt5IW9si-^|aL8]3 Iz*{PS*tV H )Ak6lEМMH8BkNO,A;(^ -N@d*8*8 e C0=D4bNl1m4Nס Q `Cm`*D7!wluøۮl] mƍ1f2(Ba{viޏhh:8`Tqh<ihUMz@Y됻ѨP>hMAn2$z0𪢬A77հP!hOYjҥOui2@~vf:<3L[18щe7hlmؙv&Gܟ; ߏ)zdYz!33ZeXUxGkjs& ¸h! DNunUkJ/H$X,df3n>5?yU U27/-;/.('m?p?*.|g8QH!mOvLO1SƘeC;} y+|a,l@Cс?x6 ,J!l!^m'0_[q4/|A&J^^VI =UXLȈ|be<&AL6eס,1ѸD'EG|ȸ_vD0A`XǼ(Ow4%J9L_QaY917\YC*UtA 1CǼW1 Y̦'4yۯoz{ZG-f?*e zO=)Hʳ= HnC.7+==|sZkO>湂sv::޻/qwFݢ^[:Arx♏.k|r|WQkoyAႍsb*E;kQ[.x,mC-kEJ)+ɌuŸ́? ahОPFV Ĥ`#=RؓxN  O=`9οϻ.3_ĵ-vC YB`n KH6OšpxGyΏRu ]|oqXl,~_ / +i]љ1s +E|l諭vuuXx/־NѰ Hʧ ?*[U^$KZ~#ȗd{q,5n&>J6@fcW\ G0e2a;Xzz;a^ Moc*uhÁ㫯W '?S,~rza CZf^־@qLgzINnl).^)긫|ooqy3üMJZl(ppZ1ά_-JTBW|]W %G**0Z4nxxk5Al_tw=h[_+.9wCI>r)~X2#Z $=6LE/yOsW_sDžpLzP0V?c7{SSOFSd+E[\.m:%-;9}%=d>"#K|0_xɬ=d^γȒY%|4VVev9m^=qe >W)r{TX>7?{Pb:ƿe39[.{.ҽ}:7_[]UV|Uқu z!6;̅EDžS?pjq'a'I+tzgz {Aykʯx5f|S!8xgpνOA^W,3$VT{l>fm6 :cS&Vo_;YbM{~[ls$d}S{7o]p᫬>\b}i<܋>Wڋϝ[8|<0^͘S 灚_ + T{i#)kC1尺v0YwQ/uKAt/= We$}|:/]rEpY#XG쁫o2'hF1FwpXތo[r6hu"FiBLe~*s03 6؃NLf}P=˺Ftz pXvz7%6ͅc.4>OģoVLg!~^h'-<#|3>Кtkb!Q=s;sIHC}xj_9}(by={*S?* _Cb,~/P5Rklk[_ 6O4Ϛ * 3a?5bPb<FL@{+e/&?}-zIel6I-kO1쫦s8YQg$(x4[Q'Βon\}ni㧠j_>W[P8ˆfw`{o7bSϽ`Z׎їlsYՒ59mƁ:k>q/ L5hdzH&'xp4[_hg?|d9oikhF bY݃,ҵΊF ~z1Z_^H>hʲҦ M>5ut,m",-$iWbUUh[{Mq@??KUAſ $xP Ji>`>]4O J7 2ŧR)|:{~ -IBh )Ji\0؋]0uHu!wEو Lv&FQ?ūs8WtiBN|֊YZ7y!a3C!|e1['NjRR!ZT7c%/FxsלXfъ`˹~M$=%aG͟=[=<rܒ(gMZ9oTګ sW"}aӕQwd3/%xO{t,D_ Dg}s]"W._ ewWc%߷6Lmy=G%hQnȶ|&CvsؙFrtj.(>tQA'>9)^ &aAEU%gvQL,yHɆ.h:{.crKĜSځ %`3==/;3e\F$ 'x" H]B,Ƴ4~7J2$$=_=H}p"lpFfFh:Ù|ܢt!FWxs^Ɯm|}+7IaK |A4kwQBf3; 5ƤhyLb1%aU޽vz2unI(ZH"R>JYՂ0O'iX)s@3NLhEԘlq: )n'a2œCyWBV{#Tg9|,` xS(wad4kȕy8䱴.(2#f+Mw/,"qK娕obLQwB9ގ{D&QJx}B؏~}>"9JHqI*@h v8MFBYpIaxmVKv]̐ T_ɜƲA`NxZ q[ Bvt=6;$~&W%R !NLH [mCM !|}M~؍!#\lX$_V+~ ?4L=|!jq_# +iLr'h\ma2mKg{8C_a/$aQ0?b*HD4J!DG)i&RR7p&sʰk Gzqk(X g S lMR?47P{^]ˣ@S\Cda)>hE *]h*q2]it hɌ:P +Zt2\[o30C0$I jrԱTo<-Տ$057G&X"/8D\1%9]ˎmfg&` Ay] 3/ Ǵb'74ZӋDEq $> ]nD"xp4R7J qAkN&3$nB>=- @AUm#9y)Cpe4,Ze A4ph!5p,oy1?F`;dvO X3LŒR!"Px4N..n4 >Mcτa"߃aZ`dތt/6{ĸMstNsX|v]XƤ!Mۼu 4!;&[\Ew'\f `>3A`$caqA2sD۱~ +"aaM$y@@el"NT-hD ܃@ȉrJ&`][iVAaSǪ0|1HE EMǘ~G}AwXtx1MgGӄd!c/;p Rdgȍڛ^C\ZAO2(9D4RCT'=COqK.c< -#@14œƌ1X=ǴyX3%1DZI(dj'1|Y1Z ^YdP};ti}Vv` <vsP.녓鉁OŕԔ2vpHKyFVV Zwj[KU2yB1cl*<McnRd^y0 l̹4ӤàM4hJ+=Q>UL2wP<u6ڃˆ"@To89CF0X7 ;$qcp7 ,(#Iɘ^Yأ^FT@JQfwWLnGGHfIjE6t&w[YC{ mqYWIPByQWm輪l&N&#0(pt6_-L[@"FH[4Mj254sB&٥vԤe[>t[ͩDm\՚ƜDʿ`ƥb: ͉Oh,}gޱ)laf|`DcOn[';3B r_2hF;bcidM]uf]x|E a0,? 4 c"D#1Ra7R8?QN H*KD ~w? g"Okӽh'ܣ .,D m!BGf o1y&wL>I>GSuĢ$aJ*FH(ň˒q? Hгi%?d}ͣHƇ= Ơl ] g,`)-i'̬p:vA33Va IE8hzefo' ̘oLGP>YNCcҝG+S8 0]03 =KF-H*SfHpeHZ+AIBMSFٶX1ҐV${OzQ˃(ڧ/BE"-mcÅ.)NPfh .Y2'+ݦ'jf)o; Pg"IOO ħ3P0ƒIJ h7hB0YN.DPwGE7p'n߇ڬ C6+]ٓK lk;|Nc +D(YИ(G:Ųߊу=Q.F\lF(~saU K8`3%يp>S)ruIׂ/r ؑ( V H?g(4Nô;ZYn0t,xu.T/iTf|2ՇQ ÑKX>]dd=0Ξ>6;+ydzEh0Cb-<ǩ9=OΠ7\ >{g𴈯 ܃vMvɷGaG@ (uBHEk0x80*MQ7|s Ķ.$H .^[>r.%AG +Ae;4' uAȒ>$h,<)Qvg(woD 'c3w&W^yt*e n쒡 j +' idq!$1O*[r|y~86<N"q>Ǔ!ntb F&N|^x9yNQ2cz{ &Y`{;NY2!^VC_pdϖt G1#C!D` *6n McK;,T`[<㎈Jy[p[*zÀA]:;Ca"gdł?wOEbyD' 8R|lI :#CG"J>赧>1Gؾ*Q2nWH8I"{ 1[#M)7ހ{:  ;1'dFBKh g~qB~ 2~}ȑ`R.f)eEDEeP+VwJ#<uf'eסXO!u1o an[S.#4+ޭcf6;|䛉YM|KaPNym FpR6 ^fqr 95&0LK+[- R.aHW|0=${\IX [leNWI N6n#?k=6A ô?"pW+|o%KQ~"Eji$AOϳc e QwKW`.݅6A64HeͲv=6 zK-Tp)um^q1}GĞ|ORJ)i<%LP Acwpv#K4)[>G8oXl=YTs >qv`%5;ko%2F^~#l,{tN: ;BEC!182_|78Bg$glU4IЯ&΁32 `&̘WAA̘,a=iҍ|1RLP7<FqWR#W^B){\6[5s?0e2H:l{]YH5m *[ 7; ' 3K3SX>yc'DGv!/ٞLpnejs0_5;oa{'l"x2?'7hFP9TQRY חʝj Je˞a/P tFl\#).iv}{){(|V-d񝞑eQBFMz>S~XYa/7%QH{T[*B3;A+{ ]Q;MhV&U [9@2d_+{Y Dw²WqG3hL;3?I<# Y]vk~`XvZ*lBa$S S9ɣAv9 OyHҵJpR8N]gDJtT_ к b.x|ЅodPMN("3= W#SilR dzhe { ⶍU8B*m Î7(=ATw0j׫UPxN2-D:Ўk`ܸF`BD^xeP|%|u,s N`9+'ɂhg v\W ;Fw'>ҙІ,0=!"!I}Э&WGi0\*zxnfZ|Ru$矣.X8ܞʔ^J6x4\I4SP9Dbx]'ۼ0g/g%,HqMNy,.wPO=Fy49 #`*)\jnR>_ỄA&<60ĥ'90ilu#Vab3GxE'7jYj)I$ ½OO,ŷl[7׳W&AE!&I[Ci(<coSmMQA{|<"*հCu~| LuuE[ Ρ s􆊒,F =Xfg)sClZB1Hsl{<:ǐo'hnw#MNNQ:йVp&t0P0ˮ ji{υmy(۽4ґM{\,vQTԋ^lOj_&uu;`ɞ6@ TʅEv M՛lIb)B$&αߑLTz%\R`xmVZ=~Z撂Qfr k$iBSs 9X.-+)lw +H#Ѡ1NĀ:ɱE lbIL,@1(#NYR0(۸tl]ZzBi/č!O@ޛ -e^[s!消5%DmץBeTC:Hӟɕ,nY'V 7) 2@vARtW  '^t=~>ؚt{6QP8L# &TSx< r EiiԦ -I07`x7(J,+V(HbˊZ[<)>|pD!q|4wcA7,]f VW@ ¨X8ʛVXAPodD(|昮$ѕi6Le0nhܧFki`ʯJ* ORE&A~с$b Ht `|*5;$(0liGTD309w'.4(4(TՑN}rejWq[WSCb5>鎴0ݚMդ5yiL>WjEgCV{%fC#7^(nWܲ@- cCk[4{Bpe[&pEn6>dy7O= i,h E˹ C[+L6 ʁH03\ %A|$ )M221-r" -HCy5.)3?. s;63cs|zf7id,f^g;:!XD3:i[?(z bÎQ+,&(S`7rLMvҙy|P0 {/Xa_%X&#5y* PX Mhq7caAh9Ӆ(ۚs1CQ2ng/7@eZf^[4[+.sn}p)0Y6lSweۗ|gy^x&(Y M1$ If4GO!f|Ъ3DrĖ|/}/zw de*hGC/Xλ|/EC& \tm0 p;:6j[$sQn q:^sGu~Rc0V< >ksFKYltE-Rע#WXqy TH4@ct큇S';=Bo:Q z##`̏ w4߳/G/N:рa~GCjڻr~L/?{^DBu>ш t^w9Ew%uyzC 6V a|]fHx !m$jz;Y`~ aG(va-F_br0vjr z${^= ´"L;œ]#4JhuxzמzO\6n&i}VA̦^7-*wms%F7t@%Yc/rֈ̩b})L-4s3S9I" . EpHf"'р&/]@<ȈC mOnfl*Hf ȴA9D.2hu$4?ic2$iFtdc)B̾ h .` Ge;4E@ji'+Mad&Dh7'2Y K=lqskUO 4!iԉ&h<E|#+?tDfy#F9@aūXayjAUϳ_;9SgQ8.d 3Nz {[H_ 8nU=hkq-h\'9KAOm;#@ I?a,Mbq jZ#$}&DH,}$yǬabM>'frR siB`^/ ZFl|7ِ,'xnyxCޞ_Gd=l% S[TE]eyy%|͓ggftP㢋s--[Cal SEs{+-:,L]N΂c+w(dg bdWÜnTNCF@YEd5޴ sKôw,&z:ȧwo<J4LU 5JApəI"ď!]}7Jh]Q; Em7+`!y]|v431ļlEqoܸ6xrY6疭w^gN%n\ibW Fr-i?cKeb.E( 0ʭ?zO|㷓f C1|? #gpvi>jdpo>g9~GkϬ׭{i+-hr6e[؃s̩_l5 z}5kk7&U~_(]-TQ|{>atKJgkJy]rkWofk}}љ/z93Q5& ۧs QqKީz٩֯E{\h i6+zxb>Jœ*XM_YEK9l`} ~1zqw4}1?Tv/B[~[?hק#PHPphpphp3php4php5php7phpsphptphtml embedding.php^(#!.*[^-]php[0-9]?|<\?php)\bIxڵS]O0-mMc%T@/tҰ%z_N==r;Em) ΢8-ЇA,xw[[\?qxwf#vDnOH=WSzzMWi5MrMKxoĸ #¢Fvĸ |GJ/2hD4! F6ŝ;-c0hF"!=w=7BJ !q^{b4/Gsz- IkϡŽz&:+C1hhbC8P#4w2rķWF"$Ы"\?D1o!e1ƴW*Iv>l* W1}Nٲ``.*UրUKܟ$Dp4$p"|6{/9\ +ƆWsK%Gk4|eCr|x=PǕ !㘾H3ã]/eP,(!ְ!_UEߔIU<#xv#mIr茞SF̗BA*:ZK?k%_#S* T߯bpw@+2[c#捤r/5j2>BZ,9Ib,q[ o:ƮAv=(ǯ34H_["O #N K9|_}ceI 29cӔTLz =wiάGLj?o*ʨ=c8zx4|8 nxRx~7/O'齗qB)T 1R)_IHI&Yv 8$״Պ;8Όg73p~>&.ӋA|yNy~<8Z,@Hp QD8cf̤LDJ !:le{3}G %vD=Z(7LNokZ2%\(K^ ;ޠujjr*QTvK W+5MlWG~@%UΙf O;jh|QrvW;?h+RżmN 7\gac=tRN aqzW_qL/Ku#\9HdZ2C2K8%N p1JpLv"U$׽.S4f[̔ .)L`4TPU[&%ΔUsB+5+Z.9e+Va߮%)Y .nP hWPk%"ق: $(E QI2KM+_FKoȈB-V3] <]3W%YsiHvfn@a D5UX *KNUXY4`xaI0,a'>> dm*V^/]1)djl΃xI->ADI،ɯNv>>cЛ?kSI~f32铞@vLWf|`Ov߻/vy>\ǥbRpl6z1 18T7G0 )8'$5 |v%e*>+̑k76)?,\Pgxql``럽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=bu('r|'$J"@d;qL0DBmdRQ@X, rMϤ6iڤM۴i6M}3;3;@JH`v޼c޼y XOZUT[LRWϏ ˶ZFmVZM00;}!h0hWYr`U00y0hQP(G+œvjStʪ<őq>͵Ulkzp=[ivz-z[k(QZ 5RmF.)9TEWG:K BbOm/e2H I9RzKKjK`ؐ SBkԨҐ49"iD$}S3!P4}E nߔaӦ} i_!tf,Roe^6`S٭Q \ʔdB8F%+uuYpQ 8/lҨA׺j2Up]`{E.XKiFlu5M5|0z:n aHJްS y ;}{!>!.Ơ,r8"eJvWiHkBzGɑ& v,5p:'Ҋ~HPڞ;})iR0ekP'tR)[;RWd kVΆy]Zm z )i0#\Q--MHI.Z%S-Xuvhszab 1sXa*إkpҷ#qN&l.m R67#bŒ)Íl~ 3=%r*zuNf' fK ȝq6V wC ǹfev>3Qp4׏=AR'IPc~2 )S$R3D*vWՎI!EV"ND^uy;% !k \x"g9t8)9n,@WGs_6)%Nդr 3 7>#(;T9_TNI!SAMiQ%E3Ju&?ϵ) t5 5'E~'<ᇵP;}AVr8 Tގ_ "!3QH/P-"+vJ? "f [ 쐲fdj3RFHD "߰cA'//;dz|n+`X_;}R1)cb5S;):⽑:$FN/ΐ};dv0& 5`MP`*kE@'p! ެD6,1՗ZlVefM 05?H {sTIp;jnEg!d}SC[u+R, aMK*XG~H,C.>8$ťl?QH _'RSc .Px+@hRydFl;&#  CEYQŸ9.!iPLN3*I;AuJIph;T)wK#.qd ޺ ƻ7BGZ [ CU78fBRSZc:%NR8>uSWx~M#>*HNo:>}DS7lEkX8hw7XHx?օ$+{ pYը*5?ΒYѮF/@&Z1\;A"^#@ejPrxc3rtQ)!^jAl>*5"%j[|k""蘕߳0k[)5eF3rs Cr h5lP ֯J֖R1c+~ّTz4 +A{Gf/L_VA4^uM%*P8KFe&߄!_-xwZpȧm}0Hq߀!q~5ayL@b}14ʢ%*!ĢiſrY {ol}*H xU§%~fz8* 2(ev1/ τ>.ٱxܟQaB]t]~.Nګ%:ɏ_ ɑM{ˎLoJe4Cr畻&N_:fʹ?7 !%uL̓wTjE/uw:LQYk8'>Ji;VWSҩbӨz+,֫^P@$4G:&Yq4_]o@`4箲21ɱ4Y8gH0dKS$DQn_xT,w:s)dg~ O?aL*%c$3SΝ >%4$_ˠS2B Z8{8$f! :eD hm}Tq-$ q2*7?!,fl/|"~2NbzqKG\+{_<} 9.^ ^Xekk\Ra|L^ 7AG>괤 رف|7#,e-_'5;vl)LaYoYk=^LwoxnξvF kY#ޝW<+"{1o,Hy4N ^yI[uk\*\ =x~*o`p0-X?'[q5wy:ߑ򿄨:ɑB*^* fcjZq$OUUԺfhz+w=W^]\GsɌ*j]f>6'rkꍢE ^ j~:+ c 2vߺ٤#lG? a9HL>; d0 g[8!E6!Y+,wLd7-%1 Drof"q `Ňύ@B 7GhO0"? oژވ7.Fm^XOJ7CX!Gd]A.U_$Hk4o[=mɭv;`;7D)*|%l[=谉{Q('TDUH^R:5yB"%|T}9!=\jޑ|(lCA?&z6I D_E  3=דR;I."R}r& Oigeݪ;{GasA!_䫒uI 1Wٲk6.<3!qB,??csٹ97;7soʥꪋ):ʡArKWcae,,䗖P2;>Q?{{`) ݆Ҫ5 \H,5U;LNd13ZJ(MK(HJ&dr(TQ&R P\ tԟ a` 6 CY@i$s,s62]kjZCEZ7 ?'6hlHhAD_c+?뫏v&.* WCCh)Sy,M`K*Tg-t&T[Uv0N'$-ڧcV)GbCZBcRi3G=Lhb]}pHjplbR9]< ,JF#URUI(ܹ6 An; ӝed G&_K# CAjNp$5s'Gy!gJA&A9٦cvke>ZF3o`N+̤2֤U)kTvg+dҴ]"1bǔ^F#?9hBU`)X$$9 [◝$s>8|];$* IoIeG~Qd:ur_{+T jwLMS C] }4aYD7fuVLnh6v >S]:faV dH}P|Ҵ[&"j ҆QMUn$D_64,j;m1T6m?*0+٩mU_0q]3꡹.p3" Y׬/D_]V_(I~ N\<·$:m }[k:R ߷ddX_l]V$C"zUVbr]&^ohs٩l]m8B .@ü N sh*[FDŽXlh>Lh-2D :fSiMoMcU Ѓz%45TXӱ:wz[5۠mT*Љ?L,.z56Lv#4uU>P(Jc_p %UU4v %\%-~ʮ mEMCU7·R`M5$kHx[c W G W J JS &F} }b & P _0[1 :@EqV?HP%mXH <4qn HE&dQkආ"eװ RhĢBy$ک jAavtp>(ܭ?KCM4%kw[X-K**u`` }> ~ۊ21UlFݔ'|I1lvb8"%d1{x<)ap7dBCra7V:̆3 IܭXy %8|bB*ߑPގ;7_C`˂ѵFz'_ֆ a!%A P=Ӧtޯ ~!-E*FEDz͸_1*eP(vE'N _Ǩ4J )(bJnb1RCw 0d ?av(KҤ{гOژ.T`QimN)? #~酥.^KbֱvCeylI?lHtтGx ;Kq6(7<}ha'4"i:a CCfGz!:G| 8J#A͑k(Ew.Q{#T ]𼄃$gE}c"Ċ:d%GJh(.Px ׌E$}o_]ch*c}sҵtٝkAmH@%rb'ߛ('[rPPC" DZIY]Nn4'&̓9>a'˲E_j0e3Vʳf 3ϝ3c'ʁ 0TUiZ)[ёsgD sa[QՑBɘh0~ %At yjυ߯kB}wKxH^V1.gy8\;:vv&36VHf@\*-j{$t9=%#S83;g-ְm;zmZ|h*ԫTtùL& հf0I@ `UfN zhJ0ؓn%z-UW$5->>?ߗc`PoxDDL_Av$JoKߓ䛒z ZJӒ$gcj!/X߻4>"Fb4'ӛa,ZH_>/ƨRy/oЬJGYܐ@YtAmv,Lb_}z=wHA)pKRtg`H_}i@#=O/b45Z'uqbYGlbejӳ@K$r - Q"1m]m{nA(/Mr_Kԃ=iYQWzeP$ ?ݖadIJM'4}$WSOs_K-/u? ^@D:ڲӷ΂gg4eN;ã{0t?F&e>3FIy|%ç[>g躡dUyT_LU Qbjz='G%CoD|$-)04ª4‹dc_  ._;p< ȍNW@I$[Kgzq} jk$wX^Oڳqx 9읝hvrs@T8 gz)DSHfuz9qjjg$8KԽPe #2 ~_vnb(]L~2nG=x  ,As$4B{S兹܌9/,/-|"-Zh~U@ xmE0g]_rzþud@9ћR>F0$7cHi÷^zxUUW%T6uehN2r8>8LNƺ$]NգDw/{x'[.-=h8 ̫Lpex&ƅSfl/d(sgw3m'z^\.k+s%3t8}毛P_A?Q57˳ Kyzu:r겙^Y]˯瀢egV 6入kU\gPev_Ͻ:}5^/Laau.yYsWT==Z_v)`^^X &gr L7 bSbCY9Ky̬@9[șs*T;}uM[ *[Z\~ʶ2W7Wf2V.Yv,tP[/ 48`n: \AE مe_[)\%gs4_zaA~\2A eťjY\Z H땥5Kоs_D,RBf3 &̏AyOI{>w8Oew{S7nsO&Y<{bsJO#dUd [ZҲdIluŨ0cO<(ˍ2qH<%c =KšR7Kw0#wy%]S 90B?kݰ]&p`WԜc5ˏۻmSb<T8jG-8G0QAFozG"vQg)mbKʟ8*K7RFk@u>ʧ$̃';6r\D~+!#\8ڙ>39eQ 茤gaYI&1|~UȹK|p>}8n3"b8Dj~җ2SؾLa]!?"YlTvb8Pythonpypy3pywpyipyxpyx.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}{`GyI$ 9˱u+qDdIbpvݭO;K~h+AKi >)}BBZ Z~ٝٙٓV\b7|K|o^9AYN⎙RS-?bVNZ~TZ[ga9+ 0+Ӭ<.w򗙕5-Y/1+ZZ~w:Uձ8-ƨw#ڕbVWi14~^.@Hk;-?{~P]{[ew:v f pFkg$.~ޤtzC/LtIuªSV \o+7dI -9g8I7KKtQvu)9ZFNc؃߁0 E!, ɨ*m5daX0o{r+vug%7`+=];8]*9jc_ & 1[#!CvabdMdM cM t1^uf ~MswICPNA9w 3mT@WKMwb5=*UZm1b i1^[dZ:^*7Hn۩s=@T@`_;} @f@1߫JMGӵ kn`Nޗ[ܢHY_vq9g:c4۶Tf`j۽`q՛YmV=?LL뎇}kLjT;>Rur `q8Jv}m8U6K ($ ɇd, Z=U 2xaP( o) o- z7}0(|Qabdid9]1f($WdlB24BB筹BiðAW 1\.-D@Lb1gÊ9 #gè0"ta 6a00a04aCg0hC=;Bq@!YAYkA@erLaP& 2)EA/ dmA~UQabꢐ5_SqkB2|]QHƗ/ E!W($S+d"D|9 b0'Qзb-}[ &^wb"4~9Jm0s0|7a#aXz9 E??Ӟ]^㆜k' .,خGy9\A~'qjZG'u_B׆0xQ?i,yh4Pw#lWd ~L@C raA-K|Ĵk̙L DJ([:O \C럊4MCg {pbpӲi;-n,'Dl)^icbAփ/ ?/Vǂ{/Tîr%|Q/HIIR.@'l]Akfea2El=.ܖgO8b6P<(WIŴk'3_ @XŢׅq"y\u-CxvY !Oĥe3~ެ))o B҂R ߎ/fU~Xl$Q;Z#QN ;:9"È=a"uߏr;gTRTؘ*Tl |Lq|60DZ^S?-G¤,($GKH LP]- Aaǥy)R<*J"c_ (f\_ "ũ-Tbт#辎-%(68hXɿ\>UjLjaE?-XJ4``py5_>k}Ŋɗ h{ @iYJtϝlb>0DXt' *Fjn|N^B2*>>/me||AY^@b7aU(ĿkkKhk? h/ V # [`*鷙>Pt Oz@صT_c]-gN@d-Z+PF:nZkӪGixL+=|97=m^+aBH3cȐK Zq[}_+?#Na>xY*^I}OhjNEmPi7]i5<~'ih#\VRrÚDAt=Uv-6j+n5H5iE*_RȷpEH}P#Nv0P g.Z7*ifݑQa"lB0O.+)SIJ!: SQ41:{^.Y`tjDpv .8sn4ʚavel͚owqT(e2{ufYt=7vH6>/̏s6['7<5AU\?#y߼]<{𳹽b:=E *ĵNFW H+Q@DI"IpVVLBv⏔dbz@WSL%Ř2kvc4k`E^|BՋ?QN)}p-\ת8ȷL@ ԢX j9v 7!lП^ x$J5Y%dM[ĸQL# }̋weqJd@x/_4&f5Q}zlWܝ$.W~d}eeYn :n ׃wTFO*- Ҵy;ѱL#Θg!0,GΐR,~d`EHh;6~b)&[PuB ~| 5tpI{O44s OE ax+bJ%GLl8\r9#2fi#]Ll.irfnyf&_nL7Wkz1žqqU--TT'{[tN.+傚ZJN/ePI!)޿Vrb$X88ElDu3t3NoturLxmcA5>quAXoCfOfX#X1"|z -uAP, r=(:@y!(ŕ D+0 ٝD9Xmrb,bN<2'H0IU6,۰v"UpKͨBix@%œ-u3ULH)pGVf%S2!-nOSE5hA\ixTnjvc0'&QחXy! lfs;?G/oO;T; Eih_Yg=^Yf/i|[fb];1}8NkGn#8SFtMD /#JYI~ȽҥoA7BI'HJ eؼٸAQ/kmuXdž~rl> t>ߗqIJyC:X&tH-Uyd|Sb@*#W4[R:) y6m`Ip =Ӎ͚%QE9ߢ<5BUdm]Vy%'ib(fQSXHL] p+Srmb<J iz;SfKBu|(#n4zj薙1s|~!1ifwaty_0Ǘq]z4r[ר)բE>p-B=>>nx(nc#{ާv&A$괇I#6V)K_u}#|]jzl *Dz H˶}ZWr4č Cޗ0' }܉S95cGCG;8z!R Ϩ !o;fÙ^uvl8USɮ7I=\64wnYB]$\,؈\xQfiM%;V8 mr@kQ~ sB(Li)[,̧~. t\|>ݢ㓂C̫~f+,/p jXbXn@- n#%/& sEfUT,$[k;=dY,,0dᮋ-O@[`4l`{aϷ)KEWS,Ƥ-Sv<5`G. 8!g1ui zDӘ]'&&.\AdCa=V9X`[M /p&>+JDv/`*>y7d伦]?خ α?V[P K~F׽ k5Xn1EU94^Sfŕ/v\MM,̧~.t:+ŗsb]FBJ0÷X4C.2Q_(a vlai,e&"Jv .[- aᮋ-O@[`M%C^dI)}JF7ΒI&\XoUQ'ߪ( V̀=;Xrr31c%*kQtKe 6%֐uHA'Տyu?G8|*UujT//禛53>9o wwAϠ{eTGl܌=3ͿY͊ Uf+~+ESy7I6LzJJcu8к_Vt$A-˩'ɖdɖrKZYO4O<`.tyݬ%r;ill^CrJ/K$' H" 3waT>6Luy}*G~:,C 5}yg'Sz,HGރ~k;>[:j+ŕBgGph0ր^LL~_Cov1?A+Zp8ԍ==x@ǝ$F:c C'V$DPɞN!H1:e7)Щu c^zo S=ǩBK>ڢ>p'=⾍(5*rY8]@2"aԱǀ~8(&_tz 'Zp٠gë/``PG{h_ 4}"z#͑$i~&7x'ЭP$~a!`""[Gϰ庨z=]"w?lFrleoJ|' o+]|E_% P΂xA,ȏE\~APt$݄e;$o์N~!\c4#%+ ftkq<"X=5(zZ-ׅP`>{n ث Q08 LȰ c$H`b+8 =|E}5+!zrp G} [PIBd9rwP3RiMz;uK0H5411A{[κ*OZ ˒d@ @_~C0ǣl^6 !KE$(jVLnf.[/ sVہo*ƌg*fl}9SպOpclX\)+e}2Uf{˱ T2[@w @.FP!*q{UT?נ@^/T1WIXZ-/jK>j[ý񖠷tUP|[mgn7~޲QvQXs}8}dݼ+o}hᓋwy|g}ݍsYOE/m_IKĦ_ tsE ="钚C4ߎ~Ԯ)rG [dѨ;߄x;/Z,9k]yQ SR`H"ï~}~nޮ>sd1]r;j^[mZ̫N*wU㪤*_WJ*uMSR` e>C1;5m_yVYE2gWmΓlcqRZȟ*R^WX'5٫Ԉ]!FuOvHZEE|x!MrI]`wϻ M=X7[$yq7Ոysxj93J{b=[5l1M#:&X%=T{u :9-" V-IAnO8-wkIYS_m Bj QƔ% i/`k= †P#QƵN!6[i kt Rkri-(ElC]1e/X] M(Ve:ew=)hűwB2ۺ^yb &y~S86ôc G6,]U~jlА[aΚ=恺Al"|M:2ՠ)8 b1b@yϓ.='`x| IH< \6^ (jn8=jдHF\zYE3P u+ٗ kK"'R]{W~X)i柔D .͸bI1-yȹM.:fb1qa/gIt{1 JJ&CJQa͵ {ڕL૪`aH;ýZz^1 .Wk6X%.PbDl?|&M?A @do0m&2B*L|W:Kx׬Jl_ms4ja*LuPw1ڂ{ۣ6^ܻ^o]wޡ{m7F~=\AѶ\ŢmśoQ^imFP+'wuDN EEL15<9g:k, jz"tF.)IcRm; Y 9jP(ޥ5%cd勳sR%6)n%xITkb̬Bre"䌃B(r4kS '' +xr[XȫԼ>3cT=f3sAhqR~>,NS<1{=#ZK4?]j>z'JZO1!6;1P =*ҙ89T$LK$Vĥ"xfU#{OqRrG e 33ѴP3JdYg" p*xW.L+V7~kGoJcB%h2ާ4X%,$TdGZN DEtm ԁw` Fg$8_X&*EH]m'ln71'U-1p7O3a\hלX9(W/5wcv-|=x.8tp ;0fl%c‚:[:r[5"r-Jp[XA#$t^0BXF$K1uX_%ҟsg#,N/DggV{}owa偓znW *dG^q!H?`kU5; ut% B$˛ek;<3֨(v s؊ؤ\PIWWq/zo58\ ת~yr<*'¨'ji<8mZ3 aE&`p+ j5F6 gG$1E~,ٗm>iVaZS4 & 2KKā-^6Rұ?ђe5?f,:T{8t Q9O)oMZ85[_7\c:՘fI7Hk Dj,ggUzS#s Kul 2/Qܳdt;6"?aҘwS̍x`촜yL([1#s5Y[ ' TP  dvRޑ`Ba~J{vrsΎL4=tg=0K85SקPt<{h?#T?ޖ Pm lJvKRIgKnKF} ybT.]+4[_u5^ŵSgJ8~Js PY{$U29)ieX#Mun pVPǛ'sGtsJFdȻ[`=x.R]R1\A3hwDwWKOf̢G'x"Pf\>SHҢד~ryUCWNz t?.mX`ɹcsBG99wzGN͡%@ǰn1zrb6"b&6r RiEO;7E .](%?tJ!Rg L=:Dn6y"ExHm@%(ۃu($66=щE I5QplOJ (ېqh\mB/i-+tb+ؠxloNB Wĥf񾻤7-7߫7"~%:^C"`!!B -Eⴢݷh7ݥw*%?|WIw+/(a3K?E+t;lI- WE!1<AA:1\C%ʪ(!݈" vx&E 49AV%oI2SN ޲2BYB>'ǓTY[^]v{Nص[8~aM+0BBTc*V|<%dj{ AVT\|@iWqڍ1k;'7~LbcrdLB7ƚnR7HU\84>h_LQJҪ\I5pa^B/)՝;uSt EUERR\:wjSO,[҃hjU"]©k 653'͢]g@?U+Regular Expressions (Python)source.regexp.pythonxW[o0nו$$.hqK 6mI< -N'7h]tqqV,-'Ss{2YR)G~sG~^%8SYgS,uKYYLT%z*f_hO({niKp/5߁dTdQpY! ']r>(552Rȓ؛p0 ;8A #m,H cWt<1N_< М?i֫ Gce(>I({)j>O R- snK^z)ˋDv9 !,f0J#wpOd`R=zl}[pxEjZѬ˔s|$!{ŋ4ߴga)z- $e B-dN$_67u7d-G V-ԇ Y>9z dḶVHgUZXnWiDYziAo߫8\a e,*=9'"U<QqC@ }k@8z8P6RRrRprofilesource.rexponent(?:[eE][-+]?\d+)var$(?:[a-zA-Z._][a-zA-Z0-9._]*|`[^`]+`)9x}{wq~;؎w-f97XޥHi10HDy`Xb ݯq?֯g(yRtUGuuuuw'75iRV8N[݈x&d]ݼ>mY/\xj0_GQٲvyUޙ&Eq'ic_s?\XMIߍ*$MسAZ|Z|7Muq9J\횼kL~cP"m0դ}c'xe^ty+"ݠUDZ(X{ЊSJK5\t }cUt뻃dIAuPgMR9K<AYOIϐ,:lꫪ)/]ոqʨ zaK&NwYiOnZa߿qk^ڪXG7QKnMe:itGy\XXd]w8>lډ/ظ@֍7[j" K 9h8:aB$JDEW?[ r򧨡 +ARYeY. 2keL98 [5LKwڟ^Sr^hŷuI67״o W5 ^ʻq=ĤpmK=ۯR.7_TYuhaԴ|v7;o^_m..KmlV5{6-p!5EvY=R׍i6\L7QKg.uer栧ղjyoxߪ"گ{v'1RAs+mUo6_~R ^WUѳ57P7Y^bpgS>W,v_R_տϖ~r;L,OO&mL+I>0iOvH Pdd\>)+h3;]&!zHޛ,.$eYT%ƛ Iۆ%YEIΪf,T$|I񈦹5ɧ!'Q&9DAc A%~˺ȧTi$Cb@StKL^$$.@EkzdZ@ bd5LfM)}-"Eia8Xl@RMjڭx "ʹfBu]0e۽vH.=׼Uj;Րf]~5jj^vj3 h՜ضTbͽb :Jrm;&Kdni|X $J&>\60h{&Q`mɄ a= qbvx$_ Vd٦E{uȅ \EK M& kc*>a=}@0ߨAv % RZ R2(AV&ai䧱4['y"=/awH(AffhaWe8G0Gŕ+rTDb+,b8&EDy =bRIzP-,%_HkCmD*.0Uxr+djA`5|!-8J<ɒkUEzVYFPQytBr!+4w P%$'ݡ )]vѥuη˔Uᓆq>=x'TO*'ҩH NNZȽ;NQ(vrn!UPjZ6,S &غjߜ6 OyҔXPYeg:e<Í6UEJ=ZkiFynâ;A4ׇ!tXp+UwVB^\|mT-i%e{|Si!w =,ecR¤# I+m*{hDU<AD'`\ \,{՛΅ `W6Z@u#bdL=A:Sҝh`t~Tm[7UPrV% 8rAASud苔زk #(4 {# є;_iN:uXS@g!K&J6+,"~dO ,E!_?G-wjYV0 O⦟镹gz♮uW!i({&BLe =Ğ}&,'r-EVNʄ>e7@8 IfT,(B-/0 kcf%؋h<ڜ7y dv4Y֑69=˩rp9R!2%D"U}ip /AX&HDAdNlEu9W:70ᨗ N!y44<9ϨU#m9"S~VTĿ\#?ýr/,= ; djmHFb+;āiRՊ9Y˽8Ұݴkõl 5W"-r7*ώ錈Vrϧ\9J-C[=-e0mBqw?2F}kF2`fՒ4]{#4*Cd=ȸ1f4 q㢦dGIdUupjJIp."paop(!qH114Hԓj5}.˩$+YnY=rŎ+yS-kySTֽ>'L<˧ȴAQ< ዒZ9!I R&*aJmB;xaXVC^.Q6T2c{>mrgd4ЙG<<soN)cILr?3.Iuܜ W]05;7  ]"F @ Sɤ܌͈֕&9$8qUs|(6tIR' :?!$;-Q}kKoU,e? fhҾH&Py%ɋKԄvg4@g& ՙHIӻDvki m̢LJ[)4'/gq<qAÀoA0˓Z&# q 'H@PZ㺅ˤ7PT`CzErق2?dU^dz< :F/B d09J M"!0W=DUcAL;ML@k|,iAM 0x]`!x:2$8l`f"$zgZP0_m˕L3{V4$&ʢ_ZMg2Vh<.%WKœ6bH{uU!JUx~8#ev΃<<֗/VȞbRɭ|ކRd'E[!U%ϛ%u,M&'u<3 #wS~ex{&ڈƈhUzAJ0aQOg|6رR*kSnĔR@1%U'.DAlX,v W>&ȇ]>#(ZMU(\qΞVӨaܕ(EF$N\s`-mw[R%F+&LzSL&(Wf6}U4:JU3d. c]*&s\%` Q_i$2s -ܝ6֪\b0.w㦋8[V؂LܙtCMzv|Xjdmh*=N0%VWGgRSbs%8+UR.d蓞iLQ0$[v= .\#,'taM4@TH@r @7R\YhIȴMw3HP%V2ݑ: TX8<Yٴr]qtw!CאYت&A nIE-vc!v3&ZH GQ6.cvݬ6Pl$>˦@[0;/eZ=q" ~tz0jjoe(V@$8<.$,/ Rqe|!C`QKէGhٷEc(}%QqRTKPÐKg Kfi)g%"-#A/P(뵭Zڡي#1B@ۇn Z /~8|DBdxWHZ喘cq^naHO-SJVF)c爘kP˂8Ğ/ͦ6`vᾥwrO)Һzu#)C[vd}$%Y0yHulBiVhʊцW*y;` @K5]s@) :Ѡ!~CUb$uJe'1iY:x[/x.ih|۹(*G"Cn4 qbbxʑCf Ei5OjtLش&z \sC'CjvJfr`f&̡u .[8!STdzle##HZ U@Nƌ06*:A:BzcP ô޾ԗuY@؈!rAje\< Fl[Ad?v6"4d QR&0Xw~Kb:BDGSJXHa9òPǨ#|t1K?@׋ rN5bB+kgN66Rȏ* F~bW*o+c9cL@$:qi2tq(ތA:v: l9ð ˎ5\C!et/):B e+g h|l͘˲z`w4heV3&n{ZtSC6V?j ><|/1 #2-UJGR$M.=mQmNc|E^8^1 MtA @C Di$U nt)_e &O !5]PmϛEBAkKVj\ 9P6Orl Y|-e >U+[5G:fٜ)8SUTؘYM"om\inA1mH/IO_aGOnJq64~tZGjGq}#玄tcaR%/&7"$E _`%2 6A©sXO<=9F:%jz$n.ɈpeJŦ2YJ"ě3Z)lT󆗠 - ZD#Kʡ,6Ʌ<,B4{m 8ȝ̽YA[Fr[5x*h&j+xSgSŜ Q_WrB Ֆ>!X |0-05J5JPq5U^ϑ! yy1\ٷ%CkR#jR䲭E rJKá5Q <}ki4*Me9c}Kb."Dx=e-/ĘEEN K DQ9I+^2v)۠͝!/wCJ8^a dTc=Jk2NKd1L,?.˖btFwd8ydXSt؅ɍwxxC#KΒm7 [\>rZ}UB6T-Ҝ:Xr*$do&8BP >>JfbRﶙP R6#p=y?|$ {{m]!1&,Jd}]:$<-pBѭpq9oKpc|I xZYҹ-Ow8yJYxR:^ /$WDg|P.ţ͇lU9lD< /<۰ VH9Z<Ҳl'x6\)t[0QڔvUrQ+( qD2T`H+"l,`p K4 hYFO-^D2]&<!+|HsH!6>*`#s taq7cXua_o"?_&Y5E lGtqhNC쯂> 6лήdv~DuL(S#@uS  h%EB60%8 9UB"\>ş6UWr"U ZꢙSOjW@ dS9B,068ygE,ČҴI!XJ4,A\ 9ʴN"%oIs KH VCEMF_Qipu89N${Bu|g inxK6Zt t3c]sbg  tC{SϫxR+J @[nsZ+ 4kHPHU6 I e%jb=R0ev80+\߳UlӢu㤅{ | i;]e%753S9Iˉ$ϧ 1ױK2@Vm Qq9:⶙ntyd=Dܑ}2ӫR!}OSbwҐEfG9͏yGl?+Fws#Z,R{`./Pv]zAGnG38ݪr\_I)kaE8 Ê!2%{lC 12AT VƹT9 [%t]VtxC NS2\|$30[t;V7^`ߠfaviF?b"3>~}ِoD nɋVe`Ҫ o5ruO|?'r"L'UuDm:]N'X"L;{NwsTGfb9{Lm_`+`lGvi \6sk0d]xt:EaͬYhGw}5A"O/N9, r  kj  m<@ϧv6ƪGqcüg'2'kE%ܶNpP Խl"r:&InB΍{evs6({*<ܞkݬfsR;6^˻.gDy! 5Yph]JY¬LxVYa79~Ѳ)($n|/cbqq$= '9wD  'lkZY%r;Po rE>"VIB ڒrA8Gx:#.%I"Zx+ɒ} 1޺-VVD*Т\yoi3j2mSvգ+3W<)fƫMd锵α[ϯsYmbm? `Hڝ3K~썊%ѴpIi9t8 i |Rf#ZMZ Q&鴴F9k1j>a/RP%  ',5u֊hXkOa.O8,·;Kg@PnlsuF}V]auXVjh1T4]O.rVh~8d(y?H1O`uYΎz8 UCBXҦX q-X5x=2]z ޣV~b2Th炽nkbc~:xhqbCAc̀k\Ӵrg[֒8oYR$BAS>24YNi퉹ihȊHsZWH F :+ _4 4\D/ 0Y"¨FAy,BVZb |NRwDNe&ʁA*mMw2ghKoG쓈"a' >;β;-,fe³MnRZnU.L#\7 *BK="7,`͖D1% Rd3S!|VTCɎCcK:_G]'H|a>0yPfS>Y Zfsj.3 "Zm'cuGvXc͒EN}MygTamǙ=&AWGq =YAC>Ma3lE$Z"<+C̿:Z):4pz:P8';0tHOCB 0JB\p3kϥW4yFӈҪ$B2sE{_%K'l|k叅>"쉥5W id}UE?bXۚ^,f0ohTEx/~_>DBN]9HZ4@cؾ5vҰ߆ z]jtG t"HďKĉn*05:uXs &)LgGu)x@ 4{x\_?<aڀCpR*Wfٞ#̿:@tߡw(GbӴ"Kw+hFp\[9GZj*f | s&[tȴBӫ 3,SLhmKN"gc8W}Y@nX1~`澀ȐN=~DxtxX$(8L-d2]x@)ӒLQ6ВlnA<B ػp\S^8u#@ۀV7&!6LDj6^+Ŝ4^^rf3NPؑڮ<4N *> s$7 2_EYp{$t|be$,>"͒p@tQZI m{SSLT:'[:q\q!t9_)=G _q W(lIaC1,cd!x03.iī08[\6$VܟYJª ~@'A%-Ŝ@I-Wlv\Z=OL=aC_?Hg(o3hF٠)Mߌ/^ZZ^$T 2BUo`3}CqiR&)%$AKrп)}-U hY@mˇ8T6D LBq b'x_aaTh4>]k\4e8^5 ێF|J爛v*,,C1thm Ursgl F`0CXesXxGœa\nBL 3}竱df[ZYDۀPRfԥ KcxqMq@յx&bOFe˵60L':>hku}ÀS 7eͮ%(n@bi;\dw[g\֋ ;xgԅ`bpQPU)D#/.cԜD4f@6//,YERC5<Rq2(iH|' Z|'x}AH9:{+8(@Ns4i< xވ}xGlXN1uh7br9~DW;E `}j ^59\4Oo1$! w`b@NV'iF19]#_) + w$B|}WPI^MA|@ӹQÝظHy_Nxq `x |>\WŶ6=TKϦe8ϥ񡐱|{jGD d_ib9inXE tQ1oUbBZ7Y>isz$FݝgL.!ͮ|ᨭj_*L/uT\X%&E9|KEj.3a Ur. _sC҂jW5_Oo~!ష[/c iVwmH#Khtn 6$ 9dw"55|֚ `۹9 _&hhVrq+.L֦Nm~Y{k۟Iݸce"#P@xFs!=X mzQPQeaoƛ# dah]`7qj>)~\(Ϗ koׂQy;l%.3bcڥx ۠U:\'*2G79>S q;On͏{Ge)hvN/<3U;i6 h#/f^귘&vGQ gyQnS(nSDEbRV̻8NfG?}3Rw/=׍gtkG./5$#n/06OҰFAmV P3|5O:K^>,ZK׵WC?p:1#M>8Н$'QA)eW"уm?o7ӀV0_،㞤J8yd\kISLGo7{Arg<) i0%BA=i+dĆd&{ KZ󒽇lgܸ?TGGф@=Jؠϲϟy9on^ye⚊ъj3L7ںyǾU?{}"4?]eL6~xyM|F+8̌Yݠo~3\xnۛ|4á`odPz5-40ȷHx;[^s_kkRs*`6V&/I/C7FWU~GIursc6>bn+֝%~o~T?m0gE|bQW =T^uC۷VU:q*Cq͕)_~73qW_f_zu_ t4@%>~+>"U.EZ\ȮD%'ľS M&S8Kuyro\J}+U뒔g$̭KzS"G)Kl+ץGDK""\?%eiyΕXsJ`\ӧ ˿_\`~mUnC+ҋ<$5o{ ;kk~k k5wпcFHFٳ7xKzx_eJEܝί > ݞd9 K8z>}fNWuYY7o؃\WwywXPJԭ8lWW~qgm6@|j}^{#VtCIQs3T7w?ks>k͸|T!?SEE;h߆Ee#Nf9+)& ~wE\7^ZuU_޸FHEYwUZH,,'QLV z+]eү79ƪ1^.Kon.ucK}g/U5Rd (R Documentation)rdtext.tex.latex.rdIxXN0N m `LfhRh?watj$a$O%Hmw)7vUvϷqB*{jV>pBn("*[ >w:r}&tB(Ïdcvp!+Y+m!\Z1|bOr* _*3]|t( `4 43dDp6{Lj0Px0CTt2L=kdǀ ԾʉC>cOJK)["M<.-thHJTGjG4^bvX,MmY>Sֹ Tn E@g_fLNyƸ@^pJC -m0]yC Z֍g'pۀBȹ%!0b%M!6W`UGeYFcR_F˺*S8(|n( ߫ޙ.ꝅ. O%_]w0SJ۪u`Nmf6*2j:㹤_5c[b EX@U&@5dUt!Iij$ZQ}cC @eGe /{/Q}9,wf~\sI9S{gPSq04LӦ.粢/w^QO %zv/6}vP(C^Vk~LХE r^~KWu&:O\O HTML (Rails)railsrhtmlerbhtml.erbtext.html.ruby>xڕRN0x`JH@CBbWCTmbJInJSˁ9388ReaiQ<:Ӱpn9wY)(Le!ۊ H_]¶X? _{Pώm.+eT~M]&0^>G s{IH꜔%)1Y!H)J)>zf# ](lDyFv,]ԕ%~N^ !(}W̺_-I5iz{^Å{}_O̾!K)ȗ69mE\gZl JavaScript (Rails)js.erbsource.js.rails*xڕQN0/4NJ@.+0Ȑ8Ȏ JۅdHX,>\:kr{6[ဇcvx]n:LV[3m;Qm&)ؠ壈nE瀶u¸C\ՖN SQ_ҹ>N0Win)/Rh$Vh/s:btٹS|VZ'g}Nj#ZV5aӬ1w{/v1{J8N~ItSm 6+K㪒wg3b'.j Ruby Hamlhamlsass text.hamlxڵVn0N1`RIz ތ'41[XT1$&i _Dn[e >;Us,tfBլA贛u> 5.w5t>FUp9sjޕSrjl AI>ib4ty:] o)ӟxK ^LJ3.sZ؏ ~҈@mPndNPf5r1"joo`aܯL_+B/uš%ĺV+nཧ.(,Tr%4(0DT\S}0ksHGgt|7d /,!"Լpyn4EM)`]_JUјF$z"s篧,NUgfO*omk٪k GbOƇ^ňWA;j 2,fKs/"ۦJB---'Q3dpGs܀Y>V.ho^jWh[qg Ruby on Railsrxmlbuildersource.ruby.railsxڽWo6w>um t0)Au3:]1`>{%QPTH*7g{GI"-mh"$y#wϧ3Ŋ<" R&I/෺2n ~ug׻7?n NI2~,ܶcE$j~{r7;Ίټ:s,`ƒ8c1EH58Wڶy˸jDX䏃vɸCΔqvvWmV*ܫn~d28Ow3[ޫ<N1p@=&dZ}-(n ӕКKՔ<firwg"ȂywiK:-Oq HA^PEDŽ:I&=Aܪ^bQYMba}EdIx]49֓pVvl"IRLeaE!V,QSjLe >+u8nB ! 6Ȍ+= xS(Z_^8ݻmGg}-xѸE. ߿_ϋ 4<>|j'/4}H5ޓV_`3um6 妲pV8ܮ!u "_X0eI9魲<8|Z$b.-l~xuk5?+EimnnHtm;."7k&ԞAoU_)Rr㖧?-%v SQL (Rails)erbsqlsql.erbsource.sql.rubyxڍQ 0J "-=@U]M[lssгo0ޤ KK8ubKM*%`:4u X֭)mv'"-+I(hQЂ[4XSEz/f(~zQRy JN oDs I>ERcGVy,#߁o6xa3zZ5Regular 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*)?\} xZSF( Idܤ$SPBM'¬eak%WyWVZv-_дE;~.M20L:x_t,ٔ{Dک\d(*,`>P2ZJE0^vk*@п^;kZvAxmHG ̲l#0ˀ?VhlЀkc`z스xNC\!QL6F qIU:a&2 u$HKPfoE%B8dfjPCHWwm6TЋ;ط#'`jfv*)B iBX\x  7K ]‘nx@g hrCU*K3 ir[,ZUG<@ W-r NȐp^SRZe`Tt$]TJe P-۪~"vP4ˮ4ɲ*dV*Oth]j%hXVY6UTꍽYCYRSgp9S𿼖˭sVfYOv]8gOW CY(ےP̤mA\nNt i)cӸ}C9%Õ{q?迅sT}Lm,0D?ġkQak${XlW!h:Mu">d&&Z=$ }mx(+[{,yU)fUK@ma>l|0Ԓ"NVU49 Mz6S)i#$ipW 8M,\Pu(Do/<Հ3)-ZFD%kc6h;dq?1/;k>0<3Ф2 i̇ uc^>*prki.yC̤-9OK|ΜsQ8|ٺ>Iz'7ChEސa39Bb`V@y*r 4m-P@A[ଏǶ Sn Tk 7CFz>1Il$ct#% m_^m~yvrs Y985¹H1FHG>nj9K9Mxe#r`J)`yz6F c; 푵`?aPs"pMӁ90f's .2 qJ}B "mqLXri1SI Ufj0W$ܱn#$6&,xkL6^̐ì^7IӸB|=F4O׹$dҘ&AܹEJ"LiUe9] o$3>~ +htq ùhRq5+/`m]k[QS,O1ݪD;Ѫ#=qN993*5#EW,×c;逝 8`w(^l} u;StaNy=棃Gm:\>bPs?Hh!M`c3Ix>s]#lO[\^8W8~/Orgk52nO+u~h\jb]V>y球] o].%DR=*U/zGERTY$JB5= [%~z,`ƗTlm`|9!fdyD6kVDP2$M!\=*CĄ)Q|Jv/] "@vz1lTQUoUlOOA?}2n|U[_`#0[>݂잶ӏGLX4F=]))?odigits(?:[0-7]+(?:_[0-7]+)*)path_lookahead+(::)?({{identifier}}(\.|::))*{{identifier}}!x=z6N̤toqHv]e%ҤJI͆&Lҙy}{_>żH@BYI|1Ag9;B{=T2[m\T[]\vZs /~Ï |PkB) y/Z_Lx8ߝyg:1'IĀw `WuՊu\컓a {AVSmc⸶nRl}20S) {{S?N4'38~Wfqae9u+5i]lv:X=!)#L$ڳ ҺVb[!2&$0HãBICȨB? K}\X,,x_rD'? K4dXdXɰD&~N%>aq`A fu+mք5tTgIEJHT|K\1@ 톌FI&Ia6eє 땔 ~WNrz3ueuVj`l9'l VT\׶e͗0ۧRSBĀMaEe,WQ$?Jaʠ)^SBjt}kB@[[6+N.%s P##Fb,1Փ`@O yumf4djj۠=#4 0*MkìOx =qZWu=W߱|P]s/wYڰ., K<>a _>z=q#Ꮿp:P+Ā | =0& CV2z&QWAf0̛\10Mq 0o'h=4*;^>-^3ǝXC(99@% /.(؀if,&zO!ĉZs L = `E>zMɑ!Q!󉄴g(8D Y@K@CcqĬHA JAq։ !%D/UsZ*A"9cY cJJ ’#'1?QHOˡ% ᬁ9JKQ՗(D*AW% I!ݐT)H$LWEp]&+qJE6zp\ @O!H1-Iz>J`%CX8FQd$ ~șa"hVƣH'z"IN"'Y*%ɿ"z|=89݄ z>DmU֠~K8ZΕDd~=VV7y[y?U|6W0D Õ ;߿ws߁a{eycĂ?Y##G\QRc 1,?JC)WX4 ^$ s9V M KS*WR"`Fx6 Q1?pyQ GΕO\i^ :ښetR3kBSb#\vTu(>ⲋ8p` BǨV}] c}5ת2p6U.U00oT ?9 tFXzqTe 4Ồw$CiBK zIi7ۭf.]R)AdC=]Y3snU-w !Sӂꆆ^Ga|'@] _D]T0 FR3$H~C6&ObQrGe~%EwۖQu+} CqCI⠨>XQGs; j0$3]ߖs=!\zDPʹiiOH:%` b0V2]>wmL_/;U؍Y屦mU,8whah aD=íRWtXLľfCX\7R]_w_z^9ƻ.R]{tl0nWc`'V(遵Sxba(]Џx b鼍>? l>²I+wjdc,څ9/%I[fևt۝&) bc5Rf0Pc/yjF>N9oo6E k#xu}tBnYL%z[4.[sǔ947ev/sK͈ı8r/G$fh&Hyc;7qpXߛ-1d1=\ȗd</*{/:zA⛳N)xL wGBJ$&%6]J9j[^fQRt p+X9|7G3h`xi^,p3E67VQօQ>)WU~!;$xzьrIK#ZV[[-yElL~vٌ27Fey) YiMpC71TsxjZ h G05*.QI};9(RSSHGN(BLY煅dRO/@Y lNfԎǗc N0(Kٖ}6VV B1Ƚ1;K*J|Gmu+grcWc9K-?Ja 9#=L)",Bw~YjKÔگ3N.2saGQX\Xa2V.&-Z\Q)N̚hM.QӁA_D91XwT¡ʍ`'4]̫mdvZ0hv 2Mm7Њ\_J@?8`o<u27icl%xրHPټԙMrZ!%ILVK)/dV}ݵBqږAKnDB Pgޤ>s~jkXk*H[yؔ?:Ji70_D2ʫdTP;HFnq-̩xf@iz ;}2^Km=xå?oLLԖ; WNbtbCt3xKFLpG:z3>5e L$o=C?r$3Nu<:We Bir!M/k5oE5 $de4\&%0VtsO{/|Թ/[-ϟϗR884L6 4®lj;U`,+ι:iGEu N%%o>a`aҬC4*5}!du\>%Z>xte9,v𸝥31FS\S,Tq;mA(z7$(vO5utBHƂ(X%"85…: >eO9,#]C*-$:s@>]7 gd4HE1>jS&>DV)o 0y0.˾X<X_^W/{#Éؑ]X(UZNH ʪ S'rD_•cbi??hj>+M':dMpdоs͌҇Hd,PK}_K~8h?%~µ @VeA"X |W c, ÖJ JTדy?̓nNAHK:mZ>jŨօPPA7pFcAu:l C*2+ gMeLiHZ߅S(s80uί!rB׏Py86(*0nW(1ha&)GXIdoRYMd]*%6 ߍV !F1$oCzZ-"1gR[PZI$&[٘# 3w4~98&'Wx[v0?%Ҟ00b_I?f\ariniaJ Ŀ3 I~t;Kbt%OϏs&x1Ooa#O?kΚf anO>'Q?5i[ѷ̒L)N,6iDv?p-b'vbtR|seV7gϒXDc޴ķh]ޓw%-I) oJRBυxM>g&.:0] C]Q+^KЪf@%ma-5g̗c3 1v\ v~cDT [b7s}T!TEY 1ƺ*CȴFh羝:yDr:tfOgI!S_-0رfuҥ jL d05iE); r2a4]`z/蝾x,w«Ag8%FXkUe$ٷfk"rbzȨf ;}YN qOx,7ŗ|{|]+дNqjCXHʆ7ך򷊩X|k!a KMXjOA,]28- B12!;הO "UlU"GnWJd \˲K"(t9 ޔHPe Iʔi ita)U U><< Sr;A\Ǧb] TV6#5'd@mos녘*Qxښ^}83){&0sje*)i&\>=s,XcB-%Ҡx/: j夻pY(mUցgU{bk=P( p"|:TW: |{%5K V0F/b1[oppuSri8Zv\բ'+M01y}nnϝn6gح-6R_|Ú9~z['2chE/CpgϱiJIq<̚ 2T/n8!C:e_"rAElZ=q Ezd&*YSjL)2 YP/&SC]u*u(MAB_W:uELpۈyituΩWNY}I=9,̫];~{M= aըeg`YF7:ωS-I$_*%ㅱtK0.j/d\W ADXSrNl˲?.M$!;^FUE}w;e;.$ EZi;xʬܣw);)U8(򔺷*9{F?g\Jce`ۏ.VYi$>1 ;E&1PY߆{$Pyw5.dsnOLJ>1ppQ*H-Іp{Gu;kE͒w"BVTl pymm3eρ{w,2 JȪo%_&!PŇ#o3Y5xon[8 hb@* /I(uhWPD?ץnˇӢ#umA ; 0dXCc &QZDa7B$pZ*_lQiMlkN~\+Zh*< ;~{Qsy~\(ZP2 Hi642FiHULu@mٗIh,2{FVJZ;InMdLLbltnBjhjWo o藰l > /i(+&R:!5a5!/`٬M6C^{26T)cwA^H+W3qFsFn #;?rx gb򑖪=؛hh۷5RCfމrB*W.;tiW̡ZAW_At&hH oZD.Ib7˃ؠ GeX4AXk`e [ӒN , *q+7[7갟 R&F5k\B6.Cargo Build Resultssource.build_resultsxڅ `Ck#qPچV4$&@ޟBğ|${/0-JP.]Ն*l`9iY#Fz0X=W5گ._ѯq ֲ!KDdOP"Mv'&Ϥ% ^x˞ҒLN1rδW_t~Ir"|i X`8Rustrs 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כimɒ,ْw OGhf43vzdcGQvƑSڞs^GL5 9e ;ݞGnuB9!/>wS&ȜJo#U|:`t0y!xh:N;`ϤBء'buV!%?z*["NJ98~Twuºd: ߑ&^IѾc&"k  ~?vT̽)=)c ;!Z9#8 5.UtV1BwxQ%w0Yg A={} ԃ)(#A/A@B9 9'Hfe_6tqף!]?V DpJ$b$m YyC.A~! oa^,B3 ݨlgtCtURg_Ĵ@4z\+%\z j!*7Vn*!1Sa-ΛA|#vZz0tB; B ub\< gm6 YŜwRŊ\I10/a<|fzz )Wyfgis%{_M/-nv݈ ;!! ޱKN /\+JA!~W&Ψk^f ͗;C1__^ՓpB!s~&bG1,KB9Gv1O\' n\va?H;tVzsq;6'{N6vDMeT ưIjoAq@rLqe$pŮa9acH iȉvb/@6p}YSwzǞAl#{oqq:TN&1 ԕu 8P=A l0s1/ "r1Ȉ$s81Dq*`Es̩qm}ݣ XCp3b_O;* c8i{ɧcĠ5e4EJ.vx33)vG8~T/<7+_iOj5~}nwϷG%lZӬY52+@]8&.$]Lz\,Ac[\S%Æ[ւLN]b7C| o8]ifhllkMoAׇfj,hXZ0^_UJ_ yz:HQe?*Pm,yB/e!rdm4n$rP[3cKa>W>gT CVG_WzšYNtf _z1-jzSu}.Z3D\x\mV[sB֡OD^VUha\6^["CM,qC!VExGd4\Pl5$_O2׮Tp2̦B {eVfNv|H(5sJ/y*X>9\8@s7A7tsTpv7gMa(l.d?!3HLfp,TgQ& -j/>rI]58lm/-hFق?LYJ ukbV:5͉41 d>%ė`7ᖆyE7HCbP׺?ۭGKm~yN#@=8l:r TH;]})YXv\It !?.FjՃ.i0#yu[v3yA&;'1fqg A-N~p{BN'p,Aa!S$k&;f`2*m=ɯJ+MGu(2Z`UKXt)j-e@M鲲: bʫc&Z!eS.'hP(sg ҿCd}mjocĜ^淆Nw(=MpwuVhuxv~@7DϢ$x$:=s.W\h7f-j]k۞cRS|kbq)Fu5yo]n}aF,t6V\ 'g\P\$C:{n*/MfR@6ʄfҒJ9io4۩-07Q)Oha7:5.gCD͢P`;uAzj8d?CEk@aUYb'PJK֯lYuyc}gyf\YZgZh pN̄TW&&[8ս G.C]|<?}uƜFz >Ῠ(_@ 9}{'Qxyv/l{N&aH<"ʀ`o6?8#TG~-:wkG ''+A &suɀG|YixEBV6O⌗ Gp%Smu9yQi$d[lǐWaqgې\j(^]\[zu˵RsF=Gh8Z.GQx)QǷ5CATMso1V }L$c˜ -TbD{@e8m^\޺ _FЛ` ߌ1|3Fo TK>sk%$puDO|}uꓖVu,ܞĞR:?=CvzyA7n:Oג]kq};< %呛Mj-*4{4dm/n4Rd ;],,2)QfKJ*ܤ+ۢ HIă7_*gъ?i`cbSN MluCdײ ;c?/ <]t+or 0rhXLaWN#<1Cd` Ξ׿E:t&!WA͢>Mzs2NۺH>1= [t<WMT+U䘄voX$&Hzܹ6T1ȝ-  = Fr3`@7ԌK,@ri B0 {Ǡ?hc_|)=ZGh*Q?ř qlUw!`g d_\?C(T̒m~ ȃfCI<&314[51|vSQLsqlddldml source.sqlend_identifier(?=[ \t]*(?:[^\w'"`. \t]|$)) xZ{sSi\GdQᱭ:&Ռ${D)iǰ#p.qAQ5G?L?K883so;z-}oF>vq$o]C75%:;4.JK$ゑSPۅd 7dZ\DG}`0,&HRvIoI`36-:\t5Zd(~Q&",!>emZ\B2DФ cqk͋ʏ2n N:Ob>o1o?jE~E~&꽥>=?-U75ef 9N"_$IDQ ̜)VQ# f䪹=\rGf"Վ2:^.VpC>^# Mey]0J}Fu{Pa8\xvgc)8A-J8Z?0'FQjIg$,,T,|厰`VsX@9MlvoP/Z]I\@ ޚ2,ƢUoi2r3;w@ Aph'aj>wEūŗ\ZpuWP/{пx,.4Խtֺ(&}(bqֈPxNO3cϾ>=LR<5-HӊA9 ҩ(\OMsT!Rr N;絜Vhep"k:hDB~?ƌ2@2ߖja4ID^'8k$ QIPKceu:ʘQ Ò%!?]$96% Q&TzjFk>g'hVIo/.2Ŀrg 0+ 5փγɕ"ʀ ĽYZ6B_# ~9NH_Uk&~]NjfE IJ%Ei#&r#V{6SLswQEaݾSX9Eol"H8pwEp>3I|@)PRA+Yx̰O`i/bv'j/C; SFLS!) dġg2ӉzϸgR1pV :i{}Jm1bg2|qSItD+")Jc(t=e+AOc uu*{"2q-62{P[RZQ2 &#ß23dʘ;ܩn ޯ0$"!MA<R(YK%~ucW\7J}*8JJ [ݙ0:C~Pj"Ws ˆ֤O@5[4 /Sd 'Ё6](QB@ei?Zg:HԫH u` )IPs(«ң 5!Qgs:J}}}焸-$Sto 53"B/Q iިl>ڴv΂tK_:"`UIu朕l.8k!U v1vrHS*CtO!laqj~0Y4h. >蔍 NY.OA`p qjwav{Ώͽ-M,; QdiDczT迯ٌAfARϾFoB>d`ot#YZsoК#]m䫊Dq.RAjciM'^ZCܬ4~H+/"L"e:pjta1bq0'=9u==tyM_@?Ywy.w7֝0;tƳmGsw}׏{n)IS& ktH.}~^og{ۻrkc[n=lm[5ks,1_[F>~ m+]uswgc[dAؒ{ϟhf,Z~ HZ 3h^B&}Y8gANܵ4x 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]iGo[;AbrCd<#lYJLK긧{ݲ,ao`9`a !@8 / _VuwUWUW1#KvVK=T=u}?co:vz כ?n!m+A"?o%<7)kmlwhn{`wE)pw.~Zߨ}DKnzzB[ 5}ĸo_Kﵻz(x;b9d`dMfD0΁8W ϯwn3w@d {8   cg3E+Zmc2mN1 WM+9P&|tlh?l3 DlܟG28Ad^2{&<# .L-bm} 2(dC %kN~QK7d(OW E(1`%HΎ o]c!IU?L2`zHij`dFVGC_>yPa8K~6Χ)c[ "R*8iOM4_oM&]8]&{GºĴmܾLޘIu/FUuݻAOOCTmL+B Wx\oX g@F`](_%gp玅!d<icV SjZ'鸃iZ\ڬс|ױ `&(LQ.DhֆDvuT"fex+m@?fykoXmWgy#98=f͠p(L4g1 JySc&Mm\Ž:jA2k"elټ(j_1о7Y%u{xi3yUOor&(C++ oJI7eM2 H! v̨\ ^ZC*{A5ZOV/4~AkV~Cؠ74@˃{%E{Yz>KmJ(>c;,i_hhiE:q5YgH@G& 'f3*;R,Jfߚd]X3m-%*Ḍ1+jā}7Q?}d{@(x}07k"sMc o$&y;ijIAe&AELC\ Z&EeP1 h4G{z0[X3IouWC27%x# 8i*gM)%-fudIbwO֎ٹMXc5OBh`Nq @ifhvuf8=q 9H;R`kМ<a'js#[j$Wa՜ a2 p̆ Zk℻Lu!yv5K~Kq|0uryoH02v|Ig}8ExHya3 a$:RH3z3仧>] ;|.ͱrjl~aAxS0 PII U*fM1?][RFvV7Lr2*WגY* ;ȡ6Q"s]0zm5y\x88W,Ǡ`6;7Վjf&ySNV\|H7*.3Lm$̲g`0Y}oC7} x[f|(j꩑u&W^i,o / '{A*_V@>8rlnvTɳY._Z]r$pQ`ƳˎotlL15m !HlC)UkzĈV'lH7q%Jr؉;fILn]DP:@Qqn `dK^c+dl~Ƕ#3tX.DC~r+e{N*t^+|C.-t]|dԤ5 ?do՞ҾɅXg'0Շ C5dKFȸGFv( s'vbJ2 P' Z,T J㾋v<::] AkN-"VڽCCڶa1ˉuT JO{h*lHc@}L?gg(LlrV7*Zc OE GLDT-xxo]vǨU ͛XOkc["#B 6z:HBk2{q׼fMk|GpvPTR+We4' q61oojrvxxӎc^Qz/9AelǮo h g!Ķs;Vro}*rVM4w∦hx[G\vS:hڑݹ:7 j^ ިwѓ+}>3θsLɿ( ;cAOI0t{={=sӚpcjSZ1v5 h(& c2tէȵԭ. 'B1 `zMvt$kּ0MENNT$fy4t: A+k^B @`VH ?|XL/ I7%FRȬsY`XJVU(y6wnC5DQvz q_ 0[|t15TYEERtaoJ⯗hR[^Vy#9nyǏXqxM>̔{^ c a^f sw @|&0 6qb̹#`.2cτ!]"F.QN lQ]U/Q)ѣ(  T_,V[T9$ZpV[1Ɂ~*ɧxΑYRI'Cv%(_86EE>2R_kk*V4*rDȕRr*MF7N?Hlf2?^aJ\vd)ګnϘ/HƛMqٖ[\;OGy0V.:F}Xj 0K)G3˽~jMF2M['3+RK- $PD;/]+1ܝmq=:e79-5[vD}g'\8>e`f&/E OxRn8};ņVef<0"+NVRh3&W!(cC!9*[oCw0&D*U$T*@+ޤD,Y$T,hM8.LZGۤR9Dg H$ I@ҀNS`$HQvWIjᕫo<ʓ7{2@SzZ *Ǖ78KxCx.XhL{Ss /C<[af 7]Mᕋb+(q:Ra97qp;dB*N.eRP+MC8Q^2<޼rRjFk0$'>!; Ž7? =.zk? 2Zw k u<~4k5S9:ҳZ{fl+:}\ yE,wAV8=Dd^[,GbXn)\q WIH@DRE5[WY7.x#퍐SsJGR G?kGVa%*KT z%Z]~h/"L &'885]qB_^pα32pd;P^kR^ЊTw~cYjⵊ%2v]%uJƮ* =b=%SZk160@{)g&/xuTN-ꞣ ?P~ST(͛ʥ|AgmN g,V֞"=iKiIkO"6{9ګ0p#"{oB{VK%J,XԩjH=+RE~AxX/, ­幎b-"!{ =MU;mwg;3*rc#U(]RYB*, =sf ͊R4:eJD@bUtH7Xf!wgɷĥ9ΆQ}\j )@ x;Ny;G+[ϑtd䶊td(ґ!R (xeg*qd\]..9Umesa8|a`&X53J4=tpc+!?DH թXªR2t\&\AN\G&@T#2b+3EU_Q!S@RvJ,@l~w$5n!a` Ŧ{tߖykM;ޣ}0+ aŢKuC5Ml%zb&898hSA=]2m;v-eVux!MB1^+38 qЫp Ɯ7 L"nшzߦpf'K10Vl>2\HmԎll{Qa?G`yr$[4穁;3\Sj*{x@PQ5456+mD]=:k%IJ)YT[K xLgZsYS)d3J!!h,mVK6CD9Yvz]Tl܅$E2\viȆ ^D2f8( !/s,:!كxv LHg,nHm 5DܥV5Q [TcvAk먉mlb|~1p:*וBi7_g6GqvV`kf3 i䠹dfP0Gzs'"pۺ@."{n0uY}690}theߨz '2zW @?w6Q% 50:TGM:HYؑjl, G7Bourne 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= FN-PrSZX 2PhK^Z m%Qq$c$! >ƎhF#͛w͛ 1Xc3:bzV޵ 1#!XkuIr4h]P 3;TJS5:K2;X" :礠RW>XZߟ > }cp$ppBZGLz>癮;FÌ+˲ZQcp $#⬬6),vi0wF |̵acib؄^IY{FPjhueF Bxr.GΉ&s?Y/1ȇ<‚ZpAiO/GO?f%xK#r(CiBtR1>#J'yle>C7Uu "ӂ>y(Y.|%Y m;]#?D!=γ ;`qFl"CXad=?K—&;ˤ c"TK&lD0e~> 8SRnjkr{wh>!9%Ńu#R<z.i:sh!n$DlV6i6w+na]s+}|TFh\T*eR QhgCD ŋ `[/iK?͝6әBeS2~%<ӧӇ]f O hő1~ \M m7!1^ahA A Jp 6oD"±/fS4Ս}`ݼj57@?l=0a'dRRmnRWbx1Kn޾Ÿ"wx0QTձ =EƲs_j[l46j՚:U𛔤')SM5X"Go(.m(DBg~IuL@G<^ǷJ; ävKjŌysLYW%Z,p%6LBj(6#DRi% t^\.w5rv9:K a;fo8jFR20%T\*j_4 ՔUtgf,4t4֊un:ՖG_lb``mjV\J5T^#f$qX%{%ef[߭7u6 2ba3 x_S;\iVe)8N9O1Q[v:ZS+j8wh7:F7.&9FvZiCbs' A Pmp<&Y`2/a\Ihi6\t彆O@1 L{ʽ]l= 0]IB`.'@'4T3v{xRUk[+765m֦ߨ꣨ ^`=r{`C,޾rob\(}'+CDaoRdXiO,I>0Gsd蔦VjfU[$"~-T ' l5ع 3>ѯ%J X@g6&anqRK 3ozT@)zX큓X~n Q$˺6fG]tDgKOiD+rERNZL<MPi\cs?wy*XqSS:MNXڥZΥWICls.ur3sp 8R :OMhij OP.D<*-2DAdu6 Y4QC33Ū?S,oD]gŲCJVLߕLr;igK`s*0'ܰ|P{R @*d&%>X<=2YPփǏ\$<qy#^kȺw 7=f DV W% H~q.5 yZ!B[b[ h͞d|VSIlE8yƚv)DnTD]2'UPWZ7)$E`*g:N >41"Y+U`IF4G, so֐ {s3dP:ͺ,z3y.K{Z;Sc9~EV&F0ySgtFYE3MN.P%i0u>/pMlapAsSr}VЩ:w.yS|n–7q$Kqs ^kRD(}>M Y(̙ Ҡb"a o17 h~EI{dXV;VLKHZ}HKC9kyYlẉl̶ͦw-i7dNE%[xOD̥;śrT;bnh1>7n"zZ>̓ecΔS1ڠfbţrM͑ ~Wr21$Ԍw$bm9- c2'!ަo\RM'mfdgz: X]Z .&Q։MJG8 he։'bqN$osG DDČ Yl9l[cӋ-DdbēS}S).$D6 9l!VjL׷aryJ(Y<t*,Ҧqz5+mE?%+>!~ֳex6|q L6'B]H">Fg&RmbJ%2 #b8S͗t@v?M5v-SC:C$*c`tbTx< -tfD@p.#ܿ3]ن>KGłX],6x6>67xzXGkQɑW(^ c)gn9l@=c ک%Xdis\<""OTM"r)G8).Ƃ¨6{{m1mOLT}m^WT~}EEN8d OC0=4Գͥ1{%SpyaJF҇i#\+U'FtigXwk2э>Y$d׷jȤ|]{`zRAV>E,fzݍښf1ybEkeV`u=N+)gT0iR"'Fb惮hv#*&=#*hJ4jkSJsWTr|q88HtњVL7#&&8%~>w\_}@*u@LR 69Ey L^);7SoC CBUJWBJ@$Z Չ)M-I۷+lqڔ6";US$/_Z^gkYP*z/}mN^?X[ު;Y߾IWH7lGW()Tгzᾥ^ڣw?aF>R!?\)H A?E|m-o/.e畕 XK|dʎ+0P,:UTQm&~"`Ω'[-d{j],Kh&3{V'7Gs:a} қ( c˶$,c?<!x Sҧ5'jg]n0[{EEeMt6g32UԏE0ӟ`wtH4_ bzryVXrRRV<9K%~u_ \%8))zR)N2R|6RO'Q%*/rtlx!JHAF1Vu+ i46חdcjDJ" <%Ѫ?[YX Fn3:Z~cOa4&tV5v=k}$<ٿ9y'γ?S(R[\~1 Hvh/$%n<+ims-)>_ Μ;vk_h@d76K 3]Љ'5eSWăY l+u;:bG2Ae!6:?ŘY;hkY|gjOmy'έTǥh?aLN{QI {v|3|<|\|)x]{UB ! /@$@ !8 VIk`ʣ?{{I+hO_.MMBІ4OE"f}~˘U eJ1t-:q!x۸ըֶ\%;gKJ5zܑU3dVtlM;i6"(p$O拡G{(R;#-Fzy\h&Eg:]c.|:~ |:>ɧӫjEg/>Ago>/mо!@~o§'ZM6}Dk6"Lg6h'˴TݩR' /~zB \x4C%[lfCaԩ-K8Ηь 63~Fa#Z8u+zx$r~> ['l~p!.=j51xAßv{Ƥ{lF"qq!z.Uy|E@"1kʶ붩 :!&Јu"VMBIZSMN k4ѝR8L_,oAY_<|^CgtJ F CŇ.ZSV*|q-BQ&۽*_DA"F7_D!?꺬2-l5fЈ`_I 1ԠdJOLӃG 8= 8&} `Ob',@> iizly;gё0ydž4V܋> _ Pd1a_r;i{'Xt|{װ M_Z{;c4,2@F 7w66B Ⱦw6\,=R{XV DŽxUC4KM aioR0t vp)x>49hXiЗhX075&2M7k b$ Ê=VXXzop?a&*mzTN,ҋo;3X  N+83o83-1Y~FMqRս,K^St.E6JEw|pTvn!~j!᳘M;픭bX mt+D{V䴢"7[3HnEİ5\6PDoH&RâYSePeEE$z4݊aQLM BmYSMPMEE$t+rkQ~%݊QTDI"wҭ}EE$ٮt+`Q~-݊j+btz^%Bno:v[[GҺU]ppf}s?qvS;ۛC͘b'[5)[B(Vg듥çMo `EϰFUvUY#'3uu#>9Sd]\'B.ΞuWuūe!blN404okFղiNԲqdZz܋Fjel"^01N| 9a,25xlL+1"WUv+kfxl%>ĖClo!Ǿ<]ᗵV6ۉі8ʕSsvI|ҊHqI9BX-SfV^;KfHf9RWW˞9Qr컥>nZ-=kfhfa0nፚūeJ+W-O~C̹Yяr ϩsPNs`LTHR=/r"C#؏9EՏv,{ 9"'9ΊvxH! !w1 ~{Ktө-;dsӡuQ4G|cćpl{#ěR'Kf~+W2ħx!N=!Bm#T[F8QT:s21OC,\!6m4ϙċ+'b9%Bn'X鴴'׋#22sUի7K=æoYeT(!SApޜhEcc-,%⥢D*Z/īeiNb ca[xa1Y@7/4XD^-;mš|є&j iӄܞ &A~-2b M^ܥW:v̜5:rw7zM{)w3juʪy2WAJ Y!2畲ljEu3y:"u_2ϥ]݂Υ] 8:d)N@7*eCw,C+U5HDJYFr0yZ\:WtMjw0(,afT3ygSMn x^\IVjFf+mw캗{ QuwNRf;K&|H2.f&_vuLK.[O󴻺<ބ>}[\^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:L4L J# `ԯ%N"A{{;nג|z0\5BjqEpm^N6Zx1Q)r'rڧrgrl9 JY9KJy9+J{.=9E܈/5΍lwmv99_Bz(P?h^0cK{۔8_ C<%ؔ:!$Hj[-9;# (0"/#x(IAEmIh{HRGJXZJDX)S(DLI= #;?4/`*x)!؆0/zs]R蘎gu"˩qT43z%h׊&"+>'ۏy6(GbcubyH}PiL7v_~z(UMM~K7:r%$Ԧ(t$HMzU/:b/bGxn4HvwXuhGlVjʣ2G?#rSwn6G eD(.6dagqo-2`cdžob#ClL"!dy{ɵ= J'W=fsҷ&cRfhQ! Ҵ]#8V[7DDP#`zNA 0x >Iȥ.a/"gHE!:B>ģ(Z <ߞb'ՑcChR'=Bqva4±pNw  '$1iuI1 .=U|9oOS~qWlLhMhVa"QHzk=($Pq Pm|?/n}}?+:MIȞ[(w 877HӴ :p'ٚf:ù[ Xեodv\iyV%>Vuܪ}QryǿVi«C" %5 IzL 8k $/\ϊJt~ki8Y)W?D63o-7+&sR-Л)\c=u3CNDԴC̒ڡ=DyG*׬̓ Y褙AS|?YYoЏM?- TN9rlMȡiԏfw&zC̓<-.vcC844:LcG͌B+Y#ЍR'j P3[˿xzfvi]MX0UyJmYbU^XjmfwfjGWJ8rh Yp*ʇTy$vHb#% qW6X⒕~*2KW1RЅ47" NB:W!du9@*6υB(Dn5-D<[7C?¨g:/jErTW{CK:M nrRyڼ]D,d8r5M'% Ί,yX{:t1U2姥Ri|Rnbnؙ` TA j)N1زvɡCYR yn4 D`7,o& <-FYF%S:1yqo2kP&Nm~ݹZ12Zs&tS;:u{UGűBQ{C ]*eIN2P`*..5*ݜg]靐M+oq d fP9)GgZ]( LӼ45π:Y#z}L-*Cf?0˭Rn·o)- ٦tI&n PW?ꕗr)^Ӌ9CQ:y{utNy{Oc̱:gA,Q+PsU ]Ά TKIEnrz}-"0Ff7O~΅{Zٕ+ye3w~w)=xrQ O==fPb^'2h/UʞAtW.ZyU>*AM>:v(bEk땂!߆VPJVJe_ r7(AtU]7 4m&.n THP`[29@ N72fwQoiofV81mUo`IWeKhߵ͇~;7ۭvzL&z]BS)⪊[|W]?f͑Ȫ\ېXrE -/p=-$>Um 7SQHpO&Q$4&d]2`C*`;GնҙAp9( [6 jctWS[Lk6^ՃjG:$Nʆ- ^u%2uWX*LJۜ Sܱa S=曗X47.ru_<[չ.F>K:^ (w5tk֠( ]lE`@m$,ڨQMƉ?Textiletextiletext.html.textiletextilepxYio6}ݔd-$Vu6Pb +0c_&-Ӷr%znVz`AQ&@K$a$×KJ\>J]]ܛ@:lɑd2?2bLfX'&7ô'#A6vl:s5_lxpқ|4O?(jjENϲ\," ]+u4J MG0m)_ݩlʊ*"*f(xitgJCIjMN5 'HEl/n avGDO0m]yI,U9a8CژL~tUMW+ =ܕmaow+-XphEAﲜslh3g> MjA ʄot\UAH$LJVԒ+u¥J u"VZvɛ'?GkJdls?G38BEndJ;sHxBۉ4JiOc)6 E4fѓatIME3xMڋSv)E5IR @W}N31'Z1I.%TaTu $z:Ϧ|i>@Libe07Z`3JaԪҾ}8ΐXcr\4 [dCTڢJuRЭ o%lШsB+gڧ C:٠X675Pm|˳fM dn0I,(S=H)iD8GT"mQ5曰m" זG:ObZ1e!":bcKqq{$qEzX!D'26QJBY1_j\A ?uϩF)_);`z;|7 VOKEk qE}@STW Bs{c y;1u^5ѓoGkGY}Y> lF{--!%E:?pY6@"9@)Pe}].= tQzGK܄.%>Vzj̕E;{Gw`mo$Џ wzL̻ Ju p)U3܆AT&އ._Uָ nκc~gsߪÏZr5*k4P_Rv :|h$T^!6K TTtр(ppD;w,9VuHJkoyeQXML 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!E4A W!&*^ s#;VA'k u>Z[Wvǻl=ֳ33.[s5xT2MQT2:MdZDdy"k:MIuCv4ӎfpgh21<Ͱu[szGmbʅyoJ|gZ͈t,xޢHݱm[vt5R]y(5n|E+խf{J DK@OK#p7~VT{V@S~C]HAC%;Ru& `Zbq'n7u'B}h̦mD$f Yh.e"p2+`Kф2X< PBSU7uWwu$ͯ`P7;Pf$//ySx\I?ZhfA7 P5 A}hi^wtS¼]bӤ;V4Z*8N*ūY8aPQ/ E~bcFb24u-nl=%BKpr,.1lS2B9㛜N"D6ASJJy+W2^juI|z^Jx)$xGYhd#cyQ4h1t =^6ŧ*gA<Ƞu?h!Ne3ILAE&X拳UEonmT6<51 Imki#`=Ma`=Z|R. D$8j'c Of$J;{(1l!v4CtTP ҁ+0I\*80=_:^bf켭 }HLJ݇q~.^jM k&Éۭ/hw8zvQM\F> s?.jL[X1 32i=_uQk?0q >w2);?P:'a"YcCtxCR b%ċƉ'v 3PEh;L/b?CJځ=spPU=`+1V3\ʤ5e@;C0!GT j'\|gR ̑)d ӗĿҜ7ZlՄKkЛ?A(&qŖ١ٺ7.ޚ^qK wOt wSq|]kEʇ[g^pJiiثk Ŋ*SZmYAMLyamlymlsublime-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]+ xRHֆ\=\ 2b@vvv q*K +lTcKY&}OZ>lLMPe9}K^ǭ\0l8_aBQlS 9 Mc0O'F 9ئ횶Duiq/|hИ)XXXEq#Q5(Hrzy h袤T D"@Q;zժz]o|:),h4rvVŐ2d2xCv`bgdgD9 WmyGR4b]ib-$KŨl[#YLbLgYM0j+4+և"nF݌x1y}GB;ZYʚ|ј| U!+=;};Vt4Z&'c&YeySk_ZWtQ.ꭲ^A8O 7q[;0] 1 7H:H0k5 vh}B&ܦ/6\5W|'Y)E=Wg 5Jy-5`+܁Ǖ{ڍOOOc~\U_.w+JKEC:\_b9Zˡh%;$upGv>C!k;;-z8=Y۹l'*Mk$(!kM'H W'$Ȉ$SLD 2dRhY`uA ^Z,b e"ĉ(%W+8|2t~2!ֲ̰ K֣Ui.POJucn=ٱr]e/Xx$$fgc/yV[ #瞑8 )C:#U:8-: ƞg]S[7T[qw'6sɐDGM;^(`q-ƿpN@uN( FKC4;~}%:4^']̗FyнnJt4r]!-}54Ÿd\i #!qb Q qoqQ-Ⰱ~ RyT[I+]1mw):n8A87Z $ng&H$Ȣ`L0,a%)&#[!Is*_;PbJm=0+M/+Q.Xv6tR[raN$>ߝL &qNBdd|)ËeJ,? }6?[+炆Ȥ^F^Uy@ߍ0n~[;A}c5҇|\qujzRU$ǣHբ~BÚ֊u`B9.aH!>D]G qNJTP'ϲ=swW̦EXv "Z̭e5h1I"p]e-D .?)t& }UpuݕVtɾ;RUUJؐf@0Oz'; c:6s&@Ya^{0lg߶>Փ0G$@}׷Jc@X͏ޢzk 2pYf}©IwȒd|ڭhQ?n_Deݲxa9UI".swmiu sfKdd[3K{7_S(2熕thb|D2?KUBZ1ԤKcݕ1L826ݖ~5V=yOt:&~?6{z˷MvMCzߑoFo7[1coߦ[)$')=w vQ W Jq¨ ҺU(1*wD|kQ]%"7Aܨᡆ ~.J =V-ꕀJHnF|Z8Zbx.EV #[v+z nH+Mfn;b(;!-@A9?±Z^-?0iAs9$DEy-8;kD%@EWذg G ݊Y[Xom!"  cx%X2٪^5'˳ѱxKq~q0!=';?E0veq:a ky=6ܠ}&sT:*88`Ny km`GEe9q:_Xmr$(@[TiI :tznm*F,>Lz!)Z_$! @mcCU5e]XSSo *݈a['od-94atN`#"<6FQRB#K|qG%s,\Ȉ$ x1~Œy!RqK\bgvlON1ib ١H!V}Q/zh;JܥZ)TݑRuDWf jdx3HhqS .'l%`"|3-ہĀe"H:Т8CDž}j&{v-_iAO<вLGŢ ̇Z]?uLV7YCEFe4*(+i$TG٩xRzϥ^d~רߛ][ZBuO):{W_ȒPxB&=?A{%Es5eV)wRSWr忩[ByM2ßE'e]23L8^R.CXtnUDiD=Wk[ t!N[R4ȋ5 RWNֈlsO ( plhyYs4LwH4OeeO!2}-kN!9`⺉y 0+l1t>c0gĉò^A҆E+j l[Y~p=;/gQ{I:ASǷrџŞ'pD  ZY~;e?mʻ9!⩁'OIͳ2FQ'j0?IyI|.f؊-߅tp:{J\'2aZ W;xKO=6|jR;2UF5;8zGu8ګo9uRA TTUIRzge]T۽zԎR^ը%͑5QO[A焦qF:nAdaadbadsgpr source.adaxڽV_o6E! kޖ0QjP-Hx}}eҖENw2ڎ=B6\/^uGrwǎv#Gv4eɄ~c^Єm 'OZ4nasѪR[rDfeY,<rqG (XNXι;>V1n4vN;7;VчƸT?2* `>'4ʋ_H,"y7v‚ gTqOj0G ҂0BdʲZ1B$3 M"8 xsx ~#kfh5 i߽['_g3:kSE[3bnLId!$zϰ'6ya' :ׁ )+P,ER@ƞ"A4 ?Ƭ߻nz..@~%c*(xz"67Sw0fEH1\O_R)EJ*ϺZ]s E$=4w8Ư&(>F?ҔU[q( J P,la% d,-bH RM }3L娪"g>+!YmLd+H*,g-K|ՉTH7"]))??9YMzvB Apache Conf envvarshtaccessHTACCESShtgroupsHTGROUPShtpasswdHTPASSWD .htaccess .HTACCESS .htgroups .HTGROUPS .htpasswd .HTPASSWDsource.apacheconfxrq嵓1رSe.[#S$$̗re%0$'1i÷Kr!s!9{\ؕJBwc====VOm|x$N#|Y=ͮ/{?GF#5FE2<ѣ_h,K,YȎ*sg[=,Ҍ>CJz>i1_or{@Ro4N`b<ޔlrߺOg 4Kok` & @v}b>Is#_ :~xn~.]y]Iؑ* `X4i 2S^6K!deH]B-O>m96f)m9Q]v2y(4R?[Dp‹W-m邮;A}=_; dayD a<(O(Ι';~i)Yr%Փvڽx\pnG&^̢0LA w <\5Ҕ JX\O@[a<˫VC;v89IzHV4>giwIΩHei&f][+O}7`&6q|hK9$OZ4Ni-(Xt5h\D{4Br3VKC|VXX/ӱ&Q]G<9΢$}y<_׹zA(BMI9Є(ϔòa14uIO(Ck:fph'$}E}\ <F>8uj,wr=I@ssG O4 Q7wW%m(fW,԰ KLBt"cV~ HzAB? 9J5y0I}ȧ 풐#bB@ V$~ET+/x.b Z`ى*0}(wzMCƨ$0R$ 9_땈.&> RvH}yU}! >1>X7`m:c>z^ UwLzم{**>).1"Nz:͇Zl ,08y€0:hU|m& >5ĨHq#Sr%.;|,'avo.l_/e*޵e?a>#emѥ*Vۡ*nrq4Dxڙ~d$TD٧Cysgc0sE[vVp@P *ػ?J7#)1Ԑ9% 0\wGdHzNU{E=ƲoV<hhVaAЪJreJf13F+:Tt@d%a-CiwUGm%DZfJVZa_ІtUB9M ]JXu}yv_0[{zB7B$Ip"lpzs(vk Gtś) # tg1cD5R<:) Wۡ+Rq6L4n~&D{OC|g`ܥ `{P+۽$Eg0Uj>] fCS=%M7,)U8eQhTM GݤnI$ 1DGW%iBح1V иB&y.ZZŷju $ D"*bHP*)R41IrKLҐIBIQF0Ft$SM#Ԯr*)u} Q;2Ԧd|Y}.e[?n0]5 Y9E%UX#P΂8Wc(raM7]A: si䦖`鈢Y,,(̵`5V H-|~c5 }9YdȖ 攟 PyhX(HٯXon(#$# ¹ ( 5҃0rQRNpYB`"nDiE@% j@ ْ;[\ @bM.aYi^|x1, c .&ayT&}E 'w S”irL&TKE \ٳ&"tv?VCCf[_MY"`!Л'+ {%c%*qfɲ Gt1ObMa)Ú)W$T &#ûXNGD>%hvT&4םԷ%ϟ&deǯq;cEPY`cW_d*Z*@I6'Qh ͢)dA较I pTN\e a2Kw@E;Is!t~ M^FmCm c-ۛ]{JQNX(]p+pHN#t-cߔ 3]+ظP+iI6DeePȡI;,#|f/b0s6.bmDJL#nE;HPB(0z[TUaT"j$f$)tLs+&n(G$l&ȏ]Ep*>3 ͒;Uq_]S,2!<1xVC)܇;Dޞ u!+&ŶPMI?*>3mW.HF\%xK5SWΒ$?3phu'D_ * X\RG/HHWk-\%qp ɃTp q: .XPv}&l [1 l1#M`}k{] ^}%gPF (WCj\U$kݠ4j"Cʜƞ7)*Az,aDH:dWm|Ɉ.-sOJԧI[w챦${$Y7IFh&>B2^H_?\\~Ev?Pa;>H} ~5Ql|9/գVb2Ϧ:p ܱ,r$>- 'g$z1rU3zl({4Nk'c Fk FN4l!bj\zudvfag`bfF94s܉cȓgc+ 4sFI?ƵP#b`d5&V>q$4 y&T;JnCb㺸u kV]~\vgbv:~uA_~ߐa}bj5+nW\_ +)+ߎ{CPDQ_`Ր$o ?=8R_i>{-(Cm)|gX?0 KD{?('2Cqq9fRi|{I7JI˶еojjZ;DEto5JAsciiDoc (Asciidoctor)adocadasciidoc text.asciidocx[{F6ڦw( "9!z nJoR_?6JVb}%WI8}?}}ݗ=3ҌF#4rudgf}Μ9#Nja:ݸl$9onkr]Gs-۳Pms3H<L'<3|?<=Of@w9Vl^ F<X3َ=$n6&Î~:o1$]hy.ǻwۈa/'~/{bqc$?X j;1 <ۓAa~˳zDL=oxj98Q8 #3'S`X'm1 'BP\3=8 Ӵ6 q=)Gfh8Fdl0>ɺ1t>(r_g!&+Dn ;#@9+ഝuLc] )7yƽ+8Gn]夜~t̮X$Z&zrpA(}Z3Zn 1Ywˍ*rF&qi kq]hct)4'6cop 2ѣCpDYNt9ln 3f93[_2sL˰mOm TҲdG0TlCo WBoF:#^ɏk%=PWSyK_qdku6 o90%+8ev0Ʈ{N (r?p*{ %Vjc$] OQL@~&H6l9&@rn9@3QMK-ӐHCpJam1z>dwA5@f-j-{1aD%IHWwg/iS" | Jo/!AO((Y1ViݯI~FUwZAjms #&:ܙs^mZC;"+ d8@@8pl/8pƁxfhEq9fL}\>+hL%O&,6mWxK0MrK.1#݊b"2~[FH}#*&?Ai&IS)\4,M eڨΗ4dj2MJ"%׶vF}"ѰX%ȍFF't{5kxZ-C,ҏJ'$=P-wG+.F[gE@u.K3Y5?M'Kebq!pYIuō;Z%XKQD9,Ohܝfmn}&2k%mFZ_(ZEl }оJs>u,qQ$vqs{sX͌Fk6Q\Hz$ bM VW =tce%4%0HP~ )Ӆ#).RM>Y D:HGv- XVZCuoaֽ,8/HG1Rh2u\4Q]ZpA|J\3c V>1/iW8-FZ.ow (W E(c,ɑ V l$脌pF?W|EMτN1A>kM.8kE;(4BOF׫_6eILĠ *dyAq(? 90Is>|r'4-'iEN:̍E`= j4ЮG _kD?"$_Q%miE_җ+'W ! u$h4 ׍[ecYxXML}n/l,!kN~:Vph,"y^A@ПVAП>˔S4@p=cݬ= (Vd@b|_/1Ry&U]>x`ޣ>^\x8u{]xxm3xi8SYƷ"Ж1v#r8}HqԎ6TaAAa"6*b.4xlYN\p` s/9"!-7P;Qw-5rS1{*vR!'bgGdGZpe\-(Qi|ie܋)%q GouT'KuEl՞ 7;9cD}0"R&hhߜ_YސfҹlC64kZE<[uLiNSpzrl1*h*hUA__O([>g7ӂAw;yASA-AMY9k4:ɺzr+ģPW[mN]n@*~D\-z8]`~ӳZ|tWˏ#B8'spF wV Zٲ85"c#bQ_`/u$#׵;C'N "? _5;8yuژ:/RС2zʎÆjf"_X\̚:9)oD9'~|IʭoIΓ/-~݂i&Kd ~cbI%eJ C3I9- 3W%HA n9zBpflXVA/uR eq6p}ƅ>LR}1 KPױY++'{_BzV1`a+O=58w61"ĎđW@f aa^2>Qw38.p%nQ)ÆOz]ÕɮG4cm3v! +"aKn\caJTrM8.p2opc {Knqa %Q1N[XưNAH t%ŲOV;{8+8g :w-C?IIAaojԩ{ 6<mCF!@ypmNq5-R=WUˏwtYH dIiř,^C?yc~T{.e%mWw^qXr\_z|GKYϷ^JAsk'㬋g]m7HPA0y "QNHA :TE@_*~'JE[or":!-&pRwC}mh3ўhӯo* jZh ` t5LF@ /S6 J2c45MKL3Dz?*~Gӄ/ͼl"/Llp?QdՄ)6S L2 WE!Uư6M3%z3wրA˵^uv u}իlm?0zGo[[,׬-pf8pה t(&>*_b$c)Yh/]x'Z@N:FW]k.ZR80!a{1zG,A4 /T;Qr7ErX[{7Dǂ_e]ῆ^y^3o갮]Ec[٘}Xjy>^9f,u܈NU̕}g/ʱ4+kd7 >& Ǚ\(~yzVj>|(? )@p6Zj0?$ӯj$kDG,C;{&A|8Iz(N?Ձ^儸~4m>#$pe'rtkt}Թ9t<)WQmAas $7(ޤ>PWLX;DcYN:  ARM AssemblysSsource.asm.armxX[snM;4Ӕۮ:ɲ;-%A .џDҢnsH|~zj<D&i^i,^7͹y湥yMҼMsaiw|fit\ZwZź]}irE=*߶ C>wnL8S\U_EjS`¥N cB~O[aqhfj|Qv)aIsDm6JVzNd5dolkTkvd\$%.OL27*x׮;1f~~`2fy&AR*!n|N#bQY6Ͳ "U /~C߭_7FP2C8"rFvajtD%#P 瀻 $E Gԃ>42) yBA7'ؔy&4b!@XTՌO4X \'WlgœL:)&IIejH` X0EԐhHL5LMxۉȾ TT4ayGR+ _M؀H1V掛+-IaRܥfgy-,m*5K!8#c֬!J%ʾF\ IkH֦:Hs K L&׆&J~փ:f`Wj&j&ףsUV$sҗ7WZ-ij8  $W vS#1 hwc%v05\q]Ѝ [ukqlJcO$C/CiFE'⊗O+j $Oq̸!+ "WO*t/pɚgqƛHU/J2TJ#nSc'+]elZRQ13곸6bqijJsRVc;]c !s32qD4W6:N:|Xa'wL'kT&IuOeCW_rG ؑMyZ|Lн؈U%ՆJUï\J *heG| 1 0~k./fP]=?A?53wKVK*Rm%@Z&'cҬj; qmπۉw꧎>XYLu_YI8?g/Wv#9X\}]^=}~· [I4a~;I/PW*AFBVv'%bVO PV[h*n@={qTwh?>e|w?-pM~`td(~z\Rz6Ȋޟ/z0w،jz\a*D41:+=3 >U\c, Lq],EQHĵ8DT;ISJYUZ0$3cpF z1zq%buʞ]^?܏'~LN _㩡XK+ R*x:rF2Y A:ot( Og]ix^cPwucDQKS){y2M8o6]|42 ,jjqPt{ 5tq0:WvH?:08!9}2 F@ky^]/Bk'GԍnN1_nK:Y(biK"4  v )AP$溶+Uv*>G H ߵBv-N2OvioE>A##P%9d ]Fka؇ä4s'!K= ifH1{"]g*[0Gi\Ǟk.dbx- й&4M&TͲ]\2*m۰Hp@KFF b;e]C#YG,Jbq)ŝK!xz2ű6MNgQyݶN=, E0rușDv ͑mx)1nNƂ|*QE(cq8EEI9LepzFgmZƑWvNs\!1ȏwG3t珮.\ $ ^JcNT UbLح]ixji `ZA `TP)~kڪ>5{$LM_n;4/F770IƯԏ=JprOlj 3R#uv?t9v/hh T5g<ĵ;j-m _d8"T2[KV+#aVe|D:|`,AQZ۔xM?xd9٘uTY%ӲhPdd4*'1 5EŶ ņop\.@]a]Ȯq*7m1 OȀ4+(?rGY8 ؐ} IHĀUlx&ƪ =6VM{jJ35DžgS ZiG.c^ *3ph)L?ŽKlgYR f&ϑ8/ӣ{=#ߣlq b(|:cBaiB|i6(&" dS?&AKyBkKp$Mj7*A_Oи=y#fc3tyTKdC&؄?sP$^u0uhMmQ]6th5y:֍Ӝzn-m$B?Ŵt.Țiejzj%Nf^ޠ[I^oVo٨I VA;C+ŎoVj}ޏE nc.R: ʹ n,XPe #0z*Ray^'ӈUB,֏~}*[!HZ&H![Pj9uz&{fEdG@ƒ 3 S0eܷyH k*4 6W^2RMz.!`6ZJCq 7B&WY_&Mhbs:F9$eaXF9t㰮vert8 9>Xmv2P6+ryƹ't-f mUtd~ |(bw,+_pt%L".ر=fGxt. EF1OW@_g!Qg뫳$Jo*q5O쏰ʂQg)1t*#| |RFEY@|5MV7Q!q&!08W h60⫂)2I>"TG,{Cw^ # >j"{(5OۓGz>9f,(*jG6ՌϢ4%V#lNV<\%gՓsNdJIZμ27jʠD$ qॴ:<{{>_C˛w>vPp޵Oo^?l%dsl#nK8ś|[}B>] S 3<7=Y˚n&=M{dixʣb{ir;6 xȇwDэb$$qЧ Rb,WQ*(2Ȱȫܜop擱/%WVI<>c 3Xlo /Qr|$ǽbz~&3ܝ% Toœy<[cs,F)sXpԱf'yOhEŀ1]f;1[!DhMyUN3;v: ޸(}ݣc]Df+KUqY&AĞt.#YR k@QC `rVXKAOUSt&= @>&+rmh89w;#vF g7prJT ϙAW\ڲݮ7E 38*Hs"W-:H([a2+ST  fXNُBT?._W XQʅH"΍)PXQJn)Kg$࿕qM!Aa+CB~tշi]1~nhoh_i2xMmX bV@nH_j>vV% T*砈Hg>gO&^C'[/1W䓡*Qw!D2n*^:FKhC~9mc=64 O9>1L$a-@Q)[ u< Vvm2EKg.ŻEpM=\t[w93NN9/_o988;cNS~qUDW8m|)))))))?)S~S~S_)S5o89sހ2߉>3:E:&b:İUbs-dwψTE)2-dgG zgΝg VAŗt/vF_Lj!y3iY(烑M"("b1d42 >MW8";_|L xW PZt7G HY&sj#iO`aGk˪zFQw%?i^"^x5fk^ Os;@@RlSDJ8J=ڌL|Le-&)[N϶R YԔ/G=,Ԟ<~%3 yPM?暋g`=YQȃ82. "1u˱`XMmW`[S:61ZWRxxR-,%ۍ0M!ÞR0?ca;"D*L bLE_O}Hfqk#5T?OU7#!Kځ6sABB<2QqWqT^ml^gQ}/z rh'P z $ BdtoÓ99h6760] C5P@z:"'Z7* @`D90i -ĠHHtOVGE"u \_SɺW4,UHօLYШ\@H{0\ >d$dGU)3g`XodAF7Nt` eϕ!8Da]2L븶/Z 3AK^ \;H9Kh)o20TdDN /k9W&PY@4/Ksn XJYFfLAL5ywDQ;~Fg4t}:ʮ[2ǖdݽnCuБ)[i9rIU&W% /::ΔhrtcSJA8; Ѭc=\NPC7ܡv\ ;D7j$ m~b Mgߧ+0*pޓ HˌŚF_WqN11t)q$QQ$pi1guM<;q KO>#ӕ ,Hy8]nWRqф24:!o n4ug(!A0 R6łgjPOez0SlXݐ%Fo)8Y˽[4 3uSH a.y@a`M`@ }&uAD4Š gD1%N_ x,`OyETs7d,-d=eRac+wKA(\#Pb5-$988p?*~^mB <7sVqqMX߱>z~!ٿaӤ^.byv!nF=cԢ佚=}5%0(jD0@DJ7 X_TO`H3)>B}Ʃ{: NC \%X_ndSQDaX'CcEһ?hjhh"t}V m7c@."@}Xe&B1Qd|Q c+$\]('&F΋ME&4‚e@3zr#(Ini'iRoL,fMWR2OP3A%Oyiqb d\ùaBgY0 B,F!(,T+cce}R>RL'T | ; Ds7ua;)f#Zn6,=2uS9dz:5tlI#P4q E[M#: $t]l)qg#d"M@9:<<vnywX![+ 8cXxT gEqIOknzQE؅ad?[O{%xR$C[!s =S~ghl5cӕxL7*aS{sQ0 $ =[vZy;O4GI8;l/5Nyj(K;x.`Y=$kFL`'+8c71q#tfQb4g49ҿbk.5. Q ǬiҶr V;dIˣzUKVV $0H߅ `Iܙ\ Yf3>p&2M}DA=~b" 2hjE;|~1X8ʈ_*VƉcC$^,Pc gq4"Q U˹5s"x$|GJ #2&]/_@ Ac}&MMaL% w? { .xB*K^{΂BpׇG5IgXq?otaeєG&+\Mjw ^Fk4}E-[blDhk h#}]: J-qnA\MFf} d#-Ua YxL,1LƛD*-Ğ-"m*Hۃ [V'N^mhgY?L F_'!#Ǖ‘/tODwcL?]:m&'Zlѹ-Yu. ONo~G;}f஘V=j7ft Ѓ%LAͿ(vlW]xej˚i {/HB2X.^8Ga-=XVOem&ÏQsyXcB0N6 75`-関{c_N=qV>vDɓPp+Pڜ4q5N!n CGia zKDW`]G85Sp$~(]k" z`lqa\ny2(q2y+ xh4 eF9TR^su E^JŮ; +%_ACҫM0u&f,\9;EAU+W,ivj54F6}Q7˯4irY\fYu2Tt^bht!;\I!nҍ!ٛyM#P56~4~ Dx!CoHX Xo⊌ٮ Fhٟz> [) ܟ)2R@Fw~a KJ#O=4x9C(H 3b47" nO鵭ڥF uC[!#.saon*] fDs q`vir[/R5^MSh᭮[)n*m~6ik^amڑ槭ZªuACưH 4Џ8 IIE:&B[IW?UuH&=_Z»*ͭ&%<2a }G-CubmSN?e# \G])G͝c=xN4MRkN̒8XUK-@d.r¾ I3 USyQ\|CF..Wy %ۅbyapBBGIЉ/(PҖ;V㎑5[85$V}yc,I`5w\z+[%/uܳ %G:Ùw/ `N<9"QuKw~@v;K'cvR"W?F.*t/VWuE׫y9iWy'[@xT@_܀ZE}^b) w`/;qyXpSB 4#xha0fC^1<o(. AtB!퐽IW.. qDwJ!QWtNQqVժwjBPE)8ib9$]udPFn^(uYJq" y33 o}5`9^Dٳ ##"~ kt\]z}0^p $NדC0cڀі&hv<=3ұ (.5s#g2 WĞk!?gj$4cÐh>/^BbP?3z<eA,U}bxmR2@7㽇(NJ[ `Q:F>JahA0V/.1+4~ɑ_I Ou>2{&6G:ŻVd2x&>{;GR|P[Tŧ-]N@(%[id#n@ﱥU9z)Ht^پU!K/nܼNn޸}|z]r;7[,B>ɽ޾ ;wo|{H L s<=D>PGIϨzFu;b9N@>Wj-^cjjP*TvG7I.b- , Ÿ*y)?juCMake C Headerh.insource.cmake.config.c identifier\b[[:alpha:]_][[:alnum:]_]*\bfxڭSKN0Ӓ C$Ģ]@ `ǁ(9TUS9V,b|^QkGgTH4 us 4̹7̹ؠo0hnJW}j !s. |)U~ d)n*,)(RqUAu|!̪8C)œ\S\(^(xYJsʔlˤJf8 Ŷ0y+:8 ~P0VφzU/*rx>r.wȚF>4smWpmOX?l,H&:+,hαlnm'K^OVvhl2%w>P:]d;CMake C++ Headerhh.inhpp.inhxx.inh++.insource.cmake.config.c++ identifier\b[[:alpha:]_][[:alnum:]_]*\bxڭSmO0`h_?,.])ذKW4Gf#JuswOoFn'T Q `P=0z `o[eql@ЁSNj@Bn ~ΗJO2\c?PlN0 霗Iy\zѾ%$ߓ^̲'|*$ >rKБ##cqHV wNLIUE)h7/S뿨xanBJ%X>jvQa'c{BLatm?IA0!%1tk!m=e* 4qw^8-92f% 9v.Y 9֮v̒<3wqj[*W=\$]) identifier\b[[:alpha:]_][[:alnum:]_]*\bunquoted_argument{{unquoted_argument_element}}+unquoted_argument_element [^ ()#"\'] x\SI}x( bYCI<0aN&Z_=ݯDզjmkv#NnZ6OO<π-rfAQ sBpӴ;k9աp8oMJg8Bo8SQyU\PѠ6 ˰uemfh_߇s G1icuk-r,8~ڇihMW kc0: Ah\)j4;k7lHmLh6PB1J6_lHNH&BnI!d)۴6vZ^ku[&-cCdJhccCt,860n:7ێtX#T[¤H11ЇTqN nςc6yώa5 "ǧ 4>fF  -`YPv?vx".,ԍAҜA^P:8 ?i@9Ö6͍&AZ2f8j1(<wrqrPbQ/y"H`>8&T ?q*1p!E^Khkz |އ~b߃meLw%( eaܤLcX;, +s'_ywЁ\AưzPnwx'M4/9׀0qc J;iwp - 4O0@dtՒDg(;B7K"hFKj0vݙeچ7̶nV;S76L+՟p8t˂vJ `hڌ׌u2PZ ||cR)Vv$='nt?e6(`n_xtQ?~#BYkgg]|LKsFEuZC'~2$ v]tT#4qIN]Ml!Pcr Nࢭt+JG|$gSZ.S X0-({}g ,`66M%95s*6P{}ڲng7Z]h%1 4>̴MFV}MǠUv e? ED8qw7.rs".iJBBt7{}CmG~TD^D8ER-狋/U?- =rvi\-(w]%Z{u:z8ƴқZ&P̠ ,]y#~n6AP YL-A{-u[rX_ԯI\EJ.%Tsgw8c5mX251s Fj;: kl*; x dieBur,gglGKhmbGѴJqF)"ޅ\SNӘu:+.v;%|Ɠ1IE<#emh.C"Y-Zxed׺]̀dﹾl0i:vH?vêشSqL;ȴyLIVr׉}7fnܑL,Zۆ>|M7&e3սaTk!O}iF9F8h70_f͐6OpSp򃉸˘P9 5C7~g h؁~11bĠġ.K")ذ[m߃9I3N0fg=C1CudZ_Uh ,8XP|(FgYp%K\Uxkw[CNBGwgNBh"[Iڥ?[lx8F#`l7 \mM>>٤w#ӌ9_&1 !w'3Y䤧/|HuѨHh| JM론斺PP,g(z=T{|b5P߾HIgw;q҈҃/3w0 b:_22L< oskJ( L$;* `vmTtsΉIq%=@DYdn%~g-6JtېEcdݳPĝy͈u9+nAkǘHP o_ "9/^odaO]{}!,_-Z"pN"^s/_e !I%EH&$*Ʀ}Kl6L B+he ]BhV(CR7HP %38G;חK;~bz>ZA-/qhܑ\Rq$VY-Rs9rg|V̽ɕkYjRRe:qći rnZ*SIF&}'ʻB">'ȞfVJWUj7Ew׹r%_*v J%AXsb9q=+s/XwCm~@wM%VljQ"$Jőd0-es*L#t?_s$.;<Ŧ'vݿ71ѷ$Yv;E>( vDyc5LEʀ= PG >ߍ}fnyfPqGdڷ\Eq5n'zw5V̗T|7<*Tk|iQ@%$t c Yiە: , }/YY\#ى;~t@<^IǼސkgג"_ۨI|RM:D,X]cQ]q087dߟzN}B%2}R=nQ3ї+ӰqLn}X?&JD`YϽ_?:"΀וa9D7>nȄz j#睞]xq]Ct{@$+kZt CMakeCacheCMakeCache.txtsource.cmakecache# This is the CMakeCache file. identifier[a-zA-Z0-9\-_:\\/ .]+xڭTmK0nw;pŠJV؎kMj?]7S/ϴVH!C >XBG*A׃my)\O2pdyǾDqx\v=ؠK̈lc'L(HǡQ0`GY }ir(Q&걪efkBI㕐%-x 'qK19$ V*~Kvd(?4 LVO/hesȹ( @Mt!~{s*kf+(oy|7X-Vs?ob?F wL>h23X|~[ά=]/4 CMakeCommandscommands.builtin.cmake*+x]u|G6i6M6mhz𮊼uJJ컾卣$1333333333wƍe?j?`̛''w?Վݮ7;/N$S!&P3qC!W[Bmu:DݎPgBu6DmAs!Nz&D݅PCVzE!xQR0ދPT}Et?BmC(AڎP4@! zҵzhE(jqBF(=Eh! ~:P4@A(4@BE(cEt h# zh@('A'=P4@O# )B(i:P4@gB=P4@AUgiވP4@oB(7# [=~[9! ʃQs4@B  ,B! PhކPETD(y*Q&P PhG( h*ETE(B]B(eZ@(E @yw  EE^Ed# ЋETG(%6hY+EP4@WP4@D(kEB(6BurJf([ FME =A#ukP4CA|h_A(W: .<7Q( @  Z?(S>8YQ4TQPQ0>}8Ѩ|ѨhT>hT> hT>hT>&9*>6YQ4>8QxQQDѨ|2Ѩ| Ѩ|*Ѩ|Ѩ|zrTߟ(~&Ѩ|Ѩ|6Ѩ|Ѩ|.ѯ<Q|QQBQP8YQ4QRQ2QrQ QJ|Ѩ|5Ѩ| Ѩ|mrTKV hThThT hThThT(O@4*@4*ߑ;Ec        J'Gb~$YQ4QQ1QqQ QIQ)QiQQY\. wп /:X}yn͖cvNzo1}ն+֮w9/;pŊ3пngΕfwW߇8l,;F>ȀWpP_j9ׂhԫs_=1X!>vuk8\o2ҰZ᷃8dwpaѮ_s쫫ݿ8mٹkpp$$ra9/ >^('ҭMpöQw/j6xb@wcs29?9' GB ix`RBiq'eW_N;n/5;&?h;Uqy𻛃jhuBd5<)r.+9`ŢK&&X][aww j/ //[:NMSvYX׍fg૛]Vz6gѾ*=gN[)*_$̪Y߂poO{{/tU?P2`޸&r_2*o: #[k+z69 /i? ʊ ͅ  ".nS V;$-s"To -NF9,ޭRmf.GX"ou-'vId9;zʰUn+Q"l%lvHk8̝| H]|~A[' }y݂Vs-{&t(B!onεuҜq$m0 vj}P]]}rzAۅlY!IAюI>wp {[Aw8=3Iy)G f:uB|Ol.B[О&]$gϑ>$q7q04Iu;^~!eYW,2Oo''~CB<*J$a%H&M4qdoMQlqTR/ zbP)WС;.fcNi:''r+d@AB;+FOʽS5Y'$PXXy~ZhHY ǜ {y􅉋sB1,i^VZ$]_14[M2x?z3/}o~VPLѯ Uyo_鹕5u~S{sJIAa7 C8G?3 ޿p[±\dm_{!`35!'s`޼~Л8w/;a<_g'Y-;=.g'bv8{2-9*6ԓi {eًpNp6oM$+ fv8;ήeiᬝΥpLZ8`g`?;|ZJ0;=^goL g׳ٛ7P퉔}I g~7-}@v8pA'R/%0AZ8piGe?N g$-}v?MKP?1;YZ8piS_Og9:~9-adN g&-}Av8۴pEש8l4;A˳?gξ:;SZ8psWoN%-}Sv8״p-ٷeO gߑ#-vLKP7;WZ8pig;:~5-aOdp6~&;!-\v8嵜֙<0)·vL<6[ ~ĝy] NgW|2!jFb+NJ_X2krR\5K- nXvz'}h`k+Օ7sHde6m Ֆf+=ɪ\`LσT|PQ6JHd fTv/valӵ|Qx(YaNuBPcO, ?D_6Ҭ=]|մO$I)ʕQj+) ؘ݈Ku!W-G$ 1}Q}̕]:Ju*FŮ|+jm,ݟb▲7IԄhʴϪJjuU BPdX:A]LP q٬TEA5΍iQ1,#w2X,AHZ*\Mp"G5sKLN$ +4X<[1kV+cvv7l>3Y(*{Amrfe4 8:h bmڰg,s(hB>iUiA<[4/>4N(*ZET$8\2n>'m [<.2ʙŒy3lJ93X6B =hj/J 0Eo|FX>7knc&( i 8LaffbRʊllfʖmhG8狀g6_$kdn2![XFV߇+Zxȍg bdXdl\5W 2Hd f/[F4+ĥ0+$% R2.ki!8d*ʵʜV7e mrn*/V=Qʆ|ͬ0=$@}w>2Ef R]ԜC$69;3\/T](y]i=Y 0|ɳQIAI,rzszcQD26n^$RsJdhSZjdQY%RX}8*W2v~>w{WOe5؟כ#Q, CRGUqKpRڛޑv&U]0-]>YWzo1+\cCQZUZivăL~k @[R1#4נE]4.8/VgȘj͜n%J~plZLA[eZ[M k"ƌ;rț5vC k;bɌMoyRњeQVnE!7M}-S&IUfU ECsVEuRȭE1"+Nz $#ӹʜ]+2,̮. uׄq~ܯM׏vPoo=SVojOF{lyoeFyM36ָu h2qO*.Щ ڭ|mctr2lY6< wKV`wKht*3mPyfc^]y킛5J /y=r0E@/\'[F!ٵxLH+i5;,tY(]\|V9+zX֝K!#T+W(ui+eԳ/HTH* U_o=jWRޜ&hv5oz6zZa zHAqChпkhޠ@ogV! ${"9W&Q177`A&$-eZ0ory"1?Z $2Xjz*ٔ\WRBZsYEqaQ,h/rͱJ9-˘5<{w7-<$:}×EiLJ^}P<`νŬ\,h,]؃Ck`LEṡh hzH7ǖV7˪K,luΞ-kZ^DCwfݾ(k؁Z* Zź|D6F3;3\y&kz[A%D;y(B>U\Vr3BsںΞúN@tu(( 1c̖q&cYS&Sq'SwׇTse SתOӲj!I"in0wU' axxw-28: 1"J6JV{XW[Vl3BK[0;76a KFQ3Q,C#W3xEZ-mL ٻW{?X){jE7/z&~ yQ&9*;!a_#C-kqewYZFDA3f-?EьwdسËQ2,N&`GI^.#t_rx 띏ё0b~hH7mV{ ތz{݀Mbn\ ,-hsaW&2-\ YpL|ͪ`ŒY,⼻wo f;miW8B ZFL[^˦!3Pły+ɂmDJ6m2Kz;|(Kc*e)%Z#PQ.r`-.V(ltVm0 ̌aqFo}^&%@x ;OV`A/:v~.W(ie{_2]q3"pJKvgv @[/7[/#rk- ն|S]t9I`@J3oC2 8fٹ4E /l:eh:2x$1ΫNc8pkIHmG \#˭R޻ofNr4a5+~rB"?AV]4gm7om_--K^! 77.$^a%s! F]{sp=Ij`NnvuD P^r~&=l=! r|gC“<#4}Ǧ~qG9]jٸtdރ+~ȴΕʰWZPX0TzN}x$ڭ&KTPGTyM#3h͏mѶ  bhz̰hŜPX8ae\lZ«OPvڍN6'qI,L;nǟMp!&S@/$8FhBDOS~quC+l~&mhFY2\j7:Y+~.wj^lSvINV[5Xu _r7"mqo5r eq )1?􍜥CK6a` J+|fΧ9$=oltndSVaA)t&Az ߥڭ7q[ ߣ[\*}+3 WXd5fҫwaS*WX!*?SJf`8kgJB ~`ox$".ҝ6&W;d\I\PO*3qY &ܯx@&g9ovż%@R s,=8=`eo4;p9D$R |8(y,5u-'_N9Tv+qaGwjxsVz(HTzVx>#2k$=wFO4 Zc9;vNgUGQXԺ_uςvf皼 &~(#nq@T@a݂ev̿+ٞr/hQ'a Xaqh]}%!lSkf_X&ƑPX>o޻fv}zPag__Z]s~TNXȮ^gY}ik]\y P ;:2weɒF Kg9KJ,7Vװa.Pa[)j ]Mָƒ7s< Jvd? ot#8bV`_Jr"AZIqaS+J~~ѡǡ‹Y ~F$ŝJ?tU+rs:Czǭ-$4Yvv`Z (,A+kRal4-J;YXQhS' x—K/{/OjuA'8yޡS@Z5Fɰ OtG6ǮD?IK>9| 3`aԗ6<$.h:yPXYG Cc6j ;;@*lugk{w'Yp ;-?0;6(YiQ'i5D(?A\ʃF{e~ <+1rqUy9A䗾XaMsE's=[]!э&wK:m Wl TPNŹ[sVzaULˎ)Es":Q 2L+JiS)[F~-P=\i5.1hPӷ\' k9Kb1z vp&X0+?\(M+qAf{ Q-[0.i[彑 \.]vjqʣ*(d 6Om']wPM1[+,xڸʫy)3l(^Κl뎨͈V.<oԊ4yRjieu(zhm˛|NCWV͢y|ejy]m|߾+ bo)\P*~%c//,`A^'-KE+@լe䪚%$؁٣dVe {`0` alm"wڣJ4GwSOպЍysSz7 5妦=BsںΞúN@tu((1c̖q&cYS&Sq'SIlAS  b+r'nG }$A^:MfZqhkUGn ܧ=ݙ FZ),O3&r|M챜A2׿ Rv\g+A͍oQ?WŽ+}&ZBh^{Fo^Ń8v4cfofo{2+xvCmLngN' z9z9RJt5{Fc3 1=06cQo%:zD6ݼ^JȭbRؐ8;{cfof,fYFW69ӎ$;zComma Separated Valuescsvtsvtext.csvfield_separator (?:[,;\t])record_separator(?:$\n?)xڵUQo0nұ"<0@XayuD,v8l$xΚi_}|1R#F;55[v| Q5쮲Qj{ƛ ̅v?S1+N!(XByBϰCmu43}εw]h)C5ꅲo(#q0ǂqGj 59ig &3ЀʎQF#D:2*c kt|coUP"F99I%RhOȖ86?Z@,J GۚQ Nw+Qg6 ;>ҪuQȨnkM喭qxCwODp9Y'?RV.bX%4*Eq(ګ= ">E}C(B7bC_: jKi;e'˟?N鍜N ]N~hBZAt&l1a.) ĔMf澢Y*P4i6rr*i* MIM&þ䩾 R_,c7MK҃Ϗr: KR￱b{Ex1dSaH9,%MEp@GCXdMExڃL+-VXJԩ,C=X2Hԉb;"Z.JtqLtŌãtD8DcZoy.nLJ=\MzC20rv`;? g /)مto*nוX8jJ A3W-0^9f ~Iw}`9>K;wލu \إ"aoz!n"8GC' ~T`"hRP:s^22sZ5[ek3 z . kJY=lE#PЦEvKH<]q?+6[d>81c,w.#R{e!Qi1,*/{E-FmZ[l*_ѐ|`ܓJKRKW+Hha^8+h`k$eGg!\bxy"Ҵ2͙ "icSm +#x'ciӫF}M{XØmj KL-յz`GZg%yL/=pK)a w~H]MDY"?n沦jC$fR"kL:n.s&_.+T~a ejcJQB#O:\Ӱ[/./NC2Gv󜗌,^h U"HJBo=[N^a0 nd,_)9n03 äӖnA*;!\eC^MDz%%~opwŒ05p!k+V"`1`XT@|'\L:m_&H7Bh , 2$=Siw*;X$(݂cbRZbȘHﶖx΀ 8Im0O]IR0w*G:~KVxOott#2MZjrƒN~S}֯*D{,];n:m/zIy{ zpqۆ[+)nz͂3qNwl?;;t2锇gpm'eJC]CpuInfocpuinfosource.cpuinfoxڅPK0mν]FƃVm֔V%:%u%K:3|1I/ôX?3d4S^zvypRupW>%/h\&8mcK,MMIPpNk{_l\ͬOvws7ڣ/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)xYO8o:ƀ1ik/nHSiNh?4隂ƴ%л~vjkېƶRYϴF79fBܜL80J X l Lop@8vBPq{7z? 01M3* J'ft2)K4&Cl2 pg]e$!>dc| }( \2'x$`)C6b!тK*qJ-ĥ=䰢H+f^x>4 %s@U=l= Xct=C8xn$c Ni\x,Jl$>|L.,^ ]q *1.:=~{V5E ש)B90 x#cE<$P4d6R FYf>/y8jA໭ oua ߌ(ub<{rD-;zU#,dوj S(glS-8†Uѱ.> .~'N%kVYą\(P1DڶjR)M1''<+'BEХe_݌NvqF.v i(4'hG0z; Mar3*M$m|J?U:?5B?>ҋS7#H̽")$L_ujtm,(UeEN?չ.ҽ#/0jO~&=2qv?Fل3bfVcf?oh+o({$/EqdY3n筸{D6}B[9nt֢،8]EoaUP/ΩQAgy3?.g)3hnZζY/cQś^c0 ܾiEcQ,7ٍ1U)-=r#H"L +޸!-KVBCuzPa䮫xDR-f 6FkL ֫ 3*LǺ$h}Stz糖~?MLRQxע_ Uts lK4l7Os&G@`_t [yi}$ nb~B%Crystalcrsource.crystal^#!/.*\bcrystalx=vFxKq',KDl ś8^=CP HbXRTk7ۼ96g~bnPD$ERT7E[ \uCo)2Lu>bv MViZǏ"tdU`a̜<CO>HJN$]#@'S @ @7Й[mFq@̏1Vj*' @*&Qr%Q&Z j&Q.Z @*_$Q[jK>k*_%Q|Dr>Mʷ @*U2 @* @*UV]#NDDr9ZEM-a0TY> U :+]orb[Вgb+X nL 7S טꁔVRvpU& \ZlL2 j~J0DF hM>hW6=d[|K!n(T64;)4&ukɯ%x Uiˌ+VSjjK6 LAWg绌Ue$RLڈ>z?a"l? nK 1>7{Fx!00't2x?d:P2@<% ?Y?zDDݘ/g_?>A]t Dzz2}+j)w>Lz.L!Sv񋌼]Goڎl{|B$ bySy&Ï":DB 0yEQt;N6UBZ̖dXlS7Gx2M!CM=ꊞl{kV8C q+N$l8RaצDX7Q75ٲ&ԓȼ\TS[g!^ؗf"٤>372ĜCLH YǺO!_mz[|8+O|$l8RW>" jc|2Zm榃-+K4hu W*f~G7RV9X}u <6L? dw]۫ Q)q Q)x3 '4+])=5 "jƶ>=/ҡ$ID&S-BiHKyBz)R/OǯڄR^_/(hzּcOk%=w0dV-dVv|W2Q2%ݰE5+|1jhGM5M2Ќ^}gNGCE&5D4?z&tR%kǯ‚c4=)$j۹ӧv(.W䃰6jd-KW2n+O(4gQܗaߏHִDߏHrm9Uo]ͱ_٣=cEDkGIgjPg i:΅K|8Z¿-L6GQvKzٯ# qtGPw3&ovcv5ML+7 ˩:`Vd$U/ä>Rd\HgwLĭ <87͊=Y2mHkSI!L WOP,ݹ amMAպ^jjvm`')/E!e+q`OrCB:űa}|}Yb#`qAѕp+'-\݋K){=&:k5( G.n mT3qs4; Ҷ+o9}:Ѱ;V%H ؿ1s7GR㖠߭ Nj뜻7|[Tbc v)K~ok4 ۿ醹,A^mec7:?zV[."nI*jfmom>کJ-9׾{O\Gyq9\* dQ,*v6UDU}U Ҿ8q#iûmsm2i޵wr I>eh=sjvOsљrGKh9!w8 \<4>'%SHPel0>jZt8HL=cxf@bebofsǃp|hj#<ԇu|ie'~еa_?^/c1.#B8/Eh"HURdM%4k*LY03C21_]fl#h̏NGδeU7Ԋ %DTpPj \.0rRaOI !(f2f̞ 8[HJ$(TQTr KeTW$T8+TylnIUY%}"fDWՃ>3nWt3`ա̸υ3jeژ"F܀v v>>f᥏#,80㐞0f$ r޽7|w.*4At7Vd` 5ئ}l /#Q1ՙ8eܝx.YXienT?%$f ^jIrr=˜c 0[PVw&miKGFW&uk"z kPj~VˢUݠzEpn!gr]E΍HTWؾql؎4P܌B #.ES'E_D`s+Ѿ"~,lcl/n{P˱.N\?O^rqQ$y\'<.Irq"B4Bq&N_ ިq'PhШrKzor eK dRT~ ZSLU`"4hE%/)z]cy+u=Μ{nn1?fK04ŭ)`[PGkeǸ$Q)E=3Ϝڌ(&Y51.\Ce2Lj̆-R[JL+pV=Lz܍>&,ELODODᆋpEqEۯԦ<y\Lt8biC>Iei2/uϒyh2MQ^?8Eym&뽿Md$N&EOd~E'"?MDQ(l^to7p}vݻA@ #X3U(h:ʄk 0 "Qmo[ Up+[S$nf]bp)UKi}W<#T~^?^0H|`yY*A X8Q">*m\m/I{e iOWGjt_~5]SĂbt4E6@ě\ɅF?#ZH$+ITH$VHR]/${%n}#n}Sl*5> *R=| y P@2; T:%]Ed8I{JpS%)Q(&y?An XdQ4=ɘN%XS=yN0 -I* 0eRDҦBYBJRt*s^ )%|^?C3\}!OG4e#U+t7! jآA3˧#u5A2ig28@V;.bs\~CPȼ` "t@<Prɵ)wLdm16vUɒ("`bRڝTXd. pǂ!ؼCG􅎖)e47bw?RL6>W]bBlcDmP Jh^LKq}Q`R2yѼO=^U_!tbÙE\fwd-WV8O||Y+9rk9@WԌU&Si~T Lؚ5$ȾtϮV^U,t`L;nytpx$|x#7t=\YJ¨{{ s^MZ$ coϴjގkz0'Jjewߟ9OY6 ]{#KMJM~91X.z# J[FC̴qCmeP9lh|7j&7 QݶXi?] -632z2")*y}d-D I6lv,<_ZwA0Ѐ8vT']A?is_?8,2@> B  e՚QqE8ub1tֆ];2g`"gs*@tjC8"@8-7A`Ϋm\L?t' L1睊Zf9#9TzS'zA簭"ם`c8gǶʈzb4𹃇yMïm[` Y` 4hP48K']$B?&Bq8#ڲF4E2McD>! e <h?͈Z jC狜cAV@808<=9g9ܖ(oDS >8</(e;Xr ͸7v=F3uhsX- !(kju;G.eJгl3@xWjPΘ!]Yy{|}FICȀ+:dd@Də[ FpZVNxVm2`{e\h6C /$6h7CkkiS~.i$fۚz%Ҟ>=W' ډ"KݰSg4(9-IRx{0q;u=mY'PUw?QV-^<13egy44:}$zSu=̄NGjWC?IQg^t״R.zb!ϸC9TVDockerfile (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ڝVO08ĤŠfc-up[C+71Ďl"HR쐘$}s;c8T@%/Q5όfwi8$2׸WJ2;Ny2{4>$!Lrx!rZ# LAD Eɵ۷Q1 #+j9;[bjrͅ5{-Ϸuz ( #[V:( f㜏Kn1l[/D@ܐs"iL)/v*;v*4 k7prc8^2|lwV4 V3&cݘY^Ø1ohj2w}-muT,X`EK/ڑu Ġ0 j\/yw*u'h 5\w2,I K> ![;{qSRΚzٓK?}v0׳ێX4 WJN,Φ rvoNk Dockerfile Dockerfile dockerfile .Dockerfilesource.dockerfile)^\s*(?i:(from(?!\s+\S+\s+import)|arg))\s+copy_directive4({{onbuild_directive}}(?i:copy))(?:\s+--from=(\S+))?from_directive=(?i:(from))\s+[^\s:@]+(?:[:@](\S+))?(?:\s+(?i:(as))\s+(\S+))?nononbuild_commands_directive(?i:maintainer)onbuild_commands_directiveg{{onbuild_directive}}(?i:add|arg|env|expose|healthcheck|label|run|shell|stopsignal|user|volume|workdir)onbuild_directive(?i:(onbuild)\s+)?runtime_directive({{onbuild_directive}}(?i:cmd|entrypoint)&xVo0o{/F"T o,&4tTYj-S]䯻|zfC-\u};puQj0风5w w1@6 Trq%󯛢J$dQV(2nVRi*"I'%3)U>sމxO-4׏[jJDbT%,@9p[xdZ}gkH@䚔Ck3$9lJ6R&kNJKOMDotENV.env .env.dist .env.local .env.sample .env.example .env.template .env.test.env.test.local .env.testing.env.dev.env.development.env.development.local .env.prod.env.production.env.production.local.env.dusk.local .env.staging .env.default .env.defaults.envrc .flaskenvenv env.example env.sample env.template source.envxUo0nm1lfJ4yFUn:qB'SKU |rW#SN8 0ŰV\ #k:V;!NvN7%nj-I1+̰'hGJq[BPCQv%^cn@|V,-Ԃf0Wĩ?K8Y'='}+NFTEhdZ N @tA .4l-E ڧ1x鑾Olr{jUƠVƫ57uŔ4Y0*Qvyҹ ݗYp|Bmx/11Z1weoUijS*0f^U[,-ꑬMniekUUJmTdϰb? %XW8 ]Ne;wؼsP[*3Pm׳C b\ǀnq?CARHO __n;A 9 K9 yK*./10}XmP-A[6=k:hN`y=c950&oƭIn\^Uy2Vz/cژ3VmH=.]r\^SUeDw%k Jヸ`: \\R&<]vha(rܛA^""Doeo 1 Z E-+(%͇J0*[U}D֔`0M ӕ`[W銊mC>UQ FuURQJ0{J0-%}%%C%GJ0UDէJ0GJ0m%3%UY FuUQQ]U`TW5%c%hCBs%J0J0/` SQ]^ FuJ0?*tE[ GTW(UQ]I Fug%s%m_`TWUB} ^E7Um*cqIfC?^@׹Q4J$P"$ $!0#;qIKfg͸$>巍9G`~+1~*781j%eю  'f\cݶ;K:de?v򺸒{qJqI+AH@@mN~6y=EH$βЍK 8\a"r}ڋˋS'#jv~a=f\ox .eiږGݏ$pif˸$6<<'ؔ"U@uUT m˔;Jp;&q|l/WXI6Kw٩%|#|!gpzf)8Y%X|\VljUg55l(Qbն>4`PO 0Xu5m4 J ix(-YmRdQ/.2-$MP/>HI&{ /YC76wykF ى>RG _끖f:hQ{9b44rC) Qy(V3qa1V1|dN= ܶ)EvoKMOfs(ٖ[Ι]nM:hVe%ɏ8MkkkBuCI!Mvt寑QD° [n2k|Qq'7@M/TϨ/ Ӵ>Rw77LC-!`)bRk3 PPX(8RĤf@31 HUĤ3 Uf@INaJd̥!n/5б4:Q1]Ξe HYeD6W)}4NJg~U7tLdĉ`>/SۜĆ0qf=18nJwSo F47s/<`v$u}ba_" !L1lN ƹz.0(s<+\6;n@z$S[C MHG𥰕3 ~/&50+1YYEGU\(R V+Wu#/YLJ ,ir/q[\_ 5p ;#8'|8'|)|dܷXϛn]Pɸ,ɛ]Z\*\cf[N,XX>v]!*8~+}Lq0B#8IlH" V[*~dDN@r_vEOrGr)?$'CJznۆo]׃.D&;aBj[K؁Hў~W ?;tKTL ~;mύVCVkp_Zgsox&b4vA =ƟVT; }۳ѱ p~BmJ&&8},RгH /T q,XGsᦛJF}m}~@jAZF258 #hpfQm}ٳo_wϞ/z7 9 xif0()aNh.S!St%hUxu ^*Ce L\H01XNjR@y~8̊r vFTuUJoV26uG&IM %n cx:h@:5}0kD)O"+-/h <V#v_VVR! ?q۱?4"9)+nl&v!L>MP%x} M#090΁ fEn LPTFPW_->9M!1aiX4IY[仇eBj1BzwbZQɳ_br>H}A~Snv#QK$qC$en\FG3ɰ9YP@| G/=.*Mr;0֏}hF;I,m:A P-oq\E_8MBBjv^,wF1 y~cxG swk [ #BDgxU@JJ<*9F K(os:!]7LRRC8d"@tI-|fYvܷsfs&H:| -z;Lـ5(Q&Ļ `gDEeau;ݎk Bul?]q>&ra6a iJy8 ,43-j?-: iDY2 Mر`ӈ9#]Z 0 #!H"auXܻCR jTӪd#;n1>0Eo-79t+UbC =rPyyʘO+Lij%_: zeFԥWfD]W^}}&#<".ixpW:њVP{) n+$~#)""pl2~_WgE‡aR t ~hh"#KǷvtcVsCKfQЬ%SxUX\t!0cP n=mԋs[E>vQEx@+ᲕSq2} Zp*g !d"B㲰H hLʕt,>^\K, |ZLD}mOɋQвO)$}Wq v !hcE2Mơf)'f2u #L~7.#fWl.QZ9E{ߔȈ{VA]7,-vy'' SKCZ'`Noؠxx&;#P/kq^ܕM"p}dNQx ~HհRDv@gQ;rMiRH}>SdRfJ aܟfJj` OՉsr9 <0ј/F,?1}닩}uZ5b:MqmH(N`ϩl\egq.>1p .# 2y<ܵ HTML (EEx)html.eex html.leextext.html.elixirxڥUN0RڊpBBCXot41iE28—g_gQn|pҕ'Y=DVqUG̼'f3f g^3m#%z?̈́H Bш,*I 8\kMFlRKb97g\ /32> \П$ Di*IkKv!>ƶ4RQ /JsG ZgVc2i&:%#Mb{H:=#3wsd>1Ї{~a'n%{MX#JNO&TGO &Xn'A6d0%oV2|xJ wp}t;;1Xa+@۵԰WsX6ߡ;=pAg1ɬx'oYV`=&u=~/VΠWB2lױ] [Ly}b񤷙[ a[[r͔CI5l]J8 4Kюp|.MB9mzn 26~u= aBϗ] mDdDˆbL"Ho~;cY @FFm.)zy=2./lwK}N%JmӊJ|A[A/)#5}'^'ejC% t1k2iukPFz3MBm緾sۊI)#A0`6P&D;7 'Wr}oҫ0eimtOr"H=}`ʖc_~%5P>5lm춎ǏE(+b|_|$MXut*p[7h0KxzK(`bB&324e= StNF-"v^O1)ޔzdPu(V]!U4hau62~0qu5j> ÷"˞8r&FetCZZ :7٘@ӠKR(MPͻ:̱%q颤$^ɽ!YҰNU~,ㄎ;we})Jl]$ڹ>]d<O/UM[$u໔1?q<5؎Xwvd)߅JR*<2K)uK[JGubQhK\ᱥ`FXS5MWh$GZ !YO #h}ߒ:&LLJS[Z3廦)@,bzQ¸Ek^6YtcʰY*ݣ\xh,hhQP5Bils㧴f ?T\W a5DibS 4kst@e@:굒 ?AX5sa8ذ, :&baz+ ",calpRLIQ]cj_)B@`t*b | ״cSNڜ]Ql<=PO%J`'>:&,׎62ޙ/:q <2'اvF,r ˏz`c=ô~r!bO#g.E|I L󓈾TP>Gqޅ+`*3M%ʱv+KpJCi~4cEﳎ*EKYT?ơkA[vKd=E7Θr݈eF=~giY5=ǚjMڙ7b|IZ )N'vX M;F.H&}k.a `*!j8a(g4H0۸R"IYhmou^NQ>V81`\D̔5[9a4Jhm&/h ST4˓3H' ڂ-@,V=C _G*_߀A1`OmWh*RR%64S ]E:@a$%=?J QBi޹D >DҀ|zD=}x| xpo&;D5ϻ3dzE'] faYMN-BmL nf?:h=yQʒLJv-^`vMcyIjqr >GcŹ~q@2GU6W(K_6g~ Epk[ز*/r&Y$YCp]M~ZK4 *Kzif} +0lѕL]Y.+mp "dN OZyP\ႍE ̺HTSVoe4rpJlhZ}X2gv*ƦK_ck(Es(,؇X}ᅔtEt!.$ZopfF 1ӟ\OH ȼh,J+=I:-fa x̓%;k&|Vɻ<3l>j/SLF3 NUL=$)\&Juv!p2|bu-AfJ فN7'KL]KDw TXc"j]/[H{az|"|aMp]Qlks=VIfr|g96;yi.yK$A9 . 3C Bښ3uq-:&2t*GXle:.Y8B+ۜq1>=&9{.T,JU.vNTdvTmYߪ0!3B&Ipɢ;& )J`r}l((KqQq(zz[%zӊv~n=a{;؍n<=|@,Ѳ2IΕnURqrԺK^?GT;©e:qOHQpП3\4r!jL@KW;VϷP##v# ĭaU]E680U![q*4Q]w|2bCٔme4XٷX& DTŠ+QUB9.v$7Q`vRJuth,8oӠb\ ?(MfkU*R b0ɘ$e"h;5ܵ!Q \H9ՙ4tn X%eȔ]lR]䙖1ANCQ}#(9r,d2gZ!Elm Compile Messages$text.html.mediawiki.elm-build-output1xڵVKs0N0`v=So1nޤȲʅ_HGC~}z[sb0f̩l5c ӌ97gh:nM$%EQ#Wrꃦ~%fP>gX)ʂ^dd )7/B9[ MoSj8MSc)ϴjJM xD>$7/>i>QdxE R(h`.ykI8"aHDE" A-ilKj+@LhZ%$:pTD҈ƔQYm +ePt6ԹA?֪/w%fRsHB:VQ~؈Efܪfy[Ƕn_*pT7FS ym yA鏝mZ4oNBԯ])gtFUDkT)ErmH%!!>*ͧ[@}eqc6~~MG;huUZ!al(c ) XD!^])D aiкz^e_ a6 GSe/{FOΒq"zHDBEry wW](z"I&VD +'WYӎ(r?ߖ܂/GL2K9k(Ҁ1qpBl}Y)KS~G 0e &,]ZF:XOUrų2Ai(; 18vTM'L'olpoElm Documentation%text.html.mediawiki.elm-documentationxڥQ 5#~}E0lMvѿGu|is=皓7V[.<9rҝJ^ 9GHs6mY>skVkSJh ϑȧVEzpM~'I;d# )QK>F~i`M{Ɠ{KxMuElmelm source.elmxYs6O*xm@hIA6cGW6Rvۢ4s%ؙP `ymٖb ;|(i>}VsE.mڦy؃֝aNpݰb.)i19}F3+yhia442#z#xnQs~=&l\Ow<\ WpR;taVxݲC90))adTIB*K FrF`Q5l .tWMqА9% TΙT.ڛ}_x#3lK뢞aG& %Cy: `><T+7(Rᙴ{A tK혪y /t5#)V_9L&\LȒiCzF7A/Xӎ}=& gLO'Јm? "32&B@w2CgFfQ톷Mה>6w>7!Sapu=`==պ=k3i`aaaLD1neldu#:lgOp}w\g۸+^>M^OmolsB?Ǜ5z}z֞[:g\k*ިy/1=^Ao7#gT:$Qu< чH)f%XS6`Bj_<6y([˂pᳵB2(WZdǸt +Y éY>-벞B~;w͒aOo?§IKߙ((lG#J#]fx;]^N_RFw!qGKUB0/)5$ʊk;֫"X UAƢr`VE  UUR#3MBa UKH|5 @߸uUïWe`ڵqO>ú%tT!_p! i\|AldC5gꍱQ{EnG4'@vlz=0Md(+ 0KLmiO73),`P8hwxSYԟNTq|S7@;gtqbV蹣G9t9O97΅+-HH]Rp|e Q)*^襨p"l$ZKUY+X},bq]wNJcBC#9C&`cƘ ;ӭ8;#=`F)&&f쩦8jKG{kI&t/ˬ}Wm(BC=`.&)veSA)v {=gA6E.ݱ̀ס|Ufvvdz7L{8͋nq≤hL` Ưж A'2(v.Q{N|3y^u< _r|p]D$4'T`q&$0GcaH9~)!Ww5&E!H- I؏$Svr$<#P"q/ 49$lF5觑G՟ɝ몾o/3y T0,NU}^i9+1tz#6ؕ68[Ӵe[.\@vw +G"3OߧLLG~}Ӗ|# At.;M1(dF2$RS:x}&=?؛iv(]$o;ȱ۱RCY)R{ψ1\ӶbxǃD}FHFK˲9]՟'Gd$0Kz~I)c"ɯF"aʺ؏P=X2 lY|%%ʘ>)2,ڕ-t}ܵٶb$ DӒ]Iv2O )S@'ޕ (VeO _(~.SIE:T(O(+E ;x~I7er6 rѱi]b!4.M,CwbTPIzE JŤx1S<|ݫk2Wb*u]eK o՝XeY@>SF&V |ѯ辢1W8֊IZ R ۞ ,~U+HZn&')DTXzVtHL CCWe`S}U ~3LŲyY%!x&|q6#=a3998!N2 N&ܙDlщ5 3̵H)hpYX!AnVA@"iHc*χJ: Y$%"R$^iQO.Vٳ5!ˆ ոs<߆]b^#x?zD*^kci;gWb͕ODXP O5̀0YY AZ֎Ԋf%YNCF[v4i/luXssC9W9\Y}[VBt:hUUo^y3xQ5u6A}:Ιlm%Q8oNf|!)\<&K( X PEA\-vC.3890&8ݗal%볼٘4k|R^1ƇD,281{wb()m}#K(jJp -56,?>ms Ԃ-bGQ^(q\VXwrW]s[9;2J$"u,-XmUz~5#Sޡm?1]4N;. @=+<7x S+{#;jxz7yg&Uvp~z"o#<#>ʩny`@j+@.z^IX nOm|0t?#`9w ygY9C|'MvmUv1Ϣ} C2IAU6L؀_.2-/fb*l\C8!?\MR3YKM^g?޳mlC)jwnTMHby7fU[lh_ rCya*{+" 5/t@. gCXC@!vKNoǀᾮӧQ3~-.UN< `+Hpv[+R)uC=iܹ9b.H1n(Bpϣ dPb}QnJLb/ޕ!#% R}0Qa_"R_i%0%Xi3b| r#aFiDZrf(2+hdF䣜3嗑ӣs9s=%pfUL.\XRT oq@V텾o^VdP!CU!~QЭ" a$Pㇳn##p0 ,9Y*\WjE__R JI)ahfWo;Md[!vz!1rӇa/4X}5u!r AcTr]">?#C J-\*Humi;KhO18繚Gw"/ԃ[۲#Eɂ ?..mIhSާ ?-mx`i3%>ۂଔd4>Uy>&ⅬlW|͡_HWkuM݄b&l_nf}o#W>o`3$8jtZv%ŷR0$ռ-(p-qP 0p4 CAvaƷ:hk ZGl0UB{d珢;.qTӚ5#IׅԌ(h€䡏݄2}`]zOn"YBď\u~$uA+>07l?$ Oh6]l'2gC%3b-椨U=-m\Zvlq]4,BP!r~Chr砬m=]qikSo7е5FZ{*1#~%'|I>#`\Eh = }7>A>?B& *]T LݔЪlȱh m"#&'-)eI~$%UaF`\+I[KD$6kĚ*\Rz!bΧcLu)@ jo88 P ќ*'n4,y]Ȩ=J2✜*F9}icµJQKtjUNC Lo=E6r)`AՌZybX،qz2e+fJ1Rl4Z)'3{䜧_%2h@5| .jj4.E6v\ДKb\:T儁isa_J_ˢ;J8 _ Wu^X|Vcc"rCg-/<4xƜm?1O8WQEA,) |B^&z>UZ5w8`HBI4֥i ;<~>r8ͤ8AOd3[^T9ڊ ­(@>aӘSL#30[dscHࢀj[[eCqX2A}bl6) ҍ1AD\\#&%R4$&oka ܷhZI!(ʿW((AQPQ(fh yI8s3-hB;`vVŃ\[#r'uη;~ fH'I ̅@0XLrb\ƀ)v b/ų?)t1x:Q'c2݂iUzϴw҇叓8Eytj6V&9 [HT~[&mZMaf`Ll}ύR 0.HF͡ Iph-6XT8H]8mP|L}9 s@$Vg>LF{tR:40qf6p ͈\4ҡhb\pg$e3ntd }iM'I_,|,`,l_8 *rs6-.t߾:{4rṆ MМY2Sh\av%LdSv*Nb4bŒ j03dDT ~́ (nWI0 rO#؍(Nڜ=©= +Ǹr'جC~ck 5˕#erTe,n{kf% uK 1'!c!S 806 Ds4;Ep2q,\~M::'QLZ>eX@xR'&1/N|b2l)ep]C 통o|z=kg7lgt3'rgtZL3Tz"ķ mX&;]ml0h5ak5`=kn,W ^,!з{)Ҫ M(^x`3JP ɣB(1*N"9BuL@H`I[[`mn!_E=PJ|kԿH# U~/)m*|'ZK[]o!P74M'8$:P<')<Xێh :80k/XD{}^oK˜EC{Hu*aqۄj]&{v !xߠ.9m@I>j$"iFZ:C\U$o,+357"3u! S{Ք0GeR2f{ Ew\SVc+uE8ˏgE$|Rf?DES>\g!_(dCANPgu[3P5Ewgt!'ß9F/Pap!1 b \K6ˍ'm=M7uR.y|yƦgL*14z$3s4L8pΌsͺӏj-r_U.O5LֿRWzazPbXV; \Q^-pR0~fd&qp#XuTl4pa}!]qYo9Fishfishsource.shell.fish^#!.*\b(fish)\b _redir_base%(?:[0-9]+)?(?:[{{redir_s}}]|>>)|\^\^?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 Q4mZLeymoWʮ^6_4ISWҤG^i?~ǼٝY~ +ͼy9?Z9=Gv۾l//7yhtӾe9m{ٴ7ιpjpSn0z-F$`CP) p슞gn}m8\ݼ[ ewMn* =4}B {H={>,#NHU< 8W|JTzB2()ePaePePQeP{ X6c|Z bxF$ TfX gL2$Pj @@Yƀ@ʜ۵+] &P!cj=o۝R熣-6fZJF sQ\4c:DVzY\G,qId,Yi2>KI_ͨT&WhT\}ϳrAcaXꘁOXbLad\} rd\} >n._Jx z9o9fh$zkow=~EXUE@9_W.}Co*Bw]bo)B"r$m}j6m;"-,}'o T/1NЂ 0rvԣgAb:,:,P@:,j.z9!aMUH!+ߊxWla'jp@jp;jpe(y8 .f1׭c5Z˝(z!~=zՍ`}5z_Q&'zɉhiI|W_?(7+,zK1ϙFrƐY2i=J߈8$p7Z'C/'^%V 0~= kދ5zauīsz;z!d튙Uze<3 vARW=3*UNJG\oa\wF3D?EuFFϒ$n1SIk~tV\mi IOddw;R S*/,X.x erJՙZmְuOyhxWPo+g*cF0ܱacF -VeW"j0Hb}w3@aS, F޴W,UkCjr]+{Ƭ1[yU]ŻvMjۙ;fԕZI6fd^/|P+X0@qW, v30e'+ 0}A [yq*qwudhtÁGZ։)`Am r 'DВ!ٓ5L٥ YI;E0 [R~h(M 3t,n=hB9obOMv[~FKX6_Ҵofj' x4 (jȔB;l5ۭH p4 H)3:]gH/sN_Eor̹"[j/}q壾ta:m%zD$/(\W?v 3q$9v]_Ȏ \K$OjOZ <$T\e\DK! 63)=;rhSaƴ sW3RfCI5pWnsiޘtḲÖǩ`xRu 07 3%T/"qXyS#AUh4PRRvq;0,,olrH Վj_"N0`Amiӵy<D9bPǼnjɤƘoOM(<5W+)M֡`m,  k&J0}O~BL-ǥo|@Ktv]Qi$H&j#򠃹|ABHؘXDeH<ս n$zu rߏ>l'/ {6'vtN~s6 4m<2Ԝr],lU}nV m~"od<#/3é>VDJ\@Ch7$}:iMQ lJ[QN$&19IrpqS!Q"RX&kys+?*t*uj2>0uӌЛŻZnq2noeS.dAJ%a"s!t-N` ߵx;~@}⥂]\SW;1 Jv|wM[Aize_Ve۵c, b%?<wێZx2o.Xv0wb9 _V;׫$>rgֹdԸo-_u qO$,v+vpt>~bCn$ hx\(mv sӎLbIM 3o2h%Xj(RuX.HA眐 "e'Ջ08|xn62>*FbΘȎ8 {L[.`ǂrj⋕6׫Z-^|l6HeZ u yT`x^lͬ k?GuY_:d @nǐia] r`QDHNp˨mD:Fjx\>. ,@׃g|ILN>c3,VNC !\P`* 㴛q7G]qDLJcLVv7|,f_U R+ %@\(X+k5*1/.Åe5)%n9NRAb2UC19\.,Ȼe3Ro+ˆktm *JV6^ujD-n, Qz(%_S=33ČHGgY\3P$S,e!*|FX;3"W>m 4Ό2MlR{ cݏD0"2suz4UK% -u$>7pk&OrqMn} y`"zX0\;Z.Ȑ͑L~Sy j2FX /j<Mִl‚OZ s A}yMɊ7\ △CE wSsMÞ%BQ!T 'Bzn\t($%'MVO9sEyN{dC<~b>d偐 ɑj/ϔf=7g:zp2Ԝ$OfNnH^>"@ȆFE9wN}q.s`Q3SKpՙVre,VıӭsvHNw;`]ZH0) nsp~OH~gVVJD\YW>JϷ)TlT)!#я|6=*X U8. ]ynlSvUbY"Awm ÑHØ]w9 AgC0?K{ARٽkFsB_?@ 1kz9qKO(7?q#ĕJq 7II# ioʩ ,aFٿ&Ëȹ3RN6"Q{vпߓef|hcW5AJЏP׳;j9g)0$aV]l*,/24f';#9HJLjߋ$T z{9J{FdE"4ڙ"sN˧IIxaWf)@fI!gVo3 +PowwWu.)R sC3e.ʏ }Cͫ("9eN+wuBX C1?Srʺ?rx!⛽aJ9U%}j27Y:5 ;[84y4} )V5 o.$jE)]-`?1ʊ5ւ)ֳufV9Xu7w Z?"l#BMD!>֗ccD|`4=^ i$59eup^6E"_bP&2̦KyLNL>T.>k)rf`k8#u)DRhIn'A;ұ̽&j1B}Cl"u[K5^2c~IH9_H[2%Mo?AYO|2J9t(W1aG䚱!'ǡ 9Q0S/?r<5|Muo֋5LE5 } 9cƘ? =L4 ^EK36=OdDZpMY>^Y1,79{{j̙ ӽu`cRym: _ș^ϯutKu>?kSg?χЕ./ҥfe3E;K3-fc]bMJJƚ?dG4 șęΙ~ylATg.S[@\KR&!?[(Fortran (Fixed Form)fFf77F77forFORfppFPPsource.fixedform-fortranK xms۶Yvm횦IuI9l]}q|2A$$ ҡ_(EUvN)x^W}Wh4G$-z[VЯTj ƨ@ö5>9N;pS#ƴ'9IτsT4ٟQRxiGEo1 PMvBT8i9ͯQ5c(hxY{a|^d:9Q^)53rs9W;M&)"P֦Su5LuֹwsfNf~~ǁ"q}p6D:/*LeB6J}q(> ^5MKa6,L0yj]` C)Ο-yAZi8(ni\.Lَ5dO4"AI0wNXc[ fpz݆ ,!)j4<&vZ͞yO--4e8"UjDaABqΞ{@U  \Ne0A4A"rPss|ɓJN >Ȕ:_^啠3WB׹OMm.)A_Q !j4S|^@+" ̟ɫ&h,Vw1BF,DjGڈm&Um V* v@Ȍ pLJbAx^dճQ̢li_DpŽ +bjHi!qntݾxN |^+)D=0AcI>ux*gR='J'P9Wي&h)6t3lSZM2(.l(0%B N#8+%#g<1;|=QB!wmu\ T )uN D( X@׈}lZ ^UݷA ~!ݕ+8 \=Zoc}LuDȪmEUZ\ ]$@r,r2{r#qtOWqP *! 30UoVK5b5Fr{յ՘IܻڴؑvX?bd*9E--"ChsqXU4VsVQZpNY|\ZpcOڄa3fߝ$Dbc[d%U~aTDlol汄Zb@dݼuqq6DZaЦb);lŠiJYadWX~ K%P#Z:N|I{Ȭvlپ>A2VY<ٶ<&qx߫8չ<},oyUQ ҶF]+an?,~'uVp?8:b3띡K y} Fortran (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/%߷oEiePi%ϷzO׶β䓥;51Ù!G$GSI@Ryk<$uRʬJC4Fw<^oe'ž~w{'!tIH|Iq%^iG$NLN'qEc3dZcϐ*tbLXFn&i`iGS(;'`~Zyx^ %-z:<^nJ#p*;~~}M@=,"N cCE. @:7Ud$Mt9SEVXFmdo) )Re8S.R–*ٟAm < +ޥ▕*xtTT!ۊs# JgX̾*dPm"*[;{&eU $ ~t@VhgBE+'Mc?M=p "Q5sU.xc" /rוN:&ӯL%wSy2a1ߪqj]5=E.z{iVȺQP E"IbJS "kM%|b|V,G2;rfŵ8T<ސ FV&-H.UMhIq]Z{zoݴ}:Dt´Ci.G/{+M;_+PV7h6mr틶eS:"8{v8_1T*9 yQ<0`( ˦Vz06R)]'յɪ<C/hJQ𴉘-]J* _g/oFA1>hwxY%!N4ڂNj2007"5y>\?eY{nܼuXk >,L&O e],}ݏܽ߻>ߺs룬;XOeYkځ)@t/)֝jЬ #ZYPziU^`BurhءOVBW2@nw&&0}]ֽOnݼq;u㶍B}s4HX#2"h/ dAR>$Z_ۺy[w@};⭲XHXHRڮz)z$-!o,ٟfX;#We_ZD%iPy0t֨ܨQ~ f:N[n*9:Ao\V-ljX&-E,V˪ DHU\e}Wc +=F}|YYsK1DPS/V;if\>Bpeod( 6 痞 cMZRuk,\\ OD6222QWW .Qqhn6n90_g9ұC7Ez l|#-N-#=+ qmÊÿxkKm "YI ^FܲY2G3{{kc~-eÏ(AdpFsIZqSm13.Fgĺ$`U{\T[BFIuQۺN"8YjLӜ*'L }Uլ -cCWsl11z-U`$y VHi3v͑]sCYԹ~t;_XvSs^n֒oNn u8g"e$`OQR&|V@p-zЯ՞}|( 1x'=#eS S!+F4[ީ Dǘ(BAep#$#ڤ4#fM'쇮MYyôdco &bQzd1Ҁھ{o: (jng>vGI"ݮ9rk0,|z}[K\ZtK;^M~4DvƶNc3HO+-N'153\d?IUWuҶU\V-s輪d)$Y&xze窶0f4ᔏI (X!{5\;]z*F5ek=E$f=5$)]&d7b6Y.j$UHgxU!2T+Zmlz飵.jږ{BP704kX҆WpW O+܌NeMEuZzKVk\,'M3 ~<|^U/ª/Rb!%R|aZMth)FG .3r s1D-b3W@%t18dR\vPHVQ+Yԭg鎅.Xg %("_ee &[SФKڰ+P.؞*Ro:Jjݱ~Oá5zVAGV4boYc[Nh `Nzy&kMvi\3UsU).RLJ^jP-"0XOpo2T쎧vW8{T^@dO Ti0C5Gq k"N Q^/"99mΈu"@*6Օ􊀖 ; ";y*~s=='/ȿ]}Exkvwu[\QI9rI 1O0R΋Yw_jws71BĒ2DؑgV/T sM9.v0~$Ȩ'dWSjKne1Fĕx myo,^LGa(7F!nQ+An>.g32rCVtNu?jHQȡ = >Ov)taL 9R557qL̄BǡךW:L9:/tx0`dv|0\ 7oYG#KvTѓ5%)n;<mOoy}j݅ Tc똂ϩuP'_&!ב;5| `6==!DQO+G.6PU(Fu 1:0y~vx bkB1oR8-E9e֕n.X_*&m+-AVU? ,/`òc%]۵:: )f,%}uYZxK 9.-JChQ0'{oJ^6nea2uS|atT5xk3ӈ,ֵlЋ'D@FL}^6n\ّ)#%&?u95珆{m[86ɿ-F čIiϤF;jYs3a|hPޯSd[̕8YE=a{lJǭ~TęB!|6 N懏~" a=v$ɤK.y*; ܊bʼYfleS?'jyL I,4BTJ#@t;xzPfW|-# :kɯu3Ǭf.j,>Ydֹ-ʥBW0 nS5/nڶdQ:vӁ"dkj{%,=ܶWmFGֻiY<ז>S^9M$XNiHi]#Zʕ}˄m*y _;n#4וq oKp$R06hKWqCsF 7Zӑ1CԐ_;H)(NQ{FV}CP%,wa. n`Wv?CE&+wr?3H&0wzr ȣtt5Re r+'yUs2ײպ\ ۭ8L#XzU/Pg:FTߍyOk3ɸzim7G/8n4({xE F>Z/׍ }8D"8e2~ֆwBDxC3kK+Emʗx.tkR!%#*w1hO1Ϟ;x_q|T5逖Q ܰU"!R9cCێzI2.|qDUee>&GWϐ~ߐGCCW!MEntkg7b_Jx2Y7 yO,Nd(iltS~wDWvC| _C /7q׀昪RMboGո>ތTf]DK5qXƚ/:ߪ\!"5Q%7JAnd.WdJ>vVhWHfLK &q4>6KiU1 O|qBJJi[%R˃MW60wTaҞj^%v"rq%q3m3SmP ӓT³UknQSHA1e}Kokғu;ZUY c#V8|5tU Grj}ӟj[*ՠa|c?VtNgv8k`^|.I=+`^@;dsq'#b"iDZ+.BJ,ij&m\wnއfd_>ojqg0\,y :5u|좺KU=~d;ۅ^3bZ ) )kZi HE}FfAqx[X pfW3M/~v7xm)i6يD!g(op`k>bЗpY1N/U,I0G!}ǐ~Ő'cUq Q9W~?2MKQBtLWu\qWqȏhIbBԵq>rn."Vk)k[I75Jw":j&;ȲRJM0nMt?~UF~8(% 9-JԔW5LYCwO,ʽ8fS& uobK2JB7 @#gt݀L!)fHFoۍc7 ^kszFortran Namelistnamelistsource.fortran-namelistident[A-Za-z_][A-Za-z_0-9]*xڝU_0N}S[{Cv~>0NL!p}F ]ofPJ)y^h+ e sHmVu%# d|Fdʈ2Ό67UKӪ0MQGsbL0DڟiqxKgĞ>v6 r;iTE{-VXda _oϼqW8&_,/@Ty PHA9o?馗@::Α  )4"~bԝpl fvA$yy)qeCaMT7^]cQI޲q&A;&ָaz뙷~4gGZdzh͸V3e8ͤѭ;BإOpenMP (Fortran) source.openmpident[A-Za-z_][A-Za-z_0-9]*openmp_comment_start(\!|^[Cc])\$omp\bopenmp_reduction_identifierA(?xi:(\w+|\+|-|\*|.and.|.or.|.eqv.|.negv.|max|min|iand|ior|ieor))openmp_schedule_kind*(?xi:(static|dynamic|guided|auto|runtime))xZmsܴORJiKZ&vһ` 3L CB)&~8l_zaeX%$K04/jZڕh&{.ֶ}y;'JX,mӖ:G (5s19P1M%zӏPN-m4G3(yp'9I>rc|K mo+=|"= 'b Dm?PA^/nOP4+2؏Bwh'ܠMpRMbgy(g~T=^u.P ^mͨٙ:KO;Py% rQ=g?>}tSUaffmٳli"k;(HPcg&KR&\sS!4'q炧&NA_aW&O"ّagCu|H3_ƨA7L89,ǙN0@.B7W tܓ-{c%AGǛCWe"&wZ7d)9cU:]l8KX/vU4gloI[RڵAiU^VD+Ws[3h685Gބ>٤7]Z3lLdiw-մzZ#~=ڇwC((,WЧ>pYIÆˬAV$xCQ!}&2z`qiMhF`)B&ced!$a,W$a2/K4/ve2Jyg`FVrg<Dei8p|h$a `})(pޞIxm} r<=FCaN0lYBuPYbiP.yIoFf Q IEI yD^˶]i75w4K%sUCk4y J.j5*bXWsiljE6sd sST&kp4CްCY3H S,ܨ~__媥e$KYW[WpR]3Lr?$ܨ8 % ,Wཐ7׬_//6@$-{}KpW#&OfwiJ'\肣/MjqD24Unx"/JbCDAZ>$.܉!xA"jAXΤWԪH&ܬ)k;= @@?BcD.Pɒ$ʐOy(f,tPō^hG.)&uiԍՋWc0 `'\ ٢.j{{(3,j;J}(ddDOTjkF*Wv@Z뢑O6V4vOrEH7gh-xa[vSm6~͝i=ouޭNHzi|}Xd-u{KYGTy{nH;Cc?}i7_}(?yP/7SVhN}3‰azILkP!V.7s'"->/J.}7'#N^`}]$ R}M*t7G`&ħD4= nik?W5RO2KY>5Mf\Zp*_{$s{<}5 8 bY)Ĝ~Τ;aU^9Zf8^1!N Pg?"52{7%YIOJSX,K6Sٽ:SiRyob x}vfstabfstabcrypttabmtab source.fstabxxW[o0NJ["i{&gc%2(rYK,v"π.&iU/NJ;o:R. Ĥ-OWǾb3uXMDJۖ'R)8Z.NҹoK*}S'OJи1b(),^BsS+=)O =rL SJG;a}+IV҇mYMRͳ ܽ| iDpFay42WglISbLP9Xܶs}7e*`1;~&f|<z3K%_K$9\%QY?4[ lh|7 zh݀\۪ CZOY:p6žIY7ze:Gp,BM(X/_͵)8/ Ie8rN@sp񶒚kz~Hu^+ax# &vU'棃n@4d<wNK TO'}L-:Mjq)Nk? )Ń^}Z#Sst*(l=$-s<-Dʮ gy>Զk{k\t1i^nBGLSLvsfsgsvshfshgshvshaderfshadergshadervertfraggeomtesctesecompglslmeshtaskrgenrintrahitrchitrmissrcall 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=icFc K`!!'͕ `{7 `f BB096hz i(>[R[-anU]]]U]U}y-.{7]8t;A7=_,3@.ꙑ氳R7 yDw fO뚡B?GAJ];1X|CЋ\5,qrW*S^͞srFϞJ M0Lͨ%)'id:(RPRvo T0&LYGC߳Px~L%dyu=Յ{,Pwn`w>ʞe^Y$C"PE^:|YYQ A z6gyj%(VP%V K~ 6 LywRLSMrj0&!oc"m`L sٳQAbK% Ц my rK„h.N6RWD$ڇ㕧 W*zby-cq|-p$ְ }iO1H;mm LۅWlk W¦Eh{&O!l̟? 幘|#GB.$O$2$!3`ʋ# o478 oo('VhVrKL0ZB| /_c醶!(_z((%NK鶠ikBHs*^㙁5{BoXC p-g]R˞;ز4F1}AG =l : υJ!CCL,$p7!A)n$nu9vϵD !~^C]VEׂ-{MV 8Sn"GNC ;&)#6j|4/[D[0|b̞e XV8}(:>2(a[(c̋|~~_ޫ?IPɞd% :S! N er(eϋ*<̞b ~F:ãSA@ c)(fs%EMY"NI"Įd1=1i}!1}0y,(4mT<UEvpW'*&*&6g;-yNxjJ zF Ɨ3 eڲ+זlXh,JadDN=]j_vhʉ¡kENdB3,- •2 y.5^8f Qo _0. c]nR JM^IуԪ0N]>#k금6SEyl>?B55^"^}/&e.hxB%()~Vּ*vjRФDϕ6v44+H4:~T#U'J%i4O76S7߰,!5/;+e]Y?ЩT U2UAU}Zvf">jJ4A V ѷF|9n!Uj(:q\H0lC6)|kfEq'B[^zMxǚf]ss#V1 @);eʥJ_,ON2tF?[$uL˻m x39 szH%T2E{V;:g0K_:{dRX_U)Zex]U*Z!?O!tGO RԵCE}xz 2+ h\=-u uFLzeaơJNTũi丁ơNC)C\\;N/U)g;_MSZUP7ZDZ7 eLJ'L6ndMק{ -1(g` J;XQRJrcvρK3 CJ9"*lZ8MCǹzkK]YZfș#HDj"璄5]S&e2/)maOlf*p*٩Θ4* :0/Zֱͭ4Z_.+@ X>kvCj8v %/_\GB^+ayy`'Ntk^bpA'sg)'L̩Ƿ>&{72h +Wˣ =c|4m(ݹp|G{'ڝU/ss̽ێ=|Q0϶uEu-CZXάOuA`EuVamg`b7*&F߂#@a~.~{B>U>V al1O%E""sEE""#TG8 X jqVm{L (5LB,mbAٛH6څ u$>JGY^j$t%QDZ,ANS9\t(F왴2scG={uiCW0^d-1 Ty68g[ bRZK.*;ۀq>HRm_U]c8tך0SD]|EV+iF/’c%:Od=c<$2Оa ߷؜FY 7hsC*{pe3KGp^NoFU}ttj:v2-:` Mwu{<l'0s9*袾`{B58 ةz`hoQrxh KAƮ ۴L l?P O8xAI7h#Z2N>^ 6 Ƶ&V?c`o׍(.8_kcQWsrS om^[)^%. "@Ӓ wJ{ BȑU=Lm(M,@.&% ElKrlkbZRĶ,v;bF PD`ݎ.r~6Fq~Al{ᘄh羢&n1;LRȜCz"1* OC14/*WD̹kLE_k={,/%u`V"h&}kBq:("3$YF}D;*FLBE81w8>d䕯v%194)WQOƓU(_P_1+4b(q*FV'%V7!N]wHsuw7>ZG-1݀w%jcz<`v;nFOa{oftx1=:if&.%H5:tDG_Jd6Fn>nޕxAf3N'3I1T'Ya->0m#7_1yMybY>|Nr]Ϧ2UUa^q}ڸMI.vw^'5[Ja7q[G^F+l͸*LӚv#_ĨqK8ymNYVm)-$ԓfķ| %^h083^/S.'a8]g-T;ߓ-}8L'7V' FasAXPv$ 404ڜmoanw1߸7Xxv_?\Eצf~W}.z:F`џΩXcLIL*T>ocz"DjixJ͏4s OҶOwZFAVeQq^msܚ.9US>܋:6Nj9/Yus"ȷK#*pI,+=E~(M~WXg?֊z_-0\'u%t~nSᒩ2@/kBsTt^a`tTqؤH8^TXeuoO*pzB+)ǙrF}V_>mw|gKZ*?5OpV&W(l[+^ѧWWx08ڽQQm_Mb "+E)iYz6Zx!*S\CX qT%nҌ5T 9Q]}ϯċwEi9&ǑE;칅>SH,?JqoOݙ4UAȢ(l !#xg|eF!gµYʬt/ئXRb*#ME~iz*FtLW;{I0'k#kc)?;!m HHPH.-e6'Yel[aVX %e权[R\\ 9er\ s S˛pb&q9s 9a{Iږ6>}sQ͠?cj$\:_/M3JLX1mzr] ٗU~-aQDmrKҖ(K["LQJRy*J%XHݨݨHn$nTnn$n$nTnTn$r7Rp7r7Rp7⹛qQPԹ^ƹ3zzs%$\"~+f? "p5}=t^ʤ1!)#BC:w}_ GBz]H?w(-A4OHB)LN{ N I$8i|AZIT\TT7iGʫ.dxQ [goZcr 1m F{/@G1\+"R~&wr Z`-FNh?F{.n\m|==\#[.R/}VZXwfggfg]H@1LQmM՛%Ci}ܦ{X;NK5Nnkfkn#= b ET; KkӃ%%\7(RpZXgQ@ip0{j*B%9{ޤ)c~{EStGE{]dAh.E_жL۴!EvjKA~T]mxj_F{] ]Oh$@\M>aP?87P}+3L@1G8DDo9DO=;2YU{G!8]2?0Sjm+ z=!ZloBo\ڣX,NCqg"a@ŸTYE!5+F;aʌ~0&gj YrQ7!h"“u z1XU{OSoNJ\ONʱFrsjf6ҿ6T%Ofm"Fr۝Ė.+yRڻ`\bXgx`R# a;ɝ] ӖUGМh -h`icՍ6-&5mTYǶ4cG蘶ڔ[n隡R:$UZy` i ˰Ʈ+Aӱ(>۾_!6bF}n7"lNQ7T8翳] GCHi5õ )k(:%m#_=6,{Sj2F>Q$;YɽIM0>g%@˪ `nZ{#e2+qtd80\9ɩQPypM)m5ErbQ?$|&[=wYF[cEI[:foۻP膷hjwo$aRTDOlPu '+~!4ل~ 6vh#9`*v-0y}ơO'[M@ƥcuC  WDžrljb-7wqbL0 $ ӇCܗ~"bNJ{Du`_4kaQdhS!"R0Dj~y5,RKi=9|r7F2th0JfpY 馌mn$O!GG"L&YAHH.b&:<&Jҗ}L:c>4'}0!'oJ٭B?-uG3b}FXs± \FRQǎɴzZ4g &ጔVhh-.dӊaAQ0*@{ bf?yze_wk{eZYZ._,*j _r.ʻ(/Wν̯Ì+Yby]_+(/W߯{pa@b8~Y*<&j|]hNS6ն{f+ SU@l{6[$6-OU|p U5I ci{(9G|P$4&sgG%1w~]gsT !ǎ ~A~l?~?KQ@ xBq=MA%ΰ,ǃ_TW6vZCa琶RZ]N༨h>_M9a<+S3{hQN|J~ q%9Ğ\@چE/cco/27.J;c`/aB0,0G,q¡!<%mi+U`d M;*J=b7WFoM[ Q~/u} Gen3$Y{հU;gD  !\#(QqU>[Uk wWnuќ^)(DVθqqUX;f}fOJ/7kb1P[M^:;>r՞rFCv߻,,Hdo%dZl?)rF#Egw w/j Groff/troff grofftroff123456789 text.groffxYO8O(c1`Ђ{!*:MZ"Z/mbvmea@Jjɾ_s}ۄ.4ziP/WuMZ~n, pxŒ|n\q?"܄=~FI9{&pSroL 6X7c_cH0G%Mp}͇{c7GkS__ l˰v Q_;VQG-\2=DrmjYbeS﾿^iin 1?D8<s 1z=TJ]6Hufx =bsJW瑐2̆T(co f/gJ ڒOܹ-GʘLjֽP۠oӃr=!9ATTL㗣bs ~umSs"~"~4Ej _ %~vG`yMhK_t_?b]Gvoc0 E۔SJxEϳ=,j"/Iɜmlfx P.a-\cqK񙂬a zrp(Ԏ%!5hvc3a`ϳkU䝼^\nI{i(mہR's=W>yf1+讫]Ҏ3 W`W 0@;Љꚶ%CafYF+l"enniw6 |P2ơ)XE9&%tA 7AAsgIS32;o0,^3cS\!޶n\vj%:9gYcFZ*%e7muU8D]3Zē'Xcyzl:YM2 B,I梺!3,G+\c]ȲKS5EѼRg[lYN((K2iY[n$SWyxX ^Ҧs0DWRͧ|?Ff;}NXIEmQM.K꒢-Y)xJ! \NAX.t$ͭqt|yLIhe5h PV A}$ngO=4&N%ٱG:LKNt]jfSn;W b k1,YH&9%Se5ipQa6k yYfsEYMSle\Z2/f6򢪉$\5[Qz~|&29\S6ٚ^(ScN)XE˄:!U)-C<ؼ&kϢ_qaų` %yzaS71۽H5ƙR{;0Jr-YKsnՆr' )ŵq+!A!Mea?5hEeTv1(Dn& k=hhu^0X+i*YT:|~\+M2P⚗yiЕ ̞vKM]Y)B_SQY s0#R)R)iԧPruF=Uob$P{zxE JӉզ!M:wzIJ++ xZGo4r:BJhi&?jA67P/bO+qAщ=:prt""u U:傐Df@F` ?\\(\\,@py2Y pEUS%I"rOMQv2f-Rf#T/^aCBp˷(֋y$B.UlwWz??CSo-upP^*ף c@&E\ʞ h/Ҍ!~ӎbÉԏQ)$pM > -GeԞlڛ r]¡?*{6ޯd,ҵp{rYnR[ dz+ljeM#[Y>X6<< k&I:ɹZكW^-">"`{{x$L 벴+ LzlBn,%E7 y0 %6,lk"qeIL۸=͈ܿv"Sc!,| b]TIL7N9~O#޵?̍ɍ^hu鸍ۺ§cm8m0еwlчs1A~Jxu!6kc'$fMlzش6!5m%dl2}ɂt~4.;WSy":eaoۘ8v C됫b?$cd Bb~U9w89Oe 3fpD$nlbǦa 84bs0ڲ/\xm]ܘƉhlSyVu .CAK}wN =~XRT?)b,I'i( sےj) O@88" c* 1rAZg'ݝ2o m Bu7Ӄw!V/K3 PsW*pa\pU$ίyXקgW)+m$y% ZG"cdLYFlTc*-gBQ3)SqnqB,E$ @ng;6 +@'k-ر9ƪJq;{cۭgHGZ]cm][gUf 1{1apvj*_7>Mvoxv-4,cEAy=>1 ێ!UX+_8 dԁk;z^2s ݃Lr^*ȶnj :MCVY]vK(p! :$a=\Kgs!¨p(?9/1d_h!8m5ZK6noԪ0/z/DnO:&k~+;GF:Ys.tGM+ж{5[X,{CC%M*[V6Y g rDTr*ɮR+p=#C#" Dnw v)Qa3X(v%?6O XZ@3,m@x` g@^ȁu(v7'aGuAsp\uqZzL5㕂*W*w,l_xE^ߑ x3)n623{Ye^/X}z?&$كP|{M}pzdߜ~2G}sZ-+Oyw="WjZ~gLQ{)hostshosts source.hostsxڅQN0 m r@HHpCăhiRũѱ__&UVm/OIDž岤Bmhz<K"n 9O0j[K@'?D"dp@IGxF> 0'ao4`@^Y s0$EIt}¬d'IJ =Dw% O1 YE tM*"9_."@:AUp. [hj=*i낡ScMb(Z077a "psS\ދ"P-aʉz YoĚcfUxiQ| TѪFĶ@x]RɧEJsՖ|!5Eg( T )3f*ơY`;zOt5JϊhcDZŠӫY2;v4. 'qm8S`*6#OA,Ih˒͍)IaC,+ʊz;:}-CFKW= w؎HLX_1*~Ye~E\ğ *QqbP"iG1_dd k.oo 䋾⤽vKqV*$dx}V`PN9eG,^QU IJd'82CL֫^$J(TI,\ iiCƘn<'7sR`6WEq0Jr%ǽi+ n1YEmF|O%&'_Zؿ*ϊ$Xy#ZP(7 3wY̏+P cٔwI]/e Ğ&z" %iq*QK5]pS[N"U`ݠʻNW)UNI >"Ns+.HyA10іS?I]W}(1a,m2`$%t'*BUxT9i'\XQ6`ѥm/B%I[!#B6}e%5QuOQ EWS9 ք< i};\Q:9 ~e/5Z!\ɡJsw8ȸ d Gs;WyerfJyM62M,YJñF1@bqNE n|NK񉜜ׅCQe3i4_TUYg U{Lp掳DKy<X+ޢ`?] C;V1ę"-/4P`Hxӈ8p3t*ȣ<>}BEW_ڈűlGUz=OYR<73bP>z7K)E޾U,ܛg"fce"xђq`j2-L<(g#(5в!FMvܥI&:DlѬ6`x6̷p%[ /K aYGiձ\LeW9ķ |z)>;"畘's&}&j~\9+؎ya8CJ;9#>ѩt;ƣؽ%%Q9E{=i" ڌH#2Lٝh^(,4DN+TaV "\?4{c.p+ n,^Ha~nvʹ]WJI`=4-T]2ex]a؝=FEQn_-E|(R?VgfeSKyvvВ/Dp8I9Efs!]X]b$cs!嶢Pd SMEyGQn)?)ʟ+_(E(o+uEyWQ(W-}(P\,+8Vʋً$cb#2+'~lȑ4Y&4qD+˸MCɝIx*FK=˱-_J4a76 罔Yﲣ2FLrԟMjgy'mT&2 h!')0Ƌ ֖BSPebdZ$qT&ĉ/É7FT9gtB,{7mh' W/D+9ANqfd4MɀP2s=іxwT]\AUHQ\NK<5Mzz?!zzO{-n2OuW2fR zSsgVCSpefJyG꒛UϝiO5n!EOh1wwP!??*(d$_pr{u]8w;G"]rg~F2{GLYFba<=#l³6 ~C#]ewz?xWnR^BxnAق&׏87CrX;V>ձ&{; r)R9,CCeh{W' -rIL˳r3UR|{Ems |Bi7y%7%yT3=`v5 3Nz/*фe kW^ZBÞhqbs(7!u&U%68VCVsr/$bFq(:h6G9,=:ѹ ~_?/G~#q}",!:<<զR޹.,J8MWhϝVNf'e"}J+xq1S \1|Wz'iX&5 E_T{ܵ䝢,}KꄂAo޷a~Y3Qf{3S\+xL M ?ETCe? /֢4zbZv.ABq.7iU L+t@T艕e8Þ Ʀah2{--L9DKR⌁<?$Ѝ )_$ܷyڲdgdj.6Bts^ @>>pMcz=4QAfHx\D}I=h0l& N4p0#2B8>3`ŧͅ5]3ݗ#N&h!8䄝Ɯ"y:Z‹aK;7JcƑV[Ԕ 949"=$ 'mPi:NTq#mK5f^O"V1`E\TH'tfϨQ4T~tv*xD$d$S9lRDFဳm|]˓eY UsVB8s*E.hy4_IjLefx7oq,n젛`bWC"F/LEĆhA PĜ6<9Ϥ=U&vbyu1+I]xAbħBCJT8|`X I€dWOӖi4-.Z}ϷU).?ڤ3LdF 4]N PhCs/si)A]`ӹl\.3sjT=oj^+@u^`HĽ`[<H?[ۺĪHT3ps K.zenkm/*wtL6Z` 5x<.Ӿ~V}Le4}1tiJzA_ ޸{ޔ<Հ$9,7D(vM'7^ Cj:U}v1U@ <L9TXS+Е+>̹7oOݯe2^tr|=+;\Z+ +8U<'qܑHyӆ[dO@X% L ̿"隆{=c؎ӵ:];ə oحa7`Ƙĉpp8\tDb))=l9cLWkKt99SZ+])B1 ፊ@/-^^. O9oXA;ѭoZKK׵.xQX"0!t weAFA/ւ,9w͞.\.4Um24eq#)j/dv"8]FXm2$/6z_L_YT"[f5c՟ Ν qu,H" -륅_ʎ:~T*>Kn zXVvH7lQHw!2]1WW3҇إ[8&Us2 o-#êEݜIe1Mc!MvXKxف|ʛm&^CțbP>ĂC~LeSyY]a&,=K>ԟ2=-H_n(]zuU;hNJ7bQZX:Pj~QCŞMpGe^u?E[ɾr}iuWruN m9Z b ~_PΎYH$Ȏ_[P]QD4v0i8r~!5cS=/P,ci)RDB4t/ug[o_ͨ=Z~V:厝7_-mmyZfKC}G+mi> 7=a'm| LoN.%PsJZY91N8CPL,)StnN/7os\\y6գ14mXEb)xuL$K5Q6]t7zWoł+/cnO?D"7OTû`3Cfl,JU&R5h h7#51??]{i?Ody_cY5[ˇ=&9Gmg2ނd!>kXw|Nt3mڒc_THrt}- MǍOVt>r!o&]/#a%b9X wnlJpˆlM*iβ|#q|޲\؃3m .T Vi`@AP<:A(l sz=c}, Xq$WJ B'(n4\[V|*BcJɍaDd)3~E09ćVt%2旸 <ܲ{0\oX"HṸ}- |49_{ix\3rknQ;"q n08TD?l@fq&5jn`umx /lc7 44~P'FԈ{Ni"(UbQxЫp/Z^NT@uɧRh:JO$EnT v HTML (Jinja2)htm.j2html.j2xhtml.j2xml.j2text.html.jinja2^{% extends ["'][^"']+["'] %}qxڅ; DAz`aa-f%yN)nՠRN[3Io@n-R|K2č+?HABnV|'/6-^I/>QIG=YhJinja2j2jinja2jinja source.jinja2*x՘Ks63NGN&ʹuŒ҉v֊N9 DAb PAv*?^"n!% ~p6QH:!)u oۭzꄚJ.N%oX.RyX?[~F>O[O#Fi,EȽQ QtYF㣆5*z-$/=rɉtY pCDž8\T?2 r m sUڱT-`.X>y]E0}p^HCȈRBw>죁zʀ#r$XI yV UFQFTPɅEk wyZ_O?aR[Ppeo4\G$- enOۮmogoߞE]g;C_ٿSK3Y? ,dv:PC\kD)h}iO K+cL握W@!ķ& t[KOb #R=&ǘd7ujsonnetjsonnet libsonnet libjsonnetsource.jsonnetxWo6u[Y C7ly1%AӏؚvtPBRI/CeIT)<͆tǯx Cӎx^m'_09(Zqf^}ɍjQ~JI%֮/ ~Kb>Juliajl source.julia^#!.*\bjulia\s*$ base_funcsr\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|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|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|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|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|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|splice!|split|splitdir|splitdrive|splitext|splitpath|sprint|sqrt|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|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_pointer_to_objref|unsafe_read|unsafe_store!|unsafe_string|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|invoke|isa|isdefined|modifyfield!|nfields|nothing|replacefield!|setfield!|swapfield!|throw|tuple|typeassert|typeof|undef|include)(?!{{symb_id}}) base_macros\b(?:NamedTuple|__DIR__|__FILE__|__LINE__|__MODULE__|__dot__|allocated|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|isdefined|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|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|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|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|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|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|splice!|split|splitdir|splitdrive|splitext|splitpath|sprint|sqrt|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|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_pointer_to_objref|unsafe_read|unsafe_store!|unsafe_string|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|flatten|partition|product|repeated|rest|take|takewhile|zip)|Libc\.(?:calloc|errno|flush_cstdio|free|gethostname|getpid|malloc|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|isapple|isbsd|isdragonfly|isexecutable|isfreebsd|isjsvm|islinux|isnetbsd|isopenbsd|isunix|iswindows|loadavg|total_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!|nthreads|threadid)|Core\.(?:applicable|eval|fieldtype|getfield|invoke|isa|isdefined|modifyfield!|nfields|nothing|replacefield!|setfield!|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_opw(?:\+=|-=|\*=|/=|//=|\\\\=|^=|÷=|%=|<<=|>>=|>>>=|\|=|&=|:=|=>|$=|\|\||&&|<:|>:|\|>|<\||//|\+\+|<=|>=|->|===|==|!==|!=)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_unicodea[≤≥¬←→↔↚↛↠↣↦↮⇎⇏⇒⇔⇴⇶⇷⇸⇹⇺⇻⇼⇽⇾⇿⟵⟶⟷⟷⟹⟺⟻⟼⟽⟾⟿⤀⤁⤂⤃⤄⤅⤆⤇⤌⤍⤎⤏⤐⤑⤔⤕⤖⤗⤘⤝⤞⤟⤠⥄⥅⥆⥇⥈⥊⥋⥎⥐⥒⥓⥖⥗⥚⥛⥞⥟⥢⥤⥦⥧⥨⥩⥪⥫⥬⥭⥰⧴⬱⬰⬲⬳⬴⬵⬶⬷⬸⬹⬺⬻⬼⬽⬾⬿⭀⭁⭂⭃⭄⭇⭈⭉⭊⭋⭌←→≡≠≢∈∉∋∌⊆⊈⊂⊄⊊∝∊∍∥∦∷∺∻∽∾≁≃≄≅≆≇≈≉≊≋≌≍≎≐≑≒≓≔≕≖≗≘≙≚≛≜≝≞≟≣≦≧≨≩≪≫≬≭≮≯≰≱≲≳≴≵≶≷≸≹≺≻≼≽≾≿⊀⊁⊃⊅⊇⊉⊋⊏⊐⊑⊒⊜⊩⊬⊮⊰⊱⊲⊳⊴⊵⊶⊷⋍⋐⋑⋕⋖⋗⋘⋙⋚⋛⋜⋝⋞⋟⋠⋡⋢⋣⋤⋥⋦⋧⋨⋩⋪⋫⋬⋭⋲⋳⋴⋵⋶⋷⋸⋹⋺⋻⋼⋽⋾⋿⟈⟉⟒⦷⧀⧁⧡⧣⧤⧥⩦⩧⩪⩫⩬⩭⩮⩯⩰⩱⩲⩳⩴⩵⩶⩷⩸⩹⩺⩻⩼⩽⩾⩿⪀⪁⪂⪃⪄⪅⪆⪇⪈⪉⪊⪋⪌⪍⪎⪏⪐⪑⪒⪓⪔⪕⪖⪗⪘⪙⪚⪛⪜⪝⪞⪟⪠⪡⪢⪣⪤⪥⪦⪧⪨⪩⪪⪫⪬⪭⪮⪯⪰⪱⪲⪳⪴⪵⪶⪷⪸⪹⪺⪻⪼⪽⪾⪿⫀⫁⫂⫃⫄⫅⫆⫇⫈⫉⫊⫋⫌⫍⫎⫏⫐⫑⫒⫓⫔⫕⫖⫗⫘⫙⫷⫸⫹⫺⊢⊣⊕⊖⊞⊟∪∨⊔±∓∔∸≂≏⊎⊻⊽⋎⋓⧺⧻⨈⨢⨣⨤⨥⨦⨧⨨⨩⨪⨫⨬⨭⨮⨹⨺⩁⩂⩅⩊⩌⩏⩐⩒⩔⩖⩗⩛⩝⩡⩢⩣÷⋅∘×∩∧⊗⊘⊙⊚⊛⊠⊡⊓∗∙∤⅋≀⊼⋄⋆⋇⋉⋊⋋⋌⋏⋒⟑⦸⦼⦾⦿⧶⧷⨇⨰⨱⨲⨳⨴⨵⨶⨷⨸⨻⨼⨽⩀⩃⩄⩋⩍⩎⩑⩓⩕⩘⩚⩜⩞⩟⩠⫛⊍▷⨝⟕⟖⟗↑↓⇵⟰⟱⤈⤉⤊⤋⤒⤓⥉⥌⥍⥏⥑⥔⥕⥘⥙⥜⥝⥠⥡⥣⥥⥮⥯↑↓]y<xi5pf3+v 6$pO&IR WWujfߗN}3~ ̫⾻TKWۉ qҒJRI*ITJwa`_9\fG?yuŷ?*!OTǵuN>8W5,xb a *vѓI,ږWnM 63eZ#FLuK4 ]u> ^uif2\p1Di{uc(+6 ALuqV2gXrJw5VP<]KN+(59hziEUKQvJ*[L ַ€Qw;;ݝiq FwCekL+۷FJꪖn߲e(. ]iQiY2Rk`hd@ymeM(s $OtB~VXڐH=(u[W;5 1C0ԉ;ԽTKc ND&f5aO" 7q{`*sTNWϟ&㙺Ht߽*x~/͓oBOVzx@`_226 vG`e0V>--}ZvdVO|F)DG}Ii9t/ K0<ؿJlK;t$ kڄh 싖Oas_Sj[4T0(KF&R_cϤh$g1o.i+D3-w0ЫUfZQI ù &E{5EDlS EqM'e'LVM U㑞ܛx )/ћaj_C?jDg=@^Z;UurٲEJb|(YǦp2r^NZEڑ?sZ ơ[kɡ;ғ=|_oצD7r~W$g+C߾U"s5 E4AԂXnOΞ`^n|(6I"]Tca0$!+兲sS lEsy>VlM-2"n/NMUD","uag;0͙ΕBnF75N*`:$)Ng(dgƵQ!'le*3:n:.Jܚs 틢~Ҳ"=ڐwH\sȳ1N'u˺$2%F5M..(R_GZb8ɂbm .ύfT.7&Q>o]H0mX۾Mov BԊBa/;00;r(>JC#,qOD4U_DMyx8Qg2&\ղ)zOgGӗQYӿ݈ዣ9GX{v׬+e woѫ29G#OÑgp8:y Gށ'pY8!~G?pK8~>cñOp 8% } Ǿaa?GaQ '`I 柅`y_Wa5?ð,0 sPaIXxaXx^`, 6,EXB`,wp=8.xN|'#81N| '>É/ėp+85N'ɇp(89'pѿ}S7KPy*CM VaQ;s0 = ss0*̢.0 ~_W05TCPy*@TBe*A GTʓPy *OC< GP*@S|ϡTWPD~s0=sGasU{构`i3`̽s{0>}sG01}Ǡ$TsP}/@E՗ T WTAu7T硺շzPA%I!T?PŻ| Ϡ9TP _C+,Op8  PCm j'vj@/P{jA}}>'PjAs}/Ծ7P@A?ԏ@(g^ԫPAq?'ԟ3PAy_+P3_kP?ס߄[P߆q/B:ԗ~'w߇PAcO?P_AkK ,=K#t,,U`i(,=K$,=KO3,,=K ",Kҧ,}so[0=s1"=?30,b{*X/`P}ǿYX|߂yX\ŷa8,.b 밸'`$,"> P{jOCY= ^P{jo#0__`E{ ^W`u{0%Gb:0T@(T+PjB > Ǟ?O`(, ,~ǰ>Eꗰ5~=VcP{jOA=2 נv j1xcx=Ǟc/3pw{0? *? ؝V`QXx `YXx^`ϰ*,`, ,o͉CDl"6MĦ@nE"@P(RM&bDl7&I$tH!I$‰M&bDljM Qg7;~tc[m4_Z/=lw[ s֋u$@@ $@@*Dl"6MU><ﶦmk|s=G:P_۶P*\B.!K%:Hl"6M&bShhIjl =1TlZV coնZ.E^K{i.I$QDAIM&bt+uOYm[繢-Lw8~:HXYwK]Ӎf,hz3[xů ODzrvcʺMrw"]TwESiE?ꋂ ByuXvmFclwH $^LП|ƒvmvسD4xްԉmœ[TsCJ錔{i\~۹N qsȿp}{c2JRrF|yHGIA*J(.nW0A?^RX.Um﷛UEDC9>[qᠻcqՄwӵB~M7'CךrPyBbe9Nˏkti,(4ݗy=x=FiFiFiffM&bDl9u#F|_,<G/0=m:~:m_wXrn#` q8ALbDl"6VCr̭L8A N'Il"6M&bәT0}ӈoƙUC񜴗JugڬmMJC*/$VXAbM&bش*c}{P`D5) ~O۱<;ΚNT[yIEٛGI 郤>H 4cbDl"6e-TKEUfY 7[G w Y t:߬R>[wnh塪)K,wKC޶MUӔk=vε)[%?$u,`l(=ʢA0;ܯ+ tGlF<7YqH"+H'6M&bi%jm{lV({;/w|4Y/gwHO4]weryi8\6Jx8޻҉%R+ xs7𜧺l%'"eMiH\s\~R,3s?Ii,^lkq݈gĭTtmXՒhb2+[efGChm6 wᕁFLFm7^{J afCx4|e&g6ڔ6VI|elM6dz<hE#k$zݙ!S)4YE6RbԚߏwéF]fքt~_9Ap}g9}yN1l]sfJyp6nmۘSl֧5Ŵ>67 ilT2y_n*kF~¯!Ni`a-tE8Fx"(ljcNK~hki@GnHS̨q 00`ƿ+C-hSbY>F~ J1?6ltCe9CūxꢶAWgl>-<}XdF0^P q۸nyIwG%8<^%XImm&aްI7wóhY4얽n;kq[nۺg7:l>vo߻ֽ[vݲso{ kms`?c};0)E"hןn8T}f9gL[9̨tÇ?~߅fxGrӹ{7ݗ<˭FL۝hXhXhX\M&bDl42 džP(E"Dl"6MĦ2X?o`cG#pD8ҾM&bDl+E"@Dl"6M&bL]u7q&ΥpD8"GDl"6M+о262ݨ`lqnOCsgޙ9:g|svW'6urZsiggljq8q8N:&Dl"6MgP0'[{w/FwM ` hA a0H$Dl"6MĦ* /sl,ϭ?rwf_?|,?4r<˯,ώp d曇0Gfaio`XiiN:Z-`H1Úb6w8˲ ' ;t, 8S*"'y4*)XOy)Gыt8!a UTP4D&,\qΓ@߷,9f[+8qJ-4B,ʶ(p+8miEuSLp̌ƊlEC` mIG56iz؈4P@(Ϸлnڪ鎨PcX6pϥl(3-+]v{{RlV&M0 W:$%Q{˶_3goslΔυ^IVÙmc֥Y|Sʘ?I(([F,5.녹I=Y(L|Mv?/(*Ib8X -^`"_Syr|U(8, ,N (Y0/LS[T ߋLMMێ+]8D;O?.aQ?6mmG|Ke X\ߔ7]R0b;@)25:\Wxı$D#RXv7b+`: *̢5KmvCm\p%MxhrlO1Q/]6lx̰CV[:p3N (he!lTmrڲAB/,xwhKIe`IKz* ^\ fA.+2;p*DGZ+zfJfX -?YұDijqJ@;] rl*"&B/;8]EfYf&(Y9ekjl1ⱼ >l [$@8eeQX|,|ȱ+~r0=;ubF:l/%Qݎ +yJ62*qF1J]q/Фn¢Ǝ\JAZ#>(D}, D&kG2 .S~a%nh{21@xK3h"̲07F=\~kį!4wq^RTą*T43ps@dE5>iE??bG`K5ֶ"~ߒ\0V,GQvp[4!ZliBuiFX`_Fd,ы8pQ4C _(K3'Ìz˜8 P0GԤa -uq_:4PQ / x–RpG:5!d- Ym!|`]E;Nmӡthy<t+6C7+ 4DG&NKa+BH#-%_qɕ:ڶHIvjwK˖' ST[d~G5Pdsb-~w3bA/G4;a`햶ڊM]˅U<= Œq(14r%ISa肰)KUBqGaMэHʉ|1MGw@ }#ʛ).lRB("d&B6{fHL0oCy ϔg:J#=!0ւ ܢlY(H<L(EnVߨS>S>=&bDl"6uWqhE QGZ$/\-8쒸ڳ6Z-{o5^ޒo_[5^oA5$2# ߗ򫔳_'r/b}>AO'BJl"6M&bS{t ",2Pe_y%6Fb"6bDl"6:M$F{&6 Rg~>ڲ4}};zڞkbpo:''Tjb5XM&=Dl"6MĦNz$G&N"DQ(BO&bDl"6[Fs>.VD+ъhE"MDl"6M&"DQ(BO&bDl"6DTlވ"ZVD+iR&bDl"6u֤262NE{Nt3Ea@E&l|I{LY61P&q ZS{C)>UڈeGӅCQO'I-%6M&bGQ(B!'bDl"6FKPE"TH"6M&bfQ(B!EDl"6M= E[tU*B(bDl"6Nw19grfWvY;x8hh[^y(ϊzl3hx>'HܖsÍAh-&I$iAIM&bQ ÙPC0'[W*+Rb.unmp}0J;H#>h@Dl"6MĦN|x2 YO5ī󁏁kQ8 G:&mCmky#-Qk'ɹh$C)5% SuNj;^Tw8$vi$C" 0$C5Dl"6M]jşU69E\Qkq$z=]4L_&lHU{;dD25$rJ .8gILB $DAB)&bDl"6 ;Է?z{@FL?GDl"6MdדY vE x ==/+:&g:]$yM4mR>oh74M|N߆w{e;}];c|=4E[1;.Ӹ8vњ1UVI- Ee3yLQǙ:U#jZҸj)s0^ͲmfJ;2+qfۖ٤bHlW-)8P]L-qd&㺣:4n(yfW'7tY1{#7 i9eꊡ8[Sp㎎q,|Y1ߎZ岼\řM * M|RgSpb\熢.k|zPݩ/үkQeid{u`O*._ ;^YPXh[mHWI^%yUWI^bDl"6::a,M) q;gGq^n*0秽.-c4MwDJU# ֶZ;Rߞr{R?rrI9oy30SΏSj3uvJO9PS{) O G7T2,Yܞu>02]b]/0>BWlfv$⒴(ʊ|WA FHPnCfyn}_ÿ,3I_7gȈY~ugyv̈9ίo#u܆.=Fx6_(ѾmK 9)ھgj9Me=s O z,py2m#R{H!ԞoO!C~ 'D`"0"pھݒ41lc3-([iJʹXL,&i Dl"6M].P/ܛ ua/Zn.'4|vY-Ur`)D A O'I%6M&bioPW_Q=<]fCFmJ|;ՔM$_v}oy?IiЬS|ǛPշv) iSߟrze:|ڻ'^ƐK/I$K1&bDl"6h4&mv9SC=-gvI{TYW7?i Taiw wW@pF7];6Y.L/1eʔ|,ڐfybcۦD^ 3:xQPV7,ZM9'Mr[$N;$NJ&bDl"6u0A0ukjnljJ9u;YoZƦJ$P@I% $P`Dl"6M++7X"kڨ-'owy mEOO&?@$M&bI$6M&b锧'Y2=*Nd7ӓuQ{5|ު8o-ES-n;]il*߭,qun,EUԉ2qq)÷Y6Cۆ>Ρ˖}ކ.CM/2%пض2ãmi2#~lGuՍ8e#RWw#UQa٨#[oW\,I3:ޫEc|Sػcik֜-Ywf'E?+i +("tFHZA[-@35ǏdbZ*NScṲL1F6v+tMo+dOH>m:P%ez ]E#MUҰVVl{-o7l7(ô[I'tmgTg-Ci^tOٵ5PrƱ2a6ϧ'35r&-s6% SALW/tN'(v놃߭;%Y[Ƥ1?ۭ6Y߽c-J\:ew-SV=8esY9H D%ac/+ٿ{߹o fKe.A0wj2*E5?ܥ X3Xvl[؄BݸwҺI241]hӬȤOf^ms9]:?6{ffI[Hm^),?T!n{|Z5gs~yD]jL&8Zؕ'[q"pDzS3|l}ƏR;;G"bAq>gE`L¼٢ j1e ;ƛg쳹{5_xt5˄Ҹ*MH 9 3H 9_PٲANbڮ/v#8aҏMФ MФ MФ MM&biŸFA Y>Y~_,'Y~Uoޜ##FgY>>0Z2#N8jy {o]sr,~ O $@b@O$/+T1\^Q%_;n| k})@xV'͗Né"7Co[&'aDj? 90 #kR 5c%ÒOK򎞶]f$@hH0"#H0kbDl"6:LJj#uԥFMѐhH4$ M&bQSv3|`dXGڄ]L*h9)yi|6O&wl]Q4r{渙E1`L0&Hl"6M&bӊ7^f[I,Kotlinktkts source.Kotling xZ{s۸y\×_VD;ϻؖ54mtک8٬iRGRv4rl]oJ,RbXv'ζi#꿕GLM=dd/(T)KJ6]J+%{M'od>vE.$[9:a߷\'Cz1ȑ dvTA,}J! Bfkׅ,3c| Mt~|vQ 3]o}vf;)[ {.~YH/#h𠊒pg9;3dwdl)^q9n[P)]\ 4_BĴ\(!b:. ,ԱrPAd[ d= d2lhl,sп,>mp >~=N }b $A  CIV9 c)3NsAI_pZ}K}ɍe_q1;k\pKARQB)~( @5Nnz.=&%h%ME[j5bk$<p _j 0bL&dF]gaOsr&G#ϒf՘(&k|kd2ʎS9 K]c枘d!m.+-BiGRWJ\)ԕ6qD ةF(8lPyhefC=\z.ǨS2)'E:nDI)+tf<Of`nSbа`!> 2d#SsPtI9!^5rB&U-LjX֎+וs>uCFy9GAwꖡoMc!?*3yHf]1NiՋugg*{S%UN /ͯc%.W͓-YoENi2eSS1e#Ē;9ݓs}pGHbqMR%͸Π2p!׃] |N~~~ 7 ]R<7;B"|G[cH5~Qт*/:W6Y;:3\iK7wy.|7aTؐL-ýЂZRtB3Tc6-0y]0,&^oCFatd?~6$rlc`ݼ,HR\ =vfy"(9@Y*rOb/JG:}5cɊ$>S(N|"E]8ri0E I,D3?"l(5d)7ִh۬iR<)BcFF*D˝i2胃HU]Y1 Ylrè8 4}0ޮr$=jy6%ż&=d8&?dhIJk#ggU |wIwu&l2MT?h M45uQk%rEmmcsNrFP$H $+v]rϔe٣To;[U,~ :"N^EVPssUïj 8i~C-S!3g!mSO\k:7>.n Znh'iu }@v$}: \aGU.AgCA W; r7\.C" !.  e{$tDF$tad[ȏpnKZjeL&. +Cb܍X<0v9HxGYJGYOGzpײ!]4 m80x3VJd(9!!2W7$|u.tӂ xUv1ϵH+Fl7SUn$̳|2{lR> ״u I=eVD+3,r`GF4>a$eF+0T,d,}` ޲̘4&1FjXYE6] Ƹ"Fo%u#MFBcQeg'݃tSk^OuA@PS#KKĀ>b;_/%+Ge-dj{Z؅ \Ô8|TcCAʐ /%:ծ(^O;zyCJhzpXH&*.9w3NivA2uI{SLޒ~qaez:xǪ!qJ1JH%^) św@zl\%s [gHZJwp26FNwQ񋼳]vaG~¶;Ķ Z wew- lo= P.##He+ E6`g'0\A|q[|>JnC j`mR& r1w |bк X]h[ 67rRV_aՋ{5!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} GuJ8ƀlK#WX#9S33>F={H%rrEO}BNpNH!U53ݫYI+yuW^ϳ6'S$wagO9Sw%ϩSJ3{%eJpOp{@=c<܃pIml8$i+Z+GaYX  0 VZ]3jsJ$9Tܺ͡9I_[7"Pd9__7"Pƺ9t&(tՋe_3paFUkT Sf&nON|j{)7˧AwxID4y ^-pE}4S.hU'+[-,+*i K =`d i Y x^g"+[TuUJ[á3?/)nUdžxbm$$MrN5ɥprI.$%gJe X83%uaU?e2NURzb%3KY$]#Pg %pUPHխY#i@چYuϮFs@+\ڄyӍI IfyĽ@4EfQ= l/ť1H>_2 R lBOTIjIjyIjaR% 7$uS2~M) 2%n'$ו :+B7ԁV: TZ!@+~Kh%1kh%'[)zRo JW4-%"wNT%~WT(}$HUL\NT}}@E_?0PNTTCA@EK?R*{ Ӱ~t2ϏM#ekgQxi` /)'&êrR<SORStk4??$o| &k)^2$ y F<-~WDYkzzQHȟg*HAEd# ViI@xdJXxx>ˀ)WJK#EEq=? "$[njM ֑ uU^JtSh@ v06vJ:o؃[iM.%oYgil$ot5 w k}xJnw6 O0!+r$gS҅A(FyfMQ} @BU>^Bk,asϜl{0zio4}U ;GtVEQ;c Nkx 3Y 6ﲈOm$YTnѲ`aqʑ-˲~ _AkD c)-CQ_ B g `oEﱚ ~t~U ^==gN3x#a$?XS|'n '@B]ZU!Ln3Xjf$ؿeI8Rꔼ h3,(Fz(*&"e-8$S[=' sƼŗtAX|h\KY ?Vqd*a>l5͏=JV_?eɼ#A>7Zt--~x~ܭ`;й(]fkZgae =r TC]vӤy$k/M b]G=0n+UzxWb% N?ݓje0ix11dE#*ۏC%waU-ي5Ndѩ!}j.؟]˗K(N `jqm ɜ-3U>'pI 6MbĴ4OGRY b}x5Uw) {Igˬ]e6%*;CSVk W6A5 OׇAz-2> FᔢK!;M016a4 \\Z^V2msSYHc8謹`vն\HIS.WmLPݵjMϳii:&g۷w]K 闝?/?O⟏9sKK %Y'VC|yy?o9_+tyy_iQwqO}ކlvvUp~yB&Mo &1RD`XѺݢ]DnkbeO <%馛?m2 T^*{ʴ*ٺn:Cj dԘ!֑fEx[8[k 5W5ӫ5yuEO"_;]!:4㴒ӎ`V Wd5WAg ߫cvg1X#oN~ԂTRZNDٌr:ߣ/qSFSt%z( >h=}嶀hPgK m:/"o0_vzNsuVyV!og I89u5pc=p8ز\5u=psCs<|}qy9g g;7wІҜΙ򦋌H5- +b\loo>]0|%`ݹyQ]4t Wm`WCԮJ}w䚗]vqo[:zJ޹:Z)88ץOHk4 p: +(HLz$ڽ C Se4^,RX)~tIz=8k W۩β*Ih z HgMRPPG!QPC9[t94;\3\P#'mfxf&'Y_&ka;,$Y+tQI3.4lLiacRLaC%hGsW(ͲwPI]pWW0~f1f?P@sciS]c՗gda=Ua ,I3qz]9BXoz{i`9:o+( BFI`a#7:n-iVơ>ƕlU Yas|kX׈7$"OfdE=[MՒ.μKm>9УjZ)G=5јzqrQ7 KmJ;5ޛ}C+\j-:q (d+!AJYh|vӟ8 |wqp9fd8LM;*z.`s KG~Ky4p;:a9Y~R:%7'nrz^A$ 0D}^I銟Ga+#<~` ''B'At4z|bDh@F܈+.%R^kN[vQhJMlona/Fs\oZ8b+IK`Z9lFtyqm:y.YzaEeTZ|S +Sa>&/Ϸfib56{ӂ݀81Hh,VbX H~)mUl/ 6iU:{HfdHv#1.6>|sYyt|?-clF7W7s [q*.l[ T{98nz_Y#s>WU\-: ޫ^ٷDvQ^tjHQە{%z1>4\z/dw7V,?hd}s܁.Qd؍~WFg~vk;=Wݳi?y\1Mq+p X%Tt0g!J Q*"IsurlCOq.A4#]f$3~Wܥn} bCF)wdot| >^ާ$|,`{K, "8$igI8Į2hGi`s8^2,(95^@KRw P l(v\v{[QR4$5)c+Ӑt֖-zlY#p-Tx3u, 6ePa!i# U&UN%{'ȳ;͎sVwm3ZW J+l0Nɀ;r>)Vj9E>ݙ>Z)SҢҾtnT.0#9r *D;znљ茢3̰CQ[ܿP_TiSG H|U>i>I7cd:TwuA\/Fy]ftI8DlDܥtO5dMѯsxv ?ظI= sc?C*m7^I_w xcqxiiQ&MNbj1$vej8zΝ:}nOީCЩXABla4mvSqJ:/tw̝?~jlTAoW突&Zl:o# JBTF)+SHRW]MeK`LAP }+pV:Vq*+H%11z]@-RRĶTd}?H7;lyey+[G` 7RašfLf!!wA!ʼr|gTù}L4Bw%u+=O}@h1Xģ/lKވ^&$7NWƔ8 Yk0 ;7g4=HfcKG]ʗ:i화gRSIɽ]"&ClK/k.̦"Ytd&:LjNOCq͝6Zqv޹ʥN Ģ6aWuiL(8^\T)m@zdrA,!wӉ lϸLT=Ml@G/*sw& LwʲJxWFMR87Z]Q06Eĕy"vW=E QAvl 9w=WbEUNEWAEV}E*ҫA>0.0 Be-\T =6Pݓ,fWU%|GʦYCU6vNU+I#[UR.C[եL* {NuUJjÓ'uې$pƶ: m`CQ8J7*}^IKyQEi _ZO*X?V7ݪn5W2l#ڔi c 4n3{68OF[Fi,v:n?_> BWq9U(A6ŊVh dbscU=Y 3ĠM^=UL = T-$%j:ZI78T[GVՔd٭X1zawaǶq-[OSǴ}JAPR,dF-V͕>֟^=/4yH1 Ol'DCܝ`= [;$U*mUDKo~ӫō}i]>tpGo  &K}E_oOZ|9j^nTsmQZӉ6WWV}uzr5>M{3mC!ጁ3M, a;&VbI% |:'>סl'>^{~w˒<^!`3tPٝj4:0i q V}-HBda4M<ޕт0Z107BOCWUI(alBVRzIq 5o8^>Y [8'!Xᯝ~E3c>)r]jZ"Fsrc`ī%[%/;zb|@h Əc dy?yzv&OPb$0j胭{%g b0y|%4XKM2$ U@Ӳ>|[0V0ݮ\OYG;EL74(c l" wM(. `ՐȗW6Sx_ /b/⫢ }^:DA9;DNx^':M0C,`쇜H85`c+΍GE,}c ·9h̀ &*&`{H0d C$LM@dpDdB gFx.~*^ lY Ǻ `4BF-,&zWgQ*6+JOFHrm!'UkOg@aʶі^^$ YUk`p0=CgIW --nFVY# Q4]wֲZvkكgJNUlWƉkZ*3Lyr@B^>XI"R)^=Y[ؗÇXծ^cud "aolnȵ%PL<,=Z[1AY?q\˽O۱o";!b Yo6<~>@PqO0 sEW#CygVepe?v^_"GD9GxH8K/Tq#q~#^\E#ܦv8(0*~B'U'Y1tCG,@:`d@:@T8i2:]> 4w[ Όk5Si1%{nkIby.sڀep{ڐ6zt7!{[0;hf̒SƐ}\YmM-A>fQ+mZ !{a7pհp͈r DI!sf,pfnYȻ 0t{D4O46Kc>^z;mՕ۰oQU7@%jQLY[k}!<('A΢:tAN)J S(\!^'oF-b4%[|syxK:!n͐@fm&?uf~aZڐuxI0nf_YYMq'~\,a볝/ ;H  [cܙd~@Y `O%r^iÈh E> 2Tm峀 /ZR#Grs./eX hþ=QvFu k!?l0kjP<whPC'adf;֞ܺ"Ҏ㾋CG-,'h2f;GY7U(#S@4;50u8)=Ƌ31\OWKJ-N;m~H/,ȷuR1ujQ}K S廔p7[`A1EjMwld{8AuSTc vH5b\3qMS t u%\p*$ aWq0u&50g^G^/]|..-?uرcc#?}}wI?@8?m6<=`QPlhN,SϽt6vb\^fV's3V=G"r k;#H|tfH&ѽ mm4f eՅb}og\X> z Bt%} XT#g `` Vs9VlfBl'nM+ٯR[ڙԁue)kC_`@<)-97eōv| ^.}p- M8/h@|Nn7C"n u@4z5F~PwErbh!{!sY)o,śU2.ffe⮧dr!BTِ0 b3$l{ka0˃+Al^VÐlU/.X]7zVB^=#K;2IO)ۇC ,U[:? vU_@ taa$=Ynv AgT[pY)z'Uy]:Nv8XN~m+\/LVL^]<6F hlHZ$/iy,I;iNq$_\ Au5YE0m8ya% 4)lQ4j儦P}`tvQ1Jw$mIrMe\b0YYL u bmG<Spa$+u7#jdYRΐ$59 pv6h9{K.w|[>aŌ$bEx.>cq 8j<3FhԣBl&fDl"3S ̳q|ꅚIl6fAJ/bw1EC!z )ORslƠz`iKj>XbT 66J򠕪"[ /\waYY,53ij(?L!OKa O(+*#RmgߡzS}!< ~[[W9 +Ҽ8ՖOwO𩾢ly0G\:3 }󈂗SA4f; + d_ I(r"kTk< ͆]|sD÷o}a_sx."uޔuZ΁n6u@҂~14z@[suM7ALӮ *f<^5[TVՊT"O+"7+"g*"1k~i *=;5\{>Y^$R2{)އ]n;2ߣB~QiirB(>gaȷ;gՕ1ށM,x5;HBU`]zoΘi¹lI[%7`  ƶ0({x~"czzE7U^E;*"*W>2vF J;3cJ#e #PK|MgݙuwfݝYwgݙuwfݝYwgݙuwfݝYwgݙuwfݝYwgݙuܗz9dQ=y0*…%-~찏a D;yM5*%2 rFъvǫpvw )[F%}e+ds|FhA5.Z&ϧmii//ǰmtJ`))X@C>pd*Ġ* ΤD(vr͂-D94;ܢCpe3cd߃LuvP2w,>4 VqUbl YZ'Z‡Ej a6oA(S01G3KI#aK? Jy|KHACO8 1 x^d edi $`#vjGPQ8kHI&>ۃHA5r0yװL$O#   ?uNW ` ))% F㩝 Ho 5xYћ/a0YX ~ey la },i(M%m3f O0+{Mj_>hž&ci'Z #h. ) ai\{ɪ^L~$$U$vQjEE R*e{>L绪[U1W7\`Ib!NHk `]aeD$It&R r*WA#e–( !A$`V+Q8rTp=hohCKç[WZv Ƒ_JB[^V `Х/ o™@"?{]npv:EnjsPv&25'}^_ㄼ.IQMgӯ?*+f&콭U_b=k~*0~N]e?40gHnR`u`Zh{NHd\Hoz_UQַ,Z9.38ΰ"n#.X<^oja"_kfŋV`jkaFs3,/}ѿͮ}naobֈWοM.:AKx.LW.#R7{zam/g|ܪf9h3cv!ޕ5o?o b/.c8\f-RWfP߳N|+o߷;})؂`/)gˊpyT`{u  F:{4f+U=J̜%Pg.:KtjlԽ "Bu$q?`fd"o~I2*6)ʨM Z A&T =t÷U|FFOIޛA@A'?v5HM•:tAS>pG`=C^wK[:o_gԨ^LeяP^BbZe{ *"+rBnËg˚kL Ƣg =p'딟_Vs3jN)2jO)ҬVG܄.FZԃ ¿aF.zXa&=xQ~EUIU;38A^lð_ǽ 7oyҀZ=>v9 c%鬝~s0 sj`_th*S;]Z#6V;mV>m~YXw6vzԕ]"XxwY󱿎cz:Z"Q,lԼ<ō^ɑΏJW[yQٻ?#9}n s1)r|H-q"nwqa?bq%$c&[VN50f՞s!}Ţەs$q+guV(XFi֨)<scQsՌ[4:,Qښ7n6  [OԮ_^:[ b6LLVMll source.llvm.xڝVK6M>\ EE:HCK"G6k! ~v6`rFqf͘κ~/cfR"|uY?L^.;>V*Ob)L(-j볓wNM#ajhXoeܓ]v-{vs~y?ljGg&X~ߞ']O8?"2 ginc#󦖼RzΜG^7{YGG9E5e*PJ6V9bC8Ece e\Ӏ(ԥ Z8(BZIȎtoR{oZݚ-EGALMQ]a \3kB(HycDo-P.y`bsnBU)j1 'xno7 GHFvw l ڠYbu!ԲuÐky&<rg>;DDa 莺Gw*,p2go]pLIR][;vpR+ YP>jV ձW GyfȢ8uRZ UP&j6y ֥4 y9GMn:?'F5mlqGx}!NRx4)9`716aaZ*혖vYǁtbp| r-ArkRJA<*Oid-R3Ё>vQTdDB;46 |DzT]Ǟ(%ecS yѿ]5ɇ$e'x0i JoyRw潜W ~8/?_<wxCF(Wj> wn%ǧ4z?TRj4`zĚGi/[f%˗[?8B`!ߎ_~_xeaxėfx\[ėӻJĘ"~u`lxůɹSoCN|v}8>[Leanlean source.leanxXn5mhKiK۔"ԦmiD-OH ! f؃IvUWBBBK>BnP'xvwښ=d-Dz!bQ;jUqʹVMP" ߣ֧vjߵPmm>66gZՆ_7;!9{_hoZ9 .,eyk"ZY5v%Ŭ}ۘT;PcIy*5FW,Yjio|' bD[%˵{wCd` qˉ!Y<@[BB qOsPvȥ_³ȩCYgP_Ӝ~]2q}~h 9"D{FiX"FhPCFY7C;$rzDbw\vܾ߿=lPk;*?G֚^_nDmT%aBGx*,>X -IɦEBM*(JP?Fs "tI^/zߠhPs?IFx q6_/V.s ܲsmd-ksU[t!s{q9sƯ_|%iK ʭ%l-ڋUلwM{;ϟ=?uO;"F><|_/_`;p)%l)VZ.ZkPg$|Vb@/X1fG M>BIW!\]EҒ L+;㧃;nMpv{;ka/8N4Ųy gqcqm%=i}A*Hw ;7iYMFay4~~r99@+} SQIYv@4q":JXa%ga9ח Մ!aPh{NVTIbRsH5_ F9UDToptR j1 c_q+GTj~q̳l-i vqqTnwuws7ծ5r6]uKKQЫXmuӟ޷Wv5r~W;F\*ƳW?m.jD_[ LiveScriptls Slakefilels.erbsource.livescript ^#!.*\blsx[r\'Ne@iQحg8$L Z%`D{ }Y@@$L9#,={Yӥw,mOXtȵN9l0G<1, s/faMqG,NOYhy9m%m,LZ7R c.1ԏ(ǼZ?Z?1׏,F%#po#`ʷovV׿IwҶ,\riAv}FwYcAĞ`ɱU(Ǿ[ÆfCexE՝~ l-˦pFK2G%J{! r*>+)dzdz꟤%/ktZOғe֖sS VZYsKV35M`u;۬xM`[lɯRH[TZ?]nXZ>6._;狸t_Kh{]8kzw`V+(`E,⚤? =y'ϑ<䃹?g*Hh*G%ʼT~S?qD5XXNZan$z,ūQsmL 3=Cr,NYZ2l1gΜyA`W>~Et/Nk 9s|ȐV CkfZ"o-Mޢ y$T Ц c"˥9hˋW2ϥŖ..݊" 3l$w'+U$B06fhm6~xm 0\'5-a.ToraE$W*ƫ2[3kiKy3Xoah=lo0ͧiH"qi4k}"E5TSF\S!v^*t(,EQ*'M ⨣Ea-\M&3rpCp9 hm3s$9^sov)Av~)   | @ARcqTw=:qwGˢM4kQ/Ę37b k 41=-3y\ND3@ڵ Y.|oM~=NrEU1505rs\DžcSt>f7Zo59"-jb6[|Tlͮ~z]%@nꊩv$@@T `7W5'fkٱx9N!B.D&ڻfp}!vRtEžZ"]pG4opF%"zG̒uF> --zm a^iJ47R炊U=RHFdk5|WԅL *=x+ HI6ЩVP+p0:b*&mUM)Z3(Pt**MD+5i[U乘VHؼތ9tBsLT[M؄{(g- GjZj^n:OF[4*EOx >( &&#~ar|guBU%Da,ZUT)ɷZ^DV.]=9SΎ8).t*':p7tpϜ Dft"]\JpdN߮?s(*8WR„#y+q!кVmNNRL0TRڿR#j&([&,ّH"O!%iHVEfIfi(s|0tsƺ2mm[Mj" vmTVE/.e\Q=47Op s/aMvrWwUy=@@}R\Jf+E^bN]+$H!%vL1 *cfa|≒2|5"wu}x p( 1(Gn1[1G(U)*)Q=nXFCX>v,h԰1k+.UGAo@\\UƜj;#Aːq0RPh<1AP~b7 ]֞3 #g@SFh!]E菕@"UMgg~PhFa`'b_C$v~FX+)|"UCKDc'Pd.SL*$rT[( =!q\kcuƘG(cRqqg/P !,9cK?6 .jA"\Z1l2  阖=%-XKlE%O,:L*Ȑ#>m.]0pxx>"J Y`ѓ%qB(V]渔+Ph )1m~n(wvYLmb1k-N2wdH@< RFĆ10XM+ ;m8IO4(J \rF&EH+Rn誡*H`aU S!96Sn0'ɭLRKQ0!˕ U߀W佊hHS8RN/NmIҞ/o| ]B7ӔSKNTHwE۽j".:iF#>ҔQ-iQu.e&ɹźOd}yUq/dP>? CBxp9#3ق$Ҧ\1rQZO*"ѢD c BQ?JXW9(]ALd#ӆ 5u 򶎮a߄M#`ox>w5V9q z!dZCxwzb4> c+XSX! =dQ&CRɄ]A 8Q v[%Ϛܨ 1&#-TIC~^LpUw]9+IBR+!?Rj7WXX&CTBj6$CmLhLU8Rߕ-͛K5) e.L~Q8*pbY-pManpageman source.mancommand_line_option(--?[A-Za-z0-9][_A-Za-z0-9-]*)section_heading ^(?!#)\S.*$xYOsDM'mS$M$V-4x 0hԥHG7d$i8p )8p/ծw-+߾{o{YSi;v4j7s Iy0cbɋ1f\ 1`1s\0bL4&">1 $(6Ҳl8rlqILߤ2t=1]|<,ao[  !{{vv(,V9݃u\w*f/ڦeCy目o0.0{ދCf?L3 EyY)L/1q:v~z 3.0#.3VdpW@WڍHk 5>I.2t_gvl:sx{Xl? jt}I+J^[469"'-^3?Xкa)kzA]U]~2|cw)nPyiĆ8Eœ#O(6LJL,QTKeU0 G\$1!QPպk6"S݌rpEhA2ysiۊQ tRdYbmO 2bնPDHġ{QY+H{(Ur]b:nSu:5}ǍJI }G V5VՂhaj(gDPNl=bNUY}#ϧ=)Jn/WJ\Kksn;)Lv>'2k|Q٬Q_fP6˃~;ৃ_??;dCĉ0YFKJ6J< eelT.T 9Ƀ[*^O!PB㜶y!ʾ6o>|ucn?|";aĎqxĎ'%Ĩ̟iI?0LrڮLe3!qJ.b.Yvm",56N}%|C[[./a^6[{EW*6$ِᙗwXzC\ۯ湶 %7 tl,vB:NF,81+q\߅@lZ<Y c̑ HR8*JjĎʑO0i8OzA.hU9)/x9\c1Վ=ry^ó<ӰIx3ME7r'5o#UbۈQV""'d"(i|MfێN9\Z迚żԩ%>^J2{VߦT<<:ksճu$; / /6Ǚ,˧~iVG _vMediawikerPaneltext.html.mediawikivxYnF%?J;-RS71GtR!(klPJZ?SߣsgI.]q)*H`7!&gfg曙Yo$׭oyw`Ż|h4nj)Ѵ4?2фA7*27*27+2",:tqcqęη/ nf_Cb}-0c#uW.̾ ߊЋ5g qf1{jX:v1 .b>5 Ű7sf(gmUQd< ;QE )Z['$rЈD6 "şVp6SFiD9F&x1=?R'}KX_؎+x4G;64s˞Pvtdf{Gb)MA[ ]c{$!Z'(9Drfcr7tޠ`rrI$@ExIν)p `_l " 9]'+Hyo ߊj'fSyK_]؝zp^)0Y UKI|mMYȵ|6Nd{gV,նVYU4>)%~E+Ts%Z6 +wA&`{CuklE}hYk -IrL4KBW[_74b2El=٤|+l0v Z&q2 |W%Vh//-m]Z-$Zl v+[W,2TcCRZDMjVHcr[HٚF:ZTjqȲolesL" \鼞CA_4>!nʬRV9Y Q8E6.T]Ώx@?g/z'Z=>0Nڕh9 xhZє5/TX97)1cڼ e|6 ݣ {k]ӶAI]/KF"}?tho~E;1YFNL~u2;UM{w+d(ݾ ӗq<m먏 逩]Myϝw|/9O[:&h=Mz~Y2^ӰNGek*:Z  dq_loV%t!ll:im}|:7ђQ6e3CSy X/{QHKi '*^+$M<)Nd4`&Wyqu(E.B8z n0c`HU0⪫R+<8, Rbz^!d6U,\?;?;~a{ZR'qL#==7gIE^ŤׯmI{j"ˋ&L:$0cQ#9jFڜ>9`{+Zv+ 1\˵7c--|/ۈqW}Q2C@{|̀M΀/xQt6^g1&*& $A6u0 MediaWiki mediawiki wikipediawikitext.html.mediawikisrc_tag_after_lang"((")((\s+[^\"]+(="[^\"]+")?)*)(>))src_tag_before_lang/((<)(source|syntaxhighlight)[ \t]+(lang)(=)("))x]wHw7y0 b<$nf x06_06-I <'$dsHVYgsKde+RURURu#Vխ߽Uu+w}\G526Ƴ~E]Db&1+h8*&:Ct !!"z #R$9zQ9z"crDb'rHc9z"O_'ԁTDNu\sJrD'=Q:|#GO=QoԁTW:d:'pV?*GO=QrD.u(GOA'JgL*Dƥ'h^"'`f 9)r9A{fV3/'Q1DIŕ$J"&Qa_K$r!$J"(s}MizY]_3L5@hp(S)kJ"1 mϜVaI7B@o@Nx3-5MřP>]0){ !YLC(!v[LClZLCk&Vn6b"R;xn^i6-BK A~ s. "HbH|CD?דDe b"E b"% b"GD2%HI*AL$TH7 b"J]mn""""NaHxJYK3L$q5ѫOQǎ#k#:24!0Y=d`zpp5փi30D .9 (c7+^lʆ-ueI-.9-LRhiqh;&js9 đsx;⟵5[knZ8$.lj-guknne/U  <ĕ%]c}13:f U鴚rK%s7|A/Q!,k?fֳ͜ T&WDN;еa. hoYbں]uƔB+Nb- 'wkʎ88#k;8ɦTtuPܚL?ƌ JP[ferszК\!BE J~Kio T,:㕕qesV-c sPPSd\~X^2W^`{[1TPT}xKYs;4vr݃rY 3R^^S@&3w<^hN64g:^!Vc # "vOlh9i➋ƽn9}5OU*# c@A7*l>@=M?\uӄ8=n `Oֆl4D n~ݶӄSz' &'{M: Ix2jv|-mcf*𧢇ז6iBE[P]cմ`*_E6mͩiSަ  7 Ĥl7|fp'4Q6zl59؅JLtowVd&ZI3X5H*9i?:i8lTq??nm{_`&]/Fw4W1 \ &j44g)yM^',5 rg}4xݬ#=9Um GNo:P8pDcr:oo*"Xsܨ#6>~eƥ7voǓϿx ??#ĥ7~?|O`?a3> _[YBtGL[D׭OYAT:\q38C+l8> J"jg,(2 ANp Ud"ʅСȰ߲ҩ {y`f{yٻsBGp}#hBa\:|K/% MʠeSF =շCbBGp6ɜSV!'9Ql:Orz:Sϝt.3PgPd:cgw/n$Kor|'>lN矃~e W:+*J2<*rK[l^U JeZ.W<$dĤcaqs烞UF^b 0s1kV>U|&OW״7ѺJXTx=L\Cg{ UMb9AY1PF82Y3>B+7jo_աz$<, yˋSF*ǃ!78_TVF73H^gnxd=QjњYX75/ RGhh=DC*[{雞~@J&IW1J`m'p|,bP2w6 ƃ[13,.0p3@_:0g).yNiޙpAhƙnGV2c#JFq֪ _=tAǿV- HSll55 ^ϴLE 鬂6sYx2&uߣԕATP^ E‘h x0hM 55ǡP%4ѓD_27G-!k[@0k Q\>2<,9@n561дuՅdpP`$d}ۮ9$@2NK ѺK-RGj;@A #\hPup"=SZdGGgyjC,r4AvTe?+4"48Y >°(4S¦6Qf>m=,.'5 fc@ww4vaP mLSgh2C8GZ *yR S ̚m2^ƵUY^S3?H 6hv{[D֚H3V]GG-;: (kzgnI y{Gtxyr}~VA= '53,:4bIr[ׇ-1 Q%9wW}Ӑpj5C dylOmw Q$? Ӌ~b }>c}>cT~ouݷ_P~~|Pi8ʬY%"6>MT|b'w~`]ö:w[߱ w_t}#ܷ V|xM^8f8ي"{ѓVR"m5DF\ZU~_L8QmNTwՄIAnWȰx>c\@Įߕ1%0Ejgzh/WtuR"ج\P,z:Oy[gX]@Sf8jթMNqi6TºUMo6S?>;*c5e\TSB+N(<*hKq%Ȍ lhkTHԒ bA,GR n'*xi60TO,.<10%qmTHTO=(z)fTl'>yRDH&g<{Mzx:Mi`5n֬4ְ)~N+A?joͰө?!㵵:[:yu HlU:_[zjlpoU_VTy8aI`F^*\t=bbӝ )w{}najL0&<;yc@2&?j'! ־=AOij/JZ1:#CUF9欠>''2妪t7znq7p1GZ2 +mrn _AH2hH/е:\AN/jհ+\]y]\ruBusuuq" ٭+ }6Z|A7/GkّqRT^.𐠣^.gޚ )w8yB+rΡ]&,1y},^œ֔H (Р*ȃs(L f"~m›1$2aA:0 [ޑBB}VFtHsHS`紤I7!k[cDOQ#;*ʏ%;;CӋ&є'2m8:fKcM W.&Ooґ;Q&P" gVeR|x hٵbs!tQku򇯢(i6Xz. @?OUaGI7ϗuV̄KȵlK37Af]G!o!cGnwDC%w \10+T+Պ*bud)G9gt.eK]"%$K\"1XJ!yu4!(默5<$A؈@E ;#Э-5KH+e{oE<u>.s_ГZuK>gzI?.C}+Puy9Ļ;{F$"#I5f 0gt PyeHc:!)RI^)A.uxf%!Sց9f7[~rӿ_#;>_;{ix$T/!x;<^K3W+՗K(L]UT__Ўe#]Uzw{ {޲U*UP龹2g /,-L{w%xI<آ7_z]wssSL aIpy\*/:T-M{KEp[fgJ@ —f%'m͗\lY(P{2ܾ,^%_fXy"S[h/1x#~Im3x' o+Sَd` Z!*ホOd3\ k.OC̞&n-W[(, /n-\ Yt eHd÷C^4 _BC6 LTKEp"ƽۊ?8$T~ -ى,VPO#z` .lix_e(8wABQ.aMemInfomeminfosource.meminfoxڅPK 0MZѝ{]h+x%hԠI M-^gġ >ä)pUiLG1·18%㠑B3m㎒i9X?xE 2ەm"϶!7A%䳵ĬJ6/6.f)sA7}g0?NSISnsinshbnsibnshnsdinc 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)xZrƑ_ŗ>RqJ@ol֎c "P(1$Qd =:!ެSIݘi{_TNf*ӇwKGu<|>}PwT{*oAo6o2;CZ -1xi3 uw4rZh ? 17\}22 @ vzV!CX~zc1p YL1S;>W۵o\oɩxH|˕u'҃Ads I {XcIo:C?q: FMTg4i7#p?R@A^0sBg?Bh,vtdc^m65$LUaz߽6=d|MiO3/}eEWˆC:?{[CY8;ׁux8[MՊY3B-6jQu;dt`uo`9k/*]'N;ou_fz$_N(^h,/y?yF B?md/J#-ڸ$4<^_d;(0KK4yŌ@:` s?zoöiɲq \OXy׳:a8RS²s)l}%e=]0z’alVf…Ѓ^`V5clB\![k(L*Uq2K,Tȅ(Ex~͔TL@ۼ-8 k0.54n8 NA5J4 s,¨W%kI0|Ə\<㒵_vSӨ)q^r`i4Lb ;&2Z3XoΊ(FJmCfg0!P.H ^6tVI2˥M50X+iIYFXp+ ~Vf j C5k͕GXsqQ30 `b`:?a8qZ@x|eĊgTbag Z!{fŔp˧Oպ&;++2W%4Q -I5XZXPa0C4bkMBp; ~a2^k^8!,輖"[5b(L9͌&YCtAM~`,j^z `T%ŬĜlJX7pLiz&lc<f`dVϨVk ?(NȐ$@M ǮgԈrzcc)_WX!Ź6C*fT*O7"q\̖|{4"Q0Zi ^-m^~+.s:DhY񬞨9ZS.ٕ`^HXZƏb!!kLLCpdI0/{8“$H24ވ*e$;\rLHl6xؚp&#eԐ/56BXtabY1. Dn׆b q*|Ȃ;*zd#BYY"ĜU'`piK1=V4/eO~y]mpw{̴>R53pR.YB{Ҟy) ZC\^RP-LOؼ ,Mx9$ejR ipIɖkBIX)ؕX2y?3za_>{@ e'YkWu@.UolR#\5LP|`*zݥáhv(vc?QCYKJ)>8uzxMȤS>*2zS}u6MORΩ(~ LQ6AB>;H Pp=G-Y$ OFz: 뾄*)`ߴQij qpWm48 auma'YPy~rRڤO'(pj؀!x*ePk @`X>a`ss'AI9ƢPlFX'xM'MjOFQF]n\ʢf~[ x}Gj0_{?u 4>A]?ئ .^%w'fa˞*N P` ^c^}׶Ayhr)-p#6=m!tqJ, a)Iy cfe&Wsj!sFݫr&8nD_˗:_ w|j{\#}m+׭9;' ̺^#[z LSy1% &k.[!kd^pR+u.&_ 5uO>pPԅU^No.הCBylR\XUz`7>܂>mv}YsJ#(zm@{?O|==qgFM@JKFx#b.\lك:R32 b@fx"ԐJ-XYL75G1iɠ7T$+ !Tޫ;dBuz,~O !wTfP6X[W=NUzZIa L7w,C뗚͐lQV=W{Po~lj?8r?|?|=>ӼLj6<2a<F*z7~r(V@nR]I'=A#?[V 7Kiܥ[U?P *߾]WtC' %Y_1n|oƿbW\5wz(d>z7Mv:դ 5 |;k3}" A3\mnginxconf.erbconf nginx.conf mime.typesfastcgi_params scgi_params uwsgi_params source.nginxjx\o⼜y9q,d,vn hEQ-PZe˻[hoY:g~ob!|.o圓#spHpH\o)Ni}^_n=`=]p0L:s{y}`z``T0`L0n9L;+r$I{$IZu&i+&i7L*o9U[EH\s0I`Vy$1`Vy$IZCG&i vH6;'r$r$r$Ir0IL*$;~vyqoHH Ira{..i;O,Ѻo9'EXsN<b_?׭?EE0qZbNQZA:ӳ5xߚZu'E=%yb 4,ʠq:(NcV#*W-JJJJ쓉ִ+ ն[_m(ACl!†[gCn f"Ah!wI gZ pA2=sen56 5jT@.` ͛)"9Y<+T-B4{qzې*]7 ] n)N+Vc?1ls Wq&e*s8A4 v,!""$"BcNJ:U +OfX41,qnYBӸC#b$&4%ۏ0;fpe޶,"mK q(+i ӫ+~`V;?b`"t$çcQ>BzHպqZ&EsU^Iq]ưH[b6NpQJJj)J[6bεghǸ 8 U8)Ed8Qb6-$ G3?N٤qr?79 #^igA11$pYg*G*N8"ӭ׋8=G>no @ QUDݿ([Hcτ.w睻``= ##YuL$Y<]TRݭ[ >S Ѽ }!h|X#:_4CpQ116=dnH/4@8!̱JVƤYبբP$At#bS6@/U[wܒݪ׬M[h:QP0o_S|!6DuP,~d1x)+/ʒAFPbTl&b`6 hnD`+e%Rhg|"$Q[u.59F NP373 8?r $A3?U"g*҇xQ*J(~'^a/B) uC/M/ 袠PW-:kQCq+5FX!dy^nd^VFv'0 (wɩzj+c"UTJʩ3[ (>ZQ鵼Vtƨ߷A3x?rڻ`L oiP{+cU N,tEXL{Ac,7Ʀԑ M >Qx Q˄̄!g@~CA E ș2Uٟ'sh6ag=o{R׃v]zz㹄z9)b'4HDONREፈ"*Ґ"V4嬈"M*b'H[f4HcN$| *PD&"'Қ{"s'2]"*DGD&썛;-A>4fJy~ ޭG4W ]B畘.@!Zb:xzvc00Sǜ*! MUKzYI=)KM؜w1&.uqkm,S"X|JHQDm9 ]o b~Hz &X7 XG 3#LVgD]} E/e\|~ݺ4tn#"[]NNY]9Itu s:FPNrWWS,_ǩ&ogGRm nOg}~ac8!rHuQ @71#'&1רo$m4zJvZa-c-\|Ї)'e?Ȏ5x~%t A 2o"Pu(eӊrnJ+ S7sw:Q :j?țe[6O‘xqT8f`q`w9ۃ!` w݆cNjQW3PL_+qSAG}q`!G/N~3_G<ǿ9 `0l GKzʞ 4mߌCX|z{LPŸA=7gU񚒇4Z"?w+qR ~p-WK Aۨ>Syy UYՠ<ߏm5rl-ׂ]o 8A:xENimnimnimsnimble source.nimxڵY_@v +% N6. !:99ͩqV4h^KJ}ܑ<5,{{[lܣz!ይUBsi| Mh{QigM 4ћոsFoU|ޮXӜDӼSMsWӜiUa̕|0A/׳ {XR!/ ,vy=wDh"K=ÁfÐE 9Qh0r$~KOG~tɞ5 zf8\PvIڈcA!]ĴI$qyt{B`IuVC&-۴5z"˩ J)~"Y+!s2R,Jl::?&\2x#\E%' 2r9/.7J(H :A4pT$QW s!`d4KH1jڦAuhژLݪh^,qx>%­bւ*c舶6G-sޤჸpp>6ӫr,6Iܴơ6? qy$ΝM 4 gM |z[ #7U0,ps<,]XE|4H'[W0 yz 'b+($sn]A|3Uӄ &횥9`Snxv]jvIn$j~'ݮw„]T͋5c-R+G:$>|v{+*Km*J ٷ)f^LwޞӴ6&=E̕\fS zB,HUMZ_R,!Q|e],AψU#; ̚kF^T[-m#^5-:IZݶum-Uݏ}|=myZbwAtfUHzFF)4)wB RTD$ ~$@*rOAʱCR6[r طk9b۾QԸWGh>X".aS.L><4d.`}PBDW7+jDě4z\H A$ҮCBG  ]LgErBHZ@6|܀MiAw!*S,1PU+Advya{} %=@0rL#L}YqPjyW;C!-rFt Yr&s}O$0̃/G>[ÅM辶W/!A_T@D1F+0w!m /|F1H&l$BG0#>/^/5㱝._E ,+A[+{Cڬڋ-n!I66lWh3”AN6dz*>㟽>NAYM$׳O%}TTRC#fh hl5M[Y3ck*\,gfW3wMQ,ÔH1O]21~Wp,8R-o2m;XTD3ΔïOBc1F @f(6Yƺ1g('FP YyqVJS+۹x۶}iĥbda i]FXAZJ3#A12N r%d~Uk)OlNUXSpku,xC)rĢV! G yXBמ X܁Ť{0BTf@lHTp&SywM:W(a.LL#IQ?Nixnix source.nix x\ 67+ 1vqm6]]N8ƈIñ/~W-Y%KN{WH=n; |Cv_]wj< t[%94M5$E$%0#p1LgjX7m7[zPatDŎw()O r>ސB|3)O29WH1Ljc*$*;AIٞ>N qX)1l9Tega_]8Ja#Ä '[RGѥ9rAs?O)s#cw sTJ}HB낱r+ĻAx>A<)/a&%2ѓ)4-- eYI`. mvE:zfSmgDP ŐP;uSjq|ԱOTٜQyIyIS])zPGH<۔2"zFŽM7!ϓ%sĬH^$ *cd*&9!'adȨ#hlk':d\1$W{w5 A4yQ7$79VZͶ>k*AZdSD;CVJ;W9©pfx6qэ>t}%@dlD :ݫNFR Uvȱ;񛬅3sUNuvcך`W TdUkw*}5҃u r'mkĥ{d(Rz!9ej`7s1@NoԯXj6B^mv!;1ًviªؙP\"jїhu$::Ƴ,5*tF޵ iv0Пw"yW٫'LhggMؠxDD#?tLL|EJOᅲ\斘m6GI63FΔ %$ZrzO\& 8X*/˴ad]varD=ۜmNũ99?*Q"f8 Cp 4\BWߗB AC5pi$Z' szU*x̰098:u=~U:;8:x$Ҋϔ1tݷ[ YEV$]EMUQ WWth}u(79%u^Dp "u~_i}LgNG֦1fX1!Z&8]J jR ; su֓57ڍݎd$ev+0v=āk #?8&~fƌ4.g9a^kUÞFW]V3犬'oBeEgoaA,h^rU"L%\SdC,Gb:ԐX|MǾ2ڱ/j\28>wuiWu:Bg]#nD>{)k ēb ݥ'Tt=vND3*anNN$ D' hix=}hwϭi#`Q(UJ4\:zhFV"b:Tzff81Jk̇`1e8%ƙcdi5Н=kr"寑pt9?n6?,7I) . Rk }یAFV(Lo(%.ꕇ56īsҍ^m ]c,B_H5%t^K0]+JŃm*բZ]GPk懻~^B%PK8K3Rp3ñmJ<&\`T)0N=F}NeNm2g63bfVl 9+5ckF#lsѩ|_/2 ZQ gu:.1.诗ҮW ^et B?ر#lq-}1< 5ŮawllY؉Um5۱{iHXlF׾MO32Ɓ2aϟc|v Tڱ;C!PNfbǗ ]o祝?6BLt=vES6lmo4R߷}{q)9Ca"GԳ]#AґqِNvi%ty$T'AT?@qS`Sۨj4Rd dmLYv~B캶fONFq$zQC*u4mp`9ǔuHXjG]>%C;̈%0y3O"Qt>L"_堠ĚeGTUzs1c`d&iRxfd(>ϛB p.px)=T78dGb/?^ b`9v тi>ϡ'yw?xcAa;Btr:?A晄j:Sb*=U(&f&=؂rȘ{|jAC:?59`&m59+: OO?E~94;c^^2K)V$sb:LJ@;0kFf)fŮv8 ZFe)2wZuuײ%n+sQ{qDӨ  %Ӓu'Dtob)zKD]TGp҈֋`<Y\sʢ.Gw&̐mn3 / Cݳ{h*J1%"\LyY5k,Ϣn $t%͢NxRe畬F4Ehm 4 BB](h&Pn*aGYmlOQ;CQ;?F*DŽ`BpXOy94!"0焻b U(׌e!5w7Syt`xڢ-J HB1P?KqA̲eݮĪPE_VUztYqB%gOn5!!U sA=NQۉsbxH͝ՍuxP B Xy&k.Fͫ;+OYY Ðo$Z]w&4)\YքƗ&T5)˨t%[_'7KB'/K%wgpasswdpasswd source.passwd9xڵoO0ƁMfV"KA2+̶y۞jU[oxf6Z+"}DUQnÁѹќI)!H -X)RhdnwZ-b!^||e߰a&Qs7a$n';7'e>BnL51'ENǘƸa*xkQ׬O/=˽< B OT:h&A͝'qtפd~ HE_HF̀egRE1=w\WTl q ]/ PowerShellps1psm1psd1source.powershellUx\~Ʊ$;i[47',&DħUm3DJ)89-D0.TKG, Eb3;t;}3a;䅧Yjdge.num xɠ|/P5}b5͈9ǚvL{K: ޸ nvWgS@烆ojKlԕxoobi6!Josy;͟x_,Wom~jkMuo')tb<}'qlȊ,һB9$ϼn; =C~ʟ/,Ύ*R aA@Wß "ЌjM:Y6հ:G襠ay)(G-X$e5v *3AK P'.,.uMMĄ7!L?: M5;gotSؾbkQ şu۴񖷂`}D􉫔@ Jy@lGt=iɈz_)ՓZP|Y[\3;NZo4 k渶6m- \!~/U;$N{vd=bG=Z8EInq@N!_^KPJsq>,V5 }s9!hcl)r9/BNLr.(-%)B!LJm[Q["F'2ZarkUjfMD(z9$ CME+IgN/ ~?h 3y4(Gt_=k}Ks}dg mEzhwjl C\V*;e8=;0 6'Xnح55@UMcWZRT}KJ r*I.vsKT`2ȝSW?;qqvvLтz >[atI }mGquqk2cy,;}}tfG#HG²^2?|`Ϸ&m+GA~-iaGQW\ e T8.jҮ4*T|;vYYB07,Bz@2m|4AT.*D'XSO6h5ˌ{FQ@#M,(VMp_gAߺy^ewj꺯Jߤe:i+F,mubt^hzGU# Tf%+1W0?HtbԚ^Vkkb>0bCT(ɲTf Xthq0v# ɳ#tK=Y&tI' W!t v - :a# };(W[&YGt.\ t AR > < U=bLJXshHp+.} Cj[#H?CUc#ִ>t]Cv5b!ݰCOK(uӢp>hNJl)".]8b6Id yְGJ0P:kY J^et4hҀS{PnAi@Gy@{E6X? P"^ox^9\PNg /t`&(m}>nApl6'wB% SO멂C FL5<`I_510yMv ݿ}C'7[wus\g d 67tWٮg3Q]QbmEVl-[*-) n |+)KI4f6N !v50Qg+|H}(ʔ6AP<|07 M:!7=Z?R#ZJSKI4sO]Y.ֵzhv$'.uoM2?$KY멞.n&Zvh..e7x;tdbdL]"Ӊ%L];~cg`fR|/rqG. R:-O k173C6({Te p;ZW3T>(Cp?Fl]=c]L ) = 6D8R$[UW'dXRa(Xh wIAJ*25&G%R*x2]sTABnͮjEP`}_aa@oA$PKP_,dt H;>b84g(Q(F@3=4fFͮvX cq60uzaVIɎ aSQ,kQe#C`Y*?sْ#=sg.'^:*0TN`-0}߃}NPfԘߐ}]bMSb{,ZyCWw+ŕBDԣ5 g/5SF=ֶiͣ6=LefauV~a9dgS9\i@ RtAO)E 2\tvퟍ41ىL[6},\Ngn̴o,XRڬZm]h^_:&f RGNp 1\&L;69>>wN?fΒ6wGM0vš|{yxߒ|yBrCՉtQ1:v|Ii `Vcv/}X ")b[j)5l6^%#δ/ r4qU61)a9tK2;|O%+R,uprS),+1 \+LM{>$ODXrKZ,1u:EU =gw @Q0˪ay.)IbKf5 vC׎0KZ׉Nukd$CYX#3:C\X%"7faRXrR@wVm&|a)Y0;a .?*iLI5S<#\?'m 68 Q>L+Xj H2͈V ?BV3>!|Aִ]>گn R$yšr~stDfIY `X Xݷ+ LprA`|C?Q+ >H}.L0>TOxk.ȒjyG 8ET?2XHS6xSAy-5QA.ՙ]-;&TRI)?oY̋˨e.Wtg:^9ۛNZspyޒƫ37Sg]81_xqfX݄Ey(M頣P[R%09?7.#Ο&,#X\֟("uN ~-{,n^eGo)՟U0u@u0@fm2Nmbw}̐Ɗ#p Protocol Bufferproto protodevel source.proto'^(syntax)\s*(=)\s*("proto\d")\s*(;)\s*$ident\b([A-Za-z][A-Za-z0-9_]*)\b x[y6h)Xv[.BЌh۵-uXzl 0S8#='K>k}Ǐh)lQCNEi9V4G9Q<>0.{T8d<< Ge `gd'yG'BN8K/"N0*i4Ub* 2PW}V!#D3gB [2؞.7j"EJߢqIwNO@/9њv~mHPI&l_=+:,SGTR}dX؝~  I<0>D6q1$ ')gi$) M x'!LP{_Kv0H :%V4۟> }ӑG#&qfhn m2|AO>:WyLsO`2wlIQ{,T: #NS/*r'RC?by򔋠/cMO1f0I>$E {V6KHIlpw6[x&X:l _'[_oxF@Hgab98 n2f@<e[A lU>=GEmiIk·U,sNݣo7]qE4u*ܫuG,*$J7C}C6[KL\&ZW{{# ۬bSq =)I rWk?:y;PjܲɂQbK)0.$vB4m74m=Mۥ֎tFr%rZU隦0#Y"wS*UKdfa j)Jk5͚$L+VM.G;W^oR`E@<@W|pz*2HZQӆ5EVz8U8}u~nDrM7ErZfoԨNg`vjR!S`Cywa[d\"7,TJN4ا G5?mX/  w{gOKZ@>1^QVbajS$kt QօM~%UA>lԠu^caϒzͼx˓ b->pF?nq'lR󈜕ݐ)hmX+E) l#cmRzVch*ݎY N^\eگ7p%xnKKqIQO6ЃH%7kۮ7g~G?̟l]+E|ǰ5%5;N>ܶPT] RqrɊ \V Z5cRM椤1{[jd]ᚕ>Ȝm]li{vaY*Në&:Dr[C+7=v9,w} [LH2'1Ƚmt⦪K QD9-,wR\o׺x#=kmYl^kDf*0դx]TT`L>RB1RŅ>p ūOv &nJ.|Y\u^:^卲q1iProtocol Buffer (TEXT)pb.txt proto.texttextpbpbtxtprototxt 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]+))xXos6'6mӵYlYiӻq`eun^f| D4{NH;ތ"=y/yA?S`.SDxbFlfVF$@xd9~tAkyyb;+ g[7,/l_4,mKղaֻ-[uV:74뼟;Yd }[% f~L C85"x$Py&xn D8+2$˔DP5zTqLj|n6qO|UQE">㶩9dVaD tFܕ #]%cVF@ ˁ fLaI%E{ΊyJjz;u{1qaa7UQ1C^jźs|X1ۃ@4'kxԡkSm Jc물K \Hh`% Ðښ *4r [91Lv@!T2 H6lsC:NJ6*omo/}.PE> ;|LoL;p\zs^O;I#aa$ǐa_c0b pβaz @G3"@a :zR8g*GThUVYyVѾȶY?!kd[^u,u~M ' cӇN %a[Y+XsXi:rG/}8&O^*U٬+N:̤.ND0-y^[J^xqeoX 2)hA؍/Yպ;i^h^#a9K m$75xncIVU|O}O7tڻyD׉ku>?ڵOx|iIHڸϺA~Hj.% "6fVWHU꣊ڬP]]6?diZ̓)ăSęt`2Qhځ!O hOzqF`{ϥsHm{NkQN9'Nz7)qH૪xz>(YtCbu ɤRUBc40#1'eݰM- 7z3h`8^rf X!jNyHzBH~%YqG)rkċ6dɾ+.hPuppetppepp source.puppetxXYSF]b|--Yٹʕ%UyLނ֬4ZThGfx˟ߦGfZ`@N<dlÃc{šK㷧sg\Rt4_qkNsIM LM-\ו (a< |h vI{W켖U;q\9zn6ˏZjBA7cRj;a aA⣠[RߋԾw[8!zG0x(Z>$8|]WYp{xY(X{(4%xl&P˂W'z2Nϻsvs&NHO=gs*H*#}"HSAb[Oqgd_ Vυ .8|~]H|Ojh#s(#Hǝj<6Nk\ ŮO ЈKpL̼MRpr6Ϸ%Xjr`fMWmDU-E*w6>Eth*>W_7%{8tH7'fuR?DSl|u\Vv+@ǗBI[Po3(j`4v5}+Ual]9Vae]%6 mR'꯿Xwmt a2NxGk\eܫv ViSaz)VEyL#Bkh~XY?u>҄ٲ+F`heͼQ8q /8ΗI{,n*Z<ȮaD!Dp0#R}s#bYoz. ! vc,-|D8zENz@'2bY+tձO";"rSHqofHŊfh{r EHɬkH).@j!Xg Hઢ"btķ{SRit6LG^B{m4 zk{>S?wfn)$D&ԩw166輊!b @YakEf[a>wN!mM^M~hxgF7hb ϘHq$%<bBsɹY1ބ@[4E V[ꗤ5iE/$Sll8^]M_?b6_8\ 1XdF"il/3TrwyGv 6G)2|$`|-LwVQcze_dyAx~Ezkj%oT)d0Dp6y][5vra gf\rTnOMO_g͍iQ@#phԌZmB,l0Ɩ298Dls$;.&`D&xC~EP/a G5#dLj5XT.c ꔌQuȫH:%duA Nd%cK4}gtf$? M_) dљeyT$'Q|5:{ɢH m3OANNRsZjn!#u QTʔîm{E6ͦJ|8K$)U8]/fݚЪ&k "ɭE|&cBF#ndvmu6MûͥtUz'tͧ6J;ݢy0UkvULx? >בQĒh@?44 iљV.sҕۇUٻ7},NhOgkmw-o<],h;d8e-d)eLzjF_6حxP90֏l?CQJ%:{{|-dAb-GEN"*T؋گIФfO/PNH2 e47B?i'H BmZ.Whԅ8QL}!nlnJQQF1j&ݠ`n4D[4R*flBՈQgh?cYa(߁cBfURS VrQ\T+=HEa3Z%gv4LJX^!㓧536gyZwM{dd0zr(v_4!"„ן֌e }=dD=/ RqQMLqml qmlproject source.qmlxڭVݒ4vma.t`.pG fd[I*R*ts\b9ޟLNb|HzR!et.~7hΠ_g3Z.{6B@.#O[ym0/kQeIβR3ސ6p!Ѹy6t< 2.|kM7M~ 3P$g@h:aa~;cn48ڨꈊ *0C:'T`3л]* V3z_*5bG 0+p:??A͢UdOeJPBwe>8NxE!7ti-/d4Dz4V5^\)C7YpvBE-@߮;%2l8|0S:>wNge=h_R7fy(697hO]& G, HMjRql1,hNXFѕGi;mڋp߳ PX5N[;[m {-tdI%,Quі-j`5!9g^_U67ݯ̛kv}9bP_j@f >9~5P)̛y,i^Q5ԅץDr I$- %UET WWcVaXdTB"uKuS *] Z*s9J qi#̙Dڑ %/%/ bKIQ)JNeQamWq8;+5&H*u3NB ]!E#osH8cjanvc/AT1cE͢qPلz#[;Iy2Wd> O6I%HQԼ{kO%q.I,>XXpRacketrkt source.racketbxڵUn0NZH !~VkPg븕T0o+{MW@?w=66y OnYsb7v~=og>hfKCcvcGQh,bEHrBq1TѤdG8Z~[C xV|zL tE/< .ڞs؝P|P[W⺑GO>j~f4#eGwpY| ]%8S9yذ /@9 g0%:O >tn% ,` rw _ƛg]EjI(,}T_4-+vhzޣEB↺L,.K{T4itE`aa?T=PW;pnz"@l?|zRegorego source.rego xڝV_o6.Mm؀ ZR )Ɍ>lOC?@Mנ%&B*E5ǞdQiu}w<ss颳=[I|VkuKzP8Ɣ^IVTaxJbl E^mZ~`ﶰLzInćYyO4ҞeA$Db%*ck2 +\EdldO-xJs+-ߛ;iCE$NCsos{4^%3깃cW|Ȅ"Q ];wybtJ4_4JRNey4Qq`}wp}Xߑ2r`+XD8bQHf)4ٚfS×L\Q'8qQs'cC8 -&Bc1kO/$=?|~=|!=xڽWn0n76 \~ u%}ށuWFMq: wMp8MV!,'=9>w>ݮ-ֳ6 kɕ!s$e2Rf-_Dʬ˜J'2gRf#!ߧOGߧP|VHS+!ABO nQ-g0|[ ;pO㷼ۿϲTQ>|(\]Ht_=5^O "C&skq /@PSFkrl%%JG!5( F80 \kd+rVHKAYJҲ_=-yFWiɱHK3  XŬ0)xRb]H6J[oJNk-MmɺhVcΈqZл=>?Ɏ"BJ5-;h3hH"CzSāg+C6X>3q,e!fm5NfAuKf MAlZ#:Eק&؜kuꚦK[XRS Q{G[~d'EWݒK&Ⱝ#؞y7D|luqpuROZЖAOՕ1箧φܝ+B FjೇD;M%A+}Ak-~|w16*Wey[9IيxOUr^1iu*EܓZ֨4WOsHސU*>&resolv resolv.conf source.resolv$xڅN0 [W\V4HSX[$.;T)%It dg;7W6q{~eQ$syYJ2 }=j6>' -ۗ Gῦs1O|=i ІޯP8e>偁@AFFgY"vb14!si5!tdn`ob0(z^ߥ([лIL+2n٬asL 2SOYQ(4FCk9wЎ;Robot Frameworkrobotresource source.robotxڥTmO0nې6ioڄK" !PB˦ImHqƔh]_ CZuF=uǹ]!ӘDt6ĴLL}v̦7;f,̎yobs ~nR* HT!,H ]FbvDZ)^Pɯb:M6,<&ܶmenwGP#۫3^^r]Δ}W gkhs*Cuybѥ7kV^ՎgҳG]Jxd zF+p]p>Idlo0p_ed0L,9ŅE#d#_܁`-t}|Sм..͕prٟF%t"NDmcD-RIO RY]"[d[^~1MW*L'\+ey6x7I3xX:syNV:;+1-LMPpe.D~)_ 1I}DU2ǔ_2pA(D=ѻ#w d(.Hj8GL-ח#Z6P"Tżm]tIp28_"!QD0GIh~- Hm[4"T/ƯOX/%nVrhcwc /ND4ʒ9L<BI%Mi ,տ^rPSCSSscss 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][Fvc[We˖=nSw=1NIvZ+ɚnZldk_H~PlX yN} ȩ:u"="i.NW^;Q^O:,g~P Y'>m:쨨zxW_ˊ:*~#+^xd7:*~'+nwT^V|}jKowTT+xJGEtTT+nGE訨VjGE:*|ZWPqz{=Ŝ)|^OF{=ř)|^O3WͦӢp$7'bbI؆ΪJw:*IYUmo I(팔sMΪֻciYLIY&uT}睊ˮjJJtTG]5T Z5(𨌦WaqION4~O:*k\ ~rũ~q(P 9Lߎb6QK gYلuDvU_U{4\K={aѓ_?=7?^Ti. }u3> ~n'AۧQ/_3A %CU]hwvVDᖏW^+l/vJnB?]BcmǮ|bİ@fW>w*a`_e-wy]`2*yIaMB׻YfшҎk}EOGt&Ĉ>i Yvi-Gi= }ͱ}@˳X|6d-Kf*=^snv'SXbOtTѸ=gsV_Ķp ߶Y9|Їt7h>YPt"Wv}^/o:f˹n)l)'&nIJU* t$@nip |i6VV\6˛[욡GxV$Nw$!ÅK.ћO;nKY3.\F^^JS^n`e1O]q@ ->SvZPo p#cF..Β~XE2c/!4&4ͳ4'ъ `YVӌbʺ؟>Mφ(\MY1vE*)1))JAZ?.)u+ a"(;8ΛVrϰCtqh.@9z.D7 Nc3j.^Q@$?ku$SRcal(7>luM"t(q7$L5w ~qJ ]EKx{S3{Fz͈0k kȤXՆvVqۚdn PO>\#I"V0#_료_2b1be: ȝg\N 3pm[W|;!A )]>D#(mcp7a`?4rk.amTwm /S^ʺ#YRyӿ(ulwGd,Cae}Dǁ*%_iLqMҤӨ*g&Hr A*C qK'xt4àY?*57 Zc".f[+ wA?jQZ+aqiYn6`y!iE$ڴskF=UD)tMqB,Rϯ8ˣ/+P~}ţ'=˯mnّ׼@[{'l<I]=͑S Fv tYZ[ki4)6FRvc*'k|쳶[Kzl_S^9Aec@QM'I/mp}cPyXhfυT!%O{mC"X_ (*sJʲ( o5-:X3 q2`:ꏺ5EedFJQw;-F'oƀZd :KNް8#)f$Oc:$#|d<0sNS),R?7q6KΛË0`7De +KmXDLs!Sӹݶ6eHIY"U^\5q?'`v3Y fMM2-\tͪǦC-ُQY uxp4r|?v^g۞jQhj,u{z:k2 "7>kXkS'I,!J4@kHusAլxM2%*iۏ9kC6:{o8AnM슅W+ چOpgXK?^쑭(Lo cGÚlh`<9~4xʛ>vN+2K0 mcF&#jot޳f1FZR t =\,M{z}؂ed<ӘY..MSm_yy#m[֖K1<{C/]ixy껆P eC7 -p<Ʌ62JHmeĒ!J&âHBQI)OOKBcJHYXԐ'x( TF A!2JYja 8xb8#Q/l()1xb\1Sؐ "^"p ao#,`l{#_V 8^$( b @)Qa`6^jd~Akv95|-!GoFȺiO9{a' `pkM/3U@JMK XFf&ΌkSI(feT$3l/%,Bخ* 4 تxfuh?Rjx 3˒tTmDqx t&oN !'~^<gNtqp&) }1$+Cs)K]S+4 G'`Y`cqĊ[%`3) ˑ% 18x]@bÀ4iY2nР !GC0HUN3H*EL5fG㔂isԢ8'"JLe`Y)$2B7: JIvHK2>COF}Ğz&.|`I-<|]ӨtݹHAPA6 !r+u;hyèJ+5Dt\54nÖDΦ']Dr%A:LXXhf-UQ1(eHh&:b?AAgX08av)'PSYU&o8)[X|p Mad@<ǸB _uqQ@{gf@yhqӃ++KdXS7(0FYr/~eSM^ 4,DXb$x-,q2Nh9D503:x2-\HyPB.N"!9L_,hN τp^2p):eSIqBr98jV.GP|k88*qJ:7$s'L7m&y<)~5S9^]Nq2qT$G8\+#*S_B$t!]l%56*0zT ҳXb T܊Mms{h)wn̄:;zZb 1Nj$⾗L|gJr3 tʔ5V-s扶4%R%Eu[J-eIq ȟ%{|h)>'迄8)n' ot ߤs{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^7keqԍ97sqϝ{P5SQxٌɌxJf<0#232Jf<8#eƗx匌ʌWxtifz)tFFkgdTM_7#fdT~FFfdTqFFfdTy:`ԠoOԐoOԀ_>=)}E^/FqMH#RwfT7Yo*]2+~e &g0 "_TwNMIѪ%TwW-}O ZB!}UK(4oV-UBcUKEpj $ N&r~j $T-zuj $V-䡪%ZB!UK($yU I^]BG*"G+6qJ!cUK($YZB!kPxm IZB!UK($YZB!몖PH%"zb+$yj $OW-t IXPH>'WxߊRNbRoX@a[K٣vKY <qޙqIKʩ^BgS())lzz}Pr ?^9߷+AJv+eWHZ)…g+eW(\ R)[)sRvn ^9ɈC?ʜNwrayޞ̛i\/!_E f(0=S̪j=SD`iC}n ,N&SʩU0WN-^9.R⡫m^t*eWpV|fdX%jfYW˯fsZ~Ef6WtfZ~EhJH/l?ɧ̬j֟&'wܤ?FtʪPm/-O\/@L.wV-UK(UK( UK(_UK(,D0te$TɭCK{s~VRU-p},ҍ|OQ.{[y[!]RÔSJRuJ):|({C}R 4K*<}B)!^:g~Kwa JUG>t:FI<,ЧSfTu~꬜ 6+ʩr*r-fTgʩϙS["疳cHH߫>!G?biCVR$+VaR|Q 1Jn_R%B/[!ɗUɭ˫VUr+R$~]FVP_[=Rc:}d;Ҫ&06 `7<7Vɭ&)r l_PF!ҷ32ziU>+;fT$;gTf HU32gFFEkwFFEfoFFEaFFE\~`FFEW~pFFER~H|*qГWGyG 8\Dc=Zwˬ?>;'fU[=?%_M27Ǎd[#_x@Aw&]$dΟ/U95 X6P—~A|Kަ•qz?Q/&gT_<:pfC d_+N~}\M)GQfM-4š[ (d._1(ɼS@|/:S0w=pA21`~_|K'^u\P7MI$aaMzd?߯(!XBO 22ןTVȜVBS?/ ܣnҗ(`3}^ۻ˵UkV/$]zGl`t=52ado飪o&[N~ꑽiM !}a 2?jNVXd[Thz-?2e)܅UB̕ 2iV{a̦&sG2KPQ? a ou)eeaNVOdKp 6E6;zʻzASS55))jJ='tʧ0,<2N]6Ԣ`\˪ W3qr$e<Ն{uY8Mf~nG۟_Z%I"-s ^W T9R`6zA21(@iU8:;8Ck]E}探%ʁZQS.P+t>cD? //<_LACˏ7KwZI N3Zθ' .ӶɎ>m>+u8_o4D1}frKe+,7Yү*̭:(fY"h;=6S)[^#llL 豟щ8qYCQlĠ.^ԅU׿[߫EnI%ǁ?++N{cu=z[3weeY7*|doۃWv.v{Y|lV[Yjssw1ǪwZ3n2sdlZV nI-ױ2%8 h')kmٶP,R|dpۅvN7W8t{Y=lk-0"= I /)[fߏH@r_f0R8'2YD0D#ɦMŀx @zնû,żNhdNa~ˌnVR:g e}?ؘ5H`78ivOWh!pԓj4XKhIEQ=X^\8;ѵm:3ρ]s8PsUT +L^:$5aPN@{{S]9o&Xԙ¬`-*wu%g&cT׀t50ms*Q2°v7ih|]KH9{{mZW59Zmeyd:Tv|iPe}Vyu-,Eȭoo/wI*,6 bBo};~n- ξB hxtV>h> "]0P4 `1&`>G.R},]QS/. kq*ӧl'B-^b.<{kU!VEbz?u&*`In-7 b#`uٖ]7K+7 0 :\/Nڶbn)$+s\_Z-uRNJ>˒ϢqjkQO*틥Qٸb:\1k)/!O\b\:%+J󕍝]۳aIqP{v.),L 20vƙD+jjLYlh^u>`2u,-Help΂26&%g_6N MڛiGFP7A{uH݄!^Y uɿZ%Wg,F'DK]b>l.&KlN?=Ԝ\7mK?֤E{ߏՇK.}- ˽ l{6`h6{Go|6z%$֟o|/v=\\_0!._j#{Ua,Ei2P4+O ;CR}Qz\^k~n  }FjeY9Iz^?kc'e> xXDfǽOJ䎳&\L%fp;X^Lvq/y5+LO]?_bP~C}(Wox>g%ANe~/coOX7S?z@W ,T,~v$چLlY]' m7QFu >gC7o>B.r:u"q~i!MqBp>'1՗n[cgT#B GxΏ!Iw?>C.s k|ߠ # xj xN/NxGUJ4c͍"s)sd><n *+ϓϸT,.0 GԞxˡﯩ7C7bw !ԆqԏC^pˍnOqla3@JsTcҳc7!sfpEdAس } X)#F]abt^<n:yоR&`/E"bפbU|"A/yQŦ<2M#G@w)T-be[T ;ۨM殸3lZ F2eCv[=꒳>g˷9`qը^jE _jʳ̲.Zb?q_ C=}!*+T^Px<^b16ۼ9?lX߾Q-Uyav/5ZZ*/\Sf@~ْ+tCn ݾ*e hF;n[sJb5Zz_8:U]{Q{Sر>RGӥ1 úfKy+iPÁTk(NȊñtPЯ|j7蓟YK@?!!^EbCZ`~v*jmz$9b|"A7N"_@ *ɈpbQT\ZQ\Hu-۵5}$d6%eVN:o57'Nv'҇oqh l2VrwOu],YᶊZjYqދYy~;]]ոx$!Qߵe3ecL}<8K'vEE ~7]6iT6aB&E)D͍MG_]F(Wzyfk (@QOpS@ O]7bqJ Z(]{y|o/qd 8qFoK[|k!@¦7XFLg0>j@Co_x/[D7ZPxX y37 6"U|r=|=zǴ/ʅY⼼*[.S賍KalFC+pC ?1 3O#n8gbڶk_k"s~9_|y_̅*t MnZv;nacjt9y2BeA} `Rv Vܼ_~9/hfy7ffs֊􋠫9 B.Fйޫ@ҽI#g`A 9ADZX*31-`{ A<۟oρ/hОA6B;ׁ9}ڶ\q. E@JC.49c5;T7U71L7+7NRsRh8߇n˺k{'s-"^I~uQV&{ƪ6b/B9# zJ>/6w+\sy911aR]fi^*Xց$h%6f3xYzj]j[F-nc܎n-'PXvcS)H|K`WŘ> ߐrߐwQJ* Ħ!(I !ja0·ϢW5KzkceaLLؕ9Ӳr{LnH]@#XYb/ٷmgG|Zݗފf\f@:Lw7{6>^d#ġ7Pۉ̝+EnBXawVŴ;bҎx) 0u/)uPN $Rs;g^]~Yg5>=J>~7ځ%ﳪkm}}*Jr$Rj}GVwlS7*ƭjczW޵0}W)" \bTX/TY/-|s]5 Uڑ @ Cl~D.,]~>w ]s ]SoLsѷq8[?RRHqҝTS?eS2;'OhOzYOJlRq#~<008A?NVZxB͌3c"tbV6Cl ;.NV=p =s'y$yӚ1F~Ok5};v{aXS&67N'i 28a /׫Ů=懩H|kgZţp;o n1?IDaK̡Xh|k>{~gܯ0Ͳ?Z7.ftZؕ8δN=Ӣo/ՉfS[GgtݘCaDLR:Y4N9j,_1ctU+,)rBV&XD =4lpcWhSxXr}KT9d͸֗HS}D ܡgmOm\؛b^>D|X@xh 6ϱ!&7I)Àa(=1)%j147_d5nI'Т\907)푭e~ҽ<+xX,/>*w,)}ݍ&I2PҖ4G֌ZFKNuY̗lpw@m;bX#B׏,oqwz1ԷC a@!t*w]z-[ܝxY)VtffQ^orܱyņF,ޅzY;Y"s4uW;\/X6<4r>y;* I3-5fnfL ;2;˦s☤e*on"4хݡM7= fS[" G772Dukd&[0-gkv;+|詀2YȈ\Jyi=8=~Βn b߳%O-fI]zsDj3>1%0@CF  {*4 >oI>^akJdږcuD[<{_ҭa'[6p MeLmuycauu}y[0$`S{Fsl56MM N:pG hβM3_oGqZzʶfq?9qrOm鴭ۮcňSySp:xj0Ѭ Y# vۦ'G}憣ܪȨvms 3F;iT+%^,DH)z܀OJntVףjH ,Jϟ_cͶ;\F_k+//u9~l*.p}VE9hBRMX3w؊Ѱڰ~nͯfnΛ#t[kk͵*:vQ[h=jy_}^-IyJ ufegS=_a뙻[]7瓌M=;v99[Yo.[b nf[,1$c |zgq2 pOX!+wF0S]=7J*;&aa^ cG# "x<7N|S'H! NKcPb uxq=օm)$K|t.F'F'<'Œn S1*Z7 @'6pz%"\z&cwjxHdU}7&:q<3G Ztm yc/ 4~' 1a`8@0ӌw҉q 8U,/ѐQ 8<2N3S?fzl1>m#Ç)$D'v'5)s "IO6Y/ 8DV?3 }Y_%]x3#wn48nw0z3((*"9I*t$r9 RB @D>5\@j(rz>9sWlsbm,X19AOTU]٤ >)I,H4rm\pua𒁘}e6܁5aT@XE3j7J'+OKM~!94ܼ߫&Sva)`.SCa߷v_#7kjrG+oHRq?պpt*GZ+BOِiC6$C'trOkVt9<|7H=>:)j8SZ#)Zއ9JSE'Gx=VÓN?BԧZ;{'ԧNӧ>.AcSyoH{AFQ>=3 8{-H~)ynOk낞/_|)Iōnv O@9s!}qP@xHlO.('9xw-0g^@a_g=HFmdwT#U* rJ+@ZG(yM5-exďXxL5&Ǵ@N: iw= >{܉\vu^0q_8֮8JC|}|/|_W:"P=M9eD|͟  2C ]$JC(}(-҂(4"bͤ7ڨLFdrA&d"'+ti7٧8ojJrb(śRÒf'*tO.HǡڮVﲤ%=sqSgjM,#. < ?(d:IJt|'&rbŸg`89v/ktb+slnhN3eƾÏ̱ʔEFTzW_Рcfuj`NW*c}9sz[v)u PZ-3V_ nA?/÷ϒqyt j*v~ny]{iMNI9Gт|`@8iҝ I:34Դv]dw?* ԮUl'zTÍ>85ΘLJM뇍ΘW =}Y=|]W/\fbwݒ^7-?+?Vdv.EeW5.`w_h4vʱܟooݫ0ֲN| u7{]Z๣H~?qvu5iw|5(Ú`؟\|1JWž{<1ni. i|!ʐ,,Kt^_!}~K_kT`guXS aa[u !Y lF,4Pnu/(`]$`VKL-9[XFUI|_EI8(mȼ1}A٭Y<{,*[5cR?Pkr7,WZYR_[ʒۖ>>V^%ju >Rz*oX?V(c#!HB1"D'q u4fFÖg8aBKGNa^y⼺ 毁6;*3 lZl \V,z|x`:]qNdA}y&|:*wMZ;< IU"n%S:h)sWl+}i-ᚌum}q]YTHȐ:Ԃ b X!DX6I6S~ra3zޠ @$@ Bq> i 3vM' GuZ\HÂu(ECuh|@nЃ0|5bJ!mV%,M ʣ|i4O~@:;3PqFĽ^F@$HVJEI7]-I3#8 ; t\ iڲS:NFSC^ych("4H!Ur4>O;p\^/5ش0ҠdDa]r8ts }!4|3OLªH[atΫ"R"֢]JMȋYvHT3_dc m( E<@{1%ƤbWa_oSH;;ӨU F&MĆcw5ߙ`1TͲb%7sM?j($C[L#vk;YS-OPwPU7zۗri f?rK*v`ozTG%CLsJS#},&̘>`)/oRngq%~XixK)'„|I#$M5?$d\` (vkJfaT?e-~11*ɩֶFF5Z,\G(oj"L= `ut)M )Ik?*4"G4OVC]! MA«s @qD̠ NCJtla()0W75fW/h"/FIN#rUD~A3}G:`DueӏǦO9-w1ۑ YP@za&鴅9RDԘ-՘tX%R.6?qGS#@S 1Cl~GjWA%_Jܢ=ﶢlO1!:>ƟN -=A|17ޘ ΅s\(8 ΅s\(8 ΅s\(8 ΅s\(8 ΅sɻ O74x㓎L֌[<&ԔZV}kt6R`╔|ºJʊ0-ݛ[nqy9oY=6o/X֠~ D(A g]VW[ V80U8^m?]۔#Uoj}]Q/Ȋ"2;V&$D"v@%1:}r6P,W*P4,QVTwDb[ (^$C].$r6LYJ >]%O@)qCGbsJs4I[h^gIPpg&LJ'*&:9GŸ&iB&[FsR !~<º*]IJ/S|E&pH3TMKL4혦S C'ȐE\ ݉Z9@)Z T`*VB27M蓥H'0\ f<(MFzubA 4 Fa T\e\*HLݣIy夈tXnaZ_ZRLR*EҐ qSGV.ߛPq)m0c 2Cᘡ$3cD]Z\@d@&TtH'*3&ǧ LBhB)՝qC Ii,WIЕ%&\-7mAe"zLw5e=Z|--L J5bH˨QwDL: n6 jFio14LW3+4s3,JƵL#q˘e<4OȔrڐiؖL0md/gat⻥Dڝ "=~A|bñ&ƕypDjo2>-3GUdAIؿxRfBA/Z(fc@P!)jzd*\g؊ۘr?t<s|jC6skKBGZ`?hv̫J˽ $l~pDQI] 'r;Җ PM!YzxMAC G:\P7~epbH59yu`!Y9jt4'+Y8)~"l77 ::-9%Vph>M-e&UCJhYj$7drUB *0Ҕ7 ,k&F@Z Mݓ_YT4 2a[~ °)'+bY ȞA(FGuFp)g$qoIÒ#ws3NɼK,l Ɩ8 @,UU .Ixfq $2\(FpS+B{E]jkl\-A*|H $&{nd 4|yHn):==|\l2$/`li#tX.-e, 7`}hL:(g h55Eb&~'f K\0`0B8 =j =1AE3GwDЙ3-&npi&MeRk9n ] bTYYA/I{ߐRGj 1 a~u)X3XD&2$[()-Dcw]$*4fOP:7\X,I&w͆o>}eA!.!` 0ľP4i 6_3v/Mrv% I p7 q3c`Ίu')Ds)sƉY`w0CjoTrbgLyfK-J5<*G!PZLIL,GmP´tj%ԣ=<,R".'PSI,ϑGfz)AMru'q?A4q-2q/;|=Q7oM*tB,-$T `Q|gIpC%V̸t_!byNµ*F_Z> H{\}uޒ]HyQOMwd9HiOL4ZMYRG!"bLd=>P.5s 2Q8w$.(aGwCBA͢bUhDVaJ'ꉤi LΝ#IRmr T#Fctm! 0XFdHY PL̆)<1;]DiH kS!ILzI LsjB\C~u̠DȚ9RqIiZ̎.g8lYhZRe$Y$fKU[ÛpӍ; ,Cڇ}no[`Q w1 )#՘D>"`#cAn@v+Q9RʍTrj6[>]nM͒1TZTZiQI÷Lko\SRÖC/pvp[KMg" r^TFqFfԏ5mԈMWUDbN%LZ6Nk.ԣøBFqCiѨsvm๳bޒ7fVLUKZkIK-[/hIJa_"=]4b)¾Q O/n1Ȭcr'Y5V9V@nN̟o^6(POo@|y-5/2pCaa%Fw4.}1-ךEwAoNW̿€0_\K%xq&CQ|}I!1ЂsJuݣ_ib1.-Am/WE2L2ST1mg\BZ1hŚm\axA'ڐ@"Tőo #fAީr'6`cW5WyQA fQv:&{W5, d?0:$lDEx!:7+t:@>3~dU J$A@@HWqPJ]H?㿂2_%phS oWBr%aP{"Bs8"z~ZT<ɾKGP8*s=]&ø }hT+\Jص\rI% _Q0~~ Be,=?Y.}`\bBtq-ù4wqpţVs;RMJ3mk+/iHU6rab5uǖ_~:1ˍoo;Bi"7Vj-&Z=ޚ(<:}p+on~Fߥ]ML!8ʮ=Xi; ?>;gnYIi_q쵏'/~= Z;?^n/{?qv/|uw0 (_nSKl]=4"6F&e\,a5/UV{މ+U:`sM2.TD^Ow`q>r!t qվt0.d,l P!ԀҤ\X ean Xt nB9ҷ'~γw' 8>Uis\8Aky}lY<_xz_9qr4GY%?tpdtYl<h+Wa<>Z V8d Чq~ݝ C;hh4ArtPLLhk/ʖ!^@m|H./=u(FhM AzgtK:Šz_@ шxXc(g yI enI >|3~cP^@FuyWS!rB?KavzKK&g&^CǪ+)WueRij*N_%? ^^뽢zփt^#w:}GVd[AÌ_jopP Գ?\d/N)( *͏V6:uj?^}.7 DX4 Salt State (SLS)sls source.slsxڅK 0+ x!Uʕ.z7JQT|<t*17d$PXD{U&)L&:.!}ﳈUO[9>Re 3mg˞л q1B. xHtJu}?䝈q\H0. p(4WJaTKQ'*#ę-!5ebdl%=Է_ZΏLpC.CSMLsmlcmsig source.smlxڍSn@K?BJ+ť q1^a:?hރAo׉k*#~ػ2dBNzÕwZᓽ6LN}a@ׅz搫iuYx=_Tp/<i=뜝J^ Fݬ lrscwfs"t%c 4ڎy7{3{W8BG4I1uT)5*G4w 065b[!#Gk}V#t51-DGۚt Pw{Y[Wa_5VEMl/q{*nXMdi(7ճ];kbXnjS̫<~hfJ1nz^q$ɻx9BpvSj,x&'L*KEk s7ի#N}5C'%aZ4((6j%:(I4?$se>MfR3%BOuF; | UQiIf1w z]5<-* s2z>.S\NID0d;z= :NjW^DsBoށ;)?LlkG8 '?0'G?RT!#X#e!`I_Ʌ@!8J|#Ss)6' ]/BJ!j g!&~3yl#{8֮m}r1-\⣶VFgQ䂝/oM#A[K̚c2IqY'Y['irZː;GD&:-KZdU. QԠ+MnYNNTݠ2AiNK)<:7Rq-5^#4'%# ݒqU>QtF+H=9FJH+M)ΨAßXQt+rmGیm X9d0uf"Ͱ2'/ ]yM|Q\-.oStracestrace source.stracexڝN0 [:4. 8pAy.A=41bK M44lzƑӲ\Z~lcNVsfQgi@O]]LN-4IF rapFֻIgNy?7P©Ъ{WejhjAgviR d9 8N_qddL>9-@yvߋ6|̮ްaV[LZ?ZzWC0]1, دk Stylusstylstylus source.stylusx\rƙ(˱;Nb;NPO1%f$eor(3虁H-_V_eab` 4zú*Fǯ{=?nzQ}eYgsSA'j{+8 g,-[_Ϗ?6N&,ʴzWڌ W+uh@U݁ekJ屗]o0`Ū>IYT{vAd^OQר_TxVuѽ\羪bs7U5yKy_RS睯 yWis|eϫux30HԲVʪ :M̏(mil\*f²Y/ >f&E" KC">,ͼ$SnQ5eST7 &]⩛6M)uZT0uc,xS0Nh4jlRQLMBRUnbhU]EJ[^)4`kzh捘 a15:5$NvS:A4\XAgJנ&tJP6ȫz!%5.MX 6gPj†,aѠ?JAWw4T[ 5уT;SBLHwͪA4 h QTUcm @8c^~TtgH^?, ?>̏W 1aYD4tM{JQE)wXTVbԔ&So9~zтxpwpq|Bo:fD?(f/Ḍ7wZ{uc*ЙEjx>f;쥇Nuҧh-ȗ2,x*&lȯ2;˙k%J>e)HtXdfR+a#vj-Ygݻm^{w?%ܻu(8}8N/ݶЯ?/ x ܺa]MWOxdԗ:ӮrLRR]0!ss]QX?̹Gz"#nW_>Q{%ݽr`x>[VEЫMwr?)^G0Ύq5-e7~^8{l=c dG5V)mvWZ[˭4FK ރݝtyzƨT<-\JW3=g[vn`_ǯ|74֍8_'!\Ӡe!\_4&5VS(wV:kK=c ?6WWkǧ+ff&)iLaSVpo)G|d ~W\m5*e78ܾl8c1g@1I:Nc,a6NGk޷_^G*?dz~9۵D& TE Od~noAy(@~@~)q g w^w1&xAƣ`P!į )jujgk -} 7kwvtNee"=6G|vAwWcQI ϨE}ò!aVԾݬ|vSg͖b<63v&i(P~J3n;"щuZk-V{u9в.WEF>/b~ 8|8ěsw1>/<ctLa5 NcAh *7\^p>[frJKSvbe`B>ǃLzÅSO.4bA/Dv"OH|__w) ܳoq˸@}T[Nw_GA#8sɓ-g̳y4:si (#uquS% cE{q >0~G%e~6Kh}3#}x:n?>ElL?~¼#P+yFp nj%sr Hp3K? KEm›B.04{%)>b>ݐy4 1KbUЛxŧ(:^SocԜL D0Me^:Qmb&'@EɈd!,hvC81!F^A⒏$x$ ҹ"Ga63cY*N ɲЖ /pHII;br4 s~eQ9 uɏ f 0C 7EG&βqFcq)E0a1S\SPxQ~!/?xdf}f 'tr69Q,ōXyv{X:&lʼG'E8OD>O@- x!y?QBxC_f8~:ewx<ˈt ZLcAq vm*;W#zq/`{N O%z'q1$ zQ:0䩺% O {@8DASu%"|OPN– 2'Ew (f@Gagb5ҭ.hzYMB򧙛qa)g#G e9R#%s.\1 cԕuG#:\ >hM|z)b'K`T#OO-ʥla+uw1.REi 0]2f)6uEsV\/wd[ t=8r4swFbLP~J`Xflt?cŸ0uaJT!:6{(/TFI4Ϧ,ۺё(2QGo !=`gcuZǜ5LGΕrB"vM ψjfaɭ>oE mm0`e_u#RydF ",60+e,x7VWC( Fؚ0(6 6ږ /HOS[ ~/ˍT/ָ:]uնyփ vhVk%\"kլ"k.R$lS9,t4 %`ޱ%, f`I@phUkcd"OT*Ԧ5A^. Tai,Ԇgwwy懲Z q%{W>݆}*.yq֔鋦_voHAt}aϝ-VS eOu rU`H҃rGrAqS9(ieEddcHLvˆO`-VX,N&(RkG11cML.W>w'乚DBᡋ#do&Cҭ}J#ƒj S9h|:>.2l(Â2X 8*-F鐗xi>$-)Nʶ8҆$Gx{G*C?}PuE?3/> Aٰ8ңc+畗~6@O Q$9T>5Ï<(*ߖ'<:mp?AaN%;b#bQ f6>}?f)v[߇3؟&p! ]J7d:dG?_Crc*99bmNb%0K#AЛDl'3V qmY@HLAM, P)a(K2OOP#4T!d ]yɇ @( 28G(|RzNHhW0(GE Rt&ғ y:@`?ks Wk) 6)r! BBzSC`7X6CWDY1%-ёD Pp!`^tLJԛ T! ƀx RH"$.%#*' X8#L0b:w}gY!9e#b\B_q0R,a9L!Z"S{||m>~G99āl8F;dhm:)?#JB .J]6C_GNs']dG`jī\]Id-P LHI92Œӈ%u`h0i YiaOf9vM<#08\sX^XH,0 NX@FR@M@9!Q}D  6 h.XÌrO L;dⳐ+' dl^Ng15߃Sʬ"Wq}vo 4qJ[+GCޙ ]T8gSEz#p_Ɩ>3D1"VfcjtN$TU'-26r=-oo#J޼jh^6I6?|5Tvs]iDkoOh(Hj٘-rӵ߲I͵nvn[pxǒ)%>1a6Op} % J\Pq*D!PܱlL`kԚwb"\1gɽ.YMxb#,s1Ui}{78OTYMPJ6-V2Bo(dX()5hZ==lpDėǂ?bm ؤ'ŠW1ͷ)`]V@w^V(TO)*>3HE%+i?P(`H0k5s܌o&tIPMNgMjJO|1\V?ܰ͒1_Pyz'MZB'/k%*p]˅ _Y6 Lֽg{K*5RAᴟ: gWO."Ʀh8-P v2vERnh :nªׯ?q9{M&AO" zeqᕤmvojަC6}s:/n'?ߍ|\y~4&]k3A7#;^?8!0!8!Ja%{=x4b#AcZi-Mw'IQCgFͧ q)aм'Z5-ΫYG`JG[FSJ=b t 1c@f94&yP? &)tS~Ǥ$mf\%f9Rw (4].#C.W%[ |{gЉA$'9gIMCu]2ga;)Vo5tNA$P͢QqS RH3΢B.//%ׄ}1 蝪<{б]ȅ솉PVB7twl矢 *NWXӪL|]{Uѡ6{퇚C_`wbOUy)Dl @w 6%`&Y'_0sOifR,qZELaUvI]mm #}z';D_oLxma Mӫ߿[iZ[54ƹ13zҥ2-@^likH~wGeY ]_,FhZ [ j(SE:VXVWxh"*%\(94̟hfΑ3QBMڨ7"Β;VZެoV=^ӌK#Ec*}yNJ37vbnoQ/UU^.bIZUʙ>nJ!wk)U#떻Ň%gI+IC^_k(.O^5xc`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ۖFB@0C rlB2&hGI tٳ/%߲߰Ւnu[6'$U]U]]U]F-VM ]PgK~ LQO9M>Tτv\f:Wg AcFl|"D_ ׂ؆OS[=gܵP뷱3ԾɨCPηi,Ʊ7]t==߃z4 {M|gṕd瘇M~ ?Yud:Z lEnӰ/|.$*MW*4ASe^Pm+Ѳlg -1RyꢁiJZmL˽:`f2)hYlh,iu]5qc_B>= C؃՟cǖ߈-{XS0F޸{: '#'xJ.@.aD4a{p~æ` l Vtu D$rKl z:ĩ~xጶPX 7A@F -it c]Cb`# }X?,x3$E[@=)¿r2;42 Bp{<9w7aHu( &5r'" N8iiPJBH@P/B3F? 1H0V<]Ua.`_Fk)ʿN|v58f 쯚$t&HU<7 "\iyNyew"= 'AR bդnvkKX?eڟh6:l9u+T^%Rڻ(QD`iXۢ]ٸJ{- uEZDټLXmw!}^* xym[Ʈ$HnIʮ!c11 |dQ8ݍ͓70< r:˄ՠ n׈Wp3 .hl8NnG5'9|9cTLG~g5(Y3Y]CQ(]Q>(TQڻ*vENN+y<%!Y|A3g9Y%=EyWQ~UQcatI2Z@;HdwD)/&_*?PR(Q.*_IR{QKiҮ ?Y]Z$/])M>g kEU4J "E;1tvIȝLph(PHq0F3\U t~/t\5«,KVht<)6Y& U *(BHUeѺm=P9 WKhO^ܾ*В|#:D8q%OJiKA2}pP|M1`*O- ]?yZ'xùa2ᚭֆ,[As$F׆{ aM db$mau0"Tyx$*d<ӷ<Кz/3`FNevU=$H좑ny> 0Eh򑐯x A hܹ {7aY$ÁdQNƝE&66!En㱸 >LYNas8Vs8WP7 II>G34=H#줇t !%-FǠwVz ʧ (ɉlԃ=WA\TM{rήْbP$㊴4YiTAʷ3~B;u?^9 ʀl(󄛠6L@}](L|d, b,Es:E#iLI1ɹ*#ySP$&ЖQ/KJd3=zF(=4fhSk+E^TmciE{U᪘oEVB?ѸkuC<hClnF HjvMpd{O%q$=8DN==4FbٓRJp#ݣI 8^6J 't[*b'J~p_=뱹HPFX$B"•VwMw' l=x]vSߘ-83- !U5)nOcs[Q~FvW?v~:֢Aڽ~mrcZ]տxe9eav䜢B}QfdH 4+{TDO˓|!UX(A΄MxeA.>>y/T/`Qad0ގDR(7#Ň`!Ayњm]hي{b60,5 )$۩e[j*^&[Z0f%Ney_9; " ?ED_w}7f·?pL6 >"yԫ*ʯV1гW 8JVYR=8X&/Jy`%J@TFW)8npT.i];:u L\Z*Ģ wمwc3?sM=/YqVypervy 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+)?)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|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)xio64nz^i;Xg'XfKb@? 2haž>_Q%ci)H~Y(>"]?\(?wKp8p"mDD֞nG$Y{&e>gV$OMEN^nz.k]E!=p{kr~D1cW8^Cm < +!kҕ-' !/im ݱlrI+Y{ hBiNɔG1 ڠ>a]ӄ: {8Wu͖TIyf$#(5+0riGXmm{Q ٸ0%h\* m)ipg-(ych9Aƚԣs?tVc >#H!-I R,I@nJVCӁH=ClШ.5t{_Z~p7 8nL-˜:v/O%TI==F"O ͮĈ0:$/ɌpUGQDǭ֚^DP$L``Dc+@>[N;5%}6߆hMmkBS]18yC<8(7uR|{%Eo;e] ekN=L8_ǜ}@hi&pIG!).3c(eKy SA6Ĕ8: Y^r-lk^6M1Uzq/nҥ)7 !͂ }"]7' LǑ.yݠeՠ J>/= {}9D$f4 ~ÙUCEFRAuSxI^8 @[a~Sn<)6iMg{cW~/@+f#4FxZh sUaY Cǝ>.BCWuoP0!)D>..ˆisB2RaRʚe-؊ZՒ5_^(J$'6D}`A;G;.JŰ( 5Ź\ ƘApDAy3*bFޘ8 a'Eeq"KN CC.' (q1 8>|QP+0< $0fHXB]г0ŪHnx8DCl#Y^8;'֦ Wu`C&!A7}^4#MB=l+Χu ^K35Dg"xyq!+/ԳOLbqbh* %@ǝ*+ 櫃Km\s}z%j_t'/-\2u>EɁn.=k*̏iͩX>eq0~0~0~N4E-'[7j'亐үaQ7FϜ')~>Ye+%N.UըGVf_ɉ = Fuv:Ac*+33gY 98w-6nJQjq source.jq identifier%\b{{identifier_start}}[[:alnum:]_]*\bidentifier_start [[:alpha:]_]xoܶn4MI~ަs E`۰/2JѦDlC+HniE=>R/FB9ˣeΥߎ\g$':z@w6r<9JpCp5[j}X=8AR I>opG[؎ }c6KǞsMP侧^ci=\~#'3[vH<m=}tlှkZSO?mg $ˢKOZyտBASJr<=h~pO{ͰDY'u%f0 c77]UN\`^#yC3[Fs?Mtf{h/ '(m[8"I. z5} F0ωֵ>ŶM)O΋ Ltw\ 4ȸw<j?:3Jd& IbʝU8O67|wB+DI:%9zb?m+dr YWba9mc?o#|T{s@)Vݤ! %g669|`3TKdy-ȋVcʒK[k >00t`I[ NoЯ*/K'xǶƯZek7{Z/a0\F窇i RX;HPuI??LA"\`AĺRa;sH[WCx]> ͚7X7nvu=+GעG>Sx7uNlG|-!Ëd]mѯ.z{Ͼt:v10Ɖ'qíMT#}2oP]lshp#:FBq V(OzA(V%:Y=I(Ҹעa0h>T,͙Isj0%L(,JS(v qA$D)~Z M3AyeZc\X`AqIf^,KUsL*;&H #NJ \i {)9T R3B.5 xR@Aѡn_2(ώ `d…T3;Y} H=Xge,hX@#n[?@a92b@1op>o[EFSky&I՜⥚2V Di"+r,Ի#8`$yotK`Vvx(JihުWUGyŘ=M1PDXᰈ5ʢ,:?R:g0MTRNE (Mrf84՚"(@3tz}u[nbEDZ }G(MֺvZ)}bt*-YV(ӍD3sL-H-,,~_*%v3͕A-[?nP$2JUo 0Q ×ӈyCԎM&A ZTO 9IVD]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{ř##86,kfF 6ĀÑaz[=Mw$Kn@ror\ȹ~?_ό4y4=ժ~ߪj >Wְgkg_ʱM,] ?5|׶"DlCX^πv_q"g:$,dو`.n/ 0a7an#0Wan'00̛0_ `x3Պ&ؖvLo  Ꚏ_Zg}m!ߔ j,Y]7@2B6#%fsFj'[r E]􍈬(i[(y+ Q&"F u⮌xm튈T;Lw*"r""*Cjڠ,RãQG(h$E F=jx4⎪!xxhG}bofC hi*"R-*"R-)"R#SDV: ~5<5F|6uq)eY 7Gq5G-SSãYQãYUãƩQ4̌o^ joA *Fug*Q=F5wV *RBzf$7R!Ylgǡa1xQ_Op ޢL#L7,gD8 g=5ϋ!Ռ!zG_:LSh,)w9%EDJ""Ђ`4 ׬ʹEDJӊ+"R@XE3x`X^Nz%Y‹l3nFn6^-#?W폄&6YD#` -bbɏl݈xi;K\fXp ȱrٰ$K\FbEjG|o᛾ix8M(Y|Z$ q>dɨuI@>d_"p ˫88rֽ$Z"/u, ;@?7 E2SfKb!1!+1UDbŰDgto!_e1򍰼BWfX^ +*6oQG@#$Vr$ |Vۺ9o.F  mW[kD ($? Kގƪ@y #?HSM͢cR?(< O9M(zb+grsnHIa:/źR1ac): Ep).yek"x"~#P0=&"0A%$`kna-5@UBkK3ǒUpG~hhVkVGiDO&m\3FlO)&wq ǵA͈hDO婋 vq_:㟶q,mkۄFIkHe7 I\wAzvJƮnw5oҗٰ̆nXζxO7IzqTo$yӮxA?iHGM`]mғxoXqkƤH&6&G `Uݒ +Ƃ&TDNxfs [ϸ®ΥXD+X-i\)$M~HRIs 9\FU|`icP ͱ:A[RdMj@geX&8u,?5mpc5>"աV%OhXY3FdYZàcb<тkr2ؚˠu V^.ds+qwD.1$:YO/{cل0$:YO/m[ŶD'e/,;(˹2ԟCM8/d8߿kpKL'*QyQwer?D(OIl/7Cs`ljR[W>qtw?~?w`?߂ (⡇Z 8UU1H)CUG$0ڦF9 ryQ:f䴫Eð6n$y&z1&/9<(WO>'郞Et$RIB8<[㓌 yxI16pt@κ A# W.Klrese$bGC5TH!MNI8Hx9۰|al#ֶϵ&a{HwO"8N1h)?УOv8$7z&lұ-g%|*ǾM#!>0~S>C'yCۺ{8kVhj0IdcZɹ|Cl?IAU0JŒ>+!=nO[ŲiHaa&2x/垑G ھ>M`ШB,džՌe ^U4']"LHAlg0;^<2jO*Wk#:)Bij;-4ͮ%#r=V"0ˎ{FR8AߣB~nuy@'gKP ytL[`&g\\L& AI`WAww %l;& G8ʄnC-Q!Mb@G"F |X`q"/cxo前CCq,Ug#>xU t&,E ̛ UAKHm9Bo6\j@ j!,\gpƧ "h+Olp sд6:vJzFHDUmdn5xzS't/4 ҡ{7'I, T*.ЪXC145uP<ÇPM֛ bT589Uy =N7дt4Ͳ /. 28[сe9{6p+{7o1q0OU۬xZ!A i>"Yvcax _]C|6>壇U 5,bq-Ydleld,a` c>T-GtPUNVs@\ nq=Bqϱ4h'(C*J\OܮS;R!+m 0?P1>/8uࣱ59*d#Eq-(ČpcXh{Ku?g$$dYPx,=ނvtQ ـc(W3~aNr3{21Dfic) 1(-GݔK`L6yI%/K)}MksYȸ7-W@8?ÖLu99Ah&]$=fF$/SΓwD?=iP(nf{uԽ0Kp\i*q`Du E)Tr#PDlWRG"KjeЩTb(D @ێhK 䅶:Irz6S1NybUL- E:|+yNm6W@)Y_#IB%)CA.'UFjxccu85RMJ06R{A៰0yngR (-@XֵB 16訽\O}.v5a޺NnElĬz2n@]gK$}v x_ z :avGiT,z ZfeM>y p_"Ti8 i6n~ %`U .w=HSY}SR]I?dMkmUNe :$g TfGf:15 B´L= йW6F@*3H[I .3 2;J_ /3Px_[*./I3Ê'k2M&{}ꍬ^mVş$2s:"IDDHU~:q9^ ]wU+ #)~(QPU?e]~*8}.{oVm=]&ܭY lQl N#P?<#^"U}ٓvwArj='ܿdX9? EqA$qYi@ ?Swiftswift source.swift ^#!/.*\bswift xڽrF@IB>m#=`*X*`Xhz]h/Me7ٯ5juz1ԎF>y Cgߊd{Ts82CIbey0; rݠKty${)R7ݯM8ThXKtK\ ӹrוxsB%7jax$5$&;%BϷla~wta|Ga7,FH8o!Ja'z8K.AХ=JB1yR i! bx(}k@iB*xFIDu Ġ_:A'g)$N\I;OHB#]'7 b4Oh##V{<Ԛvl=g~Q]KEk%ʊi!ʐ^A" h;8{^38%-w@/]C$Uy61:" y41lΓsHhH.7$m saU䘈}>Ԉn8~úPZ:&} Iw0UA,dBzvXDN uKH y"@fS}0Md5n!myfF<%!^wt{EaH4_;A6 "Z+hYqKT$Uh8i=אFCR$ulŬAzDGFH&XN1H;U!wY^/8{>ɞN+M*Z{/RƉ,6DX71ТPr皤Ahb<ZrY4D%K(?2xwItӒ{6#El 21LCU,k h'm% /z/!"Ұ xJ|AZh2t+]ȌW'~2YsEvU>UFF{uMњJ)~ q|%DFoDdGF{PC#5ug]Uxk1L/TMH!f=97ƓJH[_yHI}ٺ%AL`|I# mcs)C{Ͷ{{Yxhb* 0owd5-PH׹`z1!Jh `HCT r m{x:(}.DEn-9TOLF3MUITI蒲*jZu1 9B]D}=֣c2f=M^XN0=˩[A^iz-7lkaz~vu}onml^4vs l%;|avL!ϟMcUjaE5.Ux=X^72el}fl~vPM:,^ԓܰo.YΦn7,7L#]ͽWZr%NƇI4~l%6Ї7U/kjs% v'%?RܚBYϘb)@!7v?Kg a=Njx(б${?lOPu 9{ڼJN$F|?:9ux!'#_U8"{W  i5ӡ57U7شfؿ Ͽj (LioR̬76/ B'?RVME~nI6mڑao~ ̈Avd[A4)s&=kA~ݣ["HQ5":(#1)֪pܻc45M-"V̓%;(%A9gϛA'L0~‘h_ I;M`']H`^f{ΊEiPu 3%)Iz~ʗ&HA/j ~EIE<.~ûȕ1N߰Gb &Q҉ܐc&$ߋxE2ټd:}׉;wHOmB/$R0 '.7@Y'NK>Q}_*a$ndk`0 ct2_W %e]}.G;H8{1ˋU(] Rבk .EOB% t-ۃPBd5} Fg4 |}aXà6г9sR5 *킪$Ew]u8}a~^E_oj5i৚7D|c V4\OhKk'5XT&פ/sp#9@^.VV'rY㰷LYhɞ+a+:$sh4^ՠTS5Yd=5{^apL_~iNUD>U1` j-(*E'Bi\b".ָ6 U\/*uzyjWlpgϟ^^?{ޮ:U=\~p=Z+DiIj"/2d1Uv6k'ކ9;+AY9IK1Gj1bVW0n6C)䠩= i5UʃF]t1mh(B7LPE0 SystemVerilogsvvsvhvhsource.systemverilogid[A-Za-z_][A-Za-z_0-9]*x=kD'` ,`0{m{1fܘ5,fYF㶺[#z%".~]}Ok\VTUJ OIU'pMNwiןSk6 a Tu]>_euNPr Uy/VVI܍Yރںswtw8v/k0)4)Cʪ|`:Uc7'_VSR#T[.09*Pڊ@gl6igQj0yJnO꺼rP\7ٛ #m7Ȝcw; S8eA(a.c^SM.&:]#7I.Yˊ`ݿ9v<oo?VuT ND豛WFy4gP$ X7馕A[$2bXMF@ ҺcQ2:L ]zGA?6)VPoo7]xGC׳3rD+B5cC? 4IV3.B b5Sp' V ET&Jx6+^Q)`au!C EF^_'eaU v#E$0wu n fDa+R= G>'G0HOEy&O A*UH_DfUPPM&8qTdq}Њ(Xo$ Vٙ ?|Ht3/u{$Ii cKQvvЃ{ n E#̶Ѯn!C/aEz(PAa!@8C֍dk̷9xcl;k;!Cʬ$oH=M9JpImgR_w:}|f>-f^ރ-a6r~G̓:<@^姎*OUs9Qۄ=%">Tg_0vЌӃ1sN$Soa~HD"01 iq7>\ 8E.[̱p#r'wrBtccb'Y[vp}XSCU,P(1V&r`M$ʵ-,ED& YcZR3j؎J9L'bpi-WxIguD WA dBD7u)HJz Ghۃ!o *[]ebEn"e\ Ui~=9~IU)֢CkQfqc]gVI>h*L+HZ;s4V.6"W3%qV#$2Uam +VyQ ս'e4 l(Y*;6G S7F;~[4_Ģk a=_gsͶLL8΂!,Kx#7.MO D΋8g0aET=68'PE044!w-g`G t%;?ȥbrr@'H9̧>/* u"@E:Q/D1_7UtcF&iq%.^izZF|}2uIaT8V\ + Gff,t/q|i/+<@,Bz)e1 |#U</kjOKa$\=pX^:ShRX!|Dn`¾ٷ*񿇊CEyMCf}#4o;kն8fL76݂D)b`[aтPV'Eb"LxrQێ|(&6kZ,Woi \ve.sBwb鲬^VeK }K,#c-. چ?T~A?NBQy Fs~qŽ ^?q|E8t\nYQ􇹧[=ݺ=:hL*>)rV*QM27&:TΗEB=P_lB8PWsY[Unus5ӫREK]C6к'[:|Do7 ~ϕh"f6A~̏?~|gx%`RG.A@.+Əe!5혁Pk !OPam酋5 pZ!ި)XՐ";ktzPI)-+TX6~X0DˆƩb`죶lκl; >r͍/Vh1;["j -ð%" pzM?kkm`k#j=/3_ssDJtEwSß-f+ +8>9|oM?n}:,ron<}&0L'9ܑli}'N/2{tb{+{^u_'ATؘRl=|<$j[K_٪ͣ1nѽiDKToɚ7l&`F,v =2͊X RJ)\a͗榞\0 fvg ^7td_zUC D )t> sR1mm䓡ySLG@ٗU8SN7ZI~e8q % R&sbk^cf(0coBa ԡᙾ.>6$|(ӄb(- KYM3r [TF-sv?ޔܥ~b<+%Ad'i^e|@v2SϱFh9^o&#O(s8 ?DH;*cب)GM l[57F~e%5n&Z}V%TNqI |6*trutruZ5 ^ XKI 5K~!%^8њ]p>WKY[jBKv[y?GρdY#6QHB+|]fW&+iniYLjbHEsj)5iey1b H ^bG0VB3úK/t~Cehj2;"-M=7Kifі-W˿{q˔lMВĎCr/C3$N-Uo\Cp?4&x|36xCvNnt?k߬ns u;}|3Nz!qQ3e2-UZfgٜi3kskIߒ7y$kߞ$h0AtPxI>7`B +jT2`*h?n{Aɟgd9}_͜bK.Sx/:-sf.3d ׂ d)i(1_j,"[&6Z=( er$ 0^iv6oݺg(ye|bx."EҔ}Ш"*4Dш$7y&=ǚBoPvX~t%6-ԡd_\4oʯʿ_~G"2;ZZn0B5w<xZl(Pd HE(*L*a gLSGz8E+ğg{1&;fٴ*6̸))M=D68?r~x3āy`{?c7C#K3+:َvG@$^ |S.{x=T~u 頲ψ؁@"UoɆ(D5p(l;8.qL $_ ICZLE!v qN?*.(ٚP; J}S麡&ke9sftS!'l/%55jw.ks^üvm)Q (폝L?w?|=\L,gy]p>ښE ) 8XiªjcMH!yMbw e9Hplt[$ A}P}.q);∮:{yq%BxU_&Gܞ϶nV>TN9[ Yp?c9z -̸k0RFC)ݭ~&ЯtpK#'XDgf_KfUbk*m]r ;>vuMHzP@{NhG x>D-!RSCVSYu j)-iIڅLH7,oBYNavigational Bar SVtext.hierarchy-systemverilogxXrD^BZO耋FGjZ.fz m)3dڙr~4qv(zƊG"ϢIIR1)en\b!, |eWH_3>R77m`=uЮ:m@۞bClp=>}7^WOGzLLm8b 8cWsarr CuA,#.pҹ2z=֩T̛CwxEl0L:v43F„\mIϺ$~FTkjvTFjOUo5e2 3<.k(ϖ3un=MI֝˪|]t.JNl7+a/%AC XE/GްLCWَ\>́9W֪#n7áWgm "s`{'tﺐ ^@{_dRdp[ÃQ4^֞󱪢 ص4u2Ō߭tup;1p$V_$A*O/a {?;?Iՠ@\M%y[&҆RŅ\&FQlOFAAIGb5 J'>݌a=;{ʖ|FtI\J\R\cˌ;!H6p:=gI>e缛mf*4%qd Yz<2GTkI?(l%<3-xq.T8:zwq>=`0&qw"b!AJQ8`oȤ 29=QҕhB(i!QOzhjHҤeY)NNaz~R=qT"XBf+@[5'r|aCu~[Ux)31!y6X a\ (cVV?YILՁ *pBl})H{}+KٓL#G.Q/"uI߭"&`6Dmuy.3zAE$H,Za{*/UlF0bX U h4N+2z#{ ZLiLjeSx|d"*mdOTN=,YVR<#REAaVyF|λ̢^/ۅ|if&mְ?47&؏+niF;i^L[$N^[ #Z8>RS]tI# yoi96RR`}Dtb"@Cel B*F1eԉ i2hkrpHj!15TZ&wAط1z [n1/$cmg>IԢx<窝"bAb;0_#.SڔmrG$5NhY%ɲ2#/%*zQE!B(+*P`Wtm-$PZŕ8y4EKךuv"|ҼGƔ{l􄉿dRe yNbv8BVs +d~ v (#Iae{!dƂ~U@q9kj/B-gKm ^tl7ԇ]_ՠ~܍5 lUZY$H}9_[x!5\[-T!Q+d[ 2h )2I@9F'n}6gLYj$33Vh T w%nU8QvZT韾dLJn;d%msE9I$x7ÆC5u%OϽ#׬dx $A"ݚ|8")[ANn_TM'I<?r5 \ ,YW\ T&?d/vݖבV8(I<(K֚i=mNc{ Dwl.[僄rG,6Hx2?]*JSON (Terraform)tfstatesource.json.terraformlxڅ gFݺu |%0(Pa{Z|߿I8vfnLĖȭ QB](Pvb*YDt|]7W{`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] xis6֌gnN؎JMx?`$Ƽco-@$u-=HZ~}_J  qYa?(uY瘇]jpԷ'9͢WہUݑ9^D_4h|鯊x0d0  #!pV ZJJ>M#XI1SX" }Z1( \'E1u` r)KHJQ<t=x`r%_Eap5}$Xif7#_Vq#Yst(P).ěԾJy"<|\0?pX3zl>W/^hJΕ+x,0CAB ``2gGBJBLe1QkKT 9{~daD)]~}=8w͡&4t$`!4jLܦ} l(lƠ+; >QH`5T#"p *QP%r=MbHAQEJ#W1ck牥 "'2.b#c}OgvP۝XƏT;zTXFQ}UE_&Xtxx  F']8c7Ә3rƓҜT_q|wJQ[Œwo\Z-<3TKQmg~ffO&uPlA\Xyf3plK/ZmK,>4 Xz8H# ˓E!ja=1I_k=?LwzsV4syJ}D(㡍- ٦S%ÁRE<닌V_;͙0 .GH4 ӄv(xBD 95{g̣IjLQ[)* ~<+3yɳ9ׅ**6w3Ml[mޞWҵNHĚzL;1{{EAmCvU9t飙=dUxjh̘ь9U3ˤ6ےߵL0&v7 Că2 >SX i顤h\'N!|G]濰Y 7PB$0\h2SH$Kb3|]!sn R*uE:ө6Q&M[K;b@XTe͵eizŶ9zLSHs*O($rDbխjk[rY| ~њAfvxEWxT[j_QLMc/ɧ:UR7%4K*h)R?VUcR#|W[eَ_jk/$=؟>?W~ _ $qZH5 MNDZaGc~jU!e#o;<roU<0hVAk F?#hun8 =/azugҙ;{{4,y׏uEp,8  8V3a 0,T 쎥(,mw5h/gx/eп(8Yhx95LJsbt}(2*9mKνLEC Yy=s#,bpesFnO5Todo.txttodo.txtdone.txt text.todotxtdateE(?:[1-2]\d{3}[-/\\.](?:0?[1-9]|1[012])[-/\\.](?:0[1-9]|[12]\d|3[01]))nxڵU[o0n]$.b{HZ5m'x 8t]bgD;B)ݴYwr=x %)";Zy=/㐍 %fSӄlK|$O!&J%qWkWm{UJ#DLN"W2us+niCQRXǘ ?`Zl م0f:fo7H{ PV*rSn6AR_P!ed]XOTДy:-ǘ{fצV*VbW$'1!ǔ ^cUk36/4=f3sGiǪVr LdPK JjnX"&CWN9J'b#S`W C#t}Eħe:`^I5\x 3 ˾!U ròncީU7пE(\OmD }'l#!B!uN$ Rv ٩PGݷ3/Mn<^1_aEe8=K GUQg{bڰ878g;:*/8hRo[C2kC_o8 ͕M6}dmz=gSEVd&&{^$P2ݛFg3&g mѸ5%)sACJ*"u1 Ж,5,e?oZ.N"! tʟI( rSouU!$8DbYkYR˲_ϒZ/d[&~#Cb9ieH,ZR^ϐ" ?#_ː+D73$HN4RNlɞ6ߌƣ4E:3k2`4 z[Tf̵aCeRQ͡ş'f^oo&؁6~_[_OL+tMVh;!G?;HYIdYT  47J[BZ,ʃԤВ2[,s">3ar _ N?8J+cFnr_+1nˢW%%k1b_)rM>Sf%ur`Xc٪볥|f0gmq&k\dF<MJ7 QoșQ673 oLI(K-%drTToMM*K&;)+[Բo8&AjowTA[!hIwrB05+ߙN"w%DmdI$KA04˖^瓶􃶟?9f"ҁ}'K?=S_xm+4ݞGS.F&mF+1cfs9!)ĮE00 |'>e1.|oHqA7"4WHʃvcmtLozN$^LoNΟO ?ß= ķ?kl@$sY%D.`YgK rLO/J E\Dd*Phb4?Fd)?߭0W]Qf 1Eҿfb},a\DU cEitN|jşYm7^;0mjZEgH`0 R@tM @I?.0]|O (k& 2?6F΀YY$'FO3O9A {gD1$D#->0n-mL1c"鿶5 "ѿI"Z~w)\THA2h)>4Ί h|QV$OFI~ q8L8-"3FRWdf_D]"a.vZrE1$i  L܊?jLc)U D7Ƶ,,XëHwW o7i[`*)a& O8 Ǜ]Di$hr,L2pJg]*A|2Tz 2q&YΤk:Blq&@΋jn1MB0g#aQ}D@ڇBqԄ5VwԤǺ%ӧHQ} KO7Ӎ-@wɄr9'~HM,dLϠ.SC,G+rN{S:B3&ybE &Men N*ݙl#:D$o >ɉ3d7ms҅|TwI,k5'(&=m%$qH\AtEޖUi8>-n35n<ՇbSiKOCi^Iݖ,A=Jz#bHdH?p ?ޥRIw)t\g{V_ߦA ~q@w޶:z=opȊ#}cZXo1_a iO|HEAyC:g#" }yң6鳆go<)v=08 J,vҟxݑIFG?̠1CاA z*<)2 6W)[d{R%VbWkDBCKC? [n/1(Dq( !؊-7: ' ٭ԂJEǛٰ/Z<38/[兓ڝZxuBx6V!Rٵlmb=,-`Әò( Sw%A vɁQPk3T)(X.{%)CmV״Uhz J7Vߍc9.o%݆m}痂)KNUrnkJ&h= bZv]^cp!k )j50‘Rت#Ь#.zO)8|ʼ4kk%Pfn+uSϯJ7 L `(miI t nVRXeaL(YAfH-` ,Ȓd~*TD1 &bx2<2R8[&7 j5ZϹ<#7tՈiC6rK WQIS&‚^rFLRS~Q) SŲ*Exltw7&Tb$ Vb=2rxq,'jt#DG0M|3|#0-cBVJr/0(-9qR8V)i*b)"OOF&e "\%Lz'dqВݷkFv& @2&)*Z&B5LYa?1Y ^= SsuIHTB<7ODV+ӜY^Hj*gmՓ$Ehz\VO*Q}P$#*ȃƵc"Ro[ FPro풷QΗ,%fH1q[\W06*~R wTI-]sA9hgfЃYm%~Z`i`āMN8!I bƏ}<(h+,gݠ/>hL I ,6\YTjœ5DO{GKLGLqO0@ck1LEQ`͕NS-QjYhJd*C`c$o1&W)|\p a3Ƥ̃@f7Ecg,2()yTC*@-VZx |fỌre 8d)8KY Rp P N):Bsp'l/'UT< 6u b0waڶȗP@`'\h%(]<АqӐB]B-N3X0{{fbKʩ>1luLoݦnEקGAZF\.]#wT*S&&$/5ҷrI'&5@ ]{Pذ:MJ&ż~`}6_\x1;CZ0+ ]RTV~X`ɾB )Ab{{ۑ墱:#7Y͢{WmvU9@_y &MќfkMo;O,;޽@'x@,ř~gq z%B%S?qao~(}T}i J l&ܺ;^o*;51RWFUǁg+ؾ:1gQ"Ifg.7vJ6u6fuYxҥ^elwJ - aޘeH/?^euƼ)QG&&2?hɉ4ه ,S[FY:c{~.-'JxXǕqw}e!SLcDf eu՚[ؿca|4Nxu'HxDfm)j\*zN07Ljb2(kRx.gntn 1 Oq#ٞQ#^at kVK@{>՗"Ү2V5ǁ4kUp=oRPuJnZm'Nrqbojz$ylП8־ԁq;tlŔ8) PXٔwh1HZFCF,S(([+yV>{Ƈ32rR(aXOA8g-6~B1 /l%t@K̵ B^]vB8¡{Z]؞dVy[PnH8]#Rr;,s|[t0soB. h!*c,eQ"&]4ZGH刻j6*tQh?i =ys۽IɖNht#yRӅ9L_[~=&ղZ{Hphr YլL`psL{ >jl9z4q4` zArT z~Nx g 'X[~+M36Gw_hd6v6,YG l,K23(X]2dXF;a Ӹ@x 0?kcQJ2L[LCOT+ c|?7ݾz8;!@~Fڪ+UirdoӉ$0n,Y%ո' nz4Oϥ b_mgUgve> c7ț#xWx{kX.iNwt Y#cӼ?$OI 'paQ[=2W2:Dg cML]m'F`p^m:'p#qhĮڝŕ~;~2kd ˹!a|{ћ J( i9=7Eӛqc}%^NIVNM,Tʻ86-4Oۣ׋.W}nCjGHNaM<}mf v˷ot;z!:|§{|R5v;S^h&^'e47P|Ӎȋ(Vej=&-m/n##ࢿߦLgYO6 GjeN fVqkvOfdm2\<q[\un:^ ˢr x3㹭g}o~eWr!*@<]{cǎ'voۄ]Lqɮ0 t4-om<ˢ[)w҉,Io`4ǫ γZ]+QяUb˃XDQ|DV$.Bͤw*x J~-[~D-- APro풷QΗKmf 713p($EM`& OM@S* wṮ8NRكZ4eaCAY ƎfPBV ŪM#$W?a@s΋] r t T+Ǯ\^Usis{]w]~:Y?4D4[1TtFF xj.)<k3y1~z>:ZuWji~{ 9n |vHT %C6NԒZ4[SC^#82&*Oz,4Nmkbb Ý _s~vdOGtΘ"iS`1eS.9bwwf+J`X4uvw 0GN%SpCy%uZNu.T\Ŝ%F`! H1DA߃" )4XC~Q ZyHs`dj8V1'mI*7nE!*b { Tq*A„=vj!wa?p1 ѷ^ KLFy`cnOl sz߭,i7%x@y#M@Jb&6<ՆrV| 5$`53i=AuЏj:.:^M?0tz'LACruGX0-0q z"% oӜ Tn;;]osW"IiDqSE%lz`h bZGsOIA a("_PEsso2o/[!qRH76g-) z wmrvNx2C`,\BTH_pm\ MᜁT 3-Ph7V.;@Sݍ `=s]D?~k%Ss#lI_P'-dGuюsZ3XW$ YQM Nw|AK~ӏX Z)6>`r ox] 8(!.&+ױ`?QnYg?وF{y[l doK M{lBy,y1>$6b78߅QFe=&aK''/A驏ٰϘfJ?YƂ+l80*{Gt.xCe0isq'.2H̆P޾6Fٸh\c:Oݞ`+Ws) z(?N£*ry4Xb`lgBh38%'z cdİmIaM Sڤ NUb |e0WmZPVOT$B Uqoj8^'OVy?j׻IN_*[FO/L}Wp#!I yoeq/P0uݖw6MVM>gˣ&p:QJYWldZ㞃d֤RH%eئ`oZ-Nϲ|8:Xʲm\]h-',-YKg,ʒZ-c-pzPsy> ⇨) ߭sӟu7ϮGk6V#{|' É~xEM `bLBzCC5wi}mrz}AKD%VBP94ܺjLTЩ|`Y!^(eY-;a+Yt'flIN,,F2V8[ݠ2>wӎW~1 kwUr-h3##YFgKd.xd3M+LUnZ.nY02GMx}KJt"-mӇEC.ž^X `)$5NGf+F7.fmF W6ݚDĽvj 1xIJu4ZASiaQ_% !NR#愖GK̔@O!XBԩM&RQ\BT3Jjd8xٖ #צɸ*92:3d߲\tZkEq$F%# (ama?O\z–Z6{`VI&!m(e~j$*W EEJ iY;@N<8L'k̝v7š^rn"f"P@<v|}& _\ {,wc(Y y5᏿G~k$zfVkH[MM؊ qņ0Ul*6L SQ SņgÔ\$<>T?28Z,rSVgD:틩 &,K -Vsa%{ ͱ-q<}Rrt }eu5J!Z۠ÌIG0^>#Y5t>5UY_فYD]Dsͺq(&v?Uf٬ [CsBbRio}[Y\a#_}fZWݑXXl?l&t H7]3]mBU~}Ic `ۑPA`y FiP- *HwXaZHf;{eqq .ȃn/TBlG3&O[Ilw) ^ͨw i`R~ ʶ=vyhر8Y1{ :.pLTH\NȌ {8e@e5K'G$.P` ;T0+ڒ~ Wx⦧\ - }wQ6HV4=qH`s쵵ݭ3?[.5W6:␥؁{{K-&ZkB<,/'5헠^N tZx[0ڧ]29!c.ERB.)r U.5 U Rq+ B!@u w[;IKѬxr^$OKS)W(_4tug\~-Z& *o gi^(Cr{alUBڄ,Z{6JzbpIB`J\^Ar7b##e Gf| mK&,̉noP~,-v#ǻ\V՚Vؒ{ms%O[)D?,_a N~w!KH؟aK&}+!vey=s4:qC2!~!08\pξ;~ڄ}qs}пX{ mff'B&"IMTn-[ M>x 2ٶ[8ɲI9 Dl0p5Ä8/3ixq P:GţkOύ$)e^W;kZLzŤWLz8Cjvr=̃{9Cq0Gnn'*N`_ïJ gF/(v̴}2/)~jO~XX!5Bt0TeToôژrobO[4〵Ϗ-ev;{ DCE-~G{㪢+dB&;@{F0Szی΍,%gnmG~,poO:E8۰[ۡj;䣘򲻫 b=q\Iޟ@4ZCRZW7W2s5ӋxUK#tE1ES>:R<%.(&i)^EGGŊq2sp%]'? niq!c428v(W?SImm]B*n(n(n(@-n(n(9Bg9/2_q&2vC7ڌ Ty4c<4AWtj* vfg"'zl s#YjhZkŧ˰ ~CgrR5J))Bjl9+i"DQ7[^knzAg}2deyW(tY~UϮg5+VZl]` (ӱhf=v;8?(dׂ^}c*%Ogt$4;!z x((\hJ\&5PZXŮ~NW?ybJ-딵{DXg(Kl(,k<6<7h80#֝p5Xz~ 5=k;Tn7H'es$*hk )1*\|tӬI :qn]2 `۩>p(&}?}N_5'_P*;`G1 > "08aQBDq=^NWo?<7AM!f:KV Ỏk-߿>l,ik wz4Pq)hbn"KZ 6k4.o-,0l{1fjOgMɒO̵G∳ᤣ]*U6A<('xs/o3h1}$`=kwEh>7AhH~H}m.<&U /#ڻ|bj"bxeN bJķi5l3[x7)#uq@յR> YYՐ/U6C<'A%қ[^ :ˑ &QqT~4zO7όCbMIױxL`/F. K_qKYwYl/&w[,S!Ra|Q Bx}~-=/@,b!|3IޮxʫogĀmN){6eqKEߠ`!t2ȋ`+c1ojc#Mf:M2 i#!% Gfcꛐ3PVӭ7æ I`Vn.ux )h =7+l؃AI?xX7n;$e% bm$DYԹs/dU!3Jx;B շۈ`Em-J+P:Jfl>aP {:!1Iëbmf6@ WdT~ԶjSC*71[J$-@2~m5 _&P" GgN 0o@LKV]_|٥k./B._`|ˋ_Og/,_Bx#v%ǻtSU_6LRFlo!za۹m҂.+FuM7o.I+z`CBW~l{Vq:,j缠ʃ1}S_bI7<6,̚KԤSX|ga= Mxjr5U`5Ioc,+NH{%N%aunQmzp$*N1 >ZD1)RVUNVӾ/wAmXaGĶt1?:”cV;-׋F|5{t\7b?%w@P=Qyo걉iPFTXbGttw:=? OJ*>sn{8XTuBqjE{s`~sG{':q2.{6 @>zcnhK5hjYm5AUm㽻}II =vK}_>ۡZDit89uW 5y;),Sqk\4쵘NfM#Γ6D]qߋB1(lvΖEt]DR6^GlmHDZ 1%-hF3VeN;*xp&xXVcEoŭ.A0 Nw{Ϩ$ZWLҾojU5݈9\xC?Μ:¬^z[L(DN,ox].WӢevnaF@|t4w+U^;n̩Jqd x7,/(r!Y 6JAD4pБo09ʩ{ A1WVK{6Bhww|BA騥w;MĔu~"t( I8' Ą/lӛh"SVoCmGꘌ]eF$~ AkDfſT+)2:cKePmx"~x}&^R#tfX:QN~KE jo7 2rXr۪ ۃ?)`|!V[^s{n/|.nl_, -$/ ,=.`ڋa8@ @*:jh <"f *| lJKY 3S )&.$N:x1};X$8 DC9XV,c^sn&X.~ɡ';8#Y+%6 B" -9O۩|zlڶuxd^qR9ڥ~VM •˧OW2QKKۍο0 f:Fhlq1%4q`AW_}yQLno燎@;C9k]-l#Z4kk %j6u0)hlK:G(BKbtDDh1@ TZ}+蠢 O(FCL mT$nyL*~̣$:nkP^ 3Je4&qk$(\69m^zz}]LډU^J+_ *.][~B;:WSy{ k'ĐGFR'F\ScRZ;-6 Fnb&HzEǿNQ #\wW@c;-2 MU9J9u)W U]|;  񋺊w1d?2B46^UE}=r;גjoVSVՀuҿ; 9QNS Sݹ"I2l):P0 s3b, Cᡐ.12#{u?+yӳ$y=f!S$Z2pKT߸PW/C|$5,/FsGE`kyupWU:*yށ^'n+];sw+.i @`">[FV|˗WO]t3K3.|x҅W1/\bQej7-K疢<K^Y:t4奕ŕӯ_YZL,_8,T.]ZҀ)x̵ӯ,,B.^.;w3"3gO/oW.aK.\,Fhr*x40Y赕@" !SkvYz ?>,x)lk΍u@G7Ph,d8B9 , ű1-<.X;&ħ6< A tzMt kVϹa+E/Ɩ ̳ Ol[LlI=CPY %6l!19=6h3 Y`/o02:@*@; /r2b ߿F^Uw? L ʨ@6qnl >7`Ǣw(ʔ;StVh<v$Ӣ$hx! P1@/&<&6¦a%\0gMС i\B~H92ƚ {xMh#`ft) Zlm{ 7F%i0] )66TQ`+"b~G A?&ܢm@gv߻zM?:!cX^C9s" S_A[hA V Ib:v .\,!vׂ׿NKqc!8 N?k0o#CcU-BTƊ@݁,~{Wtpf,p: / (H,Hy۹ֿ6*jޖ at"A ÖPEoL)C ⮋6[Hm>'Qp6n+Hm0 R -l.oPCvjol0G&&ce>SXm< |Ijq&[~'}}x`[\Wza(L6alx#0>Aw֐rDX>NRT9$1BRuT>Z2>xĉQvK" M8|ꛠOXǙnrvH9ѾdCg-:/ ɻ0\~ƍx7.a~ d#ЄOѓ W ,H]‚ l. ݀h]{ FEW>H.4\\" zc8DLqow I=YI2\}C2 lp߁ Ҳs6i,3p;2g$N aۧmm4֤w=A=T="Р iF)7C3mig~9wvmA€\.nb> R LMT} 7`yMځh?* Ҩ}ztpr.@Mprμ`?j_ô ,Mnw&6.-u$IϴtF7mKXaUY˞}Ź)0^zJx_X *>p4;Lľ's5 \zUm6płKaq2 `vڲ2;N(Mnkٶ7tI&+p7ijõ`sV kuGXmu0惼 +Aem0@[ w{oԑx8(KDߒ DB}!r',x Q2.; gdɏS`x/2b:1SzА=x7MR/xjjɮ]K]rLʠ\1he{Dln` |ir   {0@ 8q\3r4 * *B{n`LP}ɨu˦˩@]@XX:KE-ḪF?ÄF |AI.d+`MY+++nC0wp WfVi=yӠAva'Ev0@wyL +W;lɺyO? T tT4E"a,Ԥ'/3(' gݰKq I!dzSG ~R29,lQ4nqj(̺fg*r2p˿ ".rZ;- uo#uvPq /$@PBe'C6Dy~O [Cw AAb@bl1U8M}B-\IBݛ`6#KOs Vٌ d̼V0ZAɲFˇ1:de{`KpZQ4]>Q's]`:6p3+S` X,t G4aC)33 ,0{Ж ZVKA'i@=Hw!@ ɂombdܦejp0I|'Â@1'"4L fI! mkq)`sH" & ?0$@}LK`o`;|K<jtHQ4(qhF/LsZ@/%" cY8FoA=)yКI_bO@=3Xq^jQ qVy*G#ըr;#_em$>=M{`.f/c"mcQ~T̅Ubzuf8y1/J; yJ\&0xX No SJcaC¨0V)UmfQ#lQ H6#(!ejXǙOAV7S9=ϡLhE ~V]nE!6h/ |_q@orT/Ȇ`H I-^i$(±rT0@P=Gzsޱ)=JO,7EQ<*8sZEhу1c6fÓ6Ԉhj\(mkȚq/BU As:A{: ץiC=z3Flռ| ȳ Կ +0jE.Ƃ4xFF}0w Q`&/n]n3yʌeCHKOb_w.d,E_bvLqV'}{jVoG!tuwL.dAfjUBH^ ?}](wє\88UIDJA?6zr"dt̯ƣiVaECj,Bel$̡!#2s`:eJ"Gi.S̰>qD3nǰNga]dJnz|Bq)uRbEV-E#_'7cncjyFұ>Ut/!1KLҾ0/g`yQDḌO` T*3󀬅x=Td#qsH!6q>;3U (kFѺ=vfͅo:>ힿIquoDmh1ʑ()L {[.jqf f8t:qR8eRf|(W,!ЅE& @0#TYo_(.c{gpT4 m41dfcgB+Y@V2 ZGN(XZ'~ ;֘G ‹ǒOBSӓnTj$^Nf+ri|m FCбJX$C幞=0س@/p}e )AbGoO(P@gV nWpݛסZmDjx@ww`Uatro L4qJ:YH-w^}ɒ%1K%K%%~_Z+j7^݋e9I1Y8bf_ Csنɬoz<֙+ ,jeQ@(2TjuxUyw`4\F޶~sOpwvhsG2O'þ۷Z w_ˬO5br0BCUbNP_/NײF?N1nႏd 7.K+PǵķfEM#Nnog2Ko7d|6PA[ss.0]c8W.Lf%@΢>b ]46}>)TӁnf_doUʸiƸ*Z0ĮUx;JN87P]JL WxTltJmo:IK¡q3\9`L7CjGߜLג?"j wKI~HX %I7YLn*. ج[y)H/[(e*39fd1?mvdzm8u~w@@'N{'{1 Ak i:1-׻-1Kdz:G<68Go80I̓k{yO앚7jLh7r7WssRP$C%&& vum[7J7:];y?a'*wSWr7c49;nESo%9!UʇI+4T3!a΂ sϢCOq:^q:z:ZޡRlmQ\rHw!Z>IZ}Vꛄj& FYVAlD05+1~RJc|#(QΗ,+%AZ0A <3֏sCg}:~G_ݹ^ =J7@H o3nЗ[]H?H*WjkGjo.ߝ;n4!~B߻.?ZbKQc7 _?Œ|H2aġ+Z9 |ղД -PU*LHbLRTpHp0= 7>VY>Id]|VjҺ+h8Vsw7xbb\3Yp Rp:BSp .t8?:pIxRuE]eTypeScriptReacttsx source.tsxtx `Gv:!igW+XKN@ I.HI+ H4ӣGq;;8vN{8Yvn;c;NWWWt1x6$NWWիW{U/٫=[:NyJ5.WlvJ˅v3_Ptfn{ұ{]ixmfeLfŞEdn7{>'VVFI}˞OE:>q*uq{>+p7{ޯdweO'~O$Ow+E|$"su|_I^|:"=ۆ>Z:bޗ)hνm={M>5%*/6ddFuV=Gړfc3LVH鑡&|=n$N"pdY:@mtQXӇ2e=9lWk[ <%.q +4(OJ)|"r6OƧ=NJŧO?8F4:.ht>.!Xkۋn9DmYZ8+}Qh<_c|luZG*uttH9OӕݒEϤH,p$EbA4F"Z$sW䉚"D6Ѧ]^HN+pbrZʏFw<^JC3)%Nn3f5NGvHGYMhLFͲaw:Ng5gomRD)h4O n8*06o\,h$ӈ*$k5A,iJ9kY|^&;}2B@k7]2HnU]jnoL,hsR9aΏ}Q9dM&Fͩdef{d-H&D=e-F`0ǹ9D3?6hb$u ~8"ԶsU5ቦc+"wZo+ `EyFkT"\ڠx#M*Oj *qYfχc E(,Q_+) 8./I-~+Mj1.`HX,)5" UOhtfB%xXUb?2qOcZnnFr/(7oaQYr,D?}9{~("W| 2kݵ>4|U$3˖ȯN^@5`Uڢ&į͔Muz<" c07f(M%r R#ߚ&(ϚGEA}{ZArZϱ ; 獐J$L"9!_O'G|:1tbtb#9c0tE {>nJ?hZ;ua',$y¬k:{rK6lͿ [|?6р 5]ty8f:W4I!r^%DsO75: ƽ?x+7ۍ,m30O:#s{M + XG6?Q\ cڨb %:Ft'' ;xgJ)4c|O}?M8]a<Һ.L{h@.RFaש5i Cp@絑3VMڜ =yS"\hDVJ"]; jr{Apޔ6A~<45 4 5>(ϓ7ԤPr8:~i-ϳw/B>O?4Ad^PŎHK>Oڜ$,N >3/Gi[:N}V5Y@m֚X3h}OC @<S=8mIx"פjDLg)߯yK/2UL}€b#`#|f3tZ[ x* 'Ӛ]x ( ZL7e{.]([pXQj+.,PP|bD:` zRZ\;y]c~rBp^+D5enHEgj>Nd+\5GI $1,]rb.9ȾW|kԥ"#:yNn 0U B@MR rm`x ;lƨ>Н56l"lExFD Xk.d Or1 WxDOꉢ “TLBϱD6o ^&Z]_4JEm6 q %mvP R=JY˾ }+izt;pFb)\h2N,SI~ 9,WC7qq(R wjmDDXS&vG$5Mg5!ʰ%\YO'2=Ads+&vC$)T=&( !kτM h%gR "p9N<@hY5̙Au&%`0%˳LP/27AD< .h9^@8@@*k6o9qEˎU,KŜ޲OZ||$: !̘#c!,gAmɂо@ԾuxBerm6䲡i?nhg E7# P:O`F#iB^?w\`N&wӖ["[J0H܂HDU`F#ᐳ[00͐ r^2ğ3' !fqSHʑ!TR[ ^Gݘ:{vM BlʏtNx yewj$n#z} ezyZ+<?gnZ 6[]+d¬b!f!_Lk>֏ֆ%rbۜ31!,DpzUsӿ1o#֝&NHh|wTwV=3`%ڤـ  Z]7ĺV"A׀IٟԀCCsb8)y"7oAx#%%xK?()bA9+e:NbW9ө-x;*g7!MUVHfa>5h۲?PZ-Bi!GFV+8dJ$lQdnZf[MNܱc}c ne+@Gm8v8urYu󮽁&yss(ZꂯN1ҳTwE3%>b'G(əDN0l+% {ۦ?lλa]Ӱ{ު._v6z MaqŹf ؙ Fz+R+5XauvlNN\nd@5Qw6-G, 1EO)ve++Ö//NX̭r]M.< o1l:~iRÂLJk8?ϸRD8,@/^Q[U޴+^:dMEq@JmR˜ ;nS`8=EՃX (8Fv 9'vsYrmULE,oe(*JE[J'KݨPsRPKA PS.Y*eU>8D:cށ&zBk#!tBSu54Iu䇔3(.<5=S+,{D(bVY jIVX a\i0Z%=vę[Љ_r8풻ZΔ\vP _$CzMt{g IêE FkҢ?A6Z(Q9*D3PiMG.s1ah./[~*;P*[SP阀ëAtS2OLP)~Eؚ^_\>D3+[j$X/D3Ah@fI|X 58VO@U9)o}YEHT@_{k%{lEHj5DJTD:&g\ePjѢ! !(J ?!> ЬUEfZ$eL@f";M'1?MV*;hN֟ZtMҋ 'r!!3xt3ek(j,_.|/b\A͗r1_.y9V?![%w*~@&ږrk3۸4悔;@&n ]g#T>1Ei$1Q%)A+ nO?tn L-,'<(=,t2V5kKDbHTړB㰞߫1uQ>"0k7Kq cvV]*@@ d !Aױ(}1#෕xًA0]AҘ A(eYjᬖ~X縿c"b,DZ9r;墑ӌ<#A;r:㿏YF(MU^IbZbibv'MzGM}Է)q Sk%7@_pl{I7NIx%C)J"\ux NJ8RN?ebfP  bi}뗤't(^T0+(m\RņUtp:.J8dyn͕fdz.vؕw*o+V2tLǴ&~kr'kz(v ➴~M&B-Ff*ew$eѱ?+N([8y蓮xTIi$E+^So;]oVOZ~;W LLTvZ7(Km "DDV4f])Ull/8ig3ar)kͨx erSd 9T]l9͐Zn ەĩve4Wj~QR4'nb[!mWᐆeTb-XIp! oJOS Gᱸ-8QqNyJDB+Ku E050q>eR"َJ5T- #}\A\)iiPgaF1 " qڊt0!0ŗ.Ҙ[م ">3aξ&ցT@S}ǿӐ4DMȭ'Wfg.hC!w 77_!ڹ%2(u n'_b NoJaf_UΉU3-5`Wtn<ٗ轆ò9ҟ׮0JtAЖjc|7pL73Gnw3Md?h4_{ YLx@/=Ǣ5b|'ʵQv->l4]LLL`(%VC|zQ-eeaC iq[GD.D->0Dx_+5kB z X*b~[-Tl( oZv)*?ۆJS`h/#鈁DyC*Q*҆ha3;=5l߁ڪoJ<(!$W"oUz׮~?8#F!J\PV)󕶧FGήa8$n>qDjèOwAFV^N9~2ފr܍Tik4}z4D.#AA噩,1jD 2 l2Yо]) 9.YڼHwٍ05$#˰F5CnCK#|.Mi;LS>mO=n ãJU>v%Cwe8M4S^v}s}NƓ^LAe"@3VE}4'0zWwɮcw|D-tPu[E]a0S*]?8 qbqoV#J>镳Et2ŧثm\nLK/2ax3:g}~݈r!"@<]d;#GRpe/n!5=(B=Ԗ}uza3sH;GRuJ[NXݿ q(/JhOjuX gEn۾pKa7Û}*k27h͖zڇl@II"bwJ%PK]rWKՙ뗼v\-."u'6ϏaǰI0LBG!0I x|SFR;P*[S.ư 1gLYQ+ )h'&GP`@ bk[oey}aՙ5]k%V46K]`LWj:(P+]u{  +g9Ѭ`Ʊl 4G}H`5孠/^ JŮ[:Dzf)XCMmWu]|nFq%Et;=kbRMWVDz^qOmM.(N0;NZLu%?^"gT="C㓮`Lo! !\LgܪkC?=DMŅ̄TƯ ɺ2Qk![[~V$FJ N=컶=W'JG|MɵġY=,\w,\NNS3wLH٩׃{32 $pj"F8׏%OEv*=Դ<}BT&%\ظ翾/5PttsQ]mgƚ m~\>G*,a8o2y6ǀwR!v^1N6XGm+IX2\҃(`hGolxT7b ~q_˥Zo@yr2S̍f6yhWAI2;ӽ{.ڳ.ڻ]>L6iD\ٹP5k3YWK9!\ꀢH I2iv ּ3]ge=bhZ:Qd%De4=F]aI:kꘆ )`R0#<<`gG91<E;OS9\"eǐ ߩ>W.=]{gUn0nEPL2"֪u '7"nWE*b:ٛm6[.ULͿErrFuts* 6vǵ" X< (ڤK P7N*Ek4^XGU!+Ye1aֽ.k=z]|OόN)x'oMXEGgEοF Ϡ@]t?`q  Q{2N`l&lrrYs۴]hRٰ*A/Oav:cm" xl_{C*Wt\{vCN2R*4ϏTE {'SɃ+" "eeaۚk6ڎP8,MlI\J؀ R*K{a\רv-'܎t HXe){pjs"9h#wƦ =Px*zv d($x%rǖ{ 1rhaER.\a|L {t\[,2ⶑwKW@]!Kq7.9: Q+_roE 4C %`ql'iiʈӢ4=i2hԄg ^6hB7{҆dtnM,J>=*oڕw/\nĥS׮KqoXD J#a ƗU>* : j4*pZL _gR ;} @-ZOz04Nm+bb:;JE0qƧCLl$iugAiSfo,2K_0\âC~not펁2R;)Y# z2Gv!*Q4;e~@HlXݧ`#i6k] ժ:&7w/ W] C{Cy@^A~}('J>Rhrֽ&*A„=NB:ă2W@am2/lB\=sz߱f \<|vX_OR~ex,'Q,rT3gϟ-/_!Sۘ(s= %]* UmuPLu/If xѪOB2jxͮ+ $iDKtن-Ɋ?{J*Lcާ.ͮRo6d45y$W\*c2Y Ӧ`!庋ְɺkmns-o^̀3'ssS|k\ x8c%un ,k Qj{ ղ;CR*L@09@… @QgݾlI_P AdtѪsr_$|GO hQgMvw$ lAJ^ Y 9PLmm2 9_!?.{3֑uS+ʀ|YvV>ʘck[B.<5mq Ns  TWu3hK@fR / ? qbWzFE=5Z-oal9alalal9alalal06v,%1V)xSRaX<>קqYL]sw Wg23 Z`lE|/sPb\̗9r1_.EJrjdknڥ@e8?}Vht2}'73Bq$b?}";ė7<.UwE$}0~eC05ruP8,.qfL ;/?n&=N=[%'4Hk&yl]lJtZ02!(LߧޜXTt۩a_\ jcR奖MJΩ뷍U/Vj03TZRUQw{W݁,eX:Kd[]iqj譋 @{:cb 3XZiّ>fU'>~ d<'L7X;̞0DOY#st uhUj›gkY a(h4)XP4SXݺ#ʨTOi:Q_=ЉB jdP ²RvTZ VW(:H1%ődXi: vmuh˓a dJ4[ьC\!!QCϐ#{ n(>CeHo C9G^n]6gSo+v`$8h=oXT^+s+ah6ԈuXWB#HBJ/8 g*/b/&fI5S:A }ٙ_Y*HV:#GǞ3[ : #D aŵ,MeGLŐG Ȅ ;؉EqXVH}֭861ɰ ijvxxP!.~;/R/ִ7y]Sa,^q6\6 f-T!0 ٦<ӅcdHaCYC u4.坁S1`_+cزb)cD25 YU.CKm:]^I-0~[YjXes2Xgj〫e0(Q ÊX[~K\sw,[y Qy*I%7nK)qkeNbl̑SL vn@8Kd)=H3F)miq,psluHywfH# c0*ƩEAq;{dIZt"]An:kJ ~vMCӎI)ܕ'wՓ{nbO>'.dVh3^{VN\EL pk!;0eC=WÞ?h(C7( w@}\{9`~v G=f髉NIP.oʷۀm@6|P (Ķ 7> ;ܚnNɄijdo9 nF7`Yz<&'V uwRSj6ZCͪJz; _&+})T/ꊾc(_ V/ӣ]Sg ŏv $?k[aR+wVN[1끲/bz֛9뚞ތ8}aYo?!W Ⱥ~w Cf`G32j]0!]G벥̢T.  N;}yqE9 &;SHw$zT0 Bn[i:¸jbDp?3 c%fOЉq,'>;kЕr ;bgKWlF]Heڢu$A4^vz҅z ˄~#uf AA5+@v`1 gw[qKkaz7K O{La%|Ϭ0mCR#uLMԥ1,SK:H6T*٣S^[L$Ipl `!6ȮE/AtiE鸋 ˲jҁR.uXڣgϊ+Rx^MMZ=>ofd&Y?|0~edt:0 QܸarKqo8NcI,]z'q=F'ƅ8+?/+^M;|CdٲN+ؠhL<4- ƉѴneHqC=4!H!dRw?7[Zǜ9gV<ֈ-_Jo:[NX\+ݾo վʽ8f7$߯H:tY\mj^FG/{s5;#$96q@~ T D9wds({r<SN}ds^61:]K^b^ݠ< s#')=w6eQk@s,M{o9|tIF_pNDΰ:j np7 sJ4Ro𻉇Rs_+wW6ܣ1r1-h=$$ט-^<%l7q D=~yK,rbgEI02 J_ޥj3Y2%?{gQWR5_HyRl@$fŐi wIS9u]B֘qutM_2D Z8 $%a6YbHҏ !Qnc\+ԭ^;5t5ތkۅ^-c:On!aC Ϲ'}Y :TqΎt ͘#yck:.<*ԶB فUlFroc/JQd< ƥh5\ks `A50R n{=DQh7,5Cp}Y̴HD?Ds5E)Dl&70D45>[dr8iZ>Z% 6I=IYԐ @_̀hţ3V55/b\A͗r1_.|/ÈYm@ݚ8y1 AFI%|rԶB ۶[K. p_IE^Q廴]Zwؑ3MFײ>KwI/B!eC9445qmLQ`'\w~ L+_-f :NUlԨ t9wRȰ?0qOa ]ZpuD&t6v4v7;HxxXː͛۩ HqQ!}X"e &!yLb)`bOV75 V|3tg=?/e<ݕ oc΀$.âbmMS@Sz~Qı8~̙;kn,UZxAŁl ijcAܰQ-O 5o%I.6lJbAF9t(9ʃ7pMVpo 8j5YtJ[1|I ,7Y^n~se,{숳X+UD6uD_qd7LQDV|nQg,&u_nr|uym_YNr?̞auovzRlYsu$N4.J.nP5YPϮ\FЗߟa[)jg w (_IQM8PnQ@èo05ep>X {~14vczeEd9 ${&J@˵A830x@jHc+]g:m :gxSG(Zsl xȪ>u ZOx=!(CEDv>ÒÂl04}g%_[| ~ltaL%MV Ịi`[*ߊ-ϻ\q 6ͧ[|mg T LҔe17fCиLd)SЍ~gw'=Dm&3@#΄kJ[#|*.J6 D=A2eĝkD̦Fl3p R=wU֡k@xo@7Bl5> <GJ֘wM]y`$z1H9s rU AU6;u0Ǟ?aR/3\V<9IF+FӒݢBpAc7$#wid^8NJ>ϦI+ ~zGm_fN C!&ʼ7.clG3!?c0LG|:ͻ u3U2?vs(,&Aa (x}vAA1<" ,?; <h!|^ b#Sj>0sӽЃn=$y<@{ X0tԄ!'L48cאftm0?+pp46|5-(#lw|K不$h}>ӭsx>J@~Wa Gݵv=^x& yqg:W1'Z{YHx{,8CQBG^AV$[iEY/zנEgNZ%uNSnQKui`620a0$9ֲ7xuǾPs T(ƕr}skdTb7d `D]sC+=iepaqCDwE`Z ė=,f:4ViLh:n8^g87@H:o qI ,'P2q?c @;iRyv4DAooR!p k@e}q%${\fLsOSٮz`n@;,]n/h8n+h}sLs"l Vae V0Xx跂ppv1 >&uESuǡ)(hvnB_64s\)Et1=[[:Ab:- zJu{X7Ǩ? kq |̊+^ /VM"7;  V yqg38;DkBNb^uX&@FE|Hg` "(o;eMF:_Ez@Ԁf7)O ۭpԲ7 v;W܆3MRT|9"(w%5¨Ew 8%oo84?omTFbOw $ S tmY}ctK:"BkRNYb}"D$oA=b ȰcAu d$M>io8ɟGjQ㵼%6$UЍz9WQ]%%刣ʛ P~;LD;R+p5GS ʛ]wZN9^۾,R^qR<=uw+RY>_ȬŹЊRg-$eY#7zkȃ?zJF(-9-5`H!LIJ[)RdP-}ME\- FE|8#}n#"BU:Z[]V@ܞp9L%EqPqI %Qi79݈ NKCmJr a&ՆDV.1ݒ@ksS?6[jLnE4ԕF8[(\V-bgaܥ.r%E_tVWy0_4pM!d|3z/*U^xބ zM"3Lŀ.\=Zt2P9m+НIOC(i: )iC;΋dUI?ALeIt} )N8-lڅkx;=J](HVOs T/ y)6I B"\0y3y`n&o< n($PG H_qOJ2y4)]k@G7PlfC Ab:9L "}Yxv^SDu. JnF:^mGçU:u45Q0H;Pw`/6h4,D0TE2#(ZCݠa3bT&H' 4H Rqom;>dȶ*Ʉ`>IJ2K]9=-lurY0 !! Ł%O wDva ϻ:1FnUw? T`ꨠ@6qt>Wm`;E{jz(U tWhg=5v$֧9AqBAMfCEM*nM>gwC~97AP1 qaGʁOXupupQd*Z"WHAX<]Gn*YnmM\HBӡK]!?X0nU6k?X:X։^hL{J~pLNv'`D;}J6?f|bTsK4.J0"Qp mhҁGCKBX/(!t7>Nq` ^&?k0ï#̇ET¶څ:6dkUK6mI_LC7ktl~}v{`F'B0\l uP&? 'uHtqCFr-6HtܶW8a@ Rp77ӹAM` 9J]yTeMrRg,qus̱cGx0u9O /e`[;Ӟo,L^eAX 2*>[|4>ל ȑQ a,~@T ﮂvW\06q?Ѿ Q{k ntz$Ο0sgsz-҅]]R?O !W.kwPC&nD|ld@LKh;y!Ƶ O56xwa(jqf"ɹB؝CAߎP:U]M|Btm"iH2XC2 lp߄ :mgO?A(p}B\: ٷˡUajemkHhr|`sV ][7ߓ~)Y]<Nn{ wUA4,9"7XqbI^@L%6)֕Lkw3lxrN\#䩳G@F%_.]]4K '~CtExQ`/-@&tPA%C@ևAEdF.!2vE}Gܫq4jd }ܼZXrUlBar+дO.B,,V';mar# A /,MY+WVC *5{iYRdُF2ݗshB1a3LGމ;:C:R4y"a4$Oj-PV@t:fAMc S ,A N: MKl7@xVviS%쯻,\}ΣNO{@r,̅ҕBKP2SJ'jWetdor.jYQe A4 8u%bI79DN~P9)AN8"@BG;H T؎ҦؘE#y>daԞxF[4vz6۔~o_%zO:ppRxTdA4K;0׹˧"q Uz`J~ ]Cw G0ATm1 ECd5bU0& +TlF2jnC@-XFÆ1Jddե}d`[[oM5]d>Q' f2< {euyZZ@q`LAh= L,\#Ø!,\{=n)_Z-5QqAtib48W@A3@517HR8({amU( !4T j }My`Γ#YaڴS>-4BPG3Kr4M12bqv8n9O,㙇C.&cq4;˃N+34J(.ЈkTn cH:ERv8uشJ$ {RD1_S(SS/Zz@4s%ǹxQ>1 Zc xWz71*3Ħ`H I%>mG8k8V}^Nō;,iw ӣ M^n~J`yf(}-![Ipj\( ِ5 &0 T%RA̱#0,p^vz`TQB $XY6h]2h0V7qzEO?ǩn(郝Sn]hSKyq ˆ,$<BF vT LE"k[ϳwJ-TK`S]@=p{xlAZŴ{T:9rzxJgoCv| "`ϖJvyGѽ8oJbbmƙg"hN,QBX* b/T-1 ꏢg-3ި3H BgoB3nmZ5 /83q[:lVzqgm6S-{A͔J] =0~X縿cʼn Q/PRZ͹]rn6vo%_Ul51/7U_֮bYE 'Q2!1_|L jx/]bW!7&*x 8`$5/d^1]_VƄ@6ĿjnCIC!!~_53 r?^܍e1W-Y$q" -Yp^z#^TYD1l+BF\g BMU8@ *`ҖkqK )f*ǯ׾闺~RWv ` Wю'OU_‡gUV?&>\fb,'X[ % 6-^LZrw/vG%nNM6Z:cBf!xFwĺt +ͻ!ôn1k ;':Rz=ϐ:_*Zy*V*J2 C첵Bq5c):3Poa{8!R\w C\wG ɉɗ`M'oPwpV;inVQ$o0JRutz6[-J_: d-xʔBՓuKή㞯Ӆxu}L>AA8m[8?w?Z8q DaQ5}Amʤ KFb ?&HƐ40^ttv!XO'N̖-nFsrxPZN6A\sq(7eKl w\g7\ Cj\ʮYE`ŲXԔOwj}/O}%u MCYf7!ȌaֈHjHz>ۥN#4Rߌ*(DT(H]~<INVE%W$d<խIj_#/Qkq^Dt.(qZ & wܤzr00oDKY9p_QØO&zAtZQlBk+4%ͷ3ErDj=M"yf,/_Ya}cP1i xh0.4-ہSU׽^(^%ܷQrWKՙ뗀r@^b`–R!FPO$Bv[z3,c̔J|3+[j$%V46KdzlR+FZ 6I]r!!3xt 0PƁb\̗9r1_.|/"[N݆ * =xu^IbV[7cG+q0ŘUa}8-b'_K|/qrP%Nɗ88E,"SR\A͗r1_.|/c-b`AJ2we6mc;'WӳZ͙ > NۂVBw+hx:h}m~"x(=g=i,ܗ {uG Nկ"$riE噀[}ҡ)0oq뼂|VerilogvVsource.verilog xYrFíL/3PShBH6VWJb?G8kim/%q-xAJZ|k묤sg嫵󥢻(ž8cm㔄CfRP=.r}EA fႢ)XЪΛ2Q4ĭqu) ǂk~iPrAE߾pA9Jv`At{O08x8Bd+[⼏#}Ǐ~l*wb vsF:ZNhy#D1u0$r_ZQuc,s+E>8E1搩ז}FnA)Vq+9{nJkNjݳݰ}z^S ʻ imz͌>L˻&o]ְ %cxm5ݾA7}\j,ȉ ׵^/ Ld36Jwb<b j@0d s,C82l=2!O | @Lj 2]$|B% b_¸љ RȣZC qA1 'c, /}1/S;(ijIgd`̰8y/%34 1h u9 8(8 `)t1,GaiOɇdTNZ@bJ7\MVvzF'BQ߇lNVX3>VՀ0ʶM06vNUv8O|cjXdCe'Kʑl"@= 6E/ j؇AVvT&b|eݖpmwO_.Hퟵ#<.K 2DZ%ܷ/?n[ hwQk;۟%h P#^5ɀ]6Crth.ŎËr;(YCp㸡ZhGLB*t渪tiOgD,ePTܣHTɧ)RB/j^XZbIZNAq"i֒2F)qzBMUWP {UEmW1B9+Ռш2 uFR%o& =ſDK VʞmA.s$O1^#(ZO0&Q%;/-FT-QI~Yj&WQ"T[=ilV4=d#c\ t֑(치Um92z.R9hp()}#X Zh\N k 2/腚`,Af_ (Զ\(hZirOBsZ/eÙb/CIRt3Tw~VW8^O/:طa6UlN h+G椌b43A9Q"uH T7xzLeZB1Z<>@yYP 1q 5GvHiC]Vb.,ay3s2@yVVV2.ɐ͛a8Po@Tb0#? ȟz;HD_OoOON~7wj:x™:>:7ꇀ}HMjCqtnĜ"GJIlCLnP>[MY#t|ⓤ)Q9rY0(knzp i.GEA" в9D#׻Xz^Zoy;͘=P^3 D0 `C>pͺ6NLXM1ʚ"%1BWH|a+"د=h:EC῁[.+ne3~l ֐7@ ">k|e.xWfqL[=}Ä2J#c!匎m\F^I8|L;|{7)/`RI `&(tw4VimLvimvimrcgvimrc.vimrc.gvimrc_vimrc_gvimrc source.vimlcxڭ]o6nS,E>l/0R JeaQT/-,Qr˵N{|Y>fܓ!~lpy>kh4wtәf:L3Y C 4iBfI"|E~h<<]&#v8,kMvKJ`OH$s#6YΛwͻYP =`lj=~J>9W^4Ⱥ" >hʷ=-kIj*0Z w@Ĩښ\.8ѹ:yf1Dj, ͵6I/ ~=_D)\i~lfk-OLxzvCrzXiٍT~gݎ%V|qh(n3/EsJZ~b 6zĶ+xiV~ui%L!Ly"6mW{U$Gj~NJhdq a%ٰ ~9`XZvayaSVo)(B2G[vzZ R)ՏӐƭXMS{rkk-P=L6 *־}h\Jln](MYM.nl95e㮝$6,yN;AIQVy*W,MT~.SΔg 8C4`7|]7I%s(qi}&bG}oر!rI%"F,f`O1\.#xd(ċ}X>;*!_]ǚ;?oDcx@F`ϰRFɆ wؤɛx70#{.Ծkobmfg}}sC1a`Z4&rĂ\aV 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<>/''"]|/(?!>))+Kx]i{4i8m-EvIJ%ʼn6mڤ&w8c 9YptK-]ns/_3!&) V%q:nxVyJKFxN Cw%[rCIW@Cz0P9DTs.9D #i(r #rQ9%B8DE^@̲6}' NٗnۀP;IH&vf&!Չ;IpJdb3[4>id-g 0B&^i֓Q$ǒ3Gp3 i#[)+Ɲ`!N@ݚc*q^4.)f/NX)A*pnq)*'0Rl!+ޒk+!;,G Yed+؎jpR{-8(SzDX]Š$Ӂ/295%YMx6#М*a ;v _$N;ȗDQݱL=eBVWRI ?U=1 A]1!1> o-Qp.odHuд:y GfDDRk*ƽ{4 I6B,+L׃wP2 ,RlJ^K4{XU'H 22{Pw샦-z|<.)tiL%IT$'^?DlfŌ) +hN]u@]$O LjL_c%:1oZ aBoKwyM`}`]Vh'J2sik:G6Y}D i4OQvv?5:~:Gƞi)IdFsIi~CPTd&Tc*҄"10BS+z 8Fn3-o%x 5xsÀW~V8#W !@~/HeKE 9JLjkq"کfwdj12YoHgy5Q/F3qdxCR 2&9&:tJ&ctbdcF $cBY%M1QS3qdEjD ʳx8sH>fF\w4R EH9D4# -k#បEU)зwR龠u‰Ey}F=V.ID;Rs}@+۴)حMu Ͷj`>E&yOT@αBc!CnGy`=Kl1Ȝ?I*M%?KldP^V[7v /-'>ClGtBT9FƷT垸+R}וH!aӾ6]X,=LOҚ_MU­}֐QnT?w*W$ӣLL2> K.I;RZG$Ǚ.mM6+U'2XcnMSAY[g':-1F%DSSi6a `tp8BL*& s2WdHi^z݃96j @zhZútX7-&Dzef`X85d,ۇfZn;MPd9Mhu|hulµ m u`[wѿrhClTQk~uVd П}m&>0^ w 2NF]:oB?*@#50בpF۽} I 2!3hW:T7n@[*Eg̗MAĵt=U؊0}hZ#(jb._=*;WkAqEC A V`O^%aF^FS'>e?&?Ï^B;FvC$nF'X1$ХMY" uz:6뺲/Gƀ}W4ݻW[(I^қnAPFh=JbK9 u0@a}^ؗz !^ ,9$%wEMaJֻS8?g'OZV۞1|]hXfo&d_[Y(jR9S6g9. =K,||)Ƙ~R9s,W+ O~#Q&}e2FMgW/rߜd.3ʛj/ϷXFwQhrl;~ReDe*H{6m Wb^0|޹Z-^\|rw%̍T-al;fh6s1 *ahe-9rU- J{qc~;-~0cД1J4ċ2#[0:P#Z0oI= 5ڷ32Y/w1vq`I񨌞žPq"Y,䊊2Z M | yN(O|C6Ps}*W&؟*ge rXf:{[ۣm"aAoل_$?GkI$?QsSN Dbc;zl; H e-lOm%c$%E ѻ6 5`DL6-grn-OmT~QOkFv&*tȺcm߆Iw1uB#A٬xxf+0* $ƫܓ]Xb-\">*kzS6^Ǜ:R%rE.Oq6mj1qknF|[3ܧB!eά[f~ ۬Wק{z8vaD"^[]k?p8*深g跂ls+]Hi3qdDY7Q冨a}S늤.{T_UzHfmkoSׯ gyUvBf?V!?JmHJ'G_[xm o zO_`QabT،¦$s|c-nG v[R/Hg+82tj[j9\MD)/k-ˊ5V/k+B*۔y Dkϗs23ɑ rN/W\1>ڙZigzig source.zig xZ{sܶ,c'8%YdwNKtN ɃN+e^v]Ij2y|.݅fa0r=mω{N(HnRO-ݡh\|>)M<ÒZq}MNg$afGt{qRR(_qyZ2[dLC%1Ggh#>#)$[s ,MP4BkPL ?&F\-<)8{$0 D\xNlKBAJD sɂ]ψIxC4uIA3&33bzxL,=)*"%쒴>$d 6ѯ$TZpNˆ!-)Jd32&$$=ax.Qx4 ,nDV*0'ǫt6 KOYΎϋNOw^VgO\$8 {*q޿FÁubxZ57UoNi.KYZnMl!9%  2g;M;Ii`TZ|XjbZXJP.eq KxN3 UApۤ"Xn~-UOl_WՕ_5;%z"P0Ac3{}Y/58^nBwp/xg|Mld`[aR09*/qS-4*ek:brcZg/jQ8h*&?,(@4 g/yce Bm4Bvy$-`2/I=`b;OvYV{4vcߎ`F<2K0+J{ =X?Yh?B= )D {ajwKPU[[[~.F?C `7n uxtq@ ^6I"|h12,Z_`"a hat+a=u"5 A$r ]Z  &`M$l~_mݤidlR5;^`Go{}u 5ejÏpҥWX/XH9:̄zK&Y5~ҁ(SLI~wwb``4ɇB !S3 H%)qy@IUE(9$.OJP! S䈢0j rd#u|QԊ1'v!խi:xhƟiW4_jiƿЌjƟkƗ5_k45w5㋚Gs}ZH#![1[Q9bP`Y|`8ݽjCqu^5=xfZnQMA'utչ^)Crvy8:&:RKdqiIxd5ՉEߪNVB(m)Ya}`Mdfضfzt{ ؗ!)j>]P\_om<,_GXoiޖ}rPv"d㼧y@gS %0dM%4;r-9ib 8]bH9% ~#qY/xA /q*=ŮM3 =bҁ;ޔ<}&pt%/Rҁ!A5|.SCK)P aGavp}NR(pfs⤭ƨdR%ٱxB,QmֵP5ra[݅#}CnT`pkù&8 )Ǡ_"+*Qa7p[]Z-߼{{[lc!7ց5.x ʱ\X . :#8PBBn"4rb4f;^rHSv յ-ꓯ5<o>P8g"?mNKoU[oPy{Y0)=W\(3RAr2!Nɺy ΜdLPT›DRm~.+=RRF7Ƞbg@eRuKMԀje MANԁ4~{9ōNg7E]e$qIqa89e쇰S?<Шnt:.p8E$ؒu(§s5PXbbSoZ([0f۽Usgk3|rXCzC*:)Ʀ<dpڅ+f@|L 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|\n|{{single_2_space}} lookahead_40 (?=.{1,40}\n) option_break[ \t\n,=\[]Wzw,c&av>a[o;#hCS4gMOi{k'yp)Mt{,ٰ}ưXgXfO <kiN~lkSa F/4u=`x2l- '^֭([l][ U\<<4m ٰm`tHp,z۲a*gn5o8M1y!taĐa{7-MClpy+@q; (ppAsSj~/8n:ܾbSj0z7lm8nNd[.ϡXS&zAMQsql\|Qy $١S(㾄O٤ u\,z=#ҵ:|s]\cZC y\t.˼G@%a2Ks i<ؚw`j-&yi7.2Kv,l2y.#lL,=4Ҩ,oY,e*#dCAq:F[gN:8JW=-9q"JQk$Wo{3j/![1KO)tVK<($+ ddOz U)0$.I 6Q~ aMmDޤ;AVr݈C2rr:ʡ $ʭҲ,'N|63PoЌ(P?_#SN$+U@rYΗȄ>K.pJ2l-9l*? yz-=H=M t:m4Ae }9xf Fj\-`T"5 " ;u9Xbby~ XQɰ!YnH%i>]i,Qvi.eJw*29?I)AlOi8m|bj)L Lpm'-F<ˎ2nd(TF R^CdCh]'e'Ѱa#617l;R'um[^1E!L D3H35a8R{~ ADgAL15'Pl%= .jzEҠoDIh/ d\ʤ(KW ,JJ0a%P'-4{)Wi5^8Iè%\Vϛ(VSvaMA-ƙW6ݳjG¿ODDZ|D'L[) 7g%-ٸZ>&‘ w"XZ: #ZnK5$'H8sg憾8w5^P1Y~Y"~}2YFݡ|(v2iEn4&pAQո hL3e u_X-hV{T%٘,ZM8EךVP >W4kF# d#l(HckzNĔ}r-JѿXM`zbnA@=bժC|{/Θ/̶\w_kJ"t9Ƕ+.7^a,v gnuplotgpgplgnuplotgnuplotpltsource.gnuplot xYrܶ8uθc:rH%NJFMfIяNEYŒ]xI&ArϾI"/ЇpԮ$gL8@spn^[,E axgΖY]p.-ǹp./ǹpY\N.3Ǒ(z1 Y9&Znj dH&{-KZyhfom R)y-d !}dzg*E(LjFi,JcզjՖq´إ">t3ԧ=םgݽs|?jZ(8.c82!IAl^*'.zuHxB. dkKvv+EΉr0\]y%,N]YశK-r/!SL{EP_O57k7: =vԮ&CRƄMm=K٪pt-˧Dɼ=4"Y&ƊR@91U=j4Y$*I,U! E,2%\GE4d T4Xt/RQ$<3 ABjȢ{Z(s6"'Iكh<X *Ff&$٨BiaBTo"Ǣ"LD~)W"cM2-JAYJ-TiR4"&Jʌ*Y'pE,q^d}iH(YBaIjzDJ`0:V2 jIĴe5(M;j~ڤ"mW랛uP6oœjHISG\Yf$"Cټ!!չQUs3e4r3b1u̺X"#\Q4XJ^)7Qp;W1i4YZ|!.]hQZ"99/ܿ3Ge_čfE weesNK(1\# pN$nh!U@3QC.$ b cݾWƟ &"Q/"JC\Gڋy*+^-~Vc" ]Dp&MpM:r Xݍ6Zy6jT$dDq^)pemƳ?55z|+\ϲ}bG=QOvuz?U*XW3z慆/Feq#_Kl^>WQеܻҋMGMkH`;M;qI%˪lm"[^v]I~]v؎e6릱{D8 a{C7˂ Q t:l%E繰P6 jW;nS1"#?$χ ·(5.I ׋a{CmZvR S\iv+B*:̈㨀p5W댫lm5A2 Αܺcw7훶 Myn3zdÄw?~w =b 55ja"kSy̺h‹x7ǃxy`P}UFT k  ܏ go |S`|QjG}֘n,?IJW¶նu,Tτ NCp= }4U̓h>VU8G<^Sʡ\,/q\CuZfO`KRE{h BA9Z!Bh\䚴Wᱢ,-ɚ7#8Y+GBUwR:2RBau qc~6bpN 5`֖*kd~OƱ&'qІ޲~g$ӴsKXMΫWIEiER̥[~$ϤTΐhxz6!>-"?w6f7ŕ3NB و炘ߋ,4~TA-n. <(A3QÈtzw7VEMy%rcH 9&>õ w!%rM &ȵ`@G?7POkVsW;jZzW[%gլEnLnl3?g*Œa' D]+fJP8{3pD1)iC\|2bOŰ/6|W3x3x ͓U/)Z:9muR?oxO T oUb\C;ǽC=F1SnBKz -8ʥo#N֫YK |9uIH>eb/#-ص];Ia_帧KE#{ afOƏEk츱W_ϟqf4U]Sχ;c@U ېV2D)տ)'jDv lp-9bM g`LLHY`yKao3Ym:c63!nV2ɫLsQ}POF[IP:( !uY ۙ-|ʐjFG,OjݡZLLJ )gƩfw^>yy>L:lۇnIZj}2 2_uU-ʮ.wcg9+9sxVo:q^>/]hBMN?CLaa+L2!;#%^+t-fV!rQ;WkzGnp'qy}yobB{ɗ͚cqnfԍF61;O&Kk%GE33:p'Cv+wZs?!ǰQkg},L77ʇ%n|= SOv}"Ke:TK> y*[_ '?9T|S8V @ߵv&.uf;q%v|L*f!,>p0C;Highlight non-printablesshow-nonprintable whitespacefxڵJ@S+ z| vģa#e6KݰP=;|<)ݭ1ݢ8|fMbͰٌ#gO)26]3\5,=wJ5z>P PΏ6g6K|h0͒DiLrJ4T="LȂdck>7+=4J.i4[rۿϏVz`؅~OU hJ;\@-i@8G(;~ZBJXwgo@-M/,YYt&'_ZrX,-V::(⇌OR5 cW?&{~ ?˖}~lo̖:IϏVe[yHH$QB$I؀G %u5NyR2 @Lu&!@F&T(>i/u@Nzl tb(qCW@$@@)g}N,3a~j^wg6c<@g\@F!` ۫u^yzq`.վߺmmm y tׯߺNuG霸}K -&KHj]km#h9wWȴC)?b! aR̴.#QD8r_<`f@~P- 8+*" J.f Known Hosts known_hostsknown_hosts.oldtext.known_hostsxڭVN0NmbW c4 uєMLc5CwFکiqbs>K8+3 "hj=a?űϹqWqܚb~3@Xnr{mwOӘJ pxcb'1-WSGn-߲ErV{5N0Dkb3ȁؗԕ %Ab80BM*i1spA<aG< *ʉ|v og%W l(|el5*sɽT;7 a0̂e սS*azݾ]W }PH8O"[kWqT+ ^CY;3JGZy224>8eZj;ѯQCP8g[ ^kq4pڹx3j;k~\!]-2NbdHZ35 l-E,oM( @3[f @E9P3PXڲ.8֮,ޤAte~(1 2*|N1a@ME`BͶKʃ(>9k Private Keysource.ssh.private-key#^-----BEGIN [\w ]+ PRIVATE KEY----- xڵj@3oM7e)]J4)H)EGԉff7Mm$@WS4TexPLB@1EJ!.zt=2 wV8TqC?AR/m.EUJuN5I[wSu~{mYpe SZ$Ss+H~ SV?Rxud# Ҋ|Ğ m6e4$,Jx 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])xZnDNPVhliko\UQA BbSIkm>9Ixdȕ<Ԧ4l G52= dC#1A1۔i~3&,\PF}F\X}9̈́l # 9B*\eUcx+->R) jgQ 9>2kEFfY>lD?]|K5sݟQb稫y{t@Rs0Y I<+!kܠM)IbVO&3)"gp.U!$p\xd1#Ųvo)[CgF G珢3Y j3^XZ2|6 /\ɏ֤;ymac$4\7&oC :ZP8ے|d}ܤ;%V2-ρ }ܭ+f5f$V+XVfm@;U<4.$Ky;!C9KUs,p.$W݌ع A ܨ}^sk{T!yhk̯@ k35O} Cd -$;JⰨ)toIOkaq J}=䐰N_¢RU8PjSU뇊\vvhd s$e&8bG,[A5'Qٛlҡ}}`g0- K="IgӃ޿&\x`$XDWsL#ɂ/8V>eaPkT;&uN0q@B&80rU?;Bs(j/nO*hjv3E ۫ocQ2;ٱ̎ev,cFv5蘇S X^RKvˤ]&2iILw#iӓzcՃpuΨ5tuΜQT&.?~Яa$gK\e mn- ,ywuzbܑ\S;V^VJ1yx>~tWMz-~] g,0*׌keuz^}w,UzyށIvT ?Z̋# SSH Config ssh_configsource.ssh_configL xnFR:q&i2~e 5W3lj#FpkȵDZ|Vs?$Z8(HH{fgU~^@!DZ1"C4O+֘%Cj!tYt *7})}A? 4Lspc p}D!Ga3jglFO3bZ\NΗg1[q9' j93k{.O!6S]rP Ft}2l&b`ٛ*yT . 3]l#dT" zZ0p-=܅&AmC j]YİCgH ^H,iȶ?\_@U ɰ<Xg5,7//yg05oLx{4qbEbp&pZ! 1ǂ_ F:d߼ - > 4HT),5絲"hwsSP\ZAVʡ 緊v*8Ee6,]ds{$O~Τw:USlA#AF.mr.E\jf S#_"Nj`[fisU~Rux{jUO}1sĐA7L|`8L5\up"RQ;/13p;4){=l#jd$>sP͉@%QMmҖٳlzo=(g 7I!|>DW 3,4V 3d8H26dL#TLE$MaI2<ש2kP> ~11 ]Hعb};P6VeT!gfrzwsijHͼ4V&=EUq9Hr>(?BdV&s 8<;m$fŻwA`8(/;ܬ# }}|Te3 zp|E#e!'y&̓(5 }pmA۴tlOwWXkNl#=Lo~ 8ڢ= ~Lx!ym9}þO<'|%.C>F~9&t혔kb;t./ 8ޚ*jaoo.( <1S?"ћKMJV`-:&%6Ȧd2] j' =ô* c ~vr bjD}VA@X|YYP[VYTp$Y$aA$qK骥n#}g Al|T#Y([NT^AUJ jx̣R`?" XfX*^˲x+O #$L؄ >ϔޖ"M?k{TƖW%u XR_h8#[i@(6Xᱝ.M,\T[ [/Kg%6yM2~E2>'.k۬SjhT9V%6}餀k9)LlTTv'(f']rZ(~<{q хv( {սmAރ@V`X\98% .tlpUe\ $fum W?FqQVߵ:zX6W_(dUE,( HVi %))=+2:heF#[)Q '+pӂ. ib1zHd$8z!:o9̆N n$H[圖=Rg+?8S HnnKI%Ɣ`8 Zvb[Q0xȮs&Kq~ZEf30 0K墍t2Z2Cw?|ɡ4X *kģʻC'3 .Jj>J^VH'RE©K]$8[D<]rveY #j%n9Im>.bkQE+z| /QZqE2^&\2~g Y&ʍ$!,F8F, :A,-.7d -nLb9rj$^n ׇz6t SSH Cryptotext.ssh.crypto}xڭXnDiK B !V`cJQnr $0]9Ymlo+%%5ό#Ŋ2s;眙A|R?8a7ε"aNee *s\q^)j|̸i$eHb*5t~I^'; Qg |R {%ǘ }bn-J!j}W.{[֓aΣY|Ve*Ju}EHs5ܫc=r ,'@-tsqcZe 8uua# hRo^~uqyz7W9t*7K|nycnT2f:S;RsQu68|tyJa@თN)Pz$X(ʁ?]8 H 4F HbNj(>`SZ4/^V+z&n8J2u ̏BlI5<_jVeIEMt "MUKY*f\( NlrNɨf spP8اN%[[Mk6* 81 445 5_zK84o臷N{Nfv?'\?릉f y:da_/d2-M瞿XVV6N9p.1 id+sȔyOSt2RkLYNLMG Ծ UV۪&0O0DkJՔ\i f3s 6@b4u3]f+~ #<4D[VJ3:,ʼ˻kgo쌗g,Qf, %]'Ed|io,խڪo'4\"Ug QM,sN-E3==NﺮvS; uDsz/ޕ$+P *-` L,LMyڕ;c"RnpVCkhSM6vHjYEvJR$ /!GK  '#(e.tMC"6@dsɇ3٭ё.in.i%DD׉m aV i۸_J%W/In}wHZS4ZK Y `0ڶoƪΠwG܊ot=&?եYU">44DbI.ik$zB__"l PCʍ!ƐdHkŶ@7xm֤ӎ5iCgz^_weo<3g3U:X;x'dz@$:qaRrLϬ^.~MK~?, 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 )\b7xYs7Ci!+R@)wq~Mg LgN8d]d-mW$딙Y}Үu64?t:"ۧ>+%ύt|({1|J'+g}yX1#\J3CLqD* )"S=>(}9fHxǨOƇ|Tg=%^uq"a!Ifts9sI,p,W1~H2 qqdup[nON:,0Ĭ۳jƈێUij }q:Hhz ɬ {N*P\x*'CZ|Cj}2,[iZN~~M}ԏ áxAe#y I0j*J}#Z,:BvʗC."h<X=/p!Rb|n&XD~>,'\M( 5$ Qe(HnC(Fc.#qgՀ1N" i$Ҳ`l7YL:i)B*ܔ8|I 넣A-`q^}(-QWdK_"Ф"n~ؓF4Nˈ'9ށq1@\{ >x7 1 `q+b6ئb4q$ȾbR30|=q(6(;bX7y(q¸2FSI(#m/{DّVI[4u=0n.0MSGn!/A7#c^7!֌[&[cZ/"XI$UPhXј08kmv:Z}/{1$JrD;Mmr*.bq%!yb‡_L0n};țt|uw֙/2q|p.`' E7*M ?pio(TIRl1 > Dz;G"ta5:;`MWA ?ڍ-=D.Q4[(S?+wϞAm4XH XU޴xYA$SpW%rfT,P VP3jYAP.2GU8ciGpV- ae\;ٶ?3l)J;fiL=k|O>:גhm!:2J}1PW__.+z? R:ԌwQ-D32}*W㵯*FH(5|XqoL\ľ9g9; d]gCrŢT2AN%0?5?V縓' qcs_7ivD߃j7+̅)0.^?Fždj[&G]ՠA =2Y(hINZ'%˥Ӟyj(Lm<֝rّ]ub^ʱ'dtUr@mJ;bwuJ}*c) 䡭=7=a 3lE,F侍ԨlɟKaLPgx6]+eV[ӦcꈓSof":jf .{;z##Ł(lʛ_y 85_ɡ/;twЯo/t󼚧(`Oܝ5Ż?nP۴w.oЯX&ަJ%ߧvL;mT6]s7y9Ob?l[8-էsgky4/~o_V 8}7#3VCu)՝%VkN KͬPQr v.+~YVfE\Tҕ҂>kոU㴳~'$ [θCpUf2aqsۓu2vvi'gyf01 |G>9á^[*gXgX} t;[#q{M[Rט{(co^syslogsyslogtext.log.syslogxڕUK0nܗT]JNJ…cVNc&N8[?+k'qܤЩo>\wFtpxʈ;v1ˏ[Ҟ9ËzE'L%m`?[ I`"ݜ^oe;ɑeNe~0jN]DCJ8SUbΙ卵-G5j9jv!;1{DSP±-Dp_Ի S!a *>cjDS_4 hrcA䉉fiOW+4#٠e%%jD/ӭwmx>;pU@3 #SN\^u)HCZ t^Um=n58f7JE[奊/g٭ʻrKBokb>01n!A6̂u~Qa1\}ytȩ~wIuhF)pJvarlinkvarlinksource.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]o0MӦ=2}$J_$BN0ld&&_VC_V^x(f*S"gyv!nR1dɦ/G(V=paN X,y>x_( \X]ZBru?%C,/$_Kivӟ=|pC3 b[6*|ْ'Xgd[Rf >.`}TqXf-pcΖsaNQEr^IqcL*Ovl4o GN00r]%q)#YZ};-)`s|nɰ%.} jK|:ikfyTR ꥺ^WAI©5,Я}n:st4wM3їх .]gǾ][ؽއpg_:fl'{=2$,#tw81[}`a =+2@ؐly@>WGSLwgsl source.wgsl1xXYs6č8Gdzi"*8ikZC֧"(P"UVܠ?OY]@ 3Xj |X,togF`DSgewnÃ@^eo\S5.&)S:\4aJwW ." f+e+py7<2C\29^G ЌZ!jĕ₈]z9+uG>EʼUE9fl"7_|;Ҹ]yu`sݮI]UJ0_p=!)2t eBny G31rqq#FUi- YF_?ߨߩ߭Vb2#_NEl5cj(|K,vq>=uܿҲ%ou3j:p󁼌#YU PF41JXRu'\BK#DSB,})jDW.]A1V=Ohi:bZ={a͉mH_`wNrzLԡ4wq6!-^T3.)7 W=$Yd}i])”-Bb:ݜJK  U 1P\ľ{ J?WlCǀ=#l >T&GS8Jm2lJ&(`$]9VQ(Bfľf vE䏶70%)0v̿((y j }( x-᪇$ŋ#mIAc!1ŭ"ɣ$4^XLʍ.LdL5 As|LNOyéjk+ n9PǖW0hn ( M,bXm" V[`%?YMk3GhYy&%+GCTYzPt`2MBj$*ͣ4|mQu}1p<%<ᡭj X"<2QiD o Ү եH:k(\mqv8)ff[IINJ|Zul*nNR.ߜ-oU(l[야FM2D~]r}qRi@#u-KVir!(fܐ Jpw;$ۑM{${/-A~(@Xddm'c֚xLZ Ӱ֜li;o.&]r}M7zp. Bor#"L"7Pp OO}w7q.N/DNq+y1UpNӂ 6 8 57w$]p-G\R/RqOm?H//home/martin/src/bat/assets/syntaxes/01_Packages/ASP/ASP.sublime-syntaxM//home/martin/src/bat/assets/syntaxes/01_Packages/ASP/HTML-ASP.sublime-syntaxZ//home/martin/src/bat/assets/syntaxes/01_Packages/ActionScript/ActionScript.sublime-syntaxX//home/martin/src/bat/assets/syntaxes/01_Packages/AppleScript/AppleScript.sublime-syntaxV//home/martin/src/bat/assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntaxI//home/martin/src/bat/assets/syntaxes/01_Packages/C#/Build.sublime-syntaxF//home/martin/src/bat/assets/syntaxes/01_Packages/C#/C#.sublime-syntaxH//home/martin/src/bat/assets/syntaxes/01_Packages/C++/C++.sublime-syntaxF//home/martin/src/bat/assets/syntaxes/01_Packages/C++/C.sublime-syntax H//home/martin/src/bat/assets/syntaxes/01_Packages/CSS/CSS.sublime-syntax P//home/martin/src/bat/assets/syntaxes/01_Packages/Clojure/Clojure.sublime-syntax D//home/martin/src/bat/assets/syntaxes/01_Packages/D/D.sublime-syntax M//home/martin/src/bat/assets/syntaxes/01_Packages/D/DMD Output.sublime-syntax J//home/martin/src/bat/assets/syntaxes/01_Packages/Diff/Diff.sublime-syntaxN//home/martin/src/bat/assets/syntaxes/01_Packages/Erlang/Erlang.sublime-syntaxU//home/martin/src/bat/assets/syntaxes/01_Packages/Erlang/HTML (Erlang).sublime-syntax[//home/martin/src/bat/assets/syntaxes/01_Packages/Git Formats/Git Attributes.sublime-syntaxW//home/martin/src/bat/assets/syntaxes/01_Packages/Git Formats/Git Commit.sublime-syntaxW//home/martin/src/bat/assets/syntaxes/01_Packages/Git Formats/Git Common.sublime-syntaxW//home/martin/src/bat/assets/syntaxes/01_Packages/Git Formats/Git Config.sublime-syntaxW//home/martin/src/bat/assets/syntaxes/01_Packages/Git Formats/Git Ignore.sublime-syntaxU//home/martin/src/bat/assets/syntaxes/01_Packages/Git Formats/Git Link.sublime-syntaxT//home/martin/src/bat/assets/syntaxes/01_Packages/Git Formats/Git Log.sublime-syntaxX//home/martin/src/bat/assets/syntaxes/01_Packages/Git Formats/Git Mailmap.sublime-syntaxW//home/martin/src/bat/assets/syntaxes/01_Packages/Git Formats/Git Rebase.sublime-syntaxF//home/martin/src/bat/assets/syntaxes/01_Packages/Go/Go.sublime-syntaxM//home/martin/src/bat/assets/syntaxes/01_Packages/Graphviz/DOT.sublime-syntaxN//home/martin/src/bat/assets/syntaxes/01_Packages/Groovy/Groovy.sublime-syntaxJ//home/martin/src/bat/assets/syntaxes/01_Packages/HTML/HTML.sublime-syntaxP//home/martin/src/bat/assets/syntaxes/01_Packages/Haskell/Haskell.sublime-syntaxY//home/martin/src/bat/assets/syntaxes/01_Packages/Haskell/Literate Haskell.sublime-syntaxJ//home/martin/src/bat/assets/syntaxes/01_Packages/JSON/JSON.sublime-syntax ]//home/martin/src/bat/assets/syntaxes/01_Packages/Java/Java Server Pages (JSP).sublime-syntax!J//home/martin/src/bat/assets/syntaxes/01_Packages/Java/Java.sublime-syntax"M//home/martin/src/bat/assets/syntaxes/01_Packages/Java/JavaDoc.sublime-syntax#T//home/martin/src/bat/assets/syntaxes/01_Packages/Java/JavaProperties.sublime-syntax$V//home/martin/src/bat/assets/syntaxes/01_Packages/JavaScript/JavaScript.sublime-syntax%l//home/martin/src/bat/assets/syntaxes/01_Packages/JavaScript/Regular Expressions (JavaScript).sublime-syntax&M//home/martin/src/bat/assets/syntaxes/01_Packages/LaTeX/Bibtex.sublime-syntax'P//home/martin/src/bat/assets/syntaxes/01_Packages/LaTeX/LaTeX Log.sublime-syntax(L//home/martin/src/bat/assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax)J//home/martin/src/bat/assets/syntaxes/01_Packages/LaTeX/TeX.sublime-syntax*J//home/martin/src/bat/assets/syntaxes/01_Packages/Lisp/Lisp.sublime-syntax+H//home/martin/src/bat/assets/syntaxes/01_Packages/Lua/Lua.sublime-syntax,U//home/martin/src/bat/assets/syntaxes/01_Packages/Makefile/Make Output.sublime-syntax-R//home/martin/src/bat/assets/syntaxes/01_Packages/Makefile/Makefile.sublime-syntax.R//home/martin/src/bat/assets/syntaxes/01_Packages/Markdown/Markdown.sublime-syntax/W//home/martin/src/bat/assets/syntaxes/01_Packages/Markdown/MultiMarkdown.sublime-syntax0N//home/martin/src/bat/assets/syntaxes/01_Packages/Matlab/Matlab.sublime-syntax1L//home/martin/src/bat/assets/syntaxes/01_Packages/OCaml/OCaml.sublime-syntax2O//home/martin/src/bat/assets/syntaxes/01_Packages/OCaml/OCamllex.sublime-syntax3P//home/martin/src/bat/assets/syntaxes/01_Packages/OCaml/OCamlyacc.sublime-syntax4M//home/martin/src/bat/assets/syntaxes/01_Packages/OCaml/camlp4.sublime-syntax5Z//home/martin/src/bat/assets/syntaxes/01_Packages/Objective-C/Objective-C++.sublime-syntax6X//home/martin/src/bat/assets/syntaxes/01_Packages/Objective-C/Objective-C.sublime-syntax7O//home/martin/src/bat/assets/syntaxes/01_Packages/PHP/PHP Source.sublime-syntax8H//home/martin/src/bat/assets/syntaxes/01_Packages/PHP/PHP.sublime-syntax9^//home/martin/src/bat/assets/syntaxes/01_Packages/PHP/Regular Expressions (PHP).sublime-syntax:N//home/martin/src/bat/assets/syntaxes/01_Packages/Pascal/Pascal.sublime-syntax;J//home/martin/src/bat/assets/syntaxes/01_Packages/Perl/Perl.sublime-syntax<N//home/martin/src/bat/assets/syntaxes/01_Packages/Python/Python.sublime-syntax=d//home/martin/src/bat/assets/syntaxes/01_Packages/Python/Regular Expressions (Python).sublime-syntax>L//home/martin/src/bat/assets/syntaxes/01_Packages/R/R Console.sublime-syntax?D//home/martin/src/bat/assets/syntaxes/01_Packages/R/R.sublime-syntax@W//home/martin/src/bat/assets/syntaxes/01_Packages/R/Rd (R Documentation).sublime-syntaxAS//home/martin/src/bat/assets/syntaxes/01_Packages/Rails/HTML (Rails).sublime-syntaxBY//home/martin/src/bat/assets/syntaxes/01_Packages/Rails/JavaScript (Rails).sublime-syntaxCP//home/martin/src/bat/assets/syntaxes/01_Packages/Rails/Ruby Haml.sublime-syntaxDT//home/martin/src/bat/assets/syntaxes/01_Packages/Rails/Ruby on Rails.sublime-syntaxER//home/martin/src/bat/assets/syntaxes/01_Packages/Rails/SQL (Rails).sublime-syntaxF[//home/martin/src/bat/assets/syntaxes/01_Packages/Regular Expressions/RegExp.sublime-syntaxGb//home/martin/src/bat/assets/syntaxes/01_Packages/RestructuredText/reStructuredText.sublime-syntaxHJ//home/martin/src/bat/assets/syntaxes/01_Packages/Ruby/Ruby.sublime-syntaxIK//home/martin/src/bat/assets/syntaxes/01_Packages/Rust/Cargo.sublime-syntaxJJ//home/martin/src/bat/assets/syntaxes/01_Packages/Rust/Rust.sublime-syntaxKH//home/martin/src/bat/assets/syntaxes/01_Packages/SQL/SQL.sublime-syntaxLL//home/martin/src/bat/assets/syntaxes/01_Packages/Scala/Scala.sublime-syntaxMQ//home/martin/src/bat/assets/syntaxes/01_Packages/ShellScript/Bash.sublime-syntaxN_//home/martin/src/bat/assets/syntaxes/01_Packages/ShellScript/Shell-Unix-Generic.sublime-syntaxOh//home/martin/src/bat/assets/syntaxes/01_Packages/ShellScript/commands-builtin-shell-bash.sublime-syntaxPO//home/martin/src/bat/assets/syntaxes/01_Packages/TCL/HTML (Tcl).sublime-syntaxQH//home/martin/src/bat/assets/syntaxes/01_Packages/TCL/Tcl.sublime-syntaxRP//home/martin/src/bat/assets/syntaxes/01_Packages/Textile/Textile.sublime-syntaxSH//home/martin/src/bat/assets/syntaxes/01_Packages/XML/XML.sublime-syntaxTJ//home/martin/src/bat/assets/syntaxes/01_Packages/YAML/YAML.sublime-syntaxUE//home/martin/src/bat/assets/syntaxes/02_Extra/AWK/AWK.sublime-syntaxVX//home/martin/src/bat/assets/syntaxes/02_Extra/Ada/ada-sublime-syntax/Ada.sublime-syntaxWD//home/martin/src/bat/assets/syntaxes/02_Extra/Apache.sublime-syntaxXF//home/martin/src/bat/assets/syntaxes/02_Extra/AsciiDoc.sublime-syntaxYL//home/martin/src/bat/assets/syntaxes/02_Extra/Assembly (ARM).sublime-syntaxZO//home/martin/src/bat/assets/syntaxes/02_Extra/Assembly (x86_64).sublime-syntax[R//home/martin/src/bat/assets/syntaxes/02_Extra/CMake/CMake C Header.sublime-syntax\T//home/martin/src/bat/assets/syntaxes/02_Extra/CMake/CMake C++ Header.sublime-syntax]I//home/martin/src/bat/assets/syntaxes/02_Extra/CMake/CMake.sublime-syntax^N//home/martin/src/bat/assets/syntaxes/02_Extra/CMake/CMakeCache.sublime-syntax_Q//home/martin/src/bat/assets/syntaxes/02_Extra/CMake/CMakeCommands.sublime-syntax`A//home/martin/src/bat/assets/syntaxes/02_Extra/CSV.sublime-syntaxaC//home/martin/src/bat/assets/syntaxes/02_Extra/Cabal.sublime-syntaxbJ//home/martin/src/bat/assets/syntaxes/02_Extra/CoffeeScript.sublime-syntaxcE//home/martin/src/bat/assets/syntaxes/02_Extra/CpuInfo.sublime-syntaxdM//home/martin/src/bat/assets/syntaxes/02_Extra/Crontab/Crontab.sublime-syntaxeE//home/martin/src/bat/assets/syntaxes/02_Extra/Crystal.sublime-syntaxfB//home/martin/src/bat/assets/syntaxes/02_Extra/Dart.sublime-syntaxg]//home/martin/src/bat/assets/syntaxes/02_Extra/Docker/Syntaxes/Dockerfile-bash.sublime-syntaxhX//home/martin/src/bat/assets/syntaxes/02_Extra/Docker/Syntaxes/Dockerfile.sublime-syntaxiD//home/martin/src/bat/assets/syntaxes/02_Extra/DotENV.sublime-syntaxjK//home/martin/src/bat/assets/syntaxes/02_Extra/Elixir/Elixir.sublime-syntaxkO//home/martin/src/bat/assets/syntaxes/02_Extra/Elixir/HTML (EEx).sublime-syntaxla//home/martin/src/bat/assets/syntaxes/02_Extra/Elixir/Regular Expressions (Elixir).sublime-syntaxm_//home/martin/src/bat/assets/syntaxes/02_Extra/Elm/Syntaxes/Elm Compile Messages.sublime-syntaxn\//home/martin/src/bat/assets/syntaxes/02_Extra/Elm/Syntaxes/Elm Documentation.sublime-syntaxoN//home/martin/src/bat/assets/syntaxes/02_Extra/Elm/Syntaxes/Elm.sublime-syntaxpI//home/martin/src/bat/assets/syntaxes/02_Extra/Email/email.sublime-syntaxqG//home/martin/src/bat/assets/syntaxes/02_Extra/FSharp/F#.sublime-syntaxrG//home/martin/src/bat/assets/syntaxes/02_Extra/Fish/fish.sublime-syntaxs_//home/martin/src/bat/assets/syntaxes/02_Extra/Fortran/grammars/FortranFixedForm.sublime-syntaxt\//home/martin/src/bat/assets/syntaxes/02_Extra/Fortran/grammars/FortranModern.sublime-syntaxu^//home/martin/src/bat/assets/syntaxes/02_Extra/Fortran/grammars/FortranNamelist.sublime-syntaxv\//home/martin/src/bat/assets/syntaxes/02_Extra/Fortran/grammars/GFortranBuild.sublime-syntaxwU//home/martin/src/bat/assets/syntaxes/02_Extra/Fortran/grammars/OpenMP.sublime-syntaxxC//home/martin/src/bat/assets/syntaxes/02_Extra/Fstab.sublime-syntaxyG//home/martin/src/bat/assets/syntaxes/02_Extra/GLSL/GLSL.sublime-syntaxzM//home/martin/src/bat/assets/syntaxes/02_Extra/GraphQL/GraphQL.sublime-syntax{U//home/martin/src/bat/assets/syntaxes/02_Extra/Groff/Man Page/Man Page.sublime-syntax|C//home/martin/src/bat/assets/syntaxes/02_Extra/Group.sublime-syntax}I//home/martin/src/bat/assets/syntaxes/02_Extra/HTML (Twig).sublime-syntax~C//home/martin/src/bat/assets/syntaxes/02_Extra/Hosts.sublime-syntaxA//home/martin/src/bat/assets/syntaxes/02_Extra/INI.sublime-syntaxP//home/martin/src/bat/assets/syntaxes/02_Extra/JavaScript (Babel).sublime-syntax[//home/martin/src/bat/assets/syntaxes/02_Extra/Jinja2/Syntaxes/HTML (Jinja2).sublime-syntax]//home/martin/src/bat/assets/syntaxes/02_Extra/Jinja2/Syntaxes/Jinja Templates.sublime-syntaxM//home/martin/src/bat/assets/syntaxes/02_Extra/Jsonnet/jsonnet.sublime-syntaxI//home/martin/src/bat/assets/syntaxes/02_Extra/Julia/Julia.sublime-syntaxD//home/martin/src/bat/assets/syntaxes/02_Extra/Kotlin.sublime-syntaxP//home/martin/src/bat/assets/syntaxes/02_Extra/LESS/Syntaxes/LESS.sublime-syntaxG//home/martin/src/bat/assets/syntaxes/02_Extra/LLVM/LLVM.sublime-syntaxB//home/martin/src/bat/assets/syntaxes/02_Extra/Lean.sublime-syntaxH//home/martin/src/bat/assets/syntaxes/02_Extra/LiveScript.sublime-syntaxE//home/martin/src/bat/assets/syntaxes/02_Extra/Manpage.sublime-syntaxW//home/martin/src/bat/assets/syntaxes/02_Extra/MediaWiki/MediawikerPanel.sublime-syntaxS//home/martin/src/bat/assets/syntaxes/02_Extra/MediaWiki/MediawikiNG.sublime-syntaxE//home/martin/src/bat/assets/syntaxes/02_Extra/MemInfo.sublime-syntaxG//home/martin/src/bat/assets/syntaxes/02_Extra/NSIS/NSIS.sublime-syntaxR//home/martin/src/bat/assets/syntaxes/02_Extra/Nginx/Syntaxes/nginx.sublime-syntaxA//home/martin/src/bat/assets/syntaxes/02_Extra/Nim.sublime-syntaxC//home/martin/src/bat/assets/syntaxes/02_Extra/Ninja.sublime-syntaxA//home/martin/src/bat/assets/syntaxes/02_Extra/Nix.sublime-syntaxF//home/martin/src/bat/assets/syntaxes/02_Extra/Org mode.sublime-syntaxD//home/martin/src/bat/assets/syntaxes/02_Extra/Passwd.sublime-syntaxH//home/martin/src/bat/assets/syntaxes/02_Extra/PowerShell.sublime-syntaxO//home/martin/src/bat/assets/syntaxes/02_Extra/Protobuf/Protobuf.sublime-syntaxS//home/martin/src/bat/assets/syntaxes/02_Extra/Protobuf/ProtobufText.sublime-syntaxT//home/martin/src/bat/assets/syntaxes/02_Extra/Puppet/Syntaxes/Puppet.sublime-syntaxS//home/martin/src/bat/assets/syntaxes/02_Extra/PureScript/purescript.sublime-syntaxA//home/martin/src/bat/assets/syntaxes/02_Extra/QML.sublime-syntaxD//home/martin/src/bat/assets/syntaxes/02_Extra/Racket.sublime-syntaxB//home/martin/src/bat/assets/syntaxes/02_Extra/Rego.sublime-syntaxM//home/martin/src/bat/assets/syntaxes/02_Extra/Requirementstxt.sublime-syntaxD//home/martin/src/bat/assets/syntaxes/02_Extra/Resolv.sublime-syntaxC//home/martin/src/bat/assets/syntaxes/02_Extra/Robot.sublime-syntaxU//home/martin/src/bat/assets/syntaxes/02_Extra/SCSS_Sass/Syntaxes/SCSS.sublime-syntaxU//home/martin/src/bat/assets/syntaxes/02_Extra/SCSS_Sass/Syntaxes/Sass.sublime-syntaxE//home/martin/src/bat/assets/syntaxes/02_Extra/SLS/SLS.sublime-syntaxA//home/martin/src/bat/assets/syntaxes/02_Extra/SML.sublime-syntaxB//home/martin/src/bat/assets/syntaxes/02_Extra/Slim.sublime-syntaxK//home/martin/src/bat/assets/syntaxes/02_Extra/Strace/strace.sublime-syntaxD//home/martin/src/bat/assets/syntaxes/02_Extra/Stylus.sublime-syntaxV//home/martin/src/bat/assets/syntaxes/02_Extra/SublimeEthereum/Solidity.sublime-syntaxS//home/martin/src/bat/assets/syntaxes/02_Extra/SublimeEthereum/Vyper.sublime-syntaxJ//home/martin/src/bat/assets/syntaxes/02_Extra/SublimeJQ/JQ.sublime-syntaxK//home/martin/src/bat/assets/syntaxes/02_Extra/Svelte/Svelte.sublime-syntaxC//home/martin/src/bat/assets/syntaxes/02_Extra/Swift.sublime-syntaxY//home/martin/src/bat/assets/syntaxes/02_Extra/SystemVerilog/SystemVerilog.sublime-syntaxR//home/martin/src/bat/assets/syntaxes/02_Extra/SystemVerilog/navbar.sublime-syntaxG//home/martin/src/bat/assets/syntaxes/02_Extra/TOML/TOML.sublime-syntaxX//home/martin/src/bat/assets/syntaxes/02_Extra/Terraform/JSON (Terraform).sublime-syntaxQ//home/martin/src/bat/assets/syntaxes/02_Extra/Terraform/Terraform.sublime-syntaxM//home/martin/src/bat/assets/syntaxes/02_Extra/TodoTxt/TodoTxt.sublime-syntaxH//home/martin/src/bat/assets/syntaxes/02_Extra/TypeScript.sublime-syntaxM//home/martin/src/bat/assets/syntaxes/02_Extra/TypsecriptReact.sublime-syntaxE//home/martin/src/bat/assets/syntaxes/02_Extra/Verilog.sublime-syntaxE//home/martin/src/bat/assets/syntaxes/02_Extra/VimHelp.sublime-syntaxG//home/martin/src/bat/assets/syntaxes/02_Extra/VimL/VimL.sublime-syntaxO//home/martin/src/bat/assets/syntaxes/02_Extra/Vue/Vue Component.sublime-syntaxN//home/martin/src/bat/assets/syntaxes/02_Extra/Zig/Syntaxes/Zig.sublime-syntaxX//home/martin/src/bat/assets/syntaxes/02_Extra/cmd-help/syntaxes/cmd-help.sublime-syntaxE//home/martin/src/bat/assets/syntaxes/02_Extra/gnuplot.sublime-syntaxi//home/martin/src/bat/assets/syntaxes/02_Extra/http-request-response/http-request-response.sublime-syntaxA//home/martin/src/bat/assets/syntaxes/02_Extra/log.sublime-syntaxO//home/martin/src/bat/assets/syntaxes/02_Extra/show-nonprintable.sublime-syntaxX//home/martin/src/bat/assets/syntaxes/02_Extra/ssh-config/Authorized Keys.sublime-syntaxT//home/martin/src/bat/assets/syntaxes/02_Extra/ssh-config/Known Hosts.sublime-syntaxT//home/martin/src/bat/assets/syntaxes/02_Extra/ssh-config/Private Key.sublime-syntaxS//home/martin/src/bat/assets/syntaxes/02_Extra/ssh-config/SSH Common.sublime-syntaxS//home/martin/src/bat/assets/syntaxes/02_Extra/ssh-config/SSH Config.sublime-syntaxS//home/martin/src/bat/assets/syntaxes/02_Extra/ssh-config/SSH Crypto.sublime-syntaxT//home/martin/src/bat/assets/syntaxes/02_Extra/ssh-config/SSHD Config.sublime-syntaxD//home/martin/src/bat/assets/syntaxes/02_Extra/syslog.sublime-syntaxM//home/martin/src/bat/assets/syntaxes/02_Extra/varlink/varlink.sublime-syntaxB//home/martin/src/bat/assets/syntaxes/02_Extra/wgsl.sublime-syntaxbat-0.24.0/assets/theme_preview.rs000064400000000000000000000002541046102023000151710ustar 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.24.0/assets/themes.bin000064400000000000000000001172361046102023000137500ustar 000000000000001337xڵkAo4cnPRX")F&{s{CvgلkA?`!]`ƨ($s;sw[drw{o{-űKڡ5HgO_AzMk>璘(611._q4e!’-}2Bԓ,E\ ijz2o(7!1{U&9R vq +61Tp*T|\qlʚmQm,wo@2o}EjX>XZ9ǫSJ m&^b֮u馇\٬U< q@UF' 1\ 2 G'=u(<'JPAs 1"CTmaD_Zd0$`pCcB@6RgsZ+%#8G\P Aaᚂ0\L=G۸M^YR@+[m05X[8s (4l5 gu@{Lxm(7GKd$P(2dSJU1avɵ&7g8iZ )4Sjh4w:͍ʊ"`Q!4-{Ee@Z핷Rasj2{B\-~9&@27_QY.up0lsFaq<^ՠ>[LTljUq"!XɬVuM?)c.t౿ Coldark-ColdDxڭY47 dMv7&0!!dh*:]KW\[2ex&=%%Pd9[stt~tÝ|R:p~ EO]9g?]}߫ ~}Y^+](G~_#껐$ڮҼBw+(3鉄){n=fYl_F QZR 0#_VE sɳ?I!M t,pxZdwS7?3́r/Q0Y:-,$uB@{w(=WQO9 V/ }9Dp\jΊiW@RHQ HpsLC\0;[s2463at t2fl  Coldark-DarkRxڭYn5>PBӪJc <gsg<؞@b%kxHH캭T U=3c{=~'|X>&_xWOʧ~PFMOT߫Br'U;UB9*:"|.k&=r_8q/WQ;-*f$ a"1oW`IH`y<fΗ>H1_zsʼ<`0ʖ?sbX Q-/DPg$#ǁ 7pp\Jyl6 [ǏfϞ>C7ဃB!I\$$]~0=S,0[)%PTO,<ӫ0*}[~0=‡ǹ a/>khtºLAHh0DarkNeonxڥXMlDYV!mh&$ʱp+$gnjmVʁ GQ8\@B$!f:o̮ۛ=~{otƟ!xED#>&V::)LF.Xzss%!MJFl=88("]&^wylN&%N['>FTÃ.2G<οMFX)si^c 1m5ń0XpS\=;{ˇmM^"I]:dCd!dX¤&#/Aɝ{a ɈKa!"2W SM2`A6t$8пCIn2 9DO8%4ao:02ǯžrTk|ܛTyºtnܨڭ _&аOH,E6I8T *0!& Iۣ F%G"Zzh@:B:Sc[:=RhSKq՛Ӝɜ3D)gl}AT(ɉ(+}_)4E&!'40&zP֎=ٿVڂ Y:)@,ΨhUDOqL_t20MH0~<%mqҼ:XG* 04/qY71/|*bfgx%F=[%x#!^ Ce8w~7LR&yL8&ı(hj^h bRw'e!aqp' mhkٚ|-~Lq n!IlWoܓ"]} Eh a<aP`I)i/=|&DraculaxڵX5Y6 N܅'Bu B& zfg<Ǔ*ttSPЦF \6o<;;;Z~=?^S|9NO]|_{_%?Ak~~UKKDpxW >Sz$)=p9a[3Y?OYe\"T0Ҭ:;&<|5C~ăa7$uzGݗ,D…y8<LRĔ"dmꧨاfD3Sl!M[ sM Ok{DM|9SD"eh=dqQWiDy^T&ю).k: zzؑ 8ibқeƢaK~QL.AEJ(r, .H2۔rqݰX19,Ϟ>]F`U0Em6` 1%t}mO,ODM_썯Un3[Ȍ suSeӨN;a3=%8b£ZbWAQHSA `Qb਩hNd.( w,,z*O@ bA#_:|-C6<,Ds8s[)!kF!b]շu0T*SZ?;P8drO ƦcStQC3VA *Gכʲ@B$:{#(nWϴ(69.v dgs:c\ŚK yZ=?iXzYy SY/~QKy~ꧻdOR-Æ^[/9u+g|kqEeFY-0$Qh@rkݶ^ q21*{,+Tj֔ÕTv4PJ]*~hq{ѩ wJPF`)Oot`%>}i򕣚ue2GS 㖰1>P;w9 p|qv7,vbBGkXw췣œjkn[U2J T6xk6A֓밃ByCNSj2apv1fwx7Dw\}QY_C#f\4nm 4%hHeE@vzfTzd=wbtslGitHubVxڵVn@PAH $9'@ |^g^B:-A#Dijy)pyofY+W} W«_~q߿<)ʻvvV> U}_' J};P9A=Lg@YaBAӜr_nsF7%b #LAsk'ɠv>M8Ƈ^){}Bf$@8.'ET(Ǡ=m32^N2oYf7-jD.#9{zrw6C4hZd&ppa(ne 6h )7`%&IjJ!02SZpE}eZbޚ!4CU"6S MxUv(YC*򑂔$$7(Tɪ  "ZxLAN7z`2wS֕`lhL=Ko1'(Rtŋ+VWmFiU1|r\Q!ϚZsDžs QsMHZ U:L,e[t3/ "4 ĢMVXl0 CQQjAPp!NRiD&cEȯ"#x ˎbIA#a IˠlrE&PqExZb-@?IʤEac"Yz /XR=(BȊh8LF٩)ʵ,GeѾjFNuj:)CϷERgܕ)XɻqxeOOO*BBP0PF#ߋ".;O("@.5qUgjFP;cԯsG2 ]ސ&se5,~ cG*XWd1$SVt|4+9 ]1 Tft1t`%oRA#8L)iBZcXCYьAKr]>VcEGrG^2exW᭞Dˍʹ{2dl9a!~*U_S ɞUf}4!=d1 ֙l+`j$2ddKKHr󧥇r6mgmy&\YXv%$y}!#gCC 1 } 6Oeθbۜ^U)ig&Oi9&$*[D%"Un$bJojjO'ˉk@bT7,Yf '|8ar]co)V-\Xl޲lvCYxטP> ;t3]M h,U2 Q A -8 }`xCDwW+J(\*UE);ֵ];I .ũ6;V^N5tg3jjm,vYބFP-VaC)iwG Ǎv%Z Irh}&Q {x@1Ӭ ˪6c 5 tD|(GΏp #c_5uLjtg 3kin@mЍd<# iǔ]>jo鹆4T,f@&&.*wLt */M v|˜0^C+MPG_)HG0 xXv,B"4V C -\q$ 餏ERmv +0*qvgX>%QN,B0Ζidigwֽ2yq]rS;BM?ȹd$pU'G,q^fi.b6Z8\="5a(-K$+7zSȀ%vp :4RZqHjdjc>E%gh8l鼍>(Ǣ>x#ݡCIw::::{榧$> RZTUf. lޢ"g!sŠ%ɼ1T#k$n0n@saT(OOe])@k/}K|LMqO)`ܿ C #q,DW)57-Bk~[aҌVyᨀ @s&cjJi.? -\29}H=7awZ,cZjrrá{`hJ3߭g$z{LC?g&Ϊ(\~Wצr! >gPo?l a2'Q>[k#0*g(/N')a#鷞폘 /j`]긤x&(M3KݓϠ+h5pk[M1$C5+e]s^J}YӾJ4 }j tB'?h5WmO{sН\VIiᷕPң.a?s}va,؟+<|ˀ)(4e8)r'OX0y[o^bʊ Pͅ0O֪ZMonokai Extended BrightxڭY=D^p!.EJBDB(@ 2" Ѭ=;qrWD"%- ] J"!@A @Ό=ڳ3c^X|ߛy[^;hkbz+#޿NA" wf8zY>̲ʻ^~۳??2+63kii)nݺYY^M!5Fa1^P_ 5UpBNCH[Zf~ |(m wǀB OGLw^a# z$3JNxMX+*+E؞&̡;/fby!t$I5F`9?v긞VLfb)qhq@3 aͥ?y֤,(ZJ!]9L)pk)wgqD. vƗFm%uǒe5 HBi]~(ќV_{$>\Aد' /C8n3. ~Q\N⇁E.=2 옆AK)=M>u})+񰂀nȅI@ڝmǼ2HƲkW6eԲR@8BܭXҎB6-{ɖ2[@GMn]VUvT)$eEE?uַU6&PX9"%e,cc=a9ۮ:HQ PML{Q ]trIt O4>ɡaA6ucas[6Rr0-VEAa9֡MxΘcI; ~{•gI Xc0g߾E9 4bYa`9` Ӹ!X:νwcԡ-@麶ǖjX@Y$e2o}nO/7tn@CYwM"HIΥ4bRXM-J;z'<441^7e'2Icb`jhsD5pѲo[? 3!\N56 s,=5U]`s\a dg/өy\̇KNpἃ!`Rz.cVgU"K2fmy=LWT8>I^-艵ް,-Atz :3K9^%RD_Cs4KLD{(EYp'@ hʎ\Ic)Ie2x.rh!yS2 "w̪D46슸L*'v.vGsxg>5].Kʼ`ٶi)7=@ ȎYo4f^̈́eU*T[b>+q8}{ FLߜ:ʾ@|p{ Riu MޗWTian!:Q9>Oma)ԉLEdͤ Lœg<Q\psD} T;[OQ"!3+Gx5'yT/<.i3rqScsXiM2CάMonokai Extended Light xڭ[MG'(gmwbzEL BD`!;Hp!C$BHp)HX:U?SU]3vf4zzoyߋyp d1gso_ W Ӄ;U/~>|XiToO5Ixw{#Ϗj _/k񽗩gkvJODdZ/u}-1٬Se%3dU q_!#,٬ gA@e'<+OCF ݌dZq}wCI;% Q!X(MӬbOb^KY&,9!^Y J²~F"vDff? N+VYaIZc ^E|ۺ$ZpWT 1 I¹ *-uGK{RKxnIѺ-#%e>)1^'8.AV5+ /BWׂntҽb0doWD;!xtOj.N>(giyDw?8NOc k ޣFy&;irNe)}~bn IR!9r4ouJ$m7^72'$ytLۏ1XF; PDh :2 &a s7#:!mHaX笌Әy4%0k ]0F%] E ] J>N*XaRѿ4բv쭘geַus*hS`f9aاC3RHNvi0K=L۾`fq&!ZCM!1\)tqܪ+["!H):j?呠*]H'.Fy}--Z7%H@D#;*=xe ̪5Y"|N"/‹LkZxvYR5e6G8]_KI5i](=78DBUNa0W7Tq>&%qw4p&w,m|Nff8{ET>H7{t6e-<׶v̹(cYODnV8ܕk qYgSD8:e{BGPtV. Ζr*"1tDsJosƞD=ӆЏIze<%XRpxAK Twc,H4h\™*Moܛނvn9cK(,D񼉓dҚ,<ˆ S^r(v4v'ދȧyG]qͬ%HmhYYw ݱz3% {[dBJl2w$Kb>gS*Z\ oYɸu >>Wm[VE:353)B|31y**M,'9CMtӎbӀ׌G?5dE%@o}K/yК.Y?z~hC_|cO}u@/~O ্@'E i:_+{J&l+j}jE)nµ=ʳ..,W mֳ4 MZdז=$.#GRd+ǙF/Z2e)"Mp ڂҒ5l8uEZ0- M>oi}I.isc\߶^BKuZy@k?Hn{fCjґHXO Bݥ߿ɤ &W9LۊWYRҴg{*:Օ1I".]# mI^m~9*p+{ )W2$ubpImh/V3$m18&m偃ecFӂڰ- X"y} N\Lˡ qx߅~{#_zמg?΂ K~E;>N~q㗽]'h.yz I) DۭO~񍅁Lɤ &Hk4 AX P<.St0Zrʦd~®ƼH /FQ/ْvE>jp1 F~y.|E&\'h4Pa=ú`f\&aD 㪤1?g ߿aɆ"jcO%P8׳4Y+J }aako-t=Ƀ KcAjn15?BAa+H!4;?j%A3ddG2]QZRC _zw(A~{ hS8_0g&vH&BX,!R$G'g7d,4G8',!'Nc\"R#U _lKB,yO8A#{a%a_v`e7eɜ-DP< ɒ{pvNO/hPͨT4NߵҋzŁ69^ ~v4E$>śUa3PP@TU Ѻ ;#i tysɭtw}~^h.|ݧ]>4CCӥQH{(D]@iu V31WfVcĎ9H(Szw 1Drayɓzf|ט%?݌ogDCCx͞e07$MGrnk4^TyEr;$%1*D$s>F"i}ᾠ0swQf".KOi:ܮ췲UTKƓ=S+{+0ȡ<^3xՑj>ta7@0,yyf$UQ-li`iװe1fUaЁ?0Bҗ+(W{bC.7O0R .^n]殈ܪWb`QᰆL2%jw:䃶d-`9[} WoUW\:כVfNordc x[;#Iq>cwAp?(uiuuW<lL, x؜q&>8CVWu^-iI_feeefeaVD{wCcREq6q5 |=}h'tŸ>gW= ͣT ʌ~:_/ґҗY=.h /a\ vJCR!giYB=DW+bn3- JIVK\a;w?Jt^9n~˿X($p|ϿԂD0x%.vm!.ˬO^G%(Ax8Hi,gqǡ6d]naFA jڗfZ T)#RISEߑ=3(qet,Y s7 D&$x<ӵ-oT3?IKz Pq#T} [Vh@e-8QtH >H@^Lf4Y*e8gϟCl_9̳7,*NCp '] W̒SM iFJN*4z~GԁAd,vs5R#~(aM;+aE߮ 8ܫnƦ ͞hP;wI>E$>z=/@ߞ`Ya#}sW5,ݻF%؂i  U諟c2KwEW.ڥuB#Yd{Е-(*^.ƞ[JjuG^Q~%.=l,z1ʔxze;;zfp aohۋ 'Vݫ2Rqlj,7V0>z9x*~!O[0|[[2}_O2߷zOŠzoQiQP5u{$K]+P{3P6- +7{zLlSʃM990+t0lEkpN回|t1oy@hR? q\@΀>g}W]¹vכm/p OneHalfDarkDxW=o1ε Q bBL0 @BbM8kF 6$F6$f?Wڊy7ߊ`vƻo>|x;Znipл~{лy{k .ī5V1}]LBkF vUH)Ie#V@WtDֺvJH"g9kFK b7e6B4̞05$=*;_ 8`n(i賙xAf% w%1:lsہ͑4GIˊZQ68[)HhC,dkCbN׊\ŪH4[.~̶ P^sj ׵]_1"Ò0ypMX+(g4SI>M5ywa(i(hűn/e~DGD+m&!stNIT$4U:6DEٲWD_.-;@r'tZ6 f,1UJkm&H?ѷ3O +.}QiLȻJHP7qjSZsA"D򟏑w  BӾd0&v儓?9Ů OneHalfLightLxW=OAE (P11ƨ&& 773[&jL,hM,Yݹq}~gVt3x jN'hux8s9>> 9Nfq&3ZoxixuyL| Q ;Xܦ$ g)dh@=\zW,W B l1^D3*kc0 (_.u*a6X3@gs$bh ̪,聰Pη}"9kF p nh=%ajHz1%uҧ 8]ΔL#A&ql+J'ܱ(6mֆ,=&J$KB++*n=$Іֆ IP+;m+W,=_.`ϤJv[e]/wJ{%VS 蚅bď)ј̘̃kZBX]D%J.l\!n&ϻs]Gy tm<7ҢvoxdO8`iLOJ HbުIe#HSvh8[Ţy{hVZ.rԚ)Mc~fZ`rNɱE4] M\T0zX\U4􀜜ZK2e2&Ɍz}Pg}nN j{ᠹ ]r8:o>5a;fzP L/u.H$% P&%! a  ob[Ώ_AYSolarized (dark)xڵZKoE&QKiڦi6ͣ-ҦV*R%\ᆐ8w'mvgM 7*#1o n|N|3y9j~8X4OiX%>;z4^Y0x,΂փ==HO>I>}4Pψ9&lq˜F5_~eg` p,+zptE 'nB 1b(0 qF&:k*4e/j?_Q(?, ,?p\噉n')qU# Ywwk{F;^J eh_Rݦi[UꄘV)pKB|B,;rY(EBsLcOR]"M+* 3c$l v/k ZP~ YtٝJi`cf) !3&p:xތؾjG5&Gհjlۤhtd޳ۄGYyPl"kZ%ȚeiQcP`ZkNqѐP2`byȻܭso[qT)"SRQG ,Ҿ$#AxCKꖁ^p{t^r6w߃^2gցuLMF =(qQ{ϗuxWc'Uc#T 1~8fO] t]?ŸP6E5U'(adn)dnQlOܒ? rX'I-t]D\Kތo}}`T_NQF1V%9}{I8V4{\*!āPԆX2j)[ eB_J~7E'j3JQ?)LcUhSst?,}BhWVlԵbb=Vy%~wT.nN)ZMy2E(CmKEWF8Ӈ]4C̑#Ha֑;?B}./ֻ&bm0+Ç K ecf qã]pTY s @ 2a=EJǻb=)#E 3J8lܶ]sF*5,6Ai<`S{"hFhD&G{}Ip{э;iʻ>ɤ?Lg|4{߹?I6izcgK=eyy iaR ֛ (hXŨL(V~dP i>%$~=xt^ $nwD b(,1 pwZ&:T:dgIحK_i>U0z_,5V$"Bl_|inqǔE_}w=Z:'zI唕B~[]26DL+*8d43A7(-GCU㄄ia|6zStcJʀjыxCQQ$13%.O[n+-e``lPAF0[)bo, I֩A-I9ʌ^_j\A9b}W&x2@&eO;;:R;J<eoZvٷm!*/ sUf,q64^0џsX5}AL%eG]hˊ˥&r`ssFC\yyYˊSةs0USX9)|-kiuUY]7xAELT5.zQ 2KMpÇ8NY d0gtPƚ%mڛUNiő4)'!5!Jɲ#9 4G4$&҄6DE^㇓Ե0Jk*%DƧҙIN%$M>RW V+r>, qAzuohszqA VXaHoxxMUUe'YJRF-`հ3m{ܭ&ؕ:vGgCH!{SkEchT/G"i.Aq BwKa&C\tFhBFg{Yh:i9vἠ &ZzT|}ny#oMb{ZWk$r0*cߓW%("OS/ͥB@J9 AmӫP,|iq+X)$QqwStZ1QHrԦP9ZM5Gw#,r';veu{Z]+ Sxy *mzX 7|GbeߔWZ #ZK> nxy8Ha2x7M36S_zI]0;M98 7˃6 gA{iO)5FƾmepB ĭR>FWe0fLl;e_n)a_up7豒F}Os+Z/Z+&9p/9rq ~oGst5E@  't7pS?P qE1C" Qec dU스yLw{Q\x4}OB޴'NS:HR|!/T6Tm6C>h ל%Rj!(,:提)"t. ׉Pu8:<Sublime SnazzyxڝN0 (P yĐ8s)Jai( cMLTx%6{r O|:h:M sx7gGn npyzXFvn\, /?}=Đ !x+<.ݭ| Fef.dW#BV.GFmW1 h>~ vB1R[Xq98: k*3:I:6*>+ݲ"a禒dȭEq]A'b$Bk|! +RmwX7'G  SyiLZo^4CTwoDarkxYoE//ÎmbX !@HHq@P0n칙G*:Ŀ@D > 52xfw;ޏ|3\寏&]w}ls~8qmwo)qF"ILzy{կ?DfC#" 1fbIz3I_1Pѳ0T68q;as6œ2 6 BH0ޑBZmQE-_$l)#ԥ23Ң\.2 z-ُ0d\T]D)`D`MOPjdx Æ<؜UbHG1z"YphgΒiJ)thRտ4c"19  (봃~v#8EȎlL at-HlzA*Mc|$8%V3tB;FڌUnn鎗߯P [e/*lX0$5zcfhX=nDXg~N ڰZL[rX rЦG,:sK9H!XbfZs ,-wmƿl|!h&lB;%U ZF7rADWлZtB%gkk+i`h$']:n Z,Tf5fNmWψ~\Q*v]K9"ɱ raA5ɫ:`*x{CT K'οϓ4,gVw'btI1 ôZ䶐-ԋ(]ӄ-з]౬n@<7`J$#knsil7Ǎif,SpGbL\"l#([脣Bt$&麤x?I{hWbP_, Syjzy‰ :)([&&CWL |DHA*;kz;L2KK0W]«Un0RC|(dzeݖtbdIX N0N'V5"54G.ۺ:AbC$l/Ź(D9 ^QuK4gĔhcJhІq>V6\9(sU &w a:=MEbޭǹ)rnʕ1T+@.f[lfoH[Woz=`- ;"M `i'ZC4Clow6H+?ǜL]-tI2~,%̼y*}j]5LaU~[^La8olmtP4r:>lv*l+@3NGHvݓni^a,cJynq;~H e`Visual Studio Dark+HxڽXoD HE@.:~ ](`֞sΘL.)8+(hr@qѤ0ϻ3Jw[מ7{ߌ,>*_y[+;X])i{;==ͼp-~g+~@?}|hw*%g3¤ntr.‚iLtp%9E6ؖ CCVK]6^.rlX.%/9stPT`}Hׅ4d:[&V VDu S4J]j$nRXΆzڲ&ÖmanTjog;e8YNԶBx1,s|3H\劗]9eyJr ƺaH1TFQTɠ^x\sm{!$ߌ65p:@;::jhC;(qS07:a"֩j˙ypcW;}رAM$<|_m9~TB5{<ĕ6\$+wrr6'ʌëJPDpPWdG&L|}}1:$AIdE1l=M?Z&kӠ$%*ƾ$gzdyKCko>l1W 6sz:H(J^xQ]w=FdaKD_s6MT ;S{ѬinhhGJxGӘ{)8~,m E:xη(ܫC*ཿEKfRbs/@o,lǁ?:h3LZlq({D*,׫saְx>/UansixڵV]o0m6P%j !xJ=N㤉<_ޓDY}|u=lo~C^0[&Z0J]An\1VAFO3xѮĮszE]bMG)K{` B~9jPCpL욃HCI%^UE!nm#wkc H]Dp ݸ܉$aXFozW8d4ś>H $R$tBn^z ,u*)O}zWsݤcf!3@*σl27f@l#%>ߏbm4pλbAb&"pFxso_4ܔ3 BowzT\_&4 }L*|O]h4S^0GvM\3-6ֳ[6v`>*=)6/O[; B"b<Y![;Ll&d_͇RP!pZ+FGb ')@rܶ@"XG~AeŸ"uo8&P .fڃgB+?#(>7 pON/A1H?pKԽbase16.xڵWMs04gB Rʕi=p '{h"K$#Dzk+04(CoI ƃ $~|21I)(z}!%g7&D_of(97mڞnK3> 0 A"XgdK3F:  8IcKdYEwoi T`BZG1h֗so/Gv base16-2564xڵWr04) R–i= ]% ~ھM4%W[ȱڪ%;LE:swH~㄂o AO?j;\`"R4& ;._x'Wksx@@O@@P*d= -&z y#˴K=& r~O3[sK ln\%|p+~2XH3 9W\D>OP'|҄W g[ةUIbI_==*xa-,ImZXG-RVLHB ڜ9oZr(o˙n}aC'¬8P&-sY}*Xc;\;WN]]}V 0K%0YN@S@SDbt\a$+,w<;d'찭~E 2׹5#&{m'M0ڳ͘"Ű.˛xtb%!RqгlqBj[&ǭʒ)= }Kuswuh!7"J$>ݰjyoԵMiPRS )K[k;"?)}=!TϦCyqW83XqIJXBm t6 `s{<5v]C!ǽOS.pط{0paB[ x1Ъ$i'BCXOؽ']4"R@ꅴb2rfQ.BM;?! gruvbox-dark!xڵ\͏G٘8q$f<$DIX8 \#53E D8D$NH Eą ꫧ^U:ln_zo׼t8z0::}0~MEgo8IVEU-˃Gq/G0 !#`}lw:o78ޥIkQʯ&E^g4̓8|m,uGQ&A j=2Gk!`WYEK 7{ɳ`ϋ[AD}#V SI7ktZ@Cu:U`#GӸ"{0uV5O^I/pq*9G?'>[Sh|O5'mntdi()$  6_`4/u20i>YK:;8e4M%~$!Q3B*NO76َyggk 4X"L,*C'NFpb/kim12Cݷ!0x^ )Վ%@jrЌVρ&r gY@g3BʰK Fe-ti#yVV>igҜ\/XP2㹨 CDnh3%BEX:15쓤"XeZS<$QI[Z?{_ʽ>,no'7t!U#\Hd1+6|c$1" m/]"'5./Ҳ^.ft#Ӹ ]vs `;{ ?EWr&jc)?E'X,LXAoa{mԔ l>ₛ%FS7- &R_{lVmZjܮ"[!r,aGY/9[1ϣV$]'kF r+d3(<ȖK-βО}$ nU99]9Fr(f-8bK^la& L HO_X49uډ2- zA>snQ-#28%Yz 8g^Y)MjJS 2U` ` `1+PMªP/I] ??p"2Ƴ y:aZ9vzF(L nu%EQ  Kׅ-RD2"=IZժӛ8P>]-%@z9_O=rAז<Œ6=Hǂ )MEyiu/5!F?8[L䙤'NU.hQGn@ikOsiB0z먁j9hgd]yU]=9_1ȡ ɌYkpzmXƨإ-ܖ}_uH;t"pGn u2Q^tlXC׍\G̳|BII}YX&5XuI6qMA~kkc{:%!8(mq`/-#~R&fI'\OSg[k+MjdE`HڢuIж]75+qh:c״v#!-<Z|v 2gz8C _~JRGjH4vl˄և cNsksjӡCt}3(20YFٱ }4)O l <4F9ty\z Ή;԰ƜT?lJrPfyxwɥ.];w=һ.[Y8ȏ[);טmrASK۔ģ1~RڈHǜ8<~ QM[@}øpEtOfpu]'ǣoټ7&i>>,hMh,G{ZOxd`xGy&_F0:y(O 'dNl T}E4=Xk ;,(}ekp+N5`c^̇ԧA"-2xV% G˝ &E?@.<ʋ88/#2g낽*Qr J|-FM%4Yob0S lHp4A{ J|aSc;ٚPs=|>lvc"+CIUfs:`W4GI6\̡٬h& $ Q,\ g7tqRɶv,`#2qU;%&E"`fi6vcEG{˭V 8@lU-0Vfi0Zf?ZB4#\Ae }N ).*|5( 2/['DyVV!if\/XP2ㅨh![bl74>ve[&Rp?$WI3Yqܑ!u' iTD|wOV˴We-XUVyLi*YGN2 ,gņb$)"X,!F)sqQR*--"/`6I1ek,)ʽ31(gi| FW~FqIgkyLrct‘fQRnz#c#TfqL auӴT:H}:xdVݴ+ҸEBPj9>$YÞ4Ұ_߸}:1b3#G>0I!L4AO *WG>13v2_j dPz-WF])i]Ct'v ]Ȣ+zӰQ0c2. ck>n0#;{l6GJ;16E䅞s2h!a_ݐ)ԫH^3{%s<˟xe4"-6O5<ܪg]jVI8k5c[_Ϧ!_nNf%b),4Gg]"8&X5hՄcס%C0-QveDd>,SZ KIXEhNբn'N鱣5[o8gsG8ےX1Y[0nW8O?\eM}'x{?/OV+3'y&=- x*WBcd7RUU8ata b=@}peu4ɪ`9Y_yɔtg'֝xT\"5k-t>S k[tv^X{>*weߗMRf௾ P5ݵL7 n}gVn7b}cTe$gY V70 m,|{ xNݻv|2vEtR0\\ *:~1`~%bS)LulEi>J;`ńV8qACLW[`\޶oDR |PBlW. 6dZ MY[=mDm9Aa=?t)XPg4\ Դ6Ơ9 nscaH2}!pdZvz5bnF4} U ч '0` sRGD ;u=X.cQ`N6w<с>8TǦ6pʑ96%f{Zi6a|7 nDg3ww,^u6Nyݕ?^0\ȔXۼ( -nU*c(:6]vU'ϝD4LƢmRW="u e*! ϒe0VB!뾅kmXۨ7ק6~]`8k/`8HJktpJ b3Ҝ] e \{BPBH}¬׷ =幆̳|Bu yoLHP̓)):`gPӃu^oVnOz>Iɘ}YX_OjKp 5mↂ`tBM<4yHלMeb%\F=-(ni!Id~M{~A^&SVg/kB_MṊvWnqSƖR{x^ў|l# qR  *TȚx:݅6|AմXm8a92cָQq/te㖱}{aGzC"wkN5fvA6%hLԦ6b/821G^F5&-KGj]&:J'g` ]'?{y`n0:lefv7 `+o7SgGtQYO?Q/]>90bd n7#e "v̠#$?M99>f|>aXPHL]r̒b@N32.HU(n6s9k*nb5-MS%#qO|9$ wu btkty '?")!X@N6"z^\2 SPtN\zBGn7B֤#D0u0lˉltr"%7EBޣENRD6ճImdnmќyx#^ulu-cx{zenburnxڭXKlD^BBK@+!QxJQhNnY{v3;q6)(R h%)= U*AJ".pCtޱ3CkFL5~l`. rmH\\Kcxoi`Aa']y9`Ϡ؇X;;;=kjjguݞ599٫?ʗٗ׳E3 |qF=>Ø8,  N ) i( hs3 9:퀺 `sp.t'_bLA^s(*_hs,BND~.rsr9h Sl]2u1-"#IIS= $ 8sB y.$*/ߗكQLZ*o,1Y&{AGрKx9t"c0LԈbG%xL%knk~A9{پI [E2ϦO݄"U|zD\0/)'4v؈ ٤q6kH#qX5CבSXW5 n~7п́Kl-56Q. NDC.a猞GrQ/A""VGG>b03@)f5Y|:A]m%8׈SN ~$}:ο9J 9L[B} 0#\< %[7`U T5`*+݃E]HI.+5FcSP5 8uG,㩐GzƂ>hM&J 4QkBƂ"?6q⢐)&ɵR[~0e|3 [0U."<4ĒHɒCJQ - `Z4HQH;u~1ŋJ }Y}m2zO|R.42t#gRH/z6 qW7hb7D" W7sk b !__pceu׿mrn_]Z^凌cΪ g:RySqC9/yM )ic%j؎'d_I7;J~zB>ĨAmH!5 3oeޱJZ1UDED#܄ZKDtu:^mbat-0.24.0/build.rs000064400000000000000000000066331046102023000121320ustar 00000000000000// TODO: Re-enable generation of shell completion files (below) when clap 3 is out. // For more details, see https://github.com/sharkdp/bat/issues/372 // For bat-as-a-library, no build script is required. The build script is for // the manpage and completions, which are only relevant to the bat application. #[cfg(not(feature = "application"))] fn main() {} #[cfg(feature = "application")] fn main() -> Result<(), Box> { use std::collections::HashMap; use std::error::Error; use std::fs; use std::path::Path; // Read environment variables. let project_name = option_env!("PROJECT_NAME").unwrap_or("bat"); let executable_name = option_env!("PROJECT_EXECUTABLE").unwrap_or(project_name); let executable_name_uppercase = executable_name.to_uppercase(); static PROJECT_VERSION: &str = env!("CARGO_PKG_VERSION"); /// Generates a file from a template. fn template( variables: &HashMap<&str, &str>, in_file: &str, out_file: impl AsRef, ) -> Result<(), Box> { 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}}}}}", variable_name = variable_name); content = content.replace(&pattern, value); } fs::write(out_file, content)?; Ok(()) } let mut variables = HashMap::new(); variables.insert("PROJECT_NAME", project_name); variables.insert("PROJECT_EXECUTABLE", executable_name); variables.insert("PROJECT_EXECUTABLE_UPPERCASE", &executable_name_uppercase); variables.insert("PROJECT_VERSION", PROJECT_VERSION); let out_dir_env = std::env::var_os("BAT_ASSETS_GEN_DIR") .or_else(|| std::env::var_os("OUT_DIR")) .expect("BAT_ASSETS_GEN_DIR or OUT_DIR to be set in build.rs"); let out_dir = Path::new(&out_dir_env); fs::create_dir_all(out_dir.join("assets/manual")).unwrap(); fs::create_dir_all(out_dir.join("assets/completions")).unwrap(); template( &variables, "assets/manual/bat.1.in", out_dir.join("assets/manual/bat.1"), )?; template( &variables, "assets/completions/bat.bash.in", out_dir.join("assets/completions/bat.bash"), )?; template( &variables, "assets/completions/bat.fish.in", out_dir.join("assets/completions/bat.fish"), )?; template( &variables, "assets/completions/_bat.ps1.in", out_dir.join("assets/completions/_bat.ps1"), )?; template( &variables, "assets/completions/bat.zsh.in", out_dir.join("assets/completions/bat.zsh"), )?; Ok(()) } // #[macro_use] // extern crate clap; // use clap::Shell; // use std::fs; // include!("src/clap_app.rs"); // const BIN_NAME: &str = "bat"; // fn main() { // let outdir = std::env::var_os("SHELL_COMPLETIONS_DIR").or(std::env::var_os("OUT_DIR")); // let outdir = match outdir { // None => return, // Some(outdir) => outdir, // }; // fs::create_dir_all(&outdir).unwrap(); // let mut app = build_app(true); // app.gen_completions(BIN_NAME, Shell::Bash, &outdir); // app.gen_completions(BIN_NAME, Shell::Fish, &outdir); // app.gen_completions(BIN_NAME, Shell::Zsh, &outdir); // app.gen_completions(BIN_NAME, Shell::PowerShell, &outdir); // } bat-0.24.0/diagnostics/.gitattributes000064400000000000000000000000241046102023000156530ustar 00000000000000* linguist-vendored bat-0.24.0/diagnostics/info.sh000075500000000000000000000142341046102023000142620ustar 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.24.0/doc/README-ja.md000064400000000000000000000624741046102023000131060ustar 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)](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/community/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.70.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.24.0/doc/README-ko.md000064400000000000000000000715761046102023000131300ustar 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)](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/community/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.70.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.24.0/doc/README-ru.md000064400000000000000000000703111046102023000131270ustar 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)](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/community/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.70.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.24.0/doc/README-zh.md000064400000000000000000000542241046102023000131270ustar 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)](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/community/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.70.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,chanegs`可以只开启 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`参数。 ## 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-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](LICENSE-APACHE) and [LICENSE-MIT](LICENSE-MIT) files for license details. bat-0.24.0/doc/alternatives.md000064400000000000000000000170331046102023000142510ustar 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.24.0/doc/assets.md000064400000000000000000000150211046102023000130450ustar 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.24.0/doc/logo-header.svg000064400000000000000000000566031046102023000141430ustar 00000000000000 image/svg+xml bat-0.24.0/doc/long-help.txt000064400000000000000000000171161046102023000136560ustar 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, ^@, ..) -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="..."). --list-themes Display a list of supported themes for syntax highlighting. --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=".."). 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. --diagnostic Show diagnostic information for bug reports. --acknowledgements Show acknowledgements. -h, --help Print help (see a summary with '-h') -V, --version Print version bat-0.24.0/doc/release-checklist.md000064400000000000000000000052071046102023000151370ustar 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/`. - [ ] Update `CHANGELOG.md`. Introduce a section for the new release. ## 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 ``` bat-0.24.0/doc/short-help.txt000064400000000000000000000041051046102023000140500ustar 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. -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. --list-themes Display all supported highlighting themes. --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. -h, --help Print help (see more with '--help') -V, --version Print version bat-0.24.0/doc/sponsors/warp-logo.png000064400000000000000000031412671046102023000155430ustar 00000000000000PNG  IHDR {s pHYs  sRGBgAMA a LIDATx,<ۣh4ƒn[Ov"; [2I@d2[o?:97}}B_|/Ώߋ!k"\oq:/\סAVE弅^2>4Ow ާs.|yhѴa>H۬źV{,͝ՇC1ӼhFtƎ<|{N>&pvN's ,qa'Y8Xbn)JVRE]ԅ&M9V`_b~#zy6_3W7'e,hsq5o4ZSս >]n)0 [;`ƴ:N2S'Z6N 7%'T[>j{ף4&ƧxGov߄wR}dg~܅x}G{餘砹]ʹn ĞC |k?߳? 8;.WNFx?_q_Ҍ߿71?xǿTq?vWFC?ow_+g?{~S[OSy?GD=٩MoQN¶; ;_kxȈxd)Ǥ9.b*އoc|U6Wç16ƅb1d!#@Tbw\jD|;SH &,4yorZXW;?g=Sl%ck11oc)_wY߈rSbYŞPfOk>׉y}y/ {99nxEryاIG/?x{Oy- E<9m\<[3߶ù']&nhηPێKݚ:9ϝHؖ3xL-Goplb6gr bz&HR}&CrST 2Fa_k%5HNᘝdpl [TBu{2NF:ȥuBn. &';Te~?'.ًE-rݱ c\Di݄)]🧳 bC,`vG#=?ʠVߍeik14`^YTgͩcXl|&glTdlR?ö6ſdžnltFM\ f8ʋy oK/gl$Ǧ}lw1 66c76?zofp96 Ŧ؋tlOZ,|60%؎1rm}9#NFz`7clnLr1{>iG_$D[se]w'UNkU!m\t '\L߬+XtZ`E_1_ ;08n]ƻ`ik??"wG _{r89W8i\6a| k bGUNmZn>7~ Y 9'q}rA|jUy_c&E`m XqObƍZ5WfRl JU3ңUĖ6YI*] )_r3A`R!y*ZM~XIƢ90+ϧ}SExSʼn=+8\I,. H/9[}uA|~.c_ ocUmSٯc^ FqNp)klΓ]\m/v7*kWF08-by(r@| 퇦 YOqɗǸΒƍ0nW[]_瓏%wD> 8Ms؟-Hzw?^_X{u-6뜟Ku6qC??YOc ѿo/嘲ؼ/XIi" ||i!6yd{Fz GwgrWro6[~#ZlfmOR?W*c΍%F;* >7]]}t["'^n|d3lq #2X_[}:oaC}|_>RwZ+W.7$?|:6;}w8],}k͋efynskk-?OsLkcҏƜשCX'/_;<][\! 6ЋIGt+#0!'? ؕ'I`<iZ$}3<9 @iN "c(Ƨfzپ6HLv*s!]畍k<0 5&l s3$9~$-qX$][LdѶſbQn){\[rlK`ӄ/N}ʦ}[[_pE.U?&͓h[_a%_tnw.mO4WYCG+եc'9{?$6C̃c@36Ҽ®܁qڂ1Gk1w)Nl7AYywz+(cowo]UvqE^Y5ɩpiιT^;SFoo+|:qy>;sC6އȎ]ر^|0wGץMsX ;&u=0 Ћ776`%y7y[Zd7r&"k wcWGj+*6͈kx-ݬ|<>9?_}Fza{=bRXĂSӛGǎș򐮛,YƼKTrή}18(flޟ}Cl_Lnlyն7Ы Y㫹z9r RB U1oŗI_TÌ?0ǜuS >$~ݿկ q@7%2sh{JitzQڢqU/[/cH*jկ WVQ۾mפgoZ]LvgWv:bow\}aA DRrjDXWH,a#Kw_XlCXۉ|'n\/8%:]#? &}\t.ǔL88ַUUV8wj9apo^C%YrQ{c;ܥ-Ppl&܀縕j20iMS`4˗L#>IŠ%+2*|`aROU2@3RtɃd! iOJ e2?sWc:'yX0ȇ\b-p62Zؔ `MM{UތodzǦdy,vz_ F+l7`ux<{Ya;fsi~_<6lq! dav7ߏM&zCm[?vs#=f/ 5rP'oD|4Ǘ LOV u3چH\ܿr"'~)V֟ҧ{~OBk{/na/~nozem3sMocئ>O`ipܿ1/0s>[|18?}N%o2 ?o )'k~J$V:Vಊ-_ )AZ#:u殚i'GVx8zG:ʝ|V[<x/~To[.ijcݐ t+Ec9~Y8GzLչ$jm+ C`&N56: ѧ@R8XB'YZJ.;q"]Xĸ9vzN K4s(ČΫ͏vOl*mr_vpbˍXf 1g?Ldx_[WXfq~-<0ѵv*Z_cx'1n ozaW}0EO,0~s8|o*ew<0y:!$sC3u~k/ޟp{ V;oΛC.r=1`k "N5o) nNsMT)͘f^O5WZT~eZ>Maͺ67fnǦ(\D66#7cWL籉a3|zȈM|16ǛqrܵM8a'>aw[:t밍xXl:.%x*@X2"f_W㼍סS 9/-|R{T ҩ%g~.Xwim9Gtӹđ֬Kzni{.W m^c& Ζ 6o;|~4Q\.MSωsžB9\|'!y+|}/}!X_˵GZe7m.f3.5@gC«|` ~IrIuUڞ`]薔>3^9h (9y^C ԉ-#){fXw|4?xcУ>0}z“D2K̰kā?0>*dC`Ed,e=Y&y|{<7dn?ѝl 1> V%p7-0xj̹y\{;> fbaҡy@Պص6.֬]vokRj\?t)o$CcA` 1tx(?P~(uKy9a[MΓ )f:oUL9A?^jNWM|<{>=6 Q`Cyl#_xoelȆ֞?O;U䱓occ5c6i[?O+;䱶3̜o}윾J}WEsG_>% k]T9'4?҃^I,/]^x8W;5oگmN0ۻ(B["HN8"qޛx1~yL/>sKgȜtT~x@00iyݧ  s04=?@wko:yM5ȱCߓ CQ.91@\. 4=R=S{xWmA`k5[%|<ł1UJD^YLǂ;#~yҞUӼC%M$НwYm·UEжG I_g#>65s?>n0- ^- 8ױkߪ {/';fb﹌J"0%͑: `_.q颐|4112?J^4T28f\lV a李{nm*OiI[ ]q/>!gM΍-Z_Ȼc|*dĦpS?n:6?c} /qwl6+W6c]Qk^v BکA>>S/Z n)7*zquϸo׏/N% mulG|ƗC|{>¿=Ǔr3=!we`s~W7t|!hq+Dɒg>#܇xw?*Oyeo?.-p]]Rg"V_?j_ߔg|S`>AGu.?}5h~^5qlORSe)&^[7* ؒXyN(Sk8?] l\y0, sd, z00sZDɴ!@8sIS&:+81&a<5XBVwP_ UẰ,IR[&HzdZ_k59_e:{q|3X>jXՒ!`"S)f whm}2e[w{7sj :1_:㽃 jcǐKXM}Xꔺ֭OX]Acs)f&v81SmQ͘sYKLZuS*=9N|lEzam=b39n'+m^p;_M/W;࿘c׶X66c\sywǦyiͷZ桂7Q$OC/??Oc>`6 ȍ;nxmE}x??ؚ L\oЇ|6-o~s?5@@#חqGFz 4r7c/V:py]/f|l<ڪ~)gge?En$7[W˕_$>j?W*ۻω^.3ߗs|"sb"kj\ T=/r!~tngG8''{ߋXnuD^E[Oc?llRcYSԪj엶prY1n-Xsem9[Y!yk8!Lwrmڪ:'pen[:a]^?><ɭàb z^_sPCsRww lE2O(qe=D$4 \&C4z/^ *[T{ I S-^voybL,~.1m 2 & s]B˹l>P\i nVx}=v&u,OEqfCל:ּ$W;y%BsPwˍ%=2I,0r ~_Oމudx|'Oub@Ur/$v=2UkSΪW/W?Z3uOj[(Iv=U_k7C7c_%gݺttEnpc?^Sd}69mJ?_ 'GS-sɹ3Nkbu;aEҧ窻0:\|i؄?qt{Aq[%EZ@q݁SJ߼la1.rS}Z{?c_]۽ &ǣ仓%$:hphIJC;QX5؍+[h9P^7Ϋd2 O&I,#/?Q̑qxlh]pD p1_ (u-w1uję>& 9mi2v[)*(_Uk̹i7bԭۻ@?Os*LkL㢏#^+{70,~B+̝komp`ylgq}^b"NzU[Ugz3DX>~mú1GmYnOZ/^Hgi`^@l_Wcm3{ʗMUk EFٴ>[shO](M+O8ɘwcc/9~I*;6SJުqxwk8S:t ]C+NlRW=7W7VuLԉUs>>?ܸ{ٕ>/C'g,֓ef#]\kOIf˘̧+8?_\1=@|׃&湪ؚ8-r/~v ۤqm,< =؜UAOl*<;}ٜ&,/rp'oIh<<g[-IW$ſ]=\#L~µߥ/_h:ݰNy?)FbVl:ПױU}T@r5uwQ}4qy{ſ~G5Ui/JY#OG MIJJ>~ mMou@CfZ]p澐lrV`&]R{7{**`tu])Ȝ9ԃO5~;a%Ӽ}QDέ;km0Z'U~E.NqÉwظ>K;)䥬i~'jδD*jCAXaUuc_9ine?0njڊ̶(kh־Gcخ)}/CO51;ͣz9u?oqf\uð>ƩJS&7MݶV +QL,/NSޞ]Sڳ'wwkx  V9<>=6ss66bmcn&޲A)v6ﱱ׊3^nBxd{Ȍݾt_4k|zS/7Q`#濸R"2ӖE.|!_xG ҅\'b4q?jȟ8Ă)z=H/ڲs?6C$*l7 =r}~z+:ms r~`|.U?R)ϺU-7fr^`Ceޣ>Ozb3|3<&W`͍ϫD+X%u\?3hߪӜ8/)21 y5nyr/L9sKS(n*gAEUN0gQCo=ؗ'ƞ [k mUi8C'9<@_B!"5mB.e׮`ڂr YVM' |ڽ2q pZlbdNr~5??jsQs*Ui^m)ip}<#}.i@|q!3kC<ځZ¿s)vb:e8$~u.tN}ryU<mczOS&l6׷>//c%(\|Nql_3\O4o{narՉ͵VYNYjGAIK2${YT{A6V 0R۔N0N;hlJNY䒤PuP]fo*' *$&,ZͶ:EųA{od~ OܵSe -lK=ŕwfrݢoY@~'N2t꽯lmuLr&1}#J 8W]v>"\!sЧoZCjc c-VxN@T7.Kǿ^Ƹ9+[p-H)6/o.&U./nۼm$Fk/ZM .LmSr?p6ߥTXlbey%N΁CO\cK/xU{' /fy!o.SDZaqqe?4x@lD4;wy،}j?`yq"66䛓!8_C|e|a71 i۪E =|><0'7>'~T1gYl3l_2Eq;tJ~$6K*fGr19bȭWwwl':^ƶڶ Ͻot\ ۧȁ:~d8mݹN/ چ2Gyȴ ^=u|n~rU[`se3^M-#YxkIsoDMuԯ[lsA__8Nf2?v m?YkZ@Kd(D 3>@)awSg *u7*eok_+ 3Ov__8M!4ҷ[_c(.Q^ITas ) I`6J)_0{ m<_ô[UKY<^ĕsVwSa|.\np_d9YdoOZZtok F1)&Zs_ŃȻ2ֵ ߐ>~_4ĴsvO}槃L|u^ ]#PTU-ŗ˫te¬0Rs"?/16mgMulm??)Smr͡61>>NOi>>oO/s ltǬ6W9H} d:9?^kd7G/=@ 25y5K~Իل,sBdudkワ 퇔Xnmf'1w9-xdd7HLߗewԸ'b\=$CuoSc{W!3ve#"@:0P֭GyBk_,ȶ-*yN c;YäOڄHb@Iά\l&_TQ50kytgm@rCwߞ:][mL?~@O:xݩ-79:/=6M;0eZy )xs6a7Ƈmh [کC_^|SwF X}9lhHu{??7?*NU?^\7[3 ,ctovvC`b~jϬw޿-Zx/k9TӬUL7m2`/ 8l .D r2ah 1;%b&PF:=nn.<\RK:x:W@*1oW2mm31GOˣn?O\1\LjF_6;𜻌rS{ݵ?6#nNW.9nU96#cj$G<^e.|mK.f1ws!;?QϽ+\K⿘j?*/ἓ ^^u3(zb3pqQ&_g5cY׿o?Fl /lZ8u1q>"1cY'Rsn k+V7"˼elb'?_\?Mwym's1Orsv‹3XdcE]CQ]\ njSbŝ; Eq?uuW0u9 25QA@O1ir 2'Jm?y@Kv /^ gBd钝#:>o Ś e 5{ tELvg ;@L)P3%/̋K %,SyQE-"EQ|WaĿ/I{+ICe 81͑b W0P9r|h옯]Uʟvl|QVǜ/aңUyyA{QKi(s{&x~ B$Sk_u6a zf,Iaq$'|X+:X.WsYSu[.(u?:6Ř%ve<$n_8)d:X^9Vp<_l'4MTM܀M>snsa>v:\ޱsĹԎ;7ؼС<}8#YWn@[} $;Ƅq;څK_y(DoǗ.s^WG,/'ܤ/x: +oq,+=~^lSCi}ñk3xL` ߚ'<5[ _ MX^?9&?f_Xc_!uPq˶ f8hM||GW\5ϟ= p:Wv7~۸3?pey'}p$8xﭬz3M: Gi? U_&rL0w!xW]@:k4u<;#+rIE/}nY/ǿt|(D<ևz }\k/Ú:_/)]Vk"Zr T]2V'9Q]j5pO}%qp#6Yp%{:/k$5L.hm6!vY#0Ev qGɃ窀TQ`|ŗ5ieO&ʯFf彶ZIŠi_`yy ի(bYcNi(խӻܴ̚8$ozu޼|1xvPxb'Xb.4-> @M]jkCy-O:V>Ú{l'Z@.vYxykoƎo0(ܜO sF،LYɖi;o;T1-7=9Yxy{u}?b76b6^!?7=M{XXۦߛ!zb>~wӦjEgnc^s_-/4Vu[Ȇ1\Äx\~F9q}xC'%yk&ͥ_Z/||ȏ2ȝN;<!Z}'8 77mQoVXn9x|Hg:.6qR>ld0ksC_t9yn7iΆ/_sWŐsyG^'.9LΣK:i׼ji qSA=޺؀c3 ?MyJ~9oߊfWo_kRC8iM%vx~3V׹v֯,rctNF6U+y\bic.>8ֱ•`:4ad׺>'wsyQ~uZ:MxJuo/qrpzݺS0$јU@]|[Z[~Wm Hqljl4O"UNmS8l>4y%rB3> 4ǧZ=%P|ynǦryF;yv{W؈XOM?myş;na|<1G&}VKϡ:6z|!~mǓX-/7?}0~Ll?@ <|@͏&;l4SQԶJ3}Qes&_kmϔ̹)?e-.f.g[!g,;Nlm9nϡwSD[ʪ4bu|XO}y˚ wcqؽĿ7*\:EorJl_K^Ŋk'68%?k17:[^Zi9&66dVAylhms7_䘼<6cs.Na|3ؖ䗘;cm .h-Y/=vhu-_mα!OO_}t'pO<.<cVš_O~ǗP 0<6 EI>y&FfzǯGN>b/O5Ѡ;M?ol;<9t|#ոcoߤ_ߴ:\p\c*Wkg56s{ a(VcQ>ƺcAWm2 9^7 5128?޸cs_㭿F5Ӵ(6Xl/ow/9z9̉/֪L=Hƽf;ӝnj9Wzu({)s`;&XȘMſa, sb'+e ?a7qc4;as]̇\Gf@7 bx{.&G8%bc tcL|9wb5*;vٿ=r6$_$KYQMjC%8'6u_!ۺ}^T`{1:&Gc]+GA}ނJO}&YC8'/Lp_iKӸǰcſygӶ=]hU]#ַ)(%)Cqb/;_Y񾨌ӧ=a/>q.}mni|@b]OoV-lR^˥} ?ԮOc=79iMK]MU :x> X6 _3֚.&S_ZG=n0]bCQ0< S?٥1br\b wſum`hOK^gV]a߅8c(<"O,Wc?Nxi;>s>" ^ Uy%C1$&>a[毀o6l $̩QB{>ҫJc?hL4ZXܠiks.,]u -DO%hϴ%)(Ibr"_ykی,i8 '_Z"8D+:*D㭉a:[a,؊gxjִ:;$7_nm[a xX;Ӛ8X&} O ֒q%4!6@m<8Aa狮ifM.x3XL,f0=9u\*w|AOrدܸ5L1Ԏ qyg鵁sCpI~:~swod%ۀkHnRSx#saO~2OW/}wRWЍ_2|*:\~;.#c#FSց"aU"6ۓ9x?oi|WzV ڊx[l&z`+p鑧ǼO'ߋ[9Ǧ;h?vOy-7v0v9?r*sK>_=WQ()PX_05j96ΊK_wʕ?w [ڽ7)~+mնS|ށdpʘb8p`8 TR%ɨp SI~ ԁ~XV%A:vcP}[3EGEbv%d); qcI2AvЫi n]5e"<[;?UR=Jf dܽ{ c>\UsO.L~~Z&Rؙ4yM;A||JC"cZP6'\z_xˤ㎿Vsڪ9'~Q^&U|'g7] <0孻xy̝_5As"(]oU;@Re%7ts`oNG<{?omG^)'6Fco~tlzw/_qjl"|as5?Mʏqwǚ~M#qᄏ7~oY纤~`g~qgW<1xk/"oIN>۱3%c֯;X/?~\0tK89ڎs5.o ~{ gs/x_'Si?\n9C26f+?(TQsV8'>DETLzV;ձ/G.> S fnԧSCqԿɫ>l/{?t57SMy:?\zj}""纾d!.7EOC0wi h[M?_RO?9?!,ďB2s[;_(Wu9j}Xluq1 ^o;r'4WE%A :[a Z[J`b|aUCzV3Pn :d# IӟeVluOw}M'>6sV^r2\>+eK[CI|^+L!q&aV[4Տw>P!]ą\ႏl1bd*Iե[b|@1>簹1w<-rS/Y-Շم??/D /@L3wW;Ļmr,4qίm~D=_|Scs+_8Zzt`/6s>jqWq XwIs5ZAؾG]1_lF^BY6aqAY]suo~"'TaǿɦGOu+ ?Ɨ">T:#_GƏG_d6^o]y8ug]Ǽ=?_/Ri(m?2s˹%^x|7sզ@W"'9E^ ? ='% juLs8:?b"?@>/# `"scovs2>l-_n<:{}En}aܯO|1ڷc?Nv޷?8X`C'k?gז?6Н!HTPŎKU!DGs~XD@ԘGEl亿 [Ľw r } `@Q>`q iM\ĀnmxH6~侷{`K}Q|5d?8atvB XHKU8 !Wm Wx6;'ilS7sb噶Խ:p\9wƆISN+r7blu[8б"i(6w"ɤwҽ\AMOcC|R,ꅁc7qgQ}<:<CbYU kץGa_C1XOwi oax۸y,GaGj6-R 8ˍ;6[cC96rC-xodž-|vWs? sylڱ?9yweǜq'qlJ頻ڂcTmoysf_7¿?p1>93^\DwǗ40&es?wǝqsRsc'Ǧ]6+Vx]`G+xתUjjj뾨:{___wqsj5p{_L6ƴ/ϛM_ooS~_`rص恠dр.@͜%AKN/g}?z/گd1%7.Ϊ/f}Kx4ؓgכyǭ$)`>'X$@Xż%/pvY9=TWKd;%H<ğZ=ښSZWqg$+ YXUܥ;ҁMxMb4Caشu,K |' aho{fY/kOE{ Iǃ.w9_djA7`}y7nX_u'[ɿ6p>\^dMHbTcZ{vy?U8>r~,GZkұ :4eL]ܻ?|jp[cTWE]8?_WI 0/WxZaw8sHssX5kvEg+wnX=RzrB$!~+`qSU35H&ۭߍ#v| ~*Plz/F> \QL~ȦJI+E΃'Q־ '/j/wkӇ0Z7Y>0]:. |BOo9Ow~'ѩ0_3cewFQMs5go-6u*JW1;Mc){}Ns)8E뜘76kS?8U7Z>*>c1>ǩf/mӟ>*r6yal\/ x:^d ca߈.* ^_P||%M<40>/oǦvar³TOȟ1oiwU{zd[^WL.g;ߊGՇ^dfq}yy;G8ppX\~Dϯ!ٺ_t\_qdƋ &\ߜ߾s}nܜmU 5hܟUq3aR}r+wK8iEܬzcӋ~;r|cHkKޢ}}5ߩgc{?8O|>}Tk(|aDEi=Xr88e}JdZ w#&8[xJ~-X[b.xej7 YiL;P\-7ɽ/ ɅȮ 홶07?|dzP6i*T}' [kmb5~M;1cHsE8%V4ܼW\7'elnIÿn(mSm> cG/F\TL?,+`Γ?tId+}")Fϻ| x|g[W{lż`/Hu(o3>yG_\ S\qAZ}c 2>Wr\k0}ܚvuJ~,WZ{kڑsu krPĈ-g {}[~ W?6oٜ$VO5.?׮Xލka5{%%OvtQ܉>jLsdgiT2qZ'^@s-`:I h: s `Yt#0<<І|U}B o'{wR>vՋ]'}a_/nIÕíslsq㷜*&:y'q%ifcyF X ~$d%QE/)_ qXvm*oK_ X?2 wF_t*Z&6ai@ᦍBs>늋MY0,װ_6`κ/ ٧r1./*^vpy퉵?Z|Y 6qyy)8na1goa_-l?i/ftZ}b31yvٵf8]Y;6f\lO77'JDּ"/D[_Yc6KŅ"P˸ܩÓ?]O/O߇w9]VO1O$pvyti&w'2'0  z[viϲ8d?s9>_oʆ%ُ< <9.*/Z ZDa+:ǜ|iyOsi?¿YͭG9jrOtߦƺ.[J/e90g)e%H.ZV3:~%~u~d_۶ ޗ2겘NI]80^r8&nD;-=zsJcuN^D!H8+6s_ IH[d'֒/Z%f.c9(a]Q\!|Az{\uׅ Řų5Ὴaqyce"Mت9* =zXͿ ? 'M< l߅ԙ޳,lSֵÄcK0.|k'lܬـab‰n\<+ḁ/ZYY*Nn`ާ /59R?ōu?{R/e%6U#(0=O~./]:hk_mSc:7u<SO}*K8;l˕<[ijq~#ػWշc76RaL}4t|MB^&2cq<06gg;Ŧfv8&.@=tv~CX7|NYηc3;/1w=["'O1uţ.ĐiG9y|g{#ĺw?D?I)_u zKJTyOR/ _ v r9L$[˥eO~S# 8)Tp,ˡk31| OEk8[Z牜womʓ_e-O_qd^j#sC_e4k¥¿Q[+s~os^ 1{]t t 0 %^|:͂jdOsˢ@砺~*4=A`ed|H+X@POk <ɜ\ijKY\_}+|+c瞨vIdXNÿK<__qrƶјELmrKqcc$yOr`}"t\MSc:c9A/HtPd~6xuO۲}̉ ܐwDfܑ:Ż|x?c06ƿop -vys]Ixl9S<ոM!%=lig=Cs}Џ8//\OZj]x'bC7_FFv[{GovGm폍aKCyB.`#>b8y|AX^^{6zC䱜|k*|kMdždܩzor{` ל |=\I:j:ݧWCC8ma[f09'×OE[L-_uN6cbg-ǰwwy6n9z!du9TpF\{D.ɍN\Z|y+IT؃!.<:r?L ʟ<`s0>L}Lll0B'|Bm [ۉDضgSrS,'?۬[vKeHoK#WsZiѺV*G-1SImKIkgӆq?1uOt+wn8 uYՐ+wW[1;“1B7O\ikFr^`R.ʱam-V^($g>١Wzti&}ť+y[c kDh z)hxE|s'nY@S޻-׻tX !ňNSVgJNeX'+os^H;r{.Y+ٌ`MFLl/mYgy?I1N-G)2L=`hXoIѝE[ C>?n/OcnSP[Z%beY5on Xnp~C}*~\UgE_[wYFi^ʄ:E3#|۴c-L֋|uب f?mO:$c2/Opkgu| Œ[/~*|Ćsd]RУf;|W:6Lw_xSsly] 85?E/.3*ZQkw7+>u9wϛLE16כ9?hۺgW)}_1[\㗒g5\g84`h_:q 2% Dt,vZM ,7V`摤⥚Dǣy.2Tan{mµv'+;Q:u]d $k P^L(.4{/9]p q"9]g"U}^-Gv!شblŠ HƩ_"g aC(j`ơ8,Ƣm sIfw%hb esؠs\Xſg|jE|v᫓xlbMԝ?K#_im]ԧ?d2X';uoe+NߕMwTƝfr`ıan c/87xʪ';sxlq^ hy*'>BÛ-|=bmۋկI>pp/4׿X}a>;#6;[%'_v mlO*dS޶o~{5ƛ]lcȡa8N9ty@p8 B+eA! S|kԼYp/ S[̞*- rnkX>?0Uʄ8-gC;ɔd ?,<'sYg ]mSY'p?۱vzz WhN| O}dom1y=j+?o_z܇I[EW-ɖvivjL\uCϹbmӱ9on쏆gN<#6DynpW Z~ӡ3Ou66s|u>#y5_aK44Opyx?FV[T1IՉ|?>*̩~[;<0j8?./ l.1,yZ}޳ƥ}+c|q7,?Fa؎eo35 &?1fwv!K/a &yp<̗w;_T'6ctApDrCr]|Vpi>Ǣt W|w S| l r܉!l,$  SX]勉HGFx7';Wk̈.R*7^av*8?Jq]:xr]tCNsO?Ac?-ͼ,7q2Jg|bsH&@j x5p~g"1P]} +u3٬T;x<` ɲtdSsZQik9Dyʗ\mG'SZ|1nq4gLqӴ^~=+fʹwxa۷ gͿiaE7 z{mޗ8ag0; Qcs6Mq1 9q&6hyw_򋿊Ɏ+)mE`s>y&i(0huFhp՛3J:&?s Vn_y=ƅr:އ^⪪UJ|{ݕnkSsS?l-t \y!;^3pŹ%]-G]?zlkEzk.[bg 2T-aѪ^? E::- ^cΗvTlV\iTsX?~貾_]ƞz|{.ۭsbzYXo5 lEGn0bц)wEo_<_|S.h8R͵TWu*u7ylN`盎:=?W$m}5P?ԏ EB+? 0d6qOPA=1F-ɝ~wH*( >%Ё)E(`yi cվ&8k)hIb[̳#2˘2U 8I$n}J`o].R.f`=0( ^a󵮕u3at瑶Aur?&_(]}Æ?bMMC+wcۥ/B(j[HA70b7sM$7lV:`>~5e1r.PS(z\7ĺG _esiK()vqa^/p1Xg+y!ErAW9;IO˾+b$+|a7'\Tl*M^ks-`N]YW UoeW쾊ٕu=86lW=?clSLeKYn 'Űr׹ {+|U[$ZG9v6x9x|;s-%/lK?_v*/1_ة9V6;8mļ /sۉݎ> 7=q>5`֧0{M^2W|?Lп{'zCL~-s/<_ ]L? ^ye@nj-9凯I[kb5ٯӖ1uɜjP1wltʃuo^?{+I,eݟK=*u¿ثx5sSfۻqs. ݦ^??e\H91)iX)ZHp F1NK[]Hlb+YMRϤjb8W%^bG&P5ɟiig2sil&)er@vp:±":ݵ!V%84ƴ[ˊj.Ve.. 'ź@ض_\ NM<Ws2u)Clgz#@5_:_k|toucط,+< }b&7lDֽj.^oe?'1_^)[!wzy{w34}`]{>x|C P͗6y TA~^Wa 烯FoxzI|-߰x|LO݈G4pka;CO&}m'?p%9Ƃbյ~3j s\m>},o}93<{__yծsׇ߄e4JeksGUn~{ak;W@3'Z+:[[?on3?,~e[UB2k_'oas}rYx^~_%s#8v 'p-\g/n%'m)]\rh*dk߾[K CI&h?ig$Ǟ?(w[^-sƯz~Ye 9\sOcbWD[h[cƯOTGl0ă\EjؔdžC܊n?oBD~8t遏IoQa'f*~: om)1VzՑNq^E۝lE JJ<ٓW-鸭WKZK?gj(P]/y uó-67.?vc/lNǁ&OPXXyMu"oM8\&cϵ]]-pf?xg3^Ղ%F4s4 3߀{{֕f9q|V[XF)LPB~tWvz Sb5eįȎXp}zA6 bD.hCasӿ˦ZXV'yxBW(rS7v9[Uł_`|?koj X=^rwNu|]&q7=EW.Mr7>jٝm ɵ3KѩlmG/c?hK8=CM* _]|>ⲻNòD{-/0hw;sy\McՇ?tɍ~gm4z4ga,?,9(}Aqè# 4:MXSl.xΑSӸ!X%?S7>s'XkK4~x]ޅ]!H_-ԾL}cS?wߝI>ǝb3&O _ϭ(}wѮ,VzޕO.yyUq1lO2q.b*7/Bk?5`@/ޫy-NGXcA$C=U_~ ߴWT9/=ax'+w7ʍvկ{|sv9r^9_-!~P}+%U[KO2K笒;ơ/8c)/$yNZClC~wlɹKawn_}].t6V>e^b>cuBZ) t5;I% Sb5j31'ZkX=8"~,@t Ryadb^nm$JΟls:jCaC3>5PWr#w}~|0'~FOǎ*e0MFw7URْmNXc^VWlPŦOlNmu>`ΰr4(usMD-at嚷y8xXݸcOԷq~nGL]Q~{ukߍѻCGw[kM?[ޝ-tu'ä /xZm_7srr?VM͍7u ?>:XaGUm|_Aj]+w?go;j-!_^ݟ*6XbY!|{7:bs2X*Vs~|cc:Xȫ ,:̼|쏢&>|}o[_Bq`w^i,1x+V=FkbyLt )y@pGe ϳ t㊄qidwrpoEA#]]4XvLL8P$^VD؋dUa̹$O̱J'hd<ޣ|cZe=0j>ZcL:֑dLZ;ڴ@RYc<.lÏ?gHsW+Äi <c6 G r*⣘bt-o@\wA`#ȵW,봖e?L~s]`/5>9 .wf.lW9 D}Tie"ub\]S~kBt'/|/CI;¿ʠc:`Elb"ΏC/Mtg *qrm~=9hy|͞ذ1eo~EhMsKO;iژxP؊/fu>q+ntaqGnCm1<xA#7RFùם-|zߕ˶~ZnOǓ?_i 3"t^ ]{ojKsu@ȔCy 솓;ji^^Dz]3NF +z],)_l}˥IU[{ߌS./T:<ߌ8ȿΎ >a0W2ryrq^זq&̘MMsg?ko-w\3#9oo[|&u.'tc,n=y'iD-=;7חn>\?F1tE a;(|Ҭy.xlG ]RȹoNcoYL}Ūk+-p?2sO}еu3Ÿ5WǦκz'8ϗz?Zs/}M>u_9M"WsNkv>M#֑"wWدmW] m'_LwYށ>i F/ܿ4s42K:> c+蒺"V}DsoA bPr+kGld,7 ?J6%HwLS?OsyF'&Í*Dȯ%~m)X%\*xM; ΏjB::sch"1Ou枃{9,VOOfl ?_|qTё9h$rV&5 b9KUK]:8~m~FZyDD\FC~p[Or%rwkìԧ1mފ>B]$y2.lrk1-G7CV_Bgr78t<6&0/O!:7_?|>M}t{lGM`j~8ɘѾ~؎7[]?U\ gIj_Oglo;קxiq<(ÿoyإy^cPyө'?y|'V\7SeY_ch[>"1!8BGJ<עb>XNDԬЗ&9Tw.&_k~OXky[Fw^N~zcZ׬O'[?y55]sV`樽-rk(7})X_ϓK_p>;$/c(1?C L,ȗش9M .GZK7򜯆c􇘳?Ps0\aonS8c9[[_v^7[Yνx{3egS5ob/2 Ms녜U ::PIK/d~ιl۴ (NiѦ˴ kEm6FEgbؒ`,Ӽu IK`]D|h =7g?^ÚY93e_p±6쇱)Slrq:Gu{Yh})%3Jz\8lU|vHx^꠹KmL O{0~@b'>煮Gnb1x(p/\R[+Ϲf7 V?ߖ\~1-iń+)oaoU,[t8s#CRW]LJK'E.BmKb%64͐lM #Vn r&7>.y?GU~<)9xoRc.kobʡ<H|6 9mY.,8t97 wt?89q|'`xCjEM9+nQb1g!;pVE!Oh痰r#~"BֻhEa>%|9|Ε,[{p{iqb<f 06)ɹ<&Ps#̐9rM!d& ޷mYF_gv6,2(k}S2 ~\;K?eXʧs<Exuqcx-*{ȶ{\1[+X_1dr,o c j駟ZO'.մ-e?yB^$wue x@,q^<0sfo"u?c:o*Ho8[d7I~;hn/a]?J)!M+ oGn>, ^89ld57޿^';ܷS?T\+P~(|,v/|#Ϙ8 YGZ8E7OY(rL'U!lXG1^;1=-bl5g/-o?ND'ØkwW_g~%>;PE ʅ!jPq689qO2 *"c,}E0.w"'Ox IJ3; ˥(cɇ](: E P4z0$QݐM$tr)2L6u_s6.Cgg :WgM`un=4||gJSWe|J`tYٹ/b 2lc1~͜jܪ#_ÅrEYYZ+u%^ǓӛX=Gg˄=z }Ƃjބ,X>?y|=~S.?ϳ:J`<fHX+_=i;bP>񬚫7j_{Š&#&Eoߕ7M|ꛟJ xT?#CeXIe$GV_+]!&FBD5=0vsKC[;q߽8nyN_0܀mMڂ<'(ߔx?_EZl&?_;X:6&X58ıľ3 e;,126u7QUc`1_d?y&3q2-?g#~KWXyy@ΥicwX#;i׾-+ IX\}LtM;Su0@ZopUeeN1-$.<6 ܁OǠ(ԩG,ĚݴewwP|r5u:fma!SQ|>V4uiI)B9PWQ౾#Nґ%(".xE_$7I<59qsf+bhΡLNfB'CsQ)wu7t_:c[~(6j &ᱲP/j¿x%U!͂nnrhiNOX -D -J3ytYTsi9X82^D2 ~_nO?={MHO,qÌSavU[:?Ɗʡ!Y愽M:]Or"K_1ݦ}}ΟKqۂ8<?/nsW+>`Wf3.~,Yg6a׎a{Nwk%Z$oNc!LTٯϽ/ӧ*ݼtWxe~7'c~?tSi]u2m>cϝS~YAuZ;cKt9$䤪o~{6ʊ B'(0Mt2p۟$[&lg(xTp9%`~݌3# h ՟tf ml湧99pssj3O H&qqe=|VS_'R&a W:Q9I,ɏ ܧ-TLSPXc@^`0Ǻ> uґ.387tsgm ٓ=_U 8ᯊO:D/He5L~Eιդ&Îñ۷5@/XpŠ9i"{U,q -0uܛF#uk?{+|nm̜%_z_`09f_:gY+?YQ)W|%mEO mz1USr']gGXʅ\8g9+\D2g.쎧ca2l(,˓HxK|o:5WW|s,ҋ5G}xJǻ |z.} D(k MGa.b?@9=tzKso>H~zT`6 ̇^cWTY!טɱ c_Ĩ3t4|ߙyp.Rқx8ؚ;6뜛&dzuB|:=u";,艹);??~ _"?4w)p=rsoXwaegYGmMԱ8}beQUo&_4 s(?&Lvpj/s8c:ޓ%"!wd,&No0ws.QOkLZƂƹYY*5Nm(r_lgB[w-?ILxo;n dp`ݜ0}XqwH |L7q9!` ft1 b~"ާZNiN(]Pq 0LTĝx6Xȟ9Tn>=\S_3> P'}{h\OGw?k3%Ի_KqHz$S"0nr Ŀ ,Wfby Cw3C65:bBh Eb_qi?K7)+l7gUȜ*eٝ` !joԎ]tB8 r)7+9;|lyQV6~v矷v\}OK|X4QV^rU,Ƿ)w[8ox¦wqlk7G2xyO?t x3t'2C]_,Jk2o7i$Pq,o41iz/z,M3?|Gƞp:uy@tjuWc=JD!A6[O?-J_W-hu=W'-'q+AăkܭGexS鑿i yɹ'ol0qM-6fzfzPU`⸭x(|SΏz/|D&s@E>mǬ׏,k| Ur5Zgչc]Oٚ2nkL~.W٪пĸzL&1%} e%_,_1%;cPJ6vx. 6rbS/}=m{j;w6m7}J8ܳ動D_c1$9<?0 KOr;ݲ e׺~H7fO} L <#wˊ4܉-e'̷l}OVrCEu9ؽ8 >C;Y@e=-:L W٤ۚA#Pb:w["qXanU2 Jϖ'+;8,%ꣵñӝh.m"'GR!xZn\O2aX?W sh3I-.ˁu,[i1m\ĮI6C+1I{'\&5ɛ'8ohR"N1ŋ[;qa۔u:^/E=6'?7_b_{lȋo8\bA:w~|gOM&Zq{ћOw @qU8Cܔ70JCS"E?hLUKyjBW]LYo~xR  {7F>_ky+|K>Lo 1CYp~-r MbR8-ǘ gRE8As~Y9O!]_6 g7A!]ݴx J{ߕ>eHLl.}V9iC0\ x{ǀ'_ĺ/_ bX.7  ]0Wʫ]Mm.Q4F3s(;$`4`6M`.%-( TжDT-KQ0J7.:Ujԭ=Ubb=o ]q.}omusb^׶}08Ķzj~axOhSzߟCmq8qmQm\eƓ,!o`E3-qȏ\q ~*N3|-5\߾7m,\)6߄;r[>mEN⾰rK2_WuX[\j{F^(؟˸'e^p 7$ILq ^?|9]_٦Ϙj.gUaQm41lg#tΣ)?c}wcn>Q(Sީͥmu-Doȗ,Y̶͜8/#PP/? :*/2o*񅿁An>= ޕ6pfaB\Hc$*o3I*80$Ҏ4& Yǫģsȹ.;\J ާ;vvwڸ3MIZLd+nIU*ZVſΉa!^)4iO'Bs܎ct9)oFߪ#}1>0ܟZ] x\TXr. ;m3d˜\~ȑ IWKWA}{+WX;;"YJS¡ԁ3q/Ӹ_ɰ_U'/A0pߞpg9&c7-q09dfՕVq8|~{;d9Z7yc[ TRV&&=J\4~!>7Xe_,?! On7u6>6:v؝q#c?@}3ǐv1"omx3UW<_JGgVOy;ÔWӟƯ 9|?߉&ު:M?T9GX5Mz\wfէ̗u3Xzlo;6o,O[tf-MVњ"[ؽ`KggMvŒ;[ąMatƽWO ;Yp`;m}czmy;@9 6cA& B9FߞpsW1cnWTb{?]O?^/^a.7qÅ O?߻^,ܭ,8q?0Oi ~(ȼ)u]yͣz,@ƛ.$!j~CŸC<:gT%Jޘ 'X,gyQ)v̑_)ȋc3 }.% t 91dڿcҖ*WWcoe;YP?)4fWe[,&:-Oy s/|wj7;}LwyNIZ9]\:}DkoǭL_O昍} Mxnk?^Grx݇]Xo>k!8]XE"G_*Y}<;}΃:JYW@wӺm&5SCMc_D}6i b1%6=9*:.vPtY7%? tSٔӉ {<^nm\[,Z_wk=EΓָI'AB]Dߢ`MʻΥ\cE0W56u`>/ǪdR?nsK|~LgTqڞW'-b-]|Ya~⟫aQ 6 =?m1va+yդ}A8T90L2I ,_W[c~<R\|E +9x祾ʧxzM~\c4K[/ţ;z/Qpa:e~$Ӎ~~,JY\H-Aq6/oz*}ڏqmuiGf^{HfNOۖII_vg5(n>@&oaK;mΑO}rgéAձ0g=w:_c^[kgq|ܟWhR55ruc[;uF{S<]%t؅к:qUOV6ɧt>v JC11]=ކD:mF(um pO VC$%|"2m +jHW_௉f&-V:is/_ Fm,f{o|W]}fvOr_Uɠ$*C+MCͮY寔y$Ծ A6:)oqb+ߗ >q;X{қ_o@yQFƟ@G211{Jix\LWbz~c/]z~7jQ%|.OrۺXuw0:Eyű:og?ҷV擮On:+bss7??MYMxj>+]ߕ?p_Tt:-3`5ǭ[G26hOt^G;_0P?\caU|qElӫ(^;EOpmR]<;VNwȝ%LϷl1sy,®C~)oo[virԯ'}]1$OCKK%NsEj{ta;osO5)Ǹ~/z72h?%ǚ0{_Qg!p` 2v0:O5N+ݺXῊҎ܇?ѳλ 7}u.`?U_?`w\e4 J~<4-pv(^t_Z@6Sx2ЭP6 hC5`/辊&]aUae?:v3$%9U >@A\ov16_d`v,v NbarmٯrJHVt9J@tBq5.t &7ښ]d]ou^qOcXtMlS^x;eY/r4|0udom$'}$D쫏=|sjnZ<.ʼn)1>mgTucC77Tf9'!2?/~e\?zAy`t9Y/;bc~#v]7bFI,ү"?Enէ3}u\oȭ$"t_Mdz[ưYdkdP[I^oCun6-?g}dx`W)?nWױ͑⡣^tcR08('?NkkzLaWu,\r3,nsvy~v/v~_xԮHK=fs,!?$0/A M4g}2dӔ"^8/}ETKם[hn@dZ  :\] .)0@cElB$Ys?~x>,(e>pTvgW>C@֍8RۜN"=v:\28WQl`nd`삕M8@yMҋ8uӘe6('wyaIJ,``_PB&vr#1Y`O:o\ 9:^L9"1RrT#aȖuvD<?q]sPaɟ*?k#U f Y23_lض0M,OKju0)O4ul}V$Gs{3z<񜯛.}/? 6Ӌ~Sl~?ŬX c1Ο?&n߳G֍?f\qjEփaWJKSr 7h6xT꿜ޖ̅>Yb?z9ˡv8^3be7z;l[q"g΋_ymV"йEG ' ]tb1x *ښt&ɲT+ҲKVlp Ex!O> `Edª[cSO<'On> g ΜݞA67nO'΀u⿰T ۖWױz&$F ܘ*:/60IKX_w63Ickw8=Vů5ro洌Xĺ^y>.nD!oO,B@'M̲4rz;駸͸1t^'t~&,_Bx5{5Ǝ zV:u7Lѣe`@Q K>y,-74c[<[x'׿CKeYūc1ןP_W=?&T2?*=`_/7/`ocZxͻN (> tqgT y,nu['p(ךn8Cdzy>oΕGxz#[_|>f^?[T" .'c;}-vأz<%ۗ/_,*YQ c#8%@`Piwc8Sn5\8x}E< =1wu"C_d6@: sZ9ɭ5H}>YpܸXwU|J9ZM5:2lAN@a{M*7ܘ+!n9.MVTǨwXR6c[$뮭b`@sKKp+x!iA/v܅:`}ǒryqW؟}r]XVoƢT8qؒJGq4 ޱh דlÆ_7';Ǿn< &y>'{ﭘUhsx0g_*~dɧWc6 c0d,%6Oa F?wݣc_џM6*| pOǫp0š?OJ}q#IX7_5s'=j'>~ Jzؾ/HQ#Hّ}.^&\_0xh 䏅im:^_5OGN|>bS t (7'WO/_ѡ/vr[֦'Ne{61QcIȶ?{fP[Uw'}X1/ b61UEBA_bv" 77ay{kQ>?<B[/:s_mZ{~OW&{-+6m!m13C /_>K!(t!H WOJ։A=:YE56anaڷ )$$ LQ :w`+&jɢvGf\(>^~Cv QЇ;xP k,5pOcG?(+` 4| ~:% 3>`/z_8ΙN66yU :N01&w!%=Yx4lH?Ns?Ξ.FaR3xA\@Q2_-;o oK{b0䈶V%nJmT[$.KmZxcy4v|2v4߅["L')A8f6ŮX4ŅxR/EX8o+]<qv>*p;/@Q٬3φ?|*%m%IfRd?[o{DMU'ylVps!0Ѿ7so bg?/ƿoZ,~ƫ hyy~7X8ĭ=^G>u| ]X"_Ģm,Mٯ;W`W,J9 ʮ* G?x,sӼr S_⠛ ǟ)bq';.)s?+Πydq@%Oϳ)OY>_ſ2`=OrڮDX Ob/?48yH~o޸)#vܯ'y 6 Cr-W 2 /})s܎?>NVi9mOsw.5n>/ ?S*1ڋT}Mc_ncÌ^{ၶ\% ʮlS*` sU}Kwߌ]i ~r/lMNյ&yu|dV \LJU{iv@pn7#bND?.P8+!Tdߐ~"]emc.i28*ƀ9> g":qP&&dM}v}P?GEmT1@Vˌ??S_gcl:#?ZƎbDyŐ֦KBJE`}S,A|J}鼌j\3t?fa|w!ɭYBɲYy,Ioв&t#2y>o!k-m=&+L?qyE5x5Z-n7 ธ;;p×x=|={>5ɢ6B8l,*fp\dEӷ͹)b5jN|v.+G W]V~de&NmqjV{,?:w7J]nӧV+y W̓ն3xXk>7X~WL.?WuK~aTuDv/ʀ޶pL`lS'm҈¯\ :`(|Yc Oh7~z=cµPbsI{:h>7ߓoDžx9/\is`?.m).S|W8?k{Mc?|b#OB_?D(O~WX <Nj硱i_SY\gwxגe K&ƂN 7j͍X6{~c,˝`OS?倊 !2nHmf?UMѿ?O :^w.ѹCoS]6 n~ߔc|kE]þkYc~oj>b^$Q'ҩ؝F{w`Pg q#y2<cn>ܟ U_*3>{"ÜMw>\ѱLlWetA+=+~xFF`z9 ?[VE?C2ŜJ//cBm1v>c1d%3v$Kޅe#<@5Up '_JfaF=O'\ې>_ǣݶ<q|Es aʓy}xZ'eAy ʼll7mCz\^)G_>GK7t8t+w'k><l}3QS.1 v56?:fv|1ucCV*l4īv(A@ub3"67Źq9 >^H|Oip}`L6:op\Lo>MSȦ2Wk31M'ߢs}F}_>MGnw 06`9:U;wNj4Sbt|Æ3`>bWO4=ʞ,^UXڪS(zo^$݆} ~LL &qL/icJ}|jϗ݉vŎ%6_:ڋ_65?_~qcʯ;T6$Џ]}^΍!')᝼20@g)q_UP羿:I?.G2<c$l77D+gfTCs\2@a{eg#, qcY72 Φb֝x7V^M-}3iN&0>1h NB%uRE ]ٕ-+H|_@X3aOOT0vV=|'ww fAzmʍMǴ1gs4-y'?h(K{qV,ǼS.<_`t3g8tWfJĹ?:_,ؔʼn,yc/|P.nJk9òW󹎷O'i8c1).Ǿϋ敮ݐ6Ӹ!gb;owY>ξEtʖx>(T| ߀gV 1X^۬c[hO;׿~p= 3~QoՇ{/\qC@,ѧ$}V9f!z~/'_V5O,M[wm+K,6~1V~Fu\rxj o "b- @z巜CgIעsZ߀cCMGl|%JtJ$}9vqKISo¿J>zz)0fS{G#ϧ2=Mm8VqVd'~9G+KR7}#n^KUvƁw賘˓r)^,z>]p'OW|aobG)ϐLV1 :?.Co}N㕤WuYN_kI<>lqo ē?[v1H Ά:ۘϧ L#7-t[7͍żhp^,O%e^sx;oR&-Ln 906$7xT97']soUL7v9.Gy\lpJ|m"OowCv(;+uu8sߺxm#}UuŽ0<=_|Ý1{74\sy?NMŎ\ԧkin?0_[;y>MVW9H:OAͳwpK0b+[|wϻ)<ۚ+lq:4vwˀ"0ϯk(}d_}M^E;z!hMjgPTkSE='愔`2$ƀ51%>RAz:1f K2ӕ+lMA՞) XfiA*r Xc(@ګ@kN[ ¦w&$Rl0;=lw=+Aio,;1)͉ k&3Ƙ`?lXX:/rNnITm\`ėyGwqy|4*M~22N1Lwt?LށV1P/㥫: _٤C`:sx\2 >w>]f`n&|%4|n6oHj-Rm+ϋ0O֡jS#mS_֭eSW9֑O?#3?yNP_kxAm כsN\yTr;?R6Iȧ1QmbZ9dkVvtQa? F7`ؽsnGmxWm~_>*6>Ȝwy<<8Y&]wn~עrx|ZbvȤxsW*ޘaqmnXmt:ꟺgl}M?vlpOYF mo徜PeQJ6m0ȎH'$06CvLݻmbi{,adcܯK8@{/ Y~}χ/ ¦ § ܪynn5Ez?oj].k@cl". =Yad'?TzsȲXj" U 2K U8uK$~RɄ2a*\e$->9*-MNuԏVCnO޿E.guj_Mr3W^¿+l 7vq1_S5\T_SwdGV\,0)K97\y]_|??oɹy06ed p Ol%rsK\'bGpɮ_cKS0"y!Lߋs.N̠i,y֭@`T7]?[$֧Ox~60[vPqgO¦$rElڑ|\Ď&d9%vr908dEO^s bnUnnVwcQ@yj-"_p=0%(rPW}Y'ef{M,$ibh/??0ty҈u;8K0bpwrt'x/8-sN~ л cim8ad)^U%{ʁH~ &b Cq2\_DuIMuws "ǟ՗%Iy~g]]r@)~^e%+Nٞ}j2}#CU׮Mk닅t1O؟X\UP.l(? sv+6S)^ms2]UdJec`sF`"ƨUʓ2ĸhcau\Wz~7Y&'q ׿~ܰ7{  "gl;`<*caޭM 1g[Ǎ|y[V:u|07frOsWS=@Mccy WL=mʺ0njN|;)E WR f+N9 _423ܷ$]39auc#k>ng}\M?-?vȺ/1Oi{لb_SS)i-wm٧]Kӯ:pO|+N tj<- +28*fh}0n JF#dFqPlyBNLsuAujuڰ71hINg~#S]dH᪨6ζ[,YduO\:ylu fJ|kmL߇{X8on+4xQ?怿F:wZ+owi⧟~z,}Q7GMq!oG w.#bf<'w8/1FēY,F.nHsv5OL.dQ"9_]iN3zѩwgtĆ/|S8мp;ؘbU}N'X<ж?!8S&/ܿm{!Yܟ]Kvkm&\Im1+Z6ϙû2d 'Fx֊E}O_ʹoHη'ês'>g/ K. W~o\,.yX4^c>,t}G/we5diy>I_-&xX~=Yx_K~u1|y\dnrWU}55Uұ o*_W?'|tiS\>v?sEʸ__˱z?c,?OK|/΍?ϸ#柏E`xn,XǂetDoxymi7En a]Ė(b~71rwnx"]cb<-|pm?WG]p].'[*,7Էց8Vc`-aߍɻ(N^aƕO11`zߟÓ1LC%},dv._߄W^Տa·^Fv4]p9}6I3gkK( > nվmw6c<J۲D_.b!^Krt:8jPcG>計Na|g9 ' ;Ϩ&IbwǦ,G&g {_R0u}h`UrA%lh}pp/*\>u!#HSxtɯWyXB6~KX1*+ׯ/}r'6% OfMp籙;Ħ4\̩]Pw_5$_>yb˓o`%NiOƆӋ˔牤=`EͱCMM>p;n si?xj\zy\M:}'xcɩ}/ǺWc_~>.@bA,,A 6I0l'z\-^+_cz,E6+76J_x>b`\\_dfQl-?9PM ONx'o<]/1<.fM% ^Pp7ePG')m1??-_W IVb5aRe__{\hy0p7XgK' Q%_6!&m?m~?ov̅fV}|O1u[dx/7FO?y*ܘU^ا |tr,Kڝ3sNe&^`q2_MQ#pl{Z$+ok%&W:;EUI(X .ƿ*ܛE|'[L O`Y&'=Ō}٪bl箛CH/ʷsXo$DeM73^y lik&M,7ᔟ}R`/O0p[u\`҅I'z }% }FdQS1dX_`zb$Ep_X9(S̩A58zl@|E#ΏҚ'*77'_?(,C|)1Nv3AlZYu4tn+/c=(&(q[TVIHݥM8>/p;Sa<y s2"&.ςqɵ>RC1`l"VI/1?9Not  飛X:ʾ9MxKkE+#. _\XמF46,jȥ-8mr@r|&Z6o/p^/XɆʌ 㡟Fqkm1% I#c᫱x vaG3& U᧿uܷ\k\7X}>I]^+a0tgCp'F3/c!=cÌ!;S? eQϘ >o"'?J7 ȷҏKh?nhb/8_`k?&/o;Ii1d!/ڕe[mxO7?مsȊ̝3+p\|kS~1vz?)<>?Kw>.vΘ(+VCXe\6z9r/x Sƻdb%{ztMǝ߆7N֎ݾ*=}obj˾1ᔻ3g@i_|[Q'f\0BcSb&Mj%AࣱmJpt-s<,Z+|Ѯ@@JI$Ai &(\BuXEP7vIqU?ۀ ~22 NT,iلScaYE&Ox5;K̝XTaSCe)BдȔsmRTq!ܨqZ|`5״SݟtbQ%<ևƏ[;\.O9j|?Z>%.^O*/]m2v .ʾ%S1ǘ+=yV~kEVccˏ|',~q<Ei;VS_ sݘ1H4ŋ|2.|_au>.hN|l؁K6pqTV<$7%Ģ뵸օFc# Len} ('o~ͶlENn1;n?^7rоssLR A?X\Wu9N_ujs ^Ok;rF{;{~Tz~Ѫ.L}1|u׆:CzE0zwSuv9fjâSEƻ-9~玩 %/&k|rmd:Kߨ?Au<Ȧ6)yO?8t8l@O.0}Ip}eens&Y>5cY>m6/Z`)>-)EXrEeVoGu>>cǷÇc#:|Ʊ|lqXK_G|=J|lW\ThWK ;YN~١i pͫu>;.[ȫ; ]yFG*/P= _~V"63śLN>v_}jMXٓ3čC_>.7bI_,屽䔈1^i??ж2-梿7_ƛbn1$!\/W㳜KO&Wy'vC">oc/oUl#yXOM:?ٰ́"ڂ~I_WI$ͻY rQ]r6= >9]hb;;LvD~H[[x> .J9>^墠DԝyIPs&1:; T$i&z+'Ė'B(: H7:ǜfMzG$UuveX(o>X<>µc9T&IEU\[=L;q l!mOv(rZ39?8c? |]; ܁u6utl19s`6nz˫'R&R 1҆],Fn'm4G9029:١HS x6XCd%!_&4.VD=$̱ Knq$86t_ѳD|5in+{nsJ]nTƘbwP?ͱKSMx Q}oS[s{⤓i׻Ȳ^rL>c,$ht+b.n,~V71Ƌk#g msN̫xxX^y<5OU?. NX& Fovh] Wev4i-y=ǫlۥB>sxǺS1d^)ֵ,w=?zEYچ=g }T~::WA )9rCrbq`n3a6Rst!<\N[)[U\e".Pj][qr>ږj~@{~2*HgkD8Οݘ+pX}]m߭3Dn.,Q`( Qv+W ~&Nc<%xh ڮρYO{ܦ _uX,!}xj؛gXFK?CSZ7R4mYǀ_\ԏ1_ms7ǹ{l3>Tn\m&ݹ~k;/^OvƓcaϘkW_meS7ƈi,E}\?E~u,7>osa7 ?oNWz*/yki߼c)psYsD?pNrR!ALxooRh ? )oq*|94??K;Lj(ho?/XL'F7JO^s<,Ul.E]=>ls1=O_L/wM@J~?0 ]-uaϱwRD߃\y=>6p'vT1S)ͅ[ޭv1ܸ͇E}u+^*Ֆ=gS3P٫k;K3=),5_q g,? "?6'Y)oqD%9e}~`E;s žm!~ "lV 0Il`!U'իkI 0lݫhJo=맏' CȊb>`N]ƯBf,rE l>`MۂL6U:br>$Vꢚ+&m<~DOV N.j T}@<ys\҅x'kDqUY(+Qc _ bH1PmaZ@I4Q6XMkjZɘ+*a/CV5 -sN../Xt?%r,y7^O96Q[ZGrN\;mbca5.G}p>-c'2M&_=,] ,8c&Xx xQB0=*cWj7nnjӌgQx{Zz"k.M]lOFq>2*NjoSO拓@G 2|@ZL?oi9w$6*s4NN8Nk,A6.K^6ېϢ{nbCγK_OE4y(ǂWR(ϿK{Gɏj])Lw?=u+:'\*pyj”*:֒r[oRX病>:jm5Dd>i't,_?/\/7BO \ڪPڦ$W!"!x>Lnѣ x^Z 6]rH0P^T'Z`Wdj[܎v0?饊QC|"y*tiuiϲ=XwsbRw _d4]\ŷ~ޅB/%nV~$(o*qW:Hdz>e.B NkoO~.s}/H;\vn>P>YBϕ Ż8,:8}Ăy~=op6y& ]߻+L)C[3icG o)f'HWp6g0׿S|t&} ج!~~c⧟~z,LĜ+ \_~ߴ'6_+ e:'c~G9k\Oynjf|^gw/x7S,*Gxs4Xη-~16sw|2o%n~ybzݑ.NV:)>oCq61Ὴmŷ,'wAiVs2.c裎s>?قa)\*~;1Ų'+F _y W&\C,T?xἊW,[? <:<7sԗݧyJ'qjsdK7࿿6(/cd|}..j L[t&ɨ+ac؜S0k@\#puLe꺀|b t%0u~א)M] kF&PD+ k{ucp"Ce\Uf kߐǝ\,'O$6k0vz56WYUDg#f%mU*91um>t1;`C}<*8^0?"߰: J /?N)Vs<ſgjs򛑇wGoSڸp%.XƓ^o-Osnq'W)E=`q6_%|{/q|jSkWT%l/1-0dYbLqq#j~c!"nXs~kv  ۜ[|J-·xCPlbyj?ߤSiz":t<%Ypؾ7kaySc.=Y;eKL.S%͹b]Fo>r O5 ?e҅Tx )g2ٴ5OԞ$7QOG1f򣛛Wg{WkmW̚zc\jBwE6~]:bϋwmq~.rl1CSW6 S]@|ru5Vu*}G_ZHѾ|_EhCH;EXIQV[0 HJ9Pmr<P9;iŽwM?V]$v"єr-e˪:G"7JSc,\k&1˼ תؤ)ʣ-WcU\32_).n_ wb45e)3쮴'"? 1{< o/Of9u4M>aCmoxo?iumSέ._2n7H頋 zJ;c9nA)ǣ:9:992ǂjXPo2O{mosj4۟?Pc9sC ?ۭt_?^]-|K}yMA1j?P3~7[W} As19}XVdAk_=|s'%Vo_v}sK=?M/1qs]*w9^qo}nX⿘]gZ*/r5z΁9oigǃ|;+.!_ Y'~[4|㛅,╈e^7=-^XrVnO JԸQ Rƻ"&(Nl2dƂZzq}n%~;KkcE#q<^ , >KL?$e%S j<< ߴO!Syޠ_?zExb5W{_7mŮyĦ4G@p'?E7o1+.U9_:㮯HMk1w1)~nij=ȘN=^ 19*ow/WXOGqe 8.7y_op!پ-ҙDڗcT\p![;S]qIY0+p wqˡV&\& ;(xUҊȉ. y~]y΁,w/:?J;'(OJ_4<-ڍN@mML /84WwP=%`AFH W`&>ު~Dv deQ@LY/Vv84)d>֡>jڸخfUi=[Vʤ ׫b ΍ %,S=i (j6jE=h3>a}3q9n5Dn?SO &w79K RO$|,EָsΧiw]pԩK%;>YwXT y̝6N{5fywq^C.Jy_-wF񀯊)q(O_\d7 +c|yN9ZԻu^z,oy^S:ˢ l/ΰ>s߄7?ㆉQL|؊wcށwNϓ<,&I{U\3\<^4/cas7Ic /?W(e.OSܬWrxLp|}H''o۷Hy_zpq͌e?\X_vmQwk&'rl:v's> R7teŪ;wȎ11b76|_otaywmsVG> 癸føRba@?W2ƀ=wm[k9E}.&.}yi_Bo|^O[CWAs \YIlԉ&ً~-qsQ# ǹǩ~8]y8ڹ}[_ RpMNu̕Dc tfz4pN (ڑ .iV|qA:,O̝Ne)pru'w{S^'F1Ck\㾀@Fi*-X.+oױj(߿H2^ |M`ImZ_VAnqX㵳U\ ֝|Ue=a]^\4ų(q!5.k㻙Ya9vOTWvkMPB6wqc(c]nrhU. 9a(O$ƾ\Hn;9ޟ1xe{9QӖٴDѶ.=N־bA%^vw3,?nk4^}m?)XEXT׷OWy*' UG|?9vtw4O'ϊ /pt>XG [f"3y{^w~c .oPc_=y?Toܷ1;?0_cgu>U m(ɟ3_⟷yp`b/o*&2k>UEv &D?fVkKq?pYJ/e]= mmW+]_$]Q[/xs:/`ߌK6[U} A. !-Jwķ,G7h]TC4N\8ͧhJϷ 0Cc.zqL,Z}_?@97v isu[B&͚ܳ9ycĴ?Ɓx w_6l_ (/Π*D^|: .o{ukK>+3~XĂx9׿uC?edxy <9qE|Z@Ý6߅Sdொ4G<7PS0^wW'ra@c]_dme{jdG5\(߼j(Yul;JOs,$  2=?Ź2 ߀G܏)DOs$-+mɶ=/K|_01^(dtяYo}ܾ |Qgލ~>8zY%_!?p;5PE{/=g{nЎk9ƿgvܖG_JU@qX?ec~xdԙmrn9B&Ig݌:T08[/?`ba깘գCwĿwLJ3n9~Ƃuiǂ`?'JpӎPqR.l[ls~>4w\( Mƅ2~E05ԔqW f-O?TXlo:|K}6_\xby]q@,.NpZATgJқ|5 +u,3SA ?0~?q1a{?_a%{)3I?!_?^\dOࢪ*Nb)noppg[ſcbĂ2bwWI"&h.;O<n@o市գb)ڽ->ǒDkڔW`fj/rJ|yc =Q\~KˉT1ʓ:']4L:L ϼ_m}^Bx3 u IQnxv,Mƴq{ge?ȇ+;M+|G՜ 2;Ϻx _j{7|b*ųXY;ykyJkm8C.|qOYfkl&־|ED)'YSV@I? 6A5@jU&$<֪LLjWv,$cOTFj6co}DK:m]ڤH/%=Rl4Ga|`{BU#2-q'YL}l@cgJ,>X%*9do:x8(XrE fBu%Ld_Ǜҡ eY3Z+ܜnL?,'`m8tҮ{Y?ɋV&yE]w$AOJ6%V(q7N"b7U` -OyM$,;q,Bߪ/c +[P+OA{RS׻r sMB,`OiiNa>ܷ"v $s q 5+Bhkg&CI릚Z!cpX{7co3Y /䫽il?B,*S#ܯbKK`]4v6N%K nS I o0Lr~?CnzP;Kv_! T?xlFf)c$ӢpVKI}1 L,}.n w2HKXpxҘE[Gn,Y5sl\Hskm;_Bjow\xd--Ac`O,)s̳$$i]{~㕴q4.E뵬&X0@=FH_.|لNgLQWȧ1~W!WLaVɅ Qh!}qӒJ.7U҇k"G*V{b bqէ)5z>%k/C06?wHZD|f+\6;vd}P.27\3s/<~-֬'ssOgwsw;[?IOH8gb٨NaIsxeV噢NysOc>c~|kdeCU t.O7!'# puZG)xDAQSOANG]G:L"v 'fk0»}7uK*FyĿ9־B/#FΈX )̍18O㔸bߍWK},âwto~fVzx%O?%f3cNuM&Sn6JsO2Twse>]cjn!fXg:ý_}Jz'}?CC2&xn$StX/U;,_trS9_=I\C<:cV}z /Xc2UmCO16yI<-` >X'y_)']wC@yw]w~yiee-!^/p yC_f? XiguTL qebgH8.YOƞtHc~uh9bGn !|Y}c;: ]a4TTIl|󰎕엻M_ӥqCE5.!, o8x=e N?gQiF7YNT%pQRӿ0+%q3AƜ"po~SX48GO&nE|\لf _t?n(H%L_wʷ+}5 ),jwڍK9澕^0w>{U&<#fwӣ?Bz_wKU`khxUn7g[?2NBKփIOz=w 7[<ĎţHJHS>9w B0o*_9ј3#e"-'6Tns -<29ogT6*}nT!6ø;ĥEoI_lWcwKvBmk~}"y0~_a_.8F;`Ƀv.v_`l1:_n5ǓsP/6y?60swG[5%w}3oQ~b. Y]Bc| g=.=￿c_=/)Vk~dz!aw^^*IPJ&rlOK<-6&V[QF%Ca;;s }ȣ'O~S2*rO%9sߏ_fbiWC.6yTSv  OxWJ~e6"ޙn2bZ!EWj_Oa|9ϥN݁osGO?jȦa w9s؈rWsܞ3ҽogژ*M6Ģi#WA>mxx2~;_OlrlOUN>nhW?('V W)'[^<\Y~GobZc{p6ه4z=MUs{X̧34Kz @~@;$'@{x'HpLW:Nd=.c[R,Uo ԗ^oIZuf! KlS_e__qJq_+wq x& /*\Pd[ERr1/bK(a{ Mne3c@Q23ٻĤ.1Vns9.4[f'E.s;qM!5#k:C+sHl˓fw<#xVww5'A3l;Z{}lOKa{;m'wLo,F.R?دNdZkv@wߥģI<\}sR3%xuvQ.v=|]J&=fg1~ygCۃk6>X駟}>GRs.x5Zuqߝ9TIV Ks(C7l~2]O˘_ǟJJ,@lb.di~ι&?}"u '0,m̡|[m }?ڤ&6a3ɺJ6 K<'v'q:]+^3E8bMuj?K3KɌߣ#.[[ M<-bƐrUFˮH!!;gXs+FCkTgNbcL;Onb{"&$Y O"O7!?(fKl!?۟=ا d\3SmaX)1'6W|!>l'>G)cXzq>XS \9> ;^&y,7ei.zK|Y⿿cf`c 5l%_8ᦵs܈SrV$b h(5iGkI/ht:V փ"@ǩƃhpL P&%l+My[X(oI^`%O|~? xd ]/Oqj`΅%&@p(rsMUzV$P|E!"MDq=\Q]Q~>-k%6%71Veyq -Ĝ Oskon.06a0v-.&1~]:ӣfz2qv. Es;fOGGuy'W19mz:bbM`dd}slBv/SFyTE\ ?1mo2ĽGQ^Bv!rSC>ݷ^};o}NlS1 lVC(?S}D\ @Q)?\ Oa}ީ8O>>Xtcb}VNfߗ 8[I}JOֶߓ:71d%{ {+70O?~ҋcKo<@WI\ d]AEt҂%dUG:2oۤs&#ΉH!@YDZ#'X%+t6hm":AGAB9L#h]WqmG֪FN۫sU셽KuqlOe&ā(iAk9$->}TOY?Ilxa7dAX_\5S$L(>Kn\Rʃ>w◴\o|<{BvyZ1F|{q..c_5;FvJsu}T,t7D؋6`2Ii{wmn}ފC?r8ֲ8]Xǀv?/^p,5 nScE.q]L8YobQqt:ƾ{?%dgo?_cODr/v5v=gG/Ʒ?oZ/va?^u[[%555QY'> ůfw bN.[?&#v#ÜǹGKv5OiA+0<m<6cSv\G\-tv[Ssmٜ\C/[o{1z;/?auX7'tk,ȩ|Uon'Ͼ6?SC)q+2yq5JWsNCkAX߳E\%rKgmoc{yyd͓><h+`r\  hEWA}c09R[s"G yHH`ZqSp-y y<Ź(!qEcTE~3dP'a<[F8ϗO?*n 4R A l O'_S13קSb8:E?*gOcgZhEbn[ۊHdspk@ȟg.tٲ窵 n)~=IeMEL9~axx_l s];m8m|16;ϻWןM3%IT3xǹ~~5SP_b=@>-)0_j.ىy{?>m(dg#_sS:y\8X1@Ge-Q䷄Tr;(˾]v~V O}uv^-?(r׷%~.nOr\tXjs!O_] K-ZmU?ڥ%?ʻ|>Dj廢ZYUKrT5qn#)_thxWln)|OlƁY~]j z ȏ*ۥgԲ1ٶ1&kh+&x>M  >acʫ)oű}*0alJN[&ǽ045}mkN#̀=\V ;[qa~b|-lƱ y٥K3km8gL7av PHBas z?a$&>t+D5TI5OƜKs0, y1e0AjvV:οWQXJ>bL:$tP$FFy˓N+\fkΡU6OF~:)fwUIfk~#tyk-ǡ~.b@a#Puy.n _*,˃Pb>{DW,s]{ }T u iYy(fkʢ^wl 9_Caˏ7~Wzu| ]8Ͳ~VZkߟ ;>ma?5wyG1; l4c 5s=K<~¿8lSdfc};αC,f$Xq@Lq탉wSWHk vY~[oierLΕw06Q9Jwku{H5KOV L% U4w%/ hsb`b.@\_6H \dk^[DX&JWԍ?sCHnGuek8a>L:2±% YH #@ m>@ЮL¦j\& 5OˋJZ8^^~"OG7Ulšk1N3l 돶"ݠbCaI!˅)\fk55a·0E2Cm3O=RB佖6Wh |xk>Xm@Bt>8v~<*&x*׶v 6 )+dR'Zx7|_;|OCxn{~M@yr8Rj)5noQ_'|qŎb?Jsy{};bs .[ݲ|>ա?X@w+#Bqs!/_z?uk{;5n?|GW4fZ~q&϶}F_Ɣ-.҆!{ F_lu#kN|#u7y0_axssQWONjش~at>>݉f<{睫rGWfS?9@QDDs"A'rH&&ބES9f8h @<.2?-ŮR.~jdԩ,Ke\$?}K6ǸՉp> Ozv܁e'NE׿pR<vDݻmj~.@pyV×sNҎws_n|!?Wsm_~杧kg?oKv??x.G$},}b_{"g<)/7ѷkhMvXo#T C>}-OZ}駟~p: l/ǃ>562w㕯UlI>JmJa?'sIѝFK?moTrfAm>+Sv`\Q..HAmy8O_JZY+ ?[qAN?rw6D~?Ǎ3$or/>E+**l^om+ѷss9AӸ[?w?1r| 8/9Ĕܩ˗ ڲ`fNۥx1א 0HvȊ$&.9mUbk޾Ӹ@NuyGGRоd2v>lQQD87L}EXQہ!= *Ƴu ee>2C=S+)Y$8/º-y] ^j|Jūm1p„*73#}sU&#-2=*)վ&K,?6c3ܝ ?;)J^֊|e k#WytG^u}f#?il'"p:O?*_ƮkĿFkrb.6'd##{;9s 3YWcvߏ{R{VU3g_o1ow^/O T=b‰ꮯoCezD#M]k¿B/O4ah,Cvx"ocVEn|mO}6:֔N,ky}w\[3OþgwO>>9~ uרּط<6h]鸋6[Sߊ;Lqޝr{#-_?S'NOɸm MEx ~amz V5 O#He~jy"jsw[/m>ub,<-Aw?\c|Aa?"c[צk!\JG8d/5Hjm{U}an:$񼓿OX8\ۮž$o*?e|jS!Ȓ3EQx&2FQd#ea x Z,$^% ɢZfuM 8bBILBNy5<^T8M*ݏaͺ Q;6o_ϗ`0:0mv.-I7?c_ aޔMPkROlw}!D6lh08e¦J/TKcg?T~. %Ŀ3\JU!q}Y$ ,Lkưh߲+T*cd}]^?딬1_|9~wpk (D8N 7;r@1ӺCUp&xC`FgU6:_I:abelCȞZNv ¯1&&29.Wdvخ+#ILZ60gUZ _YYinEtd2ȺT z 7*Dzɸ1ijsXn]-B(y3,E9֥Ȕk: caCO?kb0Em.s{G=~b+|&(B+ʿaÎ0w仝n%+V}߄yn~kNjO<0hn$6S1_d{9$6фwؙxmm/VOZ7Ӛ.VSm~C$mw[S:wuWJ/Zzhc svgx[[ roߺT?j¿}X3d>+qOK]Q@-"8x$c(6,VhtKX,於F,5>o_0}xUR|̻_%-[ %ʞ,;^MmNr!S9uyi.srD*^ufq%"/=K?UUW&}O[ўou?YXb7>o~WJ^(K~þK&"NU:<s gz q.uo/_@B4d ;M9N-t ӽ]B& WtQn6'vXP@',yN(U c ZRؔq$&Hh6}&e'}@/-Ljj$N?9mȖn߁,}"Nl㇨nNDaӁ$G[^B֗ɩ?sVvhMzv#d^mEͣK>⁁d A1@3,ԣ) r2<xb[)v>o 3Tv. ;̦;: fumZ#Od b,fa.ۅsw䛝n'ގmqܞZ cſ6r`3Oi_w/$_x~kM8uڨ^kq+z>ws7?65w}e}~ƴB_fAOr ^p]]67j0wM3̩3>l ^c)d>q%yzYXݳv%8:.?>'L7œ]O9pp'0`La+Qoɲ*yw[~W'\¿]$\xt?mf'Uv cS-/9JvrNOɅ<ֱȆoa\%!="N䖘6qx'RFQNO8;p8!G @}7?d5+t>oPv$1ls] c!S8P9 'l^+TI?1l5.&dZrG%kM He=oɒd`o N۹a}7|-PtP\7ljwsk8M⫰2!q%O\/M#IIJBU&`/yR`'S3?E\"("9+;eM`څ߅C@9XJHV3ɋMdUűZOsc_[&Yl¿….MkE!tQ~Jc.m^';ēnV'?":)OI]q.iӈyוIy9`{egۉ9;wM0v|6K&>ſY6vb/w׿ى _ZS֯' m{3O ?Z[h Y-O¶.vVwY%?bwڅ?O~M6p~O߆]:wWGoɾblg_%ev7A? s2WqYlW{..v~Xҝ(8C/~!]6 >a;>7Y~WqkCtX di/%?\삺T iD1/p.9 0"1N3A0l1L?2}2<rJbc5 Ero%M%[k.;z9hk5rGe] #w]Zs&1`XWTh*.e쳞aϭ^Osl ,c$W#oXg[t{va^_MԦoHE+\?:b˜٪"NvDa=yǘi[߲}D׼5 :BK1^o?OJOmW@c# ?MݸJfO?]Oh6 'h$xtPW8^6)Wm{ߛn-ܙ~&?0?cu1xƨ|ʦ|*}) m}CHbZ 67|hULp ?zXCuq=kx2 ?\A_ٯܿoͦrqs?aC"GTؼ]1r?\|ㄟ:8tmp}g)Gz \5qч@!Z!9}Y\)X> Z'Ga'@YR',X1%9Q{B/ᢀ8T$vꢯJѾXFy ;S/i ]FJ u5D߁J,$~|j|)&fA' C Gs 2̘rmG]1c|\{ ܨ5<w=pc+ba՘;I?YԻ:⶞á kJ¿Z2 1@g'=&O"%\' T~tv؏kc?q?Z^4NVs)9Gh/nm|羉r^Yl+_TnOyY\̶8w0[mH6e~YnbFl ۺF~vr-kGdFفU\+۪^X;1qiY,֞M<^[[vǞ-g}*YY TL/-q .!UWkzT28nk\oԻ<6`]wk}>X֝|m_*K?K>|5vdf^c۱GdEo$]Ʒ}K|*؍t~!(N+'B&vNjѩ2ϡHE-5`_á蓑;^O,+nSe#|m|և}GMZ~奒U}MŮE9wVJ<"2+$Ą O1 e9e~cf2ʄ%ɇOm '$%pS}6 /*׍` o7-Z8E ıc_|4Cbcg O;%_]m~;ec?;l}<ϫ>q_};zl]웭[5^W!sN5ǝ鰻>hb5ɭH?*5v}ՅN|8,FͬoW@<_]inR2޼_ɬEw^ xֺŽպи.G]x>.zFqQ*Vű˻'W-[#_mcݳ>_Wu%~ȷ} w/&>NmWs_"قerlj+*Nj1XxAh6e|nkq]P|H>ٙ6o'2?cyLp,`ݼcmօʹnxs{o_b>ڭew|{b\ShҀ 'd#@z/۝j\|"OxapԊx]g[Hb8| 4k)JXl׸01~}aaO*%d< ?no>MyxX#ohmځLF%[XqwϪMt@l$J_;{}aq//H倾(:ZJHCfCw XX4No;B8>f *8B!e> J]{h,˹ ~N(4QӼ &r&ʱnv]vr`3au: k&6xlܔE`q5{{pݹcj?Ùk֑qE5ZyJ& {^G79bNj|T? uj\1w~\{d= X i}OD~}GY#3&(L]l]obUl!>O:>Dz6؉ٔvOߧgQ/1 R^ap[Z_8Nj Mf^Y} ]pDžz8 ǧ f3l4*8a^٧oiclmStE?2ދ5ߘM/uMC!싲`\+)qȄi {<ߛȃOڞu}i/@%|xC uO$?7CXCwl``blO[J~ ->ȹ@iBpLHҨEd BQqn}Dp&ow,JsO.w7̙PW>|\6K xotQ5sz_Œt7Ǧ ?b$ݰ-hߧTH"4hj (Z8(DTyy?eN.09CscŶ|֊D^lZj6G+"8ykV#/m~ǯ0o_كsl ,~^X}egDpMLqVϜ.ĢPկ~uT4Ǐ "]E_8%U%oWM]ȴnѠ*e.O3'ٗHNz'j,/t_OWe0>\s>.>790kvc=*#$g?f'*b]Px8Y?!61|1{-c=<( &5wև@l_E)[8Jovl ~m?ǜW/"kxg8יQli%9ޱQj_a*Y{v쾝C y۵>s}.22QS_a4.I,%;Q")=n{_˪ޕ6uHboK1C1@$X]Ƹ]o0Oq}Nn!7.Gyn#}|~,kvTEIDIDA} 8 8hlvȰX(/s Y>TsWgyI1,''I8OBǦ(O&0I!SX<21f2~ b-sα` ;]&cpWMg?!rwl$6Q܆4v?Httq;ưui}Ӌ>'U\o呅]SR`V⿏Z :/_m`v" Ga t>u"Wl}) 3zm⾌ݵd'l_4;9{|,[a;>Ny3`k'i7?4vo#;meh'’ٮzlCg |vw߲};}>w؍3p>q??cB{9F2?6qlHoy~av{s%k/~グ6`>l3W:51i3buk)Ls팛X;]U1!=XDq~W_Vw 9(?r__LW^Ƿwtqg4k$_m/r/ZΩ~55Q{m1Ox<_1 a_ s~րyy 2Yb}GYQ8W6…Eb!U_CE| `?Aq׃{ܸRFڹ&Sz(wV. ^>|k///}Dc0Tξ~//@>& |Ej.pj?ϑ'J>zD Ǚ?bRd?}xKElDX& Pa2$ d($l:,l @f0ȵFz]iCzpr1(=:\nӉOK'?}p([)h9V/A]tCw)[ xM6eg;e'D?=NV=w-sqtRb `MS?Nt;m?~ߝ$Vv06LebLqn1¹T"vbZ~㞰̲x4shsdv7j]Ř s2k oSm'J~~6(Qc|5Iwg#/[ܽ [c?!qSM*rzD&1-ɛN~.ojܮZθnἠJSwO~{YΆGKkTLl~} ;0.!o킦q<|^?铬*l2odNOj~1lgJO'{}kqۻ#nLV'8ʭx?6;Ǽ?+Y 0m_Ԡ Js?p}|@e6lX=ytZ\P% ZǢξ:(̉ ]&m j `>LY# ؓd<"ɍG9F۠r^E$_m[0ˤmSڪd:L$0꒭sbo/1&mjjUPV''ð~VDr!!;݄[8)xaɘ-cGݰk;HbSUㆃ>_ 9(0&>eXC49dɬBH|e 9n~Y+0nsusY y3>ʜvj=&n_庣gWF=A7[-_ ~VC? $y|ߟ3W1"Io~s AS߇?0<XÂ8]q#kyyO6ٟ `x`r%OҍqYoWIa{v~*t3ݙ~of9 yKc+k(p ls?8Cw~})sJTq~ꂗ}&ds~c:`>?2>@zu[v 2ž0d}U15n"O8.%!׆ \[@E5eOZScEZ^80 *CŬ'g&ɹѠ .NAT" |L?[9t@2]& i &@.R{Jx-4v#5#$Ѕ1Uj/>74v/ jMK%t>8j-=@T߅F5V.bvMD&NwǦ۶eLǖMu,SOSwfAf~#i<5JZ~|Lηضl]p #⿿GLcB|g'UQ<}ȃq-9+@D[;t[lո8_6?c:L7;@~>i}X0g.8Pl hg,WֺKy?1=qo4m/bUp5Q!|%*`bi]Odzɵ I>++(G 4a`1.Ks gڟ|t}%m?|ǜ~~Ar|\#f3߷'R"bǹx2*Ar~IUla.<%%x7m d-OYhHM&z7٬w!n\Kb Fa[yO}# Ԣ pg*1Sr\aEu!}Jr ߖ5!%_e\,̃..C+ϒ?Q+b`{+)162mvշEp)sB(~Ga7oCx)mmmUJ-f'Va/EKYӪ?ٷ# sJ0'nnsYl\11_N6xwAԴ8Y/JQc N6򯡛ܔo7Y:5+lvJxW>_ԡ}б89w.m%'z~$ );-/S:6jj@JZ(%cޔ@}\@_$,A.:Ƙ> `]A" oR.~y_Ul𿲹jf2쬟 ܄j}ǻ'URy0&Mǘ$U^ST9vlW_vs"oQvÚ?"4J/ ]Ԑ/T&p§YΔbCm~m~=[aUANG+Ymc)b_;~;U|&|y`/"Lj9 ò-h1i;}ZϜ{\'WhO{Nm|(Wε'Ŗ_ ĿG~`Q`Ы}c?>*XŢqi?CevOz}٫id< l'֘lPoٹّat/mU"qE#1Y̕mQ_l3}VEOkNۅ`+ݎ*,<n.p;4ɷ~A{J?SuGYnf|[5?[u~mNyu&WciLK})˾d)W ?~g)]λ?6CSG/|?Oom _i/?kHoCy B_;Ыd4 ՟GB )ًqpq^TjmQ\&A^I}iH.3m]PShDbsX痼Y'Y<6dv'HakddL3?{|q]c8+wGr@{y[gݚ&P6GWx[Ac|A&Oh*}FvQCZ竓Tl 4\{S.kc1:6yI?"meC?Xq%?ÿ~azjӧ3?kwG?_I'hOE]I#;mW({%=H_<΅Q/]rxaFvǹw ( O-Zח+8n'u=Z6J_&¼ƌkI@O{|$m@߇Xiq\`cJ=ckX"zX#m:,IN0B9^2}- &d0]E'8<L_蕝$H8SaśKA`J.hyAu'{3!*;/&.c'UPeTf*0T-ˠ#%l"T oX|S--bAա&$N.x׾3, y!]r~S]ч>c\Aƀ8W/?'w}[4ni7n0Ρo|;%ſ1o6=a z"IcWq=iӽ--Y^S~'Zc#KQ3'Lۖ;OO&ֹQ@_s6ǹ"ql/2o'ؔd]Dalt s3Ne_;[7 b؄̌|L~VzFsX;^;a'@Kj)%qx\P࿐?6J#z`87q웱hb\ې5s?mM ,v%3VGK;$X|wڝCv_p߾(Oyq%[Rc6/p:u!C6.cm"M;ٖ6Vd?6ιUfKaV> ךI8vέ=c6Ɖ,g>aDiG 6oy=gaFWO׮~q?I淔㭶.T/xMMxW>-1fxW:h_b˔U}dx,͎t L90͍L_{{ϢO K^Ӛ_8!6OqO1nq-6M cmf'%oTףN?{6+u&w?eOjͿl [JsoOZC@_ kd!]=USu_;ł);qkU0%2w]{r:"rS_aNԝ%vPHhLyƦKap2fKD]V(htfIs"O|7"QC X%yV~_5N&K '( ]%rZ?m џ2'0cxLOSeMIFk >]aɪx()+!Uk@*{wȺ ,${.swGIIvN Ws|`#|+5*vwI8e"L.W_}C'%i_m=s;I9j"F*!yL70ZZ3!rM w?ɕqmúo'}tKC ;MdD<9nqych܆'n۪1ܞqH-ܬ+J6kt˝(p| a5skQ]SDakw[;ѳ<Ob?/R.=3gWё]%:d=e 2}d݅d/[|^?d#B>:|P]LRud7bӶ_q._qC2vKG؏^myħ7#||FLDx5`Q9!<7<cTev[5nɇRVk)Q)вq1a.kǟsyɡu9h+Kob, LraWS/(L]@v({ qql@Φ9T!P'`(lAISIn% ;Ͽ+]9@${B)> ӶE9ch'Ԝ>HߘvGX(},3³,v.*I8?"^X@&Ae; -lʄr}`F}xd|Bs VmqYkiP7xlE9]LEx6&^(-uj}Ոz?C/ WǦhOh9Rc߃oZFlLϓO"]1{mmP7rw 3ʎ .D߉_^ zfԫ_8?_cs"B^#]n_Fmw7;(-FIv ~K]Vk1̖]Yd.7_OU](|uQ_Or,𯆀b~I%Piqhd2|=gaWW>.Y5[UMI{$-_ʓS-Qߣ^=_,&&[|Z%tTpƂmvMllĠ5ܷ F+mS@`WM?,æϚ8bsY9/à=HW} )dFc)NZr5'?c-ls]SL NcGvzxJ)Q6&~󹒾)3MYNl} r~q]ė1Oâ4-f^8 zd1y e~%@B4v?ᅭ̃ZkJ/:dݢs}>@ੵ>Q3V%]s2[O%B,ga&d ydO--Y'VeHn `Z*P%2uxgX׷br,0/cVpb5[2P +iZUZI'>nq#>OK|cm3X{G(Q/|v r&p2[+IgKH`hB?Rw. C5Q|*#X ;d(-\匰OT ?V&'yʥD|qo¹3 jomM1v2ͺMc MD`LNk'[\ gsn$v+ [7uד k,e'vj'%$z-'ڹUO@z wɉT#~QҾn({&TU'8.``_ݛTQ++s^ey5)ظ!g=vAXh{S..\GG]?}8f{oyﯵ?qͮ?7yBLy/S]/Vq=Qr{2??~uO _g8&\??9d*Y;xLzᷩw{V?zU>#pvYlt;Um'Us&p\u뉒39a[*|.Ot86)6jWG9s8ovEENbT)=`4&<1X0OcR|fb>%hGo2jO@~0)Dٸ=m,L:$9>x|^@~Иwm'kbO}&хbd-e/~\.n;wJlu> z\X$wfK{=yv_`s:ḯU j8$rBle' 8^8?.eU9(@! 94Յb]u\O[O|g?(^s@o|GoMSu>ka|nI(aGwe}0ڕl痜ݞ`N~d\ 7rhӃrceemz_fװaͷ%z?Ǐ=EW4Ϻ ']/9i.l/T^X-^v?n _QEl 5o9w^@_[/7?Nq}%_a'l-./#JSEm LO5r5O(aϪF}8k*D2#iWrk\gI{/]-h_ޯLjz՜EKz{9/>IucڌseXR  AHFlIBBV$IPMς;+f!Q^%^o[t cNAv؎>)M$$}@zq5W*@I~`#Y0 h8XfHז$od%/l.eWAwC~(Saqo$F}?zŘ_jzԖa}}O?0.z+3εk/&dC|}\5DG\c8]q s7kv>/Qk…OAk'n:t6GX&_/ wGZ@W1Ory ŭ !#֧1s ^1'򬽯;oM㱨 Z(7qxgȄ 7wM/4%W0i?;O?dmAe-Y2e˸7B񿊋;?:,~q׺|l(f'wcÒ\j@DL4uOX8J7{ڿG }aO.Sj?ֿuY(roZ^$od[=x>Yμ>px/?sl?Zo縫5 ߆Ǩހ{_ WS_0+5Wa Mo'J1ݒIw䇔Vž:R,@ؙ_LDOWrja]8a8XMH]Q>/jlD.@P R5^cskHN*E @䕅hĨطrJbdW2uHl-x?'͸NJ?DAV@y^)ebe+ >&3Q}^s$KH4ƻ5aFXǵ E X ɼo'; f'h4oEMQ9MK%2%)eV =RDZv5~<-FĿ \Nm$~9`—٠[?yB@Ȋ'X})(o!أ=aYkm G?@T_` n'},v_>%;+|r| ۋq* ʶ--az٣-f㻺h[\QqU? 񟌟ƉUGqZpVȟ[ya[-<&'8]DEUy&Sq cYh缰?%X8.W1a}C!xm+Nvs?m*2EQ'Vq>gfoOq%O~8;t ~1=ޙ.'~wr oj CAiL}x>Sym+ !JYnz7?n1vU~X鹩x_Ox:  _q? %n bZ^]_Bc} '&)qmO~S1aޗ`l|ʁ;JkXLY|S LJ`EƷ BF&hb@_;>[~yWĆB vXۭHG^oMs0JsWb؉r3v1by%r݉n!-6}7a c/cs%iVZkg?}mk?\OxYء#WmDrVl;sB1hwtdOeg__.jK̶?x/lVWxb>ϻ[bs53ݚO;kXg Q+Qm_5o7mcroo7q MpO9շ. kO~Px "^U/t뀪kqXb!kU?%7x5X߷>sseR8#AMX68>tS" IJ423bX\dְv5LJ . "I1V?ə&y+Uv3pZ7נoœna/HLƫӘWhD=ۗɷ- qqiH8u2:XWp%{^eq>Cmq !Y/ce"r܋1'^'?ϛ$|u}F<~a?Ct\?cWkbns}/GwaWG>q>P͉dS9w̷$G/kzʩ}'>.q I+4efW{dz$ $ gy!_I2f=?|-+YBN>xܹ!4̀Do';ad`:1gLjySKԦI_/gjk-zF[m@z"GW$x}L6Ax"/G>_ԥ.) jGP q 5W6؏^ %;+WducV,l yǏ̾}ӯ<\ӀA9ypvU<OϷv,gbv}|q ?]KXXaG@~gH..{_3t&u?]?u-w胠;w?'}J5+;1P-8l>w;Jm߉c3Z/? sm5-fap-/f%o/t /i^]lӶ& r%r`sڢдlZvOTrt:A_ =I<țMWߒrӓdjϗvɓsgi\ |J D'#caoe؈5*#lè :~Uo'YO؝ 񤡚kqțږ57 Gmbe5b7OM㏊!3)~;E $?keo a =섖]86I1r=&~(7&8LD>d>Bo®6v&y/?ʍ?![+jۚݽk'r -|[w{aJ[$K/ZmY~n-AVǠb"ΧrON!*l;7ʴn$wekke9{?K[Pseעܚ17#nAu<+MzlyË́Qfk)O':/M2Z{.om}jv/3 JŐ pV3˒}n^0DW h9Ij\FR>HZӼ@RHdRbr5g rP7Y,"&8I JRq@i(_J1n]ض}ľJ?{߬ʎ|_kp;rSY/, [G5$}&7)?6 meDtZKw^ɰvqtybOꨰOZOkQ9ضYS}<>\<ۚN\^*uH'9U\N|bՃ9yN6>`i~7~6ƭm zqi=C%~:l c~`.?x7lf=]ey>좣]P;l׷ъw})L "rAr*k~PCx?iEw1b36VGC??͇?Ǐd$?/9:?z[{>g۰/2ئ"'9Mer26>wro=Z <.mgW8#]Җa 7?6[_y{2 ~WmcΒ''FX?WXc}3]刈٨n$Dy}O;,sqUvX'~`^/]7|1sD;yV:P4 (M | 9 6!Ox7o|ʀz1U*r!q!H,`z1>l 3&6eT Iτ.+xMX>'g%i=WKl3V4 iJq[V%Z[ cEN|~g>[vߦxpglȞ N N{(Ƀ2>0o$D~0znc\KV&MU1w5.6OTc1]u6??_kFl7]PUp: _nr꼛TgMJƅ$LCp'5esSxN㳏J@Ǣ~AdV*~y|y`ƿ{s(7C F ٮfb_'s^j;`??y*W&H+F#jW^lEF6IavbS:C-!@`\|HI| _u^Qw*fÅ>rM'㼱|%>Z%T9D2ʚV7u#2#'g1ſZcKlf3m&]zvc 9J <$2ް! ̖dn$vd@^|"%)I_bnUJOl].E\;g'JRø$hߨy-[o\|sΕҮSy%V]'o~%n7jP+ua>Q8oіO'9m3K`9˿l{QGո+ T TnY`<LlU#fֿo>/.sfT_3~ >(' :anvlԲ#0%X? 1i.1*G!oi,Wx1ڂ&-K\{\&~ iy s3+*;.*Ob5$ v>3n'=?wSG}[pHYD;OVT~1@`2fZ1.BXҳ^dOkU8OIѧ1nECn5^%FX }+N_*-?(v'bqc%9L. 5W"5!?tS1F(i1Zx`Sk#΍eosҨlcRq|.lt:=_.bHb!R.#C! S 0فh2j7%f@) "1Nf\BB`5!_ư~ `uC)!^JXLך%x‚Ln4ǖ¼@cJkqг}۠}ϠP.J^T#vN.7Eg۱~9qok-tINuѾ@ՀfYM>9h{XL'5PȈ/6u17o3A6Ww0%ojmnnsuY+3qI+jY"/^CI?llw]Oք|{A俰q.M6Mq}9'a1.]+:~ .;m*>& /%]P `dQbV)Gw9UTNOќV?4Ov`So[ӟ}?ڧor;;aWk h|sC? Ōٚ 8 s=Y]}CM}1`t} .QV?Z|<S+\˄c|?~<ޕn|X~fV唻Un y0v;L8!G fxnu=Dq}k-?-/f,5q|gsFlurgڕ}^6 C?t)CP0'n_/ _;<m8YKTy]ֈ5M7IwWL&6y)sELs$`2qtc|FpW@l똽#حe dKB1%0Mm'܋ s n}qtP XjC #}.a+&gK;Ӯ{y0qcS>ޡ8Я;%Urwk䁘v{]>޻:Jcˢ܉`xirƧܚ^0'q )Xoj9޾11`CvW.6֦r9 lH*Vf]_O250'H}$Yܮp􊾨*&پtqPl@/ v2mbVqF⿊( .w1AVw{ 5M7&UBXm9QgVݺz.CpW?9 _%λ&ٮ>.뿈?v$2S:r}gd{cgU} )m3W#v~ sS?s ~qH#W;}¿/]m 8q_O:JWVvփ:뚳JO #|gz;'_/#dݺp?P^~Mer}ZԇD'k_ŭSk#wC!bǬpo@y9bSM8bts醺)?_jYKa\#ʙ*V,ƿ9Ԙ Hr9ɽ:4ajۺ5/>fuoWT4YTȂ̠D k|'G(;)Bnۅ3%&ޕ)Nd߱oZaDe Mي ZIΙ>?îIVl#T"HI@E¸?<:՚*,@k󕹮 oxC2!;z1 `{ <~1p\\|%;Y'U?.7;~'161~ב gﳋrؓu񝈩t e  Aeq%db<\8?tN&m)ȃ]8oaSɃvlFgKlQi>۝~𻽤MړBq5rT6 G0[Tm8א?֗Y|kC(--p,S}Mϵ}%Oybck>#mwFg?Qrהa׼{x_aoU|s >kmgl竟#WYi?E\qbϠWvQrɿ6>x0G ߧt/r,os[51]fo; JZE69sXxzn fkoߙnv)^tOqo8&ԡ[/w*5cr6&Ǣq81]#4A%]GS_ۍj܄ 71Ir.X0Q|s:v|vv~M>%6M5Gޒ'v=Uc87É=C q,Z"AXeylj%pbDF8129zEB {M0DO8Ѥ@Aw)T&D2?mSIGe'{_S&]%IeEA8{RQ*~)Px[cw4' /q!UaDclJ0KHhG%e+ڛԺUO فyhQfƷ_vISV̙֧86^wb1Q!Ė5OU]¿ҙ¿mLJ~[.o1'.3BKQ_[ͩe- w ;b.p&T76_qmg!ZA8^~ }zbCU> ܾ>xŹ݁MwrZ{'x1ŒxO=eӜǟ{cH\aK7,s+m=>?rmo[msͫEh;s~`%km̋B $u۷ O] ޳>Ӧڒhw3ݚqs^҇Nd7c7 k5OnH<.Kl27׫v'my }3>nbxXz&c[!{ڶq1הgLOrȱAcm<:]s ,^jbdͫzcTy!mźy13?AطsvX?cA[k>$)JG^Ti% :9͗'Մzt^ANRI3M8\H|NHNPiBS =S(yxbaM*&3$1'ԇ_|fyx,_x@0ˌ+ rxi>Q 5B)p8Nڂ`+ݱh=m迍X"s|_4 v KK ̱nW 1O8FL)c)!t뽧$˾?;9g'DN?;Nb{lk:`%ƶ?N; #FVЄdN;mp;b  {qWLE_'2S* f;F?,v2.,Xv$ـO{Բݝz文R^SI+9AX8εAcaKqֲĥ /P掭Ogq=/>gC|oD{oqZ ڶ|EB_tgy+]st9/l( T?3)wߣ xGOZ|v\3}ZxN*gkh?Z&x[H}tc?d/kO/ ŘXv s˗;3shs",s/lj@ '%{dqrƢJfL宦?yxs9@~)cplbR"Ityg8H}h 9Cб5 Sfp'b$ vm}㘶k}|Gʽ4$ $ZĿĿ7ņo:TSAd!f~ǖ?|/e]؞@9w){Mj%yR!sxbtw nxqVW 1m>?:[Gam_m]4xX \\kw2b/2S s9ϥGNPnv4w.sh=ſk1v>>1fw{䯝W1G9/lq->[~ [1iϺ lYbxnQ0oksډ+?/D?ro*rF7 b_YT>heNZоpgך* '}+Mu/g۳\O.~`}Omo˝&cdD_xSY=c]ص8&kS]59xa^ۨ@1*{%懽_|;ߙOcd41:"ߋ+y&B·Qkעd5'>C?=rMooNOsǹbYY k8d>(?c}W.~>_PrU>% ߒ%Fԇk 1FBgcuJ(3+&: HN1`4Ծ;}1e_2Ead}ρ:(Iwe_v& Ă B/˸oڤ/ ]Qb>}1<9$)B}8$y[k] RlhmpN1B6Ί@d煄s*dǟַȧ{/b™1帢~rE?~o'Dy"O1Sk..K<{W3Q6ZwNe~?Wq|Α!?gT'y43 ؅sg1owqN'lNvlM_:S,%1%>U< yD]HVqX4g7hSǿOEyQ ,r%O qd︴LjIOZ&hChS\?nƾ#n3lGC6aU˸*?>A}S*.v%z?xt%_|2]-cO>{_8J_n첝{'/\|7譺(M"oϖtd S\18e$|)Y5ݥs+ފ]]&)g]}/o)Y>p>־|_#56 !f$4%GAv+gI!U)X9ni_7ġW?o]zvm{20,$VR0gMa6ƾ䆘q .]Ou$kÊ)q83 $i L ?ūk%ӝl1ŽZC`=,C<5'_]sMHPW̴dx5U3 F0rุr};x=~?OS'XP?ej?4qScFaG}a{~28u<_Y_Lt0}\sa8żWR)~M^2g$7:t7<4{7v~wCm.m'W;O9sODV>vXĆiy-o1`OZ.$7?{akԏ /ul&'ELE5;h_n,U|9y6N~(݆S9۱3xp+? >Ts}'^|=OnnTs篢?􉻟s#|*lz6w`^I:vAWAQ&߾~_'ͥ$.ptIrr$ͱk˓:w т@L'-u?\оL.TSmb U|ω\Ns@~pҳ4qgmk m+VV ӂnÉ 8DGz4WiaxӀ63QˢcZa?^+%xVW]e %nHքmwڦ߅0lJE6,~،/)qx>idgEb~='Q%lߕtCkP㾉o܇g[DdSN_/|xRy1Իb`5iI(qblos/Yrt̍}h wQx}3^1n?ri!N1;]Q,M&#oj¢VSxL yɓ'?sHdߞxo2?/,:܍?X8G܏^̚ F'?LLT9Ø'Ŷ76i7|&%l|J7Qk#gOwcW8ߎO^\.xWmaK}>ߪo{↢V:f|+vrwSN:hM4N>>aXێiwT ϶?QR_?_ΓCn֦sGp)ſ*GsQ;؎=}n¢ 'E\\ ZKpXܭQY*EK_? X`IƢne`&*6%??PBw}7NʉN$o%.ȉ6xgU_-DŻ e]iW_ߝsA3P_Ӟ Tl|Ew}]+g2wgtTL"{;aoTEf[[(2cQ4,nHwTl44w'akEN شDUk2NnBaiAW}7B9*Wĉ͓ q"!. Qs +MnnS<..Ix4S1]d,?CyRJu)AmxˇCn~<?^ծ7-΁6VPuوGWx؟r~k!o!>W8'.[zy`_-(6K?OˎI7bDZ7X~Uɜ_yWSpn?^e7O?3Z3L܃>鯒qp}F>pqK䀰_~^ !Y4^_~!ckӹ̝^_֎WM|7x*ӗӹ6gWbah0&֍rT4YJ: xabNj 2(0$;;n)u5fP('2Akn*x:jB $ok~$Iiy}B*+.`)`xX g+;+|?\lk0ߔ?t\-]6U?n^(Fvr[ˢ\Ak:y .IhnS,:{?d1oϵ07蛿m}M j. X¢L6Ư}6Ch+}q%K>6dnѧ{ㆱ{{@Kt*ƹ:G\կ~8YO܍ {$TKkc6a ` |ő MOsls'[:?x n'GN! ț `#+;f6}?nyMkFXoOTD6y 'U͓ n낦=}Sϕ7_}kRR~a0slw)pG,g/E`K\ {cCre_8qclf_aa,&'K@$V~J9 [{>?S-8:MJ)e99[YK S7Q?E8IK$A^{O$rA-q+%FVxkˢ Q-d};s|={"pa9 64{ÿ}e+q2eҝtɯKf 㤽\8 yJ?w7_n7?d??V\X߸_M Ϸή~{sC) 5Li?龕-ɯEE#1l9ucV/4f(?;h|$y5o[An8 ZAL+^ѕ,czEXFEh j{ANW{Kql'Q#RS?ͷE8gqsCU*^r81 ū+n\IO*w=}e?' [] Q˧ mS*@6|aoIx9AΥUk+sKp;Y␟ͥ)wK|U4t>xn'xN Az_qc]?LlČO%O X yCO@OcXG[w opA~Rա7?."!JA׽x_CrR>dS[}04m._H_SolA" }}{!w2u/T~[ ,0\d$_8l{ԱZ[W6ChL| /E~o>N|E<V``ӱ$\PzAe.1NK;vsp'%8\ 8+;9U=H jtml>Yq2 -. Jpt`:KeǍ 6?Ogk6K[4vɸt w˄#1/M^!ooےc;fY/c|rv!g2>""7D΋b1d;aLb鸀)@1o?Cǜ.R0\xXCODBzM}%y bjE?%_ǮTzXBOZbbW>q!>0z1{8K਒տ3nOg=HӇ`+g{?+zyY86Ys ֋"8֖IFf'G:aU?L'}'Ϻ8{j96߉Յo_d܉?g+Ɓ6rpaneAIhiq!Wє.EH`B[M$+ wxS@zAY e3s[:'0Ogӣd[0W'NG׹ZWWZ!L/zMHyđn0D?%NP4rv{!.{ettÜ'&N=īy>i|\;m.+\..I;+ʪ.b_sqq>'is`;&/OzM[m%idSzb?LN!.N/ƶw^߬oAq5a:\, eOۇMX߸_ys(5F?T?G>2+=؎(q\xzQ{>5GpʁQ?K:grݼߪx4C6in:\m0M1̓@ւa~y6py.wj_I g qÓ)ñUa: C1hjs M='S"ҵM}Y<c8j8X_`+U \/>ulWkWӇm7L.scÐ"p@A8H};<)4ƅ쓘j1n~|:JobЁcIϥ}:]͋Gʵ)׼GOQ(y_W;*y~+E[C,s;w^\¡wv?c׻#K~~>[¿~1rwXCC|%cÁ,h_?]obnXK6zGa8Ws?鳭/fU쓶VOYNȮ&M' lL$Op_*C޹iw l& RYٖ^_[+8W˅pcdLh& a :.e[N9Ohu(pR<һudZV(QvIQW;/rnm"G9/ gS=ƢWZ<>cx7l<8'D̅ԵDUm*2r~[_16g#ML ?o[.d1'N^kg_J'Ձ?7ēq!0ꮾM)'!|>9|}7_G?NO Ǻyί]\e^+\b;S~'(anrES)<X({/{#.Ǿ; |~q++;xy ? s,k;nڍX~x킡Ni p Y_Vژr4'v%ۮ.]n?:|գ6u0_٬#;ܜkF|+KqszJ{UN:p}?O[W\=`z J/:w1}Ŕ<7-o_=t<6~ I.\rqL#!S*@:uN\R(@dO].(AXuXFpǤ ܷpҶWX5IbJKBGc]6Rɘ]Ҝ|!uj&rS`h$,KtfNci36MvnS.Y, _\zmKځv'DI,̣h/+#܎gC|v>MY@mEZwCY'>Vg|75ǢzҔ(϶?j!O9'bygKqi"aRƳcɒ0'Lp~;ylنKiƯ9Ҽ<%+6Oyˋɀ8pb72?j ^痥?Xǜsl;_ JxŐooy!rǛOJx7%޺1EO9N>,ds5~8wc~?N+JWN@s752QwKInkl[WƌH<1~Z`ǯK%]xt~vp+ֶ'5w\}),mLK_\X&OF6zo?qb_2yac-O'gbc_kͭM*q!jn= y!+{]ć-q0"gsW g\lJc;2ק6oY6qh߭G+_ٹs?_x՟.։1ˎ*&i>&A2^0kTmNRN?E]h`jK`ur{t+ݚ ?s*/ 2|n82HMos(L@@w$i:m[5 zn%)RkNX*15Cv%߯)|q;oV%吰GW~#%xWub{O- d]Ln}ޱ9$ ~e[MSݴ)ws^OJx{/w q#9֎}68دNl+lg;& .6^O4E%Nd=y)YpԗYGg^-/K/XlK~#h']\.\r2'"26% %SLK407Je"&G;|`&w.Y?ᓸP'tG듌%o2GdV(3AA{]JS:%>+/&җf1G_ BFT;lWwv-NǛ_%fpLU+m ??~Z]B+ՅSCi/^*WG0Ck#n+c/5a)̅2_wvw08).@IMC7p'@;MZZ+80>G'8fgir.iP42y-@tM5ICIues$>/ z9i,9-ǁXb#L9Aǚ;~pJ%+ r|*&&RMt\!/wz_$_$Lc>I9h#cQN]9?I}y|*skZZ+ɼ% 1lʏQ)7+K'i2TL炋C^,$FE@sJn 瑩UqVSqBofxX'Y֎wkk\evY&ql<IK\tʅS8>"Oٜ &tx U%"^Ms;h㰰<2/ɏ"۽2ƮK- qI7F Oz;׿5r^ĂW1,> Xs.^Ctq}SK=ۗˋ?n( ~|uHrgӎq}OMn{~luAoܸ囘ittN.qzh\ }}Xu~ķM3`UO?VTg,a?r?1`Af%7!u1+qO+շҹ?9*v4>;77o?k>Io|eIwbj/+$3||ǵW:F?^ }lb%v)קWl"B>=O YC=.ɏ,8,DjH6&Q{*}m +>kXlj}DO'mI{.3 .'n1iLIKt6)DM[RI8 ]Dz>}]p?q5>reN,p$-3o%xz3bc[QZi_slNn昷`&#[^9c\qi{87 k\VϛM{/o;L|xZ77B:?.@=Kw\ ۡxj[M`exUut%/rw7/?߆54oS/yO1]NVţ(v7ą ;kk:@|ǘ9>:a۷KaׅM~#7ĿlxߵƬ.:eX?>:Vo^ELI܌\,|%/?l }f?7CK\W/?U.e-P]L1TՕٿ bwc8>EGiq)?c˗?Qa4Owp&X`7Fe} 6't0Ls.`/ؔ'ȏr 2Ѭ!o]:' dotxtTC偒_1"km}"Xw*m$I!eѯ 6q.-Tfg0~*1s?`lF}l}Ns.U"eq2SkЬƄkt9nq1.s"`܍{_bb}om׈&KK>_M6Bo,y)_&Kвhl>U;9pZbƜ[-ŘrW b_p Øi{实\$~5vk_y)|d6?qп_7vB@b|8('yvw:x9NSWZvwvq0w}'4˅*汸!9ѡ]Ur? Ǯ۶wpRŎ}8 v}rLF|ol[MBuc]Kw! \Y.|@o!pb%jOA6K mWe O'Nԇd>[[,(4p5IA@ j`X?k>)CZD3 ;.}m\/=0zU]g7Ǻp.E'_P}V}j~XV;TaYj^/,ڣ*Ώ:ZvsuUYNkãl57Kym* pU W_j.sW>qِw7[0~ONQpڗ<Η<;?J2۶.q ܯW(sզWU*WHZ優A'\jLU\aUpp9Xg +|EɛVckc}ƮU\ϊƵOv姞*¯;>?)+|ryLzI.2sXa:NWVqf5m.DO|NSR=`@fR T-]>\ްPy&TX.}xg& ,bN6e>keUCJNݩxu{s޾~_@}8 ȁK%i'Eޤ]qpH.=N [YXsOx%d6b :S.@GU`\")C0I@/'*UW8Fd!)@rV %`| E*cMOcQQj;?74Dv&͓ă/_E}csy=:j7_\9%'N|B>XC/k ӴKFӾ"n?Sm6+i޽F=t йn*g?Wc=^~S?i,sA$ǒOq溇yu?v8T53;?O8gl]5\Q(m~6, .6!clc# Y干:uO~;K<lQ]'o~ k(*m9 2ioG58oyO;t>b Pt!E10iZjX27|q<1ۦK.Ub9ܬ]lsIeY<'[,s7xve^_aaEllm?ZLJh\P8pfaQ^|5J'7?c-w7s_B7z)_cKo9iJN %F< yLv1mdS;)]߽ۋ |&k5 `c&:?^e8^SX3-f.d $X?dKOťőLX/° I*|LLZ"H 0y~MuQ} .'ǵA?C'KXXk dI./N]˒/֝S_[;s_f>ع)mbYB#kesyj27[MNNVVt6Kmk Xct)c7c_\ }c\wڂ^fCɱfuNo{ib3o;f*ḴXgv.t'Cb|>#ŅAz'"f ?~ӯ@W?ۚ]CyU~.?~Oa:!g4GRloc?1[;gW/WS;vf+ѸSOGC~@ꢿ+jS?6j_~±CljqdX$XC0>WN+3qz8wʛi K|5\㿃Bs`~751[A@eRSkK@nI&mS.֯|^ať{yrɱ$A%3"zW^ r 5_d|~KII[ȶNVۓ)Vv^ͧ^,rN=.ʞ8Wtq ++;tYoeHE"/9 \yտ ~rGՠ:.CէZZH~vGuO"x_}Gsv;` t+@eNp/~_?7M'[DeV28KOm16'?$Ύ8Nv16ۿǩmwۘ-) Xir|oo]8fı?􆣡mvK++\V>Ѽ9Z|Za0Nw{7?mFULl|r`EK8[.^4.aRs;/Ŀ'as_XQT\'H:<8lVoU*^2ǂsRľN yqSd>>|+ _e=oc=?͵'XLq>W.7,f?PptB%ֶknǹY;,zVOXbmUخVx.Wxb :;}9jU:Ss5lv$6-Pk: _~/o -MtRҶ5Of9 d78q> S@;]m; D rts va}x&qn٩h{ dX{m]l3Pp9os`f6#';*3U .A7\>/jɦ#xUctD?ջ;N6IX,Dx|4ې+7 "~0Xi󢦵֎nC$!tV/Ew&e;Sf:|'>o b6渼_*׹ƶ5Ï:OӆRX8⯉C2dž:dkhdߴHd}8z1ӂPK1Uu o[¯C:Tqw -0P{y^%Jȶ?R|19ߴYծ|Uj>;C>{o -yls,9"hqGvՎt '?94q1(fm.>;OUȁ_|/%UBoKК!4$Ze6TQ XMb4Oߌ:Z]N0!0 0 M@?6}>((9{m$Wujm{s4pmTiݷ!M\gɱYk~ᬁiW60ɲ OPҌYN+p7aq&N U5J8'(Kܭwس3SVs _{-(㿊%ox.>rHZA>O؟dQ}Os`SWqRlT͏ 0v>SIV>\bC-=J'WiS{껫:.Ir ^S_ ^"S}3ybVm)L穒Ⱦ)v:?X;'pc8SJ9,|\O:x\ `lo7)/.6 w~бG?tK^s錄klVn7s.R] \; 8+$!&S O8\1n(nW[e1v4恬/y01Ol>6#^v\`? +x_Kwx|A¿Dm'|u~N;ŕSc?쵈G@ǩ?Zv>id߀! 5lƍ{U ^rt%p]ǝ}@Aʕ!I >L,^6؀0bE;v$K7‚.'MpDrpas"c K/9Qw>='Nw,ūR:B_;1=1w)ى~WE08@l;_p aױT<~/p2]2mN:sῊk|vmS^S~댏#Sݯ&]uƢ&W=/p̽k(ȣ<'X~<0v>c'smɴ܌otx)'}ڃJB=L?)=+"vjX|9->~I'BLO[jb*&T?'|*=CT_sieX]W8bIZo_~3=n /R7.qܽ}gHp< 8#OPoip+NBe"w @}AGi\`$qa,*¸ '}SռَƤcOs}-8IV\8\nGp'7:ZWO8C\cLEVqc=~d< ~O}G?L\鰌Ne/2{΢zY?W1L ^oJ vѭӷv4 u\ސ6^fIsde};Fc=XFmw~X ]^_.^ť_Y_DO*?//"q~#~Y1|^?xkkҦ(_RI;M~oY9E_q' Á/s}}B9Q&(c8((u@MQ*GAr'ߜ=܍J'0,#In<:0҃+YN00F9+~EX$.\LDFeM8Hc@3+8ɪؖ%ޏNxM,f^k%s&/ǿXD]8qce u~ګ]gyM}%.ws+.*nLu%Xs:Y^;";4O{ipwUo'wNm*)7ۘgOT!NE#oV4g9B QQBgYǕ@6'e ρw\r&W8Q=Z\FW`+hv>doР?n#Af~N|-? Ŷxzzu\8َ$58O9du|G:⿷֓gJ/mCݧcLJThzޠ[rl;VqO-aJ׏QVe?v2,wwRvܮso/_ZVE}W+6x}^@ΖPw2٪bU|, $"h;ێ>ߑW)?ŰTvj&ىC]p{A\x"cĞx~Wvloi{IL@0Y&E/ȰHu"ߊ)W1[kmIN_;/>NĢ%J^,^/(]S*ɾvr<oL8f!́K`)ϣ$;OH[m5~3#oǠyk3l]E6w5 ۼPY\8x:6N+&焘]Omt8`ȼq>Iխ.uoq"'.ѫ/ؓKJ%o/*&j*Xx2_??]?|Fmq~\Ǧqs,EӲz߅+W Fߡąc/n)OV-|)? :"O7wp 1yoX`+t! s:WS1_vr?;<ȋ؎ 񭵗[ ??ƞO:OOcu7(̲ u~͇8+{rW_ۚk1ͱX{.Or"w2)f XAsЁ%uJRM0f:_~Nr|܎W؆9V[>i` ۅa[NVSXW<]ڗmvS;̹8aNߨbav vAs &քX!o\;)oTf9Pk|!qQ^vq6|SGDv EWנS״I펣ME|=*᫸8E=vvUQyfuZ\zdu8ߪ'" Pq ceW/R4_Ǯx _`n? }}"l|sm̯,?o9LܤsZ>ԻNA?+ پfN?E\2y?pNvzT֡ŘKAx/9W̅n_[J7oxG> q,?%βeW dny>'>o TE`8t Ƥ w(ߍ/ֶ<t};ˡy=`ccM`^vcn{St1rMlGvm2|%!?c9ʱ+ib{?+80yrރvz ;\UD97?Ĝ;_]@WD|e\*gՅ*-<_u* ⯿r:4ŬU:l5NVAۆ8Ci]`ku\=%Uv]`/`ܯQX|ky,c;n~g_p^P絉{'#D9Bm}ẃ̷Cc.Nt|#|)h?A3ߪ_=hpc_,ܞ8lM2FVsIkmYweKe Mq<<pξQEO]\`y_f{0i?p⦓Y[| 9}vGh<Ko b#_x~KB7ԙJ^c5U?q ]J&>?3?yrǂgո!߶qGqWceOϩ-nz}qJ ?'eeW7yL*  .|oN#m&>copSZq1\w2gVFcگ.TS?cNrߪ뒃,7_ <2y^]c<Ʊ"5vE Fۥ->MK~p`ϕ*nj%Wygl]MZ~wˣ{+3(^W%X9p 7Cg;1]z]r:7}E&{_895wɽ{OdL(`qZk#Dvm?x2ߒ'TV4VqO"@sZ` Nra<-NP0_]e6U15NmdsIWz˸8)θf+?OnN'@?PcGޝ^7?6T7MM1}yPR4&j |8y__JZNHU-ǚFi+mE_`:-x!&Z9?;>lUL1o|4zrc_G n?ǁEtm-/(W'҃nS=ŵ0ƥ?J狲pd_P?v??Q7lu'켠NjSiivz=/uDy~>F8R"_uwjK,?)fnʼƦܺj (.@z\6wCaOu~x̔ts6O]S-Tg{}/suENanŷ{chq;@9P8yxH`]:$&?e9:Sٺ\'\<3tm&G7fU8dE'2Ij\0ߘVC2sɺ@$&i_ylmz`f?<''S'3B%ѹ@dtǟ6nELv~'X>/.LSk:GlQ&F`",KgSrW|<Mv/V8N7d;6E=`{ǭ<3j1=W;]\˧OkqӃ~ '{I~19n%i=g %7sub2׿sq.._ɫ)oqxb Gq6.0wF!C!悓9(;m3ܤw/r[Wրov1)?cg'-~{~6xkN|7K=loߚby쎘 BvV ]ѹW }kQ_|e1.I炛zG_mwc? Y un5WLKʹqq/0~ =7MwncC<O7l+=>nZ븪.G_xwO]KYxaJF/N;cU̴9\?`}6W+WZOpw:n7@In $v6K/yc/ŢN?Ǧ˗S90R{Zܩbݐ pw>1Q9jN=(q/.8n0cnm72*>l  㦇_1:$=x#Ŗ,t]lVRy}⛭B^+~ųScY, %;WUh<UI/6:UqToXz/cNy:!A^GeLzo :8fkd[`ױS\5 ]k _ɩ7?˝~sY/[`-\3|k"ZJ8Uųb._z?^K۴~862n_PiKkCkդ dX'kG?QqC/|b >KƇ`v m?}X6VY߃±oCsusU IY<ݾxKA y$lڼNH08Q3A8&-hA(webٜ +<>SOLISuIic&UXT/+/w\*,Pi\\sj\]>iw]U-oKk,,; zt@H~!>SG}~S@l c0mc͛\dKummsئ2*-ۉbq'1FOtrgSObX=}0/6nKMqXθq%&MxV9ݿ;WO2" uR "n%-bs }E2^.HwO5JϋU9¿ R粡c/^3_X5⿊qSn_unj=1q TE/e.N&+_`/'~>X>fqT i+y/E?uD Ec}6W >G@[;|<غGuE??|q}|zځj/f#.W _×8IvT1:{gk=NŦ?t~=~}^@Cdx/it0+I psl,j'&2Q#!h,"H<$ }Lʕj$;" ;L `l0ٔ5$vM1qb# "8~ט \4}-F8>tŜ 'rPZX6JPyN-xMy'ufd07XVk /T9$OaNjKſd_bKq|ۜ_0u9f ;>D_w3oNH;V{Bo -+mNdej.`'Y]bZՔ\;s Qa%^C< b+, 'yZ< v#ю|ۋ9ʹu|rfc[V7zqQ9ك0Vee =0H) lӟ8ww gXcj/ȁe?>w:;ػoq!6_\bYfnmX;W9M:_q~osK0ĿP'7DO<4-2s\}UsUuS|L8&>k|2D:=Z!odk]<Jwcl2~Gc;w?g"o3.JO&~{x2=e J1'[;U8b֍:aݸ_5ye)cm[?>1^_cQ8e@S;΍JV+wFdB4`$ PBAf0>x풦^-,pLxsLZk9u~7Z--6 ]Ap9 :ZbiNI!7AS jȦF Monlp MbMMz9GzUx3M⯋xN]q.fD7unL`ryوK39e|sܨq[Oy0v2.r̨ݻطĿ6U8& m6ڶ"}&ɪSeĂ;/D2ݽ ڰcqېy#s)x<6}fN7'/#kP㤗bͩ0;tigc(*+Q=m}Ȝzl=}?7<<]|/,bL;]?+:緘AEoV^c?ЗɔcW&-x77 ^(jjW .ξɦ[snm-G"[>|͉߆%cۮr).fT&poʋ5a_\]3).C[g-&Yےk&:'J^SLஜ-:n=D1W 8>N DjcX扩"n6@Rԛɠ^cXP~j^._hw8%BE։6 ]_¿oc5>ncc-z|<|<%'/RWz_-w8evX zP&RJO{?ڿo~|\Yo]o7^Sº5bՋ{U26%Qcu'~b;b8sU7OxPPu|myV9"7/m#+A9 KL4C"<'i/یS~W mWAo]vgɂOcӿR+{X{\@Ϸ?L/K|bcYne'}ҸxW |7_u_گ]ڥg) 7z{˅-rb ,SߔϗV} ñ0>OWMre("|lYN7k>KRsz9ϘKV OcƄsGޒϸ87f%NM_.MmΤgnG:SubAC@?tCmOfO[Փ1Z8'b0|&.n1ulѼw]x泎:fjc{ws >7 ߗ/kT8®.XU|CXn8rK׷ ۬m zԉ <}cvA&H }ww.tٵu}M'yJR Ci ynTAt`^y$'DŽE]tC Q!!-1&ekbP̏RH\Yn?P}NSs_gWX\HwrwՆ|qcWLqP.(@GX4g5~}{1\Sj >b7C'frzbASN*v}-O|qs}gDJ1R.,e|/6,`c{ʛ\OSo˄sej/n nz`udv7w2S,b|Ivqھ߾:7(ًCNc#e.'IX7#]-K"WǰSw%7qW%擗M& '(>હq2w-}sbyc|Z⼯gda$F})qļ}c)e3X  ܠ7qQ/Hz\^7^!K>Ygb>XuWl{y2 ,ĪXa4' !+Roԇҏ:rA-,󢭿WaKmߊ.ϔ ]-1L9rK4K_ź~eO=*bǣ6UW8?ٰ0~s1Q՚ U,v1v8Z͛kjdr1<^# Yw}9Om9ԮWBOܐ7AK?1V~h߁tK<̶n|W3UYC1uXɿtc60<\+>(іŞ%>^-/D`}s,&Tv!"m:bh߀Rqrw\(!u7qV#/7F`q?ݜԹ?|*o\ ܆SG>s+ٗL_ [>㨶'smSp\aI<.?;X{ӏ| ]Lwn$ʞL8 χ>d:_L_){զ[+kĂ0vwbCo_yxwc)>.m3y66N6+]2}s[;|ϲ]Nz׀ g\x_;7qǘ{N6T\ojWxb  tsu6`'X$VM$1 | i49mpUc"AlW#'S:<&`Pؐ?`JRG8x9YDl'} a}hC9ڞ dlg''7 ,|sr7]XP8iŅU^lxts"-<ۼX_M5T(ht)cl&¢u^16՟B&h?gc_cDk476㬶]q'~y5SsnZvB7и>+Bz2bBBr5s^q4`ic1b,U^C\l _2]+x* NN뽂xo h1ehk%Y٧ctqCfN /$+LnW_cmΧFYhzI=!4VUu۾_Př;~1I4_yJ"?q>|p%$c˺f]Qw8ڋ:1^3Obc`aZ\ۅi؈nZn7WL6C89>yWΞnoAXig2Β1RMo;{g$<hZ8\EǷ[!qRZc[Z[NWn[Z@7ㆈSOfC߉3Xr_c|ɯ槼>SRSk m=Wj*nPk?R9S/ߚ)7px{GalSoգ87EßYvuh,J_ XaQaw?n?LɋgçQq(o8lV1OgӒXP*jyo87ew },b4}c(0r_S-Զ{L[ʍ)3/ w˗/q`"'A݉;E{ʰXXTu]}V^qS㮈} (DcO~9'0/ Q$AmLo))dc,znr!Be4NL:y|q8-=E)7\pM:}| t\d r7tWg'dQN1z!M MytzI8%XFنؔ:W?7f|LnU~Ru A>VDscWLcNs2cNg\0>SWz TcWs`%|'d :w:un0b>.=^oo]9lqWcYڂ:7ܥ"G59~16qYo|#`[KknX?܈q=xQu ĝNIu9`J:O?ŗ95obu-ߪ8ewCZ8>O_X7փuf$n1xٮsFr`XQlCv_C窳Ak?XxYm?)'1grA}U @o 3{K߅2Q9Ef0RP 0a Jd= ʧ'0`炦E">LZq-7(R?Wwjb}&*2}ӱBUo7S#hv-1Ls0'Y ;.6a)?i9AAIsvX294Q I뚻c$G͓g2nȋϷ 2g>aC/ veٮMF"q".҅k)AكvFpv:7ɝOO8U?"f\`SqB1|x EȾA<m8Љ_{z{c"b8Rdk];BƆJ~y ⸀49o#|i2?s70==G? qKT)Qz?g 5[W'fϊxW rgRdcKѶ^9MӲəx?,hz!GTgɽ}T>O2 FMnmV /K[=w|{oHO}pi?OtW1&ɁN_WjV:OX цnjN0GWg} j hD%/+z#˓G2X qu(cq}5On:BTbe7 WbW]L#AqmL1&W:ʼn|e~mRU_*(ڦ#~V(dV`/{;.Sgd͵K f5(c_X|ߙk r8_UreO`/KEv''/5?ϧ 8#1_q&{pr1< 5~"!?my yrJW#/r3zk?h?SΎVAbnG LWOݝ=j\t  %WD?ƜvpK0}ȭQw-w29nc??KOu{1iLc՞? ?k6-Wb/|2u?f9< 8n_pc  + Ot։@S|e_n<_ڑ`Ik\4P$u:XJPG޲蘞7n|cj$a3֞dske;Ց Odg&2Yo a:;z/惝 8UH$D`3gWvtm0sl'#mU?f7Dd[V4OM^{Y5Q' p%]߻=q]#Ҿݪt8ϖD1giBZu.Ӹ IXƉZͯ U7A1)WE1 B?ΎpLw標r<]/]_Jrc7?|cԺK.i{d ii|xrK%9*GKo.@Ǯ-&¢KIZ!mO¾'Gi_P0 ZLɵ O̔Ac Y1v샫 &[7ה=`t0P~`?@ym?r*?m'.%鬋bL*vѼݹ(i EsUѧ_OSiBŶe{ǟi]< /O}9LjܙeS.&Om=N:-`W>"~ )w)fSjs)gl.)3K9YXdߴbmRZ΁׸7·yhDd=Wq>.%案?35g^՜Ɂy;u۸`,yP|۞@yqaAm5q;xܹ)]?60xT?bfW>ĺF޴؆.d]lo}w7EpYd4A`l"$e/:jc5??q.?US =$~?uI~?p;geIM:~fx  m [_o?,7$b6qH,vb_zA?.gRG뿁sv^lӅ^'aV>aˀqXߧ^/umo s[멯OEmmxoOCk?)uzqp?!$L׌QN(lzk]kpk'm׭ͅ; eP0- NIOt9t ko39 n}<kq uux*J }>Y&\8b (OPҨʰMO| 2D:RՓ$UsiGsuF;cӖu$F|b iY(ޏZ% ]{m:id\E>$PV~<ّAT'P`}L_,n>]i;??E\|E qrQ'Us5Ix~OAc wR85@ڷ,qA5/6W~E#\uⳘWUƯcvx^8h`yB"W`o7)tiƨ:>s4S :~ n<ܕ:1zG¿q)uel*<:EUxKd\ OrKtWD1{ʟs&߭yưOG{n}*:~w/n|gW2>r4YbTƸq.#ߘ#&\"/rcS1tNPſdnMYS-m7k[ p_lw+b%w2_T'SyӀMvdo7,ƿY0xT[/KtL};gMry)z7r: o\X͓ETr> ?q`9S6:S Oicy k[wi O:IoxDa;}j kRdle]昵g=0#o<of#Ѿ3~^PzFܸoOnEO+_x51s~}ǮÿW?Y'\tʃ~X[*p[_?t`[/}g0Ͱa62X)\+_Z8J;Veؔ r|SwUn>xD++yL/|:W72 $p}#%υM\h gHfQů?myrvV"W߿R(ʧϬ?/m c Wdۗ~ߵI}?aņ1[ZZ9_ma_ȾK̜L_[?y(}?L3u9rڱj}l`L8A\wi, 4='L\PX2T]d`}h,vy]kC,%ɄM`od$I$F|r{UAPڔ$Ed+~f}?,*q^;{wK_``Hg$|Ѽ?i,,5&L6XNlq q[ wlph}&Fc>C(ݰoV&m:M0˗Z&]&9yU^CrhNCl#KWa ljuԍt @x 5Frvվʟ'1?PSOstxuQ7r*<d?ƽ̀ok␻/ߤt<ǥK@|~bG|5.sՍ;ܷZgwc;oAW|0o~+b%/SӘ'Y.Vr _'5&,Úg_?k+})?.||ma7_11{WixM4 Ž6:crڳ*@b`l^8I>~g#nk|,2g_E6 7 Mq1./zm g^.繼|.:^cOUA/mqFԯ58絢TUWnGCCeU . 9>?=Pps|,o%_?v@9ſțx&rbUN/G_R\UXڼ}'_ǣ.J=H qTag wy\p?:t6)?. :w}g=At9ث,VXw–<| j(9d0]j$k=gUA2DXAO'm|mɅ"0r|zV YeR_I۷Of=/sJn+L*Е!DHsgEvyHn{R7}ȶMH΃xUnCkk raփW+.[Yv9fėGh'y'_?5Xʵ}O%I#pGr߄|667x̤^vs8AlJ,8I ,1j'U̼r,Oq\`³5i#Vdn\\]c7[ԥ/ԯrl=߉;LoLzL?nȷ 谰-قy}V兝~Q_o_Es_q X58wE??of >o y | oQ əbRv놏}pO-g5ilߊ'Zc> 8ƾG_uV󚟆K# O(}7_ه%]i߉ >qq5?Uϧһyl"^pqt1}roO|޻-Yʡ·cifg?Wi:=L< сH+WfUomUe^@8z5nm}kbFY_KI,}gq14plj mK$ߚgOLX7]@c3#O/KW ,k Q  2cO1S*`) /K9eubz {K(s 0a|n/dJIV (BA9M^5sΓ ]L@U]O& )?6 /}j$LdK^#zGW\Es,4vʡmz̏'VԛTSOa$/E_euL/yv7FޗG\WJ,y q ſ0߫'h~aٟHVm(C< H[1e6 ,&[~`mqT_Uq*Wd\ى{N}L]_Cn'Y_ڷj5G[NsmE?g?_;Kfߔ|A?B9MQ߽ K0ƹNHo.  =8edmۈ<ƙl>؋{%C0ס]&HX4fS}4|X bY{U7J2 r%cb^,/.7]*6o@>W[+4p 78˔5/r]ej\;>^ {z[œ?&l*'?=>W[?908\{&,Oj&6©c[COڊ?>Xl K+?wi5Os{C=cL sMۨ*iZ,c#7b4 l`%绷^g ?N](̱4%#qcxT'q'I:.vrYĘ\5kH Yiu"΀4W罒=>pI%ylyG:k$"JyBIg~DyI;ށO"9uAL3٢]ďH4ޞAdz+𧾎a +mnD6x}cb\ӡ}S 7^OG: q1-s?[*|`Xj&c\mgaQ/Z«0 ]Eq:og^k˓'ڄ'mMp?_?)qRG`%?ῲQ,bH7]<'2?l$G?-yNNI~1lU]FG׼3}n] &>Oov,hɊhe~$q'Nq5+QJ.Ze+A#2'J6[-;cqi$ 5k"f/?!ӀU;7g<.ٚ.ҍJF։?nwm>:czhSUG.{m]@e-f^,߅-C/?) |*Ÿe.\ qX[91~~+ K-M=exn1s +@q^;yQNb%> sXcOՍrIu{Y)}67W}">c\u;;X]LdLcVkM3Sc|Lô [٘|rd<)иU7'5Q5.T54)1BZkr/Mϝ}Q$ /K$d=㓿w_O:1ةU4baѾSlbdE:lX*٢8*aRY6麪.Dƿg)Q퇱{'KcC1bLCΗ)ToUm3rw`6tc)_GvQW2ޑJؕsOKmRf^31q|axn'zb- v*<]3n mx?_?^}~E^w7? 2XcO<+vQ.(t5_\ KrU73G6?G۶oMrL'melMm8E OȄ0Gߒ߮n5/?H07tvvꙭ\yӄ3 <& 19@'>pRmv݊?n|_+U:\RgDŽ5a?P']U } :dR1]>%'b!?TBO 'cߗj?+Rپ|UP)cV8F)6gk E* nЮC\2:QFOs#{ ;w@9RUr] x#pl$AA=$8/4 -6L\]U0m4*3n[(l^, Iq| )^4vȄoIWsmĤ3Ms^<>;cx, 1^}mqonkg͹$ms!}Wկx;D16٦x'fo{Şhjqļ)+sO^tqC%G'nߓ0ynWBNMq.>%%E6')}c0OۓlDm)zcՍ>8\៎q_UǨlz) ^w}6 _x_,8OXʾ8#nxĿ~b Vz?щ ܹib7q^>KqF+2 Q8F ֢,1QM6aokM9?>nn45Y`*q?Ab4.`pۅt?bWݹ~.Ѧ9ƔEo_G?n#kͧ-w۠ _+|G;3TS@U pͻ3y;vCTfd_ _2 9h*/ku<޷9V F>U?jEq}*b:}3>kX0-n?v3?@WqbR -@9X^Bj\(dmYNcJ"G}P>s vbޞD7\EtKu\ر5l|q( ?aM榻 v9c~[Kor0'9z(+n*j;$$W6?$r\z糌ۚ4_e/ɼ?-n7?7(2DT'GM%>+$q%g&IJQW<ovmst1ˊL%?xad'n7y]XMGf{[&w -&?wCc,0aF_?58|3N [x)q1r_nkYPʕ?@(qX_)۞bl8 ` zB&$@rrA2V 6˻Z`hџ{c֋o`q?՜ƝS岿F{~<~:X(qۆcva?p7l˥Le\T? 5JtO?=i$Eyq|/c?^hٶ)Tv*Z}6pn7|?.bnLaAֺŪ,_S yWS`?-X'|l0new $*"MRr' Lq2S7/m\\>]ps뼏~ϓ̓w"=)Nw y9-߆%xXNj fo6Na5)\06:G]V1K(q~wö<\L񠧻r4q2ŽޟX'ͷY&/m3O17{]?Յ͉x L7~j̟q>:)1?~''%kնj*M'$,7͕O crbsMOdi"& zlmk18v\XR3XvMw(|#K~i: l܉9%0wE@{Ay¿x#v QbſW 8s=*l"GgQ?2'%$-rmn63mis%7j􅀗k_'QӝdV,Qk_2Esg 8÷L7@B ݁O!KfO7R'ERsN1(|=dm}C_ JX ϩ>8E=Rl4 v8v'cIH6pWGU\\gLOELqw^x vCQ\OmVu3?;>p|?#5'vc8Woaܱ0\7DӚY,HlN6; Bwcmߠ1F_xq{M΁iH8 &BoeXN97He|ׇ6C}TRˀn.}xpk8f ϊ?lx>)LyH%IVꟋ\Yɖ7?맵}57ux0nv$ILlثM..p@lG&ۀnK)<LG3J<ܱK>}+z 7 'zY'aO| g/:L'k?>.SŁrѠoccq$Bh' AtV@7PP;EDvalL1J'oJyadeY`L.vlc3s¸F(K$q(,;W:kDwzma1v糽/ۢ8yYJ׃}z;%'99`>nGY-bA-fs; h e*D|:N_ @S E~8?W.2$_N|U?NSkOvRix `+s™{H{>PxV14ޡ. _"6 Y,->d;^FwROp1Ilۧ]NkP^U gKӼerWCF]vnKJ^ɠmoAߐuž"_?6z'7{7o6Tvhlˢػ[AXQ5&>o. 3~6E)nڹ8<nwU|cGlA~qPq$]{֒\aAîk9c{N,foQ?`uuckT\ } Unq{S}¸Ӽ¹lb 2{2?oȓ#?D)'c؂.pŜ2Rl__- '?߬wz0/}QwY{MG[)9I>boͷ9?l~4sz2V$\'?[}b%H{qmʿ 0Ҿ_ةY+ x@(Ig`Q cs|`8'}Irt߾|҃b}U;:Wا68Lxدa7@QwVA2TDӛ8@ )%FtV[xuEvay3;*R 0Ws#OsR*'{vR>ADzD6t< }٫Cc XOdG~=ˌ/1N.b0ƊwMWF hrͼ}tĶ $ vː{-Λ%n>Jw%ghM"b#HޔƩm;lԙl+?IsO8@ⷦFpns}?IG(\"U٪8\ )cJv'(w|/?TEjnJ9x%y8+ gan[wYZKgL?qԏE)_asO/vب3AQ?u=jk;z*4?e_?n\~KvMȉz?fr9_(ߚ}(cC.}0ڱ9ZПJ ~}gC)^I'vdlL.?w,Q%n¶/c)0a7؍rv/ XWĺkTJs"~Y?ča.aolT'#vqLޱ(>37Lay|ioov\x7̢dKbh΀Im}lq]?yDžtϵ2q_+Z;IL@v@$ $o~>z M%b}LP?an߶o^V8#fO.C/Gy0&MmOI]e$NS6nECmA߳٬  ucQN$1 Ck5y%*:fk̠bOccV=rPKJߌ?.&KwME X|dQa$wUI[tZJF'"D,ZܷW{Z1?,ǥ} t.ՕDZyM3? |oW4r')6odgu_* t2ce]q֑ÐQ>Ebm?g$ûR.ӊ:şDߤ>x^?KsaNcE=q['|e8 w߳(:C r$ ^tfbz9R_`?~xVzBR_/bl1P_cx)<0~/AcSy[siD? ^I_1o_|7X4Z6a~X9FTM01/b;*<fY "HOKd-~߮2rRr<@ 6Mp+_HPqXH,Nf)QqiWcvv,g/l>L͏ %vB6kjYnEjয়~liYOK?֥Qy'ҏvn/Χ ?q ;cٛOw(Z'\O cEEO||-EscY0u^s?>`C=Y݈eU]o9w?rJ/rYS߽mM*uKrt;O/D4]'2(}S.%~9XH~՟3ou eܴClsƟ9gsvN؊~þ^b ߠ9?G;X7aH*1/~Vwds3mJF? c9"uߪ}3qh࿯:)JH Ųo ,bpL"]Xu4o\]㰬@!Zn.Kgk-TD@y`-aE`7-9GKB | Q'r!pӖi1Vſ_.C# .2LTJ^}4aC$#d;o!q8])&@vۿ{>m~A{!W، \3S؎EL5{>k_qollNą!>1.ܔYg;[4i|(İEƿE$ X#Ev8m;Ĺ8J5͏cПǡ 1~%LɗB9e<3lV GO8Q"?]?{ĿW91Wwن)b7{O mJGJX'Jo`o'>&07߶my!*?O4Wwʐ:4Su]H;`_v:%O'gMqmYvC[n֟vy lMxH\jv r>~?wŽf  :/rG;_`ء >X 7SX T 7S'M SE# c}H/luq[Cc~1 & G8_0ƾk@3G59Ǭ#.ڬJ$Sg!/u,3 X_#!VZ3WW?iHaHN8w|\@઄3(Dd؉2fAGgJP.cH)ϫ aCf1c2)> G<8o߲li IϢIj,5r& E}͗HX}&6al dAzqC9_Zطmx'8^ҙ"ƥ8>5'Y+AkWTz*U~9OJ}DzB=`qlwqaxpn~tX\N69{;DiWT7[Mq85G4mc?'Ӂ_&[?;۾'J?y?/ \u.xI 7!9^Sd]*G TCk4ղ:V*%z2μ>\@H.MXF&0dJ ( z)ԛ1ɠʁym2~@ޑwՏ~D9Mc "m1X+],Ő#=Г2aLVꚘZB8C0sfSXo qcG$q?܅*ۑ07xgis ps@ޝG> 3a)eg[(<4oO)uŨDڧڝsiEčpnЈk0KPڼ(XI͘[86? )0=~܃l02 Em=g +fUwy qsWwnok.4CW6[~'Gj%MM1(OhK1<'~K*Wxh3*\R>Xçk7NX3Sw.F q6sd)׻Y"vPuw\SB_6/>9NrիBCB?Wn-$3ظCy)pI,t8vedqNsv\İ=䎈>YJɗּ㚬յ\pEb|>Y3/GeIِKc+l} EyN'ŧ+7Bje, /^e?An /y]/^XcoVؒdbtįI]d,_oIу3ZLxAW"įhNncXnsגSM짍N&YB]Da;"{Au_^bq!o(s>ϱe?#4[d >8ͭյc7l}Gl,{א7xgrX9cO@#ˢp6c~}d&J8\G0OՈrv[_t) :>toc|Os=r堶|ZDiulkmy~Nbo?ٚ󉔵qy;J/w 2k1~ Xb\lwpKPl aTvti()qoDxǟh ,D0݉" 摀\^9@@l[DGV"Hy{$TBϜ"9e$dSd'vkۤ6v2V/B^'sWviIާ%þaŘ;L*3,0;Kdư'u׊d|Rt"moU/+.oO_UdY`eԏr/v%_20=3{"b`H'E7-??l5^O;7ma~8n)vqMĚ75zw#;fXZ{~JG_>4֥}0~찍q]|yU%m@addO ׹oMwKV u8^/^. ѡ6oBWW>XWw Jm8Ķ.,?`lO\֒[|h;O#"c\jAdߏE{gj+!||ǾM)6\W8k:mq+%8|q2| cM]D'=o;'zm? v|WӋ%M e5r_=ڟ3z_cW/_tR`cD>)ta Z:v*F48J88K`A }SVr :Glʙ+@}p s4 2̋)JຄvIzJڧ% $s󈺌;m.".x_FT-hۻ&A{$cqXU9_*CINeU"V'7|хKwfa%< ~ȓMíڗ)FL9[I s )/a5W={.?S ( oA߇LGm([A?eaG|q,g>ı3(1<1{'8,v|xwz*Mœ/mB{oߩ{U0톺!t.KȻU좩aOgxDǟ~#7~S^J>sVQQ/+ri&J#6:8'I\l_7`&Cs|UT6} ƴg!m |wco{NI7"?]_tg%G]4'ox{\?J!>W' (1QH35u 4l[`}0XTDݘJWx }o~>.a91$%f?fȶX%\}7mx2ސmwq,vJh*NBryP7Fh\K% =)? s7OqLk2o[Qvc[Q )$|oEM}y\@&00ULf,m&-+ʋ.ǮT2/Yb;eh:^)y& kU*2#IY&lώ3T3ՈC$ia,9]톀{Yc# D47B T>2!SrUk3UB;g*)^ hoٚOsئJ"Vf[`c 1vAZ)SUnm;c&ſjI.Or]8f_=c 1w1?d”ȔwFVr 1|c'p5}%U8Jїضo[xcgKRuX."+1Zfl4|?S?ݥPxG.Z]gK})E?͸ lo`PaW1C{͉?caj"o~qs0Qˉ,JF.\W=0$UCpi ~-mN-WxG=d1u>]'vg70TW%>\&y`?I4>;d_LM~>S–~}eSǟbO71Yؔ?Qno@^KwtR}?c.E<v)菓Y) vQ.eBj 1UJs_.*W^{dpڤ_k%{\8oɅs}^b^bimOalNao"*p6øEhI&ǢaIq?_3n0r3{ ze;)|1(K˥p򝜻]^F[4Жd.꟥eqQumDߏ7'lEc n,?>"w!S&?4"j> ~OyTTvme"at EfϮ?8`vqXr~i*@x!12} ;timo:ǽS|9%L׸ mOyJ>'H[?/pKOvNNqV?b V|3A3__EOBFPM>8^*||Ot5Kjo=휄l^.&,U5{l-dpOiTqXuhxy(ΨDk/ ?=xe7aUvw14N<4x[܅K5h?uιc{,#3u7Cy/`y|¿oǧjOڂe:+q)tԍo~ Cs>u_ +?Ih)9c7}fdUvSK/ߟA f!=gTRJ{cw_ϧ[kz}Wa 8/0K}>? ^=Ssn귿ۧ%3OؚڦY\M/lXtsS?ڤl\؅O06Ol}boD:^Slje'z]|7BF?D$?anc?إxݶҷrQ/}%qa,-,[g[?2q?q/|ab_W8>W?rahOu _ζڈoC?d1wϚQ $7TsgvJ+!( 1T,_{Bdt(K%,r `ޅd`uT 07`UjmzeuXssJӛ ]Ou;Q/!'dSmfGPwTaH^)2HGuػEBTxZʆ,këlT6a>I1:Ͽ;GO_lղ '9bjynT`#Exvw:EzP=k1av|_um y=0V;:e/=V.k}cl8_rNVŢb1N9| }Iumc"b/hPcQbXa]X ʱ oOyggELmgcL= >nd+uAO/flI Oi 7w}wti9([?,^'Ȱimo]v}.O_\zOxb;c3f۵{ˈnSm 7mu,"M`j7wO<2>iEWXYcm Kϫ#_u\ Ag\a켅XىW=7R2_}P3 6k>.>a   BTd#naOoXW&d3d2Wّ ;1qoѤkf[9`QDU>V1.W,{);s{Gۗ/_: ,%PQ+1I_b/A>[b`a^. )RVNmѡ#tv=9]O5&C2 \lqh2z ך&:@~'W~NnkNSnBq_ąx|",a4؜N )"g vc8j7S_D}fkՖ s>2f]U} = HHas[j̡M8|ñ|ö"Paox\ küYoq(Sx7F ͫOEUE~~o;>M-h{Nn[̰xaIg/o .>!%?MtGS`nӎd1N丌7\s꼔g\ba7`k f2c{?*%cIIl1.1Uv.mYC ?Nô=6a{Pq1l]r槟~r_<߻1T=8NӱObodk9?)$bJ$\b)"c"q"m/>?|6_ Qs|kJQ+ҍ^5 q6,i"ϗ<ct?c~]H>),Ea.)\;7b_D?n;l1eS+l7Op2[O}(waEz/_ b$T}xk_ǮqT\}_b[!$kӹ/ 9i;? WP6?ۗza(ȫU:Jare]3(3jHTcOhWv+WX&TWޗ.}`EwF?dO-9R *@߱15+qc101f.^}C&H1սmԱZizQSe}3߻k ~T\jW|0'mSq¿ܟ. w|.s @XT :Yq;L\չ_ɴ %b.b OpΉ*M+zn揄9m!;[ J~.dwO$U MoVWp'sډ{qER-K_t:_E_+93mƿE>hvō\%#(D_Lk!t]9oD1&^z=SC9AGx2GV>u?Yz]_g|nvgo,.V{l<9N^v}L} vOLmne'֮l_!}ym;^8Iuu/ 6D?NВӾ4*>CkžUN1kUwi>UuDzV=HT0̒?*61 gy3ݶb[W}2aƄsX^?n%^LeR;qXOec[`5,~~v l$( ̎=!7 fRs<*CC`]dyJ"Wov)ѧ@c,*\:H v/a;)e L4F  fRі"8)>% pǟ3N%l?إyȱ6gY*N n\P{0fI;:⢰dd>by]`a.wVϺnUI[<-$#X+}gv}r $Bٗ :kބ@q;-[jjn߰Ht|#?EG\w?C^s#Msv̎٫ժwOO ?mZFunAY$˝9;/8*};%'m"ž;bxanM93~T-ϙ mo5¹0|]6 (Sۤ .f[S`샭mƛsycŝJRj0Vh/qln7gENm::־1OrRRi i鱝8Y QƀX)pi]~ 38ª~ԟJ7a%]><[/ 'CHb80˾f8?$xOOc J'a{"qf^$ƲYz[@yC̩I/CW:ѻJ:0D#Sɻ \^Pb0@a~VYgjoqCR[Q'ح%t[8ZR,&\qV?$CrUWv٣1d1ϱ-15cCxSg7﫧ǁlb5L&."\aǏA&;;y}?i[jq@ y<9,;qv'm^n)cw%lo1C}H~?ɒ-,32}E9~)edbalhOV~rʴW?zWڜ2EP溫JI' L"mic_W_yf9% Nsb(}[9/OD;+,ov)+|vV?i7WbĿJ/Ovq.Y9[+[cS.|9Wqxc^[T ^r d˞cTz 2Wx0/x7<̔%k޷xKi7h?ژFf2,4pgmTKɘŸ:dR䟫 ng+lG;6q~~!|uuN|7 ˧ocS7ϋqάҍaAu^i>/rРf -%g]:2Cpsx΁G)#YƾQd,%}7a<'_G1^[k[EZ˗\^I2Y:F/ 'CX_DMH+e%)cWff wei9 XMDžuakX4)P~ `l%š)iIsQ4OVvM:xBN+\aK͇U'݀l^:93_=mn6FM䐋x]-|Q$8V>遶ؑaP}D1l.z7՘ٍv˜xŽғi<=4gʝBBw?'8j_A߃DP'J8N[$/9b?6b=W[\ƏO 'ncocĘ9).Aym\jAʏ8e*o>Ay%|g1+/vmsR2ǟهWF!#e}ˮ9r(|]")>C!#603-sw OĹ!>b`aWQuy~e-. aAQGcGcN8nsQ&S*>.~7[| \Q>ŝLva mCs ={_m5%S]:Lyuttdz3eq:*^{8яOOEԑ+SS:Ӆc| ,w/&5ȮE?]E~K>;q`lŌx|+ g q{0caܞr ae_,J//;HDLc>у.-$yx\ޔ*?P'MZ_ԝb.o'AbE *>)bUZU#o%Gy?1ՆTN}vCױi1V\Ǧq/N^ۭ -?o#αϚUǜ\'s3džkAv+8)ÇK`eQ|cF: A 97?Q,a[[wuko.ҭ?t]ߏGxHO??Csa|ys.MtmtWo.o<KRa!Qf gsmuuc >sF@ "l1U8㴛o_ `x^"Ɓ\܈}PpSPĊ0DQ7:M(Sҋ@"p,]LSJ Vc$""H*@e7Ֆ8آr׶%`#~1Ԋ_4oUNxEprI˅#l.Et3tݍi۹7WtA9WE;+Nz!1[ҕ7?p<.P7 Il(&L]c@nl EJD{C,"cVC)'z?.|5bBre'"SV履~rʸW0p~O2Of]̰?yQխVvMض%9ϫ(48joI __UP4.k'Z-?{QѿQ_o6Q#?9߮rfDZYfl";۪˾ۂ?re~c@c/t5\O7kCO4z^}m%_~!=o;/ {Uj%~E53t՛588r?mlߟj_Jkg̴0BOE:~ؓY3x ._ yOoTQ `MN{}'<$bep?DZ~}NUڋN YOJmO]:ˎM\.N+@M/ jC[*F@{zw;{ / 1Ddn(s~W<$Es;vu;COeֱDsJT㎟$C SAk(*$*|3p_v}Nk9}HLKVh!tĊHߩ}g>xbE΃*^y11] j_qs/Un " m{)q2o6~ 6V31C? L' w}w\\TBj4I,bJsOq. zEQOodT$<}ZlTq"i !>-?v/0DmnMs?񏃣XX!]݆-w 1^Avdo]v3(KgOwjǡƾK[58WISm^> sJ7Uc>_eg 2;bn|9?nv}\ N"+l1*/0/y4b|"=ΥSkbԤ{e g[űP,j7=O홴0ywtgcSGjHqY(#sk<\8MqC>! r b 2? L1;zQg8L6ٶ=gy?_saFAm!+=ryJhj?|y@p=q5_r \i.eQe]|%˷zicpi?7sO~c6vOжmOu9~9+׾A//x<9cIJ¿f  kQ~j?+_lw!l(;1Rx? Oɽxwc$ȸ}y!$Ǩ+QێZĐalDt"^|SB=9·* \8OvH;:֕Co]ΕދDrG1'մVYm]%{SE\2f~(|G<*<1G2 8 0Rn?qss#V g7]zb3zl `}V 0w er>& ]_rt;V,0"ќ}Fu۞D/측GoEY^}J'IdeMW]hmNn9$qco(-ӊ/r#&/w x _&7ʺRL zQ~OĿE P_F]W{alSUs }>XШ,EqkB,=.n)lVJ?øOW?J2>Bqb_Vx 8Moa~nsEb[|~O*6w4: I%YoWG;}& \9F|<ǛS."3_|jGs,?Ys*?Yd'(? EOu b/"6h3m9Ha>^>ȏxO?r[:?%1O+'ظڻ!lR,|)W.pك 7>.۲Oo'^6wFb}`}ӱt14 +=>3'?$o\?Af 'ڋӶŔS_;L}i<V/!ߚ7 z8ƿt}7<%Xzc[?[[_",ldGOo'MBtO2q|~<^$  oK' [`o6t_˓Ku6q4scM!)pruQB^V L]E.'b$1O A\E3]#a_́e dC@mנ}<0b: RK.tA67xmġadˈkz!KJ*{I8 t5^<ؚ>EmW}s0'$'-4#v_/gox̥_A-NVԏ:9S-SN)?WR[ ocM=s?@;@d)[8XT?b:gfo/ &SNk`QYN48PalSK\m-J~ڽsI(綂ܒ^=`51*wE+8)Wutkog=0u*V~XWJTUߔu#X9JaC\?eaGym2_ĩA'2'@ 8F?tGE#:LO8Yy57>Ug4C?KS_bۨ#Ƅ/fڟE, 1Nsuxhڗ/_1vDI5- }u @x8p 'E*@4M"8 m; ʒ(ax=}` ?+{zwLPi.~g9=9lZ>482AuI&&/$.[TLF&TZ}-#vAI{җ$q ";q@)I I ]ȶUC+Ic\Rp>q~hL$[)R6|.A8zqOAܟ[@X' &=$Wix\n~]?FYO[lh>WUHFzOq^ek*b؈_ߖc]} 5Kz_|ҥCHԛ%_8 P''6m'koD =#P: "ν5ЃQ_ ֕+Idc|;9hcr /ÿajj'jC},$PR~RytsScc}΋W'A:v [lqdSgF<Ybo`r¿/N ;-,˙|c5]<Ż=yn'v~`G Lۜ]^^' Gs)c vÎsr4?!l0:M:+ICyxO?j/7o,gyח<qh /c\%O?ȫQ~ Q4׻l"=ye N{\/PKq[ybukfOۚn0 >tyЄXʇqc׉xcJɸ->2{?-t(]X.j?cbi"53lŜSzUv9-k]]肋#hr,uE ;qUbbrso[w"ƕ_ncm퟿=<^ch*oXWNg^}_Ox~"G@% 1 zAkn\'<%O1sa7D4["YY;9$:WsZwH=[Lhq,vH]( _Ob]DH1z:'&?U, E!;O}~ӒVx)HJ |L}%\$J!ρ]`k +"CIeyħ;+i)0_$ٌ'rR'7JtR^ń ,wMkn?aGy||<ٟgu*W8mA J['"Gd?b]8dk7JKӢ'N9ߩDlxWcdHp-lR.UScS_D&-=wVzg^5;OɧU?6I xZN|w<8r,&Kߊq W/'>o&sSv:o?LY[?gxWo*L/e|sjhӻw'Zܱb÷/X^mRվ;OTkWzzksGcef-k3ouc"y]ab0dʉ/Yo&8:?:HW~v1 }o cG›DU?HڦP6DyT]WtOvSQm G{Q'XcY!?{#? Ȋ߈Aӗfaq!Ѹ >;h'ғ59hDdD"0{h>GAX-'=ȷHܼ?KHvYW4 ͯ }lz PeeIl@m7,*Ӓ:)gaމHXOX]ޑP {OO?O sS~M'Rc* 滥#]Y^6?R;xt9*WqV2 L(kq6 gQr Î9}l@S1!d '@cA%IiȹUlF',[W]%˾3.;qzAq0b~I'G!;Q? 2M$?l O_' { Š*,prW(Q^C?[/AOu3þn'w,}Cp@R2GC{7aG?*;ƅqo9䴋⩬[ ݋9mJV㪏a]j ($3''Xs,T@ jM FB$*H1Es{L%-2PAFb|a]V(f%aY LQSQ0> .:7 +B%M'7αZf#5NZUMOw yr. "i?,좕xaOA M>vŜ'd9fZ_՛+UIS.[\(4)A?(F[ަ6KNq)| k=r%vV_w,MC%U?ɓ$Ĉ0{s-{23]{3I}BJ{?ǺsWl bNr :WC;nچ0(I?m ߈21ҶX*of ]2>mo~JG؛OEYU*^:=:?zu\D4yT Z7~-n\_^Zܒ3A I)cbc"bjOY}/$6 :~߹ g~|X:Ծ.c77ZvG/ToN?ю{3bxp1?.X[ :$w;q8/ow(CS,o;3wV<&Ƙ,cm΋Û 0%?-QX7UHiw8f5eDC9J~MѮ.:M"v2m 4 ,IW ;d%i &oD)mu)&!X]W/ $A%)C-c{U$PfhJh$ !?̊] vώy0 vjZ)L_\@L6T$9"nEC>iP乍}pn8g,N ', snҘLȱdK?n3WX`HϭRa#}lv +#x~mdq 'R*l o,|N1?c9O;^p #m;z4dyL55~,}v>Q3+~QJ+{C,OKeYg?ێ,p}sC&Tls+#UFm9C O881;}؃K_׹ h\׏- lଚ26c-_ŵREm><_#w54W|(eom1pnb!V)>vN&O\*ؐ|dv{Ѕ80 KLR\@xamKv*P;ӼNq /J{_;\3|}3̟u_Ŝ }>w[[\(ptu8֔#79onqm~*<> n~>7/_,3yO !qE]ӅqJX1!xC>S–T $2&;IzLܼ_J[U0Oχ bu(cOoSg GEzxɩxKZ*@ uy6ĭc h;?0Cŭz~ؿJw9&K(^Lq0ޏۚ@},Kv\?-߹1ħ%Ot^s^ۘ3N!?f?[XϚ+b?oJwWDQ_. _5 wSf?1 @Fkޏsֶcg<=.xY3HIs>9?۵ܸomS; .$N}‰ķ}aJt 9̥hPU&:` Gsg3ݯ Y.|ek>@}MpU}d JQc% @gb _m: t0 _+\l&!(;[=MQ6;ؿE<$}d KRA:;ƹEBy$*FXt4h8o&O4Z\m9O Wu$=4A8aqx-͇U M~g+{Oox=*'v)lfr#v.E,]>b*X~L"wm1d6?6d/M*dys(ʉg](y80KqNř KL&vZ[“?{լf,C?}o146o:/0Qߛ|_+6G+; o0Mqu񅞬G֓ڂq#[ Z}a-=8g adHAy7繶_ثFU;>KHGm|?ָlq­o>sc7eY2΋n+nxUh3gY_*Y8Іb[C.:#.%o?c(:U]Ihb26:&4IP ƠsǤq["ɛ)~:}o Y_x@&g Svq.t+Msh$|$J%clo=Ti`I? D6y0@ yخoF=v2/_ݪދJ6:6,&hN[CEЁ턡ݮ i *>Tx7){R؞lc'l:'Yl_gTlKzU،MWW:z8}>З'edLyľ o[{3[!xW#'6?fܦg"8G)b{lվ!b޶+|/u@"g2Ѕmrqo8 X5y`k] ? m?G(^R2o;~5SL}AXRIrmq?n86\c{}(![K$D[ a͓"l8cl'[6@x/o좕Oj j iIwk5)_8v uq9vóVzGRa)[z d"ol?>y u>r+v yxLVp`X1'D;9*(fƮ'J׃M\JΝdrV.IH%{\"6P<05`[}!IH9a&xQ1n8a7„lq'XQO 'AVT nW>\IoJ1؞ 8)|C6֥6+TZߎpa?B)&8 P'<*^!t0/QݡiMtew 7?gg^wwIk=6o*w)[o+S]_Q(a/)7k70ۊ.߄M_s?~;; 6֧w?3Y=$@asPQq?׼ME-{޿MU۹n֟oO*wo_NGmQ3Xt, *xn_!&}ĸ~'^My/hsv|ⒿR0*Eg+[?fߛ1*ښ{^Ln p0Nl+zM0? O;9L&g%/O4^+}S2 1!osMXLl *paF.g[픊xO- b`Fʞu>c2=y'~܂_;%> "Ծ֚&K_!9>'3>6}L~K] ɫ-l>$R퟿6{oLzxlqd8. SbIk.ۜy*ae>1}BO͞obX7t78II8W eiWmxuwYNA1Uy5ss<c{_I U_ŝ́cc;_MUm Jq&J՜qjaĿ?f&EcK|!_$}\ҡWkKboϋC""bGפ}EUvcALc*1w8=j>>Mp;ņnu+{'w.}qל@o$/,o4XGa.**+ ?Qz 0Q܉ HUSY4~s/" *g~G |,S!N̂i:O^4%Hסr vi=+s-#EȎ%>U$wV')IΪ"q7QPp>.X *U;CR9fl1b HdkM \ާŝJnC!ӡX{6ܳc}s֙=Ao`?ScpNCVƸ-_c,%?v86 fnMe粋,ơ?Տr]P8o+O>!c5>Ph>To7.^* ?8t- +Ư0%7ra]b@ęic۾3lE7˭q?9G],=q(e ǽH'sJǚt>?:wX˺:Չx<] y"4O->?;O`oz})v^|M7ϡV01 D_ [~!^%m(7T_JW=nU7{s7C§qt;Jg n_7Y\\+LՋ?dGYvǸ;;SA.Jc|m8_Met'T0-So"C3[aq_;Z2m(?TT ߨW1^<)b=.Vk7H?QY;-ۿ7g>4\db/(݇c_֓ r2+=>/ Ƙ*K̺]\tyy]@'~8pgP0)g*H Ss]LY˒MtOpk)EVwTS 0 s_% ֚I.`2| YЍaPv;l #&Lwv/I8͎ tDԹ+~/TmQ_KiW3V@֔Nr*ѵ;dseX6$`loc_yփ5(gǫk?|}1ʟ1Mr2gĥ=u#s<> fmgE*[59Wl2Ƶ?<6-biVsqLKo@:Ƙx8=Bvz.So Ev1М+O.dbrXV*_l; [8bpL?g.3%+۸ÿ]b,M$.J7[7JIz_9vggؖĵ!71v:[27"K8MP~`ߔ9&! v؆!{S3{woIxh23lɱY^:9mgEŪٶ~}fy` )WzNi~׹Lss'txbU}Ox#>Oy>ylC~NEvE=әm?ko} hc <F,e~I|*x]!^h}7)oelX맾#7"ֆ"[y}{'ρ[];`5V75}/?;S=/|7UspOȡAQ~׍L\,8hBuzѲv&l!lvܙr@˺=Dlvj[y ;/kBΧ7H :S},،ldRd\bB˒_s^}15' ]qOǝTt*6OƋN,NU}_osǛ]8i2oe.`Cx"/>Rȏu$y>F+s`_ uZ),ro,oKpNoMcWs!c!}9TY$moƿ]+Tw ];v"r_y>XO Khe} 'L W/37+%Ǔ_|Eo_QsUOY?'|tca^PpK#P.>};> ӟ4db{+~Q]Ɣ$6m& >@$731q@/eQ@%E |>VQ~l7>֏+xO5XR%sTsu_SWIxG))g[?si[w/4)3Wؿsx" Q7/SA^3'6}?[b"WKu,?DyH̛|#y}_tXo]uM? uT1m7/t4KnSX7\L%n=v?Xk|!y =:]&l=6|["Sr쬀A'_|cp 8g@[+֞t0wFʤ@ &0@KWrRbn@wTJd>Jp_ɋ/x"-Jf&6,jnO鿖FҠfYAPͯ@Mgb&?4a>SHJHR~3Żd.1c_fB}jBJOI;J%ISd5.YNV?X8q|N.Wc1ﰭlLerr pE1us&c 2tHfQxŮko7ccRƒiQ~c`,O.۟`!GB%O8åYo=z܊OiF8&{v \ z[sR b< &0mbؘ_Ͻm 2B.};?`AT9hd&/xW>t2eq+j 8J>cBޟDw9C))?+Ke: -c2wί{7덿|{s cnrZ'gXN U^7y?&/e|%ru ߸bz0ms?k-|Ο*7t *^r2ӘR=O $mH)m^뚗\&ß)8vOw W}OʊwH=od3#w8WǓ'>NoJ۾//ʻGo4Y#,&’O^^^֠8uPL % !nYxiA1xwzARV(@NLN+<:\ 4m!b` !7.+?Uv)XA;k:ҾY0YԴ~LJ/,J? c; ظ_+z])'ZL Bo53ۑi* "I:E1tfD,IsZpC6?q}X9S/x?u8|@q(tI>JI.'ؘIw?\k^/mo[)ڰ:a!~w]Q2iwy>@^;m V/s 8mO'˂WyV0)0`.P?K&hzldf_Z3|c|˹P^ ךR奲4aD))o%?%.kB>]G|؈njb? ~qaSF|<6>#>aD9?ſ׍}z# dv'Y)_qݿ|~)J'JZ?zX.Rwˣba&fm/<.j̑30P?!3;ێ7CFR6W_}Ua~҅"/bMU? 5y?_c.-ڍ1d;o|s/_F]Y!-uJ6 ƿ=OZ%*GS_mo,a<($2ELIof(tbet&ȧm,ִZ\/6_T.(]<-x"}cĮQ1`!Yeo]Y̋mͳ#b} JO^Z&9Lc-wqLmoޕFe-Gou 8LǸy6]J|&h9Nj;f[_w#ٱWVIƄ7( !G 0%r%'h%.1 %Ib ::<_QAlٸ"Ʋ EM-NTAց 0%pm;AHmdTl7ΑJE2dmG!Fic1:͏Z+>ϊ U$V7 ÓXiuFT;mW{!W|N%.6Hǒq%ވlϟXo38ߒjA*xGSWSxNn7[ģ"/_*/ͣQ "N $vͿ|D;Į?I)#pv y`D$:¦邟M)¶%v{}gG_ķ$Q6`c!{ d\"Ӝ+G;4O|CNɎOEV9R[YXi+WtΙİNy"OdT&=-b#;;#ֵ dY.{[D~vӢSG7;}{sUV8O43MOx;#?1(_-Fo8*0WI~2'".x8 .3 ,yȏ[~"lQ)nJz~ gm30p*+qSm,/ +_r)_r:߶1xXȶS XAn_UCl}{?K_Ob|m_7o(|O}1&Ko2fK~cyQ!;G}g1+ԽOXL _`KԻlے[k?KMw6///sAI2QW¬d8UJyITr<۵'Y\ۆ5q;7Y%f7fķCN=^?b77 &t,xT*僧'6;mqcˀ47z܏ ۲Ib&N Z51 $vRDe&OKsQ71$a؏W6:x?S9wt5+bILsyԟZ%gPtB.opx"Q/%/l'IKg&7oU:[aA-Bq]?vmCQ2MpFn~XST*BzvqbQ-}b]a%5Ez[.}+Ϲ&.Y6OKNu3m jmmdgԥ cfSlxꐨN]e XPY 66:3k3ջ]C=t[4?>+&5؅>8*:LrZ XgخӃPZ&=f-͂bxR},m~NQX%fI@; ) QJe݇RR\D&)z+;74XD~Oo_4w?S߯kNeg3J aYƗ]?T,'s 6hxT|Wk5aWur1(_/y Y%7st2gx@M35=ꨜ,'.:mʋo:rMȳ  ovsJ) e)L倶(I߯9'sǜ3N!lȦ> +}F( -eO ;dz8x/pw-S>?}I_nHh;6A7lXMBiЋvf5!ބnm}'~8~MobybS{a,>,31;m ) saf///ߘՈf:31#vuE Wtb]leB99i2A%A4k͓af6 tEsZ0 d0`2pVcƀ421P}ӾiJp%; N>m^Ks2MyA۫>~,x؝9Ê"I:O+P?gs' c3Pq leOV8 dEɼb2ѫ':.'j{'Ȗl! k/P~A_;NlLSR,?NtL(c;Ɠ:bv А$cot0Pegg,bA<|Yn}SǼhj6}jvΒքq?%??~ly歟) FJnc$Twj!}hgl<=}xQce/y=xϺXjkzI3 _Cd8ֱM;?fz]z_3!u*9q-fvtPo BK&cnҟMŃJP Ñ3xo*o~lUa+?F? }4nK$$l7iW,^=2ب|`o{y 1<磔?tOcD-T^a~*]I_%(*;0wbN8n06?ukM)F*bAot,OnVwV4{mqE'Fz~C,EpK5Ukm^^^jINb1h{#8q!92;B(栛sP4*=ٯ=% 0FI$>V 70/ƪcX~(eUڜO6kg6=%Aş:ޠz1; 86bL_)3d_^P0z%wra'~s_c]S컝o׸ÍQiQo;/7WkGq̨of%qC5v5wa5: \w'} R> 6nVGxNq^0h/Ɩ`_&1vo~I+Vou3_ Q/߮矾~F}'&3{?_7@3h[6iќ'MM5iLllW 9Fygv o> ~C?o~v|YOU 'o27uBw_嶍wh Z t}fD;_n &`}\ =J*4P֜Ƞid ڱ Tuw!IVd%AO=澸+0b`Ī>3y|V]!cLz1vL,'cT۬dž@' '|#Rb杮f32@p?_;e'V?t't6bmnXvQ؋"/I;*s,(78_OiN,#O s&k4**b ?rMG QCNow5nO62?T(QB Y gs<Z-Wj˄e  6>pl~|mgqRsNV^Nmq/ g-BE[u:&Pv$OڰnSMOmH?gzi)O%}[Qdv[O6No+ hgusglz;AB ]hW|s '~Jd~,mV߿5EsߒyN2;YlYoǂoUl('b~x1|8G*Ml=.um/~Ss_tCJͽ]˱p5VzO`^?8&ͮ<\1֭M&3;v[TNa|广y,s?^߯uBړtrկiw])1sͩ oNYpቐ$ch 2`ȯҤ7 ]5uQJ .VTA4ki/e~q%i4[̻)_aX́W6So݀06q;> |D[Z{ N;7 rL ؼ4y_rgu3 \>ImhRBBꄣ%ҟYN8ɨzpclY]:qYUr/1x'#-b&9 ѮA't3V'`T7 &!<N0 LIcy2>=ѹ7o>O)Y<Ψ[5aƵ*K\U89Z~c(/L׿&1:u$)1ې丝H Mw `(+^\ȑЯ#Oe tg+y1@KQw_SA!OI|Mb%XTIdr1)T}inr85bN؟8EQ7fOJǃJgG?|Q|F+wQ1aoyibapoߌ\Lp> ~M$n0o-e@xl+-O: M"_axum,).F]?7\xOON){vט5tRgV >b1׶H`1Re/ڳn-y*[__WJSo d# Ưi떂5 X@R,S@)|o;1QE$sUl 2=9'cܓwC Ǥ n<:6 _#oo{Q6eB'2j2f"I}%{u޶_5Ip=1-IjwL:5Csߵv +66 Cj&_RF'L '.6OKbZbK9eFxU{>O}< .7tuaևN6ǂZuxjB9̋gF"WJNߺj[P/= coHaNim8d3, jH4Ks$hGK[`c7-_~Q_qUOY?âTs7Ơ5?/ ٱqwO%nCx%h|m|o2 J )Ƕf&/r7dE_}qezﰮ>3}og:>&KlF0KϹcb% 1_Yu/|c,&!M>_s8g.T*Eo+9|4=#5-B1Z5q|cYuI}񤰯;V:?βFW8c]c <&ug m/q\D.j?+qV ʂbD8g~7E.bٯ f[~QMK$|~  f`Jqvw Dc$*`uL8m`A],?]\]ʘ//oE:]'ɚ e3_G- aJG;/{ _=|#xHln;~i&snf >b&_9ph#y ۰E:|CL2˹߹k?֍4A( x\81I m,~a_robIؠ}~??Fx/E.8_ s:Us'Erky'g19% ge& Aݧ$R uuO481fu"zq'uXk6aϔ]]fo6ڹ١|?T5EMl9~IJrgafVފI8IW6~Pj;ԓo&|.}{G5^HWmD 1 bOIV]?F~g?~CS ߒx-7zO'f6PceW 7!?c(6=t:/us1]q|k2- JfۄO ?ٶK H%SX,@*i֖Af2K* BNkfBĕCػ_C_~'͝(99D^K6- ]]ܟɡ*g)7yeLnKocPd`L;s[>pK8ꀬ,Qv6DşP7P?ys4wKgӚt$"$;Bs;ϳAMA]eyllX,<۷e]:ǐrNqq6 YX틙4]zm{!O߈WdsUKy|eCu9/P']tXW|o-oaX qUpIdzֿn3f *ڄ+βc-燽'jSe8NJzs JX͞V5Y֚/m)XF_3)FM .~Lb#<+K mM< Xgà0pC~9[ 9»8= /ǝ6wnW$Gvg҉$xJ  {)z !^dˌ=t!|P'Y/Fv\wdʘs0NøuIɾv\R~.ra.OCi)IubQ'ٝsa&85ooH+±:csv/?;?'8U_O|;k`AmC},|2">o4S/dؤi9,JdA:^H)ks?'?qj.w1Ua?WEI&TQqt|%ym~؄ #G2*}8~C J_.9ew'ׄ oGdq< w*~'qܺOb|sc /f8&M&A$q?ޞV&sَ\͍:zz^kC*8%Eܲn#>{~ܢIg7ag}`2u<_ uhj?7p:󅦏WkxζkvG}xuO6,t9 9gRdkx$_/jow~n '+q,1䢬WvkzO&_ߏb_;>t^|3=2V&f9^vuR嶀^t1#آ· 9լʋXMrWD۠gF>$:~,'i,SyRIrpl} '4;= eλP"XiwN_}:?RsR{6j,G{O@x'xڜj5]`lԙTGoXnْ-Bة&{nB9gNW9'(N+HЀ Uǒ? Cv7'#| :5Ņ՟tgUHc,Ig?2Tbd_C~5l?-I0Ylz##.m c/;נЦ,S4v<1ϋ7Xe'In}3|D6UofxlWCsL \JiX;˳}3j7uS#ScmDhLon1>+??8w%ӫNvT?Xodzܝ3+(_1㴱f=5>6njDZ}6اҝ6;Ɲ,fp_ǣpVKټr^]LuNɟŗY>w K~]ve''ǯ5JḸkK5y1eku5N%K1qVT̋mGrtQ2xT=ѻcd}xNyޔgcV;OJ/]v_)aW};ֳW}g% Jnj 3<&,%j;ۢBo].PzIzRvdp&~9v\{dg͗o"Z +b[7؅ :9XqNg8qw}lx6^C:O C\ 8}r,/wfa=C(1Wh38; djv)c`17m?wlzsG\4kf+sc&>]ϒ'/u oĆwƟ;bI b&oBim .dtmwNerI 6fgW aI=n`ٮؿ%~BWx:qOk >h?IĿM a4w-XI]I70>;g7#gwU*]1lbu8׋) fU}R0ſsV8ژKl/ss"0m[e̫"p,dwcD%OēpiѦ FC9ڞX 셞 198trqsD0ӔXb>$wYe6oꫯFە/tsh_'AIzq%oސ"'mliEy_D9RQ?2z?a/v Jso'цJmW3Cgg}f?OM_߁/q~P.y_Rab/e12ؘٜJ΋U$릾/u@wR(O⧱mv;9?m7Ob /f9D0gWc`;A{]r}!{^7u;Sۖ[¿8Uk"ic~*M=_\_;e.*|d9w!lmdn%GQ+W 9PIr vWfn}* _%E𞰥eyy]@cM謃Zݢʤ?5 ĸȺ8Jd N [D }DtP}oJ=DՙƇ,^W%ޙ>c2gc>nbNWs l+T_sar9R$|O%+Kʕ84?KϘz&?8'u3ܙ=](-7Z3cTPG ūύ"8  ?c:΍AkrԚGp_ Lo^iscf8b`/Tpy hra }*BnJJ9:jfw@>~0nc"E: 0iD|!iY2 q''? A_M(m)7Ý w*ĿcZhk2}_,&I; Xo%Aͩa8 *O,fkI&)0_ĉ8U'c#CuO033!4b_'8d#'8.g?;Zn*X_q P܎^E:y*?* ػmbC/+>z⛻MlԷU={:k͞#Quw=+|++_߷;o[OE;o8.'b#uCwOvrg I'56އfuP3[ ,ϝ#g?V)E)GyfMpY쿔mM[W9sb"8C$50([$ѥ}FXpt!uDlñQ? 9=s=WzNmUv h@9HZ2\tt$AQA=4#6<%^gW7pN2is&m&/LvsDs=$NDͫA/ezAUF4.*>"[5<_aQYWG?:ppN>݉7K:I|np@cgQ,=YSq&w ]oXz;cKNv_g o Wa%ttƺ._zS8?tV:]%|R,Jކhkz<ڻ=vcZ_dx :LnoGԿo~?H*9}qBEE΋?8w "I= ~q,B[3Qg]2e+䵵MZ^ 07,"}o31j]ޏv,oO>\3 |\*YWJI_bI=ƲF.V]56 Z}X+]& A1djŃo>gs[dpeM de~JZjMhFAse$"i%vm$x/#%%b[2<'j:+6k3'[ضMpY;8{ %{ڜ} ɬ}*c)IGR&'5j]Nجờ]6o|>Kz42Z#hgGlg"V؜sUgːY~c4N:tkmnL\:;9α,s}_ADֿ{[?(_p!-`AlY׺u8~bqO ?a%1mPs1sk" T'=:xaKΝU?Zw b RVilhg_l)>τ;61_1L-C":>> 1d+-?9o& ΩrGxD2dIc.u6s*/ o"h^f Dض<9' F=b|{HYa >͓x;ш+%<,QD̮_,r_bc|0VK9¿.ۄ'LnO==a}}U:c TI E&}F"^^TS@}?QGQ7p~Pp'WJT@逈ߒ6M8:ə3֚i1 BCBɂ\K/}a0E<7űwF:lny*f|ǩ~ a`hsJ7'݌+䚑؇?MqvmE%!wTE2y+D,b0Xsr??gق=*~vU[ZO\[ޯǏ ɵmOwJ^vœ$ WOxx?֦V gŏ|BWz}!}8}o 3s+"8)Q`4+ f^d Qc_p~JǛUy+͗q'_|S?9UA#Ÿ́ ?#r6Rj=ʮN#2G0[Q&#QOͻ?X*6`>g6%q$NIxfc UTʓeCLGϭC^nfĶ80sŜ'KNOlIs: LĺI]eеd'vUPsXty>m.H/6e_fe]'Yj%ƿ>3ho/H0?q\0Osp\HK-9aCXgTL:T{b;1Ћvc•.Bu(FfSżm|e5\v ifk?u4nxSu5oc)A?.cXri]?(/^^O~,sX.0i`Bp>L@ $ 5H6j7% bl]c)yEx\NvYp]V}W_!.$?}|E( )H 6.0NN`<&'` lz>=in, ;q5_*%1"1^"cI ~qN" hQYં`'CȬt'E)9bao@jegMW#emV$6̳x؍lXdeVksDeY&$H8ߗy&Pmg:Ve2>c+eyҏsVa|[1T` X/’=i{nUHd{}':^?b:\_WmXVm,6JW!)IY[_@߲#FoK}gob N-$ſ/Vk?t o=I2&x0|R~~sK qWAPM/0E/p*i+ }SΡl(g؜am9uͻ_AIKR| {x1rpLqvnW9~${'/Zsp~~~h*' NC7Rmi{O$XN'X\T )~Q@M' ٷ7cG-ɱf>@4[o{}Q-yf;U̓6qk9ego'zl'~1ɟ`+#˿/O+բ39"?j՚?}$uOKw۫Ի~YmZȗ׹X~6iVxc>&U o'JDK0Q=;6Bo.T5٢Qa?f{*OrO],3> ?OYC_ eWKr5];j؂|(eLu`=<2 9_|!U0 fqu6ofOabiv-#\`5rZM*Q__SLۆc}ޕs@>߄;ubAE$ct_=~N~osr5d4oL+A^1]R]V_އ:㸣ˀRkk~r2~C_%9T5dc{q_mc7nR'8 ]` $I?wg)dr0]N6Ldq[/(g@7$8́Uh;@v,DUʰ*ePBohc=M%8qԛ|ʄ,YHC;k7¦/P _wgy+^ Sd#:<>Yp!d+EǷwu aMh<П$3Ì7W vCO<^7vxr/w_6?o )TPG{8G)kNwacCA})dT%c*6v8!e ڢa ,tX f# _7]?M鯏ö?_?ow yXzqn9yQtN P-+),֓| ~IzSd' pX}G"p;ۗK~oGHI,u KFy_WKfJYLYOk [:|靺1FEO s!?ϗ%_'m._6ύ\|1jĿr}Y &?0]n\ ä[=A϶<l7__L#tC>gM A~޷1M]#,^m~U!;g;S>=psĿ`[}$Ɨ{[_:?؈N‚>!aYN5h^b˹X\k>~ڵϿ2WXq\6 e Da%㷡ѽ~L9}00Hkݍ۝cl':;gqs9#/6 fxh]#wW1w{q^>T7яĂsMʫCMqd`v Jhm1Oe^WbcL#>>//{Ov۝?'L}#ujgf [c<!AVToFFDACeP>KO4@f`yTg~<1!_0:2?iK>Nr@GW .bz5t_v)$iT#wH'ٻ}c+d|APtWeuv`spr6;6&IEpu1aOގ1(<1a2Q7#J$pN%mW#0r'M<Xt)ij(#؎y'xc6n-8=&e;^i R1O[߬ gWG W1m'џ9X G;D2e~ˎzp2wXd|Wǧ ݹjێ~d俎~^yaϣ].a }ZSTݺ1)<7IrU0 xa?P!¿ٜ϶Ql8Ny$^+±qE}89KuR>9P*SJ$'?qs&=fI|> w1Ob{A_irEMNߴ Omm]xRy1ba}w~kEr^_}N6tk} %M3#w̯^kA&&q?{<υض0'0fGq?gIUJJjsC)W'zu0c9}p  ~W&J.c!c_t *hRxK1FM/V1u'kH~ tcY@_'̼6@\c_17P}yHݩ:?i;)Ɇ}uF$e?։^j^;nl/ f:٤5 5Wc'plH Ft0V&Ν.^1{ ,tL )M^2Kie&_d6mx:]@e?#QIVE['$N"UpCIZ>W^8.L:I,e]>* v7ɛaRaɒLJoUuQ,_EBD;l{߈j 'C&2Ά=/)߯);|>؏AY<vh3IBy~%GYľހaՋS`ԱZp{P֥/~m}*m.)MɶA]EmcC3.:8bN: Ka,6^%yzzCC;ǣ򡈇M?A);zK[z%2nyXf1S;"?[ǯşOx`!.nJϾz7Gc\ni{ȇ)u\ۍon ^5I?O;////HZ* HOv>  FR}9cw%<zo89,AecLRgmAFAVA+ibܪpd&$?팕2ژyq긍g;;`@fisy܍YtmcT:bbRj9HyO&o9kpO3b/)MO Q2]c.f;M s^%խXDFln5'OeGT)fvj`) =ۘ+[([ z|pۮُfò?9ϯNp 57@??!+ӎr<-~U}5xm "QY_SPN\е^sH+(RmkuM).[=`#((Y=VOXVWaghTnGmWBW9 4kck9)ƚ1؇d۰.BܞFCZ A `2 )O ~I~> OecNtme;ِJSh3۳7 ?C_~D<Tท) MGQon_eF%=rco?aLŠ2lxS¹:6b"^U+N1,?O:/c]'|r+6o8gu>Ӟ=>?=c@9TՓecNUڢ[?t6"f._oy=1qZk,w.f?σ_t}|Ғy+y>qnm_߁?ʋzʜ3/ni oT:/8OsqM7b*J=HN/> -v 4! }8"uAy@'4/B^7li1U,ԥ,amqloF\O:ts.uXRqYKܪRi<ӫ`> W!m?G).fLҫ???/O`N"]S(< 8z7L`]?*M4yGhbglFeaT^kث"'x9,GrQyưXWـs6GQLvMn=~'/@y~f}P_OK3xsr|[|N:4GkkKa.??r};8tpRt>E[t/N8v3,ҤEt\LO!SEw6b^e^]Ĩ7jP/dBJ!Vpη]b6OoK!O"~Hv〚&bT-~BЎC^$OڴeXEc+l@bE\qQX~*E"ІN|Og'mt ?f-.o]:f>QBIz7na|MvRojߔ iѺz v>^O :#GoIU8U~mS_/ZJZE-9:.WyIyc_'=F#[O_?W ̱[5u_Ȼ:%ސ'~_ڈ s,M94rڨv*f7_u ch}U'٧k?.eO urSߴ_j&McpK76eEsvCnҺ",sf<>mPo:8_w8']$t6cQj#lTfDz~Y m3Kϲ.OYKc%ۋ X?=ݳ^C?uK?XGoCN.vY,VgEa(6P~3_,eیc WPDz~h8E" ö4+FEk׆sb,xnb_[,keŘ-abB4Jsesf\fcf([1л9}Mvo6x"=^K7!DcGB..p^*}?:?%Щەb>ЩKlX׬ ^|2y>꾚9_9ell?+cX~ ?a:u9(^5~j?ؼbI|dbuVcR'rz@Jc(P@o$c ! C#ԳK-ͽS~_5"cǾYP@-MK[W%5oC0~L;0 &T* Q+sb%VIPW!#9xOQ_,3L A(bDmی LPoH3K +b:HIܿJra;W&ժo =a]&]Jy}et>GIM2`N͇`bOgr&?+w׹,pm2^{%y _lJuLn Oɩ?)w[6-99?s/&eM_3smL?b/8?~cg|/5وy,7[hOwͶ6Gb>3?lZBxt~ m@O< ?~crOEzߍvߠVpQ91*nX|?p1׶S( Øm_ me">fk_z^ `&?Jy'd1GOiY.O~G)s u1LsQ;P+a Fy\Lt[k55_hr/ yy]@-8dNs9,=)P1V'xB*/h5N(d'2OlVZ?"oNBǶdh1C0HXfʮf lRUz-๯:$j;v{UJt; hi҄vL$SrXxV}^n磔N6 @=5? މ;tRL"h·x `¹ߑ~"2]?nf8u&3ߚ8t["[mqL.u~bK/(,vJ{9?+p<:I?e_ LW|]9LJQ*}$P121,nZwwSc{ivg0T%Ӽ *[d|RS0d(2'~-\Lf0_|JV%jk~?[?toMSSAXL}D0|< ~򬳕M2m_'\O0o)M>woWC"ζir"?Q^9竳Ta7[[F:_&j8k|c-5q[L?HSblKX49>VN*Сc1q{;{w8ѻ-H#]JeN8UMp'a|Z;!hqXLrm8!lc*Pl"@^',A^ `*YZD~s_."}~HI0Ν&ĕYb8vڀN)A,Pv~u}y,-Y`|(/af6&c2xB $_[LҸ.x2M0z'Ʉ*&KmxJ=Ĵd,J.a㺰cЎwɝ$F s[c $Ko:z|%E%_͑h9[-@\?ҷ^ ϣ(uۓ-h}Bꤽ8FF)ˋ:} [Q>Q*>fA6LNX:Y/F׿o//.]ù y2ɻo{IxbRFy9:5]$'?UsBsG7vG5A ƍ%Ta{= >=m3OqW>5rǧ..Uc ĸ&oIVn81|2l6τ QZ:J/C؃#I17{6/϶?۠g1z 0~fCAnd`Odžw1y/Pկ?ot܁z?J="*ml$ _yJbL1#~K=.#7ÿ5oynHˉmew,0" cǾބƷj[n+l%;'8x)mN"|%_XvmsFvl[PyU_c}!*MJycẒ}{5ۼ|cy2 !3B۾2&r8N}zrt2OF[<~qf+%5qM76qLNI,c%M3@ Y-QZta^ r50j_ ^'6p"b(!wώ@ ";$ʵ-8XL9Dƿ%spTɷ IۡHݶ'z O32Y.ZOQF_o~zY?OGLگskٞ3aw7g5!'g? C̓]cO(0Fǒò&?I⢹ (<^-?OW#>h)X,}uvnftiPav}nA:xVOU8f>Oڏt}=mK ^H/wǮ,g2~?;/f oi%Ws[.Duc1-I 6bnnm[mfqifk؜8׭b)u1_-j ~dtpqC?ZUIuYԻɩ7])?9v6]GQjƍc(LQ~-b}կ֑_trb}#i9p;?b]>Q}'%r[1ܟXʓ?B;ߊ ub_Mo?_޶qΖstz;#OgT/fo;si*A>uIGω(*h<IX43?r.DVҧ$Ʀr*pRס0s.!B8ٜd: _Y_$ _2O6g= ?E).* vv" qhت5$ qfg&8^l}vQRU77'J-맍!^ G|׵@_Ԅ@aĄoܛĵ0OawIOoFcIȡm55l+IHȰiy<>vzl8(A~oqXhc'=j=m_[` -0Ⱥ741WӾ跗j'=~Ge4^bSwot@Y4x1Jx~UwǾ&4PYM6_C/a'ZJ~šY.8fv];'JOx6n5vRy_evMZ߇G;ܕyTqh9/HB#{GnuO*s0.)Ќ`QfMLO/̝'s @ݷU?ud¾9/=~u.Cۡ^z5ylٜ¶>:;l3d71 4@ꝣL?ȒsVI:m~M˯1N¾lJQp~c>hI$_Yߠ+ =O w%4;oO/B:Pɼ=3͞= ۪R"9¨}J~W=Ξ1% Gz ?U?C0Y۪?u/ˁhO7ux{a7Ȫo J~Z~=]8;6F+TH@r-da}ki<œ;uUh60v&o%&$I@˓I`ep|Mn 81i@+IIe'' )8>dُ&|:eռqE[܂fIk])1R^CY<$d`NR@֦''\8W mQT3G,dOB3ܟɎ#|?DLE6 6'Q5SמL£N/셸1? #/GVRh߽18xpz=}Ǐ1Aq>5xZ$huܖpwgDHս틽> H1֬)} ׿c?h>y(aJj?ԡ81Db >Cy}f{&751[>숱=JTn>Ya{#aNsWY31fEJ`e&#M_ƧЎ|L`N\7/(%blkGQ#>k:JUQR7/ە%1k" qaCl(}oRk~([Hls2L%Q14F2ޒذKM؏pWc&?vln{U}_4H?fԜ8PW3Bۊ fb%7暜`f~Wč/NƷ%>grZyo^оIJr__z _o?(#ulU{DTa9nKU'1R}_ҧa[s/}bk26V_18.k0^:p58ܵ%/~ޚu8~ЧNw{Zgiyk۳?+w3O{L*8B?BfT3' o9O3%1%ѫn ^Z'TE/ WC5Ϻ.J"ɼCt;ՙ6%+?p2׌: g4IGg7 (fsDl˧yPwvmZ<Ǖl6w~Ӈs]J2U_UEaM,Oeqo"sʝuN+"?Ffõ筩 }[~{ B6jn?>yc[_.][IKUs K qgL9%_I? ym<"x$20.Sc>LG)m/,^x*=t_L_eeXerR)sxA8/Nqib.1mYs1mӹz)}WļĐ xHML:~w3Sdr^0WG"mIA?+pu>3 ߐ|8P"P(AAah'_ I| Vd 'Z,O+ЯٚH5Taz q<}O01ejڶmf,Ŀ#  If#BQ佌&D&\^ v=bFXav~PC`E_duCowTlNl~e׺D_GχjR+P}Y ^a~];<\l}V\q Y6-A_x})#lfG1:{ݼCTbuǂ:+~Ey̟B׿$ cWElh'fnx[1$]v~+gǧ\aN3#q>mGYt} <5.`‘suW/cwG?:~PJw̧d|c 6\>N4Εc8=%;0\s4Ly-_:~ѝ򗿬^%ea?UǬ??3]>5羸nsbYp`}&9 ~g}Toџs~+:/Ǵ ܹkG4[V1<,J.| 0*&O?Ս:G׶o{*Ѕ-C^! <~-}uV{+;NUI#ެGCeMd7y(SR\D^¿=f,Jcz+ׄx=ſ=$rg>lvOmS.sf?bub)@n6<5_gQ|yyyQ(^P:YᆌGa[ Ik8@I !%spAWфnC@_)ÀҘ8.ZĥȓyCyU$K7>^$&GQo~{n|$ސBb8Cb[Qa')8VE,!}?f=?t-h~q}Ro187+%eWro><0?KayDhW\^5{ou M7J7 o Q+rbhSVY5BUFMhD-U#3b$DC"Ibef>S,5{wC5:^o}y/8sw>sk;g8s^t=6h>-Mo_8}A|͇:/&:y_oe7{,dḇ2'F? tx`t8]e_'V<ӼC9h_̓qWՅb6&9>yxAUrO5c/cż{95ت?t [s+jȊ~ ]$CVEn_ђxEYOnVp1 xwϸ#/D`Rww!?-oIo)Ȍ>akݕy!7CH٠zK/9Mzt/O n<.;|;}i] WˌaKpo>eO+ w(?_H?ywn:Np> lD(}2-NBwz}hW`=a O()7&Ȫ`%PtE{܆]ޖt<S7Im߫!;_c;UA6dR]cN܃>hTN2H*UG@ު$-UaL.馤Zt_HFX^gzGGclzR A>U _~9[De?ڙ;1~q?NUƥvVNmiC"^)1o2uꟈ Fccc5ϻWmV&?;s?D j}V^d>QѪ~T#En.El ;q#Tt xV.OS uFUg1bC_-;-]o4 0fRR=@߶kټ%\Gq qGz<"-O`L&>6oh<&/x ;x}*?\$o~wBd,H|Ӭ~ټ/8`w __Y,No!k#:hU1%u[%\8EjmҤ:@pfqqV'naM98)? 8=z6!M9#x ؖ5_q&- :/=)h`e1[q^U}+~?Cڌ辵f8 m_Ž*GIk34ѩJ?O-^w~N]&)ciw?v TV\ж r|Y>x3{ <"OE\Bیj;>^g~51IƭX:zŶA.[|F%Vt=?t_ǭ]G{9 Ҍ&@lT~RMZm/UK]22)4wLj Λx}w#OlgڲS8ߕ^Bƣ/R.'Jv1[Xpü#90~|i/oaA -\Hw{O;{d>G^b,+vçۏߑSd!>f9Ji0eld\m+*ڬپ_ m?eK7TcV'io\B& 69O;ӽZŝSg?S?M[8) Dۿ;?fo q$/ddt^%*TކK46O#tEq326v, g~pjQb8D_ TDrY lr5"m:p1EUKhʐߒ"s#_'\̶N+?)TĦL?tZHG"~"OCƐ>sqǹ\^|\.R\nC+ߪ߃ @F mڽ)dn PW4a_1E!W"2lZ׽D%M"<W&/H90+Ovp?O/hJCf/~Ud2?: St'|)jQJ'ĵɰο=?V_yM}*oq1tm֞Lwlލk|GS-?/EmoYd/;YȝIm*k `;%'R?jy|ض6Oz՗)&x/VǦ"׃+mo4BsOS$-1sTcHȼnNG:#2DŽUKaMz(xh&nl7k~MrGU/Mmbw ,?ʁ]&TڪQſЫH>.- b6[ˇVL}+=;7KeبMW& "9Xk?OGL;| $zħ3xam#2ǡRĿȗ#iڿ[+KtwˉF1?V}6وR/dbOJ29Nꐽ~bn;{ӛ_,F;]}ᇗv Ȩ(2O_0+]`T+>890HfyDlVb,\ȋunŀ\>> 3)x1/gڅ\"mfDmg?w#Լ 2k6l\f6]d8@fUv9CU7Z*,"lo0e띓R?*gb¶ZJÜl_I;+fK0_`?ν޸hOSJy>Ԓ-#=e&C~ۖrC; ˤmm‡=;LOXb2t1o>ɣҨOwU"6y9H.>4zw}k@hiAq@o/ߗ. 11yzk } x2>Vୈ>c'Imi3_q!6 Ug#n ?1]">1ŕf }pG`_|N?i_fO~3߫Va:!1yv9q"s_o}Flb)e*SEK"sLU'O'_."'d)ӎ_qe/"3_%4v~>)ܷ Ols鋐;J_*}xzM:`i>La|Ja|<6V;}J?mqN}EyW9 mOlՉtv6.V;9^C;4rVS?J1O;"$ HxHү/-qPVc2<f݇m wV ]џh%;υKN:w=-F)v|]@ZJXeE["rC)G/b.v`K߳_$c^ [;{?+W!t\LG: Lths=o%WS✱>Or;-~'= %H)1 micQ!Xx F(tf@ܿ%G 7t*4=%+:fQ R1Nfa?U݃s폭l`I2-[l@U"-~E?&ٖI GgȌsF!qX1 ğ|etc ޒϠ mWjw)Bq^{^\〵ЫTz8X ҍ'|}&;v8mԗY:iy N;C> s?1±\:9W;p|Fis܀)(<c??$kD*Pc \^z(%ce&%46# QP?ĽQbtS-x<i즜rfJ$k;EGy[TO1a¼y9"Ϭ̻c&;6A7Owyts[?DM8/}]4̳m@zØi4@ |Gb1p1x5W)|i!%|ɇ+JD҉~)輦F|3]_8ZL*9 Z?A6Rp ]+[}Ǜ0c"PQ,%/#);^tF7EazDb{Zؽ~|\E M>rWS /L/˹?܄ qxi+/"yV(JTNj_A?#Ne k<+ SIyF0p/oy7,y 6\଱/T6IU669-hꊵ:ی/\9y\?ĩe Wћ?m9q?mq_BxT6/b[ B>9#6<;g'\Dr\Z!󬔏OxA:H$vo%b?ODk6˓wZst]2: 9Q~#6dpNsgܯ,~.ahw #h\AUXpE' $ !ɾ!YR"}s Đǫn_mhMm tBP$J>A~4 }}9.ͫS:I8Aqw)B81%4,J ْ Ș gq0k)rA4#b1`,ʾuba8jfXxg05IiPxn"M7t+1у}!:O y]R׮vQS6z>,͋wGw]e9p*4c_}rI`(G_,-rֵld10?1Q/c@=Wgdq\`&\hzۥ>h5Hƹ`W{6bC :f 7bF\>IPY6qQ2 ~u+cȱ (<_wY_d#rW?{I%ڧ?؅cP0_HJVG|Ycqֶb%hxatgs<~q@ѧz{HbY/nhey4*(pg*~Y.fBc)ml0ͪNS|擟Ej].sҗna]v#=+F_/|ϫ}^Y^Ox'> ]bk  `# [ۆ?;୲=/1\FZ*WO9 ~aD1붸h)gP1ONF՟B,1GRS-2Ieg7I؞߷osT}t5c=7~Uű[\˜Rk߅:yIO~ ,sI_znz^>v0O3 Jqw{W8 _D˗ nwv@Y]1gCn !dQ*}[d۸%[\׊gc. sɾ'97?j̋1Ay87e,nیy)TsHj, Gf5g(AB=8lwO[,<|}( t+'>F0U#mėx+UmRPf:-!Hٔ K>8L2f'Ss:7cKS8#3'Ed~OL679Goؿe^S`70NjRruTq:\k?(Φ`qd5٧o2 [ ̫+1f̵;xἊ?^Hu$ftQZ ,)! ս9*{2{џbi2(^>UuɼGs﯀a_sOAC&zy7Oc-X&:1m&s"c5}ڿgo'ʯ]ā<6!_B)K6hv_4B.m3K+|6JDO<6Q;O~V/:ޫ<0r"WOFvdq2S3&;R<~$"km69<$Ũs$Y⿒`1V5q񿟇󿒁y$,Ⱥxb;|ϱRيiO^ڪIp#g̳\'EėFico+Dj~qGۏR?v^;rA1eAk/g7b;v?Z|S+}YO__|lw[%_fhl"6_dOhslamsmU|T7j]цZtR_t_H',$kdEt"oqg$|7,hcH|yg# 3ONݝAA8vUG2&mGicI.|%B'lɲشCMqjH\:6%$O4gxc=,#wnW 5N3R?$CNl+8¾WKc `*9O&/ gX>KЊE\O"S}qOP~!H{^<]d`* W` QoܷʁZF! +e~FZ X"Ua=ў-\*vYKf^*Pϸǟrg$L?r2)W /~Ka+UBb*<:C]#e>Uy\oM10㗹WD_3a8k}z]Qou8q<تx,Wi1>z5/cl_n?&:Hm*P~_CS\b{R^ь8N"1qq`4$UkrʐP4+5 f$枹I+ȹ?]ߝ4?.r>(|}F?IT':iCI5p!^;x.R%'OB]"? SUunTt ‡qP$MbFV?^'"ɐKWYW~_ =79WU+:,U!-!f\ eh?NI>R*%PX>O#X`%klp7ЏT~N1}ixT014]7cO͋8^&?ʄ  ]~B.z]-$ I]Ŭ/i;e@X9%| F&1Mye";Dd/KY/sr[`Enb5_v]a ,U#p<f]9΃{ PC船t틿$\$Tb-.8mDhs"j1m{Ka%,iGPq#5/ HaSyZ}Tl65q|$P]d<~鼆Vo>ב ZT%rNhNeG(+?K0tBQ>uƬo_x|ӟu6P =`]`; xs+v[ƊRBʡyiO ,FoJ\1gvg 6C]1+/%}a^=p_Y I}Pٺ =~ۓ~Q'!TӒJrnS([swc%/l3UB2 :$ >b}N34ޑntY[P?4ϵ"5׵[/EVgq>P;() i'=NH#d.T;kyhxD׆m݆Uyf<< 3~"@y+}'4o/~0OǻͬNw@E0N[4+تlq blAM O /3ʎ'yNX|d zt/܄7޿c?`bj+܎+E ،yaǶeN["EѢfI?t#|\}+~~g=ܳHXrׄEě~|y/j %a3ڲd8N۸7>z#dOއu,]/ E<m/lg"-wI}t)g6h5t/ǝ~ x+c#~Y}c]sГɾ/V`)|돐+Sϸ\T }5YNhz RBu~gCr˝o/Gyi7pxf|(߷$]:wLm<^+3Rr {vWzz,v{WzYmg[^UcvmD&O6mIkͮD/5/CJ;ßr<>|Z@wEF';eoOsk#X#@ H#"Uvt#6j B(UM0[( epo|&'<ܷ{`]ځ_w_uGѷ>[v&$ Q7!d M* tJf8N-H" E~sְ7Ht q'69x TB#:@\\|ʯ) :7ȁG@6dccM-C)j#{O:lVWOGqGlc5a=IZ;ay7vۿ?O1V@a{Ơ OamI E4D?!(ФxuFٱu9 ^4Ý7"[/Q^;ǺxF6U av?eaW&gr rΩQ}l8.:~x}-}ۛCܿ1d)G\[Lm-VByY>1VT< ws,5Q9ǿq,H;! OĉH*${ޗhT iL>[,TcɑJDC$X!9m&FkpһfD Y,~oYm.{sUMG V=FCC6fͭ"8Wg v*rs."!ui Ilc08(;}s[8 u(R{z}56"6۬+m n+Mۘ? <4 xTqI2,A*ƄP$Vs3i?wB_VmӢ6^q^e~٫#+WgX9>~%ۍ9ܩ.FXyܓ!xyN7j:ZzQ`]+LWﶯ}䂶=:*2`"W"ӫ܇T>1:+\ LM]i@q/|ӟv5N:%"K/'yMj1_lg 1,Y;v}/̄,{cǶb&xh !zуW*]]_frBʮێY<`,ުĆ*B9oƿǓ$|^kw3 ow%I }vܳqӞbW.^cήz:6ǼY̛,D/g.C_d+͵)#_wp)}On֜Pـ7-,hj'M ZM۸t+;/kr}?Io $И U $rHHwVVc"5ߙ'сo_OG ?]b%٨TrK*r_&Eȗz_ūȝ[?V"sUqSmsԞq1I4!t"23I ~WE/h>B`ttd|/~<0:a=UN[> cI!ar``1 O&jyb&xEPG,836w i\}] ߄,;lTKFTih®)qٰ@c(2#ɈX(bp@!Jp~d Go#,@-G{lƓAqO ߡC{Fx΅ge ^_(S A ztQ8o7:8n9Vq~h!яI]Fofe^tk擋/D'?IyQGR\9 PC)~a1IW6\\/nnj4Gqmq6JEJoYz޶ql +˭a>,z2Z ly!yVB6@A.`וqvӤg.+˒l\9f9|_$~b]c2"n*{j;+N,:O9cV'WGD| T[SD*9mEXNf-&]%9(_kמO'BBo˾,>2\qÿC*L3ޫ]R# y0Mee+zE!$R*[5-ĿmgZSzA [z.6@S7i3?Qe*U̦_`?9,vh|w)ܚĿu}g7+~~^szkVnx2d6P=̃ûl_I)P0ǥz(|n\E[nG*؎e~^ѓ5/yo\~O'@T99E@mxl[bEJ6"FlVv܇~ |x7zӖ<'睲SK.o>\m6xaMx:'O\ }v"5+?7̋V(˘4^DfC/"B/ndT".njt|m׈7R+-JޙkΣ>QĐ+ 6O*)O@4w,iK$E"ؗI"}FgGOh_D.$gz #Dg71R#^DPaˆضl!6Lǻu,[rY-eTe;%~;f/I1F69RšTxC[<[3F7Fmّs%Xl^Lm~q#^DrY? ֑D -lU@8䯖}};O{P5ʗzw>'i &Bf+t{]pPLJug>x~9*Ao>?!g1˰Kcσe%41u=UyLV]xRz[oXWd\ɕo׼/{{\%vc\ZYƵ  3o}`JfHSwOB5I&^CljS'R<~oj,fK'E(:%MJXG!D4?wzy*rm |ʼo<9a/`w׌sy=˅Ċگ]'08q9я~~G䝏|#U Xɵ(nB؆ 'XO<}!5"坱8'h,$36᫚soeྂ?sU2ɇ|LcoүCY{ok܉mU}h3o%=_>~=<1E|XY#rba]'꒼A: o ͆s_-ݨwG >lF~K|"%V1D擭8m}w\?Jb9U71^o~ 6Ṅ0B:|:˻(S"׳W0xg1F,m?~Cl$hT^ATv_h68"<͏xū_(Dg+l9 ApGz=c|bQgHv2 p?0 OHU Bȣ]p0|Pa.J FtE 0 Wª:=dzH#Er%P!"վ6q #V;l~q2ߜ~(a0eP\Cc"|ws}|on+so>Ekd&sEl@;δ"^on]~k'?L|C]޲m@&uY'n ~b~/Z;>O-':? VoP: }??h+$gНoo6/f,z8fU/z׻e/{Tvߨ^R?[-mo׼5ӾOΛ_ _͈G;l2@Č@>0_NJy(w%E&=q|~'sؖW_~^qZy7kCو᷾KK5S 9!ׅ\ cckǴD+_%yv[$g*9c3vYHEuf6>S)%zutUC|1ieE#:2꼪M.iaڽ*0}PVK]C'ׂ'vƿkl6ø*:5B'Z᜼|=fNJ.(lȎK[!sR͜o%߸kCKt s[gXsQތ".>O}Ddoſ'A?6PerT"3Pd8@Rǜɩm.lQbca>P=u i%C QQoLH`=sCc,| Z5&?ppW,ţIv"1=gLHi> @09hT܈.Wō bO2{op16[!(.|@v)bSTƢ=/9,:'7|V_O#ștfҿ[ڿĤwwS}[$A{v]m &LȀN|>`WLhG wJj(+;- [gGMI:0 Terf_[7$iGP3d$/3ovg[%?eEb1ODx|p0vEN?w-i~܏ D  и7:$||:a.N'R}O">봀c>{҇2jD>>/Sc_CȧO >e eOLI:b۳_u9;bpbz _&؇ZC^ĸ/1b؄ n<1ktnLdrs\ai6khG_L?_4ի^8/bPh/>l| #$7gvYlׄuXŘ,~rsr dz-D~߷ n]cJ(J_7k:[V>:٧Ӝ >*a߲/,yK^γ#n#ߠ9 ;~4{Wf^x ~E1hO|5Wm ukC }*yB@]}w~wzS]|/:vC^>mxAx//ſ__R]xɧ S2Z6ZN8}hk! Ml2TQq/~~繴|aqb9Ʒ]a*amb ء.AKzs]pS vjhݚ+">R&a?ǂsc.xy'fW}Wi}ԇow [m߮C>'&.R-p.ȂPDiG7MbpV^ûxν'@5\YBa"h,lwt; i< ɨJB"(p<y*g `A?E~쬳 4RD<h9@@A'6@~G$B]6HZV51,QOGk8:o%ZVNUE昀XƸ|t7)>p# ~ hNN0TYo~ϭ=&ſ)EHmoė(hyq8)/v~mS,R *<1u4/^&wv=柲%?hѶ-Nϱj0,A I-†FwБ6d"mmIyO[tkvϘ@sg<::My*)Z G6WN<:0'qTI%;՛871ΩY(}F1CZ?_ qO6=!yvBoqGnqz!G[:ַOvdӰ8m vڰB6)Il}.ai]O Gi>`CiCXzVGM┢Uw9Ol{ߥ++`ȇ׺S?|l6'--]]؅2t ?0~b. r٦H#կ}k=.w?-4nE'xsFu#MnI]"s |k3Ǚ~9}P/f99T53lX]EIs!럔E?1<.0YXX9-+D>ި0xBcP}DOD/r0hk_wz Xp?Ώ~-rk^/|1_)?s?Wg[l$me1b%Ⱥy4p_DEq1Ri琓|1ZH~w~s5,ׂ q71_>,g{&EՌ=nGVZȏv9s?k׏9}{vKe=Q gC]  GSB6A:sH|WJ6Skydc|ǘb^\ޕd),!̀q̬;@@H]E3+xک@$YA}AD.CT蔡 Ӊ0$53]@: d `*t"xjI.' B:_Pt`6sOZ/0 Bk*l+Y%kf!@{e@FVRWۖො0GRUƿ Gq<|MV?_ۭ_&_U;νo `I^ԅ/t23ГBf. cf2h~ =;+3Z~ ړOk0p=o/]jE "ùl xĞq͛h1 }lB|P~1?QH;ƻb8)΋_~GTp^{A]gAOpsɖ"#ǸEPjT;@=U^~~+}\?Q8oHCom,B_`^WRd |$! FVZٿz _ ﯪOپhu-#~mʶȲ&^).7tG^sbDrꄇNzbs җD8/'>4.Z5xsUu>??EұJ::v?mo(㳢];OJ]lt?'CysJO\l^2 UԡE0FS> C/bCiM.ٛ |z=k΀8q(dDGRpi!Me-*U`[(HQ0l,|QD^Dw0xAL`tć DP7Cl'" B_M0H!4e_Lw;N)h^UE2٘6H16b𢍪I1S 6A42h/KAEӾ#ى }9_>7GmWi{eX"RJr_H8?%ݕ iͿ9dY0!XR)bhuezk XX=4'Ƈ.xwquEJQ;λ ßSn4Hz4}C<`PYH}f߽j`ض2\/@%vvc2py'yo6a<;w'޵ŏ=-p{^%>6q&;NFK@>/iB|tnog~W8npa1& qC̣':a(bY$sL..EcoEGm6k/?,\(I+hהwsY t={g/^T GPǬwu9ߦ+/~w_:G&{.6i.qXfYLj@|l%ǿ-..^ю DSAiG\˼ yX/s9-yN `A6؞b-|sxqWz$9mS׺W1UGgW@c:A16a+ u :]|=&fW ˒ f_>Cv?ֺba_D&z2D/O ͦ' }8!wc}i]O /"/R]?IH73)QVtJ~9Y8E Ƿ~l/‡X{E_$s).prؚPnk8nyp,Xa䬎 "f]¸$;~>~~\=bRd鱟}AhCvleυ?MozӒWvbئ:^9  lX,rXۏuqT=>o|6rbm ˑ 7 w߂_~_<{ .nb;!_鏿<{qk|G|>Yϒo\H?ylCwy%=_ sQ7L?, :G4??\hQI')߈ro{NwEG#c0WWPgBNc☧-WvJcdK9;R3yJ'Է, C~>0v(<ŚG^߲7JtӟS\EhJ&ԟȱgwC7y@ޥs۶?sO؊Kú"z|Z7J5g+DLuX &M+1DI <}?́œHi}2:T*tG* ,7':A%H$ȠN,x~(/%J~/~/{_0p}bD-D]a:w'Lڱ/ ƪADs<H>4YՕ(A\o.͋\İkЧ*b@;OkaZT䗃Q/~Kz8|(RE3ҌI! v *R^ݟu`ZMr/>9?F+wv+M@Ҩ}1ږK5n~;>;ڶ"|i?(O* h`xStu'<%+qd"ph`esVE[XsW15*0d0J %<|_[*;d1~%ʪ/tFR5Źr:C_ ^f_?GɥO@~q&Y,P>}~7 O?]cU?Mq$#dc\iqvd>?g˝jѪH&cNx[,Vټ߱gah1>‡¹?O._g?,ǖhS\TqX8ÏkU<.ΫUF[x~~N~ i<浢Fq6/}SHМ>YPFYvm#r`~~O~ǻC5_aAd[??NQB1>b)1{?ʦ?,OSqʿhlw!'%?ۯ1$RwZt5ԫ?5J5Uxb_SnHݪhNaw7ҍdfV>k?$/2*yCg0A2%)k`;*x.9r3LwH4I'2X oEG V7 B7qx0׊%LRo}ޘY؞/gƭnէi[dn*YBo!8w?1tgxN9W:Y>u>&[ofUR=F3 K]1;?Y.m[swb޻n/޽оi`X $y5y^V}θ@("E|/MVT{>> @$\h%Җ~8 =͕?]ر?:g*$2zw{ЩN&lAu<):w?ۿ]i>PQ^HG 9.pwlj浘m >>^˴ntc$qle ]p?Ѓ>'/xMO:ǴOk] iʄ BP aTa_c3FYW;߅KdOvڊw/s hc;}cɩY&a 9ۿO.^pׁ^P| Ԍ_oy\-7;g5 0Ҿ?q 낾B} zˆ,G @׵ fC I'Zf&~臟=F$ xTAA+pԬ]e- Cv{ʚLvv ~Wz?OR8GX\ E]p`  5+Kj^so(3佺k?p`c8h+|AO@x߭R7ui-1hX-"2fs};)ns_pB'0~XW?ɲ6 ր Ct'V3jc3[G9{C\L _ezի6 گ-eC=ܽr8̦:1ުö|{C81 X=`^,\'n66?: FSO<(RlM;}>|Z\T?"@y$4f|K#C۰ElD}P{49i'/m{VveE s_CssLx/Z93Xvr5>I/(JNu~?d?,ȨC^PI[ s){7ڿ SUnTjNSmrbCTD< jP 0LpwJI>;}1q 8P͊rH)pUJx`gw6l6<)%jhu[Ymbĉ\j9>p&:܎7(ܖj xhC2S):T!^$LqR?}x'@#ipvw!Q/8?D nE^l4)/yMskuC /n?_4* psn Q3/0kگa㹻/,)W~4x=,I诒e$FIAOj.cJXnqq>ɜW9x?'~'`ڠ3C.7Zǐg\4SCNQw,E#~ז߱(9SGHޔxZN}E ptKg_t񥾲Αo6|F]sXFrK G 10/ro|DۦBZY}?_0Ig>_eF cc_sS;*=5yApfv.d;E(/eQ`:R:ҏ4:F睉fg"*zS%O ~#ϲu/ҢЯ1rve+Y?ѯ-;,qڞDmXѸT'P<40PGU,|'uzh$A+M7 G'0;;&nw:5Վ>-??BH}+^7AَGrB.:̓"S]a@kNt҄kƿQGNkc36x=!HaH4T b Y\ѫ Lń(Eᅹ؊@aߨtf3" x^vAP76}Q124QU~+-oSF :q!+B>fCGx1M1e@?ſ a,WaGk~P!aPtIn7jz$/ 73ppǹyGM3OlſY fQ)8NʋZ, Ӝ>l}/ }5 Y{^/@{c1=״XQj׏?eZktڦOY*i 7?NQSQgozútX7[)8.e}#hxDj!H/0=ߝ^-Of9ѧe6?} >5@ۦBtC b(YaHw^,՝k|m_/~9;OVUf_I8ߥy_ =.;ڬ`k! v»A4="e(ۓOGqekܝb c F>RC}Yv,42|MsNw.]010b<1 W8&hoxG?#r'ߙwmk@$'w͍wL3MYcmQs//vފхw~ywcqycX?|# cS"v.0_AZŸSdu'#|Kf7s-ɵ௳M2h'o]zq1~]?Й|:\ \S?S\ERHwC<r,nW_8y z6?cmTE'S`XKc+Emh־)q߁/;<=<9=4KS 4O?>iumx:o=˅,~ɺ* Վe3h]@=%]ǜ@ȅrGlWNV~Zc_<]_StR)Vyw+lXY[ڎ#?,bI9ٞ.4a s/ w5'@p!#HaH0sK""Ayx(Ka'ڦ l/T1I ܐF͆{`1ZY a`aD:`/n~~>'-6 =ja!}ԟ[:V%n_6CqI A-ofGQ: !`^U98m 菠lhyذ~OO}jsmȣR^K_>aAA*bt>1.x|Ʋϊoj(g x~]{?2Zɇ=07Jyk~tW;=IESQT c'y,w?#΃RW)DRPFGYOR~$-=ˊc94 r//PkQ0^Qcq^kr'{7n\O׮`=}:&8&_p%O<a8=aBMZ` I4pwbB #/g~lF.~{5;r`#hvGrQ lS͖M\q*|vxA\~c};yda>]2slXm ST+fq"_yR}C)\S*Ώ> ~v_ ؑG #33;c$;z;mQ6V[„ӂzfZ[;|pHcr]t.'XyV)'\ϗʻQa|mRՕ_~D^LM~il2 CK,[xARn3c!kc~{g sxبr5yEt`Q7*{SQ=>~B|D4̴O?%/y 4%;}kaisD^@~:1c ?9"ط|sZ''UMQn'o;tLHDžt)ATȡ`^ s?؞1؀+;u>2u^¯I1nocd"5sAl;_!(1a.4 tJ ܑx4 P~;p~3Ý-~m_RdϪ]1LU &ټlw Z߯G1}5֭QFV8Qn3-bχtv6hgW൞޼Cq ~/_'Ŀ&N"Af|d/OS9*xyorm7i>ڿ ~p2s;ne\ ;>p[!C&)HS+=6ũ1/ :8=H'1&q"3]^w}w km|2yů~RuXOQ"f-b8 ݶ}A#]:}OO1}wzqk8>(6ip~6^܎n~m GItTBɟ\|/˪q6B[lAIE'-j Ə/觅ȵs N?bw}'޴%(?^P=ͤ9)5#7E7Pn,mdY{;[.;~!wy7(c` Trr͉Eϋ"2J&mKIe =W:ռb+ ;:wQ_ q~i `;~O?-g-wpa:;?0rAD-Z,M]a`ט\.PhOPʇ=>)?ukkVPdXS]*Vy]v3l }!.3M!t_'џx4b3l2g*o4 /:/TD[<'C ~CI5Yls++s/tyI_ t?t}NVE Ǻ&l9y3e_2O.ɵ10Rd&2>H}@P!0V7[洣NP\d9z1p\0:vTKl2>r pEۜeD|/+DFŠֽYp El $9>@)9}Hʖ8/LNx4' Ӑw=v"m ЦZwek\:O^{pp$"IoòK_s|Ormi}q!1ON~hnc4/*Btw) D_0їNQɈ ƯU@rFm讍koʪdƝ05{ߖcuR< u[æG؟h<Tϟ5\<L WYob{<Glrw\L/E?^li,?"\D&Ȏ/{J!MAui I`/<Нcъ&/ڲi|mgm;6}k_:X$fL?l; |cv="^\IŘ"[.b\qa?|?Nx#V7L9Is_Uw, #|0ʬt R#6%A9n=^B{18G|V-3߬oO^)a Ol#g<xޭJ㝧ꁢ% "8=S?}Yd8i)Un6ȋpw7u`a k^y;߹\ Qc63E_lUX?baZ_T_e\x㻥yMp Qv|T;素|TO`G?}߸=Y Cv.?2$Ot"Eaao[ ]U4)`7cN/b/%.&<}la]RsWc3ȇLO~Qͯ:+h}I/mo+txfS_ޑXNm~cjp6M 7~* ˌŅq$|6FG5~VOJZDm}{m!er|;|'{ضu^DL+g lyc=nQ ]$@ 6śdž*~Rtr]H$XBS WtXZ͋j/I,]'.cܯ< a}T@>ht݆?:K 钶WzUݼPm2h+s:6#O.wv[[,a=|q[H]Bun$_z:bcg1w|] Yyɭ.)E=h)%Rh1oXvI ?l6:-u%YΨ% eʀYsKґjUa\άh- r"}}//w!}bpx~YX \?Vw7R s."&T&9Y&߇O\ z*?#E+ɝtcOlZ+l'}LĶfu'ٶїucp?ߝ)"81ޓ1%߭s)C&6nwedyES혿xq1W=*>P=Ecyd}p…A٫PB'f.'a!{(Vʿ)3QhgXvEt/?Ov<;tjl[Ƨc~/v~|W$Ҍ?qzL:tc@ 瞟5eg;Fmk5dx_| -Bh[Ǹ?Qߍy{r'Sz@?pDyˋL/hQ_H߷~L^W[vl߸?Lrs:U:wj&QЀ@ vтcL~oeZ,$ Wlɡ;<ﷅ4'5þhc 3cr((w⯍cC97~[uTtX2.''șJu6X6 xxzf ltOmy51+aI#+-^ʵ" 2'}ܨɷ%3Wpw2>F h44V(  j!/'ZtY"cJϏrlاHlLI)ryBX`5 -W<\۸{YSVT ? YT8I}|'@o+V*6$ f: c~DXtbE[cVqw@ `Nc/?YHO 8 ԛ4xtG"祒=Řѿc9OyXP ۻm6-~VMg}M~$wv[󧭿-Q_]fއIr\+-Z~ukr +7kǙ^ƽ)%2XmxL54د+Uo3xȴ-7An6Ъ7~D/kVm}Ej}->¢!AY.Tc勿ļpt^,?|e[9_&0lO۠~XM'?ZËS/F" 8jVx|e|ݗG'/G @یMmK Vjf"^7?;-U: AxN@ٟف'mwg=i{P]M ʋ^w:_AnNvGj"b[me>8:@pC` { _r /ݤn `̥mE.^7Hd?mH~ `[Y.l-@˹^y}u^݉k-7(MXsUwAS9'{ފ+G91}?y}kp)>G\p3f9"Wb Qz@c\7اؗ tkPNʛnwJzPL X<x]~@o1ysGmUm~c촐zݑ^a! ]&ߐ3;O zO2 WAM4bح"Ohg/"/gUF6C'$+o[>d[H_No S/R\+0'E8IF?1 cg%)~dOJy mƹ۩b!Yv#6G#U"dP7*38Jr.*QbG+>\l)PQ  ')pB}Pc=`UAIЯ0OJv/q>jq99.ҙ" 2fa'-3os3(d)T$~8`m Έ 3q^;j2I h<6>S\.-sp?|پ z7W\Q:FL(oK.ZRXӰ_*.04?q\IOO?&wv?}iq}:? BhJ4W,+Gbque!i=7 q6Zؤ&(ɉVBgtc$Gm'A]g }Uv R%/(<޽Rr] CaNEC&*t"+mM|-x~wpm;5'8PpZ٭qc!! s;^+Z\WaƲs}?ε'Feàu .QM:1@g#Om;q;yKX X|>!{ }ݶ6o_?$׿^=ܱ~g]~bAkch%/C>.H!g@P*6+ce=v':/njKժ1gpE;=Wy ݈~<)v{Yzgt-T>2?<41hF=́qS3<,`iQo#Pn0/N~(3w~w.G`PPݹx{mW9_u_</2182@_Uy/6<0/?廿0ڐKQkC'r_ǠOEȧ _bnaYt\xWMx&=/ox Gdy%XO2֭r[[˵sT1^e)&>'I109!^no?>?z=ۂeܣ~81w;Z31싁('*4g??-SaoRCo>nn[>ɥJ"˺ .ޠey֍hSkvW5āRmzBqN =;rqtyvvq@{aCg }ӟnto~'<ѐEq .8ײ\˸Fz^'2sr{m{[*qy?v5ce8vh`i'?Ch<⫔o0$~""eė,ʺ5i4x@3h\(? ) :eB_ōPORCyH7Ў" 'š}j!t-RV %'9\t!'GG@HKtWh $wǻ$9P|GDQF" YD!)H5/Zy=YP 1Fd`1)0$bG<ʚlEr d$Tȟ_j;ɮP-^Ss]RQJڙ, ~~VxG ǰrwiѦ}:̓};*C^8{hvQoY,B.ުGlUܱwxrD .\?UdzD:߮F3ko >#0wP0O$ɣU 0~mD&_2>\bϋ vϗ>O_ë{-D/ 3ot_u zݷxѻӓۥ<9w8IxIF2CVwuʆcn0me?6Woz/0'3ǁ҅{O~@+b39zl't2b0b2C`o9vdފ N`"FEs,u"8RSE$'i5XEN ^J 7P26_ C*V46)ěq!,nsmW#?O.2qB>dX敁CM\thȄ?T3_%`zSCȈGdv??'R HOmtE,}B>@.?K >\|usuC1 ]@#cN9VFl}$ 9m7~mwmm8Wąξ`r/7F#+?DG0l9\~:'ٜ=M=vBZ㻁\JWɒE[en C_ s_0A>^Mxg"e6;ޕ4f 6]Xs,rǼ1gǾ"4^Z]P-F'-&;G͸_(}_8odбt9^Ўڶ%F}|T|?{-b(0*>qan'0?^qw6˥v^9FP<2n(Ny.ZmP(ad^o3իGZ8?S~F,m +drNrg9B/knL };1N"a̱-_u]"_P~G)w:HE bAd?2܇d\3CQ@\ {g*ٟ{_гccLѐ<s̋wwSӛ#+]$}J;9>5}HƋ_+2KVQM…Q '%n` \˅? $!F C௳&uxV2}GtPa@EPA6_$nsn`6hb #Aa [tPNV"doQdqP 졈H"]۱10\qT&bDW@]FۓbLrۊtU]ŗbJ _ioH%%O j';% EW݋[ob2x)䪊".?hO~SǃgBwvΦ~y;-k qo[S[}cvDWw +k<ġ4(eQk0?m!~n2/uYΏb/*Mb<\۾3WJ2DHƪ$B=Q\<']P1D5c(z2dKd, kw"H:;|_,"c:N'v ;=HnaT3؆ݣp#<0mǷIܾ#8&h8G9;NBU:d?)\ a>Fm^lhh~;?./,8Z&?uHϜ X;sYE-4Z}RF1Mo\erU*:Lg3LwWC?ac!e/)͝teX'XTuy~cT{ *Qfgx&r\љy<wơ׻UWƍiD*g[: X&u~Q7е LȆ/tfĴ)^!cQ)],xutQ@;C$ <ÔqUѶTӕYtn{fL2/$"??rn ul⥉;M$?.5W?'絴_6 _򗗘-C6i]k#VW\g&<ҁf<,@M-1BA2ˇl=_t 31qWkY}hf/~BgL|D0Yy "#,tm8Gf\eTul/.c:TyXc;&8Š(`~v$?}Ak&e_cCnF&0 c>4}Plp^b ߹={ \\j(M=@8?5-1{]|s1(XSRGhVcnQY'q̻r:>'l9zY0^0r~~ s}lƼ_8;^cD\%1gD_4}0jQ2O})O}%؀[l$~c6}[jض[Yq]KS,,h ]u}+UL }39x앓29sעo| й:5ss'9lq6V}ˊ;/n4d]%̏L/8xum_(݄ /}KgҎ=cM˿\q_Kyn5Vcpe"XҚr˕I]i9~OT62qڸ_3(lw8'l-|˳=RO3?/q5Gy]g8_'޿7+YZ|C>;dc !{jsXuř&Ckw7x/42׾7+mLYuu̖x0 Kg.F'+zwVm/`]y:&weJ*y؅$utLlJ>Ky5&rV8aSx0️VWU9QyĿsUY3Y2Oτ4sTgEdPN+gɧԜ -70{_c7>3 [:N1]!\&Ey3[~UN tYy#b1zzx.l_N2[D5,,#3njj EY/o~!WN p?t><И/Tw3FWD h^db! J+Ø(t 񪺼?.K/3a8Yδ-Lf\t\BY_w7A!%P&rrUH,"KGm +i̎M\%/~oe%8'peJrPkTIO~ǂc>KVGWx;lks4OIϜ$tZZ5uƛE+Nذ{#Ls/忼h߹Y.:L\@is%%q`?gj;虐?C?< 1LgN|~>Og?ٙ"|ݎo_&L5$7quݱIRzڲ?/<zŕESיwN>Auo'Uf`CN7"'?Љ $W',3&㌷fL;(?צ߈{X/\ė|fe|PoUn|ob/IwKs H&26W~_YpP|'˟I3fذq8ۦlz.]!ҏRrUzԑcb7q2{(ςYZw~oVmfÆHB}P)W)dCCt\L(QG' J]s&Egя'fpeY/:XeC<)Q9VfKN/~..&t/CYP;G_'sņh7z0eiUE>Q:)[L_v,JXgV iS}U[{g*KG뷝4b猯|5:taPb>@S}0R|؎.vP%jCTʌׂ>+"(M:{9Nix}͝{k_Nv}Ǒ2ړ>vҞ+n , ,Їn_O;%SŠ=?y}2$XdA761фU&R3J "ƍQ&6~t.jՉ c?kDȦ]mxtJ_L _%cHwJ>T"*x[_\WO f٪VeJmcܙvٞU;lJo;i/c`}qܛ?S>ƪ#gK5n>#mwO(Dž_96pʏ D;Ygƙm_})yL:cxrQyT_L=HM>7/+Zwۣ=ti܄Jv̎aMZֿ7pAӐ-Lmo]>4\3B2N@p1oM0ŮG9XuN+gǼ/ Z,48\ICEl. 167+/nkpl|~9FīD?_檥 qrtq75%3Y?AqǭYˮ,c*c{)ϫïy[͒<<6[r?dq tf%s+ζ8l-pNo-@?}״^~k&lE'eKlWXyd\}㳓AoU`纶lOP?vۂk?__?L 3xm*?sz▫3P`|ՎJ^\pζ??nǎ8LVnwa%h'V+} uB<(Lit׹? v|H׮E㧓0,]{5VVL 'o?]>3p{d=Raqo,D__9t4m`֮N|:h|+p1إOV?#?b~Wt -8xwP;q=0'7nUg'̣vq ._>.~l\(4~2WߤfB=VD:Vhwow<~эi7|T4?w|BOoҿ6,>uO'M'O˲^Z[OZO| KUؽdgզE ϝqϽO2{pl aKWܺ:Ix(hCrPpxʸJ΃F *V.0 }`'i0X9`>35Ԭ4"d'LǓ|i #"à8Rib[w  ǏM|i78ED\ԾLGp8-Zg\+xAf'8Lp}_X:~/m3޶ */WnXq~UU##|-Ý-N>JDy 6.UӨu *^mi<<*OɟM淈W\irm'qs/>?WD~7} ~'Tҭ4;43Q'>}!/F>S2ʃ|ώ&|cH)5My;~vP6)|De[0Ylb5pw9Q}$ =WR(+d݇>^9l]#X'%wyo3g⥏>8HdtE&31߿[+r 2q\2seG>cgLPgBeStn,ߝ̳o{W}\~~x~3?ԞMvDOӶͨ軱JYmel8w1`Zߢ guW$FeS'2q8tl>䮳qw7xZg綉LX~A ݨ )J8 "\:a] N<8χtBZڠ"Y/)^$˭.%@/7c;'c Ӻ+}n2$r@a!zэ=*ʓ^W{MaN0_wH` tq]LnHD]kJr ׉$ꏴu~Nҋ #{s&{4 ]~ l8`rwJ zN[坹ODz:%941іgT/p6UG?%jnM!kiy|wRW '5&FQ_p{W!ނӫ^zcXI/ ;}L@[1q8~sC&M,O8g^S#p3ߛ~/oh\tL`-?b+m𕧸6Z_q?X~?>/uկd<ŬLj^KtE_d[yǫHq_WepҲ)3nwzMOoዟ6|n6i^KJk_Z<92 %wo\?b}c~t{lQ{dRh<_7ۉ}]. L/n?P_1~s1to|-k ̟g%4YhK{Rۍ4}'>NuO}vM(X]&udL//8 5їh ݏc UƁbnξ Ŷ1sEzn׿~&c:ɆKW#fϥM7I؏|O)W ]0[um&R?,8vc/e6͢kXq#V8 xJJ /7[t-X-ٖR}dA3>\ËZmpR&S%5)=_7}+ý(v_ȝ sSqJcGVXobtה_*ƴF[=P'Y潹MAx%@,1)3 P1dx V . ho@!gTόyg籑lQ&"']EX~(|*+1)LpEz.RYή[q+1٥C_sl<*OvgaDhB~JB{Շ&Qז{gi w QkPLSu39>1>\-Ϛ{Ј̺<~ccBq#*`*Hg!~ϐ݆|ƬP#eg@۾q1׌*#u?N\ÿ ;&>9g/9ե2y۸çwH+}s,U~ϗŸmoV%nk;'/8Yxk`Wk/ykXhM7W_tV?eƣO7U$'" *͸>[o>'AU61Ŀ oq{XY9M|G)8n*7ַU|VfHl|ZH,awn80 2v_Px}v[?yD "e*Xs5o+nŭ[m_'D:tNԖ97M_>~s%sPAQ#u:|u5ߥnCTG5^ Q['vg8]Mx)@7qیӌEt*J/|MrE&%i|C}ckWʱ;8+oXtWwfyg??Pfs?j|[J+|m u? 9 ϖXd[ Ye_h\LLmhRis&fsBol2nl/^qcM'MA9{Fr8feޛ=ԁcD?YٜT!4u\[f qVkwnȅݑ2g8$Y(R0&"ePb >%c?NNӬxRlPIozCA?tqh2p! #࡬l\}uƦD͂TXrKG3ܶg*E:L?>9ɀ _Bdr0gnP<`"ƑMD8Ao5MȢ\v?,!=,_?qQĨA۬†F*tF@O-qړBQƬ#2Ƒ傯?n2V&г7޿OU[|K^b̽`z(Bw}1qCO ~o?Or@G=8D7hcR?ONYxx77w}5Y\L1ۉΖ$cn;?vl>fkov.'>ESͬ|1Obb\9}O]?]Yΰ# 6Cfg,Cx;>sPx} MYlG{*#G]{;a/E{;ߙq"@yژ97qe|m:k Sl4x/mq;0۟7sR%x~g=k|#f0qS+oU6ǷӬmӞ2]w^a&pů/sAO;3W=o757w0JZe⎸˸\ ]}1{>[ T೅?ٹIS×?'=6cr*lv`o󖯄M//0xكҟQ⟘̇N7e<6ՆD|QYsF͙#}G^>{~䯾W" *|zoq3wW}`x=t6DAU%6Fa09ff,ׄ8J^ ٠4-f i3!syo'YxIQ50WKތJZU\(;)KE'P8}u<̖Y.F@'z2YKPcXD?ok_pZ?ևE:U8җdv, f1V'O2u $Y f=ߨiNts+Ŏqz+LȺ5<z<*1tp-Sk`ڂkR3&{y_J4vJ|UQ?qΟ#ߩ0 » [ Vnth莞8=ꠥ 16w|WǙ |>: +9e4c}; q?abK' w>>b;V'86s}>?R]Z]8Qr$>9L#1tSY P5Ϫ\?0pc^ ʸWVWTj?=K_cdT(zco_:5=Po<&{1s V?kЇ8G'I(GnaE<x| W*;.ku{ @>>(nSy]6S~[jH7xqUns5a~`ᘨ}G>޿KNQ;-&*Ny?GH64Q1r Ï5MsIq 첮cMioU5^F.s0HDzhNzM4)t Ng4KvSǵw ,Acr*T*\C/NGbw?:ol_>N}Y𦶎UWLǕ\4k\Fkf݄]q[ܛ ;78g~'뷰'Q!Rخ3Dª7},!qDIqR9θE c̯lIAZm>aƔ~3(fLJ~_mW`RH@{p6K<"vN+,c-1T'p}ȏ_*^BcQuȲp<F&s vxp;9}}Qu:9\lhq3FOǤEu7/!y_ڔGQysrvk]'ƒ* \T?VFxlT_Qijݬ!g1-n|0W3dN=a\ly9-Ӡ}DCa֭7;rë1 q'f~M#ׇAe!"t/ CCS6G7y1AtGnnWrAdnYR⃆TܔO\\ɜ[gnb^߭`mYnZ%zPhC .7 n|c}AͳHxE}])-_[IϤ>qvC+Bƽ*bg6z׻wc孧G;z;yD?+$3?&_.<6/`꿴wq&2c-Ϥyr Xݘ),cir(d[emHnq>lV~N8~/3My- i7IWv6ǃm>^o}`v|T[=eX.?F]ɍ:nwq\wyuo򦟂Q| GN]0-mm;9+q]f{(OǸ.62p+l61©I>gClO08#B`,T‚B?dduH_?ʶ;7d1>/pgPL>Tt-=hM/0ULx,LFA 5*=i_Kʳ _)yB=Q 2&ꄟ 'nFP8YdKRP76 '[9]ܠdpKi$!lL`)jTAY HWYf8*.9靎qStuFH*CX^|d<'d%M% A}0 ?)1&M_+r`Lr:nG00NVj_B/e$h G/ϋ:BDy$zd9̛d>~uVM>ga&l [9-8y3Lh8__ϖ;fz$$qiJ|8Q{:>x8{/?[h ,FOr}rǘOcJO#qG}@yM|.v^C?{S)#p-h4AsD*1o\ؐ0;_\q\Oc5藏Ր1Zxm'09暉X3t{_}qӢϢ'טc| /~U3. 񿴟Xfvo#$^W1yg3n/'> >~]wN"kgT73fbyJ]]Qnr2g쵯}ܪʃ.)7 f7v܈ 7"=}۱,e^x{Sќ,gV0Y58rlO0 ,$#٦%Ue{76GBc|ҡhULqذrS{gn(. _Ĺӽcwc:KXǩSf˼NvB\g4$ti;@:>KKSxG_ 6x;yNNRZUH~Xe.pX1㖫ѿ{H+/q^4}ﺡc&T_Q_МBӐ`hm^m"-L j_j,ZƏs%9~4.+?|!g04~lJ_,ע}k6zȗ߀=}|ltteVg:dTzKh&VkމF)(ܨ3[:縉$^5"M mެ69mT)xWXIFWp>ʮ^E`3*A5{вs-Lrչ>8f'!WY`J#gEilk8qRO:TFAX%/ k{B Yu*Vs9cc\vhNMr l&ޢzuGQyK.!GO lه6o kw܈?t> ]^L'mƋe]mZi /se_`Nq#JRVyr F2 S6ƃi N?d$oO:19oE#nk~oktO=t¿B}q_y$x(?Ӫ$4owƫx.,4Suih?D,`n]C*%'%FsDwSYԆpy"x_ >z2gC;Q׫[= bYuPP ~6C9; s|le:f6]v_ҏ ap >^#BPDk ĎZl2k1{3H2K/sL: ̾u 9e{!4lu/5cio nW0ڶB_;{;L_ b"ZIFb#3؃^+\5ƃTq NQ :b "_/k?\G꒞yH8}?6&QQ*~H%LLY%5(Ni kԹ{ KBzN Y&PVy0jGp{Ä>ޏ1ͷZ&=a>=>~xqX3N#zA jCzכ/(zW1򓟜:W891 ZV3lʹjlჇ79=_jlK 6%]#oK^$9jW,%Q/f/AnK漮[ɣa& |Fm^xﴫ?mUہ3 'Û<^p|U?YW>q'@`\9?k3t", (.uc䳟e;V]Ksưf݃ʘ Q  Lğo>==X>.-pŬ 9=}qWfG}«Oj7"==ajhb"a74_#DXiHߢL2I;fA_L1wQw? o' K/H{}ŠzMwI@'d[q|LH2f5i\ϭ͇X2]~C*o^j/7]h( ,S'ڼξ&#f)T[=_;q;y.Bi5'f0+HD}T6o~'u /cdɄ ڋo_jIM4v$#.7:/{-/qwN&y,S\GLgG<}&^Eon#tmcf, :LӭE $O4d8qNd3S}7_,2+151Ma>w?~s](??0|_|KЍcxW o|㑌mYTdQ{8܎JmX9ޚ' "tTDZa <90_Uo'z/_;p_j?G&`AL%?٠[G.iC >a|VV$I?y;cݸvQYN\?w-˱ԃWXe2j$w]\8{yb3|VSwcc\ j&xs46pu/(ߵ/[${N6F@Ar3zxQc) ]fp_L 焓6I'^(_eWX1K)ǪVt1g1p[? ?Vϔs+9MqyAxc|6m%!hi'XVgIv7wq=7#%Gr~b;)T6On?A~) x~u|j\3!;DiB cfᜂt2̢ P k޴r][t[O,yߞh/q بv?.mcGs;SRhQ2f[2ԋg8\;h0?q)Pt*-ڰ>8O5:C q>,QYM ?_eUeVeS&sILOoVKEx;8Φ80T: CN2U1Q,"ϸfg6.Za;m⼢ ;q{x<*Oj9Vg"ʟY϶dӄC&`s{i'Vzҳ5_׸pv | aYw}]z /zkdc ?mJRhoYx98Hy1G c c5)=.L!/p-*GLpd"yK1?yU%6q?=_eyĤ~HTQ%׾{׈Y?:x1VZ&3gUSC#b< ߃8-}E&skM;d5xɲA&!YX]vxBd_Mq+:g8} _8!g_:m:O6v^~Tm؂uGQu e1*\lb_Ǹ*|##?#vnKo_ ]w7qK, A㴓DJF|S]]X.1߱QĺSYZ\&#g3;qvIw]aIG?pqEnp;qpcƔg?29eHW2+ [/Wev#~|ofKO%b9`t//ٌ*~sؒ~QM̿.F 8kKौ $d圈bfq(x*-\=m\m]f?-0L O:):z*0*tiq#CS_A֗Y5fˋyLE1+3?/+>-^:N-cѹ9ѰIUqf`CCK>,|s yCw/~=aA^YIgeMdS7[bɜr!c`F}Ӻ_d|\֋oyT'Q~᧩?Fb^-=l99[\gR ƙwV3N'0_k+7O.8$unGGr%'|3rg۵\OXNu91拉,E;=M/Ν,?`p>oƿr0̴ڦ0W կ0f$M`]7KB3՟W!8,ߛߪTlz?}7}Sk&*0]q7I/ć'%YCCk/02]Y{hÕJ ,W,WT?x1ƍM;Y(ofLgcyҒIyLϱJv1U)6r< שrOp:F$Fp٧c@#b]d #aa{ƶƪD-;:~-=^~'dl&x.,죝ο\տ6p2/Dx!!X׿;Xpfa=bLg Av]#;6GH WvmOdp<ȾeY_ %GgB0#YsU= Q-1v3w^&IDĊ,{/er&aWߪm..fM=WvdX;9veuؔ_.TқH?WtK7EE}59gxv!ӧ 8yL%6!{*\@D#ҽ)*DfAlMCAan 혆y> [[6j('YnuRjHn[x꾼R4.Џaxftp_B`R5_Ud6`X!!ƙaoLON=.xqRK'9 VTj .A5%36T՟äl=o)m`zXF7ߑ^t7;qg𳮲>$} 7"c@XKcPǁ׊?'~޻5ɣXʘL3A}h$-Qm8'S` 񿰀J\/qj<+e+7x8bB/y4^V_HJU"mgq2yiS7fvc׭Z2,9ɦ< K==fr\+PE[@'c{cBb隘5{_?yՖ_??/_/2 ߉g˪o#;g7#Nczw5{>Y27WVCEk>!>w\Žm"n k۲lZO] R_ ErZz>a7Wl7%?C9$s0XΓO}eKc$/3@ɭӭq|-$6 2!jd6Ȳh귅gSz; H)XWu_ulN_% G ~;26eVpVV6kt;Sv :1DoNd@Ql'ݱ,mXy!D2AYN pVCum/Iq~+1}_Ru%ԛY39)_х'RvAւ7x;f96t ~֬}Q{+s[ukyi5Z"!256qS;}T[P|(YA)E]{`zϸ+Ϻ? ˮi4nL$w4E8+wˤ]}9 8A|5+UQyv5a4nX$:K~3z\1g]H<4eԹu +27}^R~ pNV]>g+\DĝeZ~*oel#&_f7Z۾y*f|sHd0˔v &<3A/J]Fcs}Egu*װLZ߬~`7c!g$x]2$q+3/qMY.Z7G۠CuMt.AwhA/??}ym6au-bӿ~ڪt϶ajhV[\ȸv/[w;ΨmۅtR݄ܶq2.R'],[lpfcȤ`~bgl;ǩ놅wyg~g[KےK}X>W9Wu)O]7fyԗ3i&} J7jts?ć?`e=,8LXUhq,LߨAp%L|G,cSw̠%ʇ1/f(. BFYOF.>]Q,dWZ^ ŗE:/Vl}_pnk*0f(;O xL\ j*#m[tcZ VcylE薧h9]vI\mZG#|quFnxczo?Ud|آ 9]c љ [yGQyş,YDJ|BmŇI8X&oө]1EG[  k[5s th G[dθ0p-kRh=$ٲ,s< _gGi/rAoԱq_cgpȊV48hcsOm I|c䗃|B<%VWbQ֧%/7_r|Ixh?ɪ֠w/}s_QGS1a~.hmp"`P'䜤]I>y >~Fޢٟ`ĨESFqZƁpp=.W<Tm]4w9ɃlV;Y?YeK'rOOIWzuNc]K^}q&~peƓ?'1z탶x_nöWeߴ(8\|#{_G'ܚ݄iQفȱ]_E^ iiv 8-[P$U q-ͽ>7"j/W/ nLjV\'-ϭϕkw](`_]٩H&ψq,xiWbS*G#|.9h̪r nz-ajNCHH 'Mh o(8>+ 242/yq{[Ҹu҉?uB 7?CՎ'd?xUӂ[/@;&n?"mtgچ4:μig3t%'"仁ܙ.W8|N~g>*}ʶc7 XY)68~sr>aTα\`:^. ?<>?-Q7l/R|k0Wf2='<p CECWۜI|?owoʟH*{j??W4\yo >>{i~~6EE_lgQoZkOURнlsE5ΘxH_^ aT41՟) m#K]TCE"}S+C<4s,YI޺Az\\N#cWK:VN~n;ؿl_=2).=hES*4q%RnϞ2 12~f@HHtƤщ=Rj5dh3ZNX|H˼Y:aB~4x-65]3Kg||t* }sp*}9ExII jSOX3__é;9$' p~!`q*%낇o( _ɢq<&iqΊ]+4 tұ ytBa.ι-Ħ?*C/~$ݖ"[6>'zհ`5%VsFmVN`kGP`W~ؤLw ۦe \u 4ALxyߩMpvtNlf.+J]y;0o;KM0-B<M8q'ƭ_?um^~kS~MdpSK%r/Ѓq{qi_A{Q{~W~C> vtɉгʣ~1\;EVXN:~CK1GS8=6/e|gh*; ??j:FǶo a|w|ǤB%OkUiۀT޲&E602\2˄\W L"u_l/,*5+E׷>H%f3oSXƬny[N23,6 }k_tNҬ8m (7WyԝV:V5xM;zm2CF&gx~BGS %P`{%ԈunT5VfS82Y/|!~/ڏ/q@aT:_zjTx`.n;#}`]6iזa%a_%6iÊ1w˛0k祃!e\`qKSFva;ߴYbϨ;,1s%6x߽&Yf}N6O!8K@u3:r խ%>~wφTYbϥN^'2/'#Ϸ&f-/[2퇔ITng:6]ҥo}q:@Iǹ{}2ibCG7z3c]WT^@o=4ˉL8ajO41_omuxKa )R_&xCs*"=2v`E\'@1~>onV _F?7>:u'ރO[I;Yr*_"dϷ3݋N/yN1Ţlwlמ/\,YZ302pTuzoD}HQC('!קlwJˎ+.6C0c'uBdS} h;éq=i:ưh! eɨwNu1օeG+#`#Lgp2TFu|?tzu " f1!;~+/|jOޗoww}=Nv_Y'nmo6CU=-+Y͉Y:s+؈u&;ɤ ۬qX32HMc :U=Ӣt/oC'|]bc:PwyIB dG|c4J zOo{ێjKt'ٖJ\'E!/6oquHfyw|3YxV6s}?%n0l_x$;L>*_k&< l/myz?WI8Vjpq Zz^ƱRڪ(p( U ѻVMMzi;,do+-3ՑH?W$bZ^hp߄=pm-xQ|!zf\O|ǿ;:{]wvTe{$VqÉ?|D#9>? =CN(5;\S[0Zg]!1 X!cz"9TE|`[$#qU{WDuft\`׍L#O಼d>xC8rc ^`%N߮F;c1() 1NO&条8sϪz8W낟̴NZ3nπ#8mo)F½Zon_c#0eπu,lc7~V~#*Or2}~g'^Qh:GQy%%l6GBc#v|@[iKr<Gqن-'(cmd ^HkMB䯬 ^~&o=-җt?@ ϼᶹyBi|fyS?H!.%~q;E&͸;(:?2X!68KQh)8j?OF~](I?;e[=[++{ԡ,?T'ۋv^ݸ(u\ttLE?þ1WC?m-%}z?~8^\owvknqͭ}<qR.w7r" #_˅K^keCL\\y"jNЏSg c5~p]_(Xβ?|NK>%{iȕU9+>+n߈l LL^ ?7"q%Bm_)N}y&mLCxyw`۬8Vpa윂\&}©AasʭA쨭 q ^AcpX'Ե:PpVr6Dl]=`oys\p|" 'Ѧ[f?xYsn?"o*]ބg%~ŹE5<l}+t9[r-SOh%wS_3BU\Vgr/< -xۗ!-^2{C1PqfX\r+Y^y歓a3s,ö|bg {Qί1/~g=Yac(n(j#s_;#Q ~WKnMumg`=qR=AێmZ.w> "C1Ylxde"++E7N@H\AM]v&3cwZk{,>@ E1< '<{ _xb/ U_j}Әɱ'p,+-E)6x֌YSv?j<b:2g\,vG.}`\*A4:]b*?A[ή+):.4SYtA?.gBFY}Qw7y?sB_WdzƯC?t-5O:Ų_3:xqў )068!AUV:3IIhJ@}3ig?YV#>//:3x I؉Br@6="ް2j}O83-<ƹw<blr { tMERCƳ$s5qaxf5c:B&BÒzkumd<ҵ+[ øZCfuvD7d8w_.L]6/xgQQoA}M$#ʣSSFrdN}cE;Tƽc>'L>JSKK+ŃL/!N@>=3 djy%LJ9*C^UoQ;5Ad?* a^`o4M`C$9.?`q\ⷈ~-!'4hٷmuE Y/V`ufXOW6+_Jt"Um/qB#-rKjf<[?iOpudk{ 3!r\g RN0t1Q7~7*nMMzG}ٕ`=eg|Z`;z/ 5` v/]Qr"DN`)V]Z9Xd-K& X-wh/8N|yИoxS;U=t27yjdqoѳ)F~k'E'f\[.9 !ٱ_cҧgNsP⚢d#kBAjW;>QݣaM}[?!Tݗ^L6k]ax GmЛfO,>G#m+InJq ~Hb3 <^f# ]QEa}8#>qe̲@[[k,܏QBc%ܤ]G3 w-{WuNeM.:{GzR4uƦ)W&L+˄cy('sa5v{Ζ@ CW/<ܬE^WbK~)NtDh_ŏlmU 7j]cz{j/DT:d%Wg"=c[nK_[QQcË4~A{ܳUİ@q)}g:dJ٫<` r,.B_Qq}N;-8%cBEF3Q2 Xɧ]?vUڐ̰e_}EEi:^!~%V,.C+rM/7dЛ۬e<_1.&uf?ħ>{e <-wISZ]rf] m:C=zCΝh[ۅA_2\`-6QyTf}qfg ,{Wmz]u0Wǟ#3VvNVp-t$\/8DtRV7'?a<+q6aSyxݗ[H\oCO:l G+<6z<; y|oNs.#tyMh[Uu^ɦx?7AlϿqς-GN5Ռ2**k~E(r;LN1/&<?|xg#kY^ͺ:gTZ5-oy {e:;eߪ<=mMC]//-wyg'D+q;'+o2ρSgR1! u5;)^yʅY*/um_'['tO|S9]d?I?%.LNny?5O QS@߄Mr|׸kg'oqw 2b}l6<o E?ԅN?_# SQyTqp#yZ|$q"* y 09d5Wmcy [+n N9!]a; A,G1r;׉įR`҆8=OW g׆NPW"J@WSDaxE O9P <|88#ISY}9@J+uMKEbs̀F~|ٌ^&eEp-x2/"+ fnE"j⛱]>ĎI,ǘx,3DҾ/yK&;y^2 }69v ?&}i"H'CΘ*!g,]f}/,2tR)*8E3| nWvɲO}S< LlDžLLS\WH~*]o39n4e;-71N Ϯ㔫F<8pdiw˥w(;niwݠ w?NWc= _)EkDOk͊ 5A "܀nh@+؛ºbXEBL- ?L?{pW6iu`P LIخoB+?&60N*nP׹{ke|]Lf"1/4ӟO6j';RtwMGLR>/gM(B1>>Nc|40Y_Y4fkoG3qRs"=' seIaǰO~Wf6n`s6D:gI,.tz'+R㍿Sz7m_lFeg6'v|sM/th_)Xw1{W52-;G0H:idD_&%Qμ9[1 ^ @ơmꉓS)_C 8dzw^ xFq[g6Wt3.8ă/XsV"ƔBTcEmM@ q'-8$܁5ߧ 5;g-/PW<Ƌae1QBl3ҜF:Ci~UVG~0~qAŮ0\|\yE G?wC(5,s('|$;GO_p$.#q8HB7+ }5S:o0~~rX]tzqV0,TUW>pvv7Ka&z[:cL e qom-]8Q0AKp*+ux[<&n\ڰ[__x~j.[9u^X-Iė6.Щ8%zrcO6_%=W2s| fε??\ҍx~=?d%g3D\I;\Sş^̰]nߔ67hjT૏)npcgf'HoB=ׯD\GM~A؍3-cGe;tkV_~b>ßgҏ9Ue/OV߇̱ 5x_"r^b 9j%=\s.ʭR5a?`\]Lw)=Tc9Yv́Ąf=Jݚ6ځfɽV?Xٽ .QֱѾv L˙~׺Wpw_'q4>'bq&#Q4y_ 1]A49c<:].V{PE/k3G?۳5}Mcva#թM*Ÿ{EOd80*;~,Qs]>5HXVc=EYV l#xnS‹gNkKQoC>R;5D}׃O5G?U A5#f3R߄"ۗU?hap 2g:n֔I1bpsgGᕧ!?4 -@YPʵrtE*áҟ?\{uz: 3hc(8kiBW6t;uqߊ MCǤ٢}pz|>'Q෮5Ԟ'NL~{DzitʎF奏:6gc?);g0|}(~`C<ܕlԿs+%٦v)q2]˿?gUxįBoW9ǥoo]Qc. Z8sL@f'T݉5l;NoVD'k19䄇;Ƈu!k.Ї^@/h|OHХ|2JLvs[$#60ry!b2RVq?!x {!O.ȇL-/wۨaW1'x?ry+y\\ 7;*)L -ng4ooE"ʌDnk xƽ9ZC)~ .rxM=\oi%v4RS*%p;2]:Y9^윴IǸGTlcgX3:d"o֑SNQWLybFq\KS8>7<@Q~?*C-<%צDS-MިG~NPW.+o&zUbMFʪy`|:zG(Vy}8iyG|uz1—z3Jot<h >6k$=[M?Dr}R~w9wYI|v\8_N S_)\bܯg Mf}a5?grepwDI'Rct9x6qwеu4_Iy:ҙJ?szTw9gL>͊Q'|1ϱ}OǎS5sȧ*ɮں}7'P&`pתt|1gVq^7\#Y5EIW˶+o>p,0d.R`sƽe^Ms~wp~;oxo(t_`·WhcmG拎OL[ XcEq1bEo՟ jcK>)u<居X?9j.QJp[(yL wUy6`9sI-~;V&ONǪS]Fq1l#(s78 cɲvmO6`ٍj5 vDpcT'T uZU Je?98J?dʵaL&-^EeqgT|&c_=^渄_¼ Q,‰ `9 V t:by2 `N յg+ W:g8{)?8G^xu\=>:yG !yyBˋC,qn~m!n{' G?Qmp"5D.w3`'~X֔L(%/)_~u/ۡ,u,?ۋqSHݢ񌳞= _fںݘ6[㷵5[QPEVnnɊM&=l[^u<}uns9f~%l/~4(%=I\-4~C4X69Q >˫M7Թy4/GSYtu݊cqcX.uBHYSIoվF>ʌ~a q}-.*?g?1 HEwW6MFak,L|˷n_[O8g`o2ۈo:BlCP_GD#`KD3p=&"{t|Bvgbcg$'wVmނ"g{؋>ͬ}/Lхb[q?έ_tk P>Y+C;N^^ԟٗt BUdz^"8JbJ?vUU&y{w>}Cq^j} J,d!j)cN&͟go1?oΫi&`iF -ո͎j!u"ȑ~\ڒ{`{GVb3u4,:tܽ?A ̓*$Nhw)QnrʣryLΕ0e%utu~K3<ԣAWP'\pN@O$-:S(8Qqx) 4D񊳷[ OV+KQ^<wk\:_ }jL2ͱx yg2Ke_꽋?i(&U6i*7fv3 ^LY|}uBs&UWXmCU9NpQ'9s-$,GU]k$Qp~A{$я9K3罗q+,&ߔ 7]uE9~/+nyZ;KH1|K_zځPݏbMV`z0c~vYnjylm0^B(R%QcK9? r&,F Qb~{S߮^{H5]]U3=ݣu\N8)mjܢLkl77lWpkKNDzOןb1Bm_F=.h8IwX <]m3N|SEo׀oXK{H7t7"h`kA?yGH tbuշ):- GāESLk6/>^5ׯB.sb7?K \WgN ~ۿۅo%˴{7@|.(<%Y9jOd1~_xG.;,}~6]G :q>Ɣ, GoZ9W8<#9lM,1yD{|܍L sG:^X !e:4rǐ/,9ė2|蓪z|?_`6)m'5" Znuk_9;=K_K#i[{@:G]>l$8Wu|І͌ӊ Zm+"/"ȷx4$4"i[u aUGp 5 8mFzNrn:hMl_9!c5ষeKvP_x4H l28$ymaph[_hʰAf'w~2+"N- /!t-z&J%uq/B#Z.2m(x}i@P+'{ƾcUɱ.?}MW]^`P?}+o}@b:|,}Hl]f$&\~[z>u>:y* y9>=˹ -tzn .0bB{8hxj__@+WmM!=E%}CL%| f/S{cS_MƮյr,z$NdHߕp9ql>w7yh0k9[mZݦ}حۃMe\Pu^+xx){bYi`TnԮWhwX>GY׶ys<[]NI' nMn^,_+yc-whl}x_pq}qsˇH? A]f;QpsEY<;#vēG쓰yP`>'> ]^#Zw1ٺ_yLuYۙs^+G m{U)[/Lhdɗ%ݿwY @ޕǪ/&cmYqsMھ䑫2\tˎhՖ}&Vo^֩Dvsc5>__ΙFyF84]nyX9N]UsN '/9.yԏ4 1౮"BwR&n??}^sɇ~ 9l?i5l[pJL<7_Lɉgر)`E'm{eOƎ6E#`5oy6\io~3qbH/4 chFܗPx<(|\ŷvazm]YЛOsv髸94z3&dLSG& |Iᬷ7g Ǜ̧i m+_HVF'`4}6g s&=XIn7j1m|9[h?~T]FBrn-}@AelqE˻q9oۿm@p9/=4L/pU5oj& aEkZ|yxO&B6D1̎A]rU^Zg!sTHl_򺐁 vOK|:ggCƉ7{zs*x-|1?̭&_$'dN%}sKہ/s֎g>c|tl6P׎67{YzW}T/![ucѠ;Lu>伪Zq<WQhz2?ƻK_A3ޅN4Ά\I)ǙMj1}~uk,_k@*.16Q{w[3ο {VO;woo4{|vopKX[[\>uZeΓn̥dQr@<;G,zpΰHaf<%&TGVQLUžA~n[d_g9rаxjoڡ~n<`[mm&Kvyi٦Ĩк:ƉV"_b w[`=?=}_fmgcx;o4 ,.:+'#"5J=VmVKkvVhOߩ#GI9]"p2/L>= n2d=?iK*m3g ;vPŭ<]^{y}yw/C_4c5DrF7Jp6η9q[Jַ"8LFQR(3^Ka$`` uLgzɼ3E p+lA-€ֹ:aĖnƥ׊Nn1R6!af\4l0{qqetjr|wbz:K!>Wyܪvpknk枃$͡8nz&DKWwiJp=q@AZ:kLؔC>L.8vP_y632uC 6؏Cn& 7g ʻma7bU cMhbBvڛJG\Gyo+J߲Yc|W?弁暏F[LD{Xzъ넹h|cOF~6a';dHߣNt9,OJ/G!9WWNL֣˕ؾ=L_%ֆz>0G kyDK?GQ.練k+M+w) yI>#ս8 `E *,j\ .k2-F>LWdpчOvVo4=22[6~{IEqyNF mlͶ{W"v'r75-|Up]xYa7<~[>M/S>$t*ivWس }g,7o5fcEs':^O lC7?8f#4qKOzP6&+b=]0zu_zɊ5ݔvtšu\>b-ŷ¸ɥ{a1j+Qv@h-\Y:9sy|a'C7 Wb` A4ͭsҜ6ϭsUk4b.P1me  &MƼ)Yei}ĸfځUJ3Z6x*wØn3¼=I S_uv[2qqAT&Aǖ G+~6q~&88!:?UdmtഭP^̙Ю̶ZHn0lBn^}2s?0/'1}M'x5򮼝aMJlY1C3ܬP}2GOǧtWf}L_T9=W?m½uZ4NDG;F!1F x%cev$㞞<9Vubw1n`GHLmCTC̕߸W*G.}j =aQ6mxxyGcк8p fͺƪ|-~w~v$~誻SJM,?Gm.i[:0rK{/r1oؚ݁r//_v mzuĩ:{ԯSS}{ᒿ_ org:mYCLWUG O\G'H~VlYmVŗcVܻ4qjS_1~SuP(/R>CSsWd;6~NZY`cr޽ S>O`(b⪲F]WVz,8tg+; KlBun~l؁_He6K/ 1!&=PF{)h6Yovd+̉0/ q9ݑpc9x;GurSlיD_>%]}[ 7}%Ҿ&}ؤW2&#;mos:?yVL QO(ȟ;(G0~M_zl~j XGWۆNX*jl\}ml)$ǵ?ac4uvqu;y0?PE4{ė*+?7"8Wt?{>_m{|2KR/Un(~ fJ§7hQ[=6h6wǷh& /ZH0FWm7 UkZ9^8 Љ$"lπ`cD843 g9jyݩm\tuO+YQߨ.q"$(^8:٦h<&rn92gn#$ל)js~//o9P5Aj6~6VA_K;vj >p?Ԇ7=hƿxY4R]dVNJfUyƚ 喅vu:gguy?o3Cޣ M&JiQN/(8jq~#tv"Ctτyג֟ѓm-5/V~M;*q5;~?t@G1?}կ&eY8YCbᙿ9[[D/\k2*Uj29Ǫ/mc>͉-Qx8K1om~G~d}oo/>pm͊cڜWBgO`0_X&v:ZټʹNwubMUW #ܯK%;8ǸmU\zn#ܲ:W9nC`-[?}:no?p]#'1cQs$:}!vN`nǓ8=Wz<__Mi!xqg4GY47߀襛myk?V`m'o9D_`"~}KOgo=Ww#]Fĸ,~t˻yN^l{~>6l`O~ |/m aIf2]`L;ݱϞ=#.wZ~661,m,_oe"b(\9:ˤ6 I|7W_#@~ﺖuٗY`=xWG=/ $G=}.I:z*HPYA㢕]} qT52e.xOI[C D}v|_/Q8h\<(pyj-]'U4Rtp fh]+6ڼvڪ=DWNr7>G7ڿ)rW9aw &F^?Q]͘ DW}Ĕ'0f RS8I-N4z_t _Wޕ\b}[fX0M_kV /v Xvjl: 1ycf7f{׌bH.J# ѿxUy 'ҁ͕vկ;k ^[|X:4T;✟7 y9V}6my?f{O< MM8NȧO'з۸\Qcd@wy:~81ѕV摿hx~م>U5>eTc'ιE̓I%}s%6aȱbۇn 󴍳b_㵜Th2duow[|QmU<]/V՚'BOqk{tit~Ts#F!Ei>q]W_6]Ƚ/P?y陸\RlڍG;c/|x-'hhb+Rc7Y&7aQ*wh76.kݕGU[Sޗ*;9uX_({=IKo~7)Ml:& ^ӎ7Vxms鴵c;wR(3bAV[.>>q'myxҍcݿxS?f?A\b}׸C ?ʷEo,hui#fߌ!.?;_XڞX諉IȾx7+‘?Θp?\ٿ>*3G-/qF7~R oM+ =w/7)3է;*{+[[o/%+WY揕z)WWUɭ^O&mD4'2 8w+em+( FK &_-M5Ie5j T':u*-xlO }i`Ro*N+#:r"^'ؗtEhα=Bȭ2M;$"y2@{Uwɹx˱x-ٱ^9e/6@,ХN&UoznX7XX7C;4spXuC~c}ߍw] A~:>>*ѶAg&,٧&:]A J<~w_]ti@`.08GfHl8xƫn݂<F%8.".apߎWANCۓ7^}ܣ:!/w@ks hF:9w7fz1~Ә5Vh`> ֐XnCys?gܬUrbd* utrD2n{{W[sme#FA^nU}Ťt:ݹPI Pٯri[-i-G#<. 8-6<ٸ% FӞtw]y+͎gy3(֓?[|='#G} :꧿(V ;X+庎w¡޻(nkj~;q$eN=MgrG̦/G{B M2Ƥ`; s=RC c?3g_?oyN kq0-wm?!'(yƘ~N0T{긭m(>-og㿝1Ѣ%(n|ãh'U=׭ FB6cOa6^鏳L+97hȗfsw@Ov,6I8ܔVAھו5Ek3w1:?y50O̎DKUp}Fl뼯\?{O]XyMflݺuW}8*o}a]n?m3Vݨ9It-U>jDф{OkA@?˕褹@Xy=}s+N#N\@xUTWwB/8-vhOh_\a.7cGV{wuY2]uvP;/lEƿA'!ePIO1l1kcؔ3br?iӻ_7ݦ26!_.}—yCes?lpjs-&59?W?.Ǟ{N_sw'|ɽxٛcǤyܟeS=f.as @Qk죯x1ֵ&~wY'^ 58|,'Ͱ@Ot%l.a]~>jq{Ѳ!pn5fs0Eۧ>)yMv{pl83:ʭkх "_9@:?W:nxw_jpe\:v}x 8GPp-D-3~4AhaN]yWScO58}iM+w;L#R]d&f,ޚcǿ&.!'kHZmL֤0wۢoo?lso8@/ 0~tOeGZ]+c2[AhUxn]ƌ8o"CnT[~zSh) -|M\ŔKVu-NnW~% ]&q:>2:@q8mb/BW>HU]-5?N*w/;i(M~GIi(~׏-5dU!_l~ ZYwt_mJ~vpM >?w|6D0}wl<+Wfo?'ͯd ]1N}7:~!a_/73쿌O^:.2`<7^p|1-?(>=Q$TdC{۳H4ށVsW.tm%lRױ/EiLκ"A║yQ}B`tE]~G?hj~$RZ?c5خCwnpgn/)O7섏^W?G[U4'7MvN2:܅7:~ׇ_ ƠƮęc7³1|)P4.t_lTºlq?h?a9ic"&8fg}^]'|aɧ`*Gsu,(⋠Vmbtiٿn6?7E?78|89ML+s"=*<ơbu@Ҁ?O{\m??4yKXKB 6WPPPd_<9Q66Mrxsk,0= DǍ+7őTľ<Ϡے_M[Z8}n? 1ٵ-$88$_-9P\ALz6v(`ߩHQiYTTj IZ]yWW]ԹXFq$3E\& PlMVlf;.O̶3jE7Wןpu+f ]C\EV5'=IxtK[#|]cJvyGzFr<(Ms'4Wտ~af1yOG>M+WA^r 1d^}p.`LۼH+A؞v?Ñc)oӇW}A^@,ZtoBo8I4p? ՜~n߮2k׊,9bhD.qd\eYM|+/U~)/PkΩBK#og;J^c%զ^U:Xתjߢ/T]'2[xk5!U.l;pjͽ^%o>'Ʌ=4χ1U\_LAVMNRx]ɵd Y}Un_W}5/kmBv]d?;ŕ>ڒ<QN8fF t˦)r@ }r%1.Ҧv?'V-(1ًғ>o?W߅.qmlq|7<-o17[NV[}:Cy_u+"6ՃK4 ;lѦCCe'yNJ2ڱ?[_l?͗bgͧ[l6 Wuږ<{Wޕ\~&G ӣJç .Zyyq\Oԯ>G?[A8~݅>׮{<t@ǝ7z 9 :o>?_=rȈM> @G;m>ޗo.CVZ Q0o.s/d)&nǹ:.T|,8zmΗ\>Â/ͼ#N`l(Xm-ϭ7&nm[tkw%cP1?WB[Ztd~y/N^klOsa9J]/Ϲ}szFe?Xz<{:ɟ}T}4 xlnv*cm!; mœгp)t3f 1 ɉ@}̝;kRKM:{c7Wύ;3s6ؿbi-PW?ǵ jzۅ"׿ޮE='-]Ծc|f(:S, 4X4ڿѿs*~*zO;anr<)>:m' ,6Dcyӛ//~O}S-eQKUɸl>LC"I7/8){(c=$cOv@q1+mbbK]@Fiof/̬&no?]e\IH?&[W랝wgtjS?"^2O^ppq>&!r-+Y'zdc)lr~|wԭ?*ȗ2s%G> s|w@ϋ9Ymo9Jo|BA+RPTꅭ$<(}bJĶUWlVWu8v$ 2dLD~3unen2pDK/qwqS^+ o'sDfJm8<&3̉4dZ' O@7y:T+nc\;ySnO~a,=ڿu^IDox-D!_L8lkC)>g٦_'W7dO5wjʻAK~o?F5[T*V;i:Ӊڭs;ӓ 8*ky YtV7A#=Ⴜ(8≟\W'L%Hl+a f+c3ѕ8G{ +wc~g tjÍ>C }o wBlr;>C-}|&U7,.n'{1J+:gsb1ނMQ RFk7_e5 >Oܾ^NxS:W _+}-zb7.]U֐_IVtŲAM/eq51X=kO,8eK~'/޵&\bƓcboM st8oAxu|+ %v1M-|Pl1+}&s|w`Hkjԛ+GgsRo5Ϧ|kp}J!s˴H*fj}c퐎oGr6{[7!8Wlmo[$qҾaA ;$R˕_pQVբ0A~+Jq-CT?OW8N؅ 0 ֖dcپr` $-]pT緂eD?^Vc%'HX g2\{">fTa<'Ty=d[ͨKZt k+8"L SԿV=t"\&G((-+ʋ>ɩY[vNR_}Rӥm2&}?C. ֧G<`U݂߅H_jxտ  smO8}puX8"3;^5F>{H3oM7x'= >{XmޕY5xx@6qAGs_\V'J{_}>|+ Nƫ&y}t_=جYei!rL/JS J1ƭ_n5|V*xN_%osexp˿ ˛ɴ>_t(+W/]"'6qT>Qjoߵ_-|?Wʑ0>=#Mے|6tm1؎Lfk}Qw7UĥxD\KE$-L!cu:~͕F裸骢ʟ78U51^m/_Z|I:aٿI$PDf=W>ͮ`_k͖JTuMmt1rpG[lq5A\Sep}锸DDߏ~W0#ۤ9w 7ik߿=ˤWguX/TЦs1P'~bgM7:E>oxS'9+h6/#ˣn_֯TxFop69O4wi͗tB#p Oe9W`?曺1>a,)2mW.j;k;n5-wHmN yڲVNr͛dΛ?9|дl[NŇ;V_QO*v▅c_߂f ll8:va.gu) /}~y* iXy_}k_A/˚~|l{ٿ˽nvSdf@Ҧ̶B=9W*GW^ o#N5>`lT^lɧ]PE?M:i'|^\ɸJio"2KX|vڌ6ǺI3ѮGʄ94^2nȉVߚ5kWmZ9=6?]. tZ8ٍĐk0n@e+8OO}IIԐsUIb[72Lb-GS=,M/U8Nk@ƞlq fok¾wʍ m/2qhW1VĞ}AorGo…z,v>m)_g_O7RbaOW߳I|hOG._moCO+z.b;>vqop(+t?eb=C>m5'o6|vӵ16p}NqKbO`v :iޕw@*[UD'yG}(ZjfG4_c-ڛn{o>'o,Y9ۂ^Lh3>}LGɠW}ŞiRy V_}ך&=dχoۋ?1w!ʋuP۷+}*/mx\ߐN.:9o?Wiȇ-Y&px@ٳǷ{GlkxfM-.xS]NF+~;ObIK=rSOp7ɧqڽ6< 9oq 1bk֞ pI_<`ۜ;pVg#c^UկOe}j.x0"/mDvw}9w (]{${g\*,IY|x!EUGsc V)|7yNb_&:pe)(̬y|i~;;Ƽ_{.>o0Nh;$(t/f=wQv?_r o#{5zB/?;x7>.U&9 |3&>?=6F>n8ɤLkI/CovbjOfSxM83I}Z:sqRW_UW'.+x 'a1 ΋:%k I1_Ӿ/\!??O{N=:ɨ[󼊮eND~K_j(^?Sn:;5nI,{{A`[%r'Ksx}Z,.ؽgNOBآ[<;'|0K=WI a%,\Z{lyJwgۃEՅ|lۿu},[,~?at / ư^}m{vCMq좛Aڷ{ǖPlpVV6jj6TM]V\ߛ,ds"='r,9ߠ˘ po.c㖻žs6F1e>LX2 MЩe;U}2+kIQs1O8cfliDf%[?-'W CtD5H[ۯM`/8zld`'WXsLv]w#~@UNxl|#~ lN_Sz4 MAKݍt_I2J\רo{!JMNLU @tԆ \L._u)Oj՛sV růc<\u sqLP|ꕿ cܵ oV՞ޕwMZ}~hSs*q=ՎGt;3h}V}}ɳ gAᇓVqG{/טN؈ų)Q,SlC}TO. ڮkktvUb/Sm[f2y1,o#rWaKQ5c?xğ-W\_}߰O|Up'B:1r]}gcC|Y~wUق!65G_W;>jUs ZCB}Ie 7[?鼽d_ڒ>s&GO1aҩ6~kpc7~O_vfC??orI8fϛ |F+TA ̥WɌtP0b;C;c6 M:~ y%)9*W{7Ȉ^?)R΅8xkᢼ:4: ϛ3cH887A9q^6VvVFNh_rDmk;O&yܺp^If8;9}UE8&4ސ ʓfS|C]ݢLf]O:+O\n5 Ο~]zƕOZ=^^F*'X2ao}s醧ۖ+ ppaUO"ksUf|Qu-5-3 DGʭ +ECxJuQ}0QAE:EuRc */sI6-W^Sn%c;z8xeF\ɬ81We\W)o2ƲOWہOt<]Hk1Pg F4ID;*3n^ Vm?x7~7=eK% Zhw ھ= *Oɜ??h>[mrʹzeiUҶ?5CIϳlp!! $74Z[ ~ G7ձ)Yƽ8u^*S/|muѥhnvE!F݅CiUXm/z Gl{?j_v[*I }QdBUԿJچ!t n˯0ނ~z]N5Ͷb&/|g׊ Ϧ-.VNj1ʖ/pǔ@?[OO&k\}6)!&[+{|Bг9"[EC9Hd<_F%6۪ am7˯oӸnvlm cH]Hω -۝5sl=}8 *dGC8CN}ǥbf}]:cq&r9{|bcA93w & N5 ] F1 F& )b˹N ZخlZ7tj eʀ՜}r4 :dNd?萣ݥV}K䃔8ds}7p[߽QSջ_g+}[ir}|L 7tn}5&O0Lg~cޣۥ0#-ՏxmmOn"\荣AOn?'8TS.O8pbfqOS/<8_*s /= k4Dד/q{{`c/O3籌n4 ?@?<ܶ rOcMyNQ'm}+7%h̝j /~Ē?I\_x@?~U/۷Xk'Mݨr:t{pIsWw(߂/2_K:Q<1!7u=}|*ʇS:^_ڈ?-k\0EA?àQzJ?mZop_j}xo), ܆kEEカݨ,֩^f77˳ [wnw'&<9uqhW79F\t{<$itZu^XNgI%8u1tWb(~B$иh\]Nʾ :^U;mUS{.s|#"=s7|7_+&H_Lk¼L2frj|blB+g(_0v:~2i^-Uv595r)G*G{-4e,K-6?;!n__-~ omm^,_̒*I2{~[oR| |Zl|t˒۷Eoexp__]UwƒM6`w/ra\8N__8L/8\m̺㇚u9)0m-ؚhR|w6YwT,:$.\g;js_`HVObOO6t>A|Y6+egg㈇_6/Yϼ23TXNC'j>epհkJ\o/\0.VVcfݒ0X,hW]NX#1(No֪Ed`ö_!V'H@_&!L`xhqV߽k[k_ґuy\Bi  }Gb&U1.rn$ΒAh .?$.'[iNZ76WYZM:_%o;&8EaRqQ7z@e]Rh*\+2%KK<?_$c6;-^({3rV G m=7 <^kv>) ߨnqPiC= dqQ7X[:FVNi8h:M֘_¿QQJzf5~bw}r}RͶ@ʱ]hcLҸxB0Ír1#lm~Ym]yWymJ$hpHGQԭg#W}莗L0X+) OmBFz؋(΃&G56clW{fe48AFoo(R7Kp]XnDO^[[!`q#C-7+>`+luqq+zN|xہ7/r&\ ,5X[Wmn#=2z\G߮g2BtW(5ҵD8E_ZtP).Er22o/>_b߼/ /uZ u|1s}!`+s>t4']<^bvtRwqگٿ%_zȱtr@}y98W\VK)o ™4V-^F;89qP//G[l3W VbӊzEPOą8'Urhy#e;=.xɣ;j16|Fs_jWp 2:՗/'/Ϸ5??ͦmW}n=Mrn<}n/ k啁WQ?.b!u]c}CSh%_`2z?VV,Ε5^vVzTqZ>#(/_rno{._Lٿ),YP7y}L?2]1 ph\3&|mօ79& TڮM`]ڿO_#ohJp\cF l![[ tu&s'W=6'; qBC˕85Ш`BfRTu,[Sq(f"Oc +;<;h*K'+8(1a-m7@~+ iҼ&3(q✴P?O6ỳ(uv (tu=$rksҷX@oE9CT_;mN]hEoZ gܿת>fٿ>-![P~?;6=Y|~Wޕ%>aj'PN̗2J;'uOiZ^@w,0nvrvW(Hύ&m_c8IFCekP%~#ǻ,"ζ`n}&>CCh@nXgV\:r#TI8a7AX} gCNf>{.k ˭2k:6ՄT획 _~>$]yA]ЪncM촑Vr0sV4''pmH{7MZ~g] +yĽwm}x\>W+?ӟYr.噓h$!ո?FkJ ^qN@+6@D)d2+N' ]LUZ^dQL}P@:i"%ĕ4LZ[GI o烟=!NeI梇>Np6(P7<.Tsۅ&c_vߐm5_N1V uWt |lnL^+Wr_+yQOXvkحõVٱ|ϳ.o5;ؿ. ls /߯c,G1ǧeI滆 ڬh/??گk[zl{E:F ~\_ew'c.Teb=q\E9o׊Yc@|KF&<)C&p}ys_:nE٘pQnW|݂cmz[heG Enm=oj87yVU0^n:p(#:8'-!84>Wq4R pDs DY6jo<u~35&FC_|6xXJنO+ʛ+qBi<,y',+rɸ&f~Եf?8&V1i8^H\ m :@v((nvysyOS:NBGzOI[ g\8*iiBQxISC͖O}SV+/Ǭ WrۢHk ']QOn<>Ύׇ&ClSӶ&W{j-I nb4J}PqS7y vV?S>Gl-HYWŐ, qʻr]}tK`ڜVaգ<9l[+ͽÉ:s<]d)BFUuueh,8hf1_l* ot,44ztoƼ;drh?xކx}C=A떟=i"\?=W nOՆ6xn);h4^ք=WNqWo6Li+EZ>@?1PuAk _8_mwڦb }Swy]Ov^J+Pվ|Cs6߫j}!|ړ+<R|ؾH\>Uº}N5[MuުKS>rc ?\P2:Q>:q[ߠCHOB 'zt+8g1ƙƶ|;5fߺׯ<Z^_@ٿu6k=ӗ!L8]+,| q*7 '-AC0.^Neφa&?RېEͶbCihp6;%o;B|s?er\N9쵆lc:2ڿW{>߅ |?=T߄ɧz8([^Ő<© .MA˖4ii3P $"߸+uh0Ys"kb|mIeZIV;e\x|Vy"6$a#W]yW\}czգ$0#\+>g[o~;'*G_N)vvzN~ Ac '~0o/M'HG}CpBpNP JPNN'vO8F\Ao.?`_A)QC#('8++{Y8ў?7VRsz?@Vq*9^t}rWJ7.W?}_ѥ1Ys<~k_Mt>ŀy/ky: "zl7+sm2WE4_r)j,:utIӪr-&8(1jtb:7ٿqS8M>+׀6J'vu-ӏ r'X^8VNJ}eLɂ:#{.lQnUwTo J7nֿC,AGWc,GI:<9$Ë2ڿ.5EQ߹ٿr?cӥTFekR|[q xSpiK{*!g ɽ 5eo7n6^z%' '~|7= IYB#J_Fc&uo~ EG|#IN6ȓ{Ejk")OԖew{OxͮɇAi:W N\01R|NTNn.V;[O}iD=}/1{O;[-֐zp_-Aj}ajlٟyI}·>p_^ap gяگ[ MiE!(9b1(L 9!t&OK!5p0H&>BYƍ^G7캌׎G)P\O/qڽo2'?'occ[㍴zFUe-vk3*8"[ImGbԐvpR}_ƦO0-y;k $ uښ۩6{e=P mƇء; ߒꐽ+ʛ$JZPgkP٨,I0DYʏJ&h 8fbkN;`wCD>ň~r]?Vט=ܒ7yV)Sj ?''>Npx;i.uՇ#witqЎΧrrNoJų9߂En?}[ _vmG`f^4 \Kl.{$R_W#|W<&.cl&ψ ^~c?`Od`*rc586EӐtD))60r.ĵ9]ecR`ԥ݄ˀx[Eo:FSvD<=Wڮ@ `8x=q~[q{n 2sAԌ0m0ZAr;v:‘.ydlx'[A[0.t.|&'֝b /?F]#oLt./?DUe ݵ^m>OQ/ >ǟyWޕ7*.i2z3GdpRmFt ǔcreU힮Fsb^ی73w+6x_tU~QVkh7߹Y.*ģD^Q֫`Dbda(};Ha|#DN_Vɩ:#n1} [\n/e݋xaITB_+xi_iΙuj]˿\sj<=| _h$uW?7V7 r+_Er6>;^JXyxF!Ϲ_PpL#Kӱ~:W\#LnB"ȏH}]y3倗J~OO77٠G<4RɈL9wйE2y3b N -. q5+?1\9ox_\kIZ( T_%zVV ^1$"ɥ_Wh_SU~a#/i}Ix.W$zpob߱ [;V'm\F} "]nt`OouݱjHPS cc9&r.72_Omf;7]sMtlO`_wҧmH|ǥ#7? ǡ~n:[.X%rS3O|[ c/*[jEVWm.xhx2Ta@6!(@T'O͙ɛ{"ŠR7bJ EVc|.RѠbOVmd *G{Ӣt2jkil6탸M!^6D>7hG$f[V﹍P47 ,"TRT mK`a(k^o@ۅݑ3k4,);)諺R2&m:CiB z1wyF8cNj'>DK8}%gޜ|Ɩ6خE+-Wq*}~:k7<`"\lQWem5LocvX·u\ЯML:0#I)z 5qq'pl&+'?Z˜^6':#uzD>캴g QqZP<ƨd{_ۈ(GG3}A4Wiy+UR mC\O 's°'7k Nkk|1 W}櫛'r; +йEN2kNQ.{yN<#ÐФf5׾5-nczч~kyOtg4zU!7W*5/tG2En繍{mvq~\IB@~3Zt6+ϡ|I^5P.]mn=[_ƣi+'sn`/lѶݣ"{Jڨ_*x E}u[}mEC?pd@S4vۨ6?[p~Lw$rm ~coݿe?f"s ي7 f8FQl_KQ~b_tM:huP-~K^1"%147s׌"hm; MܽNv5{γxse,4ntE3ŠQOF٫j_=޵cww6AOpo](i*1b:9QFX}cK"Laԫ)ڴ7xh*|pUY ٘RC֖ v;NQoqpl(NF/ëCq.Ssk4b{ e>OñU{ns&|#o'aX_%!1.Oܦs!oQǠ#+$S%s*&ٿv+_tdqIUݵGADf.]K!44.i[[+ʋGkW [zkսO&pO뇏io8_0p`vm(E3/ox'3[Cp#0<:aɼ~'XW}F[xSOVvCh S 8ǍfE>m٦*18c_pC/rftrڜ<q=/| +ܶoݟHwy5Er7Y 1yw"/_?p=qEi `v-WW>6W뵨,{+.&;taoU%Sݞ.~c]/8 [o~:.ϳ;sI/?)T6xBo 4oЇ1h ))t5`ՇR+|jlu~Ny¼7Ż.bgWpe?}!į \6ge;߹t-q+(P GG=>)YDsO ukɱt0 }$gA "8`:e˔]/D!}(g\T;'gf5iV>tBǢ9} ^.jI݉ il~q?gCOYi$_'JWO7jh]h2xEIm1_uu_>?"=w!S M9\TQ*]TsW"|eTxfe^NcC7b?b{glέKLr۠??|KJmz@MxՇǮcsޭ!|1 Εٿ"={<%M9q6o%ۃ& WxMhr-|3&C2YK[ZV_z>nޕw㟶eQA Os;~ź6Yi4)=kd?[`lw7S?(3N?'!=GOq9Vc!mRlxZu}m4Ӥk嘆# p__rd]O^RV:\Ecx~+!K9}ME:n, `g./7w]w٬\wob~I΄/ n6h\#UN||МӇUμΕu=~~uf%Xh?s)'&[}&VV>i]kW’,,vqR̩SoOK쟶$_p-$T[&mlew:Ck*oR\=};6,z>?tDW;j<,볂&X>59GB (Q۲^Ovm*wtJtu ⿝v7lCۀm¦TL \W[]!{1gd 'M]qXכuL]v+~Ge36eIr/tyz_of3ff'=7H;"(,\ߙp7]8/zO{ハt7Ė _}?tTxjs#nˠH͹w<ڒNo(7[ G \G~V;lǴkMV;LäܡN+^څ_|oP7-mӏ)A_N`SF/9MmP]yW^\>q;3'{ EdcNN쬋mB~:{8Ljuي> }xRY:֢S\ԉߢSD.3uFAǛxdzJ+G>u_I׾yYa6W-!dumZW&kz2n69'is^7WBxzY6bʨcx+ `ՉPg %N@Yg <|Ѭ=Tߎ\I1v^??dZ23?K__ǵ3B>x A;oE3M(2_y'|ÛiM_oe _s?9ZEs?ծq"Truw]ym}n%.l?xM̭iP|V]Qc߃3m(!/u8^JF׍ŗ§QE'&WZM 8_XPY5Da5,~cᢓ6@a,sX׹Ch;̹KCFQ'&ϋ6}y)7m7˭vƦş/vfss͞[Q"{ޱ`I_NB^c !BO{]&>t>xa=_Z)v{4npJnuWď.|NIM3܁+n!Y'L/p& e*ճ8CZߞ#!\g20ʹqBr4]ٿm@Q)*S[&%>Q+IQsCYi1XU:7 i`IG7,/jo~i,.·nD)k7ި3xLNnT6X4$޲MzbklFOnMYgo}[7}Wޕw;L;p 11n9v:3sz~kV&QE6縦fT|fNvukV#ͱ3ŷW/HɣWv;/:|dQnҕKCч_W o\(|p&Iʪd]EW]6U)1fNO[guײ_җ"^W^u\}sgzɅ6~*'Qj/uo$(WKމn8~׏chwua+i 8 :e.]'&xBhz=`_6Y_{DWO/e+l;_ۦ}zB ·ٮAUs?/fJąF9?#[QV ,p|q|`eޟ:u|Sanqכ|+X58r2 tcYEz%ݫޤjbhgEzĝ.z|=.. 2j4)<|#[o&E%ȷ{5zʎL>m_dᐩ Jw zuX؀.S*]2˶ ,Z/]}b+A_{UCDJP>vzz/7Ͷʶ;q;?c yz}f> ) 6E_^#¨0IL&cR83 "Ga7bQo1lȮrF گ_oYu Eա82tsum\'sEϰZ Z\MuNF$~a/ o_0su8C,kDO0Cth 8$]6&>^_-I@5f!m':D,7 i׫ '>MQo|#F]yW^\>R(G۟= 븷W\Grz!yб}{qN:x Nf @y9J4c"Ђ׸~&y[퍱r%yp^OmyZi>ps7BN٭ʯ s6&3ǽ;Nbʇv+݊s_\FrF'tUCCQ[x`添:˒90?ϩ e]U]g>`\h":Ag+}u7/.iAW?mZyu ǴeXPoo<av?術G?6A=}/vcčp?KpdVE"ۿڪLt[}wgƇxоvx= pۖ6WҽɑpiW8[_ &;oL/z)ho m] 6cWxScCX?pӪSWԅ[mcaOf}.xʿ=t48_uCKxMQ^B #ƛP|oxfAa-6,}6nG @!LͶOcݖAq֯q=_rɉ<Η2D:t?[`2&__--8gIڿ]a|n£Q@' O;fpQ_iٔY#^6/c4\ʵ WTAh :,ΧkH⍥-@` PL61Y %uu?%djpZ$`* ^EFJEh r$CȜ h*|2V9aΉs .pNv(`L"PK|O0p ]cq&&BcuO|?xI>ph/`n[~H}M߳[wɹtlp_aJ#ǜAA]@ѣ+SSѯ@VmO~^6TRޕw?i+kR3՚eaOӖw6gݱ7ɱ-9L̞l !U眜EݲԮt>^7·.7& k|M ;bLDy8q;G]^ hKr7˧ua{\o]w{qy/3G)Br=9VĵJ>ȼ7W*mP~H!eK4^/ jޗğ_ 9f7ӧ<%$"GxxA/XJ׭y}9'踵7rFkz%ln$b%uWeAg'뾥z[rƉR"֭+3m3|p.O9:?PE>[޸ T+uh.?@gVU/-=^tDu>ʗgN8-kb㴝eV}e;ߣЗe'/u|مYψ^6$ޔ{r2qͧR{A {yGzA#ʣY ԧ7 [?7cxڕʢ d?G\Suq>ӜY}mg0s QT(-DG|9W[g)z)chmrk/1S_mRGQ^Fu6PcOXsZZCݳiKt4k#ťXScx[ |SH3%?O36K.h׎s^ _%TqO'IMv3ٿkLvIW"K_b!9GY6Sۅߥ P3UXϒE[ºDX4`A'l=EVZiη }fGP0p5tM"BT )Â[D\N1خ)ʒ jmV~y`ȕĹUc4C&NMmf?_N"8ejAh?w] پ?)r+:X7Z)kM~1 7Я-<6L72W }M_^m{o~dʻ?x ZO?~\+0ؗ+;}V/|hc!g AW7ɹ}{ܾ 'N.? s??]V)|P\u]5;`#zOI{7'ʃw}5ߪ4#.zGsi_jFk7kmTGWJ#mu|b6iOB +=΢4D/X΁zk# rL3}_Z9֞47(3r&'/~+Tg=x>VHRm t4{56Hs`?C$kW]g܈!Wxш2fCK5c)j5I7\uߟ~iIϒ/=W6C6YVUBb/>y݉YK=~LSK?k/vnM+G8н6$c5y??)G}v!,H_i_ ؁Bη͔#y]< "w=V{`5N#g JCW9jlgG>>ZM6(=20 ~I؅s) Hc:c`~ '3t{?}يUW1,}Qm3'r<Zq: q(qgH!tw=F|rk:TuaSA9x[.x_+f[O:X{z1t|6Yc<=AV dhcOZ|~䘃_e-7_r!>я曊NJ =<~ޕweG^w:G?UzYiRa?84:p{  X\p,~6N:W]7N:j?\?סuw^[I|_Jm>d//kx\_VE kBW}/_|o{1i&kt?%뾮}cZZ-0$ƀPFrhg qhbt!qf@`:P"iaGRZhK[{}Zwo}_pu{fɘ_RRZ5PO8Wa<q2x}l߮ pKlr?,]fΔ9 \7_7L Ó`3SgG=eL/89oB߯qnOXۿ[-Du>O%g~7 @0fRpp;=Է!w} ]9g9dmG3.?'\=oJw*XJ{0n?sщӖ;.&b3x O糍yKDvz6%x],Ʃ:.R&$9ihǸs*lY*_LZE6%*>[M:x4b/pYWm|֜k[vA; b0ߋ/g]6'O#}3cm-Xgq-jl(A|%/U;lx;rg i -Ex鳚଻?=zgKP:} 7?PR e2+zungC?vCq,`cmJcDobჸ#cQؿ?0 g`6JIx c}&eCzUM|.mcH[7fhW;JqѨ_ڿIy@Owԉ݄5Ob_#yGe's;S7a\ݘ8OƂl)#I\rԁIL#e5~we#xH]-{Ӎn1.1+}Ee* pX;]8NЉY\ nyvQgRb,޴elp\1[28Y:EʳN˷Hf|/|["-ض :%i~^ ,^q򖷼g>R,oRtʬѲWR_y״|< X #\h}](G4Ep1_x`7 ;epIZ 41*;[ϡ+|wG EER/ۭUfORbLӏ[fhb`h5g;OǼvksSLc+|3|Y89nJEmt{2{.I;zW?4 `q5򹲟znyƩll%;HGư,]VzViͪF,:n?2[NX;i#鍼|iB[eI ׽E|Kꛝq,;V=g?q?.Mh;qNGK ꧻg;{l2?:r:۸|Gܷq(oҧeĚP<7zGyDt**S8^ -^ N}-"#C-0Сh\OpҢ|&vNT;Йp| u^mcdc65xKw8on7iCs#t)v -9gV"M8{]UD<.aH2v>}O_/AʐxA^0iIzx:eeA,a‡IiI<L 7\Np&cx|?}~LMJ,O/ qײ^^ڏvn;6Ƽ)'HI<-^+3x*-J1q:B.۽9NO<T}ظ{ g}؎߽.׉epB2H'|kΣn{Bs>DgYSvRVㄐzK3?i[R5gN?5[rQ=vn>b*r\_1}{_AP!_e㛚wo6$mܱ+Dfc5T ]Eoĸ.7Ig[2bx Oo#\;ɛ_ v|w?SЛ׬/$WD!nAX7NFwEawC=Du|.2۔I`^LnKka|~)G_O5gG]XͣϜkڿ {}Üc'hgttvN-[˪t.DztP~SuBƬ<,s`{{YꪾmN_FXE;jw|'y9 7[˜3&'iQ<3j[U"n0v¾gIj!q5>l{X *AXD;^Ʈ*`Cu2iL:ϱoW{RbHOWɛ ?b/o>of5 c܏E:/I3L2\Jg>H;q-J5\r:?K7s!P:NCꟕ Ma1m6c L=m>#:4ioJ̞QP:܉e*9đ(( %ф U\GION.4XMUSHɋr$ mCRUpc _?A'kVg*K3 1e8.d[#Ag"-0_e-oyu7̣6X43zGx`'\bïzu?,NZJ3cţ<~x) 3 Dwཌྷ7uۘlL?nsn G hh8~OȃƜK냾@M9~W^u-d@Om7v%   t,}v_4 lܓ48?J[z% :z7K>k!,O~C_>q1yRa |ߚ3࿌A;Vs ƅvHZUgR̮##'>Š!}ԧ>Uv%mf?/~|ˋ_/.Ws~㌁Hƒ :VQN_hS)=3[}:~7ӏqy 8\tzkN-vk8 7V0R5߭W=63ke,?P ɴ//KL!w.`xtCw!X< \=68rδ.i>pq?Ƀ D>o'8 Y$ge^;Ics6DTIp/U#4zLZN("*#+Q)4PWH'?\N[mEP|AK=W?orZͭ69OK&/Mc_.F<`]^Sv$_K~~:omޚwFsXѐᎷO'-__o~;wjQ{R(a#Ǝ{Mcw=7rEn<M7?"6)?~2t vO4yf69q]im>ok]ݽBGUqM'|}7ƍ=b+]dYvw쿳,kk<Mk#=fܢɁ(C>teUʣ>}zv?>q7t20ئJEw% k#iP8$St;X:Yc'fWؕMoz/p>޴xٯ?{9VܰJw|( t䔿?VoʦO:|}S=m-;qSx)]]wg24u^xeWX;`GZ|$C:2Y?kҮt,+wq7ivǸA8ƍӫyہ7{s[ζ\K^]v:{OJ&v~stS2ӭTtGWڶ;evnǒ.h]vtN;We{򽢱p:c';_9"șXS '͎\G۰x;^׿gqKwzH'7_KxvQi9^ߪ.)N6ʯq/ʭAFGeUQ}>t N]v0FхgMq'q¹5u{J(+{*;m/r%7{35G?:s;Y}.M˱C34Pm]=ri'Nr i=NƆ+ V2v⹐pWnZÂ@_gY'r[x04M*;u)]=(ctLterk尙b g7qrR[*u<ׄ0vc.)w?1( [^۶oߧ; a#}_z®_-> qQz?bUI%vRQ_G4g s@bo>O|ag/51IG8ouǓGdw9K$C6n,Ced5+)2k[W:#/+6pjelL =y|,s7S|7o>Tko}:Zۇ=3tۺwƮQFn;*yqyWFq?]dHom)"bEk;F]}DlXxrf?F]Hռa^UjƪOflg+]lP>տpy` sEo#;Wv;t; i72Տ]{ao 47S'l&6~] k]1f}n3ϲ4?cL+F4{'^mlW\G 3XT1@٧@ínxqr%lۼ7O?~''E6O^&wS7[{ou)wӹWzXÎNϪɸ5puxu.eDT}4: Lk:.A_ D1is|WeɌ2 rb[˾ѥiq[dvÑ2eG_7w.Tg_ 'ዎz`)vFȀb-۔(n)OS',;@Lڜ<%!e&*v%A}IUXDA|\}5z- r]ir2``J$=c˪mvi=)R5,"?M>kz[4c w}#TkmEka1mCQ;]Xq$=~fh /ZQ9Vx<"f_'~ǜKc#@ܿy^db5&g>Ah+mw='&<{|;o <纠>8> v _C?>76 "vXFο z@oؗqeB8nR4xC7yY<7ؿm .u֍y3Чi~]p;[Ws1*q&a~۽>,7oF;7M&m]o_u_v7v3xtԔfrSmdCDpovYtyKIgҘm9;.|ЏOjohCp';Ma%T<,vї>zCj Q@e}Ly.?p Z`>ʚ/I?6D{o= «_o2J>&|C7F'$7{cyGwXƪ:xJr[ >$0Hkٍ̰ackk]?|Eg?H},$NtTv)d/'Ea?YУUoR۝-u˹~bk;竳 |4ퟲ=!MzV[O{yӣ_߫Ηe*}ڦvMy}VǎL Aυdxs1sn2Gz7<0&Z>DVXpw,m[7Swd:Qi N9iEGEQi#|"Tʛ<%O<ξuJJOm\mn^3&9L7| J? 3od1P%Oog>эj2yݕ./~۸qsalP;x;fvn%m=S@pdD79~4_݅<-p#b};Wc:6N䧁.w[Igr?xy|7q|] st m|It2WS^n___·oDZ[S#R#(Y?8%w\g-.>twϤĮhۧ*'-t mE!n, ]wĵќv5?|$}:9PV:g܊k.R3mY)F'nCo\>-y ]IM|Ap/hw2Յ6ȳ\7~YmpG lҪ߫"cV7'}Ze\D_sBSiB!K{ O$_oo[xGĢQ&9NuԧfM)}io]Ls׈# ۍXݗ{mx^k.BW17C|Vu1cCdr[ϾaB}n2QCx!Ț8(|A f˃%6rx8i ]\h |-a'!q~ v$nG:-A?ƫM}k#\9!eY|VE t4* NK`BXo|)\ʞJR&h'jփ`i8EtOtE zmiu\(p1<ӔK?'؂F%zC>JHfzsEtVP|_[8Ss~: 878&>\ jő,K2~bt.a35. &Yг=gBT[fi/aO| XpD{3xyZτ{$m &z1|44"|=#J]ss7XȐ%xpmܔo*)}}}[ѿW ?,N<+ff>Ƿs>tK}CIZ*aN}NOe~F3Xi=G{q(}HS^,縔xx?l&s}lASw)HS:}y(߱7T9~ny[ڿ벖q=yϜǃ>;+ߴGC<"h߀OyH sv/Kƅeu~e)n~[met@vNqQW.cw)wpz s%}5V_{_FKP=SӶ:fwUA=u9Pjhʩgv7лoy;MC;7~7^H]D<0c{ʯy!PGi^C7rR6v{VnXkߴ>`m%slcOXfk/3@}cy]bO=V_N01WlF|N#gtt3T}ৌy„n,1'y29Ï<em=K%>fov?5&Zyk?yE9/Di}IpI38ME3gmHzKL %- m.}h.չ˸caGI/6wxY^}yK`*~ۭ,,n5z[0HSYG'7 ZWn4g*j| 6"NBEu8q[sXN968Emy>vu$7GEEWV9(pҰyMN l ~asɃt ggoMQrOҧ1%W7[ |+~ز{I:??܄o'7y#|sNX`O9 q S9gJ'sʁ|>Bگ }6a-,>ݚݟ,ח`E;+7ǟ!eJ9Eه|v/7J/s/ܾ}\&=|>Sx-ŕ2L 5'II:I- MvSDY9Y1a-7Vm|8}\RƶbBCRmx۬#~9bJt}yhCѠ3a7}UV%e)NK3F.a>Y?TϬ&9A{C[׬.DWggElI7501m3MLpԕ&5b?U- OڣjةDt|%73Q ?$Oe2u#Y5{qf|@9fG5~wrB2 䞳þU+݌x1vq͛o$\ribf~3S8NVו78>qe9?˱秸&ܥߠ!:$,FJQ7΄eyMfg N$z lbC<Ћ!4WQy)|8S RHM6|pUN k㙁3T Rx5O\qEvƸcBfgN'ҤYmszZn:5J`rr?ꜟ ?E1o5&f~lO7s "G+3 3 EϜ'rxf{F2mox Y.X Bw12xr\`v7gd }m,a3-^g:6\9ihRu޲;C;F;lw>&'h6g.g p\&8IG¼ܟ0ɮة{qUE*!;_n>}Ouvʱk݇c5 1t%&>t' F9Fyw_ceއEnL|ޙaɽCu }s|BUb 6ʯO1Ny2r4[hOcky{|pdܭR('ooNz?|祵4bxuxMQv[G<[;aVm"5tɩ/6mo}|K/t٥ аxCYF m PU|foL̅a#4d_?U:^Iؾxwϸ|}uj#vQe^'.{pzmmŬ$ӎsw[I FnFZ.蹜;ji G6D:%YC+$fk:P8Y$`t1N@R? +q n\mѐo?yv:{^餙IptYR:9Q:aNQ`MڢË^4s p2tBz51!٤ι1JAbs:oQV?c[+|v]po?$Awғd}W~mx"$onO/^ټLF^Moyۣ4vh{hXn\ߚ+@38/ `&֭)7_i98v\A.bp[' Zs.sᑁHeqVpNLjszlOw*opOx3X^#\~ٗ/zVh8yif+?a1GH r_mt9oj| MN{Ao,BCY7ްe6pQgs+QâA Fng>|o) w}w=;QBu+ϝsw6d)ow y^*y^88z]sӆ[cl"h_ɚ9tRgצKw=,_tqPyu WyEoze7.tf~xl}R|`gFi3䅺vN'EyqHm8K%w!q!XMyZl[uȴiT5;"Cȋ:RFq^l vnIYrg%krq79lf@ni<?v'{=3?=f==}Ɩy]ύM'_QtLU/Y;-m7w~ 2?hc𚃬 ˚(%V=;WyzhbM{gMLlmto϶o,t`ӺJ''S?{;9rf?vfs5H`߰p?u}Tufv<9th^,hwGڿroF $#oɌ(d2w;q$fZ(˄[lw L :eA8M\v 0YH}9RkHqw;HDuœ/]8>7[KG!.UI'vudzξ岱p*aF Ӧ\OņSVQ=xf7~!mesSIU)\+^i"y8(I| T_P>XgR#M:SV+?g7n7zHAI *f8+3Ew|wv]vqNǧ\GaYc9鸧5DHΗK>_`xsz':nnHlnO[)ƏyؿLv o9Cw'ƦLnSђ4G<='4f1v#<5.=)Fsciܧ18ܛ$ƓWXj[0_d2}+>quIv7͞GJ/uo⮅Fc:_hoZU Rw(/iU!ʷ[/^X%WhT8Dem Z4/t$2^=Yݝ ||ӟt>uōl%!3;PAf1FF hSXf:ⴭι>R*4gtSף&oA ,%3[.OTfMyl|o_Xh.{A]U?n;.l՛v=h pvs}dž7uؿU;xNo;.Z^بE5,$>951Zu~?xӷ_//"ԷEO[3#m/aQ>:Gv@D1M⒂M`68BEDҘ?v'<Ƹmo<4͢qT} qz){%,ɩܑ6Mhl9Ph6=t7˜s:,\1'8]WvuLi2{`Ҍ%{͔$0˼ZW{ G+0U?$_>g>oўLkV:n~,/K[1]MHp'508{8aM΅Oi?ǘDsXֳukx0`G3*G]Ҷ|]hBT9/?Y MU|ʴfYh7iO檯/N|kC-$Lg}7Jzיʋ?}[ozCrܘʎ?.nv_fLY,cixtW n|ptQGr moqySa9vٿȇ /B`D;{KI_pEIsiu}.WH=!جr?zgkܒro[m9=_}] e6Gg{y~]“"?f{~˴€_^cM3_##~ cbc_^pMzwtIPS@Vc9%7[ܴ=D赹+-yzcٗI8?s*9qc2۾!~7t/H\w:u7Bur.᧯(bR#az#/_,1ǽ᫇>ٝ7>slWR_Vg3N-rgf\1ńb^?T~7QQnZv7ڝ>S%[iŮ7_(c;qW›*NXt_[-ÖM.jF:ElKl͖t6&>^c7胖1'2/b8cu.@|~?b3U!9l&?Qr8i(Chs0̀YxcȾ0LroL$j9+ކw$̊Cc"O`7Uc7ELJ6?c|||#N>7R>`G7 :,_p nWv}8ߚ`-$:}SQm]-<٤+̈́M8q%!P"4` ]?i"VQhAW)|f-t$^>[u~i]ҷܶpw{AWcjhfs7 ^8vE"!!/$L/ø!Nʥ&=eg/cb^2qRru/Fl೐FDYH2vmkDKc1TP1lCg~s/7?%{zV|&;:|XbD}Z?.VM}k7%#oYhۊb?q L y߲-LmlS)lK9g͌+g3BW{sܻxK}>뾎B JgۑWi΋+jېnpǷT":-ォؑm[-A:"6xʡ(^υf-/eu{cˣ[I--ӏuI>qUȦ䧑䙻)'g|΁6Bb܆AlqbƎ)#VVevL ~/Nt{&)jR ])[ OI|}HW?/ #q,tQ.Š~VmMe^Up5?bSHQhl|q;%G2, IFAdN2&4x'3{r3RcS"e,nsaO'~jĶL~)*QsV;{1s~Gr/}U&2?7:*ƒTe/XOdu qщ%ycm Vg˧jwҖ8U)]n8qJZxWkkni,¹&ˠs}%&_ 0XGe^6еo@OqwQ.q*hLWҤz9ΨlW7kopԙ_jk7iُvr/.>~!W}Wݞo?$ ݛ-7[$Oe^)oV3Sc6;=鴓n8qk׽2tlCJ#y1"(f"#RSO8ak .ʓݬ딱#,w)ۛ\/s3p^/~ 3)>4ªMٳw]1$ O0w_a>g7G_VīM?voA|a=N<ȯx+JN8FF˾~꧊ # U|q,k$΃n_ zoʐ~,o}𿥅ؾ z^9f{{SQӸS>c}!C|#cnk˵B7M;W"󻼝_xW<g{Џtny/v֋}v+VM_%>O$&UOwE"}gڰ#I/{[ת^3-|h`>?gPI{_qwX':ဣs\>zGCE.]? U;~ eW rMotAf!ݦUv(-d ?ҡ4=/_y>o il:AKNm,3$CC8.V,&BQml@vq&;JO9 FV&Wu C.]ЙMeu& ;^{` ;%_1b'b0Ǚv5'5؇:ʤ?e8CҴ_= ]ǃ5[o՜[;=ߡ@ɩ$MD.Y'G~cm7av|9:$f_,.8Ňs S4"v.@uq7)725Iy["[.:?g8,rOhO?S>gɣ'M _y9P1~4@g)'O|Q6e@b2Y'Y񿉥ZڎT.NpS*c)k~K|墆>ս}9*onӌI[]I>H:?KQ?YTf<~v>n,q*yQO|bIYj^"IT=+vUl߬^&o%?>uׅqt?6Eqee m[lRmnsqJҒƘ$k]DCIKĒߝwZ14ł?$:Ͼk_mZ#0BOuCv.6OӇW8ʔ0u@I549dG.ps|<1˓&&vpzXun_&HZhGHd)LF4N\o c6?'M3 _\Jq2O!בD?l'~9CuMXl !+tԍ!GݛK<'?sMyf͑t)W[uyc M.AX%wO}-up˚?gdxS69߹xpUvzaWWr|&Ob}VnSh/u_:~AfU.>  7`ȯ5y;כ_؊@\^ߓ3c}vv|(́w72Y+z;o8=lZq VU+ü߽br#cw}og_Dz=aCCy۸>vz~/W{&_KAqXD7~|ei~~fqʤ ?)jlB?GW' Hyv29vAhqNds;"G~˿sXȥM;ܺt]pyCsi;{(4Xp9x},Ee=?y?*Sx:"›=#;ԟ%um3k_&*&N z   '<-:i:~.,jvoE4pzfv}K@R^_"5%|UXt:»;_k%Z/vI4P4HRy;Vth|)'D'/jf ͠MReHl $T٦ێ$. H|Lj rߠLynq>fqyS87V̬ؿKm@l|$PMؠ2螞:ْyP &uH>:ttE'# -_Žoݔ>f0L94HjQ$h\yyY^<,B#@9Ւͅ{x42 ˉqCmx6"P.'0^K 'K~q.D66ȭc%}u^z+o?Es>D0gSFPRS jHG foTp/+C'loq7ufmB#4 Ab9Bc\"O~?ۉ~79eޖ>;f4R3b ].rESS:~=o'-B{ f>|#)k^r" ϷY3[SZsqov~;!w>u&uV}zuYMa\" z'~'s3/M_ݫfKHŤeΩ# *u ria2>y*񪍄 Q`QGta fIUvڛ\˭hg̡?3J> csO~eloܘNq>!f'4IX9yt4& .&j4q^ ñ2Ӷݢ7.2V71V etR͉|%w΀c}%ۼASf7y˝GΡnQwBHm&)%'|Ekǘ2>cwKO?Hx+OQ4uKIyB.8wX`ݨ];wPU?qq'/ zbVo`/!~#jgQyv !&5m_i xmc}9OڣlrK9wAaā_ 7%G_-dSG"?6$!r&*IHDtw$f&N76e҅ǩH~&2)XVEE9v^x« u~&[7jhrN ||8?yO'*uA4^nÅtҔ՜҆Qq7ĉ1٩"ZelI=&0 Ecd7I~X6Nx:}.&qveLl|6s|+=>DZt.(h"Db0W/|cf:0q۸V~>Wj ]/;z>3/c{vO!i+i,.K?:^ ?!E>#9hز?ߒ wAX4zRuBc/n+4RШyCmT>b[=p$^O]v}̮+`U)jQEl7GӶ{bQmo*~8anPJ3qHY7}:I1TeN7pSh^'qD,[b$L>xp̋9-Ƙ4F 6!!9u~X8}R=iĭR8 v1烎_dvWNVׂ:m%) `kubjO%i\: :O=ƙ@zۤmI,7|di}pڙLRFJOAM2ގز}\Џ'?Ol_,>0ՠ0b |ޛe9˛ǃ%/'q,φ#b@ʛ"1aP3!I(Oۄo?xS.O<+G׮ݨ\ne<-α)G/ob G}S/`Y{?!&H{F.Hm~|o&ćS^Lxxt)el9n=ܸ+y}|R)cM|S7E :ѳ|7}}}e\c.03<(nA۷aM/M9Tvl7HE{&?֍rl>s]ؒ7ׇUYv6N$i,ު/-6Îg}޼/5?9aö97~}lҮɋ@R~~WޤMݐq1roӎkMG;}+~M&xf|ً)H' T^!qYdOw_Ar7e'2-& \7;Ʉ'77vI;lWe!])J; |Ha|4|2,Cjo]`:i' W>+O]UEp\ivI'j)omlD4%d~4mPo MOTv -AQLi瘶~XM{wo7e a$-AP=t6SWJy؛co(>ns2>[n[ {✼ź9w?8񙴱3ib,Ύ7?xw~܆\tv)C:6i}Gb zTt}>N9f"`Bbe b|K_qDfIf:AtNSژGG79N1TO!8zo p,.aX,KQlo:7Q-]Ơ0;Z3SP˘) sk E.)`$ bk"',Cs|T$o^k&Y ͈lhOڇӟ) ':}ȳKmt#m/o/"%/ǑJyuW'Y魌X<#!7s`{ytc0%~p`0GG=ab!7 mv.Vn}v֑F>4xP;MƸ~r +4blslb\F~'x>я/t1_!\~=M O 8Nbv8N]O`,@<\»]M]R=ԇTAy7euSw;SٿIK؋NiQBYz^ [ͅTh"9}QC^Eg_Ϯ8ēN[z`&`#v?,LjEkqv4WycW2H/ISA??ZL][ 6%~?h.rƜok W<+ٞS\ $#5:<}EyP%K'2as,F }NB`kt&8fa}Oca ?@ i48 P*P5n~0?3`AOwre/ O-*=󒀎 |w7~o =Mx 7g1pM@\27e/9s5sFfMVAټk c۝Tz~gd esYr?;Ќ2 ZCu<,~2Gh;H1{nkJ9^cSP?T72ecC{RhpSr%^1vuwI}*6|<:F8s"Zs2b;9$6>2 Lu@^tS byUΓNhYV˴ˈL@NZ %121^UK~:\XD!'lڱvU)N3¹moo 4TȠ!b4lx>fXO:[Kڊnr^,o~vPGS땂yӏPe.?u;tԟA~^a)ĄQR@S^OM(}͆5XGc9&cn?2y.䶪omN򖼎c#?,jcLDV/_"p;f-Mfo,g'k???eے_;x\ȿoo7u4~iw8:&}ԕ,x3,|N7uô וxc>^8:JknI8Oݿ;7t?F?uX:KV|A Melckќ?QUZod2_>ƽ-+:]{., zN~}EN%3^_|eKF۴ӒoJ9aeg?We,)nǸ?hO=8oݫVի8@%6^qA >ߜS%V}#:[P}6"⇭Σ%~p~DzQԏ?F>6hzvKy/ݡs^aSqIKio.rGZd6PѰ O7:Ys ޶'Em#_Y;-?Ys~D[32q?xVwf@|,ϩ)6bqbq efCF\vzn~I׸DڋMn6:]bYf/u%6oY[;dZƨe:NiU%qpB[u`TR4/wS9FaQ(KB#:faI¹!,0E9U '%=Ŋq9N*G㢨Ccw:q30MVv3ŝ?"M}e.O,O<@ l#Еbìn/8:zyπ.Od4kp ׸__} ㉹a7oaoc/򦷘q q1yۀ}{s^9g74_6dbQh3} yjk)sv% Jg x~Ⱦkvηo`̾_Hpy.10@W9GLm<)"(o|a/~ >.GR Ƙ/~/ ٦;Oa HWv΅7p;x|JoTZ2`!ܛ\)f>r'[N*q/7:X,mj!jx.iE?@sڤP/F__O}S?O&1I5E'\vE(牏0*~"ԐGq"K=qS^ԧq+ԇ|>$O}RSxu~ L9BGOq7޳5۴ov3ιJkɧ`*'voAw /| A'g>/'n8Ⱦ]seyYo֏}u|5f*g\ };#q?A NIotiFdWvޭ"|:n#X-nXm@⏃ +|CcY-W_~qzǃ3[_1H4%/w'pk}H:AT\%Y<'>R%8웿7b61>8fj͘LY'q> ??1y(ߧ\%|9O\4W\|\<G%'7Oͮ<}n?cIep;o]ƍ1gcA8UbwsFMh}URPxΟwq߾__\S\ Y?G۸NtrHx-$=)\rm:[u%IM"OpٝОV '- 1F ;eA[u_{yoJO"b}(JUti) =IUx lO Tvd!zԷ+Sdd ̑Oϱ~=t{R5`+E*[mhͶ =C_m>u'?#?(a3.}ؕ?M_B^ ɟG/[r:Gw]qȹc9_a_K?ӓCg5S}Ν:l?lh[`9x|Z咴/q9iU{/4;lg fI*1!bSv\=Ծ ?`Bxs2ZL]ʶ[_|9W'km7cA>vwͅaw]}Vy"h>[']s$o?o ?h*y81N%r_n%H| ,ljQt6VUٮ0ϗIKweT xQaoǟ}sƹU\&ғ+C6)s(vccwg7)tKap Qi բ/4)N[]0 )Nuw%vfr8/>w/xi}?X$!ǶMyG?:yңE.h@b<Z2?3b;tw3\Y3/05^Snv;|>uA q|w}WcvWx 3oXկ߱S5S[oYefwu0?I1zn㾓7uAu|6'"m($r)2sĕYmkև7sEB xy3zziĕtu >i]DtVT1&?`<1|+;QiT$-K7^WiY|}H҂9X\3\8hg |9.cO';£/o!f3|FZ?N6$E_mdw|i ~Nx`ƚ)S'ж+'mXA{hRJ|GZ;[es?F.b&[OH+7dטX_ѬM^]~ ]#H{gU\w| ]&;$_A&>Lh:V$(:)r5~5/D"»jNƁtgLq. 7}X8ṣ 7{Up&j( U QM Of@)% 5vTghvOpNkiv g>$=gڿKRg^rIWαbS9Z|]rtҔ<\01;vA8d5Yޥ;0-:NR:yY^ZB3!Pcs5ww0V. n\LmyPT`춈oGW:XeSCmf|.>;l~+!ά X/g{;j{NK5GJ=Ztʧ:7ۣxs2&D":b #H16'WW6aYh%;1q-q\.G}3AQQ9;~춨&ylۿEp-@79BZg~g.夿yob*Iw>G{.ro1"tnGX~6OOmuo qcvn~xSn=_iCżbV؂oܣn<ǛAίtB./ޘozdǙ?PW;[9lqR>}N[x~޾-|<>_v Q 1>rF ٦;ieنm;W|Wt~ͭ,į9 t1FZr}ƶ >M} ͕I^caW{5 ;y&vHz7m?O=.6r7ǒ~#ǽQ' ϴ&OLv]w;&Om^kjI>~%q0V8A:$);fC?1SُA'! cCE9dc ]N&~oʭǵķqG, *C7bs1G9nY؜S#WǁnoMȯ?aW}IAd#0@/v nQ86h)NHhV~tF.c&NNYqXH `GxHUƱkGC*(~PfND](h%=0\xU^Lm'Gꏴh !Z$ }QFp1t)2,H?\si$jfH)/cQ}8d[7)Q(؇]ab&V2,b-tm}?m+a-,zwc_?M7ݢ43ٳ?ro+O)k^+ v!HW|DIZu$oEJOWW!G\*cܛ%2葖₎/aVbiۚX2e+,3]c3ۛ sdoKS3>yM&obME_x+MYx v\2ߎ&9}(,5x{_xa5 MGw]mYoLCS/"tIW)wئOY'7QV:o,9f̋8|7~mQߙzGH_}CZKsyi{̩n>лml{] šq%}s/084ӭ5>5ki?@G]c,7j_b=eg:W^.n?n|8$HRTn6㸏%vn>x8F?|-,?t%n8KxڏuN@Y^SO)Os@,ACLgbvw1כΣs!BZK)<)҆^Yڛ!U:'-|=Oߛ~Ҁ|fBW} g>>#q$^ٜb+YUIƨ,/K||KfK)%ڌK~[t&%a>V.+^XiRuNn<.¿6ϭ3Ж9^j//f{bGq/}V:[7Moųmav EO{C^+i׊Geoүm7B}hjaxV%[#tESݟA\~Ehcc̾Zބ#?l#ܡ̓mt<'SAh ͷ2t?'\escsA{%>}jcensTӊvz+7? ֚_l߬},'7d/}YoGcutGݜXd3+#Ȳofv;}hdKE?ow+=O7BC %DQc0@#Ǖz˼.kC][$G,=eo}{.f$l"4/2 cXywнI蘫KORvbs ¬\Hbu#ot&YVOOLCL\I, aMSx\!74xyv|PDq CNF:tf I̺9/5c'ѽ⠯$crN:m&a+k w8u&'Sf*Z[~iOꩉN@oM@\Wwܾ:X?:ެ%m7MJ5t߳Q&Q:H,˫ j=Cufօ.QpC}̺,Ɖg^~E)~G#~pO̭\KI_Lgp?b~Eoc?t̩WE:)2"n R -}A;Dޏ6cz!Ϙ+ؤMi^9c{#Kܼfs40}-0aܸ[7?iEo%?|EoBucm aofG>6]4'ʋ4xcǜ7bn1D}r2u2ͮq5T<ě># |#nF`sӷ]E 8ġr2 cH#_Ennbs@|børll_ul%?в4{<2ajNTqOo] j|ݽoy?.*n?2ގC: 9|or=sZ!k3ه6B똻q=M˹np4=h)cv׼X+6%99?;h ~hiO?@}'~'~&QӮW2E&nƍiIm *1lmoQƜv߆_>;~1ad}Yyx qѯqA?;޺u\'O}U'v_):٫WdClؿ=/+ m=R/?rl\xl{)WeӋ=RLdK[&,FU&R@9G?->"yL˃Dl'`>,_HGUw<+}Ƕ|`Nu>>D6ί9ɟ":@&qDw mʃM'@ТkbWK4"jV TDEZ\D e%)5i$T߃Bp9@1XgXzz3\ok5q[k9mHnv9g~/Wj x3@otN{sm@;rm ;WC?#YR~QVe rUo3wy|h,y\_>~?qd%W=N (oцa`\*5Nwma)So}8M'*PHSlLu;|`DO?qűCg}~y,93\UӸ|ooщ/ W#/ ו@z \riH;Dgߛs ƗnD`d~'KNվ?qVkܽS f2m[%хc74niGtDwx/dl]3I.[~#xCԶm΁^`AcsmC|d{B.(M΃{mܧԩ^]gw6d{\SX^sOѯ=EO|_la+'EfMQqYC[EoVN qLhTh+B5Av`VJۍӹ HK(nkl뜐OOt,K3Y&ѱ 9_?7\36R~s>0xB2:<9I1kf]i [m\'OiDd/t} X]cՏ;JO/H2#l#+8a#jhZR* ߽AW6D}ܜd7k`r+xIWFq=F?kjDt{\?'|_7~1n#2$dWCnԷ]Qif4TUZcnX lPm#c7$Ĥ4FC oZA5FU2ലsĢSH qIIF/})td0Me e#ٗ`*0dGɼ$ω/GrJ}:$q~w衎?nT_Ȧ U;vsH0S!Ƌ33MoA76ʟ[Efൔ{j g_hzSmepo s5WVD c?豖nLLtu[ %,L`+Ѐv4$;濭*qjznJ>a@?BXG.*ʃn˵kv|Cg}ѩj|??<6r%Jy^,ʍ  \#7Om$'~s2nݰ};u[L!Qgm|px0~wosU'C!ShX #;h@X*\݂?s|p<%gqR;yP:[ZW?t2v짶?PnAO_51OlIw]iW-o<*^?.vSL»1}srgםmhꌋ/F9 eWqro"|i>vWq5:QONfY!j3{2^nWiɐƾ}†PO3ќ~/5/|6H~77iؓnï:ʾneoxOumơt):ŕ?NUK"YO16@=KN4f]Ck8!Q}Ir.BeYz8`|жv>]%]\rR]ci..2631d*?=LVЍI;#`aki44}%[[LcEzΑO^bu@Fk0lj(iSk.,NK ˭2=m#i2S/'>!LLJP0[>HMnֿuBjmy<(jW:wpQVo j2``rĘ ٺڀcOu#EOJ7 (9"{x]B1; ^*9wG#=X0l\h{chϬnws$0q_@7ˈ+~ Wr W]ڿKАk@~Ng՗f$zBM$#z?7kohIh7nc/۟+r{g#@EuMX\~ܾ$'K_O}it@Q:n}{,z4;kwLLZ .凎ujwcL<_6p%tSASzrB=;nw( n<ˇv7mA'&]r[ʥƛp~|uHs&$W~ܾuCG:387*n Ϳ, F+α;o6.tms?Ǐ}cѸ<cSm$O :?1+*22㳱7\wsP l6E"!EZo֧`P\p-:fɲQB֌}mddIG'?a"ei}?xQ?Z|N.}e/;JW,ryg<#⤲-JW }-P/Fd=vC 8r%[V߿ 9j:\VsCAyɁ&E#u;|/6q~E?MſB/Ǎ|C|3C*+Hŕw<v;&~3e9h7Ә]k9,?8לФ4/̏%k`1lť?+/MtyШIqtcm}>abDS!]Vt)3OO0"=xLvvҰF:iw=} ٛe[D!Zˆ#'nVH$av{}tp% ~2_eAp9ii9|>ȭ7&+S{@TܗIQ,VGHtur 3ӷA1ʎ(?R zިӔr_k.iD;]1bքctCƴM 9my2*"}k\bN&%(.//N3A~s=ʛܲo0_d˺QP{Nfo(}fӍ%ĥ“rS<hl,R{XD n5Tr~uUutX񊺝PGGszXI|p?|s?$g Xgxrp Uͥ=ST\wj(<诶/,y/sE$_%^?x|w'~Ŀ%QC۸ܯ1L4@à$V| ǥ.Q42㗧XXwɵV$4v/뎀oN7y;Jsskk:^pV+Ż,/C8˻2њq7~7\dE C~ vN:;mu2/Jw:QmǵW׿wI.Ԟ96ey{!B!\qIٵG':5^ \ \Ddlʗ鸭SW;d͎ܔƀCmg_hU??Lq&lO>sY/\dC(/0AQ``_ /?i s}G~s_7?2rG  cƼrO Z>'h\ki58&,c=/ŧ-y9߶֕0x\ V첽+GV),szl0'?~D_:`\j76IpKJPr{k ی/lgl+ɘ =]lX cʱH_XC#>9~3i\em+,#e޳\]1^sv:Jsmo{u+bL[_3/'3./#J9.x1mLevͦ;6ҍb -1yD۾궝1+?Nq tqe̲[pBa!Hv5uxBx?QMtA1b;] ~9Nq?%9dE w/ˀP¦5?2WG~9r;o&9 ^9/j^"bDtlv߬kQߐWo/ݗgGG-2 hKF;%sAM4}Nh~(7 `c8(>GW2ii9i+NeMŽF K,Fwrv%1E2Lk0 z'"ވc %tS(9>In!2f|~TāG ƒTp>G+V&sG '+/ےs^MNg&<&%|yJ?s%n$"^W Fy˸1??G0.?U\>qJя~Tߑ^=~Y;ݮhx4w{`gT?qh@g s gnϏ-{l8;Ec#~9/޻B1)ra̫OXvyZ՝'EocOE1:;ُ7 Ptn/`3D/8~ߪ-?ˇ,+ћFFl{cq Db"vW8lSʘe glB;ƍhcyoS Uñ01&بr:gDU$Zjm{ 8Ǝw|M8?ުQ5ayQ ~kz|y#b522fv #pKgAƇc,|gvdGtQJcn2碿8sT:G?yvmqr}픅IcO]߾bC UVi8Gw#yTor6jOS`㤓#y"81@|eo>m'M.}J3s':I^'m73!d 5Wú|{]gbNsALs2Y:!DV8t2oeG(~?ctL?8p G;ۍȳЁ??ho{G~GH#[av\|uCn~q['B/ !dE@Vڄ<E~߰"&'V8:A2a?oрnh rkqvEkSN[u=]<[xቇXMDreq ?}hfk✫u yQxN5L5Ϲ?O.z;NZ{Z}|r]|{Z̮S6Wf>_fV&ǁ/& 3^_}r=_O2 83kNjL)./˷UnbI?AX]|?^,VQgiX-%\i"X˜N2?붶G;0ByHKϫGxyq-jЃ;d4HV| wK_/1 '_odzWnu<Mcc] ;;o|#Vkd 4 Է& V@{Z%1'2 ~ _MzN7 ,K!L Md.e0#jښK?\#2wqj!mqtOJ0hJwz.njEbby"Ws c }Zn|`q#ߏ puad"< x%V`Dža<ե)X1O\F؉72錥_{WXˌ?c+or;([c"]poLVW,|Ӣvb(WԸckO08+{f$F b2؇a2h W[C ZH#䴮Ց-Vۭ<߶iƊsLs1517 tQ$u4.4xB1txtl&t0#/9dqbKY1eCk`Mp ?d@Uq&Bc8c4AQ`e>Fc2Xg \3|?/4&}*vȁۈ|=Rt )8ur+iZ ;Qz.;"oMyg߀-9Ů+)~7b(:)ʕ 5q~cfve}r6W<)\эr֭xޭ,Gw~w&|@uU&0x <~6cdSF_c[eoG_)3٬EmfaGuo U+/mOеe۝&_ɒgy0)>̋>Pt|w6Gg[z::]yj<& Yf< nko}ScW5vm/'.zPKLxa N%QM?ӝh htOGRXM&@2̓ ʔ۲wq4#/)*J%l6ڒq>_NDq4*{6 +ņr:AD3/A9/c0D2u:vlXY^J FHQX@8SݦsD]yLNԬ!`r|dv6_MOi"$jr>#<1)k0'n)$A[ j2}_͇݋KK7+7.`~5v~ yn/#K{X:ş 6_ <#Hm]{}l;6ϞH YV9p"`QokE au4p89B0R9][+e*ʃI(*\7;&o[fȇуb{˔NSw)S<"'}rI._~eFd>x/N#{o$I~T<?)zMZqUGYF +:6]?!t" N[6}TǓك~3W :߽AF[s>3HSDn&7õd\n^җnH$qMpT4]E/w;ZR~Ye!ˍAϹ-gek݋HYej_?ȦG&ь?),{m5gXʾ JiE{k`M ַNu/>w?+|6JÄT~""b^_mAD;/泗@?O4(.k%v91-k^Wl؏ش#IKVFY A_h/~*7)#h Kllb/8 U 96O;|_]Na l*+&4'ry>sIVL&GHJ5@>`mՠ5L9§3S:K&6\ !zmFAFl(X&]*SřLpoлP4սXL4If%1̻(+W[rj'چ DD ^e{e`?@'` 5| ů2C&EPyٴ1zKe]Ư<S?g ))Rg.;;JS[ &5hq3OcCXҺ 81r/:"4N2..nrSBMi([Vu˲>` 2ppwS>b'uB{:ܜ ׼5bl5Wgog$3X'rgNڝfm9a?"!A/'w͟/,}Ƿc %>𺍏I? ʐU>>cŲSdܝ7Ȣh|C|\ǧV6ѭo]0a!lzNLbN׍伍c>$g_?.ƛmGGsksqͬ>4^O+X '_Wm/vЗ LǦ_ X׿~mFV!_obAr_yive/c:y)n 'ڻYoT/L|UO׊$\7L6St^sb_+yk(ǃ"\~ˈ%-,;d4.m*7v&%M!$W=y[|%oxCq{lV'v'bd[!rhᚶ'0e, )Ny9|Hvl $]yL7XCI$vx:YGȁSplM#tiBCs8G, u5F N ml k#j3`_cM?N[7 Qc$BLjsG}4_^.sB4ӬZN~^w׊p3Xś:MhTXp*~=Zϰ6;} #.\p gxN8iV&V}z7pYX”+q| rnfwz( D;}vʶ :qL໴~cwٜ;J*?\Ȉ]Jo1l㮴W*]2ODwK_R9yCZ>_GuEa4&g>{myN7Y/X+K @0{7uOt7hQzsFvO' hg{\qChfiċ4[b)sؿY?qoڽLg0/g^!> }_˵J#~<ƈ\ 2$r6we8&YɧE:qJ+ƸUy,䢨3.9%%sBT ݛeP#ڃ`^Y7n*.WxF2xMolAe4V/(aEAiA[t3-~ &Ν*]\ab[Q?3>J@f-?~Wq&haa"ٝ ʢ}cW>,O Ze[&cYVY%q5ion+ң{5ٝ2eq9cuq{M31ۏGf(q{[␑[zwbLzwqo)>Z[Hڹ ]/̈́A+?%c#ؤbѠqĄ|1gw `Z0d_.{8K,[_+Ux+7cHp9ɲ렁#H#G/nK7 ƺn/?d_J7YX6=1M(#/lkX٩cźЭXgSa_~C<~gvϛ bϗ%rBl_$So׾ϓ!+ ԏk}>{{޳xE*w?ͫ1Oi5&Gmq+ο>|dެt|ˤ/~4zGg VםH!cDuOُOzc+=R:P?C?Cۤo?^*Dn$x qomvklȹ*6fn?]/q9f_ȹ˺|Q_dqDFEw鸉$~5*WFcT!(&שp9/A_2N4#AJE̷0q7(&`N *HjWQhj7MGə>`q49,(V7-N'g_ .vb,kW98ּ&>e2F~b[0㄂۞>6"ns|6'1ݦYL&kOߐ[sg:Iv$=ן֍_EYyYlgc]}9<,[y#v1r^QX8 [wcݹ^[iX:ݣjJv슾hێ>Ïs[Ҧahz}b n}'_.,ܠhO$#0,4ͤDv~8 [y<Jx1Ɏ+[{]5y)f5c? o?؄O@卮YCAK07wlϮv/pQdJ燼l{w㘄~m՝1.ܯAq+ OB&s."?fp{^:!:0"שOkeOt|.h0q|?+tȘiЃOuPl]0!7QEOa;GxZ76c]u4ݨ-Iً ;ё[]%DH<^FGp<}>/0:Y߽HJ Ͷj?(r `~\sXS$< 5.hdYM 1*jʼnsFlp`H&Z_C|-0''GpXi|F/Z8Cgc'h8:2օwvn1i,}F Wbߓְlmptҩ~*t%+h߰c8{"ˤǼM` y<N0W̷u&4N+\l"bZ .?ٯur-OttIwy1@GolI'{ٿ)]]Fc2=ayn-L6󘪏P$*n\]jÅ ?h©#u^wCd; j$#6d ;#ywrdɽ `[*y`1mJ BU頗N ܢs ;.qS N'1g7&_q EuiO{|_It3rB8'S@sa<'wvٍ~W'( (x3I?g>g PΗ*(o~\L||P%'rr/x6x[|tg.Wa(t2M~g~& m7|CS,Nk[ ؉A3lw_VcnG,OYN*n'GZt0…ؿ i??¶¡zQ؛oȕgB$9;=>+StF~qX/eQ{Ubdoɗr;c r"=W miI{~~#ۚrxYǾ;<ͯ y"4ηc rdA(|g8ox1ʄ4g_p@{Uy~~!'2{ e쳹~PɴP;ruwM'7ڄȬ?i=EoG\t^y"~?(O`ۙR/thGyǺ.v._]Ծ^0hM~j?.cdh9!廛v~36_?֛]~^u'˷D š .22iC:ě29YT;мf\VLPsFnu4q^\xb\š4T4JB p;1y ><%XCq_6NQx3I J,|_wvF >oCt6^qIF_e9yt5Qhvhò186G7ʣ#l˂Jysl+QوL`s+ލO~icofEd:<5 8lAUlM4еJ,0 p P8v8@R <8X$N2 ~C62͍]wƃr֝Ƅ1jdy{«PglfOL36'9w`8ȕգO?'r}En'L|dNpZذڌ+*G=rB+ӠcM<̀Űu/^@ͳWLs~LEǚSPG3[5V(:>uK4tϢdTWbPӮ9u2SW|];z`Vo]CW{wp|:+91kk׿~oRh!1A{O>7>9Fnn9|Y4q`Lt+-|+'ѿ+),/|Y.{n~/qc(K7[مOơ@Y.N0Xq$! ug^s!|,Whhd2GХI8+7n}< 7)p[PZ[;:#:~Z:>Ɗ6ThڂGb1@8϶L\<Hx9wA7nl&?A,csiP(+X?(o ݏe'i5qeRL 5mΉ9YW.`{"U0qjOf˛)\95>Vp7Ü(l(}Srҁ[5ɪS_%Me]徍_K$}CK%oJg=9y~9rϪ7I \AJ\|_ȷ3a5OC邌!:u,We߬&_Bl}a[+fh Ї)R[_h4C$wY}N-`3癋Uܷ68QH DЪkέzY?Rtm}emˊEx^h%֔+w vl1OV̇ԍc06NG$'C()ٔS.fv17 iT967m Lf;7p2 ܧhgnY7B+3l^9󓼟az5215u8 at}7Y7[3nzmtkN$zn+~bNîćyQ;(/ Zo?"crW(N5"\?7MC.WQZ+G1{|?ɲd˝w>AɳЄFw۷i^K794o2>']elM_6kf^XN!xNp]㖅$o47vb[O"SCD]pFiNi?>_ O 6w9IA$m'/}C\>yh/!u!OsE!ri(5k&p>d˰Gq*UjcጎQۯyǵCۍiǁ&.uXsQ  (n@ A#Z9R}x }QY!ƞiz]F.ABm9y{|(J:x9Is&zs\e'%K+:6z?sb,P3ۓlMh*?.ϭ`%OZJqwׇI=9f&q 7=>QtG?Q#Z˱'=^ȗ5VO:ms[ev'QrB!Aqg=%"/WDYk!^^9釻/21G;;9?pt p? #/f7$}AI1.c:1=p }cw%<أr=}y%'s~#'ͦǠSDC+N}[IBGH_N(XAjRWe;$.YpYGyPF)1?45qt)]9eGK-ɮդǪ_UB7a#>}\m;[lW }2xNۜi<sMJ8o6=dͰW|]3:ꦯebhSϟ;w;GIms:*>;sמhҽz>_}_]&j feͿ"؋i5EZqݗ$8]'>:Gd6WjXE.;tiܯ<]# Lcˀx'2kI&p,lh t7 g9O^iѦYyqrS01Xٷ[]J97|gXƲЈդLR yO1Vl.g:s)S7 X _]uh;,$yU5Y`Blr\/C9_ȇZlKXc7ǚ6r;-"/ 8B.a ˠz|Vܞ'wUoomF~;G yfdc _1)4F؅bЮn6?8О1wV0VBR_a싋w|+Sg̮ɮNֵMỳ6ە3M/Y>4']Z.r"?};?yx%XU y)!URJqu2Ը<>%zikqKkdI!4yǜ8_i m} <:oѡǕ۬{Z&_]gege?$nyÆBxM6DaeU2lbkm;#Vqq8g3Sme4r1md6-hs0hOdS_#o <߯}kF/~GQ@„owzϾ{# _rIB8)lWf<ɋya{Q_8^9 vZ,˟K7Imlnv[MdՇzE4pu08FDT0PhU^cACR,h$'ALc~su`:b׸G5  WcQ/OC'-Ӻv.uWZ>]rtx&'Px#bgSdq6 oܰ+o't[ɟu0tC͉8.&p\!۵hL&doiv[cW\*o`!oxBan)23@g0"Nwۧ9`Sp7iIpCUo;_r8 t+?N:UxboQ8hglEmiF._3+?xP]/"5,W M ec ?3|q}صf LjS.#_͜"Qh,u 1ۦ12 w|k_gN? CK8LW7<>'Q>%Oe˄}^;'߿y~s?ӡhVKo1ٿ7.- ܀$[n}_/j~"' g8"{R CF!9i߰_T+Ok9m앷_^c!qm46CvW.Vyƣu CW d6|U_ơ"M̮cg7>b%?zmNGW=r<5RURc'%'l}d}s8 l`1>r NM&(6\c4y~[.s<߀WocaȘ?w$-/PhhRy u0`0NdDv;P`u1ęLWE <΀D7#Z+aȤk}2qiazQ4:/gȆ_[#L}z BDUYg=Y>wQUgV@)q=}Y)ƻAp\ƜtB\Ifm"7pM77C'D!ay2G^PkJ}6zmfwm4Q}NaiYR%c"vqp)>h[׌>z6Ve, t7|L s. Lڋܸc,c.iΓtWY0 98:LsZI1vwso$p7XGܔ#oE2frG8N WP@~tͷrg.eZ"WsneY LzȀex"W"9oy vZal8p}k݌`\UuN*v<~:܆'ۭSx/loкLȽ|i''/C3V1.$_9>Dg.7p?%<LO4EuuX}Ory~7Fsw[wXgWMw4[.e~ǟu\b{wr"x>Mc:sﶩ[ڏ??ke|}`sy3Ԁp' jjO.q;3׽n켡_]tsW?ҍ ,xܸ?glVʕ?~dtEIƉ[U4ͭ9Z.2]ETT1]w$mofZldOF!2>+C!;Wн5_. }v!7LϢoX}7xJx4:Hql7tw07xT-ż%OswҾ,uJkiezX%dp g@THg\VNU#Agl ^&1/ sIݔ_ /"Q6h,ؿj7ܼR}32bf40['eq3ȿ}4w(=[mn3Vh1Nnc Ev*{?Cm3_οMr6:ߚJ8l u:A%-)1,-:7If~Ǟq̾&NȊd;5ݸB]Slo۷1р'Zx[[ӄة/۱N2Jw"U DWw+/8?Jz <\?/1yn6N tw72:~u_iYnn{߼o:5o2~ܻb(~Ȝ'&c_ re=@7^mXSVx3zZmT3&/^+վXv\׾>ϵ0T!9W:vUI کG} uǿdmti׾Yrע__}%6*wy>Lz ;o'<_|FEhfퟋwǪU< W΅\os  hSTrI} kw7$]A1+cDG{ki7oS'_w7&DgYgNmɗ&RF'qxq~\d"An|ﱉW@x".qaBn^jpPQ ۄpcjU8Ĉ7 GI5 m;8߾qe]+II{'hrj%C 8@^Ctꙧr<~ɩ0u(A<{Y7DFe8~zBmkk=5qIYgxiܕeo.%А2 O@㶠 i.ʇ᎒~}6裏:@|Gլ_{Ǧb7ChFYA g?blm<ϻAzuSS'Úgûʳfغ[3 9$8Mxg_cc$t%x9>L`v@;EgxDK<&w6?dyO|x\wsGcK%V^FQFwrIwk؜Sl;߼0p:# ސ| 4 &UQ.?}-VNVURÃdPmB^y7GO[a_r Bhw"@i: ;PUOa@k_8P s}؏6\QGnM?Y ˵e/}E?s$n41y;K4W/P 0ri;p[cW:}3 ?K۝38a+_,gbx,3wocp3'9St5.PL VFvr8x&\c~VW_bY6v4҇6+y"iw"F<Ssb,wyL t+~AFt3nx+1d^|anDz:|'Pt"[#b]nU>.qm׿|s'vY ?cmϿsiWܖx f+r>$WV@LKe p) ~mH*ǙOҿ?< m|".cA#&o hv¬WC8eRLq_6q85 hɏ OF8e1 '#1[Y .cqt][jSdso@K0C:tiPnc 1's*Ξ`<%?ϬtHȹs)*N:g}`鸨n0L go~#+G 8ׄ":Kt4LclbҾłSlxaBÔP赮<,O?W a(N,Cb\ngqp> _sq}Bh U'\sm 5GcX1ط/G&=p<7k>ns&N)*1\xKjG>0Tyܶ1W2wad[ŘEuD{NK;~NjSdbjM vH.)Xb%Ȩ~umM>+.꣩ЮW%]Ƣf Ep)|X'7 p;oN\_MprpWW:2X{W]]>x/'~~*v,x3N1k]eY<yΫeG7k?e>U>dt6*5o7VEuCuw;ltzH6ٿ]žct"gO,Υt^Wfv?=y`_|Ӕɮ 8@0͝ޜ<< #8`؏ܗۂ2t|%?آBLqؚC&;cz7\.'S.pFuT%v"%cL"*r4W73 '҇H>_WǺ <'ˎ j+'ðU tYb9FLo`([Iek#A TZ0 Oӷ8ω/}K[Po*@`Qԕ6tSu7;Luep|n͍;% A؄(&V KJdlZ:o oO<I4v A xH֔7e@ueGc־aVٿaZtLy-ܲ=o:sUԣ>:V2Hߠ~6=pCƿӪ?z"O`ԟ)&ɪ%]B7J n˓iO{.%w&z 9bDI7-\H_"ʉ'*G{8(R86Ct~?d>^2d̲Շ<1i_l߾?HO>pw>_+^ ݸ||ceN,meAe|Y:jid]l_?O?'${kSFq,?8U Η:#񟮫/-t [xa욉]c&A`ٿ5Wґ9sR,n۷}rS }}a|S1>7d.Ghrwl[I8ox_O4~lEӞ[xӛ7t9v ?] fsjEf9]XSo`„ei{6QfyQ=/r/'!i~RƫJ+4+f>!<ؑnkh4f)t1df}_q&_e7)y/OԻ1>B69ڤ,G7"rEz>g VO_`:;?~#!a (A=;cyQ `\"ۜ@+ω\EO&YQX]p3 Zeq>We9uFH5MF㠦@8*ox/D̎s&Ø)_.C u:4}iT : Bυ Gp;5Fr*0U'6AeH|bHa3}t<~G©?)֑=DUgjqu gv^OD)̀ɥm+< 21~JU3m|u&!#a~ha)W+B"<%g~le VPt;җǘ,6'/<صΟ><1s1U<Vew޾> ɿ:x y2҃]bX<Ɏzt +T'^aF3p_]ɮ};==;cyk'1_m6 OFONPVIVfQX|gh*L3v `V13#F>&c?3p2a\IRsXN*9JIΗC.&!0 o1Yv7{џ}ź4PLjiAA+ 6nOeJk嬱^eG~OP n̔1ݮ<4SOLl1eYh/V4b;3:z eNO a!]?hU^7z>TFX>3&zCic}cV.CA8m֔}j /S+n+u17&6o0#4^(~r̺#yDz;.~ t |Mn~*Rq2ۄŎDE I"`>q9q voi&)Jpt\3{2ix%(c9d,523WlueiMz9GjM9qsGbF#0#':2byt2q/@GX$1 E֚08f&튞n[yN<)umh|eb[tJhP|cZn:n#_`";kJEW M,pid/l7ūLmq2j{SaOYS"E%-p=m-uܕF 'E% M' ?x纲/z`_p)9sn m/1Qcs=H3ǣ,/lpTb]ILy:ҩ_c]{œh"Gukѽ z"\WkofeBMIaТp&?}_gv%+.կ/w~,ilj }룶j+h=D';7׾fj+b_?yq{WN>bOy`y_bGo4:?fpԑ@F[~! vE@u]ݖc- 1ԅ"ϹRdFl}k!u[3HY \ܽl8&ϢB4{-!a?E_Ѹ42̧N1ס} GY}j3_h1D}c¿[&߽'-w12Nl+Fܵsߕz _7O){T7)UWJ29o xle\^it23>9Ihl1}^FiP]M"֖ɕ~v<-v%O~/' qoތAȜ]ȴ';)Wb ''B쌿mz7*'ЕĽ6Ɂt>xdb6=( :fƘgޥc&J}5iǛf^0U](6['Y/ض1)Ρ:#/O%wGs}e8ᰴ<.&~K 2.[C?[mfNSCد:jwX}[سQɅEWeU漆ӻɧMVO/+Ou!uckeMΟ@}9֘χBƫ<7ү}k{:>ԏtv}5a3|۷7z8'>a|+sg`V=yFfҶuv!99_o 't9H2V|q*怛'=s=gjt4žK&`xsg 1c>+/v[=/!4EFȸVUA>'COs1j{֎xC{h MڽY,}1SOcce'_?hc l6mEN%wͅ7>%6܋;Σ:jWB#u]>3wR0ö*Q:tfs<\q-pgt.I5j66LOkI(:kvr&'S[OIyme ӛ],c(˷Ƶ_+C[;ԁzU@ެ3TV ܤC,2p1QKskNBKߩ,G5Ь שi*O6zֳrs7r3Q*FTa#pڞ_JgOEψӛ U!aoӿ)wK<'q~W*#{=sXnO` &c;o?g!i޶ MX( (n'ƅA?n%|hDz=t4.si: \:t=cQ}ex6817_|ϩIx0M;܆&t𥉕h[߁+r5s?cu]A9t#$,s;53 !q-z5|hDHno>X+[̋";4?}vȽi d%q*ԧ>:!+w\M ۛ+bf0VmWck3Vwa'=\l_3 AW~e/{YoֶzzSM8UZD{ubm}n3]|F[ަ=_zO?3?Ȁ'%C5O6]ǀeԍ7|o _l8#̳+SPknGyM/[8W|M6ADsQlXՏsi{=WvM| %;Vs?Q}| xo, bv2ӾT})6}S;J;;Ny`#NmauȾXF3ڏѹ.n_B+hc{чFw9SzCu0];PgٮV~y 7f"=0#__O>wgƁxĐ? OH7 -I(ނ+W9q7r_6AP-QRvyQƌh2+6_Uތu2 ^opq9) @,5 4gg^'-:MN-lֿ,ic'])׬OZj m%ͨ\q;V^.^& 딌aI&uqa^(¡;+X8a93ckf]ay#xË5:$伻F u.l˥^ 'եC^M+ht +q'mIџG8/A~^.C>쬌3z}!>G;8s^r Q+1Ao]>: Ì>!=69pi>+gi_ISk'K+ag]77~꧂vuhmvh2c/RZA&$ <?ᔛnG??s<*+Y>]r =5vR}\tuIwY[.^xRl\t߸6v.¡vM463Rlhx2[_6=WeMm>k_Z }&\@ӤlSu^wh2B]'o6ibomg=7#?M7(1> *^pjk/MBmNU7-/DgE~մ [)11ne\]atU쿹v,>5c:˓vQc+oHg #/ϮZw/ ^5~l^W2,NQEV79sD `! ԶS)ڐU`xJW{gX_7Pˮ|k:'9:sk0n!S! ٪>2;fuhUgFP5[oStgl/duN 5pd/t{M*yR_2kUG>[9d*v۟˓^}KGO첌8_Ly[bm':žKӹүOwe Iwv6B|{߻M篊[W{z7_pY0 ˎxy$"S0 .cC\۠CʼnE;mSRn["G~^:=aʳIobvm}dL|z|_Jm\v׾YQUt\~Ϛ3ͮj+b~BCx/[9۰ '&iFwcξOo1 YE`*/^Щ#98ΛҒi J6٠%+#E|NX;e;` UeL88h:S y\uL tX **^"$4o(|І0:( vL'˸K:oCLo(@q%60'w3f9%MvfrAyce{@ }\mqƗxMBB+Ye{^|k!|s;U(iWixX܅~=RtӔf>AD"ێܖe߹,PQ'UnG#ԃީleuo}qazMvPӘ;ړ|[xU\n4јVYփ/ؽN40";?_+lf]^5qh-rBqԱĘMGGs2}qB ~ g'am:8Ž- {Y{R>Mnx(b⻫#_:ǣWOp[Mjl{?̻x9 >$zqU}7% iKjյ6O]lia| `}h݁i74ەX٢^s>൹)'>+g+68/g8ig_bRd_l1`1"=`/応>i"Fp!3U("l>} 9'"9Ńsf+rARۅso0FMLפ=J6gN2aW>H\_/=_1QiZ]I"rLr9YOHFp:+*H?Ji@:&ȝ`w`?mX3^)uzץyo'vRz3At1f7{!Q ʌ`>ŧ2,ߕڿߓ9^/>,O !k&-geʤ= =EU|H!ϸ:]=Nޢ^ Rm<[8-Q6Hx4gm?vL<׭?ix6*@ZC#5N#1tsu=b+oӶ[U& ף9ϑ|5Yѕr.YyO2߿]Ӳ,1WxN"E/tߙ^ڜ턣]~H~ejq9\[p9#'=,ؖw2^a4'sma=KVF.C};Ml#c,)gC607V+%gXՙ7,ž^Ww~wn:GpJ[f}}v5Е' >܆c׻o2"B'?I{ }fi5^SlJe2dʴ0ͬw6ft?+|5,샺Hy\_Ei:;}PWtM~2gB!j~s1A~. 6W:m"\'\ktr;~C?C??&UV^#&Y.̽NcVs< :W6M}`v}OtF@afO\o0Wu$']ʻǫ%_%9~3)XM"2.47s0gc!ɮӛز~Vft(Mݸax.L~З|ÎMڶ90٢ bVdr[?!cةxx‡/\|/q[82>'[陃7~зE_Bb5z1!Fu[0 Lf1"eE8@ /|gf+rI%E'7=M%śc6.ܺ1npY`1ىڬ]Zek\LYӲߏKԄ0A}nxH¸n3uyOj06?﷧>%e rv.xYgL[_ bL"eȰ[gѻ+K<Ɯ8.r>SpkG& XŕuI hH7{NgYMH1z<|W|#o'a|Y!>)~ЙH^c ,eя~t zfѕiȏqοL y+Y 6۬֫Y3K4|{_f< v>x ]leD/%gtUx4^ TqiLcE@2lKCflӰaC릱f?;F0+t|fUoxm֑(g;Ԇb>A/)s~I$H (JglG_ALrA[O 8ֱk7$gV!P}ܖ! _ʽe\bԤS4>lvEmRNv "D;x ?/J̸Cbldw_aj tud)uQd%~i!@S_'٥-|3iaҐI_[JW^+oYqQr^C/#i }OBY oX pFoxPHdHd&g>=˿h TJ.&{~oysll`,7$΃PlYfz9?vvf3nG`k7lnWy;Ȫa)tEuFX'l0f4x3zi>|,7mdfPrM2 ov8_f7;8q7A,Gyds̹]H@?ɿspz۬- Q=P޻l]AkU]վWQ; r1Aɔ("f  I!2&Qf$!bDj$Z A$ Er}M{ϳ*K=n{]s}}:msH!wm0NӍ̋Q$M݆ amf|:|}|-?O~d} \NYp>^e|%L:^NN[R|J|#[\bǸn*\_ q1¯[ ԓ8mCbQۈ&DZ6܅+i?b3Q~Jjm/Y)ސAZlx,ֹQh́S~R?07 w8d~I80 mH+쇎ۃfV%&~,r;N.^/%71fO׺h=W08ar|(3 9o m pJI;_ 7?7]#m#_UL_Ckh~$ $1qsKVj㥆ʐSM#ߦ5V}o&0)FtlıwLkʀ>r?ιJ?x3G>uBA!~!{;7o;î]✢{1VȂdT `'{h+[Afb5knc-^QI~bȉ8Et n Ӏbwf(*a PZ7k𚁽dUIK0'=ga/@= 4d&~һJz8؅X}p$I}wT|2x̕ Jb7XXkX،,A{ ov[M>ASok}~<| 3uYtS'bB6~/48l}eRב;}':H#(`~w*T>rݔ/p̓ QEv,HA@O~tPREu]f i@!Ü2?mP~ì}qtcӤj '7n[ Ikfvl)_g-2*]68Ot+a%<+WEv7k*$CĦ^y~Ft"=$J_=>'7e3=е lfx b&8A?d|?XGmʯJ|xh iq̌'KVB'`qO-P*XgWe[XȧNs P &Q3ׯcl{m װv6cxP/ MEI(M>Fk2uO<2ν~meWpޮZdjs49dj??=ë?X-|qة\@ &ؓIKV9g!$_alpiNk`a7%;unV4\$`;b m92a?m&bu~|af2sC?qM6?a$qW{gT7}Vjf|"Mvl'1sQBn lW|cmmXQc_Ysl;E4=kyn(`d&X欔E:BִMMjU?&{iR2f\lk@S)hG;[]3kGFK#<~,GF`! !*;ܟw7"} eXG ZϿziFs7>p Gu #Q'Ca'6m꠯> ؤ~|HF^t¯p9b;Zw ד+z( oA7L [)ikm8.c;}l|Rc_>v5X=[?* l[1@?qL.ݎq)'\O>տkη ÿߟSjK_H/)eS7|_.J[ͥ%q ?ʪVC3]D[^TVqqM^s>^p9?|RmO[6TToHٮMwGOSSqew运Ӧ\&!d?\8g~v@KM89[$oW_)WcZgy Ŀ?(υ└/:ܻq}\y-E1+׳.i' Ty $5ߏ'%О?e5CC^?։+0Xe# ok]\͜[bGP:-qʦ$#`C&#zc9q}'OoeޜT5(/K9"K'DpQ0 .xJ4_4Ań89 +-O,&|ļ},lU6О2A mH3sB G.V> >3}DdB$W}oxhX/xۚJʅZI\;[l#ɎF.wU|&0C0։f:7?c~bՁo#U;#=EX`;/{}'zs@?9x~HO|W)` ;.y׿?CL o'9uZ_ɰƓPhŋl!~mA+]uylτs?/mRxq?"Of9? ܌;I?'.xMX[}".njFx?cBo|ܯ_s.~oo'˷ ItcwTF圴[{Kvwo\Y5zI!=/ET'AOUk,Wuǵy+x%Z:O?nyoPTK7}h%rJ&r2gb W~eyh7ˇ7oe]] A94'M?ikMqdS o}ǫ7Ԉbi_خWqg^ډ_qNlW/$G<agO5;3r#MN_BIO'U2xIBz ܸ>.߿2׍\`apY)ѕ;wmLhtj$$7[Kس]OEf s? lN3ҧ%*9Br87~V-g" *J[X̲kl3aZ ϠM` ?<+k҅*\ȎxiKa_t1JzU&'oG%KJRBax'p2iKnOFXlQ* '2QVQ7ND+Nڇf[f"v1/a~;!绢xyY6/Cە߶pAS{{_s؞I Gtre\!C0RƝ~dm▎v|^"ORacZȴz=؜V  ysbŁ_jwV+l^?G뫬.T|fq) dUdgpN>O EIJ,͆馈}q r}sb2o >ϊxڒȓon>#=9m ?_2SPgh[яI[V gx+ʍ9_':.>>C'7[پc|"Oo>s!#卭y*NQ1 +Zَfy \T?]͢xDBM˾V ֟lr܆/no[8c'XÆMR ğ/~~{;vDy!VΥ|Sm=IO4n7p$2qq=&6.klI#}3\B9Vg.59Gw A/6 e*|b4τl3Or>аgkqk7}S\n"XB/YΟLDqτQn?40}X>y0#;Od>FlXoV`8Y2";?k%إy9't,LXch'?iOlؖ)POc+4q˦ljtBvqtfϋMűE*o5?E,1&7ƍ$xV^!.;Y[Ucyb<5$W ЛuB9n@ܨ?٠ <*4).tj+;[ۢ iWG(jC}\qn.rt%@c"}Z7euZ5<ƴПW!l6;xcL+co̿'%s#6>fϏI[dggoz:Y]uXKV(</dbn{'r)0?wK.؊~vAìHbW:"sWNH} 0enJ} lF4< (y޸+y(?^_8~8_υc *lI .D0֦]YP`RIj cʢ̹>@zke;$}h?}醯߱ 9Gg̷@W{In?N_/DH"7] ' / ܇SVof;<*=щ9.gW Up pov[ѝs^|.-P-Yx[D̢tt>q4#fm[']ݐ$x)buAvl`i湙0/-/q`mfum&cYw7gN?zc?""ĆfXK)xcq4< y},tX^_ihՏueφͬXc 1Pz3a>sj$ Tlww)UK(d m}銐[ s6n&bG9a5' Ƽ>&5 _l97dH3#Bs6痲}{̯<7 kM1vʑ _ܳ7[.KI2yS_xhs\Jh!lSf/cy{*5ר1?ñM+X?oc(\?8 ^Jnweؗg뵐&NI>K<."qlOşߌ:8.gOحW= G>j.ʐ:v7? 4-q,kc}ս_wOݮq>e剧,˸C`ʩds>\dk'ߏ0) gZ78^]D-W/a Z|e>|LĿrINZcy(Z8 97h*`JJ L-k>]~!__~.&|J} CR2YʏQpQ"2M;5rQEjqsԟ&̗ay zd} N7ON72no$O6#Â% MBq<02wfo f'⹌X}\r?صȑSe~-q(Kkフ". M:ۺ2εBiyc%ۋi0P hԛoxU*H)e'+_ [Q  mGB5۾C lp7k9[Dxz}h R| jw3(`'QМxIX߲* u2Wځ&ɹYDHYy{@X eW;[+;wx!2Z0<ZfAXܔ\ȫ DmG3yZY'_ \_}J~VS l E䑉)H.ZD\xy峟v6MK/+!ihSNʵ\$+%A K98_AOw۹jg=|D_o+Z`;E~I+ ;;xs)NW48ífp~D<{h#^/+}>tPh>~jR?rc^;c2Ewh7q?mE+6kžs8z9ko>F&>Ih ,EwJ v?g2b/?.nmb׊nʬ[?:Gǫ7?a#t:_P f:ģOV"e5c4FZ$\WL8M<SQu.q<4'"?=aX)|EЙ}>`/rh\*0f-8DYmAO&r`^zcKʇʎd8gBgژh=]FsAK?>γ])qBz|ۅʗ/_Jq]I)#ٱ.MόӳܘrNڞoי+^S;y\3RΓ܅#n@?uQ1͎ࣸ 3쾕LO0؟r|X*H_v7qI䑑Wuqx]|_ƿUI@ wqkyhO!@;l?E]&I ix[¼R"jh ]{-:>`L?^a;猼p% mODC͝1Ѱ/yf!09l߇}\B'9 xN8#R. , 傷* 4fAP@?V>m&q 2Xh>x m?~ّ?&8`ªdK}.O3؎:&JWm&n BB>N9*bkqV|W ;sIk` Lilǜkqθh>r:]V)D9 J`ANg)5x1{c$w/nG9ZǡL='b"j_>Ta}oe|iz=":n">`Ӊ)P8A810}2#yٌs(k.'Dͽ9h8ǘc^vqP&QqY';OCtHYm.^#7.G?h5955f 'qpgmiRWw8.}#NO>ԯ ~I*iǴ(vydho4hDO:<ƾxYV|c3;g/9GZ ֌a}˚~ɃSy^OXhPvOλfXr>GE_ ;?s=B%3'a.dh_߻1t%a J'Pd͈c9&"ͩ^ l0iWӈ8eYu2./dlc^޸;NH_C'q cnS{Rȥ0QtPL9QgBe/Gw{Xâߌوzx^}Wuc@X&@s}a ˾NECDZ$tLCy77 E>||l.[2`@Y}u]F*ښhw ߞvs&<AW^lE˸uI"q(i,AQXI[>XUC'Lh@0# gS.%5.\:495>nl6|2pA O9%.kqc5$fc_OUöSB<"2=i,h;0~!˩dy'xp\h 9o֖}.^eXC{LFtby@2-Ŀ?ɪrln3x| GJHFD p WHy40}1f`byw P3y@,Oʧ5~x{+N8r>87,^'=@B-#eL(o$`'gf88܇p%LujVSŒ0v6xmu%Fq6?ꅄL*֡8e#O}>8q&0?}^O}$Kߎ֎ B)twʡd9w$mZS ty Qívn ͈SwWɮ6?FXd:/.'dH[;긌Ƿ[nh,ڢ?Yk(;hs 0'r[]~C/>o&_-}y?>/ tzT^Hǧ'[ayߝ#oz2R r酭q%g2GVd| |V j!'ڑ67[[kh9@Գ7\t qMf6eb_>6AfmSSw}l{r6.|OywH\C mFc"#fOFG',?~rrnq78$xH/DZfO;l>b혢 xm{ѧu A Shqg޿ۋ4hD=yGAwǫ^WG>q ͎ȋ`TZb :P"8Ǎ 64 xeYylT * 13 xO%R. >8DŽn7 IdSRsVϨ$+phڪq\_mgH&K]@>Elvۦi* ~6n9[\%< Nڄ2M=Q ܇~tWz Ḣrrr Gڇ{unОdp3޷-Ocl6g um)>*1A@W X4o T[F)qi>+CWSx}:k +ϱ@vd.Ep}#@?K>S3[|G5bn%r8r8aK`+S.Ŋf7E?e4/ :IBdÿ}{Z[mKC^ieM \֍v@{zr6?lh/X$|DX|.cy/PruojX]Ի(vX)4:a_i7%7/lS8B>}}<>^M:"׸Ds7~\# q4$1_+Czq@uۜq>k~)i_ b8pm2,MOm#C] [xqKf?됯',$;9G]"?1n5Ϛ&Aʾt{x>{_Un$<1 fIp8yn+z6%1>x a cW:0d95$XxaM^$ rߴu::.8]&3ڟvi{Wx7Z-D\gFye63kxB. 1QjGYhb :<&ݒe9wUR/ ܾ5OQvI)q<b0?o2^ĭ>K +,iU:Λ:J~rd@Oʓf%7߰1Lyz+S\@ cA|{7G 7?n rs9uh e)k?Ȝ%?}\aa|ãe%? ɤ?PoGn\G CrL:W&kJ>0OvPcͮO/c?'SCEt k?Wse&3'E AM1ȅx,c?r<ôǞo?aw4jګ1Ht9/4ŚSEdC`oNZSĿך(C ?؀se}{5B{ƩL@&_eI^{ώUC=h])uSs(?TW>iŧ]>Ga['ԝ֪]acmמF~5P[:F &o*qÅ H !kr 62`*Ŵ8,(ctZ}:SC59bdv9rR@"] 0 01DRukVR8}tq sOZfGB!WBO miܠ3Ǜ-"zNtSMD8I)65`Oee߹,KK܀x#ԊNqUS)ϫ!hܫsbq[8 O9{h?;dw Udwtrs;ikڟ^^?>^G2L/.Zu}O5 3齁O{Ez߉vӀ-Z{9zpp?{ž )ݏy0`Iwx8PJKr[7OXi\[7W+|_6|0ƈ 㸴ߔQ$h_aڅ'yO]sX\w[&1s. j?t/\ִE[eBȋnv'H/5?Dv3Ǎ `jq|\<fwl(ʨ-fE~ n-m..98 r ɬ$,>!tJg(ltmT!WIzRh6<;ἨA|pڑBCԔ[\mf+M4$Q>Omm?̱3,Ʌtw/ wy=%@cUtp[%|G?偖@) rf9bs+!,tE0,t^ia,[0yLO{EA[!t;=yEo5GYs.hqRut̳vȺWɋCoy<Ϟ9N6/V,AgmOOqs2_֛￴7ۿ#q…/8rnT/|a2_}֏=<o%vWj=ܶ o,?VǗʛ6BCN?1aWH neu?C;/QnCx/w:N߷n?k]+<ow'~X)AOS#\,Ԡ<䥞N,p|cv!8D]T@-Iqo")& ^gRkm\ WQZ&2ƥ8@/,\Ʌ.{kXº.k}8㍀7?o<`׸#q(vpM"iZ X j cmxawec5qZoa?2N^6;k+7NHOGW~;s2Vd| 8}qrZʫbmr+185<2^oiTugx9CE[:&w[M8)SD1`Ay pv*;\N`ԬJ vL %Qג$bfJh< ]Hp28C}K溈dVZ|<.^s!(0fѿ&cow}yoGl!ķ-0_?*7p1+ɾw{T(C\_PWZ-Hm e (lk-Ez>dŒd1%-N@ZEΰhW[&_iHX^l.|:c}-/mT)@;}oudM_W>?X4l^fxK%BR h]J~ou{GjK~G\Jdo 8;5.{o&y79a ̮ž?}U_]@*Ti4:5]P?W@L}, F,'33$fM@+g͖7/?#zHT+ߎ<''Cy"b?68ŇTP%_?XϾޭ?*7Z{Ay2u~>Eʳ]Cy4_4I7mDnϟ7&Z`;ڌI@d9h.-y1jJ?6g-}_ș~4Bssxp?~[-sƿYVXcuzO'Ot2 ?1w4\ ?S1Ǣ"P'9!HZ#? xX3[rh' LP 40^NwRj+If'pQw&K~vB?qvqg\0W3 $ɝ08X%cpy*8'-Iow'&:O& ;wmb3`:H8BR[}8; /v3Xf<1.Es ӫwtqKk0.x|HĬ%mf7O8 `YFc'?Ig>%j}{xp\35l񟭦oGnNr+ἅD{ʴ͖HG1/׌A- ˫aky_ݖH/gd3~M1/y գǁfXF߷ڽNp)Ρ u6 :v,tDD~>7xc>MGgq̬8wRx }žrLxn Stm3˺XE;$2aj,24;E*8vxyØHU!髸Pc.fc[ܞv*9^h߬K@f?r GyVVyAcĻk8N8'QW>Wu0Cv97rTmxa}̳rk0I+ h.Ė ?}T͎ool/l j$x<b#} p,ip0~ЉUb`ɔLq:.:#'ʄ΃sQ 6Z:QqI3i';L8;x=6>M jw;`r7W3j$ u”;vIvģ%"hx\뺌MqθQgU8~|4mD~^ߏc6zaͦ(֋u߬F{AupwLMOpKޅ0 >,ӿԺ+iUVZf =i;/O ]I5$oά=Cڶh\VS ˻Ȍ.z#`/cRʣqbx e?T}O@P ӭܼۿo+n|ՂY jQq܍?1xَٴ]xj\zгY? k2Yj|XO O_W-m^ݓ? i3nA=A9ߺ=Jh8V~πa Nց/ #)πp!Vz ^ ᚗ'ߒ|`1sl\мV_0߀Y)LS:!@gPf\MX?96:j}-9,?:>Q7O!p蘟i ?օ:Zv>ql3 h?+_//%9-te kzyBՠwyaoGXVs7lijBBQF.}q_6*syf2%qPNX%c_o;".ne\@צSF$:`7I97rDůXkm zov~\ov}Qi>&yQ^) :N%g;ؕW9x̬,+#/& <qGQ<ϵHUR:k+ Dީ7.nyǽ"*ksTslFs` + 3_tƿ|\@ "zWtJ.gYWUYkc{1*\rEdJ_e+Qivl 0*v~>v^`_͞0G^#Fyen^n,>eě5&Hpy/78 z߮ǿ?._}Y{mw\%?c%y<ۦj'{}hv?`ӛ?}[ ^13OO'k/m 6fgfsw{E.;|žQ1NtisϾ+ncy^B]⸰R݉ҧ3>Os~Cޙ7wPSOô5\YJҿ_Йq \GmES1le?Ġkƥ[)N !b\q^Ч ?F͏.|BV מ!k5?YHXhQ~.v k|B6/| {~xjAFKȡl{^ cun?ȧ!Me4hB0?S2< kr&I@ZEr`/Z[sks-#*9h~J G1Nʋ?5?rxjSY551`+Z4O*c|`v+~fuүٚc.[R<Ǹ)DX%Duʌrf S߅)ߡ|sg]|ZGW5a$?}wLDxvz^Ɲ=UϣRcS^Dٱ%>8Iäf'^JBOd\8 `s/RAnp777cz(:AtZkuVmV~xWcz1B&v~ED4b Eņ*yZ`Z|EuT|]WFBz DL'ُ_?~S>c]>CEGe|l#Nd*}y=7ʁds-״c0XÅnxo|jWhZFJí3MrB;M핼va ZFT`Z#<|ڶȳnhq :Thoߣ::*-|?٥ϝ1R1uDw{Y񘟋j<|'̛.`-?K794N_`I98|OV 븈5=ܰLv#:Lz#'yN%4ݑuK˻Sa՘7n$B_Mo2?L\UoxAk=5Ѱ$vװXԾC]dcYbmnΒi]Lؤ 2嚅G,+&Ό3eLȫ2s4 c  C!>98}n;<7owƿ@:hc5~ϬV^_τsvלMJ%Nn!߳Uf=x9>ny1.bD~œb!ڱ(7E3;s79ڑk1YsqPAUs b7_y짇`UGBkd :^Z7$c u">.GOi/쾲hJs?V_<ѐ7YpvJy'Wx1iC)w~܆C I5v '}?1. 7}'d@k+e@G~DeIV`އs^+aI:`7EW?#wZLiז3ЧK1(JW~fV*rbpy%/x.x:Ni;1f } y|%7x }͔1O`8iԇXצ;Nի f"Ӯ(3?΅5i]<%mbWWjrG],vk wq%W~/;6_ɄyO [ 8g\m<>^t͊]%75n\ks"4gXSΏ朅 Wkc8'O_R# );?*O6,udo^w86K>_6F7)O,pÂBp_5Nfmo_}q΋|U>$cZuNK3Rq@{tt6Lp+"d1bm\th\$ >Tx~'[y8+3 [3pUAQlXsk)D3n*1:: ?Es7 8ӧn 쓲bc7e'>ag;y<ɆxO܅N _,EZ hBy^5pתOſY/sj1SBcQ,xϽ3A~}x G| Spq"H~67F #%Me0;EGW.{9/pWΤx%eSHBA3H%^?dqzq^2hX b9ϫ܋߲eo>\@ʓPZ>Z” {-ehb8._!Q>e%7?R\w-þy&w3KAKm}N_\/;i}&, ?k~nIJċ{i&%1hC!/gbj 0ƊXs8"đy6EV1SM^{ m1]ofܶ>*fvBR^ mN@# 6?U5F?ƨ+Xg?zqnk`) 1cȉǍV榜Y|z^,CWJ!̖|\d*.> X/?m]5U ZY_vx*ނ8i0+/cŬhm-Rm[ݲоɿ3RG[+O= lD(\ca "+91nZ_<Ik'_hv_ פ{?>fb]ﹱ/lexyG.oOo4g}p ƝJƨ'^('c%W}p J&7KſJR <06~5u좟)}|l6Y$ǹ z-GܝrC<MX-% EsaBrHh'" xc/6sjl.L$rٮYOPL۝@,Jv@'1 ٖ(%VWJT>`D2 o} & ׅq,[dg?];7ᄲ\+/?5|ʗVkMk\[ ӅfS%Af&틼& T5KsoU5rcѿ}-VbUjnayB7Ͽhx}j:Z=jS~' ClOnCa/9Kccuxԣ ?od AOe#οkomq 0c 'T8u+_8r< 9ūq&+lJzh\c1G 'ζy}N܉aD!}⿈8+k(g'8üo@XE'_,Ws 8Ik ~nsP[9-?'0ƽ[Y{ csWrd1d5T3tRr}DgAΠu֋B9w !2OhmW云NmOl}yѕ ՚UW'3¼ӿ=(/}2u|tYV>^sUNKJ^vX^ 3^dLRrDZ_Ԃ4 pk.c*UJ^SD-įo۾3Gsߛ4g:?cf4+5!NXәB",r"vK%\p8)'ZO},V `bA [HnDi/bkkߣV9jlɆ))^cC I)\.'tsH\&NuexqdݒSAP<[O&F!ُ3Cm|墏6$(g15u}k@Sl5Q`'0Wg ]m^GQ{c:YfFh4\'' ^8C7 -6õa܇<>C*{bϩ!d)CO}vrۧ]io>ֿkܠ.GcGqoR_ {_a[cMz4ȡ/ŜVs  3|5vcuj,gY1yp[Odyߍy+:1Pƿ ~(>'D{?E N9^Fys?xfcN/(Sz?碈n=K*M e|%}z-{Jsd`<6(:a 3з~&^XR3#[ .%O/ q۬TX@cU}8)/z)) 6ȱ;IqจO' C_X֍1.rr\ʯ5aùi ±n"f%cѱ jDZLc#?Ǽe'1PsJsC_9eDCl|91!e{6$JPlb.`WXE> lGjC?я?Ǜ⃦~ F̹Xo;F[f4'u`߬:MK߬q߁uC";mg~`P^i{5@V?k}ݨ%1$rpV i[DT8]뻊C(;awj3Q义~_vNst ,L4=ّNgʯ@"E~ۂe`[ â(#Dgc. l16+2F߅XѤ)ls!?ߒ>?y; **(?چҩd'јAykZϖh16Ο@|Ө~b]T ԉMcq$'݌Ey>$Ϸmyaƍ=μ<ūnȴªޓ2y79yi|a`!HO 7?lD.a4OzPBmh%͙jZ]\r k?~Oynaw/)Ԝy/m,+EM5*j`{`;pܽf.):hpRe򢎰v,[rv@]SČ gT0=~&c|?[^y>S{?"?n[ZdoHujr\W?/F|b4u-fvK/ysު4Ży D]:Cl6'FϼδE~coc:D}OA~43 pj=NSz .9&٠?%4ayݞ ԝ'^o.sﺛ?Aj4~M~k$| !?)qc!oԱ.w#< Th~ADB*Q )i̜ J_}jN5D0)G!Ahlb GAߗVo9Ɓg.VŨӠmM^_-9O+;*1 @g pr;1o.H FyAY2ZqcYEDܜǵ3eD38V d+bmJQdF(O|z?`;pE'HEܨ,14?v<H ܰv$2-tE1}|Q+i`OƝX&Q̵?yt)Y| wЧ|_ݶ]|7o c1|X1/>lUMZcEGkyIoscrqV ]3zڲ)sxMGr:>/ipۏ1@GJur; P}G#yn!_!g{}{o_W42~r~ )yq<@OsT?[z9Oyf!jYco:N$Za{?./O'}'~UO~ ^ɀnΩ23y_E> ?*4y Scac [?ŀc,~sb[>;|jb51?so;GO?#d?vds9ɽ]tȷ48z*JQ|8~vvqYr E.a"$0~SG]u\Sw͘>L%_(gk/u1c]'{lye"Wpar2nЙm>ƃ#h|ei}c{d7?jpc q$_!Ж?u|bԞ82+>y-YX)-&N7xL!?=͑5OqsNϊ<6{E?я| uW?^rŭkfmiLf@& B+(a!Z_E\K~Gac#O|PO]}_-1mXyq6(,T;eF||d7dkyXn,lSpn5+﵇ ث!h~/{xܘwǍ94E^ٳi?B93@ D[3.D}+oo5\k&UL;YM*wr?(`E~^#7aP;61s ^a)%KB  &sL 9by9_G}m{x }x?)٣~0uCf Xv=uqǁUNc^δ?ڜ=? OKyo#FHz"[?dAwonsd =m>ߍSw )k쇵O<.w!^ak#4ɐ֨[?kE8'u@=17尹OU#9(i8wExp_ʇJ\b$# NNs;iPRUI<%GgYsb'@n+qC-S|"8BI +ҁ;p&(<'`dl$8JWT2Tt'?us84}}\YxEq| ;.o="vh۩ דo`sQO 6-,Ig':Lmyo,rs p 'zZ۫}G˃0E@ ǤSu(,t;F=㜌wb0;>b%!{FI}v 7[l)Yʖ'ʻW ;^T59 90`Vko>ξXfUؙbK?3X=\@/vG L?5s*S以L䇆|`|9k?*4'iiS.+2N`݋:j w`Inn7?ꆹRod=sO~ưn7VMo֎WS. 9Ϲi?Sô'h1ǒ5yANda[J6 ??p\8.^ZO}<-!nO%Ak4 K7v>Θ|jܽQGË"~] ˫<Y~%8/"^E}{<>I Gx2 ,?fW7w׿S9U)O܏dm+oW\)?{V[;c߸y'oCG9dGC=Fީ(2sb`_ƅUE7:8U&/\&Y˄ ys'0--d?:H~? `h\}n;`79^۞rJhw?AڌƎ1#4Af;քnH"&YSNcYs:ْyMŘvj{_ϹE5`Uwr\9L޷m,TYXRnShyN3QIeb\y?k/}hh HU9놬I{GbcnE&O?p]ןIB_ٝ7lcC,;f fcZ37ԉ-/0K{> :&;|f|S*iv}Ê?1Oo]/ȥpΙx0nqa| ƿ ;q~~6 ߩAm,>C!.~+ܢÑHq9}c|o__ޞHNwH{ϪO^[KOO "?BN> pymFNa?{.2H}HOWWj*$N ׾?C:8_{m{ۇ?;tmg1n&O<4H~bUN)t*wqPv򾙭=QP .VOrv cu-XJ#}ź!旯nE'h-W>IVf>:C=c3Y?shɅLYE`6 8##&,@dqxK-AX+=Wuq`s!,JAAjcwL$ƴa#,67A;y=`pvEdi{@zș$*ٓϠ1~|}(~wE=|V C0ALi{-8~cw0f^s 4˸ \쬦k9]Y.Ȫh>e= DekjڇϽea[yS+'0(9";4%7QU)E9 )9e qn%N1c퐩SwQӘ?x#/Xm֣?A=g_/oǓɇ|KsG,tV7koψsk-YA=٧0$Q߹q?업V+v@s24?\qmܷlګah?Kj! Ql(KZ xaƿ՚3SouBO; RyP0ݽ*5KA3{)/ס"cqI pjŪYߔKja?+Fjy8&@rMOrׅO#|q%cRodg;̄?B9] Gم`(eǝ?}RKXv;, xnw&cc7!w'=8,gSL}@zo0Z'άŔl`G9ֈEsOj@{_ f!+]9sS3[? ~IʲҺ_4o*nb?O4 f$y@CVdxy@%mЉӁa'Cc\ʤzX~w}3xp72鑮HϾ8\؇@/-;,/+clrb߬Iørci[N1WAaQD!l`33Ype}z!i?b⨌(6Ay;ck 'ke߿;&>''_YiY{=nfN _(oW{]kkƶB80S0ء̻@_}B 'ψ?+T4IV%_83N"?\5s&{'ZOI}4v,O\x3?*6ǘ\4G_Pi2mY?qir'&n.FO?Oِg-61; ,Ahsu+D̖FVkUН7Lk_(&{LO*.'ZQǜogL96Uye· 7>6o-Ibky\I`9>lsΤp>ti9b?7V8!z~hOdW ۜJ'XI C:OQ++~}SV([>v.ſ}j\Ti '۳u|Vs=ҙ-d=SǤ>_??]H/Ne;9rhL?Pk_c0Y9Ekokl2 ECN!2aB:#[M̞E΂ ͮ7.G v_$?![{xk)fdڄ>DI 6E]"7ya椔Vs4&LZH.A FH*ȃ e; O*x:<(O(vVx=@4i嚁[R?}_Łj'ɊC4O57g}gG?*Eav^뚑<2qȶF"!q|`24`ůqz"Kk֘+IJ1t?}A6,dpιMM9w~^W>H`j_Ik'hNq?;31'an|qN%^rYw(D1ڗ9YCCFm&KUv* zuR=똼HB/si[OWUw}P^S Aièʗs|{܉J87C+܈\fU';u?5c2!-Dvk[ &G>ky/̓^*?cH|хh[x{%?\28oV9-uaW?sOgUaIb eBm}%+)q!?͜kF 9' {;^|ݘJ^'ۇ+SyA r\ۣosY{Fx_x!>?o{gOݰDXC񉅞;Kx6%? G^8c.'^]E 3u<$ 0viq/bMC0퐕oņ9qNKdzX 2XS1-_\;9KC/fSxO r,8e#A5B+G+C)d ԭ1N R*A% }#J,L/BNdMci|ۀw#+T9ֺ$"JlpE{n_WWn0>o}+dY}5˾G5\PaLVJ;Ȅu7$W~t8Vƥl-A9FWc6s_*Z\rduq5xk{ƛ^Fxq"Uۦkvu>aK}`;hU ::29߃;qm椶< )닪Y|#P;#AMSWuqdK)?a]HDxpq|Cmq3im\bePqjG^m~ oVovWψӿ?9?qgߍ=+)cƔ='(s}aM)\ɛ'Wq/G:7~7;'q&Ӥ qͨ?>(Pu62WF=pޜq%(`g;fSqª?3`d|M??|=&VQ&<o5mtO}ӥ"?_V׽;~_q3!|9ǭ? ]5 1H&odLeߨO!#-O&"`U2>≵`dbL,?~nk}l{"=iO[0xoSb.+ %:\rb|skFqS=fkt3fZD:YwK?'L_hnw4kuh'=Xq 9L l5 fը-bKyyw!oEP3Ȯ x.a bC1w]@ ׋eԗ"E|{1S:;!8O'H;gƺig]zx?F=ptq^GN[lFk [ /?0W%sVCZI!\+OֳC?2I fko&GNا GR&8>i13.e*/31(O ^G}zgM~x933&Q(CA-uMvم"&bO;9t ѦmNl$}$WDt3.}fӦ}e[moy<0r ]ds|7ʈq+)Q:ᵖtA<5b1ͱE7VG84ѫѿM=aܔ`=k}+F~) S(Y=/sYD{>~MZYLsyc2~>rw!*&Lk5`mbQS`XG.W4Fqf=epp5Hи舉>>U5^[o?_ZFrBfS!~v„dW6'V@X[I"OzPv^|GڸyZsP?gZx }xuJ˘AMv5L/ <ƨ6i9/:~u ~Iec"G]}R`AW6} _MĿu㰦=k ԯ Ӛro2q4W١]Dȋ 0>qEɷtҧ8kg9\fH/Q?/Db+u ]2feh`~f_X̱O>[?*Z#9,/6GurO%BrdE6f|ގͬ |Bx-H\)7omK!CS) kb&:f:f?r\@yit{tj/?> ~ KYqXuoGCXeC~B0v<̗:C.|]?ٚ(7a:DoPCNoM<'~'-_0l. 4aN.SC)*|\uh8C5b? ,b,4ׂjffe򣎲>KGY@+(okdO˒Xցl$}]ַep X^xZ{y 1PJTUq;7Gs(|}hAGƿ_)ۂ85 c- x?omr^s'F!2WϝNr[[3W:-;WɏI0k'sf?kܫ?UdP Jqr;\L׉^lT|On>.=<.5NEszȹI!(|Ɉ; /%g_A; 9pFC/݆I4\"N mvG[ ^HKS?䤭'II~ .?ɑ=3T|h5^$?/bYFLqvO#;ۭɄrkV윟\XsԏzV?*r-0%C?|1siq;s$c;^lO9~kϲ 8=a2t'=y,j< B53ZӧCX%Z&tV9 폹;!꿢X"X˽w;l4"R7?*L5p@2Vww9xʢƁ?zz97?sظpCnrɱ;87#>9:ʪIB Io}*፩H.OzrܕxA~q?EuAQG:̀vH? _(ܠ/޸%im֪l ,߁P ́2@"X1wԻ,?t$nVݦھ! ~#3=Q2b'vӮ <^3LE3YPZɫMRf߈pQ QFJ(~@}Ӌ⍝'8~ `?AZA9*8[_J_Uض3i)\?>^WgcL-ꗌRHxmUT|?'pG |5b8WABr1N4ƺ쵉zrަsUlkDtUd{c)fMs7%Pc]/?8BYK?qʈq5jkNYE|&6͏) QWewDoVɓg%~q#ګFyAt?h} s\|g 7ئr6~6y{Bߋp5mþi\#POQN~ z- 1+2V,쬋lyńcnc=XVNGn8׭s6ݬ([7!n&[ !8|UƿI/1 z mAn܏ԘZ\faJ?x8]<'.]WſC5qBf Bs'7dG-<L#/iܬ̫4tۭpǂcf!rjȍ9?_UYmqM`n'>9ZX$}:oG2_?nJ#x/ߡ̬5"s0HG@k(̱h?yRm_V1!Tū˦ơvRתN~~m<0Ƶu!?B?=lB> W28BWӾv䅳σ'7?;5D_эsEX\^I +9S9ߍW^W&&= CѕrޜۊM$F̣v%i_*C!&{M^Vu*,{Ͽ?8;]ڡ?Ѿx4* `vb}B//~69_>yOLiT7Ar%DZƱcVߴ+qmO\r=!#'>o8]hUK3ӡG"4=HB|[UʀyȩROb[֟/ÆS 3fK >SǶ'Smi"C7X Q'K].ACFDbG1Kkm/m$o?ǿh}}f/_,]F 93e}þgv 1bBE`vj CJ sD]i 'ʠX Q/%qv8 K* Kc /HwnLH4[&nRA:Td~w86`{6Ek>dz[ *|[rJo@,Bق&#pB?Oڸx>PxwW׸8ƏSf .+qT5I[8eYs仫}@cMc7 -aTk`N):%K>䏼7O$G^4 h4If3VKQ;q)i#nF&Q f6C3Ҍh.UU(:oJyy{on{NfFx{wC\Y꟯cݓ[᳛KC/9Fngw.7#k.x|SS^ BM?qͨO嗚{ݎӷvv/u_-۶_cYkxs.ItsO95^L;*>UU7v3.I9lJ3[. Y#FwWќ睇ysaϦK?R]#r7l.\=mqMto@di|U>⫉5Èk Q3q8 FQ62i?MA,4CeI꛱f\' 7k 3䊸:>e_뾫=ɕ2輌c ]./Vs]3_\-Ƨ\=M:+%/W'}ſN3k7 9!M.,oyBpkS"j,NbчWyi8t(gJWk~)s[ByMfwo O@/o}l|hHbm?)Cqr,6mkXk쿋t5P"~ ]ڶt{xcjf`Ӝq ӡ⧍#bUob?ּ&fܗ+(TKx\*MZO vO1 􃯅fGC#%3tcΥ`LP^,ʀ]SE+qnuY .:.RF˓L`nS q|D7)lh/LF,vuY/>yx:{S@r Oo_Ŀ࿋{'Iu6[oPXV/پ+W}hmx}ogI*5+?5AS̵M}svwC9"vOwcG~[f.͓b7Cǎnr2Sǘe .' /(]Я-`Y\E&߰MkVgR|QRĒtM(mgt_`6eey6Yj̝?\HE,1"o?0o5z~r܅gC[סƘg79W`gvvlm%UR!OMry;͹ߵnk/v^0kފE-V-T{)ji徉Ѐ?*p19XAvՑ2Xه~K=[Sߊd̸ksz}Ft?ñ_hdWpš|o+Mu|⏘<*^s-uĸk{m0{듺/^ٷmGT j'$&?^L\!H,lAGYOpg낆 vd2_l0" r.W3["f<%IE K;]L>1/"%4⒀|*2$1U歍W?&zA2mIKEjڄ6cMsL7]#1;c혗*}5ϸs-ǘ#u6oa]kXr _}؇ݯnXܧ|i[SQ2/u䯝*Ť,9/G0Ib i]ɷ~GErFCu_ڛgg[N@BRe}$Ci,/ UA_(_ָ4O/.b-QrQ4Q?8H|@ p/wG:.?)*ӫ&[{uS_ UDP1fm~ϵdaɱnK7q7 Bgl4c5o0^9cE_KnM-r.^.܊3"_ݚJLSE8gf6M^xա|OfNLCWyf86nUCӌƞn_͠ſeME-#7K^;}?g]dFyX?K6eZrTC7Ӭt<0<+S9̎Sj->i֡ (̚Cby0ޒ1r8ntǃ7oֿ.M\?bsHȸVC>gO߬\h?m\ECK+O,0(/hlD/K>㸢w;!>,76u-H">:v" 7\ T Hk܈E]LhͯB;2qMS]PD O&k_M/u13+?oI˦&xOџAnyrIK% qػxMZ4X$2OCmKlJ\PF4ƍ__n6tے`/s/Wo? ^7D m'KWOոh}ݼ"L S}%Zm'{q?rK_ڇs{.Sp.O{=yL3QN-0QIk6WzPKgnmRb o'w-}_[ql&oض?skS!' sM7MR+t\j5C=-JC~Bus:7rhg $כr]'nҜ\ϛT1sXlNb GQk2n^yG&4gAkj_b\=?{?4{~<|y\/W7&xM{?|y(]O Eg=AKRTN7G;6N 0! Bp4Nm(8):=fhYv,tq5)f剓M_dk8$MK⫁­O!JRX >ƄLOq g~F_Tv+n v% } !o }W6vO)|ŏ  A{TTqMI_q3{'ۢa'|SȪ0; #n O5|ڀy7{?_c~](w?{5u'Ԟ%gP'pɎ}XTv򩻜DKZԪY N=Z熈][wU۞QlK&O/s;z.+\EsC?coVoR<-vxfA%~+sf{oY e ;_=okb埬MS&qjs¿S\ѹk4?I7+!_ yVkXnbĿ0>Ź]^tː ^C7b/}[7k꿯FT?۾q}FzG3\uq}>K-Y͖eHgbL‚eFyQ xf^>x?ǔ.(s~ܯ`2|POpnK='$Kf=I{GVyBK36Rr&hF85-7'1 ePZ&>Jbcɾ'7ǯq>wvww8$"AR֎5bjw/~hO]ɢSbu|9sؑ?>ytS|D}$JMe،7W>s(f|;CG9?9k?ڮF%. j%_Kx~8P mp_UYD1OsO{myw)h?aM =q0O_K:=f#5}{>Mkv^MdDOYo`SkހLu ;#q]%,-eq8mm7ބx8f>;7%-5ԉWiqX;LYi_CxWִTY}7ƿԣ1Ϲs|PxKk۴8k(:{Yg!wyOlfP+DD{oR)S?q4"jM*#j{01Nk⹏xft R=?J7[3lCQ3s\qL˱9j"O آR-<6?""ſY Z q*kƙv;Z_{g߬}Ks_9X|qQrsIQWzuۜk2 h*s"qoj`"!s:/qk""AIHϹ+BU}:Sm[sD@_iβ*fÒЭO";G`{}ߨoހOW",fYgf;:_w[)YER%״9GhO?6J<_7km^t_ DhsEǬǾ'ϧe#ǺOx]&OacyvN_9S̞.ϖ|ë -5WcN ]\,[S^\⟘e&04cB /0Ǽ-MYa/֌ r_<2FϧzwЃ1mz͗wXU$&mJkk,xj)q]%o]q6}*bT].7[_g[[a c=x̨_u|>1׋ql5h\X ww_u?~>WG?kÿY!ɺr)~#x ;#qy,O0]h[)ׄ'EFYܫk-ԉ1-FQ.Kc Dr,^RJX$\-u'. -R@TtЂ%⦨OFGM$4Rp~W$\[KbZ,I`kb-/h&~;ӎFm/ >t. 7 YϤ %f׫XŤn[ޥa̔͸5ymlFV>}!EF̓/{YK؏?}h41?d||72̽_>g !p%>EYOƮߐUq'v0olVܧ߹$"79vsmuq}¥֞'qxxU?לyXpC?ʷ:y|7qc7_oBZ_9uN_3Ϻ_5,X73@zXSznĄ*GuWgq,j.u s jWHO;lb[ezn?t-.Mpq|!2d+y\Qm{cΦ)g]mR.ddo?r} _<垇+Qۺ;&hySms9T׃K>¿v9H~wv@n=R`oobk[)*4~S@'Rˎ/U_}M'x3Tl'q|Mx)7V= _^|[^iwNoނ{)ŏ n6Sl?]Eą57[̷?o3$+e*1+]N]e2.40S "tKq>Y._ݛWKMo iadk铀JD] ɷ01M]7sP8$6 |㫂L4=~v;6:lK0<:n%Gk]BcЭkǎ8*1m))NiG_VUq><\>>j;~!|ɇ,'Ywqn 9?pR'񯶹|o/cR> -4oꠖ)׸>~N\y1.|'sTw_ww.oԍ-?.k-F ۚ? oEDϘrGP;mo{0&3o8!\y''gc,WyaSt`'}?u~B;=TN1yفĚk\}?} wU՞S tpkK,aX[w>ي!GmύuO湑987FFEŨLX6l7l 9niS+',YW'A9r[+CUQy~Ӓ ŷ:Fmmp>>eobws~Mж9*m3OB$qU,NVI0ƹ,B  EF^7aªR2aӛ, C^W,a'h#:$'\[]5n=#X ߬e2粏FDEBckc@\wMiI}{_ҿ_|aon'1NXhRWbxl-u3)y@<о͸pQJ3$Ml=lײkߺe|ʏX ylbk̜T7y>ï>ؾi'Лۘ<rj?10-#żl})\狓O)5 K&ȧĿRojWc=aaurSU Tb߃6̘>Ы32{??6 _qR.?}/)0B!rb'#1^CCcoc߂]OeM4zG'Vgy",W_l(q8[]xeR1!bt@s '8'laW]b :[⇱:w׵uxŀxkiBl_d<n2גt~ynS'vSUl៺6j_0"˛]]^>nxwS=1J=x锾NkX_}ږ+ K4e6/|ၾ;[?ХǴ'X _ }U*GjM(:i$c@u2{;l--ɾ\S3\Ә=)w1g>*>}3sF_N-);p~<_O}~>Cͳ&9gQƘoG̮>$Xì\ I>yԱG bxn?5oً!s4 \H řO4 ].@=YM;h_%^CK$`nդ#Ga7:ϤdgC`ZMpsL9,EHhɫY?`5֧ƈA-pu駟}g8-rͤI]3,u*_>IK|jƥ(C)=a 1nM$obM {aٞBbɫK&6˶yܗ_2WPFQ?w`ڇmj_.[愍q IYe:Z%"]k hhwۍ۸iyȯՖ%y niC?b%M  v:/A%9M>Acb͜_EQ꘺>Mm=|Zc$pCV773(ƙw 챳 }HO'Έ݉I?4Jx 5T'w,{<']|uiZCy\&fu|.Rs<_ T! Y8W(mr"//:0uS^[~53~c+Ih|zf4b;؟WQ2g1.+[&}j<&o-HL.>Ы^Nܴu1ts[Tq<њK͖ :[xIOYה^󡽹nnhߖ?YK3-ͬC^b>Aތ0?oV)-u;eD6SB]Su7Yw@rVj 6-9l9o0M=JsehGɛoG5s?Im}s{\om?no^ti;!wQ= xc?d%?Ք3l5>oEC^k7#~;wn?0"xcLX;4MQWtWon^<.6U9 |v9Ԃ}EOҵ(_0g)7wvDl_8 +G/%oo?7!ܸg]Oko0UZ1&3!r@9&y5m^v=\y|,oS<犭ښ4nD7hM{͖ {*)_=̱O⃜K>,vAHFyToV9zOEwb)ѧ-6&T\?5G3/cf{~71R1OA-J4[exI`S5+؎XxzuO>DyK*Q>8Py7O庉}o"_r*e.N3Y?FQ'7]Ȥ_-m0PK_skMls\pf5_tkKy D$ɶmSa"K:= O;ft!9 q; &'KpA.0!X=7!,K;@ٕ!ů S4Ϲ7QD:}2N2LYx+f]b3\["gcd&?8:ꫯkf+OܗJ?ū$/J+[$IDmMW|Bgo:'&u`[7paFַeM7k]?)QY+_/Jw߬¹KUW8u;\N=-wzݝȿ٭ּ͋OخSMz>ނ۹!w;"ħ_v|߬T6G# 2Gtct,b\y/2kc&s>gObo2x [+F  OW4{S# ;w1v,_S[GWUssO y#7[>ɦJmRɨ֠^yM\?Vq=4DۮK6wW;'cn\Y$fe,ee}Cg$ \q,'>nKaހƻmZmIb9mj_ף0O Ab!o=:i#J8`MP3[f3'UT~e[@6h]T|¿wË)J!r._K['dBgŗ1>C} ] kj뮟ƿ5r$8VN$,'ȹǽ yi.Z7?5P %LS[u7G^^c2Mv7J7>rR7/&xcNoYe}wt,?k91/:N;"{\~{[9/y}#>ϥ~Qםvÿy 96Ge-"_k%Z  kt1%a]W0cvG<.PEyl=?c\֣bFĜuorQhK^ff['!1gYa>\Aet-9'OS͜K>s-'(߳k k]Oqg;&.r6̳b+Eon6h?я惌ه?b(lG'Or?UZrn]h򽉭Rk/Χa<5:T٤R9W<eɱſP"7tLQ-R籏İ%ᬎ4M?FMR]#WXL3tsws*v@l.VrX?`RmWa= t)x,;\H |q~ 8-r ˛V @MTk٥'Jbb,磍uVz.lN'tٷ( r_I@^8DmoY:.9mvTGgO'~\??woZ.O &~xv/u8 #O~o!~o /C{3? Ig|Ȉ9-oye]޺EiR/|7w̡\1"X*<ߴdYrQP5@FUxQYUϹ/q%1>~oM^%z/\ihf5l .?Ĩ }7vzxG?/ J>쇵9MKs.?.V)~(mq:;?h#8bNgYWԒo?tDF,o>l:Ea|X[ί1̬M̕㰓:_g!ON}\x Q?dJU5-5W$p)M󌡦=v`{~v \\8Lje4l/K8 ǎ_sW"+_mL2U9FCB4gM|=gQt X_iq^ eOYjZVouԯXgXI<|ysJ=g*9< #|^bjN9cN] p5v{xc of+i+U_\?cϬ?g H_ 1W7*x1_溋fSO~bӟ+6wy?֧Kȥ&{:'t}8'*I)kiֿƬ`ḻoy7ck[l '.sQ'.pAIvr4u}<5'g跈OoCgWDV_ehZ-!Vbpb<`ˇӗ Ҍ!ů_Z5k Xy!b91CE5PGCG )!OYS} NEl?c;E'{ێZՠwkX%Ym-ڲ_-5Z^(*&ڃiyOVn1r2:o?c5-uqޯ;(67䲶KJ\|ſ 5;d<_pecM~wեɳ6SAveAKYx?*]Gs\4|IEQر[+*7[,Vv[hbM=/u Y?uWQX8ql8蛯W8gcZ,qO>xMsyBcK]v4{7mcYGIsC7WA_.uvw K(Zo!lY o3=pN期7mv}g9a/ƖfbS<?7ڙޚ7?]6A.ڎ_&VYB !mKhlnMލXGC,we^۴f/_m*,}h<_O=IER|9y<+kFixA>~sWh}Rޤa㉵ܾ? qn RTN|/zςљ?vG=TV6eNqeGEST1+a[yLb]rדbf;uWf4l\h~swW.v)MN+ +m;mvs ? 3?L%m-n򑎉X9\vsks;;%"ԁgS;Oo*p|WXEZoqj\ m3۟coSMrs_A4O8|-ԇ`ſ~i֟Sn^9=klv̮Cwq} Nk11M<ьC261fAf{-T}mg v9vw_q>|ߛq|lA;ٜNVUަ1'\&PKŏet5k|kUe>N-oֽ.^VAk\꿝Loސ@s^V9ԭolU;yte> RJ+5~$Λv9JPv+` [oD, 1EOa". ?.v@ߐzyҊ$obvvda7r>l:^}I"͑A60&UXM緿W7~u>9(2=݄Ŕ]I6OXhnȾ O`G9uU]{e'Nԭ;X{ߍN(vp1G?qMzgb"'?ه6w |?a**<}o9ɁK=qIX;]' 8k=+cw(]ɄmD`٦3WM) rMSA.%\16^_8!Z+5o\m!p߀ I;I:ϋx-#7c`9f>Ė//y3 ^uX9hᨾ0t\1&&dA-f:ҷWwꄘ(q?eFeG[k.Of|y'Q޴X;ąk?C:wfSRNkBXMZ;ʮy@5>+82+b/ƣos,:sFƫ5'2 Se?pϬ囷q0ߗT;A~\x+ "焗"7r=1oܞ\e郹+7]oxY#'/ L!xv+Db1Q.g3z_c7P_|qdrM<|c2Z:nڜ(H[DTSES#4]߬KY].v5>.?s{Iا=npaM-7{?=1,kV7QS*YF^p7sG4# "QI^SW:="v$.ؠӜǚO ,\'24OE4ene!!Ȝ,@L: 05$K4-@Tя1 $eԁ߬}zww;!xsr`/2^q.CœJ\0vXk yMſ3F=-1' ͖Bes|DfaLk|=leppQs|Aǝ R؊ ?+،Oa?/ڻjl[峜pg??$}> S+pg. 79W?i="D[䴍_>oCD߶s9pvzRO.B1!cA?MKe-fB%0?}oJ{SnCCθ :ǟ r:d'ϰ]Mcuyrms|2vΛ!5R+ǃ=+bM)ӘcRqN99ʈb# yb]2ヘץYT*~RS%>uieO~SbQĘ0p薹sCk/8nRw:wʹg\іGÝs՚q8O;s9Fr]tR|6HGp1I}߷_}r_> >ks|߁ߞK-EKY`bsR؍2yXf-w~Vj_~ VV]IuHeCk8lVAGc9?9Fl}}3*7MtW#.wk9sS?9O9*yH!zXT/Xeo)Ol/k$<@6Mj eL+^E? tT)k`ęI'eB rsq#̈́Π/I^l- 2OyȬ5~cA%<=EQ+~* V][FyW}kں/|$6\GyʏKZ0nv}$f¦ hߐ@蒓O K$BB$2cEaM@Qakk3w ReM~N[A>C<'y7AE'S쎹7yߥkO?qq>"m97oV^[7&"O?Ww!#,L%KRt_W ivNWa#́;oy\ 'qg/I{s>bF77T?*C{Ayl'%loe}_> aaڋ_<֪埞(z:<ARQ+I%FF̽ȃfڿӡsݚu_3R ;XOKQ svaPfڣq}W2gʧ-+^M~@z1?ZF5Ov\Dsc߅#N搸ւXy֊-kjۮ[\ASvbX0{V,9cs켡e$f=Hͼ &. #68elaaqPV`/ET8]d%tP8%X0  dMԙO lǨC}X_Ce-xh:D51 In/,k1eYgѣlsވfƘQ t㫯=U /ĵP]cצJN]4O ?ɹcnhTb/}>rc`|r6c9F اKZ|}Eq_pg{48g>>;͏ЫHSsfɳyk⢓좍x>r+rq)e3n,k>͹Z\bc#s?W:oK_hvEZw9¯C h]J\`a۸LbKisrgMlh- îEs'S/qMtQ i8۾-3.=~mC1Mms_ɿ._Cmz/}ߚGs Ⱥ{/< ߅7uWYw!;MXEď~<=n˲obV6n@s9Ejӵ+>.2ֳg1G8QeX'-ff{ok.>'q5ϠtWj1)y$?#np ^Kn9DWo)9+>'nǏƿ};ނƑJ`=?ng 8}o xSYܹ`lO?p s1WESK_߶YSH8:v,c@IX^Ŷ5p36 5 $ d}'xr_#D˚, Lv%Yp],弋 rStKLM_u3yr])e .Eط?~q>.lS,|"c4~h86~lS̥,B>FF)GG֑)Mh[msa6ʿȭK3NCqklE=+%ɺ d/4f*bG7?_|z߷;߷J29E[<_.2he{xoq * &y|/ɾ&xXnew"u!J25(r-AՒ,tMe_S-9c#•zaQ}W"uYy#K/ /s\Ʒ//Nbd/磍>z&1F:hMz\8mqk.9^59pAF\v~D7WťFe>&Nj:r<8cȱ9LuJIc w1`q9n4nzgh8wl9.hcK~g[Z^_Z_SG!6̈YS@[6E+ZP`p۹oԺ_M9_huS>ßKA RB-G%^ECej?צ Vqiq<$c-Ɨ7!_ق4 Kkzz) O{Ue5.‰l9귝K"[m3;)9\#N[sJ}{'ئ܋X4ѵ}-yPs|'vn&>iXD|t6Ic3[ |u*.%@q}/i79%O,q66 S9wd4"o?T_ DcWD Ey-M ʅ0sl<}4摱],uX kl/<9$PW ܇#: Z⹋?[4<%u>"9VTؑZohk> &Ug{XL<֥pchxr1ANnh;?>Kt1Nt9R.6}_bffw615% Ø~)L㶙c*m_\\@ k۵8 5I_ke[?ަ1t?Nysmk?mؠ͝?/dUC^9^]?d ϹfvoY:S_f+wof<~WD>m~'V+dξo6W^jw[ϵq.?\iBSX7 RF3\3k4AҠ vՃ~5nW-vdg(,Lc$5ר?8DVED&99?8b-zepNIb r_}WW L-|䙘yƛij>0ƚ e/ձl;Q3!$Á⌇I3ۑwCtbssj+ciJ)c͇?-u-| _%暜9Z#ߵu?eKLor㡠USZ z/_ԽPu|bvz);Yv泐^%* ɰ5j⟹VtbusjmOé%ߗ?={/KgZpzhwT0֓Z˸.#*?}ρ_;m|m"4wK%7_ݮ:"Vv9ή?8D1&Lbx{ȾĿ5?7Y >|.ޞw-?t*rq+ꤙ2O^-&6ok]|x/7|UnxHaM9 4^,~}O]nڜn[ku{q<4oȇ!)o=/(75M_Dn~] M]0YpѾ"3Q+K1f-QUI%?I UJ 6I,AʾO8& Y^wI8&xݔC(?2>PR)6Q}< ;!"=AWؗ'rlYOL?|C'i]l'*tRLb\M- n.'+1~ 5&)Yv/~bc\xOQT.k+ɣ1d)?R`xʃ=m$ٛ]e-΋qKSWU!;] 5|.1u,^7s9tX+')MuK㈭`1׍~ EߠWG8Fsܔvio?<&n,ȹM|Ւ(kM7Mׇ'[cp=۸4x[A6ZgQ؄͂csпELbcv+-1w\eֱt O暘\-g= WWK,HB0l劷W_Ÿ>~>޲1".7[NvJgj.r9ò=:lm_0)dո̃Exsn _,ӇoOأzCl[\gƆ6TjI-$T)<+V: ?S$93H$% ¼ &pίqYM4q~AfOew 2&&5?Z,uۮ`̷!1k">X2J0lܾjvjY/]cšE>M['f 7_C3e5_WAcm]7pÁ MS V[g!*R$s;e|u6[O(wƸbl_?l/h\u>*hn%>_H{Ϙ%{3ci'_h7y+e +o?DϹR_)5bc=82<6 ނc7[.:®Tw;}s&GgsB\NNVsku Br`T}3ٶkMGlk[RX.ڥtz(#n4s{bSP[pxE(ldQ^5K3W!S̗9'ז1#.$FJ|~.!kY/5k3Sε)5UOv{-Ww1.5ΉuЉ&4x<\KL\.J͘~]#9yb?jzY/)11kjfщ8߮[+aɄ)|7? C$mΘQe d.J+k^)%x-e`{Mܕk-5kkK qfqS\}N^9uӸrSHSXkc5p&F5gb P0 6ζ61!s2Wcsu-Rw.G^ԁP$[G͵KlYSO3p=8taPW3>͸Fߜf+ZJRSx;>6:+?srR+5z*= 3~ݩ:kn?zg_l 9K|SjMطp+6uy /4eRMbPJd%LUeN|omԂq_1$.ЋҿDZY`ŽuZ$^cش[k{w#jY`LI,窧xbѬ 57/3ǫƍqbtпCvXT,찑EX)E=XՂu:j ~ymwC Nڜwƌ1ukg?Vqe{ M/>jbi8l]]Q?\V;, `nqӜsC7kv<TM&&m~Z9w+:)Y/֊e\c& w1|b*eq8 {ܴÅ kZy_Rs(V$,0 ΁TmjTǸ]{ 0bɛFW9Uqm&]3{߅g\Im#:-uɧmOçyW}'9q '[n/껣Gg{ wb}4YT08XVY1Zp!$,vMZ"$]JX(J݂GȘ9&Pd5AűKk1]ҥvm$嶙'xg?iٴ2vs\٬Ʒ䪨uI*&U4I?]ἌG֕@v;kM?Nu{f퉁m4_Xw3r?v'KdCƲEnY26rܧ~z;R!efkN[_^ҞM8;"Nߚ';QQlm'?l[{oE6ԩŢal{mSdmS?^?wlwӺ''ϫ5͝f)׹A|]CL9<|̯xЏ[~㟩hjԫN=/(|i[OV\ל g=<3{?_rҫ+vӯ?uě_ir1r_rƟm^('bwscֵƙsXo[LoQG|l]|vyOdwump|uŶ1v}(m8aXuyR{ ~U!; Ww9s}{?H d8e*x0*t!kA9SqqI4/[Q~glɹӻ|?þ jnjwܤMA_ݽ%쌍KomR<5& FWl}1ِ~k#9n(O%F$J6i\'i?sHCM^\xF :v:b#c5TGNطgƗxdTMre(^Nj?DbDž6Ǟl3i1]KfelT'wbݫ|Di=YKl_\ߺ~̈~.˻=)t|Sߜoҷ[?ttp"ܟy;bш17ͥ9@\B?PC>em4.m_41v*8/#*]o߬9ƫ?F./)WܛtoSfKî>-Ω^7?w/Ǡ˜ ighM΋_˂cϽ >bWkih ?H?}›֤Y dACy~nLAř=H1ܗ P``.'mFEA]Gn7B K~w9aVYׂ]&p͖ %y`'i?G_6׿xݫ#ܲݮcޤ ˔z5׫ӭű]xDɡ즄v&>(;IO%ljbߪ3\[I˞.;}9oT=-$3?C _YS-';ls~Q=\9)cEVyLujba^feKKy>H_|]Pz|cZ0m]}G SB9!7W!O>1YK&l7m9o|%Лڶy!8F}uՔ5+OZ/^k >ĿK-ukzSkTYo ?.Xo>l|X0-QݽZMqߒޛnޠ:_06IgUֺ2^l"g4 hsX~֤5jN;sqĿW_Hfp4U7aA\̓oZ3 2o3@Գnrzߴ\i[aw~q>&|#`)C)9xOvdX<-DncjĿ.y#O~~YMytTnuΓO5ULJnތ2 ZL\C0G,Qǀm9/x[*.Ĺ!yrt_QvӍKK(oڔ9?Z8 1B˷Jaܿ;lR%瘿Ē` _?ט*w b}ޚA/x\6Hl:e/<9ΪJ &)?In hE ЋOprf!4M%q+Ԣ(թ2fi"rr54S` !k2$32Gf+13[m&doV7$󟏧)>,BD8_f}=zPR7k4űUYg6)XO~=K,ع3DT@vƑ5-kWʅY 2>^q!g`?ZY[ͺƓx6Ցswb8*Dc6f\tۿ[O{nVUrM\?c'|4x9I^_N~7yJ\i>h $%VbnϹmc~]N#똱Hl9.}5cl=\ e#fcC˹SqD{|_ht1.vXW1kFo/x{Ϙao[G6/:Rzcvp;=O_a]]chCL}7)`_Kl/}xf-ǜ%F6;03{ d\qsi8\=.ǽ-:5u,l ?&>a #_1~ ٚ#Qm?sIf1D=q%3%w{ĿZMj_}W!sFU]ߐ}M77ͥXk_&kp#sJowݧe6Y~{o?8`[c.?9 ǺPw뿭Л>S&PP@nrZ]U݅c&FcLfog]N$7ی<>8sx;8UY |+_5,yMxݙux_cCѝ>Yx/fZ)>; R7@;1#N(.D]!( ŀi^Xy"\,rb}9&HPn[ 56.XX4 'Ir5s &4n.H cD;:`A&mI(@$h ~9v bgl " s ވ$%I259wn&4Y+y2ȮaM |I 2=ՋGM^iN5k?cC Uu"ϴ9p8k>U]b3Ė5`'1^bDK_l"*on6SD*#R.1w ƶ\>E䔉WؚS\|ZTxp∺9Rr!20|>\\}Z\ ݅LQ/\w8' AR%c*b0sў+Z귋3~CѮ ^W_dncM3F\sӭ1_?"/Q;Zߦu<ܰnoLWvlU(*`|qYko\,P/: ~ eU5r ĥK;2b%sXMzI%(ƅ7zP6I` OyS[zcV^Aʳ5r}ZY_)?FIݺ\mOgV]eΞ/\0q>n&MS7f͚ϋ:W\$F2^^dlY: '];zn/ִ7ko8ԭKzl9w.,ǡ}.rn>+mq_w:ށHKXSos2!6϶NI\ןg7 ~gX%|s vfb2:&ěǻ~?ϩ٧Ԑ{oƿzK4qHώwMɷ9>?uYHCsຸ*l5O%=+۝8CCzIm'7͝o8.&9Kn6ᰅ7:J7}ɘKZwopmwM.c;sn{CA˘.S^q_'[߆}79{*a tCxF~w1r-c9'>U7>~B9\G?y9ae Ke+)|hi_⟎$"bvװv[|,wՔeg߽ "o|a?s+߮T:ނxPeh}6WjCyǚKlr=oy1nXbMmrG$=GEy,tn>M4|$hCᓩmV^l7ߎlKOtZB%,&InÍeKpJslѩ ~3nbetɟzyxju#vf+CTc58=.@dOĦ<g-v1N9sS8uipS^50eڹ&ȻSsc?X%zi0.2Vq}Ӂ9y-ֹfWލWJQ&͖ފ#_ya_߀vm8F7j ,'FCC׹f+lL)K/O;AJc"B IaH[H?lBзG7&/4%SX#Go8.Zsǽs3c'8sۀq267ϗjk>/ز.X)^kVc [֍RD%<&1̦W]S .1P?p'tM;mo>?98ǵm*. 1>~o9Y:^NS8R95z._tVRv2\̃ O_)7e[qafFD<ou?;~?=c\/f4ڥKɮ$8S5>Jo\q0̾K?pLi_1Ĕ5.g)?_/nmtr A(#֓X]nN' f.8*$!8U֠9b}O0Zp'),OYb%byǗ~OByDJ^L.iۙ\8ͧ~z׿u'V5'&Ҝ/~bQYoӯ& IlE$/;13eOa^N*h)4.zÿIs~=7{)Qy[yj_moYTt,3I@Y~rBmA4eӹo3kr 2c#'}?J>k8`w?|`hJۋV`[/8/|aF*W֣]CbWtPf91k-"s]rj3i$.>->L+#eE%o 8,|=2WۦS[R%1.-hYӍKc^ystOZmQfצ;xXrḲo=?ŧjc/Υ>^c-,yn9:\rTS:)g89VwMok܆`rߋYj2[L|HO'$PO!TK k^O%y<9F[ w?+$gI+cW.g/[W~h^Zt8-ܝCF.n_Hȡz!.-{<3׵8wssOU|v,C@"5e3um3&mס۬IYN&E߅8ɂW?+k&~}c.&&?uLOc員A=sS;X! N6]eH/#B5 |oa='F#&x1\X7 ]ZulոcR\-ܧ Jޢ<: f%`U)ԧI97pM8΂EC6|Q"r[͞GszCۏr|s;?d|fF>F|ʡv|dvzkv1]/zBF@~Cb/q?Z|͈~ͮoj붚tVy eM!5 ZүY3Z5N] go#ָ?2 5_pzm`~P>72yu3{Ĉbܚψuo?Ws>icZkd]Iy̋QN7hĥ__2_F<51|͜v7V}}z52+zGG.UC$_˼So#>R>[ qVg0&<#lE:3?lf^m3Ƒ ᾼM\4O AJfQ?Q7w}*OAvBZh6MLĘkR/^пC7էcӞM|Pe]G׭$N7:uE-uX 1"g ir,Eyk bF g?_߂.ڙ97eH($_7曚`VmCCM(;wزj[CL c_&&6+1T{>]mCd9py֥ʝ]OˣC)Cb\|e83?]kV/FEssn15ЙOVT}n{W`blzs ];Yh;g_coߣk&XF/γ[koYXW΃SZXraw.ȗY\7~`8kѯxKyx?>,L+mwCet:YS M|ŵ2'J/\WMZ'i-d}R|$F4q *hukva+djGs TRyܬ^p4\[|)Ϭ5WȪ/~;f~@Fǩ&Ik"xr`]bJ5qNjBм)>\[4}@^ |mttYK1I[[̹/^kY|vvjI,MVRO#ͤRfL1_7}c[μamClʰ#E.$?u{M*6QnrgE5N~GMC㗘cqWko߬%Wbs&:m&a.s%8\o_Gݰ}Ǽ9kr bDb4?1CcA؊^1n{-am*IP0--Z{$\(mSv[8RgIAN+_*1YM!^j k =:>?kꑸm숋 N?lCs(ޞ{wdS~ԩk' #5G\R*˸ч ME =W嚊-\A^ښ)Q y 7Lo GGaNFoCǓuoO6lwXhݛqd͕ч3FWSfwgΌ?mpByKlSR:yŝvuZZG8;$!c汬up{ˆ`EKt2t-q/Tie[ydr}ޟ`6L޻B]X$/!N苑ip_|_1u下EXh-Ĩ~# 5`YW Id~6/=+TfID95l=iLXm^ޭm]Hܗ(1Ҙ,XwǒBjW@BP!zD,TnomëR^7z?XL"K;,B.C֋c|pzv7 ʱuSFJ]M5bN_0_qwr.n/Ǻ~"r v3曵LGhwV KSאe|w,Y⿱_uJy9M7$\TiLC/;{4x݅?_c2^-;=xD߿wo^Ty??׍RgǛc{u騝.>(}zUnagSr!qaV?1We<_ӆR U=|1K)6u9=(kP[޵jqQr>) ȟ3|ߞqIcq[7-.mͧ᏶~)?CnL?'.̬?sU|7sv@w?&3{c\sCZu1!bS xU OBDQl<Awr], <~#q@!0%KSbD0$mI!r!\MeS[KEUF@~lV6|7tBLٚ"(lPe"viR&! >0[W m r%sWRElEr'|w hZsJ4ʕc1jww:S&ǦPCLݛiЧ'Ńv8JuO|fE=z-$EqiW;7˨ qи_໫<^WMvT Y ށG"_{`v؟n-m5\.։Ukk50_ۥ#=s+2i>S]a^ \{KO}Y.&OR˴xS-7̕_>=gS-|M>Z_l}s4Py)(49XL]ǹ{ ZBݥ[Qt >c-˟n^|BQSxIٵ|ex;EƆWx@[Ŀk}1kq~д8yzovޝLdv),kGC xSAou;ƅ}!3L8~Oro伐;_f|NR?8??"O9xO[4wĄ[MoǼ^^n' N29G;+Oܞ~ \ְM+droWm -wSVԳz?Ŀ7nJݤ>LTA Bn1Cd֢e_=uN/~Ko! qDBz V kV+u?Wc5>;Tތy\k/U̬Ib(Gw>R!X`Ϻ9/FmWW6O oϩDÏ>5c:I1K}I\Ok//Dh.N+P:vBluB*.f/2n>:\/&7OϺd'>/ݱR~8ޛ_".(_2Ij$>esKry]l:0ѱȷ. J)ǽP"e^"J?b׆ioY࣬QW̙= ?z'o 103פ]/i?;!ZHq/7*)C8q._rs5`u_9|Od*Oi&o/}7of?2v[x?:ڭh{փ2VkQ΅o'6_b8c7W }oŞhld J+nmũӞ7?3N~O[S:/3oZZ=f/Sʝטvzm'_nkBj>l/>\;M !M>KQ>f-հңC&цcz b˖s1;dX-FZ?ex%NM7|nMǯ9>v>}!aX0|L Ncs3+wp9>@2R,u fH<|jQCyGv8!)?E%'Z5>/s% 9kkIH7-ԥD)u@NSOEQc|[rjsm P!vo Wb66;l`[t>u^Z_xܥ/8%G 2=ǰ`H~$q6.o7/\s(vjj~|n-"V񟇥 GSf#5[ķv>>oV1q*kd yU|v)D "'$g?f.֍:8@͖{?m[y羥 M~{sq{Gg@q{MM'5K̴f]I:b'KGr:ju}p 4zbdۍs\>W}USGO<HQ!*ps.~2X! zZξO&o IKL釸k:r f+8RYmzL9onI%!Zgw/Z3Nu ˬy֝85"K]^ @V7/vlT!(c EwM5}xtJƅiYr l|.˺3gv2}a0Ư-ǿ|ى[,*> ,Lqvm~90NNj>f!կ;s>e{G)%]E_:\mOf5Qidͧ)ץ#g28Q;>_^k~?oq}kpUW/'Xl9Umť_&[{ɂΧT6buMg vWwWįK m_1{ Ge]5!~A'd-_s$]-=~ԑrt/&5OWtQZ>u~1 bMu?1 Uq`9X ŪY=I #<ح4&1/rG9p^$z19MuuR9-M\CyS.9cxr),z[>s58_~1~qy=Aod\q+ v,1[ØBY0V4R7%PÖvښyF]z?G"?-'*/]3^y̺3͘R_@ı\ 3$qoN[ToBrB2ԵQOn/G9 a{gk?cmx>EC5zߚMHh#&Vu{`2ke.kj`1G)#yتR dh|oM?/ǴSS/9a $_jr>ױ*K =l[suO. u)yٕb6̼O?*c\. xWayfv7Xfc ~X]Lշ|x/<„/I5g\ujMrd;X%=͞*ceSf!.=̂x̢_\b""z8Kk%FO?t'o/S]?wmZt!Y*f:.?svk#OKƜK\{&<>5/15أߩP55|ުs!w~_2Vނ`l]|ݺ*g=B>|Q///\GovPeſk 1'_>o{!^[SO `isE!/v9:r WF?xM%ą<~7KxwY[^:{RݹKM?zf5o[=s!'k?loybCYJu_; n0GjG78 6Yisg ZÚ6& 3E9N%/V`O!hL=Ỏ<9 }rIPvt<]3XSJw~\4l}1֎U4Y$h궂Ho^{6;zim{?E_9Lzs"fD#}:zuQbk-yN}ʤk^¿c*QXu@N7?dFu #|> wY]632!`PƆk3}֒1mWm'u!UzA  )Gٔy5(B?/֣ ~SO`bO|ֈb.8X˚ mƽcEb->!u<&y@k)}F~Y4~n"/VV{7k伌3Em764Vdx%YV.kϹ Q?כÿ=Ǽ&z7mʿg@y+NB -qo~8u-58}ԙN.K8䧨{[O[s!rs Xzw12~?ͮWIJ"gV1loM^m͐~9im9\_kcmSJ5?pUrBVϺre>ĿrAzt‚10q^0zS!gW>fm5yO;|lFAiۻquuPUxYſt]~v_h=q^*.ckTK ޜ(ߪ9}^uwc߂m_mhW?K?ÿg6T'СaCEX ּ Gf`E4)&h&(B ?#B b;6J]zXRHʍh:u@о;db(@S935vʌJanƍZ81|ŻWsSCqBR1wAF^AkEOԻ~lſ3n̉q @M ̒{fI:0&t%wyEk5q}W9?Q-CYo{5m0-?k5\XN O߹q0~O??]_?sO:13{zǻZ&8mJyE~d5NRfERSsrR2_OxlܟDNnYܐZO1N;I}(՗2vkS꨹.$qcQ'Ob^%槮a fW]-B.[bYz6 V!d./ s㜸*Xkڡ9_ks%.@ 4[.D'CR:9]KƲpen⿋/b9mEk{_G/E[Dl⨘a?.X''Ok-Q))SlWZ_;sO w9V[M,czRX~C-qgޏX֢NkN=.Pj-KKy)-:E_uFUa#Ϙv&槏 1[Q7g.:tD]NV{? MI8XQw_SwtNbǂ!kIn9~Γ1WySWAQ6?+I7P 9R̝C1qxE?X[gk7{QY_ɱZ2~)3\??_rw`&7̭s&E1{wN\zY慭}Ba{;VY]\G]r_X_51"t݆rrOtkcƻ17UQy󊆹q1 ϥ0E{9/kfΨ> V'%[_K;uS?L3~eu6= Y{lcH=ǩZ\xlQ9jzM񬙥G6k8#e.}ߖCGM߹n,JHRt/b+O{ٞg}쏈k5<|+[:%{8?1+Ƥ컿#kt qsakkxTqr'Nh@qKBHz&y9)F3ӴP̙`H(%%^ :=v_y($k[<r'׊vףաm G&>6!2X7Ja? iU}_-؃JFn)N5HjӬqÆ4R{mz瓐1̩'RrYKbb-3YzS7e[_C^ A=9(w|1|M;Gִ:w Cc_[bgkMӧW97fgj%3O۬41H3 S]c备uHOSEm,5<>9?cʘrѸޙY꙯uUs4>1-4cpD]Rނu^/;}}R浮&+';^ sO87?=y_Oy?Obnl/y:YƏ|o2vWyx?mq_>[]̝fZZRcWGaSo<1A^bafr!+OG 'sh\Ϳ>1O ˜YC}3sZa ql} SgdH{0sP:Z2|i+Vlÿ̭P7{OCe+/,Gg.jnПۖWoQ>o)15Ѩre#S_%vsJ?8X]}8=Ϲ?}eQ g|9adOگtSo-i^Yq{*;hn`͹%wzjt7_ҼX?)꾉[z49'qŬ&ot_8tZu/\ yT?Λƍ8؟KБY|Ć谋gdL/k7cS7f ,i/5N=XaWLLrW$/B'W.s0\uY= D"ϻMURfA])gکKTL ?/`=qH2NdBTPBC] ʧ~_|;8Q4ìfN!Rn[T7l z~ɁC6םIڎ~YhNւ`8E1Omu}XiO-TQ{9*0yGŖ%d-6!vus?}1]hJ[tQm}Vhls=C9]Fm֙'u-9}_?} ] Ec {%["oF3pO %V5;c=]jYSԫF_2OŎn;;l5~̮N??C)OO~߅l.9AI(u?zMp ]n?%>wM>S)S] OM9E<\tIEm9*xȘdjLr|[Cj֎q>oj|{0v]Ŀ1m=Gn/j/sKƚ0OC?dz-s1o~> _*gᛖ纊}m/=( ˺)+Q2t 7/}H-iKZgo^ Xnvɢ.uv{o>D7Ưe%f;u ͞6WqMAk -~"ȼq}bXjpk,k9#ۀl@ qdM_uak)V&zYc VXD0I&@z.qO (t)8;vhP&ϱ6ێQ#?۝P_KF,c fCM\O9 8sbw3}/ |ɂ$Vcf.:֛뷰 ѴZ|ԃ+)k_pߴA9̿`E]Jg.y%9wF% i|gužNiCJFK6>7-7WQ#,[{kۻ6Sf/9@= tR-K_/]M9D,15Tx7kVI1^_t)ߛ^rMX{(G񯪪l-g?UX\&VR5 ČU4.'+>jN~Ч &3;8nNlG7)_Eylquxm2HS|ǶjkDUm?,_?{߿K?Wa^]EDβ{ּV5/&o3[?G)7.~ ;x%{5gqpǡ7.V_K}Yz9_n֦v(ǂ.WD .\3hxm'5 ˁjktPCd2ܽ]ߤK8lO8qrs)]~3Y˟y\g!=3D_]f?c ?貙rsgSٞrqMuuPr%PN`I }G_]`.NKCƛkϪE(~c'1nwCQc˞lSw]KOG Uu/zzm"_"{ԉXgW:DRa5%5w5k]L̘_'6[j/DsӧudwC̳z6Zdhfm3~2%~Egnz088n0~}lwh=7MښcܒL bqDgY819Q)5Iۄ39 Bl6:_g_ZNw:RKovC]g9ԙFZ߯ U3{SX}\e>Vʁniҋx?48nT*ͤgUOGQ~bnMO?m؛9 KIկoKZ:ѱ4YLj9o^_ib?<}PݝNe3/IzV`![aH=蜷_dپh1׆Րm1j3Gi D7֜E|RZ3:{q>}w~_W V+5Λsu]"@p&];,_5Ԟݖc>ڱK\qv,r;dl0a̮}ߏW4O'bcc$[ UtFҶKzPFCiROpYCg7EEtO js[0GhW͢m61 C?,jl]G&i 8ؘf2. WLYcݧ/ŸBo$7\)3%gw,358M1E WNɜ`J/G.1|oxϻ-ſD'Qa7u!TǺ/q|)xL?잽c?6`NfiSll5& LŹI0WZ o?ǯ3{!YqU黩g)ն1Of=g]j5t^c-solr}O)uO{~vz}-j1 z-u7Enף= } 5 yQҸhp%;NGߟy\t[Y8͋m3߽~[Y:ow-7{7͞?O,HzOR߸m?upE>mLGWX?uPC=ӟf|y>jd~~^=nNdzZt.kd9 %8b-gS̻;*>ȳK6P̿h_[62A6GPgs!`֬QA rd}6CG`r %t2@hؑ.akܐկ"4Lfݯ:ܹkk:Acuxd(GGon[2if g5N _5(;:{s/._nu2fsYm1KNJsO꘵ N9t6_$}=~w/ |/:I)njCgYt\Mz/X~tsfo,ߧ Ӭnoa?Ƅ0N̖^MSw^\Ὺ϶ /e:9ԣfY.^{ow9ɟﳍc'ݨm">mr2WO~9ε5if+gh1ſٞѶbaծ%Ӿt7{ Gf:.5iۚq1,kPs~Xp.E]tn]2g^(N9@,JASUƶ'†Ϩd_ ]vm?<4WF.O Ou>?7bNbL7rZu?}uĐ⇉Cرd Me\Pf,o?~-_r[ b!XD\kYGk):x6Mu#+6%NGK~i~94OU8G4/O_/r uSt'Wּ k0W?r[u[5F9O[ekO|:1sQ.kz/j6ʗf}=Nq8*e͍^P)s҅Nmɋ'&c!?o .&Uk&sUP#V͗ 75xha  Q#Z?3.jߋPQ4VX Ǹq /wl&If FQIU`$P%) qmcH$g'='ǒ|CI )#,q}Ox_9ƽT?9in3dn.￞0Ne,z %ET6XV_gk.7eb~1w $XE>hj.c/s XG8hl,KsNv^t\Xc.QHQŒ)M{k {9I&8|Ы9>%n6vl!͘'P'N& 8pޑN%G̞~P[32^.v6W@ss۹ۀȖmotԓ@P.2&ʐu؏cYWCw^fIթ8[ߘDZ(''P ]̶Tjj8o*w.nɺ9g\k [<7]>wRJc\ 9c?՚Ǘ pj^rXe܅XzY7ѱ*Jş_7M4q9ME_b%㙻|L?r_ƅmzb~Le^։. eh/Mf3umky8Mc D_]j>te66.6Mܱ= f׵S<cR#5l?rbGiQ{ġ?WSYcK~ڹY;7t.ܹ?] Ϻ2kuNC-G 71웯f wxQ/=:9^uq{OƜ&Zbgmvr=bY,ئsx}\l+Mev?\#oR*#) X kּLJ2)u9O  lq6iuFLmIOMRf)i6ިփjMx(P_|_Tǯ^ qlۻndI:UCuyW0@#[7Y6n՗w/k=ˎ(t~| ]/:_}lXl煣 :;U+:OwHWssIګ;$x"=_jyu5.d 7^O:NOxu(eIG[#eQ /,5ndl/ kP1;dt ֹ趐yԩsZE)c?I sKkG |%_v6~4|?q]|z-jZep>i_WS>yLֲ>kQȕ@?1Nfs N{#Bs)3OQߛ̵t 8qk(r^L?)(En=u |!W!ޔ+8}t{$vs#Xblm/f`B\c)Oujux0 Ů ͮﷵ2n-}wۖ75\So_ԕǭUuw[Wb]zyW~%z Gəo;y֙N7$ 1#:Y?dZjfZ?m𯂏9?cJ$F"GE/. ek qܗcPe~1+ّbgBS[mdO[[ 9λGy׬(8uPK1G/;W_}5BpwZ^@Lb "kʍ-_s>A[}b4 =}]w)ԙf; WrſwOQ[/ل~wDm>%˫Oh!j"ru:hty]l9]744/296ji;ָmd>Aǟ`-htPw>Y ϰzoGo|L侐oV~]R0@νlZj'e[dɱ%ef}]> % ans|WouxqqKך<1Gvmֽ2Ǘ 3K_t;)w~|?{'e2L@Wf_1Qi3p/T?u7p??˺w{SbKϋf:~хR7u?uq>O7h/WM o!{*ǂXz]lam?s/ؠk[9+k κzEK$ azR-f| d!gǿ؛¨$M(PFb} vesY4s~TBM@K`L{Hwt̢0 k ~Ct_":~E9<|6ƣ4$iK./ps%ݱ%ߘҼr0L2b\ sߦ fA{_7"sR-j`z_kJR-Ɛt ;~V@kWTWJ0Uǝ_50)sîik}sF-+5֬}o0}{?oۗB!d*DPOqf8-!~j+'XnB ;[~TGf2ylġ2w}vVkwlks'$PT9 ܕ9|`)zu =ސ!j~ %֖Ǘь8[ws'rYT[bE/qJEomڛ`*.|rQ[\+ls@uc[Hl9ZڎIReQ{ |{ۗB"j_Zn(M_=Ŀ.pa;빔P>vϴ7?5O?-5VL[N?.Mf)|ys5_xw6Y;,I-C~مcf="oǷYq˚nţf'h8uz!V>[t=e56/acv *Z 7;c\ dPC^z:m `>xGG[MyYoO"?g Iz#bb&g/k*^rc<@{?<;g\_ߎ[9?vCd9o&TۖV#zÿQ[4;n{sBA .$>/1/'t9uoo"ZwDE:iݖP7~WےoR@4sE*P|>ZX%%bCd^;bbp5?<<do= Da; LLkdm#_wnu9ѭ)q )8ovv =Jd?$cFVV!ݼ2ݜ׻#'ZĩYIkȍn;1jw}q/DNl]?+YSzVikl'. ӊU Ɗ Hu/w_)arŁ5cosSu؉ݚNް#3'ܗGbKDkZt|/Tԟ~bb 柒Мl״nJ[S-fk q\ŠK}b5n|VO;89w_~&K?k|%w_+dgֈYP..WۢݼMn.ygE7Jf-:oxSBv?gZkoL~+5 Q7H[榻}7}1fs|4^U?Q&_~/uzDMRyc ~8%!w-'oH}6p[ k_p:Gaa?:K:s>ΚrSؿ.茡n[՛ \B0Rmpn&kbigf:c1؞L vO3e :Z|wGezN*9#yQpKyZ:SsPSS˵7]hcb]4XOɸ__sO/_o֟[n= ~=~xt<ҝ(d^_LJOB&718т_d꒻so8D?1KQ?qsI[{G'.j2Va Q\kFT3K!zY);᪓1M‘tq䮲:[4yԮDwlbo#,ƹPXJ웺l>cGꫯnSw!IIXc&:/b+7>:,:{LsM}s? Lvѱ_V\˚ o5n^U-csExԦcOnS9T[ڱ9Z~1PN5S֟Xا.򹎝cx-6pQ\2cjWs /EG?syZgk[o}2΂oL'O|4?sرQ+.۸訝skm_gl-u -ٔx]͌[ kVlNf_C,Gb'}}ބÏ]$X3¢[ٟ74gkі\Bԛד>'㋵+5JktXZ#Ԓ'x38Tǩ<6s//:/ mom&y_'_lXaso5ZG?/?u>t|Nݜ9 kװtўUrmLo\xĘ_Y Ie<e]]M֚>ʉorϼy!7n۸ 4,0b*r2.W Fk .ݾhb`qxBz0 Mkjcdbh6.=>>d;xg/ߑMgSOl Xڬ1UPv|pUS6ˍ&|} tNjiߩiT,܆tjjoZȈ ˧? ꏜ!ǜ\>ſ~9#cvzxX[okC!St1s㬷 L;m>n:b)mtY$m33~wz bf5x۹"o/W0:;<;~mTlM7o-.n5<[̢s ee?n-,&هյI1O_ mgSl{[_t"T8*9abŶb̬Jٟu*>rS7#x_kWBP'.1x܋/54m|15bq\kH?]۸2oMy7W>\Cmv76w/sMdtc._dOb[gx.5/hLl>oV#?E^0M_7*OǮO.nv19Kbz/%>^ke<<:?P?#CjT5#Xqf̥8ZƇNJG7??3HLSt`Ȣ/dn,>1(65Fu>׭[o _u. 9ރLTNnf?w th⏹fT"z_d}wzlcm`ԟ $xW$ݶ9yN=ao/ غmx3e7[w.ƥ>4mM) 3.ifD_\?__ȣDӼ{Tlf.[7l?70~A N"9dSg3n 6JKӼ4޵1SA~nSִXQ/ʿזCs7B}Quem~v:sl]w^na^5=qҾSMnlFlqMGcgq_Q?1uB.Dz=*ta"Gq_܀ IݕD1( M;^]xw)/G:ѬOn+:Y.uzt7jo漧v|<ſWYyfg;Ƙm/8n{sxA퐧vM29|ό R΂< ~^;mYzN9aK*eͥEҺ̞jG4_f"r~nWWS} MK>$s%kg^a_W7.l-{wqcU'5gW8vs|/Q۸as>2Ȅ{w[ɥۂ\;MC\ef?p.om T?GY8)cÖSI=aÂçX]mSJ',3 Sơs3"/^`h⿱Cm?{=M2{s^| r 0nc7 k}뫞m\}<-!GL<_~4qRā$#A軥0rV qIcQ`ͥU>*Dp~Wd7 %}I HKjB8Ma]HľQ4Lxd9nw}8rU59}~е-L.(T `ǭrsNOg.CI)0Ѕ `y܀bgTR`Em~m8-h/uʬܡ=ug0_/yQoߤr \1+"o2?Õz< 9hi:'gK[/8*kK:1g'd0|l|K]lPt3fLc-ooKcxu).[&-SD0E,7,:S$zh7ovIR_XKOal}s`yڏ-O )_omR^ZuvKL}S˽rOb!Jn!s\܈圠37C4?e|p`v[O]}*!V?˟L#ϻy7yc|6lJ {?j?y] (_TK)OyC]cʖ3t^#z$WBd){UOsRKk"sO1s&sP$6-5;JO_iRcхYKR?rڜW5lv>Ե,M?u!Q[jg:a߬t8u60zcXu wFԾE.?eeql W_98k-oZķF=rۢpo O|F# 2U֙ʫ]t#u[4\9nk^}l]ž/4g%}cO_m8Rɋ:/׻N娽M $cۯFG7!/ ۢg+?6uQ ߳&(S6S']Om@Sm[|s?vmzJ}[~7=smNߍQ0N+THX3 SOl}4`w x'qZشXiwNFݾ$?o[q;٘:b( .t(b=flPn?/_uY$s~ fr|WLǤwMU @u$gTØa9𼌱{GU_f;I] -`\l21cM=eɬ؀&`X!׮[[-.)NwS wLNJ_njYƋx<?Krv/[J†K56wF<6w8"aLd~@f>+Ԛ/_ڤk@oO_0Sqkq}w҇y,셉*u[8GzB)eɾϹ;f lt#^_R3p~&F{iƆ>ht_}ak=~s+OgD=d_aYodgO/ /O[=ط_Tq#NC߱'u}uC~LRִC>Tunƣ1l1VcϹ dS\hm ?Nd[N.HCx`rEMXKA b zfjA[-Z Zsې5M'@PXby-蒱dui_ފ]>~/GVE? \Vy!r;.&BR^<C(`?oښj0G}8U]/]nZP|.O0h?{?)pG\ߛ2x FFNtrTUy5cLq.s?p,4_Kn?ZVȅ/'G|N;?]O0&.>cw]o=~ ƶ_b=&cLOͬGǸ5ze\DHوꐢ{(FgNjkY0st,~pkĦ_.{|oZW]9EFͨ}tc&XF$_uXm ~=U`rQY e='?־5:ֹءh<ßq[|ĀYm?ƿs(|bPt?֋u\1vh,7{i^qWn4Ҫį꼅9ﮃ/Kvq]Q~Đ׾F7ct.voVk?j[_.ڦ^6~?.rYWUwSb9+Aa?N?YD<~GǶ^4C}7ir7.e?/40m&3'Y%IRG1!z.* nyiv~q6i޻y SYEv3*q-yb< }3;JiſzsIMMrTU*dBtjl&u;v9EO\k㕹=M?>n>w_n@Ld{D7ʹG)TBۭx8jG0?g$Sāș}*5/<^rjKk.B}mJylCMNG.߬~q{SȯRE-3bS?Ĥh{: _=;8B( 6xO΋(W ŏV㬍UO>- R"_6rb9,@̑e4r|TFƺl9hh >U3?a\ ^C.[])c+˹Y'W5o܅.( i񈹫r>솁|zG3['_5K4Mo`'IoXޣNwk&ؚKƫE xkQ] {U 1YK?ٻYk \="ȏm7?k_WGv璮0^q3qlmg.Ӈr_/ lZ{35LmG/Zwɘyaz,5yR53kSr\#'@}E貖0c5drt?w)R1f_l1~Z!cl~v?9]? ?lZY0b7(GG օmسÒ/sSsmS Yy]"R{>CaƞV`@fO&Xq]^O_rTQ>,xS*1}δsϱ׎W_lS hedqtgz/7P.S *S:ʶ* RٵLt_u<-[10 ʂLDA^%K>{ҒgҜعۊk2f6e9E8>k  `yP)oKo0u>K\ | ?OLR[Z8ޛ:E΂__bx!E&~'m򧌅*Z%u.?ſInCYrm&}RZXnmǍ$E&֟":&DT}`gbziVNNuJ>I"r:_A ;^?IxOg{Ԃ5O5p1'ٶ~V&_Mn?ސLx3gf{"'"}w 6Թ_>?̱e7ܡg߀ >+g_ n^:*Nud],^n>WSI}_S޸~2t{[:VOpS3il_^ okf{; Ʌ'4N &;?g~U*e-H|٢b.O;۟6{[5c͍a>lZ8ijrm>497u.vf_ĒmfpMY+WHuv!?,|}' m.@{ SW?ߔyĉ>>GyH(Ҧ %:<8Mdn&׉v 5̶h94P +%A1^ԆJ:t: d"S\L[Pg1)swQ=wz}p|7b9ޫ]_9Nn.Bvz,R 1k YG;K s~ŷ/r+IG[{Φ%<-I?ŽPsK@v9 O>-r֬Xsq] cƎ^¿Դ :~ۗ=~,[ŭeS$ IqIzӘ?EJ}d\a(jO=|?lӓ3}?.}I^j!G)P;b܃\_]1MKLv;?elb[?m 7ha W!io.Km)!ޞ8]ߌVִ gWc$g5;ȋvR~?Wbzfkr9/|7};w_v~^\Uv|u8G/%>cԝG?r;1c7rQc\:-5ʦ!-5\{MV?c1 bbG͘~aPW]a9PӮn3=S›5δSr@}Zkd|@O[מbLs)3vwk݆܄ǔM2/ O]Am:F\S85xilq1nНys{;[c%'fH2a?Ps(+ЭWbb~ -½6D#$(8ڵ & vIqFP7Al3+igF@Ht`7c֬+zxJ 1[ӟtnmc$ %[7>ꥶ;Hw>]^#jJWȵq`9V{ci5r6]uu,bKv_."u$-_[.n699l sl,ʎ|]{K;k>0SF8bj'_wkļIi\1ox|QSݗݜ+~Ν9HMHoͦ&6KNכGv 7&6r(rs?v43!Y/&Jn._K-i0Z]KX3mԎhvc++'AMt-x\e75}r<[k)7moW|5mfoqy>f{6w_/o!`BibۺusM`̃-jElYG;mC7ڵe^!ʣ\wɡw> YM?UO'F?u[v}dYRJ Vpt\7͑k9c9~%'y?qnDϟuPĹX;7w:bf1QU5/o-/p2pG!!f 0Cۦ bfԇFi C_Ef?EF]\#^i3ȳS`<"麉nQ?|;Yb'\C]SosH^]?+7{<$_BU:BÛq<0Or,TFQcy$Ǧ&Q|! F }M8z5C}ZU!ĂJXƵ.ֿھGZ7Ϗo5|5+$#}S࡮]CcsmIwuaLĩC?c;s?-kgħ0r1'04,t-\cZd^G GIܬx> ) ?#pcl8#G0sǨW_? Ƨ~̓?E%VMZ7Kn<#L j-pl1WՒB ;q&]tAI\g8њ1JbIJ0?lusCZz?Kã59_ؖǵeLjyüOZ|Gr}Ŀ'$s9ũ#䐷acºxο{Qqq<΃G{i*{7;5&{ _('mF[f+z.B oS 99dx+\aN-? YkǷU&M6G||链 zGm~z0)e f.>c!wi<?s ;lƾi*c> `m1Ce+{VDYz?n~:s:<ֳ~u>,#:=57I\POuykk yAġ.9Ow- d\c`5GBPpO-}MPQ?!vN^s|@&} b׿/_?xD_ uv_8ۋϩK;C& 6&8sÉGM wPIϧv@[t)!c v[og2!X@-`e24pqM>p,n@XН oLϻo|c ʷd~o1&2Qhu s#n>)q!>-'g 7#O [Oـ^6o'| u =B !8n<>Cd0hY44E;ԥPs|=4GoO\>Bu:څSo>~'yaMg1Ūmbʕ2X>&~Qg \L<_cV?qJatөq+%?d/P=m-֙oq0İ?$:D?q}_+Ŀoz1fW-v;YÉ[s k?8OÊ1g-|??6k}GkO˚AMEmX>v[-/ƵQ ۧ$ s_y -b`#sWv]w],`Uy-3"?K-;?+_CW=c3l܏0+9>R(ӚDTNǶ#\1&V[ŝ2,=aԏ'TlZY9)Ͻ[y~^q erc27/sP ?Muq N5}j>׍GX#Ϯ߸,981V{? μ2j9.sZɅ{je@]eUןl?-8H7{fqac{iy]!b3UYz$ʀ{#QO_=SM}ܻ2;vc6c7Gu9o/ |Qjvcƛx~:=mҤ`Z.lp[R.Xw<_ۯCS P̈́f,'^Mbӄ\7'=qi%b ejוسۖk5>> hĖ 89W M>k5`"l[1F۱IHLsOI~W'CIh; '{_?]ɦa7ug@=hޅ9X2k:/)d+Lk6?eb~fOf򁋂#?b^E !?J sN:tz[͵*jz[;(@YZkfv+g 4m@MOu{]7yV]<bqMx?O៏c/ \t]M$T;~| Z55 u> 4X ? 4/eMy^TB8b[w.;?- h/)[z0ƿ)зOV|\ݍ ɔiz:ļ<# }ћ\q P&'ʄ:L֣_Ė]z \w)Xts99ܿ n{mb=c[__7zIȏŶUY_/|+m՚$q?ʿX]So5^/e.ƿ bXRIy/Q1ypG[ľg&rs Mh*L8tFt],@s(vE52kU^H͡c2/ͻnoCYlÞq&< qE-˂8;΀uYsl+X2G"r6|]08ۓFT7j cԛaSa=X/p?8X.څ"s(/3qM{ ]ͰA*Tk՝(1tnOT6c\m::!O?۹8"ao7{P6Ũr.3~c_?g_s1΋ CQ 'c]cA E~Ɇ Ѱ~6CKo_Oۦ}H2q"zobC3Qw>?3S|7rNS2J8<^WGcmfo10EwѦмD:9GH5пC?]?k Ǥ~s9O|&>Kr 9h1<%`\S_eX3riT?H!+iV?FLcx`?oL- 7ɹǜo'Op^{%Ok'm58ǬZ8\à<@qmwB'v LN /6ƿA1^mx0>46_4.HxG0̊ 7T C?lMߝFLxI愁,5NxJsR?m9X~%N?5ZW¶@]!54l71cv۳?V>9rƳ%XOx~)U1*YAZD%Y#$MGsvS f&Ѭ]`jvǽO{ud|ug=uOC!L^98b6B жKBâd]`rr ЬȖ(v[rQq.iĿr㠋ɔ)}ӴR6TrX [H 6Ĝk<4uO}8ݹev 0!z}?̰j^QTFc<ɶ= 'UuloTeLFfF%|-OrKy+4gx4VrBػ7"~F18^pάbo!ƿmE}9O?ڇ>qѧ#O͝Oν 1ws⁏}sT*ϺnʾDZ Cj?-%_(ϟ`g!O1/!ON?ȓa)lsÿkWiUFQ}fy,,s¿S>mz W2]ȇqK_}HH-sEMX:Ħp@#Na5֧gy9 l)5j['N؇x~%N>㸏eFc?Ɔk=_brtļo.VCkS~}F|S?N?x0%ܢEm9TG-9~N϶qΉ0j }:};'/E}7߬]pJwC'3YŎ1iclbjVAXj?شe-K7fy3.fS"j GE={Qbc%%'vЭ/#`M&S"26%BoO`v1G#&/hRU'8_Yڅ)LEx71d7\uQuiNNyXpk0k zZS Z5|,Jt sH(d y NKD|Z,Dz&܏:]#Új}mc{k3/$-4 Ằ}i:L/;1ƎƠ~J9%ZD{ ƦV86І˟MYGd](? >e;ɀ!c7LUz6m\_q([#lHrFw.)8L h ڧjͳz>t|=NNyo$g6Бci`+n2pNux'1]< /Ӟcׅ2-o/%Lk }cf~ #nܪOp1O9p{bv#6a^[{u?QGs&ogȗ77Au B_h!\CU=S^e%e !d6[FX{^'{=#ĀstCc=U?4$QE8Bmc:mPD4*6e/e M Q*̀S;R:9/r~Q`-oß6y[?Rq#Κ <몞#4=/?`/e gX(\y|vX sLk roҌ Q$~qֲǫʙ!NPG ]#:JO暕v|#Go5:"ovgV/F\?ءx̙q{5ȫR [ ׇ}.'q&{iqH^j=^2η^O3[fvЅ1E/.a3n _f?O?|20_8>5=XRـY=l=~s=~L~_ō&s D1=?_!T{?m[#+1K_`W23n&R^n\Jܕ7?z_i?DH}׈Na쇃y)gxCI^TPxCc'0ՠe5WXWا>#XumO4oNs F9Wl1?}){%~I)o$W৬Xhۿ 4)$wØ9P@aaTlÉImˁC%lI\$AMƅ }~D'܁EҾǷ"׍y :lglѕe~M2D#l6̽^%.\cV.P Ah`qk- & 14*;2CLjUPj9v 9JSr;s%mFzNۧ%銌wP]5{~G߽6bkP ذsD2<ʇ$6aǬ\0 yca~-4p&@e ^@\|ʜq%q.)vW䶲>ݟooyBp+GǤ\)@g`Mf'MX?4亠p]zΠ/nKo&5N?U_o=-ZL31WQ_E7o;ƙgWzkt?.辅6\AOOo,L2A@Juǟi |g>ޣry+yl{Y ƿܜp ZoTNM^W?Lh^bYsqM 뗮+]Oq_7 :}y7?fa]i?s8aO 7n5pXWasfvQX?w ?ڇ=U?AņlWGap|4mg!?$.}O5cFo]R@o֎2L qt^(_bz>np\p;[ qo;h'/m)=q5sn| @9 / \ F(7ތ G,8pp)6g4U l4:яP &M{I~5's'A[7u~ߕ J|tc2i32!7EcFћLZ4Y͗\h]i|8]RO{;X;&R f|^6+Y">^PakkO{'*15`+O~J=D ^Q ]ۏn66\WacֱAى7'ԌAKR GԿ#j ?#[ Hʍ՜C9V9 QΩzHioKIHч YaxB^sA:#D VvVñ݀KDԧoS )ϲ3EL9 q41\[&hxc"'׈Sn4=ojț2iP)?ϘEإ8yC.8l?0%0}{1uJy3a0¿9Zj 84Lkٛp̮ncGd^c #>6, 5ɞk"7lAAf?q-:O,\*r=W\oe=VS9Af]żvcκn lqא2_r >XrU_7;ɎR h <B"@#= ^#G3獒etjd1!c8DŽ84۹f8ⴾ W_=ٯ~x/@2$1~ҫ$Z! 3,,4@ŒɊq*qS!/Cݙck֕mL2.ėW/0&J!eqjQ"('wX|</5y8Gc)XcqQnB*up^Sʙ Wc 58ߠu)x(7JLނ?\?3ύ/a{e˵C0 }6͠dž:/y׾RօmCلOe؉ ;ڐ~p,(_SG52Z h`qBb QG~*M^`q/_`|w[ߒ |mw/Ƈ7c7AP?+~󶰱>h}'4\7?}f𸉾>CP#gVXC0><-}ncelO ??#dF s׽:n2w1=?}s6CFhg a}?6i9G~چ#t|?}.zXi}~j-4C |^'Xn)i4\?/>hff {|OxYrbpjx, qA vr)̀ :Kbυ rL ^P $"ɏ ĿڏM틠ͥ85+.B#_KF Cz,l&e-(c "bɌWp>ai|LFv9UN[3cӐu5le:`dCi[oBgDŽ{`|;]c m,7&SOd_6wBXpiOT e)Ug>֍ˈ!z,)i2Wl{& o݄}\*T8qt<0{-Èv:u0g*.6?'8ֶA(DeD XXl).]aYbV/9"0na> ~f]n+7T:A`)t&K|5Zo^OϲԴ[ߟ}C 3:7\l ?aE49c--8\#EDf #`:"Lj]Oh? Glm-M *Whu}P0:xm6Oo~= ڣ jbzF'X`7&7{ @n3POF162ux'(j^7S=fõŸS])16 beM幉ƿXˊs2w1tz(2X@q6Wq?McǶ E=f?Tb]z}ڃOwv+}8؈ANde\ypuKMu+ `? u=7S, ?31m]?=?b j+߹'/=k21D$c}ߟ}0WCUkלUkPFla'`<ù%foGbyC KPUzǁMBOm 9Ԭ6r>D%.(3IKgpyu$ XbEd$M43 !cgL< O ?,4`keQHL}!,Ӹ} s"V /LmrB<7&L@p} |h̄RxMB~YSquήdmdѱ"o b/%ՐgEɾ3r8? ՍNq.@Xo}{r"v5ďAoڻ& :)M?BL|\ʡ|OADV}3A8 u9ݔ=&oϡذJAbm:'N)W,bX{)/}>1-c9=w΅ 5/:]cN28'qJus:G-m˧9wafCXg]}cskJ:n';'5 9ߺޡD~ CV13ˏ5mTI-:*7{9p {_ڗQx h86*QCax\^y|=.8ſwz[XR X˸_6?m]〽[?DMs@*? ~+5/j vMs?Ay!JWfv9|?qj5.9e5"͊w?fl~;XMk>cFiM7P qlЮr 了Y7vG?1Mq-\O8[߬6¿?3bGHмRQ3Z&_M1[I׃xPkYry.b]gs,TG=>kGui\Ty.&_W]F_P?Nnzc2.~)?n]NǙ#W2 +sjA>=N|'p1HL@4v'Hʛ(Ek)68'AudPDyX\n맄?ooc[ZAlJ\..MYDTu3QFX8 _S홟n`.FǔO"ÿ%q q}S&Ƕ ?͘*ϡVt~ʓ[gsjN+灞*~ !UΡf=w5b'3Lu8mivPޔآL놾 f<{i˟oCVɧPk{P?PXTN85S>Ɉrї6Qs3ǩ~~?Pm{2p.ԕbWJ/sc/#eNS 7Fu:%]MDeQP7YboX&i' 5ZcqqE (./+yl=1~O)I'stN4z %.68S"'SLbP %ZOf탳 0&HcyV'?7 j 47^1Өl*?6c:PbV ۨ07?0WZ>bjmQ+ڍlsƤޟ?1y q0vɯKF{/ ϚCwq@UEms8qrj]p]9G>B󄿟- "uN#D6?f&?Mi eZ7t?#&z`~ 7LT XtIc}آ[?s9akx\~Dc;@^u9.5O?fknr1G>Y!S^Gh?!}89?!?k/[Owev? +{nÿS1r 4B@AxN dd3 (3kO{a `2aFl:nPS#liLsS+{ǐVzoⷿXu!]<(`frۣjڄIFg ~G)qX}qZ8GJ &nzX)-ǭ٤x_x~ IȟnmJK{-o{| D9`&ICcƪmEs5P'"U"S,a)*rFSm MٽHW_}|Ss8,b>UHVi:,9OOb`?B-0mXx,AkoP_C:+ˁǎ'cC)\׫-(OM18PQ{RgWx=/-&ԝukv!Fr.P6(զKO:JN˟sdL5 ))y?H&Ǔ:011ЋEiaSSl3FrEۖgk= sS\O5>'CoFV[8;M`?y@v#li)Q5lcpΩFOn#0F~1^Ru셐-PW>l[@{|K։yZz;)KO߮z o+oV;߀O2c^[A=8mou8A`Lqf :qϱTԷM`P){d>6/yLz_!/R̰vpCn('DZM߮om=pgSp 7?k><\gdžeRӛ4J#_p3(zs:^"QӘ)Po`vt!tq<ϱ}pe޴F{M O6b!రb@T~f/կ~^RKԃ`I!~NUkD``WpS@,x+ʢ_'9[Ċm>2X8XzUrv}LD/԰P@obl݌Ą$"C}I<$kV=?i|"A8KBB PKQRF!_zX)ui^!&։yyzU ji=xu} |8 l{Hg຦O׶so7V~NMՉެMvqH_uVZ~_}&}|svٔ31%^_>ؑss8d8 _q/Gycy,g2-T&=Llx1;< Föi~F?cRW6q%?g| )ig1zCK)Ά-qQya&?Kоx;7-q'Cv=q="|;sKՅBܑ ԅz95Ay};I\Yd"؀>;\bN: rkh˩x?@"{.ov}/ƍcO:s#z'W;־ԉEA|puci#1/ }';qh<]RmG_%!?b+ w؃UI%s EVcT&Rÿ' F1~5?Ɗb}:!j/0b eO-5q R)ٰ9 co?u?'ݕss$6P]^)&/3Rz$(Уds=A] Ofv((*8+cvT{@|Bд sI϶24d qbpu? r`8L4ԁz`U~~UhG Vso&^3)FyOœ'p-NSԳE~k<؏ }oiO׆NTo-..B,Ƞcj&\Oї86=5>/̇ZۗVc k)[帐L6' Iz.$qu\l-{϶o7g$ܒ8Qy}#(e)SkZ<+]QmqD8a;'/ 6 k52mjOsѯJ>YY^)FBhslSP R f˞bE gky?ovm.tOIL(pwkn1G]C+AǎMbF}#i`Q#)ǛH!oE&7Q?jVNwڌX5A7_FX0.?O6_i)?}Gacq ú:SCK?^#N~#`j9~ f?lo)F5Dd @8~0kAr,O>םc=˚p i=ԃb1mO_$@Ok\?m9oV?` YLyzW ؟jR?>~{16fK~v $2%3~2{nnm!1؄19*o?_n-C|NpUY,rC?l;؆3mfvcvmւ >sKk[%^y7,} ^PJ>B ' fKKw UrdwTcgչIw+$ܸZ>"Vqm_>W jgqK;viO u ˱re^˾SdK {[_3vg1a=e;@D9}S_X٦rss^^1w%Jg>>NE]WbsZg}pn>Nz޲EKqaL/Eg|:11֟a/9_iY_w}ExJΕ-g5NNXv؃MϹշM9N)u2)zLT3?girW&;EQv*'Xv7EC=W6(8rUAXXsTk^Ogkjl7bd3قd+=l?Srg9g,lu^35賜I ^dEsʧc{j:5o1rgy*<U|X@yܔg,jr7<(xqnL٨bL6^jQYǵ`y롥u'-%l)mg<u;zx渲ek:[SvL9=ʘ)pm[|MWLg-k\ MO^AYSOcjꩲ mV EX(?P&DZW5Hq|=3?̳YlTܚjTSUUgZ׫Y6s kǕ}vߣg4ՏIQC=Sz1vowW/r3<^3l҃q=U~Oɶ?5WE+mPI˘x|=2Pk϶sL')պl@ϟ6;A;T_x6b|LؾMكv)>; T&+_xp_?k?SxPvf 89^AJǃ~G4o6y\7 5{''s<@8]͟M͙XԸ:kp&Ԟ>tH7?z[??yv:uְFEvcAOdxũkabnd{ ŻѴ%7xʱkݎ\%Zquיqc TcZRLhKli)1gò=CV 6ؙOHxy<ݨHT??;S=CMQQؓSb-N|b:/^3 Z* 8r]M~ĽϡCmLSްZ6ܟNq^yTՄ?b_x&#s$E 16)kO_3F][o/·F@b{oFӜx2Gzț{}SO(׌jKteJ{tEŘW l?,57p\=+%=Q]c_epԴ9k$cFMCb ymEz|8c6Ci1jM@ ڜ2#)b N|J ׃ח>}иg?lN5WA޸G|r _;[߈5`̷w8?G=x?gYC.1wt<1KMkbc؏~MũO=xOؙ榮coe?~&cyo(<},Ǝ)xߜRNب &Tq4;X3(c A%\٧)6TI׶XO{YT84MuL\kH~蕰3+j4P_ Џ٬~sEB2z)^@Z/֜ۮa"7?0KNT %+EMQ.4—Mp4H<:.M\F y`]#a(?@ w󵎛fdaZ5x]~7XgK!>\yt~JTm90u MG> dk%9MŸBdqBv'$@?#e3?ko5eZ^Mky{mYg?c7~x/q_E*t"r<˸c>"#.uk |(gIKL_Ut]XӆCg`W+DOE#b>4z Zsa~b5Rp1ƸqaT7 FIĿ 6A>:7^w??jArwעEAlof0xoTW8_NlSof_  ˇĸ9EVLQP@P=zL%1 Ũ $84[~lnof_wZM o֛̜~ 7:8цqpZ>P|Ƹrʓ+^Gd0,`Z-"Xsڇ`MTP{4u.X5VV`y qv3">rڇWᠷK Xmډ#c?gV?K㕘a<ʇ2?6n-3k7]zp}|~b\) !NyW9`} rI<8m;֍?6d v?W+Q1a(4syE>~5?:V`օSf&UyL~{5mc/zK<( q |AR8HsVϕuq_*?o1&G[TnL7,o|eĿYb*kpҫa1,=s/_?Z'~|?l]cf1?7k횖0ڽ{('xG.;8vv/~:cKʲ)F{/H<}??J^s{cd':ޯ0)? Q N3Y$$1'^3)VSr5 <2cyc?c78^!1 q-kKNU0?`f 7MF/*-bL lz^]CB=m; #\Oû?,1ǓFP)w|ovEܧ^lA`KYKȉ4 (SЌ¯`S> ߬^ Ky&=:_mg"6ydʡH>&(ȴ pb jzMO7}=Ӆ\@ t"p A[J|ҹ/۟rVN 0A ;~ג/Am6RdԚ@Y|W'煝x ^w%E!+dcK@D~$Cj|Z?crmBT^T䧫\o[8WwdCŚDÇfDOڳSq?XK6= w}5pʿ[w}=O{Z.pyz/fZô5.-܄1 )ꩋjC=jhþ{݉gL`I3OVrFނ1t?G~0.)ՍK3uaq˛eCo 8tOfqQ7?D.؟ .GԇgSd렫^伴 eQ始O :9OT:ƌmg<;H?"bNC dzpy!׾xkS=,],K_Cp|߲| ?aAH.o\hJ-+_ÿvq]^?٠ķ~}}qU1 &:oK5{T~T69ÿq=eMa| ߐyq 9b.>[?1<ؗ1t/OL gmA8_ &{[D_ux o6_(0f>Xw^OMU†5tї0=wʇ 4Bn'>mS:߇xB;@{l;arXi__|=4 IS|CߩC_ix?uo·d=aZzZ"qLrKo& yB2ESРKo.[ա&zO}"?_'BVo 8/.M 9?POf?Y q-05k"b}u"UKOG!fA`A7Cy߲ RE䢦F 6Y '.,S z8Lނ rC_9-cNƣ mY$z- ul!o$Wd| = ٩ R0(щt#9Fِ6SD\ԔvXI38RiȘ>^M9h*?10q &ߝ`CļKƍŀ>j{ v6ݬh6LHlh7^õsAqtZkx7O|؜T]f OУQ<{^{=N*ܬ͈KGZqL Ys`?u(P+XpoS(G?=9m6~d pOURsw8@18^Q{aMPv!qܤzcl"i=R`szz9Gy Xǟ.*1ujN.a?1 ' M}β:$sv?g?4k$5:q0SJVԩuP}nj)O""WoVĐ5{?cE~++7A_\S !\[A?fM4>ao\ͱ=:&"V7BǓC5[ǻZt:i1|xd1Zw'˵'[:Yn]^S ǯN)=VkqqAmL>՟cc3Wnl)?*#O۱קm@{9V$ȁ6?4o'[#s^1>cNlsLL58`K_ƃ>xIIqyYӒ눅}̀X^8S:7EPKpĂ$bӸ6L\TX8K@7;y}͚o~I:P6s%2:}{ߞ*(2mՂACX]5.84W.zYLOe "H#0qIXGs.d߄gֆ5wMڹ 5>Se!!8džeC=-ύ?&z__طSz@pn*\ϝӹ6SxGlz]o? /=DL򍿑OĈ 'diG >U=?3i3 /[1ǜm+ǹv^:tkiv9 RcFjS??_R ASrXssR0nV>`sOil~qCLosk,OJ/oTSQ_S8ǷEa;[߳R5GgRg Ŕ"/e{5sZ0֘W{n-OX|,uĜ cCs/\{]}7QoMm)Ś^D_?n>7 ]YT+NublpD+ԯd4m9~nq+]8ㇶ8mT=@uq [轏Z݈gmz#?֯ Cpc[uxD_M(֍tES-N73`19p 'd?s$ϥ`s ٙ+e cJEɠt) &)?!PlJ1)AO?d_q|}~m|O1gYo$d~{SaFty-,C(yCs,dlAEVzQ>ax19)9DSu$AC0Zl8؏W2pmIV3 MU]#; 2Qs\=^O!+,l= Ēw.J?b_C/::O/R'rRI6Xr?̞uYT&rk_[o?e *^ݘ&0gk`5z?=ؤo6|k(H96oŧ|ss` VQop 6Xv 2~q:.L׆|lsD=~x19L N#:_yMY> /6g1O83g EfɿClC,) d7? 5HĿmeƹ1sGOz_(B٧tP9A~a>%0:_80T$$/-Eo1M?W5괎!~zPru'qݘNe:_m܇tFz˗Ǡ_-hu\'y ylh/`Eiq_/ڂDZ{UןceSPORb/{,ysM@oJ?5Oqsz/&8_'س?zb 5j'G)-+&%r#&Os{uؗ NWeñhZ֯Gs(C;[us2หy=0?L*sX~ɖ}ޟUR %s" 7=7Q v cw**ȓ"l8# 4l_~a9 halm7 ΅|OLczB=cvR07kpss,\S*,`1 eYüA|0(hP0 !V:0y/G<Dh-Gu|LVǬP?B@c8^$>%}gCt)W(Q?J׶n׏cY;,cqs`)뢇:g;gFXBYi~>xVgG[LĶ?ڠ,?^ [C$?.999c{}OcWkFu=LG]60Nq9^ Afwi;F8j}7C0"et8Zio۬?W\{ht{\on꺡=oM ƕrLoyAΝfO:713QkK[&]W7;=s3p;Zx?gs/{n`O99JYU3ySe@M\K{>i" i7 Y+X >C6qɥ&fn<D_Ћ5?zR O)g]󙽏qW1/0!l(]KcI\ouĘsoQR4GnX)68hċcmun[g(_1wʩCܿu߬+j3LCa-]_ b#o3-FT4u8+ "6G)x E'ҒЦƴ)~X/>v6',qs +qpܬ,`^.mj;[r.p˜6^~k9ɧ5lXbL}/c͚OT13k,cK@p)i: bL+_Oh,Br}G7K#^117htz2D=j0WpF'u Ccl => 8XaM if阙M՘W\7 ބSLcob!aO¦r/9c^'&5So{e\1pa܄U?5^P+QO9dx]foE8;? m۔~3}M [qkyX'[Cxn}o ]ɧ\y|sN?ol%L|vn.>ȇ@'uɿE:z yv}(75Huk7o0S˘|w8x 83MW!AB/o?XnE=N‘!xHZ16۴6oJcSf?61ܲqS]8~5[/Tkdb,Ӻֱ|a.ֲyxaF؉ۇxk?^}/MnT8ف yg %U3`T1x^=Ѷu{U ش10Ioy<;@{C&A!FE\ hҘO[:Ppߠ1C ív!mx FR-t+te KGMzsnXqҋbu mޮ,q{C8qCQֱ>X}mK)~7~0c\DSlMM`a=~~m矫Fցyæ y?YagL"#Xܷx6|!/\.q[ivcn*}i Ӈ5Uk->`⚙u9 45Z毲݇OG)> ]9yOtKcN .;yPtbpqέ?a1a1c/s'I6B{]yv hiG Vz%V'Ʀi=|C1 vyAu3r,އR7/5n3Pp Y24ϮvR\/}M{3/<˜ؗg?߬ٞJ?s/ 1'_DĿS_ߪY4C30>&G:1GTۇToC\~c C n_+=~nfvM\R?2uS5. kn$-q5yrpf_ ߣ'1sDy'9h\c}MXCƧ61CQNlmi:G KDLߘg.6$s:X^ߎ1OoeC=9zCn>L<ϹOG=/X mo܌ WW^_]7nK|D K;˶9Ԙ30w*ru^?N?7庄>>~=?m3$ڊ.(.1B밿4v"R9>c}ƿO0@ ^[oCܔPuw '|~$Cߍ>D\0#qX+< e=N|-ɖ7Oz_7gw֊üD=1{4smjTudu_E[9rZ7m3 ~)j-៙/μ6's\pvx?Oi\2ZuudO\{0 f$c7gZz*CJfokN$XvO|3ϛ85}|>c^gpLLTkϰ .{5js?/8Wokikkohc%]rb*.eێc%\cPĶ>cS_|O+S}X?{oš4kїipR@Ʀ86Fj"=Heq /j y/St'׍unT E_ɔlsIA O‱s6*?!qkZW 7=Ηx5,"Pӑ/A6"Teݐо Mn2-H+n6kQИ&r*=)'VyC"M榑S8ԝ\ێ>0YfC=9hg{)'k~1"*١ {j?59Λb( EɌbʣZ8Xx쓬7\aqǘnno`SVDV $zm/5^YֈVԾe 0_А GآFȕŸR&T+2_2x`J|7.8fiG o{Uǎ)}ԥKOn]qqq/ΝnWc~} O:TO>lFoZCl 6IO".]_qMxD6I 1Q~2ݞ5౭vׇ) _Gov}s{_[Gl5?] cj3o7'#1W9< G6 fЯZ:oʽ0q`Lyt8 P?M ڌzr=fmHx]>6?}G{87oGWv͙X7ן[)yu_pT ~sU}WQuSP.Oe_kP/3_/%g?/Rl}eo>-Bf> #jf~αM9P4-Gc?cT OOڜ\;N73_s| E_X'^Yj%.$N4, F󋮓!Hi!B لdwTP}d?n˿'~_UHlPHA>Tvn <.eM6L\9W\Yl:&j667],Xܔt 9g;Yi17gϲK8a1&q|2 6V]lLߟj'f\ ǹ+ЃĈqA&?dܶGQ\us]uvlg~#պ__Nc]:%g6 =?P?fJ3X0U3b:2n«]4d?vtəSauA\߈9E>C>y =k?BF ;4W{RT\Ŀu7e3-(?෭Qkc`T Qkqn>t]zj{ \)?J3usbNa~Snf*NylbCl@^Gum98{_o=Úy#-uz. A\TzqL$ȡ:ޣ.yA&0l~6 e?n>'?O4? C=@LwuZ3^^G7 ̔?:A9f=S* <>mX} Ǹ)Sksa=6Y`_;ae#)Ww-6k?:񊠞Ȳ})Oc*l:p7g^7i-ׄbxkG.nŤ-;o6__}(Cos<9];V}%od[q~7حk!sÖ˵kst0nf| q!9v09ˡЯuI1+/ߪO˚6xIVrCf$gc(p:\ڌ|Cu'%^iXDY7ZKcJ'D;%0N2dPk iB'ߦo<^N)`fTlsN >Ftb[P4'h]HW5#0,ۆ 6=x5pU4a?),h;GZw?Z9WXlǼ7-Σ1}\驳&sؤr>חu*gJ6k֒o~gm9~8IFFs)7DZ0hv΍noz,v?}pf"*{_wc ćj562Q&Ԛʰ/Ys,'Uv2+>q~>nߋZu~غ~ҝpzw'Rf@ºnqcMuוq$yE6\54AoAWy.NڰmV,wo`vyzlob_z409#IݬrXwn$ Ȣs/(XJ @YָMMx~+Mv¢HPYxID%.n!ߥ?MA[TO+9;J{Bk?lu6M4=Gc6CE<5yӌe)pƐݮg"Cr23zil G\gq~>Nu {@M;[WeExukG lsOpy|xP7<~~A<D& K<')~`o3_ŚCP&A㱛ǨGYOq8G8X(p)ua@z".596ۉ5V8mcwĦgOQ:mO^;qfCs=_A$l!0u?^^9d{DiO0vqjs81#x=?rrxDb/G'y8fq;t<Bb=Bnoj=v}}mN+R)=1b`[_{m={Sn[ul+Wsuw㢎C;ab YmOa.?csm2jo6ooQ~hi$Ι>qF8ʏ۰L66/ Lk_}ξsR,ZR4΋J>R_Pr˞q<8F}yj5I=]|)C? S2MwAT 1D bF H&;'\.O pV_G'n5>{QJ!"MrX핱jw :1x9sJ©FucVwFh ꡸ELgCm{SXbb_'^!՘0]a¦MþĿ u=lOcG+[#Λ܅я~?OOl6uukw綡=)!Y.lԈ&١lX5O;~܈{?0Qc<8l[dܛ]pxa޳mj&|(1&KzOm+#jȕzxIWU]=}qLʛzp~?nqƂ?{?UG?ΟxhFeCpL7&LE7{;ghY+?51ڝ핱ogjiL?{*{l۾@erUS? ~(0~e1oAFl1͉ߞFqN\mvx⌗2ͲӂjzrKI Mk~o oЬ4CmA9]| CZWgYu:N8jz : 1> m_ h%.II*_ p|е! 9gG[Aube"1mrBGq'ڀe>mກ~"x#j< F'q(uZu,Ϻ?Y?ck&+.=d޶AFKs?j= I879M5XR8\ڇ+sæGwN^6kVjgaݏVs"%JL!JbFϵu`6uMCW5lk |Db)cf!$7ۋ\Q|al뺏}N }xa|U{(ؾ(&7N?ږ o}k}ӑ ,gg#v*v rOQp̱ 'Hʧb ˓}_Qϧ53 gϺzۏ~d6xI^ f?'S-.u9F 67lzvm\P]}PCscsBz u3Pkr|1gT[7:v3<8ж$4ߦ57 3i,袽d + @FyQM>!"@./\mܐڅoݐ9o3w~=Vps ,\YL Z!h{81Zj!b [Gd!Y$~Okc<ڍ~F^pX,R. 4 V PxD=VטsU7i:&r%o[t&Gy^JcqrÅڤ(:5R6upS7ڈ(Z{^SPBtR@֗0UpeUq} ʝBLv FF{cltǓq\[c#,x.Gl^ Qx=35̳gWdMH[{Uy 8͚0Ҳm><رG!d6%Vsr}A cA^3?{߿? |TIFkr1goiOPjI.".}qR)χI5s9:av{l2)(y'?u1nXiOu ugY[~xwĿ]lhl9<fvZp;$G&}3k7 u<\c߬Zb@ϿZN8 Kb\_t[Fִ.R4l-ٚ>+O< CD[_9UfŒy՘0DW֣֙}0o$x.E\rs.6j3ʈWN rc&kA% ,m14"bY9 'v1430b!?\#je>aƸG~g4(t#Cry2O5F\b?- :{Rbc#O=Ӯ ۭU7f8b+gӅ R큚O6]} ~ 2sh?-D1g{ s+Gu r 0Qtwi61)Nq^Ԙ30O]v7kU+0k+"䶁/rexuҭOip,}8A3x|8i|縁>)l9V/rt`?:t=??̓K0AٽT遯uyK7;U18`}Ԙ>Vi{1?jA6hYt7)+79򭍃#sBa~y~:(,^pޗPm0]:0?g֮n@>來Z4x75}P84n5XOu( Xc^)8=l!koÿ_z yǟ z_~zi[׮fv-η; +19Cq}֕3c 1'YmZ)a$@@ByG\3y4- N9^9́OS_?___z8#8O W89W;=T #.6 _ş|/O)wxEL Z'ߕm=acުӫf~,Ս<u;'U~b_ֹ P-BY7)5ps.oy=񊸕2GQ6Υk?ξ>v9Μ䂸V+3O՜#ГuV9soa>n'*خ:xZH_6z:6ANؐ5XĶ? ĵǚ KD*絤Q"+E< yhmA~ʶ~V򫯾zM'xZзq|EzFM&ࢋX?ܓa\kd-"o|bP€B6FC>v>?s0E&mo&/@ogS9赱{%n<ρ)EԟCب1XsA56mg(>g< {va1bz}10j,3es;InckA'ĹjuϨ/移 AP93 P7Y& 8~XkB\~K|Jy4jY%&?% 7[I \ુ^SqG:l>¼VAuig}k7 ?ؾueq煪qI8-qb~.%m?sXW?uo86)ߪ}%qݔwfB+8ړQ<5CN5e*05U>9rHc;Z_Nf39 O.v qs_D<bYfc߃%[nS)oBTCkkc}A~yZAObg}t7)_)?yc0d]k f-IѾe2gva,=W~@%vFr2wy)f駺s-37΋K㫠xޯk#gz`)lO)L? |m{AKk |??aqHÿ=1k\3yq9Cރ+ЎScN틌N0eՆ_C\0so?3%pmǜ6{c=ZʶݹN j4_6ܷzrzP}X'Y69ck/ˍcoP%h\ w .\|ܞ?q&>sqغ3@NdbpQyHIO\WgoЁeM onXp}l;(9l%A}cƉpC\ ?O . `(m2Tj2r>5u6 dj Z?lV5=%fQA|nĬ[> ˣ+AUC3^&!0 5?2W<Xr,V~";)d̔`.ߘ[{mHaDÿgOYy3=7㐵ҽ|;k8QM֙]c8տuOqCXW>Nr>#ʲ_e<茱@mYg>Lmyq7|Sk c8O]?> vaMcL6'c8=2E`s>q.VObW;(s!7AO6ߞ$bBrѥ`'{8wߠ${4t-8yxQ>}Ny1 C~ԣȿ;ާwvsynj)ƣ֬+ kq,qp8ՉWHC;،=spѷpyٽy8^%3'~}).YJ_s~\Prפcbcme7;U#;39Y0o~4 B=01csKGXop?Ovox~@A,/ c|U ?'ߞڟrpݭGWJ TG7N!?@~yOlaPm58_XHa?Tĝ{!OJGq~~}%/~? 0 V`_l܋RRT\(7߬ݗ)8x|ƀfe1PEtHZk`Sđ 0Xׅ-to{/~ Dbk"gb&FXm2X夃Y-F\p]{q_pjN@ElE) 7h12 s!g ]8f"!ƽ=(XײgX50VZ31ϡV6ANmICLZLCx >|#_9:cӇy<'F31=R㌅ d@0?FlAK UskgN/nre+Q0D8s ׀a|Hv|& ؗq+'1(ءo9:OyYaH\.D%}p\'CL E9T|hr-kQ{tJ({7av|{+?9yfq+Я b!\;mɘi j+/y$MW"@}Lj85f<u0{_oCc(t 7@éSS cF&r /&rB^Kų=( o{,??/҇79Љk"s=Ve7=ކ WogXIq=dlfq ]TCu*\$s$ǣ αQmY=-/|WYE g@-[R?6{ɗW;WMX ٞ2l -8lcl)5l_gw^k@QMvM]dD?-1?\طkԥSj*nA[^foplSC9V}S-j<}r-C @LޏxCڵ]*eFk:?bV}XȜwg>͇(~(Һ&jOC޾YgI{@(@~'idx.z 2J؋eJQE89*q( Ip7'דz'?܈iڨK#l7a>Is BE3U`n!> L1!Y+eZ, , R;JѡBlǀ"DzsG'Fzw҄>ͣ-gw/X^hZ\0)خA%gV8qn/*7{{B'cD64 uee"Z^q1'g?c_]Yڟd1sؓcg!>`\g]DbܰsRMW:y|1Դ9:ٲa.HT9똵#;||]ȵLq,copOMgnV}Ozb1wdpN3# ߦG|xi'XnXMh@Ԇr?'_Ôoi;c[0yo1#fLO|Eb nf0n qLl`c/ `mw s 3e&h̿Kq$}~-V>Ʃ82>9hq@ :yIkWñ\ YP?Vs?n9Eks-k?,?t(kN㍺Eп[uܷUKrGǷ8&VjDXpÕ1̺qá!>CHkU;VSm|"jY!82vJ?םqUF}E j3rJ9;0G v!kUYxm{+ү-Mwe~bMxNl7]?b1QOɖIg_Yֵ[qv.HĜVO9$< =EO}su?B႓[>@{vb`_~V~(rk)oL$'?y[~߬U tC@Pn(YNvѴ`|bV.!ᔱhsmtBIl(VnDO8B**?%u8Kc$t\isqP$( ]X&i%:pN`~/bl>ErSqtM q-j;[氨SvvͱFBȑp uǺ7DLƿTߓS;ԅ|s<Xu{zվc oDmGJ~`B'aY }>gL/;G;f U5وy;I?nhjeRs\7ymQKG .HQ|YX[˃ 8'׃OG6M?]o%/7q|_%fWi'W$F% 6mj @> |9"7\ӱ+!O\7O<󱽟fٙ?ec&>[z23w M!5__yȧr1 ei;{ EXg3GtP Ms:SX9?~!$ph}& |U7՚=T,mަ\rMMO x<` kq`O%m}g~ڲ_-Ɨ5NpVk3.^%p\D*j,`6:v(11(ȧWk'c.OY& c'5 ~j'uT梦uϼCCJ[W _Hax'wW|-/Iަzdd_ùؗ"v tGm>V>.S.bWy*v 'QNz5~]&xJn@ڽn|ݷ8qJ58fE]C$YOq dE/nE?t~.0_陞g,>U{ 9?A*l #pswXwWcqf#u VIeufYL;y?ձ4>lnM0^=KZPk}W9Xt9{5&s2VT uRzrOs}Pkj>ܩRS4g ؅fo;?FȢ!:N'1im#z| }k"1m{B%q ?۴ n? ][A`\(J>8bj{0#_7^ַ$w{|$0hT`. s|ǹ 2i jr;)g285|<`ȧ$~7BS8^[.|bvyq1R?"NHӢ8N&I*alc. ת7tAYmgOpfOsӚEIӼl-ù*ors"VO{uoZ2Ӝ;bcwFeu,TsXCu%W)5Ob]wiFTN .0 ʡ*/b("& وN.O`mƩA|uW1˗Ҽ3?pz)5|qH_gxsg'?8wqmE9g>Ч?cOQ֩Vl'(yQd.>sٶsm1O]:i}?LfU'qǾx~^k0m/a7Zzޅxti6gv􁻿f7zj}$G\6}z?K1^?aImqӾu?'ożo9!ǽu#慽ͪNT%zM?'D(I`ٽI0qLˆ P,eEˇ xT"0c_(& ' `PQDƝ*D-6:yg<7{0R[Ӆ" Ny1n>0w KS}vEdf"m*6 F ތvXD4RmZtC'8sh~ Q?9y?y b7?-#smDM#\!ָ找ݡ9xi |ީz߭2@̃3KF'/8adqi3\mx8YčsF^7۴[]ʂA0Pn$EsԆ{-چU_m'2KT<3ըE%j hvZ)?G۾3c/>0!jg}Z Vaq]?Y7a?o1]+g8x砧]/+N2&r1ڻ~=99ʊS>?-/; y/7syz> ~e$;}o'g/߲WF?ڻ0wv}s`C=86ixLƁԹvy_ zWۉ;%96^,Gx G?{(gųzj.m79a8aWM rj2ekǾm \t78VrL1CSZ.5wrO )Y2F yd^M5P8P=AFS}6/?Ͽ?-3cntz/dgGFs&6׍ ym:8q 0FL*W0/F7Ls<~8&A ,<\S:) ϩ~""G ԗC!F{<4Mn߄}F =-s!F C;cg{>ǔJ|"uY怡ur8Vaw\tخ]M0Vi1o"?P|:9,dz7 aY+.z1߉a@9c((?!#}eW#BNKtHݲ?`6v^{EwϬ\[ 5T8qU9E461dڤ?LJoQwOYNlܯZU'm>UفTzi>fk'ɕI .&6VDoWk<d\hH{t~xZ7ow С}LjƻOb@'oܻh rqzmpiL˺-6V bذs>mm.vbDX5yXH@6QϷB4  +?"*&ySiDYjnTw.IZp5줢"eŒ¿2EsC"sk'p'0oǵrl'#ׯm v{N5k^!q$rdXe\#CZ##E.Z&| 29<溞z>eګ _nPzG~wrYp4v =27єśkPz~"]@c9V߀yB6׬&l<_ۺ'd?șuʅQ)_f'N?мa?&+jD#Yh|y^Pk~}~{W>.%EKH'f<)y׼NssX='rmZS(}:?@M;uoB }bnoځk/6v34_={_1|sLrhmrX&绝_ԴM3^?%9J^xfSnN7 ߪGYVe ZփzsM]І_[^\&ooS 5' tszT|EF?k\'">9g:e^__a[:\9˦Q| O>|\Jk݀ˑ:>n;'ɸdގB)ZUkdurW`b rZn+[\7_?vS1!7}ʟ!OH8D1(1y{fF+d8#瓉uC'GomAvIwFQxBmODv+N8![Q-c\Ao1J_4>:"_u qPHƄVt3p>zHc^{Kgɵ >7=QIVƗ8?_.N8',(?cS}ܕqB1r_Oz ZjUɫrT=}6\s?ͬ1osyʇעϽsr1tK$Z9?X9sHq_l>8dokcu6Zc}wnlQc,Igke?pLR+wb{ٳ,$!7ysW*x?_P/ε:b][gq]5$?OcM5?ʀynㄯ޳h7+kXYr{][|@Q9I?ũS[)fk?Ķ$cއ>G6vN̜7?i_!9?񸉞W}nV_m9@?7@XCRb . :CM9Ҥ@V*-0 C:x9?x_:_? 1 @Ad;' 4QLRJ*nZTJ:\TRF`ͽ+! A2fgnzfVOY4/c&u臒\dC4Xhw;a\1,6|8.7{ HƱ7i4! DrsyרHuE_PZqQYNj,\$sP3bӸǃq!G7nC_m?,6^wHʫimֵ;>?H>+5lP.Oq5gO0%3kJB\4kn[A6ל˜#1?7q\f/uS,F9oyXׯ]A#ڼ]O )Þv=k}zP?7{u>x1'9o)[`]?&;֔ 8qy98ըNf|Ī oV9uq+ʱ!#uu}eN?z@ ?`&Fde9X0@vƠ¾%>e%m7k'l0?c ^'~5=w K=HqX:ϟ N5<$ҁJ9s "ޖf&/ j$`\Nʶ,|R@rA4R${4X .A6-$ 68Jsp-j5-zSZk~u7shrco`:٧rB8@]pFrbSY'>cЮ`ڷ#qݼ85Fǹн`0Ӵ "ds5Fx ~ 7 :Vy|T'Am~B6aץva1-zEɽ|+4 cK %=\h(u}Џz碯x"}>RQQdg$ϯ dk{X͕g)nh\D5}{=Y&G{ ‡nY~>q)9Չ f&Ӿuk>||žDy] #4!EOAl;nA _Θv88,fi/ra-'^@[$: #Z?b+oK_|at~ E jcބ{@,O* Ssԧp6N1^0!F1"ߊqh ⋴ ?kZt9ַݸ^Z˕]m<U±BG?ةw~fOsؼc Qz`˦E/?4熾Np b}؈LRb6D`׈ؠ~(y /~)&z◿ۊ믿ncy l|*|)!Sp.8-Yjԫ8/ G,( /-[ђayܟ0<}Lh*X`ŽNyT q'U~,7VD(KnBN'C}ra/6Qj->J8M 8E=[?ϸNQsm# #2VyR$A3ÉSy 0B~E+E$ e>T[# $4*)~I#9@nU̡mr:cߢsھE$A2W{ y F6c(FX[ ((;!M?l- S" N5\|Bgñvn%fc??p? ?߮jm. |@y~?҅7`[2P&g#Ɇ ޻N|8mstʡ8֨v?z/1D%SW0&?4kv?AD_kw~uWY4 r`)@zc|ZgV0^Xcǿn}c\< Wp 'xW=¬dXb|eJcvGg>ߠ#>_WTq̫+l9ءi~ݵ`뵬1W n?c8E'5p+0ƪTcsr0w2a}Xs>%VO3qxYAs[uC>t5&?\]G9l?'^d<;qGm=|}+14n%N0UO˷4*3o<]Q[/?okk\#cwqlOjlQ Y2iQ H ךV Ę )F)'?}[G)OK4hFJprZ*qbUR3+OV b|kfqbp[0~T\Aȡi#[Bh$f`,u`ߐVZͧKvu$O|FWTt sj<&(v {8t(?wX8ߞyPI k'k/r͖iWD?OuAJ9*KHxvqXϕ  [ "7D΅xd|dzo-$F%V<r)&|Gyc˩x4J8|zemMsrg^M0=9SQĿ3&O=.έz7б{r7X;.{&~??oa.KemqNy+0{#bNJOԱOoH#>5r1 XxC0Es#7 ľNViwoX;6y=,: >eox6sDpMc"IPa=Wkp,+Ƕ&[=еҳłjG{@:C!sCm(Fk_f?́2.kbnz:s_9bg,`'Csۋ/7]J7akZ;%4g_C:'Gr Ȭ]WhI??7iJHXǡe䜝a{+ ]O^4-}iPo]ߑ۳ ].9Dov_}@~dOZFz]06(>xW>7.'_L4/Ai,<u&Ma&Q;oMXOg?{ȭ鋿e`B́;s,?i>P0~jcI } oSlI^Z?E8A#9* ؐ/& =(t؇1&ES϶2Vs_ ֘dN߂dn/tL֫5R&Ydc ɝ7or"{GCmlI]]5}m[j"tk6k;h&*7F :6z0o Gu~R-Zce7~1vg-'kɾb*LӄoIߜS$H+mk~Ϗ8'%J=օ?O򸽰`v5<\!|kcN1:F5PД?xyWz2}?m?t1ȌoS= ?ٞ4٬2bsj;ۀG?ue>ϵM }`56v&ΟruGoɹagб¼7d}F5VE?c )F '})8#N2"op`?ݲ;Cb'z5|Lw׾kZ\7`VM7{7m>ol<׹3@83_ &aO>Ǥܸӄ| c/;Ŀ~kߟ3_wØ3?4Wx)uxmg?U?T7[o/ g(0{6<`aLm1hUFdF!PKrrжcքdisg7S17eAP7O\d-=pmu%{ |T1?uOe\p 8&9QZ䋺PXHi ։s\1*OO9}po,37 s?-{<)*߉5p\ꅘ~+J/em |ԁn4kD8ŭ#˥BM@q<`_7l1NU|9F Jrdf/1֨vE\{moߊ>OǹaTXMUhO[eu9rEs$OYD_H)u9m?M n@щ Xd65ӷ1!WC1ETFPC)qH?_XV~}4>HN?_X֑bQ1!!omN<XjKP E` ^ke0ToJ{w t+k/w[bcǑL|AYqc\;c짱s|?sׇc]OPM3E>u%;H$cWˢoD:2!pJвcE(5Z!q\TׅHoێo( )ÍtjVǤ`Ƒڠq`.g)Vl $teqݶ{ o;nO.~X'smDP"?n9ޟd'{JJ0Ǩhp#u|y[ҨyX?Hpv"6ѱ)e |[8}hjrțRs8QcVՔӰš?Zxoy|Qs*[rf֗mF +:،35r |^lbKm)l~TuJj΅Op-톿"0Q%"Ƚ?Rt ^I?/gНk?BϧP:y0ZȀ ;!׆z\s^4y Qpsu¯[P -Tr|8f x? }f\88i'ߧ~HdLIwSRti'ߨ)Ӹw)W]m?dMQgVc0Xj%NKeօ9ƎiV5!ŋ xrvS&j_7ȵ۬<>q @#\݁:[o`>E|3cXz9b)3e=K\.iV?q_cgJZ1%~fu$wB?o5/:h7X=ؚM{5Ι  ?Օ~?͸?7y NVd!8bU?6Bw2θr$x@nLGi>,{"f~K+[ {ĨY9wia n?ӱvmr7U4y2-_Uf9'K ؕO ٌxQ/H HAs \8w(nqPF{*\~F{KCĿ;±Gp>IC\Wy|\SqY(m(9Fkᒇ^ ?e`LO0'G xÂy\*2a&H\ ŸEx2ޞ$ ,%sূ6:_ l_cSCΚ K_Y? Q`y=hvzʺ퉉>HJ]A6(Z^/`1sP-7`qlnD RHź@\3Ea stvm< G@}@*S-_ӏ8SʧŷɓSLDel  .X<98%]N'#Fv>uny9o:<}'Qmn!ϜZt$|4;`"Cc< gYҬvQn)@Y!j: smn짢?՘+@0>~!˅Hvq?Ρ^0A?c@]l2A^}S|g? [_>͖ ^k^nf߬Wf!YwDŽSthyd l+eܢ( ݿ]:>t_ ?;z"ǡ4 r ·|oc lY"7}=k~W7}Hov_5`OO鳱y߉na<'})-kѯd~>u( m Np~rJ2a] $kA?D\Øb2ϬAm2Sm˷ڏ801n]Ycm!'}x>y?z]*:?~¼psy[JgCrUJ9p!)IW {?u%P;0u1z;,n›r [*zR56O~%v (b7A<̀ e-ژK#<>WAG7er~D+M?FtBmr]h S h7߆lOI<2?WOmw3yb,wsΥ\Ӯ:t-2ZĝM(˥10|C?a!Ybs}BÿY)[ gS=˹ 7Ɇ:Qcq|º'}e}^HFGVu%m?,z8Z eOos9\;Hn]ϵ Z/ں #.?fF;w*zem~&lE5WG/?e0x\*B؏E!Y+KIrw7?p>!sűa_&ξH4Ab?j.?}W0 ]|9 `xĘ6<*x"-IgPAI(Nol_]7Ϗ *rz!qlNa@P/Ήtu#͛䆜tO>Xȥq|9;kX%] JpŸMWnRӦ۠9Wzwq[?{7c 5u[qBD|g] p{<~D>y?juw>D}r:H&]r :Z1`-a1\`|d}R[[=@+0rjI %ހUF9άʹ[?8e2A[z84D j?FMØK*/f`fnV'Մ*K}y,cuxc?&g{zG;U6}?:G/\(Ŀ|?b2ti'fy,} = .6Nj,q`(񟱍xI{ Gyxov?mkv:8אlԾ5ށ Oz4kN]~?>;-soO̎ڕ2s.:ng:r K[[yfNH?ضƶ}cZ|ykѦT 5o?cs_I8~Ɂ<:}&Ѿ2?؁X3/X;KfǺ[V5_/|]zM]F`Qtk!e5?~+U@7hb";Jau?>u~Я خ|K ؘ3O0ӼmoIh \4"^[i]dї4ł}rF[n%^'X+fd8Wuէ#UP_[6aOsNcQ?#1o߮}kp!V$O>!֦8)'su?c_/LL8=ѡi-DnyF{U2 C^3$=a5fdRU>iϞc'&B§Mdnvhrmq 'OEfӟO~G`׷οa>Y \)3o;Hw"ZcS'(*{sTe|.kp'@){N30=m-tW~D:ց#LD'N!lÜ0;SS^~FEՈnȟϞq(P/#uSꌟ"_<"[oOۡT3W}_we4Idb,B~-XcXIC 9:9Q栟C5Hl"!S:bq" >%qRBϖ w*N6+OR_{!o]ƕis:9S9X=v/28dOj7~Oe?a뚉C0 .O9d}rz2Ͽnv/+,{?N$ .ߟ'C\}yȬH;Jo6K5AWC,uE Onjd;c?kW+ֱXրjb?obj}o/l, f3GȑC@y<=˱b~ ʆ[_&xo#5 ֿsU@` ?ҭ6س{׹Xп &>̰Mocdf_ uM c@:^.o|MLkgqŜx>9r_fO_ |> +brox)7^9z?xUq^;ǵW6tmk/bqL8g]R^c]Ŀܝ1 ?yV6(ǣ \ׁ$6$'_}x^VTc߆Kf/QBaTI5M(WH0YYȯַ?o~C񲸐?Wgͮ$0ס 2v)l.]r &f킂Ѽ HZ#? <ۿ 0 ghS/I iLۢ Iy'M?X}mRO>o{}h#ū`l/(W7![yjH78POh8AB $k8qĿz7cV}_L\5o۾17AuUY'^r;_lœnxJ<+މJy~2Olq>zq!=1awWyrr'e|Aו\y]`Qaw#o? [nBSXs~BץA\DGD\s9(Vc8 ҾVg6q0y[օ‚$U?]AH Z 8^<.?$M ɖE,Lxp,ZcC`Px5SK_x~ =I'8.7?} ?b>7x?.jU8[vq,T/DzbkEl pm1~ÿAmPO<֠eMu.;&rD}ᰮ27p}jEY;.~cv{gDZAFIC?avS*OnVy~`xcpOZkk[FG]|GRI}=b#G^y)혪}S\ughquXԇ?x<9h/qϭ7?as_Glƿfv+⹯ 5N7]x(]Fa]MsNh'cd6!r'ݏ/(?. qB3 N s d>Fzsi}vL T&*-zQ[. 4(Y?_a8_?>~W^m 'X(dh HЄp V8ccJu -?vk1AT)9q I,A>([e3$ۇGXXo$A(S;'C\7K! ?O2<<9sANTOd.F3.2^ 0L'2gi~v#ޡ.mt!p1r'.8 콍\gy795lN} `N7Q73%0o".Oz7[فv²vMSty:~|Ki\b-M5)cG>Dž1+q <%>)NIljg^AG5}y>zQ~琺 # ñ %i{XT\ið7Pqoo~ Oyq~-}Rc6L=?Gڸ\&Š19fɚGʫ=O?xo3z&bnsS]CFl\tpUk)0_K<;(6e̒g \a~& "0 vQteQB>(YٜHx, 9b̚*Z15\WX\?kYd I0OS5MIǾCBX'VظCP*ۍ E8V7c: [? e_m$K i"6vkoT=Ҹ' pgO(u' tT;Um sMfq6JՂY?HدX`D񸳿?LGla1QK9}܁'qf7ꏯf D~nqキ6C5l anJ Ef36mfjZk=n p 3YK/~ojn*,?7K=z8\;C+~q.:RIWZCzhٿbAZ~ǵq?:QusxcGBmio.X:USscMIYpMVb5jc^/m?_o*?橋M]{l3NN¡SuFsK~z269"+wNC jc۬=VjZk yX" ?G?ڌ/e/{kk^_A}'mx#?b [R~|u+[/7騈fdT_47wc g?3ElN5 74Ԡ#%#8`(hn_˸#9'JrNgV8Wދ#`?1TƑ$I3InSgZ:A 2b `9瞁l<7~q[]ϯ8t+~J#Z[ a P)%xA.n:BP/ n)D@^${?xlkx~z~v*M+h(헻 /r<[t|r7C+oqc#?%z yRIcԸYf'.J ,nfdC xǥYoCҳp판! o? X\Әz9Ǭ [1[??ȋ\8eY=?x }N|"7 Q/ܠJ^V0Vj%GSe 2S4b"^B'՚yO8:&r> .??at#؅]8&0.Qw^':1GlPż`wҧtq*Fc>9U p-o) R{Gbқ ck)ǺWR1GiMu-Lf.esZu/Us_tC EpNxk,~bsm͕X|~} ⸉嘗?{ߞ5Lafߌ9Ff9?3?/moC9&;ka !s5[!?+$6D';7,= &8ux jtCO񟺪Ŀt_Z->uv{u_3栐?Ǚ|hxlcj[=W3H|5+DW70Ē@PDK# x[~=~wl_߱Np`#5'r} |(espLq>ٗ: 9^u%My-Wč2yk o gO;űfkM}siڨ ͤ?|.mW1ϸ$,֛I{uq,k.\k^x~>n10cIW&ꖴAҗk]0>;:f+xHkfl$Gz)@;f4a7be-u_'&N7KϧA=cӌ;_r^u%/?\ʶn_Zi{/cjCܵ`n/>>UżSOq>ٗ:4O'9SlX)VXae[ߔBƻX9o0ww~o6܅q}X ;߁`\Y;֯޻qq.;/}BogT/߈ZnI|+Zof}_yeSĵ_R8tA}%pA'^ş=qu16ӌo o}ڄоw{6T>s%E8{Aq'ggԞ)_ĜO56vs\~r_e1>7Ϻi/:U o{c/˔S ;4?}4d `1~L t|e;S̰f{ 04߈,"}A-d<|*=j.RK&>g Qu(/B{),4RMB^dø{K #ϓhj(k_{qL2{+q8W yy''k粬z#lSt o¿Y_=~gǃR N [aֶKߐi0w=Wd_lXOS.N ~곍WBcP+0vֳ$]^&&6[6qmu>XUΈsos,rZۇ l[bHc,_X^)np҇ԷzVsG!@{n_B$>sN' :9}:uBm è-CM1XƬ#_%?1x.?CTs6CS׍檈w'3?f6='@ Zrʬƿ=sk3qiKvlIV?)bC{;~fk0!073l q>nS6/{X >2\ןfZk>I""*=~@' ?ք3oAǘj V>X7{;Du uq?:/[EGMENΞ>?rs)0zۨ)0Ȇ"/q7ǽ['ob\dwӋl-f:* q"✌4+T:_~x7M 23HTdGi{LP,M Ӹ]厲6Ӛ$B,-+Y .XN$|[qaۅuo@MSD ?\ńiMz\cШf2bpl_ȣu,"W},<ƻ=jq>ſ&b&EĿ#u'+Ǽ7\k?1G2t'U$g{׃ROZJpoTV.UV߈ҡp񐓏-@KfcM)bkc:eXqjN[MikQ+{p QOQ .d5bЫrxƐˑd`~Y96hloxq!Wʅ]k͍K#?rRo*X8+[j! >r.YK'ǓXٳ6R5q9p̌/ ؠ1/5 lhmޗ \m\y)GlRx}/O[ ^\)Bsv[E\71:zf(=0Eo7U> VY 籨{tǸOCs^^ia]ű'qn}JmOhǎ+wo0h|^U4Mcx9y¿}|Wl.[|_w^U3'wx}s̠X\wNj$" kꫯ| ow`"Gة1ܔI'AE '9lǖyC`_Sw5X9ILA>І‚cO( WF[#ߖ2J[4jL^I2]0.TȽ';r}]H1cDy_|~k&dVE̕=ƹSMzs1Y7B+h[JtR㊺9m[?]TbN;ClK/S=oq.D5jU޶ﵞQ^L!br̈(gcƆx:= o`!Pr#P.$= =w\Ǻbw}x?5&z2:'-o? ,rco۟I>׬[¿}w&'ZYa= cDK \P]u1XxYi㨫D=-uKu2!8noQ4&nkz__3w0qroNJZ;e̬]Hj3!eC  ()P毓od7YNArƉɁӏ"RKJ-&Q&6o8iZm%zwoσRl;|"$$(d&,)1r*&61]WpAE,uf櫼P" JQij`*Q<]|$xs1oϼ !ܷ}O4 XrLsbCb'oXeH(R XU[UﺁͽقsSVoΧW0lØ7?]LYJ?j!ہ_m@.H E|2|T͗7 dMEF*S+Zg19ox=i,YHC-+sG{5r~4_pĸ~ǽ +)^Y yov##o%!{-q#<q~~@5juR ?޸-?$":6"ߕ+SLEmD"y./:EOr#cQ47O?WtB,ܧQG. pLo%迓9JF!U/Gl]%fȺF-VmǼmD2?ƢV>qS\i9XD<_%8uoqc v67;KL?چI!q-\5rCzuo'1$ę G3%gֈk!U׷Q$mjs \ AZ QoovrX=::.zc^bez Kғ:s6SqV[WO˚1q燔ruw15Ksנ^k?؈u1o~35{ǎtnz _8Mʫ:OW>*xcl0vaنa '?O?':p#eOHw7d:)yV$ك pW*_pc0%w8O_Цj Ry|C= =p2G"tw,|LM`V&sLGKxFZ؅zü>/2h><J2_MCo!Ÿؔ9fd@+ &6,5"EMYRFE3M5CIwOΊ\0وv 2v ZKSV{Blsr?؀'{}?ǼOu΅͜?3jsc64?ȁ)oRԁTrTKoI.?%Įu0P:m9OEIf{rC {ǘ|`!mb"6}ldr+a9<~#10癳}}sk_|PC)Gsk%o$T_(?k;;v\r~?zO7uX!7?Xݕ"[ow{@s]cg~|#1<_ ^k=b+U'Wb<cLQ] qеJri6f헭?k9{$Ivy?`r݈Ee埐;&=7/\^x@O"/A-=}[8?/Wf@Vx:c},?я;?@yK_ `y)Nxoǹw/9:/ \#ׅoF/ʯ#τؽ~ӡvKCu8v ˱}_}561lG{sWfG OIm y wp#]?#/tk|FۉrB^oОr;(O8Zlwg88V7)$Jop+`j-T3ڌqodc?㢚՘k;?>ۓyw'$Z~2W=U}ntzu~y!ngLC!FU)>&"ֱv v*P"2Nɺ~y]RO>'cq$ֶU~J;lfdq HY,VJWzV=q)H?TZt\c: f9Ny<+|5OR ]F7ت03oJ{l*x56y5 II[8bܠZZFP!lj_J 4}"_KRAݶ#B߬*d!10&{ya-ß?7??z\&rIJPsELnj=M䲘kZ#񼘢zk |12QOo/=!:4!O6ڊu->qc>!j/O9.x)'kb~ۦ|I]WfnMyXe08q&6lWMRTPLdll_N[FUd8?;Q6cSw^?M̾3M)&9xǾX7zmҩNm)ÄmP1b¬YtHS HmS/z;<(E{c~fƖ)8Qp\K];?Q?F`ܝ /MDw1?b tvԡXUukMO%-k#]Y7E9|gxqXb=o5WZ`0ޑ ӹ:r## ~>G_An?\6²Ut{:]oC&y\{ AVk@_j,fo:.&۸ۈK;GJ^͸D *?ܻ>;MW]IyF~?Ac!ҡg7=/*aT5M&tw EϘa]nkv+eJ<:p݇hN jNMW >xU?i篐? @a N?Cckg *3-$$~edjld7 R9dHDMVA.>0Qdi6&Gbl~Ŧ 8`JZy/A\UR5c<qDIZܪYO!.EB4O33[Ϸ6؏o"Ӛ.MPdzbC-'xyx~1wdm T7j. ص%>UÞԧŚOv@nE{"If"]6esL]PұF,*ײ^8~#Vz+ :P_ۃH?HޝGe5CԝZ![oX룝`52~¿­p ~q'CA㽨C'ԇ{ 1x=HPD}@N?bg1?ωrۊ mk'$d:ӓ>P_ZcTON?r<ҡ%5sϸm}%DG=?7Q fs*8Nߨ/Gƒ~:>pR.xd5%(0%k)՘?YTͳw6au<ֽuMJ}0. _2kQ?򋩮9f\=#_ k*kN޷RW?%/e>R˹x[X᜽uL 6=cr?n: |M4K9؟۵)>Mk>pG2ì!n&qq^[a,u+ <1%@E[j ɞ2[ H\dT 7Xa!lO'/u.(N `q|L;^ NB([?/ KYR9,!/K@(?st} 7q<EnY`Y1!;RaF%GN]l9ZsLPN5|?ZX ;6죔'w I-C[}-̭ O[`4YO6Js2ǕscJe~`]eI<yS5,5ךZjoÖaE O2Sk\>7s).xf-hSěC͎1?oP#~^G> Z/l~cǷ]Ev/ZW/W{^WWݰhˣ-\@5f}iy So*,w)׃냊 ͱ{"ʄة;Dd&y Ωqq )ؿY}8r{:Ou(\=焮<>!ێsG\&&=]HƈkA&n( ov'z'jJ^"|49i=~'[J݃uc]In#aAӒwwjZǿ]HZkzlM*DQ, 9gLi?m#cs/뼙f[-OQw{B (6 MȉR?5p.'e.y?a*=oヴm{*?P&װf3%3HHl'OM7?NF50~-0B`K@I </M=bM[B } (N3Ď栞(6b^k6җMU% Ilg@r=1"ȽXUXfg|&\nt3*a1eHC8v|.Q 1HKs1SF{% ը`sfvijU Xzh <Z~Q믿F4$}n9^" N|E9A}E;ē,^sq^\<+oTض"?B^)zƤj,Qׅ|@MYko>;Zs5^O2J[%W#&n<{v7ݬcBCqgg[WrYY77O8cx3ϸ@}Z!l?A5cm /yv2 n|/? ǘ,йd歸z:$lfV 2UN=ݯxBЮ>ϟox5q>`qum?%Ŵ7:gX˝?| k?oa80d%woz>s6O&kGm)hf?*8V|??|ȦT|?v1bw[?wa}O7QeZ`u_A`!3bϝ{_xVS?a>bόǼׅF|2M| 5[8ͅ0D%91m2QU l[4 &{{8Ǹ6Ld&wrjsq\jdy;CliOEoW6<,*cbm&J΁r4NZP« A> cXM+/N$*4ꫯ8}Z>z9%mآ0qw[C|{Unflgl湫! L^yιs8#S&o&}of?os4c^#>.>?G8~gش~Ŷ Ui~9MejѸ7O'yڄ>q1'HH~5 N1P%a` iD<Ν>[ko?,ļ!Vܹp]=W^pL *mw3. =JǛeG+&LXM )zq֛ci1B)D9w@>T~KU|(x%* \1Ś{U鵈<Ʃ?tj+C{Wȃ-mӬubo7yswle}"߫ZڄCҰgނ\V<xO;m!NC4[-QFxUd9sf]HRM.+j g70'Wsb;g(^7j²#D,r-G|f??wsp/ޡ`_h?+K>N O67Įa?[.bk-yǛd8 ̾o܆|?` 0!̕n^f}8-}BAW07e71?SE7*N?Oqcڏ^; 3R[9c>S%(톱ſ缙Ƿv|긑27IZd;?ȉ'4!MkZ;?Myfb7̑41'bV>;?j”YMiC)0?}6]+?kD.z%hm.CQ>N ǼXĆ܂>7'{s C9tя5})w>szU` pMŏ4G~ߺmBOs96tN(sGZk}::"Jb#yj,ܐN3L^'m?!m4N\]CZqԒ}79s+g[!Xs>Ѿ, E̛7nKc5vyPT|XGQ_ܷ:c_tsD\xVd/!2.9㐏).gġk_+H/s͎drSkw}衾27޵/"S OEf㸨.l[eDyNYFyt%`/ Phy qWnVP5s ;4iv4}:_(7M=a S"3.NV_[:?@\cƿ(p zo}Zܜd߀#Qo{*(-,z%7 ֑\?+s៉/G+sK1c\߆==zx\_$ws\?^&z% Ur9soQoocկFy>}ߍqOiv&.\T?\C6VPr8}*rE3Vpp-")ky>.Z3c9g- sa&f <\yR ϫ㞻Ke,(!ٛ F}~7W)OBo&?" TXfr:d#@]s|7rjZSvſ+C)"yGOSdtZ# }+H @y;'?\0`ԮsS -1[^>1ro@1|K<{'n}qbrgPa2JATCNj )G~0?c图fOùrpK> d[n8' / g=>{@υ[_J}@,1zqõpͬ z933O ;-?5 9%bbh#[~]b>caZ8< 8ڃ 9}78S>6>wEV홙FA[P/u Yイ]a1ϥF+{'\>U/m9}At81C>_w0OskPu>O}/dlK=瞙-c)WlhtݪxG#xo쇜cܶ#EOu-_5`s\Y ͮ?d^eoAV;݅-y<9ݏG}|aM oT3;kY?`c)̱ph7)<{bV)㌥{Kث[K |>>|N|"LG!kjp)SQ7]3ڇp=IoyH>778&M؃~`})2O29VrWWQO/--x\67? )?= ݠ)Rk:>?sD\(mic߹:~|@@>c7a !u cjKw~e|9i~t4cA̮?q PkT}/yn7 Ůr׉qviVyMcL^|Oj 6>}~fٹ&nhQK[ṓ&Ocώ~;.:qwX| ZXTw7G(uG_@zR>a_ެ΁ xȄ?_,l_Q|sc*\Bnd/kƠf{ȵ P9o8o5V]g Z6Os-A߸E(b}O"+o`_) 9I,̇sh"QvNf?[\YIV7(2wf=mぎe Xs+Y%/&l|hkiR?fK/[ŀ&{感v9c=E61.>$ zhX"yO bc?$;0Q18ǨaI2[-5Q_I\&J%^A.U!aBT͒s=A‡5}4t+p?_F>bLg@ l7EGvA=Щ@q_R/%؀6 8g/>8@ ؖuqh{y/Zx܆4I_Bx ΂?ԏ7?"`_p\d)c]ey$z]N^Lr͉uěTj{Èɖ G=-/!KlȷVKlbJreX2/Oz_7M>^kye_ —s2ޗAKoYӤ7uKZ E^jdzO  p0So?Yݳ?:s&wf^sL{ysoylFLX?s 3)?S@.?d n?*D\%8p/Εs~uq@u/)oaUq׫[1_S )" ͮЄo46?*/hHϲ5B=?2MI{F:f*Gsy??.1>F_oq!VZR^1w=- U[c|Tj7{o .?xMӊ{YSZ#>>Ų^/ d1؍AM%[?bmfqȓuy~|w'ΏǿfɧeO((G ̷>/jDϮa]ÀKeQey/vָ]=f=t >(G<^kccy8}|>%&PsO7uzu |Q:Vn2̄?>TcB}hfl)+z\}eתG\~_}5/~!Pϑciǎv8?n7Ϳ0j]sO(XM.9KwP!9ܬ|hU܂PPP g@q LXd?>~{e:O½I#a8 b>0V nszҷ <ɠ^ښ~n>32aOվQ1~=CC$ra+WFb`]s?^ b_ǎ7-gQ?q_2^/rփKxPXK9V@8ZwX~9}p]SVGlqMo5ϛ jچ(\ U-2{7Fj{tW[ȑxCx?鷿-U2]_;8BX2ݧolKl?D0/jmA?KKg|_{E , U8ԟS?RcFo%s=X|53 !/8{}+Ś(1f .\~&Aܻg,_%֪x\{g7vojۏ7Ԟޣ}*9GL8/?o!㦺ٞ_~?n7p7Jؿ˿<~n7ÉLn]sE {]FkTqf֨i* t$'kyb7}m 3̶ot 0=nz! hG?x) U]džS&M69jLA،u.sF]?Χ&|'M –6p 5~3n w9 =ŗ_~5X7_vż[_S6mo`HWs6MobvBfr܈kbM#픧fsuWvާFϹ!*Q]/䨚2y|qt޼$?qm=oV".޴76WoX|=D9 N*a~\39Nިn$ܿ_'\Q#u\rO 02Y.CWu }8m:q|`q#=х<jazGgRHk{|Jo @5vx\O.kBEk"f}#<8Df^lƦv)8`|`#F5b? :8ֿlPbf1 o ` eE[.]l宐9ڣ0 iy¿Q Sk-F7 /|z3Y,vi)o{2X =w ^ߊ>XX| ٿ F#GE=> LqӚ^8x1P?;oU{m6Ku};g=8c<_tn)ܡ][_Ԏ[qrdnpy?OʚޒPyU26v nfoh[>6XC_J6vg*\7{wϞd:?R]4k\cvsJߟ7)P[wruA"\}w33g`xXa¼8 ?<}wjflW{ĵrO% (7L7_bYcc9,GSPqƹ%tjnP{ϙc PUKpu|q=6¶8 "8>9 /YOp DH)˜uۍ& D2F:oMX8۫ u(Pg KufS(Χ6wÝSi,'pn}9/ `YiXK10R>4C.ˆ7[mct_)'YC\oŸiC/şþf<__a|r+c7ln{eus7-#3a 0jǭPdf9oqY/s~>)1T7?#Ðxb*6?qNACԾـX_2жhc8_ z^*Ɔo\p;_?.?B\G]>g5N[璱ã=}yܳ7^kVߵZ ν9>`sG8nIW\ⴊ r8W#9u㏿k+ng\. nqOth#9pK@K{,9?m}5mbPALcFlǹ΅TY6DB>X@.IP4B7̫(-r PIyx}yO1MU%;x;YP1rC [ .eȹvu7)}?>׿/?] ڈcXT} "&|c hu?|:n҆nd5;q?sm2SGu:"1ɶve>zpY҃3q>A1)mĿ՜|,5voIpyvPcڨR~] 㐫q)l3eo:6AT.n9 5׾W5űKyjֈi^T2?2.F\7R*R11ľĄȃmG)enl O0tev\G=3 ~^ ǵl|_Q}7ox4}c |6s5ץy'ˠ/Ȏҋrn~U V%mtc>)O`jC; *u7I 4"mc8&,M{ 7NߌEns5lt[|N>6۳n|,7{>לO,\漧X_Jڶ7@Zq7s7{uc^KybˆMۆǵL+,#~fs,\#4$6lszH?kaj|8Wbq y'PfQ6k[tچTb{`WG oviG?a]E1OVHrұTQ'ܽb$mqx馹?}կ~PY1kb.kM x颅34->\3hzYP}W#ccqo΀efRu8=n&Iw  A9a]R0&mH;^O,9^n %l:Nzp_r[\c洹TG z`.S<v&36Hn¼xnF?G8c툁f~}8/4JbTJ?Ɨ ; tR ĹQnMgoĿMaר.E)AE?6˵1g_a>p.=B?AO~d CO?x?5ǘ伛suކ4WF ;ٗc3/Pu`iWԫoV򪘵9wo|#by/c++?!?pnnС1gr54Cl/?7?ɲ7k8o9jߜu8%~ ۷T511+r&3V%)j/8X'<ߘ=N2|/_ѧ}&g9|>~_>;]M7epvTװ[Y'S[OuhqQ 0>1;WA~\w*Є <_dž>\.c!=CıN{е@%&5shN?ICyAcQ{>0>C=;}9":0фW]ˆ\LΘ:לqm 9mʅhr! 7k?Or @rDa^>kmԨ{]㈋OҠM8#VN_#4+rĆƙǬ|DW{1`zOq?Ɯވɽ(y.NVޓ".*,\7qoo&b_2?Ne2T^YrOհ:sBDSojvf區bbrz I2J' %j7rFpZ_x=bOŜbn,Ly~J6qs#{m\f aF49pn}s?*א7?i6y tnhVr>7q>?`'?`0j:xbUǸ6,ӱսxhϖ-jM\ELnsN^&Sgl>WgsSMbevoV9^\^`K?js+[X 8}Bc^kهG@;ؿCAq #Ās#G6?׾ F~(z3VLD'|,59tLK՛ҳc#,<zseWiu?.?`@s{kՄ)sf1y,*oYKq[/ɭ7+O91 #~?=|eRN]rQġշhWkB嗙9Q>:Vw,?#E/q?M koԛR {l%1eETym?U\ܠ27q.?3/ޱrF_+9%_,9i[#oű#>ݹ?C_~NU4Hq\Jڴb!+P0.Hlqo7^' sʴgB"p V]L2$ gJ:rQ䢃DЫ18^/"P+7.?p h\%B5?5Aĝmt.x^F B6El9oj[mA=P4[mlG)1Ӛdx2w?:isz>n?|8h!Q_bXN ).A%#O0!4ǟ}bʟŽ s>o~awiG[Ц"ūFS P<:e ^/d/l QhɏcC1WYIkBqDdOsBy4NjS'uz.2EN,wZXJO)| ɟ2&tR|q7+ x\{~34Mcí ē3.NG,;6c!U>&ϱ7vO)Cɺ1P],xO ^hUO1<7s9.ex|D~;pn)+c-D/X}zd::WW@i)pkQ5f6'مMSm([k#wZuÿi0^ƿC[0أ&6q?xMx]gV? l~;qkpsxv5F ۚxzVu7~0.lidIb+0wY7c=c"[Mdy OSLS_14tbkX{1)vu[Aup_L?K?k!)oD_~8_9rFEJTV͆ig*7ThFrҧ@Wn3Shɲ u.21X3As~OCx>a n̑Aϱ?vtӑěW2gd%QQeX_" ׌<i#+O˔}mx5>$9a?y{Ibӣxx؜ ̍ ~n?~§J o-ׂR_#օ^/8ЌVe9&)KUꕨ{Ac4| b|k(*F vݛQ}:]9/ ?N m3qXkft, jB%sFS6٠.i?^x2nQ:2ퟪ5oǧ矀BG]sH;͋ۓ[%Gˤuc :9-kQjlOyܖ9ojTZs񹓌ts<4/`X|y6)>⺂3k jy@n^~ju_dܐ RQ17/^K9ǩ(xDZ1j㥿ʆĿ tBmGֳ"DOA}b2t ?jM]lb?ڿK<`A΃tk3F ef-+w-YpZd9Sh1ҋ1aoC[3gx\:㽧OnN)qfe)˨I|wY|Ԛ%o7e?E8SuY{zQ_!bY`͈{#w~m]+N>,oO{/{P/χ\)Zzc-icŊ4X<F?q;j/ |1fM?&[Ǜ]<8FDr ^6~:[@Jɵ@B \wciN gcFfT ,F*NB4<HP̧- O}/ۊCrG:'U8A ང=VvdcF2 fכbr|0&=ާ n hh &/ۛQfTB^\(/c#muM6`Qpt==eViry@6Yvj_1(W#)oJ>"$0ΥFCʵ!\K\P] ƼY VlᵹclͮbC@us~`^ bz\9y ك0F^Oz{q~r8J21u4ϯ>-1<4YkZO~ā,k:Cn=_bAN9Ou6.%Rl?=QNMطof0;Z_bSkg}iyt D><Է~gq|Yw ^?E_>>{d(L>|3c ~)8(\$6ks@4,;!%Kj={|%(2N50BL[,P]=_3rUɌ5?ZmحF{ 99ֵP(4\'jڂ{O2L-7'<3Cf4øo  .M =5|1έ -f|c@#\c7|#9W~q:mA*nd cesN淲k 7#ʳFN 7|zN?/cucAQ:z Z>߽~œc .h_?rEA=ؕKnS5T_a,_mgCgiȿu밿nEv\=qŁLgI" ".jm(5A{ͽ,`H~,F= ',v&O[mH7.Q/o纛0F99㊵RM?j t$|a;)/]ȐbmƢ<^o\ (}>%e%"am [eho 0sUN&<WEy&-c]-:zQ6J_77]:៯zg'|d~M2?yq?kHKET!\'k50ce<˰f5:{_A|?Z!?g;̬3q#?s}%Gfl/ a3@߯{_}<|WWƲAd|\쌙:D $72ca`_n`B>40&p&o*7,:|0`4T`S664֗\Su ۗlx݃L9c$\ O.A6ap]YЅe[ 8y Hyxaj¥QQY'Dh;pm6'i3u' Y:8u2Լxk%Ƿ & I$aEw4R}mp"Xo)U}'i^P3\/ l+y7m 0c>sYd\.?[dZS)_mVYMt.;7Ʋms5b(KmJLQQ\MFᣜv0/տ>q\AK C/ukk׼dg|c3 H1Z`m?ufof!$( G O>O=#>틸k1Hvjlw5^t_a8FV: NWw֦ߝK5 1΅(oLv/n9U6?{,tBiI .Pn^]7s y%Ǭ챲ֳ b|!cX+gq}Z3"7?'2U~)/7@?3, #S6`'a{PlVG!O1m{OfoYf\HP̓SΣG+w<ƱWs9%cqxB˶7pQwq"4EA5o,XkSLRfSwA3qsWh3^dI/ꝈWg c?o6gskޕ6}J<[&f_rQ:Naq t<*iDr'0:HQ(;پ#=ux|ݧZ67^d37XlxDS@ߔۚS31A{؞?WsZ?o&Yd?m.r7 bUM9s/tojyIçsQ@.LK!/12M?6ǃzl5<hI(pnJε_clTήEbuj-+Լ6WxDG?'ۏ99n|%zF GϥQ>\9IC]7lx,vcBaAT9lō7[XʍA?Z Jrn,b\46q>/?R@b0&f3;rs}0*$5ǜrW=)b56Sf/3mc(~0w*Y;ig6JZj-3~R8&g??Ϗnz]ڻn3o?/?6^8!R% H]>&:+n19jnSA!?[igxR+zb`?}&~u͆@vyBɑ}8eJOPMQ?c];<yE-n>nֳcQGrzy5^ Yj37? _;z\/lo31E8~xw~?@lDT7͆x#4{M67x}f/9(jYu`gcQnyk Zkv{)=Vy(bk,c}ϊúǗ= aḁ~\|W|M|C1$ܘSIF)p# lhhA \(@.hw$fs&b$WMͭd&.Q$|(lX17b+w * L*Gf-EԘpOv2n IyL ̋J,Fs. i,u.1b}/͐ɎDٕQ/tVe;n~7Ϗӿ- ^im^5o'|Ȭ 4{^k¢U\bL2S?/=Jkf7>z,z21ER=' ( 0{[:wǭ_MYS-!ƺzmժUqh9aS Dmӏ\:yk3ʼnl[R&Ğ7%~qP3}{o>Vؚ?7c/{@]8=DQc\϶M/ue6wQ/QQ/ضp1ٕ7ꡁ5Ou>ў]׏x_~:^iuwJ( :>~c^N5?9{uZC1c"A|Lbcv[߇JJ^cr44/5]#2 Yfb/6u |s67k|݄-w3_r-0gqMj<^wj\l¿O:n_wq/n?x~_ڿVRky͉Ky?^_bfgQ;?~<7яqr|#+Ej960Th(c.Sty<8 xu|ɅMi 7?nb6Rshk!6)u:1k~/Ad8s1B}!b q2_zdWbC5^E…|^ K.Rrgy~.' e+Uxļgg=^k>ԩCt+s-gj3Cq$.Şn5=wxl/;Aя~ӅHy?T*6K/FV,ʂ l/yqwP=\ gơy:! FaN =9/1'' r>:y^\c9_ԑ;<~ׯ^hM.x<<?k׊כF']7 ?m ’Tx23WE3`Ȧu!!&7&ĴY)VEìpk@sfV7oW{0}ssOxk?rS zͮ\uNMmye[# u|wr|qA+۬<{ SA4R}dUܫ_gG>grus? ox]xTg7ڞ7 b碏WoGE:ǽZJN``@zO(^5JZ[+G HaM1ZYc\k1~Vu3k$S7&lSѡmT5|_Iw/֙JM]0Iq'zr> 6Zy!owm/o=&?^sE_8ԛRuh`%fv#Gk{3y1m"r u4WTe;kv_/־]_n#C^~8FiX?gܷG?gނL$ēcQ4 $.v̅h `҅:\qm.*TMN1/b!\x8Nn;6ćbc}U|ZKwRúWMZ{s1btѶiX#5ȓlK`FA참գ oI\Ld ͟ΝF18n|7OeIȹR=FY2.Dly'n9݈`|CaKHm#_ջOMl݋Qilˆ AN79;R :~y\}6h3?f>p?3{<7Vlrar\v䬘So9ǯ_~"m޿s~٦vsN=FB;j3x_Z\%8漧q= 7h v13vGOb>#g] /ȰӶQ.?<7Wp|{__vVHy >Wwu Wh9]f޹95b{eǛ>uF`Eڈwqnr]fuec|#r/9>u?ZzʟjX;ogwG WO?u>#ƅZԛlyk5⺸2~:n`늭}b)9E|p7 ^mlA^OJy=滿N UHG r:o^k6/S\ր*f:voɏm3nG'1l-wKen/]Fo0ڍ+wlEĕo7``:nwdYtmC@6DZ} SipKy%6qz=nqlApt vCvP[l0Kʄ S8űj}m0 jΚbCG0tlǽ흓W7γWTZpocj$caMLBZxN_z7'>jr;muo7Quxp׆H?ǯ_|xX7Ix:rWI}f{OLyo7Ԟ8a ejM&?>y`KF>ܤL'lWO$dGH(\xl@{ bi(JOdpA\壳_\o?!>=nŖԏObWL(tˊ8:d#}>28XlhGh(A=W.l/6ۂ Z[b8g,/&}!;0 Sq֞ |eTX/F,?{%'}wl:oŌ1~p'Xg(dž:8eL֟Ne\]g\q.?.+ϗ>]ޞ}<* SYHna.)nA$C0{DcU^/;r-|quouk1(c*N_gX;G6,CR8N|D;tԏ~]8a>G7L2Hʊ?.$&^"1ӝ@'ݒ.lD}RmC7pϑ-/L3Z1+,ǸF tKs#C6}8``]Kݔ60m+|x34ookg^I-+>|,jEjy~?^C ^g=gOYH3 n׈9e0j)LU{6”^ϼxL;fk/5̬_׭ŠmR)rqR>+p왊XO!^jOKفKc/R,du,ja.ù |Iz|j1Ho`_pڴq!6;L=c3c X ì]T7@,a`l'~02ொI!g9eXמ?Aʦs-G7%xTLЧr:ʆv?sd{?_2F>,gڵ%A!H|O0/qw $IW\9Fߠ6B/s g%8&K;ğNCV4kĽ׸̝j4dvkѺ3s.C]`磋zY븞xyrC8\+4-^sS}#DRwe蓟}ylX:FÞvsF]q?[P{'o͏a˾\9P ~A<u\]#w7e}[A2%h% :sy3 k߬I71x7SOk9A硈<]?͆+w~ ?͙z:ovI" 0\ zص s]?~8—*z4|yE0Y$}|g<k]Q6`̓=Lqlcwi7k<C\n @;dZUse:Y?GIva՜]e>-Sg}9,"ÏiA75,PF߁}s A¹}<kY|!Cˍa}jjߥbhS_^kXsr{|K זWݐN>ek(VE ǁ#[d\w}#|M _A;7{ŐrVwݸ.|9w5lktc`)v}ɡ Yı?ϵDSc~iG`>i-Sl"^& N([]=m>sDžH7%vV=4CC%t(8ךޞ+',8?f;qN˹^|@LҳH@آѕDn DZNwk5C8A}w(XW왜a~`Z:2QqXHnimĊQ%LD-7yg,Y{cYbA9Ƙl/V`ϱfuapZ9 qUrs4e {;><7gti8\o*S$g=ebކ\({ j4t4s<1 !ׂdRZ~Sɛ^z`#pL`)ǜ`)Z?6/Y8*bcvؐwe&_.cT}Xt:,{#sܑTܠ8!gwT ?|/^;hd#k~.CTM + ث<_CKZSBc;)ucG\ 6</C 1 ڏS9|Jv]w(Vwd 7vT֛0f m@@]15ĞM1} 8o |+7¿546%F<[\ ċl}|9M2cچӱ5 ^4;pѬ_+ F\*Z-!yLbS࿳Kpny>k;1XHS##?+wNZݏQ74bʼ{+OCǨΝ)B_cd?t% /ab&>~ulQl.+?חg:.r?ɧ.Xe>~sƸu7y_dbJW J M1/UP6Ne{AofR>mt i d G: YxYZdP?ǽtUT8c-7Q)>3#U+֩cjø{HL7L^uu O ޸6uBHћ%7BJNqVbՎB~<0_y[O>0s3o+g5%֛.b%6#d2 >;D=Ǽ/5</{.c65;s%&Yϵ.Isc|8'v?b\a5xbNu2܈5sѶ[z=\#nby xr09v ??߅s??DXxʅj5X/X5g%F;su, rWa(n9Y$lQuRzYҰO~5?PBptn뵇A,16V£hZ{v _LCd{nfq{`c]M ]؇^[|ߞcTK}D49huolen Zl [!WuOBp&w{&u#M%~S[ψ?vw 3Vʚ뎛'|u(rgbFc- /Acu 4!do!oCN@̑gCoĿ{nCT-ݗ+U;?[x`}X6?n+&7ue`_b9i' e:TNf{s|m<4Vcޙu~@oa?/v8ƪe9w_7Xu MHE!4x.b/E4\zlN]̹5R*X^Ylb\L{ 2д"eI[t&jIC"0Ȫ |iʰ?Vle\yQ7Xb( oߞOcSH1X7q\@2r^8e3f:~7-2ӆ~Ūõet¹<_%-3w7MKdž_\\Ux^ NPu.-7e_Gm/LD:oxn3՗N"inpܯ'$w}$Wd=_~_}yHԛM8➉rq RP"b>-_WwsS}͈+7?cczɖjK>ShZx>Bdf),3 Zg=b^yqѻn_Cý5q}Y{>%"%Q.#Tؗ)>_{ć_ـz3\SǟwW1Q9L &CKg\A8prd 1!t9-7 AM]ejZ'>Yާ7 OoNX^8,m'FWC7;X0?7% ,` Ƣ"b.e.e=/#Ϸa!ǚLz`M?f?t=.c?l+fȼA-ȹqV/_29)|)0{fT'SoM޹B?i}9mx~_,#Dy#6&1am'b%E./w([m??#=iYF'i`;Ƽ& A>ܱu>i'`M.krǟ9~H?&3m3J8m_W} _k_[\iyfljCĸ7?<ϹyQٞ'ryFf?m7?sgP%w; rX->? k0o=o~? _@ !g)62hZy$)P(AM(f|>&n EYȐy;e]"k`4gڱk7w"od.yN{ňkqgM>lW5|49x8/U}j;\Yx#̥᫯z;ϯ4<YL`3rcKFt侉>VZ|Ob]L_y.y^1*~+ Jsjvc5)F?vaOCmzTM䩾u1HN˓.9 e$WKfmy|] Vs1~_,>[ȵ~X_y).&5oI-+=1\[ [YCf/w^ێA߷Gc -gvs,)RJpWxDYM\CA]79 ?hܒ1f3OP7xBgg@IAלQ>S?ȸ+x-?ދ );>n+/r Z.C$oS>}#ĩAץ7s#WCu^c/w^ێ|vc0vS^v1B[@'W># DMp} #xު;~- hEa[aMqmiQ?\dN3AHf.PB H@^DxЈ^{?ԙ`x`L<㉾VFwy/`8̝j Q-:n+|P?`[\XenD%?~߬Ix}C?J#LdۚMV!1y>:nbg?qQ>(pi#FBv`:ĜS=z#晨 SGvw.*&. Sdb˞e -2V9A%?ސ:>u|kA낣OpqXzЯko= uf//Ÿ6yFre7eoe2]<9QG9I4R6SڇIy+Ӯƍv?X`:X tΡ+[ω4 ϕN=pS#3WD-\P~2 %f3?5xw6LkN zb8]L[?X <_qiC{|0s`y@yq #P ʯrac5.Op>q+>aq)]QɈ`f\qu^XcaN_s|^R9_嗏Coxc*k(6ԋ'&2BWMmԫ8~>dp%݅hX"*Ybߧ䫡`{d!{Ma5 rpSlº֫AEɄ?'Q,lmAzbZguGOYxzn?S3}ö:buA.7/Da,ԋ`[ͬ,5ץFTҷ.8xyT#7~i*IC給m/_Qn姽ǿo6&RLF?҆{VA{?[j^6_5lֿ"6dc`M,j3yS>K}l)=WADf+Kg 9@ψ3 xO(@6OBO Z܀mC@N +μ/w9g%M96k#1@'2,N$'7"ZmbǬ9/tpD}>v|7>ϭp1Gk/җRd! IEmXcŗlKjI*NqQ~`q/(XJ WS+U.^6ccvaCSMAd"O?yϫ(l /́qsYrWp@$?Xr?~|KoY?+& [wy M<dvb}o;[X/T}@Q&=T806 vneT1]I06T_$Y}(>Of"il|sɋu->/m06E\s"jߗ:\A07v9KrFSfނw[\/L{ My o^?Ȼ3ryhmtE* {掙sw7AJ}84盗O+L`,8??:6,]]낸'l6c,N"؟뜟h+52;O)7rlA-W rWTp`{w7%67NLy~q|$^u-sWM!xCb:0< *O>׮~{j+16?ܴe.OiBf6nGvNcH{<Ŀ4Z_=12F?.fJks8&^7?.Wz[ÿqM]O Ϩz[/b&GYcn c@zS﷉K,Y>a3_E(6Gy''F2sMdsZ梙fź D i=.GHpCZ5>@NnZ%^t?&oJ{3X7oh ks~qCqiD'F{` F{&,L!hD1X^˘AYN:G1]6 [p~z';@*>rCmP'2 7 e."8cy1[Hc^Z>>=B( lM&"~r'؎MP=J c5SQlW4욽 &q1 OzcDBi? lfܗ.ň'o}o/!;D&grfa `a"x ԡ IP2PAt) X;"Ba59pz p@+71у1)"3j.y,B1זL%_iЪ0F,1ӌKf;5xDW~D'8P,G\Hg8g{1^MigsN&Ia&!~Y{cIiǷΏǷ0T6)yt6;*B '?&zXp"L_ [}mMumadBoMH2ϟW{MS1[ i uI)9096Խbk?-k=v!߽/\Sɷ 썪Bq>Nߺ@ V5k70X8ut]K_ 57E<6Z3iǯ]1BV&fQrT"ZZ,ḱ%^ߞ.( =))gc9qɹ?Zu e fW Qw?Ч\Hv0mA\bF ]y~}䳐i;uѓ{S0TBe<d]j/EΨ+y7?2cv}}%s>7Rm]sLS z=_@-ϙ=qq/q4Bic6|3lKZ/z''u]FR2Ls qUPhe3}TUZuݔrؿ?Xso'Bi_Ye|s['.q~ !xA@~pS$dk+.x %~}!/^`CZOp[5/6٧wXt.b?̗?Euz@?a%}㼆Ps%s9Whco[.-y8ԋ<%AFO=(rB|n61k/! ;۾܁b/׊17rWޤ8oONY5 T MEr>˜qLqx% 7|?%=4 cIϒcrOO㓞|pڢv[e[ȳ܃SN8k9 4Թ>76M !0UI˪.I1vcZN3-mv!?婐+ E\dwNə?W.3==BQ=Ldso/*:^ yFn>v \CX}_ƏZZ㈠_y>u|لU͸bsn=CY#o¿6sRx;CK|&3[ooeMoz$71u*]<­[m';&5yh}O Jr`iptxukA`#`I@c8xOL>& Y-_t!i_;ϯFq=tcc۴!kM \d\V>4@v6r Бd" sE]ک`sb)Sp;dZ^ (?`~ʷ1ؙq{.{r˚V z&ĆKV7ߩ'XsY{2as.~$㡛5*ލܖ:=ԃ XgP" Oi߂>`VOx.:E?{WY2xw\QԾM}3E(=&d!B%߱Vgd¥{"P3O-U. _ SySXF}~c$S'6߭e^~?/\XfY /|.\\o FQ6G8b;qo(?^гt` ,t 6Gڌ+(]g"2:.%|wn}. h1kFYo3O֫8x#=~-:G5NݫNpnc~ܧ/(ܖ~Cue. mf -ic 4{?7OG\>Psuۀ\cqVU'A 6t]^~ ?[e.?+Eh:}O/ 60Vм1bpTM*n$@lT7Z뛦^42iiUP!<\B HB7o]5 k}r[z1NI\EO`c=DR3\fo?O*86#pú;nxKEol?K?ar[϶,y' Û5?_$kcwNL0mSt:2v'߬z[P/^u>O/1񂩟JE2`|y0&X1vN=$jׇ3 Ƣ?5g/0HO~.auUbʹΛ{{"7+%gy$q!.U?+YKǷ6l.|lwXkW!c$gW qnt'qO\hS%͆};}nY{ߤ)u%wύWЃ"GXYoϙ} S|9y>[#A)C'O@%pD2P( 3kADC˟j`"Ŧ]TRex`1O7kOe 2^^CK#:*簆c( #]xjA¶ }ibHEò6󅶓h۲2U *UL7ym=U]AZOkY#*{ې=Ǔ?O76@*faN :<٧# x~Ѕ!PHVo4|GکܡEP{c.n~c!b 0IdܪeÇo0o"J^y{%LWǚg<FJL9ΣĿw~ű{WRA guua#6r-S8mo\3`(JG_Z9ln9?~sr}h;߶Y=$[EC+63(k\yOSz3dβQ(^C̈́f;co4;?Qgm]՛?]P_$,l/{_+ >ɯAW1ވ-Ccv˽uq:\ y?<^/젫i;_A7mC ^G`r)sZ69*+YAsxǧ?'yup߸ es旃(Q,K9PF#_*2&W8rq cR}`Ё8}3>ϻzYF"o|vMD?^+qole}umv6~[a_xMywoF6_Nu}Tٞ[?v/19Ny> n>v,㯀)3NY[>^A!}5m a_?1cV7?dZ kJ 1-p=U _ q{jp0I)IդZrmcҫ~ N W\ɉKbɎɐebh)۞q(%/ts ]35- kJH:O5n\)F?Dֹl04 gLVs9DVk'1)&*F=&Ic"Qő{ٮr> Q~)hGgOr/?yMZȕA}1B O9KCdGEY>X=4w=bc]׭be2?g:޶owH-&H|)u-zePdD]pm|um}4̚!cK?c%/lUs-Uh^ vy:박] s #y`G U N>\߬|τo 2MS7&JKs;J&xSQh9e ^S5O/~l0fd& GlO2ݵ.\u|,Gk!6V Y ?cg<"xm?Sd0U<}QL\k`yɹ36$}G9w5~+65LDOf bٛ?`C9DܙײQFX!k*VQ,؀Qi Hkp dV|nC),z q;~"ZvĶ|`CK6~$f.z1NdI婴56y-2 yX+ ?{dkƈrV. Ebon9#?_pC}̇«;Fy9|sq?ն}lc^ޘ{jramґvHG's`K}F7?A XS`54D/VŴ<6UTBMjqN[EobCϵ&dsv>ApD33CXraԗC: n__1]{I;n*%o.#&?q̛t{Yڈ06Wby͏oF\䕃@Y\O=ɬ}gfMh.':2[c>"ӽe T:k%f=?um,3jrпJUOd;mĸBوyǷЏ?Ke: ?ց7U9qȶ9XN1=: m<1|.|@[iQ6i9`O~ʯs chs/ _Ոµ_OyAY~x?OuQGkhǛ/9(ۜtJ +1|z,Yq/։ s8Wa׍b2l?j)|{-(DB zYl?};?`}"W t"Q+gB4S O[_I&Rrd?c4_%w|Ǜ_8Ho7OK!V Ek|rL G=GJ|D_؉X7y8@Cȝ,7x-MU>l.=dסV>e['BqHc a?X/Y|S^GMA0WǮX?xlsӽ?^hq&L5.frMOBׄ K \Qscͫýȉpibt]'zp*~i?OBi29cr}0*/k%/ZZ+/f*Xpx BJhm#;`ã9 Mpb.֬z> _@É+Dk*,* $(ߘ_6xh;s\ދv@nvLsRzq﹮ec h b$C/rPo)s2F3Ozr.ЮĪ0?TC_yߥoW(x^C}7Ă?RO#o?MZx}i}?7g]ODL6s]P}1cJ~,{R.ϵ8+7z$EAc)P{zqn?G5 u u\<3JlA);'!)kI[͏79g2` X{S^ G+~.RB{)XNoX- |*M??#vsf\C^zO/(p?!?`}cEo/aq=yEɏ %Ь}k&g"jlep8c"[隕+Y$AY@(h01ܬ12>q}[{/?჏9L'~^ u JpzGif*NЇyP6DH?M, N) S&bt]|0F^=_k!5{-PeBQe𞘊I36 XHǩ<-74-ErXS `z?ܥ/zOo?4/x |!Y>eyݰ= jO(?ts6>o?o%9OW=/ڋע6i=QTШ8/6½]lC!ɖ3liX A<5m?ÆOD\k  ȘV[NjLcsz)ar:򕭍3|Ye7q 4m]AvEsy}O:,Y2:_X9q qP2(VFJ{9ܪSr/|Zr}F ;i>ù+c= Ç2Ayb$sZM@7>UVq֐?]cAUOuut5Wy?W[>K|oO~֗<[gQ ~-6ȵf֯u6gS F7{e{0Q?}\.bp4o]aV-A5;?^ӟxָ5:GyY{_X@H@g4h/OUsB:^ۜ2Xor0˧ y[?:"\2-t٫dיiY8gR>C"\:XoS\`?+AH>w1@ :|iZA ݆'2@ GbuH횡"Gؐ?>JBDL н&.(?>s9I8'0 [okW 5za;)F*:`S͹^r/mtֱR>6Mj#7;v5_qm0%?Gdҧa1)^ĞjOL¿ æ?mBL/<^@lgM k:Ҭ^ Ȫ+!Fj`sPC B]WLsf5ņiOjK-!knQ߰&4^5%-^dNo`;+`5w/kzBsic QDؕ6_ou@MS}la decal{If'BXdYb/d7M2o&LA?nI?>u`31xToT+n[G]S+?\کTC14y6&CǓ([kff?aiM~m8PAqU7 augƲ7kE?a4x\o~8` xmlZG̳\_r 02^&/_og+YEY/?"KF"{&/H9'ܹ V/r1.h:7M+-B>|" k<螧@,9dsc$Qٹ ɦ=A"OhEQ-SKFT;/ۉJ95<A`FMMfE=ҩ贡'M뮉C4{v s' e+V9w2~=' /Ҏ_oY>h򧞜;̭u֋;J@D%s ䷱-ԛ$}F-ɖ8{]^ak)S=۩ik#}Wh?5EXV ػo=orRyB<¸~:oƧTPD .pu#b_bΑO)߫iS5X>~:#7ՕVǛǛ6?bOul֖3&b" /?\8aي!9sA3'yOTur}׊l~pz{:-Lֱ ~Ie=OKӄ;qzƜ¹5739S~"ļȻ%;C`z);_4l&v^ sWn9w 覑=xm7w9vu~Xin5u8 %_da1>|A8pϥ-^5&\rbq>&z"a(yXDXq/?GlŘ97ԏ[[w2?k"fMtùwwfkA[Ag̫¿]%q5 `Enο7ـUͲ1w⚩hz"2_1eDl2`Mgkkuu~+]<{kF3Ĝix Fu-'W0fr(HNE&lܭ?U{zaiuy!h.S~&lk5횋M9u}@ \{w]$?uBԬ^iƪ %1SrhD(P~|B8ŮщTGjݰ]]7D3^c'c ӑRael)N_O~=?>_/8/c3V;0Vsgf h`sYzHaPoYנD_{"ۘ|| 7\97bu>S5o-c F}X̦-]5Wksrpu1PyJQZڀ|0׳L 슽>C4҈|b!я~do\Ǟlt<}áTo[*Uz0%Z.s'l/c5[?`F{̓Roϣ1 Fa^?׶fۇ3cov.zǟ:8|Ar7:21n>ɻ5{񑸹XSVG٧;9i+bq_g%}7c~Ǟ&}^ou]?SXsswf6{07T:Ŷ;O5s[ :@?H~+6}u0OY#'X;I4 ~N}XfOKg, oߖ+s7ö(\pp>ʚ='v!%/'cq3AIيAP,p Y0QEvudvFzDd}޺OC@g=l:Va>><ؔwCcJ]O3e=K `e)' 㨗OUY ',:~@},G'Dc/?XWڇ6A?VII+zGIo6u<|(!F8Wm|m@XBoKqפ0꧷?Ye`Z@O/3}{u0(Qs\b85a9kV<X([GCoXuuVŝF]*ub53d+ĿXJi {EJ:ءwb]Gne/؀+簶*!fg N.[n~1<1Pu7*ESc Jٞ}y%Q d՟ϴ6<9yqge!!7pVԋ6_?T4{7/pnֹF>nXuxI`3!#lxx봤>Μ-Q8sn(;uwU|J;?AyG/N;_s؀u-'Tז]h#MBB)duNfO:1q)}?Tp1׬|sqhF _߬oϸ8Y8أ?dw01>c|W{:":u[ #D/uGX a^l6{ON/,ƅoATCNp-6M >\sq`nW'h (Д x=Xl8xY:9t8IF3X{#2JYS`e%Ǵ q׀AlD_LZUngڧLuI6.5֓~MVqi|nA-۬%s'Jxx(S P~ñ]!o~z%' 1_Hs7O`} 3jjB Y_L$WH]ŀqeOx0s0UÜÞLicE"B^NQ}мʓ+qmdC˧ 5]p²΁ ).0mrMb+d=m{x^Lb/z3@ƊQJ8fDGu4u rroo Jr0ƈ?ڀ}`ލ>dgۍ>,ӕ<'ߞ*xJl+$>]{ QMۮz !?laW??oϤG] 18<0a f&{d294K;?l!>xغބсqÿ <"l\oVSp]sTuCe~ߟ?2{1f܋yMUε%e,?jAs?J~ӞbB 5>#M}ryİw/M5h<(>dh㗱͏_>9}FMO+qlfgɹd? ;'jV?``GhoV!c(Y[{:?ĆM}bɶj{?a| l!?[sm} n/>։x9e&mp~1{R4%?ԛ3NP[nm G0G Y낆:zSp 'l/Ӂ6ߠ+m0򝇌Ym.[Ee9EV@߅zp҉Iz|[dM]'p@F"r@lZB$k?bB1/eW [fy+xl+38.Ë6@9Otjf u0:\)9Km0ݘWO{u33q+y[:e(It^gג?^?Wv<82? f+Y>(87\d^g^A>_prS2ѶeLĤϯ0Z}x v%\߀F\Ow}|:ruq׊ 3y-G!vl9~1q\Y0hţF5 ?Gho1yq|G/=7/w4~{} f ꡭߡ)s.?o7Ha-/{}i jizlD44 c> Y?Z81h ~lq78F<.'# \3}(k 3f ן@R`p?M ;1,yHŀydrqC}O QWN5lsk0Rs#%#>}*<{\7Zqqx25ʶ\⿜lS<:vk!e._pIw7/?/"1z?ekP)i QgH<jqy쁸'zٚk1L7A5Mg](OQO덋*0.x-qƩW_G=, *Z>bf&/=&{g+?u"ֳn&..mu/װ_?R` [\ಜ<?x| 1}ub[0{;.ѮX^szK?uGSO˹n3V~[k\n1 u7Cbc:vbwBa="Fviy6)G\ bhq|vpQp&/7?޴2q&M_Gmt|o}8ث?E0|¬6qē lm@[.YG}Pv%;EJsls8 |c 9?҆C~bvO%?v2ݯG}NO:ib=Lƥʑw/X]pнz0o}:&:J}yfu ,De<0>s-d9\?%1|9Ecn_\[?euP`QS|_Qu_s=/! c83#F1'ۀهNW9mG.G7 49Td5bZ@RkKPhr3 &.T d6 Ґ.$(2t죉&6HgʧkQ/5 &9zA UoVɿL\ !`֊ h5OMϡU, c|Qd8D}h?ڐ <Wqo8(soot0IɚluhC0i~9xJQOC\QFs//}79f 8P1/rOˠ>xj{#4{:r%o'A-sdo֜[O&vk]?Ȉ?6U5bl\yń,e\WB\y: ?c^pbꑽo}Ƶ󧊥^ScZ% k>=Q=hor_&(5B9)noj_*?o9{\z'^'<7-oiYa8VL~XC s}jr?/\S|}7[ i߮K?D^K1pyp.?)ΔGHOkO# Kfk\?\`v6dԟѧӝJHy)Oi r8?G3<׆^]$ePjߊqgtqyeBs{C bw3Α;<7tW/ޟLkӷ-SP [ܻw!x >ɶiDAa/e;&VuG] ~w{}d'٬yѥϸ oxzQפtGXpqT`Ԉ< > jbC4ɞ .. n҃J`B0)uyC  Qi4ЏB{ >Zw^\5TE<vG/iYW$~6<@Mn8:umչֶFdO6ǷJIOvB z~?&f`GY[xe݉?㧣?VKOr'YF_ q҃bF$e0A(8t"Lp!|E4;ń.3tp0y&>:ϔ>"1LL'|cfe_ ~F :z_ /ּB'C6ĦӨV&w3Q>Y^rY'׏y{`p. #YeVk}P{ ,uq"'-ZHR#\jzqkp:3_֋}2_nCYZ(?Iֲk+cϣnxS)`en[x[u\SO?xܞ|Yo"5=l\ KMXfyrR߬G!ןޔgcog/=2Š>F(2ANo3kDC\saOr?N;#? ۝{dǤFq "zrK wKA5Q4leocA}LJd|dVcn7A?̹҇i㵒sGi{XCsuh5+Vcb 4:o^d(&\n<^D(#F5F8[fsx̡g-5>|nx1x*Z)%d,8EbkbMW"(|?rUb?Ϲœzzj.b\c|$n~[gCbj'ϬUgOm,=o}X S!Hɻ?o[ǟ9r|EzNZ!oe𖏸 "j;AXXP\,4XҌ5WI==<:Oll> {%=kɀn =?Oܡ;?.s ?k->9b5"DY47BN(a-cT!gBP6eDNUb-O?`UHǩZ̮HM;G,~7XQZ]\C5D>D?XE#)CKCB =4^6}ayMфhW07׿㓮XaG)%|=T͛Fv Xi8c-0װf<~?*,/`ψ8.:Ǹ5ױ , fg֢g-D'{/俗?oSvHxᔺwW!\}q̓Q9YMߟ/($7+v{ e} Q9Sπj=7?tQJqx=4Ƒc\q09Txh,f^Q^pGP̼3H߬E@#E o~`aoZYGq.e^iҍ[rӞM퍠m5\ϲܣl|}(%+w<:.[sbof3l]XFovQp}@\XXm{a$lԑZwwbm;>e@,,庛XoPqD97EV"yYּ,e11 wkwį5, <x>t;fϑXG8Ţ<?ܮ:7.#~h4<و8&:zIw?%'L*o9ԛ2cҽSN\"QʡE7Y!-zjYlm7b'1-3\}S!Na|IM*t8xo.Xf'f-{6+sR)(|b.O2pEy:n*FPY&ǵ'ӆcy]bԟ3K3"JP]ɇd}:%a 3E&W%F9~Lq+G!lb:§Qcz!`B^GP7g?*rȖ,깪=]B6?y5*l5śq.9YK)2SKpU v/YJk6(qk|{'5ܓM E[`cBK@N˫./#zNjD9μM͚<3F1J0;:b֔Oy8ٿw/+h}ƿϱ'[ڇY^?"{}Hc}׸4.?l~럀+Mr1Y+9x<3 ~Y=7y_a} e 96f]\'mt?yNE_zr]o:U!St~y)*(ryt|o/~?ʮJ_ yٿӛ-/?_ZcA_!]oƤA'T?/s =[<J$K o,qWגgUzAa->zp$n.k%8p1V'Sc WfsVJ2=piO#;9.ErdnoWdro?z N<,?3s^/? 7J?)~M7K:L|s_󥗉RgΜ~Qۧ)g?/XO/^͸5Ч&ϓǍsnj -~/F>u;ۊ1isy__\s 7?ڕzDj7'8#.7QƂ98XS?m >}ݟ}2nѰTNs e7Y{>(oj Sƒa_YpNPrfw`S{g(33udoϼ8K~>-b]{x#ݟܘu>&a! l]o:y-웙v2qbNss&\K]&CDLuGk?9\|eALvrµ$/Ӂ'?mm*`C-wu_?D?0:\N ې`#Zkʴ F5Y p9$?9duJۣ>X6 RM5lqy}\;鷡;5zQ>i!/tZG=ذaРc ?>DQ%񅍋coNRVÿg@`ʽYHٗܒ}XeyQX䦑2ʱ_~_ǿ+>2ߟ תY/>5b-T{ >ok\v WȔK1.Oe_J 1ƸryF@_֏A^ 1}gx8R͊w}6t(7¾k\ýδ &ǽ<gxkOELUPmq_T=FU}SeH1Y&Wki> 6l? koOG}WA^SaZQ/9OGW9>u:>hmf>@=FHmo`?^W+~ro"wK5kwr2LjrGe^0Շ> F~osy< T4mwo_k K_ |hڤ} gRNTPf?YC0oV?C9mtl7?0O-W˵cא~kO7?LoR;h{@3}@/H1_>'@5*2~IR\ pdD"W%6@ MbքH9PL*&yP |^נXu"`S @{rD7u?PW?N n{. *_lhO(?*(1i5)[KĿ=c(?ń F'vdR9O-XoSOq=mDPVc`i'ϩk:DX.yFJ> I9z[S/,Ӑ ߨ=ue}6slO:> ?%s6sd>P9=1zet../;W}'BYFFQ+Y=/7#YeaWrʋ!zC&fiF퇀[<}F=Na.^7?V6 7^1p?ʙӶK a;/{T3Lp99>zM (u?2g7]G%e(_])qvE&a#'U+v 풺5XHYً=7AFO2u)Ax7o6q _?pMz%օk()=? }5ayLX]=c?ׄ:^g9 aإoe?6qdž}7hf_1h8K\ϓt 3a_?gL\zN5?MS.'e#ǚY >1]{sGuL}#cf{ko9ǥG?ش 멃EL|Sc!_zȿw c'Ŀw{ܤ|Hu/l~B`:Dـ6cx1ߨWC5p㌡s:wڳ?p"ʀ"k/ 9L:U^1,õ&U]j>8_Oğ{UAkxݠsnu`k?؉:&9kI^B̶\?kO{B?.hevYFbbk%?>z,)/`J}p3ϥ'@p.0vOـmꍝߘ>K)gǼc)aqثsWcbc,kc>0Q:u?І}E_ 3q-ψcvg~۟֐?[ʼn\(hSf?`QK* Ӹ8)Xk-p~?>:o1}u8ͷ\w7و=r|kO`őrj fΰ۵_uJ%g kp _(b r d Wt5.o$_<oic dmͱiO~c葟Ed^S=)6B*FB;DY$,`uηa:GX<1v˯7?g\:>sR Ut\4c6B?^3tQP̵ jj-X'3XCi-fd-oޜ;Gpgh+ΣӴ'}r^C¼S?lB^`/B^KEܿfofhK`y%ɸ һͲ=f#G#vt,o;nM\/;hB4]HtxYY 24I&Ѕ`SsbH{Ho2pP|]bcg^bgcqέqSf69uU}Zu`]cSLlܴOxPcӉJ~wWlt"#ˀaz7nIaV]c5N&/?sH mh+gmp4Qj:x_X#\fg)&b6bPVsb֟RoA|PNa"%O>xqe'aǴF嚔tqh[goGOߞplef"~N VO} 30iUBv^Է_CQ HQ?vS(֕tfd9a+G]%VvXo GN-c6O}Aqa'E̳q4}W8oE!kxpi?brSg2c&r79ufc-.Y#A;g=X2'C|$zl&mύ?o-5bWYC?6{MK./pb|?W7h qqp7?wwٷ?]~`r>PnFh:b!y3FC+G]cOsK-Q~W\cG|q_a }o}g?Pʊ nBu@\n~7pL9ڼoAv?WĀл<'(()"}B`G/6P`borjI?*`9W: ;-( 0|^O:'7*s$`LT5W{M5-`%7GJVV *( X[9 I6 dmp'_\ 䉚s୉aiV`^ >u:osSW~[AD?X5k/mCp-v c?}G]Du0#㈙en%+MrAZZDe!cZ6 ,npVIpLz9T&Xn/s $1qg sK9W94p|k[g۳= C VV-̋!? ߆kva|,N0D܉Wucyb E{erG3'; o7ѝck6s ZNǿY*O这\_`c0^ƃ vU's3^9 ۓ2(9|,Lkc7ThXf?G[ mpӲl:ĝu>w?mB7_s^Fo %)C'Xpdy&=tƕ6Qr26kCy\[J;6F;lz\^35w [>L} 3?lG4ni bslYwzPjf;σq`| f13+{ { }<ֽI{q/F ?^ 翅}_}o%w/O urLE'V/uZD s1[@7 !ͽI9l7CA%9x]I@?X!_΃_ ^ srkvE9 cֈIF@,R T )'!r⏶Wڿl}rO칲%s6}#=oLo?G:>%2W='mƺF :|ƴg 7{Ov ;f{o0/•\}`sK&Շ Gǎ^@L><ֽ9mhsهxA??rA_v]o`ɬ-A3M߿.qCu"B.o $q]uy]?]]Q;eSY>C"n{dqc ^˾n?f IoLufGL;'{-y c"|Z~ D/F'6HM5g܏ Gu{ȡY\3{3U &_A~MP/+oxlW3<r_8|!{Fd~KN?c9r yCcz=-&bٻ!}!cM/71Iʓ$ev`yvtJ"딘æ)O H h)_ʓ2Imq|5@ioƆyљ1Amoў+Nh/H6`m"fƭ.۬Ь5Ȃ8b}օ4u7ֲ~Xށ&2v ?F8-spn>{D/l A(IĿar_J7_? a‚Bn>>څ#0̜5*&^j?kbco vK&SD#I=1p52'U<Їg-֓/b{^CWr#}6&_CuS`k 4my=v" ԤO.pN_ k1㌧k>׌y/>2&G@:T"X3E|xG4>b /Au7eofɟ6l?׼sYq6?|C,ށbPÿy kj-S?!l?\3| =gU8SgkVr2nXp]̮?kUMÇ]?@#!CScJUjKwV{i瞑?܈:mW[W5?m3o([P'z?3.rM1s8cob|m翘_lx0rIC.I5G Ǧ#j?>^0 &#.C^XRѡΩXS$FYI`>uʹ|7k:S3͏?X؟: ilLݧ[qF?6HDB%EObqX, ;CaV"%v5*|&3o)$&) k l݀$?a;bWT߈(Hh?mۆT7Qu ?Ѐ-뤼 ?hHʟo Ll~IJXJ]AWDŇ2Oy>PXXɚzDz_׏w~| x$H+O{(x$^V){#-MQjp;'"[?3¿Y{RlR21w~1L?}g/1aވ94+/ 3|`aCm@a_&0CކsԨ8/haCM؀qMrJ!(j?9aoڰd Ph,#5=^KK|S fd=8 Nj=|:~f?ퟮ}1qhyx\??sEi>,}F5/?o7Ŀ5 лD-&}{'67~rosAK7Yik SOQج7/"-_Wq]@^[@4GY. {å-.>߬~&G]~8g zapKygx: qco,?1ʯx^Jh ^(C[=,+@Ǿ2F-.Vpk ZL|(U⟰Ϲ@7ЏQ?Oo ;A!.ܗ&I>Cܔ4'@\¡ݜV(DI=!Ǥ6pHcUuL|rh`q/@vkb@^ir"Q>IPvI/ۈuk<9c`B \Ѻ_S!r;[<u#jSܧ\]8>{?!0a*m8I1NRB,+)r.>{ynY\?2[|^v"ds.zZ6đufg?kYE$72[ѿ ^D>oG./@⬁cF[GWDL/tt5le>?|5/?n9UZ/*5B_&1$c7ז8(W#4u+A[761|]8|PKOưm#/l (_ g,P ,cFϫVKaTb}\GG{?UC K Y;/cys?/ 6/=KЍ:vXXYŌe%%Iy#Y6DvsN/]l9d `Kȧ ߑ{63(/DMRf3>I1y|Mw?㱿@ Ьa;O gl?͐IfgXKv@-Ki^_>yCaMi${ζUjE)xZ=T1bX w7/oyEg]fyĿ^"^"[r1.`E5&?.}j q8$.RFB ZhG AF5I@iVC7 1ϭ=Qцi)3&cڃ1O2[nQ & H+hiN6 \߲k{`܅ˈs 1(w?UNըMX?;Jo`;0oqu{v2#]xx~` c!%#]Xut۾Hx%\Aْ=brDzJas9~ffb8gjO ?P\Czz6?3>g{(-d&E7ϱ>K){" fOylh:է애}By|Ra6΃ߧFbˬː B = k(u=Sc:ԁ)1j7&]yD`2{P^\B?Qo q O8daNJ~'\翟Q3ߡ@(3\XK6|sȟC62 #n?ނ>2w6 H͓AG1l~dF7. |Sz P4?7E&פCOԻ5i̙ o,=6.i_._AcVy.3Yl#Hǿ[7ч<P7˩?C_=E&U5Ozjv[`gWtwCY(e`Rȗ*}ߺdbڍΆl|l$ȂyĂUH8GˮY2??NkZ %C yzh &M5%,$8FO>{6l 6YʧrQ詧؟q%5:O[hUc\[@:Ϣ: f<lh'O2 $B@4G仭a5}YSl^Xp J@ 6Ubw8eNeb9LwS.5X aZ|x Ni UVC_۟goJNřzn˥ VY0iӜmD!k@暋c SwTV!3(nϝL:Nj["_R G{2[Kz?351hSK_m[l[bz,gX+F2mbHaj:u{e9^ԙf$ ߄c\Uz/:0q^/k=i߿ qMմV8^~n0'=k fVq'_vc\܈hMM5g=@@A`}`hؒ> ԑcOXuN9r$WgjAecOrQhY*FLe`5xPͷ/ wҵ*.&>S=/T x/HVid$ e)tM,ob8הagzgS Ԕam:ʄ<ri@xa U?v]Ϧo6kkfH@aoLqE<͂'YTɖi? tmɏT sq\z >(nK e:3kk4"?0jnMaVut#ib7} - # e A1g!f#G[u2/,Rz{ΤJ.ΊO:ukA=ooJG? Wbɧw7]q٫X 0!-"4gQlpRC\(f?VZ1ie'6__yF{[ŭ:rVPc[r&XXw8NYF 2Hs},my7'9cIWjJ>/4!:wC_+}<>]Ŀf>T)k`?o6 V졥nHgЧO*E0/$qsМ0kH:ȖUòޞ3u<5! 0zdy)™5`>u~Wj2:Y݅ m .Gf>t?c1"#߃יMTo9٧&k2E>J?<+] oX ?_*q4儝X}6v-*lg߆Sn137bSKg/?L8}an9KPH]ZZEdTBqJY jj3/ [E:2xO B_f"m6#9 .xa*\vCT:Ŷl&L-U` 7r'd#jof`jyPF繩bn/kp"Ӈ :_}㍈?g0N5CNɷt?*>|a`(Jo9r~$HeH {Xk3AGʁ%3? V셸=q~C8cO 6]gmyM}[X&ܒJ<^=S\w f=E@l z$cφYd*=eRoz|s\6]_x}1oosf޹\UًlBy o?ׄ I ?sig!S7ʌ4h<(e&؂fמ}le뢘#.fdv.Y$w ]_ZId!d/s/ >h;`;+Sք SV{z :耿mqsrioܒ]m+1}&tO:#?{%Ǽ_ up>RKd}z<\<f)ohXujmOr2$Dbޒkcw8[h7^0k ]؉NX@ৼG?u1px¿HZ;gZg.oW>`pnBDq;?Jb 0Q@>O2d kn/\hKG< ͔ZI9)}59?YڪV|=y[6 fFs{9)f ym=Dg5F1>mVH ;M:&/E9r)*qk )Zw.ކ$_Xǘ-mUm}6G_]YLv5CxL)7a!pUf0vcQg 5̶/LW1^x]_yO9+9TDDYmzLo?&)O pեʥo/Ko/_7bA'揙wˌj]kp W יl]6~{cŁlڲUY:fQtg."mu)1˕- o"&Kpvv^߆\1~OuM&X>HFÜZ* yf7psn%u]׻\Aߛ.)KXPfWOP^ C2>M~0$ӟԏ+ZNT#}]os e>-џ "רxMOM'sñoS6<c\| Q_Y2?F{hsS6o'LทqK2@سϓ3x ù,ըR퉨1ù&HG[1J? '~' &%h+Q\@\li˥o2H@:58AQq3%Y3e|Sn F哣bSS&G@|0ZYWφ,}*~,ʹ?>_~Ǜ0f܃Q~k{?[)nٌ Xo?gqdW3eVnb~4}dc#Jse/)} '!4eƿ~2mڗ$Q7&+G1?,{v:`/NL+XZ[˖'r<Ǔ]n>f3';rŕzGlSh铋z|O~X :9d)g E4}R{*Ͳ! 請/\5{;7`Q+cs ہ]zu@>fvlpYzf91 )jAbS0{?O=b(>bTa]v0/ k[߀~r>SK"dBeN[b~}O;}? 3+N~H{>x.!Zh+CR?@ 7%g {/k Cq1rs?{1֔lש#(9e#p&Ͻ1Kޢ|2T\Y ?X=#dA#_1Lr:\[l3/`c@/(ZA8C>X*s>h}߈ʸ_ ;8 n5ƶƌMo'',_ӏ[*OםW~b>yρ]2|6o4_v3{:V(#Rcu2>Zp.8s{=nG5L fs<ɏRf?1?gLe75޷w|#Ÿײ/;sv+ꡤkٗ19+ ~GiL/YɗTKr=>$Co_gmg0`@ӈ 7?G.jp26Ympd,ns^?L?k޿bdxx:oo}g?Y.s3mw<9a-r}O\K`Æ筙s},|>^d.73YIup:a%B;\as^ z+lלLY~?5J$ߵ F Ih'&LA'e\H~ i\[aB{Cb׿_w3t(Y[b׊?tOGoLoGm«9)x}PI?TL/G%+?x  }  i\k& /#_?eW ŊY cڽ?7eCn0~12mgmtjŸy;} ?fmF|hזCxx?_+}bLLc~99#ɎXjNpy~}uO6VcgʣJ.ń`aBf_ڋ!FgDo o[?}UO{;g1dԞ<=7_0[bou7"9i_ppw*SG8&ϐ_soe [鼾7v4׳b~suu`^~ԃ^@J q$(TdY%o3}߅prڣ5U߁Rl M՝%/qԵ >i.s@D/ŦaU9xu";g~y?g[_bOf3/5†#%6.9?nxnXJ5~ɫ_̇9 R?}?yנzXOj`b7vW`6=hxZ|E26ibJRjB}jz֮c5K`S?be)d򇹈W/3V:Ǖ<7'/(klUg}KRHϋ=ŮsMʋ g4mv4So2{B,1rHO6qiV^|&Eٓ.]dNoǷoK' />Y<߬6uY ftIռDdiKOrC=~!o1*1ջ?v:F0;)> MZ=7~/[\+E#O! 9J䷙7|sES#?f#Ϛ߬)?.;S`=2a㺿s_uVMm? {Z`6c?מ7k}[tjqRsy%ouqKh382mpſ> EL"M׎˸j71Cﺝ9cd܇8?V?Zc=vb;g)^l'_Y<?L ;jkȗ0SO#퓏ŧIUW}?dC`?džkzOsyEFl/ա'wGb$˫yz -6ϯo~!q,hpDd Zp)h35sᱜ.ؿ䬩r1`l8o>ў|E >qqH2}~!l0$fmXS_|~Ző_1C}Bk6?7>L}!щW mQ)O미̬ vr}[10eO7kO(Vx-WlʁߤGaMi\1]*ǡo/|| ߗ >[?c+V1X GbzXoՏ8qS' qWj)-iumr=Uݜo+zRVg df[Kgv9+*Z=]˖qK{კ~fZo? !sG\ d?;(y>/C|vr^pB2?Ul-rhb^yemǿm?lR6,SG=M>ΓKk`]|[J f#?-9HEʺ%[`j)ߤ 'XQ_-$ >^}oH;gy34E%N12`ĈlҷtE7f<^4]&=Ρ-Or_lMR[_72n?]1Q_t_f{OCxƐ'#>]?^~lo\>ƔGz{6b|? U_1so\dUW\&&<{T %&m(<gmݎ,m!zk <~!O7cvu| )Đ T/C|C/!/o$&;_-\2På&gR^Vk_'s`ܞ-_O]A7?_E˜*3ߠ"[D kM0oh^F{b8BƦM伝fR4ŗIY_+vMHJHXVqqO:i.h95~t@c8'-Q= W|5.$6 ZM5lV>~iUtJMoVXEe$Ǭ m~_?`YOz ]1-E;kC݊gA_fK{_֎8n?z=E_ [ё&rua**g2Wl W?g_%&5"^EIGfFü}A6s= }9Iڞ2?'n/ ^ofg2I?&[^|ܚSjl{?o7i|!C5QG~.ՉP<){o_Ƿп}.Vzmka7`Y6WK  y3 Cm pߋfM^(yX&f ^Ď427\{ĝ.S88;e^{ŝ`@IImjgyO \:wj_*co ;79T:T *65t(G?o5?*Ϯ>@{6y]pYe ]1y~L:!gc6:d'>q%MW{6rԱ1*WmY[c߯Kߍ?aQOէ)it8MO=ns;7+Z:^O]=rl;H}62ñ.vNӘ}#/Q :'|?11Ӻ9@?"5Ɖ</f;U oɝ+D!m- ?ױ:?uL̰[ @Eq`HP_m~?:`T 4Ss?)mVIlc9l(}k['sålіX? 5.sNYu7\7_M4Ue)c -PMbw2Ee+qKI=i&g#_6c5?Y㌝ 3z:6翷 K岾 q̕?7_la}O9*c &ivE׭k' b.2qmփ Dv6%Z]BCv][iVg9A'Nv{ rMpm3LL0Ï\nQ#)Y \7 Kkl&2c.[ "!2m$:fϋh*٘җ_qMAG]| C 鈑O%_^7Ϗo<o7M?ɔTOP]9pE抡_o9 pf^,"DŞ1.w~D?ٖrC mp~^/]#;NcCq|ܣ^Rxה"(j-d|x> qro7GUzqL7f'ӯo+9i?GԿ5t%5_lzY۪җ4<ꐲe߀I6C!'K?lueצ◿7}Ǜ_TίJ|y<76xH]iC3m<0>3z֑ԡo{ \@Cjն3_^)󟡖/ N,&Y +{kCx%E3Gcs9Ap1K>i7 .ZĦ4{IVB?6ԃ>Iq[O9IƱl6{inbpySo=vC?C|!^{s=;†o+o}3+D~ڶqkߺ?+߆9Gƶ_%ߤ>_?ޚޗ=l:T]8p{<8(6]K|v:ğoҫ$Tk> m Ruj~Gɽ|;wT_[uԼ:~"qn)?aoI~o{ګz=lpIzOd_ufyj9ݣϟ{\ov9k6S?g]W\63,/7j&op lۺ_z}kI 4k>)8~E79g5ok1ز;,=c '_4z >? sXl^|^z+_K^2QK G/_a6?c:'[\)5򥁛X??=S[/Wxvd 9k/ߘڿdfN?g6_ZL^O͹܍Ӵej ܸF}ϙ qٯۺn_/iMmr?/{7߾x|\ω 7}X#t_8ng_9}vk&K;iIoOpb #L+5An/C\2OqQf_?72fjB_0p/?KGs(2Eu1DTX֚dd[2X',B$L(tOQ\tyhOé|**-Dot''ۋ?m P!ָ:nz^|y\M$nK~Ia:ϋs*OisP3D&!n'|!Ǵv'fmb-WjJ ,lp1eNjꙇa_brP/ԅkfCaiG?WTYou_\p =oݿu=KʓKueĿԂk='7u"sJ|yENZ/ms;WԜ٦wNeaReS?ho .b~F}԰2 XR?qzu&.s ۅKeþ |f_ u^a1 ;u=ZW[3>%_ޝZ EJLx2;g ,;Ks4kM@?(~b8^#ޜ,lt}̤M}S?(âco?(S_V~- f^޲gI~os<?~io_k\v'aaSFlf{'o[}%]:|lu?lXt's!5en oyg&<n[1$7bKĘUη9okr?̍WdF:3[s{ye MrJdNdGTT(dBʧ̔cF9drm,60_ɁBϸ-9,& `h"oa:':7kHyܓGuna>Ρ#u]=~z|-&6%uEI&r:N7. M`?4n?kc/y5}!M1ףx~և;}4\:uqau~}x8?A) LvĔx뾸ᴹ?MoO1r{7?~iK۝e6.[OO?e/oTu<[9~z?47sX7'vkz_]?ռs/r#=8_=.98[G<׾.5rW_)SZӡj'"e5mzj紎5e|Zqow-7{u-8녳Zy){?iW&)^ScӮFxmQ?ϯ1k!ϵ#_[u'Qe?0>܈yxcKڍ[}_ԁ>wD\˧ņXh=){{{lEبMC]WpȻH LHmĺ<͢߁l8Jl_ i1*@6ՠ>!y}"~~n>%^G:JNӆR'9uDeǮ OGG|.9?A&"~b -G5b J%oIB׿~η8֊zev;D]OM"P#'hI{ Okjՙt볬!QzS#9K~OalV?h=xZ=F@qjއ2Wnw5?R mY{@rr31x¯-z HdHE ޟneUVoH>\?0)ӎ"Ƨ[ٯaezMoϘ-TP6̞٧3M쉝%Yӊ:Ay^xk uuvkOV}q߬p1;7 vcTCL5O\+6QFޗfJkʀ:Nj/Y6|C蓏?e+Z_Ġ6P$iw'X$^p8_89H&6do+gw?L:b);Qoy7@$qi#C!°ic&]u=Nb'Q/Ah]k=+3|Ƨ4ʽw o=$ۿ/q~cr?'#WǼu GuGYNYxFJ܃D 1kg>B#CjrS>V?լl; sf-Á\<gKj#UXy-l( Wup/80ذ ]N$XwEwԴؖ37;4wؙo"I3hu\/qF62, oS(ci{!mCv'XlDJ}uyIP r.671\JK~ Kz:?q(=挅Ͻ8/ćdu;d ؐ봵8vlOL/:zA\!*# 9h\Rܟph֨b8KI=?]{Ho2@oYXO?`p>}0VŞQO}2E 1[uQknԳT> I|/Gm7+OV>'ܿ}v!>O[v=1|Ie;癓6k1+'8c 8iŔ!=ſyT]``_fܕvs" _ϠPl>,.L91~=%s7kl,8bNPO'Z [C^uصoVۅ 5 NRϏ;\_?vVSndO(9oA*LZĵῖSޛ{OOE͊Oʁ+'YC䇸yKX;\15Q*$`S`VYצQ_ y q\-;fCLjaɯBS#G=7w ̅l;_5gI8?lnj7g.M:(\?z_-qgq_~?*?iK->kqO; 2n~VńCl.zBϤk!Vl]6M1h_Ġr.1k9ki%<kkn}@)jVȇ964:&y٘ENEk X&I]^])OiqC]^hBY|] HG/U1cMBA钒\/OLPthg:(pq* w̅I ŘmbDqy%C iΥP[p~Y-6Z!HOkCZǺ;haoQ }U_˸1[5SB/o7~j?}<5ofnfj1#5>tyXO{PW7qT #q0i4#~+QԿiCχ5>տ}G >O"iSYPwz'2ˋNY〞dF|7y[?î`džzMڧ6? v1S2ojh/TWƒ/2jyu!k/~o`ZqϚ}3ϗ*c[Remn?ΧmE8Nډx39c¿wim;>W繫}-m悻`?K$*КlE'3îxد8*ڃOS?r3r~'[kF)ƗA:8N;̾;?&<m{om2O|z)!~Bn ?|٧ڵ-^\=.ӟl`8}H+8ӣn HS|?'k'^M꤄A|nǹEP#6`Phe<^!X5fI[ ";{*ON(_mº^K;y;5l=`b`Wb@M~j4=Ags1/JJ"؜QRc]2BiHz)aP7w ).Yf ilc`ik^'0} ZB VCSv% [D9{0Ḯo,.taqď|D.&hOMo78_~=<oem\].ź h&|ϤU7dlwĐ'ˎfs5 ]1qA 1cg#d8v= F. wINZѹeqϙUkEgÿ<^7Uډ[Ĉi ĭw>1 8ocs=x1u C٫cׇ!ƶ>ZQqĿ.A'q5T^J{ſC+50,ޤ+bZϷGK Z7A?0ܞ?G# _^ :ml.vKw뷃s\tpR }k_Jg5cV-/89f~9G}_ۧ=Ɵzp?ntm?ԃ^3c>8?*J-/r~ks{ƫ\ ]Ϟ8~Sb_ Į'AOIWb2}̋j1A8_l/j&q"+7?>DW&bRKYswX]3unF#>%{* b+*!]5v$mfSR1}o%P-\^r6br~fxd"]_]lXhC,?2ތմfurCӆ0D3g&lC#..qɘ.MݎSa{Y߼1s)0]>ߧ~Ydj_fS]uCL֩#/16=1{CÿbNлJ7iI̯ x'&b(px6hC !9f Pc^0iYJ(|Xt-raH_=6sw.0, "=}O4eULd?x'[/q(:' s ˴~$J34Z8^/Y_1R?߬-v(nxH^XW>.Bx߽5~ r,z1&x?r^ lS"#[\?N? 2o!50L1[um71~(s+&Z}0\JdL0sT+41 G&biWosφ(&; ۩6}f7n|:GCG:;ޚǿ??&dPk {W\j ϥƇfńfc<1<\Olm{sL3b/$b"R Enyqf3^oKL#}'Wmty 1]Mb9Vivɹ)_T]ڦGhq9׉5gNs<[w?낥1`{Gov?XǴ8A1e^6Wv :l3b|Wbgrn$>7U ]Co/p?ۓ?U/5wPڙ~XVo.l?#k/BzJsڲ}y<J*cX"wa"n#o7W}!/?''mxQW[O[~cve̕-p^bFi7g8w'WmtY/ԪkW K]z.7rβKiLk?MN1Tq}$p4$e 0Ó;Pm& #ͭu 9&[ \6bjOmtcÖ2Aͧ%oȜjO̕c[]4 ތ/ ߑ؂aJ\J\{lʁ||WNڥq|$ݟ#&#B󰆈`y<#6qy//<_ͱ7:7/l:؃&}%><ի{}B 6:\u'Z+ԋۢCr4UkY_j@Ok 5g!ǩ[O%Ushr[r>|U ÛjO9}偳 W6\?E? s0 œol-'̰d=*>wg<~HwuM|G_l|T\C{7{{3ero>{ӷ%9s"".s֊N=?mdbԇ¿փYj^Le=!*¨1-&/r+{Ki]. $iT|u^p䧈\9L9AXC?{rH6KhKѳkr Pǟ:> 9\ _[7,?˄';Sl92%]?eN{O;L~O;]p5"r1M[;^¿*܈\oAM×lFQ%Å?)N/O%&)ڠJŠo53R$w-ywyBYTNpcl4RhǁO4h A5$˨ 'Շ6CQp9%d-e}L.Ūk{__ v6X žI8*&`~7п}Vf)[ b&G_x 6/>)H|AmMe7yGv F?ӹ6C1i6W,Ltǀ!U3kLxr/_-_of79P6]c]Z+7Nho[D SbnUw.=6¿o$_jb}O{#O _Qז}.3 K!i|?e6&^0!7_t5 ?vmhJz[TGboVc ſDW .}>9?loCR _qmb;6?a9/XZ~#~Z;Me}?wSl&c/Mce|qv&*Aڻ)p,nխ2] rK3l&b3}ESM ]h 4F :jRXˀ:pV\6>gmi+ֻز }~Rwe`OaS<`os L*6jЧ2цT{yQ=bI\ edI ~`"~?߮8SfVȄ^[:'ro2(88 7Gu|eÿ% ~ ԓPle粶=ӧ*F8)zw3vpTa]xQ#FOD_r8@|8vs٪KYO׋vwӌ/uiڳ*zs0pK'R?l_q=iUJ#D!ZIr+o46\_kSω.y\Rou?N~(/7Џo2L&}OT 1{.C[q p0)ZtmM#v~_5Ct:70iAM*OǾ 5GKg,[M= jZ6Fj؎|83p-~Ռ\2C8d Y3QU|qHblm'hm9vnk{e̟gӯb~f^r8cDWo-bfz-s%0SfY?A_`\(f9ń)/O;s2mn2.{էoh풻<ϯ/o`|L~Q[4jiR,E+h)U{ufD (}By~ &1a|WJh+PäìI'?6ft 4)PژfLm`P]smO Q;K3j d3OZS+F'y"3rm-E5no{Gق=*mr/2ͧ ׏!n?hE_۾t9x8xm82Rf`?L`#}gAEFc ,zHo]L|rF8eMC?mGo|WS!mO_⟲/kو~hsmu(2އ}ji6fw1af--yO!5W`Ͳ1O*lmbw_z:wTbٓ' BL}~MBjg,=qӟxӟ90Lk=)'2N|{q~&Xݝv>\<R_p!7ֵG+sׅk=912?l?kT{Ǡv'=V<3wC4ow ~$s_uY_D?cWܐ3d61V = kuVf퉜.5O)V6$mN]SЁuW bDţ l&\A&2ײ"{F nhp,vr76/Hzamo} yuJ42 Uq7vAH\sa€lpY5I &N8=);-O">?~>49I~mu_6?Klύ c. bQ!3^楄@K:@9-fjf 3ULTb*gxp?D2?df̺/qL_(o0lC޹4L X`m/0(ʬa>6ȣFޥ=`q7jV WFv"^s\u-MvgX%Xп\ nV}>?o@/~oj/h'/qYG!*k]ScM4krtRGC=]2DvuiEvaޱ^;ulJMms/*VW3{Ob]~r#:sQ$NLl yfK -/6 쑌 YǿĠ?>Os-?`[z,>3xzgV.{N?q6*_ZS6E3E/q(ԦK}Q P(57!H/u1jnc!>r 90-տ]F>6wkԷSS59KINzf[O6;'75XWlלc{ ONZo/ v3^tNFz .\΃\Y/∱HOxc᷿OcO׸&OκwqO7nͽ7xς?[nO[۔,\C; +Ks0+/b}o>!oBfmO~LJmvo_Nf0C%tc(e{t,ot^ٌp2yU.P>G&_.zlNnC/k? .7Џ?[r}I~s%\/ߤ>¾o=g3h q\J/|(u2rr/\NAڜ?7_s6YᶏßoL!ùb}l75TOd]CxM͖[\T/DI&|Jl6SϺD[7~Xbbr_b!7 3qE#֬= c`!Xn1$~쎧Xr,٤}64`P?1;6NXѥ3EǛ/zC]J_(ɬ=qU'!^zWz ?8 }'K6ir7_e :v"ӌ!讯nBrBBHk/1+ryrv-f;P>@x:ozcQg/X73)5 \W-mc\3/Ku,Ou1%uַW:G&O'#nb;sv]qM/n翜+{75Ohщjke8Wf ,s#*{m0md$oksNe@paC꺛Sccq_%'|XTħIߗ"acuX =;Ⱥ$7/־8V eM -6yGoxQ[/z rnٗC86]ʝa{Dyp6?u06՗?zk=[j^~nk7?#trF}O7@QKb踇8g}NGS~s܏/ޠIf_6ɾ>{/ ±o}6(s_}ྻǴnϹ_̷ RFuqr;z/lS^y?Y.xuǜ;LZĿ̂ |e;Ω`W;U?;A2G#6>cO~pߤчجZ 8?l[np69CTO 6aRQ?Ƥ:~+CZxMz; zDL{D sPa_S幰B1$)LKb~$ӧl\p'_JRc{|-.?6v(g|BNNWeoJU0 |X}*}9Kbl?,S^ fR| VO_==i"K L _{"᧥ӷ|20EsJ}}]/$FΜ6並u؀\fz ;u0&v|ozZmM?q!ԝ\uԃe u?cn%nO:Coc僲4p2߅!Z;׋7ny"1\7dTsMM0}{BPip2[sYW!tx5/]Ы8y!mSu̟o?c9p?#O;_m(?7=G4W1AW(J>RFms)~=ϼ{':n6?@L'!$(l~$2l\m'W:^qA]MqI&yV]Fo!ӔeT/' $H[O~K1vq ,&S'S0>Ϻaw<ـE{OőMQ#Źo7˒PMd@ 1MIYVy@G |y]ؿ37N4S3|d7T?5lJvޞ?Cͅx%wVs4gzACL^oʸ} F8|miO2ƧǶ6ZQܟUġo՚.SR֥eހ[d}G$_O|yMBY!|S˹1>?.Fa kJ]K) _=لϑuN-rG Q{[sO[y1~?MBthĜxb٢AмR 7}R3kx.G#$wzۍt-矿)535{i~䌊$9mnS9eluԀՋC՜Pq~&??-{\\4^2Œ'SofO?ԗoգGMl?fle>ufmL=́$ ֺeAR"wa?^z_i6^״=]'g]8qg?8Sw,Y- ӹ>^˼PƦ#?f\ z.Xj3We:گRGy}s?Mr͆ԫi/YQysݻ_} n_?Ndž#֞w:~5o } * Z@\9IFyLٺĆAwe ѾU1a/EKq N_mQA='q>]9lCQuhI5KLӿeqC&'Z}^0 ?c#{W?WǛO];k#lP,<_ KlovMmKyޞ3uj^ߤښ^#/Ǽ;h~Q o=z<&QN^{oW3愹6"Oyws:ԋ OK?=?G|7fk_zeotys׵fuq+UFז*ǥwG u2sEoRWnMqpq{2|b?lw2~~F^(RZp7]iCoQ] ha,?߿So9f?VFOd D1ݶjܻ0Ko6A7 QQg¥. `aVo:KwÊp eb,5} g8'*ou޵Bq"wzB7զbFIۙ[hѻypvv;Ee2o_ۀ ͧ.?=,_S/r'yeN֎}>v[K&݆߬ڀ;aMt{>v(GUmlF\olpъ7?aXs5G/`]Vs>MXdžlwU8yPG1Nf 6.zcz{ƺtiNzk߬!eo_:{=w'{Nw \2uիlǠ/k Lhqm6R{]y];54$2\iT,Cg{5ܡ9(׬?=v:e.ۦMe\1EiՎb< ӎC+߈]vߞ/IM ȥA6T*i#x(z$%;]/ꓰͯ`tmj3%VT]p['Oh/{bOG^UtDC|-&rgIKotQ_z} "@/[i[YDP +}ƭ{|GFvQK:ôa¿Dm7~y)ܛs [˵}wu4c;~Da5P#ǚ< ੿YSd>}-J]s' 2_&578O[?y9 {hxfƦU\ mGC97skD_c; _}6қwW4NHMyƎKxS}A~@n #nx^拽<~bw}}_{abn 6_\؋u[ k6kܼ>}/뗺|x=\Yb#-gkf}7];N OYaWOk ]ۮүo}ďx,t4/d샽f:'uM9>OW\7_sGGar|/ePKӎނ2ֲKPC/σ!msk\#fMx/MLl }-O唔k˞؜s^fϮN|{ Sw>> ና{#&KSSye¯F{9DE?[ylhL 9-2dM hFʋ:X2 `rW4Ll9D̗۱\]3JMy:4 Wb@rk|š/K OX>f[j>*COOQ~?~$lC92zi9 qU<2~?_h_tB8\!}KvDh])[bI>Qow͵6,UEh ά}:ȷ7?['GĮvh_&CO1wT^tSu={L9W\fSh" ٫KmGd%W_zg?eCv?/ܜy-tp;Gc^\7򍺷1 cO=p6Bp?؀KކoYLrcw`s6ho#oGD0/ѫMAܺqr / ֟ :δn?>q}xO5),N!gQO9܇?cgv=77~9[4 +We/6Cb~q.c7͞6tM{Y\\oX' k_~ia=8 #g3Ƈ3 Rbl;;ȣ}'kz Jǯr-Mbw9^SzٖٞgSo7f剌Kb4B LM5*$LW3\Aז  NT_WP9oTD݃EH;5 Fbo'<6PF>}4X/X13 "X35?k<}ƋI*3Ǜq>]0L-c;}yK_wfaoX6HBzM_+&Sد͈7xB`)>16r[Ȝr&{G7\Ӈ/{vCɹ}-YܛQN;\yԹkիԀ?ֻmz@qϞ>dMy8`L763']g0~mfmW G}ƀ͉^:rY _*} g2P<.zsy?n?)ǚr'?|SΧz޿+Wy>2?0h*exKM}올u)GS<)?u4~`AGL2L{6$k˽}XiWL^:[jo:oTP̵=kEٞ?gQKˆGSnZ&myt]o#?.5nNνs?s \3G.8,{8>? 0 {v]пl_xaluYO?R":aɹ_[oE僗q=OhI;W?s]hcuf_1TXzz_|{}?b 2;P7я'?ʳ?ĿY.?[?w)0?>q *hk&{.5f36>}kn;y>|v묵^o3לbƦ&6=B5# {LSO %&T;1ej09+}\JLm|ܘ_l1='ҷ{ ?Ƃ']g Do Z_qg2} I}q?Kl.֬3D9K1կݤ!' ?:Qz[ou5ZOCoH7ݴW_?kʬ;g=}wD2 ?ލ+nWNoL1`״9uշS im|ڞ9#7v?DzýӖOQ_ly-:x%C3ā[bwϤ[W!3fq:2n+_!cN& ?ՖwqS_pfJ=6`S\1PWek_98vu9徭WϦfȬNN;qa {\87d70[u- Nǟ.я~tNzwSQ/N uAKEo Sbo>}798U\봥ItQK=g¿Jߠ f?oO]= =lĿ]1`?|-?d2}ԁ˷8ڄYG_)16/~ƨaeu-\2R&MHY?1~ِfǺY.|f;jOH|Jib2ƜϋV, C@k#1?MG֮ǂ-n}ϺycXigٛzӇM 0] .}w\u ]>8q|!7-/ؤ(̾>8G>3HE8| s)˧VFV e .{!$.$ 6YlSϩ7/oW`J7l%j7v[տ> 16ӸI?[G06 ln6TP`b#in|2XyFbWt+Fx1n?n\IepżXgAevD}nV1$MO\R DO^<[?|{dqOۧ^f3/yW0XJWq~R/os[:HJ-huzrß\/krk5O'f >\Cd+gzodf?l̰?cy¡z_ K>{P[AqͱhjX,gNX:7 OX5fosmf[zps6&J;gs*J?t`=6[i<8kuIٰX1.T3WY*C)쑵dimkucUnuVKfε/훸q߮yx;M8^t4}}Š֌>PN7?{P=hA߃usDk&|z:=j[DLdl)DMo9|_\ħ=/~?e tvt?q+\ܱ}'; K|Cf{?k6qĿ\83UXs8Εx}1qyXO[•'z o`JWz) G/=/<:1k6`Z~zܾw?l7C.n_m<3Zg=O?i7\m!A-JHlBv (JIGGkk'El7@Δl97>)rm^'3"ڷ$GGl_p.G2٠WǛ~:W D v<`:n>K?ɖ~%alC806u𯱂o]būhk7iGv1rݱVup̉@]| NK^l,)x;S={sD5_0+@Ym0C{=}3٬9ʞ\wyR2&;~fevf}XPXq?U9/Q6Ⱥk[o^j0_Ő*A Nj&| /\5N?jyY29AJܯ?gu/C>C4@7]?sOٞVzXS|EG>-g6 7{EU#cN'us!i]E!_gքX 㗰x-E=V%g]ަ'(+Go <$j/qFK5{p`xY'=ooxeif֌1+ls`_wS+yG߁Oeo ,9&:KzT~]2B YpG6ֱ ~I%xS$<6Ic¦s06E2X֧r*3HӕBdr01m 2c$jYS ki)ᑏB^-2MvaW*WIOYKxSS.Mϵjj~3'4@3YsSbLN\T2.샮G`?'_=8%?咶_K~cTW6DnK/=)gr1_} }ګƜ,cwv(&тc³[Cq-> =]ir\gKQ"Mu5wZkǑxvKP??uRfK eK|1%/kCcπpO x ݇^WtX*Tb_oaG8mJ*9ō>se!!Afs]o25GQz;Ǜ/H?hz(s(G/n?Sm}U3Lk\?͖r}GSf]0UnpW/|S*qoY{LS28EŖ:n?\=>8мs$.] >^X#^4G#1k)s{2Grp$n[r]Ymfcǟ:~=f'wosmo8^\:56_jc3NPToW?Pq"zlv]Pn_li3T}f9p}[{2}Cr(~>iְtG=Aa!ps6/. qzwiؘX7&:X ?ǧjqdzA{ayL_fuFRKl7zzXfQXd:c(.W?} uk2_>.v^of  ls:3/ׁ?5l lE~j8?m1\5(Jìfs/~\c4~1pƚ5k6~#s;g oMjD[z} ܂g˛ 17{{,z:qzksC]e&j] # z 9Ǿ/ֹS 2 W1Us|(K@g<:=&_^,o'x^DajΘEɉAO:'X bE?^\o>ޜzǸ0A?Ɉ<7ߴn֙^L֬5 8L'^_47b*gvUGbHYuqoL ?2Foq`+swK_= \fg3]koe)̋joÿ g=Jz{,փ}?*pSLy!cb'҇6fg?n?>9?|Ӟ_"x i4eI?\_}fϟ vIx9gS?z7)7` k!1V+`Siv<p76-POZE̬=hC<}fJߛoekީa}6Op1doCӆe3f:ڭ Emfk@iĿZXAF')6Si*b/~ ~fC@ bNYQsYzG5oWOq_i}j>E_OVcb@ )Ni˲#jXhg=tGV݆<1gooٌI]tls%1(u5'F:OXrO BDL6h#VVm{%/PB2~rߌl{:fQ9\鹻*]LJxY9ϙk$N bɼ^e[Kmу Ϟ 9Ix3n /熵}uk W_^lBU>|<, +X@;:/L~7fP 񜽜b)̔*G|!WE^-5;VrgC?xv*Ϳu|x/zoG{?镼\$ҭXo3m\դZOMS E:0w85U;F_{=e?`$*+`C+5.{9Uu 6#n?):_ݟmא-GWt T˼y@aIMk;3ގuR^7~49B֮\l Ş=~rđ\/v' =Y[_uh]βcKyR쇎|)Fbu5ڐ!>7;r\’ǚ-Ϟ"lPJsMߤD6ݬR5z36&e>mا$[X@.idqlV,s 6:mZ6hE}[֚{v1d;,*y\`O]RYmFCdևti׬)?{ބ[LhR3LW,?WxF)%j 19%>Vn9`iG/cyqFsDhQ="Z3?9z[ z^9Wa e4yӧ<3DPCVUahX`/>)<91"9*}Gb[ր>K.Ӯ ]u6KY7mGZ3Eb [{ok77_7:?O?׋uuO㦾i2Y߹'}hpYc$J-0.~p%_e "M͠[pn#>uGwrFwG~/fcQT?ǀ],_Guf?_ޗ_n~_MSKro?ذ]/v:ŖR;\gk`n+G.4FG*v{ޱ"o֟bb?t7iOls9|o#bb_lz޼kZYyMo>6.}?p:~|?kIV{@[mf@k-?1WYE`~'/:L?Xõ)W^=ZU~`Oofq"ŮǒoË@@X xeNC6ʺSRmU^!@OLgG5|Jt> Ab^>DFE$+rJzd37 kGodiāM>ĸQ9d FΟ)>wH䞵VFݕ֛!׬OO[\\r]0ϋ/^;~[߾yNSHlxM 85k ¤G˫\a7B.s5#(գ?k$.⼶|?q羇. ^i Yzf zuBP|3'-"3'w$/7>0wxyƆſSڃ"ɂO 9?q{~8m (í*s[8[SGL㡇cFL-qHc㓥G?,8~.`Oi?fa}w6OnXUxkd6{s[ \ޒ0s{[i<ؕ>ynKB,_-69>\u5~)rV6%vϰL7CojKL=?}p|io?J $;8SrMfc= ?mޛ.=2#k?˜wIlo 浏O?uRuǴȋb7uim{_Nxl_rſϮ?ͣȿ;׃l+@,Wyo/ /OAlz;~&#GjS|?}g `$-k;,@?Pn`LjaۛUa'sf]p AmzUǐL^ ]Flbh5sޕ\njw5lʧd ܡamzYL:mg.&[$W%wTv[`砕M3A>AO=7v7|yo~|R6c/`v6{rdq2-Ij `4ڋQ*b v`d=?~!oo37}ߎ緻>Xgy/X,>-9 ]XvS/S}lՆymGs1b۲с:#}A[3fRKoΗOlʭ}_ tz"{5 麖5~w:*kBj`/=V_}ZKLd^FuǘL7)W+C3%7Ͷ)BN:l9)z}-zQk545c_bo}e vbU?vfՉ;_%g.Ԟy&e>kzuL^S u))ܔ+M;dO4y Ú -P?rx^j)jsz}Og6L&9r`_^χI'fG]y> sYrܟ 'sk2rO|NE;LSwr3w;q)g]_7[e߬ol!Evkl`7A>;'=C8<5eOyw? 9T*l_\mN //DWZfl3|f=Xd5&e-lſŮ @?0?+9MN7̿4n34QẂ1Um-C He:wk7{_<& Ϛ1b-1{~&$F5 yαſ#(lª6J1lVRbx?Ye) \T|XDĞ.wdM)66?s%QuOuI26yn&6o_TUɤWЦ<:6Ҷ_)kmȹyj^}O^ǽ6i/mx6 p )qO_W_% qRSyʢ<}2ry|&OzY'ĩNۜ/92$:)!&ɟ^ok`K }&θ{0c%`6\Ob?g5L)|YEJuV&G3MЗ6h+$R\>!z e/σH03^d-iۻiywߍ"K]O5"{u\4 ~-v -+n97p{_Y_sݯ7˷|1\x82i܅:ϯ@f>9q^#9Zd_|sדJ;ܥ\Zo9r`4˼^u0|Zϸ R w)1 GO{KKߍ/5< _!7&)y-mjV 2 v"_ujsK;f9]Fd\6j~IoY2@4ProFqg ̕㼮*i?㴃҄/sӆ%ւyG!uM螭fOp~af{CG?lW=\:8sӚ^Ml9hȺx%/k]_6ȁyq: ?u\-چsNyQqd];^~zzA WHeЏySkW%7z!`)!/=QX7$/COO͓m:Թ]#1`[VBx!°DN_RK.=,̺NkШ'Ho.zv6|++\Xd. s^!,ӤgE l;:c ʰi#ND1_dӐk% ?y?<_򗯛_ UO z@8y^Nl:mfB17XoY'KRsX۞e:ȌͱZ1)O٨o^<*kQ+'ă|Xq|:`hL Kֲ[%R[M|b=ѽ\ZnLE^~x#Km=NIeùޅ=x[)(Sq)g쌷"?JT^T%ʾi(V1o{K<%|g)'gΟo'FXf/ o,YSG-)?/qJ=-u_Rsejln:HyGH Gߥ)Eoj)l:Jykm>7&yE&P24@GBY6ϓ,l[']M&e=c`wۍ!t;RfDg9+ǘb ){{B%7ژtHӦm/$f^o KFSMRƤncsn>Wz5n8#ſ)y>vySo~?fL/]\oc_;_|a<!I'd{&sO=sڨ;Z#{|GMnS?務I&͝auMw2oj\cm]?cZkՆ?%wg3-e>r:pUr|츁~J7b#dכ\N{2ߧnllژnX#eK]U@vN|WG7)Y ?MK5ƕXl1(Nx MwqGףY9Z^^/BIR§c"X{ >Lַ t+Q]1_CQAVl55yjsM֖5Mޔ{)l3 yS!dK Mg%_PLƦuT(bϢ_vG㙲?} eg\Я9}Bu|YXEQ\4CF$'㌵fo˾U.rI,:7lإ*9ͯ 7'tωckƕ#V&_G|Xbp^Y/ycrDg}|QUz5W6đD/J܃|sf|1w׭s=l iܚ`\Ή#mA+ǩqn;czK'9j:":eŅѭ0_d̾kXrʬsK/m}bOS|{9=¿Yn6K<$mZSŧ)u)x~ 8>dq)7|0\VO&k?u>@_yiwxZ6Ӧ7 rG?n#]f53:Z7M⨾¾}rD暃c};}5jH=bq,/6 s:o?'2M$||1sX>/4ʹSfa'Cm7$v+qC.;kͫuo?j Lk?j&aKcNYU4_K?7&gQɲ`?Q0ǭb*dž-WP$M O"y gT]wwߚqMIVIA*@ ?ȩlhd{^FڔvGADehQ*vC#ND_~E^~MUrvokDC*yECn^fciWӱ~:?F)˧8`nHӋ-״1/7Q{5|mCkSHy y]̆n?b;,9ſ?[m}yjUrv=0_I<ſT0M>oG~G-k͞ ĻƁ6ÖrY3Õ\=dkxƷc>E`*eݟ ݎ1ef.e.uWk[Cy -h׀]W hÿچ*5d3_ANXPg?^}; .eOY 9[O7S9??P*_s.K=C|Ur=o@j3]6@Zqٛnf2sO'HP_Ter&ב5k@ v'u?_?)G=me܇`2\ïS{orݟ]--| ?e`#̞L+*quҦJ_oW_}\ȑ WoVSsu5dn n 2zy# bk#1*mA'},4w+eG)Mt LroޛB8 $keJa%wY"@M:Z~ #qBm$Sᝊiʨ?b`[m^œ~gF8^;^xtׄUm^> }=q9R_HſOc}#'RW{傗ZTR4-=~qk&7<5vOYu+Or2A/ߨ7kOyTb~ZF\M66ak-[ѩַ#MsVn=l׽~=9W ñZY\Ĭ@=kEj0> 5I}an,,ς9p$`^εc [VTFwqaFQ=\9/136y8F{]-XfAY:'yc?]]f? G_.r̾{@ #/9FNڶT?uFD&,þ2' l:b8$ND7Oc/e:ɹ co|YOg6!_KBpS%]J%Kp#ěY=j-jmJSU_<߯ĺkb= Ŗs.}.lS_['omL/#PXJ;ɹ5]k}1ɪ N779a}?s>/bk-:Fwi7㾉sw?u?z?^Z<`WC+?&>_aZ=fc?5;8^bқq`mǼ~sc|Qɍ*= ESMx"ɣfQ,ti{(oZ hXP.NJ^,ZC7j᱀1+Eg-%8]AJ_"t>z#*L7dAHs}TZ>:hm0q]<~MdYh*og|| QŸlQ_ G ~eWMgMq|SYo:^d[p ;tֳzCѩUa_ ڦeMs+&fps#鶫:s <0ƺyqãZVUi7gM>/y}%&e+ 8іC/V|ba/2~TjE7OcA36cpz[raV3\b긫iݦC6)F!--ۊEg/mشwӅZǷĶb;?Rf9Gm?1]0j =1]wn7{Ĝ?!8ѹVc^> XT{콌Wrx+%1d|7k.o֗)wOsT C?==o5N-7.?7$>.YZ wпz?M-Zs|vq/ȳ;IG`Cr78hħ,߂J[HX&Yx>:dÐ/됺X3 zR-ņ ٞǔDvev{kS7 5bf!׹!|۬:b|7zW|l#vNCH/-:6 [yaHV=qʧcg]-ڵl|oD`.rwf^Y?oSYRbs{:Zd__R~P%0% "Y~|;UD) &s!\2)r0!Aù=?|b^/ҡpC1XL||}3~{@p9ӨMS7I /Նwwg-)}˄@]:-ŭim)YkY9ݥ8q Υ.Ɯc +`z^{d?`w#s.6zunAϵw'RW 2QtsN#!Q,̎O-mi"(fV~kU^l/F};d 䜉CN2 }znι^(ےU?r?k?> s:c8/5G \Sey4?" .[{pW":mEopco3Z_?#;`n*#bF_I.t/:K7`DߪPG9h}SUrݔ;1s˟C2ki f_[BYOqt7/{H9`lB8&:ǿ{sSjf?pVkZm! K3OZesW&;K~S^ÒH%jſ^e8O{Ʃ0WIs=vam d\;7I? Ewl= i -,Eod-i >95%~8> Q 1/Σ-l'!9#5yFܑ!~ߨ4Y(Y Y1/1'k4y LJZі$p,I9}hT" LlJXV쇵%QM*egW?µ(c5K+CrEh]|K̙ϱodXek:po-Ql j.67{<|>uZýi+Y'5`7J:lۂsi~7.'S3iD4HlW\!Y7IԏFIߢ^$=TB0-צܹm= ׈uw"C_&ڭ`퉛: Ƌ[GoKlT^؏ݜoCk^'FMNxu`άSzL{~{de@!})?-zE#fzZa4ϕ*k>8}2 G0d9/Rzc׾et fk7_{!O#^)!=f?1?ٮ7c@Ԁ4)9$9'&߯o2!V8߸R9K[krfh+P/,?Q{?77:Zr 5G _0:hfeEWʍo{-O  i7cu)0obYF5cZodP gM'eaS\6{w7Ιw:!Ep =YG/-CﵟNy}Xb[Ϭ|₍shPu'еZǜo9828:vYyC 5Cq/_SAƘ$/'5q !} fW |}vZjm]e?$_×b8 DZV+>DϔE 7ŵ;U C9cfOηi ~Ydl?a[ӿ3Ź̥JdE? 'MGVg`1Dm\z.CO lG`OٷݿI}\sw?Gdr9dvF`9ͿN0G;m? Ųmzʓ=K["яUtM| \7#O{gzhn{\ ڀf4yy@jö3P %uI~I,1GhͼzMCpcMO;c2?ef&fy}?nuco“$GF3џKa+7oq_:͞ڑu7?t^ീ-CjpSfLV1L WZ{k?"aO0G;">l`o*7¿Ԡ#92haxIENDB`bat-0.24.0/doc/sponsors/workos-logo-white-bg.svg000064400000000000000000000067101046102023000176230ustar 00000000000000 bat-0.24.0/doc/sponsors.md000064400000000000000000000012561046102023000134360ustar 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.24.0/examples/advanced.rs000064400000000000000000000010411046102023000144020ustar 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.24.0/examples/buffer.rs000064400000000000000000000007551046102023000141210ustar 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.24.0/examples/cat.rs000064400000000000000000000005251046102023000134120ustar 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.24.0/examples/inputs.rs000064400000000000000000000011621046102023000141630ustar 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.24.0/examples/list_syntaxes_and_themes.rs000064400000000000000000000006401046102023000177410ustar 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.24.0/examples/simple.rs000064400000000000000000000002611046102023000141310ustar 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.24.0/examples/yaml.rs000064400000000000000000000016211046102023000136030ustar 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.24.0/rustfmt.toml000064400000000000000000000000251046102023000130530ustar 00000000000000# Defaults are used bat-0.24.0/src/assets/assets_metadata.rs000064400000000000000000000054141046102023000162620ustar 00000000000000use std::fs::File; use std::path::Path; use std::time::SystemTime; use semver::Version; use serde::{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.24.0/src/assets/build_assets/acknowledgements.rs000064400000000000000000000146331046102023000211360ustar 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, "## {}\n\n{}", relative_path, 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.24.0/src/assets/build_assets.rs000064400000000000000000000113031046102023000155730ustar 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.24.0/src/assets/lazy_theme_set.rs000064400000000000000000000061471046102023000161400ustar 00000000000000use super::*; use std::collections::BTreeMap; use std::convert::TryFrom; use serde::Deserialize; use serde::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.24.0/src/assets/serialized_syntax_set.rs000064400000000000000000000014231046102023000175300ustar 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.24.0/src/assets.rs000064400000000000000000000602211046102023000131150ustar 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::{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, } } /// The default theme. /// /// ### Windows and Linux /// /// Windows and most Linux distributions has a dark terminal theme by /// default. On these platforms, this function always returns a theme that /// looks good on a dark background. /// /// ### macOS /// /// On macOS the default terminal background is light, but it is common that /// Dark Mode is active, which makes the terminal background dark. On this /// platform, the default theme depends on /// ```bash /// defaults read -globalDomain AppleInterfaceStyle /// ``` /// To avoid the overhead of the check on macOS, simply specify a theme /// explicitly via `--theme`, `BAT_THEME`, or `~/.config/bat`. /// /// See and /// for more context. pub fn default_theme() -> &'static str { #[cfg(not(target_os = "macos"))] { Self::default_dark_theme() } #[cfg(target_os = "macos")] { if macos_dark_mode_active() { Self::default_dark_theme() } else { Self::default_light_theme() } } } /** * The default theme that looks good on a dark background. */ fn default_dark_theme() -> &'static str { "Monokai Extended" } /** * The default theme that looks good on a light background. */ #[cfg(target_os = "macos")] fn default_light_theme() -> &'static str { "Monokai Extended Light" } 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(Self::default_theme)) .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(target_os = "macos")] fn macos_dark_mode_active() -> bool { 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(value) => value == "Dark", // If the key does not exist, then light theme is currently in use. None => false, }, // Unreachable, in theory. All macOS users have a home directory and preferences file setup. Ok(None) | Err(_) => true, } } #[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::builtin(), 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: {}\nFor Reader: {}", as_file, 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 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 paging_mode = match self.matches.get_one::("paging").map(|s| s.as_str()) { Some("always") => 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. let extra_plain = self.matches.get_count("plain") > 1; 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::builtin(); 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") { for from_to in values { 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"), }, 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::var_os("NO_COLOR").is_none() && 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 }, ), theme: self .matches .get_one::("theme") .map(String::from) .map(|s| { if s == "default" { String::from(HighlightingAssets::default_theme()) } else { s } }) .unwrap_or_else(|| String::from(HighlightingAssets::default_theme())), 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"), }) } 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 style_components(&self) -> Result { let matches = &self.matches; let mut styled_components = StyleComponents( if matches.get_one::("decorations").map(|s| s.as_str()) == Some("never") { HashSet::new() } else if matches.get_flag("number") { [StyleComponent::LineNumbers].iter().cloned().collect() } else if 0 < matches.get_count("plain") { [StyleComponent::Plain].iter().cloned().collect() } else { matches .get_one::("style") .map(|styles| { styles .split(',') .map(|style| style.parse::()) .filter_map(|style| style.ok()) .collect::>() }) .unwrap_or_else(|| vec![StyleComponent::Default]) .into_iter() .map(|style| style.components(self.interactive_output)) .fold(HashSet::new(), |mut acc, components| { acc.extend(components.iter().cloned()); acc }) }, ); // 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) } } bat-0.24.0/src/bin/bat/assets.rs000064400000000000000000000036131046102023000144350ustar 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.24.0/src/bin/bat/clap_app.rs000064400000000000000000000655021046102023000147170ustar 00000000000000use 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}; 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 && env::var_os("NO_COLOR").is_none() { 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("plain") .overrides_with("plain") .overrides_with("number") .overrides_with("paging") .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") .overrides_with("plain") .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=\"...\").", ), ) .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("style") .long("style") .value_name("components") .overrides_with("style") .overrides_with("plain") .overrides_with("number") // Cannot use claps built in validation because we have to turn off clap's delimiters .value_parser(|val: &str| { let mut invalid_vals = val.split(',').filter(|style| { !&[ "auto", "full", "default", "plain", "header", "header-filename", "header-filesize", "grid", "rule", "numbers", "snip", #[cfg(feature = "git")] "changes", ].contains(style) }); if let Some(invalid) = invalid_vals.next() { Err(format!("Unknown style, '{}'", invalid)) } else { 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\ 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 = "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."), ); // 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.24.0/src/bin/bat/config.rs000064400000000000000000000126701046102023000144030ustar 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"), ("--pager", "BAT_PAGER"), ("--paging", "BAT_PAGING"), ("--style", "BAT_STYLE"), ] .iter() .filter_map(|(flag, key)| env::var(key).ok().map(|var| [flag.to_string(), var])) .flatten() .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.24.0/src/bin/bat/directories.rs000064400000000000000000000030351046102023000154450ustar 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.24.0/src/bin/bat/input.rs000064400000000000000000000010631046102023000142670ustar 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.24.0/src/bin/bat/main.rs000064400000000000000000000311201046102023000140510ustar 00000000000000#![deny(unsafe_code)] mod app; mod assets; mod clap_app; 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 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}, 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<'a>( mappings: &[(GlobMatcher, MappingTarget<'a>)], ) -> HashMap<&'a str, Vec> { 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.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) -> 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(); if config.colored_output { for theme in assets.themes() { writeln!( stdout, "Theme: {}\n", Style::new().bold().paint(theme.to_string()) )?; config.theme = theme.to_string(); Controller::new(&config, &assets) .run(vec![theme_preview_file()], None) .ok(); writeln!(stdout)?; } 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() )?; } else { for theme in assets.themes() { writeln!(stdout, "{}", theme)?; } } Ok(()) } 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); 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(&[ "SHELL", "PAGER", "LESS", "LANG", "LC_ALL", "BAT_PAGER", "BAT_PAGING", "BAT_CACHE_PATH", "BAT_CONFIG_PATH", "BAT_OPTS", "BAT_STYLE", "BAT_TABS", "BAT_THEME", "XDG_CONFIG_HOME", "XDG_CACHE_HOME", "COLORTERM", "NO_COLOR", "MANPAGER", ])) .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); } 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)?; 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.24.0/src/config.rs000064400000000000000000000066601046102023000130670ustar 00000000000000use crate::line_range::{HighlightedLineRanges, LineRanges}; use crate::nonprintable_notation::NonprintableNotation; #[cfg(feature = "paging")] use crate::paging::PagingMode; use crate::style::StyleComponents; use crate::syntax_mapping::SyntaxMapping; use crate::wrapping::WrappingMode; #[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, /// 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, } #[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.24.0/src/controller.rs000064400000000000000000000226501046102023000140020ustar 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>, handle_error: impl Fn(&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.24.0/src/decorations.rs000064400000000000000000000104131046102023000141230ustar 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!("{:4}", line_number); 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.24.0/src/diff.rs000064400000000000000000000046761046102023000125370ustar 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.24.0/src/error.rs000064400000000000000000000040531046102023000127450ustar 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.24.0/src/input.rs000064400000000000000000000240441046102023000127550ustar 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.24.0/src/less.rs000064400000000000000000000076551046102023000125750ustar 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.24.0/src/lessopen.rs000064400000000000000000000333361046102023000134520ustar 00000000000000#![cfg(feature = "lessopen")] use std::convert::TryFrom; use std::env; use std::fs::File; use std::io::{BufRead, BufReader, Cursor, Read, Write}; use std::path::PathBuf; use std::str; use clircle::{Clircle, Identifier}; use os_str_bytes::RawOsString; use run_script::{IoOptions, ScriptOptions}; 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, command_options: ScriptOptions, 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, but ignore exit code, always using preprocessor output } 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) }; let mut command_options = ScriptOptions::new(); command_options.runner = env::var("SHELL").ok(); command_options.input_redirection = IoOptions::Pipe; Ok(Self { lessopen: lessopen.replacen("%s", "$1", 1), lessclose: env::var("LESSCLOSE") .ok() .map(|str| str.replacen("%s", "$1", 1).replacen("%s", "$2", 1)), command_options, 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 (exit_code, lessopen_stdout, _) = match run_script::run( &self.lessopen, &vec![path_str.to_string()], &self.command_options, ) { Ok(output) => output, Err(_) => return input.open(stdin, stdout_identifier), }; if self.fall_back_to_original_file(&lessopen_stdout, exit_code) { return input.open(stdin, stdout_identifier); } ( RawOsString::from_string(lessopen_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, so copy it to a cloneable buffer let mut stdin_buffer = Vec::new(); stdin.read_to_end(&mut stdin_buffer).unwrap(); let mut lessopen_handle = match run_script::spawn( &self.lessopen, &vec!["-".to_string()], &self.command_options, ) { Ok(handle) => handle, Err(_) => { return input.open(stdin, stdout_identifier); } }; if lessopen_handle .stdin .as_mut() .unwrap() .write_all(&stdin_buffer.clone()) .is_err() { return input.open(stdin, stdout_identifier); } let lessopen_output = match lessopen_handle.wait_with_output() { Ok(output) => output, Err(_) => { return input.open(Cursor::new(stdin_buffer), stdout_identifier); } }; if lessopen_output.stdout.is_empty() && (!lessopen_output.status.success() || matches!(self.kind, LessOpenKind::PipedIgnoreExitCode)) { return input.open(Cursor::new(stdin_buffer), stdout_identifier); } ( RawOsString::assert_from_raw_vec(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) { // Remove newline at end of temporary file path returned by $LESSOPEN let stdout = match lessopen_stdout.strip_suffix("\n") { Some(stripped) => stripped.to_owned(), None => lessopen_stdout, }; let stdout = stdout.into_os_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.clone(), command_args: vec![path_str, stdout.to_str().unwrap().to_string()], command_options: self.command_options.clone(), } } else { Preprocessed { kind: PreprocessedKind::Piped(Cursor::new(lessopen_stdout.into_raw_vec())), lessclose: self.lessclose.clone(), command_args: vec![path_str, "-".to_string()], command_options: self.command_options.clone(), } }, )), metadata: input.metadata, description: input.description, }) } fn fall_back_to_original_file(&self, lessopen_output: &str, exit_code: i32) -> bool { lessopen_output.is_empty() && (exit_code != 0 || 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, command_args: Vec, command_options: ScriptOptions, } 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(ref command) = self.lessclose { self.command_options.output_redirection = IoOptions::Inherit; run_script::run(command, &self.command_args, &self.command_options) .expect("failed to run $LESSCLOSE to clean up file"); } } } #[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 $1"); 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 $1"); assert_eq!(preprocessor.lessclose.unwrap(), "lessclose.sh $1 $2"); 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 $1"); assert!(matches!(preprocessor.kind, LessOpenKind::TempFile)); assert!(!preprocessor.preprocess_stdin); let preprocessor = LessOpenPreprocessor::mock_new(Some("|batpipe %s"), None)?; assert_eq!(preprocessor.lessopen, "batpipe $1"); assert!(matches!( preprocessor.kind, LessOpenKind::PipedIgnoreExitCode )); assert!(!preprocessor.preprocess_stdin); let preprocessor = LessOpenPreprocessor::mock_new(Some("||batpipe %s"), None)?; assert_eq!(preprocessor.lessopen, "batpipe $1"); assert!(matches!(preprocessor.kind, LessOpenKind::Piped)); assert!(!preprocessor.preprocess_stdin); let preprocessor = LessOpenPreprocessor::mock_new(Some("-batpipe %s"), None)?; assert_eq!(preprocessor.lessopen, "batpipe $1"); assert!(matches!(preprocessor.kind, LessOpenKind::TempFile)); assert!(preprocessor.preprocess_stdin); let preprocessor = LessOpenPreprocessor::mock_new(Some("|-batpipe %s"), None)?; assert_eq!(preprocessor.lessopen, "batpipe $1"); assert!(matches!( preprocessor.kind, LessOpenKind::PipedIgnoreExitCode )); assert!(preprocessor.preprocess_stdin); let preprocessor = LessOpenPreprocessor::mock_new(Some("||-batpipe %s"), None)?; assert_eq!(preprocessor.lessopen, "batpipe $1"); 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:$1"); assert_eq!(preprocessor.lessclose.unwrap(), "echo File:$1 Temp:$2"); reset_env_vars(); Ok(()) } } bat-0.24.0/src/lib.rs000064400000000000000000000030201046102023000123530ustar 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; mod vscreen; pub(crate) mod wrapping; pub use nonprintable_notation::NonprintableNotation; 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.24.0/src/line_range.rs000064400000000000000000000211361046102023000137200ustar 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.24.0/src/macros.rs000064400000000000000000000003041046102023000130730ustar 00000000000000#[macro_export] macro_rules! bat_warning { ($($arg:tt)*) => ({ use nu_ansi_term::Color::Yellow; eprintln!("{}: {}", Yellow.paint("[bat warning]"), format!($($arg)*)); }) } bat-0.24.0/src/nonprintable_notation.rs000064400000000000000000000005151046102023000162210ustar 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, } bat-0.24.0/src/output.rs000064400000000000000000000123621046102023000131560ustar 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.24.0/src/pager.rs000064400000000000000000000074251046102023000127200ustar 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.24.0/src/paging.rs000064400000000000000000000002111046102023000130510ustar 00000000000000#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)] pub enum PagingMode { Always, QuitIfOneScreen, #[default] Never, } bat-0.24.0/src/preprocessor.rs000064400000000000000000000140651046102023000143460ustar 00000000000000use std::fmt::Write; use console::AnsiCodeIterator; use crate::nonprintable_notation::NonprintableNotation; /// 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 chunk in AnsiCodeIterator::new(line) { match chunk { (text, true) => buffer.push_str(text), (mut text, false) => { 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); } } } 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; } // carriage return '\x0D' => output.push_str(match nonprintable_notation { NonprintableNotation::Caret => "^M", NonprintableNotation::Unicode => "␍", }), // null '\x00' => output.push_str(match nonprintable_notation { NonprintableNotation::Caret => "^@", NonprintableNotation::Unicode => "␀", }), // bell '\x07' => output.push_str(match nonprintable_notation { NonprintableNotation::Caret => "^G", NonprintableNotation::Unicode => "␇", }), // backspace '\x08' => output.push_str(match nonprintable_notation { NonprintableNotation::Caret => "^H", NonprintableNotation::Unicode => "␈", }), // escape '\x1B' => output.push_str(match nonprintable_notation { NonprintableNotation::Caret => "^[", NonprintableNotation::Unicode => "␛", }), // 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 } #[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); } bat-0.24.0/src/pretty_printer.rs000064400000000000000000000263421046102023000147130ustar 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, 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 } /// 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 highlighting theme 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 { 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); 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.24.0/src/printer.rs000064400000000000000000000643341046102023000133070ustar 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 console::AnsiCodeIterator; use syntect::easy::HighlightLines; use syntect::highlighting::Color; 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::{expand_tabs, replace_nonprintable}; use crate::style::StyleComponent; use crate::terminal::{as_terminal_escaped, to_ansi_color}; use crate::vscreen::AnsiStyle; use crate::wrapping::WrappingMode; 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>, } impl<'a> SimplePrinter<'a> { pub fn new(config: &'a Config) -> Self { SimplePrinter { config } } } 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<()> { 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, } 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; } let highlighter_from_set = if input .reader .content_type .map_or(false, |c| c.is_binary() && !config.show_nonprintable) { None } else { // Determine the type of syntax for highlighting let syntax_in_set = match assets.get_syntax(config.language, input, &config.syntax_mapping) { Ok(syntax_in_set) => syntax_in_set, Err(Error::UndetectedSyntax(_)) => assets .find_syntax_by_name("Plain Text")? .expect("A plain text syntax is available"), Err(e) => return Err(e), }; Some(HighlighterFromSet::new(syntax_in_set, theme)) }; 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, }) } 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 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 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 { 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| { self.print_header_component_indent(handle)?; match component { StyleComponent::HeaderFilename => writeln!( handle, "{}{}{}", description .kind() .map(|kind| format!("{}: ", kind)) .unwrap_or_else(|| "".into()), self.colors.header_value.paint(description.title()), mode ), StyleComponent::HeaderFilesize => { let bsize = metadata .size .map(|s| format!("{}", ByteSize(s))) .unwrap_or_else(|| "-".into()); writeln!(handle, "Size: {}", self.colors.header_value.paint(bsize)) } _ => Ok(()), } })?; if self.config.style_components.grid() { if self.content_type.map_or(false, |c| c.is_text()) || self.config.show_nonprintable { 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) { 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 { match self.content_type { Some(ContentType::BINARY) | None => { 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 } } } }; let regions = { let highlighter_from_set = match self.highlighter_from_set { Some(ref mut highlighter_from_set) => highlighter_from_set, _ => { return Ok(()); } }; // 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; } highlighted_line }; if out_of_range { return Ok(()); } 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("^[4m"); } 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 = AnsiCodeIterator::new(region); for chunk in ansi_iterator { match chunk { // ANSI escape passthrough. (ansi, true) => { self.ansi_style.update(ansi); write!(handle, "{}", ansi)?; } // Regular text. (text, false) => { 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 ) )?; 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()..])?; } } } } } if !self.config.style_components.plain() && line.bytes().next_back() != Some(b'\n') { writeln!(handle)?; } } else { for &(style, region) in ®ions { let ansi_iterator = AnsiCodeIterator::new(region); for chunk in ansi_iterator { match chunk { // ANSI escape passthrough. (ansi, true) => { self.ansi_style.update(ansi); write!(handle, "{}", ansi)?; } // Regular text. (text, false) => { 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 ), 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 ) )?; } } } } 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" { self.ansi_style.update("^[24m"); write!(handle, "\x1B[24m")?; } 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.24.0/src/style.rs000064400000000000000000000102711046102023000127530ustar 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(); } } bat-0.24.0/src/syntax_mapping/ignored_suffixes.rs000064400000000000000000000063051046102023000202220ustar 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.24.0/src/syntax_mapping.rs000064400000000000000000000244721046102023000146640ustar 00000000000000use std::path::Path; use crate::error::Result; use ignored_suffixes::IgnoredSuffixes; use globset::{Candidate, GlobBuilder, GlobMatcher}; pub mod ignored_suffixes; #[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> { mappings: Vec<(GlobMatcher, MappingTarget<'a>)>, pub(crate) ignored_suffixes: IgnoredSuffixes<'a>, } impl<'a> SyntaxMapping<'a> { pub fn empty() -> SyntaxMapping<'a> { Default::default() } pub fn builtin() -> SyntaxMapping<'a> { let mut mapping = Self::empty(); mapping.insert("*.h", MappingTarget::MapTo("C++")).unwrap(); mapping .insert(".clang-format", MappingTarget::MapTo("YAML")) .unwrap(); mapping.insert("*.fs", MappingTarget::MapTo("F#")).unwrap(); mapping .insert("build", MappingTarget::MapToUnknown) .unwrap(); mapping .insert("**/.ssh/config", MappingTarget::MapTo("SSH Config")) .unwrap(); mapping .insert( "**/bat/config", MappingTarget::MapTo("Bourne Again Shell (bash)"), ) .unwrap(); mapping .insert( "/etc/profile", MappingTarget::MapTo("Bourne Again Shell (bash)"), ) .unwrap(); mapping .insert( "os-release", MappingTarget::MapTo("Bourne Again Shell (bash)"), ) .unwrap(); mapping .insert("*.pac", MappingTarget::MapTo("JavaScript (Babel)")) .unwrap(); mapping .insert("fish_history", MappingTarget::MapTo("YAML")) .unwrap(); for glob in ["*.jsonl", "*.sarif"] { mapping.insert(glob, MappingTarget::MapTo("JSON")).unwrap(); } // See #2151, https://nmap.org/book/nse-language.html mapping .insert("*.nse", MappingTarget::MapTo("Lua")) .unwrap(); // See #1008 mapping .insert("rails", MappingTarget::MapToUnknown) .unwrap(); mapping .insert("Containerfile", MappingTarget::MapTo("Dockerfile")) .unwrap(); mapping .insert("*.ksh", MappingTarget::MapTo("Bourne Again Shell (bash)")) .unwrap(); // Nginx and Apache syntax files both want to style all ".conf" files // see #1131 and #1137 mapping .insert("*.conf", MappingTarget::MapExtensionToUnknown) .unwrap(); for glob in &[ "/etc/nginx/**/*.conf", "/etc/nginx/sites-*/**/*", "nginx.conf", "mime.types", ] { mapping.insert(glob, MappingTarget::MapTo("nginx")).unwrap(); } for glob in &[ "/etc/apache2/**/*.conf", "/etc/apache2/sites-*/**/*", "httpd.conf", ] { mapping .insert(glob, MappingTarget::MapTo("Apache Conf")) .unwrap(); } for glob in &[ "**/systemd/**/*.conf", "**/systemd/**/*.example", "*.automount", "*.device", "*.dnssd", "*.link", "*.mount", "*.netdev", "*.network", "*.nspawn", "*.path", "*.service", "*.scope", "*.slice", "*.socket", "*.swap", "*.target", "*.timer", ] { mapping.insert(glob, MappingTarget::MapTo("INI")).unwrap(); } // unix mail spool for glob in &["/var/spool/mail/*", "/var/mail/*"] { mapping.insert(glob, MappingTarget::MapTo("Email")).unwrap() } // pacman hooks mapping .insert("*.hook", MappingTarget::MapTo("INI")) .unwrap(); mapping .insert("*.ron", MappingTarget::MapTo("Rust")) .unwrap(); // 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 match ( std::env::var_os("XDG_CONFIG_HOME").filter(|val| !val.is_empty()), std::env::var_os("HOME") .filter(|val| !val.is_empty()) .map(|home| Path::new(&home).join(".config")), ) { (Some(xdg_config_home), Some(default_config_home)) if xdg_config_home == default_config_home => { insert_git_config_global(&mut mapping, &xdg_config_home) } (Some(xdg_config_home), Some(default_config_home)) /* else guard */ => { insert_git_config_global(&mut mapping, &xdg_config_home); insert_git_config_global(&mut mapping, &default_config_home) } (Some(config_home), None) => insert_git_config_global(&mut mapping, &config_home), (None, Some(config_home)) => insert_git_config_global(&mut mapping, &config_home), (None, None) => (), }; fn insert_git_config_global(mapping: &mut SyntaxMapping, config_home: impl AsRef) { let git_config_path = config_home.as_ref().join("git"); mapping .insert( &git_config_path.join("config").to_string_lossy(), MappingTarget::MapTo("Git Config"), ) .ok(); mapping .insert( &git_config_path.join("ignore").to_string_lossy(), MappingTarget::MapTo("Git Ignore"), ) .ok(); mapping .insert( &git_config_path.join("attributes").to_string_lossy(), MappingTarget::MapTo("Git Attributes"), ) .ok(); } mapping } pub fn insert(&mut self, from: &str, to: MappingTarget<'a>) -> Result<()> { let glob = GlobBuilder::new(from) .case_insensitive(true) .literal_separator(true) .build()?; self.mappings.push((glob.compile_matcher(), to)); Ok(()) } pub fn mappings(&self) -> &[(GlobMatcher, MappingTarget<'a>)] { &self.mappings } pub(crate) 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 (ref glob, ref syntax) in self.mappings.iter().rev() { 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 basic() { let mut map = SyntaxMapping::empty(); 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 user_can_override_builtin_mappings() { let mut map = SyntaxMapping::builtin(); assert_eq!( map.get_syntax_for("/etc/profile"), Some(MappingTarget::MapTo("Bourne Again Shell (bash)")) ); map.insert("/etc/profile", MappingTarget::MapTo("My Syntax")) .ok(); assert_eq!( map.get_syntax_for("/etc/profile"), Some(MappingTarget::MapTo("My Syntax")) ); } #[test] fn builtin_mappings() { let map = SyntaxMapping::builtin(); assert_eq!( map.get_syntax_for("/path/to/build"), Some(MappingTarget::MapToUnknown) ); } #[test] /// verifies that SyntaxMapping::builtin() doesn't repeat `Glob`-based keys fn no_duplicate_builtin_keys() { let mappings = SyntaxMapping::builtin().mappings; for i in 0..mappings.len() { let tail = mappings[i + 1..].into_iter(); let (dupl, _): (Vec<_>, Vec<_>) = tail.partition(|item| item.0.glob() == mappings[i].0.glob()); // emit repeats on failure assert_eq!( dupl.len(), 0, "Glob pattern `{}` mapped to multiple: {:?}", mappings[i].0.glob().glob(), { let (_, mut dupl_targets): (Vec, Vec) = dupl.into_iter().cloned().unzip(); dupl_targets.push(mappings[i].1) }, ) } } } bat-0.24.0/src/terminal.rs000064400000000000000000000060011046102023000134220ustar 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.24.0/src/vscreen.rs000064400000000000000000000140651046102023000132650ustar 00000000000000use std::fmt::{Display, Formatter}; // 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: &str) -> bool { match &mut self.attributes { Some(a) => a.update(sequence), None => { self.attributes = Some(Attributes::new()); self.attributes.as_mut().unwrap().update(sequence) } } } } 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 { 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, } impl Attributes { pub fn new() -> Self { Attributes { 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(), } } /// Update the attributes with an escape sequence. /// Returns `false` if the sequence is unsupported. pub fn update(&mut self, sequence: &str) -> bool { let mut chars = sequence.char_indices().skip(1); if let Some((_, t)) = chars.next() { match t { '(' => self.update_with_charset('(', chars.map(|(_, c)| c)), ')' => self.update_with_charset(')', chars.map(|(_, c)| c)), '[' => { if let Some((i, last)) = chars.last() { // SAFETY: Always starts with ^[ and ends with m. self.update_with_csi(last, &sequence[2..i]) } else { false } } _ => self.update_with_unsupported(sequence), } } else { false } } fn sgr_reset(&mut self) { 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. while let Some(p) = iter.next() { match p { 0 => self.sgr_reset(), 1 => self.bold = format!("\x1B[{}m", parameters), 2 => self.dim = format!("\x1B[{}m", parameters), 3 => self.italic = format!("\x1B[{}m", parameters), 4 => self.underline = format!("\x1B[{}m", parameters), 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.foreground = Self::parse_color(p, &mut iter), _ => { // Unsupported SGR sequence. // Be compatible and pretend one just wasn't was provided. } } } true } fn update_with_csi(&mut self, finalizer: char, sequence: &str) -> bool { if finalizer == 'm' { self.update_with_sgr(sequence) } else { false } } fn update_with_unsupported(&mut self, sequence: &str) -> bool { self.unknown_buffer.push_str(sequence); false } 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[{};{}m", color, c), _ => "".to_owned(), }, 9 => "".to_owned(), _ => format!("\x1B[{}m", color), } } } 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, ) } } fn join( delimiter: &str, limit: usize, iterator: &mut dyn Iterator, ) -> String { iterator .take(limit) .map(|i| i.to_string()) .collect::>() .join(delimiter) } bat-0.24.0/src/wrapping.rs000064400000000000000000000004751046102023000134470ustar 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.24.0/tests/.gitattributes000064400000000000000000000005741046102023000145200ustar 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.24.0/tests/assets.rs000064400000000000000000000021521046102023000134670ustar 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.24.0/tests/benchmarks/.gitignore000064400000000000000000000000231046102023000157170ustar 00000000000000/benchmark-results bat-0.24.0/tests/benchmarks/.ignore000064400000000000000000000000131046102023000152120ustar 00000000000000test-src/* bat-0.24.0/tests/benchmarks/highlighting-speed-src/grep-output-ansi-sequences.txt000064400000000000000000016631711046102023000262600ustar 00000000000000.github/ISSUE_TEMPLATE/syntax_request.md:3:about: Request adding a new syntax to bat. .github/ISSUE_TEMPLATE/syntax_request.md:14:Bat supports locally-installed language definitions. See the link below: .github/ISSUE_TEMPLATE/syntax_request.md:16:https://github.com/sharkdp/bat#adding-new-syntaxes--language-definitions .github/ISSUE_TEMPLATE/question.md:3:about: Ask a question about 'bat'. .github/ISSUE_TEMPLATE/bug_report.md:21:**How did you install `bat`?** .github/ISSUE_TEMPLATE/bug_report.md:27:**bat version and environment** .github/ISSUE_TEMPLATE/bug_report.md:31:in which you're running bat. To do this, run the full `bat` command that demonstrates .github/ISSUE_TEMPLATE/bug_report.md:34: bat [other options and arguments…] --diagnostic .github/ISSUE_TEMPLATE/bug_report.md:40:If you are running bat 0.17.1 or older (where --diagnostic is not available), please .github/ISSUE_TEMPLATE/bug_report.md:43: https://github.com/sharkdp/bat/blob/master/diagnostics/info.sh .github/ISSUE_TEMPLATE/bug_report.md:46:are on Windows, please let us know your bat version and your Windows version. .github/workflows/CICD.yml:69: - name: Build and install bat .github/workflows/CICD.yml:76: - name: Build and install bat with updated assets .github/workflows/CICD.yml:94: run: bat --list-languages .github/workflows/CICD.yml:96: run: bat --list-themes .github/workflows/CICD.yml:235: - name: Run bat .github/workflows/CICD.yml:242: - name: Show diagnostics (bat --diagnostic) .github/workflows/CICD.yml:302: cp 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/manual/bat.1 "$ARCHIVE_DIR" .github/workflows/CICD.yml:308: cp 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/completions/bat.bash "$ARCHIVE_DIR/autocomplete/${{ env.PROJECT_NAME }}.bash" .github/workflows/CICD.yml:309: cp 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/completions/bat.fish "$ARCHIVE_DIR/autocomplete/${{ env.PROJECT_NAME }}.fish" .github/workflows/CICD.yml:310: cp 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/completions/_bat.ps1 "$ARCHIVE_DIR/autocomplete/_${{ env.PROJECT_NAME }}.ps1" .github/workflows/CICD.yml:311: cp 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/completions/bat.zsh "$ARCHIVE_DIR/autocomplete/${{ env.PROJECT_NAME }}.zsh" .github/workflows/CICD.yml:355: install -Dm644 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/manual/bat.1 "${DPKG_DIR}/usr/share/man/man1/${{ env.PROJECT_NAME }}.1" .github/workflows/CICD.yml:359: install -Dm644 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/completions/bat.bash "${DPKG_DIR}/usr/share/bash-completion/completions/${{ env.PROJECT_NAME }}" .github/workflows/CICD.yml:360: install -Dm644 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/completions/bat.fish "${DPKG_DIR}/usr/share/fish/vendor_completions.d/${{ env.PROJECT_NAME }}.fish" .github/workflows/CICD.yml:361: install -Dm644 'target/${{ matrix.job.target }}/release/build/${{ env.PROJECT_NAME }}'-*/out/assets/completions/bat.zsh "${DPKG_DIR}/usr/share/zsh/vendor-completions/_${{ env.PROJECT_NAME }}" README.md:2: bat - a cat clone with wings
README.md:3:
Build Status README.md:4: license README.md:5: Version info
README.md:16: [中文] README.md:24:`bat` supports syntax highlighting for a large number of programming and markup README.md:31:`bat` communicates with `git` to show modifications with respect to the index README.md:45:By default, `bat` pipes its own output to a pager (e.g. `less`) if the output is too large for one screen. README.md:46: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. README.md:47: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. README.md:51:Even with a pager set, you can still use `bat` to concatenate files :wink:. README.md:52: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. README.md:59:> bat README.md README.md:65:> bat src/*.rs README.md:73:> curl -s https://sh.rustup.rs | bat README.md:79:> yaml2json .travis.yml | json_pp | bat -l json README.md:84:> bat -A /etc/hosts README.md:90:bat > note.md # quickly create a new file README.md:92:bat header.md content.md footer.md > document.md README.md:94:bat -n main.rs # show line numbers (only) README.md:96:bat f - g # output 'f', then stdin, then 'g'. README.md:103:You can use `bat` as a previewer for [`fzf`](https://github.com/junegunn/fzf). To do this, README.md:104:use `bat`s `--color=always` option to force colorized output. You can also use `--line-range` README.md:108:fzf --preview 'bat --color=always --style=numbers --line-range=:500 {}' README.md:115:You can use the `-exec` option of `find` to preview all search results with `bat`: README.md:118:find … -exec bat {} + README.md:121:If you happen to use [`fd`](https://github.com/sharkdp/fd), you can use the `-X`/`--exec-batch` option to do the same: README.md:124:fd … -X bat README.md:129: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. README.md:132:batgrep needle src/ README.md:137:`bat` can be combined with `tail -f` to continuously monitor a given file with syntax highlighting. README.md:140:tail -f /var/log/pacman.log | bat --paging=never -l log README.md:148:You can combine `bat` with `git show` to view an older version of a given file with proper syntax README.md:152:git show v0.6.0:src/main.rs | bat -l rs README.md:157:You can combine `bat` with `git diff` to view lines around code changes with proper syntax README.md:160:batdiff() { README.md:161: git diff --name-only --diff-filter=d | xargs bat --diff README.md:164:If you prefer to use this as a separate tool, check out `batdiff` in [`bat-extras`](https://github.com/eth-p/bat-extras). README.md:170:The line numbers and Git modification markers in the output of `bat` can make it hard to copy README.md:171:the contents of a file. To prevent this, you can call `bat` with the `-p`/`--plain` option or README.md:174:bat main.cpp | xclip README.md:176:`bat` will detect that the output is being redirected and print the plain file contents. README.md:180:`bat` can be used as a colorizing pager for `man`, by setting the README.md:184:export MANPAGER="sh -c 'col -bx | bat -l man -p'" README.md:187:(replace `bat` with `batcat` if you are on Debian or Ubuntu) README.md:192: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). README.md:196:Also, note that this will [not work](https://github.com/sharkdp/bat/issues/1145) with Mandocs `man` implementation. README.md:200: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`. README.md:205:[![Packaging status](https://repology.org/badge/vertical-allrepos/bat-cat.svg)](https://repology.org/project/bat-cat/versions) README.md:210:`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). README.md:215:sudo apt install bat README.md:218:**Important**: If you install `bat` this way, please note that the executable may be installed as `batcat` instead of `bat` (due to [a name README.md:219: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: README.md:222:ln -s /usr/bin/batcat ~/.local/bin/bat README.md:229:the most recent release of `bat`, download the latest `.deb` package from the README.md:230:[release page](https://github.com/sharkdp/bat/releases) and install it via: README.md:233:sudo dpkg -i bat_0.18.3_amd64.deb # adapt version number and architecture README.md:238:You can install [the `bat` package](https://pkgs.alpinelinux.org/packages?name=bat) README.md:242:apk add bat README.md:247:You can install [the `bat` package](https://www.archlinux.org/packages/community/x86_64/bat/) README.md:251:pacman -S bat README.md:256: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. README.md:259:dnf install bat README.md:264:You can install [the `bat` package](https://github.com/funtoo/dev-kit/tree/1.4-release/sys-apps/bat) from dev-kit. README.md:267:emerge sys-apps/bat README.md:272:You can install [the `bat` package](https://packages.gentoo.org/packages/sys-apps/bat) README.md:276:emerge sys-apps/bat README.md:281:You can install `bat` via xbps-install: README.md:283:xbps-install -S bat README.md:288:You can install `bat` via pkg: README.md:290:pkg install bat README.md:295:You can install a precompiled [`bat` package](https://www.freshports.org/textproc/bat) with pkg: README.md:298:pkg install bat README.md:304:cd /usr/ports/textproc/bat README.md:310:You can install `bat` package using [`pkg_add(1)`](https://man.openbsd.org/pkg_add.1): README.md:313:pkg_add bat README.md:318:You can install `bat` using the [nix package manager](https://nixos.org/nix): README.md:321:nix-env -i bat README.md:326:You can install `bat` with zypper: README.md:329:zypper install bat README.md:335:Existing packages may be available, but are not officially supported and may contain [issues](https://github.com/sharkdp/bat/issues/1519). README.md:339:You can install `bat` with [Homebrew on MacOS](https://formulae.brew.sh/formula/bat) or [Homebrew on Linux](https://formulae.brew.sh/formula-linux/bat): README.md:342:brew install bat README.md:347:Or install `bat` with [MacPorts](https://ports.macports.org/port/bat/summary): README.md:350:port install bat README.md:355:There are a few options to install `bat` on Windows. Once you have installed `bat`, README.md:356:take a look at the ["Using `bat` on Windows"](#using-bat-on-windows) section. README.md:364:You can install `bat` via [Chocolatey](https://chocolatey.org/packages/Bat): README.md:366:choco install bat README.md:371:You can install `bat` via [scoop](https://scoop.sh/): README.md:373:scoop install bat README.md:378:You can download prebuilt binaries from the [Release page](https://github.com/sharkdp/bat/releases), README.md:384:Check out the [Release page](https://github.com/sharkdp/bat/releases) for README.md:385:prebuilt versions of `bat` for many different architectures. Statically-linked README.md:390:If you want to build `bat` from source, you need Rust 1.46 or README.md:394:cargo install --locked bat README.md:404:Use `bat --list-themes` to get a list of all available themes for syntax README.md:405:highlighting. To select the `TwoDark` theme, call `bat` with the README.md:406:`--theme=TwoDark` option or set the `BAT_THEME` environment variable to README.md:407:`TwoDark`. Use `export BAT_THEME="TwoDark"` in your shell's startup file to README.md:408:make the change permanent. Alternatively, use `bat`s README.md:409:[configuration file](https://github.com/sharkdp/bat#configuration-file). README.md:414:bat --list-themes | fzf --preview="bat --theme={} --color=always /path/to/file" README.md:417:`bat` looks good on a dark background by default. However, if your terminal uses a README.md:420:['Adding new themes' section below](https://github.com/sharkdp/bat#adding-new-themes). README.md:424:`bat` has three themes that always use [8-bit colors](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors), README.md:444:You can use the `--style` option to control the appearance of `bat`s output. README.md:446:and line numbers but no grid and no file header. Set the `BAT_STYLE` environment README.md:447:variable to make these changes permanent or use `bat`s README.md:448:[configuration file](https://github.com/sharkdp/bat#configuration-file). README.md:452:Should you find that a particular syntax is not available within `bat`, you can follow these README.md:453:instructions to easily add new syntaxes to your current `bat` installation. README.md:455:`bat` uses the excellent [`syntect`](https://github.com/trishume/syntect/) README.md:466: mkdir -p "$(bat --config-dir)/syntaxes" README.md:467: cd "$(bat --config-dir)/syntaxes" README.md:477: bat cache --build README.md:480:3. Finally, use `bat --list-languages` to check if the new languages are available. README.md:485: bat cache --clear README.md:488:4. If you think that a specific syntax should be included in `bat` by default, please README.md:490: instructions [here](doc/assets.md): [Open Syntax Request](https://github.com/sharkdp/bat/issues/new?labels=syntax-request&template=syntax_request.md). README.md:498:mkdir -p "$(bat --config-dir)/themes" README.md:499:cd "$(bat --config-dir)/themes" README.md:505:bat cache --build README.md:508:Finally, use `bat --list-themes` to check if the new themes are available. README.md:516:(use `bat --list-languages` for an overview). README.md:518:Note: You probably want to use this option as an entry in `bat`s configuration file instead README.md:539:`bat` uses the pager that is specified in the `PAGER` environment variable. If this variable is not README.md:541:`PAGER` variable or set the `BAT_PAGER` environment variable to override what is specified in README.md:544:**Note**: If `PAGER` is `more` or `most`, `bat` will silently use `less` instead to ensure support for colors. README.md:547:`PAGER`/`BAT_PAGER` variables: README.md:550:export BAT_PAGER="less -RF" README.md:553: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). README.md:556:`bat` will pass the following command line options to the pager: `-R`/`--RAW-CONTROL-CHARS`, README.md:572:`bat` expands tabs to 4 spaces by itself, not relying on the pager. To change this, simply add the README.md:575:**Note**: Defining tab stops for the pager (via the `--pager` argument by `bat`, or via the `LESS` README.md:578:sidebar. Calling `bat` with `--tabs=0` will override it and let tabs be consumed by the pager. README.md:582:If you make use of the dark mode feature in macOS, you might want to configure `bat` to use a different README.md:587:alias cat="bat --theme=\$(defaults read -globalDomain AppleInterfaceStyle &> /dev/null && echo default || echo GitHub)" README.md:593:`bat` can also be customized with a configuration file. The location of the file is dependent README.md:596:bat --config-file README.md:599:Alternatively, you can use the `BAT_CONFIG_PATH` environment variable to point `bat` to a README.md:602:export BAT_CONFIG_PATH="/path/to/bat.conf" README.md:607:bat --generate-config-file README.md:612: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. README.md:629:## Using `bat` on Windows README.md:631:`bat` mostly works out-of-the-box on Windows, but a few features may need extra configuration. README.md:653:or by setting `BAT_PAGER` to an empty string. README.md:657:`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)` README.md:662:bat() { README.md:671: command bat "${args[@]}" README.md:679:If an input file contains color codes or other ANSI escape sequences, `bat` will have problems README.md:682:passing the `--color=never --wrap=never` options to `bat`. README.md:686:`bat` handles terminals *with* and *without* truecolor support. However, the colors in most syntax README.md:694:`24bit`. Otherwise, `bat` will not be able to determine whether or not 24-bit escape sequences README.md:699:Please try a different theme (see `bat --list-themes` for a list). The `OneHalfDark` and README.md:704:`bat` natively supports UTF-8 as well as UTF-16. For every other file encoding, you may need to README.md:709:iconv -f ISO-8859-1 -t UTF-8 my-file.php | bat README.md:712:by `bat`. README.md:718:git clone --recursive https://github.com/sharkdp/bat README.md:721:cd bat README.md:730:# Build a bat binary with modified syntaxes and themes README.md:735:If you want to build an application that uses `bat`s pretty-printing README.md:736:features as a library, check out the [the API documentation](https://docs.rs/bat/). README.md:738:when you depend on `bat` as a library. README.md:753:Please contact [David Peter](https://david-peter.de/) via email if you want to report a vulnerability in `bat`. README.md:757:`bat` tries to achieve the following goals: README.md:768:Copyright (c) 2018-2021 [bat-developers](https://github.com/sharkdp/bat). README.md:770:`bat` is made available under the terms of either the MIT License or the Apache License 2.0, at your option. .gitmodules:198: url = https://github.com/ArmandPhilippot/coldark-bat.git .gitmodules:202: branch = bat-source examples/list_syntaxes_and_themes.rs:1:/// A simple program that prints its own source code using the bat library examples/list_syntaxes_and_themes.rs:2:use bat::PrettyPrinter; examples/inputs.rs:3:use bat::{Input, PrettyPrinter}; examples/yaml.rs:2:use bat::{Input, PrettyPrinter}; examples/advanced.rs:1:/// A program that prints its own source code using the bat library examples/advanced.rs:2:use bat::{PagingMode, PrettyPrinter, WrappingMode}; examples/cat.rs:1:/// A very simple colorized `cat` clone, using `bat` as a library. examples/cat.rs:2:/// See `src/bin/bat` for the full `bat` application. examples/cat.rs:3:use bat::PrettyPrinter; examples/simple.rs:1:/// A simple program that prints its own source code using the bat library examples/simple.rs:2:use bat::PrettyPrinter; .gitignore:5:/assets/completions/bat.bash .gitignore:6:/assets/completions/bat.fish .gitignore:7:/assets/completions/bat.zsh .gitignore:8:/assets/manual/bat.1 src/input.rs:12:/// This tells bat how to refer to the input. src/error.rs:22: #[error("Use of bat as a pager is disallowed in order to avoid infinite recursion problems")] src/error.rs:23: InvalidPagerValueBat, src/error.rs:53: Red.paint("[bat error]"), src/error.rs:59: writeln!(output, "{}: {}", Red.paint("[bat error]"), error).ok(); src/lib.rs:1://! `bat` is a library to print syntax highlighted content. src/lib.rs:13://! use bat::PrettyPrinter; src/macros.rs:2:macro_rules! bat_warning { src/macros.rs:5: eprintln!("{}: {}", Yellow.paint("[bat warning]"), format!($($arg)*)); src/syntax_mapping.rs:52: "**/bat/config", src/pager.rs:10: /// From the env var BAT_PAGER src/pager.rs:11: EnvVarBatPager, src/pager.rs:23: /// bat src/pager.rs:24: Bat, src/pager.rs:48: Some("bat") => PagerKind::Bat, src/pager.rs:86: let bat_pager = env::var("BAT_PAGER"); src/pager.rs:89: let (cmd, source) = match (config_pager, &bat_pager, &pager) { src/pager.rs:91: (_, Ok(bat_pager), _) => (bat_pager.as_str(), PagerSource::EnvVarBatPager), src/pager.rs:105: // If PAGER=bat, silently use 'less' instead to prevent src/pager.rs:107: // Never silently use 'less' if BAT_PAGER or --pager has been src/pager.rs:109: matches!(kind, PagerKind::More | PagerKind::Most | PagerKind::Bat) src/assets.rs:16:use crate::{bat_warning, SyntaxMapping}; src/assets.rs:218: bat_warning!("Theme '{}' is deprecated, using 'ansi' instead.", theme); src/assets.rs:222: bat_warning!("Unknown theme '{}', using default.", theme) src/printer.rs:278: (but will be present if the output of 'bat' is piped). You can use 'bat -A' \ src/printer.rs:280: Yellow.paint("[bat warning]"), src/output.rs:62: if pager.kind == PagerKind::Bat { src/output.rs:63: return Err(Error::InvalidPagerValueBat); src/output.rs:78: // ANSI color sequences printed by bat. If someone has set PAGER="less -F", we src/output.rs:81: // We only do this for PAGER (as it is not specific to 'bat'), not for BAT_PAGER src/output.rs:82: // or bats '--pager' command line option. src/bin/bat/input.rs:1:use bat::input::Input; src/bin/bat/config.rs:10: env::var("BAT_CONFIG_PATH") src/bin/bat/config.rs:16:pub fn generate_config_file() -> bat::error::Result<()> { src/bin/bat/config.rs:46: let default_config = r#"# This is `bat`s configuration file. Each line either contains a comment or src/bin/bat/config.rs:47:# a command-line option that you want to pass to `bat` by default. You can src/bin/bat/config.rs:48:# run `bat --help` to get a list of all possible configuration options. src/bin/bat/config.rs:50:# Specify desired highlighting theme (e.g. "TwoDark"). Run `bat --list-themes` src/bin/bat/config.rs:62:# enable mouse scrolling support in `bat` when running inside tmux. This might src/bin/bat/config.rs:98: env::var("BAT_OPTS").ok().map(|s| get_args_from_str(&s)) src/bin/bat/directories.rs:7:/// The `XDG_CACHE_HOME` environment variable is checked first. `BAT_CONFIG_DIR` src/bin/bat/directories.rs:9:/// The fallback directories are `~/.cache/bat` and `~/.config/bat`, respectively. src/bin/bat/directories.rs:10:pub struct BatProjectDirs { src/bin/bat/directories.rs:15:impl BatProjectDirs { src/bin/bat/directories.rs:16: fn new() -> Option<BatProjectDirs> { src/bin/bat/directories.rs:17: let cache_dir = BatProjectDirs::get_cache_dir()?; src/bin/bat/directories.rs:19: // Checks whether or not $BAT_CONFIG_DIR exists. If it doesn't, set our config dir src/bin/bat/directories.rs:22: if let Some(config_dir_op) = env::var_os("BAT_CONFIG_DIR").map(PathBuf::from) { src/bin/bat/directories.rs:34: config_dir_op.map(|d| d.join("bat"))? src/bin/bat/directories.rs:37: Some(BatProjectDirs { src/bin/bat/directories.rs:44: // on all OS prefer BAT_CACHE_PATH if set src/bin/bat/directories.rs:45: let cache_dir_op = env::var_os("BAT_CACHE_PATH").map(PathBuf::from); src/bin/bat/directories.rs:59: cache_dir_op.map(|d| d.join("bat")) src/bin/bat/directories.rs:72: pub static ref PROJECT_DIRS: BatProjectDirs = src/bin/bat/directories.rs:73: BatProjectDirs::new().expect("Could not get home directory"); src/bin/bat/app.rs:17:use bat::{ src/bin/bat/app.rs:19: bat_warning, src/bin/bat/app.rs:56: // Skip the arguments in bats config file src/bin/bat/app.rs:62: // Read arguments from bats config file src/bin/bat/app.rs:191: .or_else(|| env::var("BAT_TABS").ok()) src/bin/bat/app.rs:204: .or_else(|| env::var("BAT_THEME").ok()) src/bin/bat/app.rs:305: let env_style_components: Option> = env::var("BAT_STYLE") src/bin/bat/app.rs:336: bat_warning!("Style 'rule' is a subset of style 'grid', 'rule' will not be visible."); src/bin/bat/assets.rs:9:use bat::assets::HighlightingAssets; src/bin/bat/assets.rs:10:use bat::assets_metadata::AssetsMetadata; src/bin/bat/assets.rs:11:use bat::error::*; src/bin/bat/assets.rs:34: in '{}' are not compatible with this version of bat ({}). To solve this, \ src/bin/bat/assets.rs:35: either rebuild the cache (bat cache --build) or remove \ src/bin/bat/assets.rs:36: the custom syntaxes/themes (bat cache --clear).\n\ src/bin/bat/assets.rs:38: https://github.com/sharkdp/bat#adding-new-syntaxes--language-definitions", src/bin/bat/main.rs:28:use bat::{ src/bin/bat/main.rs:52: bat::assets::build(source_dir, !blank, target_dir, clap::crate_version!()) src/bin/bat/main.rs:60: println!("bat has been built without the 'build-assets' feature. The 'cache --build' option is not available."); src/bin/bat/main.rs:207: and are added to the cache with `bat cache --build`. \ src/bin/bat/main.rs:209: https://github.com/sharkdp/bat#adding-new-themes", src/bin/bat/main.rs:230: let pager = bat::config::get_pager_executable(app.matches.value_of("pager")) src/bin/bat/main.rs:243: "BAT_PAGER", src/bin/bat/main.rs:244: "BAT_CACHE_PATH", src/bin/bat/main.rs:245: "BAT_CONFIG_PATH", src/bin/bat/main.rs:246: "BAT_OPTS", src/bin/bat/main.rs:247: "BAT_STYLE", src/bin/bat/main.rs:248: "BAT_TABS", src/bin/bat/main.rs:249: "BAT_THEME", src/bin/bat/main.rs:280: println!("bat has been built without the 'bugreport' feature. The '--diagnostic' option is not available."); src/bin/bat/clap_app.rs:43: "Note: `bat -h` prints a short and concise overview while `bat --help` gives all \ src/bin/bat/clap_app.rs:127: data to bat from STDIN when bat does not otherwise know \ src/bin/bat/clap_app.rs:290: if the output of bat is piped to another program, but you want \ src/bin/bat/clap_app.rs:306: set BAT_PAGER to an empty string. To control which pager is used, see the \ src/bin/bat/clap_app.rs:330: PAGER and BAT_PAGER environment variables. The default pager is 'less'. \ src/bin/bat/clap_app.rs:363: BAT_THEME environment variable (e.g.: export \ src/bin/bat/clap_app.rs:364: BAT_THEME=\"...\").", src/bin/bat/clap_app.rs:412: BAT_STYLE environment variable (e.g.: export BAT_STYLE=\"..\").\n\n\ src/bin/bat/clap_app.rs:497: .help("Show bat's configuration directory."), src/bin/bat/clap_app.rs:503: .help("Show bat's cache directory."), src/bin/bat/clap_app.rs:521: 'bat --ignored-suffix \".dev\" my_file.json.dev' will use JSON syntax, and ignore '.dev'" src/bin/bat/clap_app.rs:528: // enable the 'bat cache' subcommand. src/assets/serialized_syntax_set.rs:14: /// The data to use is embedded into the bat binary. src/assets/build_assets.rs:246: if std::env::var("BAT_PRINT_SYNTAX_DEPENDENCIES").is_ok() { src/assets/build_assets.rs:248: // BAT_PRINT_SYNTAX_DEPENDENCIES=1 cargo run -- cache --build --source assets --blank --target /tmp src/assets/build_assets.rs:342:/// BAT_SYNTAX_DEPENDENCIES_TO_GRAPHVIZ_DOT_FILE=/tmp/bat-syntax-dependencies.dot cargo run -- cache --build --source assets --blank --target /tmp src/assets/build_assets.rs:343:/// dot /tmp/bat-syntax-dependencies.dot -Tpng -o /tmp/bat-syntax-dependencies.png src/assets/build_assets.rs:344:/// open /tmp/bat-syntax-dependencies.png src/assets/build_assets.rs:350: if let Ok(dot_file_path) = std::env::var("BAT_SYNTAX_DEPENDENCIES_TO_GRAPHVIZ_DOT_FILE") { src/assets/build_assets.rs:424: if std::env::var("BAT_INCLUDE_SYNTAX_DEPENDENTS").is_ok() { src/assets/assets_metadata.rs:12: bat_version: Option, src/assets/assets_metadata.rs:22: bat_version: Some(current_version.to_owned()), src/assets/assets_metadata.rs:48: /// => assume that these were created by an old version of bat and return src/assets/assets_metadata.rs:69: Version::parse(current_version).expect("bat follows semantic versioning"); src/assets/assets_metadata.rs:71: .bat_version src/assets/build_assets/graphviz_utils.rs:30: writeln!(dot_file, "digraph BatSyntaxDependencies {{")?; build.rs:2:// For more details, see https://github.com/sharkdp/bat/issues/372 build.rs:4:// For bat-as-a-library, no build script is required. The build script is for build.rs:5:// the manpage and completions, which are only relevant to the bat application. build.rs:17: let project_name = option_env!("PROJECT_NAME").unwrap_or("bat"); build.rs:54: "assets/manual/bat.1.in", build.rs:55: out_dir.join("assets/manual/bat.1"), build.rs:59: "assets/completions/bat.bash.in", build.rs:60: out_dir.join("assets/completions/bat.bash"), build.rs:64: "assets/completions/bat.fish.in", build.rs:65: out_dir.join("assets/completions/bat.fish"), build.rs:69: "assets/completions/_bat.ps1.in", build.rs:70: out_dir.join("assets/completions/_bat.ps1"), build.rs:74: "assets/completions/bat.zsh.in", build.rs:75: out_dir.join("assets/completions/bat.zsh"), build.rs:89:// const BIN_NAME: &str = "bat"; .git/info/refs:21:b41fb0df6cf831081754c27a4c33227c166eee69 refs/heads/bat-0.16-updates .git/info/refs:22:b5a40d0866e6a190fbee095ac104fdc6ec168d0a refs/heads/bat-0.18.2-release .git/info/refs:23:fa0d448cd3e652ffd3c5caa4caa4bdbe2973241c refs/heads/bat-config-file .git/info/refs:24:27516c6f26dc1319dc2516e7caf1aafbe8d30aa0 refs/heads/bat-diagnostic-option .git/info/refs:25:cd501edcbded4dc344e0a0478472b0a4819c2251 refs/heads/bat-diff .git/info/refs:26:d77742b2e425cd76e2ca90a75efba4205e280859 refs/heads/bat-diff-fixes .git/info/refs:215:f1f8807a38052c8138c6f8d1b3bf125e30588712 refs/remotes/origin/bat-v0.18.3-candidate .git/FETCH_HEAD:1:619cf6e6d6641dbb913dddd56907a54c6a9f6ce6 branch 'master' of https://github.com/sharkdp/bat .git/FETCH_HEAD:2:8244eb8ef88cc1b64d27991d6a5c7c69586b8a13 not-for-merge branch 'ci-experiment' of https://github.com/sharkdp/bat .git/FETCH_HEAD:3:271842d87c816cb80dc0a1c48eefee99c9439db6 not-for-merge branch 'create_highlighted_versions-wrong-path-repro' of https://github.com/sharkdp/bat .git/FETCH_HEAD:4:c42ec074ea6accdc38b8d9278bc3810343e2d1a3 not-for-merge branch 'dependabot/submodules/assets/syntaxes/02_Extra/PowerShell-742f0b5' of https://github.com/sharkdp/bat .git/FETCH_HEAD:5:fb9c30b1f7ff648d8aa8fb35a8ff669513c8e91f not-for-merge branch 'dependabot/submodules/assets/syntaxes/02_Extra/SCSS_Sass-d3d9404' of https://github.com/sharkdp/bat .git/FETCH_HEAD:6:179d905bb92eee7272cf6fbb38db88f9294df94a not-for-merge branch 'dependabot/submodules/assets/syntaxes/02_Extra/TypeScript-ba45efd' of https://github.com/sharkdp/bat .git/FETCH_HEAD:7:b146958ecbb8c8c926159509ca7fb32a8573f897 not-for-merge branch 'release-v0.18.3' of https://github.com/sharkdp/bat .git/logs/HEAD:14:a946f3ae23e7d6d9aa6361c034e9b62859b4dbff e92e13cd4332196617df7a07bc6c55d1fd4834bb David Peter 1631038809 +0200 rebase (continue) (pick): Use BAT_CONFIG_DIR and BAT_CACHE_PATH .git/modules/assets/themes/Coldark/FETCH_HEAD:1:e44750b2a9629dd12d8ed3ad9fd50c77232170b9 not-for-merge branch 'master' of https://github.com/ArmandPhilippot/coldark-bat .git/modules/assets/themes/Coldark/logs/refs/heads/master:1:0000000000000000000000000000000000000000 b4a1c74d8d5bdd136ec530e5905b810272472545 sharkdp 1603543180 +0200 clone: from https://github.com/ArmandPhilippot/coldark-bat.git .git/modules/assets/themes/Coldark/logs/refs/remotes/origin/HEAD:1:0000000000000000000000000000000000000000 b4a1c74d8d5bdd136ec530e5905b810272472545 sharkdp 1603543180 +0200 clone: from https://github.com/ArmandPhilippot/coldark-bat.git .git/modules/assets/themes/Coldark/logs/HEAD:1:0000000000000000000000000000000000000000 b4a1c74d8d5bdd136ec530e5905b810272472545 sharkdp 1603543180 +0200 clone: from https://github.com/ArmandPhilippot/coldark-bat.git .git/modules/assets/themes/Coldark/config:8: url = https://github.com/ArmandPhilippot/coldark-bat.git .git/modules/assets/themes/gruvbox/FETCH_HEAD:1:64c47250e54298b91e2cf8d401320009aba9f991 not-for-merge branch 'bat-source' of https://github.com/subnut/gruvbox-tmTheme .git/packed-refs:22:b41fb0df6cf831081754c27a4c33227c166eee69 refs/heads/bat-0.16-updates .git/packed-refs:23:b5a40d0866e6a190fbee095ac104fdc6ec168d0a refs/heads/bat-0.18.2-release .git/packed-refs:24:fa0d448cd3e652ffd3c5caa4caa4bdbe2973241c refs/heads/bat-config-file .git/packed-refs:25:27516c6f26dc1319dc2516e7caf1aafbe8d30aa0 refs/heads/bat-diagnostic-option .git/packed-refs:26:cd501edcbded4dc344e0a0478472b0a4819c2251 refs/heads/bat-diff .git/packed-refs:27:d77742b2e425cd76e2ca90a75efba4205e280859 refs/heads/bat-diff-fixes .git/packed-refs:216:f1f8807a38052c8138c6f8d1b3bf125e30588712 refs/remotes/origin/bat-v0.18.3-candidate .git/config:7: url = https://github.com/sharkdp/bat.git .git/config:13: slug = sharkdp/bat .git/config:143:[branch "bat-config-file"] .git/config:145: merge = refs/heads/bat-config-file .git/config:176:[branch "bat-diff"] .git/config:178: merge = refs/heads/bat-diff .git/config:228: remote = git@github.com:lavifb/bat.git .git/config:231: url = https://github.com/lavifb/bat .git/config:234: remote = git@github.com:majecty/bat.git .git/config:237: url = https://github.com/majecty/bat .git/config:246: remote = git@github.com:reidwagner/bat.git .git/config:315: remote = git@github.com:hrlmartins/bat.git .git/config:369: remote = git@github.com:fvictorio/bat.git .git/config:378: remote = git@github.com:eth-p/bat.git .git/config:387: remote = git@github.com:Kogia-sima/bat.git .git/config:426: remote = git@github.com:neuronull/bat.git .git/config:429: remote = git@github.com:jmick414/bat.git .git/config:435: remote = git@github.com:dtolnay/bat.git .git/config:441: remote = git@github.com:eth-p/bat.git .git/config:444: remote = git@github.com:neuronull/bat.git .git/config:482:[branch "bat-diff-fixes"] .git/config:484: merge = refs/heads/bat-diff-fixes .git/config:486: remote = git@github.com:lzutao/bat.git .git/config:507: remote = git@github.com:eth-p/bat.git .git/config:510: remote = git@github.com:eth-p/bat.git .git/config:513: remote = git@github.com:kopecs/bat.git .git/config:516: remote = git@github.com:eth-p/bat.git .git/config:540: remote = git@github.com:rxt1077/bat.git .git/config:558: remote = git@github.com:alexnovak/bat.git .git/config:561: remote = git@github.com:guidocella/bat.git .git/config:564: remote = git@github.com:gsomix/bat.git .git/config:567: remote = git@github.com:caioalonso/bat.git .git/config:579: remote = git@github.com:mk12/bat.git .git/config:585: remote = git@github.com:kjmph/bat.git .git/config:591: remote = git@github.com:Kienyew/bat.git .git/config:603: remote = git@github.com:alexanderkarlis/bat.git .git/config:609: remote = git@github.com:ahmedelgabri/bat.git .git/config:615: remote = git@github.com:Kienyew/bat.git .git/config:618: remote = git@github.com:eth-p/bat.git .git/config:620:[branch "bat-0.16-updates"] .git/config:622: merge = refs/heads/bat-0.16-updates .git/config:624: remote = git@github.com:henil/bat.git .git/config:627: remote = git@github.com:AkshatGadhwal/bat.git .git/config:633: remote = git@github.com:loganintech/bat.git .git/config:639: remote = git@github.com:mzegar/bat.git .git/config:642: remote = git@github.com:AkshatGadhwal/bat.git .git/config:645: remote = git@github.com:AkshatGadhwal/bat.git .git/config:651: remote = git@github.com:jacobmischka/bat.git .git/config:657: url = https://github.com/forkeith/bat.git .git/config:660: remote = git@github.com:ArmandPhilippot/bat.git .git/config:664: url = https://github.com/ArmandPhilippot/coldark-bat.git .git/config:666: remote = git@github.com:adrian-rivera/bat.git .git/config:669: remote = git@github.com:eth-p/bat.git .git/config:681: remote = git@github.com:MarcoIeni/bat.git .git/config:690: remote = git@github.com:Enselic/bat.git .git/config:696: remote = git@github.com:stku1985/bat.git .git/config:699: remote = git@github.com:mk12/bat.git .git/config:702: remote = git@github.com:j0hnmeow/bat.git .git/config:708: remote = git@github.com:Enselic/bat.git .git/config:713:[branch "bat-diagnostic-option"] .git/config:715: merge = refs/heads/bat-diagnostic-option .git/config:717: url = https://github.com/niklasmohrin/bat.git .git/config:723: remote = git@github.com:paulsmith/bat.git .git/config:735: remote = git@github.com:Enselic/bat.git .git/config:762: remote = git@github.com:Enselic/bat.git .git/config:771: remote = git@github.com:brightly-salty/bat.git .git/config:774: remote = git@github.com:eth-p/bat.git .git/config:804: remote = git@github.com:matklad/bat.git .git/config:827:[branch "bat-0.18.2-release"] .git/config:829: merge = refs/heads/bat-0.18.2-release .git/config:831: remote = git@github.com:Enselic/bat.git .git/config:834: remote = git@github.com:steffahn/bat.git .git/config:837: remote = git@github.com:SarveshMD/bat.git .git/config:840: remote = git@github.com:Enselic/bat.git .git/config:852: remote = git@github.com:Enselic/bat.git .git/config:861: remote = git@github.com:bojan88/bat.git .git/config:870: remote = git@github.com:Enselic/bat.git .git/config:882: remote = git@github.com:Enselic/bat.git CHANGELOG.md:6:- `$BAT_CONFIG_DIR` is now a recognized environment variable. It has precedence over `$XDG_CONFIG_HOME`, see #1727 (@billrisher) CHANGELOG.md:25:- Include git hash in `bat -V` and `bat --version` output if present. See #1921 (@Enselic) CHANGELOG.md:42:## `bat` as a library CHANGELOG.md:45:- 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 (@Enselic) CHANGELOG.md:67:- 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). CHANGELOG.md:92:- The `LESS` environment variable is now included in `bat --diagnostic`, see #1589 (@Enselic) CHANGELOG.md:98:- Replaced "Advanced CSV" with a custom CSV syntax definition written especially for `bat`; see #1574 (@keith-hall) CHANGELOG.md:112:- Use a pager when `bat --list-languages` is called, see #1394 (@stku1985) CHANGELOG.md:117:- Only print themes hint in interactive mode (`bat --list-themes`), see #1439 (@rsteube) CHANGELOG.md:122:- If `PAGER` (but not `BAT_PAGER` or `--pager`) is `more` or `most`, silently use `less` instead to ensure support for colors, see #1063 (@Enselic) CHANGELOG.md:123:- If `PAGER` is `bat`, silently use `less` to prevent recursion. For `BAT_PAGER` or `--pager`, exit with error, see #1413 (@Enselic) CHANGELOG.md:125:- `BAT_CONFIG_PATH` ignored by `bat` if non-existent, see #1550 (@sharkdp) CHANGELOG.md:147:## `bat` as a library CHANGELOG.md:160:- Running `bat` without arguments fails ("output file is also an input"), see #1396 CHANGELOG.md:168:- Pass `-S` ("chop long lines") to `less` if `--wrap=never` is set in `bat`, see #1255 (@gahag) CHANGELOG.md:173:- Throw an error when `bat` is being used as `pager`, see #1343 (@adrian-rivera) CHANGELOG.md:225:## `bat` as a library CHANGELOG.md:246:- Cannot run `bat` with relative paths, see #1022 CHANGELOG.md:247:- bat mishighlights Users that start with digits in SSH config, see #984 CHANGELOG.md:268:- bat now prints an error if an invalid syntax is specified via `-l` or `--map-syntax`, see #1004 (@eth-p) CHANGELOG.md:270:## `bat` as a library CHANGELOG.md:276:- 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. CHANGELOG.md:284: 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. CHANGELOG.md:303:- Performance improvements when using custom caches (via `bat cache --build`): the `bat` startup time should now be twice as fast (@lzutao). CHANGELOG.md:309:## `bat` as a library CHANGELOG.md:320: in the header. This is useful when piping input into `bat`. See #654 and #892 (@neuronull). CHANGELOG.md:336:- When saving/reading user-provided syntaxes or themes, `bat` will now maintain a CHANGELOG.md:337: `metadata.yaml` file which includes information about the `bat` version which was CHANGELOG.md:342:## `bat` as a library CHANGELOG.md:346: API is still available (basically everything that is not in the root `bat` CHANGELOG.md:349: Note that this should still be considered a "beta" release of `bat`-as-a-library. CHANGELOG.md:354: everything required by `bat` the application. When depending on bat as a library, downstream CHANGELOG.md:358: bat = { version = "0.14", default-features = false } CHANGELOG.md:371:## `bat` as a library CHANGELOG.md:373:Beginning with this release, `bat` can be used as a library (#423). CHANGELOG.md:378:- Second attempt, complete restructuring of the `bat` crate, see #679 (@DrSensor) CHANGELOG.md:383:That being said, you can start using it! See the example programs in [`examples/`](https://github.com/sharkdp/bat/tree/master/examples). CHANGELOG.md:385:You can see the API documentation here: https://docs.rs/bat/ CHANGELOG.md:390: users need to update their bat config files (`bat --config-file`), if they have any `--map-syntax` settings CHANGELOG.md:407:- `BAT_CACHE_PATH` can be used to place cached `bat` assets in a non-standard path, see #829 (@neuronull) CHANGELOG.md:413:- 'bat cache' still takes precedence over existing files, see #666 (@sharkdp) CHANGELOG.md:425:- Enabled LTO, making `bat` about 10% faster, see #719 (@bolinfest, @sharkdp) CHANGELOG.md:426:- Suggestions non how to configure `bat` for MacOS dark mode, see README (@jerguslejko) CHANGELOG.md:427:- Extended ["Integration with other tools"](https://github.com/sharkdp/bat#integration-with-other-tools) section (@eth-p) CHANGELOG.md:428:- Updated [instrutions on how to use `bat` as a `man`-pager](https://github.com/sharkdp/bat#man), see #652, see #667 (@sharkdp) CHANGELOG.md:456:- `bat` is now in the official Ubuntu and Debian repositories, see #323 and #705 (@MarcoFalke) CHANGELOG.md:457:- `bat` can now be installed via MacPorts, see #675 (@bn3t) CHANGELOG.md:476:- Binary file content can now be viewed with `bat -A`, see #623, #640 (@pjsier and @sharkdp) CHANGELOG.md:477:- `bat` can now be used as a man pager. Take a look at the README and #523 for more details. CHANGELOG.md:506:- `bat` is now in the official Gentoo repositories, see #588 (@toku-sa-n) CHANGELOG.md:507:- `bat` is now in the official Alpine Linux repositories, see #586 (@5paceToast) CHANGELOG.md:508:- `bat` is in the official Fedora repositories, see #610 (@ignatenkobrain) CHANGELOG.md:534:- New ["Integration with other tools"](https://github.com/sharkdp/bat#integration-with-other-tools) section in the README. CHANGELOG.md:544:- `bat` is now available on Chocolatey, see #541 (@rasmuskriest) CHANGELOG.md:554:- **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`). CHANGELOG.md:559:- Rename `bat cache --init` to `bat cache --build`, see #498 CHANGELOG.md:560:- Move the `--config-dir` and `--cache-dir` options from `bat cache` to `bat` and hide them from the help text. CHANGELOG.md:596:- Added `BAT_CONFIG_PATH` environment variable to set a non-default path for `bat`s configuration file, see #375 (@deg4uss3r) CHANGELOG.md:618:- Avoid endless recursion when `PAGER="bat"`, see #383 (@rodorgas) CHANGELOG.md:622:- `bat` is now available on openSUSE, see #405 (@dmarcoux) CHANGELOG.md:651: The configuration file path can be accessed via `bat --config-file`. On Linux, CHANGELOG.md:652: it is stored in `~/.config/bat/config`. CHANGELOG.md:654:- Support for the `BAT_OPTS` environment variable with the same format as specified CHANGELOG.md:664: bat --map-syntax .config:json ... CHANGELOG.md:667: The option can be use multiple times. Note that you can easily make these mappings permanent by using bats new configuration file. CHANGELOG.md:671:- Support pager command-line arguments in `PAGER` and `BAT_PAGER`, see #352 (@Foxboron) CHANGELOG.md:689:- Bat Panics on Haskell Source Code, see #314 CHANGELOG.md:695:- Updated documentation on how to configure `bat`s pager CHANGELOG.md:703:- `bat` is now available via [Termux](https://termux.com/), see #341 (@fornwall) CHANGELOG.md:705:- `bat` is now available via [nix](https://nixos.org/nix), see #344 (@mgttlinger) CHANGELOG.md:707:- `bat` is now available via [Docker](https://hub.docker.com/r/danlynn/bat/), see #331 (@danlynn) CHANGELOG.md:717:- Bat Panics on Haskell Source Code, see #314 CHANGELOG.md:730: `--tabs` command-line option or the `BAT_TABS` environment variable. The CHANGELOG.md:733:- Added support for the `BAT_STYLE` environment variable, see #208 (@ms2300) CHANGELOG.md:764:- Added README section about "`bat` on Windows" (@Aankhen) CHANGELOG.md:772:- Fixed panic when running `bat --list-languages | head`, see #232 (@mchlrhw) CHANGELOG.md:786:- Major refactorings, enabling some progress on #150. In non-interactive mode, `bat` will now copy input bytes 1:1. CHANGELOG.md:792:- New themes in `$BAT_CONFIG_DIR/themes` are now loaded *in addition* to CHANGELOG.md:798:* Using `bat cache --init` leads to duplicated syntaxes, see #206 CHANGELOG.md:811:- 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) CHANGELOG.md:812:- 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) CHANGELOG.md:818:- 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 CHANGELOG.md:830:- `bat` is now in the official [Arch package repositories](https://www.archlinux.org/packages/community/x86_64/bat/). CHANGELOG.md:839:- Fix problem with `cargo test` when `bat` is not checked out in a Git repository, see #161 CHANGELOG.md:874:- [Comparison with alternative projects](https://github.com/sharkdp/bat/blob/master/doc/alternatives.md). CHANGELOG.md:875:- New "bat" logo in the README, see #119 (@jraulhernandezi) CHANGELOG.md:895: `bat cache`. See `bat cache -h` for all available commands. CHANGELOG.md:900:* Process substitution can now be used with bat (`bat <(echo a) <(echo b)`), see #80 CHANGELOG.md:912:- Added a new statically linked version of bat (`..-musl-..`) CONTRIBUTING.md:3:Thank you for considering to contribute to `bat`! CONTRIBUTING.md:9:If your contribution changes the behavior of `bat` (as opposed to a typo-fix CONTRIBUTING.md:12:therefore helps to get your changes into a new `bat` release faster. CONTRIBUTING.md:28:Please check out the [Development](https://github.com/sharkdp/bat#development) CONTRIBUTING.md:35:[feature request ticket](https://github.com/sharkdp/bat/issues/new?assignees=&labels=feature-request&template=feature_request.md) CONTRIBUTING.md:42:the [Customization](https://github.com/sharkdp/bat#customization) section CONTRIBUTING.md:47:[documentation](https://github.com/sharkdp/bat/blob/master/doc/assets.md) Cargo.toml:5:homepage = "https://github.com/sharkdp/bat" Cargo.toml:7:name = "bat" Cargo.toml:8:repository = "https://github.com/sharkdp/bat" Cargo.toml:16:# Feature required for bat the application. Should be disabled when depending on Cargo.toml:17:# bat as a library. Cargo.toml:40:# You need to use one of these if you depend on bat as a library: doc/fzf-preview.sh:6: bat \ doc/preview.sh:47:bat --color always \ doc/assets.md:3: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. doc/assets.md:5:`bat` uses the excellent [syntect](https://github.com/trishume/syntect) library to highlight source doc/assets.md:20:3. Run the `assets/create.sh` script. It calls `bat cache --build` to parse all available doc/assets.md:23:4. Re-compile `bat`. At compilation time, the `syntaxes.bin` file will be stored inside the doc/assets.md:24: `bat` binary. doc/assets.md:26:5. Use `bat --list-languages` to check if the new languages are available. doc/assets.md:31: file. A new binary cache file will be created once before every new release of `bat`. This doc/assets.md:36:`bat` has a set of syntax highlighting regression tests in `tests/syntax-tests`. The main idea is doc/assets.md:38:for some language is suddenly not working anymore or (2) `bat` suddenly crashes for some input (due doc/assets.md:43:1. Make sure that you are running the **latest version of `bat`** and that `bat` is available on doc/assets.md:45: your version of `bat` already has the new syntax builtin. doc/assets.md:50: be `test.rb` (adapt extension) but can also be adapted if that is necessary in order for `bat` to doc/assets.md:53: under the respective license and that the license is compatible with `bat`s license. If it doc/assets.md:62:6. Use `cat` or `bat --language=txt` to display the content of this file and make sure that the doc/assets.md:70:themes (`bat cache --clear`). doc/README-ja.md:2: bat - a cat clone with wings
doc/README-ja.md:3: Build Status doc/README-ja.md:4: license doc/README-ja.md:5: Version info
doc/README-ja.md:16: [中文] doc/README-ja.md:24:`bat` は多くのプログラミング言語やマークアップ言語の doc/README-ja.md:31:`bat` は `git` とも連携しており、差分を表現する記号が表示されます doc/README-ja.md:45:出力が1つの画面に対して大きすぎる場合、`bat` は自身の出力をページャー(例えば `less`) にパイプで繋げます。 doc/README-ja.md:50:`bat` は非対話型のターミナルを検出すると(すなわち他のプロセスにパイプしたりファイル出力していると)、 doc/README-ja.md:51:`bat` は `cat` の完全互換として振る舞い、 doc/README-ja.md:59:> bat README.md doc/README-ja.md:65:> bat src/*.rs doc/README-ja.md:73:> curl -s https://sh.rustup.rs | bat doc/README-ja.md:79:> yaml2json .travis.yml | json_pp | bat -l json doc/README-ja.md:84:> bat -A /etc/hosts doc/README-ja.md:87:`cat` の代わりに `bat` を使用する際の例: doc/README-ja.md:90:bat > note.md # quickly create a new file doc/README-ja.md:92:bat header.md content.md footer.md > document.md doc/README-ja.md:94:bat -n main.rs # show line numbers (only) doc/README-ja.md:96:bat f - g # output 'f', then stdin, then 'g'. doc/README-ja.md:103:[`fzf`](https://github.com/junegunn/fzf) のプレビューウィンドウに `bat` を使用できます。 doc/README-ja.md:104:その場合、`bat` の `--color=always` オプションを用いてカラー出力を強制しなければなりません。 doc/README-ja.md:107:fzf --preview 'bat --color=always --style=numbers --line-range=:500 {}' doc/README-ja.md:114:`find` の `-exec` オプションを使用して、`bat` ですべての検索結果をプレビューできます: doc/README-ja.md:116:find … -exec bat {} + doc/README-ja.md:119:[`fd`](https://github.com/sharkdp/fd) を使用している場合は、`-X` /`-exec-batch` オプションを使用して同じことを行うことができます: doc/README-ja.md:121:fd … -X bat doc/README-ja.md:126:[`batgrep`](https://github.com/eth-p/bat-extras/blob/master/doc/batgrep.md) では、[`ripgrep`](https://github.com/BurntSushi/ripgrep) 検索結果のプリンターとして `bat` を使用できます。 doc/README-ja.md:129:batgrep needle src/ doc/README-ja.md:134:`bat` を `tail -f` と組み合わせて、構文強調表示を使用して特定のファイルを継続的に監視できます。 doc/README-ja.md:136:tail -f /var/log/pacman.log | bat --paging=never -l log doc/README-ja.md:142:`bat` を `git show` と組み合わせて、 doc/README-ja.md:145:git show v0.6.0:src/main.rs | bat -l rs doc/README-ja.md:152:`bat` の出力の行番号と Git 変更マーカーにより、ファイルの内容をコピーするのが難しくなる場合があります。 doc/README-ja.md:153:これを防ぐには、`-p` / `-plain` オプションを使用して `bat` を呼び出すか、 doc/README-ja.md:156:bat main.cpp | xclip doc/README-ja.md:158:`bat` は出力がリダイレクトされていることを検出し、プレーンファイルの内容を出力します。 doc/README-ja.md:162:`bat` は `MANPAGER` 環境変数を設定することにより、 doc/README-ja.md:166:export MANPAGER="sh -c 'col -bx | bat -l man -p'" doc/README-ja.md:173:これを新しいコマンドにバンドルしたい場合は [`batman`](https://github.com/eth-p/bat-extras/blob/master/doc/batman.md) も使用できます。 doc/README-ja.md:179:[`prettybat`](https://github.com/eth-p/bat-extras/blob/master/doc/prettybat.md) スクリプトは、コードをフォーマットし、`bat` で印刷するラッパーです。 doc/README-ja.md:184:[![Packaging status](https://repology.org/badge/vertical-allrepos/bat.svg)](https://repology.org/project/bat/versions) doc/README-ja.md:189:Ubuntu Eoan 19.10 または Debian 不安定版 sid 以降の [the Ubuntu `bat` package](https://packages.ubuntu.com/eoan/bat) または [the Debian `bat` package](https://packages.debian.org/sid/bat) からインストールできます: doc/README-ja.md:192:apt install bat doc/README-ja.md:195:`apt` を使用して `bat` をインストールした場合、実行可能ファイルの名前が `bat` ではなく `batcat` になることがあります([他のパッケージとの名前衝突のため](https://github.com/sharkdp/bat/issues/982))。`bat -> batcat` のシンボリックリンクまたはエイリアスを設定することで、実行可能ファイル名が異なることによる問題の発生を防ぎ、他のディストリビューションと一貫性を保てます。 doc/README-ja.md:199:ln -s /usr/bin/batcat ~/.local/bin/bat doc/README-ja.md:205:batの最新リリースを実行する場合、または Ubuntu/Debian の古いバージョンを使用している場合は、[release page](https://github.com/sharkdp/bat/releases) から最新の `.deb` パッケージをダウンロードし、 doc/README-ja.md:208:sudo dpkg -i bat_0.18.3_amd64.deb # adapt version number and architecture doc/README-ja.md:214:公式のソースから [`bat` package](https://pkgs.alpinelinux.org/packages?name=bat) をインストールできます: doc/README-ja.md:217:apk add bat doc/README-ja.md:222:[Arch Linuxの公式リソース](https://www.archlinux.org/packages/community/x86_64/bat/) doc/README-ja.md:226:pacman -S bat doc/README-ja.md:231:公式の [Fedora Modular](https://docs.fedoraproject.org/en-US/modularity/using-modules/) リポジトリから [the `bat` package](https://koji.fedoraproject.org/koji/packageinfo?packageID=27506) をインストールできます。 doc/README-ja.md:234:dnf install bat doc/README-ja.md:240:[the `bat` package](https://packages.gentoo.org/packages/sys-apps/bat) をインストールできます。 doc/README-ja.md:243:emerge sys-apps/bat doc/README-ja.md:248:xbps-install経由で `bat` をインストールできます。 doc/README-ja.md:250:xbps-install -S bat doc/README-ja.md:255:pkg を使用してプリコンパイルされた [`bat` package](https://www.freshports.org/textproc/bat) をインストールできます: doc/README-ja.md:258:pkg install bat doc/README-ja.md:264:cd /usr/ports/textproc/bat doc/README-ja.md:270:`bat` を [nix package manager](https://nixos.org/nix) 経由でインストールすることができます: doc/README-ja.md:273:nix-env -i bat doc/README-ja.md:278:`bat` をzypperでインストールすることができます: doc/README-ja.md:281:zypper install bat doc/README-ja.md:286:[Homebrew](http://braumeister.org/formula/bat)で `bat` をインストールできます: doc/README-ja.md:289:brew install bat doc/README-ja.md:292:または [MacPorts](https://ports.macports.org/port/bat/summary) で `bat` をインストールします: doc/README-ja.md:295:port install bat doc/README-ja.md:300:Windowsにbatをインストールするいくつかのオプションがあります。 doc/README-ja.md:301:batをインストールしたら [Windowsでのbatの使用](#windows-での-bat-の利用) セクションをご覧ください。 doc/README-ja.md:305:[Chocolatey](https://chocolatey.org/packages/Bat) から `bat` をインストールできます: doc/README-ja.md:307:choco install bat doc/README-ja.md:312:[scoop](https://scoop.sh/) から `bat` をインストールできます: doc/README-ja.md:314:scoop install bat doc/README-ja.md:321:[リリースページ](https://github.com/sharkdp/bat/releases) からビルド済みのバイナリをダウンロードできます。 doc/README-ja.md:327:コンテナ内で `bat` を使いたい方のために [Docker image](https://hub.docker.com/r/danlynn/bat/) が用意されています: doc/README-ja.md:329:docker pull danlynn/bat doc/README-ja.md:330:alias bat='docker run -it --rm -e BAT_THEME -e BAT_STYLE -e BAT_TABS -v "$(pwd):/myapp" danlynn/bat' doc/README-ja.md:339:ansible-galaxy install aeimer.install_bat doc/README-ja.md:344:# Playbook to install bat doc/README-ja.md:347: - aeimer.install_bat doc/README-ja.md:350:- [Ansible Galaxy](https://galaxy.ansible.com/aeimer/install_bat) doc/README-ja.md:351:- [GitHub](https://github.com/aeimer/ansible-install-bat) doc/README-ja.md:364:多くの異なるアーキテクチャのためのプレビルドバージョンを[リリースページ](https://github.com/sharkdp/bat/releases)からチェックしてみてください。静的にリンクされている多くのバイナリも利用できます: ファイル名に `musl` を含むアーカイブを探してみてください。 doc/README-ja.md:369:`bat` をソースからビルドしたいならば、Rust 1.36 以上の環境が必要です。 doc/README-ja.md:373:cargo install --locked bat doc/README-ja.md:382:`bat --list-themes` を使うと現在利用可能なシンタックスハイライトのテーマを入手できます。 doc/README-ja.md:384:`--theme=TwoDark` オプションをつけるか `BAT_THEME` という環境変数に doc/README-ja.md:385:`TwoDark` を代入する必要があります。 シェルの起動ファイルに `export BAT_THEME="TwoDark"` doc/README-ja.md:386:と定義すればその設定が変わることはないでしょう。あるいは、 `bat` の doc/README-ja.md:392:bat --list-themes | fzf --preview="bat --theme={} --color=always /path/to/file" doc/README-ja.md:395:`bat` はデフォルトだと黒い背景色のターミナルに適しています。 doc/README-ja.md:402:`--style` を使うことで `bat` の表示の見た目を変更することができます。 doc/README-ja.md:405:環境変数に `BAT_STYLE` を定義するとこれらの設定を永続的に使用することができます。 doc/README-ja.md:410:`bat` はシンタックスハイライトのための [`syntect`](https://github.com/trishume/syntect/) doc/README-ja.md:418:mkdir -p "$(bat --config-dir)/syntaxes" doc/README-ja.md:419:cd "$(bat --config-dir)/syntaxes" doc/README-ja.md:429:bat cache --build doc/README-ja.md:432:最後に `bat --list-languages` と入力すると新しい言語が利用可能かどうかチェックします。 doc/README-ja.md:437:bat cache --clear doc/README-ja.md:446:mkdir -p "$(bat --config-dir)/themes" doc/README-ja.md:447:cd "$(bat --config-dir)/themes" doc/README-ja.md:453:bat cache --build doc/README-ja.md:456:最後に、 `bat --list-themes` で新しいテーマが利用可能かチェックします doc/README-ja.md:460:`bat` は環境変数 `PAGER` に使用するページャーを明記します。 doc/README-ja.md:463:または、`PAGER` を上書きする環境変数として `BAT_PAGER` を定義することも可能です。 doc/README-ja.md:466:`PAGER`/`BAT_PAGER` 環境変数を定義してください: doc/README-ja.md:469:export BAT_PAGER="less -RF" doc/README-ja.md:472:環境変数を利用する代わりに、 `bat` の [設定ファイル](#設定ファイル) を使用して設定も可能です(`--pager` オプション) doc/README-ja.md:475:`bat` はページャーの以下のコマンドラインオプション を受け付けるでしょう: doc/README-ja.md:491:macOSでダークモード機能を使用する場合、OSテーマに基づいて異なるテーマを使用するように `bat` を構成することができます。 doc/README-ja.md:496:alias cat="bat --theme=\$(defaults read -globalDomain AppleInterfaceStyle &> /dev/null && echo default || echo GitHub)" doc/README-ja.md:501:`bat` は設定ファイルでカスタマイズすることが可能です。ファイルの場所はOSに依存します。 doc/README-ja.md:504:bat --config-file doc/README-ja.md:507:または、`BAT_CONFIG_PATH` 環境変数を使用して、`bat` が doc/README-ja.md:510:export BAT_CONFIG_PATH="/path/to/bat.conf" doc/README-ja.md:515:この設定ファイルはコマンドライン引数の単純なリストです。 `bat --help` を利用すると、利用可能なオプションとその値を閲覧することができます。さらに、`#` でコメント文を加えることができます。 doc/README-ja.md:535:## Windows での `bat` の利用 doc/README-ja.md:537:Windows 上で `bat` はほとんど動作しますが、いくつかの機能は設定を必要をする場合があります。 doc/README-ja.md:555:`BAT_PAGER` に空文字を設定することでページングを完全に無効にできます。 doc/README-ja.md:559:Windows上の `bat` は Cygwin のunix風のpath(`/cygdrive/*`)をネイティブサポートしていません。絶対的なcygwinパスを引数として受けたときに、 `bat` は以下のエラーを返すでしょう: `The system cannot find the path specified. (os error 3)` doc/README-ja.md:564:bat() { doc/README-ja.md:573: command bat "${args[@]}" doc/README-ja.md:581:`bat` はターミナルがトゥルーカラーをサポートしている/していないに関係なくサポートします。 doc/README-ja.md:588:`24bit` のどちらかを代入してください。さもなければ、`bat` はどの色を使うのか決定することができません。または、24-bit エスケープシーケンスがサポートされません doc/README-ja.md:593:異なるテーマを試してみてください(`bat --list-themes` でテーマを閲覧できます)。 doc/README-ja.md:598:`bat` は UTF-16 と同様に UTF-8 をネイティブにサポートします。 doc/README-ja.md:603:iconv -f ISO-8859-1 -t UTF-8 my-file.php | bat doc/README-ja.md:605:注: `bat` が構文を自動検出できない場合は doc/README-ja.md:612:git clone --recursive https://github.com/sharkdp/bat doc/README-ja.md:615:cd bat doc/README-ja.md:624:# Build a bat binary with modified syntaxes and themes doc/README-ja.md:636:`bat` は以下の目標を達成しようと試みています: doc/README-ja.md:647:Copyright (c) 2018-2021 [bat-developers](https://github.com/sharkdp/bat). doc/README-ja.md:649:`bat` は MIT License 及び Apache License 2.0 の両方の条件の下で配布されています。 doc/README-ko.md:2: bat - a cat clone with wings
doc/README-ko.md:3: Build Status doc/README-ko.md:4: license doc/README-ko.md:5: Version info
doc/README-ko.md:16: [中文] doc/README-ko.md:24:`bat`은 다양한 프로그래밍 및 마크업 언어의 문법 강조(syntax highlighting) 기능을 doc/README-ko.md:31:`bat`은 `git`을 통해 인덱스와 함께 변경분을 표시합니다 doc/README-ko.md:44:`bat`은 기본적으로 한 화면에 비해 출력이 큰 경우 `less`와 같은 페이저(pager)로 doc/README-ko.md:46:만약 `bat`을 언제나 `cat`처럼 작동하게 하려면 (출력을 페이지하지 않기), doc/README-ko.md:48:셸(shell) 설정에서 `cat`을 `bat`의 alias로 사용하려면, doc/README-ko.md:49:`alias cat='bat --paging=never'`를 써서 기본 행동을 유지할 수 있습니다. doc/README-ko.md:53:페이저(pager)를 사용하더라도 `bat`은 파일들을 연결(concatenate)할 수 있습니다 doc/README-ko.md:55:`bat`이 비대화형(non-interactive) 터미널(예를 들어, 다른 프로세스나 파일에 doc/README-ko.md:56:연결(pipe)한 경우)을 감지하면, `bat`은 `--pager` 옵션의 값과 상관없이 `cat`과 doc/README-ko.md:64:> bat README.md doc/README-ko.md:70:> bat src/*.rs doc/README-ko.md:78:> curl -s https://sh.rustup.rs | bat doc/README-ko.md:84:> yaml2json .travis.yml | json_pp | bat -l json doc/README-ko.md:89:> bat -A /etc/hosts doc/README-ko.md:95:bat > note.md # quickly create a new file doc/README-ko.md:97:bat header.md content.md footer.md > document.md doc/README-ko.md:99:bat -n main.rs # show line numbers (only) doc/README-ko.md:101:bat f - g # output 'f', then stdin, then 'g'. doc/README-ko.md:108:`bat`을 [`fzf`](https://github.com/junegunn/fzf)의 프리뷰로 쓸 수 있습니다. doc/README-ko.md:109:이를 위해서는 `bat`의 `--color=always` 옵션으로 항상 컬러 출력이 나오게 해야 doc/README-ko.md:113:fzf --preview 'bat --color=always --style=numbers --line-range=:500 {}' doc/README-ko.md:120:`find`의 `-exec` 옵션을 사용하여 모든 검색 결과를 `bat`로 미리 볼 수 있습니다: doc/README-ko.md:122:find … -exec bat {} + doc/README-ko.md:125:[`fd`](https://github.com/sharkdp/fd)를 사용하는 경우, `-X`/`--exec-batch` doc/README-ko.md:128:fd … -X bat doc/README-ko.md:133:[`batgrep`](https://github.com/eth-p/bat-extras/blob/master/doc/batgrep.md)을 doc/README-ko.md:134:통해 `bat`로 [`ripgrep`](https://github.com/BurntSushi/ripgrep)의 검색 결과를 doc/README-ko.md:138:batgrep needle src/ doc/README-ko.md:143:`bat`와 `tail -f`를 함께 사용하여 주어진 파일을 문법 강조하며 지속적으로 doc/README-ko.md:146:tail -f /var/log/pacman.log | bat --paging=never -l log doc/README-ko.md:154:`bat`과 `git show`를 함께 사용하여 주어진 파일의 이전 버전을 올바른 문법 강조로 doc/README-ko.md:157:git show v0.6.0:src/main.rs | bat -l rs doc/README-ko.md:162:`bat`과 `git diff`를 함께 사용하여 수정된 코드 주위의 줄들을 올바른 문법 강조로 doc/README-ko.md:165:batdiff() { doc/README-ko.md:166: git diff --name-only --diff-filter=d | xargs bat --diff doc/README-ko.md:170:[`bat-extras`](https://github.com/eth-p/bat-extras)의 `batdiff`를 확인해 보세요. doc/README-ko.md:177:`bat` 출력에 줄 번호와 Git 수정 내역이 포함되어서 파일의 내용을 복사하기 doc/README-ko.md:179:이 경우에는 `bat`의 `-p`/`--plain` 옵션을 사용하거나 간단히 `xclip`으로 출력을 doc/README-ko.md:182:bat main.cpp | xclip doc/README-ko.md:184:`bat`는 출력이 우회되고 있다는 것을 감지하여 파일 내용 그대로를 출력합니다. doc/README-ko.md:188:`MANPAGER` 환경 변수 설정을 통해 `bat`을 `man`의 컬러 페이저(pager)로 쓸 수 doc/README-ko.md:192:export MANPAGER="sh -c 'col -bx | bat -l man -p'" doc/README-ko.md:195:(Debian이나 Ubuntu를 사용한다면 `bat`을 `batcat`으로 치환하세요.) doc/README-ko.md:200:[`batman`](https://github.com/eth-p/bat-extras/blob/master/doc/batman.md)을 쓸 doc/README-ko.md:207:[작동하지 않습니다](https://github.com/sharkdp/bat/issues/1145). doc/README-ko.md:211:[`prettybat`](https://github.com/eth-p/bat-extras/blob/master/doc/prettybat.md) doc/README-ko.md:212:스크립트는 코드를 포맷하고 `bat`으로 출력하는 래퍼(wrapper)입니다. doc/README-ko.md:217:[![Packaging status](https://repology.org/badge/vertical-allrepos/bat-cat.svg)](https://repology.org/project/bat-cat/versions) doc/README-ko.md:222:`bat`은 [Ubuntu](https://packages.ubuntu.com/eoan/bat)와 doc/README-ko.md:223:[Debian](https://packages.debian.org/sid/bat) 패키지 배포 과정에 도입되는 중이며, doc/README-ko.md:225:현재 Debain에서는 불안정한 "Sid" 브랜치에서만 `bat`이 제공됩니다. doc/README-ko.md:230:apt install bat doc/README-ko.md:233:**중요**: 만약 `bat`을 이와 같이 설치한다면, ([다른 패키지와의 이름 doc/README-ko.md:234:충돌](https://github.com/sharkdp/bat/issues/982)로 인하여) `bat` 대신에 doc/README-ko.md:235:`batcat`이라는 이름의 실행 파일로 설치될 수 있음을 참고하세요. doc/README-ko.md:236:이에 따른 문제들과 다른 배포판들과의 일관성을 위하여 `bat -> batcat` symlink doc/README-ko.md:240:ln -s /usr/bin/batcat ~/.local/bin/bat doc/README-ko.md:247:`bat`을 원한다면, [릴리즈 페이지](https://github.com/sharkdp/bat/releases)에서 doc/README-ko.md:251:sudo dpkg -i bat_0.18.3_amd64.deb # adapt version number and architecture doc/README-ko.md:257:[`bat` 패키지](https://pkgs.alpinelinux.org/packages?name=bat)를 설치할 수 doc/README-ko.md:261:apk add bat doc/README-ko.md:267:[`bat` 패키지](https://www.archlinux.org/packages/community/x86_64/bat/)를 doc/README-ko.md:271:pacman -S bat doc/README-ko.md:279:[`bat` 패키지](https://koji.fedoraproject.org/koji/packageinfo?packageID=27506)를 doc/README-ko.md:283:dnf install bat doc/README-ko.md:288:dev-kit을 통해 [`bat` 패키지](https://github.com/funtoo/dev-kit/tree/1.4-release/sys-apps/bat)를 설치할 수 있습니다: doc/README-ko.md:291:emerge sys-apps/bat doc/README-ko.md:297:[`bat` 패키지](https://packages.gentoo.org/packages/sys-apps/bat)를 설치할 수 doc/README-ko.md:301:emerge sys-apps/bat doc/README-ko.md:306:xbps-install을 이용해 `bat`을 설치할 수 있습니다: doc/README-ko.md:308:xbps-install -S bat doc/README-ko.md:313:pkg를 이용해 `bat`을 설치할 수 있습니다: doc/README-ko.md:315:pkg install bat doc/README-ko.md:321:[`bat` 패키지](https://www.freshports.org/textproc/bat)를 설치할 수 있습니다: doc/README-ko.md:324:pkg install bat doc/README-ko.md:330:cd /usr/ports/textproc/bat doc/README-ko.md:336:[nix package manager](https://nixos.org/nix)를 이용해 `bat`을 설치할 수 doc/README-ko.md:340:nix-env -i bat doc/README-ko.md:345:zypper를 이용해 `bat`을 설치할 수 있습니다: doc/README-ko.md:348:zypper install bat doc/README-ko.md:355:[문제](https://github.com/sharkdp/bat/issues/1519)가 있을 수 있습니다. doc/README-ko.md:360:[macOS의 Homebrew](https://formulae.brew.sh/formula/bat) 또는 doc/README-ko.md:361:[Linux의 Homebrew](https://formulae.brew.sh/formula-linux/bat)를 이용하여 doc/README-ko.md:362:`bat`을 설치할 수 있습니다. doc/README-ko.md:365:brew install bat doc/README-ko.md:370:[MacPorts](https://ports.macports.org/port/bat/summary)를 이용하여 `bat`을 doc/README-ko.md:374:port install bat doc/README-ko.md:379:Windows에서 `bat`을 설치할 수 있는 몇 가지 옵션들이 있습니다. doc/README-ko.md:380:먼저 `bat`을 설치한 후, doc/README-ko.md:381:["Windows에서 `bat` 사용하기"](#windows에서-bat-사용하기) 섹션을 살펴보세요. doc/README-ko.md:390:[Chocolatey](https://chocolatey.org/packages/Bat)를 이용해 `bat`을 설치할 수 doc/README-ko.md:393:choco install bat doc/README-ko.md:398:[scoop](https://scoop.sh/)을 이용해 `bat`을 설치할 수 있습니다: doc/README-ko.md:400:scoop install bat doc/README-ko.md:405:[릴리즈 페이지](https://github.com/sharkdp/bat/releases)에서 사전 빌드된 doc/README-ko.md:413:[릴리즈 페이지](https://github.com/sharkdp/bat/releases)에서 다양한 아키텍처를 doc/README-ko.md:419:`bat`의 소스를 빌드하기 위해서는, Rust 1.46 이상이 필요합니다. doc/README-ko.md:423:cargo install --locked bat doc/README-ko.md:435:`bat --list-themes`을 사용하여 사용 가능한 문법 강조 테마들의 목록을 확인할 수 doc/README-ko.md:437:`TwoDark` 테마를 선택하려면, `--theme=TwoDark` 옵션과 함께 `bat`을 사용하거나 doc/README-ko.md:438:`BAT_THEME` 환경 변수를 `TwoDark`로 설정하세요. doc/README-ko.md:439:셸 시작 파일에 `export BAT_THEME="TwoDark"` 를 정의해 영구적으로 설정할 수 doc/README-ko.md:441:이 밖에 `bat`의 [설정 파일](#설정-파일)을 이용할 수 있습니다. doc/README-ko.md:447:bat --list-themes | fzf --preview="bat --theme={} --color=always /path/to/file" doc/README-ko.md:450:`bat`은 기본적으로 어두운 배경에 적합합니다. doc/README-ko.md:458:`bat`은 트루컬러 지원이 되더라도 항상 doc/README-ko.md:478:- 만약 터미널 테마를 바꾼다면, 이미 화면 상의 `bat`의 출력도 이에 맞추어 doc/README-ko.md:483:`--style` 옵션을 이용하면 `bat`의 출력 모양을 조절할 수 있습니다. doc/README-ko.md:486:`BAT_STYLE` 환경 변수를 정의하여 이러한 수정을 영구적으로 하거나 `bat`의 doc/README-ko.md:491:만약 `bat`에서 특정 문법이 지원되지 않을 경우, 다음의 절차를 통해 현재 `bat` doc/README-ko.md:494:`bat`은 문법 강조를 위해 훌륭한 doc/README-ko.md:506: mkdir -p "$(bat --config-dir)/syntaxes" doc/README-ko.md:507: cd "$(bat --config-dir)/syntaxes" doc/README-ko.md:517: bat cache --build doc/README-ko.md:520:3. 마지막으로, `bat --list-languages`로 새로 추가한 언어가 사용 가능한지 doc/README-ko.md:526: bat cache --clear doc/README-ko.md:529:4. 만약 특정 문법이 `bat`에 기본적으로 포함되어 있어야 한다고 생각한다면, 방침과 doc/README-ko.md:531: 주세요: [문법 요청하기](https://github.com/sharkdp/bat/issues/new?labels=syntax-request&template=syntax_request.md). doc/README-ko.md:539:mkdir -p "$(bat --config-dir)/themes" doc/README-ko.md:540:cd "$(bat --config-dir)/themes" doc/README-ko.md:546:bat cache --build doc/README-ko.md:549:마지막으로 `bat --list-themes`을 통해 새로 추가한 테마들이 사용 가능한지 doc/README-ko.md:559:(`bat --list-languages`를 통해 개요를 확인하세요). doc/README-ko.md:561:참고: 이 옵션은 커맨드 라인에 넘겨 주는 것보다는 `bat`의 설정 파일에 넣는 것이 doc/README-ko.md:584:`bat`은 환경 변수 `PAGER`에 명시된 페이저를 사용합니다. doc/README-ko.md:586:만약 다른 페이저를 사용하고 싶다면, `PAGER` 변수를 수정하거나 `BAT_PAGER` 환경 doc/README-ko.md:589:만약 커맨드라인 인수들을 페이저에게 넘겨 주려면, `PAGER`/`BAT_PAGER` 변수로 doc/README-ko.md:593:export BAT_PAGER="less -RF" doc/README-ko.md:596:환경 변수를 사용하는 대신, `bat`의 [설정 파일](#설정-파일)로 페이저를 설정할 doc/README-ko.md:600:옵션이 지정되어 있지 않다면), `bat`은 다음 옵션들을 페이저로 넘겨줍니다: doc/README-ko.md:619:`bat`은 페이저에 의존하지 않고 탭을 4 스페이스로 확장합니다. doc/README-ko.md:623:**참고**: (`bat`의 `--pager` 인자 혹은 `less`의 `LESS` 환경 변수를 통해) doc/README-ko.md:627:`bat`을 `--tabs=0`과 함께 호출하면 이를 오버라이드하여 페이저가 탭을 처리하게 doc/README-ko.md:632:macOS에서 다크 모드를 사용하고 있다면, `bat`가 OS 테마에 따라 다른 테마를 doc/README-ko.md:638:alias cat="bat --theme=\$(defaults read -globalDomain AppleInterfaceStyle &> /dev/null && echo default || echo GitHub)" doc/README-ko.md:643:`bat`는 설정 파일로도 사용자화 할 수 있습니다. doc/README-ko.md:647:bat --config-file doc/README-ko.md:650:또는, `BAT_CONFIG_PATH` 환경 변수를 사용하여 `bat`가 설정 파일의 기본 경로 doc/README-ko.md:653:export BAT_CONFIG_PATH="/path/to/bat.conf" doc/README-ko.md:658:bat --generate-config-file doc/README-ko.md:664:`bat --help`로 가능한 모든 옵션과 값들을 확인하세요. doc/README-ko.md:682:## Windows에서 `bat` 사용하기 doc/README-ko.md:684:`bat`는 대부분의 경우 Windows에서 기본적으로 잘 작동하지만, 일부 기능은 추가적인 doc/README-ko.md:715:`BAT_PAGER`을 빈 문자열로 설정하여 페이징을 완전히 비활성화 할 수 있습니다. doc/README-ko.md:719:Windows에서의 `bat`은 기본적으로 Cygwin의 unix 스타일 경로(`/cygdrive/*`)를 doc/README-ko.md:721:Cygwin 절대 경로를 인자로 받았을 때, `bat`은 다음과 같은 오류를 반환합니다: doc/README-ko.md:728:bat() { doc/README-ko.md:737: command bat "${args[@]}" doc/README-ko.md:745:`bat`은 터미널의 트루컬러 지원 여부와 상관 없이 동작합니다. doc/README-ko.md:754:그렇지 않을 경우, `bat`은 24비트 확장열(escape sequence)이 지원되는지 여부를 doc/README-ko.md:759:다른 테마를 사용해 보세요 (`bat --list-themes`에서 목록을 볼 수 있습니다). doc/README-ko.md:764:`bat`은 기본적으로 UTF-8과 UTF-16을 지원합니다. doc/README-ko.md:770:iconv -f ISO-8859-1 -t UTF-8 my-file.php | bat doc/README-ko.md:772:참고: `bat`으로 문법 자동 감지가 되지 않는 경우에는 `-l`/`--language` 옵션을 doc/README-ko.md:779:git clone --recursive https://github.com/sharkdp/bat doc/README-ko.md:782:cd bat doc/README-ko.md:791:# 수정된 문법과 테마가 적용된 bat 바이너리 빌드 doc/README-ko.md:796:`bat`의 pretty-printing 기능을 라이브러리로 사용하는 애플리케이션을 만들고 doc/README-ko.md:797:싶다면, [API 문서](https://docs.rs/bat/)를 살펴보세요. doc/README-ko.md:798:참고로 `bat`에 라이브러리로써 의존한다면, `regex-onig`나 `regex-fancy`를 doc/README-ko.md:814:만약 `bat`의 취약점을 발견하였다면, [David Peter](https://david-peter.de/)에게 메일로 연락주시기 바랍니다. doc/README-ko.md:818:`bat`은 다음과 같은 목표를 달성하려고 합니다: doc/README-ko.md:829:Copyright (c) 2018-2021 [bat-developers](https://github.com/sharkdp/bat). doc/README-ko.md:831:`bat`는 여러분의 선택에 따라 MIT 라이센스 또는 Apache 라이센스 2.0의 조건에 따라 doc/alternatives.md:3:The following table tries to give an overview *from `bat`s perspective*, i.e. we only compare doc/alternatives.md:4:categories which are relevant for `bat`. Some of these projects have completely different goals and doc/alternatives.md:5:if you are not looking for a program like `bat`, this comparison might not be for you. doc/alternatives.md:7:| | 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) | doc/alternatives.md:9:| 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: | doc/alternatives.md:43:cmd_bat="bat --style=full --color=always --paging=never '$SRC'" doc/alternatives.md:44:cmd_bat_simple="bat --plain --wrap=never --tabs=0 --color=always --paging=never '$SRC'" doc/alternatives.md:54: "$cmd_bat" \ doc/alternatives.md:55: "$cmd_bat_simple" \ doc/README-ru.md:2: bat - a cat clone with wings
doc/README-ru.md:3: Build Status doc/README-ru.md:4: license doc/README-ru.md:5: Version info
doc/README-ru.md:16: [中文] doc/README-ru.md:24:`bat` поддерживает выделение синтаксиса для огромного количества языков программирования и разметки: doc/README-ru.md:29:`bat` использует `git`, чтобы показать изменения в коде doc/README-ru.md:42:`bat` умеет перенаправлять вывод в `less`, если вывод не помещается на экране полностью. doc/README-ru.md:47:`bat` обнаружит неинтерактивный терминал (например, когда вы перенаправляете вывод в файл или процесс), он будет работать как утилита `cat` и выведет содержимое файлов как обычный текст (без подсветки синтаксиса). doc/README-ru.md:54:> bat README.md doc/README-ru.md:60:> bat src/*.rs doc/README-ru.md:66:> curl -s https://sh.rustup.rs | bat doc/README-ru.md:72:> yaml2json .travis.yml | json_pp | bat -l json doc/README-ru.md:77:> bat -A /etc/hosts doc/README-ru.md:83:bat > note.md # мгновенно создаем новый файл doc/README-ru.md:85:bat header.md content.md footer.md > document.md doc/README-ru.md:87:bat -n main.rs # показываем только количество строк doc/README-ru.md:89:bat f - g # выводит 'f' в stdin, а потом 'g'. doc/README-ru.md:96:Вы можете использовать флаг `-exec` в `find`, чтобы посмотреть превью всех файлов в `bat` doc/README-ru.md:98:find … -exec bat {} + doc/README-ru.md:101:Если вы используете [`fd`](https://github.com/sharkdp/fd), применяйте для этого флаг `-X`/`--exec-batch`: doc/README-ru.md:103:fd … -X bat doc/README-ru.md:108:С помощью [`batgrep`](https://github.com/eth-p/bat-extras/blob/master/doc/batgrep.md), `bat` может быть использован для вывода результата запроса [`ripgrep`](https://github.com/BurntSushi/ripgrep) doc/README-ru.md:111:batgrep needle src/ doc/README-ru.md:116:`bat` может быть использован вместе с `tail -f`, чтобы выводить содержимое файла с подсветкой синтаксиса в реальном времени. doc/README-ru.md:118:tail -f /var/log/pacman.log | bat --paging=never -l log doc/README-ru.md:124:Вы можете использовать `bat` с `git show`, чтобы просмотреть старую версию файла с выделением синтаксиса: doc/README-ru.md:126:git show v0.6.0:src/main.rs | bat -l rs doc/README-ru.md:136:bat main.cpp | xclip doc/README-ru.md:138:`bat` обнаружит перенаправление вывода и выведет обычный текст без выделения синтаксиса. doc/README-ru.md:142:`bat` может быть использован в виде выделения цвета для `man`, для этого установите переменную окружения doc/README-ru.md:146:export MANPAGER="sh -c 'col -bx | bat -l man -p'" doc/README-ru.md:152:Если вы хотите сделать этой одной командой, вы можете использовать [`batman`](https://github.com/eth-p/bat-extras/blob/master/doc/batman.md). doc/README-ru.md:158:[`Prettybat`](https://github.com/eth-p/bat-extras/blob/master/doc/prettybat.md) — скрипт, который форматирует код и выводит его с помощью `bat`. doc/README-ru.md:163:[![Packaging status](https://repology.org/badge/vertical-allrepos/bat.svg)](https://repology.org/project/bat/versions) doc/README-ru.md:168:`bat` есть в репозиториях [Ubuntu](https://packages.ubuntu.com/eoan/bat) и doc/README-ru.md:169:[Debian](https://packages.debian.org/sid/bat) и доступен начиная с Ubuntu Eoan 19.10. На Debian `bat` пока что доступен только с нестабильной веткой "Sid". doc/README-ru.md:171:Если ваша версия Ubuntu/Debian достаточно новая, вы можете установить `bat` так: doc/README-ru.md:174:apt install bat doc/README-ru.md:177:Если вы установили `bat` таким образом, то бинарный файл может быть установлен как `batcat` вместо `bat` (из-за [конфликта имени с другим пакетом](https://github.com/sharkdp/bat/issues/982)). Вы можете сделать симлинк или алиас `bat -> batcat`, чтобы предотвратить подобные проблемы и в других дистрибутивах. doc/README-ru.md:181:ln -s /usr/bin/batcat ~/.local/bin/bat doc/README-ru.md:187:Если пакет еще недоступен в вашем Ubuntu/Debian дистрибутиве или вы хотите установить самую последнюю версию `bat`, то вы можете скачать самый последний `deb`-пакет отсюда: doc/README-ru.md:188:[release page](https://github.com/sharkdp/bat/releases) и установить так: doc/README-ru.md:191:sudo dpkg -i bat_0.18.3_amd64.deb # измените архитектуру и версию doc/README-ru.md:196:Вы можете установить [`bat`](https://pkgs.alpinelinux.org/packages?name=bat) из официальных источников: doc/README-ru.md:199:apk add bat doc/README-ru.md:204:Вы можете установить [`bat`](https://www.archlinux.org/packages/community/x86_64/bat/) из официального источника: doc/README-ru.md:207:pacman -S bat doc/README-ru.md:212:Вы можете установить [`bat`](https://koji.fedoraproject.org/koji/packageinfo?packageID=27506) из официального репозитория [Fedora Modular](https://docs.fedoraproject.org/en-US/modularity/using-modules/). doc/README-ru.md:215:dnf install bat doc/README-ru.md:220:Вы можете установить [`bat`](https://packages.gentoo.org/packages/sys-apps/bat) из официальных источников: doc/README-ru.md:223:emerge sys-apps/bat doc/README-ru.md:228:Вы можете установить `bat` с помощью `xbps-install`: doc/README-ru.md:230:xbps-install -S bat doc/README-ru.md:235:Вы можете установить [`bat`](https://www.freshports.org/textproc/bat) с помощью `pkg`: doc/README-ru.md:238:pkg install bat doc/README-ru.md:244:cd /usr/ports/textproc/bat doc/README-ru.md:250:Вы можете установить `bat`, используя [nix package manager](https://nixos.org/nix): doc/README-ru.md:253:nix-env -i bat doc/README-ru.md:258:Вы можете установить `bat` с помощью `zypper`: doc/README-ru.md:261:zypper install bat doc/README-ru.md:266:Вы можете установить `bat` с помощью [Homebrew](http://braumeister.org/formula/bat): doc/README-ru.md:269:brew install bat doc/README-ru.md:272:Или же установить его с помощью [MacPorts](https://ports.macports.org/port/bat/summary): doc/README-ru.md:275:port install bat doc/README-ru.md:280:Есть несколько способов установить `bat`. Как только вы установили его, посмотрите на секцию ["Использование `bat` в Windows"](#using-bat-on-windows). doc/README-ru.md:284:Вы можете установить `bat` с помощью [Chocolatey](https://chocolatey.org/packages/Bat): doc/README-ru.md:286:choco install bat doc/README-ru.md:291:Вы можете установить `bat` с помощью [scoop](https://scoop.sh/): doc/README-ru.md:293:scoop install bat doc/README-ru.md:300:Их вы можете скачать на [странице релизов](https://github.com/sharkdp/bat/releases). doc/README-ru.md:306:Вы можете использовать [Docker image](https://hub.docker.com/r/danlynn/bat/), чтобы запустить `bat` в контейнере: doc/README-ru.md:308:docker pull danlynn/bat doc/README-ru.md:309:alias bat='docker run -it --rm -e BAT_THEME -e BAT_STYLE -e BAT_TABS -v "$(pwd):/myapp" danlynn/bat' doc/README-ru.md:314:Вы можете установить `bat` с [Ansible](https://www.ansible.com/): doc/README-ru.md:318:ansible-galaxy install aeimer.install_bat doc/README-ru.md:323:# Playbook для установки bat doc/README-ru.md:326: - aeimer.install_bat doc/README-ru.md:329:- [Ansible Galaxy](https://galaxy.ansible.com/aeimer/install_bat) doc/README-ru.md:330:- [GitHub](https://github.com/aeimer/ansible-install-bat) doc/README-ru.md:342:Перейдите на [страницу релизов](https://github.com/sharkdp/bat/releases) для doc/README-ru.md:343:скомпилированных файлов `bat` для различных платформ. Бинарные файлы со статической связкой так же доступны: выбирайте архив с `musl` в имени. doc/README-ru.md:347:Если вы желаете установить `bat` из исходников, вам понадобится Rust 1.46 или выше. После этого используйте `cargo`, чтобы все скомпилировать: doc/README-ru.md:350:cargo install --locked bat doc/README-ru.md:357:Используйте `bat --list-themes`, чтобы вывести список всех доступных тем. Для выбора темы `TwoDark` используйте `bat` с флагом doc/README-ru.md:358:`--theme=TwoDark` или выставьте переменную окружения `BAT_THEME` в `TwoDark`. Используйте `export BAT_THEME="TwoDark"` в конфигурационном файле вашей оболочки, чтобы изменить ее навсегда. Или же используйте [конфигурационный файл](https://github.com/sharkdp/bat#configuration-file) `bat`. doc/README-ru.md:362:bat --list-themes | fzf --preview="bat --theme={} --color=always /путь/к/файлу" doc/README-ru.md:365:`bat` отлично смотрится на темном фоне. Однако если ваш терминал использует светлую тему, то такие темы как `GitHub` или `OneHalfLight` будут смотреться куда лучше! doc/README-ru.md:366:Вы также можете использовать новую тему, для этого перейдите [в раздел добавления тем](https://github.com/sharkdp/bat#добавление-новых-тем). doc/README-ru.md:370:Вы можете использовать флаг `--style`, чтобы изменять внешний вид вывода в `bat`. doc/README-ru.md:371:Например, вы можете использовать `--style=numbers,changes`, чтобы показать только количество строк и изменений в Git. Установите переменную окружения `BAT_STYLE` чтобы изменить это навсегда, или используйте [конфиг файл](https://github.com/sharkdp/bat#configuration-file) `bat`. doc/README-ru.md:375:`bat` использует [`syntect`](https://github.com/trishume/syntect/) для выделения синтаксиса. `syntect` может читать doc/README-ru.md:382:mkdir -p "$(bat --config-dir)/syntaxes" doc/README-ru.md:383:cd "$(bat --config-dir)/syntaxes" doc/README-ru.md:393:bat cache --build doc/README-ru.md:396:Теперь вы можете использовать `bat --list-languages`, чтобы проверить, доступны ли новые языки. doc/README-ru.md:401:bat cache --clear doc/README-ru.md:410:mkdir -p "$(bat --config-dir)/themes" doc/README-ru.md:411:cd "$(bat --config-dir)/themes" doc/README-ru.md:417:bat cache --build doc/README-ru.md:420:Теперь используйте `bat --list-themes`, чтобы проверить доступность новых тем. doc/README-ru.md:424:`bat` использует пейджер, указанный в переменной окружения `PAGER`. Если она не задана, то используется `less`. doc/README-ru.md:425:Если вы желаете использовать другой пейджер, вы можете либо изменить переменную `PAGER`, либо `BAT_PAGER` чтобы перезаписать то, что указано в `PAGER`. doc/README-ru.md:430:export BAT_PAGER="less -RF" doc/README-ru.md:433:Так же вы можете использовать [файл конфигурации](https://github.com/sharkdp/bat#configuration-file) `bat` (флаг `--pager`). doc/README-ru.md:436:`bat` задаст следующие флаги для пейджера: doc/README-ru.md:449:Если вы используете темный режим в macOS, возможно вы захотите чтобы `bat` использовал другую тему, основанную на теме вашей ОС. Следующий сниппет использует тему `default`, когда у вас включен темный режим, и тему `GitHub`, когда включен светлый. doc/README-ru.md:452:alias cat="bat --theme=\$(defaults read -globalDomain AppleInterfaceStyle &> /dev/null && echo default || echo GitHub)" doc/README-ru.md:457:`bat` также может быть кастомизирован с помощью файла конфигурации. Его местоположение зависит от вашей ОС: чтобы посмотреть его путь, введите doc/README-ru.md:459:bat --config-file doc/README-ru.md:462:Также вы можете установить переменную окружения `BAT_CONFIG_PATH`, чтобы изменить путь к файлу конфигурации. doc/README-ru.md:464:export BAT_CONFIG_PATH="/path/to/bat.conf" doc/README-ru.md:469:bat --generate-config-file doc/README-ru.md:474:Файл конфигурации - это всего лишь набор аргументов. Введите `bat --help`, чтобы просмотреть список всех возможных флагов и аргументов. Также вы можете закомментировать строку с помощью `#`. doc/README-ru.md:494:## Использование `bat` в Windows doc/README-ru.md:496:`bat` полностью работоспособен "из коробки", но для некоторых возможностей могут понадобиться дополнительные настройки. doc/README-ru.md:509:или установить `BAT_PAGER` равным пустой строке. doc/README-ru.md:513:Из коробки `bat` не поддерживает пути в стиле Unix (`/cygdrive/*`). Когда указан абсолютный путь cygwin, `bat` выдаст следующую ошибку: `The system cannot find the path specified. (os error 3)` doc/README-ru.md:518:bat() { doc/README-ru.md:527: command bat "${args[@]}" doc/README-ru.md:535:`bat` поддерживает терминалы *с* и *без* поддержки truecolor. Однако подсветка синтаксиса не оптимизирована для терминалов с 8-битными цветами, и рекомендуется использовать терминалы с поддержкой 24-битных цветов (`terminator`, `konsole`, `iTerm2`, ...). doc/README-ru.md:539:`24bit`. Иначе `bat` не сможет определить поддержку 24-битных цветов (и будет использовать 8-битные). doc/README-ru.md:543:Используйте другую тему (`bat --list-themes` выведет список всех установленных тем). Темы `OneHalfDark` и doc/README-ru.md:548:`bat` поддерживает UTF-8 и UTF-16. Файлы в других кодировках, возможно, придётся перекодировать, так как кодировка может быть распознана неверно. Используйте `iconv`. doc/README-ru.md:551:iconv -f ISO-8859-1 -t UTF-8 my-file.php | bat doc/README-ru.md:553:Внимание: вам может понадобится флаг `-l`/`--language`, если `bat` не сможет автоматически определить синтаксис. doc/README-ru.md:559:git clone --recursive https://github.com/sharkdp/bat doc/README-ru.md:562:cd bat doc/README-ru.md:571:# Компилирование исполняего файла bat с другим синтаксисом и темами doc/README-ru.md:583:Цели проекта `bat`: doc/README-ru.md:590:Есть очень много альтернатив `bat`. Смотрите [этот документ](doc/alternatives.md) для сравнения. doc/README-ru.md:593:Copyright (c) 2018-2021 [Разработчики bat](https://github.com/sharkdp/bat). doc/README-ru.md:595:`bat` распостраняется под лицензями MIT License и Apache License 2.0 (на выбор пользователя). doc/release-checklist.md:5:See this page for a good overview: https://deps.rs/repo/github/sharkdp/bat doc/release-checklist.md:27: sure that it is available on the `PATH` (`bat --version` should show the doc/release-checklist.md:41: this, install the latest `bat` version again (to include the new synaxes doc/release-checklist.md:50:- [ ] Go to https://github.com/sharkdp/bat/releases/new to create the new Cargo.lock:85:name = "bat" LICENSE-MIT:1:Copyright (c) 2018-2021 bat-developers (https://github.com/sharkdp/bat). assets/themes/Coldark/README.md:5:# Coldark - Bat assets/themes/Coldark/README.md:7:![GitHub License](https://img.shields.io/github/license/ArmandPhilippot/coldark-bat?colorA=111b27&color=d0dae7&logo=Github&logoColor=e3eaf2&style=for-the-badge) ![GitHub package.json version](https://img.shields.io/github/package-json/v/ArmandPhilippot/coldark-bat?colorA=111b27&color=d0dae7&logo=Github&logoColor=e3eaf2&style=for-the-badge) assets/themes/Coldark/README.md:15:This Coldark version is designed for [bat](https://github.com/sharkdp/bat) command. assets/themes/Coldark/README.md:21:The `bat` version uses almost the same colors as [VS code version](https://github.com/ArmandPhilippot/coldark-vscode). The scopes seems a little different and a little less complete, hence the difference. assets/themes/Coldark/README.md:69:1. Install `bat` (on Manjaro: `pacman -S bat`) assets/themes/Coldark/README.md:70:2. Create themes folder: `mkdir -p "$(bat --config-dir)/themes"` assets/themes/Coldark/README.md:71:3. Go inside this new folder: `cd "$(bat --config-dir)/themes"` assets/themes/Coldark/README.md:72:4. Clone this repo: `git clone https://github.com/ArmandPhilippot/coldark-bat` assets/themes/Coldark/README.md:73:5. Update the binary cache: `bat cache --build` assets/themes/Coldark/README.md:75:Then, if you use `bat --list-themes`, you should see the themes. assets/themes/Coldark/README.md:77:Coldark Bat is now present in [bat repo](https://github.com/sharkdp/bat). It may be present in the list of themes in a future version without having to install it manually. assets/themes/Coldark/README.md:81:To select one of the Coldark themes, call `bat` with the `--theme=Coldark-Cold` (or `--theme=Coldark-Dark`) option or set the `BAT_THEME` environment variable to `Coldark-Cold` (or `Coldark-Dark`). Use `export BAT_THEME="Coldark-Cold"` (or `export BAT_THEME="Coldark-Dark"`) in your shell's startup file to make the change permanent. assets/themes/Coldark/README.md:91:| [![Coldark Cold PHP](./assets/coldark-cold-bat-php.jpg)](./assets/coldark-cold-bat-php.jpg) | [![Coldark Cold Markdown](./assets/coldark-cold-bat-markdown.jpg)](./assets/coldark-cold-bat-markdown.jpg) | assets/themes/Coldark/README.md:97:| [![Coldark Dark PHP](./assets/coldark-dark-bat-php.jpg)](./assets/coldark-dark-bat-php.jpg) | [![Coldark Dark Markdown](./assets/coldark-dark-bat-markdown.jpg)](./assets/coldark-dark-bat-markdown.jpg) | assets/themes/Coldark/README.md:101:This project is open source and available under the [MIT License](https://github.com/ArmandPhilippot/coldark-bat/blob/master/LICENSE). assets/themes/Coldark/Coldark-Cold.tmTheme:6: Project: Coldark Bat assets/themes/Coldark/Coldark-Cold.tmTheme:7: Repository: https://github.com/ArmandPhilippot/coldark-bat assets/themes/Coldark/package.json:2: "name": "coldark-bat", assets/themes/Coldark/package.json:15: "homepage": "https://github.com/ArmandPhilippot/coldark-bat#readme", assets/themes/Coldark/package.json:18: "url": "https://github.com/ArmandPhilippot/coldark-bat" assets/themes/Coldark/package.json:21: "url": "https://github.com/ArmandPhilippot/coldark-bat/issues" assets/themes/Coldark/CHANGELOG.md:10:## [v1.0.5](https://github.com/ArmandPhilippot/coldark-bat/compare/v1.0.4...v1.0.5) assets/themes/Coldark/CHANGELOG.md:19:- fix: change red color for both versions [`93ee1f3`](https://github.com/ArmandPhilippot/coldark-bat/commit/93ee1f3fb5e08ecf66baee03dd3900c0abcdc1e9) assets/themes/Coldark/CHANGELOG.md:21:## [v1.0.4](https://github.com/ArmandPhilippot/coldark-bat/compare/v1.0.3...v1.0.4) - 2020-10-28 assets/themes/Coldark/CHANGELOG.md:25:- Update Coldark Colors / Complete Markdown syntax highlighting [`a355b1d`](https://github.com/ArmandPhilippot/coldark-bat/commit/a355b1d75611d12d322dd47f2ea7799b663a7738) assets/themes/Coldark/CHANGELOG.md:26:- Update colors, logo, banner & add some screenshots [`0b13521`](https://github.com/ArmandPhilippot/coldark-bat/commit/0b13521b6018c04d00304121bcf47fe04fa266ee) assets/themes/Coldark/CHANGELOG.md:27:- build: update auto-changelog command [`2cd0f6e`](https://github.com/ArmandPhilippot/coldark-bat/commit/2cd0f6ea22280c892b564348aab72a45f7b28223) assets/themes/Coldark/CHANGELOG.md:29:## [v1.0.3](https://github.com/ArmandPhilippot/coldark-bat/compare/v1.0.2...v1.0.3) - 2020-10-19 assets/themes/Coldark/CHANGELOG.md:33:- fix: color for pseudo-class/element in CSS [`1fada34`](https://github.com/ArmandPhilippot/coldark-bat/commit/1fada3494ae545fd186b1cb6c7d98c5860bcbcfe) assets/themes/Coldark/CHANGELOG.md:35:## [v1.0.2](https://github.com/ArmandPhilippot/coldark-bat/compare/v1.0.1...v1.0.2) - 2020-10-18 assets/themes/Coldark/CHANGELOG.md:39:- fix: update scopes to be up to date with VS Code theme [`e92f6a7`](https://github.com/ArmandPhilippot/coldark-bat/commit/e92f6a7d7832d269cdec0754a198a589a4567a00) assets/themes/Coldark/CHANGELOG.md:41:## [v1.0.1](https://github.com/ArmandPhilippot/coldark-bat/compare/v1.0.0...v1.0.1) - 2020-10-17 assets/themes/Coldark/CHANGELOG.md:45:- docs: fix export command [`0439c73`](https://github.com/ArmandPhilippot/coldark-bat/commit/0439c73d4af9c6a3254467dc7c6a758796f78267) assets/themes/Coldark/CHANGELOG.md:51:- feat: Coldark for bat command [`18fa11d`](https://github.com/ArmandPhilippot/coldark-bat/commit/18fa11d259bd4c1b5d3278b1ef91dbf8a13e5ee1) assets/themes/Coldark/CHANGELOG.md:52:- Initial commit [`80b7c34`](https://github.com/ArmandPhilippot/coldark-bat/commit/80b7c34079e11ae69fdd94d5839305fedd9fe847) assets/themes/Coldark/CHANGELOG.md:53:- docs: add README [`e904c4d`](https://github.com/ArmandPhilippot/coldark-bat/commit/e904c4d78e3ff7653b25a6215441ad643408aedf) assets/themes/Coldark/Coldark-Dark.tmTheme:6: Project: Coldark Bat assets/themes/Coldark/Coldark-Dark.tmTheme:7: Repository: https://github.com/ArmandPhilippot/coldark-bat assets/themes/Solarized/samples/test.md:26: a verbatim or "code" block assets/themes/onehalf/README.md:43: - [x] [bat](https://github.com/sharkdp/bat) assets/themes/base16.tmTheme:8: the bat theme base16-256 instead. assets/themes/ansi.tmTheme:26: Explicitly set the gutter color since bat falls back to a assets/themes/DarkNeon/Mou/Dark Neon Eighties.txt:77:VERBATIM assets/themes/DarkNeon/Mou/Dark Neon.txt:77:VERBATIM assets/themes/DarkNeon/Mou/Dark Neon Light.txt:77:VERBATIM assets/themes/TwoDark/icons/Prefs/icon_script.tmPreferences:6: source.dosbatch, source.shell assets/themes/TwoDark/src/svg/gfx_quick-panel-row-selected.svg:60:pQxTwpjGFbAti4KEppoxavUgB0Kt5geqNtU3yigwdL9zPN5DHw0QItval6DB1kZEzQTiJdJEmU3x assets/themes/gruvbox/README.md:4:This branch is being used as a submodule in [bat](https://github.com/sharkdp/bat) for the _gruvbox_ family of themes assets/themes/gruvbox/gruvbox-dark.tmTheme:259: entity.name.val.declaration, entity.name.variable, meta.definition.variable, storage.type.variable, support.type.custom-property, support.type.variable-name, variable, variable.interpolation variable, variable.other.interpolation variable, variable.parameter.dosbatch, variable.parameter.output.function.matlab, variable.parameter.sass assets/themes/gruvbox/gruvbox-light.tmTheme:259: entity.name.val.declaration, entity.name.variable, meta.definition.variable, storage.type.variable, support.type.custom-property, support.type.variable-name, variable, variable.interpolation variable, variable.other.interpolation variable, variable.parameter.dosbatch, variable.parameter.output.function.matlab, variable.parameter.sass assets/syntaxes/02_Extra/Slim/Demo/demo.slim:152:/ Verbatim assets/syntaxes/02_Extra/Slim/Demo/demo.slim:163: 'Verbatim text with space after assets/syntaxes/02_Extra/Slim/Syntaxes/Ruby Slim.YAML-tmLanguage:130: comment: Verbatim text (can include HTML tags and copied lines) assets/syntaxes/02_Extra/Slim/Syntaxes/Ruby Slim.tmLanguage:326: Verbatim text (can include HTML tags and copied lines) assets/syntaxes/02_Extra/LLVM/README.md:2:LLVM syntax highlighting definitions based on [LLVM.tmBundle](https://github.com/whitequark/LLVM.tmBundle) created by [whitequark](https://github.com/whitequark) for [bat](https://github.com/sharkdp/bat). assets/syntaxes/02_Extra/Puppet/Puppet.sublime-build:8: "cmd": ["puppet.bat", "parser", "validate", "--color=false", "$file" ] assets/syntaxes/02_Extra/Slim.sublime-syntax:117: comment: Verbatim text (can include HTML tags and copied lines) assets/syntaxes/02_Extra/Assembly (x86_64).sublime-syntax:463: - match: '(?i)\bat\b' assets/syntaxes/02_Extra/HTML (Twig).sublime-syntax:377: - match: '(?<=(?:[a-zA-Z0-9_\x{7f}-\x{ff}\]\)\''\"]\|)|\{%\sfilter\s)(batch|convert_encoding|date|date_modify|default|e(?:scape)?|format|join|merge|number_format|replace|round|slice|split|trim)(\()' assets/syntaxes/02_Extra/HTML (Twig).sublime-syntax:479: - match: (?<=\s)((?:end)?(?:autoescape|block|embed|filter|for|if|macro|raw|sandbox|set|spaceless|trans|verbatim)|as|do|else|elseif|extends|flush|from|ignore missing|import|include|only|use|with)(?=\s) assets/syntaxes/02_Extra/TypsecriptReact.sublime-syntax:2325: |AudioNode|AudioParam|BatteryManager|BeforeUnloadEvent|BiquadFilterNode|Blob|BufferSource|ByteString|CSS|CSSConditionRule assets/syntaxes/02_Extra/TypeScript/tsserver/typingsInstaller.js:3584: // The advantage of this approach is its simplicity. For the case of batch compilation, assets/syntaxes/02_Extra/TypeScript/tsserver/typingsInstaller.js:37221: // Literal files are always included verbatim. An "include" or "exclude" specification cannot assets/syntaxes/02_Extra/TypeScript/tsserver/typingsInstaller.js:48035: var verbatimTargetName = ts.unescapeLeadingUnderscores(target.escapedName); assets/syntaxes/02_Extra/TypeScript/tsserver/typingsInstaller.js:48036: if (verbatimTargetName === "export=" /* ExportEquals */ && (compilerOptions.esModuleInterop || compilerOptions.allowSyntheticDefaultImports)) { assets/syntaxes/02_Extra/TypeScript/tsserver/typingsInstaller.js:48038: verbatimTargetName = "default" /* Default */; assets/syntaxes/02_Extra/TypeScript/tsserver/typingsInstaller.js:48040: var targetName = getInternalSymbolName(target, verbatimTargetName); assets/syntaxes/02_Extra/TypeScript/tsserver/typingsInstaller.js:48085: ts.factory.createImportSpecifier(localName !== verbatimTargetName ? ts.factory.createIdentifier(verbatimTargetName) : undefined, ts.factory.createIdentifier(localName)) assets/syntaxes/02_Extra/TypeScript/tsserver/typingsInstaller.js:48094: serializeExportSpecifier(ts.unescapeLeadingUnderscores(symbol.escapedName), specifier ? verbatimTargetName : targetName, specifier && ts.isStringLiteralLike(specifier) ? ts.factory.createStringLiteral(specifier.text) : undefined); assets/syntaxes/02_Extra/TypeScript/tsserver/typingsInstaller.js:98916: // If he number will be printed verbatim and it doesn't already contain a dot, add one assets/syntaxes/02_Extra/TypeScript/tsserver/typingsInstaller.js:101096: * If `optimistic` is set, the first instance will use 'baseName' verbatim instead of 'baseName_1' assets/syntaxes/02_Extra/TypeScript/tsserver/typingsInstaller.js:105964: // Get next batch of affected files assets/syntaxes/02_Extra/TypeScript/tsserver/typingsInstaller.js:108618: // Upon detecting a file change, wait for 250ms and then perform a recompilation. This gives batch assets/syntaxes/02_Extra/TypeScript/tsserver/tsc.js:39425: var verbatimTargetName = ts.unescapeLeadingUnderscores(target.escapedName); assets/syntaxes/02_Extra/TypeScript/tsserver/tsc.js:39426: if (verbatimTargetName === "export=" && (compilerOptions.esModuleInterop || compilerOptions.allowSyntheticDefaultImports)) { assets/syntaxes/02_Extra/TypeScript/tsserver/tsc.js:39427: verbatimTargetName = "default"; assets/syntaxes/02_Extra/TypeScript/tsserver/tsc.js:39429: var targetName = getInternalSymbolName(target, verbatimTargetName); assets/syntaxes/02_Extra/TypeScript/tsserver/tsc.js:39452: ts.factory.createImportSpecifier(localName !== verbatimTargetName ? ts.factory.createIdentifier(verbatimTargetName) : undefined, ts.factory.createIdentifier(localName)) assets/syntaxes/02_Extra/TypeScript/tsserver/tsc.js:39457: serializeExportSpecifier(ts.unescapeLeadingUnderscores(symbol.escapedName), specifier ? verbatimTargetName : targetName, specifier && ts.isStringLiteralLike(specifier) ? ts.factory.createStringLiteral(specifier.text) : undefined); assets/syntaxes/02_Extra/TypeScript/tsserver/tsserver.js:3595: // The advantage of this approach is its simplicity. For the case of batch compilation, assets/syntaxes/02_Extra/TypeScript/tsserver/tsserver.js:37232: // Literal files are always included verbatim. An "include" or "exclude" specification cannot assets/syntaxes/02_Extra/TypeScript/tsserver/tsserver.js:48046: var verbatimTargetName = ts.unescapeLeadingUnderscores(target.escapedName); assets/syntaxes/02_Extra/TypeScript/tsserver/tsserver.js:48047: if (verbatimTargetName === "export=" /* ExportEquals */ && (compilerOptions.esModuleInterop || compilerOptions.allowSyntheticDefaultImports)) { assets/syntaxes/02_Extra/TypeScript/tsserver/tsserver.js:48049: verbatimTargetName = "default" /* Default */; assets/syntaxes/02_Extra/TypeScript/tsserver/tsserver.js:48051: var targetName = getInternalSymbolName(target, verbatimTargetName); assets/syntaxes/02_Extra/TypeScript/tsserver/tsserver.js:48096: ts.factory.createImportSpecifier(localName !== verbatimTargetName ? ts.factory.createIdentifier(verbatimTargetName) : undefined, ts.factory.createIdentifier(localName)) assets/syntaxes/02_Extra/TypeScript/tsserver/tsserver.js:48105: serializeExportSpecifier(ts.unescapeLeadingUnderscores(symbol.escapedName), specifier ? verbatimTargetName : targetName, specifier && ts.isStringLiteralLike(specifier) ? ts.factory.createStringLiteral(specifier.text) : undefined); assets/syntaxes/02_Extra/TypeScript/tsserver/tsserver.js:98927: // If he number will be printed verbatim and it doesn't already contain a dot, add one assets/syntaxes/02_Extra/TypeScript/tsserver/tsserver.js:101107: * If `optimistic` is set, the first instance will use 'baseName' verbatim instead of 'baseName_1' assets/syntaxes/02_Extra/TypeScript/tsserver/tsserver.js:105975: // Get next batch of affected files assets/syntaxes/02_Extra/TypeScript/tsserver/tsserver.js:108629: // Upon detecting a file change, wait for 250ms and then perform a recompilation. This gives batch assets/syntaxes/02_Extra/TypeScript/tsserver/typescriptServices.js:3789: // The advantage of this approach is its simplicity. For the case of batch compilation, assets/syntaxes/02_Extra/TypeScript/tsserver/typescriptServices.js:37426: // Literal files are always included verbatim. An "include" or "exclude" specification cannot assets/syntaxes/02_Extra/TypeScript/tsserver/typescriptServices.js:48240: var verbatimTargetName = ts.unescapeLeadingUnderscores(target.escapedName); assets/syntaxes/02_Extra/TypeScript/tsserver/typescriptServices.js:48241: if (verbatimTargetName === "export=" /* ExportEquals */ && (compilerOptions.esModuleInterop || compilerOptions.allowSyntheticDefaultImports)) { assets/syntaxes/02_Extra/TypeScript/tsserver/typescriptServices.js:48243: verbatimTargetName = "default" /* Default */; assets/syntaxes/02_Extra/TypeScript/tsserver/typescriptServices.js:48245: var targetName = getInternalSymbolName(target, verbatimTargetName); assets/syntaxes/02_Extra/TypeScript/tsserver/typescriptServices.js:48290: ts.factory.createImportSpecifier(localName !== verbatimTargetName ? ts.factory.createIdentifier(verbatimTargetName) : undefined, ts.factory.createIdentifier(localName)) assets/syntaxes/02_Extra/TypeScript/tsserver/typescriptServices.js:48299: serializeExportSpecifier(ts.unescapeLeadingUnderscores(symbol.escapedName), specifier ? verbatimTargetName : targetName, specifier && ts.isStringLiteralLike(specifier) ? ts.factory.createStringLiteral(specifier.text) : undefined); assets/syntaxes/02_Extra/TypeScript/tsserver/typescriptServices.js:99121: // If he number will be printed verbatim and it doesn't already contain a dot, add one assets/syntaxes/02_Extra/TypeScript/tsserver/typescriptServices.js:101301: * If `optimistic` is set, the first instance will use 'baseName' verbatim instead of 'baseName_1' assets/syntaxes/02_Extra/TypeScript/tsserver/typescriptServices.js:106169: // Get next batch of affected files assets/syntaxes/02_Extra/TypeScript/tsserver/typescriptServices.js:108823: // Upon detecting a file change, wait for 250ms and then perform a recompilation. This gives batch assets/syntaxes/02_Extra/TypeScript/tsserver/tsserverlibrary.js:3789: // The advantage of this approach is its simplicity. For the case of batch compilation, assets/syntaxes/02_Extra/TypeScript/tsserver/tsserverlibrary.js:37426: // Literal files are always included verbatim. An "include" or "exclude" specification cannot assets/syntaxes/02_Extra/TypeScript/tsserver/tsserverlibrary.js:48240: var verbatimTargetName = ts.unescapeLeadingUnderscores(target.escapedName); assets/syntaxes/02_Extra/TypeScript/tsserver/tsserverlibrary.js:48241: if (verbatimTargetName === "export=" /* ExportEquals */ && (compilerOptions.esModuleInterop || compilerOptions.allowSyntheticDefaultImports)) { assets/syntaxes/02_Extra/TypeScript/tsserver/tsserverlibrary.js:48243: verbatimTargetName = "default" /* Default */; assets/syntaxes/02_Extra/TypeScript/tsserver/tsserverlibrary.js:48245: var targetName = getInternalSymbolName(target, verbatimTargetName); assets/syntaxes/02_Extra/TypeScript/tsserver/tsserverlibrary.js:48290: ts.factory.createImportSpecifier(localName !== verbatimTargetName ? ts.factory.createIdentifier(verbatimTargetName) : undefined, ts.factory.createIdentifier(localName)) assets/syntaxes/02_Extra/TypeScript/tsserver/tsserverlibrary.js:48299: serializeExportSpecifier(ts.unescapeLeadingUnderscores(symbol.escapedName), specifier ? verbatimTargetName : targetName, specifier && ts.isStringLiteralLike(specifier) ? ts.factory.createStringLiteral(specifier.text) : undefined); assets/syntaxes/02_Extra/TypeScript/tsserver/tsserverlibrary.js:99121: // If he number will be printed verbatim and it doesn't already contain a dot, add one assets/syntaxes/02_Extra/TypeScript/tsserver/tsserverlibrary.js:101301: * If `optimistic` is set, the first instance will use 'baseName' verbatim instead of 'baseName_1' assets/syntaxes/02_Extra/TypeScript/tsserver/tsserverlibrary.js:106169: // Get next batch of affected files assets/syntaxes/02_Extra/TypeScript/tsserver/tsserverlibrary.js:108823: // Upon detecting a file change, wait for 250ms and then perform a recompilation. This gives batch assets/syntaxes/02_Extra/TypeScript/tsserver/typescript.js:3789: // The advantage of this approach is its simplicity. For the case of batch compilation, assets/syntaxes/02_Extra/TypeScript/tsserver/typescript.js:37426: // Literal files are always included verbatim. An "include" or "exclude" specification cannot assets/syntaxes/02_Extra/TypeScript/tsserver/typescript.js:48240: var verbatimTargetName = ts.unescapeLeadingUnderscores(target.escapedName); assets/syntaxes/02_Extra/TypeScript/tsserver/typescript.js:48241: if (verbatimTargetName === "export=" /* ExportEquals */ && (compilerOptions.esModuleInterop || compilerOptions.allowSyntheticDefaultImports)) { assets/syntaxes/02_Extra/TypeScript/tsserver/typescript.js:48243: verbatimTargetName = "default" /* Default */; assets/syntaxes/02_Extra/TypeScript/tsserver/typescript.js:48245: var targetName = getInternalSymbolName(target, verbatimTargetName); assets/syntaxes/02_Extra/TypeScript/tsserver/typescript.js:48290: ts.factory.createImportSpecifier(localName !== verbatimTargetName ? ts.factory.createIdentifier(verbatimTargetName) : undefined, ts.factory.createIdentifier(localName)) assets/syntaxes/02_Extra/TypeScript/tsserver/typescript.js:48299: serializeExportSpecifier(ts.unescapeLeadingUnderscores(symbol.escapedName), specifier ? verbatimTargetName : targetName, specifier && ts.isStringLiteralLike(specifier) ? ts.factory.createStringLiteral(specifier.text) : undefined); assets/syntaxes/02_Extra/TypeScript/tsserver/typescript.js:99121: // If he number will be printed verbatim and it doesn't already contain a dot, add one assets/syntaxes/02_Extra/TypeScript/tsserver/typescript.js:101301: * If `optimistic` is set, the first instance will use 'baseName' verbatim instead of 'baseName_1' assets/syntaxes/02_Extra/TypeScript/tsserver/typescript.js:106169: // Get next batch of affected files assets/syntaxes/02_Extra/TypeScript/tsserver/typescript.js:108823: // Upon detecting a file change, wait for 250ms and then perform a recompilation. This gives batch assets/syntaxes/02_Extra/TypeScript/tsserver/lib.scripthost.d.ts:161: * Gets/sets the script mode - interactive(true) or batch(false). assets/syntaxes/02_Extra/TypeScript/TypeScript.tmLanguage:6080: |AudioNode|AudioParam|BatteryManager|BeforeUnloadEvent|BiquadFilterNode|Blob|BufferSource|ByteString|CSS|CSSConditionRule assets/syntaxes/02_Extra/TypeScript/TypeScriptReact.tmLanguage:6026: |AudioNode|AudioParam|BatteryManager|BeforeUnloadEvent|BiquadFilterNode|Blob|BufferSource|ByteString|CSS|CSSConditionRule assets/syntaxes/02_Extra/Org mode/README.org:25:- [X] =Verbatim= assets/syntaxes/02_Extra/PowerShell/examples/test.ps1:281:a.bat assets/syntaxes/02_Extra/PowerShell/examples/test.ps1:282:aa.bat assets/syntaxes/02_Extra/PowerShell/examples/test.ps1:283:aaa.bat assets/syntaxes/02_Extra/PowerShell/examples/test.ps1:284:aaaa.bat assets/syntaxes/02_Extra/PowerShell/PowerShellSyntax.tmLanguage:255: (\b(([A-Za-z0-9\-_\.]+)\.(?i:exe|com|cmd|bat))\b) assets/syntaxes/02_Extra/PowerShell/PowerShellSyntax.tmLanguage:503: (?:(\p{L}|\d|_|-|\\|\:)*\\)?\b(?i:Add|Approve|Assert|Backup|Block|Build|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Deploy|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Mount|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Write)\-.+?(?:\.(?i:exe|cmd|bat|ps1))?\b assets/syntaxes/02_Extra/ssh-config/src/options.yaml:54: BatchMode: assets/syntaxes/02_Extra/ssh-config/SSH Config.sublime-syntax:215: BatchMode|CanonicalizeFallbackLocal|CheckHostIP|Compression| assets/syntaxes/02_Extra/ssh-config/Support/SSH Config.sublime-completions:41: "trigger": "BatchMode", assets/syntaxes/02_Extra/ssh-config/Support/SSH Config.sublime-completions:42: "contents": "BatchMode", assets/syntaxes/02_Extra/ssh-config/Support/SSH Config.sublime-completions:47: "trigger": "batchmode", assets/syntaxes/02_Extra/ssh-config/Support/SSH Config.sublime-completions:48: "contents": "BatchMode ${0:{ yes | no \\}}", assets/syntaxes/02_Extra/http-request-response/README.md:3:It was originally designed for use in https://github.com/sharkdp/bat, so it is not using any Sublime Text 4 features, as https://github.com/trishume/syntect does not support them yet. So this package should work in Sublime Text 3 also. assets/syntaxes/02_Extra/http-request-response/docs/CONTRIBUTING.md:9:If you are not a Sublime Text user, and are contributing to improve a tool that uses the `syntect` Rust library, such as `bat`, assets/syntaxes/02_Extra/Crystal/Crystal.tmLanguage:353: \b(initialize|new|loop|include|extend|raise|getter|setter|property|class_getter|class_setter|class_property|describe|context|it|with|delegate|def_hash|def_equals|def_equals_and_hash|forward_missing_to|record|assert_responds_to|spawn|annotation|verbatim)\b[!?]? assets/syntaxes/02_Extra/Lean/README.md:22:* Batch file execution assets/syntaxes/02_Extra/Lean/README.md:178:* `lean.batchExecute` (Lean: Batch Execute File): execute the current file using Lean (bound to ctrl+shift+r by default) assets/syntaxes/02_Extra/Lean/README.md:287:* Properly set working directory when executing in batch mode. assets/syntaxes/02_Extra/Lean/src/batch.ts:6:let batchOutputChannel: OutputChannel; assets/syntaxes/02_Extra/Lean/src/batch.ts:8:export function batchExecuteFile( assets/syntaxes/02_Extra/Lean/src/batch.ts:13: batchOutputChannel = batchOutputChannel || assets/syntaxes/02_Extra/Lean/src/batch.ts:14: window.createOutputChannel('Lean: Batch File Output'); assets/syntaxes/02_Extra/Lean/src/batch.ts:23: batchOutputChannel.clear(); assets/syntaxes/02_Extra/Lean/src/batch.ts:26: batchOutputChannel.appendLine(line); assets/syntaxes/02_Extra/Lean/src/batch.ts:30: batchOutputChannel.appendLine(line); assets/syntaxes/02_Extra/Lean/src/batch.ts:37: batchOutputChannel.show(true); assets/syntaxes/02_Extra/Lean/src/extension.ts:3:import { batchExecuteFile } from './batch'; assets/syntaxes/02_Extra/Lean/src/extension.ts:67: commands.registerTextEditorCommand('lean.batchExecute', assets/syntaxes/02_Extra/Lean/src/extension.ts:68: (editor, edit, args) => { batchExecuteFile(server, editor, edit, args); }), assets/syntaxes/02_Extra/Lean/package.json:281: "command": "lean.batchExecute", assets/syntaxes/02_Extra/Lean/package.json:283: "title": "Batch Execute File", assets/syntaxes/02_Extra/Lean/package.json:350: "command": "lean.batchExecute", assets/syntaxes/02_Extra/Lean/package.json:373: "command": "lean.batchExecute", assets/syntaxes/02_Extra/Lean/syntaxes/lean-markdown.json:571: "fenced_code_block_dosbatch": { assets/syntaxes/02_Extra/Lean/syntaxes/lean-markdown.json:572: "begin": "(^)(\\s*)(`{3,}|~{3,})\\s*(?i:(bat|batch)((\\s+|:|\\{)[^`~]*)?$)", assets/syntaxes/02_Extra/Lean/syntaxes/lean-markdown.json:595: "contentName": "meta.embedded.block.dosbatch", assets/syntaxes/02_Extra/Lean/syntaxes/lean-markdown.json:598: "include": "source.batchfile" assets/syntaxes/02_Extra/Lean/syntaxes/lean-markdown.json:1774: "include": "#fenced_code_block_dosbatch" assets/syntaxes/02_Extra/Lean/syntaxes/lean.json:21: { "match": "\\battribute\\b\\s*\\[[^\\]]*\\]", "name": "storage.modifier.lean" }, assets/syntaxes/02_Extra/Lean/package-lock.json:1946: "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", assets/syntaxes/02_Extra/Lean/package-lock.json:4288: "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", assets/syntaxes/02_Extra/Lean/package-lock.json:7099: "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", assets/syntaxes/02_Extra/Lean/package-lock.json:9705: "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", assets/syntaxes/02_Extra/Lean/package-lock.json:11662: "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", assets/syntaxes/02_Extra/Lean/package-lock.json:14054: "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", assets/syntaxes/02_Extra/CMake/CMakeCommands.yml:4:add_custom_command: [OUTPUT, COMMAND, ARGS, MAIN_DEPENDENCY, DEPENDS, BYPRODUCTS, IMPLICIT_DEPENDS, WORKING_DIRECTORY, COMMENT, DEPFILE, VERBATIM, APPEND, USES_TERMINAL COMMAND_EXPAND_LISTS, TARGET, PRE_BUILD, PRE_LINK, POST_BUILD] assets/syntaxes/02_Extra/CMake/CMakeCommands.yml:5:add_custom_target: [ALL, COMMAND, DEPENDS, BYPRODUCTS, WORKING_DIRECTORY, COMMENT, VERBATIM, USES_TERMINAL, COMMAND_EXPAND_LISTS, SOURCES] assets/syntaxes/02_Extra/CMake/CMakeVariables.sublime-completions:1:{"completions":[{"contents":"ANDROID","trigger":"ANDROID\tbuiltin variable"},{"contents":"APPLE","trigger":"APPLE\tbuiltin variable"},{"contents":"BORLAND","trigger":"BORLAND\tbuiltin variable"},{"contents":"BUILD_SHARED_LIBS","trigger":"BUILD_SHARED_LIBS\tbuiltin variable"},{"contents":"CACHE","trigger":"CACHE\tbuiltin variable"},{"contents":"CMAKE_ABSOLUTE_DESTINATION_FILES","trigger":"CMAKE_ABSOLUTE_DESTINATION_FILES\tbuiltin variable"},{"contents":"CMAKE_AIX_EXPORT_ALL_SYMBOLS","trigger":"CMAKE_AIX_EXPORT_ALL_SYMBOLS\tbuiltin variable"},{"contents":"CMAKE_ANDROID_ANT_ADDITIONAL_OPTIONS","trigger":"CMAKE_ANDROID_ANT_ADDITIONAL_OPTIONS\tbuiltin variable"},{"contents":"CMAKE_ANDROID_API","trigger":"CMAKE_ANDROID_API\tbuiltin variable"},{"contents":"CMAKE_ANDROID_API_MIN","trigger":"CMAKE_ANDROID_API_MIN\tbuiltin variable"},{"contents":"CMAKE_ANDROID_ARCH","trigger":"CMAKE_ANDROID_ARCH\tbuiltin variable"},{"contents":"CMAKE_ANDROID_ARCH_ABI","trigger":"CMAKE_ANDROID_ARCH_ABI\tbuiltin variable"},{"contents":"CMAKE_ANDROID_ARM_MODE","trigger":"CMAKE_ANDROID_ARM_MODE\tbuiltin variable"},{"contents":"CMAKE_ANDROID_ARM_NEON","trigger":"CMAKE_ANDROID_ARM_NEON\tbuiltin variable"},{"contents":"CMAKE_ANDROID_ASSETS_DIRECTORIES","trigger":"CMAKE_ANDROID_ASSETS_DIRECTORIES\tbuiltin variable"},{"contents":"CMAKE_ANDROID_GUI","trigger":"CMAKE_ANDROID_GUI\tbuiltin variable"},{"contents":"CMAKE_ANDROID_JAR_DEPENDENCIES","trigger":"CMAKE_ANDROID_JAR_DEPENDENCIES\tbuiltin variable"},{"contents":"CMAKE_ANDROID_JAR_DIRECTORIES","trigger":"CMAKE_ANDROID_JAR_DIRECTORIES\tbuiltin variable"},{"contents":"CMAKE_ANDROID_JAVA_SOURCE_DIR","trigger":"CMAKE_ANDROID_JAVA_SOURCE_DIR\tbuiltin variable"},{"contents":"CMAKE_ANDROID_NATIVE_LIB_DEPENDENCIES","trigger":"CMAKE_ANDROID_NATIVE_LIB_DEPENDENCIES\tbuiltin variable"},{"contents":"CMAKE_ANDROID_NATIVE_LIB_DIRECTORIES","trigger":"CMAKE_ANDROID_NATIVE_LIB_DIRECTORIES\tbuiltin variable"},{"contents":"CMAKE_ANDROID_NDK","trigger":"CMAKE_ANDROID_NDK\tbuiltin variable"},{"contents":"CMAKE_ANDROID_NDK_DEPRECATED_HEADERS","trigger":"CMAKE_ANDROID_NDK_DEPRECATED_HEADERS\tbuiltin variable"},{"contents":"CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG","trigger":"CMAKE_ANDROID_NDK_TOOLCHAIN_HOST_TAG\tbuiltin variable"},{"contents":"CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION","trigger":"CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION\tbuiltin variable"},{"contents":"CMAKE_ANDROID_PROCESS_MAX","trigger":"CMAKE_ANDROID_PROCESS_MAX\tbuiltin variable"},{"contents":"CMAKE_ANDROID_PROGUARD","trigger":"CMAKE_ANDROID_PROGUARD\tbuiltin variable"},{"contents":"CMAKE_ANDROID_PROGUARD_CONFIG_PATH","trigger":"CMAKE_ANDROID_PROGUARD_CONFIG_PATH\tbuiltin variable"},{"contents":"CMAKE_ANDROID_SECURE_PROPS_PATH","trigger":"CMAKE_ANDROID_SECURE_PROPS_PATH\tbuiltin variable"},{"contents":"CMAKE_ANDROID_SKIP_ANT_STEP","trigger":"CMAKE_ANDROID_SKIP_ANT_STEP\tbuiltin variable"},{"contents":"CMAKE_ANDROID_STANDALONE_TOOLCHAIN","trigger":"CMAKE_ANDROID_STANDALONE_TOOLCHAIN\tbuiltin variable"},{"contents":"CMAKE_ANDROID_STL_TYPE","trigger":"CMAKE_ANDROID_STL_TYPE\tbuiltin variable"},{"contents":"CMAKE_APPBUNDLE_PATH","trigger":"CMAKE_APPBUNDLE_PATH\tbuiltin variable"},{"contents":"CMAKE_APPLE_SILICON_PROCESSOR","trigger":"CMAKE_APPLE_SILICON_PROCESSOR\tbuiltin variable"},{"contents":"CMAKE_AR","trigger":"CMAKE_AR\tbuiltin variable"},{"contents":"CMAKE_ARCHIVE_OUTPUT_DIRECTORY","trigger":"CMAKE_ARCHIVE_OUTPUT_DIRECTORY\tbuiltin variable"},{"contents":"CMAKE_ARGC","trigger":"CMAKE_ARGC\tbuiltin variable"},{"contents":"CMAKE_ARGV0","trigger":"CMAKE_ARGV0\tbuiltin variable"},{"contents":"CMAKE_AUTOGEN_ORIGIN_DEPENDS","trigger":"CMAKE_AUTOGEN_ORIGIN_DEPENDS\tbuiltin variable"},{"contents":"CMAKE_AUTOGEN_PARALLEL","trigger":"CMAKE_AUTOGEN_PARALLEL\tbuiltin variable"},{"contents":"CMAKE_AUTOGEN_VERBOSE","trigger":"CMAKE_AUTOGEN_VERBOSE\tbuiltin variable"},{"contents":"CMAKE_AUTOMOC","trigger":"CMAKE_AUTOMOC\tbuiltin variable"},{"contents":"CMAKE_AUTOMOC_COMPILER_PREDEFINES","trigger":"CMAKE_AUTOMOC_COMPILER_PREDEFINES\tbuiltin variable"},{"contents":"CMAKE_AUTOMOC_DEPEND_FILTERS","trigger":"CMAKE_AUTOMOC_DEPEND_FILTERS\tbuiltin variable"},{"contents":"CMAKE_AUTOMOC_MACRO_NAMES","trigger":"CMAKE_AUTOMOC_MACRO_NAMES\tbuiltin variable"},{"contents":"CMAKE_AUTOMOC_MOC_OPTIONS","trigger":"CMAKE_AUTOMOC_MOC_OPTIONS\tbuiltin variable"},{"contents":"CMAKE_AUTOMOC_PATH_PREFIX","trigger":"CMAKE_AUTOMOC_PATH_PREFIX\tbuiltin variable"},{"contents":"CMAKE_AUTOMOC_RELAXED_MODE","trigger":"CMAKE_AUTOMOC_RELAXED_MODE\tbuiltin variable"},{"contents":"CMAKE_AUTORCC","trigger":"CMAKE_AUTORCC\tbuiltin variable"},{"contents":"CMAKE_AUTORCC_OPTIONS","trigger":"CMAKE_AUTORCC_OPTIONS\tbuiltin variable"},{"contents":"CMAKE_AUTOUIC","trigger":"CMAKE_AUTOUIC\tbuiltin variable"},{"contents":"CMAKE_AUTOUIC_OPTIONS","trigger":"CMAKE_AUTOUIC_OPTIONS\tbuiltin variable"},{"contents":"CMAKE_AUTOUIC_SEARCH_PATHS","trigger":"CMAKE_AUTOUIC_SEARCH_PATHS\tbuiltin variable"},{"contents":"CMAKE_BACKWARDS_COMPATIBILITY","trigger":"CMAKE_BACKWARDS_COMPATIBILITY\tbuiltin variable"},{"contents":"CMAKE_BINARY_DIR","trigger":"CMAKE_BINARY_DIR\tbuiltin variable"},{"contents":"CMAKE_BUILD_RPATH","trigger":"CMAKE_BUILD_RPATH\tbuiltin variable"},{"contents":"CMAKE_BUILD_RPATH_USE_ORIGIN","trigger":"CMAKE_BUILD_RPATH_USE_ORIGIN\tbuiltin variable"},{"contents":"CMAKE_BUILD_TOOL","trigger":"CMAKE_BUILD_TOOL\tbuiltin variable"},{"contents":"CMAKE_BUILD_TYPE","trigger":"CMAKE_BUILD_TYPE\tbuiltin variable"},{"contents":"CMAKE_BUILD_WITH_INSTALL_NAME_DIR","trigger":"CMAKE_BUILD_WITH_INSTALL_NAME_DIR\tbuiltin variable"},{"contents":"CMAKE_BUILD_WITH_INSTALL_RPATH","trigger":"CMAKE_BUILD_WITH_INSTALL_RPATH\tbuiltin variable"},{"contents":"CMAKE_CACHEFILE_DIR","trigger":"CMAKE_CACHEFILE_DIR\tbuiltin variable"},{"contents":"CMAKE_CACHE_MAJOR_VERSION","trigger":"CMAKE_CACHE_MAJOR_VERSION\tbuiltin variable"},{"contents":"CMAKE_CACHE_MINOR_VERSION","trigger":"CMAKE_CACHE_MINOR_VERSION\tbuiltin variable"},{"contents":"CMAKE_CACHE_PATCH_VERSION","trigger":"CMAKE_CACHE_PATCH_VERSION\tbuiltin variable"},{"contents":"CMAKE_CFG_INTDIR","trigger":"CMAKE_CFG_INTDIR\tbuiltin variable"},{"contents":"CMAKE_CLANG_VFS_OVERLAY","trigger":"CMAKE_CLANG_VFS_OVERLAY\tbuiltin variable"},{"contents":"CMAKE_CL_64","trigger":"CMAKE_CL_64\tbuiltin variable"},{"contents":"CMAKE_CODEBLOCKS_COMPILER_ID","trigger":"CMAKE_CODEBLOCKS_COMPILER_ID\tbuiltin variable"},{"contents":"CMAKE_CODEBLOCKS_EXCLUDE_EXTERNAL_FILES","trigger":"CMAKE_CODEBLOCKS_EXCLUDE_EXTERNAL_FILES\tbuiltin variable"},{"contents":"CMAKE_CODELITE_USE_TARGETS","trigger":"CMAKE_CODELITE_USE_TARGETS\tbuiltin variable"},{"contents":"CMAKE_COLOR_MAKEFILE","trigger":"CMAKE_COLOR_MAKEFILE\tbuiltin variable"},{"contents":"CMAKE_COMMAND","trigger":"CMAKE_COMMAND\tbuiltin variable"},{"contents":"CMAKE_COMPILER_2005","trigger":"CMAKE_COMPILER_2005\tbuiltin variable"},{"contents":"CMAKE_COMPILER_IS_GNUCC","trigger":"CMAKE_COMPILER_IS_GNUCC\tbuiltin variable"},{"contents":"CMAKE_COMPILER_IS_GNUCXX","trigger":"CMAKE_COMPILER_IS_GNUCXX\tbuiltin variable"},{"contents":"CMAKE_COMPILER_IS_GNUG77","trigger":"CMAKE_COMPILER_IS_GNUG77\tbuiltin variable"},{"contents":"CMAKE_COMPILE_PDB_OUTPUT_DIRECTORY","trigger":"CMAKE_COMPILE_PDB_OUTPUT_DIRECTORY\tbuiltin variable"},{"contents":"CMAKE_CONFIGURATION_TYPES","trigger":"CMAKE_CONFIGURATION_TYPES\tbuiltin variable"},{"contents":"CMAKE_CPACK_COMMAND","trigger":"CMAKE_CPACK_COMMAND\tbuiltin variable"},{"contents":"CMAKE_CROSSCOMPILING","trigger":"CMAKE_CROSSCOMPILING\tbuiltin variable"},{"contents":"CMAKE_CROSSCOMPILING_EMULATOR","trigger":"CMAKE_CROSSCOMPILING_EMULATOR\tbuiltin variable"},{"contents":"CMAKE_CROSS_CONFIGS","trigger":"CMAKE_CROSS_CONFIGS\tbuiltin variable"},{"contents":"CMAKE_CTEST_ARGUMENTS","trigger":"CMAKE_CTEST_ARGUMENTS\tbuiltin variable"},{"contents":"CMAKE_CTEST_COMMAND","trigger":"CMAKE_CTEST_COMMAND\tbuiltin variable"},{"contents":"CMAKE_CUDA_ARCHITECTURES","trigger":"CMAKE_CUDA_ARCHITECTURES\tbuiltin variable"},{"contents":"CMAKE_CUDA_COMPILE_FEATURES","trigger":"CMAKE_CUDA_COMPILE_FEATURES\tbuiltin variable"},{"contents":"CMAKE_CUDA_EXTENSIONS","trigger":"CMAKE_CUDA_EXTENSIONS\tbuiltin variable"},{"contents":"CMAKE_CUDA_HOST_COMPILER","trigger":"CMAKE_CUDA_HOST_COMPILER\tbuiltin variable"},{"contents":"CMAKE_CUDA_RESOLVE_DEVICE_SYMBOLS","trigger":"CMAKE_CUDA_RESOLVE_DEVICE_SYMBOLS\tbuiltin variable"},{"contents":"CMAKE_CUDA_RUNTIME_LIBRARY","trigger":"CMAKE_CUDA_RUNTIME_LIBRARY\tbuiltin variable"},{"contents":"CMAKE_CUDA_SEPARABLE_COMPILATION","trigger":"CMAKE_CUDA_SEPARABLE_COMPILATION\tbuiltin variable"},{"contents":"CMAKE_CUDA_STANDARD","trigger":"CMAKE_CUDA_STANDARD\tbuiltin variable"},{"contents":"CMAKE_CUDA_STANDARD_REQUIRED","trigger":"CMAKE_CUDA_STANDARD_REQUIRED\tbuiltin variable"},{"contents":"CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES","trigger":"CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES\tbuiltin variable"},{"contents":"CMAKE_CURRENT_BINARY_DIR","trigger":"CMAKE_CURRENT_BINARY_DIR\tbuiltin variable"},{"contents":"CMAKE_CURRENT_FUNCTION","trigger":"CMAKE_CURRENT_FUNCTION\tbuiltin variable"},{"contents":"CMAKE_CURRENT_FUNCTION_LIST_DIR","trigger":"CMAKE_CURRENT_FUNCTION_LIST_DIR\tbuiltin variable"},{"contents":"CMAKE_CURRENT_FUNCTION_LIST_FILE","trigger":"CMAKE_CURRENT_FUNCTION_LIST_FILE\tbuiltin variable"},{"contents":"CMAKE_CURRENT_FUNCTION_LIST_LINE","trigger":"CMAKE_CURRENT_FUNCTION_LIST_LINE\tbuiltin variable"},{"contents":"CMAKE_CURRENT_LIST_DIR","trigger":"CMAKE_CURRENT_LIST_DIR\tbuiltin variable"},{"contents":"CMAKE_CURRENT_LIST_FILE","trigger":"CMAKE_CURRENT_LIST_FILE\tbuiltin variable"},{"contents":"CMAKE_CURRENT_LIST_LINE","trigger":"CMAKE_CURRENT_LIST_LINE\tbuiltin variable"},{"contents":"CMAKE_CURRENT_SOURCE_DIR","trigger":"CMAKE_CURRENT_SOURCE_DIR\tbuiltin variable"},{"contents":"CMAKE_CXX_COMPILE_FEATURES","trigger":"CMAKE_CXX_COMPILE_FEATURES\tbuiltin variable"},{"contents":"CMAKE_CXX_EXTENSIONS","trigger":"CMAKE_CXX_EXTENSIONS\tbuiltin variable"},{"contents":"CMAKE_CXX_STANDARD","trigger":"CMAKE_CXX_STANDARD\tbuiltin variable"},{"contents":"CMAKE_CXX_STANDARD_REQUIRED","trigger":"CMAKE_CXX_STANDARD_REQUIRED\tbuiltin variable"},{"contents":"CMAKE_C_COMPILE_FEATURES","trigger":"CMAKE_C_COMPILE_FEATURES\tbuiltin variable"},{"contents":"CMAKE_C_EXTENSIONS","trigger":"CMAKE_C_EXTENSIONS\tbuiltin variable"},{"contents":"CMAKE_C_STANDARD","trigger":"CMAKE_C_STANDARD\tbuiltin variable"},{"contents":"CMAKE_C_STANDARD_REQUIRED","trigger":"CMAKE_C_STANDARD_REQUIRED\tbuiltin variable"},{"contents":"CMAKE_DEBUG_POSTFIX","trigger":"CMAKE_DEBUG_POSTFIX\tbuiltin variable"},{"contents":"CMAKE_DEBUG_TARGET_PROPERTIES","trigger":"CMAKE_DEBUG_TARGET_PROPERTIES\tbuiltin variable"},{"contents":"CMAKE_DEFAULT_BUILD_TYPE","trigger":"CMAKE_DEFAULT_BUILD_TYPE\tbuiltin variable"},{"contents":"CMAKE_DEFAULT_CONFIGS","trigger":"CMAKE_DEFAULT_CONFIGS\tbuiltin variable"},{"contents":"CMAKE_DEPENDS_IN_PROJECT_ONLY","trigger":"CMAKE_DEPENDS_IN_PROJECT_ONLY\tbuiltin variable"},{"contents":"CMAKE_DIRECTORY_LABELS","trigger":"CMAKE_DIRECTORY_LABELS\tbuiltin variable"},{"contents":"CMAKE_DISABLE_PRECOMPILE_HEADERS","trigger":"CMAKE_DISABLE_PRECOMPILE_HEADERS\tbuiltin variable"},{"contents":"CMAKE_DL_LIBS","trigger":"CMAKE_DL_LIBS\tbuiltin variable"},{"contents":"CMAKE_DOTNET_TARGET_FRAMEWORK","trigger":"CMAKE_DOTNET_TARGET_FRAMEWORK\tbuiltin variable"},{"contents":"CMAKE_DOTNET_TARGET_FRAMEWORK_VERSION","trigger":"CMAKE_DOTNET_TARGET_FRAMEWORK_VERSION\tbuiltin variable"},{"contents":"CMAKE_ECLIPSE_GENERATE_LINKED_RESOURCES","trigger":"CMAKE_ECLIPSE_GENERATE_LINKED_RESOURCES\tbuiltin variable"},{"contents":"CMAKE_ECLIPSE_GENERATE_SOURCE_PROJECT","trigger":"CMAKE_ECLIPSE_GENERATE_SOURCE_PROJECT\tbuiltin variable"},{"contents":"CMAKE_ECLIPSE_MAKE_ARGUMENTS","trigger":"CMAKE_ECLIPSE_MAKE_ARGUMENTS\tbuiltin variable"},{"contents":"CMAKE_ECLIPSE_RESOURCE_ENCODING","trigger":"CMAKE_ECLIPSE_RESOURCE_ENCODING\tbuiltin variable"},{"contents":"CMAKE_ECLIPSE_VERSION","trigger":"CMAKE_ECLIPSE_VERSION\tbuiltin variable"},{"contents":"CMAKE_EDIT_COMMAND","trigger":"CMAKE_EDIT_COMMAND\tbuiltin variable"},{"contents":"CMAKE_ENABLE_EXPORTS","trigger":"CMAKE_ENABLE_EXPORTS\tbuiltin variable"},{"contents":"CMAKE_ERROR_DEPRECATED","trigger":"CMAKE_ERROR_DEPRECATED\tbuiltin variable"},{"contents":"CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION","trigger":"CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION\tbuiltin variable"},{"contents":"CMAKE_EXECUTABLE_SUFFIX","trigger":"CMAKE_EXECUTABLE_SUFFIX\tbuiltin variable"},{"contents":"CMAKE_EXECUTE_PROCESS_COMMAND_ECHO","trigger":"CMAKE_EXECUTE_PROCESS_COMMAND_ECHO\tbuiltin variable"},{"contents":"CMAKE_EXE_LINKER_FLAGS","trigger":"CMAKE_EXE_LINKER_FLAGS\tbuiltin variable"},{"contents":"CMAKE_EXE_LINKER_FLAGS_INIT","trigger":"CMAKE_EXE_LINKER_FLAGS_INIT\tbuiltin variable"},{"contents":"CMAKE_EXPORT_COMPILE_COMMANDS","trigger":"CMAKE_EXPORT_COMPILE_COMMANDS\tbuiltin variable"},{"contents":"CMAKE_EXPORT_NO_PACKAGE_REGISTRY","trigger":"CMAKE_EXPORT_NO_PACKAGE_REGISTRY\tbuiltin variable"},{"contents":"CMAKE_EXPORT_PACKAGE_REGISTRY","trigger":"CMAKE_EXPORT_PACKAGE_REGISTRY\tbuiltin variable"},{"contents":"CMAKE_EXTRA_GENERATOR","trigger":"CMAKE_EXTRA_GENERATOR\tbuiltin variable"},{"contents":"CMAKE_EXTRA_SHARED_LIBRARY_SUFFIXES","trigger":"CMAKE_EXTRA_SHARED_LIBRARY_SUFFIXES\tbuiltin variable"},{"contents":"CMAKE_FIND_APPBUNDLE","trigger":"CMAKE_FIND_APPBUNDLE\tbuiltin variable"},{"contents":"CMAKE_FIND_DEBUG_MODE","trigger":"CMAKE_FIND_DEBUG_MODE\tbuiltin variable"},{"contents":"CMAKE_FIND_FRAMEWORK","trigger":"CMAKE_FIND_FRAMEWORK\tbuiltin variable"},{"contents":"CMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX","trigger":"CMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX\tbuiltin variable"},{"contents":"CMAKE_FIND_LIBRARY_PREFIXES","trigger":"CMAKE_FIND_LIBRARY_PREFIXES\tbuiltin variable"},{"contents":"CMAKE_FIND_LIBRARY_SUFFIXES","trigger":"CMAKE_FIND_LIBRARY_SUFFIXES\tbuiltin variable"},{"contents":"CMAKE_FIND_NO_INSTALL_PREFIX","trigger":"CMAKE_FIND_NO_INSTALL_PREFIX\tbuiltin variable"},{"contents":"CMAKE_FIND_PACKAGE_NAME","trigger":"CMAKE_FIND_PACKAGE_NAME\tbuiltin variable"},{"contents":"CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY","trigger":"CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY\tbuiltin variable"},{"contents":"CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY","trigger":"CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY\tbuiltin variable"},{"contents":"CMAKE_FIND_PACKAGE_PREFER_CONFIG","trigger":"CMAKE_FIND_PACKAGE_PREFER_CONFIG\tbuiltin variable"},{"contents":"CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS","trigger":"CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS\tbuiltin variable"},{"contents":"CMAKE_FIND_PACKAGE_SORT_DIRECTION","trigger":"CMAKE_FIND_PACKAGE_SORT_DIRECTION\tbuiltin variable"},{"contents":"CMAKE_FIND_PACKAGE_SORT_ORDER","trigger":"CMAKE_FIND_PACKAGE_SORT_ORDER\tbuiltin variable"},{"contents":"CMAKE_FIND_PACKAGE_WARN_NO_MODULE","trigger":"CMAKE_FIND_PACKAGE_WARN_NO_MODULE\tbuiltin variable"},{"contents":"CMAKE_FIND_ROOT_PATH","trigger":"CMAKE_FIND_ROOT_PATH\tbuiltin variable"},{"contents":"CMAKE_FIND_ROOT_PATH_MODE_INCLUDE","trigger":"CMAKE_FIND_ROOT_PATH_MODE_INCLUDE\tbuiltin variable"},{"contents":"CMAKE_FIND_ROOT_PATH_MODE_LIBRARY","trigger":"CMAKE_FIND_ROOT_PATH_MODE_LIBRARY\tbuiltin variable"},{"contents":"CMAKE_FIND_ROOT_PATH_MODE_PACKAGE","trigger":"CMAKE_FIND_ROOT_PATH_MODE_PACKAGE\tbuiltin variable"},{"contents":"CMAKE_FIND_ROOT_PATH_MODE_PROGRAM","trigger":"CMAKE_FIND_ROOT_PATH_MODE_PROGRAM\tbuiltin variable"},{"contents":"CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH","trigger":"CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH\tbuiltin variable"},{"contents":"CMAKE_FIND_USE_CMAKE_PATH","trigger":"CMAKE_FIND_USE_CMAKE_PATH\tbuiltin variable"},{"contents":"CMAKE_FIND_USE_CMAKE_SYSTEM_PATH","trigger":"CMAKE_FIND_USE_CMAKE_SYSTEM_PATH\tbuiltin variable"},{"contents":"CMAKE_FIND_USE_PACKAGE_REGISTRY","trigger":"CMAKE_FIND_USE_PACKAGE_REGISTRY\tbuiltin variable"},{"contents":"CMAKE_FIND_USE_PACKAGE_ROOT_PATH","trigger":"CMAKE_FIND_USE_PACKAGE_ROOT_PATH\tbuiltin variable"},{"contents":"CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH","trigger":"CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH\tbuiltin variable"},{"contents":"CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY","trigger":"CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY\tbuiltin variable"},{"contents":"CMAKE_FOLDER","trigger":"CMAKE_FOLDER\tbuiltin variable"},{"contents":"CMAKE_FRAMEWORK","trigger":"CMAKE_FRAMEWORK\tbuiltin variable"},{"contents":"CMAKE_FRAMEWORK_PATH","trigger":"CMAKE_FRAMEWORK_PATH\tbuiltin variable"},{"contents":"CMAKE_Fortran_FORMAT","trigger":"CMAKE_Fortran_FORMAT\tbuiltin variable"},{"contents":"CMAKE_Fortran_MODDIR_DEFAULT","trigger":"CMAKE_Fortran_MODDIR_DEFAULT\tbuiltin variable"},{"contents":"CMAKE_Fortran_MODDIR_FLAG","trigger":"CMAKE_Fortran_MODDIR_FLAG\tbuiltin variable"},{"contents":"CMAKE_Fortran_MODOUT_FLAG","trigger":"CMAKE_Fortran_MODOUT_FLAG\tbuiltin variable"},{"contents":"CMAKE_Fortran_MODULE_DIRECTORY","trigger":"CMAKE_Fortran_MODULE_DIRECTORY\tbuiltin variable"},{"contents":"CMAKE_Fortran_PREPROCESS","trigger":"CMAKE_Fortran_PREPROCESS\tbuiltin variable"},{"contents":"CMAKE_GENERATOR","trigger":"CMAKE_GENERATOR\tbuiltin variable"},{"contents":"CMAKE_GENERATOR_INSTANCE","trigger":"CMAKE_GENERATOR_INSTANCE\tbuiltin variable"},{"contents":"CMAKE_GENERATOR_PLATFORM","trigger":"CMAKE_GENERATOR_PLATFORM\tbuiltin variable"},{"contents":"CMAKE_GENERATOR_TOOLSET","trigger":"CMAKE_GENERATOR_TOOLSET\tbuiltin variable"},{"contents":"CMAKE_GHS_NO_SOURCE_GROUP_FILE","trigger":"CMAKE_GHS_NO_SOURCE_GROUP_FILE\tbuiltin variable"},{"contents":"CMAKE_GLOBAL_AUTOGEN_TARGET","trigger":"CMAKE_GLOBAL_AUTOGEN_TARGET\tbuiltin variable"},{"contents":"CMAKE_GLOBAL_AUTOGEN_TARGET_NAME","trigger":"CMAKE_GLOBAL_AUTOGEN_TARGET_NAME\tbuiltin variable"},{"contents":"CMAKE_GLOBAL_AUTORCC_TARGET","trigger":"CMAKE_GLOBAL_AUTORCC_TARGET\tbuiltin variable"},{"contents":"CMAKE_GLOBAL_AUTORCC_TARGET_NAME","trigger":"CMAKE_GLOBAL_AUTORCC_TARGET_NAME\tbuiltin variable"},{"contents":"CMAKE_GNUtoMS","trigger":"CMAKE_GNUtoMS\tbuiltin variable"},{"contents":"CMAKE_HOME_DIRECTORY","trigger":"CMAKE_HOME_DIRECTORY\tbuiltin variable"},{"contents":"CMAKE_HOST_APPLE","trigger":"CMAKE_HOST_APPLE\tbuiltin variable"},{"contents":"CMAKE_HOST_SOLARIS","trigger":"CMAKE_HOST_SOLARIS\tbuiltin variable"},{"contents":"CMAKE_HOST_SYSTEM","trigger":"CMAKE_HOST_SYSTEM\tbuiltin variable"},{"contents":"CMAKE_HOST_SYSTEM_NAME","trigger":"CMAKE_HOST_SYSTEM_NAME\tbuiltin variable"},{"contents":"CMAKE_HOST_SYSTEM_PROCESSOR","trigger":"CMAKE_HOST_SYSTEM_PROCESSOR\tbuiltin variable"},{"contents":"CMAKE_HOST_SYSTEM_VERSION","trigger":"CMAKE_HOST_SYSTEM_VERSION\tbuiltin variable"},{"contents":"CMAKE_HOST_UNIX","trigger":"CMAKE_HOST_UNIX\tbuiltin variable"},{"contents":"CMAKE_HOST_WIN32","trigger":"CMAKE_HOST_WIN32\tbuiltin variable"},{"contents":"CMAKE_IGNORE_PATH","trigger":"CMAKE_IGNORE_PATH\tbuiltin variable"},{"contents":"CMAKE_IMPORT_LIBRARY_PREFIX","trigger":"CMAKE_IMPORT_LIBRARY_PREFIX\tbuiltin variable"},{"contents":"CMAKE_IMPORT_LIBRARY_SUFFIX","trigger":"CMAKE_IMPORT_LIBRARY_SUFFIX\tbuiltin variable"},{"contents":"CMAKE_INCLUDE_CURRENT_DIR","trigger":"CMAKE_INCLUDE_CURRENT_DIR\tbuiltin variable"},{"contents":"CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE","trigger":"CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE\tbuiltin variable"},{"contents":"CMAKE_INCLUDE_DIRECTORIES_BEFORE","trigger":"CMAKE_INCLUDE_DIRECTORIES_BEFORE\tbuiltin variable"},{"contents":"CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE","trigger":"CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE\tbuiltin variable"},{"contents":"CMAKE_INCLUDE_PATH","trigger":"CMAKE_INCLUDE_PATH\tbuiltin variable"},{"contents":"CMAKE_INSTALL_DEFAULT_COMPONENT_NAME","trigger":"CMAKE_INSTALL_DEFAULT_COMPONENT_NAME\tbuiltin variable"},{"contents":"CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS","trigger":"CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS\tbuiltin variable"},{"contents":"CMAKE_INSTALL_MESSAGE","trigger":"CMAKE_INSTALL_MESSAGE\tbuiltin variable"},{"contents":"CMAKE_INSTALL_NAME_DIR","trigger":"CMAKE_INSTALL_NAME_DIR\tbuiltin variable"},{"contents":"CMAKE_INSTALL_PREFIX","trigger":"CMAKE_INSTALL_PREFIX\tbuiltin variable"},{"contents":"CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT","trigger":"CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT\tbuiltin variable"},{"contents":"CMAKE_INSTALL_REMOVE_ENVIRONMENT_RPATH","trigger":"CMAKE_INSTALL_REMOVE_ENVIRONMENT_RPATH\tbuiltin variable"},{"contents":"CMAKE_INSTALL_RPATH","trigger":"CMAKE_INSTALL_RPATH\tbuiltin variable"},{"contents":"CMAKE_INSTALL_RPATH_USE_LINK_PATH","trigger":"CMAKE_INSTALL_RPATH_USE_LINK_PATH\tbuiltin variable"},{"contents":"CMAKE_INTERNAL_PLATFORM_ABI","trigger":"CMAKE_INTERNAL_PLATFORM_ABI\tbuiltin variable"},{"contents":"CMAKE_INTERPROCEDURAL_OPTIMIZATION","trigger":"CMAKE_INTERPROCEDURAL_OPTIMIZATION\tbuiltin variable"},{"contents":"CMAKE_IOS_INSTALL_COMBINED","trigger":"CMAKE_IOS_INSTALL_COMBINED\tbuiltin variable"},{"contents":"CMAKE_ISPC_HEADER_DIRECTORY","trigger":"CMAKE_ISPC_HEADER_DIRECTORY\tbuiltin variable"},{"contents":"CMAKE_ISPC_HEADER_SUFFIX","trigger":"CMAKE_ISPC_HEADER_SUFFIX\tbuiltin variable"},{"contents":"CMAKE_ISPC_INSTRUCTION_SETS","trigger":"CMAKE_ISPC_INSTRUCTION_SETS\tbuiltin variable"},{"contents":"CMAKE_JOB_POOLS","trigger":"CMAKE_JOB_POOLS\tbuiltin variable"},{"contents":"CMAKE_JOB_POOL_COMPILE","trigger":"CMAKE_JOB_POOL_COMPILE\tbuiltin variable"},{"contents":"CMAKE_JOB_POOL_LINK","trigger":"CMAKE_JOB_POOL_LINK\tbuiltin variable"},{"contents":"CMAKE_JOB_POOL_PRECOMPILE_HEADER","trigger":"CMAKE_JOB_POOL_PRECOMPILE_HEADER\tbuiltin variable"},{"contents":"CMAKE_LIBRARY_ARCHITECTURE","trigger":"CMAKE_LIBRARY_ARCHITECTURE\tbuiltin variable"},{"contents":"CMAKE_LIBRARY_ARCHITECTURE_REGEX","trigger":"CMAKE_LIBRARY_ARCHITECTURE_REGEX\tbuiltin variable"},{"contents":"CMAKE_LIBRARY_OUTPUT_DIRECTORY","trigger":"CMAKE_LIBRARY_OUTPUT_DIRECTORY\tbuiltin variable"},{"contents":"CMAKE_LIBRARY_PATH","trigger":"CMAKE_LIBRARY_PATH\tbuiltin variable"},{"contents":"CMAKE_LIBRARY_PATH_FLAG","trigger":"CMAKE_LIBRARY_PATH_FLAG\tbuiltin variable"},{"contents":"CMAKE_LINK_DEF_FILE_FLAG","trigger":"CMAKE_LINK_DEF_FILE_FLAG\tbuiltin variable"},{"contents":"CMAKE_LINK_DEPENDS_NO_SHARED","trigger":"CMAKE_LINK_DEPENDS_NO_SHARED\tbuiltin variable"},{"contents":"CMAKE_LINK_DIRECTORIES_BEFORE","trigger":"CMAKE_LINK_DIRECTORIES_BEFORE\tbuiltin variable"},{"contents":"CMAKE_LINK_INTERFACE_LIBRARIES","trigger":"CMAKE_LINK_INTERFACE_LIBRARIES\tbuiltin variable"},{"contents":"CMAKE_LINK_LIBRARY_FILE_FLAG","trigger":"CMAKE_LINK_LIBRARY_FILE_FLAG\tbuiltin variable"},{"contents":"CMAKE_LINK_LIBRARY_FLAG","trigger":"CMAKE_LINK_LIBRARY_FLAG\tbuiltin variable"},{"contents":"CMAKE_LINK_LIBRARY_SUFFIX","trigger":"CMAKE_LINK_LIBRARY_SUFFIX\tbuiltin variable"},{"contents":"CMAKE_LINK_SEARCH_END_STATIC","trigger":"CMAKE_LINK_SEARCH_END_STATIC\tbuiltin variable"},{"contents":"CMAKE_LINK_SEARCH_START_STATIC","trigger":"CMAKE_LINK_SEARCH_START_STATIC\tbuiltin variable"},{"contents":"CMAKE_LINK_WHAT_YOU_USE","trigger":"CMAKE_LINK_WHAT_YOU_USE\tbuiltin variable"},{"contents":"CMAKE_MACOSX_BUNDLE","trigger":"CMAKE_MACOSX_BUNDLE\tbuiltin variable"},{"contents":"CMAKE_MACOSX_RPATH","trigger":"CMAKE_MACOSX_RPATH\tbuiltin variable"},{"contents":"CMAKE_MAJOR_VERSION","trigger":"CMAKE_MAJOR_VERSION\tbuiltin variable"},{"contents":"CMAKE_MAKE_PROGRAM","trigger":"CMAKE_MAKE_PROGRAM\tbuiltin variable"},{"contents":"CMAKE_MATCH_COUNT","trigger":"CMAKE_MATCH_COUNT\tbuiltin variable"},{"contents":"CMAKE_MAXIMUM_RECURSION_DEPTH","trigger":"CMAKE_MAXIMUM_RECURSION_DEPTH\tbuiltin variable"},{"contents":"CMAKE_MESSAGE_CONTEXT","trigger":"CMAKE_MESSAGE_CONTEXT\tbuiltin variable"},{"contents":"CMAKE_MESSAGE_CONTEXT_SHOW","trigger":"CMAKE_MESSAGE_CONTEXT_SHOW\tbuiltin variable"},{"contents":"CMAKE_MESSAGE_INDENT","trigger":"CMAKE_MESSAGE_INDENT\tbuiltin variable"},{"contents":"CMAKE_MESSAGE_LOG_LEVEL","trigger":"CMAKE_MESSAGE_LOG_LEVEL\tbuiltin variable"},{"contents":"CMAKE_MFC_FLAG","trigger":"CMAKE_MFC_FLAG\tbuiltin variable"},{"contents":"CMAKE_MINIMUM_REQUIRED_VERSION","trigger":"CMAKE_MINIMUM_REQUIRED_VERSION\tbuiltin variable"},{"contents":"CMAKE_MINOR_VERSION","trigger":"CMAKE_MINOR_VERSION\tbuiltin variable"},{"contents":"CMAKE_MODULE_LINKER_FLAGS","trigger":"CMAKE_MODULE_LINKER_FLAGS\tbuiltin variable"},{"contents":"CMAKE_MODULE_LINKER_FLAGS_INIT","trigger":"CMAKE_MODULE_LINKER_FLAGS_INIT\tbuiltin variable"},{"contents":"CMAKE_MODULE_PATH","trigger":"CMAKE_MODULE_PATH\tbuiltin variable"},{"contents":"CMAKE_MSVCIDE_RUN_PATH","trigger":"CMAKE_MSVCIDE_RUN_PATH\tbuiltin variable"},{"contents":"CMAKE_MSVC_RUNTIME_LIBRARY","trigger":"CMAKE_MSVC_RUNTIME_LIBRARY\tbuiltin variable"},{"contents":"CMAKE_NETRC","trigger":"CMAKE_NETRC\tbuiltin variable"},{"contents":"CMAKE_NETRC_FILE","trigger":"CMAKE_NETRC_FILE\tbuiltin variable"},{"contents":"CMAKE_NINJA_OUTPUT_PATH_PREFIX","trigger":"CMAKE_NINJA_OUTPUT_PATH_PREFIX\tbuiltin variable"},{"contents":"CMAKE_NOT_USING_CONFIG_FLAGS","trigger":"CMAKE_NOT_USING_CONFIG_FLAGS\tbuiltin variable"},{"contents":"CMAKE_NO_BUILTIN_CHRPATH","trigger":"CMAKE_NO_BUILTIN_CHRPATH\tbuiltin variable"},{"contents":"CMAKE_NO_SYSTEM_FROM_IMPORTED","trigger":"CMAKE_NO_SYSTEM_FROM_IMPORTED\tbuiltin variable"},{"contents":"CMAKE_OBJCXX_EXTENSIONS","trigger":"CMAKE_OBJCXX_EXTENSIONS\tbuiltin variable"},{"contents":"CMAKE_OBJCXX_STANDARD","trigger":"CMAKE_OBJCXX_STANDARD\tbuiltin variable"},{"contents":"CMAKE_OBJCXX_STANDARD_REQUIRED","trigger":"CMAKE_OBJCXX_STANDARD_REQUIRED\tbuiltin variable"},{"contents":"CMAKE_OBJC_EXTENSIONS","trigger":"CMAKE_OBJC_EXTENSIONS\tbuiltin variable"},{"contents":"CMAKE_OBJC_STANDARD","trigger":"CMAKE_OBJC_STANDARD\tbuiltin variable"},{"contents":"CMAKE_OBJC_STANDARD_REQUIRED","trigger":"CMAKE_OBJC_STANDARD_REQUIRED\tbuiltin variable"},{"contents":"CMAKE_OBJECT_PATH_MAX","trigger":"CMAKE_OBJECT_PATH_MAX\tbuiltin variable"},{"contents":"CMAKE_OPTIMIZE_DEPENDENCIES","trigger":"CMAKE_OPTIMIZE_DEPENDENCIES\tbuiltin variable"},{"contents":"CMAKE_OSX_ARCHITECTURES","trigger":"CMAKE_OSX_ARCHITECTURES\tbuiltin variable"},{"contents":"CMAKE_OSX_DEPLOYMENT_TARGET","trigger":"CMAKE_OSX_DEPLOYMENT_TARGET\tbuiltin variable"},{"contents":"CMAKE_OSX_SYSROOT","trigger":"CMAKE_OSX_SYSROOT\tbuiltin variable"},{"contents":"CMAKE_PARENT_LIST_FILE","trigger":"CMAKE_PARENT_LIST_FILE\tbuiltin variable"},{"contents":"CMAKE_PATCH_VERSION","trigger":"CMAKE_PATCH_VERSION\tbuiltin variable"},{"contents":"CMAKE_PCH_INSTANTIATE_TEMPLATES","trigger":"CMAKE_PCH_INSTANTIATE_TEMPLATES\tbuiltin variable"},{"contents":"CMAKE_PCH_WARN_INVALID","trigger":"CMAKE_PCH_WARN_INVALID\tbuiltin variable"},{"contents":"CMAKE_PDB_OUTPUT_DIRECTORY","trigger":"CMAKE_PDB_OUTPUT_DIRECTORY\tbuiltin variable"},{"contents":"CMAKE_POSITION_INDEPENDENT_CODE","trigger":"CMAKE_POSITION_INDEPENDENT_CODE\tbuiltin variable"},{"contents":"CMAKE_PREFIX_PATH","trigger":"CMAKE_PREFIX_PATH\tbuiltin variable"},{"contents":"CMAKE_PROGRAM_PATH","trigger":"CMAKE_PROGRAM_PATH\tbuiltin variable"},{"contents":"CMAKE_PROJECT_DESCRIPTION","trigger":"CMAKE_PROJECT_DESCRIPTION\tbuiltin variable"},{"contents":"CMAKE_PROJECT_HOMEPAGE_URL","trigger":"CMAKE_PROJECT_HOMEPAGE_URL\tbuiltin variable"},{"contents":"CMAKE_PROJECT_INCLUDE","trigger":"CMAKE_PROJECT_INCLUDE\tbuiltin variable"},{"contents":"CMAKE_PROJECT_INCLUDE_BEFORE","trigger":"CMAKE_PROJECT_INCLUDE_BEFORE\tbuiltin variable"},{"contents":"CMAKE_PROJECT_NAME","trigger":"CMAKE_PROJECT_NAME\tbuiltin variable"},{"contents":"CMAKE_PROJECT_VERSION","trigger":"CMAKE_PROJECT_VERSION\tbuiltin variable"},{"contents":"CMAKE_PROJECT_VERSION_MAJOR","trigger":"CMAKE_PROJECT_VERSION_MAJOR\tbuiltin variable"},{"contents":"CMAKE_PROJECT_VERSION_MINOR","trigger":"CMAKE_PROJECT_VERSION_MINOR\tbuiltin variable"},{"contents":"CMAKE_PROJECT_VERSION_PATCH","trigger":"CMAKE_PROJECT_VERSION_PATCH\tbuiltin variable"},{"contents":"CMAKE_PROJECT_VERSION_TWEAK","trigger":"CMAKE_PROJECT_VERSION_TWEAK\tbuiltin variable"},{"contents":"CMAKE_RANLIB","trigger":"CMAKE_RANLIB\tbuiltin variable"},{"contents":"CMAKE_ROOT","trigger":"CMAKE_ROOT\tbuiltin variable"},{"contents":"CMAKE_RULE_MESSAGES","trigger":"CMAKE_RULE_MESSAGES\tbuiltin variable"},{"contents":"CMAKE_RUNTIME_OUTPUT_DIRECTORY","trigger":"CMAKE_RUNTIME_OUTPUT_DIRECTORY\tbuiltin variable"},{"contents":"CMAKE_SCRIPT_MODE_FILE","trigger":"CMAKE_SCRIPT_MODE_FILE\tbuiltin variable"},{"contents":"CMAKE_SHARED_LIBRARY_PREFIX","trigger":"CMAKE_SHARED_LIBRARY_PREFIX\tbuiltin variable"},{"contents":"CMAKE_SHARED_LIBRARY_SUFFIX","trigger":"CMAKE_SHARED_LIBRARY_SUFFIX\tbuiltin variable"},{"contents":"CMAKE_SHARED_LINKER_FLAGS","trigger":"CMAKE_SHARED_LINKER_FLAGS\tbuiltin variable"},{"contents":"CMAKE_SHARED_LINKER_FLAGS_INIT","trigger":"CMAKE_SHARED_LINKER_FLAGS_INIT\tbuiltin variable"},{"contents":"CMAKE_SHARED_MODULE_PREFIX","trigger":"CMAKE_SHARED_MODULE_PREFIX\tbuiltin variable"},{"contents":"CMAKE_SHARED_MODULE_SUFFIX","trigger":"CMAKE_SHARED_MODULE_SUFFIX\tbuiltin variable"},{"contents":"CMAKE_SIZEOF_VOID_P","trigger":"CMAKE_SIZEOF_VOID_P\tbuiltin variable"},{"contents":"CMAKE_SKIP_BUILD_RPATH","trigger":"CMAKE_SKIP_BUILD_RPATH\tbuiltin variable"},{"contents":"CMAKE_SKIP_INSTALL_ALL_DEPENDENCY","trigger":"CMAKE_SKIP_INSTALL_ALL_DEPENDENCY\tbuiltin variable"},{"contents":"CMAKE_SKIP_INSTALL_RPATH","trigger":"CMAKE_SKIP_INSTALL_RPATH\tbuiltin variable"},{"contents":"CMAKE_SKIP_INSTALL_RULES","trigger":"CMAKE_SKIP_INSTALL_RULES\tbuiltin variable"},{"contents":"CMAKE_SKIP_RPATH","trigger":"CMAKE_SKIP_RPATH\tbuiltin variable"},{"contents":"CMAKE_SOURCE_DIR","trigger":"CMAKE_SOURCE_DIR\tbuiltin variable"},{"contents":"CMAKE_STAGING_PREFIX","trigger":"CMAKE_STAGING_PREFIX\tbuiltin variable"},{"contents":"CMAKE_STATIC_LIBRARY_PREFIX","trigger":"CMAKE_STATIC_LIBRARY_PREFIX\tbuiltin variable"},{"contents":"CMAKE_STATIC_LIBRARY_SUFFIX","trigger":"CMAKE_STATIC_LIBRARY_SUFFIX\tbuiltin variable"},{"contents":"CMAKE_STATIC_LINKER_FLAGS","trigger":"CMAKE_STATIC_LINKER_FLAGS\tbuiltin variable"},{"contents":"CMAKE_STATIC_LINKER_FLAGS_INIT","trigger":"CMAKE_STATIC_LINKER_FLAGS_INIT\tbuiltin variable"},{"contents":"CMAKE_SUBLIME_TEXT_2_ENV_SETTINGS","trigger":"CMAKE_SUBLIME_TEXT_2_ENV_SETTINGS\tbuiltin variable"},{"contents":"CMAKE_SUBLIME_TEXT_2_EXCLUDE_BUILD_TREE","trigger":"CMAKE_SUBLIME_TEXT_2_EXCLUDE_BUILD_TREE\tbuiltin variable"},{"contents":"CMAKE_SUPPRESS_REGENERATION","trigger":"CMAKE_SUPPRESS_REGENERATION\tbuiltin variable"},{"contents":"CMAKE_SYSROOT","trigger":"CMAKE_SYSROOT\tbuiltin variable"},{"contents":"CMAKE_SYSROOT_COMPILE","trigger":"CMAKE_SYSROOT_COMPILE\tbuiltin variable"},{"contents":"CMAKE_SYSROOT_LINK","trigger":"CMAKE_SYSROOT_LINK\tbuiltin variable"},{"contents":"CMAKE_SYSTEM","trigger":"CMAKE_SYSTEM\tbuiltin variable"},{"contents":"CMAKE_SYSTEM_APPBUNDLE_PATH","trigger":"CMAKE_SYSTEM_APPBUNDLE_PATH\tbuiltin variable"},{"contents":"CMAKE_SYSTEM_FRAMEWORK_PATH","trigger":"CMAKE_SYSTEM_FRAMEWORK_PATH\tbuiltin variable"},{"contents":"CMAKE_SYSTEM_IGNORE_PATH","trigger":"CMAKE_SYSTEM_IGNORE_PATH\tbuiltin variable"},{"contents":"CMAKE_SYSTEM_INCLUDE_PATH","trigger":"CMAKE_SYSTEM_INCLUDE_PATH\tbuiltin variable"},{"contents":"CMAKE_SYSTEM_LIBRARY_PATH","trigger":"CMAKE_SYSTEM_LIBRARY_PATH\tbuiltin variable"},{"contents":"CMAKE_SYSTEM_NAME","trigger":"CMAKE_SYSTEM_NAME\tbuiltin variable"},{"contents":"CMAKE_SYSTEM_PREFIX_PATH","trigger":"CMAKE_SYSTEM_PREFIX_PATH\tbuiltin variable"},{"contents":"CMAKE_SYSTEM_PROCESSOR","trigger":"CMAKE_SYSTEM_PROCESSOR\tbuiltin variable"},{"contents":"CMAKE_SYSTEM_PROGRAM_PATH","trigger":"CMAKE_SYSTEM_PROGRAM_PATH\tbuiltin variable"},{"contents":"CMAKE_SYSTEM_VERSION","trigger":"CMAKE_SYSTEM_VERSION\tbuiltin variable"},{"contents":"CMAKE_Swift_LANGUAGE_VERSION","trigger":"CMAKE_Swift_LANGUAGE_VERSION\tbuiltin variable"},{"contents":"CMAKE_Swift_MODULE_DIRECTORY","trigger":"CMAKE_Swift_MODULE_DIRECTORY\tbuiltin variable"},{"contents":"CMAKE_Swift_NUM_THREADS","trigger":"CMAKE_Swift_NUM_THREADS\tbuiltin variable"},{"contents":"CMAKE_TOOLCHAIN_FILE","trigger":"CMAKE_TOOLCHAIN_FILE\tbuiltin variable"},{"contents":"CMAKE_TRY_COMPILE_CONFIGURATION","trigger":"CMAKE_TRY_COMPILE_CONFIGURATION\tbuiltin variable"},{"contents":"CMAKE_TRY_COMPILE_PLATFORM_VARIABLES","trigger":"CMAKE_TRY_COMPILE_PLATFORM_VARIABLES\tbuiltin variable"},{"contents":"CMAKE_TRY_COMPILE_TARGET_TYPE","trigger":"CMAKE_TRY_COMPILE_TARGET_TYPE\tbuiltin variable"},{"contents":"CMAKE_TWEAK_VERSION","trigger":"CMAKE_TWEAK_VERSION\tbuiltin variable"},{"contents":"CMAKE_UNITY_BUILD","trigger":"CMAKE_UNITY_BUILD\tbuiltin variable"},{"contents":"CMAKE_UNITY_BUILD_BATCH_SIZE","trigger":"CMAKE_UNITY_BUILD_BATCH_SIZE\tbuiltin variable"},{"contents":"CMAKE_USER_MAKE_RULES_OVERRIDE","trigger":"CMAKE_USER_MAKE_RULES_OVERRIDE\tbuiltin variable"},{"contents":"CMAKE_USE_RELATIVE_PATHS","trigger":"CMAKE_USE_RELATIVE_PATHS\tbuiltin variable"},{"contents":"CMAKE_VERBOSE_MAKEFILE","trigger":"CMAKE_VERBOSE_MAKEFILE\tbuiltin variable"},{"contents":"CMAKE_VERSION","trigger":"CMAKE_VERSION\tbuiltin variable"},{"contents":"CMAKE_VISIBILITY_INLINES_HIDDEN","trigger":"CMAKE_VISIBILITY_INLINES_HIDDEN\tbuiltin variable"},{"contents":"CMAKE_VS_DEVENV_COMMAND","trigger":"CMAKE_VS_DEVENV_COMMAND\tbuiltin variable"},{"contents":"CMAKE_VS_GLOBALS","trigger":"CMAKE_VS_GLOBALS\tbuiltin variable"},{"contents":"CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD","trigger":"CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD\tbuiltin variable"},{"contents":"CMAKE_VS_INCLUDE_PACKAGE_TO_DEFAULT_BUILD","trigger":"CMAKE_VS_INCLUDE_PACKAGE_TO_DEFAULT_BUILD\tbuiltin variable"},{"contents":"CMAKE_VS_INTEL_Fortran_PROJECT_VERSION","trigger":"CMAKE_VS_INTEL_Fortran_PROJECT_VERSION\tbuiltin variable"},{"contents":"CMAKE_VS_JUST_MY_CODE_DEBUGGING","trigger":"CMAKE_VS_JUST_MY_CODE_DEBUGGING\tbuiltin variable"},{"contents":"CMAKE_VS_MSBUILD_COMMAND","trigger":"CMAKE_VS_MSBUILD_COMMAND\tbuiltin variable"},{"contents":"CMAKE_VS_NsightTegra_VERSION","trigger":"CMAKE_VS_NsightTegra_VERSION\tbuiltin variable"},{"contents":"CMAKE_VS_PLATFORM_NAME","trigger":"CMAKE_VS_PLATFORM_NAME\tbuiltin variable"},{"contents":"CMAKE_VS_PLATFORM_NAME_DEFAULT","trigger":"CMAKE_VS_PLATFORM_NAME_DEFAULT\tbuiltin variable"},{"contents":"CMAKE_VS_PLATFORM_TOOLSET","trigger":"CMAKE_VS_PLATFORM_TOOLSET\tbuiltin variable"},{"contents":"CMAKE_VS_PLATFORM_TOOLSET_CUDA","trigger":"CMAKE_VS_PLATFORM_TOOLSET_CUDA\tbuiltin variable"},{"contents":"CMAKE_VS_PLATFORM_TOOLSET_CUDA_CUSTOM_DIR","trigger":"CMAKE_VS_PLATFORM_TOOLSET_CUDA_CUSTOM_DIR\tbuiltin variable"},{"contents":"CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE","trigger":"CMAKE_VS_PLATFORM_TOOLSET_HOST_ARCHITECTURE\tbuiltin variable"},{"contents":"CMAKE_VS_PLATFORM_TOOLSET_VERSION","trigger":"CMAKE_VS_PLATFORM_TOOLSET_VERSION\tbuiltin variable"},{"contents":"CMAKE_VS_SDK_EXCLUDE_DIRECTORIES","trigger":"CMAKE_VS_SDK_EXCLUDE_DIRECTORIES\tbuiltin variable"},{"contents":"CMAKE_VS_SDK_EXECUTABLE_DIRECTORIES","trigger":"CMAKE_VS_SDK_EXECUTABLE_DIRECTORIES\tbuiltin variable"},{"contents":"CMAKE_VS_SDK_INCLUDE_DIRECTORIES","trigger":"CMAKE_VS_SDK_INCLUDE_DIRECTORIES\tbuiltin variable"},{"contents":"CMAKE_VS_SDK_LIBRARY_DIRECTORIES","trigger":"CMAKE_VS_SDK_LIBRARY_DIRECTORIES\tbuiltin variable"},{"contents":"CMAKE_VS_SDK_LIBRARY_WINRT_DIRECTORIES","trigger":"CMAKE_VS_SDK_LIBRARY_WINRT_DIRECTORIES\tbuiltin variable"},{"contents":"CMAKE_VS_SDK_REFERENCE_DIRECTORIES","trigger":"CMAKE_VS_SDK_REFERENCE_DIRECTORIES\tbuiltin variable"},{"contents":"CMAKE_VS_SDK_SOURCE_DIRECTORIES","trigger":"CMAKE_VS_SDK_SOURCE_DIRECTORIES\tbuiltin variable"},{"contents":"CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION","trigger":"CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION\tbuiltin variable"},{"contents":"CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION_MAXIMUM","trigger":"CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION_MAXIMUM\tbuiltin variable"},{"contents":"CMAKE_VS_WINRT_BY_DEFAULT","trigger":"CMAKE_VS_WINRT_BY_DEFAULT\tbuiltin variable"},{"contents":"CMAKE_WARN_DEPRECATED","trigger":"CMAKE_WARN_DEPRECATED\tbuiltin variable"},{"contents":"CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION","trigger":"CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION\tbuiltin variable"},{"contents":"CMAKE_WIN32_EXECUTABLE","trigger":"CMAKE_WIN32_EXECUTABLE\tbuiltin variable"},{"contents":"CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS","trigger":"CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS\tbuiltin variable"},{"contents":"CMAKE_XCODE_BUILD_SYSTEM","trigger":"CMAKE_XCODE_BUILD_SYSTEM\tbuiltin variable"},{"contents":"CMAKE_XCODE_GENERATE_SCHEME","trigger":"CMAKE_XCODE_GENERATE_SCHEME\tbuiltin variable"},{"contents":"CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY","trigger":"CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY\tbuiltin variable"},{"contents":"CMAKE_XCODE_LINK_BUILD_PHASE_MODE","trigger":"CMAKE_XCODE_LINK_BUILD_PHASE_MODE\tbuiltin variable"},{"contents":"CMAKE_XCODE_PLATFORM_TOOLSET","trigger":"CMAKE_XCODE_PLATFORM_TOOLSET\tbuiltin variable"},{"contents":"CMAKE_XCODE_SCHEME_ADDRESS_SANITIZER","trigger":"CMAKE_XCODE_SCHEME_ADDRESS_SANITIZER\tbuiltin variable"},{"contents":"CMAKE_XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN","trigger":"CMAKE_XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN\tbuiltin variable"},{"contents":"CMAKE_XCODE_SCHEME_DEBUG_DOCUMENT_VERSIONING","trigger":"CMAKE_XCODE_SCHEME_DEBUG_DOCUMENT_VERSIONING\tbuiltin variable"},{"contents":"CMAKE_XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER","trigger":"CMAKE_XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER\tbuiltin variable"},{"contents":"CMAKE_XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS","trigger":"CMAKE_XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS\tbuiltin variable"},{"contents":"CMAKE_XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE","trigger":"CMAKE_XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE\tbuiltin variable"},{"contents":"CMAKE_XCODE_SCHEME_ENVIRONMENT","trigger":"CMAKE_XCODE_SCHEME_ENVIRONMENT\tbuiltin variable"},{"contents":"CMAKE_XCODE_SCHEME_GUARD_MALLOC","trigger":"CMAKE_XCODE_SCHEME_GUARD_MALLOC\tbuiltin variable"},{"contents":"CMAKE_XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP","trigger":"CMAKE_XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP\tbuiltin variable"},{"contents":"CMAKE_XCODE_SCHEME_MALLOC_GUARD_EDGES","trigger":"CMAKE_XCODE_SCHEME_MALLOC_GUARD_EDGES\tbuiltin variable"},{"contents":"CMAKE_XCODE_SCHEME_MALLOC_SCRIBBLE","trigger":"CMAKE_XCODE_SCHEME_MALLOC_SCRIBBLE\tbuiltin variable"},{"contents":"CMAKE_XCODE_SCHEME_MALLOC_STACK","trigger":"CMAKE_XCODE_SCHEME_MALLOC_STACK\tbuiltin variable"},{"contents":"CMAKE_XCODE_SCHEME_THREAD_SANITIZER","trigger":"CMAKE_XCODE_SCHEME_THREAD_SANITIZER\tbuiltin variable"},{"contents":"CMAKE_XCODE_SCHEME_THREAD_SANITIZER_STOP","trigger":"CMAKE_XCODE_SCHEME_THREAD_SANITIZER_STOP\tbuiltin variable"},{"contents":"CMAKE_XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER","trigger":"CMAKE_XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER\tbuiltin variable"},{"contents":"CMAKE_XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP","trigger":"CMAKE_XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP\tbuiltin variable"},{"contents":"CMAKE_XCODE_SCHEME_WORKING_DIRECTORY","trigger":"CMAKE_XCODE_SCHEME_WORKING_DIRECTORY\tbuiltin variable"},{"contents":"CMAKE_XCODE_SCHEME_ZOMBIE_OBJECTS","trigger":"CMAKE_XCODE_SCHEME_ZOMBIE_OBJECTS\tbuiltin variable"},{"contents":"CPACK_ABSOLUTE_DESTINATION_FILES","trigger":"CPACK_ABSOLUTE_DESTINATION_FILES\tbuiltin variable"},{"contents":"CPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY","trigger":"CPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY\tbuiltin variable"},{"contents":"CPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION","trigger":"CPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION\tbuiltin variable"},{"contents":"CPACK_INCLUDE_TOPLEVEL_DIRECTORY","trigger":"CPACK_INCLUDE_TOPLEVEL_DIRECTORY\tbuiltin variable"},{"contents":"CPACK_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS","trigger":"CPACK_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS\tbuiltin variable"},{"contents":"CPACK_PACKAGING_INSTALL_PREFIX","trigger":"CPACK_PACKAGING_INSTALL_PREFIX\tbuiltin variable"},{"contents":"CPACK_SET_DESTDIR","trigger":"CPACK_SET_DESTDIR\tbuiltin variable"},{"contents":"CPACK_WARN_ON_ABSOLUTE_INSTALL_DESTINATION","trigger":"CPACK_WARN_ON_ABSOLUTE_INSTALL_DESTINATION\tbuiltin variable"},{"contents":"CTEST_BINARY_DIRECTORY","trigger":"CTEST_BINARY_DIRECTORY\tbuiltin variable"},{"contents":"CTEST_BUILD_COMMAND","trigger":"CTEST_BUILD_COMMAND\tbuiltin variable"},{"contents":"CTEST_BUILD_NAME","trigger":"CTEST_BUILD_NAME\tbuiltin variable"},{"contents":"CTEST_BZR_COMMAND","trigger":"CTEST_BZR_COMMAND\tbuiltin variable"},{"contents":"CTEST_BZR_UPDATE_OPTIONS","trigger":"CTEST_BZR_UPDATE_OPTIONS\tbuiltin variable"},{"contents":"CTEST_CHANGE_ID","trigger":"CTEST_CHANGE_ID\tbuiltin variable"},{"contents":"CTEST_CHECKOUT_COMMAND","trigger":"CTEST_CHECKOUT_COMMAND\tbuiltin variable"},{"contents":"CTEST_CONFIGURATION_TYPE","trigger":"CTEST_CONFIGURATION_TYPE\tbuiltin variable"},{"contents":"CTEST_CONFIGURE_COMMAND","trigger":"CTEST_CONFIGURE_COMMAND\tbuiltin variable"},{"contents":"CTEST_COVERAGE_COMMAND","trigger":"CTEST_COVERAGE_COMMAND\tbuiltin variable"},{"contents":"CTEST_COVERAGE_EXTRA_FLAGS","trigger":"CTEST_COVERAGE_EXTRA_FLAGS\tbuiltin variable"},{"contents":"CTEST_CURL_OPTIONS","trigger":"CTEST_CURL_OPTIONS\tbuiltin variable"},{"contents":"CTEST_CUSTOM_COVERAGE_EXCLUDE","trigger":"CTEST_CUSTOM_COVERAGE_EXCLUDE\tbuiltin variable"},{"contents":"CTEST_CUSTOM_ERROR_EXCEPTION","trigger":"CTEST_CUSTOM_ERROR_EXCEPTION\tbuiltin variable"},{"contents":"CTEST_CUSTOM_ERROR_MATCH","trigger":"CTEST_CUSTOM_ERROR_MATCH\tbuiltin variable"},{"contents":"CTEST_CUSTOM_ERROR_POST_CONTEXT","trigger":"CTEST_CUSTOM_ERROR_POST_CONTEXT\tbuiltin variable"},{"contents":"CTEST_CUSTOM_ERROR_PRE_CONTEXT","trigger":"CTEST_CUSTOM_ERROR_PRE_CONTEXT\tbuiltin variable"},{"contents":"CTEST_CUSTOM_MAXIMUM_FAILED_TEST_OUTPUT_SIZE","trigger":"CTEST_CUSTOM_MAXIMUM_FAILED_TEST_OUTPUT_SIZE\tbuiltin variable"},{"contents":"CTEST_CUSTOM_MAXIMUM_NUMBER_OF_ERRORS","trigger":"CTEST_CUSTOM_MAXIMUM_NUMBER_OF_ERRORS\tbuiltin variable"},{"contents":"CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS","trigger":"CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS\tbuiltin variable"},{"contents":"CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE","trigger":"CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE\tbuiltin variable"},{"contents":"CTEST_CUSTOM_MEMCHECK_IGNORE","trigger":"CTEST_CUSTOM_MEMCHECK_IGNORE\tbuiltin variable"},{"contents":"CTEST_CUSTOM_POST_MEMCHECK","trigger":"CTEST_CUSTOM_POST_MEMCHECK\tbuiltin variable"},{"contents":"CTEST_CUSTOM_POST_TEST","trigger":"CTEST_CUSTOM_POST_TEST\tbuiltin variable"},{"contents":"CTEST_CUSTOM_PRE_MEMCHECK","trigger":"CTEST_CUSTOM_PRE_MEMCHECK\tbuiltin variable"},{"contents":"CTEST_CUSTOM_PRE_TEST","trigger":"CTEST_CUSTOM_PRE_TEST\tbuiltin variable"},{"contents":"CTEST_CUSTOM_TESTS_IGNORE","trigger":"CTEST_CUSTOM_TESTS_IGNORE\tbuiltin variable"},{"contents":"CTEST_CUSTOM_WARNING_EXCEPTION","trigger":"CTEST_CUSTOM_WARNING_EXCEPTION\tbuiltin variable"},{"contents":"CTEST_CUSTOM_WARNING_MATCH","trigger":"CTEST_CUSTOM_WARNING_MATCH\tbuiltin variable"},{"contents":"CTEST_CVS_CHECKOUT","trigger":"CTEST_CVS_CHECKOUT\tbuiltin variable"},{"contents":"CTEST_CVS_COMMAND","trigger":"CTEST_CVS_COMMAND\tbuiltin variable"},{"contents":"CTEST_CVS_UPDATE_OPTIONS","trigger":"CTEST_CVS_UPDATE_OPTIONS\tbuiltin variable"},{"contents":"CTEST_DROP_LOCATION","trigger":"CTEST_DROP_LOCATION\tbuiltin variable"},{"contents":"CTEST_DROP_METHOD","trigger":"CTEST_DROP_METHOD\tbuiltin variable"},{"contents":"CTEST_DROP_SITE","trigger":"CTEST_DROP_SITE\tbuiltin variable"},{"contents":"CTEST_DROP_SITE_CDASH","trigger":"CTEST_DROP_SITE_CDASH\tbuiltin variable"},{"contents":"CTEST_DROP_SITE_PASSWORD","trigger":"CTEST_DROP_SITE_PASSWORD\tbuiltin variable"},{"contents":"CTEST_DROP_SITE_USER","trigger":"CTEST_DROP_SITE_USER\tbuiltin variable"},{"contents":"CTEST_EXTRA_COVERAGE_GLOB","trigger":"CTEST_EXTRA_COVERAGE_GLOB\tbuiltin variable"},{"contents":"CTEST_GIT_COMMAND","trigger":"CTEST_GIT_COMMAND\tbuiltin variable"},{"contents":"CTEST_GIT_INIT_SUBMODULES","trigger":"CTEST_GIT_INIT_SUBMODULES\tbuiltin variable"},{"contents":"CTEST_GIT_UPDATE_CUSTOM","trigger":"CTEST_GIT_UPDATE_CUSTOM\tbuiltin variable"},{"contents":"CTEST_GIT_UPDATE_OPTIONS","trigger":"CTEST_GIT_UPDATE_OPTIONS\tbuiltin variable"},{"contents":"CTEST_HG_COMMAND","trigger":"CTEST_HG_COMMAND\tbuiltin variable"},{"contents":"CTEST_HG_UPDATE_OPTIONS","trigger":"CTEST_HG_UPDATE_OPTIONS\tbuiltin variable"},{"contents":"CTEST_LABELS_FOR_SUBPROJECTS","trigger":"CTEST_LABELS_FOR_SUBPROJECTS\tbuiltin variable"},{"contents":"CTEST_MEMORYCHECK_COMMAND","trigger":"CTEST_MEMORYCHECK_COMMAND\tbuiltin variable"},{"contents":"CTEST_MEMORYCHECK_COMMAND_OPTIONS","trigger":"CTEST_MEMORYCHECK_COMMAND_OPTIONS\tbuiltin variable"},{"contents":"CTEST_MEMORYCHECK_SANITIZER_OPTIONS","trigger":"CTEST_MEMORYCHECK_SANITIZER_OPTIONS\tbuiltin variable"},{"contents":"CTEST_MEMORYCHECK_SUPPRESSIONS_FILE","trigger":"CTEST_MEMORYCHECK_SUPPRESSIONS_FILE\tbuiltin variable"},{"contents":"CTEST_MEMORYCHECK_TYPE","trigger":"CTEST_MEMORYCHECK_TYPE\tbuiltin variable"},{"contents":"CTEST_NIGHTLY_START_TIME","trigger":"CTEST_NIGHTLY_START_TIME\tbuiltin variable"},{"contents":"CTEST_P4_CLIENT","trigger":"CTEST_P4_CLIENT\tbuiltin variable"},{"contents":"CTEST_P4_COMMAND","trigger":"CTEST_P4_COMMAND\tbuiltin variable"},{"contents":"CTEST_P4_OPTIONS","trigger":"CTEST_P4_OPTIONS\tbuiltin variable"},{"contents":"CTEST_P4_UPDATE_OPTIONS","trigger":"CTEST_P4_UPDATE_OPTIONS\tbuiltin variable"},{"contents":"CTEST_RESOURCE_SPEC_FILE","trigger":"CTEST_RESOURCE_SPEC_FILE\tbuiltin variable"},{"contents":"CTEST_RUN_CURRENT_SCRIPT","trigger":"CTEST_RUN_CURRENT_SCRIPT\tbuiltin variable"},{"contents":"CTEST_SCP_COMMAND","trigger":"CTEST_SCP_COMMAND\tbuiltin variable"},{"contents":"CTEST_SITE","trigger":"CTEST_SITE\tbuiltin variable"},{"contents":"CTEST_SOURCE_DIRECTORY","trigger":"CTEST_SOURCE_DIRECTORY\tbuiltin variable"},{"contents":"CTEST_SUBMIT_URL","trigger":"CTEST_SUBMIT_URL\tbuiltin variable"},{"contents":"CTEST_SVN_COMMAND","trigger":"CTEST_SVN_COMMAND\tbuiltin variable"},{"contents":"CTEST_SVN_OPTIONS","trigger":"CTEST_SVN_OPTIONS\tbuiltin variable"},{"contents":"CTEST_SVN_UPDATE_OPTIONS","trigger":"CTEST_SVN_UPDATE_OPTIONS\tbuiltin variable"},{"contents":"CTEST_TEST_LOAD","trigger":"CTEST_TEST_LOAD\tbuiltin variable"},{"contents":"CTEST_TEST_TIMEOUT","trigger":"CTEST_TEST_TIMEOUT\tbuiltin variable"},{"contents":"CTEST_TRIGGER_SITE","trigger":"CTEST_TRIGGER_SITE\tbuiltin variable"},{"contents":"CTEST_UPDATE_COMMAND","trigger":"CTEST_UPDATE_COMMAND\tbuiltin variable"},{"contents":"CTEST_UPDATE_OPTIONS","trigger":"CTEST_UPDATE_OPTIONS\tbuiltin variable"},{"contents":"CTEST_UPDATE_VERSION_ONLY","trigger":"CTEST_UPDATE_VERSION_ONLY\tbuiltin variable"},{"contents":"CTEST_UPDATE_VERSION_OVERRIDE","trigger":"CTEST_UPDATE_VERSION_OVERRIDE\tbuiltin variable"},{"contents":"CTEST_USE_LAUNCHERS","trigger":"CTEST_USE_LAUNCHERS\tbuiltin variable"},{"contents":"CYGWIN","trigger":"CYGWIN\tbuiltin variable"},{"contents":"ENV","trigger":"ENV\tbuiltin variable"},{"contents":"EXECUTABLE_OUTPUT_PATH","trigger":"EXECUTABLE_OUTPUT_PATH\tbuiltin variable"},{"contents":"GHS-MULTI","trigger":"GHS-MULTI\tbuiltin variable"},{"contents":"IOS","trigger":"IOS\tbuiltin variable"},{"contents":"LIBRARY_OUTPUT_PATH","trigger":"LIBRARY_OUTPUT_PATH\tbuiltin variable"},{"contents":"MINGW","trigger":"MINGW\tbuiltin variable"},{"contents":"MSVC","trigger":"MSVC\tbuiltin variable"},{"contents":"MSVC10","trigger":"MSVC10\tbuiltin variable"},{"contents":"MSVC11","trigger":"MSVC11\tbuiltin variable"},{"contents":"MSVC12","trigger":"MSVC12\tbuiltin variable"},{"contents":"MSVC14","trigger":"MSVC14\tbuiltin variable"},{"contents":"MSVC60","trigger":"MSVC60\tbuiltin variable"},{"contents":"MSVC70","trigger":"MSVC70\tbuiltin variable"},{"contents":"MSVC71","trigger":"MSVC71\tbuiltin variable"},{"contents":"MSVC80","trigger":"MSVC80\tbuiltin variable"},{"contents":"MSVC90","trigger":"MSVC90\tbuiltin variable"},{"contents":"MSVC_IDE","trigger":"MSVC_IDE\tbuiltin variable"},{"contents":"MSVC_TOOLSET_VERSION","trigger":"MSVC_TOOLSET_VERSION\tbuiltin variable"},{"contents":"MSVC_VERSION","trigger":"MSVC_VERSION\tbuiltin variable"},{"contents":"MSYS","trigger":"MSYS\tbuiltin variable"},{"contents":"PROJECT_BINARY_DIR","trigger":"PROJECT_BINARY_DIR\tbuiltin variable"},{"contents":"PROJECT_DESCRIPTION","trigger":"PROJECT_DESCRIPTION\tbuiltin variable"},{"contents":"PROJECT_HOMEPAGE_URL","trigger":"PROJECT_HOMEPAGE_URL\tbuiltin variable"},{"contents":"PROJECT_NAME","trigger":"PROJECT_NAME\tbuiltin variable"},{"contents":"PROJECT_SOURCE_DIR","trigger":"PROJECT_SOURCE_DIR\tbuiltin variable"},{"contents":"PROJECT_VERSION","trigger":"PROJECT_VERSION\tbuiltin variable"},{"contents":"PROJECT_VERSION_MAJOR","trigger":"PROJECT_VERSION_MAJOR\tbuiltin variable"},{"contents":"PROJECT_VERSION_MINOR","trigger":"PROJECT_VERSION_MINOR\tbuiltin variable"},{"contents":"PROJECT_VERSION_PATCH","trigger":"PROJECT_VERSION_PATCH\tbuiltin variable"},{"contents":"PROJECT_VERSION_TWEAK","trigger":"PROJECT_VERSION_TWEAK\tbuiltin variable"},{"contents":"UNIX","trigger":"UNIX\tbuiltin variable"},{"contents":"WIN32","trigger":"WIN32\tbuiltin variable"},{"contents":"WINCE","trigger":"WINCE\tbuiltin variable"},{"contents":"WINDOWS_PHONE","trigger":"WINDOWS_PHONE\tbuiltin variable"},{"contents":"WINDOWS_STORE","trigger":"WINDOWS_STORE\tbuiltin variable"},{"contents":"XCODE","trigger":"XCODE\tbuiltin variable"},{"contents":"XCODE_VERSION","trigger":"XCODE_VERSION\tbuiltin variable"}],"scope":"variable.other.readwrite.cmake"} assets/syntaxes/02_Extra/CMake/CMakeCommands.sublime-syntax:30: - match: \bVERBATIM\b assets/syntaxes/02_Extra/CMake/CMakeCommands.sublime-syntax:31: scope: variable.parameter.VERBATIM.cmake assets/syntaxes/02_Extra/CMake/CMakeCommands.sublime-syntax:59: - match: \bVERBATIM\b assets/syntaxes/02_Extra/CMake/CMakeCommands.sublime-syntax:60: scope: variable.parameter.VERBATIM.cmake assets/syntaxes/02_Extra/SCSS_Sass/Syntaxes/Sass.sublime-syntax:1830: - match: '\bat\b' assets/syntaxes/02_Extra/Elixir/builds/Elixir - mix format $file.sublime-build:6: "cmd": ["mix.bat", "format", "$file", "--dot-formatter", "$folder/.formatter.exs"], assets/syntaxes/02_Extra/Elixir/builds/Elixir - elixir $file.sublime-build:6: "cmd": ["elixir.bat", "$file_name"] assets/syntaxes/02_Extra/Lean.sublime-syntax:23: - match: '\battribute\b\s*\[[^\]]*\]' assets/syntaxes/02_Extra/PowerShell.sublime-syntax:86: - match: '(\b(([A-Za-z0-9\-_\.]+)\.(?i:exe|com|cmd|bat))\b)' assets/syntaxes/02_Extra/PowerShell.sublime-syntax:174: - match: '(?:(\p{L}|\d|_|-|\\|\:)*\\)?\b(?i:Add|Approve|Assert|Backup|Block|Build|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Deploy|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Mount|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Write)\-.+?(?:\.(?i:exe|cmd|bat|ps1))?\b' assets/syntaxes/02_Extra/MediaWiki/MediawikiNG.sublime-syntax:129: - meta_content_scope: meta.environment.embedded.dosbatch.mediawiki source.dosbatch.embedded assets/syntaxes/02_Extra/MediaWiki/MediawikiNG.sublime-syntax:132: - include: scope:source.dosbatch assets/syntaxes/02_Extra/MediaWiki/lib/Crypto.lin.x64/Crypto/Util/RFC1751.py:125: "BAN", "BAR", "BAT", "BAY", "BE", "BED", "BEE", "BEG", "BEN", "BET", assets/syntaxes/02_Extra/MediaWiki/lib/Crypto.lin.x64/Crypto/Util/RFC1751.py:189: "BARN", "BARR", "BASE", "BASH", "BASK", "BASS", "BATE", "BATH", assets/syntaxes/02_Extra/MediaWiki/lib/Crypto.lin.x64/Crypto/SelfTest/Signature/test_vectors/wycheproof/ecdsa_test.json:12177: "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABHJlM+Jnc6xyChFbAt6JrBWWZnfi\nObfFd6HBW4ECex/rc+ZzYB4hGqkqzLWFvAbMJ0thyeYUdG7dJI0czPjYsatLwVzF\njN8RYGXOl2fyoyI9\n-----END PUBLIC KEY-----", assets/syntaxes/02_Extra/MediaWiki/lib/Crypto.lin.x64/Crypto/SelfTest/Signature/test_vectors/wycheproof/ecdsa_test.json:13141: "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABATZ1KYtbrAgc+c4seQ5zs1UQAMZ\nEfRRkOtgYqM1NfxSabz8JdSvwdrg662UjXcy2AKa836Jo86n3ziwIPYkkG/KbZRO\nFIaFP+jlupz7otdKhS7Fh9Rv5JkXw2RBjvfspQ==\n-----END PUBLIC KEY-----", assets/syntaxes/02_Extra/MediaWiki/lib/Crypto.lin.x64/Crypto/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp256r1_sha256_test.json:2410: "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3q0Rx6WzloYvIZdNxHUvre/5lO/p\nu9BatBN2XqgLbh8d4/BkDorG7c+Jz/U8QOJlu5QHijQ3Nt8HqgMY/H/h/w==\n-----END PUBLIC KEY-----", assets/syntaxes/02_Extra/MediaWiki/lib/Crypto.lin.x64/Crypto/SelfTest/PublicKey/test_import_RSA.py:444:MIIEcjCCAlqgAwIBAgIBATANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJVUzEL assets/syntaxes/02_Extra/MediaWiki/lib/Crypto.win.x64/Crypto/Util/RFC1751.py:125: "BAN", "BAR", "BAT", "BAY", "BE", "BED", "BEE", "BEG", "BEN", "BET", assets/syntaxes/02_Extra/MediaWiki/lib/Crypto.win.x64/Crypto/Util/RFC1751.py:189: "BARN", "BARR", "BASE", "BASH", "BASK", "BASS", "BATE", "BATH", assets/syntaxes/02_Extra/MediaWiki/lib/Crypto.win.x64/Crypto/SelfTest/Signature/test_vectors/wycheproof/ecdsa_test.json:12177: "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABHJlM+Jnc6xyChFbAt6JrBWWZnfi\nObfFd6HBW4ECex/rc+ZzYB4hGqkqzLWFvAbMJ0thyeYUdG7dJI0czPjYsatLwVzF\njN8RYGXOl2fyoyI9\n-----END PUBLIC KEY-----", assets/syntaxes/02_Extra/MediaWiki/lib/Crypto.win.x64/Crypto/SelfTest/Signature/test_vectors/wycheproof/ecdsa_test.json:13141: "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABATZ1KYtbrAgc+c4seQ5zs1UQAMZ\nEfRRkOtgYqM1NfxSabz8JdSvwdrg662UjXcy2AKa836Jo86n3ziwIPYkkG/KbZRO\nFIaFP+jlupz7otdKhS7Fh9Rv5JkXw2RBjvfspQ==\n-----END PUBLIC KEY-----", assets/syntaxes/02_Extra/MediaWiki/lib/Crypto.win.x64/Crypto/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp256r1_sha256_test.json:2410: "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3q0Rx6WzloYvIZdNxHUvre/5lO/p\nu9BatBN2XqgLbh8d4/BkDorG7c+Jz/U8QOJlu5QHijQ3Nt8HqgMY/H/h/w==\n-----END PUBLIC KEY-----", assets/syntaxes/02_Extra/MediaWiki/lib/Crypto.win.x64/Crypto/SelfTest/PublicKey/test_import_RSA.py:444:MIIEcjCCAlqgAwIBAgIBATANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJVUzEL assets/syntaxes/02_Extra/MediaWiki/lib/Crypto.osx.x64/Crypto/Util/RFC1751.py:125: "BAN", "BAR", "BAT", "BAY", "BE", "BED", "BEE", "BEG", "BEN", "BET", assets/syntaxes/02_Extra/MediaWiki/lib/Crypto.osx.x64/Crypto/Util/RFC1751.py:189: "BARN", "BARR", "BASE", "BASH", "BASK", "BASS", "BATE", "BATH", assets/syntaxes/02_Extra/MediaWiki/lib/Crypto.osx.x64/Crypto/SelfTest/Signature/test_vectors/wycheproof/ecdsa_test.json:12177: "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABHJlM+Jnc6xyChFbAt6JrBWWZnfi\nObfFd6HBW4ECex/rc+ZzYB4hGqkqzLWFvAbMJ0thyeYUdG7dJI0czPjYsatLwVzF\njN8RYGXOl2fyoyI9\n-----END PUBLIC KEY-----", assets/syntaxes/02_Extra/MediaWiki/lib/Crypto.osx.x64/Crypto/SelfTest/Signature/test_vectors/wycheproof/ecdsa_test.json:13141: "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABATZ1KYtbrAgc+c4seQ5zs1UQAMZ\nEfRRkOtgYqM1NfxSabz8JdSvwdrg662UjXcy2AKa836Jo86n3ziwIPYkkG/KbZRO\nFIaFP+jlupz7otdKhS7Fh9Rv5JkXw2RBjvfspQ==\n-----END PUBLIC KEY-----", assets/syntaxes/02_Extra/MediaWiki/lib/Crypto.osx.x64/Crypto/SelfTest/Signature/test_vectors/wycheproof/ecdsa_secp256r1_sha256_test.json:2410: "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3q0Rx6WzloYvIZdNxHUvre/5lO/p\nu9BatBN2XqgLbh8d4/BkDorG7c+Jz/U8QOJlu5QHijQ3Nt8HqgMY/H/h/w==\n-----END PUBLIC KEY-----", assets/syntaxes/02_Extra/MediaWiki/lib/Crypto.osx.x64/Crypto/SelfTest/PublicKey/test_import_RSA.py:444:MIIEcjCCAlqgAwIBAgIBATANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJVUzEL assets/syntaxes/02_Extra/Julia/julia_unicode/emoji_symbols.py:69: ("\\:battery:", u"🔋"), assets/syntaxes/02_Extra/Julia/julia_unicode/emoji_symbols.py:576: ("\\:tanabata_tree:", u"🎋"), assets/syntaxes/02_Extra/Julia/julia_unicode/emoji_symbols.py:729: ("\\:bath:", u"🛀"), assets/syntaxes/02_Extra/Julia/julia_unicode/emoji_symbols.py:804: ("\\:bathtub:", u"🛁"), assets/syntaxes/02_Extra/Crystal.sublime-syntax:136: - match: '\b(initialize|new|loop|include|extend|raise|getter|setter|property|class_getter|class_setter|class_property|describe|context|it|with|delegate|def_hash|def_equals|def_equals_and_hash|forward_missing_to|record|assert_responds_to|spawn|annotation|verbatim)\b[!?]?' assets/syntaxes/02_Extra/Dart/docgen.py:30: cmd = ["docgen.bat", "--no-include-sdk", path] assets/syntaxes/02_Extra/Dart/docgen.py:58: cmd = ["docgen.bat", "--no-include-sdk", "--serve", path] assets/syntaxes/02_Extra/Dart/lib/sdk.py:177: return self.get_bin_tool('pub', '.bat') assets/syntaxes/02_Extra/Dart/lib/sdk.py:183: return self.get_bin_tool('dart2js', '.bat') assets/syntaxes/02_Extra/Dart/lib/sdk.py:189: return self.get_bin_tool('dartanalyzer', '.bat') assets/syntaxes/02_Extra/Dart/lib/sdk.py:195: return self.get_bin_tool('docgen', '.bat') assets/syntaxes/02_Extra/Dart/lib/sdk.py:247: self.path = SDK().get_bin_tool('dartfmt', '.bat') assets/syntaxes/02_Extra/Dart/sublime_plugin_lib/path.py:142: Useful to add .exe to @original, .bat, etc if ST is running on Windows. assets/syntaxes/02_Extra/Dart/sublime_plugin_lib/path.py:186: """ Useful to add .exe, .bat, etc. to @original if ST is running on assets/syntaxes/02_Extra/Dart/Support/Dart.sublime-build:19: "cmd": ["dart2js.bat", "--minify", "-o$file.js", "$file"] assets/syntaxes/02_Extra/Dart/Support/Dart - Pubspec.sublime-build:21: "cmd": ["pub.bat", "upgrade"] assets/syntaxes/02_Extra/Dart/Support/Dart - Pubspec.sublime-build:36: "cmd": ["pub.bat", "version"] assets/syntaxes/02_Extra/LESS/Syntaxes/LESS.sublime-syntax:1709: - match: '\bat\b' assets/syntaxes/02_Extra/Email/README.md:15::mouse: Using [bat](https://github.com/sharkdp/bat) *(bat is a cat clone with syntax highlighting and Git integration)* assets/syntaxes/02_Extra/Email/README.md:16:![bat](https://raw.githubusercontent.com/mariozaizar/email.sublime-syntax/master/demo/bat.png) assets/syntaxes/02_Extra/Email/link_bat.sh:3:# We use bat to verify the sintax. bat is a cat clone with syntax highlighting assets/syntaxes/02_Extra/Email/link_bat.sh:4:# and Git integration. bat uses syntect library for syntax highlighting which assets/syntaxes/02_Extra/Email/link_bat.sh:7:# https://github.com/sharkdp/bat assets/syntaxes/02_Extra/Email/link_bat.sh:9:bat --version || brew install bat # Mac OS only assets/syntaxes/02_Extra/Email/link_bat.sh:11:BAT_PATH=$(bat --config-dir) assets/syntaxes/02_Extra/Email/link_bat.sh:13:mkdir -p "$BAT_PATH/syntaxes" assets/syntaxes/02_Extra/Email/link_bat.sh:14:mkdir -p "$BAT_PATH/themes" assets/syntaxes/02_Extra/Email/link_bat.sh:16:INSTALL_PATH=${BAT_PATH}/syntaxes assets/syntaxes/02_Extra/Email/link_bat.sh:19:bat cache --build assets/syntaxes/02_Extra/Email/link_bat.sh:20:bat --list-languages | grep "Email" assets/syntaxes/02_Extra/Email/link_bat.sh:22:bat demo/email.eml assets/syntaxes/02_Extra/TypeScript.sublime-syntax:2446: |AudioNode|AudioParam|BatteryManager|BeforeUnloadEvent|BiquadFilterNode|Blob|BufferSource|ByteString|CSS|CSSConditionRule assets/syntaxes/02_Extra/HTML (Twig)/Preferences/Indentation.tmPreferences:22: ^\s*\{%-?\s(end(?:autoescape|block|embed|filter|for|if|macro|raw|sandbox|set|spaceless|trans|verbatim)|(else))(?:(?!%\}).)*\s-?%\} assets/syntaxes/02_Extra/HTML (Twig)/Preferences/Indentation.tmPreferences:36: ^\s*\{%-?\s(autoescape|block|embed|filter|for|if|else|macro|raw|sandbox|set|spaceless|trans|verbatim)(?:(?!%\}).)*\s-?%\}(?!.*\{%-?\send\1) assets/syntaxes/02_Extra/HTML (Twig)/Preferences/Folding.tmPreferences:16: |\{%\s+(autoescape|block|embed|filter|for|if|macro|raw|sandbox|set|spaceless|trans|verbatim) assets/syntaxes/02_Extra/HTML (Twig)/Preferences/Folding.tmPreferences:23: |\{%\s+end(autoescape|block|embed|filter|for|if|macro|raw|sandbox|set|spaceless|trans|verbatim) assets/syntaxes/02_Extra/HTML (Twig)/Snippets/verbatim.tmSnippet:6: {% verbatim %} assets/syntaxes/02_Extra/HTML (Twig)/Snippets/verbatim.tmSnippet:8:{% endverbatim %} assets/syntaxes/02_Extra/HTML (Twig)/Snippets/verbatim.tmSnippet:10: verbatim assets/syntaxes/02_Extra/HTML (Twig)/Snippets/verbatim.tmSnippet:14: verbatim assets/syntaxes/02_Extra/HTML (Twig)/Syntaxes/HTML (Twig).tmLanguage:1374: (?<=\s)((?:end)?(?:autoescape|block|embed|filter|for|if|macro|raw|sandbox|set|spaceless|trans|verbatim)|as|do|else|elseif|extends|flush|from|ignore missing|import|include|only|use|with)(?=\s) assets/syntaxes/02_Extra/HTML (Twig)/Syntaxes/HTML (Twig).tmLanguage:1590: (?<=(?:[a-zA-Z0-9_\x{7f}-\x{ff}\]\)\'\"]\|)|\{%\sfilter\s)(batch|convert_encoding|date|date_modify|default|e(?:scape)?|format|join|merge|number_format|replace|round|slice|split|trim)(\() assets/syntaxes/02_Extra/requirementstxt/LICENSE:5: Everyone is permitted to copy and distribute verbatim copies assets/syntaxes/02_Extra/requirementstxt/LICENSE:195: 4. Conveying Verbatim Copies. assets/syntaxes/02_Extra/requirementstxt/LICENSE:197: You may convey verbatim copies of the Program's source code as you assets/syntaxes/01_Packages/Batch File/Symbol List.tmPreferences:7: source.dosbatch entity.name.label - meta.function-call assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:4:name: Batch File assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:6: - bat assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:8:scope: source.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:31: scope: keyword.control.statement.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:34: 1: keyword.control.statement.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:35: 2: punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:36: 3: keyword.control.flow.return.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:37: 4: meta.function-call.dosbatch variable.function.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:40: 1: keyword.control.conditional.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:41: 2: keyword.operator.logical.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:42: 3: keyword.other.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:44: scope: keyword.control.conditional.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:46: scope: keyword.control.repeat.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:50: scope: keyword.command.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:60: scope: keyword.command.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:64: scope: keyword.command.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:74: 1: punctuation.definition.string.begin.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:75: 2: variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:76: 3: keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:78: - meta_scope: string.quoted.double.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:80: scope: punctuation.definition.string.end.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:88: 1: variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:89: 2: keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:91: - meta_content_scope: string.unquoted.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:96: scope: punctuation.definition.string.begin.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:98: - meta_scope: string.quoted.double.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:101: scope: punctuation.definition.string.end.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:108: scope: variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:112: - meta_content_scope: meta.expression.set.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:120: 1: variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:121: 2: keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:123: - meta_scope: meta.prompt.set.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:132: scope: comment.line.ignored.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:135: - meta_content_scope: string.unquoted.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:145: scope: punctuation.section.group.begin.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:148: scope: punctuation.definition.string.begin.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:153: - meta_scope: meta.group.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:155: scope: punctuation.section.group.end.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:158: scope: punctuation.definition.string.begin.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:164: scope: keyword.operator.assignment.augmented.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:167: 1: constant.character.escape.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:168: 2: keyword.operator.assignment.augmented.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:170: scope: keyword.operator.arithmetic.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:173: 1: constant.character.escape.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:174: 2: keyword.operator.arithmetic.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:176: scope: keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:180: scope: keyword.operator.assignment.augmented.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:182: scope: keyword.operator.arithmetic.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:186: - meta_scope: string.quoted.double.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:190: scope: punctuation.definition.string.end.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:193: scope: punctuation.section.group.begin.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:195: - meta_scope: meta.group.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:202: - meta_scope: meta.group.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:204: scope: punctuation.section.group.end.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:207: scope: punctuation.definition.string.end.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:214: - meta_scope: string.quoted.double.dosbatch meta.group.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:216: scope: punctuation.section.group.begin.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:219: scope: punctuation.section.group.end.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:227: scope: keyword.operator.logical.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:233: scope: variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:238: scope: variable.parameter.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:240: 1: punctuation.definition.variable.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:242: scope: variable.language.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:244: 1: punctuation.definition.variable.begin.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:245: 2: punctuation.definition.variable.end.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:252: scope: punctuation.definition.variable.begin.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:254: - meta_scope: variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:257: 1: punctuation.definition.variable.end.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:261: scope: punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:263: - meta_content_scope: meta.variable.substring.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:269: scope: punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:271: - meta_content_scope: meta.variable.substitution.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:276: scope: punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:282: scope: string.unquoted.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:287: scope: punctuation.definition.variable.begin.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:289: - meta_scope: variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:292: 1: punctuation.definition.variable.end.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:296: scope: punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:298: - meta_content_scope: meta.variable.substring.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:304: scope: punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:306: - meta_content_scope: meta.variable.substitution.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:312: scope: punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:318: scope: string.unquoted.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:322: scope: string.unquoted.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:326: scope: constant.numeric.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:331: scope: punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:335: scope: constant.numeric.integer.hexadecimal.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:337: 1: punctuation.definition.numeric.hexadecimal.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:339: scope: constant.numeric.integer.octal.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:341: 1: punctuation.definition.numeric.octal.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:343: scope: constant.numeric.integer.decimal.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:347: scope: constant.language.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:351: scope: keyword.operator.at.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:353: scope: keyword.operator.comparison.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:355: scope: keyword.operator.logical.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:357: scope: keyword.operator.conditional.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:359: scope: keyword.operator.pipe.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:361: scope: keyword.operator.redirection.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:366: 1: punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:367: 2: entity.name.label.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:372: 1: keyword.operator.conditional.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:375: scope: comment.line.rem.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:378: scope: punctuation.definition.comment.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:380: - meta_scope: comment.line.colon.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:386: scope: keyword.command.rem.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:390: - meta_content_scope: comment.line.rem.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:392: scope: comment.line.rem.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:395: scope: invalid.illegal.unexpected-character.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:399: scope: punctuation.definition.string.begin.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:401: - meta_scope: string.quoted.double.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:404: 1: punctuation.definition.string.end.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:405: 2: invalid.illegal.newline.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:412: scope: punctuation.section.group.begin.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:414: - meta_scope: meta.group.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:416: scope: punctuation.section.group.end.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:419: scope: punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/Batch File.sublime-syntax:424: scope: constant.character.escape.dosbatch assets/syntaxes/01_Packages/Batch File/Comments.tmPreferences:7: source.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:1::: SYNTAX TEST "Packages/Batch File/Batch File.sublime-syntax" assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:4::: ^^^ keyword.command.rem.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:5::: ^^^^^^^^^^^^^^^^ comment.line.rem.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:6::: ^ invalid.illegal.unexpected-character.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:7::: ^ invalid.illegal.unexpected-character.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:8::: ^ invalid.illegal.unexpected-character.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:12::: ^^^^^^^^^^^^^ - comment.line.rem.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:19::: ^^ punctuation.definition.comment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:20::: ^^^^^^^^^^ comment.line.colon.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:23::: ^^ punctuation.definition.comment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:26::: ^^ punctuation.definition.comment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:29::: ^^ punctuation.definition.comment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:32::: ^^ punctuation.definition.comment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:35::: ^^ punctuation.definition.comment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:46::: ^ keyword.operator.conditional.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:47::: ^^ punctuation.definition.comment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:48::: ^^^^^^^^^^^^ comment.line.colon.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:51:::^^ punctuation.definition.comment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:52:::^^^^^^^^^^^^^^^^^^^^^^ comment.line.colon.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:55::: ^ punctuation.definition.string.begin.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:56::: ^^^^^ string.quoted.double.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:57::: ^ punctuation.definition.string.end.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:60::: ^ invalid.illegal.newline.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:63::: ^ keyword.operator.at.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:66::: ^ - keyword.operator.at.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:69::: ^^^^ keyword.control.statement.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:70::: ^ punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:71::: ^^^ keyword.control.flow.return.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:74::: ^^^^ keyword.control.statement.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:75::: ^ punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:76::: ^^^ meta.function-call.dosbatch variable.function.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:79::: ^^^^ keyword.control.statement.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:80::: ^ punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:81::: ^^^ meta.function-call.dosbatch variable.function.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:85::: ^^^^ keyword.command.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:86::: ^ keyword.operator.redirection.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:89::: ^^ keyword.operator.redirection.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:93::: ^ keyword.operator.redirection.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:94::: ^^ keyword.operator.redirection.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:97::: ^^ keyword.operator.conditional.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:98::: ^^ keyword.operator.conditional.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:99::: ^ keyword.operator.conditional.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:103::: ^^ keyword.control.conditional.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:104::: ^^^ keyword.operator.comparison.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:107::: ^^ keyword.control.conditional.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:108::: ^^^ keyword.operator.logical.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:109::: ^^^ keyword.operator.comparison.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:113::: ^^ keyword.control.conditional.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:114::: ^^^^^^^^^^^^ variable.language.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:115::: ^ punctuation.definition.variable.begin.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:116::: ^ variable.language.dosbatch punctuation.definition.variable.end.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:119::: ^^ keyword.control.conditional.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:120::: ^^ keyword.operator.comparison.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:123::: ^^^ keyword.control.repeat.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:124::: ^ constant.numeric.integer.decimal.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:127::: ^ keyword.operator.pipe.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:130:::^ punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:131::: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ entity.name.label.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:134:::^ punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:135::: ^^^ entity.name.label.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:138::: ^ punctuation.definition.variable.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:139::: ^^ variable.parameter.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:140::: ^ punctuation.definition.variable.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:141::: ^^ variable.parameter.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:142::: ^ punctuation.definition.variable.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:143::: ^^^^^^^^^^^ variable.parameter.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:144::: ^ punctuation.definition.variable.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:145::: ^^^ variable.parameter.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:148::: ^ punctuation.definition.variable.begin.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:149::: ^^^^^^^^^^ variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:150::: ^ punctuation.definition.variable.end.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:151::: ^ punctuation.definition.variable.begin.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:152::: ^^^^^^^^^^ variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:153::: ^ punctuation.definition.variable.end.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:156::: ^^^^^^^^^^^^^^^ variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:157::: ^ punctuation.definition.variable.begin.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:158::: ^ punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:159::: ^^^^^^^^^ meta.variable.substitution.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:160::: ^^^^ string.unquoted.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:161::: ^ punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:162::: ^^^^ string.unquoted.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:163::: ^ punctuation.definition.variable.end.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:164::: ^^^^^^^^^^^^^^^ variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:165::: ^ punctuation.definition.variable.begin.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:166::: ^ punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:167::: ^^^^^^^^^ meta.variable.substitution.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:168::: ^^^^ string.unquoted.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:169::: ^ punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:170::: ^^^^ string.unquoted.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:171::: ^ punctuation.definition.variable.end.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:175::: ^^^^^^^^^^^^^^ variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:176::: ^ punctuation.definition.variable.begin.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:177::: ^^ punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:178::: ^^^^ meta.variable.substring.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:179::: ^ constant.numeric.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:180::: ^ punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:181::: ^^ constant.numeric.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:182::: ^ punctuation.definition.variable.end.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:183::: ^^^^^^^^^^^^^^ variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:184::: ^ punctuation.definition.variable.begin.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:185::: ^^ punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:186::: ^^^^ meta.variable.substring.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:187::: ^ constant.numeric.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:188::: ^ punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:189::: ^^ constant.numeric.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:190::: ^ punctuation.definition.variable.end.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:193::: ^^^^^^^ variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:194::: ^ punctuation.definition.variable.begin.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:195::: ^^ punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:196::: ^^ meta.variable.substring.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:197::: ^^ constant.numeric.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:198::: ^ punctuation.definition.variable.end.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:199::: ^^^^^^^ variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:200::: ^ punctuation.definition.variable.begin.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:201::: ^^ punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:202::: ^^ meta.variable.substring.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:203::: ^^ constant.numeric.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:204::: ^ punctuation.definition.variable.end.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:207::: ^^^^^^^^^^^^^^^^^^^^^ variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:208::: ^ punctuation.definition.variable.begin.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:209::: ^^^^^ meta.variable.substitution.dosbatch variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:210::: ^ meta.variable.substitution.dosbatch punctuation.definition.variable.begin.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:211::: ^ meta.variable.substitution.dosbatch punctuation.definition.variable.end.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:212::: ^ meta.variable.substitution.dosbatch punctuation.definition.variable.begin.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:213::: ^^^^^^^^^^^ meta.variable.substitution.dosbatch variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:214::: ^^^^ meta.variable.substitution.dosbatch meta.variable.substring.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:215::: ^ meta.variable.substitution.dosbatch punctuation.definition.variable.end.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:216::: ^^ meta.variable.substitution.dosbatch constant.numeric.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:217::: ^ punctuation.definition.variable.end.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:220::: ^^^^^^^^^^^^^^^^^^^ variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:221::: ^ punctuation.definition.variable.begin.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:222::: ^ meta.variable.substitution.dosbatch punctuation.definition.variable.begin.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:223::: ^^^^^^^^^^^ meta.variable.substitution.dosbatch variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:224::: ^^^^ meta.variable.substitution.dosbatch meta.variable.substring.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:225::: ^ meta.variable.substitution.dosbatch punctuation.definition.variable.end.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:226::: ^^ meta.variable.substitution.dosbatch constant.numeric.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:227::: ^ punctuation.definition.variable.end.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:230::: ^^^^^^^^^^^^ - variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:231::: ^^^ - keyword.operator.logical.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:234::: ^^^^^^^^^^^^ - variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:235::: ^^^ - keyword.operator.logical.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:239::: ^^^ constant.numeric.integer.octal.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:240::: ^ punctuation.definition.numeric.octal.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:241::: ^^^^ constant.numeric.integer.hexadecimal.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:242::: ^^ punctuation.definition.numeric.hexadecimal.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:243::: ^^ constant.numeric.integer.decimal.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:247::: ^^ constant.character.escape.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:248::: ^^^ constant.character.escape.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:249::: ^^ constant.character.escape.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:253::: ^^^^^^^^^ meta.expression.set.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:254::: ^^^ keyword.operator.assignment.augmented.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:257::: ^^ keyword.operator.assignment.augmented.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:260::: ^^ keyword.operator.assignment.augmented.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:263::: ^^ keyword.operator.assignment.augmented.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:266::: ^^ keyword.operator.assignment.augmented.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:269::: ^^ keyword.operator.assignment.augmented.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:272::: ^^^ keyword.operator.assignment.augmented.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:275::: ^ keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:276::: ^ keyword.operator.logical.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:279::: ^^^^^ meta.group.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:280::: ^ punctuation.section.group.begin.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:281::: ^ punctuation.section.group.end.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:282::: ^ keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:283::: ^ keyword.operator.arithmetic.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:284::: ^ keyword.operator.arithmetic.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:287::: ^ keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:288::: ^ punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:289::: ^ keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:290::: ^ keyword.operator.arithmetic.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:293::: ^ keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:294::: ^^ keyword.operator.arithmetic.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:297::: ^ keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:298::: ^^ keyword.operator.arithmetic.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:301::: ^ keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:302::: ^^ keyword.operator.arithmetic.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:305::: ^ keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:306::: ^ keyword.operator.arithmetic.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:309::: ^ keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:310::: ^ keyword.operator.arithmetic.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:313::: ^ keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:314::: ^ keyword.operator.arithmetic.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:317::: ^^ keyword.operator.assignment.augmented.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:320::: ^ keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:321::: ^ keyword.operator.arithmetic.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:324::: ^ keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:325::: ^ keyword.operator.arithmetic.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:328::: ^ keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:329::: ^ keyword.operator.arithmetic.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:332::: ^ keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:333::: ^ keyword.operator.arithmetic.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:336::: ^ keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:337::: ^ keyword.operator.arithmetic.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:340::: ^^^ keyword.operator.assignment.augmented.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:343::: ^^ keyword.operator.assignment.augmented.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:346::: ^ keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:347::: ^ keyword.operator.arithmetic.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:348::: ^ punctuation.separator.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:349::: ^ keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:350::: ^ keyword.operator.arithmetic.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:436::: ^^^^^^^^^^^ variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:444::: ^^^^^^^^^^^ string.quoted.double.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:445::: ^^ constant.character.escape.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:446::: ^ - constant.character.escape.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:447::: ^^ constant.character.escape.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:448::: ^ - constant.character.escape.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:449::: ^^ constant.character.escape.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:450::: ^ - constant.character.escape.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:454::: ^^^^ - variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:455::: ^^^^^ variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:456::: ^ keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:457::: ^ keyword.operator.redirection.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:459::: ^ punctuation.definition.variable.begin.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:460::: ^^^^^^^ variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:461::: ^ punctuation.definition.variable.end.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:464::: ^^^^ - variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:465::: ^^^^^ variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:466::: ^ keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:467::: ^^^^^^^^^^^^^ meta.prompt.set.dosbatch string.unquoted - variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:468::: ^ - meta.prompt.set.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:470::: ^^^^ - variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:471::: ^^^^^ variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:472::: ^ keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:473::: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.prompt.set.dosbatch string.unquoted - variable.other.readwrite.dosbatch - comment assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:474::: ^ - meta.prompt.set.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:476::: ^^^^ - variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:477::: ^^^^^ variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:478::: ^ keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:479::: ^ - meta.prompt.set.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:493::: ^^^^^^ variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:494::: ^^^^^^ variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:498::: ^^^^ variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:499::: ^ keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:500::: ^ punctuation.definition.string.begin.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:501::: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ string.quoted.double.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:502::: ^^^^^^^^^ variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:503::: ^^ constant.character.escape.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:504::: ^ punctuation.definition.string.end.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:505::: ^^^ string.unquoted.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:508:::^^^^^^ keyword.command.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:510::: ^^^^ - variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:511::: ^^^^^^^ variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:512::: ^ keyword.operator.assignment.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:513::: ^ punctuation.definition.string.begin.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:514::: ^^^^^^^^^^^^^^^^^^^^^^^^^ meta.prompt.set.dosbatch string.quoted assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:515::: ^ punctuation.definition.string.end.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:516::: ^ keyword.operator.conditional.dosbatch - meta.prompt.set.dosbatch - string assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:517::: ^^^^ keyword.command.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:518::: ^^^^^^^^^ variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:520:::^^^^^^ keyword.command.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:542::: ^^^^ - variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:543::: ^^^^^ variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:544::: ^ keyword.operator.assignment.dosbatch - variable.other.readwrite.dosbatch assets/syntaxes/01_Packages/Batch File/syntax_test_batch_file.bat:545::: ^^^^^^^^^^^^^^^^ meta.prompt.set.dosbatch string.quoted - variable.other.readwrite.dosbatch - comment assets/syntaxes/01_Packages/CSS/CSS.sublime-syntax:1257: - match: '\bat\b' assets/syntaxes/01_Packages/C#/tests/syntax_test_Strings.cs:35:var verbatim_singleline = @"foo"; assets/syntaxes/01_Packages/C#/tests/syntax_test_Strings.cs:37:var verbatim_singleline_interpolated_none = $@"foo bar"; assets/syntaxes/01_Packages/C#/tests/syntax_test_Strings.cs:39:var verbatim_singleline_interpolated_yes = $@"foo {bar} foo"; assets/syntaxes/01_Packages/C#/tests/syntax_test_Strings.cs:42:var verbatim_multiline = @"foo bar assets/syntaxes/01_Packages/C#/tests/syntax_test_Strings.cs:45:var verbatim_multiline_interpolated_none = $@"foo bar assets/syntaxes/01_Packages/C#/tests/syntax_test_Strings.cs:48:var verbatim_multiline_interpolated_yes = $@"foo {bar} assets/syntaxes/01_Packages/C#/tests/syntax_test_GeneralStructure.cs:344: case BLBodyBattleLibrary.ContextType.TapUp: assets/syntaxes/01_Packages/C#/tests/syntax_test_Generics.cs:57:string verbatim = @"This is a test "" of a verbatim string literal - C:\User"; assets/syntaxes/01_Packages/C#/tests/syntax_test_c#.cs:35:string verbatim = @"This is a test "" of a verbatim string literal - C:\User"; assets/syntaxes/01_Packages/PHP/PHP.sublime-completions:2082: { "trigger": "mssql_fetch_batch", "contents": "mssql_fetch_batch(${1:result})" }, assets/syntaxes/01_Packages/PHP/PHP Source.sublime-syntax:407: # verbatim and the indexer should find the name in the original source assets/syntaxes/01_Packages/PHP/PHP Source.sublime-syntax:447: # verbatim and the indexer should find the name in the original source assets/syntaxes/01_Packages/PHP/PHP Source.sublime-syntax:2082: mssql_bind | mssql_close | mssql_connect | mssql_data_seek | mssql_execute | mssql_fetch_array | mssql_fetch_assoc | mssql_fetch_batch | assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:29: - include: verbatim assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:311: verbatim: assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:312: - match: '((\\)begin)(\{)\s*((?:[vV]erbatim|alltt)\*?)\s*(\})' assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:321: - meta_scope: meta.environment.verbatim.verbatim.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:322: - meta_content_scope: markup.raw.verbatim.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:541: - meta_scope: meta.environment.verbatim.verb.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:777: - meta_scope: meta.environment.verbatim.lstinline.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:784: - meta_content_scope: meta.environment.verbatim.lstinline.latex markup.raw.verb.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:786: scope: meta.environment.verbatim.lstinline.latex punctuation.definition.group.brace.end.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:792: - meta_content_scope: meta.environment.verbatim.lstinline.latex markup.raw.verb.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:794: scope: meta.environment.verbatim.lstinline.latex punctuation.definition.verb.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:806: - meta_scope: meta.environment.verbatim.lstlisting.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:938: - meta_scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1146: - meta_scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1149: scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1157: embed_scope: meta.environment.verbatim.minted.latex meta.environment.embedded.c.latex source.c.embedded assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1163: scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1171: embed_scope: meta.environment.verbatim.minted.latex meta.environment.embedded.c++.latex source.c++.embedded assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1177: scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1185: embed_scope: meta.environment.verbatim.minted.latex meta.environment.embedded.diff.latex source.diff.embedded assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1191: scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1199: embed_scope: meta.environment.verbatim.minted.latex meta.environment.embedded.go.latex source.go.embedded assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1205: scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1213: embed_scope: meta.environment.verbatim.minted.latex meta.environment.embedded.haskell.latex source.haskell.embedded assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1219: scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1227: embed_scope: meta.environment.verbatim.minted.latex meta.environment.embedded.html.latex text.html.embedded assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1233: scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1241: embed_scope: meta.environment.verbatim.minted.latex meta.environment.embedded.java.latex source.java.embedded assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1247: scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1255: embed_scope: meta.environment.verbatim.minted.latex meta.environment.embedded.js.latex source.js.embedded assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1261: scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1269: embed_scope: meta.environment.verbatim.minted.latex meta.environment.embedded.json.latex source.json.embedded assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1275: scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1283: embed_scope: meta.environment.verbatim.minted.latex meta.environment.embedded.latex.latex text.tex.latex.embedded assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1289: scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1297: embed_scope: meta.environment.verbatim.minted.latex meta.environment.embedded.lisp.latex source.lisp.embedded assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1303: scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1311: embed_scope: meta.environment.verbatim.minted.latex meta.environment.embedded.lua.latex source.lua.embedded assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1317: scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1325: embed_scope: meta.environment.verbatim.minted.latex meta.environment.embedded.objc.latex source.objc.embedded assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1331: scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1339: embed_scope: meta.environment.verbatim.minted.latex meta.environment.embedded.objc++.latex source.objc++.embedded assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1345: scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1353: embed_scope: meta.environment.verbatim.minted.latex meta.environment.embedded.perl.latex source.perl.embedded assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1359: scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1367: embed_scope: meta.environment.verbatim.minted.latex meta.environment.embedded.php.latex source.php.embedded assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1373: scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1381: embed_scope: meta.environment.verbatim.minted.latex meta.environment.embedded.python.latex source.python.embedded assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1387: scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1395: embed_scope: meta.environment.verbatim.minted.latex meta.environment.embedded.r.latex source.r.embedded assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1401: scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1409: embed_scope: meta.environment.verbatim.minted.latex meta.environment.embedded.ruby.latex source.ruby.embedded assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1415: scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1423: embed_scope: meta.environment.verbatim.minted.latex meta.environment.embedded.shell.latex source.shell.embedded assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1429: scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1437: embed_scope: meta.environment.verbatim.minted.latex meta.environment.embedded.sql.latex source.sql.embedded assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1443: scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1451: embed_scope: meta.environment.verbatim.minted.latex meta.environment.embedded.xml.latex text.xml.embedded assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1457: scope: meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/LaTeX.sublime-syntax:1465: embed_scope: meta.environment.verbatim.minted.latex meta.environment.embedded.yaml.latex source.yaml.embedded assets/syntaxes/01_Packages/LaTeX/syntax_test_latex.tex:261:% VERBATIM assets/syntaxes/01_Packages/LaTeX/syntax_test_latex.tex:267:% ^ meta.environment.verbatim.verb.latex assets/syntaxes/01_Packages/LaTeX/syntax_test_latex.tex:271:% ^ meta.environment.verbatim.verb.latex assets/syntaxes/01_Packages/LaTeX/syntax_test_latex.tex:274:% ^^^^^^^^^^^^^^ meta.environment.verbatim.verb.latex assets/syntaxes/01_Packages/LaTeX/syntax_test_latex.tex:277:% <- - meta.environment.verbatim.verb.latex assets/syntaxes/01_Packages/LaTeX/syntax_test_latex.tex:279:\begin{verbatim} assets/syntaxes/01_Packages/LaTeX/syntax_test_latex.tex:282:The \emph{verbatim} environment sets everything in verbatim. assets/syntaxes/01_Packages/LaTeX/syntax_test_latex.tex:283:% <- meta.environment.verbatim.verbatim.latex assets/syntaxes/01_Packages/LaTeX/syntax_test_latex.tex:284:% ^ markup.raw.verbatim.latex assets/syntaxes/01_Packages/LaTeX/syntax_test_latex.tex:290:\end{verbatim} assets/syntaxes/01_Packages/LaTeX/syntax_test_latex.tex:397:% <- meta.environment.verbatim.lstlisting.latex assets/syntaxes/01_Packages/LaTeX/syntax_test_latex.tex:407:% <- meta.environment.verbatim.lstlisting.latex assets/syntaxes/01_Packages/LaTeX/syntax_test_latex.tex:415:% <- meta.environment.verbatim.lstlisting.latex assets/syntaxes/01_Packages/LaTeX/syntax_test_latex.tex:423:% ^^^^^^^^^^^^^^^^^^^^^ meta.environment.verbatim.lstinline.latex assets/syntaxes/01_Packages/LaTeX/syntax_test_latex.tex:428:% ^ - meta.environment.verbatim.lstinline.latex assets/syntaxes/01_Packages/LaTeX/syntax_test_latex.tex:431:% ^^^^^^^^^^^^^^^^^^^^^ meta.environment.verbatim.lstinline.latex assets/syntaxes/01_Packages/LaTeX/syntax_test_latex.tex:433:% ^ - meta.environment.verbatim.lstinline.latex assets/syntaxes/01_Packages/LaTeX/syntax_test_latex.tex:443:% <- meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/syntax_test_latex.tex:451:% ^ meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/syntax_test_latex.tex:459:% ^ meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/LaTeX/syntax_test_latex.tex:464:% ^ meta.environment.verbatim.minted.latex assets/syntaxes/01_Packages/Java/Ant.sublime-build:10: "cmd": ["ant.bat"] assets/syntaxes/01_Packages/Matlab/Matlab.sublime-syntax:325: - match: \b(zerom|zero22pi|zdatam-ui|zdatam|wrapToPi|wrapTo360|wrapTo2Pi|wrapTo180|worldmap|worldfilewrite|worldfileread|westof|vmap0ui|vmap0rhead|vmap0read|vmap0data|vinvtran|viewshed|vfwdtran|vec2mtx|utmzoneui|utmzone|utmgeoid|usgsdems|usgsdem|usgs24kdem|usamap|updategeostruct|unwrapMultipart|unitstr|unitsratio|undotrim|undoclip|uimaptbx|trimdata|trimcart|trackui|trackg|track2|track1|track|toRadians|toDegrees|tissot|timezone|timedim|time2str|tightmap|tigerp|tigermif|tgrline|textm|tbase|tagm-ui|tagm|symbolm|surfm|surflsrm|surflm|surfdist|surfacem|str2angle|stem3m|stdm|stdist|spzerom|spcread|smoothlong|sm2rad|sm2nm|sm2km|sm2deg|sizem|showm-ui|showm|showaxes|shapewrite|shaperead|shapeinfo|shaderel|setpostn|setm|setltln|seedm|sectorg|sec2hr|sec2hms|sec2hm|sdtsinfo|sdtsdemread|scxsc|scirclui|scircleg|scircle2|scircle1|scatterm|scaleruler|satbath|rsphere|roundn|rotatetext|rotatem|rootlayr|rhxrh|restack|resizem|removeExtraNanSeparators|refvec2mat|refmat2vec|reducem|reckon|readmtx|readfk5|readfields|rcurve|rad2sm|rad2nm|rad2km|rad2dms|rad2dm|rad2deg|quiverm|quiver3m|qrydata|putpole|projlist|projinv|projfwd|project|previewmap|polyxpoly|polysplit|polymerge|polyjoin|polycut|polybool|poly2fv|poly2cw|poly2ccw|polcmap|plotm|plot3m|plabel|pixcenters|pix2map|pix2latlon|pcolorm|patchm|patchesm|parallelui|paperscale|panzoom|originui|org2pol|onem|npi2pi|northarrow|nm2sm|nm2rad|nm2km|nm2deg|newpole|neworig|navfix|nanm|nanclip|namem|n2ecc|mobjects|mlayers|mlabelzero22pi|mlabel|minvtran|minaxis|mfwdtran|meshm|meshlsrm|meshgrat|meridianfwd|meridianarc|meanm|mdistort|mat2hms|mat2dms|mapview|maptrims|maptrimp|maptriml|maptrim|maptool|mapshow|maps|mapprofile|mapoutline|maplist|mapbbox|map2pix|makesymbolspec|makerefmat|makemapped|makedbfspec|makeattribspec|majaxis|lv2ecef|ltln2val|los2|linem|linecirc|limitm|lightmui|lightm|legs|lcolorbar|latlon2pix|kmlwrite|km2sm|km2rad|km2nm|km2deg|ispolycw|ismapped|ismap|isShapeMultipart|intrplon|intrplat|interpm|inputm|ind2rgb8|imbedm|hr2sec|hr2hms|hr2hm|hms2sec|hms2mat|hms2hr|hms2hm|histr|hista|hidem-ui|hidem|handlem-ui|handlem|gtopo30s|gtopo30|gtextm|gshhs|grn2eqa|gridm|grid2image|grepfields|gradientm|globedems|globedem|getworldfilename|getseeds|getm|geotiffread|geotiffinfo|geotiff2mstruct|geoshow|geoloc2grid|geodetic2geocentricLat|geodetic2ecef|geocentric2geodeticLat|gcxsc|gcxgc|gcwaypts|gcpmap|gcm|gc2sc|fromRadians|fromDegrees|framem|flatearthpoly|flat2ecc|fipsname|findm|filterm|fillm|fill3m|extractm|extractfield|etopo5|etopo|eqa2grn|epsm|encodem|ellipse1|elevation|egm96geoid|ecef2lv|ecef2geodetic|ecc2n|ecc2flat|eastof|dteds|dted|driftvel|driftcorr|dreckon|dms2rad|dms2mat|dms2dm|dms2degrees|dms2deg|dm2degrees|distortcalc|distdim|distance|dist2str|displaym|departure|demdataui|demcmap|degrees2dms|degrees2dm|deg2sm|deg2rad|deg2nm|deg2km|deg2dms|deg2dm|defaultm|dcwrhead|dcwread|dcwgaz|dcwdata|daspectm|crossfix|convertlat|contourm|contourfm|contourcmap|contour3m|cometm|comet3m|combntns|colorui|colorm|cmapui|clrmenu|closePolygonParts|clmo-ui|clmo|clma|clipdata|clegendm|clabelm|circcirc|changem|cart2grn|camupm|camtargm|camposm|bufferm|azimuth|axesscale|axesmui|axesm|axes2ecc|avhrrlambert|avhrrgoode|areaquad|areamat|areaint|arcgridread|antipode|angledim|angl2str|almanac)\b assets/syntaxes/01_Packages/RestructuredText/reStructuredText.sublime-syntax:41: comment: verbatim blocks assets/syntaxes/01_Packages/RestructuredText/syntax_test_restructuredtext.rst:95:Verbatim tests assets/syntaxes/01_Packages/RestructuredText/syntax_test_restructuredtext.rst:100: Verbatim assets/syntaxes/01_Packages/RestructuredText/syntax_test_restructuredtext.rst:105: Verbatim assets/syntaxes/01_Packages/RestructuredText/syntax_test_restructuredtext.rst:112: Verbatim assets/syntaxes/01_Packages/RestructuredText/syntax_test_restructuredtext.rst:114: Also Verbatim assets/syntaxes/01_Packages/RestructuredText/syntax_test_restructuredtext.rst:119: Verbatim assets/syntaxes/01_Packages/RestructuredText/syntax_test_restructuredtext.rst:121: Also Verbatim assets/syntaxes/01_Packages/RestructuredText/syntax_test_restructuredtext.rst:127: Verbatim assets/syntaxes/01_Packages/RestructuredText/syntax_test_restructuredtext.rst:129:Not verbatim assets/syntaxes/01_Packages/Go/Indents/GoIndent.tmPreferences:4:batch-reindent real-world code without wrecking it. As such, these rules are assets/syntaxes/01_Packages/Go/Indents/GoIndent.tmPreferences:5:optimized for convenience while typing, not for batch reindentation. assets/syntaxes/01_Packages/YAML/YAML.sublime-syntax:64: c_ns_tag_property: |- # c-verbatim-tag | c-ns-shorthand-tag | c-non-specific-tag assets/manual/bat.1.in:113:\fB-P\fR. To disable the pager permanently, set BAT_PAGER to an empty string. To control assets/manual/bat.1.in:118:Determine which pager is used. This option will override the PAGER and BAT_PAGER assets/manual/bat.1.in:134:export the BAT_THEME environment variable (e.g.: export BAT_THEME="..."). assets/manual/bat.1.in:146:export the BAT_STYLE environment variable (e.g.: export BAT_STYLE=".."). Possible assets/manual/bat.1.in:194:Alternatively, you can use the BAT_CONFIG_PATH environment variable to point {{PROJECT_EXECUTABLE}} to a non-default assets/manual/bat.1.in:235:\fBhttps://github.com/sharkdp/bat\fR assets/completions/bat.bash.in:5:_bat() { assets/completions/bat.bash.in:88:} && complete -F _bat {{PROJECT_EXECUTABLE}} assets/completions/_bat.ps1.in:64: [CompletionResult]::new('--config-dir', 'config-dir', [CompletionResultType]::ParameterName, 'Show bat''s configuration directory.') assets/completions/_bat.ps1.in:65: [CompletionResult]::new('--cache-dir', 'cache-dir', [CompletionResultType]::ParameterName, 'Show bat''s cache directory.') assets/completions/bat.zsh.in:49: '(: --config-dir)'--config-dir'[Show bat'"'"'s configuration directory]' assets/completions/bat.zsh.in:52: '(: --cache-dir)'--cache-dir'[Show bat'"'"'s cache directory]' assets/create.sh:43:bat cache --clear assets/create.sh:56:bat cache --build --blank --source="$ASSET_DIR" --target="$ASSET_DIR" assets/metadata.yaml:2:bat_version: 0.18.3 tests/integration_tests.rs:34:fn bat_raw_command_with_config() -> Command { tests/integration_tests.rs:35: let mut cmd = Command::cargo_bin("bat").unwrap(); tests/integration_tests.rs:37: cmd.env_remove("BAT_CACHE_PATH"); tests/integration_tests.rs:38: cmd.env_remove("BAT_CONFIG_DIR"); tests/integration_tests.rs:39: cmd.env_remove("BAT_CONFIG_PATH"); tests/integration_tests.rs:40: cmd.env_remove("BAT_OPTS"); tests/integration_tests.rs:41: cmd.env_remove("BAT_PAGER"); tests/integration_tests.rs:42: cmd.env_remove("BAT_STYLE"); tests/integration_tests.rs:43: cmd.env_remove("BAT_TABS"); tests/integration_tests.rs:44: cmd.env_remove("BAT_THEME"); tests/integration_tests.rs:51:fn bat_raw_command() -> Command { tests/integration_tests.rs:52: let mut cmd = bat_raw_command_with_config(); tests/integration_tests.rs:57:fn bat_with_config() -> assert_cmd::Command { tests/integration_tests.rs:58: assert_cmd::Command::from_std(bat_raw_command_with_config()) tests/integration_tests.rs:61:fn bat() -> assert_cmd::Command { tests/integration_tests.rs:62: assert_cmd::Command::from_std(bat_raw_command()) tests/integration_tests.rs:67: bat() tests/integration_tests.rs:77: bat() tests/integration_tests.rs:86: bat() tests/integration_tests.rs:96: bat() tests/integration_tests.rs:108: bat() tests/integration_tests.rs:118: bat() tests/integration_tests.rs:128: bat() tests/integration_tests.rs:138: bat() tests/integration_tests.rs:149: bat() tests/integration_tests.rs:160: bat() tests/integration_tests.rs:170: bat() tests/integration_tests.rs:181: bat() tests/integration_tests.rs:192: bat() tests/integration_tests.rs:202: bat() tests/integration_tests.rs:212: bat() tests/integration_tests.rs:222: bat() tests/integration_tests.rs:245: let res = bat_raw_command() tests/integration_tests.rs:261: let res = bat_raw_command() tests/integration_tests.rs:277: let res = bat_raw_command() tests/integration_tests.rs:293: let res = bat_raw_command() tests/integration_tests.rs:307: // To simulate bat getting started from the shell, a process is created with stdin and stdout tests/integration_tests.rs:308: // as the slave end of a pseudo terminal. Although both point to the same "file", bat should tests/integration_tests.rs:316: let mut child = bat_raw_command() tests/integration_tests.rs:349: bat() tests/integration_tests.rs:372: bat() tests/integration_tests.rs:395: bat() tests/integration_tests.rs:418: bat() tests/integration_tests.rs:441: bat() tests/integration_tests.rs:464: bat() tests/integration_tests.rs:487: bat() tests/integration_tests.rs:510: bat().arg("non-existing-file").assert().failure(); tests/integration_tests.rs:515: bat().arg("sub_directory").assert().failure(); tests/integration_tests.rs:520: bat() tests/integration_tests.rs:530: bat() tests/integration_tests.rs:541: bat() tests/integration_tests.rs:543: .env("BAT_PAGER", "echo pager-output") tests/integration_tests.rs:553: bat() tests/integration_tests.rs:555: .env("BAT_PAGER", "") tests/integration_tests.rs:564:fn env_var_pager_value_bat() { tests/integration_tests.rs:565: bat() tests/integration_tests.rs:566: .env("PAGER", "bat") tests/integration_tests.rs:575:fn env_var_bat_pager_value_bat() { tests/integration_tests.rs:576: bat() tests/integration_tests.rs:577: .env("BAT_PAGER", "bat") tests/integration_tests.rs:582: .stderr(predicate::str::contains("bat as a pager is disallowed")); tests/integration_tests.rs:586:fn pager_value_bat() { tests/integration_tests.rs:587: bat() tests/integration_tests.rs:588: .arg("--pager=bat") tests/integration_tests.rs:593: .stderr(predicate::str::contains("bat as a pager is disallowed")); tests/integration_tests.rs:603: bat() tests/integration_tests.rs:613:/// If the bat-specific BAT_PAGER is used, obey the wish of the user tests/integration_tests.rs:617:fn pager_most_from_bat_pager_env_var() { tests/integration_tests.rs:619: bat() tests/integration_tests.rs:620: .env("BAT_PAGER", mocked_pagers::from("most")) tests/integration_tests.rs:629:/// Same reasoning with --pager as with BAT_PAGER tests/integration_tests.rs:634: bat() tests/integration_tests.rs:649: bat() tests/integration_tests.rs:664: bat() tests/integration_tests.rs:676: bat() tests/integration_tests.rs:687: bat() tests/integration_tests.rs:699: bat() tests/integration_tests.rs:700: .env("BAT_PAGER", "mismatched-quotes 'a") tests/integration_tests.rs:710: bat() tests/integration_tests.rs:714: .stdout(predicate::str::contains("BAT_PAGER=")) tests/integration_tests.rs:720: bat_with_config() tests/integration_tests.rs:721: .env("BAT_CONFIG_PATH", "bat.conf") tests/integration_tests.rs:725: .stdout("bat.conf\n"); tests/integration_tests.rs:727: bat_with_config() tests/integration_tests.rs:728: .env("BAT_CONFIG_PATH", "not-existing.conf") tests/integration_tests.rs:740: // Create the file with bat tests/integration_tests.rs:741: bat_with_config() tests/integration_tests.rs:742: .env("BAT_CONFIG_PATH", tmp_config_path.to_str().unwrap()) tests/integration_tests.rs:756:fn config_location_from_bat_config_dir_variable() { tests/integration_tests.rs:757: bat_with_config() tests/integration_tests.rs:758: .env("BAT_CONFIG_DIR", "conf/") tests/integration_tests.rs:767: bat_with_config() tests/integration_tests.rs:768: .env("BAT_CONFIG_PATH", "bat.conf") tests/integration_tests.rs:778: bat() tests/integration_tests.rs:789: bat_with_config() tests/integration_tests.rs:799: bat_with_config() tests/integration_tests.rs:810: bat_with_config() tests/integration_tests.rs:820: bat_with_config().arg("cach").assert().failure(); tests/integration_tests.rs:827: bat() tests/integration_tests.rs:836: bat_with_config() tests/integration_tests.rs:878: bat() tests/integration_tests.rs:898: bat() tests/integration_tests.rs:910: bat() tests/integration_tests.rs:922: bat() tests/integration_tests.rs:936: bat() tests/integration_tests.rs:950: bat() tests/integration_tests.rs:966: bat_with_config() tests/integration_tests.rs:979: bat() tests/integration_tests.rs:995: bat() tests/integration_tests.rs:1008: bat() tests/integration_tests.rs:1020: bat() tests/integration_tests.rs:1040: bat() tests/integration_tests.rs:1057: .stderr("\x1b[33m[bat warning]\x1b[0m: Style 'rule' is a subset of style 'grid', 'rule' will not be visible.\n"); tests/integration_tests.rs:1077: bat() tests/integration_tests.rs:1093: bat() tests/integration_tests.rs:1105: let cmd_for_file = bat() tests/integration_tests.rs:1114: let cmd_for_stdin = bat() tests/integration_tests.rs:1134: bat() tests/integration_tests.rs:1147: bat() tests/integration_tests.rs:1157: bat() tests/integration_tests.rs:1169: bat() tests/integration_tests.rs:1181: bat() tests/integration_tests.rs:1193: bat() tests/integration_tests.rs:1204:// Regression test for https://github.com/sharkdp/bat/issues/299 tests/integration_tests.rs:1207: bat() tests/integration_tests.rs:1231: bat() tests/integration_tests.rs:1240: bat() tests/integration_tests.rs:1250: bat() tests/examples/regression_tests/issue_985.js:3:# bat --map-syntax '*.js:Markdown' --file-name 'issue_985.js' < issue_985.js tests/examples/regression_tests/issue_985.js:4:# bat --map-syntax '*.js:Markdown' --file-name 'issue_985.js' issue_985.js tests/utils/mocked_pagers.rs:16:/// On Windows: 'most' -> 'most.bat' tests/utils/mocked_pagers.rs:19: format!("{}.bat", base) tests/benchmarks/benchmark-results/syntax-highlighting-speed-miniz.c.md:3:| `bat … miniz.c` | 96.2 ± 1.9 | 92.6 | 99.6 | 1.00 | tests/benchmarks/benchmark-results/syntax-highlighting-speed-jquery.js.md:3:| `bat … jquery.js` | 692.4 ± 5.6 | 684.2 | 701.8 | 1.00 | tests/benchmarks/benchmark-results/syntax-highlighting-speed-test_multiarray.py.json:4: "command": "bat … test_multiarray.py", tests/benchmarks/benchmark-results/syntax-highlighting-speed-jquery.js.json:4: "command": "bat … jquery.js", tests/benchmarks/benchmark-results/plain-text-speed.json:4: "command": "bat … --language=txt test_multiarray.py", tests/benchmarks/benchmark-results/syntax-highlighting-speed-test_multiarray.ansi-sequences.txt.md:3:| `bat … test_multiarray.ansi-sequences.txt` | 125.3 ± 5.6 | 119.3 | 140.4 | 1.00 | tests/benchmarks/benchmark-results/syntax-highlighting-speed-test_multiarray.py.md:3:| `bat … test_multiarray.py` | 924.7 ± 4.4 | 917.1 | 932.3 | 1.00 | tests/benchmarks/benchmark-results/report.md:1:## `bat` benchmark results tests/benchmarks/benchmark-results/report.md:7:| `bat` | 6.9 ± 0.6 | 5.6 | 9.2 | 1.00 | tests/benchmarks/benchmark-results/report.md:13:| `bat … --language=txt test_multiarray.py` | 10.4 ± 0.6 | 9.0 | 12.1 | 1.00 | tests/benchmarks/benchmark-results/report.md:19:| `bat … jquery.js` | 692.4 ± 5.6 | 684.2 | 701.8 | 1.00 | tests/benchmarks/benchmark-results/report.md:25:| `bat … miniz.c` | 96.2 ± 1.9 | 92.6 | 99.6 | 1.00 | tests/benchmarks/benchmark-results/report.md:31:| `bat … test_multiarray.ansi-sequences.txt` | 125.3 ± 5.6 | 119.3 | 140.4 | 1.00 | tests/benchmarks/benchmark-results/report.md:37:| `bat … test_multiarray.py` | 924.7 ± 4.4 | 917.1 | 932.3 | 1.00 | tests/benchmarks/benchmark-results/startup-time.md:3:| `bat` | 6.9 ± 0.6 | 5.6 | 9.2 | 1.00 | tests/benchmarks/benchmark-results/syntax-highlighting-speed-miniz.c.json:4: "command": "bat … miniz.c", tests/benchmarks/benchmark-results/plain-text-speed.md:3:| `bat … --language=txt test_multiarray.py` | 10.4 ± 0.6 | 9.0 | 12.1 | 1.00 | tests/benchmarks/benchmark-results/syntax-highlighting-speed-jquery-3.3.1.js.json:4: "command": "/home/shark/.cargo-target/release/bat --style=full --color=always --paging=never test-src/jquery-3.3.1.js", tests/benchmarks/benchmark-results/syntax-highlighting-speed-test_multiarray.highlighted.txt.json:4: "command": "bat … test_multiarray.highlighted.txt", tests/benchmarks/benchmark-results/syntax-highlighting-speed-test_multiarray.ansi-sequences.txt.json:4: "command": "bat … test_multiarray.ansi-sequences.txt", tests/benchmarks/benchmark-results/syntax-highlighting-speed-jquery-3.3.1.min.js.json:4: "command": "/home/shark/.cargo-target/release/bat --style=full --color=always --paging=never test-src/jquery-3.3.1.min.js", tests/benchmarks/benchmark-results/ansi-sequence-forwarding.json:4: "command": "bat … test_multiarray.highlighted.txt", tests/benchmarks/benchmark-results/startup-time.json:4: "command": "bat", tests/benchmarks/run-benchmarks.sh:33:unset BAT_CACHE_PATH tests/benchmarks/run-benchmarks.sh:34:unset BAT_CONFIG_DIR tests/benchmarks/run-benchmarks.sh:35:unset BAT_CONFIG_PATH tests/benchmarks/run-benchmarks.sh:36:unset BAT_OPTS tests/benchmarks/run-benchmarks.sh:37:unset BAT_PAGER tests/benchmarks/run-benchmarks.sh:38:unset BAT_STYLE tests/benchmarks/run-benchmarks.sh:39:unset BAT_TABS tests/benchmarks/run-benchmarks.sh:40:unset BAT_THEME tests/benchmarks/run-benchmarks.sh:50:TARGET_RELEASE="${TARGET_DIR}/release/bat" tests/benchmarks/run-benchmarks.sh:55:BAT='' tests/benchmarks/run-benchmarks.sh:58: --system) BAT="bat" ;; tests/benchmarks/run-benchmarks.sh:59: --release) BAT="$TARGET_RELEASE" ;; tests/benchmarks/run-benchmarks.sh:60: --bat=*) BAT="${arg:6}" ;; tests/benchmarks/run-benchmarks.sh:64:if [[ -z "$BAT" ]]; then tests/benchmarks/run-benchmarks.sh:65: echo "A build of 'bat' must be specified for benchmarking." tests/benchmarks/run-benchmarks.sh:66: echo "You can use '--system', '--release' or '--bat=path/to/bat'." tests/benchmarks/run-benchmarks.sh:70:if ! command -v "$BAT" &>/dev/null; then tests/benchmarks/run-benchmarks.sh:71: echo "Could not find the build of bat to benchmark ($BAT)." tests/benchmarks/run-benchmarks.sh:72: case "$BAT" in tests/benchmarks/run-benchmarks.sh:73: "bat") echo "Make you sure to symlink 'batcat' as 'bat'." ;; tests/benchmarks/run-benchmarks.sh:83:echo "## \`bat\` benchmark results" >> "$REPORT" tests/benchmarks/run-benchmarks.sh:88: "$(printf "%q" "$BAT") --no-config" \ tests/benchmarks/run-benchmarks.sh:89: --command-name "bat" \ tests/benchmarks/run-benchmarks.sh:98: "$(printf "%q" "$BAT") --no-config --language=txt --style=plain test-src/test_multiarray.py" \ tests/benchmarks/run-benchmarks.sh:99: --command-name 'bat … --language=txt test_multiarray.py' \ tests/benchmarks/run-benchmarks.sh:111: "$(printf "%q" "$BAT") --no-config --style=full --color=always '$SRC'" \ tests/benchmarks/run-benchmarks.sh:112: --command-name "bat … ${filename}" \ tests/snapshots/generate_snapshots.py:35:def build_bat(): tests/snapshots/generate_snapshots.py:36: print("building bat") tests/snapshots/generate_snapshots.py:55:build_bat() tests/syntax-tests/create_highlighted_versions.py:11:BAT_OPTIONS = [ tests/syntax-tests/create_highlighted_versions.py:23: "bat_options", tests/syntax-tests/create_highlighted_versions.py:28: options = BAT_OPTIONS.copy() tests/syntax-tests/create_highlighted_versions.py:31: options_file = path.join(source_dirpath, "bat_options") tests/syntax-tests/create_highlighted_versions.py:44: env.pop("BAT_CACHE_PATH", None) tests/syntax-tests/create_highlighted_versions.py:45: env.pop("BAT_CONFIG_DIR", None) tests/syntax-tests/create_highlighted_versions.py:46: env.pop("BAT_CONFIG_PATH", None) tests/syntax-tests/create_highlighted_versions.py:47: env.pop("BAT_OPTS", None) tests/syntax-tests/create_highlighted_versions.py:48: env.pop("BAT_PAGER", None) tests/syntax-tests/create_highlighted_versions.py:49: env.pop("BAT_STYLE", None) tests/syntax-tests/create_highlighted_versions.py:50: env.pop("BAT_TABS", None) tests/syntax-tests/create_highlighted_versions.py:51: env.pop("BAT_THEME", None) tests/syntax-tests/create_highlighted_versions.py:62: bat_output = subprocess.check_output( tests/syntax-tests/create_highlighted_versions.py:63: ["bat"] + get_options(source) + [source], tests/syntax-tests/create_highlighted_versions.py:74: output_file.write(bat_output) tests/syntax-tests/create_highlighted_versions.py:98: "=== bat stdout:\n{}".format(err.stdout.decode("utf-8")), tests/syntax-tests/create_highlighted_versions.py:102: "=== bat stderr:\n{}".format(err.stderr.decode("utf-8")), tests/syntax-tests/create_highlighted_versions.py:108: "Error: Could not execute 'bat'. Please make sure that the executable " tests/syntax-tests/BatTestCustomAssets.sublime-syntax:4:name: BatTestCustomAssets tests/syntax-tests/BatTestCustomAssets.sublime-syntax:6: - battestcustomassets tests/syntax-tests/BatTestCustomAssets.sublime-syntax:7:scope: source.battestcustomassets tests/syntax-tests/BatTestCustomAssets.sublime-syntax:9:# This syntax is used to test if custom assets work with bat. tests/syntax-tests/BatTestCustomAssets.sublime-syntax:20: 1: keyword.other.battestcustomassets-key tests/syntax-tests/BatTestCustomAssets.sublime-syntax:21: 2: string.other.battestcustomassets-value tests/syntax-tests/highlighted/C/test.c:21: /* This C program was written to help bat tests/syntax-tests/highlighted/QML/BatSyntaxTest.qml:19: service: "org.bat.service" tests/syntax-tests/highlighted/QML/BatSyntaxTest.qml:41: text: qsTr("Install Bat.") tests/syntax-tests/highlighted/Diff/82e7786e747b1fcfac1f963ae6415a22ec9caae1.diff:16: ## `bat` as a library tests/syntax-tests/highlighted/Diff/82e7786e747b1fcfac1f963ae6415a22ec9caae1.diff:17:diff --git a/src/bin/bat/app.rs b/src/bin/bat/app.rs tests/syntax-tests/highlighted/Diff/82e7786e747b1fcfac1f963ae6415a22ec9caae1.diff:19:--- a/src/bin/bat/app.rs tests/syntax-tests/highlighted/Diff/82e7786e747b1fcfac1f963ae6415a22ec9caae1.diff:20:+++ b/src/bin/bat/app.rs tests/syntax-tests/highlighted/Diff/82e7786e747b1fcfac1f963ae6415a22ec9caae1.diff:23: use bat::{ tests/syntax-tests/highlighted/Diff/82e7786e747b1fcfac1f963ae6415a22ec9caae1.diff:61:diff --git a/src/bin/bat/clap_app.rs b/src/bin/bat/clap_app.rs tests/syntax-tests/highlighted/Diff/82e7786e747b1fcfac1f963ae6415a22ec9caae1.diff:63:--- a/src/bin/bat/clap_app.rs tests/syntax-tests/highlighted/Diff/82e7786e747b1fcfac1f963ae6415a22ec9caae1.diff:64:+++ b/src/bin/bat/clap_app.rs tests/syntax-tests/highlighted/Diff/82e7786e747b1fcfac1f963ae6415a22ec9caae1.diff:66: data to bat from STDIN when bat does not otherwise know \ tests/syntax-tests/highlighted/Git Attributes/example.gitattributes:10:*.bat text eol=crlf tests/syntax-tests/highlighted/SSH Config/ssh_config:8: BatchMode no tests/syntax-tests/highlighted/Manpage/bat-0.16.man:1:BAT(1) General Commands Manual BAT(1) tests/syntax-tests/highlighted/Manpage/bat-0.16.man:4: bat - a cat(1) clone with syntax highlighting and Git integration. tests/syntax-tests/highlighted/Manpage/bat-0.16.man:7: bat [OPTIONS] [FILE]... tests/syntax-tests/highlighted/Manpage/bat-0.16.man:9: bat cache [CACHE-OPTIONS] [--build|--clear] tests/syntax-tests/highlighted/Manpage/bat-0.16.man:12: bat prints the syntax-highlighted content of a collection of FILEs to tests/syntax-tests/highlighted/Manpage/bat-0.16.man:16: bat supports a large number of programming and markup languages. It tests/syntax-tests/highlighted/Manpage/bat-0.16.man:18: git index. bat automatically pipes its output through a pager (by de‐ tests/syntax-tests/highlighted/Manpage/bat-0.16.man:21: Whenever the output of bat goes to a non-interactive terminal, i.e. tests/syntax-tests/highlighted/Manpage/bat-0.16.man:22: when the output is piped into another process or into a file, bat will tests/syntax-tests/highlighted/Manpage/bat-0.16.man:112: if the output of bat is piped to another program, but you want tests/syntax-tests/highlighted/Manpage/bat-0.16.man:119: set BAT_PAGER to an empty string. To control which pager is tests/syntax-tests/highlighted/Manpage/bat-0.16.man:126: PAGER and BAT_PAGER environment variables. The default pager is tests/syntax-tests/highlighted/Manpage/bat-0.16.man:143: BAT_THEME environment variable (e.g.: export BAT_THEME="..."). tests/syntax-tests/highlighted/Manpage/bat-0.16.man:156: to the configuration file or export the BAT_STYLE environment tests/syntax-tests/highlighted/Manpage/bat-0.16.man:157: variable (e.g.: export BAT_STYLE=".."). Possible values: *auto*, tests/syntax-tests/highlighted/Manpage/bat-0.16.man:202: bat can also be customized with a configuration file. The location of tests/syntax-tests/highlighted/Manpage/bat-0.16.man:206: bat --config-file tests/syntax-tests/highlighted/Manpage/bat-0.16.man:208: Alternatively, you can use the BAT_CONFIG_PATH environment variable to tests/syntax-tests/highlighted/Manpage/bat-0.16.man:209: point bat to a non-default location of the configuration file. tests/syntax-tests/highlighted/Manpage/bat-0.16.man:212: bat supports Sublime Text .sublime-syntax language files, and can be tests/syntax-tests/highlighted/Manpage/bat-0.16.man:214: do this, add the .sublime-snytax language files to `$(bat --config- tests/syntax-tests/highlighted/Manpage/bat-0.16.man:215: dir)/syntaxes` and run `bat cache --build`. tests/syntax-tests/highlighted/Manpage/bat-0.16.man:219: mkdir -p "$(bat --config-dir)/syntaxes" tests/syntax-tests/highlighted/Manpage/bat-0.16.man:220: cd "$(bat --config-dir)/syntaxes" tests/syntax-tests/highlighted/Manpage/bat-0.16.man:227: bat cache --build tests/syntax-tests/highlighted/Manpage/bat-0.16.man:229: Once the cache is built, the new language will be visible in `bat tests/syntax-tests/highlighted/Manpage/bat-0.16.man:232: cache with `bat cache --clear`. tests/syntax-tests/highlighted/Manpage/bat-0.16.man:235: Similarly to custom languages, bat supports Sublime Text .tmTheme tests/syntax-tests/highlighted/Manpage/bat-0.16.man:236: themes. These can be installed to `$(bat --config-dir)/themes`, and tests/syntax-tests/highlighted/Manpage/bat-0.16.man:237: are added to the cache with `bat cache --build`. tests/syntax-tests/highlighted/Manpage/bat-0.16.man:240: For more information and up-to-date documentation, visit the bat repo: tests/syntax-tests/highlighted/Manpage/bat-0.16.man:241: https://github.com/sharkdp/bat tests/syntax-tests/highlighted/Manpage/bat-0.16.man:243: BAT(1) tests/syntax-tests/highlighted/Svelte/App.svelte:30: // This block is a regression test for a bat panic when a LiveScript syntax definition is missing tests/syntax-tests/highlighted/VimL/source.vim:77:" Error case from issue #1604 (https://github.com/sharkdp/bat/issues/1064) tests/syntax-tests/highlighted/Java/test.java:3:/* This Java program was submiited to help bat tests/syntax-tests/highlighted/Sass/example.sass:46: background-image: url("https://github.com/sharkdp/bat/raw/master/doc/logo-header.svg") tests/syntax-tests/highlighted/HTML/test.html:5: <title>Bat Syntax Test tests/syntax-tests/highlighted/Cpp/test.cpp:6:/* This C program was submitted to help bat tests/syntax-tests/highlighted/Crystal/test.cr:1:# An example file to test Crystal syntax highlighting in bat tests/syntax-tests/highlighted/Crystal/test.cr:58:greeter = Greeter.new("bat") tests/syntax-tests/highlighted/GLSL/test.glsl:38: // This GLSL code serves the purpose of bat syntax highlighting tests tests/syntax-tests/highlighted/CMake/CMakeLists.txt:3:project(hello-bat VERSION 0.0.1 LANGUAGES C) tests/syntax-tests/highlighted/CMake/CMakeLists.txt:8:add_executable(hello-bat SOURCES) tests/syntax-tests/highlighted/CMake/CMakeLists.txt:11:target_link_libraries(hello-bat assimp) tests/syntax-tests/highlighted/SCSS/example.scss:48: background-image: url("https://github.com/sharkdp/bat/raw/master/doc/logo-header.svg"); tests/syntax-tests/highlighted/TOML/Cargo.toml:5:homepage = "https://github.com/sharkdp/bat" tests/syntax-tests/highlighted/TOML/Cargo.toml:7:name = "bat" tests/syntax-tests/highlighted/TOML/Cargo.toml:9:repository = "https://github.com/sharkdp/bat" tests/syntax-tests/highlighted/TOML/Cargo.toml:20:# Feature required for bat the application. Should be disabled when depending on tests/syntax-tests/highlighted/TOML/Cargo.toml:21:# bat as a library. tests/syntax-tests/highlighted/Erlang/bat_erlang.erl:1:-module(bat_erlang). tests/syntax-tests/highlighted/Bash/batgrep.sh:3:# bat-extras | Copyright (C) 2020 eth-p and contributors | MIT License tests/syntax-tests/highlighted/Bash/batgrep.sh:5:# Repository: https://github.com/eth-p/bat-extras tests/syntax-tests/highlighted/Bash/batgrep.sh:6:# Issues: https://github.com/eth-p/bat-extras/issues tests/syntax-tests/highlighted/Bash/batgrep.sh:37:printc "%{YELLOW}[%s warning]%{CLEAR}: $1%{CLEAR}\n" "batgrep" "${@:2}" 1>&2 tests/syntax-tests/highlighted/Bash/batgrep.sh:40:printc "%{RED}[%s error]%{CLEAR}: $1%{CLEAR}\n" "batgrep" "${@:2}" 1>&2 tests/syntax-tests/highlighted/Bash/batgrep.sh:116:if [[ -n ${BAT_PAGER+x} ]];then tests/syntax-tests/highlighted/Bash/batgrep.sh:117:SCRIPT_PAGER_CMD=($BAT_PAGER) tests/syntax-tests/highlighted/Bash/batgrep.sh:169:printc "%{RED}%s: '%s' requires a value%{CLEAR}\n" "batgrep" "$ARG" tests/syntax-tests/highlighted/Bash/batgrep.sh:185:*)printc "%{RED}%s: '--color' expects value of 'auto', 'always', or 'never'%{CLEAR}\n" "batgrep" tests/syntax-tests/highlighted/Bash/batgrep.sh:217:*)printc "%{RED}%s: '--paging' expects value of 'auto', 'always', or 'never'%{CLEAR}\n" "batgrep" tests/syntax-tests/highlighted/Bash/batgrep.sh:238:"batgrep" \ tests/syntax-tests/highlighted/Bash/batgrep.sh:241:"https://github.com/eth-p/bat-extras" tests/syntax-tests/highlighted/Bash/batgrep.sh:269:bat_version(){ tests/syntax-tests/highlighted/Bash/batgrep.sh:270:"bat" --version|cut -d ' ' -f 2 tests/syntax-tests/highlighted/Bash/batgrep.sh:319:BAT_ARGS=() tests/syntax-tests/highlighted/Bash/batgrep.sh:330:BAT_STYLE="header,numbers" tests/syntax-tests/highlighted/Bash/batgrep.sh:331:if version_compare "$(bat_version)" -gt "0.12";then tests/syntax-tests/highlighted/Bash/batgrep.sh:419:printc "%{RED}%s: unknown option '%s'%{CLEAR}\n" "batgrep" "$OPT" 1>&2 tests/syntax-tests/highlighted/Bash/batgrep.sh:444:BAT_ARGS+=("--color=always") tests/syntax-tests/highlighted/Bash/batgrep.sh:446:BAT_ARGS+=("--color=never") tests/syntax-tests/highlighted/Bash/batgrep.sh:462:'the pager was explicitly disabled by $BAT_PAGER or the' \ tests/syntax-tests/highlighted/Bash/batgrep.sh:482:"bat" "${BAT_ARGS[@]}" \ tests/syntax-tests/highlighted/Bash/batgrep.sh:485:--style="$BAT_STYLE$OPT_SNIP" \ tests/syntax-tests/highlighted/Bash/simple.sh:15: | cat | bat - | cat tests/syntax-tests/highlighted/Bash/simple.sh:20:if command -v bat &> /dev/null; then tests/syntax-tests/highlighted/Rust/output.rs:39: let pager_from_env = match (env::var("BAT_PAGER"), env::var("PAGER")) { tests/syntax-tests/highlighted/Rust/output.rs:40: (Ok(bat_pager), _) => Some(bat_pager), tests/syntax-tests/highlighted/Rust/output.rs:43: // ANSI color sequences printed by bat. If someone has set PAGER="less -F", we tests/syntax-tests/highlighted/Rust/output.rs:46: // We only do this for PAGER (as it is not specific to 'bat'), not for BAT_PAGER tests/syntax-tests/highlighted/Rust/output.rs:47: // or bats '--pager' command line option. tests/syntax-tests/highlighted/Rust/output.rs:71: if pager_path.file_stem() == Some(&OsString::from("bat")) { tests/syntax-tests/source/C/test.c:21: /* This C program was written to help bat tests/syntax-tests/source/QML/BatSyntaxTest.qml:19: service: "org.bat.service" tests/syntax-tests/source/QML/BatSyntaxTest.qml:41: text: qsTr("Install Bat.") tests/syntax-tests/source/Diff/82e7786e747b1fcfac1f963ae6415a22ec9caae1.diff:16: ## `bat` as a library tests/syntax-tests/source/Diff/82e7786e747b1fcfac1f963ae6415a22ec9caae1.diff:17:diff --git a/src/bin/bat/app.rs b/src/bin/bat/app.rs tests/syntax-tests/source/Diff/82e7786e747b1fcfac1f963ae6415a22ec9caae1.diff:19:--- a/src/bin/bat/app.rs tests/syntax-tests/source/Diff/82e7786e747b1fcfac1f963ae6415a22ec9caae1.diff:20:+++ b/src/bin/bat/app.rs tests/syntax-tests/source/Diff/82e7786e747b1fcfac1f963ae6415a22ec9caae1.diff:23: use bat::{ tests/syntax-tests/source/Diff/82e7786e747b1fcfac1f963ae6415a22ec9caae1.diff:61:diff --git a/src/bin/bat/clap_app.rs b/src/bin/bat/clap_app.rs tests/syntax-tests/source/Diff/82e7786e747b1fcfac1f963ae6415a22ec9caae1.diff:63:--- a/src/bin/bat/clap_app.rs tests/syntax-tests/source/Diff/82e7786e747b1fcfac1f963ae6415a22ec9caae1.diff:64:+++ b/src/bin/bat/clap_app.rs tests/syntax-tests/source/Diff/82e7786e747b1fcfac1f963ae6415a22ec9caae1.diff:66: data to bat from STDIN when bat does not otherwise know \ tests/syntax-tests/source/Git Attributes/example.gitattributes:10:*.bat text eol=crlf tests/syntax-tests/source/SSH Config/ssh_config:8: BatchMode no tests/syntax-tests/source/Manpage/bat-0.16.man:1:BAT(1) General Commands Manual BAT(1) tests/syntax-tests/source/Manpage/bat-0.16.man:4: bat - a cat(1) clone with syntax highlighting and Git integration. tests/syntax-tests/source/Manpage/bat-0.16.man:7: bat [OPTIONS] [FILE]... tests/syntax-tests/source/Manpage/bat-0.16.man:9: bat cache [CACHE-OPTIONS] [--build|--clear] tests/syntax-tests/source/Manpage/bat-0.16.man:12: bat prints the syntax-highlighted content of a collection of FILEs to tests/syntax-tests/source/Manpage/bat-0.16.man:16: bat supports a large number of programming and markup languages. It tests/syntax-tests/source/Manpage/bat-0.16.man:18: git index. bat automatically pipes its output through a pager (by de‐ tests/syntax-tests/source/Manpage/bat-0.16.man:21: Whenever the output of bat goes to a non-interactive terminal, i.e. tests/syntax-tests/source/Manpage/bat-0.16.man:22: when the output is piped into another process or into a file, bat will tests/syntax-tests/source/Manpage/bat-0.16.man:112: if the output of bat is piped to another program, but you want tests/syntax-tests/source/Manpage/bat-0.16.man:119: set BAT_PAGER to an empty string. To control which pager is tests/syntax-tests/source/Manpage/bat-0.16.man:126: PAGER and BAT_PAGER environment variables. The default pager is tests/syntax-tests/source/Manpage/bat-0.16.man:143: BAT_THEME environment variable (e.g.: export BAT_THEME="..."). tests/syntax-tests/source/Manpage/bat-0.16.man:156: to the configuration file or export the BAT_STYLE environment tests/syntax-tests/source/Manpage/bat-0.16.man:157: variable (e.g.: export BAT_STYLE=".."). Possible values: *auto*, tests/syntax-tests/source/Manpage/bat-0.16.man:202: bat can also be customized with a configuration file. The location of tests/syntax-tests/source/Manpage/bat-0.16.man:206: bat --config-file tests/syntax-tests/source/Manpage/bat-0.16.man:208: Alternatively, you can use the BAT_CONFIG_PATH environment variable to tests/syntax-tests/source/Manpage/bat-0.16.man:209: point bat to a non-default location of the configuration file. tests/syntax-tests/source/Manpage/bat-0.16.man:212: bat supports Sublime Text .sublime-syntax language files, and can be tests/syntax-tests/source/Manpage/bat-0.16.man:214: do this, add the .sublime-snytax language files to `$(bat --config- tests/syntax-tests/source/Manpage/bat-0.16.man:215: dir)/syntaxes` and run `bat cache --build`. tests/syntax-tests/source/Manpage/bat-0.16.man:219: mkdir -p "$(bat --config-dir)/syntaxes" tests/syntax-tests/source/Manpage/bat-0.16.man:220: cd "$(bat --config-dir)/syntaxes" tests/syntax-tests/source/Manpage/bat-0.16.man:227: bat cache --build tests/syntax-tests/source/Manpage/bat-0.16.man:229: Once the cache is built, the new language will be visible in `bat tests/syntax-tests/source/Manpage/bat-0.16.man:232: cache with `bat cache --clear`. tests/syntax-tests/source/Manpage/bat-0.16.man:235: Similarly to custom languages, bat supports Sublime Text .tmTheme tests/syntax-tests/source/Manpage/bat-0.16.man:236: themes. These can be installed to `$(bat --config-dir)/themes`, and tests/syntax-tests/source/Manpage/bat-0.16.man:237: are added to the cache with `bat cache --build`. tests/syntax-tests/source/Manpage/bat-0.16.man:240: For more information and up-to-date documentation, visit the bat repo: tests/syntax-tests/source/Manpage/bat-0.16.man:241: https://github.com/sharkdp/bat tests/syntax-tests/source/Manpage/bat-0.16.man:243: BAT(1) tests/syntax-tests/source/Svelte/App.svelte:30: // This block is a regression test for a bat panic when a LiveScript syntax definition is missing tests/syntax-tests/source/VimL/source.vim:77:" Error case from issue #1604 (https://github.com/sharkdp/bat/issues/1064) tests/syntax-tests/source/Git Config/LICENSE.md:1:The `test.gitconfig` file has been added from https://github.com/sharkdp/bat/pull/1336#issuecomment-715905807. Its "free to use". tests/syntax-tests/source/Java/test.java:3:/* This Java program was submiited to help bat tests/syntax-tests/source/Sass/example.sass:46: background-image: url("https://github.com/sharkdp/bat/raw/master/doc/logo-header.svg") tests/syntax-tests/source/HTML/test.html:5: Bat Syntax Test tests/syntax-tests/source/Cpp/test.cpp:6:/* This C program was submitted to help bat tests/syntax-tests/source/Crystal/test.cr:1:# An example file to test Crystal syntax highlighting in bat tests/syntax-tests/source/Crystal/test.cr:58:greeter = Greeter.new("bat") tests/syntax-tests/source/GLSL/test.glsl:38: // This GLSL code serves the purpose of bat syntax highlighting tests tests/syntax-tests/source/Java Server Page (JSP)/LICENSE.md:216:For the Eclipse JDT Core Batch Compiler (ecj-x.x.x.jar) component and the tests/syntax-tests/source/Java Server Page (JSP)/NOTICE:23:JDT Core Batch Compiler component, which is open source software. tests/syntax-tests/source/CMake/CMakeLists.txt:3:project(hello-bat VERSION 0.0.1 LANGUAGES C) tests/syntax-tests/source/CMake/CMakeLists.txt:8:add_executable(hello-bat SOURCES) tests/syntax-tests/source/CMake/CMakeLists.txt:11:target_link_libraries(hello-bat assimp) tests/syntax-tests/source/SCSS/example.scss:48: background-image: url("https://github.com/sharkdp/bat/raw/master/doc/logo-header.svg"); tests/syntax-tests/source/TOML/Cargo.toml:5:homepage = "https://github.com/sharkdp/bat" tests/syntax-tests/source/TOML/Cargo.toml:7:name = "bat" tests/syntax-tests/source/TOML/Cargo.toml:9:repository = "https://github.com/sharkdp/bat" tests/syntax-tests/source/TOML/Cargo.toml:20:# Feature required for bat the application. Should be disabled when depending on tests/syntax-tests/source/TOML/Cargo.toml:21:# bat as a library. tests/syntax-tests/source/Erlang/bat_erlang.erl:1:-module(bat_erlang). tests/syntax-tests/source/Batch/LICENSE.md:1:The `build.bat` file has been added from https://github.com/Leandros/ClangOnWindows/blob/master/build.bat under the following license: tests/syntax-tests/source/Bash/batgrep.sh:3:# bat-extras | Copyright (C) 2020 eth-p and contributors | MIT License tests/syntax-tests/source/Bash/batgrep.sh:5:# Repository: https://github.com/eth-p/bat-extras tests/syntax-tests/source/Bash/batgrep.sh:6:# Issues: https://github.com/eth-p/bat-extras/issues tests/syntax-tests/source/Bash/batgrep.sh:37:printc "%{YELLOW}[%s warning]%{CLEAR}: $1%{CLEAR}\n" "batgrep" "${@:2}" 1>&2 tests/syntax-tests/source/Bash/batgrep.sh:40:printc "%{RED}[%s error]%{CLEAR}: $1%{CLEAR}\n" "batgrep" "${@:2}" 1>&2 tests/syntax-tests/source/Bash/batgrep.sh:116:if [[ -n ${BAT_PAGER+x} ]];then tests/syntax-tests/source/Bash/batgrep.sh:117:SCRIPT_PAGER_CMD=($BAT_PAGER) tests/syntax-tests/source/Bash/batgrep.sh:169:printc "%{RED}%s: '%s' requires a value%{CLEAR}\n" "batgrep" "$ARG" tests/syntax-tests/source/Bash/batgrep.sh:185:*)printc "%{RED}%s: '--color' expects value of 'auto', 'always', or 'never'%{CLEAR}\n" "batgrep" tests/syntax-tests/source/Bash/batgrep.sh:217:*)printc "%{RED}%s: '--paging' expects value of 'auto', 'always', or 'never'%{CLEAR}\n" "batgrep" tests/syntax-tests/source/Bash/batgrep.sh:238:"batgrep" \ tests/syntax-tests/source/Bash/batgrep.sh:241:"https://github.com/eth-p/bat-extras" tests/syntax-tests/source/Bash/batgrep.sh:269:bat_version(){ tests/syntax-tests/source/Bash/batgrep.sh:270:"bat" --version|cut -d ' ' -f 2 tests/syntax-tests/source/Bash/batgrep.sh:319:BAT_ARGS=() tests/syntax-tests/source/Bash/batgrep.sh:330:BAT_STYLE="header,numbers" tests/syntax-tests/source/Bash/batgrep.sh:331:if version_compare "$(bat_version)" -gt "0.12";then tests/syntax-tests/source/Bash/batgrep.sh:419:printc "%{RED}%s: unknown option '%s'%{CLEAR}\n" "batgrep" "$OPT" 1>&2 tests/syntax-tests/source/Bash/batgrep.sh:444:BAT_ARGS+=("--color=always") tests/syntax-tests/source/Bash/batgrep.sh:446:BAT_ARGS+=("--color=never") tests/syntax-tests/source/Bash/batgrep.sh:462:'the pager was explicitly disabled by $BAT_PAGER or the' \ tests/syntax-tests/source/Bash/batgrep.sh:482:"bat" "${BAT_ARGS[@]}" \ tests/syntax-tests/source/Bash/batgrep.sh:485:--style="$BAT_STYLE$OPT_SNIP" \ tests/syntax-tests/source/Bash/simple.sh:15: | cat | bat - | cat tests/syntax-tests/source/Bash/simple.sh:20:if command -v bat &> /dev/null; then tests/syntax-tests/source/Rust/output.rs:39: let pager_from_env = match (env::var("BAT_PAGER"), env::var("PAGER")) { tests/syntax-tests/source/Rust/output.rs:40: (Ok(bat_pager), _) => Some(bat_pager), tests/syntax-tests/source/Rust/output.rs:43: // ANSI color sequences printed by bat. If someone has set PAGER="less -F", we tests/syntax-tests/source/Rust/output.rs:46: // We only do this for PAGER (as it is not specific to 'bat'), not for BAT_PAGER tests/syntax-tests/source/Rust/output.rs:47: // or bats '--pager' command line option. tests/syntax-tests/source/Rust/output.rs:71: if pager_path.file_stem() == Some(&OsString::from("bat")) { tests/syntax-tests/test_custom_assets.sh:6:BAT_CONFIG_DIR=$(mktemp -d) tests/syntax-tests/test_custom_assets.sh:7:export BAT_CONFIG_DIR tests/syntax-tests/test_custom_assets.sh:9:BAT_CACHE_PATH=$(mktemp -d) tests/syntax-tests/test_custom_assets.sh:10:export BAT_CACHE_PATH tests/syntax-tests/test_custom_assets.sh:13:BAT_CONFIG_DIR = ${BAT_CONFIG_DIR} tests/syntax-tests/test_custom_assets.sh:14:BAT_CACHE_PATH = ${BAT_CACHE_PATH} tests/syntax-tests/test_custom_assets.sh:20: "--language=BatTestCustomAssets" tests/syntax-tests/test_custom_assets.sh:21: "tests/syntax-tests/source/BatTestCustomAssets/NoColorsUnlessCustomAssetsAreUsed.battestcustomassets" tests/syntax-tests/test_custom_assets.sh:42:echo_step "TEST: Make sure 'BatTestCustomAssets' is not part of integrated syntaxes" tests/syntax-tests/test_custom_assets.sh:43:bat -f "${custom_syntax_args[@]}" && tests/syntax-tests/test_custom_assets.sh:46:echo_step "PREPARE: Install custom syntax 'BatTestCustomAssets'" tests/syntax-tests/test_custom_assets.sh:47:custom_syntaxes_dir="$(bat --config-dir)/syntaxes" tests/syntax-tests/test_custom_assets.sh:49:cp -v "tests/syntax-tests/BatTestCustomAssets.sublime-syntax" \ tests/syntax-tests/test_custom_assets.sh:50: "${custom_syntaxes_dir}/BatTestCustomAssets.sublime-syntax" tests/syntax-tests/test_custom_assets.sh:52:echo_step "PREPARE: Build custom assets to enable 'BatTestCustomAssets' syntax" tests/syntax-tests/test_custom_assets.sh:53:bat cache --build tests/syntax-tests/test_custom_assets.sh:55:echo_step "TEST: 'BatTestCustomAssets' is a known syntax" tests/syntax-tests/test_custom_assets.sh:56:bat -f "${custom_syntax_args[@]}" || tests/syntax-tests/test_custom_assets.sh:60:bat -f "${integrated_syntax_args[@]}" || tests/syntax-tests/test_custom_assets.sh:63:echo_step "TEST: 'BatTestCustomAssets' is an unknown syntax with --no-custom-assets" tests/syntax-tests/test_custom_assets.sh:64:bat -f --no-custom-assets "${custom_syntax_args[@]}" && tests/syntax-tests/test_custom_assets.sh:67:echo_step "TEST: 'bat cache --clear' removes all files" tests/syntax-tests/test_custom_assets.sh:68:bat cache --clear tests/syntax-tests/test_custom_assets.sh:69:remaining_files=$(ls -A "${BAT_CACHE_PATH}") tests/syntax-tests/test_custom_assets.sh:74:rm -rv "${BAT_CONFIG_DIR}" "${BAT_CACHE_PATH}" tests/assets.rs:1:use bat::assets::HighlightingAssets; tests/no_duplicate_extensions.rs:3:use bat::assets::HighlightingAssets; tests/scripts/find-slow-to-highlight-files.py:3:# This script goes through all languages that are supported by 'bat'. For each tests/scripts/find-slow-to-highlight-files.py:5:# given folder for matching files. It calls 'bat' for each of these files and tests/scripts/find-slow-to-highlight-files.py:8:# execution of 'bat'. tests/scripts/find-slow-to-highlight-files.py:11:# - bat (in the $PATH) tests/scripts/find-slow-to-highlight-files.py:24:# Maximum time we allow `bat` to run tests/scripts/find-slow-to-highlight-files.py:25:BAT_TIMEOUT_SEC = 10 tests/scripts/find-slow-to-highlight-files.py:62: sp.check_output(["bat", "--color=always", path], timeout=BAT_TIMEOUT_SEC) tests/scripts/find-slow-to-highlight-files.py:77: if num_chars < THRESHOLD_SPEED * BAT_TIMEOUT_SEC: tests/scripts/find-slow-to-highlight-files.py:78: print(f" Error: bat timed out on file '{path.decode()}'.") tests/scripts/find-slow-to-highlight-files.py:81: f" Warning: bat timed out on file '{path.decode()} (but the file is large)." tests/scripts/find-slow-to-highlight-files.py:85:def measure_bat_startup_speed(): tests/scripts/find-slow-to-highlight-files.py:90: ["bat", "--color=always", "--language=py"], stdin=sp.PIPE, stdout=sp.PIPE tests/scripts/find-slow-to-highlight-files.py:102: output = sp.check_output(["bat", "--list-languages"]).decode() tests/scripts/find-slow-to-highlight-files.py:113: print("Measuring 'bat' startup speed ... ", flush=True, end="") tests/scripts/find-slow-to-highlight-files.py:114: startup_time = measure_bat_startup_speed() tests/tester.rs:13:pub struct BatTester { tests/tester.rs:17: /// Path to the *bat* executable tests/tester.rs:21:impl BatTester { tests/tester.rs:35: .expect("bat failed"); tests/tester.rs:52:impl Default for BatTester { tests/tester.rs:61: .expect("bat executable directory") tests/tester.rs:64: let exe_name = if cfg!(windows) { "bat.exe" } else { "bat" }; tests/tester.rs:67: BatTester { temp_dir, exe } tests/tester.rs:86: let signature = Signature::now("bat test runner", "bat@test.runner")?; tests/snapshot_tests.rs:3:use crate::tester::BatTester; tests/snapshot_tests.rs:10: let bat_tester = BatTester::default(); tests/snapshot_tests.rs:11: bat_tester.test_snapshot(stringify!($test_name), $style); diagnostics/info.sh:2:_modules=('system' 'bat' 'bat_config' 'bat_wrapper' 'bat_wrapper_function' 'tool') diagnostics/info.sh:10:BAT="bat" diagnostics/info.sh:11:if ! command -v bat &>/dev/null; then diagnostics/info.sh:12: if command -v batcat &> /dev/null; then diagnostics/info.sh:13: BAT="batcat" diagnostics/info.sh:17: "Unable to find a bat executable on your PATH." \ diagnostics/info.sh:18: "Please ensure that 'bat' exists and is not named something else." diagnostics/info.sh:28:_bat_:description() { diagnostics/info.sh:29: _collects "Version information for 'bat'." diagnostics/info.sh:30: _collects "Custom syntaxes and themes for 'bat'." diagnostics/info.sh:33:_bat_config_:description() { diagnostics/info.sh:34: _collects "The environment variables used by 'bat'." diagnostics/info.sh:35: _collects "The 'bat' configuration file." diagnostics/info.sh:38:_bat_wrapper_:description() { diagnostics/info.sh:39: _collects "Any wrapper script used by 'bat'." diagnostics/info.sh:42:_bat_wrapper_function_:description() { diagnostics/info.sh:43: _collects "The wrapper function surrounding 'bat' (if applicable)." diagnostics/info.sh:57:_bat_:run() { diagnostics/info.sh:58: _out "$BAT" --version diagnostics/info.sh:59: _out env | grep '^BAT_\|^PAGER=' diagnostics/info.sh:62: cache_dir="$($BAT --cache-dir)" diagnostics/info.sh:64: _print_command "$BAT" "--list-languages" diagnostics/info.sh:69: _print_command "$BAT" "--list-themes" diagnostics/info.sh:74:_bat_config_:run() { diagnostics/info.sh:75: if [[ -f "$("$BAT" --config-file)" ]]; then diagnostics/info.sh:76: _out_fence cat "$("$BAT" --config-file)" diagnostics/info.sh:80:_bat_wrapper_:run() { diagnostics/info.sh:81: _bat_wrapper_:detect_wrapper() { diagnostics/info.sh:82: local bat="$1" diagnostics/info.sh:83: if file "$(command -v "${bat}")" | grep "text executable" &> /dev/null; then diagnostics/info.sh:84: _out_fence cat "$(command -v "${bat}")" diagnostics/info.sh:88: printf "\nNo wrapper script for '%s'.\n" "${bat}" diagnostics/info.sh:91: _bat_wrapper_:detect_wrapper bat diagnostics/info.sh:92: if [[ "$BAT" != "bat" ]]; then diagnostics/info.sh:93: _bat_wrapper_:detect_wrapper "$BAT" diagnostics/info.sh:97:_bat_wrapper_function_:run() { diagnostics/info.sh:98: _bat_wrapper_function_:detect_wrapper() { diagnostics/info.sh:125: _bat_wrapper_function_:detect_wrapper bat diagnostics/info.sh:126: _bat_wrapper_function_:detect_wrapper cat diagnostics/info.sh:127: if [[ "$BAT" != "bat" ]]; then diagnostics/info.sh:128: _bat_wrapper_function_:detect_wrapper "$BAT" diagnostics/info.sh:180:system and bat configuration. It will give you a small preview of the commands diagnostics/info.sh:201: | sed "s/\"\$BAT\"/$BAT/" 1>&2 diagnostics/info.sh:228:# Tell the user if their executable isn't named "bat". diagnostics/info.sh:229:if [[ "$BAT" != "bat" ]] && [[ "$1" != '-y' ]]; then diagnostics/info.sh:235: printf "The %s executable on your system is named '%s'.\n%s\n" "bat" "$BAT" \ bat-0.24.0/tests/benchmarks/highlighting-speed-src/jquery.js000064400000000000000000010226071046102023000221510ustar 00000000000000/*! * jQuery JavaScript Library v3.3.1 * https://jquery.com/ * * Includes Sizzle.js * https://sizzlejs.com/ * * Copyright JS Foundation and other contributors * Released under the MIT license * https://jquery.org/license * * Date: 2018-01-20T17:24Z */ ( function( global, factory ) { "use strict"; if ( typeof module === "object" && typeof module.exports === "object" ) { // For CommonJS and CommonJS-like environments where a proper `window` // is present, execute the factory and get jQuery. // For environments that do not have a `window` with a `document` // (such as Node.js), expose a factory as module.exports. // This accentuates the need for the creation of a real `window`. // e.g. var jQuery = require("jquery")(window); // See ticket #14549 for more info. module.exports = global.document ? factory( global, true ) : function( w ) { if ( !w.document ) { throw new Error( "jQuery requires a window with a document" ); } return factory( w ); }; } else { factory( global ); } // Pass this if window is not defined yet } )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { // Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 // throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode // arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common // enough that all such attempts are guarded in a try block. "use strict"; var arr = []; var document = window.document; var getProto = Object.getPrototypeOf; var slice = arr.slice; var concat = arr.concat; var push = arr.push; var indexOf = arr.indexOf; var class2type = {}; var toString = class2type.toString; var hasOwn = class2type.hasOwnProperty; var fnToString = hasOwn.toString; var ObjectFunctionString = fnToString.call( Object ); var support = {}; var isFunction = function isFunction( obj ) { // Support: Chrome <=57, Firefox <=52 // In some browsers, typeof returns "function" for HTML elements // (i.e., `typeof document.createElement( "object" ) === "function"`). // We don't want to classify *any* DOM node as a function. return typeof obj === "function" && typeof obj.nodeType !== "number"; }; var isWindow = function isWindow( obj ) { return obj != null && obj === obj.window; }; var preservedScriptAttributes = { type: true, src: true, noModule: true }; function DOMEval( code, doc, node ) { doc = doc || document; var i, script = doc.createElement( "script" ); script.text = code; if ( node ) { for ( i in preservedScriptAttributes ) { if ( node[ i ] ) { script[ i ] = node[ i ]; } } } doc.head.appendChild( script ).parentNode.removeChild( script ); } function toType( obj ) { if ( obj == null ) { return obj + ""; } // Support: Android <=2.3 only (functionish RegExp) return typeof obj === "object" || typeof obj === "function" ? class2type[ toString.call( obj ) ] || "object" : typeof obj; } /* global Symbol */ // Defining this global in .eslintrc.json would create a danger of using the global // unguarded in another place, it seems safer to define global only for this module var version = "3.3.1", // Define a local copy of jQuery jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' // Need init if jQuery is called (just allow error to be thrown if not included) return new jQuery.fn.init( selector, context ); }, // Support: Android <=4.0 only // Make sure we trim BOM and NBSP rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; jQuery.fn = jQuery.prototype = { // The current version of jQuery being used jquery: version, constructor: jQuery, // The default length of a jQuery object is 0 length: 0, toArray: function() { return slice.call( this ); }, // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { // Return all the elements in a clean array if ( num == null ) { return slice.call( this ); } // Return just the one element from the set return num < 0 ? this[ num + this.length ] : this[ num ]; }, // Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems ) { // Build a new jQuery matched element set var ret = jQuery.merge( this.constructor(), elems ); // Add the old object onto the stack (as a reference) ret.prevObject = this; // Return the newly-formed element set return ret; }, // Execute a callback for every element in the matched set. each: function( callback ) { return jQuery.each( this, callback ); }, map: function( callback ) { return this.pushStack( jQuery.map( this, function( elem, i ) { return callback.call( elem, i, elem ); } ) ); }, slice: function() { return this.pushStack( slice.apply( this, arguments ) ); }, first: function() { return this.eq( 0 ); }, last: function() { return this.eq( -1 ); }, eq: function( i ) { var len = this.length, j = +i + ( i < 0 ? len : 0 ); return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); }, end: function() { return this.prevObject || this.constructor(); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, sort: arr.sort, splice: arr.splice }; jQuery.extend = jQuery.fn.extend = function() { var options, name, src, copy, copyIsArray, clone, target = arguments[ 0 ] || {}, i = 1, length = arguments.length, deep = false; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; // Skip the boolean and the target target = arguments[ i ] || {}; i++; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !isFunction( target ) ) { target = {}; } // Extend jQuery itself if only one argument is passed if ( i === length ) { target = this; i--; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( ( options = arguments[ i ] ) != null ) { // Extend the base object for ( name in options ) { src = target[ name ]; copy = options[ name ]; // Prevent never-ending loop if ( target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject( copy ) || ( copyIsArray = Array.isArray( copy ) ) ) ) { if ( copyIsArray ) { copyIsArray = false; clone = src && Array.isArray( src ) ? src : []; } else { clone = src && jQuery.isPlainObject( src ) ? src : {}; } // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; }; jQuery.extend( { // Unique for each copy of jQuery on the page expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), // Assume jQuery is ready without the ready module isReady: true, error: function( msg ) { throw new Error( msg ); }, noop: function() {}, isPlainObject: function( obj ) { var proto, Ctor; // Detect obvious negatives // Use toString instead of jQuery.type to catch host objects if ( !obj || toString.call( obj ) !== "[object Object]" ) { return false; } proto = getProto( obj ); // Objects with no prototype (e.g., `Object.create( null )`) are plain if ( !proto ) { return true; } // Objects with prototype are plain iff they were constructed by a global Object function Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; }, isEmptyObject: function( obj ) { /* eslint-disable no-unused-vars */ // See https://github.com/eslint/eslint/issues/6125 var name; for ( name in obj ) { return false; } return true; }, // Evaluates a script in a global context globalEval: function( code ) { DOMEval( code ); }, each: function( obj, callback ) { var length, i = 0; if ( isArrayLike( obj ) ) { length = obj.length; for ( ; i < length; i++ ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } } else { for ( i in obj ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } } return obj; }, // Support: Android <=4.0 only trim: function( text ) { return text == null ? "" : ( text + "" ).replace( rtrim, "" ); }, // results is for internal usage only makeArray: function( arr, results ) { var ret = results || []; if ( arr != null ) { if ( isArrayLike( Object( arr ) ) ) { jQuery.merge( ret, typeof arr === "string" ? [ arr ] : arr ); } else { push.call( ret, arr ); } } return ret; }, inArray: function( elem, arr, i ) { return arr == null ? -1 : indexOf.call( arr, elem, i ); }, // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit merge: function( first, second ) { var len = +second.length, j = 0, i = first.length; for ( ; j < len; j++ ) { first[ i++ ] = second[ j ]; } first.length = i; return first; }, grep: function( elems, callback, invert ) { var callbackInverse, matches = [], i = 0, length = elems.length, callbackExpect = !invert; // Go through the array, only saving the items // that pass the validator function for ( ; i < length; i++ ) { callbackInverse = !callback( elems[ i ], i ); if ( callbackInverse !== callbackExpect ) { matches.push( elems[ i ] ); } } return matches; }, // arg is for internal usage only map: function( elems, callback, arg ) { var length, value, i = 0, ret = []; // Go through the array, translating each of the items to their new values if ( isArrayLike( elems ) ) { length = elems.length; for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } // Go through every key on the object, } else { for ( i in elems ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } } // Flatten any nested arrays return concat.apply( [], ret ); }, // A global GUID counter for objects guid: 1, // jQuery.support is not used in Core but other projects attach their // properties to it so it needs to exist. support: support } ); if ( typeof Symbol === "function" ) { jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; } // Populate the class2type map jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), function( i, name ) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); } ); function isArrayLike( obj ) { // Support: real iOS 8.2 only (not reproducible in simulator) // `in` check used to prevent JIT error (gh-2145) // hasOwn isn't used here due to false negatives // regarding Nodelist length in IE var length = !!obj && "length" in obj && obj.length, type = toType( obj ); if ( isFunction( obj ) || isWindow( obj ) ) { return false; } return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj; } var Sizzle = /*! * Sizzle CSS Selector Engine v2.3.3 * https://sizzlejs.com/ * * Copyright jQuery Foundation and other contributors * Released under the MIT license * http://jquery.org/license * * Date: 2016-08-08 */ (function( window ) { var i, support, Expr, getText, isXML, tokenize, compile, select, outermostContext, sortInput, hasDuplicate, // Local document vars setDocument, document, docElem, documentIsHTML, rbuggyQSA, rbuggyMatches, matches, contains, // Instance-specific data expando = "sizzle" + 1 * new Date(), preferredDoc = window.document, dirruns = 0, done = 0, classCache = createCache(), tokenCache = createCache(), compilerCache = createCache(), sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; } return 0; }, // Instance methods hasOwn = ({}).hasOwnProperty, arr = [], pop = arr.pop, push_native = arr.push, push = arr.push, slice = arr.slice, // Use a stripped-down indexOf as it's faster than native // https://jsperf.com/thor-indexof-vs-for/5 indexOf = function( list, elem ) { var i = 0, len = list.length; for ( ; i < len; i++ ) { if ( list[i] === elem ) { return i; } } return -1; }, booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", // Regular expressions // http://www.w3.org/TR/css3-selectors/#whitespace whitespace = "[\\x20\\t\\r\\n\\f]", // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + // Operator (capture 2) "*([*^$|!~]?=)" + whitespace + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", pseudos = ":(" + identifier + ")(?:\\((" + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: // 1. quoted (capture 3; capture 4 or capture 5) "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + // 2. simple (capture 6) "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + // 3. anything else (capture 2) ".*" + ")\\)|)", // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter rwhitespace = new RegExp( whitespace + "+", "g" ), rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), rpseudo = new RegExp( pseudos ), ridentifier = new RegExp( "^" + identifier + "$" ), matchExpr = { "ID": new RegExp( "^#(" + identifier + ")" ), "CLASS": new RegExp( "^\\.(" + identifier + ")" ), "TAG": new RegExp( "^(" + identifier + "|[*])" ), "ATTR": new RegExp( "^" + attributes ), "PSEUDO": new RegExp( "^" + pseudos ), "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), // For use in libraries implementing .is() // We use this for POS matching in `select` "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) }, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, rnative = /^[^{]+\{\s*\[native \w/, // Easily-parseable/retrievable ID or TAG or CLASS selectors rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, // CSS escapes // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), funescape = function( _, escaped, escapedWhitespace ) { var high = "0x" + escaped - 0x10000; // NaN means non-codepoint // Support: Firefox<24 // Workaround erroneous numeric interpretation of +"0x" return high !== high || escapedWhitespace ? escaped : high < 0 ? // BMP codepoint String.fromCharCode( high + 0x10000 ) : // Supplemental Plane codepoint (surrogate pair) String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); }, // CSS string/identifier serialization // https://drafts.csswg.org/cssom/#common-serializing-idioms rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, fcssescape = function( ch, asCodePoint ) { if ( asCodePoint ) { // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER if ( ch === "\0" ) { return "\uFFFD"; } // Control characters and (dependent upon position) numbers get escaped as code points return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; } // Other potentially-special ASCII characters get backslash-escaped return "\\" + ch; }, // Used for iframes // See setDocument() // Removing the function wrapper causes a "Permission Denied" // error in IE unloadHandler = function() { setDocument(); }, disabledAncestor = addCombinator( function( elem ) { return elem.disabled === true && ("form" in elem || "label" in elem); }, { dir: "parentNode", next: "legend" } ); // Optimize for push.apply( _, NodeList ) try { push.apply( (arr = slice.call( preferredDoc.childNodes )), preferredDoc.childNodes ); // Support: Android<4.0 // Detect silently failing push.apply arr[ preferredDoc.childNodes.length ].nodeType; } catch ( e ) { push = { apply: arr.length ? // Leverage slice if possible function( target, els ) { push_native.apply( target, slice.call(els) ); } : // Support: IE<9 // Otherwise append directly function( target, els ) { var j = target.length, i = 0; // Can't trust NodeList.length while ( (target[j++] = els[i++]) ) {} target.length = j - 1; } }; } function Sizzle( selector, context, results, seed ) { var m, i, elem, nid, match, groups, newSelector, newContext = context && context.ownerDocument, // nodeType defaults to 9, since context defaults to document nodeType = context ? context.nodeType : 9; results = results || []; // Return early from calls with invalid selector or context if ( typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { return results; } // Try to shortcut find operations (as opposed to filters) in HTML documents if ( !seed ) { if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { setDocument( context ); } context = context || document; if ( documentIsHTML ) { // If the selector is sufficiently simple, try using a "get*By*" DOM method // (excepting DocumentFragment context, where the methods don't exist) if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { // ID selector if ( (m = match[1]) ) { // Document context if ( nodeType === 9 ) { if ( (elem = context.getElementById( m )) ) { // Support: IE, Opera, Webkit // TODO: identify versions // getElementById can match elements by name instead of ID if ( elem.id === m ) { results.push( elem ); return results; } } else { return results; } // Element context } else { // Support: IE, Opera, Webkit // TODO: identify versions // getElementById can match elements by name instead of ID if ( newContext && (elem = newContext.getElementById( m )) && contains( context, elem ) && elem.id === m ) { results.push( elem ); return results; } } // Type selector } else if ( match[2] ) { push.apply( results, context.getElementsByTagName( selector ) ); return results; // Class selector } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { push.apply( results, context.getElementsByClassName( m ) ); return results; } } // Take advantage of querySelectorAll if ( support.qsa && !compilerCache[ selector + " " ] && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { if ( nodeType !== 1 ) { newContext = context; newSelector = selector; // qSA looks outside Element context, which is not what we want // Thanks to Andrew Dupont for this workaround technique // Support: IE <=8 // Exclude object elements } else if ( context.nodeName.toLowerCase() !== "object" ) { // Capture the context ID, setting it first if necessary if ( (nid = context.getAttribute( "id" )) ) { nid = nid.replace( rcssescape, fcssescape ); } else { context.setAttribute( "id", (nid = expando) ); } // Prefix every selector in the list groups = tokenize( selector ); i = groups.length; while ( i-- ) { groups[i] = "#" + nid + " " + toSelector( groups[i] ); } newSelector = groups.join( "," ); // Expand context for sibling selectors newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; } if ( newSelector ) { try { push.apply( results, newContext.querySelectorAll( newSelector ) ); return results; } catch ( qsaError ) { } finally { if ( nid === expando ) { context.removeAttribute( "id" ); } } } } } } // All others return select( selector.replace( rtrim, "$1" ), context, results, seed ); } /** * Create key-value caches of limited size * @returns {function(string, object)} Returns the Object data after storing it on itself with * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) * deleting the oldest entry */ function createCache() { var keys = []; function cache( key, value ) { // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) if ( keys.push( key + " " ) > Expr.cacheLength ) { // Only keep the most recent entries delete cache[ keys.shift() ]; } return (cache[ key + " " ] = value); } return cache; } /** * Mark a function for special use by Sizzle * @param {Function} fn The function to mark */ function markFunction( fn ) { fn[ expando ] = true; return fn; } /** * Support testing using an element * @param {Function} fn Passed the created element and returns a boolean result */ function assert( fn ) { var el = document.createElement("fieldset"); try { return !!fn( el ); } catch (e) { return false; } finally { // Remove from its parent by default if ( el.parentNode ) { el.parentNode.removeChild( el ); } // release memory in IE el = null; } } /** * Adds the same handler for all of the specified attrs * @param {String} attrs Pipe-separated list of attributes * @param {Function} handler The method that will be applied */ function addHandle( attrs, handler ) { var arr = attrs.split("|"), i = arr.length; while ( i-- ) { Expr.attrHandle[ arr[i] ] = handler; } } /** * Checks document order of two siblings * @param {Element} a * @param {Element} b * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b */ function siblingCheck( a, b ) { var cur = b && a, diff = cur && a.nodeType === 1 && b.nodeType === 1 && a.sourceIndex - b.sourceIndex; // Use IE sourceIndex if available on both nodes if ( diff ) { return diff; } // Check if b follows a if ( cur ) { while ( (cur = cur.nextSibling) ) { if ( cur === b ) { return -1; } } } return a ? 1 : -1; } /** * Returns a function to use in pseudos for input types * @param {String} type */ function createInputPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === type; }; } /** * Returns a function to use in pseudos for buttons * @param {String} type */ function createButtonPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && elem.type === type; }; } /** * Returns a function to use in pseudos for :enabled/:disabled * @param {Boolean} disabled true for :disabled; false for :enabled */ function createDisabledPseudo( disabled ) { // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable return function( elem ) { // Only certain elements can match :enabled or :disabled // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled if ( "form" in elem ) { // Check for inherited disabledness on relevant non-disabled elements: // * listed form-associated elements in a disabled fieldset // https://html.spec.whatwg.org/multipage/forms.html#category-listed // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled // * option elements in a disabled optgroup // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled // All such elements have a "form" property. if ( elem.parentNode && elem.disabled === false ) { // Option elements defer to a parent optgroup if present if ( "label" in elem ) { if ( "label" in elem.parentNode ) { return elem.parentNode.disabled === disabled; } else { return elem.disabled === disabled; } } // Support: IE 6 - 11 // Use the isDisabled shortcut property to check for disabled fieldset ancestors return elem.isDisabled === disabled || // Where there is no isDisabled, check manually /* jshint -W018 */ elem.isDisabled !== !disabled && disabledAncestor( elem ) === disabled; } return elem.disabled === disabled; // Try to winnow out elements that can't be disabled before trusting the disabled property. // Some victims get caught in our net (label, legend, menu, track), but it shouldn't // even exist on them, let alone have a boolean value. } else if ( "label" in elem ) { return elem.disabled === disabled; } // Remaining elements are neither :enabled nor :disabled return false; }; } /** * Returns a function to use in pseudos for positionals * @param {Function} fn */ function createPositionalPseudo( fn ) { return markFunction(function( argument ) { argument = +argument; return markFunction(function( seed, matches ) { var j, matchIndexes = fn( [], seed.length, argument ), i = matchIndexes.length; // Match elements found at the specified indexes while ( i-- ) { if ( seed[ (j = matchIndexes[i]) ] ) { seed[j] = !(matches[j] = seed[j]); } } }); }); } /** * Checks a node for validity as a Sizzle context * @param {Element|Object=} context * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value */ function testContext( context ) { return context && typeof context.getElementsByTagName !== "undefined" && context; } // Expose support vars for convenience support = Sizzle.support = {}; /** * Detects XML nodes * @param {Element|Object} elem An element or a document * @returns {Boolean} True iff elem is a non-HTML XML node */ isXML = Sizzle.isXML = function( elem ) { // documentElement is verified for cases where it doesn't yet exist // (such as loading iframes in IE - #4833) var documentElement = elem && (elem.ownerDocument || elem).documentElement; return documentElement ? documentElement.nodeName !== "HTML" : false; }; /** * Sets document-related variables once based on the current document * @param {Element|Object} [doc] An element or document object to use to set the document * @returns {Object} Returns the current document */ setDocument = Sizzle.setDocument = function( node ) { var hasCompare, subWindow, doc = node ? node.ownerDocument || node : preferredDoc; // Return early if doc is invalid or already selected if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { return document; } // Update global variables document = doc; docElem = document.documentElement; documentIsHTML = !isXML( document ); // Support: IE 9-11, Edge // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) if ( preferredDoc !== document && (subWindow = document.defaultView) && subWindow.top !== subWindow ) { // Support: IE 11, Edge if ( subWindow.addEventListener ) { subWindow.addEventListener( "unload", unloadHandler, false ); // Support: IE 9 - 10 only } else if ( subWindow.attachEvent ) { subWindow.attachEvent( "onunload", unloadHandler ); } } /* Attributes ---------------------------------------------------------------------- */ // Support: IE<8 // Verify that getAttribute really returns attributes and not properties // (excepting IE8 booleans) support.attributes = assert(function( el ) { el.className = "i"; return !el.getAttribute("className"); }); /* getElement(s)By* ---------------------------------------------------------------------- */ // Check if getElementsByTagName("*") returns only elements support.getElementsByTagName = assert(function( el ) { el.appendChild( document.createComment("") ); return !el.getElementsByTagName("*").length; }); // Support: IE<9 support.getElementsByClassName = rnative.test( document.getElementsByClassName ); // Support: IE<10 // Check if getElementById returns elements by name // The broken getElementById methods don't pick up programmatically-set names, // so use a roundabout getElementsByName test support.getById = assert(function( el ) { docElem.appendChild( el ).id = expando; return !document.getElementsByName || !document.getElementsByName( expando ).length; }); // ID filter and find if ( support.getById ) { Expr.filter["ID"] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { return elem.getAttribute("id") === attrId; }; }; Expr.find["ID"] = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var elem = context.getElementById( id ); return elem ? [ elem ] : []; } }; } else { Expr.filter["ID"] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); return node && node.value === attrId; }; }; // Support: IE 6 - 7 only // getElementById is not reliable as a find shortcut Expr.find["ID"] = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var node, i, elems, elem = context.getElementById( id ); if ( elem ) { // Verify the id attribute node = elem.getAttributeNode("id"); if ( node && node.value === id ) { return [ elem ]; } // Fall back on getElementsByName elems = context.getElementsByName( id ); i = 0; while ( (elem = elems[i++]) ) { node = elem.getAttributeNode("id"); if ( node && node.value === id ) { return [ elem ]; } } } return []; } }; } // Tag Expr.find["TAG"] = support.getElementsByTagName ? function( tag, context ) { if ( typeof context.getElementsByTagName !== "undefined" ) { return context.getElementsByTagName( tag ); // DocumentFragment nodes don't have gEBTN } else if ( support.qsa ) { return context.querySelectorAll( tag ); } } : function( tag, context ) { var elem, tmp = [], i = 0, // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too results = context.getElementsByTagName( tag ); // Filter out possible comments if ( tag === "*" ) { while ( (elem = results[i++]) ) { if ( elem.nodeType === 1 ) { tmp.push( elem ); } } return tmp; } return results; }; // Class Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { return context.getElementsByClassName( className ); } }; /* QSA/matchesSelector ---------------------------------------------------------------------- */ // QSA and matchesSelector support // matchesSelector(:active) reports false when true (IE9/Opera 11.5) rbuggyMatches = []; // qSa(:focus) reports false when true (Chrome 21) // We allow this because of a bug in IE8/9 that throws an error // whenever `document.activeElement` is accessed on an iframe // So, we allow :focus to pass through QSA all the time to avoid the IE error // See https://bugs.jquery.com/ticket/13378 rbuggyQSA = []; if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { // Build QSA regex // Regex strategy adopted from Diego Perini assert(function( el ) { // Select is set to empty string on purpose // This is to test IE's treatment of not explicitly // setting a boolean content attribute, // since its presence should be enough // https://bugs.jquery.com/ticket/12359 docElem.appendChild( el ).innerHTML = "" + ""; // Support: IE8, Opera 11-12.16 // Nothing should be selected when empty strings follow ^= or $= or *= // The test attribute must be unknown in Opera but "safe" for WinRT // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section if ( el.querySelectorAll("[msallowcapture^='']").length ) { rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); } // Support: IE8 // Boolean attributes and "value" are not treated correctly if ( !el.querySelectorAll("[selected]").length ) { rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); } // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { rbuggyQSA.push("~="); } // Webkit/Opera - :checked should return selected option elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked // IE8 throws error here and will not see later tests if ( !el.querySelectorAll(":checked").length ) { rbuggyQSA.push(":checked"); } // Support: Safari 8+, iOS 8+ // https://bugs.webkit.org/show_bug.cgi?id=136851 // In-page `selector#id sibling-combinator selector` fails if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { rbuggyQSA.push(".#.+[+~]"); } }); assert(function( el ) { el.innerHTML = "" + ""; // Support: Windows 8 Native Apps // The type and name attributes are restricted during .innerHTML assignment var input = document.createElement("input"); input.setAttribute( "type", "hidden" ); el.appendChild( input ).setAttribute( "name", "D" ); // Support: IE8 // Enforce case-sensitivity of name attribute if ( el.querySelectorAll("[name=d]").length ) { rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); } // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) // IE8 throws error here and will not see later tests if ( el.querySelectorAll(":enabled").length !== 2 ) { rbuggyQSA.push( ":enabled", ":disabled" ); } // Support: IE9-11+ // IE's :disabled selector does not pick up the children of disabled fieldsets docElem.appendChild( el ).disabled = true; if ( el.querySelectorAll(":disabled").length !== 2 ) { rbuggyQSA.push( ":enabled", ":disabled" ); } // Opera 10-11 does not throw on post-comma invalid pseudos el.querySelectorAll("*,:x"); rbuggyQSA.push(",.*:"); }); } if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector) )) ) { assert(function( el ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9) support.disconnectedMatch = matches.call( el, "*" ); // This should fail with an exception // Gecko does not error, returns false instead matches.call( el, "[s!='']:x" ); rbuggyMatches.push( "!=", pseudos ); }); } rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); /* Contains ---------------------------------------------------------------------- */ hasCompare = rnative.test( docElem.compareDocumentPosition ); // Element contains another // Purposefully self-exclusive // As in, an element does not contain itself contains = hasCompare || rnative.test( docElem.contains ) ? function( a, b ) { var adown = a.nodeType === 9 ? a.documentElement : a, bup = b && b.parentNode; return a === bup || !!( bup && bup.nodeType === 1 && ( adown.contains ? adown.contains( bup ) : a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 )); } : function( a, b ) { if ( b ) { while ( (b = b.parentNode) ) { if ( b === a ) { return true; } } } return false; }; /* Sorting ---------------------------------------------------------------------- */ // Document order sorting sortOrder = hasCompare ? function( a, b ) { // Flag for duplicate removal if ( a === b ) { hasDuplicate = true; return 0; } // Sort on method existence if only one input has compareDocumentPosition var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; if ( compare ) { return compare; } // Calculate position if both inputs belong to the same document compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? a.compareDocumentPosition( b ) : // Otherwise we know they are disconnected 1; // Disconnected nodes if ( compare & 1 || (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { // Choose the first element that is related to our preferred document if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { return -1; } if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { return 1; } // Maintain original order return sortInput ? ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; } return compare & 4 ? -1 : 1; } : function( a, b ) { // Exit early if the nodes are identical if ( a === b ) { hasDuplicate = true; return 0; } var cur, i = 0, aup = a.parentNode, bup = b.parentNode, ap = [ a ], bp = [ b ]; // Parentless nodes are either documents or disconnected if ( !aup || !bup ) { return a === document ? -1 : b === document ? 1 : aup ? -1 : bup ? 1 : sortInput ? ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; // If the nodes are siblings, we can do a quick check } else if ( aup === bup ) { return siblingCheck( a, b ); } // Otherwise we need full lists of their ancestors for comparison cur = a; while ( (cur = cur.parentNode) ) { ap.unshift( cur ); } cur = b; while ( (cur = cur.parentNode) ) { bp.unshift( cur ); } // Walk down the tree looking for a discrepancy while ( ap[i] === bp[i] ) { i++; } return i ? // Do a sibling check if the nodes have a common ancestor siblingCheck( ap[i], bp[i] ) : // Otherwise nodes in our document sort first ap[i] === preferredDoc ? -1 : bp[i] === preferredDoc ? 1 : 0; }; return document; }; Sizzle.matches = function( expr, elements ) { return Sizzle( expr, null, null, elements ); }; Sizzle.matchesSelector = function( elem, expr ) { // Set document vars if needed if ( ( elem.ownerDocument || elem ) !== document ) { setDocument( elem ); } // Make sure that attribute selectors are quoted expr = expr.replace( rattributeQuotes, "='$1']" ); if ( support.matchesSelector && documentIsHTML && !compilerCache[ expr + " " ] && ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { try { var ret = matches.call( elem, expr ); // IE 9's matchesSelector returns false on disconnected nodes if ( ret || support.disconnectedMatch || // As well, disconnected nodes are said to be in a document // fragment in IE 9 elem.document && elem.document.nodeType !== 11 ) { return ret; } } catch (e) {} } return Sizzle( expr, document, null, [ elem ] ).length > 0; }; Sizzle.contains = function( context, elem ) { // Set document vars if needed if ( ( context.ownerDocument || context ) !== document ) { setDocument( context ); } return contains( context, elem ); }; Sizzle.attr = function( elem, name ) { // Set document vars if needed if ( ( elem.ownerDocument || elem ) !== document ) { setDocument( elem ); } var fn = Expr.attrHandle[ name.toLowerCase() ], // Don't get fooled by Object.prototype properties (jQuery #13807) val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? fn( elem, name, !documentIsHTML ) : undefined; return val !== undefined ? val : support.attributes || !documentIsHTML ? elem.getAttribute( name ) : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null; }; Sizzle.escape = function( sel ) { return (sel + "").replace( rcssescape, fcssescape ); }; Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; /** * Document sorting and removing duplicates * @param {ArrayLike} results */ Sizzle.uniqueSort = function( results ) { var elem, duplicates = [], j = 0, i = 0; // Unless we *know* we can detect duplicates, assume their presence hasDuplicate = !support.detectDuplicates; sortInput = !support.sortStable && results.slice( 0 ); results.sort( sortOrder ); if ( hasDuplicate ) { while ( (elem = results[i++]) ) { if ( elem === results[ i ] ) { j = duplicates.push( i ); } } while ( j-- ) { results.splice( duplicates[ j ], 1 ); } } // Clear input after sorting to release objects // See https://github.com/jquery/sizzle/pull/225 sortInput = null; return results; }; /** * Utility function for retrieving the text value of an array of DOM nodes * @param {Array|Element} elem */ getText = Sizzle.getText = function( elem ) { var node, ret = "", i = 0, nodeType = elem.nodeType; if ( !nodeType ) { // If no nodeType, this is expected to be an array while ( (node = elem[i++]) ) { // Do not traverse comment nodes ret += getText( node ); } } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { // Use textContent for elements // innerText usage removed for consistency of new lines (jQuery #11153) if ( typeof elem.textContent === "string" ) { return elem.textContent; } else { // Traverse its children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } // Do not include comment or processing instruction nodes return ret; }; Expr = Sizzle.selectors = { // Can be adjusted by the user cacheLength: 50, createPseudo: markFunction, match: matchExpr, attrHandle: {}, find: {}, relative: { ">": { dir: "parentNode", first: true }, " ": { dir: "parentNode" }, "+": { dir: "previousSibling", first: true }, "~": { dir: "previousSibling" } }, preFilter: { "ATTR": function( match ) { match[1] = match[1].replace( runescape, funescape ); // Move the given value to match[3] whether quoted or unquoted match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); if ( match[2] === "~=" ) { match[3] = " " + match[3] + " "; } return match.slice( 0, 4 ); }, "CHILD": function( match ) { /* matches from matchExpr["CHILD"] 1 type (only|nth|...) 2 what (child|of-type) 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 4 xn-component of xn+y argument ([+-]?\d*n|) 5 sign of xn-component 6 x of xn-component 7 sign of y-component 8 y of y-component */ match[1] = match[1].toLowerCase(); if ( match[1].slice( 0, 3 ) === "nth" ) { // nth-* requires argument if ( !match[3] ) { Sizzle.error( match[0] ); } // numeric x and y parameters for Expr.filter.CHILD // remember that false/true cast respectively to 0/1 match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); // other types prohibit arguments } else if ( match[3] ) { Sizzle.error( match[0] ); } return match; }, "PSEUDO": function( match ) { var excess, unquoted = !match[6] && match[2]; if ( matchExpr["CHILD"].test( match[0] ) ) { return null; } // Accept quoted arguments as-is if ( match[3] ) { match[2] = match[4] || match[5] || ""; // Strip excess characters from unquoted arguments } else if ( unquoted && rpseudo.test( unquoted ) && // Get excess from tokenize (recursively) (excess = tokenize( unquoted, true )) && // advance to the next closing parenthesis (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { // excess is a negative index match[0] = match[0].slice( 0, excess ); match[2] = unquoted.slice( 0, excess ); } // Return only captures needed by the pseudo filter method (type and argument) return match.slice( 0, 3 ); } }, filter: { "TAG": function( nodeNameSelector ) { var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); return nodeNameSelector === "*" ? function() { return true; } : function( elem ) { return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; }; }, "CLASS": function( className ) { var pattern = classCache[ className + " " ]; return pattern || (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && classCache( className, function( elem ) { return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); }); }, "ATTR": function( name, operator, check ) { return function( elem ) { var result = Sizzle.attr( elem, name ); if ( result == null ) { return operator === "!="; } if ( !operator ) { return true; } result += ""; return operator === "=" ? result === check : operator === "!=" ? result !== check : operator === "^=" ? check && result.indexOf( check ) === 0 : operator === "*=" ? check && result.indexOf( check ) > -1 : operator === "$=" ? check && result.slice( -check.length ) === check : operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : false; }; }, "CHILD": function( type, what, argument, first, last ) { var simple = type.slice( 0, 3 ) !== "nth", forward = type.slice( -4 ) !== "last", ofType = what === "of-type"; return first === 1 && last === 0 ? // Shortcut for :nth-*(n) function( elem ) { return !!elem.parentNode; } : function( elem, context, xml ) { var cache, uniqueCache, outerCache, node, nodeIndex, start, dir = simple !== forward ? "nextSibling" : "previousSibling", parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), useCache = !xml && !ofType, diff = false; if ( parent ) { // :(first|last|only)-(child|of-type) if ( simple ) { while ( dir ) { node = elem; while ( (node = node[ dir ]) ) { if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { return false; } } // Reverse direction for :only-* (if we haven't yet done so) start = dir = type === "only" && !start && "nextSibling"; } return true; } start = [ forward ? parent.firstChild : parent.lastChild ]; // non-xml :nth-child(...) stores cache data on `parent` if ( forward && useCache ) { // Seek `elem` from a previously-cached index // ...in a gzip-friendly way node = parent; outerCache = node[ expando ] || (node[ expando ] = {}); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || (outerCache[ node.uniqueID ] = {}); cache = uniqueCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex && cache[ 2 ]; node = nodeIndex && parent.childNodes[ nodeIndex ]; while ( (node = ++nodeIndex && node && node[ dir ] || // Fallback to seeking `elem` from the start (diff = nodeIndex = 0) || start.pop()) ) { // When found, cache indexes on `parent` and break if ( node.nodeType === 1 && ++diff && node === elem ) { uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; break; } } } else { // Use previously-cached element index if available if ( useCache ) { // ...in a gzip-friendly way node = elem; outerCache = node[ expando ] || (node[ expando ] = {}); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || (outerCache[ node.uniqueID ] = {}); cache = uniqueCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex; } // xml :nth-child(...) // or :nth-last-child(...) or :nth(-last)?-of-type(...) if ( diff === false ) { // Use the same loop as above to seek `elem` from the start while ( (node = ++nodeIndex && node && node[ dir ] || (diff = nodeIndex = 0) || start.pop()) ) { if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { // Cache the index of each encountered element if ( useCache ) { outerCache = node[ expando ] || (node[ expando ] = {}); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || (outerCache[ node.uniqueID ] = {}); uniqueCache[ type ] = [ dirruns, diff ]; } if ( node === elem ) { break; } } } } } // Incorporate the offset, then check against cycle size diff -= last; return diff === first || ( diff % first === 0 && diff / first >= 0 ); } }; }, "PSEUDO": function( pseudo, argument ) { // pseudo-class names are case-insensitive // http://www.w3.org/TR/selectors/#pseudo-classes // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters // Remember that setFilters inherits from pseudos var args, fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || Sizzle.error( "unsupported pseudo: " + pseudo ); // The user may use createPseudo to indicate that // arguments are needed to create the filter function // just as Sizzle does if ( fn[ expando ] ) { return fn( argument ); } // But maintain support for old signatures if ( fn.length > 1 ) { args = [ pseudo, pseudo, "", argument ]; return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? markFunction(function( seed, matches ) { var idx, matched = fn( seed, argument ), i = matched.length; while ( i-- ) { idx = indexOf( seed, matched[i] ); seed[ idx ] = !( matches[ idx ] = matched[i] ); } }) : function( elem ) { return fn( elem, 0, args ); }; } return fn; } }, pseudos: { // Potentially complex pseudos "not": markFunction(function( selector ) { // Trim the selector passed to compile // to avoid treating leading and trailing // spaces as combinators var input = [], results = [], matcher = compile( selector.replace( rtrim, "$1" ) ); return matcher[ expando ] ? markFunction(function( seed, matches, context, xml ) { var elem, unmatched = matcher( seed, null, xml, [] ), i = seed.length; // Match elements unmatched by `matcher` while ( i-- ) { if ( (elem = unmatched[i]) ) { seed[i] = !(matches[i] = elem); } } }) : function( elem, context, xml ) { input[0] = elem; matcher( input, null, xml, results ); // Don't keep the element (issue #299) input[0] = null; return !results.pop(); }; }), "has": markFunction(function( selector ) { return function( elem ) { return Sizzle( selector, elem ).length > 0; }; }), "contains": markFunction(function( text ) { text = text.replace( runescape, funescape ); return function( elem ) { return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; }; }), // "Whether an element is represented by a :lang() selector // is based solely on the element's language value // being equal to the identifier C, // or beginning with the identifier C immediately followed by "-". // The matching of C against the element's language value is performed case-insensitively. // The identifier C does not have to be a valid language name." // http://www.w3.org/TR/selectors/#lang-pseudo "lang": markFunction( function( lang ) { // lang value must be a valid identifier if ( !ridentifier.test(lang || "") ) { Sizzle.error( "unsupported lang: " + lang ); } lang = lang.replace( runescape, funescape ).toLowerCase(); return function( elem ) { var elemLang; do { if ( (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { elemLang = elemLang.toLowerCase(); return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; } } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); return false; }; }), // Miscellaneous "target": function( elem ) { var hash = window.location && window.location.hash; return hash && hash.slice( 1 ) === elem.id; }, "root": function( elem ) { return elem === docElem; }, "focus": function( elem ) { return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); }, // Boolean properties "enabled": createDisabledPseudo( false ), "disabled": createDisabledPseudo( true ), "checked": function( elem ) { // In CSS3, :checked should return both checked and selected elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked var nodeName = elem.nodeName.toLowerCase(); return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); }, "selected": function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly if ( elem.parentNode ) { elem.parentNode.selectedIndex; } return elem.selected === true; }, // Contents "empty": function( elem ) { // http://www.w3.org/TR/selectors/#empty-pseudo // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), // but not by others (comment: 8; processing instruction: 7; etc.) // nodeType < 6 works because attributes (2) do not appear as children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { if ( elem.nodeType < 6 ) { return false; } } return true; }, "parent": function( elem ) { return !Expr.pseudos["empty"]( elem ); }, // Element/input types "header": function( elem ) { return rheader.test( elem.nodeName ); }, "input": function( elem ) { return rinputs.test( elem.nodeName ); }, "button": function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === "button" || name === "button"; }, "text": function( elem ) { var attr; return elem.nodeName.toLowerCase() === "input" && elem.type === "text" && // Support: IE<8 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); }, // Position-in-collection "first": createPositionalPseudo(function() { return [ 0 ]; }), "last": createPositionalPseudo(function( matchIndexes, length ) { return [ length - 1 ]; }), "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { return [ argument < 0 ? argument + length : argument ]; }), "even": createPositionalPseudo(function( matchIndexes, length ) { var i = 0; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; }), "odd": createPositionalPseudo(function( matchIndexes, length ) { var i = 1; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; }), "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; --i >= 0; ) { matchIndexes.push( i ); } return matchIndexes; }), "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; ++i < length; ) { matchIndexes.push( i ); } return matchIndexes; }) } }; Expr.pseudos["nth"] = Expr.pseudos["eq"]; // Add button/input type pseudos for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { Expr.pseudos[ i ] = createInputPseudo( i ); } for ( i in { submit: true, reset: true } ) { Expr.pseudos[ i ] = createButtonPseudo( i ); } // Easy API for creating new setFilters function setFilters() {} setFilters.prototype = Expr.filters = Expr.pseudos; Expr.setFilters = new setFilters(); tokenize = Sizzle.tokenize = function( selector, parseOnly ) { var matched, match, tokens, type, soFar, groups, preFilters, cached = tokenCache[ selector + " " ]; if ( cached ) { return parseOnly ? 0 : cached.slice( 0 ); } soFar = selector; groups = []; preFilters = Expr.preFilter; while ( soFar ) { // Comma and first run if ( !matched || (match = rcomma.exec( soFar )) ) { if ( match ) { // Don't consume trailing commas as valid soFar = soFar.slice( match[0].length ) || soFar; } groups.push( (tokens = []) ); } matched = false; // Combinators if ( (match = rcombinators.exec( soFar )) ) { matched = match.shift(); tokens.push({ value: matched, // Cast descendant combinators to space type: match[0].replace( rtrim, " " ) }); soFar = soFar.slice( matched.length ); } // Filters for ( type in Expr.filter ) { if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || (match = preFilters[ type ]( match ))) ) { matched = match.shift(); tokens.push({ value: matched, type: type, matches: match }); soFar = soFar.slice( matched.length ); } } if ( !matched ) { break; } } // Return the length of the invalid excess // if we're just parsing // Otherwise, throw an error or return tokens return parseOnly ? soFar.length : soFar ? Sizzle.error( selector ) : // Cache the tokens tokenCache( selector, groups ).slice( 0 ); }; function toSelector( tokens ) { var i = 0, len = tokens.length, selector = ""; for ( ; i < len; i++ ) { selector += tokens[i].value; } return selector; } function addCombinator( matcher, combinator, base ) { var dir = combinator.dir, skip = combinator.next, key = skip || dir, checkNonElements = base && key === "parentNode", doneName = done++; return combinator.first ? // Check against closest ancestor/preceding element function( elem, context, xml ) { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { return matcher( elem, context, xml ); } } return false; } : // Check against all ancestor/preceding elements function( elem, context, xml ) { var oldCache, uniqueCache, outerCache, newCache = [ dirruns, doneName ]; // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching if ( xml ) { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { if ( matcher( elem, context, xml ) ) { return true; } } } } else { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { outerCache = elem[ expando ] || (elem[ expando ] = {}); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); if ( skip && skip === elem.nodeName.toLowerCase() ) { elem = elem[ dir ] || elem; } else if ( (oldCache = uniqueCache[ key ]) && oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { // Assign to newCache so results back-propagate to previous elements return (newCache[ 2 ] = oldCache[ 2 ]); } else { // Reuse newcache so results back-propagate to previous elements uniqueCache[ key ] = newCache; // A match means we're done; a fail means we have to keep checking if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { return true; } } } } } return false; }; } function elementMatcher( matchers ) { return matchers.length > 1 ? function( elem, context, xml ) { var i = matchers.length; while ( i-- ) { if ( !matchers[i]( elem, context, xml ) ) { return false; } } return true; } : matchers[0]; } function multipleContexts( selector, contexts, results ) { var i = 0, len = contexts.length; for ( ; i < len; i++ ) { Sizzle( selector, contexts[i], results ); } return results; } function condense( unmatched, map, filter, context, xml ) { var elem, newUnmatched = [], i = 0, len = unmatched.length, mapped = map != null; for ( ; i < len; i++ ) { if ( (elem = unmatched[i]) ) { if ( !filter || filter( elem, context, xml ) ) { newUnmatched.push( elem ); if ( mapped ) { map.push( i ); } } } } return newUnmatched; } function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { if ( postFilter && !postFilter[ expando ] ) { postFilter = setMatcher( postFilter ); } if ( postFinder && !postFinder[ expando ] ) { postFinder = setMatcher( postFinder, postSelector ); } return markFunction(function( seed, results, context, xml ) { var temp, i, elem, preMap = [], postMap = [], preexisting = results.length, // Get initial elements from seed or context elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), // Prefilter to get matcher input, preserving a map for seed-results synchronization matcherIn = preFilter && ( seed || !selector ) ? condense( elems, preMap, preFilter, context, xml ) : elems, matcherOut = matcher ? // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, postFinder || ( seed ? preFilter : preexisting || postFilter ) ? // ...intermediate processing is necessary [] : // ...otherwise use results directly results : matcherIn; // Find primary matches if ( matcher ) { matcher( matcherIn, matcherOut, context, xml ); } // Apply postFilter if ( postFilter ) { temp = condense( matcherOut, postMap ); postFilter( temp, [], context, xml ); // Un-match failing elements by moving them back to matcherIn i = temp.length; while ( i-- ) { if ( (elem = temp[i]) ) { matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); } } } if ( seed ) { if ( postFinder || preFilter ) { if ( postFinder ) { // Get the final matcherOut by condensing this intermediate into postFinder contexts temp = []; i = matcherOut.length; while ( i-- ) { if ( (elem = matcherOut[i]) ) { // Restore matcherIn since elem is not yet a final match temp.push( (matcherIn[i] = elem) ); } } postFinder( null, (matcherOut = []), temp, xml ); } // Move matched elements from seed to results to keep them synchronized i = matcherOut.length; while ( i-- ) { if ( (elem = matcherOut[i]) && (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { seed[temp] = !(results[temp] = elem); } } } // Add elements to results, through postFinder if defined } else { matcherOut = condense( matcherOut === results ? matcherOut.splice( preexisting, matcherOut.length ) : matcherOut ); if ( postFinder ) { postFinder( null, results, matcherOut, xml ); } else { push.apply( results, matcherOut ); } } }); } function matcherFromTokens( tokens ) { var checkContext, matcher, j, len = tokens.length, leadingRelative = Expr.relative[ tokens[0].type ], implicitRelative = leadingRelative || Expr.relative[" "], i = leadingRelative ? 1 : 0, // The foundational matcher ensures that elements are reachable from top-level context(s) matchContext = addCombinator( function( elem ) { return elem === checkContext; }, implicitRelative, true ), matchAnyContext = addCombinator( function( elem ) { return indexOf( checkContext, elem ) > -1; }, implicitRelative, true ), matchers = [ function( elem, context, xml ) { var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( (checkContext = context).nodeType ? matchContext( elem, context, xml ) : matchAnyContext( elem, context, xml ) ); // Avoid hanging onto element (issue #299) checkContext = null; return ret; } ]; for ( ; i < len; i++ ) { if ( (matcher = Expr.relative[ tokens[i].type ]) ) { matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; } else { matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); // Return special upon seeing a positional matcher if ( matcher[ expando ] ) { // Find the next relative operator (if any) for proper handling j = ++i; for ( ; j < len; j++ ) { if ( Expr.relative[ tokens[j].type ] ) { break; } } return setMatcher( i > 1 && elementMatcher( matchers ), i > 1 && toSelector( // If the preceding token was a descendant combinator, insert an implicit any-element `*` tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) ).replace( rtrim, "$1" ), matcher, i < j && matcherFromTokens( tokens.slice( i, j ) ), j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), j < len && toSelector( tokens ) ); } matchers.push( matcher ); } } return elementMatcher( matchers ); } function matcherFromGroupMatchers( elementMatchers, setMatchers ) { var bySet = setMatchers.length > 0, byElement = elementMatchers.length > 0, superMatcher = function( seed, context, xml, results, outermost ) { var elem, j, matcher, matchedCount = 0, i = "0", unmatched = seed && [], setMatched = [], contextBackup = outermostContext, // We must always have either seed elements or outermost context elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), // Use integer dirruns iff this is the outermost matcher dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), len = elems.length; if ( outermost ) { outermostContext = context === document || context || outermost; } // Add elements passing elementMatchers directly to results // Support: IE<9, Safari // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id for ( ; i !== len && (elem = elems[i]) != null; i++ ) { if ( byElement && elem ) { j = 0; if ( !context && elem.ownerDocument !== document ) { setDocument( elem ); xml = !documentIsHTML; } while ( (matcher = elementMatchers[j++]) ) { if ( matcher( elem, context || document, xml) ) { results.push( elem ); break; } } if ( outermost ) { dirruns = dirrunsUnique; } } // Track unmatched elements for set filters if ( bySet ) { // They will have gone through all possible matchers if ( (elem = !matcher && elem) ) { matchedCount--; } // Lengthen the array for every element, matched or not if ( seed ) { unmatched.push( elem ); } } } // `i` is now the count of elements visited above, and adding it to `matchedCount` // makes the latter nonnegative. matchedCount += i; // Apply set filters to unmatched elements // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` // equals `i`), unless we didn't visit _any_ elements in the above loop because we have // no element matchers and no seed. // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that // case, which will result in a "00" `matchedCount` that differs from `i` but is also // numerically zero. if ( bySet && i !== matchedCount ) { j = 0; while ( (matcher = setMatchers[j++]) ) { matcher( unmatched, setMatched, context, xml ); } if ( seed ) { // Reintegrate element matches to eliminate the need for sorting if ( matchedCount > 0 ) { while ( i-- ) { if ( !(unmatched[i] || setMatched[i]) ) { setMatched[i] = pop.call( results ); } } } // Discard index placeholder values to get only actual matches setMatched = condense( setMatched ); } // Add matches to results push.apply( results, setMatched ); // Seedless set matches succeeding multiple successful matchers stipulate sorting if ( outermost && !seed && setMatched.length > 0 && ( matchedCount + setMatchers.length ) > 1 ) { Sizzle.uniqueSort( results ); } } // Override manipulation of globals by nested matchers if ( outermost ) { dirruns = dirrunsUnique; outermostContext = contextBackup; } return unmatched; }; return bySet ? markFunction( superMatcher ) : superMatcher; } compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { var i, setMatchers = [], elementMatchers = [], cached = compilerCache[ selector + " " ]; if ( !cached ) { // Generate a function of recursive functions that can be used to check each element if ( !match ) { match = tokenize( selector ); } i = match.length; while ( i-- ) { cached = matcherFromTokens( match[i] ); if ( cached[ expando ] ) { setMatchers.push( cached ); } else { elementMatchers.push( cached ); } } // Cache the compiled function cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); // Save selector and tokenization cached.selector = selector; } return cached; }; /** * A low-level selection function that works with Sizzle's compiled * selector functions * @param {String|Function} selector A selector or a pre-compiled * selector function built with Sizzle.compile * @param {Element} context * @param {Array} [results] * @param {Array} [seed] A set of elements to match against */ select = Sizzle.select = function( selector, context, results, seed ) { var i, tokens, token, type, find, compiled = typeof selector === "function" && selector, match = !seed && tokenize( (selector = compiled.selector || selector) ); results = results || []; // Try to minimize operations if there is only one selector in the list and no seed // (the latter of which guarantees us context) if ( match.length === 1 ) { // Reduce context if the leading compound selector is an ID tokens = match[0] = match[0].slice( 0 ); if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; if ( !context ) { return results; // Precompiled matchers will still verify ancestry, so step up a level } else if ( compiled ) { context = context.parentNode; } selector = selector.slice( tokens.shift().value.length ); } // Fetch a seed set for right-to-left matching i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; while ( i-- ) { token = tokens[i]; // Abort if we hit a combinator if ( Expr.relative[ (type = token.type) ] ) { break; } if ( (find = Expr.find[ type ]) ) { // Search, expanding context for leading sibling combinators if ( (seed = find( token.matches[0].replace( runescape, funescape ), rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context )) ) { // If seed is empty or no tokens remain, we can return early tokens.splice( i, 1 ); selector = seed.length && toSelector( tokens ); if ( !selector ) { push.apply( results, seed ); return results; } break; } } } } // Compile and execute a filtering function if one is not provided // Provide `match` to avoid retokenization if we modified the selector above ( compiled || compile( selector, match ) )( seed, context, !documentIsHTML, results, !context || rsibling.test( selector ) && testContext( context.parentNode ) || context ); return results; }; // One-time assignments // Sort stability support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; // Support: Chrome 14-35+ // Always assume duplicates if they aren't passed to the comparison function support.detectDuplicates = !!hasDuplicate; // Initialize against the default document setDocument(); // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) // Detached nodes confoundingly follow *each other* support.sortDetached = assert(function( el ) { // Should return 1, but returns 4 (following) return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; }); // Support: IE<8 // Prevent attribute/property "interpolation" // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx if ( !assert(function( el ) { el.innerHTML = ""; return el.firstChild.getAttribute("href") === "#" ; }) ) { addHandle( "type|href|height|width", function( elem, name, isXML ) { if ( !isXML ) { return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); } }); } // Support: IE<9 // Use defaultValue in place of getAttribute("value") if ( !support.attributes || !assert(function( el ) { el.innerHTML = ""; el.firstChild.setAttribute( "value", "" ); return el.firstChild.getAttribute( "value" ) === ""; }) ) { addHandle( "value", function( elem, name, isXML ) { if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { return elem.defaultValue; } }); } // Support: IE<9 // Use getAttributeNode to fetch booleans when getAttribute lies if ( !assert(function( el ) { return el.getAttribute("disabled") == null; }) ) { addHandle( booleans, function( elem, name, isXML ) { var val; if ( !isXML ) { return elem[ name ] === true ? name.toLowerCase() : (val = elem.getAttributeNode( name )) && val.specified ? val.value : null; } }); } return Sizzle; })( window ); jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; // Deprecated jQuery.expr[ ":" ] = jQuery.expr.pseudos; jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains; jQuery.escapeSelector = Sizzle.escape; var dir = function( elem, dir, until ) { var matched = [], truncate = until !== undefined; while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { if ( elem.nodeType === 1 ) { if ( truncate && jQuery( elem ).is( until ) ) { break; } matched.push( elem ); } } return matched; }; var siblings = function( n, elem ) { var matched = []; for ( ; n; n = n.nextSibling ) { if ( n.nodeType === 1 && n !== elem ) { matched.push( n ); } } return matched; }; var rneedsContext = jQuery.expr.match.needsContext; function nodeName( elem, name ) { return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); }; var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); // Implement the identical functionality for filter and not function winnow( elements, qualifier, not ) { if ( isFunction( qualifier ) ) { return jQuery.grep( elements, function( elem, i ) { return !!qualifier.call( elem, i, elem ) !== not; } ); } // Single element if ( qualifier.nodeType ) { return jQuery.grep( elements, function( elem ) { return ( elem === qualifier ) !== not; } ); } // Arraylike of elements (jQuery, arguments, Array) if ( typeof qualifier !== "string" ) { return jQuery.grep( elements, function( elem ) { return ( indexOf.call( qualifier, elem ) > -1 ) !== not; } ); } // Filtered directly for both simple and complex selectors return jQuery.filter( qualifier, elements, not ); } jQuery.filter = function( expr, elems, not ) { var elem = elems[ 0 ]; if ( not ) { expr = ":not(" + expr + ")"; } if ( elems.length === 1 && elem.nodeType === 1 ) { return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; } return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { return elem.nodeType === 1; } ) ); }; jQuery.fn.extend( { find: function( selector ) { var i, ret, len = this.length, self = this; if ( typeof selector !== "string" ) { return this.pushStack( jQuery( selector ).filter( function() { for ( i = 0; i < len; i++ ) { if ( jQuery.contains( self[ i ], this ) ) { return true; } } } ) ); } ret = this.pushStack( [] ); for ( i = 0; i < len; i++ ) { jQuery.find( selector, self[ i ], ret ); } return len > 1 ? jQuery.uniqueSort( ret ) : ret; }, filter: function( selector ) { return this.pushStack( winnow( this, selector || [], false ) ); }, not: function( selector ) { return this.pushStack( winnow( this, selector || [], true ) ); }, is: function( selector ) { return !!winnow( this, // If this is a positional/relative selector, check membership in the returned set // so $("p:first").is("p:last") won't return true for a doc with two "p". typeof selector === "string" && rneedsContext.test( selector ) ? jQuery( selector ) : selector || [], false ).length; } } ); // Initialize a jQuery object // A central reference to the root jQuery(document) var rootjQuery, // A simple way to check for HTML strings // Prioritize #id over to avoid XSS via location.hash (#9521) // Strict HTML recognition (#11290: must start with <) // Shortcut simple #id case for speed rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, init = jQuery.fn.init = function( selector, context, root ) { var match, elem; // HANDLE: $(""), $(null), $(undefined), $(false) if ( !selector ) { return this; } // Method init() accepts an alternate rootjQuery // so migrate can support jQuery.sub (gh-2101) root = root || rootjQuery; // Handle HTML strings if ( typeof selector === "string" ) { if ( selector[ 0 ] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) { // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; } else { match = rquickExpr.exec( selector ); } // Match html or make sure no context is specified for #id if ( match && ( match[ 1 ] || !context ) ) { // HANDLE: $(html) -> $(array) if ( match[ 1 ] ) { context = context instanceof jQuery ? context[ 0 ] : context; // Option to run scripts is true for back-compat // Intentionally let the error be thrown if parseHTML is not present jQuery.merge( this, jQuery.parseHTML( match[ 1 ], context && context.nodeType ? context.ownerDocument || context : document, true ) ); // HANDLE: $(html, props) if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { for ( match in context ) { // Properties of context are called as methods if possible if ( isFunction( this[ match ] ) ) { this[ match ]( context[ match ] ); // ...and otherwise set as attributes } else { this.attr( match, context[ match ] ); } } } return this; // HANDLE: $(#id) } else { elem = document.getElementById( match[ 2 ] ); if ( elem ) { // Inject the element directly into the jQuery object this[ 0 ] = elem; this.length = 1; } return this; } // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { return ( context || root ).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { return this.constructor( context ).find( selector ); } // HANDLE: $(DOMElement) } else if ( selector.nodeType ) { this[ 0 ] = selector; this.length = 1; return this; // HANDLE: $(function) // Shortcut for document ready } else if ( isFunction( selector ) ) { return root.ready !== undefined ? root.ready( selector ) : // Execute immediately if ready is not present selector( jQuery ); } return jQuery.makeArray( selector, this ); }; // Give the init function the jQuery prototype for later instantiation init.prototype = jQuery.fn; // Initialize central reference rootjQuery = jQuery( document ); var rparentsprev = /^(?:parents|prev(?:Until|All))/, // Methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, next: true, prev: true }; jQuery.fn.extend( { has: function( target ) { var targets = jQuery( target, this ), l = targets.length; return this.filter( function() { var i = 0; for ( ; i < l; i++ ) { if ( jQuery.contains( this, targets[ i ] ) ) { return true; } } } ); }, closest: function( selectors, context ) { var cur, i = 0, l = this.length, matched = [], targets = typeof selectors !== "string" && jQuery( selectors ); // Positional selectors never match, since there's no _selection_ context if ( !rneedsContext.test( selectors ) ) { for ( ; i < l; i++ ) { for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { // Always skip document fragments if ( cur.nodeType < 11 && ( targets ? targets.index( cur ) > -1 : // Don't pass non-elements to Sizzle cur.nodeType === 1 && jQuery.find.matchesSelector( cur, selectors ) ) ) { matched.push( cur ); break; } } } } return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); }, // Determine the position of an element within the set index: function( elem ) { // No argument, return index in parent if ( !elem ) { return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; } // Index in selector if ( typeof elem === "string" ) { return indexOf.call( jQuery( elem ), this[ 0 ] ); } // Locate the position of the desired element return indexOf.call( this, // If it receives a jQuery object, the first element is used elem.jquery ? elem[ 0 ] : elem ); }, add: function( selector, context ) { return this.pushStack( jQuery.uniqueSort( jQuery.merge( this.get(), jQuery( selector, context ) ) ) ); }, addBack: function( selector ) { return this.add( selector == null ? this.prevObject : this.prevObject.filter( selector ) ); } } ); function sibling( cur, dir ) { while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} return cur; } jQuery.each( { parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { return dir( elem, "parentNode" ); }, parentsUntil: function( elem, i, until ) { return dir( elem, "parentNode", until ); }, next: function( elem ) { return sibling( elem, "nextSibling" ); }, prev: function( elem ) { return sibling( elem, "previousSibling" ); }, nextAll: function( elem ) { return dir( elem, "nextSibling" ); }, prevAll: function( elem ) { return dir( elem, "previousSibling" ); }, nextUntil: function( elem, i, until ) { return dir( elem, "nextSibling", until ); }, prevUntil: function( elem, i, until ) { return dir( elem, "previousSibling", until ); }, siblings: function( elem ) { return siblings( ( elem.parentNode || {} ).firstChild, elem ); }, children: function( elem ) { return siblings( elem.firstChild ); }, contents: function( elem ) { if ( nodeName( elem, "iframe" ) ) { return elem.contentDocument; } // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only // Treat the template element as a regular one in browsers that // don't support it. if ( nodeName( elem, "template" ) ) { elem = elem.content || elem; } return jQuery.merge( [], elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var matched = jQuery.map( this, fn, until ); if ( name.slice( -5 ) !== "Until" ) { selector = until; } if ( selector && typeof selector === "string" ) { matched = jQuery.filter( selector, matched ); } if ( this.length > 1 ) { // Remove duplicates if ( !guaranteedUnique[ name ] ) { jQuery.uniqueSort( matched ); } // Reverse order for parents* and prev-derivatives if ( rparentsprev.test( name ) ) { matched.reverse(); } } return this.pushStack( matched ); }; } ); var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); // Convert String-formatted options into Object-formatted ones function createOptions( options ) { var object = {}; jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { object[ flag ] = true; } ); return object; } /* * Create a callback list using the following parameters: * * options: an optional list of space-separated options that will change how * the callback list behaves or a more traditional option object * * By default a callback list will act like an event callback list and can be * "fired" multiple times. * * Possible options: * * once: will ensure the callback list can only be fired once (like a Deferred) * * memory: will keep track of previous values and will call any callback added * after the list has been fired right away with the latest "memorized" * values (like a Deferred) * * unique: will ensure a callback can only be added once (no duplicate in the list) * * stopOnFalse: interrupt callings when a callback returns false * */ jQuery.Callbacks = function( options ) { // Convert options from String-formatted to Object-formatted if needed // (we check in cache first) options = typeof options === "string" ? createOptions( options ) : jQuery.extend( {}, options ); var // Flag to know if list is currently firing firing, // Last fire value for non-forgettable lists memory, // Flag to know if list was already fired fired, // Flag to prevent firing locked, // Actual callback list list = [], // Queue of execution data for repeatable lists queue = [], // Index of currently firing callback (modified by add/remove as needed) firingIndex = -1, // Fire callbacks fire = function() { // Enforce single-firing locked = locked || options.once; // Execute callbacks for all pending executions, // respecting firingIndex overrides and runtime changes fired = firing = true; for ( ; queue.length; firingIndex = -1 ) { memory = queue.shift(); while ( ++firingIndex < list.length ) { // Run callback and check for early termination if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && options.stopOnFalse ) { // Jump to end and forget the data so .add doesn't re-fire firingIndex = list.length; memory = false; } } } // Forget the data if we're done with it if ( !options.memory ) { memory = false; } firing = false; // Clean up if we're done firing for good if ( locked ) { // Keep an empty list if we have data for future add calls if ( memory ) { list = []; // Otherwise, this object is spent } else { list = ""; } } }, // Actual Callbacks object self = { // Add a callback or a collection of callbacks to the list add: function() { if ( list ) { // If we have memory from a past run, we should fire after adding if ( memory && !firing ) { firingIndex = list.length - 1; queue.push( memory ); } ( function add( args ) { jQuery.each( args, function( _, arg ) { if ( isFunction( arg ) ) { if ( !options.unique || !self.has( arg ) ) { list.push( arg ); } } else if ( arg && arg.length && toType( arg ) !== "string" ) { // Inspect recursively add( arg ); } } ); } )( arguments ); if ( memory && !firing ) { fire(); } } return this; }, // Remove a callback from the list remove: function() { jQuery.each( arguments, function( _, arg ) { var index; while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { list.splice( index, 1 ); // Handle firing indexes if ( index <= firingIndex ) { firingIndex--; } } } ); return this; }, // Check if a given callback is in the list. // If no argument is given, return whether or not list has callbacks attached. has: function( fn ) { return fn ? jQuery.inArray( fn, list ) > -1 : list.length > 0; }, // Remove all callbacks from the list empty: function() { if ( list ) { list = []; } return this; }, // Disable .fire and .add // Abort any current/pending executions // Clear all callbacks and values disable: function() { locked = queue = []; list = memory = ""; return this; }, disabled: function() { return !list; }, // Disable .fire // Also disable .add unless we have memory (since it would have no effect) // Abort any pending executions lock: function() { locked = queue = []; if ( !memory && !firing ) { list = memory = ""; } return this; }, locked: function() { return !!locked; }, // Call all callbacks with the given context and arguments fireWith: function( context, args ) { if ( !locked ) { args = args || []; args = [ context, args.slice ? args.slice() : args ]; queue.push( args ); if ( !firing ) { fire(); } } return this; }, // Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; }, // To know if the callbacks have already been called at least once fired: function() { return !!fired; } }; return self; }; function Identity( v ) { return v; } function Thrower( ex ) { throw ex; } function adoptValue( value, resolve, reject, noValue ) { var method; try { // Check for promise aspect first to privilege synchronous behavior if ( value && isFunction( ( method = value.promise ) ) ) { method.call( value ).done( resolve ).fail( reject ); // Other thenables } else if ( value && isFunction( ( method = value.then ) ) ) { method.call( value, resolve, reject ); // Other non-thenables } else { // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: // * false: [ value ].slice( 0 ) => resolve( value ) // * true: [ value ].slice( 1 ) => resolve() resolve.apply( undefined, [ value ].slice( noValue ) ); } // For Promises/A+, convert exceptions into rejections // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in // Deferred#then to conditionally suppress rejection. } catch ( value ) { // Support: Android 4.0 only // Strict mode functions invoked without .call/.apply get global-object context reject.apply( undefined, [ value ] ); } } jQuery.extend( { Deferred: function( func ) { var tuples = [ // action, add listener, callbacks, // ... .then handlers, argument index, [final state] [ "notify", "progress", jQuery.Callbacks( "memory" ), jQuery.Callbacks( "memory" ), 2 ], [ "resolve", "done", jQuery.Callbacks( "once memory" ), jQuery.Callbacks( "once memory" ), 0, "resolved" ], [ "reject", "fail", jQuery.Callbacks( "once memory" ), jQuery.Callbacks( "once memory" ), 1, "rejected" ] ], state = "pending", promise = { state: function() { return state; }, always: function() { deferred.done( arguments ).fail( arguments ); return this; }, "catch": function( fn ) { return promise.then( null, fn ); }, // Keep pipe for back-compat pipe: function( /* fnDone, fnFail, fnProgress */ ) { var fns = arguments; return jQuery.Deferred( function( newDefer ) { jQuery.each( tuples, function( i, tuple ) { // Map tuples (progress, done, fail) to arguments (done, fail, progress) var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; // deferred.progress(function() { bind to newDefer or newDefer.notify }) // deferred.done(function() { bind to newDefer or newDefer.resolve }) // deferred.fail(function() { bind to newDefer or newDefer.reject }) deferred[ tuple[ 1 ] ]( function() { var returned = fn && fn.apply( this, arguments ); if ( returned && isFunction( returned.promise ) ) { returned.promise() .progress( newDefer.notify ) .done( newDefer.resolve ) .fail( newDefer.reject ); } else { newDefer[ tuple[ 0 ] + "With" ]( this, fn ? [ returned ] : arguments ); } } ); } ); fns = null; } ).promise(); }, then: function( onFulfilled, onRejected, onProgress ) { var maxDepth = 0; function resolve( depth, deferred, handler, special ) { return function() { var that = this, args = arguments, mightThrow = function() { var returned, then; // Support: Promises/A+ section 2.3.3.3.3 // https://promisesaplus.com/#point-59 // Ignore double-resolution attempts if ( depth < maxDepth ) { return; } returned = handler.apply( that, args ); // Support: Promises/A+ section 2.3.1 // https://promisesaplus.com/#point-48 if ( returned === deferred.promise() ) { throw new TypeError( "Thenable self-resolution" ); } // Support: Promises/A+ sections 2.3.3.1, 3.5 // https://promisesaplus.com/#point-54 // https://promisesaplus.com/#point-75 // Retrieve `then` only once then = returned && // Support: Promises/A+ section 2.3.4 // https://promisesaplus.com/#point-64 // Only check objects and functions for thenability ( typeof returned === "object" || typeof returned === "function" ) && returned.then; // Handle a returned thenable if ( isFunction( then ) ) { // Special processors (notify) just wait for resolution if ( special ) { then.call( returned, resolve( maxDepth, deferred, Identity, special ), resolve( maxDepth, deferred, Thrower, special ) ); // Normal processors (resolve) also hook into progress } else { // ...and disregard older resolution values maxDepth++; then.call( returned, resolve( maxDepth, deferred, Identity, special ), resolve( maxDepth, deferred, Thrower, special ), resolve( maxDepth, deferred, Identity, deferred.notifyWith ) ); } // Handle all other returned values } else { // Only substitute handlers pass on context // and multiple values (non-spec behavior) if ( handler !== Identity ) { that = undefined; args = [ returned ]; } // Process the value(s) // Default process is resolve ( special || deferred.resolveWith )( that, args ); } }, // Only normal processors (resolve) catch and reject exceptions process = special ? mightThrow : function() { try { mightThrow(); } catch ( e ) { if ( jQuery.Deferred.exceptionHook ) { jQuery.Deferred.exceptionHook( e, process.stackTrace ); } // Support: Promises/A+ section 2.3.3.3.4.1 // https://promisesaplus.com/#point-61 // Ignore post-resolution exceptions if ( depth + 1 >= maxDepth ) { // Only substitute handlers pass on context // and multiple values (non-spec behavior) if ( handler !== Thrower ) { that = undefined; args = [ e ]; } deferred.rejectWith( that, args ); } } }; // Support: Promises/A+ section 2.3.3.3.1 // https://promisesaplus.com/#point-57 // Re-resolve promises immediately to dodge false rejection from // subsequent errors if ( depth ) { process(); } else { // Call an optional hook to record the stack, in case of exception // since it's otherwise lost when execution goes async if ( jQuery.Deferred.getStackHook ) { process.stackTrace = jQuery.Deferred.getStackHook(); } window.setTimeout( process ); } }; } return jQuery.Deferred( function( newDefer ) { // progress_handlers.add( ... ) tuples[ 0 ][ 3 ].add( resolve( 0, newDefer, isFunction( onProgress ) ? onProgress : Identity, newDefer.notifyWith ) ); // fulfilled_handlers.add( ... ) tuples[ 1 ][ 3 ].add( resolve( 0, newDefer, isFunction( onFulfilled ) ? onFulfilled : Identity ) ); // rejected_handlers.add( ... ) tuples[ 2 ][ 3 ].add( resolve( 0, newDefer, isFunction( onRejected ) ? onRejected : Thrower ) ); } ).promise(); }, // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { return obj != null ? jQuery.extend( obj, promise ) : promise; } }, deferred = {}; // Add list-specific methods jQuery.each( tuples, function( i, tuple ) { var list = tuple[ 2 ], stateString = tuple[ 5 ]; // promise.progress = list.add // promise.done = list.add // promise.fail = list.add promise[ tuple[ 1 ] ] = list.add; // Handle state if ( stateString ) { list.add( function() { // state = "resolved" (i.e., fulfilled) // state = "rejected" state = stateString; }, // rejected_callbacks.disable // fulfilled_callbacks.disable tuples[ 3 - i ][ 2 ].disable, // rejected_handlers.disable // fulfilled_handlers.disable tuples[ 3 - i ][ 3 ].disable, // progress_callbacks.lock tuples[ 0 ][ 2 ].lock, // progress_handlers.lock tuples[ 0 ][ 3 ].lock ); } // progress_handlers.fire // fulfilled_handlers.fire // rejected_handlers.fire list.add( tuple[ 3 ].fire ); // deferred.notify = function() { deferred.notifyWith(...) } // deferred.resolve = function() { deferred.resolveWith(...) } // deferred.reject = function() { deferred.rejectWith(...) } deferred[ tuple[ 0 ] ] = function() { deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); return this; }; // deferred.notifyWith = list.fireWith // deferred.resolveWith = list.fireWith // deferred.rejectWith = list.fireWith deferred[ tuple[ 0 ] + "With" ] = list.fireWith; } ); // Make the deferred a promise promise.promise( deferred ); // Call given func if any if ( func ) { func.call( deferred, deferred ); } // All done! return deferred; }, // Deferred helper when: function( singleValue ) { var // count of uncompleted subordinates remaining = arguments.length, // count of unprocessed arguments i = remaining, // subordinate fulfillment data resolveContexts = Array( i ), resolveValues = slice.call( arguments ), // the master Deferred master = jQuery.Deferred(), // subordinate callback factory updateFunc = function( i ) { return function( value ) { resolveContexts[ i ] = this; resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; if ( !( --remaining ) ) { master.resolveWith( resolveContexts, resolveValues ); } }; }; // Single- and empty arguments are adopted like Promise.resolve if ( remaining <= 1 ) { adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, !remaining ); // Use .then() to unwrap secondary thenables (cf. gh-3000) if ( master.state() === "pending" || isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { return master.then(); } } // Multiple arguments are aggregated like Promise.all array elements while ( i-- ) { adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); } return master.promise(); } } ); // These usually indicate a programmer mistake during development, // warn about them ASAP rather than swallowing them by default. var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; jQuery.Deferred.exceptionHook = function( error, stack ) { // Support: IE 8 - 9 only // Console exists when dev tools are open, which can happen at any time if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); } }; jQuery.readyException = function( error ) { window.setTimeout( function() { throw error; } ); }; // The deferred used on DOM ready var readyList = jQuery.Deferred(); jQuery.fn.ready = function( fn ) { readyList .then( fn ) // Wrap jQuery.readyException in a function so that the lookup // happens at the time of error handling instead of callback // registration. .catch( function( error ) { jQuery.readyException( error ); } ); return this; }; jQuery.extend( { // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1, // Handle when the DOM is ready ready: function( wait ) { // Abort if there are pending holds or we're already ready if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { return; } // Remember that the DOM is ready jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be if ( wait !== true && --jQuery.readyWait > 0 ) { return; } // If there are functions bound, to execute readyList.resolveWith( document, [ jQuery ] ); } } ); jQuery.ready.then = readyList.then; // The ready event handler and self cleanup method function completed() { document.removeEventListener( "DOMContentLoaded", completed ); window.removeEventListener( "load", completed ); jQuery.ready(); } // Catch cases where $(document).ready() is called // after the browser event has already occurred. // Support: IE <=9 - 10 only // Older IE sometimes signals "interactive" too soon if ( document.readyState === "complete" || ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { // Handle it asynchronously to allow scripts the opportunity to delay ready window.setTimeout( jQuery.ready ); } else { // Use the handy event callback document.addEventListener( "DOMContentLoaded", completed ); // A fallback to window.onload, that will always work window.addEventListener( "load", completed ); } // Multifunctional method to get and set values of a collection // The value/s can optionally be executed if it's a function var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { var i = 0, len = elems.length, bulk = key == null; // Sets many values if ( toType( key ) === "object" ) { chainable = true; for ( i in key ) { access( elems, fn, i, key[ i ], true, emptyGet, raw ); } // Sets one value } else if ( value !== undefined ) { chainable = true; if ( !isFunction( value ) ) { raw = true; } if ( bulk ) { // Bulk operations run against the entire set if ( raw ) { fn.call( elems, value ); fn = null; // ...except when executing function values } else { bulk = fn; fn = function( elem, key, value ) { return bulk.call( jQuery( elem ), value ); }; } } if ( fn ) { for ( ; i < len; i++ ) { fn( elems[ i ], key, raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) ) ); } } } if ( chainable ) { return elems; } // Gets if ( bulk ) { return fn.call( elems ); } return len ? fn( elems[ 0 ], key ) : emptyGet; }; // Matches dashed string for camelizing var rmsPrefix = /^-ms-/, rdashAlpha = /-([a-z])/g; // Used by camelCase as callback to replace() function fcamelCase( all, letter ) { return letter.toUpperCase(); } // Convert dashed to camelCase; used by the css and data modules // Support: IE <=9 - 11, Edge 12 - 15 // Microsoft forgot to hump their vendor prefix (#9572) function camelCase( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); } var acceptData = function( owner ) { // Accepts only: // - Node // - Node.ELEMENT_NODE // - Node.DOCUMENT_NODE // - Object // - Any return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); }; function Data() { this.expando = jQuery.expando + Data.uid++; } Data.uid = 1; Data.prototype = { cache: function( owner ) { // Check if the owner object already has a cache var value = owner[ this.expando ]; // If not, create one if ( !value ) { value = {}; // We can accept data for non-element nodes in modern browsers, // but we should not, see #8335. // Always return an empty object. if ( acceptData( owner ) ) { // If it is a node unlikely to be stringify-ed or looped over // use plain assignment if ( owner.nodeType ) { owner[ this.expando ] = value; // Otherwise secure it in a non-enumerable property // configurable must be true to allow the property to be // deleted when data is removed } else { Object.defineProperty( owner, this.expando, { value: value, configurable: true } ); } } } return value; }, set: function( owner, data, value ) { var prop, cache = this.cache( owner ); // Handle: [ owner, key, value ] args // Always use camelCase key (gh-2257) if ( typeof data === "string" ) { cache[ camelCase( data ) ] = value; // Handle: [ owner, { properties } ] args } else { // Copy the properties one-by-one to the cache object for ( prop in data ) { cache[ camelCase( prop ) ] = data[ prop ]; } } return cache; }, get: function( owner, key ) { return key === undefined ? this.cache( owner ) : // Always use camelCase key (gh-2257) owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; }, access: function( owner, key, value ) { // In cases where either: // // 1. No key was specified // 2. A string key was specified, but no value provided // // Take the "read" path and allow the get method to determine // which value to return, respectively either: // // 1. The entire cache object // 2. The data stored at the key // if ( key === undefined || ( ( key && typeof key === "string" ) && value === undefined ) ) { return this.get( owner, key ); } // When the key is not a string, or both a key and value // are specified, set or extend (existing objects) with either: // // 1. An object of properties // 2. A key and value // this.set( owner, key, value ); // Since the "set" path can have two possible entry points // return the expected data based on which path was taken[*] return value !== undefined ? value : key; }, remove: function( owner, key ) { var i, cache = owner[ this.expando ]; if ( cache === undefined ) { return; } if ( key !== undefined ) { // Support array or space separated string of keys if ( Array.isArray( key ) ) { // If key is an array of keys... // We always set camelCase keys, so remove that. key = key.map( camelCase ); } else { key = camelCase( key ); // If a key with the spaces exists, use it. // Otherwise, create an array by matching non-whitespace key = key in cache ? [ key ] : ( key.match( rnothtmlwhite ) || [] ); } i = key.length; while ( i-- ) { delete cache[ key[ i ] ]; } } // Remove the expando if there's no more data if ( key === undefined || jQuery.isEmptyObject( cache ) ) { // Support: Chrome <=35 - 45 // Webkit & Blink performance suffers when deleting properties // from DOM nodes, so set to undefined instead // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) if ( owner.nodeType ) { owner[ this.expando ] = undefined; } else { delete owner[ this.expando ]; } } }, hasData: function( owner ) { var cache = owner[ this.expando ]; return cache !== undefined && !jQuery.isEmptyObject( cache ); } }; var dataPriv = new Data(); var dataUser = new Data(); // Implementation Summary // // 1. Enforce API surface and semantic compatibility with 1.9.x branch // 2. Improve the module's maintainability by reducing the storage // paths to a single mechanism. // 3. Use the same single mechanism to support "private" and "user" data. // 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) // 5. Avoid exposing implementation details on user objects (eg. expando properties) // 6. Provide a clear path for implementation upgrade to WeakMap in 2014 var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, rmultiDash = /[A-Z]/g; function getData( data ) { if ( data === "true" ) { return true; } if ( data === "false" ) { return false; } if ( data === "null" ) { return null; } // Only convert to a number if it doesn't change the string if ( data === +data + "" ) { return +data; } if ( rbrace.test( data ) ) { return JSON.parse( data ); } return data; } function dataAttr( elem, key, data ) { var name; // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); data = elem.getAttribute( name ); if ( typeof data === "string" ) { try { data = getData( data ); } catch ( e ) {} // Make sure we set the data so it isn't changed later dataUser.set( elem, key, data ); } else { data = undefined; } } return data; } jQuery.extend( { hasData: function( elem ) { return dataUser.hasData( elem ) || dataPriv.hasData( elem ); }, data: function( elem, name, data ) { return dataUser.access( elem, name, data ); }, removeData: function( elem, name ) { dataUser.remove( elem, name ); }, // TODO: Now that all calls to _data and _removeData have been replaced // with direct calls to dataPriv methods, these can be deprecated. _data: function( elem, name, data ) { return dataPriv.access( elem, name, data ); }, _removeData: function( elem, name ) { dataPriv.remove( elem, name ); } } ); jQuery.fn.extend( { data: function( key, value ) { var i, name, data, elem = this[ 0 ], attrs = elem && elem.attributes; // Gets all values if ( key === undefined ) { if ( this.length ) { data = dataUser.get( elem ); if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { i = attrs.length; while ( i-- ) { // Support: IE 11 only // The attrs elements can be null (#14894) if ( attrs[ i ] ) { name = attrs[ i ].name; if ( name.indexOf( "data-" ) === 0 ) { name = camelCase( name.slice( 5 ) ); dataAttr( elem, name, data[ name ] ); } } } dataPriv.set( elem, "hasDataAttrs", true ); } } return data; } // Sets multiple values if ( typeof key === "object" ) { return this.each( function() { dataUser.set( this, key ); } ); } return access( this, function( value ) { var data; // The calling jQuery object (element matches) is not empty // (and therefore has an element appears at this[ 0 ]) and the // `value` parameter was not undefined. An empty jQuery object // will result in `undefined` for elem = this[ 0 ] which will // throw an exception if an attempt to read a data cache is made. if ( elem && value === undefined ) { // Attempt to get data from the cache // The key will always be camelCased in Data data = dataUser.get( elem, key ); if ( data !== undefined ) { return data; } // Attempt to "discover" the data in // HTML5 custom data-* attrs data = dataAttr( elem, key ); if ( data !== undefined ) { return data; } // We tried really hard, but the data doesn't exist. return; } // Set the data... this.each( function() { // We always store the camelCased key dataUser.set( this, key, value ); } ); }, null, value, arguments.length > 1, null, true ); }, removeData: function( key ) { return this.each( function() { dataUser.remove( this, key ); } ); } } ); jQuery.extend( { queue: function( elem, type, data ) { var queue; if ( elem ) { type = ( type || "fx" ) + "queue"; queue = dataPriv.get( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { if ( !queue || Array.isArray( data ) ) { queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); } else { queue.push( data ); } } return queue || []; } }, dequeue: function( elem, type ) { type = type || "fx"; var queue = jQuery.queue( elem, type ), startLength = queue.length, fn = queue.shift(), hooks = jQuery._queueHooks( elem, type ), next = function() { jQuery.dequeue( elem, type ); }; // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); startLength--; } if ( fn ) { // Add a progress sentinel to prevent the fx queue from being // automatically dequeued if ( type === "fx" ) { queue.unshift( "inprogress" ); } // Clear up the last queue stop function delete hooks.stop; fn.call( elem, next, hooks ); } if ( !startLength && hooks ) { hooks.empty.fire(); } }, // Not public - generate a queueHooks object, or return the current one _queueHooks: function( elem, type ) { var key = type + "queueHooks"; return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { empty: jQuery.Callbacks( "once memory" ).add( function() { dataPriv.remove( elem, [ type + "queue", key ] ); } ) } ); } } ); jQuery.fn.extend( { queue: function( type, data ) { var setter = 2; if ( typeof type !== "string" ) { data = type; type = "fx"; setter--; } if ( arguments.length < setter ) { return jQuery.queue( this[ 0 ], type ); } return data === undefined ? this : this.each( function() { var queue = jQuery.queue( this, type, data ); // Ensure a hooks for this queue jQuery._queueHooks( this, type ); if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { jQuery.dequeue( this, type ); } } ); }, dequeue: function( type ) { return this.each( function() { jQuery.dequeue( this, type ); } ); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); }, // Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, obj ) { var tmp, count = 1, defer = jQuery.Deferred(), elements = this, i = this.length, resolve = function() { if ( !( --count ) ) { defer.resolveWith( elements, [ elements ] ); } }; if ( typeof type !== "string" ) { obj = type; type = undefined; } type = type || "fx"; while ( i-- ) { tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); if ( tmp && tmp.empty ) { count++; tmp.empty.add( resolve ); } } resolve(); return defer.promise( obj ); } } ); var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; var isHiddenWithinTree = function( elem, el ) { // isHiddenWithinTree might be called from jQuery#filter function; // in that case, element will be second argument elem = el || elem; // Inline style trumps all return elem.style.display === "none" || elem.style.display === "" && // Otherwise, check computed style // Support: Firefox <=43 - 45 // Disconnected elements can have computed display: none, so first confirm that elem is // in the document. jQuery.contains( elem.ownerDocument, elem ) && jQuery.css( elem, "display" ) === "none"; }; var swap = function( elem, options, callback, args ) { var ret, name, old = {}; // Remember the old values, and insert the new ones for ( name in options ) { old[ name ] = elem.style[ name ]; elem.style[ name ] = options[ name ]; } ret = callback.apply( elem, args || [] ); // Revert the old values for ( name in options ) { elem.style[ name ] = old[ name ]; } return ret; }; function adjustCSS( elem, prop, valueParts, tween ) { var adjusted, scale, maxIterations = 20, currentValue = tween ? function() { return tween.cur(); } : function() { return jQuery.css( elem, prop, "" ); }, initial = currentValue(), unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), // Starting value computation is required for potential unit mismatches initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && rcssNum.exec( jQuery.css( elem, prop ) ); if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { // Support: Firefox <=54 // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) initial = initial / 2; // Trust units reported by jQuery.css unit = unit || initialInUnit[ 3 ]; // Iteratively approximate from a nonzero starting point initialInUnit = +initial || 1; while ( maxIterations-- ) { // Evaluate and update our best guess (doubling guesses that zero out). // Finish if the scale equals or crosses 1 (making the old*new product non-positive). jQuery.style( elem, prop, initialInUnit + unit ); if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { maxIterations = 0; } initialInUnit = initialInUnit / scale; } initialInUnit = initialInUnit * 2; jQuery.style( elem, prop, initialInUnit + unit ); // Make sure we update the tween properties later on valueParts = valueParts || []; } if ( valueParts ) { initialInUnit = +initialInUnit || +initial || 0; // Apply relative offset (+=/-=) if specified adjusted = valueParts[ 1 ] ? initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : +valueParts[ 2 ]; if ( tween ) { tween.unit = unit; tween.start = initialInUnit; tween.end = adjusted; } } return adjusted; } var defaultDisplayMap = {}; function getDefaultDisplay( elem ) { var temp, doc = elem.ownerDocument, nodeName = elem.nodeName, display = defaultDisplayMap[ nodeName ]; if ( display ) { return display; } temp = doc.body.appendChild( doc.createElement( nodeName ) ); display = jQuery.css( temp, "display" ); temp.parentNode.removeChild( temp ); if ( display === "none" ) { display = "block"; } defaultDisplayMap[ nodeName ] = display; return display; } function showHide( elements, show ) { var display, elem, values = [], index = 0, length = elements.length; // Determine new display value for elements that need to change for ( ; index < length; index++ ) { elem = elements[ index ]; if ( !elem.style ) { continue; } display = elem.style.display; if ( show ) { // Since we force visibility upon cascade-hidden elements, an immediate (and slow) // check is required in this first loop unless we have a nonempty display value (either // inline or about-to-be-restored) if ( display === "none" ) { values[ index ] = dataPriv.get( elem, "display" ) || null; if ( !values[ index ] ) { elem.style.display = ""; } } if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { values[ index ] = getDefaultDisplay( elem ); } } else { if ( display !== "none" ) { values[ index ] = "none"; // Remember what we're overwriting dataPriv.set( elem, "display", display ); } } } // Set the display of the elements in a second loop to avoid constant reflow for ( index = 0; index < length; index++ ) { if ( values[ index ] != null ) { elements[ index ].style.display = values[ index ]; } } return elements; } jQuery.fn.extend( { show: function() { return showHide( this, true ); }, hide: function() { return showHide( this ); }, toggle: function( state ) { if ( typeof state === "boolean" ) { return state ? this.show() : this.hide(); } return this.each( function() { if ( isHiddenWithinTree( this ) ) { jQuery( this ).show(); } else { jQuery( this ).hide(); } } ); } } ); var rcheckableType = ( /^(?:checkbox|radio)$/i ); var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); // We have to close these tags to support XHTML (#13200) var wrapMap = { // Support: IE <=9 only option: [ 1, "" ], // XHTML parsers do not magically insert elements in the // same way that tag soup parsers do. So we cannot shorten // this by omitting or other required elements. thead: [ 1, "", "
" ], col: [ 2, "", "
" ], tr: [ 2, "", "
" ], td: [ 3, "", "
" ], _default: [ 0, "", "" ] }; // Support: IE <=9 only wrapMap.optgroup = wrapMap.option; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; function getAll( context, tag ) { // Support: IE <=9 - 11 only // Use typeof to avoid zero-argument method invocation on host objects (#15151) var ret; if ( typeof context.getElementsByTagName !== "undefined" ) { ret = context.getElementsByTagName( tag || "*" ); } else if ( typeof context.querySelectorAll !== "undefined" ) { ret = context.querySelectorAll( tag || "*" ); } else { ret = []; } if ( tag === undefined || tag && nodeName( context, tag ) ) { return jQuery.merge( [ context ], ret ); } return ret; } // Mark scripts as having already been evaluated function setGlobalEval( elems, refElements ) { var i = 0, l = elems.length; for ( ; i < l; i++ ) { dataPriv.set( elems[ i ], "globalEval", !refElements || dataPriv.get( refElements[ i ], "globalEval" ) ); } } var rhtml = /<|&#?\w+;/; function buildFragment( elems, context, scripts, selection, ignored ) { var elem, tmp, tag, wrap, contains, j, fragment = context.createDocumentFragment(), nodes = [], i = 0, l = elems.length; for ( ; i < l; i++ ) { elem = elems[ i ]; if ( elem || elem === 0 ) { // Add nodes directly if ( toType( elem ) === "object" ) { // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); // Convert non-html into a text node } else if ( !rhtml.test( elem ) ) { nodes.push( context.createTextNode( elem ) ); // Convert html into DOM nodes } else { tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); // Deserialize a standard representation tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); wrap = wrapMap[ tag ] || wrapMap._default; tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; // Descend through wrappers to the right content j = wrap[ 0 ]; while ( j-- ) { tmp = tmp.lastChild; } // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( nodes, tmp.childNodes ); // Remember the top-level container tmp = fragment.firstChild; // Ensure the created nodes are orphaned (#12392) tmp.textContent = ""; } } } // Remove wrapper from fragment fragment.textContent = ""; i = 0; while ( ( elem = nodes[ i++ ] ) ) { // Skip elements already in the context collection (trac-4087) if ( selection && jQuery.inArray( elem, selection ) > -1 ) { if ( ignored ) { ignored.push( elem ); } continue; } contains = jQuery.contains( elem.ownerDocument, elem ); // Append to fragment tmp = getAll( fragment.appendChild( elem ), "script" ); // Preserve script evaluation history if ( contains ) { setGlobalEval( tmp ); } // Capture executables if ( scripts ) { j = 0; while ( ( elem = tmp[ j++ ] ) ) { if ( rscriptType.test( elem.type || "" ) ) { scripts.push( elem ); } } } } return fragment; } ( function() { var fragment = document.createDocumentFragment(), div = fragment.appendChild( document.createElement( "div" ) ), input = document.createElement( "input" ); // Support: Android 4.0 - 4.3 only // Check state lost if the name is set (#11217) // Support: Windows Web Apps (WWA) // `name` and `type` must use .setAttribute for WWA (#14901) input.setAttribute( "type", "radio" ); input.setAttribute( "checked", "checked" ); input.setAttribute( "name", "t" ); div.appendChild( input ); // Support: Android <=4.1 only // Older WebKit doesn't clone checked state correctly in fragments support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; // Support: IE <=11 only // Make sure textarea (and checkbox) defaultValue is properly cloned div.innerHTML = ""; support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; } )(); var documentElement = document.documentElement; var rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, rtypenamespace = /^([^.]*)(?:\.(.+)|)/; function returnTrue() { return true; } function returnFalse() { return false; } // Support: IE <=9 only // See #13393 for more info function safeActiveElement() { try { return document.activeElement; } catch ( err ) { } } function on( elem, types, selector, data, fn, one ) { var origFn, type; // Types can be a map of types/handlers if ( typeof types === "object" ) { // ( types-Object, selector, data ) if ( typeof selector !== "string" ) { // ( types-Object, data ) data = data || selector; selector = undefined; } for ( type in types ) { on( elem, type, selector, data, types[ type ], one ); } return elem; } if ( data == null && fn == null ) { // ( types, fn ) fn = selector; data = selector = undefined; } else if ( fn == null ) { if ( typeof selector === "string" ) { // ( types, selector, fn ) fn = data; data = undefined; } else { // ( types, data, fn ) fn = data; data = selector; selector = undefined; } } if ( fn === false ) { fn = returnFalse; } else if ( !fn ) { return elem; } if ( one === 1 ) { origFn = fn; fn = function( event ) { // Can use an empty set, since event contains the info jQuery().off( event ); return origFn.apply( this, arguments ); }; // Use same guid so caller can remove using origFn fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); } return elem.each( function() { jQuery.event.add( this, types, fn, data, selector ); } ); } /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { global: {}, add: function( elem, types, handler, data, selector ) { var handleObjIn, eventHandle, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, elemData = dataPriv.get( elem ); // Don't attach events to noData or text/comment nodes (but allow plain objects) if ( !elemData ) { return; } // Caller can pass in an object of custom data in lieu of the handler if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; selector = handleObjIn.selector; } // Ensure that invalid selectors throw exceptions at attach time // Evaluate against documentElement in case elem is a non-element node (e.g., document) if ( selector ) { jQuery.find.matchesSelector( documentElement, selector ); } // Make sure that the handler has a unique ID, used to find/remove it later if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first if ( !( events = elemData.events ) ) { events = elemData.events = {}; } if ( !( eventHandle = elemData.handle ) ) { eventHandle = elemData.handle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? jQuery.event.dispatch.apply( elem, arguments ) : undefined; }; } // Handle multiple events separated by a space types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[ t ] ) || []; type = origType = tmp[ 1 ]; namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); // There *must* be a type, no attaching namespace-only handlers if ( !type ) { continue; } // If event changes its type, use the special event handlers for the changed type special = jQuery.event.special[ type ] || {}; // If selector defined, determine special event api type, otherwise given type type = ( selector ? special.delegateType : special.bindType ) || type; // Update special based on newly reset type special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers handleObj = jQuery.extend( { type: type, origType: origType, data: data, handler: handler, guid: handler.guid, selector: selector, needsContext: selector && jQuery.expr.match.needsContext.test( selector ), namespace: namespaces.join( "." ) }, handleObjIn ); // Init the event handler queue if we're the first if ( !( handlers = events[ type ] ) ) { handlers = events[ type ] = []; handlers.delegateCount = 0; // Only use addEventListener if the special events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle ); } } } if ( special.add ) { special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; } } // Add to the element's handler list, delegates in front if ( selector ) { handlers.splice( handlers.delegateCount++, 0, handleObj ); } else { handlers.push( handleObj ); } // Keep track of which events have ever been used, for event optimization jQuery.event.global[ type ] = true; } }, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { var j, origCount, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); if ( !elemData || !( events = elemData.events ) ) { return; } // Once for each type.namespace in types; type may be omitted types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[ t ] ) || []; type = origType = tmp[ 1 ]; namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); // Unbind all events (on this namespace, if provided) for the element if ( !type ) { for ( type in events ) { jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } special = jQuery.event.special[ type ] || {}; type = ( selector ? special.delegateType : special.bindType ) || type; handlers = events[ type ] || []; tmp = tmp[ 2 ] && new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); // Remove matching events origCount = j = handlers.length; while ( j-- ) { handleObj = handlers[ j ]; if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !tmp || tmp.test( handleObj.namespace ) ) && ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { handlers.splice( j, 1 ); if ( handleObj.selector ) { handlers.delegateCount--; } if ( special.remove ) { special.remove.call( elem, handleObj ); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( origCount && !handlers.length ) { if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } delete events[ type ]; } } // Remove data and the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { dataPriv.remove( elem, "handle events" ); } }, dispatch: function( nativeEvent ) { // Make a writable jQuery.Event from the native event object var event = jQuery.event.fix( nativeEvent ); var i, j, ret, matched, handleObj, handlerQueue, args = new Array( arguments.length ), handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], special = jQuery.event.special[ event.type ] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event args[ 0 ] = event; for ( i = 1; i < arguments.length; i++ ) { args[ i ] = arguments[ i ]; } event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { return; } // Determine handlers handlerQueue = jQuery.event.handlers.call( this, event, handlers ); // Run delegates first; they may want to stop propagation beneath us i = 0; while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { event.currentTarget = matched.elem; j = 0; while ( ( handleObj = matched.handlers[ j++ ] ) && !event.isImmediatePropagationStopped() ) { // Triggered event must either 1) have no namespace, or 2) have namespace(s) // a subset or equal to those in the bound event (both can have no namespace). if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { event.handleObj = handleObj; event.data = handleObj.data; ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || handleObj.handler ).apply( matched.elem, args ); if ( ret !== undefined ) { if ( ( event.result = ret ) === false ) { event.preventDefault(); event.stopPropagation(); } } } } } // Call the postDispatch hook for the mapped type if ( special.postDispatch ) { special.postDispatch.call( this, event ); } return event.result; }, handlers: function( event, handlers ) { var i, handleObj, sel, matchedHandlers, matchedSelectors, handlerQueue = [], delegateCount = handlers.delegateCount, cur = event.target; // Find delegate handlers if ( delegateCount && // Support: IE <=9 // Black-hole SVG instance trees (trac-13180) cur.nodeType && // Support: Firefox <=42 // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click // Support: IE 11 only // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) !( event.type === "click" && event.button >= 1 ) ) { for ( ; cur !== this; cur = cur.parentNode || this ) { // Don't check non-elements (#13208) // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { matchedHandlers = []; matchedSelectors = {}; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; // Don't conflict with Object.prototype properties (#13203) sel = handleObj.selector + " "; if ( matchedSelectors[ sel ] === undefined ) { matchedSelectors[ sel ] = handleObj.needsContext ? jQuery( sel, this ).index( cur ) > -1 : jQuery.find( sel, this, null, [ cur ] ).length; } if ( matchedSelectors[ sel ] ) { matchedHandlers.push( handleObj ); } } if ( matchedHandlers.length ) { handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); } } } } // Add the remaining (directly-bound) handlers cur = this; if ( delegateCount < handlers.length ) { handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); } return handlerQueue; }, addProp: function( name, hook ) { Object.defineProperty( jQuery.Event.prototype, name, { enumerable: true, configurable: true, get: isFunction( hook ) ? function() { if ( this.originalEvent ) { return hook( this.originalEvent ); } } : function() { if ( this.originalEvent ) { return this.originalEvent[ name ]; } }, set: function( value ) { Object.defineProperty( this, name, { enumerable: true, configurable: true, writable: true, value: value } ); } } ); }, fix: function( originalEvent ) { return originalEvent[ jQuery.expando ] ? originalEvent : new jQuery.Event( originalEvent ); }, special: { load: { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, focus: { // Fire native event if possible so blur/focus sequence is correct trigger: function() { if ( this !== safeActiveElement() && this.focus ) { this.focus(); return false; } }, delegateType: "focusin" }, blur: { trigger: function() { if ( this === safeActiveElement() && this.blur ) { this.blur(); return false; } }, delegateType: "focusout" }, click: { // For checkbox, fire native event so checked state will be right trigger: function() { if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { this.click(); return false; } }, // For cross-browser consistency, don't fire native .click() on links _default: function( event ) { return nodeName( event.target, "a" ); } }, beforeunload: { postDispatch: function( event ) { // Support: Firefox 20+ // Firefox doesn't alert if the returnValue field is not set. if ( event.result !== undefined && event.originalEvent ) { event.originalEvent.returnValue = event.result; } } } } }; jQuery.removeEvent = function( elem, type, handle ) { // This "if" is needed for plain objects if ( elem.removeEventListener ) { elem.removeEventListener( type, handle ); } }; jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword if ( !( this instanceof jQuery.Event ) ) { return new jQuery.Event( src, props ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined && // Support: Android <=2.3 only src.returnValue === false ? returnTrue : returnFalse; // Create target properties // Support: Safari <=6 - 7 only // Target should not be a text node (#504, #13143) this.target = ( src.target && src.target.nodeType === 3 ) ? src.target.parentNode : src.target; this.currentTarget = src.currentTarget; this.relatedTarget = src.relatedTarget; // Event type } else { this.type = src; } // Put explicitly provided properties onto the event object if ( props ) { jQuery.extend( this, props ); } // Create a timestamp if incoming event doesn't have one this.timeStamp = src && src.timeStamp || Date.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { constructor: jQuery.Event, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse, isSimulated: false, preventDefault: function() { var e = this.originalEvent; this.isDefaultPrevented = returnTrue; if ( e && !this.isSimulated ) { e.preventDefault(); } }, stopPropagation: function() { var e = this.originalEvent; this.isPropagationStopped = returnTrue; if ( e && !this.isSimulated ) { e.stopPropagation(); } }, stopImmediatePropagation: function() { var e = this.originalEvent; this.isImmediatePropagationStopped = returnTrue; if ( e && !this.isSimulated ) { e.stopImmediatePropagation(); } this.stopPropagation(); } }; // Includes all common event props including KeyEvent and MouseEvent specific props jQuery.each( { altKey: true, bubbles: true, cancelable: true, changedTouches: true, ctrlKey: true, detail: true, eventPhase: true, metaKey: true, pageX: true, pageY: true, shiftKey: true, view: true, "char": true, charCode: true, key: true, keyCode: true, button: true, buttons: true, clientX: true, clientY: true, offsetX: true, offsetY: true, pointerId: true, pointerType: true, screenX: true, screenY: true, targetTouches: true, toElement: true, touches: true, which: function( event ) { var button = event.button; // Add which for key events if ( event.which == null && rkeyEvent.test( event.type ) ) { return event.charCode != null ? event.charCode : event.keyCode; } // Add which for click: 1 === left; 2 === middle; 3 === right if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { if ( button & 1 ) { return 1; } if ( button & 2 ) { return 3; } if ( button & 4 ) { return 2; } return 0; } return event.which; } }, jQuery.event.addProp ); // Create mouseenter/leave events using mouseover/out and event-time checks // so that event delegation works in jQuery. // Do the same for pointerenter/pointerleave and pointerover/pointerout // // Support: Safari 7 only // Safari sends mouseenter too often; see: // https://bugs.chromium.org/p/chromium/issues/detail?id=470258 // for the description of the bug (it existed in older Chrome versions as well). jQuery.each( { mouseenter: "mouseover", mouseleave: "mouseout", pointerenter: "pointerover", pointerleave: "pointerout" }, function( orig, fix ) { jQuery.event.special[ orig ] = { delegateType: fix, bindType: fix, handle: function( event ) { var ret, target = this, related = event.relatedTarget, handleObj = event.handleObj; // For mouseenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; } }; } ); jQuery.fn.extend( { on: function( types, selector, data, fn ) { return on( this, types, selector, data, fn ); }, one: function( types, selector, data, fn ) { return on( this, types, selector, data, fn, 1 ); }, off: function( types, selector, fn ) { var handleObj, type; if ( types && types.preventDefault && types.handleObj ) { // ( event ) dispatched jQuery.Event handleObj = types.handleObj; jQuery( types.delegateTarget ).off( handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler ); return this; } if ( typeof types === "object" ) { // ( types-object [, selector] ) for ( type in types ) { this.off( type, selector, types[ type ] ); } return this; } if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; } if ( fn === false ) { fn = returnFalse; } return this.each( function() { jQuery.event.remove( this, types, fn, selector ); } ); } } ); var /* eslint-disable max-len */ // See https://github.com/eslint/eslint/issues/3229 rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, /* eslint-enable */ // Support: IE <=10 - 11, Edge 12 - 13 only // In IE/Edge using regex groups here causes severe slowdowns. // See https://connect.microsoft.com/IE/feedback/details/1736512/ rnoInnerhtml = /\s*$/g; // Prefer a tbody over its parent table for containing new rows function manipulationTarget( elem, content ) { if ( nodeName( elem, "table" ) && nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { return jQuery( elem ).children( "tbody" )[ 0 ] || elem; } return elem; } // Replace/restore the type attribute of script elements for safe DOM manipulation function disableScript( elem ) { elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; return elem; } function restoreScript( elem ) { if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { elem.type = elem.type.slice( 5 ); } else { elem.removeAttribute( "type" ); } return elem; } function cloneCopyEvent( src, dest ) { var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; if ( dest.nodeType !== 1 ) { return; } // 1. Copy private data: events, handlers, etc. if ( dataPriv.hasData( src ) ) { pdataOld = dataPriv.access( src ); pdataCur = dataPriv.set( dest, pdataOld ); events = pdataOld.events; if ( events ) { delete pdataCur.handle; pdataCur.events = {}; for ( type in events ) { for ( i = 0, l = events[ type ].length; i < l; i++ ) { jQuery.event.add( dest, type, events[ type ][ i ] ); } } } } // 2. Copy user data if ( dataUser.hasData( src ) ) { udataOld = dataUser.access( src ); udataCur = jQuery.extend( {}, udataOld ); dataUser.set( dest, udataCur ); } } // Fix IE bugs, see support tests function fixInput( src, dest ) { var nodeName = dest.nodeName.toLowerCase(); // Fails to persist the checked state of a cloned checkbox or radio button. if ( nodeName === "input" && rcheckableType.test( src.type ) ) { dest.checked = src.checked; // Fails to return the selected option to the default selected state when cloning options } else if ( nodeName === "input" || nodeName === "textarea" ) { dest.defaultValue = src.defaultValue; } } function domManip( collection, args, callback, ignored ) { // Flatten any nested arrays args = concat.apply( [], args ); var fragment, first, scripts, hasScripts, node, doc, i = 0, l = collection.length, iNoClone = l - 1, value = args[ 0 ], valueIsFunction = isFunction( value ); // We can't cloneNode fragments that contain checked, in WebKit if ( valueIsFunction || ( l > 1 && typeof value === "string" && !support.checkClone && rchecked.test( value ) ) ) { return collection.each( function( index ) { var self = collection.eq( index ); if ( valueIsFunction ) { args[ 0 ] = value.call( this, index, self.html() ); } domManip( self, args, callback, ignored ); } ); } if ( l ) { fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); first = fragment.firstChild; if ( fragment.childNodes.length === 1 ) { fragment = first; } // Require either new content or an interest in ignored elements to invoke the callback if ( first || ignored ) { scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); hasScripts = scripts.length; // Use the original fragment for the last item // instead of the first because it can end up // being emptied incorrectly in certain situations (#8070). for ( ; i < l; i++ ) { node = fragment; if ( i !== iNoClone ) { node = jQuery.clone( node, true, true ); // Keep references to cloned scripts for later restoration if ( hasScripts ) { // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( scripts, getAll( node, "script" ) ); } } callback.call( collection[ i ], node, i ); } if ( hasScripts ) { doc = scripts[ scripts.length - 1 ].ownerDocument; // Reenable scripts jQuery.map( scripts, restoreScript ); // Evaluate executable scripts on first document insertion for ( i = 0; i < hasScripts; i++ ) { node = scripts[ i ]; if ( rscriptType.test( node.type || "" ) && !dataPriv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { // Optional AJAX dependency, but won't run scripts if not present if ( jQuery._evalUrl ) { jQuery._evalUrl( node.src ); } } else { DOMEval( node.textContent.replace( rcleanScript, "" ), doc, node ); } } } } } } return collection; } function remove( elem, selector, keepData ) { var node, nodes = selector ? jQuery.filter( selector, elem ) : elem, i = 0; for ( ; ( node = nodes[ i ] ) != null; i++ ) { if ( !keepData && node.nodeType === 1 ) { jQuery.cleanData( getAll( node ) ); } if ( node.parentNode ) { if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { setGlobalEval( getAll( node, "script" ) ); } node.parentNode.removeChild( node ); } } return elem; } jQuery.extend( { htmlPrefilter: function( html ) { return html.replace( rxhtmlTag, "<$1>" ); }, clone: function( elem, dataAndEvents, deepDataAndEvents ) { var i, l, srcElements, destElements, clone = elem.cloneNode( true ), inPage = jQuery.contains( elem.ownerDocument, elem ); // Fix IE cloning issues if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 destElements = getAll( clone ); srcElements = getAll( elem ); for ( i = 0, l = srcElements.length; i < l; i++ ) { fixInput( srcElements[ i ], destElements[ i ] ); } } // Copy the events from the original to the clone if ( dataAndEvents ) { if ( deepDataAndEvents ) { srcElements = srcElements || getAll( elem ); destElements = destElements || getAll( clone ); for ( i = 0, l = srcElements.length; i < l; i++ ) { cloneCopyEvent( srcElements[ i ], destElements[ i ] ); } } else { cloneCopyEvent( elem, clone ); } } // Preserve script evaluation history destElements = getAll( clone, "script" ); if ( destElements.length > 0 ) { setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); } // Return the cloned set return clone; }, cleanData: function( elems ) { var data, elem, type, special = jQuery.event.special, i = 0; for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { if ( acceptData( elem ) ) { if ( ( data = elem[ dataPriv.expando ] ) ) { if ( data.events ) { for ( type in data.events ) { if ( special[ type ] ) { jQuery.event.remove( elem, type ); // This is a shortcut to avoid jQuery.event.remove's overhead } else { jQuery.removeEvent( elem, type, data.handle ); } } } // Support: Chrome <=35 - 45+ // Assign undefined instead of using delete, see Data#remove elem[ dataPriv.expando ] = undefined; } if ( elem[ dataUser.expando ] ) { // Support: Chrome <=35 - 45+ // Assign undefined instead of using delete, see Data#remove elem[ dataUser.expando ] = undefined; } } } } } ); jQuery.fn.extend( { detach: function( selector ) { return remove( this, selector, true ); }, remove: function( selector ) { return remove( this, selector ); }, text: function( value ) { return access( this, function( value ) { return value === undefined ? jQuery.text( this ) : this.empty().each( function() { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { this.textContent = value; } } ); }, null, value, arguments.length ); }, append: function() { return domManip( this, arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.appendChild( elem ); } } ); }, prepend: function() { return domManip( this, arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.insertBefore( elem, target.firstChild ); } } ); }, before: function() { return domManip( this, arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this ); } } ); }, after: function() { return domManip( this, arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this.nextSibling ); } } ); }, empty: function() { var elem, i = 0; for ( ; ( elem = this[ i ] ) != null; i++ ) { if ( elem.nodeType === 1 ) { // Prevent memory leaks jQuery.cleanData( getAll( elem, false ) ); // Remove any remaining nodes elem.textContent = ""; } } return this; }, clone: function( dataAndEvents, deepDataAndEvents ) { dataAndEvents = dataAndEvents == null ? false : dataAndEvents; deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; return this.map( function() { return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); } ); }, html: function( value ) { return access( this, function( value ) { var elem = this[ 0 ] || {}, i = 0, l = this.length; if ( value === undefined && elem.nodeType === 1 ) { return elem.innerHTML; } // See if we can take a shortcut and just use innerHTML if ( typeof value === "string" && !rnoInnerhtml.test( value ) && !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { value = jQuery.htmlPrefilter( value ); try { for ( ; i < l; i++ ) { elem = this[ i ] || {}; // Remove element nodes and prevent memory leaks if ( elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem, false ) ); elem.innerHTML = value; } } elem = 0; // If using innerHTML throws an exception, use the fallback method } catch ( e ) {} } if ( elem ) { this.empty().append( value ); } }, null, value, arguments.length ); }, replaceWith: function() { var ignored = []; // Make the changes, replacing each non-ignored context element with the new content return domManip( this, arguments, function( elem ) { var parent = this.parentNode; if ( jQuery.inArray( this, ignored ) < 0 ) { jQuery.cleanData( getAll( this ) ); if ( parent ) { parent.replaceChild( elem, this ); } } // Force callback invocation }, ignored ); } } ); jQuery.each( { appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" }, function( name, original ) { jQuery.fn[ name ] = function( selector ) { var elems, ret = [], insert = jQuery( selector ), last = insert.length - 1, i = 0; for ( ; i <= last; i++ ) { elems = i === last ? this : this.clone( true ); jQuery( insert[ i ] )[ original ]( elems ); // Support: Android <=4.0 only, PhantomJS 1 only // .get() because push.apply(_, arraylike) throws on ancient WebKit push.apply( ret, elems.get() ); } return this.pushStack( ret ); }; } ); var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); var getStyles = function( elem ) { // Support: IE <=11 only, Firefox <=30 (#15098, #14150) // IE throws on elements created in popups // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" var view = elem.ownerDocument.defaultView; if ( !view || !view.opener ) { view = window; } return view.getComputedStyle( elem ); }; var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); ( function() { // Executing both pixelPosition & boxSizingReliable tests require only one layout // so they're executed at the same time to save the second computation. function computeStyleTests() { // This is a singleton, we need to execute it only once if ( !div ) { return; } container.style.cssText = "position:absolute;left:-11111px;width:60px;" + "margin-top:1px;padding:0;border:0"; div.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + "margin:auto;border:1px;padding:1px;" + "width:60%;top:1%"; documentElement.appendChild( container ).appendChild( div ); var divStyle = window.getComputedStyle( div ); pixelPositionVal = divStyle.top !== "1%"; // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 // Some styles come back with percentage values, even though they shouldn't div.style.right = "60%"; pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; // Support: IE 9 - 11 only // Detect misreporting of content dimensions for box-sizing:border-box elements boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; // Support: IE 9 only // Detect overflow:scroll screwiness (gh-3699) div.style.position = "absolute"; scrollboxSizeVal = div.offsetWidth === 36 || "absolute"; documentElement.removeChild( container ); // Nullify the div so it wouldn't be stored in the memory and // it will also be a sign that checks already performed div = null; } function roundPixelMeasures( measure ) { return Math.round( parseFloat( measure ) ); } var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, reliableMarginLeftVal, container = document.createElement( "div" ), div = document.createElement( "div" ); // Finish early in limited (non-browser) environments if ( !div.style ) { return; } // Support: IE <=9 - 11 only // Style of cloned element affects source element cloned (#8908) div.style.backgroundClip = "content-box"; div.cloneNode( true ).style.backgroundClip = ""; support.clearCloneStyle = div.style.backgroundClip === "content-box"; jQuery.extend( support, { boxSizingReliable: function() { computeStyleTests(); return boxSizingReliableVal; }, pixelBoxStyles: function() { computeStyleTests(); return pixelBoxStylesVal; }, pixelPosition: function() { computeStyleTests(); return pixelPositionVal; }, reliableMarginLeft: function() { computeStyleTests(); return reliableMarginLeftVal; }, scrollboxSize: function() { computeStyleTests(); return scrollboxSizeVal; } } ); } )(); function curCSS( elem, name, computed ) { var width, minWidth, maxWidth, ret, // Support: Firefox 51+ // Retrieving style before computed somehow // fixes an issue with getting wrong values // on detached elements style = elem.style; computed = computed || getStyles( elem ); // getPropertyValue is needed for: // .css('filter') (IE 9 only, #12537) // .css('--customProperty) (#3144) if ( computed ) { ret = computed.getPropertyValue( name ) || computed[ name ]; if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { ret = jQuery.style( elem, name ); } // A tribute to the "awesome hack by Dean Edwards" // Android Browser returns percentage for some values, // but width seems to be reliably pixels. // This is against the CSSOM draft spec: // https://drafts.csswg.org/cssom/#resolved-values if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { // Remember the original values width = style.width; minWidth = style.minWidth; maxWidth = style.maxWidth; // Put in the new values to get a computed value out style.minWidth = style.maxWidth = style.width = ret; ret = computed.width; // Revert the changed values style.width = width; style.minWidth = minWidth; style.maxWidth = maxWidth; } } return ret !== undefined ? // Support: IE <=9 - 11 only // IE returns zIndex value as an integer. ret + "" : ret; } function addGetHookIf( conditionFn, hookFn ) { // Define the hook, we'll check on the first run if it's really needed. return { get: function() { if ( conditionFn() ) { // Hook not needed (or it's not possible to use it due // to missing dependency), remove it. delete this.get; return; } // Hook needed; redefine it so that the support test is not executed again. return ( this.get = hookFn ).apply( this, arguments ); } }; } var // Swappable if display is none or starts with table // except "table", "table-cell", or "table-caption" // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display rdisplayswap = /^(none|table(?!-c[ea]).+)/, rcustomProp = /^--/, cssShow = { position: "absolute", visibility: "hidden", display: "block" }, cssNormalTransform = { letterSpacing: "0", fontWeight: "400" }, cssPrefixes = [ "Webkit", "Moz", "ms" ], emptyStyle = document.createElement( "div" ).style; // Return a css property mapped to a potentially vendor prefixed property function vendorPropName( name ) { // Shortcut for names that are not vendor prefixed if ( name in emptyStyle ) { return name; } // Check for vendor prefixed names var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), i = cssPrefixes.length; while ( i-- ) { name = cssPrefixes[ i ] + capName; if ( name in emptyStyle ) { return name; } } } // Return a property mapped along what jQuery.cssProps suggests or to // a vendor prefixed property. function finalPropName( name ) { var ret = jQuery.cssProps[ name ]; if ( !ret ) { ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; } return ret; } function setPositiveNumber( elem, value, subtract ) { // Any relative (+/-) values have already been // normalized at this point var matches = rcssNum.exec( value ); return matches ? // Guard against undefined "subtract", e.g., when used as in cssHooks Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : value; } function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { var i = dimension === "width" ? 1 : 0, extra = 0, delta = 0; // Adjustment may not be necessary if ( box === ( isBorderBox ? "border" : "content" ) ) { return 0; } for ( ; i < 4; i += 2 ) { // Both box models exclude margin if ( box === "margin" ) { delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); } // If we get here with a content-box, we're seeking "padding" or "border" or "margin" if ( !isBorderBox ) { // Add padding delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); // For "border" or "margin", add border if ( box !== "padding" ) { delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); // But still keep track of it otherwise } else { extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); } // If we get here with a border-box (content + padding + border), we're seeking "content" or // "padding" or "margin" } else { // For "content", subtract padding if ( box === "content" ) { delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); } // For "content" or "padding", subtract border if ( box !== "margin" ) { delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); } } } // Account for positive content-box scroll gutter when requested by providing computedVal if ( !isBorderBox && computedVal >= 0 ) { // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border // Assuming integer scroll gutter, subtract the rest and round down delta += Math.max( 0, Math.ceil( elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - computedVal - delta - extra - 0.5 ) ); } return delta; } function getWidthOrHeight( elem, dimension, extra ) { // Start with computed style var styles = getStyles( elem ), val = curCSS( elem, dimension, styles ), isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box", valueIsBorderBox = isBorderBox; // Support: Firefox <=54 // Return a confounding non-pixel value or feign ignorance, as appropriate. if ( rnumnonpx.test( val ) ) { if ( !extra ) { return val; } val = "auto"; } // Check for style in case a browser which returns unreliable values // for getComputedStyle silently falls back to the reliable elem.style valueIsBorderBox = valueIsBorderBox && ( support.boxSizingReliable() || val === elem.style[ dimension ] ); // Fall back to offsetWidth/offsetHeight when value is "auto" // This happens for inline elements with no explicit setting (gh-3571) // Support: Android <=4.1 - 4.3 only // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) if ( val === "auto" || !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) { val = elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ]; // offsetWidth/offsetHeight provide border-box values valueIsBorderBox = true; } // Normalize "" and auto val = parseFloat( val ) || 0; // Adjust for the element's box model return ( val + boxModelAdjustment( elem, dimension, extra || ( isBorderBox ? "border" : "content" ), valueIsBorderBox, styles, // Provide the current computed size to request scroll gutter calculation (gh-3589) val ) ) + "px"; } jQuery.extend( { // Add in style property hooks for overriding the default // behavior of getting and setting a style property cssHooks: { opacity: { get: function( elem, computed ) { if ( computed ) { // We should always get a number back from opacity var ret = curCSS( elem, "opacity" ); return ret === "" ? "1" : ret; } } } }, // Don't automatically add "px" to these possibly-unitless properties cssNumber: { "animationIterationCount": true, "columnCount": true, "fillOpacity": true, "flexGrow": true, "flexShrink": true, "fontWeight": true, "lineHeight": true, "opacity": true, "order": true, "orphans": true, "widows": true, "zIndex": true, "zoom": true }, // Add in properties whose names you wish to fix before // setting or getting the value cssProps: {}, // Get and set the style property on a DOM Node style: function( elem, name, value, extra ) { // Don't set styles on text and comment nodes if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { return; } // Make sure that we're working with the right name var ret, type, hooks, origName = camelCase( name ), isCustomProp = rcustomProp.test( name ), style = elem.style; // Make sure that we're working with the right name. We don't // want to query the value if it is a CSS custom property // since they are user-defined. if ( !isCustomProp ) { name = finalPropName( origName ); } // Gets hook for the prefixed version, then unprefixed version hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; // Check if we're setting a value if ( value !== undefined ) { type = typeof value; // Convert "+=" or "-=" to relative numbers (#7345) if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { value = adjustCSS( elem, name, ret ); // Fixes bug #9237 type = "number"; } // Make sure that null and NaN values aren't set (#7116) if ( value == null || value !== value ) { return; } // If a number was passed in, add the unit (except for certain CSS properties) if ( type === "number" ) { value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); } // background-* props affect original clone's values if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { style[ name ] = "inherit"; } // If a hook was provided, use that value, otherwise just set the specified value if ( !hooks || !( "set" in hooks ) || ( value = hooks.set( elem, value, extra ) ) !== undefined ) { if ( isCustomProp ) { style.setProperty( name, value ); } else { style[ name ] = value; } } } else { // If a hook was provided get the non-computed value from there if ( hooks && "get" in hooks && ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { return ret; } // Otherwise just get the value from the style object return style[ name ]; } }, css: function( elem, name, extra, styles ) { var val, num, hooks, origName = camelCase( name ), isCustomProp = rcustomProp.test( name ); // Make sure that we're working with the right name. We don't // want to modify the value if it is a CSS custom property // since they are user-defined. if ( !isCustomProp ) { name = finalPropName( origName ); } // Try prefixed name followed by the unprefixed name hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; // If a hook was provided get the computed value from there if ( hooks && "get" in hooks ) { val = hooks.get( elem, true, extra ); } // Otherwise, if a way to get the computed value exists, use that if ( val === undefined ) { val = curCSS( elem, name, styles ); } // Convert "normal" to computed value if ( val === "normal" && name in cssNormalTransform ) { val = cssNormalTransform[ name ]; } // Make numeric if forced or a qualifier was provided and val looks numeric if ( extra === "" || extra ) { num = parseFloat( val ); return extra === true || isFinite( num ) ? num || 0 : val; } return val; } } ); jQuery.each( [ "height", "width" ], function( i, dimension ) { jQuery.cssHooks[ dimension ] = { get: function( elem, computed, extra ) { if ( computed ) { // Certain elements can have dimension info if we invisibly show them // but it must have a current display style that would benefit return rdisplayswap.test( jQuery.css( elem, "display" ) ) && // Support: Safari 8+ // Table columns in Safari have non-zero offsetWidth & zero // getBoundingClientRect().width unless display is changed. // Support: IE <=11 only // Running getBoundingClientRect on a disconnected node // in IE throws an error. ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? swap( elem, cssShow, function() { return getWidthOrHeight( elem, dimension, extra ); } ) : getWidthOrHeight( elem, dimension, extra ); } }, set: function( elem, value, extra ) { var matches, styles = getStyles( elem ), isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box", subtract = extra && boxModelAdjustment( elem, dimension, extra, isBorderBox, styles ); // Account for unreliable border-box dimensions by comparing offset* to computed and // faking a content-box to get border and padding (gh-3699) if ( isBorderBox && support.scrollboxSize() === styles.position ) { subtract -= Math.ceil( elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - parseFloat( styles[ dimension ] ) - boxModelAdjustment( elem, dimension, "border", false, styles ) - 0.5 ); } // Convert to pixels if value adjustment is needed if ( subtract && ( matches = rcssNum.exec( value ) ) && ( matches[ 3 ] || "px" ) !== "px" ) { elem.style[ dimension ] = value; value = jQuery.css( elem, dimension ); } return setPositiveNumber( elem, value, subtract ); } }; } ); jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, function( elem, computed ) { if ( computed ) { return ( parseFloat( curCSS( elem, "marginLeft" ) ) || elem.getBoundingClientRect().left - swap( elem, { marginLeft: 0 }, function() { return elem.getBoundingClientRect().left; } ) ) + "px"; } } ); // These hooks are used by animate to expand properties jQuery.each( { margin: "", padding: "", border: "Width" }, function( prefix, suffix ) { jQuery.cssHooks[ prefix + suffix ] = { expand: function( value ) { var i = 0, expanded = {}, // Assumes a single number if not a string parts = typeof value === "string" ? value.split( " " ) : [ value ]; for ( ; i < 4; i++ ) { expanded[ prefix + cssExpand[ i ] + suffix ] = parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; } return expanded; } }; if ( prefix !== "margin" ) { jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; } } ); jQuery.fn.extend( { css: function( name, value ) { return access( this, function( elem, name, value ) { var styles, len, map = {}, i = 0; if ( Array.isArray( name ) ) { styles = getStyles( elem ); len = name.length; for ( ; i < len; i++ ) { map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); } return map; } return value !== undefined ? jQuery.style( elem, name, value ) : jQuery.css( elem, name ); }, name, value, arguments.length > 1 ); } } ); function Tween( elem, options, prop, end, easing ) { return new Tween.prototype.init( elem, options, prop, end, easing ); } jQuery.Tween = Tween; Tween.prototype = { constructor: Tween, init: function( elem, options, prop, end, easing, unit ) { this.elem = elem; this.prop = prop; this.easing = easing || jQuery.easing._default; this.options = options; this.start = this.now = this.cur(); this.end = end; this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); }, cur: function() { var hooks = Tween.propHooks[ this.prop ]; return hooks && hooks.get ? hooks.get( this ) : Tween.propHooks._default.get( this ); }, run: function( percent ) { var eased, hooks = Tween.propHooks[ this.prop ]; if ( this.options.duration ) { this.pos = eased = jQuery.easing[ this.easing ]( percent, this.options.duration * percent, 0, 1, this.options.duration ); } else { this.pos = eased = percent; } this.now = ( this.end - this.start ) * eased + this.start; if ( this.options.step ) { this.options.step.call( this.elem, this.now, this ); } if ( hooks && hooks.set ) { hooks.set( this ); } else { Tween.propHooks._default.set( this ); } return this; } }; Tween.prototype.init.prototype = Tween.prototype; Tween.propHooks = { _default: { get: function( tween ) { var result; // Use a property on the element directly when it is not a DOM element, // or when there is no matching style property that exists. if ( tween.elem.nodeType !== 1 || tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { return tween.elem[ tween.prop ]; } // Passing an empty string as a 3rd parameter to .css will automatically // attempt a parseFloat and fallback to a string if the parse fails. // Simple values such as "10px" are parsed to Float; // complex values such as "rotate(1rad)" are returned as-is. result = jQuery.css( tween.elem, tween.prop, "" ); // Empty strings, null, undefined and "auto" are converted to 0. return !result || result === "auto" ? 0 : result; }, set: function( tween ) { // Use step hook for back compat. // Use cssHook if its there. // Use .style if available and use plain properties where available. if ( jQuery.fx.step[ tween.prop ] ) { jQuery.fx.step[ tween.prop ]( tween ); } else if ( tween.elem.nodeType === 1 && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) { jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); } else { tween.elem[ tween.prop ] = tween.now; } } } }; // Support: IE <=9 only // Panic based approach to setting things on disconnected nodes Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { set: function( tween ) { if ( tween.elem.nodeType && tween.elem.parentNode ) { tween.elem[ tween.prop ] = tween.now; } } }; jQuery.easing = { linear: function( p ) { return p; }, swing: function( p ) { return 0.5 - Math.cos( p * Math.PI ) / 2; }, _default: "swing" }; jQuery.fx = Tween.prototype.init; // Back compat <1.8 extension point jQuery.fx.step = {}; var fxNow, inProgress, rfxtypes = /^(?:toggle|show|hide)$/, rrun = /queueHooks$/; function schedule() { if ( inProgress ) { if ( document.hidden === false && window.requestAnimationFrame ) { window.requestAnimationFrame( schedule ); } else { window.setTimeout( schedule, jQuery.fx.interval ); } jQuery.fx.tick(); } } // Animations created synchronously will run synchronously function createFxNow() { window.setTimeout( function() { fxNow = undefined; } ); return ( fxNow = Date.now() ); } // Generate parameters to create a standard animation function genFx( type, includeWidth ) { var which, i = 0, attrs = { height: type }; // If we include width, step value is 1 to do all cssExpand values, // otherwise step value is 2 to skip over Left and Right includeWidth = includeWidth ? 1 : 0; for ( ; i < 4; i += 2 - includeWidth ) { which = cssExpand[ i ]; attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; } if ( includeWidth ) { attrs.opacity = attrs.width = type; } return attrs; } function createTween( value, prop, animation ) { var tween, collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), index = 0, length = collection.length; for ( ; index < length; index++ ) { if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { // We're done with this property return tween; } } } function defaultPrefilter( elem, props, opts ) { var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, isBox = "width" in props || "height" in props, anim = this, orig = {}, style = elem.style, hidden = elem.nodeType && isHiddenWithinTree( elem ), dataShow = dataPriv.get( elem, "fxshow" ); // Queue-skipping animations hijack the fx hooks if ( !opts.queue ) { hooks = jQuery._queueHooks( elem, "fx" ); if ( hooks.unqueued == null ) { hooks.unqueued = 0; oldfire = hooks.empty.fire; hooks.empty.fire = function() { if ( !hooks.unqueued ) { oldfire(); } }; } hooks.unqueued++; anim.always( function() { // Ensure the complete handler is called before this completes anim.always( function() { hooks.unqueued--; if ( !jQuery.queue( elem, "fx" ).length ) { hooks.empty.fire(); } } ); } ); } // Detect show/hide animations for ( prop in props ) { value = props[ prop ]; if ( rfxtypes.test( value ) ) { delete props[ prop ]; toggle = toggle || value === "toggle"; if ( value === ( hidden ? "hide" : "show" ) ) { // Pretend to be hidden if this is a "show" and // there is still data from a stopped show/hide if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { hidden = true; // Ignore all other no-op show/hide data } else { continue; } } orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); } } // Bail out if this is a no-op like .hide().hide() propTween = !jQuery.isEmptyObject( props ); if ( !propTween && jQuery.isEmptyObject( orig ) ) { return; } // Restrict "overflow" and "display" styles during box animations if ( isBox && elem.nodeType === 1 ) { // Support: IE <=9 - 11, Edge 12 - 15 // Record all 3 overflow attributes because IE does not infer the shorthand // from identically-valued overflowX and overflowY and Edge just mirrors // the overflowX value there. opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; // Identify a display type, preferring old show/hide data over the CSS cascade restoreDisplay = dataShow && dataShow.display; if ( restoreDisplay == null ) { restoreDisplay = dataPriv.get( elem, "display" ); } display = jQuery.css( elem, "display" ); if ( display === "none" ) { if ( restoreDisplay ) { display = restoreDisplay; } else { // Get nonempty value(s) by temporarily forcing visibility showHide( [ elem ], true ); restoreDisplay = elem.style.display || restoreDisplay; display = jQuery.css( elem, "display" ); showHide( [ elem ] ); } } // Animate inline elements as inline-block if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { if ( jQuery.css( elem, "float" ) === "none" ) { // Restore the original display value at the end of pure show/hide animations if ( !propTween ) { anim.done( function() { style.display = restoreDisplay; } ); if ( restoreDisplay == null ) { display = style.display; restoreDisplay = display === "none" ? "" : display; } } style.display = "inline-block"; } } } if ( opts.overflow ) { style.overflow = "hidden"; anim.always( function() { style.overflow = opts.overflow[ 0 ]; style.overflowX = opts.overflow[ 1 ]; style.overflowY = opts.overflow[ 2 ]; } ); } // Implement show/hide animations propTween = false; for ( prop in orig ) { // General show/hide setup for this element animation if ( !propTween ) { if ( dataShow ) { if ( "hidden" in dataShow ) { hidden = dataShow.hidden; } } else { dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); } // Store hidden/visible for toggle so `.stop().toggle()` "reverses" if ( toggle ) { dataShow.hidden = !hidden; } // Show elements before animating them if ( hidden ) { showHide( [ elem ], true ); } /* eslint-disable no-loop-func */ anim.done( function() { /* eslint-enable no-loop-func */ // The final step of a "hide" animation is actually hiding the element if ( !hidden ) { showHide( [ elem ] ); } dataPriv.remove( elem, "fxshow" ); for ( prop in orig ) { jQuery.style( elem, prop, orig[ prop ] ); } } ); } // Per-property setup propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); if ( !( prop in dataShow ) ) { dataShow[ prop ] = propTween.start; if ( hidden ) { propTween.end = propTween.start; propTween.start = 0; } } } } function propFilter( props, specialEasing ) { var index, name, easing, value, hooks; // camelCase, specialEasing and expand cssHook pass for ( index in props ) { name = camelCase( index ); easing = specialEasing[ name ]; value = props[ index ]; if ( Array.isArray( value ) ) { easing = value[ 1 ]; value = props[ index ] = value[ 0 ]; } if ( index !== name ) { props[ name ] = value; delete props[ index ]; } hooks = jQuery.cssHooks[ name ]; if ( hooks && "expand" in hooks ) { value = hooks.expand( value ); delete props[ name ]; // Not quite $.extend, this won't overwrite existing keys. // Reusing 'index' because we have the correct "name" for ( index in value ) { if ( !( index in props ) ) { props[ index ] = value[ index ]; specialEasing[ index ] = easing; } } } else { specialEasing[ name ] = easing; } } } function Animation( elem, properties, options ) { var result, stopped, index = 0, length = Animation.prefilters.length, deferred = jQuery.Deferred().always( function() { // Don't match elem in the :animated selector delete tick.elem; } ), tick = function() { if ( stopped ) { return false; } var currentTime = fxNow || createFxNow(), remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), // Support: Android 2.3 only // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) temp = remaining / animation.duration || 0, percent = 1 - temp, index = 0, length = animation.tweens.length; for ( ; index < length; index++ ) { animation.tweens[ index ].run( percent ); } deferred.notifyWith( elem, [ animation, percent, remaining ] ); // If there's more to do, yield if ( percent < 1 && length ) { return remaining; } // If this was an empty animation, synthesize a final progress notification if ( !length ) { deferred.notifyWith( elem, [ animation, 1, 0 ] ); } // Resolve the animation and report its conclusion deferred.resolveWith( elem, [ animation ] ); return false; }, animation = deferred.promise( { elem: elem, props: jQuery.extend( {}, properties ), opts: jQuery.extend( true, { specialEasing: {}, easing: jQuery.easing._default }, options ), originalProperties: properties, originalOptions: options, startTime: fxNow || createFxNow(), duration: options.duration, tweens: [], createTween: function( prop, end ) { var tween = jQuery.Tween( elem, animation.opts, prop, end, animation.opts.specialEasing[ prop ] || animation.opts.easing ); animation.tweens.push( tween ); return tween; }, stop: function( gotoEnd ) { var index = 0, // If we are going to the end, we want to run all the tweens // otherwise we skip this part length = gotoEnd ? animation.tweens.length : 0; if ( stopped ) { return this; } stopped = true; for ( ; index < length; index++ ) { animation.tweens[ index ].run( 1 ); } // Resolve when we played the last frame; otherwise, reject if ( gotoEnd ) { deferred.notifyWith( elem, [ animation, 1, 0 ] ); deferred.resolveWith( elem, [ animation, gotoEnd ] ); } else { deferred.rejectWith( elem, [ animation, gotoEnd ] ); } return this; } } ), props = animation.props; propFilter( props, animation.opts.specialEasing ); for ( ; index < length; index++ ) { result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); if ( result ) { if ( isFunction( result.stop ) ) { jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = result.stop.bind( result ); } return result; } } jQuery.map( props, createTween, animation ); if ( isFunction( animation.opts.start ) ) { animation.opts.start.call( elem, animation ); } // Attach callbacks from options animation .progress( animation.opts.progress ) .done( animation.opts.done, animation.opts.complete ) .fail( animation.opts.fail ) .always( animation.opts.always ); jQuery.fx.timer( jQuery.extend( tick, { elem: elem, anim: animation, queue: animation.opts.queue } ) ); return animation; } jQuery.Animation = jQuery.extend( Animation, { tweeners: { "*": [ function( prop, value ) { var tween = this.createTween( prop, value ); adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); return tween; } ] }, tweener: function( props, callback ) { if ( isFunction( props ) ) { callback = props; props = [ "*" ]; } else { props = props.match( rnothtmlwhite ); } var prop, index = 0, length = props.length; for ( ; index < length; index++ ) { prop = props[ index ]; Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; Animation.tweeners[ prop ].unshift( callback ); } }, prefilters: [ defaultPrefilter ], prefilter: function( callback, prepend ) { if ( prepend ) { Animation.prefilters.unshift( callback ); } else { Animation.prefilters.push( callback ); } } } ); jQuery.speed = function( speed, easing, fn ) { var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { complete: fn || !fn && easing || isFunction( speed ) && speed, duration: speed, easing: fn && easing || easing && !isFunction( easing ) && easing }; // Go to the end state if fx are off if ( jQuery.fx.off ) { opt.duration = 0; } else { if ( typeof opt.duration !== "number" ) { if ( opt.duration in jQuery.fx.speeds ) { opt.duration = jQuery.fx.speeds[ opt.duration ]; } else { opt.duration = jQuery.fx.speeds._default; } } } // Normalize opt.queue - true/undefined/null -> "fx" if ( opt.queue == null || opt.queue === true ) { opt.queue = "fx"; } // Queueing opt.old = opt.complete; opt.complete = function() { if ( isFunction( opt.old ) ) { opt.old.call( this ); } if ( opt.queue ) { jQuery.dequeue( this, opt.queue ); } }; return opt; }; jQuery.fn.extend( { fadeTo: function( speed, to, easing, callback ) { // Show any hidden elements after setting opacity to 0 return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() // Animate to the value specified .end().animate( { opacity: to }, speed, easing, callback ); }, animate: function( prop, speed, easing, callback ) { var empty = jQuery.isEmptyObject( prop ), optall = jQuery.speed( speed, easing, callback ), doAnimation = function() { // Operate on a copy of prop so per-property easing won't be lost var anim = Animation( this, jQuery.extend( {}, prop ), optall ); // Empty animations, or finishing resolves immediately if ( empty || dataPriv.get( this, "finish" ) ) { anim.stop( true ); } }; doAnimation.finish = doAnimation; return empty || optall.queue === false ? this.each( doAnimation ) : this.queue( optall.queue, doAnimation ); }, stop: function( type, clearQueue, gotoEnd ) { var stopQueue = function( hooks ) { var stop = hooks.stop; delete hooks.stop; stop( gotoEnd ); }; if ( typeof type !== "string" ) { gotoEnd = clearQueue; clearQueue = type; type = undefined; } if ( clearQueue && type !== false ) { this.queue( type || "fx", [] ); } return this.each( function() { var dequeue = true, index = type != null && type + "queueHooks", timers = jQuery.timers, data = dataPriv.get( this ); if ( index ) { if ( data[ index ] && data[ index ].stop ) { stopQueue( data[ index ] ); } } else { for ( index in data ) { if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { stopQueue( data[ index ] ); } } } for ( index = timers.length; index--; ) { if ( timers[ index ].elem === this && ( type == null || timers[ index ].queue === type ) ) { timers[ index ].anim.stop( gotoEnd ); dequeue = false; timers.splice( index, 1 ); } } // Start the next in the queue if the last step wasn't forced. // Timers currently will call their complete callbacks, which // will dequeue but only if they were gotoEnd. if ( dequeue || !gotoEnd ) { jQuery.dequeue( this, type ); } } ); }, finish: function( type ) { if ( type !== false ) { type = type || "fx"; } return this.each( function() { var index, data = dataPriv.get( this ), queue = data[ type + "queue" ], hooks = data[ type + "queueHooks" ], timers = jQuery.timers, length = queue ? queue.length : 0; // Enable finishing flag on private data data.finish = true; // Empty the queue first jQuery.queue( this, type, [] ); if ( hooks && hooks.stop ) { hooks.stop.call( this, true ); } // Look for any active animations, and finish them for ( index = timers.length; index--; ) { if ( timers[ index ].elem === this && timers[ index ].queue === type ) { timers[ index ].anim.stop( true ); timers.splice( index, 1 ); } } // Look for any animations in the old queue and finish them for ( index = 0; index < length; index++ ) { if ( queue[ index ] && queue[ index ].finish ) { queue[ index ].finish.call( this ); } } // Turn off finishing flag delete data.finish; } ); } } ); jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { var cssFn = jQuery.fn[ name ]; jQuery.fn[ name ] = function( speed, easing, callback ) { return speed == null || typeof speed === "boolean" ? cssFn.apply( this, arguments ) : this.animate( genFx( name, true ), speed, easing, callback ); }; } ); // Generate shortcuts for custom animations jQuery.each( { slideDown: genFx( "show" ), slideUp: genFx( "hide" ), slideToggle: genFx( "toggle" ), fadeIn: { opacity: "show" }, fadeOut: { opacity: "hide" }, fadeToggle: { opacity: "toggle" } }, function( name, props ) { jQuery.fn[ name ] = function( speed, easing, callback ) { return this.animate( props, speed, easing, callback ); }; } ); jQuery.timers = []; jQuery.fx.tick = function() { var timer, i = 0, timers = jQuery.timers; fxNow = Date.now(); for ( ; i < timers.length; i++ ) { timer = timers[ i ]; // Run the timer and safely remove it when done (allowing for external removal) if ( !timer() && timers[ i ] === timer ) { timers.splice( i--, 1 ); } } if ( !timers.length ) { jQuery.fx.stop(); } fxNow = undefined; }; jQuery.fx.timer = function( timer ) { jQuery.timers.push( timer ); jQuery.fx.start(); }; jQuery.fx.interval = 13; jQuery.fx.start = function() { if ( inProgress ) { return; } inProgress = true; schedule(); }; jQuery.fx.stop = function() { inProgress = null; }; jQuery.fx.speeds = { slow: 600, fast: 200, // Default speed _default: 400 }; // Based off of the plugin by Clint Helfers, with permission. // https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ jQuery.fn.delay = function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx"; return this.queue( type, function( next, hooks ) { var timeout = window.setTimeout( next, time ); hooks.stop = function() { window.clearTimeout( timeout ); }; } ); }; ( function() { var input = document.createElement( "input" ), select = document.createElement( "select" ), opt = select.appendChild( document.createElement( "option" ) ); input.type = "checkbox"; // Support: Android <=4.3 only // Default value for a checkbox should be "on" support.checkOn = input.value !== ""; // Support: IE <=11 only // Must access selectedIndex to make default options select support.optSelected = opt.selected; // Support: IE <=11 only // An input loses its value after becoming a radio input = document.createElement( "input" ); input.value = "t"; input.type = "radio"; support.radioValue = input.value === "t"; } )(); var boolHook, attrHandle = jQuery.expr.attrHandle; jQuery.fn.extend( { attr: function( name, value ) { return access( this, jQuery.attr, name, value, arguments.length > 1 ); }, removeAttr: function( name ) { return this.each( function() { jQuery.removeAttr( this, name ); } ); } } ); jQuery.extend( { attr: function( elem, name, value ) { var ret, hooks, nType = elem.nodeType; // Don't get/set attributes on text, comment and attribute nodes if ( nType === 3 || nType === 8 || nType === 2 ) { return; } // Fallback to prop when attributes are not supported if ( typeof elem.getAttribute === "undefined" ) { return jQuery.prop( elem, name, value ); } // Attribute hooks are determined by the lowercase version // Grab necessary hook if one is defined if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { hooks = jQuery.attrHooks[ name.toLowerCase() ] || ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); } if ( value !== undefined ) { if ( value === null ) { jQuery.removeAttr( elem, name ); return; } if ( hooks && "set" in hooks && ( ret = hooks.set( elem, value, name ) ) !== undefined ) { return ret; } elem.setAttribute( name, value + "" ); return value; } if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { return ret; } ret = jQuery.find.attr( elem, name ); // Non-existent attributes return null, we normalize to undefined return ret == null ? undefined : ret; }, attrHooks: { type: { set: function( elem, value ) { if ( !support.radioValue && value === "radio" && nodeName( elem, "input" ) ) { var val = elem.value; elem.setAttribute( "type", value ); if ( val ) { elem.value = val; } return value; } } } }, removeAttr: function( elem, value ) { var name, i = 0, // Attribute names can contain non-HTML whitespace characters // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 attrNames = value && value.match( rnothtmlwhite ); if ( attrNames && elem.nodeType === 1 ) { while ( ( name = attrNames[ i++ ] ) ) { elem.removeAttribute( name ); } } } } ); // Hooks for boolean attributes boolHook = { set: function( elem, value, name ) { if ( value === false ) { // Remove boolean attributes when set to false jQuery.removeAttr( elem, name ); } else { elem.setAttribute( name, name ); } return name; } }; jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { var getter = attrHandle[ name ] || jQuery.find.attr; attrHandle[ name ] = function( elem, name, isXML ) { var ret, handle, lowercaseName = name.toLowerCase(); if ( !isXML ) { // Avoid an infinite loop by temporarily removing this function from the getter handle = attrHandle[ lowercaseName ]; attrHandle[ lowercaseName ] = ret; ret = getter( elem, name, isXML ) != null ? lowercaseName : null; attrHandle[ lowercaseName ] = handle; } return ret; }; } ); var rfocusable = /^(?:input|select|textarea|button)$/i, rclickable = /^(?:a|area)$/i; jQuery.fn.extend( { prop: function( name, value ) { return access( this, jQuery.prop, name, value, arguments.length > 1 ); }, removeProp: function( name ) { return this.each( function() { delete this[ jQuery.propFix[ name ] || name ]; } ); } } ); jQuery.extend( { prop: function( elem, name, value ) { var ret, hooks, nType = elem.nodeType; // Don't get/set properties on text, comment and attribute nodes if ( nType === 3 || nType === 8 || nType === 2 ) { return; } if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { // Fix name and attach hooks name = jQuery.propFix[ name ] || name; hooks = jQuery.propHooks[ name ]; } if ( value !== undefined ) { if ( hooks && "set" in hooks && ( ret = hooks.set( elem, value, name ) ) !== undefined ) { return ret; } return ( elem[ name ] = value ); } if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { return ret; } return elem[ name ]; }, propHooks: { tabIndex: { get: function( elem ) { // Support: IE <=9 - 11 only // elem.tabIndex doesn't always return the // correct value when it hasn't been explicitly set // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ // Use proper attribute retrieval(#12072) var tabindex = jQuery.find.attr( elem, "tabindex" ); if ( tabindex ) { return parseInt( tabindex, 10 ); } if ( rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ) { return 0; } return -1; } } }, propFix: { "for": "htmlFor", "class": "className" } } ); // Support: IE <=11 only // Accessing the selectedIndex property // forces the browser to respect setting selected // on the option // The getter ensures a default option is selected // when in an optgroup // eslint rule "no-unused-expressions" is disabled for this code // since it considers such accessions noop if ( !support.optSelected ) { jQuery.propHooks.selected = { get: function( elem ) { /* eslint no-unused-expressions: "off" */ var parent = elem.parentNode; if ( parent && parent.parentNode ) { parent.parentNode.selectedIndex; } return null; }, set: function( elem ) { /* eslint no-unused-expressions: "off" */ var parent = elem.parentNode; if ( parent ) { parent.selectedIndex; if ( parent.parentNode ) { parent.parentNode.selectedIndex; } } } }; } jQuery.each( [ "tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable" ], function() { jQuery.propFix[ this.toLowerCase() ] = this; } ); // Strip and collapse whitespace according to HTML spec // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace function stripAndCollapse( value ) { var tokens = value.match( rnothtmlwhite ) || []; return tokens.join( " " ); } function getClass( elem ) { return elem.getAttribute && elem.getAttribute( "class" ) || ""; } function classesToArray( value ) { if ( Array.isArray( value ) ) { return value; } if ( typeof value === "string" ) { return value.match( rnothtmlwhite ) || []; } return []; } jQuery.fn.extend( { addClass: function( value ) { var classes, elem, cur, curValue, clazz, j, finalValue, i = 0; if ( isFunction( value ) ) { return this.each( function( j ) { jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); } ); } classes = classesToArray( value ); if ( classes.length ) { while ( ( elem = this[ i++ ] ) ) { curValue = getClass( elem ); cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); if ( cur ) { j = 0; while ( ( clazz = classes[ j++ ] ) ) { if ( cur.indexOf( " " + clazz + " " ) < 0 ) { cur += clazz + " "; } } // Only assign if different to avoid unneeded rendering. finalValue = stripAndCollapse( cur ); if ( curValue !== finalValue ) { elem.setAttribute( "class", finalValue ); } } } } return this; }, removeClass: function( value ) { var classes, elem, cur, curValue, clazz, j, finalValue, i = 0; if ( isFunction( value ) ) { return this.each( function( j ) { jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); } ); } if ( !arguments.length ) { return this.attr( "class", "" ); } classes = classesToArray( value ); if ( classes.length ) { while ( ( elem = this[ i++ ] ) ) { curValue = getClass( elem ); // This expression is here for better compressibility (see addClass) cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); if ( cur ) { j = 0; while ( ( clazz = classes[ j++ ] ) ) { // Remove *all* instances while ( cur.indexOf( " " + clazz + " " ) > -1 ) { cur = cur.replace( " " + clazz + " ", " " ); } } // Only assign if different to avoid unneeded rendering. finalValue = stripAndCollapse( cur ); if ( curValue !== finalValue ) { elem.setAttribute( "class", finalValue ); } } } } return this; }, toggleClass: function( value, stateVal ) { var type = typeof value, isValidValue = type === "string" || Array.isArray( value ); if ( typeof stateVal === "boolean" && isValidValue ) { return stateVal ? this.addClass( value ) : this.removeClass( value ); } if ( isFunction( value ) ) { return this.each( function( i ) { jQuery( this ).toggleClass( value.call( this, i, getClass( this ), stateVal ), stateVal ); } ); } return this.each( function() { var className, i, self, classNames; if ( isValidValue ) { // Toggle individual class names i = 0; self = jQuery( this ); classNames = classesToArray( value ); while ( ( className = classNames[ i++ ] ) ) { // Check each className given, space separated list if ( self.hasClass( className ) ) { self.removeClass( className ); } else { self.addClass( className ); } } // Toggle whole class name } else if ( value === undefined || type === "boolean" ) { className = getClass( this ); if ( className ) { // Store className if set dataPriv.set( this, "__className__", className ); } // If the element has a class name or if we're passed `false`, // then remove the whole classname (if there was one, the above saved it). // Otherwise bring back whatever was previously saved (if anything), // falling back to the empty string if nothing was stored. if ( this.setAttribute ) { this.setAttribute( "class", className || value === false ? "" : dataPriv.get( this, "__className__" ) || "" ); } } } ); }, hasClass: function( selector ) { var className, elem, i = 0; className = " " + selector + " "; while ( ( elem = this[ i++ ] ) ) { if ( elem.nodeType === 1 && ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { return true; } } return false; } } ); var rreturn = /\r/g; jQuery.fn.extend( { val: function( value ) { var hooks, ret, valueIsFunction, elem = this[ 0 ]; if ( !arguments.length ) { if ( elem ) { hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; if ( hooks && "get" in hooks && ( ret = hooks.get( elem, "value" ) ) !== undefined ) { return ret; } ret = elem.value; // Handle most common string cases if ( typeof ret === "string" ) { return ret.replace( rreturn, "" ); } // Handle cases where value is null/undef or number return ret == null ? "" : ret; } return; } valueIsFunction = isFunction( value ); return this.each( function( i ) { var val; if ( this.nodeType !== 1 ) { return; } if ( valueIsFunction ) { val = value.call( this, i, jQuery( this ).val() ); } else { val = value; } // Treat null/undefined as ""; convert numbers to string if ( val == null ) { val = ""; } else if ( typeof val === "number" ) { val += ""; } else if ( Array.isArray( val ) ) { val = jQuery.map( val, function( value ) { return value == null ? "" : value + ""; } ); } hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; // If set returns undefined, fall back to normal setting if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { this.value = val; } } ); } } ); jQuery.extend( { valHooks: { option: { get: function( elem ) { var val = jQuery.find.attr( elem, "value" ); return val != null ? val : // Support: IE <=10 - 11 only // option.text throws exceptions (#14686, #14858) // Strip and collapse whitespace // https://html.spec.whatwg.org/#strip-and-collapse-whitespace stripAndCollapse( jQuery.text( elem ) ); } }, select: { get: function( elem ) { var value, option, i, options = elem.options, index = elem.selectedIndex, one = elem.type === "select-one", values = one ? null : [], max = one ? index + 1 : options.length; if ( index < 0 ) { i = max; } else { i = one ? index : 0; } // Loop through all the selected options for ( ; i < max; i++ ) { option = options[ i ]; // Support: IE <=9 only // IE8-9 doesn't update selected after form reset (#2551) if ( ( option.selected || i === index ) && // Don't return options that are disabled or in a disabled optgroup !option.disabled && ( !option.parentNode.disabled || !nodeName( option.parentNode, "optgroup" ) ) ) { // Get the specific value for the option value = jQuery( option ).val(); // We don't need an array for one selects if ( one ) { return value; } // Multi-Selects return an array values.push( value ); } } return values; }, set: function( elem, value ) { var optionSet, option, options = elem.options, values = jQuery.makeArray( value ), i = options.length; while ( i-- ) { option = options[ i ]; /* eslint-disable no-cond-assign */ if ( option.selected = jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 ) { optionSet = true; } /* eslint-enable no-cond-assign */ } // Force browsers to behave consistently when non-matching value is set if ( !optionSet ) { elem.selectedIndex = -1; } return values; } } } } ); // Radios and checkboxes getter/setter jQuery.each( [ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = { set: function( elem, value ) { if ( Array.isArray( value ) ) { return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); } } }; if ( !support.checkOn ) { jQuery.valHooks[ this ].get = function( elem ) { return elem.getAttribute( "value" ) === null ? "on" : elem.value; }; } } ); // Return jQuery for attributes-only inclusion support.focusin = "onfocusin" in window; var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, stopPropagationCallback = function( e ) { e.stopPropagation(); }; jQuery.extend( jQuery.event, { trigger: function( event, data, elem, onlyHandlers ) { var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, eventPath = [ elem || document ], type = hasOwn.call( event, "type" ) ? event.type : event, namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; cur = lastElement = tmp = elem = elem || document; // Don't do events on text and comment nodes if ( elem.nodeType === 3 || elem.nodeType === 8 ) { return; } // focus/blur morphs to focusin/out; ensure we're not firing them right now if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { return; } if ( type.indexOf( "." ) > -1 ) { // Namespaced trigger; create a regexp to match event type in handle() namespaces = type.split( "." ); type = namespaces.shift(); namespaces.sort(); } ontype = type.indexOf( ":" ) < 0 && "on" + type; // Caller can pass in a jQuery.Event object, Object, or just an event type string event = event[ jQuery.expando ] ? event : new jQuery.Event( type, typeof event === "object" && event ); // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) event.isTrigger = onlyHandlers ? 2 : 3; event.namespace = namespaces.join( "." ); event.rnamespace = event.namespace ? new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : null; // Clean up the event in case it is being reused event.result = undefined; if ( !event.target ) { event.target = elem; } // Clone any incoming data and prepend the event, creating the handler arg list data = data == null ? [ event ] : jQuery.makeArray( data, [ event ] ); // Allow special events to draw outside the lines special = jQuery.event.special[ type ] || {}; if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { return; } // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { bubbleType = special.delegateType || type; if ( !rfocusMorph.test( bubbleType + type ) ) { cur = cur.parentNode; } for ( ; cur; cur = cur.parentNode ) { eventPath.push( cur ); tmp = cur; } // Only add window if we got to document (e.g., not plain obj or detached DOM) if ( tmp === ( elem.ownerDocument || document ) ) { eventPath.push( tmp.defaultView || tmp.parentWindow || window ); } } // Fire handlers on the event path i = 0; while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { lastElement = cur; event.type = i > 1 ? bubbleType : special.bindType || type; // jQuery handler handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && dataPriv.get( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); } // Native handler handle = ontype && cur[ ontype ]; if ( handle && handle.apply && acceptData( cur ) ) { event.result = handle.apply( cur, data ); if ( event.result === false ) { event.preventDefault(); } } } event.type = type; // If nobody prevented the default action, do it now if ( !onlyHandlers && !event.isDefaultPrevented() ) { if ( ( !special._default || special._default.apply( eventPath.pop(), data ) === false ) && acceptData( elem ) ) { // Call a native DOM method on the target with the same name as the event. // Don't do default actions on window, that's where global variables be (#6170) if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method tmp = elem[ ontype ]; if ( tmp ) { elem[ ontype ] = null; } // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; if ( event.isPropagationStopped() ) { lastElement.addEventListener( type, stopPropagationCallback ); } elem[ type ](); if ( event.isPropagationStopped() ) { lastElement.removeEventListener( type, stopPropagationCallback ); } jQuery.event.triggered = undefined; if ( tmp ) { elem[ ontype ] = tmp; } } } } return event.result; }, // Piggyback on a donor event to simulate a different one // Used only for `focus(in | out)` events simulate: function( type, elem, event ) { var e = jQuery.extend( new jQuery.Event(), event, { type: type, isSimulated: true } ); jQuery.event.trigger( e, null, elem ); } } ); jQuery.fn.extend( { trigger: function( type, data ) { return this.each( function() { jQuery.event.trigger( type, data, this ); } ); }, triggerHandler: function( type, data ) { var elem = this[ 0 ]; if ( elem ) { return jQuery.event.trigger( type, data, elem, true ); } } } ); // Support: Firefox <=44 // Firefox doesn't have focus(in | out) events // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 // // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 // focus(in | out) events fire after focus & blur events, // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 if ( !support.focusin ) { jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { // Attach a single capturing handler on the document while someone wants focusin/focusout var handler = function( event ) { jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); }; jQuery.event.special[ fix ] = { setup: function() { var doc = this.ownerDocument || this, attaches = dataPriv.access( doc, fix ); if ( !attaches ) { doc.addEventListener( orig, handler, true ); } dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); }, teardown: function() { var doc = this.ownerDocument || this, attaches = dataPriv.access( doc, fix ) - 1; if ( !attaches ) { doc.removeEventListener( orig, handler, true ); dataPriv.remove( doc, fix ); } else { dataPriv.access( doc, fix, attaches ); } } }; } ); } var location = window.location; var nonce = Date.now(); var rquery = ( /\?/ ); // Cross-browser xml parsing jQuery.parseXML = function( data ) { var xml; if ( !data || typeof data !== "string" ) { return null; } // Support: IE 9 - 11 only // IE throws on parseFromString with invalid input. try { xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); } catch ( e ) { xml = undefined; } if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { jQuery.error( "Invalid XML: " + data ); } return xml; }; var rbracket = /\[\]$/, rCRLF = /\r?\n/g, rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, rsubmittable = /^(?:input|select|textarea|keygen)/i; function buildParams( prefix, obj, traditional, add ) { var name; if ( Array.isArray( obj ) ) { // Serialize array item. jQuery.each( obj, function( i, v ) { if ( traditional || rbracket.test( prefix ) ) { // Treat each array item as a scalar. add( prefix, v ); } else { // Item is non-scalar (array or object), encode its numeric index. buildParams( prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", v, traditional, add ); } } ); } else if ( !traditional && toType( obj ) === "object" ) { // Serialize object item. for ( name in obj ) { buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); } } else { // Serialize scalar item. add( prefix, obj ); } } // Serialize an array of form elements or a set of // key/values into a query string jQuery.param = function( a, traditional ) { var prefix, s = [], add = function( key, valueOrFunction ) { // If value is a function, invoke it and use its return value var value = isFunction( valueOrFunction ) ? valueOrFunction() : valueOrFunction; s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value == null ? "" : value ); }; // If an array was passed in, assume that it is an array of form elements. if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { // Serialize the form elements jQuery.each( a, function() { add( this.name, this.value ); } ); } else { // If traditional, encode the "old" way (the way 1.3.2 or older // did it), otherwise encode params recursively. for ( prefix in a ) { buildParams( prefix, a[ prefix ], traditional, add ); } } // Return the resulting serialization return s.join( "&" ); }; jQuery.fn.extend( { serialize: function() { return jQuery.param( this.serializeArray() ); }, serializeArray: function() { return this.map( function() { // Can add propHook for "elements" to filter or add form elements var elements = jQuery.prop( this, "elements" ); return elements ? jQuery.makeArray( elements ) : this; } ) .filter( function() { var type = this.type; // Use .is( ":disabled" ) so that fieldset[disabled] works return this.name && !jQuery( this ).is( ":disabled" ) && rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && ( this.checked || !rcheckableType.test( type ) ); } ) .map( function( i, elem ) { var val = jQuery( this ).val(); if ( val == null ) { return null; } if ( Array.isArray( val ) ) { return jQuery.map( val, function( val ) { return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; } ); } return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; } ).get(); } } ); var r20 = /%20/g, rhash = /#.*$/, rantiCache = /([?&])_=[^&]*/, rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, // #7653, #8125, #8152: local protocol detection rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, rnoContent = /^(?:GET|HEAD)$/, rprotocol = /^\/\//, /* Prefilters * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) * 2) These are called: * - BEFORE asking for a transport * - AFTER param serialization (s.data is a string if s.processData is true) * 3) key is the dataType * 4) the catchall symbol "*" can be used * 5) execution will start with transport dataType and THEN continue down to "*" if needed */ prefilters = {}, /* Transports bindings * 1) key is the dataType * 2) the catchall symbol "*" can be used * 3) selection will start with transport dataType and THEN go to "*" if needed */ transports = {}, // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression allTypes = "*/".concat( "*" ), // Anchor tag for parsing the document origin originAnchor = document.createElement( "a" ); originAnchor.href = location.href; // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport function addToPrefiltersOrTransports( structure ) { // dataTypeExpression is optional and defaults to "*" return function( dataTypeExpression, func ) { if ( typeof dataTypeExpression !== "string" ) { func = dataTypeExpression; dataTypeExpression = "*"; } var dataType, i = 0, dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; if ( isFunction( func ) ) { // For each dataType in the dataTypeExpression while ( ( dataType = dataTypes[ i++ ] ) ) { // Prepend if requested if ( dataType[ 0 ] === "+" ) { dataType = dataType.slice( 1 ) || "*"; ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); // Otherwise append } else { ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); } } } }; } // Base inspection function for prefilters and transports function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { var inspected = {}, seekingTransport = ( structure === transports ); function inspect( dataType ) { var selected; inspected[ dataType ] = true; jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) { options.dataTypes.unshift( dataTypeOrTransport ); inspect( dataTypeOrTransport ); return false; } else if ( seekingTransport ) { return !( selected = dataTypeOrTransport ); } } ); return selected; } return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); } // A special extend for ajax options // that takes "flat" options (not to be deep extended) // Fixes #9887 function ajaxExtend( target, src ) { var key, deep, flatOptions = jQuery.ajaxSettings.flatOptions || {}; for ( key in src ) { if ( src[ key ] !== undefined ) { ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; } } if ( deep ) { jQuery.extend( true, target, deep ); } return target; } /* Handles responses to an ajax request: * - finds the right dataType (mediates between content-type and expected dataType) * - returns the corresponding response */ function ajaxHandleResponses( s, jqXHR, responses ) { var ct, type, finalDataType, firstDataType, contents = s.contents, dataTypes = s.dataTypes; // Remove auto dataType and get content-type in the process while ( dataTypes[ 0 ] === "*" ) { dataTypes.shift(); if ( ct === undefined ) { ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); } } // Check if we're dealing with a known content-type if ( ct ) { for ( type in contents ) { if ( contents[ type ] && contents[ type ].test( ct ) ) { dataTypes.unshift( type ); break; } } } // Check to see if we have a response for the expected dataType if ( dataTypes[ 0 ] in responses ) { finalDataType = dataTypes[ 0 ]; } else { // Try convertible dataTypes for ( type in responses ) { if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { finalDataType = type; break; } if ( !firstDataType ) { firstDataType = type; } } // Or just use first one finalDataType = finalDataType || firstDataType; } // If we found a dataType // We add the dataType to the list if needed // and return the corresponding response if ( finalDataType ) { if ( finalDataType !== dataTypes[ 0 ] ) { dataTypes.unshift( finalDataType ); } return responses[ finalDataType ]; } } /* Chain conversions given the request and the original response * Also sets the responseXXX fields on the jqXHR instance */ function ajaxConvert( s, response, jqXHR, isSuccess ) { var conv2, current, conv, tmp, prev, converters = {}, // Work with a copy of dataTypes in case we need to modify it for conversion dataTypes = s.dataTypes.slice(); // Create converters map with lowercased keys if ( dataTypes[ 1 ] ) { for ( conv in s.converters ) { converters[ conv.toLowerCase() ] = s.converters[ conv ]; } } current = dataTypes.shift(); // Convert to each sequential dataType while ( current ) { if ( s.responseFields[ current ] ) { jqXHR[ s.responseFields[ current ] ] = response; } // Apply the dataFilter if provided if ( !prev && isSuccess && s.dataFilter ) { response = s.dataFilter( response, s.dataType ); } prev = current; current = dataTypes.shift(); if ( current ) { // There's only work to do if current dataType is non-auto if ( current === "*" ) { current = prev; // Convert response if prev dataType is non-auto and differs from current } else if ( prev !== "*" && prev !== current ) { // Seek a direct converter conv = converters[ prev + " " + current ] || converters[ "* " + current ]; // If none found, seek a pair if ( !conv ) { for ( conv2 in converters ) { // If conv2 outputs current tmp = conv2.split( " " ); if ( tmp[ 1 ] === current ) { // If prev can be converted to accepted input conv = converters[ prev + " " + tmp[ 0 ] ] || converters[ "* " + tmp[ 0 ] ]; if ( conv ) { // Condense equivalence converters if ( conv === true ) { conv = converters[ conv2 ]; // Otherwise, insert the intermediate dataType } else if ( converters[ conv2 ] !== true ) { current = tmp[ 0 ]; dataTypes.unshift( tmp[ 1 ] ); } break; } } } } // Apply converter (if not an equivalence) if ( conv !== true ) { // Unless errors are allowed to bubble, catch and return them if ( conv && s.throws ) { response = conv( response ); } else { try { response = conv( response ); } catch ( e ) { return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current }; } } } } } } return { state: "success", data: response }; } jQuery.extend( { // Counter for holding the number of active queries active: 0, // Last-Modified header cache for next request lastModified: {}, etag: {}, ajaxSettings: { url: location.href, type: "GET", isLocal: rlocalProtocol.test( location.protocol ), global: true, processData: true, async: true, contentType: "application/x-www-form-urlencoded; charset=UTF-8", /* timeout: 0, data: null, dataType: null, username: null, password: null, cache: null, throws: false, traditional: false, headers: {}, */ accepts: { "*": allTypes, text: "text/plain", html: "text/html", xml: "application/xml, text/xml", json: "application/json, text/javascript" }, contents: { xml: /\bxml\b/, html: /\bhtml/, json: /\bjson\b/ }, responseFields: { xml: "responseXML", text: "responseText", json: "responseJSON" }, // Data converters // Keys separate source (or catchall "*") and destination types with a single space converters: { // Convert anything to text "* text": String, // Text to html (true = no transformation) "text html": true, // Evaluate text as a json expression "text json": JSON.parse, // Parse text as xml "text xml": jQuery.parseXML }, // For options that shouldn't be deep extended: // you can add your own custom options here if // and when you create one that shouldn't be // deep extended (see ajaxExtend) flatOptions: { url: true, context: true } }, // Creates a full fledged settings object into target // with both ajaxSettings and settings fields. // If target is omitted, writes into ajaxSettings. ajaxSetup: function( target, settings ) { return settings ? // Building a settings object ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : // Extending ajaxSettings ajaxExtend( jQuery.ajaxSettings, target ); }, ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), ajaxTransport: addToPrefiltersOrTransports( transports ), // Main method ajax: function( url, options ) { // If url is an object, simulate pre-1.5 signature if ( typeof url === "object" ) { options = url; url = undefined; } // Force options to be an object options = options || {}; var transport, // URL without anti-cache param cacheURL, // Response headers responseHeadersString, responseHeaders, // timeout handle timeoutTimer, // Url cleanup var urlAnchor, // Request state (becomes false upon send and true upon completion) completed, // To know if global events are to be dispatched fireGlobals, // Loop variable i, // uncached part of the url uncached, // Create the final options object s = jQuery.ajaxSetup( {}, options ), // Callbacks context callbackContext = s.context || s, // Context for global events is callbackContext if it is a DOM node or jQuery collection globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ? jQuery( callbackContext ) : jQuery.event, // Deferreds deferred = jQuery.Deferred(), completeDeferred = jQuery.Callbacks( "once memory" ), // Status-dependent callbacks statusCode = s.statusCode || {}, // Headers (they are sent all at once) requestHeaders = {}, requestHeadersNames = {}, // Default abort message strAbort = "canceled", // Fake xhr jqXHR = { readyState: 0, // Builds headers hashtable if needed getResponseHeader: function( key ) { var match; if ( completed ) { if ( !responseHeaders ) { responseHeaders = {}; while ( ( match = rheaders.exec( responseHeadersString ) ) ) { responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; } } match = responseHeaders[ key.toLowerCase() ]; } return match == null ? null : match; }, // Raw string getAllResponseHeaders: function() { return completed ? responseHeadersString : null; }, // Caches the header setRequestHeader: function( name, value ) { if ( completed == null ) { name = requestHeadersNames[ name.toLowerCase() ] = requestHeadersNames[ name.toLowerCase() ] || name; requestHeaders[ name ] = value; } return this; }, // Overrides response content-type header overrideMimeType: function( type ) { if ( completed == null ) { s.mimeType = type; } return this; }, // Status-dependent callbacks statusCode: function( map ) { var code; if ( map ) { if ( completed ) { // Execute the appropriate callbacks jqXHR.always( map[ jqXHR.status ] ); } else { // Lazy-add the new callbacks in a way that preserves old ones for ( code in map ) { statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; } } } return this; }, // Cancel the request abort: function( statusText ) { var finalText = statusText || strAbort; if ( transport ) { transport.abort( finalText ); } done( 0, finalText ); return this; } }; // Attach deferreds deferred.promise( jqXHR ); // Add protocol if not provided (prefilters might expect it) // Handle falsy url in the settings object (#10093: consistency with old signature) // We also use the url parameter if available s.url = ( ( url || s.url || location.href ) + "" ) .replace( rprotocol, location.protocol + "//" ); // Alias method option to type as per ticket #12004 s.type = options.method || options.type || s.method || s.type; // Extract dataTypes list s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; // A cross-domain request is in order when the origin doesn't match the current origin. if ( s.crossDomain == null ) { urlAnchor = document.createElement( "a" ); // Support: IE <=8 - 11, Edge 12 - 15 // IE throws exception on accessing the href property if url is malformed, // e.g. http://example.com:80x/ try { urlAnchor.href = s.url; // Support: IE <=8 - 11 only // Anchor's host property isn't correctly set when s.url is relative urlAnchor.href = urlAnchor.href; s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== urlAnchor.protocol + "//" + urlAnchor.host; } catch ( e ) { // If there is an error parsing the URL, assume it is crossDomain, // it can be rejected by the transport if it is invalid s.crossDomain = true; } } // Convert data if not already a string if ( s.data && s.processData && typeof s.data !== "string" ) { s.data = jQuery.param( s.data, s.traditional ); } // Apply prefilters inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); // If request was aborted inside a prefilter, stop there if ( completed ) { return jqXHR; } // We can fire global events as of now if asked to // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) fireGlobals = jQuery.event && s.global; // Watch for a new set of requests if ( fireGlobals && jQuery.active++ === 0 ) { jQuery.event.trigger( "ajaxStart" ); } // Uppercase the type s.type = s.type.toUpperCase(); // Determine if request has content s.hasContent = !rnoContent.test( s.type ); // Save the URL in case we're toying with the If-Modified-Since // and/or If-None-Match header later on // Remove hash to simplify url manipulation cacheURL = s.url.replace( rhash, "" ); // More options handling for requests with no content if ( !s.hasContent ) { // Remember the hash so we can put it back uncached = s.url.slice( cacheURL.length ); // If data is available and should be processed, append data to url if ( s.data && ( s.processData || typeof s.data === "string" ) ) { cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; // #9682: remove data so that it's not used in an eventual retry delete s.data; } // Add or update anti-cache param if needed if ( s.cache === false ) { cacheURL = cacheURL.replace( rantiCache, "$1" ); uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; } // Put hash and anti-cache on the URL that will be requested (gh-1732) s.url = cacheURL + uncached; // Change '%20' to '+' if this is encoded form body content (gh-2658) } else if ( s.data && s.processData && ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { s.data = s.data.replace( r20, "+" ); } // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. if ( s.ifModified ) { if ( jQuery.lastModified[ cacheURL ] ) { jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); } if ( jQuery.etag[ cacheURL ] ) { jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); } } // Set the correct header, if data is being sent if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { jqXHR.setRequestHeader( "Content-Type", s.contentType ); } // Set the Accepts header for the server, depending on the dataType jqXHR.setRequestHeader( "Accept", s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? s.accepts[ s.dataTypes[ 0 ] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : s.accepts[ "*" ] ); // Check for headers option for ( i in s.headers ) { jqXHR.setRequestHeader( i, s.headers[ i ] ); } // Allow custom headers/mimetypes and early abort if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { // Abort if not done already and return return jqXHR.abort(); } // Aborting is no longer a cancellation strAbort = "abort"; // Install callbacks on deferreds completeDeferred.add( s.complete ); jqXHR.done( s.success ); jqXHR.fail( s.error ); // Get transport transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); // If no transport, we auto-abort if ( !transport ) { done( -1, "No Transport" ); } else { jqXHR.readyState = 1; // Send global event if ( fireGlobals ) { globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); } // If request was aborted inside ajaxSend, stop there if ( completed ) { return jqXHR; } // Timeout if ( s.async && s.timeout > 0 ) { timeoutTimer = window.setTimeout( function() { jqXHR.abort( "timeout" ); }, s.timeout ); } try { completed = false; transport.send( requestHeaders, done ); } catch ( e ) { // Rethrow post-completion exceptions if ( completed ) { throw e; } // Propagate others as results done( -1, e ); } } // Callback for when everything is done function done( status, nativeStatusText, responses, headers ) { var isSuccess, success, error, response, modified, statusText = nativeStatusText; // Ignore repeat invocations if ( completed ) { return; } completed = true; // Clear timeout if it exists if ( timeoutTimer ) { window.clearTimeout( timeoutTimer ); } // Dereference transport for early garbage collection // (no matter how long the jqXHR object will be used) transport = undefined; // Cache response headers responseHeadersString = headers || ""; // Set readyState jqXHR.readyState = status > 0 ? 4 : 0; // Determine if successful isSuccess = status >= 200 && status < 300 || status === 304; // Get response data if ( responses ) { response = ajaxHandleResponses( s, jqXHR, responses ); } // Convert no matter what (that way responseXXX fields are always set) response = ajaxConvert( s, response, jqXHR, isSuccess ); // If successful, handle type chaining if ( isSuccess ) { // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. if ( s.ifModified ) { modified = jqXHR.getResponseHeader( "Last-Modified" ); if ( modified ) { jQuery.lastModified[ cacheURL ] = modified; } modified = jqXHR.getResponseHeader( "etag" ); if ( modified ) { jQuery.etag[ cacheURL ] = modified; } } // if no content if ( status === 204 || s.type === "HEAD" ) { statusText = "nocontent"; // if not modified } else if ( status === 304 ) { statusText = "notmodified"; // If we have data, let's convert it } else { statusText = response.state; success = response.data; error = response.error; isSuccess = !error; } } else { // Extract error from statusText and normalize for non-aborts error = statusText; if ( status || !statusText ) { statusText = "error"; if ( status < 0 ) { status = 0; } } } // Set data for the fake xhr object jqXHR.status = status; jqXHR.statusText = ( nativeStatusText || statusText ) + ""; // Success/Error if ( isSuccess ) { deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); } else { deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); } // Status-dependent callbacks jqXHR.statusCode( statusCode ); statusCode = undefined; if ( fireGlobals ) { globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", [ jqXHR, s, isSuccess ? success : error ] ); } // Complete completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); if ( fireGlobals ) { globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); // Handle the global AJAX counter if ( !( --jQuery.active ) ) { jQuery.event.trigger( "ajaxStop" ); } } } return jqXHR; }, getJSON: function( url, data, callback ) { return jQuery.get( url, data, callback, "json" ); }, getScript: function( url, callback ) { return jQuery.get( url, undefined, callback, "script" ); } } ); jQuery.each( [ "get", "post" ], function( i, method ) { jQuery[ method ] = function( url, data, callback, type ) { // Shift arguments if data argument was omitted if ( isFunction( data ) ) { type = type || callback; callback = data; data = undefined; } // The url can be an options object (which then must have .url) return jQuery.ajax( jQuery.extend( { url: url, type: method, dataType: type, data: data, success: callback }, jQuery.isPlainObject( url ) && url ) ); }; } ); jQuery._evalUrl = function( url ) { return jQuery.ajax( { url: url, // Make this explicit, since user can override this through ajaxSetup (#11264) type: "GET", dataType: "script", cache: true, async: false, global: false, "throws": true } ); }; jQuery.fn.extend( { wrapAll: function( html ) { var wrap; if ( this[ 0 ] ) { if ( isFunction( html ) ) { html = html.call( this[ 0 ] ); } // The elements to wrap the target around wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); if ( this[ 0 ].parentNode ) { wrap.insertBefore( this[ 0 ] ); } wrap.map( function() { var elem = this; while ( elem.firstElementChild ) { elem = elem.firstElementChild; } return elem; } ).append( this ); } return this; }, wrapInner: function( html ) { if ( isFunction( html ) ) { return this.each( function( i ) { jQuery( this ).wrapInner( html.call( this, i ) ); } ); } return this.each( function() { var self = jQuery( this ), contents = self.contents(); if ( contents.length ) { contents.wrapAll( html ); } else { self.append( html ); } } ); }, wrap: function( html ) { var htmlIsFunction = isFunction( html ); return this.each( function( i ) { jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); } ); }, unwrap: function( selector ) { this.parent( selector ).not( "body" ).each( function() { jQuery( this ).replaceWith( this.childNodes ); } ); return this; } } ); jQuery.expr.pseudos.hidden = function( elem ) { return !jQuery.expr.pseudos.visible( elem ); }; jQuery.expr.pseudos.visible = function( elem ) { return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); }; jQuery.ajaxSettings.xhr = function() { try { return new window.XMLHttpRequest(); } catch ( e ) {} }; var xhrSuccessStatus = { // File protocol always yields status code 0, assume 200 0: 200, // Support: IE <=9 only // #1450: sometimes IE returns 1223 when it should be 204 1223: 204 }, xhrSupported = jQuery.ajaxSettings.xhr(); support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); support.ajax = xhrSupported = !!xhrSupported; jQuery.ajaxTransport( function( options ) { var callback, errorCallback; // Cross domain only allowed if supported through XMLHttpRequest if ( support.cors || xhrSupported && !options.crossDomain ) { return { send: function( headers, complete ) { var i, xhr = options.xhr(); xhr.open( options.type, options.url, options.async, options.username, options.password ); // Apply custom fields if provided if ( options.xhrFields ) { for ( i in options.xhrFields ) { xhr[ i ] = options.xhrFields[ i ]; } } // Override mime type if needed if ( options.mimeType && xhr.overrideMimeType ) { xhr.overrideMimeType( options.mimeType ); } // X-Requested-With header // For cross-domain requests, seeing as conditions for a preflight are // akin to a jigsaw puzzle, we simply never set it to be sure. // (it can always be set on a per-request basis or even using ajaxSetup) // For same-domain requests, won't change header if already provided. if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { headers[ "X-Requested-With" ] = "XMLHttpRequest"; } // Set headers for ( i in headers ) { xhr.setRequestHeader( i, headers[ i ] ); } // Callback callback = function( type ) { return function() { if ( callback ) { callback = errorCallback = xhr.onload = xhr.onerror = xhr.onabort = xhr.ontimeout = xhr.onreadystatechange = null; if ( type === "abort" ) { xhr.abort(); } else if ( type === "error" ) { // Support: IE <=9 only // On a manual native abort, IE9 throws // errors on any property access that is not readyState if ( typeof xhr.status !== "number" ) { complete( 0, "error" ); } else { complete( // File: protocol always yields status 0; see #8605, #14207 xhr.status, xhr.statusText ); } } else { complete( xhrSuccessStatus[ xhr.status ] || xhr.status, xhr.statusText, // Support: IE <=9 only // IE9 has no XHR2 but throws on binary (trac-11426) // For XHR2 non-text, let the caller handle it (gh-2498) ( xhr.responseType || "text" ) !== "text" || typeof xhr.responseText !== "string" ? { binary: xhr.response } : { text: xhr.responseText }, xhr.getAllResponseHeaders() ); } } }; }; // Listen to events xhr.onload = callback(); errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); // Support: IE 9 only // Use onreadystatechange to replace onabort // to handle uncaught aborts if ( xhr.onabort !== undefined ) { xhr.onabort = errorCallback; } else { xhr.onreadystatechange = function() { // Check readyState before timeout as it changes if ( xhr.readyState === 4 ) { // Allow onerror to be called first, // but that will not handle a native abort // Also, save errorCallback to a variable // as xhr.onerror cannot be accessed window.setTimeout( function() { if ( callback ) { errorCallback(); } } ); } }; } // Create the abort callback callback = callback( "abort" ); try { // Do send the request (this may raise an exception) xhr.send( options.hasContent && options.data || null ); } catch ( e ) { // #14683: Only rethrow if this hasn't been notified as an error yet if ( callback ) { throw e; } } }, abort: function() { if ( callback ) { callback(); } } }; } } ); // Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) jQuery.ajaxPrefilter( function( s ) { if ( s.crossDomain ) { s.contents.script = false; } } ); // Install script dataType jQuery.ajaxSetup( { accepts: { script: "text/javascript, application/javascript, " + "application/ecmascript, application/x-ecmascript" }, contents: { script: /\b(?:java|ecma)script\b/ }, converters: { "text script": function( text ) { jQuery.globalEval( text ); return text; } } } ); // Handle cache's special case and crossDomain jQuery.ajaxPrefilter( "script", function( s ) { if ( s.cache === undefined ) { s.cache = false; } if ( s.crossDomain ) { s.type = "GET"; } } ); // Bind script tag hack transport jQuery.ajaxTransport( "script", function( s ) { // This transport only deals with cross domain requests if ( s.crossDomain ) { var script, callback; return { send: function( _, complete ) { script = jQuery( "

Here find some simple tags


Lorem ipsum dolor sit amet consectetur adipisicing elit. A quo, autem quaerat explicabo impedit mollitia amet molestiae nulla cum architecto ducimus itaque sit blanditiis quasi animi optio ab facilis nihil?

Here are some escaped characters: & (ampersand), à (a with grave), № (numero sign).

This is a form that demonstrates loose attribute formatting

A table with normal closing tags

Pet Features
Feature Cat Dog
Tail
Eyes
Ears
Barking
Litter Box

A table without closing tags

Pet Features
Feature Cat Dog
Tail
Eyes
Ears
Barking
Litter Box

A math section with CDATA

You can add a string to a number, but this stringifies the number:

a / b - 7 = a / b - 7
bat-0.24.0/tests/syntax-tests/source/Haskell/test.hs000064400000000000000000000036271046102023000205130ustar 00000000000000{-# LANGUAGE OverloadedStrings #-} -- simple parser for a Lisp-like syntax I wrote some time ago import Data.Void (Void) import Data.Text (Text) import qualified Data.Text as T import Text.Megaparsec.Char import Text.Megaparsec.Error (errorBundlePretty) import Text.Megaparsec hiding (State) import qualified Text.Megaparsec.Char.Lexer as L data LispVal = Symbol Text | List [LispVal] | Number Integer | String Text | LispTrue | LispFalse | Nil deriving (Show, Eq) type Parser = Parsec Void Text readStr :: Text -> Either String [LispVal] readStr t = case parse pLisp "f" t of Right parsed -> Right parsed Left err -> Left $ errorBundlePretty err {-# INLINABLE readStr #-} sc :: Parser () sc = L.space space1 (L.skipLineComment ";") empty {-# INLINABLE sc #-} lexeme :: Parser a -> Parser a lexeme = L.lexeme sc {-# INLINE lexeme #-} symbol :: Text -> Parser Text symbol = L.symbol sc {-# INLINE symbol #-} symbol' :: Text -> Parser Text symbol' = L.symbol' sc {-# INLINE symbol' #-} pNil :: Parser LispVal pNil = symbol' "nil" >> return Nil {-# INLINE pNil #-} integer :: Parser Integer integer = lexeme L.decimal {-# INLINE integer #-} lispSymbols :: Parser Char lispSymbols = oneOf ("#$%&|*+-/:<=>?@^_~" :: String) {-# INLINE lispSymbols #-} pLispVal :: Parser LispVal pLispVal = choice [pList, pNumber, pSymbol, pNil, pString] {-# INLINE pLispVal #-} pSymbol :: Parser LispVal pSymbol = (Symbol . T.pack <$> lexeme (some (letterChar <|> lispSymbols))) {-# INLINABLE pSymbol #-} pList :: Parser LispVal pList = List <$> between (symbol "(") (symbol ")") (many pLispVal) {-# INLINABLE pList #-} pLisp :: Parser [LispVal] pLisp = some pLispVal {-# INLINE pLisp #-} pNumber :: Parser LispVal pNumber = Number <$> integer {-# INLINE pNumber #-} pString :: Parser LispVal pString = do str <- char '\"' *> manyTill L.charLiteral (char '\"') return $ String (T.pack str) {-# INLINABLE pString #-} bat-0.24.0/tests/syntax-tests/source/Hosts/hosts000064400000000000000000000003741046102023000177740ustar 00000000000000#this is a comment in the hosts file 127.0.0.1 localhost 192.168.0.1 sample.test #a comment 192.160.0.200 try.sample.test try #another comment 216.58.223.238 google.com ::1 localhost.try ip6-localhost bat-0.24.0/tests/syntax-tests/source/INI/test.inf000064400000000000000000000003151046102023000177000ustar 00000000000000[section] key=value # This file is just for testing that the INI syntax is registered to handle # the .inf file extension, it is not testing the syntax highlighting capabilities # of the INI syntax itself bat-0.24.0/tests/syntax-tests/source/INI/test.ini000064400000000000000000000005731046102023000177110ustar 00000000000000[section] key=value numeric = 42 quotes="this value is quoted" quotes2="this is not a comment ;foo" different_quotes='these are other characters' [another one] first = value ; comment on own line ;another one second=value ; comment at the end of a line third = value;another one # is this a comment? maybe. [section.with.dots] [section\with\backspaces] [section;with;semicola] bat-0.24.0/tests/syntax-tests/source/Ignored suffixes/test.rs.bak000064400000000000000000000000741046102023000230730ustar 00000000000000// foo.bak (editor etc backup) should highlight same as foo bat-0.24.0/tests/syntax-tests/source/Ignored suffixes/test.rs.dpkg-dist000064400000000000000000000001031046102023000242150ustar 00000000000000// foo.dpkg-dist (Debian dpkg backup) should highlight same as foo bat-0.24.0/tests/syntax-tests/source/Ignored suffixes/test.rs.dpkg-old000064400000000000000000000001021046102023000240270ustar 00000000000000// foo.dpkg-old (Debian dpkg backup) should highlight same as foo bat-0.24.0/tests/syntax-tests/source/Ignored suffixes/test.rs.in000064400000000000000000000000741046102023000227440ustar 00000000000000// foo.in (build system input) should highlight same as foo bat-0.24.0/tests/syntax-tests/source/Ignored suffixes/test.rs.in.in000064400000000000000000000001201046102023000233410ustar 00000000000000// foo.in.in (build system input, doubly replaced) should highlight same as foo bat-0.24.0/tests/syntax-tests/source/Ignored suffixes/test.rs.old000064400000000000000000000000741046102023000231140ustar 00000000000000// foo.old (editor etc backup) should highlight same as foo bat-0.24.0/tests/syntax-tests/source/Ignored suffixes/test.rs.orig000064400000000000000000000001031046102023000232670ustar 00000000000000// foo.orig (editor, diff etc backup) should highlight same as foo bat-0.24.0/tests/syntax-tests/source/Ignored suffixes/test.rs.orig~000064400000000000000000000001211046102023000234650ustar 00000000000000// foo.orig~ (backup of an editor, diff etc backup) should highlight same as foo bat-0.24.0/tests/syntax-tests/source/Ignored suffixes/test.rs.rpmnew000064400000000000000000000001001046102023000236340ustar 00000000000000// foo.rpmnew (Red Hat rpm backup) should highlight same as foo bat-0.24.0/tests/syntax-tests/source/Ignored suffixes/test.rs.rpmorig000064400000000000000000000001011046102023000240040ustar 00000000000000// foo.rpmorig (Red Hat rpm backup) should highlight same as foo bat-0.24.0/tests/syntax-tests/source/Ignored suffixes/test.rs.rpmsave000064400000000000000000000001011046102023000240020ustar 00000000000000// foo.rpmsave (Red Hat rpm backup) should highlight same as foo bat-0.24.0/tests/syntax-tests/source/Ignored suffixes/test.rs.ucf-dist000064400000000000000000000001011046102023000240430ustar 00000000000000// foo.ucf-dist (Debian ucf backup) should highlight same as foo bat-0.24.0/tests/syntax-tests/source/Ignored suffixes/test.rs.ucf-new000064400000000000000000000001001046102023000236700ustar 00000000000000// foo.ucf-new (Debian ucf backup) should highlight same as foo bat-0.24.0/tests/syntax-tests/source/Ignored suffixes/test.rs.ucf-old000064400000000000000000000001001046102023000236550ustar 00000000000000// foo.ucf-old (Debian ucf backup) should highlight same as foo bat-0.24.0/tests/syntax-tests/source/Ignored suffixes/test.rs~000064400000000000000000000000651046102023000225350ustar 00000000000000// foo~ (editor backup) should highlight same as foo bat-0.24.0/tests/syntax-tests/source/Ignored suffixes/test.unknown~000064400000000000000000000000551046102023000236070ustar 00000000000000// foo~ for unknown foo should not highlight bat-0.24.0/tests/syntax-tests/source/JQ/LICENSE.md000064400000000000000000000022561046102023000175300ustar 00000000000000The `sample.jq` file was taken from [SublimeJQ] under the following license: [SublimeJQ]: https://github.com/zogwarg/SublimeJQ MIT License Copyright (c) 2017 Thomas Buick 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.24.0/tests/syntax-tests/source/JQ/sample.jq000064400000000000000000000016421046102023000177370ustar 00000000000000import "../imported-file" ; # With Comments ! def weird($a; $b; $c): [ $a, $b, $c ] | transpose | reduce .[][] as $item ( []; . + $item.property ) ; . | weird (.a; .b; .c) | ( if (. | contains("never") ) then "Why yes" else 12.23 end ) as $never | { hello, why: "because", hello: ( weird | ascii_upcase ), format_eg: ( . | @json "My json string \( . | this | part | just | white | ascii_upcase | transpose)" ), never: $never, "literal_key": literal_value, "this": 12.1e12, "part": "almost" "like": [ 12, 2 "json" { "quite": { similar: "but not quite" } } ], } | ( # And with very basic brace matching # Invalid End ] # Other invalid ends ( [ } ] ) # A "valid" sequence ( [ { key: () , other_key:( [ [] [[]] ] ), gaga } ] ) # A "invalid" sequence ( [ { key: () , other_key:( [ [] [[] ] ), gaga } ] ) "A string\n whith escaped characters \" because we can" ) bat-0.24.0/tests/syntax-tests/source/JSON/test.json000064400000000000000000000010031046102023000202220ustar 00000000000000[ { "name": "john", "age": 42, "isCustomer": false, "children": [] }, { "name": "james", "age": 35, "isCustomer": true, "children": [ { "name": "linus", "age": 4 }, { "name": "sandra", "age": 2 } ] }, { "name": "jessica", "age": null, "isCustomer": false, "children": [] } ] bat-0.24.0/tests/syntax-tests/source/Java/test.java000064400000000000000000000016041046102023000203110ustar 00000000000000import java.util.Scanner; /* This Java program was submiited to help bat * with its syntax highlighting tests */ public class Main { public static void main(String[] arg) { Scanner st = new Scanner(System.in); int t; t = st.nextInt(); String tem; tem = st.nextLine(); for(int zz=0;zz <%-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You 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. --%> <%@page session="false" contentType="text/html; charset=ISO-8859-1" %> <%@page import="java.util.Enumeration" %> <%@page import="jakarta.servlet.http.HttpSession" %> <%@page import="org.apache.catalina.Session" %> <%@page import="org.apache.catalina.manager.JspHelper" %> <%@page import="org.apache.catalina.util.ContextName" %> <%--!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"--%> <% String path = (String) request.getAttribute("path"); String version = (String) request.getAttribute("version"); ContextName cn = new ContextName(path, version); Session currentSession = (Session)request.getAttribute("currentSession"); String currentSessionId = null; HttpSession currentHttpSession = null; if (currentSession != null) { currentHttpSession = currentSession.getSession(); currentSessionId = JspHelper.escapeXml(currentSession.getId()); } else { currentSessionId = "Session invalidated"; } String submitUrl = JspHelper.escapeXml(response.encodeURL( ((HttpServletRequest) pageContext.getRequest()).getRequestURI() + "?path=" + path + "&version=" + version)); %> Sessions Administration: details for <%= currentSessionId %> <% if (currentHttpSession == null) { %>

<%=currentSessionId%>

<% } else { %>

Details for Session <%= currentSessionId %>

Session Id <%= currentSessionId %>
Guessed Locale <%= JspHelper.guessDisplayLocaleFromSession(currentSession) %>
Guessed User <%= JspHelper.guessDisplayUserFromSession(currentSession) %>
Creation Time <%= JspHelper.getDisplayCreationTimeForSession(currentSession) %>
Last Accessed Time <%= JspHelper.getDisplayLastAccessedTimeForSession(currentSession) %>
Session Max Inactive Interval <%= JspHelper.secondsToTimeString(currentSession.getMaxInactiveInterval()) %>
Used Time <%= JspHelper.getDisplayUsedTimeForSession(currentSession) %>
Inactive Time <%= JspHelper.getDisplayInactiveTimeForSession(currentSession) %>
TTL <%= JspHelper.getDisplayTTLForSession(currentSession) %>
<% if ("Primary".equals(request.getParameter("sessionType"))) { %> <% } %>
<%= JspHelper.escapeXml(request.getAttribute("error")) %>
<%= JspHelper.escapeXml(request.getAttribute("message")) %>
<% int nAttributes = 0; Enumeration attributeNamesEnumeration = currentHttpSession.getAttributeNames(); while (attributeNamesEnumeration.hasMoreElements()) { attributeNamesEnumeration.nextElement(); ++nAttributes; } %> <%--tfoot> <% attributeNamesEnumeration = currentHttpSession.getAttributeNames(); while (attributeNamesEnumeration.hasMoreElements()) { String attributeName = attributeNamesEnumeration.nextElement(); %> <% } // end while %>
<%= JspHelper.formatNumber(nAttributes) %> attributes
Remove Attribute Attribute name Attribute value
TODO: set Max Inactive Interval on sessions
<% if ("Primary".equals(request.getParameter("sessionType"))) { %> <% } else { out.print("Primary sessions only"); } %>
<%= JspHelper.escapeXml(attributeName) %> <% Object attributeValue = currentHttpSession.getAttribute(attributeName); %>"><%= JspHelper.escapeXml(attributeValue) %>
<% } // endif%>

<%--div style="display: none;">

Valid HTML 4.01! Valid XHTML 1.0! Valid XHTML 1.1!

bat-0.24.0/tests/syntax-tests/source/JavaScript/test.js000064400000000000000000000052071046102023000211740ustar 00000000000000let letNumber = 1000; const constNumber = 10; var varNumber = -1234; const constNegativeFloat = -1.23; var tooMuch = Infinity; nothing = null; let listofthings = ["thing", 'thing2', `foo`, ["bar"]]; // Simple comment /** * ######### * Multiline * comment * ######### */ let test; for (let i = 0; i < constNumber; i++) { if (test) continue; else test += 1; // random things } while(test < 100 && typeof test === "number") { test = test > 30 ? test+5 : test+1; } function weatherSays(when=Date.now()) { return "rain"; } const thereAreClouds = true; const cloudsCount = 20; switch(weatherSays(Date.now())) { case 'rain': break; case 'sun': default: break; } let rain = false; if ((thereAreClouds && cloudsCount >= 20) || weatherSays() === "rain") { rain = false; } else if (thereAreClouds && weatherSays() == "rain") { // oh no, unsafe two equals checking! rain = true; } else { rain = !!cloudsCount; } class Forecast { constructor(where, isGonnaRainA=true, isGonnaRainB=false, isGonnaRainC=false, ...randomArgs) { this.station = { location: [where.x, where.y, where.z], surroundings: { zoneA: { location: [1, 2, 3], isGonnaRain: isGonnaRainA }, zoneB: { location: [-1, 2, 2], isGonnaRain: isGonnaRainB }, zoneC: { location: [-2, 0, 0], isGonnaRainC: isGonnaRainC }, } }; } async getLocalPrevisions() { const rainZones = [this.station.surroundings.zoneA.isGonnaRain, this.station.surroundings.zoneB.isGonnaRain, this.station.surroundings.zoneC.isGonnaRain]; return await rainZones.filter(z => !!z).length > (rainZones.length / 2); } communicatePrevisions(isGonnaRain=undefined) { if (isGonnaRain) console.log("Take the umbrella."); } destroy() { delete this.station; } static startHiring() { console.log("We're looking for weather presenters."); console.log("A lot of presenters came. Hiring stops."); } /* This forecasting station is magic. It can generate rain, but this method is secret because it's a generator function - nobody uses them! */ * generateRainInZoneC(clouds=[1, 2, 3]) { this.station.surroundings.zoneC.isGonnaRain = true; const makeRain = () => { return "raining!"; }; yield clouds; // first, keeps clouds do { console.log(makeRain()); yield clouds.pop(); // then all clouds do rain } while(clouds.length >= 1); } } Forecast.startHiring(); const forecasting = new Forecast([3, 3, 3]); (async() => { const raining = forecasting.generateRainInZoneC(); raining.next(); forecasting.communicatePrevisions(await forecasting.getLocalPrevisions()); raining.next(); raining.next(); raining.return("stop!"); forecasting.destroy(); })(); bat-0.24.0/tests/syntax-tests/source/Jinja2/template.jinja2000064400000000000000000000012511046102023000216330ustar 00000000000000{% extends 'base.jinja2' %}

{% block title %}{% endblock %}

{% for entry in entries %} Entry {{ loop.index }} {% if entry.show %}

{{ entry.value }}

{% else if false %}

No value

{% endif %} {% endfor %} {% set some_value = 123 %}
{{ some_value | custom_filter }}, {{ some_value | abs }}
{% endset %} {{ some_dict['val'].val }} {# comment #} {# longer comment {{ value }} #} {% raw %} {{ do not transform }} {% endraw %} {% macro some_macro(value) -%}

{{ value }}

{%- endmacro %} {% if another_val is defined %}

{{ another_val }}

{% else %}

Unknown

{% endif %} bat-0.24.0/tests/syntax-tests/source/Julia/test.jl000064400000000000000000000010251046102023000201550ustar 00000000000000x = 3 y = 2x typeof(y) f(x) = 2 + x f f(10) function g(x, y) z = x + y return z^2 end g(1, 2) let s = 0 for i in 1:10 s += i # Equivalent to s = s + i end s end typeof(1:10) function mysum(n) s = 0 for i in 1:n s += i end return s end mysum(100) a = 3 a < 5 if a < 5 "small" else "big" end v = [1, 2, 3] typeof(v) v[2] v[2] = 10 v2 = [i^2 for i in 1:10] M = [1 2 3 4] typeof(M) zeros(5, 5) zeros(Int, 4, 5) [i + j for i in 1:5, j in 1:6] bat-0.24.0/tests/syntax-tests/source/Kotlin/test.kt000064400000000000000000000035661046102023000203760ustar 00000000000000import kotlin.math.* data class Example( val name: String, val numbers: List ) fun interface JokeInterface { fun isFunny(): Boolean } abstract class AbstractJoke : JokeInterface { override fun isFunny() = false abstract fun content(): String } class Joke : AbstractJoke() { override fun isFunny(): Boolean { return true } override fun content(): String = "content of joke here, haha" } class DelegatedJoke(val joke: Joke) : JokeInterface by joke { val number: Long = 123L companion object { const val someConstant = "some constant text" } } object SomeSingleton sealed class Shape { abstract fun area(): Double } data class Square(val sideLength: Double) : Shape() { override fun area(): Double = sideLength.pow(2) } object Point : Shape() { override fun area() = .0 } class Circle(val radius: Double) : Shape() { override fun area(): Double { return PI * radius * radius } } fun String.extensionMethod() = "test" fun main() { val name = """ multiline string some numbers: 123123 42 """.trimIndent() val example = Example(name = name, numbers = listOf(512, 42, null, -1)) example.numbers .filterNotNull() .forEach { println(it) } setOf(Joke(), DelegatedJoke(Joke()).joke) .filter(JokeInterface::isFunny) .map(AbstractJoke::content) .forEachIndexed { index: Int, joke -> println("I heard a funny joke(#${index + 1}): $joke") } listOf(Square(12.3), Point, Circle(5.2)) .associateWith(Shape::area) .toList() .sortedBy { it.second } .forEach { println("${it.first}: ${it.second}") } println("some string".extensionMethod()) require(SomeSingleton::class.simpleName == "SomeSingletonName") { "something does not seem right..." } } bat-0.24.0/tests/syntax-tests/source/LLVM/test.ll000064400000000000000000000033211046102023000176660ustar 00000000000000; ModuleID = 'test.c' source_filename = "test.c" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-pc-linux-gnu" @.str = private unnamed_addr constant [13 x i8] c"Hello World!\00", align 1 ; Function Attrs: noinline norecurse optnone uwtable define dso_local i32 @main(i32 %0, i8** %1) #0 { %3 = alloca i32, align 4 %4 = alloca i32, align 4 %5 = alloca i8**, align 8 store i32 0, i32* %3, align 4 store i32 %0, i32* %4, align 4 store i8** %1, i8*** %5, align 8 %6 = call i32 @puts(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str, i64 0, i64 0)) ret i32 1337 } declare dso_local i32 @puts(i8*) #1 attributes #0 = { noinline norecurse optnone uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } !llvm.module.flags = !{!0} !llvm.ident = !{!1} !0 = !{i32 1, !"wchar_size", i32 4} !1 = !{!"clang version 10.0.0-4ubuntu1 "} bat-0.24.0/tests/syntax-tests/source/Lean/test.lean000064400000000000000000000041651046102023000203120ustar 00000000000000import data.matrix.notation import data.vector2 /-! Helpers that don't currently fit elsewhere... -/ lemma split_eq {m n : Type*} (x : m × n) (p p' : m × n) : p = x ∨ p' = x ∨ (x ≠ p ∧ x ≠ p') := by tauto -- For `playfield`s, the piece type and/or piece index type. variables (X : Type*) variables [has_repr X] namespace chess.utils section repr /-- An auxiliary wrapper for `option X` that allows for overriding the `has_repr` instance for `option`, and rather, output just the value in the `some` and a custom provided `string` for `none`. -/ structure option_wrapper := (val : option X) (none_s : string) instance wrapped_option_repr : has_repr (option_wrapper X) := ⟨λ ⟨val, s⟩, (option.map has_repr.repr val).get_or_else s⟩ variables {X} /-- Construct an `option_wrapper` term from a provided `option X` and the `string` that will override the `has_repr.repr` for `none`. -/ def option_wrap (val : option X) (none_s : string) : option_wrapper X := ⟨val, none_s⟩ -- The size of the "vectors" for a `fin n' → X`, for `has_repr` definitions variables {m' n' : ℕ} /-- For a "vector" `X^n'` represented by the type `Π n' : ℕ, fin n' → X`, where the `X` has a `has_repr` instance itself, we can provide a `has_repr` for the "vector". This definition is used for displaying rows of the playfield, when it is defined via a `matrix`, likely through notation. -/ def vec_repr : Π {n' : ℕ}, (fin n' → X) → string := λ _ v, string.intercalate ", " ((vector.of_fn v).to_list.map repr) instance vec_repr_instance : has_repr (fin n' → X) := ⟨vec_repr⟩ /-- For a `matrix` `X^(m' × n')` where the `X` has a `has_repr` instance itself, we can provide a `has_repr` for the matrix, using `vec_repr` for each of the rows of the matrix. This definition is used for displaying the playfield, when it is defined via a `matrix`, likely through notation. -/ def matrix_repr : Π {m' n'}, matrix (fin m') (fin n') X → string := λ _ _ M, string.intercalate ";\n" ((vector.of_fn M).to_list.map repr) instance matrix_repr_instance : has_repr (matrix (fin n') (fin m') X) := ⟨matrix_repr⟩ end repr end chess.utils bat-0.24.0/tests/syntax-tests/source/Less/example.less000064400000000000000000000016401046102023000210370ustar 00000000000000// Load fonts @import url(https://fonts.googleapis.com/css?family=Lustria|Lato:700); // Color scheme https://kuler.adobe.com/Salmon-on-Ice-color-theme-2291686/ @dk: #3E454C; // dark @hl: #2185C5; // highlight @hll: #7ECEFD; // lighter highlight @lt: #FFF6E5; // light @ct: #FF7F66; // contrast // Sizes @contentWidth: 750px; @marginTop: 50px; @marginSide: 100px; // Fonts and Text @font: 'Lustria', serif; @headerFont: 'Lato', sans; @fontSize: 19px; @fontSizeH1: 50px; @fontSizeH2: 30px; @parSep: 40px; @linkSizeFactor: 0.8; // Sizes for small devices @smallMarginTop: 25px; @smallMarginSide: 25px; @smallFontSize: 18px; @smallFontSizeH1: 40px; @smallFontSizeH2: 28px; @smallParSep: 25px; #wrapper { width: 100%; margin: auto; min-height: 100%; height: auto !important; height: 100%; overflow: hidden !important; position: relative; } bat-0.24.0/tests/syntax-tests/source/Lisp/LICENSE.md000064400000000000000000000022161046102023000201210ustar 00000000000000The `utils.lisp` file has been added from https://github.com/zkat/chillax under the following license: Copyright © 2009-2010 Kat Marchán 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.24.0/tests/syntax-tests/source/Lisp/utils.lisp000064400000000000000000000055101046102023000205460ustar 00000000000000(cl:defpackage :chillax.utils (:use :cl :alexandria) (:export :fun :mkhash :hashget :strcat :dequote :at)) (in-package :chillax.utils) ;;; Functions (defmacro fun (&body body) "This macro puts the FUN back in FUNCTION." `(lambda (&optional _) (declare (ignorable _)) ,@body)) ;;; Hash tables (defun mkhash (&rest keys-and-values &aux (table (make-hash-table :test #'equal))) "Convenience function for `literal' hash table definition." (loop for (key val) on keys-and-values by #'cddr do (setf (gethash key table) val) finally (return table))) (defun hashget (hash &rest keys) "Convenience function for recursively accessing hash tables." (reduce (lambda (h k) (gethash k h)) keys :initial-value hash)) (define-compiler-macro hashget (hash &rest keys) (if (null keys) hash (let ((hash-sym (make-symbol "HASH")) (key-syms (loop for i below (length keys) collect (make-symbol (format nil "~:@(~:R~)-KEY" i))))) `(let ((,hash-sym ,hash) ,@(loop for key in keys for sym in key-syms collect `(,sym ,key))) ,(reduce (lambda (hash key) `(gethash ,key ,hash)) key-syms :initial-value hash-sym))))) (defun (setf hashget) (new-value hash key &rest more-keys) "Uses the last key given to hashget to insert NEW-VALUE into the hash table returned by the second-to-last key. tl;dr: DWIM SETF function for HASHGET." (if more-keys (setf (gethash (car (last more-keys)) (apply #'hashget hash key (butlast more-keys))) new-value) (setf (gethash key hash) new-value))) ;;; Strings (defun strcat (string &rest more-strings) (apply #'concatenate 'string string more-strings)) (defun dequote (string) (let ((len (length string))) (if (and (> len 1) (starts-with #\" string) (ends-with #\" string)) (subseq string 1 (- len 1)) string))) ;;; ;;; At ;;; (defgeneric at (doc &rest keys)) (defgeneric (setf at) (new-value doc key &rest more-keys)) (defmethod at ((doc hash-table) &rest keys) (apply #'hashget doc keys)) (defmethod (setf at) (new-value (doc hash-table) key &rest more-keys) (apply #'(setf hashget) new-value doc key more-keys)) (defmethod at ((doc list) &rest keys) (reduce (lambda (alist key) (cdr (assoc key alist :test #'equal))) keys :initial-value doc)) (defmethod (setf at) (new-value (doc list) key &rest more-keys) (if more-keys (setf (cdr (assoc (car (last more-keys)) (apply #'at doc key (butlast more-keys)) :test #'equal)) new-value) (setf (cdr (assoc key doc :test #'equal)) new-value))) ;; A playful alias. (defun @ (doc &rest keys) (apply #'at doc keys)) (defun (setf @) (new-value doc key &rest more-keys) (apply #'(setf at) new-value doc key more-keys)) bat-0.24.0/tests/syntax-tests/source/Literate Haskell/Main.lhs000064400000000000000000000022611046102023000223170ustar 00000000000000\documentclass{article} \begin{document} \section*{Introduction} Text outside code environments should follow TeX/LaTeX highlighting. The code environment delimiters themselves should be highlighted. Text inside code environments should follow regular Haskell highlighting. \begin{code} import Data.List import System.Environment import Text.Printf twoSumN :: Int -> [Int] -> [Int] twoSumN _ [] = [] twoSumN n (x : xs) | (n - x) `elem` xs = [x, n - x] | otherwise = twoSumN n xs threeSumN :: Int -> [Int] -> [Int] threeSumN _ [] = [] threeSumN n (x : xs) | null partial = threeSumN n xs | otherwise = x : partial where partial = twoSumN (n - x) xs \end{code} Text in-between code environments. % LaTeX comment. \begin{code} output :: String -> IO () output path = do input <- sort . map read . filter (not . null) . lines <$> readFile path printf "File: %s\n" path printf " Part 1: %d\n" . product . twoSumN 2020 $ input printf " Part 2: %d\n" . product . threeSumN 2020 $ input -- Haskell comment inside code environment. main :: IO () main = getArgs >>= mapM_ output \end{code} \end{document} bat-0.24.0/tests/syntax-tests/source/LiveScript/LICENSE.md000064400000000000000000000023401046102023000212740ustar 00000000000000The `livescript-demo.ls` file has been added from https://github.com/paulmillr/LiveScript.tmbundle under the following license: The MIT License (MIT) Copyright (c) 2012 Paul Miller (http://paulmillr.com/), Jeremy Ashkenas 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.24.0/tests/syntax-tests/source/LiveScript/livescript-demo.ls000064400000000000000000000025411046102023000233410ustar 00000000000000a = -> 1 const b = --> 2 var c = ~> 3 d = ~~> e = (a) -> (b) ~> (c) --> (d, e) ~~> 5 dashes-identifiers = -> a - a b -- c 1-1 1- -1 a- a a -a //abc #eaze #@ // // a #baze // publi if it is \abc and ($-y = !(a,) ->) ~= map //a#// then match that | _ | otherwise => implements $("#abc #@a") switch |a=>b | a then b if a => b else c underscores_i$d = -> /regexp1/ and //regexp2//g 'strings' and "strings" and \strings ([2 til 10] or [1 to 50]) |> map (* 2) |> filter (> 5) |> fold (+) setTimeout _, 3000 <| do-stuff _.map; _abc; __ class Class extends Anc-est-or (args) -> copy = (from, to, callback) --> error, data <- read file return callback error if error? error <~ write file, data return callback error if error? callback() $(\#gafBr).text $t.fmtFloat(efb.gaf) -> ~> ~~> --> # Comment /* Comment */ # error, data <- read file /* error, data <- read file */ add = (a=1, b=2) --> a + b add 1 2 do-stuff! do-stuff? # do-stuff? 1 do-stuff + 1 @do-stuff +1 @do-stuff /1 a b c |> d <| e f(g) 'cats' is 'cats' 'cats' `_.is-insensitive` 'CATS' setTimeout _, 1000 <| !-> console.log 'Who summoned me' private-list = yield @get-private-list! switch | true => "#@@spaghetti" ~function add a=1, b=2 => a + b row.0._id new Spaghetti (++a++) (++ 2 ++) (.cool.) (+ a -) (/ 2 *) (ina -a in) (-> a) (ina in$a) (a is-in) (in) ((((((+ a((a)))))))) bat-0.24.0/tests/syntax-tests/source/Log/example.log000064400000000000000000000021311046102023000204610ustar 000000000000002021-03-06 23:22:21.392 https://[2001:db8:4006:812::200e]:8080/path/the%20page.html 2021-03-06 23:22:21 https://example.com:8080/path/the%20page(with_parens).html 2022-03-16T17:41:02.519 helix_term::application [WARN] unhandled window/showMessage: ShowMessageParams { typ: Error, message: "rust-analyzer failed to load workspace: Failed to read Cargo metadata from Cargo.toml file /home/zeta/dev/raytracer/Cargo.toml, cargo 1.61.0-nightly (65c8266 2022-03-09): Failed to run `\"cargo\" \"metadata\" \"--format-version\" \"1\" \"--manifest-path\" \"/home/zeta/dev/raytracer/Cargo.toml\" \"--filter-platform\" \"wasm32-unknown-unknown\"`: `cargo metadata` exited with an error: Updating crates.io index\nerror: failed to select a version for `parking_lot`.\n ... required by package `raytracer v0.1.0 (/home/zeta/dev/raytracer)`\nversions that meet the requirements `^0.12.0` are: 0.12.0\n\nthe package `raytracer` depends on `parking_lot`, with features: `wasm-bindgen` but `parking_lot` does not have these features.\n\n\nfailed to select a version for `parking_lot` which could resolve this conflict\n" } bat-0.24.0/tests/syntax-tests/source/Lua/test.lua000064400000000000000000000012751046102023000200150ustar 00000000000000--- Finds factorial of a number. -- @param value Number to find factorial. -- @return Factorial of number. local function factorial(value) if value <= 1 then return 1 else return value * factorial(value - 1) end end --- Joins a table of strings into a new string. -- @param table Table of strings. -- @param separator Separator character. -- @return Joined string. local function join(table, separator) local data = "" for index, value in ipairs(table) do data = data .. value .. separator end data = data:sub(1, data:len() - 1) return data end local a = factorial(5) print(a) local b = join({ "l", "u", "a" }, ",") print(b) bat-0.24.0/tests/syntax-tests/source/MATLAB/LICENSE.md000064400000000000000000000027521046102023000201570ustar 00000000000000The `test.matlab` file is a modified version of https://github.com/pygments/pygments/blob/3e1b79c82d2df318f63f24984d875fd2a3400808/tests/test_matlab.py under the following license: Copyright (c) 2006-2020 by the respective authors (see AUTHORS file). All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. bat-0.24.0/tests/syntax-tests/source/MATLAB/test.matlab000064400000000000000000000011371046102023000207100ustar 00000000000000function zz=sample(aa) %%%%%%%%%%%%%%%%%% % some comments %%%%%%%%%%%%%%%%%% x = 'a string'; % some 'ticks' in a comment y = 'a string with ''interal'' quotes'; for i=1:20 disp(i); end a = rand(30); b = rand(30); c = a .* b ./ a \ ... comment at end of line and continuation (b .* a + b - a); c = a' * b'; % note: these ticks are for transpose, not quotes. disp('a comment symbol, %, in a string'); !echo abc % this isn't a comment - it's passed to system command function y=myfunc(x) y = exp(x); %{ a block comment %} function no_arg_func fprintf('%s\n', 'function with no args') end bat-0.24.0/tests/syntax-tests/source/Makefile/LICENSE.md000064400000000000000000000031651046102023000207330ustar 00000000000000The `Makefile` (https://github.com/redis/redis/blob/6.0.8/src/Makefile) file has been added from Redis (https://github.com/redis/redis) under the following license: Copyright (c) 2006-2020, Salvatore Sanfilippo All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Redis nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.bat-0.24.0/tests/syntax-tests/source/Makefile/Makefile000064400000000000000000000272541046102023000207740ustar 00000000000000# Redis Makefile # Copyright (C) 2009 Salvatore Sanfilippo # This file is released under the BSD license, see the COPYING file # # The Makefile composes the final FINAL_CFLAGS and FINAL_LDFLAGS using # what is needed for Redis plus the standard CFLAGS and LDFLAGS passed. # However when building the dependencies (Jemalloc, Lua, Hiredis, ...) # CFLAGS and LDFLAGS are propagated to the dependencies, so to pass # flags only to be used when compiling / linking Redis itself REDIS_CFLAGS # and REDIS_LDFLAGS are used instead (this is the case of 'make gcov'). # # Dependencies are stored in the Makefile.dep file. To rebuild this file # Just use 'make dep', but this is only needed by developers. release_hdr := $(shell sh -c './mkreleasehdr.sh') uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not') uname_M := $(shell sh -c 'uname -m 2>/dev/null || echo not') OPTIMIZATION?=-O2 DEPENDENCY_TARGETS=hiredis linenoise lua NODEPS:=clean distclean # Default settings STD=-std=c11 -pedantic -DREDIS_STATIC='' ifneq (,$(findstring clang,$(CC))) ifneq (,$(findstring FreeBSD,$(uname_S))) STD+=-Wno-c11-extensions endif endif WARN=-Wall -W -Wno-missing-field-initializers OPT=$(OPTIMIZATION) PREFIX?=/usr/local INSTALL_BIN=$(PREFIX)/bin INSTALL=install PKG_CONFIG?=pkg-config # Default allocator defaults to Jemalloc if it's not an ARM MALLOC=libc ifneq ($(uname_M),armv6l) ifneq ($(uname_M),armv7l) ifeq ($(uname_S),Linux) MALLOC=jemalloc endif endif endif # To get ARM stack traces if Redis crashes we need a special C flag. ifneq (,$(filter aarch64 armv,$(uname_M))) CFLAGS+=-funwind-tables else ifneq (,$(findstring armv,$(uname_M))) CFLAGS+=-funwind-tables endif endif # Backwards compatibility for selecting an allocator ifeq ($(USE_TCMALLOC),yes) MALLOC=tcmalloc endif ifeq ($(USE_TCMALLOC_MINIMAL),yes) MALLOC=tcmalloc_minimal endif ifeq ($(USE_JEMALLOC),yes) MALLOC=jemalloc endif ifeq ($(USE_JEMALLOC),no) MALLOC=libc endif # Override default settings if possible -include .make-settings FINAL_CFLAGS=$(STD) $(WARN) $(OPT) $(DEBUG) $(CFLAGS) $(REDIS_CFLAGS) FINAL_LDFLAGS=$(LDFLAGS) $(REDIS_LDFLAGS) $(DEBUG) FINAL_LIBS=-lm DEBUG=-g -ggdb # Linux ARM needs -latomic at linking time ifneq (,$(filter aarch64 armv,$(uname_M))) FINAL_LIBS+=-latomic else ifneq (,$(findstring armv,$(uname_M))) FINAL_LIBS+=-latomic endif endif ifeq ($(uname_S),SunOS) # SunOS ifneq ($(@@),32bit) CFLAGS+= -m64 LDFLAGS+= -m64 endif DEBUG=-g DEBUG_FLAGS=-g export CFLAGS LDFLAGS DEBUG DEBUG_FLAGS INSTALL=cp -pf FINAL_CFLAGS+= -D__EXTENSIONS__ -D_XPG6 FINAL_LIBS+= -ldl -lnsl -lsocket -lresolv -lpthread -lrt else ifeq ($(uname_S),Darwin) # Darwin FINAL_LIBS+= -ldl OPENSSL_CFLAGS=-I/usr/local/opt/openssl/include OPENSSL_LDFLAGS=-L/usr/local/opt/openssl/lib else ifeq ($(uname_S),AIX) # AIX FINAL_LDFLAGS+= -Wl,-bexpall FINAL_LIBS+=-ldl -pthread -lcrypt -lbsd else ifeq ($(uname_S),OpenBSD) # OpenBSD FINAL_LIBS+= -lpthread ifeq ($(USE_BACKTRACE),yes) FINAL_CFLAGS+= -DUSE_BACKTRACE -I/usr/local/include FINAL_LDFLAGS+= -L/usr/local/lib FINAL_LIBS+= -lexecinfo endif else ifeq ($(uname_S),FreeBSD) # FreeBSD FINAL_LIBS+= -lpthread -lexecinfo else ifeq ($(uname_S),DragonFly) # FreeBSD FINAL_LIBS+= -lpthread -lexecinfo else ifeq ($(uname_S),OpenBSD) # OpenBSD FINAL_LIBS+= -lpthread -lexecinfo else ifeq ($(uname_S),NetBSD) # NetBSD FINAL_LIBS+= -lpthread -lexecinfo else # All the other OSes (notably Linux) FINAL_LDFLAGS+= -rdynamic FINAL_LIBS+=-ldl -pthread -lrt endif endif endif endif endif endif endif endif # Include paths to dependencies FINAL_CFLAGS+= -I../deps/hiredis -I../deps/linenoise -I../deps/lua/src # Determine systemd support and/or build preference (defaulting to auto-detection) BUILD_WITH_SYSTEMD=no # If 'USE_SYSTEMD' in the environment is neither "no" nor "yes", try to # auto-detect libsystemd's presence and link accordingly. ifneq ($(USE_SYSTEMD),no) LIBSYSTEMD_PKGCONFIG := $(shell $(PKG_CONFIG) --exists libsystemd && echo $$?) # If libsystemd cannot be detected, continue building without support for it # (unless a later check tells us otherwise) ifeq ($(LIBSYSTEMD_PKGCONFIG),0) BUILD_WITH_SYSTEMD=yes endif endif ifeq ($(USE_SYSTEMD),yes) ifneq ($(LIBSYSTEMD_PKGCONFIG),0) $(error USE_SYSTEMD is set to "$(USE_SYSTEMD)", but $(PKG_CONFIG) cannot find libsystemd) endif # Force building with libsystemd BUILD_WITH_SYSTEMD=yes endif ifeq ($(BUILD_WITH_SYSTEMD),yes) FINAL_LIBS+=$(shell $(PKG_CONFIG) --libs libsystemd) FINAL_CFLAGS+= -DHAVE_LIBSYSTEMD endif ifeq ($(MALLOC),tcmalloc) FINAL_CFLAGS+= -DUSE_TCMALLOC FINAL_LIBS+= -ltcmalloc endif ifeq ($(MALLOC),tcmalloc_minimal) FINAL_CFLAGS+= -DUSE_TCMALLOC FINAL_LIBS+= -ltcmalloc_minimal endif ifeq ($(MALLOC),jemalloc) DEPENDENCY_TARGETS+= jemalloc FINAL_CFLAGS+= -DUSE_JEMALLOC -I../deps/jemalloc/include FINAL_LIBS := ../deps/jemalloc/lib/libjemalloc.a $(FINAL_LIBS) endif ifeq ($(BUILD_TLS),yes) FINAL_CFLAGS+=-DUSE_OPENSSL $(OPENSSL_CFLAGS) FINAL_LDFLAGS+=$(OPENSSL_LDFLAGS) LIBSSL_PKGCONFIG := $(shell $(PKG_CONFIG) --exists libssl && echo $$?) ifeq ($(LIBSSL_PKGCONFIG),0) LIBSSL_LIBS=$(shell $(PKG_CONFIG) --libs libssl) else LIBSSL_LIBS=-lssl endif LIBCRYPTO_PKGCONFIG := $(shell $(PKG_CONFIG) --exists libcrypto && echo $$?) ifeq ($(LIBCRYPTO_PKGCONFIG),0) LIBCRYPTO_LIBS=$(shell $(PKG_CONFIG) --libs libcrypto) else LIBCRYPTO_LIBS=-lcrypto endif FINAL_LIBS += ../deps/hiredis/libhiredis_ssl.a $(LIBSSL_LIBS) $(LIBCRYPTO_LIBS) endif REDIS_CC=$(QUIET_CC)$(CC) $(FINAL_CFLAGS) REDIS_LD=$(QUIET_LINK)$(CC) $(FINAL_LDFLAGS) REDIS_INSTALL=$(QUIET_INSTALL)$(INSTALL) CCCOLOR="\033[34m" LINKCOLOR="\033[34;1m" SRCCOLOR="\033[33m" BINCOLOR="\033[37;1m" MAKECOLOR="\033[32;1m" ENDCOLOR="\033[0m" ifndef V QUIET_CC = @printf ' %b %b\n' $(CCCOLOR)CC$(ENDCOLOR) $(SRCCOLOR)$@$(ENDCOLOR) 1>&2; QUIET_LINK = @printf ' %b %b\n' $(LINKCOLOR)LINK$(ENDCOLOR) $(BINCOLOR)$@$(ENDCOLOR) 1>&2; QUIET_INSTALL = @printf ' %b %b\n' $(LINKCOLOR)INSTALL$(ENDCOLOR) $(BINCOLOR)$@$(ENDCOLOR) 1>&2; endif REDIS_SERVER_NAME=redis-server REDIS_SENTINEL_NAME=redis-sentinel REDIS_SERVER_OBJ=adlist.o quicklist.o ae.o anet.o dict.o server.o sds.o zmalloc.o lzf_c.o lzf_d.o pqsort.o zipmap.o sha1.o ziplist.o release.o networking.o util.o object.o db.o replication.o rdb.o t_string.o t_list.o t_set.o t_zset.o t_hash.o config.o aof.o pubsub.o multi.o debug.o sort.o intset.o syncio.o cluster.o crc16.o endianconv.o slowlog.o scripting.o bio.o rio.o rand.o memtest.o crcspeed.o crc64.o bitops.o sentinel.o notify.o setproctitle.o blocked.o hyperloglog.o latency.o sparkline.o redis-check-rdb.o redis-check-aof.o geo.o lazyfree.o module.o evict.o expire.o geohash.o geohash_helper.o childinfo.o defrag.o siphash.o rax.o t_stream.o listpack.o localtime.o lolwut.o lolwut5.o lolwut6.o acl.o gopher.o tracking.o connection.o tls.o sha256.o timeout.o setcpuaffinity.o REDIS_CLI_NAME=redis-cli REDIS_CLI_OBJ=anet.o adlist.o dict.o redis-cli.o zmalloc.o release.o ae.o crcspeed.o crc64.o siphash.o crc16.o REDIS_BENCHMARK_NAME=redis-benchmark REDIS_BENCHMARK_OBJ=ae.o anet.o redis-benchmark.o adlist.o dict.o zmalloc.o siphash.o REDIS_CHECK_RDB_NAME=redis-check-rdb REDIS_CHECK_AOF_NAME=redis-check-aof all: $(REDIS_SERVER_NAME) $(REDIS_SENTINEL_NAME) $(REDIS_CLI_NAME) $(REDIS_BENCHMARK_NAME) $(REDIS_CHECK_RDB_NAME) $(REDIS_CHECK_AOF_NAME) @echo "" @echo "Hint: It's a good idea to run 'make test' ;)" @echo "" Makefile.dep: -$(REDIS_CC) -MM *.c > Makefile.dep 2> /dev/null || true ifeq (0, $(words $(findstring $(MAKECMDGOALS), $(NODEPS)))) -include Makefile.dep endif .PHONY: all persist-settings: distclean echo STD=$(STD) >> .make-settings echo WARN=$(WARN) >> .make-settings echo OPT=$(OPT) >> .make-settings echo MALLOC=$(MALLOC) >> .make-settings echo BUILD_TLS=$(BUILD_TLS) >> .make-settings echo USE_SYSTEMD=$(USE_SYSTEMD) >> .make-settings echo CFLAGS=$(CFLAGS) >> .make-settings echo LDFLAGS=$(LDFLAGS) >> .make-settings echo REDIS_CFLAGS=$(REDIS_CFLAGS) >> .make-settings echo REDIS_LDFLAGS=$(REDIS_LDFLAGS) >> .make-settings echo PREV_FINAL_CFLAGS=$(FINAL_CFLAGS) >> .make-settings echo PREV_FINAL_LDFLAGS=$(FINAL_LDFLAGS) >> .make-settings -(cd ../deps && $(MAKE) $(DEPENDENCY_TARGETS)) .PHONY: persist-settings # Prerequisites target .make-prerequisites: @touch $@ # Clean everything, persist settings and build dependencies if anything changed ifneq ($(strip $(PREV_FINAL_CFLAGS)), $(strip $(FINAL_CFLAGS))) .make-prerequisites: persist-settings endif ifneq ($(strip $(PREV_FINAL_LDFLAGS)), $(strip $(FINAL_LDFLAGS))) .make-prerequisites: persist-settings endif # redis-server $(REDIS_SERVER_NAME): $(REDIS_SERVER_OBJ) $(REDIS_LD) -o $@ $^ ../deps/hiredis/libhiredis.a ../deps/lua/src/liblua.a $(FINAL_LIBS) # redis-sentinel $(REDIS_SENTINEL_NAME): $(REDIS_SERVER_NAME) $(REDIS_INSTALL) $(REDIS_SERVER_NAME) $(REDIS_SENTINEL_NAME) # redis-check-rdb $(REDIS_CHECK_RDB_NAME): $(REDIS_SERVER_NAME) $(REDIS_INSTALL) $(REDIS_SERVER_NAME) $(REDIS_CHECK_RDB_NAME) # redis-check-aof $(REDIS_CHECK_AOF_NAME): $(REDIS_SERVER_NAME) $(REDIS_INSTALL) $(REDIS_SERVER_NAME) $(REDIS_CHECK_AOF_NAME) # redis-cli $(REDIS_CLI_NAME): $(REDIS_CLI_OBJ) $(REDIS_LD) -o $@ $^ ../deps/hiredis/libhiredis.a ../deps/linenoise/linenoise.o $(FINAL_LIBS) # redis-benchmark $(REDIS_BENCHMARK_NAME): $(REDIS_BENCHMARK_OBJ) $(REDIS_LD) -o $@ $^ ../deps/hiredis/libhiredis.a $(FINAL_LIBS) dict-benchmark: dict.c zmalloc.c sds.c siphash.c $(REDIS_CC) $(FINAL_CFLAGS) $^ -D DICT_BENCHMARK_MAIN -o $@ $(FINAL_LIBS) DEP = $(REDIS_SERVER_OBJ:%.o=%.d) $(REDIS_CLI_OBJ:%.o=%.d) $(REDIS_BENCHMARK_OBJ:%.o=%.d) -include $(DEP) # Because the jemalloc.h header is generated as a part of the jemalloc build, # building it should complete before building any other object. Instead of # depending on a single artifact, build all dependencies first. %.o: %.c .make-prerequisites $(REDIS_CC) -MMD -o $@ -c $< clean: rm -rf $(REDIS_SERVER_NAME) $(REDIS_SENTINEL_NAME) $(REDIS_CLI_NAME) $(REDIS_BENCHMARK_NAME) $(REDIS_CHECK_RDB_NAME) $(REDIS_CHECK_AOF_NAME) *.o *.gcda *.gcno *.gcov redis.info lcov-html Makefile.dep dict-benchmark rm -f $(DEP) .PHONY: clean distclean: clean -(cd ../deps && $(MAKE) distclean) -(rm -f .make-*) .PHONY: distclean test: $(REDIS_SERVER_NAME) $(REDIS_CHECK_AOF_NAME) @(cd ..; ./runtest) test-sentinel: $(REDIS_SENTINEL_NAME) @(cd ..; ./runtest-sentinel) check: test lcov: $(MAKE) gcov @(set -e; cd ..; ./runtest --clients 1) @geninfo -o redis.info . @genhtml --legend -o lcov-html redis.info test-sds: sds.c sds.h $(REDIS_CC) sds.c zmalloc.c -DSDS_TEST_MAIN $(FINAL_LIBS) -o /tmp/sds_test /tmp/sds_test .PHONY: lcov bench: $(REDIS_BENCHMARK_NAME) ./$(REDIS_BENCHMARK_NAME) 32bit: @echo "" @echo "WARNING: if it fails under Linux you probably need to install libc6-dev-i386" @echo "" $(MAKE) CFLAGS="-m32" LDFLAGS="-m32" gcov: $(MAKE) REDIS_CFLAGS="-fprofile-arcs -ftest-coverage -DCOVERAGE_TEST" REDIS_LDFLAGS="-fprofile-arcs -ftest-coverage" noopt: $(MAKE) OPTIMIZATION="-O0" valgrind: $(MAKE) OPTIMIZATION="-O0" MALLOC="libc" helgrind: $(MAKE) OPTIMIZATION="-O0" MALLOC="libc" CFLAGS="-D__ATOMIC_VAR_FORCE_SYNC_MACROS" src/help.h: @../utils/generate-command-help.rb > help.h install: all @mkdir -p $(INSTALL_BIN) $(REDIS_INSTALL) $(REDIS_SERVER_NAME) $(INSTALL_BIN) $(REDIS_INSTALL) $(REDIS_BENCHMARK_NAME) $(INSTALL_BIN) $(REDIS_INSTALL) $(REDIS_CLI_NAME) $(INSTALL_BIN) $(REDIS_INSTALL) $(REDIS_CHECK_RDB_NAME) $(INSTALL_BIN) $(REDIS_INSTALL) $(REDIS_CHECK_AOF_NAME) $(INSTALL_BIN) @ln -sf $(REDIS_SERVER_NAME) $(INSTALL_BIN)/$(REDIS_SENTINEL_NAME) uninstall: rm -f $(INSTALL_BIN)/{$(REDIS_SERVER_NAME),$(REDIS_BENCHMARK_NAME),$(REDIS_CLI_NAME),$(REDIS_CHECK_RDB_NAME),$(REDIS_CHECK_AOF_NAME),$(REDIS_SENTINEL_NAME)} bat-0.24.0/tests/syntax-tests/source/Manpage/bat-0.16.man000064400000000000000000000220541046102023000210050ustar 00000000000000BAT(1) General Commands Manual BAT(1) NAME bat - a cat(1) clone with syntax highlighting and Git integration. USAGE bat [OPTIONS] [FILE]... bat cache [CACHE-OPTIONS] [--build|--clear] DESCRIPTION bat 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. bat supports a large number of programming and markup languages. It also communicates with git(1) to show modifications with respect to the git index. bat automatically pipes its output through a pager (by de‐ fault: less). Whenever the output of bat goes to a non-interactive terminal, i.e. when the output is piped into another process or into a file, bat will act as a drop-in replacement for cat(1) and fall back to printing the plain file contents. OPTIONS General remarks: Command-line options like '-l'/'--language' that take values can be specified as either '--language value', '--lan‐ guage=value', '-l value' or '-lvalue'. -A, --show-all Show non-printable characters like space, tab or newline. Use '--tabs' to control the width of the tab-placeholders. -p, --plain Only show plain style, no decorations. This is an alias for '--style=plain'. When '-p' is used twice ('-pp'), it also dis‐ ables automatic paging (alias for '--style=plain --pager=never'). -l, --language Explicitly set the language for syntax highlighting. The lan‐ guage can be specified as a name (like 'C++' or 'LaTeX') or pos‐ sible 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 --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. --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 en‐ ables colors if an interactive terminal is detected. Possible values: *auto*, never, always. --italic-text Specify when to use ANSI sequences for italic text in the out‐ put. 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 in‐ teractive 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 '--pag‐ ing=never' or its alias, -P. 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. --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'. --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="..."). --list-themes Display a list of supported themes for syntax highlighting. --style Configure which elements (line numbers, file headers, grid bor‐ ders, 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: *auto*, full, plain, changes, header, grid, numbers, snip. -r, --line-range ... Only print the specified range of lines for each file. For exam‐ ple: --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 -L, --list-languages Display a list of supported languages for syntax highlighting. -u, --unbuffered This option exists for POSIX-compliance reasons ('u' is for 'un‐ buffered'). The output is always unbuffered - this option is simply ignored. -h, --help Print this help message. -V, --version Show version information. POSITIONAL ARGUMENTS ... Files to print and concatenate. Use a dash ('-') or no argument at all to read from standard input. SUBCOMMANDS cache - Modify the syntax-definition and theme cache. FILES 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: bat --config-file Alternatively, you can use the BAT_CONFIG_PATH environment variable to point bat to a non-default location of the configuration file. ADDING CUSTOM LANGUAGES bat supports Sublime Text .sublime-syntax language files, and can be customized to add additional languages to your local installation. To do this, add the .sublime-snytax language files to `$(bat --config- dir)/syntaxes` and run `bat cache --build`. Example: 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 # And then build the cache. bat cache --build Once the cache is built, the new language will be visible in `bat --list-languages`. If you ever want to remove the custom languages, you can clear the cache with `bat cache --clear`. ADDING CUSTOM THEMES Similarly to custom languages, bat supports Sublime Text .tmTheme themes. These can be installed to `$(bat --config-dir)/themes`, and are added to the cache with `bat cache --build`. MORE INFORMATION For more information and up-to-date documentation, visit the bat repo: https://github.com/sharkdp/bat BAT(1) bat-0.24.0/tests/syntax-tests/source/Manpage/fzf-0.33.0.man000064400000000000000000001033121046102023000211560ustar 00000000000000fzf(1) fzf - a command-line fuzzy finder fzf(1) NAME fzf - a command-line fuzzy finder SYNOPSIS fzf [options] DESCRIPTION fzf is a general-purpose command-line fuzzy finder. OPTIONS Search mode -x, --extended Extended-search mode. Since 0.10.9, this is enabled by default. You can disable it with +x or --no-extended. -e, --exact Enable exact-match -i Case-insensitive match (default: smart-case match) +i Case-sensitive match --literal Do not normalize latin script letters for matching. --scheme=SCHEME Choose scoring scheme tailored for different types of input. default Generic scoring scheme designed to work well with any type of input path Scoring scheme for paths (additional bonus point only after path separator) history Scoring scheme for command history (no additional bonus points). Sets --tiebreak=index as well. --algo=TYPE Fuzzy matching algorithm (default: v2) v2 Optimal scoring algorithm (quality) v1 Faster but not guaranteed to find the optimal result (performance) -n, --nth=N[,..] Comma-separated list of field index expressions for limiting search scope. See FIELD INDEX EXPRESSION for the details. --with-nth=N[,..] Transform the presentation of each line using field index expressions -d, --delimiter=STR Field delimiter regex for --nth and --with-nth (default: AWK-style) --disabled Do not perform search. With this option, fzf becomes a simple selector interface rather than a "fuzzy finder". You can later enable the search using enable-search or toggle- search action. Search result +s, --no-sort Do not sort the result --tac Reverse the order of the input e.g. history | fzf --tac --no-sort --tiebreak=CRI[,..] Comma-separated list of sort criteria to apply when the scores are tied. length Prefers line with shorter length chunk Prefers line with shorter matched chunk (delimited by whitespaces) begin Prefers line with matched substring closer to the beginning end Prefers line with matched substring closer to the end index Prefers line that appeared earlier in the input stream - Each criterion should appear only once in the list - index is only allowed at the end of the list - index is implicitly appended to the list when not specified - Default is length (or equivalently length,index) - If end is found in the list, fzf will scan each line backwards Interface -m, --multi Enable multi-select with tab/shift-tab. It optionally takes an integer argument which denotes the maximum number of items that can be selected. +m, --no-multi Disable multi-select --no-mouse Disable mouse --bind=KEYBINDS Comma-separated list of custom key bindings. See KEY/EVENT BINDINGS for the details. --cycle Enable cyclic scroll --keep-right Keep the right end of the line visible when it's too long. Effective only when the query string is empty. --scroll-off=LINES Number of screen lines to keep above or below when scrolling to the top or to the bottom (default: 0). --no-hscroll Disable horizontal scroll --hscroll-off=COLS Number of screen columns to keep to the right of the highlighted substring (default: 10). Setting it to a large value will cause the text to be positioned on the center of the screen. --filepath-word Make word-wise movements and actions respect path separators. The following actions are affected: backward-kill-word backward-word forward-word kill-word --jump-labels=CHARS Label characters for jump and jump-accept Layout --height=HEIGHT[%] Display fzf window below the cursor with the given height instead of using the full screen. --min-height=HEIGHT Minimum height when --height is given in percent (default: 10). Ignored when --height is not specified. --layout=LAYOUT Choose the layout (default: default) default Display from the bottom of the screen reverse Display from the top of the screen reverse-list Display from the top of the screen, prompt at the bottom --reverse A synonym for --layout=reverse --border[=BORDER_OPT] Draw border around the finder rounded Border with rounded corners (default) sharp Border with sharp corners horizontal Horizontal lines above and below the finder vertical Vertical lines on each side of the finder top (up) bottom (down) left right none --no-unicode Use ASCII characters instead of Unicode box drawing characters to draw border --margin=MARGIN Comma-separated expression for margins around the finder. TRBL Same margin for top, right, bottom, and left TB,RL Vertical, horizontal margin T,RL,B Top, horizontal, bottom margin T,R,B,L Top, right, bottom, left margin Each part can be given in absolute number or in percentage relative to the terminal size with % suffix. e.g. fzf --margin 10% fzf --margin 1,5% --padding=PADDING Comma-separated expression for padding inside the border. Padding is distinguishable from margin only when --border option is used. e.g. fzf --margin 5% --padding 5% --border --preview 'cat {}' \ --color bg:#222222,preview-bg:#333333 TRBL Same padding for top, right, bottom, and left TB,RL Vertical, horizontal padding T,RL,B Top, horizontal, bottom padding T,R,B,L Top, right, bottom, left padding --info=STYLE Determines the display style of finder info. default Display on the next line to the prompt inline Display on the same line hidden Do not display finder info --no-info A synonym for --info=hidden --prompt=STR Input prompt (default: '> ') --pointer=STR Pointer to the current line (default: '>') --marker=STR Multi-select marker (default: '>') --header=STR The given string will be printed as the sticky header. The lines are displayed in the given order from top to bottom regardless of --layout option, and are not affected by --with-nth. ANSI color codes are processed even when --ansi is not set. --header-lines=N The first N lines of the input are treated as the sticky header. When --with-nth is set, the lines are transformed just like the other lines that follow. --header-first Print header before the prompt line --ellipsis=STR Ellipsis to show when line is truncated (default: '..') Display --ansi Enable processing of ANSI color codes --tabstop=SPACES Number of spaces for a tab character (default: 8) --color=[BASE_SCHEME][,COLOR_NAME[:ANSI_COLOR][:ANSI_ATTRIBUTES]]... Color configuration. The name of the base color scheme is followed by custom color mappings. BASE SCHEME: (default: dark on 256-color terminal, otherwise 16) dark Color scheme for dark 256-color terminal light Color scheme for light 256-color terminal 16 Color scheme for 16-color terminal bw No colors (equivalent to --no-color) COLOR NAMES: fg Text bg Background preview-fg Preview window text preview-bg Preview window background hl Highlighted substrings fg+ Text (current line) bg+ Background (current line) gutter Gutter on the left (defaults to bg+) hl+ Highlighted substrings (current line) query Query string disabled Query string when search is disabled info Info line (match counters) border Border around the window (--border and --preview) prompt Prompt pointer Pointer to the current line marker Multi-select marker spinner Streaming input indicator header Header ANSI COLORS: -1 Default terminal foreground/background color (or the original color of the text) 0 ~ 15 16 base colors black red green yellow blue magenta cyan white bright-black (gray | grey) bright-red bright-green bright-yellow bright-blue bright-magenta bright-cyan bright-white 16 ~ 255 ANSI 256 colors #rrggbb 24-bit colors ANSI ATTRIBUTES: (Only applies to foreground colors) regular Clears previously set attributes; should precede the other ones bold underline reverse dim italic strikethrough EXAMPLES: # Seoul256 theme with 8-bit colors # (https://github.com/junegunn/seoul256.vim) fzf --color='bg:237,bg+:236,info:143,border:240,spinner:108' \ --color='hl:65,fg:252,header:65,fg+:252' \ --color='pointer:161,marker:168,prompt:110,hl+:108' # Seoul256 theme with 24-bit colors fzf --color='bg:#4B4B4B,bg+:#3F3F3F,info:#BDBB72,border:#6B6B6B,spinner:#98BC99' \ --color='hl:#719872,fg:#D9D9D9,header:#719872,fg+:#D9D9D9' \ --color='pointer:#E12672,marker:#E17899,prompt:#98BEDE,hl+:#98BC99' --no-bold Do not use bold text --black Use black background History --history=HISTORY_FILE Load search history from the specified file and update the file on completion. When enabled, CTRL-N and CTRL-P are automatically remapped to next-history and previous-history. --history-size=N Maximum number of entries in the history file (default: 1000). The file is automatically truncated when the number of the lines exceeds the value. Preview --preview=COMMAND Execute the given command for the current line and display the result on the preview window. {} in the command is the placeholder that is replaced to the single-quoted string of the current line. To transform the replacement string, specify field index expressions between the braces (See FIELD INDEX EXPRESSION for the details). e.g. fzf --preview='head -$LINES {}' ls -l | fzf --preview="echo user={3} when={-4..-2}; cat {-1}" --header-lines=1 fzf exports $FZF_PREVIEW_LINES and $FZF_PREVIEW_COLUMNS so that they represent the exact size of the preview window. (It also overrides $LINES and $COLUMNS with the same values but they can be reset by the default shell, so prefer to refer to the ones with FZF_PREVIEW_ prefix.) A placeholder expression starting with + flag will be replaced to the space-separated list of the selected lines (or the current line if no selection was made) individually quoted. e.g. fzf --multi --preview='head -10 {+}' git log --oneline | fzf --multi --preview 'git show {+1}' When using a field index expression, leading and trailing whitespace is stripped from the replacement string. To preserve the whitespace, use the s flag. Also, {q} is replaced to the current query string, and {n} is replaced to zero-based ordinal index of the line. Use {+n} if you want all index numbers when multiple lines are selected. A placeholder expression with f flag is replaced to the path of a temporary file that holds the evaluated list. This is useful when you multi-select a large number of items and the length of the evaluated string may exceed ARG_MAX. e.g. # Press CTRL-A to select 100K items and see the sum of all the numbers. # This won't work properly without 'f' flag due to ARG_MAX limit. seq 100000 | fzf --multi --bind ctrl-a:select-all \ --preview "awk '{sum+=\$1} END {print sum}' {+f}" Note that you can escape a placeholder pattern by prepending a backslash. Preview window will be updated even when there is no match for the current query if any of the placeholder expressions evaluates to a non-empty string. Since 0.24.0, fzf can render partial preview content before the preview command completes. ANSI escape sequence for clearing the display (CSI 2 J) is supported, so you can use it to implement preview window that is constantly updating. e.g. fzf --preview 'for i in $(seq 100000); do (( i % 200 == 0 )) && printf "\033[2J" echo "$i" sleep 0.01 done' --preview-window=[POSITION][,SIZE[%]][,border-BORDER_OPT][,[no]wrap][,[no]follow][,[no]cycle][,[no]hidden][,+SCROLL[OFFSETS][/DENOM]][,~HEADER_LINES][,default][,