diff --git a/.github/workflows/desktop-ci.yml b/.github/workflows/desktop-ci.yml new file mode 100644 index 0000000..8b6f47a --- /dev/null +++ b/.github/workflows/desktop-ci.yml @@ -0,0 +1,88 @@ +name: desktop-ci + +on: + pull_request: + branches: + - main + - dev + paths: + - apps/desktop/** + - crates/** + - Cargo.toml + - Cargo.lock + - mise.toml + - .github/workflows/** + push: + branches: + - main + - dev + paths: + - apps/desktop/** + - crates/** + - Cargo.toml + - Cargo.lock + - mise.toml + - .github/workflows/** + +concurrency: + group: desktop-ci-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + validate: + name: validate (${{ matrix.platform }}) + runs-on: ${{ matrix.platform }} + strategy: + fail-fast: false + matrix: + platform: + - ubuntu-22.04 + - windows-latest + defaults: + run: + shell: bash + + steps: + - name: Check out repository + uses: actions/checkout@v6 + + - name: Set up pnpm + uses: pnpm/action-setup@v4 + with: + version: 10.27.0 + run_install: false + + - name: Set up Node.js + uses: actions/setup-node@v6 + with: + node-version: 22 + cache: pnpm + cache-dependency-path: apps/desktop/pnpm-lock.yaml + + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: "3.13" + + - name: Set up Rust + uses: dtolnay/rust-toolchain@stable + with: + toolchain: 1.92.0 + + - name: Install Linux system dependencies + if: matrix.platform == 'ubuntu-22.04' + run: | + sudo apt-get update + sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf + + - name: Install frontend dependencies + run: pnpm --dir apps/desktop install --frozen-lockfile + + - name: Check Svelte and TypeScript + run: pnpm --dir apps/desktop check + + - name: Check Rust workspace crate + run: cargo check --manifest-path apps/desktop/src-tauri/Cargo.toml + + - name: Check integrated Tauri build + run: pnpm --dir apps/desktop tauri build --no-bundle --ci diff --git a/.github/workflows/desktop-release.yml b/.github/workflows/desktop-release.yml new file mode 100644 index 0000000..359f15d --- /dev/null +++ b/.github/workflows/desktop-release.yml @@ -0,0 +1,190 @@ +name: desktop-release + +on: + push: + tags: + - "v*" + workflow_dispatch: + inputs: + tag_name: + description: "Semver tag to release, for example v0.2.0" + required: true + type: string + +permissions: + contents: write + +concurrency: + group: desktop-release-${{ github.ref || inputs.tag_name }} + cancel-in-progress: false + +jobs: + preflight: + name: preflight + runs-on: ubuntu-22.04 + defaults: + run: + shell: bash + outputs: + tag_name: ${{ steps.resolve_tag.outputs.tag_name }} + version: ${{ steps.validate.outputs.version }} + + steps: + - name: Check out repository + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: "3.13" + + - name: Resolve release tag + id: resolve_tag + env: + INPUT_TAG_NAME: ${{ inputs.tag_name }} + run: | + if [[ "${GITHUB_REF_TYPE}" == "tag" ]]; then + tag_name="${GITHUB_REF_NAME}" + else + tag_name="${INPUT_TAG_NAME}" + fi + + if [[ -z "${tag_name}" ]]; then + echo "Release tag is required." >&2 + exit 1 + fi + + echo "tag_name=${tag_name}" >> "${GITHUB_OUTPUT}" + + - name: Validate version lockstep and tag + id: validate + env: + RELEASE_TAG: ${{ steps.resolve_tag.outputs.tag_name }} + run: | + python - <<'PY' + import json + import os + import pathlib + import re + import sys + import tomllib + + root = pathlib.Path(".") + release_tag = os.environ["RELEASE_TAG"] + + if not re.fullmatch(r"v\d+\.\d+\.\d+", release_tag): + print( + f"Release tag '{release_tag}' is invalid. Expected format vX.Y.Z.", + file=sys.stderr, + ) + sys.exit(1) + + versions = { + "apps/desktop/package.json": json.loads( + (root / "apps/desktop/package.json").read_text(encoding="utf-8") + )["version"], + "apps/desktop/src-tauri/Cargo.toml": tomllib.loads( + (root / "apps/desktop/src-tauri/Cargo.toml").read_text(encoding="utf-8") + )["package"]["version"], + "apps/desktop/src-tauri/tauri.conf.json": json.loads( + (root / "apps/desktop/src-tauri/tauri.conf.json").read_text( + encoding="utf-8" + ) + )["version"], + "crates/supervisor/Cargo.toml": tomllib.loads( + (root / "crates/supervisor/Cargo.toml").read_text(encoding="utf-8") + )["package"]["version"], + } + + unique_versions = sorted(set(versions.values())) + if len(unique_versions) != 1: + print("Version mismatch detected across release manifests:", file=sys.stderr) + for path, version in versions.items(): + print(f" - {path}: {version}", file=sys.stderr) + sys.exit(1) + + version = unique_versions[0] + expected_tag = f"v{version}" + if release_tag != expected_tag: + print( + f"Tag '{release_tag}' does not match manifest version '{version}'. " + f"Expected '{expected_tag}'.", + file=sys.stderr, + ) + sys.exit(1) + + print(f"Validated release version {version} for tag {release_tag}.") + output_path = pathlib.Path(os.environ["GITHUB_OUTPUT"]) + with output_path.open("a", encoding="utf-8") as output: + output.write(f"version={version}\n") + PY + + publish: + name: publish (${{ matrix.platform }}) + runs-on: ${{ matrix.platform }} + needs: preflight + strategy: + fail-fast: false + matrix: + include: + - platform: ubuntu-22.04 + tauri_args: --ci --no-sign --bundles appimage + - platform: windows-latest + tauri_args: --ci --no-sign + defaults: + run: + shell: bash + + steps: + - name: Check out repository + uses: actions/checkout@v6 + + - name: Set up pnpm + uses: pnpm/action-setup@v4 + with: + version: 10.27.0 + run_install: false + + - name: Set up Node.js + uses: actions/setup-node@v6 + with: + node-version: 22 + cache: pnpm + cache-dependency-path: apps/desktop/pnpm-lock.yaml + + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: "3.13" + + - name: Set up Rust + uses: dtolnay/rust-toolchain@stable + with: + toolchain: 1.92.0 + + - name: Install Linux system dependencies + if: matrix.platform == 'ubuntu-22.04' + run: | + sudo apt-get update + sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf + + - name: Install frontend dependencies + run: pnpm --dir apps/desktop install --frozen-lockfile + + - name: Build and publish draft release + uses: tauri-apps/tauri-action@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + projectPath: apps/desktop + tauriScript: pnpm tauri + tagName: ${{ needs.preflight.outputs.tag_name }} + releaseName: Senamby ${{ needs.preflight.outputs.tag_name }} + releaseBody: | + Automated draft release for ${{ needs.preflight.outputs.tag_name }}. + releaseDraft: true + prerelease: false + releaseCommitish: ${{ github.sha }} + args: ${{ matrix.tauri_args }} diff --git a/.gitignore b/.gitignore index 3efccbb..aaffcbe 100644 --- a/.gitignore +++ b/.gitignore @@ -1,167 +1,39 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class +.DS_Store +Thumbs.db +Desktop.ini +.directory -# C extensions -*.so +**/*.log +pnpm-debug.log* -# Distribution / packaging -.Python -build/ -develop-eggs/ +node_modules/ +.pnpm-store/ dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ +build/ +.svelte-kit/ +.output/ -# PyBuilder -.pybuilder/ target/ +docs-dev +docs-dev/** -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -#poetry.lock +apps/desktop/src-tauri/gen/ +apps/desktop/src-tauri/binaries/ +apps/desktop/src-tauri/bin/ -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -#pdm.lock -# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it -# in version control. -# https://pdm.fming.dev/latest/usage/project/#working-with-version-control -.pdm.toml -.pdm-python -.pdm-build/ - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments .env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site +.env.* +!.env.example +!.env.test -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ - -# PyCharm -# JetBrains specific template is maintained in a separate JetBrains.gitignore that can -# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore -# and can be added to the global gitignore or merged into this file. For a more nuclear -# option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ - -temp_logs/ -.idea/ +__pycache__/ +*.py[cod] +.venv/ +venv/ -.vscode/ \ No newline at end of file +**/.vscode/ +!**/.vscode/* +!**/.vscode/extensions.json +!**/.vscode/settings.json +!**/.vscode/tasks.json +!**/.vscode/launch.json diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..aa1749e --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,5376 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "async-signal" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "atk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +dependencies = [ + "serde_core", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "brotli" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bumpalo" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" + +[[package]] +name = "bytemuck" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +dependencies = [ + "serde", +] + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.10.0", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.17", +] + +[[package]] +name = "cargo_toml" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" +dependencies = [ + "serde", + "toml 0.9.10+spec-1.1.0", +] + +[[package]] +name = "cc" +version = "1.2.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a0aeaff4ff1a90589618835a598e545176939b97874f7abc7851caa0618f203" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link 0.2.1", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" +dependencies = [ + "bitflags 2.10.0", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.10.0", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.29.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "matches", + "phf 0.10.1", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.114", +] + +[[package]] +name = "ctor" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" +dependencies = [ + "quote", + "syn 2.0.114", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.114", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "deranged" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "derive_more" +version = "0.99.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.114", +] + +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys 0.4.1", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys 0.5.0", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users 0.4.6", + "windows-sys 0.48.0", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users 0.5.2", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.10.0", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "embed-resource" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 0.9.10+spec-1.1.0", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645cbb3a84e60b7531617d5ae4e57f7e27308f6445f5abf653209ea76dec8dff" + +[[package]] +name = "flate2" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gdk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.10.0", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "html5ever" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" +dependencies = [ + "log", + "mac", + "markup5ever", + "match_token", +] + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-util" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" +dependencies = [ + "byteorder", + "png", +] + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", + "serde", + "serde_core", +] + +[[package]] +name = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[package]] +name = "itoa" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "js-sys" +version = "0.3.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.10.0", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "kuchikiki" +version = "0.8.8-speedreader" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" +dependencies = [ + "cssparser", + "html5ever", + "indexmap 2.12.1", + "selectors", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] + +[[package]] +name = "libc" +version = "0.2.179" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5a2d376baa530d1238d133232d15e239abad80d05838b4b59354e5268af431f" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libredox" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" +dependencies = [ + "bitflags 2.10.0", + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "markup5ever" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" +dependencies = [ + "log", + "phf 0.11.3", + "phf_codegen 0.11.3", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "match_token" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", +] + +[[package]] +name = "muda" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror 2.0.17", + "windows-sys 0.60.2", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.10.0", + "jni-sys", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags 2.10.0", + "cfg-if", + "cfg_aliases", + "libc", + "memoffset", +] + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +dependencies = [ + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "objc2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +dependencies = [ + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.10.0", + "block2", + "libc", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-text", + "objc2-core-video", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.10.0", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "bitflags 2.10.0", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.10.0", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.10.0", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.10.0", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-core-video" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" +dependencies = [ + "bitflags 2.10.0", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-io-surface", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-exception-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +dependencies = [ + "cc", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.10.0", + "block2", + "libc", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.10.0", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-javascript-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a1e6550c4caed348956ce3370c9ffeca70bb1dbed4fa96112e7c6170e074586" +dependencies = [ + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.10.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-security" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" +dependencies = [ + "bitflags 2.10.0", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.10.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +dependencies = [ + "bitflags 2.10.0", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-javascript-core", + "objc2-security", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "open" +version = "5.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc" +dependencies = [ + "dunce", + "is-wsl", + "libc", + "pathdiff", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_shared 0.8.0", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_macros 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared 0.11.3", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher 1.0.1", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plist" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" +dependencies = [ + "base64 0.22.1", + "indexmap 2.12.1", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "pretty_assertions" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" +dependencies = [ + "diff", + "yansi", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "proc-macro-crate" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +dependencies = [ + "toml_edit 0.23.10+spec-1.0.0", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[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 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.10.0", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror 2.0.17", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "regex" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "rfd" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15ad77d9e70a92437d8f74c35d99b4e4691128df018833e99f90bcd36152672" +dependencies = [ + "block2", + "dispatch2", + "glib-sys", + "gobject-sys", + "gtk-sys", + "js-sys", + "log", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-sys 0.60.2", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" +dependencies = [ + "bitflags 2.10.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984" + +[[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 = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54e910108742c57a770f492731f99be216a52fadd361b06c8fb59d74ccc267d2" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.114", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "selectors" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" +dependencies = [ + "bitflags 1.3.2", + "cssparser", + "derive_more", + "fxhash", + "log", + "phf 0.8.0", + "phf_codegen 0.8.0", + "precomputed-hash", + "servo_arc", + "smallvec", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "senamby" +version = "0.1.0" +dependencies = [ + "chrono", + "dirs 5.0.1", + "parking_lot", + "serde", + "serde_json", + "tauri", + "tauri-build", + "tauri-plugin-dialog", + "tauri-plugin-opener", + "thiserror 1.0.69", + "uuid", +] + +[[package]] +name = "senamby-supervisor" +version = "0.1.0" +dependencies = [ + "anyhow", + "pretty_assertions", + "serde", + "serde_json", + "thiserror 2.0.17", + "tracing", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.12.1", + "schemars 0.9.0", + "schemars 1.2.0", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "servo_arc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "bytemuck", + "js-sys", + "ndk", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall", + "tracing", + "wasm-bindgen", + "web-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "string_cache" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared 0.11.3", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "swift-rs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml 0.8.2", + "version-compare", +] + +[[package]] +name = "tao" +version = "0.34.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" +dependencies = [ + "bitflags 2.10.0", + "block2", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dispatch", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "lazy_static", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "once_cell", + "parking_lot", + "raw-window-handle", + "scopeguard", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "2.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a3868da5508446a7cd08956d523ac3edf0a8bc20bf7e4038f9a95c2800d2033" +dependencies = [ + "anyhow", + "bytes", + "cookie", + "dirs 6.0.0", + "dunce", + "embed_plist", + "getrandom 0.3.4", + "glob", + "gtk", + "heck 0.5.0", + "http", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "percent-encoding", + "plist", + "raw-window-handle", + "reqwest", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.17", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17fcb8819fd16463512a12f531d44826ce566f486d7ccd211c9c8cebdaec4e08" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs 6.0.0", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "toml 0.9.10+spec-1.1.0", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa9844cefcf99554a16e0a278156ae73b0d8680bbc0e2ad1e4287aadd8489cf" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.114", + "tauri-utils", + "thiserror 2.0.17", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3764a12f886d8245e66b7ee9b43ccc47883399be2019a61d80cf0f4117446fde" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.114", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-plugin" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e1d0a4860b7ff570c891e1d2a586bf1ede205ff858fbc305e0b5ae5d14c1377" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri-utils", + "toml 0.9.10+spec-1.1.0", + "walkdir", +] + +[[package]] +name = "tauri-plugin-dialog" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9204b425d9be8d12aa60c2a83a289cf7d1caae40f57f336ed1155b3a5c0e359b" +dependencies = [ + "log", + "raw-window-handle", + "rfd", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "tauri-plugin-fs", + "thiserror 2.0.17", + "url", +] + +[[package]] +name = "tauri-plugin-fs" +version = "2.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed390cc669f937afeb8b28032ce837bac8ea023d975a2e207375ec05afaf1804" +dependencies = [ + "anyhow", + "dunce", + "glob", + "percent-encoding", + "schemars 0.8.22", + "serde", + "serde_json", + "serde_repr", + "tauri", + "tauri-plugin", + "tauri-utils", + "thiserror 2.0.17", + "toml 0.9.10+spec-1.1.0", + "url", +] + +[[package]] +name = "tauri-plugin-opener" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c26b72571d25dee25667940027114e60f569fc3974f8cefbe50c2cbc5fd65e3b" +dependencies = [ + "dunce", + "glob", + "objc2-app-kit", + "objc2-foundation", + "open", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.17", + "url", + "windows", + "zbus", +] + +[[package]] +name = "tauri-runtime" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f766fe9f3d1efc4b59b17e7a891ad5ed195fa8d23582abb02e6c9a01137892" +dependencies = [ + "cookie", + "dpi", + "gtk", + "http", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.17", + "url", + "webkit2gtk", + "webview2-com", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "187a3f26f681bdf028f796ccf57cf478c1ee422c50128e5a0a6ebeb3f5910065" +dependencies = [ + "gtk", + "http", + "jni", + "log", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "once_cell", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a423c51176eb3616ee9b516a9fa67fed5f0e78baaba680e44eb5dd2cc37490" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dunce", + "glob", + "html5ever", + "http", + "infer", + "json-patch", + "kuchikiki", + "log", + "memchr", + "phf 0.11.3", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.17", + "toml 0.9.10+spec-1.1.0", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1087b111fe2b005e42dbdc1990fc18593234238d47453b0c99b7de1c9ab2c1e0" +dependencies = [ + "dunce", + "embed-resource", + "toml 0.9.10+spec-1.1.0", +] + +[[package]] +name = "tempfile" +version = "3.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c" +dependencies = [ + "fastrand", + "getrandom 0.3.4", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl 2.0.17", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "time" +version = "0.3.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" + +[[package]] +name = "time-macros" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.49.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "toml" +version = "0.9.10+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0825052159284a1a8b4d6c0c86cbc801f2da5afd2b225fa548c72f2e74002f48" +dependencies = [ + "indexmap 2.12.1", + "serde_core", + "serde_spanned 1.0.4", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.14", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.12.1", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.12.1", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.23.10+spec-1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +dependencies = [ + "indexmap 2.12.1", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "winnow 0.7.14", +] + +[[package]] +name = "toml_parser" +version = "1.0.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" +dependencies = [ + "winnow 0.7.14", +] + +[[package]] +name = "toml_writer" +version = "1.0.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags 2.10.0", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tray-icon" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e85aa143ceb072062fc4d6356c1b520a51d636e7bc8e77ec94be3608e5e80c" +dependencies = [ + "crossbeam-channel", + "dirs 6.0.0", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror 2.0.17", + "windows-sys 0.60.2", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset", + "tempfile", + "winapi", +] + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +dependencies = [ + "getrandom 0.3.4", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.114", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76b1bc1e54c581da1e9f179d0b38512ba358fb1af2d634a1affe42e37172361a" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62daa38afc514d1f8f12b8693d30d5993ff77ced33ce30cd04deebc267a6d57c" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[package]] +name = "webview2-com" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4ba622a989277ef3886dd5afb3e280e3dd6d974b766118950a08f8f678ad6a4" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows", + "windows-core 0.61.2", + "windows-implement", + "windows-interface", +] + +[[package]] +name = "webview2-com-macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "webview2-com-sys" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" +dependencies = [ + "thiserror 2.0.17", + "windows", + "windows-core 0.61.2", +] + +[[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.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[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 = "window-vibrancy" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.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.2", +] + +[[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.5", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" +dependencies = [ + "cfg-if", + "windows-sys 0.59.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "wry" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2" +dependencies = [ + "base64 0.22.1", + "block2", + "cookie", + "crossbeam-channel", + "dirs 6.0.0", + "dpi", + "dunce", + "gdkx11", + "gtk", + "html5ever", + "http", + "javascriptcore-rs", + "jni", + "kuchikiki", + "libc", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2", + "soup3", + "tao-macros", + "thiserror 2.0.17", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", + "synstructure", +] + +[[package]] +name = "zbus" +version = "5.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b622b18155f7a93d1cd2dc8c01d2d6a44e08fb9ebb7b3f9e6ed101488bad6c91" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "nix", + "ordered-stream", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 0.7.14", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cdb94821ca8a87ca9c298b5d1cbd80e2a8b67115d99f6e4551ac49e42b6a314" +dependencies = [ + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.114", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" +dependencies = [ + "serde", + "static_assertions", + "winnow 0.7.14", + "zvariant", +] + +[[package]] +name = "zerocopy" +version = "0.8.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fabae64378cb18147bb18bca364e63bdbe72a0ffe4adf0addfec8aa166b2c56" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9c2d862265a8bb4471d87e033e730f536e2a285cc7cb05dbce09a2a97075f90" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.114", +] + +[[package]] +name = "zmij" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fc5a66a20078bf1251bde995aa2fdcc4b800c70b5d92dd2c62abc5c60f679f8" + +[[package]] +name = "zvariant" +version = "5.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2be61892e4f2b1772727be11630a62664a1826b62efa43a6fe7449521cb8744c" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow 0.7.14", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da58575a1b2b20766513b1ec59d8e2e68db2745379f961f86650655e862d2006" +dependencies = [ + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.114", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6949d142f89f6916deca2232cf26a8afacf2b9fdc35ce766105e104478be599" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 2.0.114", + "winnow 0.7.14", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..91e408b --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,3 @@ +[workspace] +resolver = "2" +members = ["apps/desktop/src-tauri", "crates/*"] diff --git a/LICENSE b/LICENSE deleted file mode 100644 index f288702..0000000 --- a/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/README.md b/README.md index 6254215..a1d3902 100644 --- a/README.md +++ b/README.md @@ -1,96 +1,40 @@ -# splot - Visualizador e Analisador de Controle Térmico +# Senamby -O **splot** é uma ferramenta para visualizar e analisar o comportamento de um sistema de controle térmico. Ele permite **selecionar controladores ativos**, ajustar suas configurações em tempo real e visualizar a resposta do sistema. Além disso, é possível alternar para a aba **Analyzer** e **analisar logs de execuções anteriores**. +[![English](https://img.shields.io/badge/Language-English-2563eb?style=for-the-badge)](docs/en/index.md) +[![Português](https://img.shields.io/badge/Idioma-Portugu%C3%AAs-16a34a?style=for-the-badge)](docs/pt-BR/index.md) -### Instalação +Senamby is a desktop workspace for creating, running, and analyzing plants driven by reusable drivers and controllers. It combines a Svelte/Tauri desktop UI, a Rust backend, and a Python runtime for plant plugins. -Garanta que você tem Python 3.7 ou mais recente instalado: +## What You Can Do -```shell -python --version -``` +- Create plants with sensors and actuators +- Register reusable driver and controller plugins +- Connect a plant to a live runtime +- Plot sensor and actuator behavior in real time +- Import plants from JSON files and preview them before loading +- Configure controllers, bindings, and setpoints from the UI -> [!NOTE] -> [Opcional] Crie um ambiente virtual e o ative para instalação do script. +## Documentation -Para instalar o plotter: +- English: [docs/en/index.md](docs/en/index.md) +- Português (Brasil): [docs/pt-BR/index.md](docs/pt-BR/index.md) -```shell -cd serial-plotter -pip install -e . -``` +## Quick Start -## Como usar +If you are running the app from source: -Para executar o `splot`, utilize o seguinte comando: +1. Install the frontend dependencies inside `apps/desktop` +2. Start the desktop app with Tauri +3. Create or import plugins +4. Create or import a plant +5. Connect the plant and monitor the charts -```sh -cd examples -python main.py -``` +The current frontend scripts live in `apps/desktop/package.json`, including `pnpm --dir apps/desktop tauri dev`. -## Modos +## Documentation Guide -### Plotter (Execução em tempo real) - -- Exibe os dados do controlador e da planta em tempo real. -- Permite selecionar e configurar diferentes controladores. -- Mostra a resposta da planta ao longo do tempo. - -### Analyzer (Análise de logs) - -- Permite carregar **logs de execuções anteriores**. -- Plota **temperatura e derivada dT/dt** em gráficos interativos. -- Indica **pontos críticos** (ex.: ponto de maior derivada). -- Possibilita comparar diferentes execuções. - -## Funcionalidades do Plotter - -- Selecionar o controlador ativo e editá-lo em tempo real. -- Ajustar parâmetros do controlador, como **Setpoint, Kp, Ki, Kd**. -- Visualizar a resposta da planta em gráficos interativos. -- Alternar entre os modos de exibição para melhor visualização. - -## Funcionalidades do Analyzer -- Carregar e analisar logs de execuções anteriores. -- Fazer analise em malha aberta para calcular parâmetros de sintonia -- Fazer analise em malha fechada par analisar a resposta do sistema - -## Navegação - -- Space → Alterna entre as visões (`Plotter` e `Analyzer`). -- Escape → Finaliza o programa. -- **Campo de entrada** → Define a temperatura desejada (`Setpoint`) e a envia ao controlador. - -## Estrutura do Projeto - -```sh -serial-plotter/ -├── controller_framework/ -│ ├── core/ # Lógica principal do framework -│ ├── gui/ # Interface gráfica (Plotter e Analyzer) -│ ├── __init__.py -│ └── ... -├── examples/ -│ ├── main.py # Arquivo principal para rodar o splot -│ ├── temp_logs/ # Pasta com logs de execuções anteriores -├── pyproject.toml # Configuração do pacote -``` - -## Exemplo de Uso - -1. **Executar o `splot`** - ```sh - cd examples - python main.py - ``` -2. **Selecionar o controlador ativo** no menu lateral. -3. **Editar os parâmetros** (Setpoint, Kp, Ki, Kd). -4. **Visualizar a resposta da planta** no gráfico. -5. **Alternar para `Analyzer`** para carregar logs anteriores. - -## Planta utilizada -![Planta](https://raw.githubusercontent.com/limahigor/serial-plotter/c5f47e3c2436e8b601071a4ce413bb77daab515d/controller_framework/examples/thermal_plant.png) - - -[Link para o modelo 3D](https://cad.onshape.com/documents/2719c8d20779534c7559f55d/w/e520d6a9af3b32d2f18ef8f3/e/bb6b8d18dfe883fe6632567b). +- Start with [Getting Started](docs/en/getting-started.md) +- Learn the vocabulary in [Core Concepts](docs/en/core-concepts.md) +- Use [Plants](docs/en/plants.md) for plant lifecycle and runtime actions +- Use [Drivers and Controllers](docs/en/drivers-and-controllers.md) to understand plugins and live control +- Use [Plugin File Format](docs/en/plugin-file-format.md) for JSON and Python basics diff --git a/apps/desktop/example_data.csv b/apps/desktop/example_data.csv new file mode 100644 index 0000000..138ff1d --- /dev/null +++ b/apps/desktop/example_data.csv @@ -0,0 +1,52 @@ +seconds,sensor_0,actuator_0,target_0,sensor_1,actuator_1,target_1 +0.0,20.1,45.2,20.0,30.5,55.1,30.0 +0.1,20.3,46.8,20.0,30.8,56.3,30.0 +0.2,20.5,48.1,20.0,31.2,57.8,30.0 +0.3,20.8,49.5,20.0,31.5,59.2,30.0 +0.4,21.1,50.8,20.0,31.9,60.5,30.0 +0.5,21.4,52.0,20.0,32.2,61.7,30.0 +0.6,21.7,53.1,20.0,32.6,62.9,30.0 +0.7,22.0,54.1,20.0,32.9,63.9,30.0 +0.8,22.2,54.9,20.0,33.2,64.8,30.0 +0.9,22.5,55.6,20.0,33.5,65.6,30.0 +1.0,22.7,56.2,20.0,33.7,66.2,30.0 +1.1,22.9,56.6,20.0,33.9,66.7,30.0 +1.2,23.1,56.9,20.0,34.1,67.1,30.0 +1.3,23.2,57.1,20.0,34.2,67.3,30.0 +1.4,23.3,57.2,20.0,34.3,67.4,30.0 +1.5,23.4,57.2,20.0,34.4,67.4,30.0 +1.6,23.5,57.1,20.0,34.4,67.3,30.0 +1.7,23.5,56.9,20.0,34.4,67.0,30.0 +1.8,23.5,56.6,20.0,34.4,66.7,30.0 +1.9,23.5,56.2,20.0,34.3,66.2,30.0 +2.0,23.4,55.8,20.0,34.2,65.7,30.0 +2.1,23.3,55.2,20.0,34.1,65.1,30.0 +2.2,23.2,54.6,20.0,33.9,64.4,30.0 +2.3,23.1,53.9,20.0,33.7,63.6,30.0 +2.4,22.9,53.2,20.0,33.5,62.8,30.0 +2.5,22.7,52.4,20.0,33.2,61.9,30.0 +2.6,22.5,51.6,20.0,32.9,60.9,30.0 +2.7,22.3,50.7,20.0,32.6,59.9,30.0 +2.8,22.0,49.8,20.0,32.3,58.9,30.0 +2.9,21.8,48.9,20.0,31.9,57.8,30.0 +3.0,21.5,47.9,20.0,31.6,56.7,30.0 +3.1,21.2,46.9,20.0,31.2,55.6,30.0 +3.2,20.9,45.9,20.0,30.8,54.5,30.0 +3.3,20.6,44.9,20.0,30.4,53.4,30.0 +3.4,20.3,43.9,20.0,30.0,52.3,30.0 +3.5,20.0,42.9,20.0,29.6,51.2,30.0 +3.6,19.7,41.9,20.0,29.2,50.1,30.0 +3.7,19.4,40.9,20.0,28.8,49.1,30.0 +3.8,19.1,40.0,20.0,28.4,48.1,30.0 +3.9,18.8,39.1,20.0,28.0,47.1,30.0 +4.0,18.6,38.3,20.0,27.6,46.2,30.0 +4.1,18.3,37.5,20.0,27.2,45.3,30.0 +4.2,18.1,36.8,20.0,26.8,44.5,30.0 +4.3,17.9,36.1,20.0,26.5,43.7,30.0 +4.4,17.7,35.5,20.0,26.1,43.0,30.0 +4.5,17.5,34.9,20.0,25.8,42.3,30.0 +4.6,17.3,34.4,20.0,25.5,41.7,30.0 +4.7,17.2,34.0,20.0,25.2,41.2,30.0 +4.8,17.1,33.6,20.0,24.9,40.7,30.0 +4.9,17.0,33.3,20.0,24.7,40.3,30.0 +5.0,16.9,33.0,20.0,24.5,40.0,30.0 diff --git a/apps/desktop/package.json b/apps/desktop/package.json new file mode 100644 index 0000000..4105b28 --- /dev/null +++ b/apps/desktop/package.json @@ -0,0 +1,37 @@ +{ + "name": "senamby", + "version": "0.1.0", + "description": "Senamby desktop plotter workspace", + "type": "module", + "packageManager": "pnpm@10.27.0", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "tauri": "tauri" + }, + "license": "MIT", + "dependencies": { + "@tauri-apps/api": "^2", + "@tauri-apps/plugin-dialog": "^2.6.0", + "@tauri-apps/plugin-opener": "^2", + "highlight.js": "^11.11.1", + "lucide-svelte": "^0.562.0", + "uplot": "^1.6.32" + }, + "devDependencies": { + "@sveltejs/adapter-static": "^3.0.6", + "@sveltejs/kit": "^2.9.0", + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "@tailwindcss/forms": "^0.5.10", + "@tailwindcss/vite": "^4.1.17", + "@tauri-apps/cli": "^2", + "svelte": "^5.0.0", + "svelte-check": "^4.0.0", + "tailwindcss": "^4.1.17", + "typescript": "^5", + "vite": "^6.0.3" + } +} diff --git a/apps/desktop/pnpm-lock.yaml b/apps/desktop/pnpm-lock.yaml new file mode 100644 index 0000000..cbcf14c --- /dev/null +++ b/apps/desktop/pnpm-lock.yaml @@ -0,0 +1,1539 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@tauri-apps/api': + specifier: ^2 + version: 2.9.1 + '@tauri-apps/plugin-dialog': + specifier: ^2.6.0 + version: 2.6.0 + '@tauri-apps/plugin-opener': + specifier: ^2 + version: 2.5.2 + highlight.js: + specifier: ^11.11.1 + version: 11.11.1 + lucide-svelte: + specifier: ^0.562.0 + version: 0.562.0(svelte@5.46.1) + uplot: + specifier: ^1.6.32 + version: 1.6.32 + devDependencies: + '@sveltejs/adapter-static': + specifier: ^3.0.6 + version: 3.0.10(@sveltejs/kit@2.49.3(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.1)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.46.1)(typescript@5.6.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2))) + '@sveltejs/kit': + specifier: ^2.9.0 + version: 2.49.3(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.1)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.46.1)(typescript@5.6.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)) + '@sveltejs/vite-plugin-svelte': + specifier: ^5.0.0 + version: 5.1.1(svelte@5.46.1)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)) + '@tailwindcss/forms': + specifier: ^0.5.10 + version: 0.5.11(tailwindcss@4.1.18) + '@tailwindcss/vite': + specifier: ^4.1.17 + version: 4.1.18(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)) + '@tauri-apps/cli': + specifier: ^2 + version: 2.9.6 + svelte: + specifier: ^5.0.0 + version: 5.46.1 + svelte-check: + specifier: ^4.0.0 + version: 4.3.5(picomatch@4.0.3)(svelte@5.46.1)(typescript@5.6.3) + tailwindcss: + specifier: ^4.1.17 + version: 4.1.18 + typescript: + specifier: ^5 + version: 5.6.3 + vite: + specifier: ^6.0.3 + version: 6.4.1(jiti@2.6.1)(lightningcss@1.30.2) + +packages: + + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + + '@rollup/rollup-android-arm-eabi@4.55.1': + resolution: {integrity: sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.55.1': + resolution: {integrity: sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.55.1': + resolution: {integrity: sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.55.1': + resolution: {integrity: sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.55.1': + resolution: {integrity: sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.55.1': + resolution: {integrity: sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.55.1': + resolution: {integrity: sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.55.1': + resolution: {integrity: sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.55.1': + resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.55.1': + resolution: {integrity: sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.55.1': + resolution: {integrity: sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.55.1': + resolution: {integrity: sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.55.1': + resolution: {integrity: sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.55.1': + resolution: {integrity: sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.55.1': + resolution: {integrity: sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.55.1': + resolution: {integrity: sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.55.1': + resolution: {integrity: sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.55.1': + resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.55.1': + resolution: {integrity: sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.55.1': + resolution: {integrity: sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.55.1': + resolution: {integrity: sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.55.1': + resolution: {integrity: sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.55.1': + resolution: {integrity: sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.55.1': + resolution: {integrity: sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.55.1': + resolution: {integrity: sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==} + cpu: [x64] + os: [win32] + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@sveltejs/acorn-typescript@1.0.8': + resolution: {integrity: sha512-esgN+54+q0NjB0Y/4BomT9samII7jGwNy/2a3wNZbT2A2RpmXsXwUt24LvLhx6jUq2gVk4cWEvcRO6MFQbOfNA==} + peerDependencies: + acorn: ^8.9.0 + + '@sveltejs/adapter-static@3.0.10': + resolution: {integrity: sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew==} + peerDependencies: + '@sveltejs/kit': ^2.0.0 + + '@sveltejs/kit@2.49.3': + resolution: {integrity: sha512-luTmE2Isk9GRJnitqanLoByKBiyLdfLpV2qV9a25JMxjbQt919TVqG8pibJDkxTvX9+w2k/9IL7o+/RtG++3QA==} + engines: {node: '>=18.13'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.0.0 + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: ^5.3.3 + vite: ^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + typescript: + optional: true + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1': + resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^5.0.0 + svelte: ^5.0.0 + vite: ^6.0.0 + + '@sveltejs/vite-plugin-svelte@5.1.1': + resolution: {integrity: sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + svelte: ^5.0.0 + vite: ^6.0.0 + + '@tailwindcss/forms@0.5.11': + resolution: {integrity: sha512-h9wegbZDPurxG22xZSoWtdzc41/OlNEUQERNqI/0fOwa2aVlWGu7C35E/x6LDyD3lgtztFSSjKZyuVM0hxhbgA==} + peerDependencies: + tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1' + + '@tailwindcss/node@4.1.18': + resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} + + '@tailwindcss/oxide-android-arm64@4.1.18': + resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.18': + resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.18': + resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.18': + resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': + resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': + resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.18': + resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.18': + resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.18': + resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.18': + resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': + resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.18': + resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.18': + resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==} + engines: {node: '>= 10'} + + '@tailwindcss/vite@4.1.18': + resolution: {integrity: sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 + + '@tauri-apps/api@2.9.1': + resolution: {integrity: sha512-IGlhP6EivjXHepbBic618GOmiWe4URJiIeZFlB7x3czM0yDHHYviH1Xvoiv4FefdkQtn6v7TuwWCRfOGdnVUGw==} + + '@tauri-apps/cli-darwin-arm64@2.9.6': + resolution: {integrity: sha512-gf5no6N9FCk1qMrti4lfwP77JHP5haASZgVbBgpZG7BUepB3fhiLCXGUK8LvuOjP36HivXewjg72LTnPDScnQQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tauri-apps/cli-darwin-x64@2.9.6': + resolution: {integrity: sha512-oWh74WmqbERwwrwcueJyY6HYhgCksUc6NT7WKeXyrlY/FPmNgdyQAgcLuTSkhRFuQ6zh4Np1HZpOqCTpeZBDcw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tauri-apps/cli-linux-arm-gnueabihf@2.9.6': + resolution: {integrity: sha512-/zde3bFroFsNXOHN204DC2qUxAcAanUjVXXSdEGmhwMUZeAQalNj5cz2Qli2elsRjKN/hVbZOJj0gQ5zaYUjSg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tauri-apps/cli-linux-arm64-gnu@2.9.6': + resolution: {integrity: sha512-pvbljdhp9VOo4RnID5ywSxgBs7qiylTPlK56cTk7InR3kYSTJKYMqv/4Q/4rGo/mG8cVppesKIeBMH42fw6wjg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tauri-apps/cli-linux-arm64-musl@2.9.6': + resolution: {integrity: sha512-02TKUndpodXBCR0oP//6dZWGYcc22Upf2eP27NvC6z0DIqvkBBFziQUcvi2n6SrwTRL0yGgQjkm9K5NIn8s6jw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tauri-apps/cli-linux-riscv64-gnu@2.9.6': + resolution: {integrity: sha512-fmp1hnulbqzl1GkXl4aTX9fV+ubHw2LqlLH1PE3BxZ11EQk+l/TmiEongjnxF0ie4kV8DQfDNJ1KGiIdWe1GvQ==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + + '@tauri-apps/cli-linux-x64-gnu@2.9.6': + resolution: {integrity: sha512-vY0le8ad2KaV1PJr+jCd8fUF9VOjwwQP/uBuTJvhvKTloEwxYA/kAjKK9OpIslGA9m/zcnSo74czI6bBrm2sYA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tauri-apps/cli-linux-x64-musl@2.9.6': + resolution: {integrity: sha512-TOEuB8YCFZTWVDzsO2yW0+zGcoMiPPwcUgdnW1ODnmgfwccpnihDRoks+ABT1e3fHb1ol8QQWsHSCovb3o2ENQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tauri-apps/cli-win32-arm64-msvc@2.9.6': + resolution: {integrity: sha512-ujmDGMRc4qRLAnj8nNG26Rlz9klJ0I0jmZs2BPpmNNf0gM/rcVHhqbEkAaHPTBVIrtUdf7bGvQAD2pyIiUrBHQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tauri-apps/cli-win32-ia32-msvc@2.9.6': + resolution: {integrity: sha512-S4pT0yAJgFX8QRCyKA1iKjZ9Q/oPjCZf66A/VlG5Yw54Nnr88J1uBpmenINbXxzyhduWrIXBaUbEY1K80ZbpMg==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@tauri-apps/cli-win32-x64-msvc@2.9.6': + resolution: {integrity: sha512-ldWuWSSkWbKOPjQMJoYVj9wLHcOniv7diyI5UAJ4XsBdtaFB0pKHQsqw/ItUma0VXGC7vB4E9fZjivmxur60aw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tauri-apps/cli@2.9.6': + resolution: {integrity: sha512-3xDdXL5omQ3sPfBfdC8fCtDKcnyV7OqyzQgfyT5P3+zY6lcPqIYKQBvUasNvppi21RSdfhy44ttvJmftb0PCDw==} + engines: {node: '>= 10'} + hasBin: true + + '@tauri-apps/plugin-dialog@2.6.0': + resolution: {integrity: sha512-q4Uq3eY87TdcYzXACiYSPhmpBA76shgmQswGkSVio4C82Sz2W4iehe9TnKYwbq7weHiL88Yw19XZm7v28+Micg==} + + '@tauri-apps/plugin-opener@2.5.2': + resolution: {integrity: sha512-ei/yRRoCklWHImwpCcDK3VhNXx+QXM9793aQ64YxpqVF0BDuuIlXhZgiAkc15wnPVav+IbkYhmDJIv5R326Mew==} + + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + devalue@5.6.1: + resolution: {integrity: sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A==} + + enhanced-resolve@5.18.4: + resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} + engines: {node: '>=10.13.0'} + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + + esrap@2.2.1: + resolution: {integrity: sha512-GiYWG34AN/4CUyaWAgunGt0Rxvr1PTMlGC0vvEov/uOQYWne2bpN03Um+k8jT+q3op33mKouP2zeJ6OlM+qeUg==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + lightningcss-android-arm64@1.30.2: + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.30.2: + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.2: + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.2: + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.2: + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.2: + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.2: + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.2: + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.2: + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.2: + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.2: + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.2: + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + engines: {node: '>= 12.0.0'} + + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + + lucide-svelte@0.562.0: + resolution: {integrity: sha512-kSJDH/55lf0mun/o4nqWBXOcq0fWYzPeIjbTD97ywoeumAB9kWxtM06gC7oynqjtK3XhAljWSz5RafIzPEYIQA==} + peerDependencies: + svelte: ^3 || ^4 || ^5.0.0-next.42 + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + mini-svg-data-uri@1.4.4: + resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} + hasBin: true + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + rollup@4.55.1: + resolution: {integrity: sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + svelte-check@4.3.5: + resolution: {integrity: sha512-e4VWZETyXaKGhpkxOXP+B/d0Fp/zKViZoJmneZWe/05Y2aqSKj3YN2nLfYPJBQ87WEiY4BQCQ9hWGu9mPT1a1Q==} + engines: {node: '>= 18.0.0'} + hasBin: true + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: '>=5.0.0' + + svelte@5.46.1: + resolution: {integrity: sha512-ynjfCHD3nP2el70kN5Pmg37sSi0EjOm9FgHYQdC4giWG/hzO3AatzXXJJgP305uIhGQxSufJLuYWtkY8uK/8RA==} + engines: {node: '>=18'} + + tailwindcss@4.1.18: + resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + + uplot@1.6.32: + resolution: {integrity: sha512-KIMVnG68zvu5XXUbC4LQEPnhwOxBuLyW1AHtpm6IKTXImkbLgkMy+jabjLgSLMasNuGGzQm/ep3tOkyTxpiQIw==} + + vite@6.4.1: + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.1.1: + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + vite: + optional: true + + zimmerframe@1.1.4: + resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} + +snapshots: + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@polka/url@1.0.0-next.29': {} + + '@rollup/rollup-android-arm-eabi@4.55.1': + optional: true + + '@rollup/rollup-android-arm64@4.55.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.55.1': + optional: true + + '@rollup/rollup-darwin-x64@4.55.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.55.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.55.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.55.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.55.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.55.1': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.55.1': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.55.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.55.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.55.1': + optional: true + + '@rollup/rollup-openbsd-x64@4.55.1': + optional: true + + '@rollup/rollup-openharmony-arm64@4.55.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.55.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.55.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.55.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.55.1': + optional: true + + '@standard-schema/spec@1.1.0': {} + + '@sveltejs/acorn-typescript@1.0.8(acorn@8.15.0)': + dependencies: + acorn: 8.15.0 + + '@sveltejs/adapter-static@3.0.10(@sveltejs/kit@2.49.3(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.1)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.46.1)(typescript@5.6.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)))': + dependencies: + '@sveltejs/kit': 2.49.3(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.1)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.46.1)(typescript@5.6.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)) + + '@sveltejs/kit@2.49.3(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.1)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.46.1)(typescript@5.6.3)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2))': + dependencies: + '@standard-schema/spec': 1.1.0 + '@sveltejs/acorn-typescript': 1.0.8(acorn@8.15.0) + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.46.1)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)) + '@types/cookie': 0.6.0 + acorn: 8.15.0 + cookie: 0.6.0 + devalue: 5.6.1 + esm-env: 1.2.2 + kleur: 4.1.5 + magic-string: 0.30.21 + mrmime: 2.0.1 + sade: 1.8.1 + set-cookie-parser: 2.7.2 + sirv: 3.0.2 + svelte: 5.46.1 + vite: 6.4.1(jiti@2.6.1)(lightningcss@1.30.2) + optionalDependencies: + typescript: 5.6.3 + + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.1)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.46.1)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2))': + dependencies: + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.46.1)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)) + debug: 4.4.3 + svelte: 5.46.1 + vite: 6.4.1(jiti@2.6.1)(lightningcss@1.30.2) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.1)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.46.1)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.46.1)(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)) + debug: 4.4.3 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.21 + svelte: 5.46.1 + vite: 6.4.1(jiti@2.6.1)(lightningcss@1.30.2) + vitefu: 1.1.1(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)) + transitivePeerDependencies: + - supports-color + + '@tailwindcss/forms@0.5.11(tailwindcss@4.1.18)': + dependencies: + mini-svg-data-uri: 1.4.4 + tailwindcss: 4.1.18 + + '@tailwindcss/node@4.1.18': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.4 + jiti: 2.6.1 + lightningcss: 1.30.2 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.1.18 + + '@tailwindcss/oxide-android-arm64@4.1.18': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.18': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.18': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.18': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.18': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.18': + optional: true + + '@tailwindcss/oxide@4.1.18': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.18 + '@tailwindcss/oxide-darwin-arm64': 4.1.18 + '@tailwindcss/oxide-darwin-x64': 4.1.18 + '@tailwindcss/oxide-freebsd-x64': 4.1.18 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.18 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.18 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.18 + '@tailwindcss/oxide-linux-x64-musl': 4.1.18 + '@tailwindcss/oxide-wasm32-wasi': 4.1.18 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 + + '@tailwindcss/vite@4.1.18(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2))': + dependencies: + '@tailwindcss/node': 4.1.18 + '@tailwindcss/oxide': 4.1.18 + tailwindcss: 4.1.18 + vite: 6.4.1(jiti@2.6.1)(lightningcss@1.30.2) + + '@tauri-apps/api@2.9.1': {} + + '@tauri-apps/cli-darwin-arm64@2.9.6': + optional: true + + '@tauri-apps/cli-darwin-x64@2.9.6': + optional: true + + '@tauri-apps/cli-linux-arm-gnueabihf@2.9.6': + optional: true + + '@tauri-apps/cli-linux-arm64-gnu@2.9.6': + optional: true + + '@tauri-apps/cli-linux-arm64-musl@2.9.6': + optional: true + + '@tauri-apps/cli-linux-riscv64-gnu@2.9.6': + optional: true + + '@tauri-apps/cli-linux-x64-gnu@2.9.6': + optional: true + + '@tauri-apps/cli-linux-x64-musl@2.9.6': + optional: true + + '@tauri-apps/cli-win32-arm64-msvc@2.9.6': + optional: true + + '@tauri-apps/cli-win32-ia32-msvc@2.9.6': + optional: true + + '@tauri-apps/cli-win32-x64-msvc@2.9.6': + optional: true + + '@tauri-apps/cli@2.9.6': + optionalDependencies: + '@tauri-apps/cli-darwin-arm64': 2.9.6 + '@tauri-apps/cli-darwin-x64': 2.9.6 + '@tauri-apps/cli-linux-arm-gnueabihf': 2.9.6 + '@tauri-apps/cli-linux-arm64-gnu': 2.9.6 + '@tauri-apps/cli-linux-arm64-musl': 2.9.6 + '@tauri-apps/cli-linux-riscv64-gnu': 2.9.6 + '@tauri-apps/cli-linux-x64-gnu': 2.9.6 + '@tauri-apps/cli-linux-x64-musl': 2.9.6 + '@tauri-apps/cli-win32-arm64-msvc': 2.9.6 + '@tauri-apps/cli-win32-ia32-msvc': 2.9.6 + '@tauri-apps/cli-win32-x64-msvc': 2.9.6 + + '@tauri-apps/plugin-dialog@2.6.0': + dependencies: + '@tauri-apps/api': 2.9.1 + + '@tauri-apps/plugin-opener@2.5.2': + dependencies: + '@tauri-apps/api': 2.9.1 + + '@types/cookie@0.6.0': {} + + '@types/estree@1.0.8': {} + + acorn@8.15.0: {} + + aria-query@5.3.2: {} + + axobject-query@4.1.0: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + clsx@2.1.1: {} + + cookie@0.6.0: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deepmerge@4.3.1: {} + + detect-libc@2.1.2: {} + + devalue@5.6.1: {} + + enhanced-resolve@5.18.4: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + esm-env@1.2.2: {} + + esrap@2.2.1: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fsevents@2.3.3: + optional: true + + graceful-fs@4.2.11: {} + + highlight.js@11.11.1: {} + + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + jiti@2.6.1: {} + + kleur@4.1.5: {} + + lightningcss-android-arm64@1.30.2: + optional: true + + lightningcss-darwin-arm64@1.30.2: + optional: true + + lightningcss-darwin-x64@1.30.2: + optional: true + + lightningcss-freebsd-x64@1.30.2: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.2: + optional: true + + lightningcss-linux-arm64-gnu@1.30.2: + optional: true + + lightningcss-linux-arm64-musl@1.30.2: + optional: true + + lightningcss-linux-x64-gnu@1.30.2: + optional: true + + lightningcss-linux-x64-musl@1.30.2: + optional: true + + lightningcss-win32-arm64-msvc@1.30.2: + optional: true + + lightningcss-win32-x64-msvc@1.30.2: + optional: true + + lightningcss@1.30.2: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.30.2 + lightningcss-darwin-arm64: 1.30.2 + lightningcss-darwin-x64: 1.30.2 + lightningcss-freebsd-x64: 1.30.2 + lightningcss-linux-arm-gnueabihf: 1.30.2 + lightningcss-linux-arm64-gnu: 1.30.2 + lightningcss-linux-arm64-musl: 1.30.2 + lightningcss-linux-x64-gnu: 1.30.2 + lightningcss-linux-x64-musl: 1.30.2 + lightningcss-win32-arm64-msvc: 1.30.2 + lightningcss-win32-x64-msvc: 1.30.2 + + locate-character@3.0.0: {} + + lucide-svelte@0.562.0(svelte@5.46.1): + dependencies: + svelte: 5.46.1 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + mini-svg-data-uri@1.4.4: {} + + mri@1.2.0: {} + + mrmime@2.0.1: {} + + ms@2.1.3: {} + + nanoid@3.3.11: {} + + picocolors@1.1.1: {} + + picomatch@4.0.3: {} + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + readdirp@4.1.2: {} + + rollup@4.55.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.55.1 + '@rollup/rollup-android-arm64': 4.55.1 + '@rollup/rollup-darwin-arm64': 4.55.1 + '@rollup/rollup-darwin-x64': 4.55.1 + '@rollup/rollup-freebsd-arm64': 4.55.1 + '@rollup/rollup-freebsd-x64': 4.55.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.55.1 + '@rollup/rollup-linux-arm-musleabihf': 4.55.1 + '@rollup/rollup-linux-arm64-gnu': 4.55.1 + '@rollup/rollup-linux-arm64-musl': 4.55.1 + '@rollup/rollup-linux-loong64-gnu': 4.55.1 + '@rollup/rollup-linux-loong64-musl': 4.55.1 + '@rollup/rollup-linux-ppc64-gnu': 4.55.1 + '@rollup/rollup-linux-ppc64-musl': 4.55.1 + '@rollup/rollup-linux-riscv64-gnu': 4.55.1 + '@rollup/rollup-linux-riscv64-musl': 4.55.1 + '@rollup/rollup-linux-s390x-gnu': 4.55.1 + '@rollup/rollup-linux-x64-gnu': 4.55.1 + '@rollup/rollup-linux-x64-musl': 4.55.1 + '@rollup/rollup-openbsd-x64': 4.55.1 + '@rollup/rollup-openharmony-arm64': 4.55.1 + '@rollup/rollup-win32-arm64-msvc': 4.55.1 + '@rollup/rollup-win32-ia32-msvc': 4.55.1 + '@rollup/rollup-win32-x64-gnu': 4.55.1 + '@rollup/rollup-win32-x64-msvc': 4.55.1 + fsevents: 2.3.3 + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + set-cookie-parser@2.7.2: {} + + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + + source-map-js@1.2.1: {} + + svelte-check@4.3.5(picomatch@4.0.3)(svelte@5.46.1)(typescript@5.6.3): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + chokidar: 4.0.3 + fdir: 6.5.0(picomatch@4.0.3) + picocolors: 1.1.1 + sade: 1.8.1 + svelte: 5.46.1 + typescript: 5.6.3 + transitivePeerDependencies: + - picomatch + + svelte@5.46.1: + dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.5.5 + '@sveltejs/acorn-typescript': 1.0.8(acorn@8.15.0) + '@types/estree': 1.0.8 + acorn: 8.15.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + clsx: 2.1.1 + devalue: 5.6.1 + esm-env: 1.2.2 + esrap: 2.2.1 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.21 + zimmerframe: 1.1.4 + + tailwindcss@4.1.18: {} + + tapable@2.3.0: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + totalist@3.0.1: {} + + typescript@5.6.3: {} + + uplot@1.6.32: {} + + vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2): + dependencies: + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.55.1 + tinyglobby: 0.2.15 + optionalDependencies: + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.30.2 + + vitefu@1.1.1(vite@6.4.1(jiti@2.6.1)(lightningcss@1.30.2)): + optionalDependencies: + vite: 6.4.1(jiti@2.6.1)(lightningcss@1.30.2) + + zimmerframe@1.1.4: {} diff --git a/apps/desktop/pnpm-workspace.yaml b/apps/desktop/pnpm-workspace.yaml new file mode 100644 index 0000000..044a857 --- /dev/null +++ b/apps/desktop/pnpm-workspace.yaml @@ -0,0 +1,5 @@ +ignoredBuiltDependencies: + - esbuild +onlyBuiltDependencies: + - esbuild + - '@tailwindcss/oxide' diff --git a/apps/desktop/src-tauri/.gitignore b/apps/desktop/src-tauri/.gitignore new file mode 100644 index 0000000..b21bd68 --- /dev/null +++ b/apps/desktop/src-tauri/.gitignore @@ -0,0 +1,7 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ + +# Generated by Tauri +# will have schema files for capabilities auto-completion +/gen/schemas diff --git a/apps/desktop/src-tauri/Cargo.toml b/apps/desktop/src-tauri/Cargo.toml new file mode 100644 index 0000000..982d50f --- /dev/null +++ b/apps/desktop/src-tauri/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "senamby" +version = "0.1.0" +description = "Senamby desktop runtime and workspace application" +authors = ["Senamby"] +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +# The `_lib` suffix may seem redundant but it is necessary +# to make the lib name unique and wouldn't conflict with the bin name. +# This seems to be only an issue on Windows, see https://github.com/rust-lang/cargo/issues/8519 +name = "senamby_lib" +crate-type = ["staticlib", "cdylib", "rlib"] + +[build-dependencies] +tauri-build = { version = "2", features = [] } + +[dependencies] +tauri = { version = "2", features = [] } +tauri-plugin-dialog = "2" +tauri-plugin-opener = "2" +thiserror = "1" +serde = { version = "1", features = ["derive"] } +serde_json = "1" +uuid = { version = "1", features = ["v4", "serde"] } +parking_lot = "0.12" +chrono = { version = "0.4", features = ["serde"] } +dirs = "5" + +[dev-dependencies] +tauri = { version = "2", features = ["test"] } diff --git a/apps/desktop/src-tauri/build.rs b/apps/desktop/src-tauri/build.rs new file mode 100644 index 0000000..261851f --- /dev/null +++ b/apps/desktop/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build(); +} diff --git a/apps/desktop/src-tauri/capabilities/default.json b/apps/desktop/src-tauri/capabilities/default.json new file mode 100644 index 0000000..01a4101 --- /dev/null +++ b/apps/desktop/src-tauri/capabilities/default.json @@ -0,0 +1,11 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "Capability for the main window", + "windows": ["main"], + "permissions": [ + "core:default", + "dialog:default", + "opener:default" + ] +} diff --git a/apps/desktop/src-tauri/icons/128x128.png b/apps/desktop/src-tauri/icons/128x128.png new file mode 100644 index 0000000..6be5e50 Binary files /dev/null and b/apps/desktop/src-tauri/icons/128x128.png differ diff --git a/apps/desktop/src-tauri/icons/128x128@2x.png b/apps/desktop/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000..e81bece Binary files /dev/null and b/apps/desktop/src-tauri/icons/128x128@2x.png differ diff --git a/apps/desktop/src-tauri/icons/32x32.png b/apps/desktop/src-tauri/icons/32x32.png new file mode 100644 index 0000000..a437dd5 Binary files /dev/null and b/apps/desktop/src-tauri/icons/32x32.png differ diff --git a/apps/desktop/src-tauri/icons/Square107x107Logo.png b/apps/desktop/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000..0ca4f27 Binary files /dev/null and b/apps/desktop/src-tauri/icons/Square107x107Logo.png differ diff --git a/apps/desktop/src-tauri/icons/Square142x142Logo.png b/apps/desktop/src-tauri/icons/Square142x142Logo.png new file mode 100644 index 0000000..b81f820 Binary files /dev/null and b/apps/desktop/src-tauri/icons/Square142x142Logo.png differ diff --git a/apps/desktop/src-tauri/icons/Square150x150Logo.png b/apps/desktop/src-tauri/icons/Square150x150Logo.png new file mode 100644 index 0000000..624c7bf Binary files /dev/null and b/apps/desktop/src-tauri/icons/Square150x150Logo.png differ diff --git a/apps/desktop/src-tauri/icons/Square284x284Logo.png b/apps/desktop/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 0000000..c021d2b Binary files /dev/null and b/apps/desktop/src-tauri/icons/Square284x284Logo.png differ diff --git a/apps/desktop/src-tauri/icons/Square30x30Logo.png b/apps/desktop/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 0000000..6219700 Binary files /dev/null and b/apps/desktop/src-tauri/icons/Square30x30Logo.png differ diff --git a/apps/desktop/src-tauri/icons/Square310x310Logo.png b/apps/desktop/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 0000000..f9bc048 Binary files /dev/null and b/apps/desktop/src-tauri/icons/Square310x310Logo.png differ diff --git a/apps/desktop/src-tauri/icons/Square44x44Logo.png b/apps/desktop/src-tauri/icons/Square44x44Logo.png new file mode 100644 index 0000000..d5fbfb2 Binary files /dev/null and b/apps/desktop/src-tauri/icons/Square44x44Logo.png differ diff --git a/apps/desktop/src-tauri/icons/Square71x71Logo.png b/apps/desktop/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 0000000..63440d7 Binary files /dev/null and b/apps/desktop/src-tauri/icons/Square71x71Logo.png differ diff --git a/apps/desktop/src-tauri/icons/Square89x89Logo.png b/apps/desktop/src-tauri/icons/Square89x89Logo.png new file mode 100644 index 0000000..f3f705a Binary files /dev/null and b/apps/desktop/src-tauri/icons/Square89x89Logo.png differ diff --git a/apps/desktop/src-tauri/icons/StoreLogo.png b/apps/desktop/src-tauri/icons/StoreLogo.png new file mode 100644 index 0000000..4556388 Binary files /dev/null and b/apps/desktop/src-tauri/icons/StoreLogo.png differ diff --git a/apps/desktop/src-tauri/icons/icon.icns b/apps/desktop/src-tauri/icons/icon.icns new file mode 100644 index 0000000..12a5bce Binary files /dev/null and b/apps/desktop/src-tauri/icons/icon.icns differ diff --git a/apps/desktop/src-tauri/icons/icon.ico b/apps/desktop/src-tauri/icons/icon.ico new file mode 100644 index 0000000..06c23c8 Binary files /dev/null and b/apps/desktop/src-tauri/icons/icon.ico differ diff --git a/apps/desktop/src-tauri/icons/icon.png b/apps/desktop/src-tauri/icons/icon.png new file mode 100644 index 0000000..e1cd261 Binary files /dev/null and b/apps/desktop/src-tauri/icons/icon.png differ diff --git a/apps/desktop/src-tauri/runtime/python/runner.py b/apps/desktop/src-tauri/runtime/python/runner.py new file mode 100644 index 0000000..077de0e --- /dev/null +++ b/apps/desktop/src-tauri/runtime/python/runner.py @@ -0,0 +1,1267 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import copy +import importlib.util +import inspect +import json +import queue +import sys +import threading +import time +import traceback +from dataclasses import dataclass, field +from pathlib import Path +from typing import Any, Dict, List, Optional, Protocol, TypeAlias, cast + +JSONScalar: TypeAlias = str | int | float | bool | None +JSONValue: TypeAlias = JSONScalar | List["JSONValue"] | Dict[str, "JSONValue"] +JsonObject: TypeAlias = Dict[str, Any] +SensorPayload: TypeAlias = Dict[str, float] +ActuatorPayload: TypeAlias = Dict[str, float] +ControllerOutputPayload: TypeAlias = Dict[str, float] +PROTOCOL_STDOUT = sys.stdout + +DRIVER_REQUIRED_METHODS = ("connect", "stop", "read") +DRIVER_WRITE_METHOD = "write" +CONTROLLER_REQUIRED_METHODS = ("compute",) + + +@dataclass +class VariableSpec: + id: str + name: str + type: str + unit: str + setpoint: float + pv_min: float + pv_max: float + linked_sensor_ids: List[str] + + +@dataclass +class IOGroup: + ids: List[str] + count: int + variables: List[VariableSpec] + variables_by_id: Dict[str, VariableSpec] + + +@dataclass +class PlantContext: + id: str + name: str + variables: List[VariableSpec] + variables_by_id: Dict[str, VariableSpec] + sensors: IOGroup + actuators: IOGroup + setpoints: Dict[str, float] + + def apply_setpoints(self, next_setpoints: Dict[str, float]) -> None: + self.setpoints = dict(next_setpoints) + for variable_id, variable in self.variables_by_id.items(): + if variable_id in self.setpoints: + variable.setpoint = self.setpoints[variable_id] + for variable in self.variables: + if variable.id in self.setpoints: + variable.setpoint = self.setpoints[variable.id] + + +@dataclass(frozen=True) +class RuntimeTiming: + owner: str + clock: str + strategy: str + sample_time_ms: int + + +@dataclass(frozen=True) +class RuntimeSupervision: + owner: str + startup_timeout_ms: int + shutdown_timeout_ms: int + + +@dataclass(frozen=True) +class RuntimePaths: + runtime_dir: str + venv_python_path: str + runner_path: str + bootstrap_path: str + + +@dataclass(frozen=True) +class RuntimeContext: + id: str + timing: RuntimeTiming + supervision: RuntimeSupervision + paths: RuntimePaths + + +@dataclass(frozen=True) +class DriverMetadata: + plugin_id: str + plugin_name: str + plugin_dir: str + source_file: str + class_name: str + config: Dict[str, JSONValue] + + +@dataclass +class ControllerParamSpec: + key: str + type: str + value: JSONValue + label: str + + +@dataclass +class ControllerMetadata: + id: str + plugin_id: str + plugin_name: str + plugin_dir: str + source_file: str + class_name: str + name: str + controller_type: str + active: bool + input_variable_ids: List[str] + output_variable_ids: List[str] + params: Dict[str, ControllerParamSpec] + + +@dataclass(frozen=True) +class ControllerPublicMetadata: + id: str + name: str + controller_type: str + input_variable_ids: List[str] + output_variable_ids: List[str] + params: Dict[str, ControllerParamSpec] + + def serialize(self) -> Dict[str, Any]: + return { + "id": self.id, + "name": self.name, + "controller_type": self.controller_type, + "input_variable_ids": list(self.input_variable_ids), + "output_variable_ids": list(self.output_variable_ids), + "params": serialize_controller_params(self.params), + } + + +@dataclass(frozen=True) +class DriverPluginContext: + config: Dict[str, JSONValue] + plant: PlantContext + + +@dataclass(frozen=True) +class ControllerPluginContext: + controller: ControllerPublicMetadata + plant: PlantContext + + +@dataclass(frozen=True) +class RuntimeBootstrap: + driver: DriverMetadata + controllers: List[ControllerMetadata] + plant: PlantContext + runtime: RuntimeContext + + +@dataclass(frozen=True) +class CycleDurations: + read_duration_ms: float = 0.0 + control_duration_ms: float = 0.0 + write_duration_ms: float = 0.0 + publish_duration_ms: float = 0.0 + controller_durations_ms: Dict[str, float] = field(default_factory=dict) + + +class DriverProtocol(Protocol): + def connect(self) -> bool: ... + + def stop(self) -> bool: ... + + def read(self) -> Dict[str, Dict[str, float]]: ... + + def write(self, outputs: Dict[str, float]) -> bool | None: ... + + +class ControllerProtocol(Protocol): + def compute(self, snapshot: Dict[str, Any]) -> Dict[str, float]: ... + + +@dataclass +class LoadedController: + metadata: ControllerMetadata + public_metadata: Dict[str, Any] + instance: ControllerProtocol + + +class PlantRuntimeEngine: + def __init__(self, bootstrap: RuntimeBootstrap) -> None: + self.bootstrap = bootstrap + self.runtime_id = bootstrap.runtime.id + self.plant_id = bootstrap.plant.id + self.sample_time_ms = bootstrap.runtime.timing.sample_time_ms + self.driver_instance: Optional[DriverProtocol] = None + self.controllers: List[LoadedController] = [] + self.running = False + self.paused = False + self.should_exit = False + self.cycle_id = 0 + self.runtime_started_at: Optional[float] = None + self.first_cycle_started_at: Optional[float] = None + self.last_cycle_started_at: Optional[float] = None + self.next_cycle_deadline: Optional[float] = None + self.paused_started_at: Optional[float] = None + self.paused_duration_s = 0.0 + + def apply_init(self, bootstrap: RuntimeBootstrap) -> None: + self.bootstrap = bootstrap + self.runtime_id = bootstrap.runtime.id + self.plant_id = bootstrap.plant.id + self.sample_time_ms = bootstrap.runtime.timing.sample_time_ms + self.driver_instance = None + self.controllers = [] + self.running = False + self.paused = False + self.should_exit = False + self.cycle_id = 0 + self.runtime_started_at = None + self.first_cycle_started_at = None + self.last_cycle_started_at = None + self.next_cycle_deadline = None + self.paused_started_at = None + self.paused_duration_s = 0.0 + + def start(self) -> None: + if self.driver_instance is None: + driver_cls = load_plugin_class( + Path(self.bootstrap.driver.plugin_dir), + self.bootstrap.driver.source_file, + self.bootstrap.driver.class_name, + DRIVER_REQUIRED_METHODS, + "driver", + ) + driver_context = build_driver_plugin_context(self.bootstrap) + self.driver_instance = instantiate_plugin( + driver_cls, + driver_context, + "driver", + ) + + if self.bootstrap.controllers and not callable( + getattr(self.driver_instance, DRIVER_WRITE_METHOD, None) + ): + raise RuntimeError( + "Driver precisa implementar write(outputs) quando houver controladores ativos" + ) + + try: + connected_result = self.driver_instance.connect() + except Exception as exc: # noqa: BLE001 + raise RuntimeError( + f"Falha ao conectar driver '{self.bootstrap.driver.plugin_name}': {format_exception_message(exc)}" + ) from exc + + connected = coerce_required_bool("connect", connected_result) + if not connected: + raise RuntimeError("Driver retornou False em connect()") + + self._replace_controllers(self.bootstrap.controllers) + + self.running = True + self.paused = False + now = time.monotonic() + if self.runtime_started_at is None: + self.runtime_started_at = now + self.first_cycle_started_at = None + self.next_cycle_deadline = now + self.last_cycle_started_at = None + + def _load_controllers(self) -> List[LoadedController]: + loaded: List[LoadedController] = [] + for controller_meta in self.bootstrap.controllers: + controller_cls = load_plugin_class( + Path(controller_meta.plugin_dir), + controller_meta.source_file, + controller_meta.class_name, + CONTROLLER_REQUIRED_METHODS, + f"controlador '{controller_meta.name}'", + ) + context = build_controller_plugin_context( + controller_meta, + self.bootstrap.plant, + ) + instance = instantiate_plugin( + controller_cls, + context, + f"controlador '{controller_meta.name}'", + ) + loaded.append( + LoadedController( + metadata=controller_meta, + public_metadata=build_public_controller_metadata(controller_meta).serialize(), + instance=cast(ControllerProtocol, instance), + ) + ) + return loaded + + def pause(self) -> None: + if not self.paused: + self.paused_started_at = time.monotonic() + self.paused = True + self.next_cycle_deadline = None + self.last_cycle_started_at = None + + def resume(self) -> None: + if self.paused_started_at is not None: + paused_elapsed = max(0.0, time.monotonic() - self.paused_started_at) + self.paused_duration_s += paused_elapsed + if self.first_cycle_started_at is not None: + self.first_cycle_started_at += paused_elapsed + self.paused_started_at = None + self.paused = False + self.next_cycle_deadline = time.monotonic() + (self.sample_time_ms / 1000.0) + self.last_cycle_started_at = None + + def update_setpoints(self, setpoints: Dict[str, float]) -> None: + self.bootstrap.plant.apply_setpoints(setpoints) + + def update_controllers(self, controllers: List[ControllerMetadata]) -> None: + self._replace_controllers(controllers) + + def request_shutdown(self) -> None: + self.should_exit = True + self.running = False + + def next_wait_timeout(self) -> Optional[float]: + if self.should_exit: + return 0.0 + if not self.running or self.paused: + return None + if self.next_cycle_deadline is None: + return 0.0 + return max(0.0, self.next_cycle_deadline - time.monotonic()) + + def run_cycle(self) -> None: + if not self.running or self.paused: + return + + if self.next_cycle_deadline is None: + self.next_cycle_deadline = time.monotonic() + + now = time.monotonic() + if now < self.next_cycle_deadline: + time.sleep(self.next_cycle_deadline - now) + + cycle_started_at = time.monotonic() + self.cycle_id += 1 + if self.first_cycle_started_at is None: + self.first_cycle_started_at = cycle_started_at + effective_dt_ms = self._resolve_effective_dt_ms(cycle_started_at) + + sensors, actuators_read, durations, controller_outputs, written_outputs = self._execute_cycle( + cycle_started_at, + effective_dt_ms, + ) + + cycle_finished_at = time.monotonic() + cycle_duration_ms = (cycle_finished_at - cycle_started_at) * 1000.0 + + sample_step = self.sample_time_ms / 1000.0 + planned_next_deadline = (self.next_cycle_deadline or cycle_started_at) + sample_step + late_by_ms = max(0.0, (cycle_finished_at - planned_next_deadline) * 1000.0) + cycle_late = late_by_ms > 0.0 + + publish_started_at = time.monotonic() + telemetry_payload = { + "timestamp": time.time(), + "cycle_id": self.cycle_id, + "configured_sample_time_ms": self.sample_time_ms, + "effective_dt_ms": effective_dt_ms, + "cycle_duration_ms": cycle_duration_ms, + "read_duration_ms": durations.read_duration_ms, + "control_duration_ms": durations.control_duration_ms, + "write_duration_ms": durations.write_duration_ms, + "publish_duration_ms": max(0.0, (time.monotonic() - publish_started_at) * 1000.0), + "cycle_late": cycle_late, + "late_by_ms": late_by_ms, + "phase": "publish_telemetry", + "uptime_s": self._resolve_uptime_s(cycle_started_at), + "sensors": sensors, + "actuators": written_outputs or actuators_read, + "actuators_read": actuators_read, + "setpoints": self.bootstrap.plant.setpoints, + "controller_outputs": controller_outputs, + "written_outputs": written_outputs, + "controller_durations_ms": durations.controller_durations_ms, + } + emit("telemetry", telemetry_payload) + + if cycle_late: + emit( + "cycle_overrun", + { + "cycle_id": self.cycle_id, + "configured_sample_time_ms": self.sample_time_ms, + "cycle_duration_ms": cycle_duration_ms, + "late_by_ms": late_by_ms, + "phase": "publish_telemetry", + }, + ) + + self.next_cycle_deadline = planned_next_deadline + while self.next_cycle_deadline < time.monotonic(): + self.next_cycle_deadline += sample_step + + self.last_cycle_started_at = cycle_started_at + + def _execute_cycle( + self, + cycle_started_at: float, + effective_dt_ms: float, + ) -> tuple[SensorPayload, ActuatorPayload, CycleDurations, ControllerOutputPayload, ActuatorPayload]: + sensors: SensorPayload = {} + actuators_read: ActuatorPayload = {} + controller_outputs: ControllerOutputPayload = {} + written_outputs: ActuatorPayload = {} + controller_durations: Dict[str, float] = {} + + read_started_at = time.monotonic() + try: + if self.driver_instance is not None: + sensors, actuators_read = normalize_read_snapshot( + self.driver_instance.read(), + self.bootstrap.plant, + ) + except Exception as exc: # noqa: BLE001 + log_error(traceback.format_exc()) + emit("warning", {"message": f"Falha em leitura de driver: {exc}"}) + read_duration_ms = (time.monotonic() - read_started_at) * 1000.0 + + control_started_at = time.monotonic() + for controller in self.controllers: + compute_started_at = time.monotonic() + try: + snapshot = build_controller_snapshot( + cycle_id=self.cycle_id, + cycle_started_at=cycle_started_at, + dt_ms=effective_dt_ms, + plant=self.bootstrap.plant, + controller_public_metadata=controller.public_metadata, + sensors=sensors, + actuators=actuators_read, + ) + outputs = normalize_controller_outputs( + controller.instance.compute(snapshot), + controller.metadata.output_variable_ids, + controller.metadata.name, + ) + for variable_id, value in outputs.items(): + if variable_id in controller_outputs: + raise RuntimeError( + f"Saída '{variable_id}' recebeu mais de um valor no mesmo ciclo" + ) + controller_outputs[variable_id] = value + except Exception as exc: # noqa: BLE001 + log_error(traceback.format_exc()) + emit( + "warning", + { + "message": f"Falha no controlador '{controller.metadata.name}': {exc}", + }, + ) + finally: + controller_durations[controller.metadata.id] = ( + time.monotonic() - compute_started_at + ) * 1000.0 + control_duration_ms = (time.monotonic() - control_started_at) * 1000.0 + + write_started_at = time.monotonic() + if controller_outputs and self.driver_instance is not None: + try: + write_status = self.driver_instance.write(dict(controller_outputs)) + coerce_optional_bool( + "write", + write_status, + "Driver retornou False em write(outputs)", + ) + written_outputs = dict(controller_outputs) + except Exception as exc: # noqa: BLE001 + log_error(traceback.format_exc()) + emit("warning", {"message": f"Falha em escrita de driver: {exc}"}) + write_duration_ms = (time.monotonic() - write_started_at) * 1000.0 + + return ( + sensors, + actuators_read, + CycleDurations( + read_duration_ms=read_duration_ms, + control_duration_ms=control_duration_ms, + write_duration_ms=write_duration_ms, + controller_durations_ms=controller_durations, + ), + controller_outputs, + written_outputs, + ) + + def _resolve_effective_dt_ms(self, cycle_started_at: float) -> float: + if self.last_cycle_started_at is None: + return float(self.sample_time_ms) + return max(0.0, (cycle_started_at - self.last_cycle_started_at) * 1000.0) + + def _resolve_uptime_s(self, cycle_started_at: float) -> float: + if self.cycle_id == 1: + return 0.0 + first_cycle_started_at = self.first_cycle_started_at or cycle_started_at + return max(0.0, cycle_started_at - first_cycle_started_at) + + def stop(self) -> None: + for controller in self.controllers: + maybe_call_optional_stop(controller.instance, controller.metadata.name) + self.controllers = [] + if self.driver_instance is not None: + try: + stopped = coerce_required_bool("stop", self.driver_instance.stop()) + if not stopped: + emit("warning", {"message": "Driver retornou False em stop()"}) + except Exception as exc: # noqa: BLE001 + log_error(f"Falha ao finalizar driver: {exc}") + + def _replace_controllers(self, controllers: List[ControllerMetadata]) -> None: + if controllers and self.driver_instance is not None and not callable( + getattr(self.driver_instance, DRIVER_WRITE_METHOD, None) + ): + raise RuntimeError( + "Driver precisa implementar write(outputs) quando houver controladores ativos" + ) + + for controller in self.controllers: + maybe_call_optional_stop(controller.instance, controller.metadata.name) + + self.bootstrap = RuntimeBootstrap( + driver=self.bootstrap.driver, + controllers=list(controllers), + plant=self.bootstrap.plant, + runtime=self.bootstrap.runtime, + ) + self.controllers = self._load_controllers() + for controller in self.controllers: + maybe_call_optional_connect(controller.instance, controller.metadata.name) + + +def emit(msg_type: str, payload: Optional[Dict[str, Any]] = None) -> None: + envelope: Dict[str, Any] = {"type": msg_type} + if payload is not None: + envelope["payload"] = payload + PROTOCOL_STDOUT.write(json.dumps(envelope, ensure_ascii=False) + "\n") + PROTOCOL_STDOUT.flush() + + +def log_error(message: str) -> None: + sys.stderr.write(message + "\n") + sys.stderr.flush() + + +def format_exception_message(exc: BaseException) -> str: + message = str(exc).strip() + return message or exc.__class__.__name__ + + +def log_exception(exc: BaseException) -> None: + if isinstance(exc, RuntimeError): + log_error(str(exc)) + return + log_error(traceback.format_exc()) + + +def expect_dict(raw_value: Any, context: str) -> JsonObject: + if not isinstance(raw_value, dict): + raise RuntimeError(f"{context} deve ser um objeto JSON") + return cast(JsonObject, raw_value) + + +def normalize_string(raw_value: Any, context: str) -> str: + if not isinstance(raw_value, str) or not raw_value.strip(): + raise RuntimeError(f"{context} deve ser uma string não vazia") + return raw_value.strip() + + +def normalize_non_negative_int(raw_value: Any, context: str, default: int = 0) -> int: + if raw_value is None: + return default + resolved = int(raw_value) + if resolved < 0: + raise RuntimeError(f"{context} não pode ser negativo") + return resolved + + +def normalize_positive_int(raw_value: Any, context: str, default: int = 1) -> int: + resolved = normalize_non_negative_int(raw_value, context, default) + if resolved <= 0: + raise RuntimeError(f"{context} deve ser maior que zero") + return resolved + + +def normalize_string_list(raw_value: Any, context: str) -> List[str]: + if raw_value is None: + return [] + if not isinstance(raw_value, list): + raise RuntimeError(f"{context} deve ser um array") + return [str(value) for value in raw_value] + + +def normalize_json_map(raw_value: Any, context: str) -> Dict[str, JSONValue]: + if raw_value is None: + return {} + if not isinstance(raw_value, dict): + raise RuntimeError(f"{context} deve ser um objeto JSON") + return {str(key): cast(JSONValue, value) for key, value in raw_value.items()} + + +def normalize_float_map( + raw_value: Any, + context: str, + allowed_keys: Optional[set[str]] = None, +) -> Dict[str, float]: + if raw_value is None: + return {} + if not isinstance(raw_value, dict): + raise RuntimeError(f"{context} deve ser um objeto JSON") + + normalized: Dict[str, float] = {} + for key, value in raw_value.items(): + key_str = str(key) + if allowed_keys is not None and key_str not in allowed_keys: + continue + try: + numeric_value = float(value) + except Exception as exc: # noqa: BLE001 + raise RuntimeError(f"{context}.{key_str} deve ser numérico") from exc + if numeric_value != numeric_value or numeric_value in (float("inf"), float("-inf")): + raise RuntimeError(f"{context}.{key_str} deve ser finito") + normalized[key_str] = numeric_value + return normalized + + +def normalize_variable(raw_value: Any, context: str) -> VariableSpec: + raw = expect_dict(raw_value, context) + linked_sensor_ids_raw = raw.get("linked_sensor_ids") + linked_sensor_ids = ( + normalize_string_list(linked_sensor_ids_raw, f"{context}.linked_sensor_ids") + if linked_sensor_ids_raw is not None + else [] + ) + return VariableSpec( + id=normalize_string(raw.get("id"), f"{context}.id"), + name=normalize_string(raw.get("name"), f"{context}.name"), + type=normalize_string(raw.get("type"), f"{context}.type"), + unit=normalize_string(raw.get("unit"), f"{context}.unit"), + setpoint=float(raw.get("setpoint", 0.0) or 0.0), + pv_min=float(raw.get("pv_min", 0.0) or 0.0), + pv_max=float(raw.get("pv_max", 0.0) or 0.0), + linked_sensor_ids=linked_sensor_ids, + ) + + +def normalize_variable_list(raw_value: Any, context: str) -> List[VariableSpec]: + if raw_value is None: + return [] + if not isinstance(raw_value, list): + raise RuntimeError(f"{context} deve ser um array") + return [ + normalize_variable(item, f"{context}[{index}]") + for index, item in enumerate(raw_value) + ] + + +def normalize_variable_map(raw_value: Any, context: str) -> Dict[str, VariableSpec]: + if raw_value is None: + return {} + if not isinstance(raw_value, dict): + raise RuntimeError(f"{context} deve ser um objeto JSON") + + normalized: Dict[str, VariableSpec] = {} + for key, value in raw_value.items(): + variable = normalize_variable(value, f"{context}.{key}") + normalized[variable.id] = variable + return normalized + + +def build_variable_map(variables: List[VariableSpec]) -> Dict[str, VariableSpec]: + return {variable.id: variable for variable in variables} + + +def normalize_io_group(raw_value: Any, context: str) -> IOGroup: + raw = expect_dict(raw_value, context) + variables = normalize_variable_list(raw.get("variables"), f"{context}.variables") + variables_by_id = normalize_variable_map(raw.get("variables_by_id"), f"{context}.variables_by_id") + if not variables_by_id: + variables_by_id = build_variable_map(variables) + if not variables: + variables = list(variables_by_id.values()) + + ids = normalize_string_list(raw.get("ids"), f"{context}.ids") + if not ids: + ids = [variable.id for variable in variables] + + count = normalize_non_negative_int(raw.get("count"), f"{context}.count", len(ids)) + return IOGroup(ids=ids, count=count, variables=variables, variables_by_id=variables_by_id) + + +def normalize_plant_context(raw_value: Any) -> PlantContext: + raw = expect_dict(raw_value, "bootstrap.plant") + variables = normalize_variable_list(raw.get("variables"), "bootstrap.plant.variables") + if not variables: + raise RuntimeError("bootstrap.plant.variables deve conter pelo menos uma variável") + variables_by_id = build_variable_map(variables) + sensor_ids = normalize_string_list(raw.get("sensor_ids"), "bootstrap.plant.sensor_ids") + actuator_ids = normalize_string_list(raw.get("actuator_ids"), "bootstrap.plant.actuator_ids") + if not sensor_ids: + sensor_ids = [variable.id for variable in variables if variable.type == "sensor"] + if not actuator_ids: + actuator_ids = [variable.id for variable in variables if variable.type == "atuador"] + + sensor_variables = [variables_by_id[variable_id] for variable_id in sensor_ids if variable_id in variables_by_id] + actuator_variables = [ + variables_by_id[variable_id] for variable_id in actuator_ids if variable_id in variables_by_id + ] + + return PlantContext( + id=normalize_string(raw.get("id"), "bootstrap.plant.id"), + name=normalize_string(raw.get("name"), "bootstrap.plant.name"), + variables=variables, + variables_by_id=variables_by_id, + sensors=IOGroup( + ids=sensor_ids, + count=len(sensor_variables), + variables=sensor_variables, + variables_by_id=build_variable_map(sensor_variables), + ), + actuators=IOGroup( + ids=actuator_ids, + count=len(actuator_variables), + variables=actuator_variables, + variables_by_id=build_variable_map(actuator_variables), + ), + setpoints=normalize_float_map(raw.get("setpoints"), "bootstrap.plant.setpoints"), + ) + + +def normalize_runtime_context(raw_value: Any) -> RuntimeContext: + raw = expect_dict(raw_value, "bootstrap.runtime") + timing_raw = expect_dict(raw.get("timing"), "bootstrap.runtime.timing") + supervision_raw = expect_dict(raw.get("supervision"), "bootstrap.runtime.supervision") + paths_raw = expect_dict(raw.get("paths"), "bootstrap.runtime.paths") + + return RuntimeContext( + id=normalize_string(raw.get("id"), "bootstrap.runtime.id"), + timing=RuntimeTiming( + owner=normalize_string(timing_raw.get("owner"), "bootstrap.runtime.timing.owner"), + clock=normalize_string(timing_raw.get("clock"), "bootstrap.runtime.timing.clock"), + strategy=normalize_string(timing_raw.get("strategy"), "bootstrap.runtime.timing.strategy"), + sample_time_ms=normalize_positive_int( + timing_raw.get("sample_time_ms"), + "bootstrap.runtime.timing.sample_time_ms", + 100, + ), + ), + supervision=RuntimeSupervision( + owner=normalize_string( + supervision_raw.get("owner"), + "bootstrap.runtime.supervision.owner", + ), + startup_timeout_ms=normalize_positive_int( + supervision_raw.get("startup_timeout_ms"), + "bootstrap.runtime.supervision.startup_timeout_ms", + 1000, + ), + shutdown_timeout_ms=normalize_positive_int( + supervision_raw.get("shutdown_timeout_ms"), + "bootstrap.runtime.supervision.shutdown_timeout_ms", + 1000, + ), + ), + paths=RuntimePaths( + runtime_dir=normalize_string( + paths_raw.get("runtime_dir"), + "bootstrap.runtime.paths.runtime_dir", + ), + venv_python_path=normalize_string( + paths_raw.get("venv_python_path"), + "bootstrap.runtime.paths.venv_python_path", + ), + runner_path=normalize_string( + paths_raw.get("runner_path"), + "bootstrap.runtime.paths.runner_path", + ), + bootstrap_path=normalize_string( + paths_raw.get("bootstrap_path"), + "bootstrap.runtime.paths.bootstrap_path", + ), + ), + ) + + +def normalize_driver_metadata(raw_value: Any) -> DriverMetadata: + raw = expect_dict(raw_value, "bootstrap.driver") + return DriverMetadata( + plugin_id=normalize_string(raw.get("plugin_id"), "bootstrap.driver.plugin_id"), + plugin_name=normalize_string(raw.get("plugin_name"), "bootstrap.driver.plugin_name"), + plugin_dir=normalize_string(raw.get("plugin_dir"), "bootstrap.driver.plugin_dir"), + source_file=normalize_string(raw.get("source_file"), "bootstrap.driver.source_file"), + class_name=normalize_string(raw.get("class_name"), "bootstrap.driver.class_name"), + config=normalize_json_map(raw.get("config"), "bootstrap.driver.config"), + ) + + +def normalize_controller_param(raw_value: Any, context: str, key: str) -> ControllerParamSpec: + raw = expect_dict(raw_value, context) + return ControllerParamSpec( + key=key, + type=normalize_string(raw.get("type"), f"{context}.type"), + value=cast(JSONValue, raw.get("value")), + label=normalize_string(raw.get("label"), f"{context}.label"), + ) + + +def normalize_controller_metadata(raw_value: Any, index: int) -> ControllerMetadata: + context = f"bootstrap.controllers[{index}]" + raw = expect_dict(raw_value, context) + params_raw = expect_dict(raw.get("params") or {}, f"{context}.params") + + return ControllerMetadata( + id=normalize_string(raw.get("id"), f"{context}.id"), + plugin_id=normalize_string(raw.get("plugin_id"), f"{context}.plugin_id"), + plugin_name=normalize_string(raw.get("plugin_name"), f"{context}.plugin_name"), + plugin_dir=normalize_string(raw.get("plugin_dir"), f"{context}.plugin_dir"), + source_file=normalize_string(raw.get("source_file"), f"{context}.source_file"), + class_name=normalize_string(raw.get("class_name"), f"{context}.class_name"), + name=normalize_string(raw.get("name"), f"{context}.name"), + controller_type=normalize_string(raw.get("controller_type"), f"{context}.controller_type"), + active=bool(raw.get("active", True)), + input_variable_ids=normalize_string_list(raw.get("input_variable_ids"), f"{context}.input_variable_ids"), + output_variable_ids=normalize_string_list(raw.get("output_variable_ids"), f"{context}.output_variable_ids"), + params={ + str(key): normalize_controller_param(value, f"{context}.params.{key}", str(key)) + for key, value in params_raw.items() + }, + ) + + +def normalize_bootstrap(raw_value: Any) -> RuntimeBootstrap: + raw = expect_dict(raw_value, "bootstrap") + controllers_raw = raw.get("controllers") + if controllers_raw is None: + controllers: List[ControllerMetadata] = [] + elif not isinstance(controllers_raw, list): + raise RuntimeError("bootstrap.controllers deve ser um array") + else: + controllers = [ + normalize_controller_metadata(controller_raw, index) + for index, controller_raw in enumerate(controllers_raw) + ] + + return RuntimeBootstrap( + driver=normalize_driver_metadata(raw.get("driver")), + controllers=controllers, + plant=normalize_plant_context(raw.get("plant")), + runtime=normalize_runtime_context(raw.get("runtime")), + ) + + +def load_plugin_class( + plugin_dir: Path, + source_file: str, + expected_class_name: str, + required_methods: tuple[str, ...], + component_label: str, +) -> type[Any]: + source_path = plugin_dir / source_file + if not source_path.exists(): + raise RuntimeError(f"{source_file} não encontrado em '{source_path}'") + + spec = importlib.util.spec_from_file_location( + f"runtime_plugin_{expected_class_name.lower()}", + str(source_path), + ) + if spec is None or spec.loader is None: + raise RuntimeError(f"Falha ao criar spec do módulo do {component_label}") + + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + + candidate = getattr(module, expected_class_name, None) + if candidate is None or not inspect.isclass(candidate): + raise RuntimeError( + f"Classe '{expected_class_name}' não encontrada em {source_file} para o {component_label}" + ) + if candidate.__module__ != module.__name__: + raise RuntimeError( + f"Classe '{expected_class_name}' precisa ser definida em {source_file}" + ) + + missing = [ + method + for method in required_methods + if not callable(getattr(candidate, method, None)) + ] + if missing: + raise RuntimeError( + f"Classe '{expected_class_name}' inválida para o {component_label}. Métodos ausentes: {', '.join(missing)}" + ) + + return candidate + + +def instantiate_plugin(plugin_cls: type[Any], context: Any, component_label: str) -> Any: + try: + return plugin_cls(context) + except TypeError as exc: + raise RuntimeError( + f"Construtor do {component_label} deve seguir o contrato __init__(self, context)" + ) from exc + + +def coerce_required_bool(method_name: str, result: Any) -> bool: + if not isinstance(result, bool): + raise RuntimeError( + f"Método '{method_name}' deve retornar bool, recebeu {type(result).__name__}" + ) + return result + + +def coerce_optional_bool(method_name: str, result: Any, false_message: str) -> None: + if result is None: + return + if not isinstance(result, bool): + raise RuntimeError( + f"Método '{method_name}' deve retornar bool ou None, recebeu {type(result).__name__}" + ) + if not result: + emit("warning", {"message": false_message}) + + +def maybe_call_optional_connect(instance: Any, component_name: str) -> None: + connect = getattr(instance, "connect", None) + if not callable(connect): + return + result = connect() + coerce_optional_bool( + "connect", + result, + f"Componente '{component_name}' retornou False em connect()", + ) + + +def maybe_call_optional_stop(instance: Any, component_name: str) -> None: + stop = getattr(instance, "stop", None) + if not callable(stop): + return + try: + result = stop() + coerce_optional_bool( + "stop", + result, + f"Componente '{component_name}' retornou False em stop()", + ) + except Exception as exc: # noqa: BLE001 + log_error(f"Falha ao finalizar componente '{component_name}': {exc}") + + +def normalize_read_snapshot( + raw_value: Any, + plant: PlantContext, +) -> tuple[SensorPayload, ActuatorPayload]: + if raw_value is None: + return {}, {} + if not isinstance(raw_value, dict): + raise RuntimeError( + "read() deve retornar um objeto JSON no formato {'sensors': {...}, 'actuators': {...}}" + ) + + sensors = normalize_float_map(raw_value.get("sensors"), "read().sensors", set(plant.sensors.ids)) + actuators = normalize_float_map(raw_value.get("actuators"), "read().actuators", set(plant.actuators.ids)) + return sensors, actuators + + +def normalize_controller_outputs( + raw_value: Any, + allowed_output_ids: List[str], + controller_name: str, +) -> ControllerOutputPayload: + return normalize_float_map( + raw_value, + f"compute().outputs[{controller_name}]", + set(allowed_output_ids), + ) + + +def clone_controller_params( + params: Dict[str, ControllerParamSpec], +) -> Dict[str, ControllerParamSpec]: + return { + key: ControllerParamSpec( + key=param.key, + type=param.type, + value=cast(JSONValue, copy.deepcopy(param.value)), + label=param.label, + ) + for key, param in params.items() + } + + +def serialize_controller_params( + params: Dict[str, ControllerParamSpec], +) -> Dict[str, Dict[str, JSONValue | str]]: + return { + key: { + "type": param.type, + "value": cast(JSONValue, copy.deepcopy(param.value)), + "label": param.label, + } + for key, param in params.items() + } + + +def build_public_controller_metadata( + controller: ControllerMetadata, +) -> ControllerPublicMetadata: + return ControllerPublicMetadata( + id=controller.id, + name=controller.name, + controller_type=controller.controller_type, + input_variable_ids=list(controller.input_variable_ids), + output_variable_ids=list(controller.output_variable_ids), + params=clone_controller_params(controller.params), + ) + + +def build_driver_plugin_context(bootstrap: RuntimeBootstrap) -> DriverPluginContext: + return DriverPluginContext( + config=cast(Dict[str, JSONValue], copy.deepcopy(bootstrap.driver.config)), + plant=bootstrap.plant, + ) + + +def build_controller_plugin_context( + controller: ControllerMetadata, + plant: PlantContext, +) -> ControllerPluginContext: + return ControllerPluginContext( + controller=build_public_controller_metadata(controller), + plant=plant, + ) + + +def build_controller_snapshot( + cycle_id: int, + cycle_started_at: float, + dt_ms: float, + plant: PlantContext, + controller_public_metadata: Dict[str, Any], + sensors: SensorPayload, + actuators: ActuatorPayload, +) -> Dict[str, Any]: + return { + "cycle_id": cycle_id, + "timestamp": cycle_started_at, + "dt_s": max(0.0, dt_ms / 1000.0), + "plant": { + "id": plant.id, + "name": plant.name, + }, + "setpoints": dict(plant.setpoints), + "sensors": dict(sensors), + "actuators": dict(actuators), + "variables_by_id": { + variable_id: { + "id": variable.id, + "name": variable.name, + "type": variable.type, + "unit": variable.unit, + "setpoint": variable.setpoint, + "pv_min": variable.pv_min, + "pv_max": variable.pv_max, + "linked_sensor_ids": list(variable.linked_sensor_ids), + } + for variable_id, variable in plant.variables_by_id.items() + }, + "controller": copy.deepcopy(controller_public_metadata), + } + + +def spawn_command_reader(command_queue: "queue.Queue[Dict[str, Any]]") -> None: + def _reader() -> None: + for raw_line in sys.stdin: + line = raw_line.strip() + if not line: + continue + try: + payload = json.loads(line) + except Exception as exc: # noqa: BLE001 + emit("error", {"message": f"Comando JSON inválido: {exc}"}) + continue + + if not isinstance(payload, dict): + emit("error", {"message": "Comando recebido deve ser um objeto JSON"}) + continue + + command_queue.put(cast(Dict[str, Any], payload)) + + thread = threading.Thread(target=_reader, daemon=True, name="stdin-command-reader") + thread.start() + + +def bootstrap_from_file(bootstrap_path: Path) -> RuntimeBootstrap: + with bootstrap_path.open("r", encoding="utf-8") as handle: + return normalize_bootstrap(json.load(handle)) + + +def handle_command(command: Dict[str, Any], engine: PlantRuntimeEngine) -> None: + msg_type = str(command.get("type", "")).strip() + payload = command.get("payload") + + if msg_type == "init": + engine.apply_init(normalize_bootstrap(payload)) + return + + if msg_type == "start": + engine.start() + emit( + "connected", + {"runtime_id": engine.runtime_id, "plant_id": engine.plant_id}, + ) + return + + if msg_type == "pause": + engine.pause() + return + + if msg_type == "resume": + engine.resume() + return + + if msg_type == "update_setpoints": + raw_payload = expect_dict(payload, "update_setpoints.payload") + setpoints = normalize_float_map( + raw_payload.get("setpoints"), + "update_setpoints.payload.setpoints", + ) + engine.update_setpoints(setpoints) + return + + if msg_type == "update_controllers": + raw_payload = expect_dict(payload, "update_controllers.payload") + controllers_raw = raw_payload.get("controllers") + if controllers_raw is None: + controllers: List[ControllerMetadata] = [] + elif not isinstance(controllers_raw, list): + raise RuntimeError("update_controllers.payload.controllers deve ser um array") + else: + controllers = [ + normalize_controller_metadata(controller_raw, index) + for index, controller_raw in enumerate(controllers_raw) + ] + try: + engine.update_controllers(controllers) + except Exception as exc: # noqa: BLE001 + log_exception(exc) + emit("error", {"message": f"Falha ao atualizar controladores: {exc}"}) + return + + if msg_type in ("stop", "shutdown"): + engine.request_shutdown() + return + + if msg_type == "write_outputs": + emit("warning", {"message": "Comando write_outputs não é suportado nesta fase"}) + return + + +def run() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--runtime-dir", required=True) + parser.add_argument("--bootstrap", required=True) + args = parser.parse_args() + + runtime_dir = Path(args.runtime_dir) + bootstrap_path = Path(args.bootstrap) + + # Keep stdout reserved for the JSON protocol. Any plugin/library print() + # should flow to stderr so it never corrupts the IPC stream. + sys.stdout = sys.stderr + + if not bootstrap_path.exists(): + emit("error", {"message": f"bootstrap.json não encontrado em '{bootstrap_path}'"}) + return 1 + + bootstrap = bootstrap_from_file(bootstrap_path) + engine = PlantRuntimeEngine(bootstrap) + command_queue: "queue.Queue[Dict[str, Any]]" = queue.Queue() + spawn_command_reader(command_queue) + + emit( + "ready", + { + "runtime_id": engine.runtime_id, + "plant_id": engine.plant_id, + "driver": engine.bootstrap.driver.plugin_name, + "runtime_dir": str(runtime_dir), + }, + ) + + try: + while not engine.should_exit: + wait_timeout = engine.next_wait_timeout() + try: + command = command_queue.get(timeout=0.5 if wait_timeout is None else wait_timeout) + try: + handle_command(command, engine) + except Exception as exc: # noqa: BLE001 + log_exception(exc) + emit("error", {"message": f"Falha ao processar comando '{command.get('type', '')}': {exc}"}) + engine.request_shutdown() + continue + except queue.Empty: + pass + + while not engine.should_exit: + try: + command = command_queue.get_nowait() + except queue.Empty: + break + + try: + handle_command(command, engine) + except Exception as exc: # noqa: BLE001 + log_exception(exc) + emit("error", {"message": f"Falha ao processar comando '{command.get('type', '')}': {exc}"}) + engine.request_shutdown() + break + + if engine.should_exit: + break + + engine.run_cycle() + finally: + engine.stop() + + emit("stopped", {"runtime_id": engine.runtime_id, "plant_id": engine.plant_id}) + return 0 + + +if __name__ == "__main__": + try: + raise SystemExit(run()) + except Exception as exc: # noqa: BLE001 + log_exception(exc) + emit("error", {"message": f"Runner Python falhou: {exc}"}) + raise diff --git a/apps/desktop/src-tauri/runtime/python/test_runner_contract.py b/apps/desktop/src-tauri/runtime/python/test_runner_contract.py new file mode 100644 index 0000000..42bb3ce --- /dev/null +++ b/apps/desktop/src-tauri/runtime/python/test_runner_contract.py @@ -0,0 +1,346 @@ +from __future__ import annotations + +import importlib.util +import sys +import tempfile +import textwrap +import unittest +from unittest.mock import patch +from pathlib import Path +from types import ModuleType +from typing import Any + + +def load_runner_module() -> ModuleType: + runner_path = Path(__file__).with_name("runner.py") + spec = importlib.util.spec_from_file_location("senamby_runtime_runner", runner_path) + if spec is None or spec.loader is None: + raise RuntimeError("Falha ao carregar runner.py para testes") + module = importlib.util.module_from_spec(spec) + sys.modules[spec.name] = module + spec.loader.exec_module(module) + return module + + +runner = load_runner_module() + + +class RunnerContractTests(unittest.TestCase): + def build_bootstrap(self, root: Path) -> Any: + plant_variables = [ + runner.VariableSpec( + id="sensor_1", + name="Sensor 1", + type="sensor", + unit="C", + setpoint=42.0, + pv_min=0.0, + pv_max=100.0, + linked_sensor_ids=[], + ), + runner.VariableSpec( + id="actuator_1", + name="Actuator 1", + type="actuator", + unit="%", + setpoint=0.0, + pv_min=0.0, + pv_max=100.0, + linked_sensor_ids=["sensor_1"], + ), + ] + + variables_by_id = {variable.id: variable for variable in plant_variables} + plant = runner.PlantContext( + id="plant_1", + name="Plant 1", + variables=plant_variables, + variables_by_id=variables_by_id, + sensors=runner.IOGroup( + ids=["sensor_1"], + count=1, + variables=[variables_by_id["sensor_1"]], + variables_by_id={"sensor_1": variables_by_id["sensor_1"]}, + ), + actuators=runner.IOGroup( + ids=["actuator_1"], + count=1, + variables=[variables_by_id["actuator_1"]], + variables_by_id={"actuator_1": variables_by_id["actuator_1"]}, + ), + setpoints={"sensor_1": 42.0, "actuator_1": 0.0}, + ) + + runtime = runner.RuntimeContext( + id="rt_1", + timing=runner.RuntimeTiming( + owner="runtime", + clock="monotonic", + strategy="deadline", + sample_time_ms=100, + ), + supervision=runner.RuntimeSupervision( + owner="rust", + startup_timeout_ms=12000, + shutdown_timeout_ms=4000, + ), + paths=runner.RuntimePaths( + runtime_dir=str(root / "runtime"), + venv_python_path=str(root / ".venv" / "bin" / "python"), + runner_path=str(root / "runtime" / "runner.py"), + bootstrap_path=str(root / "runtime" / "bootstrap.json"), + ), + ) + + driver_dir = root / "driver_plugin" + driver_dir.mkdir() + (driver_dir / "main.py").write_text( + textwrap.dedent( + """ + from typing import Any, Dict + + class ContractDriver: + def __init__(self, context: Any) -> None: + if hasattr(context, "runtime"): + raise RuntimeError("driver context leaked runtime") + self.context = context + self.context_keys = set(vars(context).keys()) + + def connect(self) -> bool: + return True + + def stop(self) -> bool: + return True + + def read(self) -> Dict[str, Dict[str, float]]: + return { + "sensors": {"sensor_1": 1.0}, + "actuators": {"actuator_1": 0.0}, + } + + def write(self, outputs: Dict[str, float]) -> bool: + return True + """ + ).strip() + + "\n", + encoding="utf-8", + ) + + controller_dir = root / "controller_plugin" + controller_dir.mkdir() + (controller_dir / "main.py").write_text( + textwrap.dedent( + """ + from typing import Any, Dict + + class ContractController: + def __init__(self, context: Any) -> None: + if hasattr(context, "runtime"): + raise RuntimeError("controller context leaked runtime") + self.context = context + self.context_keys = set(vars(context).keys()) + self.controller_keys = set(vars(context.controller).keys()) + + def connect(self) -> bool: + return True + + def stop(self) -> bool: + return True + + def compute(self, snapshot: Dict[str, Any]) -> Dict[str, float]: + return {self.context.controller.output_variable_ids[0]: 0.0} + """ + ).strip() + + "\n", + encoding="utf-8", + ) + + return runner.RuntimeBootstrap( + driver=runner.DriverMetadata( + plugin_id="driver_plugin", + plugin_name="Driver Plugin", + plugin_dir=str(driver_dir), + source_file="main.py", + class_name="ContractDriver", + config={"port": "COM1"}, + ), + controllers=[ + runner.ControllerMetadata( + id="ctrl_1", + plugin_id="controller_plugin", + plugin_name="Controller Plugin", + plugin_dir=str(controller_dir), + source_file="main.py", + class_name="ContractController", + name="Controller 1", + controller_type="PID", + active=True, + input_variable_ids=["sensor_1"], + output_variable_ids=["actuator_1"], + params={ + "kp": runner.ControllerParamSpec( + key="kp", + type="number", + value=1.2, + label="Kp", + ) + }, + ) + ], + plant=plant, + runtime=runtime, + ) + + def test_driver_context_exposes_only_config_and_plant(self) -> None: + with tempfile.TemporaryDirectory() as tmp_dir: + bootstrap = self.build_bootstrap(Path(tmp_dir)) + context = runner.build_driver_plugin_context(bootstrap) + + self.assertEqual(set(vars(context).keys()), {"config", "plant"}) + self.assertFalse(hasattr(context, "runtime")) + + def test_controller_context_uses_minimum_public_shape(self) -> None: + with tempfile.TemporaryDirectory() as tmp_dir: + bootstrap = self.build_bootstrap(Path(tmp_dir)) + context = runner.build_controller_plugin_context( + bootstrap.controllers[0], + bootstrap.plant, + ) + + self.assertEqual(set(vars(context).keys()), {"controller", "plant"}) + self.assertFalse(hasattr(context, "runtime")) + self.assertEqual( + set(vars(context.controller).keys()), + { + "id", + "name", + "controller_type", + "input_variable_ids", + "output_variable_ids", + "params", + }, + ) + + def test_snapshot_controller_omits_internal_loader_fields(self) -> None: + with tempfile.TemporaryDirectory() as tmp_dir: + bootstrap = self.build_bootstrap(Path(tmp_dir)) + snapshot = runner.build_controller_snapshot( + cycle_id=1, + cycle_started_at=123.456, + dt_ms=100.0, + plant=bootstrap.plant, + controller_public_metadata=runner.build_public_controller_metadata( + bootstrap.controllers[0] + ).serialize(), + sensors={"sensor_1": 40.0}, + actuators={"actuator_1": 10.0}, + ) + + self.assertEqual( + set(snapshot["controller"].keys()), + { + "id", + "name", + "controller_type", + "input_variable_ids", + "output_variable_ids", + "params", + }, + ) + self.assertNotIn("plugin_id", snapshot["controller"]) + self.assertNotIn("plugin_name", snapshot["controller"]) + self.assertNotIn("active", snapshot["controller"]) + + def test_engine_loads_plugins_with_internal_bootstrap_and_public_context(self) -> None: + with tempfile.TemporaryDirectory() as tmp_dir: + bootstrap = self.build_bootstrap(Path(tmp_dir)) + engine = runner.PlantRuntimeEngine(bootstrap) + try: + engine.start() + + driver_instance = engine.driver_instance + self.assertIsNotNone(driver_instance) + self.assertEqual(driver_instance.context_keys, {"config", "plant"}) + self.assertFalse(hasattr(driver_instance.context, "runtime")) + + self.assertEqual(len(engine.controllers), 1) + controller_instance = engine.controllers[0].instance + self.assertEqual(controller_instance.context_keys, {"controller", "plant"}) + self.assertFalse(hasattr(controller_instance.context, "runtime")) + self.assertEqual( + controller_instance.controller_keys, + { + "id", + "name", + "controller_type", + "input_variable_ids", + "output_variable_ids", + "params", + }, + ) + finally: + engine.stop() + + def test_engine_uptime_progresses_from_first_cycle_start(self) -> None: + class FakeClock: + def __init__(self) -> None: + self.monotonic_now = 1000.0 + self.wall_now = 1700000000.0 + + def monotonic(self) -> float: + return self.monotonic_now + + def time(self) -> float: + return self.wall_now + (self.monotonic_now - 1000.0) + + def sleep(self, duration: float) -> None: + self.monotonic_now += max(0.0, duration) + + with tempfile.TemporaryDirectory() as tmp_dir: + original_bootstrap = self.build_bootstrap(Path(tmp_dir)) + bootstrap = runner.RuntimeBootstrap( + driver=original_bootstrap.driver, + controllers=original_bootstrap.controllers, + plant=original_bootstrap.plant, + runtime=runner.RuntimeContext( + id=original_bootstrap.runtime.id, + timing=runner.RuntimeTiming( + owner=original_bootstrap.runtime.timing.owner, + clock=original_bootstrap.runtime.timing.clock, + strategy=original_bootstrap.runtime.timing.strategy, + sample_time_ms=1000, + ), + supervision=original_bootstrap.runtime.supervision, + paths=original_bootstrap.runtime.paths, + ), + ) + engine = runner.PlantRuntimeEngine(bootstrap) + fake_clock = FakeClock() + telemetry_payloads: list[dict[str, Any]] = [] + + def capture_emit(msg_type: str, payload: dict[str, Any] | None = None) -> None: + if msg_type == "telemetry" and payload is not None: + telemetry_payloads.append(payload) + + with ( + patch.object(runner.time, "monotonic", fake_clock.monotonic), + patch.object(runner.time, "time", fake_clock.time), + patch.object(runner.time, "sleep", fake_clock.sleep), + patch.object(runner, "emit", capture_emit), + ): + try: + engine.start() + engine.run_cycle() + engine.run_cycle() + engine.run_cycle() + finally: + engine.stop() + + self.assertEqual(len(telemetry_payloads), 3) + self.assertAlmostEqual(telemetry_payloads[0]["uptime_s"], 0.0, places=6) + self.assertAlmostEqual(telemetry_payloads[1]["uptime_s"], 1.0, places=6) + self.assertAlmostEqual(telemetry_payloads[2]["uptime_s"], 2.0, places=6) + + +if __name__ == "__main__": + unittest.main() diff --git a/apps/desktop/src-tauri/src/commands/mod.rs b/apps/desktop/src-tauri/src/commands/mod.rs new file mode 100644 index 0000000..5e0cc2d --- /dev/null +++ b/apps/desktop/src-tauri/src/commands/mod.rs @@ -0,0 +1,2 @@ +pub mod plants; +pub mod plugins; diff --git a/apps/desktop/src-tauri/src/commands/plants.rs b/apps/desktop/src-tauri/src/commands/plants.rs new file mode 100644 index 0000000..c2b2496 --- /dev/null +++ b/apps/desktop/src-tauri/src/commands/plants.rs @@ -0,0 +1,220 @@ +#![allow(clippy::needless_pass_by_value)] + +use crate::core::error::{AppError, ErrorDto}; +use crate::core::models::plant::{ + CreatePlantRequest, Plant, PlantResponse, RemovePlantControllerRequest, + SavePlantControllerConfigRequest, SavePlantSetpointRequest, UpdatePlantRequest, +}; +use crate::core::services::plant::PlantService; +use crate::core::services::plant_import::{ + ImportPlantFileResponse, OpenPlantFileResponse, PlantImportFileRequest, PlantImportService, +}; +use crate::core::services::runtime::{DriverRuntimeService, PlantRuntimeManager}; +use crate::state::AppState; +use serde::Deserialize; +use tauri::{AppHandle, State}; + +#[derive(Debug, Deserialize)] +pub struct ImportFileRequest { + #[serde(rename = "fileName")] + pub file_name: String, + pub content: String, +} + +#[derive(Debug, Deserialize)] +pub struct SaveExportFileRequest { + pub path: String, + pub content: String, +} + +impl From for PlantImportFileRequest { + fn from(value: ImportFileRequest) -> Self { + Self { + file_name: value.file_name, + content: value.content, + } + } +} + +fn into_plant_response( + runtimes: &PlantRuntimeManager, + result: crate::core::error::AppResult, +) -> Result { + result + .map(|plant| PlantResponse::from(runtimes.apply_live_stats(plant))) + .map_err(ErrorDto::from) +} + +#[tauri::command] +pub fn create_plant( + state: State<'_, AppState>, + request: CreatePlantRequest, +) -> Result { + into_plant_response( + state.runtimes(), + PlantService::create(state.plants(), state.plugins(), request), + ) +} + +#[tauri::command] +pub fn update_plant( + state: State<'_, AppState>, + request: UpdatePlantRequest, +) -> Result { + into_plant_response( + state.runtimes(), + PlantService::update(state.plants(), state.plugins(), request), + ) +} + +#[tauri::command] +pub fn list_plants(state: State<'_, AppState>) -> Vec { + state + .runtimes() + .apply_live_stats_batch(PlantService::list(state.plants())) + .into_iter() + .map(PlantResponse::from) + .collect() +} + +#[tauri::command] +pub fn get_plant(state: State<'_, AppState>, id: String) -> Result { + into_plant_response(state.runtimes(), PlantService::get(state.plants(), &id)) +} + +#[tauri::command] +pub fn close_plant( + app: AppHandle, + state: State<'_, AppState>, + id: String, +) -> Result { + into_plant_response( + state.runtimes(), + DriverRuntimeService::close(&app, state.plants(), state.runtimes(), &id), + ) +} + +#[tauri::command] +pub fn remove_plant( + app: AppHandle, + state: State<'_, AppState>, + id: String, +) -> Result { + into_plant_response( + state.runtimes(), + DriverRuntimeService::remove(&app, state.plants(), state.runtimes(), &id), + ) +} + +#[tauri::command] +pub fn connect_plant( + app: AppHandle, + state: State<'_, AppState>, + id: String, +) -> Result { + into_plant_response( + state.runtimes(), + DriverRuntimeService::connect(&app, state.plants(), state.plugins(), state.runtimes(), &id), + ) +} + +#[tauri::command] +pub fn disconnect_plant( + app: AppHandle, + state: State<'_, AppState>, + id: String, +) -> Result { + into_plant_response( + state.runtimes(), + DriverRuntimeService::disconnect(&app, state.plants(), state.runtimes(), &id), + ) +} + +#[tauri::command] +pub fn pause_plant(state: State<'_, AppState>, id: String) -> Result { + into_plant_response( + state.runtimes(), + DriverRuntimeService::pause(state.plants(), state.runtimes(), &id), + ) +} + +#[tauri::command] +pub fn resume_plant(state: State<'_, AppState>, id: String) -> Result { + into_plant_response( + state.runtimes(), + DriverRuntimeService::resume(state.plants(), state.runtimes(), &id), + ) +} + +#[tauri::command] +pub fn save_controller( + state: State<'_, AppState>, + request: SavePlantControllerConfigRequest, +) -> Result { + into_plant_response( + state.runtimes(), + DriverRuntimeService::save_controller_config( + state.plants(), + state.plugins(), + state.runtimes(), + request, + ), + ) +} + +#[tauri::command] +pub fn remove_controller( + state: State<'_, AppState>, + request: RemovePlantControllerRequest, +) -> Result { + into_plant_response( + state.runtimes(), + DriverRuntimeService::remove_controller( + state.plants(), + state.plugins(), + state.runtimes(), + &request, + ), + ) +} + +#[tauri::command] +pub fn save_setpoint( + state: State<'_, AppState>, + request: SavePlantSetpointRequest, +) -> Result { + into_plant_response( + state.runtimes(), + DriverRuntimeService::save_setpoint(state.plants(), state.runtimes(), &request), + ) +} + +#[tauri::command] +pub fn open_plant_file(request: ImportFileRequest) -> Result { + PlantImportService::open_file(request.into()).map_err(ErrorDto::from) +} + +#[tauri::command] +pub fn import_plant_file( + state: State<'_, AppState>, + request: ImportFileRequest, +) -> Result { + PlantImportService::import_file(state.plants(), state.plugins(), request.into()) + .map_err(ErrorDto::from) +} + +#[tauri::command] +pub fn save_export_file(request: SaveExportFileRequest) -> Result<(), ErrorDto> { + let path = request.path.trim(); + if path.is_empty() { + return Err(ErrorDto::from(AppError::InvalidArgument( + "Caminho do arquivo é obrigatório".into(), + ))); + } + + std::fs::write(path, request.content).map_err(|error| { + ErrorDto::from(AppError::IoError(format!( + "Falha ao salvar arquivo \"{path}\": {error}" + ))) + }) +} diff --git a/apps/desktop/src-tauri/src/commands/plugins.rs b/apps/desktop/src-tauri/src/commands/plugins.rs new file mode 100644 index 0000000..2f8c8fb --- /dev/null +++ b/apps/desktop/src-tauri/src/commands/plugins.rs @@ -0,0 +1,73 @@ +#![allow(clippy::needless_pass_by_value)] + +use tauri::State; + +use crate::core::error::ErrorDto; +use crate::core::models::plugin::{ + CreatePluginRequest, PluginRegistry, PluginType, UpdatePluginRequest, +}; +use crate::core::services::plugin::PluginService; +use crate::core::services::plugin_import::PluginImportService; +use crate::state::AppState; +use serde::Deserialize; + +#[derive(Debug, Deserialize)] +pub struct ImportPluginFileRequest { + pub content: String, +} + +fn into_plugin_result( + result: crate::core::error::AppResult, +) -> Result { + result.map_err(ErrorDto::from) +} + +#[tauri::command] +pub fn create_plugin( + state: State<'_, AppState>, + request: CreatePluginRequest, +) -> Result { + into_plugin_result(PluginService::create(state.plugins(), request)) +} + +#[tauri::command] +pub fn get_plugin(state: State<'_, AppState>, id: String) -> Result { + into_plugin_result(PluginService::get(state.plugins(), &id)) +} + +#[tauri::command] +pub fn update_plugin( + state: State<'_, AppState>, + request: UpdatePluginRequest, +) -> Result { + into_plugin_result(PluginService::update(state.plugins(), request)) +} + +#[tauri::command] +pub fn list_plugins(state: State<'_, AppState>) -> Vec { + PluginService::list(state.plugins()) +} + +#[tauri::command] +pub fn load_plugins(state: State<'_, AppState>) -> Result, ErrorDto> { + PluginService::load_all(state.plugins()).map_err(ErrorDto::from) +} + +#[tauri::command] +pub fn delete_plugin(state: State<'_, AppState>, id: String) -> Result { + into_plugin_result(PluginService::remove(state.plugins(), &id)) +} + +#[tauri::command] +pub fn import_plugin_file(request: ImportPluginFileRequest) -> Result { + into_plugin_result(PluginImportService::parse_file(&request.content)) +} + +#[tauri::command] +#[allow(non_snake_case)] +pub fn list_plugins_by_type( + state: State<'_, AppState>, + pluginType: PluginType, +) -> Vec { + PluginService::list_by_type(state.plugins(), pluginType) +} diff --git a/apps/desktop/src-tauri/src/core/error.rs b/apps/desktop/src-tauri/src/core/error.rs new file mode 100644 index 0000000..c307a77 --- /dev/null +++ b/apps/desktop/src-tauri/src/core/error.rs @@ -0,0 +1,42 @@ +use serde::Serialize; +use thiserror::Error; + +pub type AppResult = Result; + +#[derive(Debug, Error)] +pub enum AppError { + #[error("invalid argument: {0}")] + InvalidArgument(String), + + #[error("not found: {0}")] + NotFound(String), + + #[error("io error: {0}")] + IoError(String), + + #[allow(dead_code)] + #[error("internal error")] + InternalError, +} + +#[derive(Debug, Serialize)] +pub struct ErrorDto { + pub code: String, + pub message: String, +} + +impl From for ErrorDto { + fn from(err: AppError) -> Self { + let (code, message) = match err { + AppError::InvalidArgument(msg) => ("INVALID_ARGUMENT", msg), + AppError::NotFound(msg) => ("NOT_FOUND", msg), + AppError::IoError(msg) => ("IO_ERROR", msg), + AppError::InternalError => ("INTERNAL_ERROR", "An internal error occurred".to_string()), + }; + + Self { + code: code.to_string(), + message, + } + } +} diff --git a/apps/desktop/src-tauri/src/core/mod.rs b/apps/desktop/src-tauri/src/core/mod.rs new file mode 100644 index 0000000..2ecb516 --- /dev/null +++ b/apps/desktop/src-tauri/src/core/mod.rs @@ -0,0 +1,3 @@ +pub mod error; +pub mod models; +pub mod services; diff --git a/apps/desktop/src-tauri/src/core/models/mod.rs b/apps/desktop/src-tauri/src/core/models/mod.rs new file mode 100644 index 0000000..e7712d2 --- /dev/null +++ b/apps/desktop/src-tauri/src/core/models/mod.rs @@ -0,0 +1,2 @@ +pub mod plant; +pub mod plugin; diff --git a/apps/desktop/src-tauri/src/core/models/plant.rs b/apps/desktop/src-tauri/src/core/models/plant.rs new file mode 100644 index 0000000..5bb9e48 --- /dev/null +++ b/apps/desktop/src-tauri/src/core/models/plant.rs @@ -0,0 +1,261 @@ +use crate::core::models::plugin::{PluginRuntime, SchemaFieldValue}; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; + +fn default_sample_time_ms() -> u64 { + 100 +} + +fn default_controller_active() -> bool { + false +} + +fn default_controller_runtime_status() -> ControllerRuntimeStatus { + ControllerRuntimeStatus::Synced +} + +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +pub enum VariableType { + Sensor, + Atuador, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PlantVariable { + pub id: String, + pub name: String, + + #[serde(rename = "type")] + pub var_type: VariableType, + + pub unit: String, + pub setpoint: f64, + pub pv_min: f64, + pub pv_max: f64, + + #[serde(skip_serializing_if = "Option::is_none")] + pub linked_sensor_ids: Option>, +} + +#[derive(Debug, Clone, Deserialize)] +pub struct CreatePlantRequest { + pub name: String, + #[serde(default = "default_sample_time_ms")] + pub sample_time_ms: u64, + pub variables: Vec, + pub driver: CreatePlantDriverRequest, + #[serde(default)] + pub controllers: Vec, +} + +#[derive(Debug, Clone, Deserialize)] +pub struct UpdatePlantRequest { + pub id: String, + pub name: String, + #[serde(default = "default_sample_time_ms")] + pub sample_time_ms: u64, + pub variables: Vec, + pub driver: CreatePlantDriverRequest, + #[serde(default)] + pub controllers: Vec, +} + +#[derive(Debug, Clone, Deserialize)] +pub struct CreatePlantVariableRequest { + pub name: String, + + #[serde(rename = "type")] + pub var_type: VariableType, + + pub unit: String, + pub setpoint: f64, + pub pv_min: f64, + pub pv_max: f64, + + #[serde(default)] + pub linked_sensor_ids: Option>, +} + +#[derive(Debug, Clone, Default, Serialize, Deserialize)] +pub struct PlantStats { + pub dt: f64, + pub uptime: u64, +} + +#[derive(Debug, Clone, Deserialize)] +pub struct CreatePlantDriverRequest { + pub plugin_id: String, + #[serde(default)] + pub config: HashMap, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +pub enum ControllerParamType { + Number, + Boolean, + String, +} + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum ControllerRuntimeStatus { + #[default] + Synced, + PendingRestart, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ControllerParam { + #[serde(rename = "type")] + pub param_type: ControllerParamType, + pub value: SchemaFieldValue, + pub label: String, +} + +#[derive(Debug, Clone, Deserialize)] +pub struct CreatePlantControllerRequest { + #[serde(default)] + pub id: Option, + pub plugin_id: String, + pub name: String, + pub controller_type: String, + #[allow(dead_code)] + #[serde(default = "default_controller_active")] + pub active: bool, + #[serde(default)] + pub input_variable_ids: Vec, + #[serde(default)] + pub output_variable_ids: Vec, + #[serde(default)] + pub params: HashMap, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PlantDriver { + pub plugin_id: String, + pub plugin_name: String, + pub runtime: PluginRuntime, + #[serde(skip_serializing_if = "Option::is_none")] + pub source_file: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub source_code: Option, + #[serde(default)] + pub config: HashMap, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PlantController { + pub id: String, + pub plugin_id: String, + #[serde(default)] + pub plugin_name: String, + pub name: String, + pub controller_type: String, + pub active: bool, + #[serde(default)] + pub input_variable_ids: Vec, + #[serde(default)] + pub output_variable_ids: Vec, + #[serde(default)] + pub params: HashMap, + #[serde(default = "default_controller_runtime_status")] + pub runtime_status: ControllerRuntimeStatus, +} + +#[derive(Debug, Clone, Deserialize)] +pub struct SavePlantControllerConfigRequest { + pub plant_id: String, + pub controller_id: String, + #[serde(default)] + pub plugin_id: Option, + pub name: String, + pub controller_type: String, + pub active: bool, + #[serde(default)] + pub input_variable_ids: Vec, + #[serde(default)] + pub output_variable_ids: Vec, + #[serde(default)] + pub params: Vec, +} + +#[derive(Debug, Clone, Deserialize)] +pub struct SavePlantControllerParamRequest { + pub key: String, + #[serde(rename = "type")] + pub param_type: ControllerParamType, + pub value: SchemaFieldValue, + pub label: String, +} + +#[derive(Debug, Clone, Deserialize)] +pub struct SavePlantSetpointRequest { + pub plant_id: String, + pub variable_id: String, + pub setpoint: f64, +} + +#[derive(Debug, Clone, Deserialize)] +pub struct RemovePlantControllerRequest { + pub plant_id: String, + pub controller_id: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Plant { + pub id: String, + pub name: String, + #[serde(default = "default_sample_time_ms")] + pub sample_time_ms: u64, + pub variables: Vec, + pub driver: PlantDriver, + #[serde(default)] + pub controllers: Vec, + + #[serde(skip, default)] + pub connected: bool, + + #[serde(skip, default)] + pub paused: bool, + + #[serde(skip, default = "PlantStats::default")] + pub stats: PlantStats, +} + +#[derive(Debug, Clone, Serialize)] +pub struct PlantResponse { + pub id: String, + pub name: String, + pub sample_time_ms: u64, + pub connected: bool, + pub paused: bool, + pub variables: Vec, + pub stats: PlantStats, + pub driver: PlantDriver, + #[serde(default)] + pub controllers: Vec, +} + +impl From<&Plant> for PlantResponse { + fn from(plant: &Plant) -> Self { + Self::from(plant.clone()) + } +} + +impl From for PlantResponse { + fn from(plant: Plant) -> Self { + Self { + id: plant.id, + name: plant.name, + sample_time_ms: plant.sample_time_ms, + connected: plant.connected, + paused: plant.paused, + variables: plant.variables, + stats: plant.stats, + driver: plant.driver, + controllers: plant.controllers, + } + } +} diff --git a/apps/desktop/src-tauri/src/core/models/plugin.rs b/apps/desktop/src-tauri/src/core/models/plugin.rs new file mode 100644 index 0000000..64635a3 --- /dev/null +++ b/apps/desktop/src-tauri/src/core/models/plugin.rs @@ -0,0 +1,189 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum PluginType { + Driver, + Controller, +} + +impl PluginType { + pub fn as_label(self) -> &'static str { + match self { + Self::Driver => "driver", + Self::Controller => "controller", + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum PluginRuntime { + Python, + RustNative, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum SchemaFieldType { + Bool, + Int, + Float, + String, + List, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum SchemaFieldValue { + Bool(bool), + Int(i64), + Float(f64), + String(String), + List(Vec), +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PluginSchemaField { + pub name: String, + + #[serde(rename = "type")] + pub field_type: SchemaFieldType, + + #[serde(skip_serializing_if = "Option::is_none")] + pub default_value: Option, + + #[serde(skip_serializing_if = "Option::is_none")] + pub description: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PluginDependency { + pub name: String, + pub version: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PluginRegistry { + pub id: String, + pub name: String, + + #[serde(rename = "type")] + pub plugin_type: PluginType, + + pub runtime: PluginRuntime, + + #[serde(default, skip_serializing_if = "String::is_empty")] + pub entry_class: String, + + #[serde(default)] + pub schema: Vec, + + #[serde(skip_serializing_if = "Option::is_none")] + pub source_file: Option, + + #[serde(skip_serializing_if = "Option::is_none")] + pub source_code: Option, + + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub dependencies: Vec, + + #[serde(skip_serializing_if = "Option::is_none")] + pub description: Option, + + #[serde(skip_serializing_if = "Option::is_none")] + pub version: Option, + + #[serde(skip_serializing_if = "Option::is_none")] + pub author: Option, +} + +#[derive(Debug, Clone, Deserialize)] +pub struct CreatePluginRequest { + pub name: String, + + #[serde(rename = "type")] + pub plugin_type: PluginType, + + pub runtime: PluginRuntime, + + #[serde(default)] + pub entry_class: Option, + + #[serde(default)] + pub schema: Vec, + + #[serde(default)] + pub source_file: Option, + + #[serde(default)] + pub source_code: Option, + + #[serde(default)] + pub dependencies: Vec, + + #[serde(default)] + pub description: Option, + + #[serde(default)] + pub version: Option, + + #[serde(default)] + pub author: Option, +} + +#[derive(Debug, Clone, Deserialize)] +pub struct UpdatePluginRequest { + pub id: String, + pub name: String, + + #[serde(rename = "type")] + pub plugin_type: PluginType, + + pub runtime: PluginRuntime, + + #[serde(default)] + pub entry_class: Option, + + #[serde(default)] + pub schema: Vec, + + #[serde(default)] + pub source_file: Option, + + #[serde(default)] + pub source_code: Option, + + #[serde(default)] + pub dependencies: Vec, + + #[serde(default)] + pub description: Option, + + #[serde(default)] + pub version: Option, + + #[serde(default)] + pub author: Option, +} + +#[allow(dead_code)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum PluginInstanceStatus { + Idle, + Running, + Stopped, + Error, +} + +#[allow(dead_code)] +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PluginInstance { + pub id: String, + pub plugin_id: String, + pub plugin_name: String, + pub plugin_type: PluginType, + pub status: PluginInstanceStatus, + pub config: std::collections::HashMap, +} diff --git a/apps/desktop/src-tauri/src/core/services/mod.rs b/apps/desktop/src-tauri/src/core/services/mod.rs new file mode 100644 index 0000000..b01b569 --- /dev/null +++ b/apps/desktop/src-tauri/src/core/services/mod.rs @@ -0,0 +1,6 @@ +pub mod plant; +pub mod plant_import; +pub mod plugin; +pub mod plugin_import; +pub mod runtime; +pub mod workspace; diff --git a/apps/desktop/src-tauri/src/core/services/plant.rs b/apps/desktop/src-tauri/src/core/services/plant.rs new file mode 100644 index 0000000..606ca3e --- /dev/null +++ b/apps/desktop/src-tauri/src/core/services/plant.rs @@ -0,0 +1,353 @@ +mod builders; +mod controller_params; +mod validation; + +use self::builders::{build_plant, build_updated_plant, PlantRuntimeSnapshot}; +use self::validation::{ + resolve_plugin, validate_active_controller_conflicts, validate_controller, validate_payload, +}; +use crate::core::error::{AppError, AppResult}; +use crate::core::models::plant::{ + ControllerParam, ControllerRuntimeStatus, CreatePlantControllerRequest, CreatePlantRequest, + CreatePlantVariableRequest, Plant, PlantController, RemovePlantControllerRequest, + SavePlantControllerConfigRequest, SavePlantSetpointRequest, UpdatePlantRequest, VariableType, +}; +use crate::core::models::plugin::{PluginRegistry, PluginType}; +use crate::core::services::workspace::WorkspaceService; +use crate::state::{PlantStore, PluginStore}; + +pub struct PlantService; + +impl PlantService { + pub fn create( + store: &PlantStore, + plugins: &PluginStore, + request: CreatePlantRequest, + ) -> AppResult { + validate_payload( + None, + &request.name, + request.sample_time_ms, + &request.variables, + &request.driver, + &request.controllers, + store, + plugins, + )?; + + let plant = build_plant(request, plugins)?; + WorkspaceService::save_plant_registry(&plant)?; + + if let Err(error) = store.insert(plant.clone()) { + let _ = WorkspaceService::delete_plant_registry(&plant.name); + return Err(error); + } + + Ok(plant) + } + + pub fn update( + store: &PlantStore, + plugins: &PluginStore, + request: UpdatePlantRequest, + ) -> AppResult { + validate_payload( + Some(request.id.as_str()), + &request.name, + request.sample_time_ms, + &request.variables, + &request.driver, + &request.controllers, + store, + plugins, + )?; + + let runtime = store.read(&request.id, |existing| PlantRuntimeSnapshot { + previous_name: existing.name.clone(), + previous_sample_time_ms: existing.sample_time_ms, + connected: existing.connected, + paused: existing.paused, + stats: existing.stats.clone(), + })?; + + let previous_name = runtime.previous_name.clone(); + let updated_plant = build_updated_plant(request, plugins, runtime)?; + WorkspaceService::update_plant_registry(&updated_plant, &previous_name)?; + store.replace(&updated_plant.id, updated_plant.clone())?; + + Ok(updated_plant) + } + + pub(crate) fn fill_missing_controller_params( + params: &mut std::collections::HashMap, + plugin: &PluginRegistry, + ) -> bool { + controller_params::fill_missing_controller_params(params, plugin) + } + + pub fn get(store: &PlantStore, id: &str) -> AppResult { + store.get(id) + } + + pub fn list(store: &PlantStore) -> Vec { + store.list() + } + + pub fn remove(store: &PlantStore, id: &str) -> AppResult { + let plant_name = store.read(id, |plant| plant.name.clone())?; + WorkspaceService::delete_plant_registry(&plant_name)?; + store.remove(id) + } + + pub fn close(store: &PlantStore, id: &str) -> AppResult { + let closed = store.update(id, |plant| { + for controller in &mut plant.controllers { + controller.active = false; + controller.runtime_status = ControllerRuntimeStatus::Synced; + } + })?; + WorkspaceService::update_plant_registry(&closed, &closed.name)?; + store.remove(id) + } + + #[allow(clippy::too_many_lines)] + pub fn save_controller_config( + store: &PlantStore, + plugins: &PluginStore, + request: SavePlantControllerConfigRequest, + ) -> AppResult { + let plant_snapshot = store.read(&request.plant_id, |plant| { + let controller_index = plant + .controllers + .iter() + .position(|controller| controller.id == request.controller_id); + let existing_controller = + controller_index.map(|index| plant.controllers[index].clone()); + + ( + plant.connected, + map_current_variables(&plant.variables), + plant.controllers.clone(), + controller_index, + existing_controller, + ) + })?; + let ( + plant_connected, + current_variables, + existing_controllers, + controller_index, + existing_controller, + ) = plant_snapshot; + + let plugin_id = request + .plugin_id + .as_deref() + .filter(|value| !value.trim().is_empty()) + .or_else(|| { + existing_controller + .as_ref() + .map(|controller| controller.plugin_id.as_str()) + }) + .ok_or_else(|| { + AppError::InvalidArgument("Plugin do controlador é obrigatório".into()) + })?; + let plugin = resolve_plugin(plugins, plugin_id, PluginType::Controller)?; + + if plant_connected + && existing_controller + .as_ref() + .is_some_and(|controller| controller.plugin_id != plugin.id) + { + return Err(AppError::InvalidArgument( + "Não é permitido trocar o plugin do controlador com a planta ligada".into(), + )); + } + + let mut controller_request = CreatePlantControllerRequest { + id: Some(request.controller_id.clone()), + plugin_id: plugin.id.clone(), + name: request.name.clone(), + controller_type: request.controller_type.clone(), + active: request.active, + input_variable_ids: request.input_variable_ids.clone(), + output_variable_ids: request.output_variable_ids.clone(), + params: request + .params + .into_iter() + .map(|param| { + ( + param.key, + ControllerParam { + param_type: param.param_type, + value: param.value, + label: param.label, + }, + ) + }) + .collect(), + }; + Self::fill_missing_controller_params(&mut controller_request.params, &plugin); + + validate_controller(&controller_request, ¤t_variables, plugins)?; + + let mut conflict_requests = existing_controllers + .iter() + .enumerate() + .map(|(index, controller)| { + if controller_index == Some(index) { + controller_request.clone() + } else { + CreatePlantControllerRequest { + id: Some(controller.id.clone()), + plugin_id: controller.plugin_id.clone(), + name: controller.name.clone(), + controller_type: controller.controller_type.clone(), + active: controller.active, + input_variable_ids: controller.input_variable_ids.clone(), + output_variable_ids: controller.output_variable_ids.clone(), + params: controller.params.clone(), + } + } + }) + .collect::>(); + + if controller_index.is_none() { + conflict_requests.push(controller_request.clone()); + } + + validate_active_controller_conflicts(&conflict_requests)?; + + let updated = store.update(&request.plant_id, |plant| { + if let Some(controller) = plant + .controllers + .iter_mut() + .find(|controller| controller.id == request.controller_id) + { + controller.plugin_id.clone_from(&plugin.id); + controller.plugin_name.clone_from(&plugin.name); + controller.name = request.name.trim().to_string(); + controller.active = request.active; + controller + .input_variable_ids + .clone_from(&request.input_variable_ids); + controller + .output_variable_ids + .clone_from(&request.output_variable_ids); + controller.controller_type = request.controller_type.trim().to_string(); + controller.params.clone_from(&controller_request.params); + return; + } + + plant.controllers.push(PlantController { + id: request.controller_id.clone(), + plugin_id: plugin.id.clone(), + plugin_name: plugin.name.clone(), + name: request.name.trim().to_string(), + controller_type: request.controller_type.trim().to_string(), + active: request.active, + input_variable_ids: request.input_variable_ids.clone(), + output_variable_ids: request.output_variable_ids.clone(), + params: controller_request.params.clone(), + runtime_status: ControllerRuntimeStatus::Synced, + }); + })?; + + WorkspaceService::update_plant_registry(&updated, &updated.name)?; + Ok(updated) + } + + pub fn remove_controller( + store: &PlantStore, + request: &RemovePlantControllerRequest, + ) -> AppResult { + store.read(&request.plant_id, |plant| { + if plant + .controllers + .iter() + .any(|controller| controller.id == request.controller_id) + { + Ok(()) + } else { + Err(AppError::NotFound(format!( + "Controlador '{}' não encontrado na planta '{}'", + request.controller_id, plant.name + ))) + } + })??; + + let updated = store.update(&request.plant_id, |plant| { + plant + .controllers + .retain(|controller| controller.id != request.controller_id); + })?; + + WorkspaceService::update_plant_registry(&updated, &updated.name)?; + Ok(updated) + } + + pub fn save_setpoint( + store: &PlantStore, + request: &SavePlantSetpointRequest, + ) -> AppResult { + store.read(&request.plant_id, |plant| { + let variable = plant + .variables + .iter() + .find(|variable| variable.id == request.variable_id) + .ok_or_else(|| { + AppError::NotFound(format!( + "Variável '{}' não encontrada na planta '{}'", + request.variable_id, plant.name + )) + })?; + + if variable.var_type != VariableType::Sensor { + return Err(AppError::InvalidArgument( + "Apenas sensores podem ter setpoint editado".into(), + )); + } + + if request.setpoint < variable.pv_min || request.setpoint > variable.pv_max { + return Err(AppError::InvalidArgument( + "Setpoint deve estar entre pv_min e pv_max".into(), + )); + } + + Ok(()) + })??; + + let updated = store.update(&request.plant_id, |plant| { + if let Some(variable) = plant + .variables + .iter_mut() + .find(|variable| variable.id == request.variable_id) + { + variable.setpoint = request.setpoint; + } + })?; + + WorkspaceService::update_plant_registry(&updated, &updated.name)?; + Ok(updated) + } +} + +fn map_current_variables( + variables: &[crate::core::models::plant::PlantVariable], +) -> Vec { + variables + .iter() + .map(|variable| CreatePlantVariableRequest { + name: variable.name.clone(), + var_type: variable.var_type, + unit: variable.unit.clone(), + setpoint: variable.setpoint, + pv_min: variable.pv_min, + pv_max: variable.pv_max, + linked_sensor_ids: variable.linked_sensor_ids.clone(), + }) + .collect() +} + +#[cfg(test)] +mod tests; diff --git a/apps/desktop/src-tauri/src/core/services/plant/builders.rs b/apps/desktop/src-tauri/src/core/services/plant/builders.rs new file mode 100644 index 0000000..e128fb0 --- /dev/null +++ b/apps/desktop/src-tauri/src/core/services/plant/builders.rs @@ -0,0 +1,140 @@ +use super::controller_params::fill_missing_controller_params; +use super::validation::resolve_plugin; +use crate::core::error::AppResult; +use crate::core::models::plant::{ + ControllerRuntimeStatus, CreatePlantControllerRequest, CreatePlantDriverRequest, + CreatePlantRequest, CreatePlantVariableRequest, Plant, PlantController, PlantDriver, + PlantStats, PlantVariable, +}; +use crate::core::models::plugin::{PluginRegistry, PluginType}; +use crate::state::PluginStore; +use uuid::Uuid; + +#[derive(Debug, Clone)] +pub(super) struct PlantRuntimeSnapshot { + pub previous_name: String, + pub previous_sample_time_ms: u64, + pub connected: bool, + pub paused: bool, + pub stats: PlantStats, +} + +#[allow(clippy::cast_precision_loss)] +fn sample_time_seconds(sample_time_ms: u64) -> f64 { + sample_time_ms as f64 / 1000.0 +} + +fn same_sample_time(dt: f64, sample_time_ms: u64) -> bool { + (dt - sample_time_seconds(sample_time_ms)).abs() < f64::EPSILON +} + +pub(super) fn build_plant(request: CreatePlantRequest, plugins: &PluginStore) -> AppResult { + let plant_id = format!("plant_{}", Uuid::new_v4()); + let sample_time_ms = request.sample_time_ms; + let driver_plugin = resolve_plugin(plugins, &request.driver.plugin_id, PluginType::Driver)?; + let variables = build_variables(request.variables); + let controllers = request + .controllers + .into_iter() + .map(|controller| build_controller(controller, plugins)) + .collect::>>()?; + + Ok(Plant { + id: plant_id, + name: request.name.trim().to_string(), + sample_time_ms, + variables, + driver: build_driver(request.driver, &driver_plugin), + controllers, + connected: false, + paused: false, + stats: PlantStats { + dt: sample_time_seconds(sample_time_ms), + uptime: 0, + }, + }) +} + +pub(super) fn build_updated_plant( + request: crate::core::models::plant::UpdatePlantRequest, + plugins: &PluginStore, + runtime: PlantRuntimeSnapshot, +) -> AppResult { + let driver_plugin = resolve_plugin(plugins, &request.driver.plugin_id, PluginType::Driver)?; + let variables = build_variables(request.variables); + let controllers = request + .controllers + .into_iter() + .map(|controller| build_controller(controller, plugins)) + .collect::>>()?; + + let mut stats = runtime.stats; + if !runtime.connected || same_sample_time(stats.dt, runtime.previous_sample_time_ms) { + stats.dt = sample_time_seconds(request.sample_time_ms); + } + + Ok(Plant { + id: request.id, + name: request.name.trim().to_string(), + sample_time_ms: request.sample_time_ms, + variables, + driver: build_driver(request.driver, &driver_plugin), + controllers, + connected: runtime.connected, + paused: runtime.paused, + stats, + }) +} + +fn build_variables(variables: Vec) -> Vec { + variables + .into_iter() + .enumerate() + .map(|(idx, var)| PlantVariable { + id: format!("var_{idx}"), + name: var.name, + var_type: var.var_type, + unit: var.unit, + setpoint: var.setpoint, + pv_min: var.pv_min, + pv_max: var.pv_max, + linked_sensor_ids: var.linked_sensor_ids, + }) + .collect() +} + +fn build_driver(request: CreatePlantDriverRequest, plugin: &PluginRegistry) -> PlantDriver { + PlantDriver { + plugin_id: plugin.id.clone(), + plugin_name: plugin.name.clone(), + runtime: plugin.runtime, + source_file: plugin.source_file.clone(), + source_code: None, + config: request.config, + } +} + +fn build_controller( + request: CreatePlantControllerRequest, + plugins: &PluginStore, +) -> AppResult { + let plugin = resolve_plugin(plugins, &request.plugin_id, PluginType::Controller)?; + let mut params = request.params; + fill_missing_controller_params(&mut params, &plugin); + + Ok(PlantController { + id: request + .id + .filter(|value| !value.trim().is_empty()) + .unwrap_or_else(|| format!("ctrl_{}", Uuid::new_v4().simple())), + plugin_id: plugin.id, + plugin_name: plugin.name, + name: request.name.trim().to_string(), + controller_type: request.controller_type.trim().to_string(), + active: request.active, + input_variable_ids: request.input_variable_ids, + output_variable_ids: request.output_variable_ids, + params, + runtime_status: ControllerRuntimeStatus::Synced, + }) +} diff --git a/apps/desktop/src-tauri/src/core/services/plant/controller_params.rs b/apps/desktop/src-tauri/src/core/services/plant/controller_params.rs new file mode 100644 index 0000000..951af36 --- /dev/null +++ b/apps/desktop/src-tauri/src/core/services/plant/controller_params.rs @@ -0,0 +1,93 @@ +use crate::core::models::plant::{ControllerParam, ControllerParamType}; +use crate::core::models::plugin::{ + PluginRegistry, PluginSchemaField, SchemaFieldType, SchemaFieldValue, +}; +use std::collections::HashMap; + +pub(super) fn fill_missing_controller_params( + params: &mut HashMap, + plugin: &PluginRegistry, +) -> bool { + let mut changed = false; + + for field in &plugin.schema { + if params.contains_key(&field.name) { + continue; + } + + params.insert(field.name.clone(), controller_param_from_schema(field)); + changed = true; + } + + changed +} + +fn controller_param_from_schema(field: &PluginSchemaField) -> ControllerParam { + let label = field + .description + .as_deref() + .map(str::trim) + .filter(|value| !value.is_empty()) + .unwrap_or(field.name.as_str()) + .to_string(); + + match field.field_type { + SchemaFieldType::Bool => ControllerParam { + param_type: ControllerParamType::Boolean, + value: match field.default_value.clone() { + Some(SchemaFieldValue::Bool(value)) => SchemaFieldValue::Bool(value), + _ => SchemaFieldValue::Bool(false), + }, + label, + }, + SchemaFieldType::Int => ControllerParam { + param_type: ControllerParamType::Number, + value: match field.default_value.clone() { + Some(SchemaFieldValue::Int(value)) => SchemaFieldValue::Int(value), + Some(SchemaFieldValue::Float(value)) => SchemaFieldValue::Float(value), + _ => SchemaFieldValue::Int(0), + }, + label, + }, + SchemaFieldType::Float => ControllerParam { + param_type: ControllerParamType::Number, + value: match field.default_value.clone() { + Some(SchemaFieldValue::Float(value)) => SchemaFieldValue::Float(value), + Some(SchemaFieldValue::Int(value)) => SchemaFieldValue::Int(value), + _ => SchemaFieldValue::Float(0.0), + }, + label, + }, + SchemaFieldType::String => ControllerParam { + param_type: ControllerParamType::String, + value: match field.default_value.clone() { + Some(SchemaFieldValue::String(value)) => SchemaFieldValue::String(value), + Some(other) => SchemaFieldValue::String(stringify_schema_value(&other)), + None => SchemaFieldValue::String(String::new()), + }, + label, + }, + SchemaFieldType::List => ControllerParam { + param_type: ControllerParamType::String, + value: match field.default_value.clone() { + Some(other) => SchemaFieldValue::String(stringify_schema_value(&other)), + None => SchemaFieldValue::String(String::new()), + }, + label, + }, + } +} + +fn stringify_schema_value(value: &SchemaFieldValue) -> String { + match value { + SchemaFieldValue::Bool(value) => value.to_string(), + SchemaFieldValue::Int(value) => value.to_string(), + SchemaFieldValue::Float(value) => value.to_string(), + SchemaFieldValue::String(value) => value.clone(), + SchemaFieldValue::List(values) => values + .iter() + .map(stringify_schema_value) + .collect::>() + .join(", "), + } +} diff --git a/apps/desktop/src-tauri/src/core/services/plant/tests.rs b/apps/desktop/src-tauri/src/core/services/plant/tests.rs new file mode 100644 index 0000000..a69c329 --- /dev/null +++ b/apps/desktop/src-tauri/src/core/services/plant/tests.rs @@ -0,0 +1,504 @@ +use super::*; +use crate::core::models::plant::{ControllerParam, ControllerParamType, VariableType}; +use crate::core::models::plugin::{ + PluginRuntime, PluginSchemaField, SchemaFieldType, SchemaFieldValue, +}; +use crate::core::services::workspace::test_workspace_root; +use crate::state::PluginStore; +use std::collections::HashMap; +use std::path::PathBuf; + +fn create_test_variable(name: &str) -> CreatePlantVariableRequest { + CreatePlantVariableRequest { + name: name.to_string(), + var_type: VariableType::Sensor, + unit: "C".to_string(), + setpoint: 50.0, + pv_min: 0.0, + pv_max: 100.0, + linked_sensor_ids: None, + } +} + +fn create_plugin_store() -> PluginStore { + let store = PluginStore::new(); + + store + .insert(PluginRegistry { + id: "driver_plugin".to_string(), + name: "Driver Python".to_string(), + plugin_type: PluginType::Driver, + runtime: PluginRuntime::Python, + entry_class: "Driver".to_string(), + schema: vec![], + source_file: Some("driver.py".to_string()), + source_code: Some("class Driver:\n pass".to_string()), + dependencies: vec![], + description: None, + version: None, + author: None, + }) + .unwrap(); + + store + .insert(PluginRegistry { + id: "controller_plugin".to_string(), + name: "PID".to_string(), + plugin_type: PluginType::Controller, + runtime: PluginRuntime::Python, + entry_class: "Controller".to_string(), + schema: vec![], + source_file: Some("controller.py".to_string()), + source_code: Some("class Controller:\n pass".to_string()), + dependencies: vec![], + description: None, + version: None, + author: None, + }) + .unwrap(); + + store +} + +#[test] +fn test_fill_missing_controller_params_uses_schema_defaults() { + let plugin = PluginRegistry { + id: "controller_plugin".to_string(), + name: "TCLAB Controller".to_string(), + plugin_type: PluginType::Controller, + runtime: PluginRuntime::Python, + entry_class: "TclabController".to_string(), + schema: vec![PluginSchemaField { + name: "open_duty_1".to_string(), + field_type: SchemaFieldType::Float, + default_value: Some(SchemaFieldValue::Float(37.5)), + description: Some("Open duty 1".to_string()), + }], + source_file: Some("main.py".to_string()), + source_code: None, + dependencies: vec![], + description: None, + version: None, + author: None, + }; + let mut params = HashMap::new(); + + let changed = PlantService::fill_missing_controller_params(&mut params, &plugin); + + assert!(changed); + let param = params.get("open_duty_1").expect("parametro ausente"); + assert_eq!(param.param_type, ControllerParamType::Number); + assert_eq!(param.label, "Open duty 1"); + match ¶m.value { + SchemaFieldValue::Float(value) => assert!((*value - 37.5).abs() < f64::EPSILON), + other => panic!("valor inesperado para parametro default: {other:?}"), + } +} + +fn create_valid_request(name: &str) -> CreatePlantRequest { + CreatePlantRequest { + name: name.to_string(), + sample_time_ms: 100, + variables: vec![create_test_variable("Temperatura")], + driver: crate::core::models::plant::CreatePlantDriverRequest { + plugin_id: "driver_plugin".to_string(), + config: HashMap::new(), + }, + controllers: vec![], + } +} + +fn plant_registry_path(name: &str) -> PathBuf { + test_workspace_root() + .join("plants") + .join(name) + .join("registry.json") +} + +#[test] +fn test_create_plant_success() { + let store = PlantStore::new(); + let plugins = create_plugin_store(); + let request = create_valid_request("Planta 1"); + + let result = PlantService::create(&store, &plugins, request); + assert!(result.is_ok()); + + let plant = result.unwrap(); + assert_eq!(plant.name, "Planta 1"); + assert_eq!(plant.sample_time_ms, 100); + assert_eq!(plant.variables.len(), 1); + assert_eq!(plant.driver.plugin_id, "driver_plugin"); + assert!(!plant.connected); + assert!(!plant.paused); + assert!(store.exists(&plant.id)); +} + +#[test] +fn test_update_plant_success() { + let store = PlantStore::new(); + let plugins = create_plugin_store(); + let created = PlantService::create(&store, &plugins, create_valid_request("Planta 1")).unwrap(); + + let updated = PlantService::update( + &store, + &plugins, + UpdatePlantRequest { + id: created.id.clone(), + name: "Planta Atualizada".to_string(), + sample_time_ms: 200, + variables: vec![create_test_variable("Nova Variável")], + driver: crate::core::models::plant::CreatePlantDriverRequest { + plugin_id: "driver_plugin".to_string(), + config: HashMap::new(), + }, + controllers: vec![], + }, + ) + .unwrap(); + + assert_eq!(updated.name, "Planta Atualizada"); + assert_eq!(updated.sample_time_ms, 200); + assert_eq!(updated.variables[0].name, "Nova Variável"); +} + +#[test] +fn test_create_plant_empty_name() { + let store = PlantStore::new(); + let plugins = create_plugin_store(); + let request = CreatePlantRequest { + name: String::new(), + sample_time_ms: 100, + variables: vec![create_test_variable("Temperatura")], + driver: crate::core::models::plant::CreatePlantDriverRequest { + plugin_id: "driver_plugin".to_string(), + config: HashMap::new(), + }, + controllers: vec![], + }; + + let result = PlantService::create(&store, &plugins, request); + assert!(result.is_err()); + assert_eq!(store.count(), 0); +} + +#[test] +fn test_create_plant_whitespace_name() { + let store = PlantStore::new(); + let plugins = create_plugin_store(); + let request = CreatePlantRequest { + name: " ".to_string(), + sample_time_ms: 100, + variables: vec![create_test_variable("Temperatura")], + driver: crate::core::models::plant::CreatePlantDriverRequest { + plugin_id: "driver_plugin".to_string(), + config: HashMap::new(), + }, + controllers: vec![], + }; + + let result = PlantService::create(&store, &plugins, request); + assert!(result.is_err()); +} + +#[test] +fn test_create_plant_no_variables() { + let store = PlantStore::new(); + let plugins = create_plugin_store(); + let request = CreatePlantRequest { + name: "Planta 1".to_string(), + sample_time_ms: 100, + variables: vec![], + driver: crate::core::models::plant::CreatePlantDriverRequest { + plugin_id: "driver_plugin".to_string(), + config: HashMap::new(), + }, + controllers: vec![], + }; + + let result = PlantService::create(&store, &plugins, request); + assert!(result.is_err()); +} + +#[test] +fn test_create_plant_invalid_pv_range() { + let store = PlantStore::new(); + let plugins = create_plugin_store(); + let mut var = create_test_variable("Temp"); + var.pv_min = 100.0; + var.pv_max = 0.0; + + let request = CreatePlantRequest { + name: "Planta 1".to_string(), + sample_time_ms: 100, + variables: vec![var], + driver: crate::core::models::plant::CreatePlantDriverRequest { + plugin_id: "driver_plugin".to_string(), + config: HashMap::new(), + }, + controllers: vec![], + }; + + let result = PlantService::create(&store, &plugins, request); + assert!(result.is_err()); +} + +#[test] +fn test_create_plant_invalid_setpoint() { + let store = PlantStore::new(); + let plugins = create_plugin_store(); + let mut var = create_test_variable("Temp"); + var.setpoint = 150.0; + + let request = CreatePlantRequest { + name: "Planta 1".to_string(), + sample_time_ms: 100, + variables: vec![var], + driver: crate::core::models::plant::CreatePlantDriverRequest { + plugin_id: "driver_plugin".to_string(), + config: HashMap::new(), + }, + controllers: vec![], + }; + + let result = PlantService::create(&store, &plugins, request); + assert!(result.is_err()); +} + +#[test] +fn test_create_plant_multiple_variables() { + let store = PlantStore::new(); + let plugins = create_plugin_store(); + let var1 = create_test_variable("Temperatura"); + let mut var2 = create_test_variable("Umidade"); + var2.unit = "%".to_string(); + var2.var_type = VariableType::Atuador; + var2.setpoint = 0.0; + + let request = CreatePlantRequest { + name: "Planta Complexa".to_string(), + sample_time_ms: 250, + variables: vec![var1, var2], + driver: crate::core::models::plant::CreatePlantDriverRequest { + plugin_id: "driver_plugin".to_string(), + config: HashMap::new(), + }, + controllers: vec![CreatePlantControllerRequest { + id: Some("ctrl_1".to_string()), + plugin_id: "controller_plugin".to_string(), + name: "PID 1".to_string(), + controller_type: "PID".to_string(), + active: true, + input_variable_ids: vec!["var_0".to_string()], + output_variable_ids: vec!["var_1".to_string()], + params: HashMap::from([( + "kp".to_string(), + ControllerParam { + param_type: ControllerParamType::Number, + value: SchemaFieldValue::Float(1.0), + label: "Kp".to_string(), + }, + )]), + }], + }; + + let result = PlantService::create(&store, &plugins, request); + assert!(result.is_ok()); + + let plant = result.unwrap(); + assert_eq!(plant.variables.len(), 2); + assert_eq!(plant.variables[0].id, "var_0"); + assert_eq!(plant.variables[1].id, "var_1"); + assert_eq!(plant.sample_time_ms, 250); + assert_eq!(plant.driver.plugin_id, "driver_plugin"); + assert_eq!(plant.controllers.len(), 1); + assert!(plant.controllers[0].active); +} + +#[test] +fn test_create_plant_preserves_controller_active_flag() { + let store = PlantStore::new(); + let plugins = create_plugin_store(); + let var1 = create_test_variable("Temperatura"); + let mut var2 = create_test_variable("Valvula A"); + var2.var_type = VariableType::Atuador; + var2.setpoint = 0.0; + + let request = CreatePlantRequest { + name: "Planta Com Conflito".to_string(), + sample_time_ms: 250, + variables: vec![var1, var2], + driver: crate::core::models::plant::CreatePlantDriverRequest { + plugin_id: "driver_plugin".to_string(), + config: HashMap::new(), + }, + controllers: vec![ + CreatePlantControllerRequest { + id: Some("ctrl_1".to_string()), + plugin_id: "controller_plugin".to_string(), + name: "PID 1".to_string(), + controller_type: "PID".to_string(), + active: true, + input_variable_ids: vec!["var_0".to_string()], + output_variable_ids: vec!["var_1".to_string()], + params: HashMap::new(), + }, + CreatePlantControllerRequest { + id: Some("ctrl_2".to_string()), + plugin_id: "controller_plugin".to_string(), + name: "PID 2".to_string(), + controller_type: "PID".to_string(), + active: true, + input_variable_ids: vec!["var_0".to_string()], + output_variable_ids: vec!["var_1".to_string()], + params: HashMap::new(), + }, + ], + }; + + let result = PlantService::create(&store, &plugins, request); + assert!(result.is_ok()); + + let plant = result.unwrap(); + assert_eq!(plant.controllers.len(), 2); + assert!(plant.controllers.iter().all(|controller| controller.active)); +} + +#[test] +fn test_create_plant_duplicate_name() { + let store = PlantStore::new(); + let plugins = create_plugin_store(); + + let request1 = create_valid_request("Mesma Planta"); + PlantService::create(&store, &plugins, request1).unwrap(); + + let request2 = create_valid_request("Mesma Planta"); + let result = PlantService::create(&store, &plugins, request2); + assert!(result.is_err()); + assert_eq!(store.count(), 1); +} + +#[test] +fn test_create_plant_invalid_sample_time() { + let store = PlantStore::new(); + let plugins = create_plugin_store(); + let request = CreatePlantRequest { + name: "Planta 1".to_string(), + sample_time_ms: 0, + variables: vec![create_test_variable("Temperatura")], + driver: crate::core::models::plant::CreatePlantDriverRequest { + plugin_id: "driver_plugin".to_string(), + config: HashMap::new(), + }, + controllers: vec![], + }; + + let result = PlantService::create(&store, &plugins, request); + assert!(result.is_err()); +} + +#[test] +fn test_get_plant() { + let store = PlantStore::new(); + let plugins = create_plugin_store(); + let request = create_valid_request("Test Get"); + let created = PlantService::create(&store, &plugins, request).unwrap(); + + let found = PlantService::get(&store, &created.id).unwrap(); + assert_eq!(found.name, "Test Get"); +} + +#[test] +fn test_get_plant_not_found() { + let store = PlantStore::new(); + let result = PlantService::get(&store, "invalid_id"); + assert!(result.is_err()); +} + +#[test] +fn test_list_plants() { + let store = PlantStore::new(); + let plugins = create_plugin_store(); + + PlantService::create(&store, &plugins, create_valid_request("Plant A")).unwrap(); + PlantService::create(&store, &plugins, create_valid_request("Plant B")).unwrap(); + + let plants = PlantService::list(&store); + assert_eq!(plants.len(), 2); +} + +#[test] +fn test_remove_plant() { + let store = PlantStore::new(); + let plugins = create_plugin_store(); + let request = create_valid_request("To Remove"); + let plant = PlantService::create(&store, &plugins, request).unwrap(); + let registry_path = plant_registry_path(&plant.name); + + assert_eq!(store.count(), 1); + assert!(registry_path.exists()); + + let removed = PlantService::remove(&store, &plant.id).unwrap(); + assert_eq!(removed.name, "To Remove"); + assert_eq!(store.count(), 0); + assert!(!registry_path.exists()); +} + +#[test] +fn test_close_plant_unloads_but_preserves_registry() { + let store = PlantStore::new(); + let plugins = create_plugin_store(); + let request = create_valid_request("To Close"); + let plant = PlantService::create(&store, &plugins, request).unwrap(); + let plant = store + .update(&plant.id, |plant| { + plant.controllers.push(PlantController { + id: "ctrl_close".to_string(), + plugin_id: "controller_plugin".to_string(), + plugin_name: "PID".to_string(), + name: "Controller Close".to_string(), + controller_type: "PID".to_string(), + active: true, + input_variable_ids: vec!["var_0".to_string()], + output_variable_ids: vec!["var_0".to_string()], + params: HashMap::new(), + runtime_status: ControllerRuntimeStatus::Synced, + }); + }) + .unwrap(); + WorkspaceService::update_plant_registry(&plant, &plant.name).unwrap(); + let registry_path = plant_registry_path(&plant.name); + + assert!(registry_path.exists()); + + let closed = PlantService::close(&store, &plant.id).unwrap(); + assert_eq!(closed.name, "To Close"); + assert!(closed + .controllers + .iter() + .all(|controller| !controller.active)); + assert_eq!(store.count(), 0); + assert!(registry_path.exists()); + + let registry_contents = std::fs::read_to_string(®istry_path).unwrap(); + let persisted: serde_json::Value = serde_json::from_str(®istry_contents).unwrap(); + let controllers = persisted + .get("controllers") + .and_then(serde_json::Value::as_array) + .cloned() + .unwrap_or_default(); + assert_eq!(controllers.len(), 1); + assert_eq!( + controllers[0] + .get("active") + .and_then(serde_json::Value::as_bool), + Some(false) + ); +} + +#[test] +fn test_remove_plant_not_found() { + let store = PlantStore::new(); + let result = PlantService::remove(&store, "invalid_id"); + assert!(result.is_err()); +} diff --git a/apps/desktop/src-tauri/src/core/services/plant/validation.rs b/apps/desktop/src-tauri/src/core/services/plant/validation.rs new file mode 100644 index 0000000..cb2aaba --- /dev/null +++ b/apps/desktop/src-tauri/src/core/services/plant/validation.rs @@ -0,0 +1,215 @@ +use crate::core::error::{AppError, AppResult}; +use crate::core::models::plant::{ + CreatePlantControllerRequest, CreatePlantDriverRequest, CreatePlantVariableRequest, + VariableType, +}; +use crate::core::models::plugin::{PluginRegistry, PluginType}; +use crate::state::{PlantStore, PluginStore}; +use std::collections::HashMap; + +#[allow(clippy::too_many_arguments)] +pub(super) fn validate_payload( + current_id: Option<&str>, + name: &str, + sample_time_ms: u64, + variables: &[CreatePlantVariableRequest], + driver: &CreatePlantDriverRequest, + controllers: &[CreatePlantControllerRequest], + store: &PlantStore, + plugins: &PluginStore, +) -> AppResult<()> { + if name.trim().is_empty() { + return Err(AppError::InvalidArgument( + "Nome da planta é obrigatório".into(), + )); + } + + let has_duplicate_name = current_id.map_or_else( + || store.exists_by_name(name), + |id| store.exists_by_name_except(id, name), + ); + + if has_duplicate_name { + return Err(AppError::InvalidArgument(format!( + "Planta com NOME '{name}' já existe" + ))); + } + + if variables.is_empty() { + return Err(AppError::InvalidArgument( + "Pelo menos uma variável deve ser definida".into(), + )); + } + + if sample_time_ms == 0 { + return Err(AppError::InvalidArgument( + "Tempo de amostragem deve ser maior que 0 ms".into(), + )); + } + + if driver.plugin_id.trim().is_empty() { + return Err(AppError::InvalidArgument( + "Um driver de comunicação é obrigatório".into(), + )); + } + + resolve_plugin(plugins, &driver.plugin_id, PluginType::Driver)?; + + for (idx, var) in variables.iter().enumerate() { + validate_variable(var).map_err(|error| { + AppError::InvalidArgument(format!("Variável {} inválida: {}", idx + 1, error)) + })?; + } + + for (idx, controller) in controllers.iter().enumerate() { + validate_controller(controller, variables, plugins).map_err(|error| { + AppError::InvalidArgument(format!("Controlador {} inválido: {}", idx + 1, error)) + })?; + } + + Ok(()) +} + +pub(super) fn validate_variable(var: &CreatePlantVariableRequest) -> AppResult<()> { + if var.name.trim().is_empty() { + return Err(AppError::InvalidArgument( + "Nome da variável é obrigatório".into(), + )); + } + + if var.pv_min >= var.pv_max { + return Err(AppError::InvalidArgument( + "pv_min deve ser menor que pv_max".into(), + )); + } + + if var.setpoint < var.pv_min || var.setpoint > var.pv_max { + return Err(AppError::InvalidArgument( + "setpoint deve estar entre pv_min e pv_max".into(), + )); + } + + Ok(()) +} + +pub(super) fn validate_controller( + controller: &CreatePlantControllerRequest, + variables: &[CreatePlantVariableRequest], + plugins: &PluginStore, +) -> AppResult<()> { + if controller.plugin_id.trim().is_empty() { + return Err(AppError::InvalidArgument( + "Plugin do controlador é obrigatório".into(), + )); + } + + if controller.name.trim().is_empty() { + return Err(AppError::InvalidArgument( + "Nome do controlador é obrigatório".into(), + )); + } + + if controller.controller_type.trim().is_empty() { + return Err(AppError::InvalidArgument( + "Tipo do controlador é obrigatório".into(), + )); + } + + if controller.input_variable_ids.is_empty() { + return Err(AppError::InvalidArgument( + "O controlador precisa de pelo menos uma variável de entrada".into(), + )); + } + + if controller.output_variable_ids.is_empty() { + return Err(AppError::InvalidArgument( + "O controlador precisa de pelo menos uma variável de saída".into(), + )); + } + + let variable_types = build_variable_type_map(variables); + + for input_id in &controller.input_variable_ids { + match variable_types.get(input_id) { + Some(VariableType::Sensor) => {} + Some(VariableType::Atuador) => { + return Err(AppError::InvalidArgument(format!( + "A variável '{input_id}' não pode ser usada como entrada" + ))); + } + None => { + return Err(AppError::InvalidArgument(format!( + "Variável de entrada '{input_id}' não existe" + ))); + } + } + } + + for output_id in &controller.output_variable_ids { + match variable_types.get(output_id) { + Some(VariableType::Atuador) => {} + Some(VariableType::Sensor) => { + return Err(AppError::InvalidArgument(format!( + "A variável '{output_id}' não pode ser usada como saída" + ))); + } + None => { + return Err(AppError::InvalidArgument(format!( + "Variável de saída '{output_id}' não existe" + ))); + } + } + } + + resolve_plugin(plugins, &controller.plugin_id, PluginType::Controller)?; + Ok(()) +} + +pub(super) fn validate_active_controller_conflicts( + controllers: &[CreatePlantControllerRequest], +) -> AppResult<()> { + let mut ownership: HashMap<&str, &str> = HashMap::new(); + + for controller in controllers.iter().filter(|controller| controller.active) { + for output_id in &controller.output_variable_ids { + if let Some(existing_controller) = + ownership.insert(output_id.as_str(), controller.name.trim()) + { + return Err(AppError::InvalidArgument(format!( + "A saída '{}' não pode ser controlada ao mesmo tempo por '{}' e '{}'", + output_id, existing_controller, controller.name + ))); + } + } + } + + Ok(()) +} + +pub(super) fn resolve_plugin( + plugins: &PluginStore, + plugin_id: &str, + expected_type: PluginType, +) -> AppResult { + plugins.read(plugin_id, |plugin| { + if plugin.plugin_type == expected_type { + Ok(plugin.clone()) + } else { + Err(AppError::InvalidArgument(format!( + "Plugin '{}' não é do tipo {}", + plugin.name, + expected_type.as_label() + ))) + } + })? +} + +fn build_variable_type_map( + variables: &[CreatePlantVariableRequest], +) -> HashMap { + variables + .iter() + .enumerate() + .map(|(idx, variable)| (format!("var_{idx}"), variable.var_type)) + .collect() +} diff --git a/apps/desktop/src-tauri/src/core/services/plant_import.rs b/apps/desktop/src-tauri/src/core/services/plant_import.rs new file mode 100644 index 0000000..7a565bf --- /dev/null +++ b/apps/desktop/src-tauri/src/core/services/plant_import.rs @@ -0,0 +1,1218 @@ +use crate::core::error::{AppError, AppResult}; +use crate::core::models::plant::{ + ControllerParam, CreatePlantControllerRequest, CreatePlantDriverRequest, CreatePlantRequest, + CreatePlantVariableRequest, PlantResponse, PlantStats, PlantVariable, VariableType, +}; +use crate::core::models::plugin::{PluginType, SchemaFieldValue}; +use crate::core::services::plant::PlantService; +use crate::core::services::plugin::PluginService; +use crate::state::{PlantStore, PluginStore}; +use serde::Serialize; +use serde_json::Value; +use std::collections::HashMap; + +#[derive(Debug, Clone)] +pub struct PlantImportFileRequest { + pub file_name: String, + pub content: String, +} + +#[derive(Debug, Clone, Serialize)] +pub struct ImportedVariableStatsResponse { + pub error_avg: f64, + pub stability: f64, + pub ripple: f64, +} + +#[derive(Debug, Clone, Serialize)] +pub struct ImportedSeriesDescriptorResponse { + pub key: String, + pub label: String, + pub role: String, +} + +#[derive(Debug, Clone, Serialize)] +pub struct ImportedSeriesCatalogResponse { + pub plant_id: String, + pub series: Vec, +} + +#[derive(Debug, Clone, Serialize)] +pub struct ImportedWorkspaceDriverResponse { + pub plugin_id: String, + pub plugin_name: String, + pub config: HashMap, +} + +#[derive(Debug, Clone, Serialize)] +pub struct ImportedWorkspaceControllerResponse { + pub id: String, + pub plugin_id: String, + pub plugin_name: String, + pub name: String, + pub controller_type: String, + pub active: bool, + pub input_variable_ids: Vec, + pub output_variable_ids: Vec, + pub params: HashMap, +} + +#[derive(Debug, Clone, Serialize)] +pub struct ImportedWorkspacePlantResponse { + pub id: String, + pub name: String, + pub sample_time_ms: u64, + pub connected: bool, + pub paused: bool, + pub variables: Vec, + pub stats: PlantStats, + #[serde(skip_serializing_if = "Option::is_none")] + pub driver: Option, + #[serde(default)] + pub controllers: Vec, +} + +#[derive(Debug, Clone, Serialize)] +pub struct OpenPlantFileResponse { + pub plant: ImportedWorkspacePlantResponse, + pub data: Vec>, + pub stats: PlantStats, + pub variable_stats: Vec, + pub series_catalog: ImportedSeriesCatalogResponse, +} + +#[derive(Debug, Clone, Serialize)] +pub struct ImportPlantFileResponse { + pub plant: PlantResponse, + pub data: Vec>, + pub stats: PlantStats, + pub variable_stats: Vec, + pub series_catalog: ImportedSeriesCatalogResponse, +} + +pub struct PlantImportService; + +impl PlantImportService { + #[allow(clippy::needless_pass_by_value, clippy::too_many_lines)] + pub fn open_file(request: PlantImportFileRequest) -> AppResult { + let parsed: Value = serde_json::from_str(&request.content) + .map_err(|error| invalid_argument(format!("JSON inválido: {error}")))?; + + let root = expect_object(&parsed, "Arquivo")?; + if root.get("variables").is_some() { + return open_registry_plant_file(root, &request); + } + + let meta = resolve_meta(root)?; + let sensors = expect_array( + root.get("sensors") + .ok_or_else(|| invalid_argument("Campo \"sensors\" ausente"))?, + "sensors", + )?; + let actuators = expect_array( + root.get("actuators") + .ok_or_else(|| invalid_argument("Campo \"actuators\" ausente"))?, + "actuators", + )?; + let setpoints = expect_array( + root.get("setpoints") + .ok_or_else(|| invalid_argument("Campo \"setpoints\" ausente"))?, + "setpoints", + )?; + let data = expect_array( + root.get("data") + .ok_or_else(|| invalid_argument("Campo \"data\" ausente"))?, + "data", + )?; + + if data.is_empty() { + return Err(invalid_argument("Campo \"data\" está vazio")); + } + + let mut variables = Vec::new(); + let mut sensor_index_by_export_id = HashMap::new(); + + for (index, sensor) in sensors.iter().enumerate() { + let sensor_obj = expect_object(sensor, &format!("sensors[{index}]"))?; + let sensor_id = expect_string(sensor_obj.get("id"), &format!("sensors[{index}].id"))?; + let name = expect_string(sensor_obj.get("name"), &format!("sensors[{index}].name"))?; + let unit = sensor_obj + .get("unit") + .and_then(Value::as_str) + .unwrap_or("%") + .to_string(); + + sensor_index_by_export_id.insert(sensor_id, index); + variables.push(PlantVariable { + id: format!("var_{index}"), + name, + var_type: VariableType::Sensor, + unit, + setpoint: 0.0, + pv_min: 0.0, + pv_max: 100.0, + linked_sensor_ids: None, + }); + } + + let actuators_offset = variables.len(); + let mut actuator_index_by_export_id = HashMap::new(); + + for (index, actuator) in actuators.iter().enumerate() { + let actuator_obj = expect_object(actuator, &format!("actuators[{index}]"))?; + let actuator_id = + expect_string(actuator_obj.get("id"), &format!("actuators[{index}].id"))?; + let name = expect_string( + actuator_obj.get("name"), + &format!("actuators[{index}].name"), + )?; + let unit = actuator_obj + .get("unit") + .and_then(Value::as_str) + .unwrap_or("%") + .to_string(); + let linked_sensor_ids = actuator_obj + .get("linkedSensorIds") + .and_then(Value::as_array) + .map(|items| { + items + .iter() + .filter_map(Value::as_str) + .map(|sensor_id| { + sensor_index_by_export_id.get(sensor_id).map_or_else( + || sensor_id.to_string(), + |sensor_index| format!("var_{sensor_index}"), + ) + }) + .collect::>() + }); + + let variable_index = actuators_offset + index; + actuator_index_by_export_id.insert(actuator_id, variable_index); + variables.push(PlantVariable { + id: format!("var_{variable_index}"), + name, + var_type: VariableType::Atuador, + unit, + setpoint: 0.0, + pv_min: 0.0, + pv_max: 100.0, + linked_sensor_ids, + }); + } + + let mut setpoint_sensor_map = HashMap::new(); + for (index, setpoint) in setpoints.iter().enumerate() { + let setpoint_obj = expect_object(setpoint, &format!("setpoints[{index}]"))?; + let setpoint_id = + expect_string(setpoint_obj.get("id"), &format!("setpoints[{index}].id"))?; + let sensor_id = expect_string( + setpoint_obj.get("sensorId"), + &format!("setpoints[{index}].sensorId"), + )?; + setpoint_sensor_map.insert(setpoint_id, sensor_id); + } + + let mut points = Vec::with_capacity(data.len()); + for (sample_index, sample) in data.iter().enumerate() { + let sample_obj = expect_object(sample, &format!("data[{sample_index}]"))?; + let mut point = HashMap::new(); + point.insert( + "time".into(), + expect_number( + sample_obj.get("time"), + &format!("data[{sample_index}].time"), + )?, + ); + + let sensors_record = expect_object( + sample_obj.get("sensors").ok_or_else(|| { + invalid_argument(format!("data[{sample_index}].sensors ausente")) + })?, + &format!("data[{sample_index}].sensors"), + )?; + for (sensor_id, value) in sensors_record { + if let Some(variable_index) = sensor_index_by_export_id.get(sensor_id) { + point.insert( + format!("var_{variable_index}_pv"), + value.as_f64().unwrap_or(0.0), + ); + } + } + + let setpoints_record = expect_object( + sample_obj.get("setpoints").ok_or_else(|| { + invalid_argument(format!("data[{sample_index}].setpoints ausente")) + })?, + &format!("data[{sample_index}].setpoints"), + )?; + for (setpoint_id, value) in setpoints_record { + let Some(sensor_id) = setpoint_sensor_map.get(setpoint_id) else { + continue; + }; + let Some(variable_index) = sensor_index_by_export_id.get(sensor_id) else { + continue; + }; + point.insert( + format!("var_{variable_index}_sp"), + value.as_f64().unwrap_or(0.0), + ); + } + + let actuators_record = expect_object( + sample_obj.get("actuators").ok_or_else(|| { + invalid_argument(format!("data[{sample_index}].actuators ausente")) + })?, + &format!("data[{sample_index}].actuators"), + )?; + for (actuator_id, value) in actuators_record { + if let Some(variable_index) = actuator_index_by_export_id.get(actuator_id) { + point.insert( + format!("var_{variable_index}_pv"), + value.as_f64().unwrap_or(0.0), + ); + } + } + + points.push(point); + } + + let stats = compute_imported_plant_stats(&points); + let name = meta + .get("name") + .and_then(Value::as_str) + .filter(|value| !value.trim().is_empty()) + .unwrap_or(request.file_name.as_str()) + .to_string(); + let sample_time_ms = meta + .get("sampleTimeMs") + .and_then(Value::as_u64) + .unwrap_or_else(|| { + if stats.dt > 0.0 { + rounded_non_negative_to_u64(stats.dt * 1000.0) + } else { + 100 + } + }); + let plant_id = format!("imported_{}", uuid::Uuid::new_v4().simple()); + let variable_stats = variables + .iter() + .enumerate() + .map(|(index, variable)| compute_imported_variable_stats(&points, index, variable)) + .collect::>(); + let series_catalog = build_imported_series_catalog(&plant_id, &variables); + + Ok(OpenPlantFileResponse { + plant: ImportedWorkspacePlantResponse { + id: plant_id, + name, + sample_time_ms, + connected: false, + paused: false, + variables, + stats: stats.clone(), + driver: None, + controllers: vec![], + }, + data: points, + stats, + variable_stats, + series_catalog, + }) + } + + pub fn import_file( + plants: &PlantStore, + plugins: &PluginStore, + request: PlantImportFileRequest, + ) -> AppResult { + let OpenPlantFileResponse { + plant: imported_plant, + data, + stats, + variable_stats, + series_catalog, + } = Self::open_file(request)?; + + PluginService::load_all(plugins)?; + + let driver = resolve_imported_driver_request(plugins, imported_plant.driver.as_ref())?; + let controllers = + resolve_imported_controller_requests(plugins, &imported_plant.controllers)?; + let variables = imported_plant + .variables + .iter() + .map(map_imported_variable_to_create_request) + .collect::>(); + + let created = PlantService::create( + plants, + plugins, + CreatePlantRequest { + name: imported_plant.name, + sample_time_ms: imported_plant.sample_time_ms, + variables, + driver, + controllers, + }, + )?; + + Ok(ImportPlantFileResponse { + plant: created.into(), + data, + stats, + variable_stats, + series_catalog, + }) + } +} + +fn invalid_argument(message: impl Into) -> AppError { + AppError::InvalidArgument(message.into()) +} + +fn expect_object<'a>( + value: &'a Value, + context: &str, +) -> AppResult<&'a serde_json::Map> { + value + .as_object() + .ok_or_else(|| invalid_argument(format!("{context} deve ser um objeto"))) +} + +fn expect_array<'a>(value: &'a Value, context: &str) -> AppResult<&'a Vec> { + value + .as_array() + .ok_or_else(|| invalid_argument(format!("{context} deve ser um array"))) +} + +fn resolve_meta( + root: &serde_json::Map, +) -> AppResult<&serde_json::Map> { + match root.get("meta") { + Some(value) => expect_object(value, "meta"), + None => Ok(root), + } +} + +fn expect_string(value: Option<&Value>, context: &str) -> AppResult { + value + .and_then(Value::as_str) + .map(str::to_string) + .ok_or_else(|| invalid_argument(format!("{context} deve ser uma string"))) +} + +fn expect_number(value: Option<&Value>, context: &str) -> AppResult { + value + .and_then(Value::as_f64) + .ok_or_else(|| invalid_argument(format!("{context} deve ser um número"))) +} + +fn get_value_by_keys<'a>( + object: &'a serde_json::Map, + keys: &[&str], +) -> Option<&'a Value> { + keys.iter().find_map(|key| object.get(*key)) +} + +fn parse_variable_type(value: &str) -> AppResult { + match value.trim().to_lowercase().as_str() { + "sensor" => Ok(VariableType::Sensor), + "atuador" | "actuator" => Ok(VariableType::Atuador), + _ => Err(invalid_argument( + "variables.type deve ser \"sensor\" ou \"atuador\"", + )), + } +} + +fn parse_registry_variable(value: &Value, index: usize) -> AppResult { + let variable_obj = expect_object(value, &format!("variables[{index}]"))?; + let id = variable_obj + .get("id") + .and_then(Value::as_str) + .map(str::trim) + .filter(|entry| !entry.is_empty()) + .map_or_else(|| format!("var_{index}"), str::to_string); + let name = expect_string( + variable_obj.get("name"), + &format!("variables[{index}].name"), + )?; + let type_label = variable_obj + .get("type") + .and_then(Value::as_str) + .ok_or_else(|| invalid_argument(format!("variables[{index}].type deve ser string")))?; + let var_type = parse_variable_type(type_label)?; + let unit = variable_obj + .get("unit") + .and_then(Value::as_str) + .unwrap_or("%") + .to_string(); + let setpoint = variable_obj + .get("setpoint") + .and_then(Value::as_f64) + .unwrap_or(0.0); + let pv_min = get_value_by_keys(variable_obj, &["pv_min", "pvMin"]) + .and_then(Value::as_f64) + .unwrap_or(0.0); + let pv_max = get_value_by_keys(variable_obj, &["pv_max", "pvMax"]) + .and_then(Value::as_f64) + .unwrap_or(100.0); + let linked_sensor_ids = + get_value_by_keys(variable_obj, &["linked_sensor_ids", "linkedSensorIds"]) + .and_then(Value::as_array) + .map(|items| { + items + .iter() + .filter_map(Value::as_str) + .map(str::to_string) + .collect::>() + }); + + Ok(PlantVariable { + id, + name, + var_type, + unit, + setpoint, + pv_min, + pv_max, + linked_sensor_ids, + }) +} + +fn parse_registry_driver( + root: &serde_json::Map, +) -> AppResult> { + let Some(driver_value) = root.get("driver") else { + return Ok(None); + }; + + let driver_obj = expect_object(driver_value, "driver")?; + let plugin_id = get_value_by_keys(driver_obj, &["plugin_id", "pluginId"]) + .and_then(Value::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + .map(str::to_string) + .ok_or_else(|| invalid_argument("driver.plugin_id deve ser uma string não vazia"))?; + + let plugin_name = get_value_by_keys(driver_obj, &["plugin_name", "pluginName"]) + .and_then(Value::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + .unwrap_or(plugin_id.as_str()) + .to_string(); + + let config = match driver_obj.get("config") { + None => HashMap::new(), + Some(value) if value.is_null() => HashMap::new(), + Some(value) => { + serde_json::from_value::>(value.clone()) + .map_err(|error| invalid_argument(format!("driver.config inválido: {error}")))? + } + }; + + Ok(Some(ImportedWorkspaceDriverResponse { + plugin_id, + plugin_name, + config, + })) +} + +fn parse_registry_controller( + value: &Value, + index: usize, +) -> AppResult { + let controller_obj = expect_object(value, &format!("controllers[{index}]"))?; + let id = get_value_by_keys(controller_obj, &["id"]) + .and_then(Value::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + .map_or_else(|| format!("ctrl_imported_{index}"), str::to_string); + + let plugin_id = get_value_by_keys(controller_obj, &["plugin_id", "pluginId"]) + .and_then(Value::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + .map(str::to_string) + .ok_or_else(|| invalid_argument(format!("controllers[{index}].plugin_id inválido")))?; + + let plugin_name = get_value_by_keys(controller_obj, &["plugin_name", "pluginName"]) + .and_then(Value::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + .unwrap_or(plugin_id.as_str()) + .to_string(); + + let name = get_value_by_keys(controller_obj, &["name"]) + .and_then(Value::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + .unwrap_or(plugin_name.as_str()) + .to_string(); + + let controller_type = get_value_by_keys(controller_obj, &["controller_type", "controllerType"]) + .and_then(Value::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + .unwrap_or(plugin_name.as_str()) + .to_string(); + + let active = get_value_by_keys(controller_obj, &["active"]) + .and_then(Value::as_bool) + .unwrap_or(false); + + let input_variable_ids = + get_value_by_keys(controller_obj, &["input_variable_ids", "inputVariableIds"]) + .and_then(Value::as_array) + .map(|items| { + items + .iter() + .filter_map(Value::as_str) + .map(str::to_string) + .collect::>() + }) + .unwrap_or_default(); + + let output_variable_ids = get_value_by_keys( + controller_obj, + &["output_variable_ids", "outputVariableIds"], + ) + .and_then(Value::as_array) + .map(|items| { + items + .iter() + .filter_map(Value::as_str) + .map(str::to_string) + .collect::>() + }) + .unwrap_or_default(); + + let params = match controller_obj.get("params") { + None => HashMap::new(), + Some(value) if value.is_null() => HashMap::new(), + Some(value) => serde_json::from_value::>(value.clone()) + .map_err(|error| { + invalid_argument(format!("controllers[{index}].params inválido: {error}")) + })?, + }; + + Ok(ImportedWorkspaceControllerResponse { + id, + plugin_id, + plugin_name, + name, + controller_type, + active, + input_variable_ids, + output_variable_ids, + params, + }) +} + +fn open_registry_plant_file( + root: &serde_json::Map, + request: &PlantImportFileRequest, +) -> AppResult { + let variables_payload = expect_array( + root.get("variables") + .ok_or_else(|| invalid_argument("Campo \"variables\" ausente"))?, + "variables", + )?; + + if variables_payload.is_empty() { + return Err(invalid_argument("Campo \"variables\" está vazio")); + } + + let variables = variables_payload + .iter() + .enumerate() + .map(|(index, variable)| parse_registry_variable(variable, index)) + .collect::, _>>()?; + + let name = root + .get("name") + .and_then(Value::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + .unwrap_or(request.file_name.as_str()) + .to_string(); + let sample_time_ms = get_value_by_keys(root, &["sample_time_ms", "sampleTimeMs"]) + .and_then(Value::as_u64) + .unwrap_or(100); + let driver = parse_registry_driver(root)?; + let controllers = match root.get("controllers") { + None => vec![], + Some(value) => expect_array(value, "controllers")? + .iter() + .enumerate() + .map(|(index, controller)| parse_registry_controller(controller, index)) + .collect::, _>>()?, + }; + let plant_id = format!("imported_{}", uuid::Uuid::new_v4().simple()); + let stats = PlantStats { + dt: milliseconds_to_seconds(sample_time_ms), + uptime: 0, + }; + let variable_stats = variables + .iter() + .enumerate() + .map(|(index, variable)| compute_imported_variable_stats(&[], index, variable)) + .collect::>(); + let series_catalog = build_imported_series_catalog(&plant_id, &variables); + + Ok(OpenPlantFileResponse { + plant: ImportedWorkspacePlantResponse { + id: plant_id, + name, + sample_time_ms, + connected: false, + paused: false, + variables, + stats: stats.clone(), + driver, + controllers, + }, + data: vec![], + stats, + variable_stats, + series_catalog, + }) +} + +fn compute_imported_plant_stats(data: &[HashMap]) -> PlantStats { + if data.len() <= 1 { + let uptime = data + .first() + .and_then(|point| point.get("time")) + .copied() + .unwrap_or(0.0) + .max(0.0); + return PlantStats { + dt: 0.0, + uptime: rounded_non_negative_to_u64(uptime), + }; + } + + let mut deltas = Vec::with_capacity(data.len().saturating_sub(1)); + for index in 1..data.len() { + let prev = data[index - 1].get("time").copied().unwrap_or(0.0); + let current = data[index].get("time").copied().unwrap_or(0.0); + deltas.push((current - prev).max(0.0)); + } + + let avg_delta = deltas.iter().sum::() / len_as_f64(deltas.len()); + let uptime = data + .last() + .and_then(|point| point.get("time")) + .copied() + .unwrap_or(0.0) + .max(0.0); + + PlantStats { + dt: (avg_delta * 10_000.0).round() / 10_000.0, + uptime: rounded_non_negative_to_u64(uptime), + } +} + +fn compute_imported_variable_stats( + data: &[HashMap], + variable_index: usize, + variable: &PlantVariable, +) -> ImportedVariableStatsResponse { + let pv_key = format!("var_{variable_index}_pv"); + let sp_key = format!("var_{variable_index}_sp"); + let values: Vec = data + .iter() + .map(|point| point.get(&pv_key).copied().unwrap_or(0.0)) + .collect(); + + if values.is_empty() { + return ImportedVariableStatsResponse { + error_avg: 0.0, + stability: 100.0, + ripple: 0.0, + }; + } + + let min = values + .iter() + .fold(f64::INFINITY, |acc, value| acc.min(*value)); + let max = values + .iter() + .fold(f64::NEG_INFINITY, |acc, value| acc.max(*value)); + let ripple = ((max - min) * 1000.0).round() / 1000.0; + + if variable.var_type == VariableType::Atuador { + return ImportedVariableStatsResponse { + error_avg: 0.0, + stability: (100.0 - ripple).max(0.0), + ripple, + }; + } + + let error_avg = data + .iter() + .map(|point| { + let pv = point.get(&pv_key).copied().unwrap_or(0.0); + let sp = point.get(&sp_key).copied().unwrap_or(0.0); + (pv - sp).abs() + }) + .sum::() + / len_as_f64(values.len()); + + ImportedVariableStatsResponse { + error_avg: (error_avg * 1000.0).round() / 1000.0, + stability: ((100.0 - ripple) * 100.0).round() / 100.0, + ripple, + } +} + +#[allow( + clippy::cast_possible_truncation, + clippy::cast_precision_loss, + clippy::cast_sign_loss +)] +fn rounded_non_negative_to_u64(value: f64) -> u64 { + if !value.is_finite() || value <= 0.0 { + return 0; + } + + value.round().clamp(0.0, u64::MAX as f64) as u64 +} + +#[allow(clippy::cast_precision_loss)] +fn milliseconds_to_seconds(sample_time_ms: u64) -> f64 { + sample_time_ms as f64 / 1000.0 +} + +#[allow(clippy::cast_precision_loss)] +fn len_as_f64(len: usize) -> f64 { + len as f64 +} + +fn build_imported_series_catalog( + plant_id: &str, + variables: &[PlantVariable], +) -> ImportedSeriesCatalogResponse { + let mut series = Vec::new(); + + for (index, variable) in variables.iter().enumerate() { + let pv_key = format!("var_{index}_pv"); + let sp_key = format!("var_{index}_sp"); + + if variable.var_type == VariableType::Sensor { + series.push(ImportedSeriesDescriptorResponse { + key: pv_key, + label: format!("{} PV", variable.name), + role: "pv".into(), + }); + series.push(ImportedSeriesDescriptorResponse { + key: sp_key, + label: format!("{} SP", variable.name), + role: "sp".into(), + }); + continue; + } + + series.push(ImportedSeriesDescriptorResponse { + key: pv_key, + label: variable.name.clone(), + role: "mv".into(), + }); + } + + ImportedSeriesCatalogResponse { + plant_id: plant_id.to_string(), + series, + } +} + +fn map_imported_variable_to_create_request(variable: &PlantVariable) -> CreatePlantVariableRequest { + CreatePlantVariableRequest { + name: variable.name.clone(), + var_type: variable.var_type, + unit: variable.unit.clone(), + setpoint: variable.setpoint, + pv_min: variable.pv_min, + pv_max: variable.pv_max, + linked_sensor_ids: variable.linked_sensor_ids.clone(), + } +} + +fn resolve_imported_driver_request( + plugins: &PluginStore, + imported_driver: Option<&ImportedWorkspaceDriverResponse>, +) -> AppResult { + let Some(driver) = imported_driver else { + return Err(invalid_argument( + "Arquivo da planta não contém driver configurado", + )); + }; + + match plugins.get(&driver.plugin_id) { + Ok(plugin) => { + if plugin.plugin_type != PluginType::Driver { + return Err(invalid_argument(format!( + "Plugin '{}' não é um driver válido", + driver.plugin_name + ))); + } + + return Ok(CreatePlantDriverRequest { + plugin_id: plugin.id, + config: driver.config.clone(), + }); + } + Err(AppError::NotFound(_)) => {} + Err(error) => return Err(error), + } + + let resolved_by_name = plugins + .list_by_type(PluginType::Driver) + .into_iter() + .find(|plugin| plugin.name.eq_ignore_ascii_case(&driver.plugin_name)); + + let Some(plugin) = resolved_by_name else { + return Err(invalid_argument(format!( + "Driver '{}' não está carregado no sistema", + driver.plugin_name + ))); + }; + + Ok(CreatePlantDriverRequest { + plugin_id: plugin.id, + config: driver.config.clone(), + }) +} + +fn resolve_imported_controller_requests( + plugins: &PluginStore, + imported_controllers: &[ImportedWorkspaceControllerResponse], +) -> AppResult> { + imported_controllers + .iter() + .map(|controller| { + let resolved_plugin_id = match plugins.get(&controller.plugin_id) { + Ok(plugin) => { + if plugin.plugin_type != PluginType::Controller { + return Err(invalid_argument(format!( + "Plugin '{}' não é um controlador válido", + controller.plugin_name + ))); + } + plugin.id + } + Err(AppError::NotFound(_)) => { + let Some(plugin) = plugins + .list_by_type(PluginType::Controller) + .into_iter() + .find(|plugin| plugin.name.eq_ignore_ascii_case(&controller.plugin_name)) + else { + return Err(invalid_argument(format!( + "Controlador '{}' não está carregado no sistema", + controller.plugin_name + ))); + }; + plugin.id + } + Err(error) => return Err(error), + }; + + Ok(CreatePlantControllerRequest { + id: Some(controller.id.clone()), + plugin_id: resolved_plugin_id, + name: controller.name.clone(), + controller_type: controller.controller_type.clone(), + active: controller.active, + input_variable_ids: controller.input_variable_ids.clone(), + output_variable_ids: controller.output_variable_ids.clone(), + params: controller.params.clone(), + }) + }) + .collect() +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::core::models::plant::ControllerParamType; + use crate::core::models::plugin::{ + PluginRegistry, PluginRuntime, PluginType, SchemaFieldValue, + }; + use crate::core::services::workspace::WorkspaceService; + use crate::state::{PlantStore, PluginStore}; + use uuid::Uuid; + + #[test] + fn open_file_reads_registry_shape_with_driver_and_controllers() { + let json = r#" + { + "name": "Planta Registry", + "sample_time_ms": 500, + "variables": [ + { + "id": "sensor_a", + "name": "Temperatura", + "type": "sensor", + "unit": "C", + "setpoint": 45.0, + "pv_min": 0.0, + "pv_max": 100.0 + } + ], + "driver": { + "plugin_id": "driver_mock", + "plugin_name": "Driver Mock", + "config": { + "baud": 9600 + } + }, + "controllers": [ + { + "id": "ctrl_pid_1", + "plugin_id": "controller_pid", + "plugin_name": "PID Controller", + "name": "PID Temperatura", + "controller_type": "PID", + "active": true, + "input_variable_ids": ["sensor_a"], + "output_variable_ids": ["var_1"], + "params": { + "kp": { + "type": "number", + "value": 1.5, + "label": "Kp" + } + } + } + ] + } + "#; + + let response = PlantImportService::open_file(PlantImportFileRequest { + file_name: "registry.json".to_string(), + content: json.to_string(), + }) + .expect("open file should succeed"); + + assert_eq!(response.plant.name, "Planta Registry"); + assert_eq!(response.plant.sample_time_ms, 500); + assert_eq!(response.plant.variables.len(), 1); + assert_eq!(response.data.len(), 0); + assert!(response.plant.driver.is_some()); + assert_eq!(response.plant.controllers.len(), 1); + + let driver = response.plant.driver.expect("driver should be present"); + assert_eq!(driver.plugin_id, "driver_mock"); + assert_eq!(driver.plugin_name, "Driver Mock"); + assert!(matches!( + driver.config.get("baud"), + Some(SchemaFieldValue::Int(9600)) + )); + + let controller = &response.plant.controllers[0]; + assert_eq!(controller.id, "ctrl_pid_1"); + assert_eq!(controller.plugin_id, "controller_pid"); + assert_eq!(controller.plugin_name, "PID Controller"); + assert_eq!(controller.name, "PID Temperatura"); + assert_eq!(controller.controller_type, "PID"); + assert_eq!(controller.input_variable_ids, vec!["sensor_a".to_string()]); + assert_eq!(controller.output_variable_ids, vec!["var_1".to_string()]); + assert!(matches!( + controller.params.get("kp"), + Some(param) + if param.param_type == ControllerParamType::Number + && matches!(param.value, SchemaFieldValue::Float(value) if (value - 1.5).abs() < f64::EPSILON) + )); + } + + #[test] + fn open_file_reads_legacy_shape_without_driver() { + let json = r#" + { + "meta": { + "name": "Planta Legacy", + "sampleTimeMs": 1000 + }, + "sensors": [ + { "id": "s1", "name": "Temp", "unit": "C" } + ], + "actuators": [ + { + "id": "a1", + "name": "Valvula", + "unit": "%", + "linkedSensorIds": ["s1"] + } + ], + "setpoints": [ + { "id": "sp1", "sensorId": "s1" } + ], + "data": [ + { + "time": 0.0, + "sensors": { "s1": 20.0 }, + "setpoints": { "sp1": 25.0 }, + "actuators": { "a1": 10.0 } + }, + { + "time": 1.0, + "sensors": { "s1": 21.0 }, + "setpoints": { "sp1": 26.0 }, + "actuators": { "a1": 11.0 } + } + ] + } + "#; + + let response = PlantImportService::open_file(PlantImportFileRequest { + file_name: "legacy.json".to_string(), + content: json.to_string(), + }) + .expect("open file should succeed"); + + assert_eq!(response.plant.name, "Planta Legacy"); + assert_eq!(response.plant.sample_time_ms, 1000); + assert_eq!(response.plant.variables.len(), 2); + assert_eq!(response.data.len(), 2); + assert!(response.plant.driver.is_none()); + assert!(response.plant.controllers.is_empty()); + assert!((response.stats.dt - 1.0).abs() < f64::EPSILON); + } + + #[test] + #[allow(clippy::too_many_lines)] + fn import_file_preserves_registry_controllers() { + let plugins = PluginStore::new(); + let plants = PlantStore::new(); + let suffix = Uuid::new_v4().simple().to_string(); + let driver_id = format!("driver_mock_{suffix}"); + let driver_name = format!("Driver Mock {suffix}"); + let controller_id = format!("controller_pid_{suffix}"); + let controller_name = format!("PID Controller {suffix}"); + let plant_name = format!("Planta Importada {suffix}"); + + let driver_plugin = PluginRegistry { + id: driver_id.clone(), + name: driver_name.clone(), + plugin_type: PluginType::Driver, + runtime: PluginRuntime::Python, + entry_class: "DriverMock".to_string(), + schema: vec![], + source_file: Some("main.py".to_string()), + source_code: Some("class DriverMock:\n def connect(self):\n return True\n def stop(self):\n return True\n def read(self):\n return {'sensors': {}, 'actuators': {}}\n def write(self, outputs):\n return True\n".to_string()), + dependencies: vec![], + description: None, + version: None, + author: None, + }; + + let controller_plugin = PluginRegistry { + id: controller_id.clone(), + name: controller_name.clone(), + plugin_type: PluginType::Controller, + runtime: PluginRuntime::Python, + entry_class: "PIDController".to_string(), + schema: vec![], + source_file: Some("main.py".to_string()), + source_code: Some( + "class PIDController:\n def compute(self, snapshot):\n return {}\n" + .to_string(), + ), + dependencies: vec![], + description: None, + version: None, + author: None, + }; + + WorkspaceService::save_plugin_registry( + &driver_plugin, + driver_plugin.source_code.as_deref().unwrap(), + ) + .expect("driver plugin should be saved to workspace"); + WorkspaceService::save_plugin_registry( + &controller_plugin, + controller_plugin.source_code.as_deref().unwrap(), + ) + .expect("controller plugin should be saved to workspace"); + + let json = format!( + r#" + {{ + "name": "{plant_name}", + "sample_time_ms": 500, + "variables": [ + {{ + "id": "var_0", + "name": "Temperatura", + "type": "sensor", + "unit": "C", + "setpoint": 45.0, + "pv_min": 0.0, + "pv_max": 100.0 + }}, + {{ + "id": "var_1", + "name": "Valvula", + "type": "atuador", + "unit": "%", + "setpoint": 0.0, + "pv_min": 0.0, + "pv_max": 100.0, + "linked_sensor_ids": ["var_0"] + }} + ], + "driver": {{ + "plugin_id": "{driver_id}", + "plugin_name": "{driver_name}", + "config": {{ + "baud": 9600 + }} + }}, + "controllers": [ + {{ + "id": "ctrl_pid_1", + "plugin_id": "{controller_id}", + "plugin_name": "{controller_name}", + "name": "PID Temperatura", + "controller_type": "PID", + "active": true, + "input_variable_ids": ["var_0"], + "output_variable_ids": ["var_1"], + "params": {{ + "kp": {{ + "type": "number", + "value": 1.5, + "label": "Kp" + }} + }} + }} + ] + }} + "# + ); + + let response = PlantImportService::import_file( + &plants, + &plugins, + PlantImportFileRequest { + file_name: "registry.json".to_string(), + content: json, + }, + ) + .expect("import file should succeed"); + + assert_eq!(response.plant.controllers.len(), 1); + let controller = &response.plant.controllers[0]; + assert_eq!(controller.id, "ctrl_pid_1"); + assert_eq!(controller.plugin_id, controller_id); + assert_eq!(controller.plugin_name, controller_name); + assert_eq!(controller.input_variable_ids, vec!["var_0".to_string()]); + assert_eq!(controller.output_variable_ids, vec!["var_1".to_string()]); + assert!(controller.active); + + let _ = WorkspaceService::delete_plant_registry(&plant_name); + let _ = WorkspaceService::delete_plugin_registry(&driver_name, PluginType::Driver); + let _ = WorkspaceService::delete_plugin_registry(&controller_name, PluginType::Controller); + } +} diff --git a/apps/desktop/src-tauri/src/core/services/plugin.rs b/apps/desktop/src-tauri/src/core/services/plugin.rs new file mode 100644 index 0000000..8e52f20 --- /dev/null +++ b/apps/desktop/src-tauri/src/core/services/plugin.rs @@ -0,0 +1,125 @@ +mod builder; +mod metadata; +mod source; +mod validation; + +use self::builder::{build_plugin, build_updated_plugin}; +use self::metadata::ensure_runtime_metadata; +use self::source::{normalize_source_code, resolve_source_code_for_create}; +use self::validation::validate_request; +use crate::core::error::{AppError, AppResult}; +use crate::core::models::plugin::{ + CreatePluginRequest, PluginRegistry, PluginType, UpdatePluginRequest, +}; +use crate::core::services::workspace::WorkspaceService; +use crate::state::PluginStore; + +const PYTHON_SOURCE_FILE_NAME: &str = "main.py"; + +pub struct PluginService; + +impl PluginService { + pub fn create(store: &PluginStore, request: CreatePluginRequest) -> AppResult { + validate_request( + store, + None, + &request.name, + request.runtime, + request.entry_class.as_deref(), + request.source_file.as_deref(), + request.source_code.as_deref(), + )?; + + let source_code = resolve_source_code_for_create( + request.source_code.as_deref(), + request.source_file.as_deref(), + &request.name, + request.plugin_type, + )?; + let plugin = build_plugin(request, PYTHON_SOURCE_FILE_NAME); + + WorkspaceService::save_plugin_registry(&plugin, &source_code)?; + + if let Err(error) = store.insert(plugin.clone()) { + let _ = WorkspaceService::delete_plugin_registry(&plugin.name, plugin.plugin_type); + return Err(error); + } + + Ok(plugin) + } + + pub fn get(store: &PluginStore, id: &str) -> AppResult { + let mut plugin = store.get(id)?; + let source_code = WorkspaceService::read_plugin_source(&plugin.name, plugin.plugin_type)?; + plugin.source_code = Some(source_code); + Ok(plugin) + } + + pub fn list(store: &PluginStore) -> Vec { + store.list() + } + + pub fn list_by_type(store: &PluginStore, plugin_type: PluginType) -> Vec { + store.list_by_type(plugin_type) + } + + pub fn update(store: &PluginStore, request: UpdatePluginRequest) -> AppResult { + validate_request( + store, + Some(request.id.as_str()), + &request.name, + request.runtime, + request.entry_class.as_deref(), + request.source_file.as_deref(), + request.source_code.as_deref(), + )?; + + let (previous_name, previous_type) = store.read(&request.id, |existing| { + (existing.name.clone(), existing.plugin_type) + })?; + if request.plugin_type != previous_type { + return Err(AppError::InvalidArgument( + "Tipo do plugin não pode ser alterado".into(), + )); + } + + let resolved_source_code = match normalize_source_code(request.source_code.as_deref()) { + Some(code) => code, + None => WorkspaceService::read_plugin_source(&previous_name, previous_type)?, + }; + + let next_plugin = build_updated_plugin(request, previous_type, PYTHON_SOURCE_FILE_NAME); + + WorkspaceService::update_plugin_registry( + &next_plugin, + resolved_source_code.as_str(), + &previous_name, + previous_type, + )?; + store.replace(&next_plugin.id, next_plugin.clone())?; + + Ok(next_plugin) + } + + pub fn load_all(store: &PluginStore) -> AppResult> { + let plugins = WorkspaceService::load_plugin_registries()? + .into_iter() + .map(|mut plugin| { + ensure_runtime_metadata(&mut plugin)?; + plugin.source_code = None; + Ok(plugin) + }) + .collect::>>()?; + store.sync(plugins) + } + + pub fn remove(store: &PluginStore, id: &str) -> AppResult { + let (plugin_name, plugin_type) = + store.read(id, |existing| (existing.name.clone(), existing.plugin_type))?; + WorkspaceService::delete_plugin_registry(&plugin_name, plugin_type)?; + store.remove(id) + } +} + +#[cfg(test)] +mod tests; diff --git a/apps/desktop/src-tauri/src/core/services/plugin/builder.rs b/apps/desktop/src-tauri/src/core/services/plugin/builder.rs new file mode 100644 index 0000000..8bedace --- /dev/null +++ b/apps/desktop/src-tauri/src/core/services/plugin/builder.rs @@ -0,0 +1,49 @@ +use super::metadata::{normalize_optional_text, resolve_entry_class}; +use crate::core::models::plugin::{CreatePluginRequest, PluginRegistry, UpdatePluginRequest}; +use uuid::Uuid; + +pub(super) fn build_plugin(request: CreatePluginRequest, source_file_name: &str) -> PluginRegistry { + PluginRegistry { + id: format!("plugin_{}", Uuid::new_v4()), + name: request.name.trim().to_string(), + plugin_type: request.plugin_type, + runtime: request.runtime, + entry_class: resolve_entry_class( + request.entry_class.as_deref(), + &request.name, + request.plugin_type, + ), + schema: request.schema, + source_file: Some(source_file_name.to_string()), + source_code: None, + dependencies: request.dependencies, + description: normalize_optional_text(request.description), + version: normalize_optional_text(request.version), + author: normalize_optional_text(request.author), + } +} + +pub(super) fn build_updated_plugin( + request: UpdatePluginRequest, + plugin_type: crate::core::models::plugin::PluginType, + source_file_name: &str, +) -> PluginRegistry { + PluginRegistry { + id: request.id, + name: request.name.trim().to_string(), + plugin_type, + runtime: request.runtime, + entry_class: resolve_entry_class( + request.entry_class.as_deref(), + &request.name, + plugin_type, + ), + schema: request.schema, + source_file: Some(source_file_name.to_string()), + source_code: None, + dependencies: request.dependencies, + description: normalize_optional_text(request.description), + version: normalize_optional_text(request.version), + author: normalize_optional_text(request.author), + } +} diff --git a/apps/desktop/src-tauri/src/core/services/plugin/metadata.rs b/apps/desktop/src-tauri/src/core/services/plugin/metadata.rs new file mode 100644 index 0000000..4ca1e3b --- /dev/null +++ b/apps/desktop/src-tauri/src/core/services/plugin/metadata.rs @@ -0,0 +1,97 @@ +use crate::core::error::AppResult; +use crate::core::models::plugin::{PluginRegistry, PluginRuntime, PluginType}; +use crate::core::services::workspace::WorkspaceService; + +pub(super) fn normalize_optional_text(value: Option) -> Option { + value.and_then(|raw| { + let trimmed = raw.trim(); + if trimmed.is_empty() { + None + } else { + Some(trimmed.to_string()) + } + }) +} + +pub(super) fn resolve_entry_class( + entry_class: Option<&str>, + plugin_name: &str, + plugin_type: PluginType, +) -> String { + let normalized = entry_class + .map(str::trim) + .filter(|value| !value.is_empty()) + .map(str::to_string); + + match normalized { + Some(value) if is_valid_entry_class(&value) => value, + _ => default_entry_class_for(plugin_name, plugin_type), + } +} + +pub(super) fn ensure_runtime_metadata(plugin: &mut PluginRegistry) -> AppResult<()> { + if plugin.runtime != PluginRuntime::Python { + return Ok(()); + } + + let normalized = plugin.entry_class.trim().to_string(); + if !normalized.is_empty() && is_valid_entry_class(&normalized) { + plugin.entry_class = normalized; + return Ok(()); + } + + let previous_name = plugin.name.clone(); + let previous_type = plugin.plugin_type; + plugin.entry_class = default_entry_class_for(&plugin.name, plugin.plugin_type); + + let source_code = WorkspaceService::read_plugin_source(&plugin.name, plugin.plugin_type)?; + WorkspaceService::update_plugin_registry(plugin, &source_code, &previous_name, previous_type)?; + Ok(()) +} + +pub(super) fn is_valid_entry_class(value: &str) -> bool { + let mut chars = value.chars(); + match chars.next() { + Some(first) if first.is_ascii_alphabetic() || first == '_' => {} + _ => return false, + } + + chars.all(|character| character.is_ascii_alphanumeric() || character == '_') +} + +pub(super) fn default_entry_class_for(plugin_name: &str, plugin_type: PluginType) -> String { + let fallback = match plugin_type { + PluginType::Driver => "MyDriver", + PluginType::Controller => "MyController", + }; + + let filtered: String = plugin_name + .trim() + .chars() + .filter(|character| { + character.is_ascii_alphanumeric() + || character.is_ascii_whitespace() + || *character == '_' + }) + .collect(); + + let mut class_name = String::new(); + for token in filtered + .split(|character: char| character.is_ascii_whitespace() || character == '_') + .filter(|token| !token.is_empty()) + { + let mut chars = token.chars(); + if let Some(first) = chars.next() { + class_name.push(first.to_ascii_uppercase()); + for character in chars { + class_name.push(character.to_ascii_lowercase()); + } + } + } + + if class_name.is_empty() { + fallback.to_string() + } else { + class_name + } +} diff --git a/apps/desktop/src-tauri/src/core/services/plugin/source.rs b/apps/desktop/src-tauri/src/core/services/plugin/source.rs new file mode 100644 index 0000000..d5bdd36 --- /dev/null +++ b/apps/desktop/src-tauri/src/core/services/plugin/source.rs @@ -0,0 +1,52 @@ +use crate::core::error::{AppError, AppResult}; +use crate::core::models::plugin::PluginType; +use crate::core::services::workspace::WorkspaceService; +use std::path::PathBuf; + +pub(super) fn resolve_source_code_for_create( + source_code: Option<&str>, + source_file: Option<&str>, + plugin_name: &str, + plugin_type: PluginType, +) -> AppResult { + if let Some(code) = normalize_source_code(source_code) { + return Ok(code); + } + + if let Some(file_name) = source_file { + let maybe_path = PathBuf::from(file_name); + if maybe_path.is_absolute() && maybe_path.exists() { + let code = std::fs::read_to_string(&maybe_path).map_err(|error| { + AppError::IoError(format!( + "Falha ao ler código fonte do arquivo '{}': {error}", + maybe_path.display() + )) + })?; + if let Some(normalized) = normalize_source_code(Some(&code)) { + return Ok(normalized); + } + } + } + + if let Ok(code) = WorkspaceService::read_plugin_source(plugin_name, plugin_type) { + if let Some(normalized) = normalize_source_code(Some(&code)) { + return Ok(normalized); + } + } + + Err(AppError::InvalidArgument( + "Código fonte Python é obrigatório. Informe sourceCode ou use um source_file absoluto válido." + .into(), + )) +} + +pub(super) fn normalize_source_code(source_code: Option<&str>) -> Option { + source_code.and_then(|value| { + let trimmed = value.trim(); + if trimmed.is_empty() { + None + } else { + Some(trimmed.to_string()) + } + }) +} diff --git a/apps/desktop/src-tauri/src/core/services/plugin/tests.rs b/apps/desktop/src-tauri/src/core/services/plugin/tests.rs new file mode 100644 index 0000000..30f099d --- /dev/null +++ b/apps/desktop/src-tauri/src/core/services/plugin/tests.rs @@ -0,0 +1,238 @@ +use super::*; +use crate::core::models::plugin::{ + PluginRuntime, PluginSchemaField, PluginType, SchemaFieldType, SchemaFieldValue, +}; +use crate::core::services::workspace::test_workspace_root; +use std::fs; +use std::path::PathBuf; +use uuid::Uuid; + +fn test_workspace_drivers_dir() -> PathBuf { + test_workspace_root().join("drivers") +} + +fn create_valid_request() -> CreatePluginRequest { + CreatePluginRequest { + name: format!("test_driver_{}", Uuid::new_v4().simple()), + plugin_type: PluginType::Driver, + runtime: PluginRuntime::Python, + entry_class: Some("TestDriver".to_string()), + schema: vec![], + source_file: None, + source_code: Some("class TestDriver:\n pass".to_string()), + dependencies: vec![], + description: Some("A test driver".to_string()), + version: Some("1.0.0".to_string()), + author: Some("Test Author".to_string()), + } +} + +#[test] +fn test_create_plugin_success() { + let store = PluginStore::new(); + let request = create_valid_request(); + let expected_name = request.name.clone(); + let result = PluginService::create(&store, request); + + assert!(result.is_ok()); + let plugin = result.unwrap(); + + assert!(plugin.id.starts_with("plugin_")); + assert_eq!(plugin.name, expected_name); + assert_eq!(plugin.source_file.as_deref(), Some("main.py")); + assert_eq!(plugin.source_code, None); +} + +#[test] +fn test_create_driver_with_list_default_persists_schema_structure() { + let store = PluginStore::new(); + let request = CreatePluginRequest { + schema: vec![PluginSchemaField { + name: "channels".to_string(), + field_type: SchemaFieldType::List, + default_value: Some(SchemaFieldValue::List(vec![ + SchemaFieldValue::String("A0".to_string()), + SchemaFieldValue::Int(2), + SchemaFieldValue::Bool(true), + ])), + description: Some("Canais ativos".to_string()), + }], + ..create_valid_request() + }; + + let plugin = PluginService::create(&store, request).unwrap(); + + let registry_path = test_workspace_drivers_dir() + .join(&plugin.name) + .join("registry.json"); + let raw_registry = fs::read_to_string(®istry_path).unwrap(); + let persisted: PluginRegistry = serde_json::from_str(&raw_registry).unwrap(); + + assert_eq!(persisted.schema.len(), 1); + assert_eq!(persisted.source_code, None); + let default_value = persisted.schema[0].default_value.clone().unwrap(); + + match default_value { + SchemaFieldValue::List(items) => { + assert_eq!(items.len(), 3); + assert!(matches!( + items.first(), + Some(SchemaFieldValue::String(value)) if value == "A0" + )); + assert!(matches!(items.get(1), Some(SchemaFieldValue::Int(2)))); + assert!(matches!(items.get(2), Some(SchemaFieldValue::Bool(true)))); + } + _ => panic!("default_value deveria ser uma lista"), + } + + let driver_dir: PathBuf = registry_path + .parent() + .map_or_else(std::env::temp_dir, PathBuf::from); + let _ = fs::remove_dir_all(driver_dir); +} + +#[test] +fn test_empty_name_should_fail() { + let store = PluginStore::new(); + let mut request = create_valid_request(); + + request.name = String::new(); + + assert!(PluginService::create(&store, request).is_err()); +} + +#[test] +fn test_driver_without_source_should_fail() { + let store = PluginStore::new(); + let mut request = create_valid_request(); + + request.source_code = None; + request.source_file = None; + + assert!(PluginService::create(&store, request).is_err()); +} + +#[test] +fn test_update_plugin_success() { + let store = PluginStore::new(); + let created = PluginService::create(&store, create_valid_request()).unwrap(); + + let updated = PluginService::update( + &store, + UpdatePluginRequest { + id: created.id.clone(), + name: "updated_driver".to_string(), + plugin_type: PluginType::Driver, + runtime: PluginRuntime::Python, + entry_class: Some("UpdatedDriver".to_string()), + schema: vec![], + source_file: Some("updated.py".to_string()), + source_code: Some("class UpdatedDriver:\n pass".to_string()), + dependencies: vec![], + description: Some("updated".to_string()), + version: None, + author: None, + }, + ) + .unwrap(); + + assert_eq!(updated.name, "updated_driver"); + assert_eq!(updated.source_file.as_deref(), Some("main.py")); + assert_eq!(updated.source_code, None); +} + +#[test] +fn test_update_plugin_should_fail_when_type_changes() { + let store = PluginStore::new(); + let created = PluginService::create(&store, create_valid_request()).unwrap(); + + let result = PluginService::update( + &store, + UpdatePluginRequest { + id: created.id.clone(), + name: "updated_driver".to_string(), + plugin_type: PluginType::Controller, + runtime: PluginRuntime::Python, + entry_class: Some("UpdatedDriver".to_string()), + schema: vec![], + source_file: Some("main.py".to_string()), + source_code: Some("class UpdatedDriver:\n pass".to_string()), + dependencies: vec![], + description: Some("updated".to_string()), + version: None, + author: None, + }, + ); + + assert!(matches!( + result, + Err(AppError::InvalidArgument(message)) if message == "Tipo do plugin não pode ser alterado" + )); +} + +#[test] +fn test_get_plugin_returns_source_code_from_disk() { + let store = PluginStore::new(); + let created = PluginService::create(&store, create_valid_request()).unwrap(); + + let retrieved = PluginService::get(&store, &created.id).unwrap(); + assert_eq!( + retrieved.source_code.as_deref(), + Some("class TestDriver:\n pass") + ); +} + +#[test] +fn test_update_plugin_without_source_code_keeps_existing_file_contents() { + let store = PluginStore::new(); + let created = PluginService::create(&store, create_valid_request()).unwrap(); + let updated_name = format!("updated_driver_{}", Uuid::new_v4().simple()); + + let original_source_path = test_workspace_drivers_dir() + .join(&created.name) + .join("main.py"); + let original_source = fs::read_to_string(&original_source_path).unwrap(); + + let updated = PluginService::update( + &store, + UpdatePluginRequest { + id: created.id.clone(), + name: updated_name.clone(), + plugin_type: PluginType::Driver, + runtime: PluginRuntime::Python, + entry_class: Some("TestDriver".to_string()), + schema: vec![], + source_file: Some("main.py".to_string()), + source_code: None, + dependencies: vec![], + description: Some("updated".to_string()), + version: None, + author: None, + }, + ) + .unwrap(); + + let updated_source_path = test_workspace_drivers_dir() + .join(&updated_name) + .join("main.py"); + let updated_source = fs::read_to_string(&updated_source_path).unwrap(); + + assert_eq!(updated.name, updated_name); + assert_eq!(updated_source.trim(), original_source.trim()); + assert!(!original_source_path.exists()); + assert_eq!(updated.source_code, None); +} + +#[test] +fn test_remove_plugin_cleans_workspace_directory() { + let store = PluginStore::new(); + let created = PluginService::create(&store, create_valid_request()).unwrap(); + + let plugin_dir = test_workspace_drivers_dir().join(&created.name); + assert!(plugin_dir.exists()); + + let removed = PluginService::remove(&store, &created.id).unwrap(); + + assert_eq!(removed.id, created.id); + assert!(!plugin_dir.exists()); +} diff --git a/apps/desktop/src-tauri/src/core/services/plugin/validation.rs b/apps/desktop/src-tauri/src/core/services/plugin/validation.rs new file mode 100644 index 0000000..9980c2a --- /dev/null +++ b/apps/desktop/src-tauri/src/core/services/plugin/validation.rs @@ -0,0 +1,62 @@ +use super::metadata::is_valid_entry_class; +use crate::core::error::{AppError, AppResult}; +use crate::core::models::plugin::PluginRuntime; +use crate::state::PluginStore; + +pub(super) fn validate_request( + store: &PluginStore, + current_id: Option<&str>, + name: &str, + runtime: PluginRuntime, + entry_class: Option<&str>, + source_file: Option<&str>, + source_code: Option<&str>, +) -> AppResult<()> { + if name.trim().is_empty() { + return Err(AppError::InvalidArgument( + "Nome do plugin é obrigatório".into(), + )); + } + + let has_duplicate_name = current_id.map_or_else( + || store.exists_by_name(name), + |id| store.exists_by_name_except(id, name), + ); + + if has_duplicate_name { + return Err(AppError::InvalidArgument(format!( + "Plugin com nome '{}' já existe", + name.trim() + ))); + } + + if runtime != PluginRuntime::Python { + return Err(AppError::InvalidArgument( + "Somente plugins Python podem ser criados no momento".into(), + )); + } + + let normalized_entry_class = entry_class + .map(str::trim) + .filter(|value| !value.is_empty()) + .unwrap_or_default(); + if !normalized_entry_class.is_empty() && !is_valid_entry_class(normalized_entry_class) { + return Err(AppError::InvalidArgument( + "Classe principal do plugin é inválida".into(), + )); + } + + if source_code.is_some_and(|code| code.trim().is_empty()) { + return Err(AppError::InvalidArgument( + "Código fonte Python é obrigatório".into(), + )); + } + + if source_file.is_some_and(|file_name| file_name.trim().is_empty()) { + return Err(AppError::InvalidArgument( + "Nome do arquivo fonte inválido".into(), + )); + } + + Ok(()) +} diff --git a/apps/desktop/src-tauri/src/core/services/plugin_import.rs b/apps/desktop/src-tauri/src/core/services/plugin_import.rs new file mode 100644 index 0000000..46bc51b --- /dev/null +++ b/apps/desktop/src-tauri/src/core/services/plugin_import.rs @@ -0,0 +1,307 @@ +use crate::core::error::{AppError, AppResult}; +use crate::core::models::plugin::{ + PluginDependency, PluginRegistry, PluginRuntime, PluginSchemaField, PluginType, + SchemaFieldType, SchemaFieldValue, +}; +use serde_json::Value; +use uuid::Uuid; + +const DEFAULT_SOURCE_FILE: &str = "main.py"; + +pub struct PluginImportService; + +impl PluginImportService { + pub fn parse_file(content: &str) -> AppResult { + let parsed: Value = serde_json::from_str(content) + .map_err(|error| invalid_argument(format!("JSON inválido: {error}")))?; + let root = parsed + .as_object() + .ok_or_else(|| invalid_argument("Arquivo inválido: não é um objeto JSON"))?; + + let name = get_non_empty_string(root, &["name"], "name")?; + let plugin_type = + parse_plugin_type(get_string(root, &["kind", "type"]).ok_or_else(|| { + invalid_argument("Campo \"kind\" deve ser uma string não vazia") + })?)?; + let runtime = parse_plugin_runtime( + get_string(root, &["runtime"]) + .ok_or_else(|| invalid_argument("Campo \"runtime\" deve ser uma string"))?, + )?; + let entry_class = get_optional_non_empty_string(root, &["entryClass", "entry_class"]) + .unwrap_or_else(|| default_entry_class_for(&name, plugin_type)); + + let source_file = get_optional_non_empty_string(root, &["sourceFile", "source_file"]) + .unwrap_or_else(|| DEFAULT_SOURCE_FILE.to_string()); + let source_code = get_optional_non_empty_string(root, &["sourceCode", "source_code"]); + + let schema = get_array(root, &["schema"]) + .ok_or_else(|| invalid_argument("Campo \"schema\" deve ser um array"))? + .iter() + .map(parse_schema_field) + .collect::, _>>()?; + + let dependencies = get_array(root, &["dependencies"]) + .map(|items| { + items + .iter() + .map(parse_dependency) + .collect::, _>>() + }) + .transpose()? + .unwrap_or_default(); + + Ok(PluginRegistry { + id: root + .get("id") + .and_then(Value::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + .map_or_else(|| format!("plugin_{}", Uuid::new_v4()), str::to_string), + name, + plugin_type, + runtime, + entry_class, + schema, + source_file: Some(source_file), + source_code, + dependencies, + description: get_optional_non_empty_string(root, &["description"]), + version: get_optional_non_empty_string(root, &["version"]), + author: get_optional_non_empty_string(root, &["author"]), + }) + } +} + +fn parse_schema_field(field: &Value) -> AppResult { + let field_obj = field + .as_object() + .ok_or_else(|| invalid_argument("Campo de schema inválido"))?; + + Ok(PluginSchemaField { + name: field_obj + .get("name") + .and_then(Value::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + .ok_or_else(|| invalid_argument("schema.name deve ser string"))? + .to_string(), + field_type: parse_schema_field_type( + field_obj + .get("type") + .and_then(Value::as_str) + .ok_or_else(|| invalid_argument("schema.type inválido"))?, + )?, + default_value: field_obj + .get("defaultValue") + .or_else(|| field_obj.get("default_value")) + .map(parse_schema_field_value) + .transpose()?, + description: field_obj + .get("description") + .and_then(Value::as_str) + .map(str::to_string), + }) +} + +fn parse_dependency(dependency: &Value) -> AppResult { + let dependency_obj = dependency + .as_object() + .ok_or_else(|| invalid_argument("Dependência inválida"))?; + + Ok(PluginDependency { + name: dependency_obj + .get("name") + .and_then(Value::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + .ok_or_else(|| invalid_argument("dependencies.name deve ser string"))? + .to_string(), + version: dependency_obj + .get("version") + .and_then(Value::as_str) + .map(str::trim) + .ok_or_else(|| invalid_argument("dependencies.version deve ser string"))? + .to_string(), + }) +} + +fn get_string<'a>(root: &'a serde_json::Map, keys: &[&str]) -> Option<&'a str> { + keys.iter() + .find_map(|key| root.get(*key).and_then(Value::as_str)) +} + +fn get_non_empty_string( + root: &serde_json::Map, + keys: &[&str], + field_label: &str, +) -> AppResult { + get_string(root, keys) + .map(str::trim) + .filter(|value| !value.is_empty()) + .map(str::to_string) + .ok_or_else(|| invalid_argument(format!("Campo \"{field_label}\" é obrigatório"))) +} + +fn get_optional_non_empty_string( + root: &serde_json::Map, + keys: &[&str], +) -> Option { + get_string(root, keys) + .map(str::trim) + .filter(|value| !value.is_empty()) + .map(str::to_string) +} + +fn get_array<'a>( + root: &'a serde_json::Map, + keys: &[&str], +) -> Option<&'a Vec> { + keys.iter() + .find_map(|key| root.get(*key).and_then(Value::as_array)) +} + +fn invalid_argument(message: impl Into) -> AppError { + AppError::InvalidArgument(message.into()) +} + +fn parse_plugin_runtime(value: &str) -> AppResult { + match value.trim().to_ascii_lowercase().as_str() { + "python" => Ok(PluginRuntime::Python), + "rust-native" | "rust_native" => Ok(PluginRuntime::RustNative), + _ => Err(invalid_argument( + "Campo \"runtime\" deve ser \"python\" ou \"rust-native\"", + )), + } +} + +fn parse_plugin_type(value: &str) -> AppResult { + match value.trim().to_ascii_lowercase().as_str() { + "driver" => Ok(PluginType::Driver), + "controller" => Ok(PluginType::Controller), + _ => Err(invalid_argument( + "Campo \"kind\" deve ser \"driver\" ou \"controller\"", + )), + } +} + +fn parse_schema_field_type(value: &str) -> AppResult { + match value.trim().to_ascii_lowercase().as_str() { + "bool" => Ok(SchemaFieldType::Bool), + "int" => Ok(SchemaFieldType::Int), + "float" => Ok(SchemaFieldType::Float), + "string" => Ok(SchemaFieldType::String), + "list" => Ok(SchemaFieldType::List), + _ => Err(invalid_argument("schema.type inválido")), + } +} + +fn parse_schema_field_value(value: &Value) -> AppResult { + match value { + Value::Bool(flag) => Ok(SchemaFieldValue::Bool(*flag)), + Value::Number(number) => { + if let Some(integer) = number.as_i64() { + Ok(SchemaFieldValue::Int(integer)) + } else if let Some(float) = number.as_f64() { + Ok(SchemaFieldValue::Float(float)) + } else { + Err(invalid_argument("Número inválido em schema.defaultValue")) + } + } + Value::String(text) => Ok(SchemaFieldValue::String(text.clone())), + Value::Array(items) => Ok(SchemaFieldValue::List( + items + .iter() + .map(parse_schema_field_value) + .collect::>()?, + )), + _ => Err(invalid_argument( + "schema.defaultValue possui tipo não suportado", + )), + } +} + +fn default_entry_class_for(plugin_name: &str, plugin_type: PluginType) -> String { + let fallback = match plugin_type { + PluginType::Driver => "MyDriver", + PluginType::Controller => "MyController", + }; + + let class_name = plugin_name + .chars() + .filter(|character| { + character.is_ascii_alphanumeric() + || character.is_ascii_whitespace() + || *character == '_' + }) + .collect::() + .split(|character: char| character.is_ascii_whitespace() || character == '_') + .filter(|token| !token.is_empty()) + .map(|token| { + let mut chars = token.chars(); + match chars.next() { + Some(first) => { + let mut normalized = String::new(); + normalized.push(first.to_ascii_uppercase()); + for character in chars { + normalized.push(character.to_ascii_lowercase()); + } + normalized + } + None => String::new(), + } + }) + .collect::(); + + if class_name.is_empty() { + fallback.to_string() + } else { + class_name + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn parse_file_supports_empty_dependency_version() { + let json = r#" + { + "name": "Driver Teste", + "kind": "driver", + "runtime": "python", + "schema": [ + { + "name": "channels", + "type": "list", + "defaultValue": ["A0", 1, true] + } + ], + "dependencies": [ + { "name": "numpy", "version": "" } + ] + } + "#; + + let parsed = PluginImportService::parse_file(json).expect("parse should succeed"); + assert_eq!(parsed.name, "Driver Teste"); + assert_eq!(parsed.dependencies.len(), 1); + assert_eq!(parsed.dependencies[0].name, "numpy"); + assert_eq!(parsed.dependencies[0].version, ""); + } + + #[test] + fn parse_file_generates_id_when_missing() { + let json = r#" + { + "name": "Controller Teste", + "kind": "controller", + "runtime": "python", + "schema": [] + } + "#; + + let parsed = PluginImportService::parse_file(json).expect("parse should succeed"); + assert!(parsed.id.starts_with("plugin_")); + } +} diff --git a/apps/desktop/src-tauri/src/core/services/runtime.rs b/apps/desktop/src-tauri/src/core/services/runtime.rs new file mode 100644 index 0000000..4a55b30 --- /dev/null +++ b/apps/desktop/src-tauri/src/core/services/runtime.rs @@ -0,0 +1,1636 @@ +mod bootstrap; +mod environment; +mod process; +mod validation; + +use self::bootstrap::{ + build_bootstrap_payload, build_runtime_controller_payloads, collect_runtime_setpoints, + resolve_plugin_for_runtime, resolve_runtime_components_for_connect, +}; +use self::environment::{ + compute_env_hash, dedupe_runtime_plugins, ensure_python_env, prepare_runtime_directory, + prepare_runtime_scaffold, write_bootstrap_files, write_runner_script, +}; +use self::process::{ + emit_status_event, send_command, spawn_driver_process, spawn_stderr_task, spawn_stdout_task, + wait_for_handshake, +}; +use self::validation::{ + ensure_driver_supports_write, validate_controller_plugin_source, + validate_controller_plugin_source_with_python, validate_plugin_workspace_files, + validate_python_source_file, +}; +use crate::core::error::{AppError, AppResult}; +use crate::core::models::plant::{ + ControllerRuntimeStatus, Plant, PlantController, RemovePlantControllerRequest, + SavePlantControllerConfigRequest, SavePlantSetpointRequest, +}; +use crate::core::models::plugin::{PluginRegistry, PluginRuntime, PluginType}; +use crate::core::services::plant::PlantService; +use crate::state::{PlantStore, PluginStore}; +use parking_lot::{Condvar, Mutex}; +use serde::{Deserialize, Serialize}; +use serde_json::{json, Value}; +use std::collections::HashMap; +use std::fs; +use std::path::PathBuf; +use std::process::{Child, ChildStdin}; +use std::sync::Arc; +use std::thread; +use std::time::Duration; +use tauri::{AppHandle, Runtime}; +use uuid::Uuid; + +const RUNNER_SCRIPT: &str = include_str!("../../../runtime/python/runner.py"); +const PYTHON_SYNTAX_CHECK_SCRIPT: &str = r#" +import sys +import tokenize + +path = sys.argv[1] +with tokenize.open(path) as handle: + compile(handle.read(), path, "exec") +"#; +const PYTHON_CLASS_METHOD_CHECK_SCRIPT: &str = r#" +import ast +import json +import sys +import tokenize + +path = sys.argv[1] +class_name = sys.argv[2] +required_methods = json.loads(sys.argv[3]) + +with tokenize.open(path) as handle: + tree = ast.parse(handle.read(), path) + +target_class = None +for node in tree.body: + if isinstance(node, ast.ClassDef) and node.name == class_name: + target_class = node + break + +if target_class is None: + print(f"Classe '{class_name}' não encontrada em '{path}'", file=sys.stderr) + sys.exit(2) + +declared_methods = { + node.name + for node in target_class.body + if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)) +} + +missing = [method for method in required_methods if method not in declared_methods] +if missing: + print( + f"Classe '{class_name}' não implementa os métodos obrigatórios: {', '.join(missing)}", + file=sys.stderr, + ) + sys.exit(3) +"#; +const PYTHON_IMPORT_CLASS_CHECK_SCRIPT: &str = r#" +import importlib.util +import pathlib +import sys + +source_path = pathlib.Path(sys.argv[1]) +class_name = sys.argv[2] +required_methods = [name for name in sys.argv[3:] if name] + +sys.path.insert(0, str(source_path.parent)) +module_name = f"senamby_runtime_check_{source_path.stem}" +spec = importlib.util.spec_from_file_location(module_name, source_path) +if spec is None or spec.loader is None: + print(f"Nao foi possivel carregar o modulo '{source_path}'", file=sys.stderr) + sys.exit(2) + +module = importlib.util.module_from_spec(spec) +spec.loader.exec_module(module) + +target_class = getattr(module, class_name, None) +if target_class is None: + print(f"Classe '{class_name}' nao encontrada em '{source_path}'", file=sys.stderr) + sys.exit(3) + +missing = [method for method in required_methods if not callable(getattr(target_class, method, None))] +if missing: + print( + f"Classe '{class_name}' nao implementa os metodos obrigatorios: {', '.join(missing)}", + file=sys.stderr, + ) + sys.exit(4) +"#; +const STARTUP_TIMEOUT: Duration = Duration::from_secs(12); +const SHUTDOWN_TIMEOUT: Duration = Duration::from_secs(4); + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum RuntimeLifecycleState { + #[default] + Created, + Bootstrapping, + Ready, + Connecting, + Running, + Stopping, + Stopped, + Faulted, +} + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum RuntimeCyclePhase { + #[default] + CycleStarted, + ReadInputs, + ComputeControllers, + WriteOutputs, + PublishTelemetry, + SleepUntilDeadline, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct RuntimeStatusEvent { + pub plant_id: String, + pub runtime_id: String, + pub lifecycle_state: RuntimeLifecycleState, + pub cycle_phase: RuntimeCyclePhase, + pub configured_sample_time_ms: u64, + pub effective_dt_ms: f64, + pub cycle_late: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct RuntimeTelemetryPayload { + #[serde(default)] + pub timestamp: f64, + #[serde(default)] + pub cycle_id: u64, + pub configured_sample_time_ms: u64, + #[serde(default)] + pub effective_dt_ms: f64, + #[serde(default)] + pub cycle_duration_ms: f64, + #[serde(default)] + pub read_duration_ms: f64, + #[serde(default)] + pub control_duration_ms: f64, + #[serde(default)] + pub write_duration_ms: f64, + #[serde(default)] + pub publish_duration_ms: f64, + #[serde(default)] + pub cycle_late: bool, + #[serde(default)] + pub late_by_ms: f64, + #[serde(default)] + pub phase: String, + #[serde(default)] + pub uptime_s: f64, + #[serde(default)] + pub sensors: HashMap, + #[serde(default)] + pub actuators: HashMap, + #[serde(default)] + pub actuators_read: HashMap, + #[serde(default)] + pub setpoints: HashMap, + #[serde(default)] + pub controller_outputs: HashMap, + #[serde(default)] + pub written_outputs: HashMap, + #[serde(default)] + pub controller_durations_ms: HashMap, +} + +#[derive(Debug, Clone, Serialize)] +pub struct RuntimeTelemetryEvent { + pub plant_id: String, + pub runtime_id: String, + pub lifecycle_state: RuntimeLifecycleState, + pub cycle_phase: RuntimeCyclePhase, + pub timestamp: f64, + pub cycle_id: u64, + pub configured_sample_time_ms: u64, + pub effective_dt_ms: f64, + pub cycle_duration_ms: f64, + pub read_duration_ms: f64, + pub control_duration_ms: f64, + pub write_duration_ms: f64, + pub publish_duration_ms: f64, + pub cycle_late: bool, + pub late_by_ms: f64, + pub phase: String, + pub uptime_s: f64, + pub sensors: HashMap, + pub actuators: HashMap, + pub actuators_read: HashMap, + pub setpoints: HashMap, + pub controller_outputs: HashMap, + pub written_outputs: HashMap, + pub controller_durations_ms: HashMap, +} + +#[derive(Debug, Default, Clone)] +struct RuntimeMetrics { + lifecycle_state: RuntimeLifecycleState, + cycle_phase: RuntimeCyclePhase, + effective_dt_ms: f64, + cycle_duration_ms: f64, + read_duration_ms: f64, + uptime_s: f64, + cycle_late: bool, + late_cycle_count: u64, + last_telemetry_at: Option, +} + +#[derive(Debug, Default)] +struct HandshakeState { + ready: bool, + connected: bool, + error: Option, +} + +type SharedHandshake = Arc<(Mutex, Condvar)>; +type SharedMetrics = Arc>; + +#[allow( + clippy::cast_possible_truncation, + clippy::cast_precision_loss, + clippy::cast_sign_loss +)] +fn saturating_f64_to_u64(value: f64) -> u64 { + if !value.is_finite() || value <= 0.0 { + return 0; + } + + value.floor().clamp(0.0, u64::MAX as f64) as u64 +} + +fn duration_millis_u64(duration: Duration) -> u64 { + u64::try_from(duration.as_millis()).unwrap_or(u64::MAX) +} + +#[derive(Debug, Deserialize)] +struct RuntimeEnvelope { + #[serde(rename = "type")] + msg_type: String, + #[serde(default)] + payload: Value, +} + +#[derive(Debug, Serialize, Clone)] +struct DriverBootstrapVariable { + id: String, + name: String, + #[serde(rename = "type")] + var_type: crate::core::models::plant::VariableType, + unit: String, + setpoint: f64, + pv_min: f64, + pv_max: f64, + #[serde(default)] + linked_sensor_ids: Vec, +} + +#[derive(Debug, Serialize, Clone)] +struct DriverBootstrapPlant { + id: String, + name: String, + variables: Vec, + sensor_ids: Vec, + actuator_ids: Vec, + setpoints: HashMap, +} + +#[derive(Debug, Serialize, Clone)] +struct DriverBootstrapRuntimeTiming { + owner: &'static str, + clock: &'static str, + strategy: &'static str, + sample_time_ms: u64, +} + +#[derive(Debug, Serialize, Clone)] +struct DriverBootstrapRuntimeSupervision { + owner: &'static str, + startup_timeout_ms: u64, + shutdown_timeout_ms: u64, +} + +#[derive(Debug, Serialize, Clone)] +struct DriverBootstrapRuntimePaths { + runtime_dir: String, + venv_python_path: String, + runner_path: String, + bootstrap_path: String, +} + +#[derive(Debug, Serialize, Clone)] +struct DriverBootstrapRuntime { + id: String, + timing: DriverBootstrapRuntimeTiming, + supervision: DriverBootstrapRuntimeSupervision, + paths: DriverBootstrapRuntimePaths, +} + +#[derive(Debug, Serialize, Clone)] +struct DriverBootstrapDriver { + plugin_id: String, + plugin_name: String, + plugin_dir: String, + source_file: String, + class_name: String, + config: Value, +} + +#[derive(Debug, Serialize, Clone)] +struct DriverBootstrapController { + id: String, + plugin_id: String, + plugin_name: String, + plugin_dir: String, + source_file: String, + class_name: String, + name: String, + controller_type: String, + active: bool, + input_variable_ids: Vec, + output_variable_ids: Vec, + params: Value, +} + +#[derive(Debug, Serialize, Clone)] +struct DriverBootstrapPayload { + driver: DriverBootstrapDriver, + controllers: Vec, + plant: DriverBootstrapPlant, + runtime: DriverBootstrapRuntime, +} + +#[derive(Debug, Clone)] +struct ResolvedRuntimeController { + instance: PlantController, + plugin: PluginRegistry, + plugin_dir: PathBuf, +} + +#[derive(Debug)] +struct RuntimeHandle { + plant_id: String, + runtime_id: String, + runtime_dir: PathBuf, + venv_python_path: PathBuf, + configured_sample_time_ms: u64, + stdin: Arc>, + child: Child, + stdout_task: Option>, + stderr_task: Option>, + metrics: SharedMetrics, +} + +#[derive(Debug)] +pub struct PlantRuntimeManager { + handles: Mutex>, +} + +impl PlantRuntimeManager { + pub fn new() -> Self { + Self { + handles: Mutex::new(HashMap::new()), + } + } + + pub fn apply_live_stats(&self, mut plant: Plant) -> Plant { + let handles = self.handles.lock(); + let Some(handle) = handles.get(&plant.id) else { + return plant; + }; + let metrics = handle.metrics.lock(); + plant.stats.dt = (metrics.effective_dt_ms / 1000.0).max(0.0); + plant.stats.uptime = saturating_f64_to_u64(metrics.uptime_s); + plant + } + + pub fn apply_live_stats_batch(&self, plants: Vec) -> Vec { + plants + .into_iter() + .map(|plant| self.apply_live_stats(plant)) + .collect() + } + + #[allow(clippy::too_many_lines)] + fn start_runtime( + &self, + app: &AppHandle, + plant: &Plant, + driver_plugin: &PluginRegistry, + active_controllers: &[ResolvedRuntimeController], + runtime_plugins: Vec, + ) -> AppResult<()> { + if self.handles.lock().contains_key(&plant.id) { + return Err(AppError::InvalidArgument(format!( + "Planta '{}' já está em execução", + plant.id + ))); + } + + if driver_plugin.plugin_type != PluginType::Driver { + return Err(AppError::InvalidArgument( + "Plugin selecionado não é um driver".into(), + )); + } + + if driver_plugin.runtime != PluginRuntime::Python { + return Err(AppError::InvalidArgument( + "A runtime de driver atual suporta apenas plugins Python".into(), + )); + } + + let runtime_id = format!("rt_{}", Uuid::new_v4().simple()); + let runtime_plugins = dedupe_runtime_plugins(runtime_plugins); + let env_hash = compute_env_hash(&runtime_plugins); + let venv_python_path = ensure_python_env(&runtime_plugins, &env_hash)?; + + let driver_dir = crate::core::services::workspace::WorkspaceService::plugin_directory( + &driver_plugin.name, + PluginType::Driver, + )?; + validate_plugin_workspace_files(&driver_dir, "driver")?; + validate_python_source_file(&venv_python_path, &driver_dir.join("main.py"), "driver")?; + if !active_controllers.is_empty() { + ensure_driver_supports_write(driver_plugin)?; + } + for controller in active_controllers { + validate_plugin_workspace_files(&controller.plugin_dir, "controlador")?; + validate_python_source_file( + &venv_python_path, + &controller.plugin_dir.join("main.py"), + &format!("controlador '{}'", controller.instance.name), + )?; + } + + let runtime_root = prepare_runtime_directory()?; + let runtime_dir = + crate::core::services::workspace::WorkspaceService::runtime_directory(&runtime_id)?; + prepare_runtime_scaffold(&runtime_dir)?; + + let startup_result = (|| -> AppResult { + let runner_path = write_runner_script(&runtime_root)?; + let bootstrap_path = runtime_dir.join("bootstrap.json"); + let bootstrap = build_bootstrap_payload( + &runtime_id, + plant, + driver_plugin, + &driver_dir, + active_controllers, + &runtime_dir, + &venv_python_path, + &runner_path, + &bootstrap_path, + duration_millis_u64(STARTUP_TIMEOUT), + duration_millis_u64(SHUTDOWN_TIMEOUT), + )?; + write_bootstrap_files(&bootstrap, &bootstrap_path)?; + + let mut child = spawn_driver_process( + &venv_python_path, + &runner_path, + &runtime_dir, + &bootstrap_path, + )?; + + let stdin = child.stdin.take().ok_or(AppError::InternalError)?; + let stdout = child.stdout.take().ok_or(AppError::InternalError)?; + let stderr = child.stderr.take().ok_or(AppError::InternalError)?; + + let shared_stdin = Arc::new(Mutex::new(stdin)); + let metrics = Arc::new(Mutex::new(RuntimeMetrics { + lifecycle_state: RuntimeLifecycleState::Bootstrapping, + cycle_phase: RuntimeCyclePhase::CycleStarted, + ..RuntimeMetrics::default() + })); + let handshake = Arc::new((Mutex::new(HandshakeState::default()), Condvar::new())); + + let stdout_task = spawn_stdout_task( + app.clone(), + plant.id.clone(), + runtime_id.clone(), + plant.sample_time_ms, + stdout, + handshake.clone(), + metrics.clone(), + ); + let stderr_task = spawn_stderr_task(plant.id.clone(), runtime_id.clone(), stderr); + + let startup = (|| -> AppResult<()> { + send_command( + &shared_stdin, + "init", + Some(serde_json::to_value(&bootstrap).map_err(|error| { + AppError::IoError(format!("Falha ao serializar payload init: {error}")) + })?), + )?; + send_command(&shared_stdin, "start", None)?; + wait_for_handshake(&handshake, STARTUP_TIMEOUT) + })(); + + if let Err(error) = startup { + let _ = send_command(&shared_stdin, "shutdown", None); + let _ = child.kill(); + let _ = child.wait(); + let _ = stdout_task.join(); + let _ = stderr_task.join(); + return Err(error); + } + + Ok(RuntimeHandle { + plant_id: plant.id.clone(), + runtime_id: runtime_id.clone(), + runtime_dir: runtime_dir.clone(), + venv_python_path: venv_python_path.clone(), + configured_sample_time_ms: plant.sample_time_ms, + stdin: shared_stdin, + child, + stdout_task: Some(stdout_task), + stderr_task: Some(stderr_task), + metrics, + }) + })(); + + let handle = match startup_result { + Ok(handle) => handle, + Err(error) => { + let _ = fs::remove_dir_all(&runtime_dir); + return Err(error); + } + }; + + self.handles.lock().insert(plant.id.clone(), handle); + Ok(()) + } + + pub fn stop_runtime(&self, app: &AppHandle, plant_id: &str) { + let handle = { + let mut handles = self.handles.lock(); + handles.remove(plant_id) + }; + + let Some(mut handle) = handle else { + return; + }; + + let _ = send_command(&handle.stdin, "shutdown", None); + + let started_wait = std::time::Instant::now(); + loop { + match handle.child.try_wait() { + Ok(Some(_status)) => break, + Ok(None) => { + if started_wait.elapsed() > SHUTDOWN_TIMEOUT { + let _ = handle.child.kill(); + let _ = handle.child.wait(); + break; + } + thread::sleep(Duration::from_millis(100)); + } + Err(_) => break, + } + } + + if let Some(task) = handle.stdout_task.take() { + let _ = task.join(); + } + if let Some(task) = handle.stderr_task.take() { + let _ = task.join(); + } + + let _ = fs::remove_dir_all(&handle.runtime_dir); + + emit_status_event( + app, + RuntimeStatusEvent { + plant_id: handle.plant_id, + runtime_id: handle.runtime_id, + lifecycle_state: RuntimeLifecycleState::Stopped, + cycle_phase: RuntimeCyclePhase::SleepUntilDeadline, + configured_sample_time_ms: handle.configured_sample_time_ms, + effective_dt_ms: handle.metrics.lock().effective_dt_ms, + cycle_late: false, + }, + ); + } + + pub fn update_setpoints( + &self, + plant_id: &str, + setpoints: &HashMap, + ) -> AppResult<()> { + let payload = serde_json::to_value(json!({ "setpoints": setpoints })).map_err(|error| { + AppError::IoError(format!( + "Falha ao serializar atualização de setpoints: {error}" + )) + })?; + self.send_runtime_command_with_payload(plant_id, "update_setpoints", payload) + } + + fn update_controllers( + &self, + plant_id: &str, + controllers: &[DriverBootstrapController], + ) -> AppResult<()> { + let payload = + serde_json::to_value(json!({ "controllers": controllers })).map_err(|error| { + AppError::IoError(format!( + "Falha ao serializar atualização de controladores: {error}" + )) + })?; + self.send_runtime_command_with_payload(plant_id, "update_controllers", payload) + } + + fn venv_python_path(&self, plant_id: &str) -> AppResult { + let handles = self.handles.lock(); + let handle = handles.get(plant_id).ok_or_else(|| { + AppError::NotFound(format!( + "Runtime da planta '{plant_id}' não está em execução" + )) + })?; + Ok(handle.venv_python_path.clone()) + } + + fn send_runtime_command_with_payload( + &self, + plant_id: &str, + msg_type: &str, + payload: Value, + ) -> AppResult<()> { + let stdin = { + let handles = self.handles.lock(); + let handle = handles.get(plant_id).ok_or_else(|| { + AppError::NotFound(format!( + "Runtime da planta '{plant_id}' não está em execução" + )) + })?; + handle.stdin.clone() + }; + + let payload = if payload.is_null() { + None + } else { + Some(payload) + }; + send_command(&stdin, msg_type, payload) + } +} + +fn persist_runtime_statuses(plant: &Plant) -> AppResult<()> { + crate::core::services::workspace::WorkspaceService::update_plant_registry(plant, &plant.name) +} + +fn set_all_controller_runtime_statuses( + plants: &PlantStore, + plant_id: &str, + status: ControllerRuntimeStatus, +) -> AppResult { + let updated = plants.update(plant_id, |plant| { + for controller in &mut plant.controllers { + controller.runtime_status = status; + } + })?; + persist_runtime_statuses(&updated)?; + Ok(updated) +} + +fn set_pending_controller_runtime_statuses( + plants: &PlantStore, + plant_id: &str, + pending_ids: &[String], +) -> AppResult { + let pending_lookup = pending_ids + .iter() + .cloned() + .collect::>(); + let updated = plants.update(plant_id, |plant| { + for controller in &mut plant.controllers { + controller.runtime_status = + if controller.active && pending_lookup.contains(&controller.id) { + ControllerRuntimeStatus::PendingRestart + } else { + ControllerRuntimeStatus::Synced + }; + } + })?; + persist_runtime_statuses(&updated)?; + Ok(updated) +} + +fn collect_incompatible_active_controller_ids( + python_path: &std::path::Path, + active_controllers: &[ResolvedRuntimeController], +) -> Vec { + active_controllers + .iter() + .filter_map(|controller| { + validate_controller_plugin_source_with_python( + python_path, + &controller.plugin, + &controller.instance.name, + ) + .err() + .map(|_| controller.instance.id.clone()) + }) + .collect() +} + +pub struct DriverRuntimeService; + +impl DriverRuntimeService { + pub fn connect( + app: &AppHandle, + plants: &PlantStore, + plugins: &PluginStore, + manager: &PlantRuntimeManager, + plant_id: &str, + ) -> AppResult { + let plant = plants.get(plant_id)?; + + if plant.connected { + return Err(AppError::InvalidArgument( + "Planta já está conectada".to_string(), + )); + } + + let (plant, driver, active_controllers, runtime_plugins) = + resolve_runtime_components_for_connect(plants, plugins, plant)?; + manager.start_runtime(app, &plant, &driver, &active_controllers, runtime_plugins)?; + + let updated = plants.update(plant_id, |plant| { + plant.connected = true; + plant.paused = false; + for controller in &mut plant.controllers { + controller.runtime_status = ControllerRuntimeStatus::Synced; + } + })?; + persist_runtime_statuses(&updated)?; + Ok(updated) + } + + pub fn disconnect( + app: &AppHandle, + plants: &PlantStore, + manager: &PlantRuntimeManager, + plant_id: &str, + ) -> AppResult { + manager.stop_runtime(app, plant_id); + + plants.update(plant_id, |plant| { + plant.connected = false; + plant.paused = false; + }) + } + + pub fn close( + app: &AppHandle, + plants: &PlantStore, + manager: &PlantRuntimeManager, + plant_id: &str, + ) -> AppResult { + plants.read(plant_id, |_| ())?; + manager.stop_runtime(app, plant_id); + let mut plant = PlantService::close(plants, plant_id)?; + plant.connected = false; + plant.paused = false; + Ok(plant) + } + + pub fn remove( + app: &AppHandle, + plants: &PlantStore, + manager: &PlantRuntimeManager, + plant_id: &str, + ) -> AppResult { + plants.read(plant_id, |_| ())?; + manager.stop_runtime(app, plant_id); + let mut plant = PlantService::remove(plants, plant_id)?; + plant.connected = false; + plant.paused = false; + Ok(plant) + } + + pub fn pause( + plants: &PlantStore, + _manager: &PlantRuntimeManager, + plant_id: &str, + ) -> AppResult { + let plant = plants.get(plant_id)?; + + if !plant.connected { + return Err(AppError::InvalidArgument( + "Planta precisa estar conectada para pausar".to_string(), + )); + } + + if plant.paused { + return Ok(plant); + } + + plants.update(plant_id, |plant| { + plant.paused = true; + }) + } + + pub fn resume( + plants: &PlantStore, + _manager: &PlantRuntimeManager, + plant_id: &str, + ) -> AppResult { + let plant = plants.get(plant_id)?; + + if !plant.connected { + return Err(AppError::InvalidArgument( + "Planta precisa estar conectada para retomar".to_string(), + )); + } + + if !plant.paused { + return Ok(plant); + } + + plants.update(plant_id, |plant| { + plant.paused = false; + }) + } + + pub fn save_setpoint( + plants: &PlantStore, + manager: &PlantRuntimeManager, + request: &SavePlantSetpointRequest, + ) -> AppResult { + let plant = crate::core::services::plant::PlantService::save_setpoint(plants, request)?; + + if plant.connected { + let setpoints = collect_runtime_setpoints(&plant); + manager.update_setpoints(&plant.id, &setpoints)?; + } + + Ok(plant) + } + + pub fn save_controller_config( + plants: &PlantStore, + plugins: &PluginStore, + manager: &PlantRuntimeManager, + request: SavePlantControllerConfigRequest, + ) -> AppResult { + let current_plant = plants.get(&request.plant_id)?; + let existing_controller = current_plant + .controllers + .iter() + .find(|controller| controller.id == request.controller_id) + .cloned(); + let will_have_active_controllers = current_plant + .controllers + .iter() + .any(|controller| controller.id != request.controller_id && controller.active) + || request.active; + + if will_have_active_controllers { + let mut loaded_from_workspace = false; + let driver_plugin = resolve_plugin_for_runtime( + plugins, + ¤t_plant.driver.plugin_id, + ¤t_plant.driver.plugin_name, + PluginType::Driver, + &mut loaded_from_workspace, + )? + .ok_or_else(|| { + AppError::NotFound(format!( + "Driver da planta '{}' não foi encontrado", + current_plant.name + )) + })?; + ensure_driver_supports_write(&driver_plugin)?; + } + + if current_plant.connected && request.active { + let mut loaded_from_workspace = false; + let controller_plugin_id = request + .plugin_id + .as_deref() + .filter(|value| !value.trim().is_empty()) + .or_else(|| { + existing_controller + .as_ref() + .map(|controller| controller.plugin_id.as_str()) + }) + .unwrap_or_default(); + let controller_plugin_name = existing_controller + .as_ref() + .map(|controller| controller.plugin_name.as_str()) + .unwrap_or_default(); + let controller_plugin = resolve_plugin_for_runtime( + plugins, + controller_plugin_id, + controller_plugin_name, + PluginType::Controller, + &mut loaded_from_workspace, + )? + .ok_or_else(|| { + AppError::NotFound(format!( + "Plugin do controlador '{}' não foi encontrado", + request.name.trim() + )) + })?; + validate_controller_plugin_source(&controller_plugin, request.name.trim())?; + } + + let plant = crate::core::services::plant::PlantService::save_controller_config( + plants, plugins, request, + )?; + + if plant.connected { + let (resolved_plant, _driver, active_controllers, _runtime_plugins) = + resolve_runtime_components_for_connect(plants, plugins, plant)?; + let incompatible_controller_ids = match manager.venv_python_path(&resolved_plant.id) { + Ok(python_path) => { + collect_incompatible_active_controller_ids(&python_path, &active_controllers) + } + Err(_) => active_controllers + .iter() + .map(|controller| controller.instance.id.clone()) + .collect(), + }; + + if incompatible_controller_ids.is_empty() { + let controller_payloads = build_runtime_controller_payloads(&active_controllers)?; + manager.update_controllers(&resolved_plant.id, &controller_payloads)?; + return set_all_controller_runtime_statuses( + plants, + &resolved_plant.id, + ControllerRuntimeStatus::Synced, + ); + } + + return set_pending_controller_runtime_statuses( + plants, + &resolved_plant.id, + &incompatible_controller_ids, + ); + } + + Ok(plant) + } + + pub fn remove_controller( + plants: &PlantStore, + plugins: &PluginStore, + manager: &PlantRuntimeManager, + request: &RemovePlantControllerRequest, + ) -> AppResult { + plants.read(&request.plant_id, |plant| { + let controller = plant + .controllers + .iter() + .find(|controller| controller.id == request.controller_id) + .ok_or_else(|| { + AppError::NotFound(format!( + "Controlador '{}' não encontrado na planta '{}'", + request.controller_id, plant.name + )) + })?; + + if plant.connected + && controller.active + && controller.runtime_status == ControllerRuntimeStatus::Synced + { + return Err(AppError::InvalidArgument( + "Não é permitido remover um controlador em execução. Desative-o antes.".into(), + )); + } + + Ok(()) + })??; + + let plant = crate::core::services::plant::PlantService::remove_controller(plants, request)?; + + if plant.connected { + let (resolved_plant, _driver, active_controllers, _runtime_plugins) = + resolve_runtime_components_for_connect(plants, plugins, plant)?; + let incompatible_controller_ids = match manager.venv_python_path(&resolved_plant.id) { + Ok(python_path) => { + collect_incompatible_active_controller_ids(&python_path, &active_controllers) + } + Err(_) => active_controllers + .iter() + .map(|controller| controller.instance.id.clone()) + .collect(), + }; + + if incompatible_controller_ids.is_empty() { + let controller_payloads = build_runtime_controller_payloads(&active_controllers)?; + manager.update_controllers(&resolved_plant.id, &controller_payloads)?; + return set_all_controller_runtime_statuses( + plants, + &resolved_plant.id, + ControllerRuntimeStatus::Synced, + ); + } + + return set_pending_controller_runtime_statuses( + plants, + &resolved_plant.id, + &incompatible_controller_ids, + ); + } + + Ok(plant) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::core::models::plant::{ + ControllerParam, ControllerParamType, ControllerRuntimeStatus, PlantDriver, PlantStats, + PlantVariable, RemovePlantControllerRequest, SavePlantControllerConfigRequest, + SavePlantControllerParamRequest, VariableType, + }; + use crate::core::models::plugin::{ + PluginRegistry, PluginRuntime, PluginType, SchemaFieldValue, + }; + use crate::core::services::workspace::{test_workspace_root, WorkspaceService}; + use parking_lot::Mutex; + use std::collections::HashMap; + use std::fs; + use std::path::{Path, PathBuf}; + use std::process::{Command, Stdio}; + + fn plant_registry_path(name: &str) -> PathBuf { + test_workspace_root() + .join("plants") + .join(name) + .join("registry.json") + } + + fn create_test_plant(id: &str, name: &str) -> Plant { + Plant { + id: id.to_string(), + name: name.to_string(), + sample_time_ms: 100, + variables: vec![ + PlantVariable { + id: "var_0".to_string(), + name: "Temperatura".to_string(), + var_type: VariableType::Sensor, + unit: "C".to_string(), + setpoint: 42.0, + pv_min: 0.0, + pv_max: 100.0, + linked_sensor_ids: None, + }, + PlantVariable { + id: "var_1".to_string(), + name: "Valvula".to_string(), + var_type: VariableType::Atuador, + unit: "%".to_string(), + setpoint: 0.0, + pv_min: 0.0, + pv_max: 100.0, + linked_sensor_ids: Some(vec!["var_0".to_string()]), + }, + ], + driver: PlantDriver { + plugin_id: "driver_plugin".to_string(), + plugin_name: "Driver Python".to_string(), + runtime: PluginRuntime::Python, + source_file: Some("main.py".to_string()), + source_code: None, + config: HashMap::new(), + }, + controllers: Vec::new(), + connected: true, + paused: false, + stats: PlantStats::default(), + } + } + + fn find_test_python() -> String { + ["python3", "python"] + .into_iter() + .find(|candidate| Command::new(candidate).arg("--version").output().is_ok()) + .expect("python nao encontrado para teste de runtime") + .to_string() + } + + fn spawn_runtime_test_child() -> std::process::Child { + Command::new(find_test_python()) + .arg("-c") + .arg("import sys; sys.stdin.readline()") + .stdin(Stdio::piped()) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .spawn() + .expect("falha ao criar processo de teste da runtime") + } + + fn spawn_runtime_capture_child(commands_path: &Path) -> std::process::Child { + Command::new(find_test_python()) + .arg("-c") + .arg( + "import pathlib, sys\npath = pathlib.Path(sys.argv[1])\nwith path.open('w', encoding='utf-8') as handle:\n for line in sys.stdin:\n handle.write(line)\n handle.flush()\n", + ) + .arg(commands_path) + .stdin(Stdio::piped()) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .spawn() + .expect("falha ao criar processo de captura da runtime") + } + + fn read_captured_commands(commands_path: &Path) -> String { + std::thread::sleep(Duration::from_millis(50)); + fs::read_to_string(commands_path).unwrap_or_default() + } + + fn create_test_plugin( + id: &str, + name: &str, + plugin_type: PluginType, + entry_class: &str, + ) -> PluginRegistry { + PluginRegistry { + id: id.to_string(), + name: name.to_string(), + plugin_type, + runtime: PluginRuntime::Python, + entry_class: entry_class.to_string(), + schema: vec![], + source_file: Some("main.py".to_string()), + source_code: None, + dependencies: vec![], + description: None, + version: None, + author: None, + } + } + + fn save_test_plugin(plugin: &PluginRegistry, source_code: &str) { + WorkspaceService::save_plugin_registry(plugin, source_code).unwrap(); + } + + fn insert_runtime_handle( + manager: &PlantRuntimeManager, + plant: &Plant, + runtime_id: &str, + commands_path: &Path, + ) -> PathBuf { + let runtime_dir = WorkspaceService::runtime_directory(runtime_id).unwrap(); + fs::create_dir_all(&runtime_dir).unwrap(); + + let mut child = spawn_runtime_capture_child(commands_path); + let stdin = child + .stdin + .take() + .expect("stdin ausente no processo de captura"); + + manager.handles.lock().insert( + plant.id.clone(), + RuntimeHandle { + plant_id: plant.id.clone(), + runtime_id: runtime_id.to_string(), + runtime_dir: runtime_dir.clone(), + venv_python_path: PathBuf::from(find_test_python()), + configured_sample_time_ms: plant.sample_time_ms, + stdin: Arc::new(Mutex::new(stdin)), + child, + stdout_task: None, + stderr_task: None, + metrics: Arc::new(Mutex::new(RuntimeMetrics::default())), + }, + ); + + runtime_dir + } + + #[test] + fn close_plant_stops_runtime_and_preserves_registry() { + let suffix = Uuid::new_v4().simple().to_string(); + let store = Arc::new(PlantStore::new()); + let manager = PlantRuntimeManager::new(); + let plant = create_test_plant( + &format!("plant_close_{suffix}"), + &format!("Plant Close Runtime {suffix}"), + ); + WorkspaceService::save_plant_registry(&plant).unwrap(); + store.insert(plant.clone()).unwrap(); + + let runtime_id = format!("rt_close_test_{suffix}"); + let runtime_dir = WorkspaceService::runtime_directory(&runtime_id).unwrap(); + fs::create_dir_all(&runtime_dir).unwrap(); + fs::write(runtime_dir.join("marker.txt"), "runtime-alive").unwrap(); + + let mut child = spawn_runtime_test_child(); + let stdin = child + .stdin + .take() + .expect("stdin ausente no processo de teste"); + + manager.handles.lock().insert( + plant.id.clone(), + RuntimeHandle { + plant_id: plant.id.clone(), + runtime_id, + runtime_dir: runtime_dir.clone(), + venv_python_path: PathBuf::from(find_test_python()), + configured_sample_time_ms: plant.sample_time_ms, + stdin: Arc::new(Mutex::new(stdin)), + child, + stdout_task: None, + stderr_task: None, + metrics: Arc::new(Mutex::new(RuntimeMetrics::default())), + }, + ); + + let app = tauri::test::mock_app(); + let closed = + DriverRuntimeService::close(app.handle(), store.as_ref(), &manager, &plant.id).unwrap(); + + assert_eq!(closed.id, plant.id); + assert!(!closed.connected); + assert!(!closed.paused); + assert!(!store.exists(&plant.id)); + assert!(plant_registry_path(&plant.name).exists()); + assert!(!runtime_dir.exists()); + assert!(manager.handles.lock().is_empty()); + } + + #[test] + fn save_controller_config_hot_updates_running_runtime_when_controller_is_loadable() { + let suffix = Uuid::new_v4().simple().to_string(); + let store = Arc::new(PlantStore::new()); + let plugins = PluginStore::new(); + let manager = PlantRuntimeManager::new(); + let app = tauri::test::mock_app(); + + let driver_plugin = create_test_plugin( + &format!("driver_plugin_{suffix}"), + &format!("Driver Python {suffix}"), + PluginType::Driver, + "DriverPython", + ); + save_test_plugin( + &driver_plugin, + r#" +class DriverPython: + def __init__(self, context): + self.context = context + def connect(self): + return True + def stop(self): + return True + def read(self): + return {"sensors": {"sensor_1": 1.0}, "actuators": {"actuator_1": 0.0}} + def write(self, outputs): + return True +"#, + ); + plugins.insert(driver_plugin.clone()).unwrap(); + + let controller_plugin = create_test_plugin( + &format!("controller_plugin_{suffix}"), + &format!("Controller Python {suffix}"), + PluginType::Controller, + "ControllerPython", + ); + save_test_plugin( + &controller_plugin, + r#" +class ControllerPython: + def __init__(self, context): + self.context = context + def compute(self, snapshot): + return {"actuator_1": 1.0} +"#, + ); + plugins.insert(controller_plugin.clone()).unwrap(); + + let mut plant = create_test_plant( + &format!("plant_sync_{suffix}"), + &format!("Plant Sync {suffix}"), + ); + plant.driver.plugin_id = driver_plugin.id.clone(); + plant.driver.plugin_name = driver_plugin.name.clone(); + WorkspaceService::save_plant_registry(&plant).unwrap(); + store.insert(plant.clone()).unwrap(); + + let commands_path = + std::env::temp_dir().join(format!("senamby_runtime_sync_commands_{suffix}.jsonl")); + let _ = fs::remove_file(&commands_path); + insert_runtime_handle( + &manager, + &plant, + &format!("rt_sync_test_{suffix}"), + &commands_path, + ); + + let saved = DriverRuntimeService::save_controller_config( + store.as_ref(), + &plugins, + &manager, + SavePlantControllerConfigRequest { + plant_id: plant.id.clone(), + controller_id: "ctrl_sync".to_string(), + plugin_id: Some(controller_plugin.id.clone()), + name: "Controller Sync".to_string(), + controller_type: "PID".to_string(), + active: true, + input_variable_ids: vec!["var_0".to_string()], + output_variable_ids: vec!["var_1".to_string()], + params: vec![SavePlantControllerParamRequest { + key: "kp".to_string(), + param_type: ControllerParamType::Number, + value: SchemaFieldValue::Float(1.2), + label: "Kp".to_string(), + }], + }, + ) + .unwrap(); + + assert_eq!(saved.controllers.len(), 1); + assert!(saved.controllers[0].active); + assert_eq!( + saved.controllers[0].runtime_status, + ControllerRuntimeStatus::Synced + ); + assert!(read_captured_commands(&commands_path).contains("\"type\":\"update_controllers\"")); + + manager.stop_runtime(app.handle(), &plant.id); + } + + #[test] + fn save_controller_config_marks_controller_pending_restart_when_current_env_cannot_load_it() { + let suffix = Uuid::new_v4().simple().to_string(); + let store = Arc::new(PlantStore::new()); + let plugins = PluginStore::new(); + let manager = PlantRuntimeManager::new(); + let app = tauri::test::mock_app(); + + let driver_plugin = create_test_plugin( + &format!("driver_plugin_{suffix}"), + &format!("Driver Python {suffix}"), + PluginType::Driver, + "DriverPython", + ); + save_test_plugin( + &driver_plugin, + r#" +class DriverPython: + def __init__(self, context): + self.context = context + def connect(self): + return True + def stop(self): + return True + def read(self): + return {"sensors": {"sensor_1": 1.0}, "actuators": {"actuator_1": 0.0}} + def write(self, outputs): + return True +"#, + ); + plugins.insert(driver_plugin.clone()).unwrap(); + + let controller_plugin = create_test_plugin( + &format!("controller_plugin_pending_{suffix}"), + &format!("Controller Pending {suffix}"), + PluginType::Controller, + "ControllerPending", + ); + save_test_plugin( + &controller_plugin, + r#" +import dependency_that_does_not_exist_for_senamby_test + +class ControllerPending: + def __init__(self, context): + self.context = context + def compute(self, snapshot): + return {"actuator_1": 1.0} +"#, + ); + plugins.insert(controller_plugin.clone()).unwrap(); + + let mut plant = create_test_plant( + &format!("plant_pending_{suffix}"), + &format!("Plant Pending {suffix}"), + ); + plant.driver.plugin_id = driver_plugin.id.clone(); + plant.driver.plugin_name = driver_plugin.name.clone(); + WorkspaceService::save_plant_registry(&plant).unwrap(); + store.insert(plant.clone()).unwrap(); + + let commands_path = + std::env::temp_dir().join(format!("senamby_runtime_pending_commands_{suffix}.jsonl")); + let _ = fs::remove_file(&commands_path); + insert_runtime_handle( + &manager, + &plant, + &format!("rt_pending_test_{suffix}"), + &commands_path, + ); + + let saved = DriverRuntimeService::save_controller_config( + store.as_ref(), + &plugins, + &manager, + SavePlantControllerConfigRequest { + plant_id: plant.id.clone(), + controller_id: "ctrl_pending".to_string(), + plugin_id: Some(controller_plugin.id.clone()), + name: "Controller Pending".to_string(), + controller_type: "PID".to_string(), + active: true, + input_variable_ids: vec!["var_0".to_string()], + output_variable_ids: vec!["var_1".to_string()], + params: vec![SavePlantControllerParamRequest { + key: "kp".to_string(), + param_type: ControllerParamType::Number, + value: SchemaFieldValue::Float(1.2), + label: "Kp".to_string(), + }], + }, + ) + .unwrap(); + + assert_eq!(saved.controllers.len(), 1); + assert_eq!( + saved.controllers[0].runtime_status, + ControllerRuntimeStatus::PendingRestart + ); + assert!(!read_captured_commands(&commands_path).contains("\"type\":\"update_controllers\"")); + + manager.stop_runtime(app.handle(), &plant.id); + } + + #[test] + fn remove_controller_rejects_active_synced_controller_while_runtime_is_running() { + let suffix = Uuid::new_v4().simple().to_string(); + let store = Arc::new(PlantStore::new()); + let plugins = PluginStore::new(); + let manager = PlantRuntimeManager::new(); + + let mut plant = create_test_plant( + &format!("plant_remove_active_{suffix}"), + &format!("Plant Remove Active {suffix}"), + ); + plant.controllers.push(PlantController { + id: "ctrl_running".to_string(), + plugin_id: "controller_plugin".to_string(), + plugin_name: "Controller Running".to_string(), + name: "Controller Running".to_string(), + controller_type: "PID".to_string(), + active: true, + input_variable_ids: vec!["var_0".to_string()], + output_variable_ids: vec!["var_1".to_string()], + params: HashMap::from([( + "kp".to_string(), + ControllerParam { + param_type: ControllerParamType::Number, + value: SchemaFieldValue::Float(1.0), + label: "Kp".to_string(), + }, + )]), + runtime_status: ControllerRuntimeStatus::Synced, + }); + WorkspaceService::save_plant_registry(&plant).unwrap(); + store.insert(plant.clone()).unwrap(); + + let error = DriverRuntimeService::remove_controller( + store.as_ref(), + &plugins, + &manager, + &RemovePlantControllerRequest { + plant_id: plant.id.clone(), + controller_id: "ctrl_running".to_string(), + }, + ) + .unwrap_err(); + + assert!(matches!(error, AppError::InvalidArgument(_))); + assert!(error.to_string().contains("Desative-o antes")); + } + + #[test] + fn remove_controller_allows_inactive_controller_and_updates_runtime() { + let suffix = Uuid::new_v4().simple().to_string(); + let store = Arc::new(PlantStore::new()); + let plugins = PluginStore::new(); + let manager = PlantRuntimeManager::new(); + let app = tauri::test::mock_app(); + + let driver_plugin = create_test_plugin( + &format!("driver_plugin_{suffix}"), + &format!("Driver Python {suffix}"), + PluginType::Driver, + "DriverPython", + ); + save_test_plugin( + &driver_plugin, + r#" +class DriverPython: + def __init__(self, context): + self.context = context + def connect(self): + return True + def stop(self): + return True + def read(self): + return {"sensors": {"sensor_1": 1.0}, "actuators": {"actuator_1": 0.0}} + def write(self, outputs): + return True +"#, + ); + plugins.insert(driver_plugin.clone()).unwrap(); + + let mut plant = create_test_plant( + &format!("plant_remove_inactive_{suffix}"), + &format!("Plant Remove Inactive {suffix}"), + ); + plant.driver.plugin_id = driver_plugin.id.clone(); + plant.driver.plugin_name = driver_plugin.name.clone(); + plant.controllers.push(PlantController { + id: "ctrl_idle".to_string(), + plugin_id: "controller_idle".to_string(), + plugin_name: "Controller Idle".to_string(), + name: "Controller Idle".to_string(), + controller_type: "PID".to_string(), + active: false, + input_variable_ids: vec!["var_0".to_string()], + output_variable_ids: vec!["var_1".to_string()], + params: HashMap::new(), + runtime_status: ControllerRuntimeStatus::Synced, + }); + WorkspaceService::save_plant_registry(&plant).unwrap(); + store.insert(plant.clone()).unwrap(); + + let commands_path = + std::env::temp_dir().join(format!("senamby_runtime_remove_inactive_{suffix}.jsonl")); + let _ = fs::remove_file(&commands_path); + insert_runtime_handle( + &manager, + &plant, + &format!("rt_remove_inactive_test_{suffix}"), + &commands_path, + ); + + let updated = DriverRuntimeService::remove_controller( + store.as_ref(), + &plugins, + &manager, + &RemovePlantControllerRequest { + plant_id: plant.id.clone(), + controller_id: "ctrl_idle".to_string(), + }, + ) + .unwrap(); + + assert!(updated.controllers.is_empty()); + assert!(read_captured_commands(&commands_path).contains("\"type\":\"update_controllers\"")); + + manager.stop_runtime(app.handle(), &plant.id); + } + + #[test] + fn pause_and_resume_only_toggle_visual_state_without_sending_runtime_commands() { + let suffix = Uuid::new_v4().simple().to_string(); + let store = Arc::new(PlantStore::new()); + let manager = PlantRuntimeManager::new(); + let app = tauri::test::mock_app(); + let plant = create_test_plant( + &format!("plant_pause_{suffix}"), + &format!("Plant Pause {suffix}"), + ); + WorkspaceService::save_plant_registry(&plant).unwrap(); + store.insert(plant.clone()).unwrap(); + + let commands_path = + std::env::temp_dir().join(format!("senamby_runtime_pause_resume_{suffix}.jsonl")); + let _ = fs::remove_file(&commands_path); + insert_runtime_handle( + &manager, + &plant, + &format!("rt_pause_test_{suffix}"), + &commands_path, + ); + + let paused = DriverRuntimeService::pause(store.as_ref(), &manager, &plant.id).unwrap(); + assert!(paused.paused); + + let resumed = DriverRuntimeService::resume(store.as_ref(), &manager, &plant.id).unwrap(); + assert!(!resumed.paused); + + let captured_commands = read_captured_commands(&commands_path); + assert!(!captured_commands.contains("\"type\":\"pause\"")); + assert!(!captured_commands.contains("\"type\":\"resume\"")); + + manager.stop_runtime(app.handle(), &plant.id); + } +} diff --git a/apps/desktop/src-tauri/src/core/services/runtime/bootstrap.rs b/apps/desktop/src-tauri/src/core/services/runtime/bootstrap.rs new file mode 100644 index 0000000..2594eb2 --- /dev/null +++ b/apps/desktop/src-tauri/src/core/services/runtime/bootstrap.rs @@ -0,0 +1,303 @@ +use super::{ + DriverBootstrapController, DriverBootstrapDriver, DriverBootstrapPayload, DriverBootstrapPlant, + DriverBootstrapRuntime, DriverBootstrapRuntimePaths, DriverBootstrapRuntimeSupervision, + DriverBootstrapRuntimeTiming, DriverBootstrapVariable, ResolvedRuntimeController, +}; +use crate::core::error::{AppError, AppResult}; +use crate::core::models::plant::{Plant, VariableType}; +use crate::core::models::plugin::{PluginRegistry, PluginRuntime, PluginType}; +use crate::core::services::plant::PlantService; +use crate::core::services::plugin::PluginService; +use crate::core::services::workspace::WorkspaceService; +use crate::state::{PlantStore, PluginStore}; +use std::collections::HashMap; +use std::path::Path; + +pub(super) fn resolve_runtime_components_for_connect( + plants: &PlantStore, + plugins: &PluginStore, + mut plant: Plant, +) -> AppResult<( + Plant, + PluginRegistry, + Vec, + Vec, +)> { + let mut loaded_from_workspace = false; + let driver = resolve_plugin_for_runtime( + plugins, + &plant.driver.plugin_id, + &plant.driver.plugin_name, + PluginType::Driver, + &mut loaded_from_workspace, + )? + .ok_or_else(|| { + AppError::NotFound(format!( + "Driver da planta '{}' não foi encontrado", + plant.name + )) + })?; + + let mut plant_changed = plant.driver.plugin_id != driver.id + || plant.driver.plugin_name != driver.name + || plant.driver.runtime != driver.runtime + || plant.driver.source_file != driver.source_file; + + if driver.runtime != PluginRuntime::Python { + return Err(AppError::InvalidArgument( + "A runtime atual suporta apenas drivers Python".into(), + )); + } + + if plant_changed { + plant.driver.plugin_id.clone_from(&driver.id); + plant.driver.plugin_name.clone_from(&driver.name); + plant.driver.runtime = driver.runtime; + plant.driver.source_file.clone_from(&driver.source_file); + plant.driver.source_code = None; + } + + let mut active_controllers = Vec::new(); + let mut runtime_plugins = vec![driver.clone()]; + for controller in &mut plant.controllers { + let resolved_plugin = resolve_plugin_for_runtime( + plugins, + &controller.plugin_id, + &controller.plugin_name, + PluginType::Controller, + &mut loaded_from_workspace, + )?; + + match resolved_plugin { + Some(plugin) => { + if PlantService::fill_missing_controller_params(&mut controller.params, &plugin) { + plant_changed = true; + } + + if !runtime_plugins + .iter() + .any(|runtime_plugin| runtime_plugin.id == plugin.id) + { + runtime_plugins.push(plugin.clone()); + } + + let controller_changed = + controller.plugin_id != plugin.id || controller.plugin_name != plugin.name; + if controller_changed { + controller.plugin_id.clone_from(&plugin.id); + controller.plugin_name.clone_from(&plugin.name); + plant_changed = true; + } + + if controller.active { + if plugin.runtime != PluginRuntime::Python { + return Err(AppError::InvalidArgument(format!( + "O controlador '{}' precisa ser Python para executar na runtime atual", + controller.name + ))); + } + + let plugin_dir = + WorkspaceService::plugin_directory(&plugin.name, PluginType::Controller)?; + active_controllers.push(ResolvedRuntimeController { + instance: controller.clone(), + plugin, + plugin_dir, + }); + } + } + None if controller.active => { + return Err(AppError::NotFound(format!( + "Controlador '{}' da planta '{}' não está carregado", + controller.name, plant.name + ))); + } + None => {} + } + } + + if plant_changed { + WorkspaceService::update_plant_registry(&plant, &plant.name)?; + plants.replace(&plant.id, plant.clone())?; + } + + Ok((plant, driver, active_controllers, runtime_plugins)) +} + +pub(super) fn resolve_plugin_for_runtime( + plugins: &PluginStore, + plugin_id: &str, + plugin_name: &str, + expected_type: PluginType, + loaded_from_workspace: &mut bool, +) -> AppResult> { + let find_by_name = |plugins: &PluginStore, plugin_name: &str| { + plugins.find_by_type_and_name(expected_type, plugin_name, Clone::clone) + }; + + let try_resolve = |plugins: &PluginStore| -> AppResult> { + match plugins.read(plugin_id, |plugin| { + if plugin.plugin_type == expected_type { + Some(plugin.clone()) + } else { + None + } + }) { + Ok(Some(plugin)) => Ok(Some(plugin)), + Ok(None) | Err(AppError::NotFound(_)) if !plugin_name.trim().is_empty() => { + Ok(find_by_name(plugins, plugin_name)) + } + Ok(None) | Err(AppError::NotFound(_)) => Ok(None), + Err(error) => Err(error), + } + }; + + if let Some(plugin) = try_resolve(plugins)? { + return Ok(Some(plugin)); + } + + if !*loaded_from_workspace { + PluginService::load_all(plugins)?; + *loaded_from_workspace = true; + return try_resolve(plugins); + } + + Ok(None) +} + +#[allow(clippy::too_many_arguments)] +pub(super) fn build_bootstrap_payload( + runtime_id: &str, + plant: &Plant, + driver_plugin: &PluginRegistry, + driver_dir: &Path, + active_controllers: &[ResolvedRuntimeController], + runtime_dir: &Path, + venv_python_path: &Path, + runner_path: &Path, + bootstrap_path: &Path, + startup_timeout_ms: u64, + shutdown_timeout_ms: u64, +) -> AppResult { + let mut variables = Vec::new(); + let mut sensor_ids = Vec::new(); + let mut actuator_ids = Vec::new(); + let mut setpoints = HashMap::new(); + + for variable in &plant.variables { + let serialized_variable = DriverBootstrapVariable::from(variable); + + variables.push(serialized_variable); + setpoints.insert(variable.id.clone(), variable.setpoint); + + match variable.var_type { + VariableType::Sensor => { + sensor_ids.push(variable.id.clone()); + } + VariableType::Atuador => { + actuator_ids.push(variable.id.clone()); + } + } + } + + Ok(DriverBootstrapPayload { + driver: DriverBootstrapDriver { + plugin_id: driver_plugin.id.clone(), + plugin_name: driver_plugin.name.clone(), + plugin_dir: driver_dir.display().to_string(), + source_file: driver_plugin + .source_file + .clone() + .unwrap_or_else(|| "main.py".to_string()), + class_name: driver_plugin.entry_class.clone(), + config: serde_json::to_value(&plant.driver.config).map_err(|error| { + AppError::IoError(format!("Falha ao serializar config do driver: {error}")) + })?, + }, + controllers: build_runtime_controller_payloads(active_controllers)?, + plant: DriverBootstrapPlant { + id: plant.id.clone(), + name: plant.name.clone(), + variables, + sensor_ids, + actuator_ids, + setpoints, + }, + runtime: DriverBootstrapRuntime { + id: runtime_id.to_string(), + timing: DriverBootstrapRuntimeTiming { + owner: "runtime", + clock: "monotonic", + strategy: "deadline", + sample_time_ms: plant.sample_time_ms, + }, + supervision: DriverBootstrapRuntimeSupervision { + owner: "rust", + startup_timeout_ms, + shutdown_timeout_ms, + }, + paths: DriverBootstrapRuntimePaths { + runtime_dir: runtime_dir.display().to_string(), + venv_python_path: venv_python_path.display().to_string(), + runner_path: runner_path.display().to_string(), + bootstrap_path: bootstrap_path.display().to_string(), + }, + }, + }) +} + +pub(super) fn build_runtime_controller_payloads( + active_controllers: &[ResolvedRuntimeController], +) -> AppResult> { + active_controllers + .iter() + .map(|controller| { + Ok(DriverBootstrapController { + id: controller.instance.id.clone(), + plugin_id: controller.plugin.id.clone(), + plugin_name: controller.plugin.name.clone(), + plugin_dir: controller.plugin_dir.display().to_string(), + source_file: controller + .plugin + .source_file + .clone() + .unwrap_or_else(|| "main.py".to_string()), + class_name: controller.plugin.entry_class.clone(), + name: controller.instance.name.clone(), + controller_type: controller.instance.controller_type.clone(), + active: controller.instance.active, + input_variable_ids: controller.instance.input_variable_ids.clone(), + output_variable_ids: controller.instance.output_variable_ids.clone(), + params: serde_json::to_value(&controller.instance.params).map_err(|error| { + AppError::IoError(format!( + "Falha ao serializar parâmetros do controlador '{}': {error}", + controller.instance.name + )) + })?, + }) + }) + .collect() +} + +pub(super) fn collect_runtime_setpoints(plant: &Plant) -> HashMap { + plant + .variables + .iter() + .map(|variable| (variable.id.clone(), variable.setpoint)) + .collect() +} + +impl From<&crate::core::models::plant::PlantVariable> for DriverBootstrapVariable { + fn from(variable: &crate::core::models::plant::PlantVariable) -> Self { + Self { + id: variable.id.clone(), + name: variable.name.clone(), + var_type: variable.var_type, + unit: variable.unit.clone(), + setpoint: variable.setpoint, + pv_min: variable.pv_min, + pv_max: variable.pv_max, + linked_sensor_ids: variable.linked_sensor_ids.clone().unwrap_or_default(), + } + } +} diff --git a/apps/desktop/src-tauri/src/core/services/runtime/environment.rs b/apps/desktop/src-tauri/src/core/services/runtime/environment.rs new file mode 100644 index 0000000..a1b0e7e --- /dev/null +++ b/apps/desktop/src-tauri/src/core/services/runtime/environment.rs @@ -0,0 +1,337 @@ +use super::{DriverBootstrapPayload, RUNNER_SCRIPT}; +use crate::core::error::{AppError, AppResult}; +use crate::core::models::plugin::PluginRegistry; +use crate::core::services::workspace::WorkspaceService; +use serde_json::json; +use std::collections::{BTreeSet, HashSet}; +use std::fs; +use std::path::{Path, PathBuf}; +use std::process::Command; + +pub(super) fn prepare_runtime_directory() -> AppResult { + let runtime_root = WorkspaceService::runtime_root_directory()?; + fs::create_dir_all(&runtime_root).map_err(|error| { + AppError::IoError(format!( + "Falha ao criar diretório de runtimes '{}': {error}", + runtime_root.display() + )) + })?; + Ok(runtime_root) +} + +pub(super) fn prepare_runtime_scaffold(runtime_dir: &Path) -> AppResult<()> { + fs::create_dir_all(runtime_dir).map_err(|error| { + AppError::IoError(format!( + "Falha ao criar diretório da runtime '{}': {error}", + runtime_dir.display() + )) + })?; + Ok(()) +} + +pub(super) fn write_bootstrap_files( + bootstrap: &DriverBootstrapPayload, + bootstrap_path: &Path, +) -> AppResult<()> { + write_if_changed( + bootstrap_path, + &serde_json::to_string(bootstrap).map_err(|error| { + AppError::IoError(format!("Falha ao serializar bootstrap.json: {error}")) + })?, + &format!( + "Falha ao gravar bootstrap.json em '{}'", + bootstrap_path.display() + ), + )?; + + Ok(()) +} + +pub(super) fn write_runner_script(runtime_root: &Path) -> AppResult { + let runner_path = runtime_root.join("runner.py"); + write_if_changed( + &runner_path, + RUNNER_SCRIPT, + &format!( + "Falha ao gravar runner Python em '{}'", + runner_path.display() + ), + )?; + Ok(runner_path) +} + +pub(super) fn ensure_python_env( + runtime_plugins: &[PluginRegistry], + env_hash: &str, +) -> AppResult { + let env_dir = WorkspaceService::env_directory(env_hash)?; + fs::create_dir_all(&env_dir).map_err(|error| { + AppError::IoError(format!( + "Falha ao criar diretório de ambiente '{}': {error}", + env_dir.display() + )) + })?; + + let venv_dir = env_dir.join(".venv"); + let venv_python = venv_python_path(&venv_dir); + if !venv_python.exists() { + let python_cmd = resolve_system_python()?; + run_command( + Command::new(&python_cmd) + .arg("-m") + .arg("venv") + .arg(&venv_dir), + "Falha ao criar ambiente Python isolado", + )?; + + let specs = collect_runtime_dependency_specs(runtime_plugins); + if !specs.is_empty() { + run_command( + Command::new(&venv_python) + .arg("-m") + .arg("pip") + .arg("install") + .arg("--disable-pip-version-check") + .args(specs.clone()), + "Falha ao instalar dependências da runtime da planta", + )?; + + let lock_path = env_dir.join("requirements.lock.txt"); + fs::write(&lock_path, specs.join("\n")).map_err(|error| { + AppError::IoError(format!( + "Falha ao gravar requirements.lock.txt em '{}': {error}", + lock_path.display() + )) + })?; + } + } + + let metadata_path = env_dir.join("metadata.json"); + let metadata_payload = json!({ + "env_hash": env_hash, + "runtime": "python", + "plugins": runtime_plugins + .iter() + .map(|plugin| json!({ + "id": plugin.id, + "name": plugin.name, + "type": plugin.plugin_type, + "runtime": plugin.runtime, + "entry_class": plugin.entry_class, + })) + .collect::>(), + "dependencies": runtime_plugins + .iter() + .flat_map(|plugin| plugin.dependencies.iter().map(|dependency| json!({ + "plugin_id": plugin.id, + "name": dependency.name, + "version": dependency.version, + }))) + .collect::>(), + }); + let metadata_contents = serde_json::to_string_pretty(&metadata_payload).map_err(|error| { + AppError::IoError(format!("Falha ao serializar metadata.json: {error}")) + })?; + write_if_changed( + &metadata_path, + &metadata_contents, + &format!( + "Falha ao gravar metadata.json em '{}'", + metadata_path.display() + ), + )?; + + Ok(venv_python) +} + +fn venv_python_path(venv_dir: &Path) -> PathBuf { + if cfg!(target_os = "windows") { + venv_dir.join("Scripts").join("python.exe") + } else { + venv_dir.join("bin").join("python") + } +} + +fn resolve_system_python() -> AppResult { + for candidate in ["python3", "python"] { + if Command::new(candidate).arg("--version").output().is_ok() { + return Ok(candidate.to_string()); + } + } + + Err(AppError::IoError( + "Python não encontrado no sistema para criação da runtime".into(), + )) +} + +fn run_command(command: &mut Command, context: &str) -> AppResult<()> { + let output = command.output().map_err(|error| { + AppError::IoError(format!("{context}: falha ao executar comando: {error}")) + })?; + + if output.status.success() { + return Ok(()); + } + + let stderr = String::from_utf8_lossy(&output.stderr); + let stdout = String::from_utf8_lossy(&output.stdout); + Err(AppError::IoError(format!( + "{context}: status={} stdout='{}' stderr='{}'", + output.status, + stdout.trim(), + stderr.trim() + ))) +} + +pub(super) fn dedupe_runtime_plugins(runtime_plugins: Vec) -> Vec { + let mut seen = HashSet::new(); + let mut plugins: Vec = Vec::with_capacity(runtime_plugins.len()); + for plugin in runtime_plugins { + if seen.insert(plugin.id.clone()) { + plugins.push(plugin); + } + } + plugins +} + +fn collect_runtime_dependency_specs(runtime_plugins: &[PluginRegistry]) -> Vec { + runtime_plugins + .iter() + .flat_map(|plugin| plugin.dependencies.iter()) + .map(|dependency| { + if dependency.version.trim().is_empty() { + dependency.name.clone() + } else { + format!("{}=={}", dependency.name, dependency.version) + } + }) + .collect::>() + .into_iter() + .collect() +} + +pub(super) fn compute_env_hash(runtime_plugins: &[PluginRegistry]) -> String { + let mut dependencies = runtime_plugins + .iter() + .flat_map(|plugin| { + plugin + .dependencies + .iter() + .map(|dependency| (dependency.name.clone(), dependency.version.clone())) + }) + .collect::>(); + dependencies.sort(); + dependencies.dedup(); + + let mut material = "runtime=python\nformat=v2\n".to_string(); + for plugin in runtime_plugins { + material.push_str("plugin="); + material.push_str(&plugin.id); + material.push('|'); + material.push_str(&plugin.entry_class); + material.push('\n'); + } + for (name, version) in dependencies { + material.push_str(&name); + material.push('='); + material.push_str(&version); + material.push('\n'); + } + + let hash = fnv1a_64(material.as_bytes()); + format!("{hash:016x}") +} + +fn fnv1a_64(data: &[u8]) -> u64 { + const OFFSET: u64 = 0xcbf2_9ce4_8422_2325; + const PRIME: u64 = 0x0100_0000_01b3; + + let mut hash = OFFSET; + for byte in data { + hash ^= u64::from(*byte); + hash = hash.wrapping_mul(PRIME); + } + + hash +} + +fn write_if_changed(path: &Path, contents: &str, context: &str) -> AppResult<()> { + let should_write = match fs::read_to_string(path) { + Ok(existing) => existing != contents, + Err(error) if error.kind() == std::io::ErrorKind::NotFound => true, + Err(error) => { + return Err(AppError::IoError(format!( + "Falha ao ler '{}' antes da atualização: {error}", + path.display() + ))) + } + }; + + if !should_write { + return Ok(()); + } + + fs::write(path, contents).map_err(|error| AppError::IoError(format!("{context}: {error}"))) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::core::models::plugin::{PluginRegistry, PluginRuntime, PluginType}; + use std::fs; + use std::thread; + use std::time::Duration; + + fn create_plugin(id: &str, name: &str) -> PluginRegistry { + PluginRegistry { + id: id.to_string(), + name: name.to_string(), + plugin_type: PluginType::Driver, + runtime: PluginRuntime::Python, + entry_class: "Driver".to_string(), + schema: vec![], + source_file: Some("main.py".to_string()), + source_code: None, + dependencies: vec![], + description: None, + version: None, + author: None, + } + } + + #[test] + fn dedupe_runtime_plugins_preserves_single_instance_per_id() { + let deduped = dedupe_runtime_plugins(vec![ + create_plugin("plugin_a", "Driver A"), + create_plugin("plugin_a", "Driver A"), + create_plugin("plugin_b", "Driver B"), + ]); + + assert_eq!(deduped.len(), 2); + assert_eq!(deduped[0].id, "plugin_a"); + assert_eq!(deduped[1].id, "plugin_b"); + } + + #[test] + fn write_if_changed_preserves_timestamp_when_contents_match() { + let test_dir = std::env::temp_dir().join("senamby-runtime-env-tests"); + let _ = fs::remove_dir_all(&test_dir); + fs::create_dir_all(&test_dir).unwrap(); + + let path = test_dir.join("metadata.json"); + write_if_changed(&path, "{\"runtime\":true}", "falha de teste").unwrap(); + let initial_modified = fs::metadata(&path).unwrap().modified().unwrap(); + + thread::sleep(Duration::from_millis(20)); + write_if_changed(&path, "{\"runtime\":true}", "falha de teste").unwrap(); + let second_modified = fs::metadata(&path).unwrap().modified().unwrap(); + + assert_eq!(initial_modified, second_modified); + + thread::sleep(Duration::from_millis(20)); + write_if_changed(&path, "{\"runtime\":false}", "falha de teste").unwrap(); + let third_modified = fs::metadata(&path).unwrap().modified().unwrap(); + + assert!(third_modified > second_modified); + } +} diff --git a/apps/desktop/src-tauri/src/core/services/runtime/process.rs b/apps/desktop/src-tauri/src/core/services/runtime/process.rs new file mode 100644 index 0000000..782ae66 --- /dev/null +++ b/apps/desktop/src-tauri/src/core/services/runtime/process.rs @@ -0,0 +1,441 @@ +use super::{ + RuntimeCyclePhase, RuntimeEnvelope, RuntimeLifecycleState, RuntimeStatusEvent, + RuntimeTelemetryEvent, RuntimeTelemetryPayload, SharedHandshake, SharedMetrics, +}; +use crate::core::error::{AppError, AppResult}; +use parking_lot::Mutex; +use serde_json::{json, Value}; +use std::io::{BufRead, BufReader, Write}; +use std::process::{Child, ChildStderr, ChildStdin, ChildStdout, Command, Stdio}; +use std::sync::Arc; +use std::thread; +use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH}; +use tauri::{AppHandle, Emitter, Runtime}; + +#[allow(clippy::cast_precision_loss)] +fn sample_time_ms_as_f64(sample_time_ms: u64) -> f64 { + sample_time_ms as f64 +} + +pub(super) fn spawn_driver_process( + venv_python_path: &std::path::Path, + runner_path: &std::path::Path, + runtime_dir: &std::path::Path, + bootstrap_path: &std::path::Path, +) -> AppResult { + Command::new(venv_python_path) + .arg("-u") + .arg(runner_path) + .arg("--runtime-dir") + .arg(runtime_dir) + .arg("--bootstrap") + .arg(bootstrap_path) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .map_err(|error| { + AppError::IoError(format!( + "Falha ao iniciar processo Python do driver '{}': {error}", + venv_python_path.display() + )) + }) +} + +pub(super) fn spawn_stdout_task( + app: AppHandle, + plant_id: String, + runtime_id: String, + configured_sample_time_ms: u64, + stdout: ChildStdout, + handshake: SharedHandshake, + metrics: SharedMetrics, +) -> thread::JoinHandle<()> { + thread::spawn(move || { + let reader = BufReader::new(stdout); + for line in reader.lines() { + let line = match line { + Ok(line) => line, + Err(error) => { + let _ = emit_error_event( + &app, + &plant_id, + &runtime_id, + &format!("Falha ao ler stdout do driver: {error}"), + ); + break; + } + }; + + let envelope = match serde_json::from_str::(&line) { + Ok(message) => message, + Err(error) => { + let _ = emit_error_event( + &app, + &plant_id, + &runtime_id, + &format!("Mensagem inválida recebida do driver: {error}"), + ); + continue; + } + }; + + match envelope.msg_type.as_str() { + "ready" => handle_ready_event( + &app, + &plant_id, + &runtime_id, + configured_sample_time_ms, + &handshake, + &metrics, + ), + "connected" => handle_connected_event( + &app, + &plant_id, + &runtime_id, + configured_sample_time_ms, + &handshake, + &metrics, + ), + "error" => handle_runtime_error_event( + &app, + &plant_id, + &runtime_id, + configured_sample_time_ms, + &envelope.payload, + &handshake, + &metrics, + ), + "telemetry" => process_telemetry( + &app, + &plant_id, + &runtime_id, + configured_sample_time_ms, + envelope.payload, + &metrics, + ), + "cycle_overrun" => { + let mut lock = metrics.lock(); + lock.cycle_late = true; + lock.late_cycle_count = lock.late_cycle_count.saturating_add(1); + } + "stopped" => { + handle_stopped_event( + &app, + &plant_id, + &runtime_id, + configured_sample_time_ms, + &metrics, + ); + break; + } + _ => {} + } + } + }) +} + +pub(super) fn spawn_stderr_task( + plant_id: String, + runtime_id: String, + stderr: ChildStderr, +) -> thread::JoinHandle<()> { + thread::spawn(move || { + let reader = BufReader::new(stderr); + for line in reader.lines().map_while(Result::ok) { + if !line.trim().is_empty() { + eprintln!("[driver-runtime][plant={plant_id}][runtime={runtime_id}] {line}"); + } + } + }) +} + +fn handle_ready_event( + app: &AppHandle, + plant_id: &str, + runtime_id: &str, + configured_sample_time_ms: u64, + handshake: &SharedHandshake, + metrics: &SharedMetrics, +) { + { + let mut lock = handshake.0.lock(); + lock.ready = true; + } + handshake.1.notify_all(); + + let mut lock = metrics.lock(); + lock.lifecycle_state = RuntimeLifecycleState::Ready; + emit_status_event( + app, + RuntimeStatusEvent { + plant_id: plant_id.to_string(), + runtime_id: runtime_id.to_string(), + lifecycle_state: RuntimeLifecycleState::Ready, + cycle_phase: RuntimeCyclePhase::CycleStarted, + configured_sample_time_ms, + effective_dt_ms: sample_time_ms_as_f64(configured_sample_time_ms), + cycle_late: false, + }, + ); +} + +fn handle_connected_event( + app: &AppHandle, + plant_id: &str, + runtime_id: &str, + configured_sample_time_ms: u64, + handshake: &SharedHandshake, + metrics: &SharedMetrics, +) { + { + let mut lock = handshake.0.lock(); + lock.connected = true; + } + handshake.1.notify_all(); + + let mut lock = metrics.lock(); + lock.lifecycle_state = RuntimeLifecycleState::Running; + lock.cycle_phase = RuntimeCyclePhase::ReadInputs; + emit_status_event( + app, + RuntimeStatusEvent { + plant_id: plant_id.to_string(), + runtime_id: runtime_id.to_string(), + lifecycle_state: RuntimeLifecycleState::Running, + cycle_phase: RuntimeCyclePhase::ReadInputs, + configured_sample_time_ms, + effective_dt_ms: sample_time_ms_as_f64(configured_sample_time_ms), + cycle_late: false, + }, + ); +} + +fn handle_runtime_error_event( + app: &AppHandle, + plant_id: &str, + runtime_id: &str, + configured_sample_time_ms: u64, + payload: &Value, + handshake: &SharedHandshake, + metrics: &SharedMetrics, +) { + let message = payload + .get("message") + .and_then(Value::as_str) + .unwrap_or("Erro na runtime Python") + .to_string(); + + { + let mut lock = handshake.0.lock(); + lock.error = Some(message.clone()); + } + handshake.1.notify_all(); + + let mut lock = metrics.lock(); + lock.lifecycle_state = RuntimeLifecycleState::Faulted; + emit_status_event( + app, + RuntimeStatusEvent { + plant_id: plant_id.to_string(), + runtime_id: runtime_id.to_string(), + lifecycle_state: RuntimeLifecycleState::Faulted, + cycle_phase: lock.cycle_phase, + configured_sample_time_ms, + effective_dt_ms: lock.effective_dt_ms, + cycle_late: lock.cycle_late, + }, + ); + let _ = emit_error_event(app, plant_id, runtime_id, &message); +} + +fn handle_stopped_event( + app: &AppHandle, + plant_id: &str, + runtime_id: &str, + configured_sample_time_ms: u64, + metrics: &SharedMetrics, +) { + let mut lock = metrics.lock(); + lock.lifecycle_state = RuntimeLifecycleState::Stopped; + emit_status_event( + app, + RuntimeStatusEvent { + plant_id: plant_id.to_string(), + runtime_id: runtime_id.to_string(), + lifecycle_state: RuntimeLifecycleState::Stopped, + cycle_phase: RuntimeCyclePhase::SleepUntilDeadline, + configured_sample_time_ms, + effective_dt_ms: lock.effective_dt_ms, + cycle_late: false, + }, + ); +} + +fn process_telemetry( + app: &AppHandle, + plant_id: &str, + runtime_id: &str, + configured_sample_time_ms: u64, + payload: Value, + metrics: &SharedMetrics, +) { + let payload = match serde_json::from_value::(payload) { + Ok(payload) => payload, + Err(error) => { + let _ = emit_error_event( + app, + plant_id, + runtime_id, + &format!("Payload de telemetria inválido: {error}"), + ); + return; + } + }; + + let effective_dt_ms = if payload.effective_dt_ms.is_finite() { + payload.effective_dt_ms + } else { + sample_time_ms_as_f64(configured_sample_time_ms) + }; + let cycle_duration_ms = if payload.cycle_duration_ms.is_finite() { + payload.cycle_duration_ms + } else { + 0.0 + }; + let read_duration_ms = if payload.read_duration_ms.is_finite() { + payload.read_duration_ms + } else { + 0.0 + }; + let cycle_late = payload.cycle_late; + + { + let mut lock = metrics.lock(); + lock.lifecycle_state = RuntimeLifecycleState::Running; + lock.cycle_phase = RuntimeCyclePhase::PublishTelemetry; + lock.effective_dt_ms = effective_dt_ms; + lock.cycle_duration_ms = cycle_duration_ms; + lock.read_duration_ms = read_duration_ms; + lock.uptime_s = payload.uptime_s.max(0.0); + lock.cycle_late = cycle_late; + if cycle_late { + lock.late_cycle_count = lock.late_cycle_count.saturating_add(1); + } + lock.last_telemetry_at = Some( + SystemTime::now() + .duration_since(UNIX_EPOCH) + .map(|time| time.as_secs()) + .unwrap_or(0), + ); + } + + let event = RuntimeTelemetryEvent { + plant_id: plant_id.to_string(), + runtime_id: runtime_id.to_string(), + lifecycle_state: RuntimeLifecycleState::Running, + cycle_phase: RuntimeCyclePhase::PublishTelemetry, + timestamp: payload.timestamp, + cycle_id: payload.cycle_id, + configured_sample_time_ms, + effective_dt_ms, + cycle_duration_ms, + read_duration_ms, + control_duration_ms: payload.control_duration_ms, + write_duration_ms: payload.write_duration_ms, + publish_duration_ms: payload.publish_duration_ms, + cycle_late, + late_by_ms: payload.late_by_ms, + phase: payload.phase, + uptime_s: payload.uptime_s, + sensors: payload.sensors, + actuators: payload.actuators, + actuators_read: payload.actuators_read, + setpoints: payload.setpoints, + controller_outputs: payload.controller_outputs, + written_outputs: payload.written_outputs, + controller_durations_ms: payload.controller_durations_ms, + }; + let _ = app.emit("plant://telemetry", event); +} + +pub(super) fn wait_for_handshake(handshake: &SharedHandshake, timeout: Duration) -> AppResult<()> { + let deadline = Instant::now() + timeout; + + let mut guard = handshake.0.lock(); + loop { + if guard.connected { + return Ok(()); + } + if let Some(message) = guard.error.clone() { + return Err(AppError::IoError(format!( + "Falha durante handshake da runtime: {message}" + ))); + } + + let now = Instant::now(); + if now >= deadline { + return Err(AppError::IoError( + "Timeout aguardando handshake da runtime Python".into(), + )); + } + + let wait_for = deadline.saturating_duration_since(now); + if handshake.1.wait_for(&mut guard, wait_for).timed_out() { + return Err(AppError::IoError( + "Timeout aguardando handshake da runtime Python".into(), + )); + } + } +} + +pub(super) fn send_command( + stdin: &Arc>, + msg_type: &str, + payload: Option, +) -> AppResult<()> { + let mut writer = stdin.lock(); + let mut envelope = serde_json::Map::new(); + envelope.insert("type".to_string(), Value::String(msg_type.to_string())); + if let Some(payload) = payload { + envelope.insert("payload".to_string(), payload); + } + + let line = serde_json::to_string(&envelope).map_err(|error| { + AppError::IoError(format!("Falha ao serializar comando para runtime: {error}")) + })?; + writer.write_all(line.as_bytes()).map_err(|error| { + AppError::IoError(format!("Falha ao enviar comando para runtime: {error}")) + })?; + writer.write_all(b"\n").map_err(|error| { + AppError::IoError(format!("Falha ao finalizar comando para runtime: {error}")) + })?; + writer.flush().map_err(|error| { + AppError::IoError(format!("Falha ao flush de comando para runtime: {error}")) + })?; + + Ok(()) +} + +pub(super) fn emit_status_event(app: &AppHandle, event: RuntimeStatusEvent) { + let _ = app.emit("plant://status", event); +} + +pub(super) fn emit_error_event( + app: &AppHandle, + plant_id: &str, + runtime_id: &str, + message: &str, +) -> AppResult<()> { + app.emit( + "plant://error", + json!({ + "plant_id": plant_id, + "runtime_id": runtime_id, + "message": message, + }), + ) + .map_err(|error| AppError::IoError(format!("Falha ao emitir evento de erro: {error}")))?; + + Ok(()) +} diff --git a/apps/desktop/src-tauri/src/core/services/runtime/validation.rs b/apps/desktop/src-tauri/src/core/services/runtime/validation.rs new file mode 100644 index 0000000..8a77a57 --- /dev/null +++ b/apps/desktop/src-tauri/src/core/services/runtime/validation.rs @@ -0,0 +1,251 @@ +use super::{ + PYTHON_CLASS_METHOD_CHECK_SCRIPT, PYTHON_IMPORT_CLASS_CHECK_SCRIPT, PYTHON_SYNTAX_CHECK_SCRIPT, +}; +use crate::core::error::{AppError, AppResult}; +use crate::core::models::plugin::{PluginRegistry, PluginRuntime, PluginType}; +use crate::core::services::workspace::WorkspaceService; +use std::path::{Path, PathBuf}; +use std::process::Command; + +pub(super) fn validate_plugin_workspace_files( + plugin_dir: &Path, + component_label: &str, +) -> AppResult<()> { + let registry_path = plugin_dir.join("registry.json"); + if !registry_path.exists() { + return Err(AppError::NotFound(format!( + "registry.json do {component_label} não encontrado em '{}'", + registry_path.display() + ))); + } + + let main_path = plugin_dir.join("main.py"); + if !main_path.exists() { + return Err(AppError::NotFound(format!( + "main.py do {component_label} não encontrado em '{}'", + main_path.display() + ))); + } + + Ok(()) +} + +pub(super) fn validate_python_source_file( + python_path: &Path, + source_path: &Path, + component_label: &str, +) -> AppResult<()> { + let output = Command::new(python_path) + .arg("-c") + .arg(PYTHON_SYNTAX_CHECK_SCRIPT) + .arg(source_path) + .output() + .map_err(|error| { + AppError::IoError(format!( + "Falha ao validar código Python do {component_label} '{}': {error}", + source_path.display() + )) + })?; + + if output.status.success() { + return Ok(()); + } + + let stderr = String::from_utf8_lossy(&output.stderr); + let stdout = String::from_utf8_lossy(&output.stdout); + let detail = stderr + .lines() + .chain(stdout.lines()) + .map(str::trim) + .rfind(|line| !line.is_empty()) + .unwrap_or("Erro de sintaxe desconhecido no plugin Python"); + + Err(AppError::InvalidArgument(format!( + "Código Python inválido no {component_label}: {detail}" + ))) +} + +fn validate_python_class_methods( + source_path: &Path, + class_name: &str, + required_methods: &[&str], + component_label: &str, +) -> AppResult<()> { + let methods_json = serde_json::to_string(required_methods).map_err(|error| { + AppError::IoError(format!( + "Falha ao serializar métodos obrigatórios do {component_label}: {error}" + )) + })?; + + let output = Command::new("python3") + .arg("-c") + .arg(PYTHON_CLASS_METHOD_CHECK_SCRIPT) + .arg(source_path) + .arg(class_name) + .arg(methods_json) + .output() + .map_err(|error| { + AppError::IoError(format!( + "Falha ao validar métodos Python do {component_label} '{}': {error}", + source_path.display() + )) + })?; + + if output.status.success() { + return Ok(()); + } + + let stderr = String::from_utf8_lossy(&output.stderr); + let stdout = String::from_utf8_lossy(&output.stdout); + let detail = stderr + .lines() + .chain(stdout.lines()) + .map(str::trim) + .rfind(|line| !line.is_empty()) + .unwrap_or("Métodos obrigatórios não encontrados"); + + Err(AppError::InvalidArgument(format!( + "Contrato inválido no {component_label}: {detail}" + ))) +} + +fn validate_python_importable_class( + python_path: &Path, + source_path: &Path, + class_name: &str, + required_methods: &[&str], + component_label: &str, +) -> AppResult<()> { + let mut command = Command::new(python_path); + command + .arg("-c") + .arg(PYTHON_IMPORT_CLASS_CHECK_SCRIPT) + .arg(source_path) + .arg(class_name); + + for method in required_methods { + command.arg(method); + } + + let output = command.output().map_err(|error| { + AppError::IoError(format!( + "Falha ao validar carregamento Python do {component_label} '{}': {error}", + source_path.display() + )) + })?; + + if output.status.success() { + return Ok(()); + } + + let stderr = String::from_utf8_lossy(&output.stderr); + let stdout = String::from_utf8_lossy(&output.stdout); + let detail = stderr + .lines() + .chain(stdout.lines()) + .map(str::trim) + .rfind(|line| !line.is_empty()) + .unwrap_or("Falha ao carregar classe Python"); + + Err(AppError::InvalidArgument(format!( + "Falha ao carregar {component_label}: {detail}" + ))) +} + +pub(super) fn ensure_driver_supports_write(driver_plugin: &PluginRegistry) -> AppResult<()> { + if driver_plugin.runtime != PluginRuntime::Python { + return Err(AppError::InvalidArgument( + "A runtime atual suporta apenas drivers Python".into(), + )); + } + + let source_path = resolve_plugin_source_path(driver_plugin, PluginType::Driver)?; + if !source_path.exists() { + return Err(AppError::NotFound(format!( + "Arquivo fonte do driver não encontrado em '{}'", + source_path.display() + ))); + } + + validate_python_class_methods( + &source_path, + &driver_plugin.entry_class, + &["write"], + "driver", + ) + .map_err(|_| { + AppError::InvalidArgument( + "Driver precisa implementar write(outputs) para executar controladores ativos".into(), + ) + }) +} + +pub(super) fn validate_controller_plugin_source( + controller_plugin: &PluginRegistry, + controller_name: &str, +) -> AppResult<()> { + if controller_plugin.runtime != PluginRuntime::Python { + return Err(AppError::InvalidArgument(format!( + "O controlador '{controller_name}' precisa ser Python para executar na runtime atual" + ))); + } + + let controller_dir = + WorkspaceService::plugin_directory(&controller_plugin.name, PluginType::Controller)?; + validate_plugin_workspace_files(&controller_dir, "controlador")?; + + let source_path = resolve_plugin_source_path(controller_plugin, PluginType::Controller)?; + let component_label = format!("controlador '{controller_name}'"); + + validate_python_source_file(Path::new("python3"), &source_path, &component_label)?; + validate_python_class_methods( + &source_path, + &controller_plugin.entry_class, + &["compute"], + &component_label, + )?; + + Ok(()) +} + +pub(super) fn validate_controller_plugin_source_with_python( + python_path: &Path, + controller_plugin: &PluginRegistry, + controller_name: &str, +) -> AppResult<()> { + if controller_plugin.runtime != PluginRuntime::Python { + return Err(AppError::InvalidArgument(format!( + "O controlador '{controller_name}' precisa ser Python para executar na runtime atual" + ))); + } + + let controller_dir = + WorkspaceService::plugin_directory(&controller_plugin.name, PluginType::Controller)?; + validate_plugin_workspace_files(&controller_dir, "controlador")?; + + let source_path = resolve_plugin_source_path(controller_plugin, PluginType::Controller)?; + let component_label = format!("controlador '{controller_name}'"); + + validate_python_source_file(python_path, &source_path, &component_label)?; + validate_python_importable_class( + python_path, + &source_path, + &controller_plugin.entry_class, + &["compute"], + &component_label, + )?; + + Ok(()) +} + +fn resolve_plugin_source_path( + plugin: &PluginRegistry, + plugin_type: PluginType, +) -> AppResult { + let plugin_dir = WorkspaceService::plugin_directory(&plugin.name, plugin_type)?; + let source_file = plugin + .source_file + .clone() + .unwrap_or_else(|| "main.py".to_string()); + Ok(plugin_dir.join(source_file)) +} diff --git a/apps/desktop/src-tauri/src/core/services/workspace.rs b/apps/desktop/src-tauri/src/core/services/workspace.rs new file mode 100644 index 0000000..535e976 --- /dev/null +++ b/apps/desktop/src-tauri/src/core/services/workspace.rs @@ -0,0 +1,158 @@ +use crate::core::error::{AppError, AppResult}; +use crate::core::models::plant::Plant; +use crate::core::models::plugin::{PluginRegistry, PluginType}; +use std::path::{Component, Path, PathBuf}; + +mod io; +mod paths; +mod plant_registry; +mod plugin_registry; + +pub struct WorkspaceService; + +impl WorkspaceService { + pub fn save_plugin_registry(plugin: &PluginRegistry, source_code: &str) -> AppResult<()> { + plugin_registry::save(plugin, source_code) + } + + pub fn update_plugin_registry( + plugin: &PluginRegistry, + source_code: &str, + previous_plugin_name: &str, + previous_plugin_type: PluginType, + ) -> AppResult<()> { + plugin_registry::update( + plugin, + source_code, + previous_plugin_name, + previous_plugin_type, + ) + } + + pub fn read_plugin_source(plugin_name: &str, plugin_type: PluginType) -> AppResult { + plugin_registry::read_source(plugin_name, plugin_type) + } + + pub fn delete_plugin_registry(plugin_name: &str, plugin_type: PluginType) -> AppResult<()> { + plugin_registry::delete(plugin_name, plugin_type) + } + + pub fn save_plant_registry(plant: &Plant) -> AppResult<()> { + plant_registry::save(plant) + } + + pub fn update_plant_registry(plant: &Plant, previous_plant_name: &str) -> AppResult<()> { + plant_registry::update(plant, previous_plant_name) + } + + pub fn load_plugin_registries() -> AppResult> { + plugin_registry::load() + } + + pub fn delete_plant_registry(plant_name: &str) -> AppResult<()> { + plant_registry::delete(plant_name) + } + + pub fn plugin_directory(plugin_name: &str, plugin_type: PluginType) -> AppResult { + paths::plugin_directory(plugin_name, plugin_type) + } + + pub fn env_directory(env_hash: &str) -> AppResult { + paths::env_directory(env_hash) + } + + pub fn runtime_directory(runtime_id: &str) -> AppResult { + paths::runtime_directory(runtime_id) + } + + pub fn runtime_root_directory() -> AppResult { + paths::runtime_root_directory() + } +} + +#[cfg(test)] +pub(crate) fn test_workspace_root() -> PathBuf { + paths::test_workspace_root() +} + +pub(crate) fn map_serde_error(context: &str, error: &serde_json::Error) -> AppError { + AppError::IoError(format!("{context}: {error}")) +} + +pub(crate) fn map_io_error(context: &str, error: &std::io::Error) -> AppError { + AppError::IoError(format!("{context}: {error}")) +} + +pub(crate) fn normalize_entity_name(name: &str) -> &str { + let trimmed = name.trim(); + if trimmed.is_empty() { + name + } else { + trimmed + } +} + +pub(crate) fn ensure_non_empty_name(name: &str, entity: &str) -> AppResult { + let normalized = normalize_entity_name(name); + if normalized.is_empty() { + return Err(AppError::InvalidArgument(format!( + "Nome de {entity} não pode ser vazio" + ))); + } + + Ok(normalized.to_string()) +} + +pub(crate) fn ensure_safe_workspace_component(name: &str, entity: &str) -> AppResult { + let normalized = ensure_non_empty_name(name, entity)?; + let path = Path::new(&normalized); + + if path.is_absolute() { + return Err(AppError::InvalidArgument(format!( + "Nome de {entity} não pode ser caminho absoluto" + ))); + } + + if normalized.contains('/') || normalized.contains('\\') { + return Err(AppError::InvalidArgument(format!( + "Nome de {entity} não pode conter separadores de diretório" + ))); + } + + if normalized.chars().any(char::is_control) { + return Err(AppError::InvalidArgument(format!( + "Nome de {entity} contém caracteres inválidos" + ))); + } + + if path.components().any(|component| { + matches!( + component, + Component::ParentDir | Component::CurDir | Component::RootDir | Component::Prefix(_) + ) + }) { + return Err(AppError::InvalidArgument(format!( + "Nome de {entity} contém componentes de caminho inválidos" + ))); + } + + Ok(normalized) +} + +#[cfg(test)] +mod tests { + use super::ensure_safe_workspace_component; + + #[test] + fn safe_workspace_component_accepts_regular_names() { + let value = ensure_safe_workspace_component("Meu Driver 1", "plugin").unwrap(); + assert_eq!(value, "Meu Driver 1"); + } + + #[test] + fn safe_workspace_component_rejects_path_traversal() { + assert!(ensure_safe_workspace_component("../driver", "plugin").is_err()); + assert!(ensure_safe_workspace_component("driver/teste", "plugin").is_err()); + assert!(ensure_safe_workspace_component("driver\\teste", "plugin").is_err()); + } +} diff --git a/apps/desktop/src-tauri/src/core/services/workspace/io.rs b/apps/desktop/src-tauri/src/core/services/workspace/io.rs new file mode 100644 index 0000000..4df7978 --- /dev/null +++ b/apps/desktop/src-tauri/src/core/services/workspace/io.rs @@ -0,0 +1,36 @@ +use super::{map_io_error, map_serde_error}; +use crate::core::error::AppResult; +use serde::Serialize; +use std::fs; +use std::path::Path; + +pub(super) fn create_dir_all(path: &Path, context: &str) -> AppResult<()> { + fs::create_dir_all(path).map_err(|error| map_io_error(context, &error)) +} + +pub(super) fn write_string(path: &Path, contents: &str, context: &str) -> AppResult<()> { + fs::write(path, contents).map_err(|error| map_io_error(context, &error)) +} + +pub(super) fn write_json_pretty( + path: &Path, + value: &T, + serialize_context: &str, + write_context: &str, +) -> AppResult<()> { + let payload = serde_json::to_string_pretty(value) + .map_err(|error| map_serde_error(serialize_context, &error))?; + write_string(path, &payload, write_context) +} + +pub(super) fn read_to_string(path: &Path, context: &str) -> AppResult { + fs::read_to_string(path).map_err(|error| map_io_error(context, &error)) +} + +pub(super) fn remove_dir_if_exists(path: &Path, context: &str) -> AppResult<()> { + if !path.exists() { + return Ok(()); + } + + fs::remove_dir_all(path).map_err(|error| map_io_error(context, &error)) +} diff --git a/apps/desktop/src-tauri/src/core/services/workspace/paths.rs b/apps/desktop/src-tauri/src/core/services/workspace/paths.rs new file mode 100644 index 0000000..dcdc852 --- /dev/null +++ b/apps/desktop/src-tauri/src/core/services/workspace/paths.rs @@ -0,0 +1,98 @@ +#[cfg(not(test))] +use crate::core::error::AppError; +use crate::core::error::AppResult; +use crate::core::models::plugin::PluginType; +use std::path::PathBuf; +#[cfg(test)] +use std::thread_local; + +const APP_WORKSPACE_DIR: &str = "Senamby/workspace"; +const DRIVERS_DIR: &str = "drivers"; +const CONTROLLERS_DIR: &str = "controllers"; +const PLANTS_DIR: &str = "plants"; +const ENVS_DIR: &str = "envs"; +const RUNTIMES_DIR: &str = "runtimes"; +pub(super) const REGISTRY_FILE: &str = "registry.json"; +pub(super) const SOURCE_FILE: &str = "main.py"; + +pub(super) fn plugin_directory(plugin_name: &str, plugin_type: PluginType) -> AppResult { + let plugin_root = plugin_root_directory(plugin_type)?; + let plugin_name = + crate::core::services::workspace::ensure_safe_workspace_component(plugin_name, "plugin")?; + + Ok(plugin_root.join(plugin_name)) +} + +pub(super) fn plugin_root_directory(plugin_type: PluginType) -> AppResult { + let workspace_root = workspace_root()?; + let parent_dir = match plugin_type { + PluginType::Driver => DRIVERS_DIR, + PluginType::Controller => CONTROLLERS_DIR, + }; + + Ok(workspace_root.join(parent_dir)) +} + +pub(super) fn plugin_source_path(plugin_name: &str, plugin_type: PluginType) -> AppResult { + Ok(plugin_directory(plugin_name, plugin_type)?.join(SOURCE_FILE)) +} + +pub(super) fn plant_directory(plant_name: &str) -> AppResult { + let workspace_root = workspace_root()?; + let plant_name = + crate::core::services::workspace::ensure_safe_workspace_component(plant_name, "planta")?; + Ok(workspace_root.join(PLANTS_DIR).join(plant_name)) +} + +pub(super) fn env_directory(env_hash: &str) -> AppResult { + let workspace_root = workspace_root()?; + let env_hash = + crate::core::services::workspace::ensure_safe_workspace_component(env_hash, "ambiente")?; + Ok(workspace_root.join(ENVS_DIR).join(env_hash)) +} + +pub(super) fn runtime_root_directory() -> AppResult { + Ok(workspace_root()?.join(RUNTIMES_DIR)) +} + +pub(super) fn runtime_directory(runtime_id: &str) -> AppResult { + let runtime_id = + crate::core::services::workspace::ensure_safe_workspace_component(runtime_id, "runtime")?; + Ok(runtime_root_directory()?.join(runtime_id)) +} + +#[cfg(not(test))] +pub(super) fn workspace_root() -> AppResult { + let documents_dir = dirs::document_dir().ok_or_else(|| { + AppError::IoError("Não foi possível localizar o diretório Documentos".into()) + })?; + + Ok(documents_dir.join(APP_WORKSPACE_DIR)) +} + +#[cfg(test)] +thread_local! { + static TEST_WORKSPACE_ROOT: PathBuf = { + let thread_id = format!("{:?}", std::thread::current().id()); + let thread_suffix: String = thread_id + .chars() + .filter(char::is_ascii_digit) + .collect(); + let process_id = std::process::id(); + + std::env::temp_dir() + .join(APP_WORKSPACE_DIR) + .join(format!("test-{process_id}-{thread_suffix}")) + }; +} + +#[cfg(test)] +pub(super) fn test_workspace_root() -> PathBuf { + TEST_WORKSPACE_ROOT.with(Clone::clone) +} + +#[cfg(test)] +#[allow(clippy::unnecessary_wraps)] +pub(super) fn workspace_root() -> AppResult { + Ok(test_workspace_root()) +} diff --git a/apps/desktop/src-tauri/src/core/services/workspace/plant_registry.rs b/apps/desktop/src-tauri/src/core/services/workspace/plant_registry.rs new file mode 100644 index 0000000..ed99bc6 --- /dev/null +++ b/apps/desktop/src-tauri/src/core/services/workspace/plant_registry.rs @@ -0,0 +1,60 @@ +use crate::core::error::AppResult; +use crate::core::models::plant::Plant; +use crate::core::services::workspace::normalize_entity_name; + +use super::io::{create_dir_all, remove_dir_if_exists, write_json_pretty}; +use super::paths::{plant_directory, REGISTRY_FILE}; + +pub(super) fn save(plant: &Plant) -> AppResult<()> { + let plant_dir = plant_directory(&plant.name)?; + create_dir_all( + &plant_dir, + &format!("Falha ao criar diretório da planta '{}'", plant.name), + )?; + + let registry_path = plant_dir.join(REGISTRY_FILE); + write_json_pretty( + ®istry_path, + plant, + &format!("Falha ao serializar registro da planta '{}'", plant.name), + &format!( + "Falha ao salvar registro da planta '{}' em '{}'", + plant.name, + registry_path.display() + ), + ) +} + +pub(super) fn update(plant: &Plant, previous_plant_name: &str) -> AppResult<()> { + let previous_dir = plant_directory(previous_plant_name)?; + let next_dir = plant_directory(&plant.name)?; + + if previous_dir != next_dir { + remove_dir_if_exists( + &previous_dir, + &format!( + "Falha ao remover diretório antigo da planta '{}'", + previous_dir.display() + ), + )?; + } + + save(plant) +} + +pub(super) fn delete(plant_name: &str) -> AppResult<()> { + let normalized_name = normalize_entity_name(plant_name); + if normalized_name.is_empty() { + return Ok(()); + } + + let plant_dir = plant_directory(normalized_name)?; + remove_dir_if_exists( + &plant_dir, + &format!( + "Falha ao remover diretório da planta '{}' em '{}'", + normalized_name, + plant_dir.display() + ), + ) +} diff --git a/apps/desktop/src-tauri/src/core/services/workspace/plugin_registry.rs b/apps/desktop/src-tauri/src/core/services/workspace/plugin_registry.rs new file mode 100644 index 0000000..f8f8f59 --- /dev/null +++ b/apps/desktop/src-tauri/src/core/services/workspace/plugin_registry.rs @@ -0,0 +1,166 @@ +use crate::core::error::AppResult; +use crate::core::models::plugin::{PluginRegistry, PluginType}; +use crate::core::services::workspace::{map_io_error, map_serde_error, normalize_entity_name}; +use std::fs; + +use super::io::{ + create_dir_all, read_to_string, remove_dir_if_exists, write_json_pretty, write_string, +}; +use super::paths::{ + plugin_directory, plugin_root_directory, plugin_source_path, REGISTRY_FILE, SOURCE_FILE, +}; + +pub(super) fn save(plugin: &PluginRegistry, source_code: &str) -> AppResult<()> { + let plugin_dir = plugin_directory(&plugin.name, plugin.plugin_type)?; + create_dir_all( + &plugin_dir, + &format!( + "Falha ao criar diretório do {:?} '{}'", + plugin.plugin_type, plugin.name + ), + )?; + + let source_path = plugin_dir.join(SOURCE_FILE); + write_string( + &source_path, + source_code, + &format!( + "Falha ao salvar código fonte do {:?} '{}' em '{}'", + plugin.plugin_type, + plugin.name, + source_path.display() + ), + )?; + + let registry_path = plugin_dir.join(REGISTRY_FILE); + write_json_pretty( + ®istry_path, + plugin, + &format!( + "Falha ao serializar registro do {:?} '{}'", + plugin.plugin_type, plugin.name + ), + &format!( + "Falha ao salvar registro do {:?} '{}' em '{}'", + plugin.plugin_type, + plugin.name, + registry_path.display() + ), + ) +} + +pub(super) fn update( + plugin: &PluginRegistry, + source_code: &str, + previous_plugin_name: &str, + previous_plugin_type: PluginType, +) -> AppResult<()> { + let previous_dir = plugin_directory(previous_plugin_name, previous_plugin_type)?; + let next_dir = plugin_directory(&plugin.name, plugin.plugin_type)?; + + if previous_dir != next_dir { + remove_dir_if_exists( + &previous_dir, + &format!( + "Falha ao remover diretório antigo do plugin '{}'", + previous_dir.display() + ), + )?; + } + + save(plugin, source_code) +} + +pub(super) fn read_source(plugin_name: &str, plugin_type: PluginType) -> AppResult { + let source_path = plugin_source_path(plugin_name, plugin_type)?; + read_to_string( + &source_path, + &format!( + "Falha ao ler código fonte do plugin em '{}'", + source_path.display() + ), + ) +} + +pub(super) fn delete(plugin_name: &str, plugin_type: PluginType) -> AppResult<()> { + let normalized_name = normalize_entity_name(plugin_name); + if normalized_name.is_empty() { + return Ok(()); + } + + let plugin_dir = plugin_directory(normalized_name, plugin_type)?; + remove_dir_if_exists( + &plugin_dir, + &format!( + "Falha ao remover diretório do plugin '{}' em '{}'", + normalized_name, + plugin_dir.display() + ), + ) +} + +pub(super) fn load() -> AppResult> { + let mut plugins = Vec::new(); + load_plugin_type(PluginType::Controller, &mut plugins)?; + load_plugin_type(PluginType::Driver, &mut plugins)?; + Ok(plugins) +} + +fn load_plugin_type(plugin_type: PluginType, plugins: &mut Vec) -> AppResult<()> { + let root = plugin_root_directory(plugin_type)?; + if !root.exists() { + return Ok(()); + } + + for entry in fs::read_dir(&root) + .map_err(|error| map_io_error("Falha ao carregar workspace de plugins", &error))? + { + let Ok(entry) = entry else { + continue; + }; + let plugin_dir = entry.path(); + if !plugin_dir.is_dir() { + continue; + } + + let registry_path = plugin_dir.join(REGISTRY_FILE); + if !registry_path.exists() { + continue; + } + + let content = match read_to_string( + ®istry_path, + &format!( + "Falha ao ler registro do plugin em '{}'", + registry_path.display() + ), + ) { + Ok(content) => content, + Err(error) => { + eprintln!("{error}"); + continue; + } + }; + + let plugin = match serde_json::from_str::(&content) { + Ok(plugin) => plugin, + Err(error) => { + eprintln!( + "{}", + map_serde_error( + &format!( + "Falha ao desserializar registro do plugin em '{}'", + registry_path.display() + ), + &error, + ) + ); + continue; + } + }; + + plugins.push(plugin); + } + + Ok(()) +} diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs new file mode 100644 index 0000000..a8dafd1 --- /dev/null +++ b/apps/desktop/src-tauri/src/lib.rs @@ -0,0 +1,56 @@ +// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ +mod commands; +mod core; +mod state; + +use crate::commands::plants::{ + close_plant, connect_plant, create_plant, disconnect_plant, get_plant, import_plant_file, + list_plants, open_plant_file, pause_plant, remove_controller, remove_plant, resume_plant, + save_controller, save_export_file, save_setpoint, update_plant, +}; +use crate::commands::plugins::{ + create_plugin, delete_plugin, get_plugin, import_plugin_file, list_plugins, + list_plugins_by_type, load_plugins, update_plugin, +}; +use crate::state::AppState; + +#[cfg_attr(mobile, tauri::mobile_entry_point)] +/// Runs the Senamby desktop application. +/// +/// # Panics +/// +/// Panics if Tauri fails to initialize or run the desktop application. +pub fn run() { + tauri::Builder::default() + .plugin(tauri_plugin_dialog::init()) + .plugin(tauri_plugin_opener::init()) + .manage(AppState::new()) + .invoke_handler(tauri::generate_handler![ + create_plant, + update_plant, + list_plants, + get_plant, + open_plant_file, + import_plant_file, + close_plant, + remove_plant, + connect_plant, + disconnect_plant, + pause_plant, + resume_plant, + save_controller, + remove_controller, + save_setpoint, + save_export_file, + create_plugin, + delete_plugin, + get_plugin, + update_plugin, + import_plugin_file, + load_plugins, + list_plugins, + list_plugins_by_type, + ]) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} diff --git a/apps/desktop/src-tauri/src/main.rs b/apps/desktop/src-tauri/src/main.rs new file mode 100644 index 0000000..938f1f5 --- /dev/null +++ b/apps/desktop/src-tauri/src/main.rs @@ -0,0 +1,6 @@ +// Prevents additional console window on Windows in release, DO NOT REMOVE!! +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +fn main() { + senamby_lib::run(); +} diff --git a/apps/desktop/src-tauri/src/state/app_state.rs b/apps/desktop/src-tauri/src/state/app_state.rs new file mode 100644 index 0000000..88c1ace --- /dev/null +++ b/apps/desktop/src-tauri/src/state/app_state.rs @@ -0,0 +1,46 @@ +use crate::core::services::plugin::PluginService; +use crate::core::services::runtime::PlantRuntimeManager; +use crate::state::{plant_store::PlantStore, PluginStore}; +use std::sync::Arc; + +#[derive(Clone)] +pub struct AppState { + plant_store: Arc, + plugin_store: Arc, + runtime_manager: Arc, +} + +impl AppState { + pub fn new() -> Self { + let plant_store = Arc::new(PlantStore::new()); + let plugin_store = Arc::new(PluginStore::new()); + let runtime_manager = Arc::new(PlantRuntimeManager::new()); + if let Err(error) = PluginService::load_all(&plugin_store) { + eprintln!("Falha ao carregar plugins do workspace na inicialização: {error}"); + } + + Self { + plant_store, + plugin_store, + runtime_manager, + } + } + + pub fn plants(&self) -> &PlantStore { + &self.plant_store + } + + pub fn plugins(&self) -> &PluginStore { + &self.plugin_store + } + + pub fn runtimes(&self) -> &PlantRuntimeManager { + &self.runtime_manager + } +} + +impl Default for AppState { + fn default() -> Self { + Self::new() + } +} diff --git a/apps/desktop/src-tauri/src/state/mod.rs b/apps/desktop/src-tauri/src/state/mod.rs new file mode 100644 index 0000000..e5ab58e --- /dev/null +++ b/apps/desktop/src-tauri/src/state/mod.rs @@ -0,0 +1,11 @@ +pub mod app_state; +pub mod plant_store; +pub mod plugin_store; + +pub use app_state::AppState; +pub use plant_store::PlantStore; +pub use plugin_store::PluginStore; + +pub(crate) fn normalized_name_key(name: &str) -> String { + name.trim().to_lowercase() +} diff --git a/apps/desktop/src-tauri/src/state/plant_store.rs b/apps/desktop/src-tauri/src/state/plant_store.rs new file mode 100644 index 0000000..2b32199 --- /dev/null +++ b/apps/desktop/src-tauri/src/state/plant_store.rs @@ -0,0 +1,307 @@ +use crate::core::error::{AppError, AppResult}; +use crate::core::models::plant::Plant; +use crate::state::normalized_name_key; +use parking_lot::RwLock; +use std::collections::HashMap; + +#[derive(Debug, Default)] +pub struct PlantStore { + state: RwLock, +} + +#[derive(Debug, Default)] +struct PlantStoreInner { + plants: HashMap, + names: HashMap, +} + +impl PlantStore { + pub fn new() -> Self { + Self { + state: RwLock::new(PlantStoreInner::default()), + } + } + + pub fn insert(&self, plant: Plant) -> AppResult<()> { + let mut state = self.state.write(); + Self::insert_into_state(&mut state, plant)?; + Ok(()) + } + + pub fn get(&self, id: &str) -> AppResult { + self.state + .read() + .plants + .get(id) + .cloned() + .ok_or_else(|| AppError::NotFound(format!("Planta '{id}' não encontrada"))) + } + + pub fn read(&self, id: &str, reader: F) -> AppResult + where + F: FnOnce(&Plant) -> T, + { + let state = self.state.read(); + let plant = state + .plants + .get(id) + .ok_or_else(|| AppError::NotFound(format!("Planta '{id}' não encontrada")))?; + Ok(reader(plant)) + } + + pub fn list(&self) -> Vec { + self.state.read().plants.values().cloned().collect() + } + + pub fn remove(&self, id: &str) -> AppResult { + let mut state = self.state.write(); + let plant = state + .plants + .remove(id) + .ok_or_else(|| AppError::NotFound(format!("Planta '{id}' não encontrada")))?; + state.names.remove(&Self::name_key(&plant.name)); + Ok(plant) + } + + pub fn update(&self, id: &str, updater: F) -> AppResult + where + F: FnOnce(&mut Plant), + { + let mut state = self.state.write(); + let (previous_name_key, next_name_key, plant_id, plant_snapshot) = { + let plant = state + .plants + .get_mut(id) + .ok_or_else(|| AppError::NotFound(format!("Planta '{id}' não encontrada")))?; + let previous_name_key = Self::name_key(&plant.name); + updater(plant); + ( + previous_name_key, + Self::name_key(&plant.name), + plant.id.clone(), + plant.clone(), + ) + }; + + if previous_name_key != next_name_key { + if let Some(existing_id) = state.names.get(&next_name_key) { + if existing_id != id { + return Err(AppError::InvalidArgument(format!( + "Planta com NOME '{}' já existe", + plant_snapshot.name.trim() + ))); + } + } + state.names.remove(&previous_name_key); + state.names.insert(next_name_key, plant_id); + } + Ok(plant_snapshot) + } + + pub fn replace(&self, id: &str, next_plant: Plant) -> AppResult<()> { + let mut state = self.state.write(); + let previous_name_key = { + let current = state + .plants + .get(id) + .ok_or_else(|| AppError::NotFound(format!("Planta '{id}' não encontrada")))?; + Self::name_key(¤t.name) + }; + let next_name_key = Self::name_key(&next_plant.name); + + if next_name_key.is_empty() { + return Err(AppError::InvalidArgument( + "Nome da planta é obrigatório".into(), + )); + } + + if let Some(existing_id) = state.names.get(&next_name_key) { + if existing_id != id { + return Err(AppError::InvalidArgument(format!( + "Planta com NOME '{}' já existe", + next_plant.name.trim() + ))); + } + } + + state.names.remove(&previous_name_key); + state.names.insert(next_name_key, next_plant.id.clone()); + state.plants.insert(id.to_string(), next_plant); + Ok(()) + } + + #[cfg(test)] + pub fn exists(&self, id: &str) -> bool { + self.state.read().plants.contains_key(id) + } + + pub fn exists_by_name(&self, name: &str) -> bool { + let key = Self::name_key(name); + !key.is_empty() && self.state.read().names.contains_key(&key) + } + + pub fn exists_by_name_except(&self, id: &str, name: &str) -> bool { + let key = Self::name_key(name); + if key.is_empty() { + return false; + } + + self.state + .read() + .names + .get(&key) + .is_some_and(|existing_id| existing_id != id) + } + + #[cfg(test)] + pub fn count(&self) -> usize { + self.state.read().plants.len() + } + + fn insert_into_state(state: &mut PlantStoreInner, plant: Plant) -> AppResult<()> { + if state.plants.contains_key(&plant.id) { + return Err(AppError::InvalidArgument(format!( + "Planta com ID '{}' já existe", + plant.id + ))); + } + + let name_key = Self::name_key(&plant.name); + if name_key.is_empty() { + return Err(AppError::InvalidArgument( + "Nome da planta é obrigatório".into(), + )); + } + + if state.names.contains_key(&name_key) { + return Err(AppError::InvalidArgument(format!( + "Planta com NOME '{}' já existe", + plant.name.trim() + ))); + } + + state.names.insert(name_key, plant.id.clone()); + state.plants.insert(plant.id.clone(), plant); + Ok(()) + } + + fn name_key(name: &str) -> String { + normalized_name_key(name) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::core::models::plant::{ + Plant, PlantController, PlantDriver, PlantStats, PlantVariable, VariableType, + }; + use crate::core::models::plugin::PluginRuntime; + use std::collections::HashMap; + + fn create_test_plant(id: &str, name: &str) -> Plant { + Plant { + id: id.to_string(), + name: name.to_string(), + sample_time_ms: 100, + variables: vec![PlantVariable { + id: "var_0".to_string(), + name: "Temperatura".to_string(), + var_type: VariableType::Sensor, + unit: "°C".to_string(), + setpoint: 50.0, + pv_min: 0.0, + pv_max: 100.0, + linked_sensor_ids: None, + }], + driver: PlantDriver { + plugin_id: "driver_plugin".to_string(), + plugin_name: "Driver Python".to_string(), + runtime: PluginRuntime::Python, + source_file: Some("driver.py".to_string()), + source_code: Some("class Driver:\n pass".to_string()), + config: HashMap::new(), + }, + controllers: Vec::::new(), + connected: false, + paused: false, + stats: PlantStats::default(), + } + } + + #[test] + fn test_insert_and_get() { + let store = PlantStore::new(); + let plant = create_test_plant("plant_1", "Test Plant"); + + assert!(store.insert(plant.clone()).is_ok()); + + let retrieved = store.get("plant_1").unwrap(); + assert_eq!(retrieved.name, "Test Plant"); + } + + #[test] + fn test_insert_duplicate_fails() { + let store = PlantStore::new(); + let plant = create_test_plant("plant_1", "Test Plant"); + + assert!(store.insert(plant.clone()).is_ok()); + assert!(store.insert(plant).is_err()); + } + + #[test] + fn test_insert_duplicate_name_ignores_case_and_whitespace() { + let store = PlantStore::new(); + + assert!(store + .insert(create_test_plant("plant_1", "Planta A")) + .is_ok()); + assert!(store + .insert(create_test_plant("plant_2", " planta a ")) + .is_err()); + } + + #[test] + fn test_list() { + let store = PlantStore::new(); + store + .insert(create_test_plant("plant_1", "Plant 1")) + .unwrap(); + store + .insert(create_test_plant("plant_2", "Plant 2")) + .unwrap(); + + let plants = store.list(); + assert_eq!(plants.len(), 2); + } + + #[test] + fn test_remove() { + let store = PlantStore::new(); + store + .insert(create_test_plant("plant_1", "Test Plant")) + .unwrap(); + + let removed = store.remove("plant_1").unwrap(); + assert_eq!(removed.name, "Test Plant"); + assert!(!store.exists("plant_1")); + } + + #[test] + fn test_update() { + let store = PlantStore::new(); + store + .insert(create_test_plant("plant_1", "Original")) + .unwrap(); + + let updated = store + .update("plant_1", |p| { + p.name = "Updated".to_string(); + p.connected = true; + }) + .unwrap(); + + assert_eq!(updated.name, "Updated"); + assert!(updated.connected); + } +} diff --git a/apps/desktop/src-tauri/src/state/plugin_store.rs b/apps/desktop/src-tauri/src/state/plugin_store.rs new file mode 100644 index 0000000..c3c0799 --- /dev/null +++ b/apps/desktop/src-tauri/src/state/plugin_store.rs @@ -0,0 +1,256 @@ +use crate::core::error::{AppError, AppResult}; +use crate::core::models::plugin::PluginRegistry; +use crate::state::normalized_name_key; +use parking_lot::RwLock; +use std::collections::HashMap; + +#[derive(Debug, Default)] +pub struct PluginStore { + state: RwLock, +} + +#[derive(Debug, Default)] +struct PluginStoreState { + registries: HashMap, + names: HashMap, +} + +impl PluginStore { + pub fn new() -> Self { + Self { + state: RwLock::new(PluginStoreState::default()), + } + } + + pub fn insert(&self, registry: PluginRegistry) -> AppResult<()> { + let mut state = self.state.write(); + Self::insert_into_state(&mut state, registry)?; + Ok(()) + } + + pub fn get(&self, id: &str) -> AppResult { + self.state + .read() + .registries + .get(id) + .cloned() + .ok_or_else(|| AppError::NotFound(format!("Plugin '{id}' não encontrado"))) + } + + pub fn read(&self, id: &str, reader: F) -> AppResult + where + F: FnOnce(&PluginRegistry) -> T, + { + let state = self.state.read(); + let plugin = state + .registries + .get(id) + .ok_or_else(|| AppError::NotFound(format!("Plugin '{id}' não encontrado")))?; + Ok(reader(plugin)) + } + + pub fn find_by_type_and_name( + &self, + plugin_type: crate::core::models::plugin::PluginType, + name: &str, + reader: F, + ) -> Option + where + F: FnOnce(&PluginRegistry) -> T, + { + let normalized_name = Self::name_key(name); + if normalized_name.is_empty() { + return None; + } + + let state = self.state.read(); + let plugin_id = state.names.get(&normalized_name)?; + let plugin = state.registries.get(plugin_id)?; + (plugin.plugin_type == plugin_type).then(|| reader(plugin)) + } + + pub fn list(&self) -> Vec { + self.state.read().registries.values().cloned().collect() + } + + pub fn list_by_type( + &self, + plugin_type: crate::core::models::plugin::PluginType, + ) -> Vec { + self.state + .read() + .registries + .values() + .filter(|p| p.plugin_type == plugin_type) + .cloned() + .collect() + } + + pub fn replace(&self, id: &str, registry: PluginRegistry) -> AppResult<()> { + let mut state = self.state.write(); + let previous_name_key = { + let current = state + .registries + .get(id) + .ok_or_else(|| AppError::NotFound(format!("Plugin '{id}' não encontrado")))?; + Self::name_key(¤t.name) + }; + let next_name_key = Self::name_key(®istry.name); + + if next_name_key.is_empty() { + return Err(AppError::InvalidArgument( + "Nome do plugin é obrigatório".into(), + )); + } + + if let Some(existing_id) = state.names.get(&next_name_key) { + if existing_id != id { + return Err(AppError::InvalidArgument(format!( + "Plugin com nome '{}' já existe", + registry.name.trim() + ))); + } + } + + state.names.remove(&previous_name_key); + state.names.insert(next_name_key, registry.id.clone()); + state.registries.insert(id.to_string(), registry); + Ok(()) + } + + pub fn remove(&self, id: &str) -> AppResult { + let mut state = self.state.write(); + let registry = state + .registries + .remove(id) + .ok_or_else(|| AppError::NotFound(format!("Plugin '{id}' não encontrado")))?; + state.names.remove(&Self::name_key(®istry.name)); + Ok(registry) + } + + pub fn sync(&self, registries: Vec) -> AppResult> { + let mut next_state = PluginStoreState::default(); + for registry in registries { + Self::insert_into_state(&mut next_state, registry)?; + } + + let items = next_state.registries.values().cloned().collect::>(); + *self.state.write() = next_state; + Ok(items) + } + + pub fn exists_by_name(&self, name: &str) -> bool { + let key = Self::name_key(name); + !key.is_empty() && self.state.read().names.contains_key(&key) + } + + pub fn exists_by_name_except(&self, id: &str, name: &str) -> bool { + let key = Self::name_key(name); + if key.is_empty() { + return false; + } + + self.state + .read() + .names + .get(&key) + .is_some_and(|existing_id| existing_id != id) + } + + fn insert_into_state(state: &mut PluginStoreState, registry: PluginRegistry) -> AppResult<()> { + if state.registries.contains_key(®istry.id) { + return Err(AppError::InvalidArgument(format!( + "Plugin com ID {} já existe!", + registry.id + ))); + } + + let name_key = Self::name_key(®istry.name); + if name_key.is_empty() { + return Err(AppError::InvalidArgument( + "Nome do plugin é obrigatório".into(), + )); + } + + if state.names.contains_key(&name_key) { + return Err(AppError::InvalidArgument(format!( + "Plugin com nome '{}' já existe", + registry.name.trim() + ))); + } + + state.names.insert(name_key, registry.id.clone()); + state.registries.insert(registry.id.clone(), registry); + Ok(()) + } + + fn name_key(name: &str) -> String { + normalized_name_key(name) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::core::models::plugin::{PluginRegistry, PluginRuntime, PluginType}; + + fn create_plugin_test(id: &str, name: &str, description: Option<&str>) -> PluginRegistry { + PluginRegistry { + id: id.to_string(), + name: name.to_string(), + plugin_type: PluginType::Driver, + runtime: PluginRuntime::Python, + entry_class: "TestDriver".to_string(), + schema: vec![], + source_file: None, + source_code: None, + dependencies: vec![], + description: description.map(str::to_string), + version: None, + author: None, + } + } + + #[test] + fn test_registry_insert() { + let store = PluginStore::new(); + + let plugin1_registry = + create_plugin_test("plugin_test_1", "Plugin 1", Some("Plugin Description")); + let plugin2_registry = create_plugin_test("plugin_test_2", "Plugin 2", None); + + assert!(store.insert(plugin1_registry).is_ok()); + assert!(store.insert(plugin2_registry).is_ok()); + + let retrieved_plugin1 = store.get("plugin_test_1").unwrap(); + let retrieved_plugin2 = store.get("plugin_test_2").unwrap(); + + assert_eq!(retrieved_plugin1.name, "Plugin 1"); + assert_eq!(retrieved_plugin2.name, "Plugin 2"); + assert_eq!(retrieved_plugin2.description, None); + } + + #[test] + fn test_registry_duplicated_id() { + let store = PluginStore::new(); + + let plugin1_registry = + create_plugin_test("plugin_test_1", "Plugin 1", Some("Plugin Description")); + let plugin2_registry = create_plugin_test("plugin_test_1", "Plugin 2", None); + + assert!(store.insert(plugin1_registry).is_ok()); + assert!(store.insert(plugin2_registry).is_err()); + } + + #[test] + fn test_registry_duplicate_name_ignores_case_and_whitespace() { + let store = PluginStore::new(); + + assert!(store + .insert(create_plugin_test("plugin_test_1", "Driver Base", None)) + .is_ok()); + assert!(store + .insert(create_plugin_test("plugin_test_2", " driver base ", None)) + .is_err()); + } +} diff --git a/apps/desktop/src-tauri/tauri.conf.json b/apps/desktop/src-tauri/tauri.conf.json new file mode 100644 index 0000000..0e53281 --- /dev/null +++ b/apps/desktop/src-tauri/tauri.conf.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://schema.tauri.app/config/2", + "productName": "senamby", + "version": "0.1.0", + "identifier": "com.senamby.plotter", + "build": { + "beforeDevCommand": "pnpm dev", + "devUrl": "http://localhost:1420", + "beforeBuildCommand": "pnpm build", + "frontendDist": "../build" + }, + "app": { + "windows": [ + { + "title": "Senamby", + "width": 800, + "height": 600 + } + ], + "security": { + "csp": null + } + }, + "bundle": { + "active": true, + "targets": "all", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ] + } +} diff --git a/apps/desktop/src/app.html b/apps/desktop/src/app.html new file mode 100644 index 0000000..23b0022 --- /dev/null +++ b/apps/desktop/src/app.html @@ -0,0 +1,16 @@ + + + + + + + + Senamby + %sveltekit.head% + + +
+ %sveltekit.body% +
+ + diff --git a/apps/desktop/src/lib/components/analyzer/AnalyzerTabs.svelte b/apps/desktop/src/lib/components/analyzer/AnalyzerTabs.svelte new file mode 100644 index 0000000..17d5a1c --- /dev/null +++ b/apps/desktop/src/lib/components/analyzer/AnalyzerTabs.svelte @@ -0,0 +1,39 @@ + + + diff --git a/apps/desktop/src/lib/components/analyzer/VariableChart.svelte b/apps/desktop/src/lib/components/analyzer/VariableChart.svelte new file mode 100644 index 0000000..89cade2 --- /dev/null +++ b/apps/desktop/src/lib/components/analyzer/VariableChart.svelte @@ -0,0 +1,165 @@ + + +
+
+
+ +
+ +
+ +
+
+
+ + diff --git a/apps/desktop/src/lib/components/analyzer/VariableSelectorPanel.svelte b/apps/desktop/src/lib/components/analyzer/VariableSelectorPanel.svelte new file mode 100644 index 0000000..9896722 --- /dev/null +++ b/apps/desktop/src/lib/components/analyzer/VariableSelectorPanel.svelte @@ -0,0 +1,148 @@ + + +
+
+

Variáveis

+ +
+ +
+ {#if variables.length === 0} +
+ Nenhuma variável encontrada +
+ {:else} + {#each variables as variable (variable.index)} + + {/each} + {/if} +
+ +
+

+ Métodos de análise +

+
+ {#each analysisMethods as method (method.id)} + + {/each} +
+ + +
+
diff --git a/apps/desktop/src/lib/components/charts/PlotlyChart.svelte b/apps/desktop/src/lib/components/charts/PlotlyChart.svelte new file mode 100644 index 0000000..9419a7c --- /dev/null +++ b/apps/desktop/src/lib/components/charts/PlotlyChart.svelte @@ -0,0 +1,940 @@ + + + +
{ + _pointerInside = true; + }} + onpointerleave={() => { + _pointerInside = false; + if (!_panning) { + resetWrapperCursor(); + flushDeferredUpdate(); + } + }} +> +
+
+ + diff --git a/apps/desktop/src/lib/components/charts/VariableCard.svelte b/apps/desktop/src/lib/components/charts/VariableCard.svelte new file mode 100644 index 0000000..b367263 --- /dev/null +++ b/apps/desktop/src/lib/components/charts/VariableCard.svelte @@ -0,0 +1,424 @@ + + +
+
+
+
+

+ {title} + {#if unit} + ({unit}) + {/if} +

+ {#if showStats} +
+
+ Erro: + + {formatMetricValue(resolvedStats.errorAvg, 2)} + +
+
+ Estab: + + {formatMetricValue(resolvedStats.stability, 0, '%')} + +
+
+ {/if} +
+ {#if showLegendNow} +
+
+
+ {pvLabel} + + {formatLegendValue(currentPvValue, unit)} + +
+
+
+ {spLabel} + + {formatLegendValue(currentSpValue, unit)} + +
+ {#each actuators as act, idx} +
+
+ {lineStyles[act.dataKey]?.label ?? act.name} + + {formatLegendValue(currentActuatorValueById[act.id] ?? null, act.unit)} + +
+ {/each} +
+ {/if} +
+ {#if isCollapsedActuator} +
+ Saída de controle recolhida para caber na altura disponível. + +
+ {/if} +
+ +
+
+
+ +
+ {#if showActuatorChart} +
+ +
+ {/if} +
+
+
+ + diff --git a/apps/desktop/src/lib/components/charts/VariableGrid.svelte b/apps/desktop/src/lib/components/charts/VariableGrid.svelte new file mode 100644 index 0000000..d9060ca --- /dev/null +++ b/apps/desktop/src/lib/components/charts/VariableGrid.svelte @@ -0,0 +1,219 @@ + + +
+ {#each visibleSensors as sensorEntry, displayIdx (sensorEntry.variable.id)} + {@const cardPvConfig = getVariableChartConfig(pvConfig, sensorEntry.originalIndex)} + {@const cardMvConfig = getVariableChartConfig(mvConfig, sensorEntry.originalIndex)} +
+ onRangeChange(sensorEntry.originalIndex, xMin, xMax) + : undefined} + /> +
+ {/each} +
+ +{#if viewMode === 'single' && sensorEntries.length > 1} +
+ + {sensorEntries[focusedIndex]?.variable.name ?? 'Sensor'} ({focusedIndex + 1}/{sensorEntries.length}) + + + [Space] próxima • [H] grid + +
+{/if} + + diff --git a/apps/desktop/src/lib/components/controllers/ControllerVariableBindings.svelte b/apps/desktop/src/lib/components/controllers/ControllerVariableBindings.svelte new file mode 100644 index 0000000..9dfa16a --- /dev/null +++ b/apps/desktop/src/lib/components/controllers/ControllerVariableBindings.svelte @@ -0,0 +1,63 @@ + + +
+
+
{label}
+
{helper}
+
+ + {#if variables.length === 0} +
+ {emptyLabel} +
+ {:else} +
+ {#each variables as variable (variable.id)} + {@const selected = selectedIds.includes(variable.id)} + + {/each} +
+ {/if} +
diff --git a/apps/desktop/src/lib/components/layout/Sidebar.svelte b/apps/desktop/src/lib/components/layout/Sidebar.svelte new file mode 100644 index 0000000..4b40f2a --- /dev/null +++ b/apps/desktop/src/lib/components/layout/Sidebar.svelte @@ -0,0 +1,126 @@ + + + diff --git a/apps/desktop/src/lib/components/layout/SidebarBtn.svelte b/apps/desktop/src/lib/components/layout/SidebarBtn.svelte new file mode 100644 index 0000000..12748ab --- /dev/null +++ b/apps/desktop/src/lib/components/layout/SidebarBtn.svelte @@ -0,0 +1,35 @@ + + + diff --git a/apps/desktop/src/lib/components/modals/CodeEditorModal.svelte b/apps/desktop/src/lib/components/modals/CodeEditorModal.svelte new file mode 100644 index 0000000..f6725a6 --- /dev/null +++ b/apps/desktop/src/lib/components/modals/CodeEditorModal.svelte @@ -0,0 +1,228 @@ + + +{#if visible} + + +
+
e.stopPropagation()} + > +
+
+ +

{title}

+
+ +
+ +
+
+ +
+ + Python + +
+ +
+
+ +
+ + +
+
+
+ +
+
+ {lineCount} linhas · {code.length} caracteres · {CODE_LANGUAGE_LABELS[language]} +
+
+ + +
+
+
+
+{/if} diff --git a/apps/desktop/src/lib/components/modals/ControllerBindingsModal.svelte b/apps/desktop/src/lib/components/modals/ControllerBindingsModal.svelte new file mode 100644 index 0000000..c25ab7e --- /dev/null +++ b/apps/desktop/src/lib/components/modals/ControllerBindingsModal.svelte @@ -0,0 +1,147 @@ + + +{#if visible} + + +
+
event.stopPropagation()} + > +
+
+

Editar vínculos de {controllerName}

+

+ Atualize apenas as variáveis de entrada e saída do controlador. +

+
+ +
+ +
+ {#if error} +
+ + {error} +
+ {/if} + + inputVariableIds = ids} + /> + + outputVariableIds = ids} + /> +
+ +
+ + +
+
+
+{/if} diff --git a/apps/desktop/src/lib/components/modals/ControllerLibraryModal.svelte b/apps/desktop/src/lib/components/modals/ControllerLibraryModal.svelte new file mode 100644 index 0000000..e7d3b8c --- /dev/null +++ b/apps/desktop/src/lib/components/modals/ControllerLibraryModal.svelte @@ -0,0 +1,166 @@ + + +{#if visible} + + +
+
event.stopPropagation()} + > +
+
+

Biblioteca de Controladores

+

+ Escolha um controlador da sua biblioteca. +

+
+ +
+ +
+
+ + +
+ + {#if error} +
+ + {error} +
+ {/if} + + {#if isLoading} +
+ Carregando controladores... +
+ {:else if filteredTemplates.length === 0} +
+
+ +
+
+ Nenhum controlador encontrado +
+

+ Adicione controladores no módulo Plugins para usá-los aqui. +

+
+ {:else} +
+ {#each filteredTemplates as template (template.id)} + + {/each} +
+ {/if} +
+
+
+{/if} diff --git a/apps/desktop/src/lib/components/modals/CreatePlantModal.svelte b/apps/desktop/src/lib/components/modals/CreatePlantModal.svelte new file mode 100644 index 0000000..319cb4f --- /dev/null +++ b/apps/desktop/src/lib/components/modals/CreatePlantModal.svelte @@ -0,0 +1,1123 @@ + + +{#if visible} + + +
+
event.stopPropagation()} + > +
+
+

{modalTitle}

+

{modalDescription}

+
+ +
+ +
+ + + + +
+ +
+
+ + Etapa {currentStepIndex + 1} de {stepOrder.length} + + + {sensorCount} sensor(es) + + + {actuatorCount} atuador(es) + + + {normalizedSampleTimeMs > 0 ? `${normalizedSampleTimeMs} ms` : 'Amostragem pendente'} + + {#if driverInstance} + + Driver pronto + + {/if} +
+
+ +
+ {#if error} +
+ {error} +
+ {/if} + + {#if currentStep === 'info'} +
+ + + + +
+
+
+

Resumo da configuração

+

+ Revise rapidamente as etapas da planta antes de salvar. +

+
+
+ +
+
+
+ +
+
+
+
Variáveis
+ + {variables.length} no total + +
+
+ {sensorCount} sensor(es) · {actuatorCount} atuador(es) +
+
+ {#each variables as variable (variable.id)} + + {#if variable.type === 'sensor'} + + {:else} + + {/if} + {variable.name} + + {/each} +
+
+ +
+
+ +
+
+
+ +
+
+
+
Driver
+ + {driverInstance ? 'configurado' : 'pendente'} + +
+ {#if driverInstance} +
{driverInstance.pluginName}
+
+ {sensorCount} sensor(es) · {actuatorCount} atuador(es) · {normalizedSampleTimeMs > 0 ? `${normalizedSampleTimeMs} ms` : 'sem amostragem'} +
+ {:else} +
+ Nenhum driver selecionado ainda. +
+ {/if} +
+ +
+
+ +
+
+
+ +
+
+
+
Controladores
+ + {selectedControllers.length} configurado(s) + +
+ {#if selectedControllers.length > 0} +
+ Revise entradas, saídas e nomes dos controladores adicionados. +
+
+ {#each selectedControllers as controller (controller.id)} +
+
{controller.name}
+
+ {controller.type} · {controller.inputVariableIds.length} entrada(s) · {controller.outputVariableIds.length} saída(s) +
+
+ {/each} +
+ {:else} +
+ Nenhum controlador configurado ainda. +
+ {/if} +
+ +
+
+
+
+ + {:else if currentStep === 'driver'} +
+ {#if importError} +
+ {importError} +
+ {/if} + +
+ O driver usa automaticamente a quantidade de sensores e atuadores da planta. Você não precisa preencher isso manualmente. +
+ + {#if driverInstance} +
+
+
+ +
+
+
{driverInstance.pluginName}
+
+ {sensorCount} sensor(es) · {actuatorCount} atuador(es) +
+
+ +
+
+ {/if} + +
+ + +
+ +
+ {#each filteredPlugins as plugin (plugin.id)} + + {/each} + + {#if filteredPlugins.length === 0} +
+ +

Nenhum driver encontrado

+
+ {/if} +
+ +
+ + +
+
+ + {:else if currentStep === 'variables'} +
+
+
+
Variáveis da planta
+
Cada alteração atualiza automaticamente os dados do driver.
+
+ +
+ + {#each variables as variable, index (variable.id)} +
+
+
+ {#if variable.type === 'sensor'} + + {:else} + + {/if} +
+
+
+ + +
+
+ + {#if variable.type === 'sensor'} + + {/if} + + +
+ {#if variable.type === 'atuador'} +
+
+ + Vincular a Sensores +
+ {#if sensorVariables.length === 0} +

Nenhum sensor disponível. Adicione sensores primeiro.

+ {:else} +
+ {#each sensorVariables as sensor (sensor.id)} + + {/each} +
+ {/if} +
+ {/if} +
+ {#if variables.length > 1} + + {/if} +
+
+ {/each} + + +
+ + {:else if currentStep === 'controllers'} +
+ {#if selectedControllers.length > 0} +
+

Controladores Adicionados

+ {#each selectedControllers as controller (controller.id)} +
+
+
+ +
+
+
{controller.name}
+
+ {controller.type} · {controller.inputVariableIds.length} entrada(s) · {controller.outputVariableIds.length} saída(s) +
+
+ +
+
+ {/each} +
+ {/if} + +
+

Controladores disponíveis

+ +
+ + +
+ +
+ {#each filteredTemplates as template (template.id)} + + {/each} +
+
+
+ {/if} +
+ +
+
+ + {#if !isFirstStep} + + {/if} +
+
+ {#if !isLastStep} + + {/if} + +
+
+
+
+ + showCreatePlugin = false} + onPluginCreated={handlePluginCreated} + /> + + { + showInstanceConfig = false; + pluginToConfig = null; + configTarget = null; + }} + onConfigured={handleInstanceConfigured} + /> +{/if} diff --git a/apps/desktop/src/lib/components/modals/CreatePluginModal.svelte b/apps/desktop/src/lib/components/modals/CreatePluginModal.svelte new file mode 100644 index 0000000..2348011 --- /dev/null +++ b/apps/desktop/src/lib/components/modals/CreatePluginModal.svelte @@ -0,0 +1,1142 @@ + + +{#if visible} + + +
+
e.stopPropagation()} + > +
+
+

{modalTitle}

+

+ {modalDescription} +

+
+ +
+ +
+ {#if error} +
+ + {error} +
+ {/if} + +
+ +
+ Classe Principal * +
+ {entryClass || suggestedEntryClass} +
+
+ +
+ +
+ +
+ Linguagem * +
+ {PLUGIN_RUNTIME_LABELS[PLUGIN_CREATION_RUNTIMES[0]]} +
+
+
+ + {#if !isKindLocked && kindMode === 'custom'} + + {/if} + +
+ Código Fonte * ({runtimeExtension}) +
+ + +
+
+ + {#if runtime === 'python'} +
+
+ Dependências Python (pip) + {dependencies.length} pacote(s) +
+ +
+ {#each dependencies as dep, i (i)} +
+ updateDependencyName(i, (e.target as HTMLInputElement).value)} + placeholder="nome-do-pacote" + class="flex-1 h-9 px-2 rounded border border-slate-200 dark:border-white/10 bg-white dark:bg-[#18181b] text-sm focus:outline-none focus:ring-2 focus:ring-blue-500/50 font-mono" + /> + updateDependencyVersion(i, (e.target as HTMLInputElement).value)} + placeholder=">=1.0.0" + class="h-9 w-full rounded border border-slate-200 bg-white px-2 text-sm font-mono focus:outline-none focus:ring-2 focus:ring-blue-500/50 dark:border-white/10 dark:bg-[#18181b] sm:w-28" + /> + +
+ {/each} +
+ + +
+ {/if} + +
+
+
+ Campos de Configuração + {#if isDriverKind} + (sensores e atuadores são preenchidos automaticamente) + {/if} +
+ {formFields.length} campo(s) +
+ +
+ {#each formFields as field, i (i)} +
+
+
+
+ updateFieldName(i, (e.target as HTMLInputElement).value)} + placeholder="nome_campo" + class="w-full h-9 px-2 rounded border border-slate-200 dark:border-white/10 bg-white dark:bg-[#18181b] text-sm focus:outline-none focus:ring-2 focus:ring-blue-500/50 font-mono {fieldErrors[i] ? 'border-red-400 dark:border-red-500' : ''}" + /> + {#if fieldErrors[i]} +

{fieldErrors[i]}

+ {/if} +
+ +
+ +
+ {#if field.hasDefault && field.type === 'list'} +
+
+ + + {field.defaultListValues.length} item(ns) + +
+ +
+ {#if field.defaultListValues.length === 0} +

Nenhum item na lista

+ {/if} +
+ {#each field.defaultListValues as item, itemIndex (itemIndex)} + {@const itemError = getListDefaultItemTypeError(item)} +
+
+ {#if item.type === 'bool'} + + {:else if item.type === 'int' || item.type === 'float'} + updateListDefaultItemValue(i, itemIndex, (e.target as HTMLInputElement).value)} + onblur={() => formatListDefaultItemByType(i, itemIndex)} + placeholder={item.type === 'float' ? '0.0' : '0'} + class="w-full h-8 px-2 rounded border border-slate-200 dark:border-white/10 bg-white dark:bg-[#18181b] text-xs focus:outline-none focus:ring-2 focus:ring-blue-500/50 font-mono" + /> + {:else if item.type === 'list'} + + {:else} + updateListDefaultItemValue(i, itemIndex, (e.target as HTMLInputElement).value)} + onblur={() => formatListDefaultItemByType(i, itemIndex)} + placeholder={`item_${itemIndex + 1}`} + class="w-full h-8 px-2 rounded border border-slate-200 dark:border-white/10 bg-white dark:bg-[#18181b] text-xs focus:outline-none focus:ring-2 focus:ring-blue-500/50 font-mono" + /> + {/if} + {#if itemError} +

{itemError}

+ {/if} +
+ + +
+ {/each} +
+ +
+
+ {:else} +
+ + {#if field.hasDefault} + {#if field.type === 'bool'} + + {:else if field.type === 'int' || field.type === 'float'} + updateFieldDefaultValue(i, (e.target as HTMLInputElement).value)} + placeholder="0" + class="flex-1 h-8 px-2 rounded border border-slate-200 dark:border-white/10 bg-white dark:bg-[#18181b] text-xs focus:outline-none focus:ring-2 focus:ring-blue-500/50" + /> + {:else if field.type === 'string'} + updateFieldDefaultValue(i, (e.target as HTMLInputElement).value)} + placeholder="valor padrão" + class="flex-1 h-8 px-2 rounded border border-slate-200 dark:border-white/10 bg-white dark:bg-[#18181b] text-xs focus:outline-none focus:ring-2 focus:ring-blue-500/50" + /> + {/if} + {:else} + obrigatório + {/if} +
+ {/if} +
+ {/each} +
+ + +
+
+ +
+ + +
+
+
+ + { showCodeEditor = false; }} + onSave={handleCodeEditorSave} + /> +{/if} diff --git a/apps/desktop/src/lib/components/modals/GenericModal.svelte b/apps/desktop/src/lib/components/modals/GenericModal.svelte new file mode 100644 index 0000000..11ba4bb --- /dev/null +++ b/apps/desktop/src/lib/components/modals/GenericModal.svelte @@ -0,0 +1,81 @@ + + +{#if visible} +
+
+
+
+
+ +
+
+

{title}

+

{message}

+
+
+
+
+ {#if onClose} + + {/if} + +
+
+
+{/if} diff --git a/apps/desktop/src/lib/components/modals/GlobalSettingsModal.svelte b/apps/desktop/src/lib/components/modals/GlobalSettingsModal.svelte new file mode 100644 index 0000000..899adb4 --- /dev/null +++ b/apps/desktop/src/lib/components/modals/GlobalSettingsModal.svelte @@ -0,0 +1,69 @@ + + +{#if showGlobalSettings} + +{/if} + + diff --git a/apps/desktop/src/lib/components/modals/PlantRemovalModal.svelte b/apps/desktop/src/lib/components/modals/PlantRemovalModal.svelte new file mode 100644 index 0000000..5b21585 --- /dev/null +++ b/apps/desktop/src/lib/components/modals/PlantRemovalModal.svelte @@ -0,0 +1,82 @@ + + +{#if visible} +
e.key === 'Escape' && onCancel()} + role="dialog" + aria-modal="true" + tabindex="-1" + > + +
e.stopPropagation()} + onkeydown={(e: KeyboardEvent) => e.key === 'Enter' && e.stopPropagation()} + role="document" + > +
+
+ {#if reason === 'min-units'} + + {:else} + + {/if} +
+
+

+ {reason === 'min-units' ? 'Ação não permitida' : 'Fechar planta'} +

+

+ {#if reason === 'min-units'} + É necessário manter ao menos uma unidade ativa no sistema. + {:else} + Deseja fechar a planta {plantName}? A runtime será encerrada, a planta sairá da sessão atual e continuará salva nos arquivos. + {/if} +

+
+
+
+ {#if reason === 'min-units'} + + {:else} + + + {/if} +
+
+
+{/if} diff --git a/apps/desktop/src/lib/components/modals/PluginInstanceConfigModal.svelte b/apps/desktop/src/lib/components/modals/PluginInstanceConfigModal.svelte new file mode 100644 index 0000000..2e070fa --- /dev/null +++ b/apps/desktop/src/lib/components/modals/PluginInstanceConfigModal.svelte @@ -0,0 +1,401 @@ + + +{#if visible && plugin} + + +
+
e.stopPropagation()} + > +
+
+

Configurar {pluginLabel}

+

+ {plugin.schema.length} ajuste(s) para preencher +

+
+ +
+ +
+ {#if error} +
+ + {error} +
+ {/if} + + {#if showVariableBindings} +
+
+

Vincular variáveis

+

+ Defina quais sensores entram no controlador e quais atuadores ele comanda. +

+
+ + inputVariableIds = ids} + /> + + outputVariableIds = ids} + /> +
+ {/if} + + {#if plugin.schema.length === 0} +
+ Este item não precisa de ajustes adicionais. +
+ {:else} + {#each plugin.schema as field (field.name)} + {@const locked = isLockedField(field.name)} +
+
+ + {field.name} + + + {SCHEMA_FIELD_TYPE_LABELS[field.type]} + + {#if isFieldRequired(field)} + + obrigatório + + {/if} + {#if locked} + + automático + + {/if} +
+ + {#if field.description} +

{field.description}

+ {:else if locked && isAutoSchemaField(field.name)} +

Valor sincronizado com a quantidade de variáveis da planta.

+ {/if} + + {#if field.type === 'bool'} + + + {:else if field.type === 'int'} + setNumber(field.name, (e.target as HTMLInputElement).value, false)} + disabled={locked} + class="w-full h-10 px-3 rounded-lg border border-slate-200 dark:border-white/10 bg-white dark:bg-[#18181b] text-sm focus:outline-none focus:ring-2 focus:ring-blue-500/50 disabled:cursor-not-allowed disabled:bg-slate-50 dark:disabled:bg-white/[0.03]" + /> + + {:else if field.type === 'float'} + setNumber(field.name, (e.target as HTMLInputElement).value, true)} + disabled={locked} + class="w-full h-10 px-3 rounded-lg border border-slate-200 dark:border-white/10 bg-white dark:bg-[#18181b] text-sm focus:outline-none focus:ring-2 focus:ring-blue-500/50 disabled:cursor-not-allowed disabled:bg-slate-50 dark:disabled:bg-white/[0.03]" + /> + + {:else if field.type === 'string'} + setString(field.name, (e.target as HTMLInputElement).value)} + placeholder={`Valor de ${field.name}`} + disabled={locked} + class="w-full h-10 px-3 rounded-lg border border-slate-200 dark:border-white/10 bg-white dark:bg-[#18181b] text-sm focus:outline-none focus:ring-2 focus:ring-blue-500/50 disabled:cursor-not-allowed disabled:bg-slate-50 dark:disabled:bg-white/[0.03]" + /> + + {:else if field.type === 'list'} +
+ {#if Array.isArray(config[field.name]) && (config[field.name] as SchemaFieldValue[]).length > 0} +
+ {#each (config[field.name] as SchemaFieldValue[]) as item, idx} +
+ {item} + +
+ {/each} +
+ {/if} +
+ handleListKeydown(e, field.name)} + placeholder="Adicionar item..." + disabled={locked} + class="flex-1 h-9 px-3 rounded-lg border border-slate-200 dark:border-white/10 bg-white dark:bg-[#18181b] text-sm focus:outline-none focus:ring-2 focus:ring-blue-500/50 disabled:cursor-not-allowed disabled:bg-slate-50 dark:disabled:bg-white/[0.03]" + /> + +
+
+ {/if} +
+ {/each} + {/if} +
+ +
+ + +
+
+
+{/if} diff --git a/apps/desktop/src/lib/components/modules/AnalyzerModule.svelte b/apps/desktop/src/lib/components/modules/AnalyzerModule.svelte new file mode 100644 index 0000000..7e4d0d6 --- /dev/null +++ b/apps/desktop/src/lib/components/modules/AnalyzerModule.svelte @@ -0,0 +1,606 @@ + + + + + + + + + showErrorModal = false} + onClose={() => showErrorModal = false} +/> diff --git a/apps/desktop/src/lib/components/modules/PlotterModule.svelte b/apps/desktop/src/lib/components/modules/PlotterModule.svelte new file mode 100644 index 0000000..cb47c78 --- /dev/null +++ b/apps/desktop/src/lib/components/modules/PlotterModule.svelte @@ -0,0 +1,13 @@ + + + diff --git a/apps/desktop/src/lib/components/modules/PlotterWorkspaceModule.svelte b/apps/desktop/src/lib/components/modules/PlotterWorkspaceModule.svelte new file mode 100644 index 0000000..eb2658e --- /dev/null +++ b/apps/desktop/src/lib/components/modules/PlotterWorkspaceModule.svelte @@ -0,0 +1,1480 @@ + + + + + + + diff --git a/apps/desktop/src/lib/components/modules/PluginsModule.svelte b/apps/desktop/src/lib/components/modules/PluginsModule.svelte new file mode 100644 index 0000000..266192f --- /dev/null +++ b/apps/desktop/src/lib/components/modules/PluginsModule.svelte @@ -0,0 +1,446 @@ + + +
+
+
+
+
+
+
+ +
+
+
+

Plugins

+ + {pluginCount} itens + +
+

Encontre, edite e organize seus plugins em um só lugar.

+
+
+
+ +
+
+ + +
+ +
+ + + + + +
+
+
+ +
+ activeCategory = cat} + /> +
+
+
+ +
+
+
+ {#if dragOver} +
+
+ +

Solte o arquivo JSON para importar o plugin

+
+
+ {/if} + +
+
+

Biblioteca

+

Use os filtros para encontrar, editar ou adicionar plugins rapidamente.

+
+
+ + {#if loadError} +
+ {loadError} +
+ {/if} + + {#if isLoading} +
+
+ +

Carregando biblioteca de plugins...

+
+
+ {:else if isEmpty && !searchQuery} +
+
+ +
+
+

+ Nenhum plugin do tipo {activeCategoryLabel} cadastrado +

+

+ Crie um novo plugin ou importe um arquivo JSON para começar sua biblioteca. +

+
+
+ + +
+

+ Dica: arraste um arquivo .json para esta área +

+
+ {:else if isEmpty && searchQuery} +
+ +

Nenhum resultado encontrado

+

+ Não encontramos plugins correspondentes a "{searchQuery}". +

+ +
+ {:else} +
+ {#each filteredPlugins as plugin (plugin.id)} + + {/each} +
+ {/if} +
+
+
+
+ + +{#if showCreateModal} + { showCreateModal = false; selectedPlugin = null; createModalInitialKind = undefined; }} + onPluginCreated={handlePluginCreated} + /> +{/if} + + +{#if showCodeViewer && selectedPlugin?.sourceCode} + +{/if} + + + { showDeleteConfirm = false; selectedPlugin = null; }} +/> + + showImportModal = false} +/> diff --git a/apps/desktop/src/lib/components/plotter/ChartContextMenu.svelte b/apps/desktop/src/lib/components/plotter/ChartContextMenu.svelte new file mode 100644 index 0000000..69b2f75 --- /dev/null +++ b/apps/desktop/src/lib/components/plotter/ChartContextMenu.svelte @@ -0,0 +1,206 @@ + + +{#if visible} +
{ + e.stopPropagation(); + scheduleAutoClose(); + }} + onkeydown={(e: KeyboardEvent) => e.key === 'Escape' && onClose()} + onmouseenter={() => scheduleAutoClose()} + onmousemove={() => scheduleAutoClose()} + onfocusin={() => scheduleAutoClose()} + onmouseleave={() => scheduleAutoClose(450)} + role="menu" + tabindex="-1" + > +
+
+ Eixo X (Tempo) {chartState.xMode} +
+
+ + + +
+ {#if chartState.xMode === 'sliding'} +
+ Janela (s): + +
+ {/if} +
+
+
+
+ {seriesTitle} +
+
+ {#if hasDynamicSeries} + {#each seriesControls as item (item.key)} +
+
+ + {item.label} +
+
+ onChangeSeriesColor?.(item.key, (e.target as HTMLInputElement).value)} + class="w-16 h-5 text-[10px] font-mono bg-transparent border border-slate-200 dark:border-white/10 rounded px-1 text-slate-600 dark:text-slate-300 focus:outline-none focus:border-blue-500 text-right uppercase" + /> +
+ onChangeSeriesColor?.(item.key, (e.target as HTMLInputElement).value)} + class="absolute -top-1/2 -left-1/2 w-[200%] h-[200%] cursor-pointer p-0 m-0 border-0 opacity-0" + /> +
+
+
+ {/each} + {:else if lineColors} +
+
+ + PV (Process) +
+
+ +
+ +
+
+
+
+
+ + SP (Setpoint) +
+
+ +
+ +
+
+
+
+
+ + MV (Output) +
+
+ +
+ +
+
+
+ {/if} +
+
+
+
+
+ Eixo Y {chartState.yMode} +
+
+ + +
+ {#if chartState.yMode === 'manual'} +
+ + +
+ {/if} +
+
+{/if} diff --git a/apps/desktop/src/lib/components/plotter/ControllerPanel.svelte b/apps/desktop/src/lib/components/plotter/ControllerPanel.svelte new file mode 100644 index 0000000..07b94fd --- /dev/null +++ b/apps/desktop/src/lib/components/plotter/ControllerPanel.svelte @@ -0,0 +1,369 @@ + + +
+
+

Malhas de Controle

+ +
+
+ {#if plant} +
+ + + {#if setpointsExpanded} +
+ {#each sensorVariables as { variable, index } (variable.id)} +
+
+ + {variable.name} + +
+
+ onUpdateSetpoint(index, Number((e.target as HTMLInputElement).value))} + class="w-20 px-2 py-1 text-sm font-mono font-bold text-right text-blue-600 dark:text-blue-400 bg-transparent border border-slate-200 dark:border-white/10 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500/50" + /> + + {variable.unit} + +
+
+ {/each} +
+ {/if} +
+ +
+ +
+
+ Controladores + +
+
+ {#each plant.controllers as ctrl (ctrl.id)} +
+
+
+ onToggleControllerActive(ctrl.id, !ctrl.active)} /> + onUpdateControllerMeta(ctrl.id, 'name', (e.target as HTMLInputElement).value)} + class="bg-transparent text-sm font-semibold text-slate-700 dark:text-zinc-200 w-32 focus:text-blue-600 dark:focus:text-blue-400 transition-colors" + style="border: none; outline: none; box-shadow: none;" + /> + {#if ctrl.runtimeStatus === 'pending_restart'} + + Pendente de restart + + {/if} +
+
+ + +
+
+
+
+
+
Entradas
+
{ctrl.inputVariableIds.length} selecionada(s)
+
+
+
Saídas
+
{ctrl.outputVariableIds.length} selecionada(s)
+
+
+ + {#each Object.entries(ctrl.params) as [key, param]} + updateParamValidity(ctrl.id, key, isValid)} + onChange={(newValue: any) => onUpdateControllerParam(ctrl.id, key, newValue)} + /> + {/each} + + {#if isControllerDirty(ctrl) || saveFeedback[getControllerKey(ctrl.id)]} +
+ {#if saveFeedback[getControllerKey(ctrl.id)]} + {@const feedback = saveFeedback[getControllerKey(ctrl.id)]} +
+ {feedback.message} +
+ {/if} + + {#if isControllerDirty(ctrl)} +
+ + Voce ainda nao salvou estas alteracoes. + + +
+ {/if} +
+ {/if} +
+
+ {/each} +
+
+ {/if} +
+
diff --git a/apps/desktop/src/lib/components/plotter/PlantAddMenu.svelte b/apps/desktop/src/lib/components/plotter/PlantAddMenu.svelte new file mode 100644 index 0000000..7affe9a --- /dev/null +++ b/apps/desktop/src/lib/components/plotter/PlantAddMenu.svelte @@ -0,0 +1,67 @@ + + +{#if visible} + + +
+
e.stopPropagation()} + > + + +
+ + +
+
+{/if} diff --git a/apps/desktop/src/lib/components/plotter/PlantTabs.svelte b/apps/desktop/src/lib/components/plotter/PlantTabs.svelte new file mode 100644 index 0000000..dc0b836 --- /dev/null +++ b/apps/desktop/src/lib/components/plotter/PlantTabs.svelte @@ -0,0 +1,82 @@ + + + + + menuVisible = false} + {onOpenFile} + {onCreateNew} +/> diff --git a/apps/desktop/src/lib/components/plotter/PlotterToolbar.svelte b/apps/desktop/src/lib/components/plotter/PlotterToolbar.svelte new file mode 100644 index 0000000..8865d58 --- /dev/null +++ b/apps/desktop/src/lib/components/plotter/PlotterToolbar.svelte @@ -0,0 +1,261 @@ + + + + +
+
+ + + + + +
+ + {#if exportMenuOpen} +
+ + +
+ {/if} +
+ +
+ +
+ + + + +
+
+ + diff --git a/apps/desktop/src/lib/components/plugins/PluginCard.svelte b/apps/desktop/src/lib/components/plugins/PluginCard.svelte new file mode 100644 index 0000000..58ad775 --- /dev/null +++ b/apps/desktop/src/lib/components/plugins/PluginCard.svelte @@ -0,0 +1,202 @@ + + +
+
+
+
+
+

+ {plugin.name} +

+ + {getPluginKindLabel(plugin.kind)} + + {#if plugin.source === 'workspace'} + + Personalizado + + {/if} +
+ +
+ {#if plugin.description} +

+ {plugin.description} +

+ {:else} +

+ Sem descrição registrada para este plugin. +

+ {/if} +
+
+ +
+ + + {#if menuOpen} +
+
event.stopPropagation()} + onkeydown={(event) => event.stopPropagation()} + role="menu" + tabindex="-1" + class="w-40 rounded-lg border border-slate-200 bg-white py-1 shadow-lg backdrop-blur-sm dark:border-white/10 dark:bg-zinc-800" + > + {#if onViewCode && plugin.sourceCode} + + {/if} + {#if onEdit} + + {/if} + {#if onDelete} + + {/if} +
+
+ {/if} +
+
+ +
+ + + {PLUGIN_RUNTIME_LABELS[plugin.runtime]} + + {#if plugin.version} + v{plugin.version} + {/if} + {#if plugin.schema.length > 0} + {plugin.schema.length} ajustes + {/if} +
+
+
diff --git a/apps/desktop/src/lib/components/plugins/PluginCategoryTabs.svelte b/apps/desktop/src/lib/components/plugins/PluginCategoryTabs.svelte new file mode 100644 index 0000000..ef119fe --- /dev/null +++ b/apps/desktop/src/lib/components/plugins/PluginCategoryTabs.svelte @@ -0,0 +1,54 @@ + + +
+ {#each categories as category} + {@const isActive = activeCategory === category.key} + {@const Icon = getCategoryIcon(category.key)} + + {/each} +
diff --git a/apps/desktop/src/lib/components/ui/DynamicParamInput.svelte b/apps/desktop/src/lib/components/ui/DynamicParamInput.svelte new file mode 100644 index 0000000..f863d12 --- /dev/null +++ b/apps/desktop/src/lib/components/ui/DynamicParamInput.svelte @@ -0,0 +1,118 @@ + + +{#if type === 'boolean'} +
+ + +
+{:else} +
+ +
+ + {#if error} +
+ {error} +
+ {/if} +
+
+{/if} diff --git a/apps/desktop/src/lib/components/ui/SimpleToggle.svelte b/apps/desktop/src/lib/components/ui/SimpleToggle.svelte new file mode 100644 index 0000000..d792d05 --- /dev/null +++ b/apps/desktop/src/lib/components/ui/SimpleToggle.svelte @@ -0,0 +1,26 @@ + + + + diff --git a/apps/desktop/src/lib/components/ui/WorkspaceTabs.svelte b/apps/desktop/src/lib/components/ui/WorkspaceTabs.svelte new file mode 100644 index 0000000..f6e95cd --- /dev/null +++ b/apps/desktop/src/lib/components/ui/WorkspaceTabs.svelte @@ -0,0 +1,145 @@ + + +
+
+
+
+ {#each items as item (item.id)} +
+ + + {#if item.closable && onRemove} + + {/if} +
+ {/each} +
+ + {#if !useFixedAddButton} + + {/if} +
+
+ + {#if useFixedAddButton} + + {/if} +
diff --git a/apps/desktop/src/lib/services/analyzerBackend.ts b/apps/desktop/src/lib/services/analyzerBackend.ts new file mode 100644 index 0000000..d8a7f82 --- /dev/null +++ b/apps/desktop/src/lib/services/analyzerBackend.ts @@ -0,0 +1,111 @@ +import type { ProcessedVariableData, AnalyzerActuatorInfo } from '$lib/types/analyzer'; +import type { PlantExportJSON, ExportSensor } from '$lib/types/plantExport'; +import { validatePlantExportJSON } from '$lib/types/plantExport'; + +interface BackendResponse { + success: boolean; + error?: string; + variables?: ProcessedVariableData[]; + plantName?: string; +} + +function calcRange(values: number[]): { min: number; max: number } { + if (values.length === 0) return { min: 0, max: 100 }; + const min = Math.min(...values); + const max = Math.max(...values); + const pad = (max - min) * 0.1 || 1; + return { min: Math.floor(min - pad), max: Math.ceil(max + pad) }; +} + +function convertJSONToProcessedVariables(json: PlantExportJSON): ProcessedVariableData[] { + const result: ProcessedVariableData[] = []; + + json.sensors.forEach((sensor: ExportSensor, index: number) => { + const sensorData = json.data.map((sample) => ({ + time: sample.time, + value: sample.sensors[sensor.id] ?? 0, + })); + + const setpointData = json.data.map((sample) => ({ + time: sample.time, + value: sample.setpoints[sensor.setpointId] ?? 0, + })); + + const linkedActuators = json.actuators.filter((a) => + sensor.actuatorIds.includes(a.id) + ); + + const actuatorsData = linkedActuators.map((act) => ({ + id: act.id, + name: act.name, + data: json.data.map((sample) => ({ + time: sample.time, + value: sample.actuators[act.id] ?? 0, + })), + })); + + const actuatorInfos: AnalyzerActuatorInfo[] = linkedActuators.map((a) => ({ + id: a.id, + name: a.name, + unit: a.unit, + })); + + const allSensorValues = sensorData.map((d) => d.value); + const allSetpointValues = setpointData.map((d) => d.value); + const allActuatorValues = actuatorsData.flatMap((a) => a.data.map((d) => d.value)); + + const sensorRange = calcRange([...allSensorValues, ...allSetpointValues]); + const actuatorRange = calcRange(allActuatorValues); + + result.push({ + variable: { + index, + sensorId: sensor.id, + sensorName: sensor.name, + sensorUnit: sensor.unit, + setpointId: sensor.setpointId, + actuators: actuatorInfos, + selected: false, + }, + sensorData, + setpointData, + actuatorsData, + sensorRange, + actuatorRange, + }); + }); + + return result; +} + +export async function processJSONFile(file: File): Promise { + try { + const text = await file.text(); + let parsed: unknown; + + try { + parsed = JSON.parse(text); + } catch { + return { success: false, error: 'Arquivo não contém JSON válido' }; + } + + const validationError = validatePlantExportJSON(parsed); + if (validationError) { + return { success: false, error: validationError }; + } + + const json = parsed as PlantExportJSON; + const variables = convertJSONToProcessedVariables(json); + + return { + success: true, + variables, + plantName: json.meta.name, + }; + } catch (error) { + return { + success: false, + error: `Erro ao ler arquivo: ${error instanceof Error ? error.message : 'Erro desconhecido'}`, + }; + } +} diff --git a/apps/desktop/src/lib/services/export.ts b/apps/desktop/src/lib/services/export.ts new file mode 100644 index 0000000..b2f57bc --- /dev/null +++ b/apps/desktop/src/lib/services/export.ts @@ -0,0 +1,208 @@ +import { invoke } from '@tauri-apps/api/core'; +import { save } from '@tauri-apps/plugin-dialog'; +import type { Plant, PlantDataPoint, PlantVariable } from '$lib/types/plant'; +import type { + PlantExportJSON, + ExportSensor, + ExportActuator, + ExportSetpoint, + ExportDataSample, +} from '$lib/types/plantExport'; +import { EXPORT_FORMAT_VERSION } from '$lib/types/plantExport'; + + +function sanitizeName(name: string): string { + return name.replace(/\s+/g, '_'); +} + +function isTauriRuntime(): boolean { + if (typeof window === 'undefined') return false; + return '__TAURI_INTERNALS__' in window || '__TAURI__' in window; +} + +function normalizeDialogPath(path: string | string[] | null): string | null { + if (typeof path === 'string') return path; + if (Array.isArray(path) && path.length > 0) return path.join('/'); + return null; +} + +function triggerDownload(content: string, filename: string, mimeType: string): void { + const blob = new Blob([content], { type: `${mimeType};charset=utf-8` }); + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = filename; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + URL.revokeObjectURL(url); +} + +async function saveContent( + content: string, + filename: string, + mimeType: string, + title: string, + filterName: string, + extension: string +): Promise { + if (!isTauriRuntime()) { + triggerDownload(content, filename, mimeType); + return true; + } + + try { + const selected = await save({ + title, + defaultPath: filename, + filters: [{ name: filterName, extensions: [extension] }], + }); + const path = normalizeDialogPath(selected); + if (!path) return false; + + await invoke('save_export_file', { + request: { + path, + content, + }, + }); + return true; + } catch (error) { + console.error('Falha ao salvar arquivo de exportação:', error); + return false; + } +} + +function classifyVariables(variables: PlantVariable[]) { + const sensors = variables.filter((v) => v.type === 'sensor'); + const actuators = variables.filter((v) => v.type === 'atuador'); + return { sensors, actuators }; +} + + +export async function exportPlantDataCSV(plant: Plant, data: PlantDataPoint[]): Promise { + if (data.length === 0) return false; + + const { sensors, actuators } = classifyVariables(plant.variables); + const varIndex = (v: PlantVariable) => parseInt(v.id.replace('var_', ''), 10); + + const columns: { header: string; getValue: (pt: PlantDataPoint) => number }[] = []; + + columns.push({ header: 'seconds', getValue: (pt) => pt.time }); + + sensors.forEach((sensor, sensorIndex) => { + const idx = varIndex(sensor); + const labelIndex = sensorIndex + 1; + columns.push({ header: `sensor_${labelIndex}`, getValue: (pt) => pt[`var_${idx}_pv`] ?? 0 }); + columns.push({ header: `sp_${labelIndex}`, getValue: (pt) => pt[`var_${idx}_sp`] ?? 0 }); + }); + + actuators.forEach((actuator, actuatorIndex) => { + const idx = varIndex(actuator); + const labelIndex = actuatorIndex + 1; + columns.push({ header: `atuador_${labelIndex}`, getValue: (pt) => pt[`var_${idx}_pv`] ?? 0 }); + }); + + const headerLine = columns.map((c) => c.header).join(','); + const rows = data.map((pt) => + columns.map((c) => { + const v = c.getValue(pt); + return Number.isFinite(v) ? v.toFixed(4) : '0'; + }).join(',') + ); + + const csv = [headerLine, ...rows].join('\n'); + return saveContent( + csv, + `${sanitizeName(plant.name)}_data.csv`, + 'text/csv', + 'Salvar CSV', + 'CSV', + 'csv' + ); +} + + +export function buildPlantExportJSON(plant: Plant, data: PlantDataPoint[]): PlantExportJSON { + const { sensors, actuators } = classifyVariables(plant.variables); + const varIndex = (v: PlantVariable) => parseInt(v.id.replace('var_', ''), 10); + + const exportSensors: ExportSensor[] = sensors.map((s) => { + const linked = actuators.filter((a) => a.linkedSensorIds?.includes(s.id)); + return { + id: s.id, + name: s.name, + unit: s.unit, + actuatorIds: linked.map((a) => a.id), + setpointId: `sp_${s.id}`, + }; + }); + + const exportActuators: ExportActuator[] = actuators.map((a) => ({ + id: a.id, + name: a.name, + unit: a.unit, + linkedSensorIds: a.linkedSensorIds ?? [], + })); + + const exportSetpoints: ExportSetpoint[] = sensors.map((s) => ({ + id: `sp_${s.id}`, + sensorId: s.id, + })); + + const exportData: ExportDataSample[] = data.map((pt) => { + const sensorValues: Record = {}; + const setpointValues: Record = {}; + const actuatorValues: Record = {}; + + for (const s of sensors) { + const idx = varIndex(s); + sensorValues[s.id] = pt[`var_${idx}_pv`] ?? 0; + setpointValues[`sp_${s.id}`] = pt[`var_${idx}_sp`] ?? 0; + } + + for (const a of actuators) { + const idx = varIndex(a); + actuatorValues[a.id] = pt[`var_${idx}_pv`] ?? 0; + } + + return { + time: pt.time, + sensors: sensorValues, + setpoints: setpointValues, + actuators: actuatorValues, + }; + }); + + const duration = data.length > 1 ? data[data.length - 1].time - data[0].time : 0; + + return { + meta: { + name: plant.name, + exportedAt: new Date().toISOString(), + version: EXPORT_FORMAT_VERSION, + sampleCount: data.length, + duration, + sampleTimeMs: plant.sampleTimeMs, + }, + sensors: exportSensors, + actuators: exportActuators, + setpoints: exportSetpoints, + data: exportData, + }; +} + +export async function exportPlantDataJSON(plant: Plant, data: PlantDataPoint[]): Promise { + if (data.length === 0) return false; + + const json = buildPlantExportJSON(plant, data); + const content = JSON.stringify(json, null, 2); + return saveContent( + content, + `${sanitizeName(plant.name)}_data.json`, + 'application/json', + 'Salvar JSON', + 'JSON', + 'json' + ); +} diff --git a/apps/desktop/src/lib/services/fileDialog.ts b/apps/desktop/src/lib/services/fileDialog.ts new file mode 100644 index 0000000..2af5848 --- /dev/null +++ b/apps/desktop/src/lib/services/fileDialog.ts @@ -0,0 +1,104 @@ +export interface FileFilter { + name: string; + extensions: readonly string[] | string[]; +} + +export interface OpenFileOptions { + title?: string; + filters?: readonly FileFilter[]; + multiple?: boolean; +} + +export interface FileResult { + file: File; + name: string; + path: string; + extension: string; +} + +export function openFileDialog(options: OpenFileOptions = {}): Promise { + return new Promise((resolve) => { + const input = document.createElement('input'); + input.type = 'file'; + input.style.display = 'none'; + let settled = false; + + if (options.filters && options.filters.length > 0) { + const accept = options.filters + .flatMap(f => f.extensions.map(ext => `.${ext}`)) + .join(','); + input.accept = accept; + } + + input.multiple = options.multiple ?? false; + + const cleanup = () => { + if (input.parentNode) { + input.parentNode.removeChild(input); + } + window.removeEventListener('focus', handleFocus); + }; + + const finish = (result: FileResult | null) => { + if (settled) return; + settled = true; + resolve(result); + cleanup(); + }; + + input.onchange = () => { + const file = input.files?.[0]; + if (file) { + const extension = file.name.split('.').pop()?.toLowerCase() ?? ''; + finish({ + file, + name: file.name, + path: file.name, + extension, + }); + } else { + finish(null); + } + }; + + input.oncancel = () => { + finish(null); + }; + + function handleFocus() { + setTimeout(() => { + if (!input.files?.length) { + finish(null); + } + }, 300); + } + + document.body.appendChild(input); + window.addEventListener('focus', handleFocus); + input.click(); + }); +} + +export function readFileAsText(file: File): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = () => resolve(reader.result as string); + reader.onerror = () => reject(new Error('Erro ao ler arquivo')); + reader.readAsText(file); + }); +} + +export async function readFileAsJSON(file: File): Promise { + const text = await readFileAsText(file); + return JSON.parse(text) as T; +} + +/** + * Filtros pré-definidos para tipos comuns de arquivos. + */ +export const FILE_FILTERS = { + plant: [{ name: 'Planta', extensions: ['plant', 'json'] }], + csv: [{ name: 'CSV', extensions: ['csv'] }], + json: [{ name: 'JSON', extensions: ['json'] }], + all: [{ name: 'Todos', extensions: ['*'] }], +} as const; diff --git a/apps/desktop/src/lib/services/plant/index.ts b/apps/desktop/src/lib/services/plant/index.ts new file mode 100644 index 0000000..ba0a6fa --- /dev/null +++ b/apps/desktop/src/lib/services/plant/index.ts @@ -0,0 +1,38 @@ +export { + createPlant, + updatePlant, + listPlants, + getPlant, + closePlant, + removePlant, + connectPlant, + disconnectPlant, + pausePlant, + resumePlant, + openPlant, + applyPlantTelemetryPacket, + buildTelemetryPacketFromRuntimeEvent, + saveController, + removeController, + saveSetpoint, + subscribePlantRuntimeEvents, +} from './plantService'; + +export type { + CreatePlantRequest, + CreatePlantResponse, + UpdatePlantRequest, + OpenPlantRequest, + OpenPlantResponse, + PlantActionResponse, + PlantTelemetryPacket, + PlantDto, + CreatePlantDto, + SaveControllerInstanceConfigRequest, + SaveControllerInstanceConfigResponse, + RemoveControllerInstanceRequest, + SavePlantSetpointRequest, + PlantRuntimeErrorEvent, + PlantRuntimeStatusEvent, + PlantRuntimeTelemetryEvent, +} from './types'; diff --git a/apps/desktop/src/lib/services/plant/plantService.ts b/apps/desktop/src/lib/services/plant/plantService.ts new file mode 100644 index 0000000..83d1f8c --- /dev/null +++ b/apps/desktop/src/lib/services/plant/plantService.ts @@ -0,0 +1,655 @@ +import { invoke } from '@tauri-apps/api/core'; +import { listen, type UnlistenFn } from '@tauri-apps/api/event'; +import { ingestPlantTelemetry } from '$lib/stores/plantData'; +import { + type Plant, + type PlantDataPoint, + type PlantSeriesCatalog, + type PlantStats, + type PlantVariable, + type VariableStats, +} from '$lib/types/plant'; +import type { Controller, ControllerParam } from '$lib/types/controller'; +import type { PluginInstance } from '$lib/types/plugin'; +import { extractServiceErrorMessage } from '$lib/services/shared/errorMessage'; +import type { + ControllerParamDto, + CreatePlantDto, + CreatePlantRequest, + CreatePlantResponse, + ImportPlantFileCommandResponse, + OpenPlantRequest, + OpenPlantResponse, + PlantActionResponse, + PlantControllerDto, + PlantDriverDto, + PlantRuntimeErrorEvent, + PlantRuntimeStatusEvent, + PlantRuntimeTelemetryEvent, + PlantTelemetryPacket, + PlantDto, + RemoveControllerInstanceRequest, + SaveControllerInstanceConfigRequest, + SaveControllerInstanceConfigResponse, + SavePlantSetpointRequest, + UpdatePlantDto, + UpdatePlantRequest, +} from './types'; + +const DEFAULT_SAMPLE_TIME_MS = 100; +const telemetrySeriesKeyCache = new Map< + string, + { + signature: string; + descriptors: Array<{ + id: string; + type: PlantVariable['type']; + pvKey: string; + spKey: string | null; + fallbackSetpoint: number; + }>; + } +>(); + +function isRecord(value: unknown): value is Record { + return value !== null && typeof value === 'object' && !Array.isArray(value); +} + +function toFiniteNumber(value: unknown, fallback = 0): number { + const resolved = Number(value); + return Number.isFinite(resolved) ? resolved : fallback; +} + +function normalizeSampleTimeMs(sampleTimeMs: number | null | undefined, fallback = DEFAULT_SAMPLE_TIME_MS): number { + const resolved = Number(sampleTimeMs); + if (!Number.isFinite(resolved)) return fallback; + return Math.max(1, Math.round(resolved)); +} + +function getTelemetrySeriesKeyDescriptors(plant: Plant) { + const signature = plant.variables + .map((variable) => `${variable.id}:${variable.type}:${variable.setpoint}`) + .join('|'); + const cached = telemetrySeriesKeyCache.get(plant.id); + if (cached && cached.signature === signature) { + return cached.descriptors; + } + + const descriptors = plant.variables.map((variable, index) => ({ + id: variable.id, + type: variable.type, + pvKey: `var_${index}_pv`, + spKey: variable.type === 'sensor' ? `var_${index}_sp` : null, + fallbackSetpoint: variable.setpoint, + })); + telemetrySeriesKeyCache.set(plant.id, { signature, descriptors }); + return descriptors; +} + +function mapVariableDtoToFrontend(variable: PlantDto['variables'][number], index: number): PlantVariable { + return { + id: `var_${index}`, + name: variable.name, + type: variable.type, + unit: variable.unit, + setpoint: variable.setpoint, + pvMin: variable.pv_min, + pvMax: variable.pv_max, + linkedSensorIds: variable.linked_sensor_ids ?? [], + }; +} + +function mapDriverDtoToFrontend(driver: PlantDriverDto): PluginInstance { + return { + pluginId: driver.plugin_id, + pluginName: driver.plugin_name, + pluginKind: 'driver', + config: driver.config ?? {}, + }; +} + +function mapControllerParamDtoToFrontend(param: ControllerParamDto): ControllerParam { + return { + type: param.type, + value: param.value as ControllerParam['value'], + label: param.label, + }; +} + +function mapControllerDtoToFrontend(controller: PlantControllerDto): Controller { + return { + id: controller.id, + pluginId: controller.plugin_id, + pluginName: controller.plugin_name, + name: controller.name, + type: controller.controller_type, + active: controller.active, + inputVariableIds: controller.input_variable_ids ?? [], + outputVariableIds: controller.output_variable_ids ?? [], + params: Object.fromEntries( + Object.entries(controller.params ?? {}).map(([key, param]) => [key, mapControllerParamDtoToFrontend(param)]) + ), + runtimeStatus: controller.runtime_status ?? 'synced', + }; +} + +function mapDtoToPlant(dto: PlantDto): Plant { + const sampleTimeMs = normalizeSampleTimeMs( + dto.sample_time_ms, + dto.stats.dt > 0 ? dto.stats.dt * 1000 : undefined + ); + + return { + id: dto.id, + name: dto.name, + sampleTimeMs, + connected: dto.connected, + paused: dto.paused, + variables: dto.variables.map(mapVariableDtoToFrontend), + stats: { + dt: dto.stats.dt > 0 ? dto.stats.dt : sampleTimeMs / 1000, + uptime: dto.stats.uptime, + }, + controllers: (dto.controllers ?? []).map(mapControllerDtoToFrontend), + driverId: dto.driver.plugin_id, + driver: mapDriverDtoToFrontend(dto.driver), + source: 'backend', + }; +} + +function mapVariableToDto(variable: PlantVariable): CreatePlantDto['variables'][number] { + return { + name: variable.name, + type: variable.type, + unit: variable.unit, + setpoint: variable.setpoint, + pv_min: variable.pvMin, + pv_max: variable.pvMax, + linked_sensor_ids: variable.linkedSensorIds, + }; +} + +function mapControllerParamToDto(param: ControllerParam): ControllerParamDto { + return { + type: param.type, + value: param.value, + label: param.label, + }; +} + +function mapControllerToDto(controller: Controller): CreatePlantDto['controllers'][number] { + return { + id: controller.id, + plugin_id: controller.pluginId ?? controller.id, + name: controller.name, + controller_type: controller.type, + active: controller.active, + input_variable_ids: controller.inputVariableIds ?? [], + output_variable_ids: controller.outputVariableIds ?? [], + params: Object.fromEntries( + Object.entries(controller.params ?? {}).map(([key, param]) => [key, mapControllerParamToDto(param)]) + ), + }; +} + +function buildCreatePlantDto(request: CreatePlantRequest): CreatePlantDto { + const sampleTimeMs = normalizeSampleTimeMs(request.sampleTimeMs); + + return { + name: request.name.trim(), + sample_time_ms: sampleTimeMs, + variables: request.variables.map(mapVariableToDto), + driver: { + plugin_id: request.driver!.pluginId, + config: request.driver!.config ?? {}, + }, + controllers: request.controllers.map(mapControllerToDto), + }; +} + +function computePlantStats(data: PlantDataPoint[]): PlantStats { + if (data.length <= 1) { + return { + dt: 0, + uptime: data[0]?.time ?? 0, + }; + } + + const deltas: number[] = []; + for (let index = 1; index < data.length; index += 1) { + deltas.push(Math.max(0, data[index].time - data[index - 1].time)); + } + + const avgDelta = deltas.reduce((sum, delta) => sum + delta, 0) / deltas.length; + return { + dt: Number(avgDelta.toFixed(4)), + uptime: Math.max(0, data[data.length - 1].time - data[0].time), + }; +} + +function computeVariableStats(data: PlantDataPoint[], variableIndex: number, variable: PlantVariable): VariableStats { + const pvKey = `var_${variableIndex}_pv`; + const spKey = `var_${variableIndex}_sp`; + const values = data.map((point) => point[pvKey] ?? 0); + + if (values.length === 0) { + return { errorAvg: 0, stability: 100, ripple: 0 }; + } + + const min = Math.min(...values); + const max = Math.max(...values); + const ripple = Number((max - min).toFixed(3)); + + if (variable.type === 'atuador') { + return { errorAvg: 0, stability: Math.max(0, 100 - ripple), ripple }; + } + + const errorAvg = Number( + ( + data.reduce((sum, point) => sum + Math.abs((point[pvKey] ?? 0) - (point[spKey] ?? 0)), 0) / + values.length + ).toFixed(3) + ); + + return { + errorAvg, + stability: Math.max(0, Number((100 - ripple).toFixed(2))), + ripple, + }; +} + +function normalizeImportedVariableStats(payload: unknown): VariableStats { + const source = isRecord(payload) ? payload : {}; + const errorAvg = toFiniteNumber(source.errorAvg ?? source.error_avg, 0); + const stability = toFiniteNumber(source.stability, 100); + const ripple = toFiniteNumber(source.ripple, 0); + + return { + errorAvg, + stability, + ripple, + }; +} + +function normalizeImportedSeriesCatalog( + payload: unknown, + fallbackPlantId: string +): PlantSeriesCatalog { + const source = isRecord(payload) ? payload : {}; + const rawSeries = Array.isArray(source.series) ? source.series : []; + const series = rawSeries + .map((entry) => { + const item = isRecord(entry) ? entry : {}; + const key = typeof item.key === 'string' ? item.key.trim() : ''; + const label = typeof item.label === 'string' ? item.label.trim() : ''; + const role = item.role; + + if (!key || (role !== 'pv' && role !== 'sp' && role !== 'mv')) { + return null; + } + + return { + key, + label: label || key, + role, + }; + }) + .filter((entry): entry is PlantSeriesCatalog['series'][number] => entry !== null); + + const plantId = typeof source.plantId === 'string' && source.plantId.trim() + ? source.plantId + : typeof source.plant_id === 'string' && source.plant_id.trim() + ? source.plant_id + : fallbackPlantId; + + return { + plantId, + series, + }; +} + +export async function subscribePlantRuntimeEvents(handlers: { + onTelemetry?: (event: PlantRuntimeTelemetryEvent) => void; + onStatus?: (event: PlantRuntimeStatusEvent) => void; + onError?: (event: PlantRuntimeErrorEvent) => void; +}): Promise<() => void> { + const unlisteners: UnlistenFn[] = []; + + if (handlers.onTelemetry) { + unlisteners.push( + await listen('plant://telemetry', (event) => { + handlers.onTelemetry?.(event.payload); + }) + ); + } + + if (handlers.onStatus) { + unlisteners.push( + await listen('plant://status', (event) => { + handlers.onStatus?.(event.payload); + }) + ); + } + + if (handlers.onError) { + unlisteners.push( + await listen('plant://error', (event) => { + handlers.onError?.(event.payload); + }) + ); + } + + return () => { + for (const unlisten of unlisteners) { + unlisten(); + } + }; +} + +export function buildTelemetryPacketFromRuntimeEvent( + plant: Plant, + event: PlantRuntimeTelemetryEvent +): PlantTelemetryPacket { + const descriptors = getTelemetrySeriesKeyDescriptors(plant); + const point: PlantDataPoint = { + time: Math.max(0, toFiniteNumber(event.uptime_s, 0)), + }; + + for (const descriptor of descriptors) { + const sensorValue = toFiniteNumber(event.sensors?.[descriptor.id], 0); + const actuatorValue = toFiniteNumber(event.actuators_read?.[descriptor.id], 0); + + if (descriptor.type === 'sensor') { + point[descriptor.pvKey] = sensorValue; + point[descriptor.spKey!] = toFiniteNumber( + event.setpoints?.[descriptor.id], + descriptor.fallbackSetpoint + ); + continue; + } + + point[descriptor.pvKey] = actuatorValue; + } + + return { + plantId: plant.id, + points: [point], + stats: { + dt: Math.max(0, toFiniteNumber(event.effective_dt_ms, plant.sampleTimeMs) / 1000), + uptime: point.time, + }, + }; +} + +async function listBackendPlants(): Promise { + const response = await invoke('list_plants'); + return response.map(mapDtoToPlant); +} + +async function getBackendPlant(id: string): Promise { + try { + const response = await invoke('get_plant', { id }); + return mapDtoToPlant(response); + } catch { + return null; + } +} + +export async function createPlant(request: CreatePlantRequest): Promise { + if (!request.name.trim()) { + return { success: false, error: 'Nome da planta é obrigatório' }; + } + + if (!request.driver?.pluginId) { + return { success: false, error: 'Configure um driver de comunicação para a planta' }; + } + + if (request.variables.length === 0) { + return { success: false, error: 'Pelo menos uma variável deve ser definida' }; + } + + try { + const response = await invoke('create_plant', { request: buildCreatePlantDto(request) }); + const plant = mapDtoToPlant(response); + + return { success: true, plant }; + } catch (error) { + const message = extractServiceErrorMessage(error, 'Erro ao criar planta no backend'); + return { success: false, error: message }; + } +} + +export async function updatePlant(request: UpdatePlantRequest): Promise { + const current = await getPlant(request.id); + if (!current) { + return { success: false, error: 'Planta não encontrada' }; + } + + const sampleTimeMs = normalizeSampleTimeMs(request.sampleTimeMs, current.sampleTimeMs); + try { + const response = await invoke('update_plant', { + request: { + id: request.id, + name: request.name.trim(), + sample_time_ms: sampleTimeMs, + variables: request.variables.map(mapVariableToDto), + driver: { + plugin_id: request.driver?.pluginId ?? current.driver?.pluginId ?? current.driverId ?? '', + config: request.driver?.config ?? current.driver?.config ?? {}, + }, + controllers: request.controllers.map(mapControllerToDto), + } satisfies UpdatePlantDto, + }); + + return { + success: true, + plant: mapDtoToPlant(response), + }; + } catch (error) { + const message = extractServiceErrorMessage(error, 'Erro ao atualizar planta no backend'); + return { success: false, error: message }; + } +} + +export async function saveController( + request: SaveControllerInstanceConfigRequest +): Promise { + if (!request.controller.id) { + return { success: false, error: 'Controlador não encontrado' }; + } + + if (request.source === 'backend') { + try { + const response = await invoke('save_controller', { + request: { + plant_id: request.plantId, + controller_id: request.controller.id, + plugin_id: request.controller.pluginId ?? null, + name: request.controller.name, + controller_type: request.controller.type, + active: request.controller.active, + input_variable_ids: request.controller.inputVariableIds ?? [], + output_variable_ids: request.controller.outputVariableIds ?? [], + params: Object.entries(request.controller.params ?? {}).map(([key, param]) => ({ + key, + type: param.type, + value: param.value, + label: param.label, + })), + }, + }); + + return { success: true, plant: mapDtoToPlant(response) }; + } catch (error) { + const message = extractServiceErrorMessage(error, 'Erro ao salvar configuração do controlador'); + return { success: false, error: message }; + } + } + + return { success: true }; +} + +export async function removeController( + request: RemoveControllerInstanceRequest +): Promise { + try { + const response = await invoke('remove_controller', { + request: { + plant_id: request.plantId, + controller_id: request.controllerId, + }, + }); + + return { success: true, plant: mapDtoToPlant(response) }; + } catch (error) { + const message = extractServiceErrorMessage(error, 'Erro ao remover controlador da planta'); + return { success: false, error: message }; + } +} + +export async function saveSetpoint( + request: SavePlantSetpointRequest +): Promise { + try { + const response = await invoke('save_setpoint', { + request: { + plant_id: request.plantId, + variable_id: request.variableId, + setpoint: request.setpoint, + }, + }); + + return { success: true, plant: mapDtoToPlant(response) }; + } catch (error) { + const message = extractServiceErrorMessage(error, 'Erro ao salvar setpoint da planta'); + return { success: false, error: message }; + } +} + +export async function listPlants(): Promise { + try { + return await listBackendPlants(); + } catch (error) { + console.error('Falha ao listar plantas do backend:', error); + return []; + } +} + +export async function getPlant(id: string): Promise { + return getBackendPlant(id); +} + +export async function removePlant(id: string): Promise { + try { + const response = await invoke('remove_plant', { id }); + return { success: true, plant: mapDtoToPlant(response) }; + } catch (error) { + const message = extractServiceErrorMessage(error, 'Erro ao remover planta no backend'); + return { success: false, error: message }; + } +} + +export async function closePlant(id: string): Promise { + try { + const response = await invoke('close_plant', { id }); + return { success: true, plant: mapDtoToPlant(response) }; + } catch (error) { + const message = extractServiceErrorMessage(error, 'Erro ao fechar planta no backend'); + return { success: false, error: message }; + } +} + +async function invokePlantAction(command: string, id: string, merge: (current: Plant, backend: Plant) => Plant): Promise { + const current = await getPlant(id); + if (!current) { + return { success: false, error: 'Planta não encontrada' }; + } + + try { + const response = await invoke(command, { id }); + const merged = merge(current, mapDtoToPlant(response)); + return { success: true, plant: merged }; + } catch (error) { + const message = extractServiceErrorMessage(error, 'Erro ao sincronizar ação da planta'); + return { success: false, error: message }; + } +} + +function mergeBackendRuntimeState(currentPlant: Plant, backendPlant: Plant): Plant { + const backendControllersById = new Map( + (backendPlant.controllers ?? []).map((controller) => [controller.id, controller]) + ); + + return { + ...backendPlant, + driver: currentPlant.driver ?? backendPlant.driver, + controllers: (currentPlant.controllers ?? backendPlant.controllers).map((controller) => ({ + ...controller, + runtimeStatus: backendControllersById.get(controller.id)?.runtimeStatus ?? controller.runtimeStatus ?? 'synced', + })), + source: 'backend', + }; +} + +export async function connectPlant(id: string): Promise { + const current = await getPlant(id); + if (current && !current.connected && !current.driver?.pluginId) { + const hasMissingLinkedDriver = !!current.driverId; + return { + success: false, + error: hasMissingLinkedDriver + ? 'O driver desta planta não está carregado. Vincule um novo driver antes de ligar.' + : 'Configure um driver de comunicação para a planta antes de ligar.', + }; + } + + return invokePlantAction('connect_plant', id, mergeBackendRuntimeState); +} + +export async function disconnectPlant(id: string): Promise { + return invokePlantAction('disconnect_plant', id, mergeBackendRuntimeState); +} + +export async function pausePlant(id: string): Promise { + return invokePlantAction('pause_plant', id, mergeBackendRuntimeState); +} + +export async function resumePlant(id: string): Promise { + return invokePlantAction('resume_plant', id, mergeBackendRuntimeState); +} + +export async function openPlant(request: OpenPlantRequest): Promise { + if (!request.file) { + return { + success: false, + error: 'Selecione um arquivo de exportação válido para abrir a planta na UI', + }; + } + + try { + const text = await request.file.text(); + const response = await invoke('import_plant_file', { + request: { + fileName: request.file.name, + content: text, + }, + }); + const plant = mapDtoToPlant(response.plant); + + return { + success: true, + plant, + data: response.data, + stats: response.stats, + variableStats: (response.variable_stats ?? []).map(normalizeImportedVariableStats), + seriesCatalog: normalizeImportedSeriesCatalog(response.series_catalog, plant.id), + }; + } catch (error) { + const errorMessage = extractServiceErrorMessage(error, 'Erro ao abrir arquivo'); + return { success: false, error: errorMessage }; + } +} + +export function applyPlantTelemetryPacket(packet: PlantTelemetryPacket): PlantDataPoint[] { + return ingestPlantTelemetry(packet); +} diff --git a/apps/desktop/src/lib/services/plant/types.ts b/apps/desktop/src/lib/services/plant/types.ts new file mode 100644 index 0000000..dc7a03c --- /dev/null +++ b/apps/desktop/src/lib/services/plant/types.ts @@ -0,0 +1,302 @@ +import type { + PlantDataPoint, + PlantSeriesCatalog, + PlantSeriesDescriptor, + PlantStats, + PlantVariable, + VariableStats, +} from '$lib/types/plant'; +import type { Controller, ControllerParam, ParamType } from '$lib/types/controller'; +import type { PluginInstance, PluginRuntime, SchemaFieldValue } from '$lib/types/plugin'; + +export interface CreatePlantVariableDto { + name: string; + type: 'sensor' | 'atuador'; + unit: string; + setpoint: number; + pv_min: number; + pv_max: number; + linked_sensor_ids?: string[]; +} + +export interface ControllerParamDto { + type: ParamType; + value: SchemaFieldValue; + label: string; +} + +export interface CreatePlantDriverDto { + plugin_id: string; + config: Record; +} + +export interface CreatePlantControllerDto { + id?: string | null; + plugin_id: string; + name: string; + controller_type: string; + active: boolean; + input_variable_ids: string[]; + output_variable_ids: string[]; + params: Record; +} + +export interface CreatePlantDto { + name: string; + sample_time_ms: number; + variables: CreatePlantVariableDto[]; + driver: CreatePlantDriverDto; + controllers: CreatePlantControllerDto[]; +} + +export interface UpdatePlantDto extends CreatePlantDto { + id: string; +} + +export interface PlantStatsDto { + dt: number; + uptime: number; +} + +export interface PlantDriverDto { + plugin_id: string; + plugin_name: string; + runtime: PluginRuntime; + source_file?: string | null; + source_code?: string | null; + config: Record; +} + +export interface PlantControllerDto { + id: string; + plugin_id: string; + plugin_name?: string; + name: string; + controller_type: string; + active: boolean; + input_variable_ids: string[]; + output_variable_ids: string[]; + params: Record; + runtime_status?: 'synced' | 'pending_restart'; +} + +export interface PlantDto { + id: string; + name: string; + sample_time_ms?: number; + connected: boolean; + paused: boolean; + variables: CreatePlantVariableDto[]; + stats: PlantStatsDto; + driver: PlantDriverDto; + controllers: PlantControllerDto[]; +} + +export interface CreatePlantRequest { + name: string; + sampleTimeMs: number; + driver: PluginInstance | null; + variables: PlantVariable[]; + controllers: Controller[]; +} + +export interface UpdatePlantRequest { + id: string; + name: string; + sampleTimeMs: number; + driver: PluginInstance | null; + variables: PlantVariable[]; + controllers: Controller[]; + source?: 'backend' | 'workspace'; +} + +export interface CreatePlantResponse { + success: boolean; + plant?: import('$lib/types/plant').Plant; + error?: string; +} + +export interface OpenPlantRequest { + filePath: string; + file?: File; +} + +export interface OpenPlantResponse { + success: boolean; + plant?: import('$lib/types/plant').Plant; + data?: PlantDataPoint[]; + stats?: PlantStats; + variableStats?: VariableStats[]; + seriesCatalog?: PlantSeriesCatalog; + warning?: string; + error?: string; +} + +export interface OpenPlantFileCommandRequest { + fileName: string; + content: string; +} + +export interface OpenPlantFileCommandResponse { + plant: { + id: string; + name: string; + sample_time_ms: number; + connected: boolean; + paused: boolean; + variables: CreatePlantVariableDto[]; + stats: PlantStatsDto; + driver?: { + plugin_id: string; + plugin_name: string; + config: Record; + } | null; + }; + data: PlantDataPoint[]; + stats: PlantStats; + variable_stats: Array<{ + error_avg?: number; + errorAvg?: number; + stability?: number; + ripple?: number; + }>; + series_catalog: { + plant_id?: string; + plantId?: string; + series: PlantSeriesCatalog['series']; + }; +} + +export interface ImportPlantFileCommandResponse { + plant: PlantDto; + data: PlantDataPoint[]; + stats: PlantStats; + variable_stats: Array<{ + error_avg?: number; + errorAvg?: number; + stability?: number; + ripple?: number; + }>; + series_catalog: { + plant_id?: string; + plantId?: string; + series: PlantSeriesCatalog['series']; + }; +} + +export interface PlantTelemetryPacket { + plantId: string; + points: PlantDataPoint[]; + stats?: PlantStats; + variableStats?: VariableStats[]; + series?: PlantSeriesDescriptor[]; +} + +export type PlantRuntimeLifecycleState = + | 'created' + | 'bootstrapping' + | 'ready' + | 'connecting' + | 'running' + | 'stopping' + | 'stopped' + | 'faulted'; + +export type PlantRuntimeCyclePhase = + | 'cycle_started' + | 'read_inputs' + | 'compute_controllers' + | 'write_outputs' + | 'publish_telemetry' + | 'sleep_until_deadline'; + +export interface PlantRuntimeTelemetryEvent { + plant_id: string; + runtime_id: string; + lifecycle_state: PlantRuntimeLifecycleState; + cycle_phase: PlantRuntimeCyclePhase; + timestamp: number; + cycle_id: number; + configured_sample_time_ms: number; + effective_dt_ms: number; + cycle_duration_ms: number; + read_duration_ms: number; + control_duration_ms: number; + write_duration_ms: number; + publish_duration_ms: number; + cycle_late: boolean; + late_by_ms: number; + phase: string; + uptime_s: number; + sensors: Record; + actuators: Record; + actuators_read: Record; + setpoints: Record; + controller_outputs: Record; + written_outputs: Record; + controller_durations_ms: Record; +} + +export interface PlantRuntimeStatusEvent { + plant_id: string; + runtime_id: string; + lifecycle_state: PlantRuntimeLifecycleState; + cycle_phase: PlantRuntimeCyclePhase; + configured_sample_time_ms: number; + effective_dt_ms: number; + cycle_late: boolean; +} + +export interface PlantRuntimeErrorEvent { + plant_id: string; + runtime_id: string; + message: string; +} + +export interface GetPlantRequest { + id: string; +} + +export interface RemovePlantRequest { + id: string; +} + +export interface PlantActionRequest { + id: string; +} + +export interface PlantActionResponse { + success: boolean; + plant?: import('$lib/types/plant').Plant; + error?: string; +} + +export interface SaveControllerInstanceConfigRequest { + plantId: string; + controller: Controller; + source?: 'backend' | 'workspace'; +} + +export interface SaveControllerInstanceConfigResponse { + success: boolean; + plant?: import('$lib/types/plant').Plant; + deferred?: boolean; + error?: string; +} + +export interface RemoveControllerInstanceRequest { + plantId: string; + controllerId: string; +} + +export interface SavePlantSetpointRequest { + plantId: string; + variableId: string; + setpoint: number; +} + +export interface ListPlantsResponse { + plants: import('$lib/types/plant').Plant[]; +} + +export type { ControllerParam }; diff --git a/apps/desktop/src/lib/services/plugin/index.ts b/apps/desktop/src/lib/services/plugin/index.ts new file mode 100644 index 0000000..5b39ac1 --- /dev/null +++ b/apps/desktop/src/lib/services/plugin/index.ts @@ -0,0 +1,2 @@ +export * from './pluginService'; +export * from './types'; diff --git a/apps/desktop/src/lib/services/plugin/pluginService.ts b/apps/desktop/src/lib/services/plugin/pluginService.ts new file mode 100644 index 0000000..2316923 --- /dev/null +++ b/apps/desktop/src/lib/services/plugin/pluginService.ts @@ -0,0 +1,468 @@ +import { invoke } from '@tauri-apps/api/core'; +import type { Controller, ControllerParam, ControllerType } from '$lib/types/controller'; +import type { BuiltInPluginKind, PluginDefinition, PluginKind, SchemaFieldValue } from '$lib/types/plugin'; +import { + getDefaultValueForType, + isBuiltInPluginKind, + normalizePluginKind, + toPluginEntryClassName, + validatePluginJSON, +} from '$lib/types/plugin'; +import type { + CreatePluginRequest, + CreatePluginResponse, + PluginRegistryDto, + UpdatePluginDto, +} from './types'; +import { generateId } from '$lib/utils/format'; +import { loadWorkspaceState as loadStoredWorkspaceState, saveWorkspaceState as saveStoredWorkspaceState } from '$lib/utils/workspaceStorage'; +import { extractServiceErrorMessage } from '$lib/services/shared/errorMessage'; + +const STORAGE_KEY = 'senamby.desktop.plugins.workspace'; + +type PluginWorkspaceState = { + localPlugins: PluginDefinition[]; + deletedPluginIds: string[]; +}; + +const DEFAULT_WORKSPACE_STATE: PluginWorkspaceState = { + localPlugins: [], + deletedPluginIds: [], +}; + +function loadWorkspaceState(): PluginWorkspaceState { + return loadStoredWorkspaceState(STORAGE_KEY, DEFAULT_WORKSPACE_STATE, (parsed) => { + const state = parsed as PluginWorkspaceState; + + return { + localPlugins: Array.isArray(state.localPlugins) ? state.localPlugins : [], + // Legacy field kept for compatibility with persisted snapshots. + deletedPluginIds: [], + }; + }); +} + +function saveWorkspaceState(state: PluginWorkspaceState): void { + saveStoredWorkspaceState(STORAGE_KEY, state); +} + +function normalizePlugin(plugin: PluginDefinition): PluginDefinition { + return { + ...plugin, + id: plugin.id || generateId(), + kind: normalizePluginKind(plugin.kind), + entryClass: plugin.entryClass || toPluginEntryClassName(plugin.name, plugin.kind), + sourceFile: plugin.sourceFile || (plugin.runtime === 'python' ? 'main.py' : 'plugin.rs'), + schema: plugin.schema ?? [], + dependencies: plugin.dependencies ?? [], + source: plugin.source ?? 'workspace', + }; +} + +function upsertWorkspacePlugin(plugin: PluginDefinition): PluginDefinition { + const normalized = normalizePlugin({ ...plugin, source: plugin.source ?? 'workspace' }); + const state = loadWorkspaceState(); + const index = state.localPlugins.findIndex((entry) => entry.id === normalized.id); + + if (index >= 0) { + state.localPlugins[index] = normalized; + } else { + state.localPlugins.unshift(normalized); + } + + saveWorkspaceState(state); + return normalized; +} + +function removeWorkspacePlugin(pluginId: string): void { + const state = loadWorkspaceState(); + state.localPlugins = state.localPlugins.filter((plugin) => plugin.id !== pluginId); + saveWorkspaceState(state); +} + +function mapDtoToPlugin(dto: PluginRegistryDto): PluginDefinition { + return { + id: dto.id, + name: dto.name, + kind: dto.type, + runtime: dto.runtime, + entryClass: dto.entry_class?.trim() || toPluginEntryClassName(dto.name, dto.type), + sourceFile: dto.source_file ?? (dto.runtime === 'python' ? 'main.py' : 'plugin.rs'), + sourceCode: dto.source_code ?? undefined, + schema: (dto.schema ?? []).map((field) => ({ + name: field.name, + type: field.type as PluginDefinition['schema'][number]['type'], + defaultValue: field.default_value as PluginDefinition['schema'][number]['defaultValue'], + description: field.description ?? undefined, + })), + dependencies: (dto.dependencies ?? []).map((dependency) => ({ + name: dependency.name, + version: dependency.version, + })), + description: dto.description ?? undefined, + version: dto.version ?? undefined, + author: dto.author ?? undefined, + source: 'backend', + }; +} + +async function listBackendPlugins(): Promise { + try { + const response = await invoke('list_plugins'); + return response.map(mapDtoToPlugin); + } catch (error) { + console.warn('Backend de plugins indisponível, usando somente catálogo local:', error); + return []; + } +} + +export async function loadSystemPlugins(): Promise { + try { + const response = await invoke('load_plugins'); + return response.map(mapDtoToPlugin); + } catch (error) { + console.warn('Falha ao carregar plugins do sistema na inicialização:', error); + return []; + } +} + +async function listBackendPluginsByType(kind: BuiltInPluginKind): Promise { + try { + const response = await invoke('list_plugins_by_type', { pluginType: kind }); + return response.map(mapDtoToPlugin); + } catch (error) { + console.warn(`Backend de plugins indisponível para o tipo "${kind}", usando catálogo local:`, error); + return []; + } +} + +async function getBackendPlugin(id: string): Promise { + try { + const response = await invoke('get_plugin', { id }); + return mapDtoToPlugin(response); + } catch { + return null; + } +} + +function mergePlugins(backendPlugins: PluginDefinition[], workspacePlugins: PluginDefinition[]): PluginDefinition[] { + const registry = new Map(); + + for (const plugin of backendPlugins) { + registry.set(plugin.id, normalizePlugin(plugin)); + } + + for (const plugin of workspacePlugins) { + registry.set(plugin.id, normalizePlugin(plugin)); + } + + return Array.from(registry.values()).sort((left, right) => left.name.localeCompare(right.name, 'pt-BR')); +} + +function inferControllerType(plugin: PluginDefinition): ControllerType { + const normalizedName = plugin.name.trim().toUpperCase(); + + if (normalizedName.includes('PID')) return 'PID'; + if (normalizedName.includes('FLOW')) return 'Flow'; + if (normalizedName.includes('LEVEL')) return 'Level'; + + return (plugin.name.trim() || 'PID') as ControllerType; +} + +function mapSchemaFieldToControllerParam(field: PluginDefinition['schema'][number]): ControllerParam { + const defaultValue = field.defaultValue ?? getDefaultValueForType(field.type); + + if (field.type === 'bool') { + return { + type: 'boolean', + value: typeof defaultValue === 'boolean' ? defaultValue : false, + label: field.description?.trim() || field.name, + }; + } + + if (field.type === 'int' || field.type === 'float') { + return { + type: 'number', + value: typeof defaultValue === 'number' ? defaultValue : 0, + label: field.description?.trim() || field.name, + }; + } + + return { + type: 'string', + value: Array.isArray(defaultValue) ? defaultValue.join(', ') : String(defaultValue ?? ''), + label: field.description?.trim() || field.name, + }; +} + +export function toControllerTemplate(plugin: PluginDefinition): Controller { + return { + id: plugin.id, + pluginId: plugin.id, + pluginName: plugin.name, + name: plugin.name, + type: inferControllerType(plugin), + active: false, + inputVariableIds: [], + outputVariableIds: [], + runtimeStatus: 'synced', + params: Object.fromEntries( + plugin.schema.map((field) => [field.name, mapSchemaFieldToControllerParam(field)]) + ), + }; +} + +export function createConfiguredController( + plugin: PluginDefinition, + config: Record, + options: { + id?: string; + name?: string; + active?: boolean; + } = {} +): Controller { + return { + id: options.id ?? generateId(), + pluginId: plugin.id, + pluginName: plugin.name, + name: options.name ?? plugin.name, + type: inferControllerType(plugin), + active: options.active ?? false, + inputVariableIds: [], + outputVariableIds: [], + runtimeStatus: 'synced', + params: Object.fromEntries( + plugin.schema.map((field) => [ + field.name, + mapSchemaFieldToControllerParam({ + ...field, + defaultValue: config[field.name] ?? field.defaultValue, + }), + ]) + ), + }; +} + +export async function createPlugin(request: CreatePluginRequest): Promise { + if (!request.name.trim()) { + return { success: false, error: 'Nome do plugin é obrigatório' }; + } + + const kind = normalizePluginKind(request.kind); + + if (isBuiltInPluginKind(kind)) { + try { + const response = await invoke('create_plugin', { + request: { + name: request.name.trim(), + type: kind, + runtime: request.runtime, + entry_class: request.entryClass.trim(), + schema: request.schema.map((field) => ({ + name: field.name, + type: field.type, + default_value: field.defaultValue, + description: field.description ?? null, + })), + source_file: request.sourceFile ?? null, + source_code: request.sourceCode ?? null, + dependencies: (request.dependencies ?? []).map((dependency) => ({ + name: dependency.name, + version: dependency.version, + })), + description: request.description ?? null, + version: request.version ?? null, + author: request.author ?? null, + }, + }); + + return { success: true, plugin: mapDtoToPlugin(response) }; + } catch (error) { + const errorMessage = extractServiceErrorMessage(error, 'Erro ao criar plugin no backend'); + return { success: false, error: errorMessage }; + } + } + + const plugin = upsertWorkspacePlugin({ + id: generateId(), + name: request.name.trim(), + kind, + runtime: request.runtime, + entryClass: request.entryClass.trim(), + sourceFile: request.sourceFile ?? (request.runtime === 'python' ? 'main.py' : 'plugin.rs'), + sourceCode: request.sourceCode, + schema: request.schema, + dependencies: request.dependencies ?? [], + description: request.description, + version: request.version, + author: request.author, + source: 'workspace', + }); + + return { success: true, plugin }; +} + +export async function listPlugins(): Promise { + const state = loadWorkspaceState(); + const backendPlugins = await listBackendPlugins(); + return mergePlugins(backendPlugins, state.localPlugins); +} + +export async function getPlugin(id: string): Promise { + const state = loadWorkspaceState(); + const workspacePlugin = state.localPlugins.find((plugin) => plugin.id === id); + + if (workspacePlugin) { + return normalizePlugin(workspacePlugin); + } + + return getBackendPlugin(id); +} + +export async function listPluginsByType(kind: PluginKind): Promise { + const normalizedKind = normalizePluginKind(kind); + const state = loadWorkspaceState(); + const workspacePlugins = state.localPlugins.filter( + (plugin) => normalizePluginKind(plugin.kind) === normalizedKind + ); + + if (!isBuiltInPluginKind(normalizedKind)) { + return mergePlugins([], workspacePlugins).filter( + (plugin) => normalizePluginKind(plugin.kind) === normalizedKind + ); + } + + const backendPlugins = await listBackendPluginsByType(normalizedKind); + return mergePlugins(backendPlugins, workspacePlugins).filter( + (plugin) => normalizePluginKind(plugin.kind) === normalizedKind + ); +} + +export async function listControllerTemplates(): Promise { + const controllerPlugins = await listPluginsByType('controller'); + return controllerPlugins.map(toControllerTemplate); +} + +export async function validatePluginFile(json: unknown): Promise<{ success: boolean; plugin?: PluginDefinition; error?: string }> { + const validationError = validatePluginJSON(json); + + if (validationError) { + return { success: false, error: validationError }; + } + + const parsed = json as Record; + const plugin = normalizePlugin({ + id: typeof parsed.id === 'string' ? parsed.id : generateId(), + name: parsed.name as string, + kind: normalizePluginKind(parsed.kind as string), + runtime: parsed.runtime as PluginDefinition['runtime'], + entryClass: + typeof parsed.entryClass === 'string' && parsed.entryClass.trim() + ? parsed.entryClass + : toPluginEntryClassName(parsed.name as string, normalizePluginKind(parsed.kind as string)), + sourceFile: parsed.sourceFile as string, + sourceCode: typeof parsed.sourceCode === 'string' ? parsed.sourceCode : undefined, + schema: Array.isArray(parsed.schema) ? (parsed.schema as PluginDefinition['schema']) : [], + dependencies: Array.isArray(parsed.dependencies) ? (parsed.dependencies as PluginDefinition['dependencies']) ?? [] : [], + description: typeof parsed.description === 'string' ? parsed.description : undefined, + version: typeof parsed.version === 'string' ? parsed.version : undefined, + author: typeof parsed.author === 'string' ? parsed.author : undefined, + source: 'workspace', + }); + + return { success: true, plugin }; +} + +export async function importPluginFile(file: File): Promise<{ success: boolean; plugin?: PluginDefinition; error?: string }> { + try { + const content = await file.text(); + const response = await invoke('import_plugin_file', { + request: { + fileName: file.name, + content, + }, + }); + + return { success: true, plugin: mapDtoToPlugin(response) }; + } catch (error) { + const errorMessage = extractServiceErrorMessage(error, 'Erro ao importar plugin'); + return { success: false, error: errorMessage }; + } +} + +export async function registerPlugin(plugin: PluginDefinition): Promise<{ success: boolean; plugin?: PluginDefinition; error?: string }> { + return createPlugin({ + name: plugin.name, + kind: plugin.kind, + runtime: plugin.runtime, + entryClass: plugin.entryClass, + schema: plugin.schema, + sourceFile: plugin.sourceFile, + sourceCode: plugin.sourceCode, + dependencies: plugin.dependencies, + description: plugin.description, + version: plugin.version, + author: plugin.author, + }); +} + +export async function updatePlugin(plugin: PluginDefinition): Promise<{ success: boolean; plugin?: PluginDefinition; error?: string }> { + try { + if (plugin.source === 'backend' && isBuiltInPluginKind(normalizePluginKind(plugin.kind))) { + const response = await invoke('update_plugin', { + request: { + id: plugin.id, + name: plugin.name.trim(), + type: normalizePluginKind(plugin.kind), + runtime: plugin.runtime, + entry_class: plugin.entryClass.trim(), + schema: plugin.schema.map((field) => ({ + name: field.name, + type: field.type, + default_value: field.defaultValue, + description: field.description ?? null, + })), + source_file: plugin.sourceFile ?? null, + source_code: plugin.sourceCode ?? null, + dependencies: (plugin.dependencies ?? []).map((dependency) => ({ + name: dependency.name, + version: dependency.version, + })), + description: plugin.description ?? null, + version: plugin.version ?? null, + author: plugin.author ?? null, + } satisfies UpdatePluginDto, + }); + + return { success: true, plugin: mapDtoToPlugin(response) }; + } + + const updated = upsertWorkspacePlugin(plugin); + return { success: true, plugin: updated }; + } catch (error) { + const errorMessage = extractServiceErrorMessage(error, 'Erro ao atualizar plugin'); + return { success: false, error: errorMessage }; + } +} + +export async function deletePlugin(pluginId: string): Promise<{ success: boolean; error?: string }> { + try { + const plugins = await listPlugins(); + const target = plugins.find((plugin) => plugin.id === pluginId); + + if (!target) { + return { success: false, error: 'Plugin não encontrado' }; + } + + if (target.source === 'backend') { + await invoke('delete_plugin', { id: pluginId }); + } else { + removeWorkspacePlugin(pluginId); + } + + return { success: true }; + } catch (error) { + const errorMessage = extractServiceErrorMessage(error, 'Erro ao excluir plugin'); + return { success: false, error: errorMessage }; + } +} diff --git a/apps/desktop/src/lib/services/plugin/types.ts b/apps/desktop/src/lib/services/plugin/types.ts new file mode 100644 index 0000000..a988cd9 --- /dev/null +++ b/apps/desktop/src/lib/services/plugin/types.ts @@ -0,0 +1,74 @@ +import type { PluginDefinition, PluginKind, PluginRuntime, PluginSchemaField, PluginDependency } from '$lib/types/plugin'; + +export interface CreatePluginDto { + name: string; + type: PluginKind; + runtime: PluginRuntime; + entry_class?: string | null; + schema: PluginSchemaFieldDto[]; + source_file?: string | null; + source_code?: string | null; + dependencies: PluginDependencyDto[]; + description?: string | null; + version?: string | null; + author?: string | null; +} + +export interface UpdatePluginDto extends CreatePluginDto { + id: string; +} + +export interface PluginSchemaFieldDto { + name: string; + type: string; + default_value?: unknown; + description?: string | null; +} + +export interface PluginDependencyDto { + name: string; + version: string; +} + +export interface PluginRegistryDto { + id: string; + name: string; + type: PluginKind; + runtime: PluginRuntime; + entry_class?: string | null; + schema: PluginSchemaFieldDto[]; + source_file?: string | null; + source_code?: string | null; + dependencies: PluginDependencyDto[]; + description?: string | null; + version?: string | null; + author?: string | null; +} + +export interface CreatePluginRequest { + name: string; + kind: PluginKind; + runtime: PluginRuntime; + entryClass: string; + schema: PluginSchemaField[]; + sourceFile?: string; + sourceCode?: string; + dependencies?: PluginDependency[]; + description?: string; + version?: string; + author?: string; +} + +export interface UpdatePluginRequest extends CreatePluginRequest { + id: string; +} + +export interface CreatePluginResponse { + success: boolean; + plugin?: PluginDefinition; + error?: string; +} + +export interface GetPluginRequest { + id: string; +} diff --git a/apps/desktop/src/lib/services/shared/errorMessage.ts b/apps/desktop/src/lib/services/shared/errorMessage.ts new file mode 100644 index 0000000..b7235db --- /dev/null +++ b/apps/desktop/src/lib/services/shared/errorMessage.ts @@ -0,0 +1,33 @@ +function isRecord(value: unknown): value is Record { + return value !== null && typeof value === 'object' && !Array.isArray(value); +} + +function resolveSerializedErrorMessage(value: unknown): string | null { + if (typeof value !== 'string') return null; + + const trimmed = value.trim(); + if (!trimmed || trimmed === '[object Object]') return null; + + try { + return extractServiceErrorMessage(JSON.parse(trimmed), trimmed); + } catch { + return trimmed; + } +} + +export function extractServiceErrorMessage(error: unknown, fallback: string): string { + if (typeof error === 'string') { + return resolveSerializedErrorMessage(error) ?? fallback; + } + + if (error instanceof Error) { + return resolveSerializedErrorMessage(error.message) ?? fallback; + } + + if (isRecord(error)) { + const message = resolveSerializedErrorMessage(error.message) ?? resolveSerializedErrorMessage(error.error); + if (message) return message; + } + + return fallback; +} diff --git a/apps/desktop/src/lib/stores/analyzerStore.svelte.ts b/apps/desktop/src/lib/stores/analyzerStore.svelte.ts new file mode 100644 index 0000000..8f69ea7 --- /dev/null +++ b/apps/desktop/src/lib/stores/analyzerStore.svelte.ts @@ -0,0 +1,190 @@ +import type { ProcessedVariableData } from '$lib/types/analyzer'; +import { type ChartStateType, defaultChartState, nextViewState, resetToGridView } from '$lib/types/chart'; +import { generateId } from '$lib/utils/format'; + +export type AnalysisMethod = 'open_loop' | 'closed_loop'; + +export interface AnalyzerTab { + id: string; + name: string; + processedVariables: ProcessedVariableData[]; + selectedVariablesIndexes: number[]; + selectedAnalysisMethod: AnalysisMethod | null; +} + +class AnalyzerStore { + tabs = $state([]); + activeTabId = $state(''); + chartStates = $state>({}); + showVariablePanel = $state(false); + + constructor() { + this.createEmptyTab(); + } + + get activeTab(): AnalyzerTab | undefined { + return this.tabs.find(t => t.id === this.activeTabId); + } + + get chartState(): ChartStateType { + return this.chartStates[this.activeTabId] ?? defaultChartState(); + } + + get selectedVariables(): ProcessedVariableData[] { + const tab = this.activeTab; + if (!tab) return []; + + if (tab.selectedVariablesIndexes.length === 0) return []; + + const selectedIndexes = new Set(tab.selectedVariablesIndexes); + const selected: ProcessedVariableData[] = []; + + for (const variable of tab.processedVariables) { + if (selectedIndexes.has(variable.variable.index)) { + selected.push(variable); + } + } + + return selected; + } + + get selectedAnalysisMethod(): AnalysisMethod | null { + return this.activeTab?.selectedAnalysisMethod ?? null; + } + + addTab(id: string, name: string, processedVariables: ProcessedVariableData[]): void { + this.tabs = [...this.tabs, { + id, + name, + processedVariables, + selectedVariablesIndexes: [], + selectedAnalysisMethod: null, + }]; + this.chartStates[id] = defaultChartState(); + this.activeTabId = id; + this.showVariablePanel = processedVariables.length > 0; + } + + createEmptyTab(): void { + const id = this.generateTabId(); + this.tabs = [...this.tabs, { + id, + name: 'Unnamed', + processedVariables: [], + selectedVariablesIndexes: [], + selectedAnalysisMethod: null, + }]; + this.chartStates[id] = defaultChartState(); + this.activeTabId = id; + this.showVariablePanel = false; + } + + loadFileToActiveTab(fileName: string, processedVariables: ProcessedVariableData[]): void { + const tabIndex = this.tabs.findIndex(t => t.id === this.activeTabId); + if (tabIndex === -1) return; + + this.tabs[tabIndex].name = fileName; + this.tabs[tabIndex].processedVariables = processedVariables; + this.tabs[tabIndex].selectedVariablesIndexes = []; + this.tabs[tabIndex].selectedAnalysisMethod = null; + + this.chartStates[this.activeTabId] = defaultChartState(); + this.showVariablePanel = true; + } + + get isActiveTabEmpty(): boolean { + const tab = this.activeTab; + return !tab || tab.processedVariables.length === 0; + } + + removeTab(tabId: string): void { + if (this.tabs.length === 1) { + this.tabs[0].name = 'Unnamed'; + this.tabs[0].processedVariables = []; + this.tabs[0].selectedVariablesIndexes = []; + this.tabs[0].selectedAnalysisMethod = null; + this.chartStates[this.tabs[0].id] = defaultChartState(); + this.showVariablePanel = false; + return; + } + + this.tabs = this.tabs.filter(t => t.id !== tabId); + delete this.chartStates[tabId]; + + if (this.activeTabId === tabId && this.tabs.length > 0) { + this.activeTabId = this.tabs[0].id; + } + } + + selectTab(tabId: string): void { + this.activeTabId = tabId; + } + + toggleVariable(index: number): void { + const tabIndex = this.tabs.findIndex(t => t.id === this.activeTabId); + if (tabIndex === -1) return; + + const currentIndexes = this.tabs[tabIndex].selectedVariablesIndexes; + if (currentIndexes.includes(index)) { + this.tabs[tabIndex].selectedVariablesIndexes = currentIndexes.filter(i => i !== index); + } else { + this.tabs[tabIndex].selectedVariablesIndexes = [...currentIndexes, index]; + } + } + + toggleVariablePanel(): void { + this.showVariablePanel = !this.showVariablePanel; + } + + toggleAnalysisMethod(method: AnalysisMethod): void { + const tabIndex = this.tabs.findIndex(t => t.id === this.activeTabId); + if (tabIndex === -1) return; + + const currentMethod = this.tabs[tabIndex].selectedAnalysisMethod; + this.tabs[tabIndex].selectedAnalysisMethod = currentMethod === method ? null : method; + } + + setRange(xMin: number, xMax: number): void { + if (!this.activeTabId) return; + const state = this.chartStates[this.activeTabId]; + if (state) { + state.xMin = xMin; + state.xMax = xMax; + state.xMode = 'manual'; + } + } + + resetZoom(): void { + if (!this.activeTabId) return; + const state = this.chartStates[this.activeTabId]; + if (state) { + state.xMode = 'auto'; + state.xMin = null; + state.xMax = null; + } + } + + nextView(): void { + if (!this.activeTabId) return; + const state = this.chartStates[this.activeTabId]; + if (state) { + state.variableCount = this.selectedVariables.length; + nextViewState(state); + } + } + + resetView(): void { + if (!this.activeTabId) return; + const state = this.chartStates[this.activeTabId]; + if (state) { + resetToGridView(state); + } + } + + generateTabId(): string { + return 'tab-' + generateId(); + } +} + +// Singleton exportado +export const analyzerStore = new AnalyzerStore(); diff --git a/apps/desktop/src/lib/stores/data.svelte.ts b/apps/desktop/src/lib/stores/data.svelte.ts new file mode 100644 index 0000000..e2cc1da --- /dev/null +++ b/apps/desktop/src/lib/stores/data.svelte.ts @@ -0,0 +1,187 @@ +import type { Plant, PlantVariable } from '$lib/types/plant'; +import { createDefaultVariable } from '$lib/types/plant'; +import { normalizeControllerParamValue, type Controller, type ControllerParam } from '$lib/types/controller'; +import type { TabKey } from '$lib/types/ui'; +import type { AppState } from '$lib/types/app'; + +class AppStore { + state = $state({ + theme: 'dark', + activeModule: 'plotter', + activePlantId: null, + sidebarCollapsed: true, + showGlobalSettings: false, + showControllerPanel: false, + plants: [] + }); + + private findPlant(plantId: string): Plant | undefined { + return this.state.plants.find((plant) => plant.id === plantId); + } + + private withPlant(plantId: string, updater: (plant: Plant) => T): T | undefined { + const plant = this.findPlant(plantId); + if (!plant) { + return undefined; + } + + return updater(plant); + } + + private findController(plant: Plant, controllerId: string): Controller | undefined { + return plant.controllers.find((controller) => controller.id === controllerId); + } + + setTheme(theme: 'dark' | 'light') { + this.state.theme = theme; + } + + toggleTheme() { + this.state.theme = this.state.theme === 'dark' ? 'light' : 'dark'; + } + + setActiveModule(module: TabKey) { + this.state.activeModule = module; + } + + setActivePlantId(id: string) { + this.state.activePlantId = id; + } + + setSidebarCollapsed(collapsed: boolean) { + this.state.sidebarCollapsed = collapsed; + } + + toggleSidebar() { + this.state.sidebarCollapsed = !this.state.sidebarCollapsed; + } + + setShowGlobalSettings(show: boolean) { + this.state.showGlobalSettings = show; + } + + setShowControllerPanel(show: boolean) { + this.state.showControllerPanel = show; + } + + setPlants(plants: Plant[]) { + this.state.plants = plants; + if (!plants.some((plant) => plant.id === this.state.activePlantId)) { + this.state.activePlantId = plants[0]?.id ?? null; + } + } + + addPlant(plant: Plant) { + this.state.plants = [plant, ...this.state.plants.filter((entry) => entry.id !== plant.id)]; + if (!this.state.activePlantId) { + this.state.activePlantId = plant.id; + } + } + + upsertPlant(plant: Plant) { + const index = this.state.plants.findIndex((entry) => entry.id === plant.id); + if (index >= 0) { + this.state.plants[index] = plant; + } else { + this.state.plants.unshift(plant); + } + } + + removePlant(plantId: string) { + const idx = this.state.plants.findIndex(p => p.id === plantId); + if (idx > -1) { + this.state.plants.splice(idx, 1); + if (this.state.activePlantId === plantId) { + this.state.activePlantId = this.state.plants[0]?.id ?? null; + } + } + } + + updatePlant(plantId: string, updates: Partial) { + this.withPlant(plantId, (plant) => Object.assign(plant, updates)); + } + + toggleConnect(plantId: string) { + this.withPlant(plantId, (plant) => { + plant.connected = !plant.connected; + }); + } + + togglePause(plantId: string) { + this.withPlant(plantId, (plant) => { + plant.paused = !plant.paused; + }); + } + + addController(plantId: string, controller: Omit) { + this.withPlant(plantId, (plant) => { + plant.controllers.push({ + ...controller, + id: crypto.randomUUID().substring(0, 9) + }); + }); + } + + deleteController(plantId: string, controllerId: string) { + this.withPlant(plantId, (plant) => { + const idx = plant.controllers.findIndex((controller) => controller.id === controllerId); + if (idx > -1) plant.controllers.splice(idx, 1); + }); + } + + updateControllerMeta(plantId: string, controllerId: string, field: string, value: any) { + this.withPlant(plantId, (plant) => { + const controller = this.findController(plant, controllerId); + if (controller) (controller as any)[field] = value; + }); + } + + updateControllerParam(plantId: string, controllerId: string, paramKey: string, value: any): boolean { + return this.withPlant(plantId, (plant) => { + const controller = this.findController(plant, controllerId); + if (controller?.params) { + const param = (controller.params as Record)[paramKey]; + if (!param) return false; + + const normalizedValue = normalizeControllerParamValue(param, value); + if (normalizedValue === null) { + return false; + } + + param.value = normalizedValue; + return true; + } + + return false; + }) ?? false; + } + + updateVariableSetpoint(plantId: string, variableIndex: number, setpoint: number) { + this.withPlant(plantId, (plant) => { + if (plant.variables[variableIndex]) { + plant.variables[variableIndex].setpoint = setpoint; + } + }); + } + + addVariable(plantId: string, variable?: Partial) { + this.withPlant(plantId, (plant) => { + const index = plant.variables.length; + plant.variables.push({ + ...createDefaultVariable(index), + ...variable, + id: `var_${index}`, + }); + }); + } + + removeVariable(plantId: string, variableIndex: number) { + this.withPlant(plantId, (plant) => { + if (plant.variables.length > 1) { + plant.variables.splice(variableIndex, 1); + } + }); + } +} + +export const appStore = new AppStore(); diff --git a/apps/desktop/src/lib/stores/plantData.ts b/apps/desktop/src/lib/stores/plantData.ts new file mode 100644 index 0000000..8572089 --- /dev/null +++ b/apps/desktop/src/lib/stores/plantData.ts @@ -0,0 +1,220 @@ +import type { + PlantDataPoint, + PlantSeriesCatalog, + PlantSeriesDescriptor, + PlantStats, + PlantTelemetryBufferConfig, + VariableStats, +} from '$lib/types/plant'; + +const _data = new Map(); +const _stats = new Map(); +const _variableStats = new Map(); +const _seriesCatalog = new Map(); +const _bufferConfig = new Map(); + +const DEFAULT_STATS: Readonly = Object.freeze({ + dt: 0, + uptime: 0, +}); + +const DEFAULT_VAR_STATS: Readonly = Object.freeze({ + errorAvg: 0, + stability: 100, + ripple: 0, +}); + +const DEFAULT_BUFFER_CONFIG: Readonly = Object.freeze({ + maxPoints: 20_000, + trimTo: 15_000, +}); + +function normalizeBufferConfig(config: Partial = {}): PlantTelemetryBufferConfig { + const maxPoints = Math.max(1_000, Math.floor(config.maxPoints ?? DEFAULT_BUFFER_CONFIG.maxPoints)); + const trimTo = Math.min(maxPoints, Math.max(500, Math.floor(config.trimTo ?? DEFAULT_BUFFER_CONFIG.trimTo))); + + return { + maxPoints, + trimTo, + }; +} + +function getResolvedBufferConfig(plantId: string): PlantTelemetryBufferConfig { + return _bufferConfig.get(plantId) ?? { ...DEFAULT_BUFFER_CONFIG }; +} + +function trimDataInPlace(plantId: string, data: PlantDataPoint[]): PlantDataPoint[] { + const config = getResolvedBufferConfig(plantId); + + if (data.length <= config.maxPoints) { + return data; + } + + data.splice(0, data.length - config.trimTo); + return data; +} + +function normalizeSeriesCatalog(series: PlantSeriesDescriptor[]): PlantSeriesDescriptor[] { + const byKey = new Map(); + + for (const item of series) { + const key = item.key.trim(); + + if (!key) { + continue; + } + + byKey.set(key, { + key, + label: item.label.trim() || key, + role: item.role, + }); + } + + return Array.from(byKey.values()); +} + +function getVariableStatsKey(plantId: string, varIndex: number): string { + return `${plantId}_var_${varIndex}`; +} + +export function getPlantData(plantId: string): PlantDataPoint[] { + let arr = _data.get(plantId); + if (!arr) { + arr = []; + _data.set(plantId, arr); + } + return arr; +} + +export function getPlantStats(plantId: string): PlantStats { + return _stats.get(plantId) ?? { ...DEFAULT_STATS }; +} + +export function setPlantStats(plantId: string, stats: PlantStats): void { + _stats.set(plantId, stats); +} + +export function setPlantData(plantId: string, data: PlantDataPoint[]): void { + _data.set(plantId, data); +} + +export function appendPlantData(plantId: string, points: PlantDataPoint[]): PlantDataPoint[] { + if (points.length === 0) { + return getPlantData(plantId); + } + + const config = getResolvedBufferConfig(plantId); + + if (points.length >= config.maxPoints) { + const next = points.slice(-config.trimTo); + _data.set(plantId, next); + return next; + } + + const data = getPlantData(plantId); + data.push(...points); + return trimDataInPlace(plantId, data); +} + +export function setPlantBufferConfig( + plantId: string, + config: Partial +): PlantTelemetryBufferConfig { + const next = normalizeBufferConfig({ + ...getResolvedBufferConfig(plantId), + ...config, + }); + + _bufferConfig.set(plantId, next); + trimDataInPlace(plantId, getPlantData(plantId)); + return next; +} + +export function getPlantBufferConfig(plantId: string): PlantTelemetryBufferConfig { + return getResolvedBufferConfig(plantId); +} + +export function getPlantSeriesCatalog(plantId: string): PlantSeriesDescriptor[] { + return _seriesCatalog.get(plantId) ?? []; +} + +export function getPlantSeriesLabel(plantId: string, key: string, fallback: string = key): string { + return getPlantSeriesCatalog(plantId).find((series) => series.key === key)?.label ?? fallback; +} + +export function setPlantSeriesCatalog(payload: PlantSeriesCatalog): PlantSeriesDescriptor[] { + const normalized = normalizeSeriesCatalog(payload.series); + _seriesCatalog.set(payload.plantId, normalized); + return normalized; +} + +export function seedPlantSeriesCatalog(payload: PlantSeriesCatalog): PlantSeriesDescriptor[] { + const existing = getPlantSeriesCatalog(payload.plantId); + + if (existing.length === 0) { + return setPlantSeriesCatalog(payload); + } + + const missing = normalizeSeriesCatalog( + payload.series.filter((item) => !existing.some((current) => current.key === item.key)) + ); + + if (missing.length === 0) { + return existing; + } + + const merged = [...existing, ...missing]; + _seriesCatalog.set(payload.plantId, merged); + return merged; +} + +export function ingestPlantTelemetry(payload: { + plantId: string; + points?: PlantDataPoint[]; + stats?: PlantStats; + variableStats?: VariableStats[]; + series?: PlantSeriesDescriptor[]; +}): PlantDataPoint[] { + if (payload.series?.length) { + setPlantSeriesCatalog({ + plantId: payload.plantId, + series: payload.series, + }); + } + + if (payload.stats) { + setPlantStats(payload.plantId, payload.stats); + } + + payload.variableStats?.forEach((stats, index) => { + setVariableStats(payload.plantId, index, stats); + }); + + return appendPlantData(payload.plantId, payload.points ?? []); +} + +export function getVariableStats(plantId: string, varIndex: number): VariableStats { + return _variableStats.get(getVariableStatsKey(plantId, varIndex)) ?? { ...DEFAULT_VAR_STATS }; +} + +export function setVariableStats(plantId: string, varIndex: number, stats: VariableStats): void { + _variableStats.set(getVariableStatsKey(plantId, varIndex), stats); +} + +export function clearVariableStats(plantId: string): void { + for (const key of _variableStats.keys()) { + if (key.startsWith(`${plantId}_var_`)) { + _variableStats.delete(key); + } + } +} + +export function clearPlant(plantId: string): void { + const data = getPlantData(plantId); + data.length = 0; + _stats.set(plantId, { ...DEFAULT_STATS }); + _seriesCatalog.delete(plantId); + _bufferConfig.delete(plantId); + clearVariableStats(plantId); +} diff --git a/apps/desktop/src/lib/types/analyzer.ts b/apps/desktop/src/lib/types/analyzer.ts new file mode 100644 index 0000000..75eed77 --- /dev/null +++ b/apps/desktop/src/lib/types/analyzer.ts @@ -0,0 +1,28 @@ +export interface AnalyzerActuatorInfo { + id: string; + name: string; + unit: string; +} + +export interface AnalyzerVariable { + index: number; + sensorId: string; + sensorName: string; + sensorUnit: string; + setpointId: string; + actuators: AnalyzerActuatorInfo[]; + selected: boolean; +} + +export interface ProcessedVariableData { + variable: AnalyzerVariable; + sensorData: Array<{ time: number; value: number }>; + setpointData: Array<{ time: number; value: number }>; + actuatorsData: Array<{ + id: string; + name: string; + data: Array<{ time: number; value: number }>; + }>; + sensorRange: { min: number; max: number }; + actuatorRange: { min: number; max: number }; +} diff --git a/apps/desktop/src/lib/types/app.ts b/apps/desktop/src/lib/types/app.ts new file mode 100644 index 0000000..ab8cd1b --- /dev/null +++ b/apps/desktop/src/lib/types/app.ts @@ -0,0 +1,12 @@ +import type { Plant } from './plant'; +import type { TabKey } from './ui'; + +export interface AppState { + theme: 'dark' | 'light'; + activeModule: TabKey; + activePlantId: string | null; + sidebarCollapsed: boolean; + showGlobalSettings: boolean; + showControllerPanel: boolean; + plants: Plant[]; +} diff --git a/apps/desktop/src/lib/types/chart.ts b/apps/desktop/src/lib/types/chart.ts new file mode 100644 index 0000000..f44a4a9 --- /dev/null +++ b/apps/desktop/src/lib/types/chart.ts @@ -0,0 +1,101 @@ +export interface ChartDataPoint { + time: number; + [key: string]: number; +} + +export interface ChartSeries { + key: string; + label: string; + color: string; + visible: boolean; + data: ChartDataPoint[]; + dataKey: string; + type?: 'line' | 'step' | 'area'; + strokeWidth?: number; + dashed?: boolean; +} + +export interface ChartConfig { + yMin: number; + yMax: number; + yMode: 'auto' | 'manual'; + xMode: 'auto' | 'sliding' | 'manual'; + windowSize: number; + xMin?: number | null; + xMax?: number | null; + showGrid: boolean; + showHover?: boolean; +} + +export type XAxisMode = 'auto' | 'sliding' | 'manual'; +export type YAxisMode = 'auto' | 'manual'; + +export type ViewMode = 'grid' | 'single'; + +export interface VariableVisibility { + pv: boolean; + sp: boolean; + mv: boolean; +} + +export interface ChartStateType { + xMode: XAxisMode; + yMode: YAxisMode; + xMin: number | null; + xMax: number | null; + yMin: number; + yMax: number; + windowSize: number; + visible: VariableVisibility; + viewMode: ViewMode; + focusedVariableIndex: number; + variableCount: number; +} + +export function defaultChartState(variableCount: number = 1): ChartStateType { + return { + xMode: 'auto', + yMode: 'manual', + xMin: null, + xMax: null, + yMin: 0, + yMax: 100, + windowSize: 30, + visible: { pv: true, sp: true, mv: true }, + viewMode: 'grid', + focusedVariableIndex: 0, + variableCount, + }; +} + +export function nextViewState(state: ChartStateType): void { + if (state.viewMode === 'grid') { + state.viewMode = 'single'; + state.focusedVariableIndex = 0; + } else { + const nextIndex = state.focusedVariableIndex + 1; + if (nextIndex >= state.variableCount) { + state.viewMode = 'grid'; + state.focusedVariableIndex = 0; + } else { + state.focusedVariableIndex = nextIndex; + } + } +} + +export function resetToGridView(state: ChartStateType): void { + state.viewMode = 'grid'; + state.focusedVariableIndex = 0; +} + +export interface LineColors { + pv: string; + sp: string; + mv: string; +} + +export const DEFAULT_LINE_COLORS: Readonly = Object.freeze({ + pv: '#3b82f6', + sp: '#f59e0b', + mv: '#10b981', +}); diff --git a/apps/desktop/src/lib/types/controller.ts b/apps/desktop/src/lib/types/controller.ts new file mode 100644 index 0000000..d34dae6 --- /dev/null +++ b/apps/desktop/src/lib/types/controller.ts @@ -0,0 +1,62 @@ +export type ControllerType = 'PID' | 'Flow' | 'Level' | (string & {}); +export type ControllerRuntimeStatus = 'synced' | 'pending_restart'; + +export type ParamType = 'number' | 'boolean' | 'string'; + +export interface ControllerParam { + type: ParamType; + value: number | boolean | string; + label: string; +} + +export function isValidControllerParamValue(type: ParamType, value: unknown): value is ControllerParam['value'] { + if (type === 'number') { + return typeof value === 'number' && Number.isFinite(value); + } + + if (type === 'boolean') { + return typeof value === 'boolean'; + } + + return typeof value === 'string'; +} + +export function normalizeControllerParamValue( + param: ControllerParam, + value: unknown +): ControllerParam['value'] | null { + if (isValidControllerParamValue(param.type, value)) { + return value; + } + + if (param.type === 'number' && typeof value === 'string') { + const parsed = Number(value); + return Number.isFinite(parsed) ? parsed : null; + } + + if (param.type === 'string' && value != null) { + return String(value); + } + + return null; +} + +export interface PIDParams { + kp: ControllerParam; + ki: ControllerParam; + kd: ControllerParam; + manualMode: ControllerParam; +} + +export interface Controller { + id: string; + pluginId?: string; + pluginName?: string; + name: string; + type: ControllerType; + active: boolean; + inputVariableIds: string[]; + outputVariableIds: string[]; + params: PIDParams | Record; + runtimeStatus?: ControllerRuntimeStatus; +} diff --git a/apps/desktop/src/lib/types/plant.ts b/apps/desktop/src/lib/types/plant.ts new file mode 100644 index 0000000..091ac18 --- /dev/null +++ b/apps/desktop/src/lib/types/plant.ts @@ -0,0 +1,144 @@ +import type { Controller } from './controller'; +import type { PluginInstance } from './plugin'; + +export interface VariableDataPoint { + time: number; + pv: number; + sp: number; + mv: number; +} + +export interface VariableStats { + errorAvg: number; + stability: number; + ripple: number; +} + +export type PlantSeriesRole = 'pv' | 'sp' | 'mv'; + +export interface PlantSeriesDescriptor { + key: string; + label: string; + role: PlantSeriesRole; +} + +export type VariableType = 'sensor' | 'atuador'; + +export const VARIABLE_TYPE_LABELS: Record = { + sensor: 'Sensor', + atuador: 'Atuador', +}; + +export interface PlantVariable { + id: string; + name: string; + type: VariableType; + unit: string; + setpoint: number; + pvMin: number; + pvMax: number; + linkedSensorIds?: string[]; +} + +export interface PlantDataPoint { + time: number; + [key: string]: number; +} + +export interface PlantSeriesCatalog { + plantId: string; + series: PlantSeriesDescriptor[]; +} + +export function getVariableKeys(varIndex: number) { + return { + pv: `var_${varIndex}_pv`, + sp: `var_${varIndex}_sp`, + mv: `var_${varIndex}_mv`, + }; +} + +export function extractVariableData( + data: PlantDataPoint[], + varIndex: number +): VariableDataPoint[] { + const keys = getVariableKeys(varIndex); + return data.map(point => ({ + time: point.time, + pv: point[keys.pv] ?? 0, + sp: point[keys.sp] ?? 0, + mv: point[keys.mv] ?? 0, + })); +} + +export interface PlantStats { + dt: number; // Delta time / amostragem + uptime: number; // Segundos desde que iniciou +} + +export interface PlantTelemetryBufferConfig { + maxPoints: number; + trimTo: number; +} + +export interface Plant { + id: string; + name: string; + sampleTimeMs: number; + connected: boolean; + paused: boolean; + variables: PlantVariable[]; + stats: PlantStats; + controllers: Controller[]; + driver?: PluginInstance | null; + driverId?: string | null; + source?: 'backend' | 'workspace'; +} + +export function buildPlantSeriesCatalog(plantId: string, variables: PlantVariable[]): PlantSeriesCatalog { + const series: PlantSeriesDescriptor[] = []; + + variables.forEach((variable, index) => { + const keys = getVariableKeys(index); + + if (variable.type === 'sensor') { + series.push({ + key: keys.pv, + label: `${variable.name}`, + role: 'pv', + }); + series.push({ + key: keys.sp, + label: `${variable.name}`, + role: 'sp', + }); + return; + } + + series.push({ + key: keys.pv, + label: variable.name, + role: 'mv', + }); + }); + + return { + plantId, + series, + }; +} + +export function createDefaultVariable(index: number, name?: string, type: VariableType = 'sensor'): PlantVariable { + return { + id: `var_${index}`, + name: name ?? `Variável ${index + 1}`, + type, + unit: '%', + setpoint: type === 'sensor' ? 50 : 0, + pvMin: 0, + pvMax: 100, + ...(type === 'atuador' ? { linkedSensorIds: [] } : {}), + }; +} + +export type { Controller } from './controller'; diff --git a/apps/desktop/src/lib/types/plantExport.ts b/apps/desktop/src/lib/types/plantExport.ts new file mode 100644 index 0000000..2d6eba5 --- /dev/null +++ b/apps/desktop/src/lib/types/plantExport.ts @@ -0,0 +1,101 @@ +export interface ExportSensor { + id: string; + name: string; + unit: string; + actuatorIds: string[]; + setpointId: string; +} + +export interface ExportActuator { + id: string; + name: string; + unit: string; + linkedSensorIds: string[]; +} + +export interface ExportSetpoint { + id: string; + sensorId: string; +} + +export interface ExportPlantMeta { + name: string; + exportedAt: string; + version: string; + sampleCount: number; + duration: number; + sampleTimeMs?: number; +} + +export interface ExportDataSample { + time: number; + sensors: Record; + setpoints: Record; + actuators: Record; +} + +export interface PlantExportJSON { + meta: ExportPlantMeta; + sensors: ExportSensor[]; + actuators: ExportActuator[]; + setpoints: ExportSetpoint[]; + data: ExportDataSample[]; +} + +export const EXPORT_FORMAT_VERSION = '1.0.0'; + +export function validatePlantExportJSON(obj: unknown): string | null { + if (!obj || typeof obj !== 'object') { + return 'Arquivo inválido: não é um objeto JSON'; + } + + const json = obj as Record; + + const meta = ((json.meta && typeof json.meta === 'object' && !Array.isArray(json.meta)) + ? json.meta + : json) as Record; + + if (typeof meta.name !== 'string') return 'meta.name deve ser uma string'; + if (meta.sampleTimeMs !== undefined && typeof meta.sampleTimeMs !== 'number') { + return 'meta.sampleTimeMs deve ser um número'; + } + + if (!Array.isArray(json.sensors)) { + return 'Arquivo inválido: campo "sensors" deve ser um array'; + } + for (const s of json.sensors as unknown[]) { + const sensor = s as Record; + if (typeof sensor?.id !== 'string') return 'Cada sensor deve ter um "id" string'; + if (typeof sensor?.name !== 'string') return 'Cada sensor deve ter um "name" string'; + if (!Array.isArray(sensor?.actuatorIds)) return 'Cada sensor deve ter "actuatorIds" array'; + if (typeof sensor?.setpointId !== 'string') return 'Cada sensor deve ter "setpointId" string'; + } + + if (!Array.isArray(json.actuators)) { + return 'Arquivo inválido: campo "actuators" deve ser um array'; + } + for (const a of json.actuators as unknown[]) { + const act = a as Record; + if (typeof act?.id !== 'string') return 'Cada atuador deve ter um "id" string'; + if (typeof act?.name !== 'string') return 'Cada atuador deve ter um "name" string'; + if (!Array.isArray(act?.linkedSensorIds)) return 'Cada atuador deve ter "linkedSensorIds" array'; + } + + if (!Array.isArray(json.setpoints)) { + return 'Arquivo inválido: campo "setpoints" deve ser um array'; + } + + if (!Array.isArray(json.data)) { + return 'Arquivo inválido: campo "data" deve ser um array'; + } + if ((json.data as unknown[]).length === 0) { + return 'Arquivo inválido: campo "data" está vazio'; + } + const firstSample = (json.data as unknown[])[0] as Record; + if (typeof firstSample?.time !== 'number') return 'Cada amostra deve ter "time" numérico'; + if (!firstSample?.sensors || typeof firstSample.sensors !== 'object') return 'Cada amostra deve ter "sensors" objeto'; + if (!firstSample?.setpoints || typeof firstSample.setpoints !== 'object') return 'Cada amostra deve ter "setpoints" objeto'; + if (!firstSample?.actuators || typeof firstSample.actuators !== 'object') return 'Cada amostra deve ter "actuators" objeto'; + + return null; +} diff --git a/apps/desktop/src/lib/types/plugin.ts b/apps/desktop/src/lib/types/plugin.ts new file mode 100644 index 0000000..fc80305 --- /dev/null +++ b/apps/desktop/src/lib/types/plugin.ts @@ -0,0 +1,283 @@ +export type BuiltInPluginKind = 'driver' | 'controller'; +export type PluginKind = BuiltInPluginKind | (string & {}); + +export type PluginRuntime = 'python' | 'rust-native'; + +export type SchemaFieldType = 'bool' | 'int' | 'float' | 'string' | 'list'; + +export const BUILTIN_PLUGIN_KINDS: BuiltInPluginKind[] = ['driver', 'controller']; + +export const PLUGIN_KIND_LABELS: Record = { + driver: 'Driver', + controller: 'Controlador', +}; + +export function isBuiltInPluginKind(kind: string): kind is BuiltInPluginKind { + return BUILTIN_PLUGIN_KINDS.includes(kind as BuiltInPluginKind); +} + +export function getPluginKindLabel(kind: PluginKind): string { + if (isBuiltInPluginKind(kind)) { + return PLUGIN_KIND_LABELS[kind]; + } + + return kind + .split(/[_-\s]+/) + .filter(Boolean) + .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) + .join(' '); +} + +export function normalizePluginKind(kind: string): PluginKind { + return kind + .trim() + .toLowerCase() + .replace(/\s+/g, '_') + .replace(/[^a-z0-9_-]/g, '') as PluginKind; +} + +export const PLUGIN_RUNTIME_LABELS: Record = { + python: 'Python', + 'rust-native': 'Rust Nativo', +}; + +export const PLUGIN_CREATION_RUNTIMES: readonly PluginRuntime[] = ['python']; + +export const SCHEMA_FIELD_TYPE_LABELS: Record = { + bool: 'Boolean', + int: 'Inteiro', + float: 'Decimal', + string: 'Texto', + list: 'Lista', +}; + +export const AUTO_SCHEMA_FIELDS: PluginSchemaField[] = [ + { name: 'num_sensors', type: 'int', description: 'Quantidade de sensores usada no driver' }, + { name: 'num_actuators', type: 'int', description: 'Quantidade de atuadores usada no driver' }, +]; + +export const RESERVED_FIELD_NAMES = AUTO_SCHEMA_FIELDS.map(f => f.name); + +export function isAutoSchemaField(fieldName: string): boolean { + return RESERVED_FIELD_NAMES.includes(fieldName); +} + +export interface PluginSchemaField { + name: string; + type: SchemaFieldType; + defaultValue?: SchemaFieldValue; + description?: string; +} + +export type SchemaFieldValue = boolean | number | string | SchemaFieldValue[]; + +export function isFieldRequired(field: PluginSchemaField): boolean { + return field.defaultValue === undefined; +} + +export function pluginNeedsInitialConfig(plugin: Pick): boolean { + return plugin.schema.some(isFieldRequired); +} + +export interface PluginDependency { + name: string; + version: string; +} + +export interface PluginDefinition { + id: string; + name: string; + kind: PluginKind; + runtime: PluginRuntime; + entryClass: string; + sourceFile: string; + sourceCode?: string; + schema: PluginSchemaField[]; + dependencies?: PluginDependency[]; + description?: string; + version?: string; + author?: string; + source?: 'backend' | 'workspace'; +} + +export interface PluginInstance { + pluginId: string; + pluginName: string; + pluginKind: PluginKind; + config: Record; +} + +export interface PluginFileJSON { + name: string; + kind: PluginKind; + runtime: PluginRuntime; + entryClass?: string; + sourceFile: string; + schema: PluginSchemaField[]; + dependencies?: PluginDependency[]; + description?: string; + version?: string; + author?: string; +} + +export const DRIVER_REQUIRED_METHODS = [ + 'connect', + 'stop', + 'read', +] as const; + +export const CONTROLLER_REQUIRED_METHODS = [ + 'compute', +] as const; + +export function toPluginEntryClassName(pluginName: string, kind: PluginKind): string { + const fallback = normalizePluginKind(kind) === 'controller' ? 'MyController' : 'MyDriver'; + if (!pluginName.trim()) return fallback; + + const className = pluginName + .replace(/[^a-zA-Z0-9\s_]/g, '') + .split(/[\s_]+/) + .filter(Boolean) + .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()) + .join(''); + + return className || fallback; +} + +export function toDriverClassName(pluginName: string): string { + return toPluginEntryClassName(pluginName, 'driver'); +} + +export function toControllerClassName(pluginName: string): string { + return toPluginEntryClassName(pluginName, 'controller'); +} + +export function generateDriverTemplate(pluginName: string, entryClass?: string): string { + const className = (entryClass?.trim() || toDriverClassName(pluginName)); + return `from typing import Any, Dict + +class ${className}: + """Driver: ${pluginName || 'Novo Driver'}""" + + def __init__(self, context: Any) -> None: + # Contrato atual: + # - context.config -> configuração do driver + # - context.plant -> planta, sensores, atuadores e setpoints + self.context = context + + def connect(self) -> bool: + # Exemplos uteis: + # port = self.context.config.get("port") + # sensor_ids = self.context.plant.sensors.ids + return True + + def stop(self) -> bool: + return True + + def read(self) -> Dict[str, Dict[str, float]]: + # O contrato atual de leitura e explicito: + # { + # "sensors": {"var_0": 0.0}, + # "actuators": {"var_2": 0.0} + # } + return { + "sensors": { + sensor_id: 0.0 + for sensor_id in self.context.plant.sensors.ids + }, + "actuators": {} + } + + def write(self, outputs: Dict[str, float]) -> bool: + # outputs contem o mapa final de saidas do ciclo: + # {"var_2": 42.0} + return True +`; +} + +export function generateControllerTemplate(pluginName: string, entryClass?: string): string { + const className = (entryClass?.trim() || toControllerClassName(pluginName)); + return `from typing import Any, Dict + +class ${className}: + """Controlador: ${pluginName || 'Novo Controlador'}""" + + def __init__(self, context: Any) -> None: + # Contrato atual: + # - context.controller -> id, nome, tipo, bindings e parametros + # - context.plant -> variaveis, sensores, atuadores e setpoints + self.context = context + + def compute(self, snapshot: Dict[str, Any]) -> Dict[str, float]: + # snapshot contem os dados do ciclo atual: + # - snapshot["dt_s"] + # - snapshot["setpoints"] + # - snapshot["sensors"] + # - snapshot["actuators"] + # - snapshot["controller"] + # + # Retorne apenas saidas por variable_id de atuador. + outputs: Dict[str, float] = {} + for actuator_id in self.context.controller.output_variable_ids: + outputs[actuator_id] = 0.0 + return outputs +`; +} + +const FIELD_NAME_REGEX = /^[a-zA-Z_][a-zA-Z0-9_]*$/; + +export function isValidFieldName(name: string): boolean { + return FIELD_NAME_REGEX.test(name); +} + +export function getDefaultValueForType(type: SchemaFieldType): SchemaFieldValue { + switch (type) { + case 'bool': return false; + case 'int': return 0; + case 'float': return 0.0; + case 'string': return ''; + case 'list': return []; + } +} + +export function validatePluginJSON(obj: unknown): string | null { + if (!obj || typeof obj !== 'object') { + return 'Arquivo inválido: não é um objeto JSON'; + } + + const json = obj as Record; + + if (typeof json.name !== 'string' || !json.name.trim()) { + return 'Campo "name" é obrigatório e deve ser uma string'; + } + + if (typeof json.kind !== 'string' || !normalizePluginKind(json.kind).trim()) { + return 'Campo "kind" deve ser uma string não vazia'; + } + + if (json.runtime !== 'python' && json.runtime !== 'rust-native') { + return 'Campo "runtime" deve ser "python" ou "rust-native"'; + } + + if (json.entryClass !== undefined && (typeof json.entryClass !== 'string' || !json.entryClass.trim())) { + return 'Campo "entryClass" deve ser uma string não vazia'; + } + + if (typeof json.sourceFile !== 'string' || !json.sourceFile.trim()) { + return 'Campo "sourceFile" é obrigatório'; + } + + if (!Array.isArray(json.schema)) { + return 'Campo "schema" deve ser um array'; + } + + for (let i = 0; i < json.schema.length; i++) { + const field = json.schema[i] as Record; + if (typeof field?.name !== 'string') return `schema[${i}].name deve ser string`; + if (!isValidFieldName(field.name as string)) return `schema[${i}].name contém caracteres inválidos`; + const validTypes: string[] = ['bool', 'int', 'float', 'string', 'list']; + if (!validTypes.includes(field.type as string)) return `schema[${i}].type inválido`; + } + + return null; +} diff --git a/apps/desktop/src/lib/types/ui.ts b/apps/desktop/src/lib/types/ui.ts new file mode 100644 index 0000000..522f12d --- /dev/null +++ b/apps/desktop/src/lib/types/ui.ts @@ -0,0 +1,7 @@ +export type TabKey = 'plotter' | 'analyzer' | 'plugins'; + +export const MODULE_TABS = { + plotter: { label: 'Plotter', icon: 'TrendingUp' }, + analyzer: { label: 'Analyzer', icon: 'BarChart3' }, + plugins: { label: 'Plugins', icon: 'Puzzle' } +} as const; diff --git a/apps/desktop/src/lib/utils/chartBuilder.ts b/apps/desktop/src/lib/utils/chartBuilder.ts new file mode 100644 index 0000000..f5a2b48 --- /dev/null +++ b/apps/desktop/src/lib/utils/chartBuilder.ts @@ -0,0 +1,237 @@ +import type { ChartSeries, ChartConfig, ChartDataPoint } from '$lib/types/chart'; + +export interface SeriesOptions { + strokeWidth?: number; + dashed?: boolean; + visible?: boolean; +} + +export class ChartBuilder { + private _series: ChartSeries[] = []; + private _config: ChartConfig = { + yMin: 0, + yMax: 100, + yMode: 'auto', + xMode: 'auto', + windowSize: 30, + showGrid: true, + showHover: true, + }; + + addLineSeries( + key: string, + data: ChartDataPoint[], + dataKey: string, + label: string, + color: string, + options: SeriesOptions = {} + ): this { + this._series.push({ + key, + label, + color, + visible: options.visible ?? true, + data, + dataKey, + type: 'line', + strokeWidth: options.strokeWidth ?? 2, + dashed: options.dashed ?? false, + }); + return this; + } + + addStepSeries( + key: string, + data: ChartDataPoint[], + dataKey: string, + label: string, + color: string, + options: SeriesOptions = {} + ): this { + this._series.push({ + key, + label, + color, + visible: options.visible ?? true, + data, + dataKey, + type: 'step', + strokeWidth: options.strokeWidth ?? 1.5, + dashed: options.dashed ?? false, + }); + return this; + } + + addAreaSeries( + key: string, + data: ChartDataPoint[], + dataKey: string, + label: string, + color: string, + options: SeriesOptions = {} + ): this { + this._series.push({ + key, + label, + color, + visible: options.visible ?? true, + data, + dataKey, + type: 'area', + strokeWidth: options.strokeWidth ?? 1.5, + dashed: options.dashed ?? false, + }); + return this; + } + + setYAxis(mode: 'auto' | 'manual', min: number = 0, max: number = 100): this { + this._config.yMode = mode; + this._config.yMin = min; + this._config.yMax = max; + return this; + } + + setXAxis( + mode: 'auto' | 'sliding' | 'manual', + windowSize: number = 30, + min?: number, + max?: number + ): this { + this._config.xMode = mode; + this._config.windowSize = windowSize; + this._config.xMin = min; + this._config.xMax = max; + return this; + } + + enableGrid(): this { + this._config.showGrid = true; + return this; + } + + disableGrid(): this { + this._config.showGrid = false; + return this; + } + + enableHover(): this { + this._config.showHover = true; + return this; + } + + disableHover(): this { + this._config.showHover = false; + return this; + } + + toggleSeries(key: string, visible: boolean): this { + const series = this._series.find(s => s.key === key); + if (series) { + series.visible = visible; + } + return this; + } + + setSeriesColor(key: string, color: string): this { + const series = this._series.find(s => s.key === key); + if (series) { + series.color = color; + } + return this; + } + + build(): { series: ChartSeries[]; config: ChartConfig } { + return { + series: this._series, + config: this._config, + }; + } + + get series(): ChartSeries[] { + return this._series; + } + + get config(): ChartConfig { + return this._config; + } + + static from(series: ChartSeries[], config: ChartConfig): ChartBuilder { + const builder = new ChartBuilder(); + builder._series = [...series]; + builder._config = { ...config }; + return builder; + } + + static createRealtimeConfig( + data: ChartDataPoint[], + colors: { pv: string; sp: string; mv: string }, + visible: { pv: boolean; sp: boolean; mv: boolean } = { pv: true, sp: true, mv: true } + ): { pvsp: { series: ChartSeries[]; config: ChartConfig }; mv: { series: ChartSeries[]; config: ChartConfig } } { + const pvspBuilder = new ChartBuilder() + .addLineSeries('pv', data, 'pv', 'PV (Process Variable)', colors.pv, { visible: visible.pv }) + .addStepSeries('sp', data, 'sp', 'SP (Setpoint)', colors.sp, { dashed: true, visible: visible.sp }) + .setYAxis('manual', 0, 100) + .setXAxis('auto', 30) + .enableGrid() + .enableHover(); + + const mvBuilder = new ChartBuilder() + .addAreaSeries('mv', data, 'mv', 'MV (Output)', colors.mv, { visible: visible.mv }) + .setYAxis('manual', 0, 100) + .setXAxis('auto', 30) + .enableGrid() + .enableHover(); + + return { + pvsp: pvspBuilder.build(), + mv: mvBuilder.build(), + }; + } + + static createAnalyzerConfig( + sensorData: ChartDataPoint[], + setpointData: ChartDataPoint[], + actuatorsData: Array<{ id: string; name: string; data: ChartDataPoint[] }>, + sensorRange: { min: number; max: number }, + actuatorRange: { min: number; max: number } + ): { sensor: { series: ChartSeries[]; config: ChartConfig }; actuator: { series: ChartSeries[]; config: ChartConfig } } { + const actuatorColors = ['#10b981', '#06b6d4', '#8b5cf6', '#f97316', '#ec4899', '#14b8a6']; + + const sensorBuilder = new ChartBuilder() + .addLineSeries('sensor', sensorData, 'sensor', 'Sensor', '#3b82f6') + .addLineSeries('setpoint', setpointData, 'setpoint', 'Setpoint', '#f59e0b', { dashed: true, strokeWidth: 1.5 }) + .setYAxis('manual', sensorRange.min, sensorRange.max) + .setXAxis('auto') + .enableGrid() + .enableHover(); + + const actuatorBuilder = new ChartBuilder() + .setYAxis('manual', actuatorRange.min, actuatorRange.max) + .setXAxis('auto') + .enableGrid() + .enableHover(); + + actuatorsData.forEach((act, i) => { + const color = actuatorColors[i % actuatorColors.length]; + actuatorBuilder.addLineSeries(act.id, act.data, act.id, act.name, color, { strokeWidth: 1.5 }); + }); + + if (actuatorsData.length === 0) { + actuatorBuilder.addLineSeries('empty', [], 'empty', 'Sem atuador', '#666'); + } + + return { + sensor: sensorBuilder.build(), + actuator: actuatorBuilder.build(), + }; + } +} + +export function createChart(): ChartBuilder { + return new ChartBuilder(); +} + +export const ChartPresets = { + realtime: ChartBuilder.createRealtimeConfig, + analyzer: ChartBuilder.createAnalyzerConfig, +} as const; diff --git a/apps/desktop/src/lib/utils/controllerAssignments.ts b/apps/desktop/src/lib/utils/controllerAssignments.ts new file mode 100644 index 0000000..0526ed7 --- /dev/null +++ b/apps/desktop/src/lib/utils/controllerAssignments.ts @@ -0,0 +1,101 @@ +import type { Controller } from '$lib/types/controller'; +import type { PlantVariable } from '$lib/types/plant'; + +function buildVariableMap(variables: PlantVariable[]): Map { + return new Map(variables.map((variable) => [variable.id, variable])); +} + +function formatVariableNames(ids: string[], variables: PlantVariable[]): string { + const variableMap = buildVariableMap(variables); + return ids + .map((id) => variableMap.get(id)?.name ?? id) + .join(', '); +} + +export function validateControllerBindings( + controller: Controller, + variables: PlantVariable[] +): string | null { + if (controller.inputVariableIds.length === 0) { + return `O controlador "${controller.name}" precisa de pelo menos uma variavel de entrada.`; + } + + if (controller.outputVariableIds.length === 0) { + return `O controlador "${controller.name}" precisa de pelo menos uma variavel de saida.`; + } + + const variableMap = buildVariableMap(variables); + + for (const inputId of controller.inputVariableIds) { + const variable = variableMap.get(inputId); + if (!variable) { + return `O controlador "${controller.name}" referencia uma variavel de entrada invalida.`; + } + + if (variable.type !== 'sensor') { + return `A variavel "${variable.name}" nao pode ser usada como entrada do controlador "${controller.name}".`; + } + } + + for (const outputId of controller.outputVariableIds) { + const variable = variableMap.get(outputId); + if (!variable) { + return `O controlador "${controller.name}" referencia uma variavel de saida invalida.`; + } + + if (variable.type !== 'atuador') { + return `A variavel "${variable.name}" nao pode ser usada como saida do controlador "${controller.name}".`; + } + } + + return null; +} + +export function getControllerActivationConflict( + controller: Controller, + controllers: Controller[], + variables: PlantVariable[] +): string | null { + const bindingError = validateControllerBindings(controller, variables); + if (bindingError) { + return bindingError; + } + + const conflictingOutputs = controllers + .filter((entry) => entry.id !== controller.id && entry.active) + .flatMap((entry) => + entry.outputVariableIds.filter((outputId) => controller.outputVariableIds.includes(outputId)) + ); + + if (conflictingOutputs.length === 0) { + return null; + } + + const uniqueOutputIds = Array.from(new Set(conflictingOutputs)); + return `Ja existe um controlador ativo para o(s) atuador(es): ${formatVariableNames(uniqueOutputIds, variables)}.`; +} + +export function validateControllersForPlant( + controllers: Controller[], + variables: PlantVariable[] +): string | null { + for (const controller of controllers) { + const bindingError = validateControllerBindings(controller, variables); + if (bindingError) { + return bindingError; + } + } + + for (const controller of controllers) { + if (!controller.active) { + continue; + } + + const conflict = getControllerActivationConflict(controller, controllers, variables); + if (conflict) { + return conflict; + } + } + + return null; +} diff --git a/apps/desktop/src/lib/utils/format.ts b/apps/desktop/src/lib/utils/format.ts new file mode 100644 index 0000000..f1d3159 --- /dev/null +++ b/apps/desktop/src/lib/utils/format.ts @@ -0,0 +1,10 @@ +export function formatTime(seconds: number): string { + if (!Number.isFinite(seconds)) return '--:--'; + const m = Math.floor(seconds / 60); + const s = Math.floor(seconds % 60); + return `${m}:${s.toString().padStart(2, '0')}`; +} + +export function generateId(): string { + return Math.random().toString(36).substring(2, 11); +} diff --git a/apps/desktop/src/lib/utils/plantEditor.ts b/apps/desktop/src/lib/utils/plantEditor.ts new file mode 100644 index 0000000..21d2d79 --- /dev/null +++ b/apps/desktop/src/lib/utils/plantEditor.ts @@ -0,0 +1,157 @@ +import type { Controller } from '$lib/types/controller'; +import type { Plant, PlantVariable } from '$lib/types/plant'; +import type { PluginDefinition, PluginInstance, SchemaFieldValue } from '$lib/types/plugin'; + +export function cloneVariable(variable: PlantVariable): PlantVariable { + return { + ...variable, + linkedSensorIds: variable.linkedSensorIds ? [...variable.linkedSensorIds] : undefined, + }; +} + +export function cloneController(controller: Controller): Controller { + return { + ...controller, + inputVariableIds: [...(controller.inputVariableIds ?? [])], + outputVariableIds: [...(controller.outputVariableIds ?? [])], + params: Object.fromEntries( + Object.entries(controller.params ?? {}).map(([key, param]) => [key, { ...param }]) + ), + }; +} + +export function cloneDriver(instance: PluginInstance): PluginInstance { + return { + ...instance, + config: { ...instance.config }, + }; +} + +export function normalizeVariables(nextVariables: PlantVariable[]): PlantVariable[] { + const sensorIdMap = new Map(); + + const normalized = nextVariables.map((variable, index) => { + const nextId = `var_${index}`; + if (variable.type === 'sensor') { + sensorIdMap.set(variable.id, nextId); + } + + return { + ...variable, + id: nextId, + linkedSensorIds: variable.type === 'atuador' ? [...(variable.linkedSensorIds ?? [])] : undefined, + }; + }); + + return normalized.map((variable) => { + if (variable.type !== 'atuador') { + return variable; + } + + const linkedSensorIds = Array.from( + new Set( + (variable.linkedSensorIds ?? []) + .map((sensorId) => sensorIdMap.get(sensorId)) + .filter((sensorId): sensorId is string => !!sensorId) + ) + ); + + return { + ...variable, + linkedSensorIds, + }; + }); +} + +export function buildDriverAutoConfig(currentVariables: PlantVariable[]): Record { + return { + num_sensors: currentVariables.filter((variable) => variable.type === 'sensor').length, + num_actuators: currentVariables.filter((variable) => variable.type === 'atuador').length, + }; +} + +export function syncDriverWithVariables( + instance: PluginInstance, + currentVariables: PlantVariable[] +): PluginInstance { + return { + ...instance, + config: { + ...instance.config, + ...buildDriverAutoConfig(currentVariables), + }, + }; +} + +export function createDriverPlaceholder( + driverId: string, + availablePlugins: PluginDefinition[], + currentVariables: PlantVariable[] +): PluginInstance | null { + const plugin = availablePlugins.find((entry) => entry.id === driverId); + if (!plugin) { + return null; + } + + return { + pluginId: driverId, + pluginName: plugin.name, + pluginKind: plugin.kind, + config: buildDriverAutoConfig(currentVariables), + }; +} + +function areSchemaFieldValuesEqual(left: SchemaFieldValue, right: SchemaFieldValue): boolean { + if (Array.isArray(left) || Array.isArray(right)) { + if (!Array.isArray(left) || !Array.isArray(right) || left.length !== right.length) { + return false; + } + + return left.every((value, index) => areSchemaFieldValuesEqual(value, right[index])); + } + + return left === right; +} + +export function arePluginInstancesEqual(left: PluginInstance, right: PluginInstance): boolean { + if ( + left.pluginId !== right.pluginId || + left.pluginName !== right.pluginName || + left.pluginKind !== right.pluginKind + ) { + return false; + } + + const leftEntries = Object.entries(left.config); + const rightEntries = Object.entries(right.config); + + if (leftEntries.length !== rightEntries.length) { + return false; + } + + return leftEntries.every(([key, value]) => + key in right.config && areSchemaFieldValuesEqual(value, right.config[key]) + ); +} + +export function buildInitialPlantForm( + plant: Plant | null, + availablePlugins: PluginDefinition[], + fallbackVariable: PlantVariable +) { + const nextVariables = normalizeVariables( + (plant?.variables ?? [fallbackVariable]).map(cloneVariable) + ); + + return { + plantName: plant?.name ?? '', + sampleTimeMs: Math.max(1, Math.round(plant?.sampleTimeMs ?? 100)), + variables: nextVariables, + selectedControllers: (plant?.controllers ?? []).map(cloneController), + driverInstance: plant?.driver + ? syncDriverWithVariables(cloneDriver(plant.driver), nextVariables) + : plant?.driverId + ? createDriverPlaceholder(plant.driverId, availablePlugins, nextVariables) + : null, + }; +} diff --git a/apps/desktop/src/lib/utils/plotterSeries.ts b/apps/desktop/src/lib/utils/plotterSeries.ts new file mode 100644 index 0000000..3b40c3f --- /dev/null +++ b/apps/desktop/src/lib/utils/plotterSeries.ts @@ -0,0 +1,109 @@ +import { DEFAULT_LINE_COLORS } from '$lib/types/chart'; +import { getVariableKeys, type Plant, type PlantVariable, type PlantSeriesDescriptor } from '$lib/types/plant'; + +export type SeriesStyle = { + color: string; + visible: boolean; + label: string; +}; + +export type SeriesControl = { + key: string; + label: string; + color: string; + visible: boolean; +}; + +export const ACTUATOR_PALETTE = ['#10b981', '#06b6d4', '#8b5cf6', '#f97316', '#ec4899', '#14b8a6']; + +function getSeriesLabel( + catalogByKey: Map, + key: string, + fallback: string +): string { + return catalogByKey.get(key)?.label ?? fallback; +} + +export function buildSeriesStyles( + plant: Plant, + current: Record, + catalogByKey: Map +): Record { + const next: Record = {}; + let actuatorColorIndex = 0; + + plant.variables.forEach((variable, index) => { + const keys = getVariableKeys(index); + const currentPv = current[keys.pv]; + const currentSp = current[keys.sp]; + + if (variable.type === 'sensor') { + next[keys.pv] = { + color: currentPv?.color ?? DEFAULT_LINE_COLORS.pv, + visible: currentPv?.visible ?? true, + label: getSeriesLabel(catalogByKey, keys.pv, variable.name), + }; + next[keys.sp] = { + color: currentSp?.color ?? DEFAULT_LINE_COLORS.sp, + visible: currentSp?.visible ?? true, + label: 'Setpoint', + }; + return; + } + + next[keys.pv] = { + color: currentPv?.color ?? ACTUATOR_PALETTE[actuatorColorIndex % ACTUATOR_PALETTE.length], + visible: currentPv?.visible ?? true, + label: getSeriesLabel(catalogByKey, keys.pv, variable.name), + }; + actuatorColorIndex += 1; + }); + + return next; +} + +export function buildContextSeriesControls(params: { + plant: Plant; + contextSensor: { variable: PlantVariable; index: number }; + seriesStyles: Record; + catalogByKey: Map; +}): SeriesControl[] { + const { plant, contextSensor, seriesStyles, catalogByKey } = params; + const controls: SeriesControl[] = []; + const sensorKeys = getVariableKeys(contextSensor.index); + + const pvStyle = seriesStyles[sensorKeys.pv]; + const spStyle = seriesStyles[sensorKeys.sp]; + + controls.push({ + key: sensorKeys.pv, + label: pvStyle?.label ?? getSeriesLabel(catalogByKey, sensorKeys.pv, `${contextSensor.variable.name}`), + color: pvStyle?.color ?? DEFAULT_LINE_COLORS.pv, + visible: pvStyle?.visible ?? true, + }); + + controls.push({ + key: sensorKeys.sp, + label: spStyle?.label ?? 'Setpoint', + color: spStyle?.color ?? DEFAULT_LINE_COLORS.sp, + visible: spStyle?.visible ?? true, + }); + + plant.variables.forEach((variable, index) => { + if (variable.type !== 'atuador' || !variable.linkedSensorIds?.includes(contextSensor.variable.id)) { + return; + } + + const actuatorKey = getVariableKeys(index).pv; + const actuatorStyle = seriesStyles[actuatorKey]; + + controls.push({ + key: actuatorKey, + label: actuatorStyle?.label ?? getSeriesLabel(catalogByKey, actuatorKey, variable.name), + color: actuatorStyle?.color ?? DEFAULT_LINE_COLORS.mv, + visible: actuatorStyle?.visible ?? true, + }); + }); + + return controls; +} diff --git a/apps/desktop/src/lib/utils/workspaceStorage.ts b/apps/desktop/src/lib/utils/workspaceStorage.ts new file mode 100644 index 0000000..76011ca --- /dev/null +++ b/apps/desktop/src/lib/utils/workspaceStorage.ts @@ -0,0 +1,43 @@ +function cloneState(state: T): T { + if (typeof structuredClone === 'function') { + return structuredClone(state); + } + + return JSON.parse(JSON.stringify(state)) as T; +} + +function canUseStorage(): boolean { + return typeof window !== 'undefined' && typeof localStorage !== 'undefined'; +} + +export function loadWorkspaceState( + storageKey: string, + fallback: T, + revive: (parsed: unknown, fallback: T) => T +): T { + const fallbackState = cloneState(fallback); + + if (!canUseStorage()) { + return fallbackState; + } + + try { + const raw = localStorage.getItem(storageKey); + if (!raw) { + return fallbackState; + } + + return revive(JSON.parse(raw), fallbackState); + } catch (error) { + console.error(`Erro ao carregar estado local (${storageKey}):`, error); + return fallbackState; + } +} + +export function saveWorkspaceState(storageKey: string, state: T): void { + if (!canUseStorage()) { + return; + } + + localStorage.setItem(storageKey, JSON.stringify(state)); +} diff --git a/apps/desktop/src/routes/+layout.svelte b/apps/desktop/src/routes/+layout.svelte new file mode 100644 index 0000000..7213b34 --- /dev/null +++ b/apps/desktop/src/routes/+layout.svelte @@ -0,0 +1,7 @@ + + +{@render children()} diff --git a/apps/desktop/src/routes/+layout.ts b/apps/desktop/src/routes/+layout.ts new file mode 100644 index 0000000..a3d1578 --- /dev/null +++ b/apps/desktop/src/routes/+layout.ts @@ -0,0 +1 @@ +export const ssr = false; diff --git a/apps/desktop/src/routes/+page.svelte b/apps/desktop/src/routes/+page.svelte new file mode 100644 index 0000000..3989e00 --- /dev/null +++ b/apps/desktop/src/routes/+page.svelte @@ -0,0 +1,119 @@ + + +
+
+ {#if isMobileLayout && mobileSidebarOpen} + + {/if} + + mobileSidebarOpen = false} + onNavigate={() => { + if (isMobileLayout) mobileSidebarOpen = false; + }} + /> + + {#if isMobileLayout} + + {/if} + +
+
+ +
+
+ +
+
+ +
+ + +
+
+
diff --git a/apps/desktop/src/routes/layout.css b/apps/desktop/src/routes/layout.css new file mode 100644 index 0000000..adad3a2 --- /dev/null +++ b/apps/desktop/src/routes/layout.css @@ -0,0 +1,43 @@ +@import 'tailwindcss'; +@plugin '@tailwindcss/forms'; + +@custom-variant dark (&:where(.dark, .dark *)); + +/* Remove spinner arrows from number inputs */ +input[type="number"]::-webkit-outer-spin-button, +input[type="number"]::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} + +input[type="number"] { + -moz-appearance: textfield; +} + +* { + scrollbar-width: thin; + scrollbar-color: rgba(148, 163, 184, 0.55) transparent; +} + +*::-webkit-scrollbar { + width: 10px; + height: 10px; +} + +*::-webkit-scrollbar-track { + background: transparent; +} + +*::-webkit-scrollbar-thumb { + background: rgba(148, 163, 184, 0.35); + border-radius: 999px; + border: 2px solid transparent; + background-clip: padding-box; +} + +*::-webkit-scrollbar-thumb:hover { + background: rgba(100, 116, 139, 0.45); + border: 2px solid transparent; + background-clip: padding-box; +} + diff --git a/apps/desktop/static/favicon.png b/apps/desktop/static/favicon.png new file mode 100644 index 0000000..825b9e6 Binary files /dev/null and b/apps/desktop/static/favicon.png differ diff --git a/apps/desktop/static/svelte.svg b/apps/desktop/static/svelte.svg new file mode 100644 index 0000000..c5e0848 --- /dev/null +++ b/apps/desktop/static/svelte.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/desktop/static/tauri.svg b/apps/desktop/static/tauri.svg new file mode 100644 index 0000000..31b62c9 --- /dev/null +++ b/apps/desktop/static/tauri.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/desktop/static/vite.svg b/apps/desktop/static/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/apps/desktop/static/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/desktop/svelte.config.js b/apps/desktop/svelte.config.js new file mode 100644 index 0000000..a7830ea --- /dev/null +++ b/apps/desktop/svelte.config.js @@ -0,0 +1,18 @@ +// Tauri doesn't have a Node.js server to do proper SSR +// so we use adapter-static with a fallback to index.html to put the site in SPA mode +// See: https://svelte.dev/docs/kit/single-page-apps +// See: https://v2.tauri.app/start/frontend/sveltekit/ for more info +import adapter from "@sveltejs/adapter-static"; +import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + preprocess: vitePreprocess(), + kit: { + adapter: adapter({ + fallback: "index.html", + }), + }, +}; + +export default config; diff --git a/apps/desktop/tailwind.config.js b/apps/desktop/tailwind.config.js new file mode 100644 index 0000000..deb10f1 --- /dev/null +++ b/apps/desktop/tailwind.config.js @@ -0,0 +1,54 @@ +/** @type {import('tailwindcss').Config} */ +export default { + darkMode: 'class', + content: ['./src/**/*.{html,js,svelte,ts}'], + theme: { + extend: { + colors: { + slate: { + 50: '#f8fafc', + 100: '#f1f5f9', + 200: '#e2e8f0', + 300: '#cbd5e1', + 400: '#94a3b8', + 500: '#64748b', + 600: '#475569', + 700: '#334155', + 800: '#1e293b', + 900: '#0f172a' + }, + zinc: { + 50: '#fafafa', + 100: '#f4f4f5', + 200: '#e4e4e7', + 300: '#d4d4d8', + 400: '#a1a1aa', + 500: '#71717a', + 600: '#52525b', + 700: '#3f3f46', + 800: '#27272a', + 900: '#18181b', + 950: '#09090b' + } + }, + fontSize: { + xs: ['12px', '14px'], + sm: ['14px', '20px'], + base: ['16px', '24px'], + lg: ['18px', '28px'], + xl: ['20px', '28px'], + '2xl': ['24px', '32px'], + '3xl': ['30px', '36px'] + }, + spacing: { + xs: '4px', + sm: '8px', + md: '12px', + lg: '16px', + xl: '24px', + '2xl': '32px' + } + } + }, + plugins: [require('@tailwindcss/forms')] +} diff --git a/apps/desktop/tsconfig.json b/apps/desktop/tsconfig.json new file mode 100644 index 0000000..f4d0a0e --- /dev/null +++ b/apps/desktop/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files + // + // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes + // from the referenced tsconfig.json - TypeScript does not merge them in +} diff --git a/apps/desktop/vite.config.js b/apps/desktop/vite.config.js new file mode 100644 index 0000000..be1ad25 --- /dev/null +++ b/apps/desktop/vite.config.js @@ -0,0 +1,29 @@ +import tailwindcss from "@tailwindcss/vite"; +import { defineConfig } from "vite"; +import { sveltekit } from "@sveltejs/kit/vite"; + +// @ts-expect-error process is a nodejs global +const host = process.env.TAURI_DEV_HOST; + +// https://vite.dev/config/ +export default defineConfig(async () => ({ + plugins: [sveltekit(), tailwindcss()], + + // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` + // + // 1. prevent Vite from obscuring rust errors + clearScreen: false, + + // 2. tauri expects a fixed port, fail if that port is not available + server: { + port: 1420, + strictPort: true, + host: host || "127.0.0.1", + hmr: host ? { protocol: "ws", host, port: 1421 } : undefined, + + watch: { + // 3. tell Vite to ignore watching `src-tauri` + ignored: ["**/src-tauri/**"] + } + } +})); diff --git a/controller_framework/__init__.py b/controller_framework/__init__.py deleted file mode 100644 index 7a3e8bb..0000000 --- a/controller_framework/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .core import AppManager -from .core import Controller -from .core import MCUType diff --git a/controller_framework/core/__init__.py b/controller_framework/core/__init__.py deleted file mode 100644 index 3f65af7..0000000 --- a/controller_framework/core/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .app import AppManager -from .controller import Controller -from .mcu_driver import MCUDriver, STM32Driver, RandomDataDriver, MCUType diff --git a/controller_framework/core/app.py b/controller_framework/core/app.py deleted file mode 100644 index 156bbc5..0000000 --- a/controller_framework/core/app.py +++ /dev/null @@ -1,327 +0,0 @@ -from queue import Queue -import random -import threading -import time -from typing import Optional -import colorsys - -from .mcu_driver import MCUDriver, MCUType -from .controller import Controller -from .ipcmanager import IPCManager -from .logmanager import LogManager -from controller_framework.gui import MainGUI - -import multiprocessing as mp - - -class AppManager: - def __init__(self, mcu_type: MCUType, sample_time = 1000, **kwargs): - if not isinstance(mcu_type, MCUType): - raise ValueError(f"MCU inválida: {mcu_type}. Escolha entre {list(MCUType)}") - self.__mcu: MCUDriver = MCUDriver.create_driver(mcu_type, **kwargs) - - self.control_instances: dict[Controller] = {} - self.running_instance: Optional[Controller] = None - - self.sample_time = sample_time # ms - - self.actuator_vars = {} - self.sensor_vars = {} - - self.num_sensors = 0 - self.num_actuators = 0 - - self.__last_read_timestamp = 0 - self.__last_control_timestamp = 0 - - self.reading_buffer_semaphore = threading.Semaphore() - - self.control_dts = list() - self.read_dts = list() - - self.dt = 0 - - self.setpoints = [] - - self.reading_thread = None - self.reading_stop_event = threading.Event() - - self.command_thread = None - self.command_stop_event = threading.Event() - - self.gui = None - - self.reading_buffer = Queue() - - self.queue_to_gui = mp.Queue() - self.queue_from_gui = mp.Queue() - self.data_updated = False - self.ipcmanager = IPCManager(self, self.queue_to_gui, self.queue_from_gui) - - self.color_index = 0 - - self.log_manager = LogManager('APP') - self.log = self.log_manager.get_logger(component='APP') - - def __getstate__(self): - state = self.__dict__.copy() - - del state['reading_buffer_semaphore'] - del state['reading_stop_event'] - del state['command_stop_event'] - del state['reading_thread'] - del state['command_thread'] - del state['reading_buffer'] - del state['ipcmanager'] - del state['_AppManager__mcu'] - - state['mcu_config'] = { - 'mcu_type': self.__mcu.mcu_type.name, - 'kwargs': self.__mcu.kwargs, - } - - return state - - def __setstate__(self, state): - self.__dict__.update(state) - - self.reading_buffer_semaphore = threading.Semaphore() - self.reading_stop_event = threading.Event() - self.command_stop_event = threading.Event() - self.reading_thread = None - self.command_thread = None - self.reading_buffer = Queue() - self.ipcmanager = IPCManager(self, self.queue_to_gui, self.queue_from_gui) - - mcu_config = state.pop('mcu_config') - self.__mcu = MCUDriver.create_driver( - MCUType[mcu_config['mcu_type']], - **mcu_config['kwargs'], - ) - - def __read_values(self): - self.log.info('started', extra={'method': 'read'}) - now = time.perf_counter() - target_dt_s = self.sample_time / 1000.0 - next_read_time = now + target_dt_s - - while not self.reading_stop_event.is_set(): - elapsed = 0 - control_elapsed = 0 - read_elapsed = 0 - feedback_elapsed = 0 - - now = time.perf_counter() - - dt_s = now - self.__last_read_timestamp if self.__last_read_timestamp != 0 else target_dt_s - dt_ms = dt_s * 1000.0 - self.read_dts.append(dt_s) - - read_start = time.perf_counter() - try: - self.last_timestamp = now - sensor_values, actuator_values = self.__mcu.read() - self.data_updated = True - - self.update_actuator_vars(actuator_values) - self.update_sensors_vars(sensor_values) - - except Exception as e: - self.log.error("Erro ao ler dados dos sensores: %s", e, extra={'method':'read'}) - read_elapsed = (time.perf_counter() - read_start) * 1e3 - - if self.running_instance is not None: - control_start = time.perf_counter() - self.__control() - control_elapsed = (time.perf_counter() - control_start) * 1e3 - - feedback_start = time.perf_counter() - self.__feedback() - feedback_elapsed = (time.perf_counter() - feedback_start) * 1e3 - - self.__last_read_timestamp = now - - elapsed = (time.perf_counter() - now) * 1e3 - sleep_time = next_read_time - time.perf_counter() - - self.log.info( - "\ndt: %8.3f ms | all elapsed: %8.3f ms | sleep time: %8.3f ms\n" - "read elapsed: %8.3f ms | control elapsed: %8.3f ms | feedback elapsed: %8.3f ms", - dt_ms, elapsed, sleep_time * 1e3, read_elapsed, control_elapsed, feedback_elapsed, - extra={'method': 'read'} - ) - - if sleep_time > 0: - time.sleep(sleep_time) - else: - self.log.warning("Leitura atrasada.", extra={'method': 'read'}) - next_read_time = time.perf_counter() - - next_read_time += target_dt_s - - def __feedback(self): - self.__mcu.send(*self.running_instance.actuator_values) - - def __control(self): - now = time.perf_counter() - dt = now - self.__last_control_timestamp if self.__last_control_timestamp != 0 else 0 - self.dt = dt * 1e3 - - self.running_instance.set_dt(dt) - self.running_instance.actuator_values = self.get_actuator_values() - self.running_instance.sensor_values = self.get_sensor_values() - - control_done = threading.Event() - control_result = [self.running_instance.actuator_values] - - def run_control(): - try: - result = self.running_instance.control() - control_result[0] = result - finally: - control_done.set() - - thread = threading.Thread(target=run_control, daemon=True) - thread.start() - - start_time = time.perf_counter() - while thread.is_alive(): - elapsed = time.perf_counter() - start_time - if elapsed >= (self.sample_time / 1000.0) * 0.9: - self.log.warning('Controle demorou demais, usando valor anterior', extra={'method':'control'}) - break - time.sleep(0.01) - - if control_done.is_set(): - self.running_instance.actuator_values = control_result[0] - self.__last_control_timestamp = time.perf_counter() - - def __connect(self): - self.__mcu.connect() - - def init(self): - self.log.info("Try connect mcu", extra={'method':'init'}) - self.__connect() - - self.reading_thread = threading.Thread(target=self.__read_values, daemon=True) - self.reading_thread.start() - - time.sleep(1) - self.ipcmanager.init() - - # self.command_thread = threading.Thread(target=self.__read_command, daemon=True) - # self.command_thread.start() - - self.gui_process = mp.Process(target=MainGUI.start_gui, args=(self,)) - self.gui_process.start() - self.gui_process.join() - - self.reading_stop_event.set() - self.reading_thread.join() - - self.ipcmanager.stop() - - # self.command_stop_event.set() - # self.command_thread.join() - - def start_controller(self, label): - if label in self.control_instances: - if self.running_instance != None: - self.stop_controller() - - try: - self.log.info("Start controller: %s", label, extra={'method':'start control'}) - self.running_instance = self.control_instances[label] - self.update_setpoint(self.running_instance.setpoints) - except Exception as e: - self.log.error("Erro ao inicializar controle: %s", e, extra={'method':'start control'}) - - def stop_controller(self): - if self.running_instance is not None: - self.log.info("Stop controller: %s", self.running_instance.label, extra={'method':'stop control'}) - self.running_instance = None - - def append_instance(self, instance: Controller): - self.control_instances[instance.label] = instance - - def list_instances(self): - return list(self.control_instances.keys()) - - def get_instance(self, label): - if(label in self.control_instances): - return self.control_instances[label] - else: - return None - - def get_setpoint(self): - if len(self.setpoints) == 0: - return 0 - - return self.setpoints - - def update_setpoint(self, setpoints): - tam = min(self.num_sensors, len(setpoints)) - self.setpoints[:tam] = map(float, setpoints[:tam]) - - if self.running_instance != None: - self.running_instance.setpoints = self.setpoints - - if "setpoints" in self.running_instance.configurable_vars: - self.running_instance.configurable_vars["setpoints"]["value"] = setpoints - - def get_var_values(self, var_dict): - values = [] - - for var_name in var_dict: - var_value = var_dict[var_name]['value'] - values.append(var_value) - - return values - - def _random_color(self): - n = 12 - hue = (self.color_index / n) % 1.0 - self.color_index += 2 - - r, g, b = colorsys.hsv_to_rgb(hue, 0.9, 0.9) - return '#{:02X}{:02X}{:02X}'.format(int(r*255), int(g*255), int(b*255)) - - def __set_var(self, var_dict, *args): - for var in args: - var_name, var_unit, var_type = var - - var_dict[var_name] = { - "type": var_type, - "value": 0, - "unit": var_unit, - "color": self._random_color() - } - - def set_actuator_vars(self, *args): - self.num_actuators += len(args) - self.__set_var(self.actuator_vars, *args) - - def set_sensor_vars(self, *args): - self.num_sensors += len(args) - self.__set_var(self.sensor_vars, *args) - - def get_actuator_values(self): - return self.get_var_values(self.actuator_vars) - - def get_sensor_values(self): - return self.get_var_values(self.sensor_vars) - - def __update_var(self, var_dict, new_values): - for (var_name, value) in zip(var_dict, new_values): - expected_type = var_dict[var_name]['type'] - - if not isinstance(value, expected_type): - raise TypeError(f"Variável '{var_name}' espera tipo {expected_type.__name__}, recebeu {type(value).__name__}") - - var_dict[var_name]['value'] = value - - def update_actuator_vars(self, new_values): - self.__update_var(self.actuator_vars, new_values) - - def update_sensors_vars(self, new_values): - self.__update_var(self.sensor_vars, new_values) \ No newline at end of file diff --git a/controller_framework/core/controller.py b/controller_framework/core/controller.py deleted file mode 100644 index 934562a..0000000 --- a/controller_framework/core/controller.py +++ /dev/null @@ -1,86 +0,0 @@ -from abc import ABC, abstractmethod -import ast - -from .logmanager import LogManager - -class Controller(ABC): - def __init__(self, label:str, setpoints:list): - self.log_manager = LogManager('Controller') - self.log = self.log_manager.get_logger(component='CONTROLLER') - - self.dt = 0 - - self.configurable_vars = {} - - self.setpoints = setpoints - self.sensor_values = [] - self.actuator_values = [] - self.set_config_variable(("setpoints", list)) - - self.label = label - - def __getstate__(self): - state = { - 'label': self.label, - 'setpoints': self.setpoints, - 'dt': self.dt, - 'configurable_vars': self.configurable_vars, - 'sensor_values': self.sensor_values, - 'actuator_values': self.actuator_values, - } - return state - - def __setstate__(self, state): - self.label = state['label'] - self.setpoints = state['setpoints'] - self.dt = state['dt'] - self.configurable_vars = state['configurable_vars'] - self.sensor_values = state.get('sensor_values', []) - self.actuator_values = state.get('actuator_values', []) - - self.log_manager = LogManager('Controller') - self.log = self.log_manager.get_logger(component='CONTROLLER') - - @abstractmethod - def control(self): - pass - - def set_dt(self, dt): - self.dt = dt - - def __set_var(self, var_dict, *args): - for var in args: - var_name, var_type = var - - if hasattr(self, var_name): - current_value = getattr(self, var_name) - - var_dict[var_name] = { - "value": current_value, - "type": var_type - } - else: - raise Exception(f"[ERRO] Variável '{var_name}' não encontrada em {self.__class__.__name__}.") - - def set_config_variable(self, *args): - self.__set_var(self.configurable_vars, *args) - - def update_variable(self, var_name, new_value): - if var_name in self.configurable_vars: - var_type = self.configurable_vars[var_name]["type"] - - try: - if var_name == 'setpoints': - casted_value = ast.literal_eval(new_value) - casted_value = [float(x) for x in casted_value] - else: - casted_value = var_type(new_value) - - setattr(self, var_name, casted_value) - self.configurable_vars[var_name]["value"] = casted_value - except ValueError: - self.log.error("Valor inválido para '%s'. Esperado %s, recebido '%s'", - var_name, var_type.__name__, new_value, extra={'method':'update var'} - ) - else: - self.log.error("Variável '%s' não está registrada como configurável.", var_name, extra={'method':'update var'}) diff --git a/controller_framework/core/ipcmanager.py b/controller_framework/core/ipcmanager.py deleted file mode 100644 index 8d7b108..0000000 --- a/controller_framework/core/ipcmanager.py +++ /dev/null @@ -1,139 +0,0 @@ -import logging -import multiprocessing as mp -from queue import Empty -import threading -import time - -from .logmanager import LogManager - -# { -# "type": "update_variable", -# "payload": { -# "var_name": "setpoint", -# "new_value": 52.5 -# } -# } - - -class IPCManager: - def __init__(self, app_manager, queue_to_gui, queue_from_gui): - from controller_framework.core import AppManager - - assert isinstance(app_manager, AppManager) - self.core = app_manager - - self.log_manager = LogManager('IPC', logging.DEBUG) - self.log = self.log_manager.get_logger(component='IPC') - - self.tx_queue: mp.Queue = queue_to_gui - self.rx_queue: mp.Queue = queue_from_gui - - self.thread: threading.Thread = None - self.stop_event = threading.Event() - - self.command_registry = { - "update_variable": self.handler_update_variable, - "stop_controller": lambda core, _: core.stop_controller(), - "start_controller": self.handler_start_control, - "update_setpoint": self.handler_update_setpoint, - } - - def __run(self): - self.log.info('started', extra={'method':'run'}) - while not self.stop_event.is_set(): - self.__parse_command() - - if self.core.data_updated: - self.__send_full_state() - self.core.data_updated = False - - time.sleep(0.1) - - def init(self): - self.thread = threading.Thread(target=self.__run) - self.thread.start() - - def stop(self): - self.stop_event.set() - self.thread.join() - - def __send(self, command, payload): - data = {"type": command, "payload": payload} - - self.tx_queue.put(data) - - def __send_full_state(self): - command = "full_state" - payload = { - "sensors": self.core.get_sensor_values(), - "actuators": self.core.get_actuator_values(), - "setpoints": self.core.setpoints, - "running_instance": self.core.running_instance, - "control_instances": self.core.control_instances, - "last_timestamp": self.core.last_timestamp, - } - - self.__send( - command, payload - ) - - def __parse_command(self): - try: - data = self.rx_queue.get_nowait() - command = data.get("type") - payload = data.get("payload", {}) - self.log.debug("%s recebido com payload: %s", command, payload, extra={'method':'parse'}) - - if not command: - self.log.warning("Comando sem 'type'. Ignorado.", extra={'method':'parse'}) - return - - handler = self.command_registry.get(command) - if not handler: - self.log.warning("Comando '%s' não registrado.", command, extra={'method':'parse'}) - return - - handler(self.core, payload) - - except Empty: - pass - except ValueError as e: - self.log.error("Erro de validação: %s", e, extra={'method':'parse'}) - except Exception as e: - self.log.error("[IPC] Erro ao executar comando '%s': %s", command, e, extra={'method':'parse'}) - self.log.debug("[IPC] Dados recebidos: %s", data, extra={'method':'parse'}) - - def handler_update_variable(self, core, payload): - control_name = payload.get("control_name") - var_name = payload.get("var_name") - new_value = payload.get("new_value") - - if not all([control_name, var_name]): - raise ValueError("[IPC] update_variable exige 'control_name' e 'var_name'") - - instance = core.get_instance(control_name) - instance.update_variable(var_name, new_value) - - def handler_start_control(self, core, payload): - control_name = payload.get("control_name") - - if not control_name: - raise ValueError("[IPC] start_control exige 'control_name'") - - if not isinstance(control_name, str): - raise ValueError("[IPC] 'control_name' para start_control deve ser str") - - core.start_controller(control_name) - - def handler_update_setpoint(self, core, payload): - value = payload.get("value") - - if not value: - raise ValueError("[IPC] update_setpoint exige 'value'") - - if not isinstance(value, (list)): - raise ValueError( - "[IPC] 'value' para 'update_setpoint' deve ser int ou float" - ) - - core.update_setpoint(value) diff --git a/controller_framework/core/logmanager.py b/controller_framework/core/logmanager.py deleted file mode 100644 index 1663ed8..0000000 --- a/controller_framework/core/logmanager.py +++ /dev/null @@ -1,69 +0,0 @@ -import logging - -class ColorLevelFormatter(logging.Formatter): - COLORS = { - 'DEBUG': "\033[90m", # cinza escuro - 'INFO': "\033[92m", # verde brilhante - 'WARNING': "\033[93m", # amarelo brilhante - 'ERROR': "\033[1;31m", # vermelho em negrito - 'CRITICAL': "\033[97;41m", # branco em fundo vermelho - } - RESET = "\033[0m" - BRIGHT_WHITE = "\033[97m" - - def format(self, record): - orig_level = record.levelname - orig_prefix = getattr(record, 'prefix', None) - - color = self.COLORS.get(orig_level, self.RESET) - record.levelname = f"{color}{orig_level}{self.RESET}" - - component = getattr(record, 'component', None) - method = getattr(record, 'method', None) - if component and method: - p = f"[{component}:{method}]" - elif component: - p = f"[{component}]" - else: - p = "" - record.prefix = (f"{self.BRIGHT_WHITE}{p}{self.RESET} " if p else "") - - formatted = super().format(record) - - record.levelname = orig_level - if orig_prefix is not None: - record.prefix = orig_prefix - else: - delattr(record, 'prefix') - - return formatted - - -class ContextLoggerAdapter(logging.LoggerAdapter): - def process(self, msg, kwargs): - call_extra = kwargs.get('extra', {}) - merged = {**self.extra, **call_extra} - kwargs['extra'] = merged - return msg, kwargs - - -class LogManager: - def __init__(self, name=__name__, level=logging.INFO): - self.logger = logging.getLogger(name) - self.logger.setLevel(level) - - self.logger.propagate = False - - if not self.logger.handlers: - ch = logging.StreamHandler() - fmt = '%(asctime)s - %(levelname)s - %(prefix)s%(message)s' - ch.setFormatter(ColorLevelFormatter(fmt)) - self.logger.addHandler(ch) - - def get_logger(self, component: str = None, method: str = None): - extra = {} - if component: - extra['component'] = component - if method: - extra['method'] = method - return ContextLoggerAdapter(self.logger, extra) \ No newline at end of file diff --git a/controller_framework/core/mcu_driver.py b/controller_framework/core/mcu_driver.py deleted file mode 100644 index 45166d7..0000000 --- a/controller_framework/core/mcu_driver.py +++ /dev/null @@ -1,160 +0,0 @@ -from abc import ABC, abstractmethod -from enum import Enum -import random -import struct -import time -import numpy as np -import serial -from pyocd.core.helpers import ConnectHelper, Session - -from .logmanager import LogManager - - -class MCUType(Enum): - STM32 = "STM32" - RDATA = "RDATA" - TCLAB = "TCLAB" - - -class MCUDriver(ABC): - def __init__(self, mcu_type, **kwargs): - self.mcu_type: MCUType = mcu_type - self.kwargs = kwargs - - self.log_manager = LogManager('MCUDriver') - self.log = self.log_manager.get_logger(component='MCU') - - @abstractmethod - def send(self, *args): - pass - - @abstractmethod - def read(self): - pass - - @abstractmethod - def connect(self): - pass - - @staticmethod - def create_driver(mcu_type: MCUType, **kwargs): - driver_map = { - MCUType.RDATA: RandomDataDriver, - MCUType.STM32: STM32Driver, - MCUType.TCLAB: TCLABDriver - } - - if mcu_type not in driver_map: - raise ValueError(f"MCU não suportada: {mcu_type}") - - return driver_map[mcu_type](mcu_type, **kwargs) - - -class STM32Driver(MCUDriver): - def __init__(self, mcu_type, **kwargs): - super().__init__(mcu_type, **kwargs) - - self.control_block_addr = 0x0 - self.ram = None - self.ser: Session | None = None - - def send(self, *outs): - for i, out in enumerate(outs): - data_bytes = struct.pack(" float: - data_bytes = struct.pack(" 0: - self.variable_list.setCurrentRow(0) - self.analyze_button.setEnabled(True) - else: - self.analyze_button.setEnabled(False) - - def start_analysis(self): - mode = "closed" if self.radio_closed.isChecked() else "open" - selected_var = self.variable_list.selectedItems()[0]\ - .text()\ - .lower()\ - .replace(' ', '_') - - self.parent_gui.start_analysis(self.selected_file, selected_var, mode) - - -class PlotterAnalyzer(QWidget): - def __init__(self, parent): - super().__init__(parent) - self.parent = parent - self.layout = QVBoxLayout() - self.setLayout(self.layout) - - self.plot_widget: PlotWidget = PlotWidget(self.layout) - - self.df = None - self.x_data = [] - self.y_data = [] - self.reference_lines = [] - - def update_analyzer(self, x_data, y_data, mode): - self.x_data = x_data - self.y_data = y_data - - if mode == "closed": - self.plot_widget.closed_loop_plot() - self.closed_loop_analyzer() - elif mode == "open": - self.plot_widget.open_loop_plot() - self.open_loop_analyzer() - - def closed_loop_analyzer(self): - self.plot_widget.marker_closed.set_data(self.x_data, self.y_data) - self.plot_widget.add_curve(self.x_data, self.y_data, 'blue', 1.5, 0) - self.plot_widget.add_legend(text="Temperatura", color= 'blue') - - temp_inicial = self.y_data[0] - h_line_init = pg.InfiniteLine(pos=temp_inicial, angle=0, pen=pg.mkPen("green", width=2, style=pg.QtCore.Qt.DashLine)) - self.plot_widget.add_item(h_line_init) - self.reference_lines.append(h_line_init) - - max_over_signal = np.max(self.y_data) - h_line_max = pg.InfiniteLine(pos=max_over_signal, angle=0, pen=pg.mkPen("red", width=2, style=pg.QtCore.Qt.DashLine)) - self.plot_widget.add_item(h_line_max) - self.reference_lines.append(h_line_max) - - self.plot_widget.add_legend(text=f"Temperatura inicial ({temp_inicial:.2f}ºC)", color= "green", style=pg.QtCore.Qt.DashLine) - self.plot_widget.add_legend(text=f"Máximo Sobressinal ({max_over_signal:.2f}ºC)", color= "red", style=pg.QtCore.Qt.DashLine) - - targets = np.array(self.parent.df["target"]) - label_targets = "" - last_target = targets[0] - 1 - for t in targets: - if last_target != t: - last_target = t - label_targets += f"{t}ºC, " - label_targets = label_targets[:-2] - - self.plot_widget.add_legend(text=f"Temperaturas desejadas\n[{label_targets}]", color="orange") - self.plot_widget.add_curve(self.x_data, targets, 'orange', 1) - - def open_loop_analyzer(self): - x = self.x_data - temps = self.y_data - - f_temps = np.array(sig.savgol_filter(temps, int(len(x) * 0.02), 6)) - f_temps_dt = np.gradient(f_temps, x, edge_order=1) - - max_dv_i = np.argmax(f_temps_dt) - self.y_data = f_temps - self.x_data = x - - self.plot_widget.marker_temp.set_data(self.x_data, self.y_data) - self.plot_widget.marker_derivative.set_data(self.x_data, f_temps_dt) - - self.plot_widget.add_curve(x, f_temps, 'blue', 1.5, 0) - self.plot_widget.add_curve(x, f_temps_dt, 'blue', 1.5, 1) - - h_line_max = pg.InfiniteLine(pos=x[max_dv_i], angle=90, pen=pg.mkPen("red", width=2, style=pg.QtCore.Qt.DashLine)) - - self.plot_widget.add_item(h_line_max, 1) - - L = x[max_dv_i] - ((f_temps[max_dv_i] - f_temps[0]) / f_temps_dt[max_dv_i]) - T = ((f_temps[-1] - f_temps[0]) / f_temps_dt[max_dv_i]) - - neighborhood = np.linspace(L, T + L) - max_dv_scarter = pg.ScatterPlotItem(size=5, brush=pg.mkBrush("r"), pen=pg.mkPen(None), symbol='o') - max_dv_scarter.setData(pos=[(x[max_dv_i], f_temps[max_dv_i])]) - - self.plot_widget.add_curve(neighborhood, - [(((x0 - x[max_dv_i]) * f_temps_dt[max_dv_i]) + f_temps[max_dv_i]) for x0 in neighborhood], - 'red') - - v_initial_line = pg.InfiniteLine(pos=x[0], angle=90, pen=pg.mkPen("black", width=2, style=pg.QtCore.Qt.DashLine)) - h_initial_line = pg.InfiniteLine(pos=f_temps[0], angle=0, pen=pg.mkPen("black", width=2, style=pg.QtCore.Qt.DashLine)) - - v_final_line = pg.InfiniteLine(pos=x[-1], angle=90, pen=pg.mkPen("black", width=2, style=pg.QtCore.Qt.DashLine)) - h_final_line = pg.InfiniteLine(pos=f_temps[-1], angle=0, pen=pg.mkPen("black", width=2, style=pg.QtCore.Qt.DashLine)) - - self.plot_widget.add_item(max_dv_scarter, 0) - self.plot_widget.add_item(h_initial_line, 0) - self.plot_widget.add_item(v_initial_line, 0) - self.plot_widget.add_item(v_final_line, 0) - self.plot_widget.add_item(h_final_line, 0) - - self.plot_widget.add_legend(text='Temperatura (ºC)', color='blue', plot_n=0) - self.plot_widget.add_legend(text='Ponto de maior derivada', color='red', style='dot', plot_n=0) - self.plot_widget.add_legend(text=f'Temperatura inicial ({f_temps[0]:.3f}ºC)', color='black', style=pg.QtCore.Qt.DashLine, plot_n=0) - self.plot_widget.add_legend(text=f'Temperatura final ({f_temps[-1]:.3f}ºC)', color='black', style=pg.QtCore.Qt.DashLine, plot_n=0) - - self.plot_widget.plot_temp.setTitle(f"Temperatura registrada - L = {L:.2f}, T (+L) = {T:.2f} (+{L:.2f})") - -class AnalyzerGUI(QWidget): - def __init__(self, app_mirror): - super().__init__() - self.app_mirror = app_mirror - self.selected_file = None - - self.setWindowTitle("Thermal Analyzer") - self.setMinimumSize(900, 600) - - self.layout = QHBoxLayout() - self.setLayout(self.layout) - - self.sidebar = SidebarAnalyzer(self) - self.plotter_gui = PlotterAnalyzer(self) - - self.layout.addWidget(self.sidebar, 1) - self.layout.addWidget(self.plotter_gui, 4) - - def start_analysis(self, file_path, sensor_variable, mode): - if file_path: - self.mode = mode - self.df = pd.read_csv(file_path) - x_data = [float(row["seconds"]) - self.df.iloc[0]["seconds"] for _, row in self.df.iterrows()] - #temps = (self.df["temp_a"] + self.df["temp_b"]) / 2 - temps = self.df[sensor_variable] - - if mode == "open": - temps = np.array(sig.savgol_filter(temps, int(len(x_data) * 0.02), 6)) - - self.plotter_gui.update_analyzer(x_data=x_data, y_data=temps, mode=mode) diff --git a/controller_framework/gui/main_gui.py b/controller_framework/gui/main_gui.py deleted file mode 100644 index 9e39cf8..0000000 --- a/controller_framework/gui/main_gui.py +++ /dev/null @@ -1,102 +0,0 @@ -import logging -import sys - -from PySide6 import QtCore -from PySide6.QtWidgets import QTabWidget, QApplication, QMainWindow - -from controller_framework.core.logmanager import LogManager - -from .plotter_gui import PlotterGUI -from .analyzer_gui import AnalyzerGUI - - -class MainGUI(QMainWindow): - def __init__(self, app_mirror): - super().__init__() - - from controller_framework.core import AppManager - assert isinstance(app_mirror, AppManager) - self.app_mirror = app_mirror - - self.log_manager = LogManager('MainGUI', logging.DEBUG) - self.log = self.log_manager.get_logger(component='MainGUI') - - self.setWindowTitle("Control System GUI") - self.setGeometry(100, 100, 1200, 800) - - self.tabs = QTabWidget() - self.setCentralWidget(self.tabs) - - self.plotter_gui = PlotterGUI(app_mirror=self.app_mirror) - self.analyzer_gui = AnalyzerGUI(app_mirror=self.app_mirror) - - self.tabs.addTab(self.plotter_gui, "PLOTTER") - self.tabs.addTab(self.analyzer_gui, "ANALYZER") - self.tabs.currentChanged.connect(self.on_tab_changed) - - self.hide_mode = False - - self.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) - self.installEventFilter(self) - - self.plotter_gui.command_triggered.connect(self.send_command) - - def eventFilter(self, obj, event): - if event.type() == QtCore.QEvent.Type.KeyPress: - if event.key() == QtCore.Qt.Key.Key_F: - self.toggle_hide_mode() - elif event.key() == QtCore.Qt.Key.Key_Escape: - sys.exit(0) - return True - return super().eventFilter(obj, event) - - @staticmethod - def start_gui(app_mirror): - app = QApplication(sys.argv) - window = MainGUI(app_mirror) - window.showFullScreen() - sys.exit(app.exec()) - - def key_press_handle(self, super_press_handler, ev): - if ev.key() == QtCore.Qt.Key_Escape: - sys.exit(0) - elif ev.key() == QtCore.Qt.Key_F or ev.key() == 16777216: - self.toggle_hide_mode() - - def toggle_hide_mode(self): - if self.hide_mode: - if self.tabs.currentIndex() == 0: - self.plotter_gui.sidebar.show() - self.plotter_gui.layout.insertWidget(0, self.plotter_gui.sidebar, 1) - self.plotter_gui.layout.setStretchFactor(self.plotter_gui.sidebar, 1) - self.plotter_gui.layout.setStretchFactor( - self.plotter_gui.plotter_gui, 4 - ) - elif self.tabs.currentIndex() == 1: - self.analyzer_gui.sidebar.show() - self.analyzer_gui.layout.insertWidget(0, self.analyzer_gui.sidebar, 1) - self.analyzer_gui.layout.setStretchFactor(self.analyzer_gui.sidebar, 1) - self.analyzer_gui.layout.setStretchFactor( - self.analyzer_gui.plotter_gui, 4 - ) - else: - if self.tabs.currentIndex() == 0: - self.plotter_gui.sidebar.hide() - self.analyzer_gui.layout.setStretchFactor(self.plotter_gui, 5) - elif self.tabs.currentIndex() == 1: - self.analyzer_gui.sidebar.hide() - self.analyzer_gui.layout.setStretchFactor(self.analyzer_gui, 5) - self.hide_mode = not self.hide_mode - - def on_tab_changed(self, index): - self.plotter_gui.toggle_select(index == 0) - - @QtCore.Slot(str, object) - def send_command(self, command, value): - data = { - "type": command, - "payload": value - } - - self.app_mirror.queue_from_gui.put(data) - self.log.debug(f"Enviou '{command}' com valor {value} para o [APP]", extra={'method':'send command'}) \ No newline at end of file diff --git a/controller_framework/gui/plotter_gui.py b/controller_framework/gui/plotter_gui.py deleted file mode 100644 index c4e960b..0000000 --- a/controller_framework/gui/plotter_gui.py +++ /dev/null @@ -1,476 +0,0 @@ -from collections.abc import Callable -from functools import partial -import logging -import os -import queue -from typing import Optional - -from controller_framework.core.controller import Controller -import numpy as np -import pandas as pd - -from PySide6 import QtCore -from PySide6.QtWidgets import ( QGroupBox, QFormLayout, QVBoxLayout, QWidget, QLabel, QScrollArea, - QPushButton, QHBoxLayout, QLineEdit, QGraphicsProxyWidget, QListWidget, QCheckBox ) - -import re - -from controller_framework.core.logmanager import LogManager - -from .utils_gui import PlotWidget, Mode - -class ControlGUI(QWidget): - def __init__(self, *, parent, app_mirror, x_label: str, y_label: str): - super().__init__(parent) - - self.parent = parent - - from controller_framework.core import AppManager - assert isinstance(app_mirror, AppManager) - self.app_mirror = app_mirror - - self.fullscreen = False - - self.init_timestamp = None - self.plot_seconds = [] - self.actuator_data = [[] for _ in range(self.app_mirror.num_actuators)] - self.sensor_data = [[] for _ in range(self.app_mirror.num_sensors)] - - self.sensor_labels = [chr(ord("A")+i) for i in range(self.app_mirror.num_sensors)] - - self.plot_views = ["ALL"] + self.sensor_labels - self.current_mode = -1 - - self.layout = QVBoxLayout() - self.setLayout(self.layout) - - self.container = QWidget() - self.container_layout = QVBoxLayout() - self.container.setLayout(self.container_layout) - - self.plot_widget = PlotWidget(self.container_layout, Mode.PLOTTER) - # self.plot_widget.plotter_plot() - self.toggle_plot_view() - - self.temp_input = QLineEdit() - self.temp_input.setPlaceholderText("Defina os setpoints desejados [separados por vírgulas ou espaços]") - self.temp_input.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) - self.container_layout.addWidget(self.temp_input) - - self.temp_input.returnPressed.connect(self.__on_return_pressed) - self.layout.addWidget(self.container) - - self.container.keyPressEvent = partial(self.key_press_handle, self.container.keyPressEvent) - - log_path = "./temp_logs/" - if not os.path.exists(log_path): - os.makedirs(log_path) - self.parent.log.debug("Salvando dados em %s", log_path, extra={'method':'init'}) - - datetime = pd.Timestamp.now() - sensor_columns = [f"sensor_{i}" for i in range(self.app_mirror.num_sensors)] - actuator_columns = [f"actuator_{i}" for i in range(self.app_mirror.num_actuators)] - - columns = ["timestamp", "seconds"] + sensor_columns + actuator_columns + ["target"] - - self.df = pd.DataFrame(columns=columns) - - self.log_file_path = log_path + f"log_{datetime.year}-{datetime.month}-{datetime.day}-{datetime.hour}-{datetime.minute}-{datetime.second}.csv" - self.df.to_csv(self.log_file_path, index=False) - - self.update_delay = 100 - self.plot_timer = QtCore.QTimer() - self.plot_timer.timeout.connect(self.update_data) - self.plot_timer.start(self.update_delay) - - self.is_selected = True - - def __on_return_pressed(self): - setpoint_string = self.temp_input.text() - self.temp_input.clear() - - setpoint = re.split(r'[,\s]+', setpoint_string.strip()) - - self.app_mirror.update_setpoint(setpoint) - - self.parent.command_triggered.emit("update_setpoint", {"value": setpoint}) - - def update_setpoint_label(self): - self.current_setpoint_line.setValue(self.app_mirror.get_setpoint()) - self.current_setpoint_line.label.setText(f"Temperatura desejada [{self.app_mirror.get_setpoint()}°C]") - self.current_setpoint_line.update() - - def __retrieve_message(self, timeout: float = 0.01) -> Optional[dict]: - try: - return self.app_mirror.queue_to_gui.get(timeout=timeout) - except queue.Empty: - return None - - def __process_message(self, data): - command = data.get('type') - payload = data.get('payload') - - if command == "full_state": - sensors = payload.get('sensors') - actuators = payload.get('actuators') - setpoints = payload.get('setpoints') - running_instance = payload.get('running_instance') - control_instances_data = payload.get('control_instances') - last_timestamp = payload.get('last_timestamp') - - if self.init_timestamp is None: - self.init_timestamp = last_timestamp - self.last_timestamp = last_timestamp - - self.app_mirror.running_instance = running_instance - self.app_mirror.control_instances = control_instances_data - self.app_mirror.update_sensors_vars(sensors) - self.app_mirror.update_actuator_vars(actuators) - self.app_mirror.update_setpoint(setpoints) - - return True - else: - return False - - def __append_plot_data(self, sensor_values, actuator_values): - self.plot_seconds.append(self.last_timestamp - self.init_timestamp) - - for lista, value in zip(self.sensor_data, sensor_values): - lista.append(value) - - for lista, value in zip(self.actuator_data, actuator_values): - lista.append(value) - - def __write_csv(self, sensor_values, actuator_values): - target_str = '"' + " ".join(map(str, self.app_mirror.setpoints)) + '"' - row = { - "timestamp": self.last_timestamp, - "seconds": f"{self.plot_seconds[-1]:.4f}", - - **{f"sensor_{i}": f"{sensor_values[i]:.4f}" - for i in range(self.app_mirror.num_sensors)}, - - **{f"actuator_{i}": f"{actuator_values[i]:.4f}" - for i in range(self.app_mirror.num_actuators)}, - - "target": target_str - } - - with open(self.log_file_path, "a") as f: - data = ",".join(map(str, row.values())) + "\n" - f.write(data) - - def update_data(self): - data = self.__retrieve_message() - if data is None: - return - - if not self.__process_message(data): - return - - sensor_values = self.app_mirror.get_sensor_values() - actuator_values = self.app_mirror.get_actuator_values() - - self.__append_plot_data(sensor_values, actuator_values) - - if self.is_selected: - self.update_plots() - - self.__write_csv(sensor_values, actuator_values) - - def update_plots(self): - view = self.plot_views[self.current_mode] - plot_seconds = np.array(self.plot_seconds) - - match view: - case "ALL": - for (i, sensor_data), (var_name, props) in zip(enumerate(self.sensor_data), self.app_mirror.sensor_vars.items()): - np_sensor_data = np.array(sensor_data) - self.plot_widget.update_curve(plot_seconds, np_sensor_data, 0, i) - - legenda = f'{var_name}: {np_sensor_data[-1]:.4f} {props['unit']}' - self.plot_widget.update_legend(text=legenda, plot_n=0, idx=i) - for (i, actuator_data), (var_name, props) in zip(enumerate(self.actuator_data), self.app_mirror.actuator_vars.items()): - np_actuator_data = np.array(actuator_data) - self.plot_widget.update_curve(plot_seconds, np_actuator_data, 1, i) - - legenda = f'{var_name}: {np_actuator_data[-1]:.4f} {props['unit']}' - self.plot_widget.update_legend(text=legenda, plot_n=1, idx=i) - - case _ if view in self.sensor_labels: - letters = self.sensor_labels - idx = letters.index(view) - - sensor_data = np.array(self.sensor_data[idx]) - self.plot_widget.update_curve(plot_seconds, sensor_data, plot_n=0, curve_n=0) - - var_name, props = list(self.app_mirror.sensor_vars.items())[idx] - legenda = f'{var_name}: {sensor_data[-1]:.4f} {props['unit']}' - self.plot_widget.update_legend(text=legenda, plot_n=0, idx=0) - case _: - self.parent.log.warning("Visualização '%s' não reconhecida.", view, extra={'method':'update plot'}) - - def toggle_plot_view(self): - self.current_mode = (self.current_mode + 1) % len(self.plot_views) - view = self.plot_views[self.current_mode] - - self.plot_widget.clear() - - match view: - case "ALL": - self.plot_widget.plotter_dual_plot('Sensors', 'Actuators') - - for i, (var_name, props) in enumerate(self.app_mirror.sensor_vars.items()): - self.plot_widget.add_curve([0], [0], color=props['color'], plot_n=0) - self.plot_widget.add_legend(text=var_name, color=props['color'], plot_n=0) - - for i, (var_name, props) in enumerate(self.app_mirror.actuator_vars.items()): - self.plot_widget.add_curve([0], [0], color=props['color'], plot_n=1) - self.plot_widget.add_legend(text=var_name, color=props['color'], plot_n=1) - - case _ if view in self.sensor_labels: - idx = self.sensor_labels.index(view) - var_name, props = list(self.app_mirror.sensor_vars.items())[idx] - - self.plot_widget.plotter_single_plot(var_name) - self.plot_widget.add_curve([0], [0], color=props['color']) - self.plot_widget.add_legend(text=var_name, color=props['color'], plot_n=0) - - case _: - self.parent.log.warning("Visualização '%s' não reconhecida.", view, extra={'method':'toggle plot'}) - - def reset_data(self): - self.plot_seconds = [] - self.actuator_data = [[] for _ in range(self.app_mirror.num_actuators)] - self.sensor_data = [[] for _ in range(self.app_mirror.num_sensors)] - self.init_timestamp = None - - self.df = pd.DataFrame(columns=self.df.columns) - self.df.to_csv(self.log_file_path, index=False) - - def key_press_handle(self, super_press_handler: Callable, ev): - if self.temp_input.hasFocus(): - super_press_handler(ev) - else: - if ev.key() == QtCore.Qt.Key.Key_Space: - self.toggle_plot_view() - elif ev.key() == QtCore.Qt.Key.Key_E: - self.reset_data() - elif ev.key() == QtCore.Qt.Key.Key_Escape: - super_press_handler(ev) - elif ev.key() == QtCore.Qt.Key.Key_F: - super_press_handler(ev) - - -class SidebarGUI(QWidget): - def __init__(self, parent, app_mirror, control_gui): - super().__init__(parent) - - from controller_framework.core import AppManager - assert isinstance(app_mirror, AppManager) - self.app_mirror = app_mirror - - self.parent = parent - - self.control_gui = control_gui - self.current_control = None - self.input_fields = {} - - self.layout = QVBoxLayout() - self.setLayout(self.layout) - - self.controls_group = QGroupBox("Controles Disponíveis") - self.controls_layout = QVBoxLayout() - self.controls_group.setLayout(self.controls_layout) - - self.control_list = QListWidget() - self.controls_layout.addWidget(self.control_list) - - self.btn_activate_control = QPushButton("Ativar Controle") - self.btn_activate_control.clicked.connect(self.activate_control) - - self.btn_deactivate_control = QPushButton("Desativar Controle") - self.btn_deactivate_control.clicked.connect(self.deactivate_control) - self.btn_deactivate_control.setEnabled(False) - - self.layout.addWidget(self.controls_group) - - self.hbox = QHBoxLayout() - self.hbox.addWidget(self.btn_activate_control) - self.hbox.addWidget(self.btn_deactivate_control) - - self.layout.addLayout(self.hbox) - - self.settings_group = QGroupBox("Configurações do Controle") - self.settings_group.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) - self.settings_layout = QFormLayout() - self.settings_group.setLayout(self.settings_layout) - - self.scroll_area = QScrollArea() - self.scroll_area.setWidgetResizable(True) - self.scroll_area.setFixedHeight(300) - self.scroll_area.setWidget(self.settings_group) - - self.btn_update_settings = QPushButton("Atualizar Configurações") - self.layout.addWidget(self.scroll_area) - self.layout.addWidget(self.btn_update_settings) - - self.control_list.itemSelectionChanged.connect(self.update_config_fields) - self.btn_update_settings.clicked.connect(self.update_control_settings) - - self.controls_group.setStyleSheet("QGroupBox { font-size: 16px; font-weight: bold; }") - self.settings_group.setStyleSheet("QGroupBox { font-size: 16px; font-weight: bold; }") - self.control_list.setStyleSheet("QListWidget { font-size: 14px; }") - - btn_label_style = "QPushButton { font-size: 14px; }" - self.btn_activate_control.setStyleSheet(btn_label_style) - self.btn_deactivate_control.setStyleSheet(btn_label_style) - self.btn_update_settings.setStyleSheet(btn_label_style) - - self.scroll_area.setStyleSheet(""" - QScrollBar:vertical { - background: white; - width: 10px; - } - QScrollBar:horizontal { - background: white; - height: 10px; - } - QScrollBar::handle:vertical { - background: #f0f0f0; - } - QScrollBar::handle:horizontal { - background: #f0f0f0; - } - """) - - self.update_control_list() - - def update_control_list(self): - self.control_list.clear() - for control_name in self.app_mirror.list_instances(): - self.control_list.addItem(control_name) - - def update_config_fields(self): - selected_item = self.control_list.currentItem() - - if selected_item: - control_name = selected_item.text() - self.current_control:Controller = self.app_mirror.control_instances[control_name] - - for i in reversed(range(self.settings_layout.count())): - self.settings_layout.itemAt(i).widget().deleteLater() - self.input_fields.clear() - - for var_name, var_data in self.current_control.configurable_vars.items(): - value = var_data['value'] - var_type = var_data['type'] - - label = QLabel(f"{var_name}") - label.setStyleSheet("QLabel { font-size: 14px; }") - - if var_type == bool: - input_field = QCheckBox() - input_field.setChecked(bool(value)) - input_field.setStyleSheet("QCheckBox { font-size: 14px; }") - else: - input_field = QLineEdit() - input_field.setText(str(value)) - input_field.setStyleSheet("QLineEdit { font-size: 14px; }") - - self.settings_layout.addRow(label, input_field) - - self.input_fields[var_name] = input_field - - self.settings_group.setTitle(f"Configurações de {control_name}") - - def update_control_settings(self): - if self.current_control: - for var_name, widget in self.input_fields.items(): - try: - if isinstance(widget, QCheckBox): - new_value = widget.isChecked() - elif isinstance(widget, QLineEdit): - new_value = widget.text() - else: - continue - - self.current_control.update_variable(var_name, new_value) - - command = "update_variable" - payload = { - "control_name": self.current_control.label, - "var_name": var_name, - "new_value": new_value - } - - self.parent.command_triggered.emit(command, payload) - - except ValueError: - self.parent.log.error("Entrada inválida para '%s'", var_name, extra={'method':'update control'}) - - if(self.app_mirror.running_instance and self.app_mirror.running_instance.label == self.current_control.label): - self.app_mirror.update_setpoint(self.current_control.setpoints) - self.parent.command_triggered.emit("update_setpoint", {"value": self.current_control.setpoints}) - - def activate_control(self): - current_control = self.control_list.currentItem() - - if(current_control != None): - current_control_label = current_control.text() - self.app_mirror.update_setpoint(self.current_control.setpoints) - - self.app_mirror.running_instance = self.app_mirror.get_instance(current_control_label) - self.parent.command_triggered.emit("start_controller", {"control_name": current_control_label}) - self.parent.command_triggered.emit("update_setpoint", {"value": self.current_control.setpoints}) - - # self.control_gui.update_setpoint_label() - - self.btn_deactivate_control.setEnabled(True) - - def deactivate_control(self): - self.app_mirror.stop_controller() - self.parent.command_triggered.emit("stop_controller", {}) - - self.btn_deactivate_control.setEnabled(False) - - -class PlotterGUI(QWidget): - command_triggered = QtCore.Signal(str, object) - - def __init__(self, app_mirror): - super().__init__() - - from controller_framework.core import AppManager - assert isinstance(app_mirror, AppManager) - self.app_mirror = app_mirror - - self.log_manager = LogManager('Plotter', logging.DEBUG) - self.log = self.log_manager.get_logger(component='PLOTTER') - - self.layout = QHBoxLayout() - self.setLayout(self.layout) - - self.plotter_gui = ControlGUI(parent=self, app_mirror=self.app_mirror, x_label="Tempo decorrido (s)", y_label="Temperatura (°C)") - self.sidebar = SidebarGUI(parent=self, app_mirror=self.app_mirror, control_gui=self.plotter_gui) - - self.layout.addWidget(self.sidebar, 1) - self.layout.addWidget(self.plotter_gui, 4) - - self.hide_mode = False - - def toggle_hide_mode(self): - if self.hide_mode: - self.sidebar.show() - self.layout.insertWidget(0, self.sidebar, 1) - self.layout.setStretchFactor(self.sidebar, 1) - self.layout.setStretchFactor(self.plotter_gui, 4) - else: - self.sidebar.hide() - self.layout.setStretchFactor(self, 5) - - self.hide_mode = not self.hide_mode - - def toggle_select(self, param): - self.plotter_gui.is_selected = param - diff --git a/controller_framework/gui/utils_gui.py b/controller_framework/gui/utils_gui.py deleted file mode 100644 index 7869376..0000000 --- a/controller_framework/gui/utils_gui.py +++ /dev/null @@ -1,179 +0,0 @@ -from enum import Enum -import numpy as np -import pyqtgraph as pg -from PySide6 import QtCore - -class MarkerPlot: - def __init__(self, plot, x_data=None, y_data=None, threshold=10): - self.plot = plot - self.x_data = np.array(x_data, dtype=np.float64) if x_data is not None else np.array([]) - self.y_data = np.array(y_data, dtype=np.float64) if y_data is not None else np.array([]) - self.threshold = threshold - - self.marker = pg.ScatterPlotItem(size=5, brush=pg.mkBrush("r"), pen=pg.mkPen(None), symbol='o') - self.marker.setZValue(10) - self.marker.setData([], []) - self.plot.addItem(self.marker) - - self.plot.scene().sigMouseMoved.connect(self.on_mouse_moved) - - def set_data(self, x_data, y_data): - self.x_data = np.array(x_data, dtype=np.float64) - self.y_data = np.array(y_data, dtype=np.float64) - - def on_mouse_moved(self, event): - if self.x_data.size == 0: - return - - pos = self.plot.vb.mapSceneToView(event) - idx = np.abs(self.x_data - pos.x()).argmin() - x_val, y_val = self.x_data[idx], self.y_data[idx] - dist = np.hypot(pos.x() - x_val, pos.y() - y_val) * 100 - - if dist > self.threshold: - self.marker.setData([], []) - self.marker.setToolTip('') - return - - self.marker.setData([x_val], [y_val]) - tooltip = f"Tempo: {x_val:.4f}s\nTemp: {y_val:.4f}°C" - self.marker.setToolTip(tooltip) - -class Mode(Enum): - CLOSED = 'closed' - OPEN = 'open' - PLOTTER = 'plotter' - -class PlotWidget: - def __init__(self, layout, mode: int = None): - self.plot_widget = pg.GraphicsLayoutWidget() - self.plot_widget.setBackground('w') - layout.addWidget(self.plot_widget) - self.mode = mode - self._init_containers() - - def _init_containers(self): - # Initialize curves and legends storage based on modes - self._curves = { - Mode.CLOSED: [], - Mode.OPEN: {0: [], 1: []}, - Mode.PLOTTER: {0: [], 1: []} - } - self._legends = {0: [], 1: []} - - def clear(self): - # Clear all plots, curves, and legends - curves = self._curves.get(self.mode) - if isinstance(curves, dict): - for lst in curves.values(): - lst.clear() - else: - curves.clear() - for lst in self._legends.values(): - lst.clear() - self.plot_widget.clear() - - def _get_plot_and_containers(self, plot_n: int = 0): - if self.mode == Mode.CLOSED: - return self.plot, self._curves[Mode.CLOSED], self._legends[plot_n] - if self.mode == Mode.OPEN: - key = 0 if plot_n == 0 else 1 - plot = self.plot_temp if key == 0 else self.plot_derivative - return plot, self._curves[Mode.OPEN][key], self._legends[plot_n] - if self.mode == Mode.PLOTTER: - plot = self.plot_sensor if plot_n == 0 else self.plot_actuators - return plot, self._curves[Mode.PLOTTER][plot_n], self._legends[plot_n] - raise ValueError(f"Invalid mode: {self.mode}") - - def add_curve(self, x, y, color='black', width=1.5, plot_n: int = 0): - if x is None or y is None: - return - plot, curves, _ = self._get_plot_and_containers(plot_n) - curve = plot.plot(x, y, pen=pg.mkPen(color, width=width)) - curves.append(curve) - - def update_curve(self, x, y, plot_n: int, curve_n: int): - if x is None or y is None: - return - _, curves, _ = self._get_plot_and_containers(plot_n) - curves[curve_n].setData(x, y) - - def clear_plots(self, plot_n: int = 0): - plot, curves, _ = self._get_plot_and_containers(plot_n) - plot.clear() - curves.clear() - - def add_legend(self, text: str = '', size: int = 11, - color: str = 'black', style=pg.QtCore.Qt.SolidLine, plot_n: int = 0): - if not text: - return - plot, _, legends = self._get_plot_and_containers(plot_n) - legend = plot.addLegend(labelTextSize=str(size)) - if style != 'dot': - item = plot.plot([], [], pen=pg.mkPen(color, width=3, style=style)) - else: - item = pg.ScatterPlotItem(size=3, brush=pg.mkBrush(color), pen=None, symbol='o') - legend.addItem(item, text) - legends.append((legend, item)) - - def update_legend(self, text: str, idx: int, plot_n: int = 0): - _, _, legends = self._get_plot_and_containers(plot_n) - legend, item = legends[idx] - label = legend.getLabel(item) - label.setText(text) - - def add_item(self, item, plot_n: int = 0): - if item is None: - return - plot, _, _ = self._get_plot_and_containers(plot_n) - plot.addItem(item) - - def closed_loop_plot(self): - self.mode = Mode.CLOSED - self.clear() - self.plot = self.plot_widget.addPlot(title='Análise de Malha Fechada') - self._setup_plot(self.plot) - self.marker_closed = MarkerPlot(self.plot) - - def open_loop_plot(self): - self.mode = Mode.OPEN - self.clear() - self.plot_temp = self.plot_widget.addPlot(row=0, col=0, title='Análise de Malha Aberta') - self.plot_derivative = self.plot_widget.addPlot(row=1, col=0, title='Derivada dT/t') - self._setup_plot(self.plot_temp) - self._setup_plot(self.plot_derivative) - self.marker_temp = MarkerPlot(self.plot_temp) - self.marker_derivative = MarkerPlot(self.plot_derivative) - - def plotter_plot(self): - self.mode = Mode.PLOTTER - - def plotter_dual_plot(self, legend_1: str = '', legend_2: str = ''): - self.mode = Mode.PLOTTER - self.plot_sensor = self._init_subplot(0, title=legend_1) - self.plot_actuators = self._init_subplot(1, title=legend_2) - - def plotter_single_plot(self, legend_1: str = ''): - self.mode = Mode.PLOTTER - self.plot_sensor = self._init_subplot(0, title=legend_1) - - def _init_subplot(self, row: int, title: str): - plot = self.plot_widget.addPlot(row=row, col=0, title=title) - self._setup_plot(plot) - return plot - - def _setup_plot(self, plot): - if self.mode == Mode.PLOTTER: - self.plot_widget.setBackground('k') - text_pen = pg.mkPen('w') - else: - text_pen = pg.mkPen('k') - - plot.showGrid(x=True, y=True, alpha=0.2) - - for axis in ('left', 'bottom'): - ax = plot.getAxis(axis) - ax.setPen(text_pen) - ax.setTextPen(text_pen) - - plot.setLabel('bottom', 'Tempo', units='s', **{'color': text_pen.color().name()}) \ No newline at end of file diff --git a/controller_framework/tests/core/unit/test_class_app.py b/controller_framework/tests/core/unit/test_class_app.py deleted file mode 100644 index 4842fb7..0000000 --- a/controller_framework/tests/core/unit/test_class_app.py +++ /dev/null @@ -1,113 +0,0 @@ -import pytest - -from controller_framework.core import (AppManager, MCUType) - -@pytest.fixture -def app(): - return AppManager(mcu_type=MCUType.RDATA, sample_time=1000, port="COM1", baud_rate=14000) - -class TestAppClass: - @pytest.mark.parametrize( - "setter, attr_name, entries", - [ - ("set_actuator_vars", "actuator_vars", - [("Act 1", "%", float), ("Act 2", "V", int), ("Act 3", "", bool)]), - ("set_sensor_vars", "sensor_vars", - [("Sensor 1", "ºC", float), ("Sensor 2", "V", float), ("Sensor 3", "A", float)]), - ], - ) - def test_set_vars(self, app, monkeypatch, setter, attr_name, entries): - """ Ensure that setter initialize actuator_vars and sensors_vars with the correct data """ - - monkeypatch.setattr(app, "_random_color", lambda: "#ABC123") - - getattr(app, setter)(*entries) - - result = getattr(app, attr_name) - expected = { - name: {"type": typ, "value": 0, "unit": unit, "color": "#ABC123"} - for name, unit, typ in entries - } - - assert result == expected - - @pytest.mark.parametrize( - "setter, update_method, attr_name, entries, new_values, expected_values", - [ - ( - "set_actuator_vars", - "update_actuator_vars", - "actuator_vars", - [("A1", "%", float), ("A2", "V", int), ("A3", "", bool)], - (1.23, 7, True), - {"A1": 1.23, "A2": 7, "A3": True}, - ), - ( - "set_sensor_vars", - "update_sensors_vars", - "sensor_vars", - [("S1", "ºC", float), ("S2", "V", float), ("S3", "A", float)], - (25.0, 12.7, 3.3), - {"S1": 25.0, "S2": 12.7, "S3": 3.3}, - ), - ], - ) - def test_update_vars_success(self, app, setter, update_method, attr_name, entries, new_values, expected_values,): - """ Ensure that the update methods update actuator_vars and sensor_vars with correct new values """ - - getattr(app, setter)(*entries) - getattr(app, update_method)(new_values) - - result = getattr(app, attr_name) - for name, expected in expected_values.items(): - assert result[name]["value"] == pytest.approx(expected) - - @pytest.mark.parametrize( - "setter, update_method, entries, bad_values, expected_type_name", - [ - ("set_actuator_vars", "update_actuator_vars", [("A", "", int)], ("oops",), "int"), - ("set_sensor_vars", "update_sensors_vars", [("S", "", bool)], ("oops",), "bool"), - ], - ) - def test_update_vars_type_error(self, app, setter, update_method, entries, bad_values, expected_type_name): - """Ensure that the update methods raise a TypeError when called with values of the wrong type.""" - - getattr(app, setter)(*entries) - - with pytest.raises(TypeError) as exc: - getattr(app, update_method)(*bad_values) - - assert expected_type_name in str(exc.value) - - @pytest.mark.parametrize( - "setter, getter, updater, entries, new_values, expected_values", - [ - ( - "set_actuator_vars", - "get_actuator_values", - "update_actuator_vars", - [("A1", "%", float), ("A2", "V", int), ("A3", "", bool)], - (1.23, 7, True), - [1.23, 7, True] - ), - ( - "set_sensor_vars", - "get_sensor_values", - "update_sensors_vars", - [("S1", "ºC", float), ("S2", "V", float), ("S3", "A", float)], - (25.0, 12.7, 3.3), - [25.0, 12.7, 3.3] - ) - ], - ) - def test_get_vars_values(self, app, setter, getter, updater, - entries, new_values, expected_values): - """ Ensure that the getter methods return the correct values """ - - getattr(app, setter)(*entries) - getattr(app, updater)(new_values) - - result = getattr(app, getter)() - - assert result == expected_values - \ No newline at end of file diff --git a/crates/supervisor/Cargo.toml b/crates/supervisor/Cargo.toml new file mode 100644 index 0000000..418ce47 --- /dev/null +++ b/crates/supervisor/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "senamby-supervisor" +version = "0.1.0" +edition = "2021" +license = "MIT" +publish = false + +[lib] +path = "src/lib.rs" + +[features] +default = [] + +[dependencies] +serde = { version = "1", features = ["derive"] } +serde_json = "1" +thiserror = "2" +anyhow = "1" +tracing = "0.1" + +[dev-dependencies] +pretty_assertions = "1" diff --git a/crates/supervisor/src/lib.rs b/crates/supervisor/src/lib.rs new file mode 100644 index 0000000..64287bc --- /dev/null +++ b/crates/supervisor/src/lib.rs @@ -0,0 +1 @@ +// senamby-supervisor diff --git a/docs/en/core-concepts.md b/docs/en/core-concepts.md new file mode 100644 index 0000000..53b7d71 --- /dev/null +++ b/docs/en/core-concepts.md @@ -0,0 +1,75 @@ +# Core Concepts + +[![English](https://img.shields.io/badge/Language-English-2563eb?style=for-the-badge)](core-concepts.md) +[![Português](https://img.shields.io/badge/Idioma-Portugu%C3%AAs-16a34a?style=for-the-badge)](../pt-BR/core-concepts.md) + +## Plant + +A plant is the main runtime unit in Senamby. It contains: + +- variables +- one driver configuration +- zero or more controller instances +- sample time and runtime-facing metadata + +## Variable + +A variable describes a signal in the plant. + +- `sensor`: a read value, usually plotted with PV and SP +- `atuador`: an actuator/output value, usually plotted as the manipulated variable + +Each variable has: + +- `id` +- `name` +- `unit` +- `setpoint` +- `pv_min` +- `pv_max` + +## Driver + +A driver plugin is responsible for plant I/O. + +Its public runtime contract receives: + +- `context.config` +- `context.plant` + +It must implement: + +- `connect()` +- `stop()` +- `read()` + +It must also implement `write(outputs)` when active controllers are present. + +## Controller + +A controller plugin computes actuator outputs from the current cycle snapshot. + +Its public runtime contract receives: + +- `context.controller` +- `context.plant` + +Its required method is: + +- `compute(snapshot)` + +## Runtime + +The runtime is created only when a plant is connected. It runs the live cycle: + +`read -> control -> write -> publish` + +The frontend does not execute this loop. It reacts to status and telemetry events emitted by the backend. + +## Workspace + +The workspace is the persistent storage area for: + +- plugins +- plants +- Python environments diff --git a/docs/en/drivers-and-controllers.md b/docs/en/drivers-and-controllers.md new file mode 100644 index 0000000..5a194d4 --- /dev/null +++ b/docs/en/drivers-and-controllers.md @@ -0,0 +1,54 @@ +# Drivers and Controllers + +[![English](https://img.shields.io/badge/Language-English-2563eb?style=for-the-badge)](drivers-and-controllers.md) +[![Português](https://img.shields.io/badge/Idioma-Portugu%C3%AAs-16a34a?style=for-the-badge)](../pt-BR/drivers-and-controllers.md) + +## Driver Plugins + +Drivers connect Senamby to the actual device or simulator. A driver is expected to: + +- read sensors +- optionally read actuator feedback +- write actuator outputs when controllers are active + +Driver configuration comes from the plugin schema and is stored in the plant driver instance. + +## Controller Plugins + +Controllers compute actuator outputs from the current snapshot. A controller instance stores: + +- identity and display name +- input bindings +- output bindings +- parameter values +- runtime status + +## Live Controller Updates + +While a plant is connected, controllers can be added or edited live. + +- if the current Python environment can load the updated set, the runtime hot-swaps the active controller list +- if a new controller requires environment changes, it is saved as `pending_restart` + +## Runtime Status + +Current controller runtime statuses: + +- `synced`: active configuration is already applied to the runtime +- `pending_restart`: configuration is saved, but the current runtime must be reconnected before it can use it + +## Removal Rule + +An active synced controller cannot be removed while it is running. It must be deactivated first. + +## Public Unit Rule + +Controllers and plants should work in the plant's public engineering units. Device-specific raw conversions belong in the driver. + +Example: + +- plant actuator range: `0..100` +- Arduino duty cycle: `0..255` +- controller output: `0..100` +- driver write conversion: `0..100 -> 0..255` +- driver readback conversion: `0..255 -> 0..100` diff --git a/docs/en/getting-started.md b/docs/en/getting-started.md new file mode 100644 index 0000000..f5b85ed --- /dev/null +++ b/docs/en/getting-started.md @@ -0,0 +1,68 @@ +# Getting Started + +[![English](https://img.shields.io/badge/Language-English-2563eb?style=for-the-badge)](getting-started.md) +[![Português](https://img.shields.io/badge/Idioma-Portugu%C3%AAs-16a34a?style=for-the-badge)](../pt-BR/getting-started.md) + +## 1. Run the Desktop App + +If you run Senamby from source, the desktop app lives in `apps/desktop`. The current repository scripts include: + +- `pnpm --dir apps/desktop install` +- `pnpm --dir apps/desktop tauri dev` + +If you run a packaged desktop build, start the application normally from your operating system. + +## 2. Understand the Workspace + +Senamby stores its working files under: + +`Documents/Senamby/workspace` + +The workspace contains: + +- `drivers/` for driver plugins +- `controllers/` for controller plugins +- `plants/` for persisted plant registries +- `envs/` for reused Python environments +- `runtimes/` for connected runtime sessions + +## 3. Load or Create Plugins + +Before a plant can run, it needs at least one driver plugin. You can: + +- create a plugin from the UI +- import a plugin JSON file +- load plugins already saved in the workspace + +## 4. Create or Import a Plant + +You can either: + +- create a new plant in the UI +- import an existing JSON plant file for preview and registration + +Each plant needs: + +- a name +- a sample time +- variables +- a driver instance +- optional controllers + +## 5. Connect the Plant + +When you connect a plant, Senamby: + +- resolves the driver and active controllers +- prepares or reuses a Python environment +- starts the runtime +- begins the `read -> control -> write -> publish` loop + +## 6. Close vs Delete + +- **Close plant**: unloads the plant from the current session and stops the runtime, but keeps the saved plant file +- **Remove plant**: unloads the plant and deletes its saved registry from the workspace + +## 7. Reopen Behavior + +Plants are not auto-loaded on application startup. A closed plant comes back only when you import or open it again. diff --git a/docs/en/index.md b/docs/en/index.md new file mode 100644 index 0000000..3f5a274 --- /dev/null +++ b/docs/en/index.md @@ -0,0 +1,44 @@ +# Senamby Documentation + +[![English](https://img.shields.io/badge/Language-English-2563eb?style=for-the-badge)](index.md) +[![Português](https://img.shields.io/badge/Idioma-Portugu%C3%AAs-16a34a?style=for-the-badge)](../pt-BR/index.md) + +## Overview + +Senamby is a desktop application for operating plants through reusable plugins. A plant combines: + +- sensors +- actuators +- one driver plugin +- zero or more controller plugins + +The application lets you define the plant model, connect it to a runtime, plot values in real time, and import/export JSON-based artifacts. + +## Who This Is For + +- operators configuring plants and running experiments +- integrators building driver plugins for devices and protocols +- control engineers creating controller plugins and bindings + +## Documentation Map + +- [Getting Started](getting-started.md) +- [Core Concepts](core-concepts.md) +- [Plants](plants.md) +- [Drivers and Controllers](drivers-and-controllers.md) +- [Plugin File Format](plugin-file-format.md) +- [Runtime Behavior](runtime-behavior.md) +- [Troubleshooting](troubleshooting.md) + +## Main Workflows + +1. Load or create the plugins your plant needs +2. Create a plant or import a plant JSON file +3. Configure variables, driver settings, and controller bindings +4. Connect the plant to start the runtime +5. Adjust setpoints and controller configuration while monitoring the plots + +## Language + +- English: [index.md](index.md) +- Português (Brasil): [../pt-BR/index.md](../pt-BR/index.md) diff --git a/docs/en/plants.md b/docs/en/plants.md new file mode 100644 index 0000000..bfc9d65 --- /dev/null +++ b/docs/en/plants.md @@ -0,0 +1,100 @@ +# Plants + +[![English](https://img.shields.io/badge/Language-English-2563eb?style=for-the-badge)](plants.md) +[![Português](https://img.shields.io/badge/Idioma-Portugu%C3%AAs-16a34a?style=for-the-badge)](../pt-BR/plants.md) + +## Creating a Plant + +When creating a plant, define: + +- plant name +- sample time in milliseconds +- sensor and actuator variables +- a driver plugin instance +- optional controller instances + +Each actuator can be linked to one or more sensors for UI and control binding purposes. + +## Importing a Plant + +Senamby supports opening a JSON file for preview before import. After import: + +- the plant is registered in the workspace +- the imported data and stats are available for inspection +- plugins referenced by the plant are reconciled against the current workspace when possible + +## Basic Plant Payload + +A persisted plant registry uses this basic shape: + +```json +{ + "id": "plant_123", + "name": "Oven 1", + "sample_time_ms": 1000, + "variables": [ + { + "id": "var_0", + "name": "Temperature", + "type": "sensor", + "unit": "C", + "setpoint": 50.0, + "pv_min": 0.0, + "pv_max": 100.0 + }, + { + "id": "var_1", + "name": "Heater 1", + "type": "atuador", + "unit": "%", + "setpoint": 0.0, + "pv_min": 0.0, + "pv_max": 100.0 + } + ], + "driver": { + "plugin_id": "plugin_driver", + "config": { + "port": "/dev/ttyACM0" + } + }, + "controllers": [] +} +``` + +## Connecting a Plant + +Connecting a plant starts the runtime and live telemetry. During connect, Senamby: + +- validates the driver and active controllers +- resolves plugin files from the workspace +- prepares the Python environment +- sends the bootstrap to the Python runner + +## Pause and Resume + +Pause and resume are visual session actions. The runtime keeps collecting and controlling in the background while the UI accumulates backlog. On resume, the queued telemetry is plotted. + +## Closing a Plant + +Closing a plant: + +- stops the runtime if it is connected +- unloads the plant from the current session +- keeps the persisted plant file + +Important reopen rule: + +- when a closed plant is reopened, controller instances start inactive + +## Removing a Plant + +Removing a plant: + +- stops the runtime if needed +- unloads the plant from the session +- deletes the saved plant registry from the workspace + +## Setpoints + +Setpoints are saved to the plant registry and, when the plant is connected, pushed to the running runtime. diff --git a/docs/en/plugin-file-format.md b/docs/en/plugin-file-format.md new file mode 100644 index 0000000..52ecf93 --- /dev/null +++ b/docs/en/plugin-file-format.md @@ -0,0 +1,112 @@ +# Plugin File Format + +[![English](https://img.shields.io/badge/Language-English-2563eb?style=for-the-badge)](plugin-file-format.md) +[![Português](https://img.shields.io/badge/Idioma-Portugu%C3%AAs-16a34a?style=for-the-badge)](../pt-BR/plugin-file-format.md) + +## Plugin JSON + +Senamby accepts plugin JSON files with this basic shape: + +```json +{ + "name": "My Driver", + "kind": "driver", + "runtime": "python", + "entryClass": "MyDriver", + "sourceFile": "main.py", + "schema": [ + { + "name": "port", + "type": "string", + "description": "Serial port" + } + ], + "dependencies": [ + { + "name": "pyserial", + "version": "" + } + ] +} +``` + +Supported plugin kinds: + +- `driver` +- `controller` + +Supported schema field types: + +- `bool` +- `int` +- `float` +- `string` +- `list` + +## Driver Python Contract + +```python +class MyDriver: + def __init__(self, context): + self.context = context + + def connect(self) -> bool: + return True + + def stop(self) -> bool: + return True + + def read(self) -> dict[str, dict[str, float]]: + return { + "sensors": {"var_0": 0.0}, + "actuators": {"var_2": 0.0} + } + + def write(self, outputs: dict[str, float]) -> bool: + return True +``` + +Driver runtime context exposes only: + +- `context.config` +- `context.plant` + +## Controller Python Contract + +```python +class MyController: + def __init__(self, context): + self.context = context + + def compute(self, snapshot: dict[str, object]) -> dict[str, float]: + return { + actuator_id: 0.0 + for actuator_id in self.context.controller.output_variable_ids + } +``` + +Controller runtime context exposes only: + +- `context.controller` +- `context.plant` + +## Snapshot Basics + +The controller `compute()` snapshot includes: + +- `dt_s` +- `setpoints` +- `sensors` +- `actuators` +- `controller` + +## Public Units vs Device Units + +Plant variables define public units and limits. Drivers are the right place for raw-device conversion. + +Example: + +- public actuator range: `0..100` +- device duty cycle: `0..255` +- `write()` converts public output to raw device output +- `read()` converts raw device feedback back to public units diff --git a/docs/en/runtime-behavior.md b/docs/en/runtime-behavior.md new file mode 100644 index 0000000..90a3b49 --- /dev/null +++ b/docs/en/runtime-behavior.md @@ -0,0 +1,46 @@ +# Runtime Behavior + +[![English](https://img.shields.io/badge/Language-English-2563eb?style=for-the-badge)](runtime-behavior.md) +[![Português](https://img.shields.io/badge/Idioma-Portugu%C3%AAs-16a34a?style=for-the-badge)](../pt-BR/runtime-behavior.md) + +## Connect Flow + +When a plant connects, the backend: + +1. resolves the saved driver and active controllers +2. refreshes plugin metadata from the workspace when needed +3. prepares the Python environment +4. builds a compact bootstrap payload +5. starts the Python runner + +## Live Runtime Rules + +- the runtime exists only while the plant is connected +- plants are not auto-loaded on startup +- controllers can be hot-updated while connected +- some controller changes may require reconnect and become `pending_restart` + +## Pause Backlog + +Pause does not stop the runtime loop. The frontend stops plotting temporarily and accumulates telemetry backlog. On resume, the queued telemetry is replayed into the charts. + +## Telemetry and Plotting + +The backend emits flat `plant://telemetry` events to the frontend. + +For actuator plots, the current frontend plotting rule is based on actuator readback from the runtime telemetry, not on the raw write command payload. + +## Runtime Folders + +Persistent workspace data lives under: + +- `drivers/` +- `controllers/` +- `plants/` +- `envs/` + +Connected runtime sessions also use: + +- `runtimes//bootstrap.json` + +The Python runner script is written once under the runtime root and reused across runtime sessions. diff --git a/docs/en/troubleshooting.md b/docs/en/troubleshooting.md new file mode 100644 index 0000000..8c04ad9 --- /dev/null +++ b/docs/en/troubleshooting.md @@ -0,0 +1,54 @@ +# Troubleshooting + +[![English](https://img.shields.io/badge/Language-English-2563eb?style=for-the-badge)](troubleshooting.md) +[![Português](https://img.shields.io/badge/Idioma-Portugu%C3%AAs-16a34a?style=for-the-badge)](../pt-BR/troubleshooting.md) + +## Plugin Not Found + +Symptoms: + +- connect fails +- a plant opens but cannot run + +What to check: + +- the plugin exists in the workspace +- the plugin `id` or name still matches the plant +- the plugin source file and registry were not deleted manually + +## Controller Pending Restart + +Meaning: + +- the controller was saved +- the current runtime environment cannot apply it immediately + +Fix: + +- reconnect the plant to rebuild the runtime with the updated plugin set + +## Cannot Remove Active Controller + +If a controller is active and synced in a running plant, removal is blocked. + +Fix: + +1. deactivate the controller +2. save the plant/controller configuration +3. remove the controller + +## Python Dependency Problems + +If a runtime cannot start because of Python dependencies: + +- verify the driver/controller dependency list +- reconnect the plant after fixing the plugin definition +- inspect the generated environment under `Documents/Senamby/workspace/envs/` + +## Closed vs Deleted Plant + +If a plant disappears from the session: + +- it may only have been closed, not deleted +- closed plants remain saved and can be imported/opened again +- deleted plants remove the persisted registry from the workspace diff --git a/docs/pt-BR/core-concepts.md b/docs/pt-BR/core-concepts.md new file mode 100644 index 0000000..bbcea88 --- /dev/null +++ b/docs/pt-BR/core-concepts.md @@ -0,0 +1,77 @@ +# Conceitos Centrais + +[![English](https://img.shields.io/badge/Language-English-2563eb?style=for-the-badge)](../en/core-concepts.md) +[![Português](https://img.shields.io/badge/Idioma-Portugu%C3%AAs-16a34a?style=for-the-badge)](core-concepts.md) + +## Planta + +Uma planta é a unidade principal de execução no Senamby. Ela contém: + +- variáveis +- uma configuração de driver +- zero ou mais instâncias de controlador +- tempo de amostragem e metadados de runtime + +## Variável + +Uma variável descreve um sinal da planta. + +- `sensor`: valor lido, normalmente plotado com PV e SP +- `atuador`: valor de saída, normalmente plotado como variável manipulada + +Cada variável possui: + +- `id` +- `name` +- `unit` +- `setpoint` +- `pv_min` +- `pv_max` + +## Driver + +Um driver é o plugin responsável pelo I/O da planta. + +O contrato público dele recebe: + +- `context.config` +- `context.plant` + +Métodos obrigatórios: + +- `connect()` +- `stop()` +- `read()` + +`write(outputs)` passa a ser obrigatório quando houver controladores ativos. + +## Controlador + +Um controlador calcula saídas de atuador a partir do snapshot do ciclo atual. + +O contrato público dele recebe: + +- `context.controller` +- `context.plant` + +Método obrigatório: + +- `compute(snapshot)` + +## Runtime + +A runtime só existe quando a planta está conectada. Ela executa: + +`read -> control -> write -> publish` + +O frontend não roda esse loop; ele apenas reage a eventos de status e telemetria emitidos pelo backend. + +## Workspace + +O workspace é a área persistente de armazenamento para: + +- plugins +- plantas +- ambientes Python + +O `PlantStore` representa apenas as plantas carregadas na sessão atual. Plantas persistidas no disco não são reabertas automaticamente. diff --git a/docs/pt-BR/drivers-and-controllers.md b/docs/pt-BR/drivers-and-controllers.md new file mode 100644 index 0000000..94bc19c --- /dev/null +++ b/docs/pt-BR/drivers-and-controllers.md @@ -0,0 +1,93 @@ +# Drivers e Controladores + +[![English](https://img.shields.io/badge/Language-English-2563eb?style=for-the-badge)](../en/drivers-and-controllers.md) +[![Português](https://img.shields.io/badge/Idioma-Portugu%C3%AAs-16a34a?style=for-the-badge)](drivers-and-controllers.md) + +## Plugins de Driver + +Drivers conectam o Senamby ao dispositivo real ou simulador. Um driver normalmente: + +- lê sensores +- opcionalmente lê feedback dos atuadores +- escreve saídas de atuador quando há controladores ativos + +A configuração do driver vem do schema do plugin e é salva na instância de driver da planta. + +## Plugins de Controlador + +Controladores calculam saídas de atuador a partir do snapshot do ciclo atual. Uma instância de controlador guarda: + +- identidade e nome de exibição +- bindings de entrada +- bindings de saída +- valores de parâmetros +- status de runtime + +## Quem Recebe O Quê (Resumo Rápido) + +### Driver + +Recebe no construtor: + +- `context.config` +- `context.plant` + +Métodos de payload: + +- `read()` retorna `{ "sensors": {...}, "actuators": {...} }` +- `write(outputs)` recebe `{ "actuator_id": valor }` + +### Controlador + +Recebe no construtor: + +- `context.controller` +- `context.plant` + +Método de payload: + +- `compute(snapshot)` recebe snapshot do ciclo +- deve retornar `{ "actuator_id": valor }` + +Conteúdo principal de `snapshot`: + +- `dt_s` +- `setpoints` +- `sensors` +- `actuators` +- `controller` + +Para estrutura completa e exemplos JSON, veja: + +- [Formato de Arquivo de Plugin](plugin-file-format.md) +- [Comportamento da Runtime](runtime-behavior.md) + +## Atualizações em Runtime + +Enquanto a planta está conectada, controladores podem ser adicionados ou editados em tempo real. + +- se o ambiente Python atual conseguir carregar o conjunto atualizado, a runtime faz hot swap +- se a mudança exigir reconstrução do ambiente, o controlador fica como `pending_restart` + +## Status de Runtime + +Status atuais de controlador: + +- `synced`: a configuração já está aplicada na runtime +- `pending_restart`: a configuração foi salva, mas a runtime precisa ser reconectada + +## Regra de Remoção + +Um controlador ativo e sincronizado não pode ser removido enquanto estiver rodando. Ele precisa ser desativado primeiro. + +## Regra de Unidade Pública + +Controladores e plantas devem trabalhar nas unidades públicas da planta. Conversões cruas de dispositivo pertencem ao driver. + +Exemplo: + +- faixa pública do atuador: `0..100` +- duty cycle do Arduino: `0..255` +- saída do controlador: `0..100` +- conversão de escrita no driver: `0..100 -> 0..255` +- conversão de leitura no driver: `0..255 -> 0..100` diff --git a/docs/pt-BR/getting-started.md b/docs/pt-BR/getting-started.md new file mode 100644 index 0000000..0841f35 --- /dev/null +++ b/docs/pt-BR/getting-started.md @@ -0,0 +1,68 @@ +# Primeiros Passos + +[![English](https://img.shields.io/badge/Language-English-2563eb?style=for-the-badge)](../en/getting-started.md) +[![Português](https://img.shields.io/badge/Idioma-Portugu%C3%AAs-16a34a?style=for-the-badge)](getting-started.md) + +## 1. Execute a Aplicação Desktop + +Se você executa o Senamby a partir do código-fonte, a aplicação desktop fica em `apps/desktop`. Os scripts atuais do repositório incluem: + +- `pnpm --dir apps/desktop install` +- `pnpm --dir apps/desktop tauri dev` + +Se você usa um build empacotado, basta abrir a aplicação normalmente no sistema operacional. + +## 2. Entenda o Workspace + +O Senamby guarda seus arquivos em: + +`Documents/Senamby/workspace` + +O workspace contém: + +- `drivers/` para plugins de driver +- `controllers/` para plugins de controlador +- `plants/` para registries persistidos de planta +- `envs/` para ambientes Python reutilizados +- `runtimes/` para sessões conectadas + +## 3. Carregue ou Crie Plugins + +Antes de uma planta rodar, ela precisa de pelo menos um driver. Você pode: + +- criar um plugin pela interface +- importar um arquivo JSON de plugin +- carregar plugins já salvos no workspace + +## 4. Crie ou Importe uma Planta + +Você pode: + +- criar uma nova planta na interface +- importar um arquivo JSON de planta com preview antes do cadastro + +Cada planta precisa de: + +- nome +- tempo de amostragem +- variáveis +- uma instância de driver +- controladores opcionais + +## 5. Conecte a Planta + +Quando a planta é conectada, o Senamby: + +- resolve o driver e os controladores ativos +- prepara ou reutiliza o ambiente Python +- sobe a runtime +- inicia o loop `read -> control -> write -> publish` + +## 6. Fechar vs Remover + +- **Fechar planta**: descarrega da sessão atual e encerra a runtime, mas preserva o arquivo salvo +- **Remover planta**: descarrega da sessão e apaga o registry salvo no workspace + +## 7. Regra de Reabertura + +Plantas não são recarregadas automaticamente no startup. Uma planta fechada só volta quando for importada ou aberta novamente. diff --git a/docs/pt-BR/index.md b/docs/pt-BR/index.md new file mode 100644 index 0000000..fa35191 --- /dev/null +++ b/docs/pt-BR/index.md @@ -0,0 +1,39 @@ +# Documentação do Senamby + +[![English](https://img.shields.io/badge/Language-English-2563eb?style=for-the-badge)](../en/index.md) +[![Português](https://img.shields.io/badge/Idioma-Portugu%C3%AAs-16a34a?style=for-the-badge)](index.md) + +## Visão Geral + +Senamby é uma aplicação desktop para operar plantas usando plugins reutilizáveis. Uma planta combina: + +- sensores +- atuadores +- um plugin de driver +- zero ou mais plugins de controlador + +A aplicação permite definir o modelo da planta, conectá-la a uma runtime, plotar valores em tempo real e importar/exportar artefatos em JSON. + +## Para Quem É + +- operadores que configuram plantas e executam testes +- integradores que criam drivers para dispositivos e protocolos +- engenheiros de controle que criam controladores e bindings + +## Mapa da Documentação + +- [Primeiros Passos](getting-started.md) +- [Conceitos Centrais](core-concepts.md) +- [Plantas](plants.md) +- [Drivers e Controladores](drivers-and-controllers.md) +- [Formato de Arquivo de Plugin](plugin-file-format.md) +- [Comportamento da Runtime](runtime-behavior.md) +- [Solução de Problemas](troubleshooting.md) + +## Fluxos Principais + +1. Carregar ou criar os plugins necessários +2. Criar uma planta ou importar um arquivo JSON de planta +3. Configurar variáveis, driver e bindings de controlador +4. Conectar a planta para iniciar a runtime +5. Ajustar setpoints e controladores enquanto acompanha os gráficos \ No newline at end of file diff --git a/docs/pt-BR/plants.md b/docs/pt-BR/plants.md new file mode 100644 index 0000000..74641c1 --- /dev/null +++ b/docs/pt-BR/plants.md @@ -0,0 +1,100 @@ +# Plantas + +[![English](https://img.shields.io/badge/Language-English-2563eb?style=for-the-badge)](../en/plants.md) +[![Português](https://img.shields.io/badge/Idioma-Portugu%C3%AAs-16a34a?style=for-the-badge)](plants.md) + +## Criando uma Planta + +Ao criar uma planta, defina: + +- nome da planta +- tempo de amostragem em milissegundos +- variáveis de sensor e atuador +- uma instância de driver +- controladores opcionais + +Cada atuador pode ser vinculado a um ou mais sensores para fins de UI e bindings de controle. + +## Importando uma Planta + +O Senamby suporta abrir um arquivo JSON para preview antes da importação. Depois da importação: + +- a planta é registrada no workspace +- os dados e estatísticas importados ficam disponíveis para inspeção +- plugins referenciados são reconciliados com o workspace quando possível + +## Payload Básico de Planta + +Um registry persistido de planta usa esta forma básica: + +```json +{ + "id": "plant_123", + "name": "Forno 1", + "sample_time_ms": 1000, + "variables": [ + { + "id": "var_0", + "name": "Temperatura", + "type": "sensor", + "unit": "C", + "setpoint": 50.0, + "pv_min": 0.0, + "pv_max": 100.0 + }, + { + "id": "var_1", + "name": "Heater 1", + "type": "atuador", + "unit": "%", + "setpoint": 0.0, + "pv_min": 0.0, + "pv_max": 100.0 + } + ], + "driver": { + "plugin_id": "plugin_driver", + "config": { + "port": "/dev/ttyACM0" + } + }, + "controllers": [] +} +``` + +## Conectando uma Planta + +Conectar uma planta inicia a runtime e a telemetria ao vivo. Durante a conexão, o Senamby: + +- valida o driver e os controladores ativos +- resolve os arquivos de plugin no workspace +- prepara o ambiente Python +- envia o bootstrap para o runner Python + +## Pausar e Retomar + +Pausar e retomar são ações visuais de sessão. A runtime continua coletando e controlando em segundo plano enquanto a UI acumula backlog. Ao retomar, a telemetria acumulada é plotada. + +## Fechando uma Planta + +Fechar uma planta: + +- encerra a runtime, se ela estiver conectada +- descarrega a planta da sessão atual +- preserva o arquivo persistido da planta + +Regra importante de reabertura: + +- quando a planta for reaberta, as instâncias de controlador começam inativas + +## Removendo uma Planta + +Remover uma planta: + +- encerra a runtime, se necessário +- descarrega a planta da sessão +- apaga o registry persistido no workspace + +## Setpoints + +Setpoints são persistidos no registry da planta e, quando a planta está conectada, também enviados para a runtime em execução. diff --git a/docs/pt-BR/plugin-file-format.md b/docs/pt-BR/plugin-file-format.md new file mode 100644 index 0000000..5631828 --- /dev/null +++ b/docs/pt-BR/plugin-file-format.md @@ -0,0 +1,261 @@ +# Formato de Arquivo de Plugin + +[![English](https://img.shields.io/badge/Language-English-2563eb?style=for-the-badge)](../en/plugin-file-format.md) +[![Português](https://img.shields.io/badge/Idioma-Portugu%C3%AAs-16a34a?style=for-the-badge)](plugin-file-format.md) + +## JSON de Plugin + +O Senamby aceita arquivos JSON de plugin com esta forma básica: + +```json +{ + "name": "Meu Driver", + "kind": "driver", + "runtime": "python", + "entryClass": "MeuDriver", + "sourceFile": "main.py", + "schema": [ + { + "name": "port", + "type": "string", + "description": "Porta serial" + } + ], + "dependencies": [ + { + "name": "pyserial", + "version": "" + } + ] +} +``` + +Kinds suportados: + +- `driver` +- `controller` + +Tipos de campo de schema: + +- `bool` +- `int` +- `float` +- `string` +- `list` + +## Contrato Python de Driver + +```python +class MeuDriver: + def __init__(self, context): + self.context = context + + def connect(self) -> bool: + return True + + def stop(self) -> bool: + return True + + def read(self) -> dict[str, dict[str, float]]: + return { + "sensors": {"var_0": 0.0}, + "actuators": {"var_2": 0.0} + } + + def write(self, outputs: dict[str, float]) -> bool: + return True +``` + +O contexto público do driver expõe apenas: + +- `context.config` +- `context.plant` + +## Payload de `read()` (Driver -> Runtime) + +O `read()` deve retornar um objeto com dois mapas: + +```json +{ + "sensors": { + "sensor_1": 58.2, + "sensor_2": 31.0 + }, + "actuators": { + "actuator_1": 37.0 + } +} +``` + +Regras práticas: + +- as chaves devem ser `id` de variáveis da planta +- os valores devem ser numéricos finitos +- chaves desconhecidas são ignoradas pela runtime +- se `sensors` ou `actuators` vier ausente, a runtime considera `{}` para aquele bloco + +## Payload de `write(outputs)` (Runtime -> Driver) + +Quando houver saída de controlador no ciclo, a runtime chama: + +```python +write(outputs) +``` + +Formato de `outputs`: + +```json +{ + "actuator_1": 42.0, + "actuator_2": 15.5 +} +``` + +Esse mapa já vem consolidado no ciclo, no espaço de unidades públicas da planta. + +## Contrato Python de Controlador + +```python +class MeuControlador: + def __init__(self, context): + self.context = context + + def compute(self, snapshot: dict[str, object]) -> dict[str, float]: + return { + actuator_id: 0.0 + for actuator_id in self.context.controller.output_variable_ids + } +``` + +O contexto público do controlador expõe apenas: + +- `context.controller` +- `context.plant` + +## Estrutura de `context.controller` + +Dentro do controlador, `self.context.controller` expõe: + +- `id` +- `name` +- `controller_type` +- `input_variable_ids` +- `output_variable_ids` +- `params` + +Exemplo de `params`: + +```json +{ + "kp": { "type": "number", "value": 1.2, "label": "Kp" }, + "enabled": { "type": "boolean", "value": true, "label": "Habilitado" }, + "mode": { "type": "string", "value": "auto", "label": "Modo" } +} +``` + +Uso típico no código: + +- `self.context.controller.params["kp"]["value"]` +- `self.context.controller.input_variable_ids` +- `self.context.controller.output_variable_ids` + +## Snapshot Básico + +O snapshot de `compute()` inclui: + +- `dt_s` +- `setpoints` +- `sensors` +- `actuators` +- `controller` + +## Snapshot Completo de `compute(snapshot)` + +Exemplo de snapshot real (simplificado): + +```json +{ + "cycle_id": 17, + "timestamp": 1710000000.123, + "dt_s": 0.1, + "plant": { + "id": "plant_1", + "name": "Forno Piloto" + }, + "setpoints": { + "sensor_1": 60.0 + }, + "sensors": { + "sensor_1": 58.2 + }, + "actuators": { + "actuator_1": 37.0 + }, + "variables_by_id": { + "sensor_1": { + "id": "sensor_1", + "name": "Temperatura", + "type": "sensor", + "unit": "C", + "setpoint": 60.0, + "pv_min": 0.0, + "pv_max": 100.0, + "linked_sensor_ids": [] + } + }, + "controller": { + "id": "ctrl_1", + "name": "PID Temperatura", + "controller_type": "PID", + "input_variable_ids": ["sensor_1"], + "output_variable_ids": ["actuator_1"], + "params": { + "kp": { "type": "number", "value": 1.2, "label": "Kp" } + } + } +} +``` + +Leitura mais comum no `compute()`: + +- PV atual: `snapshot["sensors"].get(sensor_id, 0.0)` +- SP atual: `snapshot["setpoints"].get(sensor_id, 0.0)` +- parâmetros: `self.context.controller.params` + +`snapshot["actuators"]` representa o readback de atuador lido no ciclo. + +## Payload de Retorno de `compute()` (Controlador -> Runtime) + +`compute()` deve retornar um mapa `{actuator_id: valor}`: + +```json +{ + "actuator_1": 42.0 +} +``` + +Regras práticas: + +- use IDs de atuador presentes em `output_variable_ids` +- valores devem ser numéricos finitos +- IDs não permitidos são ignorados pela runtime +- erro de tipo (ex.: string em vez de número) invalida aquele ciclo do controlador + +## Unidades Públicas vs Unidades do Dispositivo + +As variáveis da planta definem as unidades e limites públicos. O driver é o lugar certo para converter para o protocolo do dispositivo. + +Exemplo: + +- faixa pública do atuador: `0..100` +- duty cycle do dispositivo: `0..255` +- `write()` converte saída pública para a unidade crua +- `read()` converte feedback cru de volta para a unidade pública + +## Fluxo Resumido de Payloads + +1. Driver recebe `context.config` e `context.plant`. +2. Driver executa `read()` e retorna `sensors/actuators`. +3. Runtime monta `snapshot` para cada controlador. +4. Controlador executa `compute(snapshot)` e retorna saídas por `actuator_id`. +5. Runtime consolida as saídas e chama `driver.write(outputs)`. diff --git a/docs/pt-BR/runtime-behavior.md b/docs/pt-BR/runtime-behavior.md new file mode 100644 index 0000000..1090f6c --- /dev/null +++ b/docs/pt-BR/runtime-behavior.md @@ -0,0 +1,177 @@ +# Comportamento da Runtime + +[![English](https://img.shields.io/badge/Language-English-2563eb?style=for-the-badge)](../en/runtime-behavior.md) +[![Português](https://img.shields.io/badge/Idioma-Portugu%C3%AAs-16a34a?style=for-the-badge)](runtime-behavior.md) + +## Fluxo de Conexão + +Quando uma planta conecta, o backend: + +1. resolve o driver e os controladores ativos +2. atualiza metadados de plugin a partir do workspace quando necessário +3. prepara o ambiente Python +4. monta um bootstrap compacto +5. inicia o runner Python + +## Fronteiras de Payload + +Na prática, os payloads passam por estas fronteiras: + +1. frontend -> backend (commands Tauri) +2. backend Rust -> runner Python (bootstrap) +3. runner Python -> plugins Python (`context`, `snapshot`, `outputs`) +4. runner Python -> frontend (`plant://telemetry`) + +## Bootstrap (Backend -> Runner) + +O runner é iniciado com um bootstrap contendo: + +- `driver` +- `controllers` +- `plant` +- `runtime` + +Exemplo simplificado: + +```json +{ + "driver": { + "plugin_id": "driver_1", + "plugin_name": "Driver Serial", + "plugin_dir": "...", + "source_file": "main.py", + "class_name": "SerialDriver", + "config": { "port": "COM3" } + }, + "controllers": [ + { + "id": "ctrl_1", + "name": "PID Temperatura", + "controller_type": "PID", + "input_variable_ids": ["sensor_1"], + "output_variable_ids": ["actuator_1"], + "params": { + "kp": { "type": "number", "value": 1.2, "label": "Kp" } + } + } + ], + "plant": { + "id": "plant_1", + "name": "Forno Piloto", + "variables": [], + "sensor_ids": ["sensor_1"], + "actuator_ids": ["actuator_1"], + "setpoints": { "sensor_1": 60.0 } + }, + "runtime": { + "id": "rt_1", + "timing": { "sample_time_ms": 100 }, + "supervision": {}, + "paths": {} + } +} +``` + +## Regras da Runtime + +- a runtime só existe enquanto a planta estiver conectada +- plantas não são carregadas automaticamente no startup +- controladores podem ser atualizados em tempo real +- algumas mudanças exigem reconexão e ficam como `pending_restart` + +## Ciclo `read -> control -> write -> publish` + +### 1. `read` + +O runner chama `driver.read()` e espera: + +```json +{ + "sensors": { "sensor_1": 58.2 }, + "actuators": { "actuator_1": 37.0 } +} +``` + +### 2. `control` + +Para cada controlador ativo, o runner monta um `snapshot` com: + +- `dt_s` +- `setpoints` +- `sensors` +- `actuators` +- `variables_by_id` +- `controller` + +Depois chama `compute(snapshot)` e recebe: + +```json +{ + "actuator_1": 42.0 +} +``` + +### 3. `write` + +O runner consolida saídas do ciclo e chama: + +```python +driver.write(outputs) +``` + +### 4. `publish` + +O runner publica telemetria para o frontend. + +## Backlog do Pause + +Pause não interrompe o loop da runtime. O frontend apenas para de plotar temporariamente e acumula backlog. Ao retomar, a telemetria acumulada é reaplicada nos gráficos. + +## Telemetria e Plotagem + +O backend emite eventos achatados `plant://telemetry` para o frontend. + +Payload principal (simplificado): + +```json +{ + "plant_id": "plant_1", + "runtime_id": "rt_1", + "timestamp": 1710000000.123, + "cycle_id": 17, + "configured_sample_time_ms": 100, + "effective_dt_ms": 100.0, + "cycle_duration_ms": 8.4, + "read_duration_ms": 2.1, + "control_duration_ms": 1.4, + "write_duration_ms": 0.8, + "publish_duration_ms": 0.3, + "cycle_late": false, + "late_by_ms": 0.0, + "phase": "publish_telemetry", + "uptime_s": 25.6, + "sensors": { "sensor_1": 58.2 }, + "actuators": { "actuator_1": 42.0 }, + "actuators_read": { "actuator_1": 37.0 }, + "setpoints": { "sensor_1": 60.0 }, + "controller_outputs": { "actuator_1": 42.0 }, + "written_outputs": { "actuator_1": 42.0 } +} +``` + +Para gráficos de atuador, a regra atual de plotagem usa o readback de atuador presente na telemetria, e não o payload bruto de `write()`. + +## Pastas de Runtime + +Dados persistentes do workspace ficam em: + +- `drivers/` +- `controllers/` +- `plants/` +- `envs/` + +Sessões conectadas também usam: + +- `runtimes//bootstrap.json` + +O script do runner Python é gravado uma vez na raiz de runtimes e reutilizado entre sessões. diff --git a/docs/pt-BR/troubleshooting.md b/docs/pt-BR/troubleshooting.md new file mode 100644 index 0000000..01b8a02 --- /dev/null +++ b/docs/pt-BR/troubleshooting.md @@ -0,0 +1,54 @@ +# Solução de Problemas + +[![English](https://img.shields.io/badge/Language-English-2563eb?style=for-the-badge)](../en/troubleshooting.md) +[![Português](https://img.shields.io/badge/Idioma-Portugu%C3%AAs-16a34a?style=for-the-badge)](troubleshooting.md) + +## Plugin Não Encontrado + +Sintomas: + +- a conexão falha +- a planta abre, mas não consegue rodar + +O que verificar: + +- o plugin existe no workspace +- o `id` ou nome do plugin ainda corresponde ao salvo na planta +- o arquivo-fonte e o registry do plugin não foram apagados manualmente + +## Controlador `pending_restart` + +Significa que: + +- o controlador foi salvo +- a runtime atual não consegue aplicá-lo imediatamente + +Como resolver: + +- reconecte a planta para reconstruir a runtime com o conjunto atualizado de plugins + +## Não Foi Possível Remover Controlador Ativo + +Se um controlador estiver ativo e sincronizado em uma planta rodando, a remoção é bloqueada. + +Como resolver: + +1. desative o controlador +2. salve a configuração +3. remova o controlador + +## Problemas com Dependências Python + +Se a runtime não iniciar por causa das dependências: + +- revise a lista de dependências do driver/controlador +- reconecte a planta depois de corrigir o plugin +- inspecione o ambiente gerado em `Documents/Senamby/workspace/envs/` + +## Planta Fechada vs Removida + +Se uma planta sumiu da sessão: + +- ela pode ter sido apenas fechada, e não apagada +- plantas fechadas continuam salvas e podem ser importadas/abertas novamente +- plantas removidas apagam o registry persistido do workspace diff --git a/examples/ball_n_plate.py b/examples/ball_n_plate.py deleted file mode 100644 index e5600dd..0000000 --- a/examples/ball_n_plate.py +++ /dev/null @@ -1,115 +0,0 @@ -from controller_framework import AppManager -from controller_framework import Controller -from controller_framework import MCUType - - -class BallNPlateControler(Controller): - def __init__(self, label, setpoint): - super().__init__(label, setpoint) - - self.x_out = 1750 - self.y_out = 1750 - - self.closed_loop = True - - self.x_last = 0 - self.x_ierr = 0 - self.y_last = 0 - self.y_ierr = 0 - - def x_pid(self, sp, pv, pv_last, ierr, dt): - Kc = 4 # K/%Heater - tauI = 0.4 # sec - tauD = 0.06 # sec - # Parameters in terms of PID coefficients - KP = Kc - KI = Kc / tauI - KD = Kc * tauD - # ubias for controller (initial heater) - op0 = 17500 - # upper and lower bounds on heater level - ophi = 22500 - oplo = 12500 - # calculate the error - error = (sp - pv) * 0.6 - print("x_err:", error) - # calculate the integral error - ierr = ierr + KI * error * dt - # calculate the measurement derivative - dpv = (pv - pv_last) / (dt + 0.000001) - # calculate the PID output - P = KP * error - I = ierr - D = -KD * dpv - op = op0 + P + I + D - # implement anti-reset 10windup - if op < oplo or op > ophi: - I = I - KI * error * dt - # clip output - op = max(oplo, min(ophi, op)) - # invert for x axis - # op = -op + ophi + oplo - # return the controller output and PID terms - return [op, P, I, D] - - def y_pid(self, sp, pv, pv_last, ierr, dt): - Kc = 3 # K/%Heater - tauI = 0.3 # sec - tauD = 0.08 # sec - # Parameters in terms of PID coefficients - KP = Kc - KI = Kc / tauI - KD = Kc * tauD - # ubias for controller (initial heater) - op0 = 17500 - # upper and lower bounds on heater level - ophi = 22500 - oplo = 12500 - # calculate the error - error = sp - pv - print("y_err:", error) - # calculate the integral error - ierr = ierr + KI * error * dt - # calculate the measurement derivative - dpv = (pv - pv_last) / (dt + 0.000001) - # calculate the PID output - P = KP * error - I = ierr - D = -KD * dpv - op = op0 + P + I + D - # implement anti-reset windup - if op < oplo or op > ophi: - I = I - KI * error * dt - # clip output - op = max(oplo, min(ophi, op)) - # return the controller output and PID terms - return [op, P, I, D] - - def control(self): - if self.closed_loop: - if self.x_last == 0: - self.x_last = self.x_out - if self.y_last == 0: - self.y_last = self.y_out - - out_x, _, x_ierr, _ = self.x_pid(self.setpoint, self.sensor_a, self.x_last, self.x_ierr, self.dt) - out_y, _, y_ierr, _ = self.y_pid(self.setpoint, self.sensor_b, self.y_last, self.y_ierr, self.dt) - - self.x_last = self.sensor_a - self.y_last = self.sensor_b - self.x_ierr = x_ierr - self.y_ierr = y_ierr - self.out1 = out_x / 10 - self.out2 = out_y / 10 - return self.out1, self.out2 - - -if __name__ == '__main__': - ball_n_plate = BallNPlateControler("Ball and Plate Controller", [2400, 2400]) - ball_n_plate.set_config_variable(("closed_loop", bool)) - - app = AppManager(sample_time=100, mcu_type=MCUType.STM32, x_pos=2400.0, y_pos=2400.0, x_out=1750.0, y_out=1750.0) - app.append_instance(ball_n_plate) - app.set_actuator_vars(('Servo X', '', float), ('Servo Y', '', float)) - app.set_sensor_vars(('Pos X', '', float), ('Pos Y', '', float)) - app.init() diff --git a/examples/main.py b/examples/main.py deleted file mode 100644 index 96dea05..0000000 --- a/examples/main.py +++ /dev/null @@ -1,98 +0,0 @@ -import time -from controller_framework import AppManager -from controller_framework import Controller -from controller_framework import MCUType - -class PIDControl(Controller): - def __init__(self, label, init_setpoint, l, t): - super().__init__(label, init_setpoint) - ti = (l / 0.3) - td = 0 - self.Kp = (0.9 * (t / l)) - self.Ki = (self.Kp / ti) - self.Kd = (self.Kp * td) - - self.error = 0 - self.accumulated_I = 0 - - self.ntc_1 = 0 - self.ntc_2 = 0 - - self.heater_1 = 0 - self.heater_2 = 0 - - def step(self, setpoint, measure): - dt_s = self.dt / 10 ** 6 - - err = setpoint - measure - P = self.Kp * err - i_inc = self.Ki * err * dt_s - D = self.Kd * (err - self.error) / (dt_s + 0.000001) - - self.error = err - - windup_check = P + self.accumulated_I + i_inc + D - - return max(0.0, min(100.0, windup_check)) - - def control(self): - result = [] - - for i, sensor_value in enumerate(self.sensor_values): - out = self.step(self.setpoints[i], sensor_value) - result.append(out) - - return result - -class PIDControl2(Controller): - def __init__(self, label, setpoint, l, t): - super().__init__(label, setpoint) - ti = (l / 0.3) - td = 0 - self.Kp = (0.9 * (t / l)) - self.Ki = (self.Kp / ti) - self.Kd = (self.Kp * td) - - self.error = 0 - self.accumulated_I = 0 - - def control(self): - time.sleep(0.48) - - dt_s = self.dt - - measure = (self.sensor_a + self.sensor_b) / 2 - - err = self.setpoint - measure - P = self.Kp * err - i_inc = self.Ki * err * dt_s - D = self.Kd * (err - self.error) / (dt_s + 0.000001) - - self.error = err - - windup_check = P + self.accumulated_I + i_inc + D - - if windup_check > 100: - self.out = 100 - - if windup_check < -100: - self.out = -100 - - self.accumulated_I += i_inc - self.out = windup_check - -if __name__ == '__main__': - plant = AppManager(mcu_type=MCUType.RDATA, sample_time=1000, port="COM1", baud_rate=14000) - plant.set_actuator_vars(("Heater 1", "%", float), ("Heater 2", "%", float), ("Heater 3", "%", float)) - plant.set_sensor_vars(("NTC 1", "ºC", float), ("NTC 2", "ºC", float ), ("NTC 3", "ºC", float)) - - pidcontrol1 = PIDControl("PID Control 1", init_setpoint=(40, 30, 50), l=9.02, t=344.21) - pidcontrol1.set_config_variable(("Kp", float), ("Ki", float), ("Kd", float)) - - # pidcontrol2 = PIDControl2("PID Control 2", 250, 15.02, 18.21) - # pidcontrol2.set_config_variable(("Kp", float)) - # pidcontrol2.set_config_variable(("Ki", float)) - # teste.append_instance(pidcontrol2) - - plant.append_instance(pidcontrol1) - plant.init() diff --git a/examples/tclab_thermal.py b/examples/tclab_thermal.py deleted file mode 100644 index cdd2d90..0000000 --- a/examples/tclab_thermal.py +++ /dev/null @@ -1,72 +0,0 @@ -import sys - -from controller_framework import AppManager -from controller_framework import Controller -from controller_framework import MCUType - -class ThermalControler(Controller): - def __init__(self, label, setpoint): - super().__init__(label, setpoint) - - self.out1 = 0.0 - self.out2 = 0.0 - - self.closed_loop = True - - self.sensor_a_last = 0 - self.ierr = 0 - - def pid(self, sp,pv,pv_last,ierr,dt): - Kc = 10.0 # K/%Heater - tauI = 50.0 # sec - tauD = 1.0 # sec - # Parameters in terms of PID coefficients - KP = Kc - KI = Kc/tauI - KD = Kc*tauD - # ubias for controller (initial heater) - op0 = 0 - # upper and lower bounds on heater level - ophi = 100 - oplo = 0 - # calculate the error - error = sp-pv - # calculate the integral error - ierr = ierr + KI * error * dt - # calculate the measurement derivative - dpv = (pv - pv_last) / (dt + 0.000001) - # calculate the PID output - P = KP * error - I = ierr - D = -KD * dpv - op = op0 + P + I + D - # implement anti-reset windup - if op < oplo or op > ophi: - I = I - KI * error * dt - # clip output - op = max(oplo,min(ophi,op)) - # return the controller output and PID terms - return [op,P,I,D] - - def control(self): - if self.closed_loop: - if self.sensor_a_last == 0: - self.sensor_a_last = self.sensor_a - - out, _, ierr, _ = self.pid(self.setpoint, self.sensor_a, self.sensor_a_last, self.ierr, self.dt) - - self.sensor_a_last = self.sensor_a - self.ierr = ierr - self.out1 = out - return self.out1 - -if __name__ == '__main__': - thermal = ThermalControler("Thermal Controller", 25) - thermal.set_config_variable(("out1", float)) - thermal.set_config_variable(("out2", float)) - thermal.set_config_variable(("closed_loop", bool)) - thermal.set_config_variable(("setpoint", float)) - - app = AppManager(MCUType.TCLAB, port=sys.argv[1], baud=sys.argv[2]) - app.append_instance(thermal) - app.init() diff --git a/examples/thermal_plant.png b/examples/thermal_plant.png deleted file mode 100644 index aa1290f..0000000 Binary files a/examples/thermal_plant.png and /dev/null differ diff --git a/mise.toml b/mise.toml new file mode 100644 index 0000000..66f045d --- /dev/null +++ b/mise.toml @@ -0,0 +1,5 @@ +[tools] +node = "22" +pnpm = "10.27.0" +python = "3.13.11" +rust = "1.92.0" diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 1f55af2..0000000 --- a/pyproject.toml +++ /dev/null @@ -1,35 +0,0 @@ -[build-system] -requires = ["setuptools", "wheel"] -build-backend = "setuptools.build_meta" - -[project] -name = "controller-framework" -version = "0.0.2" -description = "A framework to simplify creation of controllers" -authors = [ - { name = "Paulo Santos", email = "pauloxrms@gmail.com" }, - { name = "Higor Lima", email = "limahigor.g@gmail.com" }, - { name = "Rita Lemos", email = "rklp@ic.ufal.br" }, - { name = "Vinicius Rafael", email = "vinicius.rafael751@gmail.com" }, - ] -license = { text = "GNU" } -readme = "README.md" -requires-python = ">=3.9" - -dependencies = [ - "PySide6>=6.8.2", - "numpy>=2.1.2", - "pandas>=2.2.3", - "pyqtgraph>=0.13.7", - "pyserial>=3.5", - "python-dateutil>=2.9.0.post0", - "pytz>=2024.2", - "six>=1.16.0", - "tzdata>=2024.2", - "matplotlib~=3.9.2", - "scipy~=1.14.1", - "pyocd>=0.36.0", -] - -[tool.setuptools] -py-modules = ["controller_framework"] diff --git a/temp_logs/log_simulacao.csv b/temp_logs/log_simulacao.csv deleted file mode 100644 index 21dc1ee..0000000 --- a/temp_logs/log_simulacao.csv +++ /dev/null @@ -1,12668 +0,0 @@ -timestamp,seconds,sensor_0,sensor_1,duty,target -15:43:21,0.6654,24.706,25.262,-62.485,35 -15:43:22,0.8840,24.681,25.287,100.0,35 -15:43:22,0.9520,24.681,25.287,100.0,35 -15:43:22,1.0021,24.631,25.287,100.0,35 -15:43:22,1.0719,24.656,25.287,100.0,35 -15:43:22,1.1283,24.706,25.312,100.0,35 -15:43:22,1.1808,24.706,25.287,100.0,35 -15:43:22,1.2221,24.681,25.262,100.0,35 -15:43:22,1.2667,24.681,25.312,100.0,35 -15:43:22,1.3085,24.681,25.262,100.0,35 -15:43:22,1.3493,24.681,25.312,100.0,35 -15:43:22,1.3907,24.681,25.312,100.0,35 -15:43:22,1.4267,24.706,25.287,100.0,35 -15:43:22,1.4646,24.681,25.262,100.0,35 -15:43:22,1.5012,24.681,25.287,100.0,35 -15:43:22,1.5373,24.681,25.262,100.0,35 -15:43:22,1.5737,24.681,25.287,100.0,35 -15:43:22,1.6110,24.706,25.287,100.0,35 -15:43:22,1.6484,24.681,25.312,100.0,35 -15:43:22,1.6872,24.681,25.287,100.0,35 -15:43:22,1.7264,24.681,25.287,100.0,35 -15:43:22,1.7655,24.681,25.287,100.0,35 -15:43:22,1.8042,24.681,25.262,100.0,35 -15:43:23,1.8440,24.681,25.287,100.0,35 -15:43:23,1.8834,24.706,25.287,100.0,35 -15:43:23,1.9233,24.681,25.287,100.0,35 -15:43:23,1.9626,24.706,25.262,100.0,35 -15:43:23,2.0021,24.732,25.287,100.0,35 -15:43:23,2.0426,24.681,25.287,100.0,35 -15:43:23,2.0822,24.681,25.287,100.0,35 -15:43:23,2.1279,24.681,25.287,100.0,35 -15:43:23,2.1654,24.681,25.287,100.0,35 -15:43:23,2.2022,24.656,25.287,100.0,35 -15:43:23,2.2396,24.681,25.262,100.0,35 -15:43:23,2.2800,24.706,25.287,100.0,35 -15:43:23,2.3222,24.681,25.287,100.0,35 -15:43:23,2.3641,24.681,25.262,100.0,35 -15:43:23,2.4080,24.681,25.287,100.0,35 -15:43:23,2.4520,24.706,25.338,100.0,35 -15:43:23,2.4935,24.706,25.262,100.0,35 -15:43:23,2.5357,24.706,25.287,100.0,35 -15:43:23,2.5770,24.681,25.287,100.0,35 -15:43:23,2.6201,24.681,25.287,100.0,35 -15:43:23,2.6649,24.681,25.287,100.0,35 -15:43:23,2.7075,24.681,25.287,100.0,35 -15:43:23,2.7517,24.631,25.287,100.0,35 -15:43:23,2.7951,24.681,25.287,100.0,35 -15:43:24,2.8405,24.631,25.287,100.0,35 -15:43:24,2.8876,24.681,25.237,100.0,35 -15:43:24,2.9329,24.631,25.287,100.0,35 -15:43:24,2.9759,24.681,25.287,100.0,35 -15:43:24,3.0211,24.681,25.262,100.0,35 -15:43:24,3.0635,24.706,25.287,100.0,35 -15:43:24,3.1055,24.656,25.287,100.0,35 -15:43:24,3.1509,24.706,25.287,100.0,35 -15:43:24,3.1971,24.681,25.312,100.0,35 -15:43:24,3.2428,24.706,25.287,100.0,35 -15:43:24,3.2924,24.681,25.287,100.0,35 -15:43:24,3.3406,24.656,25.262,100.0,35 -15:43:24,3.3893,24.681,25.287,100.0,35 -15:43:24,3.4367,24.681,25.287,100.0,35 -15:43:24,3.4823,24.732,25.287,100.0,35 -15:43:24,3.5263,24.681,25.287,100.0,35 -15:43:24,3.5725,24.706,25.287,100.0,35 -15:43:24,3.6185,24.656,25.262,100.0,35 -15:43:24,3.6645,24.681,25.287,100.0,35 -15:43:24,3.7135,24.681,25.287,100.0,35 -15:43:24,3.7637,24.757,25.312,100.0,35 -15:43:25,3.8139,24.681,25.287,100.0,35 -15:43:25,3.8631,24.681,25.262,100.0,35 -15:43:25,3.9620,24.706,25.287,100.0,35 -15:43:25,4.0151,24.681,25.287,100.0,35 -15:43:25,4.0658,24.681,25.287,100.0,35 -15:43:25,4.1156,24.681,25.287,100.0,35 -15:43:25,4.1667,24.681,25.287,100.0,35 -15:43:25,4.2184,24.656,25.287,100.0,35 -15:43:25,4.2672,24.706,25.287,100.0,35 -15:43:25,4.3063,24.681,25.262,100.0,35 -15:43:25,4.3483,24.681,25.287,100.0,35 -15:43:25,4.3867,24.606,25.287,100.0,35 -15:43:25,4.4277,24.681,25.287,100.0,35 -15:43:25,4.4687,24.706,25.262,100.0,35 -15:43:25,4.5160,24.681,25.287,100.0,35 -15:43:25,4.5569,24.681,25.312,100.0,35 -15:43:25,4.6002,24.706,25.312,100.0,35 -15:43:25,4.6396,24.681,25.287,100.0,35 -15:43:25,4.6796,24.681,25.287,100.0,35 -15:43:25,4.7198,24.706,25.262,100.0,35 -15:43:25,4.7613,24.681,25.287,100.0,35 -15:43:25,4.8036,24.706,25.262,100.0,35 -15:43:26,4.8440,24.706,25.287,100.0,35 -15:43:26,4.8856,24.681,25.287,100.0,35 -15:43:26,4.9267,24.706,25.312,100.0,35 -15:43:26,4.9776,24.681,25.287,100.0,35 -15:43:26,5.0286,24.631,25.287,100.0,35 -15:43:26,5.0691,24.706,25.287,100.0,35 -15:43:26,5.1105,24.732,25.237,100.0,35 -15:43:26,5.1535,24.757,25.287,100.0,35 -15:43:26,5.1972,24.706,25.287,100.0,35 -15:43:26,5.2386,24.706,25.312,100.0,35 -15:43:26,5.2828,24.681,25.287,100.0,35 -15:43:26,5.3258,24.706,25.287,100.0,35 -15:43:26,5.3685,24.706,25.287,100.0,35 -15:43:26,5.4099,24.681,25.287,100.0,35 -15:43:26,5.4542,24.732,25.287,100.0,35 -15:43:26,5.4964,24.706,25.287,100.0,35 -15:43:26,5.5402,24.782,25.262,100.0,35 -15:43:26,5.5838,24.706,25.262,100.0,35 -15:43:26,5.6248,24.706,25.287,100.0,35 -15:43:26,5.6682,24.706,25.312,100.0,35 -15:43:26,5.7107,24.706,25.312,100.0,35 -15:43:26,5.7550,24.681,25.312,100.0,35 -15:43:26,5.7950,24.732,25.287,100.0,35 -15:43:27,5.8372,24.732,25.287,100.0,35 -15:43:27,5.8816,24.706,25.312,100.0,35 -15:43:27,5.9249,24.706,25.312,100.0,35 -15:43:27,5.9710,24.706,25.287,100.0,35 -15:43:27,6.0239,24.656,25.363,100.0,35 -15:43:27,6.0747,24.681,25.338,100.0,35 -15:43:27,6.1237,24.706,25.287,100.0,35 -15:43:27,6.1692,24.732,25.312,100.0,35 -15:43:27,6.2156,24.732,25.312,100.0,35 -15:43:27,6.2601,24.732,25.312,100.0,35 -15:43:27,6.3098,24.732,25.287,100.0,35 -15:43:27,6.3609,24.732,25.312,100.0,35 -15:43:27,6.4108,24.706,25.312,100.0,35 -15:43:27,6.4592,24.732,25.287,100.0,35 -15:43:27,6.5078,24.732,25.312,100.0,35 -15:43:27,6.5576,24.732,25.312,100.0,35 -15:43:27,6.6062,24.706,25.363,100.0,35 -15:43:27,6.6564,24.732,25.312,100.0,35 -15:43:27,6.7037,24.706,25.338,100.0,35 -15:43:27,6.7483,24.732,25.312,100.0,35 -15:43:27,6.7931,24.782,25.237,100.0,35 -15:43:28,6.8397,24.757,25.287,100.0,35 -15:43:28,6.8863,24.706,25.287,100.0,35 -15:43:28,6.9307,24.706,25.338,100.0,35 -15:43:28,6.9749,24.732,25.287,100.0,35 -15:43:28,7.0228,24.732,25.312,100.0,35 -15:43:28,7.0657,24.732,25.363,100.0,35 -15:43:28,7.1094,24.681,25.338,100.0,35 -15:43:28,7.1556,24.732,25.312,100.0,35 -15:43:28,7.2011,24.732,25.312,100.0,35 -15:43:28,7.2472,24.757,25.312,100.0,35 -15:43:28,7.2922,24.732,25.312,100.0,35 -15:43:28,7.3390,24.757,25.312,100.0,35 -15:43:28,7.3848,24.807,25.338,100.0,35 -15:43:28,7.4318,24.732,25.262,100.0,35 -15:43:28,7.4788,24.706,25.338,100.0,35 -15:43:28,7.5264,24.732,25.363,100.0,35 -15:43:28,7.5754,24.757,25.338,100.0,35 -15:43:28,7.6265,24.757,25.312,100.0,35 -15:43:28,7.6771,24.732,25.338,100.0,35 -15:43:28,7.7263,24.681,25.338,100.0,35 -15:43:28,7.7764,24.732,25.338,100.0,35 -15:43:29,7.8280,24.757,25.312,100.0,35 -15:43:29,7.8737,24.782,25.338,100.0,35 -15:43:29,7.9177,24.757,25.312,100.0,35 -15:43:29,7.9596,24.757,25.338,100.0,35 -15:43:29,8.0022,24.757,25.338,100.0,35 -15:43:29,8.0428,24.757,25.388,100.0,35 -15:43:29,8.0862,24.757,25.338,100.0,35 -15:43:29,8.1288,24.757,25.338,100.0,35 -15:43:29,8.1692,24.757,25.338,100.0,35 -15:43:29,8.2101,24.757,25.414,100.0,35 -15:43:29,8.2542,24.782,25.338,100.0,35 -15:43:29,8.2939,24.757,25.338,100.0,35 -15:43:29,8.3343,24.757,25.338,100.0,35 -15:43:29,8.3759,24.782,25.338,100.0,35 -15:43:29,8.4202,24.782,25.338,100.0,35 -15:43:29,8.4611,24.782,25.338,100.0,35 -15:43:29,8.5007,24.782,25.338,100.0,35 -15:43:29,8.5408,24.807,25.338,100.0,35 -15:43:29,8.5823,24.782,25.363,100.0,35 -15:43:29,8.6227,24.807,25.338,100.0,35 -15:43:29,8.6682,24.782,25.363,100.0,35 -15:43:29,8.7112,24.782,25.338,100.0,35 -15:43:29,8.7528,24.782,25.338,100.0,35 -15:43:29,8.7947,24.757,25.363,100.0,35 -15:43:30,8.8368,24.782,25.363,100.0,35 -15:43:30,8.8789,24.782,25.338,100.0,35 -15:43:30,8.9204,24.782,25.338,100.0,35 -15:43:30,8.9649,24.782,25.363,100.0,35 -15:43:30,9.0087,24.782,25.338,100.0,35 -15:43:30,9.0546,24.757,25.363,100.0,35 -15:43:30,9.0953,24.782,25.388,100.0,35 -15:43:30,9.1368,24.782,25.363,100.0,35 -15:43:30,9.1857,24.782,25.363,100.0,35.0 -15:43:30,9.2319,24.782,25.363,100.0,35.0 -15:43:30,9.2776,24.807,25.363,100.0,35.0 -15:43:30,9.3229,24.782,25.388,100.0,35.0 -15:43:30,9.3697,24.807,25.363,100.0,35.0 -15:43:30,9.4136,24.807,25.363,100.0,35.0 -15:43:30,9.4561,24.807,25.363,100.0,35.0 -15:43:30,9.5021,24.807,25.388,100.0,35.0 -15:43:30,9.5453,24.807,25.363,100.0,35.0 -15:43:30,9.5883,24.807,25.363,100.0,35.0 -15:43:30,9.6340,24.782,25.388,100.0,35.0 -15:43:30,9.6807,24.807,25.388,100.0,35.0 -15:43:30,9.7236,24.807,25.388,100.0,35.0 -15:43:30,9.7705,24.782,25.388,100.0,35.0 -15:43:31,9.8174,24.833,25.363,100.0,35.0 -15:43:31,9.8626,24.807,25.388,100.0,35.0 -15:43:31,9.9067,24.807,25.388,100.0,35.0 -15:43:31,9.9537,24.782,25.388,100.0,35.0 -15:43:31,9.9966,24.807,25.388,100.0,35.0 -15:43:31,10.0403,24.858,25.388,100.0,35.0 -15:43:31,10.0885,24.833,25.388,100.0,35.0 -15:43:31,10.1337,24.807,25.338,100.0,35.0 -15:43:31,10.1801,24.858,25.388,100.0,35.0 -15:43:31,10.2207,24.833,25.388,100.0,35.0 -15:43:31,10.2621,24.833,25.414,100.0,35.0 -15:43:31,10.3033,24.833,25.414,100.0,35.0 -15:43:31,10.3451,24.833,25.388,100.0,35.0 -15:43:31,10.4056,24.782,25.363,100.0,35.0 -15:43:31,10.4507,24.833,25.414,100.0,35.0 -15:43:31,10.4947,24.807,25.414,100.0,35.0 -15:43:31,10.5356,24.858,25.414,100.0,35.0 -15:43:31,10.5795,24.833,25.414,100.0,35.0 -15:43:31,10.6237,24.833,25.414,100.0,35.0 -15:43:31,10.6723,24.858,25.388,100.0,35.0 -15:43:31,10.7189,24.858,25.363,100.0,35.0 -15:43:31,10.7671,24.858,25.388,100.0,35.0 -15:43:32,10.8102,24.858,25.464,100.0,35.0 -15:43:32,10.8556,24.858,25.414,100.0,35.0 -15:43:32,10.9019,24.858,25.414,100.0,35.0 -15:43:32,10.9485,24.858,25.414,100.0,35.0 -15:43:32,10.9929,24.858,25.338,100.0,35.0 -15:43:32,11.0392,24.858,25.439,100.0,35.0 -15:43:32,11.0864,24.883,25.439,100.0,35.0 -15:43:32,11.1329,24.858,25.414,100.0,35.0 -15:43:32,11.1765,24.858,25.439,100.0,35.0 -15:43:32,11.2201,24.883,25.439,100.0,35.0 -15:43:32,11.2671,24.883,25.439,100.0,35.0 -15:43:32,11.3125,24.883,25.439,100.0,35.0 -15:43:32,11.3554,24.883,25.439,100.0,35.0 -15:43:32,11.4014,24.883,25.464,100.0,35.0 -15:43:32,11.4451,24.883,25.414,100.0,35.0 -15:43:32,11.4886,24.883,25.439,100.0,35.0 -15:43:32,11.5330,24.908,25.439,100.0,35.0 -15:43:32,11.5767,24.858,25.439,100.0,35.0 -15:43:32,11.6220,24.908,25.439,100.0,35.0 -15:43:32,11.6705,24.908,25.338,100.0,35.0 -15:43:32,11.7195,24.908,25.515,100.0,35.0 -15:43:32,11.7689,24.908,25.439,100.0,35.0 -15:43:33,11.8152,24.908,25.439,100.0,35.0 -15:43:33,11.8603,24.908,25.464,100.0,35.0 -15:43:33,11.9038,24.933,25.464,100.0,35.0 -15:43:33,11.9492,24.908,25.464,100.0,35.0 -15:43:33,11.9937,24.908,25.414,100.0,35.0 -15:43:33,12.0357,24.908,25.464,100.0,35.0 -15:43:33,12.0805,24.908,25.49,100.0,35.0 -15:43:33,12.1248,24.959,25.439,100.0,35.0 -15:43:33,12.1715,24.908,25.464,100.0,35.0 -15:43:33,12.2171,24.933,25.464,100.0,35.0 -15:43:33,12.2615,24.959,25.464,100.0,35.0 -15:43:33,12.3050,24.933,25.49,100.0,35.0 -15:43:33,12.3484,24.984,25.439,100.0,35.0 -15:43:33,12.3910,24.933,25.464,100.0,35.0 -15:43:33,12.4349,24.933,25.464,100.0,35.0 -15:43:33,12.4783,24.933,25.49,100.0,35.0 -15:43:33,12.5199,24.959,25.49,100.0,35.0 -15:43:33,12.5628,24.959,25.49,100.0,35.0 -15:43:33,12.6056,24.933,25.49,100.0,35.0 -15:43:33,12.6506,24.959,25.566,100.0,35.0 -15:43:33,12.6945,24.959,25.464,100.0,35.0 -15:43:33,12.7355,24.959,25.49,100.0,35.0 -15:43:33,12.7788,24.959,25.515,100.0,35.0 -15:43:34,12.8205,24.959,25.464,100.0,35.0 -15:43:34,12.8645,24.933,25.49,100.0,35.0 -15:43:34,12.9062,24.959,25.49,100.0,35.0 -15:43:34,12.9510,24.959,25.49,100.0,35.0 -15:43:34,12.9951,24.959,25.49,100.0,35.0 -15:43:34,13.0371,24.984,25.515,100.0,35.0 -15:43:34,13.0791,24.959,25.49,100.0,35.0 -15:43:34,13.1197,24.959,25.49,100.0,35.0 -15:43:34,13.1624,24.959,25.515,100.0,35.0 -15:43:34,13.2039,24.984,25.515,100.0,35.0 -15:43:34,13.2489,24.959,25.515,100.0,35.0 -15:43:34,13.2923,24.984,25.515,100.0,35.0 -15:43:34,13.3369,24.959,25.515,100.0,35.0 -15:43:34,13.3829,24.984,25.49,100.0,35.0 -15:43:34,13.4290,24.984,25.49,100.0,35.0 -15:43:34,13.4732,25.009,25.49,100.0,35.0 -15:43:34,13.5204,24.984,25.515,100.0,35.0 -15:43:34,13.5670,24.984,25.515,100.0,35.0 -15:43:34,13.6126,24.984,25.54,100.0,35.0 -15:43:34,13.6548,24.984,25.54,100.0,35.0 -15:43:34,13.7044,24.984,25.566,100.0,35.0 -15:43:34,13.7495,25.034,25.566,100.0,35.0 -15:43:34,13.7927,24.984,25.515,100.0,35.0 -15:43:35,13.8372,24.984,25.54,100.0,35.0 -15:43:35,13.8794,24.984,25.515,100.0,35.0 -15:43:35,13.9220,25.009,25.54,100.0,35.0 -15:43:35,13.9674,25.009,25.591,100.0,35.0 -15:43:35,14.0098,25.009,25.515,100.0,35.0 -15:43:35,14.0516,25.009,25.54,100.0,35.0 -15:43:35,14.0938,25.034,25.566,100.0,35.0 -15:43:35,14.1361,25.009,25.54,100.0,35.0 -15:43:35,14.1832,25.009,25.54,100.0,35.0 -15:43:35,14.2261,25.034,25.54,100.0,35.0 -15:43:35,14.2706,25.034,25.54,100.0,35.0 -15:43:35,14.3137,25.034,25.54,100.0,35.0 -15:43:35,14.3557,25.034,25.566,100.0,35.0 -15:43:35,14.4005,25.034,25.566,100.0,35.0 -15:43:35,14.4427,25.034,25.566,100.0,35.0 -15:43:35,14.4873,25.06,25.642,100.0,35.0 -15:43:35,14.5286,25.034,25.54,100.0,35.0 -15:43:35,14.5720,25.06,25.566,100.0,35.0 -15:43:35,14.6180,25.034,25.54,100.0,35.0 -15:43:35,14.6641,25.034,25.566,100.0,35.0 -15:43:35,14.7112,25.034,25.566,100.0,35.0 -15:43:35,14.7558,25.06,25.566,100.0,35.0 -15:43:35,14.8018,25.06,25.54,100.0,35.0 -15:43:36,14.8461,25.06,25.566,100.0,35.0 -15:43:36,14.8905,25.06,25.54,100.0,35.0 -15:43:36,14.9374,25.06,25.566,100.0,35.0 -15:43:36,15.0006,25.009,25.591,100.0,35.0 -15:43:36,15.0931,25.06,25.566,100.0,35.0 -15:43:36,15.1814,25.085,25.591,100.0,35.0 -15:43:36,15.2506,25.085,25.54,100.0,35.0 -15:43:36,15.3202,25.085,25.591,100.0,35.0 -15:43:36,15.3788,25.034,25.591,100.0,35.0 -15:43:36,15.4757,25.085,25.616,100.0,35.0 -15:43:36,15.5680,25.06,25.616,100.0,35.0 -15:43:36,15.6726,25.085,25.616,100.0,35.0 -15:43:36,15.7987,25.11,25.616,100.0,35.0 -15:43:37,15.8965,25.11,25.616,100.0,35.0 -15:43:37,16.0243,25.135,25.616,100.0,35.0 -15:43:37,16.1225,25.135,25.642,100.0,35.0 -15:43:37,16.2649,25.161,25.642,100.0,35.0 -15:43:37,16.3802,25.186,25.667,100.0,35.0 -15:43:37,16.5622,25.135,25.667,100.0,35.0 -15:43:37,16.6855,25.161,25.667,100.0,35.0 -15:43:38,16.8382,25.161,25.667,100.0,35.0 -15:43:38,16.9472,25.237,25.667,100.0,35.0 -15:43:38,17.0448,25.186,25.718,100.0,35.0 -15:43:38,17.1499,25.186,25.692,100.0,35.0 -15:43:38,17.2532,25.237,25.692,100.0,35.0 -15:43:38,17.3263,25.211,25.692,100.0,35.0 -15:43:38,17.3826,25.186,25.692,100.0,35.0 -15:43:38,17.4446,25.211,25.692,100.0,35.0 -15:43:38,17.4923,25.211,25.718,100.0,35.0 -15:43:38,17.5378,25.211,25.692,100.0,35.0 -15:43:38,17.6156,25.211,25.692,100.0,35.0 -15:43:38,17.6659,25.237,25.692,100.0,35.0 -15:43:38,17.7215,25.211,25.718,100.0,35.0 -15:43:38,17.7744,25.211,25.718,100.0,35.0 -15:43:39,17.8213,25.211,25.718,100.0,35.0 -15:43:39,17.8719,25.211,25.718,100.0,35.0 -15:43:39,17.9210,25.237,25.718,100.0,35.0 -15:43:39,17.9707,25.237,25.718,100.0,35.0 -15:43:39,18.0195,25.237,25.667,100.0,35.0 -15:43:39,18.0653,25.237,25.718,100.0,35.0 -15:43:39,18.1113,25.186,25.692,100.0,35.0 -15:43:39,18.1584,25.262,25.743,100.0,35.0 -15:43:39,18.2079,25.237,25.743,100.0,35.0 -15:43:39,18.2546,25.237,25.743,100.0,35.0 -15:43:39,18.3008,25.262,25.718,100.0,35.0 -15:43:39,18.3624,25.262,25.743,100.0,35.0 -15:43:39,18.4069,25.237,25.743,100.0,35.0 -15:43:39,18.4535,25.262,25.718,100.0,35.0 -15:43:39,18.5007,25.262,25.743,100.0,35.0 -15:43:39,18.5460,25.262,25.718,100.0,35.0 -15:43:39,18.5929,25.287,25.743,100.0,35.0 -15:43:39,18.6335,25.287,25.769,100.0,35.0 -15:43:39,18.6755,25.287,25.769,100.0,35.0 -15:43:39,18.7170,25.287,25.769,100.0,35.0 -15:43:39,18.7593,25.287,25.743,100.0,35.0 -15:43:39,18.7995,25.287,25.769,100.0,35.0 -15:43:40,18.8402,25.287,25.769,100.0,35.0 -15:43:40,18.8827,25.287,25.769,100.0,35.0 -15:43:40,18.9237,25.262,25.769,100.0,35.0 -15:43:40,18.9684,25.312,25.769,100.0,35.0 -15:43:40,19.0110,25.287,25.819,100.0,35.0 -15:43:40,19.0522,25.287,25.769,100.0,35.0 -15:43:40,19.0929,25.312,25.794,100.0,35.0 -15:43:40,19.1335,25.312,25.794,100.0,35.0 -15:43:40,19.1753,25.287,25.794,100.0,35.0 -15:43:40,19.2158,25.338,25.794,100.0,35.0 -15:43:40,19.2584,25.312,25.769,100.0,35.0 -15:43:40,19.3023,25.312,25.794,100.0,35.0 -15:43:40,19.3438,25.312,25.794,100.0,35.0 -15:43:40,19.3856,25.312,25.794,100.0,35.0 -15:43:40,19.4275,25.338,25.794,100.0,35.0 -15:43:40,19.4689,25.287,25.794,100.0,35.0 -15:43:40,19.5107,25.338,25.794,100.0,35.0 -15:43:40,19.5538,25.312,25.819,100.0,35.0 -15:43:40,19.5976,25.338,25.743,100.0,35.0 -15:43:40,19.6396,25.338,25.845,100.0,35.0 -15:43:40,19.6865,25.414,25.819,100.0,35.0 -15:43:40,19.7281,25.338,25.819,100.0,35.0 -15:43:40,19.7706,25.363,25.819,100.0,35.0 -15:43:41,19.8141,25.363,25.819,100.0,35.0 -15:43:41,19.8574,25.363,25.819,100.0,35.0 -15:43:41,19.9020,25.388,25.819,100.0,35.0 -15:43:41,19.9466,25.363,25.819,100.0,35.0 -15:43:41,19.9958,25.363,25.819,100.0,35.0 -15:43:41,20.0380,25.388,25.87,100.0,35.0 -15:43:41,20.0817,25.388,25.845,100.0,35.0 -15:43:41,20.1243,25.388,25.819,100.0,35.0 -15:43:41,20.1695,25.388,25.845,100.0,35.0 -15:43:41,20.2150,25.363,25.845,100.0,35.0 -15:43:41,20.2589,25.388,25.845,100.0,35.0 -15:43:41,20.3021,25.388,25.87,100.0,35.0 -15:43:41,20.3487,25.363,25.845,100.0,35.0 -15:43:41,20.3956,25.388,25.87,100.0,35.0 -15:43:41,20.4426,25.388,25.895,100.0,35.0 -15:43:41,20.4875,25.388,25.87,100.0,35.0 -15:43:41,20.5337,25.414,25.87,100.0,35.0 -15:43:41,20.5806,25.388,25.87,100.0,35.0 -15:43:41,20.6315,25.388,25.921,100.0,35.0 -15:43:41,20.6775,25.414,25.87,100.0,35.0 -15:43:41,20.7228,25.439,25.87,100.0,35.0 -15:43:41,20.7707,25.388,25.87,100.0,35.0 -15:43:42,20.8176,25.414,25.895,100.0,35.0 -15:43:42,20.8660,25.414,25.87,100.0,35.0 -15:43:42,20.9104,25.414,25.921,100.0,35.0 -15:43:42,20.9557,25.49,25.895,100.0,35.0 -15:43:42,21.0038,25.414,25.895,100.0,35.0 -15:43:42,21.0519,25.414,25.895,100.0,35.0 -15:43:42,21.1002,25.439,25.895,100.0,35.0 -15:43:42,21.1453,25.439,25.921,100.0,35.0 -15:43:42,21.1914,25.414,25.921,100.0,35.0 -15:43:42,21.2369,25.414,25.895,100.0,35.0 -15:43:42,21.2861,25.414,25.87,100.0,35.0 -15:43:42,21.3366,25.49,25.921,100.0,35.0 -15:43:42,21.3848,25.414,25.921,100.0,35.0 -15:43:42,21.4336,25.49,25.921,100.0,35.0 -15:43:42,21.4818,25.464,25.946,100.0,35.0 -15:43:42,21.5286,25.464,25.921,100.0,35.0 -15:43:42,21.5747,25.464,25.921,100.0,35.0 -15:43:42,21.6201,25.49,25.921,100.0,35.0 -15:43:42,21.6703,25.49,25.921,100.0,35.0 -15:43:42,21.7189,25.49,25.946,100.0,35.0 -15:43:42,21.7687,25.464,25.921,100.0,35.0 -15:43:43,21.8151,25.515,25.921,100.0,35.0 -15:43:43,21.8630,25.49,25.946,100.0,35.0 -15:43:43,21.9087,25.49,25.921,100.0,35.0 -15:43:43,21.9547,25.49,25.921,100.0,35.0 -15:43:43,22.0022,25.515,25.921,100.0,35.0 -15:43:43,22.0487,25.49,25.972,100.0,35.0 -15:43:43,22.0945,25.515,25.972,100.0,35.0 -15:43:43,22.1410,25.54,25.946,100.0,35.0 -15:43:43,22.1893,25.49,25.946,100.0,35.0 -15:43:43,22.2387,25.515,25.997,100.0,35.0 -15:43:43,22.2844,25.515,25.972,100.0,35.0 -15:43:43,22.3273,25.515,25.946,100.0,35.0 -15:43:43,22.3702,25.515,25.972,100.0,35.0 -15:43:43,22.4145,25.515,25.946,100.0,35.0 -15:43:43,22.4583,25.54,25.946,100.0,35.0 -15:43:43,22.5013,25.54,25.972,100.0,35.0 -15:43:43,22.5472,25.54,25.972,100.0,35.0 -15:43:43,22.5910,25.439,25.972,100.0,35.0 -15:43:43,22.6362,25.54,25.972,100.0,35.0 -15:43:43,22.6837,25.54,25.972,100.0,35.0 -15:43:43,22.7276,25.54,25.972,100.0,35.0 -15:43:43,22.7722,25.54,25.997,100.0,35.0 -15:43:44,22.8182,25.54,25.972,100.0,35.0 -15:43:44,22.8644,25.54,25.972,100.0,35.0 -15:43:44,22.9120,25.54,25.997,100.0,35.0 -15:43:44,22.9586,25.566,25.997,100.0,35.0 -15:43:44,23.0048,25.515,25.997,100.0,35.0 -15:43:44,23.0521,25.566,26.023,100.0,35.0 -15:43:44,23.1004,25.566,25.997,100.0,35.0 -15:43:44,23.1457,25.566,26.023,100.0,35.0 -15:43:44,23.1914,25.591,26.023,100.0,35.0 -15:43:44,23.2372,25.591,26.023,100.0,35.0 -15:43:44,23.2865,25.591,26.048,100.0,35.0 -15:43:44,23.3338,25.591,26.023,100.0,35.0 -15:43:44,23.3826,25.591,26.023,100.0,35.0 -15:43:44,23.4291,25.566,26.023,100.0,35.0 -15:43:44,23.4774,25.591,26.023,100.0,35.0 -15:43:44,23.5215,25.566,26.023,100.0,35.0 -15:43:44,23.5663,25.591,25.997,100.0,35.0 -15:43:44,23.6107,25.566,26.023,100.0,35.0 -15:43:44,23.6555,25.591,26.048,100.0,35.0 -15:43:44,23.7028,25.591,26.048,100.0,35.0 -15:43:44,23.7493,25.616,26.048,100.0,35.0 -15:43:44,23.7943,25.616,26.048,100.0,35.0 -15:43:45,23.8384,25.616,26.073,100.0,35.0 -15:43:45,23.8853,25.616,26.048,100.0,35.0 -15:43:45,23.9321,25.591,26.023,100.0,35.0 -15:43:45,23.9771,25.616,26.048,100.0,35.0 -15:43:45,24.0207,25.616,26.048,100.0,35.0 -15:43:45,24.0673,25.642,26.048,100.0,35.0 -15:43:45,24.1113,25.642,26.073,100.0,35.0 -15:43:45,24.1575,25.642,26.073,100.0,35.0 -15:43:45,24.2009,25.616,26.073,100.0,35.0 -15:43:45,24.2451,25.642,26.073,100.0,35.0 -15:43:45,24.2906,25.642,26.073,100.0,35.0 -15:43:45,24.3349,25.591,26.099,100.0,35.0 -15:43:45,24.3805,25.642,26.048,100.0,35.0 -15:43:45,24.4246,25.616,26.099,100.0,35.0 -15:43:45,24.4688,25.642,26.073,100.0,35.0 -15:43:45,24.5149,25.667,26.048,100.0,35.0 -15:43:45,24.5601,25.667,26.099,100.0,35.0 -15:43:45,24.6046,25.667,26.073,100.0,35.0 -15:43:45,24.6513,25.667,26.099,100.0,35.0 -15:43:45,24.6989,25.591,26.099,100.0,35.0 -15:43:45,24.7445,25.667,26.099,100.0,35.0 -15:43:45,24.7907,25.667,26.099,100.0,35.0 -15:43:46,24.8354,25.718,26.124,100.0,35.0 -15:43:46,24.8825,25.667,26.048,100.0,35.0 -15:43:46,24.9273,25.692,26.124,100.0,35.0 -15:43:46,24.9752,25.692,26.099,100.0,35.0 -15:43:46,25.0195,25.692,26.099,100.0,35.0 -15:43:46,25.0665,25.692,26.073,100.0,35.0 -15:43:46,25.1113,25.692,26.124,100.0,35.0 -15:43:46,25.1570,25.692,26.099,100.0,35.0 -15:43:46,25.2022,25.692,26.124,100.0,35.0 -15:43:46,25.2497,25.743,26.099,100.0,35.0 -15:43:46,25.2946,25.692,26.124,100.0,35.0 -15:43:46,25.3404,25.718,26.15,100.0,35.0 -15:43:46,25.3859,25.718,26.099,100.0,35.0 -15:43:46,25.4310,25.743,26.124,100.0,35.0 -15:43:46,25.4764,25.718,26.15,100.0,35.0 -15:43:46,25.5217,25.718,26.124,100.0,35.0 -15:43:46,25.5660,25.743,26.175,100.0,35.0 -15:43:46,25.6105,25.718,26.15,100.0,35.0 -15:43:46,25.6560,25.743,26.15,100.0,35.0 -15:43:46,25.7016,25.743,26.201,100.0,35.0 -15:43:46,25.7510,25.743,26.175,100.0,35.0 -15:43:46,25.7997,25.743,26.175,100.0,35.0 -15:43:47,25.8490,25.743,26.175,100.0,35.0 -15:43:47,25.8980,25.743,26.15,100.0,35.0 -15:43:47,25.9442,25.743,26.15,100.0,35.0 -15:43:47,25.9906,25.743,26.175,100.0,35.0 -15:43:47,26.0352,25.769,26.175,100.0,35.0 -15:43:47,26.0825,25.769,26.175,100.0,35.0 -15:43:47,26.1288,25.769,26.175,100.0,35.0 -15:43:47,26.1746,25.769,26.175,100.0,35.0 -15:43:47,26.2187,25.769,26.201,100.0,35.0 -15:43:47,26.2664,25.794,26.201,100.0,35.0 -15:43:47,26.3108,25.769,26.201,100.0,35.0 -15:43:47,26.3572,25.794,26.201,100.0,35.0 -15:43:47,26.4014,25.794,26.201,100.0,35.0 -15:43:47,26.4489,25.794,26.226,100.0,35.0 -15:43:47,26.4956,25.769,26.201,100.0,35.0 -15:43:47,26.5411,25.794,26.201,100.0,35.0 -15:43:47,26.5916,25.845,26.201,100.0,35.0 -15:43:47,26.6362,25.794,26.201,100.0,35.0 -15:43:47,26.6845,25.743,26.226,100.0,35.0 -15:43:47,26.7331,25.819,26.226,100.0,35.0 -15:43:47,26.7785,25.794,26.226,100.0,35.0 -15:43:48,26.8236,25.819,26.226,100.0,35.0 -15:43:48,26.8697,25.819,26.277,100.0,35.0 -15:43:48,26.9177,25.819,26.226,100.0,35.0 -15:43:48,26.9662,25.845,26.226,100.0,35.0 -15:43:48,27.0126,25.845,26.252,100.0,35.0 -15:43:48,27.0576,25.769,26.252,100.0,35.0 -15:43:48,27.1020,25.845,26.252,100.0,35.0 -15:43:48,27.1497,25.819,26.252,100.0,35.0 -15:43:48,27.1947,25.87,26.175,100.0,35.0 -15:43:48,27.2404,25.845,26.226,100.0,35.0 -15:43:48,27.2852,25.845,26.252,100.0,35.0 -15:43:48,27.3328,25.895,26.226,100.0,35.0 -15:43:48,27.3776,25.845,26.175,100.0,35.0 -15:43:48,27.4237,25.769,26.277,100.0,35.0 -15:43:48,27.4686,25.87,26.277,100.0,35.0 -15:43:48,27.5174,25.87,26.252,100.0,35.0 -15:43:48,27.5658,25.87,26.277,100.0,35.0 -15:43:48,27.6115,25.87,26.303,100.0,35.0 -15:43:48,27.6572,25.895,26.277,100.0,35.0 -15:43:48,27.7025,25.87,26.277,100.0,35.0 -15:43:48,27.7514,25.87,26.303,100.0,35.0 -15:43:48,27.8010,25.87,26.303,100.0,35.0 -15:43:49,27.8474,25.87,26.303,100.0,35.0 -15:43:49,27.8938,25.895,26.303,100.0,35.0 -15:43:49,27.9401,25.895,26.226,100.0,35.0 -15:43:49,27.9857,25.895,26.303,100.0,35.0 -15:43:49,28.0334,25.895,26.303,100.0,35.0 -15:43:49,28.0800,25.921,26.303,100.0,35.0 -15:43:49,28.1273,25.921,26.328,100.0,35.0 -15:43:49,28.1726,25.921,26.303,100.0,35.0 -15:43:49,28.2183,25.921,26.328,100.0,35.0 -15:43:49,28.2667,25.921,26.303,100.0,35.0 -15:43:49,28.3131,25.921,26.328,100.0,35.0 -15:43:49,28.3614,25.946,26.328,100.0,35.0 -15:43:49,28.4082,25.946,26.328,100.0,35.0 -15:43:49,28.4551,25.895,26.328,100.0,35.0 -15:43:49,28.5008,25.921,26.328,100.0,35.0 -15:43:49,28.5448,25.946,26.353,100.0,35.0 -15:43:49,28.5885,25.921,26.328,100.0,35.0 -15:43:49,28.6356,25.997,26.328,100.0,35.0 -15:43:49,28.6837,25.946,26.328,100.0,35.0 -15:43:49,28.7307,25.972,26.303,100.0,35.0 -15:43:49,28.7784,25.946,26.353,100.0,35.0 -15:43:50,28.8244,25.946,26.353,100.0,35.0 -15:43:50,28.8691,25.946,26.353,100.0,35.0 -15:43:50,28.9161,25.946,26.328,100.0,35.0 -15:43:50,28.9646,25.972,26.43,100.0,35.0 -15:43:50,29.0108,25.997,26.379,100.0,35.0 -15:43:50,29.0567,25.972,26.379,100.0,35.0 -15:43:50,29.1026,25.972,26.379,100.0,35.0 -15:43:50,29.1497,25.972,26.404,100.0,35.0 -15:43:50,29.1971,26.023,26.328,100.0,35.0 -15:43:50,29.2423,25.972,26.379,100.0,35.0 -15:43:50,29.2891,25.972,26.353,100.0,35.0 -15:43:50,29.3366,26.023,26.404,100.0,35.0 -15:43:50,29.3850,25.997,26.404,100.0,35.0 -15:43:50,29.4321,25.997,26.379,100.0,35.0 -15:43:50,29.4804,25.997,26.404,100.0,35.0 -15:43:50,29.5264,26.023,26.404,100.0,35.0 -15:43:50,29.5733,25.997,26.404,100.0,35.0 -15:43:50,29.6199,25.997,26.404,100.0,35.0 -15:43:50,29.6658,26.073,26.404,100.0,35.0 -15:43:50,29.7150,26.023,26.404,100.0,35.0 -15:43:50,29.7653,25.972,26.43,100.0,35.0 -15:43:51,29.8133,26.023,26.404,100.0,35.0 -15:43:51,29.8596,26.023,26.455,100.0,35.0 -15:43:51,29.9053,26.023,26.43,100.0,35.0 -15:43:51,29.9508,26.023,26.43,100.0,35.0 -15:43:51,30.0243,26.048,26.404,100.0,35.0 -15:43:51,30.0753,26.048,26.43,100.0,35.0 -15:43:51,30.1263,26.048,26.379,100.0,35.0 -15:43:51,30.1741,26.023,26.43,100.0,35.0 -15:43:51,30.2212,26.048,26.43,100.0,35.0 -15:43:51,30.2706,26.048,26.43,100.0,35.0 -15:43:51,30.3546,26.048,26.481,100.0,35.0 -15:43:51,30.4245,26.099,26.455,100.0,35.0 -15:43:51,30.4865,26.048,26.455,100.0,35.0 -15:43:51,30.5511,26.073,26.455,100.0,35.0 -15:43:51,30.6262,26.073,26.455,100.0,35.0 -15:43:51,30.6868,26.124,26.455,100.0,35.0 -15:43:51,30.7467,26.099,26.481,100.0,35.0 -15:43:51,30.8074,26.073,26.481,100.0,35.0 -15:43:52,30.8686,26.124,26.481,100.0,35.0 -15:43:52,30.9336,26.073,26.481,100.0,35.0 -15:43:52,30.9971,26.099,26.481,100.0,35.0 -15:43:52,31.0546,26.099,26.455,100.0,35.0 -15:43:52,31.1130,26.099,26.506,100.0,35.0 -15:43:52,31.1738,26.099,26.481,100.0,35.0 -15:43:52,31.2353,26.124,26.506,100.0,35.0 -15:43:52,31.2996,26.124,26.455,100.0,35.0 -15:43:52,31.3604,26.099,26.506,100.0,35.0 -15:43:52,31.4175,26.124,26.506,100.0,35.0 -15:43:52,31.4762,26.124,26.558,100.0,35.0 -15:43:52,31.5329,26.175,26.532,100.0,35.0 -15:43:52,31.5884,26.15,26.558,100.0,35.0 -15:43:52,31.6358,26.15,26.583,100.0,35.0 -15:43:52,31.6851,26.15,26.506,100.0,35.0 -15:43:52,31.7330,26.124,26.558,100.0,35.0 -15:43:52,31.7819,26.15,26.558,100.0,35.0 -15:43:53,31.8296,26.15,26.532,100.0,35.0 -15:43:53,31.8853,26.15,26.558,100.0,35.0 -15:43:53,31.9469,26.15,26.558,100.0,35.0 -15:43:53,31.9958,26.175,26.583,100.0,35.0 -15:43:53,32.0436,26.175,26.558,100.0,35.0 -15:43:53,32.0915,26.175,26.558,100.0,35.0 -15:43:53,32.1417,26.175,26.558,100.0,35.0 -15:43:53,32.1917,26.201,26.583,100.0,35.0 -15:43:53,32.2395,26.175,26.583,100.0,35.0 -15:43:53,32.2872,26.201,26.583,100.0,35.0 -15:43:53,32.3382,26.252,26.558,100.0,35.0 -15:43:53,32.3888,26.175,26.583,100.0,35.0 -15:43:53,32.4361,26.201,26.506,100.0,35.0 -15:43:53,32.4874,26.226,26.583,100.0,35.0 -15:43:53,32.5370,26.201,26.583,100.0,35.0 -15:43:53,32.5859,26.226,26.583,100.0,35.0 -15:43:53,32.6345,26.201,26.583,100.0,35.0 -15:43:53,32.6825,26.226,26.609,100.0,35.0 -15:43:53,32.7277,26.226,26.583,100.0,35.0 -15:43:53,32.7727,26.226,26.609,100.0,35.0 -15:43:54,32.8178,26.277,26.634,100.0,35.0 -15:43:54,32.8651,26.226,26.609,100.0,35.0 -15:43:54,32.9132,26.252,26.609,100.0,35.0 -15:43:54,32.9581,26.226,26.609,100.0,35.0 -15:43:54,33.0056,26.226,26.609,100.0,35.0 -15:43:54,33.0507,26.226,26.558,100.0,35.0 -15:43:54,33.0982,26.252,26.634,100.0,35.0 -15:43:54,33.1468,26.226,26.634,100.0,35.0 -15:43:54,33.1942,26.252,26.634,100.0,35.0 -15:43:54,33.2399,26.252,26.609,100.0,35.0 -15:43:54,33.2854,26.252,26.634,100.0,35.0 -15:43:54,33.3332,26.252,26.609,100.0,35.0 -15:43:54,33.3805,26.277,26.66,100.0,35.0 -15:43:54,33.4258,26.252,26.66,100.0,35.0 -15:43:54,33.4707,26.252,26.634,100.0,35.0 -15:43:54,33.5174,26.277,26.634,100.0,35.0 -15:43:54,33.5654,26.226,26.66,100.0,35.0 -15:43:54,33.6144,26.277,26.711,100.0,35.0 -15:43:54,33.6597,26.277,26.66,100.0,35.0 -15:43:54,33.7059,26.277,26.609,100.0,35.0 -15:43:54,33.7505,26.277,26.66,100.0,35.0 -15:43:54,33.7991,26.303,26.66,100.0,35.0 -15:43:55,33.8474,26.303,26.583,100.0,35.0 -15:43:55,33.8941,26.328,26.66,100.0,35.0 -15:43:55,33.9394,26.353,26.685,100.0,35.0 -15:43:55,33.9841,26.277,26.66,100.0,35.0 -15:43:55,34.0320,26.277,26.685,100.0,35.0 -15:43:55,34.0778,26.328,26.685,100.0,35.0 -15:43:55,34.1247,26.303,26.66,100.0,35.0 -15:43:55,34.1702,26.379,26.685,100.0,35.0 -15:43:55,34.2172,26.328,26.685,100.0,35.0 -15:43:55,34.2646,26.328,26.711,100.0,35.0 -15:43:55,34.3141,26.277,26.685,100.0,35.0 -15:43:55,34.3593,26.328,26.711,100.0,35.0 -15:43:55,34.4068,26.328,26.711,100.0,35.0 -15:43:55,34.4527,26.328,26.685,100.0,35.0 -15:43:55,34.5003,26.328,26.736,100.0,35.0 -15:43:55,34.5481,26.353,26.711,100.0,35.0 -15:43:55,34.5974,26.353,26.711,100.0,35.0 -15:43:55,34.6454,26.353,26.711,100.0,35.0 -15:43:55,34.6924,26.353,26.736,100.0,35.0 -15:43:55,34.7389,26.328,26.711,100.0,35.0 -15:43:55,34.7858,26.353,26.685,100.0,35.0 -15:43:56,34.8347,26.353,26.736,100.0,35.0 -15:43:56,34.8836,26.353,26.736,100.0,35.0 -15:43:56,34.9315,26.379,26.736,100.0,35.0 -15:43:56,34.9883,26.353,26.762,100.0,35.0 -15:43:56,35.0353,26.353,26.685,100.0,35.0 -15:43:56,35.0828,26.379,26.736,100.0,35.0 -15:43:56,35.1322,26.379,26.711,100.0,35.0 -15:43:56,35.1826,26.379,26.787,100.0,35.0 -15:43:56,35.2333,26.404,26.736,100.0,35.0 -15:43:56,35.2837,26.379,26.736,100.0,35.0 -15:43:56,35.3323,26.404,26.685,100.0,35.0 -15:43:56,35.3846,26.404,26.762,100.0,35.0 -15:43:56,35.4331,26.43,26.762,100.0,35.0 -15:43:56,35.4823,26.404,26.762,100.0,35.0 -15:43:56,35.5307,26.404,26.762,100.0,35.0 -15:43:56,35.5762,26.404,26.762,100.0,35.0 -15:43:56,35.6238,26.43,26.787,100.0,35.0 -15:43:56,35.6687,26.404,26.787,100.0,35.0 -15:43:56,35.7179,26.43,26.762,100.0,35.0 -15:43:56,35.7670,26.43,26.787,100.0,35.0 -15:43:57,35.8168,26.455,26.813,100.0,35.0 -15:43:57,35.8654,26.455,26.787,100.0,35.0 -15:43:57,35.9126,26.353,26.787,100.0,35.0 -15:43:57,35.9593,26.455,26.813,100.0,35.0 -15:43:57,36.0074,26.455,26.813,100.0,35.0 -15:43:57,36.0988,26.43,26.762,100.0,35.0 -15:43:57,36.1484,26.43,26.839,100.0,35.0 -15:43:57,36.1950,26.455,26.813,100.0,35.0 -15:43:57,36.2421,26.455,26.787,100.0,35.0 -15:43:57,36.2895,26.43,26.813,100.0,35.0 -15:43:57,36.3361,26.455,26.813,100.0,35.0 -15:43:57,36.3847,26.481,26.813,100.0,35.0 -15:43:57,36.4334,26.455,26.813,100.0,35.0 -15:43:57,36.4833,26.455,26.813,100.0,35.0 -15:43:57,36.5305,26.481,26.813,100.0,35.0 -15:43:57,36.5782,26.455,26.839,100.0,35.0 -15:43:57,36.6186,26.481,26.839,100.0,35.0 -15:43:57,36.6614,26.481,26.839,100.0,35.0 -15:43:57,36.7038,26.481,26.813,100.0,35.0 -15:43:57,36.7440,26.506,26.839,100.0,35.0 -15:43:57,36.7853,26.506,26.839,100.0,35.0 -15:43:58,36.8277,26.481,26.839,100.0,35.0 -15:43:58,36.8687,26.481,26.864,100.0,35.0 -15:43:58,36.9127,26.481,26.839,100.0,35.0 -15:43:58,36.9549,26.506,26.941,100.0,35.0 -15:43:58,36.9963,26.506,26.864,100.0,35.0 -15:43:58,37.0368,26.506,26.864,100.0,35.0 -15:43:58,37.0791,26.532,26.864,100.0,35.0 -15:43:58,37.1202,26.506,26.864,100.0,35.0 -15:43:58,37.1645,26.532,26.839,100.0,35.0 -15:43:58,37.2068,26.532,26.864,100.0,35.0 -15:43:58,37.2477,26.532,26.89,100.0,35.0 -15:43:58,37.2870,26.532,26.89,100.0,35.0 -15:43:58,37.3343,26.558,26.864,100.0,35.0 -15:43:58,37.3796,26.506,26.89,100.0,35.0 -15:43:58,37.4190,26.532,26.89,100.0,35.0 -15:43:58,37.4616,26.532,26.89,100.0,35.0 -15:43:58,37.5033,26.532,26.89,100.0,35.0 -15:43:58,37.5443,26.532,26.89,100.0,35.0 -15:43:58,37.5873,26.532,26.915,100.0,35.0 -15:43:58,37.6280,26.558,26.89,100.0,35.0 -15:43:58,37.6687,26.558,26.864,100.0,35.0 -15:43:58,37.7126,26.558,26.915,100.0,35.0 -15:43:58,37.7556,26.558,26.941,100.0,35.0 -15:43:58,37.7977,26.558,26.915,100.0,35.0 -15:43:59,37.8403,26.558,26.915,100.0,35.0 -15:43:59,37.8824,26.558,26.915,100.0,35.0 -15:43:59,37.9265,26.634,26.941,100.0,35.0 -15:43:59,37.9679,26.558,26.941,100.0,35.0 -15:43:59,38.0114,26.609,26.915,100.0,35.0 -15:43:59,38.0518,26.558,26.915,100.0,35.0 -15:43:59,38.0951,26.609,26.941,100.0,35.0 -15:43:59,38.1366,26.583,26.941,100.0,35.0 -15:43:59,38.1802,26.634,26.941,100.0,35.0 -15:43:59,38.2236,26.583,26.941,100.0,35.0 -15:43:59,38.2658,26.609,26.941,100.0,35.0 -15:43:59,38.3097,26.609,26.915,100.0,35.0 -15:43:59,38.3516,26.634,26.967,100.0,35.0 -15:43:59,38.3936,26.609,26.941,100.0,35.0 -15:43:59,38.4370,26.634,27.043,100.0,35.0 -15:43:59,38.4778,26.634,26.89,100.0,35.0 -15:43:59,38.5195,26.685,26.864,100.0,35.0 -15:43:59,38.5605,26.66,26.941,100.0,35.0 -15:43:59,38.6015,26.685,26.967,100.0,35.0 -15:43:59,38.6468,26.634,26.967,100.0,35.0 -15:43:59,38.6903,26.634,26.967,100.0,35.0 -15:43:59,38.7300,26.685,26.992,100.0,35.0 -15:43:59,38.7724,26.736,27.018,100.0,35.0 -15:44:00,38.8136,26.685,27.018,100.0,35.0 -15:44:00,38.8573,26.685,26.992,100.0,35.0 -15:44:00,38.8990,26.711,26.992,100.0,35.0 -15:44:00,38.9438,26.711,26.992,100.0,35.0 -15:44:00,38.9861,26.685,26.967,100.0,35.0 -15:44:00,39.0303,26.711,26.992,100.0,35.0 -15:44:00,39.0735,26.634,27.018,100.0,35.0 -15:44:00,39.1145,26.685,26.992,100.0,35.0 -15:44:00,39.1727,26.685,26.941,100.0,35.0 -15:44:00,39.2219,26.711,27.018,100.0,35.0 -15:44:00,39.2641,26.711,27.069,100.0,35.0 -15:44:00,39.3074,26.66,27.043,100.0,35.0 -15:44:00,39.3484,26.685,27.018,100.0,35.0 -15:44:00,39.3908,26.736,26.992,100.0,35.0 -15:44:00,39.4320,26.685,27.018,100.0,35.0 -15:44:00,39.4753,26.762,27.043,100.0,35.0 -15:44:00,39.5162,26.762,27.018,100.0,35.0 -15:44:00,39.5589,26.736,27.043,100.0,35.0 -15:44:00,39.5990,26.736,27.069,100.0,35.0 -15:44:00,39.6432,26.736,27.018,100.0,35.0 -15:44:00,39.6845,26.736,27.043,100.0,35.0 -15:44:00,39.7274,26.736,27.043,100.0,35.0 -15:44:00,39.7705,26.762,27.043,100.0,35.0 -15:44:01,39.8105,26.711,27.043,100.0,35.0 -15:44:01,39.8514,26.762,27.043,100.0,35.0 -15:44:01,39.8957,26.762,27.069,100.0,35.0 -15:44:01,39.9377,26.762,27.069,100.0,35.0 -15:44:01,39.9778,26.762,27.069,100.0,35.0 -15:44:01,40.0196,26.762,27.069,100.0,35.0 -15:44:01,40.0598,26.762,27.069,100.0,35.0 -15:44:01,40.1012,26.787,27.095,100.0,35.0 -15:44:01,40.1441,26.762,27.069,100.0,35.0 -15:44:01,40.1844,26.762,27.069,100.0,35.0 -15:44:01,40.2278,26.762,27.095,100.0,35.0 -15:44:01,40.2689,26.787,27.095,100.0,35.0 -15:44:01,40.3125,26.813,27.069,100.0,35.0 -15:44:01,40.3539,26.787,27.069,100.0,35.0 -15:44:01,40.3946,26.787,27.095,100.0,35.0 -15:44:01,40.4347,26.813,27.069,100.0,35.0 -15:44:01,40.4779,26.787,27.095,100.0,35.0 -15:44:01,40.5194,26.787,27.095,100.0,35.0 -15:44:01,40.5604,26.787,27.095,100.0,35.0 -15:44:01,40.6022,26.813,27.095,100.0,35.0 -15:44:01,40.6469,26.813,27.12,100.0,35.0 -15:44:01,40.6898,26.839,27.095,100.0,35.0 -15:44:01,40.7300,26.787,27.095,100.0,35.0 -15:44:01,40.7757,26.839,27.12,100.0,35.0 -15:44:02,40.8266,26.787,27.12,100.0,35.0 -15:44:02,40.8790,26.839,27.12,100.0,35.0 -15:44:02,40.9307,26.787,27.12,100.0,35.0 -15:44:02,40.9738,26.813,27.12,100.0,35.0 -15:44:02,41.0173,26.839,27.12,100.0,35.0 -15:44:02,41.0610,26.839,27.12,100.0,35.0 -15:44:02,41.1032,26.89,27.146,100.0,35.0 -15:44:02,41.1444,26.839,27.146,100.0,35.0 -15:44:02,41.1861,26.787,27.12,100.0,35.0 -15:44:02,41.2274,26.864,27.095,100.0,35.0 -15:44:02,41.2699,26.839,27.146,100.0,35.0 -15:44:02,41.3116,26.915,27.146,100.0,35.0 -15:44:02,41.3526,26.915,27.146,100.0,35.0 -15:44:02,41.3970,26.915,27.146,100.0,35.0 -15:44:02,41.4456,26.89,27.146,100.0,35.0 -15:44:02,41.4863,26.864,27.172,100.0,35.0 -15:44:02,41.5275,26.864,27.172,100.0,35.0 -15:44:02,41.5672,26.864,27.172,100.0,35.0 -15:44:02,41.6085,26.787,27.172,100.0,35.0 -15:44:02,41.6495,26.89,27.172,100.0,35.0 -15:44:02,41.6910,26.915,27.172,100.0,35.0 -15:44:02,41.7327,26.864,27.172,100.0,35.0 -15:44:02,41.7768,26.89,27.172,100.0,35.0 -15:44:03,41.8167,26.89,27.172,100.0,35.0 -15:44:03,41.8587,26.864,27.197,100.0,35.0 -15:44:03,41.8982,26.839,27.223,100.0,35.0 -15:44:03,41.9408,26.89,27.197,100.0,35.0 -15:44:03,41.9813,26.89,27.172,100.0,35.0 -15:44:03,42.0227,26.89,27.197,100.0,35.0 -15:44:03,42.0630,26.915,27.223,100.0,35.0 -15:44:03,42.1058,26.864,27.223,100.0,35.0 -15:44:03,42.1476,26.89,27.172,100.0,35.0 -15:44:03,42.1897,26.813,27.223,100.0,35.0 -15:44:03,42.2285,26.915,27.172,100.0,35.0 -15:44:03,42.2686,26.89,27.223,100.0,35.0 -15:44:03,42.3126,26.941,27.274,100.0,35.0 -15:44:03,42.3560,26.915,27.223,100.0,35.0 -15:44:03,42.3970,26.915,27.197,100.0,35.0 -15:44:03,42.4434,26.915,27.223,100.0,35.0 -15:44:03,42.4885,26.941,27.223,100.0,35.0 -15:44:03,42.5313,26.89,27.197,100.0,35.0 -15:44:03,42.5768,26.941,27.249,100.0,35.0 -15:44:03,42.6189,26.915,27.223,100.0,35.0 -15:44:03,42.6610,26.941,27.249,100.0,35.0 -15:44:03,42.7037,26.941,27.249,100.0,35.0 -15:44:03,42.7448,26.941,27.249,100.0,35.0 -15:44:03,42.7886,26.967,27.3,100.0,35.0 -15:44:04,42.8309,26.941,27.223,100.0,35.0 -15:44:04,42.8743,26.967,27.274,100.0,35.0 -15:44:04,42.9179,26.967,27.274,100.0,35.0 -15:44:04,42.9626,26.967,27.3,100.0,35.0 -15:44:04,43.0056,27.043,27.274,100.0,35.0 -15:44:04,43.0466,26.941,27.274,100.0,35.0 -15:44:04,43.0907,26.992,27.274,100.0,35.0 -15:44:04,43.1340,26.992,27.274,100.0,35.0 -15:44:04,43.1787,26.967,27.3,100.0,35.0 -15:44:04,43.2209,26.967,27.3,100.0,35.0 -15:44:04,43.2637,26.967,27.274,100.0,35.0 -15:44:04,43.3070,26.992,27.274,100.0,35.0 -15:44:04,43.3491,26.992,27.3,100.0,35.0 -15:44:04,43.3944,26.992,27.326,100.0,35.0 -15:44:04,43.4409,26.967,27.3,100.0,35.0 -15:44:04,43.4854,27.018,27.3,100.0,35.0 -15:44:04,43.5277,26.992,27.351,100.0,35.0 -15:44:04,43.5716,27.018,27.351,100.0,35.0 -15:44:04,43.6135,27.043,27.326,100.0,35.0 -15:44:04,43.6596,26.992,27.351,100.0,35.0 -15:44:04,43.7018,27.018,27.351,100.0,35.0 -15:44:04,43.7436,26.992,27.351,100.0,35.0 -15:44:04,43.7901,27.043,27.351,100.0,35.0 -15:44:05,43.8344,27.043,27.351,100.0,35.0 -15:44:05,43.8801,27.043,27.351,100.0,35.0 -15:44:05,43.9247,27.043,27.403,100.0,35.0 -15:44:05,43.9704,27.069,27.377,100.0,35.0 -15:44:05,44.0117,27.095,27.351,100.0,35.0 -15:44:05,44.0538,26.992,27.377,100.0,35.0 -15:44:05,44.0961,27.043,27.377,100.0,35.0 -15:44:05,44.1402,27.043,27.377,100.0,35.0 -15:44:05,44.1834,27.043,27.377,100.0,35.0 -15:44:05,44.2264,27.069,27.377,100.0,35.0 -15:44:05,44.2692,27.018,27.403,100.0,35.0 -15:44:05,44.3122,27.069,27.377,100.0,35.0 -15:44:05,44.3552,27.095,27.351,100.0,35.0 -15:44:05,44.3980,27.069,27.377,100.0,35.0 -15:44:05,44.4428,27.069,27.403,100.0,35.0 -15:44:05,44.4869,27.069,27.377,100.0,35.0 -15:44:05,44.5301,27.095,27.403,100.0,35.0 -15:44:05,44.5738,27.069,27.403,100.0,35.0 -15:44:05,44.6204,27.12,27.428,100.0,35.0 -15:44:05,44.6641,27.095,27.403,100.0,35.0 -15:44:05,44.7092,27.069,27.428,100.0,35.0 -15:44:05,44.7532,27.12,27.428,100.0,35.0 -15:44:05,44.7963,27.172,27.428,100.0,35.0 -15:44:06,44.8390,27.095,27.454,100.0,35.0 -15:44:06,44.8820,27.095,27.428,100.0,35.0 -15:44:06,44.9275,27.12,27.428,100.0,35.0 -15:44:06,44.9707,27.095,27.454,100.0,35.0 -15:44:06,45.0349,27.12,27.428,100.0,35.0 -15:44:06,45.0837,27.095,27.454,100.0,35.0 -15:44:06,45.1321,27.12,27.428,100.0,35.0 -15:44:06,45.1772,27.069,27.454,100.0,35.0 -15:44:06,45.2196,27.12,27.454,100.0,35.0 -15:44:06,45.2622,27.12,27.454,100.0,35.0 -15:44:06,45.3133,27.12,27.454,100.0,35.0 -15:44:06,45.3789,27.12,27.454,100.0,35.0 -15:44:06,45.4387,27.12,27.454,100.0,35.0 -15:44:06,45.4877,27.146,27.454,100.0,35.0 -15:44:06,45.5408,27.146,27.48,100.0,35.0 -15:44:06,45.5886,27.146,27.48,100.0,35.0 -15:44:06,45.6373,27.197,27.506,100.0,35.0 -15:44:06,45.6934,27.146,27.583,100.0,35.0 -15:44:06,45.7445,27.172,27.48,100.0,35.0 -15:44:06,45.8051,27.146,27.48,100.0,35.0 -15:44:07,45.8590,27.146,27.48,100.0,35.0 -15:44:07,45.9172,27.249,27.48,100.0,35.0 -15:44:07,45.9784,27.172,27.506,100.0,35.0 -15:44:07,46.0305,27.172,27.506,100.0,35.0 -15:44:07,46.0825,27.172,27.48,100.0,35.0 -15:44:07,46.1411,27.223,27.48,100.0,35.0 -15:44:07,46.1945,27.172,27.531,100.0,35.0 -15:44:07,46.2492,27.197,27.531,100.0,35.0 -15:44:07,46.3056,27.197,27.531,100.0,35.0 -15:44:07,46.3546,27.223,27.506,100.0,35.0 -15:44:07,46.4077,27.197,27.506,100.0,35.0 -15:44:07,46.4601,27.223,27.506,100.0,35.0 -15:44:07,46.5109,27.197,27.531,100.0,35.0 -15:44:07,46.5577,27.223,27.531,100.0,35.0 -15:44:07,46.6027,27.223,27.531,100.0,35.0 -15:44:07,46.6468,27.223,27.531,100.0,35.0 -15:44:07,46.6925,27.249,27.583,100.0,35.0 -15:44:07,46.7367,27.197,27.531,100.0,35.0 -15:44:07,46.7771,27.223,27.531,100.0,35.0 -15:44:08,46.8253,27.249,27.531,100.0,35.0 -15:44:08,46.8870,27.146,27.557,100.0,35.0 -15:44:08,46.9298,27.223,27.557,100.0,35.0 -15:44:08,46.9737,27.249,27.583,100.0,35.0 -15:44:08,47.0150,27.249,27.557,100.0,35.0 -15:44:08,47.0592,27.249,27.506,100.0,35.0 -15:44:08,47.1001,27.249,27.557,100.0,35.0 -15:44:08,47.1450,27.249,27.583,100.0,35.0 -15:44:08,47.1940,27.249,27.583,100.0,35.0 -15:44:08,47.2355,27.249,27.583,100.0,35.0 -15:44:08,47.2764,27.326,27.583,100.0,35.0 -15:44:08,47.3175,27.274,27.583,100.0,35.0 -15:44:08,47.3608,27.274,27.583,100.0,35.0 -15:44:08,47.4045,27.3,27.583,100.0,35.0 -15:44:08,47.4457,27.274,27.583,100.0,35.0 -15:44:08,47.4891,27.274,27.583,100.0,35.0 -15:44:08,47.5314,27.274,27.583,100.0,35.0 -15:44:08,47.5753,27.3,27.531,100.0,35.0 -15:44:08,47.6171,27.274,27.608,100.0,35.0 -15:44:08,47.6605,27.274,27.583,100.0,35.0 -15:44:08,47.7028,27.274,27.66,100.0,35.0 -15:44:08,47.7447,27.274,27.608,100.0,35.0 -15:44:08,47.7868,27.274,27.608,100.0,35.0 -15:44:09,47.8281,27.249,27.608,100.0,35.0 -15:44:09,47.8721,27.3,27.608,100.0,35.0 -15:44:09,47.9143,27.3,27.608,100.0,35.0 -15:44:09,47.9576,27.3,27.634,100.0,35.0 -15:44:09,48.0005,27.3,27.608,100.0,35.0 -15:44:09,48.0442,27.3,27.634,100.0,35.0 -15:44:09,48.0885,27.326,27.634,100.0,35.0 -15:44:09,48.1287,27.3,27.634,100.0,35.0 -15:44:09,48.1717,27.326,27.686,100.0,35.0 -15:44:09,48.2132,27.326,27.66,100.0,35.0 -15:44:09,48.2559,27.3,27.634,100.0,35.0 -15:44:09,48.2972,27.326,27.66,100.0,35.0 -15:44:09,48.3398,27.3,27.608,100.0,35.0 -15:44:09,48.3807,27.326,27.634,100.0,35.0 -15:44:09,48.4259,27.326,27.66,100.0,35.0 -15:44:09,48.4692,27.326,27.66,100.0,35.0 -15:44:09,48.5110,27.3,27.66,100.0,35.0 -15:44:09,48.5569,27.351,27.634,100.0,35.0 -15:44:09,48.6004,27.351,27.66,100.0,35.0 -15:44:09,48.6483,27.351,27.686,100.0,35.0 -15:44:09,48.6949,27.351,27.634,100.0,35.0 -15:44:09,48.7407,27.351,27.66,100.0,35.0 -15:44:09,48.7848,27.351,27.66,100.0,35.0 -15:44:10,48.8297,27.403,27.686,100.0,35.0 -15:44:10,48.8758,27.351,27.634,100.0,35.0 -15:44:10,48.9201,27.351,27.711,100.0,35.0 -15:44:10,48.9633,27.403,27.66,100.0,35.0 -15:44:10,49.0081,27.377,27.686,100.0,35.0 -15:44:10,49.0511,27.377,27.686,100.0,35.0 -15:44:10,49.0936,27.377,27.686,100.0,35.0 -15:44:10,49.1382,27.377,27.686,100.0,35.0 -15:44:10,49.1909,27.377,27.711,100.0,35.0 -15:44:10,49.2364,27.377,27.686,100.0,35.0 -15:44:10,49.2835,27.377,27.686,100.0,35.0 -15:44:10,49.3270,27.377,27.711,100.0,35.0 -15:44:10,49.3679,27.377,27.711,100.0,35.0 -15:44:10,49.4101,27.454,27.711,100.0,35.0 -15:44:10,49.4547,27.377,27.711,100.0,35.0 -15:44:10,49.4967,27.403,27.711,100.0,35.0 -15:44:10,49.5418,27.403,27.711,100.0,35.0 -15:44:10,49.5853,27.377,27.737,100.0,35.0 -15:44:10,49.6282,27.403,27.737,100.0,35.0 -15:44:10,49.6725,27.428,27.711,100.0,35.0 -15:44:10,49.7186,27.403,27.737,100.0,35.0 -15:44:10,49.7619,27.428,27.737,100.0,35.0 -15:44:10,49.8080,27.428,27.711,100.0,35.0 -15:44:11,49.8519,27.428,27.66,100.0,35.0 -15:44:11,49.8964,27.428,27.737,100.0,35.0 -15:44:11,49.9403,27.428,27.711,100.0,35.0 -15:44:11,49.9899,27.428,27.737,100.0,35.0 -15:44:11,50.0401,27.428,27.763,100.0,35.0 -15:44:11,50.0868,27.428,27.737,100.0,35.0 -15:44:11,50.1307,27.428,27.763,100.0,35.0 -15:44:11,50.1759,27.454,27.763,100.0,35.0 -15:44:11,50.2175,27.454,27.737,100.0,35.0 -15:44:11,50.2611,27.454,27.815,100.0,35.0 -15:44:11,50.3053,27.454,27.763,100.0,35.0 -15:44:11,50.3472,27.454,27.763,100.0,35.0 -15:44:11,50.3915,27.506,27.763,100.0,35.0 -15:44:11,50.4369,27.48,27.763,100.0,35.0 -15:44:11,50.4795,27.48,27.789,100.0,35.0 -15:44:11,50.5225,27.506,27.763,100.0,35.0 -15:44:11,50.5638,27.48,27.763,100.0,35.0 -15:44:11,50.6074,27.48,27.789,100.0,35.0 -15:44:11,50.6484,27.454,27.763,100.0,35.0 -15:44:11,50.6925,27.48,27.789,100.0,35.0 -15:44:11,50.7353,27.428,27.815,100.0,35.0 -15:44:11,50.7779,27.48,27.789,100.0,35.0 -15:44:12,50.8197,27.48,27.789,100.0,35.0 -15:44:12,50.8613,27.48,27.815,100.0,35.0 -15:44:12,50.9056,27.506,27.789,100.0,35.0 -15:44:12,50.9479,27.48,27.763,100.0,35.0 -15:44:12,50.9916,27.506,27.789,100.0,35.0 -15:44:12,51.0335,27.48,27.815,100.0,35.0 -15:44:12,51.0748,27.506,27.815,100.0,35.0 -15:44:12,51.1167,27.506,27.815,100.0,35.0 -15:44:12,51.1615,27.506,27.789,100.0,35.0 -15:44:12,51.2068,27.506,27.84,100.0,35.0 -15:44:12,51.2489,27.506,27.84,100.0,35.0 -15:44:12,51.2943,27.506,27.84,100.0,35.0 -15:44:12,51.3380,27.531,27.815,100.0,35.0 -15:44:12,51.3812,27.506,27.84,100.0,35.0 -15:44:12,51.4250,27.531,27.815,100.0,35.0 -15:44:12,51.4686,27.506,27.84,100.0,35.0 -15:44:12,51.5112,27.531,27.84,100.0,35.0 -15:44:12,51.5566,27.531,27.866,100.0,35.0 -15:44:12,51.6002,27.557,27.84,100.0,35.0 -15:44:12,51.6422,27.531,27.866,100.0,35.0 -15:44:12,51.6856,27.531,27.84,100.0,35.0 -15:44:12,51.7272,27.557,27.84,100.0,35.0 -15:44:12,51.7720,27.583,27.84,100.0,35.0 -15:44:13,51.8153,27.557,27.866,100.0,35.0 -15:44:13,51.8597,27.557,27.866,100.0,35.0 -15:44:13,51.9041,27.531,27.815,100.0,35.0 -15:44:13,51.9471,27.557,27.866,100.0,35.0 -15:44:13,51.9927,27.557,27.866,100.0,35.0 -15:44:13,52.0367,27.557,27.866,100.0,35.0 -15:44:13,52.0792,27.583,27.866,100.0,35.0 -15:44:13,52.1229,27.608,27.892,100.0,35.0 -15:44:13,52.1667,27.557,27.866,100.0,35.0 -15:44:13,52.2089,27.557,27.892,100.0,35.0 -15:44:13,52.2525,27.583,27.84,100.0,35.0 -15:44:13,52.2955,27.557,27.892,100.0,35.0 -15:44:13,52.3396,27.583,27.866,100.0,35.0 -15:44:13,52.3827,27.583,27.892,100.0,35.0 -15:44:13,52.4279,27.608,27.918,100.0,35.0 -15:44:13,52.4759,27.583,27.892,100.0,35.0 -15:44:13,52.5192,27.608,27.892,100.0,35.0 -15:44:13,52.5615,27.583,27.892,100.0,35.0 -15:44:13,52.6053,27.583,27.84,100.0,35.0 -15:44:13,52.6488,27.608,27.892,100.0,35.0 -15:44:13,52.6975,27.608,27.918,100.0,35.0 -15:44:13,52.7416,27.686,27.918,100.0,35.0 -15:44:13,52.7859,27.608,27.892,100.0,35.0 -15:44:14,52.8291,27.608,27.944,100.0,35.0 -15:44:14,52.8731,27.608,27.944,100.0,35.0 -15:44:14,52.9156,27.608,27.918,100.0,35.0 -15:44:14,52.9603,27.608,27.918,100.0,35.0 -15:44:14,53.0022,27.634,27.918,100.0,35.0 -15:44:14,53.0433,27.634,27.944,100.0,35.0 -15:44:14,53.0889,27.634,27.944,100.0,35.0 -15:44:14,53.1323,27.634,27.944,100.0,35.0 -15:44:14,53.1772,27.66,27.944,100.0,35.0 -15:44:14,53.2222,27.608,27.944,100.0,35.0 -15:44:14,53.2657,27.634,27.969,100.0,35.0 -15:44:14,53.3115,27.634,27.918,100.0,35.0 -15:44:14,53.3557,27.66,27.944,100.0,35.0 -15:44:14,53.3994,27.634,27.969,100.0,35.0 -15:44:14,53.4496,27.66,27.918,100.0,35.0 -15:44:14,53.4946,27.66,27.995,100.0,35.0 -15:44:14,53.5403,27.66,27.995,100.0,35.0 -15:44:14,53.5845,27.66,27.944,100.0,35.0 -15:44:14,53.6272,27.686,27.969,100.0,35.0 -15:44:14,53.6737,27.66,27.995,100.0,35.0 -15:44:14,53.7193,27.66,27.969,100.0,35.0 -15:44:14,53.7646,27.686,27.995,100.0,35.0 -15:44:15,53.8139,27.686,27.969,100.0,35.0 -15:44:15,53.8601,27.66,27.944,100.0,35.0 -15:44:15,53.9078,27.686,27.995,100.0,35.0 -15:44:15,53.9524,27.686,27.969,100.0,35.0 -15:44:15,53.9974,27.686,27.969,100.0,35.0 -15:44:15,54.0444,27.686,27.995,100.0,35.0 -15:44:15,54.0908,27.686,27.969,100.0,35.0 -15:44:15,54.1354,27.711,27.995,100.0,35.0 -15:44:15,54.1795,27.711,28.047,100.0,35.0 -15:44:15,54.2247,27.686,28.021,100.0,35.0 -15:44:15,54.2704,27.711,27.995,100.0,35.0 -15:44:15,54.3156,27.711,28.021,100.0,35.0 -15:44:15,54.3599,27.711,27.995,100.0,35.0 -15:44:15,54.4065,27.711,28.021,100.0,35.0 -15:44:15,54.4503,27.711,28.021,100.0,35.0 -15:44:15,54.4953,27.737,28.021,100.0,35.0 -15:44:15,54.5416,27.737,28.047,100.0,35.0 -15:44:15,54.5906,27.711,28.021,100.0,35.0 -15:44:15,54.6349,27.737,28.021,100.0,35.0 -15:44:15,54.6795,27.711,28.021,100.0,35.0 -15:44:15,54.7254,27.711,27.969,100.0,35.0 -15:44:15,54.7685,27.737,28.073,100.0,35.0 -15:44:16,54.8118,27.737,28.047,100.0,35.0 -15:44:16,54.8569,27.737,28.047,100.0,35.0 -15:44:16,54.9000,27.737,28.021,100.0,35.0 -15:44:16,54.9426,27.789,28.047,100.0,35.0 -15:44:16,54.9868,27.763,28.047,100.0,35.0 -15:44:16,55.0316,27.763,28.047,100.0,35.0 -15:44:16,55.0767,27.763,28.047,100.0,35.0 -15:44:16,55.1223,27.737,28.073,100.0,35.0 -15:44:16,55.1656,27.815,28.073,100.0,35.0 -15:44:16,55.2090,27.789,28.047,100.0,35.0 -15:44:16,55.2525,27.763,28.098,100.0,35.0 -15:44:16,55.2961,27.763,28.047,100.0,35.0 -15:44:16,55.3407,27.763,28.073,100.0,35.0 -15:44:16,55.3836,27.789,28.073,100.0,35.0 -15:44:16,55.4268,27.789,28.047,100.0,35.0 -15:44:16,55.4773,27.763,28.073,100.0,35.0 -15:44:16,55.5203,27.763,28.047,100.0,35.0 -15:44:16,55.5644,27.789,28.073,100.0,35.0 -15:44:16,55.6100,27.815,28.073,100.0,35.0 -15:44:16,55.6557,27.763,28.073,100.0,35.0 -15:44:16,55.7000,27.789,28.073,100.0,35.0 -15:44:16,55.7429,27.815,28.098,100.0,35.0 -15:44:16,55.7896,27.815,28.124,100.0,35.0 -15:44:17,55.8341,27.815,28.124,100.0,35.0 -15:44:17,55.8778,27.815,28.073,100.0,35.0 -15:44:17,55.9241,27.815,28.098,100.0,35.0 -15:44:17,55.9661,27.815,28.098,100.0,35.0 -15:44:17,56.0087,27.84,28.098,100.0,35.0 -15:44:17,56.0553,27.815,28.098,100.0,35.0 -15:44:17,56.0996,27.815,28.124,100.0,35.0 -15:44:17,56.1425,27.737,28.098,100.0,35.0 -15:44:17,56.1877,27.84,28.124,100.0,35.0 -15:44:17,56.2314,27.815,28.124,100.0,35.0 -15:44:17,56.2778,27.815,28.124,100.0,35.0 -15:44:17,56.3247,27.84,28.15,100.0,35.0 -15:44:17,56.3698,27.815,28.15,100.0,35.0 -15:44:17,56.4137,27.84,28.15,100.0,35.0 -15:44:17,56.4585,27.84,28.124,100.0,35.0 -15:44:17,56.5096,27.866,28.15,100.0,35.0 -15:44:17,56.5545,27.84,28.124,100.0,35.0 -15:44:17,56.5998,27.866,28.15,100.0,35.0 -15:44:17,56.6448,27.866,28.15,100.0,35.0 -15:44:17,56.6909,27.84,28.15,100.0,35.0 -15:44:17,56.7342,27.892,28.15,100.0,35.0 -15:44:17,56.7766,27.866,28.176,100.0,35.0 -15:44:18,56.8228,27.866,28.176,100.0,35.0 -15:44:18,56.8663,27.866,28.176,100.0,35.0 -15:44:18,56.9107,27.892,28.176,100.0,35.0 -15:44:18,56.9560,27.892,28.202,100.0,35.0 -15:44:18,57.0000,27.866,28.176,100.0,35.0 -15:44:18,57.0421,27.892,28.176,100.0,35.0 -15:44:18,57.0847,27.815,28.15,100.0,35.0 -15:44:18,57.1262,27.892,28.176,100.0,35.0 -15:44:18,57.1716,27.892,28.176,100.0,35.0 -15:44:18,57.2165,27.892,28.15,100.0,35.0 -15:44:18,57.2602,27.892,28.15,100.0,35.0 -15:44:18,57.3023,27.892,28.202,100.0,35.0 -15:44:18,57.3447,27.892,28.202,100.0,35.0 -15:44:18,57.3889,27.918,28.228,100.0,35.0 -15:44:18,57.4325,27.918,28.202,100.0,35.0 -15:44:18,57.4769,27.892,28.202,100.0,35.0 -15:44:18,57.5218,27.918,28.15,100.0,35.0 -15:44:18,57.5655,27.918,28.202,100.0,35.0 -15:44:18,57.6100,27.918,28.202,100.0,35.0 -15:44:18,57.6535,27.918,28.202,100.0,35.0 -15:44:18,57.6988,27.918,28.28,100.0,35.0 -15:44:18,57.7411,27.918,28.228,100.0,35.0 -15:44:18,57.7865,27.918,28.228,100.0,35.0 -15:44:19,57.8322,27.944,28.254,100.0,35.0 -15:44:19,57.8786,27.918,28.228,100.0,35.0 -15:44:19,57.9250,27.944,28.228,100.0,35.0 -15:44:19,57.9748,27.918,28.228,100.0,35.0 -15:44:19,58.0208,27.944,28.228,100.0,35.0 -15:44:19,58.0675,27.944,28.202,100.0,35.0 -15:44:19,58.1120,27.918,28.254,100.0,35.0 -15:44:19,58.1585,27.969,28.254,100.0,35.0 -15:44:19,58.2046,27.944,28.254,100.0,35.0 -15:44:19,58.2521,27.969,28.254,100.0,35.0 -15:44:19,58.2991,27.969,28.176,100.0,35.0 -15:44:19,58.3436,27.969,28.254,100.0,35.0 -15:44:19,58.3899,27.944,28.305,100.0,35.0 -15:44:19,58.4363,27.969,28.254,100.0,35.0 -15:44:19,58.4816,27.969,28.254,100.0,35.0 -15:44:19,58.5281,27.969,28.305,100.0,35.0 -15:44:19,58.5752,27.969,28.254,100.0,35.0 -15:44:19,58.6237,27.995,28.254,100.0,35.0 -15:44:19,58.6680,27.969,28.254,100.0,35.0 -15:44:19,58.7131,27.944,28.28,100.0,35.0 -15:44:19,58.7584,27.969,28.331,100.0,35.0 -15:44:19,58.8040,27.995,28.28,100.0,35.0 -15:44:20,58.8483,28.021,28.28,100.0,35.0 -15:44:20,58.8946,27.969,28.305,100.0,35.0 -15:44:20,58.9407,27.995,28.28,100.0,35.0 -15:44:20,58.9846,28.021,28.28,100.0,35.0 -15:44:20,59.0280,27.995,28.28,100.0,35.0 -15:44:20,59.0752,27.995,28.305,100.0,35.0 -15:44:20,59.1210,27.995,28.305,100.0,35.0 -15:44:20,59.1688,28.047,28.305,100.0,35.0 -15:44:20,59.2151,28.021,28.305,100.0,35.0 -15:44:20,59.2615,28.021,28.305,100.0,35.0 -15:44:20,59.3099,28.021,28.305,100.0,35.0 -15:44:20,59.3586,28.021,28.28,100.0,35.0 -15:44:20,59.4076,27.995,28.305,100.0,35.0 -15:44:20,59.4562,28.021,28.331,100.0,35.0 -15:44:20,59.5046,28.047,28.331,100.0,35.0 -15:44:20,59.5517,28.047,28.305,100.0,35.0 -15:44:20,59.5996,28.047,28.331,100.0,35.0 -15:44:20,59.6455,28.021,28.305,100.0,35.0 -15:44:20,59.6940,28.047,28.331,100.0,35.0 -15:44:20,59.7436,28.073,28.409,100.0,35.0 -15:44:20,59.7910,28.047,28.331,100.0,35.0 -15:44:21,59.8389,28.073,28.331,100.0,35.0 -15:44:21,59.8859,28.047,28.357,100.0,35.0 -15:44:21,59.9330,28.073,28.331,100.0,35.0 -15:44:21,59.9801,28.047,28.357,100.0,35.0 -15:44:21,60.0342,28.073,28.331,100.0,35.0 -15:44:21,60.0874,28.047,28.357,100.0,35.0 -15:44:21,60.1376,28.047,28.331,100.0,35.0 -15:44:21,60.1855,28.073,28.305,100.0,35.0 -15:44:21,60.2325,28.098,28.357,100.0,35.0 -15:44:21,60.2768,28.098,28.357,100.0,35.0 -15:44:21,60.3358,28.073,28.383,100.0,35.0 -15:44:21,60.4404,28.098,28.383,100.0,35.0 -15:44:21,60.5054,28.098,28.383,100.0,35.0 -15:44:21,60.5706,28.047,28.383,100.0,35.0 -15:44:21,60.6253,28.098,28.461,100.0,35.0 -15:44:21,60.6896,28.098,28.383,100.0,35.0 -15:44:21,60.7445,28.098,28.409,100.0,35.0 -15:44:21,60.7996,28.124,28.435,100.0,35.0 -15:44:22,60.8548,28.176,28.409,100.0,35.0 -15:44:22,60.9134,28.098,28.409,100.0,35.0 -15:44:22,60.9669,28.124,28.409,100.0,35.0 -15:44:22,61.0198,28.124,28.435,100.0,35.0 -15:44:22,61.0751,28.15,28.435,100.0,35.0 -15:44:22,61.1356,28.124,28.409,100.0,35.0 -15:44:22,61.1931,28.098,28.435,100.0,35.0 -15:44:22,61.2534,28.124,28.409,100.0,35.0 -15:44:22,61.3074,28.15,28.435,100.0,35.0 -15:44:22,61.3596,28.15,28.435,100.0,35.0 -15:44:22,61.4110,28.124,28.435,100.0,35.0 -15:44:22,61.4624,28.176,28.435,100.0,35.0 -15:44:22,61.5173,28.15,28.435,100.0,35.0 -15:44:22,61.5651,28.124,28.487,100.0,35.0 -15:44:22,61.6084,28.176,28.435,100.0,35.0 -15:44:22,61.6530,28.124,28.409,100.0,35.0 -15:44:22,61.6976,28.15,28.435,100.0,35.0 -15:44:22,61.7420,28.176,28.487,100.0,35.0 -15:44:22,61.7887,28.176,28.461,100.0,35.0 -15:44:23,61.8476,28.176,28.461,100.0,35.0 -15:44:23,61.8965,28.176,28.435,100.0,35.0 -15:44:23,61.9445,28.15,28.461,100.0,35.0 -15:44:23,61.9913,28.176,28.461,100.0,35.0 -15:44:23,62.0340,28.176,28.513,100.0,35.0 -15:44:23,62.0838,28.176,28.487,100.0,35.0 -15:44:23,62.1301,28.176,28.487,100.0,35.0 -15:44:23,62.1786,28.176,28.487,100.0,35.0 -15:44:23,62.2286,28.202,28.487,100.0,35.0 -15:44:23,62.2747,28.202,28.487,100.0,35.0 -15:44:23,62.3231,28.202,28.487,100.0,35.0 -15:44:23,62.3685,28.202,28.513,100.0,35.0 -15:44:23,62.4135,28.228,28.487,100.0,35.0 -15:44:23,62.4599,28.202,28.487,100.0,35.0 -15:44:23,62.5088,28.202,28.487,100.0,35.0 -15:44:23,62.5558,28.228,28.513,100.0,35.0 -15:44:23,62.5998,28.176,28.487,100.0,35.0 -15:44:23,62.6427,28.228,28.461,100.0,35.0 -15:44:23,62.6898,28.228,28.513,100.0,35.0 -15:44:23,62.7352,28.228,28.513,100.0,35.0 -15:44:23,62.7798,28.228,28.513,100.0,35.0 -15:44:24,62.8265,28.28,28.461,100.0,35.0 -15:44:24,62.8727,28.254,28.487,100.0,35.0 -15:44:24,62.9172,28.228,28.513,100.0,35.0 -15:44:24,62.9613,28.254,28.539,100.0,35.0 -15:44:24,63.0069,28.254,28.565,100.0,35.0 -15:44:24,63.0533,28.254,28.539,100.0,35.0 -15:44:24,63.0989,28.254,28.513,100.0,35.0 -15:44:24,63.1434,28.254,28.539,100.0,35.0 -15:44:24,63.1893,28.254,28.539,100.0,35.0 -15:44:24,63.2352,28.254,28.539,100.0,35.0 -15:44:24,63.2807,28.254,28.565,100.0,35.0 -15:44:24,63.3248,28.28,28.539,100.0,35.0 -15:44:24,63.3714,28.254,28.539,100.0,35.0 -15:44:24,63.4159,28.28,28.591,100.0,35.0 -15:44:24,63.4594,28.28,28.591,100.0,35.0 -15:44:24,63.5045,28.305,28.617,100.0,35.0 -15:44:24,63.5512,28.305,28.565,100.0,35.0 -15:44:24,63.5944,28.28,28.565,100.0,35.0 -15:44:24,63.6398,28.28,28.565,100.0,35.0 -15:44:24,63.6835,28.305,28.565,100.0,35.0 -15:44:24,63.7286,28.305,28.565,100.0,35.0 -15:44:24,63.7755,28.357,28.513,100.0,35.0 -15:44:25,63.8216,28.305,28.565,100.0,35.0 -15:44:25,63.8658,28.305,28.565,100.0,35.0 -15:44:25,63.9105,28.305,28.591,100.0,35.0 -15:44:25,63.9575,28.305,28.539,100.0,35.0 -15:44:25,64.0047,28.331,28.591,100.0,35.0 -15:44:25,64.0496,28.305,28.591,100.0,35.0 -15:44:25,64.0935,28.305,28.591,100.0,35.0 -15:44:25,64.1407,28.305,28.591,100.0,35.0 -15:44:25,64.1846,28.305,28.617,100.0,35.0 -15:44:25,64.2334,28.254,28.591,100.0,35.0 -15:44:25,64.2786,28.305,28.591,100.0,35.0 -15:44:25,64.3256,28.331,28.591,100.0,35.0 -15:44:25,64.3733,28.331,28.617,100.0,35.0 -15:44:25,64.4178,28.357,28.617,100.0,35.0 -15:44:25,64.4617,28.331,28.617,100.0,35.0 -15:44:25,64.5079,28.331,28.617,100.0,35.0 -15:44:25,64.5538,28.357,28.565,100.0,35.0 -15:44:25,64.5990,28.357,28.643,100.0,35.0 -15:44:25,64.6434,28.331,28.617,100.0,35.0 -15:44:25,64.6908,28.331,28.669,100.0,35.0 -15:44:25,64.7394,28.331,28.643,100.0,35.0 -15:44:25,64.7885,28.331,28.643,100.0,35.0 -15:44:26,64.8335,28.357,28.643,100.0,35.0 -15:44:26,64.8781,28.383,28.643,100.0,35.0 -15:44:26,64.9247,28.409,28.643,100.0,35.0 -15:44:26,64.9716,28.357,28.643,100.0,35.0 -15:44:26,65.0222,28.383,28.617,100.0,35.0 -15:44:26,65.0666,28.331,28.643,100.0,35.0 -15:44:26,65.1117,28.383,28.669,100.0,35.0 -15:44:26,65.1578,28.383,28.643,100.0,35.0 -15:44:26,65.2052,28.383,28.669,100.0,35.0 -15:44:26,65.2502,28.383,28.669,100.0,35.0 -15:44:26,65.2969,28.461,28.695,100.0,35.0 -15:44:26,65.3409,28.383,28.669,100.0,35.0 -15:44:26,65.3877,28.383,28.669,100.0,35.0 -15:44:26,65.4354,28.409,28.669,100.0,35.0 -15:44:26,65.4819,28.409,28.669,100.0,35.0 -15:44:26,65.5270,28.487,28.669,100.0,35.0 -15:44:26,65.5747,28.409,28.721,100.0,35.0 -15:44:26,65.6219,28.409,28.669,100.0,35.0 -15:44:26,65.6665,28.409,28.695,100.0,35.0 -15:44:26,65.7118,28.409,28.695,100.0,35.0 -15:44:26,65.7596,28.435,28.721,100.0,35.0 -15:44:26,65.8075,28.409,28.695,100.0,35.0 -15:44:27,65.8523,28.409,28.695,100.0,35.0 -15:44:27,65.8982,28.435,28.695,100.0,35.0 -15:44:27,65.9435,28.435,28.721,100.0,35.0 -15:44:27,65.9907,28.435,28.695,100.0,35.0 -15:44:27,66.0381,28.435,28.721,100.0,35.0 -15:44:27,66.0833,28.409,28.591,100.0,35.0 -15:44:27,66.1277,28.435,28.721,100.0,35.0 -15:44:27,66.1747,28.461,28.721,100.0,35.0 -15:44:27,66.2216,28.461,28.747,100.0,35.0 -15:44:27,66.2665,28.513,28.721,100.0,35.0 -15:44:27,66.3128,28.461,28.747,100.0,35.0 -15:44:27,66.3572,28.461,28.747,100.0,35.0 -15:44:27,66.4016,28.461,28.669,100.0,35.0 -15:44:27,66.4467,28.487,28.721,100.0,35.0 -15:44:27,66.4922,28.409,28.747,100.0,35.0 -15:44:27,66.5409,28.487,28.747,100.0,35.0 -15:44:27,66.5877,28.461,28.773,100.0,35.0 -15:44:27,66.6326,28.461,28.747,100.0,35.0 -15:44:27,66.6786,28.461,28.773,100.0,35.0 -15:44:27,66.7280,28.487,28.747,100.0,35.0 -15:44:27,66.7765,28.487,28.773,100.0,35.0 -15:44:28,66.8248,28.461,28.747,100.0,35.0 -15:44:28,66.8706,28.487,28.747,100.0,35.0 -15:44:28,66.9168,28.487,28.773,100.0,35.0 -15:44:28,66.9612,28.487,28.773,100.0,35.0 -15:44:28,67.0079,28.513,28.773,100.0,35.0 -15:44:28,67.0537,28.487,28.773,100.0,35.0 -15:44:28,67.0989,28.487,28.773,100.0,35.0 -15:44:28,67.1454,28.487,28.773,100.0,35.0 -15:44:28,67.1915,28.487,28.747,100.0,35.0 -15:44:28,67.2382,28.513,28.799,100.0,35.0 -15:44:28,67.2837,28.487,28.773,100.0,35.0 -15:44:28,67.3301,28.513,28.799,100.0,35.0 -15:44:28,67.3758,28.513,28.799,100.0,35.0 -15:44:28,67.4231,28.513,28.773,100.0,35.0 -15:44:28,67.4676,28.513,28.773,100.0,35.0 -15:44:28,67.5137,28.539,28.799,100.0,35.0 -15:44:28,67.5610,28.539,28.799,100.0,35.0 -15:44:28,67.6125,28.539,28.799,100.0,35.0 -15:44:28,67.6597,28.539,28.799,100.0,35.0 -15:44:28,67.7081,28.513,28.799,100.0,35.0 -15:44:28,67.7559,28.513,28.825,100.0,35.0 -15:44:28,67.8014,28.565,28.825,100.0,35.0 -15:44:29,67.8482,28.513,28.799,100.0,35.0 -15:44:29,67.8937,28.539,28.825,100.0,35.0 -15:44:29,67.9405,28.539,28.851,100.0,35.0 -15:44:29,67.9878,28.539,28.851,100.0,35.0 -15:44:29,68.0345,28.565,28.825,100.0,35.0 -15:44:29,68.0798,28.565,28.825,100.0,35.0 -15:44:29,68.1259,28.565,28.851,100.0,35.0 -15:44:29,68.1725,28.565,28.825,100.0,35.0 -15:44:29,68.2172,28.565,28.877,100.0,35.0 -15:44:29,68.2632,28.565,28.825,100.0,35.0 -15:44:29,68.3083,28.591,28.799,100.0,35.0 -15:44:29,68.3557,28.565,28.851,100.0,35.0 -15:44:29,68.4044,28.565,28.851,100.0,35.0 -15:44:29,68.4511,28.591,28.851,100.0,35.0 -15:44:29,68.4973,28.591,28.851,100.0,35.0 -15:44:29,68.5430,28.591,28.877,100.0,35.0 -15:44:29,68.5933,28.565,28.877,100.0,35.0 -15:44:29,68.6423,28.591,28.877,100.0,35.0 -15:44:29,68.6895,28.591,28.877,100.0,35.0 -15:44:29,68.7356,28.643,28.877,100.0,35.0 -15:44:29,68.7826,28.669,28.903,100.0,35.0 -15:44:30,68.8284,28.617,28.877,100.0,35.0 -15:44:30,68.8756,28.617,28.877,100.0,35.0 -15:44:30,68.9238,28.591,28.877,100.0,35.0 -15:44:30,68.9697,28.617,28.877,100.0,35.0 -15:44:30,69.0157,28.617,28.903,100.0,35.0 -15:44:30,69.0605,28.617,28.877,100.0,35.0 -15:44:30,69.1097,28.617,28.877,100.0,35.0 -15:44:30,69.1566,28.617,28.877,100.0,35.0 -15:44:30,69.2043,28.617,28.903,100.0,35.0 -15:44:30,69.2501,28.617,28.877,100.0,35.0 -15:44:30,69.2962,28.591,28.903,100.0,35.0 -15:44:30,69.3422,28.643,28.903,100.0,35.0 -15:44:30,69.3898,28.617,28.903,100.0,35.0 -15:44:30,69.4375,28.643,28.929,100.0,35.0 -15:44:30,69.4826,28.617,28.903,100.0,35.0 -15:44:30,69.5304,28.643,28.929,100.0,35.0 -15:44:30,69.5755,28.643,28.929,100.0,35.0 -15:44:30,69.6225,28.643,28.929,100.0,35.0 -15:44:30,69.6678,28.643,28.929,100.0,35.0 -15:44:30,69.7139,28.669,28.929,100.0,35.0 -15:44:30,69.7598,28.669,28.929,100.0,35.0 -15:44:31,69.8083,28.643,28.929,100.0,35.0 -15:44:31,69.8557,28.643,28.955,100.0,35.0 -15:44:31,69.9017,28.669,28.929,100.0,35.0 -15:44:31,69.9482,28.669,28.955,100.0,35.0 -15:44:31,69.9954,28.643,28.981,100.0,35.0 -15:44:31,70.0404,28.669,28.929,100.0,35.0 -15:44:31,70.0872,28.669,28.929,100.0,35.0 -15:44:31,70.1335,28.669,28.955,100.0,35.0 -15:44:31,70.1787,28.695,28.955,100.0,35.0 -15:44:31,70.2262,28.669,28.981,100.0,35.0 -15:44:31,70.2738,28.695,28.981,100.0,35.0 -15:44:31,70.3224,28.695,28.955,100.0,35.0 -15:44:31,70.3704,28.695,28.981,100.0,35.0 -15:44:31,70.4167,28.721,28.929,100.0,35.0 -15:44:31,70.4630,28.695,28.981,100.0,35.0 -15:44:31,70.5094,28.695,28.981,100.0,35.0 -15:44:31,70.5575,28.721,28.981,100.0,35.0 -15:44:31,70.6054,28.695,28.981,100.0,35.0 -15:44:31,70.6530,28.721,28.981,100.0,35.0 -15:44:31,70.7003,28.695,28.981,100.0,35.0 -15:44:31,70.7474,28.721,29.007,100.0,35.0 -15:44:31,70.7926,28.721,29.007,100.0,35.0 -15:44:32,70.8410,28.721,28.981,100.0,35.0 -15:44:32,70.8883,28.695,28.981,100.0,35.0 -15:44:32,70.9345,28.721,29.007,100.0,35.0 -15:44:32,70.9806,28.721,29.007,100.0,35.0 -15:44:32,71.0457,28.721,29.007,100.0,35.0 -15:44:32,71.0949,28.747,28.981,100.0,35.0 -15:44:32,71.1450,28.773,29.007,100.0,35.0 -15:44:32,71.1903,28.747,28.981,100.0,35.0 -15:44:32,71.2391,28.747,29.033,100.0,35.0 -15:44:32,71.2872,28.747,29.007,100.0,35.0 -15:44:32,71.3333,28.747,29.007,100.0,35.0 -15:44:32,71.3785,28.747,29.007,100.0,35.0 -15:44:32,71.4248,28.747,29.033,100.0,35.0 -15:44:32,71.4727,28.773,29.033,100.0,35.0 -15:44:32,71.5221,28.747,29.007,100.0,35.0 -15:44:32,71.5703,28.773,29.007,100.0,35.0 -15:44:32,71.6191,28.799,29.033,100.0,35.0 -15:44:32,71.6676,28.825,29.059,100.0,35.0 -15:44:32,71.7168,28.773,29.059,100.0,35.0 -15:44:32,71.7646,28.773,29.033,100.0,35.0 -15:44:33,71.8137,28.773,29.059,100.0,35.0 -15:44:33,71.8611,28.747,29.059,100.0,35.0 -15:44:33,71.9098,28.773,29.059,100.0,35.0 -15:44:33,71.9606,28.773,29.085,100.0,35.0 -15:44:33,72.0125,28.851,29.085,100.0,35.0 -15:44:33,72.0647,28.799,29.059,100.0,35.0 -15:44:33,72.1101,28.825,29.085,100.0,35.0 -15:44:33,72.1573,28.773,29.059,100.0,35.0 -15:44:33,72.2055,28.799,29.059,100.0,35.0 -15:44:33,72.2549,28.825,29.033,100.0,35.0 -15:44:33,72.3028,28.799,29.085,100.0,35.0 -15:44:33,72.3497,28.825,29.085,100.0,35.0 -15:44:33,72.3960,28.799,29.085,100.0,35.0 -15:44:33,72.4421,28.825,29.111,100.0,35.0 -15:44:33,72.4867,28.799,29.085,100.0,35.0 -15:44:33,72.5296,28.799,29.111,100.0,35.0 -15:44:33,72.5725,28.799,29.085,100.0,35.0 -15:44:33,72.6172,28.799,29.085,100.0,35.0 -15:44:33,72.6613,28.825,29.111,100.0,35.0 -15:44:33,72.7028,28.851,29.085,100.0,35.0 -15:44:33,72.7493,28.825,29.111,100.0,35.0 -15:44:33,72.7930,28.799,29.085,100.0,35.0 -15:44:34,72.8374,28.825,29.085,100.0,35.0 -15:44:34,72.8809,28.825,29.111,100.0,35.0 -15:44:34,72.9239,28.877,29.111,100.0,35.0 -15:44:34,72.9684,28.825,29.111,100.0,35.0 -15:44:34,73.0110,28.851,29.163,100.0,35.0 -15:44:34,73.0564,28.877,29.137,100.0,35.0 -15:44:34,73.0998,28.851,29.137,100.0,35.0 -15:44:34,73.1432,28.877,29.215,100.0,35.0 -15:44:34,73.1879,28.825,29.111,100.0,35.0 -15:44:34,73.2315,28.851,29.137,100.0,35.0 -15:44:34,73.2753,28.851,29.137,100.0,35.0 -15:44:34,73.3197,28.851,29.111,100.0,35.0 -15:44:34,73.3615,28.877,29.137,100.0,35.0 -15:44:34,73.4018,28.877,29.137,100.0,35.0 -15:44:34,73.4435,28.877,29.137,100.0,35.0 -15:44:34,73.4865,28.877,29.137,100.0,35.0 -15:44:34,73.5280,28.851,29.137,100.0,35.0 -15:44:34,73.5668,28.877,29.163,100.0,35.0 -15:44:34,73.6097,28.851,29.137,100.0,35.0 -15:44:34,73.6520,28.877,29.163,100.0,35.0 -15:44:34,73.6928,28.877,29.137,100.0,35.0 -15:44:34,73.7365,28.877,29.163,100.0,35.0 -15:44:34,73.7786,28.877,29.163,100.0,35.0 -15:44:35,73.8188,28.877,29.163,100.0,35.0 -15:44:35,73.8596,28.877,29.163,100.0,35.0 -15:44:35,73.9012,28.903,29.163,100.0,35.0 -15:44:35,73.9422,28.903,29.137,100.0,35.0 -15:44:35,73.9845,28.903,29.137,100.0,35.0 -15:44:35,74.0271,28.903,29.163,100.0,35.0 -15:44:35,74.0684,28.929,29.189,100.0,35.0 -15:44:35,74.1085,28.903,29.137,100.0,35.0 -15:44:35,74.1523,28.903,29.163,100.0,35.0 -15:44:35,74.1923,28.877,29.189,100.0,35.0 -15:44:35,74.2351,28.903,29.215,100.0,35.0 -15:44:35,74.2755,28.903,29.189,100.0,35.0 -15:44:35,74.3197,28.903,29.189,100.0,35.0 -15:44:35,74.3596,28.929,29.189,100.0,35.0 -15:44:35,74.4015,28.929,29.189,100.0,35.0 -15:44:35,74.4427,28.903,29.215,100.0,35.0 -15:44:35,74.4847,28.929,29.189,100.0,35.0 -15:44:35,74.5257,28.903,29.189,100.0,35.0 -15:44:35,74.5700,28.929,29.268,100.0,35.0 -15:44:35,74.6123,28.929,29.189,100.0,35.0 -15:44:35,74.6550,28.929,29.215,100.0,35.0 -15:44:35,74.6964,28.955,29.215,100.0,35.0 -15:44:35,74.7387,28.929,29.189,100.0,35.0 -15:44:35,74.8008,28.929,29.163,100.0,35.0 -15:44:36,74.8501,28.955,29.242,100.0,35.0 -15:44:36,74.8946,28.955,29.189,100.0,35.0 -15:44:36,74.9375,28.955,29.215,100.0,35.0 -15:44:36,74.9837,28.981,29.242,100.0,35.0 -15:44:36,75.0326,28.955,29.215,100.0,35.0 -15:44:36,75.0814,28.955,29.242,100.0,35.0 -15:44:36,75.1391,28.955,29.215,100.0,35.0 -15:44:36,75.1880,28.955,29.242,100.0,35.0 -15:44:36,75.2319,28.981,29.242,100.0,35.0 -15:44:36,75.2753,28.929,29.242,100.0,35.0 -15:44:36,75.3203,28.981,29.242,100.0,35.0 -15:44:36,75.3851,29.007,29.215,100.0,35.0 -15:44:36,75.4637,28.981,29.268,100.0,35.0 -15:44:36,75.5178,28.955,29.242,100.0,35.0 -15:44:36,75.5743,29.007,29.242,100.0,35.0 -15:44:36,75.6317,28.903,29.268,100.0,35.0 -15:44:36,75.6872,29.007,29.294,100.0,35.0 -15:44:36,75.7396,28.981,29.268,100.0,35.0 -15:44:36,75.7945,28.981,29.242,100.0,35.0 -15:44:37,75.8507,29.033,29.268,100.0,35.0 -15:44:37,75.9017,29.007,29.215,100.0,35.0 -15:44:37,75.9565,29.007,29.268,100.0,35.0 -15:44:37,76.0164,29.007,29.268,100.0,35.0 -15:44:37,76.0820,29.007,29.294,100.0,35.0 -15:44:37,76.1376,29.007,29.294,100.0,35.0 -15:44:37,76.1974,29.007,29.294,100.0,35.0 -15:44:37,76.2540,28.877,29.268,100.0,35.0 -15:44:37,76.3040,29.033,29.32,100.0,35.0 -15:44:37,76.3550,29.033,29.32,100.0,35.0 -15:44:37,76.4105,29.007,29.294,100.0,35.0 -15:44:37,76.4618,29.033,29.294,100.0,35.0 -15:44:37,76.5161,29.033,29.32,100.0,35.0 -15:44:37,76.5600,29.059,29.294,100.0,35.0 -15:44:37,76.6127,29.033,29.32,100.0,35.0 -15:44:37,76.6575,29.033,29.346,100.0,35.0 -15:44:37,76.7032,29.059,29.32,100.0,35.0 -15:44:37,76.7476,29.059,29.32,100.0,35.0 -15:44:37,76.7915,29.059,29.32,100.0,35.0 -15:44:38,76.8511,29.059,29.32,100.0,35.0 -15:44:38,76.8977,29.059,29.32,100.0,35.0 -15:44:38,76.9434,29.059,29.32,100.0,35.0 -15:44:38,76.9871,29.033,29.346,100.0,35.0 -15:44:38,77.0315,29.033,29.346,100.0,35.0 -15:44:38,77.0767,29.033,29.346,100.0,35.0 -15:44:38,77.1205,29.033,29.346,100.0,35.0 -15:44:38,77.1657,29.085,29.346,100.0,35.0 -15:44:38,77.2086,29.085,29.372,100.0,35.0 -15:44:38,77.2526,29.059,29.346,100.0,35.0 -15:44:38,77.2973,29.085,29.346,100.0,35.0 -15:44:38,77.3395,29.059,29.346,100.0,35.0 -15:44:38,77.3848,29.111,29.372,100.0,35.0 -15:44:38,77.4274,29.085,29.398,100.0,35.0 -15:44:38,77.4706,29.111,29.346,100.0,35.0 -15:44:38,77.5157,29.085,29.372,100.0,35.0 -15:44:38,77.5607,29.111,29.425,100.0,35.0 -15:44:38,77.6037,29.111,29.372,100.0,35.0 -15:44:38,77.6476,29.085,29.372,100.0,35.0 -15:44:38,77.6894,29.111,29.372,100.0,35.0 -15:44:38,77.7354,29.111,29.372,100.0,35.0 -15:44:38,77.7780,29.111,29.372,100.0,35.0 -15:44:39,77.8201,29.111,29.398,100.0,35.0 -15:44:39,77.8621,29.111,29.398,100.0,35.0 -15:44:39,77.9049,29.137,29.398,100.0,35.0 -15:44:39,77.9501,29.137,29.398,100.0,35.0 -15:44:39,77.9929,29.111,29.372,100.0,35.0 -15:44:39,78.0387,29.111,29.398,100.0,35.0 -15:44:39,78.0845,29.137,29.372,100.0,35.0 -15:44:39,78.1272,29.137,29.398,100.0,35.0 -15:44:39,78.1697,29.137,29.372,100.0,35.0 -15:44:39,78.2148,29.137,29.398,100.0,35.0 -15:44:39,78.2592,29.137,29.425,100.0,35.0 -15:44:39,78.3029,29.163,29.425,100.0,35.0 -15:44:39,78.3456,29.137,29.398,100.0,35.0 -15:44:39,78.3892,29.137,29.398,100.0,35.0 -15:44:39,78.4344,29.163,29.425,100.0,35.0 -15:44:39,78.4783,29.137,29.425,100.0,35.0 -15:44:39,78.5216,29.163,29.398,100.0,35.0 -15:44:39,78.5672,29.085,29.425,100.0,35.0 -15:44:39,78.6109,29.189,29.425,100.0,35.0 -15:44:39,78.6537,29.163,29.398,100.0,35.0 -15:44:39,78.6980,29.189,29.425,100.0,35.0 -15:44:39,78.7407,29.163,29.451,100.0,35.0 -15:44:39,78.7856,29.163,29.425,100.0,35.0 -15:44:40,78.8306,29.189,29.451,100.0,35.0 -15:44:40,78.8736,29.215,29.425,100.0,35.0 -15:44:40,78.9180,29.189,29.451,100.0,35.0 -15:44:40,78.9610,29.215,29.451,100.0,35.0 -15:44:40,79.0046,29.163,29.477,100.0,35.0 -15:44:40,79.0500,29.189,29.451,100.0,35.0 -15:44:40,79.0929,29.189,29.451,100.0,35.0 -15:44:40,79.1344,29.189,29.477,100.0,35.0 -15:44:40,79.1797,29.242,29.451,100.0,35.0 -15:44:40,79.2229,29.189,29.451,100.0,35.0 -15:44:40,79.2683,29.189,29.477,100.0,35.0 -15:44:40,79.3111,29.189,29.477,100.0,35.0 -15:44:40,79.3538,29.189,29.477,100.0,35.0 -15:44:40,79.3967,29.242,29.529,100.0,35.0 -15:44:40,79.4399,29.189,29.477,100.0,35.0 -15:44:40,79.4840,29.189,29.451,100.0,35.0 -15:44:40,79.5275,29.215,29.555,100.0,35.0 -15:44:40,79.5706,29.215,29.477,100.0,35.0 -15:44:40,79.6154,29.242,29.477,100.0,35.0 -15:44:40,79.6593,29.215,29.503,100.0,35.0 -15:44:40,79.7043,29.215,29.503,100.0,35.0 -15:44:40,79.7526,29.215,29.477,100.0,35.0 -15:44:40,79.7947,29.215,29.503,100.0,35.0 -15:44:41,79.8372,29.215,29.529,100.0,35.0 -15:44:41,79.8792,29.189,29.477,100.0,35.0 -15:44:41,79.9205,29.215,29.477,100.0,35.0 -15:44:41,79.9636,29.215,29.503,100.0,35.0 -15:44:41,80.0193,29.242,29.503,100.0,35.0 -15:44:41,80.0684,29.215,29.529,100.0,35.0 -15:44:41,80.1267,29.189,29.503,100.0,35.0 -15:44:41,80.1856,29.242,29.503,100.0,35.0 -15:44:41,80.2421,29.242,29.503,100.0,35.0 -15:44:41,80.2973,29.268,29.529,100.0,35.0 -15:44:41,80.3526,29.268,29.529,100.0,35.0 -15:44:41,80.4068,29.268,29.529,100.0,35.0 -15:44:41,80.4590,29.242,29.529,100.0,35.0 -15:44:41,80.5416,29.268,29.529,100.0,35.0 -15:44:41,80.5946,29.268,29.529,100.0,35.0 -15:44:41,80.6484,29.268,29.555,100.0,35.0 -15:44:41,80.6993,29.215,29.529,100.0,35.0 -15:44:41,80.7541,29.268,29.529,100.0,35.0 -15:44:41,80.8045,29.294,29.555,100.0,35.0 -15:44:42,80.8548,29.294,29.529,100.0,35.0 -15:44:42,80.9095,29.294,29.582,100.0,35.0 -15:44:42,80.9544,29.32,29.555,100.0,35.0 -15:44:42,80.9992,29.268,29.555,100.0,35.0 -15:44:42,81.0422,29.372,29.582,100.0,35.0 -15:44:42,81.0857,29.268,29.555,100.0,35.0 -15:44:42,81.1274,29.215,29.555,100.0,35.0 -15:44:42,81.1715,29.294,29.582,100.0,35.0 -15:44:42,81.2157,29.346,29.555,100.0,35.0 -15:44:42,81.2586,29.242,29.582,100.0,35.0 -15:44:42,81.3028,29.294,29.555,100.0,35.0 -15:44:42,81.3483,29.32,29.582,100.0,35.0 -15:44:42,81.3915,29.268,29.582,100.0,35.0 -15:44:42,81.4356,29.32,29.582,100.0,35.0 -15:44:42,81.4807,29.32,29.582,100.0,35.0 -15:44:42,81.5230,29.372,29.582,100.0,35.0 -15:44:42,81.5675,29.32,29.608,100.0,35.0 -15:44:42,81.6089,29.372,29.608,100.0,35.0 -15:44:42,81.6547,29.32,29.582,100.0,35.0 -15:44:42,81.6996,29.294,29.582,100.0,35.0 -15:44:42,81.7462,29.346,29.634,100.0,35.0 -15:44:42,81.7881,29.346,29.608,100.0,35.0 -15:44:43,81.8327,29.346,29.66,100.0,35.0 -15:44:43,81.8752,29.346,29.582,100.0,35.0 -15:44:43,81.9201,29.346,29.608,100.0,35.0 -15:44:43,81.9655,29.32,29.608,100.0,35.0 -15:44:43,82.0082,29.346,29.608,100.0,35.0 -15:44:43,82.0532,29.346,29.608,100.0,35.0 -15:44:43,82.0988,29.372,29.608,100.0,35.0 -15:44:43,82.1423,29.346,29.608,100.0,35.0 -15:44:43,82.1866,29.346,29.634,100.0,35.0 -15:44:43,82.2318,29.346,29.634,100.0,35.0 -15:44:43,82.2760,29.346,29.608,100.0,35.0 -15:44:43,82.3168,29.346,29.608,100.0,35.0 -15:44:43,82.3596,29.372,29.634,100.0,35.0 -15:44:43,82.4016,29.372,29.634,100.0,35.0 -15:44:43,82.4456,29.346,29.608,100.0,35.0 -15:44:43,82.4874,29.398,29.66,100.0,35.0 -15:44:43,82.5320,29.372,29.634,100.0,35.0 -15:44:43,82.5754,29.398,29.687,100.0,35.0 -15:44:43,82.6201,29.346,29.66,100.0,35.0 -15:44:43,82.6655,29.372,29.634,100.0,35.0 -15:44:43,82.7095,29.372,29.634,100.0,35.0 -15:44:43,82.7516,29.425,29.66,100.0,35.0 -15:44:43,82.7960,29.398,29.66,100.0,35.0 -15:44:44,82.8394,29.398,29.66,100.0,35.0 -15:44:44,82.8862,29.398,29.634,100.0,35.0 -15:44:44,82.9329,29.425,29.66,100.0,35.0 -15:44:44,82.9773,29.398,29.66,100.0,35.0 -15:44:44,83.0213,29.425,29.66,100.0,35.0 -15:44:44,83.0673,29.425,29.66,100.0,35.0 -15:44:44,83.1110,29.425,29.66,100.0,35.0 -15:44:44,83.1544,29.398,29.687,100.0,35.0 -15:44:44,83.1991,29.425,29.66,100.0,35.0 -15:44:44,83.2433,29.346,29.687,100.0,35.0 -15:44:44,83.2870,29.451,29.687,100.0,35.0 -15:44:44,83.3311,29.398,29.713,100.0,35.0 -15:44:44,83.3759,29.425,29.687,100.0,35.0 -15:44:44,83.4175,29.425,29.713,100.0,35.0 -15:44:44,83.4625,29.398,29.687,100.0,35.0 -15:44:44,83.5067,29.425,29.713,100.0,35.0 -15:44:44,83.5527,29.425,29.687,100.0,35.0 -15:44:44,83.5961,29.451,29.713,100.0,35.0 -15:44:44,83.6408,29.451,29.713,100.0,35.0 -15:44:44,83.6879,29.425,29.713,100.0,35.0 -15:44:44,83.7437,29.425,29.713,100.0,35.0 -15:44:44,83.7857,29.451,29.739,100.0,35.0 -15:44:45,83.8306,29.451,29.713,100.0,35.0 -15:44:45,83.8734,29.451,29.713,100.0,35.0 -15:44:45,83.9166,29.477,29.739,100.0,35.0 -15:44:45,83.9591,29.372,29.713,100.0,35.0 -15:44:45,83.9996,29.451,29.739,100.0,35.0 -15:44:45,84.0413,29.451,29.713,100.0,35.0 -15:44:45,84.0845,29.451,29.713,100.0,35.0 -15:44:45,84.1257,29.425,29.713,100.0,35.0 -15:44:45,84.1668,29.477,29.713,100.0,35.0 -15:44:45,84.2085,29.451,29.713,100.0,35.0 -15:44:45,84.2518,29.477,29.739,100.0,35.0 -15:44:45,84.2931,29.477,29.739,100.0,35.0 -15:44:45,84.3359,29.477,29.739,100.0,35.0 -15:44:45,84.3775,29.477,29.739,100.0,35.0 -15:44:45,84.4184,29.477,29.739,100.0,35.0 -15:44:45,84.4615,29.477,29.739,100.0,35.0 -15:44:45,84.5032,29.477,29.739,100.0,35.0 -15:44:45,84.5462,29.503,29.739,100.0,35.0 -15:44:45,84.5875,29.529,29.739,100.0,35.0 -15:44:45,84.6311,29.477,29.739,100.0,35.0 -15:44:45,84.6740,29.503,29.765,100.0,35.0 -15:44:45,84.7184,29.477,29.765,100.0,35.0 -15:44:45,84.7628,29.503,29.791,100.0,35.0 -15:44:45,84.8052,29.503,29.739,100.0,35.0 -15:44:46,84.8489,29.503,29.765,100.0,35.0 -15:44:46,84.8905,29.503,29.791,100.0,35.0 -15:44:46,84.9349,29.503,29.765,100.0,35.0 -15:44:46,84.9775,29.503,29.765,100.0,35.0 -15:44:46,85.0192,29.503,29.791,100.0,35.0 -15:44:46,85.0634,29.529,29.791,100.0,35.0 -15:44:46,85.1053,29.529,29.765,100.0,35.0 -15:44:46,85.1489,29.503,29.791,100.0,35.0 -15:44:46,85.1918,29.529,29.791,100.0,35.0 -15:44:46,85.2323,29.529,29.818,100.0,35.0 -15:44:46,85.2753,29.529,29.739,100.0,35.0 -15:44:46,85.3158,29.529,29.791,100.0,35.0 -15:44:46,85.3568,29.529,29.818,100.0,35.0 -15:44:46,85.4006,29.529,29.818,100.0,35.0 -15:44:46,85.4433,29.529,29.791,100.0,35.0 -15:44:46,85.4837,29.555,29.791,100.0,35.0 -15:44:46,85.5250,29.529,29.791,100.0,35.0 -15:44:46,85.5656,29.555,29.818,100.0,35.0 -15:44:46,85.6076,29.529,29.818,100.0,35.0 -15:44:46,85.6546,29.555,29.818,100.0,35.0 -15:44:46,85.6984,29.555,29.791,100.0,35.0 -15:44:46,85.7414,29.555,29.818,100.0,35.0 -15:44:46,85.7827,29.503,29.818,100.0,35.0 -15:44:47,85.8248,29.555,29.844,100.0,35.0 -15:44:47,85.8666,29.555,29.844,100.0,35.0 -15:44:47,85.9107,29.555,29.818,100.0,35.0 -15:44:47,85.9518,29.555,29.818,100.0,35.0 -15:44:47,85.9948,29.555,29.897,100.0,35.0 -15:44:47,86.0366,29.582,29.739,100.0,35.0 -15:44:47,86.0806,29.555,29.818,100.0,35.0 -15:44:47,86.1307,29.555,29.844,100.0,35.0 -15:44:47,86.1729,29.555,29.818,100.0,35.0 -15:44:47,86.2166,29.582,29.844,100.0,35.0 -15:44:47,86.2633,29.582,29.844,100.0,35.0 -15:44:47,86.3051,29.582,29.844,100.0,35.0 -15:44:47,86.3486,29.582,29.844,100.0,35.0 -15:44:47,86.3926,29.582,29.844,100.0,35.0 -15:44:47,86.4325,29.582,29.87,100.0,35.0 -15:44:47,86.4755,29.608,29.844,100.0,35.0 -15:44:47,86.5153,29.582,29.844,100.0,35.0 -15:44:47,86.5636,29.582,29.87,100.0,35.0 -15:44:47,86.6065,29.582,29.897,100.0,35.0 -15:44:47,86.6509,29.66,29.87,100.0,35.0 -15:44:47,86.6934,29.608,29.87,100.0,35.0 -15:44:47,86.7345,29.529,29.87,100.0,35.0 -15:44:47,86.7786,29.582,29.87,100.0,35.0 -15:44:48,86.8242,29.608,29.87,100.0,35.0 -15:44:48,86.8711,29.608,29.87,100.0,35.0 -15:44:48,86.9168,29.608,29.897,100.0,35.0 -15:44:48,86.9613,29.634,29.897,100.0,35.0 -15:44:48,87.0054,29.608,29.897,100.0,35.0 -15:44:48,87.0501,29.634,29.87,100.0,35.0 -15:44:48,87.0924,29.634,29.87,100.0,35.0 -15:44:48,87.1356,29.634,29.87,100.0,35.0 -15:44:48,87.1819,29.634,29.897,100.0,35.0 -15:44:48,87.2248,29.634,29.923,100.0,35.0 -15:44:48,87.2681,29.608,29.897,100.0,35.0 -15:44:48,87.3140,29.634,29.897,100.0,35.0 -15:44:48,87.3580,29.66,29.923,100.0,35.0 -15:44:48,87.3995,29.634,29.923,100.0,35.0 -15:44:48,87.4415,29.634,29.923,100.0,35.0 -15:44:48,87.4845,29.66,29.923,100.0,35.0 -15:44:48,87.5316,29.66,29.949,100.0,35.0 -15:44:48,87.5755,29.634,29.923,100.0,35.0 -15:44:48,87.6191,29.634,29.923,100.0,35.0 -15:44:48,87.6646,29.687,29.923,100.0,35.0 -15:44:48,87.7084,29.66,29.923,100.0,35.0 -15:44:48,87.7528,29.66,29.923,100.0,35.0 -15:44:48,87.8000,29.66,29.949,100.0,35.0 -15:44:49,87.8433,29.66,29.923,100.0,35.0 -15:44:49,87.8855,29.687,29.923,100.0,35.0 -15:44:49,87.9308,29.634,29.949,100.0,35.0 -15:44:49,87.9755,29.66,29.923,100.0,35.0 -15:44:49,88.0188,29.687,29.949,100.0,35.0 -15:44:49,88.0638,29.66,29.949,100.0,35.0 -15:44:49,88.1069,29.687,29.949,100.0,35.0 -15:44:49,88.1488,29.66,29.949,100.0,35.0 -15:44:49,88.1914,29.687,29.949,100.0,35.0 -15:44:49,88.2341,29.687,29.949,100.0,35.0 -15:44:49,88.2797,29.687,29.949,100.0,35.0 -15:44:49,88.3246,29.687,29.949,100.0,35.0 -15:44:49,88.3683,29.713,29.949,100.0,35.0 -15:44:49,88.4151,29.713,29.949,100.0,35.0 -15:44:49,88.4583,29.687,29.949,100.0,35.0 -15:44:49,88.5019,29.687,29.975,100.0,35.0 -15:44:49,88.5482,29.713,29.975,100.0,35.0 -15:44:49,88.5920,29.713,29.975,100.0,35.0 -15:44:49,88.6347,29.713,29.975,100.0,35.0 -15:44:49,88.6813,29.687,29.975,100.0,35.0 -15:44:49,88.7247,29.739,29.975,100.0,35.0 -15:44:49,88.7683,29.713,29.975,100.0,35.0 -15:44:50,88.8150,29.713,30.002,100.0,35.0 -15:44:50,88.8583,29.713,29.975,100.0,35.0 -15:44:50,88.9005,29.713,30.002,100.0,35.0 -15:44:50,88.9475,29.713,30.028,100.0,35.0 -15:44:50,88.9916,29.713,30.002,100.0,35.0 -15:44:50,89.0338,29.713,29.975,100.0,35.0 -15:44:50,89.0786,29.739,30.002,100.0,35.0 -15:44:50,89.1226,29.739,30.002,100.0,35.0 -15:44:50,89.1680,29.713,30.028,100.0,35.0 -15:44:50,89.2155,29.739,30.002,100.0,35.0 -15:44:50,89.2644,29.791,30.002,100.0,35.0 -15:44:50,89.3095,29.739,29.975,100.0,35.0 -15:44:50,89.3527,29.818,30.002,100.0,35.0 -15:44:50,89.3991,29.739,30.028,100.0,35.0 -15:44:50,89.4425,29.739,30.002,100.0,35.0 -15:44:50,89.4852,29.739,30.002,100.0,35.0 -15:44:50,89.5315,29.765,30.028,100.0,35.0 -15:44:50,89.5752,29.739,30.054,100.0,35.0 -15:44:50,89.6186,29.765,30.028,100.0,35.0 -15:44:50,89.6661,29.765,30.054,100.0,35.0 -15:44:50,89.7095,29.765,30.054,100.0,35.0 -15:44:50,89.7548,29.765,30.028,100.0,35.0 -15:44:50,89.8027,29.765,30.028,100.0,35.0 -15:44:51,89.8496,29.765,30.028,100.0,35.0 -15:44:51,89.8937,29.818,30.054,100.0,35.0 -15:44:51,89.9372,29.791,30.054,100.0,35.0 -15:44:51,89.9827,29.765,30.054,100.0,35.0 -15:44:51,90.0296,29.791,30.054,100.0,35.0 -15:44:51,90.0946,29.791,30.028,100.0,35.0 -15:44:51,90.1420,29.87,30.054,100.0,35.0 -15:44:51,90.1877,29.791,30.028,100.0,35.0 -15:44:51,90.2334,29.791,30.054,100.0,35.0 -15:44:51,90.2789,29.791,30.054,100.0,35.0 -15:44:51,90.3245,29.818,30.054,100.0,35.0 -15:44:51,90.3915,29.818,30.081,100.0,35.0 -15:44:51,90.4677,29.818,30.054,100.0,35.0 -15:44:51,90.5331,29.818,30.081,100.0,35.0 -15:44:51,90.5956,29.87,30.081,100.0,35.0 -15:44:51,90.6514,29.87,30.081,100.0,35.0 -15:44:51,90.7126,29.818,30.081,100.0,35.0 -15:44:51,90.7676,29.818,30.081,100.0,35.0 -15:44:52,90.8252,29.844,30.081,100.0,35.0 -15:44:52,90.8811,29.818,30.054,100.0,35.0 -15:44:52,90.9357,29.818,30.107,100.0,35.0 -15:44:52,90.9936,29.844,30.133,100.0,35.0 -15:44:52,91.0516,29.844,30.107,100.0,35.0 -15:44:52,91.1106,29.844,30.133,100.0,35.0 -15:44:52,91.1646,29.844,30.107,100.0,35.0 -15:44:52,91.2202,29.844,30.133,100.0,35.0 -15:44:52,91.2800,29.844,30.107,100.0,35.0 -15:44:52,91.3347,29.844,30.133,100.0,35.0 -15:44:52,91.3896,29.87,30.133,100.0,35.0 -15:44:52,91.4417,29.844,30.107,100.0,35.0 -15:44:52,91.4913,29.844,30.16,100.0,35.0 -15:44:52,91.5457,29.844,30.16,100.0,35.0 -15:44:52,91.5977,29.87,30.107,100.0,35.0 -15:44:52,91.6427,29.87,30.133,100.0,35.0 -15:44:52,91.6858,29.87,30.107,100.0,35.0 -15:44:52,91.7317,29.87,30.133,100.0,35.0 -15:44:52,91.7757,29.897,30.16,100.0,35.0 -15:44:53,91.8191,29.87,30.133,100.0,35.0 -15:44:53,91.8636,29.897,30.133,100.0,35.0 -15:44:53,91.9186,29.897,30.081,100.0,35.0 -15:44:53,91.9721,29.897,30.186,100.0,35.0 -15:44:53,92.0208,29.897,30.16,100.0,35.0 -15:44:53,92.0684,29.87,30.16,100.0,35.0 -15:44:53,92.1142,29.897,30.16,100.0,35.0 -15:44:53,92.1587,29.897,30.133,100.0,35.0 -15:44:53,92.2028,29.897,30.16,100.0,35.0 -15:44:53,92.2506,29.844,30.16,100.0,35.0 -15:44:53,92.2985,29.897,30.16,100.0,35.0 -15:44:53,92.3415,29.949,30.16,100.0,35.0 -15:44:53,92.3838,29.923,30.16,100.0,35.0 -15:44:53,92.4268,29.897,30.186,100.0,35.0 -15:44:53,92.4686,29.897,30.16,100.0,35.0 -15:44:53,92.5145,29.923,30.212,100.0,35.0 -15:44:53,92.5586,29.897,30.186,100.0,35.0 -15:44:53,92.6013,29.923,30.186,100.0,35.0 -15:44:53,92.6473,29.923,30.212,100.0,35.0 -15:44:53,92.6922,29.923,30.186,100.0,35.0 -15:44:53,92.7354,29.923,30.239,100.0,35.0 -15:44:53,92.7794,29.923,30.186,100.0,35.0 -15:44:54,92.8236,29.923,30.186,100.0,35.0 -15:44:54,92.8651,29.923,30.186,100.0,35.0 -15:44:54,92.9103,29.949,30.212,100.0,35.0 -15:44:54,92.9525,29.949,30.186,100.0,35.0 -15:44:54,92.9976,29.949,30.212,100.0,35.0 -15:44:54,93.0412,29.949,30.186,100.0,35.0 -15:44:54,93.0835,29.949,30.186,100.0,35.0 -15:44:54,93.1257,29.949,30.212,100.0,35.0 -15:44:54,93.1674,29.923,30.212,100.0,35.0 -15:44:54,93.2127,29.923,30.212,100.0,35.0 -15:44:54,93.2555,29.949,30.186,100.0,35.0 -15:44:54,93.2999,29.975,30.239,100.0,35.0 -15:44:54,93.3441,29.975,30.212,100.0,35.0 -15:44:54,93.3869,29.949,30.239,100.0,35.0 -15:44:54,93.4325,29.949,30.212,100.0,35.0 -15:44:54,93.4745,29.949,30.239,100.0,35.0 -15:44:54,93.5175,29.949,30.186,100.0,35.0 -15:44:54,93.5627,29.975,30.239,100.0,35.0 -15:44:54,93.6049,29.975,30.239,100.0,35.0 -15:44:54,93.6502,29.975,30.239,100.0,35.0 -15:44:54,93.6955,29.949,30.239,100.0,35.0 -15:44:54,93.7399,30.002,30.239,100.0,35.0 -15:44:54,93.7817,29.975,30.239,100.0,35.0 -15:44:55,93.8248,29.975,30.239,100.0,35.0 -15:44:55,93.8671,29.949,30.239,100.0,35.0 -15:44:55,93.9090,30.002,30.239,100.0,35.0 -15:44:55,93.9519,29.975,30.212,100.0,35.0 -15:44:55,93.9969,29.975,30.239,100.0,35.0 -15:44:55,94.0407,30.002,30.186,100.0,35.0 -15:44:55,94.0821,30.002,30.265,100.0,35.0 -15:44:55,94.1247,29.975,30.239,100.0,35.0 -15:44:55,94.1672,30.002,30.265,100.0,35.0 -15:44:55,94.2117,30.054,30.265,100.0,35.0 -15:44:55,94.2557,30.054,30.265,100.0,35.0 -15:44:55,94.3011,30.002,30.265,100.0,35.0 -15:44:55,94.3462,30.028,30.292,100.0,35.0 -15:44:55,94.3898,30.028,30.265,100.0,35.0 -15:44:55,94.4315,30.054,30.265,100.0,35.0 -15:44:55,94.4739,30.028,30.292,100.0,35.0 -15:44:55,94.5156,30.028,30.318,100.0,35.0 -15:44:55,94.5580,30.028,30.265,100.0,35.0 -15:44:55,94.6008,30.028,30.292,100.0,35.0 -15:44:55,94.6458,30.028,30.292,100.0,35.0 -15:44:55,94.6899,30.028,30.292,100.0,35.0 -15:44:55,94.7324,30.028,30.292,100.0,35.0 -15:44:55,94.7769,30.028,30.292,100.0,35.0 -15:44:56,94.8207,30.081,30.292,100.0,35.0 -15:44:56,94.8658,30.028,30.292,100.0,35.0 -15:44:56,94.9096,30.081,30.292,100.0,35.0 -15:44:56,94.9526,30.054,30.318,100.0,35.0 -15:44:56,95.0057,30.002,30.292,100.0,35.0 -15:44:56,95.0564,30.054,30.318,100.0,35.0 -15:44:56,95.1025,30.054,30.265,100.0,35.0 -15:44:56,95.1498,30.054,30.292,100.0,35.0 -15:44:56,95.2014,30.054,30.318,100.0,35.0 -15:44:56,95.2497,30.107,30.344,100.0,35.0 -15:44:56,95.2987,30.054,30.318,100.0,35.0 -15:44:56,95.3405,30.081,30.318,100.0,35.0 -15:44:56,95.3857,30.081,30.318,100.0,35.0 -15:44:56,95.4335,30.133,30.344,100.0,35.0 -15:44:56,95.4836,30.054,30.344,100.0,35.0 -15:44:56,95.5318,30.081,30.344,100.0,35.0 -15:44:56,95.5759,30.081,30.344,100.0,35.0 -15:44:56,95.6187,30.002,30.344,100.0,35.0 -15:44:56,95.6636,30.081,30.344,100.0,35.0 -15:44:56,95.7078,30.081,30.318,100.0,35.0 -15:44:56,95.7508,30.081,30.344,100.0,35.0 -15:44:56,95.7967,30.081,30.344,100.0,35.0 -15:44:57,95.8396,30.133,30.344,100.0,35.0 -15:44:57,95.8818,30.054,30.318,100.0,35.0 -15:44:57,95.9239,30.133,30.397,100.0,35.0 -15:44:57,95.9675,30.107,30.344,100.0,35.0 -15:44:57,96.0137,30.107,30.371,100.0,35.0 -15:44:57,96.0574,30.107,30.344,100.0,35.0 -15:44:57,96.1010,30.107,30.344,100.0,35.0 -15:44:57,96.1467,30.107,30.371,100.0,35.0 -15:44:57,96.1899,30.054,30.397,100.0,35.0 -15:44:57,96.2324,30.107,30.292,100.0,35.0 -15:44:57,96.2785,30.107,30.371,100.0,35.0 -15:44:57,96.3218,30.133,30.371,100.0,35.0 -15:44:57,96.3667,30.107,30.371,100.0,35.0 -15:44:57,96.4108,30.107,30.424,100.0,35.0 -15:44:57,96.4552,30.107,30.371,100.0,35.0 -15:44:57,96.4999,30.107,30.397,100.0,35.0 -15:44:57,96.5513,30.133,30.397,100.0,35.0 -15:44:57,96.5961,30.081,30.397,100.0,35.0 -15:44:57,96.6400,30.133,30.397,100.0,35.0 -15:44:57,96.6850,30.133,30.371,100.0,35.0 -15:44:57,96.7301,30.133,30.344,100.0,35.0 -15:44:57,96.7734,30.133,30.397,100.0,35.0 -15:44:58,96.8170,30.133,30.397,100.0,35.0 -15:44:58,96.8608,30.16,30.397,100.0,35.0 -15:44:58,96.9037,30.133,30.45,100.0,35.0 -15:44:58,96.9494,30.133,30.424,100.0,35.0 -15:44:58,96.9952,30.133,30.397,100.0,35.0 -15:44:58,97.0384,30.16,30.424,100.0,35.0 -15:44:58,97.0819,30.16,30.397,100.0,35.0 -15:44:58,97.1248,30.186,30.424,100.0,35.0 -15:44:58,97.1676,30.16,30.371,100.0,35.0 -15:44:58,97.2126,30.16,30.424,100.0,35.0 -15:44:58,97.2557,30.16,30.424,100.0,35.0 -15:44:58,97.2988,30.16,30.424,100.0,35.0 -15:44:58,97.3418,30.16,30.45,100.0,35.0 -15:44:58,97.3843,30.265,30.424,100.0,35.0 -15:44:58,97.4287,30.16,30.424,100.0,35.0 -15:44:58,97.4727,30.133,30.45,100.0,35.0 -15:44:58,97.5158,30.186,30.424,100.0,35.0 -15:44:58,97.5597,30.186,30.424,100.0,35.0 -15:44:58,97.6030,30.186,30.424,100.0,35.0 -15:44:58,97.6475,30.16,30.45,100.0,35.0 -15:44:58,97.6929,30.133,30.424,100.0,35.0 -15:44:58,97.7371,30.212,30.45,100.0,35.0 -15:44:58,97.7816,30.186,30.476,100.0,35.0 -15:44:59,97.8241,30.186,30.529,100.0,35.0 -15:44:59,97.8676,30.186,30.45,100.0,35.0 -15:44:59,97.9125,30.186,30.476,100.0,35.0 -15:44:59,97.9566,30.212,30.476,100.0,35.0 -15:44:59,97.9993,30.186,30.476,100.0,35.0 -15:44:59,98.0444,30.186,30.476,100.0,35.0 -15:44:59,98.0888,30.212,30.476,100.0,35.0 -15:44:59,98.1305,30.186,30.503,100.0,35.0 -15:44:59,98.1726,30.212,30.476,100.0,35.0 -15:44:59,98.2146,30.212,30.476,100.0,35.0 -15:44:59,98.2567,30.265,30.45,100.0,35.0 -15:44:59,98.2986,30.186,30.476,100.0,35.0 -15:44:59,98.3425,30.212,30.503,100.0,35.0 -15:44:59,98.3863,30.265,30.476,100.0,35.0 -15:44:59,98.4314,30.186,30.476,100.0,35.0 -15:44:59,98.4749,30.239,30.476,100.0,35.0 -15:44:59,98.5182,30.212,30.476,100.0,35.0 -15:44:59,98.5637,30.292,30.476,100.0,35.0 -15:44:59,98.6100,30.265,30.503,100.0,35.0 -15:44:59,98.6551,30.239,30.45,100.0,35.0 -15:44:59,98.7003,30.239,30.476,100.0,35.0 -15:44:59,98.7457,30.239,30.476,100.0,35.0 -15:44:59,98.7916,30.265,30.529,100.0,35.0 -15:45:00,98.8385,30.239,30.476,100.0,35.0 -15:45:00,98.8833,30.239,30.503,100.0,35.0 -15:45:00,98.9316,30.239,30.503,100.0,35.0 -15:45:00,98.9760,30.239,30.503,100.0,35.0 -15:45:00,99.0220,30.239,30.529,100.0,35.0 -15:45:00,99.0673,30.239,30.529,100.0,35.0 -15:45:00,99.1112,30.265,30.529,100.0,35.0 -15:45:00,99.1544,30.239,30.529,100.0,35.0 -15:45:00,99.1981,30.239,30.503,100.0,35.0 -15:45:00,99.2447,30.265,30.503,100.0,35.0 -15:45:00,99.2882,30.265,30.529,100.0,35.0 -15:45:00,99.3301,30.265,30.582,100.0,35.0 -15:45:00,99.3737,30.239,30.556,100.0,35.0 -15:45:00,99.4168,30.239,30.529,100.0,35.0 -15:45:00,99.4614,30.265,30.529,100.0,35.0 -15:45:00,99.5067,30.292,30.503,100.0,35.0 -15:45:00,99.5507,30.292,30.529,100.0,35.0 -15:45:00,99.5964,30.292,30.476,100.0,35.0 -15:45:00,99.6399,30.292,30.529,100.0,35.0 -15:45:00,99.6834,30.292,30.556,100.0,35.0 -15:45:00,99.7297,30.292,30.556,100.0,35.0 -15:45:00,99.7748,30.292,30.529,100.0,35.0 -15:45:01,99.8179,30.292,30.529,100.0,35.0 -15:45:01,99.8657,30.292,30.556,100.0,35.0 -15:45:01,99.9131,30.292,30.529,100.0,35.0 -15:45:01,99.9570,30.292,30.556,100.0,35.0 -15:45:01,100.0004,30.292,30.582,100.0,35.0 -15:45:01,100.0453,30.292,30.556,100.0,35.0 -15:45:01,100.0887,30.292,30.556,100.0,35.0 -15:45:01,100.1307,30.318,30.556,100.0,35.0 -15:45:01,100.1748,30.292,30.556,100.0,35.0 -15:45:01,100.2168,30.239,30.609,100.0,35.0 -15:45:01,100.2621,30.265,30.556,100.0,35.0 -15:45:01,100.3057,30.292,30.582,100.0,35.0 -15:45:01,100.3488,30.292,30.556,100.0,35.0 -15:45:01,100.3937,30.292,30.582,100.0,35.0 -15:45:01,100.4367,30.318,30.556,100.0,35.0 -15:45:01,100.4811,30.292,30.635,100.0,35.0 -15:45:01,100.5259,30.318,30.582,100.0,35.0 -15:45:01,100.5696,30.318,30.582,100.0,35.0 -15:45:01,100.6149,30.318,30.582,100.0,35.0 -15:45:01,100.6613,30.318,30.609,100.0,35.0 -15:45:01,100.7048,30.344,30.609,100.0,35.0 -15:45:01,100.7499,30.318,30.609,100.0,35.0 -15:45:01,100.7955,30.265,30.582,100.0,35.0 -15:45:02,100.8392,30.344,30.582,100.0,35.0 -15:45:02,100.8828,30.344,30.609,100.0,35.0 -15:45:02,100.9291,30.344,30.635,100.0,35.0 -15:45:02,100.9744,30.344,30.609,100.0,35.0 -15:45:02,101.0187,30.344,30.609,100.0,35.0 -15:45:02,101.0651,30.344,30.609,100.0,35.0 -15:45:02,101.1095,30.344,30.635,100.0,35.0 -15:45:02,101.1546,30.344,30.609,100.0,35.0 -15:45:02,101.1994,30.344,30.635,100.0,35.0 -15:45:02,101.2449,30.371,30.609,100.0,35.0 -15:45:02,101.2897,30.344,30.609,100.0,35.0 -15:45:02,101.3343,30.371,30.635,100.0,35.0 -15:45:02,101.3803,30.397,30.688,100.0,35.0 -15:45:02,101.4233,30.318,30.635,100.0,35.0 -15:45:02,101.4667,30.371,30.635,100.0,35.0 -15:45:02,101.5129,30.371,30.635,100.0,35.0 -15:45:02,101.5562,30.371,30.529,100.0,35.0 -15:45:02,101.5992,30.424,30.635,100.0,35.0 -15:45:02,101.6445,30.371,30.635,100.0,35.0 -15:45:02,101.6887,30.371,30.635,100.0,35.0 -15:45:02,101.7330,30.371,30.635,100.0,35.0 -15:45:02,101.7786,30.397,30.662,100.0,35.0 -15:45:03,101.8223,30.397,30.635,100.0,35.0 -15:45:03,101.8660,30.397,30.662,100.0,35.0 -15:45:03,101.9115,30.424,30.635,100.0,35.0 -15:45:03,101.9556,30.397,30.662,100.0,35.0 -15:45:03,101.9986,30.371,30.688,100.0,35.0 -15:45:03,102.0435,30.397,30.662,100.0,35.0 -15:45:03,102.0870,30.397,30.688,100.0,35.0 -15:45:03,102.1325,30.397,30.662,100.0,35.0 -15:45:03,102.1774,30.397,30.688,100.0,35.0 -15:45:03,102.2216,30.397,30.662,100.0,35.0 -15:45:03,102.2656,30.397,30.688,100.0,35.0 -15:45:03,102.3124,30.397,30.662,100.0,35.0 -15:45:03,102.3569,30.45,30.635,100.0,35.0 -15:45:03,102.3998,30.424,30.688,100.0,35.0 -15:45:03,102.4479,30.476,30.609,100.0,35.0 -15:45:03,102.5031,30.397,30.688,100.0,35.0 -15:45:03,102.5469,30.424,30.715,100.0,35.0 -15:45:03,102.5926,30.424,30.688,100.0,35.0 -15:45:03,102.6363,30.424,30.688,100.0,35.0 -15:45:03,102.6826,30.424,30.688,100.0,35.0 -15:45:03,102.7311,30.424,30.715,100.0,35.0 -15:45:03,102.7761,30.424,30.715,100.0,35.0 -15:45:04,102.8207,30.476,30.688,100.0,35.0 -15:45:04,102.8651,30.45,30.688,100.0,35.0 -15:45:04,102.9116,30.45,30.715,100.0,35.0 -15:45:04,102.9554,30.424,30.715,100.0,35.0 -15:45:04,102.9998,30.476,30.715,100.0,35.0 -15:45:04,103.0461,30.45,30.715,100.0,35.0 -15:45:04,103.0888,30.45,30.715,100.0,35.0 -15:45:04,103.1316,30.476,30.715,100.0,35.0 -15:45:04,103.1756,30.45,30.741,100.0,35.0 -15:45:04,103.2197,30.476,30.715,100.0,35.0 -15:45:04,103.2656,30.476,30.741,100.0,35.0 -15:45:04,103.3113,30.45,30.715,100.0,35.0 -15:45:04,103.3559,30.503,30.741,100.0,35.0 -15:45:04,103.3993,30.424,30.715,100.0,35.0 -15:45:04,103.4447,30.503,30.741,100.0,35.0 -15:45:04,103.4894,30.476,30.715,100.0,35.0 -15:45:04,103.5331,30.476,30.768,100.0,35.0 -15:45:04,103.5794,30.476,30.741,100.0,35.0 -15:45:04,103.6234,30.476,30.688,100.0,35.0 -15:45:04,103.6665,30.476,30.768,100.0,35.0 -15:45:04,103.7117,30.45,30.741,100.0,35.0 -15:45:04,103.7547,30.476,30.741,100.0,35.0 -15:45:04,103.7989,30.45,30.794,100.0,35.0 -15:45:05,103.8455,30.476,30.741,100.0,35.0 -15:45:05,103.8891,30.476,30.741,100.0,35.0 -15:45:05,103.9323,30.503,30.741,100.0,35.0 -15:45:05,103.9777,30.503,30.768,100.0,35.0 -15:45:05,104.0223,30.476,30.768,100.0,35.0 -15:45:05,104.0668,30.529,30.768,100.0,35.0 -15:45:05,104.1126,30.529,30.768,100.0,35.0 -15:45:05,104.1563,30.529,30.768,100.0,35.0 -15:45:05,104.1996,30.503,30.768,100.0,35.0 -15:45:05,104.2454,30.503,30.768,100.0,35.0 -15:45:05,104.2899,30.529,30.768,100.0,35.0 -15:45:05,104.3332,30.503,30.794,100.0,35.0 -15:45:05,104.3785,30.503,30.794,100.0,35.0 -15:45:05,104.4226,30.503,30.768,100.0,35.0 -15:45:05,104.4652,30.503,30.688,100.0,35.0 -15:45:05,104.5107,30.503,30.794,100.0,35.0 -15:45:05,104.5545,30.529,30.794,100.0,35.0 -15:45:05,104.5979,30.529,30.794,100.0,35.0 -15:45:05,104.6447,30.556,30.741,100.0,35.0 -15:45:05,104.6887,30.529,30.821,100.0,35.0 -15:45:05,104.7319,30.529,30.768,100.0,35.0 -15:45:05,104.7777,30.529,30.794,100.0,35.0 -15:45:06,104.8218,30.529,30.794,100.0,35.0 -15:45:06,104.8676,30.529,30.794,100.0,35.0 -15:45:06,104.9344,30.529,30.794,100.0,35.0 -15:45:06,104.9868,30.503,30.794,100.0,35.0 -15:45:06,105.0327,30.556,30.821,100.0,35.0 -15:45:06,105.0861,30.556,30.821,100.0,35.0 -15:45:06,105.1406,30.556,30.821,100.0,35.0 -15:45:06,105.1899,30.556,30.821,100.0,35.0 -15:45:06,105.2357,30.556,30.821,100.0,35.0 -15:45:06,105.2839,30.556,30.821,100.0,35.0 -15:45:06,105.3327,30.503,30.847,100.0,35.0 -15:45:06,105.3926,30.556,30.821,100.0,35.0 -15:45:06,105.4780,30.556,30.821,100.0,35.0 -15:45:06,105.5449,30.529,30.821,100.0,35.0 -15:45:06,105.6108,30.582,30.847,100.0,35.0 -15:45:06,105.6667,30.582,30.847,100.0,35.0 -15:45:06,105.7276,30.582,30.847,100.0,35.0 -15:45:06,105.7832,30.582,30.874,100.0,35.0 -15:45:07,105.8440,30.582,30.847,100.0,35.0 -15:45:07,105.9041,30.609,30.847,100.0,35.0 -15:45:07,105.9627,30.582,30.847,100.0,35.0 -15:45:07,106.0212,30.609,30.847,100.0,35.0 -15:45:07,106.0793,30.582,30.874,100.0,35.0 -15:45:07,106.1434,30.609,30.847,100.0,35.0 -15:45:07,106.2007,30.582,30.874,100.0,35.0 -15:45:07,106.2626,30.609,30.874,100.0,35.0 -15:45:07,106.3213,30.609,30.9,100.0,35.0 -15:45:07,106.3753,30.635,30.9,100.0,35.0 -15:45:07,106.4279,30.609,30.874,100.0,35.0 -15:45:07,106.4798,30.609,30.847,100.0,35.0 -15:45:07,106.5316,30.609,30.9,100.0,35.0 -15:45:07,106.5799,30.582,30.874,100.0,35.0 -15:45:07,106.6279,30.635,30.874,100.0,35.0 -15:45:07,106.6735,30.635,30.794,100.0,35.0 -15:45:07,106.7199,30.609,30.9,100.0,35.0 -15:45:07,106.7652,30.635,30.98,100.0,35.0 -15:45:08,106.8121,30.635,30.927,100.0,35.0 -15:45:08,106.8718,30.635,30.953,100.0,35.0 -15:45:08,106.9213,30.662,30.9,100.0,35.0 -15:45:08,106.9673,30.609,30.9,100.0,35.0 -15:45:08,107.0135,30.635,30.9,100.0,35.0 -15:45:08,107.0597,30.635,30.927,100.0,35.0 -15:45:08,107.1078,30.635,30.927,100.0,35.0 -15:45:08,107.1586,30.662,30.927,100.0,35.0 -15:45:08,107.2045,30.662,30.927,100.0,35.0 -15:45:08,107.2491,30.662,30.927,100.0,35.0 -15:45:08,107.2963,30.662,30.927,100.0,35.0 -15:45:08,107.3431,30.662,30.953,100.0,35.0 -15:45:08,107.3891,30.662,30.927,100.0,35.0 -15:45:08,107.4335,30.662,30.9,100.0,35.0 -15:45:08,107.4798,30.688,30.927,100.0,35.0 -15:45:08,107.5283,30.662,30.927,100.0,35.0 -15:45:08,107.5732,30.662,30.9,100.0,35.0 -15:45:08,107.6179,30.688,30.953,100.0,35.0 -15:45:08,107.6655,30.662,30.9,100.0,35.0 -15:45:08,107.7117,30.688,30.953,100.0,35.0 -15:45:08,107.7594,30.688,30.927,100.0,35.0 -15:45:08,107.8048,30.741,30.953,100.0,35.0 -15:45:09,107.8495,30.688,30.953,100.0,35.0 -15:45:09,107.8957,30.715,30.953,100.0,35.0 -15:45:09,107.9424,30.688,30.953,100.0,35.0 -15:45:09,107.9887,30.688,30.953,100.0,35.0 -15:45:09,108.0328,30.662,30.953,100.0,35.0 -15:45:09,108.0787,30.741,30.953,100.0,35.0 -15:45:09,108.1244,30.688,30.98,100.0,35.0 -15:45:09,108.1695,30.715,30.98,100.0,35.0 -15:45:09,108.2142,30.688,30.98,100.0,35.0 -15:45:09,108.2603,30.715,30.98,100.0,35.0 -15:45:09,108.3047,30.715,30.953,100.0,35.0 -15:45:09,108.3503,30.715,31.007,100.0,35.0 -15:45:09,108.3971,30.715,30.98,100.0,35.0 -15:45:09,108.4443,30.715,30.98,100.0,35.0 -15:45:09,108.4890,30.715,30.98,100.0,35.0 -15:45:09,108.5353,30.715,30.953,100.0,35.0 -15:45:09,108.5819,30.715,31.007,100.0,35.0 -15:45:09,108.6301,30.715,30.98,100.0,35.0 -15:45:09,108.6807,30.715,31.007,100.0,35.0 -15:45:09,108.7283,30.741,30.927,100.0,35.0 -15:45:09,108.7767,30.741,31.007,100.0,35.0 -15:45:10,108.8225,30.741,31.007,100.0,35.0 -15:45:10,108.8697,30.741,31.007,100.0,35.0 -15:45:10,108.9157,30.741,31.007,100.0,35.0 -15:45:10,108.9632,30.715,31.007,100.0,35.0 -15:45:10,109.0112,30.794,31.007,100.0,35.0 -15:45:10,109.0755,30.741,31.007,100.0,35.0 -15:45:10,109.1245,30.741,31.033,100.0,35.0 -15:45:10,109.1730,30.768,31.007,100.0,35.0 -15:45:10,109.2197,30.715,30.927,100.0,35.0 -15:45:10,109.2658,30.741,31.007,100.0,35.0 -15:45:10,109.3153,30.794,31.033,100.0,35.0 -15:45:10,109.3625,30.741,31.06,100.0,35.0 -15:45:10,109.4109,30.768,30.98,100.0,35.0 -15:45:10,109.4579,30.768,31.033,100.0,35.0 -15:45:10,109.5048,30.768,31.033,100.0,35.0 -15:45:10,109.5495,30.688,31.033,100.0,35.0 -15:45:10,109.5948,30.768,31.033,100.0,35.0 -15:45:10,109.6393,30.768,31.086,100.0,35.0 -15:45:10,109.6836,30.768,31.033,100.0,35.0 -15:45:10,109.7297,30.768,31.086,100.0,35.0 -15:45:10,109.7787,30.768,31.086,100.0,35.0 -15:45:11,109.8236,30.741,31.033,100.0,35.0 -15:45:11,109.8707,30.768,31.033,100.0,35.0 -15:45:11,109.9145,30.847,31.06,100.0,35.0 -15:45:11,109.9621,30.768,31.06,100.0,35.0 -15:45:11,110.0161,30.794,31.06,100.0,35.0 -15:45:11,110.0637,30.794,31.06,100.0,35.0 -15:45:11,110.1116,30.794,31.086,100.0,35.0 -15:45:11,110.1587,30.794,31.06,100.0,35.0 -15:45:11,110.2045,30.794,31.06,100.0,35.0 -15:45:11,110.2499,30.794,31.06,100.0,35.0 -15:45:11,110.2971,30.794,31.086,100.0,35.0 -15:45:11,110.3446,30.794,31.06,100.0,35.0 -15:45:11,110.3896,30.821,31.06,100.0,35.0 -15:45:11,110.4372,30.794,31.06,100.0,35.0 -15:45:11,110.4818,30.768,31.086,100.0,35.0 -15:45:11,110.5308,30.794,31.086,100.0,35.0 -15:45:11,110.5795,30.821,31.086,100.0,35.0 -15:45:11,110.6280,30.821,31.086,100.0,35.0 -15:45:11,110.6749,30.821,31.086,100.0,35.0 -15:45:11,110.7218,30.821,31.06,100.0,35.0 -15:45:11,110.7699,30.821,31.06,100.0,35.0 -15:45:12,110.8162,30.821,31.113,100.0,35.0 -15:45:12,110.8656,30.821,31.086,100.0,35.0 -15:45:12,110.9132,30.847,31.086,100.0,35.0 -15:45:12,110.9606,30.821,31.113,100.0,35.0 -15:45:12,111.0077,30.847,31.113,100.0,35.0 -15:45:12,111.0559,30.821,31.113,100.0,35.0 -15:45:12,111.1035,30.821,31.113,100.0,35.0 -15:45:12,111.1515,30.847,31.113,100.0,35.0 -15:45:12,111.1996,30.874,31.113,100.0,35.0 -15:45:12,111.2484,30.847,31.06,100.0,35.0 -15:45:12,111.3520,30.9,31.086,100.0,35.0 -15:45:12,111.3998,30.847,31.14,100.0,35.0 -15:45:12,111.4480,30.874,31.14,100.0,35.0 -15:45:12,111.4970,30.847,31.14,100.0,35.0 -15:45:12,111.5455,30.9,31.113,100.0,35.0 -15:45:12,111.5938,30.847,31.14,100.0,35.0 -15:45:12,111.6419,30.847,31.14,100.0,35.0 -15:45:12,111.6897,30.9,31.14,100.0,35.0 -15:45:12,111.7373,30.847,31.113,100.0,35.0 -15:45:12,111.7859,30.9,31.14,100.0,35.0 -15:45:13,111.8323,30.874,31.14,100.0,35.0 -15:45:13,111.8811,30.874,31.14,100.0,35.0 -15:45:13,111.9292,30.847,31.166,100.0,35.0 -15:45:13,111.9765,30.9,31.14,100.0,35.0 -15:45:13,112.0222,30.847,31.14,100.0,35.0 -15:45:13,112.0687,30.874,31.166,100.0,35.0 -15:45:13,112.1153,30.9,31.14,100.0,35.0 -15:45:13,112.1639,30.874,31.14,100.0,35.0 -15:45:13,112.2126,30.9,31.193,100.0,35.0 -15:45:13,112.2616,30.874,31.113,100.0,35.0 -15:45:13,112.3116,30.9,31.14,100.0,35.0 -15:45:13,112.3606,30.9,31.14,100.0,35.0 -15:45:13,112.4065,30.9,31.166,100.0,35.0 -15:45:13,112.4535,30.874,31.166,100.0,35.0 -15:45:13,112.5009,30.9,31.193,100.0,35.0 -15:45:13,112.5480,30.9,31.166,100.0,35.0 -15:45:13,112.5976,30.927,31.166,100.0,35.0 -15:45:13,112.6491,30.927,31.193,100.0,35.0 -15:45:13,112.6987,30.874,31.193,100.0,35.0 -15:45:13,112.7585,30.927,31.193,100.0,35.0 -15:45:13,112.8015,30.927,31.166,100.0,35.0 -15:45:14,112.8495,30.927,31.193,100.0,35.0 -15:45:14,112.8984,30.874,31.193,100.0,35.0 -15:45:14,112.9465,30.953,31.166,100.0,35.0 -15:45:14,112.9935,30.927,31.193,100.0,35.0 -15:45:14,113.0405,30.953,31.193,100.0,35.0 -15:45:14,113.0866,30.9,31.193,100.0,35.0 -15:45:14,113.1329,30.927,31.193,100.0,35.0 -15:45:14,113.1807,30.953,31.193,100.0,35.0 -15:45:14,113.2263,30.927,31.166,100.0,35.0 -15:45:14,113.2727,30.953,31.219,100.0,35.0 -15:45:14,113.3165,30.953,31.219,100.0,35.0 -15:45:14,113.3629,30.927,31.219,100.0,35.0 -15:45:14,113.4081,30.927,31.193,100.0,35.0 -15:45:14,113.4515,30.953,31.193,100.0,35.0 -15:45:14,113.4965,30.953,31.219,100.0,35.0 -15:45:14,113.5422,30.953,31.219,100.0,35.0 -15:45:14,113.5852,30.953,31.246,100.0,35.0 -15:45:14,113.6279,30.953,31.219,100.0,35.0 -15:45:14,113.6732,30.953,31.219,100.0,35.0 -15:45:14,113.7163,30.953,31.219,100.0,35.0 -15:45:14,113.7622,30.98,31.246,100.0,35.0 -15:45:15,113.8087,30.953,31.219,100.0,35.0 -15:45:15,113.8531,30.953,31.246,100.0,35.0 -15:45:15,113.8965,30.98,31.246,100.0,35.0 -15:45:15,113.9415,30.98,31.246,100.0,35.0 -15:45:15,113.9842,30.98,31.246,100.0,35.0 -15:45:15,114.0263,30.953,31.246,100.0,35.0 -15:45:15,114.0705,30.98,31.246,100.0,35.0 -15:45:15,114.1147,30.98,31.246,100.0,35.0 -15:45:15,114.1612,30.98,31.246,100.0,35.0 -15:45:15,114.2069,30.98,31.219,100.0,35.0 -15:45:15,114.2511,30.98,31.273,100.0,35.0 -15:45:15,114.2931,30.98,31.246,100.0,35.0 -15:45:15,114.3355,31.007,31.246,100.0,35.0 -15:45:15,114.3795,30.953,31.246,100.0,35.0 -15:45:15,114.4236,30.98,31.273,100.0,35.0 -15:45:15,114.4679,31.007,31.246,100.0,35.0 -15:45:15,114.5103,31.007,31.246,100.0,35.0 -15:45:15,114.5555,30.98,31.246,100.0,35.0 -15:45:15,114.5987,30.98,31.246,100.0,35.0 -15:45:15,114.6426,30.98,31.273,100.0,35.0 -15:45:15,114.6856,31.007,31.273,100.0,35.0 -15:45:15,114.7302,31.007,31.273,100.0,35.0 -15:45:15,114.7770,31.06,31.273,100.0,35.0 -15:45:16,114.8228,31.033,31.273,100.0,35.0 -15:45:16,114.8683,31.033,31.193,100.0,35.0 -15:45:16,114.9125,31.033,31.353,100.0,35.0 -15:45:16,114.9587,31.033,31.299,100.0,35.0 -15:45:16,115.0041,31.007,31.299,100.0,35.0 -15:45:16,115.0487,31.06,31.299,100.0,35.0 -15:45:16,115.0961,31.033,31.299,100.0,35.0 -15:45:16,115.1428,31.033,31.299,100.0,35.0 -15:45:16,115.1901,31.033,31.273,100.0,35.0 -15:45:16,115.2362,31.033,31.299,100.0,35.0 -15:45:16,115.2824,31.06,31.299,100.0,35.0 -15:45:16,115.3292,31.007,31.299,100.0,35.0 -15:45:16,115.3769,31.113,31.299,100.0,35.0 -15:45:16,115.4226,31.033,31.273,100.0,35.0 -15:45:16,115.4687,31.033,31.299,100.0,35.0 -15:45:16,115.5137,31.086,31.299,100.0,35.0 -15:45:16,115.5606,31.06,31.299,100.0,35.0 -15:45:16,115.6054,31.06,31.299,100.0,35.0 -15:45:16,115.6507,31.033,31.326,100.0,35.0 -15:45:16,115.6963,31.033,31.326,100.0,35.0 -15:45:16,115.7438,31.06,31.299,100.0,35.0 -15:45:16,115.7909,31.033,31.299,100.0,35.0 -15:45:17,115.8358,31.06,31.326,100.0,35.0 -15:45:17,115.8811,31.06,31.326,100.0,35.0 -15:45:17,115.9271,31.06,31.326,100.0,35.0 -15:45:17,115.9717,31.033,31.326,100.0,35.0 -15:45:17,116.0168,31.086,31.326,100.0,35.0 -15:45:17,116.0621,31.086,31.326,100.0,35.0 -15:45:17,116.1101,31.06,31.353,100.0,35.0 -15:45:17,116.1567,31.086,31.353,100.0,35.0 -15:45:17,116.2015,31.086,31.326,100.0,35.0 -15:45:17,116.2478,31.086,31.326,100.0,35.0 -15:45:17,116.2948,31.086,31.326,100.0,35.0 -15:45:17,116.3396,31.166,31.353,100.0,35.0 -15:45:17,116.3835,31.113,31.379,100.0,35.0 -15:45:17,116.4265,31.113,31.353,100.0,35.0 -15:45:17,116.4719,31.113,31.353,100.0,35.0 -15:45:17,116.5160,31.113,31.353,100.0,35.0 -15:45:17,116.5625,31.113,31.379,100.0,35.0 -15:45:17,116.6103,31.14,31.46,100.0,35.0 -15:45:17,116.6575,31.113,31.379,100.0,35.0 -15:45:17,116.7016,31.14,31.379,100.0,35.0 -15:45:17,116.7457,31.14,31.379,100.0,35.0 -15:45:17,116.7928,31.14,31.379,100.0,35.0 -15:45:18,116.8395,31.113,31.379,100.0,35.0 -15:45:18,116.8863,31.113,31.299,100.0,35.0 -15:45:18,116.9321,31.033,31.379,100.0,35.0 -15:45:18,116.9797,31.113,31.406,100.0,35.0 -15:45:18,117.0277,31.113,31.353,100.0,35.0 -15:45:18,117.0752,31.14,31.379,100.0,35.0 -15:45:18,117.1201,31.113,31.379,100.0,35.0 -15:45:18,117.1656,31.193,31.406,100.0,35.0 -15:45:18,117.2126,31.14,31.406,100.0,35.0 -15:45:18,117.2599,31.14,31.326,100.0,35.0 -15:45:18,117.3067,31.14,31.406,100.0,35.0 -15:45:18,117.3520,31.166,31.406,100.0,35.0 -15:45:18,117.3954,31.14,31.406,100.0,35.0 -15:45:18,117.4415,31.14,31.326,100.0,35.0 -15:45:18,117.4871,31.14,31.406,100.0,35.0 -15:45:18,117.5324,31.14,31.406,100.0,35.0 -15:45:18,117.5795,31.113,31.406,100.0,35.0 -15:45:18,117.6266,31.166,31.406,100.0,35.0 -15:45:18,117.6721,31.14,31.406,100.0,35.0 -15:45:18,117.7173,31.166,31.433,100.0,35.0 -15:45:18,117.7610,31.166,31.433,100.0,35.0 -15:45:19,117.8089,31.166,31.433,100.0,35.0 -15:45:19,117.8528,31.14,31.406,100.0,35.0 -15:45:19,117.8985,31.14,31.433,100.0,35.0 -15:45:19,117.9447,31.166,31.406,100.0,35.0 -15:45:19,117.9913,31.193,31.406,100.0,35.0 -15:45:19,118.0342,31.166,31.46,100.0,35.0 -15:45:19,118.0797,31.166,31.406,100.0,35.0 -15:45:19,118.1259,31.166,31.433,100.0,35.0 -15:45:19,118.1711,31.14,31.433,100.0,35.0 -15:45:19,118.2168,31.166,31.433,100.0,35.0 -15:45:19,118.2618,31.14,31.433,100.0,35.0 -15:45:19,118.3080,31.14,31.433,100.0,35.0 -15:45:19,118.3525,31.193,31.486,100.0,35.0 -15:45:19,118.3973,31.193,31.433,100.0,35.0 -15:45:19,118.4447,31.166,31.46,100.0,35.0 -15:45:19,118.4932,31.193,31.433,100.0,35.0 -15:45:19,118.5401,31.193,31.46,100.0,35.0 -15:45:19,118.5851,31.166,31.46,100.0,35.0 -15:45:19,118.6288,31.193,31.46,100.0,35.0 -15:45:19,118.6747,31.193,31.46,100.0,35.0 -15:45:19,118.7196,31.193,31.486,100.0,35.0 -15:45:19,118.7654,31.193,31.513,100.0,35.0 -15:45:20,118.8112,31.219,31.433,100.0,35.0 -15:45:20,118.8582,31.219,31.46,100.0,35.0 -15:45:20,118.9005,31.219,31.486,100.0,35.0 -15:45:20,118.9438,31.219,31.486,100.0,35.0 -15:45:20,118.9863,31.219,31.54,100.0,35.0 -15:45:20,119.0283,31.246,31.486,100.0,35.0 -15:45:20,119.0736,31.219,31.486,100.0,35.0 -15:45:20,119.1165,31.219,31.486,100.0,35.0 -15:45:20,119.1587,31.219,31.486,100.0,35.0 -15:45:20,119.2029,31.219,31.486,100.0,35.0 -15:45:20,119.2442,31.273,31.486,100.0,35.0 -15:45:20,119.2858,31.219,31.566,100.0,35.0 -15:45:20,119.3284,31.219,31.513,100.0,35.0 -15:45:20,119.3748,31.219,31.513,100.0,35.0 -15:45:20,119.4191,31.273,31.513,100.0,35.0 -15:45:20,119.4630,31.273,31.513,100.0,35.0 -15:45:20,119.5119,31.246,31.513,100.0,35.0 -15:45:20,119.5593,31.246,31.486,100.0,35.0 -15:45:20,119.6090,31.246,31.54,100.0,35.0 -15:45:20,119.6547,31.246,31.513,100.0,35.0 -15:45:20,119.7034,31.246,31.513,100.0,35.0 -15:45:20,119.7495,31.219,31.513,100.0,35.0 -15:45:20,119.7959,31.246,31.513,100.0,35.0 -15:45:21,119.8423,31.273,31.54,100.0,35.0 -15:45:21,119.8897,31.219,31.513,100.0,35.0 -15:45:21,119.9356,31.246,31.513,100.0,35.0 -15:45:21,119.9836,31.246,31.513,100.0,35.0 -15:45:21,120.0285,31.273,31.566,100.0,35.0 -15:45:21,120.0856,31.273,31.513,100.0,35.0 -15:45:21,120.1395,31.273,31.54,100.0,35.0 -15:45:21,120.1836,31.273,31.54,100.0,35.0 -15:45:21,120.2288,31.273,31.513,100.0,35.0 -15:45:21,120.2757,31.246,31.54,100.0,35.0 -15:45:21,120.3233,31.273,31.54,100.0,35.0 -15:45:21,120.3693,31.273,31.566,100.0,35.0 -15:45:21,120.4388,31.246,31.54,100.0,35.0 -15:45:21,120.5046,31.273,31.566,100.0,35.0 -15:45:21,120.5721,31.299,31.566,100.0,35.0 -15:45:21,120.6438,31.273,31.54,100.0,35.0 -15:45:21,120.7040,31.273,31.54,100.0,35.0 -15:45:21,120.7595,31.299,31.566,100.0,35.0 -15:45:22,120.8166,31.299,31.566,100.0,35.0 -15:45:22,120.8771,31.299,31.513,100.0,35.0 -15:45:22,120.9343,31.299,31.566,100.0,35.0 -15:45:22,120.9929,31.299,31.566,100.0,35.0 -15:45:22,121.0540,31.299,31.566,100.0,35.0 -15:45:22,121.1115,31.273,31.566,100.0,35.0 -15:45:22,121.1736,31.299,31.62,100.0,35.0 -15:45:22,121.2374,31.379,31.566,100.0,35.0 -15:45:22,121.2946,31.326,31.593,100.0,35.0 -15:45:22,121.3523,31.299,31.593,100.0,35.0 -15:45:22,121.4024,31.326,31.513,100.0,35.0 -15:45:22,121.4521,31.273,31.54,100.0,35.0 -15:45:22,121.5017,31.326,31.593,100.0,35.0 -15:45:22,121.5525,31.326,31.593,100.0,35.0 -15:45:22,121.6003,31.326,31.62,100.0,35.0 -15:45:22,121.6480,31.326,31.593,100.0,35.0 -15:45:22,121.6975,31.326,31.593,100.0,35.0 -15:45:22,121.7448,31.379,31.593,100.0,35.0 -15:45:22,121.7902,31.353,31.593,100.0,35.0 -15:45:23,121.8487,31.353,31.593,100.0,35.0 -15:45:23,121.8974,31.326,31.593,100.0,35.0 -15:45:23,121.9470,31.326,31.62,100.0,35.0 -15:45:23,121.9910,31.353,31.62,100.0,35.0 -15:45:23,122.0337,31.326,31.62,100.0,35.0 -15:45:23,122.0751,31.379,31.62,100.0,35.0 -15:45:23,122.1181,31.353,31.62,100.0,35.0 -15:45:23,122.1611,31.353,31.593,100.0,35.0 -15:45:23,122.2072,31.379,31.62,100.0,35.0 -15:45:23,122.2496,31.379,31.647,100.0,35.0 -15:45:23,122.3037,31.433,31.647,100.0,35.0 -15:45:23,122.3467,31.326,31.62,100.0,35.0 -15:45:23,122.3919,31.353,31.62,100.0,35.0 -15:45:23,122.4348,31.353,31.62,100.0,35.0 -15:45:23,122.4771,31.379,31.647,100.0,35.0 -15:45:23,122.5233,31.379,31.647,100.0,35.0 -15:45:23,122.5658,31.379,31.647,100.0,35.0 -15:45:23,122.6087,31.379,31.647,100.0,35.0 -15:45:23,122.6528,31.299,31.593,100.0,35.0 -15:45:23,122.6965,31.353,31.674,100.0,35.0 -15:45:23,122.7423,31.406,31.647,100.0,35.0 -15:45:23,122.7854,31.406,31.647,100.0,35.0 -15:45:24,122.8289,31.379,31.647,100.0,35.0 -15:45:24,122.8746,31.379,31.62,100.0,35.0 -15:45:24,122.9173,31.379,31.674,100.0,35.0 -15:45:24,122.9606,31.353,31.647,100.0,35.0 -15:45:24,123.0069,31.379,31.647,100.0,35.0 -15:45:24,123.0500,31.379,31.674,100.0,35.0 -15:45:24,123.0917,31.406,31.674,100.0,35.0 -15:45:24,123.1345,31.379,31.647,100.0,35.0 -15:45:24,123.1771,31.406,31.674,100.0,35.0 -15:45:24,123.2218,31.379,31.674,100.0,35.0 -15:45:24,123.2653,31.326,31.727,100.0,35.0 -15:45:24,123.3082,31.406,31.674,100.0,35.0 -15:45:24,123.3525,31.406,31.674,100.0,35.0 -15:45:24,123.4025,31.406,31.7,100.0,35.0 -15:45:24,123.4524,31.406,31.674,100.0,35.0 -15:45:24,123.4956,31.406,31.7,100.0,35.0 -15:45:24,123.5403,31.433,31.674,100.0,35.0 -15:45:24,123.5831,31.379,31.674,100.0,35.0 -15:45:24,123.6243,31.406,31.7,100.0,35.0 -15:45:24,123.6705,31.406,31.727,100.0,35.0 -15:45:24,123.7161,31.433,31.674,100.0,35.0 -15:45:24,123.7589,31.433,31.7,100.0,35.0 -15:45:24,123.8057,31.433,31.727,100.0,35.0 -15:45:25,123.8498,31.353,31.7,100.0,35.0 -15:45:25,123.8930,31.433,31.7,100.0,35.0 -15:45:25,123.9378,31.406,31.7,100.0,35.0 -15:45:25,123.9820,31.486,31.7,100.0,35.0 -15:45:25,124.0275,31.433,31.727,100.0,35.0 -15:45:25,124.0731,31.433,31.7,100.0,35.0 -15:45:25,124.1170,31.406,31.7,100.0,35.0 -15:45:25,124.1595,31.433,31.62,100.0,35.0 -15:45:25,124.2051,31.46,31.727,100.0,35.0 -15:45:25,124.2504,31.433,31.7,100.0,35.0 -15:45:25,124.2938,31.46,31.7,100.0,35.0 -15:45:25,124.3384,31.46,31.7,100.0,35.0 -15:45:25,124.3817,31.46,31.727,100.0,35.0 -15:45:25,124.4266,31.46,31.727,100.0,35.0 -15:45:25,124.4713,31.46,31.727,100.0,35.0 -15:45:25,124.5133,31.46,31.727,100.0,35.0 -15:45:25,124.5575,31.46,31.727,100.0,35.0 -15:45:25,124.5999,31.46,31.7,100.0,35.0 -15:45:25,124.6426,31.46,31.727,100.0,35.0 -15:45:25,124.6896,31.46,31.727,100.0,35.0 -15:45:25,124.7322,31.46,31.727,100.0,35.0 -15:45:25,124.7759,31.46,31.754,100.0,35.0 -15:45:26,124.8204,31.46,31.781,100.0,35.0 -15:45:26,124.8647,31.513,31.727,100.0,35.0 -15:45:26,124.9071,31.46,31.754,100.0,35.0 -15:45:26,124.9497,31.486,31.727,100.0,35.0 -15:45:26,124.9955,31.486,31.754,100.0,35.0 -15:45:26,125.0464,31.486,31.754,100.0,35.0 -15:45:26,125.0926,31.46,31.754,100.0,35.0 -15:45:26,125.1373,31.486,31.754,100.0,35.0 -15:45:26,125.1803,31.46,31.754,100.0,35.0 -15:45:26,125.2259,31.46,31.754,100.0,35.0 -15:45:26,125.2695,31.486,31.781,100.0,35.0 -15:45:26,125.3130,31.513,31.754,100.0,35.0 -15:45:26,125.3579,31.486,31.754,100.0,35.0 -15:45:26,125.4002,31.486,31.781,100.0,35.0 -15:45:26,125.4436,31.513,31.781,100.0,35.0 -15:45:26,125.4904,31.513,31.781,100.0,35.0 -15:45:26,125.5337,31.486,31.754,100.0,35.0 -15:45:26,125.5759,31.54,31.781,100.0,35.0 -15:45:26,125.6201,31.513,31.781,100.0,35.0 -15:45:26,125.6626,31.513,31.781,100.0,35.0 -15:45:26,125.7081,31.486,31.861,100.0,35.0 -15:45:26,125.7517,31.54,31.781,100.0,35.0 -15:45:26,125.7944,31.513,31.807,100.0,35.0 -15:45:27,125.8397,31.54,31.781,100.0,35.0 -15:45:27,125.8855,31.54,31.781,100.0,35.0 -15:45:27,125.9297,31.513,31.781,100.0,35.0 -15:45:27,125.9753,31.433,31.781,100.0,35.0 -15:45:27,126.0202,31.513,31.834,100.0,35.0 -15:45:27,126.0638,31.54,31.781,100.0,35.0 -15:45:27,126.1088,31.513,31.807,100.0,35.0 -15:45:27,126.1513,31.54,31.781,100.0,35.0 -15:45:27,126.1928,31.54,31.807,100.0,35.0 -15:45:27,126.2368,31.513,31.807,100.0,35.0 -15:45:27,126.2798,31.513,31.807,100.0,35.0 -15:45:27,126.3240,31.54,31.781,100.0,35.0 -15:45:27,126.3692,31.486,31.834,100.0,35.0 -15:45:27,126.4135,31.54,31.807,100.0,35.0 -15:45:27,126.4592,31.54,31.834,100.0,35.0 -15:45:27,126.5029,31.54,31.807,100.0,35.0 -15:45:27,126.5463,31.566,31.807,100.0,35.0 -15:45:27,126.5907,31.566,31.807,100.0,35.0 -15:45:27,126.6345,31.54,31.834,100.0,35.0 -15:45:27,126.6780,31.566,31.807,100.0,35.0 -15:45:27,126.7245,31.566,31.807,100.0,35.0 -15:45:27,126.7703,31.486,31.834,100.0,35.0 -15:45:28,126.8157,31.54,31.807,100.0,35.0 -15:45:28,126.8594,31.566,31.834,100.0,35.0 -15:45:28,126.9051,31.513,31.834,100.0,35.0 -15:45:28,126.9495,31.566,31.888,100.0,35.0 -15:45:28,126.9931,31.593,31.861,100.0,35.0 -15:45:28,127.0378,31.54,31.834,100.0,35.0 -15:45:28,127.0807,31.593,31.834,100.0,35.0 -15:45:28,127.1311,31.593,31.861,100.0,35.0 -15:45:28,127.1756,31.593,31.834,100.0,35.0 -15:45:28,127.2225,31.566,31.861,100.0,35.0 -15:45:28,127.2684,31.593,31.834,100.0,35.0 -15:45:28,127.3161,31.593,31.861,100.0,35.0 -15:45:28,127.3622,31.593,31.834,100.0,35.0 -15:45:28,127.4087,31.593,31.861,100.0,35.0 -15:45:28,127.4569,31.593,31.834,100.0,35.0 -15:45:28,127.5036,31.593,31.861,100.0,35.0 -15:45:28,127.5487,31.593,31.861,100.0,35.0 -15:45:28,127.5937,31.647,31.861,100.0,35.0 -15:45:28,127.6398,31.593,31.834,100.0,35.0 -15:45:28,127.6852,31.593,31.861,100.0,35.0 -15:45:28,127.7321,31.62,31.861,100.0,35.0 -15:45:28,127.7774,31.62,31.888,100.0,35.0 -15:45:29,127.8262,31.593,31.861,100.0,35.0 -15:45:29,127.8742,31.593,31.915,100.0,35.0 -15:45:29,127.9199,31.593,31.807,100.0,35.0 -15:45:29,127.9661,31.566,31.888,100.0,35.0 -15:45:29,128.0114,31.62,31.888,100.0,35.0 -15:45:29,128.0585,31.62,31.888,100.0,35.0 -15:45:29,128.1058,31.62,31.888,100.0,35.0 -15:45:29,128.1515,31.62,31.888,100.0,35.0 -15:45:29,128.1977,31.62,31.888,100.0,35.0 -15:45:29,128.2452,31.62,31.888,100.0,35.0 -15:45:29,128.2907,31.566,31.834,100.0,35.0 -15:45:29,128.3332,31.647,31.915,100.0,35.0 -15:45:29,128.3779,31.62,31.888,100.0,35.0 -15:45:29,128.4230,31.62,31.888,100.0,35.0 -15:45:29,128.4659,31.647,31.888,100.0,35.0 -15:45:29,128.5088,31.62,31.888,100.0,35.0 -15:45:29,128.5527,31.647,31.888,100.0,35.0 -15:45:29,128.5960,31.647,31.915,100.0,35.0 -15:45:29,128.6420,31.62,31.942,100.0,35.0 -15:45:29,128.6866,31.647,31.915,100.0,35.0 -15:45:29,128.7306,31.647,31.968,100.0,35.0 -15:45:29,128.7740,31.647,31.915,100.0,35.0 -15:45:30,128.8178,31.62,31.888,100.0,35.0 -15:45:30,128.8617,31.647,31.942,100.0,35.0 -15:45:30,128.9075,31.647,31.915,100.0,35.0 -15:45:30,128.9528,31.647,31.915,100.0,35.0 -15:45:30,128.9972,31.674,31.915,100.0,35.0 -15:45:30,129.0405,31.674,31.942,100.0,35.0 -15:45:30,129.0840,31.62,31.942,100.0,35.0 -15:45:30,129.1270,31.7,31.942,100.0,35.0 -15:45:30,129.1727,31.674,31.942,100.0,35.0 -15:45:30,129.2170,31.7,31.942,100.0,35.0 -15:45:30,129.2606,31.674,31.942,100.0,35.0 -15:45:30,129.3052,31.674,31.942,100.0,35.0 -15:45:30,129.3483,31.674,31.942,100.0,35.0 -15:45:30,129.3916,31.674,31.942,100.0,35.0 -15:45:30,129.4375,31.674,31.942,100.0,35.0 -15:45:30,129.4816,31.7,31.915,100.0,35.0 -15:45:30,129.5276,31.674,31.942,100.0,35.0 -15:45:30,129.5750,31.674,31.942,100.0,35.0 -15:45:30,129.6223,31.674,31.942,100.0,35.0 -15:45:30,129.6681,31.674,31.942,100.0,35.0 -15:45:30,129.7146,31.674,31.968,100.0,35.0 -15:45:30,129.7602,31.647,31.942,100.0,35.0 -15:45:31,129.8092,31.7,31.995,100.0,35.0 -15:45:31,129.8574,31.674,31.968,100.0,35.0 -15:45:31,129.9047,31.7,31.968,100.0,35.0 -15:45:31,129.9495,31.674,32.022,100.0,35.0 -15:45:31,129.9957,31.781,31.995,100.0,35.0 -15:45:31,130.0435,31.7,31.968,100.0,35.0 -15:45:31,130.0908,31.754,31.968,100.0,35.0 -15:45:31,130.1380,31.7,31.968,100.0,35.0 -15:45:31,130.1874,31.727,31.968,100.0,35.0 -15:45:31,130.2338,31.727,31.915,100.0,35.0 -15:45:31,130.2808,31.7,31.995,100.0,35.0 -15:45:31,130.3265,31.727,31.995,100.0,35.0 -15:45:31,130.3746,31.727,32.022,100.0,35.0 -15:45:31,130.4230,31.781,31.995,100.0,35.0 -15:45:31,130.4685,31.727,32.022,100.0,35.0 -15:45:31,130.5159,31.727,31.995,100.0,35.0 -15:45:31,130.5616,31.754,31.995,100.0,35.0 -15:45:31,130.6107,31.727,31.995,100.0,35.0 -15:45:31,130.6593,31.754,31.995,100.0,35.0 -15:45:31,130.7066,31.727,31.995,100.0,35.0 -15:45:31,130.7507,31.727,31.995,100.0,35.0 -15:45:31,130.7964,31.727,32.022,100.0,35.0 -15:45:32,130.8427,31.727,31.995,100.0,35.0 -15:45:32,130.8896,31.754,32.022,100.0,35.0 -15:45:32,130.9366,31.727,32.022,100.0,35.0 -15:45:32,130.9818,31.754,31.995,100.0,35.0 -15:45:32,131.0276,31.754,31.995,100.0,35.0 -15:45:32,131.0767,31.754,32.022,100.0,35.0 -15:45:32,131.1246,31.754,32.022,100.0,35.0 -15:45:32,131.1727,31.754,32.076,100.0,35.0 -15:45:32,131.2210,31.754,32.022,100.0,35.0 -15:45:32,131.2709,31.781,32.022,100.0,35.0 -15:45:32,131.3168,31.754,32.022,100.0,35.0 -15:45:32,131.3641,31.727,32.049,100.0,35.0 -15:45:32,131.4093,31.7,32.022,100.0,35.0 -15:45:32,131.4570,31.807,32.022,100.0,35.0 -15:45:32,131.5057,31.754,32.022,100.0,35.0 -15:45:32,131.5515,31.781,32.049,100.0,35.0 -15:45:32,131.5983,31.781,32.13,100.0,35.0 -15:45:32,131.6442,31.781,32.022,100.0,35.0 -15:45:32,131.6910,31.807,32.022,100.0,35.0 -15:45:32,131.7390,31.807,32.049,100.0,35.0 -15:45:32,131.7855,31.781,32.049,100.0,35.0 -15:45:33,131.8336,31.781,32.076,100.0,35.0 -15:45:33,131.8796,31.781,32.049,100.0,35.0 -15:45:33,131.9247,31.807,32.103,100.0,35.0 -15:45:33,131.9744,31.781,32.049,100.0,35.0 -15:45:33,132.0223,31.781,32.022,100.0,35.0 -15:45:33,132.0694,31.781,32.022,100.0,35.0 -15:45:33,132.1153,31.781,32.076,100.0,35.0 -15:45:33,132.1610,31.781,32.076,100.0,35.0 -15:45:33,132.2105,31.781,32.049,100.0,35.0 -15:45:33,132.2586,31.807,32.076,100.0,35.0 -15:45:33,132.3070,31.807,32.076,100.0,35.0 -15:45:33,132.3547,31.807,32.103,100.0,35.0 -15:45:33,132.3993,31.781,32.076,100.0,35.0 -15:45:33,132.4450,31.861,32.076,100.0,35.0 -15:45:33,132.4944,31.807,32.049,100.0,35.0 -15:45:33,132.5442,31.807,32.076,100.0,35.0 -15:45:33,132.5941,31.781,32.076,100.0,35.0 -15:45:33,132.6454,31.754,32.103,100.0,35.0 -15:45:33,132.6920,31.807,32.076,100.0,35.0 -15:45:33,132.7390,31.807,32.076,100.0,35.0 -15:45:33,132.7868,31.834,32.076,100.0,35.0 -15:45:34,132.8345,31.807,32.103,100.0,35.0 -15:45:34,132.8817,31.807,32.13,100.0,35.0 -15:45:34,132.9285,31.834,32.13,100.0,35.0 -15:45:34,132.9774,31.834,32.076,100.0,35.0 -15:45:34,133.0249,31.834,32.076,100.0,35.0 -15:45:34,133.0731,31.807,32.103,100.0,35.0 -15:45:34,133.1197,31.834,32.103,100.0,35.0 -15:45:34,133.1662,31.834,32.103,100.0,35.0 -15:45:34,133.2129,31.834,32.103,100.0,35.0 -15:45:34,133.2590,31.834,32.103,100.0,35.0 -15:45:34,133.3078,31.834,32.103,100.0,35.0 -15:45:34,133.3553,31.834,32.103,100.0,35.0 -15:45:34,133.4038,31.861,32.13,100.0,35.0 -15:45:34,133.4498,31.834,32.157,100.0,35.0 -15:45:34,133.4967,31.834,32.13,100.0,35.0 -15:45:34,133.5426,31.834,32.13,100.0,35.0 -15:45:34,133.5921,31.888,32.103,100.0,35.0 -15:45:34,133.6403,31.834,32.13,100.0,35.0 -15:45:34,133.6895,31.834,32.13,100.0,35.0 -15:45:34,133.7369,31.888,32.049,100.0,35.0 -15:45:34,133.7849,31.861,32.13,100.0,35.0 -15:45:35,133.8334,31.861,32.103,100.0,35.0 -15:45:35,133.8800,31.861,32.157,100.0,35.0 -15:45:35,133.9267,31.861,32.13,100.0,35.0 -15:45:35,133.9741,31.861,32.157,100.0,35.0 -15:45:35,134.0220,31.861,32.157,100.0,35.0 -15:45:35,134.0678,31.861,32.13,100.0,35.0 -15:45:35,134.1150,31.834,32.103,100.0,35.0 -15:45:35,134.1614,31.861,32.157,100.0,35.0 -15:45:35,134.2106,31.888,32.157,100.0,35.0 -15:45:35,134.2608,31.888,32.157,100.0,35.0 -15:45:35,134.3093,31.888,32.184,100.0,35.0 -15:45:35,134.3580,31.888,32.13,100.0,35.0 -15:45:35,134.4066,31.888,32.157,100.0,35.0 -15:45:35,134.4554,31.888,32.157,100.0,35.0 -15:45:35,134.5041,31.888,32.157,100.0,35.0 -15:45:35,134.5501,31.834,32.157,100.0,35.0 -15:45:35,134.5972,31.915,32.184,100.0,35.0 -15:45:35,134.6431,31.915,32.13,100.0,35.0 -15:45:35,134.6915,31.888,32.157,100.0,35.0 -15:45:35,134.7395,31.942,32.157,100.0,35.0 -15:45:35,134.7872,31.915,32.184,100.0,35.0 -15:45:36,134.8345,31.915,32.184,100.0,35.0 -15:45:36,134.8836,31.915,32.238,100.0,35.0 -15:45:36,134.9307,31.915,32.184,100.0,35.0 -15:45:36,134.9774,31.915,32.184,100.0,35.0 -15:45:36,135.0275,31.915,32.184,100.0,35.0 -15:45:36,135.0764,31.915,32.238,100.0,35.0 -15:45:36,135.1342,31.942,32.184,100.0,35.0 -15:45:36,135.1835,31.915,32.211,100.0,35.0 -15:45:36,135.2282,31.942,32.157,100.0,35.0 -15:45:36,135.2737,31.942,32.211,100.0,35.0 -15:45:36,135.3174,31.942,32.211,100.0,35.0 -15:45:36,135.3613,31.915,32.184,100.0,35.0 -15:45:36,135.4238,31.915,32.211,100.0,35.0 -15:45:36,135.5144,31.915,32.211,100.0,35.0 -15:45:36,135.5716,31.942,32.238,100.0,35.0 -15:45:36,135.6365,31.942,32.184,100.0,35.0 -15:45:36,135.6956,31.942,32.211,100.0,35.0 -15:45:36,135.7615,31.968,32.238,100.0,35.0 -15:45:37,135.8237,31.942,32.211,99.714,35.0 -15:45:37,135.8890,31.942,32.211,100.0,35.0 -15:45:37,135.9524,31.942,32.211,100.0,35.0 -15:45:37,136.0138,31.995,32.238,100.0,35.0 -15:45:37,136.0806,31.968,32.184,99.454,35.0 -15:45:37,136.1427,31.942,32.211,100.0,35.0 -15:45:37,136.1996,31.942,32.264,100.0,35.0 -15:45:37,136.2585,31.968,32.238,100.0,35.0 -15:45:37,136.3130,31.995,32.238,100.0,35.0 -15:45:37,136.3690,31.995,32.238,99.634,35.0 -15:45:37,136.4258,31.995,32.238,99.818,35.0 -15:45:37,136.4817,32.049,32.264,100.0,35.0 -15:45:37,136.5327,32.022,32.238,98.619,35.0 -15:45:37,136.5802,31.995,32.291,99.696,35.0 -15:45:37,136.6261,31.968,32.291,99.405,35.0 -15:45:37,136.6773,31.968,32.264,100.0,35.0 -15:45:37,136.7252,31.968,32.264,100.0,35.0 -15:45:37,136.7714,32.022,32.264,100.0,35.0 -15:45:38,136.8158,32.022,32.264,99.556,35.0 -15:45:38,136.8758,32.022,32.264,99.7,35.0 -15:45:38,136.9278,32.022,32.238,99.897,35.0 -15:45:38,136.9732,31.995,32.264,100.0,35.0 -15:45:38,137.0207,31.995,32.264,100.0,35.0 -15:45:38,137.0637,32.022,32.291,100.0,35.0 -15:45:38,137.1080,32.022,32.238,99.574,35.0 -15:45:38,137.1541,32.022,32.264,100.0,35.0 -15:45:38,137.1983,32.022,32.291,100.0,35.0 -15:45:38,137.2423,32.049,32.291,99.718,35.0 -15:45:38,137.2888,32.022,32.291,99.396,35.0 -15:45:38,137.3326,32.022,32.291,100.0,35.0 -15:45:38,137.3769,32.022,32.211,100.0,35.0 -15:45:38,137.4234,31.995,32.291,100.0,35.0 -15:45:38,137.4708,32.022,32.291,100.0,35.0 -15:45:38,137.5154,32.022,32.264,100.0,35.0 -15:45:38,137.5605,32.022,32.291,100.0,35.0 -15:45:38,137.6078,32.049,32.291,100.0,35.0 -15:45:38,137.6542,31.968,32.291,99.549,35.0 -15:45:38,137.6991,31.942,32.291,100.0,35.0 -15:45:38,137.7427,32.022,32.318,100.0,35.0 -15:45:38,137.7893,32.049,32.291,99.69,35.0 -15:45:39,137.8369,32.049,32.291,99.84,35.0 -15:45:39,137.8826,32.049,32.318,99.994,35.0 -15:45:39,137.9280,32.076,32.318,99.677,35.0 -15:45:39,137.9747,32.049,32.291,99.36,35.0 -15:45:39,138.0217,32.049,32.291,100.0,35.0 -15:45:39,138.0667,32.049,32.291,100.0,35.0 -15:45:39,138.1137,32.049,32.318,100.0,35.0 -15:45:39,138.1585,32.049,32.318,99.976,35.0 -15:45:39,138.2073,32.049,32.318,100.0,35.0 -15:45:39,138.2543,32.049,32.291,100.0,35.0 -15:45:39,138.2984,32.049,32.318,100.0,35.0 -15:45:39,138.3456,32.049,32.318,100.0,35.0 -15:45:39,138.3919,32.022,32.318,100.0,35.0 -15:45:39,138.4398,32.076,32.318,100.0,35.0 -15:45:39,138.4885,32.076,32.318,99.665,35.0 -15:45:39,138.5354,32.049,32.345,99.82,35.0 -15:45:39,138.5825,32.076,32.345,99.97,35.0 -15:45:39,138.6300,32.076,32.345,99.657,35.0 -15:45:39,138.6770,32.076,32.318,99.808,35.0 -15:45:39,138.7256,32.076,32.345,100.0,35.0 -15:45:39,138.7738,32.076,32.318,99.963,35.0 -15:45:40,138.8233,32.076,32.345,100.0,35.0 -15:45:40,138.8726,32.076,32.345,100.0,35.0 -15:45:40,138.9213,32.076,32.372,100.0,35.0 -15:45:40,138.9688,32.076,32.345,99.653,35.0 -15:45:40,139.0159,32.076,32.345,100.0,35.0 -15:45:40,139.0629,32.076,32.345,100.0,35.0 -15:45:40,139.1092,32.103,32.372,100.0,35.0 -15:45:40,139.1771,32.103,32.372,99.336,35.0 -15:45:40,139.2236,32.103,32.372,99.551,35.0 -15:45:40,139.2709,32.103,32.372,99.697,35.0 -15:45:40,139.3160,32.103,32.372,99.847,35.0 -15:45:40,139.3618,32.103,32.372,99.988,35.0 -15:45:40,139.4074,32.157,32.372,100.0,35.0 -15:45:40,139.4545,32.103,32.372,99.204,35.0 -15:45:40,139.5014,32.157,32.372,100.0,35.0 -15:45:40,139.5467,32.103,32.399,99.35,35.0 -15:45:40,139.5932,32.13,32.372,99.957,35.0 -15:45:40,139.6422,32.103,32.372,100.0,35.0 -15:45:40,139.6901,32.13,32.399,100.0,35.0 -15:45:40,139.7365,32.157,32.399,99.643,35.0 -15:45:40,139.7837,32.13,32.399,99.323,35.0 -15:45:41,139.8300,32.13,32.399,99.934,35.0 -15:45:41,139.8759,32.13,32.399,100.0,35.0 -15:45:41,139.9242,32.13,32.399,100.0,35.0 -15:45:41,139.9713,32.13,32.372,100.0,35.0 -15:45:41,140.0257,32.103,32.399,100.0,35.0 -15:45:41,140.0757,32.13,32.426,100.0,35.0 -15:45:41,140.1226,32.157,32.399,99.625,35.0 -15:45:41,140.1684,32.211,32.426,99.771,35.0 -15:45:41,140.2146,32.13,32.399,98.521,35.0 -15:45:41,140.2610,32.157,32.399,100.0,35.0 -15:45:41,140.3076,32.157,32.426,100.0,35.0 -15:45:41,140.3552,32.157,32.399,99.593,35.0 -15:45:41,140.4036,32.157,32.426,100.0,35.0 -15:45:41,140.4501,32.157,32.399,99.742,35.0 -15:45:41,140.5003,32.157,32.426,100.0,35.0 -15:45:41,140.5488,32.184,32.372,99.898,35.0 -15:45:41,140.5963,32.157,32.426,100.0,35.0 -15:45:41,140.6426,32.157,32.426,100.0,35.0 -15:45:41,140.6916,32.184,32.426,100.0,35.0 -15:45:41,140.7411,32.157,32.453,99.582,35.0 -15:45:41,140.7918,32.184,32.453,99.734,35.0 -15:45:42,140.8414,32.184,32.453,99.426,35.0 -15:45:42,140.8905,32.13,32.453,99.578,35.0 -15:45:42,140.9407,32.157,32.426,100.0,35.0 -15:45:42,141.0063,32.211,32.399,100.0,35.0 -15:45:42,141.0606,32.184,32.453,100.0,35.0 -15:45:42,141.1070,32.184,32.453,99.743,35.0 -15:45:42,141.1530,32.184,32.453,99.885,35.0 -15:45:42,141.1977,32.184,32.453,100.0,35.0 -15:45:42,141.2433,32.157,32.426,100.0,35.0 -15:45:42,141.2914,32.184,32.453,100.0,35.0 -15:45:42,141.3399,32.184,32.453,100.0,35.0 -15:45:42,141.3899,32.184,32.453,100.0,35.0 -15:45:42,141.4397,32.184,32.453,100.0,35.0 -15:45:42,141.4875,32.184,32.453,100.0,35.0 -15:45:42,141.5352,32.211,32.48,100.0,35.0 -15:45:42,141.5805,32.184,32.48,99.104,35.0 -15:45:42,141.6256,32.211,32.48,99.704,35.0 -15:45:42,141.6728,32.211,32.426,99.377,35.0 -15:45:42,141.7206,32.184,32.48,100.0,35.0 -15:45:42,141.7655,32.211,32.48,99.987,35.0 -15:45:43,141.8116,32.238,32.48,99.66,35.0 -15:45:43,141.8567,32.211,32.453,99.335,35.0 -15:45:43,141.9028,32.184,32.48,100.0,35.0 -15:45:43,141.9501,32.211,32.48,100.0,35.0 -15:45:43,141.9963,32.211,32.48,99.942,35.0 -15:45:43,142.0407,32.238,32.534,100.0,35.0 -15:45:43,142.0872,32.238,32.48,98.683,35.0 -15:45:43,142.1343,32.264,32.48,99.751,35.0 -15:45:43,142.1795,32.238,32.48,99.446,35.0 -15:45:43,142.2240,32.211,32.507,100.0,35.0 -15:45:43,142.2713,32.238,32.453,100.0,35.0 -15:45:43,142.3169,32.238,32.507,100.0,35.0 -15:45:43,142.3626,32.238,32.48,99.565,35.0 -15:45:43,142.4077,32.238,32.534,100.0,35.0 -15:45:43,142.4540,32.291,32.507,99.235,35.0 -15:45:43,142.4976,32.238,32.507,98.926,35.0 -15:45:43,142.5426,32.238,32.507,99.967,35.0 -15:45:43,142.5895,32.264,32.534,100.0,35.0 -15:45:43,142.6357,32.238,32.507,99.196,35.0 -15:45:43,142.6825,32.238,32.534,100.0,35.0 -15:45:43,142.7293,32.238,32.48,99.783,35.0 -15:45:43,142.7738,32.264,32.507,100.0,35.0 -15:45:44,142.8224,32.264,32.507,99.934,35.0 -15:45:44,142.8691,32.264,32.534,100.0,35.0 -15:45:44,142.9147,32.264,32.534,99.609,35.0 -15:45:44,142.9589,32.264,32.534,99.744,35.0 -15:45:44,143.0041,32.264,32.534,99.875,35.0 -15:45:44,143.0515,32.238,32.534,100.0,35.0 -15:45:44,143.0975,32.264,32.534,100.0,35.0 -15:45:44,143.1453,32.264,32.534,100.0,35.0 -15:45:44,143.1930,32.264,32.534,100.0,35.0 -15:45:44,143.2413,32.264,32.561,100.0,35.0 -15:45:44,143.2897,32.264,32.534,99.552,35.0 -15:45:44,143.3374,32.291,32.48,100.0,35.0 -15:45:44,143.3872,32.238,32.534,100.0,35.0 -15:45:44,143.4374,32.291,32.534,100.0,35.0 -15:45:44,143.4874,32.264,32.561,99.701,35.0 -15:45:44,143.5375,32.264,32.588,99.848,35.0 -15:45:44,143.5845,32.291,32.561,99.532,35.0 -15:45:44,143.6327,32.291,32.561,99.67,35.0 -15:45:44,143.6801,32.238,32.534,99.812,35.0 -15:45:44,143.7281,32.291,32.561,100.0,35.0 -15:45:44,143.7745,32.291,32.561,99.953,35.0 -15:45:45,143.8247,32.291,32.561,100.0,35.0 -15:45:45,143.8730,32.264,32.588,100.0,35.0 -15:45:45,143.9195,32.318,32.561,100.0,35.0 -15:45:45,143.9647,32.291,32.561,99.625,35.0 -15:45:45,144.0097,32.291,32.561,100.0,35.0 -15:45:45,144.0565,32.291,32.588,100.0,35.0 -15:45:45,144.1034,32.318,32.588,99.761,35.0 -15:45:45,144.1495,32.318,32.588,99.434,35.0 -15:45:45,144.1947,32.318,32.588,99.569,35.0 -15:45:45,144.2365,32.318,32.561,99.701,35.0 -15:45:45,144.2779,32.291,32.588,100.0,35.0 -15:45:45,144.3206,32.291,32.561,100.0,35.0 -15:45:45,144.3647,32.291,32.588,100.0,35.0 -15:45:45,144.4075,32.318,32.588,100.0,35.0 -15:45:45,144.4534,32.318,32.588,99.831,35.0 -15:45:45,144.4936,32.264,32.643,99.959,35.0 -15:45:45,144.5339,32.399,32.588,100.0,35.0 -15:45:45,144.5755,32.345,32.588,98.683,35.0 -15:45:45,144.6168,32.291,32.67,99.732,35.0 -15:45:45,144.6589,32.345,32.588,99.369,35.0 -15:45:45,144.7025,32.238,32.588,99.971,35.0 -15:45:45,144.7462,32.291,32.588,100.0,35.0 -15:45:45,144.7875,32.318,32.67,100.0,35.0 -15:45:46,144.8298,32.345,32.588,99.146,35.0 -15:45:46,144.8708,32.318,32.616,100.0,35.0 -15:45:46,144.9141,32.345,32.616,100.0,35.0 -15:45:46,144.9555,32.372,32.616,99.734,35.0 -15:45:46,144.9986,32.345,32.616,99.388,35.0 -15:45:46,145.0406,32.345,32.616,99.976,35.0 -15:45:46,145.0825,32.345,32.616,100.0,35.0 -15:45:46,145.1234,32.345,32.616,100.0,35.0 -15:45:46,145.1663,32.345,32.616,100.0,35.0 -15:45:46,145.2097,32.345,32.643,100.0,35.0 -15:45:46,145.2538,32.372,32.616,99.636,35.0 -15:45:46,145.2965,32.372,32.643,99.762,35.0 -15:45:46,145.3376,32.345,32.616,99.421,35.0 -15:45:46,145.3778,32.372,32.643,100.0,35.0 -15:45:46,145.4174,32.345,32.616,99.536,35.0 -15:45:46,145.4586,32.372,32.643,100.0,35.0 -15:45:46,145.5020,32.399,32.643,99.653,35.0 -15:45:46,145.5440,32.372,32.616,99.313,35.0 -15:45:46,145.5835,32.372,32.643,100.0,35.0 -15:45:46,145.6243,32.372,32.643,99.888,35.0 -15:45:46,145.6693,32.372,32.643,100.0,35.0 -15:45:46,145.7137,32.372,32.643,100.0,35.0 -15:45:46,145.7537,32.399,32.643,100.0,35.0 -15:45:46,145.7951,32.399,32.643,99.538,35.0 -15:45:47,145.8367,32.399,32.67,99.657,35.0 -15:45:47,145.8774,32.372,32.67,99.309,35.0 -15:45:47,145.9165,32.372,32.643,99.888,35.0 -15:45:47,145.9571,32.372,32.643,100.0,35.0 -15:45:47,146.0010,32.372,32.643,100.0,35.0 -15:45:47,146.0443,32.372,32.643,100.0,35.0 -15:45:47,146.0845,32.372,32.67,100.0,35.0 -15:45:47,146.1257,32.399,32.67,100.0,35.0 -15:45:47,146.1689,32.453,32.643,99.54,35.0 -15:45:47,146.2123,32.453,32.67,99.198,35.0 -15:45:47,146.2533,32.426,32.67,98.855,35.0 -15:45:47,146.2974,32.399,32.67,99.433,35.0 -15:45:47,146.3396,32.345,32.67,100.0,35.0 -15:45:47,146.3819,32.399,32.724,100.0,35.0 -15:45:47,146.4246,32.399,32.67,99.088,35.0 -15:45:47,146.4675,32.399,32.643,100.0,35.0 -15:45:47,146.5085,32.399,32.67,100.0,35.0 -15:45:47,146.5525,32.399,32.697,100.0,35.0 -15:45:47,146.5978,32.372,32.67,99.675,35.0 -15:45:47,146.6420,32.399,32.643,100.0,35.0 -15:45:47,146.6857,32.372,32.67,100.0,35.0 -15:45:47,146.7271,32.399,32.67,100.0,35.0 -15:45:47,146.7695,32.399,32.67,100.0,35.0 -15:45:48,146.8091,32.426,32.697,100.0,35.0 -15:45:48,146.8528,32.426,32.697,99.321,35.0 -15:45:48,146.8972,32.399,32.697,99.444,35.0 -15:45:48,146.9383,32.399,32.724,100.0,35.0 -15:45:48,146.9824,32.426,32.697,99.558,35.0 -15:45:48,147.0244,32.426,32.697,99.681,35.0 -15:45:48,147.0676,32.426,32.67,99.798,35.0 -15:45:48,147.1106,32.426,32.697,100.0,35.0 -15:45:48,147.1522,32.426,32.67,99.919,35.0 -15:45:48,147.1936,32.426,32.697,100.0,35.0 -15:45:48,147.2334,32.453,32.697,100.0,35.0 -15:45:48,147.2747,32.453,32.697,99.566,35.0 -15:45:48,147.3177,32.426,32.67,99.68,35.0 -15:45:48,147.3591,32.426,32.697,100.0,35.0 -15:45:48,147.4014,32.399,32.697,100.0,35.0 -15:45:48,147.4425,32.453,32.697,100.0,35.0 -15:45:48,147.4825,32.48,32.697,99.793,35.0 -15:45:48,147.5260,32.453,32.751,99.44,35.0 -15:45:48,147.5701,32.453,32.778,99.096,35.0 -15:45:48,147.6154,32.453,32.724,98.753,35.0 -15:45:48,147.6597,32.507,32.724,99.804,35.0 -15:45:48,147.7008,32.453,32.724,98.998,35.0 -15:45:48,147.7424,32.453,32.724,100.0,35.0 -15:45:48,147.7835,32.48,32.697,100.0,35.0 -15:45:49,147.8243,32.453,32.724,100.0,35.0 -15:45:49,147.8697,32.453,32.724,100.0,35.0 -15:45:49,147.9141,32.48,32.751,100.0,35.0 -15:45:49,147.9568,32.453,32.724,99.12,35.0 -15:45:49,148.0015,32.453,32.724,100.0,35.0 -15:45:49,148.0430,32.453,32.751,100.0,35.0 -15:45:49,148.0833,32.48,32.724,99.696,35.0 -15:45:49,148.1246,32.48,32.751,99.807,35.0 -15:45:49,148.1693,32.48,32.724,99.457,35.0 -15:45:49,148.2107,32.453,32.751,100.0,35.0 -15:45:49,148.2527,32.48,32.751,100.0,35.0 -15:45:49,148.2944,32.48,32.724,99.572,35.0 -15:45:49,148.3352,32.48,32.697,100.0,35.0 -15:45:49,148.3765,32.48,32.67,100.0,35.0 -15:45:49,148.4167,32.507,32.751,100.0,35.0 -15:45:49,148.4587,32.48,32.751,99.217,35.0 -15:45:49,148.5021,32.48,32.697,99.795,35.0 -15:45:49,148.5424,32.453,32.751,100.0,35.0 -15:45:49,148.5830,32.507,32.751,100.0,35.0 -15:45:49,148.6236,32.507,32.751,99.441,35.0 -15:45:49,148.6698,32.534,32.751,99.552,35.0 -15:45:49,148.7144,32.48,32.751,99.213,35.0 -15:45:49,148.7574,32.48,32.778,100.0,35.0 -15:45:49,148.8015,32.507,32.778,99.793,35.0 -15:45:50,148.8420,32.507,32.778,99.448,35.0 -15:45:50,148.8830,32.507,32.751,99.558,35.0 -15:45:50,148.9247,32.48,32.751,100.0,35.0 -15:45:50,148.9686,32.507,32.778,100.0,35.0 -15:45:50,149.0133,32.507,32.778,99.675,35.0 -15:45:50,149.0564,32.507,32.805,99.797,35.0 -15:45:50,149.0994,32.507,32.778,99.448,35.0 -15:45:50,149.1413,32.507,32.751,100.0,35.0 -15:45:50,149.1852,32.507,32.751,100.0,35.0 -15:45:50,149.2264,32.507,32.805,100.0,35.0 -15:45:50,149.2686,32.507,32.805,99.559,35.0 -15:45:50,149.3153,32.507,32.805,99.672,35.0 -15:45:50,149.3592,32.507,32.724,99.796,35.0 -15:45:50,149.4008,32.48,32.859,100.0,35.0 -15:45:50,149.4441,32.534,32.805,99.443,35.0 -15:45:50,149.4866,32.507,32.805,99.559,35.0 -15:45:50,149.5317,32.507,32.832,100.0,35.0 -15:45:50,149.5755,32.534,32.805,99.679,35.0 -15:45:50,149.6172,32.534,32.805,99.796,35.0 -15:45:50,149.6630,32.534,32.805,99.907,35.0 -15:45:50,149.7057,32.534,32.805,100.0,35.0 -15:45:50,149.7508,32.534,32.805,100.0,35.0 -15:45:50,149.7956,32.507,32.805,100.0,35.0 -15:45:51,149.8399,32.534,32.778,100.0,35.0 -15:45:51,149.8865,32.534,32.832,100.0,35.0 -15:45:51,149.9296,32.561,32.805,99.566,35.0 -15:45:51,149.9739,32.534,32.832,99.68,35.0 -15:45:51,150.0207,32.534,32.832,99.798,35.0 -15:45:51,150.0673,32.561,32.805,99.921,35.0 -15:45:51,150.1171,32.588,32.832,100.0,35.0 -15:45:51,150.1669,32.561,32.832,99.126,35.0 -15:45:51,150.2135,32.534,32.832,99.72,35.0 -15:45:51,150.2570,32.507,32.832,100.0,35.0 -15:45:51,150.3015,32.561,32.832,100.0,35.0 -15:45:51,150.3464,32.507,32.832,99.837,35.0 -15:45:51,150.3889,32.561,32.805,100.0,35.0 -15:45:51,150.4636,32.561,32.832,100.0,35.0 -15:45:51,150.5348,32.561,32.832,100.0,35.0 -15:45:51,150.5894,32.561,32.832,100.0,35.0 -15:45:51,150.6615,32.561,32.832,99.988,35.0 -15:45:51,150.7271,32.561,32.832,100.0,35.0 -15:45:51,150.7866,32.561,32.859,100.0,35.0 -15:45:52,150.8434,32.616,32.832,99.678,35.0 -15:45:52,150.9027,32.588,32.859,99.349,35.0 -15:45:52,150.9612,32.561,32.859,99.515,35.0 -15:45:52,151.0203,32.561,32.887,100.0,35.0 -15:45:52,151.0724,32.616,32.859,99.644,35.0 -15:45:52,151.1320,32.588,32.859,99.318,35.0 -15:45:52,151.1922,32.588,32.887,99.952,35.0 -15:45:52,151.2529,32.588,32.887,99.634,35.0 -15:45:52,151.3097,32.588,32.859,99.784,35.0 -15:45:52,151.3584,32.588,32.887,100.0,35.0 -15:45:52,151.4051,32.588,32.859,99.91,35.0 -15:45:52,151.4546,32.616,32.941,100.0,35.0 -15:45:52,151.5035,32.616,32.887,98.627,35.0 -15:45:52,151.5482,32.616,32.914,99.679,35.0 -15:45:52,151.5898,32.588,32.887,99.329,35.0 -15:45:52,151.6339,32.616,32.914,100.0,35.0 -15:45:52,151.6763,32.616,32.859,99.442,35.0 -15:45:52,151.7158,32.616,32.941,100.0,35.0 -15:45:52,151.7573,32.616,32.887,99.078,35.0 -15:45:52,151.8025,32.616,32.887,100.0,35.0 -15:45:53,151.8709,32.616,32.887,100.0,35.0 -15:45:53,151.9178,32.643,32.887,100.0,35.0 -15:45:53,151.9625,32.616,32.887,99.66,35.0 -15:45:53,152.0064,32.616,32.914,100.0,35.0 -15:45:53,152.0505,32.643,32.914,99.773,35.0 -15:45:53,152.0926,32.643,32.914,99.421,35.0 -15:45:53,152.1358,32.643,32.914,99.528,35.0 -15:45:53,152.1799,32.643,32.859,99.637,35.0 -15:45:53,152.2224,32.616,32.914,100.0,35.0 -15:45:53,152.2666,32.643,32.859,100.0,35.0 -15:45:53,152.3082,32.616,32.914,100.0,35.0 -15:45:53,152.3546,32.588,32.914,100.0,35.0 -15:45:53,152.3975,32.643,32.914,100.0,35.0 -15:45:53,152.4385,32.643,32.914,99.746,35.0 -15:45:53,152.4821,32.643,32.914,99.85,35.0 -15:45:53,152.5252,32.643,32.914,99.961,35.0 -15:45:53,152.5656,32.643,32.941,100.0,35.0 -15:45:53,152.6072,32.67,32.914,99.599,35.0 -15:45:53,152.6501,32.643,32.914,99.705,35.0 -15:45:53,152.6923,32.67,32.968,100.0,35.0 -15:45:53,152.7326,32.751,32.941,98.883,35.0 -15:45:53,152.7748,32.643,32.914,98.055,35.0 -15:45:54,152.8141,32.643,32.941,100.0,35.0 -15:45:54,152.8555,32.643,32.914,100.0,35.0 -15:45:54,152.8997,32.67,32.941,100.0,35.0 -15:45:54,152.9416,32.67,32.968,99.557,35.0 -15:45:54,152.9826,32.67,32.941,99.198,35.0 -15:45:54,153.0236,32.67,32.914,99.764,35.0 -15:45:54,153.0675,32.67,32.941,100.0,35.0 -15:45:54,153.1106,32.67,32.941,99.875,35.0 -15:45:54,153.1517,32.724,32.941,99.983,35.0 -15:45:54,153.1966,32.67,32.941,99.157,35.0 -15:45:54,153.2424,32.697,32.941,100.0,35.0 -15:45:54,153.2828,32.67,32.968,99.734,35.0 -15:45:54,153.3248,32.697,32.968,99.835,35.0 -15:45:54,153.3674,32.697,32.968,99.476,35.0 -15:45:54,153.4140,32.67,32.968,99.585,35.0 -15:45:54,153.4568,32.643,32.968,100.0,35.0 -15:45:54,153.4993,32.697,32.968,100.0,35.0 -15:45:54,153.5448,32.724,33.022,99.692,35.0 -15:45:54,153.5897,32.643,32.941,98.411,35.0 -15:45:54,153.6343,32.697,32.968,100.0,35.0 -15:45:54,153.6768,32.697,32.968,99.911,35.0 -15:45:54,153.7207,32.697,32.968,100.0,35.0 -15:45:54,153.7670,32.67,33.022,100.0,35.0 -15:45:55,153.8130,32.697,32.968,99.561,35.0 -15:45:55,153.8557,32.697,32.995,100.0,35.0 -15:45:55,153.9021,32.697,33.022,99.666,35.0 -15:45:55,153.9471,32.724,32.941,99.316,35.0 -15:45:55,153.9919,32.724,32.995,100.0,35.0 -15:45:55,154.0353,32.724,32.968,99.427,35.0 -15:45:55,154.0813,32.751,32.995,99.997,35.0 -15:45:55,154.1239,32.724,32.995,99.186,35.0 -15:45:55,154.1685,32.724,32.968,99.749,35.0 -15:45:55,154.2130,32.724,32.995,100.0,35.0 -15:45:55,154.2567,32.724,32.995,99.858,35.0 -15:45:55,154.3031,32.724,32.995,99.964,35.0 -15:45:55,154.3480,32.724,32.995,100.0,35.0 -15:45:55,154.3910,32.724,32.995,100.0,35.0 -15:45:55,154.4344,32.697,32.968,100.0,35.0 -15:45:55,154.4777,32.724,32.995,100.0,35.0 -15:45:55,154.5188,32.724,33.022,100.0,35.0 -15:45:55,154.5599,32.724,32.995,99.6,35.0 -15:45:55,154.6019,32.724,33.022,100.0,35.0 -15:45:55,154.6455,32.724,32.995,99.702,35.0 -15:45:55,154.6903,32.724,32.995,100.0,35.0 -15:45:55,154.7357,32.724,33.022,100.0,35.0 -15:45:55,154.7804,32.724,33.022,99.812,35.0 -15:45:56,154.8233,32.724,33.022,99.922,35.0 -15:45:56,154.8669,32.697,33.022,100.0,35.0 -15:45:56,154.9084,32.751,33.022,100.0,35.0 -15:45:56,154.9478,32.724,33.022,99.558,35.0 -15:45:56,154.9920,32.724,33.022,100.0,35.0 -15:45:56,155.0449,32.751,33.022,100.0,35.0 -15:45:56,155.0900,32.751,33.022,99.676,35.0 -15:45:56,155.1363,32.724,33.022,99.784,35.0 -15:45:56,155.1857,32.724,33.022,100.0,35.0 -15:45:56,155.2282,32.724,33.022,100.0,35.0 -15:45:56,155.2698,32.751,33.05,100.0,35.0 -15:45:56,155.3139,32.778,33.022,99.404,35.0 -15:45:56,155.3563,32.778,33.022,99.527,35.0 -15:45:56,155.4033,32.751,33.022,99.628,35.0 -15:45:56,155.4467,32.778,33.05,100.0,35.0 -15:45:56,155.4887,32.751,33.05,99.25,35.0 -15:45:56,155.5325,32.751,33.05,99.815,35.0 -15:45:56,155.5751,32.805,33.05,99.919,35.0 -15:45:56,155.6171,32.805,33.022,99.093,35.0 -15:45:56,155.6582,32.778,33.05,99.674,35.0 -15:45:56,155.7016,32.778,33.05,99.754,35.0 -15:45:56,155.7433,32.778,33.104,99.858,35.0 -15:45:56,155.7850,32.778,33.05,99.029,35.0 -15:45:57,155.8283,32.751,33.05,100.0,35.0 -15:45:57,155.8699,32.751,33.077,100.0,35.0 -15:45:57,155.9136,32.778,33.05,100.0,35.0 -15:45:57,155.9562,32.724,33.05,100.0,35.0 -15:45:57,156.0007,32.778,33.05,100.0,35.0 -15:45:57,156.0415,32.778,33.077,100.0,35.0 -15:45:57,156.0825,32.778,33.077,99.589,35.0 -15:45:57,156.1245,32.778,33.077,99.686,35.0 -15:45:57,156.1654,32.778,33.077,99.786,35.0 -15:45:57,156.2082,32.778,33.077,99.882,35.0 -15:45:57,156.2495,32.859,33.104,99.984,35.0 -15:45:57,156.2906,32.778,33.077,98.225,35.0 -15:45:57,156.3328,32.805,33.077,100.0,35.0 -15:45:57,156.3740,32.805,33.077,99.714,35.0 -15:45:57,156.4173,32.805,33.104,99.812,35.0 -15:45:57,156.4603,32.805,33.077,99.45,35.0 -15:45:57,156.5009,32.805,33.077,100.0,35.0 -15:45:57,156.5420,32.805,32.995,100.0,35.0 -15:45:57,156.5832,32.805,33.077,100.0,35.0 -15:45:57,156.6249,32.805,33.104,100.0,35.0 -15:45:57,156.6670,32.805,33.077,99.548,35.0 -15:45:57,156.7107,32.832,33.077,100.0,35.0 -15:45:57,156.7525,32.887,33.104,99.65,35.0 -15:45:57,156.7976,32.751,33.077,98.337,35.0 -15:45:58,156.8422,32.832,33.104,100.0,35.0 -15:45:58,156.8842,32.805,33.077,99.386,35.0 -15:45:58,156.9288,32.805,33.131,100.0,35.0 -15:45:58,156.9725,32.832,33.077,99.488,35.0 -15:45:58,157.0174,32.832,33.104,100.0,35.0 -15:45:58,157.0616,32.832,33.104,99.592,35.0 -15:45:58,157.1050,32.832,33.077,99.695,35.0 -15:45:58,157.1485,32.832,33.077,100.0,35.0 -15:45:58,157.1897,32.805,33.104,100.0,35.0 -15:45:58,157.2342,32.805,33.104,100.0,35.0 -15:45:58,157.2749,32.832,33.104,100.0,35.0 -15:45:58,157.3173,32.859,33.104,99.79,35.0 -15:45:58,157.3612,32.859,33.104,99.424,35.0 -15:45:58,157.4046,32.832,33.104,99.525,35.0 -15:45:58,157.4484,32.832,33.104,100.0,35.0 -15:45:58,157.4917,32.832,33.104,100.0,35.0 -15:45:58,157.5327,32.832,33.104,100.0,35.0 -15:45:58,157.5757,32.859,33.131,100.0,35.0 -15:45:58,157.6171,32.859,33.104,99.161,35.0 -15:45:58,157.6610,32.832,33.131,99.719,35.0 -15:45:58,157.7032,32.832,33.104,99.821,35.0 -15:45:58,157.7469,32.832,33.077,100.0,35.0 -15:45:58,157.7892,32.859,33.158,100.0,35.0 -15:45:59,157.8336,32.859,33.131,98.99,35.0 -15:45:59,157.8776,32.859,33.104,99.555,35.0 -15:45:59,157.9225,32.832,33.131,100.0,35.0 -15:45:59,157.9672,32.832,33.131,100.0,35.0 -15:45:59,158.0153,32.859,33.131,100.0,35.0 -15:45:59,158.0597,32.805,33.131,99.665,35.0 -15:45:59,158.1006,32.859,33.104,100.0,35.0 -15:45:59,158.1435,32.832,33.131,100.0,35.0 -15:45:59,158.1853,32.887,33.131,100.0,35.0 -15:45:59,158.2287,32.859,33.158,99.279,35.0 -15:45:59,158.2712,32.887,33.131,99.395,35.0 -15:45:59,158.3144,32.887,33.131,99.475,35.0 -15:45:59,158.3575,32.887,33.158,99.573,35.0 -15:45:59,158.3985,32.859,33.158,99.206,35.0 -15:45:59,158.4406,32.887,33.104,99.78,35.0 -15:45:59,158.4816,32.887,33.158,100.0,35.0 -15:45:59,158.5240,32.887,33.104,99.392,35.0 -15:45:59,158.5644,32.887,33.158,100.0,35.0 -15:45:59,158.6087,32.887,33.213,99.484,35.0 -15:45:59,158.6509,32.887,33.131,98.639,35.0 -15:45:59,158.6933,32.887,33.158,100.0,35.0 -15:45:59,158.7343,32.859,33.158,99.679,35.0 -15:45:59,158.7774,32.887,33.104,100.0,35.0 -15:46:00,158.8192,32.914,33.158,100.0,35.0 -15:46:00,158.8626,32.887,33.131,99.309,35.0 -15:46:00,158.9055,32.887,33.158,100.0,35.0 -15:46:00,158.9502,32.914,33.158,99.869,35.0 -15:46:00,158.9954,32.914,33.158,99.506,35.0 -15:46:00,159.0369,32.887,33.186,99.607,35.0 -15:46:00,159.0807,32.914,33.186,99.682,35.0 -15:46:00,159.1236,32.887,33.186,99.317,35.0 -15:46:00,159.1653,32.859,33.186,99.877,35.0 -15:46:00,159.2073,32.941,33.158,100.0,35.0 -15:46:00,159.2480,32.914,33.186,99.524,35.0 -15:46:00,159.2896,32.914,33.186,99.598,35.0 -15:46:00,159.3307,32.914,33.186,99.69,35.0 -15:46:00,159.3727,32.859,33.24,99.782,35.0 -15:46:00,159.4162,32.914,33.186,99.893,35.0 -15:46:00,159.4567,32.914,33.158,99.972,35.0 -15:46:00,159.4978,32.887,33.186,100.0,35.0 -15:46:00,159.5403,32.914,33.158,100.0,35.0 -15:46:00,159.5818,32.887,33.186,100.0,35.0 -15:46:00,159.6234,32.914,33.186,100.0,35.0 -15:46:00,159.6637,32.914,33.213,100.0,35.0 -15:46:00,159.7053,32.914,33.213,99.597,35.0 -15:46:00,159.7488,32.941,33.213,99.69,35.0 -15:46:00,159.7937,32.941,33.295,99.321,35.0 -15:46:01,159.8358,32.941,33.213,98.01,35.0 -15:46:01,159.8805,32.941,33.213,99.511,35.0 -15:46:01,159.9230,32.914,33.186,99.608,35.0 -15:46:01,159.9647,32.941,33.186,100.0,35.0 -15:46:01,160.0067,32.968,33.186,100.0,35.0 -15:46:01,160.0475,32.968,33.158,99.701,35.0 -15:46:01,160.0900,32.887,33.213,100.0,35.0 -15:46:01,160.1321,32.941,33.295,100.0,35.0 -15:46:01,160.1734,32.941,33.213,98.383,35.0 -15:46:01,160.2145,32.914,33.186,99.882,35.0 -15:46:01,160.2555,32.941,33.213,100.0,35.0 -15:46:01,160.2967,32.941,33.213,99.972,35.0 -15:46:01,160.3387,32.941,33.24,100.0,35.0 -15:46:01,160.3834,32.941,33.213,99.599,35.0 -15:46:01,160.4286,32.941,33.24,100.0,35.0 -15:46:01,160.4721,32.914,33.24,99.699,35.0 -15:46:01,160.5167,32.941,33.213,100.0,35.0 -15:46:01,160.5587,32.995,33.186,100.0,35.0 -15:46:01,160.6003,32.941,33.186,99.791,35.0 -15:46:01,160.6418,32.941,33.186,100.0,35.0 -15:46:01,160.6849,32.968,33.24,100.0,35.0 -15:46:01,160.7291,32.968,33.24,99.419,35.0 -15:46:01,160.7719,32.941,33.267,99.515,35.0 -15:46:02,160.8169,32.968,33.267,99.607,35.0 -15:46:02,160.8626,32.968,33.24,99.24,35.0 -15:46:02,160.9098,32.968,33.24,99.802,35.0 -15:46:02,160.9536,32.968,33.24,99.905,35.0 -15:46:02,160.9977,32.968,33.267,100.0,35.0 -15:46:02,161.0400,32.995,33.322,99.631,35.0 -15:46:02,161.0818,32.887,33.24,98.312,35.0 -15:46:02,161.1234,32.914,33.24,100.0,35.0 -15:46:02,161.1651,32.968,33.213,100.0,35.0 -15:46:02,161.2078,32.968,33.24,100.0,35.0 -15:46:02,161.2501,32.968,33.267,100.0,35.0 -15:46:02,161.2916,32.995,33.267,99.81,35.0 -15:46:02,161.3340,32.968,33.267,99.436,35.0 -15:46:02,161.3787,32.995,33.24,99.991,35.0 -15:46:02,161.4221,32.968,33.267,100.0,35.0 -15:46:02,161.4637,32.968,33.267,100.0,35.0 -15:46:02,161.5059,32.968,33.267,100.0,35.0 -15:46:02,161.5461,32.995,33.295,100.0,35.0 -15:46:02,161.5885,32.995,33.267,99.131,35.0 -15:46:02,161.6326,32.968,33.295,99.703,35.0 -15:46:02,161.6774,33.022,33.295,99.78,35.0 -15:46:02,161.7206,33.022,33.267,98.946,35.0 -15:46:02,161.7645,32.995,33.267,99.519,35.0 -15:46:03,161.8083,33.05,33.213,100.0,35.0 -15:46:03,161.8509,32.995,33.267,100.0,35.0 -15:46:03,161.8965,32.995,33.267,100.0,35.0 -15:46:03,161.9385,32.995,33.267,100.0,35.0 -15:46:03,161.9833,33.022,33.295,100.0,35.0 -15:46:03,162.0272,32.995,33.295,99.132,35.0 -15:46:03,162.0697,32.995,33.267,99.689,35.0 -15:46:03,162.1137,32.995,33.295,100.0,35.0 -15:46:03,162.1558,33.022,33.295,99.782,35.0 -15:46:03,162.1972,33.022,33.295,99.407,35.0 -15:46:03,162.2402,32.968,33.349,99.494,35.0 -15:46:03,162.2823,33.022,33.322,99.585,35.0 -15:46:03,162.3264,33.022,33.295,99.209,35.0 -15:46:03,162.3691,33.022,33.295,99.765,35.0 -15:46:03,162.4123,33.05,33.295,99.855,35.0 -15:46:03,162.4553,32.995,33.295,99.464,35.0 -15:46:03,162.4991,32.995,33.322,100.0,35.0 -15:46:03,162.5429,33.022,33.295,100.0,35.0 -15:46:03,162.5858,32.995,33.322,100.0,35.0 -15:46:03,162.6306,33.05,33.295,100.0,35.0 -15:46:03,162.6729,33.022,33.295,99.558,35.0 -15:46:03,162.7148,33.022,33.322,100.0,35.0 -15:46:03,162.7576,33.022,33.322,99.663,35.0 -15:46:03,162.8069,33.077,33.322,99.752,35.0 -15:46:04,162.8492,33.05,33.295,98.909,35.0 -15:46:04,162.8919,33.05,33.349,99.924,35.0 -15:46:04,162.9351,33.05,33.322,99.085,35.0 -15:46:04,162.9788,33.077,33.322,99.638,35.0 -15:46:04,163.0214,33.022,33.295,99.264,35.0 -15:46:04,163.0657,33.05,33.322,100.0,35.0 -15:46:04,163.1108,33.05,33.377,99.82,35.0 -15:46:04,163.1526,33.05,33.349,98.968,35.0 -15:46:04,163.1964,33.05,33.322,99.534,35.0 -15:46:04,163.2392,33.05,33.322,100.0,35.0 -15:46:04,163.2792,33.022,33.322,100.0,35.0 -15:46:04,163.3214,33.05,33.404,100.0,35.0 -15:46:04,163.3653,33.077,33.322,98.675,35.0 -15:46:04,163.4097,33.077,33.349,99.71,35.0 -15:46:04,163.4515,33.077,33.295,99.337,35.0 -15:46:04,163.4949,33.05,33.349,100.0,35.0 -15:46:04,163.5387,33.077,33.377,99.891,35.0 -15:46:04,163.5808,33.077,33.322,99.034,35.0 -15:46:04,163.6218,33.077,33.349,100.0,35.0 -15:46:04,163.6621,33.077,33.377,99.599,35.0 -15:46:04,163.7048,33.077,33.404,99.2,35.0 -15:46:04,163.7490,33.077,33.349,98.822,35.0 -15:46:04,163.7902,33.077,33.377,99.856,35.0 -15:46:05,163.8328,33.05,33.349,99.459,35.0 -15:46:05,163.8764,33.104,33.377,100.0,35.0 -15:46:05,163.9195,33.104,33.431,99.083,35.0 -15:46:05,163.9627,33.077,33.349,98.24,35.0 -15:46:05,164.0052,33.104,33.349,100.0,35.0 -15:46:05,164.0455,33.077,33.377,99.734,35.0 -15:46:05,164.0887,33.077,33.431,99.799,35.0 -15:46:05,164.1304,33.077,33.377,98.957,35.0 -15:46:05,164.1747,33.05,33.349,99.97,35.0 -15:46:05,164.2180,33.104,33.377,100.0,35.0 -15:46:05,164.2608,33.104,33.377,99.593,35.0 -15:46:05,164.3030,33.077,33.377,99.678,35.0 -15:46:05,164.3471,33.104,33.349,100.0,35.0 -15:46:05,164.3900,33.104,33.377,100.0,35.0 -15:46:05,164.4347,33.104,33.377,99.765,35.0 -15:46:05,164.4800,33.104,33.404,99.854,35.0 -15:46:05,164.5239,33.104,33.404,99.481,35.0 -15:46:05,164.5675,33.131,33.377,99.569,35.0 -15:46:05,164.6121,33.131,33.404,99.655,35.0 -15:46:05,164.6560,33.104,33.404,99.28,35.0 -15:46:05,164.7011,33.104,33.404,99.831,35.0 -15:46:05,164.7475,33.104,33.431,99.921,35.0 -15:46:05,164.7913,33.131,33.404,99.549,35.0 -15:46:06,164.8360,33.131,33.377,99.637,35.0 -15:46:06,164.8828,33.131,33.404,100.0,35.0 -15:46:06,164.9302,33.131,33.404,99.729,35.0 -15:46:06,164.9736,33.131,33.404,99.823,35.0 -15:46:06,165.0165,33.131,33.404,99.909,35.0 -15:46:06,165.0627,33.131,33.404,99.994,35.0 -15:46:06,165.1072,33.131,33.404,100.0,35.0 -15:46:06,165.1627,33.104,33.404,100.0,35.0 -15:46:06,165.2195,33.131,33.431,100.0,35.0 -15:46:06,165.2652,33.131,33.431,99.641,35.0 -15:46:06,165.3123,33.104,33.486,99.731,35.0 -15:46:06,165.3582,33.077,33.431,99.342,35.0 -15:46:06,165.4037,33.131,33.431,100.0,35.0 -15:46:06,165.4716,33.158,33.404,99.92,35.0 -15:46:06,165.5488,33.131,33.431,100.0,35.0 -15:46:06,165.6083,33.158,33.431,100.0,35.0 -15:46:06,165.6657,33.158,33.431,99.571,35.0 -15:46:06,165.7226,33.104,33.431,99.683,35.0 -15:46:06,165.7744,33.158,33.431,100.0,35.0 -15:46:07,165.8296,33.158,33.404,99.783,35.0 -15:46:07,165.8868,33.158,33.459,100.0,35.0 -15:46:07,165.9400,33.131,33.459,99.416,35.0 -15:46:07,165.9952,33.186,33.431,99.978,35.0 -15:46:07,166.0481,33.186,33.459,99.619,35.0 -15:46:07,166.1106,33.158,33.459,99.243,35.0 -15:46:07,166.1655,33.186,33.431,99.841,35.0 -15:46:07,166.2200,33.158,33.459,99.95,35.0 -15:46:07,166.2770,33.131,33.459,100.0,35.0 -15:46:07,166.3309,33.186,33.459,100.0,35.0 -15:46:07,166.3855,33.186,33.459,99.572,35.0 -15:46:07,166.4370,33.186,33.431,99.681,35.0 -15:46:07,166.4880,33.158,33.459,100.0,35.0 -15:46:07,166.5377,33.186,33.459,100.0,35.0 -15:46:07,166.5838,33.186,33.486,99.775,35.0 -15:46:07,166.6318,33.158,33.459,99.397,35.0 -15:46:07,166.6856,33.186,33.459,100.0,35.0 -15:46:07,166.7338,33.186,33.459,99.965,35.0 -15:46:07,166.7825,33.158,33.459,100.0,35.0 -15:46:08,166.8430,33.186,33.486,100.0,35.0 -15:46:08,166.8902,33.24,33.459,99.616,35.0 -15:46:08,166.9358,33.186,33.486,99.242,35.0 -15:46:08,166.9800,33.186,33.486,99.791,35.0 -15:46:08,167.0226,33.186,33.486,99.875,35.0 -15:46:08,167.0646,33.24,33.486,99.956,35.0 -15:46:08,167.1087,33.213,33.513,99.107,35.0 -15:46:08,167.1535,33.24,33.486,99.19,35.0 -15:46:08,167.1999,33.213,33.486,99.274,35.0 -15:46:08,167.2447,33.24,33.459,99.825,35.0 -15:46:08,167.2875,33.213,33.486,99.909,35.0 -15:46:08,167.3301,33.213,33.486,99.99,35.0 -15:46:08,167.3721,33.213,33.486,100.0,35.0 -15:46:08,167.4154,33.213,33.486,100.0,35.0 -15:46:08,167.4603,33.104,33.513,100.0,35.0 -15:46:08,167.5036,33.213,33.486,100.0,35.0 -15:46:08,167.5481,33.186,33.513,100.0,35.0 -15:46:08,167.5920,33.213,33.513,100.0,35.0 -15:46:08,167.6356,33.24,33.513,99.608,35.0 -15:46:08,167.6797,33.186,33.513,99.225,35.0 -15:46:08,167.7208,33.186,33.513,100.0,35.0 -15:46:08,167.7625,33.24,33.513,100.0,35.0 -15:46:08,167.8054,33.213,33.513,99.303,35.0 -15:46:09,167.8482,33.24,33.541,99.847,35.0 -15:46:09,167.8910,33.267,33.513,98.981,35.0 -15:46:09,167.9340,33.24,33.568,99.077,35.0 -15:46:09,167.9774,33.186,33.595,98.674,35.0 -15:46:09,168.0206,33.24,33.513,99.218,35.0 -15:46:09,168.0622,33.24,33.568,99.778,35.0 -15:46:09,168.1041,33.322,33.513,98.91,35.0 -15:46:09,168.1446,33.213,33.541,98.522,35.0 -15:46:09,168.1868,33.213,33.513,99.988,35.0 -15:46:09,168.2315,33.24,33.513,100.0,35.0 -15:46:09,168.2751,33.24,33.541,100.0,35.0 -15:46:09,168.3185,33.24,33.513,99.604,35.0 -15:46:09,168.3632,33.24,33.568,100.0,35.0 -15:46:09,168.4055,33.24,33.513,99.222,35.0 -15:46:09,168.4480,33.24,33.541,100.0,35.0 -15:46:09,168.4896,33.24,33.541,99.764,35.0 -15:46:09,168.5319,33.267,33.513,99.84,35.0 -15:46:09,168.5757,33.24,33.541,99.935,35.0 -15:46:09,168.6212,33.267,33.541,99.999,35.0 -15:46:09,168.6663,33.267,33.541,99.618,35.0 -15:46:09,168.7110,33.295,33.541,99.7,35.0 -15:46:09,168.7538,33.267,33.541,99.3,35.0 -15:46:09,168.7984,33.24,33.541,99.859,35.0 -15:46:10,168.8432,33.267,33.595,100.0,35.0 -15:46:10,168.8871,33.295,33.568,99.012,35.0 -15:46:10,168.9315,33.322,33.568,99.073,35.0 -15:46:10,168.9758,33.295,33.568,98.689,35.0 -15:46:10,169.0190,33.322,33.568,99.231,35.0 -15:46:10,169.0636,33.267,33.568,98.844,35.0 -15:46:10,169.1072,33.295,33.568,99.87,35.0 -15:46:10,169.1499,33.267,33.568,99.467,35.0 -15:46:10,169.1943,33.24,33.513,100.0,35.0 -15:46:10,169.2370,33.267,33.568,100.0,35.0 -15:46:10,169.2837,33.267,33.568,100.0,35.0 -15:46:10,169.3302,33.267,33.568,100.0,35.0 -15:46:10,169.3769,33.267,33.568,100.0,35.0 -15:46:10,169.4218,33.295,33.568,100.0,35.0 -15:46:10,169.4651,33.322,33.595,99.547,35.0 -15:46:10,169.5120,33.295,33.568,98.696,35.0 -15:46:10,169.5564,33.349,33.568,99.707,35.0 -15:46:10,169.6010,33.295,33.623,98.858,35.0 -15:46:10,169.6460,33.295,33.595,98.92,35.0 -15:46:10,169.6911,33.295,33.568,99.48,35.0 -15:46:10,169.7348,33.267,33.595,100.0,35.0 -15:46:10,169.7813,33.295,33.65,100.0,35.0 -15:46:11,169.8300,33.295,33.595,98.618,35.0 -15:46:11,169.8773,33.295,33.568,99.648,35.0 -15:46:11,169.9234,33.295,33.568,100.0,35.0 -15:46:11,169.9679,33.322,33.595,100.0,35.0 -15:46:11,170.0163,33.295,33.513,99.263,35.0 -15:46:11,170.0686,33.322,33.568,100.0,35.0 -15:46:11,170.1170,33.322,33.595,99.813,35.0 -15:46:11,170.1647,33.322,33.595,99.434,35.0 -15:46:11,170.2138,33.322,33.541,99.518,35.0 -15:46:11,170.2593,33.322,33.595,100.0,35.0 -15:46:11,170.3045,33.322,33.623,99.599,35.0 -15:46:11,170.3486,33.267,33.595,99.198,35.0 -15:46:11,170.3956,33.322,33.595,100.0,35.0 -15:46:11,170.4390,33.24,33.568,99.761,35.0 -15:46:11,170.4832,33.322,33.595,100.0,35.0 -15:46:11,170.5306,33.267,33.595,99.84,35.0 -15:46:11,170.5773,33.349,33.623,100.0,35.0 -15:46:11,170.6219,33.322,33.623,98.976,35.0 -15:46:11,170.6657,33.349,33.65,99.517,35.0 -15:46:11,170.7111,33.322,33.623,98.665,35.0 -15:46:11,170.7559,33.349,33.623,99.671,35.0 -15:46:11,170.8010,33.349,33.623,99.285,35.0 -15:46:12,170.8476,33.349,33.623,99.363,35.0 -15:46:12,170.8940,33.322,33.568,99.444,35.0 -15:46:12,170.9387,33.349,33.595,100.0,35.0 -15:46:12,170.9835,33.349,33.623,100.0,35.0 -15:46:12,171.0312,33.349,33.623,99.521,35.0 -15:46:12,171.0966,33.349,33.623,99.604,35.0 -15:46:12,171.1425,33.349,33.65,99.717,35.0 -15:46:12,171.1862,33.349,33.623,99.332,35.0 -15:46:12,171.2306,33.377,33.623,99.871,35.0 -15:46:12,171.2728,33.404,33.65,99.466,35.0 -15:46:12,171.3153,33.377,33.623,98.61,35.0 -15:46:12,171.3596,33.349,33.623,99.61,35.0 -15:46:12,171.4029,33.377,33.623,100.0,35.0 -15:46:12,171.4453,33.377,33.705,99.684,35.0 -15:46:12,171.4886,33.377,33.677,98.346,35.0 -15:46:12,171.5304,33.377,33.65,98.9,35.0 -15:46:12,171.5726,33.431,33.65,99.434,35.0 -15:46:12,171.6147,33.349,33.65,98.578,35.0 -15:46:12,171.6594,33.377,33.677,100.0,35.0 -15:46:12,171.7033,33.377,33.65,99.117,35.0 -15:46:12,171.7457,33.377,33.65,99.655,35.0 -15:46:12,171.7912,33.377,33.65,99.727,35.0 -15:46:13,171.8359,33.431,33.677,99.805,35.0 -15:46:13,171.8813,33.377,33.65,98.487,35.0 -15:46:13,171.9253,33.377,33.677,99.955,35.0 -15:46:13,171.9668,33.377,33.65,99.566,35.0 -15:46:13,172.0109,33.404,33.623,100.0,35.0 -15:46:13,172.0534,33.349,33.65,100.0,35.0 -15:46:13,172.0966,33.349,33.677,100.0,35.0 -15:46:13,172.1416,33.404,33.65,100.0,35.0 -15:46:13,172.1847,33.404,33.705,99.641,35.0 -15:46:13,172.2290,33.377,33.65,98.768,35.0 -15:46:13,172.2712,33.404,33.677,100.0,35.0 -15:46:13,172.3138,33.377,33.65,99.319,35.0 -15:46:13,172.3558,33.404,33.705,100.0,35.0 -15:46:13,172.4250,33.404,33.677,98.908,35.0 -15:46:13,172.4762,33.404,33.677,99.51,35.0 -15:46:13,172.5211,33.404,33.705,99.591,35.0 -15:46:13,172.5637,33.404,33.677,99.184,35.0 -15:46:13,172.6052,33.404,33.705,99.735,35.0 -15:46:13,172.6482,33.404,33.705,99.323,35.0 -15:46:13,172.6945,33.404,33.705,99.394,35.0 -15:46:13,172.7365,33.404,33.623,99.47,35.0 -15:46:13,172.7784,33.404,33.76,100.0,35.0 -15:46:14,172.8223,33.404,33.65,98.594,35.0 -15:46:14,172.8649,33.404,33.705,100.0,35.0 -15:46:14,172.9101,33.404,33.705,99.608,35.0 -15:46:14,172.9549,33.404,33.677,99.683,35.0 -15:46:14,172.9975,33.404,33.705,100.0,35.0 -15:46:14,173.0426,33.431,33.65,99.753,35.0 -15:46:14,173.0866,33.404,33.705,100.0,35.0 -15:46:14,173.1286,33.431,33.705,99.826,35.0 -15:46:14,173.1730,33.404,33.705,99.431,35.0 -15:46:14,173.2186,33.404,33.705,99.968,35.0 -15:46:14,173.2647,33.459,33.705,100.0,35.0 -15:46:14,173.3105,33.404,33.705,99.098,35.0 -15:46:14,173.3537,33.459,33.623,100.0,35.0 -15:46:14,173.3975,33.431,33.787,100.0,35.0 -15:46:14,173.4418,33.431,33.787,98.24,35.0 -15:46:14,173.4845,33.431,33.732,98.31,35.0 -15:46:14,173.5297,33.459,33.705,99.323,35.0 -15:46:14,173.5737,33.459,33.732,99.38,35.0 -15:46:14,173.6177,33.431,33.705,98.987,35.0 -15:46:14,173.6626,33.431,33.732,100.0,35.0 -15:46:14,173.7056,33.459,33.732,99.54,35.0 -15:46:14,173.7488,33.431,33.732,99.128,35.0 -15:46:14,173.7930,33.431,33.732,99.679,35.0 -15:46:15,173.8368,33.513,33.732,99.751,35.0 -15:46:15,173.8775,33.486,33.732,98.411,35.0 -15:46:15,173.9209,33.431,33.705,98.94,35.0 -15:46:15,173.9639,33.459,33.705,100.0,35.0 -15:46:15,174.0075,33.459,33.732,99.937,35.0 -15:46:15,174.0507,33.459,33.76,99.543,35.0 -15:46:15,174.0957,33.459,33.732,99.13,35.0 -15:46:15,174.1399,33.431,33.732,99.684,35.0 -15:46:15,174.1826,33.459,33.732,100.0,35.0 -15:46:15,174.2269,33.459,33.732,99.752,35.0 -15:46:15,174.2689,33.459,33.732,99.823,35.0 -15:46:15,174.3145,33.486,33.732,99.89,35.0 -15:46:15,174.3599,33.486,33.76,99.5,35.0 -15:46:15,174.4034,33.459,33.76,99.09,35.0 -15:46:15,174.4466,33.459,33.787,99.623,35.0 -15:46:15,174.4887,33.459,33.76,99.227,35.0 -15:46:15,174.5305,33.459,33.76,99.758,35.0 -15:46:15,174.5748,33.486,33.732,99.824,35.0 -15:46:15,174.6178,33.486,33.677,99.911,35.0 -15:46:15,174.6627,33.486,33.76,100.0,35.0 -15:46:15,174.7061,33.486,33.787,99.501,35.0 -15:46:15,174.7493,33.459,33.732,99.105,35.0 -15:46:15,174.7932,33.459,33.76,100.0,35.0 -15:46:16,174.8528,33.486,33.787,100.0,35.0 -15:46:16,174.8966,33.486,33.787,99.199,35.0 -15:46:16,174.9398,33.486,33.787,99.264,35.0 -15:46:16,174.9835,33.513,33.787,99.332,35.0 -15:46:16,175.0289,33.486,33.732,98.936,35.0 -15:46:16,175.0716,33.486,33.787,100.0,35.0 -15:46:16,175.1135,33.486,33.787,99.466,35.0 -15:46:16,175.1590,33.486,33.787,99.531,35.0 -15:46:16,175.2027,33.486,33.787,99.602,35.0 -15:46:16,175.2443,33.486,33.842,99.67,35.0 -15:46:16,175.2859,33.486,33.787,98.789,35.0 -15:46:16,175.3286,33.486,33.787,99.798,35.0 -15:46:16,175.3718,33.513,33.815,99.865,35.0 -15:46:16,175.4152,33.486,33.76,98.986,35.0 -15:46:16,175.4604,33.486,33.842,100.0,35.0 -15:46:16,175.5049,33.513,33.815,99.055,35.0 -15:46:16,175.5477,33.459,33.815,99.123,35.0 -15:46:16,175.5927,33.486,33.815,100.0,35.0 -15:46:16,175.6358,33.513,33.815,99.656,35.0 -15:46:16,175.6787,33.513,33.787,99.258,35.0 -15:46:16,175.7227,33.513,33.787,99.805,35.0 -15:46:16,175.7642,33.486,33.815,99.873,35.0 -15:46:17,175.8098,33.513,33.787,99.919,35.0 -15:46:17,175.8528,33.568,33.842,100.0,35.0 -15:46:17,175.8960,33.568,33.787,98.111,35.0 -15:46:17,175.9419,33.541,33.815,99.121,35.0 -15:46:17,175.9859,33.513,33.815,99.173,35.0 -15:46:17,176.0298,33.541,33.815,99.721,35.0 -15:46:17,176.0730,33.513,33.842,99.306,35.0 -15:46:17,176.1173,33.513,33.815,99.389,35.0 -15:46:17,176.1613,33.541,33.815,99.92,35.0 -15:46:17,176.2043,33.568,33.815,99.505,35.0 -15:46:17,176.2488,33.541,33.815,99.106,35.0 -15:46:17,176.2932,33.568,33.842,99.637,35.0 -15:46:17,176.3367,33.541,33.924,98.775,35.0 -15:46:17,176.3800,33.541,33.815,97.894,35.0 -15:46:17,176.4241,33.541,33.842,99.831,35.0 -15:46:17,176.4674,33.513,33.842,99.434,35.0 -15:46:17,176.5133,33.541,33.815,99.98,35.0 -15:46:17,176.5572,33.541,33.842,100.0,35.0 -15:46:17,176.6012,33.513,33.842,99.565,35.0 -15:46:17,176.6428,33.541,33.815,100.0,35.0 -15:46:17,176.6870,33.541,33.842,100.0,35.0 -15:46:17,176.7306,33.568,33.842,99.631,35.0 -15:46:17,176.7769,33.541,33.842,99.232,35.0 -15:46:18,176.8205,33.541,33.842,99.766,35.0 -15:46:18,176.8634,33.541,33.842,99.83,35.0 -15:46:18,176.9080,33.568,33.87,99.895,35.0 -15:46:18,176.9547,33.541,33.87,99.015,35.0 -15:46:18,176.9997,33.568,33.842,99.548,35.0 -15:46:18,177.0461,33.568,33.842,99.631,35.0 -15:46:18,177.0928,33.568,33.924,99.7,35.0 -15:46:18,177.1374,33.568,33.87,98.359,35.0 -15:46:18,177.1826,33.541,33.87,99.352,35.0 -15:46:18,177.2316,33.541,33.87,99.882,35.0 -15:46:18,177.2779,33.595,33.87,99.954,35.0 -15:46:18,177.3240,33.568,33.87,99.094,35.0 -15:46:18,177.3694,33.568,33.87,99.625,35.0 -15:46:18,177.4139,33.595,33.87,99.692,35.0 -15:46:18,177.4604,33.595,33.897,99.292,35.0 -15:46:18,177.5044,33.595,33.87,98.895,35.0 -15:46:18,177.5498,33.568,33.87,99.423,35.0 -15:46:18,177.5956,33.595,33.87,99.953,35.0 -15:46:18,177.6420,33.568,33.87,99.555,35.0 -15:46:18,177.6861,33.541,33.897,100.0,35.0 -15:46:18,177.7303,33.595,33.815,100.0,35.0 -15:46:18,177.7776,33.595,33.87,100.0,35.0 -15:46:19,177.8229,33.568,33.897,99.624,35.0 -15:46:19,177.8686,33.595,33.897,99.689,35.0 -15:46:19,177.9127,33.623,33.897,99.291,35.0 -15:46:19,177.9593,33.595,33.87,98.873,35.0 -15:46:19,178.0038,33.568,33.897,99.885,35.0 -15:46:19,178.0506,33.595,33.87,99.949,35.0 -15:46:19,178.0964,33.595,33.897,100.0,35.0 -15:46:19,178.1439,33.623,33.87,99.55,35.0 -15:46:19,178.1873,33.595,33.897,99.601,35.0 -15:46:19,178.2335,33.595,33.897,99.681,35.0 -15:46:19,178.2806,33.623,33.924,99.747,35.0 -15:46:19,178.3274,33.541,33.87,98.868,35.0 -15:46:19,178.3721,33.65,33.924,100.0,35.0 -15:46:19,178.4175,33.595,33.924,98.466,35.0 -15:46:19,178.4637,33.595,33.897,99.475,35.0 -15:46:19,178.5107,33.595,33.924,100.0,35.0 -15:46:19,178.5565,33.623,33.979,99.542,35.0 -15:46:19,178.6020,33.65,33.924,98.18,35.0 -15:46:19,178.6475,33.623,33.924,98.723,35.0 -15:46:19,178.6957,33.568,33.924,99.253,35.0 -15:46:19,178.7429,33.623,33.897,100.0,35.0 -15:46:19,178.7883,33.595,33.952,99.784,35.0 -15:46:20,178.8357,33.623,33.924,99.384,35.0 -15:46:20,178.8807,33.595,33.924,99.451,35.0 -15:46:20,178.9294,33.623,33.924,99.995,35.0 -15:46:20,178.9757,33.65,33.952,99.582,35.0 -15:46:20,179.0219,33.623,33.952,98.701,35.0 -15:46:20,179.0682,33.705,33.952,99.229,35.0 -15:46:20,179.1126,33.65,33.952,97.883,35.0 -15:46:20,179.1618,33.623,33.952,98.888,35.0 -15:46:20,179.2090,33.595,33.924,99.42,35.0 -15:46:20,179.2536,33.677,33.924,100.0,35.0 -15:46:20,179.2984,33.65,33.952,99.035,35.0 -15:46:20,179.3482,33.65,33.952,99.079,35.0 -15:46:20,179.3951,33.65,33.952,99.147,35.0 -15:46:20,179.4411,33.595,33.979,99.211,35.0 -15:46:20,179.4862,33.65,33.952,99.756,35.0 -15:46:20,179.5313,33.65,33.952,99.337,35.0 -15:46:20,179.5777,33.65,33.979,99.399,35.0 -15:46:20,179.6237,33.65,34.034,98.998,35.0 -15:46:20,179.6700,33.65,33.952,98.114,35.0 -15:46:20,179.7152,33.677,33.952,99.586,35.0 -15:46:20,179.7617,33.595,33.979,99.183,35.0 -15:46:21,179.8089,33.705,34.007,100.0,35.0 -15:46:21,179.8547,33.677,33.979,97.82,35.0 -15:46:21,179.9001,33.677,33.979,98.843,35.0 -15:46:21,179.9481,33.677,33.952,98.903,35.0 -15:46:21,179.9966,33.705,33.979,99.432,35.0 -15:46:21,180.0448,33.595,33.979,98.552,35.0 -15:46:21,180.0892,33.677,33.952,100.0,35.0 -15:46:21,180.1452,33.677,34.034,99.556,35.0 -15:46:21,180.2039,33.677,33.979,98.225,35.0 -15:46:21,180.2497,33.677,33.979,99.245,35.0 -15:46:21,180.2966,33.677,33.979,99.305,35.0 -15:46:21,180.3426,33.65,33.979,99.368,35.0 -15:46:21,180.3856,33.705,33.979,99.894,35.0 -15:46:21,180.4336,33.705,34.007,99.006,35.0 -15:46:21,180.5135,33.677,33.979,98.599,35.0 -15:46:21,180.5791,33.705,33.979,99.66,35.0 -15:46:21,180.6405,33.705,33.979,99.264,35.0 -15:46:21,180.6990,33.705,34.034,99.346,35.0 -15:46:21,180.7573,33.705,33.979,98.478,35.0 -15:46:22,180.8131,33.677,33.979,99.497,35.0 -15:46:22,180.8730,33.705,34.007,100.0,35.0 -15:46:22,180.9291,33.677,33.979,99.096,35.0 -15:46:22,180.9885,33.705,33.979,100.0,35.0 -15:46:22,181.0445,33.677,34.007,99.656,35.0 -15:46:22,181.1002,33.732,34.007,99.729,35.0 -15:46:22,181.1525,33.705,34.007,98.859,35.0 -15:46:22,181.2093,33.705,34.034,99.389,35.0 -15:46:22,181.2661,33.732,34.007,99.002,35.0 -15:46:22,181.3176,33.732,33.979,99.072,35.0 -15:46:22,181.3653,33.705,34.007,99.62,35.0 -15:46:22,181.4168,33.732,33.979,99.668,35.0 -15:46:22,181.4709,33.732,34.034,99.752,35.0 -15:46:22,181.5236,33.732,34.007,98.874,35.0 -15:46:22,181.5707,33.732,34.034,99.406,35.0 -15:46:22,181.6159,33.732,34.034,99.002,35.0 -15:46:22,181.6617,33.787,34.007,99.06,35.0 -15:46:22,181.7040,33.732,34.062,98.636,35.0 -15:46:22,181.7458,33.732,34.034,98.69,35.0 -15:46:22,181.7905,33.732,34.034,99.224,35.0 -15:46:23,181.8474,33.732,34.007,99.281,35.0 -15:46:23,181.8940,33.76,34.034,99.819,35.0 -15:46:23,181.9383,33.76,34.034,98.932,35.0 -15:46:23,181.9816,33.732,34.034,98.988,35.0 -15:46:23,182.0261,33.787,34.034,99.524,35.0 -15:46:23,182.0696,33.732,34.09,98.635,35.0 -15:46:23,182.1123,33.732,34.034,98.672,35.0 -15:46:23,182.1577,33.732,34.034,99.688,35.0 -15:46:23,182.2007,33.76,34.034,99.746,35.0 -15:46:23,182.2425,33.732,34.034,99.319,35.0 -15:46:23,182.2849,33.76,34.034,99.854,35.0 -15:46:23,182.3342,33.677,34.062,99.428,35.0 -15:46:23,182.3860,33.76,34.034,100.0,35.0 -15:46:23,182.4317,33.732,34.062,99.489,35.0 -15:46:23,182.4789,33.732,34.034,99.547,35.0 -15:46:23,182.5238,33.76,34.062,100.0,35.0 -15:46:23,182.5677,33.76,34.062,99.122,35.0 -15:46:23,182.6106,33.76,34.062,99.177,35.0 -15:46:23,182.6580,33.732,34.062,99.23,35.0 -15:46:23,182.7005,33.76,34.062,99.771,35.0 -15:46:23,182.7447,33.76,34.062,99.343,35.0 -15:46:23,182.7927,33.76,34.062,99.398,35.0 -15:46:24,182.8395,33.76,34.117,99.458,35.0 -15:46:24,182.8846,33.787,34.09,98.57,35.0 -15:46:24,182.9305,33.76,34.062,98.624,35.0 -15:46:24,182.9770,33.787,34.062,99.626,35.0 -15:46:24,183.0232,33.787,34.062,99.219,35.0 -15:46:24,183.0701,33.787,34.09,99.277,35.0 -15:46:24,183.1175,33.787,34.062,98.853,35.0 -15:46:24,183.1628,33.76,34.09,99.392,35.0 -15:46:24,183.2098,33.815,34.034,99.43,35.0 -15:46:24,183.2586,33.76,34.034,99.505,35.0 -15:46:24,183.3046,33.76,34.09,100.0,35.0 -15:46:24,183.3498,33.787,34.09,99.544,35.0 -15:46:24,183.3956,33.787,34.117,99.135,35.0 -15:46:24,183.4449,33.815,34.09,98.726,35.0 -15:46:24,183.4920,33.815,34.09,98.768,35.0 -15:46:24,183.5371,33.787,34.09,98.824,35.0 -15:46:24,183.5824,33.815,34.062,99.36,35.0 -15:46:24,183.6298,33.815,34.09,99.415,35.0 -15:46:24,183.6770,33.787,34.09,98.991,35.0 -15:46:24,183.7245,33.815,34.09,99.529,35.0 -15:46:24,183.7693,33.815,34.117,99.105,35.0 -15:46:25,183.8157,33.787,34.172,98.694,35.0 -15:46:25,183.8649,33.787,34.09,98.285,35.0 -15:46:25,183.9126,33.815,34.117,99.752,35.0 -15:46:25,183.9615,33.787,34.117,98.864,35.0 -15:46:25,184.0086,33.842,34.117,99.404,35.0 -15:46:25,184.0567,33.815,34.117,98.514,35.0 -15:46:25,184.1030,33.815,34.09,99.034,35.0 -15:46:25,184.1487,33.815,34.117,99.553,35.0 -15:46:25,184.1957,33.842,34.117,99.144,35.0 -15:46:25,184.2444,33.815,34.117,98.735,35.0 -15:46:25,184.2926,33.842,34.145,99.256,35.0 -15:46:25,184.3387,33.815,34.117,98.367,35.0 -15:46:25,184.3855,33.815,34.117,99.366,35.0 -15:46:25,184.4310,33.815,34.117,99.421,35.0 -15:46:25,184.4779,33.842,34.09,99.475,35.0 -15:46:25,184.5250,33.815,34.117,99.53,35.0 -15:46:25,184.5715,33.842,34.117,99.586,35.0 -15:46:25,184.6170,33.842,34.145,99.177,35.0 -15:46:25,184.6631,33.842,34.09,98.748,35.0 -15:46:25,184.7096,33.842,34.117,99.747,35.0 -15:46:25,184.7575,33.842,34.145,99.337,35.0 -15:46:25,184.8037,33.842,34.145,98.912,35.0 -15:46:26,184.8513,33.842,34.145,98.965,35.0 -15:46:26,184.8970,33.842,34.145,99.02,35.0 -15:46:26,184.9437,33.842,34.145,99.072,35.0 -15:46:26,184.9915,33.842,34.172,99.126,35.0 -15:46:26,185.0428,33.842,34.145,98.716,35.0 -15:46:26,185.0893,33.842,34.145,99.239,35.0 -15:46:26,185.1358,33.924,34.172,99.293,35.0 -15:46:26,185.1818,33.842,34.172,97.471,35.0 -15:46:26,185.2296,33.842,34.145,98.932,35.0 -15:46:26,185.2792,33.842,34.145,99.45,35.0 -15:46:26,185.3266,33.842,34.172,99.507,35.0 -15:46:26,185.3723,33.842,34.172,99.098,35.0 -15:46:26,185.4195,33.87,34.172,99.149,35.0 -15:46:26,185.4662,33.842,34.172,98.721,35.0 -15:46:26,185.5107,33.87,34.172,99.255,35.0 -15:46:26,185.5575,33.87,34.172,98.824,35.0 -15:46:26,185.6022,33.87,34.145,98.876,35.0 -15:46:26,185.6475,33.87,34.145,99.39,35.0 -15:46:26,185.6938,33.842,34.172,99.442,35.0 -15:46:26,185.7408,33.87,34.2,99.511,35.0 -15:46:26,185.7893,33.842,34.172,98.602,35.0 -15:46:27,185.8361,33.897,34.145,99.619,35.0 -15:46:27,185.8829,33.87,34.172,99.19,35.0 -15:46:27,185.9283,33.924,34.172,99.242,35.0 -15:46:27,185.9751,33.87,34.172,98.364,35.0 -15:46:27,186.0224,33.87,34.172,99.344,35.0 -15:46:27,186.0684,33.924,34.172,99.397,35.0 -15:46:27,186.1135,33.87,34.172,98.52,35.0 -15:46:27,186.1606,33.87,34.145,99.497,35.0 -15:46:27,186.2084,33.87,34.2,100.0,35.0 -15:46:27,186.2539,33.87,34.2,99.069,35.0 -15:46:27,186.2996,33.897,34.2,99.119,35.0 -15:46:27,186.3441,33.897,34.172,98.705,35.0 -15:46:27,186.3913,33.897,34.172,99.235,35.0 -15:46:27,186.4355,33.924,34.2,99.287,35.0 -15:46:27,186.4801,33.897,34.145,98.39,35.0 -15:46:27,186.5254,33.897,34.172,99.848,35.0 -15:46:27,186.5691,33.924,34.2,99.434,35.0 -15:46:27,186.6144,33.897,34.2,98.537,35.0 -15:46:27,186.6611,33.897,34.172,99.05,35.0 -15:46:27,186.7067,33.897,34.2,99.582,35.0 -15:46:27,186.7499,33.924,34.145,99.15,35.0 -15:46:27,186.7940,33.924,34.2,99.679,35.0 -15:46:28,186.8421,33.924,34.2,98.782,35.0 -15:46:28,186.8895,33.897,34.227,98.834,35.0 -15:46:28,186.9334,33.924,34.2,98.884,35.0 -15:46:28,186.9791,33.924,34.227,98.931,35.0 -15:46:28,187.0256,33.897,34.145,98.516,35.0 -15:46:28,187.0715,33.897,34.227,100.0,35.0 -15:46:28,187.1153,33.924,34.227,99.028,35.0 -15:46:28,187.1619,33.924,34.2,98.612,35.0 -15:46:28,187.2078,33.924,34.2,99.125,35.0 -15:46:28,187.2524,33.924,34.227,99.174,35.0 -15:46:28,187.2976,33.924,34.2,98.757,35.0 -15:46:28,187.3446,33.924,34.227,99.269,35.0 -15:46:28,187.3919,33.924,34.227,98.855,35.0 -15:46:28,187.4362,33.952,34.227,98.905,35.0 -15:46:28,187.4809,33.952,34.227,98.47,35.0 -15:46:28,187.5277,33.952,34.227,98.517,35.0 -15:46:28,187.5756,33.924,34.255,98.566,35.0 -15:46:28,187.6206,33.924,34.227,98.616,35.0 -15:46:28,187.6657,33.952,34.227,99.144,35.0 -15:46:28,187.7095,33.952,34.2,98.71,35.0 -15:46:28,187.7538,33.952,34.227,99.22,35.0 -15:46:28,187.7993,33.924,34.255,98.802,35.0 -15:46:29,187.8452,33.897,34.227,98.849,35.0 -15:46:29,187.8932,33.952,34.255,99.843,35.0 -15:46:29,187.9397,33.952,34.283,98.467,35.0 -15:46:29,187.9844,33.924,34.255,98.033,35.0 -15:46:29,188.0284,33.979,34.255,99.041,35.0 -15:46:29,188.0731,33.952,34.255,98.141,35.0 -15:46:29,188.1154,33.952,34.227,98.651,35.0 -15:46:29,188.1563,33.952,34.255,99.175,35.0 -15:46:29,188.1987,33.979,34.255,98.737,35.0 -15:46:29,188.2397,33.979,34.255,98.315,35.0 -15:46:29,188.2821,33.979,34.227,98.357,35.0 -15:46:29,188.3236,33.979,34.283,98.881,35.0 -15:46:29,188.3655,33.952,34.255,97.961,35.0 -15:46:29,188.4057,33.952,34.255,98.948,35.0 -15:46:29,188.4486,33.979,34.283,98.989,35.0 -15:46:29,188.4929,33.952,34.255,98.088,35.0 -15:46:29,188.5340,33.952,34.283,99.077,35.0 -15:46:29,188.5757,34.007,34.338,98.638,35.0 -15:46:29,188.6177,33.952,34.283,96.789,35.0 -15:46:29,188.6594,33.952,34.255,98.72,35.0 -15:46:29,188.7021,33.979,34.283,99.243,35.0 -15:46:29,188.7437,33.979,34.255,98.341,35.0 -15:46:29,188.7882,34.062,34.283,98.864,35.0 -15:46:30,188.8312,33.979,34.283,96.999,35.0 -15:46:30,188.8747,33.979,34.255,98.468,35.0 -15:46:30,188.9170,34.007,34.338,98.993,35.0 -15:46:30,188.9577,33.952,34.31,97.126,35.0 -15:46:30,189.0046,33.979,34.283,98.592,35.0 -15:46:30,189.0470,33.979,34.255,98.639,35.0 -15:46:30,189.0915,33.979,34.283,99.162,35.0 -15:46:30,189.1351,34.007,34.31,98.725,35.0 -15:46:30,189.1763,33.979,34.283,97.823,35.0 -15:46:30,189.2176,33.979,34.283,98.808,35.0 -15:46:30,189.2684,33.979,34.283,98.849,35.0 -15:46:30,189.3115,34.007,34.31,98.9,35.0 -15:46:30,189.3555,34.007,34.255,97.997,35.0 -15:46:30,189.3983,34.034,34.283,98.985,35.0 -15:46:30,189.4460,34.007,34.283,98.083,35.0 -15:46:30,189.4915,34.007,34.31,98.592,35.0 -15:46:30,189.5346,34.007,34.31,98.172,35.0 -15:46:30,189.5756,34.007,34.31,98.213,35.0 -15:46:30,189.6165,34.007,34.283,98.252,35.0 -15:46:30,189.6576,33.979,34.31,98.756,35.0 -15:46:30,189.6994,34.007,34.338,98.814,35.0 -15:46:30,189.7397,34.007,34.283,97.891,35.0 -15:46:30,189.7822,34.034,34.31,98.875,35.0 -15:46:31,189.8247,34.007,34.283,97.988,35.0 -15:46:31,189.8678,34.007,34.338,98.957,35.0 -15:46:31,189.9105,34.034,34.31,98.053,35.0 -15:46:31,189.9546,33.979,34.283,98.111,35.0 -15:46:31,189.9964,34.007,34.31,99.563,35.0 -15:46:31,190.0428,34.034,34.31,98.658,35.0 -15:46:31,190.0884,34.034,34.338,98.239,35.0 -15:46:31,190.1310,34.034,34.338,97.8,35.0 -15:46:31,190.1749,34.034,34.365,97.84,35.0 -15:46:31,190.2184,33.979,34.31,97.416,35.0 -15:46:31,190.2618,34.034,34.283,99.348,35.0 -15:46:31,190.3063,33.924,34.338,98.909,35.0 -15:46:31,190.3485,34.034,34.393,99.897,35.0 -15:46:31,190.3903,34.034,34.31,97.102,35.0 -15:46:31,190.4336,34.062,34.338,98.567,35.0 -15:46:31,190.4756,34.062,34.31,97.645,35.0 -15:46:31,190.5192,34.034,34.365,98.165,35.0 -15:46:31,190.5625,34.034,34.338,97.741,35.0 -15:46:31,190.6067,34.062,34.338,98.245,35.0 -15:46:31,190.6496,34.034,34.338,97.804,35.0 -15:46:31,190.6928,34.062,34.365,98.325,35.0 -15:46:31,190.7371,34.062,34.338,97.419,35.0 -15:46:31,190.7807,34.062,34.365,97.923,35.0 -15:46:32,190.8248,34.062,34.365,97.499,35.0 -15:46:32,190.8689,34.062,34.338,97.538,35.0 -15:46:32,190.9129,34.062,34.365,98.042,35.0 -15:46:32,190.9555,34.034,34.338,97.618,35.0 -15:46:32,190.9977,34.062,34.365,98.603,35.0 -15:46:32,191.0402,34.062,34.393,97.696,35.0 -15:46:32,191.0842,34.09,34.338,97.252,35.0 -15:46:32,191.1268,34.062,34.338,97.756,35.0 -15:46:32,191.1709,34.062,34.365,98.275,35.0 -15:46:32,191.2138,34.062,34.365,97.851,35.0 -15:46:32,191.2582,34.062,34.365,97.89,35.0 -15:46:32,191.3028,34.062,34.365,97.93,35.0 -15:46:32,191.3460,34.062,34.421,97.97,35.0 -15:46:32,191.3898,34.062,34.393,97.046,35.0 -15:46:32,191.4326,34.09,34.393,97.565,35.0 -15:46:32,191.4755,34.062,34.365,97.121,35.0 -15:46:32,191.5190,34.09,34.365,98.122,35.0 -15:46:32,191.5622,34.062,34.365,97.679,35.0 -15:46:32,191.6072,34.062,34.421,98.199,35.0 -15:46:32,191.6497,34.062,34.393,97.276,35.0 -15:46:32,191.6930,34.062,34.365,97.794,35.0 -15:46:32,191.7375,34.007,34.338,98.314,35.0 -15:46:32,191.7800,34.034,34.365,99.764,35.0 -15:46:33,191.8256,34.09,34.393,98.876,35.0 -15:46:33,191.8716,34.09,34.393,97.473,35.0 -15:46:33,191.9172,34.09,34.365,97.513,35.0 -15:46:33,191.9614,34.09,34.393,98.034,35.0 -15:46:33,192.0078,34.09,34.393,97.591,35.0 -15:46:33,192.0530,34.09,34.393,97.632,35.0 -15:46:33,192.0997,34.09,34.448,97.671,35.0 -15:46:33,192.1427,34.117,34.365,96.765,35.0 -15:46:33,192.1886,34.09,34.421,97.764,35.0 -15:46:33,192.2329,34.09,34.393,97.305,35.0 -15:46:33,192.2762,34.062,34.393,97.824,35.0 -15:46:33,192.3215,34.145,34.421,98.343,35.0 -15:46:33,192.3668,34.117,34.393,96.474,35.0 -15:46:33,192.4098,34.117,34.448,97.475,35.0 -15:46:33,192.4553,34.09,34.393,96.565,35.0 -15:46:33,192.4988,34.117,34.421,98.013,35.0 -15:46:33,192.5430,34.117,34.393,97.105,35.0 -15:46:33,192.5886,34.117,34.393,97.623,35.0 -15:46:33,192.6374,34.117,34.421,97.662,35.0 -15:46:33,192.6834,34.062,34.393,97.223,35.0 -15:46:33,192.7245,34.09,34.393,98.688,35.0 -15:46:33,192.7649,34.117,34.338,98.243,35.0 -15:46:33,192.8064,34.117,34.421,98.759,35.0 -15:46:34,192.8490,34.145,34.421,97.368,35.0 -15:46:34,192.8914,34.117,34.421,96.922,35.0 -15:46:34,192.9347,34.117,34.476,97.439,35.0 -15:46:34,192.9761,34.117,34.448,96.529,35.0 -15:46:34,193.0213,34.117,34.421,97.044,35.0 -15:46:34,193.0638,34.09,34.448,97.545,35.0 -15:46:34,193.1084,34.117,34.421,97.581,35.0 -15:46:34,193.1498,34.09,34.421,97.618,35.0 -15:46:34,193.1907,34.09,34.393,98.117,35.0 -15:46:34,193.2333,34.117,34.476,98.633,35.0 -15:46:34,193.2757,34.145,34.448,96.778,35.0 -15:46:34,193.3205,34.117,34.448,96.812,35.0 -15:46:34,193.3622,34.145,34.448,97.33,35.0 -15:46:34,193.4073,34.145,34.421,96.883,35.0 -15:46:34,193.4511,34.145,34.421,97.383,35.0 -15:46:34,193.4955,34.117,34.448,97.419,35.0 -15:46:34,193.5411,34.2,34.448,97.473,35.0 -15:46:34,193.5882,34.145,34.448,96.084,35.0 -15:46:34,193.6309,34.172,34.448,97.065,35.0 -15:46:34,193.6736,34.145,34.448,96.635,35.0 -15:46:34,193.7168,34.145,34.393,97.133,35.0 -15:46:34,193.7585,34.172,34.448,98.113,35.0 -15:46:34,193.8039,34.145,34.448,96.738,35.0 -15:46:35,193.8492,34.172,34.448,97.238,35.0 -15:46:35,193.8913,34.172,34.448,96.81,35.0 -15:46:35,193.9343,34.145,34.448,96.843,35.0 -15:46:35,193.9770,34.172,34.476,97.342,35.0 -15:46:35,194.0205,34.172,34.476,96.43,35.0 -15:46:35,194.0647,34.172,34.476,96.464,35.0 -15:46:35,194.1078,34.172,34.476,96.498,35.0 -15:46:35,194.1528,34.172,34.476,96.531,35.0 -15:46:35,194.1956,34.172,34.559,96.566,35.0 -15:46:35,194.2394,34.172,34.448,95.172,35.0 -15:46:35,194.2822,34.172,34.504,97.112,35.0 -15:46:35,194.3235,34.172,34.476,96.183,35.0 -15:46:35,194.3648,34.172,34.476,96.696,35.0 -15:46:35,194.4066,34.172,34.448,96.727,35.0 -15:46:35,194.4491,34.2,34.476,97.241,35.0 -15:46:35,194.4911,34.172,34.476,96.312,35.0 -15:46:35,194.5361,34.172,34.476,96.825,35.0 -15:46:35,194.5785,34.2,34.476,96.86,35.0 -15:46:35,194.6227,34.255,34.476,96.411,35.0 -15:46:35,194.6644,34.172,34.476,95.498,35.0 -15:46:35,194.7061,34.2,34.504,96.956,35.0 -15:46:35,194.7484,34.172,34.504,96.025,35.0 -15:46:35,194.7903,34.172,34.531,96.538,35.0 -15:46:36,194.8342,34.2,34.504,96.106,35.0 -15:46:36,194.8760,34.2,34.504,96.121,35.0 -15:46:36,194.9207,34.172,34.504,96.152,35.0 -15:46:36,194.9631,34.2,34.504,96.666,35.0 -15:46:36,195.0065,34.2,34.476,96.217,35.0 -15:46:36,195.0496,34.2,34.504,96.731,35.0 -15:46:36,195.0915,34.2,34.476,96.282,35.0 -15:46:36,195.1400,34.2,34.504,96.794,35.0 -15:46:36,195.1900,34.2,34.504,96.35,35.0 -15:46:36,195.2338,34.2,34.504,96.386,35.0 -15:46:36,195.2776,34.2,34.476,96.419,35.0 -15:46:36,195.3216,34.2,34.504,96.933,35.0 -15:46:36,195.3684,34.2,34.504,96.486,35.0 -15:46:36,195.4107,34.2,34.504,96.519,35.0 -15:46:36,195.4814,34.227,34.504,96.55,35.0 -15:46:36,195.5609,34.2,34.531,96.141,35.0 -15:46:36,195.6166,34.227,34.531,96.198,35.0 -15:46:36,195.6776,34.227,34.531,95.774,35.0 -15:46:36,195.7394,34.2,34.531,95.815,35.0 -15:46:36,195.7926,34.227,34.504,96.326,35.0 -15:46:37,195.8468,34.227,34.531,96.364,35.0 -15:46:37,195.9052,34.227,34.504,95.938,35.0 -15:46:37,195.9608,34.227,34.504,96.444,35.0 -15:46:37,196.0132,34.227,34.531,96.483,35.0 -15:46:37,196.0644,34.227,34.531,96.057,35.0 -15:46:37,196.1277,34.227,34.531,96.095,35.0 -15:46:37,196.1837,34.227,34.531,96.138,35.0 -15:46:37,196.2395,34.227,34.504,96.179,35.0 -15:46:37,196.2916,34.227,34.504,96.683,35.0 -15:46:37,196.3403,34.227,34.504,96.719,35.0 -15:46:37,196.3873,34.227,34.531,96.755,35.0 -15:46:37,196.4376,34.31,34.531,96.324,35.0 -15:46:37,196.4872,34.2,34.531,94.933,35.0 -15:46:37,196.5393,34.255,34.531,96.857,35.0 -15:46:37,196.5847,34.255,34.559,95.949,35.0 -15:46:37,196.6296,34.255,34.559,95.499,35.0 -15:46:37,196.6737,34.227,34.559,95.529,35.0 -15:46:37,196.7174,34.255,34.531,96.04,35.0 -15:46:37,196.7624,34.255,34.531,96.071,35.0 -15:46:38,196.8166,34.255,34.559,96.102,35.0 -15:46:38,196.8703,34.255,34.559,95.659,35.0 -15:46:38,196.9186,34.31,34.587,95.694,35.0 -15:46:38,196.9641,34.255,34.559,94.299,35.0 -15:46:38,197.0102,34.255,34.559,95.756,35.0 -15:46:38,197.0579,34.255,34.559,95.787,35.0 -15:46:38,197.1014,34.255,34.559,95.819,35.0 -15:46:38,197.1450,34.283,34.559,95.848,35.0 -15:46:38,197.1895,34.255,34.559,95.396,35.0 -15:46:38,197.2325,34.283,34.559,95.907,35.0 -15:46:38,197.2754,34.283,34.615,95.455,35.0 -15:46:38,197.3202,34.365,34.559,94.52,35.0 -15:46:38,197.3628,34.255,34.587,94.101,35.0 -15:46:38,197.4079,34.255,34.559,95.538,35.0 -15:46:38,197.4537,34.283,34.559,96.049,35.0 -15:46:38,197.4983,34.283,34.587,95.599,35.0 -15:46:38,197.5417,34.255,34.587,95.146,35.0 -15:46:38,197.5863,34.31,34.587,95.656,35.0 -15:46:38,197.6307,34.338,34.587,94.74,35.0 -15:46:38,197.6755,34.338,34.615,94.286,35.0 -15:46:38,197.7198,34.283,34.587,93.832,35.0 -15:46:38,197.7628,34.31,34.504,95.286,35.0 -15:46:38,197.8053,34.283,34.587,96.277,35.0 -15:46:39,197.8495,34.31,34.587,95.342,35.0 -15:46:39,197.8946,34.283,34.559,94.907,35.0 -15:46:39,197.9398,34.31,34.587,95.881,35.0 -15:46:39,197.9851,34.283,34.615,94.965,35.0 -15:46:39,198.0292,34.31,34.587,94.976,35.0 -15:46:39,198.0746,34.31,34.587,95.021,35.0 -15:46:39,198.1193,34.283,34.615,95.05,35.0 -15:46:39,198.1614,34.283,34.587,95.061,35.0 -15:46:39,198.2056,34.31,34.587,95.569,35.0 -15:46:39,198.2495,34.283,34.615,95.133,35.0 -15:46:39,198.2927,34.31,34.587,95.143,35.0 -15:46:39,198.3375,34.31,34.615,95.188,35.0 -15:46:39,198.3815,34.31,34.615,94.734,35.0 -15:46:39,198.4233,34.283,34.587,94.761,35.0 -15:46:39,198.4669,34.31,34.615,95.733,35.0 -15:46:39,198.5112,34.338,34.615,94.815,35.0 -15:46:39,198.5554,34.338,34.615,94.361,35.0 -15:46:39,198.6003,34.283,34.531,94.387,35.0 -15:46:39,198.6435,34.283,34.615,96.805,35.0 -15:46:39,198.6877,34.31,34.642,95.389,35.0 -15:46:39,198.7325,34.31,34.615,94.489,35.0 -15:46:39,198.7774,34.31,34.67,94.98,35.0 -15:46:40,198.8244,34.31,34.615,94.062,35.0 -15:46:40,198.8720,34.31,34.642,95.035,35.0 -15:46:40,198.9188,34.31,34.615,94.6,35.0 -15:46:40,198.9640,34.31,34.642,95.092,35.0 -15:46:40,199.0069,34.31,34.615,94.655,35.0 -15:46:40,199.0545,34.31,34.615,95.145,35.0 -15:46:40,199.0994,34.338,34.615,95.175,35.0 -15:46:40,199.1436,34.255,34.642,94.721,35.0 -15:46:40,199.1905,34.393,34.615,95.71,35.0 -15:46:40,199.2384,34.338,34.615,93.831,35.0 -15:46:40,199.2851,34.31,34.642,94.804,35.0 -15:46:40,199.3316,34.338,34.587,94.849,35.0 -15:46:40,199.3760,34.31,34.642,95.341,35.0 -15:46:40,199.4229,34.31,34.615,94.904,35.0 -15:46:40,199.4706,34.338,34.642,95.396,35.0 -15:46:40,199.5160,34.31,34.615,94.48,35.0 -15:46:40,199.5618,34.338,34.642,95.452,35.0 -15:46:40,199.6078,34.338,34.642,94.534,35.0 -15:46:40,199.6546,34.338,34.642,94.562,35.0 -15:46:40,199.6990,34.338,34.642,94.588,35.0 -15:46:40,199.7446,34.338,34.642,94.614,35.0 -15:46:40,199.7916,34.338,34.642,94.641,35.0 -15:46:41,199.8394,34.338,34.642,94.668,35.0 -15:46:41,199.8876,34.365,34.587,94.696,35.0 -15:46:41,199.9318,34.338,34.615,95.206,35.0 -15:46:41,199.9775,34.365,34.642,95.215,35.0 -15:46:41,200.0277,34.365,34.642,94.314,35.0 -15:46:41,200.0780,34.365,34.698,94.343,35.0 -15:46:41,200.1256,34.338,34.67,93.408,35.0 -15:46:41,200.1699,34.338,34.67,94.379,35.0 -15:46:41,200.2117,34.365,34.726,94.404,35.0 -15:46:41,200.2558,34.365,34.67,93.0,35.0 -15:46:41,200.2987,34.393,34.67,93.986,35.0 -15:46:41,200.3424,34.31,34.67,93.528,35.0 -15:46:41,200.3875,34.338,34.698,94.979,35.0 -15:46:41,200.4304,34.338,34.67,94.042,35.0 -15:46:41,200.4721,34.338,34.67,94.548,35.0 -15:46:41,200.5173,34.365,34.642,94.571,35.0 -15:46:41,200.5612,34.338,34.67,94.614,35.0 -15:46:41,200.6071,34.365,34.642,94.622,35.0 -15:46:41,200.6508,34.365,34.67,94.665,35.0 -15:46:41,200.6956,34.365,34.67,94.208,35.0 -15:46:41,200.7395,34.365,34.698,94.233,35.0 -15:46:41,200.7845,34.365,34.67,93.775,35.0 -15:46:42,200.8272,34.365,34.698,94.281,35.0 -15:46:42,200.8709,34.365,34.615,93.823,35.0 -15:46:42,200.9148,34.365,34.67,95.274,35.0 -15:46:42,200.9579,34.421,34.698,94.354,35.0 -15:46:42,201.0028,34.393,34.615,92.933,35.0 -15:46:42,201.0520,34.393,34.698,94.865,35.0 -15:46:42,201.0960,34.393,34.698,93.465,35.0 -15:46:42,201.1370,34.393,34.615,93.488,35.0 -15:46:42,201.1795,34.393,34.698,94.936,35.0 -15:46:42,201.2209,34.338,34.726,93.533,35.0 -15:46:42,201.2628,34.393,34.698,94.019,35.0 -15:46:42,201.3037,34.393,34.67,93.577,35.0 -15:46:42,201.3470,34.393,34.698,94.079,35.0 -15:46:42,201.3889,34.393,34.67,93.621,35.0 -15:46:42,201.4313,34.393,34.698,94.124,35.0 -15:46:42,201.4733,34.393,34.726,93.666,35.0 -15:46:42,201.5176,34.365,34.698,93.206,35.0 -15:46:42,201.5601,34.393,34.698,94.191,35.0 -15:46:42,201.6038,34.393,34.698,93.732,35.0 -15:46:42,201.6461,34.365,34.698,93.755,35.0 -15:46:42,201.6882,34.393,34.698,94.258,35.0 -15:46:42,201.7311,34.421,34.781,93.8,35.0 -15:46:42,201.7737,34.393,34.726,91.913,35.0 -15:46:43,201.8168,34.365,34.642,93.36,35.0 -15:46:43,201.8610,34.393,34.726,95.308,35.0 -15:46:43,201.9042,34.393,34.726,93.406,35.0 -15:46:43,201.9471,34.421,34.753,93.428,35.0 -15:46:43,201.9896,34.393,34.726,92.504,35.0 -15:46:43,202.0329,34.393,34.726,93.47,35.0 -15:46:43,202.0759,34.448,34.726,93.492,35.0 -15:46:43,202.1206,34.365,34.726,92.567,35.0 -15:46:43,202.1632,34.393,34.753,94.016,35.0 -15:46:43,202.2045,34.421,34.698,93.092,35.0 -15:46:43,202.2463,34.476,34.726,93.577,35.0 -15:46:43,202.2894,34.421,34.698,92.17,35.0 -15:46:43,202.3333,34.476,34.753,93.617,35.0 -15:46:43,202.3770,34.421,34.726,91.748,35.0 -15:46:43,202.4223,34.421,34.67,93.177,35.0 -15:46:43,202.4832,34.448,34.726,94.162,35.0 -15:46:43,202.5324,34.421,34.726,92.768,35.0 -15:46:43,202.5756,34.421,34.809,93.253,35.0 -15:46:43,202.6197,34.421,34.726,91.847,35.0 -15:46:43,202.6631,34.421,34.781,93.294,35.0 -15:46:43,202.7062,34.448,34.753,92.369,35.0 -15:46:43,202.7517,34.448,34.781,92.406,35.0 -15:46:43,202.7953,34.448,34.753,91.945,35.0 -15:46:44,202.8371,34.448,34.753,92.446,35.0 -15:46:44,202.8805,34.448,34.753,92.465,35.0 -15:46:44,202.9225,34.448,34.753,92.485,35.0 -15:46:44,202.9658,34.448,34.726,92.504,35.0 -15:46:44,203.0083,34.448,34.753,92.988,35.0 -15:46:44,203.0525,34.476,34.753,92.544,35.0 -15:46:44,203.0955,34.448,34.726,92.082,35.0 -15:46:44,203.1365,34.448,34.753,93.047,35.0 -15:46:44,203.1796,34.421,34.753,92.602,35.0 -15:46:44,203.2207,34.448,34.753,93.086,35.0 -15:46:44,203.2633,34.448,34.753,92.641,35.0 -15:46:44,203.3058,34.421,34.781,92.661,35.0 -15:46:44,203.3493,34.448,34.781,92.663,35.0 -15:46:44,203.3908,34.421,34.781,92.218,35.0 -15:46:44,203.4357,34.448,34.753,92.701,35.0 -15:46:44,203.4795,34.448,34.781,92.739,35.0 -15:46:44,203.5215,34.448,34.781,92.277,35.0 -15:46:44,203.5636,34.448,34.837,92.296,35.0 -15:46:44,203.6050,34.448,34.781,91.351,35.0 -15:46:44,203.6467,34.476,34.781,92.331,35.0 -15:46:44,203.6897,34.476,34.726,91.868,35.0 -15:46:44,203.7337,34.476,34.753,92.832,35.0 -15:46:44,203.7780,34.476,34.809,92.388,35.0 -15:46:45,203.8236,34.448,34.781,91.444,35.0 -15:46:45,203.8686,34.476,34.781,92.426,35.0 -15:46:45,203.9115,34.504,34.781,91.964,35.0 -15:46:45,203.9555,34.504,34.781,91.501,35.0 -15:46:45,203.9998,34.476,34.781,91.519,35.0 -15:46:45,204.0437,34.476,34.781,92.018,35.0 -15:46:45,204.0885,34.504,34.809,92.037,35.0 -15:46:45,204.1332,34.504,34.781,91.093,35.0 -15:46:45,204.1766,34.476,34.809,91.592,35.0 -15:46:45,204.2201,34.504,34.809,91.61,35.0 -15:46:45,204.2628,34.504,34.837,91.146,35.0 -15:46:45,204.3062,34.504,34.809,90.681,35.0 -15:46:45,204.3513,34.476,34.809,91.179,35.0 -15:46:45,204.3946,34.531,34.809,91.678,35.0 -15:46:45,204.4412,34.504,34.809,90.75,35.0 -15:46:45,204.4871,34.504,34.781,91.232,35.0 -15:46:45,204.5317,34.504,34.809,91.732,35.0 -15:46:45,204.6081,34.476,34.781,91.268,35.0 -15:46:45,204.6590,34.504,34.809,92.263,35.0 -15:46:45,204.7063,34.504,34.809,91.321,35.0 -15:46:45,204.7534,34.476,34.809,91.339,35.0 -15:46:45,204.7992,34.531,34.809,91.839,35.0 -15:46:46,204.8446,34.504,34.809,90.912,35.0 -15:46:46,204.8922,34.531,34.809,91.394,35.0 -15:46:46,204.9380,34.504,34.809,90.948,35.0 -15:46:46,204.9833,34.531,34.809,91.43,35.0 -15:46:46,205.0306,34.504,34.809,90.983,35.0 -15:46:46,205.0787,34.531,34.809,91.465,35.0 -15:46:46,205.1204,34.531,34.809,91.02,35.0 -15:46:46,205.1635,34.504,34.837,91.035,35.0 -15:46:46,205.2062,34.504,34.809,91.035,35.0 -15:46:46,205.2492,34.531,34.837,91.532,35.0 -15:46:46,205.2932,34.504,34.865,90.603,35.0 -15:46:46,205.3382,34.504,34.865,90.602,35.0 -15:46:46,205.3803,34.531,34.837,90.618,35.0 -15:46:46,205.4225,34.531,34.837,90.65,35.0 -15:46:46,205.4680,34.476,34.837,90.666,35.0 -15:46:46,205.5115,34.531,34.837,91.628,35.0 -15:46:46,205.5527,34.531,34.837,90.699,35.0 -15:46:46,205.5960,34.559,34.809,90.714,35.0 -15:46:46,205.6392,34.504,34.837,90.73,35.0 -15:46:46,205.6811,34.559,34.865,91.209,35.0 -15:46:46,205.7260,34.531,34.837,89.798,35.0 -15:46:46,205.7709,34.504,34.837,90.776,35.0 -15:46:47,205.8164,34.531,34.809,91.256,35.0 -15:46:47,205.8603,34.531,34.865,91.291,35.0 -15:46:47,205.9050,34.531,34.865,90.344,35.0 -15:46:47,205.9467,34.559,34.865,90.36,35.0 -15:46:47,205.9883,34.531,34.837,89.892,35.0 -15:46:47,206.0317,34.559,34.865,90.869,35.0 -15:46:47,206.0755,34.531,34.837,89.922,35.0 -15:46:47,206.1192,34.531,34.837,90.899,35.0 -15:46:47,206.1626,34.504,34.809,90.915,35.0 -15:46:47,206.2041,34.531,34.865,91.877,35.0 -15:46:47,206.2462,34.531,34.865,90.466,35.0 -15:46:47,206.2879,34.531,34.865,90.48,35.0 -15:46:47,206.3310,34.531,34.892,90.494,35.0 -15:46:47,206.3740,34.531,34.892,90.045,35.0 -15:46:47,206.4185,34.531,34.865,90.059,35.0 -15:46:47,206.4607,34.559,34.865,90.538,35.0 -15:46:47,206.5065,34.559,34.865,90.071,35.0 -15:46:47,206.5498,34.587,34.865,90.086,35.0 -15:46:47,206.5941,34.559,34.865,89.619,35.0 -15:46:47,206.6386,34.531,34.837,90.115,35.0 -15:46:47,206.6824,34.559,34.892,91.092,35.0 -15:46:47,206.7267,34.531,34.892,89.681,35.0 -15:46:47,206.7704,34.559,34.865,90.176,35.0 -15:46:48,206.8140,34.559,34.892,90.173,35.0 -15:46:48,206.8607,34.587,34.892,89.723,35.0 -15:46:48,206.9073,34.559,34.809,89.256,35.0 -15:46:48,206.9516,34.642,34.892,91.179,35.0 -15:46:48,206.9942,34.559,34.865,88.34,35.0 -15:46:48,207.0369,34.587,34.892,90.243,35.0 -15:46:48,207.0817,34.559,34.865,89.312,35.0 -15:46:48,207.1258,34.587,34.892,90.271,35.0 -15:46:48,207.1723,34.587,34.892,89.339,35.0 -15:46:48,207.2199,34.587,34.892,89.353,35.0 -15:46:48,207.2645,34.587,34.892,89.367,35.0 -15:46:48,207.3111,34.587,34.892,89.381,35.0 -15:46:48,207.3571,34.559,34.892,89.395,35.0 -15:46:48,207.4043,34.587,34.892,89.89,35.0 -15:46:48,207.4521,34.587,34.892,89.423,35.0 -15:46:48,207.4968,34.587,34.892,89.437,35.0 -15:46:48,207.5413,34.587,34.865,89.451,35.0 -15:46:48,207.5886,34.476,34.92,89.928,35.0 -15:46:48,207.6360,34.615,34.92,90.906,35.0 -15:46:48,207.6816,34.587,34.92,88.532,35.0 -15:46:48,207.7276,34.587,34.92,89.025,35.0 -15:46:48,207.7707,34.587,34.892,89.038,35.0 -15:46:49,207.8180,34.587,34.92,89.532,35.0 -15:46:49,207.8635,34.615,34.92,89.065,35.0 -15:46:49,207.9107,34.615,34.92,88.596,35.0 -15:46:49,207.9564,34.615,34.92,88.608,35.0 -15:46:49,208.0027,34.615,34.92,88.621,35.0 -15:46:49,208.0473,34.615,34.92,88.633,35.0 -15:46:49,208.0919,34.587,34.92,88.645,35.0 -15:46:49,208.1377,34.587,34.92,89.138,35.0 -15:46:49,208.1817,34.615,34.92,89.151,35.0 -15:46:49,208.2248,34.615,34.92,88.682,35.0 -15:46:49,208.2691,34.642,34.92,88.693,35.0 -15:46:49,208.3124,34.615,34.976,88.241,35.0 -15:46:49,208.3551,34.587,34.948,87.753,35.0 -15:46:49,208.3995,34.642,34.948,88.726,35.0 -15:46:49,208.4425,34.615,34.948,87.792,35.0 -15:46:49,208.4877,34.642,34.92,88.266,35.0 -15:46:49,208.5334,34.642,34.92,88.294,35.0 -15:46:49,208.5761,34.67,34.948,88.306,35.0 -15:46:49,208.6215,34.642,34.948,87.354,35.0 -15:46:49,208.6690,34.642,34.948,87.845,35.0 -15:46:49,208.7126,34.615,34.948,87.856,35.0 -15:46:49,208.7547,34.615,34.948,88.331,35.0 -15:46:49,208.7971,34.67,34.948,88.341,35.0 -15:46:50,208.8395,34.587,34.948,87.406,35.0 -15:46:50,208.8842,34.615,34.948,88.843,35.0 -15:46:50,208.9268,34.615,34.948,88.373,35.0 -15:46:50,208.9725,34.642,34.892,88.384,35.0 -15:46:50,209.0180,34.642,34.948,88.894,35.0 -15:46:50,209.0692,34.642,34.948,87.943,35.0 -15:46:50,209.1116,34.642,34.948,87.955,35.0 -15:46:50,209.1540,34.642,34.976,87.965,35.0 -15:46:50,209.1963,34.642,34.948,87.493,35.0 -15:46:50,209.2392,34.587,34.948,87.984,35.0 -15:46:50,209.2847,34.642,34.948,88.94,35.0 -15:46:50,209.3303,34.698,34.948,88.006,35.0 -15:46:50,209.3760,34.67,34.976,87.053,35.0 -15:46:50,209.4236,34.642,34.948,87.063,35.0 -15:46:50,209.4725,34.615,34.976,88.035,35.0 -15:46:50,209.5202,34.642,34.976,88.03,35.0 -15:46:50,209.5680,34.615,34.976,87.576,35.0 -15:46:50,209.6135,34.642,34.948,88.051,35.0 -15:46:50,209.6593,34.587,34.948,88.079,35.0 -15:46:50,209.7065,34.67,34.948,89.036,35.0 -15:46:50,209.7531,34.642,34.976,87.621,35.0 -15:46:50,209.7996,34.67,34.976,87.631,35.0 -15:46:51,209.8458,34.67,34.976,87.16,35.0 -15:46:51,209.8919,34.67,34.976,87.169,35.0 -15:46:51,209.9387,34.642,34.92,87.178,35.0 -15:46:51,209.9867,34.67,34.976,88.632,35.0 -15:46:51,210.0327,34.67,34.948,87.2,35.0 -15:46:51,210.0784,34.67,35.004,87.69,35.0 -15:46:51,210.1266,34.67,34.976,86.737,35.0 -15:46:51,210.1821,34.642,34.976,87.228,35.0 -15:46:51,210.2439,34.67,34.976,87.721,35.0 -15:46:51,210.2873,34.67,34.976,87.252,35.0 -15:46:51,210.3300,34.698,34.976,87.261,35.0 -15:46:51,210.3748,34.698,34.976,86.788,35.0 -15:46:51,210.4211,34.642,35.004,86.797,35.0 -15:46:51,210.4757,34.642,34.976,87.287,35.0 -15:46:51,210.5483,34.642,35.004,87.781,35.0 -15:46:51,210.6145,34.67,35.004,87.314,35.0 -15:46:51,210.6698,34.67,34.976,86.845,35.0 -15:46:51,210.7368,34.698,35.032,87.338,35.0 -15:46:51,210.7937,34.698,35.032,85.906,35.0 -15:46:52,210.8484,34.698,34.976,85.914,35.0 -15:46:52,210.9118,34.698,35.004,86.886,35.0 -15:46:52,210.9670,34.726,35.004,86.416,35.0 -15:46:52,211.0249,34.698,34.976,85.944,35.0 -15:46:52,211.0842,34.67,35.004,86.916,35.0 -15:46:52,211.1388,34.698,34.92,86.927,35.0 -15:46:52,211.1937,34.726,35.004,87.901,35.0 -15:46:52,211.2485,34.698,35.004,85.986,35.0 -15:46:52,211.2986,34.698,34.976,86.476,35.0 -15:46:52,211.3505,34.698,35.032,86.966,35.0 -15:46:52,211.4027,34.726,35.032,86.012,35.0 -15:46:52,211.4557,34.726,35.032,85.539,35.0 -15:46:52,211.5075,34.726,35.032,85.546,35.0 -15:46:52,211.5617,34.726,35.032,85.553,35.0 -15:46:52,211.6058,34.698,35.059,85.561,35.0 -15:46:52,211.6540,34.726,35.032,85.584,35.0 -15:46:52,211.7005,34.698,35.032,85.573,35.0 -15:46:52,211.7566,34.698,34.92,86.061,35.0 -15:46:53,211.8117,34.726,35.004,87.997,35.0 -15:46:53,211.8723,34.726,35.032,86.082,35.0 -15:46:53,211.9192,34.726,35.032,85.61,35.0 -15:46:53,211.9631,34.726,35.032,85.616,35.0 -15:46:53,212.0069,34.698,35.032,85.622,35.0 -15:46:53,212.0517,34.698,35.032,86.11,35.0 -15:46:53,212.0942,34.726,34.976,86.117,35.0 -15:46:53,212.1377,34.726,35.032,86.605,35.0 -15:46:53,212.1823,34.753,35.059,85.649,35.0 -15:46:53,212.2266,34.615,35.059,84.727,35.0 -15:46:53,212.2693,34.726,35.032,87.105,35.0 -15:46:53,212.3137,34.726,35.032,85.668,35.0 -15:46:53,212.3588,34.726,35.059,85.674,35.0 -15:46:53,212.4053,34.753,35.087,85.216,35.0 -15:46:53,212.4539,34.753,35.059,84.276,35.0 -15:46:53,212.4994,34.726,35.059,84.762,35.0 -15:46:53,212.5532,34.726,35.059,85.231,35.0 -15:46:53,212.6003,34.726,35.059,85.238,35.0 -15:46:53,212.6457,34.726,35.059,85.244,35.0 -15:46:53,212.6896,34.753,35.115,85.249,35.0 -15:46:53,212.7386,34.753,35.059,83.827,35.0 -15:46:53,212.7852,34.726,35.059,84.794,35.0 -15:46:54,212.8403,34.753,35.087,85.263,35.0 -15:46:54,212.8904,34.753,35.059,84.324,35.0 -15:46:54,212.9382,34.753,35.059,84.81,35.0 -15:46:54,212.9862,34.781,35.087,84.815,35.0 -15:46:54,213.0325,34.753,35.059,83.857,35.0 -15:46:54,213.0790,34.726,35.059,84.824,35.0 -15:46:54,213.1248,34.698,35.059,85.293,35.0 -15:46:54,213.1736,34.753,35.059,85.781,35.0 -15:46:54,213.2228,34.726,35.087,84.841,35.0 -15:46:54,213.2694,34.809,35.032,84.829,35.0 -15:46:54,213.3154,34.781,35.059,84.353,35.0 -15:46:54,213.3595,34.726,35.059,84.374,35.0 -15:46:54,213.4014,34.753,35.059,85.324,35.0 -15:46:54,213.4463,34.753,35.087,84.865,35.0 -15:46:54,213.4894,34.753,35.087,84.388,35.0 -15:46:54,213.5345,34.726,35.087,84.392,35.0 -15:46:54,213.5777,34.726,35.059,84.861,35.0 -15:46:54,213.6208,34.726,35.059,85.347,35.0 -15:46:54,213.6649,34.781,35.115,85.352,35.0 -15:46:54,213.7081,34.698,35.059,83.448,35.0 -15:46:54,213.7544,34.781,35.059,85.841,35.0 -15:46:54,213.7997,34.809,35.087,84.42,35.0 -15:46:55,213.8437,34.781,35.087,83.461,35.0 -15:46:55,213.8876,34.753,35.087,83.946,35.0 -15:46:55,213.9317,34.781,35.087,84.43,35.0 -15:46:55,213.9741,34.781,35.087,83.953,35.0 -15:46:55,214.0201,34.781,35.087,83.956,35.0 -15:46:55,214.0675,34.809,35.059,83.96,35.0 -15:46:55,214.1117,34.753,35.087,83.963,35.0 -15:46:55,214.1547,34.781,35.087,84.448,35.0 -15:46:55,214.1995,34.781,35.087,83.97,35.0 -15:46:55,214.2427,34.781,35.171,83.974,35.0 -15:46:55,214.2888,34.781,35.087,82.533,35.0 -15:46:55,214.3331,34.781,35.143,83.978,35.0 -15:46:55,214.3847,34.809,35.115,83.019,35.0 -15:46:55,214.4281,34.781,35.115,83.021,35.0 -15:46:55,214.4705,34.698,35.087,83.504,35.0 -15:46:55,214.5163,34.781,35.115,85.416,35.0 -15:46:55,214.5598,34.781,35.115,83.512,35.0 -15:46:55,214.6022,34.809,35.087,83.515,35.0 -15:46:55,214.6454,34.809,35.115,83.517,35.0 -15:46:55,214.6905,34.781,35.115,83.038,35.0 -15:46:55,214.7366,34.781,35.087,83.522,35.0 -15:46:55,214.7811,34.781,35.115,84.006,35.0 -15:46:56,214.8243,34.781,35.227,83.528,35.0 -15:46:56,214.8720,34.865,35.115,81.605,35.0 -15:46:56,214.9177,34.781,35.115,82.086,35.0 -15:46:56,214.9689,34.781,35.115,83.531,35.0 -15:46:56,215.0140,34.781,35.115,83.534,35.0 -15:46:56,215.0699,34.809,35.115,83.537,35.0 -15:46:56,215.1173,34.753,35.115,83.059,35.0 -15:46:56,215.1625,34.837,35.143,84.024,35.0 -15:46:56,215.2084,34.809,35.115,82.101,35.0 -15:46:56,215.2532,34.809,35.143,83.065,35.0 -15:46:56,215.3008,34.809,35.115,82.585,35.0 -15:46:56,215.3478,34.781,35.115,83.068,35.0 -15:46:56,215.3938,34.809,35.143,83.552,35.0 -15:46:56,215.4423,34.809,35.143,82.591,35.0 -15:46:56,215.4867,34.865,35.115,82.592,35.0 -15:46:56,215.5351,34.781,35.143,82.112,35.0 -15:46:56,215.5818,34.809,35.143,83.076,35.0 -15:46:56,215.6283,34.809,35.143,82.596,35.0 -15:46:56,215.6755,34.809,35.087,82.598,35.0 -15:46:56,215.7212,34.809,35.143,83.562,35.0 -15:46:56,215.7694,34.892,35.143,82.602,35.0 -15:46:57,215.8165,34.809,35.143,81.175,35.0 -15:46:57,215.8617,34.809,35.143,82.602,35.0 -15:46:57,215.9079,34.837,35.143,82.603,35.0 -15:46:57,215.9608,34.781,35.115,82.123,35.0 -15:46:57,216.0037,34.809,35.143,83.569,35.0 -15:46:57,216.0486,34.892,35.171,82.608,35.0 -15:46:57,216.0920,34.837,35.143,80.7,35.0 -15:46:57,216.1351,34.837,35.199,82.126,35.0 -15:46:57,216.1793,34.837,35.087,81.164,35.0 -15:46:57,216.2239,34.809,35.171,83.089,35.0 -15:46:57,216.2690,34.837,35.171,82.128,35.0 -15:46:57,216.3117,34.809,35.171,81.647,35.0 -15:46:57,216.3546,34.837,35.171,82.128,35.0 -15:46:57,216.3992,34.837,35.171,81.647,35.0 -15:46:57,216.4429,34.837,35.143,81.647,35.0 -15:46:57,216.4861,34.865,35.171,82.128,35.0 -15:46:57,216.5296,34.837,35.171,81.166,35.0 -15:46:57,216.5736,34.865,35.171,81.646,35.0 -15:46:57,216.6194,34.837,35.143,81.164,35.0 -15:46:57,216.6637,34.837,35.171,82.127,35.0 -15:46:57,216.7078,34.892,35.171,81.646,35.0 -15:46:57,216.7532,34.865,35.171,80.699,35.0 -15:46:57,216.7983,34.809,35.143,81.162,35.0 -15:46:58,216.8426,34.865,35.171,82.606,35.0 -15:46:58,216.8861,34.92,35.199,81.163,35.0 -15:46:58,216.9319,34.865,35.171,79.734,35.0 -15:46:58,216.9753,34.892,35.143,81.159,35.0 -15:46:58,217.0178,34.92,35.171,81.175,35.0 -15:46:58,217.0632,34.865,35.171,80.211,35.0 -15:46:58,217.1074,34.892,35.199,81.155,35.0 -15:46:58,217.1515,34.865,35.199,80.208,35.0 -15:46:58,217.1942,34.837,35.171,80.67,35.0 -15:46:58,217.2374,34.865,35.227,81.631,35.0 -15:46:58,217.2815,34.865,35.199,80.187,35.0 -15:46:58,217.3254,34.865,35.199,80.666,35.0 -15:46:58,217.3683,34.865,35.171,80.664,35.0 -15:46:58,217.4102,34.865,35.171,81.144,35.0 -15:46:58,217.4536,34.892,35.199,81.143,35.0 -15:46:58,217.4976,34.892,35.171,80.197,35.0 -15:46:58,217.5414,34.865,35.199,80.676,35.0 -15:46:58,217.5862,34.865,35.199,80.657,35.0 -15:46:58,217.6329,34.837,35.199,80.655,35.0 -15:46:58,217.6757,34.865,35.199,81.135,35.0 -15:46:58,217.7175,34.865,35.199,80.653,35.0 -15:46:58,217.7608,34.865,35.171,80.651,35.0 -15:46:58,217.8026,34.865,35.199,81.131,35.0 -15:46:59,217.8463,34.865,35.199,80.649,35.0 -15:46:59,217.8893,34.865,35.199,80.647,35.0 -15:46:59,217.9345,34.892,35.199,80.646,35.0 -15:46:59,217.9772,34.865,35.199,80.18,35.0 -15:46:59,218.0207,34.865,35.199,80.642,35.0 -15:46:59,218.0655,34.892,35.199,80.64,35.0 -15:46:59,218.1091,34.809,35.199,80.174,35.0 -15:46:59,218.1524,34.892,35.227,81.599,35.0 -15:46:59,218.1948,34.892,35.199,79.69,35.0 -15:46:59,218.2370,34.892,35.227,80.169,35.0 -15:46:59,218.2819,34.837,35.199,79.685,35.0 -15:46:59,218.3249,34.865,35.227,81.11,35.0 -15:46:59,218.3677,34.892,35.227,80.146,35.0 -15:46:59,218.4095,34.892,35.171,79.679,35.0 -15:46:59,218.4537,34.892,35.227,80.639,35.0 -15:46:59,218.4982,34.865,35.255,79.675,35.0 -15:46:59,218.5445,34.892,35.199,79.654,35.0 -15:46:59,218.5871,34.892,35.199,80.15,35.0 -15:46:59,218.6390,34.865,35.255,80.148,35.0 -15:46:59,218.6846,34.892,35.255,79.646,35.0 -15:46:59,218.7284,34.948,35.199,79.179,35.0 -15:46:59,218.7722,34.892,35.283,79.175,35.0 -15:47:00,218.8188,34.892,35.227,78.69,35.0 -15:47:00,218.8652,34.892,35.199,79.648,35.0 -15:47:00,218.9181,34.892,35.199,80.127,35.0 -15:47:00,218.9644,34.865,35.227,80.124,35.0 -15:47:00,219.0080,34.865,35.227,80.104,35.0 -15:47:00,219.0518,34.892,35.227,80.102,35.0 -15:47:00,219.0945,34.892,35.199,79.636,35.0 -15:47:00,219.1367,34.892,35.227,80.114,35.0 -15:47:00,219.1817,34.892,35.255,79.63,35.0 -15:47:00,219.2253,34.892,35.227,79.146,35.0 -15:47:00,219.2692,34.92,35.227,79.624,35.0 -15:47:00,219.3145,34.92,35.227,79.139,35.0 -15:47:00,219.3586,34.92,35.255,79.135,35.0 -15:47:00,219.4010,34.92,35.227,78.65,35.0 -15:47:00,219.4445,34.92,35.199,79.127,35.0 -15:47:00,219.4885,34.92,35.255,79.605,35.0 -15:47:00,219.5348,34.92,35.227,78.639,35.0 -15:47:00,219.5785,34.892,35.255,79.116,35.0 -15:47:00,219.6215,34.92,35.255,79.112,35.0 -15:47:00,219.6671,34.948,35.227,78.627,35.0 -15:47:00,219.7102,34.92,35.255,78.623,35.0 -15:47:00,219.7536,34.892,35.255,78.619,35.0 -15:47:00,219.7985,34.92,35.255,79.096,35.0 -15:47:01,219.8427,34.892,35.283,78.61,35.0 -15:47:01,219.8868,34.892,35.255,78.606,35.0 -15:47:01,219.9328,34.92,35.199,79.083,35.0 -15:47:01,219.9756,34.92,35.311,79.561,35.0 -15:47:01,220.0208,34.92,35.283,77.632,35.0 -15:47:01,220.0663,34.92,35.283,78.107,35.0 -15:47:01,220.1195,34.92,35.255,78.102,35.0 -15:47:01,220.1651,34.92,35.283,78.578,35.0 -15:47:01,220.2088,34.92,35.255,78.092,35.0 -15:47:01,220.2512,34.976,35.283,78.568,35.0 -15:47:01,220.2968,34.92,35.227,77.119,35.0 -15:47:01,220.3413,35.004,35.283,79.039,35.0 -15:47:01,220.3851,34.92,35.283,76.627,35.0 -15:47:01,220.4282,34.92,35.255,78.065,35.0 -15:47:01,220.4717,34.948,35.283,78.541,35.0 -15:47:01,220.5167,34.948,35.283,77.574,35.0 -15:47:01,220.5596,34.948,35.311,77.568,35.0 -15:47:01,220.6035,34.92,35.255,77.081,35.0 -15:47:01,220.6497,34.948,35.283,78.519,35.0 -15:47:01,220.6986,34.948,35.283,77.551,35.0 -15:47:01,220.7418,34.92,35.283,77.545,35.0 -15:47:01,220.7854,34.948,35.283,78.02,35.0 -15:47:02,220.8331,34.976,35.283,77.534,35.0 -15:47:02,220.8782,34.976,35.199,77.046,35.0 -15:47:02,220.9214,34.92,35.339,78.484,35.0 -15:47:02,220.9687,34.92,35.283,77.035,35.0 -15:47:02,221.0121,34.948,35.283,77.991,35.0 -15:47:02,221.0646,35.004,35.311,77.505,35.0 -15:47:02,221.1100,34.976,35.311,76.052,35.0 -15:47:02,221.1537,34.92,35.283,76.526,35.0 -15:47:02,221.1987,34.976,35.283,77.964,35.0 -15:47:02,221.2421,34.976,35.283,76.995,35.0 -15:47:02,221.2856,34.976,35.311,76.989,35.0 -15:47:02,221.3315,34.948,35.283,76.501,35.0 -15:47:02,221.3755,34.948,35.311,77.456,35.0 -15:47:02,221.4188,34.948,35.339,76.969,35.0 -15:47:02,221.4631,34.948,35.311,76.481,35.0 -15:47:02,221.5075,34.92,35.255,76.955,35.0 -15:47:02,221.5510,34.976,35.311,78.393,35.0 -15:47:02,221.5945,34.976,35.283,76.463,35.0 -15:47:02,221.6383,34.976,35.283,76.937,35.0 -15:47:02,221.6837,34.976,35.311,76.931,35.0 -15:47:02,221.7291,35.004,35.283,76.443,35.0 -15:47:02,221.7739,34.976,35.311,76.435,35.0 -15:47:03,221.8188,34.948,35.311,76.428,35.0 -15:47:03,221.8631,34.976,35.311,76.902,35.0 -15:47:03,221.9069,34.976,35.311,76.414,35.0 -15:47:03,221.9528,34.976,35.311,76.407,35.0 -15:47:03,221.9986,35.004,35.339,76.399,35.0 -15:47:03,222.0415,34.976,35.339,75.429,35.0 -15:47:03,222.0837,34.948,35.339,75.902,35.0 -15:47:03,222.1257,35.004,35.339,76.376,35.0 -15:47:03,222.1685,34.976,35.367,75.406,35.0 -15:47:03,222.2147,35.004,35.339,75.397,35.0 -15:47:03,222.2587,34.976,35.339,75.388,35.0 -15:47:03,222.3106,34.948,35.339,75.861,35.0 -15:47:03,222.3545,34.976,35.367,76.334,35.0 -15:47:03,222.3994,34.976,35.367,75.363,35.0 -15:47:03,222.4418,35.004,35.283,75.355,35.0 -15:47:03,222.4847,34.976,35.339,76.309,35.0 -15:47:03,222.5298,34.976,35.339,75.821,35.0 -15:47:03,222.5746,34.976,35.339,75.813,35.0 -15:47:03,222.6180,34.976,35.311,75.804,35.0 -15:47:03,222.6628,35.004,35.339,76.278,35.0 -15:47:03,222.7059,35.004,35.339,75.308,35.0 -15:47:03,222.7522,35.004,35.311,75.299,35.0 -15:47:03,222.7988,34.976,35.339,75.772,35.0 -15:47:04,222.8419,35.004,35.339,75.764,35.0 -15:47:04,222.8863,34.976,35.339,75.274,35.0 -15:47:04,222.9308,35.004,35.367,75.747,35.0 -15:47:04,222.9744,35.032,35.339,74.776,35.0 -15:47:04,223.0164,35.004,35.339,74.767,35.0 -15:47:04,223.0618,35.004,35.367,75.239,35.0 -15:47:04,223.1047,34.948,35.367,74.749,35.0 -15:47:04,223.1499,34.976,35.367,75.703,35.0 -15:47:04,223.1931,35.004,35.367,75.213,35.0 -15:47:04,223.2358,35.004,35.367,74.723,35.0 -15:47:04,223.2819,35.004,35.339,74.714,35.0 -15:47:04,223.3246,35.004,35.339,75.186,35.0 -15:47:04,223.3673,35.004,35.367,75.178,35.0 -15:47:04,223.4111,35.032,35.367,74.688,35.0 -15:47:04,223.4557,35.004,35.367,74.197,35.0 -15:47:04,223.5016,35.004,35.395,74.668,35.0 -15:47:04,223.5494,35.004,35.395,74.177,35.0 -15:47:04,223.5939,35.004,35.367,74.166,35.0 -15:47:04,223.6447,35.004,35.367,74.638,35.0 -15:47:04,223.6899,35.004,35.367,74.627,35.0 -15:47:04,223.7355,35.032,35.339,74.617,35.0 -15:47:04,223.7815,35.032,35.367,74.607,35.0 -15:47:05,223.8247,34.976,35.367,74.116,35.0 -15:47:05,223.8679,35.032,35.339,75.069,35.0 -15:47:05,223.9123,35.032,35.367,74.579,35.0 -15:47:05,223.9563,35.032,35.367,74.088,35.0 -15:47:05,224.0017,35.004,35.367,74.078,35.0 -15:47:05,224.0468,34.976,35.367,74.55,35.0 -15:47:05,224.0935,35.032,35.339,75.022,35.0 -15:47:05,224.1407,35.004,35.395,74.531,35.0 -15:47:05,224.1859,35.032,35.367,74.039,35.0 -15:47:05,224.2326,34.976,35.395,74.029,35.0 -15:47:05,224.2774,35.032,35.367,74.5,35.0 -15:47:05,224.3245,35.059,35.395,74.009,35.0 -15:47:05,224.3714,35.032,35.367,73.052,35.0 -15:47:05,224.4180,35.032,35.367,73.986,35.0 -15:47:05,224.4628,35.032,35.423,73.975,35.0 -15:47:05,224.5075,35.032,35.367,73.002,35.0 -15:47:05,224.5493,35.032,35.395,73.954,35.0 -15:47:05,224.6036,35.032,35.367,73.463,35.0 -15:47:05,224.6501,34.976,35.395,73.931,35.0 -15:47:05,224.6966,35.004,35.395,74.402,35.0 -15:47:05,224.7397,35.059,35.395,73.91,35.0 -15:47:05,224.7822,35.004,35.395,72.955,35.0 -15:47:06,224.8253,35.032,35.367,73.89,35.0 -15:47:06,224.8687,35.032,35.423,73.88,35.0 -15:47:06,224.9139,35.059,35.395,72.907,35.0 -15:47:06,224.9573,35.032,35.395,72.912,35.0 -15:47:06,225.0006,35.115,35.451,73.365,35.0 -15:47:06,225.0500,35.032,35.423,70.964,35.0 -15:47:06,225.0969,35.059,35.423,72.858,35.0 -15:47:06,225.1492,35.059,35.395,72.381,35.0 -15:47:06,225.2036,35.032,35.395,72.848,35.0 -15:47:06,225.2575,35.004,35.367,73.299,35.0 -15:47:06,225.3011,35.032,35.395,74.249,35.0 -15:47:06,225.3482,35.059,35.423,73.277,35.0 -15:47:06,225.3914,35.171,35.395,72.319,35.0 -15:47:06,225.4360,35.032,35.395,70.863,35.0 -15:47:06,225.4878,35.032,35.367,73.239,35.0 -15:47:06,225.5557,35.059,35.395,73.707,35.0 -15:47:06,225.6250,35.032,35.395,72.744,35.0 -15:47:06,225.6844,35.059,35.395,73.192,35.0 -15:47:06,225.7398,35.059,35.339,72.713,35.0 -15:47:06,225.7936,35.004,35.423,73.662,35.0 -15:47:07,225.8512,35.087,35.395,73.151,35.0 -15:47:07,225.9068,35.059,35.395,72.191,35.0 -15:47:07,225.9624,35.059,35.395,72.657,35.0 -15:47:07,226.0150,35.087,35.423,72.643,35.0 -15:47:07,226.0656,35.087,35.367,71.666,35.0 -15:47:07,226.1200,35.059,35.423,72.614,35.0 -15:47:07,226.1770,35.059,35.423,72.118,35.0 -15:47:07,226.2349,35.087,35.423,72.103,35.0 -15:47:07,226.2934,35.087,35.395,71.605,35.0 -15:47:07,226.3474,35.059,35.423,72.07,35.0 -15:47:07,226.4019,35.087,35.395,72.055,35.0 -15:47:07,226.4534,35.087,35.423,72.04,35.0 -15:47:07,226.5061,35.115,35.451,71.544,35.0 -15:47:07,226.5543,35.087,35.395,70.566,35.0 -15:47:07,226.6024,35.059,35.451,71.995,35.0 -15:47:07,226.6494,35.059,35.395,71.5,35.0 -15:47:07,226.6955,35.087,35.423,72.45,35.0 -15:47:07,226.7403,35.115,35.423,71.475,35.0 -15:47:07,226.7845,35.059,35.451,70.98,35.0 -15:47:08,226.8307,35.087,35.395,71.448,35.0 -15:47:08,226.8933,35.115,35.423,71.916,35.0 -15:47:08,226.9392,35.087,35.451,70.935,35.0 -15:47:08,226.9845,35.115,35.423,70.921,35.0 -15:47:08,227.0307,35.115,35.479,70.907,35.0 -15:47:08,227.0765,35.087,35.423,69.93,35.0 -15:47:08,227.1212,35.087,35.451,71.359,35.0 -15:47:08,227.1756,35.171,35.423,70.865,35.0 -15:47:08,227.2222,35.087,35.423,69.884,35.0 -15:47:08,227.2659,35.087,35.423,71.313,35.0 -15:47:08,227.3107,35.143,35.451,71.301,35.0 -15:47:08,227.3567,35.032,35.423,69.843,35.0 -15:47:08,227.4017,35.115,35.423,72.218,35.0 -15:47:08,227.4472,35.087,35.479,70.779,35.0 -15:47:08,227.4918,35.115,35.423,70.283,35.0 -15:47:08,227.5383,35.087,35.451,70.75,35.0 -15:47:08,227.5845,35.087,35.451,70.736,35.0 -15:47:08,227.6311,35.115,35.451,70.722,35.0 -15:47:08,227.6748,35.115,35.451,70.226,35.0 -15:47:08,227.7192,35.087,35.451,70.212,35.0 -15:47:08,227.7655,35.087,35.395,70.679,35.0 -15:47:09,227.8116,35.087,35.395,71.628,35.0 -15:47:09,227.8565,35.087,35.479,71.615,35.0 -15:47:09,227.9025,35.087,35.451,70.158,35.0 -15:47:09,227.9485,35.087,35.479,70.625,35.0 -15:47:09,227.9952,35.087,35.451,70.129,35.0 -15:47:09,228.0407,35.087,35.451,70.596,35.0 -15:47:09,228.0853,35.115,35.479,70.582,35.0 -15:47:09,228.1315,35.087,35.479,69.605,35.0 -15:47:09,228.1747,35.115,35.451,70.071,35.0 -15:47:09,228.2204,35.115,35.451,70.057,35.0 -15:47:09,228.2657,35.087,35.451,70.042,35.0 -15:47:09,228.3105,35.115,35.451,70.509,35.0 -15:47:09,228.3551,35.115,35.451,70.014,35.0 -15:47:09,228.4015,35.115,35.451,69.999,35.0 -15:47:09,228.4478,35.199,35.479,69.984,35.0 -15:47:09,228.4934,35.087,35.395,68.043,35.0 -15:47:09,228.5371,35.115,35.479,71.396,35.0 -15:47:09,228.5837,35.115,35.507,69.458,35.0 -15:47:09,228.6317,35.087,35.479,68.961,35.0 -15:47:09,228.6782,35.115,35.423,69.907,35.0 -15:47:09,228.7317,35.115,35.479,70.373,35.0 -15:47:09,228.7760,35.115,35.507,69.393,35.0 -15:47:10,228.8206,35.115,35.479,68.897,35.0 -15:47:10,228.8655,35.115,35.451,69.363,35.0 -15:47:10,228.9121,35.115,35.451,69.829,35.0 -15:47:10,228.9558,35.143,35.423,69.814,35.0 -15:47:10,228.9982,35.087,35.479,69.8,35.0 -15:47:10,229.0419,35.115,35.479,69.786,35.0 -15:47:10,229.0908,35.087,35.479,69.29,35.0 -15:47:10,229.1356,35.171,35.479,69.755,35.0 -15:47:10,229.1811,35.115,35.479,68.296,35.0 -15:47:10,229.2246,35.115,35.479,69.243,35.0 -15:47:10,229.2673,35.143,35.479,69.228,35.0 -15:47:10,229.3137,35.087,35.479,68.732,35.0 -15:47:10,229.3582,35.115,35.479,69.678,35.0 -15:47:10,229.4014,35.087,35.507,69.183,35.0 -15:47:10,229.4474,35.143,35.479,69.168,35.0 -15:47:10,229.4906,35.115,35.507,68.671,35.0 -15:47:10,229.5339,35.143,35.535,68.655,35.0 -15:47:10,229.5818,35.143,35.479,67.677,35.0 -15:47:10,229.6268,35.143,35.479,68.622,35.0 -15:47:10,229.6768,35.115,35.479,68.606,35.0 -15:47:10,229.7219,35.171,35.507,69.069,35.0 -15:47:10,229.7647,35.143,35.507,67.61,35.0 -15:47:10,229.8076,35.143,35.563,68.075,35.0 -15:47:11,229.8537,35.087,35.479,67.096,35.0 -15:47:11,229.9006,35.115,35.507,69.485,35.0 -15:47:11,229.9505,35.143,35.535,68.507,35.0 -15:47:11,229.9959,35.143,35.507,67.526,35.0 -15:47:11,230.0441,35.143,35.507,67.99,35.0 -15:47:11,230.0901,35.143,35.479,67.971,35.0 -15:47:11,230.1343,35.143,35.535,68.436,35.0 -15:47:11,230.1801,35.171,35.507,67.457,35.0 -15:47:11,230.2246,35.143,35.535,67.44,35.0 -15:47:11,230.2677,35.115,35.479,67.422,35.0 -15:47:11,230.3135,35.171,35.507,68.85,35.0 -15:47:11,230.3571,35.171,35.507,67.39,35.0 -15:47:11,230.4006,35.171,35.479,67.373,35.0 -15:47:11,230.4475,35.171,35.507,67.838,35.0 -15:47:11,230.4915,35.115,35.563,67.339,35.0 -15:47:11,230.5345,35.115,35.535,67.322,35.0 -15:47:11,230.5798,35.143,35.507,67.786,35.0 -15:47:11,230.6238,35.171,35.507,67.77,35.0 -15:47:11,230.6683,35.143,35.507,67.272,35.0 -15:47:11,230.7146,35.171,35.507,67.736,35.0 -15:47:11,230.7586,35.171,35.535,67.237,35.0 -15:47:11,230.8013,35.143,35.507,66.739,35.0 -15:47:12,230.8478,35.115,35.479,67.685,35.0 -15:47:12,230.8922,35.143,35.535,68.631,35.0 -15:47:12,230.9364,35.087,35.507,67.171,35.0 -15:47:12,230.9815,35.171,35.535,68.598,35.0 -15:47:12,231.0252,35.171,35.535,66.657,35.0 -15:47:12,231.0692,35.171,35.507,66.639,35.0 -15:47:12,231.1156,35.171,35.535,67.103,35.0 -15:47:12,231.1604,35.171,35.507,66.603,35.0 -15:47:12,231.2046,35.143,35.563,67.067,35.0 -15:47:12,231.2507,35.143,35.535,66.568,35.0 -15:47:12,231.2956,35.171,35.507,67.031,35.0 -15:47:12,231.3387,35.171,35.507,67.014,35.0 -15:47:12,231.3836,35.143,35.507,66.997,35.0 -15:47:12,231.4285,35.199,35.535,67.461,35.0 -15:47:12,231.4719,35.171,35.507,66.0,35.0 -15:47:12,231.5152,35.171,35.535,66.945,35.0 -15:47:12,231.5622,35.171,35.507,66.447,35.0 -15:47:12,231.6079,35.199,35.535,66.909,35.0 -15:47:12,231.6541,35.143,35.535,65.928,35.0 -15:47:12,231.7003,35.199,35.563,66.872,35.0 -15:47:12,231.7457,35.199,35.479,65.41,35.0 -15:47:12,231.7898,35.171,35.535,66.835,35.0 -15:47:13,231.8340,35.115,35.591,66.336,35.0 -15:47:13,231.8819,35.171,35.563,66.318,35.0 -15:47:13,231.9256,35.171,35.535,65.817,35.0 -15:47:13,231.9777,35.199,35.535,66.281,35.0 -15:47:13,232.0213,35.115,35.535,65.778,35.0 -15:47:13,232.0662,35.143,35.507,67.204,35.0 -15:47:13,232.1124,35.143,35.535,67.187,35.0 -15:47:13,232.1561,35.143,35.535,66.689,35.0 -15:47:13,232.1998,35.171,35.535,66.672,35.0 -15:47:13,232.2468,35.199,35.563,66.173,35.0 -15:47:13,232.2897,35.171,35.507,65.191,35.0 -15:47:13,232.3335,35.199,35.507,66.617,35.0 -15:47:13,232.3805,35.199,35.563,66.119,35.0 -15:47:13,232.4234,35.143,35.591,65.136,35.0 -15:47:13,232.4676,35.171,35.563,65.599,35.0 -15:47:13,232.5126,35.171,35.535,65.581,35.0 -15:47:13,232.5563,35.199,35.535,66.044,35.0 -15:47:13,232.6002,35.199,35.535,65.544,35.0 -15:47:13,232.6457,35.199,35.563,65.526,35.0 -15:47:13,232.6903,35.171,35.535,65.025,35.0 -15:47:13,232.7332,35.171,35.563,65.969,35.0 -15:47:13,232.7802,35.199,35.535,65.47,35.0 -15:47:14,232.8242,35.171,35.535,65.45,35.0 -15:47:14,232.8685,35.171,35.563,65.914,35.0 -15:47:14,232.9143,35.199,35.563,65.414,35.0 -15:47:14,232.9581,35.199,35.535,64.913,35.0 -15:47:14,233.0015,35.227,35.479,65.376,35.0 -15:47:14,233.0480,35.171,35.591,65.839,35.0 -15:47:14,233.0951,35.227,35.563,64.857,35.0 -15:47:14,233.1398,35.199,35.619,64.354,35.0 -15:47:14,233.1859,35.199,35.563,63.854,35.0 -15:47:14,233.2315,35.199,35.535,64.795,35.0 -15:47:14,233.2859,35.227,35.535,65.257,35.0 -15:47:14,233.3316,35.227,35.563,64.752,35.0 -15:47:14,233.3789,35.199,35.563,64.251,35.0 -15:47:14,233.4225,35.171,35.507,64.711,35.0 -15:47:14,233.4667,35.199,35.591,66.137,35.0 -15:47:14,233.5130,35.199,35.479,64.193,35.0 -15:47:14,233.5560,35.171,35.563,66.099,35.0 -15:47:14,233.6054,35.255,35.563,65.118,35.0 -15:47:14,233.6556,35.115,35.563,63.653,35.0 -15:47:14,233.6992,35.199,35.591,66.038,35.0 -15:47:14,233.7457,35.227,35.563,64.095,35.0 -15:47:14,233.7895,35.227,35.535,64.074,35.0 -15:47:15,233.8333,35.199,35.535,64.536,35.0 -15:47:15,233.8803,35.199,35.535,64.998,35.0 -15:47:15,233.9244,35.199,35.507,64.979,35.0 -15:47:15,233.9687,35.227,35.535,65.442,35.0 -15:47:15,234.0136,35.199,35.563,64.461,35.0 -15:47:15,234.0586,35.199,35.563,64.441,35.0 -15:47:15,234.1034,35.227,35.563,64.422,35.0 -15:47:15,234.1496,35.171,35.563,63.921,35.0 -15:47:15,234.1942,35.227,35.563,64.863,35.0 -15:47:15,234.2395,35.227,35.563,63.881,35.0 -15:47:15,234.2830,35.143,35.563,63.861,35.0 -15:47:15,234.3289,35.199,35.619,65.286,35.0 -15:47:15,234.3744,35.171,35.591,63.341,35.0 -15:47:15,234.4180,35.227,35.563,64.283,35.0 -15:47:15,234.4655,35.199,35.591,63.782,35.0 -15:47:15,234.5106,35.199,35.591,63.761,35.0 -15:47:15,234.5552,35.199,35.563,63.741,35.0 -15:47:15,234.5988,35.199,35.535,64.202,35.0 -15:47:15,234.6443,35.283,35.563,64.665,35.0 -15:47:15,234.7529,35.227,35.619,62.719,35.0 -15:47:15,234.8010,35.227,35.535,62.666,35.0 -15:47:16,234.8488,35.199,35.563,64.088,35.0 -15:47:16,234.8954,35.227,35.563,64.067,35.0 -15:47:16,234.9399,35.227,35.591,63.565,35.0 -15:47:16,234.9844,35.227,35.563,63.064,35.0 -15:47:16,235.0307,35.199,35.591,63.525,35.0 -15:47:16,235.0794,35.171,35.591,63.504,35.0 -15:47:16,235.1247,35.227,35.591,63.963,35.0 -15:47:16,235.1701,35.227,35.563,62.981,35.0 -15:47:16,235.2149,35.227,35.563,63.441,35.0 -15:47:16,235.2632,35.227,35.591,63.421,35.0 -15:47:16,235.3088,35.227,35.591,62.917,35.0 -15:47:16,235.3554,35.227,35.591,62.896,35.0 -15:47:16,235.3992,35.227,35.591,62.874,35.0 -15:47:16,235.4484,35.199,35.591,62.854,35.0 -15:47:16,235.4951,35.199,35.675,63.312,35.0 -15:47:16,235.5436,35.227,35.619,61.847,35.0 -15:47:16,235.5893,35.199,35.619,62.304,35.0 -15:47:16,235.6409,35.171,35.619,62.764,35.0 -15:47:16,235.6865,35.283,35.591,63.221,35.0 -15:47:16,235.7331,35.255,35.451,61.756,35.0 -15:47:16,235.7796,35.255,35.591,64.622,35.0 -15:47:17,235.8260,35.227,35.619,62.195,35.0 -15:47:17,235.8715,35.255,35.619,62.173,35.0 -15:47:17,235.9158,35.255,35.591,61.669,35.0 -15:47:17,235.9625,35.255,35.619,62.129,35.0 -15:47:17,236.0067,35.255,35.591,61.625,35.0 -15:47:17,236.0535,35.227,35.675,62.084,35.0 -15:47:17,236.0997,35.227,35.591,61.098,35.0 -15:47:17,236.1455,35.255,35.591,62.519,35.0 -15:47:17,236.1911,35.227,35.591,62.016,35.0 -15:47:17,236.2363,35.143,35.647,62.476,35.0 -15:47:17,236.2827,35.227,35.591,62.936,35.0 -15:47:17,236.3290,35.227,35.619,62.434,35.0 -15:47:17,236.3739,35.227,35.619,61.93,35.0 -15:47:17,236.4178,35.227,35.619,61.909,35.0 -15:47:17,236.4647,35.255,35.563,61.888,35.0 -15:47:17,236.5116,35.199,35.647,62.346,35.0 -15:47:17,236.5560,35.227,35.619,61.843,35.0 -15:47:17,236.6011,35.255,35.619,61.822,35.0 -15:47:17,236.6475,35.255,35.619,61.318,35.0 -15:47:17,236.6930,35.255,35.619,61.295,35.0 -15:47:17,236.7379,35.227,35.619,61.273,35.0 -15:47:17,236.7831,35.255,35.563,61.732,35.0 -15:47:18,236.8288,35.227,35.619,62.191,35.0 -15:47:18,236.8737,35.255,35.619,61.688,35.0 -15:47:18,236.9181,35.227,35.619,61.185,35.0 -15:47:18,236.9656,35.227,35.619,61.644,35.0 -15:47:18,237.0133,35.227,35.619,61.621,35.0 -15:47:18,237.0722,35.255,35.619,61.599,35.0 -15:47:18,237.1308,35.255,35.619,61.086,35.0 -15:47:18,237.1801,35.227,35.619,61.059,35.0 -15:47:18,237.2251,35.283,35.619,61.516,35.0 -15:47:18,237.2713,35.283,35.619,60.531,35.0 -15:47:18,237.3182,35.227,35.591,60.507,35.0 -15:47:18,237.3665,35.311,35.591,61.928,35.0 -15:47:18,237.4139,35.255,35.535,60.461,35.0 -15:47:18,237.4627,35.199,35.619,62.362,35.0 -15:47:18,237.5082,35.283,35.591,61.859,35.0 -15:47:18,237.5546,35.283,35.619,60.875,35.0 -15:47:18,237.6014,35.255,35.619,60.37,35.0 -15:47:18,237.6496,35.255,35.619,60.826,35.0 -15:47:18,237.6954,35.227,35.619,60.803,35.0 -15:47:18,237.7392,35.227,35.619,61.262,35.0 -15:47:18,237.7828,35.199,35.619,61.241,35.0 -15:47:19,237.8286,35.255,35.591,61.701,35.0 -15:47:19,237.8743,35.255,35.619,61.198,35.0 -15:47:19,237.9194,35.311,35.619,60.695,35.0 -15:47:19,237.9661,35.255,35.619,59.709,35.0 -15:47:19,238.0119,35.227,35.591,60.647,35.0 -15:47:19,238.0565,35.255,35.647,61.587,35.0 -15:47:19,238.1045,35.283,35.591,60.122,35.0 -15:47:19,238.1486,35.255,35.647,60.579,35.0 -15:47:19,238.1946,35.227,35.647,60.075,35.0 -15:47:19,238.2386,35.283,35.619,60.533,35.0 -15:47:19,238.2825,35.255,35.619,60.03,35.0 -15:47:19,238.3285,35.255,35.675,60.489,35.0 -15:47:19,238.3733,35.255,35.619,59.503,35.0 -15:47:19,238.4187,35.283,35.535,60.442,35.0 -15:47:19,238.4656,35.283,35.619,61.382,35.0 -15:47:19,238.5114,35.283,35.591,59.916,35.0 -15:47:19,238.5558,35.283,35.647,60.374,35.0 -15:47:19,238.5989,35.199,35.619,59.389,35.0 -15:47:19,238.6445,35.311,35.647,61.292,35.0 -15:47:19,238.6884,35.255,35.647,58.862,35.0 -15:47:19,238.7324,35.255,35.647,59.801,35.0 -15:47:19,238.7783,35.255,35.647,59.779,35.0 -15:47:20,238.8221,35.311,35.619,59.755,35.0 -15:47:20,238.8655,35.311,35.647,59.251,35.0 -15:47:20,238.9115,35.255,35.647,58.747,35.0 -15:47:20,238.9568,35.255,35.619,59.684,35.0 -15:47:20,239.0023,35.227,35.675,60.143,35.0 -15:47:20,239.0486,35.255,35.619,59.639,35.0 -15:47:20,239.0943,35.255,35.675,60.096,35.0 -15:47:20,239.1381,35.255,35.619,59.11,35.0 -15:47:20,239.1825,35.339,35.647,60.05,35.0 -15:47:20,239.2275,35.227,35.647,58.102,35.0 -15:47:20,239.2736,35.255,35.647,60.003,35.0 -15:47:20,239.3185,35.283,35.675,59.498,35.0 -15:47:20,239.3656,35.339,35.591,58.512,35.0 -15:47:20,239.4116,35.283,35.675,58.968,35.0 -15:47:20,239.4569,35.283,35.675,58.462,35.0 -15:47:20,239.5021,35.255,35.647,58.437,35.0 -15:47:20,239.5475,35.227,35.647,59.375,35.0 -15:47:20,239.5941,35.227,35.647,59.833,35.0 -15:47:20,239.6385,35.283,35.675,59.81,35.0 -15:47:20,239.6821,35.255,35.675,58.343,35.0 -15:47:20,239.7275,35.283,35.647,58.801,35.0 -15:47:20,239.7728,35.283,35.647,58.777,35.0 -15:47:21,239.8169,35.255,35.647,58.753,35.0 -15:47:21,239.8653,35.255,35.647,59.211,35.0 -15:47:21,239.9112,35.339,35.704,59.186,35.0 -15:47:21,239.9574,35.199,35.675,56.737,35.0 -15:47:21,240.0024,35.283,35.704,59.616,35.0 -15:47:21,240.0540,35.255,35.675,57.651,35.0 -15:47:21,240.0995,35.283,35.647,58.602,35.0 -15:47:21,240.1447,35.283,35.675,58.578,35.0 -15:47:21,240.1977,35.283,35.619,58.072,35.0 -15:47:21,240.2516,35.311,35.675,59.006,35.0 -15:47:21,240.2986,35.255,35.619,57.533,35.0 -15:47:21,240.3461,35.283,35.647,59.433,35.0 -15:47:21,240.3923,35.283,35.619,58.447,35.0 -15:47:21,240.4396,35.255,35.675,58.904,35.0 -15:47:21,240.4895,35.255,35.704,58.398,35.0 -15:47:21,240.5773,35.199,35.647,57.871,35.0 -15:47:21,240.6395,35.255,35.647,59.767,35.0 -15:47:21,240.6986,35.311,35.647,58.775,35.0 -15:47:21,240.7656,35.283,35.675,57.78,35.0 -15:47:22,240.8316,35.311,35.675,57.745,35.0 -15:47:22,240.8949,35.283,35.675,57.228,35.0 -15:47:22,240.9552,35.255,35.675,57.674,35.0 -15:47:22,241.0139,35.311,35.675,58.121,35.0 -15:47:22,241.0793,35.199,35.675,57.127,35.0 -15:47:22,241.1383,35.283,35.647,59.017,35.0 -15:47:22,241.1942,35.311,35.675,58.025,35.0 -15:47:22,241.2537,35.283,35.675,57.033,35.0 -15:47:22,241.3116,35.311,35.675,57.48,35.0 -15:47:22,241.3687,35.283,35.675,56.967,35.0 -15:47:22,241.4217,35.311,35.704,57.417,35.0 -15:47:22,241.4727,35.311,35.647,56.408,35.0 -15:47:22,241.5269,35.283,35.675,57.359,35.0 -15:47:22,241.5746,35.311,35.704,57.329,35.0 -15:47:22,241.6222,35.311,35.675,56.323,35.0 -15:47:22,241.6706,35.311,35.704,56.794,35.0 -15:47:22,241.7176,35.311,35.675,56.268,35.0 -15:47:22,241.7675,35.367,35.647,56.74,35.0 -15:47:23,241.8173,35.283,35.675,56.23,35.0 -15:47:23,241.8854,35.311,35.675,57.163,35.0 -15:47:23,241.9332,35.311,35.675,56.645,35.0 -15:47:23,241.9841,35.311,35.675,56.618,35.0 -15:47:23,242.0337,35.311,35.675,56.59,35.0 -15:47:23,242.0837,35.311,35.647,56.562,35.0 -15:47:23,242.1336,35.311,35.675,57.015,35.0 -15:47:23,242.1835,35.283,35.675,56.506,35.0 -15:47:23,242.2330,35.283,35.675,56.96,35.0 -15:47:23,242.2824,35.311,35.647,56.933,35.0 -15:47:23,242.3318,35.283,35.704,56.906,35.0 -15:47:23,242.3833,35.339,35.647,56.38,35.0 -15:47:23,242.4345,35.283,35.704,56.368,35.0 -15:47:23,242.4843,35.311,35.619,56.322,35.0 -15:47:23,242.5331,35.339,35.704,57.274,35.0 -15:47:23,242.5828,35.311,35.675,55.305,35.0 -15:47:23,242.6314,35.311,35.675,56.256,35.0 -15:47:23,242.6817,35.339,35.675,56.228,35.0 -15:47:23,242.7300,35.227,35.675,55.718,35.0 -15:47:23,242.7783,35.339,35.704,57.617,35.0 -15:47:24,242.8261,35.311,35.675,55.167,35.0 -15:47:24,242.8735,35.311,35.675,56.119,35.0 -15:47:24,242.9217,35.339,35.704,56.092,35.0 -15:47:24,242.9703,35.311,35.704,55.084,35.0 -15:47:24,243.0163,35.395,35.704,55.537,35.0 -15:47:24,243.0662,35.283,35.704,54.065,35.0 -15:47:24,243.1146,35.283,35.704,55.961,35.0 -15:47:24,243.1661,35.311,35.675,55.933,35.0 -15:47:24,243.2150,35.283,35.704,55.922,35.0 -15:47:24,243.2643,35.311,35.647,55.877,35.0 -15:47:24,243.3143,35.311,35.704,56.348,35.0 -15:47:24,243.3633,35.367,35.732,55.34,35.0 -15:47:24,243.4157,35.311,35.675,53.867,35.0 -15:47:24,243.4663,35.311,35.704,55.778,35.0 -15:47:24,243.5204,35.311,35.704,55.251,35.0 -15:47:24,243.5683,35.367,35.704,55.219,35.0 -15:47:24,243.6178,35.311,35.704,54.228,35.0 -15:47:24,243.6675,35.311,35.619,55.161,35.0 -15:47:24,243.7160,35.311,35.704,56.594,35.0 -15:47:24,243.7652,35.311,35.732,55.107,35.0 -15:47:25,243.8149,35.339,35.619,54.597,35.0 -15:47:25,243.8649,35.367,35.675,56.029,35.0 -15:47:25,243.9146,35.367,35.647,54.557,35.0 -15:47:25,243.9629,35.339,35.732,55.009,35.0 -15:47:25,244.0125,35.339,35.704,54.0,35.0 -15:47:25,244.0631,35.339,35.704,54.452,35.0 -15:47:25,244.1123,35.311,35.675,54.422,35.0 -15:47:25,244.1622,35.311,35.704,55.373,35.0 -15:47:25,244.2092,35.311,35.704,54.846,35.0 -15:47:25,244.2557,35.339,35.732,54.819,35.0 -15:47:25,244.3046,35.311,35.704,53.828,35.0 -15:47:25,244.3520,35.283,35.704,54.762,35.0 -15:47:25,244.3993,35.311,35.704,55.216,35.0 -15:47:25,244.4477,35.311,35.704,54.708,35.0 -15:47:25,244.4976,35.311,35.732,54.68,35.0 -15:47:25,244.5463,35.311,35.732,54.169,35.0 -15:47:25,244.5958,35.339,35.704,54.14,35.0 -15:47:25,244.6455,35.311,35.732,54.11,35.0 -15:47:25,244.6962,35.367,35.675,54.081,35.0 -15:47:25,244.7452,35.339,35.732,54.068,35.0 -15:47:25,244.7932,35.339,35.732,53.54,35.0 -15:47:26,244.8393,35.339,35.732,53.511,35.0 -15:47:26,244.8868,35.311,35.732,53.482,35.0 -15:47:26,244.9353,35.283,35.732,53.935,35.0 -15:47:26,244.9827,35.339,35.76,54.388,35.0 -15:47:26,245.0357,35.311,35.732,52.915,35.0 -15:47:26,245.0895,35.339,35.76,53.845,35.0 -15:47:26,245.1475,35.367,35.732,52.85,35.0 -15:47:26,245.2008,35.311,35.704,52.813,35.0 -15:47:26,245.2475,35.339,35.704,54.225,35.0 -15:47:26,245.2955,35.367,35.704,53.716,35.0 -15:47:26,245.3438,35.395,35.788,53.206,35.0 -15:47:26,245.3938,35.367,35.704,51.25,35.0 -15:47:26,245.4415,35.339,35.732,53.143,35.0 -15:47:26,245.4990,35.311,35.76,53.114,35.0 -15:47:26,245.5517,35.367,35.675,53.079,35.0 -15:47:26,245.6007,35.339,35.732,53.545,35.0 -15:47:26,245.6502,35.339,35.732,53.018,35.0 -15:47:26,245.6993,35.339,35.732,52.987,35.0 -15:47:26,245.7480,35.339,35.732,52.957,35.0 -15:47:26,245.7968,35.311,35.76,52.927,35.0 -15:47:27,245.8446,35.283,35.76,52.897,35.0 -15:47:27,245.8911,35.339,35.732,53.35,35.0 -15:47:27,245.9375,35.339,35.704,52.839,35.0 -15:47:27,245.9821,35.311,35.732,53.293,35.0 -15:47:27,246.0278,35.367,35.704,53.267,35.0 -15:47:27,246.0721,35.339,35.732,52.758,35.0 -15:47:27,246.1164,35.367,35.732,52.731,35.0 -15:47:27,246.1615,35.339,35.76,52.223,35.0 -15:47:27,246.2065,35.367,35.732,52.194,35.0 -15:47:27,246.2497,35.339,35.76,52.166,35.0 -15:47:27,246.2966,35.395,35.704,52.139,35.0 -15:47:27,246.3437,35.339,35.732,52.11,35.0 -15:47:27,246.3899,35.339,35.732,52.561,35.0 -15:47:27,246.4345,35.339,35.732,52.533,35.0 -15:47:27,246.4793,35.339,35.76,52.506,35.0 -15:47:27,246.5260,35.367,35.732,51.997,35.0 -15:47:27,246.5701,35.339,35.76,51.968,35.0 -15:47:27,246.6146,35.311,35.732,51.94,35.0 -15:47:27,246.6595,35.311,35.732,52.875,35.0 -15:47:27,246.7039,35.283,35.732,52.849,35.0 -15:47:27,246.7481,35.367,35.732,53.304,35.0 -15:47:27,246.7942,35.339,35.76,51.833,35.0 -15:47:28,246.8415,35.311,35.76,51.804,35.0 -15:47:28,246.8864,35.367,35.76,52.256,35.0 -15:47:28,246.9303,35.339,35.732,51.266,35.0 -15:47:28,246.9771,35.311,35.788,52.201,35.0 -15:47:28,247.0237,35.367,35.732,51.69,35.0 -15:47:28,247.0708,35.367,35.732,51.661,35.0 -15:47:28,247.1159,35.339,35.76,51.631,35.0 -15:47:28,247.1627,35.311,35.76,51.603,35.0 -15:47:28,247.2101,35.339,35.732,52.055,35.0 -15:47:28,247.2551,35.367,35.675,52.026,35.0 -15:47:28,247.3011,35.339,35.76,52.498,35.0 -15:47:28,247.3447,35.311,35.675,51.49,35.0 -15:47:28,247.3878,35.367,35.816,53.406,35.0 -15:47:28,247.4332,35.367,35.732,49.994,35.0 -15:47:28,247.4800,35.367,35.732,51.408,35.0 -15:47:28,247.5310,35.367,35.732,51.379,35.0 -15:47:28,247.5772,35.367,35.732,51.346,35.0 -15:47:28,247.6232,35.339,35.732,51.317,35.0 -15:47:28,247.6681,35.339,35.76,51.77,35.0 -15:47:28,247.7134,35.395,35.76,51.261,35.0 -15:47:28,247.7595,35.367,35.76,50.269,35.0 -15:47:28,247.8040,35.367,35.732,50.721,35.0 -15:47:29,247.8498,35.367,35.732,51.174,35.0 -15:47:29,247.8964,35.339,35.732,51.145,35.0 -15:47:29,247.9433,35.367,35.732,51.597,35.0 -15:47:29,247.9874,35.367,35.76,51.087,35.0 -15:47:29,248.0315,35.339,35.76,50.578,35.0 -15:47:29,248.0777,35.339,35.732,51.031,35.0 -15:47:29,248.1256,35.367,35.732,51.483,35.0 -15:47:29,248.1701,35.339,35.788,50.973,35.0 -15:47:29,248.2128,35.395,35.732,50.463,35.0 -15:47:29,248.2583,35.339,35.76,50.436,35.0 -15:47:29,248.3033,35.367,35.76,50.888,35.0 -15:47:29,248.3475,35.395,35.76,50.378,35.0 -15:47:29,248.3955,35.395,35.76,49.868,35.0 -15:47:29,248.4419,35.339,35.732,49.836,35.0 -15:47:29,248.4872,35.339,35.788,51.251,35.0 -15:47:29,248.5323,35.367,35.76,50.26,35.0 -15:47:29,248.5775,35.367,35.76,50.231,35.0 -15:47:29,248.6216,35.339,35.76,50.202,35.0 -15:47:29,248.6668,35.367,35.732,50.655,35.0 -15:47:29,248.7142,35.367,35.732,50.626,35.0 -15:47:29,248.7600,35.395,35.816,50.597,35.0 -15:47:29,248.8046,35.339,35.76,48.642,35.0 -15:47:30,248.8491,35.395,35.788,50.537,35.0 -15:47:30,248.8957,35.395,35.788,49.064,35.0 -15:47:30,248.9425,35.339,35.732,49.033,35.0 -15:47:30,248.9863,35.339,35.816,50.928,35.0 -15:47:30,249.0309,35.339,35.76,49.456,35.0 -15:47:30,249.0777,35.367,35.76,50.39,35.0 -15:47:30,249.1258,35.339,35.76,49.879,35.0 -15:47:30,249.1739,35.367,35.788,50.33,35.0 -15:47:30,249.2191,35.423,35.76,49.336,35.0 -15:47:30,249.2632,35.367,35.76,48.825,35.0 -15:47:30,249.3095,35.395,35.788,49.758,35.0 -15:47:30,249.3554,35.339,35.788,48.765,35.0 -15:47:30,249.4006,35.367,35.76,49.697,35.0 -15:47:30,249.4450,35.423,35.76,49.668,35.0 -15:47:30,249.4908,35.367,35.788,48.677,35.0 -15:47:30,249.5359,35.395,35.788,49.127,35.0 -15:47:30,249.5798,35.339,35.76,48.616,35.0 -15:47:30,249.6258,35.367,35.76,50.031,35.0 -15:47:30,249.6699,35.367,35.788,49.52,35.0 -15:47:30,249.7152,35.311,35.76,49.01,35.0 -15:47:30,249.7609,35.367,35.788,50.425,35.0 -15:47:31,249.8091,35.395,35.76,48.953,35.0 -15:47:31,249.8538,35.367,35.76,48.921,35.0 -15:47:31,249.8994,35.367,35.788,49.372,35.0 -15:47:31,249.9464,35.367,35.816,48.862,35.0 -15:47:31,249.9933,35.367,35.76,48.349,35.0 -15:47:31,250.0384,35.367,35.788,49.281,35.0 -15:47:31,250.0841,35.283,35.816,48.77,35.0 -15:47:31,250.1292,35.395,35.76,49.703,35.0 -15:47:31,250.1746,35.367,35.76,48.712,35.0 -15:47:31,250.2196,35.339,35.76,49.163,35.0 -15:47:31,250.2622,35.367,35.788,49.616,35.0 -15:47:31,250.3083,35.395,35.732,48.626,35.0 -15:47:31,250.3527,35.395,35.788,49.077,35.0 -15:47:31,250.3975,35.395,35.76,48.086,35.0 -15:47:31,250.4430,35.395,35.816,48.537,35.0 -15:47:31,250.4900,35.367,35.76,47.544,35.0 -15:47:31,250.5355,35.367,35.788,48.956,35.0 -15:47:31,250.5798,35.283,35.788,48.445,35.0 -15:47:31,250.6260,35.367,35.788,49.861,35.0 -15:47:31,250.6723,35.367,35.816,48.388,35.0 -15:47:31,250.7175,35.395,35.76,47.875,35.0 -15:47:31,250.7617,35.395,35.788,48.326,35.0 -15:47:31,250.8076,35.367,35.788,47.816,35.0 -15:47:32,250.8525,35.423,35.76,48.266,35.0 -15:47:32,250.8971,35.367,35.76,47.755,35.0 -15:47:32,250.9436,35.367,35.76,48.688,35.0 -15:47:32,250.9916,35.395,35.732,48.658,35.0 -15:47:32,251.0372,35.367,35.788,48.627,35.0 -15:47:32,251.0824,35.423,35.76,48.116,35.0 -15:47:32,251.1287,35.395,35.788,47.605,35.0 -15:47:32,251.1755,35.423,35.788,47.574,35.0 -15:47:32,251.2214,35.367,35.816,47.061,35.0 -15:47:32,251.2671,35.395,35.816,47.51,35.0 -15:47:32,251.3121,35.367,35.816,46.998,35.0 -15:47:32,251.3585,35.367,35.788,47.448,35.0 -15:47:32,251.4019,35.395,35.76,47.899,35.0 -15:47:32,251.4469,35.367,35.816,47.87,35.0 -15:47:32,251.4931,35.367,35.788,47.359,35.0 -15:47:32,251.5402,35.395,35.788,47.809,35.0 -15:47:32,251.5847,35.395,35.816,47.296,35.0 -15:47:32,251.6287,35.367,35.788,46.785,35.0 -15:47:32,251.6754,35.395,35.76,47.717,35.0 -15:47:32,251.7202,35.395,35.788,47.687,35.0 -15:47:32,251.7656,35.395,35.76,47.175,35.0 -15:47:33,251.8120,35.367,35.872,47.626,35.0 -15:47:33,251.8615,35.339,35.788,46.151,35.0 -15:47:33,251.9060,35.395,35.788,48.043,35.0 -15:47:33,251.9615,35.367,35.816,47.051,35.0 -15:47:33,252.0099,35.423,35.816,47.013,35.0 -15:47:33,252.0578,35.367,35.788,46.017,35.0 -15:47:33,252.1043,35.395,35.816,47.427,35.0 -15:47:33,252.1498,35.367,35.788,46.434,35.0 -15:47:33,252.1964,35.423,35.788,47.366,35.0 -15:47:33,252.2435,35.367,35.788,46.372,35.0 -15:47:33,252.2893,35.339,35.816,47.303,35.0 -15:47:33,252.3350,35.395,35.872,47.273,35.0 -15:47:33,252.3798,35.395,35.788,45.316,35.0 -15:47:33,252.4263,35.395,35.788,46.728,35.0 -15:47:33,252.4701,35.423,35.816,46.697,35.0 -15:47:33,252.5160,35.395,35.788,45.705,35.0 -15:47:33,252.5626,35.367,35.788,46.635,35.0 -15:47:33,252.6105,35.367,35.816,47.085,35.0 -15:47:33,252.6590,35.395,35.788,46.572,35.0 -15:47:33,252.7052,35.367,35.788,46.539,35.0 -15:47:33,252.7527,35.395,35.788,46.99,35.0 -15:47:33,252.8007,35.395,35.872,46.476,35.0 -15:47:34,252.8473,35.423,35.76,44.999,35.0 -15:47:34,252.8953,35.395,35.788,46.41,35.0 -15:47:34,252.9435,35.395,35.788,46.377,35.0 -15:47:34,252.9945,35.367,35.788,46.345,35.0 -15:47:34,253.0456,35.395,35.816,46.792,35.0 -15:47:34,253.0957,35.423,35.788,45.794,35.0 -15:47:34,253.1429,35.423,35.76,45.761,35.0 -15:47:34,253.1907,35.479,35.788,46.21,35.0 -15:47:34,253.2352,35.423,35.816,44.733,35.0 -15:47:34,253.2803,35.423,35.788,45.182,35.0 -15:47:34,253.3271,35.423,35.816,45.632,35.0 -15:47:34,253.3741,35.395,35.844,45.118,35.0 -15:47:34,253.4193,35.451,35.816,45.085,35.0 -15:47:34,253.4646,35.423,35.788,44.571,35.0 -15:47:34,253.5109,35.395,35.788,45.501,35.0 -15:47:34,253.5567,35.395,35.844,45.951,35.0 -15:47:34,253.6018,35.395,35.816,44.957,35.0 -15:47:34,253.6478,35.367,35.788,45.406,35.0 -15:47:34,253.6947,35.395,35.788,46.338,35.0 -15:47:34,253.7417,35.367,35.816,45.825,35.0 -15:47:34,253.7876,35.367,35.816,45.793,35.0 -15:47:35,253.8330,35.395,35.788,45.762,35.0 -15:47:35,253.8783,35.423,35.76,45.732,35.0 -15:47:35,253.9259,35.395,35.816,45.701,35.0 -15:47:35,253.9726,35.423,35.816,45.187,35.0 -15:47:35,254.0193,35.451,35.816,44.673,35.0 -15:47:35,254.0653,35.451,35.816,44.159,35.0 -15:47:35,254.1127,35.367,35.788,44.126,35.0 -15:47:35,254.1592,35.423,35.816,46.018,35.0 -15:47:35,254.2044,35.395,35.732,44.542,35.0 -15:47:35,254.2495,35.395,35.816,46.436,35.0 -15:47:35,254.2946,35.367,35.816,44.962,35.0 -15:47:35,254.3405,35.423,35.788,45.413,35.0 -15:47:35,254.3857,35.395,35.816,44.901,35.0 -15:47:35,254.4370,35.423,35.76,44.868,35.0 -15:47:35,254.4860,35.395,35.816,45.315,35.0 -15:47:35,254.5340,35.395,35.816,44.801,35.0 -15:47:35,254.5813,35.423,35.816,44.767,35.0 -15:47:35,254.6337,35.367,35.788,44.253,35.0 -15:47:35,254.6816,35.367,35.816,45.661,35.0 -15:47:35,254.7310,35.367,35.816,45.148,35.0 -15:47:35,254.7811,35.423,35.816,45.114,35.0 -15:47:36,254.8307,35.423,35.788,44.117,35.0 -15:47:36,254.8811,35.423,35.816,44.564,35.0 -15:47:36,254.9308,35.367,35.816,44.047,35.0 -15:47:36,254.9808,35.395,35.788,44.975,35.0 -15:47:36,255.0297,35.339,35.788,44.942,35.0 -15:47:36,255.0790,35.367,35.816,45.872,35.0 -15:47:36,255.1297,35.423,35.844,44.877,35.0 -15:47:36,255.1786,35.395,35.872,43.398,35.0 -15:47:36,255.2379,35.367,35.816,43.362,35.0 -15:47:36,255.2891,35.423,35.788,44.765,35.0 -15:47:36,255.3367,35.395,35.816,44.248,35.0 -15:47:36,255.3847,35.395,35.76,44.216,35.0 -15:47:36,255.4298,35.423,35.788,45.146,35.0 -15:47:36,255.4807,35.451,35.816,44.153,35.0 -15:47:36,255.5429,35.367,35.816,43.154,35.0 -15:47:36,255.6159,35.367,35.816,44.554,35.0 -15:47:36,255.6785,35.423,35.816,44.504,35.0 -15:47:36,255.7458,35.423,35.816,43.499,35.0 -15:47:37,255.8095,35.423,35.872,43.452,35.0 -15:47:37,255.8727,35.367,35.816,42.442,35.0 -15:47:37,255.9299,35.395,35.844,44.323,35.0 -15:47:37,255.9885,35.395,35.788,43.321,35.0 -15:47:37,256.0489,35.367,35.844,44.243,35.0 -15:47:37,256.1097,35.367,35.788,43.721,35.0 -15:47:37,256.1702,35.395,35.816,44.642,35.0 -15:47:37,256.2278,35.367,35.844,43.639,35.0 -15:47:37,256.2918,35.423,35.816,43.599,35.0 -15:47:37,256.3519,35.395,35.788,43.073,35.0 -15:47:37,256.4067,35.395,35.844,43.994,35.0 -15:47:37,256.4583,35.367,35.816,42.993,35.0 -15:47:37,256.5099,35.395,35.844,43.92,35.0 -15:47:37,256.5641,35.423,35.788,42.922,35.0 -15:47:37,256.6142,35.423,35.816,43.365,35.0 -15:47:37,256.6641,35.423,35.788,42.849,35.0 -15:47:37,256.7121,35.395,35.844,43.296,35.0 -15:47:37,256.7617,35.423,35.816,42.781,35.0 -15:47:38,256.8098,35.395,35.816,42.746,35.0 -15:47:38,256.8585,35.423,35.816,43.194,35.0 -15:47:38,256.9205,35.367,35.844,42.678,35.0 -15:47:38,256.9673,35.367,35.816,43.116,35.0 -15:47:38,257.0154,35.451,35.816,43.565,35.0 -15:47:38,257.0614,35.395,35.844,42.088,35.0 -15:47:38,257.1103,35.423,35.816,42.536,35.0 -15:47:38,257.1592,35.423,35.788,42.502,35.0 -15:47:38,257.2080,35.395,35.844,42.949,35.0 -15:47:38,257.2571,35.395,35.816,42.433,35.0 -15:47:38,257.3045,35.395,35.816,42.88,35.0 -15:47:38,257.3531,35.451,35.816,42.848,35.0 -15:47:38,257.3995,35.339,35.816,41.851,35.0 -15:47:38,257.4446,35.395,35.816,43.743,35.0 -15:47:38,257.4938,35.395,35.844,42.75,35.0 -15:47:38,257.5437,35.395,35.816,42.235,35.0 -15:47:38,257.5917,35.451,35.844,42.681,35.0 -15:47:38,257.6406,35.395,35.844,41.203,35.0 -15:47:38,257.6886,35.395,35.788,42.13,35.0 -15:47:38,257.7352,35.423,35.844,43.059,35.0 -15:47:38,257.7828,35.395,35.816,41.583,35.0 -15:47:39,257.8277,35.395,35.844,42.512,35.0 -15:47:39,257.8773,35.423,35.816,41.999,35.0 -15:47:39,257.9275,35.395,35.816,41.964,35.0 -15:47:39,257.9766,35.423,35.816,42.41,35.0 -15:47:39,258.0248,35.395,35.816,41.894,35.0 -15:47:39,258.0702,35.423,35.844,42.342,35.0 -15:47:39,258.1167,35.311,35.844,41.348,35.0 -15:47:39,258.1623,35.423,35.872,43.24,35.0 -15:47:39,258.2103,35.423,35.844,40.803,35.0 -15:47:39,258.2588,35.423,35.816,41.248,35.0 -15:47:39,258.3067,35.339,35.816,41.695,35.0 -15:47:39,258.3524,35.423,35.816,43.106,35.0 -15:47:39,258.4009,35.395,35.816,41.63,35.0 -15:47:39,258.4491,35.395,35.816,42.078,35.0 -15:47:39,258.4951,35.423,35.844,42.045,35.0 -15:47:39,258.5418,35.395,35.816,41.05,35.0 -15:47:39,258.5881,35.395,35.844,41.979,35.0 -15:47:39,258.6343,35.395,35.816,41.466,35.0 -15:47:39,258.6790,35.423,35.844,41.915,35.0 -15:47:39,258.7257,35.423,35.816,40.921,35.0 -15:47:39,258.7801,35.423,35.816,41.368,35.0 -15:47:40,258.8275,35.423,35.788,41.33,35.0 -15:47:40,258.8743,35.367,35.816,41.778,35.0 -15:47:40,258.9211,35.367,35.844,42.227,35.0 -15:47:40,258.9676,35.367,35.844,41.714,35.0 -15:47:40,259.0119,35.395,35.844,41.682,35.0 -15:47:40,259.0588,35.395,35.844,41.17,35.0 -15:47:40,259.1049,35.423,35.816,41.136,35.0 -15:47:40,259.1519,35.479,35.788,41.104,35.0 -15:47:40,259.1974,35.423,35.816,40.589,35.0 -15:47:40,259.2434,35.423,35.816,41.038,35.0 -15:47:40,259.2918,35.367,35.816,41.005,35.0 -15:47:40,259.3429,35.423,35.816,41.933,35.0 -15:47:40,259.3956,35.395,35.816,40.936,35.0 -15:47:40,259.4429,35.395,35.816,41.38,35.0 -15:47:40,259.4902,35.395,35.844,41.348,35.0 -15:47:40,259.5355,35.367,35.844,40.834,35.0 -15:47:40,259.5815,35.423,35.788,41.283,35.0 -15:47:40,259.6260,35.395,35.844,41.251,35.0 -15:47:40,259.6729,35.423,35.844,40.739,35.0 -15:47:40,259.7178,35.395,35.872,40.224,35.0 -15:47:40,259.7648,35.423,35.844,40.192,35.0 -15:47:41,259.8094,35.339,35.844,40.158,35.0 -15:47:41,259.8570,35.395,35.844,41.57,35.0 -15:47:41,259.9023,35.395,35.844,40.574,35.0 -15:47:41,259.9475,35.395,35.872,40.543,35.0 -15:47:41,259.9946,35.395,35.844,40.029,35.0 -15:47:41,260.0463,35.367,35.816,40.477,35.0 -15:47:41,260.1007,35.423,35.844,41.402,35.0 -15:47:41,260.1523,35.423,35.816,39.922,35.0 -15:47:41,260.1999,35.395,35.816,40.366,35.0 -15:47:41,260.2472,35.367,35.844,40.814,35.0 -15:47:41,260.2941,35.423,35.816,40.781,35.0 -15:47:41,260.3413,35.367,35.844,40.267,35.0 -15:47:41,260.3894,35.367,35.844,40.715,35.0 -15:47:41,260.4347,35.423,35.816,40.682,35.0 -15:47:41,260.4817,35.423,35.816,40.169,35.0 -15:47:41,260.5271,35.423,35.844,40.136,35.0 -15:47:41,260.5749,35.395,35.844,39.622,35.0 -15:47:41,260.6221,35.367,35.816,40.069,35.0 -15:47:41,260.6679,35.395,35.816,40.999,35.0 -15:47:41,260.7133,35.423,35.844,40.486,35.0 -15:47:41,260.7617,35.395,35.844,39.492,35.0 -15:47:42,260.8091,35.395,35.816,39.938,35.0 -15:47:42,260.8568,35.423,35.844,40.387,35.0 -15:47:42,260.9019,35.395,35.844,39.39,35.0 -15:47:42,260.9477,35.423,35.816,39.839,35.0 -15:47:42,260.9935,35.395,35.816,39.807,35.0 -15:47:42,261.0407,35.395,35.76,40.256,35.0 -15:47:42,261.0871,35.395,35.844,41.186,35.0 -15:47:42,261.1323,35.423,35.816,39.711,35.0 -15:47:42,261.1790,35.395,35.844,39.679,35.0 -15:47:42,261.2258,35.395,35.816,39.646,35.0 -15:47:42,261.2731,35.423,35.844,40.095,35.0 -15:47:42,261.3197,35.395,35.844,39.099,35.0 -15:47:42,261.3668,35.395,35.844,39.547,35.0 -15:47:42,261.4118,35.395,35.844,39.513,35.0 -15:47:42,261.4589,35.423,35.844,39.481,35.0 -15:47:42,261.5087,35.423,35.844,38.965,35.0 -15:47:42,261.5565,35.395,35.816,38.93,35.0 -15:47:42,261.6028,35.423,35.816,39.859,35.0 -15:47:42,261.6513,35.367,35.816,39.345,35.0 -15:47:42,261.7008,35.423,35.844,40.274,35.0 -15:47:42,261.7486,35.423,35.844,38.796,35.0 -15:47:42,261.7977,35.423,35.844,38.761,35.0 -15:47:43,261.8456,35.367,35.844,38.726,35.0 -15:47:43,261.8943,35.367,35.816,39.654,35.0 -15:47:43,261.9431,35.367,35.816,40.103,35.0 -15:47:43,261.9938,35.395,35.872,40.069,35.0 -15:47:43,262.0422,35.423,35.816,38.59,35.0 -15:47:43,262.0917,35.367,35.844,39.037,35.0 -15:47:43,262.1416,35.339,35.816,39.483,35.0 -15:47:43,262.1895,35.423,35.844,40.412,35.0 -15:47:43,262.2403,35.367,35.844,38.453,35.0 -15:47:43,262.2856,35.423,35.844,39.381,35.0 -15:47:43,262.3310,35.423,35.844,38.386,35.0 -15:47:43,262.3766,35.423,35.844,38.353,35.0 -15:47:43,262.4246,35.395,35.872,38.32,35.0 -15:47:43,262.4711,35.395,35.844,38.286,35.0 -15:47:43,262.5175,35.423,35.844,38.733,35.0 -15:47:43,262.5639,35.367,35.844,38.219,35.0 -15:47:43,262.6086,35.423,35.816,39.149,35.0 -15:47:43,262.6572,35.423,35.816,38.636,35.0 -15:47:43,262.7052,35.339,35.872,38.602,35.0 -15:47:43,262.7523,35.451,35.844,39.049,35.0 -15:47:43,262.7993,35.423,35.788,37.572,35.0 -15:47:44,262.8465,35.395,35.844,38.982,35.0 -15:47:44,262.8935,35.423,35.816,38.468,35.0 -15:47:44,262.9416,35.395,35.844,38.435,35.0 -15:47:44,262.9899,35.367,35.844,38.401,35.0 -15:47:44,263.0376,35.339,35.844,38.848,35.0 -15:47:44,263.0839,35.367,35.788,39.297,35.0 -15:47:44,263.1301,35.423,35.844,39.747,35.0 -15:47:44,263.1778,35.423,35.844,37.79,35.0 -15:47:44,263.2256,35.395,35.901,37.756,35.0 -15:47:44,263.2747,35.395,35.844,37.222,35.0 -15:47:44,263.3195,35.395,35.844,38.166,35.0 -15:47:44,263.3723,35.367,35.844,38.135,35.0 -15:47:44,263.4186,35.395,35.844,38.579,35.0 -15:47:44,263.4651,35.367,35.844,38.065,35.0 -15:47:44,263.5110,35.423,35.844,38.514,35.0 -15:47:44,263.5582,35.395,35.844,37.519,35.0 -15:47:44,263.6031,35.423,35.788,37.967,35.0 -15:47:44,263.6477,35.395,35.816,38.416,35.0 -15:47:44,263.6919,35.395,35.844,38.385,35.0 -15:47:44,263.7378,35.395,35.844,37.873,35.0 -15:47:44,263.7829,35.395,35.816,37.841,35.0 -15:47:45,263.8281,35.395,35.816,38.29,35.0 -15:47:45,263.8756,35.367,35.872,38.259,35.0 -15:47:45,263.9235,35.395,35.816,37.745,35.0 -15:47:45,263.9694,35.423,35.844,38.193,35.0 -15:47:45,264.0166,35.423,35.732,37.198,35.0 -15:47:45,264.0637,35.423,35.816,39.09,35.0 -15:47:45,264.1090,35.339,35.844,37.614,35.0 -15:47:45,264.1587,35.479,35.844,38.545,35.0 -15:47:45,264.2091,35.423,35.872,36.103,35.0 -15:47:45,264.2597,35.395,35.816,36.547,35.0 -15:47:45,264.3095,35.367,35.844,37.954,35.0 -15:47:45,264.3593,35.395,35.844,37.92,35.0 -15:47:45,264.4091,35.395,35.732,37.404,35.0 -15:47:45,264.4598,35.423,35.844,39.295,35.0 -15:47:45,264.5111,35.395,35.844,36.854,35.0 -15:47:45,264.5615,35.423,35.844,37.299,35.0 -15:47:45,264.6108,35.395,35.844,36.781,35.0 -15:47:45,264.6617,35.311,35.844,37.228,35.0 -15:47:45,264.7131,35.367,35.872,38.636,35.0 -15:47:45,264.7607,35.395,35.844,37.157,35.0 -15:47:46,264.8128,35.367,35.844,37.124,35.0 -15:47:46,264.8634,35.395,35.844,37.569,35.0 -15:47:46,264.9120,35.423,35.844,37.052,35.0 -15:47:46,264.9623,35.423,35.957,36.536,35.0 -15:47:46,265.0147,35.423,35.844,34.556,35.0 -15:47:46,265.0655,35.395,35.844,36.459,35.0 -15:47:46,265.1219,35.395,35.844,36.904,35.0 -15:47:46,265.1711,35.367,35.844,36.863,35.0 -15:47:46,265.2207,35.395,35.844,37.31,35.0 -15:47:46,265.2691,35.395,35.844,36.794,35.0 -15:47:46,265.3188,35.423,35.844,36.76,35.0 -15:47:46,265.3674,35.395,35.872,36.243,35.0 -15:47:46,265.4173,35.451,35.816,36.208,35.0 -15:47:46,265.4666,35.367,35.844,36.172,35.0 -15:47:46,265.5153,35.395,35.816,37.1,35.0 -15:47:46,265.5628,35.423,35.844,37.066,35.0 -15:47:46,265.6124,35.339,35.844,36.07,35.0 -15:47:46,265.6625,35.395,35.844,37.479,35.0 -15:47:46,265.7125,35.367,35.844,36.482,35.0 -15:47:46,265.7626,35.395,35.844,36.928,35.0 -15:47:47,265.8095,35.395,35.816,36.412,35.0 -15:47:47,265.8607,35.423,35.844,36.86,35.0 -15:47:47,265.9106,35.395,35.844,35.861,35.0 -15:47:47,265.9596,35.395,35.816,36.307,35.0 -15:47:47,266.0096,35.395,35.844,36.754,35.0 -15:47:47,266.0603,35.395,35.844,36.238,35.0 -15:47:47,266.1116,35.423,35.844,36.202,35.0 -15:47:47,266.1629,35.367,35.872,35.684,35.0 -15:47:47,266.2112,35.367,35.844,36.128,35.0 -15:47:47,266.2618,35.395,35.844,36.576,35.0 -15:47:47,266.3116,35.367,35.844,36.059,35.0 -15:47:47,266.3609,35.423,35.816,36.505,35.0 -15:47:47,266.4106,35.339,35.844,35.99,35.0 -15:47:47,266.4597,35.423,35.872,36.917,35.0 -15:47:47,266.5064,35.395,35.844,34.958,35.0 -15:47:47,266.5527,35.395,35.844,35.887,35.0 -15:47:47,266.6018,35.395,35.816,35.854,35.0 -15:47:47,266.6497,35.423,35.844,36.301,35.0 -15:47:47,266.6956,35.395,35.844,35.305,35.0 -15:47:47,266.7432,35.423,35.788,35.753,35.0 -15:47:47,266.7899,35.367,35.844,36.201,35.0 -15:47:48,266.8355,35.395,35.844,36.169,35.0 -15:47:48,266.8816,35.367,35.844,35.656,35.0 -15:47:48,266.9272,35.339,35.844,36.104,35.0 -15:47:48,266.9746,35.367,35.732,36.555,35.0 -15:47:48,267.0222,35.367,35.872,37.967,35.0 -15:47:48,267.0681,35.395,35.844,35.53,35.0 -15:47:48,267.1135,35.395,35.844,35.497,35.0 -15:47:48,267.1805,35.395,35.844,35.465,35.0 -15:47:48,267.2267,35.451,35.816,35.417,35.0 -15:47:48,267.2730,35.367,35.844,34.903,35.0 -15:47:48,267.3187,35.283,35.844,35.833,35.0 -15:47:48,267.3636,35.395,35.844,37.246,35.0 -15:47:48,267.4098,35.395,35.844,35.291,35.0 -15:47:48,267.4575,35.367,35.844,35.258,35.0 -15:47:48,267.5052,35.367,35.816,35.706,35.0 -15:47:48,267.5530,35.395,35.872,36.155,35.0 -15:47:48,267.5984,35.367,35.844,34.677,35.0 -15:47:48,267.6443,35.395,35.844,35.608,35.0 -15:47:48,267.6917,35.367,35.901,35.095,35.0 -15:47:48,267.7383,35.395,35.872,34.562,35.0 -15:47:48,267.7835,35.367,35.844,34.546,35.0 -15:47:49,267.8291,35.395,35.844,35.476,35.0 -15:47:49,267.8748,35.339,35.844,34.963,35.0 -15:47:49,267.9230,35.395,35.844,35.894,35.0 -15:47:49,267.9688,35.367,35.872,34.898,35.0 -15:47:49,268.0143,35.395,35.872,34.865,35.0 -15:47:49,268.0598,35.479,35.844,34.352,35.0 -15:47:49,268.1082,35.395,35.844,33.356,35.0 -15:47:49,268.1554,35.395,35.76,34.764,35.0 -15:47:49,268.2006,35.367,35.816,36.175,35.0 -15:47:49,268.2465,35.395,35.844,35.664,35.0 -15:47:49,268.2916,35.395,35.816,34.67,35.0 -15:47:49,268.3391,35.395,35.844,35.119,35.0 -15:47:49,268.3853,35.423,35.844,34.605,35.0 -15:47:49,268.4327,35.395,35.844,34.091,35.0 -15:47:49,268.4794,35.283,35.844,34.538,35.0 -15:47:49,268.5248,35.367,35.844,36.431,35.0 -15:47:49,268.5711,35.395,35.844,34.957,35.0 -15:47:49,268.6186,35.367,35.844,34.444,35.0 -15:47:49,268.6667,35.395,35.844,34.892,35.0 -15:47:49,268.7135,35.395,35.844,34.377,35.0 -15:47:49,268.7580,35.367,35.816,34.344,35.0 -15:47:49,268.8060,35.395,35.844,35.275,35.0 -15:47:50,268.8515,35.423,35.844,34.28,35.0 -15:47:50,268.8973,35.367,35.901,33.766,35.0 -15:47:50,268.9451,35.367,35.816,33.715,35.0 -15:47:50,268.9922,35.423,35.844,35.142,35.0 -15:47:50,269.0584,35.367,35.844,33.666,35.0 -15:47:50,269.1182,35.367,35.844,34.58,35.0 -15:47:50,269.1700,35.339,35.816,34.54,35.0 -15:47:50,269.2241,35.367,35.816,35.468,35.0 -15:47:50,269.2775,35.367,35.844,34.951,35.0 -15:47:50,269.3262,35.367,35.816,34.433,35.0 -15:47:50,269.3758,35.395,35.816,34.881,35.0 -15:47:50,269.4234,35.423,35.816,34.366,35.0 -15:47:50,269.4719,35.395,35.816,33.851,35.0 -15:47:50,269.5187,35.339,35.844,34.299,35.0 -15:47:50,269.5648,35.367,35.816,34.748,35.0 -15:47:50,269.6130,35.367,35.816,34.717,35.0 -15:47:50,269.6597,35.339,35.844,34.684,35.0 -15:47:50,269.7069,35.311,35.872,34.653,35.0 -15:47:50,269.7555,35.367,35.872,34.621,35.0 -15:47:50,269.8023,35.367,35.816,33.625,35.0 -15:47:51,269.8486,35.367,35.844,34.555,35.0 -15:47:51,269.8946,35.395,35.816,34.042,35.0 -15:47:51,269.9431,35.367,35.816,34.01,35.0 -15:47:51,269.9924,35.395,35.816,34.457,35.0 -15:47:51,270.0405,35.339,35.844,33.943,35.0 -15:47:51,270.0875,35.367,35.844,34.391,35.0 -15:47:51,270.1332,35.423,35.816,33.878,35.0 -15:47:51,270.1788,35.367,35.816,33.365,35.0 -15:47:51,270.2319,35.395,35.816,34.296,35.0 -15:47:51,270.2842,35.395,35.844,33.778,35.0 -15:47:51,270.3323,35.395,35.872,33.261,35.0 -15:47:51,270.3826,35.395,35.816,32.743,35.0 -15:47:51,270.4307,35.367,35.872,33.671,35.0 -15:47:51,270.4783,35.395,35.816,33.157,35.0 -15:47:51,270.5334,35.367,35.872,33.605,35.0 -15:47:51,270.6107,35.339,35.844,33.084,35.0 -15:47:51,270.6824,35.367,35.816,33.993,35.0 -15:47:51,270.7603,35.395,35.816,33.943,35.0 -15:47:52,270.8211,35.395,35.816,33.409,35.0 -15:47:52,270.8781,35.367,35.844,33.367,35.0 -15:47:52,270.9521,35.367,35.816,33.329,35.0 -15:47:52,271.0068,35.367,35.844,33.76,35.0 -15:47:52,271.0746,35.367,35.844,33.239,35.0 -15:47:52,271.1333,35.339,35.816,33.194,35.0 -15:47:52,271.1929,35.339,35.844,34.116,35.0 -15:47:52,271.2477,35.339,35.788,33.596,35.0 -15:47:52,271.3076,35.367,35.816,34.523,35.0 -15:47:52,271.3655,35.367,35.929,33.52,35.0 -15:47:52,271.4226,35.395,35.788,31.537,35.0 -15:47:52,271.4802,35.367,35.788,33.439,35.0 -15:47:52,271.5317,35.367,35.816,33.882,35.0 -15:47:52,271.5793,35.367,35.816,33.367,35.0 -15:47:52,271.6256,35.395,35.788,33.335,35.0 -15:47:52,271.6762,35.395,35.816,33.303,35.0 -15:47:52,271.7237,35.339,35.816,32.787,35.0 -15:47:52,271.7705,35.367,35.844,33.718,35.0 -15:47:53,271.8166,35.395,35.844,32.724,35.0 -15:47:53,271.8806,35.311,35.816,32.21,35.0 -15:47:53,271.9284,35.367,35.816,34.093,35.0 -15:47:53,271.9746,35.367,35.816,33.098,35.0 -15:47:53,272.0222,35.395,35.76,33.067,35.0 -15:47:53,272.0692,35.339,35.844,33.517,35.0 -15:47:53,272.1212,35.367,35.816,33.004,35.0 -15:47:53,272.1722,35.367,35.844,32.967,35.0 -15:47:53,272.2202,35.339,35.816,32.453,35.0 -15:47:53,272.2672,35.367,35.788,33.383,35.0 -15:47:53,272.3137,35.311,35.816,33.352,35.0 -15:47:53,272.3596,35.367,35.816,33.803,35.0 -15:47:53,272.4078,35.395,35.816,32.81,35.0 -15:47:53,272.4630,35.367,35.788,32.292,35.0 -15:47:53,272.5117,35.367,35.816,33.221,35.0 -15:47:53,272.5598,35.395,35.816,32.708,35.0 -15:47:53,272.6086,35.367,35.816,32.193,35.0 -15:47:53,272.6590,35.367,35.844,32.641,35.0 -15:47:53,272.7084,35.339,35.816,32.126,35.0 -15:47:53,272.7581,35.339,35.816,33.055,35.0 -15:47:53,272.8076,35.395,35.816,33.022,35.0 -15:47:54,272.8565,35.367,35.816,32.026,35.0 -15:47:54,272.9057,35.395,35.816,32.474,35.0 -15:47:54,272.9568,35.339,35.816,31.959,35.0 -15:47:54,273.0058,35.367,35.816,32.887,35.0 -15:47:54,273.0567,35.367,35.844,32.373,35.0 -15:47:54,273.1065,35.339,35.844,31.857,35.0 -15:47:54,273.1573,35.339,35.844,32.304,35.0 -15:47:54,273.2060,35.339,35.816,32.27,35.0 -15:47:54,273.2559,35.367,35.788,32.718,35.0 -15:47:54,273.3058,35.367,35.816,32.686,35.0 -15:47:54,273.3557,35.283,35.844,32.171,35.0 -15:47:54,273.4044,35.367,35.844,33.1,35.0 -15:47:54,273.4527,35.339,35.844,31.624,35.0 -15:47:54,273.5003,35.311,35.816,32.072,35.0 -15:47:54,273.5498,35.339,35.844,33.003,35.0 -15:47:54,273.5976,35.339,35.788,32.008,35.0 -15:47:54,273.6460,35.339,35.844,32.939,35.0 -15:47:54,273.6946,35.367,35.844,31.945,35.0 -15:47:54,273.7443,35.367,35.816,31.43,35.0 -15:47:54,273.7914,35.311,35.788,31.878,35.0 -15:47:55,273.8407,35.339,35.816,33.291,35.0 -15:47:55,273.8922,35.311,35.816,32.296,35.0 -15:47:55,273.9425,35.367,35.816,32.744,35.0 -15:47:55,273.9910,35.311,35.816,31.748,35.0 -15:47:55,274.0406,35.367,35.732,32.679,35.0 -15:47:55,274.0905,35.339,35.788,33.129,35.0 -15:47:55,274.1421,35.339,35.844,32.616,35.0 -15:47:55,274.1905,35.311,35.788,31.619,35.0 -15:47:55,274.2425,35.311,35.816,33.031,35.0 -15:47:55,274.2924,35.339,35.788,32.517,35.0 -15:47:55,274.3413,35.311,35.816,32.485,35.0 -15:47:55,274.3906,35.339,35.816,32.453,35.0 -15:47:55,274.4405,35.339,35.732,31.94,35.0 -15:47:55,274.4896,35.367,35.788,33.352,35.0 -15:47:55,274.5394,35.339,35.816,31.877,35.0 -15:47:55,274.5887,35.339,35.788,31.844,35.0 -15:47:55,274.6364,35.367,35.816,32.293,35.0 -15:47:55,274.6856,35.339,35.816,31.3,35.0 -15:47:55,274.7336,35.367,35.76,31.748,35.0 -15:47:55,274.7827,35.311,35.816,32.197,35.0 -15:47:56,274.8324,35.367,35.816,32.166,35.0 -15:47:56,274.8819,35.339,35.816,31.171,35.0 -15:47:56,274.9324,35.339,35.788,31.619,35.0 -15:47:56,274.9816,35.367,35.816,32.067,35.0 -15:47:56,275.0304,35.255,35.788,31.073,35.0 -15:47:56,275.0911,35.395,35.816,33.446,35.0 -15:47:56,275.1433,35.367,35.816,30.519,35.0 -15:47:56,275.1918,35.311,35.816,30.966,35.0 -15:47:56,275.2385,35.395,35.844,31.897,35.0 -15:47:56,275.2882,35.311,35.816,29.941,35.0 -15:47:56,275.3366,35.311,35.76,31.832,35.0 -15:47:56,275.3845,35.283,35.816,32.764,35.0 -15:47:56,275.4335,35.283,35.844,32.253,35.0 -15:47:56,275.4819,35.367,35.844,31.741,35.0 -15:47:56,275.5308,35.339,35.816,30.265,35.0 -15:47:56,275.5788,35.339,35.788,31.194,35.0 -15:47:56,275.6280,35.367,35.788,31.644,35.0 -15:47:56,275.6777,35.367,35.816,31.131,35.0 -15:47:56,275.7255,35.367,35.788,30.616,35.0 -15:47:56,275.7750,35.311,35.816,31.066,35.0 -15:47:57,275.8247,35.339,35.816,31.515,35.0 -15:47:57,275.8751,35.311,35.76,31.001,35.0 -15:47:57,275.9243,35.339,35.76,32.413,35.0 -15:47:57,275.9745,35.339,35.816,31.901,35.0 -15:47:57,276.0259,35.339,35.816,30.906,35.0 -15:47:57,276.0770,35.311,35.788,30.872,35.0 -15:47:57,276.1250,35.339,35.816,31.802,35.0 -15:47:57,276.1748,35.311,35.788,30.808,35.0 -15:47:57,276.2254,35.339,35.788,31.739,35.0 -15:47:57,276.2756,35.339,35.732,31.225,35.0 -15:47:57,276.3255,35.339,35.844,32.156,35.0 -15:47:57,276.3754,35.339,35.788,30.199,35.0 -15:47:57,276.4249,35.311,35.816,31.129,35.0 -15:47:57,276.4746,35.339,35.816,31.097,35.0 -15:47:57,276.5267,35.339,35.844,30.584,35.0 -15:47:57,276.5773,35.339,35.816,30.067,35.0 -15:47:57,276.6256,35.283,35.872,30.515,35.0 -15:47:57,276.6778,35.367,35.816,30.483,35.0 -15:47:57,276.7268,35.283,35.816,29.967,35.0 -15:47:57,276.7745,35.311,35.816,31.378,35.0 -15:47:58,276.8225,35.367,35.816,30.867,35.0 -15:47:58,276.8716,35.367,35.816,29.873,35.0 -15:47:58,276.9190,35.311,35.816,29.84,35.0 -15:47:58,276.9679,35.311,35.816,30.77,35.0 -15:47:58,277.0143,35.311,35.76,30.739,35.0 -15:47:58,277.0606,35.339,35.816,31.673,35.0 -15:47:58,277.1059,35.311,35.816,30.2,35.0 -15:47:58,277.1545,35.311,35.816,30.651,35.0 -15:47:58,277.2036,35.339,35.788,30.62,35.0 -15:47:58,277.2524,35.339,35.788,30.588,35.0 -15:47:58,277.2981,35.339,35.76,30.557,35.0 -15:47:58,277.3444,35.311,35.788,31.009,35.0 -15:47:58,277.3903,35.339,35.788,30.98,35.0 -15:47:58,277.4378,35.339,35.816,30.47,35.0 -15:47:58,277.4850,35.339,35.704,29.958,35.0 -15:47:58,277.5307,35.311,35.816,31.853,35.0 -15:47:58,277.5781,35.311,35.844,30.381,35.0 -15:47:58,277.6269,35.311,35.788,29.869,35.0 -15:47:58,277.6742,35.367,35.76,30.8,35.0 -15:47:58,277.7211,35.339,35.76,30.289,35.0 -15:47:58,277.7696,35.311,35.788,30.74,35.0 -15:47:59,277.8188,35.311,35.788,30.71,35.0 -15:47:59,277.8662,35.367,35.788,30.679,35.0 -15:47:59,277.9132,35.255,35.816,29.686,35.0 -15:47:59,277.9616,35.339,35.788,31.099,35.0 -15:47:59,278.0068,35.339,35.816,30.107,35.0 -15:47:59,278.0539,35.311,35.788,29.596,35.0 -15:47:59,278.1036,35.311,35.816,30.528,35.0 -15:47:59,278.1505,35.311,35.844,30.015,35.0 -15:47:59,278.1961,35.339,35.788,29.504,35.0 -15:47:59,278.2427,35.311,35.788,29.955,35.0 -15:47:59,278.2906,35.311,35.816,30.407,35.0 -15:47:59,278.3380,35.311,35.76,29.895,35.0 -15:47:59,278.3865,35.339,35.788,30.828,35.0 -15:47:59,278.4320,35.283,35.816,29.835,35.0 -15:47:59,278.4799,35.339,35.788,30.287,35.0 -15:47:59,278.5263,35.339,35.788,29.775,35.0 -15:47:59,278.5719,35.339,35.788,29.746,35.0 -15:47:59,278.6187,35.311,35.816,29.716,35.0 -15:47:59,278.6646,35.311,35.788,29.686,35.0 -15:47:59,278.7105,35.311,35.816,30.138,35.0 -15:47:59,278.7578,35.311,35.788,29.628,35.0 -15:47:59,278.8044,35.311,35.788,30.079,35.0 -15:48:00,278.8558,35.311,35.816,30.049,35.0 -15:48:00,278.9027,35.311,35.788,29.536,35.0 -15:48:00,278.9537,35.339,35.788,29.987,35.0 -15:48:00,279.0017,35.311,35.816,29.473,35.0 -15:48:00,279.0485,35.311,35.788,29.443,35.0 -15:48:00,279.0982,35.311,35.816,29.894,35.0 -15:48:00,279.1473,35.311,35.788,29.381,35.0 -15:48:00,279.1955,35.311,35.76,29.831,35.0 -15:48:00,279.2445,35.283,35.788,30.283,35.0 -15:48:00,279.2938,35.283,35.816,30.252,35.0 -15:48:00,279.3433,35.311,35.816,29.741,35.0 -15:48:00,279.3917,35.311,35.844,29.228,35.0 -15:48:00,279.4406,35.311,35.816,28.715,35.0 -15:48:00,279.4916,35.283,35.788,29.165,35.0 -15:48:00,279.5414,35.311,35.788,30.095,35.0 -15:48:00,279.5920,35.311,35.788,29.583,35.0 -15:48:00,279.6418,35.339,35.788,29.551,35.0 -15:48:00,279.6925,35.311,35.788,29.038,35.0 -15:48:00,279.7393,35.339,35.788,29.487,35.0 -15:48:00,279.7893,35.311,35.816,28.977,35.0 -15:48:01,279.8385,35.283,35.816,28.944,35.0 -15:48:01,279.8901,35.283,35.788,29.394,35.0 -15:48:01,279.9404,35.311,35.788,29.843,35.0 -15:48:01,279.9915,35.311,35.76,29.331,35.0 -15:48:01,280.0410,35.255,35.788,29.78,35.0 -15:48:01,280.0901,35.367,35.816,30.232,35.0 -15:48:01,280.1385,35.339,35.788,27.794,35.0 -15:48:01,280.1870,35.311,35.816,28.725,35.0 -15:48:01,280.2358,35.311,35.816,28.694,35.0 -15:48:01,280.2837,35.311,35.788,28.663,35.0 -15:48:01,280.3294,35.311,35.76,29.113,35.0 -15:48:01,280.3768,35.339,35.788,29.566,35.0 -15:48:01,280.4227,35.311,35.788,28.574,35.0 -15:48:01,280.4702,35.339,35.788,29.026,35.0 -15:48:01,280.5164,35.339,35.76,28.515,35.0 -15:48:01,280.5625,35.255,35.788,28.967,35.0 -15:48:01,280.6097,35.255,35.788,29.901,35.0 -15:48:01,280.6581,35.283,35.788,29.873,35.0 -15:48:01,280.7068,35.311,35.788,29.362,35.0 -15:48:01,280.7543,35.311,35.788,28.851,35.0 -15:48:01,280.8010,35.311,35.76,28.821,35.0 -15:48:02,280.8479,35.367,35.788,29.273,35.0 -15:48:02,280.8962,35.311,35.76,27.8,35.0 -15:48:02,280.9444,35.283,35.788,29.213,35.0 -15:48:02,280.9898,35.283,35.816,29.183,35.0 -15:48:02,281.0376,35.283,35.76,28.674,35.0 -15:48:02,281.0876,35.339,35.788,29.607,35.0 -15:48:02,281.1361,35.283,35.788,28.132,35.0 -15:48:02,281.1826,35.283,35.76,29.064,35.0 -15:48:02,281.2301,35.283,35.788,29.517,35.0 -15:48:02,281.2797,35.283,35.788,29.007,35.0 -15:48:02,281.3266,35.283,35.788,28.977,35.0 -15:48:02,281.3732,35.367,35.788,28.949,35.0 -15:48:02,281.4223,35.283,35.76,27.475,35.0 -15:48:02,281.4711,35.311,35.788,29.369,35.0 -15:48:02,281.5208,35.283,35.76,28.377,35.0 -15:48:02,281.5706,35.311,35.704,29.309,35.0 -15:48:02,281.6187,35.283,35.788,29.761,35.0 -15:48:02,281.6669,35.311,35.76,28.77,35.0 -15:48:02,281.7170,35.311,35.788,28.74,35.0 -15:48:02,281.7667,35.283,35.816,28.228,35.0 -15:48:03,281.8175,35.283,35.704,28.197,35.0 -15:48:03,281.8692,35.283,35.788,30.092,35.0 -15:48:03,281.9165,35.283,35.788,28.617,35.0 -15:48:03,281.9642,35.311,35.788,28.589,35.0 -15:48:03,282.0120,35.283,35.788,28.078,35.0 -15:48:03,282.0655,35.199,35.788,28.528,35.0 -15:48:03,282.1136,35.311,35.788,29.941,35.0 -15:48:03,282.1611,35.255,35.788,27.988,35.0 -15:48:03,282.2083,35.255,35.816,28.922,35.0 -15:48:03,282.2565,35.283,35.76,28.412,35.0 -15:48:03,282.3046,35.283,35.788,28.864,35.0 -15:48:03,282.3516,35.283,35.704,28.354,35.0 -15:48:03,282.3973,35.255,35.788,29.77,35.0 -15:48:03,282.4428,35.255,35.788,28.781,35.0 -15:48:03,282.4893,35.283,35.76,28.754,35.0 -15:48:03,282.5370,35.395,35.76,28.726,35.0 -15:48:03,282.5864,35.283,35.76,26.771,35.0 -15:48:03,282.6314,35.255,35.76,28.665,35.0 -15:48:03,282.6785,35.255,35.788,29.12,35.0 -15:48:03,282.7241,35.283,35.788,28.611,35.0 -15:48:03,282.7714,35.227,35.788,28.102,35.0 -15:48:04,282.8197,35.255,35.788,29.036,35.0 -15:48:04,282.8677,35.283,35.76,28.527,35.0 -15:48:04,282.9159,35.283,35.76,28.498,35.0 -15:48:04,282.9629,35.283,35.76,28.47,35.0 -15:48:04,283.0108,35.283,35.788,28.442,35.0 -15:48:04,283.0571,35.255,35.76,27.931,35.0 -15:48:04,283.1052,35.311,35.76,28.866,35.0 -15:48:04,283.1525,35.199,35.788,27.875,35.0 -15:48:04,283.2003,35.255,35.788,29.291,35.0 -15:48:04,283.2465,35.255,35.788,28.301,35.0 -15:48:04,283.2930,35.255,35.76,28.273,35.0 -15:48:04,283.3385,35.311,35.76,28.727,35.0 -15:48:04,283.3864,35.255,35.732,27.738,35.0 -15:48:04,283.4320,35.227,35.788,29.153,35.0 -15:48:04,283.4790,35.255,35.76,28.646,35.0 -15:48:04,283.5264,35.283,35.76,28.619,35.0 -15:48:04,283.5716,35.227,35.76,28.11,35.0 -15:48:04,283.6193,35.311,35.76,29.046,35.0 -15:48:04,283.6664,35.283,35.76,27.574,35.0 -15:48:04,283.7135,35.227,35.732,28.027,35.0 -15:48:04,283.7590,35.255,35.732,29.444,35.0 -15:48:04,283.8042,35.255,35.76,28.937,35.0 -15:48:05,283.8517,35.255,35.76,28.43,35.0 -15:48:05,283.8989,35.227,35.76,28.403,35.0 -15:48:05,283.9459,35.283,35.76,28.857,35.0 -15:48:05,283.9922,35.283,35.76,27.867,35.0 -15:48:05,284.0379,35.227,35.732,27.84,35.0 -15:48:05,284.0853,35.227,35.76,29.257,35.0 -15:48:05,284.1323,35.255,35.788,28.75,35.0 -15:48:05,284.1776,35.255,35.76,27.76,35.0 -15:48:05,284.2235,35.255,35.732,28.214,35.0 -15:48:05,284.2706,35.255,35.76,28.669,35.0 -15:48:05,284.3197,35.227,35.788,28.161,35.0 -15:48:05,284.3685,35.255,35.732,28.133,35.0 -15:48:05,284.4146,35.255,35.76,28.586,35.0 -15:48:05,284.4606,35.283,35.76,28.079,35.0 -15:48:05,284.5078,35.255,35.76,27.57,35.0 -15:48:05,284.5563,35.255,35.76,28.024,35.0 -15:48:05,284.6047,35.227,35.76,27.996,35.0 -15:48:05,284.6527,35.255,35.732,28.449,35.0 -15:48:05,284.7020,35.255,35.76,28.422,35.0 -15:48:05,284.7500,35.255,35.76,27.913,35.0 -15:48:05,284.7973,35.283,35.76,27.885,35.0 -15:48:06,284.8463,35.255,35.704,27.376,35.0 -15:48:06,284.8956,35.255,35.732,28.791,35.0 -15:48:06,284.9435,35.255,35.76,28.283,35.0 -15:48:06,284.9913,35.255,35.76,27.774,35.0 -15:48:06,285.0382,35.227,35.732,27.747,35.0 -15:48:06,285.0864,35.255,35.76,28.683,35.0 -15:48:06,285.1360,35.227,35.76,27.693,35.0 -15:48:06,285.1855,35.255,35.704,28.146,35.0 -15:48:06,285.2421,35.255,35.76,28.599,35.0 -15:48:06,285.2969,35.227,35.76,27.604,35.0 -15:48:06,285.3492,35.283,35.704,28.055,35.0 -15:48:06,285.3987,35.255,35.732,28.025,35.0 -15:48:06,285.4477,35.283,35.732,27.997,35.0 -15:48:06,285.4940,35.283,35.76,27.488,35.0 -15:48:06,285.5541,35.255,35.76,26.98,35.0 -15:48:06,285.6410,35.255,35.704,27.424,35.0 -15:48:06,285.7065,35.283,35.732,28.34,35.0 -15:48:06,285.7727,35.227,35.732,27.34,35.0 -15:48:07,285.8377,35.255,35.732,28.265,35.0 -15:48:07,285.9013,35.227,35.76,27.748,35.0 -15:48:07,285.9630,35.283,35.732,27.711,35.0 -15:48:07,286.0245,35.255,35.732,27.196,35.0 -15:48:07,286.0884,35.283,35.732,27.64,35.0 -15:48:07,286.1527,35.255,35.732,27.124,35.0 -15:48:07,286.2194,35.255,35.732,27.569,35.0 -15:48:07,286.2783,35.227,35.76,27.53,35.0 -15:48:07,286.3356,35.227,35.732,27.497,35.0 -15:48:07,286.3905,35.255,35.704,27.947,35.0 -15:48:07,286.4437,35.227,35.76,27.917,35.0 -15:48:07,286.4976,35.227,35.76,27.406,35.0 -15:48:07,286.5565,35.255,35.732,27.374,35.0 -15:48:07,286.6078,35.227,35.76,27.343,35.0 -15:48:07,286.6583,35.255,35.732,27.314,35.0 -15:48:07,286.7081,35.171,35.732,27.285,35.0 -15:48:07,286.7575,35.255,35.732,28.702,35.0 -15:48:08,286.8084,35.255,35.647,27.232,35.0 -15:48:08,286.8661,35.255,35.732,28.665,35.0 -15:48:08,286.9338,35.255,35.704,27.17,35.0 -15:48:08,286.9844,35.227,35.76,27.617,35.0 -15:48:08,287.0299,35.227,35.788,27.108,35.0 -15:48:08,287.0767,35.255,35.675,26.6,35.0 -15:48:08,287.1246,35.227,35.732,28.035,35.0 -15:48:08,287.1770,35.255,35.732,27.511,35.0 -15:48:08,287.2265,35.199,35.732,27.0,35.0 -15:48:08,287.2731,35.227,35.76,27.936,35.0 -15:48:08,287.3233,35.255,35.732,26.948,35.0 -15:48:08,287.3739,35.227,35.76,26.919,35.0 -15:48:08,287.4234,35.227,35.732,26.891,35.0 -15:48:08,287.4716,35.227,35.732,27.345,35.0 -15:48:08,287.5196,35.227,35.732,27.318,35.0 -15:48:08,287.5704,35.227,35.788,27.292,35.0 -15:48:08,287.6189,35.311,35.732,26.301,35.0 -15:48:08,287.6666,35.227,35.76,25.791,35.0 -15:48:08,287.7195,35.199,35.732,26.725,35.0 -15:48:08,287.7691,35.199,35.704,27.659,35.0 -15:48:09,287.8247,35.227,35.732,28.115,35.0 -15:48:09,287.8720,35.227,35.732,27.122,35.0 -15:48:09,287.9235,35.227,35.732,27.096,35.0 -15:48:09,287.9751,35.227,35.732,27.068,35.0 -15:48:09,288.0243,35.227,35.76,27.04,35.0 -15:48:09,288.0745,35.143,35.732,26.532,35.0 -15:48:09,288.1220,35.199,35.732,28.43,35.0 -15:48:09,288.1738,35.199,35.704,27.443,35.0 -15:48:09,288.2233,35.199,35.732,27.897,35.0 -15:48:09,288.2747,35.227,35.76,27.39,35.0 -15:48:09,288.3239,35.227,35.732,26.399,35.0 -15:48:09,288.3742,35.255,35.704,26.853,35.0 -15:48:09,288.4223,35.227,35.675,26.826,35.0 -15:48:09,288.4730,35.227,35.704,27.78,35.0 -15:48:09,288.5264,35.227,35.732,27.255,35.0 -15:48:09,288.5765,35.199,35.675,26.745,35.0 -15:48:09,288.6267,35.199,35.732,28.179,35.0 -15:48:09,288.6786,35.283,35.704,27.174,35.0 -15:48:09,288.7283,35.143,35.704,26.183,35.0 -15:48:09,288.7773,35.199,35.704,28.563,35.0 -15:48:10,288.8281,35.227,35.732,27.576,35.0 -15:48:10,288.8778,35.199,35.704,26.587,35.0 -15:48:10,288.9293,35.143,35.704,27.522,35.0 -15:48:10,288.9800,35.199,35.704,28.459,35.0 -15:48:10,289.0295,35.171,35.704,27.472,35.0 -15:48:10,289.0804,35.227,35.704,27.927,35.0 -15:48:10,289.1308,35.227,35.732,26.939,35.0 -15:48:10,289.1797,35.199,35.788,26.43,35.0 -15:48:10,289.2308,35.199,35.732,25.922,35.0 -15:48:10,289.2830,35.227,35.647,26.856,35.0 -15:48:10,289.3336,35.199,35.675,27.809,35.0 -15:48:10,289.3844,35.171,35.732,27.784,35.0 -15:48:10,289.4380,35.199,35.76,27.259,35.0 -15:48:10,289.4904,35.199,35.704,26.269,35.0 -15:48:10,289.5413,35.227,35.704,27.203,35.0 -15:48:10,289.5896,35.199,35.704,26.696,35.0 -15:48:10,289.6405,35.227,35.732,27.151,35.0 -15:48:10,289.6887,35.171,35.704,26.162,35.0 -15:48:10,289.7403,35.199,35.704,27.58,35.0 -15:48:10,289.7906,35.199,35.732,27.073,35.0 -15:48:11,289.8399,35.199,35.675,26.565,35.0 -15:48:11,289.8919,35.227,35.704,27.519,35.0 -15:48:11,289.9415,35.171,35.704,26.513,35.0 -15:48:11,289.9914,35.227,35.732,27.45,35.0 -15:48:11,290.0412,35.171,35.704,25.98,35.0 -15:48:11,290.1034,35.199,35.704,27.395,35.0 -15:48:11,290.1556,35.255,35.675,26.885,35.0 -15:48:11,290.2078,35.171,35.704,26.394,35.0 -15:48:11,290.2582,35.199,35.704,27.312,35.0 -15:48:11,290.3075,35.199,35.704,26.805,35.0 -15:48:11,290.3572,35.199,35.675,26.78,35.0 -15:48:11,290.4042,35.199,35.704,27.253,35.0 -15:48:11,290.4556,35.171,35.704,26.731,35.0 -15:48:11,290.5053,35.171,35.732,27.186,35.0 -15:48:11,290.5587,35.171,35.675,26.679,35.0 -15:48:11,290.6080,35.171,35.675,27.632,35.0 -15:48:11,290.6587,35.171,35.704,27.609,35.0 -15:48:11,290.7089,35.199,35.704,27.085,35.0 -15:48:11,290.7575,35.199,35.76,26.578,35.0 -15:48:11,290.8048,35.171,35.704,25.59,35.0 -15:48:12,290.8560,35.199,35.704,27.009,35.0 -15:48:12,290.9076,35.227,35.675,26.502,35.0 -15:48:12,290.9573,35.171,35.704,26.492,35.0 -15:48:12,291.0056,35.171,35.704,26.931,35.0 -15:48:12,291.0555,35.143,35.704,26.907,35.0 -15:48:12,291.1075,35.143,35.675,27.364,35.0 -15:48:12,291.1575,35.171,35.704,27.837,35.0 -15:48:12,291.2074,35.171,35.675,26.834,35.0 -15:48:12,291.2564,35.143,35.647,27.308,35.0 -15:48:12,291.3044,35.227,35.675,28.247,35.0 -15:48:12,291.3576,35.115,35.675,26.299,35.0 -15:48:12,291.4058,35.171,35.675,28.198,35.0 -15:48:12,291.4566,35.171,35.675,27.213,35.0 -15:48:12,291.5050,35.199,35.675,27.189,35.0 -15:48:12,291.5581,35.171,35.675,26.684,35.0 -15:48:12,291.6082,35.143,35.704,27.139,35.0 -15:48:12,291.6573,35.171,35.647,27.098,35.0 -15:48:12,291.7053,35.171,35.704,27.573,35.0 -15:48:12,291.7573,35.171,35.675,26.57,35.0 -15:48:12,291.8067,35.199,35.675,27.043,35.0 -15:48:13,291.8565,35.143,35.675,26.537,35.0 -15:48:13,291.9060,35.199,35.675,27.476,35.0 -15:48:13,291.9576,35.171,35.675,26.489,35.0 -15:48:13,292.0062,35.199,35.675,26.945,35.0 -15:48:13,292.0552,35.143,35.704,26.44,35.0 -15:48:13,292.1078,35.171,35.732,26.88,35.0 -15:48:13,292.1588,35.199,35.675,25.891,35.0 -15:48:13,292.2089,35.171,35.647,26.364,35.0 -15:48:13,292.2590,35.171,35.675,27.302,35.0 -15:48:13,292.3086,35.143,35.675,26.797,35.0 -15:48:13,292.3578,35.199,35.647,27.255,35.0 -15:48:13,292.4064,35.171,35.675,26.75,35.0 -15:48:13,292.4541,35.171,35.704,26.727,35.0 -15:48:13,292.5036,35.171,35.675,26.205,35.0 -15:48:13,292.5567,35.171,35.675,26.679,35.0 -15:48:13,292.6068,35.143,35.675,26.653,35.0 -15:48:13,292.6579,35.143,35.675,27.11,35.0 -15:48:13,292.7085,35.115,35.647,27.087,35.0 -15:48:13,292.7583,35.143,35.675,28.026,35.0 -15:48:14,292.8080,35.227,35.675,27.041,35.0 -15:48:14,292.8594,35.143,35.675,25.573,35.0 -15:48:14,292.9110,35.171,35.675,26.992,35.0 -15:48:14,292.9626,35.143,35.704,26.486,35.0 -15:48:14,293.0125,35.171,35.675,26.444,35.0 -15:48:14,293.0633,35.171,35.619,26.437,35.0 -15:48:14,293.1145,35.171,35.675,27.376,35.0 -15:48:14,293.1635,35.171,35.675,26.389,35.0 -15:48:14,293.2119,35.143,35.619,26.366,35.0 -15:48:14,293.2620,35.143,35.675,27.787,35.0 -15:48:14,293.3113,35.143,35.675,26.802,35.0 -15:48:14,293.3612,35.143,35.675,26.779,35.0 -15:48:14,293.4115,35.171,35.704,26.756,35.0 -15:48:14,293.4631,35.143,35.675,25.752,35.0 -15:48:14,293.5117,35.199,35.675,26.706,35.0 -15:48:14,293.5613,35.115,35.675,25.72,35.0 -15:48:14,293.6121,35.115,35.704,27.14,35.0 -15:48:14,293.6625,35.115,35.675,26.619,35.0 -15:48:14,293.7123,35.171,35.675,27.094,35.0 -15:48:14,293.7626,35.143,35.675,26.108,35.0 -15:48:15,293.8118,35.143,35.704,26.566,35.0 -15:48:15,293.8623,35.143,35.647,26.044,35.0 -15:48:15,293.9120,35.227,35.647,27.0,35.0 -15:48:15,293.9621,35.115,35.647,25.533,35.0 -15:48:15,294.0137,35.143,35.647,27.434,35.0 -15:48:15,294.0640,35.143,35.647,26.93,35.0 -15:48:15,294.1137,35.171,35.732,26.907,35.0 -15:48:15,294.1645,35.143,35.675,24.941,35.0 -15:48:15,294.2151,35.143,35.675,26.377,35.0 -15:48:15,294.2672,35.171,35.647,26.353,35.0 -15:48:15,294.3195,35.143,35.647,26.329,35.0 -15:48:15,294.3722,35.115,35.647,26.786,35.0 -15:48:15,294.4227,35.115,35.647,27.244,35.0 -15:48:15,294.4719,35.115,35.675,27.222,35.0 -15:48:15,294.5230,35.115,35.647,26.719,35.0 -15:48:15,294.5719,35.143,35.647,27.178,35.0 -15:48:15,294.6230,35.143,35.647,26.675,35.0 -15:48:15,294.6726,35.143,35.647,26.652,35.0 -15:48:15,294.7219,35.171,35.647,26.629,35.0 -15:48:15,294.7700,35.115,35.647,26.126,35.0 -15:48:16,294.8186,35.115,35.647,27.066,35.0 -15:48:16,294.8687,35.087,35.675,27.045,35.0 -15:48:16,294.9187,35.143,35.619,27.024,35.0 -15:48:16,294.9697,35.143,35.647,27.002,35.0 -15:48:16,295.0194,35.087,35.647,26.498,35.0 -15:48:16,295.0692,35.115,35.619,27.439,35.0 -15:48:16,295.1196,35.143,35.675,27.418,35.0 -15:48:16,295.1701,35.143,35.647,25.952,35.0 -15:48:16,295.2206,35.087,35.619,26.41,35.0 -15:48:16,295.2704,35.171,35.647,27.832,35.0 -15:48:16,295.3202,35.087,35.647,25.885,35.0 -15:48:16,295.3704,35.115,35.675,27.307,35.0 -15:48:16,295.4220,35.143,35.647,26.323,35.0 -15:48:16,295.4727,35.115,35.647,26.299,35.0 -15:48:16,295.5208,35.115,35.675,26.758,35.0 -15:48:16,295.5712,35.143,35.647,26.256,35.0 -15:48:16,295.6209,35.171,35.647,26.233,35.0 -15:48:16,295.6716,35.143,35.619,25.729,35.0 -15:48:16,295.7222,35.143,35.647,26.668,35.0 -15:48:16,295.7703,35.115,35.647,26.165,35.0 -15:48:17,295.8192,35.115,35.647,26.625,35.0 -15:48:17,295.8700,35.143,35.619,26.603,35.0 -15:48:17,295.9203,35.171,35.619,26.581,35.0 -15:48:17,295.9707,35.115,35.647,26.078,35.0 -15:48:17,296.0195,35.115,35.647,26.537,35.0 -15:48:17,296.0685,35.115,35.675,26.516,35.0 -15:48:17,296.1204,35.115,35.619,26.012,35.0 -15:48:17,296.1717,35.087,35.647,26.952,35.0 -15:48:17,296.2197,35.143,35.675,26.931,35.0 -15:48:17,296.2694,35.115,35.619,25.466,35.0 -15:48:17,296.3199,35.199,35.704,26.888,35.0 -15:48:17,296.3707,35.087,35.647,23.959,35.0 -15:48:17,296.4216,35.115,35.647,26.84,35.0 -15:48:17,296.4688,35.087,35.563,26.337,35.0 -15:48:17,296.5197,35.115,35.675,28.243,35.0 -15:48:17,296.5691,35.059,35.647,25.816,35.0 -15:48:17,296.6183,35.087,35.647,27.238,35.0 -15:48:17,296.6688,35.087,35.619,26.737,35.0 -15:48:17,296.7196,35.115,35.619,27.197,35.0 -15:48:17,296.7689,35.087,35.647,26.696,35.0 -15:48:18,296.8175,35.087,35.675,26.675,35.0 -15:48:18,296.8675,35.087,35.619,26.173,35.0 -15:48:18,296.9179,35.087,35.647,27.114,35.0 -15:48:18,296.9682,35.115,35.619,26.612,35.0 -15:48:18,297.0182,35.087,35.647,26.591,35.0 -15:48:18,297.0677,35.115,35.619,26.57,35.0 -15:48:18,297.1175,35.143,35.619,26.549,35.0 -15:48:18,297.1675,35.087,35.591,26.047,35.0 -15:48:18,297.2172,35.115,35.619,27.47,35.0 -15:48:18,297.2679,35.115,35.619,26.487,35.0 -15:48:18,297.3195,35.087,35.591,26.466,35.0 -15:48:18,297.3698,35.115,35.647,27.408,35.0 -15:48:18,297.4193,35.059,35.619,25.944,35.0 -15:48:18,297.4691,35.115,35.647,27.367,35.0 -15:48:18,297.5186,35.087,35.591,25.903,35.0 -15:48:18,297.5690,35.059,35.619,27.326,35.0 -15:48:18,297.6198,35.115,35.619,27.307,35.0 -15:48:18,297.6698,35.087,35.619,26.324,35.0 -15:48:18,297.7190,35.059,35.619,26.784,35.0 -15:48:18,297.7680,35.087,35.591,27.246,35.0 -15:48:19,297.8172,35.087,35.619,27.227,35.0 -15:48:19,297.8677,35.087,35.647,26.727,35.0 -15:48:19,297.9192,35.087,35.647,26.225,35.0 -15:48:19,297.9699,35.087,35.619,26.203,35.0 -15:48:19,298.0201,35.087,35.619,26.663,35.0 -15:48:19,298.0707,35.087,35.619,26.643,35.0 -15:48:19,298.1217,35.087,35.647,26.623,35.0 -15:48:19,298.1722,35.143,35.619,26.12,35.0 -15:48:19,298.2226,35.087,35.619,25.618,35.0 -15:48:19,298.2730,35.087,35.619,26.559,35.0 -15:48:19,298.3227,35.115,35.591,26.539,35.0 -15:48:19,298.3727,35.115,35.591,26.519,35.0 -15:48:19,298.4232,35.087,35.619,26.498,35.0 -15:48:19,298.4732,35.087,35.619,26.478,35.0 -15:48:19,298.5236,35.059,35.619,26.458,35.0 -15:48:19,298.5725,35.059,35.619,26.919,35.0 -15:48:19,298.6220,35.143,35.619,26.9,35.0 -15:48:19,298.6717,35.087,35.591,25.436,35.0 -15:48:19,298.7226,35.087,35.619,26.859,35.0 -15:48:19,298.7722,35.087,35.619,26.358,35.0 -15:48:20,298.8222,35.115,35.591,26.338,35.0 -15:48:20,298.8726,35.059,35.591,26.318,35.0 -15:48:20,298.9235,35.087,35.591,27.261,35.0 -15:48:20,298.9737,35.087,35.619,26.76,35.0 -15:48:20,299.0234,35.059,35.619,26.259,35.0 -15:48:20,299.0727,35.087,35.619,26.721,35.0 -15:48:20,299.1234,35.087,35.591,26.22,35.0 -15:48:20,299.1756,35.059,35.591,26.681,35.0 -15:48:20,299.2252,35.087,35.591,27.143,35.0 -15:48:20,299.2727,35.059,35.619,26.643,35.0 -15:48:20,299.3503,35.087,35.591,26.621,35.0 -15:48:20,299.4037,35.115,35.619,26.594,35.0 -15:48:20,299.4556,35.059,35.647,25.61,35.0 -15:48:20,299.5055,35.059,35.619,26.07,35.0 -15:48:20,299.5567,35.087,35.619,26.532,35.0 -15:48:20,299.6082,35.059,35.591,26.03,35.0 -15:48:20,299.6585,35.059,35.619,26.973,35.0 -15:48:20,299.7090,35.087,35.591,26.472,35.0 -15:48:20,299.7592,35.059,35.591,26.453,35.0 -15:48:21,299.8108,35.087,35.591,26.915,35.0 -15:48:21,299.8614,35.059,35.619,26.414,35.0 -15:48:21,299.9135,35.059,35.591,26.395,35.0 -15:48:21,299.9645,34.976,35.647,26.856,35.0 -15:48:21,300.0166,35.087,35.619,27.302,35.0 -15:48:21,300.0693,35.087,35.591,25.855,35.0 -15:48:21,300.1205,35.059,35.591,26.316,35.0 -15:48:21,300.1728,35.115,35.591,26.778,35.0 -15:48:21,300.2225,35.059,35.591,25.795,35.0 -15:48:21,300.2897,35.115,35.591,26.737,35.0 -15:48:21,300.3414,35.059,35.619,25.749,35.0 -15:48:21,300.3908,35.059,35.619,26.21,35.0 -15:48:21,300.4405,35.032,35.619,26.191,35.0 -15:48:21,300.4937,35.059,35.647,26.636,35.0 -15:48:21,300.5434,35.059,35.591,25.67,35.0 -15:48:21,300.6170,35.059,35.619,26.613,35.0 -15:48:21,300.6940,35.087,35.591,26.104,35.0 -15:48:21,300.7531,35.059,35.591,26.074,35.0 -15:48:22,300.8147,35.032,35.619,26.533,35.0 -15:48:22,300.8729,35.059,35.591,26.493,35.0 -15:48:22,300.9293,35.087,35.563,26.488,35.0 -15:48:22,300.9898,35.087,35.535,26.468,35.0 -15:48:22,301.0512,35.032,35.591,26.927,35.0 -15:48:22,301.1128,35.087,35.535,26.888,35.0 -15:48:22,301.1769,35.032,35.591,26.883,35.0 -15:48:22,301.2384,35.004,35.591,26.843,35.0 -15:48:22,301.2995,35.032,35.591,27.303,35.0 -15:48:22,301.3777,35.004,35.563,26.801,35.0 -15:48:22,301.4403,35.004,35.591,27.737,35.0 -15:48:22,301.4962,35.004,35.591,27.235,35.0 -15:48:22,301.5512,35.059,35.591,27.216,35.0 -15:48:22,301.6087,35.059,35.591,26.251,35.0 -15:48:22,301.6594,35.032,35.591,26.23,35.0 -15:48:22,301.7090,35.032,35.563,26.675,35.0 -15:48:22,301.7601,35.032,35.619,27.139,35.0 -15:48:23,301.8101,35.032,35.591,26.159,35.0 -15:48:23,301.8595,35.032,35.535,26.622,35.0 -15:48:23,301.9083,35.059,35.619,27.567,35.0 -15:48:23,301.9730,35.032,35.563,25.642,35.0 -15:48:23,302.0217,35.059,35.563,27.046,35.0 -15:48:23,302.0697,35.032,35.619,26.565,35.0 -15:48:23,302.1182,35.059,35.563,26.049,35.0 -15:48:23,302.1675,35.004,35.563,26.53,35.0 -15:48:23,302.2172,35.032,35.535,27.458,35.0 -15:48:23,302.2650,35.032,35.563,27.442,35.0 -15:48:23,302.3147,34.976,35.563,26.945,35.0 -15:48:23,302.3634,35.059,35.563,27.891,35.0 -15:48:23,302.4120,35.059,35.563,26.449,35.0 -15:48:23,302.4625,35.059,35.563,26.432,35.0 -15:48:23,302.5130,35.059,35.563,26.414,35.0 -15:48:23,302.5643,35.059,35.563,26.396,35.0 -15:48:23,302.6170,35.032,35.563,26.377,35.0 -15:48:23,302.6678,35.032,35.591,26.823,35.0 -15:48:23,302.7176,35.032,35.563,26.324,35.0 -15:48:23,302.7676,35.032,35.563,26.788,35.0 -15:48:24,302.8185,35.032,35.563,26.771,35.0 -15:48:24,302.8707,35.059,35.563,26.754,35.0 -15:48:24,302.9197,35.004,35.591,26.272,35.0 -15:48:24,302.9708,35.004,35.591,26.719,35.0 -15:48:24,303.0191,35.032,35.563,26.701,35.0 -15:48:24,303.0707,35.032,35.535,26.685,35.0 -15:48:24,303.1184,35.032,35.619,27.149,35.0 -15:48:24,303.1703,35.032,35.535,25.689,35.0 -15:48:24,303.2195,35.087,35.563,27.114,35.0 -15:48:24,303.2712,35.059,35.535,25.671,35.0 -15:48:24,303.3205,35.087,35.591,26.615,35.0 -15:48:24,303.3687,35.004,35.563,25.153,35.0 -15:48:24,303.4186,35.032,35.563,27.044,35.0 -15:48:24,303.4698,34.976,35.563,26.546,35.0 -15:48:24,303.5180,35.004,35.563,27.492,35.0 -15:48:24,303.5686,35.004,35.591,26.996,35.0 -15:48:24,303.6188,35.032,35.563,26.498,35.0 -15:48:24,303.6695,35.004,35.563,26.48,35.0 -15:48:24,303.7203,34.976,35.507,26.945,35.0 -15:48:24,303.7700,35.032,35.563,28.373,35.0 -15:48:25,303.8201,35.032,35.535,26.433,35.0 -15:48:25,303.8701,35.004,35.535,26.898,35.0 -15:48:25,303.9199,35.032,35.479,27.363,35.0 -15:48:25,303.9716,35.004,35.563,27.83,35.0 -15:48:25,304.0189,35.032,35.563,26.851,35.0 -15:48:25,304.0695,35.004,35.563,26.354,35.0 -15:48:25,304.1204,35.032,35.563,26.819,35.0 -15:48:25,304.1705,35.004,35.535,26.321,35.0 -15:48:25,304.2180,35.004,35.563,27.267,35.0 -15:48:25,304.2685,35.032,35.535,26.771,35.0 -15:48:25,304.3186,35.032,35.563,26.754,35.0 -15:48:25,304.3700,35.004,35.535,26.256,35.0 -15:48:25,304.4182,34.976,35.535,27.202,35.0 -15:48:25,304.4684,35.004,35.535,27.669,35.0 -15:48:25,304.5199,35.004,35.535,27.173,35.0 -15:48:25,304.5673,35.004,35.535,27.157,35.0 -15:48:25,304.6178,35.032,35.535,27.142,35.0 -15:48:25,304.6701,35.004,35.535,26.645,35.0 -15:48:25,304.7192,35.032,35.563,27.11,35.0 -15:48:25,304.7702,35.004,35.563,26.131,35.0 -15:48:26,304.8184,35.004,35.535,26.596,35.0 -15:48:26,304.9131,35.004,35.535,27.062,35.0 -15:48:26,304.9671,35.004,35.563,27.032,35.0 -15:48:26,305.0189,35.032,35.535,26.534,35.0 -15:48:26,305.0776,35.004,35.535,26.518,35.0 -15:48:26,305.1310,34.948,35.563,26.98,35.0 -15:48:26,305.1803,35.004,35.507,27.445,35.0 -15:48:26,305.2300,35.032,35.591,27.431,35.0 -15:48:26,305.2815,35.004,35.535,25.49,35.0 -15:48:26,305.3318,34.976,35.535,26.917,35.0 -15:48:26,305.3826,35.032,35.535,27.383,35.0 -15:48:26,305.4331,35.032,35.535,26.405,35.0 -15:48:26,305.4842,35.004,35.535,26.388,35.0 -15:48:26,305.5351,35.004,35.535,26.854,35.0 -15:48:26,305.5871,35.004,35.535,26.838,35.0 -15:48:26,305.6353,35.004,35.563,26.822,35.0 -15:48:26,305.6868,35.004,35.591,26.325,35.0 -15:48:26,305.7354,35.004,35.563,25.827,35.0 -15:48:26,305.7863,34.976,35.535,26.292,35.0 -15:48:27,305.8357,35.004,35.535,27.239,35.0 -15:48:27,305.8866,34.92,35.535,26.743,35.0 -15:48:27,305.9342,35.004,35.535,28.172,35.0 -15:48:27,305.9867,34.92,35.535,26.715,35.0 -15:48:27,306.0357,34.976,35.535,28.144,35.0 -15:48:27,306.0872,34.976,35.535,27.168,35.0 -15:48:27,306.1365,34.976,35.535,27.153,35.0 -15:48:27,306.1852,35.004,35.507,27.138,35.0 -15:48:27,306.2355,34.976,35.535,27.124,35.0 -15:48:27,306.2849,35.004,35.535,27.11,35.0 -15:48:27,306.3374,34.976,35.479,26.614,35.0 -15:48:27,306.3876,34.976,35.479,28.042,35.0 -15:48:27,306.4354,34.976,35.535,28.029,35.0 -15:48:27,306.4858,34.976,35.507,27.054,35.0 -15:48:27,306.5335,34.976,35.535,27.521,35.0 -15:48:27,306.5852,35.004,35.535,27.026,35.0 -15:48:27,306.6353,34.976,35.507,26.529,35.0 -15:48:27,306.6878,34.976,35.563,27.477,35.0 -15:48:27,306.7357,34.976,35.507,26.499,35.0 -15:48:27,306.7833,34.976,35.507,27.448,35.0 -15:48:28,306.8359,35.004,35.507,27.435,35.0 -15:48:28,306.8880,35.004,35.507,26.938,35.0 -15:48:28,306.9358,34.976,35.507,26.923,35.0 -15:48:28,306.9887,35.032,35.535,27.391,35.0 -15:48:28,307.0374,34.976,35.507,25.931,35.0 -15:48:28,307.0862,35.004,35.507,27.36,35.0 -15:48:28,307.1361,34.976,35.535,26.865,35.0 -15:48:28,307.1854,34.976,35.507,26.851,35.0 -15:48:28,307.2373,34.976,35.507,27.318,35.0 -15:48:28,307.2869,34.948,35.507,27.303,35.0 -15:48:28,307.3376,34.976,35.507,27.771,35.0 -15:48:28,307.3869,34.976,35.507,27.277,35.0 -15:48:28,307.4355,34.976,35.451,27.263,35.0 -15:48:28,307.4858,34.948,35.451,28.213,35.0 -15:48:28,307.5368,35.004,35.507,28.682,35.0 -15:48:28,307.5853,35.004,35.507,26.744,35.0 -15:48:28,307.6354,34.948,35.507,26.73,35.0 -15:48:28,307.6864,35.004,35.507,27.679,35.0 -15:48:28,307.7354,34.976,35.563,26.702,35.0 -15:48:28,307.7857,34.948,35.507,26.206,35.0 -15:48:29,307.8371,34.976,35.479,27.635,35.0 -15:48:29,307.8856,34.976,35.535,27.622,35.0 -15:48:29,307.9367,34.976,35.479,26.646,35.0 -15:48:29,307.9854,34.976,35.535,27.595,35.0 -15:48:29,308.0357,34.976,35.479,26.619,35.0 -15:48:29,308.0868,35.004,35.479,27.567,35.0 -15:48:29,308.1360,34.976,35.507,27.072,35.0 -15:48:29,308.1864,34.976,35.507,27.059,35.0 -15:48:29,308.2348,34.948,35.507,27.045,35.0 -15:48:29,308.2862,34.948,35.507,27.513,35.0 -15:48:29,308.3346,34.976,35.535,27.5,35.0 -15:48:29,308.3849,34.948,35.507,26.524,35.0 -15:48:29,308.4368,34.948,35.507,27.473,35.0 -15:48:29,308.4859,34.948,35.563,27.459,35.0 -15:48:29,308.5369,34.976,35.507,26.483,35.0 -15:48:29,308.5848,34.976,35.507,26.95,35.0 -15:48:29,308.6361,34.92,35.507,26.937,35.0 -15:48:29,308.6866,34.976,35.479,27.886,35.0 -15:48:29,308.7354,34.948,35.507,27.392,35.0 -15:48:29,308.7859,34.948,35.507,27.379,35.0 -15:48:30,308.8347,34.948,35.535,27.366,35.0 -15:48:30,308.8865,34.948,35.479,26.872,35.0 -15:48:30,308.9355,34.92,35.479,27.821,35.0 -15:48:30,308.9869,35.004,35.479,28.291,35.0 -15:48:30,309.0365,34.948,35.535,26.834,35.0 -15:48:30,309.0862,34.948,35.507,26.82,35.0 -15:48:30,309.1366,34.92,35.507,27.288,35.0 -15:48:30,309.1869,34.92,35.479,27.757,35.0 -15:48:30,309.2374,34.976,35.507,28.226,35.0 -15:48:30,309.2859,34.92,35.507,26.77,35.0 -15:48:30,309.3335,34.948,35.479,27.719,35.0 -15:48:30,309.3847,34.92,35.507,27.708,35.0 -15:48:30,309.4369,34.948,35.479,27.695,35.0 -15:48:30,309.4858,34.892,35.535,27.683,35.0 -15:48:30,309.5366,34.948,35.507,27.671,35.0 -15:48:30,309.5869,34.976,35.479,27.177,35.0 -15:48:30,309.6370,34.948,35.479,27.164,35.0 -15:48:30,309.6864,34.92,35.479,27.632,35.0 -15:48:30,309.7344,34.948,35.507,28.102,35.0 -15:48:30,309.7852,35.032,35.479,27.128,35.0 -15:48:31,309.8367,34.948,35.535,26.151,35.0 -15:48:31,309.8856,34.92,35.479,26.618,35.0 -15:48:31,309.9329,34.892,35.479,28.049,35.0 -15:48:31,309.9837,34.948,35.479,28.52,35.0 -15:48:31,310.0357,34.948,35.507,27.546,35.0 -15:48:31,310.0877,34.92,35.507,27.051,35.0 -15:48:31,310.1391,34.92,35.507,27.519,35.0 -15:48:31,310.1880,34.948,35.479,27.507,35.0 -15:48:31,310.2382,34.948,35.507,27.495,35.0 -15:48:31,310.2885,34.948,35.479,27.001,35.0 -15:48:31,310.3378,34.92,35.479,27.47,35.0 -15:48:31,310.3869,34.976,35.451,27.939,35.0 -15:48:31,310.4366,34.948,35.479,27.447,35.0 -15:48:31,310.4863,34.92,35.507,27.434,35.0 -15:48:31,310.5368,34.948,35.479,27.422,35.0 -15:48:31,310.5848,34.976,35.479,27.41,35.0 -15:48:31,310.6330,34.92,35.535,26.917,35.0 -15:48:31,310.6847,34.92,35.479,26.904,35.0 -15:48:31,310.7356,34.892,35.479,27.854,35.0 -15:48:31,310.7846,34.92,35.479,28.324,35.0 -15:48:32,310.8365,34.92,35.479,27.832,35.0 -15:48:32,310.8860,34.92,35.479,27.82,35.0 -15:48:32,310.9375,34.948,35.535,27.809,35.0 -15:48:32,310.9895,34.948,35.479,26.352,35.0 -15:48:32,311.0399,34.892,35.479,27.301,35.0 -15:48:32,311.0893,34.892,35.479,28.252,35.0 -15:48:32,311.1390,34.92,35.507,28.242,35.0 -15:48:32,311.1906,34.892,35.479,27.268,35.0 -15:48:32,311.2415,34.892,35.535,28.219,35.0 -15:48:32,311.2927,34.92,35.479,27.245,35.0 -15:48:32,311.3439,34.92,35.479,27.714,35.0 -15:48:32,311.3955,34.892,35.479,27.702,35.0 -15:48:32,311.4458,34.92,35.507,28.172,35.0 -15:48:32,311.4979,34.948,35.451,27.198,35.0 -15:48:32,311.5518,34.92,35.479,27.667,35.0 -15:48:32,311.6016,34.948,35.479,27.655,35.0 -15:48:32,311.6499,34.948,35.479,27.162,35.0 -15:48:32,311.6991,34.892,35.451,27.15,35.0 -15:48:32,311.7491,34.92,35.479,28.583,35.0 -15:48:32,311.7981,34.976,35.451,27.61,35.0 -15:48:33,311.8476,34.92,35.479,27.117,35.0 -15:48:33,311.8966,34.92,35.479,27.587,35.0 -15:48:33,311.9458,34.92,35.479,27.575,35.0 -15:48:33,311.9947,34.92,35.479,27.564,35.0 -15:48:33,312.0468,34.892,35.563,27.553,35.0 -15:48:33,312.0960,34.976,35.507,26.578,35.0 -15:48:33,312.1438,34.948,35.507,26.084,35.0 -15:48:33,312.1926,34.92,35.451,26.552,35.0 -15:48:33,312.2406,34.948,35.507,27.984,35.0 -15:48:33,312.2896,34.865,35.507,26.529,35.0 -15:48:33,312.3396,34.92,35.479,27.944,35.0 -15:48:33,312.3888,34.92,35.451,27.469,35.0 -15:48:33,312.4376,34.892,35.451,27.939,35.0 -15:48:33,312.4859,34.92,35.451,28.411,35.0 -15:48:33,312.5348,34.92,35.479,27.92,35.0 -15:48:33,312.5851,34.892,35.479,27.428,35.0 -15:48:33,312.6326,34.892,35.479,27.898,35.0 -15:48:33,312.6827,34.92,35.479,27.888,35.0 -15:48:33,312.7327,34.92,35.479,27.396,35.0 -15:48:33,312.7824,34.92,35.451,27.384,35.0 -15:48:34,312.8316,34.92,35.451,27.854,35.0 -15:48:34,312.8821,34.892,35.451,27.844,35.0 -15:48:34,312.9310,34.92,35.479,28.315,35.0 -15:48:34,312.9819,34.892,35.451,27.342,35.0 -15:48:34,313.0315,34.892,35.479,28.294,35.0 -15:48:34,313.0817,34.92,35.451,27.802,35.0 -15:48:34,313.1298,34.892,35.451,27.792,35.0 -15:48:34,313.1800,34.892,35.451,28.263,35.0 -15:48:34,313.2302,34.948,35.451,28.253,35.0 -15:48:34,313.2796,34.948,35.451,27.28,35.0 -15:48:34,313.3275,34.892,35.423,27.269,35.0 -15:48:34,313.3784,34.892,35.451,28.703,35.0 -15:48:34,313.4284,34.92,35.423,28.212,35.0 -15:48:34,313.4780,34.892,35.451,28.202,35.0 -15:48:34,313.5262,34.92,35.451,28.193,35.0 -15:48:34,313.5737,34.892,35.451,27.702,35.0 -15:48:34,313.6231,34.865,35.451,28.173,35.0 -15:48:34,313.6717,34.892,35.479,28.628,35.0 -15:48:34,313.7197,34.92,35.479,27.673,35.0 -15:48:34,313.7668,34.892,35.451,27.181,35.0 -15:48:35,313.8175,35.004,35.451,28.134,35.0 -15:48:35,313.8673,34.837,35.423,26.197,35.0 -15:48:35,313.9147,34.92,35.451,29.538,35.0 -15:48:35,313.9647,34.865,35.423,27.622,35.0 -15:48:35,314.0146,34.892,35.451,29.039,35.0 -15:48:35,314.0640,34.892,35.479,28.085,35.0 -15:48:35,314.1143,34.892,35.507,27.594,35.0 -15:48:35,314.1648,34.92,35.479,27.102,35.0 -15:48:35,314.2151,34.92,35.423,27.09,35.0 -15:48:35,314.2648,34.948,35.423,28.042,35.0 -15:48:35,314.3148,34.865,35.451,27.55,35.0 -15:48:35,314.3646,34.892,35.423,28.486,35.0 -15:48:35,314.4155,34.948,35.395,28.494,35.0 -15:48:35,314.4645,34.892,35.395,28.003,35.0 -15:48:35,314.5146,34.892,35.451,28.957,35.0 -15:48:35,314.5645,34.892,35.479,27.986,35.0 -15:48:35,314.6183,34.92,35.423,27.494,35.0 -15:48:35,314.6655,34.892,35.451,27.964,35.0 -15:48:35,314.7144,34.865,35.451,27.955,35.0 -15:48:35,314.7648,34.892,35.451,28.41,35.0 -15:48:36,314.8152,34.892,35.451,27.936,35.0 -15:48:36,314.8648,34.892,35.451,27.926,35.0 -15:48:36,314.9167,34.865,35.423,27.917,35.0 -15:48:36,314.9687,34.865,35.451,28.853,35.0 -15:48:36,315.0174,34.865,35.451,28.363,35.0 -15:48:36,315.0687,34.892,35.423,28.354,35.0 -15:48:36,315.1157,34.865,35.423,28.362,35.0 -15:48:36,315.1660,34.865,35.451,28.818,35.0 -15:48:36,315.2185,34.892,35.423,28.328,35.0 -15:48:36,315.2724,34.865,35.423,28.335,35.0 -15:48:36,315.3317,34.865,35.479,28.79,35.0 -15:48:36,315.3888,34.865,35.423,27.817,35.0 -15:48:36,315.4446,34.865,35.423,28.769,35.0 -15:48:36,315.4943,34.892,35.423,28.76,35.0 -15:48:36,315.5440,34.865,35.423,28.287,35.0 -15:48:36,315.6178,34.865,35.451,28.743,35.0 -15:48:36,315.7058,34.892,35.395,28.248,35.0 -15:48:36,315.7685,34.865,35.451,28.732,35.0 -15:48:37,315.8317,34.865,35.451,28.223,35.0 -15:48:37,315.8911,34.865,35.423,28.211,35.0 -15:48:37,315.9503,34.837,35.423,28.683,35.0 -15:48:37,316.0097,34.892,35.395,29.155,35.0 -15:48:37,316.0697,34.865,35.423,28.681,35.0 -15:48:37,316.1367,34.865,35.423,28.654,35.0 -15:48:37,316.2024,34.809,35.395,28.643,35.0 -15:48:37,316.2589,34.865,35.339,30.078,35.0 -15:48:37,316.3192,34.865,35.423,30.071,35.0 -15:48:37,316.3851,34.865,35.423,28.619,35.0 -15:48:37,316.4456,34.865,35.423,28.608,35.0 -15:48:37,316.5055,34.865,35.423,28.598,35.0 -15:48:37,316.5642,34.865,35.423,28.588,35.0 -15:48:37,316.6266,34.837,35.423,28.578,35.0 -15:48:37,316.6815,34.892,35.395,29.05,35.0 -15:48:37,316.7343,34.781,35.395,28.578,35.0 -15:48:37,316.7827,34.809,35.395,30.478,35.0 -15:48:38,316.8322,34.892,35.395,29.992,35.0 -15:48:38,316.8825,34.865,35.395,28.559,35.0 -15:48:38,316.9487,34.837,35.395,29.015,35.0 -15:48:38,317.0004,34.781,35.423,29.487,35.0 -15:48:38,317.0485,34.865,35.395,29.962,35.0 -15:48:38,317.0988,34.865,35.395,28.993,35.0 -15:48:38,317.1483,34.865,35.395,28.985,35.0 -15:48:38,317.1979,34.892,35.395,28.978,35.0 -15:48:38,317.2473,34.892,35.423,28.506,35.0 -15:48:38,317.2973,34.837,35.423,28.016,35.0 -15:48:38,317.3479,34.865,35.395,28.953,35.0 -15:48:38,317.3977,34.837,35.395,28.946,35.0 -15:48:38,317.4467,34.865,35.395,29.42,35.0 -15:48:38,317.4966,34.865,35.451,28.932,35.0 -15:48:38,317.5475,34.781,35.395,27.961,35.0 -15:48:38,317.5988,34.892,35.339,30.36,35.0 -15:48:38,317.6492,34.837,35.423,29.409,35.0 -15:48:38,317.6998,34.837,35.339,28.904,35.0 -15:48:38,317.7478,34.865,35.395,30.341,35.0 -15:48:38,317.7969,34.837,35.395,28.892,35.0 -15:48:39,317.8468,34.837,35.395,29.366,35.0 -15:48:39,317.8969,34.837,35.423,29.359,35.0 -15:48:39,317.9472,34.865,35.423,28.871,35.0 -15:48:39,317.9979,34.781,35.395,28.382,35.0 -15:48:39,318.0488,34.837,35.395,30.3,35.0 -15:48:39,318.0989,34.837,35.451,29.332,35.0 -15:48:39,318.1506,34.837,35.395,28.362,35.0 -15:48:39,318.1989,34.837,35.395,29.317,35.0 -15:48:39,318.2495,34.837,35.423,29.31,35.0 -15:48:39,318.2990,34.837,35.395,28.822,35.0 -15:48:39,318.3497,34.865,35.451,29.296,35.0 -15:48:39,318.4007,34.837,35.367,27.845,35.0 -15:48:39,318.4485,34.837,35.367,29.762,35.0 -15:48:39,318.4985,34.837,35.395,29.756,35.0 -15:48:39,318.5493,34.837,35.367,29.269,35.0 -15:48:39,318.5988,34.837,35.395,29.744,35.0 -15:48:39,318.6491,34.837,35.367,29.256,35.0 -15:48:39,318.6986,34.865,35.395,29.731,35.0 -15:48:39,318.7486,34.837,35.395,28.762,35.0 -15:48:39,318.7986,34.837,35.395,29.237,35.0 -15:48:40,318.8491,34.837,35.367,29.23,35.0 -15:48:40,318.9000,34.809,35.423,29.705,35.0 -15:48:40,318.9487,34.837,35.367,29.217,35.0 -15:48:40,318.9999,34.809,35.395,29.692,35.0 -15:48:40,319.0498,34.837,35.395,29.686,35.0 -15:48:40,319.0975,34.809,35.395,29.199,35.0 -15:48:40,319.1477,34.865,35.423,29.674,35.0 -15:48:40,319.1967,34.837,35.395,28.224,35.0 -15:48:40,319.2473,34.865,35.367,29.179,35.0 -15:48:40,319.3005,34.837,35.423,29.172,35.0 -15:48:40,319.3478,34.809,35.367,28.683,35.0 -15:48:40,319.3987,34.837,35.423,30.121,35.0 -15:48:40,319.4475,34.837,35.367,28.671,35.0 -15:48:40,319.4982,34.837,35.339,29.627,35.0 -15:48:40,319.5498,34.809,35.367,30.103,35.0 -15:48:40,319.6012,34.809,35.367,30.097,35.0 -15:48:40,319.6527,34.809,35.395,30.092,35.0 -15:48:40,319.7030,34.837,35.395,29.605,35.0 -15:48:40,319.7543,34.837,35.367,29.118,35.0 -15:48:40,319.8057,34.809,35.367,29.593,35.0 -15:48:41,319.8565,34.809,35.367,30.068,35.0 -15:48:41,319.9071,34.809,35.367,30.063,35.0 -15:48:41,319.9567,34.809,35.367,30.058,35.0 -15:48:41,320.0069,34.809,35.395,30.053,35.0 -15:48:41,320.0635,34.837,35.367,29.567,35.0 -15:48:41,320.1232,34.837,35.395,29.56,35.0 -15:48:41,320.1757,34.781,35.367,29.071,35.0 -15:48:41,320.2254,34.809,35.367,30.509,35.0 -15:48:41,320.2746,34.809,35.451,30.024,35.0 -15:48:41,320.3231,34.837,35.367,28.574,35.0 -15:48:41,320.3715,34.781,35.367,29.53,35.0 -15:48:41,320.4206,34.809,35.367,30.487,35.0 -15:48:41,320.4692,34.809,35.367,30.002,35.0 -15:48:41,320.5192,34.837,35.311,29.997,35.0 -15:48:41,320.5684,34.837,35.395,30.473,35.0 -15:48:41,320.6193,34.809,35.367,29.024,35.0 -15:48:41,320.6682,34.781,35.395,29.981,35.0 -15:48:41,320.7171,34.781,35.367,29.976,35.0 -15:48:41,320.7655,34.753,35.367,30.453,35.0 -15:48:42,320.8151,34.781,35.367,30.93,35.0 -15:48:42,320.8649,34.809,35.395,30.445,35.0 -15:48:42,320.9143,34.865,35.367,29.478,35.0 -15:48:42,320.9635,34.809,35.395,28.99,35.0 -15:48:42,321.0142,34.865,35.423,29.465,35.0 -15:48:42,321.0651,34.865,35.367,28.015,35.0 -15:48:42,321.1162,34.781,35.367,28.969,35.0 -15:48:42,321.1641,34.809,35.367,30.408,35.0 -15:48:42,321.2148,34.809,35.367,29.922,35.0 -15:48:42,321.2651,34.781,35.395,29.917,35.0 -15:48:42,321.3151,34.865,35.311,29.912,35.0 -15:48:42,321.3651,34.781,35.367,29.907,35.0 -15:48:42,321.4157,34.781,35.339,30.383,35.0 -15:48:42,321.4636,34.781,35.367,30.861,35.0 -15:48:42,321.5132,34.809,35.367,30.376,35.0 -15:48:42,321.5637,34.781,35.367,29.89,35.0 -15:48:42,321.6143,34.781,35.339,30.367,35.0 -15:48:42,321.6643,34.809,35.367,30.844,35.0 -15:48:42,321.7152,34.837,35.339,29.877,35.0 -15:48:42,321.7652,34.809,35.367,29.872,35.0 -15:48:43,321.8145,34.809,35.339,29.867,35.0 -15:48:43,321.8647,34.781,35.339,30.344,35.0 -15:48:43,321.9142,34.837,35.367,30.821,35.0 -15:48:43,321.9644,34.781,35.367,29.373,35.0 -15:48:43,322.0146,34.809,35.367,30.33,35.0 -15:48:43,322.1114,34.837,35.339,29.844,35.0 -15:48:43,322.1637,34.781,35.367,29.835,35.0 -15:48:43,322.2135,34.781,35.367,30.311,35.0 -15:48:43,322.2628,34.726,35.339,30.307,35.0 -15:48:43,322.3125,34.809,35.395,31.73,35.0 -15:48:43,322.3625,34.809,35.423,29.338,35.0 -15:48:43,322.4128,34.809,35.367,28.85,35.0 -15:48:43,322.4623,34.809,35.367,29.807,35.0 -15:48:43,322.5125,34.809,35.367,29.802,35.0 -15:48:43,322.5632,34.809,35.395,29.797,35.0 -15:48:43,322.6140,34.753,35.339,29.31,35.0 -15:48:43,322.6659,34.781,35.367,31.231,35.0 -15:48:43,322.7146,34.781,35.339,30.265,35.0 -15:48:43,322.7650,34.809,35.311,30.742,35.0 -15:48:44,322.8146,34.865,35.339,30.739,35.0 -15:48:44,322.8650,34.781,35.311,29.29,35.0 -15:48:44,322.9157,34.781,35.339,31.211,35.0 -15:48:44,322.9639,34.781,35.283,30.727,35.0 -15:48:44,323.0147,34.753,35.339,31.687,35.0 -15:48:44,323.0655,34.781,35.367,31.203,35.0 -15:48:44,323.1125,34.781,35.339,30.237,35.0 -15:48:44,323.1637,34.781,35.339,30.715,35.0 -15:48:44,323.2145,34.809,35.339,30.711,35.0 -15:48:44,323.2655,34.753,35.339,30.226,35.0 -15:48:44,323.3126,34.781,35.367,31.185,35.0 -15:48:44,323.3626,34.781,35.311,30.22,35.0 -15:48:44,323.4141,34.781,35.311,31.178,35.0 -15:48:44,323.4675,34.809,35.339,31.176,35.0 -15:48:44,323.5215,34.781,35.339,30.21,35.0 -15:48:44,323.5715,34.781,35.367,30.687,35.0 -15:48:44,323.6206,34.781,35.311,30.202,35.0 -15:48:44,323.6705,34.781,35.367,31.161,35.0 -15:48:44,323.7189,34.726,35.339,30.195,35.0 -15:48:44,323.7666,34.726,35.367,31.619,35.0 -15:48:45,323.8153,34.809,35.339,31.135,35.0 -15:48:45,323.8638,34.781,35.339,30.187,35.0 -15:48:45,323.9156,34.781,35.311,30.664,35.0 -15:48:45,323.9650,34.781,35.339,31.142,35.0 -15:48:45,324.0171,34.726,35.339,30.658,35.0 -15:48:45,324.0696,34.781,35.311,31.601,35.0 -15:48:45,324.1207,34.781,35.339,31.134,35.0 -15:48:45,324.1725,34.809,35.255,30.65,35.0 -15:48:45,324.2240,34.781,35.339,31.61,35.0 -15:48:45,324.2757,34.781,35.339,30.644,35.0 -15:48:45,324.3285,34.781,35.339,30.641,35.0 -15:48:45,324.3796,34.781,35.367,30.637,35.0 -15:48:45,324.4322,34.809,35.311,30.152,35.0 -15:48:45,324.4813,34.809,35.311,30.629,35.0 -15:48:45,324.5336,34.781,35.311,30.626,35.0 -15:48:45,324.5853,34.781,35.311,31.104,35.0 -15:48:45,324.6362,34.781,35.339,31.101,35.0 -15:48:45,324.6863,34.781,35.311,30.617,35.0 -15:48:45,324.7353,34.781,35.339,31.095,35.0 -15:48:45,324.7863,34.753,35.339,30.611,35.0 -15:48:46,324.8386,34.781,35.339,31.089,35.0 -15:48:46,324.8897,34.809,35.339,30.605,35.0 -15:48:46,324.9425,34.781,35.339,30.12,35.0 -15:48:46,324.9960,34.753,35.339,30.597,35.0 -15:48:46,325.0493,34.753,35.395,31.075,35.0 -15:48:46,325.0994,34.753,35.311,30.109,35.0 -15:48:46,325.1507,34.781,35.255,31.549,35.0 -15:48:46,325.2033,34.809,35.311,32.029,35.0 -15:48:46,325.2534,34.753,35.339,30.583,35.0 -15:48:46,325.3022,34.753,35.311,31.061,35.0 -15:48:46,325.3507,34.781,35.339,31.54,35.0 -15:48:46,325.4007,34.781,35.311,30.575,35.0 -15:48:46,325.4531,34.753,35.339,31.053,35.0 -15:48:46,325.5037,34.753,35.311,31.051,35.0 -15:48:46,325.5547,34.753,35.311,31.53,35.0 -15:48:46,325.6091,34.753,35.311,31.528,35.0 -15:48:46,325.6616,34.753,35.339,31.526,35.0 -15:48:46,325.7143,34.726,35.311,31.042,35.0 -15:48:46,325.7667,34.726,35.311,31.986,35.0 -15:48:47,325.8177,34.809,35.311,31.984,35.0 -15:48:47,325.8696,34.753,35.339,30.556,35.0 -15:48:47,325.9205,34.781,35.283,31.034,35.0 -15:48:47,325.9707,34.753,35.339,31.513,35.0 -15:48:47,326.0202,34.809,35.311,31.029,35.0 -15:48:47,326.0699,34.753,35.339,30.545,35.0 -15:48:47,326.1177,34.753,35.311,31.023,35.0 -15:48:47,326.1667,34.753,35.311,31.502,35.0 -15:48:47,326.2158,34.726,35.311,31.501,35.0 -15:48:47,326.2658,34.726,35.311,31.963,35.0 -15:48:47,326.3136,34.753,35.311,31.962,35.0 -15:48:47,326.3666,34.781,35.283,31.497,35.0 -15:48:47,326.4153,34.753,35.311,31.495,35.0 -15:48:47,326.4637,34.753,35.311,31.493,35.0 -15:48:47,326.5135,34.753,35.311,31.491,35.0 -15:48:47,326.5642,34.726,35.311,31.489,35.0 -15:48:47,326.6138,34.726,35.311,31.952,35.0 -15:48:47,326.6651,34.726,35.311,31.951,35.0 -15:48:47,326.7137,34.753,35.311,31.95,35.0 -15:48:47,326.7634,34.781,35.311,31.484,35.0 -15:48:48,326.8134,34.753,35.255,31.001,35.0 -15:48:48,326.8637,34.753,35.311,32.443,35.0 -15:48:48,326.9138,34.726,35.311,31.48,35.0 -15:48:48,326.9635,34.726,35.311,31.942,35.0 -15:48:48,327.0152,34.781,35.283,31.941,35.0 -15:48:48,327.0632,34.753,35.339,31.476,35.0 -15:48:48,327.1140,34.726,35.339,30.992,35.0 -15:48:48,327.1647,34.753,35.367,31.454,35.0 -15:48:48,327.2148,34.726,35.311,30.506,35.0 -15:48:48,327.2635,34.781,35.255,31.93,35.0 -15:48:48,327.3136,34.753,35.283,31.947,35.0 -15:48:48,327.3643,34.726,35.339,31.946,35.0 -15:48:48,327.4171,34.726,35.311,31.446,35.0 -15:48:48,327.4657,34.726,35.311,31.925,35.0 -15:48:48,327.5147,34.781,35.311,31.924,35.0 -15:48:48,327.5647,34.753,35.283,30.977,35.0 -15:48:48,327.6139,34.726,35.311,31.938,35.0 -15:48:48,327.6637,34.753,35.283,31.92,35.0 -15:48:48,327.7141,34.753,35.283,31.936,35.0 -15:48:48,327.7633,34.726,35.311,31.935,35.0 -15:48:49,327.8142,34.781,35.283,31.917,35.0 -15:48:49,327.8656,34.726,35.283,31.451,35.0 -15:48:49,327.9161,34.753,35.311,32.395,35.0 -15:48:49,327.9651,34.726,35.311,31.449,35.0 -15:48:49,328.0141,34.726,35.311,31.912,35.0 -15:48:49,328.0630,34.726,35.339,31.911,35.0 -15:48:49,328.1137,34.753,35.311,31.428,35.0 -15:48:49,328.1645,34.726,35.283,31.443,35.0 -15:48:49,328.2126,34.753,35.311,32.388,35.0 -15:48:49,328.2625,34.753,35.283,31.441,35.0 -15:48:49,328.3122,34.726,35.283,31.921,35.0 -15:48:49,328.3630,34.698,35.283,32.385,35.0 -15:48:49,328.4135,34.753,35.311,32.866,35.0 -15:48:49,328.4648,34.726,35.283,31.439,35.0 -15:48:49,328.5137,34.698,35.367,32.383,35.0 -15:48:49,328.5650,34.726,35.255,31.419,35.0 -15:48:49,328.6148,34.726,35.311,32.863,35.0 -15:48:49,328.6698,34.726,35.339,31.9,35.0 -15:48:49,328.7211,34.726,35.339,31.417,35.0 -15:48:49,328.7707,34.753,35.283,31.415,35.0 -15:48:50,328.8209,34.753,35.311,31.912,35.0 -15:48:50,328.8707,34.642,35.339,31.429,35.0 -15:48:50,328.9205,34.726,35.311,32.855,35.0 -15:48:50,328.9702,34.726,35.283,31.893,35.0 -15:48:50,329.0199,34.726,35.311,32.373,35.0 -15:48:50,329.0697,34.726,35.283,31.891,35.0 -15:48:50,329.1194,34.726,35.283,32.372,35.0 -15:48:50,329.1755,34.726,35.283,32.372,35.0 -15:48:50,329.2253,34.726,35.283,32.371,35.0 -15:48:50,329.2752,34.726,35.283,32.371,35.0 -15:48:50,329.3246,34.698,35.283,32.371,35.0 -15:48:50,329.3753,34.753,35.283,32.852,35.0 -15:48:50,329.4260,34.698,35.283,31.907,35.0 -15:48:50,329.4773,34.753,35.255,32.852,35.0 -15:48:50,329.5276,34.753,35.283,32.388,35.0 -15:48:50,329.5786,34.698,35.227,31.906,35.0 -15:48:50,329.6286,34.67,35.311,33.814,35.0 -15:48:50,329.6788,34.698,35.283,32.853,35.0 -15:48:50,329.7305,34.698,35.283,32.854,35.0 -15:48:50,329.7789,34.698,35.283,32.854,35.0 -15:48:51,329.8294,34.698,35.255,32.855,35.0 -15:48:51,329.8816,34.726,35.311,33.337,35.0 -15:48:51,329.9312,34.698,35.283,31.893,35.0 -15:48:51,329.9804,34.67,35.311,32.855,35.0 -15:48:51,330.0317,34.698,35.311,32.856,35.0 -15:48:51,330.0813,34.726,35.255,32.375,35.0 -15:48:51,330.1320,34.753,35.255,32.856,35.0 -15:48:51,330.1815,34.726,35.255,32.392,35.0 -15:48:51,330.2298,34.726,35.255,32.857,35.0 -15:48:51,330.2876,34.698,35.255,32.857,35.0 -15:48:51,330.3449,34.698,35.283,33.339,35.0 -15:48:51,330.4011,34.726,35.255,32.859,35.0 -15:48:51,330.4514,34.698,35.283,32.86,35.0 -15:48:51,330.5002,34.753,35.255,32.86,35.0 -15:48:51,330.5505,34.726,35.255,32.397,35.0 -15:48:51,330.6194,34.726,35.283,32.861,35.0 -15:48:51,330.7034,34.67,35.283,32.38,35.0 -15:48:51,330.7719,34.698,35.255,33.344,35.0 -15:48:52,330.8470,34.698,35.283,33.345,35.0 -15:48:52,330.9155,34.642,35.255,32.865,35.0 -15:48:52,330.9809,34.698,35.283,34.312,35.0 -15:48:52,331.0395,34.726,35.255,32.87,35.0 -15:48:52,331.1006,34.698,35.255,32.871,35.0 -15:48:52,331.1631,34.753,35.283,33.353,35.0 -15:48:52,331.2237,34.67,35.283,31.927,35.0 -15:48:52,331.2865,34.698,35.283,33.354,35.0 -15:48:52,331.3573,34.698,35.283,32.873,35.0 -15:48:52,331.4299,34.698,35.255,32.874,35.0 -15:48:52,331.4864,34.67,35.255,33.357,35.0 -15:48:52,331.5451,34.698,35.283,33.84,35.0 -15:48:52,331.6074,34.642,35.255,32.879,35.0 -15:48:52,331.6692,34.698,35.255,34.325,35.0 -15:48:52,331.7244,34.726,35.255,33.365,35.0 -15:48:52,331.7816,34.698,35.255,32.885,35.0 -15:48:53,331.8315,34.726,35.199,33.368,35.0 -15:48:53,331.8814,34.698,35.255,33.85,35.0 -15:48:53,331.9400,34.67,35.255,33.371,35.0 -15:48:53,332.0000,34.781,35.255,33.854,35.0 -15:48:53,332.0514,34.67,35.227,31.947,35.0 -15:48:53,332.1033,34.698,35.255,34.337,35.0 -15:48:53,332.1555,34.67,35.255,33.377,35.0 -15:48:53,332.2086,34.67,35.339,33.86,35.0 -15:48:53,332.2617,34.67,35.255,32.417,35.0 -15:48:53,332.3147,34.726,35.255,33.862,35.0 -15:48:53,332.3654,34.726,35.255,32.901,35.0 -15:48:53,332.4161,34.698,35.227,32.901,35.0 -15:48:53,332.4675,34.698,35.255,33.865,35.0 -15:48:53,332.5217,34.726,35.255,33.386,35.0 -15:48:53,332.5733,34.698,35.255,32.905,35.0 -15:48:53,332.6248,34.67,35.283,33.388,35.0 -15:48:53,332.6783,34.67,35.283,33.389,35.0 -15:48:53,332.7313,34.615,35.255,33.39,35.0 -15:48:53,332.7815,34.67,35.255,34.82,35.0 -15:48:54,332.8347,34.698,35.283,33.877,35.0 -15:48:54,332.8841,34.726,35.255,32.916,35.0 -15:48:54,332.9346,34.67,35.283,32.917,35.0 -15:48:54,332.9861,34.67,35.283,33.399,35.0 -15:48:54,333.0386,34.642,35.227,33.4,35.0 -15:48:54,333.1142,34.698,35.283,34.847,35.0 -15:48:54,333.1678,34.67,35.255,32.924,35.0 -15:48:54,333.2217,34.698,35.199,33.888,35.0 -15:48:54,333.2768,34.615,35.255,34.372,35.0 -15:48:54,333.3294,34.642,35.311,34.84,35.0 -15:48:54,333.3822,34.698,35.255,33.416,35.0 -15:48:54,333.4360,34.67,35.255,33.418,35.0 -15:48:54,333.4877,34.67,35.227,33.901,35.0 -15:48:54,333.5374,34.698,35.227,34.385,35.0 -15:48:54,333.5873,34.698,35.227,33.906,35.0 -15:48:54,333.6393,34.698,35.227,33.908,35.0 -15:48:54,333.6920,34.698,35.227,33.91,35.0 -15:48:54,333.7442,34.67,35.255,33.912,35.0 -15:48:54,333.7958,34.698,35.255,33.915,35.0 -15:48:55,333.8477,34.698,35.227,33.435,35.0 -15:48:55,333.8987,34.698,35.255,33.918,35.0 -15:48:55,333.9482,34.67,35.255,33.439,35.0 -15:48:55,333.9995,34.67,35.255,33.922,35.0 -15:48:55,334.0498,34.67,35.255,33.924,35.0 -15:48:55,334.1003,34.698,35.255,33.926,35.0 -15:48:55,334.1507,34.67,35.255,33.447,35.0 -15:48:55,334.2036,34.698,35.255,33.93,35.0 -15:48:55,334.2540,34.67,35.255,33.45,35.0 -15:48:55,334.3044,34.698,35.255,33.933,35.0 -15:48:55,334.3548,34.698,35.227,33.454,35.0 -15:48:55,334.4080,34.698,35.227,33.937,35.0 -15:48:55,334.4603,34.698,35.255,33.939,35.0 -15:48:55,334.5122,34.642,35.283,33.46,35.0 -15:48:55,334.5635,34.67,35.255,33.943,35.0 -15:48:55,334.6147,34.698,35.255,33.945,35.0 -15:48:55,334.6668,34.67,35.227,33.465,35.0 -15:48:55,334.7183,34.642,35.255,34.43,35.0 -15:48:55,334.7707,34.67,35.255,34.433,35.0 -15:48:56,334.8259,34.642,35.255,33.955,35.0 -15:48:56,334.8802,34.726,35.227,34.439,35.0 -15:48:56,334.9306,34.642,35.227,33.478,35.0 -15:48:56,334.9822,34.698,35.227,34.925,35.0 -15:48:56,335.0356,34.698,35.171,33.965,35.0 -15:48:56,335.0986,34.642,35.199,34.931,35.0 -15:48:56,335.1529,34.698,35.227,35.418,35.0 -15:48:56,335.2058,34.67,35.255,33.977,35.0 -15:48:56,335.2570,34.698,35.227,33.98,35.0 -15:48:56,335.3076,34.67,35.283,33.982,35.0 -15:48:56,335.3592,34.698,35.227,33.502,35.0 -15:48:56,335.4122,34.698,35.227,33.985,35.0 -15:48:56,335.4613,34.67,35.199,33.988,35.0 -15:48:56,335.5145,34.67,35.255,34.953,35.0 -15:48:56,335.5646,34.67,35.255,33.994,35.0 -15:48:56,335.6146,34.642,35.227,33.996,35.0 -15:48:56,335.6647,34.67,35.227,34.961,35.0 -15:48:56,335.7135,34.642,35.227,34.483,35.0 -15:48:56,335.7622,34.67,35.227,34.968,35.0 -15:48:57,335.8111,34.726,35.199,34.49,35.0 -15:48:57,335.8626,34.698,35.199,34.011,35.0 -15:48:57,335.9121,34.67,35.227,34.495,35.0 -15:48:57,335.9616,34.642,35.227,34.498,35.0 -15:48:57,336.0133,34.642,35.227,34.982,35.0 -15:48:57,336.0637,34.642,35.255,34.986,35.0 -15:48:57,336.1138,34.67,35.227,34.508,35.0 -15:48:57,336.1632,34.698,35.199,34.511,35.0 -15:48:57,336.2123,34.67,35.199,34.514,35.0 -15:48:57,336.2600,34.642,35.227,34.999,35.0 -15:48:57,336.3108,34.642,35.227,35.002,35.0 -15:48:57,336.3623,34.67,35.227,35.006,35.0 -15:48:57,336.4108,34.642,35.199,34.528,35.0 -15:48:57,336.4632,34.67,35.115,35.494,35.0 -15:48:57,336.5121,34.67,35.227,36.462,35.0 -15:48:57,336.5635,34.67,35.227,34.542,35.0 -15:48:57,336.6122,34.67,35.227,34.545,35.0 -15:48:57,336.6612,34.67,35.227,34.548,35.0 -15:48:57,336.7134,34.615,35.199,34.551,35.0 -15:48:57,336.7624,34.67,35.227,35.982,35.0 -15:48:58,336.8102,34.698,35.255,34.559,35.0 -15:48:58,336.8620,34.698,35.227,33.599,35.0 -15:48:58,336.9122,34.67,35.199,34.082,35.0 -15:48:58,336.9626,34.67,35.199,35.047,35.0 -15:48:58,337.0124,34.67,35.227,35.051,35.0 -15:48:58,337.0626,34.642,35.171,34.573,35.0 -15:48:58,337.1122,34.642,35.227,36.021,35.0 -15:48:58,337.1622,34.642,35.227,35.063,35.0 -15:48:58,337.2128,34.642,35.227,35.067,35.0 -15:48:58,337.2631,34.615,35.227,35.071,35.0 -15:48:58,337.3125,34.642,35.199,35.539,35.0 -15:48:58,337.3622,34.642,35.227,35.56,35.0 -15:48:58,337.4117,34.67,35.227,35.083,35.0 -15:48:58,337.4636,34.67,35.199,34.605,35.0 -15:48:58,337.5127,34.642,35.199,35.09,35.0 -15:48:58,337.5634,34.615,35.199,35.575,35.0 -15:48:58,337.6135,34.615,35.199,36.044,35.0 -15:48:58,337.6623,34.642,35.199,36.05,35.0 -15:48:58,337.7118,34.642,35.199,35.59,35.0 -15:48:58,337.7605,34.642,35.199,35.595,35.0 -15:48:59,337.8116,34.642,35.199,35.599,35.0 -15:48:59,337.8631,34.615,35.227,35.604,35.0 -15:48:59,337.9130,34.615,35.199,35.592,35.0 -15:48:59,337.9628,34.642,35.227,36.078,35.0 -15:48:59,338.0140,34.615,35.199,35.137,35.0 -15:48:59,338.0635,34.642,35.171,36.087,35.0 -15:48:59,338.1119,34.642,35.199,36.109,35.0 -15:48:59,338.1613,34.67,35.199,35.633,35.0 -15:48:59,338.2120,34.67,35.199,35.156,35.0 -15:48:59,338.2601,34.642,35.227,35.16,35.0 -15:48:59,338.3104,34.67,35.199,35.163,35.0 -15:48:59,338.3631,34.642,35.199,35.167,35.0 -15:48:59,338.4129,34.642,35.199,35.653,35.0 -15:48:59,338.4629,34.615,35.199,35.657,35.0 -15:48:59,338.5117,34.642,35.199,36.126,35.0 -15:48:59,338.5608,34.642,35.171,35.667,35.0 -15:48:59,338.6166,34.67,35.171,36.153,35.0 -15:48:59,338.6668,34.642,35.227,35.677,35.0 -15:48:59,338.7172,34.642,35.199,35.2,35.0 -15:48:59,338.7685,34.615,35.199,35.685,35.0 -15:49:00,338.8191,34.615,35.199,36.155,35.0 -15:49:00,338.8692,34.698,35.227,36.16,35.0 -15:49:00,338.9189,34.67,35.171,34.256,35.0 -15:49:00,338.9695,34.615,35.171,35.703,35.0 -15:49:00,339.0195,34.642,35.227,36.654,35.0 -15:49:00,339.0680,34.67,35.171,35.232,35.0 -15:49:00,339.1189,34.615,35.171,35.717,35.0 -15:49:00,339.1687,34.615,35.199,36.668,35.0 -15:49:00,339.2180,34.615,35.199,36.192,35.0 -15:49:00,339.2670,34.615,35.255,36.198,35.0 -15:49:00,339.3177,34.642,35.199,35.24,35.0 -15:49:00,339.3678,34.615,35.199,35.742,35.0 -15:49:00,339.4204,34.642,35.171,36.211,35.0 -15:49:00,339.4748,34.587,35.171,36.234,35.0 -15:49:00,339.5288,34.615,35.199,37.186,35.0 -15:49:00,339.5830,34.615,35.199,36.23,35.0 -15:49:00,339.6335,34.615,35.199,36.236,35.0 -15:49:00,339.6837,34.615,35.171,36.241,35.0 -15:49:00,339.7351,34.615,35.143,36.728,35.0 -15:49:01,339.8284,34.615,35.199,37.216,35.0 -15:49:01,339.8805,34.67,35.199,36.264,35.0 -15:49:01,339.9311,34.642,35.199,35.324,35.0 -15:49:01,339.9805,34.642,35.199,35.809,35.0 -15:49:01,340.0308,34.531,35.143,35.814,35.0 -15:49:01,340.0802,34.642,35.199,38.691,35.0 -15:49:01,340.1333,34.67,35.143,35.828,35.0 -15:49:01,340.1830,34.615,35.171,36.314,35.0 -15:49:01,340.2345,34.642,35.143,36.784,35.0 -15:49:01,340.2849,34.615,35.199,36.807,35.0 -15:49:01,340.3345,34.615,35.171,36.315,35.0 -15:49:01,340.3840,34.615,35.199,36.801,35.0 -15:49:01,340.4345,34.615,35.171,36.326,35.0 -15:49:01,340.4845,34.615,35.199,36.813,35.0 -15:49:01,340.5345,34.67,35.171,36.337,35.0 -15:49:01,340.5845,34.698,35.171,35.878,35.0 -15:49:01,340.6348,34.642,35.171,35.401,35.0 -15:49:01,340.6868,34.615,35.199,36.368,35.0 -15:49:01,340.7371,34.615,35.171,36.357,35.0 -15:49:01,340.7865,34.642,35.227,36.843,35.0 -15:49:02,340.8373,34.642,35.171,35.422,35.0 -15:49:02,340.8875,34.642,35.199,36.389,35.0 -15:49:02,340.9386,34.615,35.171,35.913,35.0 -15:49:02,340.9896,34.67,35.199,36.863,35.0 -15:49:02,341.0419,34.642,35.143,35.442,35.0 -15:49:02,341.0926,34.587,35.171,36.891,35.0 -15:49:02,341.1447,34.642,35.171,37.362,35.0 -15:49:02,341.1948,34.615,35.143,36.423,35.0 -15:49:02,341.2462,34.615,35.171,37.374,35.0 -15:49:02,341.2958,34.615,35.199,36.899,35.0 -15:49:02,341.3448,34.615,35.171,36.424,35.0 -15:49:02,341.3939,34.642,35.171,36.911,35.0 -15:49:02,341.4454,34.559,35.199,36.452,35.0 -15:49:02,341.4930,34.642,35.171,37.404,35.0 -15:49:02,341.5448,34.615,35.171,36.465,35.0 -15:49:02,341.5938,34.615,35.143,36.935,35.0 -15:49:02,341.6448,34.615,35.171,37.422,35.0 -15:49:02,341.6931,34.615,35.171,36.947,35.0 -15:49:02,341.7446,34.642,35.199,36.953,35.0 -15:49:02,341.7939,34.587,35.143,36.014,35.0 -15:49:03,341.8461,34.642,35.199,37.927,35.0 -15:49:03,341.8962,34.642,35.171,36.026,35.0 -15:49:03,341.9461,34.587,35.171,36.512,35.0 -15:49:03,341.9961,34.587,35.171,37.463,35.0 -15:49:03,342.0467,34.615,35.171,37.47,35.0 -15:49:03,342.0967,34.615,35.143,36.996,35.0 -15:49:03,342.1466,34.615,35.171,37.483,35.0 -15:49:03,342.1971,34.587,35.171,37.009,35.0 -15:49:03,342.2472,34.615,35.171,37.497,35.0 -15:49:03,342.2967,34.615,35.199,37.022,35.0 -15:49:03,342.3468,34.642,35.171,36.546,35.0 -15:49:03,342.3957,34.615,35.171,36.569,35.0 -15:49:03,342.4457,34.642,35.171,37.038,35.0 -15:49:03,342.4946,34.615,35.143,36.58,35.0 -15:49:03,342.5437,34.642,35.171,37.531,35.0 -15:49:03,342.5915,34.615,35.171,36.592,35.0 -15:49:03,342.6443,34.587,35.171,37.062,35.0 -15:49:03,342.6975,34.615,35.143,37.55,35.0 -15:49:03,342.7492,34.587,35.171,37.557,35.0 -15:49:03,342.8008,34.615,35.143,37.564,35.0 -15:49:04,342.8556,34.615,35.171,37.572,35.0 -15:49:04,342.9095,34.642,35.171,37.097,35.0 -15:49:04,342.9638,34.559,35.171,36.639,35.0 -15:49:04,343.0154,34.615,35.171,38.073,35.0 -15:49:04,343.0683,34.559,35.171,37.118,35.0 -15:49:04,343.1213,34.615,35.171,38.088,35.0 -15:49:04,343.1765,34.587,35.171,37.132,35.0 -15:49:04,343.2309,34.587,35.171,37.621,35.0 -15:49:04,343.2835,34.698,35.171,37.628,35.0 -15:49:04,343.3348,34.615,35.171,35.726,35.0 -15:49:04,343.3860,34.587,35.171,37.158,35.0 -15:49:04,343.4399,34.615,35.171,37.646,35.0 -15:49:04,343.4942,34.615,35.171,37.171,35.0 -15:49:04,343.5454,34.615,35.143,37.178,35.0 -15:49:04,343.5979,34.615,35.199,37.666,35.0 -15:49:04,343.6521,34.642,35.171,36.71,35.0 -15:49:04,343.7064,34.615,35.171,36.733,35.0 -15:49:04,343.7602,34.615,35.115,37.203,35.0 -15:49:05,343.8126,34.587,35.171,38.173,35.0 -15:49:05,343.8653,34.587,35.171,37.699,35.0 -15:49:05,343.9182,34.587,35.171,37.707,35.0 -15:49:05,343.9727,34.587,35.199,37.714,35.0 -15:49:05,344.0272,34.587,35.171,37.24,35.0 -15:49:05,344.0803,34.587,35.143,37.728,35.0 -15:49:05,344.1327,34.587,35.143,38.217,35.0 -15:49:05,344.1863,34.587,35.143,38.225,35.0 -15:49:05,344.2367,34.67,35.143,38.234,35.0 -15:49:05,344.2867,34.587,35.171,36.814,35.0 -15:49:05,344.3369,34.615,35.143,37.765,35.0 -15:49:05,344.3868,34.615,35.171,37.772,35.0 -15:49:05,344.4372,34.67,35.059,37.297,35.0 -15:49:05,344.4860,34.615,35.171,38.284,35.0 -15:49:05,344.5360,34.559,35.143,37.311,35.0 -15:49:05,344.5866,34.587,35.199,38.762,35.0 -15:49:05,344.6384,34.587,35.143,37.326,35.0 -15:49:05,344.6884,34.615,35.143,38.295,35.0 -15:49:05,344.7380,34.642,35.143,37.821,35.0 -15:49:05,344.7866,34.615,35.227,37.364,35.0 -15:49:06,344.8395,34.559,35.171,36.389,35.0 -15:49:06,344.8921,34.531,35.199,38.321,35.0 -15:49:06,344.9461,34.587,35.143,38.329,35.0 -15:49:06,344.9999,34.587,35.143,38.337,35.0 -15:49:06,345.0526,34.587,35.143,38.346,35.0 -15:49:06,345.1070,34.587,35.199,38.354,35.0 -15:49:06,345.1595,34.587,35.171,37.399,35.0 -15:49:06,345.2148,34.587,35.143,37.887,35.0 -15:49:06,345.2668,34.559,35.171,38.376,35.0 -15:49:06,345.3308,34.587,35.171,38.384,35.0 -15:49:06,345.3980,34.587,35.171,37.912,35.0 -15:49:06,345.4586,34.615,35.143,37.922,35.0 -15:49:06,345.5098,34.559,35.171,37.93,35.0 -15:49:06,345.5612,34.587,35.143,38.419,35.0 -15:49:06,345.6259,34.615,35.143,38.427,35.0 -15:49:06,345.6984,34.587,35.143,37.955,35.0 -15:49:06,345.7596,34.587,35.143,38.447,35.0 -15:49:07,345.8294,34.615,35.143,38.456,35.0 -15:49:07,345.8904,34.615,35.171,37.985,35.0 -15:49:07,345.9576,34.559,35.115,37.512,35.0 -15:49:07,346.0212,34.531,35.199,39.448,35.0 -15:49:07,346.0858,34.642,35.143,38.496,35.0 -15:49:07,346.1453,34.642,35.143,37.559,35.0 -15:49:07,346.2082,34.615,35.143,37.566,35.0 -15:49:07,346.2736,34.587,35.171,38.039,35.0 -15:49:07,346.3429,34.587,35.171,38.048,35.0 -15:49:07,346.4025,34.559,35.143,38.057,35.0 -15:49:07,346.4707,34.559,35.143,39.029,35.0 -15:49:07,346.5311,34.587,35.171,39.041,35.0 -15:49:07,346.5885,34.559,35.115,38.087,35.0 -15:49:07,346.6406,34.559,35.143,39.541,35.0 -15:49:07,346.6931,34.559,35.171,39.069,35.0 -15:49:07,346.7412,34.587,35.143,38.596,35.0 -15:49:07,346.7933,34.559,35.171,38.603,35.0 -15:49:08,346.8419,34.587,35.143,38.611,35.0 -15:49:08,346.9056,34.587,35.143,38.619,35.0 -15:49:08,346.9638,34.587,35.143,38.629,35.0 -15:49:08,347.0164,34.587,35.143,38.638,35.0 -15:49:08,347.0677,34.587,35.143,38.646,35.0 -15:49:08,347.1180,34.587,35.115,38.654,35.0 -15:49:08,347.1742,34.615,35.143,39.143,35.0 -15:49:08,347.2269,34.587,35.115,38.189,35.0 -15:49:08,347.2745,34.587,35.143,39.16,35.0 -15:49:08,347.3262,34.587,35.115,38.686,35.0 -15:49:08,347.3760,34.587,35.171,39.176,35.0 -15:49:08,347.4283,34.615,35.143,38.221,35.0 -15:49:08,347.4801,34.642,35.143,38.228,35.0 -15:49:08,347.5294,34.587,35.143,37.771,35.0 -15:49:08,347.5802,34.587,35.115,38.723,35.0 -15:49:08,347.6291,34.587,35.143,39.213,35.0 -15:49:08,347.6790,34.587,35.143,38.739,35.0 -15:49:08,347.7282,34.559,35.143,38.747,35.0 -15:49:08,347.7789,34.559,35.143,39.236,35.0 -15:49:09,347.8285,34.587,35.115,39.245,35.0 -15:49:09,347.8776,34.587,35.143,39.253,35.0 -15:49:09,347.9282,34.559,35.143,38.78,35.0 -15:49:09,347.9776,34.587,35.115,39.269,35.0 -15:49:09,348.0280,34.587,35.115,39.278,35.0 -15:49:09,348.0785,34.531,35.115,39.286,35.0 -15:49:09,348.1283,34.587,35.171,40.258,35.0 -15:49:09,348.1788,34.587,35.171,38.342,35.0 -15:49:09,348.2303,34.615,35.143,38.349,35.0 -15:49:09,348.2835,34.531,35.143,38.356,35.0 -15:49:09,348.3347,34.559,35.115,39.808,35.0 -15:49:09,348.3862,34.559,35.087,39.818,35.0 -15:49:09,348.4401,34.559,35.087,40.309,35.0 -15:49:09,348.4945,34.559,35.115,40.32,35.0 -15:49:09,348.5468,34.587,35.115,39.849,35.0 -15:49:09,348.6036,34.559,35.171,39.377,35.0 -15:49:09,348.6608,34.587,35.115,38.905,35.0 -15:49:09,348.7147,34.559,35.143,39.396,35.0 -15:49:09,348.7664,34.587,35.199,39.405,35.0 -15:49:10,348.8189,34.587,35.115,37.969,35.0 -15:49:10,348.8723,34.559,35.143,39.42,35.0 -15:49:10,348.9270,34.559,35.143,39.429,35.0 -15:49:10,348.9814,34.531,35.115,39.439,35.0 -15:49:10,349.0343,34.448,35.143,40.411,35.0 -15:49:10,349.0876,34.587,35.115,41.368,35.0 -15:49:10,349.1412,34.559,35.171,39.471,35.0 -15:49:10,349.1947,34.587,35.115,38.999,35.0 -15:49:10,349.2480,34.559,35.059,39.489,35.0 -15:49:10,349.3015,34.559,35.032,40.943,35.0 -15:49:10,349.3550,34.559,35.171,41.419,35.0 -15:49:10,349.4092,34.559,35.059,39.04,35.0 -15:49:10,349.4628,34.587,35.143,40.975,35.0 -15:49:10,349.5165,34.559,35.171,39.06,35.0 -15:49:10,349.5689,34.587,35.143,39.068,35.0 -15:49:10,349.6208,34.587,35.115,39.077,35.0 -15:49:10,349.6752,34.504,35.143,39.566,35.0 -15:49:10,349.7281,34.559,35.115,40.522,35.0 -15:49:10,349.7816,34.531,35.143,40.068,35.0 -15:49:11,349.8348,34.615,35.087,40.078,35.0 -15:49:11,349.8899,34.587,35.143,39.606,35.0 -15:49:11,349.9436,34.559,35.143,39.134,35.0 -15:49:11,349.9976,34.559,35.059,39.624,35.0 -15:49:11,350.0501,34.587,35.115,41.078,35.0 -15:49:11,350.1100,34.531,35.115,39.644,35.0 -15:49:11,350.1634,34.559,35.115,40.618,35.0 -15:49:11,350.2173,34.559,35.115,40.147,35.0 -15:49:11,350.2734,34.559,35.143,40.157,35.0 -15:49:11,350.3263,34.559,35.115,39.686,35.0 -15:49:11,350.3760,34.587,35.115,40.177,35.0 -15:49:11,350.4246,34.559,35.115,39.704,35.0 -15:49:11,350.4799,34.559,35.115,40.194,35.0 -15:49:11,350.5323,34.559,35.115,40.204,35.0 -15:49:11,350.5841,34.559,35.115,40.214,35.0 -15:49:11,350.6337,34.559,35.143,40.224,35.0 -15:49:11,350.6852,34.559,35.059,39.752,35.0 -15:49:11,350.7353,34.587,35.087,41.205,35.0 -15:49:11,350.7854,34.587,35.171,40.253,35.0 -15:49:12,350.8381,34.587,35.143,38.817,35.0 -15:49:12,350.8897,34.559,35.115,39.306,35.0 -15:49:12,350.9404,34.587,35.115,40.277,35.0 -15:49:12,350.9917,34.559,35.171,39.805,35.0 -15:49:12,351.0423,34.587,35.115,39.332,35.0 -15:49:12,351.0918,34.531,35.115,39.822,35.0 -15:49:12,351.1400,34.587,35.143,40.793,35.0 -15:49:12,351.1921,34.559,35.115,39.358,35.0 -15:49:12,351.2406,34.559,35.115,40.33,35.0 -15:49:12,351.2928,34.531,35.115,40.339,35.0 -15:49:12,351.3428,34.559,35.087,40.83,35.0 -15:49:12,351.3925,34.559,35.115,40.84,35.0 -15:49:12,351.4434,34.559,35.143,40.369,35.0 -15:49:12,351.4955,34.531,35.115,39.897,35.0 -15:49:12,351.5486,34.531,35.087,40.869,35.0 -15:49:12,351.6075,34.531,35.115,41.362,35.0 -15:49:12,351.6586,34.559,35.115,40.892,35.0 -15:49:12,351.7115,34.559,35.115,40.421,35.0 -15:49:12,351.7606,34.587,35.115,40.431,35.0 -15:49:13,351.8102,34.559,35.171,39.958,35.0 -15:49:13,351.8593,34.559,35.115,39.485,35.0 -15:49:13,351.9102,34.531,35.087,40.456,35.0 -15:49:13,351.9601,34.587,35.115,41.429,35.0 -15:49:13,352.0113,34.531,35.087,39.995,35.0 -15:49:13,352.0617,34.559,35.171,41.449,35.0 -15:49:13,352.1126,34.559,35.115,39.533,35.0 -15:49:13,352.1640,34.559,35.115,40.504,35.0 -15:49:13,352.2148,34.587,35.115,40.514,35.0 -15:49:13,352.2654,34.559,35.115,40.041,35.0 -15:49:13,352.3155,34.559,35.115,40.532,35.0 -15:49:13,352.3649,34.559,35.087,40.541,35.0 -15:49:13,352.4147,34.559,35.115,41.032,35.0 -15:49:13,352.4654,34.559,35.087,40.56,35.0 -15:49:13,352.5157,34.559,35.087,41.051,35.0 -15:49:13,352.5672,34.559,35.115,41.062,35.0 -15:49:13,352.6188,34.531,35.087,40.59,35.0 -15:49:13,352.6746,34.559,35.143,41.563,35.0 -15:49:13,352.7263,34.559,35.115,40.13,35.0 -15:49:13,352.7758,34.531,35.087,40.621,35.0 -15:49:14,352.8258,34.559,35.115,41.593,35.0 -15:49:14,352.8760,34.559,35.115,40.641,35.0 -15:49:14,352.9279,34.559,35.115,40.65,35.0 -15:49:14,352.9791,34.559,35.115,40.66,35.0 -15:49:14,353.0318,34.559,35.115,40.669,35.0 -15:49:14,353.0828,34.559,35.087,40.679,35.0 -15:49:14,353.1334,34.531,35.115,41.17,35.0 -15:49:14,353.1853,34.559,35.115,41.18,35.0 -15:49:14,353.2378,34.559,35.115,40.709,35.0 -15:49:14,353.2902,34.559,35.115,40.719,35.0 -15:49:14,353.3432,34.559,35.115,40.729,35.0 -15:49:14,353.3926,34.531,35.115,40.739,35.0 -15:49:14,353.4429,34.559,35.115,41.23,35.0 -15:49:14,353.4925,34.531,35.087,40.758,35.0 -15:49:14,353.5427,34.559,35.143,41.731,35.0 -15:49:14,353.5928,34.559,35.087,40.297,35.0 -15:49:14,353.6429,34.559,35.143,41.269,35.0 -15:49:14,353.6934,34.559,35.115,40.315,35.0 -15:49:14,353.7431,34.559,35.087,40.806,35.0 -15:49:14,353.7930,34.531,35.087,41.297,35.0 -15:49:15,353.8427,34.559,35.115,41.788,35.0 -15:49:15,353.8932,34.531,35.143,40.836,35.0 -15:49:15,353.9430,34.559,35.087,40.845,35.0 -15:49:15,353.9935,34.531,35.087,41.336,35.0 -15:49:15,354.0449,34.559,35.087,41.828,35.0 -15:49:15,354.0950,34.531,35.115,41.357,35.0 -15:49:15,354.1460,34.559,35.087,41.368,35.0 -15:49:15,354.1971,34.531,35.087,41.378,35.0 -15:49:15,354.2490,34.531,35.087,41.87,35.0 -15:49:15,354.3014,34.587,35.115,41.881,35.0 -15:49:15,354.3595,34.531,35.087,40.448,35.0 -15:49:15,354.4094,34.587,35.115,41.903,35.0 -15:49:15,354.4596,34.559,35.059,40.469,35.0 -15:49:15,354.5116,34.559,35.115,41.922,35.0 -15:49:15,354.5635,34.615,35.115,40.97,35.0 -15:49:15,354.6153,34.559,35.115,40.017,35.0 -15:49:15,354.6657,34.559,35.115,40.988,35.0 -15:49:15,354.7179,34.531,35.059,40.997,35.0 -15:49:15,354.7720,34.615,35.115,42.452,35.0 -15:49:16,354.8233,34.587,35.087,40.056,35.0 -15:49:16,354.8751,34.531,35.115,41.027,35.0 -15:49:16,354.9261,34.531,35.087,41.519,35.0 -15:49:16,354.9768,34.531,35.171,42.011,35.0 -15:49:16,355.0290,34.531,35.032,40.577,35.0 -15:49:16,355.0794,34.559,35.115,42.977,35.0 -15:49:16,355.1296,34.531,35.115,41.08,35.0 -15:49:16,355.1809,34.559,35.087,41.571,35.0 -15:49:16,355.2318,34.559,35.087,41.581,35.0 -15:49:16,355.2826,34.559,35.115,41.592,35.0 -15:49:16,355.3356,34.559,35.087,41.12,35.0 -15:49:16,355.3892,34.531,35.115,41.612,35.0 -15:49:16,355.4418,34.559,35.115,41.623,35.0 -15:49:16,355.4968,34.476,35.087,41.152,35.0 -15:49:16,355.5477,34.559,35.087,43.071,35.0 -15:49:16,355.5980,34.531,35.087,41.656,35.0 -15:49:16,355.6484,34.531,35.115,42.148,35.0 -15:49:16,355.6992,34.559,35.087,41.678,35.0 -15:49:16,355.7504,34.531,35.115,41.688,35.0 -15:49:16,355.8007,34.559,35.087,41.698,35.0 -15:49:17,355.8504,34.504,35.087,41.708,35.0 -15:49:17,355.9006,34.531,35.087,42.664,35.0 -15:49:17,355.9535,34.531,35.059,42.212,35.0 -15:49:17,356.0054,34.559,35.115,42.705,35.0 -15:49:17,356.0576,34.559,35.087,41.272,35.0 -15:49:17,356.1074,34.559,35.115,41.764,35.0 -15:49:17,356.1567,34.531,35.115,41.292,35.0 -15:49:17,356.2103,34.559,35.087,41.783,35.0 -15:49:17,356.2619,34.531,35.115,41.794,35.0 -15:49:17,356.3136,34.559,35.115,41.804,35.0 -15:49:17,356.3647,34.531,35.115,41.333,35.0 -15:49:17,356.4158,34.531,35.115,41.824,35.0 -15:49:17,356.4685,34.504,35.115,41.834,35.0 -15:49:17,356.5215,34.531,35.087,42.31,35.0 -15:49:17,356.5729,34.531,35.059,42.338,35.0 -15:49:17,356.6258,34.531,35.032,42.831,35.0 -15:49:17,356.6787,34.531,35.087,43.308,35.0 -15:49:17,356.7310,34.531,35.087,42.375,35.0 -15:49:17,356.7816,34.559,35.087,42.386,35.0 -15:49:18,356.8329,34.531,35.087,41.916,35.0 -15:49:18,356.8834,34.559,35.087,42.408,35.0 -15:49:18,356.9346,34.531,35.004,41.937,35.0 -15:49:18,356.9842,34.531,35.087,43.857,35.0 -15:49:18,357.0358,34.559,35.087,42.442,35.0 -15:49:18,357.0884,34.531,35.087,41.972,35.0 -15:49:18,357.1878,34.587,35.059,42.464,35.0 -15:49:18,357.2423,34.504,35.115,42.004,35.0 -15:49:18,357.2938,34.531,35.087,42.479,35.0 -15:49:18,357.3456,34.559,35.115,42.508,35.0 -15:49:18,357.3965,34.531,35.087,41.555,35.0 -15:49:18,357.4483,34.559,35.087,42.528,35.0 -15:49:18,357.4988,34.531,35.087,42.058,35.0 -15:49:18,357.5511,34.531,35.115,42.55,35.0 -15:49:18,357.6025,34.559,35.115,42.08,35.0 -15:49:18,357.6538,34.531,35.087,41.608,35.0 -15:49:18,357.7056,34.504,35.115,42.581,35.0 -15:49:18,357.7566,34.559,35.115,42.575,35.0 -15:49:18,357.8069,34.504,35.087,41.64,35.0 -15:49:19,357.8580,34.587,35.087,43.077,35.0 -15:49:19,357.9092,34.587,35.087,41.662,35.0 -15:49:19,357.9600,34.531,35.087,41.671,35.0 -15:49:19,358.0107,34.504,35.087,42.644,35.0 -15:49:19,358.0616,34.559,35.087,43.119,35.0 -15:49:19,358.1125,34.531,35.087,42.185,35.0 -15:49:19,358.1628,34.531,35.087,42.677,35.0 -15:49:19,358.2149,34.531,35.087,42.688,35.0 -15:49:19,358.2668,34.531,35.087,42.699,35.0 -15:49:19,358.3168,34.531,35.087,42.711,35.0 -15:49:19,358.3666,34.531,35.087,42.722,35.0 -15:49:19,358.4175,34.531,35.115,42.732,35.0 -15:49:19,358.4697,34.559,35.087,42.262,35.0 -15:49:19,358.5172,34.531,35.115,42.272,35.0 -15:49:19,358.5627,34.559,35.087,42.282,35.0 -15:49:19,358.6093,34.531,35.143,42.291,35.0 -15:49:19,358.6570,34.559,35.087,41.819,35.0 -15:49:19,358.7039,34.559,35.087,42.31,35.0 -15:49:19,358.7538,34.504,35.115,42.319,35.0 -15:49:19,358.8013,34.531,35.087,42.794,35.0 -15:49:20,358.8501,34.531,35.115,42.821,35.0 -15:49:20,358.9000,34.531,35.087,42.35,35.0 -15:49:20,358.9502,34.476,35.087,42.842,35.0 -15:49:20,358.9961,34.531,35.059,43.799,35.0 -15:49:20,359.0434,34.448,35.087,43.346,35.0 -15:49:20,359.0901,34.531,35.087,44.303,35.0 -15:49:20,359.1373,34.448,35.087,42.888,35.0 -15:49:20,359.1856,34.476,35.087,44.326,35.0 -15:49:20,359.2339,34.531,35.059,43.857,35.0 -15:49:20,359.2816,34.559,35.059,43.405,35.0 -15:49:20,359.3284,34.559,35.087,42.934,35.0 -15:49:20,359.3766,34.531,35.087,42.463,35.0 -15:49:20,359.4236,34.504,35.115,42.954,35.0 -15:49:20,359.4734,34.504,35.087,42.947,35.0 -15:49:20,359.5165,34.531,35.004,43.44,35.0 -15:49:20,359.5624,34.531,35.115,44.413,35.0 -15:49:20,359.6077,34.531,35.087,42.516,35.0 -15:49:20,359.6522,34.531,35.059,43.007,35.0 -15:49:20,359.6975,34.531,35.087,43.498,35.0 -15:49:20,359.7458,34.504,35.115,43.028,35.0 -15:49:20,359.7883,34.531,35.059,43.02,35.0 -15:49:21,359.8323,34.531,35.115,43.528,35.0 -15:49:21,359.8757,34.504,35.087,42.576,35.0 -15:49:21,359.9191,34.504,35.059,43.53,35.0 -15:49:21,359.9632,34.504,35.115,44.022,35.0 -15:49:21,360.0065,34.559,35.087,43.07,35.0 -15:49:21,360.0508,34.504,35.059,42.615,35.0 -15:49:21,360.0957,34.504,35.143,44.051,35.0 -15:49:21,360.1379,34.559,35.115,42.618,35.0 -15:49:21,360.1813,34.504,35.087,42.162,35.0 -15:49:21,360.2239,34.531,35.032,43.597,35.0 -15:49:21,360.2667,34.504,35.032,44.089,35.0 -15:49:21,360.3158,34.504,35.087,44.564,35.0 -15:49:21,360.3651,34.504,35.087,43.631,35.0 -15:49:21,360.4115,34.531,35.115,43.643,35.0 -15:49:21,360.4570,34.531,35.087,42.707,35.0 -15:49:21,360.5020,34.531,35.087,43.199,35.0 -15:49:21,360.5464,34.531,35.004,43.208,35.0 -15:49:21,360.5876,34.531,35.115,44.645,35.0 -15:49:21,360.6717,34.531,35.087,42.747,35.0 -15:49:21,360.7425,34.587,35.059,43.248,35.0 -15:49:21,360.7947,34.531,35.087,42.781,35.0 -15:49:22,360.8686,34.559,35.087,43.273,35.0 -15:49:22,360.9303,34.504,35.059,42.807,35.0 -15:49:22,360.9875,34.504,35.087,44.248,35.0 -15:49:22,361.0428,34.504,35.143,43.781,35.0 -15:49:22,361.1024,34.531,35.087,42.83,35.0 -15:49:22,361.1530,34.531,35.115,43.34,35.0 -15:49:22,361.2025,34.531,35.087,42.87,35.0 -15:49:22,361.2559,34.504,35.087,43.362,35.0 -15:49:22,361.3085,34.559,35.087,43.837,35.0 -15:49:22,361.3592,34.504,35.087,42.904,35.0 -15:49:22,361.4186,34.421,35.087,43.86,35.0 -15:49:22,361.4744,34.531,35.087,45.302,35.0 -15:49:22,361.5228,34.587,35.087,43.425,35.0 -15:49:22,361.5701,34.531,35.032,42.472,35.0 -15:49:22,361.6192,34.531,35.087,44.39,35.0 -15:49:22,361.6674,34.531,35.087,43.457,35.0 -15:49:22,361.7141,34.559,35.087,43.467,35.0 -15:49:22,361.7581,34.531,35.115,42.996,35.0 -15:49:22,361.8012,34.559,35.087,43.004,35.0 -15:49:23,361.8460,34.531,35.087,43.013,35.0 -15:49:23,361.8897,34.531,35.087,43.504,35.0 -15:49:23,361.9337,34.531,35.087,43.513,35.0 -15:49:23,361.9913,34.559,35.032,43.523,35.0 -15:49:23,362.0336,34.531,35.115,44.0,35.0 -15:49:23,362.0756,34.504,35.087,43.064,35.0 -15:49:23,362.1198,34.504,35.115,44.018,35.0 -15:49:23,362.1635,34.531,35.032,43.547,35.0 -15:49:23,362.2068,34.531,35.087,44.52,35.0 -15:49:23,362.2492,34.531,35.032,43.585,35.0 -15:49:23,362.2927,34.559,35.087,44.54,35.0 -15:49:23,362.3366,34.559,35.059,43.123,35.0 -15:49:23,362.3816,34.504,35.087,43.614,35.0 -15:49:23,362.4262,34.448,35.087,44.088,35.0 -15:49:23,362.4718,34.476,35.059,45.061,35.0 -15:49:23,362.5162,34.504,35.087,45.073,35.0 -15:49:23,362.5636,34.531,35.115,44.122,35.0 -15:49:23,362.6106,34.504,35.087,43.188,35.0 -15:49:23,362.6544,34.531,35.087,44.143,35.0 -15:49:23,362.6996,34.531,35.087,43.689,35.0 -15:49:23,362.7427,34.531,35.115,43.698,35.0 -15:49:23,362.7852,34.504,35.087,43.226,35.0 -15:49:24,362.8283,34.531,35.143,44.181,35.0 -15:49:24,362.8714,34.531,35.059,42.763,35.0 -15:49:24,362.9155,34.504,35.059,44.216,35.0 -15:49:24,362.9588,34.504,35.087,44.691,35.0 -15:49:24,362.9998,34.504,35.059,44.22,35.0 -15:49:24,363.0452,34.531,35.115,44.711,35.0 -15:49:24,363.0882,34.531,35.059,43.295,35.0 -15:49:24,363.1338,34.476,35.059,44.267,35.0 -15:49:24,363.1932,34.559,35.087,45.225,35.0 -15:49:24,363.2385,34.504,35.087,43.33,35.0 -15:49:24,363.2828,34.531,35.059,44.285,35.0 -15:49:24,363.3267,34.531,35.087,44.312,35.0 -15:49:24,363.3715,34.531,35.087,43.841,35.0 -15:49:24,363.4158,34.504,35.143,43.851,35.0 -15:49:24,363.4594,34.531,35.143,43.362,35.0 -15:49:24,363.5070,34.531,35.087,42.906,35.0 -15:49:24,363.5489,34.504,35.059,43.878,35.0 -15:49:24,363.5937,34.504,35.059,44.833,35.0 -15:49:24,363.6376,34.531,35.059,44.844,35.0 -15:49:24,363.6823,34.531,35.087,44.391,35.0 -15:49:24,363.7280,34.531,35.087,43.92,35.0 -15:49:24,363.7723,34.531,35.032,43.93,35.0 -15:49:25,363.8152,34.504,35.087,44.885,35.0 -15:49:25,363.8598,34.531,35.059,44.414,35.0 -15:49:25,363.9038,34.531,35.059,44.442,35.0 -15:49:25,363.9466,34.504,35.087,44.452,35.0 -15:49:25,363.9895,34.531,35.059,44.445,35.0 -15:49:25,364.0325,34.504,35.115,44.472,35.0 -15:49:25,364.0758,34.504,35.087,43.984,35.0 -15:49:25,364.1205,34.531,35.059,44.475,35.0 -15:49:25,364.1650,34.504,35.087,44.502,35.0 -15:49:25,364.2092,34.531,35.087,44.496,35.0 -15:49:25,364.2536,34.504,35.059,44.042,35.0 -15:49:25,364.2968,34.531,35.059,44.997,35.0 -15:49:25,364.3386,34.476,35.087,44.543,35.0 -15:49:25,364.3836,34.504,35.087,45.018,35.0 -15:49:25,364.4276,34.504,35.059,44.547,35.0 -15:49:25,364.4715,34.531,35.032,45.039,35.0 -15:49:25,364.5188,34.587,35.059,45.05,35.0 -15:49:25,364.5819,34.587,35.115,43.634,35.0 -15:49:25,364.6386,34.504,35.032,42.684,35.0 -15:49:25,364.6840,34.504,35.087,45.549,35.0 -15:49:25,364.7278,34.448,35.032,44.615,35.0 -15:49:25,364.7719,34.476,35.087,46.534,35.0 -15:49:26,364.8157,34.531,35.087,45.12,35.0 -15:49:26,364.8577,34.531,35.059,44.185,35.0 -15:49:26,364.9019,34.504,35.087,44.675,35.0 -15:49:26,364.9454,34.531,35.032,44.669,35.0 -15:49:26,364.9886,34.531,35.087,45.16,35.0 -15:49:26,365.0305,34.531,35.059,44.225,35.0 -15:49:26,365.0743,34.476,35.087,44.716,35.0 -15:49:26,365.1245,34.531,35.032,45.191,35.0 -15:49:26,365.1692,34.504,35.059,45.203,35.0 -15:49:26,365.2145,34.504,35.087,45.214,35.0 -15:49:26,365.2570,34.531,35.087,44.744,35.0 -15:49:26,365.2996,34.531,35.059,44.29,35.0 -15:49:26,365.3435,34.504,35.087,44.78,35.0 -15:49:26,365.3872,34.559,35.059,44.773,35.0 -15:49:26,365.4308,34.587,35.087,44.319,35.0 -15:49:26,365.4736,34.559,35.059,43.366,35.0 -15:49:26,365.5155,34.531,35.059,44.337,35.0 -15:49:26,365.5608,34.559,35.115,44.827,35.0 -15:49:26,365.6035,34.504,35.059,43.393,35.0 -15:49:26,365.6480,34.531,35.087,45.31,35.0 -15:49:26,365.6924,34.531,35.087,44.375,35.0 -15:49:26,365.7368,34.587,35.059,44.385,35.0 -15:49:26,365.7810,34.531,35.059,43.913,35.0 -15:49:27,365.8239,34.504,35.087,44.885,35.0 -15:49:27,365.8670,34.559,35.059,44.878,35.0 -15:49:27,365.9110,34.504,35.059,44.424,35.0 -15:49:27,365.9548,34.531,35.059,45.379,35.0 -15:49:27,365.9995,34.559,35.087,44.926,35.0 -15:49:27,366.0431,34.504,35.087,43.973,35.0 -15:49:27,366.0871,34.504,35.087,44.928,35.0 -15:49:27,366.1318,34.531,35.115,44.938,35.0 -15:49:27,366.1754,34.476,35.087,44.003,35.0 -15:49:27,366.2199,34.531,35.059,45.439,35.0 -15:49:27,366.2632,34.476,35.059,44.986,35.0 -15:49:27,366.3045,34.531,35.059,45.942,35.0 -15:49:27,366.3457,34.531,35.059,45.007,35.0 -15:49:27,366.3900,34.504,35.087,45.017,35.0 -15:49:27,366.4326,34.504,35.059,45.01,35.0 -15:49:27,366.4748,34.531,35.087,45.501,35.0 -15:49:27,366.5189,34.531,35.059,44.566,35.0 -15:49:27,366.5619,34.531,35.087,45.057,35.0 -15:49:27,366.6037,34.504,35.059,44.586,35.0 -15:49:27,366.6480,34.448,35.143,45.541,35.0 -15:49:27,366.6916,34.504,35.087,45.07,35.0 -15:49:27,366.7363,34.531,35.059,45.08,35.0 -15:49:27,366.7806,34.504,35.087,45.108,35.0 -15:49:28,366.8232,34.531,35.087,45.101,35.0 -15:49:28,366.8654,34.531,35.115,44.647,35.0 -15:49:28,366.9095,34.559,35.087,44.174,35.0 -15:49:28,366.9519,34.531,35.115,44.183,35.0 -15:49:28,366.9965,34.559,35.087,44.192,35.0 -15:49:28,367.0405,34.531,35.059,44.201,35.0 -15:49:28,367.0847,34.531,35.115,45.173,35.0 -15:49:28,367.1298,34.504,35.059,44.22,35.0 -15:49:28,367.1739,34.504,35.087,45.657,35.0 -15:49:28,367.2187,34.531,35.032,45.186,35.0 -15:49:28,367.2636,34.531,35.087,45.678,35.0 -15:49:28,367.3078,34.531,35.059,44.744,35.0 -15:49:28,367.3508,34.531,35.087,45.235,35.0 -15:49:28,367.3951,34.531,35.115,44.763,35.0 -15:49:28,367.4380,34.531,35.087,44.291,35.0 -15:49:28,367.4808,34.504,35.115,44.782,35.0 -15:49:28,367.5253,34.559,35.059,44.774,35.0 -15:49:28,367.5707,34.559,35.032,44.801,35.0 -15:49:28,367.6146,34.559,35.087,45.275,35.0 -15:49:28,367.6573,34.504,35.004,44.339,35.0 -15:49:28,367.7017,34.504,35.059,46.721,35.0 -15:49:28,367.7452,34.531,35.059,45.788,35.0 -15:49:28,367.7881,34.531,35.032,45.334,35.0 -15:49:29,367.8328,34.559,35.059,45.809,35.0 -15:49:29,367.8777,34.504,35.087,44.874,35.0 -15:49:29,367.9226,34.587,35.087,45.348,35.0 -15:49:29,367.9677,34.531,35.087,43.931,35.0 -15:49:29,368.0120,34.504,35.087,44.903,35.0 -15:49:29,368.0550,34.531,35.087,45.376,35.0 -15:49:29,368.0988,34.531,35.032,44.922,35.0 -15:49:29,368.1428,34.504,35.087,45.878,35.0 -15:49:29,368.1862,34.531,35.087,45.407,35.0 -15:49:29,368.2317,34.531,35.059,44.953,35.0 -15:49:29,368.2768,34.504,35.087,45.444,35.0 -15:49:29,368.3210,34.531,35.059,45.438,35.0 -15:49:29,368.3659,34.504,35.059,45.465,35.0 -15:49:29,368.4117,34.531,35.087,45.94,35.0 -15:49:29,368.4548,34.504,35.087,45.006,35.0 -15:49:29,368.4980,34.531,35.087,45.479,35.0 -15:49:29,368.5417,34.504,35.087,45.025,35.0 -15:49:29,368.5827,34.504,35.032,45.499,35.0 -15:49:29,368.6270,34.531,35.087,46.454,35.0 -15:49:29,368.6713,34.559,35.087,45.056,35.0 -15:49:29,368.7157,34.476,35.171,44.584,35.0 -15:49:29,368.7609,34.531,35.059,44.576,35.0 -15:49:29,368.8037,34.531,35.087,45.565,35.0 -15:49:30,368.8478,34.504,35.143,45.094,35.0 -15:49:30,368.8914,34.531,35.087,44.605,35.0 -15:49:30,368.9335,34.448,35.143,45.112,35.0 -15:49:30,368.9766,34.504,35.059,45.586,35.0 -15:49:30,369.0206,34.531,35.059,46.077,35.0 -15:49:30,369.0622,34.587,35.087,45.624,35.0 -15:49:30,369.1061,34.531,35.059,44.189,35.0 -15:49:30,369.1515,34.531,35.087,45.642,35.0 -15:49:30,369.1948,34.504,35.059,45.171,35.0 -15:49:30,369.2385,34.504,35.087,46.126,35.0 -15:49:30,369.2804,34.504,35.059,45.656,35.0 -15:49:30,369.3257,34.559,35.087,46.147,35.0 -15:49:30,369.3695,34.504,35.059,44.731,35.0 -15:49:30,369.4156,34.504,35.059,46.167,35.0 -15:49:30,369.4603,34.531,35.087,46.179,35.0 -15:49:30,369.5044,34.587,35.115,45.244,35.0 -15:49:30,369.5475,34.504,35.143,43.809,35.0 -15:49:30,369.5932,34.504,35.059,44.762,35.0 -15:49:30,369.6365,34.504,35.087,46.216,35.0 -15:49:30,369.6813,34.504,35.087,45.745,35.0 -15:49:30,369.7241,34.531,35.087,45.756,35.0 -15:49:30,369.7668,34.531,35.059,45.301,35.0 -15:49:31,369.8115,34.504,35.087,45.792,35.0 -15:49:31,369.8538,34.504,35.032,45.785,35.0 -15:49:31,369.8982,34.531,35.087,46.741,35.0 -15:49:31,369.9435,34.531,35.115,45.343,35.0 -15:49:31,369.9869,34.531,35.087,44.871,35.0 -15:49:31,370.0320,34.559,35.032,45.361,35.0 -15:49:31,370.0775,34.559,35.087,45.835,35.0 -15:49:31,370.1210,34.504,35.059,44.9,35.0 -15:49:31,370.1631,34.504,35.087,46.336,35.0 -15:49:31,370.2078,34.504,35.087,45.865,35.0 -15:49:31,370.2511,34.559,35.087,45.876,35.0 -15:49:31,370.2969,34.559,35.087,44.94,35.0 -15:49:31,370.3426,34.531,35.059,44.949,35.0 -15:49:31,370.3867,34.531,35.087,45.922,35.0 -15:49:31,370.4308,34.504,35.032,45.451,35.0 -15:49:31,370.4729,34.531,35.087,46.87,35.0 -15:49:31,370.5167,34.504,35.059,45.471,35.0 -15:49:31,370.5604,34.531,35.087,46.427,35.0 -15:49:31,370.6031,34.531,35.059,45.492,35.0 -15:49:31,370.6473,34.504,35.059,45.982,35.0 -15:49:31,370.6936,34.448,35.032,46.457,35.0 -15:49:31,370.7378,34.559,35.059,47.896,35.0 -15:49:31,370.7800,34.531,35.059,45.536,35.0 -15:49:32,370.8232,34.504,35.087,46.027,35.0 -15:49:32,370.8661,34.531,35.087,46.02,35.0 -15:49:32,370.9108,34.531,35.087,45.566,35.0 -15:49:32,370.9533,34.531,35.115,45.575,35.0 -15:49:32,370.9985,34.531,35.087,45.103,35.0 -15:49:32,371.0434,34.504,35.087,45.594,35.0 -15:49:32,371.0870,34.504,35.087,46.068,35.0 -15:49:32,371.1301,34.504,35.087,46.078,35.0 -15:49:32,371.1727,34.559,35.087,46.088,35.0 -15:49:32,371.2147,34.531,35.087,45.152,35.0 -15:49:32,371.2589,34.531,35.087,45.642,35.0 -15:49:32,371.3023,34.531,35.032,45.652,35.0 -15:49:32,371.3464,34.531,35.059,46.607,35.0 -15:49:32,371.3918,34.476,35.115,46.154,35.0 -15:49:32,371.4363,34.531,35.059,46.147,35.0 -15:49:32,371.4806,34.531,35.087,46.175,35.0 -15:49:32,371.5289,34.559,35.059,45.704,35.0 -15:49:32,371.5713,34.531,35.059,45.714,35.0 -15:49:32,371.6152,34.504,35.087,46.205,35.0 -15:49:32,371.6588,34.531,35.087,46.198,35.0 -15:49:32,371.7032,34.531,34.976,45.744,35.0 -15:49:32,371.7478,34.531,35.143,47.663,35.0 -15:49:32,371.7919,34.531,35.059,44.803,35.0 -15:49:33,371.8367,34.504,35.087,46.256,35.0 -15:49:33,371.8811,34.504,35.059,46.249,35.0 -15:49:33,371.9272,34.531,35.087,46.741,35.0 -15:49:33,371.9706,34.504,35.059,45.807,35.0 -15:49:33,372.0187,34.504,35.115,46.763,35.0 -15:49:33,372.0627,34.504,35.059,45.811,35.0 -15:49:33,372.1064,34.531,35.087,46.784,35.0 -15:49:33,372.1510,34.531,35.059,45.849,35.0 -15:49:33,372.1953,34.559,35.059,46.34,35.0 -15:49:33,372.2397,34.531,35.059,45.869,35.0 -15:49:33,372.2819,34.531,35.087,46.36,35.0 -15:49:33,372.3267,34.531,35.087,45.888,35.0 -15:49:33,372.3732,34.504,35.087,45.898,35.0 -15:49:33,372.4188,34.531,35.087,46.373,35.0 -15:49:33,372.4641,34.531,35.087,45.919,35.0 -15:49:33,372.5119,34.504,35.087,45.929,35.0 -15:49:33,372.5576,34.531,35.087,46.404,35.0 -15:49:33,372.6042,34.615,35.059,45.95,35.0 -15:49:33,372.6497,34.615,35.059,44.997,35.0 -15:49:33,372.6947,34.531,35.059,45.006,35.0 -15:49:33,372.7422,34.531,35.059,46.458,35.0 -15:49:33,372.7867,34.531,35.059,46.47,35.0 -15:49:34,372.8326,34.531,35.059,46.48,35.0 -15:49:34,372.8800,34.531,35.087,46.491,35.0 -15:49:34,372.9297,34.531,35.087,46.02,35.0 -15:49:34,372.9759,34.504,35.059,46.031,35.0 -15:49:34,373.0211,34.531,35.115,46.987,35.0 -15:49:34,373.0652,34.531,35.115,45.571,35.0 -15:49:34,373.1095,34.531,35.087,45.58,35.0 -15:49:34,373.1524,34.504,35.087,46.07,35.0 -15:49:34,373.1970,34.531,35.143,46.544,35.0 -15:49:34,373.2405,34.531,35.059,45.127,35.0 -15:49:34,373.2852,34.531,35.087,46.58,35.0 -15:49:34,373.3297,34.504,35.059,46.109,35.0 -15:49:34,373.3746,34.531,35.059,47.064,35.0 -15:49:34,373.4184,34.531,35.087,46.611,35.0 -15:49:34,373.4626,34.448,35.087,46.14,35.0 -15:49:34,373.5070,34.559,35.032,47.577,35.0 -15:49:34,373.5509,34.531,35.087,46.626,35.0 -15:49:34,373.5972,34.531,35.059,46.171,35.0 -15:49:34,373.6428,34.504,35.087,46.663,35.0 -15:49:34,373.6863,34.531,35.059,46.657,35.0 -15:49:34,373.7313,34.504,35.087,46.684,35.0 -15:49:34,373.7756,34.531,35.059,46.677,35.0 -15:49:35,373.8189,34.559,35.059,46.705,35.0 -15:49:35,373.8637,34.476,35.087,46.233,35.0 -15:49:35,373.9088,34.559,35.143,47.189,35.0 -15:49:35,373.9539,34.531,35.059,44.81,35.0 -15:49:35,373.9970,34.531,35.143,46.744,35.0 -15:49:35,374.0410,34.531,35.059,45.309,35.0 -15:49:35,374.0835,34.559,35.059,46.762,35.0 -15:49:35,374.1285,34.531,35.059,46.29,35.0 -15:49:35,374.1712,34.504,35.087,46.782,35.0 -15:49:35,374.2144,34.504,35.087,46.775,35.0 -15:49:35,374.2578,34.559,35.087,46.785,35.0 -15:49:35,374.3015,34.559,35.059,45.849,35.0 -15:49:35,374.3456,34.531,35.087,46.339,35.0 -15:49:35,374.3895,34.504,35.087,46.349,35.0 -15:49:35,374.4326,34.559,35.087,46.823,35.0 -15:49:35,374.4769,34.531,35.115,45.887,35.0 -15:49:35,374.5214,34.504,35.032,45.896,35.0 -15:49:35,374.5642,34.531,35.115,47.797,35.0 -15:49:35,374.6082,34.504,35.087,45.917,35.0 -15:49:35,374.6503,34.559,35.087,46.871,35.0 -15:49:35,374.6955,34.504,35.059,45.935,35.0 -15:49:35,374.7416,34.531,35.087,47.372,35.0 -15:49:35,374.7873,34.504,35.032,46.438,35.0 -15:49:36,374.8330,34.504,35.087,47.858,35.0 -15:49:36,374.8793,34.504,35.087,46.924,35.0 -15:49:36,374.9253,34.531,35.115,46.935,35.0 -15:49:36,374.9707,34.531,35.087,46.0,35.0 -15:49:36,375.0159,34.531,35.059,46.49,35.0 -15:49:36,375.0621,34.531,35.087,46.982,35.0 -15:49:36,375.1084,34.531,35.059,46.511,35.0 -15:49:36,375.1537,34.559,35.059,47.003,35.0 -15:49:36,375.2000,34.531,35.143,46.532,35.0 -15:49:36,375.2483,34.531,35.087,45.579,35.0 -15:49:36,375.2952,34.559,35.087,46.551,35.0 -15:49:36,375.3494,34.559,35.087,46.08,35.0 -15:49:36,375.3986,34.531,35.087,46.091,35.0 -15:49:36,375.4470,34.531,35.087,46.582,35.0 -15:49:36,375.4946,34.504,35.087,46.593,35.0 -15:49:36,375.5419,34.531,35.059,47.067,35.0 -15:49:36,375.5875,34.531,35.087,47.096,35.0 -15:49:36,375.6380,34.504,35.004,46.625,35.0 -15:49:36,375.7075,34.531,35.087,48.529,35.0 -15:49:36,375.7749,34.531,35.087,46.656,35.0 -15:49:37,375.8292,34.504,35.087,46.669,35.0 -15:49:37,375.8877,34.559,35.087,47.146,35.0 -15:49:37,375.9429,34.531,35.087,46.213,35.0 -15:49:37,376.0026,34.587,35.087,46.707,35.0 -15:49:37,376.0529,34.531,35.087,45.755,35.0 -15:49:37,376.1061,34.504,35.115,46.729,35.0 -15:49:37,376.1587,34.504,35.059,46.723,35.0 -15:49:37,376.2125,34.559,35.087,47.698,35.0 -15:49:37,376.2720,34.531,35.087,46.283,35.0 -15:49:37,376.3247,34.531,35.115,46.777,35.0 -15:49:37,376.3788,34.559,35.087,46.307,35.0 -15:49:37,376.4294,34.559,35.059,46.317,35.0 -15:49:37,376.4836,34.559,35.087,46.81,35.0 -15:49:37,376.5354,34.559,35.059,46.339,35.0 -15:49:37,376.5855,34.559,35.059,46.832,35.0 -15:49:37,376.6354,34.559,35.059,46.842,35.0 -15:49:37,376.6829,34.531,35.087,46.853,35.0 -15:49:37,376.7299,34.559,35.032,46.864,35.0 -15:49:37,376.7782,34.531,35.087,47.338,35.0 -15:49:38,376.8265,34.504,35.087,46.885,35.0 -15:49:38,376.8713,34.504,35.115,47.36,35.0 -15:49:38,376.9184,34.531,35.087,46.889,35.0 -15:49:38,376.9810,34.587,35.087,46.917,35.0 -15:49:38,377.0283,34.559,35.115,45.967,35.0 -15:49:38,377.0740,34.504,35.115,45.975,35.0 -15:49:38,377.1196,34.531,35.087,46.93,35.0 -15:49:38,377.1646,34.504,35.143,46.957,35.0 -15:49:38,377.2117,34.531,35.115,46.468,35.0 -15:49:38,377.2584,34.531,35.059,46.495,35.0 -15:49:38,377.3036,34.504,35.115,47.467,35.0 -15:49:38,377.3498,34.531,35.059,46.979,35.0 -15:49:38,377.3964,34.476,35.115,47.488,35.0 -15:49:38,377.4452,34.559,35.087,47.482,35.0 -15:49:38,377.4913,34.531,35.004,46.547,35.0 -15:49:38,377.5365,34.531,35.115,48.465,35.0 -15:49:38,377.5820,34.531,35.087,46.568,35.0 -15:49:38,377.6287,34.504,35.087,47.059,35.0 -15:49:38,377.6777,34.504,35.115,47.534,35.0 -15:49:38,377.7275,34.531,35.087,47.064,35.0 -15:49:38,377.7742,34.531,35.087,47.092,35.0 -15:49:39,377.8202,34.559,35.115,47.102,35.0 -15:49:39,377.8665,34.531,35.087,46.149,35.0 -15:49:39,377.9135,34.531,35.059,47.121,35.0 -15:49:39,377.9616,34.531,35.059,47.612,35.0 -15:49:39,378.0085,34.615,35.115,47.623,35.0 -15:49:39,378.0538,34.559,35.087,45.227,35.0 -15:49:39,378.1003,34.531,35.087,46.678,35.0 -15:49:39,378.1469,34.559,35.059,47.169,35.0 -15:49:39,378.1930,34.559,35.059,47.179,35.0 -15:49:39,378.2374,34.531,35.115,47.189,35.0 -15:49:39,378.2825,34.531,35.115,46.718,35.0 -15:49:39,378.3298,34.559,35.004,46.727,35.0 -15:49:39,378.3773,34.531,35.087,48.164,35.0 -15:49:39,378.4236,34.531,35.087,47.23,35.0 -15:49:39,378.4689,34.559,35.087,47.24,35.0 -15:49:39,378.5154,34.531,35.087,46.768,35.0 -15:49:39,378.5627,34.587,35.059,47.259,35.0 -15:49:39,378.6099,34.559,35.059,46.788,35.0 -15:49:39,378.6551,34.531,35.087,47.279,35.0 -15:49:39,378.7015,34.476,35.087,47.289,35.0 -15:49:39,378.7487,34.531,35.087,48.245,35.0 -15:49:39,378.7947,34.531,35.087,47.311,35.0 -15:49:40,378.8406,34.531,35.059,47.321,35.0 -15:49:40,378.8870,34.531,35.087,47.812,35.0 -15:49:40,378.9336,34.531,35.087,47.342,35.0 -15:49:40,378.9813,34.531,35.115,47.352,35.0 -15:49:40,379.0280,34.504,35.087,46.881,35.0 -15:49:40,379.0761,34.531,35.087,47.836,35.0 -15:49:40,379.1216,34.559,35.087,47.383,35.0 -15:49:40,379.1676,34.531,35.115,46.911,35.0 -15:49:40,379.2141,34.559,35.087,46.92,35.0 -15:49:40,379.2613,34.531,35.087,46.93,35.0 -15:49:40,379.3097,34.531,35.087,47.421,35.0 -15:49:40,379.3562,34.531,35.115,47.432,35.0 -15:49:40,379.4025,34.531,35.087,46.96,35.0 -15:49:40,379.4476,34.559,35.087,47.451,35.0 -15:49:40,379.4936,34.531,35.059,46.979,35.0 -15:49:40,379.5385,34.531,35.059,47.952,35.0 -15:49:40,379.5857,34.559,35.087,47.962,35.0 -15:49:40,379.6305,34.504,35.087,47.01,35.0 -15:49:40,379.6771,34.531,35.087,47.965,35.0 -15:49:40,379.7215,34.504,35.087,47.512,35.0 -15:49:40,379.7675,34.559,35.143,47.986,35.0 -15:49:41,379.8134,34.559,35.115,46.087,35.0 -15:49:41,379.8611,34.476,35.171,46.577,35.0 -15:49:41,379.9089,34.531,35.087,47.05,35.0 -15:49:41,379.9542,34.531,35.143,47.558,35.0 -15:49:41,380.0007,34.531,35.087,46.605,35.0 -15:49:41,380.0501,34.504,35.087,47.577,35.0 -15:49:41,380.1026,34.531,35.087,48.052,35.0 -15:49:41,380.1480,34.531,35.087,47.6,35.0 -15:49:41,380.1961,34.504,35.087,47.61,35.0 -15:49:41,380.2452,34.504,35.115,48.085,35.0 -15:49:41,380.2938,34.531,35.087,47.615,35.0 -15:49:41,380.3401,34.504,35.087,47.643,35.0 -15:49:41,380.3855,34.559,35.087,48.117,35.0 -15:49:41,380.4308,34.504,35.059,47.182,35.0 -15:49:41,380.4770,34.615,35.087,48.618,35.0 -15:49:41,380.5240,34.531,35.087,46.239,35.0 -15:49:41,380.5734,34.531,35.087,47.692,35.0 -15:49:41,380.6206,34.531,35.087,47.703,35.0 -15:49:41,380.6671,34.531,35.059,47.713,35.0 -15:49:41,380.7136,34.587,35.087,48.205,35.0 -15:49:41,380.7598,34.531,35.087,46.771,35.0 -15:49:41,380.8061,34.448,35.087,47.743,35.0 -15:49:42,380.8526,34.531,35.059,49.18,35.0 -15:49:42,380.8986,34.531,35.115,48.247,35.0 -15:49:42,380.9473,34.531,35.087,47.294,35.0 -15:49:42,380.9937,34.559,35.059,47.786,35.0 -15:49:42,381.0402,34.559,35.087,47.796,35.0 -15:49:42,381.0861,34.559,35.087,47.324,35.0 -15:49:42,381.1328,34.531,35.087,47.334,35.0 -15:49:42,381.1799,34.531,35.087,47.825,35.0 -15:49:42,381.2272,34.531,35.087,47.835,35.0 -15:49:42,381.2733,34.504,35.087,47.845,35.0 -15:49:42,381.3185,34.531,35.087,48.32,35.0 -15:49:42,381.3637,34.531,35.059,47.866,35.0 -15:49:42,381.4098,34.559,35.087,48.357,35.0 -15:49:42,381.4551,34.531,35.059,47.405,35.0 -15:49:42,381.5015,34.504,35.115,48.377,35.0 -15:49:42,381.5475,34.504,35.087,47.889,35.0 -15:49:42,381.5935,34.587,35.087,48.381,35.0 -15:49:42,381.6385,34.559,35.087,46.964,35.0 -15:49:42,381.6848,34.531,35.087,47.454,35.0 -15:49:42,381.7293,34.587,35.059,47.945,35.0 -15:49:42,381.7788,34.531,35.115,47.473,35.0 -15:49:43,381.8263,34.504,35.115,47.483,35.0 -15:49:43,381.8745,34.531,35.087,47.957,35.0 -15:49:43,381.9224,34.476,35.087,47.985,35.0 -15:49:43,381.9705,34.559,35.059,48.941,35.0 -15:49:43,382.0176,34.587,35.115,48.007,35.0 -15:49:43,382.0638,34.531,35.087,46.573,35.0 -15:49:43,382.1114,34.531,35.032,48.025,35.0 -15:49:43,382.1595,34.531,35.087,48.982,35.0 -15:49:43,382.2071,34.531,35.115,48.048,35.0 -15:49:43,382.2519,34.504,35.087,47.577,35.0 -15:49:43,382.2969,34.559,35.087,48.532,35.0 -15:49:43,382.3445,34.531,35.087,47.596,35.0 -15:49:43,382.3937,34.559,35.059,48.087,35.0 -15:49:43,382.4395,34.531,35.087,48.098,35.0 -15:49:43,382.4854,34.531,35.087,48.108,35.0 -15:49:43,382.5300,34.559,35.087,48.118,35.0 -15:49:43,382.5773,34.559,35.059,47.646,35.0 -15:49:43,382.6247,34.531,35.087,48.138,35.0 -15:49:43,382.6708,34.531,35.087,48.148,35.0 -15:49:43,382.7177,34.504,35.087,48.158,35.0 -15:49:43,382.7635,34.559,35.115,48.633,35.0 -15:49:44,382.8102,34.531,35.115,47.216,35.0 -15:49:44,382.8573,34.531,35.087,47.706,35.0 -15:49:44,382.9037,34.559,35.059,48.197,35.0 -15:49:44,382.9514,34.531,35.171,48.207,35.0 -15:49:44,382.9970,34.531,35.087,46.773,35.0 -15:49:44,383.0436,34.559,35.115,48.225,35.0 -15:49:44,383.0885,34.504,35.087,47.272,35.0 -15:49:44,383.1346,34.531,35.115,48.708,35.0 -15:49:44,383.1807,34.587,35.087,47.773,35.0 -15:49:44,383.2281,34.531,35.087,47.301,35.0 -15:49:44,383.2752,34.559,35.115,48.273,35.0 -15:49:44,383.3200,34.559,35.171,47.32,35.0 -15:49:44,383.3663,34.559,35.087,46.365,35.0 -15:49:44,383.4127,34.559,35.087,47.817,35.0 -15:49:44,383.4607,34.504,35.115,47.826,35.0 -15:49:44,383.5083,34.504,35.087,48.3,35.0 -15:49:44,383.5564,34.559,35.115,48.792,35.0 -15:49:44,383.6032,34.531,35.087,47.376,35.0 -15:49:44,383.6495,34.531,35.143,48.348,35.0 -15:49:44,383.6973,34.504,35.115,47.395,35.0 -15:49:44,383.7435,34.559,35.087,48.35,35.0 -15:49:44,383.7898,34.531,35.087,47.895,35.0 -15:49:45,383.8368,34.587,35.087,48.386,35.0 -15:49:45,383.8833,34.587,35.059,47.433,35.0 -15:49:45,383.9302,34.531,35.143,47.924,35.0 -15:49:45,383.9773,34.587,35.087,47.452,35.0 -15:49:45,384.0246,34.531,35.087,47.46,35.0 -15:49:45,384.0720,34.559,35.087,48.432,35.0 -15:49:45,384.1180,34.559,35.143,47.961,35.0 -15:49:45,384.1636,34.531,35.059,47.007,35.0 -15:49:45,384.2096,34.531,35.087,48.941,35.0 -15:49:45,384.2580,34.531,35.032,48.47,35.0 -15:49:45,384.3028,34.559,35.087,49.427,35.0 -15:49:45,384.3485,34.531,35.115,48.011,35.0 -15:49:45,384.3953,34.531,35.087,48.02,35.0 -15:49:45,384.4423,34.476,35.087,48.511,35.0 -15:49:45,384.4884,34.531,35.115,49.467,35.0 -15:49:45,384.5355,34.559,35.087,48.051,35.0 -15:49:45,384.5818,34.615,35.032,48.061,35.0 -15:49:45,384.6335,34.531,35.087,48.054,35.0 -15:49:45,384.6854,34.448,35.087,48.563,35.0 -15:49:45,384.7276,34.559,35.087,50.001,35.0 -15:49:45,384.7770,34.531,35.115,48.104,35.0 -15:49:46,384.8249,34.504,35.115,48.114,35.0 -15:49:46,384.8711,34.531,35.171,48.588,35.0 -15:49:46,384.9179,34.504,35.115,47.17,35.0 -15:49:46,384.9647,34.559,35.087,48.606,35.0 -15:49:46,385.0116,34.559,35.087,48.152,35.0 -15:49:46,385.0603,34.559,35.115,48.161,35.0 -15:49:46,385.1073,34.531,35.087,47.689,35.0 -15:49:46,385.1531,34.559,35.087,48.661,35.0 -15:49:46,385.1987,34.531,35.115,48.19,35.0 -15:49:46,385.2466,34.531,35.115,48.199,35.0 -15:49:46,385.2936,34.531,35.087,48.208,35.0 -15:49:46,385.3422,34.531,35.087,48.7,35.0 -15:49:46,385.3888,34.559,35.087,48.71,35.0 -15:49:46,385.4349,34.587,35.115,48.239,35.0 -15:49:46,385.4810,34.531,35.087,47.285,35.0 -15:49:46,385.5275,34.559,35.059,48.738,35.0 -15:49:46,385.5757,34.531,35.087,48.748,35.0 -15:49:46,385.6217,34.504,35.087,48.758,35.0 -15:49:46,385.6675,34.531,35.087,49.233,35.0 -15:49:46,385.7131,34.559,35.087,48.779,35.0 -15:49:46,385.7594,34.531,35.115,48.307,35.0 -15:49:46,385.8042,34.531,35.087,48.317,35.0 -15:49:47,385.8504,34.531,35.087,48.807,35.0 -15:49:47,385.8963,34.531,35.087,48.817,35.0 -15:49:47,385.9427,34.531,35.087,48.827,35.0 -15:49:47,385.9893,34.531,35.115,48.837,35.0 -15:49:47,386.0341,34.559,35.087,48.366,35.0 -15:49:47,386.0789,34.559,35.115,48.375,35.0 -15:49:47,386.1258,34.476,35.087,47.903,35.0 -15:49:47,386.1730,34.531,35.087,49.82,35.0 -15:49:47,386.2185,34.531,35.115,48.886,35.0 -15:49:47,386.2656,34.559,35.087,48.415,35.0 -15:49:47,386.3133,34.531,35.087,48.424,35.0 -15:49:47,386.3591,34.504,35.115,48.916,35.0 -15:49:47,386.4056,34.559,35.087,48.908,35.0 -15:49:47,386.4511,34.531,35.115,48.454,35.0 -15:49:47,386.4956,34.504,35.087,48.463,35.0 -15:49:47,386.5385,34.587,35.059,49.418,35.0 -15:49:47,386.5836,34.559,35.115,48.482,35.0 -15:49:47,386.6267,34.559,35.087,48.01,35.0 -15:49:47,386.6717,34.559,35.059,48.499,35.0 -15:49:47,386.7176,34.559,35.143,48.991,35.0 -15:49:47,386.7607,34.531,35.087,47.555,35.0 -15:49:47,386.8048,34.504,35.115,49.007,35.0 -15:49:48,386.8481,34.504,35.087,49.0,35.0 -15:49:48,386.8943,34.587,35.087,49.491,35.0 -15:49:48,386.9368,34.559,35.115,48.074,35.0 -15:49:48,386.9814,34.559,35.115,48.082,35.0 -15:49:48,387.0259,34.531,35.115,48.09,35.0 -15:49:48,387.0707,34.559,35.087,48.58,35.0 -15:49:48,387.1150,34.559,35.087,48.589,35.0 -15:49:48,387.1590,34.559,35.087,48.598,35.0 -15:49:48,387.2044,34.559,35.115,48.607,35.0 -15:49:48,387.2490,34.531,35.115,48.135,35.0 -15:49:48,387.2932,34.531,35.087,48.624,35.0 -15:49:48,387.3364,34.559,35.087,49.115,35.0 -15:49:48,387.3799,34.559,35.115,48.643,35.0 -15:49:48,387.4250,34.559,35.115,48.17,35.0 -15:49:48,387.4675,34.559,35.087,48.178,35.0 -15:49:48,387.5098,34.531,35.115,48.668,35.0 -15:49:48,387.5617,34.559,35.059,48.677,35.0 -15:49:48,387.6070,34.559,35.087,49.169,35.0 -15:49:48,387.6522,34.559,35.115,48.697,35.0 -15:49:48,387.6998,34.559,35.115,48.225,35.0 -15:49:48,387.7448,34.531,35.143,48.233,35.0 -15:49:48,387.7913,34.531,35.115,48.242,35.0 -15:49:49,387.8345,34.504,35.087,48.732,35.0 -15:49:49,387.8771,34.531,35.115,49.686,35.0 -15:49:49,387.9221,34.559,35.115,48.751,35.0 -15:49:49,387.9666,34.559,35.087,48.278,35.0 -15:49:49,388.0094,34.559,35.087,48.768,35.0 -15:49:49,388.0558,34.531,35.115,48.777,35.0 -15:49:49,388.0994,34.559,35.087,48.786,35.0 -15:49:49,388.1437,34.587,35.059,48.795,35.0 -15:49:49,388.1905,34.559,35.115,48.804,35.0 -15:49:49,388.2338,34.559,35.115,48.332,35.0 -15:49:49,388.2765,34.531,35.115,48.34,35.0 -15:49:49,388.3193,34.559,35.087,48.829,35.0 -15:49:49,388.3637,34.531,35.087,48.838,35.0 -15:49:49,388.4074,34.559,35.087,49.328,35.0 -15:49:49,388.4509,34.531,35.087,48.856,35.0 -15:49:49,388.4950,34.559,35.115,49.347,35.0 -15:49:49,388.5396,34.531,35.115,48.393,35.0 -15:49:49,388.5836,34.559,35.087,48.883,35.0 -15:49:49,388.6260,34.615,35.087,48.892,35.0 -15:49:49,388.6705,34.559,35.087,47.938,35.0 -15:49:49,388.7145,34.559,35.115,48.908,35.0 -15:49:49,388.7596,34.559,35.087,48.436,35.0 -15:49:49,388.8028,34.559,35.143,48.925,35.0 -15:49:50,388.8461,34.504,35.115,47.971,35.0 -15:49:50,388.8910,34.531,35.115,49.406,35.0 -15:49:50,388.9348,34.531,35.143,48.951,35.0 -15:49:50,388.9789,34.531,35.087,48.479,35.0 -15:49:50,389.0237,34.559,35.087,49.45,35.0 -15:49:50,389.0684,34.559,35.115,48.978,35.0 -15:49:50,389.1120,34.559,35.087,48.506,35.0 -15:49:50,389.1569,34.559,35.004,48.995,35.0 -15:49:50,389.2008,34.531,35.087,50.432,35.0 -15:49:50,389.2433,34.587,35.087,49.497,35.0 -15:49:50,389.2949,34.531,35.087,48.543,35.0 -15:49:50,389.3410,34.615,35.059,49.516,35.0 -15:49:50,389.3835,34.615,35.087,48.563,35.0 -15:49:50,389.4266,34.559,35.087,48.089,35.0 -15:49:50,389.4733,34.615,35.087,49.06,35.0 -15:49:50,389.5165,34.559,35.087,48.106,35.0 -15:49:50,389.5609,34.476,35.115,49.077,35.0 -15:49:50,389.6087,34.559,35.059,50.032,35.0 -15:49:50,389.6550,34.559,35.115,49.578,35.0 -15:49:50,389.7028,34.531,35.087,48.626,35.0 -15:49:50,389.7536,34.559,35.115,49.597,35.0 -15:49:50,389.7985,34.531,35.115,48.645,35.0 -15:49:51,389.8440,34.587,35.115,49.135,35.0 -15:49:51,389.8891,34.559,35.115,48.181,35.0 -15:49:51,389.9327,34.531,35.115,48.67,35.0 -15:49:51,389.9769,34.559,35.115,49.16,35.0 -15:49:51,390.0231,34.531,35.087,48.687,35.0 -15:49:51,390.0675,34.559,35.115,49.659,35.0 -15:49:51,390.1105,34.559,35.143,48.706,35.0 -15:49:51,390.1561,34.559,35.115,48.232,35.0 -15:49:51,390.1997,34.559,35.004,48.721,35.0 -15:49:51,390.2431,34.559,35.087,50.638,35.0 -15:49:51,390.2881,34.559,35.087,49.222,35.0 -15:49:51,390.3350,34.587,35.115,49.231,35.0 -15:49:51,390.3863,34.559,35.115,48.278,35.0 -15:49:51,390.4316,34.559,35.087,48.768,35.0 -15:49:51,390.4769,34.531,35.115,49.258,35.0 -15:49:51,390.5224,34.587,35.087,49.267,35.0 -15:49:51,390.5669,34.587,35.059,48.794,35.0 -15:49:51,390.6121,34.531,35.115,49.284,35.0 -15:49:51,390.6693,34.615,35.115,49.293,35.0 -15:49:51,390.7338,34.531,35.087,47.86,35.0 -15:49:51,390.7856,34.587,35.115,49.797,35.0 -15:49:52,390.8471,34.559,35.115,48.363,35.0 -15:49:52,390.9043,34.531,35.115,48.856,35.0 -15:49:52,390.9575,34.559,35.115,49.348,35.0 -15:49:52,391.0164,34.559,35.115,48.878,35.0 -15:49:52,391.0785,34.559,35.087,48.889,35.0 -15:49:52,391.1306,34.559,35.143,49.382,35.0 -15:49:52,391.1810,34.559,35.115,48.429,35.0 -15:49:52,391.2338,34.559,35.115,48.919,35.0 -15:49:52,391.2870,34.531,35.087,48.929,35.0 -15:49:52,391.3402,34.587,35.115,49.902,35.0 -15:49:52,391.3986,34.559,35.115,48.469,35.0 -15:49:52,391.4525,34.559,35.115,48.96,35.0 -15:49:52,391.5054,34.559,35.115,48.97,35.0 -15:49:52,391.5637,34.559,35.032,48.98,35.0 -15:49:52,391.6153,34.587,35.115,50.42,35.0 -15:49:52,391.6652,34.559,35.143,48.522,35.0 -15:49:52,391.7099,34.531,35.059,48.53,35.0 -15:49:52,391.7554,34.587,35.115,50.464,35.0 -15:49:52,391.8011,34.559,35.087,48.548,35.0 -15:49:53,391.8452,34.531,35.115,49.519,35.0 -15:49:53,391.8897,34.504,35.143,49.528,35.0 -15:49:53,391.9330,34.587,35.087,49.52,35.0 -15:49:53,391.9837,34.531,35.115,49.064,35.0 -15:49:53,392.0374,34.559,35.115,49.556,35.0 -15:49:53,392.0821,34.531,35.115,49.085,35.0 -15:49:53,392.1260,34.559,35.115,49.575,35.0 -15:49:53,392.1723,34.559,35.115,49.102,35.0 -15:49:53,392.2157,34.559,35.143,49.111,35.0 -15:49:53,392.2583,34.587,35.115,48.637,35.0 -15:49:53,392.3016,34.531,35.143,48.644,35.0 -15:49:53,392.3457,34.559,35.087,49.133,35.0 -15:49:53,392.3909,34.587,35.115,49.623,35.0 -15:49:53,392.4361,34.587,35.115,48.669,35.0 -15:49:53,392.4797,34.587,35.115,48.677,35.0 -15:49:53,392.5246,34.559,35.087,48.684,35.0 -15:49:53,392.5792,34.559,35.115,49.655,35.0 -15:49:53,392.6285,34.559,35.115,49.185,35.0 -15:49:53,392.6742,34.559,35.115,49.193,35.0 -15:49:53,392.7183,34.559,35.115,49.202,35.0 -15:49:53,392.7608,34.559,35.115,49.21,35.0 -15:49:53,392.8064,34.559,35.115,49.218,35.0 -15:49:54,392.8518,34.531,35.115,49.227,35.0 -15:49:54,392.8960,34.559,35.087,49.717,35.0 -15:49:54,392.9413,34.559,35.115,49.726,35.0 -15:49:54,392.9846,34.587,35.115,49.253,35.0 -15:49:54,393.0276,34.559,35.059,48.78,35.0 -15:49:54,393.0728,34.531,35.143,50.232,35.0 -15:49:54,393.1179,34.587,35.115,49.278,35.0 -15:49:54,393.1620,34.531,35.143,48.805,35.0 -15:49:54,393.2062,34.615,35.087,49.294,35.0 -15:49:54,393.2498,34.587,35.087,48.821,35.0 -15:49:54,393.2929,34.531,35.115,49.31,35.0 -15:49:54,393.3391,34.587,35.115,49.799,35.0 -15:49:54,393.3826,34.587,35.115,48.846,35.0 -15:49:54,393.4261,34.559,35.115,48.853,35.0 -15:49:54,393.4722,34.587,35.143,49.342,35.0 -15:49:54,393.5159,34.642,35.115,48.387,35.0 -15:49:54,393.5597,34.559,35.171,47.93,35.0 -15:49:54,393.6048,34.559,35.115,48.4,35.0 -15:49:54,393.6487,34.531,35.087,49.37,35.0 -15:49:54,393.6927,34.559,35.115,50.341,35.0 -15:49:54,393.7369,34.587,35.143,49.388,35.0 -15:49:54,393.7802,34.531,35.087,48.433,35.0 -15:49:55,393.8247,34.559,35.059,50.366,35.0 -15:49:55,393.8711,34.559,35.087,50.376,35.0 -15:49:55,393.9166,34.587,35.087,49.904,35.0 -15:49:55,393.9616,34.559,35.143,49.432,35.0 -15:49:55,394.0050,34.587,35.115,48.959,35.0 -15:49:55,394.0565,34.559,35.115,48.966,35.0 -15:49:55,394.1011,34.587,35.115,49.457,35.0 -15:49:55,394.1454,34.587,35.115,48.983,35.0 -15:49:55,394.1908,34.559,35.115,48.991,35.0 -15:49:55,394.2382,34.587,35.059,49.48,35.0 -15:49:55,394.2839,34.615,35.115,49.97,35.0 -15:49:55,394.3317,34.559,35.115,48.535,35.0 -15:49:55,394.3782,34.559,35.115,49.506,35.0 -15:49:55,394.4258,34.615,35.115,49.514,35.0 -15:49:55,394.4749,34.587,35.115,48.56,35.0 -15:49:55,394.5233,34.587,35.087,49.049,35.0 -15:49:55,394.5693,34.587,35.087,49.539,35.0 -15:49:55,394.6159,34.587,35.087,49.547,35.0 -15:49:55,394.6776,34.559,35.115,49.556,35.0 -15:49:55,394.7319,34.559,35.143,49.568,35.0 -15:49:55,394.7764,34.531,35.087,49.096,35.0 -15:49:56,394.8234,34.559,35.115,50.548,35.0 -15:49:56,394.8682,34.587,35.143,49.595,35.0 -15:49:56,394.9124,34.587,35.115,48.641,35.0 -15:49:56,394.9585,34.587,35.087,49.129,35.0 -15:49:56,395.0047,34.559,35.059,49.618,35.0 -15:49:56,395.0507,34.615,35.115,50.59,35.0 -15:49:56,395.1040,34.615,35.087,48.674,35.0 -15:49:56,395.1554,34.559,35.087,49.164,35.0 -15:49:56,395.2026,34.615,35.115,50.136,35.0 -15:49:56,395.2483,34.587,35.143,48.701,35.0 -15:49:56,395.2938,34.559,35.087,48.708,35.0 -15:49:56,395.3404,34.615,35.115,50.159,35.0 -15:49:56,395.3856,34.531,35.143,48.724,35.0 -15:49:56,395.4319,34.559,35.087,49.694,35.0 -15:49:56,395.4779,34.587,35.143,50.184,35.0 -15:49:56,395.5246,34.559,35.115,48.749,35.0 -15:49:56,395.5723,34.615,35.115,49.719,35.0 -15:49:56,395.6223,34.587,35.115,48.765,35.0 -15:49:56,395.6699,34.642,35.115,49.254,35.0 -15:49:56,395.7163,34.587,35.143,48.316,35.0 -15:49:56,395.7608,34.615,35.115,48.787,35.0 -15:49:56,395.8071,34.531,35.115,48.794,35.0 -15:49:57,395.8517,34.587,35.115,50.246,35.0 -15:49:57,395.8985,34.615,35.115,49.292,35.0 -15:49:57,395.9446,34.559,35.115,48.818,35.0 -15:49:57,395.9918,34.559,35.115,49.789,35.0 -15:49:57,396.0389,34.587,35.115,49.797,35.0 -15:49:57,396.0848,34.559,35.143,49.324,35.0 -15:49:57,396.1316,34.587,35.143,49.332,35.0 -15:49:57,396.1761,34.531,35.115,48.859,35.0 -15:49:57,396.2222,34.587,35.143,50.31,35.0 -15:49:57,396.2668,34.642,35.171,48.875,35.0 -15:49:57,396.3136,34.587,35.115,47.454,35.0 -15:49:57,396.3592,34.587,35.115,49.368,35.0 -15:49:57,396.4058,34.587,35.087,49.376,35.0 -15:49:57,396.4514,34.559,35.143,49.866,35.0 -15:49:57,396.4990,34.559,35.115,49.393,35.0 -15:49:57,396.5468,34.531,35.087,49.882,35.0 -15:49:57,396.5936,34.587,35.115,50.854,35.0 -15:49:57,396.6408,34.587,35.115,49.42,35.0 -15:49:57,396.6888,34.559,35.143,49.428,35.0 -15:49:57,396.7348,34.587,35.115,49.436,35.0 -15:49:57,396.7821,34.587,35.143,49.444,35.0 -15:49:58,396.8284,34.531,35.143,48.97,35.0 -15:49:58,396.8743,34.559,35.115,49.941,35.0 -15:49:58,396.9205,34.587,35.087,49.949,35.0 -15:49:58,396.9658,34.587,35.143,49.958,35.0 -15:49:58,397.0127,34.559,35.115,49.003,35.0 -15:49:58,397.0609,34.587,35.143,49.974,35.0 -15:49:58,397.1084,34.587,35.115,49.019,35.0 -15:49:58,397.1554,34.615,35.087,49.508,35.0 -15:49:58,397.2044,34.531,35.115,49.516,35.0 -15:49:58,397.2495,34.587,35.143,50.488,35.0 -15:49:58,397.2961,34.587,35.143,49.052,35.0 -15:49:58,397.3435,34.587,35.143,49.059,35.0 -15:49:58,397.3908,34.587,35.143,49.067,35.0 -15:49:58,397.4382,34.559,35.115,49.074,35.0 -15:49:58,397.4839,34.587,35.115,50.044,35.0 -15:49:58,397.5304,34.559,35.115,49.571,35.0 -15:49:58,397.5788,34.615,35.115,50.061,35.0 -15:49:58,397.6252,34.615,35.087,49.107,35.0 -15:49:58,397.6700,34.587,35.143,49.596,35.0 -15:49:58,397.7139,34.587,35.115,49.122,35.0 -15:49:58,397.7578,34.615,35.171,49.61,35.0 -15:49:58,397.8035,34.587,35.115,48.173,35.0 -15:49:59,397.8469,34.559,35.115,49.623,35.0 -15:49:59,397.8907,34.559,35.087,50.112,35.0 -15:49:59,397.9376,34.587,35.143,50.602,35.0 -15:49:59,397.9810,34.587,35.143,49.166,35.0 -15:49:59,398.0249,34.559,35.115,49.173,35.0 -15:49:59,398.0705,34.587,35.143,50.143,35.0 -15:49:59,398.1143,34.587,35.115,49.188,35.0 -15:49:59,398.1571,34.587,35.143,49.677,35.0 -15:49:59,398.2007,34.615,35.143,49.202,35.0 -15:49:59,398.2449,34.615,35.115,48.728,35.0 -15:49:59,398.2893,34.587,35.143,49.215,35.0 -15:49:59,398.3349,34.615,35.087,49.222,35.0 -15:49:59,398.3803,34.531,35.143,49.711,35.0 -15:49:59,398.4254,34.587,35.087,50.2,35.0 -15:49:59,398.4744,34.559,35.115,50.209,35.0 -15:49:59,398.5236,34.587,35.115,50.217,35.0 -15:49:59,398.5719,34.587,35.115,49.745,35.0 -15:49:59,398.6185,34.587,35.199,49.753,35.0 -15:49:59,398.6671,34.587,35.115,48.317,35.0 -15:49:59,398.7122,34.559,35.143,49.767,35.0 -15:49:59,398.7581,34.559,35.115,49.775,35.0 -15:49:59,398.8038,34.587,35.143,50.264,35.0 -15:50:00,398.8488,34.587,35.115,49.31,35.0 -15:50:00,398.8927,34.587,35.115,49.798,35.0 -15:50:00,398.9428,34.615,35.143,49.805,35.0 -15:50:00,398.9873,34.642,35.115,48.851,35.0 -15:50:00,399.0308,34.615,35.143,48.874,35.0 -15:50:00,399.0747,34.615,35.115,48.863,35.0 -15:50:00,399.1207,34.587,35.115,49.35,35.0 -15:50:00,399.1642,34.615,35.115,49.839,35.0 -15:50:00,399.2068,34.559,35.143,49.365,35.0 -15:50:00,399.2541,34.615,35.087,49.853,35.0 -15:50:00,399.2978,34.615,35.115,49.861,35.0 -15:50:00,399.3414,34.587,35.143,49.387,35.0 -15:50:00,399.3873,34.615,35.143,49.394,35.0 -15:50:00,399.4306,34.559,35.171,48.919,35.0 -15:50:00,399.4757,34.559,35.143,49.407,35.0 -15:50:00,399.5220,34.587,35.115,49.895,35.0 -15:50:00,399.5663,34.587,35.115,49.903,35.0 -15:50:00,399.6120,34.587,35.115,49.911,35.0 -15:50:00,399.6563,34.615,35.115,49.919,35.0 -15:50:00,399.7023,34.587,35.115,49.445,35.0 -15:50:00,399.7471,34.587,35.143,49.933,35.0 -15:50:00,399.7907,34.615,35.143,49.459,35.0 -15:50:01,399.8361,34.587,35.143,48.984,35.0 -15:50:01,399.8808,34.559,35.115,49.472,35.0 -15:50:01,399.9248,34.615,35.171,50.442,35.0 -15:50:01,399.9701,34.615,35.143,48.524,35.0 -15:50:01,400.0132,34.587,35.115,49.011,35.0 -15:50:01,400.0555,34.587,35.115,49.98,35.0 -15:50:01,400.1005,34.615,35.143,49.988,35.0 -15:50:01,400.1468,34.615,35.115,49.032,35.0 -15:50:01,400.1908,34.587,35.143,49.52,35.0 -15:50:01,400.2368,34.587,35.143,49.527,35.0 -15:50:01,400.2809,34.587,35.115,49.534,35.0 -15:50:01,400.3241,34.615,35.143,50.022,35.0 -15:50:01,400.3686,34.615,35.143,49.067,35.0 -15:50:01,400.4124,34.615,35.115,49.073,35.0 -15:50:01,400.4585,34.587,35.143,49.56,35.0 -15:50:01,400.5038,34.587,35.143,49.568,35.0 -15:50:01,400.5478,34.615,35.115,49.574,35.0 -15:50:01,400.5917,34.587,35.171,49.581,35.0 -15:50:01,400.6372,34.587,35.115,49.107,35.0 -15:50:01,400.6833,34.615,35.143,50.076,35.0 -15:50:01,400.7273,34.559,35.143,49.121,35.0 -15:50:01,400.7719,34.642,35.115,50.09,35.0 -15:50:02,400.8167,34.615,35.143,49.152,35.0 -15:50:02,400.8612,34.642,35.115,49.141,35.0 -15:50:02,400.9056,34.559,35.143,49.164,35.0 -15:50:02,400.9522,34.531,35.143,50.116,35.0 -15:50:02,400.9958,34.615,35.171,50.605,35.0 -15:50:02,401.0409,34.587,35.143,48.687,35.0 -15:50:02,401.0870,34.615,35.143,49.656,35.0 -15:50:02,401.1310,34.587,35.143,49.182,35.0 -15:50:02,401.1742,34.615,35.143,49.669,35.0 -15:50:02,401.2192,34.587,35.143,49.194,35.0 -15:50:02,401.2640,34.642,35.115,49.682,35.0 -15:50:02,401.3081,34.587,35.115,49.225,35.0 -15:50:02,401.3533,34.587,35.115,50.177,35.0 -15:50:02,401.3974,34.615,35.115,50.184,35.0 -15:50:02,401.4417,34.587,35.143,49.71,35.0 -15:50:02,401.4866,34.587,35.171,49.717,35.0 -15:50:02,401.5308,34.476,35.143,49.243,35.0 -15:50:02,401.5749,34.67,35.143,51.639,35.0 -15:50:02,401.6165,34.615,35.143,48.312,35.0 -15:50:02,401.6614,34.587,35.143,49.263,35.0 -15:50:02,401.7052,34.615,35.115,49.75,35.0 -15:50:02,401.7486,34.615,35.115,49.757,35.0 -15:50:02,401.7944,34.642,35.143,49.764,35.0 -15:50:03,401.8385,34.587,35.143,48.825,35.0 -15:50:03,401.8835,34.559,35.171,49.776,35.0 -15:50:03,401.9293,34.67,35.143,49.783,35.0 -15:50:03,401.9759,34.615,35.115,48.363,35.0 -15:50:03,402.0231,34.615,35.143,49.795,35.0 -15:50:03,402.0709,34.615,35.115,49.321,35.0 -15:50:03,402.1160,34.587,35.143,49.809,35.0 -15:50:03,402.1608,34.615,35.143,49.816,35.0 -15:50:03,402.2052,34.615,35.171,49.342,35.0 -15:50:03,402.2487,34.587,35.115,48.866,35.0 -15:50:03,402.2950,34.615,35.115,50.316,35.0 -15:50:03,402.3418,34.615,35.171,49.842,35.0 -15:50:03,402.3893,34.587,35.143,48.886,35.0 -15:50:03,402.4363,34.698,35.171,49.855,35.0 -15:50:03,402.4831,34.587,35.171,47.472,35.0 -15:50:03,402.5287,34.642,35.143,49.385,35.0 -15:50:03,402.5753,34.504,35.143,48.927,35.0 -15:50:03,402.6241,34.587,35.143,51.306,35.0 -15:50:03,402.6701,34.587,35.171,49.888,35.0 -15:50:03,402.7178,34.615,35.143,49.414,35.0 -15:50:03,402.7634,34.642,35.143,49.42,35.0 -15:50:04,402.8129,34.642,35.143,48.962,35.0 -15:50:04,402.8618,34.587,35.171,48.968,35.0 -15:50:04,402.9101,34.615,35.143,49.439,35.0 -15:50:04,402.9567,34.642,35.143,49.445,35.0 -15:50:04,403.0046,34.642,35.115,48.987,35.0 -15:50:04,403.0508,34.559,35.171,49.475,35.0 -15:50:04,403.0968,34.67,35.171,49.945,35.0 -15:50:04,403.1441,34.615,35.143,48.044,35.0 -15:50:04,403.1916,34.615,35.143,49.475,35.0 -15:50:04,403.2387,34.642,35.115,49.482,35.0 -15:50:04,403.2852,34.642,35.143,49.506,35.0 -15:50:04,403.3308,34.642,35.143,49.031,35.0 -15:50:04,403.3781,34.642,35.143,49.036,35.0 -15:50:04,403.4253,34.615,35.143,49.042,35.0 -15:50:04,403.4730,34.642,35.115,49.512,35.0 -15:50:04,403.5208,34.615,35.143,49.536,35.0 -15:50:04,403.5680,34.615,35.171,49.525,35.0 -15:50:04,403.6157,34.587,35.143,49.05,35.0 -15:50:04,403.6632,34.504,35.171,50.019,35.0 -15:50:04,403.7105,34.615,35.143,50.973,35.0 -15:50:04,403.7585,34.615,35.143,49.554,35.0 -15:50:04,403.8066,34.587,35.171,49.56,35.0 -15:50:05,403.8542,34.587,35.171,49.567,35.0 -15:50:05,403.9005,34.587,35.171,49.574,35.0 -15:50:05,403.9475,34.587,35.143,49.58,35.0 -15:50:05,403.9950,34.67,35.199,50.068,35.0 -15:50:05,404.0425,34.67,35.115,47.685,35.0 -15:50:05,404.0906,34.587,35.143,49.133,35.0 -15:50:05,404.1383,34.587,35.143,50.085,35.0 -15:50:05,404.1858,34.615,35.171,50.092,35.0 -15:50:05,404.2311,34.587,35.143,49.137,35.0 -15:50:05,404.2779,34.587,35.171,50.105,35.0 -15:50:05,404.3237,34.587,35.143,49.631,35.0 -15:50:05,404.3706,34.587,35.143,50.119,35.0 -15:50:05,404.4197,34.615,35.143,50.126,35.0 -15:50:05,404.4660,34.615,35.143,49.652,35.0 -15:50:05,404.5131,34.587,35.115,49.658,35.0 -15:50:05,404.5606,34.615,35.115,50.628,35.0 -15:50:05,404.6094,34.615,35.171,50.154,35.0 -15:50:05,404.6574,34.587,35.171,49.199,35.0 -15:50:05,404.7062,34.642,35.143,49.686,35.0 -15:50:05,404.7546,34.642,35.171,49.229,35.0 -15:50:05,404.8042,34.642,35.143,48.753,35.0 -15:50:06,404.8513,34.615,35.143,49.24,35.0 -15:50:06,404.8979,34.587,35.171,49.71,35.0 -15:50:06,404.9455,34.642,35.143,49.716,35.0 -15:50:06,404.9905,34.67,35.171,49.259,35.0 -15:50:06,405.0386,34.587,35.143,48.301,35.0 -15:50:06,405.0873,34.642,35.143,50.215,35.0 -15:50:06,405.1349,34.615,35.143,49.276,35.0 -15:50:06,405.1806,34.615,35.199,49.746,35.0 -15:50:06,405.2234,34.615,35.143,48.79,35.0 -15:50:06,405.2696,34.642,35.143,49.757,35.0 -15:50:06,405.3138,34.615,35.115,49.299,35.0 -15:50:06,405.3651,34.642,35.171,50.25,35.0 -15:50:06,405.4215,34.67,35.143,48.831,35.0 -15:50:06,405.4705,34.615,35.143,48.837,35.0 -15:50:06,405.5154,34.642,35.087,49.788,35.0 -15:50:06,405.5607,34.642,35.143,50.293,35.0 -15:50:06,405.6076,34.642,35.171,49.337,35.0 -15:50:06,405.6583,34.642,35.171,48.861,35.0 -15:50:06,405.7227,34.642,35.087,48.867,35.0 -15:50:06,405.7896,34.615,35.143,50.319,35.0 -15:50:07,405.8518,34.642,35.143,49.831,35.0 -15:50:07,405.9180,34.615,35.143,49.374,35.0 -15:50:07,405.9734,34.615,35.171,49.847,35.0 -15:50:07,406.0250,34.615,35.171,49.373,35.0 -15:50:07,406.0849,34.615,35.143,49.38,35.0 -15:50:07,406.1445,34.615,35.171,49.869,35.0 -15:50:07,406.2044,34.587,35.171,49.395,35.0 -15:50:07,406.2581,34.642,35.171,49.884,35.0 -15:50:07,406.3166,34.642,35.199,48.945,35.0 -15:50:07,406.3694,34.642,35.143,48.47,35.0 -15:50:07,406.4222,34.642,35.143,49.438,35.0 -15:50:07,406.4726,34.642,35.171,49.444,35.0 -15:50:07,406.5221,34.615,35.143,48.969,35.0 -15:50:07,406.5706,34.587,35.171,49.92,35.0 -15:50:07,406.6203,34.642,35.143,49.927,35.0 -15:50:07,406.6703,34.615,35.199,49.469,35.0 -15:50:07,406.7159,34.587,35.171,48.976,35.0 -15:50:07,406.7620,34.587,35.171,49.944,35.0 -15:50:07,406.8066,34.615,35.143,49.951,35.0 -15:50:08,406.8516,34.587,35.143,49.957,35.0 -15:50:08,406.8964,34.615,35.143,50.445,35.0 -15:50:08,406.9461,34.587,35.143,49.97,35.0 -15:50:08,407.0193,34.615,35.171,50.46,35.0 -15:50:08,407.0676,34.642,35.143,49.506,35.0 -15:50:08,407.1146,34.642,35.115,49.529,35.0 -15:50:08,407.1645,34.587,35.143,50.017,35.0 -15:50:08,407.2145,34.587,35.143,50.488,35.0 -15:50:08,407.2603,34.615,35.171,50.496,35.0 -15:50:08,407.3057,34.67,35.171,49.54,35.0 -15:50:08,407.3509,34.642,35.143,48.599,35.0 -15:50:08,407.3956,34.587,35.143,49.566,35.0 -15:50:08,407.4389,34.642,35.171,50.518,35.0 -15:50:08,407.4863,34.642,35.171,49.097,35.0 -15:50:08,407.5298,34.642,35.171,49.102,35.0 -15:50:08,407.5745,34.615,35.143,49.107,35.0 -15:50:08,407.6241,34.615,35.115,50.057,35.0 -15:50:08,407.6688,34.615,35.171,50.546,35.0 -15:50:08,407.7148,34.587,35.199,49.59,35.0 -15:50:08,407.7596,34.642,35.199,49.595,35.0 -15:50:08,407.8053,34.642,35.143,48.655,35.0 -15:50:09,407.8512,34.615,35.171,49.622,35.0 -15:50:09,407.8957,34.587,35.171,49.611,35.0 -15:50:09,407.9433,34.642,35.171,50.098,35.0 -15:50:09,407.9903,34.615,35.115,49.158,35.0 -15:50:09,408.0347,34.642,35.143,50.591,35.0 -15:50:09,408.0786,34.615,35.199,49.652,35.0 -15:50:09,408.1228,34.642,35.171,49.158,35.0 -15:50:09,408.1683,34.642,35.171,49.18,35.0 -15:50:09,408.2130,34.67,35.143,49.185,35.0 -15:50:09,408.2575,34.642,35.143,49.19,35.0 -15:50:09,408.3025,34.642,35.171,49.676,35.0 -15:50:09,408.3453,34.615,35.171,49.2,35.0 -15:50:09,408.3896,34.67,35.115,49.669,35.0 -15:50:09,408.4350,34.67,35.171,49.692,35.0 -15:50:09,408.4796,34.615,35.143,48.734,35.0 -15:50:09,408.5240,34.642,35.171,50.166,35.0 -15:50:09,408.5680,34.615,35.171,49.226,35.0 -15:50:09,408.6126,34.67,35.143,49.695,35.0 -15:50:09,408.6566,34.642,35.171,49.236,35.0 -15:50:09,408.7031,34.559,35.199,49.241,35.0 -15:50:09,408.7472,34.642,35.143,50.192,35.0 -15:50:09,408.7916,34.559,35.143,49.733,35.0 -15:50:10,408.8365,34.642,35.143,51.166,35.0 -15:50:10,408.8798,34.67,35.115,49.746,35.0 -15:50:10,408.9244,34.615,35.199,49.752,35.0 -15:50:10,408.9689,34.642,35.171,49.258,35.0 -15:50:10,409.0126,34.698,35.171,49.28,35.0 -15:50:10,409.0570,34.642,35.143,48.322,35.0 -15:50:10,409.1023,34.615,35.171,49.77,35.0 -15:50:10,409.1461,34.615,35.171,49.758,35.0 -15:50:10,409.1891,34.587,35.143,49.764,35.0 -15:50:10,409.2350,34.642,35.171,50.732,35.0 -15:50:10,409.2787,34.642,35.115,49.312,35.0 -15:50:10,409.3213,34.615,35.171,50.279,35.0 -15:50:10,409.3643,34.642,35.143,49.787,35.0 -15:50:10,409.4088,34.67,35.199,49.809,35.0 -15:50:10,409.4537,34.615,35.143,48.37,35.0 -15:50:10,409.4991,34.615,35.171,50.282,35.0 -15:50:10,409.5443,34.642,35.171,49.807,35.0 -15:50:10,409.5875,34.615,35.171,49.348,35.0 -15:50:10,409.6316,34.642,35.171,49.817,35.0 -15:50:10,409.6767,34.587,35.115,49.358,35.0 -15:50:10,409.7223,34.615,35.143,51.272,35.0 -15:50:10,409.7665,34.67,35.171,50.316,35.0 -15:50:11,409.8111,34.642,35.171,48.895,35.0 -15:50:11,409.8541,34.642,35.171,49.381,35.0 -15:50:11,409.9017,34.615,35.171,49.385,35.0 -15:50:11,409.9478,34.642,35.171,49.855,35.0 -15:50:11,409.9917,34.642,35.199,49.396,35.0 -15:50:11,410.0373,34.642,35.199,48.919,35.0 -15:50:11,410.0856,34.642,35.199,48.923,35.0 -15:50:11,410.1386,34.642,35.171,48.928,35.0 -15:50:11,410.1845,34.67,35.143,49.414,35.0 -15:50:11,410.2294,34.615,35.171,49.419,35.0 -15:50:11,410.2757,34.642,35.227,49.888,35.0 -15:50:11,410.3238,34.615,35.199,48.466,35.0 -15:50:11,410.3708,34.642,35.171,49.416,35.0 -15:50:11,410.4155,34.67,35.227,49.438,35.0 -15:50:11,410.4606,34.587,35.227,47.998,35.0 -15:50:11,410.5046,34.642,35.171,49.428,35.0 -15:50:11,410.5543,34.615,35.199,49.45,35.0 -15:50:11,410.6055,34.642,35.227,49.438,35.0 -15:50:11,410.6526,34.642,35.199,48.498,35.0 -15:50:11,410.6986,34.642,35.171,48.983,35.0 -15:50:11,410.7443,34.642,35.171,49.469,35.0 -15:50:11,410.7874,34.67,35.143,49.474,35.0 -15:50:12,410.8334,34.615,35.171,49.478,35.0 -15:50:12,410.8771,34.615,35.199,49.947,35.0 -15:50:12,410.9208,34.67,35.171,49.471,35.0 -15:50:12,410.9675,34.615,35.199,49.012,35.0 -15:50:12,411.0131,34.504,35.143,49.48,35.0 -15:50:12,411.0583,34.698,35.199,52.357,35.0 -15:50:12,411.1039,34.615,35.255,48.067,35.0 -15:50:12,411.1510,34.615,35.171,48.534,35.0 -15:50:12,411.1944,34.587,35.199,49.982,35.0 -15:50:12,411.2393,34.642,35.171,49.987,35.0 -15:50:12,411.2840,34.642,35.171,49.528,35.0 -15:50:12,411.3277,34.67,35.171,49.533,35.0 -15:50:12,411.3715,34.642,35.171,49.056,35.0 -15:50:12,411.4178,34.67,35.171,49.542,35.0 -15:50:12,411.4617,34.67,35.199,49.065,35.0 -15:50:12,411.5064,34.615,35.199,48.588,35.0 -15:50:12,411.5516,34.67,35.171,49.537,35.0 -15:50:12,411.5958,34.67,35.171,49.077,35.0 -15:50:12,411.6426,34.615,35.199,49.081,35.0 -15:50:12,411.6886,34.67,35.171,49.55,35.0 -15:50:12,411.7332,34.67,35.171,49.09,35.0 -15:50:12,411.7766,34.67,35.199,49.095,35.0 -15:50:13,411.8226,34.642,35.171,48.617,35.0 -15:50:13,411.8661,34.642,35.171,49.584,35.0 -15:50:13,411.9108,34.67,35.171,49.588,35.0 -15:50:13,411.9550,34.642,35.199,49.111,35.0 -15:50:13,412.0028,34.67,35.143,49.115,35.0 -15:50:13,412.0477,34.587,35.171,49.601,35.0 -15:50:13,412.0927,34.67,35.143,50.552,35.0 -15:50:13,412.1385,34.615,35.171,49.612,35.0 -15:50:13,412.1825,34.615,35.171,50.082,35.0 -15:50:13,412.2260,34.587,35.171,50.087,35.0 -15:50:13,412.2718,34.615,35.199,50.574,35.0 -15:50:13,412.3190,34.67,35.143,49.617,35.0 -15:50:13,412.3638,34.67,35.115,49.639,35.0 -15:50:13,412.4091,34.615,35.199,50.126,35.0 -15:50:13,412.4562,34.642,35.171,49.632,35.0 -15:50:13,412.5016,34.587,35.199,49.655,35.0 -15:50:13,412.5450,34.67,35.143,50.124,35.0 -15:50:13,412.5890,34.642,35.171,49.665,35.0 -15:50:13,412.6354,34.67,35.171,49.669,35.0 -15:50:13,412.6796,34.67,35.199,49.193,35.0 -15:50:13,412.7249,34.615,35.199,48.715,35.0 -15:50:13,412.7697,34.615,35.199,49.665,35.0 -15:50:14,412.8168,34.642,35.199,49.669,35.0 -15:50:14,412.8615,34.615,35.171,49.21,35.0 -15:50:14,412.9050,34.726,35.171,50.16,35.0 -15:50:14,412.9503,34.642,35.171,48.256,35.0 -15:50:14,412.9952,34.67,35.115,49.704,35.0 -15:50:14,413.0397,34.642,35.171,50.19,35.0 -15:50:14,413.0845,34.67,35.227,49.714,35.0 -15:50:14,413.1302,34.642,35.171,48.274,35.0 -15:50:14,413.1762,34.642,35.143,49.722,35.0 -15:50:14,413.2225,34.642,35.171,50.208,35.0 -15:50:14,413.2689,34.642,35.199,49.732,35.0 -15:50:14,413.3147,34.615,35.227,49.255,35.0 -15:50:14,413.3599,34.698,35.199,49.242,35.0 -15:50:14,413.4058,34.698,35.227,48.301,35.0 -15:50:14,413.4524,34.67,35.171,47.822,35.0 -15:50:14,413.4986,34.67,35.171,49.268,35.0 -15:50:14,413.5430,34.642,35.199,49.273,35.0 -15:50:14,413.5885,34.67,35.171,49.277,35.0 -15:50:14,413.6346,34.615,35.199,49.281,35.0 -15:50:14,413.6800,34.642,35.199,49.749,35.0 -15:50:14,413.7251,34.642,35.171,49.29,35.0 -15:50:14,413.7695,34.642,35.199,49.775,35.0 -15:50:15,413.8147,34.67,35.171,49.299,35.0 -15:50:15,413.8593,34.67,35.171,49.303,35.0 -15:50:15,413.9050,34.642,35.199,49.307,35.0 -15:50:15,413.9499,34.642,35.199,49.311,35.0 -15:50:15,413.9945,34.698,35.199,49.315,35.0 -15:50:15,414.0393,34.615,35.199,48.356,35.0 -15:50:15,414.0856,34.67,35.199,49.786,35.0 -15:50:15,414.1307,34.642,35.171,48.845,35.0 -15:50:15,414.1754,34.67,35.143,49.812,35.0 -15:50:15,414.2210,34.67,35.087,49.816,35.0 -15:50:15,414.2666,34.642,35.171,50.784,35.0 -15:50:15,414.3105,34.753,35.171,49.828,35.0 -15:50:15,414.3533,34.698,35.199,47.923,35.0 -15:50:15,414.4027,34.67,35.199,48.389,35.0 -15:50:15,414.4590,34.642,35.171,48.874,35.0 -15:50:15,414.5066,34.67,35.143,49.842,35.0 -15:50:15,414.5553,34.642,35.227,49.847,35.0 -15:50:15,414.6045,34.642,35.171,48.889,35.0 -15:50:15,414.6523,34.642,35.255,49.856,35.0 -15:50:15,414.6946,34.642,35.171,48.416,35.0 -15:50:15,414.7378,34.67,35.199,49.863,35.0 -15:50:15,414.7830,34.67,35.171,48.905,35.0 -15:50:16,414.8269,34.698,35.171,49.39,35.0 -15:50:16,414.8707,34.67,35.199,48.912,35.0 -15:50:16,414.9174,34.642,35.171,48.915,35.0 -15:50:16,414.9625,34.642,35.171,49.882,35.0 -15:50:16,415.0069,34.67,35.199,49.887,35.0 -15:50:16,415.0517,34.67,35.199,48.928,35.0 -15:50:16,415.0975,34.642,35.199,48.932,35.0 -15:50:16,415.1427,34.67,35.199,49.417,35.0 -15:50:16,415.1888,34.642,35.199,48.939,35.0 -15:50:16,415.2337,34.587,35.171,49.424,35.0 -15:50:16,415.2787,34.67,35.199,50.856,35.0 -15:50:16,415.3228,34.642,35.115,48.953,35.0 -15:50:16,415.3680,34.726,35.171,50.883,35.0 -15:50:16,415.4125,34.642,35.199,48.481,35.0 -15:50:16,415.4560,34.67,35.227,49.447,35.0 -15:50:16,415.5016,34.67,35.171,48.488,35.0 -15:50:16,415.5466,34.698,35.171,49.453,35.0 -15:50:16,415.5912,34.642,35.171,48.976,35.0 -15:50:16,415.6399,34.67,35.199,49.942,35.0 -15:50:16,415.6866,34.642,35.227,48.984,35.0 -15:50:16,415.7323,34.587,35.199,48.988,35.0 -15:50:16,415.7766,34.615,35.199,50.419,35.0 -15:50:17,415.8204,34.67,35.171,49.943,35.0 -15:50:17,415.8672,34.698,35.199,49.483,35.0 -15:50:17,415.9132,34.67,35.199,48.524,35.0 -15:50:17,415.9591,34.67,35.199,49.008,35.0 -15:50:17,416.0045,34.67,35.199,49.012,35.0 -15:50:17,416.0506,34.67,35.227,49.015,35.0 -15:50:17,416.0950,34.642,35.171,48.537,35.0 -15:50:17,416.1412,34.67,35.199,49.984,35.0 -15:50:17,416.1865,34.698,35.199,49.026,35.0 -15:50:17,416.2347,34.67,35.199,48.548,35.0 -15:50:17,416.2804,34.67,35.227,49.032,35.0 -15:50:17,416.3253,34.67,35.199,48.554,35.0 -15:50:17,416.3705,34.642,35.199,49.038,35.0 -15:50:17,416.4149,34.67,35.199,49.523,35.0 -15:50:17,416.4595,34.698,35.199,49.046,35.0 -15:50:17,416.5033,34.642,35.227,48.568,35.0 -15:50:17,416.5499,34.67,35.171,49.052,35.0 -15:50:17,416.5944,34.642,35.171,49.537,35.0 -15:50:17,416.6425,34.67,35.115,50.022,35.0 -15:50:17,416.6866,34.642,35.171,50.509,35.0 -15:50:17,416.7326,34.698,35.199,50.033,35.0 -15:50:17,416.7766,34.726,35.171,48.593,35.0 -15:50:18,416.8207,34.698,35.171,48.596,35.0 -15:50:18,416.8669,34.67,35.171,49.08,35.0 -15:50:18,416.9113,34.67,35.227,49.565,35.0 -15:50:18,416.9566,34.642,35.199,48.606,35.0 -15:50:18,417.0021,34.698,35.227,49.572,35.0 -15:50:18,417.0486,34.642,35.171,48.131,35.0 -15:50:18,417.0933,34.642,35.171,50.059,35.0 -15:50:18,417.1391,34.67,35.199,50.064,35.0 -15:50:18,417.1846,34.642,35.227,49.106,35.0 -15:50:18,417.2294,34.615,35.171,49.109,35.0 -15:50:18,417.2755,34.726,35.115,50.54,35.0 -15:50:18,417.3229,34.67,35.199,49.6,35.0 -15:50:18,417.3711,34.698,35.227,49.123,35.0 -15:50:18,417.4187,34.698,35.199,48.163,35.0 -15:50:18,417.4682,34.698,35.171,48.647,35.0 -15:50:18,417.5159,34.698,35.227,49.131,35.0 -15:50:18,417.5622,34.642,35.171,48.172,35.0 -15:50:18,417.6130,34.642,35.227,50.1,35.0 -15:50:18,417.6609,34.67,35.199,49.142,35.0 -15:50:18,417.7079,34.698,35.199,49.146,35.0 -15:50:18,417.7549,34.67,35.199,48.668,35.0 -15:50:18,417.8026,34.642,35.227,49.152,35.0 -15:50:19,417.8513,34.642,35.143,49.155,35.0 -15:50:19,417.8999,34.67,35.227,50.604,35.0 -15:50:19,417.9488,34.67,35.199,48.683,35.0 -15:50:19,417.9972,34.67,35.227,49.168,35.0 -15:50:19,418.0451,34.587,35.227,48.69,35.0 -15:50:19,418.0935,34.67,35.199,50.12,35.0 -15:50:19,418.1410,34.67,35.199,49.18,35.0 -15:50:19,418.1896,34.67,35.227,49.183,35.0 -15:50:19,418.2373,34.67,35.199,48.705,35.0 -15:50:19,418.2849,34.698,35.227,49.19,35.0 -15:50:19,418.3319,34.698,35.199,48.23,35.0 -15:50:19,418.3770,34.67,35.199,48.713,35.0 -15:50:19,418.4247,34.67,35.227,49.198,35.0 -15:50:19,418.4727,34.642,35.199,48.72,35.0 -15:50:19,418.5217,34.67,35.227,49.686,35.0 -15:50:19,418.5687,34.698,35.199,48.727,35.0 -15:50:19,418.6179,34.67,35.227,48.73,35.0 -15:50:19,418.6706,34.698,35.227,48.733,35.0 -15:50:19,418.7162,34.67,35.227,48.254,35.0 -15:50:19,418.7606,34.698,35.199,48.737,35.0 -15:50:19,418.8055,34.67,35.199,48.74,35.0 -15:50:20,418.8507,34.615,35.199,49.224,35.0 -15:50:20,418.8955,34.698,35.199,50.174,35.0 -15:50:20,418.9416,34.698,35.227,48.751,35.0 -15:50:20,418.9848,34.642,35.227,48.272,35.0 -15:50:20,419.0290,34.726,35.199,49.237,35.0 -15:50:20,419.0757,34.726,35.199,48.277,35.0 -15:50:20,419.1230,34.67,35.227,48.279,35.0 -15:50:20,419.1684,34.726,35.227,48.763,35.0 -15:50:20,419.2133,34.698,35.199,47.802,35.0 -15:50:20,419.2595,34.67,35.171,48.767,35.0 -15:50:20,419.3046,34.698,35.199,49.733,35.0 -15:50:20,419.3503,34.726,35.199,48.773,35.0 -15:50:20,419.3964,34.642,35.199,48.295,35.0 -15:50:20,419.4414,34.698,35.255,49.741,35.0 -15:50:20,419.4877,34.67,35.227,47.819,35.0 -15:50:20,419.5335,34.642,35.199,48.784,35.0 -15:50:20,419.5801,34.67,35.171,49.749,35.0 -15:50:20,419.6260,34.67,35.199,49.754,35.0 -15:50:20,419.6738,34.67,35.199,49.276,35.0 -15:50:20,419.7182,34.67,35.227,49.28,35.0 -15:50:20,419.7654,34.67,35.227,48.802,35.0 -15:50:21,419.8091,34.698,35.227,48.804,35.0 -15:50:21,419.8529,34.642,35.227,48.325,35.0 -15:50:21,419.8995,34.67,35.227,49.29,35.0 -15:50:21,419.9437,34.698,35.227,48.812,35.0 -15:50:21,419.9880,34.67,35.227,48.333,35.0 -15:50:21,420.0345,34.698,35.171,48.817,35.0 -15:50:21,420.0839,34.698,35.227,49.301,35.0 -15:50:21,420.1304,34.698,35.255,48.342,35.0 -15:50:21,420.1758,34.698,35.171,47.862,35.0 -15:50:21,420.2208,34.698,35.199,49.308,35.0 -15:50:21,420.2674,34.698,35.199,48.83,35.0 -15:50:21,420.3138,34.698,35.199,48.832,35.0 -15:50:21,420.3657,34.67,35.171,48.835,35.0 -15:50:21,420.4211,34.698,35.199,49.802,35.0 -15:50:21,420.4685,34.726,35.255,48.843,35.0 -15:50:21,420.5161,34.67,35.227,47.401,35.0 -15:50:21,420.5647,34.642,35.115,48.847,35.0 -15:50:21,420.6102,34.698,35.199,51.257,35.0 -15:50:21,420.6599,34.698,35.227,48.856,35.0 -15:50:21,420.7299,34.698,35.227,48.377,35.0 -15:50:21,420.7969,34.726,35.227,48.38,35.0 -15:50:22,420.8536,34.698,35.227,47.901,35.0 -15:50:22,420.9169,34.67,35.227,48.385,35.0 -15:50:22,420.9718,34.698,35.227,48.869,35.0 -15:50:22,421.0304,34.67,35.199,48.391,35.0 -15:50:22,421.0851,34.698,35.199,49.357,35.0 -15:50:22,421.1486,34.698,35.227,48.879,35.0 -15:50:22,421.2026,34.698,35.255,48.401,35.0 -15:50:22,421.2540,34.642,35.199,47.922,35.0 -15:50:22,421.3134,34.67,35.171,49.85,35.0 -15:50:22,421.3693,34.726,35.227,49.855,35.0 -15:50:22,421.4220,34.698,35.227,47.933,35.0 -15:50:22,421.4758,34.726,35.227,48.416,35.0 -15:50:22,421.5289,34.698,35.227,47.937,35.0 -15:50:22,421.5813,34.67,35.227,48.42,35.0 -15:50:22,421.6339,34.698,35.255,48.904,35.0 -15:50:22,421.6907,34.67,35.199,47.944,35.0 -15:50:22,421.7424,34.67,35.227,49.39,35.0 -15:50:22,421.7908,34.698,35.227,48.913,35.0 -15:50:23,421.8377,34.67,35.227,48.434,35.0 -15:50:23,421.8839,34.698,35.227,48.917,35.0 -15:50:23,421.9297,34.726,35.227,48.439,35.0 -15:50:23,421.9762,34.726,35.199,47.959,35.0 -15:50:23,422.0408,34.698,35.227,48.442,35.0 -15:50:23,422.0915,34.67,35.227,48.445,35.0 -15:50:23,422.1388,34.67,35.199,48.928,35.0 -15:50:23,422.1859,34.753,35.199,49.413,35.0 -15:50:23,422.2332,34.67,35.227,47.989,35.0 -15:50:23,422.2798,34.698,35.199,48.936,35.0 -15:50:23,422.3264,34.726,35.227,48.939,35.0 -15:50:23,422.3733,34.726,35.227,47.978,35.0 -15:50:23,422.4215,34.698,35.199,47.98,35.0 -15:50:23,422.4695,34.698,35.227,48.944,35.0 -15:50:23,422.5162,34.698,35.227,48.465,35.0 -15:50:23,422.5637,34.615,35.227,48.467,35.0 -15:50:23,422.6080,34.698,35.255,49.897,35.0 -15:50:23,422.6584,34.587,35.255,47.992,35.0 -15:50:23,422.7045,34.698,35.227,49.903,35.0 -15:50:23,422.7506,34.726,35.227,48.479,35.0 -15:50:23,422.7964,34.642,35.227,48.0,35.0 -15:50:24,422.8443,34.698,35.255,49.446,35.0 -15:50:24,422.8925,34.698,35.199,48.004,35.0 -15:50:24,422.9407,34.726,35.227,48.969,35.0 -15:50:24,422.9873,34.726,35.227,48.009,35.0 -15:50:24,423.0356,34.698,35.199,48.01,35.0 -15:50:24,423.0852,34.698,35.227,48.974,35.0 -15:50:24,423.1345,34.726,35.227,48.496,35.0 -15:50:24,423.1833,34.698,35.255,48.016,35.0 -15:50:24,423.2323,34.726,35.227,48.017,35.0 -15:50:24,423.2810,34.67,35.227,48.019,35.0 -15:50:24,423.3295,34.726,35.283,48.983,35.0 -15:50:24,423.3783,34.698,35.227,47.06,35.0 -15:50:24,423.4316,34.698,35.255,48.504,35.0 -15:50:24,423.4780,34.726,35.227,48.025,35.0 -15:50:24,423.5247,34.67,35.255,48.026,35.0 -15:50:24,423.5699,34.726,35.227,48.509,35.0 -15:50:24,423.6154,34.753,35.227,48.029,35.0 -15:50:24,423.6653,34.698,35.199,47.566,35.0 -15:50:24,423.7099,34.698,35.227,48.994,35.0 -15:50:24,423.7560,34.753,35.199,48.516,35.0 -15:50:24,423.8032,34.698,35.227,48.053,35.0 -15:50:25,423.8503,34.726,35.227,48.519,35.0 -15:50:25,423.8971,34.698,35.227,48.039,35.0 -15:50:25,423.9415,34.698,35.171,48.522,35.0 -15:50:25,423.9859,34.726,35.227,49.487,35.0 -15:50:25,424.0318,34.698,35.227,48.046,35.0 -15:50:25,424.0773,34.726,35.227,48.529,35.0 -15:50:25,424.1222,34.67,35.255,48.049,35.0 -15:50:25,424.1686,34.698,35.171,48.532,35.0 -15:50:25,424.2151,34.698,35.255,49.497,35.0 -15:50:25,424.2620,34.726,35.227,48.056,35.0 -15:50:25,424.3072,34.67,35.227,48.057,35.0 -15:50:25,424.3519,34.698,35.255,49.021,35.0 -15:50:25,424.3976,34.698,35.255,48.061,35.0 -15:50:25,424.4421,34.726,35.255,48.062,35.0 -15:50:25,424.4887,34.753,35.227,47.582,35.0 -15:50:25,424.5342,34.753,35.227,47.599,35.0 -15:50:25,424.5804,34.726,35.227,47.6,35.0 -15:50:25,424.6266,34.726,35.227,48.065,35.0 -15:50:25,424.6754,34.726,35.227,48.066,35.0 -15:50:25,424.7233,34.698,35.227,48.067,35.0 -15:50:25,424.7699,34.726,35.227,48.55,35.0 -15:50:26,424.8153,34.698,35.255,48.071,35.0 -15:50:26,424.8605,34.726,35.255,48.072,35.0 -15:50:26,424.9097,34.698,35.227,47.591,35.0 -15:50:26,424.9603,34.698,35.255,48.555,35.0 -15:50:26,425.0068,34.698,35.227,48.076,35.0 -15:50:26,425.0524,34.753,35.227,48.559,35.0 -15:50:26,425.1012,34.67,35.171,47.615,35.0 -15:50:26,425.1527,34.67,35.227,50.006,35.0 -15:50:26,425.1996,34.698,35.255,49.047,35.0 -15:50:26,425.2463,34.698,35.255,48.087,35.0 -15:50:26,425.2925,34.698,35.227,48.088,35.0 -15:50:26,425.3388,34.67,35.255,48.571,35.0 -15:50:26,425.3862,34.726,35.227,48.573,35.0 -15:50:26,425.4369,34.698,35.255,48.094,35.0 -15:50:26,425.4864,34.67,35.227,48.095,35.0 -15:50:26,425.5345,34.698,35.227,49.059,35.0 -15:50:26,425.5818,34.726,35.255,48.581,35.0 -15:50:26,425.6297,34.726,35.199,47.62,35.0 -15:50:26,425.6753,34.726,35.227,48.583,35.0 -15:50:26,425.7235,34.726,35.255,48.104,35.0 -15:50:26,425.7705,34.726,35.227,47.623,35.0 -15:50:27,425.8176,34.698,35.255,48.105,35.0 -15:50:27,425.8662,34.698,35.199,48.107,35.0 -15:50:27,425.9162,34.698,35.255,49.071,35.0 -15:50:27,425.9646,34.698,35.227,48.111,35.0 -15:50:27,426.0125,34.753,35.255,48.594,35.0 -15:50:27,426.0581,34.726,35.227,47.168,35.0 -15:50:27,426.1062,34.698,35.255,48.114,35.0 -15:50:27,426.1549,34.753,35.227,48.115,35.0 -15:50:27,426.2040,34.698,35.227,47.652,35.0 -15:50:27,426.2517,34.698,35.199,48.599,35.0 -15:50:27,426.3003,34.726,35.227,49.082,35.0 -15:50:27,426.3482,34.726,35.199,48.122,35.0 -15:50:27,426.3957,34.698,35.255,48.605,35.0 -15:50:27,426.4433,34.726,35.227,48.125,35.0 -15:50:27,426.4914,34.753,35.227,48.127,35.0 -15:50:27,426.5407,34.726,35.255,47.664,35.0 -15:50:27,426.5886,34.67,35.255,47.647,35.0 -15:50:27,426.6363,34.698,35.255,48.611,35.0 -15:50:27,426.6846,34.642,35.227,48.131,35.0 -15:50:27,426.7312,34.642,35.255,49.577,35.0 -15:50:27,426.7783,34.726,35.227,49.099,35.0 -15:50:28,426.8264,34.726,35.255,48.139,35.0 -15:50:28,426.8743,34.698,35.227,47.658,35.0 -15:50:28,426.9222,34.698,35.255,48.622,35.0 -15:50:28,426.9687,34.698,35.255,48.143,35.0 -15:50:28,427.0163,34.698,35.255,48.144,35.0 -15:50:28,427.0647,34.753,35.199,48.145,35.0 -15:50:28,427.1127,34.698,35.255,48.164,35.0 -15:50:28,427.1596,34.753,35.227,48.148,35.0 -15:50:28,427.2087,34.726,35.227,47.685,35.0 -15:50:28,427.2556,34.726,35.255,48.15,35.0 -15:50:28,427.3049,34.726,35.255,47.669,35.0 -15:50:28,427.3527,34.698,35.255,47.67,35.0 -15:50:28,427.4007,34.698,35.227,48.152,35.0 -15:50:28,427.4507,34.698,35.227,48.635,35.0 -15:50:28,427.4989,34.753,35.171,48.637,35.0 -15:50:28,427.5491,34.726,35.255,48.656,35.0 -15:50:28,427.5978,34.726,35.227,47.678,35.0 -15:50:28,427.6454,34.753,35.255,48.16,35.0 -15:50:28,427.6927,34.698,35.255,47.215,35.0 -15:50:28,427.7398,34.698,35.171,48.161,35.0 -15:50:28,427.7863,34.698,35.255,49.607,35.0 -15:50:29,427.8342,34.809,35.255,48.166,35.0 -15:50:29,427.8831,34.698,35.227,46.258,35.0 -15:50:29,427.9301,34.726,35.283,48.647,35.0 -15:50:29,427.9775,34.698,35.227,47.204,35.0 -15:50:29,428.0252,34.726,35.227,48.649,35.0 -15:50:29,428.0730,34.726,35.227,48.169,35.0 -15:50:29,428.1206,34.726,35.255,48.17,35.0 -15:50:29,428.1699,34.698,35.255,47.69,35.0 -15:50:29,428.2189,34.698,35.255,48.172,35.0 -15:50:29,428.2668,34.698,35.227,48.174,35.0 -15:50:29,428.3160,34.698,35.255,48.657,35.0 -15:50:29,428.3658,34.753,35.227,48.177,35.0 -15:50:29,428.4141,34.726,35.227,47.714,35.0 -15:50:29,428.4618,34.698,35.255,48.179,35.0 -15:50:29,428.5077,34.698,35.227,48.18,35.0 -15:50:29,428.5541,34.726,35.255,48.663,35.0 -15:50:29,428.6037,34.726,35.255,47.702,35.0 -15:50:29,428.6515,34.726,35.255,47.702,35.0 -15:50:29,428.6985,34.698,35.227,47.703,35.0 -15:50:29,428.7455,34.726,35.255,48.666,35.0 -15:50:29,428.7920,34.698,35.255,47.705,35.0 -15:50:30,428.8403,34.698,35.255,48.187,35.0 -15:50:30,428.8887,34.726,35.255,48.189,35.0 -15:50:30,428.9366,34.726,35.255,47.708,35.0 -15:50:30,428.9848,34.726,35.227,47.709,35.0 -15:50:30,429.0316,34.726,35.255,48.191,35.0 -15:50:30,429.0806,34.642,35.255,47.711,35.0 -15:50:30,429.1284,34.698,35.283,49.156,35.0 -15:50:30,429.1757,34.726,35.255,47.714,35.0 -15:50:30,429.2229,34.781,35.227,47.715,35.0 -15:50:30,429.2705,34.753,35.255,47.251,35.0 -15:50:30,429.3183,34.726,35.255,47.251,35.0 -15:50:30,429.3664,34.698,35.283,47.715,35.0 -15:50:30,429.4138,34.726,35.255,47.715,35.0 -15:50:30,429.4621,34.753,35.255,47.716,35.0 -15:50:30,429.5091,34.698,35.255,47.252,35.0 -15:50:30,429.5570,34.809,35.255,48.198,35.0 -15:50:30,429.6047,34.698,35.227,46.29,35.0 -15:50:30,429.6539,34.698,35.311,48.679,35.0 -15:50:30,429.7016,34.726,35.255,47.236,35.0 -15:50:30,429.7486,34.753,35.199,47.717,35.0 -15:50:30,429.7945,34.698,35.283,48.217,35.0 -15:50:31,429.8412,34.698,35.255,47.719,35.0 -15:50:31,429.8893,34.698,35.255,48.201,35.0 -15:50:31,429.9378,34.753,35.227,48.203,35.0 -15:50:31,429.9850,34.726,35.283,47.739,35.0 -15:50:31,430.0321,34.753,35.227,47.241,35.0 -15:50:31,430.0827,34.726,35.283,47.74,35.0 -15:50:31,430.1308,34.726,35.199,47.241,35.0 -15:50:31,430.1785,34.781,35.311,48.686,35.0 -15:50:31,430.2240,34.726,35.227,45.816,35.0 -15:50:31,430.2718,34.726,35.255,48.204,35.0 -15:50:31,430.3209,34.698,35.283,47.724,35.0 -15:50:31,430.3680,34.726,35.255,47.724,35.0 -15:50:31,430.4168,34.753,35.311,47.725,35.0 -15:50:31,430.4668,34.726,35.255,46.298,35.0 -15:50:31,430.5145,34.753,35.227,47.723,35.0 -15:50:31,430.5630,34.753,35.311,47.741,35.0 -15:50:31,430.6114,34.698,35.283,46.297,35.0 -15:50:31,430.6601,34.726,35.255,47.723,35.0 -15:50:31,430.7074,34.726,35.283,47.723,35.0 -15:50:31,430.7543,34.726,35.255,47.242,35.0 -15:50:31,430.8024,34.698,35.255,47.723,35.0 -15:50:32,430.8514,34.726,35.255,48.206,35.0 -15:50:32,430.8989,34.726,35.255,47.725,35.0 -15:50:32,430.9480,34.726,35.283,47.726,35.0 -15:50:32,430.9939,34.698,35.199,47.245,35.0 -15:50:32,431.0421,34.698,35.283,49.171,35.0 -15:50:32,431.0906,34.698,35.283,47.729,35.0 -15:50:32,431.1387,34.781,35.227,47.729,35.0 -15:50:32,431.1872,34.753,35.227,47.265,35.0 -15:50:32,431.2346,34.726,35.255,47.747,35.0 -15:50:32,431.2833,34.781,35.255,47.73,35.0 -15:50:32,431.3313,34.726,35.311,46.785,35.0 -15:50:32,431.3776,34.726,35.255,46.767,35.0 -15:50:32,431.4245,34.753,35.199,47.729,35.0 -15:50:32,431.4713,34.698,35.255,48.228,35.0 -15:50:32,431.5201,34.726,35.283,48.212,35.0 -15:50:32,431.5674,34.753,35.227,47.25,35.0 -15:50:32,431.6152,34.753,35.311,47.749,35.0 -15:50:32,431.6629,34.726,35.283,46.304,35.0 -15:50:32,431.7107,34.726,35.283,47.249,35.0 -15:50:32,431.7578,34.698,35.255,47.248,35.0 -15:50:32,431.8072,34.726,35.255,48.211,35.0 -15:50:33,431.8556,34.781,35.283,47.731,35.0 -15:50:33,431.9036,34.726,35.255,46.304,35.0 -15:50:33,431.9513,34.753,35.283,47.73,35.0 -15:50:33,432.0003,34.67,35.283,46.784,35.0 -15:50:33,432.0481,34.698,35.283,48.211,35.0 -15:50:33,432.0966,34.726,35.283,47.731,35.0 -15:50:33,432.1474,34.753,35.255,47.25,35.0 -15:50:33,432.1963,34.753,35.283,47.267,35.0 -15:50:33,432.2474,34.698,35.255,46.785,35.0 -15:50:33,432.2951,34.753,35.283,48.211,35.0 -15:50:33,432.3452,34.726,35.283,46.785,35.0 -15:50:33,432.3923,34.726,35.255,47.249,35.0 -15:50:33,432.4396,34.726,35.255,47.73,35.0 -15:50:33,432.4863,34.726,35.227,47.73,35.0 -15:50:33,432.5334,34.726,35.283,48.212,35.0 -15:50:33,432.5827,34.642,35.255,47.251,35.0 -15:50:33,432.6309,34.726,35.255,49.177,35.0 -15:50:33,432.6804,34.753,35.283,47.735,35.0 -15:50:33,432.7276,34.726,35.283,46.789,35.0 -15:50:33,432.7746,34.726,35.283,47.253,35.0 -15:50:34,432.8218,34.726,35.283,47.253,35.0 -15:50:34,432.8720,34.698,35.283,47.252,35.0 -15:50:34,432.9207,34.753,35.283,47.734,35.0 -15:50:34,432.9697,34.698,35.283,46.788,35.0 -15:50:34,433.0170,34.726,35.283,47.733,35.0 -15:50:34,433.0666,34.726,35.283,47.252,35.0 -15:50:34,433.1152,34.698,35.283,47.252,35.0 -15:50:34,433.1655,34.753,35.283,47.733,35.0 -15:50:34,433.2160,34.753,35.255,46.788,35.0 -15:50:34,433.2642,34.726,35.255,47.268,35.0 -15:50:34,433.3118,34.726,35.283,47.732,35.0 -15:50:34,433.3610,34.726,35.283,47.251,35.0 -15:50:34,433.4101,34.753,35.283,47.251,35.0 -15:50:34,433.4584,34.698,35.283,46.786,35.0 -15:50:34,433.5056,34.753,35.283,47.731,35.0 -15:50:34,433.5536,34.726,35.283,46.786,35.0 -15:50:34,433.6017,34.753,35.283,47.249,35.0 -15:50:34,433.6496,34.781,35.255,46.785,35.0 -15:50:34,433.6977,34.726,35.283,46.784,35.0 -15:50:34,433.7463,34.781,35.283,47.247,35.0 -15:50:34,433.7926,34.753,35.311,46.301,35.0 -15:50:35,433.8399,34.753,35.255,46.299,35.0 -15:50:35,433.8886,34.726,35.283,47.261,35.0 -15:50:35,433.9343,34.726,35.283,47.243,35.0 -15:50:35,433.9823,34.726,35.283,47.243,35.0 -15:50:35,434.0311,34.726,35.311,47.243,35.0 -15:50:35,434.0806,34.753,35.255,46.761,35.0 -15:50:35,434.1299,34.781,35.283,47.259,35.0 -15:50:35,434.1772,34.809,35.255,46.295,35.0 -15:50:35,434.2245,34.726,35.227,46.294,35.0 -15:50:35,434.2717,34.753,35.283,48.201,35.0 -15:50:35,434.3186,34.753,35.283,46.775,35.0 -15:50:35,434.3659,34.781,35.255,46.774,35.0 -15:50:35,434.4157,34.753,35.255,46.773,35.0 -15:50:35,434.4652,34.753,35.283,47.253,35.0 -15:50:35,434.5138,34.726,35.255,46.771,35.0 -15:50:35,434.5627,34.753,35.255,47.716,35.0 -15:50:35,434.6106,34.753,35.283,47.253,35.0 -15:50:35,434.6592,34.753,35.283,46.771,35.0 -15:50:35,434.7065,34.781,35.255,46.77,35.0 -15:50:35,434.7529,34.753,35.283,46.769,35.0 -15:50:35,434.8009,34.809,35.283,46.768,35.0 -15:50:36,434.8495,34.726,35.283,45.804,35.0 -15:50:36,434.8988,34.753,35.311,47.229,35.0 -15:50:36,434.9480,34.753,35.283,46.282,35.0 -15:50:36,434.9982,34.726,35.283,46.762,35.0 -15:50:36,435.0476,34.809,35.283,47.226,35.0 -15:50:36,435.0969,34.753,35.283,45.798,35.0 -15:50:36,435.1475,34.753,35.199,46.758,35.0 -15:50:36,435.1979,34.726,35.283,48.202,35.0 -15:50:36,435.2472,34.726,35.283,47.223,35.0 -15:50:36,435.2974,34.753,35.227,47.223,35.0 -15:50:36,435.3476,34.753,35.255,47.721,35.0 -15:50:36,435.4034,34.726,35.283,47.24,35.0 -15:50:36,435.4603,34.781,35.255,47.223,35.0 -15:50:36,435.5101,34.726,35.255,46.758,35.0 -15:50:36,435.5555,34.753,35.227,47.703,35.0 -15:50:36,435.6010,34.753,35.283,47.721,35.0 -15:50:36,435.6466,34.726,35.283,46.758,35.0 -15:50:36,435.7080,34.753,35.311,47.222,35.0 -15:50:36,435.7856,34.781,35.255,46.274,35.0 -15:50:37,435.8477,34.753,35.255,46.754,35.0 -15:50:37,435.9109,34.726,35.255,47.234,35.0 -15:50:37,435.9725,34.726,35.255,47.699,35.0 -15:50:37,436.0341,34.726,35.283,47.699,35.0 -15:50:37,436.0884,34.753,35.255,47.218,35.0 -15:50:37,436.1398,34.726,35.311,47.235,35.0 -15:50:37,436.1940,34.753,35.283,46.736,35.0 -15:50:37,436.2462,34.726,35.283,46.752,35.0 -15:50:37,436.3034,34.753,35.283,47.216,35.0 -15:50:37,436.3557,34.753,35.311,46.751,35.0 -15:50:37,436.4091,34.753,35.283,46.268,35.0 -15:50:37,436.4659,34.753,35.311,46.748,35.0 -15:50:37,436.5296,34.753,35.283,46.265,35.0 -15:50:37,436.5893,34.726,35.283,46.744,35.0 -15:50:37,436.6406,34.753,35.255,47.208,35.0 -15:50:37,436.6941,34.726,35.283,47.225,35.0 -15:50:37,436.7436,34.726,35.283,47.207,35.0 -15:50:37,436.7903,34.753,35.283,47.207,35.0 -15:50:38,436.8394,34.781,35.311,46.742,35.0 -15:50:38,436.8876,34.726,35.311,45.778,35.0 -15:50:38,436.9366,34.781,35.283,46.721,35.0 -15:50:38,436.9890,34.726,35.339,46.256,35.0 -15:50:38,437.0466,34.781,35.283,46.237,35.0 -15:50:38,437.0957,34.809,35.283,46.252,35.0 -15:50:38,437.1460,34.726,35.283,45.769,35.0 -15:50:38,437.1969,34.753,35.283,47.194,35.0 -15:50:38,437.2467,34.698,35.311,46.729,35.0 -15:50:38,437.2947,34.726,35.283,47.192,35.0 -15:50:38,437.3428,34.753,35.255,47.192,35.0 -15:50:38,437.3904,34.753,35.283,47.209,35.0 -15:50:38,437.4383,34.726,35.311,46.727,35.0 -15:50:38,437.4861,34.753,35.283,46.709,35.0 -15:50:38,437.5347,34.726,35.283,46.725,35.0 -15:50:38,437.5827,34.753,35.283,47.189,35.0 -15:50:38,437.6309,34.753,35.283,46.724,35.0 -15:50:38,437.6811,34.781,35.311,46.723,35.0 -15:50:38,437.7317,34.753,35.311,45.759,35.0 -15:50:38,437.7814,34.698,35.283,46.238,35.0 -15:50:39,437.8316,34.726,35.283,47.664,35.0 -15:50:39,437.8816,34.726,35.311,47.182,35.0 -15:50:39,437.9308,34.726,35.311,46.701,35.0 -15:50:39,437.9798,34.726,35.283,46.7,35.0 -15:50:39,438.0309,34.726,35.311,47.18,35.0 -15:50:39,438.0816,34.753,35.227,46.698,35.0 -15:50:39,438.1316,34.698,35.255,47.678,35.0 -15:50:39,438.1816,34.809,35.283,48.143,35.0 -15:50:39,438.2303,34.726,35.311,45.753,35.0 -15:50:39,438.2817,34.781,35.311,46.696,35.0 -15:50:39,438.3295,34.753,35.283,45.749,35.0 -15:50:39,438.3801,34.698,35.255,46.71,35.0 -15:50:39,438.4298,34.726,35.311,48.137,35.0 -15:50:39,438.4790,34.753,35.311,46.693,35.0 -15:50:39,438.5294,34.753,35.311,46.228,35.0 -15:50:39,438.5801,34.781,35.283,46.226,35.0 -15:50:39,438.6309,34.67,35.339,46.224,35.0 -15:50:39,438.6806,34.753,35.311,47.168,35.0 -15:50:39,438.7311,34.837,35.283,46.222,35.0 -15:50:39,438.7822,34.753,35.367,45.257,35.0 -15:50:40,438.8311,34.67,35.255,45.253,35.0 -15:50:40,438.8809,34.753,35.311,48.604,35.0 -15:50:40,438.9312,34.698,35.311,46.215,35.0 -15:50:40,438.9809,34.726,35.311,47.159,35.0 -15:50:40,439.0308,34.753,35.311,46.678,35.0 -15:50:40,439.0811,34.726,35.311,46.212,35.0 -15:50:40,439.1309,34.837,35.283,46.675,35.0 -15:50:40,439.1808,34.753,35.367,45.246,35.0 -15:50:40,439.2287,34.753,35.311,45.243,35.0 -15:50:40,439.2784,34.753,35.311,46.202,35.0 -15:50:40,439.3275,34.726,35.283,46.201,35.0 -15:50:40,439.3750,34.753,35.283,47.145,35.0 -15:50:40,439.4228,34.753,35.283,46.68,35.0 -15:50:40,439.4709,34.753,35.311,46.679,35.0 -15:50:40,439.5178,34.753,35.311,46.197,35.0 -15:50:40,439.5636,34.781,35.339,46.195,35.0 -15:50:40,439.6117,34.753,35.283,45.23,35.0 -15:50:40,439.6597,34.753,35.311,46.672,35.0 -15:50:40,439.7066,34.698,35.283,46.189,35.0 -15:50:40,439.7532,34.809,35.283,47.615,35.0 -15:50:40,439.7966,34.781,35.255,45.706,35.0 -15:50:41,439.8448,34.753,35.311,46.667,35.0 -15:50:41,439.8915,34.753,35.311,46.184,35.0 -15:50:41,439.9379,34.781,35.311,46.183,35.0 -15:50:41,439.9837,34.753,35.283,45.699,35.0 -15:50:41,440.0293,34.726,35.311,46.66,35.0 -15:50:41,440.0747,34.781,35.283,46.642,35.0 -15:50:41,440.1291,34.753,35.283,46.177,35.0 -15:50:41,440.1763,34.781,35.311,46.656,35.0 -15:50:41,440.2226,34.753,35.255,45.692,35.0 -15:50:41,440.2689,34.726,35.311,47.135,35.0 -15:50:41,440.3154,34.809,35.283,46.636,35.0 -15:50:41,440.3619,34.781,35.283,45.689,35.0 -15:50:41,440.4077,34.753,35.311,46.168,35.0 -15:50:41,440.4551,34.781,35.283,46.166,35.0 -15:50:41,440.5022,34.753,35.311,46.164,35.0 -15:50:41,440.5492,34.753,35.311,46.163,35.0 -15:50:41,440.5975,34.753,35.283,46.161,35.0 -15:50:41,440.6447,34.753,35.283,46.641,35.0 -15:50:41,440.6915,34.781,35.283,46.64,35.0 -15:50:41,440.7389,34.781,35.227,46.157,35.0 -15:50:41,440.7856,34.753,35.283,47.119,35.0 -15:50:42,440.8328,34.781,35.311,46.637,35.0 -15:50:42,440.8791,34.753,35.311,45.673,35.0 -15:50:42,440.9267,34.781,35.255,46.152,35.0 -15:50:42,440.9720,34.781,35.283,46.632,35.0 -15:50:42,441.0183,34.726,35.311,46.149,35.0 -15:50:42,441.0649,34.781,35.283,46.612,35.0 -15:50:42,441.1139,34.753,35.311,46.147,35.0 -15:50:42,441.1617,34.753,35.339,46.145,35.0 -15:50:42,441.2099,34.781,35.283,45.661,35.0 -15:50:42,441.2589,34.753,35.311,46.141,35.0 -15:50:42,441.3064,34.781,35.311,46.139,35.0 -15:50:42,441.3543,34.781,35.283,45.655,35.0 -15:50:42,441.4024,34.781,35.311,46.135,35.0 -15:50:42,441.4516,34.753,35.339,45.651,35.0 -15:50:42,441.5013,34.753,35.283,45.649,35.0 -15:50:42,441.5487,34.753,35.339,46.609,35.0 -15:50:42,441.5972,34.809,35.311,45.645,35.0 -15:50:42,441.6468,34.781,35.311,45.161,35.0 -15:50:42,441.6971,34.753,35.311,45.639,35.0 -15:50:42,441.7444,34.753,35.311,46.118,35.0 -15:50:42,441.7929,34.809,35.311,46.116,35.0 -15:50:43,441.8414,34.781,35.311,45.151,35.0 -15:50:43,441.8893,34.753,35.283,45.63,35.0 -15:50:43,441.9399,34.781,35.311,46.59,35.0 -15:50:43,441.9895,34.753,35.339,45.626,35.0 -15:50:43,442.0379,34.753,35.311,45.623,35.0 -15:50:43,442.0869,34.781,35.283,46.103,35.0 -15:50:43,442.1365,34.781,35.311,46.101,35.0 -15:50:43,442.1872,34.726,35.283,45.617,35.0 -15:50:43,442.2329,34.809,35.283,47.042,35.0 -15:50:43,442.2813,34.753,35.311,45.615,35.0 -15:50:43,442.3301,34.753,35.339,46.094,35.0 -15:50:43,442.3788,34.753,35.311,45.61,35.0 -15:50:43,442.4287,34.726,35.339,46.089,35.0 -15:50:43,442.4794,34.726,35.311,46.07,35.0 -15:50:43,442.5290,34.809,35.339,46.55,35.0 -15:50:43,442.5810,34.781,35.311,44.64,35.0 -15:50:43,442.6295,34.753,35.283,45.599,35.0 -15:50:43,442.6792,34.781,35.311,46.559,35.0 -15:50:43,442.7265,34.781,35.283,45.595,35.0 -15:50:43,442.7758,34.753,35.339,46.074,35.0 -15:50:44,442.8282,34.865,35.311,45.591,35.0 -15:50:44,442.8779,34.809,35.395,44.143,35.0 -15:50:44,442.9247,34.753,35.283,43.656,35.0 -15:50:44,442.9705,34.781,35.339,46.54,35.0 -15:50:44,443.0149,34.781,35.339,45.095,35.0 -15:50:44,443.0605,34.753,35.339,45.092,35.0 -15:50:44,443.1064,34.753,35.311,45.57,35.0 -15:50:44,443.1521,34.781,35.311,46.049,35.0 -15:50:44,443.1989,34.781,35.283,45.566,35.0 -15:50:44,443.2450,34.726,35.311,46.045,35.0 -15:50:44,443.2915,34.753,35.311,46.508,35.0 -15:50:44,443.3390,34.726,35.255,46.042,35.0 -15:50:44,443.3864,34.781,35.311,47.468,35.0 -15:50:44,443.4325,34.781,35.283,45.56,35.0 -15:50:44,443.4791,34.753,35.339,46.039,35.0 -15:50:44,443.5273,34.753,35.367,45.556,35.0 -15:50:44,443.5723,34.781,35.311,45.071,35.0 -15:50:44,443.6178,34.809,35.311,45.55,35.0 -15:50:44,443.6645,34.781,35.283,45.066,35.0 -15:50:44,443.7142,34.781,35.339,46.026,35.0 -15:50:44,443.7606,34.781,35.311,45.061,35.0 -15:50:44,443.8066,34.781,35.255,45.539,35.0 -15:50:45,443.8535,34.753,35.311,46.5,35.0 -15:50:45,443.8979,34.781,35.311,46.017,35.0 -15:50:45,443.9451,34.753,35.283,45.534,35.0 -15:50:45,443.9942,34.726,35.339,46.495,35.0 -15:50:45,444.0403,34.781,35.311,45.995,35.0 -15:50:45,444.0864,34.753,35.367,45.529,35.0 -15:50:45,444.1325,34.781,35.311,45.045,35.0 -15:50:45,444.1793,34.781,35.339,45.523,35.0 -15:50:45,444.2238,34.726,35.339,45.039,35.0 -15:50:45,444.2703,34.753,35.339,45.982,35.0 -15:50:45,444.3158,34.753,35.311,45.516,35.0 -15:50:45,444.3625,34.781,35.311,45.995,35.0 -15:50:45,444.4101,34.753,35.283,45.512,35.0 -15:50:45,444.4554,34.781,35.311,46.473,35.0 -15:50:45,444.5004,34.753,35.339,45.509,35.0 -15:50:45,444.5459,34.781,35.311,45.506,35.0 -15:50:45,444.5924,34.781,35.311,45.504,35.0 -15:50:45,444.6377,34.781,35.339,45.501,35.0 -15:50:45,444.6843,34.809,35.283,45.017,35.0 -15:50:45,444.7308,34.781,35.311,45.496,35.0 -15:50:45,444.7767,34.809,35.339,45.493,35.0 -15:50:46,444.8232,34.753,35.311,44.528,35.0 -15:50:46,444.8697,34.753,35.367,45.969,35.0 -15:50:46,444.9155,34.753,35.283,45.004,35.0 -15:50:46,444.9614,34.781,35.339,46.445,35.0 -15:50:46,445.0084,34.753,35.311,45.0,35.0 -15:50:46,445.0544,34.781,35.311,45.96,35.0 -15:50:46,445.0993,34.781,35.311,45.476,35.0 -15:50:46,445.1459,34.753,35.283,45.474,35.0 -15:50:46,445.1924,34.753,35.311,46.435,35.0 -15:50:46,445.2363,34.753,35.339,45.952,35.0 -15:50:46,445.2814,34.781,35.311,45.469,35.0 -15:50:46,445.3268,34.781,35.311,45.467,35.0 -15:50:46,445.3741,34.781,35.339,45.464,35.0 -15:50:46,445.4204,34.753,35.339,44.98,35.0 -15:50:46,445.4665,34.781,35.311,45.459,35.0 -15:50:46,445.5135,34.781,35.311,45.456,35.0 -15:50:46,445.5602,34.753,35.395,45.454,35.0 -15:50:46,445.6058,34.781,35.311,44.488,35.0 -15:50:46,445.6519,34.781,35.311,45.447,35.0 -15:50:46,445.6972,34.781,35.339,45.445,35.0 -15:50:46,445.7435,34.753,35.311,44.961,35.0 -15:50:46,445.7913,34.837,35.339,45.921,35.0 -15:50:47,445.8375,34.753,35.339,43.993,35.0 -15:50:47,445.8838,34.781,35.339,45.433,35.0 -15:50:47,445.9303,34.753,35.339,44.949,35.0 -15:50:47,445.9772,34.753,35.311,45.427,35.0 -15:50:47,446.0226,34.809,35.339,45.907,35.0 -15:50:47,446.0686,34.809,35.311,44.46,35.0 -15:50:47,446.1147,34.781,35.255,44.938,35.0 -15:50:47,446.1603,34.781,35.311,46.379,35.0 -15:50:47,446.2057,34.781,35.311,45.415,35.0 -15:50:47,446.2517,34.781,35.339,45.413,35.0 -15:50:47,446.2980,34.781,35.339,44.929,35.0 -15:50:47,446.3443,34.809,35.339,44.926,35.0 -15:50:47,446.3908,34.781,35.339,44.441,35.0 -15:50:47,446.4366,34.781,35.283,44.919,35.0 -15:50:47,446.4869,34.809,35.311,45.879,35.0 -15:50:47,446.5336,34.753,35.339,44.914,35.0 -15:50:47,446.5801,34.809,35.339,45.392,35.0 -15:50:47,446.6278,34.809,35.283,44.426,35.0 -15:50:47,446.6743,34.726,35.311,45.385,35.0 -15:50:47,446.7215,34.781,35.311,46.329,35.0 -15:50:47,446.7689,34.781,35.311,45.382,35.0 -15:50:48,446.8157,34.809,35.395,45.38,35.0 -15:50:48,446.8636,34.781,35.367,43.451,35.0 -15:50:48,446.9098,34.809,35.311,44.408,35.0 -15:50:48,446.9573,34.753,35.311,44.886,35.0 -15:50:48,447.0038,34.781,35.283,45.846,35.0 -15:50:48,447.0513,34.781,35.311,45.844,35.0 -15:50:48,447.0981,34.781,35.311,45.361,35.0 -15:50:48,447.1450,34.809,35.339,45.358,35.0 -15:50:48,447.1934,34.865,35.339,44.393,35.0 -15:50:48,447.2396,34.809,35.339,43.426,35.0 -15:50:48,447.2855,34.809,35.311,44.383,35.0 -15:50:48,447.3315,34.753,35.311,44.861,35.0 -15:50:48,447.3778,34.781,35.311,45.821,35.0 -15:50:48,447.4246,34.781,35.339,45.338,35.0 -15:50:48,447.4705,34.726,35.311,44.854,35.0 -15:50:48,447.5165,34.781,35.339,46.278,35.0 -15:50:48,447.5632,34.781,35.339,44.85,35.0 -15:50:48,447.6096,34.781,35.311,44.846,35.0 -15:50:48,447.6562,34.809,35.339,45.325,35.0 -15:50:48,447.7035,34.837,35.311,44.359,35.0 -15:50:48,447.7517,34.809,35.339,44.355,35.0 -15:50:48,447.7988,34.753,35.339,44.351,35.0 -15:50:49,447.8463,34.781,35.311,45.31,35.0 -15:50:49,447.8948,34.781,35.339,45.308,35.0 -15:50:49,447.9446,34.781,35.311,44.824,35.0 -15:50:49,447.9921,34.809,35.339,45.302,35.0 -15:50:49,448.0404,34.753,35.311,44.336,35.0 -15:50:49,448.0886,34.809,35.311,45.777,35.0 -15:50:49,448.1376,34.781,35.311,44.812,35.0 -15:50:49,448.1877,34.809,35.367,45.29,35.0 -15:50:49,448.2375,34.809,35.283,43.843,35.0 -15:50:49,448.2864,34.753,35.339,45.282,35.0 -15:50:49,448.3360,34.781,35.311,45.28,35.0 -15:50:49,448.3838,34.753,35.311,45.277,35.0 -15:50:49,448.4333,34.865,35.339,45.756,35.0 -15:50:49,448.4823,34.753,35.339,43.346,35.0 -15:50:49,448.5317,34.809,35.311,45.267,35.0 -15:50:49,448.5808,34.753,35.339,44.783,35.0 -15:50:49,448.6290,34.781,35.367,45.261,35.0 -15:50:49,448.6776,34.781,35.367,44.295,35.0 -15:50:49,448.7275,34.809,35.311,44.291,35.0 -15:50:49,448.7775,34.781,35.339,44.769,35.0 -15:50:50,448.8242,34.781,35.339,44.765,35.0 -15:50:50,448.8724,34.809,35.311,44.762,35.0 -15:50:50,448.9215,34.781,35.311,44.759,35.0 -15:50:50,448.9696,34.865,35.339,45.237,35.0 -15:50:50,449.0179,34.809,35.339,43.308,35.0 -15:50:50,449.0670,34.809,35.283,44.266,35.0 -15:50:50,449.1169,34.781,35.339,45.225,35.0 -15:50:50,449.1652,34.837,35.311,44.741,35.0 -15:50:50,449.2132,34.837,35.311,44.256,35.0 -15:50:50,449.2624,34.781,35.339,44.251,35.0 -15:50:50,449.3097,34.726,35.339,44.729,35.0 -15:50:50,449.3559,34.781,35.339,45.672,35.0 -15:50:50,449.4016,34.809,35.339,44.724,35.0 -15:50:50,449.4494,34.781,35.339,44.239,35.0 -15:50:50,449.4969,34.809,35.311,44.717,35.0 -15:50:50,449.5454,34.781,35.367,44.714,35.0 -15:50:50,449.5928,34.781,35.339,44.229,35.0 -15:50:50,449.6395,34.781,35.339,44.706,35.0 -15:50:50,449.6873,34.781,35.339,44.703,35.0 -15:50:50,449.7378,34.809,35.367,44.7,35.0 -15:50:50,449.7870,34.809,35.311,43.733,35.0 -15:50:51,449.8360,34.781,35.339,44.691,35.0 -15:50:51,449.8836,34.781,35.339,44.688,35.0 -15:50:51,449.9318,34.781,35.395,44.685,35.0 -15:50:51,449.9783,34.753,35.367,43.718,35.0 -15:50:51,450.0258,34.809,35.339,44.677,35.0 -15:50:51,450.0725,34.809,35.311,44.192,35.0 -15:50:51,450.1202,34.781,35.339,44.67,35.0 -15:50:51,450.1686,34.781,35.367,44.666,35.0 -15:50:51,450.2166,34.809,35.311,44.181,35.0 -15:50:51,450.2644,34.837,35.227,44.659,35.0 -15:50:51,450.3125,34.809,35.339,45.619,35.0 -15:50:51,450.3590,34.781,35.311,44.172,35.0 -15:50:51,450.4099,34.781,35.339,45.132,35.0 -15:50:51,450.4611,34.809,35.339,44.647,35.0 -15:50:51,450.5105,34.781,35.339,44.162,35.0 -15:50:51,450.5581,34.726,35.339,44.639,35.0 -15:50:51,450.6051,34.753,35.339,45.582,35.0 -15:50:51,450.6523,34.837,35.367,45.116,35.0 -15:50:51,450.7068,34.781,35.423,43.187,35.0 -15:50:51,450.7788,34.781,35.339,43.18,35.0 -15:50:52,450.8431,34.781,35.311,44.618,35.0 -15:50:52,450.9033,34.809,35.339,45.096,35.0 -15:50:52,450.9616,34.753,35.395,44.129,35.0 -15:50:52,451.0192,34.781,35.339,44.124,35.0 -15:50:52,451.0739,34.809,35.339,44.601,35.0 -15:50:52,451.1364,34.809,35.339,44.115,35.0 -15:50:52,451.1932,34.781,35.367,44.11,35.0 -15:50:52,451.2503,34.809,35.339,44.105,35.0 -15:50:52,451.3041,34.837,35.367,44.1,35.0 -15:50:52,451.3610,34.753,35.311,43.133,35.0 -15:50:52,451.4157,34.809,35.311,45.535,35.0 -15:50:52,451.4683,34.809,35.367,44.569,35.0 -15:50:52,451.5199,34.781,35.339,43.602,35.0 -15:50:52,451.5705,34.809,35.311,44.56,35.0 -15:50:52,451.6204,34.837,35.339,44.557,35.0 -15:50:52,451.6764,34.753,35.339,43.59,35.0 -15:50:52,451.7305,34.753,35.367,45.03,35.0 -15:50:52,451.7803,34.781,35.311,44.545,35.0 -15:50:53,451.8286,34.781,35.367,45.024,35.0 -15:50:53,451.8785,34.809,35.311,44.058,35.0 -15:50:53,451.9266,34.781,35.311,44.535,35.0 -15:50:53,451.9764,34.781,35.311,45.013,35.0 -15:50:53,452.0393,34.781,35.339,45.011,35.0 -15:50:53,452.0878,34.809,35.339,44.526,35.0 -15:50:53,452.1354,34.781,35.339,44.041,35.0 -15:50:53,452.1826,34.809,35.283,44.518,35.0 -15:50:53,452.2282,34.781,35.339,44.997,35.0 -15:50:53,452.2757,34.781,35.339,44.513,35.0 -15:50:53,452.3214,34.781,35.339,44.51,35.0 -15:50:53,452.3697,34.809,35.339,44.506,35.0 -15:50:53,452.4197,34.781,35.311,44.021,35.0 -15:50:53,452.4695,34.781,35.339,44.981,35.0 -15:50:53,452.5195,34.809,35.339,44.496,35.0 -15:50:53,452.5669,34.837,35.367,44.011,35.0 -15:50:53,452.6147,34.809,35.283,43.044,35.0 -15:50:53,452.6646,34.753,35.339,44.965,35.0 -15:50:53,452.7152,34.753,35.367,44.962,35.0 -15:50:53,452.7651,34.781,35.339,44.478,35.0 -15:50:54,452.8132,34.809,35.339,44.475,35.0 -15:50:54,452.8616,34.753,35.283,43.99,35.0 -15:50:54,452.9102,34.809,35.339,45.912,35.0 -15:50:54,452.9616,34.809,35.311,43.985,35.0 -15:50:54,453.0091,34.753,35.311,44.462,35.0 -15:50:54,453.0556,34.809,35.423,45.422,35.0 -15:50:54,453.1050,34.781,35.339,42.531,35.0 -15:50:54,453.1544,34.781,35.339,44.451,35.0 -15:50:54,453.2021,34.837,35.367,44.447,35.0 -15:50:54,453.2491,34.809,35.339,42.999,35.0 -15:50:54,453.3002,34.809,35.311,43.957,35.0 -15:50:54,453.3481,34.753,35.311,44.434,35.0 -15:50:54,453.3978,34.809,35.367,45.394,35.0 -15:50:54,453.4465,34.726,35.283,43.466,35.0 -15:50:54,453.4939,34.753,35.339,46.333,35.0 -15:50:54,453.5430,34.781,35.339,44.905,35.0 -15:50:54,453.5905,34.809,35.339,44.421,35.0 -15:50:54,453.6389,34.781,35.339,43.936,35.0 -15:50:54,453.6889,34.781,35.339,44.414,35.0 -15:50:54,453.7372,34.809,35.311,44.411,35.0 -15:50:54,453.7865,34.753,35.339,44.407,35.0 -15:50:55,453.8358,34.726,35.339,44.885,35.0 -15:50:55,453.8845,34.781,35.311,45.347,35.0 -15:50:55,453.9346,34.809,35.339,44.881,35.0 -15:50:55,453.9836,34.809,35.339,43.915,35.0 -15:50:55,454.0344,34.781,35.339,43.911,35.0 -15:50:55,454.0809,34.809,35.339,44.388,35.0 -15:50:55,454.1295,34.809,35.311,43.904,35.0 -15:50:55,454.1766,34.781,35.339,44.381,35.0 -15:50:55,454.2267,34.781,35.311,44.378,35.0 -15:50:55,454.2767,34.809,35.339,44.856,35.0 -15:50:55,454.3278,34.809,35.339,43.89,35.0 -15:50:55,454.3778,34.809,35.339,43.886,35.0 -15:50:55,454.4276,34.781,35.339,43.882,35.0 -15:50:55,454.4771,34.809,35.367,44.359,35.0 -15:50:55,454.5275,34.753,35.367,43.392,35.0 -15:50:55,454.5763,34.809,35.395,44.351,35.0 -15:50:55,454.6257,34.753,35.283,42.903,35.0 -15:50:55,454.6768,34.753,35.339,45.786,35.0 -15:50:55,454.7273,34.781,35.339,44.822,35.0 -15:50:55,454.7773,34.809,35.311,44.338,35.0 -15:50:56,454.8262,34.809,35.339,44.334,35.0 -15:50:56,454.8759,34.781,35.395,43.849,35.0 -15:50:56,454.9243,34.809,35.339,43.364,35.0 -15:50:56,454.9730,34.809,35.339,43.84,35.0 -15:50:56,455.0201,34.809,35.339,43.836,35.0 -15:50:56,455.0691,34.781,35.367,43.832,35.0 -15:50:56,455.1239,34.781,35.339,43.828,35.0 -15:50:56,455.1778,34.809,35.339,44.305,35.0 -15:50:56,455.2276,34.809,35.339,43.82,35.0 -15:50:56,455.2755,34.781,35.339,43.816,35.0 -15:50:56,455.3250,34.781,35.395,44.293,35.0 -15:50:56,455.3725,34.781,35.339,43.327,35.0 -15:50:56,455.4203,34.781,35.367,44.285,35.0 -15:50:56,455.4689,34.809,35.339,43.8,35.0 -15:50:56,455.5183,34.753,35.339,43.796,35.0 -15:50:56,455.5682,34.809,35.339,44.755,35.0 -15:50:56,455.6179,34.753,35.339,43.789,35.0 -15:50:56,455.6668,34.781,35.367,44.748,35.0 -15:50:56,455.7158,34.809,35.367,43.782,35.0 -15:50:56,455.7661,34.781,35.367,43.297,35.0 -15:50:57,455.8137,34.809,35.367,43.773,35.0 -15:50:57,455.8627,34.781,35.367,43.288,35.0 -15:50:57,455.9125,34.781,35.339,43.764,35.0 -15:50:57,455.9608,34.781,35.311,44.242,35.0 -15:50:57,456.0089,34.809,35.339,44.72,35.0 -15:50:57,456.0597,34.809,35.311,43.754,35.0 -15:50:57,456.1111,34.781,35.339,44.232,35.0 -15:50:57,456.1609,34.809,35.311,44.228,35.0 -15:50:57,456.2093,34.809,35.367,44.225,35.0 -15:50:57,456.2604,34.809,35.311,43.258,35.0 -15:50:57,456.3095,34.809,35.339,44.216,35.0 -15:50:57,456.3592,34.809,35.339,43.731,35.0 -15:50:57,456.4091,34.837,35.311,43.727,35.0 -15:50:57,456.4592,34.781,35.367,43.723,35.0 -15:50:57,456.5099,34.809,35.339,43.719,35.0 -15:50:57,456.5592,34.753,35.311,43.714,35.0 -15:50:57,456.6093,34.781,35.339,45.155,35.0 -15:50:57,456.6608,34.809,35.339,44.19,35.0 -15:50:57,456.7114,34.809,35.339,43.705,35.0 -15:50:57,456.7613,34.809,35.367,43.701,35.0 -15:50:57,456.8079,34.809,35.339,43.215,35.0 -15:50:58,456.8561,34.809,35.227,43.692,35.0 -15:50:58,456.9038,34.781,35.367,45.614,35.0 -15:50:58,456.9530,34.837,35.339,43.687,35.0 -15:50:58,457.0004,34.781,35.339,43.201,35.0 -15:50:58,457.0464,34.837,35.423,44.159,35.0 -15:50:58,457.0955,34.809,35.367,41.748,35.0 -15:50:58,457.1443,34.781,35.339,43.186,35.0 -15:50:58,457.1935,34.781,35.339,44.144,35.0 -15:50:58,457.2421,34.781,35.339,44.141,35.0 -15:50:58,457.2919,34.781,35.367,44.137,35.0 -15:50:58,457.3405,34.781,35.339,43.652,35.0 -15:50:58,457.3875,34.809,35.339,44.13,35.0 -15:50:58,457.4341,34.809,35.339,43.645,35.0 -15:50:58,457.4802,34.781,35.339,43.641,35.0 -15:50:58,457.5265,34.781,35.339,44.119,35.0 -15:50:58,457.5741,34.809,35.367,44.116,35.0 -15:50:58,457.6214,34.809,35.339,43.149,35.0 -15:50:58,457.6681,34.781,35.367,43.626,35.0 -15:50:58,457.7152,34.809,35.395,43.622,35.0 -15:50:58,457.7624,34.837,35.339,42.655,35.0 -15:50:59,457.8098,34.781,35.339,43.131,35.0 -15:50:59,457.8578,34.809,35.339,44.089,35.0 -15:50:59,457.9049,34.809,35.339,43.605,35.0 -15:50:59,457.9509,34.809,35.339,43.601,35.0 -15:50:59,457.9971,34.781,35.367,43.597,35.0 -15:50:59,458.0437,34.809,35.339,43.593,35.0 -15:50:59,458.0912,34.781,35.339,43.589,35.0 -15:50:59,458.1387,34.809,35.339,44.066,35.0 -15:50:59,458.1854,34.809,35.339,43.582,35.0 -15:50:59,458.2306,34.837,35.367,43.578,35.0 -15:50:59,458.2768,34.809,35.339,42.611,35.0 -15:50:59,458.3242,34.809,35.283,43.568,35.0 -15:50:59,458.3705,34.726,35.367,44.528,35.0 -15:50:59,458.4167,34.809,35.283,44.508,35.0 -15:50:59,458.4625,34.809,35.367,44.523,35.0 -15:50:59,458.5099,34.781,35.339,43.076,35.0 -15:50:59,458.5569,34.809,35.339,44.034,35.0 -15:50:59,458.6026,34.809,35.367,43.549,35.0 -15:50:59,458.6484,34.837,35.339,43.064,35.0 -15:50:59,458.6959,34.809,35.339,43.059,35.0 -15:50:59,458.7433,34.809,35.395,43.536,35.0 -15:50:59,458.7909,34.837,35.339,42.569,35.0 -15:51:00,458.8378,34.809,35.311,43.045,35.0 -15:51:00,458.8843,34.781,35.339,44.003,35.0 -15:51:00,458.9294,34.892,35.367,44.0,35.0 -15:51:00,458.9767,34.781,35.339,41.606,35.0 -15:51:00,459.0252,34.809,35.339,43.99,35.0 -15:51:00,459.0737,34.781,35.367,43.505,35.0 -15:51:00,459.1200,34.781,35.367,43.501,35.0 -15:51:00,459.1652,34.837,35.367,43.497,35.0 -15:51:00,459.2097,34.781,35.339,42.53,35.0 -15:51:00,459.2582,34.781,35.339,43.97,35.0 -15:51:00,459.3051,34.809,35.367,43.966,35.0 -15:51:00,459.3512,34.809,35.311,43.0,35.0 -15:51:00,459.3978,34.837,35.367,43.959,35.0 -15:51:00,459.4457,34.837,35.339,42.511,35.0 -15:51:00,459.4925,34.781,35.339,42.987,35.0 -15:51:00,459.5382,34.781,35.367,43.945,35.0 -15:51:00,459.5840,34.809,35.339,43.46,35.0 -15:51:00,459.6303,34.809,35.339,43.456,35.0 -15:51:00,459.6772,34.781,35.339,43.453,35.0 -15:51:00,459.7249,34.809,35.339,43.93,35.0 -15:51:00,459.7725,34.781,35.367,43.445,35.0 -15:51:01,459.8181,34.781,35.367,43.441,35.0 -15:51:01,459.8646,34.753,35.367,43.438,35.0 -15:51:01,459.9134,34.809,35.339,43.915,35.0 -15:51:01,459.9599,34.781,35.339,43.43,35.0 -15:51:01,460.0078,34.865,35.339,43.908,35.0 -15:51:01,460.0543,34.809,35.367,42.46,35.0 -15:51:01,460.1006,34.809,35.339,42.936,35.0 -15:51:01,460.1474,34.781,35.367,43.413,35.0 -15:51:01,460.1943,34.781,35.367,43.409,35.0 -15:51:01,460.2408,34.781,35.339,43.405,35.0 -15:51:01,460.2863,34.781,35.339,43.883,35.0 -15:51:01,460.3326,34.809,35.367,43.879,35.0 -15:51:01,460.3786,34.781,35.367,42.913,35.0 -15:51:01,460.4249,34.865,35.311,43.39,35.0 -15:51:01,460.4717,34.781,35.367,42.905,35.0 -15:51:01,460.5175,34.837,35.339,43.381,35.0 -15:51:01,460.5636,34.753,35.339,42.896,35.0 -15:51:01,460.6101,34.781,35.339,44.336,35.0 -15:51:01,460.6575,34.809,35.339,43.852,35.0 -15:51:01,460.7079,34.809,35.339,43.367,35.0 -15:51:01,460.7566,34.781,35.367,43.363,35.0 -15:51:01,460.8047,34.837,35.339,43.359,35.0 -15:51:02,460.8521,34.781,35.367,42.873,35.0 -15:51:02,460.8994,34.809,35.339,43.35,35.0 -15:51:02,460.9464,34.809,35.339,43.346,35.0 -15:51:02,460.9934,34.892,35.367,43.342,35.0 -15:51:02,461.0395,34.809,35.339,41.429,35.0 -15:51:02,461.0858,34.753,35.339,43.331,35.0 -15:51:02,461.1352,34.781,35.339,44.29,35.0 -15:51:02,461.1835,34.809,35.367,43.806,35.0 -15:51:02,461.2327,34.809,35.339,42.84,35.0 -15:51:02,461.2825,34.809,35.395,43.316,35.0 -15:51:02,461.3328,34.781,35.395,42.349,35.0 -15:51:02,461.3814,34.837,35.367,42.825,35.0 -15:51:02,461.4300,34.809,35.339,42.338,35.0 -15:51:02,461.4792,34.781,35.339,43.296,35.0 -15:51:02,461.5284,34.781,35.367,43.773,35.0 -15:51:02,461.5773,34.781,35.367,43.288,35.0 -15:51:02,461.6272,34.809,35.339,43.284,35.0 -15:51:02,461.6772,34.781,35.339,43.28,35.0 -15:51:02,461.7251,34.809,35.367,43.757,35.0 -15:51:02,461.7746,34.781,35.339,42.791,35.0 -15:51:03,461.8248,34.809,35.339,43.749,35.0 -15:51:03,461.8736,34.809,35.367,43.264,35.0 -15:51:03,461.9202,34.809,35.339,42.778,35.0 -15:51:03,461.9673,34.809,35.339,43.255,35.0 -15:51:03,462.0136,34.809,35.367,43.251,35.0 -15:51:03,462.0596,34.781,35.339,42.766,35.0 -15:51:03,462.1059,34.726,35.339,43.724,35.0 -15:51:03,462.1522,34.809,35.339,44.667,35.0 -15:51:03,462.2009,34.809,35.423,43.238,35.0 -15:51:03,462.2470,34.837,35.339,41.789,35.0 -15:51:03,462.2933,34.809,35.339,42.746,35.0 -15:51:03,462.3404,34.809,35.339,43.223,35.0 -15:51:03,462.3873,34.809,35.367,43.219,35.0 -15:51:03,462.4326,34.809,35.367,42.733,35.0 -15:51:03,462.4780,34.837,35.339,42.729,35.0 -15:51:03,462.5256,34.809,35.367,42.724,35.0 -15:51:03,462.5761,34.781,35.367,42.719,35.0 -15:51:03,462.6243,34.781,35.367,43.196,35.0 -15:51:03,462.6706,34.781,35.367,43.192,35.0 -15:51:03,462.7197,34.809,35.339,43.188,35.0 -15:51:03,462.7686,34.809,35.367,43.184,35.0 -15:51:04,462.8153,34.809,35.423,42.698,35.0 -15:51:04,462.8598,34.837,35.395,41.73,35.0 -15:51:04,462.9062,34.781,35.367,41.724,35.0 -15:51:04,462.9521,34.809,35.367,43.163,35.0 -15:51:04,462.9976,34.809,35.367,42.677,35.0 -15:51:04,463.0451,34.781,35.395,42.673,35.0 -15:51:04,463.0917,34.781,35.339,42.668,35.0 -15:51:04,463.1397,34.809,35.339,43.627,35.0 -15:51:04,463.1892,34.781,35.339,43.142,35.0 -15:51:04,463.2347,34.809,35.367,43.619,35.0 -15:51:04,463.2821,34.809,35.311,42.653,35.0 -15:51:04,463.3293,34.781,35.339,43.611,35.0 -15:51:04,463.3755,34.809,35.311,43.608,35.0 -15:51:04,463.4239,34.837,35.339,43.605,35.0 -15:51:04,463.4721,34.892,35.339,42.638,35.0 -15:51:04,463.5196,34.781,35.339,41.688,35.0 -15:51:04,463.5662,34.809,35.367,43.59,35.0 -15:51:04,463.6134,34.781,35.339,42.624,35.0 -15:51:04,463.6602,34.753,35.311,43.582,35.0 -15:51:04,463.7083,34.781,35.367,44.542,35.0 -15:51:04,463.7591,34.781,35.367,43.096,35.0 -15:51:04,463.8038,34.837,35.367,43.092,35.0 -15:51:05,463.8498,34.809,35.311,42.125,35.0 -15:51:05,463.8956,34.781,35.367,43.564,35.0 -15:51:05,463.9436,34.837,35.339,43.079,35.0 -15:51:05,463.9908,34.809,35.339,42.594,35.0 -15:51:05,464.0396,34.809,35.367,43.071,35.0 -15:51:05,464.0856,34.809,35.283,42.585,35.0 -15:51:05,464.1326,34.781,35.367,44.025,35.0 -15:51:05,464.1796,34.781,35.395,43.059,35.0 -15:51:05,464.2286,34.781,35.367,42.574,35.0 -15:51:05,464.2752,34.67,35.367,43.05,35.0 -15:51:05,464.3236,34.809,35.367,44.956,35.0 -15:51:05,464.3722,34.837,35.339,42.564,35.0 -15:51:05,464.4218,34.809,35.367,42.559,35.0 -15:51:05,464.4695,34.781,35.339,42.554,35.0 -15:51:05,464.5170,34.837,35.367,43.512,35.0 -15:51:05,464.5639,34.809,35.339,42.064,35.0 -15:51:05,464.6107,34.809,35.339,43.022,35.0 -15:51:05,464.6591,34.781,35.395,43.018,35.0 -15:51:05,464.7071,34.837,35.367,42.532,35.0 -15:51:05,464.7562,34.781,35.367,42.046,35.0 -15:51:05,464.8035,34.837,35.367,43.003,35.0 -15:51:06,464.8505,34.837,35.339,42.036,35.0 -15:51:06,464.8964,34.781,35.311,42.512,35.0 -15:51:06,464.9445,34.809,35.367,43.952,35.0 -15:51:06,464.9927,34.781,35.367,42.505,35.0 -15:51:06,465.0399,34.781,35.367,42.982,35.0 -15:51:06,465.0867,34.865,35.311,42.978,35.0 -15:51:06,465.1333,34.781,35.367,42.492,35.0 -15:51:06,465.1798,34.781,35.367,42.969,35.0 -15:51:06,465.2282,34.781,35.367,42.965,35.0 -15:51:06,465.2752,34.809,35.339,42.961,35.0 -15:51:06,465.3207,34.865,35.339,42.957,35.0 -15:51:06,465.3658,34.809,35.367,41.99,35.0 -15:51:06,465.4299,34.809,35.367,42.466,35.0 -15:51:06,465.4833,34.837,35.339,42.46,35.0 -15:51:06,465.5352,34.809,35.367,42.455,35.0 -15:51:06,465.5886,34.809,35.367,42.449,35.0 -15:51:06,465.6411,34.837,35.395,42.444,35.0 -15:51:06,465.6934,34.837,35.367,41.475,35.0 -15:51:06,465.7743,34.781,35.367,41.95,35.0 -15:51:07,465.8536,34.809,35.395,42.904,35.0 -15:51:07,465.9146,34.809,35.367,41.934,35.0 -15:51:07,465.9845,34.837,35.339,42.408,35.0 -15:51:07,466.0467,34.837,35.311,42.402,35.0 -15:51:07,466.1077,34.809,35.395,42.877,35.0 -15:51:07,466.1699,34.865,35.395,41.909,35.0 -15:51:07,466.2331,34.781,35.311,40.938,35.0 -15:51:07,466.2926,34.781,35.339,43.819,35.0 -15:51:07,466.3577,34.837,35.339,43.335,35.0 -15:51:07,466.4236,34.809,35.339,42.366,35.0 -15:51:07,466.4859,34.809,35.367,42.842,35.0 -15:51:07,466.5447,34.809,35.367,42.355,35.0 -15:51:07,466.6048,34.809,35.311,42.349,35.0 -15:51:07,466.6568,34.837,35.367,43.306,35.0 -15:51:07,466.7069,34.809,35.339,41.858,35.0 -15:51:07,466.7614,34.837,35.423,42.815,35.0 -15:51:08,466.8132,34.809,35.367,40.884,35.0 -15:51:08,466.8599,34.809,35.311,42.321,35.0 -15:51:08,466.9090,34.809,35.367,43.279,35.0 -15:51:08,466.9573,34.837,35.339,42.313,35.0 -15:51:08,467.0068,34.809,35.367,42.308,35.0 -15:51:08,467.0543,34.809,35.367,42.303,35.0 -15:51:08,467.1186,34.809,35.367,42.298,35.0 -15:51:08,467.1718,34.809,35.367,42.292,35.0 -15:51:08,467.2232,34.837,35.367,42.286,35.0 -15:51:08,467.2725,34.781,35.423,41.8,35.0 -15:51:08,467.3226,34.837,35.367,41.794,35.0 -15:51:08,467.3739,34.837,35.339,41.788,35.0 -15:51:08,467.4227,34.809,35.367,42.264,35.0 -15:51:08,467.4735,34.781,35.395,42.259,35.0 -15:51:08,467.5237,34.809,35.311,42.254,35.0 -15:51:08,467.5745,34.809,35.367,43.212,35.0 -15:51:08,467.6231,34.809,35.367,42.245,35.0 -15:51:08,467.6726,34.781,35.395,42.24,35.0 -15:51:08,467.7222,34.781,35.367,42.235,35.0 -15:51:08,467.7768,34.809,35.367,42.712,35.0 -15:51:09,467.8241,34.837,35.367,42.226,35.0 -15:51:09,467.8709,34.809,35.367,41.739,35.0 -15:51:09,467.9188,34.809,35.395,42.215,35.0 -15:51:09,467.9660,34.809,35.367,41.729,35.0 -15:51:09,468.0136,34.837,35.367,42.205,35.0 -15:51:09,468.0593,34.809,35.367,41.719,35.0 -15:51:09,468.1065,34.809,35.367,42.195,35.0 -15:51:09,468.1525,34.781,35.395,42.19,35.0 -15:51:09,468.1981,34.809,35.367,42.186,35.0 -15:51:09,468.2456,34.837,35.339,42.181,35.0 -15:51:09,468.2929,34.837,35.339,42.176,35.0 -15:51:09,468.3397,34.781,35.367,42.171,35.0 -15:51:09,468.3851,34.726,35.367,42.648,35.0 -15:51:09,468.4314,34.753,35.367,43.59,35.0 -15:51:09,468.4777,34.892,35.367,43.124,35.0 -15:51:09,468.5258,34.837,35.367,40.73,35.0 -15:51:09,468.5725,34.809,35.339,41.669,35.0 -15:51:09,468.6213,34.809,35.367,42.626,35.0 -15:51:09,468.6674,34.781,35.339,42.141,35.0 -15:51:09,468.7152,34.781,35.367,43.099,35.0 -15:51:09,468.7627,34.809,35.367,42.614,35.0 -15:51:10,468.8098,34.809,35.367,42.129,35.0 -15:51:10,468.8567,34.781,35.339,42.124,35.0 -15:51:10,468.9039,34.809,35.395,43.082,35.0 -15:51:10,468.9513,34.837,35.367,41.634,35.0 -15:51:10,468.9986,34.809,35.311,41.629,35.0 -15:51:10,469.0440,34.809,35.367,43.068,35.0 -15:51:10,469.0898,34.781,35.367,42.102,35.0 -15:51:10,469.1388,34.809,35.339,42.579,35.0 -15:51:10,469.1856,34.809,35.367,42.575,35.0 -15:51:10,469.2323,34.837,35.339,42.089,35.0 -15:51:10,469.2793,34.809,35.367,42.084,35.0 -15:51:10,469.3276,34.865,35.367,42.08,35.0 -15:51:10,469.3755,34.809,35.339,41.112,35.0 -15:51:10,469.4217,34.781,35.367,42.55,35.0 -15:51:10,469.4686,34.809,35.451,42.546,35.0 -15:51:10,469.5139,34.781,35.367,40.616,35.0 -15:51:10,469.5607,34.781,35.339,42.535,35.0 -15:51:10,469.6078,34.809,35.311,43.013,35.0 -15:51:10,469.6547,34.837,35.339,43.01,35.0 -15:51:10,469.7020,34.809,35.339,42.043,35.0 -15:51:10,469.7496,34.809,35.367,42.52,35.0 -15:51:10,469.7982,34.781,35.339,42.035,35.0 -15:51:11,469.8521,34.781,35.311,42.993,35.0 -15:51:11,469.9018,34.781,35.367,43.471,35.0 -15:51:11,469.9519,34.809,35.367,42.505,35.0 -15:51:11,470.0001,34.809,35.367,42.019,35.0 -15:51:11,470.0503,34.809,35.367,42.014,35.0 -15:51:11,470.0993,34.781,35.339,42.009,35.0 -15:51:11,470.1583,34.837,35.367,42.967,35.0 -15:51:11,470.2097,34.837,35.395,41.518,35.0 -15:51:11,470.2585,34.781,35.367,41.031,35.0 -15:51:11,470.3082,34.837,35.367,42.469,35.0 -15:51:11,470.3579,34.809,35.367,41.502,35.0 -15:51:11,470.4066,34.809,35.367,41.978,35.0 -15:51:11,470.4567,34.809,35.367,41.973,35.0 -15:51:11,470.5069,34.753,35.367,41.968,35.0 -15:51:11,470.5567,34.809,35.339,42.926,35.0 -15:51:11,470.6076,34.837,35.367,42.441,35.0 -15:51:11,470.6572,34.837,35.367,41.473,35.0 -15:51:11,470.7065,34.809,35.339,41.467,35.0 -15:51:11,470.7553,34.781,35.367,42.425,35.0 -15:51:11,470.8040,34.809,35.367,42.421,35.0 -15:51:12,470.8548,34.837,35.395,41.935,35.0 -15:51:12,470.9049,34.837,35.367,40.967,35.0 -15:51:12,470.9557,34.781,35.395,41.442,35.0 -15:51:12,471.0057,34.809,35.367,41.917,35.0 -15:51:12,471.0562,34.809,35.339,41.912,35.0 -15:51:12,471.1071,34.781,35.367,42.389,35.0 -15:51:12,471.1576,34.809,35.367,42.385,35.0 -15:51:12,471.2063,34.781,35.311,41.899,35.0 -15:51:12,471.2562,34.781,35.367,43.339,35.0 -15:51:12,471.3061,34.781,35.395,42.373,35.0 -15:51:12,471.3558,34.809,35.367,41.887,35.0 -15:51:12,471.4063,34.809,35.367,41.882,35.0 -15:51:12,471.4571,34.781,35.395,41.877,35.0 -15:51:12,471.5062,34.809,35.395,41.872,35.0 -15:51:12,471.5556,34.809,35.367,41.385,35.0 -15:51:12,471.6053,34.781,35.423,41.861,35.0 -15:51:12,471.6542,34.809,35.423,41.374,35.0 -15:51:12,471.7013,34.809,35.367,40.887,35.0 -15:51:12,471.7495,34.809,35.339,41.844,35.0 -15:51:12,471.7991,34.809,35.339,42.321,35.0 -15:51:13,471.8465,34.809,35.395,42.317,35.0 -15:51:13,471.8975,34.781,35.367,41.349,35.0 -15:51:13,471.9465,34.865,35.367,42.307,35.0 -15:51:13,471.9955,34.809,35.367,40.858,35.0 -15:51:13,472.0448,34.837,35.367,41.815,35.0 -15:51:13,472.0948,34.865,35.367,41.328,35.0 -15:51:13,472.1443,34.837,35.339,40.841,35.0 -15:51:13,472.1946,34.781,35.367,41.797,35.0 -15:51:13,472.2438,34.809,35.395,42.274,35.0 -15:51:13,472.2925,34.781,35.367,41.306,35.0 -15:51:13,472.3416,34.781,35.367,42.264,35.0 -15:51:13,472.3906,34.837,35.367,42.26,35.0 -15:51:13,472.4398,34.781,35.367,41.292,35.0 -15:51:13,472.4896,34.837,35.311,42.25,35.0 -15:51:13,472.5392,34.809,35.367,42.246,35.0 -15:51:13,472.5909,34.837,35.395,41.76,35.0 -15:51:13,472.6399,34.809,35.367,40.791,35.0 -15:51:13,472.6874,34.781,35.367,41.748,35.0 -15:51:13,472.7391,34.837,35.367,42.225,35.0 -15:51:13,472.7892,34.837,35.367,41.257,35.0 -15:51:14,472.8399,34.837,35.339,41.251,35.0 -15:51:14,472.8883,34.809,35.367,41.727,35.0 -15:51:14,472.9413,34.809,35.367,41.722,35.0 -15:51:14,472.9912,34.837,35.367,41.717,35.0 -15:51:14,473.0421,34.809,35.339,41.23,35.0 -15:51:14,473.0916,34.753,35.451,42.188,35.0 -15:51:14,473.1415,34.865,35.367,41.22,35.0 -15:51:14,473.1918,34.809,35.367,40.733,35.0 -15:51:14,473.2406,34.781,35.423,41.689,35.0 -15:51:14,473.2897,34.809,35.367,41.203,35.0 -15:51:14,473.3378,34.809,35.367,41.679,35.0 -15:51:14,473.3875,34.809,35.367,41.674,35.0 -15:51:14,473.4346,34.781,35.339,41.669,35.0 -15:51:14,473.4829,34.809,35.367,42.627,35.0 -15:51:14,473.5324,34.753,35.367,41.661,35.0 -15:51:14,473.5828,34.837,35.367,42.619,35.0 -15:51:14,473.6319,34.865,35.339,41.171,35.0 -15:51:14,473.6827,34.781,35.367,41.165,35.0 -15:51:14,473.7324,34.781,35.367,42.122,35.0 -15:51:14,473.7840,34.809,35.367,42.118,35.0 -15:51:15,473.8316,34.865,35.367,41.632,35.0 -15:51:15,473.8812,34.809,35.367,40.664,35.0 -15:51:15,473.9321,34.781,35.367,41.621,35.0 -15:51:15,473.9819,34.809,35.367,42.097,35.0 -15:51:15,474.0304,34.809,35.367,41.612,35.0 -15:51:15,474.0809,34.809,35.339,41.607,35.0 -15:51:15,474.1318,34.837,35.367,42.083,35.0 -15:51:15,474.1812,34.781,35.367,41.116,35.0 -15:51:15,474.2305,34.809,35.367,42.073,35.0 -15:51:15,474.2806,34.781,35.367,41.587,35.0 -15:51:15,474.3314,34.781,35.367,42.064,35.0 -15:51:15,474.3825,34.837,35.339,42.06,35.0 -15:51:15,474.4320,34.809,35.367,41.574,35.0 -15:51:15,474.4819,34.781,35.339,41.569,35.0 -15:51:15,474.5320,34.837,35.367,42.527,35.0 -15:51:15,474.5817,34.837,35.367,41.079,35.0 -15:51:15,474.6317,34.809,35.395,41.073,35.0 -15:51:15,474.6814,34.809,35.367,41.067,35.0 -15:51:15,474.7327,34.781,35.367,41.543,35.0 -15:51:15,474.7826,34.892,35.367,42.019,35.0 -15:51:16,474.8317,34.809,35.395,40.106,35.0 -15:51:16,474.8830,34.809,35.367,41.045,35.0 -15:51:16,474.9322,34.781,35.339,41.52,35.0 -15:51:16,474.9820,34.809,35.367,42.479,35.0 -15:51:16,475.0315,34.809,35.311,41.512,35.0 -15:51:16,475.0817,34.809,35.367,42.47,35.0 -15:51:16,475.1318,34.809,35.367,41.503,35.0 -15:51:16,475.1825,34.809,35.367,41.498,35.0 -15:51:16,475.2324,34.781,35.367,41.493,35.0 -15:51:16,475.2820,34.809,35.395,41.97,35.0 -15:51:16,475.3327,34.809,35.339,41.002,35.0 -15:51:16,475.3820,34.809,35.367,41.96,35.0 -15:51:16,475.4318,34.781,35.395,41.474,35.0 -15:51:16,475.4822,34.809,35.395,41.469,35.0 -15:51:16,475.5316,34.753,35.339,40.982,35.0 -15:51:16,475.5817,34.781,35.367,42.903,35.0 -15:51:16,475.6360,34.809,35.367,41.937,35.0 -15:51:16,475.6833,34.809,35.367,41.451,35.0 -15:51:16,475.7330,34.809,35.395,41.446,35.0 -15:51:16,475.7834,34.809,35.367,40.96,35.0 -15:51:17,475.8335,34.837,35.339,41.435,35.0 -15:51:17,475.8827,34.809,35.367,41.43,35.0 -15:51:17,475.9318,34.753,35.367,41.425,35.0 -15:51:17,475.9826,34.781,35.423,42.384,35.0 -15:51:17,476.0323,34.809,35.395,40.935,35.0 -15:51:17,476.0828,34.809,35.367,40.93,35.0 -15:51:17,476.1349,34.781,35.367,41.405,35.0 -15:51:17,476.1872,34.837,35.367,41.882,35.0 -15:51:17,476.2371,34.781,35.367,40.914,35.0 -15:51:17,476.2856,34.726,35.339,41.871,35.0 -15:51:17,476.3331,34.753,35.367,43.295,35.0 -15:51:17,476.3799,34.837,35.395,42.347,35.0 -15:51:17,476.4289,34.753,35.367,40.418,35.0 -15:51:17,476.4750,34.809,35.339,42.338,35.0 -15:51:17,476.5227,34.809,35.367,41.853,35.0 -15:51:17,476.5691,34.837,35.395,41.367,35.0 -15:51:17,476.6159,34.809,35.339,40.4,35.0 -15:51:17,476.6644,34.781,35.367,41.838,35.0 -15:51:17,476.7119,34.809,35.339,41.834,35.0 -15:51:17,476.7585,34.809,35.367,41.83,35.0 -15:51:17,476.8055,34.809,35.339,41.344,35.0 -15:51:18,476.8526,34.837,35.339,41.821,35.0 -15:51:18,476.8994,34.865,35.339,41.336,35.0 -15:51:18,476.9467,34.837,35.423,40.849,35.0 -15:51:18,476.9948,34.809,35.395,39.881,35.0 -15:51:18,477.0419,34.809,35.395,40.837,35.0 -15:51:18,477.0886,34.809,35.367,40.831,35.0 -15:51:18,477.1367,34.865,35.395,41.307,35.0 -15:51:18,477.1861,34.781,35.367,39.858,35.0 -15:51:18,477.2354,34.837,35.311,41.777,35.0 -15:51:18,477.3018,34.809,35.367,41.773,35.0 -15:51:18,477.3577,34.809,35.367,41.285,35.0 -15:51:18,477.4094,34.781,35.367,41.28,35.0 -15:51:18,477.4607,34.781,35.423,41.756,35.0 -15:51:18,477.5101,34.837,35.367,40.788,35.0 -15:51:18,477.5592,34.837,35.367,40.783,35.0 -15:51:18,477.6075,34.781,35.339,40.777,35.0 -15:51:18,477.6581,34.809,35.367,42.216,35.0 -15:51:18,477.7073,34.809,35.395,41.249,35.0 -15:51:18,477.7564,34.809,35.367,40.763,35.0 -15:51:18,477.8067,34.809,35.367,41.239,35.0 -15:51:19,477.8557,34.837,35.395,41.234,35.0 -15:51:19,477.9071,34.809,35.339,40.265,35.0 -15:51:19,477.9561,34.809,35.395,41.704,35.0 -15:51:19,478.0068,34.781,35.395,40.736,35.0 -15:51:19,478.0566,34.781,35.367,41.212,35.0 -15:51:19,478.1068,34.781,35.367,41.689,35.0 -15:51:19,478.1566,34.809,35.367,41.684,35.0 -15:51:19,478.2076,34.781,35.367,41.199,35.0 -15:51:19,478.2576,34.781,35.367,41.675,35.0 -15:51:19,478.3071,34.781,35.367,41.671,35.0 -15:51:19,478.3563,34.781,35.367,41.667,35.0 -15:51:19,478.4066,34.809,35.367,41.662,35.0 -15:51:19,478.4575,34.809,35.367,41.177,35.0 -15:51:19,478.5066,34.809,35.339,41.172,35.0 -15:51:19,478.5569,34.809,35.367,41.648,35.0 -15:51:19,478.6077,34.809,35.367,41.162,35.0 -15:51:19,478.6557,34.837,35.339,41.157,35.0 -15:51:19,478.7047,34.837,35.367,41.152,35.0 -15:51:19,478.7549,34.753,35.395,40.666,35.0 -15:51:19,478.8057,34.809,35.451,41.623,35.0 -15:51:20,478.8555,34.809,35.367,39.692,35.0 -15:51:20,478.9048,34.809,35.367,41.13,35.0 -15:51:20,478.9556,34.781,35.395,41.125,35.0 -15:51:20,479.0048,34.837,35.367,41.12,35.0 -15:51:20,479.0572,34.781,35.395,40.633,35.0 -15:51:20,479.1083,34.809,35.367,41.109,35.0 -15:51:20,479.1578,34.781,35.367,41.104,35.0 -15:51:20,479.2083,34.781,35.395,41.58,35.0 -15:51:20,479.2582,34.781,35.367,41.094,35.0 -15:51:20,479.3093,34.809,35.367,41.571,35.0 -15:51:20,479.3586,34.837,35.367,41.085,35.0 -15:51:20,479.4090,34.837,35.339,40.598,35.0 -15:51:20,479.4593,34.809,35.367,41.074,35.0 -15:51:20,479.5108,34.781,35.367,41.069,35.0 -15:51:20,479.5613,34.809,35.367,41.546,35.0 -15:51:20,479.6100,34.837,35.367,41.06,35.0 -15:51:20,479.6598,34.809,35.367,40.573,35.0 -15:51:20,479.7105,34.781,35.367,41.049,35.0 -15:51:20,479.7598,34.781,35.395,41.526,35.0 -15:51:21,479.8110,34.809,35.367,41.04,35.0 -15:51:21,479.8610,34.809,35.339,41.035,35.0 -15:51:21,479.9116,34.781,35.367,41.511,35.0 -15:51:21,479.9618,34.753,35.367,41.507,35.0 -15:51:21,480.0113,34.837,35.339,41.984,35.0 -15:51:21,480.0614,34.809,35.367,41.018,35.0 -15:51:21,480.1117,34.809,35.367,41.013,35.0 -15:51:21,480.1606,34.809,35.311,41.008,35.0 -15:51:21,480.2117,34.809,35.367,41.966,35.0 -15:51:21,480.2625,34.781,35.367,40.999,35.0 -15:51:21,480.3130,34.781,35.367,41.476,35.0 -15:51:21,480.3655,34.809,35.367,41.471,35.0 -15:51:21,480.4173,34.781,35.367,40.985,35.0 -15:51:21,480.4870,34.837,35.367,41.462,35.0 -15:51:21,480.5387,34.781,35.367,40.492,35.0 -15:51:21,480.5886,34.781,35.367,41.449,35.0 -15:51:21,480.6394,34.809,35.367,41.445,35.0 -15:51:21,480.6913,34.809,35.367,40.959,35.0 -15:51:21,480.7770,34.809,35.367,40.954,35.0 -15:51:22,480.8456,34.781,35.423,40.944,35.0 -15:51:22,480.9027,34.781,35.423,40.456,35.0 -15:51:22,480.9760,34.726,35.395,40.45,35.0 -15:51:22,481.0301,34.809,35.339,41.87,35.0 -15:51:22,481.0844,34.837,35.395,41.402,35.0 -15:51:22,481.1387,34.781,35.395,39.952,35.0 -15:51:22,481.1928,34.809,35.367,40.908,35.0 -15:51:22,481.2526,34.809,35.367,40.903,35.0 -15:51:22,481.3071,34.809,35.367,40.897,35.0 -15:51:22,481.3609,34.809,35.339,40.891,35.0 -15:51:22,481.4176,34.837,35.367,41.367,35.0 -15:51:22,481.4737,34.781,35.367,40.4,35.0 -15:51:22,481.5345,34.781,35.367,41.357,35.0 -15:51:22,481.5886,34.837,35.367,41.351,35.0 -15:51:22,481.6420,34.809,35.339,40.383,35.0 -15:51:22,481.6930,34.809,35.367,41.341,35.0 -15:51:22,481.7441,34.781,35.367,40.855,35.0 -15:51:22,481.7945,34.726,35.367,41.331,35.0 -15:51:23,481.8446,34.809,35.367,42.273,35.0 -15:51:23,481.8942,34.837,35.367,40.843,35.0 -15:51:23,481.9442,34.809,35.367,40.356,35.0 -15:51:23,482.0062,34.837,35.367,40.832,35.0 -15:51:23,482.0562,34.809,35.395,40.344,35.0 -15:51:23,482.1058,34.781,35.339,40.338,35.0 -15:51:23,482.1556,34.837,35.367,41.777,35.0 -15:51:23,482.2058,34.809,35.367,40.329,35.0 -15:51:23,482.2542,34.809,35.367,40.805,35.0 -15:51:23,482.3016,34.837,35.367,40.8,35.0 -15:51:23,482.3495,34.809,35.367,40.313,35.0 -15:51:23,482.3954,34.781,35.339,40.789,35.0 -15:51:23,482.4447,34.781,35.339,41.748,35.0 -15:51:23,482.4930,34.67,35.395,41.745,35.0 -15:51:23,482.5403,34.809,35.395,42.687,35.0 -15:51:23,482.5883,34.781,35.367,40.295,35.0 -15:51:23,482.6355,34.781,35.367,41.252,35.0 -15:51:23,482.6877,34.809,35.367,41.248,35.0 -15:51:23,482.7363,34.809,35.367,40.762,35.0 -15:51:23,482.7860,34.837,35.367,40.757,35.0 -15:51:24,482.8324,34.781,35.367,40.271,35.0 -15:51:24,482.8785,34.781,35.395,41.229,35.0 -15:51:24,482.9268,34.837,35.339,40.743,35.0 -15:51:24,482.9728,34.837,35.367,40.738,35.0 -15:51:24,483.0196,34.837,35.367,40.252,35.0 -15:51:24,483.0678,34.809,35.367,40.247,35.0 -15:51:24,483.1137,34.753,35.339,40.723,35.0 -15:51:24,483.1612,34.809,35.367,42.163,35.0 -15:51:24,483.2077,34.781,35.367,40.715,35.0 -15:51:24,483.2549,34.809,35.395,41.192,35.0 -15:51:24,483.3027,34.892,35.339,40.225,35.0 -15:51:24,483.3504,34.837,35.367,39.755,35.0 -15:51:24,483.3977,34.781,35.367,40.213,35.0 -15:51:24,483.4465,34.781,35.367,41.171,35.0 -15:51:24,483.4950,34.753,35.395,41.167,35.0 -15:51:24,483.5418,34.837,35.367,41.163,35.0 -15:51:24,483.5898,34.781,35.367,40.196,35.0 -15:51:24,483.6377,34.809,35.395,41.153,35.0 -15:51:24,483.6854,34.809,35.367,40.186,35.0 -15:51:24,483.7347,34.865,35.367,40.662,35.0 -15:51:24,483.7826,34.781,35.311,39.694,35.0 -15:51:25,483.8326,34.781,35.395,42.095,35.0 -15:51:25,483.8805,34.837,35.367,40.648,35.0 -15:51:25,483.9294,34.809,35.367,40.161,35.0 -15:51:25,483.9765,34.837,35.367,40.637,35.0 -15:51:25,484.0226,34.809,35.339,40.151,35.0 -15:51:25,484.0697,34.809,35.367,41.109,35.0 -15:51:25,484.1178,34.809,35.367,40.623,35.0 -15:51:25,484.1658,34.809,35.367,40.618,35.0 -15:51:25,484.2111,34.809,35.367,40.614,35.0 -15:51:25,484.2585,34.809,35.395,40.609,35.0 -15:51:25,484.3058,34.809,35.423,40.123,35.0 -15:51:25,484.3543,34.809,35.367,39.636,35.0 -15:51:25,484.4017,34.809,35.395,40.592,35.0 -15:51:25,484.4482,34.865,35.367,40.106,35.0 -15:51:25,484.4949,34.809,35.367,39.619,35.0 -15:51:25,484.5408,34.781,35.367,40.576,35.0 -15:51:25,484.5865,34.753,35.339,41.053,35.0 -15:51:25,484.6338,34.781,35.423,42.012,35.0 -15:51:25,484.6824,34.809,35.367,40.083,35.0 -15:51:25,484.7293,34.809,35.367,40.559,35.0 -15:51:25,484.7767,34.809,35.339,40.555,35.0 -15:51:26,484.8231,34.781,35.395,41.031,35.0 -15:51:26,484.8704,34.809,35.367,40.546,35.0 -15:51:26,484.9171,34.753,35.367,40.541,35.0 -15:51:26,484.9638,34.809,35.395,41.5,35.0 -15:51:26,485.0115,34.837,35.311,40.052,35.0 -15:51:26,485.0588,34.809,35.367,41.009,35.0 -15:51:26,485.1054,34.837,35.395,40.524,35.0 -15:51:26,485.1589,34.781,35.451,39.556,35.0 -15:51:26,485.2067,34.781,35.367,39.549,35.0 -15:51:26,485.2555,34.837,35.367,40.987,35.0 -15:51:26,485.3028,34.809,35.395,40.02,35.0 -15:51:26,485.3525,34.809,35.339,40.014,35.0 -15:51:26,485.4007,34.809,35.367,40.972,35.0 -15:51:26,485.4489,34.837,35.367,40.486,35.0 -15:51:26,485.4948,34.809,35.367,40.0,35.0 -15:51:26,485.5418,34.781,35.367,40.476,35.0 -15:51:26,485.5910,34.809,35.367,40.953,35.0 -15:51:26,485.6409,34.809,35.367,40.467,35.0 -15:51:26,485.6881,34.809,35.339,40.462,35.0 -15:51:26,485.7352,34.781,35.395,40.939,35.0 -15:51:26,485.7826,34.781,35.367,40.453,35.0 -15:51:27,485.8293,34.781,35.339,40.93,35.0 -15:51:27,485.8781,34.809,35.367,41.408,35.0 -15:51:27,485.9264,34.837,35.367,40.441,35.0 -15:51:27,485.9739,34.781,35.367,39.955,35.0 -15:51:27,486.0213,34.781,35.367,40.912,35.0 -15:51:27,486.0691,34.837,35.423,40.908,35.0 -15:51:27,486.1166,34.781,35.339,38.978,35.0 -15:51:27,486.1644,34.781,35.451,41.379,35.0 -15:51:27,486.2122,34.781,35.395,39.449,35.0 -15:51:27,486.2599,34.809,35.367,40.406,35.0 -15:51:27,486.3053,34.809,35.339,40.401,35.0 -15:51:27,486.3525,34.809,35.367,40.878,35.0 -15:51:27,486.4017,34.753,35.367,40.393,35.0 -15:51:27,486.4514,34.837,35.367,41.351,35.0 -15:51:27,486.4987,34.809,35.367,39.903,35.0 -15:51:27,486.5465,34.781,35.367,40.379,35.0 -15:51:27,486.5938,34.781,35.367,40.856,35.0 -15:51:27,486.6409,34.781,35.367,40.852,35.0 -15:51:27,486.6886,34.809,35.367,40.848,35.0 -15:51:27,486.7379,34.809,35.423,40.362,35.0 -15:51:27,486.7895,34.781,35.395,39.394,35.0 -15:51:28,486.8391,34.809,35.423,40.35,35.0 -15:51:28,486.8893,34.865,35.283,39.382,35.0 -15:51:28,486.9401,34.809,35.367,40.82,35.0 -15:51:28,486.9900,34.809,35.367,40.334,35.0 -15:51:28,487.0405,34.837,35.367,40.329,35.0 -15:51:28,487.0918,34.892,35.367,39.843,35.0 -15:51:28,487.1422,34.809,35.423,38.891,35.0 -15:51:28,487.1935,34.809,35.367,39.347,35.0 -15:51:28,487.2444,34.837,35.311,40.304,35.0 -15:51:28,487.2943,34.837,35.367,40.78,35.0 -15:51:28,487.3451,34.865,35.367,39.813,35.0 -15:51:28,487.3945,34.781,35.367,39.325,35.0 -15:51:28,487.4447,34.837,35.367,40.764,35.0 -15:51:28,487.4947,34.726,35.367,39.796,35.0 -15:51:28,487.5455,34.809,35.367,41.7,35.0 -15:51:28,487.5967,34.809,35.367,40.269,35.0 -15:51:28,487.6473,34.837,35.395,40.264,35.0 -15:51:28,487.6988,34.781,35.339,39.296,35.0 -15:51:28,487.7482,34.809,35.423,41.216,35.0 -15:51:28,487.7983,34.809,35.367,39.286,35.0 -15:51:29,487.8492,34.809,35.367,40.242,35.0 -15:51:29,487.8999,34.809,35.367,40.237,35.0 -15:51:29,487.9525,34.753,35.423,40.232,35.0 -15:51:29,488.0006,34.809,35.367,40.227,35.0 -15:51:29,488.0497,34.781,35.367,40.222,35.0 -15:51:29,488.0990,34.809,35.339,40.699,35.0 -15:51:29,488.1497,34.809,35.367,40.695,35.0 -15:51:29,488.2034,34.809,35.339,40.209,35.0 -15:51:29,488.2538,34.809,35.395,40.685,35.0 -15:51:29,488.3046,34.753,35.367,39.717,35.0 -15:51:29,488.3555,34.837,35.367,41.156,35.0 -15:51:29,488.4068,34.809,35.367,39.708,35.0 -15:51:29,488.4572,34.781,35.367,40.184,35.0 -15:51:29,488.5079,34.809,35.339,40.66,35.0 -15:51:29,488.5594,34.809,35.367,40.656,35.0 -15:51:29,488.6107,34.753,35.339,40.17,35.0 -15:51:29,488.6623,34.809,35.367,41.61,35.0 -15:51:29,488.7142,34.809,35.395,40.162,35.0 -15:51:29,488.7651,34.809,35.367,39.675,35.0 -15:51:30,488.8144,34.809,35.367,40.151,35.0 -15:51:30,488.8634,34.809,35.367,40.146,35.0 -15:51:30,488.9138,34.781,35.339,40.141,35.0 -15:51:30,488.9653,34.809,35.367,41.099,35.0 -15:51:30,489.0156,34.809,35.367,40.132,35.0 -15:51:30,489.0668,34.781,35.367,40.127,35.0 -15:51:30,489.1180,34.809,35.395,40.604,35.0 -15:51:30,489.1705,34.809,35.367,39.636,35.0 -15:51:30,489.2207,34.781,35.395,40.112,35.0 -15:51:30,489.2707,34.781,35.367,40.107,35.0 -15:51:30,489.3226,34.809,35.367,40.583,35.0 -15:51:30,489.3747,34.809,35.367,40.097,35.0 -15:51:30,489.4262,34.809,35.283,40.092,35.0 -15:51:30,489.4772,34.781,35.367,41.532,35.0 -15:51:30,489.5266,34.781,35.423,40.566,35.0 -15:51:30,489.5774,34.781,35.367,39.598,35.0 -15:51:30,489.6277,34.781,35.367,40.556,35.0 -15:51:30,489.6792,34.781,35.395,40.551,35.0 -15:51:30,489.7287,34.892,35.339,40.066,35.0 -15:51:30,489.7794,34.753,35.395,39.115,35.0 -15:51:31,489.8297,34.809,35.367,40.536,35.0 -15:51:31,489.8789,34.809,35.311,40.05,35.0 -15:51:31,489.9308,34.781,35.395,41.008,35.0 -15:51:31,489.9798,34.809,35.367,40.041,35.0 -15:51:31,490.0277,34.781,35.367,40.036,35.0 -15:51:31,490.0778,34.781,35.367,40.513,35.0 -15:51:31,490.1296,34.809,35.367,40.509,35.0 -15:51:31,490.1822,34.809,35.339,40.023,35.0 -15:51:31,490.2322,34.781,35.339,40.499,35.0 -15:51:31,490.2837,34.809,35.367,40.977,35.0 -15:51:31,490.3345,34.809,35.367,40.01,35.0 -15:51:31,490.3857,34.865,35.367,40.005,35.0 -15:51:31,490.4350,34.809,35.367,39.036,35.0 -15:51:31,490.4854,34.837,35.367,39.993,35.0 -15:51:31,490.5347,34.781,35.367,39.506,35.0 -15:51:31,490.5855,34.837,35.367,40.464,35.0 -15:51:31,490.6337,34.781,35.367,39.496,35.0 -15:51:31,490.6819,34.837,35.367,40.454,35.0 -15:51:31,490.7287,34.809,35.395,39.486,35.0 -15:51:31,490.7768,34.809,35.395,39.481,35.0 -15:51:32,490.8238,34.753,35.367,39.475,35.0 -15:51:32,490.8716,34.809,35.367,40.915,35.0 -15:51:32,490.9247,34.781,35.395,39.948,35.0 -15:51:32,490.9722,34.809,35.367,39.943,35.0 -15:51:32,491.0207,34.809,35.367,39.938,35.0 -15:51:32,491.0689,34.753,35.367,39.933,35.0 -15:51:32,491.1167,34.781,35.367,40.891,35.0 -15:51:32,491.1652,34.781,35.339,40.407,35.0 -15:51:32,491.2131,34.837,35.367,40.884,35.0 -15:51:32,491.2616,34.837,35.339,39.436,35.0 -15:51:32,491.3098,34.809,35.367,39.912,35.0 -15:51:32,491.3574,34.781,35.367,39.907,35.0 -15:51:32,491.4027,34.809,35.367,40.384,35.0 -15:51:32,491.4495,34.865,35.367,39.899,35.0 -15:51:32,491.5007,34.726,35.395,38.931,35.0 -15:51:32,491.5498,34.809,35.367,40.833,35.0 -15:51:32,491.5971,34.809,35.339,39.884,35.0 -15:51:32,491.6432,34.781,35.339,40.361,35.0 -15:51:32,491.6914,34.809,35.395,40.838,35.0 -15:51:32,491.7396,34.781,35.395,39.39,35.0 -15:51:32,491.7885,34.809,35.395,39.866,35.0 -15:51:33,491.8402,34.781,35.395,39.38,35.0 -15:51:33,491.8892,34.781,35.367,39.855,35.0 -15:51:33,491.9377,34.809,35.367,40.332,35.0 -15:51:33,491.9854,34.781,35.367,39.846,35.0 -15:51:33,492.0336,34.809,35.339,40.323,35.0 -15:51:33,492.0839,34.781,35.423,40.319,35.0 -15:51:33,492.1301,34.781,35.367,39.352,35.0 -15:51:33,492.1822,34.781,35.367,40.309,35.0 -15:51:33,492.2293,34.781,35.367,40.305,35.0 -15:51:33,492.2782,34.809,35.395,40.301,35.0 -15:51:33,492.3269,34.781,35.367,39.334,35.0 -15:51:33,492.3754,34.726,35.395,40.291,35.0 -15:51:33,492.4229,34.837,35.367,40.751,35.0 -15:51:33,492.4716,34.781,35.367,39.321,35.0 -15:51:33,492.5196,34.809,35.367,40.278,35.0 -15:51:33,492.5653,34.781,35.395,39.792,35.0 -15:51:33,492.6129,34.809,35.395,39.788,35.0 -15:51:33,492.6607,34.809,35.423,39.302,35.0 -15:51:33,492.7102,34.837,35.367,38.814,35.0 -15:51:33,492.7580,34.865,35.367,39.289,35.0 -15:51:33,492.8068,34.781,35.367,38.802,35.0 -15:51:34,492.8543,34.837,35.339,40.241,35.0 -15:51:34,492.9027,34.809,35.367,39.755,35.0 -15:51:34,492.9500,34.781,35.367,39.75,35.0 -15:51:34,492.9990,34.809,35.423,40.227,35.0 -15:51:34,493.0450,34.809,35.367,38.778,35.0 -15:51:34,493.0927,34.809,35.367,39.735,35.0 -15:51:34,493.1389,34.781,35.367,39.73,35.0 -15:51:34,493.1876,34.781,35.311,40.207,35.0 -15:51:34,493.2359,34.726,35.367,41.166,35.0 -15:51:34,493.2846,34.781,35.339,41.146,35.0 -15:51:34,493.3329,34.781,35.367,40.679,35.0 -15:51:34,493.3796,34.809,35.339,40.195,35.0 -15:51:34,493.4260,34.781,35.367,40.191,35.0 -15:51:34,493.4764,34.781,35.367,40.187,35.0 -15:51:34,493.5243,34.781,35.367,40.182,35.0 -15:51:34,493.5710,34.781,35.339,40.178,35.0 -15:51:34,493.6190,34.809,35.367,40.656,35.0 -15:51:34,493.6677,34.781,35.339,39.69,35.0 -15:51:34,493.7147,34.781,35.451,40.648,35.0 -15:51:34,493.7632,34.809,35.339,38.718,35.0 -15:51:35,493.8094,34.809,35.367,40.157,35.0 -15:51:35,493.8572,34.837,35.367,39.671,35.0 -15:51:35,493.9036,34.809,35.367,39.185,35.0 -15:51:35,493.9514,34.809,35.339,39.661,35.0 -15:51:35,494.0001,34.809,35.395,40.138,35.0 -15:51:35,494.0486,34.809,35.367,39.17,35.0 -15:51:35,494.0961,34.781,35.367,39.646,35.0 -15:51:35,494.1446,34.809,35.339,40.123,35.0 -15:51:35,494.1929,34.781,35.367,40.119,35.0 -15:51:35,494.2402,34.726,35.339,40.115,35.0 -15:51:35,494.2887,34.726,35.367,41.539,35.0 -15:51:35,494.3358,34.781,35.395,41.055,35.0 -15:51:35,494.3836,34.781,35.367,39.625,35.0 -15:51:35,494.4333,34.781,35.367,40.102,35.0 -15:51:35,494.4812,34.781,35.367,40.098,35.0 -15:51:35,494.5268,34.809,35.339,40.094,35.0 -15:51:35,494.5747,34.837,35.339,40.09,35.0 -15:51:35,494.6222,34.809,35.339,39.604,35.0 -15:51:35,494.6697,34.781,35.367,40.081,35.0 -15:51:35,494.7170,34.781,35.367,40.077,35.0 -15:51:35,494.7673,34.837,35.367,40.073,35.0 -15:51:36,494.8155,34.781,35.395,39.105,35.0 -15:51:36,494.8634,34.67,35.395,39.581,35.0 -15:51:36,494.9118,34.781,35.367,41.486,35.0 -15:51:36,494.9603,34.809,35.367,40.056,35.0 -15:51:36,495.0087,34.809,35.339,39.571,35.0 -15:51:36,495.0550,34.809,35.423,40.047,35.0 -15:51:36,495.1035,34.809,35.367,38.599,35.0 -15:51:36,495.1520,34.809,35.395,39.556,35.0 -15:51:36,495.2007,34.781,35.367,39.069,35.0 -15:51:36,495.2508,34.809,35.367,40.027,35.0 -15:51:36,495.2986,34.809,35.395,39.541,35.0 -15:51:36,495.3473,34.809,35.367,39.054,35.0 -15:51:36,495.3964,34.809,35.367,39.53,35.0 -15:51:36,495.4574,34.837,35.367,39.525,35.0 -15:51:36,495.5146,34.781,35.367,39.037,35.0 -15:51:36,495.5616,34.781,35.339,39.994,35.0 -15:51:36,495.6105,34.809,35.367,40.472,35.0 -15:51:36,495.6586,34.781,35.367,39.505,35.0 -15:51:36,495.7081,34.781,35.367,39.982,35.0 -15:51:36,495.7741,34.753,35.367,39.978,35.0 -15:51:37,495.8513,34.809,35.367,40.454,35.0 -15:51:37,495.9146,34.809,35.311,39.485,35.0 -15:51:37,495.9752,34.781,35.367,40.442,35.0 -15:51:37,496.0376,34.809,35.395,39.956,35.0 -15:51:37,496.1019,34.781,35.367,38.987,35.0 -15:51:37,496.1634,34.781,35.423,39.943,35.0 -15:51:37,496.2215,34.809,35.367,38.975,35.0 -15:51:37,496.2816,34.781,35.367,39.449,35.0 -15:51:37,496.3417,34.809,35.367,39.925,35.0 -15:51:37,496.4000,34.809,35.367,39.438,35.0 -15:51:37,496.4597,34.809,35.367,39.432,35.0 -15:51:37,496.5197,34.837,35.367,39.426,35.0 -15:51:37,496.5747,34.753,35.339,38.939,35.0 -15:51:37,496.6282,34.781,35.367,40.859,35.0 -15:51:37,496.6811,34.837,35.367,39.893,35.0 -15:51:37,496.7354,34.809,35.367,38.925,35.0 -15:51:37,496.7850,34.837,35.367,39.4,35.0 -15:51:38,496.8331,34.809,35.367,38.914,35.0 -15:51:38,496.8844,34.781,35.367,39.39,35.0 -15:51:38,496.9334,34.809,35.339,39.866,35.0 -15:51:38,496.9825,34.837,35.395,39.862,35.0 -15:51:38,497.0353,34.753,35.339,38.413,35.0 -15:51:38,497.1049,34.753,35.339,40.814,35.0 -15:51:38,497.1543,34.809,35.339,40.811,35.0 -15:51:38,497.2011,34.865,35.367,39.845,35.0 -15:51:38,497.2492,34.781,35.367,38.397,35.0 -15:51:38,497.2959,34.809,35.367,39.835,35.0 -15:51:38,497.3429,34.809,35.339,39.349,35.0 -15:51:38,497.3897,34.781,35.311,39.826,35.0 -15:51:38,497.4365,34.809,35.339,40.785,35.0 -15:51:38,497.4870,34.809,35.367,39.82,35.0 -15:51:38,497.5387,34.753,35.367,39.334,35.0 -15:51:38,497.5891,34.837,35.339,40.292,35.0 -15:51:38,497.6393,34.809,35.367,39.325,35.0 -15:51:38,497.6896,34.809,35.367,39.32,35.0 -15:51:38,497.7395,34.781,35.395,39.315,35.0 -15:51:38,497.7896,34.809,35.339,39.31,35.0 -15:51:39,497.8379,34.753,35.395,39.787,35.0 -15:51:39,497.8892,34.809,35.339,39.783,35.0 -15:51:39,497.9398,34.781,35.367,39.778,35.0 -15:51:39,497.9895,34.781,35.339,39.774,35.0 -15:51:39,498.0401,34.753,35.367,40.251,35.0 -15:51:39,498.0898,34.781,35.395,40.248,35.0 -15:51:39,498.1393,34.809,35.311,39.281,35.0 -15:51:39,498.1911,34.781,35.367,40.24,35.0 -15:51:39,498.2414,34.781,35.395,39.754,35.0 -15:51:39,498.2911,34.837,35.367,39.268,35.0 -15:51:39,498.3417,34.781,35.367,38.782,35.0 -15:51:39,498.3908,34.753,35.395,39.739,35.0 -15:51:39,498.4385,34.753,35.423,39.735,35.0 -15:51:39,498.4879,34.809,35.367,39.25,35.0 -15:51:39,498.5368,34.753,35.367,39.245,35.0 -15:51:39,498.5851,34.781,35.451,40.203,35.0 -15:51:39,498.6331,34.781,35.311,38.273,35.0 -15:51:39,498.6832,34.809,35.339,40.675,35.0 -15:51:39,498.7315,34.837,35.367,39.709,35.0 -15:51:39,498.7783,34.781,35.367,38.742,35.0 -15:51:40,498.8261,34.809,35.367,39.699,35.0 -15:51:40,498.8739,34.809,35.367,39.214,35.0 -15:51:40,498.9232,34.809,35.367,39.209,35.0 -15:51:40,498.9732,34.809,35.367,39.204,35.0 -15:51:40,499.0212,34.781,35.395,39.199,35.0 -15:51:40,499.0705,34.781,35.367,39.194,35.0 -15:51:40,499.1196,34.809,35.395,39.671,35.0 -15:51:40,499.1685,34.781,35.367,38.703,35.0 -15:51:40,499.2175,34.781,35.367,39.661,35.0 -15:51:40,499.2653,34.809,35.311,39.657,35.0 -15:51:40,499.3167,34.837,35.367,40.134,35.0 -15:51:40,499.3656,34.809,35.339,38.686,35.0 -15:51:40,499.4161,34.753,35.339,39.643,35.0 -15:51:40,499.4663,34.781,35.367,40.602,35.0 -15:51:40,499.5160,34.753,35.339,39.636,35.0 -15:51:40,499.5660,34.809,35.311,40.596,35.0 -15:51:40,499.6162,34.809,35.367,40.111,35.0 -15:51:40,499.6651,34.781,35.367,39.145,35.0 -15:51:40,499.7150,34.809,35.367,39.621,35.0 -15:51:40,499.7627,34.781,35.367,39.135,35.0 -15:51:41,499.8111,34.781,35.367,39.612,35.0 -15:51:41,499.8609,34.809,35.339,39.608,35.0 -15:51:41,499.9097,34.809,35.339,39.604,35.0 -15:51:41,499.9586,34.781,35.367,39.6,35.0 -15:51:41,500.0076,34.809,35.367,39.596,35.0 -15:51:41,500.0568,34.809,35.367,39.11,35.0 -15:51:41,500.1039,34.781,35.367,39.105,35.0 -15:51:41,500.1644,34.781,35.339,39.582,35.0 -15:51:41,500.2187,34.753,35.339,40.058,35.0 -15:51:41,500.2675,34.753,35.339,40.536,35.0 -15:51:41,500.3162,34.781,35.339,40.534,35.0 -15:51:41,500.3650,34.837,35.367,40.05,35.0 -15:51:41,500.4139,34.781,35.367,38.602,35.0 -15:51:41,500.4637,34.781,35.367,39.559,35.0 -15:51:41,500.5127,34.809,35.339,39.555,35.0 -15:51:41,500.5595,34.809,35.339,39.551,35.0 -15:51:41,500.6106,34.781,35.395,39.547,35.0 -15:51:41,500.6623,34.809,35.367,39.061,35.0 -15:51:41,500.7099,34.809,35.339,39.056,35.0 -15:51:41,500.7585,34.837,35.339,39.532,35.0 -15:51:41,500.8066,34.781,35.339,39.047,35.0 -15:51:42,500.8556,34.781,35.367,40.005,35.0 -15:51:42,500.9035,34.781,35.395,39.52,35.0 -15:51:42,500.9529,34.781,35.339,39.034,35.0 -15:51:42,501.0016,34.753,35.367,39.993,35.0 -15:51:42,501.0497,34.781,35.367,39.989,35.0 -15:51:42,501.0991,34.753,35.367,39.504,35.0 -15:51:42,501.1484,34.809,35.339,39.982,35.0 -15:51:42,501.1983,34.781,35.367,39.497,35.0 -15:51:42,501.2466,34.781,35.367,39.493,35.0 -15:51:42,501.2947,34.809,35.311,39.489,35.0 -15:51:42,501.3444,34.809,35.367,39.966,35.0 -15:51:42,501.3925,34.809,35.339,38.999,35.0 -15:51:42,501.4410,34.837,35.367,39.476,35.0 -15:51:42,501.4911,34.753,35.311,38.509,35.0 -15:51:42,501.5406,34.809,35.339,40.911,35.0 -15:51:42,501.5906,34.753,35.367,39.465,35.0 -15:51:42,501.6418,34.809,35.339,39.942,35.0 -15:51:42,501.6918,34.753,35.367,39.457,35.0 -15:51:42,501.7417,34.781,35.423,39.934,35.0 -15:51:42,501.7899,34.809,35.339,38.486,35.0 -15:51:43,501.8401,34.781,35.339,39.443,35.0 -15:51:43,501.8891,34.837,35.367,39.921,35.0 -15:51:43,501.9384,34.837,35.367,38.473,35.0 -15:51:43,501.9859,34.753,35.339,38.467,35.0 -15:51:43,502.0344,34.781,35.339,40.388,35.0 -15:51:43,502.0834,34.781,35.311,39.904,35.0 -15:51:43,502.1321,34.781,35.367,40.382,35.0 -15:51:43,502.1825,34.809,35.367,39.416,35.0 -15:51:43,502.2297,34.781,35.395,38.93,35.0 -15:51:43,502.2801,34.781,35.339,38.925,35.0 -15:51:43,502.3298,34.781,35.311,39.884,35.0 -15:51:43,502.3800,34.781,35.339,40.362,35.0 -15:51:43,502.4294,34.753,35.367,39.878,35.0 -15:51:43,502.4784,34.781,35.367,39.874,35.0 -15:51:43,502.5282,34.809,35.339,39.389,35.0 -15:51:43,502.5778,34.781,35.339,39.385,35.0 -15:51:43,502.6287,34.781,35.367,39.862,35.0 -15:51:43,502.6816,34.781,35.339,39.377,35.0 -15:51:43,502.7323,34.809,35.367,39.855,35.0 -15:51:43,502.7814,34.837,35.367,38.888,35.0 -15:51:44,502.8311,34.781,35.339,38.401,35.0 -15:51:44,502.8807,34.781,35.367,39.84,35.0 -15:51:44,502.9325,34.837,35.339,39.355,35.0 -15:51:44,502.9817,34.753,35.395,38.869,35.0 -15:51:44,503.0315,34.781,35.339,39.346,35.0 -15:51:44,503.0807,34.809,35.339,39.823,35.0 -15:51:44,503.1313,34.837,35.367,39.338,35.0 -15:51:44,503.1825,34.809,35.339,38.371,35.0 -15:51:44,503.2351,34.781,35.367,39.328,35.0 -15:51:44,503.2839,34.809,35.283,39.324,35.0 -15:51:44,503.3326,34.753,35.339,40.283,35.0 -15:51:44,503.3781,34.781,35.367,40.28,35.0 -15:51:44,503.4263,34.809,35.367,39.315,35.0 -15:51:44,503.4745,34.781,35.367,38.829,35.0 -15:51:44,503.5216,34.753,35.367,39.306,35.0 -15:51:44,503.5692,34.781,35.339,39.783,35.0 -15:51:44,503.6177,34.781,35.367,39.78,35.0 -15:51:44,503.6657,34.809,35.339,39.295,35.0 -15:51:44,503.7130,34.809,35.339,39.291,35.0 -15:51:44,503.7599,34.781,35.339,39.287,35.0 -15:51:44,503.8076,34.781,35.367,39.765,35.0 -15:51:45,503.8591,34.781,35.339,39.28,35.0 -15:51:45,503.9102,34.781,35.367,39.757,35.0 -15:51:45,503.9631,34.781,35.339,39.272,35.0 -15:51:45,504.0150,34.781,35.367,39.749,35.0 -15:51:45,504.0649,34.781,35.339,39.264,35.0 -15:51:45,504.1145,34.781,35.367,39.741,35.0 -15:51:45,504.1636,34.781,35.395,39.256,35.0 -15:51:45,504.2127,34.781,35.367,38.771,35.0 -15:51:45,504.2624,34.809,35.339,39.247,35.0 -15:51:45,504.3134,34.753,35.367,39.243,35.0 -15:51:45,504.3603,34.809,35.283,39.72,35.0 -15:51:45,504.4064,34.781,35.367,40.199,35.0 -15:51:45,504.4541,34.781,35.423,39.233,35.0 -15:51:45,504.5030,34.809,35.367,38.266,35.0 -15:51:45,504.5504,34.781,35.339,38.742,35.0 -15:51:45,504.5976,34.781,35.367,39.7,35.0 -15:51:45,504.6468,34.781,35.339,39.216,35.0 -15:51:45,504.6978,34.781,35.395,39.693,35.0 -15:51:45,504.7466,34.781,35.339,38.726,35.0 -15:51:45,504.7971,34.753,35.339,39.685,35.0 -15:51:46,504.8473,34.781,35.367,40.163,35.0 -15:51:46,504.8973,34.809,35.395,39.197,35.0 -15:51:46,504.9474,34.809,35.367,38.229,35.0 -15:51:46,504.9962,34.726,35.339,38.705,35.0 -15:51:46,505.0453,34.781,35.311,40.609,35.0 -15:51:46,505.1015,34.809,35.367,40.143,35.0 -15:51:46,505.1556,34.837,35.367,38.695,35.0 -15:51:46,505.2037,34.781,35.367,38.208,35.0 -15:51:46,505.2525,34.781,35.339,39.166,35.0 -15:51:46,505.3008,34.781,35.367,39.643,35.0 -15:51:46,505.3500,34.781,35.367,39.158,35.0 -15:51:46,505.3968,34.781,35.367,39.154,35.0 -15:51:46,505.4477,34.809,35.395,39.15,35.0 -15:51:46,505.4970,34.781,35.367,38.182,35.0 -15:51:46,505.5484,34.781,35.339,39.14,35.0 -15:51:46,505.5967,34.781,35.311,39.617,35.0 -15:51:46,505.6472,34.781,35.367,40.096,35.0 -15:51:46,505.6974,34.809,35.339,39.13,35.0 -15:51:46,505.7473,34.781,35.367,39.125,35.0 -15:51:46,505.7947,34.753,35.367,39.121,35.0 -15:51:47,505.8428,34.781,35.367,39.599,35.0 -15:51:47,505.8911,34.753,35.367,39.114,35.0 -15:51:47,505.9403,34.781,35.367,39.591,35.0 -15:51:47,505.9888,34.781,35.339,39.106,35.0 -15:51:47,506.0358,34.809,35.367,39.584,35.0 -15:51:47,506.0843,34.753,35.367,38.617,35.0 -15:51:47,506.1320,34.726,35.339,39.576,35.0 -15:51:47,506.1815,34.809,35.367,40.519,35.0 -15:51:47,506.2300,34.781,35.339,38.607,35.0 -15:51:47,506.2799,34.781,35.367,39.566,35.0 -15:51:47,506.3277,34.809,35.339,39.081,35.0 -15:51:47,506.3752,34.781,35.311,39.077,35.0 -15:51:47,506.4241,34.781,35.339,40.036,35.0 -15:51:47,506.4727,34.809,35.339,39.552,35.0 -15:51:47,506.5210,34.753,35.367,39.067,35.0 -15:51:47,506.5704,34.781,35.367,39.544,35.0 -15:51:47,506.6183,34.781,35.367,39.059,35.0 -15:51:47,506.6669,34.809,35.339,39.055,35.0 -15:51:47,506.7191,34.726,35.367,39.051,35.0 -15:51:47,506.7717,34.809,35.339,39.993,35.0 -15:51:48,506.8232,34.781,35.367,39.044,35.0 -15:51:48,506.8756,34.726,35.339,39.039,35.0 -15:51:48,506.9253,34.809,35.367,40.463,35.0 -15:51:48,506.9754,34.781,35.283,38.552,35.0 -15:51:48,507.0277,34.753,35.367,40.473,35.0 -15:51:48,507.0782,34.781,35.367,39.508,35.0 -15:51:48,507.1310,34.781,35.339,39.023,35.0 -15:51:48,507.1821,34.809,35.311,39.5,35.0 -15:51:48,507.2327,34.781,35.367,39.497,35.0 -15:51:48,507.2817,34.781,35.367,39.011,35.0 -15:51:48,507.3312,34.809,35.311,39.007,35.0 -15:51:48,507.3811,34.781,35.367,39.485,35.0 -15:51:48,507.4457,34.781,35.339,39.0,35.0 -15:51:48,507.4966,34.781,35.367,39.476,35.0 -15:51:48,507.5475,34.781,35.339,38.991,35.0 -15:51:48,507.5977,34.781,35.367,39.468,35.0 -15:51:48,507.6490,34.781,35.339,38.983,35.0 -15:51:48,507.6997,34.781,35.339,39.461,35.0 -15:51:48,507.7514,34.753,35.339,39.457,35.0 -15:51:48,507.8030,34.781,35.395,39.935,35.0 -15:51:49,507.8536,34.781,35.311,38.488,35.0 -15:51:49,507.9050,34.726,35.395,39.927,35.0 -15:51:49,507.9565,34.781,35.395,39.426,35.0 -15:51:49,508.0068,34.753,35.339,38.476,35.0 -15:51:49,508.0562,34.781,35.339,39.916,35.0 -15:51:49,508.1058,34.781,35.339,39.432,35.0 -15:51:49,508.1552,34.781,35.339,39.428,35.0 -15:51:49,508.2066,34.809,35.367,39.425,35.0 -15:51:49,508.2591,34.753,35.367,38.458,35.0 -15:51:49,508.3086,34.781,35.339,39.416,35.0 -15:51:49,508.3601,34.781,35.339,39.413,35.0 -15:51:49,508.4106,34.781,35.367,39.409,35.0 -15:51:49,508.4618,34.781,35.339,38.924,35.0 -15:51:49,508.5125,34.809,35.339,39.401,35.0 -15:51:49,508.5649,34.781,35.367,38.916,35.0 -15:51:49,508.6158,34.781,35.367,38.912,35.0 -15:51:49,508.6682,34.781,35.395,38.908,35.0 -15:51:49,508.7192,34.753,35.367,38.422,35.0 -15:51:49,508.7705,34.781,35.339,39.38,35.0 -15:51:50,508.8216,34.781,35.423,39.376,35.0 -15:51:50,508.8708,34.781,35.367,37.928,35.0 -15:51:50,508.9216,34.753,35.339,38.885,35.0 -15:51:50,508.9723,34.809,35.339,39.844,35.0 -15:51:50,509.0223,34.753,35.367,38.878,35.0 -15:51:50,509.0732,34.753,35.367,39.356,35.0 -15:51:50,509.1235,34.809,35.339,39.352,35.0 -15:51:50,509.1735,34.781,35.339,38.867,35.0 -15:51:50,509.2241,34.781,35.339,39.345,35.0 -15:51:50,509.2738,34.781,35.367,39.341,35.0 -15:51:50,509.3228,34.809,35.311,38.856,35.0 -15:51:50,509.3735,34.753,35.367,39.334,35.0 -15:51:50,509.4243,34.753,35.339,39.33,35.0 -15:51:50,509.4748,34.781,35.311,39.808,35.0 -15:51:50,509.5258,34.809,35.339,39.806,35.0 -15:51:50,509.5767,34.781,35.339,38.84,35.0 -15:51:50,509.6271,34.809,35.339,39.317,35.0 -15:51:50,509.6780,34.753,35.367,38.832,35.0 -15:51:50,509.7262,34.753,35.367,39.309,35.0 -15:51:50,509.7761,34.753,35.367,39.306,35.0 -15:51:51,509.8263,34.781,35.339,39.303,35.0 -15:51:51,509.8784,34.781,35.395,39.299,35.0 -15:51:51,509.9296,34.753,35.339,38.332,35.0 -15:51:51,509.9820,34.781,35.367,39.772,35.0 -15:51:51,510.0327,34.726,35.339,38.806,35.0 -15:51:51,510.0833,34.781,35.395,40.229,35.0 -15:51:51,510.1347,34.781,35.339,38.318,35.0 -15:51:51,510.1864,34.753,35.367,39.276,35.0 -15:51:51,510.2377,34.753,35.395,39.273,35.0 -15:51:51,510.2898,34.753,35.339,38.788,35.0 -15:51:51,510.3408,34.781,35.339,39.746,35.0 -15:51:51,510.3906,34.753,35.367,39.262,35.0 -15:51:51,510.4434,34.781,35.367,39.259,35.0 -15:51:51,510.5104,34.892,35.339,38.773,35.0 -15:51:51,510.5598,34.781,35.339,37.339,35.0 -15:51:51,510.6090,34.809,35.339,39.242,35.0 -15:51:51,510.6586,34.781,35.339,38.757,35.0 -15:51:51,510.7076,34.781,35.339,39.235,35.0 -15:51:51,510.7633,34.781,35.367,39.231,35.0 -15:51:52,510.8348,34.781,35.339,38.745,35.0 -15:51:52,510.9136,34.753,35.367,39.221,35.0 -15:51:52,510.9856,34.753,35.367,39.216,35.0 -15:51:52,511.0457,34.781,35.283,39.211,35.0 -15:51:52,511.1045,34.781,35.339,40.17,35.0 -15:51:52,511.1654,34.781,35.339,39.205,35.0 -15:51:52,511.2309,34.781,35.367,39.201,35.0 -15:51:52,511.2932,34.753,35.367,38.714,35.0 -15:51:52,511.3513,34.809,35.367,39.191,35.0 -15:51:52,511.4168,34.809,35.311,38.223,35.0 -15:51:52,511.4824,34.753,35.339,39.181,35.0 -15:51:52,511.5477,34.809,35.339,39.658,35.0 -15:51:52,511.6081,34.753,35.367,38.691,35.0 -15:51:52,511.6646,34.809,35.339,39.168,35.0 -15:51:52,511.7179,34.753,35.367,38.682,35.0 -15:51:52,511.7726,34.698,35.339,39.159,35.0 -15:51:53,511.8237,34.726,35.367,40.583,35.0 -15:51:53,511.8715,34.781,35.339,39.619,35.0 -15:51:53,511.9261,34.781,35.339,39.152,35.0 -15:51:53,511.9727,34.753,35.367,39.148,35.0 -15:51:53,512.0207,34.753,35.367,39.145,35.0 -15:51:53,512.0694,34.753,35.367,39.142,35.0 -15:51:53,512.1332,34.781,35.339,39.138,35.0 -15:51:53,512.1833,34.753,35.367,39.134,35.0 -15:51:53,512.2315,34.865,35.367,39.131,35.0 -15:51:53,512.2805,34.781,35.367,37.201,35.0 -15:51:53,512.3296,34.781,35.339,38.639,35.0 -15:51:53,512.3791,34.781,35.339,39.117,35.0 -15:51:53,512.4293,34.753,35.339,39.113,35.0 -15:51:53,512.4809,34.781,35.339,39.591,35.0 -15:51:53,512.5273,34.781,35.367,39.107,35.0 -15:51:53,512.5754,34.781,35.283,38.623,35.0 -15:51:53,512.6263,34.809,35.339,40.063,35.0 -15:51:53,512.6796,34.753,35.339,38.616,35.0 -15:51:53,512.7394,34.753,35.367,39.575,35.0 -15:51:53,512.7878,34.753,35.339,39.09,35.0 -15:51:54,512.8357,34.781,35.367,39.569,35.0 -15:51:54,512.8906,34.781,35.311,38.603,35.0 -15:51:54,512.9395,34.698,35.339,39.562,35.0 -15:51:54,512.9983,34.753,35.339,40.505,35.0 -15:51:54,513.0756,34.753,35.395,39.558,35.0 -15:51:54,513.1291,34.753,35.339,38.589,35.0 -15:51:54,513.1847,34.837,35.339,39.548,35.0 -15:51:54,513.2391,34.781,35.339,38.1,35.0 -15:51:54,513.2926,34.753,35.367,39.058,35.0 -15:51:54,513.3465,34.809,35.339,39.054,35.0 -15:51:54,513.4201,34.753,35.339,38.569,35.0 -15:51:54,513.4819,34.753,35.367,39.527,35.0 -15:51:54,513.5708,34.753,35.395,39.041,35.0 -15:51:54,513.6243,34.753,35.339,38.553,35.0 -15:51:54,513.6774,34.781,35.339,39.512,35.0 -15:51:54,513.7320,34.781,35.283,39.028,35.0 -15:51:54,513.7861,34.753,35.339,39.988,35.0 -15:51:55,513.8398,34.753,35.339,39.504,35.0 -15:51:55,513.8925,34.781,35.339,39.501,35.0 -15:51:55,513.9472,34.753,35.367,39.017,35.0 -15:51:55,514.0004,34.753,35.367,39.013,35.0 -15:51:55,514.0541,34.809,35.311,39.009,35.0 -15:51:55,514.1063,34.781,35.367,39.006,35.0 -15:51:55,514.1586,34.781,35.339,38.52,35.0 -15:51:55,514.2103,34.753,35.339,38.998,35.0 -15:51:55,514.2677,34.781,35.339,39.476,35.0 -15:51:55,514.3240,34.753,35.339,38.991,35.0 -15:51:55,514.3772,34.781,35.339,39.469,35.0 -15:51:55,514.4315,34.753,35.283,38.984,35.0 -15:51:55,514.4869,34.781,35.339,40.426,35.0 -15:51:55,514.5416,34.809,35.339,38.979,35.0 -15:51:55,514.5936,34.726,35.339,38.494,35.0 -15:51:55,514.6496,34.753,35.339,39.917,35.0 -15:51:55,514.7038,34.753,35.367,39.451,35.0 -15:51:55,514.7591,34.781,35.367,38.966,35.0 -15:51:56,514.8148,34.753,35.339,38.481,35.0 -15:51:56,514.8747,34.753,35.395,39.439,35.0 -15:51:56,514.9261,34.781,35.339,38.473,35.0 -15:51:56,514.9805,34.781,35.339,38.95,35.0 -15:51:56,515.0338,34.753,35.339,38.946,35.0 -15:51:56,515.0844,34.781,35.311,39.424,35.0 -15:51:56,515.1386,34.698,35.339,39.422,35.0 -15:51:56,515.1958,34.781,35.367,40.365,35.0 -15:51:56,515.2501,34.753,35.339,38.454,35.0 -15:51:56,515.3025,34.726,35.367,39.413,35.0 -15:51:56,515.3556,34.781,35.367,39.393,35.0 -15:51:56,515.4097,34.809,35.423,38.444,35.0 -15:51:56,515.4641,34.781,35.339,36.994,35.0 -15:51:56,515.5186,34.781,35.339,38.914,35.0 -15:51:56,515.5713,34.753,35.367,38.91,35.0 -15:51:56,515.6230,34.781,35.339,38.907,35.0 -15:51:56,515.6751,34.753,35.339,38.903,35.0 -15:51:56,515.7292,34.781,35.311,39.381,35.0 -15:51:56,515.7841,34.781,35.367,39.378,35.0 -15:51:57,515.8356,34.809,35.339,38.412,35.0 -15:51:57,515.8876,34.781,35.311,38.408,35.0 -15:51:57,515.9403,34.781,35.339,39.367,35.0 -15:51:57,515.9914,34.781,35.339,38.882,35.0 -15:51:57,516.0415,34.753,35.339,38.879,35.0 -15:51:57,516.0937,34.781,35.339,39.357,35.0 -15:51:57,516.1478,34.753,35.339,38.872,35.0 -15:51:57,516.2074,34.753,35.339,39.35,35.0 -15:51:57,516.2617,34.781,35.311,39.347,35.0 -15:51:57,516.3157,34.753,35.311,39.344,35.0 -15:51:57,516.3696,34.753,35.339,39.823,35.0 -15:51:57,516.4233,34.726,35.339,39.34,35.0 -15:51:57,516.4824,34.753,35.339,39.801,35.0 -15:51:57,516.5361,34.753,35.367,39.335,35.0 -15:51:57,516.5899,34.781,35.339,38.85,35.0 -15:51:57,516.6439,34.781,35.339,38.846,35.0 -15:51:57,516.6985,34.726,35.367,38.843,35.0 -15:51:57,516.7547,34.781,35.339,39.303,35.0 -15:51:58,516.8116,34.809,35.339,38.836,35.0 -15:51:58,516.8655,34.753,35.339,38.35,35.0 -15:51:58,516.9193,34.753,35.339,39.309,35.0 -15:51:58,516.9713,34.753,35.283,39.306,35.0 -15:51:58,517.0276,34.781,35.339,40.267,35.0 -15:51:58,517.0847,34.753,35.367,38.821,35.0 -15:51:58,517.1371,34.781,35.311,38.817,35.0 -15:51:58,517.1903,34.753,35.367,39.295,35.0 -15:51:58,517.2427,34.781,35.339,38.81,35.0 -15:51:58,517.2934,34.781,35.395,38.807,35.0 -15:51:58,517.3480,34.753,35.339,37.84,35.0 -15:51:58,517.4069,34.753,35.395,39.279,35.0 -15:51:58,517.4619,34.753,35.339,38.313,35.0 -15:51:58,517.5166,34.781,35.339,39.272,35.0 -15:51:58,517.5709,34.781,35.311,38.787,35.0 -15:51:58,517.6245,34.781,35.311,39.265,35.0 -15:51:58,517.6767,34.726,35.339,39.262,35.0 -15:51:58,517.7314,34.809,35.367,39.724,35.0 -15:51:58,517.7924,34.781,35.367,37.812,35.0 -15:51:59,517.8511,34.753,35.339,38.288,35.0 -15:51:59,517.9037,34.753,35.339,39.246,35.0 -15:51:59,517.9662,34.753,35.339,39.244,35.0 -15:51:59,518.0183,34.781,35.339,39.24,35.0 -15:51:59,518.0659,34.753,35.311,38.756,35.0 -15:51:59,518.1144,34.781,35.339,39.716,35.0 -15:51:59,518.1624,34.753,35.339,38.751,35.0 -15:51:59,518.2123,34.781,35.339,39.229,35.0 -15:51:59,518.2578,34.809,35.339,38.745,35.0 -15:51:59,518.3072,34.781,35.339,38.26,35.0 -15:51:59,518.3552,34.753,35.339,38.738,35.0 -15:51:59,518.4096,34.726,35.311,39.216,35.0 -15:51:59,518.4613,34.753,35.367,40.159,35.0 -15:51:59,518.5086,34.781,35.367,38.731,35.0 -15:51:59,518.5567,34.753,35.339,38.246,35.0 -15:51:59,518.6042,34.753,35.339,39.205,35.0 -15:51:59,518.6523,34.781,35.311,39.202,35.0 -15:51:59,518.6999,34.781,35.339,39.2,35.0 -15:51:59,518.7495,34.809,35.311,38.716,35.0 -15:51:59,518.7974,34.753,35.311,38.712,35.0 -15:52:00,518.8469,34.781,35.311,39.672,35.0 -15:52:00,518.8969,34.781,35.283,39.189,35.0 -15:52:00,518.9461,34.753,35.339,39.668,35.0 -15:52:00,518.9939,34.753,35.339,39.184,35.0 -15:52:00,519.0435,34.753,35.339,39.182,35.0 -15:52:00,519.0937,34.753,35.339,39.179,35.0 -15:52:00,519.1574,34.781,35.339,39.177,35.0 -15:52:00,519.2090,34.781,35.339,38.691,35.0 -15:52:00,519.2637,34.781,35.339,38.688,35.0 -15:52:00,519.3168,34.809,35.339,38.684,35.0 -15:52:00,519.3712,34.781,35.339,38.199,35.0 -15:52:00,519.4239,34.781,35.339,38.676,35.0 -15:52:00,519.4779,34.753,35.339,38.672,35.0 -15:52:00,519.5331,34.753,35.311,39.15,35.0 -15:52:00,519.5845,34.753,35.339,39.629,35.0 -15:52:00,519.6346,34.753,35.283,39.146,35.0 -15:52:00,519.6873,34.781,35.339,40.106,35.0 -15:52:00,519.7400,34.753,35.367,38.66,35.0 -15:52:00,519.7910,34.781,35.339,38.657,35.0 -15:52:01,519.8416,34.781,35.339,38.653,35.0 -15:52:01,519.8976,34.781,35.339,38.65,35.0 -15:52:01,519.9499,34.809,35.367,38.646,35.0 -15:52:01,519.9990,34.809,35.395,37.679,35.0 -15:52:01,520.0479,34.781,35.283,37.192,35.0 -15:52:01,520.0962,34.781,35.311,39.595,35.0 -15:52:01,520.1466,34.781,35.311,39.111,35.0 -15:52:01,520.1953,34.753,35.339,39.109,35.0 -15:52:01,520.2426,34.753,35.339,39.106,35.0 -15:52:01,520.2898,34.781,35.311,39.104,35.0 -15:52:01,520.3373,34.753,35.311,39.101,35.0 -15:52:01,520.3856,34.753,35.367,39.58,35.0 -15:52:01,520.4329,34.837,35.339,38.615,35.0 -15:52:01,520.4823,34.753,35.339,37.649,35.0 -15:52:01,520.5314,34.781,35.339,39.089,35.0 -15:52:01,520.5816,34.781,35.311,38.605,35.0 -15:52:01,520.6311,34.753,35.339,39.083,35.0 -15:52:01,520.6816,34.753,35.339,39.08,35.0 -15:52:01,520.7307,34.726,35.367,39.077,35.0 -15:52:01,520.7797,34.753,35.283,39.058,35.0 -15:52:02,520.8286,34.726,35.339,40.035,35.0 -15:52:02,520.8774,34.753,35.339,39.536,35.0 -15:52:02,520.9270,34.781,35.339,39.069,35.0 -15:52:02,520.9750,34.753,35.339,38.585,35.0 -15:52:02,521.0225,34.726,35.339,39.064,35.0 -15:52:02,521.0700,34.753,35.339,39.525,35.0 -15:52:02,521.1187,34.753,35.339,39.059,35.0 -15:52:02,521.1665,34.781,35.395,39.057,35.0 -15:52:02,521.2162,34.753,35.339,37.609,35.0 -15:52:02,521.2656,34.753,35.367,39.049,35.0 -15:52:02,521.3145,34.781,35.367,38.565,35.0 -15:52:02,521.3657,34.753,35.339,38.08,35.0 -15:52:02,521.4144,34.753,35.339,39.039,35.0 -15:52:02,521.4632,34.781,35.311,39.036,35.0 -15:52:02,521.5113,34.781,35.339,39.034,35.0 -15:52:02,521.5590,34.726,35.339,38.55,35.0 -15:52:02,521.6061,34.753,35.339,39.493,35.0 -15:52:02,521.6534,34.753,35.339,39.026,35.0 -15:52:02,521.7022,34.753,35.339,39.024,35.0 -15:52:02,521.7579,34.753,35.367,39.021,35.0 -15:52:02,521.8066,34.753,35.311,38.537,35.0 -15:52:03,521.8546,34.753,35.339,39.497,35.0 -15:52:03,521.9029,34.753,35.339,39.013,35.0 -15:52:03,521.9527,34.781,35.367,39.011,35.0 -15:52:03,522.0010,34.726,35.339,38.045,35.0 -15:52:03,522.0500,34.781,35.339,39.468,35.0 -15:52:03,522.0987,34.781,35.311,38.521,35.0 -15:52:03,522.1481,34.753,35.339,38.999,35.0 -15:52:03,522.1989,34.753,35.367,38.996,35.0 -15:52:03,522.2481,34.726,35.311,38.512,35.0 -15:52:03,522.2973,34.753,35.339,39.936,35.0 -15:52:03,522.3465,34.753,35.311,38.989,35.0 -15:52:03,522.3963,34.726,35.367,39.468,35.0 -15:52:03,522.4452,34.781,35.311,38.967,35.0 -15:52:03,522.4913,34.753,35.339,38.982,35.0 -15:52:03,522.5396,34.726,35.339,38.98,35.0 -15:52:03,522.5898,34.753,35.339,39.442,35.0 -15:52:03,522.6420,34.726,35.339,38.975,35.0 -15:52:03,522.6936,34.753,35.311,39.437,35.0 -15:52:03,522.7462,34.753,35.339,39.452,35.0 -15:52:03,522.7977,34.726,35.367,38.969,35.0 -15:52:04,522.8500,34.753,35.311,38.949,35.0 -15:52:04,522.9010,34.781,35.339,39.445,35.0 -15:52:04,522.9536,34.753,35.339,38.48,35.0 -15:52:04,523.0053,34.726,35.339,38.958,35.0 -15:52:04,523.0567,34.781,35.311,39.419,35.0 -15:52:04,523.1086,34.753,35.367,38.953,35.0 -15:52:04,523.1621,34.726,35.339,38.469,35.0 -15:52:04,523.2130,34.753,35.311,39.411,35.0 -15:52:04,523.2635,34.781,35.311,39.427,35.0 -15:52:04,523.3155,34.781,35.311,38.943,35.0 -15:52:04,523.3674,34.753,35.339,38.94,35.0 -15:52:04,523.4174,34.781,35.423,38.938,35.0 -15:52:04,523.4688,34.781,35.283,37.009,35.0 -15:52:04,523.5214,34.753,35.339,39.411,35.0 -15:52:04,523.5721,34.781,35.311,38.927,35.0 -15:52:04,523.6228,34.753,35.339,38.925,35.0 -15:52:04,523.6757,34.726,35.339,38.922,35.0 -15:52:04,523.7311,34.753,35.311,39.384,35.0 -15:52:04,523.7811,34.781,35.311,39.399,35.0 -15:52:05,523.8305,34.781,35.339,38.915,35.0 -15:52:05,523.8787,34.642,35.311,38.431,35.0 -15:52:05,523.9294,34.753,35.339,41.3,35.0 -15:52:05,523.9783,34.726,35.339,38.911,35.0 -15:52:05,524.0280,34.753,35.339,39.372,35.0 -15:52:05,524.0759,34.726,35.339,38.906,35.0 -15:52:05,524.1258,34.753,35.311,39.368,35.0 -15:52:05,524.1753,34.781,35.339,39.383,35.0 -15:52:05,524.2245,34.781,35.311,38.418,35.0 -15:52:05,524.2720,34.753,35.311,38.897,35.0 -15:52:05,524.3192,34.726,35.367,39.376,35.0 -15:52:05,524.3691,34.753,35.339,38.875,35.0 -15:52:05,524.4177,34.781,35.311,38.89,35.0 -15:52:05,524.4717,34.726,35.339,38.887,35.0 -15:52:05,524.5207,34.781,35.283,39.349,35.0 -15:52:05,524.5695,34.753,35.311,39.364,35.0 -15:52:05,524.6181,34.726,35.339,39.362,35.0 -15:52:05,524.6676,34.698,35.339,39.343,35.0 -15:52:05,524.7158,34.753,35.311,39.823,35.0 -15:52:05,524.7656,34.753,35.339,39.358,35.0 -15:52:06,524.8146,34.698,35.339,38.874,35.0 -15:52:06,524.8637,34.753,35.367,39.818,35.0 -15:52:06,524.9116,34.753,35.339,38.389,35.0 -15:52:06,524.9612,34.781,35.311,38.867,35.0 -15:52:06,525.0117,34.753,35.339,38.865,35.0 -15:52:06,525.0637,34.753,35.311,38.862,35.0 -15:52:06,525.1160,34.753,35.339,39.341,35.0 -15:52:06,525.1701,34.726,35.339,38.857,35.0 -15:52:06,525.2236,34.726,35.339,39.319,35.0 -15:52:06,525.2796,34.753,35.311,39.317,35.0 -15:52:06,525.3289,34.726,35.311,39.332,35.0 -15:52:06,525.3803,34.809,35.339,39.795,35.0 -15:52:06,525.4321,34.753,35.311,37.884,35.0 -15:52:06,525.4908,34.753,35.311,39.325,35.0 -15:52:06,525.5428,34.753,35.339,39.323,35.0 -15:52:06,525.5937,34.753,35.311,38.839,35.0 -15:52:06,525.6466,34.753,35.311,39.318,35.0 -15:52:06,525.7002,34.726,35.311,39.316,35.0 -15:52:06,525.7546,34.753,35.311,39.779,35.0 -15:52:07,525.8270,34.753,35.311,39.313,35.0 -15:52:07,525.8973,34.726,35.339,39.31,35.0 -15:52:07,525.9535,34.753,35.339,39.291,35.0 -15:52:07,526.0192,34.753,35.283,38.824,35.0 -15:52:07,526.0776,34.726,35.367,39.784,35.0 -15:52:07,526.1401,34.753,35.339,38.802,35.0 -15:52:07,526.2002,34.781,35.311,38.816,35.0 -15:52:07,526.2603,34.753,35.367,38.813,35.0 -15:52:07,526.3218,34.781,35.311,38.328,35.0 -15:52:07,526.3833,34.781,35.283,38.806,35.0 -15:52:07,526.4464,34.726,35.339,39.284,35.0 -15:52:07,526.5067,34.753,35.283,39.265,35.0 -15:52:07,526.5638,34.809,35.339,39.762,35.0 -15:52:07,526.6210,34.809,35.339,37.833,35.0 -15:52:07,526.6753,34.809,35.339,37.829,35.0 -15:52:07,526.7305,34.726,35.311,37.824,35.0 -15:52:07,526.7828,34.781,35.339,39.729,35.0 -15:52:08,526.8345,34.726,35.339,38.3,35.0 -15:52:08,526.8861,34.753,35.311,39.243,35.0 -15:52:08,526.9369,34.781,35.339,39.258,35.0 -15:52:08,526.9877,34.726,35.339,38.293,35.0 -15:52:08,527.0444,34.753,35.367,39.235,35.0 -15:52:08,527.1074,34.753,35.339,38.287,35.0 -15:52:08,527.1620,34.753,35.311,38.765,35.0 -15:52:08,527.2159,34.753,35.339,39.243,35.0 -15:52:08,527.2640,34.753,35.311,38.76,35.0 -15:52:08,527.3128,34.726,35.311,39.239,35.0 -15:52:08,527.3621,34.726,35.339,39.701,35.0 -15:52:08,527.4117,34.753,35.339,39.219,35.0 -15:52:08,527.4605,34.837,35.283,38.753,35.0 -15:52:08,527.5084,34.753,35.339,38.268,35.0 -15:52:08,527.5566,34.726,35.311,38.747,35.0 -15:52:08,527.6071,34.753,35.339,39.69,35.0 -15:52:08,527.6568,34.726,35.339,38.743,35.0 -15:52:08,527.7072,34.753,35.311,39.205,35.0 -15:52:08,527.7559,34.753,35.339,39.22,35.0 -15:52:08,527.8057,34.753,35.339,38.737,35.0 -15:52:09,527.8546,34.726,35.339,38.734,35.0 -15:52:09,527.9033,34.753,35.311,39.196,35.0 -15:52:09,527.9564,34.753,35.311,39.211,35.0 -15:52:09,528.0088,34.781,35.339,39.209,35.0 -15:52:09,528.0570,34.753,35.339,38.244,35.0 -15:52:09,528.1060,34.753,35.311,38.722,35.0 -15:52:09,528.1565,34.809,35.311,39.201,35.0 -15:52:09,528.2101,34.726,35.311,38.236,35.0 -15:52:09,528.2578,34.753,35.283,39.661,35.0 -15:52:09,528.3068,34.781,35.311,39.677,35.0 -15:52:09,528.3556,34.753,35.311,38.713,35.0 -15:52:09,528.4042,34.753,35.311,39.192,35.0 -15:52:09,528.4522,34.753,35.367,39.19,35.0 -15:52:09,528.5006,34.781,35.311,38.225,35.0 -15:52:09,528.5483,34.753,35.339,38.703,35.0 -15:52:09,528.5977,34.753,35.311,38.701,35.0 -15:52:09,528.6525,34.753,35.339,39.18,35.0 -15:52:09,528.7039,34.753,35.311,38.696,35.0 -15:52:09,528.7536,34.753,35.311,39.175,35.0 -15:52:09,528.8027,34.753,35.311,39.173,35.0 -15:52:10,528.8548,34.726,35.311,39.171,35.0 -15:52:10,528.9073,34.753,35.339,39.634,35.0 -15:52:10,528.9597,34.753,35.339,38.687,35.0 -15:52:10,529.0107,34.726,35.339,38.684,35.0 -15:52:10,529.0628,34.781,35.339,39.146,35.0 -15:52:10,529.1137,34.753,35.339,38.198,35.0 -15:52:10,529.1657,34.753,35.311,38.676,35.0 -15:52:10,529.2183,34.781,35.339,39.155,35.0 -15:52:10,529.2712,34.726,35.367,38.189,35.0 -15:52:10,529.3219,34.753,35.311,38.65,35.0 -15:52:10,529.3736,34.753,35.311,39.146,35.0 -15:52:10,529.4240,34.753,35.283,39.144,35.0 -15:52:10,529.4785,34.781,35.339,39.624,35.0 -15:52:10,529.5312,34.753,35.311,38.178,35.0 -15:52:10,529.5834,34.753,35.311,39.138,35.0 -15:52:10,529.6348,34.753,35.311,39.136,35.0 -15:52:10,529.6863,34.753,35.339,39.134,35.0 -15:52:10,529.7372,34.726,35.339,38.65,35.0 -15:52:10,529.7880,34.781,35.311,39.112,35.0 -15:52:11,529.8396,34.753,35.367,38.646,35.0 -15:52:11,529.8919,34.753,35.339,38.161,35.0 -15:52:11,529.9431,34.726,35.311,38.64,35.0 -15:52:11,529.9947,34.753,35.339,39.583,35.0 -15:52:11,530.0462,34.726,35.339,38.636,35.0 -15:52:11,530.0979,34.753,35.311,39.097,35.0 -15:52:11,530.1566,34.781,35.311,39.113,35.0 -15:52:11,530.2087,34.781,35.311,38.629,35.0 -15:52:11,530.2616,34.726,35.311,38.626,35.0 -15:52:11,530.3137,34.753,35.311,39.569,35.0 -15:52:11,530.3668,34.753,35.367,39.104,35.0 -15:52:11,530.4189,34.753,35.339,38.139,35.0 -15:52:11,530.4711,34.753,35.311,38.617,35.0 -15:52:11,530.5224,34.726,35.339,39.096,35.0 -15:52:11,530.5738,34.753,35.339,39.077,35.0 -15:52:11,530.6288,34.753,35.311,38.61,35.0 -15:52:11,530.6826,34.753,35.311,39.089,35.0 -15:52:11,530.7357,34.753,35.339,39.087,35.0 -15:52:11,530.7879,34.781,35.339,38.603,35.0 -15:52:12,530.8389,34.753,35.339,38.119,35.0 -15:52:12,530.8923,34.726,35.339,38.597,35.0 -15:52:12,530.9438,34.726,35.367,39.059,35.0 -15:52:12,530.9957,34.753,35.283,38.575,35.0 -15:52:12,531.0466,34.781,35.255,39.553,35.0 -15:52:12,531.0974,34.753,35.227,39.552,35.0 -15:52:12,531.1472,34.753,35.367,40.514,35.0 -15:52:12,531.1987,34.726,35.339,38.107,35.0 -15:52:12,531.2467,34.809,35.339,39.049,35.0 -15:52:12,531.2976,34.753,35.311,37.62,35.0 -15:52:12,531.3472,34.809,35.311,39.06,35.0 -15:52:12,531.3970,34.753,35.339,38.095,35.0 -15:52:12,531.4476,34.726,35.339,38.574,35.0 -15:52:12,531.4998,34.753,35.339,39.035,35.0 -15:52:12,531.5513,34.726,35.339,38.569,35.0 -15:52:12,531.6031,34.726,35.311,39.031,35.0 -15:52:12,531.6537,34.726,35.311,39.51,35.0 -15:52:12,531.7056,34.753,35.339,39.509,35.0 -15:52:12,531.7588,34.753,35.339,38.562,35.0 -15:52:13,531.8097,34.726,35.339,38.559,35.0 -15:52:13,531.8627,34.726,35.339,39.021,35.0 -15:52:13,531.9138,34.67,35.311,39.019,35.0 -15:52:13,531.9671,34.753,35.311,40.462,35.0 -15:52:13,532.0197,34.809,35.311,39.035,35.0 -15:52:13,532.0723,34.753,35.311,38.07,35.0 -15:52:13,532.1241,34.781,35.311,39.029,35.0 -15:52:13,532.1781,34.753,35.339,38.546,35.0 -15:52:13,532.2302,34.753,35.339,38.543,35.0 -15:52:13,532.2827,34.726,35.367,38.54,35.0 -15:52:13,532.3332,34.726,35.311,38.52,35.0 -15:52:13,532.3856,34.753,35.339,39.481,35.0 -15:52:13,532.4364,34.781,35.311,38.534,35.0 -15:52:13,532.4885,34.726,35.339,38.531,35.0 -15:52:13,532.5403,34.698,35.311,38.993,35.0 -15:52:13,532.5934,34.726,35.339,39.954,35.0 -15:52:13,532.6455,34.781,35.339,38.99,35.0 -15:52:13,532.6987,34.753,35.339,38.042,35.0 -15:52:13,532.7507,34.753,35.339,38.52,35.0 -15:52:13,532.8027,34.753,35.311,38.518,35.0 -15:52:14,532.8537,34.781,35.311,38.997,35.0 -15:52:14,532.9053,34.753,35.339,38.513,35.0 -15:52:14,532.9609,34.726,35.311,38.51,35.0 -15:52:14,533.0120,34.753,35.339,39.454,35.0 -15:52:14,533.0644,34.781,35.311,38.507,35.0 -15:52:14,533.1158,34.726,35.339,38.504,35.0 -15:52:14,533.1684,34.781,35.339,38.966,35.0 -15:52:14,533.2197,34.726,35.339,38.018,35.0 -15:52:14,533.2720,34.726,35.339,38.96,35.0 -15:52:14,533.3267,34.698,35.339,38.958,35.0 -15:52:14,533.3787,34.781,35.339,39.438,35.0 -15:52:14,533.4309,34.753,35.311,38.009,35.0 -15:52:14,533.4827,34.753,35.311,38.969,35.0 -15:52:14,533.5346,34.753,35.339,38.967,35.0 -15:52:14,533.5856,34.726,35.339,38.483,35.0 -15:52:14,533.6366,34.753,35.311,38.945,35.0 -15:52:14,533.6876,34.781,35.311,38.96,35.0 -15:52:14,533.7396,34.753,35.311,38.477,35.0 -15:52:14,533.7926,34.753,35.311,38.956,35.0 -15:52:15,533.8442,34.726,35.311,38.954,35.0 -15:52:15,533.8961,34.753,35.311,39.416,35.0 -15:52:15,533.9475,34.781,35.311,38.951,35.0 -15:52:15,533.9993,34.726,35.255,38.467,35.0 -15:52:15,534.0504,34.698,35.311,40.374,35.0 -15:52:15,534.1016,34.753,35.311,39.893,35.0 -15:52:15,534.1551,34.726,35.367,38.947,35.0 -15:52:15,534.2069,34.753,35.339,38.446,35.0 -15:52:15,534.2588,34.753,35.339,38.46,35.0 -15:52:15,534.3087,34.781,35.339,38.457,35.0 -15:52:15,534.3578,34.809,35.339,37.973,35.0 -15:52:15,534.4085,34.781,35.311,37.488,35.0 -15:52:15,534.4598,34.726,35.339,38.447,35.0 -15:52:15,534.5116,34.726,35.311,38.909,35.0 -15:52:15,534.5628,34.726,35.339,39.389,35.0 -15:52:15,534.6163,34.753,35.283,38.906,35.0 -15:52:15,534.6685,34.781,35.311,39.403,35.0 -15:52:15,534.7195,34.753,35.339,38.438,35.0 -15:52:15,534.7707,34.698,35.311,38.436,35.0 -15:52:16,534.8210,34.753,35.339,39.861,35.0 -15:52:16,534.8702,34.726,35.311,38.433,35.0 -15:52:16,534.9211,34.781,35.311,39.376,35.0 -15:52:16,534.9718,34.753,35.367,38.429,35.0 -15:52:16,535.0212,34.753,35.339,37.945,35.0 -15:52:16,535.0728,34.726,35.339,38.423,35.0 -15:52:16,535.1245,34.781,35.311,38.885,35.0 -15:52:16,535.1775,34.753,35.311,38.418,35.0 -15:52:16,535.2290,34.726,35.339,38.897,35.0 -15:52:16,535.2791,34.726,35.311,38.878,35.0 -15:52:16,535.3285,34.698,35.339,39.358,35.0 -15:52:16,535.3769,34.753,35.311,39.357,35.0 -15:52:16,535.4263,34.753,35.311,38.892,35.0 -15:52:16,535.4748,34.753,35.255,38.89,35.0 -15:52:16,535.5215,34.753,35.311,39.851,35.0 -15:52:16,535.5695,34.781,35.311,38.888,35.0 -15:52:16,535.6185,34.753,35.311,38.404,35.0 -15:52:16,535.6664,34.753,35.339,38.884,35.0 -15:52:16,535.7155,34.781,35.311,38.4,35.0 -15:52:16,535.7629,34.726,35.311,38.398,35.0 -15:52:17,535.8122,34.698,35.311,39.341,35.0 -15:52:17,535.8613,34.726,35.339,39.822,35.0 -15:52:17,535.9097,34.753,35.339,38.858,35.0 -15:52:17,535.9617,34.753,35.367,38.392,35.0 -15:52:17,536.0107,34.726,35.311,37.908,35.0 -15:52:17,536.0600,34.642,35.311,39.332,35.0 -15:52:17,536.1108,34.753,35.339,40.776,35.0 -15:52:17,536.1593,34.698,35.311,38.386,35.0 -15:52:17,536.2084,34.726,35.311,39.811,35.0 -15:52:17,536.2577,34.753,35.283,39.329,35.0 -15:52:17,536.3057,34.781,35.367,39.345,35.0 -15:52:17,536.3593,34.781,35.367,37.418,35.0 -15:52:17,536.4114,34.753,35.311,37.413,35.0 -15:52:17,536.4634,34.781,35.311,38.854,35.0 -15:52:17,536.5166,34.753,35.311,38.37,35.0 -15:52:17,536.5687,34.753,35.283,38.849,35.0 -15:52:17,536.6223,34.753,35.311,39.329,35.0 -15:52:17,536.6763,34.726,35.339,38.846,35.0 -15:52:17,536.7279,34.781,35.311,38.827,35.0 -15:52:17,536.7805,34.698,35.311,38.361,35.0 -15:52:18,536.8327,34.726,35.311,39.786,35.0 -15:52:18,536.8853,34.726,35.311,39.304,35.0 -15:52:18,536.9379,34.753,35.311,39.303,35.0 -15:52:18,536.9902,34.781,35.339,38.837,35.0 -15:52:18,537.0429,34.753,35.311,37.872,35.0 -15:52:18,537.0944,34.67,35.311,38.832,35.0 -15:52:18,537.1464,34.781,35.311,40.258,35.0 -15:52:18,537.2000,34.781,35.311,38.349,35.0 -15:52:18,537.2523,34.753,35.339,38.346,35.0 -15:52:18,537.3057,34.698,35.339,38.343,35.0 -15:52:18,537.3579,34.726,35.395,39.286,35.0 -15:52:18,537.4105,34.726,35.339,37.84,35.0 -15:52:18,537.4620,34.753,35.311,38.8,35.0 -15:52:18,537.5137,34.726,35.283,38.815,35.0 -15:52:18,537.5647,34.753,35.311,39.76,35.0 -15:52:18,537.6180,34.726,35.311,38.813,35.0 -15:52:18,537.6704,34.726,35.339,39.276,35.0 -15:52:18,537.7220,34.781,35.339,38.793,35.0 -15:52:18,537.7755,34.726,35.283,37.845,35.0 -15:52:19,537.8272,34.753,35.311,39.751,35.0 -15:52:19,537.8795,34.726,35.339,38.804,35.0 -15:52:19,537.9325,34.726,35.311,38.785,35.0 -15:52:19,537.9849,34.726,35.311,39.265,35.0 -15:52:19,538.0352,34.753,35.339,39.264,35.0 -15:52:19,538.0863,34.753,35.311,38.317,35.0 -15:52:19,538.1390,34.726,35.339,38.796,35.0 -15:52:19,538.1907,34.698,35.339,38.777,35.0 -15:52:19,538.2432,34.67,35.311,39.256,35.0 -15:52:19,538.2952,34.726,35.339,40.219,35.0 -15:52:19,538.3471,34.726,35.311,38.774,35.0 -15:52:19,538.3989,34.753,35.311,39.254,35.0 -15:52:19,538.4517,34.726,35.311,38.788,35.0 -15:52:19,538.5047,34.726,35.339,39.251,35.0 -15:52:19,538.5586,34.726,35.311,38.768,35.0 -15:52:19,538.6094,34.726,35.311,39.248,35.0 -15:52:19,538.6633,34.753,35.311,39.247,35.0 -15:52:19,538.7149,34.753,35.311,38.781,35.0 -15:52:19,538.7674,34.753,35.311,38.779,35.0 -15:52:20,538.8190,34.781,35.311,38.777,35.0 -15:52:20,538.8687,34.726,35.367,38.294,35.0 -15:52:20,538.9203,34.837,35.311,38.274,35.0 -15:52:20,538.9725,34.726,35.311,37.325,35.0 -15:52:20,539.0258,34.726,35.339,39.23,35.0 -15:52:20,539.0767,34.753,35.339,38.747,35.0 -15:52:20,539.1296,34.753,35.367,38.281,35.0 -15:52:20,539.1818,34.726,35.311,37.797,35.0 -15:52:20,539.2344,34.726,35.311,39.221,35.0 -15:52:20,539.2876,34.726,35.339,39.22,35.0 -15:52:20,539.3419,34.753,35.339,38.737,35.0 -15:52:20,539.3946,34.753,35.283,38.27,35.0 -15:52:20,539.4480,34.753,35.367,39.231,35.0 -15:52:20,539.5003,34.726,35.339,37.785,35.0 -15:52:20,539.5527,34.753,35.311,38.727,35.0 -15:52:20,539.6046,34.753,35.339,38.743,35.0 -15:52:20,539.6595,34.753,35.311,38.259,35.0 -15:52:20,539.7117,34.753,35.339,38.738,35.0 -15:52:20,539.7635,34.726,35.311,38.254,35.0 -15:52:21,539.8159,34.698,35.311,39.198,35.0 -15:52:21,539.8669,34.753,35.311,39.678,35.0 -15:52:21,539.9180,34.753,35.311,38.732,35.0 -15:52:21,539.9698,34.753,35.311,38.73,35.0 -15:52:21,540.0235,34.753,35.311,38.728,35.0 -15:52:21,540.0751,34.753,35.311,38.726,35.0 -15:52:21,540.1270,34.726,35.311,38.724,35.0 -15:52:21,540.1790,34.753,35.311,39.187,35.0 -15:52:21,540.2306,34.726,35.311,38.721,35.0 -15:52:21,540.2829,34.726,35.311,39.184,35.0 -15:52:21,540.3345,34.726,35.339,39.183,35.0 -15:52:21,540.3855,34.753,35.283,38.7,35.0 -15:52:21,540.4377,34.726,35.339,39.197,35.0 -15:52:21,540.5015,34.781,35.283,38.697,35.0 -15:52:21,540.5613,34.753,35.311,38.712,35.0 -15:52:21,540.6124,34.753,35.311,38.71,35.0 -15:52:21,540.6648,34.753,35.311,38.708,35.0 -15:52:21,540.7146,34.753,35.283,38.706,35.0 -15:52:21,540.7647,34.726,35.339,39.186,35.0 -15:52:22,540.8306,34.698,35.311,38.686,35.0 -15:52:22,540.8975,34.726,35.339,39.647,35.0 -15:52:22,540.9556,34.753,35.311,38.683,35.0 -15:52:22,541.0258,34.753,35.311,38.698,35.0 -15:52:22,541.0907,34.67,35.311,38.696,35.0 -15:52:22,541.1516,34.726,35.311,40.122,35.0 -15:52:22,541.2105,34.726,35.339,39.159,35.0 -15:52:22,541.2678,34.726,35.339,38.676,35.0 -15:52:22,541.3276,34.698,35.311,38.673,35.0 -15:52:22,541.3861,34.726,35.255,39.635,35.0 -15:52:22,541.4459,34.753,35.311,40.116,35.0 -15:52:22,541.5084,34.726,35.311,38.689,35.0 -15:52:22,541.5686,34.726,35.367,39.151,35.0 -15:52:22,541.6207,34.753,35.339,38.186,35.0 -15:52:22,541.6745,34.753,35.311,38.201,35.0 -15:52:22,541.7272,34.726,35.311,38.68,35.0 -15:52:22,541.7802,34.726,35.283,39.142,35.0 -15:52:23,541.8296,34.726,35.339,39.623,35.0 -15:52:23,541.8795,34.726,35.311,38.659,35.0 -15:52:23,541.9306,34.726,35.311,39.139,35.0 -15:52:23,541.9812,34.753,35.311,39.138,35.0 -15:52:23,542.0314,34.753,35.311,38.672,35.0 -15:52:23,542.0974,34.753,35.339,38.671,35.0 -15:52:23,542.1509,34.726,35.311,38.186,35.0 -15:52:23,542.2037,34.753,35.339,39.13,35.0 -15:52:23,542.2557,34.753,35.339,38.182,35.0 -15:52:23,542.3068,34.753,35.311,38.18,35.0 -15:52:23,542.3574,34.698,35.283,38.659,35.0 -15:52:23,542.4099,34.781,35.311,40.084,35.0 -15:52:23,542.4625,34.726,35.283,38.175,35.0 -15:52:23,542.5113,34.753,35.311,39.601,35.0 -15:52:23,542.5616,34.753,35.283,38.654,35.0 -15:52:23,542.6123,34.726,35.311,39.134,35.0 -15:52:23,542.6624,34.726,35.311,39.116,35.0 -15:52:23,542.7112,34.726,35.339,39.115,35.0 -15:52:23,542.7640,34.726,35.311,38.632,35.0 -15:52:24,542.8164,34.753,35.311,39.112,35.0 -15:52:24,542.8688,34.753,35.311,38.646,35.0 -15:52:24,542.9205,34.726,35.311,38.644,35.0 -15:52:24,542.9728,34.753,35.311,39.107,35.0 -15:52:24,543.0209,34.781,35.311,38.641,35.0 -15:52:24,543.0697,34.726,35.311,38.158,35.0 -15:52:24,543.1183,34.781,35.339,39.101,35.0 -15:52:24,543.1660,34.753,35.339,37.673,35.0 -15:52:24,543.2162,34.753,35.311,38.151,35.0 -15:52:24,543.2655,34.753,35.283,38.63,35.0 -15:52:24,543.3146,34.726,35.311,39.11,35.0 -15:52:24,543.3637,34.726,35.311,39.092,35.0 -15:52:24,543.4122,34.753,35.339,39.091,35.0 -15:52:24,543.4863,34.726,35.339,38.144,35.0 -15:52:24,543.5389,34.726,35.311,38.604,35.0 -15:52:24,543.5914,34.753,35.339,39.084,35.0 -15:52:24,543.6432,34.753,35.311,38.137,35.0 -15:52:24,543.6954,34.726,35.339,38.616,35.0 -15:52:24,543.7482,34.726,35.311,38.597,35.0 -15:52:24,543.8010,34.781,35.255,39.076,35.0 -15:52:25,543.8529,34.726,35.311,39.093,35.0 -15:52:25,543.9035,34.809,35.311,39.074,35.0 -15:52:25,543.9586,34.726,35.311,37.646,35.0 -15:52:25,544.0123,34.726,35.339,39.07,35.0 -15:52:25,544.0637,34.726,35.311,38.587,35.0 -15:52:25,544.1147,34.67,35.311,39.067,35.0 -15:52:25,544.1674,34.753,35.283,40.029,35.0 -15:52:25,544.2196,34.726,35.283,39.083,35.0 -15:52:25,544.2716,34.753,35.283,39.547,35.0 -15:52:25,544.3223,34.726,35.339,39.082,35.0 -15:52:25,544.3737,34.753,35.311,38.582,35.0 -15:52:25,544.4263,34.726,35.311,38.597,35.0 -15:52:25,544.4789,34.726,35.339,39.06,35.0 -15:52:25,544.5324,34.726,35.311,38.577,35.0 -15:52:25,544.5834,34.753,35.311,39.057,35.0 -15:52:25,544.6395,34.698,35.339,38.591,35.0 -15:52:25,544.6927,34.753,35.311,39.054,35.0 -15:52:25,544.7454,34.753,35.339,38.588,35.0 -15:52:25,544.7979,34.753,35.311,38.105,35.0 -15:52:26,544.8494,34.698,35.311,38.583,35.0 -15:52:26,544.9005,34.781,35.283,39.528,35.0 -15:52:26,544.9507,34.726,35.255,38.581,35.0 -15:52:26,545.0043,34.726,35.255,40.007,35.0 -15:52:26,545.0741,34.726,35.311,40.008,35.0 -15:52:26,545.1363,34.698,35.311,39.045,35.0 -15:52:26,545.2008,34.753,35.311,39.525,35.0 -15:52:26,545.2552,34.726,35.311,38.578,35.0 -15:52:26,545.3070,34.726,35.311,39.041,35.0 -15:52:26,545.3596,34.698,35.339,39.04,35.0 -15:52:26,545.4124,34.753,35.311,39.039,35.0 -15:52:26,545.4660,34.753,35.339,38.573,35.0 -15:52:26,545.5207,34.753,35.311,38.089,35.0 -15:52:26,545.5740,34.726,35.311,38.568,35.0 -15:52:26,545.6238,34.726,35.283,39.031,35.0 -15:52:26,545.6729,34.698,35.339,39.511,35.0 -15:52:26,545.7203,34.698,35.339,39.03,35.0 -15:52:26,545.7716,34.753,35.311,39.029,35.0 -15:52:27,545.8200,34.753,35.283,38.563,35.0 -15:52:27,545.8697,34.726,35.311,39.043,35.0 -15:52:27,545.9187,34.726,35.339,39.025,35.0 -15:52:27,545.9696,34.726,35.311,38.542,35.0 -15:52:27,546.0206,34.698,35.311,39.022,35.0 -15:52:27,546.0707,34.753,35.311,39.502,35.0 -15:52:27,546.1190,34.726,35.283,38.556,35.0 -15:52:27,546.1687,34.753,35.283,39.5,35.0 -15:52:27,546.2184,34.726,35.339,39.036,35.0 -15:52:27,546.2687,34.726,35.367,38.536,35.0 -15:52:27,546.3183,34.726,35.311,38.052,35.0 -15:52:27,546.3697,34.726,35.283,39.013,35.0 -15:52:27,546.4176,34.726,35.311,39.493,35.0 -15:52:27,546.4682,34.753,35.283,39.012,35.0 -15:52:27,546.5176,34.726,35.311,39.028,35.0 -15:52:27,546.5703,34.726,35.311,39.009,35.0 -15:52:27,546.6235,34.67,35.339,39.008,35.0 -15:52:27,546.6750,34.726,35.311,39.489,35.0 -15:52:27,546.7284,34.726,35.339,39.007,35.0 -15:52:27,546.7806,34.726,35.311,38.524,35.0 -15:52:28,546.8326,34.698,35.311,39.004,35.0 -15:52:28,546.8842,34.726,35.311,39.484,35.0 -15:52:28,546.9372,34.726,35.339,39.002,35.0 -15:52:28,546.9902,34.726,35.367,38.52,35.0 -15:52:28,547.0434,34.726,35.339,38.036,35.0 -15:52:28,547.0962,34.726,35.283,38.515,35.0 -15:52:28,547.1488,34.726,35.311,39.476,35.0 -15:52:28,547.2017,34.726,35.339,38.994,35.0 -15:52:28,547.2540,34.698,35.283,38.512,35.0 -15:52:28,547.3053,34.753,35.311,39.955,35.0 -15:52:28,547.3546,34.753,35.311,38.527,35.0 -15:52:28,547.4041,34.753,35.283,38.526,35.0 -15:52:28,547.4541,34.753,35.311,39.005,35.0 -15:52:28,547.5041,34.753,35.311,38.523,35.0 -15:52:28,547.5558,34.726,35.283,38.521,35.0 -15:52:28,547.6061,34.726,35.339,39.465,35.0 -15:52:28,547.6554,34.726,35.311,38.502,35.0 -15:52:28,547.7034,34.726,35.311,38.981,35.0 -15:52:28,547.7533,34.781,35.283,38.98,35.0 -15:52:28,547.8030,34.753,35.283,38.515,35.0 -15:52:29,547.8546,34.753,35.311,38.995,35.0 -15:52:29,547.9035,34.67,35.367,38.512,35.0 -15:52:29,547.9527,34.781,35.311,38.975,35.0 -15:52:29,548.0081,34.753,35.311,38.027,35.0 -15:52:29,548.0572,34.726,35.311,38.506,35.0 -15:52:29,548.1064,34.726,35.311,38.969,35.0 -15:52:29,548.1562,34.726,35.339,38.968,35.0 -15:52:29,548.2058,34.753,35.311,38.485,35.0 -15:52:29,548.2548,34.698,35.311,38.501,35.0 -15:52:29,548.3048,34.753,35.311,39.445,35.0 -15:52:29,548.3525,34.726,35.339,38.498,35.0 -15:52:29,548.4026,34.753,35.311,38.48,35.0 -15:52:29,548.4535,34.726,35.367,38.495,35.0 -15:52:29,548.5047,34.698,35.311,37.994,35.0 -15:52:29,548.5573,34.698,35.339,39.436,35.0 -15:52:29,548.6111,34.698,35.339,38.954,35.0 -15:52:29,548.6637,34.753,35.311,38.953,35.0 -15:52:29,548.7147,34.753,35.339,38.488,35.0 -15:52:29,548.7660,34.726,35.311,38.004,35.0 -15:52:30,548.8185,34.698,35.367,38.948,35.0 -15:52:30,548.8683,34.726,35.311,38.465,35.0 -15:52:30,548.9183,34.781,35.311,38.945,35.0 -15:52:30,548.9685,34.698,35.339,37.998,35.0 -15:52:30,549.0172,34.698,35.311,38.941,35.0 -15:52:30,549.0666,34.698,35.311,39.422,35.0 -15:52:30,549.1162,34.726,35.311,39.421,35.0 -15:52:30,549.1655,34.698,35.311,38.939,35.0 -15:52:30,549.2151,34.753,35.283,39.42,35.0 -15:52:30,549.2644,34.726,35.311,38.955,35.0 -15:52:30,549.3141,34.753,35.311,38.937,35.0 -15:52:30,549.3627,34.698,35.311,38.472,35.0 -15:52:30,549.4138,34.67,35.311,39.416,35.0 -15:52:30,549.4637,34.698,35.311,39.897,35.0 -15:52:30,549.5136,34.726,35.283,39.416,35.0 -15:52:30,549.5639,34.726,35.311,39.416,35.0 -15:52:30,549.6141,34.726,35.339,38.934,35.0 -15:52:30,549.6626,34.753,35.311,38.451,35.0 -15:52:30,549.7129,34.753,35.311,38.467,35.0 -15:52:30,549.7621,34.753,35.311,38.465,35.0 -15:52:31,549.8118,34.726,35.311,38.463,35.0 -15:52:31,549.8604,34.698,35.311,38.926,35.0 -15:52:31,549.9100,34.753,35.339,39.406,35.0 -15:52:31,549.9615,34.753,35.311,37.978,35.0 -15:52:31,550.0117,34.726,35.283,38.457,35.0 -15:52:31,550.0658,34.753,35.311,39.401,35.0 -15:52:31,550.1185,34.698,35.311,38.455,35.0 -15:52:31,550.1691,34.726,35.339,39.399,35.0 -15:52:31,550.2225,34.726,35.283,38.436,35.0 -15:52:31,550.2744,34.753,35.311,39.397,35.0 -15:52:31,550.3274,34.726,35.311,38.451,35.0 -15:52:31,550.3798,34.698,35.283,38.913,35.0 -15:52:31,550.4325,34.753,35.311,39.876,35.0 -15:52:31,550.4835,34.726,35.311,38.448,35.0 -15:52:31,550.5347,34.753,35.311,38.911,35.0 -15:52:31,550.5869,34.698,35.367,38.445,35.0 -15:52:31,550.6395,34.726,35.311,38.426,35.0 -15:52:31,550.6925,34.698,35.339,38.906,35.0 -15:52:31,550.7441,34.753,35.283,38.905,35.0 -15:52:31,550.7954,34.753,35.311,38.921,35.0 -15:52:32,550.8477,34.726,35.283,38.438,35.0 -15:52:32,550.8995,34.753,35.311,39.383,35.0 -15:52:32,550.9514,34.753,35.311,38.436,35.0 -15:52:32,551.0057,34.726,35.311,38.434,35.0 -15:52:32,551.0576,34.726,35.311,38.897,35.0 -15:52:32,551.1109,34.726,35.311,38.896,35.0 -15:52:32,551.1624,34.698,35.311,38.895,35.0 -15:52:32,551.2135,34.753,35.311,39.375,35.0 -15:52:32,551.2657,34.726,35.311,38.429,35.0 -15:52:32,551.3189,34.698,35.311,38.891,35.0 -15:52:32,551.3729,34.698,35.311,39.372,35.0 -15:52:32,551.4267,34.726,35.255,39.372,35.0 -15:52:32,551.4795,34.698,35.283,39.853,35.0 -15:52:32,551.5316,34.753,35.339,39.854,35.0 -15:52:32,551.5842,34.753,35.255,37.945,35.0 -15:52:32,551.6362,34.753,35.283,39.387,35.0 -15:52:32,551.6878,34.726,35.311,38.905,35.0 -15:52:32,551.7398,34.753,35.311,38.887,35.0 -15:52:32,551.7925,34.753,35.311,38.421,35.0 -15:52:33,551.8465,34.726,35.311,38.419,35.0 -15:52:33,551.9010,34.698,35.311,38.882,35.0 -15:52:33,551.9576,34.753,35.311,39.362,35.0 -15:52:33,552.0138,34.753,35.283,38.416,35.0 -15:52:33,552.0666,34.726,35.283,38.895,35.0 -15:52:33,552.1210,34.726,35.283,39.359,35.0 -15:52:33,552.1759,34.726,35.283,39.359,35.0 -15:52:33,552.2254,34.726,35.311,39.358,35.0 -15:52:33,552.2757,34.753,35.311,38.876,35.0 -15:52:33,552.3266,34.698,35.311,38.411,35.0 -15:52:33,552.3770,34.753,35.283,39.355,35.0 -15:52:33,552.4277,34.726,35.311,38.89,35.0 -15:52:33,552.4787,34.753,35.283,38.872,35.0 -15:52:33,552.5307,34.726,35.311,38.888,35.0 -15:52:33,552.5828,34.726,35.255,38.87,35.0 -15:52:33,552.6331,34.726,35.311,39.832,35.0 -15:52:33,552.6824,34.753,35.311,38.87,35.0 -15:52:33,552.7335,34.698,35.283,38.404,35.0 -15:52:33,552.7826,34.698,35.339,39.83,35.0 -15:52:34,552.8326,34.726,35.311,38.867,35.0 -15:52:34,552.8827,34.726,35.199,38.866,35.0 -15:52:34,552.9337,34.698,35.311,40.792,35.0 -15:52:34,552.9834,34.67,35.311,39.349,35.0 -15:52:34,553.0335,34.753,35.227,39.83,35.0 -15:52:34,553.0828,34.698,35.283,39.848,35.0 -15:52:34,553.1322,34.726,35.311,39.831,35.0 -15:52:34,553.1833,34.726,35.339,38.869,35.0 -15:52:34,553.2333,34.726,35.339,38.386,35.0 -15:52:34,553.2834,34.726,35.283,38.384,35.0 -15:52:34,553.3347,34.753,35.311,39.345,35.0 -15:52:34,553.3864,34.698,35.311,38.399,35.0 -15:52:34,553.4356,34.67,35.339,39.343,35.0 -15:52:34,553.4862,34.726,35.311,39.343,35.0 -15:52:34,553.5378,34.698,35.283,38.861,35.0 -15:52:34,553.5867,34.726,35.339,39.823,35.0 -15:52:34,553.6376,34.726,35.339,38.379,35.0 -15:52:34,553.6862,34.698,35.283,38.377,35.0 -15:52:34,553.7364,34.726,35.283,39.82,35.0 -15:52:34,553.7868,34.698,35.283,39.339,35.0 -15:52:35,553.8377,34.698,35.283,39.82,35.0 -15:52:35,553.8872,34.698,35.283,39.821,35.0 -15:52:35,553.9361,34.698,35.311,39.822,35.0 -15:52:35,553.9869,34.726,35.311,39.34,35.0 -15:52:35,554.0359,34.67,35.255,38.859,35.0 -15:52:35,554.0863,34.726,35.283,40.784,35.0 -15:52:35,554.1355,34.726,35.311,39.341,35.0 -15:52:35,554.1847,34.726,35.311,38.859,35.0 -15:52:35,554.2376,34.698,35.311,38.858,35.0 -15:52:35,554.2860,34.726,35.311,39.339,35.0 -15:52:35,554.3342,34.809,35.311,38.857,35.0 -15:52:35,554.3862,34.781,35.311,37.428,35.0 -15:52:35,554.4352,34.726,35.311,37.907,35.0 -15:52:35,554.4929,34.698,35.227,38.85,35.0 -15:52:35,554.5442,34.698,35.311,40.776,35.0 -15:52:35,554.5950,34.753,35.283,39.333,35.0 -15:52:35,554.6442,34.698,35.311,38.868,35.0 -15:52:35,554.6943,34.753,35.255,39.332,35.0 -15:52:35,554.7442,34.753,35.283,39.349,35.0 -15:52:35,554.7933,34.698,35.311,38.867,35.0 -15:52:36,554.8438,34.726,35.311,39.33,35.0 -15:52:36,554.8927,34.726,35.283,38.848,35.0 -15:52:36,554.9425,34.698,35.283,39.329,35.0 -15:52:36,554.9923,34.726,35.283,39.81,35.0 -15:52:36,555.0409,34.698,35.311,39.329,35.0 -15:52:36,555.0916,34.726,35.311,39.329,35.0 -15:52:36,555.1424,34.726,35.311,38.847,35.0 -15:52:36,555.1919,34.726,35.283,38.846,35.0 -15:52:36,555.2443,34.753,35.311,39.327,35.0 -15:52:36,555.2949,34.698,35.311,38.38,35.0 -15:52:36,555.3479,34.753,35.255,39.324,35.0 -15:52:36,555.3985,34.698,35.283,39.341,35.0 -15:52:36,555.4490,34.726,35.311,39.806,35.0 -15:52:36,555.5037,34.726,35.283,38.843,35.0 -15:52:36,555.5608,34.698,35.311,39.323,35.0 -15:52:36,555.6106,34.753,35.283,39.323,35.0 -15:52:36,555.6604,34.726,35.283,38.858,35.0 -15:52:36,555.7117,34.726,35.367,39.322,35.0 -15:52:36,555.7613,34.698,35.311,37.877,35.0 -15:52:37,555.8418,34.726,35.311,39.319,35.0 -15:52:37,555.9151,34.698,35.311,38.836,35.0 -15:52:37,555.9760,34.726,35.311,39.317,35.0 -15:52:37,556.0516,34.698,35.339,38.835,35.0 -15:52:37,556.1213,34.726,35.283,38.833,35.0 -15:52:37,556.1883,34.726,35.311,39.313,35.0 -15:52:37,556.2548,34.753,35.283,38.831,35.0 -15:52:37,556.3206,34.726,35.311,38.847,35.0 -15:52:37,556.3836,34.726,35.311,38.828,35.0 -15:52:37,556.4456,34.726,35.283,38.827,35.0 -15:52:37,556.5094,34.726,35.311,39.308,35.0 -15:52:37,556.5732,34.698,35.311,38.825,35.0 -15:52:37,556.6373,34.698,35.255,39.306,35.0 -15:52:37,556.6922,34.698,35.367,40.269,35.0 -15:52:37,556.7473,34.726,35.311,38.344,35.0 -15:52:37,556.8057,34.753,35.283,38.824,35.0 -15:52:38,556.8577,34.698,35.311,38.84,35.0 -15:52:38,556.9093,34.726,35.283,39.303,35.0 -15:52:38,556.9597,34.753,35.283,39.303,35.0 -15:52:38,557.0097,34.726,35.311,38.838,35.0 -15:52:38,557.0583,34.726,35.283,38.82,35.0 -15:52:38,557.1171,34.726,35.311,39.3,35.0 -15:52:38,557.1798,34.698,35.311,38.818,35.0 -15:52:38,557.2302,34.726,35.311,39.299,35.0 -15:52:38,557.2811,34.726,35.255,38.817,35.0 -15:52:38,557.3326,34.726,35.339,39.779,35.0 -15:52:38,557.3827,34.726,35.311,38.335,35.0 -15:52:38,557.4337,34.698,35.283,38.814,35.0 -15:52:38,557.4868,34.753,35.283,39.777,35.0 -15:52:38,557.5364,34.753,35.283,38.831,35.0 -15:52:38,557.5861,34.698,35.255,38.83,35.0 -15:52:38,557.6374,34.726,35.255,40.257,35.0 -15:52:38,557.6874,34.753,35.311,39.776,35.0 -15:52:38,557.7381,34.753,35.311,38.349,35.0 -15:52:38,557.7882,34.753,35.311,38.347,35.0 -15:52:39,557.8388,34.726,35.283,38.346,35.0 -15:52:39,557.8883,34.753,35.283,39.29,35.0 -15:52:39,557.9405,34.698,35.311,38.825,35.0 -15:52:39,557.9917,34.726,35.311,39.288,35.0 -15:52:39,558.0426,34.726,35.311,38.807,35.0 -15:52:39,558.0925,34.753,35.339,38.805,35.0 -15:52:39,558.1419,34.698,35.311,37.858,35.0 -15:52:39,558.1921,34.698,35.311,39.283,35.0 -15:52:39,558.2429,34.726,35.311,39.283,35.0 -15:52:39,558.2942,34.726,35.311,38.801,35.0 -15:52:39,558.3451,34.726,35.311,38.8,35.0 -15:52:39,558.3955,34.698,35.283,38.799,35.0 -15:52:39,558.4471,34.698,35.283,39.761,35.0 -15:52:39,558.4988,34.726,35.311,39.762,35.0 -15:52:39,558.5499,34.698,35.283,38.799,35.0 -15:52:39,558.5992,34.698,35.311,39.761,35.0 -15:52:39,558.6492,34.698,35.311,39.28,35.0 -15:52:39,558.6985,34.753,35.311,39.28,35.0 -15:52:39,558.7481,34.781,35.311,38.334,35.0 -15:52:39,558.7984,34.726,35.311,37.85,35.0 -15:52:40,558.8490,34.726,35.283,38.794,35.0 -15:52:40,558.8987,34.67,35.311,39.274,35.0 -15:52:40,558.9485,34.698,35.311,39.756,35.0 -15:52:40,558.9979,34.726,35.311,39.275,35.0 -15:52:40,559.0482,34.753,35.283,38.793,35.0 -15:52:40,559.0978,34.698,35.311,38.809,35.0 -15:52:40,559.1482,34.753,35.227,39.272,35.0 -15:52:40,559.1983,34.753,35.283,39.771,35.0 -15:52:40,559.2502,34.726,35.311,38.808,35.0 -15:52:40,559.2992,34.753,35.255,38.79,35.0 -15:52:40,559.3499,34.726,35.339,39.288,35.0 -15:52:40,559.3986,34.726,35.311,38.307,35.0 -15:52:40,559.4487,34.753,35.283,38.787,35.0 -15:52:40,559.4984,34.753,35.283,38.803,35.0 -15:52:40,559.5483,34.698,35.171,38.802,35.0 -15:52:40,559.5991,34.726,35.311,41.673,35.0 -15:52:40,559.6516,34.698,35.311,38.787,35.0 -15:52:40,559.7023,34.753,35.311,39.268,35.0 -15:52:40,559.7536,34.698,35.311,38.322,35.0 -15:52:40,559.8044,34.698,35.283,39.266,35.0 -15:52:41,559.8557,34.726,35.255,39.747,35.0 -15:52:41,559.9063,34.726,35.339,39.748,35.0 -15:52:41,559.9577,34.726,35.311,38.303,35.0 -15:52:41,560.0083,34.726,35.311,38.783,35.0 -15:52:41,560.0587,34.726,35.311,38.782,35.0 -15:52:41,560.1088,34.698,35.311,38.781,35.0 -15:52:41,560.1637,34.698,35.311,39.262,35.0 -15:52:41,560.2147,34.726,35.283,39.261,35.0 -15:52:41,560.2686,34.726,35.283,39.261,35.0 -15:52:41,560.3173,34.698,35.255,39.261,35.0 -15:52:41,560.3692,34.753,35.311,40.224,35.0 -15:52:41,560.4210,34.726,35.311,38.316,35.0 -15:52:41,560.4723,34.698,35.311,38.778,35.0 -15:52:41,560.5232,34.698,35.311,39.259,35.0 -15:52:41,560.5746,34.753,35.255,39.259,35.0 -15:52:41,560.6264,34.726,35.283,39.275,35.0 -15:52:41,560.6776,34.781,35.283,39.258,35.0 -15:52:41,560.7285,34.698,35.339,38.312,35.0 -15:52:41,560.7795,34.698,35.283,38.774,35.0 -15:52:42,560.8294,34.698,35.311,39.736,35.0 -15:52:42,560.8801,34.726,35.367,39.255,35.0 -15:52:42,560.9311,34.698,35.283,37.81,35.0 -15:52:42,560.9825,34.753,35.311,39.734,35.0 -15:52:42,561.0369,34.726,35.311,38.307,35.0 -15:52:42,561.0892,34.726,35.339,38.769,35.0 -15:52:42,561.1401,34.698,35.283,38.287,35.0 -15:52:42,561.1916,34.698,35.311,39.73,35.0 -15:52:42,561.2424,34.726,35.283,39.249,35.0 -15:52:42,561.2923,34.726,35.311,39.248,35.0 -15:52:42,561.3423,34.726,35.311,38.766,35.0 -15:52:42,561.3937,34.698,35.311,38.765,35.0 -15:52:42,561.4445,34.753,35.283,39.246,35.0 -15:52:42,561.4952,34.753,35.339,38.781,35.0 -15:52:42,561.5451,34.698,35.255,37.817,35.0 -15:52:42,561.5964,34.698,35.283,40.205,35.0 -15:52:42,561.6472,34.698,35.283,39.725,35.0 -15:52:42,561.6979,34.698,35.311,39.726,35.0 -15:52:42,561.7492,34.698,35.311,39.244,35.0 -15:52:42,561.8017,34.726,35.283,39.244,35.0 -15:52:43,561.8525,34.726,35.311,39.244,35.0 -15:52:43,561.9031,34.726,35.311,38.762,35.0 -15:52:43,561.9544,34.726,35.283,38.761,35.0 -15:52:43,562.0051,34.726,35.283,39.242,35.0 -15:52:43,562.0567,34.726,35.311,39.241,35.0 -15:52:43,562.1081,34.753,35.283,38.759,35.0 -15:52:43,562.1573,34.698,35.311,38.775,35.0 -15:52:43,562.2074,34.726,35.283,39.239,35.0 -15:52:43,562.2577,34.726,35.311,39.239,35.0 -15:52:43,562.3062,34.726,35.283,38.757,35.0 -15:52:43,562.3564,34.726,35.311,39.237,35.0 -15:52:43,562.4074,34.726,35.283,38.755,35.0 -15:52:43,562.4576,34.753,35.283,39.236,35.0 -15:52:43,562.5064,34.726,35.311,38.771,35.0 -15:52:43,562.5571,34.726,35.311,38.753,35.0 -15:52:43,562.6077,34.642,35.311,38.752,35.0 -15:52:43,562.6600,34.726,35.311,40.196,35.0 -15:52:43,562.7116,34.726,35.311,38.752,35.0 -15:52:43,562.7622,34.726,35.311,38.751,35.0 -15:52:44,562.8134,34.726,35.311,38.75,35.0 -15:52:44,562.8655,34.753,35.283,38.749,35.0 -15:52:44,562.9160,34.726,35.283,38.765,35.0 -15:52:44,562.9678,34.698,35.283,39.229,35.0 -15:52:44,563.0169,34.698,35.283,39.71,35.0 -15:52:44,563.0689,34.753,35.283,39.71,35.0 -15:52:44,563.1194,34.698,35.311,38.765,35.0 -15:52:44,563.1700,34.726,35.283,39.228,35.0 -15:52:44,563.2215,34.726,35.255,39.228,35.0 -15:52:44,563.2725,34.698,35.311,39.709,35.0 -15:52:44,563.3225,34.698,35.311,39.228,35.0 -15:52:44,563.3745,34.698,35.283,39.228,35.0 -15:52:44,563.4243,34.781,35.283,39.709,35.0 -15:52:44,563.4755,34.698,35.311,38.282,35.0 -15:52:44,563.5253,34.753,35.283,39.227,35.0 -15:52:44,563.5758,34.698,35.311,38.762,35.0 -15:52:44,563.6262,34.726,35.311,39.225,35.0 -15:52:44,563.6787,34.698,35.311,38.743,35.0 -15:52:44,563.7289,34.726,35.311,39.224,35.0 -15:52:44,563.7793,34.698,35.283,38.742,35.0 -15:52:45,563.8283,34.753,35.339,39.704,35.0 -15:52:45,563.8780,34.753,35.283,37.796,35.0 -15:52:45,563.9276,34.726,35.311,38.756,35.0 -15:52:45,563.9773,34.726,35.283,38.738,35.0 -15:52:45,564.0279,34.726,35.339,39.218,35.0 -15:52:45,564.0780,34.753,35.283,38.255,35.0 -15:52:45,564.1282,34.726,35.311,38.752,35.0 -15:52:45,564.1787,34.726,35.283,38.734,35.0 -15:52:45,564.2307,34.698,35.283,39.214,35.0 -15:52:45,564.2811,34.698,35.339,39.696,35.0 -15:52:45,564.3313,34.726,35.311,38.733,35.0 -15:52:45,564.3823,34.698,35.311,38.732,35.0 -15:52:45,564.4341,34.698,35.311,39.212,35.0 -15:52:45,564.4859,34.698,35.255,39.212,35.0 -15:52:45,564.5362,34.753,35.283,40.175,35.0 -15:52:45,564.5865,34.753,35.283,38.749,35.0 -15:52:45,564.6369,34.698,35.283,38.748,35.0 -15:52:45,564.6893,34.781,35.367,39.693,35.0 -15:52:45,564.7393,34.726,35.283,36.821,35.0 -15:52:45,564.7896,34.698,35.311,39.207,35.0 -15:52:46,564.8396,34.726,35.311,39.207,35.0 -15:52:46,564.8906,34.726,35.283,38.725,35.0 -15:52:46,564.9403,34.698,35.283,39.206,35.0 -15:52:46,564.9900,34.726,35.283,39.687,35.0 -15:52:46,565.0410,34.726,35.311,39.206,35.0 -15:52:46,565.0926,34.67,35.283,38.724,35.0 -15:52:46,565.1443,34.67,35.283,40.168,35.0 -15:52:46,565.1946,34.698,35.311,40.169,35.0 -15:52:46,565.2475,34.698,35.283,39.208,35.0 -15:52:46,565.2989,34.753,35.311,39.689,35.0 -15:52:46,565.3511,34.726,35.283,38.262,35.0 -15:52:46,565.4021,34.67,35.283,39.206,35.0 -15:52:46,565.4547,34.726,35.283,40.169,35.0 -15:52:46,565.5058,34.753,35.227,39.207,35.0 -15:52:46,565.5565,34.726,35.311,39.706,35.0 -15:52:46,565.6059,34.753,35.283,38.726,35.0 -15:52:46,565.6575,34.698,35.311,38.742,35.0 -15:52:46,565.7075,34.698,35.311,39.205,35.0 -15:52:46,565.7579,34.726,35.311,39.205,35.0 -15:52:47,565.8097,34.698,35.367,38.723,35.0 -15:52:47,565.8603,34.698,35.311,38.24,35.0 -15:52:47,565.9107,34.726,35.255,39.202,35.0 -15:52:47,565.9620,34.698,35.283,39.683,35.0 -15:52:47,566.0130,34.698,35.283,39.684,35.0 -15:52:47,566.0645,34.753,35.283,39.684,35.0 -15:52:47,566.1174,34.698,35.283,38.739,35.0 -15:52:47,566.1693,34.726,35.283,39.684,35.0 -15:52:47,566.2213,34.726,35.283,39.203,35.0 -15:52:47,566.2735,34.698,35.367,39.202,35.0 -15:52:47,566.3236,34.698,35.283,38.239,35.0 -15:52:47,566.3744,34.698,35.311,39.682,35.0 -15:52:47,566.4256,34.753,35.311,39.201,35.0 -15:52:47,566.4785,34.726,35.255,38.254,35.0 -15:52:47,566.5305,34.726,35.283,39.68,35.0 -15:52:47,566.5818,34.698,35.283,39.199,35.0 -15:52:47,566.6347,34.67,35.283,39.681,35.0 -15:52:47,566.6852,34.726,35.283,40.163,35.0 -15:52:47,566.7360,34.726,35.283,39.201,35.0 -15:52:47,566.7867,34.698,35.283,39.201,35.0 -15:52:48,566.8377,34.698,35.311,39.682,35.0 -15:52:48,566.8898,34.698,35.283,39.201,35.0 -15:52:48,566.9421,34.698,35.283,39.682,35.0 -15:52:48,566.9935,34.698,35.311,39.683,35.0 -15:52:48,567.0448,34.698,35.311,39.202,35.0 -15:52:48,567.0962,34.642,35.283,39.202,35.0 -15:52:48,567.1467,34.753,35.283,40.646,35.0 -15:52:48,567.1968,34.698,35.283,38.739,35.0 -15:52:48,567.2495,34.698,35.311,39.684,35.0 -15:52:48,567.2997,34.698,35.311,39.203,35.0 -15:52:48,567.3524,34.698,35.311,39.203,35.0 -15:52:48,567.4034,34.753,35.311,39.202,35.0 -15:52:48,567.4544,34.753,35.283,38.256,35.0 -15:52:48,567.5060,34.698,35.311,38.736,35.0 -15:52:48,567.5574,34.726,35.227,39.199,35.0 -15:52:48,567.6087,34.698,35.311,40.162,35.0 -15:52:48,567.6604,34.726,35.311,39.2,35.0 -15:52:48,567.7125,34.67,35.339,38.718,35.0 -15:52:48,567.7655,34.726,35.311,39.199,35.0 -15:52:49,567.8178,34.698,35.311,38.717,35.0 -15:52:49,567.8717,34.698,35.311,39.198,35.0 -15:52:49,567.9250,34.698,35.283,39.197,35.0 -15:52:49,567.9783,34.698,35.311,39.679,35.0 -15:52:49,568.0312,34.753,35.311,39.198,35.0 -15:52:49,568.0854,34.615,35.311,38.251,35.0 -15:52:49,568.1386,34.726,35.283,40.623,35.0 -15:52:49,568.1922,34.698,35.311,39.198,35.0 -15:52:49,568.2457,34.726,35.283,39.198,35.0 -15:52:49,568.2987,34.698,35.255,39.197,35.0 -15:52:49,568.3522,34.698,35.283,40.16,35.0 -15:52:49,568.4064,34.726,35.283,39.68,35.0 -15:52:49,568.4597,34.698,35.283,39.199,35.0 -15:52:49,568.5139,34.67,35.311,39.68,35.0 -15:52:49,568.5671,34.698,35.311,39.681,35.0 -15:52:49,568.6211,34.698,35.339,39.2,35.0 -15:52:49,568.6761,34.698,35.311,38.718,35.0 -15:52:49,568.7288,34.698,35.283,39.198,35.0 -15:52:49,568.7824,34.753,35.283,39.68,35.0 -15:52:50,568.8374,34.67,35.311,38.734,35.0 -15:52:50,568.8934,34.753,35.283,39.679,35.0 -15:52:50,568.9466,34.698,35.311,38.734,35.0 -15:52:50,569.0025,34.726,35.283,39.197,35.0 -15:52:50,569.0568,34.726,35.283,39.197,35.0 -15:52:50,569.1104,34.726,35.283,39.197,35.0 -15:52:50,569.1637,34.753,35.283,39.196,35.0 -15:52:50,569.2214,34.726,35.283,38.732,35.0 -15:52:50,569.2748,34.698,35.311,39.195,35.0 -15:52:50,569.3281,34.698,35.311,39.195,35.0 -15:52:50,569.3806,34.698,35.311,39.194,35.0 -15:52:50,569.4362,34.698,35.311,39.194,35.0 -15:52:50,569.4894,34.698,35.283,39.194,35.0 -15:52:50,569.5422,34.753,35.283,39.675,35.0 -15:52:50,569.5956,34.698,35.283,38.73,35.0 -15:52:50,569.6491,34.67,35.283,39.675,35.0 -15:52:50,569.7016,34.726,35.311,40.157,35.0 -15:52:50,569.7540,34.698,35.283,38.713,35.0 -15:52:50,569.8071,34.753,35.283,39.676,35.0 -15:52:51,569.8604,34.726,35.311,38.73,35.0 -15:52:51,569.9131,34.698,35.283,38.712,35.0 -15:52:51,569.9678,34.698,35.311,39.674,35.0 -15:52:51,570.0216,34.698,35.283,39.193,35.0 -15:52:51,570.0746,34.726,35.283,39.674,35.0 -15:52:51,570.1277,34.698,35.311,39.193,35.0 -15:52:51,570.1821,34.726,35.311,39.193,35.0 -15:52:51,570.2352,34.698,35.311,38.711,35.0 -15:52:51,570.2901,34.698,35.283,39.191,35.0 -15:52:51,570.3438,34.698,35.283,39.673,35.0 -15:52:51,570.3973,34.726,35.311,39.673,35.0 -15:52:51,570.4530,34.726,35.255,38.711,35.0 -15:52:51,570.5107,34.698,35.283,39.673,35.0 -15:52:51,570.5666,34.753,35.283,39.674,35.0 -15:52:51,570.6171,34.726,35.283,38.728,35.0 -15:52:51,570.6675,34.726,35.255,39.191,35.0 -15:52:51,570.7189,34.698,35.283,39.673,35.0 -15:52:51,570.7712,34.726,35.283,39.673,35.0 -15:52:52,570.8337,34.753,35.339,39.192,35.0 -15:52:52,570.9137,34.698,35.255,37.763,35.0 -15:52:52,570.9758,34.698,35.311,40.153,35.0 -15:52:52,571.0398,34.726,35.283,39.191,35.0 -15:52:52,571.1009,34.753,35.255,39.19,35.0 -15:52:52,571.1654,34.753,35.283,39.207,35.0 -15:52:52,571.2247,34.698,35.311,38.725,35.0 -15:52:52,571.2828,34.726,35.255,39.188,35.0 -15:52:52,571.3442,34.753,35.283,39.67,35.0 -15:52:52,571.4057,34.698,35.283,38.724,35.0 -15:52:52,571.4666,34.726,35.283,39.669,35.0 -15:52:52,571.5270,34.726,35.283,39.188,35.0 -15:52:52,571.5847,34.698,35.283,39.188,35.0 -15:52:52,571.6430,34.753,35.339,39.669,35.0 -15:52:52,571.6976,34.726,35.283,37.76,35.0 -15:52:52,571.7536,34.698,35.255,39.185,35.0 -15:52:52,571.8080,34.67,35.311,40.148,35.0 -15:52:53,571.8598,34.698,35.283,39.668,35.0 -15:52:53,571.9114,34.753,35.227,39.669,35.0 -15:52:53,571.9623,34.698,35.311,39.686,35.0 -15:52:53,572.0151,34.726,35.283,39.188,35.0 -15:52:53,572.0666,34.753,35.255,39.188,35.0 -15:52:53,572.1350,34.726,35.311,39.205,35.0 -15:52:53,572.1873,34.67,35.339,38.705,35.0 -15:52:53,572.2393,34.698,35.283,39.186,35.0 -15:52:53,572.2906,34.753,35.283,39.667,35.0 -15:52:53,572.3419,34.698,35.283,38.722,35.0 -15:52:53,572.3934,34.726,35.255,39.667,35.0 -15:52:53,572.4456,34.726,35.311,39.667,35.0 -15:52:53,572.4971,34.698,35.283,38.705,35.0 -15:52:53,572.5476,34.698,35.311,39.667,35.0 -15:52:53,572.6034,34.698,35.283,39.186,35.0 -15:52:53,572.6556,34.753,35.311,39.667,35.0 -15:52:53,572.7071,34.698,35.311,38.24,35.0 -15:52:53,572.7591,34.698,35.311,39.184,35.0 -15:52:54,572.8109,34.698,35.283,39.184,35.0 -15:52:54,572.8622,34.698,35.339,39.665,35.0 -15:52:54,572.9131,34.726,35.311,38.703,35.0 -15:52:54,572.9646,34.698,35.311,38.701,35.0 -15:52:54,573.0158,34.698,35.311,39.182,35.0 -15:52:54,573.0676,34.698,35.311,39.182,35.0 -15:52:54,573.1194,34.726,35.199,39.181,35.0 -15:52:54,573.1708,34.67,35.283,40.626,35.0 -15:52:54,573.2232,34.726,35.283,40.147,35.0 -15:52:54,573.2747,34.698,35.283,39.185,35.0 -15:52:54,573.3248,34.753,35.283,39.666,35.0 -15:52:54,573.3758,34.726,35.283,38.721,35.0 -15:52:54,573.4272,34.698,35.283,39.184,35.0 -15:52:54,573.4783,34.726,35.311,39.665,35.0 -15:52:54,573.5307,34.698,35.283,38.703,35.0 -15:52:54,573.5807,34.726,35.283,39.665,35.0 -15:52:54,573.6307,34.753,35.283,39.184,35.0 -15:52:54,573.6811,34.698,35.311,38.719,35.0 -15:52:54,573.7308,34.726,35.339,39.183,35.0 -15:52:54,573.7816,34.698,35.283,38.219,35.0 -15:52:55,573.8326,34.698,35.283,39.662,35.0 -15:52:55,573.8822,34.726,35.311,39.663,35.0 -15:52:55,573.9326,34.726,35.339,38.7,35.0 -15:52:55,573.9808,34.67,35.311,38.217,35.0 -15:52:55,574.0316,34.698,35.311,39.66,35.0 -15:52:55,574.0833,34.698,35.311,39.179,35.0 -15:52:55,574.1348,34.726,35.283,39.179,35.0 -15:52:55,574.1861,34.726,35.311,39.179,35.0 -15:52:55,574.2385,34.726,35.311,38.697,35.0 -15:52:55,574.2893,34.753,35.283,38.696,35.0 -15:52:55,574.3411,34.67,35.283,38.712,35.0 -15:52:55,574.3928,34.698,35.311,40.138,35.0 -15:52:55,574.4450,34.726,35.227,39.177,35.0 -15:52:55,574.4968,34.726,35.311,40.14,35.0 -15:52:55,574.5487,34.698,35.339,38.696,35.0 -15:52:55,574.6005,34.698,35.283,38.695,35.0 -15:52:55,574.6512,34.726,35.283,39.657,35.0 -15:52:55,574.7027,34.67,35.283,39.176,35.0 -15:52:55,574.7544,34.698,35.283,40.139,35.0 -15:52:55,574.8060,34.698,35.283,39.659,35.0 -15:52:56,574.8573,34.698,35.283,39.659,35.0 -15:52:56,574.9080,34.698,35.255,39.66,35.0 -15:52:56,574.9584,34.753,35.283,40.142,35.0 -15:52:56,575.0094,34.698,35.283,38.716,35.0 -15:52:56,575.0603,34.67,35.283,39.661,35.0 -15:52:56,575.1104,34.753,35.283,40.143,35.0 -15:52:56,575.1676,34.726,35.311,38.717,35.0 -15:52:56,575.2241,34.698,35.283,38.698,35.0 -15:52:56,575.2769,34.726,35.311,39.661,35.0 -15:52:56,575.3290,34.726,35.311,38.698,35.0 -15:52:56,575.3803,34.726,35.283,38.697,35.0 -15:52:56,575.4324,34.698,35.311,39.177,35.0 -15:52:56,575.4876,34.698,35.283,39.177,35.0 -15:52:56,575.5390,34.753,35.339,39.658,35.0 -15:52:56,575.6083,34.753,35.283,37.75,35.0 -15:52:56,575.6614,34.67,35.311,38.71,35.0 -15:52:56,575.7124,34.67,35.283,39.655,35.0 -15:52:56,575.7648,34.698,35.283,40.137,35.0 -15:52:57,575.8270,34.698,35.311,39.657,35.0 -15:52:57,575.8896,34.753,35.283,39.176,35.0 -15:52:57,575.9425,34.726,35.283,38.711,35.0 -15:52:57,575.9931,34.67,35.339,39.174,35.0 -15:52:57,576.0438,34.698,35.283,39.174,35.0 -15:52:57,576.0935,34.698,35.283,39.655,35.0 -15:52:57,576.1441,34.726,35.283,39.656,35.0 -15:52:57,576.1941,34.67,35.255,39.175,35.0 -15:52:57,576.2451,34.698,35.283,40.619,35.0 -15:52:57,576.2976,34.698,35.311,39.658,35.0 -15:52:57,576.3523,34.753,35.255,39.177,35.0 -15:52:57,576.4080,34.698,35.255,39.194,35.0 -15:52:57,576.4618,34.753,35.311,40.14,35.0 -15:52:57,576.5142,34.726,35.255,38.232,35.0 -15:52:57,576.5649,34.726,35.283,39.658,35.0 -15:52:57,576.6153,34.726,35.283,39.177,35.0 -15:52:57,576.6656,34.698,35.255,39.176,35.0 -15:52:57,576.7162,34.698,35.283,40.139,35.0 -15:52:57,576.7658,34.753,35.283,39.659,35.0 -15:52:58,576.8189,34.698,35.311,38.714,35.0 -15:52:58,576.8732,34.698,35.283,39.177,35.0 -15:52:58,576.9279,34.726,35.283,39.658,35.0 -15:52:58,576.9795,34.698,35.283,39.177,35.0 -15:52:58,577.0307,34.698,35.255,39.659,35.0 -15:52:58,577.0806,34.726,35.283,40.141,35.0 -15:52:58,577.1334,34.642,35.339,39.179,35.0 -15:52:58,577.1903,34.698,35.283,39.66,35.0 -15:52:58,577.2465,34.698,35.339,39.661,35.0 -15:52:58,577.2970,34.726,35.227,38.698,35.0 -15:52:58,577.3485,34.726,35.283,40.142,35.0 -15:52:58,577.3987,34.726,35.283,39.18,35.0 -15:52:58,577.4504,34.67,35.311,39.18,35.0 -15:52:58,577.5050,34.67,35.339,39.661,35.0 -15:52:58,577.5578,34.698,35.283,39.18,35.0 -15:52:58,577.6137,34.698,35.283,39.662,35.0 -15:52:58,577.6683,34.698,35.283,39.662,35.0 -15:52:58,577.7198,34.726,35.283,39.663,35.0 -15:52:58,577.7705,34.726,35.311,39.182,35.0 -15:52:59,577.8211,34.726,35.283,38.7,35.0 -15:52:59,577.8723,34.698,35.283,39.18,35.0 -15:52:59,577.9233,34.726,35.283,39.662,35.0 -15:52:59,577.9767,34.698,35.283,39.181,35.0 -15:52:59,578.0341,34.726,35.311,39.662,35.0 -15:52:59,578.0873,34.67,35.283,38.699,35.0 -15:52:59,578.1369,34.726,35.255,40.143,35.0 -15:52:59,578.1881,34.698,35.227,39.663,35.0 -15:52:59,578.2394,34.67,35.311,40.627,35.0 -15:52:59,578.2948,34.67,35.283,39.665,35.0 -15:52:59,578.3464,34.698,35.311,40.148,35.0 -15:52:59,578.3975,34.726,35.227,39.186,35.0 -15:52:59,578.4496,34.698,35.255,40.149,35.0 -15:52:59,578.5095,34.726,35.283,40.15,35.0 -15:52:59,578.5603,34.698,35.283,39.188,35.0 -15:52:59,578.6101,34.726,35.227,39.67,35.0 -15:52:59,578.6599,34.698,35.311,40.152,35.0 -15:52:59,578.7108,34.698,35.339,39.19,35.0 -15:52:59,578.7602,34.698,35.311,38.708,35.0 -15:53:00,578.8108,34.67,35.255,39.189,35.0 -15:53:00,578.8609,34.67,35.283,40.633,35.0 -15:53:00,578.9103,34.698,35.283,40.154,35.0 -15:53:00,578.9606,34.698,35.283,39.674,35.0 -15:53:00,579.0100,34.67,35.311,39.674,35.0 -15:53:00,579.0597,34.781,35.283,39.675,35.0 -15:53:00,579.1098,34.698,35.283,38.248,35.0 -15:53:00,579.1596,34.698,35.283,39.673,35.0 -15:53:00,579.2102,34.698,35.283,39.674,35.0 -15:53:00,579.2606,34.698,35.339,39.674,35.0 -15:53:00,579.3111,34.698,35.283,38.712,35.0 -15:53:00,579.3606,34.67,35.311,39.674,35.0 -15:53:00,579.4092,34.726,35.283,39.674,35.0 -15:53:00,579.4594,34.753,35.283,39.193,35.0 -15:53:00,579.5111,34.726,35.283,38.729,35.0 -15:53:00,579.5607,34.726,35.283,39.192,35.0 -15:53:00,579.6102,34.726,35.255,39.192,35.0 -15:53:00,579.6594,34.698,35.311,39.673,35.0 -15:53:00,579.7115,34.753,35.283,39.192,35.0 -15:53:00,579.7632,34.698,35.311,38.727,35.0 -15:53:01,579.8135,34.67,35.283,39.191,35.0 -15:53:01,579.8627,34.726,35.283,40.154,35.0 -15:53:01,579.9142,34.698,35.283,39.192,35.0 -15:53:01,579.9643,34.642,35.283,39.673,35.0 -15:53:01,580.0117,34.726,35.283,40.637,35.0 -15:53:01,580.0628,34.726,35.283,39.194,35.0 -15:53:01,580.1116,34.753,35.283,39.194,35.0 -15:53:01,580.1609,34.698,35.283,38.729,35.0 -15:53:01,580.2131,34.753,35.311,39.674,35.0 -15:53:01,580.2628,34.698,35.311,38.247,35.0 -15:53:01,580.3127,34.726,35.255,39.191,35.0 -15:53:01,580.3635,34.698,35.283,39.673,35.0 -15:53:01,580.4124,34.726,35.283,39.673,35.0 -15:53:01,580.4615,34.698,35.283,39.192,35.0 -15:53:01,580.5138,34.726,35.283,39.674,35.0 -15:53:01,580.5631,34.698,35.283,39.193,35.0 -15:53:01,580.6138,34.698,35.311,39.674,35.0 -15:53:01,580.6665,34.67,35.283,39.193,35.0 -15:53:01,580.7184,34.698,35.255,40.156,35.0 -15:53:01,580.7685,34.726,35.227,40.157,35.0 -15:53:02,580.8187,34.698,35.311,40.159,35.0 -15:53:02,580.8695,34.698,35.311,39.197,35.0 -15:53:02,580.9207,34.726,35.283,39.196,35.0 -15:53:02,580.9720,34.726,35.283,39.196,35.0 -15:53:02,581.0239,34.753,35.143,39.196,35.0 -15:53:02,581.0746,34.726,35.283,41.139,35.0 -15:53:02,581.1248,34.698,35.311,39.199,35.0 -15:53:02,581.1749,34.726,35.283,39.198,35.0 -15:53:02,581.2265,34.698,35.283,39.198,35.0 -15:53:02,581.2795,34.698,35.283,39.68,35.0 -15:53:02,581.3296,34.726,35.311,39.68,35.0 -15:53:02,581.3822,34.698,35.283,38.717,35.0 -15:53:02,581.4330,34.698,35.311,39.68,35.0 -15:53:02,581.4849,34.698,35.283,39.199,35.0 -15:53:02,581.5389,34.726,35.255,39.68,35.0 -15:53:02,581.5924,34.698,35.255,39.681,35.0 -15:53:02,581.6454,34.698,35.255,40.163,35.0 -15:53:02,581.6964,34.726,35.283,40.164,35.0 -15:53:02,581.7478,34.67,35.311,39.202,35.0 -15:53:02,581.8003,34.726,35.283,39.684,35.0 -15:53:03,581.8538,34.698,35.311,39.203,35.0 -15:53:03,581.9084,34.67,35.283,39.202,35.0 -15:53:03,581.9615,34.726,35.283,40.165,35.0 -15:53:03,582.0144,34.726,35.283,39.204,35.0 -15:53:03,582.0674,34.698,35.255,39.203,35.0 -15:53:03,582.1206,34.726,35.283,40.166,35.0 -15:53:03,582.1757,34.726,35.283,39.204,35.0 -15:53:03,582.2287,34.726,35.283,39.204,35.0 -15:53:03,582.2828,34.753,35.283,39.204,35.0 -15:53:03,582.3368,34.698,35.255,38.739,35.0 -15:53:03,582.3885,34.642,35.283,40.166,35.0 -15:53:03,582.4422,34.753,35.283,40.649,35.0 -15:53:03,582.4952,34.698,35.311,38.742,35.0 -15:53:03,582.5518,34.698,35.255,39.205,35.0 -15:53:03,582.6076,34.726,35.283,40.168,35.0 -15:53:03,582.6609,34.726,35.283,39.206,35.0 -15:53:03,582.7121,34.698,35.283,39.206,35.0 -15:53:03,582.7654,34.642,35.283,39.687,35.0 -15:53:04,582.8183,34.698,35.283,40.651,35.0 -15:53:04,582.8712,34.726,35.283,39.69,35.0 -15:53:04,582.9263,34.67,35.283,39.209,35.0 -15:53:04,582.9787,34.67,35.311,40.172,35.0 -15:53:04,583.0317,34.726,35.283,39.692,35.0 -15:53:04,583.0866,34.698,35.283,39.211,35.0 -15:53:04,583.1372,34.726,35.283,39.692,35.0 -15:53:04,583.1879,34.753,35.283,39.211,35.0 -15:53:04,583.2380,34.67,35.283,38.747,35.0 -15:53:04,583.2896,34.698,35.339,40.173,35.0 -15:53:04,583.3397,34.698,35.311,38.73,35.0 -15:53:04,583.3906,34.726,35.283,39.21,35.0 -15:53:04,583.4424,34.726,35.283,39.21,35.0 -15:53:04,583.4934,34.753,35.283,39.21,35.0 -15:53:04,583.5472,34.726,35.255,38.745,35.0 -15:53:04,583.5995,34.698,35.283,39.69,35.0 -15:53:04,583.6499,34.698,35.283,39.691,35.0 -15:53:04,583.7016,34.726,35.255,39.691,35.0 -15:53:04,583.7522,34.753,35.283,39.692,35.0 -15:53:04,583.8026,34.698,35.283,38.746,35.0 -15:53:05,583.8531,34.753,35.283,39.691,35.0 -15:53:05,583.9035,34.67,35.283,38.746,35.0 -15:53:05,583.9542,34.698,35.283,40.172,35.0 -15:53:05,584.0035,34.698,35.283,39.692,35.0 -15:53:05,584.0525,34.698,35.283,39.693,35.0 -15:53:05,584.1026,34.698,35.283,39.693,35.0 -15:53:05,584.1519,34.726,35.311,39.694,35.0 -15:53:05,584.2031,34.67,35.311,38.731,35.0 -15:53:05,584.2530,34.781,35.283,39.693,35.0 -15:53:05,584.3027,34.753,35.283,38.266,35.0 -15:53:05,584.3532,34.753,35.339,38.746,35.0 -15:53:05,584.4032,34.698,35.283,37.782,35.0 -15:53:05,584.4532,34.698,35.283,39.688,35.0 -15:53:05,584.5106,34.67,35.311,39.689,35.0 -15:53:05,584.5598,34.753,35.283,39.69,35.0 -15:53:05,584.6104,34.698,35.283,38.744,35.0 -15:53:05,584.6622,34.698,35.283,39.689,35.0 -15:53:05,584.7123,34.67,35.311,39.69,35.0 -15:53:05,584.7607,34.698,35.311,39.69,35.0 -15:53:06,584.8107,34.698,35.283,39.209,35.0 -15:53:06,584.8634,34.726,35.283,39.69,35.0 -15:53:06,584.9141,34.615,35.283,39.209,35.0 -15:53:06,584.9650,34.642,35.283,41.118,35.0 -15:53:06,585.0149,34.726,35.283,40.657,35.0 -15:53:06,585.0657,34.67,35.311,39.214,35.0 -15:53:06,585.1187,34.698,35.311,39.696,35.0 -15:53:06,585.1688,34.726,35.283,39.214,35.0 -15:53:06,585.2204,34.67,35.255,39.214,35.0 -15:53:06,585.2736,34.726,35.283,40.659,35.0 -15:53:06,585.3236,34.726,35.283,39.216,35.0 -15:53:06,585.3745,34.726,35.255,39.216,35.0 -15:53:06,585.4247,34.698,35.311,39.697,35.0 -15:53:06,585.4757,34.67,35.311,39.216,35.0 -15:53:06,585.5330,34.698,35.283,39.698,35.0 -15:53:06,585.5907,34.698,35.283,39.698,35.0 -15:53:06,585.6436,34.67,35.283,39.699,35.0 -15:53:06,585.6972,34.698,35.283,40.181,35.0 -15:53:06,585.7493,34.726,35.283,39.701,35.0 -15:53:06,585.8005,34.726,35.283,39.22,35.0 -15:53:07,585.8719,34.698,35.311,39.219,35.0 -15:53:07,585.9536,34.67,35.255,39.219,35.0 -15:53:07,586.0190,34.67,35.311,40.665,35.0 -15:53:07,586.0859,34.698,35.283,39.704,35.0 -15:53:07,586.1496,34.698,35.283,39.705,35.0 -15:53:07,586.2169,34.698,35.311,39.705,35.0 -15:53:07,586.2857,34.726,35.283,39.224,35.0 -15:53:07,586.3494,34.698,35.283,39.224,35.0 -15:53:07,586.4158,34.698,35.283,39.705,35.0 -15:53:07,586.4858,34.753,35.311,39.706,35.0 -15:53:07,586.5490,34.67,35.311,38.279,35.0 -15:53:07,586.6142,34.67,35.311,39.705,35.0 -15:53:07,586.6724,34.698,35.339,39.705,35.0 -15:53:07,586.7279,34.698,35.255,38.742,35.0 -15:53:07,586.7876,34.698,35.283,40.186,35.0 -15:53:08,586.8451,34.698,35.283,39.706,35.0 -15:53:08,586.8983,34.726,35.283,39.707,35.0 -15:53:08,586.9668,34.726,35.283,39.226,35.0 -15:53:08,587.0223,34.726,35.283,39.225,35.0 -15:53:08,587.0732,34.67,35.255,39.225,35.0 -15:53:08,587.1383,34.698,35.255,40.67,35.0 -15:53:08,587.2063,34.698,35.283,40.191,35.0 -15:53:08,587.2604,34.726,35.227,39.711,35.0 -15:53:08,587.3137,34.698,35.283,40.193,35.0 -15:53:08,587.3687,34.726,35.311,39.713,35.0 -15:53:08,587.4229,34.698,35.311,38.75,35.0 -15:53:08,587.4777,34.726,35.311,39.231,35.0 -15:53:08,587.5321,34.726,35.199,38.749,35.0 -15:53:08,587.5861,34.698,35.255,40.674,35.0 -15:53:08,587.6409,34.698,35.283,40.195,35.0 -15:53:08,587.6954,34.698,35.283,39.715,35.0 -15:53:08,587.7496,34.753,35.283,39.715,35.0 -15:53:08,587.8037,34.726,35.255,38.77,35.0 -15:53:09,587.8579,34.698,35.283,39.715,35.0 -15:53:09,587.9113,34.726,35.283,39.715,35.0 -15:53:09,587.9631,34.726,35.339,39.234,35.0 -15:53:09,588.0164,34.753,35.283,38.271,35.0 -15:53:09,588.0695,34.698,35.255,38.767,35.0 -15:53:09,588.1238,34.698,35.283,40.194,35.0 -15:53:09,588.1797,34.726,35.311,39.714,35.0 -15:53:09,588.2461,34.753,35.283,38.751,35.0 -15:53:09,588.3158,34.726,35.283,38.767,35.0 -15:53:09,588.4021,34.698,35.283,39.23,35.0 -15:53:09,588.4769,34.67,35.311,39.712,35.0 -15:53:09,588.5494,34.698,35.311,39.713,35.0 -15:53:09,588.6063,34.753,35.283,39.232,35.0 -15:53:09,588.6584,34.698,35.283,38.767,35.0 -15:53:09,588.7128,34.698,35.283,39.712,35.0 -15:53:09,588.7654,34.698,35.311,39.712,35.0 -15:53:10,588.8189,34.67,35.283,39.231,35.0 -15:53:10,588.8708,34.726,35.283,40.194,35.0 -15:53:10,588.9242,34.698,35.283,39.232,35.0 -15:53:10,588.9785,34.698,35.311,39.714,35.0 -15:53:10,589.0305,34.698,35.283,39.233,35.0 -15:53:10,589.0824,34.698,35.283,39.714,35.0 -15:53:10,589.1359,34.726,35.283,39.715,35.0 -15:53:10,589.1883,34.67,35.283,39.234,35.0 -15:53:10,589.2434,34.698,35.283,40.197,35.0 -15:53:10,589.2973,34.726,35.255,39.716,35.0 -15:53:10,589.3543,34.753,35.255,39.717,35.0 -15:53:10,589.4101,34.698,35.283,39.253,35.0 -15:53:10,589.4635,34.726,35.283,39.717,35.0 -15:53:10,589.5193,34.726,35.283,39.236,35.0 -15:53:10,589.5760,34.698,35.311,39.236,35.0 -15:53:10,589.6364,34.67,35.283,39.236,35.0 -15:53:10,589.6925,34.698,35.311,40.199,35.0 -15:53:10,589.7455,34.726,35.283,39.237,35.0 -15:53:10,589.7997,34.698,35.255,39.237,35.0 -15:53:11,589.8554,34.726,35.283,40.2,35.0 -15:53:11,589.9135,34.726,35.255,39.238,35.0 -15:53:11,589.9726,34.726,35.283,39.719,35.0 -15:53:11,590.0269,34.698,35.283,39.238,35.0 -15:53:11,590.0806,34.726,35.311,39.72,35.0 -15:53:11,590.1372,34.753,35.283,38.757,35.0 -15:53:11,590.1992,34.726,35.283,38.773,35.0 -15:53:11,590.2587,34.698,35.283,39.236,35.0 -15:53:11,590.3266,34.726,35.283,39.718,35.0 -15:53:11,590.3815,34.698,35.255,39.236,35.0 -15:53:11,590.4367,34.698,35.283,40.2,35.0 -15:53:11,590.4927,34.726,35.283,39.719,35.0 -15:53:11,590.5554,34.698,35.283,39.238,35.0 -15:53:11,590.6221,34.698,35.283,39.72,35.0 -15:53:11,590.6809,34.698,35.311,39.72,35.0 -15:53:11,590.7354,34.726,35.283,39.239,35.0 -15:53:11,590.7895,34.698,35.283,39.239,35.0 -15:53:12,590.8458,34.67,35.283,39.721,35.0 -15:53:12,590.9207,34.67,35.311,40.203,35.0 -15:53:12,590.9878,34.698,35.311,39.723,35.0 -15:53:12,591.0430,34.698,35.283,39.242,35.0 -15:53:12,591.1114,34.698,35.283,39.723,35.0 -15:53:12,591.1832,34.698,35.255,39.724,35.0 -15:53:12,591.2470,34.698,35.283,40.207,35.0 -15:53:12,591.3008,34.698,35.311,39.726,35.0 -15:53:12,591.3495,34.753,35.283,39.245,35.0 -15:53:12,591.3992,34.642,35.283,38.781,35.0 -15:53:12,591.4500,34.726,35.255,40.689,35.0 -15:53:12,591.5001,34.698,35.283,39.728,35.0 -15:53:12,591.5540,34.698,35.255,39.728,35.0 -15:53:12,591.6071,34.726,35.311,40.211,35.0 -15:53:12,591.6716,34.698,35.283,38.767,35.0 -15:53:12,591.7420,34.67,35.311,39.729,35.0 -15:53:12,591.8057,34.698,35.283,39.73,35.0 -15:53:13,591.8612,34.726,35.283,39.731,35.0 -15:53:13,591.9246,34.698,35.311,39.25,35.0 -15:53:13,591.9885,34.698,35.283,39.249,35.0 -15:53:13,592.0558,34.698,35.311,39.731,35.0 -15:53:13,592.1223,34.726,35.283,39.25,35.0 -15:53:13,592.1813,34.726,35.283,39.249,35.0 -15:53:13,592.2555,34.698,35.311,39.249,35.0 -15:53:13,592.3278,34.753,35.283,39.249,35.0 -15:53:13,592.3973,34.726,35.311,38.784,35.0 -15:53:13,592.4598,34.698,35.283,38.765,35.0 -15:53:13,592.5094,34.753,35.311,39.727,35.0 -15:53:13,592.5754,34.698,35.283,38.3,35.0 -15:53:13,592.6438,34.753,35.255,39.726,35.0 -15:53:13,592.7043,34.698,35.283,39.262,35.0 -15:53:13,592.7607,34.642,35.283,39.726,35.0 -15:53:14,592.8164,34.698,35.283,40.691,35.0 -15:53:14,592.8700,34.698,35.283,39.729,35.0 -15:53:14,592.9259,34.698,35.283,39.73,35.0 -15:53:14,592.9805,34.698,35.283,39.731,35.0 -15:53:14,593.0327,34.698,35.283,39.731,35.0 -15:53:14,593.0906,34.698,35.283,39.732,35.0 -15:53:14,593.1448,34.698,35.283,39.732,35.0 -15:53:14,593.1961,34.698,35.283,39.733,35.0 -15:53:14,593.2488,34.726,35.283,39.734,35.0 -15:53:14,593.2987,34.698,35.283,39.252,35.0 -15:53:14,593.3486,34.698,35.311,39.734,35.0 -15:53:14,593.3982,34.698,35.311,39.253,35.0 -15:53:14,593.4499,34.698,35.311,39.253,35.0 -15:53:14,593.5014,34.67,35.311,39.252,35.0 -15:53:14,593.5544,34.726,35.283,39.734,35.0 -15:53:14,593.6060,34.726,35.283,39.253,35.0 -15:53:14,593.6560,34.753,35.283,39.252,35.0 -15:53:14,593.7069,34.726,35.283,38.788,35.0 -15:53:14,593.7571,34.698,35.283,39.251,35.0 -15:53:14,593.8071,34.726,35.283,39.732,35.0 -15:53:15,593.8571,34.726,35.367,39.251,35.0 -15:53:15,593.9074,34.698,35.283,37.806,35.0 -15:53:15,593.9578,34.642,35.283,39.73,35.0 -15:53:15,594.0080,34.781,35.311,40.694,35.0 -15:53:15,594.0591,34.726,35.311,37.823,35.0 -15:53:15,594.1093,34.698,35.283,38.767,35.0 -15:53:15,594.1631,34.726,35.311,39.729,35.0 -15:53:15,594.2134,34.698,35.283,38.766,35.0 -15:53:15,594.2626,34.698,35.283,39.728,35.0 -15:53:15,594.3130,34.698,35.311,39.729,35.0 -15:53:15,594.3653,34.698,35.283,39.248,35.0 -15:53:15,594.4165,34.67,35.311,39.729,35.0 -15:53:15,594.4648,34.698,35.311,39.73,35.0 -15:53:15,594.5139,34.753,35.311,39.249,35.0 -15:53:15,594.5647,34.726,35.311,38.302,35.0 -15:53:15,594.6137,34.726,35.255,38.765,35.0 -15:53:15,594.6633,34.698,35.311,39.727,35.0 -15:53:15,594.7145,34.698,35.283,39.246,35.0 -15:53:15,594.7641,34.726,35.283,39.728,35.0 -15:53:16,594.8146,34.726,35.283,39.246,35.0 -15:53:16,594.8663,34.698,35.283,39.246,35.0 -15:53:16,594.9185,34.726,35.171,39.728,35.0 -15:53:16,594.9700,34.698,35.283,41.173,35.0 -15:53:16,595.0210,34.698,35.311,39.731,35.0 -15:53:16,595.0712,34.698,35.283,39.25,35.0 -15:53:16,595.1213,34.726,35.283,39.731,35.0 -15:53:16,595.1740,34.726,35.283,39.25,35.0 -15:53:16,595.2256,34.67,35.283,39.25,35.0 -15:53:16,595.2775,34.753,35.311,40.213,35.0 -15:53:16,595.3277,34.642,35.283,38.305,35.0 -15:53:16,595.3790,34.726,35.283,40.694,35.0 -15:53:16,595.4316,34.698,35.311,39.252,35.0 -15:53:16,595.4834,34.698,35.311,39.251,35.0 -15:53:16,595.5338,34.781,35.283,39.251,35.0 -15:53:16,595.5855,34.753,35.283,38.305,35.0 -15:53:16,595.6368,34.726,35.283,38.784,35.0 -15:53:16,595.6889,34.726,35.283,39.248,35.0 -15:53:16,595.7387,34.726,35.311,39.248,35.0 -15:53:16,595.7886,34.753,35.283,38.766,35.0 -15:53:17,595.8456,34.726,35.283,38.782,35.0 -15:53:17,595.9034,34.726,35.255,39.245,35.0 -15:53:17,595.9624,34.698,35.311,39.727,35.0 -15:53:17,596.0196,34.726,35.283,39.245,35.0 -15:53:17,596.0766,34.726,35.311,39.245,35.0 -15:53:17,596.1290,34.698,35.311,38.763,35.0 -15:53:17,596.1866,34.726,35.283,39.244,35.0 -15:53:17,596.2413,34.698,35.339,39.243,35.0 -15:53:17,596.2952,34.698,35.311,38.761,35.0 -15:53:17,596.3490,34.726,35.283,39.242,35.0 -15:53:17,596.4023,34.726,35.283,39.242,35.0 -15:53:17,596.4557,34.698,35.311,39.241,35.0 -15:53:17,596.5083,34.726,35.311,39.241,35.0 -15:53:17,596.5624,34.698,35.283,38.759,35.0 -15:53:17,596.6199,34.698,35.311,39.722,35.0 -15:53:17,596.6729,34.698,35.311,39.24,35.0 -15:53:17,596.7260,34.698,35.311,39.24,35.0 -15:53:17,596.7805,34.698,35.311,39.24,35.0 -15:53:18,596.8334,34.726,35.283,39.24,35.0 -15:53:18,596.8865,34.698,35.283,39.239,35.0 -15:53:18,596.9404,34.726,35.283,39.721,35.0 -15:53:18,596.9943,34.726,35.283,39.24,35.0 -15:53:18,597.0482,34.753,35.283,39.239,35.0 -15:53:18,597.1027,34.753,35.283,38.775,35.0 -15:53:18,597.1570,34.67,35.311,38.773,35.0 -15:53:18,597.2124,34.698,35.311,39.718,35.0 -15:53:18,597.2659,34.67,35.283,39.237,35.0 -15:53:18,597.3200,34.698,35.283,40.201,35.0 -15:53:18,597.3716,34.753,35.283,39.72,35.0 -15:53:18,597.4209,34.698,35.283,38.775,35.0 -15:53:18,597.4721,34.753,35.283,39.72,35.0 -15:53:18,597.5218,34.698,35.283,38.774,35.0 -15:53:18,597.5725,34.726,35.311,39.719,35.0 -15:53:18,597.6233,34.698,35.311,38.757,35.0 -15:53:18,597.6728,34.698,35.283,39.237,35.0 -15:53:18,597.7237,34.698,35.283,39.719,35.0 -15:53:18,597.7757,34.726,35.311,39.719,35.0 -15:53:19,597.8307,34.698,35.311,38.756,35.0 -15:53:19,597.8812,34.698,35.283,39.237,35.0 -15:53:19,597.9310,34.726,35.283,39.718,35.0 -15:53:19,597.9829,34.726,35.283,39.237,35.0 -15:53:19,598.0376,34.698,35.311,39.237,35.0 -15:53:19,598.0907,34.698,35.283,39.237,35.0 -15:53:19,598.1440,34.726,35.283,39.718,35.0 -15:53:19,598.1995,34.698,35.311,39.237,35.0 -15:53:19,598.2538,34.753,35.283,39.237,35.0 -15:53:19,598.3069,34.726,35.283,38.772,35.0 -15:53:19,598.3591,34.698,35.283,39.235,35.0 -15:53:19,598.4121,34.698,35.283,39.717,35.0 -15:53:19,598.4655,34.698,35.283,39.717,35.0 -15:53:19,598.5197,34.698,35.311,39.718,35.0 -15:53:19,598.5733,34.698,35.339,39.237,35.0 -15:53:19,598.6264,34.726,35.283,38.755,35.0 -15:53:19,598.6808,34.698,35.283,39.235,35.0 -15:53:19,598.7317,34.726,35.283,39.717,35.0 -15:53:19,598.7829,34.698,35.311,39.236,35.0 -15:53:20,598.8337,34.726,35.255,39.235,35.0 -15:53:20,598.8850,34.726,35.311,39.717,35.0 -15:53:20,598.9368,34.726,35.283,38.754,35.0 -15:53:20,598.9877,34.698,35.283,39.235,35.0 -15:53:20,599.0380,34.67,35.283,39.716,35.0 -15:53:20,599.0882,34.698,35.283,40.198,35.0 -15:53:20,599.1386,34.726,35.283,39.718,35.0 -15:53:20,599.1916,34.726,35.311,39.237,35.0 -15:53:20,599.2445,34.698,35.283,38.755,35.0 -15:53:20,599.2960,34.726,35.283,39.717,35.0 -15:53:20,599.3459,34.698,35.311,39.236,35.0 -15:53:20,599.3965,34.726,35.283,39.236,35.0 -15:53:20,599.4481,34.726,35.311,39.235,35.0 -15:53:20,599.4997,34.698,35.283,38.754,35.0 -15:53:20,599.5512,34.698,35.283,39.716,35.0 -15:53:20,599.6029,34.726,35.283,39.716,35.0 -15:53:20,599.6537,34.698,35.255,39.235,35.0 -15:53:20,599.7039,34.726,35.283,40.198,35.0 -15:53:20,599.7548,34.726,35.255,39.236,35.0 -15:53:20,599.8070,34.698,35.283,39.718,35.0 -15:53:21,599.8576,34.698,35.283,39.718,35.0 -15:53:21,599.9076,34.698,35.227,39.719,35.0 -15:53:21,599.9589,34.726,35.283,40.683,35.0 -15:53:21,600.0101,34.698,35.339,39.24,35.0 -15:53:21,600.0609,34.698,35.255,38.758,35.0 -15:53:21,600.1114,34.726,35.283,40.202,35.0 -15:53:21,600.1626,34.753,35.283,39.24,35.0 -15:53:21,600.2159,34.753,35.339,38.775,35.0 -15:53:21,600.2690,34.753,35.283,37.811,35.0 -15:53:21,600.3232,34.698,35.255,38.771,35.0 -15:53:21,600.3766,34.726,35.283,40.198,35.0 -15:53:21,600.4315,34.67,35.283,39.236,35.0 -15:53:21,600.4857,34.753,35.283,40.199,35.0 -15:53:21,600.5458,34.726,35.255,38.773,35.0 -15:53:21,600.6048,34.726,35.283,39.718,35.0 -15:53:21,600.6585,34.67,35.311,39.237,35.0 -15:53:21,600.7112,34.67,35.255,39.718,35.0 -15:53:21,600.7627,34.698,35.255,40.682,35.0 -15:53:22,600.8148,34.726,35.283,40.203,35.0 -15:53:22,600.8876,34.698,35.255,39.241,35.0 -15:53:22,600.9653,34.698,35.283,40.204,35.0 -15:53:22,601.0330,34.726,35.311,39.724,35.0 -15:53:22,601.1017,34.698,35.283,38.761,35.0 -15:53:22,601.1611,34.726,35.311,39.724,35.0 -15:53:22,601.2226,34.67,35.283,38.761,35.0 -15:53:22,601.2907,34.67,35.283,40.205,35.0 -15:53:22,601.3561,34.726,35.283,40.207,35.0 -15:53:22,601.4156,34.698,35.367,39.245,35.0 -15:53:22,601.4761,34.698,35.311,38.281,35.0 -15:53:22,601.5352,34.726,35.283,39.242,35.0 -15:53:22,601.5934,34.67,35.227,39.242,35.0 -15:53:22,601.6538,34.698,35.283,41.168,35.0 -15:53:22,601.7116,34.698,35.283,39.727,35.0 -15:53:22,601.7749,34.726,35.283,39.727,35.0 -15:53:23,601.8280,34.698,35.283,39.246,35.0 -15:53:23,601.8788,34.698,35.283,39.727,35.0 -15:53:23,601.9290,34.698,35.311,39.728,35.0 -15:53:23,601.9792,34.698,35.283,39.247,35.0 -15:53:23,602.0290,34.726,35.255,39.728,35.0 -15:53:23,602.0804,34.781,35.283,39.729,35.0 -15:53:23,602.1499,34.698,35.283,38.301,35.0 -15:53:23,602.2029,34.698,35.311,39.727,35.0 -15:53:23,602.2547,34.698,35.311,39.246,35.0 -15:53:23,602.3050,34.698,35.311,39.246,35.0 -15:53:23,602.3560,34.698,35.283,39.246,35.0 -15:53:23,602.4070,34.698,35.283,39.727,35.0 -15:53:23,602.4581,34.753,35.283,39.728,35.0 -15:53:23,602.5099,34.726,35.283,38.782,35.0 -15:53:23,602.5593,34.698,35.311,39.246,35.0 -15:53:23,602.6107,34.698,35.311,39.245,35.0 -15:53:23,602.6641,34.698,35.311,39.245,35.0 -15:53:23,602.7160,34.726,35.311,39.245,35.0 -15:53:23,602.7667,34.753,35.283,38.763,35.0 -15:53:24,602.8175,34.753,35.283,38.779,35.0 -15:53:24,602.8691,34.698,35.283,38.778,35.0 -15:53:24,602.9189,34.698,35.311,39.723,35.0 -15:53:24,602.9700,34.67,35.283,39.242,35.0 -15:53:24,603.0204,34.726,35.311,40.205,35.0 -15:53:24,603.0709,34.698,35.283,38.761,35.0 -15:53:24,603.1210,34.698,35.283,39.724,35.0 -15:53:24,603.1718,34.698,35.311,39.724,35.0 -15:53:24,603.2217,34.615,35.283,39.243,35.0 -15:53:24,603.2729,34.698,35.255,41.152,35.0 -15:53:24,603.3243,34.698,35.283,40.209,35.0 -15:53:24,603.3773,34.726,35.311,39.729,35.0 -15:53:24,603.4282,34.698,35.283,38.766,35.0 -15:53:24,603.4809,34.726,35.283,39.728,35.0 -15:53:24,603.5334,34.67,35.283,39.247,35.0 -15:53:24,603.5868,34.726,35.227,40.21,35.0 -15:53:24,603.6373,34.726,35.255,40.212,35.0 -15:53:24,603.6895,34.726,35.283,39.731,35.0 -15:53:24,603.7405,34.67,35.283,39.25,35.0 -15:53:24,603.7914,34.67,35.283,40.213,35.0 -15:53:25,603.8430,34.726,35.283,40.215,35.0 -15:53:25,603.8939,34.726,35.255,39.253,35.0 -15:53:25,603.9477,34.698,35.311,39.734,35.0 -15:53:25,603.9981,34.726,35.311,39.253,35.0 -15:53:25,604.0494,34.698,35.283,38.771,35.0 -15:53:25,604.1009,34.726,35.311,39.733,35.0 -15:53:25,604.1522,34.67,35.311,38.771,35.0 -15:53:25,604.2036,34.698,35.311,39.733,35.0 -15:53:25,604.2557,34.726,35.283,39.252,35.0 -15:53:25,604.3063,34.698,35.283,39.251,35.0 -15:53:25,604.3601,34.698,35.283,39.733,35.0 -15:53:25,604.4111,34.698,35.311,39.733,35.0 -15:53:25,604.4639,34.726,35.283,39.252,35.0 -15:53:25,604.5162,34.698,35.283,39.252,35.0 -15:53:25,604.5679,34.726,35.283,39.733,35.0 -15:53:25,604.6197,34.698,35.283,39.252,35.0 -15:53:25,604.6728,34.698,35.283,39.734,35.0 -15:53:25,604.7251,34.698,35.283,39.734,35.0 -15:53:25,604.7758,34.698,35.283,39.735,35.0 -15:53:26,604.8271,34.726,35.255,39.735,35.0 -15:53:26,604.8778,34.67,35.283,39.736,35.0 -15:53:26,604.9303,34.642,35.311,40.218,35.0 -15:53:26,604.9828,34.67,35.255,40.22,35.0 -15:53:26,605.0339,34.726,35.311,40.703,35.0 -15:53:26,605.0851,34.726,35.255,38.778,35.0 -15:53:26,605.1367,34.698,35.339,39.74,35.0 -15:53:26,605.1941,34.698,35.255,38.778,35.0 -15:53:26,605.2459,34.726,35.255,40.222,35.0 -15:53:26,605.2952,34.726,35.283,39.742,35.0 -15:53:26,605.3449,34.726,35.283,39.26,35.0 -15:53:26,605.3937,34.698,35.283,39.26,35.0 -15:53:26,605.4442,34.698,35.283,39.742,35.0 -15:53:26,605.4961,34.726,35.283,39.742,35.0 -15:53:26,605.5468,34.698,35.283,39.261,35.0 -15:53:26,605.5977,34.698,35.283,39.742,35.0 -15:53:26,605.6484,34.698,35.311,39.743,35.0 -15:53:26,605.7010,34.67,35.283,39.262,35.0 -15:53:26,605.7530,34.726,35.283,40.225,35.0 -15:53:26,605.8035,34.726,35.283,39.263,35.0 -15:53:27,605.8538,34.698,35.311,39.263,35.0 -15:53:27,605.9054,34.67,35.283,39.262,35.0 -15:53:27,605.9577,34.698,35.283,40.225,35.0 -15:53:27,606.0096,34.726,35.283,39.745,35.0 -15:53:27,606.0638,34.726,35.283,39.264,35.0 -15:53:27,606.1154,34.698,35.283,39.264,35.0 -15:53:27,606.1670,34.726,35.283,39.745,35.0 -15:53:27,606.2209,34.781,35.311,39.264,35.0 -15:53:27,606.2735,34.698,35.367,37.836,35.0 -15:53:27,606.3258,34.698,35.283,38.298,35.0 -15:53:27,606.3774,34.698,35.283,39.741,35.0 -15:53:27,606.4272,34.753,35.283,39.741,35.0 -15:53:27,606.4776,34.781,35.283,38.796,35.0 -15:53:27,606.5282,34.726,35.283,38.313,35.0 -15:53:27,606.5792,34.726,35.283,39.257,35.0 -15:53:27,606.6319,34.698,35.311,39.257,35.0 -15:53:27,606.6847,34.698,35.283,39.257,35.0 -15:53:27,606.7392,34.698,35.283,39.738,35.0 -15:53:27,606.7926,34.726,35.283,39.739,35.0 -15:53:28,606.8453,34.67,35.311,39.258,35.0 -15:53:28,606.8964,34.698,35.283,39.739,35.0 -15:53:28,606.9463,34.698,35.283,39.74,35.0 -15:53:28,606.9985,34.698,35.311,39.74,35.0 -15:53:28,607.0518,34.698,35.283,39.259,35.0 -15:53:28,607.1019,34.698,35.283,39.74,35.0 -15:53:28,607.1517,34.587,35.283,39.741,35.0 -15:53:28,607.2027,34.726,35.311,41.651,35.0 -15:53:28,607.2547,34.753,35.283,38.782,35.0 -15:53:28,607.3054,34.726,35.283,38.798,35.0 -15:53:28,607.3562,34.698,35.283,39.261,35.0 -15:53:28,607.4069,34.726,35.283,39.743,35.0 -15:53:28,607.4581,34.726,35.283,39.262,35.0 -15:53:28,607.5089,34.698,35.339,39.261,35.0 -15:53:28,607.5599,34.698,35.311,38.78,35.0 -15:53:28,607.6132,34.67,35.311,39.26,35.0 -15:53:28,607.6645,34.726,35.311,39.742,35.0 -15:53:28,607.7163,34.698,35.283,38.779,35.0 -15:53:28,607.7676,34.67,35.311,39.741,35.0 -15:53:29,607.8189,34.698,35.283,39.742,35.0 -15:53:29,607.8698,34.753,35.283,39.742,35.0 -15:53:29,607.9210,34.698,35.283,38.797,35.0 -15:53:29,607.9738,34.698,35.283,39.742,35.0 -15:53:29,608.0263,34.726,35.311,39.742,35.0 -15:53:29,608.0806,34.698,35.283,38.779,35.0 -15:53:29,608.1312,34.67,35.255,39.742,35.0 -15:53:29,608.1843,34.698,35.367,40.705,35.0 -15:53:29,608.2394,34.67,35.283,38.299,35.0 -15:53:29,608.2903,34.726,35.283,40.224,35.0 -15:53:29,608.3418,34.753,35.311,39.262,35.0 -15:53:29,608.3917,34.698,35.311,38.316,35.0 -15:53:29,608.4422,34.698,35.311,39.26,35.0 -15:53:29,608.4927,34.726,35.255,39.26,35.0 -15:53:29,608.5439,34.753,35.311,39.741,35.0 -15:53:29,608.5964,34.698,35.283,38.314,35.0 -15:53:29,608.6503,34.726,35.283,39.74,35.0 -15:53:29,608.7015,34.698,35.283,39.259,35.0 -15:53:29,608.7527,34.698,35.311,39.74,35.0 -15:53:29,608.8053,34.698,35.311,39.259,35.0 -15:53:30,608.8563,34.726,35.283,39.259,35.0 -15:53:30,608.9087,34.698,35.311,39.259,35.0 -15:53:30,608.9587,34.67,35.283,39.258,35.0 -15:53:30,609.0114,34.726,35.283,40.221,35.0 -15:53:30,609.0621,34.753,35.311,39.259,35.0 -15:53:30,609.1138,34.726,35.283,38.313,35.0 -15:53:30,609.1650,34.698,35.283,39.257,35.0 -15:53:30,609.2174,34.698,35.283,39.739,35.0 -15:53:30,609.2729,34.698,35.311,39.739,35.0 -15:53:30,609.3238,34.726,35.311,39.258,35.0 -15:53:30,609.3751,34.726,35.311,38.776,35.0 -15:53:30,609.4282,34.726,35.283,38.775,35.0 -15:53:30,609.4792,34.698,35.283,39.256,35.0 -15:53:30,609.5299,34.726,35.311,39.737,35.0 -15:53:30,609.5808,34.726,35.311,38.774,35.0 -15:53:30,609.6320,34.698,35.311,38.773,35.0 -15:53:30,609.6823,34.726,35.283,39.254,35.0 -15:53:30,609.7333,34.698,35.311,39.254,35.0 -15:53:30,609.7853,34.726,35.283,39.253,35.0 -15:53:31,609.8366,34.753,35.283,39.253,35.0 -15:53:31,609.8883,34.726,35.283,38.788,35.0 -15:53:31,609.9394,34.698,35.311,39.252,35.0 -15:53:31,609.9925,34.726,35.339,39.252,35.0 -15:53:31,610.0462,34.726,35.311,38.288,35.0 -15:53:31,610.0975,34.698,35.283,38.768,35.0 -15:53:31,610.1505,34.726,35.283,39.73,35.0 -15:53:31,610.2057,34.698,35.311,39.249,35.0 -15:53:31,610.2601,34.726,35.255,39.248,35.0 -15:53:31,610.3132,34.753,35.283,39.73,35.0 -15:53:31,610.3667,34.726,35.283,38.784,35.0 -15:53:31,610.4217,34.698,35.311,39.248,35.0 -15:53:31,610.4757,34.753,35.311,39.247,35.0 -15:53:31,610.5271,34.698,35.311,38.301,35.0 -15:53:31,610.5777,34.698,35.283,39.245,35.0 -15:53:31,610.6282,34.698,35.283,39.727,35.0 -15:53:31,610.6818,34.642,35.255,39.727,35.0 -15:53:31,610.7342,34.642,35.311,41.173,35.0 -15:53:31,610.7860,34.67,35.283,40.212,35.0 -15:53:32,610.8388,34.726,35.283,40.214,35.0 -15:53:32,610.8915,34.726,35.255,39.252,35.0 -15:53:32,610.9462,34.726,35.283,39.733,35.0 -15:53:32,610.9995,34.698,35.283,39.252,35.0 -15:53:32,611.0527,34.698,35.283,39.734,35.0 -15:53:32,611.1050,34.698,35.311,39.734,35.0 -15:53:32,611.1581,34.67,35.255,39.253,35.0 -15:53:32,611.2095,34.698,35.311,40.698,35.0 -15:53:32,611.2648,34.698,35.283,39.255,35.0 -15:53:32,611.3175,34.753,35.227,39.736,35.0 -15:53:32,611.3686,34.67,35.255,39.754,35.0 -15:53:32,611.4218,34.67,35.311,40.701,35.0 -15:53:32,611.4748,34.726,35.311,39.74,35.0 -15:53:32,611.5303,34.698,35.311,38.777,35.0 -15:53:32,611.5865,34.698,35.311,39.258,35.0 -15:53:32,611.6402,34.698,35.339,39.257,35.0 -15:53:32,611.6945,34.698,35.283,38.775,35.0 -15:53:32,611.7475,34.698,35.283,39.738,35.0 -15:53:32,611.8006,34.726,35.283,39.738,35.0 -15:53:33,611.8544,34.726,35.311,39.257,35.0 -15:53:33,611.9079,34.726,35.283,38.775,35.0 -15:53:33,611.9616,34.698,35.339,39.256,35.0 -15:53:33,612.0132,34.698,35.283,38.774,35.0 -15:53:33,612.0676,34.726,35.283,39.736,35.0 -15:53:33,612.1207,34.726,35.283,39.255,35.0 -15:53:33,612.1735,34.726,35.367,39.255,35.0 -15:53:33,612.2311,34.67,35.283,37.809,35.0 -15:53:33,612.2871,34.698,35.367,40.215,35.0 -15:53:33,612.3414,34.67,35.283,38.289,35.0 -15:53:33,612.3978,34.698,35.283,40.214,35.0 -15:53:33,612.4524,34.698,35.311,39.734,35.0 -15:53:33,612.5056,34.726,35.227,39.253,35.0 -15:53:33,612.5596,34.67,35.283,40.216,35.0 -15:53:33,612.6146,34.698,35.255,40.217,35.0 -15:53:33,612.6735,34.726,35.311,40.219,35.0 -15:53:33,612.7316,34.698,35.339,38.775,35.0 -15:53:33,612.7914,34.726,35.283,38.774,35.0 -15:53:34,612.8506,34.698,35.283,39.254,35.0 -15:53:34,612.9063,34.67,35.283,39.736,35.0 -15:53:34,612.9614,34.726,35.283,40.218,35.0 -15:53:34,613.0237,34.781,35.283,39.256,35.0 -15:53:34,613.0826,34.726,35.283,38.309,35.0 -15:53:34,613.1413,34.698,35.311,39.254,35.0 -15:53:34,613.1952,34.726,35.339,39.253,35.0 -15:53:34,613.2493,34.67,35.311,38.29,35.0 -15:53:34,613.3053,34.726,35.283,39.733,35.0 -15:53:34,613.3622,34.698,35.339,39.252,35.0 -15:53:34,613.4217,34.726,35.283,38.77,35.0 -15:53:34,613.4767,34.726,35.311,39.25,35.0 -15:53:34,613.5303,34.67,35.311,38.768,35.0 -15:53:34,613.5846,34.726,35.283,39.73,35.0 -15:53:34,613.6411,34.67,35.283,39.249,35.0 -15:53:34,613.6963,34.698,35.283,40.212,35.0 -15:53:34,613.7530,34.753,35.283,39.732,35.0 -15:53:35,613.8081,34.698,35.311,38.787,35.0 -15:53:35,613.8633,34.67,35.283,39.25,35.0 -15:53:35,613.9221,34.642,35.283,40.213,35.0 -15:53:35,613.9778,34.698,35.283,40.696,35.0 -15:53:35,614.0318,34.753,35.283,39.735,35.0 -15:53:35,614.0869,34.698,35.311,38.79,35.0 -15:53:35,614.1408,34.726,35.283,39.253,35.0 -15:53:35,614.1963,34.726,35.283,39.253,35.0 diff --git a/temp_logs/log_simulacao_perturbacao.csv b/temp_logs/log_simulacao_perturbacao.csv deleted file mode 100644 index b302e66..0000000 --- a/temp_logs/log_simulacao_perturbacao.csv +++ /dev/null @@ -1,12402 +0,0 @@ -timestamp,seconds,temp_a,temp_b,duty,target -18:23:40,0.6272,26.099,26.532,-100.0,30 -18:23:40,0.7965,26.124,26.558,100.0,30 -18:23:40,0.8531,26.15,26.532,100.0,30 -18:23:40,0.8980,26.124,26.558,100.0,30 -18:23:40,0.9543,26.124,26.532,100.0,30 -18:23:40,1.0129,26.15,26.532,100.0,30 -18:23:40,1.0568,26.124,26.532,100.0,30 -18:23:41,1.0985,26.124,26.532,100.0,30 -18:23:41,1.1427,26.124,26.532,100.0,30 -18:23:41,1.1907,26.124,26.532,100.0,30 -18:23:41,1.2389,26.124,26.532,100.0,30 -18:23:41,1.2864,26.124,26.558,100.0,30 -18:23:41,1.3328,26.175,26.558,100.0,30 -18:23:41,1.3788,26.15,26.583,100.0,30 -18:23:41,1.4217,26.124,26.532,100.0,30 -18:23:41,1.4664,26.15,26.558,100.0,30 -18:23:41,1.5070,26.099,26.583,100.0,30 -18:23:41,1.5531,26.124,26.532,100.0,30 -18:23:41,1.5974,26.099,26.558,100.0,30 -18:23:41,1.6402,26.073,26.532,100.0,30 -18:23:41,1.6846,26.124,26.532,100.0,30 -18:23:41,1.7261,26.124,26.532,100.0,30 -18:23:41,1.7758,26.124,26.532,100.0,30 -18:23:41,1.8204,26.124,26.532,100.0,30 -18:23:41,1.8625,26.15,26.532,100.0,30 -18:23:41,1.9099,26.124,26.558,100.0,30 -18:23:41,1.9578,26.124,26.558,100.0,30 -18:23:41,2.0051,26.124,26.532,100.0,30 -18:23:41,2.0528,26.124,26.532,100.0,30 -18:23:42,2.0985,26.099,26.532,100.0,30 -18:23:42,2.1388,26.124,26.532,100.0,30 -18:23:42,2.1809,26.124,26.532,100.0,30 -18:23:42,2.2231,26.124,26.532,100.0,30 -18:23:42,2.2650,26.099,26.583,100.0,30 -18:23:42,2.3086,26.124,26.558,100.0,30 -18:23:42,2.3531,26.124,26.532,100.0,30 -18:23:42,2.3956,26.124,26.532,100.0,30 -18:23:42,2.4405,26.124,26.558,100.0,30 -18:23:42,2.4825,26.099,26.532,100.0,30 -18:23:42,2.5243,26.124,26.532,100.0,30 -18:23:42,2.5658,26.124,26.532,100.0,30 -18:23:42,2.6079,26.124,26.532,100.0,30 -18:23:42,2.6502,26.124,26.532,100.0,30 -18:23:42,2.6922,26.124,26.558,100.0,30 -18:23:42,2.7355,26.099,26.532,100.0,30 -18:23:42,2.7776,26.124,26.558,100.0,30 -18:23:42,2.8233,26.124,26.558,100.0,30 -18:23:42,2.8661,26.124,26.532,100.0,30 -18:23:42,2.9095,26.099,26.532,100.0,30 -18:23:42,2.9561,26.124,26.532,100.0,30 -18:23:42,3.0008,26.124,26.532,100.0,30 -18:23:42,3.0444,26.124,26.532,100.0,30 -18:23:42,3.0906,26.124,26.532,100.0,30 -18:23:43,3.1330,26.099,26.532,100.0,30 -18:23:43,3.1762,26.124,26.532,100.0,30 -18:23:43,3.2206,26.124,26.532,100.0,30 -18:23:43,3.2636,26.124,26.532,100.0,30 -18:23:43,3.3106,26.124,26.532,100.0,30 -18:23:43,3.3567,26.124,26.506,100.0,30 -18:23:43,3.4043,26.099,26.532,100.0,30 -18:23:43,3.4487,26.124,26.532,100.0,30 -18:23:43,3.4936,26.099,26.532,100.0,30 -18:23:43,3.5419,26.073,26.532,100.0,30 -18:23:43,3.5910,26.073,26.506,100.0,30 -18:23:43,3.6390,26.124,26.532,100.0,30 -18:23:43,3.6845,26.15,26.532,100.0,30 -18:23:43,3.7303,26.124,26.532,100.0,30 -18:23:43,3.7758,26.124,26.532,100.0,30 -18:23:43,3.8217,26.124,26.532,100.0,30 -18:23:43,3.9148,26.124,26.558,100.0,30 -18:23:43,3.9627,26.124,26.532,100.0,30 -18:23:43,4.0096,26.124,26.558,100.0,30 -18:23:43,4.0558,26.124,26.558,100.0,30 -18:23:44,4.1017,26.124,26.532,100.0,30 -18:23:44,4.1477,26.124,26.532,100.0,30 -18:23:44,4.1959,26.124,26.558,100.0,30 -18:23:44,4.2443,26.124,26.558,100.0,30 -18:23:44,4.2833,26.124,26.583,100.0,30 -18:23:44,4.3226,26.124,26.532,100.0,30 -18:23:44,4.3627,26.099,26.558,100.0,30 -18:23:44,4.4068,26.124,26.558,100.0,30 -18:23:44,4.4477,26.124,26.506,100.0,30 -18:23:44,4.4907,26.099,26.532,100.0,30 -18:23:44,4.5336,26.124,26.532,100.0,30 -18:23:44,4.5727,26.124,26.532,100.0,30 -18:23:44,4.6113,26.124,26.532,100.0,30 -18:23:44,4.6513,26.124,26.558,100.0,30 -18:23:44,4.6888,26.099,26.532,100.0,30 -18:23:44,4.7297,26.124,26.532,100.0,30 -18:23:44,4.7729,26.124,26.532,100.0,30 -18:23:44,4.8132,26.124,26.532,100.0,30 -18:23:44,4.8556,26.124,26.532,100.0,30 -18:23:44,4.8947,26.099,26.532,100.0,30 -18:23:44,4.9377,26.175,26.532,100.0,30 -18:23:44,4.9786,26.124,26.558,100.0,30 -18:23:44,5.0225,26.124,26.558,100.0,30 -18:23:44,5.0626,26.15,26.506,100.0,30 -18:23:45,5.1048,26.124,26.558,100.0,30 -18:23:45,5.1433,26.124,26.558,100.0,30 -18:23:45,5.1860,26.099,26.532,100.0,30 -18:23:45,5.2254,26.15,26.532,100.0,30 -18:23:45,5.2687,26.099,26.558,100.0,30 -18:23:45,5.3087,26.15,26.506,100.0,30 -18:23:45,5.3488,26.15,26.558,100.0,30 -18:23:45,5.3886,26.124,26.558,100.0,30 -18:23:45,5.4303,26.124,26.532,100.0,30 -18:23:45,5.4737,26.124,26.558,100.0,30 -18:23:45,5.5160,26.124,26.532,100.0,30 -18:23:45,5.5568,26.124,26.532,100.0,30 -18:23:45,5.5973,26.124,26.532,100.0,30 -18:23:45,5.6393,26.124,26.532,100.0,30 -18:23:45,5.6810,26.15,26.532,100.0,30 -18:23:45,5.7267,26.15,26.532,100.0,30 -18:23:45,5.7691,26.099,26.558,100.0,30 -18:23:45,5.8107,26.124,26.558,100.0,30 -18:23:45,5.8538,26.15,26.532,100.0,30 -18:23:45,5.8970,26.124,26.558,100.0,30 -18:23:45,5.9417,26.124,26.558,100.0,30 -18:23:45,5.9837,26.124,26.506,100.0,30 -18:23:45,6.0255,26.15,26.532,100.0,30 -18:23:45,6.0675,26.124,26.558,100.0,30 -18:23:46,6.1104,26.175,26.532,100.0,30 -18:23:46,6.1537,26.124,26.583,100.0,30 -18:23:46,6.1960,26.15,26.558,100.0,30 -18:23:46,6.2412,26.15,26.532,100.0,30 -18:23:46,6.2856,26.099,26.532,100.0,30 -18:23:46,6.3280,26.124,26.558,100.0,30 -18:23:46,6.3728,26.124,26.532,100.0,30 -18:23:46,6.4158,26.15,26.558,100.0,30 -18:23:46,6.4579,26.15,26.558,100.0,30 -18:23:46,6.5045,26.15,26.558,100.0,30 -18:23:46,6.5486,26.124,26.558,100.0,30 -18:23:46,6.5912,26.15,26.558,100.0,30 -18:23:46,6.6344,26.15,26.558,100.0,30 -18:23:46,6.6764,26.124,26.583,100.0,30 -18:23:46,6.7246,26.175,26.532,100.0,30 -18:23:46,6.7715,26.15,26.532,100.0,30 -18:23:46,6.8176,26.175,26.558,100.0,30 -18:23:46,6.8637,26.15,26.558,100.0,30 -18:23:46,6.9099,26.15,26.558,100.0,30 -18:23:46,6.9610,26.15,26.558,100.0,30 -18:23:46,7.0100,26.15,26.558,100.0,30 -18:23:46,7.0581,26.201,26.558,100.0,30 -18:23:47,7.1034,26.124,26.583,100.0,30 -18:23:47,7.1495,26.175,26.558,100.0,30 -18:23:47,7.1945,26.175,26.558,100.0,30 -18:23:47,7.2417,26.15,26.558,100.0,30 -18:23:47,7.2895,26.175,26.583,100.0,30 -18:23:47,7.3348,26.15,26.558,100.0,30 -18:23:47,7.3826,26.15,26.558,100.0,30 -18:23:47,7.4302,26.175,26.558,100.0,30 -18:23:47,7.4786,26.15,26.558,100.0,30 -18:23:47,7.5304,26.201,26.558,100.0,30 -18:23:47,7.5816,26.175,26.558,100.0,30 -18:23:47,7.6285,26.175,26.583,100.0,30 -18:23:47,7.6785,26.175,26.558,100.0,30 -18:23:47,7.7304,26.175,26.558,100.0,30 -18:23:47,7.7801,26.175,26.558,100.0,30 -18:23:47,7.8306,26.201,26.558,100.0,30 -18:23:47,7.8713,26.175,26.558,100.0,30 -18:23:47,7.9118,26.175,26.558,100.0,30 -18:23:47,7.9554,26.175,26.558,100.0,30 -18:23:47,7.9966,26.201,26.558,100.0,30 -18:23:47,8.0390,26.175,26.558,100.0,30 -18:23:47,8.0819,26.175,26.583,100.0,30 -18:23:48,8.1211,26.175,26.558,100.0,30 -18:23:48,8.1626,26.175,26.609,100.0,30 -18:23:48,8.2054,26.226,26.609,100.0,30 -18:23:48,8.2490,26.201,26.558,100.0,30 -18:23:48,8.2893,26.201,26.583,100.0,30 -18:23:48,8.3315,26.15,26.583,100.0,30 -18:23:48,8.3720,26.175,26.583,100.0,30 -18:23:48,8.4155,26.175,26.583,100.0,30 -18:23:48,8.4570,26.201,26.558,100.0,30 -18:23:48,8.4979,26.201,26.532,100.0,30 -18:23:48,8.5404,26.175,26.583,100.0,30 -18:23:48,8.5838,26.201,26.532,100.0,30 -18:23:48,8.6247,26.201,26.583,100.0,30 -18:23:48,8.6646,26.201,26.609,100.0,30 -18:23:48,8.7051,26.175,26.583,100.0,30 -18:23:48,8.7498,26.201,26.583,100.0,30 -18:23:48,8.7878,26.201,26.583,100.0,30 -18:23:48,8.8289,26.201,26.609,100.0,30 -18:23:48,8.8688,26.175,26.583,100.0,30 -18:23:48,8.9087,26.201,26.583,100.0,30 -18:23:48,8.9506,26.201,26.583,100.0,30 -18:23:48,8.9922,26.201,26.583,100.0,30 -18:23:48,9.0362,26.201,26.558,100.0,30 -18:23:48,9.0789,26.226,26.558,100.0,30 -18:23:49,9.1241,26.201,26.583,100.0,30 -18:23:49,9.1635,26.252,26.609,100.0,30 -18:23:49,9.2070,26.175,26.609,100.0,30 -18:23:49,9.2494,26.201,26.609,100.0,30 -18:23:49,9.2893,26.201,26.558,100.0,30 -18:23:49,9.3298,26.201,26.609,100.0,30 -18:23:49,9.3724,26.201,26.583,100.0,30 -18:23:49,9.4131,26.226,26.609,100.0,30 -18:23:49,9.4560,26.252,26.609,100.0,30 -18:23:49,9.4963,26.226,26.583,100.0,30 -18:23:49,9.5410,26.226,26.609,100.0,30 -18:23:49,9.5835,26.226,26.609,100.0,30 -18:23:49,9.6247,26.226,26.609,100.0,30 -18:23:49,9.6686,26.226,26.558,100.0,30 -18:23:49,9.7090,26.201,26.609,100.0,30 -18:23:49,9.7536,26.226,26.609,100.0,30 -18:23:49,9.7943,26.226,26.609,100.0,30 -18:23:49,9.8383,26.252,26.609,100.0,30 -18:23:49,9.8818,26.226,26.609,100.0,30 -18:23:49,9.9234,26.226,26.634,100.0,30 -18:23:49,9.9671,26.252,26.532,100.0,30 -18:23:49,10.0101,26.15,26.634,100.0,30 -18:23:49,10.0539,26.226,26.609,100.0,30 -18:23:50,10.0963,26.252,26.609,100.0,30 -18:23:50,10.1397,26.252,26.609,100.0,30 -18:23:50,10.1851,26.252,26.609,100.0,30 -18:23:50,10.2277,26.252,26.634,100.0,30 -18:23:50,10.2718,26.226,26.609,100.0,30 -18:23:50,10.3157,26.252,26.634,100.0,30 -18:23:50,10.3565,26.226,26.634,100.0,30 -18:23:50,10.3998,26.252,26.634,100.0,30 -18:23:50,10.4404,26.252,26.609,100.0,30 -18:23:50,10.4817,26.252,26.634,100.0,30 -18:23:50,10.5252,26.226,26.634,100.0,30 -18:23:50,10.5698,26.252,26.609,100.0,30 -18:23:50,10.6136,26.252,26.634,100.0,30 -18:23:50,10.6579,26.252,26.66,100.0,30 -18:23:50,10.6993,26.277,26.634,100.0,30 -18:23:50,10.7420,26.252,26.634,100.0,30 -18:23:50,10.7873,26.252,26.609,100.0,30 -18:23:50,10.8300,26.226,26.634,100.0,30 -18:23:50,10.8743,26.252,26.685,100.0,30 -18:23:50,10.9166,26.277,26.634,100.0,30 -18:23:50,10.9600,26.277,26.66,100.0,30 -18:23:50,11.0055,26.277,26.66,100.0,30 -18:23:50,11.0483,26.277,26.634,100.0,30 -18:23:50,11.0910,26.277,26.634,100.0,30 -18:23:51,11.1387,26.277,26.66,100.0,30 -18:23:51,11.1813,26.277,26.66,100.0,30 -18:23:51,11.2285,26.277,26.66,100.0,30 -18:23:51,11.2733,26.303,26.634,100.0,30 -18:23:51,11.3166,26.252,26.66,100.0,30 -18:23:51,11.3589,26.277,26.634,100.0,30 -18:23:51,11.4044,26.277,26.66,100.0,30 -18:23:51,11.4489,26.353,26.634,100.0,30 -18:23:51,11.4928,26.303,26.66,100.0,30 -18:23:51,11.5394,26.303,26.634,100.0,30 -18:23:51,11.5827,26.328,26.66,100.0,30 -18:23:51,11.6250,26.303,26.66,100.0,30 -18:23:51,11.6693,26.303,26.66,100.0,30 -18:23:51,11.7137,26.353,26.66,100.0,30 -18:23:51,11.7601,26.353,26.66,100.0,30 -18:23:51,11.8059,26.303,26.634,100.0,30 -18:23:51,11.8485,26.303,26.66,100.0,30 -18:23:51,11.8908,26.328,26.66,100.0,30 -18:23:51,11.9326,26.328,26.66,100.0,30 -18:23:51,11.9756,26.303,26.685,100.0,30 -18:23:51,12.0210,26.328,26.66,100.0,30 -18:23:51,12.0669,26.303,26.66,100.0,30 -18:23:52,12.1135,26.303,26.685,100.0,30 -18:23:52,12.1588,26.328,26.685,100.0,30 -18:23:52,12.2071,26.328,26.634,100.0,30 -18:23:52,12.2546,26.303,26.685,100.0,30 -18:23:52,12.3016,26.328,26.685,100.0,30 -18:23:52,12.3507,26.328,26.685,100.0,30 -18:23:52,12.3943,26.328,26.685,100.0,30 -18:23:52,12.4408,26.328,26.685,100.0,30 -18:23:52,12.4880,26.328,26.711,100.0,30 -18:23:52,12.5335,26.353,26.685,100.0,30 -18:23:52,12.5780,26.353,26.685,100.0,30 -18:23:52,12.6246,26.353,26.685,100.0,30 -18:23:52,12.6668,26.353,26.685,100.0,30 -18:23:52,12.7114,26.379,26.711,100.0,30 -18:23:52,12.7562,26.353,26.711,100.0,30 -18:23:52,12.8045,26.353,26.711,100.0,30 -18:23:52,12.8508,26.328,26.685,100.0,30 -18:23:52,12.8964,26.379,26.711,100.0,30 -18:23:52,12.9396,26.379,26.711,100.0,30 -18:23:52,12.9875,26.379,26.711,100.0,30 -18:23:52,13.0315,26.404,26.711,100.0,30 -18:23:52,13.0743,26.353,26.711,100.0,30 -18:23:53,13.1187,26.379,26.685,100.0,30 -18:23:53,13.1618,26.353,26.711,100.0,30 -18:23:53,13.2105,26.379,26.736,100.0,30 -18:23:53,13.2573,26.379,26.711,100.0,30 -18:23:53,13.3038,26.379,26.736,100.0,30 -18:23:53,13.3498,26.353,26.736,100.0,30 -18:23:53,13.3938,26.379,26.711,100.0,30 -18:23:53,13.4417,26.404,26.736,100.0,30 -18:23:53,13.4884,26.379,26.736,100.0,30 -18:23:53,13.5352,26.404,26.736,100.0,30 -18:23:53,13.5787,26.404,26.711,100.0,30 -18:23:53,13.6260,26.404,26.736,100.0,30 -18:23:53,13.6726,26.404,26.762,100.0,30 -18:23:53,13.7178,26.404,26.736,100.0,30 -18:23:53,13.7596,26.404,26.762,100.0,30 -18:23:53,13.8059,26.404,26.736,100.0,30 -18:23:53,13.8473,26.404,26.762,100.0,30 -18:23:53,13.8916,26.43,26.762,100.0,30 -18:23:53,13.9373,26.404,26.762,100.0,30 -18:23:53,13.9797,26.43,26.762,100.0,30 -18:23:53,14.0232,26.43,26.787,100.0,30 -18:23:53,14.0709,26.43,26.762,100.0,30 -18:23:54,14.1154,26.43,26.762,100.0,30 -18:23:54,14.1587,26.404,26.762,100.0,30 -18:23:54,14.2036,26.43,26.762,100.0,30 -18:23:54,14.2465,26.455,26.787,100.0,30 -18:23:54,14.2886,26.404,26.762,100.0,30 -18:23:54,14.3328,26.43,26.787,100.0,30 -18:23:54,14.3755,26.43,26.787,100.0,30 -18:23:54,14.4212,26.455,26.787,100.0,30 -18:23:54,14.4645,26.481,26.762,100.0,30 -18:23:54,14.5115,26.43,26.787,100.0,30 -18:23:54,14.5624,26.455,26.813,100.0,30 -18:23:54,14.6206,26.43,26.787,100.0,30 -18:23:54,14.6675,26.455,26.762,100.0,30 -18:23:54,14.7138,26.455,26.736,100.0,30 -18:23:54,14.7600,26.455,26.813,100.0,30 -18:23:54,14.8077,26.455,26.787,100.0,30 -18:23:54,14.8552,26.455,26.787,100.0,30 -18:23:54,14.8992,26.43,26.787,100.0,30 -18:23:54,14.9438,26.481,26.813,100.0,30 -18:23:54,14.9984,26.455,26.787,100.0,30 -18:23:54,15.0807,26.43,26.787,100.0,30 -18:23:55,15.1600,26.481,26.813,100.0,30 -18:23:55,15.2198,26.481,26.762,100.0,30 -18:23:55,15.2676,26.481,26.813,100.0,30 -18:23:55,15.3348,26.481,26.813,100.0,30 -18:23:55,15.4322,26.506,26.813,100.0,30 -18:23:55,15.5486,26.481,26.813,100.0,30 -18:23:55,15.6670,26.481,26.864,100.0,30 -18:23:55,15.7848,26.506,26.813,100.0,30 -18:23:55,15.9111,26.506,26.839,100.0,30 -18:23:56,16.1127,26.532,26.864,100.0,30 -18:23:56,16.2040,26.532,26.864,100.0,30 -18:23:56,16.3015,26.532,26.864,100.0,30 -18:23:56,16.3978,26.532,26.864,100.0,30 -18:23:56,16.4981,26.558,26.839,100.0,30 -18:23:56,16.5829,26.532,26.864,100.0,30 -18:23:56,16.6955,26.558,26.839,100.0,30 -18:23:56,16.7963,26.558,26.864,100.0,30 -18:23:56,16.9370,26.583,26.89,100.0,30 -18:23:56,17.0434,26.583,26.89,100.0,30 -18:23:57,17.1025,26.609,26.89,100.0,30 -18:23:57,17.1523,26.583,26.89,100.0,30 -18:23:57,17.2006,26.609,26.915,100.0,30 -18:23:57,17.2465,26.583,26.915,100.0,30 -18:23:57,17.2905,26.609,26.89,100.0,30 -18:23:57,17.3361,26.583,26.89,100.0,30 -18:23:57,17.3826,26.583,26.89,100.0,30 -18:23:57,17.4432,26.634,26.89,100.0,30 -18:23:57,17.4985,26.609,26.915,100.0,30 -18:23:57,17.5490,26.609,26.915,100.0,30 -18:23:57,17.5992,26.558,26.915,100.0,30 -18:23:57,17.6476,26.609,26.915,100.0,30 -18:23:57,17.6905,26.609,26.89,100.0,30 -18:23:57,17.7368,26.609,26.915,100.0,30 -18:23:57,17.7836,26.634,26.915,100.0,30 -18:23:57,17.8276,26.634,26.941,100.0,30 -18:23:57,17.8715,26.634,26.915,100.0,30 -18:23:57,17.9121,26.609,26.967,100.0,30 -18:23:57,17.9572,26.66,26.941,100.0,30 -18:23:57,17.9996,26.634,26.941,100.0,30 -18:23:57,18.0397,26.634,26.915,100.0,30 -18:23:57,18.0871,26.66,26.89,100.0,30 -18:23:58,18.1297,26.66,26.89,100.0,30 -18:23:58,18.1710,26.66,26.941,100.0,30 -18:23:58,18.2115,26.685,26.967,100.0,30 -18:23:58,18.2535,26.634,26.941,100.0,30 -18:23:58,18.2948,26.685,26.967,100.0,30 -18:23:58,18.3389,26.66,26.967,100.0,30 -18:23:58,18.3844,26.685,26.967,100.0,30 -18:23:58,18.4259,26.685,26.967,100.0,30 -18:23:58,18.4697,26.66,26.941,100.0,30 -18:23:58,18.5123,26.736,26.967,100.0,30 -18:23:58,18.5541,26.685,26.967,100.0,30 -18:23:58,18.5955,26.711,26.967,100.0,30 -18:23:58,18.6385,26.711,26.992,100.0,30 -18:23:58,18.6817,26.711,26.967,100.0,30 -18:23:58,18.7232,26.736,26.967,100.0,30 -18:23:58,18.7667,26.711,26.967,100.0,30 -18:23:58,18.8090,26.685,26.967,100.0,30 -18:23:58,18.8532,26.711,26.992,100.0,30 -18:23:58,18.8954,26.736,26.967,100.0,30 -18:23:58,18.9400,26.736,26.992,100.0,30 -18:23:58,18.9850,26.787,26.992,100.0,30 -18:23:58,19.0267,26.736,27.043,100.0,30 -18:23:58,19.0752,26.762,26.992,100.0,30 -18:23:59,19.1200,26.736,26.992,100.0,30 -18:23:59,19.1630,26.736,26.992,100.0,30 -18:23:59,19.2047,26.762,26.992,100.0,30 -18:23:59,19.2466,26.787,26.992,100.0,30 -18:23:59,19.2872,26.762,27.018,100.0,30 -18:23:59,19.3295,26.762,27.018,100.0,30 -18:23:59,19.3715,26.762,26.992,100.0,30 -18:23:59,19.4137,26.787,27.018,100.0,30 -18:23:59,19.4542,26.762,27.018,100.0,30 -18:23:59,19.4963,26.787,27.018,100.0,30 -18:23:59,19.5377,26.762,27.018,100.0,30 -18:23:59,19.5812,26.736,26.992,100.0,30 -18:23:59,19.6220,26.762,27.043,100.0,30 -18:23:59,19.6635,26.762,27.043,100.0,30 -18:23:59,19.7068,26.787,27.018,100.0,30 -18:23:59,19.7526,26.813,27.018,100.0,30 -18:23:59,19.7949,26.787,27.043,100.0,30 -18:23:59,19.8418,26.813,27.043,100.0,30 -18:23:59,19.8873,26.787,27.018,100.0,30 -18:23:59,19.9297,26.813,27.043,100.0,30 -18:23:59,19.9733,26.787,27.043,100.0,30 -18:23:59,20.0219,26.813,27.043,100.0,30 -18:23:59,20.0663,26.813,27.043,100.0,30 -18:24:00,20.1075,26.813,27.069,100.0,30 -18:24:00,20.1563,26.813,27.043,100.0,30 -18:24:00,20.2019,26.813,27.043,100.0,30 -18:24:00,20.2446,26.839,27.069,100.0,30 -18:24:00,20.2890,26.813,27.043,100.0,30 -18:24:00,20.3321,26.839,27.095,100.0,30 -18:24:00,20.3776,26.839,27.069,100.0,30 -18:24:00,20.4230,26.813,27.069,100.0,30 -18:24:00,20.4685,26.839,27.12,100.0,30 -18:24:00,20.5114,26.839,27.069,100.0,30 -18:24:00,20.5554,26.839,27.095,100.0,30 -18:24:00,20.6005,26.813,27.069,100.0,30 -18:24:00,20.6442,26.839,27.069,100.0,30 -18:24:00,20.6887,26.839,27.069,100.0,30 -18:24:00,20.7317,26.915,27.095,100.0,30 -18:24:00,20.7748,26.864,27.095,100.0,30 -18:24:00,20.8215,26.864,27.095,100.0,30 -18:24:00,20.8665,26.864,27.095,100.0,30 -18:24:00,20.9096,26.864,27.095,100.0,30 -18:24:00,20.9556,26.864,27.12,100.0,30 -18:24:00,20.9985,26.864,27.069,100.0,30 -18:24:00,21.0414,26.864,27.12,100.0,30 -18:24:00,21.0867,26.864,27.095,100.0,30 -18:24:01,21.1307,26.864,27.095,100.0,30 -18:24:01,21.1743,26.89,27.095,100.0,30 -18:24:01,21.2188,26.864,27.095,100.0,30 -18:24:01,21.2618,26.839,27.12,100.0,30 -18:24:01,21.3076,26.864,27.146,100.0,30 -18:24:01,21.3521,26.864,27.095,100.0,30 -18:24:01,21.3965,26.915,27.12,100.0,30 -18:24:01,21.4408,26.941,27.095,100.0,30 -18:24:01,21.4876,26.941,27.095,100.0,30 -18:24:01,21.5345,26.915,27.095,100.0,30 -18:24:01,21.5785,26.915,27.12,100.0,30 -18:24:01,21.6216,26.915,27.172,100.0,30 -18:24:01,21.6645,26.915,27.146,100.0,30 -18:24:01,21.7069,26.89,27.146,100.0,30 -18:24:01,21.7528,26.89,27.12,100.0,30 -18:24:01,21.7957,26.941,27.146,100.0,30 -18:24:01,21.8371,26.915,27.146,100.0,30 -18:24:01,21.8805,26.915,27.146,100.0,30 -18:24:01,21.9228,26.941,27.197,100.0,30 -18:24:01,21.9698,26.915,27.146,100.0,30 -18:24:01,22.0121,26.941,27.172,100.0,30 -18:24:01,22.0574,26.941,27.197,100.0,30 -18:24:02,22.1060,26.941,27.172,100.0,30 -18:24:02,22.1498,26.967,27.146,100.0,30 -18:24:02,22.1948,26.941,27.172,100.0,30 -18:24:02,22.2403,26.967,27.146,100.0,30 -18:24:02,22.2865,26.967,27.172,100.0,30 -18:24:02,22.3302,26.967,27.197,100.0,30 -18:24:02,22.3745,26.967,27.197,100.0,30 -18:24:02,22.4198,26.941,27.197,100.0,30 -18:24:02,22.4642,26.967,27.172,100.0,30 -18:24:02,22.5072,26.967,27.197,100.0,30 -18:24:02,22.5554,26.967,27.197,100.0,30 -18:24:02,22.6019,26.967,27.223,100.0,30 -18:24:02,22.6468,26.992,27.249,99.926,30 -18:24:02,22.6906,26.992,27.223,99.198,30 -18:24:02,22.7367,26.992,27.197,99.789,30 -18:24:02,22.7803,26.992,27.223,100.0,30 -18:24:02,22.8236,26.992,27.223,99.932,30 -18:24:02,22.8719,26.967,27.249,100.0,30 -18:24:02,22.9170,26.992,27.249,100.0,30 -18:24:02,22.9627,27.018,27.249,99.634,30 -18:24:02,23.0055,26.992,27.249,99.339,30 -18:24:02,23.0482,27.018,27.249,99.925,30 -18:24:02,23.0907,26.992,27.249,99.619,30 -18:24:03,23.1368,26.992,27.249,100.0,30 -18:24:03,23.1807,27.018,27.274,100.0,30 -18:24:03,23.2252,27.018,27.223,99.334,30 -18:24:03,23.2720,27.018,27.274,100.0,30 -18:24:03,23.3166,26.992,27.274,99.487,30 -18:24:03,23.3604,26.992,27.274,100.0,30 -18:24:03,23.4078,27.018,27.274,100.0,30 -18:24:03,23.4532,27.043,27.3,99.642,30 -18:24:03,23.4986,27.043,27.274,98.913,30 -18:24:03,23.5450,27.043,27.3,99.506,30 -18:24:03,23.5907,27.043,27.3,99.209,30 -18:24:03,23.6364,27.043,27.274,99.357,30 -18:24:03,23.6816,27.069,27.3,99.952,30 -18:24:03,23.7252,27.043,27.3,99.204,30 -18:24:03,23.7716,27.043,27.274,99.792,30 -18:24:03,23.8185,27.043,27.3,100.0,30 -18:24:03,23.8664,27.043,27.3,99.944,30 -18:24:03,23.9106,27.069,27.3,100.0,30 -18:24:03,23.9606,27.069,27.326,99.639,30 -18:24:03,24.0107,27.018,27.3,99.354,30 -18:24:03,24.0589,27.069,27.326,100.0,30 -18:24:04,24.1114,27.069,27.326,99.506,30 -18:24:04,24.1633,27.095,27.326,99.68,30 -18:24:04,24.2088,27.043,27.326,99.395,30 -18:24:04,24.2564,27.069,27.326,100.0,30 -18:24:04,24.3049,27.095,27.274,99.993,30 -18:24:04,24.3533,27.095,27.326,100.0,30 -18:24:04,24.3991,27.069,27.326,99.705,30 -18:24:04,24.4453,27.095,27.351,100.0,30 -18:24:04,24.4949,27.069,27.351,99.422,30 -18:24:04,24.5566,27.095,27.326,100.0,30 -18:24:04,24.6466,27.095,27.351,100.0,30 -18:24:04,24.7354,27.095,27.351,99.7,30 -18:24:04,24.8377,27.12,27.326,99.977,30 -18:24:04,24.9018,27.095,27.326,100.0,30 -18:24:04,24.9478,27.12,27.351,100.0,30 -18:24:04,24.9946,27.12,27.351,99.693,30 -18:24:04,25.0380,27.12,27.351,99.84,30 -18:24:04,25.0833,27.146,27.351,99.977,30 -18:24:05,25.1285,27.146,27.377,99.672,30 -18:24:05,25.1735,27.12,27.377,99.368,30 -18:24:05,25.2195,27.146,27.377,99.956,30 -18:24:05,25.2634,27.146,27.403,99.653,30 -18:24:05,25.3085,27.146,27.403,99.343,30 -18:24:05,25.3560,27.12,27.351,99.484,30 -18:24:05,25.4059,27.146,27.403,100.0,30 -18:24:05,25.4539,27.146,27.403,99.643,30 -18:24:05,25.5006,27.172,27.403,99.789,30 -18:24:05,25.5492,27.172,27.403,99.486,30 -18:24:05,25.6001,27.172,27.403,99.637,30 -18:24:05,25.6486,27.172,27.403,99.795,30 -18:24:05,25.6976,27.146,27.377,99.946,30 -18:24:05,25.7467,27.172,27.428,100.0,30 -18:24:05,25.7931,27.172,27.403,99.668,30 -18:24:05,25.8429,27.197,27.428,100.0,30 -18:24:05,25.8966,27.172,27.428,99.392,30 -18:24:05,25.9483,27.223,27.403,99.987,30 -18:24:05,25.9951,27.172,27.403,99.699,30 -18:24:05,26.0408,27.197,27.454,100.0,30 -18:24:05,26.0905,27.197,27.454,99.409,30 -18:24:06,26.1397,27.197,27.428,99.562,30 -18:24:06,26.1879,27.197,27.428,100.0,30 -18:24:06,26.2367,27.223,27.428,100.0,30 -18:24:06,26.2836,27.223,27.454,99.711,30 -18:24:06,26.3313,27.223,27.454,99.407,30 -18:24:06,26.3782,27.197,27.454,99.552,30 -18:24:06,26.4249,27.223,27.428,100.0,30 -18:24:06,26.4736,27.223,27.454,100.0,30 -18:24:06,26.5260,27.223,27.428,99.705,30 -18:24:06,26.5786,27.223,27.454,100.0,30 -18:24:06,26.6258,27.249,27.454,99.864,30 -18:24:06,26.6754,27.249,27.428,99.56,30 -18:24:06,26.7262,27.249,27.48,100.0,30 -18:24:06,26.7747,27.249,27.48,99.268,30 -18:24:06,26.8242,27.223,27.454,99.413,30 -18:24:06,26.8749,27.249,27.454,100.0,30 -18:24:06,26.9266,27.249,27.48,100.0,30 -18:24:06,26.9726,27.223,27.48,99.567,30 -18:24:06,27.0213,27.249,27.48,100.0,30 -18:24:06,27.0665,27.274,27.48,99.712,30 -18:24:07,27.1168,27.274,27.48,99.422,30 -18:24:07,27.1662,27.3,27.48,99.57,30 -18:24:07,27.2123,27.3,27.48,99.269,30 -18:24:07,27.2580,27.274,27.48,99.407,30 -18:24:07,27.3057,27.3,27.506,99.99,30 -18:24:07,27.3555,27.249,27.48,99.239,30 -18:24:07,27.4215,27.3,27.506,100.0,30 -18:24:07,27.4718,27.274,27.531,99.434,30 -18:24:07,27.5200,27.274,27.506,99.601,30 -18:24:07,27.5675,27.274,27.531,100.0,30 -18:24:07,27.6146,27.3,27.531,99.742,30 -18:24:07,27.6604,27.3,27.531,99.434,30 -18:24:07,27.7084,27.274,27.531,99.569,30 -18:24:07,27.7579,27.326,27.506,100.0,30 -18:24:07,27.8077,27.3,27.531,99.699,30 -18:24:07,27.8557,27.3,27.531,99.863,30 -18:24:07,27.9054,27.274,27.531,100.0,30 -18:24:07,27.9550,27.3,27.531,100.0,30 -18:24:07,28.0035,27.326,27.506,100.0,30 -18:24:07,28.0550,27.326,27.557,99.989,30 -18:24:08,28.1035,27.326,27.583,99.264,30 -18:24:08,28.1532,27.326,27.608,98.958,30 -18:24:08,28.1992,27.351,27.557,98.673,30 -18:24:08,28.2484,27.351,27.583,99.255,30 -18:24:08,28.2977,27.326,27.557,98.949,30 -18:24:08,28.3475,27.351,27.557,99.969,30 -18:24:08,28.3958,27.351,27.557,99.685,30 -18:24:08,28.4452,27.351,27.557,99.825,30 -18:24:08,28.4891,27.3,27.557,99.968,30 -18:24:08,28.5405,27.326,27.531,100.0,30 -18:24:08,28.5907,27.326,27.531,100.0,30 -18:24:08,28.6388,27.351,27.583,100.0,30 -18:24:08,28.6879,27.377,27.583,99.661,30 -18:24:08,28.7346,27.403,27.583,99.356,30 -18:24:08,28.7796,27.377,27.583,99.043,30 -18:24:08,28.8228,27.377,27.634,99.62,30 -18:24:08,28.8684,27.377,27.583,98.868,30 -18:24:08,28.9160,27.377,27.583,99.875,30 -18:24:08,28.9621,27.377,27.608,100.0,30 -18:24:08,29.0062,27.377,27.608,99.576,30 -18:24:08,29.0521,27.377,27.608,99.702,30 -18:24:09,29.0964,27.403,27.583,99.833,30 -18:24:09,29.1405,27.403,27.608,99.943,30 -18:24:09,29.1879,27.403,27.608,99.639,30 -18:24:09,29.2332,27.403,27.608,99.774,30 -18:24:09,29.2799,27.428,27.634,99.904,30 -18:24:09,29.3240,27.403,27.634,99.159,30 -18:24:09,29.3717,27.403,27.583,99.713,30 -18:24:09,29.4198,27.428,27.634,100.0,30 -18:24:09,29.4683,27.428,27.634,99.42,30 -18:24:09,29.5125,27.428,27.608,99.557,30 -18:24:09,29.5595,27.428,27.66,100.0,30 -18:24:09,29.6080,27.428,27.634,99.241,30 -18:24:09,29.6547,27.428,27.608,99.824,30 -18:24:09,29.7000,27.454,27.634,100.0,30 -18:24:09,29.7465,27.454,27.634,99.505,30 -18:24:09,29.7907,27.454,27.634,99.635,30 -18:24:09,29.8404,27.454,27.66,99.759,30 -18:24:09,29.8877,27.454,27.634,99.452,30 -18:24:09,29.9361,27.454,27.634,100.0,30 -18:24:09,29.9830,27.454,27.634,100.0,30 -18:24:09,30.0348,27.454,27.66,100.0,30 -18:24:09,30.0812,27.454,27.66,99.595,30 -18:24:10,30.1274,27.48,27.686,99.724,30 -18:24:10,30.1736,27.48,27.66,98.959,30 -18:24:10,30.2201,27.48,27.66,99.534,30 -18:24:10,30.2653,27.48,27.66,99.663,30 -18:24:10,30.3164,27.506,27.66,99.788,30 -18:24:10,30.3861,27.506,27.686,99.486,30 -18:24:10,30.4498,27.48,27.711,99.23,30 -18:24:10,30.5063,27.48,27.66,99.422,30 -18:24:10,30.5678,27.48,27.686,100.0,30 -18:24:10,30.6245,27.506,27.686,100.0,30 -18:24:10,30.6785,27.48,27.686,99.562,30 -18:24:10,30.7313,27.48,27.711,100.0,30 -18:24:10,30.7843,27.531,27.711,99.724,30 -18:24:10,30.8367,27.531,27.686,98.993,30 -18:24:10,30.8896,27.506,27.737,99.565,30 -18:24:10,30.9441,27.506,27.737,99.262,30 -18:24:10,30.9960,27.531,27.711,99.41,30 -18:24:10,31.0481,27.531,27.711,99.569,30 -18:24:11,31.1009,27.531,27.711,99.71,30 -18:24:11,31.1564,27.506,27.711,99.859,30 -18:24:11,31.2184,27.531,27.737,100.0,30 -18:24:11,31.2791,27.557,27.737,99.58,30 -18:24:11,31.3361,27.506,27.737,99.296,30 -18:24:11,31.3898,27.531,27.737,100.0,30 -18:24:11,31.4409,27.557,27.737,99.887,30 -18:24:11,31.4915,27.531,27.737,99.578,30 -18:24:11,31.5430,27.557,27.763,100.0,30 -18:24:11,31.5906,27.557,27.737,99.269,30 -18:24:11,31.6386,27.583,27.763,99.844,30 -18:24:11,31.6864,27.557,27.737,99.079,30 -18:24:11,31.7325,27.557,27.763,100.0,30 -18:24:11,31.7803,27.557,27.763,99.649,30 -18:24:11,31.8263,27.583,27.763,99.776,30 -18:24:11,31.8815,27.583,27.763,99.452,30 -18:24:11,31.9353,27.608,27.789,99.599,30 -18:24:11,31.9828,27.608,27.763,98.864,30 -18:24:11,32.0293,27.583,27.789,99.436,30 -18:24:11,32.0729,27.608,27.763,99.542,30 -18:24:12,32.1197,27.583,27.815,99.674,30 -18:24:12,32.1647,27.608,27.789,99.334,30 -18:24:12,32.2093,27.583,27.789,99.469,30 -18:24:12,32.2557,27.583,27.789,100.0,30 -18:24:12,32.3059,27.608,27.815,100.0,30 -18:24:12,32.3565,27.608,27.789,99.154,30 -18:24:12,32.4066,27.608,27.789,99.733,30 -18:24:12,32.4565,27.608,27.815,99.865,30 -18:24:12,32.5066,27.634,27.789,99.549,30 -18:24:12,32.5592,27.634,27.815,99.679,30 -18:24:12,32.6094,27.634,27.789,99.37,30 -18:24:12,32.6565,27.608,27.815,99.95,30 -18:24:12,32.7029,27.634,27.789,100.0,30 -18:24:12,32.7496,27.66,27.815,100.0,30 -18:24:12,32.7946,27.66,27.866,99.178,30 -18:24:12,32.8415,27.66,27.789,98.417,30 -18:24:12,32.8886,27.634,27.84,99.862,30 -18:24:12,32.9389,27.608,27.815,99.554,30 -18:24:12,32.9887,27.634,27.84,100.0,30 -18:24:12,33.0362,27.66,27.84,99.683,30 -18:24:12,33.0817,27.66,27.84,99.358,30 -18:24:13,33.1274,27.634,27.84,99.475,30 -18:24:13,33.1728,27.634,27.84,100.0,30 -18:24:13,33.2225,27.66,27.84,100.0,30 -18:24:13,33.2705,27.686,27.84,99.603,30 -18:24:13,33.3161,27.66,27.84,99.279,30 -18:24:13,33.3624,27.686,27.84,99.842,30 -18:24:13,33.4086,27.686,27.84,99.516,30 -18:24:13,33.4583,27.686,27.84,99.632,30 -18:24:13,33.5082,27.711,27.866,99.759,30 -18:24:13,33.5615,27.686,27.866,99.01,30 -18:24:13,33.6120,27.686,27.892,99.576,30 -18:24:13,33.6609,27.711,27.866,99.256,30 -18:24:13,33.7066,27.686,27.918,99.396,30 -18:24:13,33.7573,27.711,27.944,99.047,30 -18:24:13,33.8036,27.711,27.866,98.297,30 -18:24:13,33.8532,27.686,27.892,99.754,30 -18:24:13,33.8993,27.711,27.866,99.862,30 -18:24:13,33.9488,27.711,27.892,99.996,30 -18:24:13,33.9976,27.711,27.892,99.673,30 -18:24:13,34.0668,27.711,27.892,99.796,30 -18:24:14,34.1158,27.711,27.892,99.972,30 -18:24:14,34.1613,27.711,27.892,100.0,30 -18:24:14,34.2067,27.711,27.918,100.0,30 -18:24:14,34.2546,27.711,27.892,99.639,30 -18:24:14,34.3018,27.711,27.892,100.0,30 -18:24:14,34.3489,27.711,27.918,100.0,30 -18:24:14,34.3975,27.737,27.918,99.757,30 -18:24:14,34.4460,27.711,27.918,99.431,30 -18:24:14,34.4925,27.737,27.892,99.999,30 -18:24:14,34.5427,27.737,27.918,100.0,30 -18:24:14,34.5910,27.763,27.918,99.678,30 -18:24:14,34.6385,27.763,27.918,99.35,30 -18:24:14,34.6860,27.763,27.892,99.467,30 -18:24:14,34.7332,27.763,27.918,100.0,30 -18:24:14,34.7808,27.737,27.918,99.584,30 -18:24:14,34.8299,27.763,27.892,100.0,30 -18:24:14,34.8767,27.763,27.866,100.0,30 -18:24:14,34.9218,27.737,27.944,100.0,30 -18:24:14,34.9745,27.763,27.944,99.696,30 -18:24:14,35.0277,27.789,27.944,99.379,30 -18:24:14,35.0731,27.763,27.944,99.062,30 -18:24:15,35.1217,27.763,27.918,99.62,30 -18:24:15,35.1696,27.763,27.944,100.0,30 -18:24:15,35.2167,27.789,27.944,99.738,30 -18:24:15,35.2643,27.789,27.969,99.406,30 -18:24:15,35.3133,27.789,27.995,99.091,30 -18:24:15,35.3621,27.789,27.944,98.763,30 -18:24:15,35.4092,27.789,27.995,99.758,30 -18:24:15,35.4570,27.815,27.944,98.997,30 -18:24:15,35.5088,27.815,27.969,99.541,30 -18:24:15,35.5616,27.815,27.944,99.236,30 -18:24:15,35.6086,27.815,27.995,99.794,30 -18:24:15,35.6602,27.815,27.918,99.033,30 -18:24:15,35.7075,27.815,27.969,100.0,30 -18:24:15,35.7548,27.815,27.995,99.593,30 -18:24:15,35.8039,27.815,27.969,99.26,30 -18:24:15,35.8498,27.815,27.995,99.825,30 -18:24:15,35.8996,27.815,27.969,99.489,30 -18:24:15,35.9496,27.763,27.995,100.0,30 -18:24:15,36.0432,27.815,27.995,100.0,30 -18:24:15,36.0912,27.84,27.995,99.713,30 -18:24:16,36.1396,27.84,27.995,99.397,30 -18:24:16,36.1891,27.815,27.995,99.512,30 -18:24:16,36.2382,27.84,27.995,100.0,30 -18:24:16,36.2861,27.84,28.021,99.629,30 -18:24:16,36.3346,27.84,28.021,99.296,30 -18:24:16,36.3835,27.84,27.995,99.41,30 -18:24:16,36.4306,27.892,28.021,99.973,30 -18:24:16,36.4699,27.866,28.021,98.743,30 -18:24:16,36.5111,27.866,28.047,99.282,30 -18:24:16,36.5517,27.84,28.021,98.933,30 -18:24:16,36.5947,27.866,28.047,99.921,30 -18:24:16,36.6318,27.892,28.021,99.128,30 -18:24:16,36.6726,27.866,28.047,99.215,30 -18:24:16,36.7133,27.892,28.047,99.31,30 -18:24:16,36.7518,27.892,28.047,98.958,30 -18:24:16,36.7926,27.866,28.047,99.049,30 -18:24:16,36.8319,27.866,28.047,99.589,30 -18:24:16,36.8735,27.892,28.047,99.681,30 -18:24:16,36.9179,27.892,28.047,99.331,30 -18:24:16,36.9590,27.892,28.073,99.434,30 -18:24:16,36.9984,27.84,28.047,99.082,30 -18:24:16,37.0371,27.892,28.047,100.0,30 -18:24:16,37.0791,27.918,28.047,99.619,30 -18:24:17,37.1199,27.892,28.021,99.269,30 -18:24:17,37.1593,27.892,28.073,100.0,30 -18:24:17,37.1968,27.84,28.073,99.36,30 -18:24:17,37.2366,27.892,28.073,100.0,30 -18:24:17,37.2784,27.918,28.073,99.452,30 -18:24:17,37.3162,27.918,28.073,99.101,30 -18:24:17,37.3559,27.918,28.073,99.187,30 -18:24:17,37.3993,27.918,28.098,99.278,30 -18:24:17,37.4398,27.944,28.073,98.948,30 -18:24:17,37.4830,27.944,28.098,99.023,30 -18:24:17,37.5226,27.918,28.098,98.692,30 -18:24:17,37.5658,27.918,28.098,99.228,30 -18:24:17,37.6063,27.944,28.073,99.326,30 -18:24:17,37.6465,27.918,28.098,99.401,30 -18:24:17,37.6865,27.944,28.124,99.51,30 -18:24:17,37.7271,27.918,28.098,98.707,30 -18:24:17,37.7645,27.918,28.098,99.692,30 -18:24:17,37.8036,27.918,28.098,99.777,30 -18:24:17,37.8441,27.918,28.15,99.866,30 -18:24:17,37.8835,27.892,28.098,99.064,30 -18:24:17,37.9236,27.944,28.098,100.0,30 -18:24:17,37.9671,27.944,28.098,99.601,30 -18:24:17,38.0100,27.944,28.124,99.7,30 -18:24:17,38.0498,27.944,28.124,99.35,30 -18:24:17,38.0872,27.944,28.124,99.438,30 -18:24:18,38.1287,27.969,28.124,99.522,30 -18:24:18,38.1699,27.944,28.124,99.186,30 -18:24:18,38.2104,28.021,28.124,99.708,30 -18:24:18,38.2486,27.969,28.124,98.475,30 -18:24:18,38.2898,27.969,28.124,99.453,30 -18:24:18,38.3308,27.969,28.124,99.545,30 -18:24:18,38.3703,27.969,28.15,99.637,30 -18:24:18,38.4120,27.969,28.124,99.277,30 -18:24:18,38.4530,27.969,28.124,99.817,30 -18:24:18,38.4933,27.995,28.15,99.909,30 -18:24:18,38.5306,28.021,28.124,99.104,30 -18:24:18,38.5744,27.995,28.15,99.189,30 -18:24:18,38.6155,27.995,28.15,99.283,30 -18:24:18,38.6549,27.995,28.15,99.373,30 -18:24:18,38.6958,27.995,28.15,99.46,30 -18:24:18,38.7335,28.021,28.15,99.55,30 -18:24:18,38.7733,27.995,28.15,99.186,30 -18:24:18,38.8146,27.995,28.176,99.72,30 -18:24:18,38.8536,27.995,28.15,99.364,30 -18:24:18,38.8951,27.995,28.176,99.896,30 -18:24:18,38.9337,28.021,28.176,99.541,30 -18:24:18,38.9748,28.047,28.15,99.178,30 -18:24:18,39.0146,28.021,28.15,99.268,30 -18:24:18,39.0528,28.021,28.15,99.801,30 -18:24:18,39.0949,28.021,28.15,99.884,30 -18:24:19,39.1330,28.021,28.202,99.976,30 -18:24:19,39.1731,28.021,28.15,99.166,30 -18:24:19,39.2163,28.021,28.15,100.0,30 -18:24:19,39.2568,28.047,28.202,100.0,30 -18:24:19,39.2974,28.047,28.176,98.806,30 -18:24:19,39.3365,28.047,28.202,99.339,30 -18:24:19,39.3774,28.021,28.202,98.977,30 -18:24:19,39.4161,28.047,28.202,99.512,30 -18:24:19,39.4556,28.021,28.202,99.148,30 -18:24:19,39.4987,28.047,28.176,99.68,30 -18:24:19,39.5388,28.047,28.202,99.773,30 -18:24:19,39.5816,28.047,28.202,99.412,30 -18:24:19,39.6212,28.047,28.124,99.504,30 -18:24:19,39.6618,28.047,28.202,100.0,30 -18:24:19,39.7012,28.073,28.202,99.591,30 -18:24:19,39.7428,28.047,28.228,99.228,30 -18:24:19,39.7827,28.073,28.228,99.317,30 -18:24:19,39.8237,28.047,28.202,98.954,30 -18:24:19,39.8672,28.073,28.202,99.935,30 -18:24:19,39.9070,28.073,28.228,99.582,30 -18:24:19,39.9503,28.073,28.202,99.22,30 -18:24:19,39.9916,27.995,28.202,99.758,30 -18:24:19,40.0352,28.098,28.228,100.0,30 -18:24:19,40.0766,28.073,28.254,98.973,30 -18:24:20,40.1172,28.073,28.254,99.043,30 -18:24:20,40.1583,28.073,28.228,99.128,30 -18:24:20,40.1981,28.073,28.228,99.661,30 -18:24:20,40.2382,28.098,28.254,99.745,30 -18:24:20,40.2805,28.124,28.254,98.953,30 -18:24:20,40.3203,28.098,28.202,98.594,30 -18:24:20,40.3623,28.073,28.254,100.0,30 -18:24:20,40.4044,28.098,28.254,99.559,30 -18:24:20,40.4467,28.124,28.228,99.216,30 -18:24:20,40.4879,28.098,28.254,99.305,30 -18:24:20,40.5292,28.098,28.28,99.39,30 -18:24:20,40.5720,28.15,28.254,99.029,30 -18:24:20,40.6133,28.098,28.28,98.671,30 -18:24:20,40.6527,28.124,28.254,99.203,30 -18:24:20,40.6945,28.098,28.305,99.284,30 -18:24:20,40.7338,28.124,28.254,98.94,30 -18:24:20,40.7745,28.124,28.28,99.451,30 -18:24:20,40.8144,28.073,28.305,99.088,30 -18:24:20,40.8536,28.124,28.28,99.617,30 -18:24:20,40.8966,28.124,28.305,99.251,30 -18:24:20,40.9360,28.124,28.254,98.91,30 -18:24:20,40.9784,28.124,28.305,99.867,30 -18:24:20,41.0195,28.124,28.305,99.078,30 -18:24:20,41.0619,28.124,28.305,99.162,30 -18:24:21,41.1028,28.15,28.254,99.248,30 -18:24:21,41.1451,28.124,28.28,99.761,30 -18:24:21,41.1841,28.124,28.28,99.848,30 -18:24:21,41.2252,28.15,28.305,99.928,30 -18:24:21,41.2653,28.15,28.305,99.136,30 -18:24:21,41.3074,28.124,28.305,99.217,30 -18:24:21,41.3498,28.15,28.305,99.749,30 -18:24:21,41.3918,28.15,28.305,99.388,30 -18:24:21,41.4320,28.15,28.305,99.474,30 -18:24:21,41.4714,28.15,28.305,99.555,30 -18:24:21,41.5140,28.176,28.331,99.635,30 -18:24:21,41.5570,28.176,28.357,98.827,30 -18:24:21,41.6020,28.176,28.305,98.466,30 -18:24:21,41.6445,28.176,28.331,99.449,30 -18:24:21,41.6840,28.124,28.331,99.087,30 -18:24:21,41.7247,28.15,28.331,100.0,30 -18:24:21,41.7637,28.176,28.331,99.615,30 -18:24:21,41.8061,28.176,28.331,99.246,30 -18:24:21,41.8482,28.176,28.331,99.331,30 -18:24:21,41.8895,28.176,28.331,99.415,30 -18:24:21,41.9325,28.202,28.357,99.497,30 -18:24:21,41.9729,28.15,28.331,98.689,30 -18:24:21,42.0157,28.176,28.357,100.0,30 -18:24:21,42.0572,28.176,28.357,99.22,30 -18:24:22,42.1011,28.176,28.331,99.302,30 -18:24:22,42.1417,28.202,28.331,99.836,30 -18:24:22,42.1811,28.202,28.383,99.47,30 -18:24:22,42.2232,28.202,28.28,98.654,30 -18:24:22,42.2670,28.202,28.357,100.0,30 -18:24:22,42.3092,28.202,28.357,99.186,30 -18:24:22,42.3482,28.228,28.331,99.269,30 -18:24:22,42.3899,28.202,28.383,99.346,30 -18:24:22,42.4324,28.202,28.357,98.981,30 -18:24:22,42.4732,28.202,28.383,99.51,30 -18:24:22,42.5156,28.228,28.383,99.144,30 -18:24:22,42.5585,28.228,28.357,98.78,30 -18:24:22,42.5992,28.228,28.357,99.309,30 -18:24:22,42.6397,28.228,28.383,99.389,30 -18:24:22,42.6831,28.228,28.383,99.021,30 -18:24:22,42.7242,28.254,28.383,99.105,30 -18:24:22,42.7640,28.254,28.409,98.737,30 -18:24:22,42.8055,28.254,28.409,98.367,30 -18:24:22,42.8488,28.254,28.409,98.446,30 -18:24:22,42.8898,28.228,28.383,98.528,30 -18:24:22,42.9331,28.254,28.409,99.501,30 -18:24:22,42.9740,28.228,28.409,98.69,30 -18:24:22,43.0170,28.254,28.409,99.215,30 -18:24:22,43.0589,28.254,28.409,98.851,30 -18:24:23,43.0978,28.254,28.409,98.93,30 -18:24:23,43.1397,28.228,28.409,99.005,30 -18:24:23,43.1822,28.254,28.383,99.531,30 -18:24:23,43.2237,28.254,28.383,99.613,30 -18:24:23,43.2654,28.28,28.435,99.693,30 -18:24:23,43.3065,28.254,28.409,98.432,30 -18:24:23,43.3496,28.28,28.409,99.403,30 -18:24:23,43.3913,28.254,28.409,99.038,30 -18:24:23,43.4312,28.28,28.435,99.564,30 -18:24:23,43.4735,28.28,28.435,98.745,30 -18:24:23,43.5157,28.254,28.409,98.825,30 -18:24:23,43.5572,28.28,28.435,99.799,30 -18:24:23,43.6006,28.28,28.435,98.983,30 -18:24:23,43.6416,28.28,28.461,99.065,30 -18:24:23,43.6825,28.305,28.435,98.695,30 -18:24:23,43.7246,28.305,28.461,98.788,30 -18:24:23,43.7645,28.28,28.461,98.419,30 -18:24:23,43.8056,28.305,28.461,98.923,30 -18:24:23,43.8486,28.305,28.435,98.57,30 -18:24:23,43.8894,28.331,28.409,99.096,30 -18:24:23,43.9317,28.305,28.461,99.172,30 -18:24:23,43.9757,28.28,28.461,98.804,30 -18:24:23,44.0161,28.331,28.461,99.315,30 -18:24:23,44.0575,28.331,28.487,98.513,30 -18:24:24,44.0976,28.331,28.461,98.142,30 -18:24:24,44.1396,28.28,28.461,98.662,30 -18:24:24,44.1826,28.331,28.461,99.616,30 -18:24:24,44.2245,28.331,28.461,98.819,30 -18:24:24,44.2649,28.383,28.461,98.896,30 -18:24:24,44.3067,28.28,28.461,98.075,30 -18:24:24,44.3509,28.357,28.461,99.922,30 -18:24:24,44.3964,28.357,28.513,98.68,30 -18:24:24,44.4396,28.331,28.487,97.869,30 -18:24:24,44.4831,28.357,28.513,98.84,30 -18:24:24,44.5241,28.383,28.487,98.025,30 -18:24:24,44.5653,28.357,28.487,98.098,30 -18:24:24,44.6068,28.357,28.487,98.619,30 -18:24:24,44.6506,28.357,28.487,98.693,30 -18:24:24,44.6916,28.357,28.461,98.773,30 -18:24:24,44.7321,28.357,28.487,99.293,30 -18:24:24,44.7747,28.357,28.487,98.92,30 -18:24:24,44.8152,28.357,28.513,98.997,30 -18:24:24,44.8580,28.357,28.565,98.623,30 -18:24:24,44.8992,28.305,28.513,97.805,30 -18:24:24,44.9408,28.357,28.513,99.666,30 -18:24:24,44.9827,28.357,28.487,98.847,30 -18:24:24,45.0295,28.383,28.513,99.369,30 -18:24:24,45.0731,28.357,28.539,98.56,30 -18:24:25,45.1169,28.383,28.539,98.636,30 -18:24:25,45.1593,28.383,28.513,98.267,30 -18:24:25,45.2055,28.383,28.539,98.789,30 -18:24:25,45.2509,28.383,28.539,98.423,30 -18:24:25,45.2964,28.383,28.513,98.503,30 -18:24:25,45.3532,28.409,28.539,99.031,30 -18:24:25,45.4184,28.383,28.539,98.24,30 -18:24:25,45.4704,28.435,28.539,98.803,30 -18:24:25,45.5208,28.409,28.539,97.995,30 -18:24:25,45.5767,28.409,28.565,98.533,30 -18:24:25,45.6268,28.435,28.565,98.179,30 -18:24:25,45.6792,28.409,28.565,97.819,30 -18:24:25,45.7315,28.409,28.539,98.359,30 -18:24:25,45.7845,28.435,28.513,98.897,30 -18:24:25,45.8372,28.409,28.565,98.99,30 -18:24:25,45.8859,28.409,28.565,98.632,30 -18:24:25,45.9379,28.409,28.539,98.716,30 -18:24:25,45.9951,28.513,28.565,99.254,30 -18:24:25,46.0445,28.435,28.565,97.115,30 -18:24:25,46.0955,28.435,28.565,98.539,30 -18:24:26,46.1476,28.435,28.591,98.63,30 -18:24:26,46.2017,28.461,28.539,98.269,30 -18:24:26,46.2509,28.435,28.565,98.809,30 -18:24:26,46.3063,28.435,28.591,98.893,30 -18:24:26,46.3566,28.461,28.591,98.542,30 -18:24:26,46.4117,28.461,28.617,98.182,30 -18:24:26,46.4614,28.461,28.591,97.823,30 -18:24:26,46.5100,28.461,28.591,98.356,30 -18:24:26,46.5636,28.461,28.617,98.437,30 -18:24:26,46.6146,28.461,28.617,98.081,30 -18:24:26,46.6605,28.461,28.617,98.163,30 -18:24:26,46.7060,28.487,28.591,98.24,30 -18:24:26,46.7510,28.461,28.591,98.316,30 -18:24:26,46.7949,28.487,28.617,98.838,30 -18:24:26,46.8400,28.487,28.591,98.018,30 -18:24:26,46.8816,28.487,28.591,98.539,30 -18:24:26,46.9239,28.487,28.591,98.608,30 -18:24:26,46.9661,28.487,28.643,98.679,30 -18:24:26,47.0184,28.487,28.591,97.856,30 -18:24:26,47.0637,28.487,28.617,98.836,30 -18:24:27,47.1086,28.487,28.643,98.464,30 -18:24:27,47.1490,28.487,28.617,98.091,30 -18:24:27,47.1916,28.513,28.617,98.604,30 -18:24:27,47.2334,28.539,28.643,98.228,30 -18:24:27,47.2746,28.513,28.617,97.402,30 -18:24:27,47.3155,28.539,28.643,98.363,30 -18:24:27,47.3603,28.487,28.617,97.535,30 -18:24:27,47.4047,28.487,28.643,98.949,30 -18:24:27,47.4510,28.513,28.643,98.575,30 -18:24:27,47.4953,28.539,28.643,98.204,30 -18:24:27,47.5389,28.461,28.643,97.829,30 -18:24:27,47.5848,28.487,28.643,99.241,30 -18:24:27,47.6311,28.539,28.617,98.869,30 -18:24:27,47.6748,28.539,28.643,98.498,30 -18:24:27,47.7171,28.539,28.643,98.122,30 -18:24:27,47.7602,28.539,28.643,98.19,30 -18:24:27,47.8024,28.539,28.643,98.259,30 -18:24:27,47.8493,28.565,28.669,98.327,30 -18:24:27,47.8913,28.539,28.669,97.509,30 -18:24:27,47.9345,28.539,28.669,98.023,30 -18:24:27,47.9788,28.539,28.669,98.091,30 -18:24:27,48.0203,28.539,28.669,98.162,30 -18:24:27,48.0670,28.539,28.669,98.227,30 -18:24:28,48.1086,28.539,28.695,98.302,30 -18:24:28,48.1493,28.565,28.669,97.922,30 -18:24:28,48.1922,28.539,28.695,97.985,30 -18:24:28,48.2348,28.565,28.695,98.054,30 -18:24:28,48.2785,28.565,28.669,97.674,30 -18:24:28,48.3197,28.539,28.669,98.19,30 -18:24:28,48.3629,28.565,28.695,98.701,30 -18:24:28,48.4066,28.565,28.669,97.876,30 -18:24:28,48.4481,28.565,28.695,98.391,30 -18:24:28,48.4896,28.565,28.695,98.01,30 -18:24:28,48.5305,28.591,28.695,98.075,30 -18:24:28,48.5746,28.565,28.695,97.692,30 -18:24:28,48.6155,28.565,28.695,98.207,30 -18:24:28,48.6578,28.565,28.695,98.271,30 -18:24:28,48.6976,28.591,28.695,98.338,30 -18:24:28,48.7389,28.591,28.695,97.953,30 -18:24:28,48.7827,28.591,28.695,98.017,30 -18:24:28,48.8288,28.617,28.721,98.085,30 -18:24:28,48.8730,28.591,28.695,97.262,30 -18:24:28,48.9179,28.591,28.773,98.223,30 -18:24:28,48.9655,28.591,28.721,96.951,30 -18:24:28,49.0099,28.591,28.721,97.917,30 -18:24:28,49.0520,28.643,28.747,97.985,30 -18:24:29,49.0997,28.591,28.747,96.708,30 -18:24:29,49.1447,28.617,28.773,97.674,30 -18:24:29,49.1880,28.591,28.721,96.848,30 -18:24:29,49.2345,28.617,28.721,98.254,30 -18:24:29,49.2806,28.643,28.747,97.879,30 -18:24:29,49.3244,28.617,28.747,97.054,30 -18:24:29,49.3657,28.617,28.747,97.566,30 -18:24:29,49.4118,28.617,28.747,97.629,30 -18:24:29,49.4555,28.643,28.747,97.698,30 -18:24:29,49.5027,28.617,28.747,97.317,30 -18:24:29,49.5503,28.643,28.747,97.835,30 -18:24:29,49.5973,28.617,28.773,97.459,30 -18:24:29,49.6408,28.643,28.773,97.529,30 -18:24:29,49.6822,28.643,28.773,97.147,30 -18:24:29,49.7243,28.617,28.773,97.208,30 -18:24:29,49.7676,28.617,28.773,97.717,30 -18:24:29,49.8127,28.643,28.773,97.781,30 -18:24:29,49.8577,28.669,28.773,97.402,30 -18:24:29,49.9030,28.695,28.773,97.021,30 -18:24:29,49.9516,28.669,28.799,96.64,30 -18:24:29,50.0001,28.669,28.799,96.71,30 -18:24:29,50.0467,28.669,28.799,96.78,30 -18:24:29,50.0919,28.669,28.799,96.848,30 -18:24:30,50.1353,28.669,28.773,96.913,30 -18:24:30,50.1815,28.617,28.747,97.423,30 -18:24:30,50.2246,28.669,28.773,98.832,30 -18:24:30,50.2670,28.669,28.799,97.556,30 -18:24:30,50.3107,28.643,28.799,97.171,30 -18:24:30,50.3537,28.669,28.799,97.681,30 -18:24:30,50.4015,28.695,28.799,97.296,30 -18:24:30,50.4474,28.695,28.825,96.918,30 -18:24:30,50.4909,28.695,28.799,96.537,30 -18:24:30,50.5337,28.695,28.825,97.046,30 -18:24:30,50.5776,28.695,28.825,96.66,30 -18:24:30,50.6211,28.695,28.825,96.722,30 -18:24:30,50.6690,28.695,28.825,96.784,30 -18:24:30,50.7155,28.695,28.799,96.852,30 -18:24:30,50.7603,28.695,28.851,97.364,30 -18:24:30,50.8046,28.721,28.825,96.534,30 -18:24:30,50.8490,28.721,28.825,96.596,30 -18:24:30,50.8924,28.695,28.825,96.658,30 -18:24:30,50.9355,28.721,28.851,97.167,30 -18:24:30,50.9816,28.721,28.825,96.333,30 -18:24:30,51.0263,28.721,28.851,96.845,30 -18:24:30,51.0684,28.721,28.851,96.46,30 -18:24:31,51.1163,28.747,28.851,96.518,30 -18:24:31,51.1627,28.721,28.851,96.138,30 -18:24:31,51.2066,28.721,28.851,96.648,30 -18:24:31,51.2496,28.747,28.825,96.709,30 -18:24:31,51.2959,28.747,28.903,96.769,30 -18:24:31,51.3395,28.747,28.851,95.492,30 -18:24:31,51.3820,28.747,28.877,96.444,30 -18:24:31,51.4246,28.747,28.851,96.056,30 -18:24:31,51.4666,28.773,28.851,96.56,30 -18:24:31,51.5137,28.773,28.851,96.171,30 -18:24:31,51.5576,28.747,28.877,96.235,30 -18:24:31,51.6092,28.773,28.877,96.294,30 -18:24:31,51.6626,28.747,28.851,95.919,30 -18:24:31,51.7064,28.747,28.903,96.884,30 -18:24:31,51.7488,28.773,28.903,96.049,30 -18:24:31,51.7944,28.773,28.825,95.659,30 -18:24:31,51.8374,28.773,28.877,97.061,30 -18:24:31,51.8837,28.773,28.903,96.226,30 -18:24:31,51.9300,28.773,28.877,95.841,30 -18:24:31,51.9764,28.773,28.877,96.35,30 -18:24:31,52.0207,28.773,28.903,96.412,30 -18:24:31,52.0669,28.773,28.929,96.024,30 -18:24:32,52.1131,28.773,28.903,95.638,30 -18:24:32,52.1577,28.773,28.903,96.146,30 -18:24:32,52.2025,28.721,28.877,96.205,30 -18:24:32,52.2499,28.773,28.903,97.606,30 -18:24:32,52.2951,28.773,28.903,96.33,30 -18:24:32,52.3406,28.773,28.903,96.39,30 -18:24:32,52.3860,28.825,28.903,96.45,30 -18:24:32,52.4334,28.825,28.903,95.616,30 -18:24:32,52.4806,28.825,28.903,95.677,30 -18:24:32,52.5265,28.799,28.929,95.739,30 -18:24:32,52.5720,28.773,28.903,95.799,30 -18:24:32,52.6151,28.825,28.929,96.752,30 -18:24:32,52.6565,28.747,28.929,95.467,30 -18:24:32,52.6967,28.799,28.929,96.862,30 -18:24:32,52.7376,28.799,28.903,96.021,30 -18:24:32,52.7844,28.825,28.955,96.521,30 -18:24:32,52.8293,28.825,28.955,95.241,30 -18:24:32,52.8710,28.799,28.955,95.298,30 -18:24:32,52.9158,28.825,28.929,95.798,30 -18:24:32,52.9584,28.825,28.955,95.856,30 -18:24:32,53.0000,28.825,28.929,95.463,30 -18:24:32,53.0451,28.799,28.903,95.963,30 -18:24:32,53.0896,28.825,28.929,96.915,30 -18:24:33,53.1315,28.825,28.929,96.079,30 -18:24:33,53.1741,28.825,28.955,96.133,30 -18:24:33,53.2166,28.825,28.929,95.741,30 -18:24:33,53.2592,28.851,28.955,96.241,30 -18:24:33,53.3015,28.799,28.981,95.402,30 -18:24:33,53.3459,28.825,28.955,95.902,30 -18:24:33,53.3904,28.851,28.981,95.959,30 -18:24:33,53.4341,28.851,28.955,95.12,30 -18:24:33,53.4791,28.825,28.981,95.622,30 -18:24:33,53.5226,28.851,29.007,95.678,30 -18:24:33,53.5693,28.877,28.955,94.838,30 -18:24:33,53.6138,28.877,28.955,95.343,30 -18:24:33,53.6570,28.851,28.981,95.398,30 -18:24:33,53.7003,28.877,28.955,95.451,30 -18:24:33,53.7425,28.851,28.981,95.505,30 -18:24:33,53.7855,28.877,28.981,95.557,30 -18:24:33,53.8292,28.903,29.007,95.163,30 -18:24:33,53.8722,28.903,28.981,94.322,30 -18:24:33,53.9140,28.877,28.981,94.821,30 -18:24:33,53.9570,28.877,29.007,95.319,30 -18:24:33,54.0007,28.903,29.007,94.924,30 -18:24:33,54.0452,28.903,29.007,94.53,30 -18:24:33,54.0875,28.877,28.981,94.583,30 -18:24:34,54.1317,28.877,29.007,95.528,30 -18:24:34,54.1751,28.903,29.007,95.134,30 -18:24:34,54.2190,28.903,29.033,94.74,30 -18:24:34,54.2643,28.903,29.033,94.345,30 -18:24:34,54.3067,28.903,28.981,94.399,30 -18:24:34,54.3495,28.877,28.981,95.342,30 -18:24:34,54.3937,28.851,29.033,95.842,30 -18:24:34,54.4386,28.903,29.007,95.449,30 -18:24:34,54.4812,28.903,29.007,95.056,30 -18:24:34,54.5253,28.903,29.007,95.107,30 -18:24:34,54.5677,28.903,29.033,95.159,30 -18:24:34,54.6139,28.929,29.033,94.763,30 -18:24:34,54.6571,28.903,29.007,94.37,30 -18:24:34,54.6993,28.929,29.033,95.314,30 -18:24:34,54.7449,28.903,29.007,94.471,30 -18:24:34,54.7883,28.903,29.033,95.418,30 -18:24:34,54.8336,28.903,29.033,95.023,30 -18:24:34,54.8794,28.929,29.059,95.076,30 -18:24:34,54.9228,28.929,29.033,94.236,30 -18:24:34,54.9667,28.903,29.033,94.733,30 -18:24:34,55.0089,28.929,29.059,95.231,30 -18:24:34,55.0515,28.981,29.033,94.387,30 -18:24:35,55.0961,28.955,29.059,93.988,30 -18:24:35,55.1410,28.903,29.059,94.039,30 -18:24:35,55.1837,28.929,29.033,94.984,30 -18:24:35,55.2261,28.955,29.059,95.034,30 -18:24:35,55.2685,28.955,29.059,94.189,30 -18:24:35,55.3126,28.955,29.059,94.237,30 -18:24:35,55.3556,28.981,29.059,94.287,30 -18:24:35,55.4005,28.955,29.059,93.889,30 -18:24:35,55.4454,28.981,29.085,94.386,30 -18:24:35,55.4903,28.929,29.059,93.543,30 -18:24:35,55.5319,28.955,29.085,94.934,30 -18:24:35,55.5767,28.981,29.085,94.087,30 -18:24:35,55.6197,28.955,29.059,93.691,30 -18:24:35,55.6635,29.007,29.085,94.632,30 -18:24:35,55.7067,28.981,29.085,93.341,30 -18:24:35,55.7495,28.981,29.085,93.835,30 -18:24:35,55.7928,29.007,29.059,93.882,30 -18:24:35,55.8383,28.981,29.111,93.93,30 -18:24:35,55.8835,28.981,29.085,93.533,30 -18:24:35,55.9255,29.007,29.085,94.029,30 -18:24:35,55.9694,28.981,29.085,93.629,30 -18:24:35,56.0139,28.981,29.085,94.124,30 -18:24:35,56.0563,29.007,29.163,94.173,30 -18:24:36,56.0994,29.007,29.111,92.431,30 -18:24:36,56.1464,29.007,29.111,93.372,30 -18:24:36,56.1889,28.981,29.111,93.421,30 -18:24:36,56.2311,29.007,29.111,93.914,30 -18:24:36,56.2741,28.981,29.085,93.512,30 -18:24:36,56.3262,28.981,29.111,94.454,30 -18:24:36,56.3704,29.007,29.111,94.063,30 -18:24:36,56.4166,29.007,29.137,93.664,30 -18:24:36,56.4627,29.007,29.111,93.267,30 -18:24:36,56.5059,29.007,29.111,93.763,30 -18:24:36,56.5491,29.007,29.137,93.809,30 -18:24:36,56.5948,29.007,29.137,93.409,30 -18:24:36,56.6386,29.033,29.137,93.457,30 -18:24:36,56.6809,29.007,29.137,93.056,30 -18:24:36,56.7240,29.007,29.137,93.548,30 -18:24:36,56.7704,29.007,29.137,93.594,30 -18:24:36,56.8180,29.007,29.137,93.643,30 -18:24:36,56.8668,29.033,29.137,93.693,30 -18:24:36,56.9121,29.033,29.137,93.298,30 -18:24:36,56.9617,29.059,29.163,93.345,30 -18:24:36,57.0055,29.059,29.163,92.502,30 -18:24:36,57.0488,29.007,29.163,92.547,30 -18:24:36,57.0907,29.033,29.163,93.485,30 -18:24:37,57.1379,29.007,29.163,93.082,30 -18:24:37,57.1831,29.059,29.163,93.577,30 -18:24:37,57.2295,29.059,29.163,92.73,30 -18:24:37,57.2722,29.059,29.163,92.777,30 -18:24:37,57.3135,28.981,29.163,92.821,30 -18:24:37,57.3603,29.033,29.189,94.206,30 -18:24:37,57.4063,29.059,29.163,92.913,30 -18:24:37,57.4516,29.111,29.137,92.959,30 -18:24:37,57.5050,29.059,29.163,92.558,30 -18:24:37,57.5495,29.085,29.189,93.059,30 -18:24:37,57.6006,29.033,29.189,92.211,30 -18:24:37,57.6503,29.059,29.189,93.154,30 -18:24:37,57.6990,29.085,29.189,92.758,30 -18:24:37,57.7456,29.085,29.189,92.359,30 -18:24:37,57.7923,29.059,29.189,92.405,30 -18:24:37,57.8391,29.059,29.189,92.898,30 -18:24:37,57.8853,29.085,29.215,92.945,30 -18:24:37,57.9373,29.059,29.189,92.097,30 -18:24:37,57.9834,29.111,29.215,93.042,30 -18:24:37,58.0331,29.111,29.189,91.748,30 -18:24:37,58.0819,29.059,29.215,92.241,30 -18:24:38,58.1306,29.111,29.189,92.736,30 -18:24:38,58.1786,29.111,29.215,92.337,30 -18:24:38,58.2244,29.059,29.189,91.936,30 -18:24:38,58.2697,29.085,29.189,93.321,30 -18:24:38,58.3186,29.137,29.189,92.919,30 -18:24:38,58.3668,29.085,29.215,92.073,30 -18:24:38,58.4257,29.111,29.215,92.569,30 -18:24:38,58.4717,29.111,29.215,92.177,30 -18:24:38,58.5157,29.111,29.215,92.22,30 -18:24:38,58.5598,29.085,29.242,92.263,30 -18:24:38,58.6058,29.111,29.268,92.288,30 -18:24:38,58.6479,29.111,29.242,91.437,30 -18:24:38,58.6910,29.137,29.215,91.923,30 -18:24:38,58.7397,29.137,29.242,91.981,30 -18:24:38,58.7840,29.111,29.242,91.563,30 -18:24:38,58.8298,29.137,29.242,92.051,30 -18:24:38,58.8726,29.163,29.242,91.646,30 -18:24:38,58.9158,29.137,29.242,91.239,30 -18:24:38,58.9638,29.137,29.242,91.725,30 -18:24:38,59.0080,29.163,29.242,91.77,30 -18:24:38,59.0546,29.137,29.294,91.364,30 -18:24:39,59.1007,29.163,29.268,90.959,30 -18:24:39,59.1503,29.137,29.268,91.001,30 -18:24:39,59.1966,29.163,29.268,91.492,30 -18:24:39,59.2448,29.137,29.268,91.087,30 -18:24:39,59.2923,29.137,29.242,91.578,30 -18:24:39,59.3360,29.163,29.242,92.068,30 -18:24:39,59.3823,29.163,29.268,91.661,30 -18:24:39,59.4265,29.163,29.294,91.256,30 -18:24:39,59.4712,29.163,29.294,90.849,30 -18:24:39,59.5188,29.137,29.268,90.888,30 -18:24:39,59.5639,29.189,29.268,91.824,30 -18:24:39,59.6146,29.189,29.268,90.971,30 -18:24:39,59.6638,29.189,29.268,91.017,30 -18:24:39,59.7117,29.163,29.268,91.059,30 -18:24:39,59.7599,29.189,29.294,91.549,30 -18:24:39,59.8068,29.163,29.294,90.697,30 -18:24:39,59.8543,29.163,29.294,91.186,30 -18:24:39,59.9002,29.163,29.294,91.227,30 -18:24:39,59.9497,29.215,29.294,91.267,30 -18:24:39,60.0055,29.189,29.294,90.417,30 -18:24:39,60.0601,29.189,29.294,90.912,30 -18:24:40,60.1108,29.189,29.294,90.959,30 -18:24:40,60.1577,29.189,29.32,91.003,30 -18:24:40,60.2048,29.189,29.294,90.597,30 -18:24:40,60.2525,29.242,29.294,91.083,30 -18:24:40,60.3019,29.215,29.294,90.214,30 -18:24:40,60.3819,29.189,29.32,90.719,30 -18:24:40,60.4492,29.215,29.268,90.788,30 -18:24:40,60.5054,29.215,29.294,91.292,30 -18:24:40,60.5574,29.242,29.32,90.894,30 -18:24:40,60.6094,29.242,29.346,90.028,30 -18:24:40,60.6612,29.189,29.32,89.622,30 -18:24:40,60.7113,29.242,29.346,91.022,30 -18:24:40,60.7608,29.242,29.32,89.706,30 -18:24:40,60.8092,29.215,29.372,90.193,30 -18:24:40,60.8593,29.242,29.32,89.803,30 -18:24:40,60.9168,29.242,29.346,90.274,30 -18:24:40,60.9671,29.215,29.346,89.873,30 -18:24:40,61.0165,29.215,29.32,90.378,30 -18:24:40,61.0707,29.242,29.346,90.866,30 -18:24:41,61.1207,29.242,29.32,89.999,30 -18:24:41,61.1701,29.242,29.372,90.487,30 -18:24:41,61.2196,29.242,29.346,89.633,30 -18:24:41,61.2707,29.242,29.346,90.12,30 -18:24:41,61.3187,29.294,29.346,90.161,30 -18:24:41,61.3688,29.242,29.372,89.305,30 -18:24:41,61.4240,29.268,29.372,89.792,30 -18:24:41,61.4721,29.268,29.372,89.388,30 -18:24:41,61.5207,29.268,29.294,89.426,30 -18:24:41,61.5688,29.268,29.346,90.804,30 -18:24:41,61.6173,29.268,29.372,89.95,30 -18:24:41,61.6651,29.294,29.372,89.54,30 -18:24:41,61.7109,29.268,29.372,89.13,30 -18:24:41,61.7562,29.268,29.346,89.613,30 -18:24:41,61.7991,29.294,29.372,90.095,30 -18:24:41,61.8461,29.268,29.372,89.234,30 -18:24:41,61.8991,29.294,29.398,89.718,30 -18:24:41,61.9483,29.294,29.372,88.865,30 -18:24:41,61.9955,29.294,29.398,89.348,30 -18:24:41,62.0397,29.294,29.372,88.937,30 -18:24:41,62.0836,29.294,29.372,89.417,30 -18:24:42,62.1303,29.268,29.398,89.451,30 -18:24:42,62.1775,29.294,29.425,89.486,30 -18:24:42,62.2218,29.32,29.398,88.611,30 -18:24:42,62.2646,29.32,29.372,88.66,30 -18:24:42,62.3097,29.32,29.372,89.138,30 -18:24:42,62.3548,29.32,29.346,89.172,30 -18:24:42,62.3983,29.294,29.398,89.653,30 -18:24:42,62.4510,29.32,29.398,89.239,30 -18:24:42,62.5005,29.32,29.398,88.831,30 -18:24:42,62.5461,29.32,29.398,88.867,30 -18:24:42,62.5944,29.294,29.425,88.902,30 -18:24:42,62.6412,29.294,29.425,88.919,30 -18:24:42,62.6877,29.32,29.398,88.953,30 -18:24:42,62.7355,29.294,29.425,89.005,30 -18:24:42,62.7846,29.32,29.398,89.022,30 -18:24:42,62.8339,29.32,29.425,89.076,30 -18:24:42,62.8829,29.294,29.425,88.647,30 -18:24:42,62.9317,29.32,29.372,89.13,30 -18:24:42,62.9801,29.32,29.425,89.629,30 -18:24:42,63.0259,29.346,29.425,88.754,30 -18:24:42,63.0732,29.32,29.451,88.34,30 -18:24:43,63.1195,29.32,29.425,88.373,30 -18:24:43,63.1682,29.346,29.398,88.853,30 -18:24:43,63.2170,29.294,29.425,88.905,30 -18:24:43,63.2643,29.346,29.425,89.37,30 -18:24:43,63.3117,29.346,29.451,88.51,30 -18:24:43,63.3581,29.372,29.425,88.096,30 -18:24:43,63.4077,29.346,29.425,88.129,30 -18:24:43,63.4553,29.346,29.451,88.609,30 -18:24:43,63.5022,29.346,29.425,88.195,30 -18:24:43,63.5517,29.346,29.451,88.675,30 -18:24:43,63.6015,29.346,29.451,88.262,30 -18:24:43,63.6517,29.346,29.451,88.297,30 -18:24:43,63.7031,29.346,29.477,88.331,30 -18:24:43,63.7514,29.372,29.451,87.919,30 -18:24:43,63.7997,29.372,29.477,87.952,30 -18:24:43,63.8476,29.372,29.477,87.537,30 -18:24:43,63.8959,29.398,29.503,87.568,30 -18:24:43,63.9443,29.372,29.503,86.706,30 -18:24:43,63.9925,29.32,29.477,87.183,30 -18:24:43,64.0387,29.372,29.503,88.556,30 -18:24:44,64.0974,29.398,29.477,87.246,30 -18:24:44,64.1556,29.398,29.477,87.284,30 -18:24:44,64.2045,29.372,29.503,87.321,30 -18:24:44,64.2546,29.346,29.477,87.354,30 -18:24:44,64.3047,29.372,29.477,88.279,30 -18:24:44,64.3536,29.398,29.503,87.866,30 -18:24:44,64.4017,29.372,29.477,87.003,30 -18:24:44,64.4525,29.398,29.503,87.928,30 -18:24:44,64.5006,29.372,29.477,87.067,30 -18:24:44,64.5516,29.372,29.503,87.992,30 -18:24:44,64.6038,29.398,29.503,87.578,30 -18:24:44,64.6509,29.398,29.477,87.164,30 -18:24:44,64.7002,29.398,29.503,87.641,30 -18:24:44,64.7489,29.398,29.503,87.225,30 -18:24:44,64.7978,29.398,29.503,87.256,30 -18:24:44,64.8483,29.398,29.529,87.287,30 -18:24:44,64.8969,29.32,29.529,86.871,30 -18:24:44,64.9467,29.398,29.503,88.242,30 -18:24:44,64.9971,29.425,29.529,87.381,30 -18:24:44,65.0481,29.425,29.503,86.501,30 -18:24:45,65.0964,29.425,29.503,86.978,30 -18:24:45,65.1446,29.425,29.529,87.008,30 -18:24:45,65.1928,29.451,29.503,86.59,30 -18:24:45,65.2410,29.425,29.529,86.619,30 -18:24:45,65.2896,29.425,29.503,86.648,30 -18:24:45,65.3357,29.425,29.555,87.124,30 -18:24:45,65.3856,29.451,29.529,86.258,30 -18:24:45,65.4359,29.425,29.529,86.287,30 -18:24:45,65.4855,29.425,29.555,86.764,30 -18:24:45,65.5341,29.451,29.529,86.346,30 -18:24:45,65.5841,29.451,29.529,86.374,30 -18:24:45,65.6327,29.451,29.529,86.403,30 -18:24:45,65.6814,29.451,29.555,86.432,30 -18:24:45,65.7304,29.451,29.555,86.013,30 -18:24:45,65.7799,29.451,29.555,86.041,30 -18:24:45,65.8304,29.425,29.555,86.069,30 -18:24:45,65.8790,29.477,29.529,86.545,30 -18:24:45,65.9277,29.451,29.555,86.126,30 -18:24:45,65.9760,29.451,29.555,86.154,30 -18:24:45,66.0235,29.477,29.582,86.181,30 -18:24:45,66.0712,29.477,29.582,85.296,30 -18:24:46,66.1192,29.477,29.555,85.322,30 -18:24:46,66.1706,29.451,29.582,85.812,30 -18:24:46,66.2183,29.477,29.582,85.823,30 -18:24:46,66.2687,29.451,29.608,85.403,30 -18:24:46,66.3189,29.503,29.555,85.43,30 -18:24:46,66.3705,29.503,29.634,85.474,30 -18:24:46,66.4176,29.503,29.555,84.143,30 -18:24:46,66.4840,29.477,29.555,85.525,30 -18:24:46,66.5405,29.477,29.608,86.009,30 -18:24:46,66.5920,29.503,29.608,85.129,30 -18:24:46,66.6378,29.503,29.582,84.707,30 -18:24:46,66.6833,29.503,29.608,85.177,30 -18:24:46,66.7309,29.503,29.608,84.754,30 -18:24:46,66.7753,29.477,29.582,84.778,30 -18:24:46,66.8206,29.529,29.608,85.695,30 -18:24:46,66.8664,29.503,29.608,84.378,30 -18:24:46,66.9128,29.529,29.582,84.848,30 -18:24:46,66.9606,29.503,29.608,84.871,30 -18:24:46,67.0067,29.529,29.608,84.895,30 -18:24:46,67.0531,29.529,29.608,84.472,30 -18:24:47,67.0994,29.529,29.634,84.495,30 -18:24:47,67.1457,29.503,29.608,84.07,30 -18:24:47,67.1896,29.529,29.634,84.987,30 -18:24:47,67.2366,29.529,29.582,84.115,30 -18:24:47,67.2815,29.503,29.608,85.031,30 -18:24:47,67.3302,29.555,29.634,85.054,30 -18:24:47,67.3767,29.529,29.634,83.738,30 -18:24:47,67.4245,29.529,29.634,84.206,30 -18:24:47,67.4732,29.529,29.634,84.229,30 -18:24:47,67.5213,29.555,29.634,84.252,30 -18:24:47,67.5697,29.529,29.66,83.828,30 -18:24:47,67.6167,29.555,29.634,83.851,30 -18:24:47,67.6648,29.529,29.66,83.872,30 -18:24:47,67.7106,29.555,29.634,83.894,30 -18:24:47,67.7576,29.555,29.634,83.916,30 -18:24:47,67.8048,29.529,29.634,83.938,30 -18:24:47,67.8519,29.555,29.66,84.407,30 -18:24:47,67.9009,29.555,29.66,83.535,30 -18:24:47,67.9495,29.582,29.634,83.557,30 -18:24:47,67.9966,29.529,29.66,83.561,30 -18:24:47,68.0455,29.582,29.66,84.047,30 -18:24:47,68.0938,29.555,29.687,83.158,30 -18:24:48,68.1455,29.582,29.66,83.179,30 -18:24:48,68.1950,29.582,29.66,83.201,30 -18:24:48,68.2436,29.608,29.687,83.223,30 -18:24:48,68.2929,29.582,29.687,82.332,30 -18:24:48,68.3421,29.555,29.687,82.799,30 -18:24:48,68.3915,29.555,29.687,83.284,30 -18:24:48,68.4397,29.608,29.66,83.305,30 -18:24:48,68.4877,29.582,29.713,82.879,30 -18:24:48,68.5353,29.608,29.687,82.435,30 -18:24:48,68.5870,29.582,29.66,82.454,30 -18:24:48,68.6354,29.582,29.66,83.386,30 -18:24:48,68.6841,29.608,29.687,83.407,30 -18:24:48,68.7337,29.582,29.687,82.517,30 -18:24:48,68.7826,29.608,29.713,82.984,30 -18:24:48,68.8315,29.582,29.713,82.11,30 -18:24:48,68.8809,29.66,29.687,82.576,30 -18:24:48,68.9288,29.634,29.713,81.702,30 -18:24:48,68.9807,29.608,29.713,81.72,30 -18:24:48,69.0312,29.608,29.713,82.186,30 -18:24:48,69.0826,29.608,29.739,82.206,30 -18:24:49,69.1329,29.634,29.713,81.778,30 -18:24:49,69.1823,29.634,29.687,81.797,30 -18:24:49,69.2338,29.608,29.713,82.263,30 -18:24:49,69.2864,29.634,29.713,82.283,30 -18:24:49,69.3358,29.634,29.739,81.856,30 -18:24:49,69.3867,29.634,29.713,81.427,30 -18:24:49,69.4407,29.608,29.739,81.893,30 -18:24:49,69.4966,29.634,29.739,81.913,30 -18:24:49,69.5499,29.608,29.739,81.486,30 -18:24:49,69.6061,29.634,29.739,81.953,30 -18:24:49,69.6556,29.634,29.713,81.526,30 -18:24:49,69.7060,29.634,29.713,81.991,30 -18:24:49,69.7564,29.634,29.765,82.01,30 -18:24:49,69.8027,29.608,29.739,81.134,30 -18:24:49,69.8492,29.687,29.739,82.044,30 -18:24:49,69.8972,29.608,29.765,80.703,30 -18:24:49,69.9460,29.66,29.765,81.631,30 -18:24:49,69.9963,29.66,29.765,80.754,30 -18:24:49,70.0435,29.687,29.739,80.77,30 -18:24:49,70.0905,29.634,29.765,80.768,30 -18:24:50,70.1377,29.634,29.765,81.248,30 -18:24:50,70.1850,29.634,29.765,81.264,30 -18:24:50,70.2378,29.66,29.739,81.281,30 -18:24:50,70.2845,29.634,29.765,81.299,30 -18:24:50,70.3353,29.687,29.765,81.315,30 -18:24:50,70.3863,29.66,29.765,80.421,30 -18:24:50,70.4335,29.687,29.791,80.901,30 -18:24:50,70.4820,29.687,29.739,80.005,30 -18:24:50,70.5300,29.687,29.765,80.914,30 -18:24:50,70.5807,29.66,29.765,80.482,30 -18:24:50,70.6283,29.687,29.791,80.963,30 -18:24:50,70.6806,29.687,29.791,80.067,30 -18:24:50,70.7263,29.66,29.791,80.082,30 -18:24:50,70.7720,29.66,29.765,80.56,30 -18:24:50,70.8263,29.713,29.818,81.022,30 -18:24:50,70.8778,29.713,29.739,79.216,30 -18:24:50,70.9279,29.66,29.791,80.589,30 -18:24:50,70.9809,29.66,29.818,80.622,30 -18:24:50,71.0329,29.687,29.791,80.174,30 -18:24:50,71.0840,29.687,29.818,80.189,30 -18:24:51,71.1364,29.713,29.791,79.74,30 -18:24:51,71.1857,29.687,29.818,79.772,30 -18:24:51,71.2357,29.713,29.791,79.769,30 -18:24:51,71.2852,29.713,29.818,79.8,30 -18:24:51,71.3419,29.713,29.844,79.35,30 -18:24:51,71.3929,29.739,29.818,78.918,30 -18:24:51,71.4415,29.739,29.818,78.931,30 -18:24:51,71.4893,29.739,29.844,78.943,30 -18:24:51,71.5376,29.713,29.818,78.508,30 -18:24:51,71.5842,29.713,29.818,79.414,30 -18:24:51,71.6430,29.765,29.844,79.426,30 -18:24:51,71.6910,29.713,29.844,78.1,30 -18:24:51,71.7397,29.739,29.844,79.005,30 -18:24:51,71.7877,29.713,29.844,78.57,30 -18:24:51,71.8341,29.739,29.818,79.029,30 -18:24:51,71.8818,29.713,29.844,79.04,30 -18:24:51,71.9300,29.739,29.844,79.052,30 -18:24:51,71.9789,29.713,29.844,78.618,30 -18:24:51,72.0280,29.739,29.818,79.076,30 -18:24:51,72.0762,29.765,29.87,79.089,30 -18:24:52,72.1254,29.765,29.87,77.759,30 -18:24:52,72.1752,29.739,29.87,77.77,30 -18:24:52,72.2242,29.713,29.87,78.227,30 -18:24:52,72.2675,29.765,29.844,78.686,30 -18:24:52,72.3096,29.739,29.87,78.249,30 -18:24:52,72.3516,29.713,29.87,78.258,30 -18:24:52,72.3967,29.765,29.87,78.715,30 -18:24:52,72.4374,29.739,29.87,77.831,30 -18:24:52,72.4782,29.791,29.87,78.287,30 -18:24:52,72.5227,29.765,29.87,77.402,30 -18:24:52,72.5633,29.791,29.818,77.857,30 -18:24:52,72.6077,29.765,29.897,78.313,30 -18:24:52,72.6487,29.739,29.897,77.411,30 -18:24:52,72.6918,29.791,29.844,77.866,30 -18:24:52,72.7334,29.765,29.87,77.892,30 -18:24:52,72.7775,29.765,29.87,77.901,30 -18:24:52,72.8198,29.791,29.87,77.91,30 -18:24:52,72.8613,29.791,29.844,77.472,30 -18:24:52,72.9066,29.765,29.87,77.927,30 -18:24:52,72.9494,29.739,29.897,77.937,30 -18:24:52,72.9925,29.791,29.897,77.928,30 -18:24:52,73.0353,29.739,29.897,77.043,30 -18:24:52,73.0797,29.791,29.87,77.945,30 -18:24:53,73.1211,29.791,29.87,77.524,30 -18:24:53,73.1619,29.818,29.923,77.532,30 -18:24:53,73.2023,29.765,29.87,76.164,30 -18:24:53,73.2441,29.791,29.897,77.993,30 -18:24:53,73.2858,29.791,29.897,77.09,30 -18:24:53,73.3273,29.818,29.897,77.098,30 -18:24:53,73.3695,29.791,29.923,76.641,30 -18:24:53,73.4117,29.818,29.87,76.665,30 -18:24:53,73.4534,29.791,29.923,77.119,30 -18:24:53,73.4960,29.791,29.897,76.679,30 -18:24:53,73.5391,29.818,29.897,77.133,30 -18:24:53,73.5812,29.791,29.897,76.677,30 -18:24:53,73.6248,29.818,29.949,77.148,30 -18:24:53,73.6669,29.791,29.923,75.797,30 -18:24:53,73.7116,29.818,29.923,76.714,30 -18:24:53,73.7568,29.791,29.923,76.257,30 -18:24:53,73.7994,29.818,29.923,76.728,30 -18:24:53,73.8446,29.765,29.897,76.271,30 -18:24:53,73.8898,29.791,29.897,77.636,30 -18:24:53,73.9326,29.818,29.923,77.198,30 -18:24:53,73.9859,29.818,29.949,76.294,30 -18:24:53,74.0256,29.818,29.923,75.854,30 -18:24:53,74.0677,29.818,29.923,76.307,30 -18:24:54,74.1118,29.818,29.923,76.313,30 -18:24:54,74.1523,29.844,29.923,76.32,30 -18:24:54,74.1915,29.844,29.949,75.878,30 -18:24:54,74.2347,29.844,29.923,75.437,30 -18:24:54,74.2810,29.844,29.949,75.889,30 -18:24:54,74.3284,29.844,29.949,75.448,30 -18:24:54,74.3715,29.818,29.949,75.454,30 -18:24:54,74.4169,29.844,29.949,75.906,30 -18:24:54,74.4625,29.844,29.923,75.465,30 -18:24:54,74.5078,29.87,29.949,75.917,30 -18:24:54,74.5524,29.844,29.923,75.029,30 -18:24:54,74.5981,29.844,29.975,75.928,30 -18:24:54,74.6404,29.87,29.949,75.04,30 -18:24:54,74.6834,29.87,29.949,75.044,30 -18:24:54,74.7304,29.897,29.949,75.049,30 -18:24:54,74.7761,29.818,29.975,74.589,30 -18:24:54,74.8198,29.87,29.975,75.504,30 -18:24:54,74.8625,29.87,29.975,74.615,30 -18:24:54,74.9085,29.87,29.975,74.619,30 -18:24:54,74.9540,29.87,29.975,74.623,30 -18:24:54,74.9995,29.818,29.975,74.627,30 -18:24:54,75.0432,29.87,30.028,75.525,30 -18:24:55,75.0992,29.87,29.975,73.725,30 -18:24:55,75.1456,29.844,29.975,74.64,30 -18:24:55,75.1937,29.87,29.975,75.091,30 -18:24:55,75.2377,29.87,29.949,74.649,30 -18:24:55,75.2803,29.897,29.949,75.1,30 -18:24:55,75.3260,29.897,29.975,74.64,30 -18:24:55,75.3895,29.844,29.975,74.197,30 -18:24:55,75.4411,29.844,30.002,75.114,30 -18:24:55,75.4941,29.87,29.975,74.655,30 -18:24:55,75.5517,29.897,29.975,74.676,30 -18:24:55,75.6090,29.897,30.002,74.217,30 -18:24:55,75.6554,29.897,30.002,73.757,30 -18:24:55,75.7010,29.87,30.002,73.759,30 -18:24:55,75.7491,29.87,30.028,74.226,30 -18:24:55,75.7966,29.897,29.975,73.783,30 -18:24:55,75.8475,29.923,29.975,74.233,30 -18:24:55,75.9006,29.87,29.975,73.789,30 -18:24:55,75.9491,29.923,30.002,74.704,30 -18:24:55,75.9995,29.897,29.975,73.332,30 -18:24:55,76.0530,29.87,29.975,74.246,30 -18:24:56,76.1095,29.897,30.002,74.715,30 -18:24:56,76.1586,29.923,30.002,73.791,30 -18:24:56,76.2058,29.923,29.975,73.346,30 -18:24:56,76.2520,29.897,30.028,73.813,30 -18:24:56,76.2995,29.897,30.002,73.351,30 -18:24:56,76.3562,29.923,29.975,73.8,30 -18:24:56,76.4075,29.87,30.002,73.821,30 -18:24:56,76.4588,29.949,30.002,74.271,30 -18:24:56,76.5062,29.923,30.002,72.916,30 -18:24:56,76.5515,29.87,30.028,73.364,30 -18:24:56,76.5974,29.897,30.028,73.83,30 -18:24:56,76.6530,29.923,30.002,73.369,30 -18:24:56,76.7012,29.897,30.002,73.371,30 -18:24:56,76.7434,29.949,30.002,73.82,30 -18:24:56,76.7856,29.897,30.028,72.929,30 -18:24:56,76.8278,29.923,30.081,73.377,30 -18:24:56,76.8721,29.87,30.002,72.02,30 -18:24:56,76.9142,29.949,30.054,74.29,30 -18:24:56,76.9606,29.923,30.028,72.04,30 -18:24:56,77.0168,29.897,30.028,72.935,30 -18:24:56,77.0563,29.923,30.054,73.384,30 -18:24:57,77.0972,29.949,30.054,72.491,30 -18:24:57,77.1370,29.923,30.054,72.045,30 -18:24:57,77.1766,29.923,30.054,72.492,30 -18:24:57,77.2162,29.949,30.054,72.492,30 -18:24:57,77.2586,29.949,30.028,72.046,30 -18:24:57,77.3021,29.949,30.002,72.493,30 -18:24:57,77.3448,29.923,30.028,72.94,30 -18:24:57,77.3892,29.923,30.054,72.941,30 -18:24:57,77.4315,29.897,30.028,72.496,30 -18:24:57,77.4767,29.975,30.054,73.39,30 -18:24:57,77.5200,29.949,30.028,71.604,30 -18:24:57,77.5618,29.923,30.054,72.497,30 -18:24:57,77.6097,29.975,30.054,72.498,30 -18:24:57,77.6543,29.949,30.107,71.604,30 -18:24:57,77.7013,29.923,30.054,71.139,30 -18:24:57,77.7437,29.923,30.081,72.496,30 -18:24:57,77.7995,29.949,30.054,72.032,30 -18:24:57,77.8446,29.923,30.028,72.049,30 -18:24:57,77.8903,29.975,30.002,72.944,30 -18:24:57,77.9322,29.975,30.054,72.498,30 -18:24:57,77.9746,29.975,30.002,71.604,30 -18:24:57,78.0158,29.975,30.107,72.498,30 -18:24:57,78.0585,29.975,30.107,70.693,30 -18:24:58,78.1005,29.975,30.054,70.691,30 -18:24:58,78.1431,29.975,30.081,71.6,30 -18:24:58,78.1887,29.975,30.081,71.135,30 -18:24:58,78.2290,29.949,30.081,71.134,30 -18:24:58,78.2734,29.949,30.054,71.579,30 -18:24:58,78.3177,30.002,30.133,72.043,30 -18:24:58,78.3616,29.975,30.107,69.773,30 -18:24:58,78.4049,29.975,30.081,70.681,30 -18:24:58,78.4555,30.002,30.081,71.126,30 -18:24:58,78.5006,30.002,30.054,70.66,30 -18:24:58,78.5433,29.975,30.081,71.122,30 -18:24:58,78.5883,30.002,30.081,71.121,30 -18:24:58,78.6336,29.975,30.028,70.655,30 -18:24:58,78.6785,30.002,30.081,72.029,30 -18:24:58,78.7253,29.975,30.107,70.653,30 -18:24:58,78.7690,29.975,30.054,70.668,30 -18:24:58,78.8109,30.002,30.081,71.577,30 -18:24:58,78.8550,30.028,30.054,70.648,30 -18:24:58,78.8989,29.975,30.081,70.663,30 -18:24:58,78.9438,30.002,30.107,71.108,30 -18:24:58,78.9884,30.002,30.107,70.195,30 -18:24:58,79.0313,29.975,30.107,70.193,30 -18:24:58,79.0758,30.028,30.107,70.654,30 -18:24:59,79.1206,30.002,30.133,69.741,30 -18:24:59,79.1629,30.028,30.133,69.737,30 -18:24:59,79.2079,30.028,30.081,69.287,30 -18:24:59,79.2508,30.002,30.081,70.177,30 -18:24:59,79.2936,30.028,30.133,70.621,30 -18:24:59,79.3363,30.028,30.133,69.278,30 -18:24:59,79.3796,30.028,30.107,69.274,30 -18:24:59,79.4252,30.028,30.133,69.717,30 -18:24:59,79.4684,30.028,30.107,69.267,30 -18:24:59,79.5120,30.002,30.107,69.71,30 -18:24:59,79.5554,30.002,30.133,70.153,30 -18:24:59,79.6015,30.002,30.16,69.704,30 -18:24:59,79.6449,30.002,30.107,69.236,30 -18:24:59,79.6905,30.028,30.133,70.143,30 -18:24:59,79.7420,30.054,30.107,69.246,30 -18:24:59,79.7851,30.028,30.133,69.241,30 -18:24:59,79.8285,30.054,30.16,69.237,30 -18:24:59,79.8747,30.002,30.16,68.322,30 -18:24:59,79.9188,30.054,30.133,69.211,30 -18:24:59,79.9632,30.028,30.133,68.777,30 -18:24:59,80.0124,30.002,30.16,69.219,30 -18:24:59,80.0589,30.054,30.133,69.197,30 -18:25:00,80.1024,30.054,30.107,68.763,30 -18:25:00,80.1457,30.054,30.133,69.205,30 -18:25:00,80.1900,30.054,30.16,68.754,30 -18:25:00,80.2330,30.028,30.133,68.285,30 -18:25:00,80.2787,30.028,30.16,69.191,30 -18:25:00,80.3245,30.028,30.16,68.723,30 -18:25:00,80.3687,30.028,30.16,68.718,30 -18:25:00,80.4123,30.028,30.133,68.713,30 -18:25:00,80.4587,30.054,30.16,69.173,30 -18:25:00,80.5034,30.081,30.133,68.257,30 -18:25:00,80.5485,30.028,30.16,68.252,30 -18:25:00,80.5967,30.028,30.16,68.693,30 -18:25:00,80.6434,30.054,30.16,68.688,30 -18:25:00,80.6863,30.002,30.133,68.236,30 -18:25:00,80.7277,30.081,30.133,69.589,30 -18:25:00,80.7707,30.081,30.16,68.228,30 -18:25:00,80.8142,30.028,30.133,67.758,30 -18:25:00,80.8594,30.054,30.186,69.128,30 -18:25:00,80.9061,30.081,30.186,67.765,30 -18:25:00,80.9505,30.028,30.186,67.294,30 -18:25:00,81.0016,30.081,30.16,68.199,30 -18:25:00,81.0433,30.054,30.186,67.728,30 -18:25:00,81.0862,30.107,30.133,67.74,30 -18:25:01,81.1307,30.054,30.16,67.734,30 -18:25:01,81.1753,30.081,30.186,68.175,30 -18:25:01,81.2183,30.081,30.186,67.258,30 -18:25:01,81.2609,30.054,30.16,67.251,30 -18:25:01,81.3066,30.054,30.212,68.156,30 -18:25:01,81.3524,30.081,30.16,67.256,30 -18:25:01,81.3968,30.054,30.212,67.679,30 -18:25:01,81.4468,30.081,30.16,67.243,30 -18:25:01,81.4914,30.107,30.212,67.666,30 -18:25:01,81.5339,30.002,30.186,66.318,30 -18:25:01,81.5765,30.054,30.107,68.563,30 -18:25:01,81.6189,30.107,30.212,69.023,30 -18:25:01,81.6580,30.107,30.186,66.302,30 -18:25:01,81.7001,30.081,30.16,66.742,30 -18:25:01,81.7434,30.107,30.186,67.629,30 -18:25:01,81.7875,30.081,30.186,66.729,30 -18:25:01,81.8362,30.054,30.212,67.168,30 -18:25:01,81.8770,30.107,30.186,67.178,30 -18:25:01,81.9205,30.028,30.16,66.708,30 -18:25:01,81.9681,30.081,30.212,68.506,30 -18:25:01,82.0109,30.107,30.186,66.695,30 -18:25:01,82.0586,30.081,30.186,66.688,30 -18:25:02,82.1020,30.081,30.212,67.127,30 -18:25:02,82.1447,30.081,30.239,66.674,30 -18:25:02,82.1923,30.107,30.212,66.202,30 -18:25:02,82.2386,30.081,30.16,66.211,30 -18:25:02,82.2865,30.054,30.212,67.544,30 -18:25:02,82.3298,30.107,30.212,67.107,30 -18:25:02,82.3779,30.107,30.212,66.189,30 -18:25:02,82.4255,30.133,30.212,66.18,30 -18:25:02,82.4665,30.081,30.239,65.724,30 -18:25:02,82.5112,30.107,30.212,66.146,30 -18:25:02,82.5554,30.081,30.212,66.155,30 -18:25:02,82.5999,30.107,30.239,66.594,30 -18:25:02,82.6407,30.081,30.186,65.676,30 -18:25:02,82.6850,30.081,30.239,67.026,30 -18:25:02,82.7287,30.133,30.212,66.108,30 -18:25:02,82.7734,30.107,30.212,65.67,30 -18:25:02,82.8149,30.107,30.239,66.108,30 -18:25:02,82.8579,30.133,30.212,65.636,30 -18:25:02,82.8987,30.107,30.239,65.645,30 -18:25:02,82.9437,30.16,30.212,65.62,30 -18:25:02,82.9909,30.133,30.239,65.164,30 -18:25:02,83.0349,30.107,30.239,65.154,30 -18:25:02,83.0745,30.133,30.212,65.591,30 -18:25:03,83.1183,30.133,30.212,65.601,30 -18:25:03,83.1574,30.107,30.212,65.592,30 -18:25:03,83.1988,30.133,30.239,66.032,30 -18:25:03,83.2442,30.133,30.212,65.113,30 -18:25:03,83.2890,30.133,30.239,65.567,30 -18:25:03,83.3326,30.133,30.265,65.094,30 -18:25:03,83.3807,30.16,30.239,64.638,30 -18:25:03,83.4260,30.16,30.239,64.61,30 -18:25:03,83.4802,30.133,30.265,64.599,30 -18:25:03,83.5269,30.133,30.292,64.604,30 -18:25:03,83.5765,30.133,30.265,64.129,30 -18:25:03,83.6237,30.133,30.265,64.582,30 -18:25:03,83.6760,30.107,30.265,64.571,30 -18:25:03,83.7207,30.16,30.239,65.006,30 -18:25:03,83.7641,30.16,30.265,64.532,30 -18:25:03,83.8106,30.16,30.265,64.075,30 -18:25:03,83.8545,30.16,30.265,64.064,30 -18:25:03,83.9008,30.107,30.265,64.053,30 -18:25:03,83.9462,30.133,30.292,64.954,30 -18:25:03,83.9915,30.186,30.265,64.033,30 -18:25:03,84.0346,30.133,30.265,63.574,30 -18:25:03,84.0768,30.133,30.265,64.475,30 -18:25:04,84.1223,30.186,30.239,64.465,30 -18:25:04,84.1674,30.133,30.239,63.99,30 -18:25:04,84.2122,30.186,30.239,64.891,30 -18:25:04,84.2573,30.16,30.318,63.97,30 -18:25:04,84.3025,30.16,30.292,63.048,30 -18:25:04,84.3467,30.186,30.318,63.482,30 -18:25:04,84.3959,30.16,30.265,62.577,30 -18:25:04,84.4428,30.186,30.292,63.921,30 -18:25:04,84.4864,30.133,30.292,62.998,30 -18:25:04,84.5318,30.16,30.265,63.898,30 -18:25:04,84.5795,30.16,30.318,63.887,30 -18:25:04,84.6267,30.16,30.318,62.964,30 -18:25:04,84.6727,30.186,30.292,62.951,30 -18:25:04,84.7174,30.212,30.292,62.938,30 -18:25:04,84.7607,30.212,30.318,62.479,30 -18:25:04,84.8066,30.186,30.292,62.019,30 -18:25:04,84.8527,30.16,30.318,62.9,30 -18:25:04,84.8993,30.186,30.292,62.887,30 -18:25:04,84.9445,30.186,30.292,62.875,30 -18:25:04,84.9897,30.186,30.292,62.862,30 -18:25:04,85.0347,30.16,30.318,62.85,30 -18:25:04,85.0777,30.212,30.292,62.838,30 -18:25:05,85.1243,30.239,30.265,62.379,30 -18:25:05,85.1685,30.186,30.318,62.365,30 -18:25:05,85.2115,30.16,30.318,62.353,30 -18:25:05,85.2567,30.16,30.318,62.787,30 -18:25:05,85.3011,30.212,30.318,62.775,30 -18:25:05,85.3453,30.212,30.292,61.869,30 -18:25:05,85.3928,30.212,30.318,62.302,30 -18:25:05,85.4376,30.212,30.292,61.841,30 -18:25:05,85.4814,30.212,30.318,62.275,30 -18:25:05,85.5287,30.212,30.318,61.815,30 -18:25:05,85.5752,30.186,30.318,61.801,30 -18:25:05,85.6228,30.212,30.318,62.234,30 -18:25:05,85.6692,30.16,30.344,61.773,30 -18:25:05,85.7160,30.239,30.318,62.206,30 -18:25:05,85.7602,30.212,30.318,61.281,30 -18:25:05,85.8163,30.186,30.292,61.732,30 -18:25:05,85.8609,30.212,30.371,62.609,30 -18:25:05,85.9106,30.239,30.344,60.791,30 -18:25:05,85.9595,30.186,30.371,60.775,30 -18:25:05,86.0148,30.239,30.318,61.206,30 -18:25:05,86.0625,30.239,30.318,61.188,30 -18:25:06,86.1085,30.212,30.371,61.173,30 -18:25:06,86.1544,30.239,30.344,60.711,30 -18:25:06,86.1986,30.239,30.318,60.696,30 -18:25:06,86.2455,30.186,30.318,61.128,30 -18:25:06,86.2930,30.265,30.344,62.025,30 -18:25:06,86.3407,30.212,30.397,60.205,30 -18:25:06,86.3899,30.212,30.371,60.189,30 -18:25:06,86.4335,30.212,30.344,60.619,30 -18:25:06,86.4865,30.239,30.344,61.068,30 -18:25:06,86.5311,30.265,30.318,60.587,30 -18:25:06,86.5789,30.239,30.371,60.572,30 -18:25:06,86.6273,30.186,30.371,60.092,30 -18:25:06,86.6709,30.239,30.371,60.987,30 -18:25:06,86.7161,30.265,30.344,60.062,30 -18:25:06,86.7598,30.265,30.371,60.063,30 -18:25:06,86.8073,30.265,30.344,59.583,30 -18:25:06,86.8515,30.212,30.371,60.03,30 -18:25:06,86.8953,30.292,30.344,60.462,30 -18:25:06,86.9425,30.212,30.397,59.536,30 -18:25:06,86.9871,30.265,30.371,59.984,30 -18:25:06,87.0311,30.265,30.371,59.504,30 -18:25:06,87.0775,30.265,30.344,59.488,30 -18:25:07,87.1237,30.265,30.371,59.935,30 -18:25:07,87.1684,30.212,30.371,59.455,30 -18:25:07,87.2123,30.344,30.344,60.35,30 -18:25:07,87.2598,30.265,30.371,58.53,30 -18:25:07,87.3037,30.265,30.371,59.405,30 -18:25:07,87.3485,30.239,30.371,59.389,30 -18:25:07,87.4012,30.239,30.397,59.82,30 -18:25:07,87.4425,30.292,30.371,59.355,30 -18:25:07,87.4852,30.265,30.371,58.875,30 -18:25:07,87.5285,30.292,30.397,59.324,30 -18:25:07,87.5754,30.292,30.371,58.396,30 -18:25:07,87.6196,30.292,30.397,58.825,30 -18:25:07,87.6631,30.265,30.397,58.361,30 -18:25:07,87.7072,30.292,30.371,58.808,30 -18:25:07,87.7490,30.292,30.344,58.775,30 -18:25:07,87.7934,30.239,30.397,59.223,30 -18:25:07,87.8383,30.265,30.397,59.207,30 -18:25:07,87.8815,30.292,30.344,58.743,30 -18:25:07,87.9257,30.292,30.371,59.174,30 -18:25:07,87.9707,30.292,30.397,58.694,30 -18:25:07,88.0135,30.265,30.424,58.23,30 -18:25:07,88.0602,30.318,30.371,58.213,30 -18:25:08,88.1023,30.292,30.371,58.194,30 -18:25:08,88.1525,30.292,30.397,58.625,30 -18:25:08,88.1952,30.292,30.45,58.159,30 -18:25:08,88.2415,30.292,30.424,57.23,30 -18:25:08,88.2827,30.292,30.344,57.658,30 -18:25:08,88.3306,30.265,30.397,59.017,30 -18:25:08,88.3786,30.318,30.424,58.552,30 -18:25:08,88.4234,30.292,30.397,57.158,30 -18:25:08,88.4745,30.292,30.424,58.05,30 -18:25:08,88.5185,30.292,30.424,57.566,30 -18:25:08,88.5630,30.265,30.397,57.548,30 -18:25:08,88.6096,30.265,30.424,58.459,30 -18:25:08,88.6557,30.239,30.424,57.977,30 -18:25:08,88.7016,30.318,30.397,58.406,30 -18:25:08,88.7456,30.318,30.397,57.494,30 -18:25:08,88.7900,30.265,30.45,57.476,30 -18:25:08,88.8321,30.318,30.424,57.458,30 -18:25:08,88.8738,30.318,30.371,56.976,30 -18:25:08,88.9159,30.292,30.424,57.87,30 -18:25:08,88.9587,30.318,30.45,57.389,30 -18:25:08,89.0035,30.344,30.371,56.477,30 -18:25:08,89.0463,30.318,30.424,57.369,30 -18:25:08,89.0904,30.318,30.371,56.888,30 -18:25:09,89.1333,30.318,30.424,57.78,30 -18:25:09,89.1766,30.344,30.424,56.852,30 -18:25:09,89.2206,30.318,30.424,56.387,30 -18:25:09,89.2664,30.318,30.424,56.814,30 -18:25:09,89.3073,30.292,30.424,56.795,30 -18:25:09,89.3508,30.344,30.45,57.225,30 -18:25:09,89.3986,30.292,30.45,55.866,30 -18:25:09,89.4436,30.318,30.45,56.738,30 -18:25:09,89.4887,30.318,30.424,56.272,30 -18:25:09,89.5298,30.265,30.397,56.699,30 -18:25:09,89.5746,30.318,30.45,58.058,30 -18:25:09,89.6237,30.292,30.45,56.218,30 -18:25:09,89.6685,30.344,30.45,56.643,30 -18:25:09,89.7118,30.318,30.424,55.73,30 -18:25:09,89.7579,30.344,30.424,56.605,30 -18:25:09,89.8018,30.318,30.424,56.138,30 -18:25:09,89.8475,30.292,30.476,56.566,30 -18:25:09,89.8965,30.344,30.424,56.099,30 -18:25:09,89.9430,30.318,30.476,56.078,30 -18:25:09,89.9943,30.371,30.424,55.61,30 -18:25:09,90.0427,30.318,30.503,55.57,30 -18:25:09,90.0943,30.344,30.45,55.1,30 -18:25:10,90.1397,30.318,30.424,55.541,30 -18:25:10,90.1956,30.292,30.45,56.415,30 -18:25:10,90.2454,30.344,30.424,56.391,30 -18:25:10,90.2930,30.371,30.45,55.922,30 -18:25:10,90.3395,30.318,30.45,54.99,30 -18:25:10,90.4036,30.292,30.45,55.878,30 -18:25:10,90.4554,30.344,30.45,56.299,30 -18:25:10,90.5095,30.344,30.45,55.383,30 -18:25:10,90.5621,30.318,30.476,55.358,30 -18:25:10,90.6168,30.344,30.476,55.334,30 -18:25:10,90.6641,30.344,30.476,54.862,30 -18:25:10,90.7129,30.397,30.476,54.84,30 -18:25:10,90.7623,30.371,30.476,53.905,30 -18:25:10,90.8115,30.318,30.476,54.328,30 -18:25:10,90.8686,30.318,30.476,55.216,30 -18:25:10,90.9172,30.344,30.476,55.19,30 -18:25:10,90.9668,30.371,30.503,54.721,30 -18:25:10,91.0186,30.371,30.503,53.769,30 -18:25:10,91.0716,30.397,30.503,53.743,30 -18:25:11,91.1225,30.344,30.503,53.269,30 -18:25:11,91.1767,30.371,30.503,54.154,30 -18:25:11,91.2288,30.397,30.503,53.663,30 -18:25:11,91.2828,30.397,30.476,53.19,30 -18:25:11,91.3371,30.397,30.503,53.627,30 -18:25:11,91.3882,30.397,30.529,53.136,30 -18:25:11,91.4376,30.371,30.503,52.662,30 -18:25:11,91.4905,30.344,30.503,53.53,30 -18:25:11,91.5453,30.371,30.529,53.969,30 -18:25:11,91.5939,30.424,30.503,53.03,30 -18:25:11,91.6400,30.397,30.476,52.541,30 -18:25:11,91.6866,30.344,30.529,53.445,30 -18:25:11,91.7314,30.397,30.503,53.422,30 -18:25:11,91.7776,30.424,30.503,52.935,30 -18:25:11,91.8223,30.371,30.503,52.448,30 -18:25:11,91.8658,30.397,30.529,53.335,30 -18:25:11,91.9127,30.45,30.503,52.419,30 -18:25:11,91.9675,30.397,30.529,51.93,30 -18:25:11,92.0119,30.371,30.503,52.365,30 -18:25:11,92.0575,30.424,30.529,53.236,30 -18:25:12,92.1006,30.397,30.556,51.854,30 -18:25:12,92.1435,30.45,30.582,51.831,30 -18:25:12,92.1890,30.424,30.556,50.449,30 -18:25:12,92.2410,30.397,30.476,51.316,30 -18:25:12,92.2922,30.424,30.503,53.128,30 -18:25:12,92.3380,30.45,30.503,52.173,30 -18:25:12,92.3838,30.424,30.45,51.702,30 -18:25:12,92.4277,30.424,30.556,53.036,30 -18:25:12,92.4730,30.424,30.556,51.191,30 -18:25:12,92.5164,30.397,30.556,51.166,30 -18:25:12,92.5590,30.45,30.503,51.605,30 -18:25:12,92.6036,30.476,30.529,51.582,30 -18:25:12,92.6482,30.45,30.582,50.664,30 -18:25:12,92.6931,30.476,30.582,50.174,30 -18:25:12,92.7384,30.45,30.529,49.7,30 -18:25:12,92.7817,30.45,30.556,51.032,30 -18:25:12,92.8261,30.424,30.582,50.543,30 -18:25:12,92.8728,30.45,30.556,50.517,30 -18:25:12,92.9157,30.424,30.582,50.491,30 -18:25:12,92.9598,30.397,30.609,50.466,30 -18:25:12,93.0055,30.45,30.582,50.441,30 -18:25:12,93.0479,30.476,30.582,49.967,30 -18:25:13,93.0967,30.503,30.556,49.495,30 -18:25:13,93.1401,30.476,30.556,49.449,30 -18:25:13,93.1820,30.476,30.556,49.887,30 -18:25:13,93.2253,30.45,30.582,49.862,30 -18:25:13,93.2700,30.476,30.582,49.836,30 -18:25:13,93.3145,30.424,30.556,49.363,30 -18:25:13,93.3591,30.476,30.582,50.677,30 -18:25:13,93.4146,30.45,30.582,49.311,30 -18:25:13,93.4598,30.476,30.556,49.724,30 -18:25:13,93.5079,30.424,30.556,49.698,30 -18:25:13,93.5534,30.476,30.582,50.564,30 -18:25:13,93.6003,30.45,30.582,49.197,30 -18:25:13,93.6447,30.503,30.582,49.616,30 -18:25:13,93.6905,30.503,30.609,48.679,30 -18:25:13,93.7347,30.424,30.582,48.186,30 -18:25:13,93.7785,30.45,30.582,49.981,30 -18:25:13,93.8248,30.45,30.582,49.508,30 -18:25:13,93.8741,30.45,30.582,49.481,30 -18:25:13,93.9207,30.529,30.609,49.452,30 -18:25:13,93.9682,30.529,30.609,47.601,30 -18:25:13,94.0135,30.503,30.609,47.571,30 -18:25:13,94.0618,30.476,30.635,47.988,30 -18:25:14,94.1110,30.476,30.582,47.975,30 -18:25:14,94.1607,30.424,30.609,48.855,30 -18:25:14,94.2127,30.476,30.609,49.255,30 -18:25:14,94.2602,30.45,30.582,48.33,30 -18:25:14,94.3067,30.45,30.635,49.212,30 -18:25:14,94.3528,30.503,30.582,48.273,30 -18:25:14,94.3992,30.476,30.582,48.244,30 -18:25:14,94.4444,30.503,30.635,48.68,30 -18:25:14,94.4919,30.476,30.582,47.277,30 -18:25:14,94.5373,30.397,30.582,48.622,30 -18:25:14,94.5841,30.503,30.582,49.953,30 -18:25:14,94.6316,30.529,30.609,48.104,30 -18:25:14,94.6773,30.45,30.609,47.163,30 -18:25:14,94.7259,30.503,30.556,48.492,30 -18:25:14,94.7743,30.529,30.582,48.462,30 -18:25:14,94.8193,30.476,30.635,47.539,30 -18:25:14,94.8635,30.476,30.635,47.511,30 -18:25:14,94.9106,30.476,30.609,47.482,30 -18:25:14,94.9587,30.476,30.609,47.9,30 -18:25:14,95.0068,30.503,30.609,47.87,30 -18:25:14,95.0594,30.503,30.609,47.374,30 -18:25:15,95.1094,30.45,30.609,47.342,30 -18:25:15,95.1562,30.503,30.609,48.222,30 -18:25:15,95.2010,30.45,30.609,47.282,30 -18:25:15,95.2454,30.529,30.635,48.165,30 -18:25:15,95.2935,30.503,30.609,46.333,30 -18:25:15,95.3398,30.476,30.582,47.195,30 -18:25:15,95.3856,30.476,30.635,48.095,30 -18:25:15,95.4316,30.503,30.635,47.155,30 -18:25:15,95.4768,30.45,30.635,46.662,30 -18:25:15,95.5263,30.476,30.635,47.544,30 -18:25:15,95.5738,30.476,30.635,47.066,30 -18:25:15,95.6208,30.476,30.609,47.036,30 -18:25:15,95.6666,30.503,30.635,47.453,30 -18:25:15,95.7139,30.476,30.635,46.513,30 -18:25:15,95.7612,30.476,30.609,46.947,30 -18:25:15,95.8078,30.476,30.609,47.364,30 -18:25:15,95.8529,30.529,30.556,47.335,30 -18:25:15,95.8968,30.476,30.635,47.307,30 -18:25:15,95.9459,30.476,30.609,46.833,30 -18:25:15,95.9954,30.503,30.635,47.249,30 -18:25:15,96.0415,30.476,30.635,46.307,30 -18:25:15,96.0859,30.476,30.582,46.741,30 -18:25:16,96.1319,30.476,30.609,47.624,30 -18:25:16,96.1770,30.503,30.609,47.132,30 -18:25:16,96.2247,30.503,30.609,46.64,30 -18:25:16,96.2701,30.45,30.582,46.61,30 -18:25:16,96.3162,30.476,30.609,47.957,30 -18:25:16,96.3625,30.529,30.609,47.018,30 -18:25:16,96.4101,30.503,30.582,46.078,30 -18:25:16,96.4577,30.45,30.609,46.958,30 -18:25:16,96.5026,30.503,30.635,47.376,30 -18:25:16,96.5582,30.529,30.635,45.99,30 -18:25:16,96.6199,30.45,30.582,45.505,30 -18:25:16,96.6648,30.503,30.609,47.737,30 -18:25:16,96.7099,30.476,30.609,46.335,30 -18:25:16,96.7569,30.503,30.635,46.77,30 -18:25:16,96.8018,30.476,30.609,45.83,30 -18:25:16,96.8476,30.529,30.582,46.712,30 -18:25:16,96.8922,30.476,30.582,46.236,30 -18:25:16,96.9404,30.503,30.582,47.12,30 -18:25:16,96.9871,30.503,30.556,46.626,30 -18:25:16,97.0324,30.476,30.556,47.044,30 -18:25:16,97.0764,30.503,30.582,47.481,30 -18:25:17,97.1253,30.503,30.556,46.544,30 -18:25:17,97.1716,30.503,30.582,46.961,30 -18:25:17,97.2172,30.476,30.529,46.486,30 -18:25:17,97.2617,30.476,30.609,47.833,30 -18:25:17,97.3098,30.45,30.582,46.432,30 -18:25:17,97.3582,30.503,30.582,47.313,30 -18:25:17,97.4062,30.503,30.582,46.374,30 -18:25:17,97.4536,30.503,30.556,46.344,30 -18:25:17,97.4982,30.45,30.582,46.762,30 -18:25:17,97.5433,30.476,30.582,47.199,30 -18:25:17,97.5922,30.45,30.582,46.725,30 -18:25:17,97.6405,30.45,30.582,47.142,30 -18:25:17,97.6866,30.503,30.582,47.115,30 -18:25:17,97.7336,30.476,30.582,46.176,30 -18:25:17,97.7790,30.476,30.609,46.611,30 -18:25:17,97.8273,30.45,30.556,46.119,30 -18:25:17,97.8735,30.503,30.556,47.448,30 -18:25:17,97.9178,30.476,30.609,46.51,30 -18:25:17,97.9652,30.503,30.582,46.036,30 -18:25:17,98.0093,30.476,30.556,46.007,30 -18:25:17,98.0582,30.476,30.556,46.891,30 -18:25:18,98.1052,30.529,30.556,46.862,30 -18:25:18,98.1508,30.503,30.582,45.923,30 -18:25:18,98.1945,30.45,30.609,45.895,30 -18:25:18,98.2410,30.529,30.582,46.315,30 -18:25:18,98.2845,30.503,30.556,45.392,30 -18:25:18,98.3297,30.476,30.582,46.259,30 -18:25:18,98.3784,30.45,30.609,46.249,30 -18:25:18,98.4269,30.503,30.582,46.202,30 -18:25:18,98.4744,30.476,30.582,45.726,30 -18:25:18,98.5206,30.476,30.556,46.16,30 -18:25:18,98.5747,30.476,30.556,46.579,30 -18:25:18,98.6241,30.503,30.582,46.548,30 -18:25:18,98.6722,30.476,30.582,45.607,30 -18:25:18,98.7198,30.476,30.582,46.041,30 -18:25:18,98.7663,30.529,30.582,46.013,30 -18:25:18,98.8114,30.529,30.582,45.073,30 -18:25:18,98.8604,30.45,30.609,45.045,30 -18:25:18,98.9081,30.503,30.556,45.908,30 -18:25:18,98.9555,30.529,30.582,45.879,30 -18:25:18,99.0022,30.503,30.582,44.956,30 -18:25:18,99.0481,30.476,30.635,45.374,30 -18:25:18,99.0945,30.529,30.609,44.898,30 -18:25:19,99.1412,30.503,30.582,44.404,30 -18:25:19,99.1871,30.503,30.582,45.285,30 -18:25:19,99.2315,30.556,30.635,45.257,30 -18:25:19,99.2769,30.503,30.582,43.406,30 -18:25:19,99.3247,30.503,30.609,45.199,30 -18:25:19,99.3721,30.45,30.635,44.705,30 -18:25:19,99.4192,30.529,30.582,45.139,30 -18:25:19,99.4636,30.503,30.609,44.662,30 -18:25:19,99.5085,30.476,30.609,44.617,30 -18:25:19,99.5569,30.503,30.609,45.053,30 -18:25:19,99.6046,30.529,30.609,44.559,30 -18:25:19,99.6543,30.476,30.662,44.08,30 -18:25:19,99.6998,30.503,30.582,44.049,30 -18:25:19,99.7429,30.529,30.635,44.931,30 -18:25:19,99.7954,30.503,30.609,43.545,30 -18:25:19,99.8426,30.529,30.662,44.405,30 -18:25:19,99.8896,30.529,30.582,43.016,30 -18:25:19,99.9348,30.529,30.609,44.36,30 -18:25:19,99.9807,30.503,30.635,43.867,30 -18:25:19,100.0272,30.529,30.635,43.837,30 -18:25:19,100.0727,30.503,30.609,43.36,30 -18:25:20,100.1160,30.503,30.582,44.224,30 -18:25:20,100.1605,30.556,30.609,44.661,30 -18:25:20,100.2071,30.529,30.609,43.257,30 -18:25:20,100.2508,30.503,30.609,43.691,30 -18:25:20,100.2952,30.556,30.662,44.109,30 -18:25:20,100.3396,30.503,30.609,42.258,30 -18:25:20,100.3843,30.556,30.635,44.051,30 -18:25:20,100.4297,30.529,30.609,42.664,30 -18:25:20,100.4786,30.503,30.609,43.544,30 -18:25:20,100.5257,30.503,30.635,43.959,30 -18:25:20,100.5726,30.556,30.609,43.482,30 -18:25:20,100.6185,30.529,30.635,42.988,30 -18:25:20,100.6642,30.529,30.635,42.974,30 -18:25:20,100.7072,30.503,30.609,42.944,30 -18:25:20,100.7525,30.529,30.635,43.809,30 -18:25:20,100.7971,30.556,30.609,42.886,30 -18:25:20,100.8428,30.503,30.662,42.839,30 -18:25:20,100.8912,30.503,30.635,42.809,30 -18:25:20,100.9396,30.556,30.609,43.241,30 -18:25:20,100.9878,30.529,30.662,42.746,30 -18:25:20,101.0340,30.529,30.662,42.266,30 -18:25:20,101.0811,30.529,30.635,42.235,30 -18:25:21,101.1275,30.556,30.635,42.667,30 -18:25:21,101.1752,30.503,30.662,42.172,30 -18:25:21,101.2227,30.503,30.688,42.587,30 -18:25:21,101.2704,30.556,30.635,42.108,30 -18:25:21,101.3185,30.556,30.609,42.075,30 -18:25:21,101.3734,30.529,30.609,42.49,30 -18:25:21,101.4220,30.556,30.609,42.918,30 -18:25:21,101.4699,30.503,30.662,42.422,30 -18:25:21,101.5162,30.529,30.635,42.39,30 -18:25:21,101.5636,30.556,30.662,42.376,30 -18:25:21,101.6155,30.582,30.662,41.416,30 -18:25:21,101.6641,30.529,30.688,40.932,30 -18:25:21,101.7087,30.476,30.635,41.362,30 -18:25:21,101.7570,30.556,30.635,43.154,30 -18:25:21,101.8017,30.529,30.635,41.748,30 -18:25:21,101.8450,30.529,30.662,42.182,30 -18:25:21,101.8914,30.503,30.662,41.689,30 -18:25:21,101.9394,30.582,30.635,42.104,30 -18:25:21,101.9861,30.529,30.662,41.178,30 -18:25:21,102.0318,30.529,30.662,41.593,30 -18:25:21,102.0792,30.529,30.609,41.562,30 -18:25:22,102.1280,30.503,30.662,42.441,30 -18:25:22,102.1750,30.503,30.609,41.945,30 -18:25:22,102.2227,30.529,30.635,42.825,30 -18:25:22,102.2706,30.503,30.662,41.9,30 -18:25:22,102.3186,30.529,30.662,41.851,30 -18:25:22,102.3658,30.529,30.635,41.372,30 -18:25:22,102.4123,30.529,30.688,41.804,30 -18:25:22,102.4606,30.556,30.662,40.862,30 -18:25:22,102.5115,30.582,30.635,40.81,30 -18:25:22,102.5586,30.556,30.609,40.793,30 -18:25:22,102.6070,30.529,30.635,41.655,30 -18:25:22,102.6536,30.529,30.662,41.64,30 -18:25:22,102.6983,30.503,30.688,41.144,30 -18:25:22,102.7412,30.582,30.688,41.114,30 -18:25:22,102.7837,30.529,30.688,39.726,30 -18:25:22,102.8291,30.529,30.688,40.607,30 -18:25:22,102.8770,30.556,30.688,40.575,30 -18:25:22,102.9236,30.529,30.688,40.077,30 -18:25:22,102.9712,30.556,30.662,40.508,30 -18:25:22,103.0147,30.529,30.662,40.459,30 -18:25:22,103.0581,30.529,30.662,40.893,30 -18:25:23,103.1027,30.556,30.688,40.863,30 -18:25:23,103.1474,30.556,30.688,39.921,30 -18:25:23,103.1903,30.503,30.688,39.89,30 -18:25:23,103.2371,30.582,30.688,40.771,30 -18:25:23,103.2815,30.556,30.662,39.38,30 -18:25:23,103.3256,30.476,30.688,40.242,30 -18:25:23,103.3728,30.529,30.688,41.14,30 -18:25:23,103.4197,30.556,30.662,40.197,30 -18:25:23,103.4645,30.529,30.662,40.147,30 -18:25:23,103.5094,30.582,30.662,40.579,30 -18:25:23,103.5559,30.529,30.688,39.638,30 -18:25:23,103.6008,30.556,30.715,40.07,30 -18:25:23,103.6488,30.529,30.715,39.11,30 -18:25:23,103.6936,30.582,30.662,39.539,30 -18:25:23,103.7440,30.582,30.715,39.508,30 -18:25:23,103.7928,30.556,30.662,38.56,30 -18:25:23,103.8410,30.556,30.715,39.883,30 -18:25:23,103.8875,30.556,30.715,38.938,30 -18:25:23,103.9327,30.582,30.688,38.904,30 -18:25:23,103.9777,30.556,30.688,38.888,30 -18:25:23,104.0235,30.529,30.662,39.303,30 -18:25:23,104.0689,30.556,30.688,40.182,30 -18:25:24,104.1140,30.609,30.688,39.239,30 -18:25:24,104.1587,30.582,30.662,38.296,30 -18:25:24,104.2041,30.556,30.688,39.174,30 -18:25:24,104.2477,30.556,30.688,39.142,30 -18:25:24,104.2918,30.582,30.662,39.111,30 -18:25:24,104.3377,30.529,30.688,39.08,30 -18:25:24,104.3831,30.556,30.635,39.511,30 -18:25:24,104.4303,30.556,30.688,39.927,30 -18:25:24,104.4746,30.529,30.688,38.983,30 -18:25:24,104.5248,30.556,30.768,39.415,30 -18:25:24,104.5759,30.556,30.715,37.54,30 -18:25:24,104.6260,30.609,30.715,38.414,30 -18:25:24,104.6806,30.529,30.662,37.466,30 -18:25:24,104.7292,30.609,30.688,39.713,30 -18:25:24,104.7766,30.609,30.688,37.856,30 -18:25:24,104.8258,30.582,30.688,37.821,30 -18:25:24,104.8744,30.556,30.688,38.249,30 -18:25:24,104.9230,30.556,30.715,38.661,30 -18:25:24,104.9735,30.582,30.715,38.162,30 -18:25:24,105.0228,30.609,30.715,37.678,30 -18:25:24,105.0779,30.609,30.688,37.177,30 -18:25:25,105.1309,30.582,30.715,37.6,30 -18:25:25,105.1760,30.609,30.688,37.561,30 -18:25:25,105.2259,30.582,30.688,37.528,30 -18:25:25,105.2775,30.556,30.688,37.955,30 -18:25:25,105.3276,30.556,30.715,38.365,30 -18:25:25,105.3883,30.529,30.741,37.865,30 -18:25:25,105.4461,30.609,30.741,37.837,30 -18:25:25,105.5106,30.556,30.715,36.419,30 -18:25:25,105.5720,30.609,30.768,37.729,30 -18:25:25,105.6350,30.556,30.741,35.86,30 -18:25:25,105.6898,30.609,30.741,37.188,30 -18:25:25,105.7418,30.582,30.715,36.235,30 -18:25:25,105.7957,30.556,30.715,37.107,30 -18:25:25,105.8468,30.635,30.688,37.514,30 -18:25:25,105.8968,30.582,30.741,36.583,30 -18:25:25,105.9491,30.582,30.688,36.545,30 -18:25:25,106.0020,30.556,30.741,37.417,30 -18:25:25,106.0578,30.582,30.688,36.914,30 -18:25:26,106.1201,30.582,30.688,37.338,30 -18:25:26,106.1755,30.635,30.715,37.292,30 -18:25:26,106.2364,30.582,30.741,35.876,30 -18:25:26,106.2934,30.556,30.741,36.294,30 -18:25:26,106.3552,30.582,30.715,36.698,30 -18:25:26,106.4145,30.582,30.715,36.652,30 -18:25:26,106.4660,30.582,30.741,36.608,30 -18:25:26,106.5184,30.609,30.715,36.123,30 -18:25:26,106.5724,30.582,30.688,36.066,30 -18:25:26,106.6356,30.582,30.741,36.954,30 -18:25:26,106.6852,30.609,30.715,35.996,30 -18:25:26,106.7310,30.582,30.741,35.942,30 -18:25:26,106.7767,30.582,30.715,35.924,30 -18:25:26,106.8244,30.609,30.688,36.337,30 -18:25:26,106.8736,30.582,30.715,36.301,30 -18:25:26,106.9215,30.609,30.741,36.265,30 -18:25:26,106.9695,30.582,30.715,35.318,30 -18:25:26,107.0264,30.635,30.715,36.193,30 -18:25:26,107.0709,30.609,30.741,35.238,30 -18:25:27,107.1160,30.609,30.768,35.204,30 -18:25:27,107.1714,30.556,30.715,34.705,30 -18:25:27,107.2178,30.609,30.715,36.485,30 -18:25:27,107.2628,30.609,30.741,35.54,30 -18:25:27,107.3066,30.582,30.768,35.059,30 -18:25:27,107.3508,30.635,30.741,35.025,30 -18:25:27,107.3967,30.662,30.741,34.544,30 -18:25:27,107.4419,30.609,30.715,34.043,30 -18:25:27,107.4893,30.609,30.768,35.366,30 -18:25:27,107.5355,30.609,30.715,34.418,30 -18:25:27,107.5835,30.609,30.715,35.293,30 -18:25:27,107.6333,30.609,30.768,35.257,30 -18:25:27,107.6796,30.609,30.715,34.307,30 -18:25:27,107.7268,30.582,30.741,35.183,30 -18:25:27,107.7749,30.582,30.741,35.165,30 -18:25:27,107.8229,30.609,30.715,35.128,30 -18:25:27,107.8683,30.662,30.741,35.075,30 -18:25:27,107.9141,30.609,30.768,33.682,30 -18:25:27,107.9606,30.582,30.741,34.092,30 -18:25:27,108.0098,30.635,30.741,34.984,30 -18:25:27,108.0581,30.609,30.768,34.036,30 -18:25:28,108.1067,30.635,30.768,33.981,30 -18:25:28,108.1546,30.609,30.741,33.495,30 -18:25:28,108.2027,30.635,30.768,34.368,30 -18:25:28,108.2500,30.609,30.768,33.42,30 -18:25:28,108.2972,30.609,30.768,33.829,30 -18:25:28,108.3423,30.609,30.741,33.792,30 -18:25:28,108.3910,30.635,30.741,34.221,30 -18:25:28,108.4399,30.609,30.794,33.735,30 -18:25:28,108.4885,30.609,30.741,33.233,30 -18:25:28,108.5395,30.609,30.768,34.105,30 -18:25:28,108.5939,30.662,30.768,33.602,30 -18:25:28,108.6425,30.635,30.768,32.647,30 -18:25:28,108.6902,30.609,30.794,33.072,30 -18:25:28,108.7394,30.609,30.768,33.034,30 -18:25:28,108.7867,30.662,30.715,33.442,30 -18:25:28,108.8343,30.662,30.768,33.404,30 -18:25:28,108.8807,30.635,30.768,32.455,30 -18:25:28,108.9276,30.635,30.768,32.882,30 -18:25:28,108.9755,30.635,30.768,32.844,30 -18:25:28,109.0223,30.635,30.741,32.806,30 -18:25:28,109.0706,30.662,30.768,33.233,30 -18:25:29,109.1180,30.609,30.794,32.266,30 -18:25:29,109.1665,30.609,30.794,32.691,30 -18:25:29,109.2119,30.609,30.768,32.653,30 -18:25:29,109.2594,30.635,30.768,33.064,30 -18:25:29,109.3067,30.635,30.768,32.579,30 -18:25:29,109.3534,30.662,30.741,32.541,30 -18:25:29,109.3988,30.662,30.768,32.504,30 -18:25:29,109.4426,30.635,30.768,32.003,30 -18:25:29,109.4892,30.662,30.741,32.432,30 -18:25:29,109.5358,30.635,30.768,32.394,30 -18:25:29,109.5841,30.662,30.794,32.357,30 -18:25:29,109.6324,30.662,30.768,31.407,30 -18:25:29,109.6786,30.662,30.741,31.813,30 -18:25:29,109.7232,30.662,30.741,32.24,30 -18:25:29,109.7691,30.609,30.794,32.204,30 -18:25:29,109.8157,30.635,30.794,32.168,30 -18:25:29,109.8627,30.609,30.794,31.683,30 -18:25:29,109.9097,30.688,30.741,32.092,30 -18:25:29,109.9580,30.635,30.768,31.607,30 -18:25:29,110.0071,30.635,30.794,32.015,30 -18:25:29,110.0573,30.662,30.768,31.528,30 -18:25:30,110.1057,30.662,30.768,31.47,30 -18:25:30,110.1528,30.662,30.794,31.431,30 -18:25:30,110.1979,30.635,30.768,30.945,30 -18:25:30,110.2412,30.662,30.768,31.819,30 -18:25:30,110.2865,30.662,30.768,31.32,30 -18:25:30,110.3300,30.662,30.768,31.283,30 -18:25:30,110.3750,30.635,30.715,31.248,30 -18:25:30,110.4225,30.609,30.821,32.587,30 -18:25:30,110.4705,30.662,30.768,31.174,30 -18:25:30,110.5173,30.609,30.794,31.135,30 -18:25:30,110.5753,30.662,30.768,31.56,30 -18:25:30,110.6284,30.635,30.768,31.049,30 -18:25:30,110.6756,30.635,30.794,31.471,30 -18:25:30,110.7253,30.635,30.794,30.986,30 -18:25:30,110.7739,30.662,30.794,30.945,30 -18:25:30,110.8234,30.662,30.768,30.442,30 -18:25:30,110.8743,30.635,30.821,30.847,30 -18:25:30,110.9233,30.635,30.794,30.359,30 -18:25:30,110.9693,30.609,30.768,30.782,30 -18:25:30,111.0136,30.635,30.768,31.639,30 -18:25:30,111.0577,30.635,30.821,31.157,30 -18:25:31,111.1046,30.688,30.821,30.21,30 -18:25:31,111.1489,30.635,30.794,29.26,30 -18:25:31,111.1945,30.635,30.794,30.598,30 -18:25:31,111.2398,30.609,30.794,30.56,30 -18:25:31,111.2865,30.635,30.794,30.97,30 -18:25:31,111.3316,30.635,30.794,30.486,30 -18:25:31,111.3776,30.635,30.768,30.449,30 -18:25:31,111.4244,30.662,30.794,30.858,30 -18:25:31,111.4707,30.688,30.794,29.91,30 -18:25:31,111.5161,30.635,30.794,29.424,30 -18:25:31,111.5638,30.635,30.794,30.297,30 -18:25:31,111.6131,30.635,30.768,30.258,30 -18:25:31,111.6611,30.635,30.794,30.665,30 -18:25:31,111.7088,30.635,30.794,30.179,30 -18:25:31,111.7566,30.635,30.794,30.14,30 -18:25:31,111.8566,30.635,30.794,30.101,30 -18:25:31,111.9076,30.635,30.794,30.02,30 -18:25:31,111.9576,30.662,30.821,29.978,30 -18:25:31,112.0074,30.662,30.794,29.008,30 -18:25:31,112.0541,30.635,30.768,29.431,30 -18:25:32,112.1008,30.688,30.794,30.304,30 -18:25:32,112.1471,30.635,30.794,28.907,30 -18:25:32,112.1946,30.662,30.794,29.778,30 -18:25:32,112.2409,30.635,30.821,29.276,30 -18:25:32,112.2885,30.662,30.794,29.238,30 -18:25:32,112.3342,30.635,30.794,29.199,30 -18:25:32,112.3812,30.662,30.821,29.625,30 -18:25:32,112.4267,30.635,30.821,28.658,30 -18:25:32,112.4736,30.635,30.821,29.084,30 -18:25:32,112.5207,30.609,30.794,29.045,30 -18:25:32,112.5674,30.688,30.794,29.917,30 -18:25:32,112.6144,30.688,30.847,28.521,30 -18:25:32,112.6629,30.688,30.794,27.569,30 -18:25:32,112.7084,30.688,30.847,28.438,30 -18:25:32,112.7655,30.635,30.794,27.489,30 -18:25:32,112.8114,30.688,30.794,29.262,30 -18:25:32,112.8569,30.635,30.821,28.313,30 -18:25:32,112.9046,30.662,30.821,28.722,30 -18:25:32,112.9512,30.688,30.794,28.217,30 -18:25:32,112.9975,30.662,30.794,28.195,30 -18:25:32,113.0431,30.635,30.847,28.603,30 -18:25:32,113.0905,30.635,30.821,28.118,30 -18:25:33,113.1385,30.688,30.847,28.525,30 -18:25:33,113.1882,30.635,30.821,27.127,30 -18:25:33,113.2346,30.662,30.821,28.442,30 -18:25:33,113.2827,30.635,30.794,27.939,30 -18:25:33,113.3285,30.635,30.847,28.827,30 -18:25:33,113.3745,30.662,30.794,27.878,30 -18:25:33,113.4237,30.662,30.794,28.286,30 -18:25:33,113.4708,30.662,30.768,28.246,30 -18:25:33,113.5186,30.662,30.821,28.654,30 -18:25:33,113.5647,30.662,30.794,27.703,30 -18:25:33,113.6129,30.635,30.847,28.128,30 -18:25:33,113.6604,30.715,30.794,27.639,30 -18:25:33,113.7070,30.688,30.821,27.136,30 -18:25:33,113.7547,30.662,30.847,27.096,30 -18:25:33,113.8023,30.662,30.794,27.055,30 -18:25:33,113.8473,30.662,30.794,27.926,30 -18:25:33,113.8912,30.688,30.874,27.888,30 -18:25:33,113.9392,30.688,30.847,26.029,30 -18:25:33,113.9859,30.662,30.847,26.451,30 -18:25:33,114.0389,30.635,30.847,26.857,30 -18:25:33,114.0875,30.662,30.847,27.275,30 -18:25:34,114.1356,30.582,30.821,26.77,30 -18:25:34,114.1813,30.688,30.821,28.552,30 -18:25:34,114.2275,30.609,30.821,26.692,30 -18:25:34,114.2707,30.662,30.821,28.011,30 -18:25:34,114.3159,30.688,30.794,27.064,30 -18:25:34,114.3617,30.662,30.821,27.043,30 -18:25:34,114.4070,30.662,30.821,26.987,30 -18:25:34,114.4525,30.662,30.794,26.949,30 -18:25:34,114.4971,30.662,30.794,27.375,30 -18:25:34,114.5406,30.688,30.847,27.338,30 -18:25:34,114.5883,30.635,30.794,25.943,30 -18:25:34,114.6377,30.635,30.821,27.724,30 -18:25:34,114.6843,30.688,30.821,27.219,30 -18:25:34,114.7302,30.662,30.794,26.269,30 -18:25:34,114.7744,30.662,30.821,27.141,30 -18:25:34,114.8219,30.609,30.821,26.64,30 -18:25:34,114.8686,30.688,30.794,27.511,30 -18:25:34,114.9137,30.662,30.821,26.579,30 -18:25:34,114.9640,30.662,30.821,26.522,30 -18:25:34,115.0105,30.662,30.794,26.481,30 -18:25:34,115.0546,30.688,30.794,26.906,30 -18:25:35,115.1005,30.662,30.794,26.422,30 -18:25:35,115.1449,30.635,30.821,26.83,30 -18:25:35,115.1895,30.662,30.847,26.793,30 -18:25:35,115.2366,30.635,30.847,25.845,30 -18:25:35,115.2827,30.635,30.821,26.268,30 -18:25:35,115.3276,30.635,30.821,26.677,30 -18:25:35,115.3723,30.635,30.821,26.64,30 -18:25:35,115.4212,30.662,30.768,26.602,30 -18:25:35,115.4675,30.662,30.821,27.009,30 -18:25:35,115.5131,30.662,30.794,26.059,30 -18:25:35,115.5575,30.662,30.821,26.485,30 -18:25:35,115.6064,30.635,30.847,25.984,30 -18:25:35,115.6572,30.662,30.847,25.958,30 -18:25:35,115.7038,30.635,30.821,25.452,30 -18:25:35,115.7518,30.635,30.847,26.322,30 -18:25:35,115.7997,30.662,30.821,25.837,30 -18:25:35,115.8453,30.662,30.821,25.779,30 -18:25:35,115.8906,30.635,30.821,25.74,30 -18:25:35,115.9375,30.635,30.821,26.166,30 -18:25:35,115.9842,30.662,30.847,26.127,30 -18:25:35,116.0287,30.662,30.821,25.177,30 -18:25:35,116.0732,30.582,30.821,25.586,30 -18:25:36,116.1195,30.635,30.847,26.924,30 -18:25:36,116.1667,30.635,30.794,25.528,30 -18:25:36,116.2106,30.688,30.821,26.399,30 -18:25:36,116.2546,30.635,30.847,24.988,30 -18:25:36,116.3008,30.662,30.821,25.414,30 -18:25:36,116.3449,30.662,30.794,25.358,30 -18:25:36,116.3908,30.662,30.821,25.785,30 -18:25:36,116.4366,30.662,30.821,25.283,30 -18:25:36,116.4817,30.635,30.847,25.244,30 -18:25:36,116.5282,30.662,30.847,25.223,30 -18:25:36,116.5729,30.635,30.821,24.719,30 -18:25:36,116.6198,30.688,30.847,25.592,30 -18:25:36,116.6665,30.635,30.847,24.194,30 -18:25:36,116.7106,30.688,30.821,25.065,30 -18:25:36,116.7567,30.662,30.847,24.563,30 -18:25:36,116.8033,30.662,30.874,24.523,30 -18:25:36,116.8474,30.635,30.847,24.019,30 -18:25:36,116.8926,30.662,30.821,24.908,30 -18:25:36,116.9387,30.662,30.847,24.853,30 -18:25:36,116.9866,30.688,30.821,24.367,30 -18:25:36,117.0320,30.688,30.847,24.326,30 -18:25:36,117.0780,30.662,30.847,23.839,30 -18:25:37,117.1313,30.688,30.768,24.246,30 -18:25:37,117.1767,30.715,30.821,25.112,30 -18:25:37,117.2215,30.662,30.847,23.699,30 -18:25:37,117.2657,30.688,30.794,24.124,30 -18:25:37,117.3108,30.662,30.821,24.55,30 -18:25:37,117.3557,30.662,30.821,24.495,30 -18:25:37,117.4026,30.662,30.874,24.456,30 -18:25:37,117.4478,30.662,30.847,23.505,30 -18:25:37,117.4900,30.688,30.847,23.93,30 -18:25:37,117.5348,30.662,30.847,23.446,30 -18:25:37,117.5820,30.741,30.847,23.854,30 -18:25:37,117.6293,30.688,30.794,22.455,30 -18:25:37,117.6727,30.715,30.821,24.235,30 -18:25:37,117.7179,30.662,30.847,23.27,30 -18:25:37,117.7606,30.662,30.9,23.694,30 -18:25:37,117.8062,30.662,30.874,22.746,30 -18:25:37,117.8515,30.662,30.874,23.152,30 -18:25:37,117.9052,30.662,30.847,23.113,30 -18:25:37,117.9547,30.688,30.847,23.53,30 -18:25:37,118.0025,30.635,30.847,23.04,30 -18:25:37,118.0451,30.688,30.847,23.91,30 -18:25:37,118.0875,30.662,30.821,22.963,30 -18:25:38,118.1338,30.688,30.847,23.82,30 -18:25:38,118.1767,30.662,30.847,22.886,30 -18:25:38,118.2191,30.662,30.821,23.296,30 -18:25:38,118.2626,30.662,30.847,23.706,30 -18:25:38,118.3066,30.662,30.847,23.222,30 -18:25:38,118.3537,30.662,30.821,23.184,30 -18:25:38,118.3987,30.662,30.821,23.591,30 -18:25:38,118.4443,30.662,30.847,23.553,30 -18:25:38,118.4915,30.688,30.847,23.066,30 -18:25:38,118.5364,30.662,30.847,22.579,30 -18:25:38,118.5851,30.635,30.847,22.987,30 -18:25:38,118.6341,30.662,30.9,23.409,30 -18:25:38,118.6775,30.609,30.847,21.992,30 -18:25:38,118.7203,30.662,30.847,23.776,30 -18:25:38,118.7650,30.688,30.847,22.829,30 -18:25:38,118.8092,30.662,30.847,22.343,30 -18:25:38,118.8552,30.662,30.821,22.751,30 -18:25:38,118.9005,30.662,30.847,23.159,30 -18:25:38,118.9457,30.662,30.874,22.674,30 -18:25:38,118.9889,30.688,30.874,22.17,30 -18:25:38,119.0334,30.662,30.847,21.685,30 -18:25:38,119.0763,30.662,30.847,22.557,30 -18:25:39,119.1229,30.662,30.847,22.52,30 -18:25:39,119.1704,30.688,30.821,22.48,30 -18:25:39,119.2188,30.662,30.847,22.439,30 -18:25:39,119.2620,30.662,30.847,22.398,30 -18:25:39,119.3035,30.635,30.847,22.36,30 -18:25:39,119.3477,30.662,30.821,22.789,30 -18:25:39,119.3915,30.635,30.847,22.734,30 -18:25:39,119.4364,30.688,30.847,22.714,30 -18:25:39,119.4797,30.688,30.794,21.765,30 -18:25:39,119.5222,30.662,30.821,22.638,30 -18:25:39,119.5666,30.662,30.847,22.585,30 -18:25:39,119.6128,30.662,30.847,22.1,30 -18:25:39,119.6568,30.662,30.821,22.06,30 -18:25:39,119.7017,30.662,30.821,22.47,30 -18:25:39,119.7450,30.688,30.847,22.431,30 -18:25:39,119.7891,30.715,30.821,21.501,30 -18:25:39,119.8347,30.688,30.821,21.445,30 -18:25:39,119.8774,30.688,30.847,21.869,30 -18:25:39,119.9207,30.635,30.847,21.385,30 -18:25:39,119.9689,30.635,30.794,22.259,30 -18:25:39,120.0148,30.662,30.847,23.129,30 -18:25:39,120.0595,30.635,30.847,21.716,30 -18:25:40,120.1149,30.662,30.847,22.141,30 -18:25:40,120.1586,30.635,30.847,21.63,30 -18:25:40,120.2047,30.662,30.794,22.057,30 -18:25:40,120.2503,30.662,30.847,22.465,30 -18:25:40,120.2941,30.688,30.847,21.516,30 -18:25:40,120.3380,30.662,30.821,21.031,30 -18:25:40,120.4021,30.662,30.847,21.886,30 -18:25:40,120.4600,30.662,30.821,21.381,30 -18:25:40,120.5207,30.662,30.847,21.78,30 -18:25:40,120.5842,30.635,30.847,21.283,30 -18:25:40,120.6409,30.662,30.874,21.692,30 -18:25:40,120.7001,30.688,30.847,20.716,30 -18:25:40,120.7521,30.688,30.847,20.682,30 -18:25:40,120.8038,30.662,30.847,20.636,30 -18:25:40,120.8655,30.662,30.847,21.036,30 -18:25:40,120.9177,30.688,30.874,20.985,30 -18:25:40,120.9686,30.635,30.847,20.028,30 -18:25:40,121.0204,30.635,30.847,21.358,30 -18:25:40,121.0705,30.662,30.847,21.315,30 -18:25:41,121.1252,30.688,30.847,20.807,30 -18:25:41,121.1775,30.662,30.847,20.314,30 -18:25:41,121.2282,30.662,30.847,20.715,30 -18:25:41,121.2794,30.688,30.874,20.671,30 -18:25:41,121.3355,30.715,30.821,19.716,30 -18:25:41,121.3875,30.662,30.847,20.113,30 -18:25:41,121.4382,30.662,30.794,20.532,30 -18:25:41,121.4866,30.662,30.847,21.4,30 -18:25:41,121.5367,30.688,30.847,20.447,30 -18:25:41,121.5877,30.635,30.874,19.958,30 -18:25:41,121.6396,30.662,30.874,20.36,30 -18:25:41,121.6874,30.662,30.847,19.851,30 -18:25:41,121.7341,30.662,30.847,20.274,30 -18:25:41,121.7801,30.688,30.847,20.233,30 -18:25:41,121.8263,30.662,30.874,19.746,30 -18:25:41,121.8752,30.662,30.821,19.689,30 -18:25:41,121.9247,30.662,30.821,20.557,30 -18:25:41,121.9820,30.635,30.847,20.515,30 -18:25:41,122.0318,30.688,30.847,20.484,30 -18:25:41,122.0795,30.688,30.847,19.53,30 -18:25:42,122.1277,30.662,30.847,19.488,30 -18:25:42,122.1734,30.662,30.874,19.893,30 -18:25:42,122.2206,30.662,30.847,19.39,30 -18:25:42,122.2692,30.662,30.9,19.813,30 -18:25:42,122.3135,30.662,30.874,18.859,30 -18:25:42,122.3610,30.662,30.874,19.267,30 -18:25:42,122.4069,30.688,30.874,19.225,30 -18:25:42,122.4524,30.715,30.847,18.738,30 -18:25:42,122.4979,30.662,30.874,18.697,30 -18:25:42,122.5445,30.688,30.9,19.104,30 -18:25:42,122.5909,30.662,30.847,18.168,30 -18:25:42,122.6403,30.715,30.847,19.485,30 -18:25:42,122.6878,30.662,30.847,18.531,30 -18:25:42,122.7354,30.662,30.874,19.4,30 -18:25:42,122.7829,30.662,30.821,18.895,30 -18:25:42,122.8308,30.688,30.847,19.765,30 -18:25:42,122.8780,30.635,30.847,18.83,30 -18:25:42,122.9237,30.662,30.874,19.7,30 -18:25:42,122.9723,30.635,30.847,18.732,30 -18:25:42,123.0210,30.688,30.874,19.619,30 -18:25:42,123.0692,30.688,30.874,18.201,30 -18:25:43,123.1150,30.635,30.847,18.158,30 -18:25:43,123.1625,30.688,30.847,19.493,30 -18:25:43,123.2077,30.662,30.874,18.542,30 -18:25:43,123.2563,30.635,30.874,18.485,30 -18:25:43,123.3029,30.662,30.847,18.906,30 -18:25:43,123.3495,30.662,30.821,18.866,30 -18:25:43,123.3974,30.635,30.847,19.273,30 -18:25:43,123.4449,30.609,30.847,19.25,30 -18:25:43,123.4928,30.688,30.874,19.657,30 -18:25:43,123.5375,30.688,30.874,17.794,30 -18:25:43,123.5853,30.662,30.847,17.754,30 -18:25:43,123.6316,30.635,30.874,18.623,30 -18:25:43,123.6755,30.662,30.847,18.583,30 -18:25:43,123.7188,30.688,30.874,18.545,30 -18:25:43,123.7616,30.688,30.847,17.596,30 -18:25:43,123.8037,30.688,30.847,18.022,30 -18:25:43,123.8464,30.662,30.847,17.986,30 -18:25:43,123.8897,30.635,30.847,18.395,30 -18:25:43,123.9366,30.662,30.847,18.822,30 -18:25:43,123.9840,30.635,30.874,18.318,30 -18:25:43,124.0281,30.688,30.874,18.277,30 -18:25:43,124.0705,30.635,30.847,17.328,30 -18:25:44,124.1134,30.688,30.874,18.666,30 -18:25:44,124.1565,30.635,30.847,17.254,30 -18:25:44,124.2015,30.662,30.821,18.591,30 -18:25:44,124.2448,30.635,30.874,18.536,30 -18:25:44,124.2875,30.635,30.847,18.052,30 -18:25:44,124.3337,30.662,30.874,18.48,30 -18:25:44,124.3791,30.688,30.847,17.512,30 -18:25:44,124.4236,30.635,30.874,17.489,30 -18:25:44,124.4700,30.662,30.847,17.897,30 -18:25:44,124.5138,30.688,30.847,17.857,30 -18:25:44,124.5578,30.688,30.847,17.372,30 -18:25:44,124.6033,30.688,30.847,17.334,30 -18:25:44,124.6540,30.662,30.847,17.294,30 -18:25:44,124.7007,30.635,30.847,17.697,30 -18:25:44,124.7465,30.662,30.874,18.121,30 -18:25:44,124.7928,30.688,30.874,17.153,30 -18:25:44,124.8396,30.635,30.874,16.665,30 -18:25:44,124.8890,30.662,30.847,17.535,30 -18:25:44,124.9379,30.662,30.874,17.493,30 -18:25:44,124.9839,30.635,30.9,16.986,30 -18:25:44,125.0325,30.688,30.9,16.963,30 -18:25:44,125.0772,30.635,30.874,16.009,30 -18:25:45,125.1210,30.662,30.874,17.327,30 -18:25:45,125.1674,30.688,30.874,16.825,30 -18:25:45,125.2107,30.662,30.874,16.337,30 -18:25:45,125.2545,30.635,30.847,16.745,30 -18:25:45,125.3016,30.635,30.874,17.636,30 -18:25:45,125.3459,30.662,30.874,17.132,30 -18:25:45,125.3895,30.662,30.874,16.629,30 -18:25:45,125.4351,30.662,30.874,16.591,30 -18:25:45,125.4791,30.662,30.847,16.551,30 -18:25:45,125.5243,30.662,30.874,16.976,30 -18:25:45,125.5726,30.662,30.847,16.473,30 -18:25:45,125.6178,30.688,30.821,16.895,30 -18:25:45,125.6637,30.662,30.847,16.856,30 -18:25:45,125.7068,30.688,30.874,16.817,30 -18:25:45,125.7520,30.635,30.847,15.868,30 -18:25:45,125.7958,30.635,30.847,17.204,30 -18:25:45,125.8399,30.662,30.847,17.167,30 -18:25:45,125.8857,30.635,30.874,16.665,30 -18:25:45,125.9301,30.609,30.847,16.626,30 -18:25:45,125.9762,30.635,30.874,17.498,30 -18:25:45,126.0188,30.741,30.847,16.549,30 -18:25:45,126.0621,30.662,30.874,15.153,30 -18:25:46,126.1055,30.635,30.874,16.009,30 -18:25:46,126.1517,30.662,30.874,16.435,30 -18:25:46,126.1966,30.662,30.874,15.93,30 -18:25:46,126.2392,30.662,30.847,15.891,30 -18:25:46,126.2841,30.662,30.847,16.318,30 -18:25:46,126.3272,30.662,30.847,16.28,30 -18:25:46,126.3704,30.715,30.874,16.242,30 -18:25:46,126.4165,30.662,30.874,14.829,30 -18:25:46,126.4602,30.662,30.874,15.699,30 -18:25:46,126.5046,30.635,30.9,15.661,30 -18:25:46,126.5494,30.635,30.847,15.639,30 -18:25:46,126.5947,30.635,30.874,16.511,30 -18:25:46,126.6402,30.635,30.927,16.008,30 -18:25:46,126.6885,30.635,30.874,15.057,30 -18:25:46,126.7353,30.635,30.874,15.926,30 -18:25:46,126.7887,30.662,30.847,15.886,30 -18:25:46,126.8385,30.662,30.847,15.84,30 -18:25:46,126.8844,30.635,30.821,15.797,30 -18:25:46,126.9288,30.662,30.847,16.669,30 -18:25:46,126.9747,30.635,30.874,15.72,30 -18:25:46,127.0204,30.635,30.847,15.681,30 -18:25:46,127.0673,30.635,30.847,16.106,30 -18:25:47,127.1113,30.662,30.874,16.066,30 -18:25:47,127.1548,30.662,30.9,15.1,30 -18:25:47,127.2004,30.635,30.874,14.615,30 -18:25:47,127.2438,30.635,30.9,15.486,30 -18:25:47,127.2875,30.662,30.874,15.001,30 -18:25:47,127.3345,30.662,30.874,14.945,30 -18:25:47,127.3808,30.662,30.821,14.904,30 -18:25:47,127.4273,30.662,30.847,15.775,30 -18:25:47,127.4724,30.662,30.847,15.289,30 -18:25:47,127.5176,30.662,30.874,15.25,30 -18:25:47,127.5636,30.662,30.874,14.747,30 -18:25:47,127.6093,30.662,30.874,14.706,30 -18:25:47,127.6575,30.635,30.847,14.666,30 -18:25:47,127.7013,30.635,30.874,15.553,30 -18:25:47,127.7448,30.635,30.847,15.051,30 -18:25:47,127.7892,30.662,30.874,15.478,30 -18:25:47,127.8339,30.609,30.847,14.512,30 -18:25:47,127.8796,30.635,30.874,15.849,30 -18:25:47,127.9227,30.635,30.9,14.899,30 -18:25:47,127.9706,30.635,30.821,14.415,30 -18:25:47,128.0179,30.662,30.821,15.731,30 -18:25:47,128.0650,30.635,30.874,15.228,30 -18:25:48,128.1088,30.635,30.847,14.741,30 -18:25:48,128.1515,30.635,30.874,15.167,30 -18:25:48,128.1968,30.609,30.847,14.667,30 -18:25:48,128.2425,30.635,30.847,15.539,30 -18:25:48,128.2875,30.662,30.874,15.054,30 -18:25:48,128.3328,30.662,30.874,14.087,30 -18:25:48,128.3770,30.662,30.847,14.048,30 -18:25:48,128.4215,30.635,30.874,14.473,30 -18:25:48,128.4670,30.635,30.874,14.435,30 -18:25:48,128.5122,30.662,30.821,14.396,30 -18:25:48,128.5580,30.662,30.874,14.804,30 -18:25:48,128.6040,30.662,30.847,13.853,30 -18:25:48,128.6537,30.635,30.821,14.278,30 -18:25:48,128.7004,30.609,30.9,15.146,30 -18:25:48,128.7464,30.635,30.847,14.196,30 -18:25:48,128.7933,30.635,30.847,14.621,30 -18:25:48,128.8392,30.715,30.847,14.581,30 -18:25:48,128.8866,30.635,30.847,13.166,30 -18:25:48,128.9314,30.662,30.847,14.5,30 -18:25:48,128.9748,30.609,30.847,13.998,30 -18:25:48,129.0173,30.635,30.847,14.872,30 -18:25:48,129.0617,30.635,30.847,14.389,30 -18:25:49,129.1057,30.635,30.874,14.351,30 -18:25:49,129.1525,30.635,30.847,13.85,30 -18:25:49,129.1996,30.635,30.847,14.274,30 -18:25:49,129.2443,30.635,30.874,14.234,30 -18:25:49,129.2888,30.635,30.874,13.732,30 -18:25:49,129.3348,30.635,30.847,13.694,30 -18:25:49,129.3810,30.556,30.847,14.118,30 -18:25:49,129.4284,30.609,30.847,15.438,30 -18:25:49,129.4767,30.635,30.847,14.488,30 -18:25:49,129.5227,30.662,30.847,14.001,30 -18:25:49,129.5722,30.688,30.847,13.498,30 -18:25:49,129.6193,30.635,30.847,13.008,30 -18:25:49,129.6688,30.635,30.847,13.878,30 -18:25:49,129.7170,30.635,30.821,13.836,30 -18:25:49,129.7638,30.635,30.847,14.243,30 -18:25:49,129.8104,30.635,30.847,13.756,30 -18:25:49,129.8575,30.582,30.847,13.717,30 -18:25:49,129.9055,30.635,30.821,14.589,30 -18:25:49,129.9539,30.635,30.847,14.085,30 -18:25:49,130.0018,30.635,30.794,13.598,30 -18:25:49,130.0467,30.635,30.847,14.469,30 -18:25:49,130.0918,30.635,30.874,13.521,30 -18:25:50,130.1376,30.635,30.821,13.018,30 -18:25:50,130.1828,30.635,30.847,13.89,30 -18:25:50,130.2261,30.635,30.874,13.406,30 -18:25:50,130.2697,30.635,30.847,12.905,30 -18:25:50,130.3160,30.635,30.821,13.332,30 -18:25:50,130.3601,30.635,30.821,13.739,30 -18:25:50,130.4042,30.662,30.874,13.703,30 -18:25:50,130.4511,30.609,30.821,12.29,30 -18:25:50,130.4977,30.635,30.847,14.072,30 -18:25:50,130.5425,30.635,30.821,13.14,30 -18:25:50,130.5863,30.635,30.821,13.549,30 -18:25:50,130.6354,30.609,30.821,13.513,30 -18:25:50,130.6864,30.635,30.847,13.919,30 -18:25:50,130.7336,30.609,30.847,12.983,30 -18:25:50,130.7796,30.609,30.821,13.39,30 -18:25:50,130.8248,30.609,30.847,13.799,30 -18:25:50,130.8709,30.662,30.847,13.315,30 -18:25:50,130.9170,30.635,30.847,12.365,30 -18:25:50,130.9646,30.635,30.821,12.79,30 -18:25:50,131.0116,30.609,30.847,13.196,30 -18:25:50,131.0568,30.635,30.874,13.157,30 -18:25:51,131.1055,30.635,30.874,12.208,30 -18:25:51,131.1524,30.635,30.847,12.166,30 -18:25:51,131.1966,30.635,30.847,12.59,30 -18:25:51,131.2408,30.662,30.874,12.553,30 -18:25:51,131.2876,30.635,30.847,11.587,30 -18:25:51,131.3347,30.609,30.874,12.474,30 -18:25:51,131.3847,30.635,30.847,12.416,30 -18:25:51,131.4285,30.662,30.821,12.392,30 -18:25:51,131.4718,30.609,30.847,12.338,30 -18:25:51,131.5180,30.635,30.821,12.766,30 -18:25:51,131.5618,30.635,30.847,12.727,30 -18:25:51,131.6082,30.635,30.821,12.243,30 -18:25:51,131.6548,30.635,30.847,12.652,30 -18:25:51,131.7037,30.662,30.821,12.166,30 -18:25:51,131.7542,30.635,30.847,12.107,30 -18:25:51,131.8005,30.635,30.821,12.081,30 -18:25:51,131.8461,30.609,30.847,12.489,30 -18:25:51,131.8916,30.635,30.847,12.451,30 -18:25:51,131.9363,30.609,30.874,11.967,30 -18:25:51,131.9823,30.609,30.874,11.912,30 -18:25:51,132.0266,30.662,30.847,11.873,30 -18:25:51,132.0718,30.662,30.847,11.388,30 -18:25:52,132.1177,30.635,30.847,11.349,30 -18:25:52,132.1635,30.635,30.847,11.774,30 -18:25:52,132.2080,30.635,30.874,11.735,30 -18:25:52,132.2526,30.688,30.847,11.233,30 -18:25:52,132.2977,30.609,30.847,10.747,30 -18:25:52,132.3433,30.635,30.847,12.067,30 -18:25:52,132.3888,30.609,30.821,11.581,30 -18:25:52,132.4383,30.635,30.847,12.437,30 -18:25:52,132.4864,30.635,30.847,11.502,30 -18:25:52,132.5348,30.635,30.847,11.462,30 -18:25:52,132.5817,30.609,30.847,11.421,30 -18:25:52,132.6257,30.635,30.847,11.828,30 -18:25:52,132.6710,30.635,30.847,11.345,30 -18:25:52,132.7186,30.635,30.847,11.306,30 -18:25:52,132.7645,30.635,30.847,11.266,30 -18:25:52,132.8085,30.582,30.847,11.227,30 -18:25:52,132.8526,30.609,30.847,12.101,30 -18:25:52,132.8990,30.609,30.821,11.601,30 -18:25:52,132.9450,30.609,30.821,12.009,30 -18:25:52,132.9896,30.635,30.821,11.972,30 -18:25:52,133.0357,30.662,30.847,11.488,30 -18:25:52,133.0827,30.635,30.847,10.538,30 -18:25:53,133.1260,30.635,30.821,10.962,30 -18:25:53,133.1697,30.635,30.821,11.373,30 -18:25:53,133.2171,30.609,30.821,11.336,30 -18:25:53,133.2623,30.635,30.847,11.744,30 -18:25:53,133.3076,30.609,30.847,10.813,30 -18:25:53,133.3517,30.635,30.874,11.222,30 -18:25:53,133.3986,30.582,30.821,10.274,30 -18:25:53,133.4422,30.609,30.821,12.056,30 -18:25:53,133.4869,30.609,30.847,11.557,30 -18:25:53,133.5330,30.556,30.874,11.074,30 -18:25:53,133.5790,30.609,30.874,11.482,30 -18:25:53,133.6249,30.609,30.821,10.533,30 -18:25:53,133.6708,30.609,30.821,11.406,30 -18:25:53,133.7212,30.582,30.847,11.368,30 -18:25:53,133.7669,30.635,30.821,11.344,30 -18:25:53,133.8108,30.582,30.847,10.843,30 -18:25:53,133.8557,30.609,30.847,11.271,30 -18:25:53,133.9050,30.635,30.847,10.77,30 -18:25:53,133.9528,30.609,30.847,10.281,30 -18:25:53,134.0016,30.609,30.847,10.688,30 -18:25:53,134.0495,30.609,30.847,10.647,30 -18:25:53,134.0924,30.556,30.874,10.608,30 -18:25:54,134.1360,30.609,30.847,11.019,30 -18:25:54,134.1820,30.609,30.821,10.536,30 -18:25:54,134.2259,30.609,30.821,10.945,30 -18:25:54,134.2735,30.582,30.847,10.909,30 -18:25:54,134.3200,30.582,30.794,10.888,30 -18:25:54,134.3688,30.609,30.821,11.761,30 -18:25:54,134.4181,30.609,30.794,10.794,30 -18:25:54,134.4669,30.582,30.847,11.218,30 -18:25:54,134.5169,30.582,30.847,10.731,30 -18:25:54,134.5677,30.609,30.821,10.69,30 -18:25:54,134.6177,30.609,30.847,10.632,30 -18:25:54,134.6719,30.582,30.821,10.144,30 -18:25:54,134.7225,30.582,30.821,11.011,30 -18:25:54,134.7705,30.609,30.821,10.971,30 -18:25:54,134.8168,30.609,30.847,10.468,30 -18:25:54,134.8617,30.609,30.821,9.983,30 -18:25:54,134.9078,30.609,30.794,10.393,30 -18:25:54,134.9522,30.609,30.821,10.819,30 -18:25:54,135.0002,30.609,30.821,10.318,30 -18:25:54,135.0475,30.582,30.821,10.28,30 -18:25:55,135.1036,30.582,30.847,10.706,30 -18:25:55,135.1566,30.582,30.847,10.214,30 -18:25:55,135.2038,30.582,30.821,10.17,30 -18:25:55,135.2518,30.609,30.821,10.579,30 -18:25:55,135.3003,30.635,30.821,10.076,30 -18:25:55,135.3448,30.582,30.821,9.589,30 -18:25:55,135.4038,30.582,30.768,10.464,30 -18:25:55,135.4740,30.609,30.794,11.323,30 -18:25:55,135.5330,30.582,30.794,10.361,30 -18:25:55,135.5860,30.582,30.821,10.779,30 -18:25:55,135.6546,30.582,30.794,10.269,30 -18:25:55,135.7075,30.582,30.794,10.683,30 -18:25:55,135.7626,30.556,30.794,10.641,30 -18:25:55,135.8155,30.582,30.821,11.045,30 -18:25:55,135.8696,30.582,30.794,10.092,30 -18:25:55,135.9255,30.582,30.821,10.513,30 -18:25:55,135.9825,30.582,30.821,10.004,30 -18:25:55,136.0383,30.582,30.847,9.959,30 -18:25:55,136.0921,30.582,30.821,9.468,30 -18:25:56,136.1442,30.556,30.821,9.871,30 -18:25:56,136.2006,30.556,30.821,10.276,30 -18:25:56,136.2549,30.582,30.821,10.233,30 -18:25:56,136.3093,30.609,30.794,9.742,30 -18:25:56,136.3646,30.556,30.821,9.697,30 -18:25:56,136.4212,30.582,30.821,10.101,30 -18:25:56,136.4790,30.582,30.794,9.61,30 -18:25:56,136.5316,30.556,30.821,10.028,30 -18:25:56,136.5838,30.582,30.821,9.97,30 -18:25:56,136.6348,30.582,30.821,9.481,30 -18:25:56,136.6901,30.556,30.794,9.441,30 -18:25:56,136.7408,30.556,30.847,10.308,30 -18:25:56,136.7857,30.582,30.794,9.357,30 -18:25:56,136.8324,30.582,30.794,9.786,30 -18:25:56,136.8777,30.582,30.821,9.749,30 -18:25:56,136.9235,30.582,30.794,9.249,30 -18:25:56,136.9817,30.582,30.794,9.677,30 -18:25:56,137.0265,30.529,30.794,9.631,30 -18:25:56,137.0737,30.556,30.794,10.507,30 -18:25:57,137.1183,30.582,30.794,10.007,30 -18:25:57,137.1647,30.582,30.794,9.526,30 -18:25:57,137.2104,30.556,30.794,9.489,30 -18:25:57,137.2565,30.556,30.794,9.9,30 -18:25:57,137.3047,30.556,30.768,9.865,30 -18:25:57,137.3547,30.556,30.794,10.275,30 -18:25:57,137.4041,30.582,30.741,9.79,30 -18:25:57,137.4514,30.556,30.794,10.216,30 -18:25:57,137.4991,30.556,30.821,9.716,30 -18:25:57,137.5432,30.556,30.794,9.215,30 -18:25:57,137.5891,30.556,30.794,9.645,30 -18:25:57,137.6373,30.556,30.821,9.609,30 -18:25:57,137.6847,30.556,30.847,9.108,30 -18:25:57,137.7345,30.556,30.794,8.623,30 -18:25:57,137.7816,30.556,30.794,9.495,30 -18:25:57,137.8299,30.556,30.768,9.458,30 -18:25:57,137.8759,30.529,30.768,9.869,30 -18:25:57,137.9211,30.556,30.794,10.298,30 -18:25:57,137.9687,30.556,30.768,9.353,30 -18:25:57,138.0136,30.556,30.821,9.764,30 -18:25:57,138.0576,30.556,30.768,8.818,30 -18:25:58,138.1025,30.556,30.794,9.695,30 -18:25:58,138.1487,30.556,30.794,9.214,30 -18:25:58,138.1937,30.582,30.794,9.178,30 -18:25:58,138.2390,30.556,30.768,8.697,30 -18:25:58,138.2868,30.529,30.794,9.555,30 -18:25:58,138.3335,30.529,30.794,9.536,30 -18:25:58,138.3792,30.556,30.794,9.501,30 -18:25:58,138.4247,30.529,30.768,9.002,30 -18:25:58,138.4705,30.529,30.821,9.879,30 -18:25:58,138.5175,30.556,30.768,8.933,30 -18:25:58,138.5650,30.529,30.821,9.344,30 -18:25:58,138.6151,30.556,30.794,8.86,30 -18:25:58,138.6623,30.529,30.715,8.822,30 -18:25:58,138.7067,30.529,30.768,10.609,30 -18:25:58,138.7540,30.556,30.794,9.666,30 -18:25:58,138.8037,30.556,30.794,8.719,30 -18:25:58,138.8532,30.529,30.768,8.68,30 -18:25:58,138.9011,30.556,30.794,9.554,30 -18:25:58,138.9494,30.529,30.794,8.607,30 -18:25:58,138.9944,30.556,30.768,9.035,30 -18:25:58,139.0387,30.556,30.768,8.983,30 -18:25:58,139.0866,30.529,30.768,8.95,30 -18:25:59,139.1336,30.556,30.794,9.378,30 -18:25:59,139.1808,30.529,30.768,8.432,30 -18:25:59,139.2268,30.529,30.794,9.307,30 -18:25:59,139.2723,30.556,30.768,8.826,30 -18:25:59,139.3179,30.529,30.768,8.774,30 -18:25:59,139.3653,30.582,30.768,9.204,30 -18:25:59,139.4119,30.556,30.768,8.257,30 -18:25:59,139.4573,30.529,30.768,8.668,30 -18:25:59,139.5015,30.529,30.768,9.098,30 -18:25:59,139.5515,30.556,30.794,9.065,30 -18:25:59,139.6026,30.556,30.794,8.117,30 -18:25:59,139.6535,30.503,30.768,8.077,30 -18:25:59,139.7039,30.529,30.768,9.397,30 -18:25:59,139.7560,30.556,30.768,8.913,30 -18:25:59,139.8020,30.529,30.794,8.411,30 -18:25:59,139.8522,30.529,30.768,8.393,30 -18:25:59,139.9032,30.529,30.768,8.802,30 -18:25:59,139.9536,30.529,30.794,8.764,30 -18:25:59,140.0031,30.529,30.768,8.28,30 -18:25:59,140.0596,30.529,30.768,8.689,30 -18:26:00,140.1040,30.529,30.768,8.648,30 -18:26:00,140.1523,30.529,30.768,8.615,30 -18:26:00,140.1987,30.503,30.768,8.579,30 -18:26:00,140.2434,30.529,30.768,8.992,30 -18:26:00,140.2903,30.556,30.768,8.512,30 -18:26:00,140.3357,30.529,30.768,8.013,30 -18:26:00,140.3838,30.529,30.768,8.443,30 -18:26:00,140.4316,30.556,30.768,8.408,30 -18:26:00,140.4776,30.529,30.794,7.908,30 -18:26:00,140.5247,30.529,30.741,7.89,30 -18:26:00,140.5718,30.529,30.768,8.766,30 -18:26:00,140.6207,30.529,30.741,8.267,30 -18:26:00,140.6696,30.503,30.768,8.696,30 -18:26:00,140.7172,30.529,30.794,8.643,30 -18:26:00,140.7685,30.529,30.741,7.714,30 -18:26:00,140.8160,30.529,30.768,8.587,30 -18:26:00,140.8620,30.529,30.741,8.088,30 -18:26:00,140.9089,30.503,30.768,8.518,30 -18:26:00,140.9550,30.529,30.741,8.467,30 -18:26:00,141.0015,30.556,30.741,8.451,30 -18:26:00,141.0491,30.503,30.768,7.953,30 -18:26:00,141.0936,30.529,30.741,8.365,30 -18:26:01,141.1386,30.529,30.741,8.35,30 -18:26:01,141.1861,30.529,30.741,8.317,30 -18:26:01,141.2340,30.529,30.768,8.283,30 -18:26:01,141.2817,30.503,30.741,7.783,30 -18:26:01,141.3274,30.529,30.741,8.66,30 -18:26:01,141.3733,30.529,30.768,8.18,30 -18:26:01,141.4257,30.503,30.741,7.681,30 -18:26:01,141.4754,30.529,30.768,8.555,30 -18:26:01,141.5254,30.503,30.715,7.608,30 -18:26:01,141.5763,30.529,30.768,8.93,30 -18:26:01,141.6252,30.529,30.741,7.536,30 -18:26:01,141.6742,30.503,30.768,7.964,30 -18:26:01,141.7217,30.503,30.768,7.911,30 -18:26:01,141.7736,30.476,30.768,7.877,30 -18:26:01,141.8227,30.529,30.768,8.304,30 -18:26:01,141.8725,30.503,30.741,7.357,30 -18:26:01,141.9207,30.529,30.768,8.232,30 -18:26:01,141.9735,30.476,30.741,7.286,30 -18:26:01,142.0205,30.503,30.768,8.623,30 -18:26:01,142.0712,30.476,30.741,7.662,30 -18:26:02,142.1219,30.503,30.741,8.554,30 -18:26:02,142.1726,30.529,30.741,8.054,30 -18:26:02,142.2192,30.503,30.741,7.571,30 -18:26:02,142.2716,30.476,30.741,7.984,30 -18:26:02,142.3230,30.503,30.741,8.411,30 -18:26:02,142.3715,30.503,30.715,7.911,30 -18:26:02,142.4229,30.45,30.715,8.324,30 -18:26:02,142.4728,30.503,30.768,9.2,30 -18:26:02,142.5210,30.503,30.741,7.343,30 -18:26:02,142.5735,30.503,30.715,7.773,30 -18:26:02,142.6214,30.476,30.741,8.183,30 -18:26:02,142.6744,30.503,30.715,8.167,30 -18:26:02,142.7261,30.503,30.741,8.113,30 -18:26:02,142.7756,30.503,30.741,7.629,30 -18:26:02,142.8243,30.503,30.768,7.594,30 -18:26:02,142.8713,30.503,30.741,7.095,30 -18:26:02,142.9206,30.476,30.741,7.525,30 -18:26:02,142.9720,30.476,30.741,7.955,30 -18:26:02,143.0194,30.476,30.715,7.919,30 -18:26:02,143.0713,30.476,30.741,8.333,30 -18:26:03,143.1202,30.503,30.715,7.851,30 -18:26:03,143.1696,30.503,30.741,7.8,30 -18:26:03,143.2193,30.503,30.715,7.318,30 -18:26:03,143.2681,30.529,30.741,7.73,30 -18:26:03,143.3188,30.476,30.715,6.802,30 -18:26:03,143.3696,30.476,30.715,8.124,30 -18:26:03,143.4230,30.503,30.741,8.089,30 -18:26:03,143.4727,30.45,30.715,7.141,30 -18:26:03,143.5213,30.503,30.715,8.465,30 -18:26:03,143.5698,30.503,30.715,7.521,30 -18:26:03,143.6219,30.476,30.715,7.487,30 -18:26:03,143.6723,30.476,30.715,7.915,30 -18:26:03,143.7205,30.476,30.768,7.881,30 -18:26:03,143.7695,30.45,30.741,6.937,30 -18:26:03,143.8164,30.503,30.715,7.813,30 -18:26:03,143.8667,30.476,30.741,7.317,30 -18:26:03,143.9151,30.476,30.768,7.299,30 -18:26:03,143.9627,30.476,30.741,6.801,30 -18:26:03,144.0075,30.529,30.741,7.232,30 -18:26:03,144.0535,30.476,30.715,6.289,30 -18:26:04,144.1005,30.45,30.741,7.615,30 -18:26:04,144.1495,30.45,30.741,7.583,30 -18:26:04,144.1964,30.503,30.741,7.549,30 -18:26:04,144.2438,30.476,30.741,6.606,30 -18:26:04,144.2889,30.476,30.715,7.036,30 -18:26:04,144.3316,30.476,30.741,7.452,30 -18:26:04,144.3767,30.476,30.741,6.976,30 -18:26:04,144.4236,30.45,30.741,6.945,30 -18:26:04,144.4661,30.476,30.768,7.359,30 -18:26:04,144.5139,30.476,30.715,6.419,30 -18:26:04,144.5578,30.503,30.741,7.297,30 -18:26:04,144.6015,30.503,30.715,6.355,30 -18:26:04,144.6475,30.476,30.715,6.771,30 -18:26:04,144.6929,30.476,30.741,7.204,30 -18:26:04,144.7351,30.503,30.741,6.726,30 -18:26:04,144.7805,30.476,30.715,6.232,30 -18:26:04,144.8332,30.476,30.715,7.112,30 -18:26:04,144.8808,30.476,30.715,7.076,30 -18:26:04,144.9203,30.476,30.715,7.043,30 -18:26:04,144.9632,30.476,30.741,7.016,30 -18:26:04,145.0045,30.476,30.715,6.54,30 -18:26:04,145.0456,30.476,30.715,6.959,30 -18:26:04,145.0876,30.45,30.688,6.931,30 -18:26:05,145.1316,30.503,30.741,7.813,30 -18:26:05,145.1773,30.476,30.715,5.962,30 -18:26:05,145.2189,30.476,30.715,6.841,30 -18:26:05,145.2655,30.45,30.688,6.812,30 -18:26:05,145.3118,30.476,30.715,7.692,30 -18:26:05,145.3555,30.45,30.715,6.751,30 -18:26:05,145.3995,30.476,30.715,7.168,30 -18:26:05,145.4465,30.476,30.715,6.692,30 -18:26:05,145.4932,30.476,30.715,6.66,30 -18:26:05,145.5356,30.45,30.715,6.628,30 -18:26:05,145.5834,30.476,30.635,7.046,30 -18:26:05,145.6283,30.476,30.741,7.943,30 -18:26:05,145.6729,30.45,30.715,6.092,30 -18:26:05,145.7156,30.45,30.715,6.955,30 -18:26:05,145.7617,30.45,30.715,6.927,30 -18:26:05,145.8064,30.476,30.715,6.896,30 -18:26:05,145.8555,30.476,30.715,6.419,30 -18:26:05,145.8992,30.476,30.715,6.385,30 -18:26:05,145.9454,30.476,30.715,6.356,30 -18:26:05,145.9887,30.45,30.715,6.324,30 -18:26:05,146.0329,30.45,30.715,6.742,30 -18:26:05,146.0781,30.476,30.715,6.713,30 -18:26:06,146.1200,30.45,30.688,6.236,30 -18:26:06,146.1650,30.45,30.688,7.118,30 -18:26:06,146.2083,30.45,30.688,7.089,30 -18:26:06,146.2507,30.424,30.715,7.061,30 -18:26:06,146.2964,30.45,30.715,7.016,30 -18:26:06,146.3397,30.45,30.688,6.539,30 -18:26:06,146.3836,30.476,30.715,6.975,30 -18:26:06,146.4288,30.45,30.688,6.035,30 -18:26:06,146.4716,30.45,30.688,6.916,30 -18:26:06,146.5147,30.45,30.688,6.888,30 -18:26:06,146.5581,30.45,30.688,6.86,30 -18:26:06,146.6016,30.45,30.688,6.831,30 -18:26:06,146.6456,30.424,30.688,6.803,30 -18:26:06,146.6927,30.45,30.688,7.222,30 -18:26:06,146.7350,30.45,30.688,6.745,30 -18:26:06,146.7786,30.45,30.715,6.717,30 -18:26:06,146.8212,30.45,30.688,6.225,30 -18:26:06,146.8631,30.45,30.688,6.661,30 -18:26:06,146.9066,30.45,30.688,6.633,30 -18:26:06,146.9495,30.45,30.688,6.605,30 -18:26:06,146.9941,30.45,30.688,6.577,30 -18:26:06,147.0367,30.424,30.688,6.548,30 -18:26:06,147.0807,30.45,30.715,6.968,30 -18:26:07,147.1244,30.45,30.662,6.028,30 -18:26:07,147.1667,30.424,30.715,6.911,30 -18:26:07,147.2114,30.424,30.688,6.419,30 -18:26:07,147.2539,30.45,30.662,6.855,30 -18:26:07,147.2997,30.45,30.662,6.828,30 -18:26:07,147.3450,30.476,30.688,6.799,30 -18:26:07,147.3898,30.424,30.688,5.876,30 -18:26:07,147.4304,30.45,30.688,6.74,30 -18:26:07,147.4728,30.424,30.715,6.267,30 -18:26:07,147.5145,30.424,30.688,6.223,30 -18:26:07,147.5591,30.424,30.688,6.66,30 -18:26:07,147.6018,30.397,30.662,6.631,30 -18:26:07,147.6473,30.45,30.662,7.516,30 -18:26:07,147.6937,30.45,30.688,6.576,30 -18:26:07,147.7363,30.424,30.662,6.1,30 -18:26:07,147.7819,30.45,30.662,6.966,30 -18:26:07,147.8275,30.45,30.662,6.491,30 -18:26:07,147.8718,30.45,30.662,6.462,30 -18:26:07,147.9152,30.45,30.688,6.434,30 -18:26:07,147.9597,30.45,30.688,5.959,30 -18:26:07,148.0030,30.45,30.688,5.93,30 -18:26:07,148.0487,30.424,30.688,5.902,30 -18:26:07,148.0924,30.45,30.688,6.32,30 -18:26:08,148.1366,30.424,30.662,5.845,30 -18:26:08,148.1842,30.45,30.662,6.71,30 -18:26:08,148.2303,30.397,30.635,6.233,30 -18:26:08,148.2746,30.424,30.662,7.58,30 -18:26:08,148.3174,30.424,30.635,6.625,30 -18:26:08,148.3632,30.371,30.662,7.063,30 -18:26:08,148.4056,30.45,30.662,7.482,30 -18:26:08,148.4496,30.45,30.688,6.099,30 -18:26:08,148.4965,30.397,30.688,5.624,30 -18:26:08,148.5389,30.424,30.635,6.505,30 -18:26:08,148.5832,30.424,30.688,6.926,30 -18:26:08,148.6283,30.424,30.688,5.987,30 -18:26:08,148.6726,30.424,30.715,5.959,30 -18:26:08,148.7153,30.424,30.662,5.467,30 -18:26:08,148.7609,30.424,30.662,6.35,30 -18:26:08,148.8053,30.424,30.662,6.322,30 -18:26:08,148.8484,30.424,30.662,6.294,30 -18:26:08,148.8921,30.424,30.688,6.268,30 -18:26:08,148.9356,30.397,30.662,5.793,30 -18:26:08,148.9800,30.424,30.662,6.677,30 -18:26:08,149.0253,30.397,30.688,6.186,30 -18:26:08,149.0689,30.397,30.662,6.175,30 -18:26:09,149.1157,30.424,30.662,6.595,30 -18:26:09,149.1620,30.424,30.635,6.103,30 -18:26:09,149.2045,30.424,30.662,6.538,30 -18:26:09,149.2477,30.397,30.635,6.048,30 -18:26:09,149.2926,30.397,30.688,6.95,30 -18:26:09,149.3350,30.397,30.662,6.012,30 -18:26:09,149.3812,30.424,30.662,6.433,30 -18:26:09,149.4262,30.424,30.662,5.941,30 -18:26:09,149.4708,30.371,30.662,5.913,30 -18:26:09,149.5121,30.397,30.662,6.797,30 -18:26:09,149.5560,30.397,30.635,6.325,30 -18:26:09,149.6014,30.397,30.688,6.763,30 -18:26:09,149.6477,30.371,30.688,5.825,30 -18:26:09,149.6936,30.371,30.662,6.243,30 -18:26:09,149.7396,30.397,30.635,6.662,30 -18:26:09,149.7821,30.397,30.635,6.653,30 -18:26:09,149.8271,30.424,30.635,6.627,30 -18:26:09,149.8711,30.424,30.635,6.137,30 -18:26:09,149.9132,30.397,30.635,6.11,30 -18:26:09,149.9602,30.397,30.609,6.549,30 -18:26:09,150.0037,30.371,30.635,6.968,30 -18:26:09,150.0507,30.371,30.662,6.943,30 -18:26:10,150.0996,30.397,30.635,6.452,30 -18:26:10,150.1491,30.397,30.635,6.44,30 -18:26:10,150.1957,30.397,30.635,6.411,30 -18:26:10,150.2390,30.397,30.662,6.384,30 -18:26:10,150.2821,30.371,30.635,5.894,30 -18:26:10,150.3275,30.344,30.609,6.779,30 -18:26:10,150.3703,30.371,30.635,7.665,30 -18:26:10,150.4200,30.344,30.635,6.73,30 -18:26:10,150.4850,30.371,30.635,7.165,30 -18:26:10,150.5416,30.344,30.635,6.664,30 -18:26:10,150.5915,30.397,30.635,7.096,30 -18:26:10,150.6446,30.371,30.635,6.157,30 -18:26:10,150.6990,30.371,30.635,6.573,30 -18:26:10,150.7554,30.371,30.582,6.54,30 -18:26:10,150.8024,30.371,30.635,7.421,30 -18:26:10,150.8521,30.344,30.635,6.484,30 -18:26:10,150.9010,30.371,30.635,6.92,30 -18:26:10,150.9508,30.371,30.609,6.428,30 -18:26:10,151.0002,30.344,30.635,6.846,30 -18:26:10,151.0574,30.344,30.635,6.836,30 -18:26:11,151.1054,30.397,30.635,6.804,30 -18:26:11,151.1522,30.371,30.609,5.866,30 -18:26:11,151.2008,30.344,30.609,6.732,30 -18:26:11,151.2495,30.371,30.635,7.17,30 -18:26:11,151.2990,30.371,30.609,6.232,30 -18:26:11,151.3479,30.371,30.609,6.65,30 -18:26:11,151.3973,30.344,30.635,6.623,30 -18:26:11,151.4461,30.371,30.635,6.612,30 -18:26:11,151.4927,30.371,30.635,6.121,30 -18:26:11,151.5444,30.344,30.609,6.094,30 -18:26:11,151.5898,30.371,30.609,6.976,30 -18:26:11,151.6339,30.371,30.609,6.487,30 -18:26:11,151.6836,30.344,30.609,6.462,30 -18:26:11,151.7302,30.371,30.609,6.899,30 -18:26:11,151.7744,30.397,30.635,6.409,30 -18:26:11,151.8186,30.344,30.635,5.49,30 -18:26:11,151.8657,30.371,30.609,6.376,30 -18:26:11,151.9112,30.344,30.635,6.332,30 -18:26:11,151.9547,30.371,30.609,6.324,30 -18:26:11,151.9979,30.344,30.609,6.283,30 -18:26:11,152.0495,30.371,30.609,6.723,30 -18:26:12,152.1008,30.344,30.609,6.23,30 -18:26:12,152.1462,30.318,30.609,6.666,30 -18:26:12,152.1878,30.318,30.582,7.088,30 -18:26:12,152.2306,30.344,30.635,7.53,30 -18:26:12,152.2728,30.371,30.609,6.15,30 -18:26:12,152.3149,30.344,30.609,6.109,30 -18:26:12,152.3566,30.371,30.635,6.55,30 -18:26:12,152.4005,30.318,30.609,5.616,30 -18:26:12,152.4444,30.344,30.635,6.949,30 -18:26:12,152.4870,30.344,30.609,6.032,30 -18:26:12,152.5285,30.344,30.609,6.455,30 -18:26:12,152.5802,30.344,30.635,6.432,30 -18:26:12,152.6240,30.344,30.609,5.957,30 -18:26:12,152.6677,30.344,30.609,6.38,30 -18:26:12,152.7140,30.344,30.609,6.356,30 -18:26:12,152.7573,30.344,30.609,6.331,30 -18:26:12,152.8008,30.344,30.609,6.307,30 -18:26:12,152.8445,30.318,30.582,6.283,30 -18:26:12,152.8869,30.344,30.609,7.171,30 -18:26:12,152.9303,30.371,30.582,6.238,30 -18:26:12,152.9750,30.344,30.635,6.214,30 -18:26:12,153.0185,30.344,30.609,5.743,30 -18:26:12,153.0637,30.318,30.582,6.165,30 -18:26:13,153.1061,30.371,30.609,7.053,30 -18:26:13,153.1478,30.344,30.582,5.655,30 -18:26:13,153.1925,30.344,30.635,6.56,30 -18:26:13,153.2335,30.265,30.609,5.625,30 -18:26:13,153.2776,30.318,30.582,7.408,30 -18:26:13,153.3213,30.318,30.609,6.938,30 -18:26:13,153.3616,30.344,30.582,6.452,30 -18:26:13,153.4060,30.318,30.609,6.448,30 -18:26:13,153.4474,30.318,30.582,6.407,30 -18:26:13,153.4924,30.344,30.609,6.849,30 -18:26:13,153.5343,30.318,30.582,5.915,30 -18:26:13,153.5787,30.344,30.609,6.803,30 -18:26:13,153.6224,30.344,30.609,5.869,30 -18:26:13,153.6666,30.318,30.609,5.845,30 -18:26:13,153.7106,30.344,30.609,6.268,30 -18:26:13,153.7536,30.344,30.609,5.798,30 -18:26:13,153.7955,30.344,30.635,5.774,30 -18:26:13,153.8365,30.318,30.582,5.305,30 -18:26:13,153.8826,30.318,30.556,6.64,30 -18:26:13,153.9268,30.344,30.582,7.063,30 -18:26:13,153.9693,30.318,30.582,6.147,30 -18:26:13,154.0122,30.344,30.582,6.572,30 -18:26:13,154.0534,30.344,30.582,6.103,30 -18:26:13,154.0943,30.344,30.609,6.081,30 -18:26:14,154.1347,30.318,30.582,5.595,30 -18:26:14,154.1793,30.344,30.609,6.484,30 -18:26:14,154.2214,30.318,30.582,5.55,30 -18:26:14,154.2627,30.318,30.609,6.438,30 -18:26:14,154.3046,30.318,30.556,5.953,30 -18:26:14,154.3450,30.318,30.609,6.842,30 -18:26:14,154.3875,30.318,30.582,5.911,30 -18:26:14,154.4287,30.318,30.582,6.352,30 -18:26:14,154.4701,30.318,30.582,6.331,30 -18:26:14,154.5128,30.318,30.582,6.31,30 -18:26:14,154.5578,30.318,30.582,6.288,30 -18:26:14,154.6015,30.318,30.582,6.265,30 -18:26:14,154.6442,30.318,30.582,6.242,30 -18:26:14,154.6872,30.318,30.582,6.221,30 -18:26:14,154.7283,30.292,30.556,6.198,30 -18:26:14,154.7724,30.318,30.609,7.071,30 -18:26:14,154.8146,30.344,30.582,5.691,30 -18:26:14,154.8591,30.318,30.582,5.686,30 -18:26:14,154.9027,30.318,30.582,6.11,30 -18:26:14,154.9442,30.318,30.556,6.087,30 -18:26:14,154.9862,30.292,30.582,6.513,30 -18:26:14,155.0338,30.292,30.556,6.492,30 -18:26:14,155.0788,30.318,30.582,6.915,30 -18:26:15,155.1206,30.318,30.582,6.0,30 -18:26:15,155.1661,30.292,30.582,5.978,30 -18:26:15,155.2115,30.292,30.582,6.402,30 -18:26:15,155.2657,30.292,30.582,6.378,30 -18:26:15,155.3168,30.318,30.582,6.352,30 -18:26:15,155.3616,30.292,30.556,5.879,30 -18:26:15,155.4095,30.318,30.582,6.751,30 -18:26:15,155.4550,30.292,30.582,5.833,30 -18:26:15,155.4988,30.318,30.582,6.257,30 -18:26:15,155.5432,30.318,30.582,5.788,30 -18:26:15,155.5875,30.318,30.556,5.765,30 -18:26:15,155.6286,30.292,30.609,6.189,30 -18:26:15,155.6720,30.292,30.556,5.705,30 -18:26:15,155.7147,30.292,30.582,6.594,30 -18:26:15,155.7598,30.292,30.582,6.126,30 -18:26:15,155.8046,30.292,30.582,6.103,30 -18:26:15,155.8467,30.292,30.556,6.081,30 -18:26:15,155.8904,30.318,30.582,6.507,30 -18:26:15,155.9335,30.292,30.556,5.592,30 -18:26:15,155.9796,30.344,30.529,6.464,30 -18:26:15,156.0227,30.318,30.529,6.011,30 -18:26:15,156.0641,30.292,30.529,6.437,30 -18:26:16,156.1068,30.239,30.556,6.864,30 -18:26:16,156.1502,30.344,30.582,7.291,30 -18:26:16,156.1932,30.292,30.556,5.019,30 -18:26:16,156.2367,30.292,30.556,6.337,30 -18:26:16,156.2791,30.292,30.582,6.316,30 -18:26:16,156.3240,30.292,30.556,5.849,30 -18:26:16,156.3691,30.318,30.529,6.273,30 -18:26:16,156.4146,30.292,30.529,6.269,30 -18:26:16,156.4596,30.292,30.582,6.694,30 -18:26:16,156.5033,30.292,30.582,5.761,30 -18:26:16,156.5463,30.292,30.556,5.74,30 -18:26:16,156.5938,30.292,30.529,6.165,30 -18:26:16,156.6381,30.265,30.556,6.607,30 -18:26:16,156.6821,30.292,30.529,6.586,30 -18:26:16,156.7289,30.292,30.556,6.565,30 -18:26:16,156.7738,30.292,30.529,6.079,30 -18:26:16,156.8181,30.292,30.556,6.522,30 -18:26:16,156.8636,30.265,30.556,6.036,30 -18:26:16,156.9110,30.318,30.556,6.479,30 -18:26:16,156.9573,30.292,30.529,5.545,30 -18:26:16,157.0018,30.265,30.556,6.433,30 -18:26:16,157.0480,30.292,30.529,6.412,30 -18:26:16,157.0945,30.292,30.556,6.391,30 -18:26:17,157.1382,30.292,30.556,5.904,30 -18:26:17,157.1815,30.265,30.529,5.883,30 -18:26:17,157.2299,30.292,30.556,6.79,30 -18:26:17,157.2760,30.212,30.582,5.84,30 -18:26:17,157.3186,30.292,30.556,6.747,30 -18:26:17,157.3615,30.265,30.503,5.799,30 -18:26:17,157.4033,30.265,30.582,7.154,30 -18:26:17,157.4452,30.265,30.556,5.777,30 -18:26:17,157.4894,30.265,30.529,6.204,30 -18:26:17,157.5319,30.265,30.556,6.647,30 -18:26:17,157.5769,30.292,30.556,6.164,30 -18:26:17,157.6185,30.265,30.529,5.678,30 -18:26:17,157.6619,30.292,30.529,6.587,30 -18:26:17,157.7080,30.265,30.529,6.102,30 -18:26:17,157.7525,30.265,30.529,6.546,30 -18:26:17,157.7965,30.318,30.529,6.525,30 -18:26:17,157.8442,30.265,30.529,5.593,30 -18:26:17,157.8914,30.265,30.556,6.482,30 -18:26:17,157.9355,30.265,30.529,5.997,30 -18:26:17,157.9776,30.292,30.556,6.44,30 -18:26:17,158.0194,30.265,30.529,5.493,30 -18:26:17,158.0602,30.265,30.556,6.401,30 -18:26:18,158.1020,30.292,30.529,5.918,30 -18:26:18,158.1469,30.265,30.529,5.899,30 -18:26:18,158.1895,30.239,30.556,6.342,30 -18:26:18,158.2308,30.265,30.529,6.305,30 -18:26:18,158.2751,30.265,30.529,6.304,30 -18:26:18,158.3178,30.265,30.529,6.284,30 -18:26:18,158.3616,30.239,30.529,6.264,30 -18:26:18,158.4115,30.265,30.503,6.691,30 -18:26:18,158.4573,30.265,30.529,6.67,30 -18:26:18,158.5017,30.265,30.529,6.202,30 -18:26:18,158.5477,30.212,30.503,6.182,30 -18:26:18,158.5934,30.239,30.529,7.52,30 -18:26:18,158.6380,30.239,30.529,6.589,30 -18:26:18,158.6820,30.239,30.529,6.57,30 -18:26:18,158.7284,30.239,30.503,6.551,30 -18:26:18,158.7733,30.265,30.503,6.978,30 -18:26:18,158.8182,30.212,30.503,6.512,30 -18:26:18,158.8655,30.239,30.503,7.403,30 -18:26:18,158.9125,30.239,30.503,6.92,30 -18:26:18,158.9575,30.239,30.529,6.9,30 -18:26:18,159.0026,30.239,30.503,6.434,30 -18:26:18,159.0478,30.239,30.503,6.861,30 -18:26:18,159.0932,30.239,30.503,6.842,30 -18:26:19,159.1375,30.239,30.503,6.823,30 -18:26:19,159.1807,30.212,30.503,6.804,30 -18:26:19,159.2246,30.239,30.529,7.25,30 -18:26:19,159.2681,30.239,30.529,6.32,30 -18:26:19,159.3152,30.212,30.503,6.301,30 -18:26:19,159.3624,30.239,30.503,7.192,30 -18:26:19,159.4090,30.212,30.529,6.708,30 -18:26:19,159.4520,30.239,30.476,6.706,30 -18:26:19,159.4966,30.239,30.529,7.135,30 -18:26:19,159.5414,30.212,30.529,6.205,30 -18:26:19,159.5886,30.239,30.503,6.65,30 -18:26:19,159.6342,30.239,30.503,6.613,30 -18:26:19,159.6824,30.212,30.476,6.593,30 -18:26:19,159.7282,30.265,30.503,7.502,30 -18:26:19,159.7710,30.239,30.476,6.108,30 -18:26:19,159.8164,30.239,30.529,7.0,30 -18:26:19,159.8632,30.239,30.503,6.07,30 -18:26:19,159.9098,30.239,30.503,6.497,30 -18:26:19,159.9590,30.239,30.529,6.477,30 -18:26:19,160.0023,30.212,30.503,6.009,30 -18:26:19,160.0456,30.239,30.476,6.902,30 -18:26:19,160.0902,30.212,30.529,6.884,30 -18:26:20,160.1350,30.212,30.476,6.419,30 -18:26:20,160.1790,30.239,30.476,7.311,30 -18:26:20,160.2270,30.212,30.503,6.829,30 -18:26:20,160.2716,30.239,30.476,6.81,30 -18:26:20,160.3162,30.212,30.503,6.792,30 -18:26:20,160.3625,30.212,30.529,6.774,30 -18:26:20,160.4068,30.212,30.503,6.308,30 -18:26:20,160.4514,30.212,30.503,6.736,30 -18:26:20,160.4975,30.212,30.503,6.718,30 -18:26:20,160.5429,30.239,30.503,6.699,30 -18:26:20,160.5877,30.186,30.503,6.216,30 -18:26:20,160.6298,30.16,30.503,7.108,30 -18:26:20,160.6723,30.212,30.476,7.539,30 -18:26:20,160.7157,30.186,30.476,7.093,30 -18:26:20,160.7589,30.212,30.529,7.523,30 -18:26:20,160.8021,30.212,30.476,6.148,30 -18:26:20,160.8454,30.212,30.476,7.041,30 -18:26:20,160.8897,30.239,30.476,7.024,30 -18:26:20,160.9360,30.239,30.45,6.542,30 -18:26:20,160.9786,30.212,30.45,6.971,30 -18:26:20,161.0211,30.212,30.45,7.418,30 -18:26:20,161.0630,30.186,30.45,7.402,30 -18:26:21,161.1090,30.212,30.476,7.833,30 -18:26:21,161.1516,30.212,30.476,6.922,30 -18:26:21,161.1932,30.212,30.476,6.906,30 -18:26:21,161.2355,30.186,30.503,6.889,30 -18:26:21,161.2763,30.186,30.476,6.856,30 -18:26:21,161.3205,30.212,30.45,7.304,30 -18:26:21,161.3653,30.186,30.476,7.287,30 -18:26:21,161.4200,30.186,30.476,7.269,30 -18:26:21,161.4626,30.212,30.476,7.25,30 -18:26:21,161.5087,30.212,30.476,6.786,30 -18:26:21,161.5508,30.239,30.476,6.768,30 -18:26:21,161.5966,30.212,30.45,6.287,30 -18:26:21,161.6407,30.186,30.476,7.18,30 -18:26:21,161.6854,30.212,30.529,7.164,30 -18:26:21,161.7300,30.186,30.476,5.788,30 -18:26:21,161.7745,30.212,30.476,7.128,30 -18:26:21,161.8171,30.186,30.45,6.664,30 -18:26:21,161.8607,30.186,30.476,7.541,30 -18:26:21,161.9028,30.186,30.45,7.078,30 -18:26:21,161.9481,30.186,30.45,7.51,30 -18:26:21,161.9925,30.133,30.476,7.493,30 -18:26:21,162.0363,30.133,30.476,7.941,30 -18:26:21,162.0789,30.186,30.476,7.926,30 -18:26:22,162.1233,30.186,30.45,7.0,30 -18:26:22,162.1666,30.16,30.476,7.43,30 -18:26:22,162.2106,30.186,30.45,7.414,30 -18:26:22,162.2519,30.16,30.476,7.398,30 -18:26:22,162.2947,30.186,30.45,7.383,30 -18:26:22,162.3409,30.186,30.476,7.368,30 -18:26:22,162.3850,30.186,30.424,6.904,30 -18:26:22,162.4286,30.186,30.424,7.781,30 -18:26:22,162.4732,30.212,30.476,7.766,30 -18:26:22,162.5169,30.186,30.45,6.409,30 -18:26:22,162.5603,30.186,30.45,7.286,30 -18:26:22,162.6074,30.16,30.476,7.271,30 -18:26:22,162.6508,30.16,30.45,7.253,30 -18:26:22,162.6980,30.186,30.45,7.685,30 -18:26:22,162.7434,30.186,30.476,7.221,30 -18:26:22,162.7845,30.16,30.45,6.758,30 -18:26:22,162.8291,30.186,30.45,7.636,30 -18:26:22,162.8739,30.186,30.45,7.174,30 -18:26:22,162.9165,30.16,30.45,7.157,30 -18:26:22,162.9692,30.16,30.476,7.588,30 -18:26:22,163.0128,30.16,30.45,7.123,30 -18:26:22,163.0699,30.16,30.476,7.555,30 -18:26:23,163.1135,30.186,30.424,7.087,30 -18:26:23,163.1605,30.16,30.45,7.518,30 -18:26:23,163.2065,30.186,30.45,7.502,30 -18:26:23,163.2515,30.16,30.45,7.039,30 -18:26:23,163.2965,30.16,30.424,7.47,30 -18:26:23,163.3434,30.16,30.45,7.901,30 -18:26:23,163.3872,30.16,30.45,7.439,30 -18:26:23,163.4298,30.186,30.476,7.423,30 -18:26:23,163.4766,30.186,30.45,6.514,30 -18:26:23,163.5232,30.16,30.45,6.944,30 -18:26:23,163.5688,30.186,30.45,7.373,30 -18:26:23,163.6136,30.16,30.45,6.911,30 -18:26:23,163.6597,30.16,30.45,7.342,30 -18:26:23,163.7045,30.186,30.424,7.326,30 -18:26:23,163.7493,30.16,30.424,7.31,30 -18:26:23,163.7931,30.16,30.45,7.742,30 -18:26:23,163.8374,30.16,30.424,7.28,30 -18:26:23,163.8830,30.16,30.424,7.712,30 -18:26:23,163.9284,30.16,30.45,7.696,30 -18:26:23,163.9759,30.16,30.45,7.234,30 -18:26:23,164.0207,30.16,30.45,7.218,30 -18:26:23,164.0637,30.16,30.476,7.202,30 -18:26:24,164.1095,30.16,30.424,6.74,30 -18:26:24,164.1543,30.133,30.476,7.618,30 -18:26:24,164.1995,30.16,30.424,7.173,30 -18:26:24,164.2443,30.133,30.424,7.587,30 -18:26:24,164.2907,30.133,30.424,8.036,30 -18:26:24,164.3359,30.16,30.397,8.022,30 -18:26:24,164.3794,30.186,30.424,8.007,30 -18:26:24,164.4282,30.16,30.424,7.082,30 -18:26:24,164.4713,30.133,30.397,7.512,30 -18:26:24,164.5154,30.16,30.424,8.426,30 -18:26:24,164.5649,30.133,30.424,7.484,30 -18:26:24,164.6103,30.133,30.424,7.932,30 -18:26:24,164.6559,30.133,30.45,7.918,30 -18:26:24,164.7017,30.133,30.424,7.456,30 -18:26:24,164.7510,30.133,30.424,7.888,30 -18:26:24,164.7994,30.16,30.424,7.872,30 -18:26:24,164.8482,30.133,30.45,7.392,30 -18:26:24,164.8939,30.133,30.424,7.393,30 -18:26:24,164.9410,30.16,30.424,7.825,30 -18:26:24,164.9868,30.16,30.397,7.346,30 -18:26:24,165.0328,30.107,30.424,7.795,30 -18:26:24,165.0814,30.081,30.397,8.228,30 -18:26:25,165.1365,30.107,30.424,9.124,30 -18:26:25,165.1814,30.16,30.397,8.198,30 -18:26:25,165.2288,30.133,30.424,7.737,30 -18:26:25,165.2737,30.133,30.45,7.722,30 -18:26:25,165.3177,30.107,30.397,7.26,30 -18:26:25,165.3626,30.133,30.424,8.604,30 -18:26:25,165.4125,30.133,30.397,7.68,30 -18:26:25,165.4697,30.133,30.397,8.128,30 -18:26:25,165.5227,30.133,30.424,8.111,30 -18:26:25,165.5746,30.133,30.397,7.631,30 -18:26:25,165.6258,30.133,30.397,8.079,30 -18:26:25,165.6786,30.107,30.371,8.063,30 -18:26:25,165.7287,30.16,30.424,8.942,30 -18:26:25,165.7827,30.081,30.371,7.105,30 -18:26:25,165.8376,30.133,30.424,9.357,30 -18:26:25,165.8916,30.133,30.397,7.536,30 -18:26:25,165.9449,30.107,30.424,7.984,30 -18:26:25,166.0041,30.107,30.397,7.951,30 -18:26:25,166.0562,30.107,30.397,8.397,30 -18:26:26,166.1054,30.107,30.397,8.383,30 -18:26:26,166.1538,30.107,30.397,8.368,30 -18:26:26,166.2024,30.107,30.397,8.355,30 -18:26:26,166.2516,30.107,30.397,8.34,30 -18:26:26,166.3041,30.107,30.371,8.326,30 -18:26:26,166.3588,30.107,30.397,8.758,30 -18:26:26,166.4098,30.054,30.397,8.296,30 -18:26:26,166.4566,30.107,30.371,9.193,30 -18:26:26,166.5036,30.081,30.397,8.717,30 -18:26:26,166.5493,30.107,30.371,8.704,30 -18:26:26,166.5966,30.133,30.371,8.692,30 -18:26:26,166.6436,30.107,30.397,8.232,30 -18:26:26,166.6929,30.133,30.397,8.218,30 -18:26:26,166.7364,30.107,30.397,7.757,30 -18:26:26,166.7795,30.107,30.371,8.19,30 -18:26:26,166.8256,30.081,30.424,8.625,30 -18:26:26,166.8732,30.107,30.371,8.148,30 -18:26:26,166.9162,30.054,30.424,8.599,30 -18:26:26,166.9647,30.133,30.371,8.587,30 -18:26:26,167.0188,30.054,30.397,8.127,30 -18:26:26,167.0620,30.107,30.371,9.023,30 -18:26:27,167.1082,30.081,30.371,8.548,30 -18:26:27,167.1518,30.081,30.397,8.982,30 -18:26:27,167.1957,30.081,30.344,8.524,30 -18:26:27,167.2408,30.081,30.397,9.423,30 -18:26:27,167.2838,30.028,30.424,8.501,30 -18:26:27,167.3281,30.081,30.371,8.936,30 -18:26:27,167.3797,30.081,30.371,8.925,30 -18:26:27,167.4255,30.081,30.397,8.911,30 -18:26:27,167.4697,30.081,30.371,8.452,30 -18:26:27,167.5146,30.081,30.397,8.887,30 -18:26:27,167.5595,30.081,30.371,8.429,30 -18:26:27,167.6025,30.081,30.371,8.864,30 -18:26:27,167.6454,30.081,30.371,8.853,30 -18:26:27,167.6932,30.081,30.397,8.841,30 -18:26:27,167.7378,30.054,30.397,8.382,30 -18:26:27,167.7822,30.107,30.371,8.834,30 -18:26:27,167.8266,30.054,30.371,8.358,30 -18:26:27,167.8695,30.081,30.371,9.258,30 -18:26:27,167.9125,30.028,30.397,8.783,30 -18:26:27,167.9572,30.081,30.371,9.236,30 -18:26:27,168.0005,30.081,30.371,8.761,30 -18:26:27,168.0424,30.081,30.424,8.75,30 -18:26:27,168.0857,30.054,30.371,7.828,30 -18:26:28,168.1296,30.081,30.371,9.191,30 -18:26:28,168.1740,30.054,30.371,8.716,30 -18:26:28,168.2168,30.054,30.344,9.169,30 -18:26:28,168.2604,30.054,30.344,9.623,30 -18:26:28,168.3048,30.081,30.344,9.613,30 -18:26:28,168.3486,30.054,30.344,9.138,30 -18:26:28,168.3967,30.028,30.371,9.592,30 -18:26:28,168.4422,30.054,30.424,9.564,30 -18:26:28,168.4886,30.054,30.371,8.195,30 -18:26:28,168.5344,30.054,30.344,9.094,30 -18:26:28,168.5803,30.054,30.344,9.547,30 -18:26:28,168.6262,30.054,30.344,9.536,30 -18:26:28,168.6716,30.028,30.344,9.526,30 -18:26:28,168.7178,30.054,30.318,9.963,30 -18:26:28,168.7647,30.054,30.344,9.953,30 -18:26:28,168.8124,30.054,30.344,9.496,30 -18:26:28,168.8581,30.081,30.344,9.485,30 -18:26:28,168.9064,30.054,30.344,9.01,30 -18:26:28,168.9525,30.054,30.344,9.463,30 -18:26:28,169.0025,30.028,30.344,9.452,30 -18:26:28,169.0475,30.054,30.344,9.888,30 -18:26:28,169.0923,30.028,30.344,9.432,30 -18:26:29,169.1347,30.054,30.344,9.869,30 -18:26:29,169.1779,30.028,30.344,9.413,30 -18:26:29,169.2228,30.054,30.344,9.85,30 -18:26:29,169.2687,30.028,30.344,9.393,30 -18:26:29,169.3125,30.054,30.344,9.83,30 -18:26:29,169.3559,30.028,30.344,9.373,30 -18:26:29,169.4008,30.054,30.318,9.811,30 -18:26:29,169.4435,30.028,30.344,9.801,30 -18:26:29,169.4917,30.081,30.344,9.792,30 -18:26:29,169.5377,30.054,30.371,8.87,30 -18:26:29,169.5821,30.054,30.344,8.859,30 -18:26:29,169.6299,30.028,30.344,9.312,30 -18:26:29,169.6775,30.054,30.344,9.749,30 -18:26:29,169.7236,30.054,30.292,9.292,30 -18:26:29,169.7696,30.028,30.318,10.175,30 -18:26:29,169.8140,30.028,30.265,10.167,30 -18:26:29,169.8609,30.028,30.292,11.069,30 -18:26:29,169.9088,30.028,30.318,10.597,30 -18:26:29,169.9537,30.054,30.344,10.141,30 -18:26:29,169.9974,30.054,30.344,9.238,30 -18:26:29,170.0476,30.002,30.318,9.228,30 -18:26:29,170.0935,30.054,30.318,10.558,30 -18:26:30,170.1388,30.028,30.318,9.655,30 -18:26:30,170.1826,30.028,30.344,10.093,30 -18:26:30,170.2289,30.028,30.371,9.637,30 -18:26:30,170.2753,30.028,30.318,9.163,30 -18:26:30,170.3170,30.028,30.318,10.064,30 -18:26:30,170.3591,30.002,30.344,10.056,30 -18:26:30,170.4033,30.028,30.318,10.047,30 -18:26:30,170.4451,30.028,30.318,10.039,30 -18:26:30,170.4906,30.002,30.318,10.03,30 -18:26:30,170.5367,30.028,30.318,10.469,30 -18:26:30,170.5825,30.002,30.318,10.013,30 -18:26:30,170.6286,30.054,30.318,10.451,30 -18:26:30,170.6746,30.002,30.318,9.548,30 -18:26:30,170.7220,30.028,30.344,10.433,30 -18:26:30,170.7689,30.002,30.344,9.53,30 -18:26:30,170.8147,30.028,30.318,9.967,30 -18:26:30,170.8639,30.028,30.318,9.958,30 -18:26:30,170.9117,29.975,30.344,9.948,30 -18:26:30,170.9589,30.002,30.318,10.403,30 -18:26:30,171.0045,30.002,30.318,10.377,30 -18:26:30,171.0491,30.002,30.292,10.369,30 -18:26:31,171.0962,30.002,30.318,10.808,30 -18:26:31,171.1429,30.054,30.239,10.353,30 -18:26:31,171.1906,30.028,30.292,10.809,30 -18:26:31,171.2355,29.975,30.292,10.336,30 -18:26:31,171.2801,30.002,30.318,11.24,30 -18:26:31,171.3265,30.002,30.344,10.321,30 -18:26:31,171.3745,30.002,30.318,9.866,30 -18:26:31,171.4202,30.028,30.292,10.304,30 -18:26:31,171.4656,30.002,30.292,10.295,30 -18:26:31,171.5117,30.002,30.344,10.734,30 -18:26:31,171.5573,30.002,30.318,9.832,30 -18:26:31,171.6035,30.002,30.265,10.27,30 -18:26:31,171.6490,30.002,30.292,11.173,30 -18:26:31,171.6963,29.975,30.318,10.702,30 -18:26:31,171.7497,30.002,30.292,10.711,30 -18:26:31,171.7961,30.028,30.292,10.685,30 -18:26:31,171.8430,30.002,30.318,10.23,30 -18:26:31,171.8922,30.002,30.292,10.221,30 -18:26:31,171.9354,30.002,30.318,10.66,30 -18:26:31,171.9816,30.002,30.265,10.205,30 -18:26:31,172.0284,30.002,30.318,11.108,30 -18:26:31,172.0737,29.975,30.292,10.19,30 -18:26:32,172.1172,30.002,30.292,11.093,30 -18:26:32,172.1614,30.002,30.318,10.622,30 -18:26:32,172.2055,29.975,30.318,10.168,30 -18:26:32,172.2497,30.028,30.292,10.624,30 -18:26:32,172.2957,30.002,30.292,10.152,30 -18:26:32,172.3413,30.002,30.318,10.591,30 -18:26:32,172.3880,30.002,30.292,10.136,30 -18:26:32,172.4324,30.002,30.292,10.575,30 -18:26:32,172.4766,30.002,30.292,10.567,30 -18:26:32,172.5253,30.002,30.292,10.56,30 -18:26:32,172.5721,30.002,30.292,10.552,30 -18:26:32,172.6186,30.002,30.265,10.544,30 -18:26:32,172.6627,29.975,30.292,11.0,30 -18:26:32,172.7124,30.028,30.292,10.994,30 -18:26:32,172.7574,30.002,30.292,10.074,30 -18:26:32,172.8020,30.002,30.318,10.513,30 -18:26:32,172.8455,30.002,30.265,10.059,30 -18:26:32,172.8922,29.949,30.265,10.962,30 -18:26:32,172.9398,29.975,30.265,11.867,30 -18:26:32,172.9853,29.975,30.318,11.414,30 -18:26:32,173.0297,29.975,30.265,10.496,30 -18:26:32,173.0757,29.975,30.292,11.4,30 -18:26:33,173.1225,30.002,30.239,10.929,30 -18:26:33,173.1674,30.002,30.265,11.369,30 -18:26:33,173.2120,29.975,30.292,10.916,30 -18:26:33,173.2595,29.949,30.265,10.909,30 -18:26:33,173.3063,30.002,30.265,11.813,30 -18:26:33,173.3510,30.002,30.265,10.896,30 -18:26:33,173.3968,30.002,30.212,10.889,30 -18:26:33,173.4433,29.975,30.265,11.794,30 -18:26:33,173.4894,29.975,30.292,11.341,30 -18:26:33,173.5361,30.002,30.265,10.87,30 -18:26:33,173.5809,30.002,30.265,10.863,30 -18:26:33,173.6285,29.975,30.239,10.856,30 -18:26:33,173.6756,29.975,30.265,11.761,30 -18:26:33,173.7228,29.949,30.239,11.308,30 -18:26:33,173.7677,29.975,30.318,12.196,30 -18:26:33,173.8114,29.975,30.265,10.385,30 -18:26:33,173.8592,29.975,30.265,11.289,30 -18:26:33,173.9037,30.028,30.265,11.283,30 -18:26:33,173.9492,29.975,30.265,10.365,30 -18:26:33,173.9925,30.002,30.292,11.269,30 -18:26:33,174.0407,29.949,30.212,10.334,30 -18:26:33,174.0859,29.975,30.239,12.614,30 -18:26:34,174.1328,29.975,30.265,11.698,30 -18:26:34,174.1767,29.975,30.292,11.245,30 -18:26:34,174.2243,29.949,30.265,10.775,30 -18:26:34,174.2689,29.975,30.239,11.679,30 -18:26:34,174.3131,29.949,30.265,11.674,30 -18:26:34,174.3594,30.002,30.292,11.668,30 -18:26:34,174.4084,29.975,30.239,10.287,30 -18:26:34,174.4536,30.002,30.265,11.655,30 -18:26:34,174.4996,29.949,30.265,10.738,30 -18:26:34,174.5437,29.975,30.239,11.642,30 -18:26:34,174.5932,30.002,30.265,11.637,30 -18:26:34,174.6402,29.949,30.265,10.719,30 -18:26:34,174.6853,29.923,30.265,11.623,30 -18:26:34,174.7336,29.975,30.265,12.065,30 -18:26:34,174.7778,29.923,30.292,11.166,30 -18:26:34,174.8229,29.975,30.239,11.589,30 -18:26:34,174.8672,29.949,30.265,11.601,30 -18:26:34,174.9117,29.975,30.239,11.596,30 -18:26:34,174.9598,30.002,30.239,11.59,30 -18:26:34,175.0052,29.949,30.239,11.12,30 -18:26:34,175.0514,29.949,30.239,12.025,30 -18:26:35,175.0975,29.949,30.239,12.02,30 -18:26:35,175.1424,29.975,30.265,12.015,30 -18:26:35,175.1885,29.949,30.239,11.116,30 -18:26:35,175.2332,29.923,30.239,12.004,30 -18:26:35,175.2773,29.949,30.265,12.447,30 -18:26:35,175.3250,29.949,30.239,11.548,30 -18:26:35,175.3697,29.949,30.239,11.99,30 -18:26:35,175.4168,29.949,30.239,11.985,30 -18:26:35,175.4616,29.949,30.239,11.98,30 -18:26:35,175.5093,29.949,30.239,11.975,30 -18:26:35,175.5548,29.897,30.239,11.97,30 -18:26:35,175.6020,29.923,30.239,12.859,30 -18:26:35,175.6470,29.923,30.239,12.408,30 -18:26:35,175.6945,29.975,30.239,12.404,30 -18:26:35,175.7408,29.949,30.239,11.505,30 -18:26:35,175.7833,29.949,30.265,11.947,30 -18:26:35,175.8248,29.949,30.239,11.495,30 -18:26:35,175.8672,29.949,30.212,11.937,30 -18:26:35,175.9107,29.923,30.239,12.397,30 -18:26:35,175.9563,29.949,30.265,12.376,30 -18:26:35,176.0006,29.949,30.239,11.477,30 -18:26:35,176.0462,29.949,30.265,11.919,30 -18:26:35,176.0916,29.975,30.239,11.467,30 -18:26:36,176.1336,29.923,30.212,11.461,30 -18:26:36,176.1766,29.975,30.239,12.815,30 -18:26:36,176.2218,29.949,30.265,11.453,30 -18:26:36,176.2658,29.949,30.239,11.447,30 -18:26:36,176.3096,29.949,30.265,11.889,30 -18:26:36,176.3548,29.923,30.239,11.437,30 -18:26:36,176.3988,29.949,30.239,12.326,30 -18:26:36,176.4410,29.949,30.239,11.875,30 -18:26:36,176.4853,29.975,30.239,11.87,30 -18:26:36,176.5295,29.897,30.239,11.418,30 -18:26:36,176.5764,29.923,30.239,12.755,30 -18:26:36,176.6219,29.949,30.239,12.304,30 -18:26:36,176.6667,29.923,30.212,11.852,30 -18:26:36,176.7115,29.923,30.265,12.759,30 -18:26:36,176.7576,29.949,30.239,11.844,30 -18:26:36,176.8055,29.897,30.239,11.839,30 -18:26:36,176.8497,29.949,30.265,12.728,30 -18:26:36,176.8924,29.923,30.212,11.383,30 -18:26:36,176.9356,29.949,30.212,12.737,30 -18:26:36,176.9798,29.923,30.239,12.286,30 -18:26:36,177.0254,29.949,30.239,12.265,30 -18:26:36,177.0701,29.897,30.212,11.814,30 -18:26:37,177.1129,29.949,30.212,13.168,30 -18:26:37,177.1590,29.923,30.239,12.271,30 -18:26:37,177.2041,29.923,30.212,12.249,30 -18:26:37,177.2476,29.949,30.239,12.709,30 -18:26:37,177.2916,29.949,30.212,11.795,30 -18:26:37,177.3379,29.923,30.186,12.254,30 -18:26:37,177.3826,29.923,30.212,13.144,30 -18:26:37,177.4267,29.975,30.212,12.694,30 -18:26:37,177.4705,29.923,30.212,11.797,30 -18:26:37,177.5147,29.949,30.265,12.686,30 -18:26:37,177.5598,29.949,30.239,11.324,30 -18:26:37,177.6058,29.923,30.212,11.766,30 -18:26:37,177.6497,29.949,30.212,12.672,30 -18:26:37,177.6935,29.949,30.239,12.222,30 -18:26:37,177.7396,29.897,30.212,11.754,30 -18:26:37,177.7841,29.923,30.212,13.107,30 -18:26:37,177.8268,29.949,30.212,12.657,30 -18:26:37,177.8713,29.923,30.212,12.207,30 -18:26:37,177.9141,29.923,30.239,12.65,30 -18:26:37,177.9608,29.949,30.212,12.182,30 -18:26:37,178.0070,29.949,30.212,12.195,30 -18:26:37,178.0538,29.897,30.186,12.191,30 -18:26:38,178.0973,29.897,30.239,13.528,30 -18:26:38,178.1424,29.923,30.212,12.615,30 -18:26:38,178.1850,29.923,30.265,12.628,30 -18:26:38,178.2293,29.975,30.212,11.714,30 -18:26:38,178.2733,29.897,30.186,11.726,30 -18:26:38,178.3163,29.897,30.212,13.51,30 -18:26:38,178.3593,29.897,30.186,13.061,30 -18:26:38,178.4024,29.923,30.239,13.505,30 -18:26:38,178.4447,29.87,30.212,12.145,30 -18:26:38,178.4903,29.897,30.212,13.517,30 -18:26:38,178.5330,29.923,30.212,13.05,30 -18:26:38,178.5776,29.897,30.212,12.6,30 -18:26:38,178.6250,29.923,30.212,13.044,30 -18:26:38,178.6700,29.923,30.212,12.594,30 -18:26:38,178.7148,29.923,30.212,12.59,30 -18:26:38,178.7572,29.923,30.186,12.587,30 -18:26:38,178.8007,29.897,30.212,13.031,30 -18:26:38,178.8447,29.897,30.16,13.028,30 -18:26:38,178.8896,29.897,30.212,13.92,30 -18:26:38,178.9332,29.923,30.212,13.024,30 -18:26:38,178.9776,29.897,30.186,12.574,30 -18:26:38,179.0226,29.897,30.212,13.465,30 -18:26:38,179.0669,29.923,30.186,13.016,30 -18:26:39,179.1091,29.897,30.186,13.013,30 -18:26:39,179.1547,29.923,30.212,13.457,30 -18:26:39,179.1985,29.897,30.212,12.561,30 -18:26:39,179.2423,29.897,30.186,13.005,30 -18:26:39,179.2870,29.897,30.186,13.449,30 -18:26:39,179.3296,29.897,30.133,13.447,30 -18:26:39,179.3740,29.87,30.186,14.356,30 -18:26:39,179.4168,29.923,30.186,13.908,30 -18:26:39,179.4606,29.923,30.186,12.996,30 -18:26:39,179.5060,29.897,30.186,12.993,30 -18:26:39,179.5508,29.87,30.212,13.437,30 -18:26:39,179.5946,29.844,30.186,13.452,30 -18:26:39,179.6399,29.949,30.16,14.344,30 -18:26:39,179.6846,29.897,30.186,12.985,30 -18:26:39,179.7283,29.923,30.186,13.429,30 -18:26:39,179.7743,29.897,30.212,12.98,30 -18:26:39,179.8238,29.897,30.212,12.977,30 -18:26:39,179.8706,29.897,30.186,12.974,30 -18:26:39,179.9183,29.87,30.186,13.418,30 -18:26:39,179.9677,29.87,30.212,13.881,30 -18:26:39,180.0156,29.949,30.186,13.432,30 -18:26:39,180.0606,29.87,30.186,12.518,30 -18:26:40,180.1142,29.844,30.186,13.873,30 -18:26:40,180.1634,29.87,30.186,14.319,30 -18:26:40,180.2121,29.923,30.16,13.871,30 -18:26:40,180.2598,29.87,30.186,13.405,30 -18:26:40,180.3058,29.87,30.16,13.867,30 -18:26:40,180.3510,29.897,30.16,14.313,30 -18:26:40,180.3993,29.87,30.186,13.847,30 -18:26:40,180.4684,29.87,30.186,13.863,30 -18:26:40,180.5248,29.897,30.16,13.861,30 -18:26:40,180.5796,29.923,30.186,13.842,30 -18:26:40,180.6429,29.897,30.212,12.945,30 -18:26:40,180.7038,29.87,30.186,12.941,30 -18:26:40,180.7586,29.844,30.16,13.85,30 -18:26:40,180.8180,29.87,30.186,14.743,30 -18:26:40,180.8763,29.87,30.16,13.848,30 -18:26:40,180.9345,29.87,30.212,14.293,30 -18:26:40,180.9906,29.897,30.16,13.397,30 -18:26:40,181.0477,29.87,30.133,13.825,30 -18:26:41,181.1017,29.87,30.16,14.752,30 -18:26:41,181.1538,29.87,30.16,14.288,30 -18:26:41,181.2106,29.844,30.16,14.287,30 -18:26:41,181.2650,29.87,30.16,14.733,30 -18:26:41,181.3205,29.87,30.16,14.286,30 -18:26:41,181.3746,29.87,30.16,14.285,30 -18:26:41,181.4277,29.87,30.16,14.284,30 -18:26:41,181.4778,29.897,30.186,14.283,30 -18:26:41,181.5302,29.897,30.16,13.37,30 -18:26:41,181.5791,29.87,30.16,13.815,30 -18:26:41,181.6270,29.87,30.16,14.278,30 -18:26:41,181.6763,29.87,30.16,14.277,30 -18:26:41,181.7246,29.87,30.186,14.276,30 -18:26:41,181.7678,29.87,30.186,13.828,30 -18:26:41,181.8118,29.87,30.16,13.827,30 -18:26:41,181.8588,29.87,30.16,14.273,30 -18:26:41,181.9094,29.897,30.16,14.272,30 -18:26:41,181.9573,29.87,30.16,13.807,30 -18:26:41,182.0088,29.87,30.16,14.269,30 -18:26:41,182.0659,29.87,30.16,14.268,30 -18:26:42,182.1122,29.87,30.133,14.267,30 -18:26:42,182.1573,29.87,30.133,14.731,30 -18:26:42,182.2007,29.897,30.16,14.731,30 -18:26:42,182.2446,29.87,30.186,13.802,30 -18:26:42,182.2900,29.844,30.133,13.818,30 -18:26:42,182.3333,29.87,30.107,15.175,30 -18:26:42,182.3766,29.87,30.212,15.176,30 -18:26:42,182.4219,29.844,30.133,13.371,30 -18:26:42,182.4653,29.87,30.16,15.174,30 -18:26:42,182.5098,29.87,30.16,14.263,30 -18:26:42,182.5551,29.844,30.133,14.263,30 -18:26:42,182.6042,29.897,30.16,15.173,30 -18:26:42,182.6491,29.844,30.16,13.798,30 -18:26:42,182.6925,29.897,30.186,14.708,30 -18:26:42,182.7385,29.844,30.133,13.349,30 -18:26:42,182.7836,29.844,30.16,15.17,30 -18:26:42,182.8278,29.87,30.133,14.707,30 -18:26:42,182.8740,29.87,30.133,14.724,30 -18:26:42,182.9185,29.87,30.133,14.724,30 -18:26:42,182.9627,29.844,30.186,14.723,30 -18:26:42,183.0082,29.844,30.133,14.259,30 -18:26:42,183.0526,29.818,30.16,15.17,30 -18:26:43,183.0991,29.87,30.133,15.153,30 -18:26:43,183.1454,29.844,30.186,14.724,30 -18:26:43,183.1933,29.87,30.16,14.259,30 -18:26:43,183.2415,29.897,30.16,14.258,30 -18:26:43,183.2863,29.87,30.133,13.793,30 -18:26:43,183.3374,29.87,30.133,14.721,30 -18:26:43,183.3823,29.87,30.133,14.72,30 -18:26:43,183.4269,29.844,30.133,14.72,30 -18:26:43,183.4728,29.87,30.16,15.167,30 -18:26:43,183.5231,29.87,30.16,14.256,30 -18:26:43,183.5697,29.844,30.133,14.256,30 -18:26:43,183.6167,29.844,30.133,15.166,30 -18:26:43,183.6626,29.87,30.133,15.167,30 -18:26:43,183.7118,29.87,30.133,14.72,30 -18:26:43,183.7595,29.87,30.133,14.72,30 -18:26:43,183.8079,29.87,30.133,14.72,30 -18:26:43,183.8548,29.844,30.107,14.72,30 -18:26:43,183.9012,29.87,30.16,15.614,30 -18:26:43,183.9499,29.844,30.16,14.257,30 -18:26:43,183.9971,29.87,30.107,14.703,30 -18:26:43,184.0430,29.844,30.16,15.168,30 -18:26:43,184.0918,29.844,30.16,14.704,30 -18:26:44,184.1396,29.844,30.16,14.704,30 -18:26:44,184.1844,29.844,30.16,14.704,30 -18:26:44,184.2320,29.844,30.133,14.704,30 -18:26:44,184.2769,29.818,30.16,15.168,30 -18:26:44,184.3249,29.844,30.107,15.151,30 -18:26:44,184.3743,29.844,30.133,15.616,30 -18:26:44,184.4222,29.844,30.133,15.17,30 -18:26:44,184.4691,29.818,30.133,15.171,30 -18:26:44,184.5163,29.818,30.133,15.619,30 -18:26:44,184.5615,29.87,30.133,15.62,30 -18:26:44,184.6117,29.844,30.133,14.727,30 -18:26:44,184.6594,29.844,30.133,15.174,30 -18:26:44,184.7092,29.818,30.133,15.175,30 -18:26:44,184.7571,29.791,30.133,15.623,30 -18:26:44,184.8039,29.844,30.107,16.089,30 -18:26:44,184.8506,29.844,30.133,15.626,30 -18:26:44,184.8992,29.844,30.107,15.18,30 -18:26:44,184.9457,29.844,30.133,15.628,30 -18:26:44,184.9948,29.818,30.16,15.182,30 -18:26:44,185.0470,29.844,30.133,15.166,30 -18:26:44,185.0946,29.818,30.133,15.184,30 -18:26:45,185.1418,29.844,30.107,15.631,30 -18:26:45,185.1892,29.818,30.107,15.633,30 -18:26:45,185.2325,29.844,30.107,16.081,30 -18:26:45,185.2760,29.818,30.133,15.636,30 -18:26:45,185.3246,29.818,30.16,15.637,30 -18:26:45,185.3694,29.844,30.107,15.174,30 -18:26:45,185.4146,29.818,30.16,15.639,30 -18:26:45,185.4590,29.844,30.133,15.176,30 -18:26:45,185.5049,29.818,30.081,15.194,30 -18:26:45,185.5493,29.844,30.133,16.536,30 -18:26:45,185.5964,29.844,30.133,15.197,30 -18:26:45,185.6432,29.818,30.107,15.198,30 -18:26:45,185.6900,29.818,30.107,16.093,30 -18:26:45,185.7345,29.791,30.133,16.095,30 -18:26:45,185.7790,29.818,30.133,16.114,30 -18:26:45,185.8253,29.844,30.133,15.651,30 -18:26:45,185.8724,29.818,30.107,15.205,30 -18:26:45,185.9175,29.844,30.107,16.1,30 -18:26:45,185.9647,29.818,30.133,15.655,30 -18:26:45,186.0087,29.791,30.054,15.656,30 -18:26:45,186.0538,29.818,30.133,17.481,30 -18:26:46,186.1008,29.844,30.133,15.662,30 -18:26:46,186.1435,29.818,30.107,15.216,30 -18:26:46,186.1914,29.844,30.133,16.11,30 -18:26:46,186.2379,29.791,30.133,15.218,30 -18:26:46,186.2815,29.818,30.107,16.13,30 -18:26:46,186.3237,29.818,30.133,16.115,30 -18:26:46,186.3657,29.818,30.107,15.67,30 -18:26:46,186.4078,29.791,30.133,16.118,30 -18:26:46,186.4508,29.818,30.107,16.137,30 -18:26:46,186.4930,29.818,30.107,16.122,30 -18:26:46,186.5368,29.818,30.107,16.123,30 -18:26:46,186.5809,29.818,30.16,16.125,30 -18:26:46,186.6235,29.818,30.107,15.216,30 -18:26:46,186.6668,29.844,30.107,16.128,30 -18:26:46,186.7100,29.844,30.107,15.682,30 -18:26:46,186.7555,29.791,30.107,15.684,30 -18:26:46,186.7984,29.818,30.107,16.596,30 -18:26:46,186.8399,29.791,30.107,16.135,30 -18:26:46,186.8818,29.818,30.133,16.601,30 -18:26:46,186.9251,29.818,30.133,15.692,30 -18:26:46,186.9699,29.818,30.107,15.693,30 -18:26:46,187.0129,29.818,30.107,16.141,30 -18:26:46,187.0580,29.818,30.133,16.143,30 -18:26:47,187.1006,29.818,30.133,15.698,30 -18:26:47,187.1450,29.818,30.107,15.699,30 -18:26:47,187.1904,29.844,30.107,16.148,30 -18:26:47,187.2355,29.818,30.107,15.702,30 -18:26:47,187.2805,29.844,30.107,16.151,30 -18:26:47,187.3247,29.791,30.107,15.706,30 -18:26:47,187.3726,29.818,30.081,16.618,30 -18:26:47,187.4187,29.791,30.133,16.604,30 -18:26:47,187.4628,29.844,30.107,16.177,30 -18:26:47,187.5081,29.844,30.107,15.714,30 -18:26:47,187.5507,29.791,30.107,15.715,30 -18:26:47,187.5933,29.791,30.054,16.628,30 -18:26:47,187.6375,29.791,30.107,17.542,30 -18:26:47,187.6807,29.791,30.107,16.634,30 -18:26:47,187.7223,29.844,30.107,16.637,30 -18:26:47,187.7644,29.818,30.107,15.728,30 -18:26:47,187.8070,29.739,30.107,16.176,30 -18:26:47,187.8489,29.818,30.133,17.537,30 -18:26:47,187.8898,29.818,30.107,15.735,30 -18:26:47,187.9312,29.818,30.107,16.183,30 -18:26:47,187.9737,29.791,30.081,16.185,30 -18:26:47,188.0192,29.791,30.081,17.098,30 -18:26:47,188.0657,29.791,30.081,17.101,30 -18:26:48,188.1101,29.844,30.054,17.105,30 -18:26:48,188.1539,29.818,30.133,16.661,30 -18:26:48,188.1955,29.791,30.16,15.752,30 -18:26:48,188.2390,29.765,30.107,15.753,30 -18:26:48,188.2805,29.791,30.133,17.113,30 -18:26:48,188.3219,29.791,30.107,16.222,30 -18:26:48,188.3692,29.791,30.081,16.671,30 -18:26:48,188.4127,29.791,30.107,17.12,30 -18:26:48,188.4567,29.765,30.107,16.676,30 -18:26:48,188.4989,29.791,30.107,17.126,30 -18:26:48,188.5405,29.791,30.107,16.682,30 -18:26:48,188.5866,29.818,30.081,16.685,30 -18:26:48,188.6298,29.791,30.133,16.67,30 -18:26:48,188.6703,29.791,30.107,16.243,30 -18:26:48,188.7149,29.739,30.107,16.691,30 -18:26:48,188.7588,29.765,30.081,17.588,30 -18:26:48,188.8026,29.791,30.16,17.592,30 -18:26:48,188.8443,29.765,30.133,15.79,30 -18:26:48,188.8891,29.765,30.081,16.703,30 -18:26:48,188.9312,29.791,30.107,17.6,30 -18:26:48,188.9720,29.818,30.081,16.709,30 -18:26:48,189.0154,29.765,30.107,16.694,30 -18:26:48,189.0579,29.791,30.107,17.161,30 -18:26:49,189.1015,29.791,30.081,16.717,30 -18:26:49,189.1468,29.765,30.081,17.167,30 -18:26:49,189.1885,29.791,30.081,17.617,30 -18:26:49,189.2317,29.765,30.081,17.174,30 -18:26:49,189.2783,29.818,30.081,17.624,30 -18:26:49,189.3226,29.791,30.081,16.717,30 -18:26:49,189.3657,29.818,30.081,17.184,30 -18:26:49,189.4080,29.765,30.081,16.723,30 -18:26:49,189.4510,29.765,30.081,17.636,30 -18:26:49,189.4962,29.791,30.028,17.64,30 -18:26:49,189.5403,29.791,30.107,18.109,30 -18:26:49,189.5827,29.791,30.081,16.755,30 -18:26:49,189.6248,29.791,30.107,17.204,30 -18:26:49,189.6669,29.765,30.081,16.76,30 -18:26:49,189.7114,29.765,30.107,17.657,30 -18:26:49,189.7546,29.765,30.081,17.214,30 -18:26:49,189.7982,29.791,30.054,17.664,30 -18:26:49,189.8406,29.791,30.081,17.685,30 -18:26:49,189.8822,29.791,30.081,17.224,30 -18:26:49,189.9246,29.791,30.002,17.227,30 -18:26:49,189.9680,29.765,30.107,18.589,30 -18:26:49,190.0127,29.765,30.081,17.236,30 -18:26:49,190.0593,29.765,30.054,17.686,30 -18:26:50,190.1066,29.765,30.081,18.154,30 -18:26:50,190.1521,29.791,30.054,17.695,30 -18:26:50,190.1962,29.765,30.081,17.716,30 -18:26:50,190.2375,29.791,30.054,17.703,30 -18:26:50,190.2798,29.739,30.107,17.724,30 -18:26:50,190.3224,29.765,30.054,17.71,30 -18:26:50,190.3649,29.818,30.054,18.178,30 -18:26:50,190.4090,29.765,30.054,17.271,30 -18:26:50,190.4540,29.791,30.081,18.186,30 -18:26:50,190.4972,29.739,30.081,17.279,30 -18:26:50,190.5392,29.739,30.054,18.176,30 -18:26:50,190.5852,29.739,30.054,18.645,30 -18:26:50,190.6287,29.739,30.054,18.65,30 -18:26:50,190.6740,29.791,30.028,18.656,30 -18:26:50,190.7222,29.765,30.054,18.214,30 -18:26:50,190.7638,29.765,30.081,18.219,30 -18:26:50,190.8063,29.765,30.054,17.759,30 -18:26:50,190.8511,29.713,30.107,18.227,30 -18:26:50,190.8955,29.739,30.054,18.214,30 -18:26:50,190.9412,29.687,30.081,18.683,30 -18:26:50,190.9874,29.739,30.081,19.119,30 -18:26:50,191.0305,29.765,30.054,18.23,30 -18:26:50,191.0734,29.791,30.054,18.252,30 -18:26:51,191.1159,29.765,30.054,17.809,30 -18:26:51,191.1597,29.739,30.028,18.26,30 -18:26:51,191.2044,29.739,30.028,19.159,30 -18:26:51,191.2467,29.765,30.054,19.165,30 -18:26:51,191.2895,29.739,30.054,18.276,30 -18:26:51,191.3336,29.739,30.054,18.728,30 -18:26:51,191.3775,29.791,30.028,18.733,30 -18:26:51,191.4231,29.739,30.081,18.291,30 -18:26:51,191.4687,29.765,30.054,18.279,30 -18:26:51,191.5136,29.739,30.054,18.301,30 -18:26:51,191.5572,29.739,30.054,18.752,30 -18:26:51,191.6026,29.713,30.054,18.757,30 -18:26:51,191.6457,29.739,30.028,19.21,30 -18:26:51,191.6878,29.739,30.054,19.216,30 -18:26:51,191.7321,29.713,30.054,18.774,30 -18:26:51,191.7743,29.713,30.028,19.227,30 -18:26:51,191.8196,29.739,30.028,19.679,30 -18:26:51,191.8631,29.765,30.002,19.239,30 -18:26:51,191.9063,29.713,30.028,19.245,30 -18:26:51,191.9537,29.739,30.054,19.698,30 -18:26:51,191.9966,29.739,30.054,18.81,30 -18:26:51,192.0383,29.713,30.054,18.815,30 -18:26:51,192.0826,29.739,30.028,19.267,30 -18:26:52,192.1250,29.687,30.054,19.273,30 -18:26:52,192.1724,29.713,30.054,19.726,30 -18:26:52,192.2188,29.739,30.054,19.286,30 -18:26:52,192.2625,29.739,30.028,18.845,30 -18:26:52,192.3045,29.739,30.028,19.297,30 -18:26:52,192.3475,29.765,30.028,19.303,30 -18:26:52,192.3907,29.765,30.054,18.861,30 -18:26:52,192.4369,29.765,30.028,18.419,30 -18:26:52,192.4803,29.739,30.054,18.871,30 -18:26:52,192.5254,29.713,30.028,18.876,30 -18:26:52,192.5714,29.765,30.028,19.776,30 -18:26:52,192.6172,29.739,30.028,18.888,30 -18:26:52,192.6607,29.713,30.054,19.341,30 -18:26:52,192.7068,29.739,30.028,19.347,30 -18:26:52,192.7520,29.739,30.054,19.353,30 -18:26:52,192.7955,29.739,30.028,18.912,30 -18:26:52,192.8408,29.739,30.054,19.364,30 -18:26:52,192.8854,29.713,30.054,18.923,30 -18:26:52,192.9283,29.739,30.028,19.375,30 -18:26:52,192.9733,29.713,30.054,19.381,30 -18:26:52,193.0186,29.713,30.028,19.387,30 -18:26:52,193.0606,29.739,30.081,19.84,30 -18:26:53,193.1068,29.713,30.028,18.488,30 -18:26:53,193.1535,29.713,29.975,19.851,30 -18:26:53,193.1966,29.713,30.054,20.77,30 -18:26:53,193.2394,29.713,30.054,19.419,30 -18:26:53,193.2805,29.713,30.054,19.425,30 -18:26:53,193.3225,29.739,30.002,19.43,30 -18:26:53,193.3666,29.739,30.028,19.883,30 -18:26:53,193.4112,29.739,30.028,19.442,30 -18:26:53,193.4566,29.713,30.054,19.448,30 -18:26:53,193.5022,29.713,30.054,19.454,30 -18:26:53,193.5449,29.713,30.081,19.46,30 -18:26:53,193.5916,29.66,30.028,19.002,30 -18:26:53,193.6373,29.739,30.028,20.83,30 -18:26:53,193.6807,29.739,30.028,19.48,30 -18:26:53,193.7251,29.739,30.028,19.485,30 -18:26:53,193.7722,29.687,30.028,19.491,30 -18:26:53,193.8146,29.739,30.028,20.392,30 -18:26:53,193.8578,29.713,30.054,19.505,30 -18:26:53,193.9059,29.713,30.028,19.51,30 -18:26:53,193.9523,29.739,30.002,19.964,30 -18:26:53,193.9962,29.713,30.028,19.971,30 -18:26:53,194.0379,29.739,30.002,19.977,30 -18:26:53,194.0817,29.713,30.002,19.984,30 -18:26:54,194.1233,29.765,30.028,20.437,30 -18:26:54,194.1698,29.713,30.002,19.103,30 -18:26:54,194.2146,29.791,30.028,20.45,30 -18:26:54,194.2567,29.713,30.028,18.668,30 -18:26:54,194.3026,29.713,30.028,20.014,30 -18:26:54,194.3458,29.739,30.028,20.021,30 -18:26:54,194.3880,29.713,30.002,19.58,30 -18:26:54,194.4305,29.713,30.002,20.48,30 -18:26:54,194.4746,29.739,30.002,20.487,30 -18:26:54,194.5203,29.687,30.002,20.047,30 -18:26:54,194.5623,29.739,30.028,20.948,30 -18:26:54,194.6072,29.713,30.028,19.614,30 -18:26:54,194.6510,29.765,30.054,20.067,30 -18:26:54,194.6957,29.739,30.028,18.732,30 -18:26:54,194.7395,29.739,30.002,19.631,30 -18:26:54,194.7847,29.713,30.028,20.084,30 -18:26:54,194.8278,29.687,30.002,20.091,30 -18:26:54,194.8719,29.713,30.028,20.992,30 -18:26:54,194.9155,29.713,30.028,20.105,30 -18:26:54,194.9596,29.765,30.028,20.112,30 -18:26:54,195.0038,29.687,30.002,19.224,30 -18:26:54,195.0479,29.739,30.028,21.018,30 -18:26:54,195.0895,29.687,30.028,19.684,30 -18:26:55,195.1376,29.687,30.002,20.584,30 -18:26:55,195.1861,29.713,29.975,21.039,30 -18:26:55,195.2292,29.713,30.028,21.065,30 -18:26:55,195.2715,29.687,30.002,20.161,30 -18:26:55,195.3145,29.713,30.028,21.061,30 -18:26:55,195.3583,29.739,30.002,20.175,30 -18:26:55,195.4028,29.713,30.028,20.181,30 -18:26:55,195.4595,29.687,30.028,20.188,30 -18:26:55,195.5388,29.66,30.002,20.645,30 -18:26:55,195.5963,29.713,30.028,21.569,30 -18:26:55,195.6500,29.713,30.028,20.221,30 -18:26:55,195.7025,29.739,30.028,20.229,30 -18:26:55,195.7566,29.713,30.002,19.789,30 -18:26:55,195.8133,29.713,30.002,20.691,30 -18:26:55,195.8656,29.739,30.002,20.7,30 -18:26:55,195.9175,29.713,29.975,20.261,30 -18:26:55,195.9680,29.687,30.028,21.181,30 -18:26:55,196.0256,29.687,30.028,20.725,30 -18:26:55,196.0775,29.713,30.002,20.735,30 -18:26:56,196.1327,29.687,30.002,20.743,30 -18:26:56,196.1858,29.713,30.028,21.199,30 -18:26:56,196.2353,29.687,30.002,20.314,30 -18:26:56,196.2858,29.687,30.028,21.216,30 -18:26:56,196.3357,29.687,30.028,20.778,30 -18:26:56,196.3857,29.713,30.002,20.786,30 -18:26:56,196.4349,29.687,30.028,20.794,30 -18:26:56,196.4814,29.687,30.028,20.802,30 -18:26:56,196.5356,29.713,30.028,20.81,30 -18:26:56,196.5848,29.687,30.028,20.371,30 -18:26:56,196.6312,29.765,29.975,20.826,30 -18:26:56,196.6780,29.687,30.002,20.403,30 -18:26:56,196.7211,29.713,30.028,21.287,30 -18:26:56,196.7647,29.687,30.002,20.401,30 -18:26:56,196.8067,29.713,30.002,21.301,30 -18:26:56,196.8515,29.713,30.028,20.862,30 -18:26:56,196.8954,29.739,30.002,20.422,30 -18:26:56,196.9386,29.687,30.002,20.428,30 -18:26:56,196.9930,29.66,30.028,21.329,30 -18:26:56,197.0418,29.687,30.002,21.356,30 -18:26:56,197.0878,29.713,29.975,21.347,30 -18:26:57,197.1303,29.66,30.028,21.373,30 -18:26:57,197.1726,29.66,30.002,21.38,30 -18:26:57,197.2187,29.713,30.002,21.835,30 -18:26:57,197.2626,29.713,29.949,20.932,30 -18:26:57,197.3045,29.739,29.975,21.851,30 -18:26:57,197.3480,29.687,30.028,20.965,30 -18:26:57,197.3904,29.713,30.002,20.955,30 -18:26:57,197.4363,29.713,29.975,20.962,30 -18:26:57,197.4790,29.713,30.028,21.433,30 -18:26:57,197.5208,29.687,29.949,20.53,30 -18:26:57,197.5636,29.713,30.028,22.341,30 -18:26:57,197.6068,29.687,30.002,20.545,30 -18:26:57,197.6533,29.687,29.975,21.445,30 -18:26:57,197.6977,29.687,29.949,21.918,30 -18:26:57,197.7436,29.66,30.002,22.374,30 -18:26:57,197.7882,29.687,30.002,21.936,30 -18:26:57,197.8330,29.687,30.002,21.48,30 -18:26:57,197.8767,29.66,30.002,21.488,30 -18:26:57,197.9240,29.66,30.002,21.96,30 -18:26:57,197.9707,29.66,30.002,21.969,30 -18:26:57,198.0155,29.66,30.002,21.978,30 -18:26:57,198.0611,29.687,30.002,21.987,30 -18:26:58,198.1041,29.66,30.002,21.531,30 -18:26:58,198.1487,29.687,30.028,22.003,30 -18:26:58,198.1933,29.66,30.002,21.101,30 -18:26:58,198.2376,29.66,30.002,22.019,30 -18:26:58,198.2836,29.713,29.949,22.028,30 -18:26:58,198.3283,29.687,30.028,22.037,30 -18:26:58,198.3745,29.687,29.949,21.134,30 -18:26:58,198.4202,29.687,29.975,22.5,30 -18:26:58,198.4626,29.687,29.975,22.062,30 -18:26:58,198.5068,29.66,29.975,22.071,30 -18:26:58,198.5528,29.66,29.975,22.544,30 -18:26:58,198.5985,29.66,30.002,22.553,30 -18:26:58,198.6419,29.66,29.975,22.098,30 -18:26:58,198.6903,29.66,29.975,22.571,30 -18:26:58,198.7386,29.687,29.975,22.581,30 -18:26:58,198.7831,29.687,30.002,22.127,30 -18:26:58,198.8293,29.66,29.975,21.671,30 -18:26:58,198.8727,29.687,29.923,22.608,30 -18:26:58,198.9175,29.687,29.975,23.047,30 -18:26:58,198.9615,29.687,30.002,22.163,30 -18:26:58,199.0049,29.66,30.002,21.707,30 -18:26:58,199.0482,29.66,30.002,22.179,30 -18:26:58,199.0900,29.66,29.949,22.187,30 -18:26:59,199.1369,29.713,30.002,23.107,30 -18:26:59,199.1814,29.687,30.002,21.294,30 -18:26:59,199.2247,29.713,29.975,21.748,30 -18:26:59,199.2693,29.634,30.028,21.773,30 -18:26:59,199.3124,29.739,29.975,22.228,30 -18:26:59,199.3549,29.687,30.002,21.342,30 -18:26:59,199.4002,29.634,29.975,21.779,30 -18:26:59,199.4441,29.687,29.975,23.163,30 -18:26:59,199.4865,29.687,30.002,22.262,30 -18:26:59,199.5356,29.687,29.975,21.805,30 -18:26:59,199.5795,29.66,29.975,22.279,30 -18:26:59,199.6215,29.687,30.002,22.751,30 -18:26:59,199.6636,29.66,29.975,21.832,30 -18:26:59,199.7064,29.66,29.975,22.768,30 -18:26:59,199.7537,29.687,30.002,22.777,30 -18:26:59,199.7974,29.687,30.002,21.858,30 -18:26:59,199.8417,29.687,30.002,21.865,30 -18:26:59,199.8865,29.66,29.975,21.873,30 -18:26:59,199.9288,29.66,30.002,22.81,30 -18:26:59,199.9728,29.687,29.975,22.354,30 -18:26:59,200.0195,29.66,30.002,22.363,30 -18:26:59,200.0676,29.687,29.975,22.372,30 -18:27:00,200.1136,29.66,29.975,22.381,30 -18:27:00,200.1601,29.713,29.975,22.854,30 -18:27:00,200.2076,29.66,29.975,21.953,30 -18:27:00,200.2558,29.687,29.923,22.873,30 -18:27:00,200.3027,29.687,29.949,23.313,30 -18:27:00,200.3485,29.687,29.975,22.876,30 -18:27:00,200.3972,29.66,29.975,22.438,30 -18:27:00,200.4427,29.608,30.002,22.912,30 -18:27:00,200.4903,29.634,29.923,23.352,30 -18:27:00,200.5387,29.634,30.002,24.274,30 -18:27:00,200.5867,29.687,29.975,22.927,30 -18:27:00,200.6310,29.66,29.975,22.49,30 -18:27:00,200.6770,29.66,29.975,22.963,30 -18:27:00,200.7251,29.713,30.002,22.972,30 -18:27:00,200.7724,29.687,29.975,21.607,30 -18:27:00,200.8185,29.634,30.002,22.526,30 -18:27:00,200.8620,29.66,30.002,22.982,30 -18:27:00,200.9049,29.634,29.975,22.544,30 -18:27:00,200.9517,29.687,30.002,23.463,30 -18:27:00,200.9954,29.66,29.975,22.098,30 -18:27:00,201.0379,29.66,29.949,23.034,30 -18:27:00,201.0812,29.66,29.975,23.49,30 -18:27:01,201.1256,29.687,29.975,23.053,30 -18:27:01,201.1714,29.608,29.975,22.598,30 -18:27:01,201.2160,29.66,30.028,23.965,30 -18:27:01,201.2623,29.66,30.002,22.17,30 -18:27:01,201.3056,29.687,29.949,22.626,30 -18:27:01,201.3509,29.687,29.949,23.081,30 -18:27:01,201.3949,29.66,29.949,23.091,30 -18:27:01,201.4374,29.66,30.028,23.564,30 -18:27:01,201.4852,29.634,29.949,22.215,30 -18:27:01,201.5287,29.687,29.975,24.029,30 -18:27:01,201.5725,29.66,29.949,22.681,30 -18:27:01,201.6195,29.582,29.975,23.601,30 -18:27:01,201.6626,29.66,29.949,24.506,30 -18:27:01,201.7057,29.634,30.002,23.623,30 -18:27:01,201.7558,29.66,29.949,23.168,30 -18:27:01,201.8015,29.66,29.949,23.643,30 -18:27:01,201.8464,29.66,29.949,23.653,30 -18:27:01,201.8902,29.687,29.949,23.663,30 -18:27:01,201.9374,29.66,29.923,23.208,30 -18:27:01,201.9837,29.66,29.975,24.13,30 -18:27:01,202.0278,29.634,30.002,23.246,30 -18:27:01,202.0708,29.66,30.002,23.238,30 -18:27:02,202.1164,29.687,29.975,22.8,30 -18:27:02,202.1618,29.687,29.949,22.809,30 -18:27:02,202.2046,29.634,29.975,23.265,30 -18:27:02,202.2525,29.634,29.975,23.738,30 -18:27:02,202.2955,29.66,29.949,23.749,30 -18:27:02,202.3393,29.634,29.975,23.759,30 -18:27:02,202.3858,29.634,29.949,23.768,30 -18:27:02,202.4294,29.634,29.949,24.226,30 -18:27:02,202.4728,29.582,29.975,24.236,30 -18:27:02,202.5206,29.687,29.975,24.694,30 -18:27:02,202.5678,29.66,29.975,22.9,30 -18:27:02,202.6167,29.634,29.975,23.373,30 -18:27:02,202.6623,29.66,29.975,23.831,30 -18:27:02,202.7054,29.66,29.975,23.394,30 -18:27:02,202.7529,29.634,30.002,23.403,30 -18:27:02,202.7983,29.687,29.975,23.395,30 -18:27:02,202.8431,29.634,29.975,22.958,30 -18:27:02,202.8859,29.634,29.975,23.878,30 -18:27:02,202.9283,29.66,29.949,23.887,30 -18:27:02,202.9722,29.66,29.897,23.897,30 -18:27:02,203.0181,29.687,29.975,24.801,30 -18:27:02,203.0622,29.634,29.975,23.007,30 -18:27:03,203.1056,29.634,29.975,23.927,30 -18:27:03,203.1526,29.66,30.002,23.936,30 -18:27:03,203.1984,29.608,29.949,23.035,30 -18:27:03,203.2434,29.66,29.949,24.85,30 -18:27:03,203.2867,29.634,29.949,23.967,30 -18:27:03,203.3307,29.66,29.975,24.424,30 -18:27:03,203.3737,29.66,29.949,23.54,30 -18:27:03,203.4192,29.634,29.949,23.996,30 -18:27:03,203.4626,29.582,29.975,24.454,30 -18:27:03,203.5056,29.66,29.949,24.911,30 -18:27:03,203.5507,29.634,29.923,24.028,30 -18:27:03,203.5955,29.634,29.975,24.932,30 -18:27:03,203.6392,29.634,29.949,24.049,30 -18:27:03,203.6851,29.634,29.975,24.506,30 -18:27:03,203.7320,29.66,29.975,24.07,30 -18:27:03,203.7760,29.634,29.949,23.633,30 -18:27:03,203.8231,29.634,29.949,24.536,30 -18:27:03,203.8683,29.634,29.949,24.548,30 -18:27:03,203.9113,29.634,29.923,24.559,30 -18:27:03,203.9544,29.66,29.923,25.016,30 -18:27:03,204.0003,29.634,29.975,24.58,30 -18:27:03,204.0445,29.608,29.949,24.143,30 -18:27:03,204.0887,29.66,29.923,25.048,30 -18:27:04,204.1325,29.66,29.949,24.612,30 -18:27:04,204.1758,29.634,29.897,24.175,30 -18:27:04,204.2224,29.634,29.923,25.526,30 -18:27:04,204.2688,29.634,29.949,25.091,30 -18:27:04,204.3117,29.634,29.975,24.656,30 -18:27:04,204.3552,29.634,29.949,24.219,30 -18:27:04,204.4007,29.634,29.949,24.676,30 -18:27:04,204.4432,29.66,29.949,24.687,30 -18:27:04,204.4895,29.634,29.949,24.25,30 -18:27:04,204.5342,29.634,29.949,24.707,30 -18:27:04,204.5782,29.66,29.949,24.718,30 -18:27:04,204.6224,29.634,29.923,24.281,30 -18:27:04,204.6674,29.634,29.949,25.185,30 -18:27:04,204.7123,29.66,29.975,24.749,30 -18:27:04,204.7574,29.687,29.949,23.866,30 -18:27:04,204.8016,29.66,29.949,23.858,30 -18:27:04,204.8467,29.687,29.949,24.331,30 -18:27:04,204.8916,29.66,29.949,23.877,30 -18:27:04,204.9389,29.634,29.923,24.351,30 -18:27:04,204.9864,29.634,29.949,25.256,30 -18:27:04,205.0293,29.66,29.949,24.821,30 -18:27:04,205.0725,29.634,29.949,24.384,30 -18:27:05,205.1176,29.634,29.923,24.841,30 -18:27:05,205.1611,29.634,29.949,25.299,30 -18:27:05,205.2057,29.66,29.949,24.862,30 -18:27:05,205.2555,29.634,29.923,24.426,30 -18:27:05,205.3004,29.713,29.975,25.332,30 -18:27:05,205.3442,29.634,29.975,23.09,30 -18:27:05,205.3892,29.608,29.975,24.456,30 -18:27:05,205.4340,29.608,29.975,24.913,30 -18:27:05,205.4782,29.634,29.949,24.924,30 -18:27:05,205.5212,29.634,29.949,24.935,30 -18:27:05,205.5687,29.608,29.949,24.945,30 -18:27:05,205.6130,29.687,29.949,25.403,30 -18:27:05,205.6563,29.687,29.949,24.056,30 -18:27:05,205.7002,29.66,29.949,24.065,30 -18:27:05,205.7459,29.634,29.923,24.538,30 -18:27:05,205.7904,29.66,29.923,25.443,30 -18:27:05,205.8355,29.66,29.949,25.007,30 -18:27:05,205.8795,29.634,29.923,24.571,30 -18:27:05,205.9251,29.66,29.923,25.475,30 -18:27:05,205.9708,29.66,29.923,25.039,30 -18:27:05,206.0175,29.608,29.975,25.05,30 -18:27:05,206.0615,29.634,29.949,25.061,30 -18:27:06,206.1055,29.608,29.949,25.072,30 -18:27:06,206.1512,29.634,29.949,25.529,30 -18:27:06,206.1947,29.66,29.923,25.094,30 -18:27:06,206.2372,29.634,29.923,25.104,30 -18:27:06,206.2838,29.66,29.897,25.561,30 -18:27:06,206.3264,29.582,29.949,25.573,30 -18:27:06,206.3717,29.66,29.949,26.031,30 -18:27:06,206.4184,29.66,29.975,24.702,30 -18:27:06,206.4653,29.608,29.949,24.265,30 -18:27:06,206.5092,29.634,29.923,25.616,30 -18:27:06,206.5556,29.634,29.949,25.627,30 -18:27:06,206.6056,29.608,29.949,25.192,30 -18:27:06,206.6508,29.634,29.923,25.651,30 -18:27:06,206.6946,29.66,29.949,25.662,30 -18:27:06,206.7392,29.582,29.949,24.779,30 -18:27:06,206.7844,29.66,29.949,26.131,30 -18:27:06,206.8277,29.634,29.897,24.801,30 -18:27:06,206.8717,29.66,29.923,26.152,30 -18:27:06,206.9155,29.634,29.949,25.27,30 -18:27:06,206.9595,29.66,29.923,25.28,30 -18:27:06,207.0026,29.634,29.923,25.291,30 -18:27:06,207.0483,29.634,29.923,25.748,30 -18:27:06,207.0916,29.66,29.923,25.76,30 -18:27:07,207.1356,29.608,29.975,25.324,30 -18:27:07,207.1781,29.634,29.923,25.334,30 -18:27:07,207.2207,29.634,29.949,25.791,30 -18:27:07,207.2672,29.608,29.949,25.355,30 -18:27:07,207.3116,29.608,29.975,25.813,30 -18:27:07,207.3595,29.66,29.923,25.378,30 -18:27:07,207.4059,29.634,29.897,25.389,30 -18:27:07,207.4537,29.608,29.975,26.294,30 -18:27:07,207.5025,29.634,29.949,25.413,30 -18:27:07,207.5479,29.582,29.923,25.424,30 -18:27:07,207.5955,29.66,29.923,26.776,30 -18:27:07,207.6427,29.66,29.975,25.448,30 -18:27:07,207.6887,29.634,29.923,24.565,30 -18:27:07,207.7380,29.687,29.897,25.916,30 -18:27:07,207.7845,29.634,29.949,25.464,30 -18:27:07,207.8298,29.634,29.949,25.493,30 -18:27:07,207.8757,29.634,29.949,25.503,30 -18:27:07,207.9229,29.66,29.923,25.514,30 -18:27:07,207.9707,29.634,29.949,25.526,30 -18:27:07,208.0194,29.608,29.975,25.537,30 -18:27:07,208.0666,29.608,29.949,25.549,30 -18:27:08,208.1116,29.634,29.923,26.007,30 -18:27:08,208.1560,29.66,29.923,26.018,30 -18:27:08,208.2036,29.608,29.949,25.582,30 -18:27:08,208.2543,29.634,29.923,26.041,30 -18:27:08,208.3057,29.66,29.949,26.054,30 -18:27:08,208.3506,29.634,29.949,25.172,30 -18:27:08,208.3938,29.608,29.923,25.629,30 -18:27:08,208.4392,29.634,29.923,26.534,30 -18:27:08,208.4863,29.66,29.949,26.099,30 -18:27:08,208.5333,29.608,29.949,25.217,30 -18:27:08,208.5785,29.634,29.923,26.121,30 -18:27:08,208.6228,29.608,29.897,26.133,30 -18:27:08,208.6680,29.608,29.949,27.038,30 -18:27:08,208.7118,29.555,29.949,26.157,30 -18:27:08,208.7567,29.582,29.923,27.079,30 -18:27:08,208.8010,29.687,29.949,27.075,30 -18:27:08,208.8475,29.634,29.949,24.834,30 -18:27:08,208.8911,29.608,29.923,25.756,30 -18:27:08,208.9371,29.608,29.923,26.66,30 -18:27:08,208.9827,29.608,29.949,26.673,30 -18:27:08,209.0256,29.634,29.949,26.238,30 -18:27:08,209.0702,29.634,29.897,25.801,30 -18:27:09,209.1137,29.608,29.923,26.706,30 -18:27:09,209.1578,29.634,29.923,26.718,30 -18:27:09,209.2032,29.608,29.923,26.283,30 -18:27:09,209.2478,29.608,29.949,26.741,30 -18:27:09,209.2938,29.555,29.949,26.306,30 -18:27:09,209.3367,29.608,29.897,27.229,30 -18:27:09,209.3831,29.608,29.897,27.224,30 -18:27:09,209.4289,29.582,29.923,27.237,30 -18:27:09,209.4723,29.608,29.923,27.25,30 -18:27:09,209.5175,29.634,29.923,26.815,30 -18:27:09,209.5615,29.555,29.923,26.38,30 -18:27:09,209.6061,29.608,29.923,27.75,30 -18:27:09,209.6513,29.608,29.923,26.852,30 -18:27:09,209.6938,29.634,29.923,26.864,30 -18:27:09,209.7397,29.608,29.897,26.428,30 -18:27:09,209.7846,29.582,29.923,27.334,30 -18:27:09,209.8275,29.582,29.923,27.347,30 -18:27:09,209.8705,29.66,29.897,27.359,30 -18:27:09,209.9166,29.608,29.923,26.477,30 -18:27:09,209.9607,29.608,29.923,26.936,30 -18:27:09,210.0042,29.555,29.923,26.948,30 -18:27:09,210.0512,29.608,29.923,27.871,30 -18:27:09,210.0940,29.582,29.923,26.973,30 -18:27:10,210.1414,29.555,29.923,27.432,30 -18:27:10,210.1897,29.608,29.897,27.91,30 -18:27:10,210.2341,29.608,29.897,27.46,30 -18:27:10,210.2798,29.608,29.949,27.472,30 -18:27:10,210.3245,29.608,29.897,26.591,30 -18:27:10,210.3704,29.687,29.923,27.496,30 -18:27:10,210.4169,29.634,29.897,25.703,30 -18:27:10,210.4780,29.582,29.923,27.073,30 -18:27:10,210.5424,29.608,29.897,27.537,30 -18:27:10,210.5975,29.608,29.949,27.555,30 -18:27:10,210.6490,29.608,29.897,26.676,30 -18:27:10,210.7016,29.634,29.897,27.583,30 -18:27:10,210.7539,29.582,29.923,27.151,30 -18:27:10,210.8058,29.634,29.87,27.612,30 -18:27:10,210.8636,29.608,29.897,27.644,30 -18:27:10,210.9157,29.634,29.923,27.643,30 -18:27:10,210.9828,29.608,29.87,26.763,30 -18:27:10,211.0524,29.582,29.897,28.142,30 -18:27:11,211.1057,29.582,29.923,28.144,30 -18:27:11,211.1564,29.608,29.897,27.712,30 -18:27:11,211.2098,29.582,29.923,27.726,30 -18:27:11,211.2603,29.582,29.897,27.741,30 -18:27:11,211.3152,29.634,29.897,28.204,30 -18:27:11,211.3772,29.608,29.923,27.325,30 -18:27:11,211.4291,29.555,29.975,27.341,30 -18:27:11,211.4806,29.608,29.923,27.373,30 -18:27:11,211.5275,29.582,29.897,27.369,30 -18:27:11,211.5788,29.582,29.975,28.277,30 -18:27:11,211.6286,29.634,29.897,26.95,30 -18:27:11,211.6756,29.582,29.87,27.409,30 -18:27:11,211.7251,29.582,29.923,28.781,30 -18:27:11,211.7697,29.582,29.923,27.885,30 -18:27:11,211.8190,29.608,29.87,27.897,30 -18:27:11,211.8666,29.608,29.897,28.376,30 -18:27:11,211.9152,29.66,29.897,27.926,30 -18:27:11,211.9612,29.634,29.897,27.045,30 -18:27:11,212.0133,29.608,29.897,27.504,30 -18:27:11,212.0585,29.608,29.897,27.965,30 -18:27:12,212.1040,29.582,29.923,27.978,30 -18:27:12,212.1526,29.582,29.923,27.99,30 -18:27:12,212.1989,29.582,29.923,28.004,30 -18:27:12,212.2427,29.582,29.897,28.017,30 -18:27:12,212.2877,29.608,29.949,28.477,30 -18:27:12,212.3356,29.66,29.87,27.149,30 -18:27:12,212.3835,29.582,29.923,27.625,30 -18:27:12,212.4289,29.582,29.949,28.068,30 -18:27:12,212.4758,29.608,29.897,27.634,30 -18:27:12,212.5212,29.608,29.923,28.093,30 -18:27:12,212.5702,29.608,29.897,27.659,30 -18:27:12,212.6184,29.555,29.897,28.12,30 -18:27:12,212.6634,29.582,29.897,29.045,30 -18:27:12,212.7084,29.634,29.897,28.594,30 -18:27:12,212.7542,29.634,29.897,27.714,30 -18:27:12,212.8013,29.608,29.897,27.726,30 -18:27:12,212.8455,29.608,29.897,28.186,30 -18:27:12,212.8893,29.608,29.923,28.198,30 -18:27:12,212.9447,29.582,29.897,27.763,30 -18:27:12,212.9902,29.529,29.897,28.673,30 -18:27:12,213.0383,29.608,29.897,29.598,30 -18:27:12,213.0845,29.555,29.897,28.255,30 -18:27:13,213.1295,29.608,29.923,29.179,30 -18:27:13,213.1748,29.582,29.923,27.835,30 -18:27:13,213.2173,29.608,29.923,28.294,30 -18:27:13,213.2639,29.608,29.897,27.859,30 -18:27:13,213.3093,29.608,29.87,28.319,30 -18:27:13,213.3537,29.555,29.897,28.796,30 -18:27:13,213.3991,29.582,29.897,29.256,30 -18:27:13,213.4429,29.555,29.923,28.806,30 -18:27:13,213.4858,29.582,29.87,28.836,30 -18:27:13,213.5310,29.555,29.897,29.296,30 -18:27:13,213.5771,29.555,29.923,29.31,30 -18:27:13,213.6215,29.582,29.897,28.878,30 -18:27:13,213.6697,29.608,29.87,28.874,30 -18:27:13,213.7174,29.608,29.923,28.905,30 -18:27:13,213.7644,29.582,29.87,28.008,30 -18:27:13,213.8098,29.608,29.87,29.379,30 -18:27:13,213.8554,29.608,29.87,28.946,30 -18:27:13,213.9028,29.634,29.844,28.96,30 -18:27:13,213.9531,29.608,29.87,28.974,30 -18:27:13,214.0031,29.634,29.897,28.989,30 -18:27:13,214.0483,29.555,29.897,28.092,30 -18:27:13,214.0939,29.634,29.87,29.463,30 -18:27:14,214.1424,29.608,29.844,28.583,30 -18:27:14,214.1876,29.555,29.897,29.491,30 -18:27:14,214.2363,29.555,29.897,29.505,30 -18:27:14,214.2854,29.608,29.818,29.52,30 -18:27:14,214.3336,29.582,29.87,29.983,30 -18:27:14,214.3802,29.634,29.897,29.552,30 -18:27:14,214.4262,29.608,29.844,28.208,30 -18:27:14,214.4716,29.582,29.87,29.579,30 -18:27:14,214.5184,29.582,29.923,29.593,30 -18:27:14,214.5693,29.555,29.897,28.696,30 -18:27:14,214.6188,29.529,29.897,29.622,30 -18:27:14,214.6668,29.608,29.897,30.085,30 -18:27:14,214.7137,29.608,29.923,28.741,30 -18:27:14,214.7681,29.555,29.923,28.308,30 -18:27:14,214.8147,29.608,29.897,29.234,30 -18:27:14,214.8614,29.503,29.87,28.783,30 -18:27:14,214.9093,29.555,29.923,31.067,30 -18:27:14,214.9552,29.555,29.87,29.278,30 -18:27:14,215.0026,29.608,29.87,30.203,30 -18:27:14,215.0517,29.608,29.87,29.307,30 -18:27:15,215.1017,29.608,29.87,29.322,30 -18:27:15,215.1505,29.555,29.949,29.337,30 -18:27:15,215.1965,29.608,29.87,28.904,30 -18:27:15,215.2426,29.608,29.87,29.364,30 -18:27:15,215.2867,29.582,29.897,29.378,30 -18:27:15,215.3362,29.555,29.897,29.374,30 -18:27:15,215.3844,29.529,29.897,29.853,30 -18:27:15,215.4319,29.555,29.87,30.315,30 -18:27:15,215.4787,29.608,29.818,30.348,30 -18:27:15,215.5252,29.582,29.897,30.346,30 -18:27:15,215.5711,29.582,29.897,29.45,30 -18:27:15,215.6205,29.555,29.87,29.464,30 -18:27:15,215.6692,29.555,29.897,30.407,30 -18:27:15,215.7175,29.582,29.897,29.959,30 -18:27:15,215.7650,29.582,29.923,29.51,30 -18:27:15,215.8108,29.608,29.897,29.077,30 -18:27:15,215.8569,29.555,29.897,29.09,30 -18:27:15,215.9041,29.608,29.87,30.014,30 -18:27:15,215.9530,29.582,29.87,29.582,30 -18:27:15,215.9991,29.582,29.87,30.043,30 -18:27:15,216.0439,29.608,29.87,30.058,30 -18:27:15,216.0882,29.555,29.897,29.625,30 -18:27:16,216.1362,29.582,29.923,30.085,30 -18:27:16,216.1839,29.608,29.87,29.189,30 -18:27:16,216.2265,29.555,29.818,29.666,30 -18:27:16,216.2700,29.555,29.87,31.485,30 -18:27:16,216.3165,29.608,29.923,30.606,30 -18:27:16,216.3627,29.608,29.897,28.798,30 -18:27:16,216.4083,29.582,29.897,29.258,30 -18:27:16,216.4522,29.555,29.87,29.718,30 -18:27:16,216.4989,29.66,29.87,30.66,30 -18:27:16,216.5433,29.582,29.87,28.869,30 -18:27:16,216.5880,29.582,29.87,30.222,30 -18:27:16,216.6358,29.608,29.87,30.236,30 -18:27:16,216.6842,29.608,29.87,29.804,30 -18:27:16,216.7320,29.608,29.87,29.819,30 -18:27:16,216.7768,29.555,29.897,29.833,30 -18:27:16,216.8207,29.582,29.923,30.293,30 -18:27:16,216.8672,29.555,29.897,29.396,30 -18:27:16,216.9104,29.555,29.897,30.32,30 -18:27:16,216.9548,29.555,29.87,30.334,30 -18:27:16,217.0029,29.608,29.87,30.812,30 -18:27:16,217.0504,29.555,29.87,29.916,30 -18:27:16,217.0948,29.582,29.87,30.842,30 -18:27:17,217.1393,29.582,29.87,30.392,30 -18:27:17,217.1867,29.582,29.844,30.406,30 -18:27:17,217.2316,29.555,29.87,30.868,30 -18:27:17,217.2775,29.582,29.897,30.9,30 -18:27:17,217.3226,29.529,29.897,29.986,30 -18:27:17,217.3745,29.608,29.897,30.911,30 -18:27:17,217.4183,29.66,29.87,29.57,30 -18:27:17,217.4626,29.608,29.87,29.152,30 -18:27:17,217.5064,29.582,29.844,30.058,30 -18:27:17,217.5521,29.634,29.87,30.965,30 -18:27:17,217.5961,29.582,29.87,29.639,30 -18:27:17,217.6413,29.555,29.897,30.546,30 -18:27:17,217.6853,29.582,29.87,30.56,30 -18:27:17,217.7338,29.582,29.844,30.573,30 -18:27:17,217.7778,29.529,29.897,31.036,30 -18:27:17,217.8207,29.582,29.87,31.05,30 -18:27:17,217.8671,29.555,29.844,30.617,30 -18:27:17,217.9107,29.608,29.87,31.543,30 -18:27:17,217.9565,29.555,29.87,30.2,30 -18:27:17,218.0028,29.555,29.897,31.125,30 -18:27:17,218.0479,29.608,29.844,30.676,30 -18:27:17,218.0907,29.503,29.87,30.69,30 -18:27:18,218.1334,29.608,29.844,32.062,30 -18:27:18,218.1769,29.503,29.923,30.718,30 -18:27:18,218.2198,29.555,29.897,31.179,30 -18:27:18,218.2652,29.555,29.897,30.746,30 -18:27:18,218.3085,29.555,29.897,30.761,30 -18:27:18,218.3529,29.555,29.897,30.774,30 -18:27:18,218.3994,29.582,29.87,30.788,30 -18:27:18,218.4414,29.555,29.897,30.802,30 -18:27:18,218.4855,29.582,29.897,30.816,30 -18:27:18,218.5310,29.555,29.87,30.365,30 -18:27:18,218.5760,29.555,29.897,31.307,30 -18:27:18,218.6195,29.555,29.87,30.858,30 -18:27:18,218.6670,29.555,29.897,31.336,30 -18:27:18,218.7125,29.608,29.897,30.887,30 -18:27:18,218.7594,29.608,29.791,29.99,30 -18:27:18,218.8020,29.582,29.844,31.826,30 -18:27:18,218.8470,29.634,29.87,31.376,30 -18:27:18,218.8897,29.608,29.791,30.05,30 -18:27:18,218.9367,29.555,29.87,31.867,30 -18:27:18,218.9813,29.555,29.923,31.436,30 -18:27:18,219.0240,29.555,29.87,30.539,30 -18:27:18,219.0676,29.582,29.923,31.464,30 -18:27:19,219.1135,29.582,29.897,30.102,30 -18:27:19,219.1588,29.582,29.87,30.562,30 -18:27:19,219.2006,29.608,29.897,31.04,30 -18:27:19,219.2438,29.555,29.87,30.142,30 -18:27:19,219.2860,29.555,29.844,31.53,30 -18:27:19,219.3306,29.582,29.87,31.991,30 -18:27:19,219.3756,29.582,29.87,31.095,30 -18:27:19,219.4192,29.582,29.897,31.109,30 -18:27:19,219.4651,29.608,29.87,30.658,30 -18:27:19,219.5086,29.608,29.844,30.689,30 -18:27:19,219.5526,29.608,29.844,31.149,30 -18:27:19,219.6006,29.555,29.897,31.163,30 -18:27:19,219.6437,29.555,29.87,31.178,30 -18:27:19,219.6875,29.555,29.87,31.656,30 -18:27:19,219.7353,29.582,29.844,31.67,30 -18:27:19,219.7817,29.582,29.87,31.669,30 -18:27:19,219.8258,29.555,29.87,31.236,30 -18:27:19,219.8706,29.582,29.897,31.715,30 -18:27:19,219.9180,29.555,29.923,30.801,30 -18:27:19,219.9718,29.608,29.87,30.832,30 -18:27:19,220.0220,29.608,29.87,30.848,30 -18:27:19,220.0702,29.555,29.897,30.863,30 -18:27:20,220.1169,29.608,29.87,31.325,30 -18:27:20,220.1645,29.582,29.897,30.892,30 -18:27:20,220.2112,29.529,29.897,30.889,30 -18:27:20,220.2572,29.582,29.844,31.814,30 -18:27:20,220.3025,29.608,29.897,31.83,30 -18:27:20,220.3505,29.608,29.87,30.486,30 -18:27:20,220.4004,29.555,29.87,30.964,30 -18:27:20,220.4486,29.555,29.87,31.89,30 -18:27:20,220.4957,29.608,29.818,31.906,30 -18:27:20,220.5435,29.582,29.897,31.904,30 -18:27:20,220.5902,29.555,29.844,31.008,30 -18:27:20,220.6365,29.608,29.87,32.398,30 -18:27:20,220.6856,29.608,29.818,31.055,30 -18:27:20,220.7366,29.529,29.844,31.964,30 -18:27:20,220.7855,29.582,29.897,32.893,30 -18:27:20,220.8345,29.608,29.844,31.087,30 -18:27:20,220.8796,29.555,29.897,31.566,30 -18:27:20,220.9236,29.582,29.844,31.58,30 -18:27:20,220.9722,29.555,29.897,32.041,30 -18:27:20,221.0198,29.555,29.844,31.61,30 -18:27:20,221.0670,29.608,29.87,32.536,30 -18:27:21,221.1137,29.582,29.87,31.194,30 -18:27:21,221.1596,29.555,29.897,31.655,30 -18:27:21,221.2062,29.529,29.844,31.669,30 -18:27:21,221.2566,29.555,29.87,33.043,30 -18:27:21,221.3015,29.608,29.844,32.166,30 -18:27:21,221.3505,29.582,29.87,31.717,30 -18:27:21,221.4066,29.608,29.87,31.732,30 -18:27:21,221.4534,29.555,29.844,31.303,30 -18:27:21,221.5103,29.555,29.87,32.675,30 -18:27:21,221.5540,29.555,29.844,32.247,30 -18:27:21,221.6010,29.608,29.87,32.709,30 -18:27:21,221.6470,29.555,29.844,31.366,30 -18:27:21,221.6921,29.503,29.897,32.738,30 -18:27:21,221.7375,29.608,29.897,32.736,30 -18:27:21,221.7863,29.555,29.844,30.946,30 -18:27:21,221.8380,29.608,29.844,32.783,30 -18:27:21,221.8865,29.555,29.844,31.889,30 -18:27:21,221.9365,29.555,29.87,32.816,30 -18:27:21,221.9849,29.529,29.923,32.386,30 -18:27:21,222.0325,29.555,29.87,31.937,30 -18:27:21,222.0794,29.582,29.844,32.417,30 -18:27:22,222.1263,29.555,29.844,32.415,30 -18:27:22,222.1756,29.555,29.87,32.895,30 -18:27:22,222.2218,29.582,29.844,32.465,30 -18:27:22,222.2715,29.555,29.844,32.462,30 -18:27:22,222.3189,29.555,29.897,32.943,30 -18:27:22,222.3697,29.555,29.87,32.048,30 -18:27:22,222.4152,29.634,29.844,32.528,30 -18:27:22,222.4612,29.555,29.844,31.632,30 -18:27:22,222.5064,29.555,29.87,33.004,30 -18:27:22,222.5510,29.555,29.897,32.572,30 -18:27:22,222.5997,29.582,29.87,32.123,30 -18:27:22,222.6438,29.555,29.87,32.138,30 -18:27:22,222.6892,29.555,29.844,32.616,30 -18:27:22,222.7385,29.555,29.87,33.078,30 -18:27:22,222.7856,29.529,29.844,32.648,30 -18:27:22,222.8313,29.555,29.87,33.558,30 -18:27:22,222.8767,29.608,29.844,32.68,30 -18:27:22,222.9224,29.555,29.844,32.23,30 -18:27:22,222.9685,29.608,29.818,33.156,30 -18:27:22,223.0170,29.582,29.87,32.708,30 -18:27:22,223.0656,29.608,29.87,32.276,30 -18:27:23,223.1096,29.555,29.818,31.844,30 -18:27:23,223.1555,29.555,29.87,33.663,30 -18:27:23,223.2033,29.582,29.844,32.785,30 -18:27:23,223.2496,29.608,29.844,32.784,30 -18:27:23,223.2950,29.582,29.844,32.352,30 -18:27:23,223.3423,29.529,29.844,32.813,30 -18:27:23,223.3913,29.555,29.87,33.74,30 -18:27:23,223.4378,29.582,29.844,32.863,30 -18:27:23,223.4853,29.555,29.87,32.861,30 -18:27:23,223.5328,29.608,29.844,32.894,30 -18:27:23,223.5812,29.634,29.87,32.445,30 -18:27:23,223.6281,29.582,29.87,31.566,30 -18:27:23,223.6734,29.529,29.87,32.474,30 -18:27:23,223.7185,29.608,29.844,33.399,30 -18:27:23,223.7693,29.608,29.844,32.503,30 -18:27:23,223.8185,29.582,29.897,32.519,30 -18:27:23,223.8667,29.582,29.844,32.07,30 -18:27:23,223.9161,29.582,29.844,32.997,30 -18:27:23,223.9625,29.582,29.844,33.013,30 -18:27:23,224.0069,29.582,29.791,33.028,30 -18:27:23,224.0510,29.582,29.87,33.954,30 -18:27:23,224.0953,29.608,29.844,32.611,30 -18:27:24,224.1396,29.582,29.844,32.625,30 -18:27:24,224.1836,29.608,29.844,33.086,30 -18:27:24,224.2298,29.608,29.87,32.653,30 -18:27:24,224.2735,29.608,29.844,32.22,30 -18:27:24,224.3164,29.582,29.87,32.681,30 -18:27:24,224.3604,29.608,29.844,32.694,30 -18:27:24,224.4061,29.608,29.818,32.708,30 -18:27:24,224.4498,29.555,29.844,33.169,30 -18:27:24,224.4935,29.608,29.844,33.648,30 -18:27:24,224.5368,29.555,29.844,32.751,30 -18:27:24,224.5832,29.555,29.87,33.676,30 -18:27:24,224.6291,29.582,29.87,33.245,30 -18:27:24,224.6727,29.582,29.87,32.796,30 -18:27:24,224.7148,29.555,29.87,32.809,30 -18:27:24,224.7633,29.555,29.818,33.287,30 -18:27:24,224.8085,29.582,29.844,34.197,30 -18:27:24,224.8521,29.503,29.818,33.302,30 -18:27:24,224.8980,29.582,29.87,35.122,30 -18:27:24,224.9420,29.529,29.87,32.887,30 -18:27:24,224.9872,29.634,29.844,33.812,30 -18:27:24,225.0320,29.582,29.844,32.469,30 -18:27:24,225.0749,29.608,29.844,33.377,30 -18:27:25,225.1237,29.582,29.844,32.944,30 -18:27:25,225.1763,29.608,29.87,33.406,30 -18:27:25,225.2279,29.582,29.818,32.529,30 -18:27:25,225.2720,29.582,29.818,33.886,30 -18:27:25,225.3185,29.582,29.844,33.901,30 -18:27:25,225.3642,29.608,29.818,33.47,30 -18:27:25,225.4150,29.582,29.87,33.485,30 -18:27:25,225.4738,29.582,29.844,33.054,30 -18:27:25,225.5411,29.555,29.844,33.521,30 -18:27:25,225.6096,29.582,29.791,34.007,30 -18:27:25,225.6812,29.582,29.844,34.479,30 -18:27:25,225.7365,29.529,29.87,33.592,30 -18:27:25,225.7899,29.582,29.844,34.074,30 -18:27:25,225.8450,29.555,29.897,33.627,30 -18:27:25,225.9003,29.555,29.87,33.199,30 -18:27:25,225.9522,29.608,29.844,33.68,30 -18:27:25,226.0047,29.608,29.844,33.233,30 -18:27:25,226.0574,29.555,29.87,33.249,30 -18:27:26,226.1076,29.529,29.844,33.73,30 -18:27:26,226.1577,29.582,29.844,34.641,30 -18:27:26,226.2146,29.582,29.844,33.747,30 -18:27:26,226.2658,29.555,29.844,33.766,30 -18:27:26,226.3163,29.582,29.897,34.247,30 -18:27:26,226.3690,29.634,29.87,32.888,30 -18:27:26,226.4311,29.608,29.844,32.475,30 -18:27:26,226.4813,29.555,29.844,33.386,30 -18:27:26,226.5294,29.608,29.897,34.314,30 -18:27:26,226.5822,29.582,29.818,32.507,30 -18:27:26,226.6328,29.582,29.844,34.328,30 -18:27:26,226.6821,29.608,29.87,33.898,30 -18:27:26,226.7297,29.582,29.844,33.02,30 -18:27:26,226.7778,29.555,29.87,33.928,30 -18:27:26,226.8260,29.555,29.791,33.962,30 -18:27:26,226.8726,29.608,29.844,35.336,30 -18:27:26,226.9206,29.555,29.818,33.53,30 -18:27:26,226.9702,29.555,29.818,34.904,30 -18:27:26,227.0255,29.555,29.87,34.922,30 -18:27:26,227.0727,29.555,29.844,34.047,30 -18:27:27,227.1186,29.529,29.844,34.51,30 -18:27:27,227.1662,29.582,29.87,34.973,30 -18:27:27,227.2140,29.608,29.791,33.631,30 -18:27:27,227.2595,29.555,29.87,34.557,30 -18:27:27,227.3067,29.503,29.844,34.126,30 -18:27:27,227.3525,29.582,29.897,35.483,30 -18:27:27,227.4013,29.582,29.87,33.23,30 -18:27:27,227.4564,29.582,29.818,33.709,30 -18:27:27,227.5045,29.529,29.844,34.621,30 -18:27:27,227.5528,29.582,29.87,35.101,30 -18:27:27,227.6033,29.555,29.844,33.76,30 -18:27:27,227.6512,29.582,29.87,34.687,30 -18:27:27,227.7009,29.608,29.87,33.792,30 -18:27:27,227.7500,29.582,29.844,33.361,30 -18:27:27,227.7980,29.582,29.844,34.27,30 -18:27:27,227.8440,29.555,29.87,34.285,30 -18:27:27,227.8912,29.555,29.87,34.318,30 -18:27:27,227.9386,29.529,29.844,34.333,30 -18:27:27,227.9845,29.555,29.818,35.243,30 -18:27:27,228.0307,29.582,29.87,35.259,30 -18:27:27,228.0763,29.582,29.897,33.917,30 -18:27:28,228.1232,29.582,29.844,33.467,30 -18:27:28,228.1702,29.555,29.844,34.393,30 -18:27:28,228.2197,29.555,29.897,34.873,30 -18:27:28,228.2672,29.555,29.844,33.978,30 -18:27:28,228.3162,29.555,29.818,34.904,30 -18:27:28,228.3637,29.582,29.87,35.368,30 -18:27:28,228.4112,29.582,29.844,34.027,30 -18:27:28,228.4674,29.555,29.844,34.49,30 -18:27:28,228.5152,29.608,29.844,34.972,30 -18:27:28,228.5615,29.582,29.844,34.077,30 -18:27:28,228.6081,29.582,29.844,34.538,30 -18:27:28,228.6523,29.503,29.844,34.554,30 -18:27:28,228.6997,29.555,29.844,35.926,30 -18:27:28,228.7486,29.608,29.818,35.05,30 -18:27:28,228.7964,29.608,29.897,34.602,30 -18:27:28,228.8412,29.582,29.818,33.259,30 -18:27:28,228.8855,29.555,29.844,35.078,30 -18:27:28,228.9365,29.582,29.844,35.111,30 -18:27:28,228.9849,29.582,29.844,34.664,30 -18:27:28,229.0328,29.555,29.897,34.679,30 -18:27:28,229.0811,29.582,29.844,34.247,30 -18:27:29,229.1287,29.582,29.818,34.71,30 -18:27:29,229.1747,29.555,29.844,35.172,30 -18:27:29,229.2207,29.582,29.818,35.205,30 -18:27:29,229.2687,29.555,29.87,35.204,30 -18:27:29,229.3150,29.608,29.818,34.79,30 -18:27:29,229.3620,29.529,29.844,34.789,30 -18:27:29,229.4075,29.555,29.844,35.715,30 -18:27:29,229.4566,29.582,29.818,35.285,30 -18:27:29,229.5004,29.555,29.897,35.284,30 -18:27:29,229.5481,29.582,29.844,34.405,30 -18:27:29,229.5964,29.582,29.87,34.867,30 -18:27:29,229.6433,29.555,29.844,34.436,30 -18:27:29,229.6894,29.582,29.87,35.362,30 -18:27:29,229.7346,29.608,29.818,34.466,30 -18:27:29,229.7841,29.582,29.844,34.928,30 -18:27:29,229.8311,29.555,29.844,34.944,30 -18:27:29,229.8756,29.582,29.818,35.424,30 -18:27:29,229.9228,29.555,29.87,35.422,30 -18:27:29,229.9726,29.582,29.844,35.009,30 -18:27:29,230.0205,29.582,29.844,35.007,30 -18:27:29,230.0730,29.582,29.818,35.023,30 -18:27:30,230.1237,29.582,29.844,35.487,30 -18:27:30,230.1694,29.555,29.818,35.057,30 -18:27:30,230.2163,29.582,29.897,35.984,30 -18:27:30,230.2651,29.582,29.844,34.177,30 -18:27:30,230.3108,29.529,29.87,35.104,30 -18:27:30,230.3576,29.608,29.818,35.583,30 -18:27:30,230.4035,29.555,29.844,35.135,30 -18:27:30,230.4546,29.529,29.844,35.614,30 -18:27:30,230.5006,29.555,29.844,36.079,30 -18:27:30,230.5493,29.582,29.844,35.648,30 -18:27:30,230.5988,29.582,29.87,35.2,30 -18:27:30,230.6467,29.555,29.844,34.77,30 -18:27:30,230.6920,29.582,29.844,35.696,30 -18:27:30,230.7387,29.582,29.844,35.247,30 -18:27:30,230.7856,29.555,29.818,35.263,30 -18:27:30,230.8327,29.608,29.87,36.19,30 -18:27:30,230.8800,29.582,29.897,34.4,30 -18:27:30,230.9267,29.555,29.897,34.397,30 -18:27:30,230.9808,29.582,29.87,34.876,30 -18:27:30,231.0251,29.555,29.87,34.893,30 -18:27:30,231.0725,29.555,29.844,35.371,30 -18:27:31,231.1193,29.555,29.87,35.834,30 -18:27:31,231.1687,29.555,29.87,35.402,30 -18:27:31,231.2155,29.582,29.818,35.419,30 -18:27:31,231.2609,29.555,29.897,35.864,30 -18:27:31,231.3067,29.582,29.87,34.985,30 -18:27:31,231.3529,29.555,29.87,35.0,30 -18:27:31,231.4024,29.582,29.818,35.478,30 -18:27:31,231.4506,29.608,29.87,35.925,30 -18:27:31,231.4995,29.582,29.844,34.6,30 -18:27:31,231.5461,29.608,29.897,35.509,30 -18:27:31,231.5921,29.555,29.897,34.165,30 -18:27:31,231.6382,29.529,29.844,35.09,30 -18:27:31,231.6848,29.608,29.87,36.463,30 -18:27:31,231.7327,29.608,29.844,34.674,30 -18:27:31,231.7802,29.529,29.818,35.135,30 -18:27:31,231.8270,29.555,29.87,36.956,30 -18:27:31,231.8731,29.555,29.818,35.632,30 -18:27:31,231.9177,29.634,29.818,36.541,30 -18:27:31,231.9668,29.555,29.844,35.199,30 -18:27:31,232.0145,29.555,29.844,36.126,30 -18:27:31,232.0629,29.555,29.87,36.142,30 -18:27:32,232.1097,29.582,29.87,35.711,30 -18:27:32,232.1557,29.582,29.818,35.263,30 -18:27:32,232.2007,29.608,29.844,36.171,30 -18:27:32,232.2458,29.608,29.844,35.292,30 -18:27:32,232.2900,29.555,29.818,35.306,30 -18:27:32,232.3326,29.555,29.87,36.679,30 -18:27:32,232.3821,29.582,29.818,35.8,30 -18:27:32,232.4275,29.582,29.844,36.246,30 -18:27:32,232.4730,29.529,29.897,35.814,30 -18:27:32,232.5163,29.582,29.844,35.829,30 -18:27:32,232.5622,29.529,29.87,35.844,30 -18:27:32,232.6062,29.582,29.844,36.323,30 -18:27:32,232.6500,29.582,29.791,35.874,30 -18:27:32,232.6968,29.608,29.844,36.8,30 -18:27:32,232.7410,29.529,29.87,35.458,30 -18:27:32,232.7871,29.555,29.87,36.383,30 -18:27:32,232.8334,29.555,29.87,35.952,30 -18:27:32,232.8796,29.503,29.87,35.967,30 -18:27:32,232.9226,29.582,29.844,36.876,30 -18:27:32,232.9666,29.555,29.87,35.98,30 -18:27:32,233.0140,29.582,29.87,36.012,30 -18:27:32,233.0581,29.555,29.791,35.563,30 -18:27:33,233.1032,29.582,29.87,37.4,30 -18:27:33,233.1497,29.582,29.844,35.594,30 -18:27:33,233.1950,29.608,29.818,36.055,30 -18:27:33,233.2388,29.582,29.818,36.07,30 -18:27:33,233.2830,29.582,29.818,36.532,30 -18:27:33,233.3291,29.608,29.897,36.547,30 -18:27:33,233.3733,29.555,29.844,34.757,30 -18:27:33,233.4175,29.582,29.818,36.592,30 -18:27:33,233.4648,29.555,29.844,36.59,30 -18:27:33,233.5097,29.582,29.818,36.624,30 -18:27:33,233.5560,29.555,29.87,36.622,30 -18:27:33,233.6017,29.608,29.844,36.208,30 -18:27:33,233.6475,29.582,29.87,35.759,30 -18:27:33,233.6931,29.582,29.844,35.773,30 -18:27:33,233.7380,29.555,29.844,36.234,30 -18:27:33,233.7823,29.555,29.844,36.713,30 -18:27:33,233.8296,29.582,29.87,36.728,30 -18:27:33,233.8737,29.582,29.844,35.833,30 -18:27:33,233.9178,29.608,29.818,36.294,30 -18:27:33,233.9661,29.582,29.87,36.309,30 -18:27:33,234.0112,29.582,29.844,35.877,30 -18:27:33,234.0556,29.582,29.844,36.338,30 -18:27:34,234.0990,29.529,29.87,36.353,30 -18:27:34,234.1449,29.555,29.87,36.832,30 -18:27:34,234.1894,29.555,29.844,36.4,30 -18:27:34,234.2369,29.555,29.844,36.862,30 -18:27:34,234.2836,29.582,29.87,36.878,30 -18:27:34,234.3292,29.555,29.897,35.983,30 -18:27:34,234.3726,29.608,29.818,35.997,30 -18:27:34,234.4169,29.608,29.818,36.458,30 -18:27:34,234.4639,29.555,29.87,36.472,30 -18:27:34,234.5086,29.608,29.87,36.505,30 -18:27:34,234.5535,29.608,29.844,35.608,30 -18:27:34,234.6016,29.503,29.87,36.069,30 -18:27:34,234.6480,29.608,29.844,37.442,30 -18:27:34,234.6938,29.555,29.87,36.1,30 -18:27:34,234.7396,29.529,29.844,36.579,30 -18:27:34,234.7862,29.582,29.87,37.488,30 -18:27:34,234.8322,29.555,29.844,36.146,30 -18:27:34,234.8788,29.608,29.844,37.072,30 -18:27:34,234.9233,29.503,29.87,36.177,30 -18:27:34,234.9667,29.555,29.87,37.549,30 -18:27:34,235.0138,29.555,29.844,36.671,30 -18:27:34,235.0585,29.608,29.844,37.133,30 -18:27:35,235.1042,29.582,29.844,36.237,30 -18:27:35,235.1476,29.608,29.844,36.698,30 -18:27:35,235.1916,29.555,29.818,36.266,30 -18:27:35,235.2364,29.529,29.87,37.638,30 -18:27:35,235.2822,29.608,29.818,37.207,30 -18:27:35,235.3278,29.582,29.844,36.758,30 -18:27:35,235.3742,29.66,29.897,36.773,30 -18:27:35,235.4216,29.555,29.87,34.535,30 -18:27:35,235.4655,29.582,29.844,36.818,30 -18:27:35,235.5117,29.608,29.87,36.815,30 -18:27:35,235.5561,29.555,29.87,35.936,30 -18:27:35,235.6012,29.608,29.87,36.86,30 -18:27:35,235.6474,29.582,29.844,35.964,30 -18:27:35,235.6945,29.608,29.87,36.872,30 -18:27:35,235.7386,29.555,29.87,35.993,30 -18:27:35,235.7836,29.608,29.844,36.918,30 -18:27:35,235.8290,29.555,29.844,36.468,30 -18:27:35,235.8754,29.582,29.87,37.394,30 -18:27:35,235.9203,29.608,29.844,36.498,30 -18:27:35,235.9673,29.555,29.87,36.512,30 -18:27:35,236.0143,29.608,29.844,36.991,30 -18:27:35,236.0621,29.608,29.844,36.542,30 -18:27:36,236.1084,29.555,29.844,36.557,30 -18:27:36,236.1558,29.555,29.87,37.483,30 -18:27:36,236.1998,29.634,29.818,37.052,30 -18:27:36,236.2463,29.582,29.818,36.602,30 -18:27:36,236.2917,29.529,29.844,37.511,30 -18:27:36,236.3372,29.555,29.87,37.991,30 -18:27:36,236.3828,29.555,29.897,37.113,30 -18:27:36,236.4289,29.555,29.87,36.664,30 -18:27:36,236.4719,29.555,29.844,37.143,30 -18:27:36,236.5167,29.555,29.87,37.604,30 -18:27:36,236.5635,29.503,29.87,37.172,30 -18:27:36,236.6123,29.608,29.844,38.082,30 -18:27:36,236.6576,29.608,29.818,36.74,30 -18:27:36,236.7025,29.582,29.844,37.202,30 -18:27:36,236.7487,29.555,29.844,37.217,30 -18:27:36,236.7963,29.503,29.844,37.696,30 -18:27:36,236.8409,29.582,29.844,38.607,30 -18:27:36,236.8881,29.608,29.87,37.265,30 -18:27:36,236.9336,29.582,29.844,36.386,30 -18:27:36,236.9807,29.555,29.87,37.294,30 -18:27:36,237.0242,29.608,29.818,37.326,30 -18:27:36,237.0687,29.608,29.844,37.324,30 -18:27:37,237.1156,29.555,29.87,36.891,30 -18:27:37,237.1641,29.555,29.818,37.37,30 -18:27:37,237.2108,29.582,29.844,38.28,30 -18:27:37,237.2564,29.582,29.844,37.386,30 -18:27:37,237.2997,29.582,29.844,37.4,30 -18:27:37,237.3475,29.555,29.87,37.415,30 -18:27:37,237.3944,29.529,29.897,37.448,30 -18:27:37,237.4400,29.555,29.844,37.446,30 -18:27:37,237.4871,29.555,29.87,37.925,30 -18:27:37,237.5343,29.555,29.844,37.494,30 -18:27:37,237.5835,29.582,29.87,37.957,30 -18:27:37,237.6291,29.608,29.844,37.062,30 -18:27:37,237.6733,29.582,29.87,37.076,30 -18:27:37,237.7170,29.582,29.844,37.09,30 -18:27:37,237.7654,29.582,29.844,37.551,30 -18:27:37,237.8151,29.582,29.818,37.567,30 -18:27:37,237.8628,29.582,29.87,38.03,30 -18:27:37,237.9097,29.608,29.765,37.152,30 -18:27:37,237.9574,29.555,29.844,38.526,30 -18:27:37,238.0047,29.608,29.818,38.096,30 -18:27:37,238.0507,29.555,29.844,37.647,30 -18:27:38,238.0997,29.582,29.844,38.127,30 -18:27:38,238.1506,29.582,29.897,37.679,30 -18:27:38,238.2005,29.582,29.844,36.784,30 -18:27:38,238.2486,29.555,29.87,37.711,30 -18:27:38,238.2969,29.555,29.897,37.744,30 -18:27:38,238.3461,29.608,29.791,37.295,30 -18:27:38,238.3945,29.608,29.844,38.222,30 -18:27:38,238.4412,29.555,29.818,37.327,30 -18:27:38,238.4871,29.555,29.844,38.701,30 -18:27:38,238.5336,29.555,29.844,38.27,30 -18:27:38,238.5823,29.529,29.87,38.286,30 -18:27:38,238.6289,29.529,29.87,38.303,30 -18:27:38,238.6735,29.582,29.844,38.319,30 -18:27:38,238.7196,29.529,29.818,37.87,30 -18:27:38,238.7692,29.582,29.897,39.243,30 -18:27:38,238.8165,29.555,29.844,36.991,30 -18:27:38,238.8620,29.582,29.818,38.381,30 -18:27:38,238.9048,29.555,29.818,38.38,30 -18:27:38,238.9491,29.582,29.87,38.859,30 -18:27:38,238.9967,29.555,29.87,37.516,30 -18:27:38,239.0429,29.529,29.87,37.995,30 -18:27:38,239.0887,29.608,29.844,38.458,30 -18:27:39,239.1325,29.608,29.844,37.562,30 -18:27:39,239.1793,29.582,29.818,37.576,30 -18:27:39,239.2237,29.608,29.87,38.484,30 -18:27:39,239.2698,29.529,29.87,37.158,30 -18:27:39,239.3165,29.555,29.844,38.531,30 -18:27:39,239.3632,29.582,29.844,38.547,30 -18:27:39,239.4075,29.608,29.844,38.098,30 -18:27:39,239.4517,29.582,29.87,37.666,30 -18:27:39,239.4970,29.555,29.87,37.68,30 -18:27:39,239.5457,29.608,29.87,38.158,30 -18:27:39,239.5965,29.582,29.818,37.263,30 -18:27:39,239.6451,29.608,29.844,38.619,30 -18:27:39,239.6912,29.608,29.87,37.742,30 -18:27:39,239.7392,29.608,29.844,37.309,30 -18:27:39,239.7867,29.555,29.87,37.77,30 -18:27:39,239.8324,29.555,29.844,38.25,30 -18:27:39,239.8795,29.582,29.87,38.712,30 -18:27:39,239.9277,29.555,29.87,37.817,30 -18:27:39,239.9816,29.555,29.87,38.296,30 -18:27:39,240.0311,29.529,29.87,38.314,30 -18:27:39,240.0790,29.582,29.844,38.777,30 -18:27:40,240.1292,29.608,29.818,38.33,30 -18:27:40,240.1857,29.529,29.87,38.346,30 -18:27:40,240.2410,29.555,29.844,38.829,30 -18:27:40,240.2925,29.582,29.844,38.848,30 -18:27:40,240.3397,29.555,29.844,38.401,30 -18:27:40,240.3872,29.555,29.87,38.881,30 -18:27:40,240.4320,29.555,29.844,38.45,30 -18:27:40,240.4917,29.608,29.844,38.912,30 -18:27:40,240.5597,29.608,29.844,38.021,30 -18:27:40,240.6165,29.608,29.818,38.042,30 -18:27:40,240.6802,29.608,29.897,38.507,30 -18:27:40,240.7388,29.555,29.844,37.168,30 -18:27:40,240.7947,29.582,29.844,39.008,30 -18:27:40,240.8545,29.608,29.844,38.563,30 -18:27:40,240.9097,29.608,29.897,38.136,30 -18:27:40,240.9624,29.529,29.87,37.241,30 -18:27:40,241.0155,29.555,29.87,39.079,30 -18:27:40,241.0684,29.582,29.87,38.65,30 -18:27:41,241.1241,29.582,29.87,38.203,30 -18:27:41,241.1769,29.582,29.844,38.221,30 -18:27:41,241.2295,29.582,29.844,38.684,30 -18:27:41,241.2818,29.555,29.844,38.702,30 -18:27:41,241.3338,29.608,29.87,39.183,30 -18:27:41,241.3869,29.582,29.87,37.842,30 -18:27:41,241.4384,29.582,29.87,38.305,30 -18:27:41,241.4938,29.582,29.897,38.322,30 -18:27:41,241.5468,29.582,29.87,37.874,30 -18:27:41,241.6074,29.608,29.844,38.354,30 -18:27:41,241.6585,29.555,29.87,38.374,30 -18:27:41,241.7088,29.66,29.87,38.854,30 -18:27:41,241.7591,29.555,29.87,37.064,30 -18:27:41,241.8056,29.582,29.87,38.884,30 -18:27:41,241.8543,29.634,29.844,38.435,30 -18:27:41,241.9037,29.555,29.844,38.003,30 -18:27:41,241.9516,29.555,29.897,39.376,30 -18:27:41,241.9996,29.555,29.87,38.481,30 -18:27:41,242.0544,29.582,29.844,38.96,30 -18:27:42,242.1049,29.555,29.897,38.961,30 -18:27:42,242.1532,29.582,29.87,38.531,30 -18:27:42,242.1972,29.555,29.844,38.546,30 -18:27:42,242.2447,29.555,29.844,39.471,30 -18:27:42,242.2903,29.555,29.844,39.487,30 -18:27:42,242.3376,29.608,29.844,39.503,30 -18:27:42,242.3845,29.555,29.844,38.608,30 -18:27:42,242.4307,29.634,29.791,39.534,30 -18:27:42,242.4777,29.608,29.844,39.102,30 -18:27:42,242.5221,29.608,29.844,38.654,30 -18:27:42,242.5697,29.555,29.818,38.667,30 -18:27:42,242.6155,29.582,29.844,40.041,30 -18:27:42,242.6646,29.634,29.844,39.146,30 -18:27:42,242.7147,29.582,29.818,38.268,30 -18:27:42,242.7659,29.529,29.87,39.624,30 -18:27:42,242.8146,29.608,29.844,39.659,30 -18:27:42,242.8630,29.582,29.818,38.764,30 -18:27:42,242.9098,29.608,29.844,39.674,30 -18:27:42,242.9577,29.555,29.87,38.795,30 -18:27:42,243.0051,29.608,29.87,39.275,30 -18:27:42,243.0521,29.582,29.818,38.379,30 -18:27:43,243.1014,29.555,29.897,39.734,30 -18:27:43,243.1506,29.555,29.87,38.857,30 -18:27:43,243.1970,29.555,29.87,39.337,30 -18:27:43,243.2446,29.608,29.87,39.352,30 -18:27:43,243.2907,29.582,29.844,38.456,30 -18:27:43,243.3369,29.555,29.844,39.364,30 -18:27:43,243.3834,29.582,29.818,39.843,30 -18:27:43,243.4334,29.634,29.844,39.842,30 -18:27:43,243.4832,29.555,29.87,38.518,30 -18:27:43,243.5330,29.608,29.791,39.444,30 -18:27:43,243.5857,29.555,29.87,39.908,30 -18:27:43,243.6320,29.66,29.791,39.479,30 -18:27:43,243.6780,29.582,29.844,39.047,30 -18:27:43,243.7242,29.582,29.87,39.491,30 -18:27:43,243.7729,29.634,29.844,39.059,30 -18:27:43,243.8197,29.582,29.87,38.627,30 -18:27:43,243.8656,29.555,29.87,39.088,30 -18:27:43,243.9124,29.582,29.87,39.567,30 -18:27:43,243.9575,29.582,29.87,39.118,30 -18:27:43,244.0035,29.608,29.818,39.132,30 -18:27:43,244.0486,29.582,29.844,39.594,30 -18:27:43,244.0949,29.529,29.844,39.608,30 -18:27:44,244.1418,29.555,29.87,40.535,30 -18:27:44,244.1897,29.582,29.818,39.658,30 -18:27:44,244.2363,29.582,29.818,40.103,30 -18:27:44,244.2830,29.529,29.844,40.119,30 -18:27:44,244.3306,29.582,29.818,40.6,30 -18:27:44,244.3798,29.555,29.87,40.152,30 -18:27:44,244.4267,29.555,29.87,39.739,30 -18:27:44,244.4726,29.555,29.844,39.754,30 -18:27:44,244.5222,29.582,29.897,40.217,30 -18:27:44,244.5707,29.555,29.87,38.858,30 -18:27:44,244.6156,29.582,29.87,39.801,30 -18:27:44,244.6632,29.582,29.818,39.351,30 -18:27:44,244.7082,29.608,29.897,40.261,30 -18:27:44,244.7538,29.608,29.818,38.47,30 -18:27:44,244.8028,29.555,29.87,39.842,30 -18:27:44,244.8472,29.555,29.844,39.875,30 -18:27:44,244.8942,29.529,29.844,40.337,30 -18:27:44,244.9389,29.608,29.844,40.8,30 -18:27:44,244.9832,29.555,29.844,39.457,30 -18:27:44,245.0310,29.555,29.844,40.383,30 -18:27:44,245.0839,29.608,29.844,40.399,30 -18:27:45,245.1321,29.608,29.87,39.506,30 -18:27:45,245.1782,29.555,29.844,39.073,30 -18:27:45,245.2222,29.555,29.87,40.446,30 -18:27:45,245.2664,29.582,29.844,40.014,30 -18:27:45,245.3126,29.582,29.87,40.011,30 -18:27:45,245.3587,29.555,29.818,39.579,30 -18:27:45,245.4057,29.555,29.844,40.952,30 -18:27:45,245.4520,29.555,29.87,40.522,30 -18:27:45,245.5007,29.582,29.844,40.091,30 -18:27:45,245.5486,29.555,29.818,40.089,30 -18:27:45,245.5969,29.582,29.844,41.017,30 -18:27:45,245.6440,29.555,29.818,40.123,30 -18:27:45,245.6906,29.555,29.818,41.05,30 -18:27:45,245.7362,29.582,29.818,41.066,30 -18:27:45,245.7824,29.582,29.844,40.618,30 -18:27:45,245.8293,29.555,29.818,40.187,30 -18:27:45,245.8741,29.555,29.87,41.114,30 -18:27:45,245.9196,29.608,29.818,40.236,30 -18:27:45,245.9663,29.582,29.844,40.233,30 -18:27:45,246.0150,29.555,29.844,40.249,30 -18:27:45,246.0625,29.582,29.897,40.729,30 -18:27:46,246.1075,29.634,29.844,39.369,30 -18:27:46,246.1545,29.555,29.844,39.4,30 -18:27:46,246.2018,29.503,29.844,40.773,30 -18:27:46,246.2488,29.608,29.897,41.683,30 -18:27:46,246.2972,29.555,29.844,38.983,30 -18:27:46,246.3432,29.582,29.818,40.82,30 -18:27:46,246.3890,29.582,29.844,40.819,30 -18:27:46,246.4344,29.555,29.844,40.387,30 -18:27:46,246.4803,29.555,29.897,40.867,30 -18:27:46,246.5275,29.582,29.844,39.971,30 -18:27:46,246.5755,29.608,29.844,40.433,30 -18:27:46,246.6209,29.582,29.818,40.001,30 -18:27:46,246.6657,29.555,29.897,40.91,30 -18:27:46,246.7138,29.503,29.818,40.031,30 -18:27:46,246.7620,29.582,29.844,42.299,30 -18:27:46,246.8099,29.555,29.87,40.512,30 -18:27:46,246.8561,29.555,29.897,40.545,30 -18:27:46,246.9032,29.608,29.818,40.096,30 -18:27:46,246.9509,29.608,29.87,40.558,30 -18:27:46,246.9973,29.555,29.818,39.679,30 -18:27:46,247.0439,29.529,29.87,41.498,30 -18:27:46,247.0878,29.582,29.765,41.068,30 -18:27:47,247.1332,29.555,29.818,41.977,30 -18:27:47,247.1805,29.582,29.791,41.547,30 -18:27:47,247.2269,29.608,29.844,41.564,30 -18:27:47,247.2704,29.555,29.87,40.222,30 -18:27:47,247.3152,29.555,29.87,40.7,30 -18:27:47,247.3625,29.555,29.818,40.714,30 -18:27:47,247.4102,29.582,29.818,41.624,30 -18:27:47,247.4555,29.608,29.844,41.177,30 -18:27:47,247.5016,29.529,29.87,40.298,30 -18:27:47,247.5473,29.555,29.87,41.224,30 -18:27:47,247.5960,29.555,29.87,40.793,30 -18:27:47,247.6442,29.503,29.897,40.809,30 -18:27:47,247.6900,29.555,29.87,41.255,30 -18:27:47,247.7384,29.555,29.844,40.84,30 -18:27:47,247.7865,29.555,29.87,41.304,30 -18:27:47,247.8327,29.529,29.844,40.873,30 -18:27:47,247.8792,29.555,29.844,41.782,30 -18:27:47,247.9250,29.608,29.844,41.352,30 -18:27:47,247.9705,29.555,29.818,40.456,30 -18:27:47,248.0189,29.555,29.87,41.829,30 -18:27:47,248.0650,29.555,29.791,40.952,30 -18:27:48,248.1126,29.555,29.87,42.326,30 -18:27:48,248.1578,29.529,29.844,40.985,30 -18:27:48,248.2035,29.582,29.844,41.894,30 -18:27:48,248.2482,29.582,29.818,40.999,30 -18:27:48,248.2949,29.582,29.818,41.46,30 -18:27:48,248.3436,29.608,29.87,41.477,30 -18:27:48,248.3929,29.555,29.87,40.152,30 -18:27:48,248.4388,29.582,29.844,41.078,30 -18:27:48,248.4839,29.608,29.818,41.076,30 -18:27:48,248.5315,29.608,29.844,41.09,30 -18:27:48,248.5811,29.582,29.844,40.659,30 -18:27:48,248.6289,29.555,29.844,41.122,30 -18:27:48,248.6781,29.555,29.87,41.602,30 -18:27:48,248.7228,29.582,29.87,41.172,30 -18:27:48,248.7697,29.555,29.844,40.722,30 -18:27:48,248.8156,29.555,29.818,41.648,30 -18:27:48,248.8637,29.608,29.818,42.111,30 -18:27:48,248.9117,29.582,29.844,41.216,30 -18:27:48,248.9595,29.582,29.87,41.232,30 -18:27:48,249.0049,29.582,29.844,40.801,30 -18:27:48,249.0506,29.608,29.87,41.262,30 -18:27:48,249.0959,29.555,29.87,40.383,30 -18:27:49,249.1436,29.582,29.844,41.308,30 -18:27:49,249.1885,29.582,29.844,41.306,30 -18:27:49,249.2348,29.634,29.844,41.321,30 -18:27:49,249.2805,29.608,29.87,40.442,30 -18:27:49,249.3267,29.529,29.87,40.455,30 -18:27:49,249.3759,29.555,29.87,41.828,30 -18:27:49,249.4210,29.634,29.844,41.398,30 -18:27:49,249.4659,29.634,29.818,40.501,30 -18:27:49,249.5113,29.608,29.897,40.961,30 -18:27:49,249.5618,29.529,29.844,40.064,30 -18:27:49,249.6100,29.634,29.897,42.349,30 -18:27:49,249.6591,29.582,29.87,39.649,30 -18:27:49,249.7039,29.582,29.818,41.021,30 -18:27:49,249.7476,29.555,29.87,41.929,30 -18:27:49,249.7959,29.582,29.87,41.514,30 -18:27:49,249.8445,29.555,29.844,41.065,30 -18:27:49,249.8911,29.608,29.844,41.992,30 -18:27:49,249.9374,29.608,29.897,41.097,30 -18:27:49,249.9828,29.582,29.87,40.2,30 -18:27:49,250.0281,29.555,29.87,41.124,30 -18:27:49,250.0758,29.582,29.897,41.603,30 -18:27:50,250.1206,29.529,29.87,40.69,30 -18:27:50,250.1681,29.582,29.87,42.079,30 -18:27:50,250.2136,29.608,29.844,41.183,30 -18:27:50,250.2602,29.608,29.87,41.198,30 -18:27:50,250.3051,29.608,29.897,40.765,30 -18:27:50,250.3515,29.555,29.897,40.314,30 -18:27:50,250.3987,29.582,29.87,41.239,30 -18:27:50,250.4473,29.634,29.844,41.253,30 -18:27:50,250.4969,29.582,29.87,40.822,30 -18:27:50,250.5440,29.582,29.844,41.284,30 -18:27:50,250.5919,29.582,29.897,41.745,30 -18:27:50,250.6374,29.634,29.87,40.85,30 -18:27:50,250.6829,29.582,29.923,40.433,30 -18:27:50,250.7298,29.555,29.844,40.429,30 -18:27:50,250.7788,29.582,29.897,42.265,30 -18:27:50,250.8265,29.555,29.87,40.906,30 -18:27:50,250.8712,29.608,29.87,41.849,30 -18:27:50,250.9182,29.555,29.897,40.952,30 -18:27:50,250.9659,29.608,29.897,41.413,30 -18:27:50,251.0135,29.608,29.844,40.517,30 -18:27:50,251.0620,29.608,29.844,41.442,30 -18:27:51,251.1093,29.634,29.844,41.457,30 -18:27:51,251.1547,29.608,29.87,41.025,30 -18:27:51,251.2002,29.582,29.87,41.038,30 -18:27:51,251.2467,29.608,29.844,41.499,30 -18:27:51,251.2932,29.634,29.844,41.513,30 -18:27:51,251.3370,29.529,29.897,41.081,30 -18:27:51,251.3836,29.555,29.791,41.988,30 -18:27:51,251.4325,29.555,29.87,43.379,30 -18:27:51,251.4786,29.582,29.791,42.039,30 -18:27:51,251.5274,29.634,29.87,42.948,30 -18:27:51,251.5783,29.582,29.897,40.714,30 -18:27:51,251.6254,29.582,29.897,41.157,30 -18:27:51,251.6756,29.634,29.844,41.171,30 -18:27:51,251.7229,29.608,29.87,41.203,30 -18:27:51,251.7705,29.634,29.87,41.217,30 -18:27:51,251.8165,29.555,29.87,40.784,30 -18:27:51,251.8635,29.582,29.87,42.156,30 -18:27:51,251.9094,29.608,29.844,41.707,30 -18:27:51,251.9546,29.608,29.87,41.721,30 -18:27:51,251.9998,29.555,29.87,41.288,30 -18:27:51,252.0490,29.582,29.844,42.213,30 -18:27:51,252.0949,29.634,29.87,42.212,30 -18:27:52,252.1424,29.582,29.844,40.886,30 -18:27:52,252.1867,29.634,29.844,42.241,30 -18:27:52,252.2313,29.608,29.844,41.361,30 -18:27:52,252.2806,29.582,29.897,41.821,30 -18:27:52,252.3296,29.608,29.791,41.372,30 -18:27:52,252.3786,29.608,29.844,42.763,30 -18:27:52,252.4236,29.66,29.87,41.868,30 -18:27:52,252.4685,29.582,29.897,40.541,30 -18:27:52,252.5128,29.582,29.844,41.43,30 -18:27:52,252.5598,29.634,29.844,42.355,30 -18:27:52,252.6097,29.634,29.844,41.476,30 -18:27:52,252.6560,29.582,29.897,41.491,30 -18:27:52,252.7016,29.555,29.897,41.487,30 -18:27:52,252.7464,29.608,29.87,41.965,30 -18:27:52,252.7948,29.608,29.87,41.532,30 -18:27:52,252.8428,29.608,29.844,41.546,30 -18:27:52,252.8887,29.582,29.923,42.008,30 -18:27:52,252.9354,29.582,29.87,41.111,30 -18:27:52,252.9807,29.608,29.87,42.036,30 -18:27:52,253.0267,29.608,29.87,41.602,30 -18:27:52,253.0709,29.582,29.897,41.616,30 -18:27:53,253.1157,29.634,29.897,41.612,30 -18:27:53,253.1631,29.582,29.844,40.731,30 -18:27:53,253.2098,29.582,29.87,42.55,30 -18:27:53,253.2560,29.582,29.897,42.118,30 -18:27:53,253.3010,29.582,29.87,41.668,30 -18:27:53,253.3465,29.608,29.87,42.146,30 -18:27:53,253.3949,29.608,29.923,41.713,30 -18:27:53,253.4377,29.582,29.923,40.816,30 -18:27:53,253.4845,29.582,29.897,41.274,30 -18:27:53,253.5304,29.582,29.897,41.735,30 -18:27:53,253.5817,29.634,29.87,41.748,30 -18:27:53,253.6322,29.66,29.87,41.334,30 -18:27:53,253.6816,29.582,29.923,40.901,30 -18:27:53,253.7307,29.608,29.897,41.344,30 -18:27:53,253.7834,29.634,29.87,41.358,30 -18:27:53,253.8306,29.582,29.897,41.39,30 -18:27:53,253.8799,29.634,29.897,41.833,30 -18:27:53,253.9308,29.608,29.897,40.954,30 -18:27:53,253.9790,29.66,29.87,41.414,30 -18:27:53,254.0267,29.608,29.87,40.998,30 -18:27:53,254.0752,29.582,29.923,41.905,30 -18:27:54,254.1226,29.687,29.897,41.455,30 -18:27:54,254.1713,29.582,29.87,40.11,30 -18:27:54,254.2194,29.608,29.87,42.392,30 -18:27:54,254.2681,29.634,29.897,41.96,30 -18:27:54,254.3142,29.608,29.897,41.063,30 -18:27:54,254.3632,29.66,29.844,41.522,30 -18:27:54,254.4135,29.634,29.923,41.554,30 -18:27:54,254.4644,29.66,29.923,40.657,30 -18:27:54,254.5128,29.634,29.87,40.222,30 -18:27:54,254.5615,29.608,29.897,41.592,30 -18:27:54,254.6108,29.582,29.87,41.589,30 -18:27:54,254.6600,29.608,29.897,42.515,30 -18:27:54,254.7061,29.634,29.897,41.618,30 -18:27:54,254.7531,29.555,29.923,41.184,30 -18:27:54,254.8000,29.66,29.87,42.108,30 -18:27:54,254.8461,29.634,29.791,41.228,30 -18:27:54,254.8936,29.634,29.87,43.046,30 -18:27:54,254.9393,29.634,29.897,41.703,30 -18:27:54,254.9858,29.608,29.923,41.251,30 -18:27:54,255.0316,29.66,29.923,41.264,30 -18:27:54,255.0795,29.66,29.87,40.382,30 -18:27:55,255.1267,29.582,29.923,41.305,30 -18:27:55,255.1746,29.634,29.844,41.747,30 -18:27:55,255.2253,29.687,29.897,42.226,30 -18:27:55,255.2717,29.687,29.949,40.417,30 -18:27:55,255.3188,29.66,29.87,39.534,30 -18:27:55,255.3657,29.608,29.897,41.367,30 -18:27:55,255.4149,29.608,29.897,41.81,30 -18:27:55,255.4642,29.608,29.897,41.824,30 -18:27:55,255.5348,29.582,29.897,41.838,30 -18:27:55,255.6019,29.608,29.949,42.305,30 -18:27:55,255.6645,29.608,29.897,40.983,30 -18:27:55,255.7238,29.687,29.897,41.893,30 -18:27:55,255.7771,29.608,29.923,40.55,30 -18:27:55,255.8380,29.66,29.923,41.476,30 -18:27:55,255.8964,29.634,29.87,40.597,30 -18:27:55,255.9527,29.634,29.923,41.97,30 -18:27:55,256.0056,29.687,29.897,41.074,30 -18:27:55,256.0603,29.634,29.923,40.622,30 -18:27:56,256.1156,29.634,29.844,41.1,30 -18:27:56,256.1679,29.608,29.923,42.473,30 -18:27:56,256.2257,29.66,29.897,41.577,30 -18:27:56,256.2816,29.634,29.897,41.145,30 -18:27:56,256.3351,29.66,29.897,41.606,30 -18:27:56,256.3996,29.608,29.897,41.175,30 -18:27:56,256.4546,29.66,29.923,42.085,30 -18:27:56,256.5094,29.608,29.897,40.758,30 -18:27:56,256.5638,29.634,29.844,42.114,30 -18:27:56,256.6166,29.634,29.897,42.593,30 -18:27:56,256.6679,29.687,29.897,41.697,30 -18:27:56,256.7175,29.66,29.897,40.799,30 -18:27:56,256.7640,29.608,29.923,41.275,30 -18:27:56,256.8132,29.66,29.897,41.734,30 -18:27:56,256.8617,29.66,29.844,41.3,30 -18:27:56,256.9095,29.634,29.923,42.224,30 -18:27:56,256.9570,29.687,29.923,41.326,30 -18:27:56,257.0038,29.687,29.897,40.426,30 -18:27:56,257.0604,29.66,29.923,40.884,30 -18:27:57,257.1111,29.634,29.923,40.915,30 -18:27:57,257.1596,29.608,29.923,41.374,30 -18:27:57,257.2059,29.634,29.949,41.833,30 -18:27:57,257.2513,29.634,29.897,40.951,30 -18:27:57,257.2977,29.66,29.897,41.857,30 -18:27:57,257.3452,29.634,29.923,41.422,30 -18:27:57,257.3946,29.634,29.923,41.434,30 -18:27:57,257.4420,29.66,29.897,41.446,30 -18:27:57,257.4910,29.66,29.897,41.458,30 -18:27:57,257.5364,29.66,29.87,41.471,30 -18:27:57,257.5828,29.634,29.897,41.947,30 -18:27:57,257.6297,29.66,29.87,41.942,30 -18:27:57,257.6786,29.713,29.923,41.971,30 -18:27:57,257.7261,29.687,29.923,40.161,30 -18:27:57,257.7745,29.66,29.923,40.619,30 -18:27:57,257.8217,29.66,29.897,41.094,30 -18:27:57,257.8675,29.66,29.923,41.552,30 -18:27:57,257.9127,29.608,29.923,41.117,30 -18:27:57,257.9622,29.66,29.897,42.022,30 -18:27:57,258.0124,29.66,29.897,41.588,30 -18:27:57,258.0604,29.634,29.897,41.6,30 -18:27:58,258.1070,29.66,29.949,42.06,30 -18:27:58,258.1515,29.634,29.87,40.731,30 -18:27:58,258.1963,29.713,29.975,42.546,30 -18:27:58,258.2425,29.66,29.87,39.395,30 -18:27:58,258.2867,29.687,29.897,42.12,30 -18:27:58,258.3316,29.634,29.949,41.203,30 -18:27:58,258.3802,29.687,29.923,41.231,30 -18:27:58,258.4265,29.634,29.949,40.778,30 -18:27:58,258.4706,29.608,29.975,41.253,30 -18:27:58,258.5160,29.66,29.949,41.264,30 -18:27:58,258.5634,29.66,29.923,40.827,30 -18:27:58,258.6118,29.713,29.87,41.285,30 -18:27:58,258.6619,29.66,29.897,41.297,30 -18:27:58,258.7117,29.66,29.949,41.756,30 -18:27:58,258.7600,29.634,29.949,40.874,30 -18:27:58,258.8152,29.687,29.897,41.332,30 -18:27:58,258.8774,29.66,29.949,41.328,30 -18:27:58,258.9274,29.66,29.923,40.913,30 -18:27:58,258.9788,29.66,29.897,41.371,30 -18:27:58,259.0277,29.687,29.975,41.83,30 -18:27:58,259.0758,29.66,29.897,40.037,30 -18:27:59,259.1225,29.66,29.923,41.852,30 -18:27:59,259.1703,29.687,29.975,41.417,30 -18:27:59,259.2176,29.634,29.923,40.069,30 -18:27:59,259.2654,29.66,29.897,41.884,30 -18:27:59,259.3245,29.687,29.897,41.896,30 -18:27:59,259.3719,29.739,29.949,41.447,30 -18:27:59,259.4176,29.66,29.923,39.669,30 -18:27:59,259.4620,29.713,29.923,41.483,30 -18:27:59,259.5085,29.66,29.923,40.582,30 -18:27:59,259.5551,29.713,29.923,41.504,30 -18:27:59,259.6025,29.687,29.949,40.603,30 -18:27:59,259.6476,29.66,29.949,40.613,30 -18:27:59,259.6978,29.66,29.923,41.087,30 -18:27:59,259.7476,29.713,29.949,41.545,30 -18:27:59,259.8008,29.713,29.949,40.198,30 -18:27:59,259.8478,29.687,29.923,40.208,30 -18:27:59,259.9026,29.687,29.949,41.112,30 -18:27:59,259.9533,29.713,29.975,40.677,30 -18:27:59,260.0031,29.66,29.923,39.793,30 -18:27:59,260.0506,29.713,29.923,41.608,30 -18:28:00,260.1040,29.687,29.923,40.708,30 -18:28:00,260.1545,29.687,29.923,41.166,30 -18:28:00,260.2004,29.634,29.949,41.177,30 -18:28:00,260.2453,29.66,29.949,41.652,30 -18:28:00,260.2918,29.66,29.897,41.215,30 -18:28:00,260.3380,29.66,29.949,42.12,30 -18:28:00,260.3854,29.66,29.923,41.237,30 -18:28:00,260.4310,29.687,29.949,41.695,30 -18:28:00,260.4787,29.66,29.949,40.794,30 -18:28:00,260.5259,29.687,29.949,41.269,30 -18:28:00,260.5752,29.713,29.949,40.815,30 -18:28:00,260.6208,29.66,29.897,40.378,30 -18:28:00,260.6730,29.713,29.949,42.193,30 -18:28:00,260.7188,29.713,29.949,40.4,30 -18:28:00,260.7656,29.687,29.923,40.408,30 -18:28:00,260.8130,29.66,29.923,41.312,30 -18:28:00,260.8595,29.66,29.949,41.787,30 -18:28:00,260.9076,29.66,29.975,41.351,30 -18:28:00,260.9533,29.66,29.975,40.914,30 -18:28:00,260.9986,29.66,29.949,40.924,30 -18:28:00,261.0458,29.687,29.975,41.38,30 -18:28:00,261.0940,29.713,29.923,40.479,30 -18:28:01,261.1408,29.687,29.923,40.936,30 -18:28:01,261.1873,29.66,29.975,41.393,30 -18:28:01,261.2339,29.66,29.975,40.973,30 -18:28:01,261.2783,29.687,29.949,40.983,30 -18:28:01,261.3256,29.713,29.923,40.975,30 -18:28:01,261.3738,29.713,29.923,40.985,30 -18:28:01,261.4213,29.713,29.949,40.995,30 -18:28:01,261.4667,29.687,29.923,40.557,30 -18:28:01,261.5114,29.739,29.897,41.46,30 -18:28:01,261.5590,29.687,29.949,41.023,30 -18:28:01,261.6054,29.713,29.923,41.033,30 -18:28:01,261.6510,29.713,29.949,41.043,30 -18:28:01,261.7028,29.713,29.975,40.605,30 -18:28:01,261.7506,29.687,29.949,40.168,30 -18:28:01,261.8023,29.66,29.975,41.071,30 -18:28:01,261.8500,29.687,29.975,41.099,30 -18:28:01,261.8977,29.687,29.975,40.644,30 -18:28:01,261.9495,29.713,30.002,40.654,30 -18:28:01,262.0004,29.713,30.002,39.752,30 -18:28:01,262.0483,29.66,29.975,39.76,30 -18:28:02,262.0982,29.66,29.975,41.144,30 -18:28:02,262.1475,29.687,29.923,41.154,30 -18:28:02,262.1976,29.687,29.975,41.595,30 -18:28:02,262.2483,29.739,29.923,40.711,30 -18:28:02,262.3000,29.713,29.949,40.721,30 -18:28:02,262.3472,29.687,29.975,40.731,30 -18:28:02,262.3986,29.687,29.975,40.74,30 -18:28:02,262.4454,29.687,29.975,40.75,30 -18:28:02,262.4946,29.66,30.002,40.759,30 -18:28:02,262.5430,29.713,29.949,40.769,30 -18:28:02,262.5911,29.66,29.975,40.778,30 -18:28:02,262.6370,29.739,29.975,41.252,30 -18:28:02,262.6861,29.687,29.923,39.902,30 -18:28:02,262.7316,29.713,29.949,41.699,30 -18:28:02,262.7806,29.687,29.975,40.815,30 -18:28:02,262.8294,29.713,29.923,40.825,30 -18:28:02,262.8777,29.66,29.975,41.281,30 -18:28:02,262.9244,29.713,29.949,41.309,30 -18:28:02,262.9692,29.713,29.949,40.854,30 -18:28:02,263.0154,29.713,29.897,40.863,30 -18:28:02,263.0606,29.66,30.002,41.766,30 -18:28:03,263.1098,29.739,29.949,40.882,30 -18:28:03,263.1576,29.713,29.949,40.444,30 -18:28:03,263.2069,29.687,29.975,40.9,30 -18:28:03,263.2528,29.713,29.949,40.909,30 -18:28:03,263.3000,29.713,29.975,40.918,30 -18:28:03,263.3485,29.687,29.975,40.48,30 -18:28:03,263.3995,29.687,29.975,40.936,30 -18:28:03,263.4434,29.713,29.975,40.946,30 -18:28:03,263.4922,29.687,29.975,40.507,30 -18:28:03,263.5378,29.713,29.949,40.963,30 -18:28:03,263.5849,29.687,30.028,40.972,30 -18:28:03,263.6298,29.687,29.923,40.069,30 -18:28:03,263.6788,29.687,29.975,41.882,30 -18:28:03,263.7277,29.687,29.949,40.999,30 -18:28:03,263.7785,29.713,29.975,41.455,30 -18:28:03,263.8297,29.739,29.949,40.572,30 -18:28:03,263.8786,29.66,29.975,40.581,30 -18:28:03,263.9275,29.687,29.975,41.501,30 -18:28:03,263.9785,29.713,29.949,41.047,30 -18:28:03,264.0270,29.687,29.949,41.057,30 -18:28:03,264.0783,29.687,29.949,41.513,30 -18:28:04,264.1271,29.713,29.949,41.524,30 -18:28:04,264.1737,29.687,29.975,41.087,30 -18:28:04,264.2192,29.687,29.975,41.096,30 -18:28:04,264.2645,29.739,29.975,41.104,30 -18:28:04,264.3090,29.687,29.949,40.219,30 -18:28:04,264.3563,29.713,29.975,41.568,30 -18:28:04,264.4043,29.713,29.975,40.683,30 -18:28:04,264.4502,29.687,30.002,40.692,30 -18:28:04,264.4954,29.739,29.975,40.683,30 -18:28:04,264.5426,29.739,29.949,40.261,30 -18:28:04,264.5937,29.765,29.975,40.716,30 -18:28:04,264.6455,29.739,29.923,39.83,30 -18:28:04,264.6957,29.739,30.002,41.18,30 -18:28:04,264.7525,29.713,30.002,39.83,30 -18:28:04,264.8049,29.713,29.949,40.287,30 -18:28:04,264.8507,29.66,29.975,41.206,30 -18:28:04,264.8968,29.713,29.923,41.68,30 -18:28:04,264.9449,29.739,29.975,41.672,30 -18:28:04,264.9931,29.713,29.949,40.34,30 -18:28:04,265.0403,29.739,29.949,41.243,30 -18:28:04,265.0855,29.687,29.975,40.805,30 -18:28:05,265.1319,29.713,30.002,41.26,30 -18:28:05,265.1763,29.739,29.949,40.357,30 -18:28:05,265.2243,29.713,30.002,40.829,30 -18:28:05,265.2703,29.713,29.923,40.373,30 -18:28:05,265.3160,29.687,29.975,41.739,30 -18:28:05,265.3624,29.739,29.949,41.301,30 -18:28:05,265.4098,29.687,29.949,40.863,30 -18:28:05,265.4606,29.739,30.002,41.767,30 -18:28:05,265.5084,29.713,29.949,39.971,30 -18:28:05,265.5569,29.687,29.975,41.336,30 -18:28:05,265.6084,29.713,29.975,41.346,30 -18:28:05,265.6604,29.765,29.975,40.909,30 -18:28:05,265.7115,29.739,29.949,40.024,30 -18:28:05,265.7606,29.765,29.949,40.925,30 -18:28:05,265.8104,29.713,29.975,40.487,30 -18:28:05,265.8601,29.713,29.975,40.942,30 -18:28:05,265.9087,29.713,29.975,40.951,30 -18:28:05,265.9589,29.765,29.975,40.96,30 -18:28:05,266.0058,29.687,30.002,40.074,30 -18:28:05,266.0526,29.765,29.975,40.958,30 -18:28:06,266.0998,29.713,30.002,40.09,30 -18:28:06,266.1479,29.765,29.949,40.527,30 -18:28:06,266.1944,29.739,30.002,40.552,30 -18:28:06,266.2433,29.713,29.975,40.095,30 -18:28:06,266.2945,29.739,30.002,41.014,30 -18:28:06,266.3426,29.713,29.975,40.111,30 -18:28:06,266.3904,29.687,29.975,41.03,30 -18:28:06,266.4377,29.739,29.975,41.485,30 -18:28:06,266.4856,29.713,30.002,40.6,30 -18:28:06,266.5385,29.713,29.975,40.591,30 -18:28:06,266.5877,29.713,30.002,41.064,30 -18:28:06,266.6350,29.713,29.975,40.608,30 -18:28:06,266.6831,29.687,30.002,41.08,30 -18:28:06,266.7314,29.739,30.002,41.072,30 -18:28:06,266.7815,29.713,29.949,40.186,30 -18:28:06,266.8331,29.687,30.002,41.552,30 -18:28:06,266.8811,29.739,29.923,41.098,30 -18:28:06,266.9310,29.713,29.949,41.571,30 -18:28:06,266.9788,29.687,29.949,41.58,30 -18:28:06,267.0249,29.739,30.028,42.037,30 -18:28:06,267.0733,29.739,30.028,39.793,30 -18:28:07,267.1223,29.739,29.975,39.8,30 -18:28:07,267.1680,29.713,30.054,40.718,30 -18:28:07,267.2152,29.765,29.949,39.814,30 -18:28:07,267.2602,29.713,30.028,40.732,30 -18:28:07,267.3075,29.739,29.975,40.275,30 -18:28:07,267.3555,29.765,29.975,40.746,30 -18:28:07,267.4045,29.713,30.002,40.307,30 -18:28:07,267.4513,29.791,30.002,40.744,30 -18:28:07,267.4985,29.739,30.028,39.41,30 -18:28:07,267.5443,29.739,29.975,39.863,30 -18:28:07,267.5928,29.739,30.002,40.78,30 -18:28:07,267.6403,29.713,30.002,40.324,30 -18:28:07,267.6869,29.713,30.002,40.778,30 -18:28:07,267.7363,29.765,29.975,40.786,30 -18:28:07,267.7856,29.765,29.975,40.364,30 -18:28:07,267.8321,29.765,29.975,40.371,30 -18:28:07,267.8766,29.713,29.975,40.378,30 -18:28:07,267.9247,29.739,29.975,41.279,30 -18:28:07,267.9725,29.765,29.975,40.84,30 -18:28:07,268.0194,29.739,30.002,40.401,30 -18:28:07,268.0666,29.713,29.975,40.391,30 -18:28:08,268.1113,29.765,29.975,41.309,30 -18:28:08,268.1590,29.765,29.949,40.423,30 -18:28:08,268.2058,29.739,30.002,40.877,30 -18:28:08,268.2508,29.739,30.002,40.42,30 -18:28:08,268.2989,29.739,30.002,40.427,30 -18:28:08,268.3453,29.713,30.028,40.434,30 -18:28:08,268.3939,29.739,29.949,40.441,30 -18:28:08,268.4475,29.739,29.975,41.36,30 -18:28:08,268.4954,29.739,30.002,40.922,30 -18:28:08,268.5438,29.713,30.002,40.465,30 -18:28:08,268.5971,29.713,30.002,40.92,30 -18:28:08,268.6453,29.713,30.002,40.928,30 -18:28:08,268.6938,29.687,30.002,40.936,30 -18:28:08,268.7458,29.687,30.028,41.391,30 -18:28:08,268.7970,29.739,30.028,40.953,30 -18:28:08,268.8443,29.739,30.028,40.067,30 -18:28:08,268.8954,29.765,29.975,40.074,30 -18:28:08,268.9468,29.791,30.002,40.545,30 -18:28:08,268.9974,29.765,29.975,39.641,30 -18:28:08,269.0479,29.739,30.002,40.558,30 -18:28:08,269.0955,29.765,29.975,40.549,30 -18:28:09,269.1434,29.713,30.028,40.573,30 -18:28:09,269.1931,29.713,29.975,40.563,30 -18:28:09,269.2439,29.765,29.923,41.482,30 -18:28:09,269.2920,29.739,29.949,41.491,30 -18:28:09,269.3406,29.713,30.002,41.499,30 -18:28:09,269.3905,29.765,30.002,41.044,30 -18:28:09,269.4368,29.791,30.002,40.157,30 -18:28:09,269.4850,29.739,30.002,39.716,30 -18:28:09,269.5327,29.765,30.002,40.617,30 -18:28:09,269.5808,29.739,30.028,40.176,30 -18:28:09,269.6279,29.765,30.028,40.183,30 -18:28:09,269.6765,29.713,30.028,39.742,30 -18:28:09,269.7248,29.818,29.949,40.642,30 -18:28:09,269.7735,29.765,29.975,40.203,30 -18:28:09,269.8237,29.765,29.975,40.673,30 -18:28:09,269.8705,29.765,29.975,40.68,30 -18:28:09,269.9182,29.765,30.002,40.687,30 -18:28:09,269.9674,29.739,30.081,40.23,30 -18:28:09,270.0147,29.765,30.028,39.325,30 -18:28:09,270.0631,29.739,29.975,39.794,30 -18:28:10,270.1111,29.791,29.975,41.159,30 -18:28:10,270.1598,29.791,29.975,40.272,30 -18:28:10,270.2147,29.765,30.002,40.279,30 -18:28:10,270.2620,29.687,30.028,40.269,30 -18:28:10,270.3102,29.791,30.028,41.169,30 -18:28:10,270.3586,29.739,29.975,39.388,30 -18:28:10,270.4077,29.713,30.028,41.199,30 -18:28:10,270.4568,29.713,30.002,40.743,30 -18:28:10,270.5187,29.791,30.002,41.197,30 -18:28:10,270.6013,29.765,30.002,39.866,30 -18:28:10,270.6623,29.739,30.028,40.323,30 -18:28:10,270.7346,29.765,30.028,40.331,30 -18:28:10,270.7953,29.713,30.028,39.893,30 -18:28:10,270.8514,29.765,30.028,40.795,30 -18:28:10,270.9062,29.791,30.028,39.909,30 -18:28:10,270.9626,29.791,30.002,39.468,30 -18:28:10,271.0176,29.739,30.028,39.921,30 -18:28:10,271.0745,29.791,30.002,40.375,30 -18:28:11,271.1314,29.739,30.054,39.935,30 -18:28:11,271.1856,29.765,30.028,39.942,30 -18:28:11,271.2427,29.765,30.028,39.948,30 -18:28:11,271.2988,29.739,30.054,39.955,30 -18:28:11,271.3564,29.818,30.002,39.962,30 -18:28:11,271.4127,29.791,30.002,39.504,30 -18:28:11,271.4661,29.765,30.002,39.974,30 -18:28:11,271.5195,29.765,30.002,40.428,30 -18:28:11,271.5721,29.765,30.028,40.435,30 -18:28:11,271.6254,29.765,30.002,39.995,30 -18:28:11,271.6797,29.791,30.002,40.448,30 -18:28:11,271.7315,29.818,30.002,40.008,30 -18:28:11,271.7833,29.791,30.054,39.55,30 -18:28:11,271.8307,29.765,30.028,39.125,30 -18:28:11,271.8785,29.765,30.028,40.024,30 -18:28:11,271.9293,29.739,30.002,40.029,30 -18:28:11,271.9811,29.791,30.002,40.93,30 -18:28:11,272.0286,29.739,30.028,40.043,30 -18:28:11,272.0863,29.739,30.028,40.496,30 -18:28:12,272.1331,29.765,30.054,40.503,30 -18:28:12,272.1824,29.765,30.054,39.615,30 -18:28:12,272.2296,29.791,30.028,39.62,30 -18:28:12,272.2793,29.791,30.028,39.625,30 -18:28:12,272.3292,29.791,30.002,39.63,30 -18:28:12,272.3793,29.818,30.028,40.083,30 -18:28:12,272.4286,29.791,30.002,39.177,30 -18:28:12,272.4773,29.791,30.002,40.093,30 -18:28:12,272.5291,29.765,30.028,40.099,30 -18:28:12,272.5805,29.791,30.002,40.105,30 -18:28:12,272.6287,29.791,30.028,40.111,30 -18:28:12,272.6782,29.765,30.054,39.669,30 -18:28:12,272.7289,29.765,30.054,39.674,30 -18:28:12,272.7789,29.765,30.028,39.68,30 -18:28:12,272.8302,29.791,29.975,40.132,30 -18:28:12,272.8778,29.765,30.028,40.603,30 -18:28:12,272.9266,29.713,30.054,40.145,30 -18:28:12,272.9756,29.818,30.002,40.598,30 -18:28:12,273.0263,29.818,30.002,39.692,30 -18:28:12,273.0769,29.739,30.054,39.698,30 -18:28:13,273.1273,29.791,30.028,40.167,30 -18:28:13,273.1785,29.791,30.054,39.726,30 -18:28:13,273.2271,29.765,30.054,39.284,30 -18:28:13,273.2761,29.791,29.975,39.736,30 -18:28:13,273.3250,29.818,29.975,40.652,30 -18:28:13,273.3756,29.791,30.028,40.194,30 -18:28:13,273.4257,29.765,30.081,39.753,30 -18:28:13,273.4758,29.765,30.054,39.294,30 -18:28:13,273.5247,29.844,30.002,39.763,30 -18:28:13,273.5752,29.844,30.028,39.303,30 -18:28:13,273.6251,29.739,30.081,38.861,30 -18:28:13,273.6738,29.818,30.028,39.759,30 -18:28:13,273.7241,29.765,30.028,39.317,30 -18:28:13,273.7746,29.844,30.002,40.233,30 -18:28:13,273.8280,29.791,30.028,39.327,30 -18:28:13,273.8756,29.765,30.002,39.796,30 -18:28:13,273.9256,29.818,30.002,40.696,30 -18:28:13,273.9784,29.765,30.054,39.791,30 -18:28:13,274.0281,29.791,30.028,39.813,30 -18:28:13,274.0763,29.818,30.054,39.818,30 -18:28:14,274.1236,29.844,30.054,38.912,30 -18:28:14,274.1705,29.818,30.054,38.468,30 -18:28:14,274.2167,29.765,30.054,38.918,30 -18:28:14,274.2626,29.765,30.028,39.833,30 -18:28:14,274.3079,29.844,30.028,40.285,30 -18:28:14,274.3556,29.818,30.028,38.931,30 -18:28:14,274.4023,29.739,30.054,39.382,30 -18:28:14,274.4486,29.739,30.054,40.298,30 -18:28:14,274.4940,29.739,30.054,40.303,30 -18:28:14,274.5405,29.818,30.054,40.308,30 -18:28:14,274.5904,29.818,30.028,38.955,30 -18:28:14,274.6395,29.818,30.081,39.406,30 -18:28:14,274.6863,29.818,30.054,38.499,30 -18:28:14,274.7325,29.791,30.028,38.966,30 -18:28:14,274.7794,29.791,30.081,39.881,30 -18:28:14,274.8294,29.818,30.107,38.974,30 -18:28:14,274.8777,29.765,30.054,38.066,30 -18:28:14,274.9262,29.739,30.054,39.891,30 -18:28:14,274.9763,29.818,30.028,40.344,30 -18:28:14,275.0251,29.791,30.054,39.438,30 -18:28:14,275.0842,29.818,30.028,39.459,30 -18:28:15,275.1327,29.791,30.054,39.447,30 -18:28:15,275.1777,29.844,30.081,39.469,30 -18:28:15,275.2284,29.844,30.054,38.097,30 -18:28:15,275.2780,29.791,30.081,38.564,30 -18:28:15,275.3256,29.791,30.028,39.014,30 -18:28:15,275.3744,29.818,30.054,39.929,30 -18:28:15,275.4227,29.818,30.054,39.022,30 -18:28:15,275.4702,29.818,30.081,39.026,30 -18:28:15,275.5174,29.791,30.081,38.565,30 -18:28:15,275.5656,29.818,30.054,39.032,30 -18:28:15,275.6148,29.844,30.054,39.035,30 -18:28:15,275.6622,29.791,30.054,38.592,30 -18:28:15,275.7124,29.791,30.081,39.506,30 -18:28:15,275.7609,29.818,30.002,39.046,30 -18:28:15,275.8159,29.844,30.028,39.944,30 -18:28:15,275.8684,29.844,30.054,39.055,30 -18:28:15,275.9195,29.87,30.028,38.612,30 -18:28:15,275.9695,29.818,30.054,38.615,30 -18:28:15,276.0220,29.791,30.107,39.065,30 -18:28:15,276.0704,29.818,30.054,38.621,30 -18:28:16,276.1154,29.791,30.081,39.071,30 -18:28:16,276.1631,29.844,30.028,39.075,30 -18:28:16,276.2107,29.818,30.054,39.078,30 -18:28:16,276.2587,29.791,30.028,39.082,30 -18:28:16,276.3058,29.791,30.054,39.997,30 -18:28:16,276.3508,29.844,30.054,39.555,30 -18:28:16,276.3979,29.791,30.054,38.647,30 -18:28:16,276.4439,29.844,30.081,39.561,30 -18:28:16,276.4927,29.818,30.054,38.19,30 -18:28:16,276.5403,29.765,30.054,39.103,30 -18:28:16,276.5876,29.818,30.081,40.018,30 -18:28:16,276.6338,29.818,30.054,38.647,30 -18:28:16,276.6795,29.844,30.028,39.114,30 -18:28:16,276.7256,29.844,30.081,39.118,30 -18:28:16,276.7740,29.818,30.028,38.209,30 -18:28:16,276.8243,29.791,30.081,39.57,30 -18:28:16,276.8716,29.739,30.054,39.127,30 -18:28:16,276.9166,29.844,30.028,40.49,30 -18:28:16,276.9641,29.791,30.081,39.136,30 -18:28:16,277.0126,29.765,30.081,39.14,30 -18:28:16,277.0622,29.818,30.054,39.591,30 -18:28:17,277.1092,29.844,30.081,39.148,30 -18:28:17,277.1576,29.791,30.054,38.24,30 -18:28:17,277.2047,29.844,30.054,39.618,30 -18:28:17,277.2562,29.739,30.107,38.71,30 -18:28:17,277.3030,29.844,30.028,39.608,30 -18:28:17,277.3510,29.818,30.054,39.165,30 -18:28:17,277.4006,29.791,30.054,39.168,30 -18:28:17,277.4478,29.818,30.054,39.636,30 -18:28:17,277.4940,29.844,30.028,39.176,30 -18:28:17,277.5411,29.844,30.054,39.179,30 -18:28:17,277.5899,29.791,30.054,38.736,30 -18:28:17,277.6375,29.844,30.054,39.65,30 -18:28:17,277.6835,29.818,30.054,38.743,30 -18:28:17,277.7322,29.765,30.081,39.193,30 -18:28:17,277.7818,29.818,30.081,39.643,30 -18:28:17,277.8297,29.791,30.054,38.736,30 -18:28:17,277.8757,29.844,30.054,39.668,30 -18:28:17,277.9258,29.818,30.107,38.76,30 -18:28:17,277.9735,29.818,30.081,38.299,30 -18:28:17,278.0193,29.791,30.054,38.748,30 -18:28:17,278.0659,29.791,30.107,39.679,30 -18:28:18,278.1124,29.791,30.081,38.772,30 -18:28:18,278.1572,29.87,30.054,39.222,30 -18:28:18,278.2040,29.818,30.054,38.331,30 -18:28:18,278.2505,29.87,30.054,39.227,30 -18:28:18,278.2987,29.818,30.081,38.336,30 -18:28:18,278.3448,29.818,30.054,38.768,30 -18:28:18,278.3942,29.765,30.081,39.235,30 -18:28:18,278.4439,29.818,30.054,39.686,30 -18:28:18,278.4941,29.844,30.054,39.243,30 -18:28:18,278.5437,29.791,30.054,38.8,30 -18:28:18,278.5940,29.791,30.054,39.714,30 -18:28:18,278.6425,29.818,30.081,39.719,30 -18:28:18,278.6913,29.87,30.054,38.794,30 -18:28:18,278.7392,29.818,30.054,38.367,30 -18:28:18,278.7895,29.818,30.054,39.263,30 -18:28:18,278.8416,29.818,30.081,39.267,30 -18:28:18,278.8915,29.818,30.081,38.807,30 -18:28:18,278.9397,29.818,30.081,38.809,30 -18:28:18,278.9875,29.818,30.054,38.812,30 -18:28:18,279.0335,29.844,30.054,39.279,30 -18:28:18,279.0801,29.844,30.081,38.836,30 -18:28:19,279.1263,29.791,30.081,38.374,30 -18:28:19,279.1749,29.818,30.081,39.287,30 -18:28:19,279.2254,29.844,30.028,38.827,30 -18:28:19,279.2724,29.844,30.081,39.294,30 -18:28:19,279.3211,29.818,30.081,38.386,30 -18:28:19,279.3666,29.844,30.107,38.835,30 -18:28:19,279.4147,29.844,30.107,37.943,30 -18:28:19,279.4611,29.818,30.054,37.945,30 -18:28:19,279.5101,29.844,30.081,39.305,30 -18:28:19,279.5575,29.791,30.107,38.397,30 -18:28:19,279.6064,29.818,30.081,38.863,30 -18:28:19,279.6530,29.87,30.028,38.849,30 -18:28:19,279.6995,29.791,30.081,38.869,30 -18:28:19,279.7464,29.87,30.054,39.318,30 -18:28:19,279.7948,29.818,30.054,38.428,30 -18:28:19,279.8423,29.818,30.054,39.324,30 -18:28:19,279.8910,29.87,30.054,39.328,30 -18:28:19,279.9403,29.791,30.107,38.437,30 -18:28:19,279.9886,29.844,30.081,38.886,30 -18:28:19,280.0378,29.87,30.054,38.424,30 -18:28:19,280.0878,29.818,30.107,38.444,30 -18:28:20,280.1344,29.844,29.975,38.429,30 -18:28:20,280.1805,29.844,30.028,40.254,30 -18:28:20,280.2275,29.818,30.054,39.347,30 -18:28:20,280.2743,29.844,30.081,39.351,30 -18:28:20,280.3226,29.818,30.081,38.442,30 -18:28:20,280.3710,29.844,30.054,38.892,30 -18:28:20,280.4213,29.844,30.028,38.912,30 -18:28:20,280.4697,29.844,30.133,39.362,30 -18:28:20,280.5169,29.818,30.081,37.559,30 -18:28:20,280.5627,29.844,30.081,38.901,30 -18:28:20,280.6107,29.818,30.081,38.457,30 -18:28:20,280.6606,29.818,30.081,38.906,30 -18:28:20,280.7114,29.818,30.081,38.909,30 -18:28:20,280.7600,29.818,30.107,38.912,30 -18:28:20,280.8121,29.818,30.107,38.468,30 -18:28:20,280.8584,29.844,30.081,38.47,30 -18:28:20,280.9069,29.87,30.081,38.472,30 -18:28:20,280.9561,29.844,30.081,38.027,30 -18:28:20,281.0054,29.844,30.028,38.475,30 -18:28:20,281.0534,29.844,30.054,39.389,30 -18:28:21,281.0996,29.844,30.081,38.945,30 -18:28:21,281.1470,29.87,30.028,38.484,30 -18:28:21,281.1958,29.844,30.081,38.95,30 -18:28:21,281.2446,29.87,30.054,38.489,30 -18:28:21,281.2957,29.818,30.054,38.508,30 -18:28:21,281.3442,29.765,30.107,39.405,30 -18:28:21,281.3950,29.844,30.081,39.408,30 -18:28:21,281.4419,29.844,30.107,38.5,30 -18:28:21,281.4909,29.844,30.107,38.055,30 -18:28:21,281.5412,29.818,30.054,38.056,30 -18:28:21,281.5935,29.87,30.081,39.417,30 -18:28:21,281.6455,29.818,30.081,38.061,30 -18:28:21,281.6942,29.844,30.107,38.957,30 -18:28:21,281.7433,29.844,30.107,38.066,30 -18:28:21,281.7935,29.844,30.028,38.067,30 -18:28:21,281.8435,29.87,30.133,39.427,30 -18:28:21,281.8954,29.87,30.081,37.178,30 -18:28:21,281.9452,29.844,30.054,38.072,30 -18:28:21,281.9934,29.818,30.107,38.985,30 -18:28:21,282.0423,29.844,30.054,38.524,30 -18:28:21,282.0918,29.844,30.081,38.99,30 -18:28:22,282.1423,29.844,30.081,38.529,30 -18:28:22,282.1928,29.844,30.081,38.531,30 -18:28:22,282.2443,29.87,30.054,38.533,30 -18:28:22,282.2939,29.818,30.081,38.552,30 -18:28:22,282.3435,29.897,30.081,38.985,30 -18:28:22,282.3960,29.818,30.054,37.629,30 -18:28:22,282.4466,29.87,30.028,39.453,30 -18:28:22,282.4963,29.844,30.054,39.009,30 -18:28:22,282.5447,29.87,30.054,39.012,30 -18:28:22,282.5952,29.818,30.133,38.568,30 -18:28:22,282.6436,29.844,30.081,38.105,30 -18:28:22,282.6966,29.844,30.107,38.554,30 -18:28:22,282.7462,29.844,30.081,38.109,30 -18:28:22,282.7955,29.818,30.133,38.558,30 -18:28:22,282.8490,29.87,30.081,38.112,30 -18:28:22,282.8969,29.897,30.081,38.114,30 -18:28:22,282.9435,29.87,30.054,37.651,30 -18:28:22,282.9919,29.844,30.081,38.58,30 -18:28:22,283.0398,29.844,30.081,38.565,30 -18:28:22,283.0890,29.897,30.081,38.567,30 -18:28:23,283.1363,29.87,30.081,37.658,30 -18:28:23,283.1848,29.818,30.107,38.123,30 -18:28:23,283.2307,29.844,30.107,38.571,30 -18:28:23,283.2763,29.87,30.054,38.126,30 -18:28:23,283.3235,29.844,30.081,38.592,30 -18:28:23,283.3731,29.765,30.028,38.576,30 -18:28:23,283.4238,29.844,30.081,40.849,30 -18:28:23,283.4729,29.844,30.081,38.584,30 -18:28:23,283.5226,29.818,30.107,38.587,30 -18:28:23,283.5709,29.87,30.054,38.589,30 -18:28:23,283.6195,29.844,30.107,38.608,30 -18:28:23,283.6667,29.844,30.081,38.146,30 -18:28:23,283.7160,29.87,30.054,38.594,30 -18:28:23,283.7668,29.818,30.107,38.614,30 -18:28:23,283.8196,29.844,30.107,38.599,30 -18:28:23,283.8704,29.818,30.054,38.154,30 -18:28:23,283.9220,29.844,30.081,39.514,30 -18:28:23,283.9738,29.818,30.081,38.606,30 -18:28:23,284.0246,29.818,30.107,39.055,30 -18:28:23,284.0744,29.818,30.081,38.611,30 -18:28:24,284.1250,29.844,30.081,39.061,30 -18:28:24,284.1808,29.844,30.028,38.616,30 -18:28:24,284.2288,29.818,30.054,39.53,30 -18:28:24,284.2756,29.818,30.081,39.534,30 -18:28:24,284.3274,29.87,30.054,39.073,30 -18:28:24,284.3757,29.87,30.054,38.646,30 -18:28:24,284.4267,29.87,30.081,38.648,30 -18:28:24,284.4765,29.818,30.081,38.186,30 -18:28:24,284.5271,29.844,30.081,39.082,30 -18:28:24,284.5807,29.818,30.107,38.637,30 -18:28:24,284.6290,29.818,30.081,38.64,30 -18:28:24,284.6778,29.844,30.054,39.089,30 -18:28:24,284.7266,29.844,30.081,39.109,30 -18:28:24,284.7781,29.844,30.081,38.647,30 -18:28:24,284.8320,29.844,30.107,38.65,30 -18:28:24,284.8831,29.818,30.054,38.205,30 -18:28:24,284.9346,29.87,30.081,39.565,30 -18:28:24,284.9841,29.818,30.081,38.21,30 -18:28:24,285.0336,29.818,30.028,39.106,30 -18:28:24,285.0835,29.844,30.107,40.02,30 -18:28:25,285.1382,29.844,30.054,38.218,30 -18:28:25,285.2115,29.844,30.081,39.132,30 -18:28:25,285.2656,29.844,30.081,38.671,30 -18:28:25,285.3146,29.844,30.054,38.673,30 -18:28:25,285.3647,29.818,30.054,39.14,30 -18:28:25,285.4160,29.818,30.081,39.59,30 -18:28:25,285.4665,29.844,30.081,39.129,30 -18:28:25,285.5410,29.87,30.081,38.685,30 -18:28:25,285.6023,29.897,30.054,38.241,30 -18:28:25,285.6610,29.818,30.107,38.242,30 -18:28:25,285.7155,29.818,30.107,38.691,30 -18:28:25,285.7742,29.818,30.081,38.694,30 -18:28:25,285.8348,29.87,30.107,39.144,30 -18:28:25,285.8998,29.844,30.081,37.805,30 -18:28:25,285.9558,29.818,30.081,38.701,30 -18:28:25,286.0125,29.87,30.081,39.151,30 -18:28:25,286.0729,29.818,30.081,38.259,30 -18:28:26,286.1366,29.844,30.107,39.156,30 -18:28:26,286.1955,29.844,30.054,38.264,30 -18:28:26,286.2519,29.897,30.081,39.178,30 -18:28:26,286.3087,29.818,30.107,37.805,30 -18:28:26,286.3703,29.844,30.081,38.718,30 -18:28:26,286.4306,29.87,30.081,38.72,30 -18:28:26,286.4853,29.87,30.081,38.275,30 -18:28:26,286.5434,29.818,30.081,38.277,30 -18:28:26,286.6048,29.818,30.107,39.173,30 -18:28:26,286.6587,29.844,30.054,38.729,30 -18:28:26,286.7120,29.844,30.054,39.196,30 -18:28:26,286.7690,29.844,30.081,39.199,30 -18:28:26,286.8196,29.844,30.133,38.738,30 -18:28:26,286.8685,29.87,30.133,37.846,30 -18:28:26,286.9205,29.818,30.133,37.399,30 -18:28:26,286.9725,29.818,30.107,38.294,30 -18:28:26,287.0230,29.818,30.081,38.742,30 -18:28:26,287.0823,29.818,30.081,39.192,30 -18:28:27,287.1310,29.791,30.081,39.195,30 -18:28:27,287.1797,29.818,30.081,39.662,30 -18:28:27,287.2341,29.818,30.081,39.202,30 -18:28:27,287.2953,29.818,30.081,39.205,30 -18:28:27,287.3498,29.818,30.054,39.208,30 -18:28:27,287.4005,29.818,30.081,39.676,30 -18:28:27,287.4502,29.791,30.081,39.215,30 -18:28:27,287.4990,29.765,30.081,39.682,30 -18:28:27,287.5475,29.844,30.081,40.133,30 -18:28:27,287.5976,29.818,30.081,38.779,30 -18:28:27,287.6481,29.844,30.081,39.228,30 -18:28:27,287.6991,29.818,30.107,38.784,30 -18:28:27,287.7561,29.844,30.081,38.786,30 -18:28:27,287.8108,29.844,30.081,38.788,30 -18:28:27,287.8646,29.791,30.081,38.791,30 -18:28:27,287.9183,29.818,30.081,39.705,30 -18:28:27,287.9781,29.87,30.081,39.244,30 -18:28:27,288.0352,29.791,30.081,38.353,30 -18:28:27,288.0855,29.844,30.054,39.714,30 -18:28:28,288.1337,29.791,30.107,39.27,30 -18:28:28,288.1831,29.791,30.081,39.273,30 -18:28:28,288.2331,29.844,30.054,39.723,30 -18:28:28,288.2836,29.844,30.054,39.279,30 -18:28:28,288.3318,29.791,30.081,39.282,30 -18:28:28,288.3814,29.818,30.081,39.732,30 -18:28:28,288.4307,29.844,30.081,39.271,30 -18:28:28,288.4805,29.818,30.081,38.827,30 -18:28:28,288.5311,29.844,30.081,39.276,30 -18:28:28,288.5838,29.87,30.054,38.832,30 -18:28:28,288.6328,29.791,30.054,38.852,30 -18:28:28,288.6823,29.818,30.028,40.213,30 -18:28:28,288.7320,29.844,30.054,40.2,30 -18:28:28,288.7788,29.791,30.054,39.31,30 -18:28:28,288.8275,29.791,30.054,40.224,30 -18:28:28,288.8792,29.791,30.081,40.228,30 -18:28:28,288.9287,29.791,30.054,39.768,30 -18:28:28,288.9776,29.844,30.054,40.236,30 -18:28:28,289.0276,29.818,30.028,39.329,30 -18:28:28,289.0797,29.844,30.107,40.227,30 -18:28:29,289.1316,29.844,30.107,38.425,30 -18:28:29,289.1826,29.844,30.107,38.426,30 -18:28:29,289.2333,29.818,30.107,38.428,30 -18:28:29,289.2835,29.844,30.054,38.876,30 -18:28:29,289.3329,29.818,30.081,39.343,30 -18:28:29,289.3854,29.791,30.081,39.329,30 -18:28:29,289.4346,29.844,30.081,39.796,30 -18:28:29,289.4850,29.818,30.054,38.888,30 -18:28:29,289.5334,29.818,30.107,39.802,30 -18:28:29,289.5819,29.844,30.081,38.894,30 -18:28:29,289.6282,29.844,30.054,38.896,30 -18:28:29,289.6738,29.844,30.081,39.362,30 -18:28:29,289.7230,29.87,30.054,38.901,30 -18:28:29,289.7717,29.818,30.081,38.92,30 -18:28:29,289.8238,29.791,30.081,39.352,30 -18:28:29,289.8752,29.818,30.081,39.82,30 -18:28:29,289.9254,29.791,30.054,39.359,30 -18:28:29,289.9747,29.818,30.081,40.291,30 -18:28:29,290.0244,29.844,30.081,39.366,30 -18:28:29,290.0782,29.818,30.081,38.922,30 -18:28:30,290.1302,29.818,30.054,39.371,30 -18:28:30,290.1815,29.844,30.054,39.839,30 -18:28:30,290.2321,29.844,30.081,39.395,30 -18:28:30,290.2803,29.818,30.054,38.934,30 -18:28:30,290.3306,29.818,30.081,39.847,30 -18:28:30,290.3814,29.844,30.081,39.387,30 -18:28:30,290.4308,29.791,30.081,38.942,30 -18:28:30,290.4798,29.818,30.054,39.856,30 -18:28:30,290.5284,29.844,30.107,39.86,30 -18:28:30,290.5781,29.791,30.054,38.504,30 -18:28:30,290.6296,29.791,30.107,40.329,30 -18:28:30,290.6801,29.791,30.081,39.422,30 -18:28:30,290.7310,29.844,30.081,39.872,30 -18:28:30,290.7813,29.818,30.054,38.964,30 -18:28:30,290.8337,29.844,30.054,39.878,30 -18:28:30,290.8855,29.844,30.081,39.435,30 -18:28:30,290.9374,29.818,30.107,38.973,30 -18:28:30,290.9905,29.818,30.054,38.975,30 -18:28:30,291.0415,29.818,30.081,39.889,30 -18:28:30,291.0932,29.818,30.081,39.429,30 -18:28:31,291.1425,29.791,30.107,39.432,30 -18:28:31,291.1913,29.844,30.081,39.452,30 -18:28:31,291.2427,29.818,30.028,38.99,30 -18:28:31,291.2934,29.87,30.081,40.351,30 -18:28:31,291.3435,29.818,30.133,38.55,30 -18:28:31,291.3945,29.844,30.081,38.551,30 -18:28:31,291.4454,29.844,30.081,39.0,30 -18:28:31,291.4984,29.844,30.107,39.002,30 -18:28:31,291.5472,29.844,30.081,38.557,30 -18:28:31,291.5957,29.818,30.081,39.005,30 -18:28:31,291.6439,29.87,30.054,39.455,30 -18:28:31,291.6916,29.87,30.054,39.027,30 -18:28:31,291.7406,29.844,30.133,39.03,30 -18:28:31,291.7892,29.818,30.081,38.12,30 -18:28:31,291.8451,29.818,30.081,39.462,30 -18:28:31,291.8982,29.844,30.081,39.466,30 -18:28:31,291.9494,29.844,30.081,39.021,30 -18:28:31,291.9984,29.844,30.081,39.024,30 -18:28:31,292.0485,29.818,30.081,39.026,30 -18:28:32,292.1000,29.87,30.081,39.475,30 -18:28:32,292.1489,29.791,30.028,38.583,30 -18:28:32,292.1995,29.765,30.133,40.855,30 -18:28:32,292.2498,29.844,30.081,39.502,30 -18:28:32,292.2994,29.844,30.081,39.04,30 -18:28:32,292.3496,29.818,30.081,39.042,30 -18:28:32,292.4023,29.844,30.081,39.492,30 -18:28:32,292.4526,29.844,30.081,39.047,30 -18:28:32,292.5040,29.844,30.107,39.05,30 -18:28:32,292.5551,29.844,30.081,38.605,30 -18:28:32,292.6127,29.844,30.081,39.053,30 -18:28:32,292.6619,29.844,30.081,39.056,30 -18:28:32,292.7119,29.844,30.054,39.058,30 -18:28:32,292.7624,29.818,30.081,39.524,30 -18:28:32,292.8131,29.818,30.107,39.51,30 -18:28:32,292.8647,29.844,30.054,39.066,30 -18:28:32,292.9164,29.844,30.054,39.532,30 -18:28:32,292.9679,29.844,30.107,39.536,30 -18:28:32,293.0199,29.87,30.081,38.627,30 -18:28:32,293.0685,29.87,30.107,38.628,30 -18:28:33,293.1157,29.844,30.081,38.182,30 -18:28:33,293.1627,29.844,30.107,39.077,30 -18:28:33,293.2104,29.818,30.107,38.632,30 -18:28:33,293.2568,29.844,30.107,39.081,30 -18:28:33,293.3057,29.87,30.081,38.636,30 -18:28:33,293.3564,29.87,30.107,38.637,30 -18:28:33,293.4077,29.844,30.081,38.191,30 -18:28:33,293.4575,29.844,30.107,39.086,30 -18:28:33,293.5077,29.87,30.107,38.641,30 -18:28:33,293.5568,29.844,30.081,38.195,30 -18:28:33,293.6075,29.818,30.133,39.09,30 -18:28:33,293.6578,29.844,30.107,38.645,30 -18:28:33,293.7069,29.87,30.081,38.647,30 -18:28:33,293.7566,29.87,30.107,38.648,30 -18:28:33,293.8066,29.818,30.107,38.202,30 -18:28:33,293.8581,29.87,30.107,39.097,30 -18:28:33,293.9101,29.844,30.107,38.205,30 -18:28:33,293.9623,29.87,30.081,38.653,30 -18:28:33,294.0102,29.87,30.081,38.655,30 -18:28:33,294.0573,29.87,30.107,38.656,30 -18:28:34,294.1060,29.87,30.107,38.21,30 -18:28:34,294.1544,29.897,30.133,38.211,30 -18:28:34,294.2041,29.844,30.107,37.3,30 -18:28:34,294.2543,29.87,30.081,38.658,30 -18:28:34,294.3036,29.87,30.133,38.659,30 -18:28:34,294.3536,29.818,30.107,37.766,30 -18:28:34,294.4039,29.844,30.081,39.108,30 -18:28:34,294.4527,29.87,30.16,39.11,30 -18:28:34,294.5020,29.844,30.133,37.306,30 -18:28:34,294.5502,29.87,30.081,38.217,30 -18:28:34,294.5991,29.897,30.107,38.664,30 -18:28:34,294.6486,29.87,30.107,37.754,30 -18:28:34,294.6978,29.844,30.054,38.219,30 -18:28:34,294.7467,29.87,30.028,39.578,30 -18:28:34,294.7939,29.818,30.107,39.581,30 -18:28:34,294.8431,29.897,30.107,39.119,30 -18:28:34,294.8896,29.87,30.081,37.762,30 -18:28:34,294.9429,29.791,30.133,38.674,30 -18:28:34,294.9919,29.818,30.081,39.14,30 -18:28:34,295.0404,29.844,30.081,39.572,30 -18:28:34,295.0913,29.87,30.107,39.128,30 -18:28:35,295.1420,29.87,30.081,38.235,30 -18:28:35,295.1929,29.844,30.107,38.683,30 -18:28:35,295.2400,29.897,30.107,38.685,30 -18:28:35,295.2899,29.844,30.107,37.774,30 -18:28:35,295.3379,29.844,30.133,38.686,30 -18:28:35,295.3895,29.844,30.107,38.24,30 -18:28:35,295.4397,29.791,30.107,38.688,30 -18:28:35,295.4898,29.844,30.107,39.601,30 -18:28:35,295.5392,29.818,30.133,38.692,30 -18:28:35,295.5910,29.87,30.133,38.694,30 -18:28:35,295.6412,29.897,30.133,37.801,30 -18:28:35,295.6959,29.897,30.081,37.336,30 -18:28:35,295.7463,29.87,30.107,38.23,30 -18:28:35,295.7968,29.87,30.107,38.248,30 -18:28:35,295.8487,29.818,30.107,38.248,30 -18:28:35,295.9004,29.87,30.133,39.144,30 -18:28:35,295.9502,29.87,30.107,37.804,30 -18:28:35,295.9992,29.923,30.081,38.251,30 -18:28:35,296.0472,29.844,30.107,37.787,30 -18:28:35,296.0950,29.897,30.107,38.699,30 -18:28:36,296.1418,29.897,30.107,37.789,30 -18:28:36,296.1916,29.844,30.133,37.788,30 -18:28:36,296.2403,29.897,30.133,38.253,30 -18:28:36,296.2914,29.87,30.133,37.342,30 -18:28:36,296.3414,29.897,30.107,37.805,30 -18:28:36,296.3930,29.87,30.107,37.788,30 -18:28:36,296.4396,29.87,30.107,38.252,30 -18:28:36,296.4897,29.897,30.133,38.253,30 -18:28:36,296.5390,29.87,30.107,37.342,30 -18:28:36,296.5898,29.897,30.133,38.253,30 -18:28:36,296.6411,29.897,30.107,37.342,30 -18:28:36,296.6892,29.844,30.133,37.788,30 -18:28:36,296.7401,29.897,30.107,38.252,30 -18:28:36,296.7883,29.897,30.133,37.789,30 -18:28:36,296.8393,29.923,30.133,37.341,30 -18:28:36,296.8887,29.818,30.081,36.893,30 -18:28:36,296.9419,29.897,30.133,39.592,30 -18:28:36,296.9912,29.897,30.107,37.342,30 -18:28:36,297.0442,29.897,30.107,37.788,30 -18:28:36,297.0939,29.897,30.107,37.788,30 -18:28:37,297.1410,29.897,30.133,37.788,30 -18:28:37,297.1901,29.87,30.133,37.34,30 -18:28:37,297.2393,29.87,30.107,37.804,30 -18:28:37,297.2904,29.897,30.133,38.251,30 -18:28:37,297.3392,29.87,30.133,37.34,30 -18:28:37,297.3900,29.87,30.133,37.804,30 -18:28:37,297.4393,29.87,30.16,37.804,30 -18:28:37,297.4888,29.923,30.107,37.339,30 -18:28:37,297.5389,29.897,30.081,37.338,30 -18:28:37,297.5911,29.923,30.107,38.232,30 -18:28:37,297.6413,29.897,30.107,37.338,30 -18:28:37,297.6936,29.87,30.133,37.784,30 -18:28:37,297.7448,29.897,30.107,37.801,30 -18:28:37,297.7960,29.87,30.107,37.784,30 -18:28:37,297.8473,29.897,30.16,38.249,30 -18:28:37,297.8987,29.87,30.107,36.873,30 -18:28:37,297.9522,29.897,30.133,38.248,30 -18:28:37,298.0074,29.87,30.133,37.336,30 -18:28:37,298.0576,29.87,30.16,37.8,30 -18:28:38,298.1071,29.923,30.107,37.336,30 -18:28:38,298.1578,29.87,30.133,37.335,30 -18:28:38,298.2077,29.897,30.133,37.798,30 -18:28:38,298.2578,29.844,30.107,37.334,30 -18:28:38,298.3073,29.87,30.133,38.692,30 -18:28:38,298.3567,29.87,30.133,37.799,30 -18:28:38,298.4074,29.87,30.133,37.799,30 -18:28:38,298.4551,29.897,30.107,37.799,30 -18:28:38,298.5066,29.87,30.16,37.781,30 -18:28:38,298.5555,29.923,30.133,37.334,30 -18:28:38,298.6057,29.87,30.16,36.886,30 -18:28:38,298.6548,29.897,30.133,37.331,30 -18:28:38,298.7058,29.897,30.107,37.331,30 -18:28:38,298.7562,29.87,30.16,37.777,30 -18:28:38,298.8050,29.87,30.107,37.33,30 -18:28:38,298.8575,29.87,30.133,38.24,30 -18:28:38,298.9083,29.897,30.16,37.794,30 -18:28:38,298.9637,29.923,30.133,36.865,30 -18:28:38,299.0147,29.87,30.133,36.88,30 -18:28:38,299.0656,29.923,30.133,37.79,30 -18:28:39,299.1170,29.923,30.133,36.879,30 -18:28:39,299.1688,29.844,30.16,36.877,30 -18:28:39,299.2201,29.897,30.16,37.77,30 -18:28:39,299.2706,29.87,30.133,36.858,30 -18:28:39,299.3205,29.923,30.133,37.785,30 -18:28:39,299.3708,29.923,30.16,36.873,30 -18:28:39,299.4238,29.923,30.133,36.407,30 -18:28:39,299.4735,29.923,30.133,36.869,30 -18:28:39,299.5227,29.897,30.133,36.868,30 -18:28:39,299.5722,29.897,30.133,37.313,30 -18:28:39,299.6215,29.897,30.133,37.313,30 -18:28:39,299.6718,29.923,30.133,37.312,30 -18:28:39,299.7233,29.897,30.133,36.864,30 -18:28:39,299.7731,29.87,30.133,37.309,30 -18:28:39,299.8235,29.87,30.133,37.773,30 -18:28:39,299.8748,29.87,30.133,37.773,30 -18:28:39,299.9246,29.87,30.133,37.773,30 -18:28:39,299.9801,29.897,30.133,37.773,30 -18:28:39,300.0350,29.897,30.133,37.308,30 -18:28:39,300.0884,29.897,30.16,37.307,30 -18:28:40,300.1434,29.897,30.133,36.842,30 -18:28:40,300.1952,29.897,30.133,37.304,30 -18:28:40,300.2555,29.897,30.133,37.303,30 -18:28:40,300.3083,29.897,30.133,37.302,30 -18:28:40,300.3582,29.897,30.133,37.302,30 -18:28:40,300.4086,29.897,30.133,37.301,30 -18:28:40,300.4572,29.897,30.133,37.3,30 -18:28:40,300.5115,29.87,30.133,37.299,30 -18:28:40,300.5774,29.897,30.16,37.763,30 -18:28:40,300.6520,29.844,30.16,36.833,30 -18:28:40,300.7187,29.923,30.186,37.743,30 -18:28:40,300.7813,29.87,30.107,35.936,30 -18:28:40,300.8426,29.897,30.16,38.203,30 -18:28:40,300.9035,29.923,30.16,36.827,30 -18:28:40,300.9678,29.897,30.133,36.378,30 -18:28:40,301.0254,29.897,30.16,37.287,30 -18:28:40,301.0856,29.923,30.16,36.822,30 -18:28:41,301.1443,29.87,30.186,36.372,30 -18:28:41,301.2025,29.897,30.16,36.834,30 -18:28:41,301.2613,29.897,30.107,36.815,30 -18:28:41,301.3191,29.897,30.16,37.725,30 -18:28:41,301.3819,29.897,30.107,36.813,30 -18:28:41,301.4406,29.923,30.107,37.723,30 -18:28:41,301.4973,29.87,30.133,37.275,30 -18:28:41,301.5527,29.897,30.16,37.739,30 -18:28:41,301.6143,29.87,30.133,36.81,30 -18:28:41,301.6669,29.923,30.16,37.737,30 -18:28:41,301.7198,29.923,30.16,36.361,30 -18:28:41,301.7714,29.897,30.133,36.358,30 -18:28:41,301.8245,29.975,30.133,37.268,30 -18:28:41,301.8848,29.897,30.16,35.925,30 -18:28:41,301.9396,29.897,30.16,36.799,30 -18:28:41,301.9925,29.897,30.16,36.797,30 -18:28:41,302.0522,29.897,30.16,36.795,30 -18:28:42,302.1064,29.949,30.107,36.793,30 -18:28:42,302.1587,29.897,30.133,36.809,30 -18:28:42,302.2090,29.923,30.16,37.254,30 -18:28:42,302.2582,29.923,30.133,36.342,30 -18:28:42,302.3098,29.923,30.133,36.804,30 -18:28:42,302.3618,29.897,30.133,36.802,30 -18:28:42,302.4143,29.87,30.16,37.248,30 -18:28:42,302.4654,29.87,30.186,37.247,30 -18:28:42,302.5170,29.897,30.16,36.799,30 -18:28:42,302.5709,29.897,30.186,36.78,30 -18:28:42,302.6251,29.923,30.16,36.331,30 -18:28:42,302.6803,29.87,30.186,36.328,30 -18:28:42,302.7319,29.897,30.133,36.79,30 -18:28:42,302.7815,29.897,30.133,37.236,30 -18:28:42,302.8321,29.87,30.133,37.235,30 -18:28:42,302.8808,29.897,30.133,37.698,30 -18:28:42,302.9331,29.897,30.16,37.234,30 -18:28:42,302.9881,29.923,30.133,36.768,30 -18:28:42,303.0404,29.949,30.133,36.784,30 -18:28:42,303.0900,29.897,30.16,36.335,30 -18:28:43,303.1425,29.923,30.133,36.763,30 -18:28:43,303.1918,29.87,30.186,36.778,30 -18:28:43,303.2420,29.923,30.16,36.777,30 -18:28:43,303.2983,29.923,30.186,36.31,30 -18:28:43,303.3499,29.897,30.16,35.861,30 -18:28:43,303.4004,29.897,30.16,36.752,30 -18:28:43,303.4534,29.923,30.16,36.75,30 -18:28:43,303.5067,29.949,30.133,36.301,30 -18:28:43,303.5610,29.923,30.16,36.316,30 -18:28:43,303.6130,29.923,30.16,36.296,30 -18:28:43,303.6640,29.923,30.133,36.294,30 -18:28:43,303.7149,29.897,30.16,36.756,30 -18:28:43,303.7640,29.923,30.16,36.737,30 -18:28:43,303.8136,29.923,30.16,36.288,30 -18:28:43,303.8668,29.949,30.133,36.286,30 -18:28:43,303.9166,29.949,30.16,36.3,30 -18:28:43,303.9691,29.949,30.186,35.834,30 -18:28:43,304.0243,29.923,30.16,35.383,30 -18:28:43,304.0752,29.897,30.16,36.273,30 -18:28:44,304.1262,29.949,30.16,36.718,30 -18:28:44,304.1758,29.923,30.16,35.822,30 -18:28:44,304.2302,29.87,30.16,36.266,30 -18:28:44,304.2802,29.923,30.16,37.175,30 -18:28:44,304.3302,29.975,30.16,36.263,30 -18:28:44,304.3807,29.923,30.212,35.366,30 -18:28:44,304.4309,29.975,30.186,35.362,30 -18:28:44,304.4828,29.949,30.133,34.911,30 -18:28:44,304.5363,29.923,30.186,36.265,30 -18:28:44,304.5885,29.923,30.16,35.798,30 -18:28:44,304.6416,29.923,30.16,36.242,30 -18:28:44,304.6933,29.897,30.186,36.24,30 -18:28:44,304.7451,29.923,30.16,36.237,30 -18:28:44,304.7976,29.923,30.16,36.235,30 -18:28:44,304.8518,29.923,30.16,36.232,30 -18:28:44,304.9066,29.923,30.133,36.23,30 -18:28:44,304.9590,29.897,30.186,36.692,30 -18:28:44,305.0114,29.897,30.186,36.226,30 -18:28:44,305.0627,29.949,30.16,36.223,30 -18:28:45,305.1175,29.949,30.16,35.773,30 -18:28:45,305.1720,29.923,30.16,35.77,30 -18:28:45,305.2257,29.949,30.16,36.214,30 -18:28:45,305.2762,29.923,30.186,35.764,30 -18:28:45,305.3257,29.949,30.16,35.761,30 -18:28:45,305.3788,29.923,30.16,35.758,30 -18:28:45,305.4297,29.923,30.16,36.202,30 -18:28:45,305.4801,29.897,30.186,36.2,30 -18:28:45,305.5301,29.949,30.186,36.197,30 -18:28:45,305.6289,29.923,30.16,35.3,30 -18:28:45,305.6818,29.923,30.107,36.189,30 -18:28:45,305.7347,29.923,30.186,37.098,30 -18:28:45,305.7885,29.949,30.16,35.738,30 -18:28:45,305.8427,29.897,30.16,35.735,30 -18:28:45,305.8945,29.923,30.186,36.626,30 -18:28:45,305.9467,29.949,30.16,35.73,30 -18:28:45,305.9993,29.923,30.16,35.726,30 -18:28:45,306.0497,29.923,30.133,36.17,30 -18:28:46,306.1023,29.923,30.107,36.632,30 -18:28:46,306.1534,29.923,30.16,37.078,30 -18:28:46,306.2047,29.923,30.186,36.165,30 -18:28:46,306.2564,29.949,30.16,35.716,30 -18:28:46,306.3080,29.923,30.16,35.712,30 -18:28:46,306.3593,29.923,30.16,36.156,30 -18:28:46,306.4106,29.897,30.186,36.154,30 -18:28:46,306.4604,29.923,30.16,36.152,30 -18:28:46,306.5126,29.923,30.16,36.149,30 -18:28:46,306.5630,29.923,30.16,36.147,30 -18:28:46,306.6143,29.923,30.16,36.144,30 -18:28:46,306.6678,29.897,30.16,36.142,30 -18:28:46,306.7208,29.949,30.186,36.587,30 -18:28:46,306.7727,29.923,30.186,35.243,30 -18:28:46,306.8255,29.923,30.16,35.686,30 -18:28:46,306.8769,29.949,30.16,36.13,30 -18:28:46,306.9282,29.949,30.186,35.681,30 -18:28:46,306.9797,29.923,30.186,35.23,30 -18:28:46,307.0299,29.949,30.107,35.674,30 -18:28:46,307.0813,29.897,30.212,36.582,30 -18:28:47,307.1302,29.923,30.186,35.669,30 -18:28:47,307.1803,29.897,30.186,35.666,30 -18:28:47,307.2313,29.949,30.186,36.11,30 -18:28:47,307.2816,29.949,30.16,35.213,30 -18:28:47,307.3307,29.949,30.133,35.656,30 -18:28:47,307.3798,29.949,30.186,36.118,30 -18:28:47,307.4296,29.923,30.186,35.204,30 -18:28:47,307.4758,29.923,30.186,35.647,30 -18:28:47,307.5247,29.897,30.186,35.644,30 -18:28:47,307.5743,29.923,30.16,36.088,30 -18:28:47,307.6220,29.923,30.186,36.086,30 -18:28:47,307.6710,29.949,30.16,35.637,30 -18:28:47,307.7213,29.897,30.186,35.634,30 -18:28:47,307.7767,29.923,30.186,36.078,30 -18:28:47,307.8275,29.923,30.16,35.628,30 -18:28:47,307.8782,29.923,30.16,36.072,30 -18:28:47,307.9289,29.949,30.186,36.069,30 -18:28:47,307.9780,29.975,30.133,35.172,30 -18:28:47,308.0296,29.923,30.186,35.633,30 -18:28:47,308.0782,29.923,30.186,35.613,30 -18:28:48,308.1256,29.949,30.212,35.61,30 -18:28:48,308.1747,29.897,30.16,34.712,30 -18:28:48,308.2224,29.949,30.16,36.497,30 -18:28:48,308.2709,29.949,30.186,35.601,30 -18:28:48,308.3195,29.949,30.16,35.151,30 -18:28:48,308.3696,29.949,30.16,35.594,30 -18:28:48,308.4206,29.923,30.16,35.591,30 -18:28:48,308.4705,29.975,30.16,36.035,30 -18:28:48,308.5207,29.975,30.16,35.138,30 -18:28:48,308.5713,29.923,30.212,35.134,30 -18:28:48,308.6216,29.975,30.133,35.13,30 -18:28:48,308.6711,29.923,30.186,35.591,30 -18:28:48,308.7225,29.949,30.16,35.571,30 -18:28:48,308.7743,29.923,30.16,35.568,30 -18:28:48,308.8242,29.949,30.186,36.012,30 -18:28:48,308.8735,29.949,30.133,35.115,30 -18:28:48,308.9206,29.923,30.186,36.023,30 -18:28:48,308.9709,29.949,30.16,35.556,30 -18:28:48,309.0245,29.949,30.16,35.553,30 -18:28:48,309.0731,29.975,30.16,35.549,30 -18:28:49,309.1219,29.923,30.186,35.099,30 -18:28:49,309.1728,29.923,30.186,35.543,30 -18:28:49,309.2228,29.923,30.186,35.54,30 -18:28:49,309.2743,29.923,30.16,35.536,30 -18:28:49,309.3221,29.949,30.16,35.98,30 -18:28:49,309.3744,29.923,30.186,35.531,30 -18:28:49,309.4237,29.949,30.186,35.528,30 -18:28:49,309.4707,29.975,30.186,35.077,30 -18:28:49,309.5216,29.949,30.186,34.627,30 -18:28:49,309.5731,29.923,30.16,35.069,30 -18:28:49,309.6215,29.923,30.186,35.96,30 -18:28:49,309.6727,29.897,30.186,35.51,30 -18:28:49,309.7234,29.949,30.16,35.954,30 -18:28:49,309.7699,29.897,30.16,35.505,30 -18:28:49,309.8196,29.844,30.186,36.396,30 -18:28:49,309.8756,29.923,30.186,36.859,30 -18:28:49,309.9245,29.923,30.186,35.499,30 -18:28:49,309.9764,29.949,30.16,35.496,30 -18:28:49,310.0289,29.949,30.16,35.493,30 -18:28:49,310.0817,29.949,30.186,35.489,30 -18:28:50,310.1321,29.923,30.186,35.039,30 -18:28:50,310.1848,29.923,30.16,35.482,30 -18:28:50,310.2365,29.975,30.186,35.926,30 -18:28:50,310.2887,29.923,30.186,34.582,30 -18:28:50,310.3389,29.949,30.16,35.472,30 -18:28:50,310.3904,29.923,30.133,35.468,30 -18:28:50,310.4398,29.897,30.16,36.377,30 -18:28:50,310.4913,29.923,30.186,36.358,30 -18:28:50,310.5426,29.87,30.186,35.462,30 -18:28:50,310.5944,29.949,30.186,36.37,30 -18:28:50,310.6442,29.949,30.133,35.01,30 -18:28:50,310.6951,29.949,30.16,35.918,30 -18:28:50,310.7483,29.923,30.186,35.451,30 -18:28:50,310.8026,29.923,30.186,35.447,30 -18:28:50,310.8558,29.949,30.186,35.444,30 -18:28:50,310.9055,29.949,30.186,34.994,30 -18:28:50,310.9588,29.923,30.186,34.99,30 -18:28:50,311.0076,29.923,30.186,35.433,30 -18:28:50,311.0582,29.923,30.16,35.43,30 -18:28:51,311.1090,29.923,30.133,35.874,30 -18:28:51,311.1599,29.923,30.16,36.336,30 -18:28:51,311.2092,29.949,30.16,35.87,30 -18:28:51,311.2580,29.923,30.186,35.42,30 -18:28:51,311.3063,29.923,30.16,35.417,30 -18:28:51,311.3555,29.949,30.186,35.862,30 -18:28:51,311.4076,29.949,30.186,34.965,30 -18:28:51,311.4573,29.949,30.186,34.961,30 -18:28:51,311.5091,29.923,30.16,34.957,30 -18:28:51,311.5594,29.897,30.186,35.847,30 -18:28:51,311.6090,29.897,30.212,35.845,30 -18:28:51,311.6609,29.897,30.186,35.395,30 -18:28:51,311.7121,29.923,30.16,35.839,30 -18:28:51,311.7626,29.923,30.16,35.837,30 -18:28:51,311.8125,29.923,30.133,35.835,30 -18:28:51,311.8642,29.949,30.186,36.297,30 -18:28:51,311.9149,29.897,30.186,34.936,30 -18:28:51,311.9656,29.949,30.16,35.827,30 -18:28:51,312.0176,29.897,30.186,35.377,30 -18:28:51,312.0704,29.975,30.186,35.821,30 -18:28:52,312.1226,29.87,30.16,34.477,30 -18:28:52,312.1726,29.949,30.16,36.725,30 -18:28:52,312.2216,29.949,30.16,35.366,30 -18:28:52,312.2737,29.923,30.186,35.363,30 -18:28:52,312.3231,29.923,30.212,35.359,30 -18:28:52,312.3745,29.949,30.186,34.909,30 -18:28:52,312.4258,29.923,30.186,34.905,30 -18:28:52,312.4766,29.923,30.16,35.348,30 -18:28:52,312.5262,29.923,30.212,35.792,30 -18:28:52,312.5781,29.897,30.212,34.896,30 -18:28:52,312.6285,29.87,30.186,35.339,30 -18:28:52,312.6805,29.923,30.186,36.247,30 -18:28:52,312.7316,29.923,30.133,35.334,30 -18:28:52,312.7837,29.949,30.186,36.243,30 -18:28:52,312.8368,29.923,30.186,34.882,30 -18:28:52,312.8904,29.949,30.212,35.325,30 -18:28:52,312.9414,29.923,30.16,34.427,30 -18:28:52,312.9931,29.949,30.16,35.764,30 -18:28:52,313.0453,29.87,30.186,35.315,30 -18:28:53,313.1016,29.949,30.186,36.223,30 -18:28:53,313.1531,29.923,30.186,34.862,30 -18:28:53,313.2057,29.949,30.16,35.305,30 -18:28:53,313.2573,29.923,30.186,35.302,30 -18:28:53,313.3095,29.949,30.16,35.299,30 -18:28:53,313.3595,29.923,30.212,35.296,30 -18:28:53,313.4123,29.923,30.16,34.845,30 -18:28:53,313.4634,29.923,30.186,35.736,30 -18:28:53,313.5145,29.923,30.16,35.286,30 -18:28:53,313.5658,29.923,30.186,35.73,30 -18:28:53,313.6205,29.897,30.186,35.281,30 -18:28:53,313.6727,29.949,30.186,35.724,30 -18:28:53,313.7249,29.923,30.16,34.827,30 -18:28:53,313.7775,29.923,30.16,35.718,30 -18:28:53,313.8280,29.949,30.186,35.715,30 -18:28:53,313.8820,29.897,30.212,34.819,30 -18:28:53,313.9349,29.949,30.186,35.262,30 -18:28:53,313.9866,29.949,30.186,34.811,30 -18:28:53,314.0397,29.949,30.16,34.807,30 -18:28:53,314.0902,29.949,30.16,35.25,30 -18:28:54,314.1403,29.87,30.186,35.247,30 -18:28:54,314.1899,29.923,30.212,36.156,30 -18:28:54,314.2404,29.949,30.107,34.795,30 -18:28:54,314.2901,29.949,30.186,36.15,30 -18:28:54,314.3407,29.923,30.186,34.79,30 -18:28:54,314.3947,29.923,30.186,35.233,30 -18:28:54,314.4465,29.949,30.186,35.23,30 -18:28:54,314.4992,29.949,30.186,34.779,30 -18:28:54,314.5528,29.923,30.186,34.775,30 -18:28:54,314.6041,29.975,30.212,35.218,30 -18:28:54,314.6543,29.923,30.212,33.873,30 -18:28:54,314.7044,29.975,30.186,34.763,30 -18:28:54,314.7556,29.923,30.16,34.311,30 -18:28:54,314.8066,29.923,30.212,35.648,30 -18:28:54,314.8569,29.949,30.212,34.752,30 -18:28:54,314.9071,29.923,30.186,34.3,30 -18:28:54,314.9567,29.975,30.186,35.19,30 -18:28:54,315.0080,29.975,30.16,34.293,30 -18:28:54,315.0592,29.949,30.186,34.735,30 -18:28:55,315.1117,29.923,30.186,34.731,30 -18:28:55,315.1607,29.923,30.186,35.175,30 -18:28:55,315.2127,29.87,30.16,35.172,30 -18:28:55,315.2720,29.949,30.16,36.527,30 -18:28:55,315.3286,29.923,30.212,35.167,30 -18:28:55,315.3806,29.949,30.186,34.716,30 -18:28:55,315.4358,29.923,30.212,34.712,30 -18:28:55,315.4888,29.975,30.186,34.708,30 -18:28:55,315.5521,29.949,30.186,34.257,30 -18:28:55,315.6269,29.949,30.186,34.698,30 -18:28:55,315.6929,29.949,30.212,34.692,30 -18:28:55,315.7644,29.949,30.186,34.24,30 -18:28:55,315.8254,29.923,30.16,34.681,30 -18:28:55,315.8873,29.949,30.212,35.571,30 -18:28:55,315.9493,29.949,30.186,34.225,30 -18:28:55,316.0125,29.975,30.16,34.667,30 -18:28:55,316.0745,30.002,30.212,34.662,30 -18:28:56,316.1350,29.923,30.186,33.298,30 -18:28:56,316.1935,30.002,30.186,35.098,30 -18:28:56,316.2495,29.949,30.212,33.735,30 -18:28:56,316.3184,29.949,30.186,34.193,30 -18:28:56,316.3804,29.949,30.239,34.634,30 -18:28:56,316.4395,29.949,30.186,33.718,30 -18:28:56,316.4989,29.949,30.186,34.623,30 -18:28:56,316.5569,29.949,30.186,34.619,30 -18:28:56,316.6135,29.949,30.212,34.614,30 -18:28:56,316.6701,29.923,30.212,34.162,30 -18:28:56,316.7276,29.949,30.16,34.605,30 -18:28:56,316.7830,29.949,30.212,35.047,30 -18:28:56,316.8356,29.949,30.212,34.149,30 -18:28:56,316.8906,29.975,30.186,34.144,30 -18:28:56,316.9408,29.923,30.212,34.14,30 -18:28:56,316.9896,29.975,30.186,34.582,30 -18:28:56,317.0377,29.949,30.186,34.131,30 -18:28:57,317.0984,29.975,30.212,34.574,30 -18:28:57,317.1514,29.949,30.212,33.674,30 -18:28:57,317.2050,29.975,30.212,34.116,30 -18:28:57,317.2555,29.975,30.186,33.664,30 -18:28:57,317.3060,29.923,30.186,34.106,30 -18:28:57,317.3611,29.949,30.16,34.996,30 -18:28:57,317.4156,29.949,30.212,34.992,30 -18:28:57,317.4655,29.923,30.186,34.094,30 -18:28:57,317.5195,29.923,30.186,34.984,30 -18:28:57,317.5756,29.923,30.186,34.981,30 -18:28:57,317.6273,29.923,30.212,34.977,30 -18:28:57,317.6773,29.949,30.186,34.527,30 -18:28:57,317.7295,29.949,30.212,34.523,30 -18:28:57,317.7795,29.975,30.212,34.072,30 -18:28:57,317.8306,29.949,30.186,33.62,30 -18:28:57,317.8835,29.975,30.212,34.509,30 -18:28:57,317.9352,29.975,30.186,33.61,30 -18:28:57,317.9936,29.949,30.186,34.052,30 -18:28:57,318.0479,29.949,30.212,34.494,30 -18:28:58,318.1013,29.949,30.212,34.042,30 -18:28:58,318.1511,29.975,30.186,34.037,30 -18:28:58,318.2029,29.923,30.212,34.033,30 -18:28:58,318.2525,29.975,30.186,34.475,30 -18:28:58,318.3014,30.002,30.186,34.024,30 -18:28:58,318.3517,29.975,30.212,33.555,30 -18:28:58,318.4038,29.975,30.212,33.567,30 -18:28:58,318.4517,29.949,30.186,33.562,30 -18:28:58,318.5018,29.949,30.212,34.451,30 -18:28:58,318.5520,30.028,30.186,34.0,30 -18:28:58,318.6038,29.975,30.186,33.084,30 -18:28:58,318.6545,29.949,30.212,33.989,30 -18:28:58,318.7043,29.949,30.212,33.984,30 -18:28:58,318.7550,29.949,30.212,33.98,30 -18:28:58,318.8057,29.949,30.212,33.975,30 -18:28:58,318.8570,29.923,30.16,33.97,30 -18:28:58,318.9070,29.975,30.186,35.307,30 -18:28:58,318.9578,29.949,30.212,33.963,30 -18:28:58,319.0071,29.949,30.186,33.959,30 -18:28:58,319.0603,29.949,30.212,34.401,30 -18:28:59,319.1113,29.975,30.186,33.95,30 -18:28:59,319.1607,29.923,30.186,33.945,30 -18:28:59,319.2116,29.949,30.186,34.835,30 -18:28:59,319.2616,29.949,30.212,34.385,30 -18:28:59,319.3116,29.949,30.239,33.934,30 -18:28:59,319.3637,29.975,30.186,33.465,30 -18:28:59,319.4154,29.975,30.239,33.924,30 -18:28:59,319.4675,29.975,30.212,33.007,30 -18:28:59,319.5187,29.975,30.186,33.465,30 -18:28:59,319.5725,29.949,30.186,33.907,30 -18:28:59,319.6247,29.923,30.212,34.349,30 -18:28:59,319.6749,29.949,30.212,34.345,30 -18:28:59,319.7260,29.949,30.186,33.894,30 -18:28:59,319.7748,29.949,30.186,34.337,30 -18:28:59,319.8280,29.975,30.186,34.333,30 -18:28:59,319.8829,29.949,30.186,33.881,30 -18:28:59,319.9385,29.923,30.186,34.324,30 -18:28:59,319.9898,29.949,30.186,34.767,30 -18:28:59,320.0411,29.975,30.186,34.316,30 -18:29:00,320.0970,29.949,30.212,33.865,30 -18:29:00,320.1515,29.923,30.212,33.86,30 -18:29:00,320.2042,29.923,30.239,34.302,30 -18:29:00,320.2544,29.975,30.186,33.834,30 -18:29:00,320.3067,29.949,30.212,33.846,30 -18:29:00,320.3607,29.923,30.16,33.842,30 -18:29:00,320.4125,29.923,30.16,35.178,30 -18:29:00,320.4645,29.949,30.186,35.176,30 -18:29:00,320.5194,29.949,30.212,34.279,30 -18:29:00,320.5732,29.949,30.212,33.827,30 -18:29:00,320.6239,29.949,30.16,33.822,30 -18:29:00,320.6748,29.949,30.16,34.712,30 -18:29:00,320.7275,29.949,30.16,34.709,30 -18:29:00,320.7792,29.949,30.16,34.706,30 -18:29:00,320.8294,29.87,30.186,34.703,30 -18:29:00,320.8882,29.923,30.186,35.611,30 -18:29:00,320.9387,29.923,30.186,34.697,30 -18:29:00,320.9895,29.923,30.16,34.694,30 -18:29:00,321.0405,30.002,30.16,35.138,30 -18:29:00,321.0927,29.923,30.16,33.777,30 -18:29:01,321.1443,29.949,30.16,35.131,30 -18:29:01,321.1945,29.949,30.16,34.681,30 -18:29:01,321.2470,29.897,30.133,34.678,30 -18:29:01,321.2975,29.923,30.186,36.034,30 -18:29:01,321.3480,29.897,30.186,34.674,30 -18:29:01,321.4026,29.949,30.212,35.118,30 -18:29:01,321.4555,29.949,30.186,33.774,30 -18:29:01,321.5055,29.897,30.186,34.216,30 -18:29:01,321.5555,29.975,30.212,35.107,30 -18:29:01,321.6069,29.923,30.16,33.316,30 -18:29:01,321.6575,29.975,30.16,35.099,30 -18:29:01,321.7105,29.923,30.16,34.202,30 -18:29:01,321.7613,29.949,30.186,35.093,30 -18:29:01,321.8164,29.923,30.212,34.196,30 -18:29:01,321.8703,29.949,30.16,34.192,30 -18:29:01,321.9208,29.949,30.212,34.635,30 -18:29:01,321.9722,29.923,30.212,33.737,30 -18:29:01,322.0240,29.923,30.186,34.18,30 -18:29:01,322.0793,29.923,30.16,34.623,30 -18:29:02,322.1335,29.923,30.186,35.067,30 -18:29:02,322.1837,29.923,30.186,34.617,30 -18:29:02,322.2340,29.923,30.186,34.614,30 -18:29:02,322.2839,29.949,30.212,34.611,30 -18:29:02,322.3352,29.949,30.186,33.713,30 -18:29:02,322.3897,29.949,30.186,34.156,30 -18:29:02,322.4398,29.975,30.186,34.151,30 -18:29:02,322.4925,29.949,30.16,33.7,30 -18:29:02,322.5431,29.949,30.212,34.59,30 -18:29:02,322.5957,29.923,30.212,33.692,30 -18:29:02,322.6470,29.949,30.16,34.135,30 -18:29:02,322.6968,29.923,30.186,34.578,30 -18:29:02,322.7469,29.975,30.16,34.575,30 -18:29:02,322.7971,29.923,30.16,34.125,30 -18:29:02,322.8472,29.923,30.186,35.015,30 -18:29:02,322.8987,29.923,30.186,34.566,30 -18:29:02,322.9515,29.897,30.186,34.562,30 -18:29:02,323.0020,29.897,30.186,35.006,30 -18:29:02,323.0516,29.949,30.186,35.004,30 -18:29:03,323.1028,29.923,30.212,34.107,30 -18:29:03,323.2011,29.949,30.186,34.103,30 -18:29:03,323.2522,29.923,30.186,34.096,30 -18:29:03,323.3050,29.923,30.186,34.539,30 -18:29:03,323.3550,29.923,30.186,34.536,30 -18:29:03,323.4059,29.949,30.16,34.533,30 -18:29:03,323.4549,29.949,30.16,34.529,30 -18:29:03,323.5053,29.949,30.186,34.526,30 -18:29:03,323.5570,29.897,30.212,34.076,30 -18:29:03,323.6080,29.923,30.16,34.519,30 -18:29:03,323.6588,29.923,30.186,34.963,30 -18:29:03,323.7093,29.923,30.186,34.514,30 -18:29:03,323.7595,29.923,30.239,34.511,30 -18:29:03,323.8113,29.923,30.16,33.596,30 -18:29:03,323.8666,29.923,30.212,34.95,30 -18:29:03,323.9187,29.923,30.186,34.053,30 -18:29:03,323.9715,29.923,30.212,34.496,30 -18:29:03,324.0235,29.949,30.16,34.045,30 -18:29:03,324.0749,29.949,30.16,34.489,30 -18:29:04,324.1243,29.923,30.16,34.485,30 -18:29:04,324.1763,29.949,30.16,34.93,30 -18:29:04,324.2265,29.923,30.186,34.48,30 -18:29:04,324.2768,29.949,30.186,34.477,30 -18:29:04,324.3273,29.897,30.16,34.026,30 -18:29:04,324.3777,29.923,30.212,35.364,30 -18:29:04,324.4287,29.923,30.186,34.021,30 -18:29:04,324.4778,29.923,30.239,34.464,30 -18:29:04,324.5283,29.897,30.212,33.55,30 -18:29:04,324.5794,29.949,30.186,34.456,30 -18:29:04,324.6321,29.923,30.186,34.006,30 -18:29:04,324.6846,29.949,30.186,34.449,30 -18:29:04,324.7393,29.923,30.186,33.999,30 -18:29:04,324.7933,29.897,30.16,34.442,30 -18:29:04,324.8475,29.949,30.16,35.333,30 -18:29:04,324.9025,29.949,30.16,34.437,30 -18:29:04,324.9561,29.949,30.212,34.433,30 -18:29:04,325.0085,29.923,30.186,33.535,30 -18:29:04,325.0610,29.949,30.16,34.425,30 -18:29:05,325.1142,29.923,30.186,34.422,30 -18:29:05,325.1679,29.949,30.212,34.418,30 -18:29:05,325.2202,29.923,30.16,33.521,30 -18:29:05,325.2704,29.923,30.186,34.858,30 -18:29:05,325.3221,29.949,30.186,34.408,30 -18:29:05,325.3764,29.975,30.133,33.958,30 -18:29:05,325.4277,29.949,30.16,34.418,30 -18:29:05,325.4796,29.949,30.212,34.397,30 -18:29:05,325.5303,29.975,30.186,33.5,30 -18:29:05,325.5846,29.923,30.133,33.495,30 -18:29:05,325.6371,29.923,30.212,35.296,30 -18:29:05,325.6875,29.949,30.212,33.936,30 -18:29:05,325.7386,29.923,30.212,33.485,30 -18:29:05,325.7914,29.923,30.212,33.927,30 -18:29:05,325.8427,29.923,30.186,33.923,30 -18:29:05,325.8976,29.897,30.16,34.366,30 -18:29:05,325.9511,29.949,30.16,35.258,30 -18:29:05,326.0035,29.975,30.186,34.361,30 -18:29:05,326.0540,29.897,30.186,33.463,30 -18:29:06,326.1038,29.949,30.16,34.801,30 -18:29:06,326.1540,29.949,30.212,34.351,30 -18:29:06,326.2057,29.897,30.212,33.453,30 -18:29:06,326.2575,29.897,30.212,34.343,30 -18:29:06,326.3095,29.923,30.212,34.34,30 -18:29:06,326.3601,29.923,30.186,33.889,30 -18:29:06,326.4096,29.949,30.16,34.333,30 -18:29:06,326.4593,29.897,30.212,34.33,30 -18:29:06,326.5096,29.923,30.186,34.327,30 -18:29:06,326.5615,29.949,30.186,34.323,30 -18:29:06,326.6136,29.949,30.186,33.873,30 -18:29:06,326.6647,29.949,30.16,33.869,30 -18:29:06,326.7155,29.949,30.212,34.312,30 -18:29:06,326.7673,29.923,30.186,33.415,30 -18:29:06,326.8186,29.949,30.186,34.304,30 -18:29:06,326.8715,29.923,30.186,33.854,30 -18:29:06,326.9228,29.949,30.186,34.297,30 -18:29:06,326.9747,29.949,30.16,33.847,30 -18:29:06,327.0258,29.923,30.16,34.29,30 -18:29:06,327.0764,29.923,30.212,34.734,30 -18:29:07,327.1276,29.949,30.186,33.837,30 -18:29:07,327.1804,29.975,30.186,33.833,30 -18:29:07,327.2333,30.002,30.16,33.382,30 -18:29:07,327.2849,29.923,30.212,33.36,30 -18:29:07,327.3366,29.897,30.186,33.819,30 -18:29:07,327.3905,29.923,30.186,34.71,30 -18:29:07,327.4422,29.923,30.212,34.26,30 -18:29:07,327.4932,29.923,30.186,33.81,30 -18:29:07,327.5432,29.923,30.186,34.253,30 -18:29:07,327.5953,29.923,30.212,34.25,30 -18:29:07,327.6454,29.949,30.212,33.799,30 -18:29:07,327.6975,29.897,30.186,33.348,30 -18:29:07,327.7507,29.949,30.186,34.685,30 -18:29:07,327.8024,29.949,30.212,33.788,30 -18:29:07,327.8543,29.949,30.16,33.337,30 -18:29:07,327.9073,29.923,30.186,34.227,30 -18:29:07,327.9609,29.949,30.186,34.223,30 -18:29:07,328.0132,29.949,30.212,33.773,30 -18:29:07,328.0663,29.949,30.186,33.321,30 -18:29:08,328.1176,29.975,30.186,33.764,30 -18:29:08,328.1710,29.949,30.186,33.313,30 -18:29:08,328.2209,29.949,30.16,33.755,30 -18:29:08,328.2714,29.923,30.212,34.198,30 -18:29:08,328.3217,29.949,30.212,33.748,30 -18:29:08,328.3743,29.923,30.186,33.297,30 -18:29:08,328.4267,29.949,30.212,34.187,30 -18:29:08,328.4829,29.923,30.186,33.289,30 -18:29:08,328.5395,29.949,30.186,34.178,30 -18:29:08,328.5943,29.923,30.186,33.727,30 -18:29:08,328.6495,29.975,30.212,34.17,30 -18:29:08,328.7091,29.949,30.186,32.825,30 -18:29:08,328.7602,29.897,30.186,33.714,30 -18:29:08,328.8107,29.949,30.133,34.604,30 -18:29:08,328.8656,29.949,30.186,34.619,30 -18:29:08,328.9176,29.923,30.186,33.705,30 -18:29:08,328.9707,29.949,30.212,34.148,30 -18:29:08,329.0215,29.949,30.239,33.25,30 -18:29:08,329.0733,29.923,30.212,32.781,30 -18:29:09,329.1248,29.923,30.212,33.687,30 -18:29:09,329.1764,29.949,30.186,33.683,30 -18:29:09,329.2282,29.923,30.186,33.679,30 -18:29:09,329.2779,29.923,30.212,34.122,30 -18:29:09,329.3282,29.949,30.186,33.672,30 -18:29:09,329.3805,29.975,30.186,33.668,30 -18:29:09,329.4329,29.923,30.239,33.217,30 -18:29:09,329.4842,29.975,30.16,33.195,30 -18:29:09,329.5416,29.923,30.239,33.654,30 -18:29:09,329.5951,29.949,30.16,33.185,30 -18:29:09,329.6467,29.923,30.212,34.092,30 -18:29:09,329.6985,29.975,30.186,33.642,30 -18:29:09,329.7504,29.923,30.16,33.191,30 -18:29:09,329.8015,29.949,30.16,34.528,30 -18:29:09,329.8544,29.949,30.186,34.078,30 -18:29:09,329.9092,29.923,30.186,33.627,30 -18:29:09,329.9605,29.923,30.212,34.07,30 -18:29:09,330.0101,29.923,30.212,33.62,30 -18:29:09,330.0594,29.975,30.186,33.616,30 -18:29:10,330.1086,29.923,30.186,33.165,30 -18:29:10,330.1598,29.949,30.186,34.055,30 -18:29:10,330.2146,29.949,30.212,33.605,30 -18:29:10,330.2748,29.949,30.186,33.153,30 -18:29:10,330.3259,29.975,30.186,33.595,30 -18:29:10,330.3789,29.923,30.186,33.144,30 -18:29:10,330.4284,29.923,30.186,34.033,30 -18:29:10,330.4782,29.975,30.186,34.03,30 -18:29:10,330.5418,29.923,30.16,33.133,30 -18:29:10,330.6206,29.949,30.186,34.469,30 -18:29:10,330.6941,29.897,30.186,33.57,30 -18:29:10,330.7590,29.949,30.186,34.46,30 -18:29:10,330.8217,29.975,30.186,33.562,30 -18:29:10,330.8837,29.923,30.186,33.109,30 -18:29:10,330.9540,29.975,30.212,33.998,30 -18:29:10,331.0125,29.923,30.186,32.652,30 -18:29:10,331.0801,29.949,30.186,33.988,30 -18:29:11,331.1418,29.949,30.265,33.536,30 -18:29:11,331.2051,29.949,30.212,32.172,30 -18:29:11,331.2619,29.923,30.186,33.076,30 -18:29:11,331.3261,29.949,30.186,33.965,30 -18:29:11,331.3876,29.975,30.186,33.514,30 -18:29:11,331.4508,29.975,30.16,33.062,30 -18:29:11,331.5099,29.923,30.239,33.503,30 -18:29:11,331.5665,29.897,30.186,33.034,30 -18:29:11,331.6293,29.923,30.212,34.388,30 -18:29:11,331.6873,29.949,30.212,33.491,30 -18:29:11,331.7456,29.975,30.186,33.039,30 -18:29:11,331.8079,29.923,30.186,33.033,30 -18:29:11,331.8617,29.949,30.212,33.922,30 -18:29:11,331.9144,29.949,30.186,33.025,30 -18:29:11,331.9710,29.949,30.212,33.467,30 -18:29:11,332.0251,29.923,30.186,33.015,30 -18:29:11,332.0796,29.923,30.186,33.905,30 -18:29:12,332.1451,29.923,30.186,33.901,30 -18:29:12,332.1987,29.949,30.186,33.897,30 -18:29:12,332.2538,29.949,30.212,33.447,30 -18:29:12,332.3055,29.923,30.186,32.995,30 -18:29:12,332.3591,29.897,30.212,33.885,30 -18:29:12,332.4137,29.923,30.212,33.882,30 -18:29:12,332.4647,29.949,30.212,33.431,30 -18:29:12,332.5166,29.949,30.212,32.98,30 -18:29:12,332.5771,29.949,30.186,32.975,30 -18:29:12,332.6288,29.949,30.16,33.417,30 -18:29:12,332.6823,29.923,30.212,33.86,30 -18:29:12,332.7335,29.975,30.186,33.409,30 -18:29:12,332.7865,29.897,30.239,32.958,30 -18:29:12,332.8386,29.949,30.186,33.383,30 -18:29:12,332.8918,29.923,30.186,33.397,30 -18:29:12,332.9437,29.949,30.212,33.84,30 -18:29:12,332.9957,29.975,30.186,32.942,30 -18:29:12,333.0493,29.975,30.239,32.937,30 -18:29:13,333.1029,29.949,30.212,32.021,30 -18:29:13,333.1552,29.949,30.212,32.926,30 -18:29:13,333.2105,29.975,30.186,32.921,30 -18:29:13,333.2629,29.949,30.239,32.916,30 -18:29:13,333.3131,29.949,30.212,32.447,30 -18:29:13,333.3666,29.975,30.212,32.905,30 -18:29:13,333.4175,29.923,30.212,32.453,30 -18:29:13,333.4693,29.975,30.212,33.343,30 -18:29:13,333.5243,29.923,30.186,32.444,30 -18:29:13,333.5775,29.923,30.212,33.78,30 -18:29:13,333.6293,29.975,30.212,33.329,30 -18:29:13,333.6804,30.002,30.186,32.431,30 -18:29:13,333.7349,29.949,30.186,32.408,30 -18:29:13,333.7873,29.949,30.212,33.314,30 -18:29:13,333.8396,29.975,30.16,32.863,30 -18:29:13,333.8943,29.949,30.186,33.305,30 -18:29:13,333.9515,29.975,30.239,33.301,30 -18:29:13,334.0037,29.949,30.133,31.937,30 -18:29:13,334.0554,29.975,30.212,34.202,30 -18:29:14,334.1095,29.923,30.212,32.393,30 -18:29:14,334.1613,29.949,30.186,33.282,30 -18:29:14,334.2147,29.949,30.212,33.278,30 -18:29:14,334.2678,29.949,30.212,32.827,30 -18:29:14,334.3212,29.923,30.212,32.822,30 -18:29:14,334.3748,29.975,30.186,33.264,30 -18:29:14,334.4274,29.949,30.212,32.813,30 -18:29:14,334.4793,29.975,30.186,32.808,30 -18:29:14,334.5335,29.949,30.212,32.803,30 -18:29:14,334.5888,29.975,30.239,32.798,30 -18:29:14,334.6416,29.949,30.186,31.881,30 -18:29:14,334.6944,29.949,30.16,33.234,30 -18:29:14,334.7495,29.949,30.212,33.677,30 -18:29:14,334.8042,29.923,30.212,32.779,30 -18:29:14,334.8565,29.975,30.212,33.221,30 -18:29:14,334.9095,29.897,30.186,32.323,30 -18:29:14,334.9628,29.975,30.212,34.106,30 -18:29:14,335.0176,29.923,30.212,32.314,30 -18:29:14,335.0698,29.923,30.212,33.203,30 -18:29:15,335.1283,29.975,30.16,33.199,30 -18:29:15,335.1826,29.949,30.239,33.195,30 -18:29:15,335.2411,29.923,30.212,32.279,30 -18:29:15,335.2937,29.949,30.239,33.184,30 -18:29:15,335.3459,29.975,30.186,32.268,30 -18:29:15,335.3999,29.949,30.212,32.727,30 -18:29:15,335.4526,29.923,30.212,32.722,30 -18:29:15,335.5055,30.002,30.186,33.165,30 -18:29:15,335.5575,29.949,30.239,32.249,30 -18:29:15,335.6106,29.975,30.186,32.243,30 -18:29:15,335.6623,29.949,30.265,32.702,30 -18:29:15,335.7161,30.002,30.186,31.785,30 -18:29:15,335.7695,29.949,30.16,32.226,30 -18:29:15,335.8230,29.949,30.186,33.58,30 -18:29:15,335.8788,30.002,30.212,33.129,30 -18:29:15,335.9354,29.949,30.212,31.765,30 -18:29:15,335.9877,29.975,30.239,32.67,30 -18:29:15,336.0407,29.949,30.186,31.754,30 -18:29:15,336.0929,29.975,30.186,33.106,30 -18:29:16,336.1453,29.949,30.212,32.655,30 -18:29:16,336.1979,29.949,30.212,32.65,30 -18:29:16,336.2535,29.975,30.212,32.646,30 -18:29:16,336.3049,29.949,30.292,32.193,30 -18:29:16,336.3565,29.949,30.212,31.259,30 -18:29:16,336.4105,29.949,30.239,32.628,30 -18:29:16,336.4620,29.923,30.212,32.158,30 -18:29:16,336.5161,29.949,30.239,33.064,30 -18:29:16,336.5690,29.949,30.239,32.149,30 -18:29:16,336.6216,29.975,30.212,32.143,30 -18:29:16,336.6752,29.949,30.212,32.154,30 -18:29:16,336.7277,29.949,30.212,32.596,30 -18:29:16,336.7816,30.002,30.186,32.591,30 -18:29:16,336.8344,29.949,30.239,32.122,30 -18:29:16,336.8873,29.923,30.212,32.116,30 -18:29:16,336.9415,29.897,30.212,33.022,30 -18:29:16,336.9936,29.949,30.212,33.465,30 -18:29:16,337.0467,29.949,30.212,32.567,30 -18:29:17,337.1016,29.949,30.265,32.563,30 -18:29:17,337.1537,29.975,30.186,31.646,30 -18:29:17,337.2065,29.949,30.186,32.551,30 -18:29:17,337.2604,29.975,30.212,32.993,30 -18:29:17,337.3126,29.975,30.212,32.095,30 -18:29:17,337.3651,29.975,30.239,32.089,30 -18:29:17,337.4196,29.975,30.239,31.619,30 -18:29:17,337.4736,29.949,30.212,31.612,30 -18:29:17,337.5251,29.923,30.212,32.518,30 -18:29:17,337.5787,29.949,30.186,32.96,30 -18:29:17,337.6324,30.002,30.212,32.956,30 -18:29:17,337.6875,29.949,30.239,31.593,30 -18:29:17,337.7436,29.949,30.239,32.033,30 -18:29:17,337.7940,29.949,30.212,32.027,30 -18:29:17,337.8485,29.949,30.239,32.486,30 -18:29:17,337.9067,29.949,30.186,32.017,30 -18:29:17,337.9589,29.975,30.212,32.922,30 -18:29:17,338.0133,29.949,30.265,32.024,30 -18:29:17,338.0670,30.002,30.212,31.554,30 -18:29:18,338.1178,29.949,30.212,31.547,30 -18:29:18,338.1697,29.949,30.239,32.453,30 -18:29:18,338.2230,29.975,30.186,31.983,30 -18:29:18,338.2737,29.975,30.265,32.442,30 -18:29:18,338.3308,29.949,30.239,31.079,30 -18:29:18,338.3846,29.949,30.212,31.965,30 -18:29:18,338.4356,29.975,30.186,32.424,30 -18:29:18,338.4880,29.975,30.133,32.419,30 -18:29:18,338.5406,29.949,30.212,33.326,30 -18:29:18,338.5945,29.949,30.239,32.411,30 -18:29:18,338.6492,29.975,30.239,31.942,30 -18:29:18,338.7020,29.975,30.212,31.489,30 -18:29:18,338.7552,29.949,30.212,31.947,30 -18:29:18,338.8073,29.949,30.186,32.388,30 -18:29:18,338.8577,29.975,30.239,32.831,30 -18:29:18,338.9116,29.975,30.239,31.468,30 -18:29:18,338.9655,29.975,30.212,31.461,30 -18:29:18,339.0185,30.028,30.212,31.919,30 -18:29:18,339.0697,29.975,30.239,31.002,30 -18:29:19,339.1233,29.975,30.16,31.442,30 -18:29:19,339.1763,30.002,30.186,32.795,30 -18:29:19,339.2296,29.949,30.265,31.879,30 -18:29:19,339.2840,29.975,30.239,31.426,30 -18:29:19,339.3356,29.949,30.239,31.419,30 -18:29:19,339.3897,29.923,30.186,31.86,30 -18:29:19,339.4425,29.975,30.212,33.213,30 -18:29:19,339.4974,30.002,30.239,31.868,30 -18:29:19,339.5529,30.002,30.212,30.933,30 -18:29:19,339.6061,29.949,30.212,31.39,30 -18:29:19,339.6575,29.949,30.212,32.296,30 -18:29:19,339.7095,29.975,30.212,32.291,30 -18:29:19,339.7607,29.949,30.239,31.839,30 -18:29:19,339.8149,29.975,30.239,31.816,30 -18:29:19,339.8716,29.949,30.212,31.363,30 -18:29:19,339.9257,29.949,30.239,32.268,30 -18:29:19,339.9793,29.949,30.16,31.798,30 -18:29:19,340.0328,29.949,30.239,33.152,30 -18:29:19,340.0846,29.949,30.239,31.789,30 -18:29:20,340.1388,29.949,30.186,31.784,30 -18:29:20,340.1915,29.975,30.212,32.69,30 -18:29:20,340.2430,29.949,30.239,31.791,30 -18:29:20,340.2983,29.923,30.239,31.769,30 -18:29:20,340.3505,30.002,30.212,32.21,30 -18:29:20,340.4048,29.975,30.212,31.311,30 -18:29:20,340.4602,29.975,30.212,31.768,30 -18:29:20,340.5142,30.002,30.186,31.762,30 -18:29:20,340.5667,29.975,30.239,31.74,30 -18:29:20,340.6187,29.949,30.239,31.287,30 -18:29:20,340.6697,29.949,30.212,31.728,30 -18:29:20,340.7260,29.949,30.186,32.186,30 -18:29:20,340.7782,29.975,30.239,32.629,30 -18:29:20,340.8353,30.028,30.212,31.266,30 -18:29:20,340.8895,29.975,30.265,30.811,30 -18:29:20,340.9425,29.975,30.212,30.804,30 -18:29:20,340.9956,29.949,30.212,31.708,30 -18:29:20,341.0515,29.975,30.186,32.15,30 -18:29:21,341.1041,29.949,30.239,32.145,30 -18:29:21,341.1563,29.949,30.239,31.675,30 -18:29:21,341.2095,29.975,30.212,31.67,30 -18:29:21,341.2615,30.002,30.239,31.681,30 -18:29:21,341.3174,29.975,30.265,30.746,30 -18:29:21,341.3700,29.949,30.212,30.756,30 -18:29:21,341.4215,29.949,30.212,32.108,30 -18:29:21,341.5166,29.949,30.265,32.103,30 -18:29:21,341.5692,29.975,30.186,31.182,30 -18:29:21,341.6215,29.975,30.265,32.087,30 -18:29:21,341.6755,29.975,30.239,30.723,30 -18:29:21,341.7311,29.975,30.212,31.163,30 -18:29:21,341.7819,29.949,30.186,31.621,30 -18:29:21,341.8327,29.975,30.239,32.51,30 -18:29:21,341.8903,29.949,30.212,31.147,30 -18:29:21,341.9426,29.975,30.239,32.052,30 -18:29:21,341.9963,29.975,30.239,31.135,30 -18:29:21,342.0469,29.975,30.212,31.129,30 -18:29:22,342.0973,29.949,30.212,31.587,30 -18:29:22,342.1485,29.975,30.186,32.029,30 -18:29:22,342.2000,29.975,30.212,32.024,30 -18:29:22,342.2502,29.975,30.186,31.572,30 -18:29:22,342.3023,29.975,30.212,32.014,30 -18:29:22,342.3531,29.949,30.212,31.562,30 -18:29:22,342.4043,29.949,30.239,32.004,30 -18:29:22,342.4536,30.002,30.239,31.535,30 -18:29:22,342.5024,30.002,30.212,30.618,30 -18:29:22,342.5537,30.002,30.212,31.075,30 -18:29:22,342.6045,29.949,30.212,31.069,30 -18:29:22,342.6551,29.949,30.239,31.975,30 -18:29:22,342.7072,29.975,30.239,31.506,30 -18:29:22,342.7631,30.002,30.239,31.053,30 -18:29:22,342.8152,29.949,30.212,30.581,30 -18:29:22,342.8744,29.975,30.239,31.95,30 -18:29:22,342.9264,29.949,30.239,31.033,30 -18:29:22,342.9905,29.975,30.239,31.474,30 -18:29:22,343.0480,30.002,30.212,31.019,30 -18:29:23,343.1025,30.002,30.239,31.012,30 -18:29:23,343.1576,29.975,30.212,30.541,30 -18:29:23,343.2080,29.923,30.212,31.463,30 -18:29:23,343.2568,29.949,30.212,32.352,30 -18:29:23,343.3085,29.975,30.212,31.901,30 -18:29:23,343.3584,29.949,30.212,31.449,30 -18:29:23,343.4086,30.002,30.239,31.891,30 -18:29:23,343.4598,29.975,30.212,30.51,30 -18:29:23,343.5142,29.975,30.212,31.432,30 -18:29:23,343.5660,30.002,30.239,31.426,30 -18:29:23,343.6186,30.002,30.212,30.491,30 -18:29:23,343.6677,29.975,30.265,30.949,30 -18:29:23,343.7188,30.002,30.212,30.496,30 -18:29:23,343.7699,30.002,30.239,30.936,30 -18:29:23,343.8203,29.975,30.239,30.465,30 -18:29:23,343.8714,29.949,30.186,30.923,30 -18:29:23,343.9239,30.002,30.265,32.275,30 -18:29:23,343.9826,29.975,30.265,30.0,30 -18:29:23,344.0368,30.002,30.239,30.456,30 -18:29:23,344.0883,30.002,30.239,30.431,30 -18:29:24,344.1395,29.975,30.239,30.424,30 -18:29:24,344.1895,29.975,30.239,30.882,30 -18:29:24,344.2388,30.002,30.239,30.876,30 -18:29:24,344.2923,30.002,30.212,30.405,30 -18:29:24,344.3441,29.975,30.239,30.862,30 -18:29:24,344.3998,29.975,30.239,30.856,30 -18:29:24,344.4533,30.028,30.186,30.849,30 -18:29:24,344.5055,29.949,30.239,30.843,30 -18:29:24,344.5577,30.002,30.212,31.284,30 -18:29:24,344.6132,29.949,30.265,30.831,30 -18:29:24,344.6647,30.002,30.212,30.824,30 -18:29:24,344.7166,29.975,30.239,30.818,30 -18:29:24,344.7678,29.949,30.265,30.811,30 -18:29:24,344.8173,29.975,30.212,30.805,30 -18:29:24,344.8681,30.028,30.265,31.263,30 -18:29:24,344.9198,29.949,30.265,29.435,30 -18:29:24,344.9743,29.949,30.212,30.785,30 -18:29:24,345.0273,29.949,30.265,31.69,30 -18:29:24,345.0783,30.002,30.212,30.773,30 -18:29:25,345.1299,29.975,30.239,30.767,30 -18:29:25,345.1803,29.975,30.212,30.761,30 -18:29:25,345.2367,30.002,30.239,31.219,30 -18:29:25,345.2921,29.975,30.239,30.284,30 -18:29:25,345.3423,29.949,30.239,30.741,30 -18:29:25,345.3952,30.002,30.239,31.182,30 -18:29:25,345.4465,30.002,30.239,30.265,30 -18:29:25,345.4979,29.975,30.265,30.258,30 -18:29:25,345.5781,30.002,30.212,30.268,30 -18:29:25,345.6408,29.975,30.186,30.704,30 -18:29:25,345.7022,29.975,30.239,31.609,30 -18:29:25,345.7714,29.975,30.239,30.691,30 -18:29:25,345.8328,29.975,30.239,30.682,30 -18:29:25,345.9076,29.975,30.212,30.674,30 -18:29:25,345.9723,29.975,30.239,31.13,30 -18:29:25,346.0307,29.975,30.239,30.659,30 -18:29:25,346.0901,29.975,30.239,30.652,30 -18:29:26,346.1537,29.975,30.239,30.645,30 -18:29:26,346.2135,30.002,30.212,30.637,30 -18:29:26,346.2736,29.949,30.239,30.63,30 -18:29:26,346.3342,30.002,30.212,31.07,30 -18:29:26,346.3976,29.975,30.265,30.616,30 -18:29:26,346.4588,30.002,30.212,30.16,30 -18:29:26,346.5176,29.975,30.239,30.599,30 -18:29:26,346.5737,29.949,30.239,30.592,30 -18:29:26,346.6310,29.923,30.212,31.033,30 -18:29:26,346.6873,30.002,30.239,31.938,30 -18:29:26,346.7446,29.975,30.265,30.11,30 -18:29:26,346.8006,30.028,30.212,30.12,30 -18:29:26,346.8530,30.002,30.239,30.112,30 -18:29:26,346.9062,29.975,30.16,30.088,30 -18:29:26,346.9576,29.975,30.212,31.904,30 -18:29:26,347.0123,29.949,30.239,31.006,30 -18:29:26,347.0766,30.002,30.239,30.982,30 -18:29:27,347.1308,30.002,30.239,30.063,30 -18:29:27,347.1851,29.975,30.265,30.056,30 -18:29:27,347.2362,29.975,30.265,30.066,30 -18:29:27,347.2886,30.002,30.212,30.059,30 -18:29:27,347.3412,29.975,30.186,30.499,30 -18:29:27,347.3950,29.975,30.265,31.404,30 -18:29:27,347.4502,29.975,30.292,30.04,30 -18:29:27,347.5018,29.949,30.265,29.568,30 -18:29:27,347.5558,29.975,30.239,30.472,30 -18:29:27,347.6064,29.949,30.239,30.465,30 -18:29:27,347.6583,29.975,30.212,30.906,30 -18:29:27,347.7126,29.975,30.212,30.918,30 -18:29:27,347.7684,29.975,30.239,30.912,30 -18:29:27,347.8214,29.949,30.239,30.442,30 -18:29:27,347.8734,30.002,30.239,30.882,30 -18:29:27,347.9276,29.975,30.212,29.965,30 -18:29:27,347.9821,29.975,30.239,30.887,30 -18:29:27,348.0387,29.975,30.239,30.416,30 -18:29:27,348.0943,29.975,30.212,30.409,30 -18:29:28,348.1467,30.002,30.212,30.867,30 -18:29:28,348.2005,30.002,30.265,30.397,30 -18:29:28,348.2537,29.949,30.265,29.479,30 -18:29:28,348.3072,29.949,30.239,30.382,30 -18:29:28,348.3592,29.949,30.239,30.823,30 -18:29:28,348.4127,30.002,30.239,30.818,30 -18:29:28,348.4656,29.975,30.212,29.9,30 -18:29:28,348.5166,30.002,30.212,30.822,30 -18:29:28,348.5724,29.975,30.265,30.352,30 -18:29:28,348.6247,29.975,30.212,29.898,30 -18:29:28,348.6772,29.975,30.239,30.802,30 -18:29:28,348.7294,29.975,30.239,30.332,30 -18:29:28,348.7826,29.949,30.292,30.326,30 -18:29:28,348.8320,29.975,30.212,29.855,30 -18:29:28,348.8843,29.975,30.265,30.777,30 -18:29:28,348.9369,29.949,30.239,29.86,30 -18:29:28,348.9893,29.975,30.239,30.747,30 -18:29:28,349.0406,30.002,30.212,30.294,30 -18:29:28,349.0922,30.002,30.212,30.288,30 -18:29:29,349.1450,30.002,30.239,30.281,30 -18:29:29,349.1983,29.975,30.212,29.81,30 -18:29:29,349.2497,29.975,30.186,30.732,30 -18:29:29,349.3004,29.975,30.212,31.174,30 -18:29:29,349.3527,30.028,30.212,30.722,30 -18:29:29,349.4057,29.949,30.239,29.805,30 -18:29:29,349.4585,29.975,30.239,30.692,30 -18:29:29,349.5145,30.002,30.212,30.239,30 -18:29:29,349.5670,29.949,30.265,30.232,30 -18:29:29,349.6213,29.975,30.212,30.226,30 -18:29:29,349.6745,29.975,30.239,30.684,30 -18:29:29,349.7278,29.975,30.212,30.213,30 -18:29:29,349.7834,29.949,30.212,30.671,30 -18:29:29,349.8347,29.975,30.212,31.113,30 -18:29:29,349.8893,29.949,30.212,30.661,30 -18:29:29,349.9425,30.002,30.239,31.102,30 -18:29:29,349.9938,29.949,30.265,29.721,30 -18:29:29,350.0480,30.002,30.212,30.179,30 -18:29:30,350.1046,29.975,30.239,30.172,30 -18:29:30,350.1567,29.949,30.212,30.165,30 -18:29:30,350.2097,29.975,30.239,31.07,30 -18:29:30,350.2625,29.949,30.212,30.154,30 -18:29:30,350.3147,29.923,30.265,31.059,30 -18:29:30,350.3670,29.975,30.212,30.59,30 -18:29:30,350.4206,29.975,30.212,30.601,30 -18:29:30,350.4722,30.002,30.212,30.596,30 -18:29:30,350.5238,29.923,30.212,30.126,30 -18:29:30,350.5760,29.975,30.239,31.478,30 -18:29:30,350.6301,29.975,30.239,30.115,30 -18:29:30,350.6846,30.002,30.239,30.109,30 -18:29:30,350.7402,29.975,30.186,29.637,30 -18:29:30,350.7928,29.949,30.239,31.006,30 -18:29:30,350.8460,29.975,30.239,30.537,30 -18:29:30,350.9018,29.975,30.239,30.084,30 -18:29:30,350.9549,29.949,30.239,30.077,30 -18:29:30,351.0065,29.975,30.212,30.518,30 -18:29:30,351.0602,29.975,30.239,30.529,30 -18:29:31,351.1134,29.975,30.239,30.059,30 -18:29:31,351.1673,30.028,30.265,30.053,30 -18:29:31,351.2193,29.975,30.239,28.687,30 -18:29:31,351.2714,30.002,30.239,30.037,30 -18:29:31,351.3235,29.975,30.212,29.567,30 -18:29:31,351.3770,29.975,30.212,30.488,30 -18:29:31,351.4295,29.975,30.239,30.483,30 -18:29:31,351.4829,30.002,30.239,30.013,30 -18:29:31,351.5335,30.002,30.212,29.542,30 -18:29:31,351.5862,29.975,30.239,29.999,30 -18:29:31,351.6395,30.002,30.239,29.992,30 -18:29:31,351.6910,30.002,30.239,29.522,30 -18:29:31,351.7450,30.002,30.239,29.514,30 -18:29:31,351.7996,30.002,30.212,29.507,30 -18:29:31,351.8495,30.002,30.265,29.964,30 -18:29:31,351.9018,29.975,30.265,29.046,30 -18:29:31,351.9560,30.002,30.212,29.503,30 -18:29:31,352.0063,29.975,30.212,29.943,30 -18:29:31,352.0851,30.002,30.239,30.401,30 -18:29:32,352.1510,30.028,30.239,29.462,30 -18:29:32,352.2090,29.975,30.239,29.006,30 -18:29:32,352.2678,29.975,30.239,29.909,30 -18:29:32,352.3305,29.975,30.239,29.902,30 -18:29:32,352.3870,29.975,30.239,29.894,30 -18:29:32,352.4397,30.002,30.265,29.887,30 -18:29:32,352.4936,30.002,30.239,28.969,30 -18:29:32,352.5478,30.002,30.265,29.408,30 -18:29:32,352.6032,30.028,30.239,28.954,30 -18:29:32,352.6545,29.975,30.239,28.945,30 -18:29:32,352.7057,29.975,30.239,29.849,30 -18:29:32,352.7568,30.002,30.239,29.843,30 -18:29:32,352.8109,29.949,30.265,29.372,30 -18:29:32,352.8655,30.054,30.239,29.829,30 -18:29:32,352.9166,30.002,30.239,28.463,30 -18:29:32,352.9785,29.975,30.239,29.349,30 -18:29:32,353.0327,29.975,30.239,29.805,30 -18:29:32,353.0866,29.975,30.239,29.799,30 -18:29:33,353.1405,29.975,30.239,29.792,30 -18:29:33,353.1963,29.975,30.239,29.786,30 -18:29:33,353.2510,29.949,30.265,29.779,30 -18:29:33,353.3043,30.002,30.212,29.772,30 -18:29:33,353.3573,30.028,30.239,29.766,30 -18:29:33,353.4114,29.923,30.239,28.847,30 -18:29:33,353.4674,29.923,30.239,30.645,30 -18:29:33,353.5195,30.002,30.239,30.64,30 -18:29:33,353.5751,30.002,30.265,29.276,30 -18:29:33,353.6304,29.975,30.212,28.822,30 -18:29:33,353.6857,29.949,30.239,30.189,30 -18:29:33,353.7410,30.028,30.239,30.166,30 -18:29:33,353.7952,30.002,30.239,28.801,30 -18:29:33,353.8488,30.002,30.239,29.24,30 -18:29:33,353.9035,29.975,30.239,29.233,30 -18:29:33,353.9568,30.002,30.212,29.69,30 -18:29:33,354.0116,29.975,30.239,29.683,30 -18:29:33,354.0682,29.975,30.212,29.677,30 -18:29:34,354.1208,29.975,30.239,30.134,30 -18:29:34,354.1734,29.923,30.212,29.664,30 -18:29:34,354.2307,30.002,30.212,31.017,30 -18:29:34,354.2834,29.975,30.239,29.653,30 -18:29:34,354.3372,30.002,30.265,29.647,30 -18:29:34,354.3931,29.975,30.239,28.728,30 -18:29:34,354.4482,30.002,30.212,29.632,30 -18:29:34,354.5017,29.975,30.239,29.625,30 -18:29:34,354.5542,29.975,30.212,29.618,30 -18:29:34,354.6093,29.975,30.239,30.076,30 -18:29:34,354.6664,29.975,30.239,29.606,30 -18:29:34,354.7186,29.949,30.239,29.599,30 -18:29:34,354.7744,29.975,30.239,30.04,30 -18:29:34,354.8271,29.949,30.239,29.587,30 -18:29:34,354.8832,29.975,30.239,30.027,30 -18:29:34,354.9408,30.002,30.212,29.574,30 -18:29:34,354.9970,30.002,30.239,29.567,30 -18:29:34,355.0490,29.975,30.186,29.096,30 -18:29:35,355.1011,30.002,30.212,30.465,30 -18:29:35,355.1524,29.975,30.212,29.548,30 -18:29:35,355.2038,29.975,30.239,30.006,30 -18:29:35,355.2557,29.949,30.212,29.536,30 -18:29:35,355.3050,30.002,30.239,30.442,30 -18:29:35,355.3543,29.949,30.265,29.061,30 -18:29:35,355.4128,29.897,30.239,29.519,30 -18:29:35,355.4661,29.949,30.265,30.854,30 -18:29:35,355.5181,30.002,30.239,29.508,30 -18:29:35,355.5694,29.975,30.265,29.037,30 -18:29:35,355.6208,29.975,30.239,29.047,30 -18:29:35,355.6713,29.975,30.239,29.487,30 -18:29:35,355.7216,29.923,30.212,29.481,30 -18:29:35,355.7728,29.923,30.239,30.834,30 -18:29:35,355.8242,30.002,30.239,30.366,30 -18:29:35,355.8768,29.949,30.186,29.002,30 -18:29:35,355.9303,29.949,30.212,30.818,30 -18:29:35,355.9813,29.975,30.239,30.367,30 -18:29:35,356.0322,29.975,30.239,29.45,30 -18:29:35,356.0826,29.975,30.239,29.444,30 -18:29:36,356.1352,29.975,30.212,29.438,30 -18:29:36,356.1867,29.975,30.265,29.896,30 -18:29:36,356.2367,29.975,30.265,28.979,30 -18:29:36,356.2868,29.949,30.239,28.972,30 -18:29:36,356.3373,29.949,30.239,29.859,30 -18:29:36,356.3921,30.002,30.265,29.854,30 -18:29:36,356.4453,29.949,30.239,28.489,30 -18:29:36,356.4988,30.002,30.239,29.84,30 -18:29:36,356.5494,29.975,30.212,28.922,30 -18:29:36,356.6008,30.002,30.212,29.844,30 -18:29:36,356.6516,30.002,30.239,29.374,30 -18:29:36,356.7031,29.949,30.239,28.904,30 -18:29:36,356.7549,29.897,30.265,29.808,30 -18:29:36,356.8052,29.975,30.212,30.25,30 -18:29:36,356.8563,29.975,30.239,29.815,30 -18:29:36,356.9102,29.949,30.239,29.346,30 -18:29:36,356.9619,30.002,30.239,29.786,30 -18:29:36,357.0159,30.002,30.239,28.869,30 -18:29:36,357.0680,29.975,30.212,28.862,30 -18:29:37,357.1201,29.949,30.212,29.783,30 -18:29:37,357.1706,30.002,30.239,30.225,30 -18:29:37,357.2205,29.975,30.212,28.844,30 -18:29:37,357.2704,29.975,30.265,29.766,30 -18:29:37,357.3221,29.949,30.212,28.849,30 -18:29:37,357.3756,29.975,30.239,30.201,30 -18:29:37,357.4294,30.002,30.239,29.284,30 -18:29:37,357.4817,29.975,30.212,28.813,30 -18:29:37,357.5326,29.975,30.239,29.735,30 -18:29:37,357.5852,29.949,30.239,29.265,30 -18:29:37,357.6377,29.949,30.212,29.706,30 -18:29:37,357.6879,29.949,30.239,30.165,30 -18:29:37,357.7385,29.975,30.212,29.696,30 -18:29:37,357.7905,29.975,30.239,29.708,30 -18:29:37,357.8461,29.975,30.239,29.238,30 -18:29:37,357.9031,29.949,30.186,29.231,30 -18:29:37,357.9589,29.975,30.186,30.583,30 -18:29:37,358.0148,29.949,30.265,30.131,30 -18:29:37,358.0683,29.949,30.239,29.214,30 -18:29:38,358.1238,29.975,30.212,29.655,30 -18:29:38,358.1788,30.002,30.239,29.666,30 -18:29:38,358.2345,30.002,30.265,28.732,30 -18:29:38,358.2874,29.975,30.212,28.277,30 -18:29:38,358.3392,29.975,30.212,29.645,30 -18:29:38,358.3925,30.002,30.239,29.639,30 -18:29:38,358.4507,29.975,30.239,28.705,30 -18:29:38,358.5037,29.949,30.239,29.161,30 -18:29:38,358.5551,29.923,30.239,29.602,30 -18:29:38,358.6085,30.002,30.16,30.044,30 -18:29:38,358.6597,29.975,30.212,30.039,30 -18:29:38,358.7092,30.002,30.239,29.604,30 -18:29:38,358.7605,29.975,30.239,28.67,30 -18:29:38,358.8115,29.949,30.239,29.127,30 -18:29:38,358.8625,29.975,30.239,29.568,30 -18:29:38,358.9121,29.949,30.292,29.115,30 -18:29:38,358.9618,29.949,30.239,28.645,30 -18:29:38,359.0123,29.975,30.212,29.55,30 -18:29:38,359.0661,29.949,30.265,29.562,30 -18:29:39,359.1170,30.002,30.212,29.091,30 -18:29:39,359.1680,30.028,30.212,29.085,30 -18:29:39,359.2171,29.949,30.239,28.632,30 -18:29:39,359.2649,30.002,30.212,29.519,30 -18:29:39,359.3126,29.949,30.212,29.067,30 -18:29:39,359.3622,29.975,30.239,29.973,30 -18:29:39,359.4131,30.002,30.239,29.056,30 -18:29:39,359.4622,29.975,30.265,28.586,30 -18:29:39,359.5125,29.975,30.239,28.596,30 -18:29:39,359.5616,29.949,30.239,29.037,30 -18:29:39,359.6102,29.949,30.239,29.478,30 -18:29:39,359.6546,29.975,30.239,29.473,30 -18:29:39,359.6976,29.975,30.239,29.021,30 -18:29:39,359.7406,29.949,30.265,29.015,30 -18:29:39,359.7852,29.923,30.239,29.01,30 -18:29:39,359.8272,29.975,30.239,29.899,30 -18:29:39,359.8715,29.949,30.239,29.001,30 -18:29:39,359.9152,29.949,30.292,29.443,30 -18:29:39,359.9631,29.975,30.239,28.527,30 -18:29:39,360.0103,29.975,30.239,28.984,30 -18:29:39,360.0572,29.949,30.239,28.979,30 -18:29:40,360.1036,29.949,30.239,29.42,30 -18:29:40,360.1456,29.975,30.212,29.415,30 -18:29:40,360.1879,29.949,30.239,29.428,30 -18:29:40,360.2331,29.975,30.239,29.406,30 -18:29:40,360.2845,29.975,30.212,28.954,30 -18:29:40,360.3287,30.002,30.212,29.412,30 -18:29:40,360.3716,30.002,30.212,28.943,30 -18:29:40,360.4172,29.949,30.212,28.938,30 -18:29:40,360.4599,29.949,30.239,29.844,30 -18:29:40,360.5035,29.949,30.239,29.376,30 -18:29:40,360.5524,29.949,30.265,29.371,30 -18:29:40,360.6255,29.949,30.239,28.917,30 -18:29:40,360.6885,29.975,30.212,29.357,30 -18:29:40,360.7407,29.949,30.212,29.367,30 -18:29:40,360.8007,30.002,30.212,29.809,30 -18:29:40,360.8520,29.949,30.239,28.892,30 -18:29:40,360.9073,29.923,30.212,29.332,30 -18:29:40,360.9595,30.002,30.239,30.238,30 -18:29:40,361.0107,29.949,30.212,28.41,30 -18:29:40,361.0621,29.975,30.265,29.78,30 -18:29:41,361.1100,29.975,30.212,28.416,30 -18:29:41,361.1603,29.975,30.212,29.321,30 -18:29:41,361.2147,29.949,30.265,29.316,30 -18:29:41,361.2676,29.975,30.212,28.845,30 -18:29:41,361.3228,29.949,30.239,29.303,30 -18:29:41,361.3726,29.949,30.239,29.28,30 -18:29:41,361.4234,29.949,30.186,29.275,30 -18:29:41,361.4726,29.975,30.212,30.181,30 -18:29:41,361.5228,29.949,30.239,29.283,30 -18:29:41,361.5732,29.975,30.186,29.26,30 -18:29:41,361.6236,29.949,30.212,29.72,30 -18:29:41,361.6715,29.949,30.239,29.715,30 -18:29:41,361.7193,29.949,30.239,29.246,30 -18:29:41,361.7660,29.975,30.212,29.241,30 -18:29:41,361.8131,29.949,30.212,29.253,30 -18:29:41,361.8572,29.923,30.239,29.695,30 -18:29:41,361.9047,29.949,30.212,29.674,30 -18:29:41,361.9500,29.975,30.212,29.687,30 -18:29:41,361.9927,29.975,30.212,29.236,30 -18:29:41,362.0374,29.975,30.239,29.231,30 -18:29:41,362.0811,29.949,30.239,28.762,30 -18:29:42,362.1236,29.949,30.239,29.204,30 -18:29:42,362.1757,29.949,30.212,29.199,30 -18:29:42,362.2214,29.975,30.212,29.658,30 -18:29:42,362.2652,29.923,30.186,29.207,30 -18:29:42,362.3091,29.975,30.212,30.543,30 -18:29:42,362.3533,29.949,30.239,29.199,30 -18:29:42,362.3986,29.975,30.239,29.177,30 -18:29:42,362.4458,29.949,30.239,28.725,30 -18:29:42,362.4896,29.975,30.239,29.167,30 -18:29:42,362.5337,29.923,30.239,28.715,30 -18:29:42,362.5768,29.975,30.212,29.604,30 -18:29:42,362.6232,29.949,30.239,29.17,30 -18:29:42,362.6681,29.949,30.212,29.148,30 -18:29:42,362.7116,29.975,30.212,29.607,30 -18:29:42,362.7577,29.949,30.212,29.156,30 -18:29:42,362.8034,29.949,30.212,29.598,30 -18:29:42,362.8474,29.975,30.239,29.594,30 -18:29:42,362.8908,29.923,30.239,28.679,30 -18:29:42,362.9375,29.975,30.186,29.567,30 -18:29:42,362.9799,29.975,30.265,29.58,30 -18:29:42,363.0226,29.923,30.212,28.218,30 -18:29:42,363.0674,29.949,30.212,30.018,30 -18:29:43,363.1122,29.923,30.239,29.567,30 -18:29:43,363.1557,29.949,30.186,29.546,30 -18:29:43,363.2026,29.975,30.212,30.006,30 -18:29:43,363.2457,29.949,30.212,29.108,30 -18:29:43,363.2895,29.975,30.239,29.551,30 -18:29:43,363.3345,29.949,30.212,28.635,30 -18:29:43,363.3798,29.949,30.239,29.541,30 -18:29:43,363.4234,29.975,30.212,29.073,30 -18:29:43,363.4696,29.975,30.239,29.085,30 -18:29:43,363.5115,29.975,30.212,28.616,30 -18:29:43,363.5561,29.949,30.239,29.075,30 -18:29:43,363.6011,29.949,30.239,29.053,30 -18:29:43,363.6448,29.949,30.239,29.048,30 -18:29:43,363.6888,29.975,30.239,29.044,30 -18:29:43,363.7353,29.975,30.212,28.592,30 -18:29:43,363.7787,29.975,30.212,29.05,30 -18:29:43,363.8213,29.975,30.186,29.046,30 -18:29:43,363.8633,29.923,30.239,29.488,30 -18:29:43,363.9062,29.975,30.212,29.467,30 -18:29:43,363.9532,29.949,30.212,29.033,30 -18:29:43,363.9977,30.002,30.239,29.476,30 -18:29:43,364.0400,29.949,30.212,28.096,30 -18:29:43,364.0848,29.975,30.239,29.466,30 -18:29:44,364.1287,29.975,30.239,28.55,30 -18:29:44,364.1725,29.949,30.212,28.545,30 -18:29:44,364.2171,30.002,30.186,29.451,30 -18:29:44,364.2621,29.975,30.212,28.982,30 -18:29:44,364.3060,29.923,30.212,28.995,30 -18:29:44,364.3518,29.975,30.212,29.884,30 -18:29:44,364.3960,29.949,30.16,28.986,30 -18:29:44,364.4384,29.923,30.212,30.323,30 -18:29:44,364.4834,29.923,30.212,29.873,30 -18:29:44,364.5273,29.949,30.212,29.87,30 -18:29:44,364.5737,29.949,30.239,29.419,30 -18:29:44,364.6194,29.975,30.212,28.951,30 -18:29:44,364.6628,29.975,30.239,28.963,30 -18:29:44,364.7055,29.975,30.212,28.494,30 -18:29:44,364.7495,29.923,30.212,28.953,30 -18:29:44,364.7933,29.923,30.212,29.843,30 -18:29:44,364.8374,29.975,30.239,29.839,30 -18:29:44,364.8815,29.897,30.239,28.477,30 -18:29:44,364.9271,29.949,30.212,29.813,30 -18:29:44,364.9748,29.949,30.212,29.38,30 -18:29:44,365.0207,29.949,30.212,29.375,30 -18:29:44,365.0682,29.949,30.186,29.371,30 -18:29:45,365.1174,29.949,30.239,29.814,30 -18:29:45,365.1640,29.923,30.212,28.899,30 -18:29:45,365.2097,29.949,30.212,29.805,30 -18:29:45,365.2534,29.949,30.212,29.354,30 -18:29:45,365.2970,29.975,30.212,29.351,30 -18:29:45,365.3387,30.028,30.16,28.899,30 -18:29:45,365.3845,29.949,30.186,28.878,30 -18:29:45,365.4286,29.949,30.212,29.784,30 -18:29:45,365.4720,29.923,30.212,29.334,30 -18:29:45,365.5171,29.949,30.212,29.777,30 -18:29:45,365.5612,29.949,30.239,29.326,30 -18:29:45,365.6062,29.975,30.212,28.858,30 -18:29:45,365.6506,29.923,30.239,28.87,30 -18:29:45,365.6940,29.949,30.212,29.295,30 -18:29:45,365.7388,29.949,30.239,29.309,30 -18:29:45,365.7846,29.949,30.212,28.84,30 -18:29:45,365.8281,29.949,30.212,29.3,30 -18:29:45,365.8724,29.923,30.239,29.296,30 -18:29:45,365.9214,29.975,30.212,29.274,30 -18:29:45,365.9658,29.975,30.212,28.84,30 -18:29:45,366.0109,29.923,30.239,28.835,30 -18:29:45,366.0562,29.949,30.239,29.26,30 -18:29:46,366.1019,29.949,30.239,28.809,30 -18:29:46,366.1452,29.975,30.212,28.804,30 -18:29:46,366.1886,29.949,30.212,28.816,30 -18:29:46,366.2336,29.975,30.212,29.259,30 -18:29:46,366.2777,29.923,30.239,28.808,30 -18:29:46,366.3221,29.949,30.239,29.233,30 -18:29:46,366.3665,29.949,30.212,28.782,30 -18:29:46,366.4111,29.949,30.212,29.241,30 -18:29:46,366.4556,29.975,30.212,29.237,30 -18:29:46,366.4985,29.975,30.239,28.786,30 -18:29:46,366.5416,29.949,30.212,28.317,30 -18:29:46,366.5980,29.949,30.186,29.223,30 -18:29:46,366.6628,29.923,30.212,29.665,30 -18:29:46,366.7178,29.949,30.212,29.66,30 -18:29:46,366.7798,29.975,30.239,29.209,30 -18:29:46,366.8429,29.949,30.239,28.291,30 -18:29:46,366.8948,29.923,30.186,28.731,30 -18:29:46,366.9467,29.975,30.212,30.084,30 -18:29:46,366.9997,29.949,30.212,28.739,30 -18:29:46,367.0517,29.949,30.212,29.181,30 -18:29:47,367.1043,29.949,30.239,29.176,30 -18:29:47,367.1561,29.949,30.212,28.707,30 -18:29:47,367.2068,29.949,30.212,29.166,30 -18:29:47,367.2567,29.949,30.239,29.161,30 -18:29:47,367.3088,29.923,30.212,28.692,30 -18:29:47,367.3557,29.975,30.239,29.598,30 -18:29:47,367.4102,29.949,30.212,28.236,30 -18:29:47,367.4613,29.975,30.212,29.141,30 -18:29:47,367.5145,29.949,30.212,28.689,30 -18:29:47,367.5685,29.949,30.212,29.131,30 -18:29:47,367.6232,29.949,30.186,29.125,30 -18:29:47,367.6759,29.923,30.239,29.568,30 -18:29:47,367.7296,29.949,30.265,29.099,30 -18:29:47,367.7890,29.949,30.239,28.2,30 -18:29:47,367.8451,29.949,30.239,28.64,30 -18:29:47,367.9015,29.897,30.186,28.634,30 -18:29:47,367.9624,29.949,30.239,30.434,30 -18:29:47,368.0204,29.897,30.212,28.625,30 -18:29:47,368.0768,29.949,30.212,29.978,30 -18:29:48,368.1316,29.949,30.212,29.08,30 -18:29:48,368.1914,30.028,30.212,29.075,30 -18:29:48,368.2459,29.975,30.239,27.71,30 -18:29:48,368.3066,29.923,30.212,28.15,30 -18:29:48,368.3612,29.949,30.239,29.501,30 -18:29:48,368.4110,29.949,30.265,28.586,30 -18:29:48,368.4674,29.923,30.239,28.133,30 -18:29:48,368.5268,29.975,30.212,29.021,30 -18:29:48,368.5837,29.923,30.212,28.585,30 -18:29:48,368.6409,29.949,30.212,29.474,30 -18:29:48,368.6967,29.975,30.239,29.022,30 -18:29:48,368.7538,29.923,30.212,28.105,30 -18:29:48,368.8073,29.949,30.212,29.457,30 -18:29:48,368.8721,29.923,30.239,29.006,30 -18:29:48,368.9258,29.975,30.212,28.983,30 -18:29:48,368.9721,29.923,30.212,28.548,30 -18:29:48,369.0303,29.949,30.186,29.437,30 -18:29:48,369.0883,29.923,30.212,29.433,30 -18:29:49,369.1472,29.949,30.239,29.428,30 -18:29:49,369.2015,29.949,30.212,28.512,30 -18:29:49,369.2636,29.949,30.239,28.97,30 -18:29:49,369.3258,29.949,30.239,28.5,30 -18:29:49,369.3876,29.949,30.212,28.493,30 -18:29:49,369.4346,29.949,30.212,28.951,30 -18:29:49,369.4925,29.949,30.212,28.947,30 -18:29:49,369.5502,29.949,30.212,28.942,30 -18:29:49,369.6100,29.949,30.212,28.936,30 -18:29:49,369.6610,29.949,30.265,28.931,30 -18:29:49,369.7180,29.923,30.239,28.014,30 -18:29:49,369.7711,29.949,30.212,28.902,30 -18:29:49,369.8326,30.002,30.212,28.914,30 -18:29:49,369.8917,29.949,30.186,27.997,30 -18:29:49,369.9553,29.949,30.212,29.349,30 -18:29:49,370.0114,29.949,30.212,28.897,30 -18:29:49,370.0679,29.923,30.239,28.891,30 -18:29:50,370.1236,29.949,30.212,28.869,30 -18:29:50,370.1776,29.975,30.239,28.881,30 -18:29:50,370.2296,29.949,30.212,27.964,30 -18:29:50,370.3098,29.923,30.212,28.87,30 -18:29:50,370.3741,29.949,30.212,29.31,30 -18:29:50,370.4242,29.923,30.239,28.858,30 -18:29:50,370.4815,29.949,30.212,28.836,30 -18:29:50,370.5281,29.949,30.239,28.848,30 -18:29:50,370.5705,29.923,30.239,28.379,30 -18:29:50,370.6139,29.975,30.212,28.822,30 -18:29:50,370.6572,29.949,30.212,28.388,30 -18:29:50,370.7008,29.949,30.186,28.83,30 -18:29:50,370.7438,29.975,30.239,29.273,30 -18:29:50,370.7880,29.923,30.212,27.911,30 -18:29:50,370.8312,29.949,30.265,29.265,30 -18:29:50,370.8743,29.949,30.16,27.903,30 -18:29:50,370.9208,29.897,30.212,29.703,30 -18:29:50,370.9664,29.949,30.265,29.7,30 -18:29:50,371.0093,29.949,30.186,27.892,30 -18:29:50,371.0536,29.949,30.239,29.245,30 -18:29:51,371.1002,29.949,30.212,28.33,30 -18:29:51,371.1427,29.923,30.212,28.789,30 -18:29:51,371.1866,29.923,30.186,29.233,30 -18:29:51,371.2335,29.923,30.239,29.676,30 -18:29:51,371.2780,29.949,30.212,28.762,30 -18:29:51,371.3215,29.923,30.212,28.775,30 -18:29:51,371.3667,29.949,30.212,29.218,30 -18:29:51,371.4106,29.949,30.212,28.767,30 -18:29:51,371.4545,29.949,30.212,28.763,30 -18:29:51,371.4989,29.923,30.212,28.759,30 -18:29:51,371.5434,29.923,30.212,29.202,30 -18:29:51,371.5902,29.949,30.265,29.199,30 -18:29:51,371.6365,29.975,30.212,27.837,30 -18:29:51,371.6950,29.923,30.239,28.295,30 -18:29:51,371.7422,29.923,30.186,28.719,30 -18:29:51,371.7887,29.949,30.212,29.626,30 -18:29:51,371.8350,29.923,30.212,28.729,30 -18:29:51,371.8785,29.949,30.239,29.172,30 -18:29:51,371.9234,29.949,30.212,28.257,30 -18:29:51,371.9700,29.923,30.212,28.717,30 -18:29:51,372.0158,29.949,30.212,29.16,30 -18:29:51,372.0605,29.949,30.212,28.709,30 -18:29:52,372.1055,29.949,30.239,28.705,30 -18:29:52,372.1530,29.923,30.186,28.236,30 -18:29:52,372.1974,29.949,30.186,29.59,30 -18:29:52,372.2395,29.949,30.212,29.14,30 -18:29:52,372.2836,29.949,30.212,28.69,30 -18:29:52,372.3256,29.949,30.212,28.686,30 -18:29:52,372.3695,29.949,30.186,28.682,30 -18:29:52,372.4141,29.949,30.212,29.125,30 -18:29:52,372.4578,29.975,30.239,28.674,30 -18:29:52,372.5017,29.949,30.212,27.759,30 -18:29:52,372.5473,30.002,30.16,28.665,30 -18:29:52,372.5915,29.923,30.16,28.644,30 -18:29:52,372.6360,29.975,30.239,29.998,30 -18:29:52,372.6783,29.923,30.186,27.743,30 -18:29:52,372.7218,29.949,30.212,29.544,30 -18:29:52,372.7691,29.949,30.186,28.647,30 -18:29:52,372.8125,30.002,30.212,29.089,30 -18:29:52,372.8538,29.923,30.186,27.727,30 -18:29:52,372.9029,29.949,30.239,29.528,30 -18:29:52,372.9491,29.923,30.212,28.166,30 -18:29:52,372.9953,29.949,30.186,29.073,30 -18:29:52,373.0422,29.949,30.239,29.069,30 -18:29:52,373.0927,29.897,30.212,28.154,30 -18:29:53,373.1395,29.923,30.186,29.507,30 -18:29:53,373.1843,29.975,30.212,29.504,30 -18:29:53,373.2281,29.975,30.212,28.16,30 -18:29:53,373.2726,29.949,30.186,28.155,30 -18:29:53,373.3189,29.923,30.186,29.045,30 -18:29:53,373.3628,29.923,30.212,29.489,30 -18:29:53,373.4093,29.923,30.186,29.039,30 -18:29:53,373.4554,29.975,30.16,29.482,30 -18:29:53,373.5027,29.87,30.239,29.032,30 -18:29:53,373.5482,29.949,30.212,29.476,30 -18:29:53,373.5944,29.923,30.212,28.579,30 -18:29:53,373.6386,29.923,30.186,29.022,30 -18:29:53,373.6854,29.923,30.186,29.465,30 -18:29:53,373.7297,29.949,30.186,29.462,30 -18:29:53,373.7747,29.923,30.186,29.012,30 -18:29:53,373.8197,29.949,30.212,29.456,30 -18:29:53,373.8631,29.949,30.186,28.559,30 -18:29:53,373.9077,29.949,30.186,29.002,30 -18:29:53,373.9543,29.897,30.186,28.999,30 -18:29:53,374.0004,29.923,30.16,29.89,30 -18:29:53,374.0426,29.949,30.186,29.887,30 -18:29:53,374.0865,29.949,30.212,28.991,30 -18:29:54,374.1309,29.949,30.212,28.541,30 -18:29:54,374.1744,29.923,30.239,28.536,30 -18:29:54,374.2192,29.949,30.186,28.515,30 -18:29:54,374.2646,29.923,30.265,28.976,30 -18:29:54,374.3082,29.923,30.186,28.06,30 -18:29:54,374.3527,29.949,30.186,29.414,30 -18:29:54,374.3957,29.949,30.186,28.965,30 -18:29:54,374.4383,29.923,30.186,28.961,30 -18:29:54,374.4822,29.949,30.212,29.405,30 -18:29:54,374.5269,29.975,30.212,28.508,30 -18:29:54,374.5744,29.949,30.186,28.057,30 -18:29:54,374.6196,29.923,30.186,28.946,30 -18:29:54,374.6662,29.949,30.186,29.39,30 -18:29:54,374.7104,29.923,30.212,28.94,30 -18:29:54,374.7551,29.923,30.186,28.936,30 -18:29:54,374.8020,29.949,30.212,29.38,30 -18:29:54,374.8464,29.949,30.186,28.483,30 -18:29:54,374.8903,29.949,30.212,28.926,30 -18:29:54,374.9382,29.923,30.186,28.475,30 -18:29:54,374.9821,29.949,30.212,29.365,30 -18:29:54,375.0241,29.923,30.186,28.468,30 -18:29:54,375.0677,29.923,30.212,29.358,30 -18:29:55,375.1108,29.949,30.16,28.909,30 -18:29:55,375.1530,29.975,30.186,29.352,30 -18:29:55,375.1965,29.949,30.212,28.456,30 -18:29:55,375.2422,29.949,30.212,28.452,30 -18:29:55,375.2918,29.923,30.212,28.447,30 -18:29:55,375.3358,29.975,30.239,28.89,30 -18:29:55,375.3791,29.923,30.212,27.528,30 -18:29:55,375.4237,29.949,30.186,28.881,30 -18:29:55,375.4688,29.949,30.186,28.878,30 -18:29:55,375.5126,29.949,30.186,28.874,30 -18:29:55,375.5666,29.923,30.186,28.871,30 -18:29:55,375.6271,29.949,30.212,29.314,30 -18:29:55,375.6778,29.949,30.186,28.416,30 -18:29:55,375.7316,29.923,30.239,28.858,30 -18:29:55,375.7847,29.923,30.212,28.39,30 -18:29:55,375.8354,29.923,30.239,28.849,30 -18:29:55,375.8854,29.949,30.186,28.381,30 -18:29:55,375.9371,29.923,30.186,28.841,30 -18:29:55,375.9878,29.949,30.212,29.284,30 -18:29:55,376.0377,29.949,30.186,28.386,30 -18:29:55,376.0897,29.923,30.186,28.829,30 -18:29:56,376.1464,29.949,30.186,29.272,30 -18:29:56,376.1943,29.923,30.212,28.821,30 -18:29:56,376.2425,29.975,30.212,28.818,30 -18:29:56,376.2938,29.949,30.186,27.919,30 -18:29:56,376.3428,29.949,30.186,28.808,30 -18:29:56,376.3918,29.975,30.186,28.805,30 -18:29:56,376.4427,29.923,30.186,28.354,30 -18:29:56,376.4924,29.975,30.212,29.243,30 -18:29:56,376.5420,29.923,30.186,27.899,30 -18:29:56,376.5926,29.975,30.212,29.235,30 -18:29:56,376.6435,29.897,30.212,27.89,30 -18:29:56,376.6894,29.923,30.186,29.227,30 -18:29:56,376.7366,29.949,30.186,29.224,30 -18:29:56,376.7848,29.923,30.212,28.774,30 -18:29:56,376.8345,29.949,30.186,28.77,30 -18:29:56,376.8787,29.975,30.212,28.766,30 -18:29:56,376.9245,29.923,30.212,27.868,30 -18:29:56,376.9704,29.923,30.212,28.758,30 -18:29:56,377.0147,29.923,30.212,28.754,30 -18:29:56,377.0577,29.923,30.212,28.751,30 -18:29:57,377.1018,29.949,30.212,28.748,30 -18:29:57,377.1543,29.949,30.186,28.297,30 -18:29:57,377.1987,29.923,30.212,28.739,30 -18:29:57,377.2448,30.002,30.16,28.736,30 -18:29:57,377.2896,29.949,30.186,28.268,30 -18:29:57,377.3333,29.975,30.212,28.728,30 -18:29:57,377.3775,29.923,30.186,27.831,30 -18:29:57,377.4214,29.923,30.212,29.167,30 -18:29:57,377.4664,29.923,30.212,28.718,30 -18:29:57,377.5105,29.949,30.186,28.714,30 -18:29:57,377.5534,29.923,30.186,28.711,30 -18:29:57,377.6008,29.975,30.239,29.155,30 -18:29:57,377.6465,29.949,30.239,27.346,30 -18:29:57,377.6908,30.002,30.186,27.787,30 -18:29:57,377.7354,29.975,30.16,27.782,30 -18:29:57,377.7795,29.949,30.186,28.689,30 -18:29:57,377.8247,29.949,30.186,28.686,30 -18:29:57,377.8686,29.923,30.212,28.682,30 -18:29:57,377.9122,30.002,30.212,28.679,30 -18:29:57,377.9589,29.923,30.239,27.317,30 -18:29:57,378.0014,29.949,30.186,28.206,30 -18:29:57,378.0446,29.949,30.212,28.666,30 -18:29:57,378.0865,29.949,30.212,28.215,30 -18:29:58,378.1322,29.923,30.186,28.212,30 -18:29:58,378.1746,29.975,30.186,29.102,30 -18:29:58,378.2209,29.897,30.212,28.205,30 -18:29:58,378.2666,29.923,30.212,29.095,30 -18:29:58,378.3108,29.949,30.186,28.645,30 -18:29:58,378.3571,29.923,30.239,28.641,30 -18:29:58,378.4071,29.923,30.16,28.174,30 -18:29:58,378.4515,30.002,30.186,29.528,30 -18:29:58,378.4985,29.923,30.212,27.72,30 -18:29:58,378.5428,29.923,30.212,28.626,30 -18:29:58,378.5864,29.949,30.212,28.623,30 -18:29:58,378.6320,29.949,30.186,28.173,30 -18:29:58,378.6754,29.897,30.186,28.616,30 -18:29:58,378.7196,29.949,30.212,29.506,30 -18:29:58,378.7682,29.923,30.212,28.163,30 -18:29:58,378.8146,29.975,30.186,28.606,30 -18:29:58,378.8600,29.897,30.186,28.155,30 -18:29:58,378.9063,29.923,30.186,29.492,30 -18:29:58,378.9553,29.949,30.186,29.043,30 -18:29:58,379.0015,29.975,30.186,28.593,30 -18:29:58,379.0465,29.923,30.186,28.142,30 -18:29:58,379.0917,29.923,30.186,29.032,30 -18:29:59,379.1367,29.923,30.212,29.029,30 -18:29:59,379.1837,29.949,30.186,28.579,30 -18:29:59,379.2302,29.923,30.186,28.576,30 -18:29:59,379.2748,29.923,30.212,29.019,30 -18:29:59,379.3221,29.923,30.212,28.569,30 -18:29:59,379.3732,29.949,30.186,28.565,30 -18:29:59,379.4297,29.923,30.212,28.562,30 -18:29:59,379.4754,29.923,30.212,28.557,30 -18:29:59,379.5254,29.923,30.186,28.554,30 -18:29:59,379.5705,29.923,30.186,28.997,30 -18:29:59,379.6181,29.923,30.212,28.994,30 -18:29:59,379.6657,29.949,30.186,28.544,30 -18:29:59,379.7132,29.949,30.16,28.541,30 -18:29:59,379.7596,29.949,30.212,28.984,30 -18:29:59,379.8046,29.923,30.239,28.087,30 -18:29:59,379.8515,29.949,30.186,28.065,30 -18:29:59,379.8986,29.897,30.212,28.526,30 -18:29:59,379.9458,29.949,30.186,28.969,30 -18:29:59,379.9908,29.923,30.186,28.519,30 -18:29:59,380.0375,29.949,30.212,28.963,30 -18:29:59,380.0836,29.949,30.16,28.065,30 -18:30:00,380.1319,29.975,30.186,28.956,30 -18:30:00,380.1766,29.923,30.212,28.058,30 -18:30:00,380.2205,29.923,30.239,28.501,30 -18:30:00,380.2669,29.923,30.212,28.033,30 -18:30:00,380.3120,29.949,30.212,28.494,30 -18:30:00,380.3583,29.949,30.16,28.043,30 -18:30:00,380.4045,29.87,30.186,28.933,30 -18:30:00,380.4508,29.949,30.212,29.842,30 -18:30:00,380.4958,29.949,30.186,28.034,30 -18:30:00,380.5429,29.923,30.212,28.477,30 -18:30:00,380.5896,29.949,30.186,28.474,30 -18:30:00,380.6366,29.923,30.186,28.47,30 -18:30:00,380.6831,30.002,30.212,28.914,30 -18:30:00,380.7282,29.923,30.186,27.105,30 -18:30:00,380.7740,29.923,30.186,28.905,30 -18:30:00,380.8257,29.897,30.16,28.902,30 -18:30:00,380.8684,29.923,30.212,29.793,30 -18:30:00,380.9186,29.949,30.186,28.45,30 -18:30:00,380.9646,29.949,30.212,28.447,30 -18:30:00,381.0098,29.949,30.212,27.996,30 -18:30:00,381.0546,29.923,30.212,27.992,30 -18:30:01,381.1023,29.949,30.186,28.435,30 -18:30:01,381.1513,29.949,30.212,28.431,30 -18:30:01,381.1975,29.949,30.212,27.98,30 -18:30:01,381.2435,29.949,30.212,27.976,30 -18:30:01,381.2887,29.923,30.212,27.972,30 -18:30:01,381.3350,29.949,30.186,28.415,30 -18:30:01,381.3813,29.949,30.186,28.411,30 -18:30:01,381.4267,29.923,30.212,28.408,30 -18:30:01,381.4783,30.002,30.212,28.404,30 -18:30:01,381.5242,29.949,30.212,27.042,30 -18:30:01,381.5718,29.923,30.186,27.948,30 -18:30:01,381.6189,29.949,30.212,28.837,30 -18:30:01,381.6659,29.844,30.212,27.94,30 -18:30:01,381.7107,29.975,30.186,29.742,30 -18:30:01,381.7558,29.949,30.186,27.935,30 -18:30:01,381.8024,29.923,30.212,28.378,30 -18:30:01,381.8508,29.975,30.186,28.374,30 -18:30:01,381.8970,29.949,30.186,27.923,30 -18:30:01,381.9446,29.897,30.212,28.366,30 -18:30:01,381.9913,29.923,30.212,28.81,30 -18:30:01,382.0368,29.897,30.239,28.359,30 -18:30:01,382.0827,29.923,30.186,28.339,30 -18:30:02,382.1264,29.923,30.212,28.8,30 -18:30:02,382.1694,29.949,30.212,28.35,30 -18:30:02,382.2140,29.897,30.212,27.899,30 -18:30:02,382.2576,29.923,30.186,28.789,30 -18:30:02,382.3033,29.975,30.186,28.787,30 -18:30:02,382.3488,29.923,30.186,27.89,30 -18:30:02,382.3939,29.923,30.186,28.78,30 -18:30:02,382.4384,29.923,30.186,28.777,30 -18:30:02,382.4837,29.923,30.212,28.774,30 -18:30:02,382.5279,29.923,30.186,28.324,30 -18:30:02,382.5745,29.975,30.212,28.768,30 -18:30:02,382.6209,29.949,30.212,27.423,30 -18:30:02,382.6687,29.923,30.265,27.866,30 -18:30:02,382.7163,29.975,30.186,27.397,30 -18:30:02,382.7594,29.975,30.239,27.856,30 -18:30:02,382.8025,29.923,30.186,26.941,30 -18:30:02,382.8465,29.923,30.186,28.741,30 -18:30:02,382.8899,29.975,30.186,28.738,30 -18:30:02,382.9372,29.949,30.212,27.841,30 -18:30:02,382.9845,29.87,30.186,27.837,30 -18:30:02,383.0325,29.975,30.186,29.639,30 -18:30:02,383.0765,29.975,30.186,27.831,30 -18:30:03,383.1196,29.923,30.16,27.827,30 -18:30:03,383.1647,29.949,30.186,29.165,30 -18:30:03,383.2078,29.975,30.186,28.268,30 -18:30:03,383.2526,29.923,30.186,27.818,30 -18:30:03,383.2974,29.923,30.186,28.708,30 -18:30:03,383.3416,29.923,30.186,28.705,30 -18:30:03,383.3857,30.002,30.133,28.702,30 -18:30:03,383.4318,29.923,30.186,28.252,30 -18:30:03,383.4776,29.923,30.16,28.696,30 -18:30:03,383.5231,29.949,30.186,29.14,30 -18:30:03,383.5702,29.897,30.212,28.244,30 -18:30:03,383.6185,29.923,30.186,28.687,30 -18:30:03,383.6664,29.949,30.186,28.684,30 -18:30:03,383.7114,29.949,30.186,28.234,30 -18:30:03,383.7586,29.975,30.16,28.231,30 -18:30:03,383.8038,29.87,30.186,28.227,30 -18:30:03,383.8523,29.949,30.16,29.582,30 -18:30:03,383.8995,29.923,30.186,28.669,30 -18:30:03,383.9491,29.923,30.212,28.666,30 -18:30:03,383.9940,29.949,30.16,28.216,30 -18:30:03,384.0387,29.949,30.186,28.66,30 -18:30:03,384.0852,29.975,30.186,28.21,30 -18:30:04,384.1336,29.949,30.212,27.759,30 -18:30:04,384.1809,30.028,30.186,27.754,30 -18:30:04,384.2273,29.975,30.16,26.838,30 -18:30:04,384.2736,29.923,30.186,28.191,30 -18:30:04,384.3203,29.949,30.212,28.635,30 -18:30:04,384.3695,29.923,30.186,27.738,30 -18:30:04,384.4171,29.975,30.16,28.628,30 -18:30:04,384.4637,29.923,30.212,28.178,30 -18:30:04,384.5103,29.923,30.212,28.174,30 -18:30:04,384.5574,29.923,30.186,28.17,30 -18:30:04,384.6066,29.897,30.16,28.614,30 -18:30:04,384.6536,29.923,30.186,29.505,30 -18:30:04,384.7002,29.975,30.186,28.609,30 -18:30:04,384.7447,29.897,30.186,27.712,30 -18:30:04,384.7920,29.949,30.16,29.05,30 -18:30:04,384.8383,29.923,30.16,28.6,30 -18:30:04,384.8849,29.923,30.186,29.044,30 -18:30:04,384.9334,29.923,30.16,28.595,30 -18:30:04,384.9779,29.949,30.212,29.039,30 -18:30:04,385.0228,29.923,30.212,27.696,30 -18:30:04,385.0713,29.923,30.186,28.139,30 -18:30:05,385.1186,29.949,30.186,28.582,30 -18:30:05,385.1670,29.949,30.212,28.132,30 -18:30:05,385.2134,29.949,30.186,27.681,30 -18:30:05,385.2588,29.949,30.212,28.124,30 -18:30:05,385.3038,29.923,30.186,27.673,30 -18:30:05,385.3500,29.923,30.16,28.563,30 -18:30:05,385.3966,29.923,30.186,29.008,30 -18:30:05,385.4421,29.949,30.16,28.558,30 -18:30:05,385.4877,29.897,30.186,28.556,30 -18:30:05,385.5362,29.923,30.16,29.0,30 -18:30:05,385.5831,29.923,30.186,28.998,30 -18:30:05,385.6280,29.949,30.186,28.548,30 -18:30:05,385.6737,29.923,30.212,28.098,30 -18:30:05,385.7195,29.975,30.16,28.095,30 -18:30:05,385.7669,29.923,30.212,28.091,30 -18:30:05,385.8113,29.897,30.212,28.088,30 -18:30:05,385.8567,29.897,30.186,28.531,30 -18:30:05,385.9023,29.897,30.16,28.976,30 -18:30:05,385.9531,29.897,30.16,29.421,30 -18:30:05,386.0002,29.897,30.186,29.419,30 -18:30:05,386.0462,29.897,30.186,28.97,30 -18:30:05,386.0912,29.923,30.16,28.968,30 -18:30:06,386.1354,29.923,30.16,28.966,30 -18:30:06,386.1807,29.923,30.186,28.964,30 -18:30:06,386.2259,29.949,30.133,28.514,30 -18:30:06,386.2727,29.87,30.186,28.976,30 -18:30:06,386.3185,29.897,30.186,29.421,30 -18:30:06,386.3655,29.949,30.186,28.955,30 -18:30:06,386.4131,29.923,30.16,28.059,30 -18:30:06,386.4586,29.897,30.16,28.949,30 -18:30:06,386.5047,29.897,30.186,29.394,30 -18:30:06,386.5598,29.897,30.186,28.945,30 -18:30:06,386.6074,29.923,30.16,28.943,30 -18:30:06,386.6542,29.897,30.186,28.941,30 -18:30:06,386.7024,29.897,30.16,28.939,30 -18:30:06,386.7503,29.923,30.16,29.383,30 -18:30:06,386.7973,29.897,30.186,28.935,30 -18:30:06,386.8435,29.923,30.16,28.932,30 -18:30:06,386.8898,29.897,30.16,28.93,30 -18:30:06,386.9401,29.87,30.16,29.375,30 -18:30:06,386.9870,29.818,30.186,29.838,30 -18:30:06,387.0328,29.87,30.186,30.284,30 -18:30:06,387.0784,29.949,30.16,29.39,30 -18:30:07,387.1237,29.897,30.16,28.477,30 -18:30:07,387.1693,29.897,30.16,29.369,30 -18:30:07,387.2163,29.897,30.16,29.367,30 -18:30:07,387.2631,29.844,30.186,29.366,30 -18:30:07,387.3091,29.923,30.16,29.828,30 -18:30:07,387.3551,29.897,30.16,28.916,30 -18:30:07,387.4044,29.897,30.186,29.361,30 -18:30:07,387.4505,29.949,30.16,28.912,30 -18:30:07,387.4980,29.975,30.186,28.463,30 -18:30:07,387.5439,29.897,30.16,27.566,30 -18:30:07,387.5904,29.897,30.16,29.35,30 -18:30:07,387.6359,29.923,30.16,29.348,30 -18:30:07,387.6816,29.923,30.16,28.9,30 -18:30:07,387.7280,29.897,30.186,28.898,30 -18:30:07,387.7741,29.949,30.16,28.895,30 -18:30:07,387.8195,29.949,30.16,28.446,30 -18:30:07,387.8677,29.923,30.133,28.443,30 -18:30:07,387.9162,29.923,30.16,29.352,30 -18:30:07,387.9624,29.897,30.16,28.886,30 -18:30:07,388.0088,29.923,30.16,29.331,30 -18:30:07,388.0542,29.923,30.16,28.882,30 -18:30:08,388.1019,29.923,30.16,28.88,30 -18:30:08,388.1495,29.923,30.16,28.878,30 -18:30:08,388.1942,29.923,30.133,28.876,30 -18:30:08,388.2405,29.897,30.107,29.338,30 -18:30:08,388.2854,29.949,30.186,30.231,30 -18:30:08,388.3325,29.949,30.212,27.978,30 -18:30:08,388.3796,29.897,30.212,27.527,30 -18:30:08,388.4264,29.897,30.16,28.417,30 -18:30:08,388.4746,29.87,30.16,29.308,30 -18:30:08,388.5208,29.923,30.16,29.771,30 -18:30:08,388.5675,29.923,30.16,28.859,30 -18:30:08,388.6147,29.923,30.16,28.857,30 -18:30:08,388.6614,29.897,30.16,28.854,30 -18:30:08,388.7075,29.897,30.186,29.299,30 -18:30:08,388.7532,29.923,30.186,28.851,30 -18:30:08,388.8007,29.897,30.16,28.401,30 -18:30:08,388.8465,29.897,30.133,29.293,30 -18:30:08,388.8921,29.897,30.16,29.756,30 -18:30:08,388.9407,29.87,30.186,29.29,30 -18:30:08,388.9868,29.897,30.107,29.306,30 -18:30:08,389.0357,29.923,30.186,30.199,30 -18:30:08,389.0830,29.897,30.107,28.393,30 -18:30:09,389.1300,29.897,30.16,30.196,30 -18:30:09,389.1765,29.923,30.16,29.284,30 -18:30:09,389.2220,29.897,30.16,28.835,30 -18:30:09,389.2720,29.897,30.16,29.28,30 -18:30:09,389.3204,29.923,30.16,29.279,30 -18:30:09,389.3691,29.897,30.16,28.83,30 -18:30:09,389.4175,29.897,30.16,29.275,30 -18:30:09,389.4637,29.897,30.16,29.273,30 -18:30:09,389.5091,29.897,30.16,29.272,30 -18:30:09,389.5561,29.897,30.186,29.27,30 -18:30:09,389.6035,29.923,30.16,28.822,30 -18:30:09,389.6518,29.923,30.16,28.819,30 -18:30:09,389.6995,29.897,30.212,28.817,30 -18:30:09,389.7472,29.897,30.16,28.368,30 -18:30:09,389.7947,29.897,30.16,29.259,30 -18:30:09,389.8406,29.923,30.133,29.257,30 -18:30:09,389.8875,29.87,30.16,29.273,30 -18:30:09,389.9388,29.87,30.133,29.719,30 -18:30:09,389.9865,29.897,30.16,30.182,30 -18:30:09,390.0327,29.87,30.16,29.254,30 -18:30:09,390.0806,29.87,30.16,29.716,30 -18:30:10,390.1250,29.897,30.107,29.716,30 -18:30:10,390.1716,29.87,30.16,30.162,30 -18:30:10,390.2193,29.897,30.133,29.715,30 -18:30:10,390.2762,29.923,30.16,29.714,30 -18:30:10,390.3243,29.897,30.133,28.801,30 -18:30:10,390.3717,29.897,30.16,29.71,30 -18:30:10,390.4198,29.897,30.133,29.245,30 -18:30:10,390.4657,29.87,30.16,29.708,30 -18:30:10,390.5108,29.897,30.133,29.707,30 -18:30:10,390.5596,29.897,30.16,29.706,30 -18:30:10,390.6228,29.87,30.212,29.241,30 -18:30:10,390.6838,29.897,30.16,28.809,30 -18:30:10,390.7380,29.87,30.16,29.236,30 -18:30:10,390.8037,29.897,30.133,29.699,30 -18:30:10,390.8582,29.923,30.16,29.698,30 -18:30:10,390.9187,29.897,30.16,28.785,30 -18:30:10,390.9827,29.949,30.133,29.229,30 -18:30:10,391.0412,29.87,30.133,28.797,30 -18:30:11,391.0986,29.897,30.16,30.153,30 -18:30:11,391.1513,29.87,30.16,29.224,30 -18:30:11,391.2055,29.818,30.16,29.687,30 -18:30:11,391.2609,29.897,30.16,30.581,30 -18:30:11,391.3102,29.897,30.133,29.222,30 -18:30:11,391.3644,29.897,30.16,29.685,30 -18:30:11,391.4210,29.897,30.16,29.22,30 -18:30:11,391.4741,29.897,30.16,29.218,30 -18:30:11,391.5289,29.897,30.107,29.216,30 -18:30:11,391.5849,29.87,30.133,30.126,30 -18:30:11,391.6359,29.897,30.186,30.143,30 -18:30:11,391.6878,29.897,30.16,28.767,30 -18:30:11,391.7384,29.844,30.16,29.212,30 -18:30:11,391.7896,29.897,30.133,30.122,30 -18:30:11,391.8377,29.897,30.133,29.674,30 -18:30:11,391.8837,29.87,30.16,29.674,30 -18:30:11,391.9298,29.897,30.16,29.673,30 -18:30:11,391.9763,29.897,30.133,29.208,30 -18:30:11,392.0215,29.87,30.16,29.67,30 -18:30:11,392.0676,29.897,30.16,29.67,30 -18:30:12,392.1151,29.87,30.133,29.205,30 -18:30:12,392.1674,29.87,30.16,30.132,30 -18:30:12,392.2144,29.87,30.16,29.667,30 -18:30:12,392.2605,29.897,30.081,29.666,30 -18:30:12,392.3054,29.87,30.16,30.56,30 -18:30:12,392.3526,29.87,30.16,29.666,30 -18:30:12,392.4008,29.87,30.16,29.665,30 -18:30:12,392.4493,29.87,30.16,29.665,30 -18:30:12,392.4937,29.897,30.133,29.664,30 -18:30:12,392.5390,29.923,30.16,29.663,30 -18:30:12,392.5865,29.87,30.16,28.751,30 -18:30:12,392.6334,29.949,30.107,29.66,30 -18:30:12,392.6822,29.897,30.16,29.212,30 -18:30:12,392.7271,29.87,30.16,29.193,30 -18:30:12,392.7749,29.897,30.107,29.656,30 -18:30:12,392.8192,29.923,30.133,30.103,30 -18:30:12,392.8662,29.897,30.186,29.208,30 -18:30:12,392.9128,29.897,30.16,28.742,30 -18:30:12,392.9627,29.87,30.133,29.187,30 -18:30:12,393.0073,29.844,30.186,30.114,30 -18:30:12,393.0511,29.897,30.16,29.65,30 -18:30:13,393.0967,29.87,30.16,29.185,30 -18:30:13,393.1409,29.87,30.107,29.648,30 -18:30:13,393.1847,29.844,30.16,30.559,30 -18:30:13,393.2308,29.87,30.16,30.095,30 -18:30:13,393.2749,29.844,30.133,29.648,30 -18:30:13,393.3190,29.87,30.16,30.558,30 -18:30:13,393.3665,29.923,30.133,29.647,30 -18:30:13,393.4126,29.897,30.107,29.199,30 -18:30:13,393.4565,29.87,30.133,30.092,30 -18:30:13,393.5007,29.897,30.133,30.109,30 -18:30:13,393.5480,29.87,30.133,29.645,30 -18:30:13,393.5943,29.87,30.133,30.108,30 -18:30:13,393.6387,29.87,30.133,30.108,30 -18:30:13,393.6862,29.87,30.16,30.108,30 -18:30:13,393.7318,29.897,30.16,29.644,30 -18:30:13,393.7765,29.897,30.133,29.179,30 -18:30:13,393.8222,29.87,30.133,29.642,30 -18:30:13,393.8644,29.897,30.133,30.105,30 -18:30:13,393.9097,29.897,30.16,29.641,30 -18:30:13,393.9589,29.897,30.133,29.176,30 -18:30:13,394.0043,29.897,30.133,29.638,30 -18:30:13,394.0510,29.87,30.133,29.638,30 -18:30:14,394.0974,29.897,30.133,30.101,30 -18:30:14,394.1437,29.897,30.133,29.637,30 -18:30:14,394.1913,29.87,30.16,29.636,30 -18:30:14,394.2368,29.87,30.16,29.635,30 -18:30:14,394.2830,29.897,30.133,29.634,30 -18:30:14,394.3281,29.87,30.16,29.634,30 -18:30:14,394.3743,29.87,30.16,29.633,30 -18:30:14,394.4207,29.897,30.133,29.632,30 -18:30:14,394.4676,29.87,30.107,29.631,30 -18:30:14,394.5142,29.87,30.186,30.542,30 -18:30:14,394.5580,29.87,30.133,29.184,30 -18:30:14,394.6026,29.87,30.133,30.094,30 -18:30:14,394.6486,29.87,30.133,30.094,30 -18:30:14,394.6933,29.897,30.081,30.094,30 -18:30:14,394.7388,29.897,30.133,30.524,30 -18:30:14,394.7830,29.897,30.107,29.63,30 -18:30:14,394.8311,29.897,30.16,30.076,30 -18:30:14,394.8780,29.87,30.133,29.165,30 -18:30:14,394.9245,29.844,30.133,30.092,30 -18:30:14,394.9715,29.844,30.186,30.539,30 -18:30:14,395.0181,29.87,30.107,29.628,30 -18:30:14,395.0652,29.844,30.16,30.539,30 -18:30:15,395.1120,29.897,30.133,30.075,30 -18:30:15,395.1636,29.897,30.133,29.628,30 -18:30:15,395.2073,29.87,30.133,29.627,30 -18:30:15,395.2495,29.87,30.133,30.09,30 -18:30:15,395.2968,29.897,30.133,30.09,30 -18:30:15,395.3438,29.844,30.133,29.626,30 -18:30:15,395.3895,29.87,30.107,30.537,30 -18:30:15,395.4340,29.897,30.107,30.537,30 -18:30:15,395.4804,29.897,30.133,30.073,30 -18:30:15,395.5247,29.87,30.16,29.626,30 -18:30:15,395.5684,29.87,30.133,29.625,30 -18:30:15,395.6151,29.87,30.133,30.089,30 -18:30:15,395.6603,29.818,30.133,30.089,30 -18:30:15,395.7067,29.844,30.107,30.983,30 -18:30:15,395.7511,29.897,30.133,30.984,30 -18:30:15,395.7976,29.87,30.16,29.627,30 -18:30:15,395.8436,29.897,30.133,29.626,30 -18:30:15,395.8880,29.897,30.133,29.625,30 -18:30:15,395.9368,29.897,30.107,29.625,30 -18:30:15,395.9845,29.87,30.081,30.071,30 -18:30:15,396.0322,29.897,30.107,30.983,30 -18:30:15,396.0780,29.87,30.16,30.072,30 -18:30:16,396.1220,29.87,30.107,29.625,30 -18:30:16,396.1691,29.87,30.133,30.536,30 -18:30:16,396.2155,29.87,30.133,30.089,30 -18:30:16,396.2601,29.897,30.133,30.089,30 -18:30:16,396.3058,29.897,30.133,29.625,30 -18:30:16,396.3515,29.844,30.107,29.624,30 -18:30:16,396.3993,29.844,30.133,30.982,30 -18:30:16,396.4482,29.87,30.133,30.536,30 -18:30:16,396.4924,29.87,30.107,30.089,30 -18:30:16,396.5370,29.844,30.133,30.536,30 -18:30:16,396.5850,29.87,30.16,30.537,30 -18:30:16,396.6328,29.87,30.133,29.626,30 -18:30:16,396.6790,29.87,30.16,30.09,30 -18:30:16,396.7245,29.844,30.133,29.625,30 -18:30:16,396.7707,29.87,30.133,30.536,30 -18:30:16,396.8170,29.897,30.107,30.089,30 -18:30:16,396.8645,29.87,30.133,30.072,30 -18:30:16,396.9122,29.923,30.107,30.089,30 -18:30:16,396.9588,29.897,30.107,29.625,30 -18:30:16,397.0034,29.87,30.133,30.071,30 -18:30:16,397.0488,29.87,30.133,30.088,30 -18:30:16,397.0930,29.87,30.133,30.088,30 -18:30:17,397.1374,29.87,30.16,30.088,30 -18:30:17,397.1856,29.923,30.133,29.624,30 -18:30:17,397.2316,29.87,30.133,29.176,30 -18:30:17,397.2753,29.844,30.133,30.086,30 -18:30:17,397.3188,29.923,30.054,30.533,30 -18:30:17,397.3655,29.87,30.133,30.533,30 -18:30:17,397.4148,29.87,30.133,30.087,30 -18:30:17,397.4626,29.87,30.133,30.087,30 -18:30:17,397.5074,29.87,30.107,30.087,30 -18:30:17,397.5542,29.87,30.107,30.534,30 -18:30:17,397.6023,29.87,30.133,30.534,30 -18:30:17,397.6482,29.818,30.133,30.088,30 -18:30:17,397.6924,29.87,30.107,30.982,30 -18:30:17,397.7402,29.87,30.107,30.536,30 -18:30:17,397.7863,29.87,30.107,30.537,30 -18:30:17,397.8322,29.87,30.107,30.537,30 -18:30:17,397.8770,29.87,30.107,30.538,30 -18:30:17,397.9222,29.844,30.107,30.538,30 -18:30:17,397.9681,29.87,30.133,30.986,30 -18:30:17,398.0141,29.87,30.133,30.093,30 -18:30:17,398.0620,29.897,30.081,30.093,30 -18:30:18,398.1073,29.897,30.107,30.523,30 -18:30:18,398.1544,29.844,30.107,30.076,30 -18:30:18,398.1993,29.87,30.107,30.988,30 -18:30:18,398.2471,29.844,30.133,30.542,30 -18:30:18,398.2923,29.897,30.133,30.543,30 -18:30:18,398.3381,29.897,30.107,29.632,30 -18:30:18,398.3854,29.897,30.107,30.078,30 -18:30:18,398.4336,29.87,30.133,30.078,30 -18:30:18,398.4798,29.87,30.133,30.095,30 -18:30:18,398.5244,29.87,30.133,30.095,30 -18:30:18,398.5692,29.897,30.107,30.095,30 -18:30:18,398.6143,29.897,30.133,30.078,30 -18:30:18,398.6607,29.87,30.107,29.63,30 -18:30:18,398.7057,29.87,30.107,30.541,30 -18:30:18,398.7506,29.87,30.107,30.542,30 -18:30:18,398.7971,29.87,30.107,30.542,30 -18:30:18,398.8425,29.87,30.107,30.543,30 -18:30:18,398.8874,29.87,30.107,30.544,30 -18:30:18,398.9357,29.87,30.133,30.544,30 -18:30:18,398.9841,29.87,30.107,30.098,30 -18:30:18,399.0348,29.897,30.133,30.545,30 -18:30:18,399.0873,29.844,30.107,29.634,30 -18:30:19,399.1380,29.844,30.133,30.992,30 -18:30:19,399.1909,29.844,30.133,30.546,30 -18:30:19,399.2433,29.844,30.133,30.547,30 -18:30:19,399.2945,29.818,30.107,30.547,30 -18:30:19,399.3404,29.818,30.133,31.442,30 -18:30:19,399.3874,29.844,30.133,30.997,30 -18:30:19,399.4341,29.87,30.107,30.551,30 -18:30:19,399.4800,29.87,30.081,30.552,30 -18:30:19,399.5254,29.87,30.107,31.0,30 -18:30:19,399.5707,29.87,30.107,30.554,30 -18:30:19,399.6170,29.897,30.107,30.554,30 -18:30:19,399.6630,29.844,30.133,30.091,30 -18:30:19,399.7099,29.87,30.16,30.555,30 -18:30:19,399.7547,29.897,30.107,29.644,30 -18:30:19,399.7996,29.844,30.133,30.09,30 -18:30:19,399.8461,29.87,30.107,30.555,30 -18:30:19,399.8904,29.87,30.107,30.555,30 -18:30:19,399.9385,29.897,30.133,30.556,30 -18:30:19,399.9826,29.87,30.133,29.645,30 -18:30:19,400.0298,29.87,30.107,30.108,30 -18:30:19,400.0765,29.897,30.107,30.556,30 -18:30:20,400.1226,29.87,30.107,30.092,30 -18:30:20,400.1668,29.87,30.133,30.556,30 -18:30:20,400.2143,29.87,30.133,30.109,30 -18:30:20,400.2635,29.818,30.133,30.109,30 -18:30:20,400.3212,29.87,30.107,31.004,30 -18:30:20,400.3732,29.818,30.107,30.558,30 -18:30:20,400.4203,29.87,30.133,31.453,30 -18:30:20,400.4666,29.844,30.107,30.114,30 -18:30:20,400.5127,29.897,30.133,31.008,30 -18:30:20,400.5573,29.87,30.133,29.65,30 -18:30:20,400.6027,29.87,30.16,30.114,30 -18:30:20,400.6503,29.87,30.133,29.65,30 -18:30:20,400.6981,29.87,30.107,30.113,30 -18:30:20,400.7467,29.844,30.081,30.56,30 -18:30:20,400.7916,29.87,30.107,31.455,30 -18:30:20,400.8380,29.844,30.081,30.563,30 -18:30:20,400.8823,29.844,30.133,31.458,30 -18:30:20,400.9317,29.844,30.107,30.566,30 -18:30:20,400.9795,29.818,30.107,31.013,30 -18:30:20,401.0247,29.87,30.081,31.462,30 -18:30:20,401.0708,29.818,30.081,31.017,30 -18:30:21,401.1153,29.844,30.133,31.912,30 -18:30:21,401.1632,29.844,30.054,30.573,30 -18:30:21,401.2077,29.87,30.081,31.933,30 -18:30:21,401.2535,29.818,30.081,31.024,30 -18:30:21,401.2998,29.818,30.081,31.92,30 -18:30:21,401.3462,29.791,30.054,31.922,30 -18:30:21,401.3912,29.87,30.133,32.854,30 -18:30:21,401.4372,29.791,30.107,30.14,30 -18:30:21,401.4853,29.844,30.054,31.946,30 -18:30:21,401.5315,29.844,30.107,31.949,30 -18:30:21,401.5804,29.818,30.081,31.04,30 -18:30:21,401.6265,29.818,30.054,31.936,30 -18:30:21,401.6706,29.818,30.054,32.403,30 -18:30:21,401.7148,29.844,30.081,32.406,30 -18:30:21,401.7631,29.818,30.028,31.498,30 -18:30:21,401.8077,29.791,30.054,32.859,30 -18:30:21,401.8524,29.844,30.054,32.88,30 -18:30:21,401.8996,29.818,30.054,31.972,30 -18:30:21,401.9473,29.844,30.054,32.422,30 -18:30:21,401.9918,29.791,30.054,31.978,30 -18:30:21,402.0374,29.791,30.028,32.893,30 -18:30:21,402.0840,29.87,30.028,33.344,30 -18:30:22,402.1303,29.87,30.028,31.99,30 -18:30:22,402.1793,29.818,30.054,31.993,30 -18:30:22,402.2245,29.818,30.028,32.443,30 -18:30:22,402.2723,29.818,30.028,32.893,30 -18:30:22,402.3173,29.818,30.028,32.897,30 -18:30:22,402.3636,29.791,30.028,32.901,30 -18:30:22,402.4123,29.765,30.054,33.37,30 -18:30:22,402.4563,29.765,30.028,33.375,30 -18:30:22,402.5020,29.791,30.054,33.826,30 -18:30:22,402.5488,29.897,30.028,32.938,30 -18:30:22,402.5972,29.818,30.028,31.566,30 -18:30:22,402.6455,29.818,30.054,32.927,30 -18:30:22,402.6905,29.791,30.002,32.484,30 -18:30:22,402.7367,29.791,29.975,33.846,30 -18:30:22,402.7822,29.818,30.002,34.316,30 -18:30:22,402.8278,29.791,30.028,33.393,30 -18:30:22,402.8715,29.791,30.002,33.415,30 -18:30:22,402.9163,29.765,30.002,33.866,30 -18:30:22,402.9636,29.791,30.002,34.319,30 -18:30:22,403.0104,29.818,30.002,33.878,30 -18:30:22,403.0555,29.765,30.002,33.419,30 -18:30:23,403.1006,29.765,30.002,34.335,30 -18:30:23,403.1455,29.818,30.002,34.341,30 -18:30:23,403.1907,29.818,30.002,33.436,30 -18:30:23,403.2364,29.791,30.028,33.44,30 -18:30:23,403.2824,29.765,30.028,33.462,30 -18:30:23,403.3290,29.765,30.002,33.914,30 -18:30:23,403.3729,29.818,29.975,34.367,30 -18:30:23,403.4183,29.765,30.028,33.925,30 -18:30:23,403.4626,29.765,30.002,33.931,30 -18:30:23,403.5106,29.791,29.975,34.383,30 -18:30:23,403.5544,29.765,30.002,34.407,30 -18:30:23,403.5992,29.791,30.002,34.396,30 -18:30:23,403.6444,29.818,30.002,33.954,30 -18:30:23,403.6891,29.765,29.975,33.495,30 -18:30:23,403.7323,29.791,30.002,34.876,30 -18:30:23,403.7760,29.844,29.975,33.971,30 -18:30:23,403.8206,29.791,30.002,33.529,30 -18:30:23,403.8654,29.791,29.975,33.98,30 -18:30:23,403.9140,29.87,29.975,34.45,30 -18:30:23,403.9614,29.765,29.975,33.098,30 -18:30:23,404.0052,29.791,30.002,34.908,30 -18:30:23,404.0495,29.765,30.028,34.003,30 -18:30:24,404.0965,29.844,30.002,34.008,30 -18:30:24,404.1516,29.818,30.028,33.102,30 -18:30:24,404.1969,29.765,29.949,33.107,30 -18:30:24,404.2446,29.791,30.002,35.381,30 -18:30:24,404.2934,29.765,30.002,34.03,30 -18:30:24,404.3388,29.791,29.975,34.483,30 -18:30:24,404.3863,29.818,30.002,34.506,30 -18:30:24,404.4340,29.791,30.002,33.584,30 -18:30:24,404.4820,29.765,30.028,34.053,30 -18:30:24,404.5299,29.765,29.949,34.059,30 -18:30:24,404.5764,29.791,30.002,35.423,30 -18:30:24,404.6224,29.739,30.002,34.072,30 -18:30:24,404.6695,29.765,30.002,34.972,30 -18:30:24,404.7225,29.791,29.975,34.532,30 -18:30:24,404.7757,29.765,29.975,34.556,30 -18:30:24,404.8226,29.765,30.002,35.011,30 -18:30:24,404.8705,29.844,29.949,34.553,30 -18:30:24,404.9165,29.791,29.949,34.112,30 -18:30:24,404.9659,29.791,29.949,35.029,30 -18:30:24,405.0133,29.791,29.975,35.037,30 -18:30:24,405.0619,29.765,29.949,34.596,30 -18:30:25,405.1074,29.739,29.949,35.497,30 -18:30:25,405.1534,29.791,29.975,35.952,30 -18:30:25,405.2011,29.765,29.949,34.619,30 -18:30:25,405.2486,29.791,29.949,35.519,30 -18:30:25,405.3016,29.765,29.949,35.08,30 -18:30:25,405.3498,29.765,29.949,35.535,30 -18:30:25,405.3978,29.765,29.949,35.543,30 -18:30:25,405.4445,29.765,29.949,35.551,30 -18:30:25,405.4889,29.765,29.949,35.558,30 -18:30:25,405.5346,29.818,29.949,35.566,30 -18:30:25,405.5866,29.739,29.975,34.662,30 -18:30:25,405.6478,29.765,29.923,35.581,30 -18:30:25,405.7100,29.765,29.975,36.038,30 -18:30:25,405.7644,29.791,29.949,35.154,30 -18:30:25,405.8237,29.765,29.975,35.162,30 -18:30:25,405.8736,29.739,29.923,35.171,30 -18:30:25,405.9397,29.791,29.87,36.521,30 -18:30:25,405.9955,29.791,29.975,36.55,30 -18:30:25,406.0504,29.739,29.949,34.754,30 -18:30:26,406.1074,29.791,29.949,36.104,30 -18:30:26,406.1611,29.765,29.949,35.219,30 -18:30:26,406.2128,29.739,29.923,35.674,30 -18:30:26,406.2641,29.765,29.923,36.577,30 -18:30:26,406.3153,29.791,29.923,36.14,30 -18:30:26,406.3665,29.765,29.949,35.702,30 -18:30:26,406.4198,29.791,29.923,35.71,30 -18:30:26,406.4699,29.791,29.949,35.719,30 -18:30:26,406.5212,29.818,29.975,35.28,30 -18:30:26,406.5746,29.791,29.949,34.376,30 -18:30:26,406.6231,29.791,29.923,35.294,30 -18:30:26,406.6718,29.765,29.87,35.748,30 -18:30:26,406.7207,29.765,29.87,37.115,30 -18:30:26,406.7705,29.739,29.923,37.125,30 -18:30:26,406.8183,29.739,29.923,36.671,30 -18:30:26,406.8666,29.765,29.844,36.68,30 -18:30:26,406.9132,29.765,29.923,37.601,30 -18:30:26,406.9617,29.791,29.897,36.253,30 -18:30:26,407.0076,29.765,29.897,36.261,30 -18:30:26,407.0530,29.818,29.897,36.717,30 -18:30:27,407.1008,29.765,29.897,35.814,30 -18:30:27,407.1557,29.739,29.897,36.733,30 -18:30:27,407.2036,29.739,29.897,37.191,30 -18:30:27,407.2498,29.765,29.897,37.201,30 -18:30:27,407.2966,29.765,29.923,36.764,30 -18:30:27,407.3438,29.765,29.949,36.325,30 -18:30:27,407.3898,29.739,29.923,35.887,30 -18:30:27,407.4352,29.765,29.897,36.789,30 -18:30:27,407.4818,29.739,29.923,36.797,30 -18:30:27,407.5275,29.765,29.844,36.806,30 -18:30:27,407.5715,29.739,29.923,37.727,30 -18:30:27,407.6168,29.765,29.897,36.825,30 -18:30:27,407.6626,29.791,29.923,36.834,30 -18:30:27,407.7088,29.765,29.897,35.948,30 -18:30:27,407.7540,29.739,29.897,36.85,30 -18:30:27,407.7983,29.791,29.923,37.306,30 -18:30:27,407.8448,29.765,29.897,35.974,30 -18:30:27,407.8902,29.765,29.897,36.876,30 -18:30:27,407.9357,29.739,29.897,36.884,30 -18:30:27,407.9836,29.791,29.897,37.34,30 -18:30:27,408.0306,29.739,29.87,36.456,30 -18:30:27,408.0787,29.765,29.923,37.823,30 -18:30:28,408.1237,29.791,29.897,36.475,30 -18:30:28,408.1696,29.739,29.87,36.483,30 -18:30:28,408.2176,29.739,29.923,37.85,30 -18:30:28,408.2640,29.713,29.897,36.949,30 -18:30:28,408.3125,29.791,29.844,37.852,30 -18:30:28,408.3606,29.791,29.87,37.433,30 -18:30:28,408.4078,29.739,29.897,36.996,30 -18:30:28,408.4539,29.791,29.923,37.435,30 -18:30:28,408.5005,29.791,29.897,36.103,30 -18:30:28,408.5493,29.791,29.87,36.558,30 -18:30:28,408.5968,29.713,29.923,37.031,30 -18:30:28,408.6432,29.765,29.844,37.47,30 -18:30:28,408.6888,29.818,29.897,37.944,30 -18:30:28,408.7362,29.713,29.897,36.131,30 -18:30:28,408.7835,29.765,29.897,37.945,30 -18:30:28,408.8301,29.765,29.844,37.061,30 -18:30:28,408.8791,29.791,29.87,37.982,30 -18:30:28,408.9285,29.765,29.897,37.098,30 -18:30:28,408.9796,29.791,29.87,37.091,30 -18:30:28,409.0263,29.713,29.897,37.118,30 -18:30:28,409.0731,29.765,29.87,38.004,30 -18:30:29,409.1217,29.713,29.844,37.585,30 -18:30:29,409.1677,29.713,29.897,38.936,30 -18:30:29,409.2160,29.739,29.87,38.036,30 -18:30:29,409.2653,29.765,29.844,38.064,30 -18:30:29,409.3138,29.791,29.844,38.075,30 -18:30:29,409.3614,29.739,29.844,37.639,30 -18:30:29,409.4075,29.713,29.844,38.543,30 -18:30:29,409.4547,29.765,29.844,39.002,30 -18:30:29,409.5010,29.791,29.844,38.119,30 -18:30:29,409.5483,29.739,29.844,37.682,30 -18:30:29,409.5975,29.713,29.897,38.586,30 -18:30:29,409.6436,29.739,29.87,38.134,30 -18:30:29,409.6882,29.765,29.87,38.161,30 -18:30:29,409.7346,29.765,29.844,37.724,30 -18:30:29,409.7820,29.713,29.87,38.181,30 -18:30:29,409.8283,29.765,29.844,38.639,30 -18:30:29,409.8766,29.739,29.87,38.202,30 -18:30:29,409.9231,29.739,29.844,38.213,30 -18:30:29,409.9715,29.739,29.844,38.671,30 -18:30:29,410.0203,29.765,29.844,38.682,30 -18:30:29,410.0697,29.713,29.87,38.247,30 -18:30:30,410.1193,29.739,29.87,38.705,30 -18:30:30,410.1695,29.765,29.87,38.27,30 -18:30:30,410.2161,29.739,29.844,37.834,30 -18:30:30,410.2655,29.739,29.87,38.738,30 -18:30:30,410.3118,29.765,29.844,38.302,30 -18:30:30,410.3589,29.713,29.818,38.313,30 -18:30:30,410.4039,29.791,29.897,39.665,30 -18:30:30,410.4532,29.739,29.844,36.977,30 -18:30:30,410.5019,29.739,29.87,38.791,30 -18:30:30,410.5497,29.739,29.87,38.356,30 -18:30:30,410.5988,29.687,29.844,38.366,30 -18:30:30,410.6460,29.765,29.844,39.719,30 -18:30:30,410.6952,29.739,29.87,38.39,30 -18:30:30,410.7403,29.739,29.844,38.401,30 -18:30:30,410.7887,29.739,29.87,38.858,30 -18:30:30,410.8337,29.765,29.844,38.423,30 -18:30:30,410.8814,29.739,29.844,38.433,30 -18:30:30,410.9277,29.713,29.844,38.89,30 -18:30:30,410.9758,29.713,29.87,39.349,30 -18:30:30,411.0206,29.739,29.87,38.914,30 -18:30:30,411.0651,29.713,29.844,38.477,30 -18:30:31,411.1118,29.713,29.87,39.381,30 -18:30:31,411.1564,29.739,29.87,38.946,30 -18:30:31,411.2007,29.765,29.818,38.509,30 -18:30:31,411.2459,29.713,29.897,38.966,30 -18:30:31,411.2925,29.765,29.818,38.513,30 -18:30:31,411.3368,29.739,29.844,38.988,30 -18:30:31,411.3838,29.739,29.818,38.998,30 -18:30:31,411.4297,29.765,29.818,39.457,30 -18:30:31,411.4763,29.713,29.818,39.021,30 -18:30:31,411.5211,29.739,29.844,39.926,30 -18:30:31,411.5675,29.739,29.818,39.044,30 -18:30:31,411.6131,29.713,29.844,39.502,30 -18:30:31,411.6594,29.739,29.844,39.514,30 -18:30:31,411.7057,29.739,29.818,39.078,30 -18:30:31,411.7538,29.765,29.791,39.537,30 -18:30:31,411.8027,29.713,29.791,39.566,30 -18:30:31,411.8574,29.713,29.87,40.473,30 -18:30:31,411.9023,29.713,29.844,39.129,30 -18:30:31,411.9488,29.713,29.87,39.587,30 -18:30:31,411.9978,29.713,29.844,39.152,30 -18:30:31,412.0446,29.739,29.791,39.611,30 -18:30:31,412.0897,29.739,29.844,40.087,30 -18:30:32,412.1350,29.713,29.844,39.187,30 -18:30:32,412.1800,29.713,29.818,39.645,30 -18:30:32,412.2254,29.739,29.818,40.104,30 -18:30:32,412.2754,29.739,29.818,39.67,30 -18:30:32,412.3258,29.739,29.818,39.682,30 -18:30:32,412.3740,29.713,29.818,39.695,30 -18:30:32,412.4206,29.713,29.818,40.154,30 -18:30:32,412.4658,29.739,29.818,40.166,30 -18:30:32,412.5120,29.713,29.818,39.732,30 -18:30:32,412.5565,29.713,29.844,40.19,30 -18:30:32,412.6021,29.713,29.844,39.755,30 -18:30:32,412.6483,29.713,29.844,39.766,30 -18:30:32,412.6943,29.765,29.818,39.778,30 -18:30:32,412.7427,29.713,29.818,39.343,30 -18:30:32,412.7889,29.713,29.818,40.248,30 -18:30:32,412.8381,29.713,29.844,40.261,30 -18:30:32,412.8861,29.739,29.844,39.827,30 -18:30:32,412.9346,29.791,29.818,39.392,30 -18:30:32,412.9826,29.739,29.818,38.956,30 -18:30:32,413.0276,29.713,29.818,39.861,30 -18:30:32,413.0727,29.765,29.791,40.32,30 -18:30:33,413.1177,29.713,29.791,39.902,30 -18:30:33,413.1644,29.713,29.844,40.807,30 -18:30:33,413.2099,29.765,29.818,39.909,30 -18:30:33,413.2533,29.713,29.818,39.473,30 -18:30:33,413.2965,29.713,29.818,40.378,30 -18:30:33,413.3427,29.739,29.791,40.39,30 -18:30:33,413.3902,29.739,29.844,40.419,30 -18:30:33,413.4359,29.739,29.818,39.52,30 -18:30:33,413.4819,29.713,29.818,39.978,30 -18:30:33,413.5287,29.739,29.87,40.437,30 -18:30:33,413.5770,29.713,29.818,39.108,30 -18:30:33,413.6246,29.739,29.791,40.461,30 -18:30:33,413.6696,29.739,29.87,40.491,30 -18:30:33,413.7168,29.713,29.844,39.144,30 -18:30:33,413.7637,29.713,29.818,40.049,30 -18:30:33,413.8131,29.739,29.818,40.508,30 -18:30:33,413.8596,29.739,29.818,40.074,30 -18:30:33,413.9047,29.713,29.791,40.086,30 -18:30:33,413.9527,29.713,29.791,41.009,30 -18:30:33,413.9994,29.765,29.818,41.023,30 -18:30:33,414.0456,29.739,29.844,39.677,30 -18:30:33,414.0926,29.739,29.844,39.688,30 -18:30:34,414.1364,29.765,29.844,39.699,30 -18:30:34,414.1811,29.713,29.844,39.262,30 -18:30:34,414.2276,29.713,29.844,40.167,30 -18:30:34,414.2742,29.713,29.818,40.178,30 -18:30:34,414.3186,29.739,29.844,40.637,30 -18:30:34,414.3634,29.765,29.818,39.755,30 -18:30:34,414.4095,29.713,29.818,39.766,30 -18:30:34,414.4588,29.791,29.818,40.672,30 -18:30:34,414.5047,29.765,29.818,39.343,30 -18:30:34,414.5516,29.765,29.791,39.8,30 -18:30:34,414.5995,29.713,29.791,40.276,30 -18:30:34,414.6477,29.765,29.818,41.182,30 -18:30:34,414.6965,29.739,29.791,39.837,30 -18:30:34,414.7447,29.818,29.818,40.76,30 -18:30:34,414.7912,29.739,29.844,38.95,30 -18:30:34,414.8381,29.739,29.818,39.871,30 -18:30:34,414.8856,29.739,29.844,40.33,30 -18:30:34,414.9325,29.765,29.818,39.894,30 -18:30:34,414.9896,29.765,29.87,39.906,30 -18:30:34,415.0376,29.765,29.844,39.025,30 -18:30:34,415.0829,29.713,29.844,39.482,30 -18:30:35,415.1295,29.739,29.818,40.386,30 -18:30:35,415.1739,29.765,29.818,40.398,30 -18:30:35,415.2185,29.739,29.844,39.962,30 -18:30:35,415.2630,29.739,29.87,39.973,30 -18:30:35,415.3101,29.765,29.818,39.536,30 -18:30:35,415.3549,29.765,29.844,39.994,30 -18:30:35,415.4009,29.739,29.844,39.557,30 -18:30:35,415.4457,29.739,29.818,40.015,30 -18:30:35,415.4912,29.739,29.791,40.472,30 -18:30:35,415.5363,29.765,29.818,40.948,30 -18:30:35,415.5830,29.765,29.818,40.049,30 -18:30:35,415.6327,29.739,29.818,40.06,30 -18:30:35,415.6785,29.765,29.87,40.519,30 -18:30:35,415.7256,29.739,29.791,39.189,30 -18:30:35,415.7695,29.791,29.818,41.005,30 -18:30:35,415.8139,29.713,29.791,39.658,30 -18:30:35,415.8596,29.739,29.844,41.474,30 -18:30:35,415.9065,29.739,29.818,40.128,30 -18:30:35,415.9551,29.765,29.818,40.587,30 -18:30:35,415.9993,29.765,29.818,40.152,30 -18:30:35,416.0462,29.739,29.818,40.162,30 -18:30:35,416.0928,29.765,29.818,40.621,30 -18:30:36,416.1397,29.739,29.818,40.185,30 -18:30:36,416.1841,29.791,29.818,40.643,30 -18:30:36,416.2316,29.713,29.818,39.76,30 -18:30:36,416.2766,29.791,29.818,41.113,30 -18:30:36,416.3210,29.739,29.844,39.783,30 -18:30:36,416.3658,29.739,29.844,40.24,30 -18:30:36,416.4121,29.765,29.818,40.251,30 -18:30:36,416.4602,29.713,29.844,40.262,30 -18:30:36,416.5054,29.739,29.818,40.721,30 -18:30:36,416.5494,29.765,29.818,40.732,30 -18:30:36,416.5962,29.818,29.818,40.296,30 -18:30:36,416.6447,29.765,29.818,39.396,30 -18:30:36,416.6940,29.713,29.791,40.317,30 -18:30:36,416.7408,29.765,29.791,41.688,30 -18:30:36,416.7892,29.739,29.791,40.807,30 -18:30:36,416.8380,29.765,29.818,41.266,30 -18:30:36,416.8850,29.739,29.818,40.368,30 -18:30:36,416.9326,29.765,29.818,40.826,30 -18:30:36,416.9818,29.765,29.844,40.391,30 -18:30:36,417.0295,29.765,29.844,39.956,30 -18:30:36,417.0777,29.713,29.791,39.966,30 -18:30:37,417.1275,29.765,29.818,41.783,30 -18:30:37,417.1767,29.687,29.844,40.438,30 -18:30:37,417.2251,29.739,29.791,41.344,30 -18:30:37,417.2717,29.765,29.844,41.374,30 -18:30:37,417.3218,29.791,29.791,40.029,30 -18:30:37,417.3708,29.739,29.818,40.504,30 -18:30:37,417.4214,29.765,29.818,40.946,30 -18:30:37,417.4693,29.713,29.791,40.511,30 -18:30:37,417.5184,29.765,29.818,41.881,30 -18:30:37,417.5665,29.713,29.818,40.536,30 -18:30:37,417.6152,29.791,29.765,41.442,30 -18:30:37,417.6626,29.765,29.818,41.025,30 -18:30:37,417.7117,29.765,29.791,40.573,30 -18:30:37,417.7679,29.765,29.791,41.049,30 -18:30:37,417.8162,29.765,29.844,41.063,30 -18:30:37,417.8633,29.818,29.791,40.164,30 -18:30:37,417.9103,29.739,29.87,40.174,30 -18:30:37,417.9603,29.739,29.791,40.185,30 -18:30:37,418.0088,29.844,29.791,41.555,30 -18:30:37,418.0537,29.765,29.818,39.762,30 -18:30:38,418.1000,29.765,29.818,40.666,30 -18:30:38,418.1465,29.739,29.818,40.677,30 -18:30:38,418.1927,29.765,29.791,41.135,30 -18:30:38,418.2408,29.791,29.791,41.164,30 -18:30:38,418.2869,29.791,29.739,40.729,30 -18:30:38,418.3328,29.739,29.791,41.634,30 -18:30:38,418.3806,29.791,29.818,41.646,30 -18:30:38,418.4256,29.713,29.765,40.3,30 -18:30:38,418.4693,29.791,29.791,42.563,30 -18:30:38,418.5141,29.765,29.765,40.788,30 -18:30:38,418.5601,29.765,29.818,41.693,30 -18:30:38,418.6078,29.765,29.844,40.794,30 -18:30:38,418.6530,29.765,29.818,40.358,30 -18:30:38,418.6986,29.765,29.791,40.815,30 -18:30:38,418.7459,29.739,29.791,41.29,30 -18:30:38,418.7930,29.739,29.818,41.749,30 -18:30:38,418.8413,29.791,29.791,41.298,30 -18:30:38,418.8879,29.765,29.844,40.88,30 -18:30:38,418.9367,29.791,29.818,40.427,30 -18:30:38,418.9851,29.739,29.87,40.438,30 -18:30:38,419.0313,29.739,29.791,40.448,30 -18:30:38,419.0784,29.739,29.791,41.818,30 -18:30:39,419.1286,29.713,29.844,41.83,30 -18:30:39,419.1778,29.739,29.844,41.379,30 -18:30:39,419.2265,29.739,29.844,40.944,30 -18:30:39,419.2787,29.739,29.818,40.957,30 -18:30:39,419.3251,29.739,29.791,41.416,30 -18:30:39,419.3685,29.765,29.818,41.892,30 -18:30:39,419.4140,29.765,29.818,40.992,30 -18:30:39,419.4592,29.739,29.818,41.003,30 -18:30:39,419.5045,29.739,29.844,41.461,30 -18:30:39,419.5497,29.765,29.791,41.025,30 -18:30:39,419.5969,29.765,29.844,41.5,30 -18:30:39,419.6434,29.739,29.844,40.601,30 -18:30:39,419.6878,29.739,29.818,41.058,30 -18:30:39,419.7329,29.739,29.818,41.516,30 -18:30:39,419.7785,29.765,29.791,41.527,30 -18:30:39,419.8274,29.765,29.818,41.556,30 -18:30:39,419.8764,29.791,29.844,41.104,30 -18:30:39,419.9268,29.713,29.818,40.222,30 -18:30:39,419.9793,29.739,29.818,42.021,30 -18:30:39,420.0289,29.713,29.844,41.588,30 -18:30:39,420.0778,29.765,29.818,41.6,30 -18:30:40,420.1295,29.739,29.87,41.165,30 -18:30:40,420.1777,29.791,29.844,40.73,30 -18:30:40,420.2281,29.739,29.818,40.294,30 -18:30:40,420.2794,29.765,29.818,41.646,30 -18:30:40,420.3324,29.739,29.87,41.212,30 -18:30:40,420.3811,29.739,29.818,40.777,30 -18:30:40,420.4316,29.739,29.844,41.682,30 -18:30:40,420.4786,29.765,29.844,41.248,30 -18:30:40,420.5264,29.713,29.791,40.812,30 -18:30:40,420.5762,29.739,29.818,42.628,30 -18:30:40,420.6396,29.739,29.791,41.731,30 -18:30:40,420.6951,29.739,29.818,42.212,30 -18:30:40,420.7500,29.739,29.844,41.762,30 -18:30:40,420.8074,29.765,29.818,41.329,30 -18:30:40,420.8617,29.713,29.844,41.343,30 -18:30:40,420.9187,29.791,29.844,41.802,30 -18:30:40,420.9760,29.713,29.844,40.475,30 -18:30:40,421.0346,29.739,29.844,41.829,30 -18:30:40,421.0898,29.687,29.818,41.396,30 -18:30:41,421.1443,29.765,29.87,42.751,30 -18:30:41,421.2021,29.739,29.844,40.53,30 -18:30:41,421.2566,29.765,29.818,41.437,30 -18:30:41,421.3092,29.739,29.818,41.45,30 -18:30:41,421.3676,29.739,29.844,41.91,30 -18:30:41,421.4221,29.713,29.818,41.478,30 -18:30:41,421.4798,29.713,29.844,42.386,30 -18:30:41,421.5305,29.765,29.844,41.953,30 -18:30:41,421.5823,29.739,29.844,41.071,30 -18:30:41,421.6326,29.739,29.87,41.53,30 -18:30:41,421.6798,29.765,29.818,41.095,30 -18:30:41,421.7306,29.739,29.844,41.553,30 -18:30:41,421.7796,29.739,29.844,41.565,30 -18:30:41,421.8318,29.791,29.844,41.576,30 -18:30:41,421.8825,29.739,29.844,40.694,30 -18:30:41,421.9322,29.739,29.897,41.599,30 -18:30:41,421.9833,29.687,29.87,40.7,30 -18:30:41,422.0292,29.765,29.844,42.069,30 -18:30:41,422.0756,29.765,29.844,41.186,30 -18:30:42,422.1228,29.739,29.818,41.197,30 -18:30:42,422.1816,29.765,29.844,42.101,30 -18:30:42,422.2296,29.739,29.844,41.222,30 -18:30:42,422.2770,29.765,29.844,41.68,30 -18:30:42,422.3224,29.739,29.844,41.244,30 -18:30:42,422.3672,29.713,29.818,41.701,30 -18:30:42,422.4154,29.739,29.87,42.606,30 -18:30:42,422.4634,29.713,29.818,41.277,30 -18:30:42,422.5154,29.713,29.844,42.631,30 -18:30:42,422.5638,29.713,29.844,42.196,30 -18:30:42,422.6153,29.739,29.818,42.209,30 -18:30:42,422.6633,29.739,29.844,42.222,30 -18:30:42,422.7107,29.739,29.791,41.787,30 -18:30:42,422.7564,29.739,29.844,42.709,30 -18:30:42,422.8018,29.713,29.87,41.81,30 -18:30:42,422.8508,29.739,29.818,41.821,30 -18:30:42,422.8955,29.765,29.818,42.28,30 -18:30:42,422.9461,29.739,29.818,41.844,30 -18:30:42,422.9927,29.739,29.87,42.303,30 -18:30:42,423.0379,29.687,29.844,41.421,30 -18:30:42,423.0907,29.765,29.818,42.773,30 -18:30:43,423.1354,29.713,29.818,41.892,30 -18:30:43,423.1818,29.739,29.818,42.797,30 -18:30:43,423.2286,29.739,29.844,42.362,30 -18:30:43,423.2742,29.713,29.844,41.927,30 -18:30:43,423.3178,29.687,29.791,42.385,30 -18:30:43,423.3628,29.713,29.844,43.754,30 -18:30:43,423.4087,29.713,29.818,42.409,30 -18:30:43,423.4547,29.713,29.844,42.868,30 -18:30:43,423.4998,29.739,29.818,42.433,30 -18:30:43,423.5438,29.765,29.818,42.445,30 -18:30:43,423.5894,29.739,29.844,42.008,30 -18:30:43,423.6334,29.739,29.844,42.019,30 -18:30:43,423.6777,29.739,29.739,42.03,30 -18:30:43,423.7247,29.739,29.844,43.846,30 -18:30:43,423.7700,29.739,29.844,42.054,30 -18:30:43,423.8155,29.713,29.844,42.065,30 -18:30:43,423.8635,29.713,29.844,42.523,30 -18:30:43,423.9085,29.739,29.844,42.535,30 -18:30:43,423.9550,29.713,29.844,42.099,30 -18:30:43,424.0012,29.713,29.818,42.558,30 -18:30:43,424.0473,29.713,29.818,43.017,30 -18:30:43,424.0925,29.739,29.818,43.029,30 -18:30:44,424.1360,29.765,29.818,42.594,30 -18:30:44,424.1812,29.687,29.818,42.158,30 -18:30:44,424.2267,29.713,29.844,43.51,30 -18:30:44,424.2723,29.739,29.818,42.628,30 -18:30:44,424.3182,29.739,29.791,42.64,30 -18:30:44,424.3657,29.713,29.844,43.116,30 -18:30:44,424.4120,29.739,29.844,42.664,30 -18:30:44,424.4573,29.713,29.844,42.229,30 -18:30:44,424.5011,29.687,29.844,42.687,30 -18:30:44,424.5460,29.66,29.818,43.145,30 -18:30:44,424.5923,29.739,29.818,44.068,30 -18:30:44,424.6379,29.713,29.818,42.724,30 -18:30:44,424.6834,29.739,29.844,43.182,30 -18:30:44,424.7285,29.713,29.844,42.3,30 -18:30:44,424.7735,29.739,29.818,42.758,30 -18:30:44,424.8183,29.739,29.818,42.769,30 -18:30:44,424.8642,29.739,29.818,42.781,30 -18:30:44,424.9092,29.713,29.844,42.792,30 -18:30:44,424.9585,29.765,29.818,42.804,30 -18:30:44,425.0097,29.765,29.844,42.369,30 -18:30:44,425.0627,29.765,29.818,41.934,30 -18:30:45,425.1080,29.739,29.791,42.393,30 -18:30:45,425.1585,29.739,29.818,43.316,30 -18:30:45,425.2029,29.765,29.791,42.865,30 -18:30:45,425.2506,29.687,29.844,42.893,30 -18:30:45,425.2977,29.739,29.844,43.335,30 -18:30:45,425.3436,29.713,29.844,42.453,30 -18:30:45,425.3919,29.739,29.818,42.911,30 -18:30:45,425.4368,29.765,29.791,42.924,30 -18:30:45,425.4818,29.713,29.818,42.952,30 -18:30:45,425.5282,29.765,29.791,43.394,30 -18:30:45,425.5760,29.739,29.844,42.976,30 -18:30:45,425.6243,29.739,29.818,42.524,30 -18:30:45,425.6685,29.713,29.87,42.982,30 -18:30:45,425.7123,29.713,29.818,42.546,30 -18:30:45,425.7589,29.713,29.844,43.451,30 -18:30:45,425.8021,29.791,29.818,43.017,30 -18:30:45,425.8474,29.713,29.791,42.133,30 -18:30:45,425.8966,29.713,29.87,43.949,30 -18:30:45,425.9467,29.713,29.844,42.604,30 -18:30:45,425.9957,29.713,29.818,43.063,30 -18:30:45,426.0428,29.739,29.844,43.523,30 -18:30:45,426.0932,29.713,29.844,42.641,30 -18:30:46,426.1416,29.739,29.818,43.101,30 -18:30:46,426.1870,29.765,29.87,43.113,30 -18:30:46,426.2316,29.818,29.844,41.783,30 -18:30:46,426.2771,29.765,29.87,41.328,30 -18:30:46,426.3234,29.739,29.844,41.801,30 -18:30:46,426.3672,29.739,29.791,42.705,30 -18:30:46,426.4177,29.713,29.87,43.628,30 -18:30:46,426.4641,29.739,29.844,42.729,30 -18:30:46,426.5114,29.765,29.844,42.74,30 -18:30:46,426.5546,29.739,29.87,42.304,30 -18:30:46,426.5994,29.713,29.844,42.314,30 -18:30:46,426.6451,29.739,29.87,43.218,30 -18:30:46,426.6907,29.765,29.844,42.335,30 -18:30:46,426.7362,29.765,29.844,42.345,30 -18:30:46,426.7819,29.687,29.87,42.355,30 -18:30:46,426.8290,29.739,29.844,43.26,30 -18:30:46,426.8778,29.713,29.87,42.825,30 -18:30:46,426.9246,29.687,29.87,42.836,30 -18:30:46,426.9733,29.765,29.844,43.295,30 -18:30:46,427.0186,29.713,29.923,42.413,30 -18:30:46,427.0643,29.739,29.844,41.958,30 -18:30:47,427.1114,29.739,29.818,42.879,30 -18:30:47,427.1577,29.765,29.87,43.338,30 -18:30:47,427.2018,29.739,29.87,42.008,30 -18:30:47,427.2483,29.739,29.818,42.464,30 -18:30:47,427.2949,29.687,29.897,43.369,30 -18:30:47,427.3405,29.765,29.87,42.916,30 -18:30:47,427.3865,29.687,29.87,42.05,30 -18:30:47,427.4324,29.713,29.844,43.401,30 -18:30:47,427.4790,29.713,29.87,43.413,30 -18:30:47,427.5248,29.739,29.87,42.977,30 -18:30:47,427.5726,29.713,29.897,42.541,30 -18:30:47,427.6196,29.765,29.897,42.535,30 -18:30:47,427.6667,29.739,29.844,41.651,30 -18:30:47,427.7128,29.713,29.844,43.019,30 -18:30:47,427.7609,29.739,29.87,43.477,30 -18:30:47,427.8077,29.713,29.87,42.595,30 -18:30:47,427.8540,29.739,29.897,43.052,30 -18:30:47,427.9012,29.739,29.949,42.152,30 -18:30:47,427.9503,29.791,29.87,41.267,30 -18:30:47,427.9990,29.739,29.844,41.74,30 -18:30:47,428.0468,29.713,29.844,43.091,30 -18:30:48,428.0967,29.713,29.87,43.55,30 -18:30:48,428.1431,29.739,29.844,43.115,30 -18:30:48,428.1931,29.713,29.87,43.126,30 -18:30:48,428.2437,29.739,29.87,43.138,30 -18:30:48,428.2933,29.739,29.844,42.704,30 -18:30:48,428.3396,29.765,29.844,43.161,30 -18:30:48,428.3912,29.713,29.87,42.725,30 -18:30:48,428.4378,29.739,29.87,43.185,30 -18:30:48,428.4826,29.713,29.844,42.748,30 -18:30:48,428.5272,29.66,29.897,43.652,30 -18:30:48,428.5750,29.713,29.87,43.664,30 -18:30:48,428.6224,29.739,29.87,43.228,30 -18:30:48,428.6694,29.765,29.844,42.792,30 -18:30:48,428.7163,29.739,29.87,42.803,30 -18:30:48,428.7637,29.739,29.844,42.813,30 -18:30:48,428.8144,29.687,29.87,43.271,30 -18:30:48,428.8636,29.713,29.87,43.731,30 -18:30:48,428.9132,29.765,29.844,43.296,30 -18:30:48,428.9641,29.713,29.87,42.86,30 -18:30:48,429.0108,29.713,29.897,43.319,30 -18:30:48,429.0556,29.739,29.87,42.866,30 -18:30:49,429.1006,29.791,29.87,42.893,30 -18:30:49,429.1481,29.791,29.897,42.009,30 -18:30:49,429.1954,29.713,29.844,41.553,30 -18:30:49,429.2432,29.687,29.897,43.815,30 -18:30:49,429.2911,29.739,29.87,43.363,30 -18:30:49,429.3363,29.765,29.87,42.944,30 -18:30:49,429.3837,29.739,29.897,42.507,30 -18:30:49,429.4288,29.713,29.897,42.5,30 -18:30:49,429.4754,29.765,29.949,42.956,30 -18:30:49,429.5225,29.713,29.949,41.178,30 -18:30:49,429.5673,29.765,29.844,42.08,30 -18:30:49,429.6127,29.713,29.87,43.0,30 -18:30:49,429.6578,29.713,29.844,43.457,30 -18:30:49,429.7039,29.765,29.87,43.915,30 -18:30:49,429.7503,29.791,29.844,42.585,30 -18:30:49,429.7951,29.713,29.844,42.595,30 -18:30:49,429.8418,29.687,29.87,43.946,30 -18:30:49,429.8885,29.765,29.923,43.958,30 -18:30:49,429.9343,29.739,29.844,41.717,30 -18:30:49,429.9833,29.765,29.897,43.531,30 -18:30:49,430.0268,29.765,29.87,42.183,30 -18:30:49,430.0731,29.634,29.897,42.656,30 -18:30:50,430.1188,29.739,29.818,44.454,30 -18:30:50,430.1651,29.765,29.897,44.019,30 -18:30:50,430.2128,29.739,29.923,42.225,30 -18:30:50,430.2581,29.765,29.923,42.235,30 -18:30:50,430.3058,29.765,29.897,41.796,30 -18:30:50,430.3522,29.739,29.923,42.252,30 -18:30:50,430.3992,29.765,29.87,42.261,30 -18:30:50,430.4438,29.765,29.897,42.734,30 -18:30:50,430.4906,29.765,29.87,42.279,30 -18:30:50,430.5356,29.739,29.949,42.753,30 -18:30:50,430.5827,29.765,29.923,41.85,30 -18:30:50,430.6269,29.791,29.87,41.859,30 -18:30:50,430.6719,29.713,29.897,42.331,30 -18:30:50,430.7159,29.713,29.897,43.217,30 -18:30:50,430.7665,29.739,29.897,43.227,30 -18:30:50,430.8154,29.765,29.923,42.791,30 -18:30:50,430.8619,29.765,29.949,41.907,30 -18:30:50,430.9088,29.66,29.923,41.468,30 -18:30:50,430.9571,29.739,29.923,43.728,30 -18:30:50,431.0025,29.739,29.897,42.381,30 -18:30:50,431.0488,29.713,29.923,42.837,30 -18:30:50,431.0959,29.791,29.949,42.847,30 -18:30:51,431.1423,29.739,29.923,41.068,30 -18:30:51,431.1908,29.739,29.923,42.416,30 -18:30:51,431.2375,29.765,29.949,42.426,30 -18:30:51,431.2835,29.713,29.949,41.54,30 -18:30:51,431.3297,29.739,29.897,42.442,30 -18:30:51,431.3771,29.713,29.975,42.898,30 -18:30:51,431.4236,29.739,30.002,42.014,30 -18:30:51,431.4693,29.739,29.949,41.11,30 -18:30:51,431.5152,29.765,29.923,42.029,30 -18:30:51,431.5612,29.713,29.897,42.037,30 -18:30:51,431.6102,29.765,29.949,43.387,30 -18:30:51,431.6593,29.739,29.949,41.609,30 -18:30:51,431.7054,29.739,29.923,42.064,30 -18:30:51,431.7503,29.713,29.949,42.519,30 -18:30:51,431.7995,29.739,29.923,42.528,30 -18:30:51,431.8470,29.765,29.923,42.537,30 -18:30:51,431.8935,29.739,29.923,42.099,30 -18:30:51,431.9424,29.765,29.923,42.555,30 -18:30:51,431.9900,29.765,29.923,42.117,30 -18:30:51,432.0380,29.739,29.923,42.126,30 -18:30:51,432.0814,29.739,29.949,42.581,30 -18:30:52,432.1269,29.739,29.949,42.142,30 -18:30:52,432.1760,29.739,29.949,42.151,30 -18:30:52,432.2272,29.687,29.923,42.159,30 -18:30:52,432.2745,29.739,29.949,43.51,30 -18:30:52,432.3237,29.765,29.923,42.179,30 -18:30:52,432.3757,29.765,29.949,42.188,30 -18:30:52,432.4245,29.765,29.923,41.75,30 -18:30:52,432.4726,29.765,29.923,42.205,30 -18:30:52,432.5208,29.765,29.923,42.214,30 -18:30:52,432.5680,29.634,29.949,42.222,30 -18:30:52,432.6177,29.791,29.897,44.037,30 -18:30:52,432.6640,29.765,29.949,42.242,30 -18:30:52,432.7137,29.713,29.949,41.804,30 -18:30:52,432.7610,29.739,30.002,42.706,30 -18:30:52,432.8095,29.765,29.975,41.356,30 -18:30:52,432.8584,29.765,29.975,41.381,30 -18:30:52,432.9102,29.739,29.949,41.388,30 -18:30:52,432.9574,29.739,29.975,42.29,30 -18:30:52,433.0080,29.844,29.949,41.852,30 -18:30:52,433.0565,29.713,29.975,40.501,30 -18:30:53,433.1025,29.791,29.949,42.313,30 -18:30:53,433.1478,29.765,29.949,41.426,30 -18:30:53,433.1941,29.765,30.002,41.88,30 -18:30:53,433.2412,29.791,29.949,40.976,30 -18:30:53,433.2896,29.818,29.949,41.447,30 -18:30:53,433.3354,29.765,29.949,40.99,30 -18:30:53,433.3846,29.739,29.975,41.908,30 -18:30:53,433.4326,29.739,30.002,41.916,30 -18:30:53,433.4770,29.765,30.002,41.459,30 -18:30:53,433.5247,29.739,30.002,41.019,30 -18:30:53,433.5708,29.765,29.949,41.472,30 -18:30:53,433.6158,29.739,30.002,41.943,30 -18:30:53,433.6624,29.765,29.975,41.486,30 -18:30:53,433.7113,29.739,29.949,41.51,30 -18:30:53,433.7588,29.791,30.002,42.412,30 -18:30:53,433.8043,29.818,29.949,40.614,30 -18:30:53,433.8492,29.739,29.923,41.067,30 -18:30:53,433.8963,29.818,29.923,42.879,30 -18:30:53,433.9455,29.791,29.949,41.53,30 -18:30:53,433.9935,29.818,29.949,41.553,30 -18:30:53,434.0392,29.765,29.949,41.096,30 -18:30:53,434.0826,29.765,29.87,42.014,30 -18:30:54,434.1276,29.791,29.949,43.379,30 -18:30:54,434.1736,29.739,30.028,41.583,30 -18:30:54,434.2188,29.739,29.975,41.126,30 -18:30:54,434.2647,29.739,29.975,42.043,30 -18:30:54,434.3115,29.765,29.949,42.051,30 -18:30:54,434.3575,29.818,29.923,42.058,30 -18:30:54,434.4027,29.739,30.002,41.601,30 -18:30:54,434.4476,29.739,29.975,41.608,30 -18:30:54,434.4947,29.765,29.923,42.079,30 -18:30:54,434.5398,29.765,30.002,42.534,30 -18:30:54,434.5868,29.818,29.949,41.183,30 -18:30:54,434.6329,29.818,29.975,41.189,30 -18:30:54,434.6775,29.765,29.923,40.748,30 -18:30:54,434.7236,29.791,29.975,42.559,30 -18:30:54,434.7682,29.791,29.949,41.226,30 -18:30:54,434.8142,29.765,29.923,41.679,30 -18:30:54,434.8589,29.739,29.949,42.58,30 -18:30:54,434.9078,29.791,29.949,42.588,30 -18:30:54,434.9570,29.818,29.949,41.703,30 -18:30:54,435.0050,29.765,29.975,41.246,30 -18:30:54,435.0497,29.765,29.949,41.716,30 -18:30:54,435.0955,29.739,29.923,42.17,30 -18:30:55,435.1436,29.739,29.975,43.072,30 -18:30:55,435.1928,29.713,29.87,42.187,30 -18:30:55,435.2415,29.818,29.897,44.448,30 -18:30:55,435.2924,29.791,29.949,42.189,30 -18:30:55,435.3427,29.844,29.949,41.768,30 -18:30:55,435.3918,29.818,29.897,40.863,30 -18:30:55,435.4393,29.713,29.897,42.211,30 -18:30:55,435.4878,29.818,29.844,44.025,30 -18:30:55,435.5365,29.791,29.923,43.141,30 -18:30:55,435.5824,29.765,29.87,42.256,30 -18:30:55,435.6555,29.765,29.87,43.622,30 -18:30:55,435.7169,29.818,29.897,43.638,30 -18:30:55,435.7737,29.818,29.844,42.274,30 -18:30:55,435.8280,29.791,29.87,43.195,30 -18:30:55,435.8788,29.713,29.87,43.223,30 -18:30:55,435.9302,29.739,29.87,44.574,30 -18:30:55,435.9867,29.818,29.87,44.14,30 -18:30:55,436.0396,29.818,29.818,42.793,30 -18:30:56,436.0991,29.765,29.897,43.697,30 -18:30:56,436.1552,29.765,29.87,43.262,30 -18:30:56,436.2125,29.739,29.923,43.737,30 -18:30:56,436.2695,29.791,29.87,43.285,30 -18:30:56,436.3263,29.765,29.923,43.313,30 -18:30:56,436.3785,29.791,29.87,42.859,30 -18:30:56,436.4298,29.791,29.87,43.333,30 -18:30:56,436.4829,29.765,29.87,43.343,30 -18:30:56,436.5355,29.791,29.844,43.8,30 -18:30:56,436.5893,29.791,29.897,43.811,30 -18:30:56,436.6378,29.818,29.87,42.911,30 -18:30:56,436.6931,29.818,29.87,42.919,30 -18:30:56,436.7442,29.765,29.975,42.929,30 -18:30:56,436.7951,29.844,29.897,42.044,30 -18:30:56,436.8457,29.765,29.923,42.034,30 -18:30:56,436.8965,29.791,29.897,42.953,30 -18:30:56,436.9485,29.765,29.897,42.963,30 -18:30:56,436.9986,29.765,29.87,43.419,30 -18:30:56,437.0509,29.765,29.897,43.894,30 -18:30:57,437.1029,29.791,29.87,43.44,30 -18:30:57,437.1487,29.765,29.897,43.467,30 -18:30:57,437.2061,29.897,29.87,43.458,30 -18:30:57,437.2517,29.791,29.949,41.663,30 -18:30:57,437.2989,29.844,29.87,42.133,30 -18:30:57,437.3461,29.765,29.87,42.588,30 -18:30:57,437.3957,29.765,29.87,43.954,30 -18:30:57,437.4424,29.791,29.897,43.964,30 -18:30:57,437.4899,29.844,29.87,43.063,30 -18:30:57,437.5355,29.791,29.87,42.624,30 -18:30:57,437.5834,29.791,29.897,43.543,30 -18:30:57,437.6297,29.87,29.844,43.088,30 -18:30:57,437.6761,29.765,29.897,42.649,30 -18:30:57,437.7237,29.87,29.844,43.551,30 -18:30:57,437.7715,29.818,29.897,42.666,30 -18:30:57,437.8206,29.818,29.87,42.657,30 -18:30:57,437.8661,29.765,29.923,43.128,30 -18:30:57,437.9139,29.818,29.87,43.137,30 -18:30:57,437.9622,29.818,29.923,43.145,30 -18:30:57,438.0126,29.818,29.87,42.242,30 -18:30:57,438.0596,29.765,29.949,43.161,30 -18:30:58,438.1120,29.765,29.923,42.723,30 -18:30:58,438.1604,29.791,29.897,43.178,30 -18:30:58,438.2103,29.844,29.897,43.187,30 -18:30:58,438.2593,29.844,29.897,42.284,30 -18:30:58,438.3115,29.765,29.897,42.292,30 -18:30:58,438.3629,29.897,29.897,43.658,30 -18:30:58,438.4100,29.844,29.87,41.397,30 -18:30:58,438.4558,29.791,29.87,42.779,30 -18:30:58,438.5024,29.791,29.923,43.698,30 -18:30:58,438.5490,29.844,29.844,42.795,30 -18:30:58,438.5958,29.844,29.844,43.25,30 -18:30:58,438.6421,29.818,29.844,43.258,30 -18:30:58,438.6884,29.818,29.897,43.714,30 -18:30:58,438.7347,29.739,29.923,42.811,30 -18:30:58,438.7835,29.87,29.923,43.73,30 -18:30:58,438.8311,29.791,29.923,41.486,30 -18:30:58,438.8756,29.818,29.87,42.851,30 -18:30:58,438.9222,29.844,29.897,43.305,30 -18:30:58,438.9716,29.844,29.818,42.402,30 -18:30:58,439.0180,29.791,29.923,43.768,30 -18:30:58,439.0636,29.791,29.897,42.883,30 -18:30:59,439.1096,29.791,29.897,43.337,30 -18:30:59,439.1579,29.791,29.897,43.345,30 -18:30:59,439.2056,29.739,29.87,43.354,30 -18:30:59,439.2506,29.818,29.897,44.721,30 -18:30:59,439.2957,29.844,29.87,42.908,30 -18:30:59,439.3413,29.791,29.897,42.933,30 -18:30:59,439.3885,29.818,29.87,43.387,30 -18:30:59,439.4372,29.791,29.897,43.396,30 -18:30:59,439.4832,29.791,29.923,43.405,30 -18:30:59,439.5276,29.844,29.87,42.966,30 -18:30:59,439.5737,29.844,29.897,42.973,30 -18:30:59,439.6222,29.844,29.87,42.516,30 -18:30:59,439.6694,29.844,29.87,42.988,30 -18:30:59,439.7151,29.818,29.897,42.995,30 -18:30:59,439.7609,29.818,29.897,42.986,30 -18:30:59,439.8078,29.791,29.897,42.993,30 -18:30:59,439.8553,29.844,29.818,43.465,30 -18:30:59,439.9021,29.818,29.87,43.921,30 -18:30:59,439.9492,29.844,29.897,43.483,30 -18:30:59,439.9980,29.844,29.897,42.58,30 -18:30:59,440.0460,29.765,29.923,42.587,30 -18:30:59,440.0925,29.687,29.897,43.505,30 -18:31:00,440.1446,29.765,29.87,45.302,30 -18:31:00,440.1913,29.791,29.975,44.437,30 -18:31:00,440.2397,29.791,29.87,42.194,30 -18:31:00,440.2877,29.844,29.897,44.007,30 -18:31:00,440.3344,29.791,29.87,42.64,30 -18:31:00,440.3812,29.791,29.923,44.023,30 -18:31:00,440.4267,29.791,29.923,43.12,30 -18:31:00,440.4730,29.87,29.87,43.128,30 -18:31:00,440.5206,29.791,29.897,42.688,30 -18:31:00,440.5668,29.791,29.87,43.589,30 -18:31:00,440.6146,29.818,29.923,44.062,30 -18:31:00,440.6628,29.739,29.897,42.695,30 -18:31:00,440.7094,29.844,29.923,44.509,30 -18:31:00,440.7566,29.791,29.87,42.265,30 -18:31:00,440.8037,29.818,29.923,44.094,30 -18:31:00,440.8506,29.844,29.87,42.728,30 -18:31:00,440.8981,29.844,29.923,43.199,30 -18:31:00,440.9479,29.818,29.87,42.295,30 -18:31:00,440.9991,29.818,29.897,43.661,30 -18:31:00,441.0467,29.818,29.818,43.205,30 -18:31:01,441.0980,29.844,29.844,44.573,30 -18:31:01,441.1448,29.765,29.87,43.688,30 -18:31:01,441.1922,29.791,29.818,44.608,30 -18:31:01,441.2403,29.791,29.87,45.065,30 -18:31:01,441.2899,29.818,29.844,44.182,30 -18:31:01,441.3378,29.791,29.949,44.174,30 -18:31:01,441.3840,29.791,29.844,42.842,30 -18:31:01,441.4312,29.87,29.87,44.654,30 -18:31:01,441.4808,29.818,29.87,42.858,30 -18:31:01,441.5280,29.791,29.897,43.76,30 -18:31:01,441.5771,29.791,29.897,43.769,30 -18:31:01,441.6248,29.844,29.818,43.777,30 -18:31:01,441.6706,29.791,29.844,44.233,30 -18:31:01,441.7158,29.791,29.87,44.706,30 -18:31:01,441.7627,29.844,29.844,44.268,30 -18:31:01,441.8109,29.818,29.87,43.813,30 -18:31:01,441.8600,29.87,29.844,43.822,30 -18:31:01,441.9083,29.791,29.818,43.383,30 -18:31:01,441.9571,29.87,29.791,45.197,30 -18:31:01,442.0061,29.791,29.818,44.314,30 -18:31:01,442.0535,29.791,29.844,45.217,30 -18:31:02,442.0981,29.844,29.87,44.781,30 -18:31:02,442.1442,29.844,29.87,43.431,30 -18:31:02,442.1904,29.844,29.791,43.439,30 -18:31:02,442.2379,29.818,29.87,44.805,30 -18:31:02,442.2838,29.844,29.87,43.903,30 -18:31:02,442.3305,29.818,29.87,43.465,30 -18:31:02,442.3755,29.818,29.818,43.919,30 -18:31:02,442.4222,29.818,29.844,44.822,30 -18:31:02,442.4675,29.818,29.818,44.384,30 -18:31:02,442.5130,29.791,29.897,44.84,30 -18:31:02,442.5588,29.87,29.844,43.955,30 -18:31:02,442.6058,29.818,29.791,43.516,30 -18:31:02,442.6524,29.818,29.844,45.33,30 -18:31:02,442.6974,29.923,29.791,44.429,30 -18:31:02,442.7441,29.87,29.791,43.543,30 -18:31:02,442.7920,29.844,29.844,44.462,30 -18:31:02,442.8398,29.818,29.818,44.007,30 -18:31:02,442.8860,29.844,29.844,44.91,30 -18:31:02,442.9330,29.818,29.87,44.025,30 -18:31:02,442.9836,29.818,29.818,44.034,30 -18:31:02,443.0308,29.818,29.87,44.937,30 -18:31:02,443.0762,29.791,29.844,44.053,30 -18:31:03,443.1230,29.844,29.818,44.972,30 -18:31:03,443.1678,29.844,29.818,44.517,30 -18:31:03,443.2133,29.87,29.791,44.526,30 -18:31:03,443.2590,29.844,29.818,44.552,30 -18:31:03,443.3054,29.818,29.844,44.544,30 -18:31:03,443.3540,29.791,29.87,44.553,30 -18:31:03,443.4030,29.844,29.818,44.579,30 -18:31:03,443.4479,29.87,29.791,44.572,30 -18:31:03,443.4933,29.87,29.844,44.597,30 -18:31:03,443.5397,29.87,29.844,43.695,30 -18:31:03,443.5888,29.87,29.818,43.702,30 -18:31:03,443.6388,29.818,29.844,44.158,30 -18:31:03,443.6862,29.818,29.818,44.614,30 -18:31:03,443.7295,29.844,29.87,45.07,30 -18:31:03,443.7754,29.818,29.897,43.738,30 -18:31:03,443.8224,29.844,29.818,43.728,30 -18:31:03,443.8694,29.844,29.844,44.647,30 -18:31:03,443.9165,29.844,29.844,44.209,30 -18:31:03,443.9646,29.844,29.818,44.218,30 -18:31:03,444.0170,29.87,29.818,44.674,30 -18:31:03,444.0655,29.791,29.87,44.236,30 -18:31:04,444.1138,29.844,29.897,44.709,30 -18:31:04,444.1626,29.87,29.844,43.343,30 -18:31:04,444.2096,29.87,29.844,43.814,30 -18:31:04,444.2582,29.739,29.844,43.822,30 -18:31:04,444.3079,29.87,29.844,46.083,30 -18:31:04,444.3558,29.818,29.897,43.841,30 -18:31:04,444.4055,29.923,29.844,43.832,30 -18:31:04,444.4552,29.818,29.949,42.946,30 -18:31:04,444.5051,29.818,29.87,42.952,30 -18:31:04,444.5535,29.818,29.923,44.318,30 -18:31:04,444.6036,29.818,29.897,43.415,30 -18:31:04,444.6544,29.818,29.87,43.87,30 -18:31:04,444.7006,29.818,29.897,44.342,30 -18:31:04,444.7495,29.844,29.87,43.886,30 -18:31:04,444.7986,29.844,29.897,43.911,30 -18:31:04,444.8467,29.844,29.923,43.455,30 -18:31:04,444.8967,29.897,29.949,43.015,30 -18:31:04,444.9470,29.844,29.923,41.663,30 -18:31:04,444.9978,29.818,29.923,43.026,30 -18:31:04,445.0468,29.791,29.897,43.48,30 -18:31:04,445.0952,29.818,29.923,44.399,30 -18:31:05,445.1444,29.87,29.87,43.496,30 -18:31:05,445.1949,29.87,29.897,43.52,30 -18:31:05,445.2425,29.87,29.87,43.063,30 -18:31:05,445.2901,29.897,29.87,43.534,30 -18:31:05,445.3382,29.844,29.897,43.077,30 -18:31:05,445.3877,29.87,29.897,43.53,30 -18:31:05,445.4368,29.818,29.897,43.09,30 -18:31:05,445.4830,29.844,29.923,43.991,30 -18:31:05,445.5302,29.87,29.87,43.105,30 -18:31:05,445.5786,29.87,29.923,43.575,30 -18:31:05,445.6293,29.844,29.897,42.671,30 -18:31:05,445.6772,29.87,29.87,43.571,30 -18:31:05,445.7244,29.87,29.923,43.596,30 -18:31:05,445.7734,29.844,29.897,42.691,30 -18:31:05,445.8235,29.897,29.87,43.591,30 -18:31:05,445.8727,29.818,29.975,43.151,30 -18:31:05,445.9222,29.87,29.923,42.711,30 -18:31:05,445.9718,29.87,29.949,42.717,30 -18:31:05,446.0226,29.87,29.897,42.276,30 -18:31:05,446.0740,29.897,29.87,43.175,30 -18:31:06,446.1226,29.923,29.897,43.182,30 -18:31:06,446.1719,29.87,29.844,42.277,30 -18:31:06,446.2227,29.765,29.923,44.105,30 -18:31:06,446.2722,29.897,29.897,44.56,30 -18:31:06,446.3215,29.844,29.897,42.746,30 -18:31:06,446.3694,29.897,29.87,43.663,30 -18:31:06,446.4165,29.87,29.949,43.223,30 -18:31:06,446.4641,29.897,29.897,42.335,30 -18:31:06,446.5116,29.87,29.897,42.77,30 -18:31:06,446.5602,29.844,29.949,43.24,30 -18:31:06,446.6079,29.844,29.949,42.799,30 -18:31:06,446.6572,29.844,29.897,42.805,30 -18:31:06,446.7051,29.897,29.923,43.705,30 -18:31:06,446.7559,29.844,29.949,42.353,30 -18:31:06,446.8045,29.897,29.923,42.823,30 -18:31:06,446.8542,29.87,29.923,42.364,30 -18:31:06,446.9026,29.87,30.002,42.834,30 -18:31:06,446.9543,29.844,29.923,41.481,30 -18:31:06,447.0084,29.897,29.923,43.291,30 -18:31:06,447.0564,29.897,29.897,42.386,30 -18:31:07,447.1055,29.87,29.949,42.838,30 -18:31:07,447.1553,29.87,29.923,42.414,30 -18:31:07,447.2062,29.844,29.975,42.867,30 -18:31:07,447.2581,29.897,29.923,42.425,30 -18:31:07,447.3073,29.897,29.923,42.413,30 -18:31:07,447.3560,29.844,29.923,42.419,30 -18:31:07,447.4075,29.844,29.923,43.335,30 -18:31:07,447.4536,29.844,30.002,43.342,30 -18:31:07,447.5007,29.923,29.923,41.989,30 -18:31:07,447.5476,29.87,29.923,41.994,30 -18:31:07,447.5973,29.87,29.949,42.909,30 -18:31:07,447.6441,29.897,29.923,42.468,30 -18:31:07,447.6898,29.923,29.949,42.456,30 -18:31:07,447.7382,29.897,29.923,41.566,30 -18:31:07,447.7853,29.897,29.975,42.464,30 -18:31:07,447.8317,29.897,29.949,41.574,30 -18:31:07,447.8797,29.897,29.949,42.025,30 -18:31:07,447.9282,29.897,29.923,42.029,30 -18:31:07,447.9795,29.87,30.054,42.481,30 -18:31:07,448.0281,29.923,29.949,40.697,30 -18:31:07,448.0764,29.87,29.975,41.594,30 -18:31:08,448.1260,29.87,29.975,42.061,30 -18:31:08,448.1751,29.87,29.949,42.066,30 -18:31:08,448.2251,29.923,29.975,42.517,30 -18:31:08,448.2755,29.87,29.975,41.164,30 -18:31:08,448.3249,29.897,29.949,42.078,30 -18:31:08,448.3742,29.949,29.975,42.065,30 -18:31:08,448.4230,29.87,29.975,40.728,30 -18:31:08,448.4751,29.897,29.975,42.089,30 -18:31:08,448.5246,29.87,29.949,41.629,30 -18:31:08,448.5736,29.87,29.975,42.544,30 -18:31:08,448.6220,29.897,29.975,42.102,30 -18:31:08,448.6725,29.87,29.975,41.642,30 -18:31:08,448.7206,29.949,29.949,42.11,30 -18:31:08,448.7676,29.897,29.923,41.203,30 -18:31:08,448.8159,29.87,29.975,42.547,30 -18:31:08,448.8638,29.791,29.975,42.122,30 -18:31:08,448.9114,29.949,29.923,43.485,30 -18:31:08,448.9603,29.949,29.975,41.669,30 -18:31:08,449.0132,29.87,29.975,40.778,30 -18:31:08,449.0630,29.923,29.923,42.139,30 -18:31:09,449.1117,29.87,30.002,42.126,30 -18:31:09,449.1599,29.87,30.002,41.683,30 -18:31:09,449.2075,29.844,30.002,41.687,30 -18:31:09,449.2573,30.002,29.975,42.137,30 -18:31:09,449.3058,29.897,29.923,39.889,30 -18:31:09,449.3560,29.923,29.949,42.59,30 -18:31:09,449.4079,29.923,29.975,41.7,30 -18:31:09,449.4571,29.897,29.923,41.257,30 -18:31:09,449.5049,29.923,30.054,42.601,30 -18:31:09,449.5505,29.949,29.949,39.906,30 -18:31:09,449.5996,29.897,29.949,41.265,30 -18:31:09,449.6476,29.87,30.002,42.162,30 -18:31:09,449.6967,29.87,29.975,41.719,30 -18:31:09,449.7435,29.897,29.949,42.187,30 -18:31:09,449.7926,29.923,29.975,42.174,30 -18:31:09,449.8406,29.818,29.975,41.284,30 -18:31:09,449.8903,29.975,29.923,43.093,30 -18:31:09,449.9415,29.87,29.949,41.293,30 -18:31:09,449.9907,29.923,29.975,42.655,30 -18:31:09,450.0423,29.87,30.002,41.301,30 -18:31:10,450.0960,29.844,29.975,41.751,30 -18:31:10,450.1438,29.897,29.923,42.667,30 -18:31:10,450.1926,29.897,29.949,42.655,30 -18:31:10,450.2407,29.923,29.949,42.212,30 -18:31:10,450.2895,29.87,29.975,41.77,30 -18:31:10,450.3450,29.923,29.949,42.238,30 -18:31:10,450.3939,29.897,29.975,41.778,30 -18:31:10,450.4429,29.923,29.949,41.782,30 -18:31:10,450.4916,29.923,29.975,41.785,30 -18:31:10,450.5420,29.949,29.923,41.341,30 -18:31:10,450.5927,29.87,29.949,41.792,30 -18:31:10,450.6655,29.897,29.975,42.707,30 -18:31:10,450.7230,29.923,29.949,41.802,30 -18:31:10,450.7796,29.923,29.949,41.807,30 -18:31:10,450.8368,29.897,30.028,41.811,30 -18:31:10,450.8909,29.897,29.975,40.903,30 -18:31:10,450.9443,29.897,29.975,41.817,30 -18:31:10,451.0037,29.87,29.975,41.821,30 -18:31:10,451.0591,29.897,29.975,42.29,30 -18:31:11,451.1127,29.949,29.975,41.83,30 -18:31:11,451.1698,29.923,30.002,40.94,30 -18:31:11,451.2254,29.87,30.028,40.925,30 -18:31:11,451.2780,29.897,30.002,41.392,30 -18:31:11,451.3302,30.002,30.002,41.378,30 -18:31:11,451.3841,29.897,30.002,39.574,30 -18:31:11,451.4383,29.87,30.002,41.381,30 -18:31:11,451.5023,29.844,30.002,41.848,30 -18:31:11,451.5600,29.897,30.028,42.3,30 -18:31:11,451.6143,29.923,30.002,40.946,30 -18:31:11,451.6646,29.923,30.054,40.949,30 -18:31:11,451.7135,29.897,29.975,40.056,30 -18:31:11,451.7627,29.923,30.002,41.863,30 -18:31:11,451.8112,29.897,30.028,40.955,30 -18:31:11,451.8596,29.897,30.054,40.957,30 -18:31:11,451.9093,29.897,30.002,40.512,30 -18:31:11,451.9573,29.923,30.028,41.408,30 -18:31:11,452.0101,29.975,29.975,40.516,30 -18:31:11,452.0564,29.844,30.002,40.535,30 -18:31:12,452.1065,29.87,30.002,42.325,30 -18:31:12,452.1555,29.923,29.975,41.882,30 -18:31:12,452.2208,29.949,30.002,41.438,30 -18:31:12,452.2688,29.923,30.002,40.53,30 -18:31:12,452.3160,29.87,30.002,40.978,30 -18:31:12,452.3620,29.949,30.002,41.892,30 -18:31:12,452.4100,29.87,30.054,40.537,30 -18:31:12,452.4561,29.897,30.081,41.002,30 -18:31:12,452.5030,29.897,30.028,40.076,30 -18:31:12,452.5480,29.949,30.002,40.988,30 -18:31:12,452.5941,29.923,30.054,40.543,30 -18:31:12,452.6396,29.949,30.081,40.097,30 -18:31:12,452.6882,29.87,30.054,39.186,30 -18:31:12,452.7373,29.949,30.081,41.008,30 -18:31:12,452.7859,29.897,30.054,39.187,30 -18:31:12,452.8374,29.949,30.028,40.545,30 -18:31:12,452.8878,29.897,30.028,40.099,30 -18:31:12,452.9386,29.87,30.028,40.994,30 -18:31:12,452.9900,29.975,30.081,41.461,30 -18:31:12,453.0399,29.897,30.16,38.746,30 -18:31:12,453.0874,29.975,30.002,38.727,30 -18:31:13,453.1374,29.897,30.081,40.102,30 -18:31:13,453.1879,29.897,30.028,40.085,30 -18:31:13,453.2379,29.923,30.028,40.997,30 -18:31:13,453.2877,29.949,30.054,40.552,30 -18:31:13,453.3382,29.949,30.133,39.659,30 -18:31:13,453.3882,29.844,30.054,38.3,30 -18:31:13,453.4474,29.897,30.081,41.463,30 -18:31:13,453.4961,29.923,30.107,40.09,30 -18:31:13,453.5439,29.975,30.054,39.196,30 -18:31:13,453.5929,29.949,30.081,39.212,30 -18:31:13,453.6395,29.897,30.028,39.194,30 -18:31:13,453.6878,29.897,30.081,41.0,30 -18:31:13,453.7361,29.87,30.081,40.09,30 -18:31:13,453.7826,29.949,30.054,40.555,30 -18:31:13,453.8292,29.923,30.054,39.662,30 -18:31:13,453.8748,29.923,30.081,40.109,30 -18:31:13,453.9217,29.897,30.081,39.645,30 -18:31:13,453.9710,29.897,30.081,40.092,30 -18:31:13,454.0194,29.923,30.107,40.093,30 -18:31:13,454.0670,29.897,30.028,39.199,30 -18:31:14,454.1154,29.949,30.081,41.004,30 -18:31:14,454.1626,29.923,30.054,39.2,30 -18:31:14,454.2093,29.897,30.107,40.111,30 -18:31:14,454.2577,29.923,30.054,39.647,30 -18:31:14,454.3054,29.923,30.107,40.112,30 -18:31:14,454.3529,29.844,30.133,39.201,30 -18:31:14,454.4007,29.975,30.081,40.112,30 -18:31:14,454.4466,29.975,30.081,38.753,30 -18:31:14,454.4990,29.923,30.002,38.752,30 -18:31:14,454.5498,29.949,30.054,41.004,30 -18:31:14,454.6002,29.923,30.081,39.664,30 -18:31:14,454.6493,29.923,30.081,39.647,30 -18:31:14,454.6963,29.923,30.081,39.647,30 -18:31:14,454.7458,29.897,30.081,39.647,30 -18:31:14,454.7966,29.923,30.107,40.094,30 -18:31:14,454.8457,29.949,30.081,39.2,30 -18:31:14,454.8957,29.897,30.054,39.199,30 -18:31:14,454.9462,29.923,30.107,40.557,30 -18:31:14,454.9950,29.923,30.107,39.2,30 -18:31:14,455.0425,29.975,30.081,39.199,30 -18:31:14,455.0932,29.949,30.081,38.751,30 -18:31:15,455.1490,29.923,30.133,39.196,30 -18:31:15,455.1950,29.923,30.054,38.748,30 -18:31:15,455.2400,29.923,30.054,40.105,30 -18:31:15,455.2887,29.923,30.081,40.106,30 -18:31:15,455.3355,29.949,30.081,39.642,30 -18:31:15,455.3854,29.923,30.107,39.195,30 -18:31:15,455.4315,29.949,30.107,39.194,30 -18:31:15,455.4785,29.923,30.107,38.746,30 -18:31:15,455.5245,29.923,30.107,39.192,30 -18:31:15,455.5714,29.923,30.107,39.191,30 -18:31:15,455.6192,29.923,30.107,39.19,30 -18:31:15,455.6643,29.949,30.054,39.189,30 -18:31:15,455.7115,29.949,30.081,39.653,30 -18:31:15,455.7589,29.949,30.107,39.189,30 -18:31:15,455.8064,29.975,30.054,38.741,30 -18:31:15,455.8536,29.975,30.054,39.203,30 -18:31:15,455.9023,29.923,30.081,39.203,30 -18:31:15,455.9525,29.975,30.081,39.632,30 -18:31:15,456.0028,29.949,30.081,38.737,30 -18:31:15,456.0514,29.923,30.107,39.183,30 -18:31:16,456.0983,29.975,30.081,39.182,30 -18:31:16,456.1435,29.949,30.107,38.734,30 -18:31:16,456.1905,29.975,30.081,38.733,30 -18:31:16,456.2379,29.923,30.133,38.731,30 -18:31:16,456.2863,29.975,30.054,38.73,30 -18:31:16,456.3342,29.975,30.054,39.192,30 -18:31:16,456.3817,30.002,30.081,39.192,30 -18:31:16,456.4283,29.949,30.054,38.262,30 -18:31:16,456.4752,29.923,30.107,39.636,30 -18:31:16,456.5215,29.949,30.081,39.171,30 -18:31:16,456.5665,30.002,30.081,39.171,30 -18:31:16,456.6120,29.975,30.054,38.258,30 -18:31:16,456.6592,30.002,30.054,39.185,30 -18:31:16,456.7060,29.975,30.028,38.72,30 -18:31:16,456.7532,30.002,30.054,39.63,30 -18:31:16,456.7986,29.923,30.081,38.718,30 -18:31:16,456.8451,29.923,30.107,39.611,30 -18:31:16,456.8916,29.975,30.054,39.164,30 -18:31:16,456.9403,30.028,30.081,39.18,30 -18:31:16,456.9885,30.002,30.081,37.803,30 -18:31:16,457.0362,30.002,30.133,38.247,30 -18:31:16,457.0838,29.923,30.107,37.351,30 -18:31:17,457.1311,29.975,30.133,39.153,30 -18:31:17,457.1783,30.002,30.054,37.811,30 -18:31:17,457.2263,29.923,30.107,38.702,30 -18:31:17,457.2760,29.949,30.081,39.148,30 -18:31:17,457.3234,29.975,30.107,39.147,30 -18:31:17,457.3695,30.028,30.081,38.252,30 -18:31:17,457.4164,29.949,30.16,37.785,30 -18:31:17,457.4631,30.028,30.054,37.782,30 -18:31:17,457.5111,30.002,30.081,38.244,30 -18:31:17,457.5593,29.949,30.107,38.224,30 -18:31:17,457.6071,29.949,30.081,38.686,30 -18:31:17,457.6550,30.002,30.054,39.132,30 -18:31:17,457.7031,29.975,30.107,38.684,30 -18:31:17,457.7508,29.949,30.081,38.235,30 -18:31:17,457.7984,30.028,30.081,39.128,30 -18:31:17,457.8450,29.949,30.081,37.768,30 -18:31:17,457.8928,29.975,30.054,39.124,30 -18:31:17,457.9406,30.002,30.133,39.14,30 -18:31:17,457.9882,30.002,30.107,37.316,30 -18:31:17,458.0366,30.028,30.081,37.76,30 -18:31:17,458.0837,29.949,30.081,37.757,30 -18:31:18,458.1298,29.975,30.107,39.112,30 -18:31:18,458.1768,29.949,30.081,38.217,30 -18:31:18,458.2228,30.002,30.133,39.11,30 -18:31:18,458.2749,29.923,30.081,37.303,30 -18:31:18,458.3261,29.975,30.107,39.552,30 -18:31:18,458.3755,29.949,30.107,38.211,30 -18:31:18,458.4257,29.975,30.133,38.655,30 -18:31:18,458.4752,30.028,30.028,37.759,30 -18:31:18,458.5250,29.923,30.133,38.651,30 -18:31:18,458.5744,30.002,30.107,38.649,30 -18:31:18,458.6239,29.975,30.081,37.736,30 -18:31:18,458.6732,29.949,30.107,38.645,30 -18:31:18,458.7237,30.002,30.107,38.643,30 -18:31:18,458.7745,30.002,30.133,37.73,30 -18:31:18,458.8250,30.028,30.081,37.279,30 -18:31:18,458.8744,29.949,30.133,37.723,30 -18:31:18,458.9233,29.975,30.081,38.184,30 -18:31:18,458.9722,30.002,30.054,38.629,30 -18:31:18,459.0232,29.949,30.133,38.627,30 -18:31:18,459.0735,30.028,30.081,38.178,30 -18:31:19,459.1211,29.975,30.107,37.712,30 -18:31:19,459.1685,30.002,30.133,38.173,30 -18:31:19,459.2147,29.975,30.107,37.259,30 -18:31:19,459.2609,29.949,30.107,38.167,30 -18:31:19,459.3086,29.949,30.133,38.612,30 -18:31:19,459.3556,30.002,30.081,38.164,30 -18:31:19,459.4028,29.949,30.107,38.144,30 -18:31:19,459.4497,29.975,30.16,38.606,30 -18:31:19,459.4951,29.949,30.107,37.246,30 -18:31:19,459.5417,29.949,30.133,38.601,30 -18:31:19,459.5898,30.028,30.081,38.153,30 -18:31:19,459.6379,30.028,30.133,37.686,30 -18:31:19,459.6856,30.002,30.133,36.789,30 -18:31:19,459.7335,29.949,30.133,37.231,30 -18:31:19,459.7787,29.975,30.133,38.139,30 -18:31:19,459.8271,29.975,30.133,37.69,30 -18:31:19,459.8748,30.002,30.16,37.687,30 -18:31:19,459.9236,30.028,30.186,36.755,30 -18:31:19,459.9706,30.002,30.107,35.856,30 -18:31:19,460.0222,29.949,30.133,37.656,30 -18:31:19,460.0715,29.975,30.16,38.118,30 -18:31:20,460.1199,30.028,30.081,37.204,30 -18:31:20,460.1699,29.975,30.107,37.647,30 -18:31:20,460.2206,29.949,30.133,38.109,30 -18:31:20,460.2702,30.002,30.133,38.106,30 -18:31:20,460.3186,29.923,30.107,37.192,30 -18:31:20,460.3662,30.028,30.133,38.994,30 -18:31:20,460.4124,30.002,30.133,36.74,30 -18:31:20,460.4604,30.028,30.107,37.183,30 -18:31:20,460.5077,30.002,30.107,37.18,30 -18:31:20,460.5536,30.002,30.133,37.623,30 -18:31:20,460.6024,30.002,30.107,37.173,30 -18:31:20,460.6526,30.002,30.081,37.617,30 -18:31:20,460.7005,30.028,30.081,38.061,30 -18:31:20,460.7478,30.028,30.107,37.611,30 -18:31:20,460.7946,30.028,30.133,37.161,30 -18:31:20,460.8427,30.028,30.081,36.71,30 -18:31:20,460.8884,29.949,30.133,37.6,30 -18:31:20,460.9366,29.975,30.107,38.062,30 -18:31:20,460.9857,30.028,30.107,38.06,30 -18:31:20,461.0356,30.028,30.002,37.146,30 -18:31:20,461.0827,29.975,30.133,38.948,30 -18:31:21,461.1305,30.054,30.133,37.606,30 -18:31:21,461.1791,30.002,30.133,36.244,30 -18:31:21,461.2279,30.054,30.107,37.133,30 -18:31:21,461.2771,30.002,30.107,36.682,30 -18:31:21,461.3234,29.975,30.081,37.572,30 -18:31:21,461.3722,29.975,30.107,38.481,30 -18:31:21,461.4195,29.975,30.16,38.032,30 -18:31:21,461.4680,30.002,30.107,37.118,30 -18:31:21,461.5139,29.975,30.107,37.562,30 -18:31:21,461.5605,29.949,30.133,38.023,30 -18:31:21,461.6073,29.975,30.133,38.021,30 -18:31:21,461.6542,29.975,30.133,37.571,30 -18:31:21,461.7012,30.028,30.081,37.569,30 -18:31:21,461.7476,30.002,30.133,37.548,30 -18:31:21,461.7954,30.002,30.16,37.098,30 -18:31:21,461.8456,30.054,30.107,36.63,30 -18:31:21,461.8946,29.975,30.081,36.643,30 -18:31:21,461.9466,29.975,30.16,38.444,30 -18:31:21,461.9952,29.975,30.133,37.084,30 -18:31:21,462.0440,29.975,30.186,37.544,30 -18:31:21,462.0927,29.949,30.133,36.63,30 -18:31:22,462.1395,30.002,30.081,37.984,30 -18:31:22,462.1872,30.054,30.081,37.965,30 -18:31:22,462.2348,30.002,30.133,37.068,30 -18:31:22,462.2850,29.975,30.133,37.064,30 -18:31:22,462.3357,29.975,30.107,37.525,30 -18:31:22,462.3857,30.028,30.054,37.969,30 -18:31:22,462.4354,30.054,30.107,37.967,30 -18:31:22,462.4824,30.002,30.107,36.606,30 -18:31:22,462.5282,29.975,30.133,37.496,30 -18:31:22,462.5758,30.002,30.107,37.51,30 -18:31:22,462.6227,30.002,30.081,37.49,30 -18:31:22,462.6702,30.028,30.133,37.934,30 -18:31:22,462.7183,30.002,30.133,36.59,30 -18:31:22,462.7680,29.975,30.133,37.033,30 -18:31:22,462.8155,30.028,30.107,37.494,30 -18:31:22,462.8639,30.028,30.133,37.026,30 -18:31:22,462.9105,30.002,30.081,36.575,30 -18:31:22,462.9594,30.028,30.107,37.913,30 -18:31:22,463.0063,30.054,30.054,37.016,30 -18:31:22,463.0534,30.028,30.107,37.477,30 -18:31:23,463.1006,29.975,30.133,37.009,30 -18:31:23,463.1466,30.028,30.133,37.47,30 -18:31:23,463.1941,29.975,30.133,36.556,30 -18:31:23,463.2415,30.028,30.107,37.463,30 -18:31:23,463.2884,29.975,30.133,36.996,30 -18:31:23,463.3358,30.028,30.081,37.456,30 -18:31:23,463.3835,30.002,30.133,37.436,30 -18:31:23,463.4299,29.975,30.133,36.986,30 -18:31:23,463.4770,29.975,30.133,37.447,30 -18:31:23,463.5254,30.054,30.107,37.444,30 -18:31:23,463.5731,30.002,30.107,36.529,30 -18:31:23,463.6205,30.028,30.107,37.419,30 -18:31:23,463.6674,30.002,30.16,36.969,30 -18:31:23,463.7155,29.949,30.107,36.501,30 -18:31:23,463.7602,30.002,30.107,38.32,30 -18:31:23,463.8046,30.028,30.081,37.407,30 -18:31:23,463.8534,29.975,30.16,37.404,30 -18:31:23,463.9015,30.028,30.081,36.954,30 -18:31:23,463.9533,30.028,30.107,37.397,30 -18:31:23,464.0035,30.028,30.081,36.947,30 -18:31:23,464.0536,30.028,30.107,37.39,30 -18:31:24,464.1027,29.975,30.133,36.94,30 -18:31:24,464.1545,30.002,30.133,37.401,30 -18:31:24,464.2034,30.002,30.107,36.933,30 -18:31:24,464.2602,30.028,30.133,37.377,30 -18:31:24,464.3066,30.054,30.107,36.478,30 -18:31:24,464.3529,30.054,30.186,36.474,30 -18:31:24,464.4025,30.054,30.081,35.111,30 -18:31:24,464.4511,30.054,30.133,36.91,30 -18:31:24,464.5007,30.002,30.081,36.012,30 -18:31:24,464.5507,30.054,30.107,37.796,30 -18:31:24,464.5977,30.081,30.133,36.452,30 -18:31:24,464.6437,30.002,30.107,35.536,30 -18:31:24,464.6908,30.081,30.107,37.336,30 -18:31:24,464.7381,30.081,30.212,35.974,30 -18:31:24,464.7851,30.054,30.133,34.163,30 -18:31:24,464.8335,30.002,30.16,35.979,30 -18:31:24,464.8800,30.054,30.028,36.404,30 -18:31:24,464.9269,30.028,30.133,37.775,30 -18:31:24,464.9757,30.054,30.107,36.414,30 -18:31:24,465.0237,30.028,30.107,36.41,30 -18:31:24,465.0725,30.002,30.107,36.852,30 -18:31:25,465.1204,30.054,30.107,37.296,30 -18:31:25,465.1677,30.054,30.107,36.399,30 -18:31:25,465.2155,30.002,30.081,36.394,30 -18:31:25,465.2625,30.028,30.107,37.731,30 -18:31:25,465.3142,30.002,30.081,36.835,30 -18:31:25,465.3666,30.028,30.133,37.725,30 -18:31:25,465.4194,30.002,30.107,36.381,30 -18:31:25,465.4679,30.002,30.081,37.271,30 -18:31:25,465.5153,30.028,30.081,37.715,30 -18:31:25,465.5622,30.028,30.133,37.266,30 -18:31:25,465.6100,30.054,30.002,36.368,30 -18:31:25,465.6789,30.028,30.16,38.17,30 -18:31:25,465.7352,30.054,30.212,35.896,30 -18:31:25,465.7967,30.054,30.107,34.548,30 -18:31:25,465.8557,30.054,30.133,36.345,30 -18:31:25,465.9155,30.028,30.16,35.892,30 -18:31:25,465.9721,30.028,30.107,35.869,30 -18:31:25,466.0274,30.002,30.107,36.775,30 -18:31:25,466.0806,30.002,30.028,37.218,30 -18:31:26,466.1362,30.081,30.133,38.573,30 -18:31:26,466.1899,30.002,30.133,35.407,30 -18:31:26,466.2437,30.002,30.107,36.759,30 -18:31:26,466.3036,30.028,30.081,37.202,30 -18:31:26,466.3587,30.002,30.133,37.198,30 -18:31:26,466.4122,30.054,30.133,36.748,30 -18:31:26,466.4656,30.054,30.081,35.849,30 -18:31:26,466.5215,30.002,30.107,36.738,30 -18:31:26,466.5817,30.054,30.133,37.181,30 -18:31:26,466.6439,30.028,30.133,35.835,30 -18:31:26,466.6999,30.028,30.107,36.276,30 -18:31:26,466.7515,30.081,30.107,36.718,30 -18:31:26,466.8036,29.975,30.133,35.802,30 -18:31:26,466.8563,30.002,30.16,37.173,30 -18:31:26,466.9080,30.002,30.133,36.241,30 -18:31:26,466.9587,30.081,30.107,36.701,30 -18:31:26,467.0100,30.002,30.186,35.785,30 -18:31:26,467.0608,30.081,30.107,35.779,30 -18:31:27,467.1120,30.028,30.16,35.774,30 -18:31:27,467.1625,30.054,30.16,35.768,30 -18:31:27,467.2234,30.054,30.133,35.315,30 -18:31:27,467.2715,30.028,30.16,35.773,30 -18:31:27,467.3197,30.133,30.107,35.751,30 -18:31:27,467.3666,30.028,30.133,34.851,30 -18:31:27,467.4158,30.028,30.133,36.203,30 -18:31:27,467.4619,30.054,30.107,36.199,30 -18:31:27,467.5100,30.002,30.16,36.195,30 -18:31:27,467.5579,30.054,30.107,36.173,30 -18:31:27,467.6055,30.002,30.133,36.186,30 -18:31:27,467.6541,30.028,30.107,36.629,30 -18:31:27,467.7018,30.081,30.107,36.625,30 -18:31:27,467.7505,30.002,30.107,35.71,30 -18:31:27,467.8008,30.028,30.16,37.063,30 -18:31:27,467.8505,30.002,30.16,35.701,30 -18:31:27,467.8972,30.002,30.16,36.143,30 -18:31:27,467.9448,30.054,30.107,36.139,30 -18:31:27,467.9906,30.054,30.133,36.151,30 -18:31:27,468.0365,30.081,30.107,35.7,30 -18:31:27,468.0844,30.028,30.16,35.678,30 -18:31:28,468.1350,30.054,30.107,35.673,30 -18:31:28,468.1828,30.002,30.133,36.132,30 -18:31:28,468.2291,30.028,30.133,36.575,30 -18:31:28,468.2760,30.028,30.133,36.124,30 -18:31:28,468.3238,30.028,30.16,36.12,30 -18:31:28,468.3727,30.028,30.133,35.651,30 -18:31:28,468.4209,30.054,30.107,36.11,30 -18:31:28,468.4689,30.028,30.16,36.106,30 -18:31:28,468.5156,30.054,30.107,35.637,30 -18:31:28,468.5618,30.002,30.133,36.096,30 -18:31:28,468.6085,30.054,30.107,36.539,30 -18:31:28,468.6557,30.002,30.16,36.088,30 -18:31:28,468.7034,30.002,30.16,36.067,30 -18:31:28,468.7516,30.002,30.107,36.062,30 -18:31:28,468.7981,30.002,30.186,36.969,30 -18:31:28,468.8455,30.054,30.107,35.608,30 -18:31:28,468.8942,30.002,30.133,36.067,30 -18:31:28,468.9443,30.002,30.16,36.51,30 -18:31:28,468.9936,30.028,30.107,36.042,30 -18:31:28,469.0439,30.002,30.133,36.501,30 -18:31:28,469.0917,30.002,30.133,36.498,30 -18:31:29,469.1424,30.028,30.133,36.494,30 -18:31:29,469.1901,30.081,30.107,36.043,30 -18:31:29,469.2412,30.028,30.133,35.574,30 -18:31:29,469.2923,30.002,30.133,36.033,30 -18:31:29,469.3431,30.002,30.133,36.475,30 -18:31:29,469.3937,30.054,30.107,36.472,30 -18:31:29,469.4438,30.054,30.133,36.02,30 -18:31:29,469.4935,30.028,30.133,35.568,30 -18:31:29,469.5450,30.081,30.107,36.01,30 -18:31:29,469.5958,30.107,30.107,35.541,30 -18:31:29,469.6465,30.054,30.133,35.089,30 -18:31:29,469.6936,30.028,30.107,35.547,30 -18:31:29,469.7434,30.054,30.107,36.436,30 -18:31:29,469.7935,30.028,30.133,35.985,30 -18:31:29,469.8426,30.054,30.107,35.98,30 -18:31:29,469.8931,30.054,30.081,35.976,30 -18:31:29,469.9439,30.002,30.107,36.419,30 -18:31:29,469.9941,30.028,30.081,36.862,30 -18:31:29,470.0429,30.081,30.16,36.859,30 -18:31:29,470.0923,30.002,30.133,34.585,30 -18:31:30,470.1449,30.054,30.107,36.402,30 -18:31:30,470.1944,30.081,30.16,35.95,30 -18:31:30,470.2448,30.028,30.133,34.57,30 -18:31:30,470.2942,30.028,30.133,35.939,30 -18:31:30,470.3432,30.107,30.133,35.934,30 -18:31:30,470.3937,30.002,30.133,34.571,30 -18:31:30,470.4436,30.054,30.133,36.37,30 -18:31:30,470.4908,30.028,30.107,35.472,30 -18:31:30,470.5387,30.107,30.133,36.361,30 -18:31:30,470.5884,30.028,30.107,34.552,30 -18:31:30,470.6376,30.002,30.133,36.351,30 -18:31:30,470.6870,30.028,30.16,36.347,30 -18:31:30,470.7348,30.028,30.133,35.432,30 -18:31:30,470.7849,30.028,30.133,35.891,30 -18:31:30,470.8346,30.028,30.107,35.886,30 -18:31:30,470.8848,29.975,30.16,36.329,30 -18:31:30,470.9355,30.028,30.107,36.325,30 -18:31:30,470.9849,30.028,30.16,36.321,30 -18:31:30,471.0378,30.054,30.133,35.406,30 -18:31:30,471.0862,30.054,30.107,35.417,30 -18:31:31,471.1334,30.081,30.107,35.859,30 -18:31:31,471.1808,30.028,30.133,35.391,30 -18:31:31,471.2273,30.081,30.107,35.85,30 -18:31:31,471.2739,30.028,30.133,35.381,30 -18:31:31,471.3228,30.054,30.107,35.841,30 -18:31:31,471.3698,30.028,30.133,35.836,30 -18:31:31,471.4169,30.107,30.107,35.832,30 -18:31:31,471.4652,30.028,30.133,34.916,30 -18:31:31,471.5172,30.028,30.133,35.822,30 -18:31:31,471.5686,30.081,30.186,35.817,30 -18:31:31,471.6419,30.054,30.107,33.987,30 -18:31:31,471.6941,30.028,30.186,35.801,30 -18:31:31,471.7452,30.028,30.133,34.885,30 -18:31:31,471.7935,30.081,30.16,35.791,30 -18:31:31,471.8443,30.028,30.107,34.41,30 -18:31:31,471.8925,30.054,30.16,36.227,30 -18:31:31,471.9445,30.054,30.107,34.864,30 -18:31:31,471.9965,30.028,30.16,35.769,30 -18:31:31,472.0459,30.054,30.107,35.3,30 -18:31:31,472.0952,30.054,30.133,35.759,30 -18:31:32,472.1466,30.028,30.107,35.307,30 -18:31:32,472.1967,30.054,30.107,36.196,30 -18:31:32,472.2462,30.028,30.133,35.745,30 -18:31:32,472.2969,30.054,30.133,35.741,30 -18:31:32,472.3468,30.054,30.133,35.289,30 -18:31:32,472.3986,30.081,30.133,35.284,30 -18:31:32,472.4497,30.054,30.107,34.814,30 -18:31:32,472.5006,30.081,30.133,35.719,30 -18:31:32,472.5518,30.081,30.107,34.803,30 -18:31:32,472.6046,30.107,30.107,35.244,30 -18:31:32,472.6536,30.028,30.107,34.791,30 -18:31:32,472.7014,30.081,30.107,36.144,30 -18:31:32,472.7493,30.054,30.133,35.228,30 -18:31:32,472.7996,30.028,30.133,35.24,30 -18:31:32,472.8485,30.028,30.16,35.682,30 -18:31:32,472.8975,30.028,30.133,35.213,30 -18:31:32,472.9483,30.028,30.107,35.672,30 -18:31:32,472.9960,30.028,30.133,36.115,30 -18:31:32,473.0427,30.054,30.133,35.664,30 -18:31:32,473.0880,30.081,30.081,35.213,30 -18:31:33,473.1356,30.054,30.107,35.638,30 -18:31:33,473.1829,30.054,30.133,35.651,30 -18:31:33,473.2323,30.054,30.133,35.199,30 -18:31:33,473.2793,30.107,30.107,35.194,30 -18:31:33,473.3265,30.054,30.133,34.724,30 -18:31:33,473.3737,30.002,30.133,35.183,30 -18:31:33,473.4195,30.081,30.107,36.072,30 -18:31:33,473.4662,30.081,30.107,35.157,30 -18:31:33,473.5165,30.028,30.16,35.152,30 -18:31:33,473.5651,30.028,30.16,35.147,30 -18:31:33,473.6143,30.081,30.081,35.142,30 -18:31:33,473.6608,30.028,30.133,35.584,30 -18:31:33,473.7076,30.054,30.133,35.597,30 -18:31:33,473.7539,30.054,30.107,35.145,30 -18:31:33,473.8017,30.054,30.16,35.587,30 -18:31:33,473.8512,30.133,30.107,34.671,30 -18:31:33,473.9002,30.028,30.133,34.218,30 -18:31:33,473.9517,30.028,30.16,35.57,30 -18:31:33,474.0016,30.054,30.107,35.101,30 -18:31:33,474.0567,30.107,30.16,35.56,30 -18:31:34,474.1068,30.054,30.16,33.731,30 -18:31:34,474.1601,30.028,30.133,34.635,30 -18:31:34,474.2070,30.054,30.133,35.541,30 -18:31:34,474.2546,29.949,30.133,35.089,30 -18:31:34,474.3014,30.054,30.186,36.89,30 -18:31:34,474.3498,30.054,30.16,34.17,30 -18:31:34,474.3987,30.028,30.107,34.611,30 -18:31:34,474.4459,30.028,30.212,35.964,30 -18:31:34,474.4926,30.028,30.16,34.154,30 -18:31:34,474.5400,30.081,30.133,35.042,30 -18:31:34,474.5868,30.054,30.133,34.59,30 -18:31:34,474.6340,30.107,30.16,35.049,30 -18:31:34,474.6821,30.081,30.133,33.668,30 -18:31:34,474.7313,30.054,30.16,34.572,30 -18:31:34,474.7800,30.028,30.133,34.566,30 -18:31:34,474.8269,30.054,30.107,35.471,30 -18:31:34,474.8757,30.054,30.107,35.467,30 -18:31:34,474.9255,30.054,30.16,35.463,30 -18:31:34,474.9743,30.107,30.107,34.546,30 -18:31:34,475.0223,30.081,30.107,34.54,30 -18:31:34,475.0713,30.028,30.081,34.982,30 -18:31:35,475.1191,30.028,30.133,36.335,30 -18:31:35,475.1666,30.054,30.133,35.438,30 -18:31:35,475.2139,30.081,30.107,34.986,30 -18:31:35,475.2605,30.054,30.133,34.964,30 -18:31:35,475.3087,30.054,30.133,34.976,30 -18:31:35,475.3564,30.081,30.107,34.971,30 -18:31:35,475.4041,30.028,30.16,34.949,30 -18:31:35,475.4513,30.107,30.107,34.944,30 -18:31:35,475.5003,30.054,30.16,34.492,30 -18:31:35,475.5483,30.054,30.16,34.486,30 -18:31:35,475.5953,30.107,30.081,34.48,30 -18:31:35,475.6428,30.028,30.133,34.921,30 -18:31:35,475.6905,30.081,30.133,35.38,30 -18:31:35,475.7376,30.054,30.133,34.464,30 -18:31:35,475.7850,30.107,30.107,34.923,30 -18:31:35,475.8326,30.133,30.107,34.454,30 -18:31:35,475.8780,30.054,30.133,34.001,30 -18:31:35,475.9253,30.081,30.133,34.906,30 -18:31:35,475.9730,30.028,30.133,34.436,30 -18:31:35,476.0200,30.081,30.133,35.342,30 -18:31:35,476.0672,30.081,30.107,34.426,30 -18:31:36,476.1155,30.054,30.16,34.868,30 -18:31:36,476.1648,30.054,30.16,34.415,30 -18:31:36,476.2142,30.028,30.16,34.409,30 -18:31:36,476.2637,30.081,30.186,34.851,30 -18:31:36,476.3141,30.081,30.107,33.486,30 -18:31:36,476.3644,30.107,30.133,34.837,30 -18:31:36,476.4129,30.002,30.16,33.938,30 -18:31:36,476.4584,30.081,30.16,35.273,30 -18:31:36,476.5048,30.081,30.16,33.91,30 -18:31:36,476.5532,30.028,30.16,33.903,30 -18:31:36,476.6018,30.028,30.133,34.808,30 -18:31:36,476.6486,30.107,30.16,35.268,30 -18:31:36,476.6960,30.107,30.133,33.44,30 -18:31:36,476.7441,30.054,30.133,33.897,30 -18:31:36,476.7945,30.081,30.16,34.802,30 -18:31:36,476.8432,30.028,30.107,33.868,30 -18:31:36,476.8916,30.107,30.133,35.685,30 -18:31:36,476.9402,30.107,30.107,33.875,30 -18:31:36,476.9877,30.081,30.133,34.315,30 -18:31:36,477.0374,30.081,30.16,34.31,30 -18:31:36,477.0838,30.081,30.133,33.839,30 -18:31:37,477.1331,30.054,30.16,34.297,30 -18:31:37,477.1812,30.081,30.16,34.291,30 -18:31:37,477.2299,30.081,30.133,33.821,30 -18:31:37,477.2775,30.002,30.133,34.278,30 -18:31:37,477.3265,30.107,30.133,35.631,30 -18:31:37,477.3741,30.002,30.133,33.822,30 -18:31:37,477.4234,30.028,30.133,35.621,30 -18:31:37,477.4707,30.054,30.16,35.17,30 -18:31:37,477.5183,30.133,30.133,34.254,30 -18:31:37,477.5648,30.133,30.16,33.354,30 -18:31:37,477.6114,30.054,30.133,32.882,30 -18:31:37,477.6592,30.081,30.16,34.698,30 -18:31:37,477.7067,30.054,30.133,33.764,30 -18:31:37,477.7555,30.081,30.107,34.686,30 -18:31:37,477.8033,30.054,30.133,34.664,30 -18:31:37,477.8517,30.054,30.133,34.676,30 -18:31:37,477.8990,30.054,30.16,34.671,30 -18:31:37,477.9495,30.054,30.133,34.201,30 -18:31:37,477.9982,30.054,30.107,34.659,30 -18:31:37,478.0486,30.054,30.186,35.101,30 -18:31:37,478.0958,30.107,30.107,33.738,30 -18:31:38,478.1435,30.054,30.16,34.179,30 -18:31:38,478.1907,30.107,30.133,34.173,30 -18:31:38,478.2373,30.054,30.16,33.72,30 -18:31:38,478.2839,30.054,30.133,34.161,30 -18:31:38,478.3328,30.081,30.16,34.619,30 -18:31:38,478.3815,30.081,30.133,33.685,30 -18:31:38,478.4293,30.081,30.107,34.143,30 -18:31:38,478.4754,30.054,30.16,34.584,30 -18:31:38,478.5233,30.081,30.133,34.132,30 -18:31:38,478.5688,30.081,30.133,34.126,30 -18:31:38,478.6161,30.107,30.133,34.121,30 -18:31:38,478.6646,30.081,30.133,33.668,30 -18:31:38,478.7129,30.002,30.16,34.108,30 -18:31:38,478.7606,30.081,30.133,34.997,30 -18:31:38,478.8064,30.133,30.16,34.098,30 -18:31:38,478.8531,30.054,30.16,32.734,30 -18:31:38,478.8995,30.054,30.16,34.085,30 -18:31:38,478.9501,30.054,30.212,34.079,30 -18:31:38,478.9994,30.081,30.133,33.178,30 -18:31:38,479.0471,30.081,30.16,34.065,30 -18:31:38,479.0932,30.081,30.133,33.595,30 -18:31:39,479.1405,30.133,30.133,34.053,30 -18:31:39,479.1894,30.107,30.133,33.153,30 -18:31:39,479.2386,30.081,30.133,33.593,30 -18:31:39,479.2871,30.081,30.133,34.033,30 -18:31:39,479.3361,30.054,30.133,34.027,30 -18:31:39,479.3868,30.054,30.186,34.486,30 -18:31:39,479.4366,30.081,30.133,33.569,30 -18:31:39,479.4880,30.002,30.186,34.009,30 -18:31:39,479.5397,30.107,30.16,34.45,30 -18:31:39,479.5900,30.081,30.107,33.085,30 -18:31:39,479.6382,30.081,30.107,34.437,30 -18:31:39,479.6877,30.054,30.133,34.432,30 -18:31:39,479.7387,30.054,30.16,34.443,30 -18:31:39,479.7868,30.081,30.16,33.973,30 -18:31:39,479.8359,30.081,30.133,33.503,30 -18:31:39,479.8875,30.081,30.16,33.961,30 -18:31:39,479.9382,30.107,30.16,33.49,30 -18:31:39,479.9900,30.054,30.186,33.036,30 -18:31:39,480.0394,30.107,30.107,33.492,30 -18:31:39,480.0890,30.107,30.133,33.933,30 -18:31:40,480.1386,30.081,30.081,33.48,30 -18:31:40,480.1877,30.107,30.186,34.814,30 -18:31:40,480.2416,30.081,30.133,32.557,30 -18:31:40,480.2914,30.081,30.133,33.907,30 -18:31:40,480.3480,30.133,30.186,33.901,30 -18:31:40,480.4025,30.107,30.133,32.086,30 -18:31:40,480.4524,30.081,30.16,33.436,30 -18:31:40,480.5043,30.054,30.16,33.412,30 -18:31:40,480.5551,30.054,30.16,33.869,30 -18:31:40,480.6056,30.107,30.133,33.863,30 -18:31:40,480.6879,30.133,30.081,33.41,30 -18:31:40,480.7497,30.107,30.16,33.846,30 -18:31:40,480.8077,30.107,30.107,32.926,30 -18:31:40,480.8662,30.081,30.16,33.83,30 -18:31:40,480.9240,30.081,30.16,33.358,30 -18:31:40,480.9816,30.081,30.186,33.35,30 -18:31:40,481.0368,30.054,30.107,32.895,30 -18:31:41,481.0989,30.028,30.186,34.71,30 -18:31:41,481.1586,30.054,30.133,33.792,30 -18:31:41,481.2185,30.133,30.133,34.249,30 -18:31:41,481.2738,30.002,30.212,32.884,30 -18:31:41,481.3282,30.107,30.186,33.77,30 -18:31:41,481.3858,30.107,30.133,32.404,30 -18:31:41,481.4479,30.054,30.16,33.307,30 -18:31:41,481.5062,30.081,30.186,33.745,30 -18:31:41,481.5679,30.002,30.16,32.826,30 -18:31:41,481.6223,30.081,30.133,34.624,30 -18:31:41,481.6811,30.107,30.186,33.724,30 -18:31:41,481.7358,30.081,30.16,32.358,30 -18:31:41,481.7894,30.107,30.16,33.243,30 -18:31:41,481.8395,30.081,30.186,32.788,30 -18:31:41,481.8936,30.081,30.107,32.781,30 -18:31:41,481.9460,30.081,30.16,34.132,30 -18:31:41,481.9997,30.133,30.133,33.214,30 -18:31:41,482.0501,30.054,30.16,32.777,30 -18:31:42,482.1001,30.133,30.081,33.664,30 -18:31:42,482.1505,30.081,30.16,33.658,30 -18:31:42,482.2085,30.054,30.16,33.187,30 -18:31:42,482.2591,30.054,30.16,33.643,30 -18:31:42,482.3093,30.081,30.133,33.637,30 -18:31:42,482.3578,30.081,30.133,33.631,30 -18:31:42,482.4073,30.107,30.133,33.625,30 -18:31:42,482.4585,30.107,30.133,33.172,30 -18:31:42,482.5078,30.107,30.107,33.165,30 -18:31:42,482.5581,30.16,30.133,33.605,30 -18:31:42,482.6076,30.054,30.107,32.24,30 -18:31:42,482.6595,30.028,30.133,34.503,30 -18:31:42,482.7086,30.054,30.133,34.498,30 -18:31:42,482.7586,30.054,30.16,34.046,30 -18:31:42,482.8084,30.081,30.133,33.576,30 -18:31:42,482.8589,30.054,30.186,33.57,30 -18:31:42,482.9096,30.107,30.133,33.117,30 -18:31:42,482.9612,30.107,30.133,33.11,30 -18:31:42,483.0105,30.081,30.133,33.103,30 -18:31:42,483.0662,30.081,30.133,33.543,30 -18:31:43,483.1152,30.16,30.133,33.536,30 -18:31:43,483.1629,30.081,30.107,32.172,30 -18:31:43,483.2098,30.054,30.107,33.97,30 -18:31:43,483.2575,30.081,30.133,34.429,30 -18:31:43,483.3057,30.081,30.16,33.513,30 -18:31:43,483.3546,30.081,30.186,33.043,30 -18:31:43,483.4038,30.107,30.107,32.589,30 -18:31:43,483.4527,30.107,30.16,33.493,30 -18:31:43,483.5033,30.081,30.16,32.575,30 -18:31:43,483.5525,30.107,30.16,33.015,30 -18:31:43,483.6025,30.081,30.186,32.561,30 -18:31:43,483.6530,30.133,30.133,32.553,30 -18:31:43,483.7027,30.133,30.133,32.563,30 -18:31:43,483.7545,30.081,30.16,32.555,30 -18:31:43,483.8050,30.133,30.133,32.977,30 -18:31:43,483.8535,30.133,30.133,32.54,30 -18:31:43,483.9016,30.054,30.133,32.533,30 -18:31:43,483.9523,30.081,30.133,33.884,30 -18:31:43,484.0022,30.133,30.107,33.415,30 -18:31:43,484.0521,30.107,30.16,32.961,30 -18:31:44,484.1007,30.081,30.16,32.49,30 -18:31:44,484.1497,30.081,30.16,32.93,30 -18:31:44,484.1974,30.054,30.186,32.923,30 -18:31:44,484.2427,30.081,30.186,32.934,30 -18:31:44,484.2897,30.081,30.186,32.463,30 -18:31:44,484.3359,30.081,30.186,32.456,30 -18:31:44,484.3873,30.133,30.16,32.449,30 -18:31:44,484.4377,30.133,30.16,31.994,30 -18:31:44,484.4875,30.107,30.186,31.985,30 -18:31:44,484.5346,30.133,30.16,31.977,30 -18:31:44,484.5833,30.107,30.212,31.969,30 -18:31:44,484.6300,30.107,30.133,31.514,30 -18:31:44,484.6795,30.133,30.133,32.864,30 -18:31:44,484.7269,30.107,30.081,32.41,30 -18:31:44,484.7746,30.081,30.186,33.744,30 -18:31:44,484.8224,30.107,30.133,32.381,30 -18:31:44,484.8710,30.081,30.133,32.838,30 -18:31:44,484.9171,30.16,30.133,33.278,30 -18:31:44,484.9661,30.081,30.16,31.914,30 -18:31:44,485.0158,30.107,30.107,32.8,30 -18:31:44,485.0641,30.133,30.107,33.258,30 -18:31:45,485.1130,30.133,30.16,32.805,30 -18:31:45,485.1666,30.133,30.16,31.886,30 -18:31:45,485.2170,30.081,30.133,31.877,30 -18:31:45,485.2659,30.133,30.133,33.228,30 -18:31:45,485.3153,30.107,30.133,32.327,30 -18:31:45,485.3637,30.081,30.186,32.767,30 -18:31:45,485.4132,30.107,30.16,32.296,30 -18:31:45,485.4621,30.107,30.16,32.289,30 -18:31:45,485.5098,30.081,30.16,32.281,30 -18:31:45,485.5572,30.054,30.16,32.721,30 -18:31:45,485.6058,30.081,30.16,33.179,30 -18:31:45,485.6551,30.133,30.186,32.708,30 -18:31:45,485.7032,30.081,30.133,31.36,30 -18:31:45,485.7537,30.16,30.133,33.157,30 -18:31:45,485.8030,30.081,30.16,31.792,30 -18:31:45,485.8525,30.081,30.186,32.678,30 -18:31:45,485.9014,30.081,30.133,32.224,30 -18:31:45,485.9533,30.054,30.133,33.128,30 -18:31:45,486.0025,30.107,30.133,33.587,30 -18:31:45,486.0513,30.133,30.133,32.67,30 -18:31:46,486.0992,30.107,30.133,32.216,30 -18:31:46,486.1467,30.081,30.133,32.656,30 -18:31:46,486.1967,30.107,30.186,33.096,30 -18:31:46,486.2444,30.133,30.107,31.731,30 -18:31:46,486.2916,30.107,30.107,32.635,30 -18:31:46,486.3391,30.081,30.16,33.076,30 -18:31:46,486.3881,30.081,30.16,32.605,30 -18:31:46,486.4349,30.107,30.186,32.599,30 -18:31:46,486.4875,30.081,30.133,31.698,30 -18:31:46,486.5376,30.081,30.16,33.048,30 -18:31:46,486.5929,30.107,30.054,32.578,30 -18:31:46,486.6403,30.107,30.133,33.946,30 -18:31:46,486.6878,30.054,30.133,32.583,30 -18:31:46,486.7356,30.16,30.133,33.488,30 -18:31:46,486.7847,30.107,30.133,31.66,30 -18:31:46,486.8341,30.081,30.16,32.563,30 -18:31:46,486.8817,30.081,30.16,32.539,30 -18:31:46,486.9300,30.107,30.16,32.533,30 -18:31:46,486.9805,30.107,30.054,32.079,30 -18:31:46,487.0368,30.107,30.16,33.895,30 -18:31:46,487.0846,30.107,30.107,32.066,30 -18:31:47,487.1331,30.081,30.16,32.97,30 -18:31:47,487.1815,30.081,30.133,32.5,30 -18:31:47,487.2309,30.133,30.133,32.957,30 -18:31:47,487.2797,30.054,30.133,32.057,30 -18:31:47,487.3270,30.107,30.16,33.408,30 -18:31:47,487.3748,30.054,30.133,32.027,30 -18:31:47,487.4238,30.002,30.107,33.396,30 -18:31:47,487.4718,30.16,30.107,34.732,30 -18:31:47,487.5183,30.133,30.16,32.012,30 -18:31:47,487.5662,30.107,30.107,31.558,30 -18:31:47,487.6139,30.107,30.054,32.908,30 -18:31:47,487.6636,30.081,30.133,33.814,30 -18:31:47,487.7142,30.081,30.133,32.898,30 -18:31:47,487.7655,30.133,30.107,32.892,30 -18:31:47,487.8151,30.107,30.107,32.438,30 -18:31:47,487.8634,30.16,30.107,32.879,30 -18:31:47,487.9144,30.081,30.133,31.961,30 -18:31:47,487.9655,30.107,30.107,32.865,30 -18:31:47,488.0161,30.028,30.107,32.859,30 -18:31:47,488.0667,30.081,30.186,34.211,30 -18:31:48,488.1150,30.107,30.133,31.937,30 -18:31:48,488.1650,30.054,30.133,32.394,30 -18:31:48,488.2120,30.107,30.16,33.299,30 -18:31:48,488.2595,30.081,30.16,31.918,30 -18:31:48,488.3066,30.133,30.133,32.358,30 -18:31:48,488.3552,30.133,30.133,31.921,30 -18:31:48,488.4036,30.081,30.107,31.914,30 -18:31:48,488.4514,30.107,30.16,33.248,30 -18:31:48,488.5000,30.028,30.133,31.884,30 -18:31:48,488.5474,30.107,30.16,33.7,30 -18:31:48,488.5981,30.107,30.16,31.873,30 -18:31:48,488.6446,30.081,30.16,31.865,30 -18:31:48,488.6923,30.081,30.133,32.305,30 -18:31:48,488.7395,30.081,30.186,32.763,30 -18:31:48,488.7877,30.054,30.16,31.845,30 -18:31:48,488.8352,30.107,30.107,32.75,30 -18:31:48,488.8887,30.081,30.133,32.744,30 -18:31:48,488.9402,30.107,30.133,32.737,30 -18:31:48,488.9885,30.081,30.186,32.284,30 -18:31:48,489.0382,30.054,30.133,31.813,30 -18:31:48,489.0864,30.081,30.16,33.181,30 -18:31:49,489.1336,30.081,30.16,32.247,30 -18:31:49,489.1810,30.133,30.133,32.241,30 -18:31:49,489.2295,30.107,30.107,31.804,30 -18:31:49,489.2799,30.054,30.133,32.691,30 -18:31:49,489.3271,30.107,30.133,33.15,30 -18:31:49,489.3828,30.107,30.186,32.233,30 -18:31:49,489.4340,30.081,30.16,31.313,30 -18:31:49,489.4832,30.028,30.16,32.199,30 -18:31:49,489.5313,30.081,30.054,33.104,30 -18:31:49,489.5793,30.133,30.133,34.011,30 -18:31:49,489.6278,30.107,30.16,31.754,30 -18:31:49,489.6763,30.107,30.16,31.729,30 -18:31:49,489.7225,30.054,30.133,31.722,30 -18:31:49,489.7702,30.054,30.133,33.091,30 -18:31:49,489.8177,30.16,30.16,33.086,30 -18:31:49,489.8660,30.081,30.133,30.793,30 -18:31:49,489.9142,30.081,30.133,32.607,30 -18:31:49,489.9653,30.133,30.081,32.602,30 -18:31:49,490.0124,30.107,30.186,32.595,30 -18:31:49,490.0646,30.081,30.107,31.231,30 -18:31:50,490.1135,29.975,30.133,33.028,30 -18:31:50,490.1673,30.133,30.16,34.399,30 -18:31:50,490.2163,30.081,30.16,31.213,30 -18:31:50,490.2669,30.054,30.186,32.099,30 -18:31:50,490.3183,30.054,30.16,32.11,30 -18:31:50,490.3686,30.081,30.186,32.55,30 -18:31:50,490.4196,30.133,30.16,31.632,30 -18:31:50,490.4733,30.081,30.186,31.177,30 -18:31:50,490.5236,30.054,30.133,31.615,30 -18:31:50,490.5732,30.081,30.133,32.984,30 -18:31:50,490.6236,30.054,30.186,32.514,30 -18:31:50,490.6707,30.081,30.186,32.061,30 -18:31:50,490.7206,30.081,30.212,31.59,30 -18:31:50,490.7679,30.133,30.16,31.135,30 -18:31:50,490.8165,30.107,30.16,31.127,30 -18:31:50,490.8644,30.107,30.133,31.566,30 -18:31:50,490.9125,30.133,30.186,32.023,30 -18:31:50,490.9607,30.081,30.133,30.658,30 -18:31:50,491.0105,30.054,30.16,32.455,30 -18:31:50,491.0579,30.107,30.16,32.449,30 -18:31:51,491.1053,30.054,30.212,31.532,30 -18:31:51,491.1528,30.107,30.081,31.542,30 -18:31:51,491.2009,30.081,30.186,32.876,30 -18:31:51,491.2519,30.054,30.186,31.512,30 -18:31:51,491.3038,30.107,30.212,31.968,30 -18:31:51,491.3552,30.054,30.186,30.602,30 -18:31:51,491.4066,30.054,30.186,31.952,30 -18:31:51,491.4564,30.054,30.212,31.945,30 -18:31:51,491.5068,30.054,30.186,31.491,30 -18:31:51,491.5599,30.107,30.16,31.93,30 -18:31:51,491.6092,30.028,30.186,31.459,30 -18:31:51,491.6572,30.081,30.212,32.363,30 -18:31:51,491.7064,30.081,30.16,30.998,30 -18:31:51,491.7537,30.133,30.16,31.884,30 -18:31:51,491.8011,30.107,30.186,30.984,30 -18:31:51,491.8546,30.107,30.186,30.975,30 -18:31:51,491.9062,30.081,30.212,30.966,30 -18:31:51,491.9555,30.054,30.16,30.958,30 -18:31:51,492.0054,30.054,30.186,32.309,30 -18:31:51,492.0568,30.107,30.16,31.855,30 -18:31:52,492.1070,30.028,30.212,31.384,30 -18:31:52,492.1576,30.107,30.186,31.84,30 -18:31:52,492.2078,30.107,30.212,30.922,30 -18:31:52,492.2587,30.16,30.16,30.466,30 -18:31:52,492.3094,30.081,30.186,30.44,30 -18:31:52,492.3592,30.028,30.186,31.342,30 -18:31:52,492.4088,30.081,30.186,32.246,30 -18:31:52,492.4592,30.081,30.186,31.329,30 -18:31:52,492.5134,30.081,30.186,31.321,30 -18:31:52,492.5660,30.054,30.212,31.313,30 -18:31:52,492.6144,30.054,30.133,31.322,30 -18:31:52,492.6618,30.107,30.186,32.673,30 -18:31:52,492.7094,30.054,30.16,30.845,30 -18:31:52,492.7564,30.054,30.186,32.196,30 -18:31:52,492.8038,30.054,30.212,31.743,30 -18:31:52,492.8517,30.081,30.186,31.289,30 -18:31:52,492.9007,30.028,30.16,31.265,30 -18:31:52,492.9492,30.028,30.16,32.616,30 -18:31:52,492.9980,30.107,30.16,32.611,30 -18:31:52,493.0469,30.054,30.186,31.247,30 -18:31:52,493.0948,30.054,30.212,31.704,30 -18:31:53,493.1437,30.054,30.16,31.25,30 -18:31:53,493.1909,30.028,30.16,32.137,30 -18:31:53,493.2386,30.028,30.239,32.578,30 -18:31:53,493.2866,30.16,30.186,31.215,30 -18:31:53,493.3326,30.081,30.212,29.848,30 -18:31:53,493.3813,30.081,30.16,30.751,30 -18:31:53,493.4307,30.054,30.212,31.637,30 -18:31:53,493.4775,30.054,30.186,31.2,30 -18:31:53,493.5261,30.081,30.212,31.64,30 -18:31:53,493.5738,30.054,30.239,30.722,30 -18:31:53,493.6215,30.054,30.186,30.714,30 -18:31:53,493.6686,30.107,30.239,31.618,30 -18:31:53,493.7162,30.081,30.186,29.788,30 -18:31:53,493.7651,30.054,30.186,31.138,30 -18:31:53,493.8122,30.107,30.212,31.595,30 -18:31:53,493.8613,30.081,30.186,30.229,30 -18:31:53,493.9134,30.107,30.186,31.115,30 -18:31:53,493.9618,30.028,30.212,30.66,30 -18:31:53,494.0117,30.054,30.212,31.563,30 -18:31:53,494.0619,30.107,30.186,31.109,30 -18:31:54,494.1148,30.107,30.186,30.637,30 -18:31:54,494.1655,30.054,30.212,30.628,30 -18:31:54,494.2145,30.081,30.186,31.084,30 -18:31:54,494.2634,30.054,30.16,31.059,30 -18:31:54,494.3151,30.107,30.186,31.964,30 -18:31:54,494.3649,30.054,30.186,30.598,30 -18:31:54,494.4175,30.107,30.16,31.502,30 -18:31:54,494.4656,30.081,30.186,31.03,30 -18:31:54,494.5140,30.081,30.16,31.023,30 -18:31:54,494.5637,30.081,30.133,31.462,30 -18:31:54,494.6127,30.107,30.186,31.92,30 -18:31:54,494.6616,30.107,30.265,30.555,30 -18:31:54,494.7121,30.028,30.186,29.188,30 -18:31:54,494.7627,30.054,30.212,31.895,30 -18:31:54,494.8132,30.002,30.16,30.995,30 -18:31:54,494.8621,30.054,30.212,32.776,30 -18:31:54,494.9124,30.081,30.133,30.983,30 -18:31:54,494.9615,30.107,30.16,31.869,30 -18:31:54,495.0113,30.081,30.186,30.952,30 -18:31:54,495.0598,30.054,30.16,30.944,30 -18:31:55,495.1060,30.054,30.186,31.848,30 -18:31:55,495.1540,30.054,30.16,31.396,30 -18:31:55,495.2019,30.054,30.212,31.836,30 -18:31:55,495.2512,30.133,30.186,30.936,30 -18:31:55,495.3007,30.054,30.16,30.017,30 -18:31:55,495.3663,30.081,30.186,31.814,30 -18:31:55,495.4196,30.054,30.186,30.893,30 -18:31:55,495.4680,30.081,30.212,31.35,30 -18:31:55,495.5180,30.054,30.239,30.432,30 -18:31:55,495.5668,30.054,30.186,30.423,30 -18:31:55,495.6178,30.107,30.186,31.327,30 -18:31:55,495.6981,30.081,30.16,30.408,30 -18:31:55,495.7648,30.054,30.16,31.289,30 -18:31:55,495.8237,30.081,30.186,31.745,30 -18:31:55,495.8957,30.028,30.186,30.826,30 -18:31:55,495.9593,30.081,30.212,31.727,30 -18:31:55,496.0176,30.107,30.186,30.36,30 -18:31:55,496.0727,30.107,30.212,30.351,30 -18:31:56,496.1335,30.054,30.212,29.893,30 -18:31:56,496.1888,30.107,30.186,30.795,30 -18:31:56,496.2437,30.054,30.212,30.322,30 -18:31:56,496.3037,30.002,30.186,30.777,30 -18:31:56,496.3666,30.107,30.16,32.11,30 -18:31:56,496.4254,30.081,30.186,30.743,30 -18:31:56,496.4875,30.081,30.212,30.735,30 -18:31:56,496.5660,30.054,30.16,30.278,30 -18:31:56,496.6253,30.028,30.212,31.625,30 -18:31:56,496.6853,30.054,30.212,31.171,30 -18:31:56,496.7437,30.028,30.212,30.715,30 -18:31:56,496.8010,30.081,30.212,31.153,30 -18:31:56,496.8556,30.081,30.186,30.234,30 -18:31:56,496.9109,30.081,30.186,30.672,30 -18:31:56,496.9629,30.081,30.239,30.664,30 -18:31:56,497.0122,30.081,30.186,29.744,30 -18:31:56,497.0634,30.054,30.16,30.647,30 -18:31:57,497.1137,30.107,30.212,31.55,30 -18:31:57,497.1644,30.028,30.239,29.738,30 -18:31:57,497.2237,30.054,30.239,30.623,30 -18:31:57,497.2774,30.028,30.186,30.167,30 -18:31:57,497.3319,30.054,30.212,31.517,30 -18:31:57,497.3836,30.054,30.212,30.616,30 -18:31:57,497.4355,30.054,30.292,30.608,30 -18:31:57,497.4846,30.107,30.239,29.224,30 -18:31:57,497.5351,30.081,30.186,29.214,30 -18:31:57,497.5866,30.054,30.212,30.563,30 -18:31:57,497.6393,30.028,30.186,30.572,30 -18:31:57,497.6899,30.107,30.186,31.459,30 -18:31:57,497.7412,30.107,30.186,30.094,30 -18:31:57,497.7883,30.081,30.186,30.085,30 -18:31:57,497.8387,30.107,30.212,30.525,30 -18:31:57,497.8875,30.054,30.186,29.622,30 -18:31:57,497.9398,30.054,30.239,30.972,30 -18:31:57,497.9892,30.107,30.239,30.053,30 -18:31:57,498.0383,30.081,30.239,29.134,30 -18:31:57,498.0849,30.054,30.186,29.571,30 -18:31:58,498.1322,30.081,30.212,30.938,30 -18:31:58,498.1814,30.107,30.186,30.02,30 -18:31:58,498.2296,30.107,30.186,30.012,30 -18:31:58,498.2769,30.081,30.16,30.004,30 -18:31:58,498.3244,30.107,30.16,30.891,30 -18:31:58,498.3725,30.054,30.212,30.437,30 -18:31:58,498.4214,30.054,30.212,30.447,30 -18:31:58,498.4690,30.16,30.212,30.439,30 -18:31:58,498.5181,30.054,30.186,28.609,30 -18:31:58,498.5677,30.107,30.186,30.869,30 -18:31:58,498.6170,30.054,30.212,29.95,30 -18:31:58,498.6660,30.054,30.16,30.407,30 -18:31:58,498.7137,30.107,30.186,31.294,30 -18:31:58,498.7629,30.107,30.212,29.929,30 -18:31:58,498.8138,30.107,30.16,29.474,30 -18:31:58,498.8677,30.107,30.186,30.359,30 -18:31:58,498.9221,30.054,30.186,29.903,30 -18:31:58,498.9857,30.054,30.239,30.806,30 -18:31:58,499.0692,30.133,30.212,29.885,30 -18:31:59,499.1517,30.107,30.186,28.976,30 -18:31:59,499.2252,30.054,30.186,29.855,30 -18:31:59,499.2866,30.107,30.239,30.754,30 -18:31:59,499.3369,30.054,30.212,28.923,30 -18:31:59,499.3879,30.081,30.16,30.289,30 -18:31:59,499.4356,30.081,30.212,30.711,30 -18:31:59,499.4842,30.081,30.239,29.81,30 -18:31:59,499.5307,30.054,30.186,29.338,30 -18:31:59,499.5784,30.054,30.16,30.705,30 -18:31:59,499.6266,30.028,30.212,31.146,30 -18:31:59,499.6781,30.054,30.186,30.693,30 -18:31:59,499.7285,30.081,30.186,30.686,30 -18:31:59,499.7827,30.054,30.133,30.214,30 -18:31:59,499.8319,30.107,30.212,31.582,30 -18:31:59,499.8803,30.054,30.239,29.307,30 -18:31:59,499.9296,30.081,30.186,29.745,30 -18:31:59,499.9819,30.054,30.16,30.184,30 -18:31:59,500.0489,30.133,30.212,31.088,30 -18:32:00,500.1042,30.133,30.186,28.825,30 -18:32:00,500.1608,30.081,30.186,29.261,30 -18:32:00,500.2171,30.133,30.186,30.146,30 -18:32:00,500.2712,30.081,30.212,29.242,30 -18:32:00,500.3236,30.107,30.186,29.68,30 -18:32:00,500.3944,30.054,30.133,29.671,30 -18:32:00,500.4614,30.054,30.212,31.484,30 -18:32:00,500.5251,30.107,30.16,30.117,30 -18:32:00,500.5891,30.081,30.16,30.09,30 -18:32:00,500.6546,30.081,30.186,30.528,30 -18:32:00,500.7252,30.081,30.186,30.071,30 -18:32:00,500.7935,30.054,30.186,30.06,30 -18:32:00,500.8504,30.081,30.212,30.514,30 -18:32:00,500.8990,30.133,30.212,29.595,30 -18:32:00,500.9724,30.107,30.16,28.693,30 -18:32:00,501.0435,30.054,30.212,30.021,30 -18:32:01,501.0978,30.081,30.16,30.027,30 -18:32:01,501.1497,30.107,30.239,30.449,30 -18:32:01,501.2016,30.107,30.16,28.636,30 -18:32:01,501.2556,30.028,30.212,29.985,30 -18:32:01,501.3076,30.133,30.16,30.441,30 -18:32:01,501.3580,30.107,30.133,29.522,30 -18:32:01,501.4116,30.054,30.212,30.425,30 -18:32:01,501.4617,30.107,30.186,29.971,30 -18:32:01,501.5172,30.107,30.186,29.498,30 -18:32:01,501.5679,30.133,30.186,29.489,30 -18:32:01,501.6176,30.107,30.186,29.034,30 -18:32:01,501.6666,30.133,30.16,29.472,30 -18:32:01,501.7156,30.081,30.186,29.464,30 -18:32:01,501.7655,30.028,30.212,29.903,30 -18:32:01,501.8157,30.107,30.133,30.359,30 -18:32:01,501.8671,30.133,30.107,30.353,30 -18:32:01,501.9184,30.081,30.16,30.346,30 -18:32:01,501.9717,30.081,30.133,30.321,30 -18:32:01,502.0226,30.133,30.16,30.778,30 -18:32:01,502.0706,30.054,30.186,29.413,30 -18:32:02,502.1188,30.133,30.212,30.317,30 -18:32:02,502.1658,30.081,30.133,28.504,30 -18:32:02,502.2224,30.081,30.212,30.748,30 -18:32:02,502.2706,30.107,30.186,29.382,30 -18:32:02,502.3198,30.081,30.186,29.374,30 -18:32:02,502.3682,30.081,30.16,29.813,30 -18:32:02,502.4176,30.133,30.16,30.253,30 -18:32:02,502.4659,30.081,30.16,29.352,30 -18:32:02,502.5157,30.133,30.186,30.238,30 -18:32:02,502.5642,30.107,30.186,28.889,30 -18:32:02,502.6140,30.081,30.239,29.328,30 -18:32:02,502.6626,30.081,30.186,28.855,30 -18:32:02,502.7116,30.107,30.186,29.758,30 -18:32:02,502.7617,30.081,30.16,29.303,30 -18:32:02,502.8133,30.081,30.212,30.189,30 -18:32:02,502.8625,30.107,30.186,29.287,30 -18:32:02,502.9106,30.081,30.212,29.279,30 -18:32:02,502.9617,30.081,30.186,29.271,30 -18:32:02,503.0117,30.133,30.186,29.71,30 -18:32:02,503.0640,30.081,30.212,28.808,30 -18:32:03,503.1142,30.081,30.212,29.246,30 -18:32:03,503.1641,30.107,30.16,29.237,30 -18:32:03,503.2119,30.054,30.16,29.676,30 -18:32:03,503.2611,30.107,30.16,30.58,30 -18:32:03,503.3124,30.054,30.107,29.663,30 -18:32:03,503.3620,30.107,30.212,31.478,30 -18:32:03,503.4125,30.107,30.16,28.756,30 -18:32:03,503.4624,30.16,30.16,29.641,30 -18:32:03,503.5102,30.133,30.186,28.722,30 -18:32:03,503.5607,30.081,30.16,28.73,30 -18:32:03,503.6112,30.054,30.186,30.063,30 -18:32:03,503.6613,30.107,30.186,30.073,30 -18:32:03,503.7114,30.054,30.212,29.155,30 -18:32:03,503.7612,30.081,30.16,29.611,30 -18:32:03,503.8112,30.133,30.16,30.033,30 -18:32:03,503.8604,30.081,30.186,29.132,30 -18:32:03,503.9100,30.133,30.16,29.571,30 -18:32:03,503.9624,30.107,30.186,29.116,30 -18:32:03,504.0132,30.133,30.16,29.107,30 -18:32:03,504.0648,30.081,30.212,29.099,30 -18:32:04,504.1135,30.054,30.186,29.09,30 -18:32:04,504.1619,30.16,30.186,29.994,30 -18:32:04,504.2137,30.081,30.186,28.164,30 -18:32:04,504.2668,30.107,30.16,29.512,30 -18:32:04,504.3196,30.16,30.16,29.504,30 -18:32:04,504.3736,30.107,30.16,28.584,30 -18:32:04,504.4268,30.107,30.186,29.486,30 -18:32:04,504.4808,30.107,30.16,29.031,30 -18:32:04,504.5311,30.107,30.16,29.469,30 -18:32:04,504.5837,30.107,30.16,29.462,30 -18:32:04,504.6335,30.054,30.212,29.453,30 -18:32:04,504.6828,30.133,30.16,29.463,30 -18:32:04,504.7376,30.133,30.186,28.991,30 -18:32:04,504.7898,30.107,30.16,28.535,30 -18:32:04,504.8418,30.107,30.133,29.42,30 -18:32:04,504.8923,30.028,30.16,29.876,30 -18:32:04,504.9461,29.975,30.133,30.764,30 -18:32:04,504.9946,30.107,30.186,32.134,30 -18:32:04,505.0477,30.133,30.186,28.949,30 -18:32:04,505.0959,30.133,30.133,28.493,30 -18:32:05,505.1443,30.107,30.16,29.396,30 -18:32:05,505.1953,30.107,30.186,29.371,30 -18:32:05,505.2453,30.081,30.16,28.916,30 -18:32:05,505.2955,30.107,30.16,29.802,30 -18:32:05,505.3431,30.133,30.16,29.348,30 -18:32:05,505.3932,30.081,30.16,28.894,30 -18:32:05,505.4441,30.133,30.133,29.78,30 -18:32:05,505.4948,30.107,30.186,29.343,30 -18:32:05,505.5425,30.133,30.133,28.871,30 -18:32:05,505.5921,30.081,30.186,29.327,30 -18:32:05,505.6399,30.081,30.186,29.302,30 -18:32:05,505.6876,30.054,30.16,29.295,30 -18:32:05,505.7376,30.081,30.212,30.199,30 -18:32:05,505.7868,30.107,30.212,28.834,30 -18:32:05,505.8369,30.107,30.186,28.379,30 -18:32:05,505.8867,30.133,30.212,28.817,30 -18:32:05,505.9377,30.081,30.186,27.914,30 -18:32:05,505.9896,30.16,30.16,29.246,30 -18:32:05,506.0415,30.133,30.186,28.326,30 -18:32:05,506.0947,30.107,30.16,28.334,30 -18:32:06,506.1439,30.054,30.16,29.219,30 -18:32:06,506.1912,30.081,30.16,30.123,30 -18:32:06,506.2410,30.081,30.212,29.653,30 -18:32:06,506.2923,30.081,30.186,28.752,30 -18:32:06,506.3439,30.081,30.239,29.19,30 -18:32:06,506.3937,30.133,30.186,28.271,30 -18:32:06,506.4468,30.054,30.16,28.279,30 -18:32:06,506.4987,30.133,30.186,30.075,30 -18:32:06,506.5495,30.133,30.16,28.263,30 -18:32:06,506.6006,30.16,30.186,28.701,30 -18:32:06,506.6506,30.107,30.16,27.781,30 -18:32:06,506.7017,30.081,30.212,29.13,30 -18:32:06,506.7526,30.081,30.186,28.674,30 -18:32:06,506.8040,30.081,30.16,29.113,30 -18:32:06,506.8547,30.081,30.186,29.553,30 -18:32:06,506.9067,30.107,30.186,29.098,30 -18:32:06,506.9565,30.107,30.212,28.643,30 -18:32:06,507.0085,30.107,30.186,28.188,30 -18:32:06,507.0627,30.054,30.212,28.625,30 -18:32:07,507.1140,30.107,30.186,29.081,30 -18:32:07,507.1645,30.081,30.239,28.609,30 -18:32:07,507.2157,30.028,30.239,28.136,30 -18:32:07,507.2663,30.081,30.212,29.038,30 -18:32:07,507.3198,30.107,30.212,28.583,30 -18:32:07,507.3678,30.054,30.107,28.127,30 -18:32:07,507.4185,30.081,30.265,30.836,30 -18:32:07,507.4690,30.107,30.186,27.649,30 -18:32:07,507.5208,30.107,30.186,28.551,30 -18:32:07,507.5712,30.054,30.186,28.542,30 -18:32:07,507.6212,30.081,30.212,29.445,30 -18:32:07,507.6750,30.054,30.212,28.526,30 -18:32:07,507.7280,30.081,30.212,28.982,30 -18:32:07,507.7805,30.054,30.186,28.51,30 -18:32:07,507.8317,30.081,30.212,29.413,30 -18:32:07,507.8833,30.054,30.186,28.494,30 -18:32:07,507.9364,30.081,30.212,29.397,30 -18:32:07,507.9881,30.054,30.212,28.478,30 -18:32:07,508.0391,30.054,30.239,28.934,30 -18:32:07,508.0924,30.054,30.186,28.461,30 -18:32:08,508.1433,30.107,30.212,29.364,30 -18:32:08,508.1945,30.054,30.186,27.998,30 -18:32:08,508.2451,30.081,30.239,29.348,30 -18:32:08,508.2963,30.081,30.212,27.965,30 -18:32:08,508.3469,30.054,30.239,28.42,30 -18:32:08,508.3978,30.081,30.186,28.412,30 -18:32:08,508.4493,30.107,30.16,28.85,30 -18:32:08,508.4987,30.081,30.212,28.843,30 -18:32:08,508.5511,30.054,30.212,28.388,30 -18:32:08,508.6014,30.107,30.212,28.843,30 -18:32:08,508.6516,30.054,30.265,27.924,30 -18:32:08,508.7012,30.054,30.212,27.915,30 -18:32:08,508.7506,30.028,30.212,28.818,30 -18:32:08,508.8011,30.054,30.212,29.257,30 -18:32:08,508.8514,30.107,30.239,28.803,30 -18:32:08,508.9008,30.081,30.186,27.419,30 -18:32:08,508.9510,30.081,30.107,28.769,30 -18:32:08,509.0026,30.054,30.186,30.12,30 -18:32:08,509.0534,30.054,30.212,29.22,30 -18:32:09,509.1044,30.028,30.16,28.766,30 -18:32:09,509.1542,30.054,30.186,30.099,30 -18:32:09,509.2079,30.028,30.212,29.2,30 -18:32:09,509.2600,30.028,30.239,29.192,30 -18:32:09,509.3099,30.028,30.212,28.721,30 -18:32:09,509.3593,30.028,30.265,29.178,30 -18:32:09,509.4126,30.081,30.212,28.259,30 -18:32:09,509.4642,30.107,30.186,28.25,30 -18:32:09,509.5139,30.054,30.212,28.242,30 -18:32:09,509.5641,30.081,30.212,28.698,30 -18:32:09,509.6176,30.107,30.212,28.225,30 -18:32:09,509.6690,30.028,30.16,27.769,30 -18:32:09,509.7219,30.028,30.212,30.014,30 -18:32:09,509.7735,30.054,30.212,29.113,30 -18:32:09,509.8244,30.081,30.212,28.659,30 -18:32:09,509.8778,30.002,30.265,28.187,30 -18:32:09,509.9306,30.054,30.212,28.625,30 -18:32:09,509.9827,30.054,30.239,28.634,30 -18:32:09,510.0331,30.107,30.186,28.162,30 -18:32:09,510.0856,30.028,30.212,28.153,30 -18:32:10,510.1347,30.054,30.239,29.056,30 -18:32:10,510.1828,30.002,30.186,28.138,30 -18:32:10,510.2307,30.16,30.186,29.936,30 -18:32:10,510.2797,30.081,30.186,27.213,30 -18:32:10,510.3284,30.054,30.239,28.562,30 -18:32:10,510.3836,30.028,30.212,28.108,30 -18:32:10,510.4329,30.054,30.212,29.01,30 -18:32:10,510.4804,30.028,30.212,28.556,30 -18:32:10,510.5297,30.028,30.239,28.996,30 -18:32:10,510.5794,30.054,30.186,28.525,30 -18:32:10,510.6302,30.028,30.212,28.982,30 -18:32:10,510.6933,30.054,30.239,28.975,30 -18:32:10,510.7546,30.028,30.239,28.054,30 -18:32:10,510.8257,30.028,30.265,28.49,30 -18:32:10,510.8893,30.081,30.212,28.032,30 -18:32:10,510.9562,30.028,30.212,28.021,30 -18:32:10,511.0155,30.028,30.212,28.923,30 -18:32:10,511.0748,30.028,30.186,28.915,30 -18:32:11,511.1342,30.028,30.212,29.354,30 -18:32:11,511.1892,30.081,30.186,28.9,30 -18:32:11,511.2457,30.028,30.239,28.427,30 -18:32:11,511.3046,30.054,30.239,28.419,30 -18:32:11,511.3630,30.028,30.239,27.962,30 -18:32:11,511.4190,30.028,30.212,28.4,30 -18:32:11,511.4741,30.028,30.239,28.856,30 -18:32:11,511.5295,30.107,30.239,28.384,30 -18:32:11,511.5854,30.054,30.133,27.017,30 -18:32:11,511.6406,30.054,30.212,29.741,30 -18:32:11,511.6932,30.028,30.212,28.376,30 -18:32:11,511.7469,30.133,30.16,28.815,30 -18:32:11,511.7989,30.054,30.265,27.896,30 -18:32:11,511.8563,30.028,30.212,27.44,30 -18:32:11,511.9110,30.081,30.186,28.789,30 -18:32:11,511.9619,29.923,30.186,28.317,30 -18:32:11,512.0110,30.054,30.212,31.027,30 -18:32:11,512.0639,30.054,30.186,28.323,30 -18:32:12,512.1128,30.002,30.239,28.763,30 -18:32:12,512.1647,30.002,30.186,28.739,30 -18:32:12,512.2193,29.975,30.239,29.643,30 -18:32:12,512.2683,30.028,30.265,29.19,30 -18:32:12,512.3184,30.028,30.239,27.825,30 -18:32:12,512.3670,30.028,30.186,28.264,30 -18:32:12,512.4168,30.054,30.186,29.168,30 -18:32:12,512.4656,30.081,30.212,28.715,30 -18:32:12,512.5126,30.028,30.239,27.797,30 -18:32:12,512.5616,30.054,30.186,28.236,30 -18:32:12,512.6100,30.054,30.239,28.693,30 -18:32:12,512.6578,30.028,30.239,27.775,30 -18:32:12,512.7074,30.028,30.186,28.214,30 -18:32:12,512.7557,30.054,30.239,29.118,30 -18:32:12,512.8045,30.081,30.212,27.753,30 -18:32:12,512.8539,30.028,30.212,27.745,30 -18:32:12,512.9011,30.081,30.212,28.649,30 -18:32:12,512.9508,30.028,30.186,27.731,30 -18:32:12,512.9993,30.054,30.16,29.081,30 -18:32:12,513.0493,30.028,30.212,29.075,30 -18:32:13,513.1017,30.054,30.186,28.622,30 -18:32:13,513.1507,30.028,30.212,28.615,30 -18:32:13,513.2002,30.028,30.212,28.608,30 -18:32:13,513.2497,30.081,30.239,28.601,30 -18:32:13,513.2965,30.054,30.186,27.218,30 -18:32:13,513.3502,30.028,30.212,28.585,30 -18:32:13,513.4040,30.081,30.186,28.578,30 -18:32:13,513.4558,30.002,30.239,28.106,30 -18:32:13,513.5066,30.028,30.212,28.546,30 -18:32:13,513.5566,30.054,30.186,28.556,30 -18:32:13,513.6078,30.081,30.186,28.549,30 -18:32:13,513.6595,29.975,30.186,28.078,30 -18:32:13,513.7117,30.081,30.212,29.893,30 -18:32:13,513.7623,30.002,30.212,27.618,30 -18:32:13,513.8135,30.028,30.239,28.968,30 -18:32:13,513.8654,30.054,30.16,28.05,30 -18:32:13,513.9180,30.054,30.186,28.954,30 -18:32:13,513.9710,30.054,30.16,28.5,30 -18:32:13,514.0193,30.054,30.186,28.94,30 -18:32:13,514.0698,30.054,30.16,28.487,30 -18:32:14,514.1174,30.002,30.186,28.928,30 -18:32:14,514.1658,30.054,30.186,29.369,30 -18:32:14,514.2152,30.002,30.186,28.469,30 -18:32:14,514.2630,30.133,30.212,29.357,30 -18:32:14,514.3139,30.028,30.212,26.651,30 -18:32:14,514.3630,30.054,30.186,28.448,30 -18:32:14,514.4105,30.054,30.212,28.441,30 -18:32:14,514.4593,30.028,30.212,27.987,30 -18:32:14,514.5078,30.028,30.186,28.427,30 -18:32:14,514.5567,30.054,30.212,28.868,30 -18:32:14,514.6075,30.028,30.186,27.967,30 -18:32:14,514.6582,30.054,30.212,28.854,30 -18:32:14,514.7087,30.054,30.133,27.953,30 -18:32:14,514.7576,30.107,30.212,29.305,30 -18:32:14,514.8073,30.081,30.186,27.029,30 -18:32:14,514.8568,30.133,30.212,27.914,30 -18:32:14,514.9086,30.002,30.212,26.565,30 -18:32:14,514.9595,30.081,30.212,28.808,30 -18:32:14,515.0085,30.028,30.239,27.443,30 -18:32:14,515.0599,30.054,30.16,27.882,30 -18:32:15,515.1090,30.028,30.212,28.786,30 -18:32:15,515.1616,30.028,30.133,28.333,30 -18:32:15,515.2114,30.081,30.186,29.685,30 -18:32:15,515.2608,30.028,30.212,27.857,30 -18:32:15,515.3115,30.002,30.212,28.314,30 -18:32:15,515.3615,30.028,30.186,28.754,30 -18:32:15,515.4103,30.002,30.212,28.748,30 -18:32:15,515.4586,30.054,30.186,28.742,30 -18:32:15,515.5091,30.028,30.212,28.289,30 -18:32:15,515.5561,30.028,30.186,28.282,30 -18:32:15,515.6035,30.028,30.239,28.723,30 -18:32:15,515.6522,30.054,30.212,27.805,30 -18:32:15,515.7010,30.054,30.186,27.815,30 -18:32:15,515.7504,30.028,30.16,28.255,30 -18:32:15,515.7999,30.054,30.186,29.142,30 -18:32:15,515.8483,30.028,30.16,28.243,30 -18:32:15,515.8973,30.028,30.212,29.13,30 -18:32:15,515.9479,30.028,30.186,28.231,30 -18:32:15,515.9958,30.028,30.16,28.671,30 -18:32:15,516.0448,30.081,30.186,29.112,30 -18:32:15,516.0953,29.975,30.186,27.748,30 -18:32:16,516.1445,30.081,30.16,29.564,30 -18:32:16,516.1917,30.028,30.16,28.183,30 -18:32:16,516.2408,30.028,30.239,29.088,30 -18:32:16,516.2895,30.054,30.186,27.724,30 -18:32:16,516.3426,30.028,30.186,28.181,30 -18:32:16,516.3905,30.028,30.16,28.621,30 -18:32:16,516.4434,30.054,30.16,29.063,30 -18:32:16,516.4920,30.002,30.133,28.61,30 -18:32:16,516.5412,30.081,30.133,29.963,30 -18:32:16,516.5945,30.002,30.16,28.6,30 -18:32:16,516.6438,30.028,30.186,29.488,30 -18:32:16,516.6939,30.054,30.16,28.589,30 -18:32:16,516.7426,30.002,30.186,28.583,30 -18:32:16,516.7924,30.028,30.212,29.024,30 -18:32:16,516.8407,30.054,30.16,28.124,30 -18:32:16,516.8927,30.054,30.107,28.565,30 -18:32:16,516.9413,30.107,30.133,29.47,30 -18:32:16,516.9931,30.028,30.16,28.107,30 -18:32:16,517.0426,30.081,30.133,28.994,30 -18:32:16,517.0931,30.002,30.212,28.542,30 -18:32:17,517.1424,30.107,30.133,28.536,30 -18:32:17,517.1928,30.054,30.16,28.082,30 -18:32:17,517.2418,30.081,30.133,28.523,30 -18:32:17,517.2915,30.081,30.107,28.517,30 -18:32:17,517.3446,30.028,30.16,28.958,30 -18:32:17,517.3951,30.054,30.16,28.952,30 -18:32:17,517.4447,30.028,30.212,28.5,30 -18:32:17,517.4929,30.081,30.133,28.046,30 -18:32:17,517.5416,30.081,30.16,28.487,30 -18:32:17,517.5910,29.949,30.133,28.016,30 -18:32:17,517.6411,30.002,30.16,30.744,30 -18:32:17,517.6905,30.028,30.16,29.366,30 -18:32:17,517.7421,30.028,30.16,28.914,30 -18:32:17,517.7890,30.028,30.16,28.909,30 -18:32:17,517.8368,30.054,30.133,28.904,30 -18:32:17,517.8864,29.923,30.107,28.916,30 -18:32:17,517.9376,30.054,30.133,31.611,30 -18:32:17,517.9870,30.028,30.16,28.91,30 -18:32:17,518.0345,30.002,30.107,28.887,30 -18:32:17,518.0847,30.081,30.133,30.241,30 -18:32:18,518.1317,30.054,30.186,28.432,30 -18:32:18,518.1793,30.028,30.16,27.979,30 -18:32:18,518.2294,30.054,30.16,28.867,30 -18:32:18,518.2796,30.054,30.16,28.414,30 -18:32:18,518.3280,30.054,30.186,28.408,30 -18:32:18,518.3769,30.028,30.186,27.955,30 -18:32:18,518.4261,30.054,30.16,28.395,30 -18:32:18,518.4756,30.028,30.133,28.389,30 -18:32:18,518.5270,30.107,30.133,29.295,30 -18:32:18,518.5773,30.081,30.133,27.931,30 -18:32:18,518.6252,30.028,30.16,28.371,30 -18:32:18,518.6737,30.028,30.133,28.813,30 -18:32:18,518.7223,30.028,30.133,29.272,30 -18:32:18,518.7724,30.054,30.212,29.267,30 -18:32:18,518.8213,29.975,30.16,27.457,30 -18:32:18,518.8733,30.081,30.107,29.703,30 -18:32:18,518.9236,30.054,30.186,28.787,30 -18:32:18,518.9737,30.081,30.16,27.887,30 -18:32:18,519.0242,30.028,30.16,27.863,30 -18:32:18,519.0785,30.054,30.133,28.768,30 -18:32:19,519.1298,30.107,30.16,28.779,30 -18:32:19,519.1785,30.028,30.16,27.397,30 -18:32:19,519.2278,30.081,30.133,28.749,30 -18:32:19,519.2778,30.028,30.16,28.296,30 -18:32:19,519.3269,30.028,30.133,28.737,30 -18:32:19,519.3776,30.054,30.186,29.196,30 -18:32:19,519.4276,30.028,30.186,27.833,30 -18:32:19,519.4761,30.002,30.212,28.273,30 -18:32:19,519.5243,30.107,30.186,28.267,30 -18:32:19,519.5739,30.081,30.16,26.903,30 -18:32:19,519.6241,30.054,30.133,27.789,30 -18:32:19,519.6745,30.081,30.16,28.711,30 -18:32:19,519.7265,30.081,30.212,27.776,30 -18:32:19,519.7759,30.028,30.16,26.875,30 -18:32:19,519.8238,30.133,30.16,28.673,30 -18:32:19,519.8728,30.002,30.133,26.861,30 -18:32:19,519.9236,30.054,30.133,29.571,30 -18:32:19,519.9823,30.028,30.081,28.673,30 -18:32:19,520.0326,30.081,30.16,30.008,30 -18:32:19,520.0825,30.002,30.107,27.735,30 -18:32:20,520.1313,30.028,30.16,29.998,30 -18:32:20,520.1796,30.028,30.186,28.636,30 -18:32:20,520.2295,30.054,30.133,28.184,30 -18:32:20,520.2803,30.054,30.133,28.642,30 -18:32:20,520.3309,30.054,30.16,28.637,30 -18:32:20,520.3822,30.028,30.133,28.167,30 -18:32:20,520.4321,30.028,30.186,29.072,30 -18:32:20,520.4815,30.028,30.133,28.156,30 -18:32:20,520.5308,30.054,30.186,29.062,30 -18:32:20,520.5825,30.054,30.133,27.698,30 -18:32:20,520.6322,30.107,30.107,28.603,30 -18:32:20,520.6816,30.028,30.133,28.133,30 -18:32:20,520.7298,30.054,30.212,29.039,30 -18:32:20,520.7785,30.081,30.16,27.228,30 -18:32:20,520.8275,30.133,30.16,27.651,30 -18:32:20,520.8787,30.028,30.186,26.75,30 -18:32:20,520.9300,30.028,30.212,28.1,30 -18:32:20,520.9813,30.054,30.107,27.647,30 -18:32:20,521.0292,30.081,30.186,28.999,30 -18:32:20,521.0804,30.028,30.16,27.171,30 -18:32:21,521.1286,30.028,30.054,28.522,30 -18:32:21,521.1808,30.081,30.16,30.34,30 -18:32:21,521.2318,30.081,30.212,27.602,30 -18:32:21,521.2831,30.002,30.133,26.701,30 -18:32:21,521.3321,30.054,30.133,29.41,30 -18:32:21,521.3845,30.028,30.133,28.512,30 -18:32:21,521.4329,30.054,30.107,28.954,30 -18:32:21,521.4850,30.054,30.16,28.949,30 -18:32:21,521.5347,30.081,30.16,28.033,30 -18:32:21,521.5857,30.054,30.107,27.562,30 -18:32:21,521.6337,30.054,30.133,28.931,30 -18:32:21,521.6842,30.028,30.16,28.48,30 -18:32:21,521.7334,30.081,30.107,28.457,30 -18:32:21,521.7846,30.028,30.133,28.452,30 -18:32:21,521.8363,30.081,30.16,28.911,30 -18:32:21,521.8946,30.081,30.133,27.53,30 -18:32:21,521.9466,30.054,30.133,27.986,30 -18:32:21,521.9953,30.028,30.16,28.445,30 -18:32:21,522.0445,30.028,30.133,28.422,30 -18:32:21,522.0940,30.081,30.186,28.881,30 -18:32:22,522.1453,30.081,30.081,27.053,30 -18:32:22,522.1961,30.028,30.133,28.852,30 -18:32:22,522.2464,30.054,30.133,28.864,30 -18:32:22,522.2957,30.028,30.133,28.413,30 -18:32:22,522.3458,30.028,30.16,28.854,30 -18:32:22,522.3974,30.028,30.107,28.385,30 -18:32:22,522.4483,30.081,30.133,29.292,30 -18:32:22,522.4968,30.054,30.16,27.929,30 -18:32:22,522.5454,30.081,30.133,27.923,30 -18:32:22,522.5965,30.054,30.133,27.917,30 -18:32:22,522.6467,30.028,30.186,28.375,30 -18:32:22,522.6965,30.081,30.133,27.905,30 -18:32:22,522.7484,30.028,30.16,27.899,30 -18:32:22,522.7973,30.107,30.16,28.34,30 -18:32:22,522.8453,30.054,30.107,26.976,30 -18:32:22,522.8948,30.054,30.133,28.792,30 -18:32:22,522.9441,30.002,30.16,28.34,30 -18:32:22,522.9957,30.028,30.081,28.765,30 -18:32:22,523.0453,30.002,30.107,29.672,30 -18:32:23,523.0968,30.028,30.186,29.669,30 -18:32:23,523.1459,30.002,30.16,27.859,30 -18:32:23,523.1956,30.028,30.16,28.748,30 -18:32:23,523.2452,30.002,30.16,28.296,30 -18:32:23,523.2974,30.028,30.107,28.738,30 -18:32:23,523.3477,30.054,30.16,29.197,30 -18:32:23,523.3989,29.975,30.16,27.835,30 -18:32:23,523.4497,30.002,30.133,29.187,30 -18:32:23,523.4995,29.975,30.16,29.183,30 -18:32:23,523.5488,30.002,30.186,29.18,30 -18:32:23,523.6006,29.975,30.133,28.264,30 -18:32:23,523.6526,29.975,30.16,29.635,30 -18:32:23,523.7035,30.028,30.107,29.167,30 -18:32:23,523.7536,29.975,30.133,29.163,30 -18:32:23,523.8027,30.054,30.133,29.624,30 -18:32:23,523.8522,29.975,30.186,28.262,30 -18:32:23,523.9029,29.975,30.186,28.704,30 -18:32:23,523.9547,29.975,30.16,28.699,30 -18:32:23,524.0048,30.002,30.186,29.142,30 -18:32:23,524.0544,30.002,30.186,28.226,30 -18:32:24,524.1037,30.028,30.186,28.221,30 -18:32:24,524.1515,30.028,30.186,27.768,30 -18:32:24,524.2020,30.054,30.133,27.763,30 -18:32:24,524.2504,29.975,30.133,28.221,30 -18:32:24,524.3003,29.975,30.16,29.574,30 -18:32:24,524.3505,30.028,30.16,29.107,30 -18:32:24,524.4003,30.002,30.133,28.191,30 -18:32:24,524.4498,30.054,30.133,29.098,30 -18:32:24,524.5018,30.054,30.133,28.199,30 -18:32:24,524.5521,30.002,30.186,28.194,30 -18:32:24,524.6035,30.002,30.133,28.171,30 -18:32:24,524.6513,30.002,30.186,29.077,30 -18:32:24,524.7003,30.028,30.212,28.162,30 -18:32:24,524.7494,30.002,30.133,27.262,30 -18:32:24,524.8004,30.028,30.16,29.062,30 -18:32:24,524.8512,29.975,30.186,28.146,30 -18:32:24,524.9022,30.002,30.107,28.605,30 -18:32:24,524.9530,29.975,30.133,29.495,30 -18:32:24,525.0017,30.002,30.186,29.509,30 -18:32:24,525.0508,29.975,30.133,28.13,30 -18:32:25,525.1013,29.975,30.212,29.501,30 -18:32:25,525.1514,29.975,30.212,28.139,30 -18:32:25,525.2020,29.949,30.133,28.133,30 -18:32:25,525.2505,30.054,30.186,29.934,30 -18:32:25,525.3006,30.002,30.16,27.214,30 -18:32:25,525.3515,30.002,30.186,28.549,30 -18:32:25,525.4237,30.002,30.186,28.097,30 -18:32:25,525.4771,29.975,30.186,28.089,30 -18:32:25,525.5297,30.028,30.16,28.548,30 -18:32:25,525.5811,30.054,30.133,28.079,30 -18:32:25,525.6315,30.002,30.212,28.09,30 -18:32:25,525.6959,29.975,30.212,27.621,30 -18:32:25,525.7585,29.975,30.212,28.077,30 -18:32:25,525.8218,30.002,30.16,28.071,30 -18:32:25,525.8848,29.949,30.186,28.494,30 -18:32:25,525.9416,30.081,30.16,28.953,30 -18:32:25,525.9996,30.002,30.186,27.124,30 -18:32:25,526.0546,30.002,30.16,28.029,30 -18:32:26,526.1117,29.923,30.239,28.47,30 -18:32:26,526.1787,30.028,30.186,28.465,30 -18:32:26,526.2352,29.975,30.186,27.564,30 -18:32:26,526.2940,30.054,30.16,28.469,30 -18:32:26,526.3563,30.028,30.186,27.551,30 -18:32:26,526.4171,29.975,30.212,27.543,30 -18:32:26,526.4738,30.002,30.186,28.001,30 -18:32:26,526.5308,29.975,30.186,27.977,30 -18:32:26,526.5890,29.949,30.212,28.436,30 -18:32:26,526.6485,29.975,30.16,28.43,30 -18:32:26,526.7037,30.081,30.16,28.872,30 -18:32:26,526.7570,30.002,30.239,27.044,30 -18:32:26,526.8119,30.002,30.212,27.037,30 -18:32:26,526.8687,30.002,30.186,27.494,30 -18:32:26,526.9218,29.975,30.16,27.934,30 -18:32:26,526.9755,29.949,30.186,28.841,30 -18:32:26,527.0280,30.054,30.16,28.836,30 -18:32:26,527.0827,30.002,30.186,27.473,30 -18:32:27,527.1335,29.923,30.186,27.914,30 -18:32:27,527.1850,30.002,30.212,29.267,30 -18:32:27,527.2441,29.949,30.212,27.458,30 -18:32:27,527.2957,30.002,30.186,28.363,30 -18:32:27,527.3456,29.975,30.16,27.894,30 -18:32:27,527.3986,30.028,30.186,28.8,30 -18:32:27,527.4505,29.975,30.292,27.437,30 -18:32:27,527.5016,29.975,30.212,26.519,30 -18:32:27,527.5556,29.975,30.212,27.887,30 -18:32:27,527.6083,29.975,30.133,27.881,30 -18:32:27,527.6598,29.975,30.212,29.235,30 -18:32:27,527.7149,29.949,30.186,27.872,30 -18:32:27,527.7665,30.028,30.212,28.761,30 -18:32:27,527.8184,30.002,30.133,26.951,30 -18:32:27,527.8715,29.975,30.186,28.75,30 -18:32:27,527.9226,30.028,30.133,28.299,30 -18:32:27,527.9774,30.028,30.16,28.294,30 -18:32:27,528.0296,30.028,30.16,27.824,30 -18:32:27,528.0802,30.028,30.16,27.819,30 -18:32:28,528.1314,30.028,30.16,27.813,30 -18:32:28,528.1834,29.975,30.186,27.808,30 -18:32:28,528.2342,30.054,30.186,28.267,30 -18:32:28,528.2839,29.949,30.186,26.903,30 -18:32:28,528.3345,29.949,30.186,28.702,30 -18:32:28,528.3869,30.028,30.16,28.699,30 -18:32:28,528.4392,30.028,30.186,27.783,30 -18:32:28,528.4916,30.002,30.16,27.33,30 -18:32:28,528.5433,30.002,30.16,28.218,30 -18:32:28,528.5958,29.975,30.239,28.213,30 -18:32:28,528.6476,29.975,30.16,27.314,30 -18:32:28,528.6995,29.923,30.16,28.667,30 -18:32:28,528.7490,29.949,30.186,29.557,30 -18:32:28,528.7984,29.975,30.239,28.66,30 -18:32:28,528.8472,29.975,30.16,27.298,30 -18:32:28,528.8957,29.975,30.16,28.65,30 -18:32:28,528.9456,29.975,30.212,28.647,30 -18:32:28,528.9946,30.002,30.212,27.748,30 -18:32:28,529.0454,30.028,30.16,27.279,30 -18:32:28,529.0959,29.949,30.186,27.72,30 -18:32:29,529.1430,29.975,30.186,28.626,30 -18:32:29,529.1916,29.975,30.16,28.175,30 -18:32:29,529.2426,30.002,30.186,28.618,30 -18:32:29,529.2926,30.002,30.16,27.702,30 -18:32:29,529.3438,30.028,30.186,28.144,30 -18:32:29,529.3977,30.002,30.186,27.245,30 -18:32:29,529.4485,30.028,30.16,27.686,30 -18:32:29,529.4979,29.975,30.16,27.68,30 -18:32:29,529.5479,29.949,30.212,28.587,30 -18:32:29,529.5979,30.028,30.186,28.136,30 -18:32:29,529.6483,29.975,30.186,27.219,30 -18:32:29,529.6973,29.949,30.212,28.125,30 -18:32:29,529.7463,29.975,30.212,28.12,30 -18:32:29,529.7950,29.949,30.186,27.668,30 -18:32:29,529.8428,29.949,30.239,28.558,30 -18:32:29,529.8957,29.975,30.16,27.642,30 -18:32:29,529.9466,30.028,30.212,28.548,30 -18:32:29,529.9969,29.949,30.186,26.738,30 -18:32:29,530.0467,30.028,30.107,28.538,30 -18:32:30,530.0972,30.054,30.186,28.534,30 -18:32:30,530.1459,29.975,30.16,26.724,30 -18:32:30,530.1974,29.975,30.212,28.523,30 -18:32:30,530.2470,29.923,30.212,27.625,30 -18:32:30,530.2966,29.923,30.186,28.514,30 -18:32:30,530.3458,29.949,30.186,28.957,30 -18:32:30,530.3993,29.923,30.239,28.507,30 -18:32:30,530.4482,30.054,30.186,28.038,30 -18:32:30,530.4975,29.949,30.212,26.692,30 -18:32:30,530.5464,29.975,30.186,28.044,30 -18:32:30,530.5998,29.949,30.16,28.04,30 -18:32:30,530.6500,30.002,30.16,28.929,30 -18:32:30,530.6988,29.975,30.107,28.015,30 -18:32:30,530.7479,29.949,30.212,29.386,30 -18:32:30,530.8166,29.975,30.186,28.025,30 -18:32:30,530.8693,29.949,30.186,28.019,30 -18:32:30,530.9225,29.975,30.239,28.461,30 -18:32:30,530.9740,29.949,30.186,27.098,30 -18:32:30,531.0257,29.949,30.186,28.451,30 -18:32:30,531.0798,30.002,30.16,28.447,30 -18:32:31,531.1327,29.949,30.186,27.978,30 -18:32:31,531.1835,29.949,30.265,28.438,30 -18:32:31,531.2325,29.975,30.212,27.075,30 -18:32:31,531.2836,30.002,30.186,27.533,30 -18:32:31,531.3341,30.002,30.107,27.511,30 -18:32:31,531.3863,29.975,30.16,28.864,30 -18:32:31,531.4385,29.949,30.186,28.414,30 -18:32:31,531.4927,30.002,30.212,28.41,30 -18:32:31,531.5475,29.949,30.16,27.046,30 -18:32:31,531.6066,30.002,30.186,28.846,30 -18:32:31,531.6650,30.002,30.186,27.482,30 -18:32:31,531.7255,29.975,30.16,27.476,30 -18:32:31,531.7837,29.949,30.212,28.382,30 -18:32:31,531.8371,29.949,30.186,27.93,30 -18:32:31,531.8996,30.002,30.16,28.372,30 -18:32:31,531.9544,29.975,30.186,27.903,30 -18:32:31,532.0121,29.949,30.186,27.915,30 -18:32:31,532.0717,29.923,30.212,28.357,30 -18:32:32,532.1296,29.975,30.133,28.353,30 -18:32:32,532.1854,29.975,30.133,28.813,30 -18:32:32,532.2405,29.923,30.16,28.809,30 -18:32:32,532.3074,29.923,30.186,29.236,30 -18:32:32,532.3658,29.949,30.212,28.785,30 -18:32:32,532.4303,29.949,30.186,27.887,30 -18:32:32,532.4889,29.949,30.16,28.329,30 -18:32:32,532.5438,29.949,30.16,28.772,30 -18:32:32,532.6024,29.975,30.16,28.768,30 -18:32:32,532.6527,29.923,30.133,28.317,30 -18:32:32,532.6999,29.923,30.212,29.672,30 -18:32:32,532.7459,29.949,30.212,28.312,30 -18:32:32,532.7933,29.975,30.16,27.861,30 -18:32:32,532.8396,29.949,30.186,28.304,30 -18:32:32,532.8867,29.949,30.133,28.3,30 -18:32:32,532.9353,29.949,30.16,29.208,30 -18:32:32,532.9821,29.923,30.186,28.742,30 -18:32:32,533.0295,29.897,30.133,28.739,30 -18:32:32,533.0768,29.975,30.186,30.095,30 -18:32:33,533.1252,29.949,30.212,27.841,30 -18:32:33,533.1711,29.949,30.16,27.836,30 -18:32:33,533.2185,29.923,30.212,28.726,30 -18:32:33,533.2633,29.975,30.16,28.276,30 -18:32:33,533.3089,29.923,30.16,28.273,30 -18:32:33,533.3554,29.923,30.16,29.163,30 -18:32:33,533.4036,29.923,30.186,29.161,30 -18:32:33,533.4511,29.923,30.16,28.712,30 -18:32:33,533.5008,29.949,30.186,29.156,30 -18:32:33,533.5477,29.923,30.212,28.259,30 -18:32:33,533.5955,29.949,30.186,28.256,30 -18:32:33,533.6420,29.949,30.133,28.252,30 -18:32:33,533.6890,29.975,30.133,29.16,30 -18:32:33,533.7348,29.949,30.16,28.711,30 -18:32:33,533.7800,29.923,30.186,28.691,30 -18:32:33,533.8273,29.949,30.081,28.688,30 -18:32:33,533.8743,30.002,30.212,30.043,30 -18:32:33,533.9218,29.949,30.16,26.878,30 -18:32:33,533.9721,29.923,30.16,28.678,30 -18:32:33,534.0181,29.975,30.186,29.122,30 -18:32:33,534.0637,29.975,30.186,27.779,30 -18:32:34,534.1105,29.949,30.16,27.774,30 -18:32:34,534.1566,29.949,30.16,28.664,30 -18:32:34,534.2051,29.949,30.054,28.662,30 -18:32:34,534.2528,29.923,30.212,30.482,30 -18:32:34,534.3018,29.923,30.212,28.211,30 -18:32:34,534.3488,29.923,30.186,28.208,30 -18:32:34,534.3962,29.949,30.186,28.651,30 -18:32:34,534.4430,29.923,30.186,28.201,30 -18:32:34,534.4916,30.002,30.16,28.644,30 -18:32:34,534.5401,29.949,30.133,27.73,30 -18:32:34,534.5882,29.923,30.16,29.102,30 -18:32:34,534.6366,29.923,30.212,29.082,30 -18:32:34,534.6838,29.923,30.186,28.185,30 -18:32:34,534.7313,29.949,30.16,28.629,30 -18:32:34,534.7790,29.923,30.16,28.626,30 -18:32:34,534.8258,29.923,30.16,29.07,30 -18:32:34,534.8726,29.923,30.133,29.068,30 -18:32:34,534.9204,29.949,30.212,29.53,30 -18:32:34,534.9709,29.923,30.186,27.723,30 -18:32:34,535.0184,29.949,30.133,28.612,30 -18:32:34,535.0655,29.923,30.16,29.074,30 -18:32:35,535.1147,29.949,30.186,29.054,30 -18:32:35,535.1614,29.975,30.16,28.158,30 -18:32:35,535.2084,29.923,30.186,28.154,30 -18:32:35,535.2555,29.949,30.107,28.598,30 -18:32:35,535.3011,29.975,30.16,29.506,30 -18:32:35,535.3458,29.923,30.186,28.146,30 -18:32:35,535.3938,29.975,30.186,28.59,30 -18:32:35,535.4418,29.923,30.212,27.693,30 -18:32:35,535.4885,29.949,30.16,28.135,30 -18:32:35,535.5354,29.923,30.16,28.579,30 -18:32:35,535.5815,29.975,30.133,29.023,30 -18:32:35,535.6270,29.923,30.16,28.591,30 -18:32:35,535.6728,29.975,30.16,29.018,30 -18:32:35,535.7214,29.975,30.133,28.122,30 -18:32:35,535.7688,30.028,30.16,28.582,30 -18:32:35,535.8146,29.949,30.16,27.203,30 -18:32:35,535.8614,29.897,30.16,28.557,30 -18:32:35,535.9077,29.923,30.186,29.449,30 -18:32:35,535.9552,29.949,30.186,28.553,30 -18:32:35,536.0026,29.975,30.239,28.103,30 -18:32:35,536.0480,29.975,30.16,26.74,30 -18:32:36,536.0962,29.923,30.186,28.093,30 -18:32:36,536.1435,29.923,30.186,28.537,30 -18:32:36,536.1910,29.897,30.212,28.534,30 -18:32:36,536.2386,29.949,30.186,28.531,30 -18:32:36,536.2865,29.923,30.16,28.081,30 -18:32:36,536.3344,30.002,30.186,28.971,30 -18:32:36,536.3806,29.949,30.186,27.163,30 -18:32:36,536.4264,29.897,30.212,28.07,30 -18:32:36,536.4723,29.923,30.16,28.513,30 -18:32:36,536.5201,29.949,30.186,28.958,30 -18:32:36,536.5701,29.923,30.186,28.061,30 -18:32:36,536.6184,29.923,30.16,28.504,30 -18:32:36,536.6661,29.949,30.16,28.949,30 -18:32:36,536.7116,29.923,30.186,28.499,30 -18:32:36,536.7571,29.949,30.16,28.496,30 -18:32:36,536.8030,29.923,30.16,28.494,30 -18:32:36,536.8487,29.923,30.186,28.938,30 -18:32:36,536.8955,29.975,30.16,28.489,30 -18:32:36,536.9423,29.923,30.16,28.038,30 -18:32:36,536.9887,29.949,30.16,28.929,30 -18:32:36,537.0341,29.923,30.16,28.48,30 -18:32:36,537.0811,29.975,30.186,28.924,30 -18:32:37,537.1283,29.923,30.186,27.58,30 -18:32:37,537.1749,29.975,30.133,28.47,30 -18:32:37,537.2207,29.923,30.239,28.485,30 -18:32:37,537.2662,29.949,30.16,27.553,30 -18:32:37,537.3122,30.028,30.133,28.46,30 -18:32:37,537.3578,29.949,30.239,27.563,30 -18:32:37,537.4097,29.897,30.239,27.095,30 -18:32:37,537.4569,29.949,30.16,27.984,30 -18:32:37,537.5097,29.844,30.186,28.444,30 -18:32:37,537.5550,29.975,30.186,29.8,30 -18:32:37,537.6026,29.949,30.186,27.546,30 -18:32:37,537.6526,29.975,30.133,27.989,30 -18:32:37,537.6971,29.897,30.212,28.449,30 -18:32:37,537.7414,30.002,30.186,28.43,30 -18:32:37,537.7867,29.975,30.16,27.068,30 -18:32:37,537.8351,29.923,30.16,27.975,30 -18:32:37,537.8792,29.923,30.16,28.865,30 -18:32:37,537.9251,29.949,30.133,28.863,30 -18:32:37,537.9749,29.923,30.212,28.878,30 -18:32:37,538.0211,29.87,30.186,27.964,30 -18:32:37,538.0681,29.923,30.212,29.32,30 -18:32:38,538.1165,29.923,30.16,27.959,30 -18:32:38,538.1627,29.975,30.16,28.85,30 -18:32:38,538.2092,29.923,30.186,27.953,30 -18:32:38,538.2558,29.975,30.16,28.397,30 -18:32:38,538.3031,29.897,30.186,27.947,30 -18:32:38,538.3545,29.975,30.16,28.838,30 -18:32:38,538.4005,29.949,30.16,27.941,30 -18:32:38,538.4433,29.923,30.212,28.384,30 -18:32:38,538.4905,29.949,30.16,27.934,30 -18:32:38,538.5349,29.949,30.16,28.378,30 -18:32:38,538.5798,29.949,30.16,28.375,30 -18:32:38,538.6238,29.923,30.186,28.373,30 -18:32:38,538.6685,29.923,30.16,28.37,30 -18:32:38,538.7125,29.975,30.186,28.814,30 -18:32:38,538.7576,29.897,30.212,27.471,30 -18:32:38,538.8024,29.923,30.186,28.361,30 -18:32:38,538.8482,29.949,30.16,28.358,30 -18:32:38,538.8921,29.897,30.16,28.355,30 -18:32:38,538.9377,29.923,30.186,29.247,30 -18:32:38,538.9851,29.949,30.186,28.351,30 -18:32:38,539.0320,29.975,30.16,27.901,30 -18:32:38,539.0805,29.923,30.186,27.897,30 -18:32:39,539.1286,29.923,30.16,28.341,30 -18:32:39,539.1745,29.923,30.212,28.785,30 -18:32:39,539.2213,29.897,30.16,27.888,30 -18:32:39,539.2685,29.923,30.16,29.226,30 -18:32:39,539.3157,29.897,30.212,28.778,30 -18:32:39,539.3626,29.923,30.186,28.328,30 -18:32:39,539.4097,29.897,30.16,28.325,30 -18:32:39,539.4550,29.923,30.16,29.217,30 -18:32:39,539.5040,29.923,30.212,28.768,30 -18:32:39,539.5513,29.923,30.186,27.871,30 -18:32:39,539.5996,29.923,30.133,28.315,30 -18:32:39,539.6451,29.897,30.16,29.223,30 -18:32:39,539.6895,29.923,30.133,29.205,30 -18:32:39,539.7327,29.897,30.186,29.221,30 -18:32:39,539.7765,29.923,30.186,28.755,30 -18:32:39,539.8205,29.923,30.16,28.306,30 -18:32:39,539.8652,29.949,30.186,28.75,30 -18:32:39,539.9102,29.949,30.186,27.854,30 -18:32:39,539.9588,29.897,30.16,27.85,30 -18:32:39,540.0057,30.002,30.186,29.188,30 -18:32:39,540.0511,29.923,30.186,26.933,30 -18:32:40,540.0974,29.949,30.16,28.287,30 -18:32:40,540.1469,29.897,30.16,28.284,30 -18:32:40,540.1927,29.87,30.212,29.176,30 -18:32:40,540.2388,29.949,30.16,28.744,30 -18:32:40,540.2896,29.923,30.16,28.278,30 -18:32:40,540.3353,29.897,30.16,28.722,30 -18:32:40,540.3984,29.975,30.16,29.167,30 -18:32:40,540.4445,29.949,30.16,27.822,30 -18:32:40,540.4907,29.897,30.16,28.266,30 -18:32:40,540.5375,29.897,30.186,29.157,30 -18:32:40,540.5848,29.949,30.186,28.709,30 -18:32:40,540.6316,29.975,30.16,27.812,30 -18:32:40,540.6823,29.949,30.212,27.808,30 -18:32:40,540.7489,29.87,30.16,27.357,30 -18:32:40,540.8046,29.949,30.133,29.605,30 -18:32:40,540.8587,29.975,30.16,28.71,30 -18:32:40,540.9159,29.949,30.16,27.796,30 -18:32:40,540.9795,29.897,30.133,28.239,30 -18:32:40,541.0389,29.897,30.16,29.594,30 -18:32:40,541.0919,29.923,30.16,29.129,30 -18:32:41,541.1419,29.949,30.186,28.68,30 -18:32:41,541.1913,29.949,30.186,27.783,30 -18:32:41,541.2411,29.975,30.133,27.779,30 -18:32:41,541.2909,29.949,30.16,28.24,30 -18:32:41,541.3403,29.923,30.212,28.219,30 -18:32:41,541.3904,29.949,30.186,27.769,30 -18:32:41,541.4406,29.923,30.16,27.765,30 -18:32:41,541.4956,29.975,30.16,28.656,30 -18:32:41,541.5505,29.975,30.107,27.758,30 -18:32:41,541.6035,29.897,30.107,28.666,30 -18:32:41,541.6545,29.897,30.16,30.005,30 -18:32:41,541.7061,29.975,30.212,29.094,30 -18:32:41,541.7544,29.923,30.16,26.856,30 -18:32:41,541.8051,29.975,30.16,28.639,30 -18:32:41,541.8528,29.923,30.186,27.742,30 -18:32:41,541.9026,29.975,30.16,28.186,30 -18:32:41,541.9504,30.002,30.186,27.736,30 -18:32:41,541.9982,29.897,30.16,26.82,30 -18:32:41,542.0448,29.949,30.186,29.068,30 -18:32:41,542.0916,29.949,30.16,27.725,30 -18:32:42,542.1363,29.923,30.186,28.169,30 -18:32:42,542.1830,29.897,30.133,28.166,30 -18:32:42,542.2370,29.949,30.16,29.522,30 -18:32:42,542.2830,29.949,30.133,28.162,30 -18:32:42,542.3282,29.975,30.186,28.624,30 -18:32:42,542.3733,29.897,30.16,27.263,30 -18:32:42,542.4180,29.897,30.212,29.047,30 -18:32:42,542.4620,29.949,30.212,28.152,30 -18:32:42,542.5076,29.897,30.186,27.255,30 -18:32:42,542.5502,29.897,30.186,28.592,30 -18:32:42,542.5955,29.949,30.186,28.59,30 -18:32:42,542.6387,29.897,30.212,27.693,30 -18:32:42,542.6854,29.949,30.16,28.137,30 -18:32:42,542.7321,29.949,30.186,28.134,30 -18:32:42,542.7771,29.923,30.186,27.684,30 -18:32:42,542.8214,29.923,30.186,28.128,30 -18:32:42,542.8661,29.923,30.186,28.125,30 -18:32:42,542.9107,29.897,30.16,28.122,30 -18:32:42,542.9586,29.949,30.212,29.014,30 -18:32:42,543.0027,29.949,30.186,27.223,30 -18:32:42,543.0486,29.949,30.16,27.667,30 -18:32:42,543.0944,29.975,30.212,28.11,30 -18:32:43,543.1378,29.897,30.239,26.766,30 -18:32:43,543.1831,29.897,30.186,27.638,30 -18:32:43,543.2292,29.949,30.212,28.546,30 -18:32:43,543.2742,29.975,30.212,27.203,30 -18:32:43,543.3196,29.949,30.16,26.751,30 -18:32:43,543.3647,29.949,30.186,28.088,30 -18:32:43,543.4103,29.897,30.186,27.638,30 -18:32:43,543.4542,29.923,30.186,28.529,30 -18:32:43,543.5021,29.923,30.16,28.08,30 -18:32:43,543.5493,29.949,30.186,28.524,30 -18:32:43,543.5945,29.949,30.16,27.627,30 -18:32:43,543.6401,29.949,30.16,28.071,30 -18:32:43,543.6854,29.949,30.16,28.068,30 -18:32:43,543.7316,29.897,30.16,28.065,30 -18:32:43,543.7751,29.923,30.16,28.957,30 -18:32:43,543.8188,29.949,30.186,28.508,30 -18:32:43,543.8645,29.923,30.186,27.612,30 -18:32:43,543.9103,29.923,30.239,28.055,30 -18:32:43,543.9572,29.897,30.16,27.141,30 -18:32:43,544.0029,29.949,30.186,28.943,30 -18:32:43,544.0485,29.949,30.16,27.6,30 -18:32:43,544.0949,29.923,30.186,28.043,30 -18:32:44,544.1402,29.897,30.212,28.04,30 -18:32:44,544.1858,29.897,30.212,28.038,30 -18:32:44,544.2324,29.949,30.212,28.035,30 -18:32:44,544.2756,29.923,30.133,27.137,30 -18:32:44,544.3203,29.897,30.107,28.939,30 -18:32:44,544.3652,29.897,30.239,29.832,30 -18:32:44,544.4103,29.975,30.16,27.562,30 -18:32:44,544.4554,29.975,30.186,27.575,30 -18:32:44,544.5028,29.975,30.186,27.125,30 -18:32:44,544.5480,29.897,30.186,27.12,30 -18:32:44,544.5934,29.923,30.186,28.458,30 -18:32:44,544.6387,29.923,30.16,28.008,30 -18:32:44,544.6848,29.844,30.186,28.453,30 -18:32:44,544.7314,29.844,30.16,29.362,30 -18:32:44,544.7763,29.949,30.212,29.809,30 -18:32:44,544.8205,29.897,30.186,27.108,30 -18:32:44,544.8645,29.897,30.16,28.446,30 -18:32:44,544.9101,29.923,30.186,28.891,30 -18:32:44,544.9569,29.897,30.186,27.995,30 -18:32:44,545.0017,29.897,30.186,28.439,30 -18:32:44,545.0464,29.949,30.16,28.437,30 -18:32:44,545.0929,29.923,30.186,27.988,30 -18:32:45,545.1376,29.949,30.16,27.985,30 -18:32:45,545.1864,29.897,30.212,27.982,30 -18:32:45,545.2304,29.923,30.186,27.979,30 -18:32:45,545.2748,29.897,30.212,27.976,30 -18:32:45,545.3228,29.897,30.212,27.974,30 -18:32:45,545.3675,29.897,30.186,27.971,30 -18:32:45,545.4162,29.949,30.16,28.415,30 -18:32:45,545.4640,29.87,30.133,27.966,30 -18:32:45,545.5110,29.923,30.186,29.786,30 -18:32:45,545.5559,29.897,30.16,27.963,30 -18:32:45,545.6025,29.897,30.186,28.854,30 -18:32:45,545.6501,29.949,30.16,28.405,30 -18:32:45,545.6993,29.975,30.212,27.956,30 -18:32:45,545.7500,29.897,30.186,26.611,30 -18:32:45,545.7970,29.923,30.186,28.395,30 -18:32:45,545.8468,29.923,30.16,27.945,30 -18:32:45,545.8933,29.897,30.16,28.389,30 -18:32:45,545.9379,30.002,30.212,28.834,30 -18:32:45,545.9856,29.923,30.107,26.133,30 -18:32:45,546.0306,29.923,30.186,29.292,30 -18:32:45,546.0750,29.949,30.16,27.932,30 -18:32:46,546.1188,29.923,30.16,27.93,30 -18:32:46,546.1653,29.923,30.212,28.374,30 -18:32:46,546.2090,29.897,30.186,27.477,30 -18:32:46,546.2537,29.949,30.186,28.368,30 -18:32:46,546.3001,29.897,30.186,27.472,30 -18:32:46,546.3487,29.923,30.16,28.363,30 -18:32:46,546.3931,29.923,30.186,28.36,30 -18:32:46,546.4415,29.923,30.186,27.911,30 -18:32:46,546.4874,29.897,30.212,27.908,30 -18:32:46,546.5363,29.923,30.186,27.905,30 -18:32:46,546.5847,29.949,30.133,27.902,30 -18:32:46,546.6313,29.897,30.186,28.364,30 -18:32:46,546.6758,29.975,30.16,28.344,30 -18:32:46,546.7216,29.897,30.16,27.448,30 -18:32:46,546.7660,29.897,30.212,28.786,30 -18:32:46,546.8089,29.897,30.186,27.89,30 -18:32:46,546.8534,29.897,30.186,28.334,30 -18:32:46,546.8997,29.975,30.186,28.332,30 -18:32:46,546.9468,29.897,30.186,26.989,30 -18:32:46,546.9920,29.897,30.212,28.326,30 -18:32:46,547.0360,29.923,30.186,27.877,30 -18:32:46,547.0846,29.897,30.186,27.874,30 -18:32:47,547.1334,29.923,30.16,28.318,30 -18:32:47,547.1780,29.923,30.186,28.316,30 -18:32:47,547.2218,29.949,30.16,27.866,30 -18:32:47,547.2669,29.923,30.212,27.864,30 -18:32:47,547.3119,29.949,30.186,27.414,30 -18:32:47,547.3575,29.975,30.16,27.41,30 -18:32:47,547.4034,29.897,30.239,27.407,30 -18:32:47,547.4488,29.897,30.16,27.386,30 -18:32:47,547.4939,29.923,30.186,28.741,30 -18:32:47,547.5425,29.949,30.186,27.845,30 -18:32:47,547.5882,29.923,30.186,27.395,30 -18:32:47,547.6337,29.897,30.186,27.839,30 -18:32:47,547.6826,29.87,30.186,28.283,30 -18:32:47,547.7291,29.949,30.16,28.745,30 -18:32:47,547.7768,29.897,30.212,27.832,30 -18:32:47,547.8215,30.002,30.186,27.829,30 -18:32:47,547.8665,29.949,30.212,26.468,30 -18:32:47,547.9115,29.923,30.212,26.927,30 -18:32:47,547.9590,29.897,30.186,27.37,30 -18:32:47,548.0064,30.028,30.186,28.261,30 -18:32:47,548.0522,29.87,30.16,26.006,30 -18:32:48,548.0997,29.923,30.212,29.165,30 -18:32:48,548.1433,29.87,30.212,27.358,30 -18:32:48,548.1883,29.923,30.186,28.266,30 -18:32:48,548.2353,29.923,30.133,27.799,30 -18:32:48,548.2805,29.897,30.212,28.708,30 -18:32:48,548.3270,29.923,30.16,27.795,30 -18:32:48,548.3722,29.949,30.186,28.239,30 -18:32:48,548.4187,29.949,30.186,27.343,30 -18:32:48,548.4648,29.949,30.186,27.339,30 -18:32:48,548.5110,29.949,30.186,27.336,30 -18:32:48,548.5561,29.949,30.16,27.332,30 -18:32:48,548.6020,29.897,30.212,27.776,30 -18:32:48,548.6470,29.949,30.16,27.773,30 -18:32:48,548.6922,29.897,30.212,27.77,30 -18:32:48,548.7373,29.897,30.212,27.767,30 -18:32:48,548.7820,29.949,30.16,27.765,30 -18:32:48,548.8266,29.923,30.186,27.762,30 -18:32:48,548.8715,29.897,30.212,27.759,30 -18:32:48,548.9176,29.923,30.16,27.756,30 -18:32:48,548.9655,29.897,30.239,28.201,30 -18:32:48,549.0123,29.923,30.16,27.287,30 -18:32:48,549.0570,29.975,30.212,28.195,30 -18:32:49,549.1087,29.897,30.186,26.404,30 -18:32:49,549.1527,29.923,30.16,28.187,30 -18:32:49,549.1975,29.949,30.186,28.185,30 -18:32:49,549.2446,29.949,30.16,27.289,30 -18:32:49,549.2903,29.949,30.16,27.732,30 -18:32:49,549.3352,29.949,30.16,27.73,30 -18:32:49,549.3825,29.949,30.16,27.727,30 -18:32:49,549.4318,29.949,30.186,27.724,30 -18:32:49,549.4785,29.897,30.212,27.274,30 -18:32:49,549.5242,29.975,30.186,27.717,30 -18:32:49,549.5718,29.897,30.16,26.82,30 -18:32:49,549.6256,29.975,30.186,28.604,30 -18:32:49,549.6728,29.949,30.133,26.814,30 -18:32:49,549.7179,29.897,30.186,28.168,30 -18:32:49,549.7637,29.923,30.133,28.149,30 -18:32:49,549.8095,29.87,30.16,28.611,30 -18:32:49,549.8552,29.87,30.212,29.057,30 -18:32:49,549.9019,29.87,30.186,28.161,30 -18:32:49,549.9499,29.923,30.186,28.606,30 -18:32:49,549.9982,29.975,30.133,27.693,30 -18:32:49,550.0434,29.949,30.212,27.708,30 -18:32:49,550.0898,29.87,30.212,26.793,30 -18:32:50,550.1350,29.923,30.16,28.148,30 -18:32:50,550.1824,29.949,30.186,28.128,30 -18:32:50,550.2294,29.897,30.186,27.232,30 -18:32:50,550.2747,29.949,30.16,28.123,30 -18:32:50,550.3196,29.923,30.16,27.673,30 -18:32:50,550.3645,29.949,30.16,28.118,30 -18:32:50,550.4078,29.923,30.081,27.668,30 -18:32:50,550.4530,29.949,30.186,29.471,30 -18:32:50,550.4997,29.949,30.16,27.218,30 -18:32:50,550.5465,29.923,30.186,27.662,30 -18:32:50,550.5918,29.975,30.212,27.659,30 -18:32:50,550.6360,29.923,30.186,26.315,30 -18:32:50,550.6808,29.949,30.212,27.651,30 -18:32:50,550.7258,29.923,30.186,26.754,30 -18:32:50,550.7710,29.87,30.212,27.644,30 -18:32:50,550.8167,29.949,30.186,28.106,30 -18:32:50,550.8611,29.897,30.212,27.192,30 -18:32:50,550.9051,29.897,30.212,27.636,30 -18:32:50,550.9525,29.923,30.16,27.633,30 -18:32:50,550.9975,29.923,30.239,28.078,30 -18:32:50,551.0434,29.897,30.16,26.717,30 -18:32:50,551.0906,29.897,30.186,28.518,30 -18:32:51,551.1366,29.897,30.186,28.07,30 -18:32:51,551.1816,29.897,30.186,28.067,30 -18:32:51,551.2288,29.897,30.212,28.065,30 -18:32:51,551.2735,29.844,30.16,27.616,30 -18:32:51,551.3197,29.949,30.16,29.419,30 -18:32:51,551.3656,29.897,30.16,27.613,30 -18:32:51,551.4115,29.897,30.212,28.504,30 -18:32:51,551.4582,29.923,30.186,27.608,30 -18:32:51,551.5027,29.897,30.212,27.606,30 -18:32:51,551.5531,29.949,30.186,27.603,30 -18:32:51,551.5992,29.923,30.16,27.153,30 -18:32:51,551.6422,29.897,30.239,28.043,30 -18:32:51,551.6881,29.897,30.212,27.13,30 -18:32:51,551.7347,29.923,30.212,27.591,30 -18:32:51,551.7806,29.949,30.186,27.141,30 -18:32:51,551.8251,29.949,30.186,27.137,30 -18:32:51,551.8709,29.949,30.212,27.134,30 -18:32:51,551.9196,29.844,30.16,26.683,30 -18:32:51,551.9716,29.923,30.186,29.379,30 -18:32:51,552.0192,29.897,30.16,27.573,30 -18:32:51,552.0690,29.897,30.212,28.464,30 -18:32:52,552.1162,29.87,30.186,27.568,30 -18:32:52,552.1605,29.87,30.186,28.477,30 -18:32:52,552.2049,29.949,30.16,28.475,30 -18:32:52,552.2513,29.923,30.16,27.562,30 -18:32:52,552.2959,29.923,30.186,28.007,30 -18:32:52,552.3417,29.975,30.16,27.557,30 -18:32:52,552.3885,29.923,30.16,27.107,30 -18:32:52,552.4344,29.975,30.16,27.998,30 -18:32:52,552.4815,29.923,30.186,27.102,30 -18:32:52,552.5271,29.923,30.133,27.545,30 -18:32:52,552.5769,29.923,30.186,28.454,30 -18:32:52,552.6238,29.923,30.16,27.541,30 -18:32:52,552.6714,29.897,30.186,27.985,30 -18:32:52,552.7179,29.949,30.186,27.983,30 -18:32:52,552.7630,29.923,30.212,27.086,30 -18:32:52,552.8075,29.949,30.16,27.083,30 -18:32:52,552.8533,29.949,30.212,27.526,30 -18:32:52,552.8996,29.923,30.16,26.629,30 -18:32:52,552.9453,29.949,30.186,27.966,30 -18:32:52,552.9973,29.923,30.212,27.07,30 -18:32:52,553.0439,29.949,30.186,27.066,30 -18:32:52,553.0924,29.949,30.186,27.062,30 -18:32:53,553.1397,29.949,30.186,27.059,30 -18:32:53,553.1855,29.923,30.186,27.055,30 -18:32:53,553.2343,29.923,30.186,27.499,30 -18:32:53,553.2811,29.897,30.239,27.496,30 -18:32:53,553.3242,29.975,30.16,27.028,30 -18:32:53,553.3694,29.923,30.16,27.042,30 -18:32:53,553.4160,29.923,30.212,27.933,30 -18:32:53,553.4638,29.949,30.212,27.036,30 -18:32:53,553.5086,29.949,30.212,26.586,30 -18:32:53,553.5582,29.949,30.16,26.581,30 -18:32:53,553.6039,29.897,30.133,27.471,30 -18:32:53,553.6497,29.87,30.186,28.827,30 -18:32:53,553.6947,29.897,30.212,28.379,30 -18:32:53,553.7403,29.949,30.186,27.466,30 -18:32:53,553.7855,29.923,30.212,27.016,30 -18:32:53,553.8315,29.897,30.212,27.013,30 -18:32:53,553.8759,29.923,30.186,27.456,30 -18:32:53,553.9235,29.949,30.186,27.454,30 -18:32:53,553.9703,29.949,30.186,27.003,30 -18:32:53,554.0160,29.87,30.133,27.0,30 -18:32:53,554.0648,29.897,30.265,29.267,30 -18:32:54,554.1150,29.949,30.16,26.531,30 -18:32:54,554.1629,29.975,30.186,27.438,30 -18:32:54,554.2073,29.897,30.16,26.541,30 -18:32:54,554.2555,29.923,30.212,28.326,30 -18:32:54,554.3025,29.897,30.16,26.983,30 -18:32:54,554.3493,29.949,30.186,28.321,30 -18:32:54,554.3977,29.949,30.186,26.978,30 -18:32:54,554.4448,29.923,30.239,26.974,30 -18:32:54,554.4901,29.923,30.239,26.506,30 -18:32:54,554.5357,29.923,30.265,26.502,30 -18:32:54,554.5842,29.897,30.212,26.05,30 -18:32:54,554.6303,29.844,30.212,27.404,30 -18:32:54,554.6767,29.949,30.212,28.313,30 -18:32:54,554.7219,29.897,30.16,26.505,30 -18:32:54,554.7675,29.923,30.16,28.29,30 -18:32:54,554.8138,29.949,30.212,27.841,30 -18:32:54,554.8595,29.923,30.186,26.497,30 -18:32:54,554.9053,29.949,30.212,27.387,30 -18:32:54,554.9518,29.87,30.16,26.49,30 -18:32:54,554.9992,29.949,30.212,28.739,30 -18:32:54,555.0442,29.923,30.212,26.485,30 -18:32:54,555.0906,29.975,30.212,26.928,30 -18:32:55,555.1354,29.923,30.212,26.03,30 -18:32:55,555.1814,29.949,30.16,26.92,30 -18:32:55,555.2286,29.923,30.212,27.363,30 -18:32:55,555.2767,29.897,30.212,26.913,30 -18:32:55,555.3249,29.897,30.239,27.357,30 -18:32:55,555.3717,29.923,30.16,26.889,30 -18:32:55,555.4272,29.949,30.186,27.797,30 -18:32:55,555.4769,29.923,30.212,26.9,30 -18:32:55,555.5225,29.923,30.186,26.896,30 -18:32:55,555.5726,29.897,30.212,27.34,30 -18:32:55,555.6202,29.923,30.16,27.337,30 -18:32:55,555.6665,29.923,30.186,27.781,30 -18:32:55,555.7361,30.002,30.16,27.331,30 -18:32:55,555.7892,29.949,30.16,26.415,30 -18:32:55,555.8473,29.897,30.16,27.322,30 -18:32:55,555.9013,29.923,30.107,28.213,30 -18:32:55,555.9533,29.897,30.16,28.676,30 -18:32:55,556.0048,29.923,30.186,28.21,30 -18:32:55,556.0575,29.923,30.212,27.314,30 -18:32:56,556.1136,29.923,30.186,26.864,30 -18:32:56,556.1643,29.923,30.133,27.307,30 -18:32:56,556.2149,29.923,30.16,28.215,30 -18:32:56,556.2673,29.949,30.16,27.749,30 -18:32:56,556.3173,29.949,30.16,27.299,30 -18:32:56,556.3710,29.949,30.212,27.296,30 -18:32:56,556.4226,29.975,30.16,26.398,30 -18:32:56,556.4736,29.897,30.16,26.841,30 -18:32:56,556.5237,29.897,30.186,28.179,30 -18:32:56,556.5735,29.923,30.133,27.73,30 -18:32:56,556.6247,29.897,30.186,28.192,30 -18:32:56,556.6737,29.897,30.16,27.726,30 -18:32:56,556.7247,29.923,30.212,28.171,30 -18:32:56,556.7731,29.949,30.212,26.827,30 -18:32:56,556.8226,29.949,30.16,26.376,30 -18:32:56,556.8717,29.923,30.16,27.266,30 -18:32:56,556.9271,29.897,30.212,27.71,30 -18:32:56,556.9764,29.923,30.133,27.261,30 -18:32:56,557.0261,29.897,30.16,28.169,30 -18:32:56,557.0741,29.949,30.16,28.15,30 -18:32:57,557.1218,29.923,30.133,27.254,30 -18:32:57,557.1696,29.87,30.133,28.163,30 -18:32:57,557.2197,29.923,30.133,29.073,30 -18:32:57,557.2705,29.949,30.186,28.161,30 -18:32:57,557.3185,29.923,30.186,26.801,30 -18:32:57,557.3674,29.923,30.133,27.244,30 -18:32:57,557.4162,29.923,30.133,28.153,30 -18:32:57,557.4630,29.897,30.186,28.151,30 -18:32:57,557.5104,29.923,30.16,27.685,30 -18:32:57,557.5553,29.897,30.186,27.683,30 -18:32:57,557.6017,29.923,30.16,27.681,30 -18:32:57,557.6487,29.897,30.133,27.679,30 -18:32:57,557.6970,29.949,30.16,28.588,30 -18:32:57,557.7445,29.923,30.133,27.229,30 -18:32:57,557.7908,29.949,30.16,28.137,30 -18:32:57,557.8366,29.87,30.186,27.224,30 -18:32:57,557.8823,29.923,30.186,28.133,30 -18:32:57,557.9267,29.923,30.16,27.22,30 -18:32:57,557.9757,29.897,30.107,27.664,30 -18:32:57,558.0223,29.923,30.133,29.021,30 -18:32:57,558.0690,29.923,30.16,28.126,30 -18:32:58,558.1163,29.923,30.16,27.66,30 -18:32:58,558.1624,29.87,30.107,27.658,30 -18:32:58,558.2097,29.897,30.133,29.479,30 -18:32:58,558.2568,29.949,30.239,28.568,30 -18:32:58,558.3035,29.897,30.16,25.85,30 -18:32:58,558.3511,29.897,30.133,28.098,30 -18:32:58,558.3987,29.949,30.186,28.561,30 -18:32:58,558.4464,29.897,30.16,26.754,30 -18:32:58,558.4925,29.897,30.16,28.092,30 -18:32:58,558.5376,29.87,30.107,28.09,30 -18:32:58,558.5843,29.897,30.133,29.465,30 -18:32:58,558.6324,29.87,30.16,28.554,30 -18:32:58,558.6798,29.897,30.107,28.553,30 -18:32:58,558.7245,29.897,30.16,28.999,30 -18:32:58,558.7693,29.923,30.133,28.088,30 -18:32:58,558.8160,29.897,30.133,28.103,30 -18:32:58,558.8625,29.897,30.107,28.549,30 -18:32:58,558.9085,29.923,30.133,28.996,30 -18:32:58,558.9583,29.923,30.133,28.101,30 -18:32:58,559.0054,29.897,30.186,28.099,30 -18:32:58,559.0505,29.923,30.133,27.634,30 -18:32:59,559.0966,29.923,30.133,28.096,30 -18:32:59,559.1455,29.975,30.133,28.094,30 -18:32:59,559.1904,29.87,30.133,27.198,30 -18:32:59,559.2373,29.897,30.133,29.001,30 -18:32:59,559.2848,29.87,30.133,28.537,30 -18:32:59,559.3305,29.975,30.133,29.0,30 -18:32:59,559.3763,29.949,30.054,27.195,30 -18:32:59,559.4232,29.897,30.16,28.998,30 -18:32:59,559.4698,29.87,30.133,28.069,30 -18:32:59,559.5181,29.87,30.16,28.996,30 -18:32:59,559.5642,29.87,30.16,28.532,30 -18:32:59,559.6148,29.844,30.133,28.531,30 -18:32:59,559.6610,29.923,30.107,29.442,30 -18:32:59,559.7073,29.87,30.081,28.531,30 -18:32:59,559.7532,29.87,30.16,29.889,30 -18:32:59,559.7995,29.87,30.133,28.531,30 -18:32:59,559.8468,29.87,30.16,28.995,30 -18:32:59,559.8937,29.897,30.107,28.53,30 -18:32:59,559.9427,29.844,30.133,28.977,30 -18:32:59,559.9913,29.897,30.133,29.441,30 -18:32:59,560.0368,29.923,30.133,28.53,30 -18:32:59,560.0832,29.844,30.133,28.082,30 -18:33:00,560.1300,29.897,30.107,29.439,30 -18:33:00,560.1791,29.87,30.16,28.975,30 -18:33:00,560.2263,29.923,30.107,28.528,30 -18:33:00,560.2713,29.897,30.107,28.527,30 -18:33:00,560.3162,29.923,30.133,28.974,30 -18:33:00,560.3628,29.87,30.133,28.079,30 -18:33:00,560.4073,29.949,30.133,28.989,30 -18:33:00,560.4547,29.844,30.16,27.631,30 -18:33:00,560.5017,29.87,30.133,28.97,30 -18:33:00,560.5509,29.87,30.16,28.987,30 -18:33:00,560.6006,29.949,30.133,28.523,30 -18:33:00,560.6495,29.818,30.16,27.627,30 -18:33:00,560.6971,29.87,30.107,29.414,30 -18:33:00,560.7478,29.87,30.107,29.432,30 -18:33:00,560.7962,29.87,30.133,29.432,30 -18:33:00,560.8459,29.923,30.107,28.986,30 -18:33:00,560.8934,29.897,30.133,28.521,30 -18:33:00,560.9438,29.975,30.107,28.52,30 -18:33:00,560.9930,29.897,30.081,27.625,30 -18:33:00,561.0388,29.897,30.133,29.412,30 -18:33:00,561.0855,29.87,30.16,28.518,30 -18:33:01,561.1334,29.897,30.16,28.517,30 -18:33:01,561.1806,29.897,30.107,28.052,30 -18:33:01,561.2275,29.897,30.133,28.962,30 -18:33:01,561.2739,29.87,30.186,28.515,30 -18:33:01,561.3219,29.897,30.16,28.067,30 -18:33:01,561.3690,29.87,30.16,28.048,30 -18:33:01,561.4154,29.923,30.107,28.511,30 -18:33:01,561.4627,29.923,30.107,28.51,30 -18:33:01,561.5102,29.897,30.16,28.509,30 -18:33:01,561.5586,29.87,30.107,28.044,30 -18:33:01,561.6266,29.87,30.107,29.418,30 -18:33:01,561.6802,29.87,30.133,29.419,30 -18:33:01,561.7276,29.923,30.107,28.973,30 -18:33:01,561.7724,29.897,30.133,28.508,30 -18:33:01,561.8183,29.87,30.133,28.508,30 -18:33:01,561.8637,29.897,30.133,28.971,30 -18:33:01,561.9097,29.923,30.107,28.507,30 -18:33:01,561.9579,29.897,30.107,28.506,30 -18:33:01,562.0057,29.87,30.133,28.952,30 -18:33:01,562.0524,29.87,30.16,28.969,30 -18:33:02,562.0998,29.897,30.133,28.505,30 -18:33:02,562.1499,29.897,30.16,28.504,30 -18:33:02,562.1980,29.844,30.133,28.039,30 -18:33:02,562.2427,29.897,30.107,29.413,30 -18:33:02,562.2874,29.923,30.133,28.949,30 -18:33:02,562.3331,29.87,30.16,28.055,30 -18:33:02,562.3797,29.87,30.107,28.501,30 -18:33:02,562.4257,29.897,30.212,29.412,30 -18:33:02,562.4715,29.975,30.107,27.142,30 -18:33:02,562.5164,29.897,30.133,27.603,30 -18:33:02,562.5602,29.923,30.107,28.496,30 -18:33:02,562.6058,29.87,30.133,28.495,30 -18:33:02,562.6522,29.897,30.107,28.958,30 -18:33:02,562.6983,29.897,30.107,28.941,30 -18:33:02,562.7453,29.897,30.081,28.941,30 -18:33:02,562.7912,29.818,30.16,29.388,30 -18:33:02,562.8377,29.897,30.107,29.389,30 -18:33:02,562.8839,29.87,30.133,28.942,30 -18:33:02,562.9295,29.897,30.107,28.959,30 -18:33:02,562.9781,29.897,30.133,28.942,30 -18:33:02,563.0227,29.87,30.107,28.495,30 -18:33:02,563.0674,29.87,30.107,29.405,30 -18:33:03,563.1159,29.897,30.16,29.406,30 -18:33:03,563.1625,29.897,30.133,28.031,30 -18:33:03,563.2077,29.87,30.107,28.493,30 -18:33:03,563.2530,29.897,30.133,29.404,30 -18:33:03,563.3007,29.87,30.133,28.493,30 -18:33:03,563.3497,29.897,30.107,28.957,30 -18:33:03,563.3995,29.87,30.133,28.94,30 -18:33:03,563.4455,29.844,30.133,28.957,30 -18:33:03,563.4923,29.897,30.107,29.404,30 -18:33:03,563.5375,29.844,30.16,28.94,30 -18:33:03,563.5824,29.923,30.107,28.94,30 -18:33:03,563.6285,29.87,30.133,28.493,30 -18:33:03,563.6784,29.791,30.16,28.956,30 -18:33:03,563.7408,29.87,30.133,29.851,30 -18:33:03,563.7938,29.87,30.133,28.958,30 -18:33:03,563.8457,29.844,30.107,28.957,30 -18:33:03,563.8921,29.87,30.081,29.852,30 -18:33:03,563.9417,29.897,30.16,29.853,30 -18:33:03,563.9900,29.897,30.107,28.031,30 -18:33:03,564.0366,29.87,30.133,28.941,30 -18:33:03,564.0844,29.844,30.107,28.958,30 -18:33:04,564.1364,29.87,30.133,29.853,30 -18:33:04,564.1860,29.897,30.107,28.96,30 -18:33:04,564.2348,29.897,30.16,28.942,30 -18:33:04,564.2822,29.87,30.081,28.031,30 -18:33:04,564.3299,29.844,30.133,29.852,30 -18:33:04,564.3818,29.897,30.107,29.406,30 -18:33:04,564.4291,29.844,30.107,28.943,30 -18:33:04,564.4744,29.897,30.133,29.854,30 -18:33:04,564.5202,29.844,30.081,28.497,30 -18:33:04,564.5706,29.87,30.133,30.302,30 -18:33:04,564.6167,29.897,30.107,28.962,30 -18:33:04,564.6647,29.897,30.107,28.945,30 -18:33:04,564.7102,29.897,30.133,28.945,30 -18:33:04,564.7557,29.897,30.133,28.498,30 -18:33:04,564.8009,29.897,30.107,28.497,30 -18:33:04,564.8474,29.844,30.16,28.943,30 -18:33:04,564.8966,29.897,30.16,28.943,30 -18:33:04,564.9447,29.844,30.107,28.031,30 -18:33:04,564.9906,29.87,30.133,29.853,30 -18:33:04,565.0348,29.87,30.133,28.96,30 -18:33:04,565.0797,29.844,30.133,28.96,30 -18:33:05,565.1288,29.923,30.133,29.407,30 -18:33:05,565.1745,29.897,30.107,28.049,30 -18:33:05,565.2223,29.844,30.133,28.942,30 -18:33:05,565.2667,29.923,30.16,29.406,30 -18:33:05,565.3158,29.844,30.081,27.584,30 -18:33:05,565.3615,29.844,30.081,30.299,30 -18:33:05,565.4065,29.87,30.133,30.301,30 -18:33:05,565.4517,29.844,30.133,28.961,30 -18:33:05,565.4988,29.87,30.107,29.408,30 -18:33:05,565.5446,29.818,30.107,29.409,30 -18:33:05,565.5904,29.87,30.133,30.304,30 -18:33:05,565.6356,29.87,30.16,28.964,30 -18:33:05,565.6817,29.87,30.054,28.5,30 -18:33:05,565.7288,29.87,30.107,30.322,30 -18:33:05,565.7767,29.87,30.081,29.413,30 -18:33:05,565.8218,29.87,30.107,29.86,30 -18:33:05,565.8663,29.87,30.16,29.415,30 -18:33:05,565.9155,29.844,30.133,28.504,30 -18:33:05,565.9637,29.87,30.107,29.414,30 -18:33:05,566.0119,29.844,30.107,29.415,30 -18:33:05,566.0589,29.897,30.133,29.863,30 -18:33:06,566.1058,29.897,30.107,28.506,30 -18:33:06,566.1536,29.897,30.107,28.952,30 -18:33:06,566.1997,29.791,30.133,28.952,30 -18:33:06,566.2445,29.844,30.186,30.328,30 -18:33:06,566.2881,29.923,30.133,28.507,30 -18:33:06,566.3336,29.923,30.107,28.059,30 -18:33:06,566.3803,29.897,30.133,28.504,30 -18:33:06,566.4268,29.897,30.133,28.504,30 -18:33:06,566.4718,29.844,30.107,28.503,30 -18:33:06,566.5183,29.844,30.107,29.861,30 -18:33:06,566.5637,29.87,30.081,29.862,30 -18:33:06,566.6102,29.897,30.16,29.863,30 -18:33:06,566.6565,29.844,30.107,28.041,30 -18:33:06,566.7016,29.87,30.107,29.863,30 -18:33:06,566.7478,29.923,30.107,29.417,30 -18:33:06,566.7966,29.844,30.133,28.506,30 -18:33:06,566.8439,29.844,30.16,29.417,30 -18:33:06,566.8897,29.87,30.133,28.953,30 -18:33:06,566.9392,29.844,30.16,28.97,30 -18:33:06,566.9868,29.844,30.107,28.953,30 -18:33:06,567.0328,29.897,30.16,29.864,30 -18:33:06,567.0788,29.897,30.133,28.043,30 -18:33:07,567.1277,29.897,30.107,28.506,30 -18:33:07,567.1709,29.897,30.16,28.952,30 -18:33:07,567.2141,29.87,30.133,28.04,30 -18:33:07,567.2597,29.897,30.107,28.968,30 -18:33:07,567.3039,29.844,30.133,28.95,30 -18:33:07,567.3491,29.87,30.133,29.415,30 -18:33:07,567.3956,29.897,30.133,28.968,30 -18:33:07,567.4416,29.897,30.133,28.504,30 -18:33:07,567.4867,29.765,30.107,28.503,30 -18:33:07,567.5322,29.897,30.16,31.219,30 -18:33:07,567.5793,29.87,30.133,28.041,30 -18:33:07,567.6240,29.897,30.133,28.968,30 -18:33:07,567.6730,29.844,30.133,28.504,30 -18:33:07,567.7185,29.844,30.107,29.415,30 -18:33:07,567.7638,29.844,30.16,29.862,30 -18:33:07,567.8103,29.897,30.133,28.952,30 -18:33:07,567.8565,29.923,30.133,28.505,30 -18:33:07,567.9012,29.923,30.107,28.057,30 -18:33:07,567.9490,29.897,30.133,28.503,30 -18:33:07,567.9968,29.87,30.107,28.502,30 -18:33:07,568.0435,29.844,30.133,29.413,30 -18:33:07,568.0874,29.844,30.212,29.413,30 -18:33:08,568.1327,29.897,30.107,28.055,30 -18:33:08,568.1786,29.87,30.133,28.948,30 -18:33:08,568.2244,29.87,30.133,28.965,30 -18:33:08,568.2707,29.897,30.107,28.965,30 -18:33:08,568.3160,29.897,30.133,28.948,30 -18:33:08,568.3620,29.87,30.133,28.5,30 -18:33:08,568.4066,29.87,30.107,28.964,30 -18:33:08,568.4535,29.87,30.081,29.411,30 -18:33:08,568.4980,29.844,30.16,29.859,30 -18:33:08,568.5441,29.87,30.133,28.949,30 -18:33:08,568.5910,29.87,30.16,28.966,30 -18:33:08,568.6377,29.818,30.16,28.501,30 -18:33:08,568.6858,29.844,30.133,29.395,30 -18:33:08,568.7334,29.897,30.107,29.413,30 -18:33:08,568.7803,29.87,30.133,28.949,30 -18:33:08,568.8282,29.87,30.081,28.966,30 -18:33:08,568.8747,29.87,30.107,29.86,30 -18:33:08,568.9214,29.818,30.133,29.414,30 -18:33:08,568.9695,29.844,30.186,29.862,30 -18:33:08,569.0152,29.87,30.107,28.505,30 -18:33:08,569.0610,29.844,30.107,29.415,30 -18:33:09,569.1062,29.87,30.107,29.863,30 -18:33:09,569.1521,29.897,30.107,29.417,30 -18:33:09,569.1985,29.897,30.133,28.954,30 -18:33:09,569.2473,29.818,30.081,28.506,30 -18:33:09,569.2955,29.87,30.133,30.759,30 -18:33:09,569.3437,29.844,30.133,28.973,30 -18:33:09,569.3897,29.844,30.133,29.42,30 -18:33:09,569.4366,29.844,30.133,29.42,30 -18:33:09,569.4814,29.844,30.107,29.421,30 -18:33:09,569.5299,29.87,30.133,29.869,30 -18:33:09,569.5761,29.897,30.133,28.976,30 -18:33:09,569.6222,29.844,30.133,28.511,30 -18:33:09,569.6686,29.844,30.133,29.422,30 -18:33:09,569.7147,29.818,30.133,29.423,30 -18:33:09,569.7634,29.87,30.133,29.87,30 -18:33:09,569.8119,29.844,30.133,28.977,30 -18:33:09,569.8604,29.844,30.186,29.425,30 -18:33:09,569.9056,29.844,30.107,28.514,30 -18:33:09,569.9515,29.897,30.16,29.871,30 -18:33:09,569.9971,29.818,30.107,28.05,30 -18:33:09,570.0463,29.844,30.16,30.318,30 -18:33:09,570.0946,29.844,30.107,28.962,30 -18:33:10,570.1458,29.818,30.133,29.873,30 -18:33:10,570.1953,29.818,30.133,29.875,30 -18:33:10,570.2413,29.87,30.133,29.876,30 -18:33:10,570.2884,29.765,30.16,28.983,30 -18:33:10,570.3356,29.87,30.16,30.324,30 -18:33:10,570.3828,29.87,30.107,28.52,30 -18:33:10,570.4378,29.897,30.16,29.431,30 -18:33:10,570.4853,29.844,30.133,28.056,30 -18:33:10,570.5337,29.897,30.107,29.43,30 -18:33:10,570.5811,29.87,30.081,28.967,30 -18:33:10,570.6295,29.791,30.16,29.878,30 -18:33:10,570.6766,29.897,30.186,29.879,30 -18:33:10,570.7507,29.818,30.133,27.61,30 -18:33:10,570.8039,29.844,30.107,29.879,30 -18:33:10,570.8635,29.87,30.133,29.881,30 -18:33:10,570.9244,29.844,30.133,28.988,30 -18:33:10,570.9837,29.844,30.107,29.435,30 -18:33:10,571.0397,29.897,30.081,29.883,30 -18:33:10,571.0913,29.818,30.16,29.42,30 -18:33:11,571.1530,29.818,30.16,29.421,30 -18:33:11,571.2067,29.87,30.107,29.422,30 -18:33:11,571.2607,29.87,30.16,29.44,30 -18:33:11,571.3136,29.844,30.107,28.528,30 -18:33:11,571.3651,29.818,30.107,29.887,30 -18:33:11,571.4163,29.844,30.133,30.335,30 -18:33:11,571.4676,29.818,30.133,29.443,30 -18:33:11,571.5167,29.844,30.107,29.891,30 -18:33:11,571.5678,29.844,30.133,29.892,30 -18:33:11,571.6278,29.897,30.107,29.447,30 -18:33:11,571.6803,29.844,30.107,28.983,30 -18:33:11,571.7317,29.897,30.107,29.894,30 -18:33:11,571.7819,29.844,30.133,28.984,30 -18:33:11,571.8308,29.897,30.107,29.449,30 -18:33:11,571.8795,29.844,30.107,28.985,30 -18:33:11,571.9278,29.87,30.107,29.896,30 -18:33:11,571.9747,29.844,30.133,29.45,30 -18:33:11,572.0197,29.87,30.107,29.451,30 -18:33:11,572.0655,29.897,30.107,29.452,30 -18:33:12,572.1121,29.844,30.133,28.988,30 -18:33:12,572.1606,29.818,30.16,29.452,30 -18:33:12,572.2081,29.897,30.107,29.436,30 -18:33:12,572.2662,29.844,30.133,28.989,30 -18:33:12,572.3166,29.844,30.133,29.453,30 -18:33:12,572.3654,29.844,30.16,29.454,30 -18:33:12,572.4146,29.897,30.133,28.99,30 -18:33:12,572.4647,29.844,30.16,28.543,30 -18:33:12,572.5151,29.87,30.133,28.989,30 -18:33:12,572.5677,29.844,30.16,29.006,30 -18:33:12,572.6151,29.87,30.16,28.989,30 -18:33:12,572.6612,29.844,30.133,28.542,30 -18:33:12,572.7130,29.897,30.107,29.453,30 -18:33:12,572.7617,29.844,30.133,28.989,30 -18:33:12,572.8122,29.87,30.107,29.453,30 -18:33:12,572.8611,29.87,30.107,29.454,30 -18:33:12,572.9082,29.844,30.107,29.454,30 -18:33:12,572.9564,29.818,30.133,29.902,30 -18:33:12,573.0046,29.844,30.16,29.904,30 -18:33:12,573.0525,29.818,30.186,28.993,30 -18:33:13,573.0982,29.897,30.16,28.993,30 -18:33:13,573.1457,29.87,30.186,28.082,30 -18:33:13,573.1905,29.844,30.107,28.097,30 -18:33:13,573.2367,29.87,30.107,29.902,30 -18:33:13,573.2833,29.844,30.107,29.456,30 -18:33:13,573.3282,29.844,30.16,29.903,30 -18:33:13,573.3742,29.897,30.107,28.993,30 -18:33:13,573.4256,29.897,30.107,28.993,30 -18:33:13,573.4747,29.844,30.186,28.993,30 -18:33:13,573.5228,29.897,30.186,28.546,30 -18:33:13,573.5710,29.87,30.107,27.633,30 -18:33:13,573.6173,29.87,30.107,29.454,30 -18:33:13,573.6647,29.87,30.16,29.455,30 -18:33:13,573.7128,29.87,30.133,28.544,30 -18:33:13,573.7605,29.844,30.107,29.007,30 -18:33:13,573.8097,29.844,30.16,29.902,30 -18:33:13,573.8555,29.87,30.107,28.991,30 -18:33:13,573.9094,29.923,30.107,29.456,30 -18:33:13,573.9579,29.87,30.107,28.545,30 -18:33:13,574.0055,29.844,30.133,29.455,30 -18:33:13,574.0520,29.87,30.133,29.456,30 -18:33:14,574.0979,29.87,30.133,29.009,30 -18:33:14,574.1443,29.87,30.107,29.009,30 -18:33:14,574.1896,29.844,30.16,29.456,30 -18:33:14,574.2343,29.844,30.107,28.993,30 -18:33:14,574.2841,29.844,30.107,29.904,30 -18:33:14,574.3310,29.87,30.16,29.906,30 -18:33:14,574.3785,29.897,30.107,28.548,30 -18:33:14,574.4256,29.818,30.107,28.994,30 -18:33:14,574.4713,29.844,30.133,30.353,30 -18:33:14,574.5195,29.87,30.133,29.461,30 -18:33:14,574.5642,29.87,30.107,29.014,30 -18:33:14,574.6117,29.844,30.16,29.461,30 -18:33:14,574.6607,29.897,30.133,28.997,30 -18:33:14,574.7107,29.844,30.133,28.55,30 -18:33:14,574.7566,29.844,30.107,29.461,30 -18:33:14,574.8030,29.897,30.107,29.909,30 -18:33:14,574.8489,29.87,30.133,28.998,30 -18:33:14,574.8965,29.87,30.133,29.016,30 -18:33:14,574.9434,29.87,30.16,29.015,30 -18:33:14,574.9901,29.87,30.107,28.551,30 -18:33:14,575.0371,29.923,30.107,29.462,30 -18:33:14,575.0825,29.818,30.107,28.551,30 -18:33:15,575.1298,29.844,30.133,30.356,30 -18:33:15,575.1791,29.923,30.133,29.464,30 -18:33:15,575.2273,29.87,30.107,28.105,30 -18:33:15,575.2727,29.87,30.107,29.463,30 -18:33:15,575.3203,29.844,30.133,29.463,30 -18:33:15,575.3651,29.87,30.107,29.464,30 -18:33:15,575.4122,29.844,30.081,29.464,30 -18:33:15,575.4597,29.897,30.107,30.359,30 -18:33:15,575.5068,29.87,30.107,29.003,30 -18:33:15,575.5524,29.818,30.107,29.467,30 -18:33:15,575.5978,29.87,30.107,30.362,30 -18:33:15,575.6422,29.975,30.107,29.469,30 -18:33:15,575.6888,29.87,30.133,27.664,30 -18:33:15,575.7365,29.897,30.107,29.021,30 -18:33:15,575.7812,29.818,30.16,29.003,30 -18:33:15,575.8275,29.87,30.133,29.451,30 -18:33:15,575.8757,29.844,30.133,29.021,30 -18:33:15,575.9202,29.87,30.133,29.468,30 -18:33:15,575.9663,29.844,30.133,29.022,30 -18:33:15,576.0127,29.923,30.16,29.469,30 -18:33:15,576.0600,29.87,30.107,27.646,30 -18:33:16,576.1066,29.897,30.133,29.467,30 -18:33:16,576.1538,29.844,30.081,28.556,30 -18:33:16,576.2024,29.818,30.133,30.361,30 -18:33:16,576.2496,29.87,30.107,29.916,30 -18:33:16,576.2974,29.844,30.16,29.47,30 -18:33:16,576.3446,29.844,30.133,29.007,30 -18:33:16,576.3949,29.87,30.133,29.471,30 -18:33:16,576.4433,29.87,30.133,29.024,30 -18:33:16,576.4914,29.87,30.107,29.024,30 -18:33:16,576.5377,29.844,30.133,29.471,30 -18:33:16,576.5856,29.87,30.107,29.472,30 -18:33:16,576.6327,29.844,30.107,29.473,30 -18:33:16,576.6803,29.87,30.107,29.92,30 -18:33:16,576.7295,29.844,30.133,29.475,30 -18:33:16,576.7779,29.87,30.133,29.475,30 -18:33:16,576.8258,29.844,30.186,29.029,30 -18:33:16,576.8730,29.87,30.107,28.564,30 -18:33:16,576.9213,29.87,30.107,29.475,30 -18:33:16,576.9699,29.844,30.107,29.476,30 -18:33:16,577.0187,29.87,30.054,29.923,30 -18:33:16,577.0675,29.87,30.081,30.389,30 -18:33:17,577.1135,29.844,30.081,29.927,30 -18:33:17,577.1618,29.87,30.133,30.375,30 -18:33:17,577.2087,29.844,30.133,29.036,30 -18:33:17,577.2546,29.844,30.133,29.483,30 -18:33:17,577.3022,29.818,30.133,29.484,30 -18:33:17,577.3506,29.844,30.16,29.931,30 -18:33:17,577.4024,29.844,30.133,29.021,30 -18:33:17,577.4491,29.897,30.107,29.485,30 -18:33:17,577.4965,29.87,30.054,29.022,30 -18:33:17,577.5436,29.897,30.081,30.398,30 -18:33:17,577.5917,29.844,30.133,29.471,30 -18:33:17,577.6387,29.844,30.133,29.489,30 -18:33:17,577.6865,29.844,30.133,29.489,30 -18:33:17,577.7336,29.844,30.133,29.49,30 -18:33:17,577.7818,29.844,30.16,29.49,30 -18:33:17,577.8288,29.844,30.16,29.027,30 -18:33:17,577.8785,29.87,30.107,29.027,30 -18:33:17,577.9275,29.897,30.133,29.491,30 -18:33:17,577.9782,29.87,30.107,28.58,30 -18:33:17,578.0266,29.87,30.107,29.491,30 -18:33:17,578.0745,29.87,30.107,29.491,30 -18:33:18,578.1223,29.844,30.107,29.492,30 -18:33:18,578.1700,29.87,30.107,29.94,30 -18:33:18,578.2191,29.923,30.107,29.494,30 -18:33:18,578.2676,29.897,30.107,28.583,30 -18:33:18,578.3144,29.87,30.054,29.029,30 -18:33:18,578.3617,29.844,30.107,30.405,30 -18:33:18,578.4105,29.87,30.054,29.943,30 -18:33:18,578.4585,29.87,30.107,30.409,30 -18:33:18,578.5048,29.818,30.081,29.499,30 -18:33:18,578.5494,29.844,30.107,30.841,30 -18:33:18,578.5968,29.897,30.081,29.95,30 -18:33:18,578.6426,29.897,30.16,29.486,30 -18:33:18,578.6911,29.87,30.107,28.128,30 -18:33:18,578.7404,29.844,30.107,29.503,30 -18:33:18,578.8013,29.87,30.133,29.951,30 -18:33:18,578.8695,29.87,30.107,29.058,30 -18:33:18,578.9417,29.818,30.107,29.505,30 -18:33:18,579.0187,29.897,30.133,30.401,30 -18:33:18,579.0816,29.844,30.133,28.597,30 -18:33:19,579.1326,29.844,30.133,29.508,30 -18:33:19,579.1848,29.87,30.107,29.509,30 -18:33:19,579.2303,29.897,30.133,29.509,30 -18:33:19,579.2756,29.897,30.107,28.598,30 -18:33:19,579.3199,29.844,30.054,29.045,30 -18:33:19,579.3647,29.923,30.107,30.868,30 -18:33:19,579.4134,29.897,30.081,28.6,30 -18:33:19,579.4626,29.844,30.107,29.494,30 -18:33:19,579.5092,29.897,30.107,29.959,30 -18:33:19,579.5578,29.844,30.186,29.048,30 -18:33:19,579.6035,29.87,30.107,28.601,30 -18:33:19,579.6531,29.87,30.081,29.512,30 -18:33:19,579.6984,29.87,30.133,29.96,30 -18:33:19,579.7502,29.87,30.107,29.067,30 -18:33:19,579.7987,29.818,30.107,29.514,30 -18:33:19,579.8468,29.897,30.133,30.409,30 -18:33:19,579.8968,29.844,30.107,28.605,30 -18:33:19,579.9483,29.87,30.107,29.963,30 -18:33:19,580.0071,29.818,30.081,29.517,30 -18:33:19,580.0518,29.818,30.107,30.86,30 -18:33:20,580.1006,29.844,30.107,30.415,30 -18:33:20,580.1545,29.844,30.107,29.97,30 -18:33:20,580.2084,29.818,30.107,29.972,30 -18:33:20,580.2604,29.818,30.107,30.421,30 -18:33:20,580.3120,29.844,30.107,30.423,30 -18:33:20,580.3651,29.818,30.133,29.978,30 -18:33:20,580.4130,29.897,30.107,29.979,30 -18:33:20,580.4657,29.87,30.081,29.069,30 -18:33:20,580.5223,29.897,30.107,29.981,30 -18:33:20,580.5815,29.844,30.16,29.07,30 -18:33:20,580.6390,29.818,30.107,29.07,30 -18:33:20,580.7037,29.87,30.107,30.429,30 -18:33:20,580.7509,29.818,30.133,29.537,30 -18:33:20,580.7958,29.818,30.133,29.985,30 -18:33:20,580.8605,29.844,30.107,29.986,30 -18:33:20,580.9225,29.844,30.107,29.988,30 -18:33:20,580.9706,29.87,30.133,29.99,30 -18:33:20,581.0196,29.818,30.107,29.097,30 -18:33:20,581.0660,29.844,30.133,30.438,30 -18:33:21,581.1139,29.818,30.081,29.546,30 -18:33:21,581.1627,29.87,30.107,30.888,30 -18:33:21,581.2101,29.791,30.133,29.549,30 -18:33:21,581.2569,29.818,30.081,30.462,30 -18:33:21,581.3040,29.818,30.054,30.894,30 -18:33:21,581.3514,29.87,30.081,31.361,30 -18:33:21,581.4061,29.791,30.107,30.005,30 -18:33:21,581.4520,29.87,30.107,30.919,30 -18:33:21,581.4986,29.818,30.081,29.563,30 -18:33:21,581.5450,29.897,30.081,30.905,30 -18:33:21,581.5948,29.844,30.081,29.549,30 -18:33:21,581.6428,29.818,30.054,30.461,30 -18:33:21,581.6898,29.87,30.054,31.375,30 -18:33:21,581.7353,29.87,30.081,30.484,30 -18:33:21,581.7838,29.844,30.133,30.021,30 -18:33:21,581.8301,29.818,30.133,29.576,30 -18:33:21,581.8772,29.87,30.081,30.023,30 -18:33:21,581.9272,29.87,30.133,30.025,30 -18:33:21,581.9788,29.818,30.081,29.132,30 -18:33:21,582.0344,29.818,30.133,30.92,30 -18:33:21,582.0958,29.818,30.107,30.029,30 -18:33:22,582.1667,29.818,30.081,30.478,30 -18:33:22,582.2664,29.87,30.081,30.929,30 -18:33:22,582.3399,29.87,30.081,30.039,30 -18:33:22,582.3968,29.818,30.107,30.041,30 -18:33:22,582.4493,29.818,30.081,30.49,30 -18:33:22,582.4976,29.844,30.107,30.939,30 -18:33:22,582.5429,29.844,30.081,30.048,30 -18:33:22,582.5899,29.765,30.107,30.496,30 -18:33:22,582.6451,29.87,30.081,31.41,30 -18:33:22,582.6943,29.818,30.081,30.055,30 -18:33:22,582.7471,29.818,30.081,30.95,30 -18:33:22,582.8186,29.87,30.081,30.954,30 -18:33:22,582.8812,29.818,30.107,30.063,30 -18:33:22,582.9607,29.844,30.107,30.512,30 -18:33:22,583.0282,29.87,30.107,30.067,30 -18:33:22,583.0831,29.844,30.107,29.622,30 -18:33:23,583.1448,29.87,30.133,30.07,30 -18:33:23,583.2114,29.87,30.107,29.177,30 -18:33:23,583.3006,29.87,30.081,29.624,30 -18:33:23,583.3813,29.818,30.081,30.073,30 -18:33:23,583.4584,29.818,30.081,30.97,30 -18:33:23,583.5279,29.87,30.133,30.975,30 -18:33:23,583.6070,29.818,30.081,29.189,30 -18:33:23,583.6736,29.923,30.107,30.979,30 -18:33:23,583.7479,29.844,30.081,28.728,30 -18:33:23,583.7957,29.791,30.081,30.534,30 -18:33:23,583.8435,29.818,30.133,31.448,30 -18:33:23,583.8902,29.87,30.107,30.093,30 -18:33:23,583.9378,29.844,30.133,29.647,30 -18:33:23,583.9872,29.87,30.081,29.647,30 -18:33:23,584.0393,29.818,30.081,30.095,30 -18:33:24,584.1290,29.87,30.081,30.992,30 -18:33:24,584.1968,29.791,30.107,30.101,30 -18:33:24,584.2888,29.818,30.107,31.016,30 -18:33:24,584.3498,29.844,30.133,30.556,30 -18:33:24,584.4310,29.791,30.133,29.664,30 -18:33:24,584.5016,29.818,30.107,30.577,30 -18:33:24,584.5661,29.818,30.133,30.563,30 -18:33:24,584.6272,29.844,30.107,30.118,30 -18:33:24,584.7050,29.818,30.107,30.12,30 -18:33:24,584.7831,29.844,30.133,30.57,30 -18:33:24,584.8584,29.87,30.133,29.678,30 -18:33:24,584.9328,29.818,30.107,29.231,30 -18:33:24,585.0200,29.844,30.107,30.574,30 -18:33:24,585.0902,29.844,30.133,30.13,30 -18:33:25,585.1459,29.844,30.107,29.685,30 -18:33:25,585.2091,29.87,30.081,30.133,30 -18:33:25,585.2754,29.818,30.133,30.134,30 -18:33:25,585.3356,29.87,30.107,30.136,30 -18:33:25,585.3971,29.818,30.133,29.691,30 -18:33:25,585.4518,29.818,30.107,30.139,30 -18:33:25,585.5224,29.818,30.107,30.588,30 -18:33:25,585.5986,29.791,30.107,30.591,30 -18:33:25,585.6768,29.897,30.081,31.059,30 -18:33:25,585.7372,29.791,30.107,29.686,30 -18:33:25,585.8002,29.87,30.081,31.063,30 -18:33:25,585.9018,29.897,30.16,30.155,30 -18:33:25,585.9918,29.87,30.081,28.331,30 -18:33:25,586.0710,29.87,30.081,30.154,30 -18:33:26,586.1808,29.897,30.133,30.156,30 -18:33:26,586.3101,29.844,30.081,28.798,30 -18:33:26,586.4238,29.87,30.133,30.607,30 -18:33:26,586.5187,29.818,30.081,29.267,30 -18:33:26,586.6025,29.818,30.133,31.058,30 -18:33:26,586.6919,29.844,30.081,30.168,30 -18:33:26,586.7868,29.818,30.133,30.618,30 -18:33:26,586.8960,29.818,30.107,30.174,30 -18:33:26,586.9959,29.844,30.081,30.625,30 -18:33:26,587.0785,29.818,30.081,30.629,30 -18:33:27,587.1534,29.87,30.107,31.08,30 -18:33:27,587.2237,29.818,30.081,29.742,30 -18:33:27,587.2806,29.844,30.081,31.085,30 -18:33:27,587.3449,29.87,30.16,30.641,30 -18:33:27,587.4041,29.87,30.133,28.837,30 -18:33:27,587.4772,29.818,30.081,29.301,30 -18:33:27,587.5528,29.791,30.107,31.091,30 -18:33:27,587.6243,29.818,30.16,31.112,30 -18:33:27,587.7056,29.87,30.107,29.739,30 -18:33:27,587.7886,29.844,30.107,29.758,30 -18:33:27,587.8701,29.87,30.107,30.206,30 -18:33:27,587.9345,29.87,30.107,29.761,30 -18:33:27,588.0037,29.87,30.107,29.762,30 -18:33:27,588.0871,29.844,30.16,29.763,30 -18:33:28,588.1485,29.844,30.133,29.299,30 -18:33:28,588.2053,29.87,30.081,29.763,30 -18:33:28,588.2547,29.818,30.107,30.211,30 -18:33:28,588.3152,29.818,30.133,30.66,30 -18:33:28,588.3726,29.818,30.081,30.215,30 -18:33:28,588.4483,29.897,30.002,31.112,30 -18:33:28,588.5466,29.87,30.107,31.116,30 -18:33:28,588.6318,29.897,30.107,29.778,30 -18:33:28,588.6884,29.87,30.107,29.314,30 -18:33:28,588.7638,29.844,30.107,29.779,30 -18:33:28,588.8455,29.818,30.081,30.227,30 -18:33:28,588.9145,29.765,30.133,31.125,30 -18:33:28,588.9842,29.844,30.081,31.146,30 -18:33:28,589.0537,29.818,30.107,30.686,30 -18:33:29,589.1236,29.844,30.054,30.689,30 -18:33:29,589.1964,29.87,30.107,31.156,30 -18:33:29,589.2657,29.791,30.107,29.801,30 -18:33:29,589.3387,29.844,30.107,31.161,30 -18:33:29,589.4106,29.818,30.133,30.253,30 -18:33:29,589.4718,29.765,30.107,30.255,30 -18:33:29,589.5400,29.791,30.081,31.616,30 -18:33:29,589.6142,29.897,30.107,31.621,30 -18:33:29,589.6890,29.818,30.081,29.354,30 -18:33:29,589.7756,29.897,30.107,31.162,30 -18:33:29,589.8512,29.844,30.16,29.359,30 -18:33:29,589.9094,29.844,30.16,29.358,30 -18:33:29,589.9604,29.844,30.107,29.358,30 -18:33:29,590.0125,29.844,30.081,30.27,30 -18:33:29,590.0596,29.897,30.107,30.718,30 -18:33:30,590.1118,29.844,30.081,29.362,30 -18:33:30,590.1599,29.844,30.16,30.721,30 -18:33:30,590.2121,29.897,30.107,29.364,30 -18:33:30,590.2582,29.818,30.16,29.364,30 -18:33:30,590.3125,29.844,30.133,29.811,30 -18:33:30,590.3615,29.87,30.107,29.829,30 -18:33:30,590.4191,29.87,30.081,29.829,30 -18:33:30,590.4793,29.844,30.107,30.277,30 -18:33:30,590.5432,29.897,30.133,30.279,30 -18:33:30,590.6155,29.897,30.081,28.922,30 -18:33:30,590.6963,29.844,30.16,29.815,30 -18:33:30,590.7665,29.818,30.133,29.369,30 -18:33:30,590.8344,29.87,30.107,30.281,30 -18:33:30,590.9103,29.87,30.16,29.835,30 -18:33:30,590.9925,29.87,30.133,28.924,30 -18:33:30,591.0621,29.844,30.081,29.387,30 -18:33:31,591.1464,29.844,30.133,30.73,30 -18:33:31,591.2365,29.897,30.107,29.838,30 -18:33:31,591.3182,29.818,30.107,29.374,30 -18:33:31,591.4210,29.818,30.133,30.734,30 -18:33:31,591.4905,29.844,30.081,30.29,30 -18:33:31,591.5625,29.923,30.107,30.74,30 -18:33:31,591.6228,29.818,30.133,28.936,30 -18:33:31,591.6736,29.87,30.16,30.294,30 -18:33:31,591.7300,29.87,30.081,28.936,30 -18:33:31,591.7831,29.818,30.107,30.295,30 -18:33:31,591.8407,29.87,30.081,30.743,30 -18:33:31,591.8920,29.87,30.054,30.299,30 -18:33:31,591.9436,29.818,30.081,30.764,30 -18:33:31,591.9929,29.844,30.107,31.197,30 -18:33:31,592.0943,29.818,30.107,30.305,30 -18:33:32,592.1680,29.818,30.081,30.756,30 -18:33:32,592.2258,29.87,30.107,31.207,30 -18:33:32,592.2876,29.818,30.107,29.868,30 -18:33:32,592.3588,29.818,30.107,30.764,30 -18:33:32,592.4321,29.818,30.081,30.767,30 -18:33:32,592.4947,29.87,30.16,31.217,30 -18:33:32,592.5639,29.791,30.107,28.967,30 -18:33:32,592.6358,29.844,30.133,31.237,30 -18:33:32,592.7069,29.844,30.081,29.882,30 -18:33:32,592.7739,29.87,30.107,30.778,30 -18:33:32,592.8292,29.844,30.107,29.886,30 -18:33:32,592.8823,29.818,30.107,30.334,30 -18:33:32,592.9467,29.844,30.133,30.782,30 -18:33:32,593.0103,29.818,30.133,29.89,30 -18:33:32,593.0634,29.818,30.133,30.338,30 -18:33:33,593.1155,29.818,30.133,30.34,30 -18:33:33,593.1627,29.844,30.081,30.341,30 -18:33:33,593.2111,29.897,30.107,30.79,30 -18:33:33,593.2648,29.844,30.133,29.433,30 -18:33:33,593.3367,29.791,30.133,29.898,30 -18:33:33,593.4153,29.87,30.081,30.811,30 -18:33:33,593.4899,29.87,30.133,30.349,30 -18:33:33,593.5715,29.87,30.081,29.456,30 -18:33:33,593.6381,29.844,30.107,30.351,30 -18:33:33,593.6933,29.844,30.081,30.353,30 -18:33:33,593.7419,29.818,30.133,30.802,30 -18:33:33,593.7938,29.87,30.107,30.357,30 -18:33:33,593.8445,29.87,30.081,29.911,30 -18:33:33,593.8933,29.897,30.133,30.359,30 -18:33:33,593.9445,29.818,30.133,29.002,30 -18:33:33,594.0144,29.818,30.186,30.36,30 -18:33:33,594.0904,29.818,30.107,29.449,30 -18:33:34,594.1637,29.897,30.107,30.809,30 -18:33:34,594.2350,29.844,30.186,29.453,30 -18:33:34,594.3024,29.818,30.133,29.005,30 -18:33:34,594.3659,29.791,30.081,30.363,30 -18:33:34,594.4294,29.818,30.081,31.725,30 -18:33:34,594.4879,29.87,30.133,31.265,30 -18:33:34,594.5405,29.818,30.16,29.479,30 -18:33:34,594.5904,29.791,30.133,29.909,30 -18:33:34,594.6388,29.844,30.133,30.838,30 -18:33:34,594.6836,29.87,30.107,29.929,30 -18:33:34,594.7264,29.791,30.133,29.929,30 -18:33:34,594.7692,29.818,30.081,30.841,30 -18:33:34,594.8133,29.87,30.107,31.273,30 -18:33:34,594.8584,29.818,30.107,29.934,30 -18:33:34,594.9056,29.923,30.107,30.829,30 -18:33:34,594.9505,29.87,30.133,29.025,30 -18:33:34,594.9953,29.844,30.133,29.489,30 -18:33:34,595.0378,29.818,30.081,29.936,30 -18:33:34,595.0825,29.818,30.107,31.278,30 -18:33:35,595.1276,29.818,30.133,30.833,30 -18:33:35,595.1727,29.818,30.133,30.388,30 -18:33:35,595.2257,29.818,30.107,30.389,30 -18:33:35,595.2715,29.844,30.133,30.838,30 -18:33:35,595.3153,29.818,30.16,29.945,30 -18:33:35,595.3594,29.818,30.16,29.929,30 -18:33:35,595.4056,29.818,30.107,29.929,30 -18:33:35,595.4511,29.87,30.107,30.842,30 -18:33:35,595.4964,29.87,30.133,29.949,30 -18:33:35,595.5403,29.844,30.16,29.503,30 -18:33:35,595.5860,29.818,30.107,29.485,30 -18:33:35,595.6306,29.844,30.107,30.844,30 -18:33:35,595.6771,29.818,30.133,30.399,30 -18:33:35,595.7216,29.818,30.081,30.4,30 -18:33:35,595.7702,29.897,30.133,31.296,30 -18:33:35,595.8205,29.844,30.133,29.045,30 -18:33:35,595.8831,29.818,30.107,29.956,30 -18:33:35,595.9613,29.844,30.107,30.852,30 -18:33:35,596.0430,29.844,30.107,30.407,30 -18:33:36,596.1202,29.739,30.133,30.41,30 -18:33:36,596.2100,29.87,30.081,31.772,30 -18:33:36,596.2995,29.818,30.133,30.418,30 -18:33:36,596.3783,29.818,30.081,30.42,30 -18:33:36,596.4529,29.791,30.107,31.318,30 -18:33:36,596.5249,29.844,30.133,31.339,30 -18:33:36,596.6004,29.818,30.133,29.984,30 -18:33:36,596.6708,29.87,30.107,30.432,30 -18:33:36,596.7369,29.87,30.081,29.987,30 -18:33:36,596.8090,29.844,30.107,30.435,30 -18:33:36,596.8817,29.897,30.133,30.437,30 -18:33:36,596.9551,29.791,30.107,29.079,30 -18:33:36,597.0288,29.818,30.16,31.351,30 -18:33:37,597.0989,29.818,30.107,29.978,30 -18:33:37,597.1676,29.818,30.054,30.891,30 -18:33:37,597.2382,29.818,30.133,31.806,30 -18:33:37,597.3161,29.818,30.081,30.451,30 -18:33:37,597.3838,29.818,30.107,31.349,30 -18:33:37,597.4564,29.844,30.133,30.905,30 -18:33:37,597.5342,29.818,30.133,30.013,30 -18:33:37,597.6078,29.844,30.081,30.462,30 -18:33:37,597.6807,29.87,30.107,30.911,30 -18:33:37,597.7455,29.87,30.133,30.019,30 -18:33:37,597.8132,29.818,30.107,29.573,30 -18:33:37,597.8801,29.844,30.081,30.915,30 -18:33:37,597.9476,29.897,30.081,30.918,30 -18:33:37,597.9982,29.844,30.081,30.009,30 -18:33:37,598.0431,29.897,30.107,30.921,30 -18:33:37,598.0871,29.87,30.107,29.564,30 -18:33:38,598.1317,29.818,30.107,30.028,30 -18:33:38,598.1773,29.923,30.133,30.923,30 -18:33:38,598.2294,29.844,30.133,28.672,30 -18:33:38,598.2768,29.87,30.107,30.029,30 -18:33:38,598.3227,29.818,30.133,30.03,30 -18:33:38,598.3708,29.844,30.107,30.478,30 -18:33:38,598.4188,29.87,30.107,30.479,30 -18:33:38,598.4813,29.818,30.133,30.033,30 -18:33:38,598.5476,29.818,30.133,30.482,30 -18:33:38,598.6190,29.844,30.081,30.483,30 -18:33:38,598.6922,29.818,30.133,30.933,30 -18:33:38,598.7684,29.844,30.081,30.489,30 -18:33:38,598.8365,29.844,30.133,30.938,30 -18:33:38,598.9235,29.818,30.081,30.046,30 -18:33:38,598.9878,29.818,30.133,31.39,30 -18:33:38,599.0546,29.844,30.107,30.499,30 -18:33:39,599.1176,29.87,30.107,30.501,30 -18:33:39,599.1716,29.791,30.133,30.055,30 -18:33:39,599.2157,29.844,30.133,30.968,30 -18:33:39,599.2606,29.87,30.107,30.058,30 -18:33:39,599.3059,29.818,30.133,30.059,30 -18:33:39,599.3540,29.87,30.054,30.507,30 -18:33:39,599.4033,29.87,30.107,30.972,30 -18:33:39,599.4585,29.791,30.107,30.063,30 -18:33:39,599.5083,29.818,30.133,31.423,30 -18:33:39,599.5542,29.87,30.107,30.514,30 -18:33:39,599.6004,29.87,30.081,30.068,30 -18:33:39,599.6488,29.844,30.081,30.516,30 -18:33:39,599.6968,29.818,30.107,30.964,30 -18:33:39,599.7541,29.87,30.081,30.966,30 -18:33:39,599.8056,29.791,30.133,30.522,30 -18:33:39,599.8498,29.87,30.107,30.987,30 -18:33:39,599.8974,29.87,30.107,30.078,30 -18:33:39,599.9650,29.844,30.107,30.079,30 -18:33:39,600.0185,29.818,30.133,30.527,30 -18:33:39,600.0670,29.818,30.16,30.528,30 -18:33:40,600.1159,29.897,30.081,30.065,30 -18:33:40,600.1642,29.87,30.107,30.066,30 -18:33:40,600.2119,29.818,30.107,30.084,30 -18:33:40,600.2586,29.818,30.133,30.979,30 -18:33:40,600.3043,29.87,30.107,30.534,30 -18:33:40,600.3518,29.844,30.107,30.088,30 -18:33:40,600.4007,29.87,30.054,30.536,30 -18:33:40,600.4493,29.818,30.133,31.001,30 -18:33:40,600.4969,29.897,30.107,30.539,30 -18:33:40,600.5501,29.818,30.107,29.629,30 -18:33:40,600.6135,29.818,30.081,30.988,30 -18:33:40,600.6624,29.844,30.107,31.438,30 -18:33:40,600.7147,29.844,30.133,30.546,30 -18:33:40,600.7656,29.844,30.081,30.1,30 -18:33:40,600.8113,29.818,30.107,30.996,30 -18:33:40,600.8629,29.844,30.107,30.997,30 -18:33:40,600.9174,29.897,30.107,30.552,30 -18:33:40,600.9659,29.844,30.081,29.642,30 -18:33:40,601.0118,29.87,30.16,31.001,30 -18:33:40,601.0579,29.844,30.107,29.197,30 -18:33:41,601.1037,29.87,30.133,30.555,30 -18:33:41,601.1657,29.844,30.133,29.662,30 -18:33:41,601.2257,29.949,30.107,30.109,30 -18:33:41,601.2805,29.87,30.107,28.751,30 -18:33:41,601.3274,29.765,30.16,30.108,30 -18:33:41,601.3871,29.818,30.107,31.003,30 -18:33:41,601.4850,29.87,30.081,31.006,30 -18:33:41,601.5714,29.818,30.107,30.562,30 -18:33:41,601.6650,29.844,30.16,31.012,30 -18:33:41,601.7807,29.87,30.107,29.655,30 -18:33:41,601.8754,29.87,30.107,30.12,30 -18:33:41,601.9501,29.87,30.133,30.122,30 -18:33:41,602.0168,29.87,30.107,29.675,30 -18:33:41,602.0795,29.923,30.107,30.122,30 -18:33:42,602.1516,29.923,30.081,29.211,30 -18:33:42,602.2157,29.791,30.133,29.657,30 -18:33:42,602.2700,29.844,30.107,31.034,30 -18:33:42,602.3196,29.791,30.133,30.572,30 -18:33:42,602.3670,29.844,30.133,31.037,30 -18:33:42,602.4216,29.844,30.107,30.128,30 -18:33:42,602.4714,29.791,30.133,30.576,30 -18:33:42,602.5223,29.818,30.133,31.042,30 -18:33:42,602.5713,29.818,30.107,30.58,30 -18:33:42,602.6205,29.818,30.107,31.028,30 -18:33:42,602.6687,29.897,30.107,31.03,30 -18:33:42,602.7391,29.818,30.133,29.673,30 -18:33:42,602.7874,29.844,30.133,30.586,30 -18:33:42,602.8399,29.818,30.16,30.14,30 -18:33:42,602.8886,29.844,30.16,30.123,30 -18:33:42,602.9363,29.87,30.081,29.677,30 -18:33:42,602.9855,29.844,30.107,30.588,30 -