diff --git a/.envrc b/.envrc new file mode 100644 index 000000000..c98b77264 --- /dev/null +++ b/.envrc @@ -0,0 +1,4 @@ +use nix +watch_file flake.nix flake.lock shell.nix +watch_file nixos/pkgs/uv-python.nix +watch_file python/pyproject.toml python/uv.lock diff --git a/.github/scripts/publish_manifest.sh b/.github/scripts/publish_manifest.sh old mode 100644 new mode 100755 diff --git a/.github/scripts/update_manifest.py b/.github/scripts/update_manifest.py index fd8dd3a26..0ad72e5ba 100644 --- a/.github/scripts/update_manifest.py +++ b/.github/scripts/update_manifest.py @@ -4,11 +4,19 @@ import argparse import json import re +import urllib.error +import urllib.request from datetime import datetime, timezone from pathlib import Path STORE_PATH_RE = re.compile(r"^/nix/store/[a-z0-9]+-[A-Za-z0-9._+=?,-]+$") + +# The binary caches devices resolve upgrades from. A build is only advertised +# as available once one of these actually serves its narinfo — see set_available. +DEV_CACHE = "https://cache.pifinder.eu/pifinder" +RELEASE_CACHE = "https://cache.pifinder.eu/pifinder-release" +DEFAULT_CACHES = (DEV_CACHE, RELEASE_CACHE) EMPTY_MANIFEST = { "schema": 1, "generated_at": None, @@ -49,19 +57,63 @@ def valid_store_path(value: str | None) -> bool: return isinstance(value, str) and STORE_PATH_RE.fullmatch(value) is not None -def set_available(entry: dict) -> dict: - if valid_store_path(entry.get("store_path")): - entry["available"] = True - entry.pop("reason", None) - else: +def _narinfo_url(store_path: str, cache: str) -> str: + digest = Path(store_path).name.split("-", 1)[0] + return f"{cache.rstrip('/')}/{digest}.narinfo" + + +def cache_serves(store_path: str, caches, timeout: int = 15) -> bool | None: + """Whether the closure is actually downloadable from a cache right now. + + Returns True if any cache serves the narinfo (200); False only if every + cache answered and none had it (a real 404 everywhere); None if a cache + could not be reached, so presence is unknown. Publishing treats anything + other than True as "do not advertise", so a failed push or a down cache can + never advertise a build the device cannot fetch. + """ + saw_404 = False + for cache in caches: + url = _narinfo_url(store_path, cache) + try: + with urllib.request.urlopen(url, timeout=timeout) as resp: + if resp.status == 200: + return True + except urllib.error.HTTPError as exc: + if exc.code == 404: + saw_404 = True + else: + return None + except (urllib.error.URLError, OSError, TimeoutError): + return None + return False if saw_404 else None + + +def set_available(entry: dict, caches=DEFAULT_CACHES, verify: bool = True) -> dict: + store_path = entry.get("store_path") + if not valid_store_path(store_path): entry["store_path"] = None entry["available"] = False entry.setdefault("reason", "no build") + return entry + + if verify: + present = cache_serves(store_path, caches) + if present is not True: + entry["available"] = False + entry["reason"] = "not in cache" if present is False else "cache unreachable" + return entry + + entry["available"] = True + entry.pop("reason", None) return entry def replace_entry(entries: list[dict], predicate, entry: dict) -> list[dict]: - return [item for item in entries if not predicate(item)] + [entry] + # Newest first: consumers (release channels in the update UI, and the + # migration target lookup) take the head of the list as the current entry. + # The unstable channel is re-sorted after this, so prepending is neutral + # there. + return [entry] + [item for item in entries if not predicate(item)] def sort_unstable(entries: list[dict]) -> list[dict]: @@ -75,11 +127,17 @@ def key(item: dict) -> tuple[int, int, str]: return sorted(entries, key=key) +def resolve_verify(args: argparse.Namespace) -> tuple[tuple[str, ...], bool]: + caches = tuple(args.verify_cache) if args.verify_cache else DEFAULT_CACHES + return caches, not args.skip_cache_check + + def update_build(args: argparse.Namespace) -> None: manifest = load_manifest(args.manifest) channels = manifest["channels"] store_path = args.store_path or None short_sha = (args.head_sha or args.sha)[:7] + caches, verify = resolve_verify(args) if args.pr_number: number = int(args.pr_number) @@ -96,7 +154,7 @@ def update_build(args: argparse.Namespace) -> None: "store_path": store_path, "built_at": now_iso(), } - set_available(entry) + set_available(entry, caches, verify) channels["unstable"] = replace_entry( channels["unstable"], lambda item: item.get("kind") == "pr" @@ -116,7 +174,7 @@ def update_build(args: argparse.Namespace) -> None: "store_path": store_path, "built_at": now_iso(), } - set_available(entry) + set_available(entry, caches, verify) channels["unstable"] = replace_entry( channels["unstable"], lambda item: item.get("kind") == "trunk" @@ -131,6 +189,7 @@ def update_build(args: argparse.Namespace) -> None: def update_release(args: argparse.Namespace) -> None: manifest = load_manifest(args.manifest) + caches, verify = resolve_verify(args) channel = "beta" if args.release_type == "beta" else "stable" entry = { "kind": "release", @@ -142,9 +201,11 @@ def update_release(args: argparse.Namespace) -> None: "source_sha": args.sha, "version": args.version, "store_path": args.store_path or None, + "migration_url": args.migration_url or None, + "migration_sha256_url": args.migration_sha256_url or None, "built_at": now_iso(), } - set_available(entry) + set_available(entry, caches, verify) manifest["channels"][channel] = replace_entry( manifest["channels"][channel], lambda item: item.get("kind") == "release" and item.get("label") == args.tag, @@ -153,6 +214,17 @@ def update_release(args: argparse.Namespace) -> None: save_manifest(args.manifest, manifest) +def add_cache_args(sub: argparse.ArgumentParser) -> None: + # A build is advertised as available only if one of these caches actually + # serves its narinfo. Repeatable; defaults to the dev + release caches. + sub.add_argument("--verify-cache", action="append", metavar="URL") + sub.add_argument( + "--skip-cache-check", + action="store_true", + help="advertise on store-path syntax alone (tests / offline only)", + ) + + def parser() -> argparse.ArgumentParser: root = argparse.ArgumentParser() sub = root.add_subparsers(dest="command", required=True) @@ -170,6 +242,7 @@ def parser() -> argparse.ArgumentParser: build.add_argument("--head-repo") build.add_argument("--head-ref") build.add_argument("--head-sha") + add_cache_args(build) build.set_defaults(func=update_build) release = sub.add_parser("release") @@ -180,8 +253,11 @@ def parser() -> argparse.ArgumentParser: release.add_argument("--version", required=True) release.add_argument("--release-type", choices=("stable", "beta"), required=True) release.add_argument("--store-path", required=True) + release.add_argument("--migration-url") + release.add_argument("--migration-sha256-url") release.add_argument("--title") release.add_argument("--notes") + add_cache_args(release) release.set_defaults(func=update_release) return root diff --git a/.github/workflows/nixos-pr-build.yml b/.github/workflows/nixos-pr-build.yml index 19e74b444..9dba10198 100644 --- a/.github/workflows/nixos-pr-build.yml +++ b/.github/workflows/nixos-pr-build.yml @@ -7,9 +7,17 @@ name: Build PiFinder NixOS (testable PRs) # the real ATTIC_TOKEN and a read-write GITHUB_TOKEN even for fork PRs. The # contributor's code is checked out explicitly (head SHA) and built. This is # only reached after a maintainer applies the `testable` (or `preview`) label — -# that label is the security boundary: it runs contributor code on the -# self-hosted aarch64 runner with the cache push token, so review the diff -# before labeling, and re-review on each new push to a labeled PR. +# that label is the security boundary: it runs contributor code with the cache +# push token, so review the diff before labeling, and re-review on each new push +# to a labeled PR. +# +# Build strategy: the free GitHub-hosted ubuntu-24.04-arm runner builds first. +# Its cores are faster than the Pi5, and the Attic cache (cache.pifinder.eu) is +# a substituter, so anything already built — including the patched kernel once +# it has been built once — is downloaded, not recompiled. Each successful build +# is pushed back to Attic, so the first build after a kernel/source change is +# the only slow one; every build after it is fast. The self-hosted Pi5 is a +# last-resort fallback that only runs if the hosted build fails. on: pull_request_target: types: [labeled, synchronize, opened] @@ -23,15 +31,16 @@ permissions: actions: read jobs: - # Try the Pi5 native aarch64 runner first (fast). - build-native: + # Primary: free GitHub-hosted arm64 runner (native aarch64, no QEMU). + build-hosted: if: | contains(github.event.pull_request.labels.*.name, 'preview') || contains(github.event.pull_request.labels.*.name, 'testable') - runs-on: [self-hosted, aarch64] - timeout-minutes: 30 + runs-on: ubuntu-24.04-arm + # Generous: only a kernel/source change compiles from scratch (~1 h on this + # 4-core runner); everything else substitutes from Attic in minutes. + timeout-minutes: 150 outputs: - success: ${{ steps.build.outcome == 'success' }} store_path: ${{ steps.push.outputs.store_path }} steps: # Build the contributor's code. persist-credentials:false so the @@ -42,70 +51,61 @@ jobs: repository: ${{ github.event.pull_request.head.repo.full_name }} persist-credentials: false - - name: Ensure nix is on PATH (self-hosted runner) - run: | - echo "/nix/var/nix/profiles/default/bin" >> "$GITHUB_PATH" - echo "$HOME/.nix-profile/bin" >> "$GITHUB_PATH" + - uses: DeterminateSystems/nix-installer-action@main + with: + determinate: false + extra-conf: | + extra-system-features = big-parallel + extra-substituters = https://cache.pifinder.eu/pifinder + extra-trusted-public-keys = pifinder:8UU/O3oLkaJHHUyqEcPGl+9F1m4MqDca39Ewl49jBmE= - - name: Setup Attic substituter (cache.pifinder.eu) + - name: Attic login for push env: ATTIC_TOKEN: ${{ secrets.ATTIC_TOKEN }} run: | + if [ -z "$ATTIC_TOKEN" ]; then + echo "No ATTIC_TOKEN — pull-only via the public substituter" + exit 0 + fi nix profile install nixpkgs#attic-client attic login pifinder https://cache.pifinder.eu "$ATTIC_TOKEN" attic use pifinder:pifinder - - name: Build NixOS system closure - id: build + - name: Build NixOS system and on-device dev shell closures run: | nix build .#nixosConfigurations.pifinder.config.system.build.toplevel \ -L --no-link + nix build .#devShells.aarch64-linux.default -L --no-link - name: Push to Attic id: push + env: + ATTIC_TOKEN: ${{ secrets.ATTIC_TOKEN }} run: | STORE_PATH=$(nix build .#nixosConfigurations.pifinder.config.system.build.toplevel \ --json | jq -r '.[].outputs.out') - attic push pifinder:pifinder "$STORE_PATH" + DEV_SHELL_PATH=$(nix build .#devShells.aarch64-linux.default \ + --json | jq -r '.[].outputs.out') echo "store_path=$STORE_PATH" >> "$GITHUB_OUTPUT" + if [ -n "$ATTIC_TOKEN" ]; then + attic push pifinder:pifinder "$STORE_PATH" + attic push pifinder:pifinder "$DEV_SHELL_PATH" + else + echo "No ATTIC_TOKEN — skipping push; build is verify-only" + fi - # Wait up to ~15 min for the native builder, then decide on the hosted fallback. - native-wait: + # Last-resort fallback: self-hosted Pi5. Only runs if the hosted build failed + # (e.g. hosted-runner outage or capacity). The Pi5 is slow for a from-scratch + # kernel, hence the longer timeout. + build-pi5: + needs: build-hosted if: | - contains(github.event.pull_request.labels.*.name, 'preview') || - contains(github.event.pull_request.labels.*.name, 'testable') - runs-on: ubuntu-latest - timeout-minutes: 20 - outputs: - need_emulated: ${{ steps.wait.outputs.need_emulated }} - steps: - - name: Wait for native build - id: wait - env: - GH_TOKEN: ${{ github.token }} - run: | - for i in $(seq 1 30); do - sleep 30 - RESULT=$(gh api "repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/jobs" \ - --jq '.jobs[] | select(.name == "build-native") | .conclusion // "pending"' 2>/dev/null || echo "pending") - echo "Check $i/30: build-native=$RESULT" - if [ "$RESULT" = "success" ]; then - echo "need_emulated=false" >> "$GITHUB_OUTPUT" - exit 0 - elif [ "$RESULT" = "failure" ] || [ "$RESULT" = "cancelled" ]; then - echo "need_emulated=true" >> "$GITHUB_OUTPUT" - exit 0 - fi - done - echo "Native build not done after 15 min, falling back to emulated" - echo "need_emulated=true" >> "$GITHUB_OUTPUT" - - # Fallback on a free hosted arm64 runner (native aarch64, no QEMU). - build-emulated: - needs: native-wait - if: needs.native-wait.outputs.need_emulated == 'true' - runs-on: ubuntu-24.04-arm - timeout-minutes: 60 + always() && + (contains(github.event.pull_request.labels.*.name, 'preview') || + contains(github.event.pull_request.labels.*.name, 'testable')) && + needs.build-hosted.result == 'failure' + runs-on: [self-hosted, aarch64] + timeout-minutes: 240 outputs: store_path: ${{ steps.push.outputs.store_path }} steps: @@ -115,53 +115,44 @@ jobs: repository: ${{ github.event.pull_request.head.repo.full_name }} persist-credentials: false - - uses: DeterminateSystems/nix-installer-action@main - with: - determinate: false - extra-conf: | - extra-system-features = big-parallel - extra-substituters = https://cache.pifinder.eu/pifinder - extra-trusted-public-keys = pifinder:8UU/O3oLkaJHHUyqEcPGl+9F1m4MqDca39Ewl49jBmE= + - name: Ensure nix is on PATH (self-hosted runner) + run: | + echo "/nix/var/nix/profiles/default/bin" >> "$GITHUB_PATH" + echo "$HOME/.nix-profile/bin" >> "$GITHUB_PATH" - - name: Attic login for push + - name: Setup Attic substituter (cache.pifinder.eu) env: ATTIC_TOKEN: ${{ secrets.ATTIC_TOKEN }} run: | - if [ -z "$ATTIC_TOKEN" ]; then - echo "No ATTIC_TOKEN — pull-only via the public substituter" - exit 0 - fi nix profile install nixpkgs#attic-client attic login pifinder https://cache.pifinder.eu "$ATTIC_TOKEN" attic use pifinder:pifinder - - name: Build NixOS system closure + - name: Build NixOS system and on-device dev shell closures run: | nix build .#nixosConfigurations.pifinder.config.system.build.toplevel \ -L --no-link + nix build .#devShells.aarch64-linux.default -L --no-link - name: Push to Attic id: push - env: - ATTIC_TOKEN: ${{ secrets.ATTIC_TOKEN }} run: | STORE_PATH=$(nix build .#nixosConfigurations.pifinder.config.system.build.toplevel \ --json | jq -r '.[].outputs.out') + DEV_SHELL_PATH=$(nix build .#devShells.aarch64-linux.default \ + --json | jq -r '.[].outputs.out') + attic push pifinder:pifinder "$STORE_PATH" + attic push pifinder:pifinder "$DEV_SHELL_PATH" echo "store_path=$STORE_PATH" >> "$GITHUB_OUTPUT" - if [ -n "$ATTIC_TOKEN" ]; then - attic push pifinder:pifinder "$STORE_PATH" - else - echo "No ATTIC_TOKEN — skipping push; build is verify-only" - fi # Stamp the PR's build into the metadata-only nixos-manifest branch. Runs the # TRUSTED scripts from the base branch (default checkout), never the fork's, # since this step holds the write token. update-manifest: - needs: [build-native, build-emulated] + needs: [build-hosted, build-pi5] if: | always() && - (needs.build-native.result == 'success' || needs.build-emulated.result == 'success') + (needs.build-hosted.result == 'success' || needs.build-pi5.result == 'success') runs-on: ubuntu-latest permissions: contents: write @@ -169,11 +160,21 @@ jobs: group: manifest-write cancel-in-progress: false steps: + # Check out the PR's BASE branch explicitly. The default checkout under + # pull_request_target lands on the repository's default branch, which + # carries this workflow (so the event fires) but not necessarily the + # scripts below -- the job then dies with "No such file or directory" + # after a successful 19-minute build. The base branch is the branch this + # workflow file itself came from, so it always has them, and it is + # maintainer-controlled: never check out the PR head here, which would + # run contributor code with contents:write and the Attic token. - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.base.ref }} - name: Update generated manifest branch env: - STORE_PATH: ${{ needs.build-native.outputs.store_path || needs.build-emulated.outputs.store_path }} + STORE_PATH: ${{ needs.build-hosted.outputs.store_path || needs.build-pi5.outputs.store_path }} GH_REPOSITORY: ${{ github.repository }} run: | set -euo pipefail diff --git a/.github/workflows/nox.yml b/.github/workflows/nox.yml index ab38d5621..0eb274e5b 100644 --- a/.github/workflows/nox.yml +++ b/.github/workflows/nox.yml @@ -1,4 +1,9 @@ name: nox +# The nixos branch manages the Python environment with uv (pyproject.toml + +# uv.lock) instead of nox + requirements*.txt, so this runs the same checks +# (ruff, mypy, pytest) through uv. The workflow keeps upstream's "nox" name so +# PR check wiring stays identical across branches. +# # Run on pushes to the long-lived branches and on pull requests. Restricting # `push` to main/release means a push to a feature branch with an open PR only # triggers the `pull_request` run (not also a `push` run), so a PR gets a single @@ -18,9 +23,21 @@ jobs: working-directory: ./python steps: - uses: actions/checkout@v4 + - uses: astral-sh/setup-uv@v5 with: - submodules: true - - uses: wntrblm/nox@2024.04.15 - with: - python-versions: "3.9" - - run: nox -s lint format type_hints smoke_tests unit_tests ui_tests + enable-cache: true + # Same ruff pin as upstream main's noxfile, so shared files keep one style. + - name: Lint + run: uvx ruff@0.4.8 check --config "builtins=['_']" . + - name: Format check + run: uvx ruff@0.4.8 format --check . + - name: Sync environment + run: uv sync --frozen + - name: Type check + run: uv run mypy PiFinder + - name: Smoke tests + run: uv run pytest -m smoke + - name: Unit tests + run: uv run pytest -m unit + - name: UI module tests + run: uv run pytest -m integration tests/test_ui_modules.py diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..d2afc1597 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,387 @@ +name: Release NixOS image + +# Builds the PiFinder NixOS SD image and migration tarball and publishes them as +# a GitHub (pre-)release, and records the closure in the nixos-manifest branch. +# +# Runners are native aarch64 (no QEMU): the Pi5 self-hosted runner is tried +# first, with the free GitHub-hosted `ubuntu-24.04-arm` runner as a fallback if +# the Pi is offline/slow — mirroring nixos-pr-build.yml. The arch-sensitive +# `nix build` runs there; the image is handed off as an artifact and the +# arch-independent packaging + publishing happens on ubuntu-latest. +on: + workflow_dispatch: + inputs: + version: + description: 'Version (e.g., 2.5.0)' + required: true + notes: + description: 'Release notes' + required: true + type: + description: 'Release type' + type: choice + options: + - stable + - beta + default: stable + source_branch: + description: 'Source branch (default: main, use release/X.Y for hotfixes)' + required: false + default: 'main' + source_repository: + description: 'Source repo to build (blank = this repo; e.g. mrosseel/PiFinder to build a fork)' + required: false + default: '' + +jobs: + # Native aarch64 build on the Pi5 self-hosted runner (preferred, fast). + build-native: + runs-on: [self-hosted, aarch64] + timeout-minutes: 90 + outputs: + store_path: ${{ steps.push.outputs.store_path }} + source_sha: ${{ steps.sha.outputs.source_sha }} + steps: + - uses: actions/checkout@v4 + with: + repository: ${{ inputs.source_repository || github.repository }} + ref: ${{ inputs.source_branch }} + persist-credentials: false + + - name: Record source SHA + id: sha + run: echo "source_sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" + + - name: Ensure nix is on PATH (self-hosted runner) + run: | + echo "/nix/var/nix/profiles/default/bin" >> "$GITHUB_PATH" + echo "$HOME/.nix-profile/bin" >> "$GITHUB_PATH" + + - name: Setup Attic caches (cache.pifinder.eu) + env: + ATTIC_TOKEN: ${{ secrets.ATTIC_TOKEN }} + run: | + nix profile install nixpkgs#attic-client + attic login pifinder https://cache.pifinder.eu "$ATTIC_TOKEN" + attic use pifinder:pifinder + + - name: Build and push release closure to Attic + id: push + run: | + STORE_PATH=$(nix build .#nixosConfigurations.pifinder.config.system.build.toplevel \ + -L --json | jq -r '.[].outputs.out') + DEV_SHELL_PATH=$(nix build .#devShells.aarch64-linux.default \ + -L --json | jq -r '.[].outputs.out') + # Stable → retained pifinder-release (GC off; devices resolve it months + # later). Beta → dev pifinder cache (finite retention), so prereleases + # stay transient. + if [[ "${{ inputs.type }}" == "beta" ]]; then + attic push pifinder:pifinder "$STORE_PATH" + attic push pifinder:pifinder "$DEV_SHELL_PATH" + else + attic push pifinder:pifinder-release "$STORE_PATH" + attic push pifinder:pifinder-release "$DEV_SHELL_PATH" + fi + echo "store_path=$STORE_PATH" >> "$GITHUB_OUTPUT" + + - name: Build SD image + run: | + nix build .#images.pifinder -L -o result-sd + + - name: Upload SD image + uses: actions/upload-artifact@v4 + with: + name: sdimage-native + path: result-sd/sd-image/*.img.zst + retention-days: 1 + + # The migration tarball is cut from the MINIMAL migration system, not the + # full image — it resolves the full system from the update manifest at + # first boot (ADR 0004 / 0003). + - name: Build migration image + run: | + nix build .#images.pifinder-migration -L -o result-mig + + - name: Upload migration image + uses: actions/upload-artifact@v4 + with: + name: migimage-native + path: result-mig/sd-image/*.img.zst + retention-days: 1 + + # Poll the native builder for ~15 min, then decide whether to fall back. + native-wait: + runs-on: ubuntu-latest + timeout-minutes: 20 + outputs: + need_fallback: ${{ steps.wait.outputs.need_fallback }} + steps: + - name: Wait for native build + id: wait + env: + GH_TOKEN: ${{ github.token }} + run: | + for i in $(seq 1 30); do + sleep 30 + RESULT=$(gh api "repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/jobs" \ + --jq '.jobs[] | select(.name == "build-native") | .conclusion // "pending"' 2>/dev/null || echo "pending") + echo "Check $i/30: build-native=$RESULT" + if [ "$RESULT" = "success" ]; then + echo "need_fallback=false" >> "$GITHUB_OUTPUT" + exit 0 + elif [ "$RESULT" = "failure" ] || [ "$RESULT" = "cancelled" ]; then + echo "need_fallback=true" >> "$GITHUB_OUTPUT" + exit 0 + fi + done + echo "Native build not done after 15 min, falling back to hosted" + echo "need_fallback=true" >> "$GITHUB_OUTPUT" + + # Fallback on a free GitHub-hosted arm64 runner (native aarch64, no QEMU). + build-hosted: + needs: native-wait + if: needs.native-wait.outputs.need_fallback == 'true' + runs-on: ubuntu-24.04-arm + timeout-minutes: 120 + outputs: + store_path: ${{ steps.push.outputs.store_path }} + source_sha: ${{ steps.sha.outputs.source_sha }} + steps: + - uses: actions/checkout@v4 + with: + repository: ${{ inputs.source_repository || github.repository }} + ref: ${{ inputs.source_branch }} + persist-credentials: false + + - name: Record source SHA + id: sha + run: echo "source_sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" + + - uses: DeterminateSystems/nix-installer-action@main + with: + determinate: false + extra-conf: | + extra-system-features = big-parallel + extra-substituters = https://cache.pifinder.eu/pifinder + extra-trusted-public-keys = pifinder:VkemNaMqXDcsYlpONItSvOOcBIa1vEfnpyqdetr3gck= + + - name: Setup Attic caches (cache.pifinder.eu) + env: + ATTIC_TOKEN: ${{ secrets.ATTIC_TOKEN }} + run: | + nix profile install nixpkgs#attic-client + attic login pifinder https://cache.pifinder.eu "$ATTIC_TOKEN" + attic use pifinder:pifinder + + - name: Build and push release closure to Attic + id: push + run: | + STORE_PATH=$(nix build .#nixosConfigurations.pifinder.config.system.build.toplevel \ + -L --json | jq -r '.[].outputs.out') + DEV_SHELL_PATH=$(nix build .#devShells.aarch64-linux.default \ + -L --json | jq -r '.[].outputs.out') + if [[ "${{ inputs.type }}" == "beta" ]]; then + attic push pifinder:pifinder "$STORE_PATH" + attic push pifinder:pifinder "$DEV_SHELL_PATH" + else + attic push pifinder:pifinder-release "$STORE_PATH" + attic push pifinder:pifinder-release "$DEV_SHELL_PATH" + fi + echo "store_path=$STORE_PATH" >> "$GITHUB_OUTPUT" + + - name: Build SD image + run: | + nix build .#images.pifinder -L -o result-sd + + - name: Upload SD image + uses: actions/upload-artifact@v4 + with: + name: sdimage-hosted + path: result-sd/sd-image/*.img.zst + retention-days: 1 + + # Minimal migration system — see the native job's comment (ADR 0004). + - name: Build migration image + run: | + nix build .#images.pifinder-migration -L -o result-mig + + - name: Upload migration image + uses: actions/upload-artifact@v4 + with: + name: migimage-hosted + path: result-mig/sd-image/*.img.zst + retention-days: 1 + + # Arch-independent: package the migration tarball + checksums and publish. Runs + # on whichever build succeeded (native preferred). + release: + needs: [build-native, native-wait, build-hosted] + if: | + always() && + (needs.build-native.result == 'success' || needs.build-hosted.result == 'success') + runs-on: ubuntu-latest + permissions: + contents: write + steps: + # Base repo (this repo, not the fork source): supplies the TRUSTED manifest + # scripts and the `origin` the manifest branch is pushed to. Keeps default + # credentials for that push. + - name: Checkout base repo + uses: actions/checkout@v4 + + # Download native and hosted images to separate dirs. If both builds ran + # (native slow → fallback fired) their images share a filename, so merging + # them would corrupt the archive — never merge; the assemble step prefers + # native. + - name: Download native SD image + continue-on-error: true + uses: actions/download-artifact@v4 + with: + name: sdimage-native + path: img-native + + - name: Download hosted SD image + continue-on-error: true + uses: actions/download-artifact@v4 + with: + name: sdimage-hosted + path: img-hosted + + - name: Download native migration image + continue-on-error: true + uses: actions/download-artifact@v4 + with: + name: migimage-native + path: mig-native + + - name: Download hosted migration image + continue-on-error: true + uses: actions/download-artifact@v4 + with: + name: migimage-hosted + path: mig-hosted + + - name: Compute tag + run: | + TAG="v${{ inputs.version }}" + [[ "${{ inputs.type }}" == "beta" ]] && TAG="${TAG}-beta" + echo "TAG=$TAG" >> "$GITHUB_ENV" + + - name: Assemble image + migration tarball + checksums + run: | + set -euo pipefail + # Only some dirs may exist (downloads are continue-on-error); create + # all so find can't fail under pipefail. Prefer the native builder's + # artifacts (listed first); fall back to hosted. + mkdir -p img-native img-hosted mig-native mig-hosted + IMAGE_SRC=$(find img-native img-hosted -type f -name '*.img.zst' -print -quit) + MIG_SRC=$(find mig-native mig-hosted -type f -name '*.img.zst' -print -quit) + if [ -z "$IMAGE_SRC" ] || [ -z "$MIG_SRC" ]; then + echo "Missing artifact: sd=[$IMAGE_SRC] migration=[$MIG_SRC]" >&2 + exit 1 + fi + mkdir -p release + cp "$IMAGE_SRC" "release/pifinder-${TAG}.img.zst" + + # The migration tarball is cut from the MINIMAL migration image — it + # resolves the full system from the update manifest at first boot, so + # its content never goes stale (ADR 0004 / 0003). + rm -f /tmp/pifinder-mig.img + zstd -d "$MIG_SRC" -o /tmp/pifinder-mig.img + + LOOP=$(sudo losetup --find --show --partscan /tmp/pifinder-mig.img) + sudo mkdir -p /mnt/boot /mnt/root + sudo mount "${LOOP}p1" /mnt/boot + sudo mount "${LOOP}p2" /mnt/root + + mkdir -p /tmp/tarball-staging + sudo cp -a /mnt/boot /tmp/tarball-staging/boot + sudo cp -a /mnt/root /tmp/tarball-staging/rootfs + + sudo umount /mnt/boot /mnt/root + sudo losetup -d "$LOOP" + rm -f /tmp/pifinder-mig.img + + sudo tar -C /tmp/tarball-staging -cf - \ + --exclude='*/lost+found' \ + boot rootfs | zstd -T0 -19 -o "release/pifinder-migration-${TAG}.tar.zst" + sudo rm -rf /tmp/tarball-staging + + # Never-again guard (2026-07-05 field failure): during migration the + # tarball is copied into RAM, so a 2GB board can only hold ~1.4GB. + # Refuse to publish a release that cannot migrate 2GB boards. + MIG_MB=$(( $(stat -c%s "release/pifinder-migration-${TAG}.tar.zst") / 1048576 )) + BUDGET_MB=800 + echo "migration tarball: ${MIG_MB}MB (budget ${BUDGET_MB}MB)" + if [ "${MIG_MB}" -gt "${BUDGET_MB}" ]; then + echo "::error::migration tarball ${MIG_MB}MB exceeds ${BUDGET_MB}MB budget — shrink the migration closure (check linux-firmware and friends)" + exit 1 + fi + + # Checksum sidecars. The in-app upgrade (PiFinder.sys_utils) fetches + # .sha256 and refuses to flash without a matching digest; + # it reads the first whitespace-delimited token, so sha256sum output is + # the expected format. + ( cd release + for f in pifinder-*.img.zst pifinder-migration-*.tar.zst; do + sha256sum "$f" > "$f.sha256" + done ) + + - name: Tag release source commit + # Only when building this repo. A fork source_repository has a different + # `origin` we can't push to with GITHUB_TOKEN; the GitHub Release below + # still publishes the artifacts to this repo. + if: (inputs.source_repository || github.repository) == github.repository + env: + SOURCE_SHA: ${{ needs.build-native.outputs.source_sha || needs.build-hosted.outputs.source_sha }} + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + # The base checkout is at the workflow's ref, not the built source — + # fetch and tag the commit the build job actually checked out. + git fetch --depth=1 origin "$SOURCE_SHA" + git tag "$TAG" "$SOURCE_SHA" + git push origin "$TAG" + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ env.TAG }} + name: PiFinder ${{ env.TAG }} + body: ${{ inputs.notes }} + prerelease: ${{ inputs.type == 'beta' }} + files: | + release/pifinder-*.zst + release/pifinder-*.sha256 + + - name: Update generated manifest branch + # Records this release in the metadata-only nixos-manifest branch so + # devices discover it (upgrade uses store_path; migration uses the tarball + # URL). Pushes to this repo's origin via the base checkout above, so it + # runs for fork-source builds too. source_sha is the built source commit; + # the tarball URL points at this repo's release assets. + env: + STORE_PATH: ${{ needs.build-native.outputs.store_path || needs.build-hosted.outputs.store_path }} + SOURCE_SHA: ${{ needs.build-native.outputs.source_sha || needs.build-hosted.outputs.source_sha }} + RELEASE_NOTES: ${{ inputs.notes }} + run: | + set -euo pipefail + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + MIGRATION_URL="https://github.com/${{ github.repository }}/releases/download/${TAG}/pifinder-migration-${TAG}.tar.zst" + + bash .github/scripts/publish_manifest.sh \ + "chore: update release manifest [skip ci]" \ + python3 .github/scripts/update_manifest.py release \ + --manifest @MANIFEST@ \ + --repository "${{ inputs.source_repository || github.repository }}" \ + --sha "$SOURCE_SHA" \ + --tag "$TAG" \ + --version "${{ inputs.version }}" \ + --release-type "${{ inputs.type }}" \ + --store-path "$STORE_PATH" \ + --migration-url "$MIGRATION_URL" \ + --migration-sha256-url "${MIGRATION_URL}.sha256" \ + --title "PiFinder $TAG" \ + --notes "$RELEASE_NOTES" diff --git a/.gitignore b/.gitignore index b30c9a31f..502146381 100644 --- a/.gitignore +++ b/.gitignore @@ -155,6 +155,8 @@ case/my_printer .direnv/ **/.claude/* !**/.claude/skills/ +.agents/ +.codex/ .serena/ astro_data/comets.txt @@ -162,3 +164,7 @@ astro_data/comets.txt test_ubx test_ubx/* python/telemetry_analysis/ + +# nix build result symlinks +result +result-* diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index bbd1b94ab..000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "python/PiFinder/tetra3"] - path = python/PiFinder/tetra3 - url = https://github.com/smroid/cedar-solve diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2a538aa17..317fee59c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,15 +1,27 @@ -# See https://pre-commit.com for more information -# See https://pre-commit.com/hooks.html for more hooks repos: - - repo: https://github.com/saltstack/mirrors-nox - rev: 'v2022.11.21' # Use the sha / tag you want to point at + - repo: local hooks: - - id: nox - files: ^.*\.py$ - args: - - -f - - python/noxfile.py - - -s - - type_hints - - smoke_tests - - -- + - id: ruff-lint + name: ruff lint + entry: bash -c 'cd python && ruff check' + language: system + files: ^python/.*\.py$ + pass_filenames: false + - id: ruff-format + name: ruff format check + entry: bash -c 'cd python && ruff format --check' + language: system + files: ^python/.*\.py$ + pass_filenames: false + - id: mypy + name: mypy type check + entry: bash -c 'cd python && mypy .' + language: system + files: ^python/.*\.py$ + pass_filenames: false + - id: smoke-tests + name: smoke tests + entry: bash -c 'cd python && pytest -m smoke' + language: system + files: ^python/.*\.py$ + pass_filenames: false diff --git a/CLAUDE.md b/CLAUDE.md index b0b0d15d2..a28cfe0a5 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -22,65 +22,46 @@ Maintainers can make `fresh` root on `main` automatically per clone (without cha git remote set-head origin main ``` -**Initialise the `tetra3` submodule in every new worktree.** `python/PiFinder/tetra3` is a git submodule (the `cedar-solve`/Tetra3 solver); the importable package is its inner `tetra3/tetra3/` dir, surfaced through the tracked symlink `python/tetra3`. `git worktree add` / `EnterWorktree` does **not** populate submodules, so a fresh worktree starts with an empty submodule dir and a dangling symlink. Any test that imports the solver then fails with `ModuleNotFoundError: No module named 'tetra3'` (or `cedar_detect_pb2`) — this is a missing checkout, **not** a code problem, so don't reach for `PYTHONPATH` hacks. Fix it once per worktree: - -```bash -git submodule update --init python/PiFinder/tetra3 -``` - -mypy also needs this: its config points at `python/PiFinder/tetra3/tetra3`, so `nox -s type_hints` can't run in a worktree until the submodule is initialised. +**No tetra3 submodule on this branch.** Unlike upstream `main`, the solver +(`cedar-solve`/Tetra3) is an ordinary uv dependency (pinned git rev in +`python/pyproject.toml`), so worktrees need no `git submodule` step. ## Development Commands -**Running Python** -Developers may have created virtual environments in directories like ".venv" or "venv". Make sure these virtual -environments are activated before any of the python based tools below. - -**Development workflow uses Nox for task automation:** -```bash -nox -s lint # Code linting with Ruff (auto-fixes issues) -nox -s format # Code formatting with Ruff -nox -s type_hints # Type checking with MyPy -nox -s smoke_tests # Quick functionality validation -nox -s unit_tests # Full unit test suite -nox -s babel # I18n message extraction and compilation -nox -s web_tests # Testing the webserver, see below -``` - -**Direct testing with pytest:** -```bash -pytest -m smoke # Smoke tests for core functionality -pytest -m unit # Unit tests for isolated components -pytest -m integration # End-to-end integration tests -``` +**This branch uses uv (pyproject.toml + uv.lock), not nox/requirements*.txt.** +All Python tooling runs through uv from `python/`: -**Development setup:** ```bash cd python/ -python3.9 -m venv .venv -source .venv/bin/activate -pip install -r requirements.txt -pip install -r requirements_dev.txt +uv sync --frozen # create/refresh .venv from uv.lock +uvx ruff@0.4.8 check --config "builtins=['_']" . # lint (same pin as CI / upstream noxfile) +uvx ruff@0.4.8 format . # format +uv run mypy PiFinder # type checking +uv run pytest -m smoke # smoke tests +uv run pytest -m unit # unit tests +uv run pytest -m integration tests/test_ui_modules.py # UI module harness ``` -If the .venv dir already exists, you can directly source it and run the app. +CI (`.github/workflows/nox.yml` — keeps the upstream "nox" check name) runs +exactly these commands. -Watch out for .venv directories containing virtual environments, that you need to activate first. +NixOS dev-box note: manylinux wheels (numpy etc.) need `libstdc++`; if imports +fail with `libstdc++.so.6: cannot open shared object file`, run tests with +`LD_LIBRARY_PATH=$(nix build --print-out-paths nixpkgs#stdenv.cc.cc.lib)/lib`. **Running the application:** First start the `cedar-detect-server` which is in `bin` (you need to use `-p 50551`, when invoking it). -Use the correct architecture suffix for cedar-detect-server according to the platform you're running on. +Use the correct architecture suffix for cedar-detect-server according to the platform you're running on. -Development setup has to have run and you should be in .venv virtual environment ```bash cd python/ -python -m PiFinder.main [options] +uv run python -m PiFinder.main [options] ``` Usual startup: ```bash -python3.9 -m PiFinder.main -fh --camera debug --keyboard local -x +uv run python -m PiFinder.main -fh --camera debug --keyboard local -x ``` ## Reference Documentation @@ -191,6 +172,39 @@ Tests use pytest with custom markers for different test types. The smoke tests p - **Linting:** Ruff with Python 3.9 target, Black-compatible formatting - **Type Checking:** MyPy with gradual typing adoption - **Code Style:** 88-character line length, double quotes, space indentation +- **Comments:** describe what the code does now, not how it changed. No "previously / no longer / used to / moved from" — history lives in git/jj, not in comments. - **I18n Support:** Babel integration for multi-language UI The codebase follows modern Python practices with type hints, comprehensive testing, and automated code quality checks integrated into the development workflow. + +## NixOS Development + +**CRITICAL: Never run `nix build` or `nix eval` on Pi 4 targets.** The Pi 4 lacks sufficient resources and will hang/crash. Always build on pi5.local (GitHub Actions runner), push to Attic, then trigger the upgrade service: +```bash +# Build on pi5 +ssh pi5.local 'nix build --no-link --print-out-paths github:mrosseel/PiFinder/nixos#nixosConfigurations.pifinder.config.system.build.toplevel' +# Push to Attic (so Pi can download signed paths) +ssh pi5.local 'attic push pifinder:pifinder ' +# Trigger upgrade on target Pi (downloads from Attic, activates, reboots) +ssh pifinder@ 'echo "" > /run/pifinder/upgrade-ref && sudo systemctl start --no-block pifinder-upgrade.service' +# Monitor progress +ssh pifinder@ 'cat /run/pifinder/upgrade-status' +``` + +**Netboot deployment (dev Pi on proxnix NFS):** +```bash +./deploy-image-to-nfs.sh # Build and deploy to NFS +``` + +**Power control (Shelly plug via Home Assistant):** +```bash +~/.local/bin/pifinder-power-off.sh # Turn off PiFinder +~/.local/bin/pifinder-power-on.sh # Turn on PiFinder +``` + +**Check Pi status:** +```bash +ssh pifinder@192.168.5.146 # SSH to netboot Pi +systemctl status pifinder # Check service status +journalctl -u pifinder -f # Follow service logs +``` diff --git a/astro_data/abell.tsv b/astro_data/abell.tsv index 80f4cb0ab..317aa892f 100644 --- a/astro_data/abell.tsv +++ b/astro_data/abell.tsv @@ -41,11 +41,11 @@ catalog_identifier name long_name ra dec magnitude major_axis Type Const 44 Abell 44 277.5470833 -16.75666667 15.4 0.45 PN Sgr 45 Abell 45 277.5670833 -11.61555556 12.8 2.4 PN Sct 46 Abell 46 277.8275 26.93638889 14.3 0.55 PN Lyr -47 Abell 47 278.8441667 0.2305555556 19.5 0.15 PN Ser +47 Abell 47 278.8441667 -0.2305555556 19.5 0.15 PN Ser 48 Abell 48 280.6954167 -3.221388889 17.2 0.35 PN Aql 49 Abell 49 283.3691667 -6.476388889 16.1 0.3 PN Sct -50 Abell 50 284.8329167 48.46472222 13.4 0.3 PN Dra -51 Abell 51 ngc6742 285.2558333 -18.20388889 15 0.55 PN Sgr +50 Abell 50 ngc6742 284.8329167 48.46472222 13.4 0.3 PN Dra +51 Abell 51 285.2558333 -18.20388889 15 0.55 PN Sgr 52 Abell 52 286.135 17.95222222 16.5 0.3 PN Aql 53 Abell 53 286.6920833 6.397222222 15.5 0.25 PN Aql 54 Abell 54 287.165 22.98305556 17.1 0.45 PN Vul diff --git a/astro_data/perek_kohoutek/PROVENANCE.md b/astro_data/perek_kohoutek/PROVENANCE.md new file mode 100644 index 000000000..763c8542f --- /dev/null +++ b/astro_data/perek_kohoutek/PROVENANCE.md @@ -0,0 +1,101 @@ +# Perek-Kohoutek source data + +Retrieved 2026-08-15 by `fetch_sources.sh` (in this directory). The catalog +build reads these files; it never touches the network. + +The decisions behind this import are recorded in +[`docs/adr/0024-perek-kohoutek-catalog.md`](../../docs/adr/0024-perek-kohoutek-catalog.md). + +## Files + +| File | Source | Rows | Epoch | Used for | +| --- | --- | --- | --- | --- | +| `ReadMe_IV24` | https://cdsarc.cds.unistra.fr/ftp/IV/24/ReadMe | — | — | Byte-position spec for `table2.dat` / `table4.dat` | +| `table2.dat` | https://cdsarc.cds.unistra.fr/ftp/IV/24/table2.dat.gz | 1510 | B1950 **and** J2000 columns | The authoritative row set: PK designation, other name, PN G, coarse J2000 | +| `table4.dat` | https://cdsarc.cds.unistra.fr/ftp/IV/24/table4.dat.gz | 6576 | mixed (`Eq` = 1900/1950/2000) **plus** author-computed J2000 | Arcsecond J2000 positions; several rows per object | +| `ReadMe_V84` | https://cdsarc.cds.unistra.fr/ftp/V/84/ReadMe | — | — | Byte-position spec for `main.dat` / `diam.dat` | +| `main.dat` | https://cdsarc.cds.unistra.fr/ftp/V/84/main.dat.gz | 1143 | B1950 (not read) | `Idents` cross-identifications, `IRAS` name, main designation | +| `diam.dat` | https://cdsarc.cds.unistra.fr/ftp/V/84/diam.dat.gz | 1143 | — | Optical and radio diameters, arcseconds | +| `simbad_pk.tsv` | SIMBAD TAP (query below) | 1967 | ICRS ≈ J2000 | Best available positions | +| `simbad_pk_aliases.tsv` | SIMBAD TAP (query below) | 247 | — | NGC / IC / Messier / Abell / Sharpless cross-IDs | +| `pk.desc` | hand-written | — | — | Catalog description shown in the PiFinder UI | + +## Catalogues + +**IV/24** — *Catalogue of Galactic Planetary Nebulae*, Kohoutek 2001 +(`2001A&A...378..843K`, Abh. Hamburger Sternw. XII). Explicitly "a +continuation of CGPN(1967)", i.e. the direct successor to Perek & Kohoutek +1967. This is the catalogue that assigns PK designations. + +**V/84** — *Strasbourg-ESO Catalogue of Galactic Planetary Nebulae*, +Acker et al. 1992. Keyed on PN G rather than PK, but far richer in physical +data. Joined to IV/24 on the PN G designation: 1112 of the 1510 PK rows +match. + +## SIMBAD queries + +Both are `POST` to `https://simbad.cds.unistra.fr/simbad/sim-tap/sync` with +`REQUEST=doQuery`, `LANG=ADQL`, `FORMAT=tsv`. + +Positions (`simbad_pk.tsv`): + +```sql +SELECT i.id, b.main_id, b.ra, b.dec, b.otype +FROM ident i JOIN basic b ON i.oidref = b.oid +WHERE i.id LIKE 'PK %' +``` + +Cross-identifications (`simbad_pk_aliases.tsv`), restricted to the +designation families PiFinder has a catalog for: + +```sql +SELECT i1.id AS pk_id, i2.id AS alias +FROM ident i1 JOIN ident i2 ON i1.oidref = i2.oidref +WHERE i1.id LIKE 'PK %' + AND (i2.id LIKE 'NGC %' OR i2.id LIKE 'IC %' OR i2.id LIKE 'M %' + OR i2.id LIKE 'PN A66%' OR i2.id LIKE 'SH 2-%') +``` + +## Cross-check against the published list + +Two secondary transcriptions of the same Kohoutek 2001 data circulate among +amateurs, both carrying the identical 1510 rows in the identical order: + +- `astronomy.com/wp-content/uploads/2024/05/Perek-Kohoutek-Catalog.pdf` +- a "Perek Kohoutek.xlsx" spreadsheet linked from + `sites.google.com/view/amateurastronomer/catalogs/nebulae/perek-kohoutek` + +Neither is imported. Both drop the PN G designation, the flags and the notes, +both write en-dashes rather than hyphens in designations, and both carry only +the coarse J2000 positions. They are useful as an independent check, and the +spreadsheet was used as one: **all 1510 PK designations and all 1510 "other +designation" values match `table2.dat` exactly.** + +The check also found one transcription error in the spreadsheet — row 551 +(PK 342-02.1, He 2-198) lost its declination sign, reading `44°13'` where +`table2.dat` reads `-44 13`. That row is 88 degrees out. It is another reason +to take the VizieR original rather than either secondary copy. + +## What these sources do not contain + +- **No magnitudes.** IV/24 is deliberately restricted to position and + identification data. V/84 has central-star magnitudes and H-beta fluxes, + but no integrated nebular magnitude. PK objects that cross-match an + existing NGC/IC/Abell object inherit that object's magnitude; the rest + carry `UNKNOWN_MAG`. +- **No morphological type.** Every entry is imported as `PN`. +- **Diameters for 1112 of 1510 only** — the V/84 overlap. + +## Designation formats + +The same object is written differently in each source. Whitespace inside a +designation is not significant and is collapsed on read. + +| Source | PK form | Example cross-ID form | +| --- | --- | --- | +| `table2.dat` / `table4.dat` | `036+17.1` (no prefix, dot before the running number) | `NGC 40`, `A 1`, `Sh 2-176`, `M 1-92` | +| `main.dat` | `171-25 1` (space-separated, space-padded) | `He 2- 231`, `Sa 2-206` | +| SIMBAD | `PK 036+17 1` | `NGC 7008`, `PN A66 80`, `SH 2-176`, `M 76` | + +**Trap:** `M 1-92`, `M 2-9`, `M 3-27` and the other 185 `M n-m` entries in +`table2.dat` are **Minkowski**, not Messier. See the ADR. diff --git a/astro_data/perek_kohoutek/ReadMe_IV24 b/astro_data/perek_kohoutek/ReadMe_IV24 new file mode 100644 index 000000000..85f8d8899 --- /dev/null +++ b/astro_data/perek_kohoutek/ReadMe_IV24 @@ -0,0 +1,284 @@ +IV/24 Catalogue of Galactic Planetary Nebulae (Kohoutek, 2001) +================================================================================ +Catalogue of Galactic Planetary Nebulae + Kohoutek L. + + + =2001A&A...378..843K +================================================================================ +ADC_Keywords: Planetary nebulae; Cross identifications +Keywords: ISM: planetary nebulae: general + +Abstract: + The "Catalogue of Galactic Planetary Nebulae (Version 2000)" appears + in Abhandlungen aus der Hamburger Sternwarte, Band XII in the year + 2001. It is a continuation of CGPN(1967) and contains 1510 objects + classified as galactic PNe up to the end of 1999. The lists of + possible pre-PNe and possible post-PNe are also given. The catalogue + is restricted only to the data belonging to the location and + identification of the objects. It gives identification charts of PNe + discovered since 1965 (published in the supplements to CGPN) and those + charts of objects discovered earlier, which have wrong or uncertain + identification. The question "what is a planetary nebula" is discussed + and the typical values of PNe and of their central stars are + summarized. Short statistics about the discoveries of PNe are given. + The catalogue is also available in the Centre de Donnees, Strasbourg + and at Hamburg Observatory via internet. + +File Summary: +-------------------------------------------------------------------------------- + FileName Lrecl Records Explanations +-------------------------------------------------------------------------------- +ReadMe 80 . This file +table1.dat 91 1759 General List of Planetary Nebulae and + Misclassified Planetary Nebulae + (according to galactic longitude) +table2.dat 80 1510 List of Planetary Nebulae + (according to right ascension) +table3.dat 72 249 List of Misclassified Planetary Nebulae +table4.dat 104 6576 Accurate Coordinates of Planetary Nebulae +table5.dat 93 746 Possible pre-Planetary Nebulae +table6.dat 91 154 Possible post-Planetary Nebulae +table7.dat 74 322 Index of Discovery Lists +table8.dat 80 655 List of Finding Charts +notes1.dat 80 823 Notes to table1 +notes2.dat 80 294 Notes to table2 +notes4.dat 80 552 Notes to table4 +notes8.dat 80 370 Notes to table8 +refs.dat 197 386 References +images/* . 30 Finding charts and illustrations (postscript) +text.tex 1208 1819 LaTeX version of the catalog +-------------------------------------------------------------------------------- + +See also: + V/84 : Strasbourg-ESO Catalogue of Galactic Planetary Nebulae (Acker+, 1992) + VI/14 : Bibliographical index of planetary nebulae, period 1965-79 + (Acker+, 1981) + J/A+A/274/895 : Radio obs. of Southern PN Candidates (Van de Steene+ 1993) + J/A+A/280/581 : Chemical abundances of PNe (Pasquali+, 1993) + J/A+A/307/215 : Spectrophotomety of planetary nebulae (Cuisinier+, 1996) + J/A+A/318/256 : Planetary nebulae properties (Gorny+ 1997) + J/A+A/373/536 : New galactic bulge PNe (van de Steene+, 2001) + J/A+A/380/300 : Abundances of PN towards Galactic bulge (Escudero+, 2001) + J/A+AS/106/559 : HeII4686 line intensities of PN (Tylenda+, 1994) + J/A+AS/126/297 : PN abundances (Ratag+ 1997) + J/ApJ/515/610 : New PN in southern Galactic Bulge (Beaulieu+, 1999) + J/AN/318/35 : New and Misclassified Planetary Nebulae (Kohoutek, 1997) + +Byte-by-byte Description of file: table1.dat +-------------------------------------------------------------------------------- + Bytes Format Units Label Explanations +-------------------------------------------------------------------------------- + 1- 9 A9 --- PK [0-9. +-] PK designation, as in CGPN + 10 A1 --- f_PK [M*] Misclassified, possible PN + 12- 25 A14 --- Name Other name of the PN + 27- 28 I2 h RAh Right Ascension B1950 (hours) + 30- 33 F4.1 min RAm Right Ascension B1950 (minutes) + 36 A1 --- DE- Declination B1950 (sign) + 37- 38 I2 deg DEd Declination B1950 (degrees) + 40- 41 I2 arcmin DEm Declination B1950 (minutes) + 45- 46 A2 --- List [S1-6 ] Origin of the name: + original PK (blank) or Supplement 1 to 6 + 48- 77 A30 --- Disc Discoverer and reference + 79 A1 --- Note [*] indicates a remark + 81- 89 A9 --- ImFile Name of finding chart image, + in "image" subdirectory. + 91 I1 --- Page ? Page number of image within file +-------------------------------------------------------------------------------- + +Byte-by-byte Description of file: table2.dat +-------------------------------------------------------------------------------- + Bytes Format Units Label Explanations +-------------------------------------------------------------------------------- + 1- 9 A9 --- PK [0-9. +-] PK designation, as in CGPN + 10 A1 --- f_PK [*] Possible PN + 12- 25 A14 --- Name Other name of the PN + 28- 29 I2 h RA1h Right Ascension B1950 (hours) + 31- 34 F4.1 min RA1m Right Ascension B1950 (minutes) + 37 A1 --- DE1- Declination B1950 (sign) + 38- 39 I2 deg DE1d Declination B1950 (degrees) + 41- 42 I2 arcmin DE1m Declination B1950 (minutes) + 45- 47 I3 --- FC ? Finding chart number + 50- 51 I2 h RAh Right Ascension J2000 (hours) + 53- 56 F4.1 min RAm Right Ascension J2000 (minutes) + 59 A1 --- DE- Declination J2000 (sign) + 60- 61 I2 deg DEd Declination J2000 (degrees) + 63- 64 I2 arcmin DEm Declination J2000 (minutes) + 68- 78 A11 --- PNG Designation in Strasbourg-ESO Catalog, or + "possible" "rejected" + 80 A1 --- Note [*] indicates a remark +-------------------------------------------------------------------------------- + +Byte-by-byte Description of file: table3.dat +-------------------------------------------------------------------------------- + Bytes Format Units Label Explanations +-------------------------------------------------------------------------------- + 1- 9 A9 --- PK [0-9. +-] PK designation, as in CGPN + 12- 23 A12 --- Name Other name of the PN + 25- 26 I2 h RAh Right Ascension B1950 (hours) + 28- 31 F4.1 min RAm Right Ascension B1950 (minutes) + 34 A1 --- DE- Declination B1950 (sign) + 35- 36 I2 deg DEd Declination B1950 (degrees) + 38- 39 I2 arcmin DEm Declination B1950 (minutes) + 43 I1 --- Sup [1,6]? Supplement number where + misclassification explained + 47- 72 A26 --- Text Explanation of the misclassification +-------------------------------------------------------------------------------- + +Byte-by-byte Description of file: table4.dat +-------------------------------------------------------------------------------- + Bytes Format Units Label Explanations +-------------------------------------------------------------------------------- + 1- 9 A9 --- PK [0-9. +-] PK designation, as in CGPN + 10 A1 --- f_PK [*] Possible PN + 12- 26 A15 --- Name Other name of the PN + 28- 29 I2 h RA.Eq.h Right Ascension for Equinox Eq (hours) + 31- 32 I2 min RA.Eq.m Right Ascension for Equinox Eq (minutes) + 34- 39 F6.3 s RA.Eq.s Right Ascension for Equinox Eq (seconds) + 40 A1 --- u_RA.Eq.s Uncertainty flag (:) on Right Ascension + 41 A1 --- DE.Eq.- Declination for Equinox Eq (sign) + 42- 43 I2 deg DE.Eq.d Declination for Equinox Eq (degrees) + 45- 46 I2 arcmin DE.Eq.m Declination for Equinox Eq (minutes) + 48- 52 F5.2 arcsec DE.Eq.s Declination for Equinox Eq (minutes) + 53 A1 --- u_DE.Eq.s Uncertainty flag (:) on Declination + 55- 58 I4 yr Eq Equinox (1900, 1950 or 2000) + 62- 76 A15 --- Origin Origin of the position (1) + 80 A1 --- Note [*] Note flag + 82- 83 I2 h RAh Right Ascension for J2000 (2) + 85- 86 I2 min RAm Right Ascension for J2000 (2) + 88- 92 F5.2 s RAs Right Ascension for J2000 (2) + 94 A1 --- DE- Declination for J2000 (2) + 95- 96 I2 deg DEd Declination for J2000 (2) + 98- 99 I2 arcmin DEm Declination for J2000 (2) + 101-104 F4.1 arcsec DEs Declination for J2000 (2) +-------------------------------------------------------------------------------- + +Note (1): Origin of the position: + Ac,Sk (1996): Acker A., Skiff B., 1996, priv. communication (S1 to SECGPN). + Ja,St (1997): Jacoby G.H., Van de Steene G.C.M., 1997, in preparation + (see S1 to SECGPN). + Ko,Ku (1999): Kohoutek L., Kuehl D., 1999, priv. communication. + Li,Tw (1996): Liebert J., Tweedy R.W., Napiwotzki R., Fulbright M.S., 1996, + priv. comm. (S1 to SECGPN). + Na (1996): Nakano S., 1996IAUC.6323Q...1N (determined by Y. Kushida). + St,Sa (1977): Stephenson C.B., Sanduleak N., 1977PW&SO...2...71S + We (1978): Weinberger R., 1978Obs....98..137W + We (1996): Weinberger R., 1996, priv. comm. + (see also IAU Symp. No.180, 22). + Wr (1966): Wray J.D., 1966, PhD thesis: A Study of H-alpha + Emission Objects in the Southern Milky Way, Illinois, + U.S.A. (Tables 15,16,17,19 - some objects) + AC-Cat.: Urban, Corbin & Wycoff, 1997, Cat. , AC 2000: + The Astrographic Catalogue on The Hipparcos System, + U.S. Naval Observatory, Washington, D.C. + (coordinates at the epochs of observations.) + AGK2-Cat.: Schorr R., Kohlschuetter A., 1951, Zweiter Katalog der + Astronomischen Gesellschaft, Hamburg-Bergedorf. + AGK3-Cat.: Heckmann & Dieckvoss, 1975, Cat. , Star Catalogue + of Positions and Proper Motions North of -2.5{deg} + Declination, Hamburg-Bergedorf. + GSC-Cat.: Lasker B.M., Russell J.L., Jenkner H. et al., 1989, + The Guide Star Catalog I.,II.,III., Space Telescope + Science Institut, Baltimore (Cat. , ) + (coordinates originally in equinox 2000.0 but calculated + for 1950.0). + HIP-Cat.: ESA team, 1997, Cat. , The Hipparcos and Tycho + Catalogues, European Space Agency, + TYC-Cat.: SP-1136 and SP-1200., Cat. + IRAS-Cat.: Beichman C.A., Neugebauer G., Habing H.J. et al., 1985, + Cat. , Infrared Astronomical Satellite: Catalog + and Atlases - PSC catalog, U.S. Government Printing Office. + LSII-Cat.: Stock J., Nassau J.J., Stephenson C.B., 1960, + Luminous Stars in the Northern Milky Way II., + Hamburg-Bergedorf., Cat. + LSIII-Cat.: Hardorp J., Theile I., Voigt H.H., 1964, Luminous Stars + in the Northern Milky Way III., Hamburg-Bergedorf., + Cat. + LSIV-Cat.: Nassau J.J., Stephenson C.B., 1963, Luminous Stars in + the Northern Milky Way IV., Hamburg-Bergedorf., Cat. + LSV-Cat.: Hardorp J., Theile I., Voigt H.H., 1965, Luminous Stars + in the Northern Milky Way V., Hamburg-Bergedorf, Cat. + LSS-Cat.: Stephenson & Sanduleak, 1971, Cat. + PPM-Cat.: Roeser & Bastian, 1988, Cat. , , : + Catalogue of Positions and Proper Motions (Version 1994). + SAO-Cat.: Smithsonian Astrophysical Observatory, 1971, Cambridge, + Mass.: Star Catalogue. Cat. + +Note (2): Position computed from the position at Equinox Eq, not part + of the original data. +-------------------------------------------------------------------------------- + +Byte-by-byte Description of file: table5.dat table6.dat +-------------------------------------------------------------------------------- + Bytes Format Units Label Explanations +-------------------------------------------------------------------------------- + 1- 15 A15 --- Name Name of the object + 17- 18 I2 h RAh Right Ascension B1950 (hours) + 20- 21 I2 min RAm Right Ascension B1950 (minutes) + 23- 26 F4.1 s RAs Right Ascension B1950 (seconds) + 28 A1 --- DE- Declination B1950 (sign) + 29- 30 I2 deg DEd Declination B1950 (degrees) + 32- 33 I2 arcmin DEm Declination B1950 (minutes) + 35- 36 I2 arcsec DEs ? Declination B1950 (seconds) + 37 A1 --- u_Pos Uncertainty flag (:) on Position + 39- 93 A55 --- Text Text of note +-------------------------------------------------------------------------------- + +Byte-by-byte Description of file: table7.dat +-------------------------------------------------------------------------------- + Bytes Format Units Label Explanations +-------------------------------------------------------------------------------- + 1- 7 A7 --- Acro Acronym used + 9- 74 A66 --- Text Authors and references +-------------------------------------------------------------------------------- + +Byte-by-byte Description of file: table8.dat +-------------------------------------------------------------------------------- + Bytes Format Units Label Explanations +-------------------------------------------------------------------------------- + 1- 9 A9 --- PK Designation + 10 A1 --- f_PK [*] for Possible PN + 12- 26 A15 --- Name Name of the PN + 29- 30 I2 h RAh Right Ascension B1950 (hours) + 32- 35 F4.1 min RAm Right Ascension B1950 (minutes) + 38 A1 --- DE- Declination B1950 (sign) + 39- 40 I2 deg DEd Declination B1950 (degrees) + 42- 43 I2 arcmin DEm Declination B1950 (minutes) + 47- 51 A5 --- Disc Catalogue with discovery + 53- 55 I3 --- FC Number of Finding Chart + 57 A1 --- --- [C] + 60- 67 A8 "DD/MM/YY" Date Date of observation + 70- 76 A7 --- pLabel + 80 A1 --- Note [*] indicates a note +-------------------------------------------------------------------------------- + +Byte-by-byte Description of file: notes1.dat notes2.dat notes4.dat notes8.dat +-------------------------------------------------------------------------------- + Bytes Format Units Label Explanations +-------------------------------------------------------------------------------- + 1- 9 A9 --- PK [0-9. +-] PK designation, as in CGPN + 10 A1 --- f_PK [*M] * for Possible PN, M for Misclassified + 11- 24 A14 --- Name Name of the PN + 26- 80 A55 --- Note Text of the note +-------------------------------------------------------------------------------- + +Byte-by-byte Description of file: refs.dat +-------------------------------------------------------------------------------- + Bytes Format Units Label Explanations +-------------------------------------------------------------------------------- + 1- 19 A19 --- BibCode BibCode + 21- 47 A27 --- Aut Author's name + 49- 84 A36 --- PN Name or list denomination of concerned + planetary nebulae + 86-197 A112 --- Com Commnents +-------------------------------------------------------------------------------- + +Acknowledgements: + The catalogue was kindly supplied by L. Kohoutek on a CD-ROM. + +History: + * 07-Jan-2003: table4 and note4 indicated PK 130-03.1 instead of PK 130+03.1 + * 14-Oct-2009: table5 indicated He 3-1031 instead of He 3-1013 + * 26-Oct-2009: table5 indicated No.31-WSRT 1 instead of No.32-WSRT 1 +================================================================================ +(End) Francois Ochsenbein [CDS] 18-May-2001 diff --git a/astro_data/perek_kohoutek/ReadMe_V84 b/astro_data/perek_kohoutek/ReadMe_V84 new file mode 100644 index 000000000..4ba9e152e --- /dev/null +++ b/astro_data/perek_kohoutek/ReadMe_V84 @@ -0,0 +1,404 @@ +V/84 Strasbourg-ESO Catalogue of Galactic Planetary Nebulae (Acker+, 1992) +================================================================================ +Strasbourg-ESO Catalogue of Galactic Planetary Nebulae + Acker A., Ochsenbein F., Stenholm B., Tylenda R., Marcout J., Schohn C. + + =1992ESOPN...1....1A (SIMBAD/NED Reference) +================================================================================ +ADC_Keywords: Planetary nebulae ; Spectroscopy + +Description: + The electronic version of the catalogue referenced above includes + 1143 true and probable planetary nebulae (Table 1 of publication); + 347 objects which status is still unclear were classified among the + "possible" planetary nebulae (file pospn, Table 2 of publication); + and 330 objects have been rejected (file notpn, Table 3 of publication). + + The designation system of the planetary nebulae of this catalogue + follows the recommendations of IAU Commission 5 (Astronomical + Nomenclature) with the structure: + PN Glll.l+bb.b + where PN means "Planetary Nebula", G stands for "Galactic Coordinates", + and lll.l+bb.b stand for the galactic longitude and latitude + respectively, truncated to one decimal place. + The designations following this system appear in the columns + labelled "PNG" in the tables described below, where the "PN G" + prefix has been stripped. + + Data concerning the 1143 true and probable planetary nebulae + (part II of the publication) have been grouped in a set of related + tables described below, all sorted by the "PNG" column. + Note that, unlike the printed volume, only the bibliographic + references corresponding to data listed in the tables are + provided here, in the "refs.dat" file. + + Copies of the complete catalogue, including the Finding Charts + (Part I) can still be ordered at the ESO Information Service, + Karl-Schwarzschildstr. 2, D-85748 Garching bei Muenchen, Germany, + at a price of DM 135. + +File Summary: +-------------------------------------------------------------------------------- + FileName Lrecl Records Explanations +-------------------------------------------------------------------------------- +ReadMe 80 . This file +main.dat 224 1143 Discoverers, Designations, and Positions of + True and Possible Planetary Nebulae (1) +diam.dat 66 1143 Diameters of PN (optical and radio) (1) +dist.dat 38 296 Distance estimations (2) +dista.dat 38 3017 Statistical distances (2) +hbeta.dat 62 991 H-beta fluxes (1) +intens.dat 117 1046 Line intensities results (1) +iue.dat 77 1715 IUE observations log (2) +iras.dat 88 774 IRAS Point Source Catalogue fluxes (1) +nir.dat 106 365 Near infra-red observations (1) +radio.dat 46 689 Radio observations (1) +vel.dat 73 614 Radial and Expansion Velocities (1) +cstar.dat 285 692 Data concerning Central Stars of PN (1) +notes.dat 115 703 Notes and remarks about some nebulae (2) +refs.dat 80 872 References +pospn.dat 111 347 Possible PN (table 2) +notpn.dat 121 330 Objects rejected as PN (table 3) +-------------------------------------------------------------------------------- +Note (1): one entry or less per planetary nebula +Note (2): several entries may exist for a planetary nebula +-------------------------------------------------------------------------------- + +See also: + J/A+A/307/215 : Spectrophotometry of PNe (Cuisinier+, 1996) + +Byte-by-byte Description of file: main.dat +-------------------------------------------------------------------------------- + Bytes Format Units Label Explanations +-------------------------------------------------------------------------------- + 1- 10 A10 --- PNG Designation of the Galactic Planetary Nebula + 13- 14 I2 h RAh Right Ascension B1950 (hours) + 16- 17 I2 min RAm Right Ascension B1950 (minutes) + 19- 23 F5.2 s RAs [0/60[? Right Ascension B1950 (seconds) + 24 A1 --- DE- Declination B1950 (sign) + 25- 26 I2 deg DEd Declination B1950 (degrees) + 28- 29 I2 arcmin DEm Declination B1950 (minutes) + 31- 34 F4.1 arcsec DEs [0/60[? Declination 1950 (seconds) + 35 A1 --- fp [ad*] Flag for inaccurate B1950 Position: + a if RA originally only given to 0.1min + d if DE originally only given to 0.1arcmin + or worse + * if both 'a' and 'd' + 37- 44 A8 --- r_Pos Reference of position + 46- 58 A13 --- Name Main designation + 60- 68 A9 --- PK Designation in PK67 + 70- 80 A11 --- IRAS Designation in IRAS catalogue + 82-112 A31 --- Disc Discoverer name and publication year + 115-224 A110 --- Idents Other names separated by commas +-------------------------------------------------------------------------------- + +Byte-by-byte Description of file: diam.dat +-------------------------------------------------------------------------------- + Bytes Format Units Label Explanations +-------------------------------------------------------------------------------- + 1- 10 A10 --- PNG Designation of the Galactic Planetary Nebula + 13 A1 --- l_oDiam Limit flag on oDiam + 14- 19 F6.1 arcsec oDiam ? Optical diameter + 20 A1 --- u_oDiam Uncertainty flag (:) on oDiam + 22- 49 A28 --- r_oDiam References for oDiam + 51 A1 --- l_rDiam Limit flag on Radio diameter + 52- 57 F6.2 arcsec rDiam ? Radio diameter + 58 A1 --- u_rDiam Uncertainty flag (:) on oDiam + 59- 66 A8 --- r_rDiam Reference on Radio diameter +-------------------------------------------------------------------------------- + +Byte-by-byte Description of file: dist.dat dista.dat +-------------------------------------------------------------------------------- + Bytes Format Units Label Explanations +-------------------------------------------------------------------------------- + 1- 10 A10 --- PNG Designation of the Galactic Planetary Nebula + 14 A1 --- Method [EKSWXDCM] Method used for distance + determination (1) + 16- 21 F6.3 kpc Dist1 ? Lower distance if l_Dist is '-' + 22 A1 --- l_Dist [-<>] '-' if Dist1 is a lower limit; + '<' or '>' apply to Dist. + 23- 28 F6.3 kpc Dist Distance in kiloparsecs. + 29 A1 --- u_Dist [?:] Uncertainty flag on Dist + 31- 38 A8 --- r_Dist Reference of Dist determination. +-------------------------------------------------------------------------------- +Note (1): This field is blank for file "dista" (statistical distances); + for file "dist", the following symbols are used to describe the method: + C = from cluster membership + D = from dust + E = from local extinction study + K = from kinematical studies + M = mean value from a compilation of individual distances + S = from spectroscopic parallax of binary companions + W = from wind + X = from a comparison of tangential and radial expansions + (blank) = statistical distance +-------------------------------------------------------------------------------- + +Byte-by-byte Description of file: hbeta.dat +-------------------------------------------------------------------------------- + Bytes Format Units Label Explanations +-------------------------------------------------------------------------------- + 1- 10 A10 --- PNG Designation of the Galactic Planetary Nebula + 13- 18 F6.2 [mW/m2] log(Fbeta) [-15/-9] log of flux in H-beta + 21- 24 F4.2 [mW/m2] e_log(Fbeta) ? Mean error on log(Fbeta) + 28- 64 A37 --- r_log(Fbeta) References +-------------------------------------------------------------------------------- + +Byte-by-byte Description of file: intens.dat +-------------------------------------------------------------------------------- + Bytes Format Units Label Explanations +-------------------------------------------------------------------------------- + 1- 10 A10 --- PNG Designation of the Galactic Planetary Nebula + 13- 34 A22 --- ObsLabel Observation name (includes the date) + 36 A1 --- LineRef [ab] Line taken as reference (value=100): + 'a'=H-alpha (6563), 'b'=H-beta (4861) + 40- 46 F7.1 --- I4686 ]0/15000]? Line intensity of HeII at 468.6nm + 47 A1 --- u_I4686 Uncertainty flag on I4686 + 50- 56 F7.1 --- I4363 ]0/15000]? Line intensity of [OIII] at 436.3nm + 57 A1 --- u_I4363 Uncertainty flag on I4363 + 59 A1 --- n_I5007 [*] '*' if the measurement refers to 495.9nm + because 500.7nm line is saturated + 60- 66 F7.1 --- I5007 ]0/15000]? Line intensity of [OIII] at 500.7nm + 67 A1 --- u_I5007 Uncertainty flag on I5007 + 70- 76 F7.1 --- I5876 ]0/15000]? Line intensity of HeI + 77 A1 --- u_I5876 Uncertainty flag on I5876 at 587.6nm + 80- 86 F7.1 --- I6563 ]0/15000]? Line intensity of H-alpha + at 656.3nm + 87 A1 --- u_I6563 Uncertainty flag on I6563 + 90- 96 F7.1 --- I6584 [0/15000]? Line intensity of [NII] at 658.4nm + 97 A1 --- u_I6584 Uncertainty flag on I6584 + 99 A1 --- n_I6717 [B] 'B' if line is blended + 100-106 F7.1 --- I6717 ]0/15000]? Line intensity of [SII] at 671.7nm + 107 A1 --- u_I6717 Uncertainty flag on I6717 + 109 A1 --- n_I6731 [B] 'B' if line is blended + 110-116 F7.1 --- I6731 ]0/15000]? Line intensity of [SII] at 673.1nm + 117 A1 --- u_I6731 Uncertainty flag on I6731 +-------------------------------------------------------------------------------- + +Byte-by-byte Description of file: iue.dat +-------------------------------------------------------------------------------- + Bytes Format Units Label Explanations +-------------------------------------------------------------------------------- + 1- 10 A10 --- PNG Designation of the Galactic Planetary Nebula + 13- 24 A12 --- IUEname Name as found in the IUE Merged Log + 26- 45 A20 --- 1950Pos Position as found in the IUE Merged Log + 47- 57 A11 "date" Obs.date Date of the Observation + 59- 63 A5 "h:m" Obs.time Time (hours, minutes) of the Observation + 65- 66 I2 --- OType Object class as found in the IUE Merged Log + 68- 70 A3 --- Camera designation, LW=Long Wavelength, SW=Short + Wavelength + 72- 76 A5 --- Image identification of the Observation +-------------------------------------------------------------------------------- + +Byte-by-byte Description of file: iras.dat +-------------------------------------------------------------------------------- + Bytes Format Units Label Explanations +-------------------------------------------------------------------------------- + 1- 10 A10 --- PNG Designation of the Galactic Planetary Nebula + 13- 23 A11 --- IRAS IRAS source name + 24- 25 I2 h RAIR.h Right Ascension, equinox 1950.0, epoch 1983.5 + 26- 27 I2 min RAIR.m Right Ascension, equinox 1950.0, epoch 1983.5 + 28- 30 I3 ds RAIR.ds Right Ascension, equinox 1950.0, epoch 1983.5 + 31 A1 --- DEIR.- Declination, equinox 1950.0, epoch 1983.5 + 32- 33 I2 deg DEIR.d Declination, equinox 1950.0, epoch 1983.5 + 34- 35 I2 arcmin DEIR.m Declination, equinox 1950.0, epoch 1983.5 + 36- 37 I2 arcsec DEIR.s Declination, equinox 1950.0, epoch 1983.5 + 38- 40 I3 arcsec Major Uncertainty ellipse major axis + 41- 43 I3 arcsec Minor Uncertainty ellipse minor axis + 44- 46 I3 deg PosAng Uncertainty ellipse position angle (1) + 47- 48 I2 --- NHcon Number of times observed + 49- 57 E9.3 Jy Fnu12 Average non-color corrected flux density, + IRAS/12{mu}m + 58- 66 E9.3 Jy Fnu25 Average non-color corrected flux density, + IRAS/25{mu}m + 67- 75 E9.3 Jy Fnu60 Average non-color corrected flux density, + IRAS/60{mu}m + 76- 84 E9.3 Jy Fnu100 Average non-color corrected flux density, + IRAS/100{mu}m + 85 I1 --- q_Fnu12 [1/3] Flux density quality (3=ok), 12um (1) + 86 I1 --- q_Fnu25 [1/3] Flux density quality (3=ok), 25um (1) + 87 I1 --- q_Fnu60 [1/3] Flux density quality (3=ok), 60um (1) + 88 I1 --- q_Fnu100 [1/3] Flux density quality (3=ok), 100um (1) +-------------------------------------------------------------------------------- +Note (1): the IRAS flux qualities are + 1 = upper limit + 2 = moderate quality + 3 = high quality +-------------------------------------------------------------------------------- + +Byte-by-byte Description of file: nir.dat +-------------------------------------------------------------------------------- + Bytes Format Units Label Explanations +-------------------------------------------------------------------------------- + 1- 10 A10 --- PNG Designation of the Galactic Planetary Nebula + 13- 17 F5.2 mag Jmag ? Magnitude in J filter (1.25um) + 19 A1 --- l_Hmag Limit flag on Hmag + 20- 24 F5.2 mag Hmag ? Magnitude in H filter (1.65um) + 26 A1 --- l_Kmag Limit flag on Kmag + 27- 31 F5.2 mag Kmag ? Magnitude in K filter (2.22um) + 33 A1 --- l_Lmag Limit flag on Lmag + 34- 38 F5.2 mag Lmag ? Magnitude in L/L' filter (3.5/3.8um) + 39 A1 --- n_Lmag ['] the apostrophe indicates the L' filter + 41- 45 A5 --- Class [NDSP,?+ ] Class based on the near-IR (1) + 48- 76 A29 --- r_Phot References for JHKL photometry + 78-105 A28 --- r_Class References describing the Spectrum +-------------------------------------------------------------------------------- +Note (1): The classes indicate the major source of near-IR emission: + N: from the nebular gas + D: from the dust + S: from a star, either the exciting star or a companion + P: Possibly proto-planetary nebula +-------------------------------------------------------------------------------- + +Byte-by-byte Description of file: radio.dat +-------------------------------------------------------------------------------- + Bytes Format Units Label Explanations +-------------------------------------------------------------------------------- + 1- 10 A10 --- PNG Designation of the Galactic Planetary Nebula + 13 A1 --- l_Rad2cm Limit flag on Rad2cm + 14- 19 F6.1 mJy Rad2cm ? Radio flux density at 2cm (14.7GHz) + 21- 28 A8 --- r_Rad2cm Reference of Rad2cm + 30 A1 --- l_Rad6cm Limit flag on Rad6cm + 31- 36 F6.1 mJy Rad6cm ? Radio flux density at 6cm (5GHz) + 37 A1 --- u_Rad6cm Uncertainty flag on Rad6cm + 39- 46 A8 --- r_Rad6cm Reference of Rad6cm +-------------------------------------------------------------------------------- + +Byte-by-byte Description of file: vel.dat +-------------------------------------------------------------------------------- + Bytes Format Units Label Explanations +-------------------------------------------------------------------------------- + 1- 10 A10 --- PNG Designation of the Galactic Planetary Nebula + 13- 18 F6.1 km/s RVel ? Radial Velocity + 21- 24 F4.1 km/s e_RVel ? Mean error on RVel + 26- 33 A8 --- r_RVel Source of the Radial Velocity + 36 A1 --- l_ExpVel Limit flag on ExpVel + 37- 40 F4.1 km/s ExpVel ? Expansion velocity [OIII] + 41 A1 --- u_ExpVel [*] Note on ExpVel (1) + 43- 50 A8 --- r_ExpVel Source of ExpVel + 53 A1 --- n_ExpVel [+-] Note on the elements (2) + 56 A1 --- l_ExpVel2 Limit flag on ExpVel2 + 57- 60 F4.1 km/s ExpVel2 ? Expansion velocity [NII] + 61 A1 --- u_ExpVel2 [*] Note on ExpVel2 (1) + 63- 70 A8 --- r_ExpVel2 Reference of ExpVel2 + 73 A1 --- n_ExpVel2 [+-] Note on the elements (2) +-------------------------------------------------------------------------------- +Note (1): The '*' indicates that the value is derived from another ion + (neither [OIII] nor [NII]) +Note (2): This flag has the following meaning: + '+' when expansion velocity from other ions are given in the reference + '-' when no value was given in the source + +Byte-by-byte Description of file: cstar.dat +-------------------------------------------------------------------------------- + Bytes Format Units Label Explanations +-------------------------------------------------------------------------------- + 1- 10 A10 --- PNG Designation of the Galactic Planetary Nebula + 13- 18 A6 --- AG82 Name in ref. AG82 (Acker et al., + Publ. Speciale CDS 3, 1982) + 22- 26 F5.2 mag Umag ? Johnson's U filter mag. of central star + 28 A1 --- l_Bmag Limit flag on Bmag + 29- 33 F5.2 mag Bmag ? Johnson's B filter mag. of central star + 36 A1 --- l_Vmag Limit flag on Vmag + 37- 41 F5.2 mag Vmag ? Johnson's V filter mag. of central star + 44 A1 --- Quality [ABCDP] Accuracy of the photometry (1) + 47- 72 A26 --- r_UBV References of Photometry + 75-101 A27 --- Remarks Remarks on Photometry + 103-116 A14 --- Sp Spectral type of central star + 117-124 A8 --- r_Sp Reference of Spectral type + 126-135 A10 --- Sp2 Other spectral classification + 138-145 A8 --- r_Sp2 Reference of Sp2 + 147-156 A10 --- Sp3 Other spectral classification + 161-168 A8 --- r_Sp3 Reference of Sp3 + 170-285 A116 --- Names Various designations of the Central Star + separated by a semi-colon (;) +-------------------------------------------------------------------------------- +Note (1): The Quality are defined as follows: + A = mean error < 0.10 + B = 0.10 < mean error < 0.25 + C = 0.25 < mean error < 0.5 + D = 0.5 < mean error + P = derived from photographs; mean error about 1mag. +-------------------------------------------------------------------------------- + +Byte-by-byte Description of file: notes.dat +-------------------------------------------------------------------------------- + Bytes Format Units Label Explanations +-------------------------------------------------------------------------------- + 1- 10 A10 --- PNG Designation of the Galactic Planetary Nebula + 13-115 A103 --- Text Text of the note +-------------------------------------------------------------------------------- + +Byte-by-byte Description of file: pospn.dat +-------------------------------------------------------------------------------- + Bytes Format Units Label Explanations +-------------------------------------------------------------------------------- + 1- 15 A15 --- Name Usual name + 17 A1 --- n_PK [*] The '*' indicates that PK was not + published in the PK67 reference + 18- 26 A9 --- PK Designation in PK67 (or later, see n_PK) + 29- 30 I2 h RAh Right Ascension J2000 (hours) + 32- 35 F4.1 min RAm Right Ascension J2000 (minutes) + 37 A1 --- DE- Declination J2000 (sign) + 38- 39 I2 deg DEd Declination J2000 (degrees) + 41- 42 I2 arcmin DEm Declination J2000 (minutes) + 45- 50 F6.2 deg GLON Galactic longitude + 52- 57 F6.2 deg GLAT Galactic latitude + 60- 62 A3 --- Class [UHPLNE?*2 ] Class of the object (1) + 65-111 A47 --- OtherNames separated by a comma (,) +-------------------------------------------------------------------------------- +Note (1): the class has the following meaning: + U = no spectrum could be detected + H = faint object highly reddened showing a weak H-alpha emission + H2? = faint object showing IRAS colours typical of a HII region + *? = object with a faint continuum + ** = object of unclear status with a well known emission line spectrum + PN = possibly high or normal excitation planetary nebula + PPN = proto-planetary nebula + LE = low-excitation nebula + +Byte-by-byte Description of file: notpn.dat +-------------------------------------------------------------------------------- + Bytes Format Units Label Explanations +-------------------------------------------------------------------------------- + 1- 15 A15 --- Name Usual name + 17 A1 --- n_PK [*] The '*' indicates that PK was not + published in the PK67 reference + 18- 26 A9 --- PK Designation in PK67 (or later, see n_PK) + 29- 30 I2 h RAh [0/24[? Right Ascension J2000 (hours) (1) + 32- 35 F4.1 min RAm [0/60[? Right Ascension J2000 (minutes) + 37 A1 --- DE- Declination J2000 (sign) + 38- 39 I2 deg DEd [0/90[? Declination J2000 (degrees) + 41- 42 I2 arcmin DEm [0/60[? Declination J2000 (minutes) + 45- 50 F6.2 deg GLON [0/360[? Galactic longitude + 52- 57 F6.2 deg GLAT [-90/90]? Galactic latitude + 60-121 A62 --- Notes *Notes concerning the object +-------------------------------------------------------------------------------- +Note (1): coordinates are blank when several PK designations have + been assigned to the same PN, as e.g. PK 358-1 1 and PK 358-1 3 +Note on Notes: + * (a) see Acker et al., =1987A&AS...71..163A + * (b) see Acker & Stenholm, =1990A&AS...86..219A + * (c) see Acker et al., 1991, =1991A&AS...87..499A + * Note 1 on Al 2-E: this PK number (359+ 3 4) was first given to the + object Wray 11-88 by Allen in 1979 (Obs. 93, 83) and then used by + MacConnel in 1983 (Vatican Obs. Publ. 2, n.5, 63). The object Wray + 17-88 was not detected as having any emission line and is this not + a PN. Kohoutek in 1983 gives the designation 359+3 4 to the object + Al 2-E found by Allen and this should be used, although Allen + himself gives 359+3 5. +-------------------------------------------------------------------------------- + +Byte-by-byte Description of file: refs.dat +-------------------------------------------------------------------------------- + Bytes Format Units Label Explanations +-------------------------------------------------------------------------------- + 1- 8 A8 --- Ref Reference code (repeated on each line) + 9- 80 A72 --- Text Text if reference (authors and titles) +-------------------------------------------------------------------------------- + +History: + * 18-Nov-1997: Two errors corrected about DHW PNe in main and pospn. + * 03-Nov-2000: file refs.dat reformatted. +================================================================================ +(End) Francois Ochsenbein [CDS] 21-Dec-1994 diff --git a/astro_data/perek_kohoutek/diam.dat b/astro_data/perek_kohoutek/diam.dat new file mode 100644 index 000000000..22954afdb --- /dev/null +++ b/astro_data/perek_kohoutek/diam.dat @@ -0,0 +1,1143 @@ +000.0-06.8 | 0. 91.30002 +000.1+02.6 | 9. 91.30002 +000.1+04.3 |< 5. 67.30013 | 1.8 ZPB 89 +000.1+17.2 | 4.6 71..9065 | 1.8 89..1570 +000.1-01.1 | 3.6 88..3092, 71..9065 +000.1-02.3 | 9.0 88..3092, 88..2065 +000.1-05.6 | 12.4 88..3092, 71..9065 +000.2-01.9 | 8.2 88..3092, 71..9065 | 5. 89..1570 +000.2-04.6 | 6.4 88..2065 +000.3+06.9 | 11.6 91..3001 +000.3+12.2 | 8.4 71..9065 | 5.5 90..1502 +000.3-02.8 | 0. 91.30002 +000.3-04.6 | 4.8 88..2065, 71..9065 +000.4-01.9 | 6.6 88..3092, 88..2065 | 16.4 91..1533 +000.4-02.9 | 5.7 88..3092, 71..9065 | 7. 89..1570 +000.5-01.6 | 0. CS 90 +000.5-03.1 | 8.2 88..2065 +000.6-01.3 | 3.0 88..3092 +000.6-02.3 | 0. CS 90 +000.7+03.2 | 5.2 71..9065 | 5. ZPB 89 +000.7+04.7 | 2.7 77..1552 | 1.5 88.30862 +000.7-02.7 | 7.2 88..3092, 88..2065 +000.7-03.7 | 7.3 88..3092, 88..2065, 71..9065 +000.7-07.4 | 5. : 91.30002 +000.8-01.5 | 0. 91.30002 +000.8-07.6 | 4. : 91.30002 +000.9-02.0 | 5.2 88..3092, 88..2065 +000.9-04.8 | 11.4 88..2065, 71..9065 | 12. 89..1570 +001.0+01.9 | 37. 71..9065 | 46. 89..1570 +001.0-02.6 | 5.2 88..3092, 88..2065 +001.1-01.6 | 6.0 88..3092 +001.2+02.1 | 4. 71..9065 | 3.1 89..1570 +001.2-03.0 |< 5. 67.30013 | 2.5 ZPB 89 +001.2-03.9 | 4.0 88..2065 +001.3-01.2 | 4.2 71..9065 | 4.5 89..1570 +001.4+05.3 | 5. 71..9065 | 4.3 89..1570 +001.4-03.4 | 13. 85..3143 +001.5-06.7 |< 5. 67.30013 | 1.3 90..1502 +001.6-01.3 | 4.5 88..3092, 88..2065 +001.7+05.7 | 6.6 71..9065 | 6.5 89..1570 +001.7-01.6 | 0. CS 90 +001.7-04.4 |< 5. 67.30013 | 2.5 ZPB 89 +001.7-04.6 | 3. 71..9065 | 2.5 ZPB 89 +001.8-03.8 | 12. 85..3143 +002.0-02.0 | 6.0 88..3092 +002.0-06.2 | 5.8 88..3092, 88..2065, 90.00001| 4. ZPB 89 +002.0-13.4 | 7.5 71..9065, 87...536 | 1.6 84..2631 +002.1+03.3 | 0. CS 90 | 4.8 88.30862 +002.1-02.2 | 6.6 88..3092, 88..2065 +002.1-04.2 | 4.8 88..3092, 88..2065, 90.00001| 1.2 ZPB 89 +002.2+00.5 | 28. 91.30002 +002.2-02.5 | 5.4 88..2065 +002.2-02.7 | 8.5 88..3092, 88..2065 | 0.7 ZPB 89 +002.2-06.3 | 7.0 88..3092, 88..2065 |< 2.2 89..1570 +002.2-09.4 | 7. CK 88 | 7. 89..1570 +002.3+02.2 | 8. 91.30002 +002.3-03.4 | 4.2 88..2065, 71..9065 +002.3-07.8 | 14.2 71..9065 +002.4+05.8 | 38. 87...536 +002.4-03.2 | 12. 91.30002 +002.4-03.7 |< 3.3 67.30013 | 3.5 ZPB 89 +002.5-01.7 | 5.1 88..3092, 71..9065 +002.5-05.4 | 17.1 88..2065 +002.6+02.1 | 11. 91.30002 +002.6+04.2 | 10. : 91.30002 | 3.2 91..1533 +002.6+08.1 | 6.4 CK 88 | 6. 89..1570 +002.6-03.4 | 0. CS 90 | 2.5 ZPB 89 +002.7-04.8 | 9.0 88..2065, 71..9065 | 9.0 89..1570 +002.7-52.4 | 113. 87...536 +002.8+01.7 | 3.8 71..9065 +002.8+01.8 | 10. 91.30002 +002.8-02.2 | 5. 71..9065 +002.9+06.5 | |< 4. 88.30862 +002.9-03.9 | 3.7 88..2065 +003.0-02.6 | 3.0 88..2065 +003.1+02.9 | 6.2 67.30013 | 7.5 89..1570 +003.1+03.4 | 3.6 71..9065 | 4. 89..1570 +003.2-04.4 | 2.8 88..2065 +003.2-06.2 | 8.1 88..3092, 88..2065, 71..9065 +003.3-04.6 | 12. 71..9065 +003.3-07.5 | 7.8 88..2065 +003.4-04.8 | 9. 71..9065 +003.5-02.4 | 14.8 87...536, 71..9065 | 17. 89..1570 +003.5-04.6 | 13.6 88..3092, 88..2065, 71..9065| 1.5 84..2631 +003.6+03.1 | 0. CS 90 | 2.2 88.30862 +003.6-02.3 | 9.2 88..3092, 71..9065 +003.7+07.9 | 4.2 71..9065 +003.7-04.6 | 9.0 88..3092, 88..2065 | 3.5 89..1570 +003.8+05.3 | 4.4 71..9065 | 3.4 89..1570 +003.8-04.3 | 6.0 88..3092, 71..9065 +003.8-04.5 | 8.1 88..3092, 88..2065, 71..9065 +003.8-17.1 | 5. 71..9065 | 0.8 ZPB 89 +003.9+01.6 | 8. 91.30002 +003.9-02.3 | 4.5 88..2065, 71..9065 | 4.4 89..1570 +003.9-03.1 | 5.0 88..2065 +003.9-14.9 | 4. 71..9065 +004.0-03.0 | 3.6 88..2065, 90.00001 | 3.5 89..1570 +004.0-05.8 | 9.6 88..3092, 88..2065, 71..9065 +004.0-11.1 | 8.2 71..9065 +004.1-03.8 | 3.2 88..2065 +004.2-03.2 | 6.0 88..2065 +004.2-04.3 | 5.7 88..2065, 71..9065 +004.2-05.9 | 7.2 71..9065 +004.3+01.8 | 4.6 71..9065 +004.3-02.6 | 0. CS 90 +004.5+06.8 | 5.4 PK 67 +004.6+06.0 | 8.6 71..9065 | 4.7 89..1570 +004.7-11.8 | 13. 71..9065 +004.8+02.0 | 4.4 71..9065 | 4.9 91..1533 +004.8-05.0 | 8.6 88..3092, 88..2065, 71..9065 +004.8-22.7 |< 10. 67.30013 +004.9+04.9 | 4.6 71..9065 | 3.2 90..1502 +004.9-04.9 | 3.8 71..9065 +005.0+03.0 | 12.4 71..9065 +005.0+04.4 | 5.2 71..9065 | 0.8 89..1570 +005.0-03.9 | 11.8 88..3092, 88..2065, 71..9065 +005.1-03.0 | 6.3 88..3092, 88..2065 +005.1-08.9 | 18.6 71..9065 +005.2+04.2 | 0. CS 90 +005.2+05.6 | 6. 71..9065 | 7.5 89..1570 +005.2-18.6 |< 5. 91.30002 +005.4-01.9 | 0. 91.30002 |< 1.6 88.30862 +005.5+02.7 | 0. 91.30002 |< 2. 91..1533 +005.5+06.1 | 7.2 71..9065 | 7. 89..1570 +005.5-02.5 | 10.2 71..9065 +005.5-04.0 | 6.6 88..2065, 71..9065 +005.6-04.7 | 12.4 88..2065 +005.7-03.6 | 14.2 88..2065 +005.7-05.3 | 9.3 88..3092, 88..2065, 71..9065| 7.4 91..1533 +005.8+05.1 | 16.8 71..9065 | 18. 89..1570 +005.8-06.1 | 8.0 88..3092, 88..2065, 71..9065| 5. 89..1570 +005.9-02.6 | 10. 78..1561 +006.0+02.8 | 0. 91.30002 +006.0+03.1 | 14.8 71..9065 +006.0-03.6 | 5.1 88..3092, 88..2065, 90.00001| 4. ZPB 89 +006.0-41.9 | 8.2 89.13504 +006.1+08.3 |< 7. 91.30002 | 1.9 90..1502 +006.2+01.0 | 12. 85..1131 +006.2-03.7 | 8.5 88..2065 +006.3+03.3 | 6.2 71..9065 +006.3+04.4 | 3.8 71..9065 | 3. ZPB 89 +006.4+02.0 | 0. CS 90 | 7.0 89..1570 +006.4-04.6 | 6.6 88..3092, 88..2065, 71..9065 +006.5-03.1 | 0. 91.30002 +006.7-02.2 | 8.4 71..9065 +006.8+02.0 | 3.8 71..9065 +006.8+02.3 |< 6. CS 90 | 7.9 91..1533 +006.8+04.1 | 4.2 71..9065 | 5. ZPB 89 +006.8-03.4 | 4.6 71..9065 +006.8-08.6 | 13. 77..1548 +006.8-19.8 | 0. CS 90 +007.0+06.3 | 6.4 71..9065 +007.0-06.0 | 8.2 71..9065 | 6.5 89..1570 +007.0-06.8 |< 7. 67.30013 | 3.7 89..1570 +007.2+01.8 | 5. 71..9065 | 6. 89..1570 +007.5+04.3 | 0. CS 90 +007.5+07.4 | 9. 71..9065 | 6. 89..1570 +007.6+06.9 | 7. 71..9065 +007.8-03.7 | 8.4 71..9065 +007.8-04.4 | 8. : CS 90 | 2.5 ZPB 89 +007.9+10.1 | 0. 78..1561 +008.0+03.9 | 33. 71..9065 |> 34. ZPB 89 +008.1-04.7 | 3.2 71..9065 +008.2+06.8 |< 10. 67.30013 | 1. 90..1502 +008.2-04.8 | 3.8 71..9065 +008.3-01.1 | 5. 71..9065 | 4.3 89..1570 +008.3-07.3 | 2.6 71..9065, 87...536 | 3. ZPB 89 +008.4-03.6 | 7.6 71..9065 +008.6-02.6 | 0. 78..1561 +008.6-07.0 | 3. : 91.30002 +008.8+05.2 | 19. 71..9065 | 5.6 91..1533 +009.0+04.1 | 6.4 71..9065 | 7. 89..1570 +009.3+02.8 | 0. CS 90 +009.3+04.1 | 0. CS 90 | 5. 91..1533 +009.4-05.0 | 15.5 71..9065, 87...536 +009.4-09.8 | 6. 71..9065 | 7.5 89..1570 +009.6+10.5 | 18.4 71..9065 +009.6+14.8 | 15.5 67.30013, 71..9065, 85.30011| 30.6 91..1533 +009.6-10.6 | 5. 71..9065 | 6. 89..1570 +009.8-04.6 | 5.6 71..9065 | 6.8 91..1533 +009.8-07.5 | 8.5 89...191 +010.1+00.7 | 10. 71..9065 |> 9. ZPB 89 +010.4+04.5 | 6.4 71..9065 | 8. 89..1570 +010.6+03.2 | 0. 91.30002 +010.7+07.4 | 10. 91.30002 | 3.2 91..1533 +010.7-06.4 | 4. 71..9065, 85.30011, 87...536| 1.2 84..2631 +010.7-06.7 | 7.6 71..9065 | 5.6 91..1533 +010.8+18.0 | 17.2 71..9065 | 46. 89..1570 +010.8-01.8 | 8.5 87...536, 71..9065 +011.0+05.8 | 5. 87...536, 71..9065 | 4. 90..1502 +011.0+06.2 | 5.8 71..9065 | 7.5 89..1570 +011.0-05.1 | 4.6 71..9065 | 5.5 89..1570 +011.1+07.0 | 0. CS 90 +011.1+11.5 |< 7. 91.30002 | 1.5 90..1502 +011.3+02.8 |< 5. 67.30013 +011.3-09.4 | 2. 71..9065 | 1.7 89..1570 +011.7-00.0 | 5.2 71..9065 +011.7-00.6 | 7.6 71..9065, 87...536 +011.7-06.6 | 0. 91.30002 +011.9+04.2 | 7.6 71..9065 | 9. 89..1570 +012.2+04.9 | 4. 90..1005 +012.5-09.8 | 3.6 71..9065 | 1.5 91..1533 +012.6-02.7 | 0. CS 90 | 2.5 ZPB 89 +013.0-04.3 | 5. 71..9065 +013.1+04.1 | 4.8 71..9065 | 3.8 89..1570 +013.3+32.7 | 6. : 91.30002 | 3. 90..1502 +013.4-03.9 | 4.8 71..9065 | 5.5 89..1570 +013.7-10.6 | 15. : CS 90 +013.8-02.8 | 110. 87..1594 +013.8-07.9 | 13.2 71..9065 +014.0-05.5 | 0. 77..1548 +014.2+04.2 | 6. 91.30002 +014.2-07.3 | 7. : CS 90 | 0.9 89..1570 +014.3-05.5 | 0. 77..1548 | 1. 90..1502 +014.6-04.3 | 5.6 71..9065 +014.7-11.8 | 85. 87..1594 +014.8-25.6 | 46. 87..1593 +014.9+06.4 | 24.6 71..9065 +014.9-03.1 | 13. : 91.30002 +015.4-04.5 | 6. 71..9065 +015.6-03.0 | 53. 71..9065 +015.9+03.3 |< 5. 67.30013 | 4. 89..1570 +016.0+13.5 | 60. 71..9065 +016.0-04.3 | 13. 71..9065 +016.1-04.7 |< 10. 67.30013 | 1.4 89..1570 +016.4-01.9 | 11. 71..9065 | 12. 89..1570 +016.9-02.0 | 0. CS 90 +017.3-21.9 | 100. 71..9065 +017.6-10.2 | 67. 71..9065 +017.7-02.9 | 6.6 71..9065 | 8. 89..1570 +017.9-04.8 | 17.2 71..9065 | 22. 89..1570 +018.0+20.1 | 5. 85.30011 | 8. 89..1570 +018.6-02.2 | 0. CS 90 | 5.5 90..1502 +018.9+03.6 | 0. CS 90 | 1.3 90..1502 +018.9+04.1 | 11.6 71..9065 +019.2-02.2 | 0. CS 90 | 1.2 90..1502 +019.4-05.3 | 0. CS 90 | 1.8 90..1502 +019.4-13.6 | 32. 80..1011 +019.4-19.6 | 140. 71..9065 +019.7+03.2 | 3.9 67.30013 | 1.3 89..1570 +019.7-04.5 |< 10. CS 90 | 2.5 90..1502 +019.8+05.6 | 3. 89.50014 +019.8-23.7 | 267. 71..9065 +019.9+00.9 | 4.6 71..9065 +020.2-00.6 | 285. 71..9065 +020.7-05.9 | 8. 91.30002 | 5.6 90..1502 +020.9-01.1 | 9.5 71..9065 | 15. 89..1570 +021.1-05.9 | 4.2 71..9065 +021.2-03.9 | 17. 77..1547 +021.7-00.6 | 7.2 71..9065 +021.8-00.4 | 9. 71..9065 | 5. 89..1570 +022.0-03.1 | 6.4 71..9065 +022.1-02.4 | 8.4 71..9065 | 8. 89..1570 +022.5+01.0 | 17. 78..1561 +022.5+04.8 | 10. 91.30002 +023.0+04.3 |< 5. 91.30002 +023.3-07.6 | 10. 78..1561 +023.8-01.7 | 0. CS 90 | 3. 90..1502 +023.9+01.2 | 0. 91.30002 +023.9-02.3 | 4.6 71..9065 | 4.8 90..1502 +024.1+03.8 | 5. 71..9065 | 5.5 89..1570 +024.2+05.9 | 44. 71..9065 | 47. 89..1570 +024.2-05.2 | 21. 67.30013 +024.3-03.3 | 5. 71..9065 +024.8-02.7 | 4.4 71..9065 +025.0-11.6 | 74. 71..9065 +025.3+40.8 | 13. 87...536, 71..9065 +025.3-04.6 | 0. CS 90 +025.4-04.7 | 90. 87...536 | 109. 89..1570 +025.8-17.9 | 20. 87...536, 71..9065 +025.9-00.9 | 4.6 71..9065 +025.9-02.1 | 5. 71..9065 | 4.8 90..1502 +025.9-10.9 | 16. : CS 90 +026.0-01.8 | 3. 71..9065 | 2.5 90..1502 +026.3-02.2 | 7.6 71..9065 +026.5-03.0 | 4.4 71..9065 | 4.3 89..1570 +026.6-01.5 | 20. : CS 90 +027.3-02.1 | 6.8 71..9065 | 1.2 89..1570 +027.3-03.4 | 35. 71..9065 +027.4-03.5 |< 15. CS 90 | 4. 90..1502 +027.6+04.2 |< 15. CS 90 | 1.5 90..1502 +027.6+16.9 | 94. 80..1011 +027.6-09.6 | 2. 71..9065 | 2.9 90..1502 +027.7+00.7 | 6.4 71..9065 | 7.5 89..1570 +028.0+10.2 | 36. 81..1143 +028.2-04.0 | 6.4 71..9065 +028.5+01.6 | 7.4 71..9065 | 8. 89..1570 +028.5+05.1 |< 10. CS 90 | 2.8 90..1502 +028.7+02.7 |< 8. CS 90 | 6.3 90..1502 +028.7-03.9 | 8.6 71..9065 +029.0+00.4 | 40. 71..9065 +029.2-00.0 | 5.6 91..3001 | 6. 88...328 +029.2-05.9 | 20.5 87...536, 71..9065 +029.8-07.8 | 14. 88..1266 +030.6+06.2 | 400. 83.28034, 83..3100 +030.8+03.4 | 16. 71..9065 +031.0+04.1 | 0. CS 90 | 0.74 90..1502 +031.0-10.8 | 5.6 71..9065 | 8. 89..1570 +031.2+05.9 | 9.2 71..9065 | 11. 89..1570 +031.3-00.5 | 25. 85..1131 +031.7+01.7 |< 10. CS 90 +031.9-00.3 | 30. 81..1143 +032.0-03.0 | 4. 71..9065 | 0.9 89..1570 +032.1+07.0 | 14. 91.30002 | 2.7 90..1502 +032.5-03.2 | 0. CS 90 +032.7+05.6 | 11.8 71..9065 +032.7-02.0 |< 10. CS 90 | 2.7 90..1502 +032.9+07.8 |< 8. CS 90 | 5. 90..1502 +032.9-02.8 | 0. CS 90 | 1.2 90..1502 +033.0-05.3 | 62. 71..9065 | 48. 89..1570 +033.1-06.3 | 64. 71..9065 | 90. 89..1570 +033.2-01.9 | 0. 91.30002 +033.8-02.6 | 8. 87...536, 71..9065 | 6. ZPB 89 +034.0+02.2 | 0. CS 90 | 3.7 90..1502 +034.1-10.5 | 47. 87..1593 +034.3+06.2 | 9.8 71..9065 +034.5-06.7 | 15.8 71..9065 +034.6+11.8 | 10.8 87...536, 71..9065 | 8. ZPB 89 +035.1-00.7 | 32.8 71..9065 +035.7-05.0 | 10. 91.30002 +035.9-01.1 | 100. 71..9065 | 114. 89..1570 +036.0+17.6 | 80. 71..9065 +036.1-57.1 | 980. 87...536 | 660. 89..1570 +036.9-01.1 | 12. 85..1131 +036.9-02.6 | 21. 85..1131 +037.5-05.1 | 40. 71..9065 +037.7-34.5 | 28.5 87...536, 71..9065 +037.8-06.3 | 7. 87...536, 67.30013 | 1.8 90..1502 +037.9-03.4 | 181. 71..9065 +038.1-25.4 | 42. 71..9065 +038.2+12.0 | 4.5 81..1008 | 3.7 84..2631 +038.4-03.3 | 0. CS 90 +038.7+01.9 | 304. 71..9065 +038.7-03.3 | 0. CS 90 +039.5-02.7 | 6.4 71..9065 | 6. 89..1570 +039.8+02.1 | 14.8 71..9065 | 8. 89..1570 +040.3-00.4 | 31. 71..9065 +040.4-03.1 | 0. CS 90 | 3.3 90..1502 +041.2-00.6 | 18. 85..1131 +041.8+04.4 | 0. CS 90 |< 0.3 90..1502 +041.8-02.9 | 108. 67.30013, 71..9065, 87...536| 130. 89..1570 +042.0+05.4 | 0. CS 90 | 1. 90..1502 +042.5-14.5 | 28. 87...536, 67.30013 +042.9-06.9 | 2. 71..9065 | 0.8 90..1502 +043.0-03.0 | 7.4 71..9065 | 7. 89..1570 +043.1+03.8 | 3.6 71..9065 | 4.0 89..1570 +043.1+37.7 | 16.2 71..9065 +043.3+02.2 | 14. 90..1004 +043.3+11.6 | 1. CK 88 +043.5-13.4 | 67. 71..9065 +044.0+05.2 | 8. : CS 90 | 4. 90..1502 +044.1+05.8 | 0. 90..1004 +044.3+10.4 | 135. 78.10519 +044.3-05.6 | 12. 91.30002 +045.4-02.7 | 14. 91.30002 | 0.5 ZPB 89 +045.6+01.5 | 0. CS 90 +045.6+24.3 | 47. 71..9065 +045.7-04.5 | 35. 87...536, 71..9065 +045.9-01.9 | 0. CS 90 | 1.1 90..1502 +046.3-03.1 | 12. : CS 90 | 9.0 90..1502 +046.4-04.1 | 5.5 87...536, 71..9065 | 2.4 84..2631 +046.8+02.9 | 10. 90..1004 +046.8+03.8 | 600. 90..1004 +047.0+42.4 | 174. 71..9065 +047.1+04.1 | 7.2 71..9065 +047.1-04.2 | 161. 71..9065 +048.0-02.3 | 10. 91.30002 | 8.0 90..1502 +048.1+01.1 | 0. CS 90 | 1. 90..1502 +048.5+04.2 | 0. CS 90 | 3. 90..1502 +048.7+01.9 | 4.2 71..9065 +048.7+02.3 | 6.2 71..9065 +048.7-01.5 | 40. 80..1011 +049.3+88.1 | 2.7 81..1008 +049.4+02.4 | 9.6 71..9065 | 8. 89..1570 +050.1+03.3 | 81. 71..9065 | 90. 89..1570 +050.4+05.2 | 37. 71..9065 +050.4-01.6 | 0. CS 90 | 0.6 90..1502 +051.0+02.8 | 0. 86..2788 +051.0+03.0 |< 5. 91.30002 | 1.7 90..1502 +051.0-04.5 | 20. : CS 90 +051.3+01.8 | 20. 90..2003 +051.4+09.6 | 2.6 81..1008 | 1.8 90..1502 +051.5+06.1 | 45. 71..9065 +051.9+25.8 | 43. 71..9065 +051.9-03.8 | 5. 71..9065 | 6. 89..1570 +052.2+07.6 | 30. : 91.30002 +052.2-04.0 |< 5. 91.30002 | 1.0 89..1570 +052.5-02.9 |< 8. 91.30002 | 4.7 89..1570 +052.9+02.7 | 0. CS 90 | 1.5 90..1502 +052.9-02.7 | 0. CS 90 | 0.5 90..1502 +053.2-01.5 | 4. 71..9065 | 4.7 89..1570 +053.3+03.0 | 87. 71..9065 | 75. 89..1570 +053.3+24.0 | 4.6 71..9065 +053.8-03.0 | 40. 71..9065 +054.1-12.1 | 15. 71..9065 +054.4-02.5 |< 10. 67.30013 | 0.7 90..1502 +055.1-01.8 | 2.8 71..9065 +055.2+02.8 | 5. CK 88 | 2.3 90..1502 +055.3+02.7 | 5.4 71..9065 | 8. 89..1570 +055.3+06.6 | 56. 71..9065 +055.4+16.0 | 63. 71..9065 +055.5-00.5 | 3.8 67.30013 | 2.9 89..1570 +055.6+02.1 | 5. 67.30013 | 4.7 89..1570 +056.0+02.0 | 0. CS 90 | 1.7 90..1502 +056.4-00.9 | 3.4 71..9065 | 1.2 90..1502 +056.8-06.9 | 15. : CS 90 +057.2-08.9 | 5. 71..9065, 87...536 | 5. 89..1570 +057.9-01.5 | 5. : 91.30002 | 1.2 90..1502 +058.3-10.9 | 1.6 81..1008, 71..9065 | 1.6 84..2631 +058.6+06.1 | 37. 71..9065 +058.6-05.5 | 150. 81..1143 +058.9+01.3 | 0. CS 90 | 4. 90..1502 +059.0+04.6 | 9.6 71..9065 +059.0-01.7 | 8. 67.30013 +059.4+02.3 | 0. CS 90 | 2.5 90..1502 +059.7-18.7 | 127. 71..9065 +059.9+02.0 | 0. CS 90 | 1. 90..1502 +060.0-04.3 | 38. 71..9065 +060.1-07.7 | 5.5 87...536, 71..9065 +060.3-07.3 | 29. 87...536, 71..9065 +060.4+01.5 | 0. 91.30001 +060.5+01.8 | 3. : 91.30002 | 2.2 90..1502 +060.5-00.3 | 6.8 71..9065 +060.8-03.6 | 402. 87...536, 67.30013 +061.0+08.0 | 16.4 71..9065 +061.3+03.6 | 7.2 71..9065 +061.4-09.5 | 40. 71..9065, 87...536 +061.8+02.1 |< 10. 67.30013 | 0.4 90..1502 +061.9+41.3 | 0.6 87..2542 | 1. 90..1502 +062.4+09.5 | 40. 71..9065, 87...536 +062.4-00.2 | 8. 67.30013 | 3.1 89..1570 +063.1+13.9 | 76. 87...536, 67.30013 +063.8-03.3 | 0. CS 90 | 0.8 90..1502 +064.6+48.2 | 23. 87...536, 67.30013 +064.7+05.0 | 7.5 87...536, 71..9065 | 8. ZPB 89 +064.9+15.5 | 17.2 71..9065 +064.9-02.1 |< 6. CS 90 | 0.8 90..1502 +065.0-27.3 | 1. 67.30013 | 3. ZPB 89 +065.1-03.5 | 24. 77..1547 +065.2-05.6 | 18.8 71..9065 +065.9+00.5 | 57. 87...536, 67.30013 | 36. 89..1570 +066.7-28.2 | 94. 87...536, 71..9065 +066.9+02.2 | 12. : CS 90 +066.9-05.2 | 5. 67.30013 | 5. 89..1570 +067.9-00.2 | 0. CS 90 | 0.7 90..1502 +068.3-02.7 |< 5. 91.30002 | 1.3 90..1502 +068.6+01.1 | 22.4 71..9065 +068.7+01.9 | 0. CS 90 | 3. 90..1502 +068.7+03.0 | 5. : 91.30002 | 2.1 89..1570 +068.7+14.8 | 0. 85..3129 +068.8-00.0 | 14.6 71..9065 +069.2+02.8 |< 3. 91.30002 |< 0.2 90..1502 +069.2+03.8 | 23. 71..9065 +069.4-02.6 | 40. 87...536, 67.30013 | 55. 89..1570 +069.6-03.9 | 7.8 71..9065 +069.7-00.0 | 5. : 91.30002 | 8.2 90..1502 +071.6-02.3 |< 5. 67.30013 | 1.5 90..1502 +072.1+00.1 |< 6. 91.30002 | 6.3 90..1502 +072.7-17.1 | 830. 71..9065 +073.0-02.4 | 4.3 72..9045 |< 0.2 90..1502 +074.5+02.1 | 4. 81..1008, 67.30013, 71..9065| 2.6 90..1502 +075.6+04.3 | 28. 71..9065 +075.7+35.8 | 13. 83..3101 +076.3+01.1 | 22. 67.30013 +076.4+01.8 |< 6. 72..9045 +077.5+03.7 | 5.6 72..9045 +077.6+14.7 | 200. 71..9065 +077.7+03.1 | 3.5: 72..9045 +078.3-02.7 | 20. 72..9045 +078.5+18.7 | 27. 71..9065 +078.6+05.2 | 20. 72..9045 +078.9+00.7 | 7.6 72..9045 +079.6+05.8 | 15.2 71..9065 +079.9+06.4 | 4. 71..9065 +081.2-14.9 | 107. 71..9065 +082.1+07.0 | 6. 81..1008, 67.30013, 71..9065| 3.1 84..2631 +082.5+11.3 | 2. 71..9065 | 0.5 90..1502 +083.5+12.7 | 25. 71..9065 +083.9-08.4 | 10. : 91.30002 +084.0+09.5 | 16. 72..9045 +084.2+01.0 | 27. 72..9045 +084.2-04.2 | 5.8 72..9045 +084.9+04.4 | 157. 71..9065 +084.9-03.4 | 14. 87...536 | 15. ZPB 89 +086.1+05.4 | 190. 77..1547 +086.5-08.8 | 8.3 81..1008 | 1.7 84..2631 +087.4-03.8 | 35. 77..1548 +088.7+04.6 | 3.2 72..9045 | 4.8 89..1570 +088.7-01.6 | 61. 87...536, 71..9065 | 70. 89..1570 +089.0+00.3 | 20. 71..9065, 87...536 +089.3-02.2 | 7. 71..9065 | 8. 89..1570 +089.8-00.6 | 35. 71..9065 +089.8-05.1 | 1.2 81..1008 | 1.5 90..1502 +091.6+01.8 | 25. 77..1547 +091.6-04.8 | 8. 91.30002 +092.1+05.8 | 11.5 72..9045 +093.3-00.9 | 19. 72..9045 | 25. 89..1570 +093.3-02.4 | 33. 71..9065 | 30. 89..1570 +093.4+05.4 | 86. 87...536, 71..9065 | 95. 89..1570 +093.5+01.4 | 6.4 71..9065 | 3.8 84..2631 +094.0+27.4 | 114. 71..9065 | 94. 89..1570 +094.5-00.8 | 6. : 91.30002 | 5. 89..1570 +095.1-02.0 |< 8. CS 90 | 2.5 90..1502 +095.2+00.7 | 3. : 91.30002 | 2.5 90..1502 +095.2+07.8 | 73. 71..9065 +096.3+02.3 | 6.1 67.30013 | 6. 89..1570 +096.4+29.9 | 19.5 87...536, 71..9065 | 15. 75...238 +097.5+03.1 | 40. 67.30013 +097.6-02.4 | 4. 71..9065 | 4.5 89..1570 +098.1+02.4 | 7. 71..9065 +098.2+04.9 | 3. : 91.30002 | 1.9 90..1502 +100.0-08.7 |< 5. 91.30002 | 1.2 90..1502 +100.6-05.4 | 6.6 87...536, 71..9065 | 2.0 84..2631 +101.8+08.7 | 56. 71..9065 | 57. 89..1570 +102.8-05.0 | 135. 71..9065 +102.9-02.3 | 54. 71..9065 +103.2+00.6 | 39. 71..9065 +103.7+00.4 | 14. 71..9065 | 14. 89..1570 +104.1+01.0 | 0. 91.30002 | 1.6 90..1502 +104.1+07.9 | 77. 87...536, 71..9065 +104.2-29.6 | 320. 71..9065 +104.4-01.6 | 14.8 71..9065 | 20. 89..1570 +104.8-06.7 | 4. : 91.30002 +106.5-17.6 | 17. 87...536 | 26. 89..1570 +107.4-00.6 | 0. CS 90 +107.4-02.6 | 3.5 72..9045 | 6. 89..1570 +107.6-13.3 | 4.2 81..1008, 71..9065 | 4.6 89..1570 +107.7+07.8 | 900. 87..1248 +107.7-02.2 | 8. 71..9065 | 8. 89..1570 +107.8+02.3 | 23. 87...536 +108.4-76.1 | 3. 78...119 +110.1+01.9 | 5.5 89.13501 +110.6-12.9 | 33. 71..9065 +111.0+11.6 | 530. 80..1011 +111.2+07.0 | 6. : 72..9045 | 10. 89..1570 +111.8-02.8 | 1. 81..1008 | 0.7 90..1502 +112.5+03.7 | 5.1 72..9045 +112.5-00.1 | 3.8 72..9045 +112.9-10.2 | 120. 67.30013 +113.6-06.9 | 47. 67.30013 +114.0-04.6 | 94. 71..9065 | 81. 89..1570 +116.2+08.5 | 39. 71..9065 | 40. 89..1570 +117.5+18.9 | 28.5 87...536 +118.0-08.6 | 5.2 SK 85 | 6. 90..1502 +118.7+08.2 | 63. 67.30013 +118.8-74.7 | 245. 87...536, 71..9065 | 280. 89..1570 +119.3+00.3 | 18. : 91.30002 +119.4+06.5 | 47. 71..9065 +119.6-06.7 | 5. 71..9065 | 10. 89..1570 +120.0+09.8 | 48. 83..2756 +120.2-05.3 | 720. 77..1191 +121.6+03.5 | 19. 77..1547 +121.6-00.0 | 40. : CS 90 +122.1-04.9 | 36. 87...536 +123.6+34.5 | 10. 87...536 +124.0+10.7 | 270. 87..1593 +124.3-07.7 | 150. 81..1143 +125.9-47.0 | 275. 71..9065 +126.3+02.9 | 9. 72..9045 | 10. 89..1570 +128.0-04.1 | 340. 82.13501 +129.2-02.0 | 195. 77..1548 +129.5+04.5 | 10. 72..9045 +130.2+01.3 | 13. 87...536, 71..9065 +130.3-11.7 | 6. 71..9065 | 5. 89..1570 +130.4+03.1 | 12.2 72..9045 +130.9-10.5 | 67. 67.30013 | 100. 89..1570 +131.4-05.4 | 24. : 91.30002 +131.5+02.6 | 60. 71..9065 +132.4+04.7 | 10. 72..9045 +133.1-08.6 | 18. : 91.30002 +136.1+04.9 | 186. 71..9065 | 190. 89..1570 +136.3+05.5 | 500. 82..1158 +138.1+04.1 | 340. 87..1593 +138.8+02.8 | 35. 87...536 +141.7-07.8 | 127. 71..9065 +142.1+03.4 | 7.1 72..9045 | 10. 88...536 +143.6+23.8 | 111. 84..3036 +144.3-15.5 | 20. 71..9065 +144.5+06.5 | 52. 87...536, 71..9065 +146.7+07.6 | 4. 85.30011 | 4. 89..1570 +147.4-02.3 | 4. 71..9065 | 6.0 90..1502 +147.8+04.1 | 6.1 87...536 | 7. 89..1570 +148.4+57.0 | 170. 87...536, 71..9065 | 170. 89..1570 +149.0+04.4 | 0. 69...260 | 0.25 90..1502 +149.4-09.2 | 540. 87..1593 +149.7-03.3 | 780. 87..1248 +151.4+00.5 | 7.5 69...260 +153.7+22.8 | 105. 87...536 +153.7-01.4 | 2. 69...260 | 5. 90..1502 +156.9-13.3 | 34. 87..1593 +158.8+37.1 | 270. 71..9065 +158.9+17.8 | 1200. 80..1019 +159.0-15.1 | 7. 87...536, 71..9065 | 7.0 90..1502 +160.5-00.5 | 92. 77..1547 +161.2-14.8 | 8.6 87...536, 71..9065 | 9. 90..1502 +163.1-00.8 | 115. 77..1547 +164.8+31.1 | 380. 71..9065 +165.5-06.5 | 0. 69...260 | 2.2 90..1502 +165.5-15.2 | 132. 87...536 | 160. 89..1570 +166.1+10.4 | 8.5 67.30013 | 7. 75...238 +166.4-06.5 | 12. 77..1548 | 1.0 89..1570 +167.0-00.9 | 60. 71..9065 +167.4-09.1 | 0. 69...260 | 2.1 90..1502 +170.3+15.8 | 22. 87..3004 +170.7+04.6 | 0. 69...260 | 0.45 90..1502 +171.3-25.8 | 38. 71..9065 +173.5+03.2 | 20. 80..1015 +173.7+02.7 | 30. : CS 90 | 30. 85..2007 +173.7-05.8 | 132. 71..9065 +174.2-14.6 | 20. 82.20401 | 17. 89..1570 +178.3-02.5 | 10. 69...260 | 12. 89..1570 +181.5+00.9 | 65. 78..1082 +183.8+05.5 | 135. 81..1143 +184.0-02.1 | 2. 82.20401 | 2.3 90..1502 +184.6+00.6 | 1.8 69...260 | 1.5 90..1502 +184.8+04.4 | 3.1 69...260 +189.1+19.8 | 44. 71..9065 +189.8+07.7 | 8.8 71..9065 | 11. 89..1570 +190.3-17.7 | 6.4 71..9065 | 7.1 90..1502 +192.5+07.2 | 76. 87..1593 +193.6-09.5 | 24. 82.20401 +194.2+02.5 | 9. 67.30013 | 6. 90..1502 +196.6-10.9 | 19. 87...536, 71..9065 +197.2-14.2 | 34. 71..9065 | 20. 89..1570 +197.4-06.4 | 925. 83...109 +197.8+17.3 | 19.5 87...536 +197.8-03.3 | 33. 71..9065 +198.6-06.3 | 37. 67.30013 | 35. 89..1570 +200.7+08.4 | 67. 71..9065 +201.7+02.5 | 0. 69...260 | 2.2 90..1502 +201.9-04.6 | 40. 77..1547 +204.0-08.5 | 153. 71..9065 +204.1+04.7 | 415. 71..9065 +204.8-03.5 | 10.5 69...260 +205.1+14.2 | 615. 66..9017 +205.8-26.7 | 0. 82..1530 +206.4-40.5 | 21. 87...536 +208.5+33.2 | 127. 71..9065 +210.0+03.9 | 230. 77..1548 +210.3+01.9 | 18. 71..9065 +211.2-03.5 |< 5. 67.30013 | 2.9 89..1570 +211.4+18.4 | 94. 87..1593 +211.9+22.6 | 170. 84..3036 +212.0+04.3 |< 12. CS 90 | 2.3 90..1502 +214.9+07.8 | 67. 71..9065 +215.2-24.2 | 12. 87...536, 71..9065, 87..1248 +215.5-30.8 | 760. 71..9065 +215.6+03.6 | 52. 71..9065, 87...536 +215.6+11.1 | 84. 67.30013 +216.0-00.2 | 73. 71..9065 +216.3-04.4 | 15. 77..1547 +217.1+14.7 | 355. 71..9065 | 296. 89..1570 +217.4+02.0 | 15. 79..3002 +218.9-10.7 | 94. 87..1593 +219.1+31.2 | 970. 71..9065 +220.3-53.9 | 385. 87...536, 71..9065 | 370. 89..1570 +221.3-12.3 | 9. 87...536, 71..9065 +221.5+46.3 | 720. 84..3036 +221.7+05.3 | 12.2 71..9065 +224.3+15.3 | 165. 71..9065 +224.9+01.0 | 62. 77..1547 +226.4-03.7 |< 10. CS 90 +226.7+05.6 | 3. 67.30013 | 3.6 90..1502 +228.2-22.1 | 132. 80..2605 +228.8+05.3 | 3. 67.30013 | 2.5 90..1502 +229.6-02.7 | 62. 71..9065 +231.4+04.3 | 30. 71..9065 +231.8+04.1 | 64. 87...536 | 80. 89..1570 +232.0+05.7 | 0. 77..1548 +232.4-01.8 | 10. 67.30013 +232.8-04.7 | 0. 71..9065 | 2.2 90..1502 +233.0-10.1 | 55. 87..1594 +233.5-16.3 | 34. 71..9065 +234.3-06.6 | 63. 71..9065 +234.8+02.4 | 16. 67.30013 | 18. 89..1570 +234.9-01.4 | 0. CS 90 | 4.7 90..1502 +235.3-03.9 | 0. CS 90 | 1.8 90..1502 +236.0-10.6 | 148. 87..1593 +236.7+03.5 | 37. 71..9065 +238.0+34.8 | 270. 71..9065 +238.9+07.3 | 40. 75..9025 +239.6+13.9 | 38. 87...536 | 49. 89..1570 +239.6-12.0 | 24. 82.20401 +240.3+07.0 | 8. 73..9018 +240.3-07.6 | 7.6 71..9065 +241.0+02.3 | 13.8 71..9065 +242.6-11.6 | 11.2 71..9065 | 11. 89..1570 +243.3-01.0 | 19. 71..9065 +243.8-37.1 | 23. 90..1006 +244.5+12.5 | 400. 71..9065 +245.4+01.6 | 6.8 71..9065 | 7. 89..1570 +248.7+29.5 | 290. 71..9065 +248.8-08.5 | 6.2 71..9065 | 6. 89..1570 +249.0+06.9 | 0. 77..1548 +249.3-05.4 | 54. 71..9065 +250.3+00.1 | 40. 71..9065 +251.1-01.5 | 28. 71..9006 +252.6+04.4 | 43. 71..9065 +253.5+10.7 | 58. 71..9065 +253.9+05.7 | 8.2 71..9065 | 11. 89..1570 +254.6+00.2 | 56. 75...211 +255.3-59.6 | 373. 77..2615 +255.7+03.3 | 20. : CS 90 +257.1-02.6 | 8. 91.30002 +257.5+00.6 | 61. 73..9025 +258.0-15.7 | 82. 77..2615 +258.1-00.3 | 4.4 71..9065 +259.1+00.9 | 65. 71..9065 +260.7+00.9 | 36. 88.30003 +260.7-03.3 | 60. : CS 90 +261.0+32.0 | 25. 87...536 +261.6+03.0 | 24. 71..9065 +261.9+08.5 | 50. 71..9065, 87...536 +262.6-04.6 | 20. 80..2605 +263.0-05.5 | 3. 71..9065 +263.2+00.4 | 170. 71..9006 +263.3-08.8 | 24. 82.20401 +264.1-08.1 | 45. 71..9065 +264.4-03.6 | 60. : CS 90 +264.4-12.7 | 3. 71..9065 +265.1-02.2 |< 5. 67.30013 +265.1-04.2 | 28. 80..2605 +265.7+04.1 | 13. 87...536, 71..9065 +268.4+02.4 |< 5. 67.30013 +269.7-03.6 | 7. 71..9065 +270.1+24.8 | 54. 77..1134 +272.1+12.3 | 30. 87...536 +272.4-05.9 | 110. 90..2581 +273.2-03.7 | 11. 71..9065 +273.6+06.1 | 90. 84.28020 +274.1+02.5 | 0. 91.30002 +274.3+09.1 | 48. 77..2615 +274.6+02.1 | 5. 67.30013 +274.6+03.5 | 23. 71..9065 +275.0-04.1 | 10.2 71..9065 +275.2-02.9 | 10. 71..9065 +275.2-03.7 | 5. 67.30013 +275.3-04.7 | 2.4 71..9065 +275.5-01.3 | 7. 71..9065 +275.8-02.9 | 14. 71..9065 +277.1-03.8 | 90. 71..9065 +277.7-03.5 | 110. 73..9025 +278.1-05.9 | 14. 71..9065 +278.5-04.5 | 35. 71..9065 +278.6-06.7 | 0. CS 90 +278.8+04.9 | 11. 71..9065 +279.6-03.1 | 22. 71..9065 +280.0+02.9 | 20. : CS 90 +281.0-05.6 | 2. 71..9065 +282.9+03.8 | 14. 71..9065 +283.3+03.9 | 11.8 71..9065 +283.6+25.3 | 180. 71..9006 +283.8+02.2 | 7.6 71..9065 +283.8-04.2 | 10.4 71..9065 +283.9+09.7 | 300. 82.20401 +283.9-01.8 | 21. 71..9065 +285.4+01.5 | 3. 71..9065 +285.4+02.2 | 0. CS 90 +285.4-01.1 | 90. : 91.30002 +285.4-05.3 | 9. 71..9065 +285.6-02.7 |< 5. 67.30013 +285.7+01.2 | 5. 71..9065 +285.7-14.9 | 9. 87...536 +286.0-06.5 | 0. CS 90 +286.2-06.9 | 60. : CS 90 +286.3+02.8 | 18. 71..9065 +286.3-04.8 | 16. 71..9065 +286.5+11.6 | 215. 77..2615 +286.8-29.5 | 46. 77..1134 +288.4+00.3 | 25. 71..9065 +288.4-02.4 | 8. 71..9065 +288.7+08.1 | 36. 77..1548 +288.8-05.2 | 9.1 67.30013 +288.9-00.8 | 72. 67.30013 +289.6-01.6 | 20. 71..9065 +289.8+07.7 | 3. 71..9065 +290.1-00.4 | 19. 71..9065 +290.5+07.9 | 16. 71..9065 +291.3-26.2 | 0. 88.30003 +291.4+19.2 | 32. 80..2605 +291.6-04.8 | 5. 87...536 +291.7+03.7 | 8.4 71..9065 +292.4+04.1 | 5. 71..9065 +292.6+01.2 | 45. 71..9065 +292.7+01.9 | 12. : 91.30002 +292.8+01.1 |< 5. 67.30013 +293.6+01.2 | 35. 71..9065 +293.6+10.9 | 82. 75...826 +294.1+14.4 | 62. 77..2615 +294.1+43.6 | 63. 87...536 +294.6+04.7 | 19. 71..9065 +294.9-00.6 | 68. 67.30013 +294.9-04.3 | 0. CS 90 +295.3-09.3 | 0. CS 90 +296.3-03.0 | 4. 71..9065 +296.4-06.9 |< 5. 67.30013 +296.6-20.0 | 42. 87...536, 71..9065 +297.4+03.7 | 3. 71..9065 +298.0+34.8 | 7. 76...525 +298.1-00.7 | 22. 87..1248 +298.2-01.7 | 17.8 71..9065 +298.3-04.8 | 63. 71..9065 +299.0+18.4 | 42. 71..9006 +299.4-04.1 | 72. 85..1131 +299.5+02.4 | 24. 71..9065 +299.8-01.3 | 6.4 71..9065 +300.2+00.6 | 5.6 71..9065 +300.4-00.9 | 28. 71..9065 +300.5-01.1 | 10.2 71..9065 +300.7-02.0 | 3.6 71..9065 +300.8-03.4 | 18. 77..1548 +302.2+02.5 | 12. 77..1548 +302.3-01.3 | 75. 90..1202 +302.6-00.9 | 48. 73..9025, 77..2615 +303.6+40.0 | 770. 71..9065 | 700. 89..1570 +304.2+05.9 | 36. 77..1548 +304.5-04.8 | 5. 67.30013 +304.8+05.1 |< 10. 67.30013 +305.1+01.4 |< 10. 67.30013 +305.6-13.1 | 72. 77..1548 +305.7-03.4 | 24. 77..1548 +306.4-00.6 | 23. 71..9065 +307.2-03.4 | 140. 71..9065 +307.2-09.0 |< 5. 67.30013 +307.3+05.0 | 18. 77..1548 +307.5-04.9 | 4. CK 88 +308.2+07.7 | 18. 90..2581 +308.6-12.2 | 31. 71..9065 +309.0+00.8 | 4. 71..9065 +309.0-04.2 | 17. 71..9065 +309.1-04.3 | 6. 71..9065 +309.2+01.3 | 68. 73..9025, 76..9003 +309.5-02.9 | 0. 78..1561 +310.3+24.7 | 115. 77..1134, 77..2615 +310.4+01.3 +310.7-02.9 | 20. 71..9065 +310.8-05.9 | 16. 80..2605 +311.0+02.4 | 65. 76..9003 +311.1+03.4 | 0. CS 90 +311.4+02.8 | 9. 71..9065 +312.3+10.5 | 12.5 71..9065, 87...536 +312.6-01.8 | 10. 71..9065 +313.8-12.6 | 112. 80..2605 +315.0-00.3 | 32. 87...536 +315.1-13.0 | 6. 71..9065 +315.4+05.2 | 7.4 71..9065 +315.4+09.4 |< 5. 67.30013 +315.7+05.5 | 19. 80..2605 +315.7-01.2 | 28. 80..2605 +316.1+08.4 | 11. 71..9065 +316.3-01.3 | 54. 80..2605 +317.1-05.7 | 53. 71..9065 +317.8+03.3 | 45. 73..9025 +318.3-02.0 | 37. 71..9065 +318.3-02.5 | 51. 71..9065 +318.4+41.4 | 370. 71..9065 | 360. 89..1570 +318.4-03.0 | 20. 82.20401 +319.2+06.8 | 14.6 71..9065 +319.6+15.7 | 35. 67.30013 +320.1-09.6 | 7. 71..9065 +320.3-28.8 |< 10. 67.30013 +320.9+02.0 |< 5. 67.30013 +321.0+03.9 | 0. 91.30002 +321.0+08.3 | 27. 90..2581 +321.0-03.8 | 12. 85..1131 +321.3+02.8 | 3. 71..9065 +321.3-16.7 |< 5. 91.30002 +321.8+01.9 | 27. 71..9065 +322.1-06.6 |< 10. 67.30013 +322.4-00.1 | 1.6 71..9065 +322.4-02.6 | 26. 71..9065 +322.5-05.2 | 8. 71..9065 +323.1-02.5 | 18. 71..9065 +323.9+02.4 | 4.6 71..9065 +324.0+03.5 | 27. 89..1351 +324.1+09.0 | 18. 77..1548 +324.2+02.5 | 3. 71..9065 +324.8-01.1 | 4. 71..9065 +325.0+03.2 | 1.6 71..9065 +325.4-04.0 | 14. 71..9065 +325.8+04.5 |< 5. 67.30013 +325.8-12.8 | 3. 88..1056 +326.0-06.5 | 3. 88..1056 +326.1-01.9 | 12. 79.....2 +326.7+42.2 | 42. 87...536, 67.30013 +327.1-01.8 | 2.6 71..9065 +327.1-02.2 | 3.6 71..9065 +327.5+13.3 |< 5. 67.30013 +327.7-05.4 | 14.2 89.30812 +327.8+10.0 | 14. 71..9065 +327.8-01.6 | 5.2 71..9065 +327.8-06.1 | 2. 71..9065 +327.8-07.2 | 20. 71..9065 +327.9-04.3 | 0. 91.30002 +328.2+01.3 | 12. 77..2615 +328.9-02.4 | 22. 71..9065 +329.0+01.9 | 72. 71..9065 +329.3-02.8 | 23. 71..9065 +329.4-02.7 | 3. 71..9065 +329.5+01.7 | 100. 73..9025 +329.5-02.2 | 24. 83.30015 +330.2+05.9 | 107. 77..1134, 77..2615 +330.6-02.1 | 13. 71..9065 +330.6-03.6 | 10. 71..9065 +330.7+04.1 |< 1. 87..1248 +330.9+04.3 | 15. 91.30002 +331.0-02.7 | 3. CK 88 +331.1-05.7 |< 5. 67.30013 +331.3+16.8 | 7. 71..9065 | 1.1 84..2631 +331.4+00.5 | 10.5 71..9065 +331.4-03.5 | 5. 88..1056 +331.5-02.7 | 10. 71..9065 +331.5-03.9 | 50. 71..9065 +331.7-01.0 | 25. 71..9065 +332.0-03.3 | 16. 71..9065 +332.2+03.5 | 8. : 91.30002 +332.3-04.2 |< 5. 67.30013 +332.8-16.4 | 36. 85..1131 +332.9-09.9 | 0. 91.30002 +333.4+01.1 | 11. 71..9065 +333.4-04.0 | 42. 85..1131 +334.3-01.4 | 17. 90..2581 +334.3-09.3 | 16.5 71..9065 +334.8-07.4 | 0. 77..1548 +335.2-03.6 | 23. 85..1131 +335.4+09.2 | 29. 77..1134 +335.4-01.1 | 22. 71..9065 +335.5+12.4 | 180. 83...423 +335.6-04.0 | 24. 90..2581 +335.9-03.6 | 8.8 90..2581 +336.2+01.9 | 12. 67.30013 +336.2-06.9 | 7. 71..9065 +336.3-05.6 | 3. 71..9065 +336.8-07.2 | 38. 77..1134 +336.9+08.3 | 0. 91.30002 +336.9-11.5 | 60. 90..2581 +337.4+01.6 |< 5. 67.30013 +337.4-09.1 | 18. 77..1548 +337.5-05.1 | 6. 71..9065 +337.6-04.2 | 17. 90..2581 +338.1-08.3 | 12.5 71..9065, 87...536 +338.8+05.6 | 14.5 71..9065 +339.9+88.4 | 525. 80..2605 +340.4-14.1 | 11. : 91.30002 +340.8+10.8 | 79. 77..1134, 77..2615 +340.8+12.3 | 60. 77..1134, 77..2615 +340.9-04.6 | 0. 77..1548 +341.2-24.6 | 43. 77..2615 +341.5-09.1 | 0. 91.30002 +341.6+13.7 | 40. 87...536 | 42. 89..1570 +341.8+05.4 | 24. 71..9065, 87...536 +342.1+10.8 | 70. 71..9065 +342.1+27.5 | 6. 71..9065 | 7. 90..1502 +342.5-14.3 | 35.5 67.30013 +342.7+00.7 | 16. 71..9065 +342.8-06.6 | 8. 91.30002 +342.9-02.0 | 19. 71..9065 +342.9-04.9 | 35. 67.30013 +343.0-01.7 | 0. CS 90 +343.3-00.6 | 120. 85..1131 +343.4+11.9 | 2.4 71..9065 +343.5-07.8 | 5. 71..9065 +343.6+03.7 | 20. 80..1013 +343.9+00.8 | 5.2 71..9065 +344.2+04.7 | 0. CS 90 +344.2-01.2 | 12. 71..9065 +344.4+02.8 | 0. 91.30002 +344.4-06.1 | 0. CS 90 +344.8+03.4 | 0. 91.30002 +345.0+03.4 | 5. : 91.30002 +345.0+04.3 | 0. 91.30002 +345.0-04.9 |< 5. 67.30013 +345.2-01.2 | 8.5 67.30013 +345.2-08.8 | 9.6 67.30013 +345.3-10.2 | 55. 90..2581 +345.4+00.1 | 18.5 71..9065 +345.5+15.1 | 71. 77..2615 +345.6+06.7 | 6.6 71..9065 +345.9+03.0 | 20. : 91.30002 +345.9-11.2 | 24. 77..1548 +346.0+08.5 |< 10. 67.30013 +346.2-08.2 | 13. 67.30013 +346.3-06.8 |< 5. 67.30013 +346.9+12.4 | 92. 67.30013 +347.4+05.8 | 0. 91.30002 | 0.8 89..1570 +347.7+02.0 | 0. 91.30002 +348.0+06.3 | | 3.8 90..1016 +348.0-13.8 | 5. 71..9065 +348.4-04.1 | 0. 91.30002 +348.8-09.0 | 3. 71..9065 +349.2-03.5 | 20. : 91.30002 | 15. 90..1016 +349.3-01.1 | 51. 87...536 +349.3-04.2 | 83. 77..2615 +349.5+01.0 | 44.5 71..9065 | 10. ZPB 89 +349.8+04.4 |< 5. 67.30013 | 2. ZPB 89 +350.1-03.9 | 18. 71..9065 +350.5-05.0 | 7.8 71..9065 +350.8-02.4 | 0. 91.30002 +350.9+04.4 | 5.6 71..9065 | 2.2 89..1570 +351.0-10.4 | 162. 85..1131 +351.1+04.8 | 8. : CS 90 | 2.6 89..1570 +351.2+05.2 | 5. 71..9065 | 5. ZPB 89 +351.3+07.6 | 0. CS 90 +351.6-06.2 | 8.6 71..9065 +351.7-10.9 | 8. 91.30002 +351.9+09.0 | 7. : 91.30002 +351.9-01.9 | 0. CS 90 +352.0-04.6 | 5.4 71..9065 +352.1+05.1 | 4.2 71..9065 | 3.7 89..1570 +352.6+00.1 | 6.8 71..9065 | 11. 89..1570 +352.6+03.0 | 3.4 71..9065 +352.8-00.2 | 9.6 71..9065 | 14. 89..1570 +352.9+11.4 | 23. 77..1134 +352.9-07.5 | 2. 71..9065 +353.2-05.2 | 7. 71..9065 +353.3+06.3 | 8. : CS 90 | 1.6 ZPB 89 +353.5-04.9 | 0. 91.30002 +353.7+06.3 | 7.8 71..9065 +353.7-12.8 | 30. CS 90 +354.2+04.3 | 4. 71..9065 | 4. ZPB 89 +354.4-07.8 | 12. 71..9065 +354.5+03.3 | 0. 91.30002 +354.9+03.5 | 0. 91.30002 +355.1+02.3 | 0. CS 90 +355.1-02.9 |< 5. 67.30013 | 0.7 ZPB 89 +355.1-06.9 |< 5. 67.30013 +355.2-02.5 | 0. CS 90 +355.4-02.4 | 7.2 71..9065 | 2.8 89..1570 +355.4-04.0 | 9.4 71..9065 | 12. 89..1570 +355.6-02.7 |< 5. 67.30013 | 1. ZPB 89 +355.7-03.0 | 0. CS 90 | 2.7 89..1570 +355.7-03.4 | 0. 91.30002 +355.7-03.5 | 2. CK 88 | 1.1 89..1570 +355.9+02.7 | 0. CS 90 | 2. 89..1570 +355.9+03.6 | 7. : CS 90 | 0.7 89..1570 +355.9-04.2 |< 5. 67.30013 | 3.5 ZPB 89 +356.1+02.7 | 0. CS 90 |< 2. 88.30862 +356.1-03.3 | 4.5 71..9065 +356.2-04.4 | 2.4 CK 88 | 1.7 89..1570 +356.3-06.2 | 9.8 71..9065 +356.5+01.5 | 0. 91.30002 |< 9. 91..1533 +356.5+05.1 | 17. : 91.30002 +356.5-02.3 | 5.3 67.30013 | 8. 89..1570 +356.5-03.6 | 0. 91.30002 +356.5-03.9 |< 5. 67.30013 | 1.7 89..1570 +356.6-07.8 | 12.6 71..9065 +356.7-04.8 | 9.6 71..9065 +356.7-06.4 | 13.2 71..9065 +356.8+03.3 | 0. CS 90 | 1.2 88.30862 +356.8-05.4 | 10.8 71..9065 +356.8-11.7 | 104. 77..2615 +356.9+04.4 | 0. CS 90 | 1.8 89..1570 +356.9+04.5 | 15. : CS 90 | 2.7 89..1570 +356.9-05.8 | 6.8 71..9065 +357.0+02.4 | 6.6 71..9065 |< 5.2 88.30862 +357.1+01.9 | 0. 91.30002 +357.1+03.6 | 5.8 67.30013 | 4.7 89..1570 +357.1+04.4 | 8. 91.30002 |< 10. 88.30862 +357.1-04.7 | 2. CK 88 | 3. 89..1570 +357.1-06.1 | 4. 71..9065 +357.2+01.4 | 0. CS 90 +357.2+02.0 | 0. 91.30002 +357.2+07.4 | 8. : CS 90 | 1.4 ZPB 89 +357.2-04.5 | 5.8 71..9065 +357.3+03.3 | 4.3 67.30013 +357.3+04.0 | 4.5 71..9065 | 4.1 89..1570 +357.4-03.2 | 5.4 71..9065 | 2.2 89..1570 +357.4-03.5 |< 5. 67.30013 | 1.5 89..1570 +357.4-04.6 | 5.2 71..9065 | 5. 89..1570 +357.5+03.1 | 6. CS 90 | 4.5 ZPB 89 +357.5+03.2 | 5.3 67.30013 +357.6+01.0 | 30. 78..5001 +357.6+01.7 | 2.8 71..9065 | 2.5 ZPB 89 +357.6+02.6 | 0. CS 90 | 1.5 ZPB 89 +357.6-03.3 | 4.8 71..9065 +357.9-03.8 | 11.2 71..9065 +357.9-05.1 | 11.2 71..9065 +358.0+02.6 | 0. CS 90 +358.0+07.5 | 17. 91..3001 +358.0+09.3 | 10. : CS 90 +358.0-05.1 | 8.8 71..9065 +358.2+03.5 |< 5. 67.30013 | 2.0 89..1570 +358.2+03.6 | 3.2 71..9065 | 3. ZPB 89 +358.2+04.2 | 5.4 71..9065 | 2.9 89..1570 +358.2-01.1 | 13. 71..9065 +358.3+01.2 | 0. CS 90 +358.3+03.0 |< 5. 67.30013 | 0.9 89..1570 +358.3-02.5 | | 2.4 90..1016 +358.3-21.6 | 7. 71..9065 +358.4+03.3 | 0. 79.10517 | 0.6 ZPB 89 +358.5+02.6 | 37. 87..1593 +358.5+02.9 | 0. CS 90 +358.5+03.7 | 0. CS 90 +358.5+05.4 | 18. 71..9065 | 20. 89..1570 +358.5-02.5 | 7. 91.30002 | 5.7 89..1570 +358.5-04.2 | 0. 91.30002 | 1.2 89..1570 +358.5-07.3 | 47.5 71..9065 +358.6+01.8 | 0. CS 90 | 2. ZPB 89 +358.6+07.8 | 4.2 71..9065 | 3.2 89..1570 +358.6-05.5 | 9.2 71..9065 +358.7+05.2 | 0. CS 90 | 2.5 89..1570 +358.7-02.7 | 0. CS 90 +358.7-05.2 |< 10. 67.30013 | 1.4 89..1570 +358.8+03.0 | 6. 71..9065 | 6.5 89..1570 +358.8+04.0 | 0. CS 90 | 6. 89..1570 +358.8+04.1 | 70. 87..1594 | 60. :88.30862 +358.8-00.0 | 12. 91.30002 +358.9+03.2 | 4. 71..9065 | 3.3 89..1570 +358.9+03.4 | 0. CS 90 | 1.4 89..1570 +358.9-00.7 | 4.2 71..9065 +358.9-03.7 | 3.6 71..9065 +359.0+02.8 | 0. 79.10517 +359.0-04.1 | 4.9 88..3092, 71..9065 +359.0-04.8 | 14. 71..9065 +359.1+15.1 | 34. 71..9065 +359.1-01.7 | 7.6 88..3092, 88..2065, 71..9065| 7. 89..1570 +359.1-02.3 | 8.2 88..3092, 88..2065, 71..9065| 6.5 89..1570 +359.1-02.9 | 4.2 88..3092, 71..9065 +359.2+01.2 | 24. 80..1016 +359.2+04.7 | |< 3.3 90..1016 +359.2-33.5 | 8. 91.00001 +359.3+01.4 | 0. CS 90 +359.3+03.6 | 0. CS 90 +359.3-00.9 | 15. 67.30013 |> 13. ZPB 89 +359.3-01.8 | 4.4 88..3092, 71..9065 | 4. ZPB 89 +359.3-03.1 |< 5. 67.30013 | 2.9 89..1570 +359.4+02.3 | 0. CS 90 +359.4-03.4 | 6.2 88..3092, 88..2065, 71..9065 +359.5+02.6 | 0. CS 90 +359.6+02.2 | 0. CS 90 +359.6-04.8 | 9.9 88..2065 +359.7-01.8 | 6.0 88..3092, 88..2065, 71..9065| 6.6 90..1016 +359.7-02.6 | 3.8 88..3092, 88..2065, 90.00001| 1.3 ZPB 89 +359.7-04.4 | 13.5 88..2065 +359.8+02.4 | 6. CS 90 +359.8+03.7 | 7. : CS 90 | 1.8 89..1570 +359.8+05.2 | 8. 91..3001 +359.8+05.6 |< 5. 67.30013 | 4.4 88.30862 +359.8+06.9 | 10. 67.30013 | 11.2 91..1533 +359.8-07.2 |< 10. 67.30013 +359.9+05.1 | 17. 71..9065 | 17. 89..1570 +359.9-04.5 | 4.8 88..2065, 90.00001 | 2.5 ZPB 89 +359.9-05.4 | 11.8 88..2065 diff --git a/astro_data/perek_kohoutek/fetch_sources.sh b/astro_data/perek_kohoutek/fetch_sources.sh new file mode 100755 index 000000000..a06ddeb1b --- /dev/null +++ b/astro_data/perek_kohoutek/fetch_sources.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash +# +# Regenerate the vendored Perek-Kohoutek source snapshot. +# +# Run from this directory. Files are committed to the repo, so run this only +# when you want to refresh the snapshot; the catalog build reads the files, +# never the network. +# +# See PROVENANCE.md for what each file contains and which epoch it uses. + +set -euo pipefail + +cd "$(dirname "$0")" + +CDS="https://cdsarc.cds.unistra.fr/ftp" +SIMBAD="https://simbad.cds.unistra.fr/simbad/sim-tap/sync" + +# CDS throttles rapid consecutive requests and answers with an empty body, +# so pause between downloads. +fetch() { + local url="$1" out="$2" + echo "fetching ${url}" + curl -sS -f -o "${out}" "${url}" + sleep 2 +} + +fetch "${CDS}/IV/24/ReadMe" ReadMe_IV24 +fetch "${CDS}/V/84/ReadMe" ReadMe_V84 + +for spec in "IV/24/table2:table2.dat" "IV/24/table4:table4.dat" \ + "V/84/main:main.dat" "V/84/diam:diam.dat"; do + src="${spec%%:*}" + out="${spec##*:}" + fetch "${CDS}/${src}.dat.gz" "${out}.gz" + gunzip -f "${out}.gz" +done + +# Every SIMBAD object carrying a PK identifier, with its ICRS position. +echo "fetching SIMBAD PK positions" +curl -sS -f -X POST "${SIMBAD}" \ + --data-urlencode "REQUEST=doQuery" \ + --data-urlencode "LANG=ADQL" \ + --data-urlencode "FORMAT=tsv" \ + --data-urlencode "MAXREC=200000" \ + --data-urlencode "QUERY=SELECT i.id, b.main_id, b.ra, b.dec, b.otype \ + FROM ident i JOIN basic b ON i.oidref = b.oid \ + WHERE i.id LIKE 'PK %'" \ + -o simbad_pk.tsv +sleep 2 + +# Cross-identifications for those same objects, restricted to the designation +# families PiFinder has a catalog for. +echo "fetching SIMBAD PK cross-identifications" +curl -sS -f -X POST "${SIMBAD}" \ + --data-urlencode "REQUEST=doQuery" \ + --data-urlencode "LANG=ADQL" \ + --data-urlencode "FORMAT=tsv" \ + --data-urlencode "MAXREC=200000" \ + --data-urlencode "QUERY=SELECT i1.id AS pk_id, i2.id AS alias \ + FROM ident i1 JOIN ident i2 ON i1.oidref = i2.oidref \ + WHERE i1.id LIKE 'PK %' \ + AND (i2.id LIKE 'NGC %' OR i2.id LIKE 'IC %' OR i2.id LIKE 'M %' \ + OR i2.id LIKE 'PN A66%' OR i2.id LIKE 'SH 2-%')" \ + -o simbad_pk_aliases.tsv + +echo "done" +wc -l ./*.dat ./*.tsv diff --git a/astro_data/perek_kohoutek/main.dat b/astro_data/perek_kohoutek/main.dat new file mode 100644 index 000000000..1285cb91e --- /dev/null +++ b/astro_data/perek_kohoutek/main.dat @@ -0,0 +1,1143 @@ +000.0-06.8 |18 10 02.0 -32 20 34. 67.30013|H 1-62 |359-06 1 |18100-3220 |HARO 1952 |AS 290,ESO 456-76,He 2-367,MHa 77- 52,SaSt 2-19,VV' 368,Wray 16-389 +000.1+02.6 |17 32 27.2 -27 22 10. 79.10517|Al 2-J | |17322-2721 |ALLEN 1979 | +000.1+04.3 |17 26 17. -26 23 42. d 77..1552|H 1-16 | 0+04 2 |17262-2623 |HARO 1952 |ESO 520-02,He 2- 231,Sa 2-206,VV' 201,Wray 16- 276 +000.1+17.2 |16 40 54. -18 51 a 75..9016|PC 12 | 0+17 1 |16409-1851 |MINKOWSKI 1957 |ESO 586-01,He 2- 180,Sa 2-152 +000.1-01.1 |17 47 12.8 -29 24 29. 67.30013|M 3-43 | 0-01 1 |17472-2924 |MINKOWSKI 1948 |Bl G,ESO 455-48,VV' 265,19W122 +000.1-02.3 |17 52 09. -29 57 35. 77..1552|Bl 3-10 | 0-02 2 |17519-2957 |BLANCO 1964 |ESO 456-16,Sa 2-265 +000.1-05.6 |18 05 10. -31 37 54. * 76.26001|H 2-40 | 0-05 1 | |HARO 1952 |ESO 456-59,Sa 3-120,VV' 351,Wray 16- 374 +000.2-01.9 |17 50 34. -29 43 12. d 77..1552|M 2-19 | 0-01 5 |17505-2943 |MINKOWSKI 1947 |Bl N,ESO 456-07,He 2- 302,Sa 3- 88,VV 125,VV' 279,Wray 16- 325 +000.2-04.6 |18 01 30.2 -31 03 04. 66.30012|Wray 16-363 | | |WRAY 1966 |Sa 3-117 +000.3+06.9 |17 17 18. -24 48 54. * 90..2002|Trz 41 | | |TERZAN 1985 | +000.3+12.2 |16 58 34.00-21 45 14.0 90..1502|IC 4634 | 0+12 1 |16585-2145 |FLEMING 1893 |ARO 50,ESO 587- 01,He 2- 189,Sa 2-164,StWr 4- 1,VV 85,VV' 151 +000.3-02.8 |17 54 29.3 -30 01 45. 77..1552|M 3-47 | 0-02 5 | |MINKOWSKI 1948 |ESO 456-22,Sa 3-100,VV' 296 +000.3-04.6 |18 01 48. -30 58 30. d 77..1552|M 2-28 | 0-04 1 |18018-3058 |MINKOWSKI 1947 |ESO 456-49,He 2- 338,Sa 2-293,VV 144,VV' 336,Wray 16- 366 +000.4-01.9 |17 51 13.6 -29 35 38. 67.30013|M 2-20 | 0-01 6 |17512-2935 |MINKOWSKI 1947 |Bl P,ESO 456-12,He 2- 304,Sa 2-262,VV 127,VV' 282,Wray 16- 326 +000.4-02.9 |17 55 07.1 -30 00 27. 67.30013|M 3-19 | 0-02 6 |17551-3000 |MINKOWSKI 1948 |ESO 456-26,Sa 3-103,VV' 301,Wray 16- 339 +000.5-01.6 |17 50 13.7 -29 16 31. 79.10517|Al 2-Q | |17502-2916 |ALLEN 1979 | +000.5-03.1 |17 56 03.3 -30 02 38. 88..2065|KFL 1 | | |KINMAN et al 1988 | +000.6-01.3 |17 49 24. -29 05 54. d 81..1503|Bl 3-15 | 0-01 2 | |BLANCO 1964 |ESO 455-58 +000.6-02.3 |17 53 12.4 -29 37 42. 67.30013|H 2-32 | 0-02 3 | |HARO 1952 |Bl 3-12,ESO 456-20,Sa 3-98,VV' 290,Wra 16-232 +000.7+03.2 |17 31 47.75-26 34 01.3 83..1405|He 2-250 | 0+03 1 |17318-2634 |HENIZE 1964 |ESO 520-09,Th 3-66,Sa 3- 64,M 4- 5,Wray 17- 92 +000.7+04.7 |17 26 20.2 -25 47 03. 89..1570|H 2-11 | 0+04 1 |17263-2546 |HARO 1952 |ESO 520-04,VV' 200 +000.7-02.7 |17 54 57.8 -29 44 06. 76..9055|M 2-21 | 0-02 4 |17548-2944 |MINKOWSKI 1947 |ESO 456-24,He 2- 315,Sa 2-271,VV 131,VV' 300,Wray 16- 337 +000.7-03.7 |17 59 06. -30 14 24. d 77..1552|M 3-22 | 0-03 1 |17590-3014 |MINKOWSKI 1948 |ESO 456-39,H 1-48,Sa 2-283,VV' 320 +000.7-07.4 |18 14 21.5 -31 57 45. 80..1575|M 2-35 | 0-07 1 |18143-3158 |MINKOWSKI 1947 |ESO 457-04,He 2- 384,Sa 2-324,StWr 2-16,VV 168,VV' 384,Wray 16- 403 +000.8-01.5 |17 50 40. -28 58 48. d 77..1552|Bl O | 0-01 3 |17506-2858 |BLANCO 1961 |ESO 456-11,Sa 3- 90 +000.8-07.6 |18 15 22. -31 56 06. d 80..1575|H 2-46 | 0-07 2 |18152-3156 |HARO 1952 |ESO 457-07,Sa 2-327,VV' 388 +000.9-02.0 |17 52 50.7 -29 10 53. 76..9055|Bl 3-13 | 0-02 1 |17528-2910 |BLANCO 1964 |ESO 456-18,Sa 3- 94,Wray 16- 329 +000.9-04.8 |18 03 52. -30 34 36. d 77..1552|M 3-23 | 0-04 2 |18038-3034 |MINKOWSKI 1948 |ESO 456-54,He 2- 348,Sa 2-297,VV' 346,Wray 16- 370 +001.0+01.9 |17 37 20.4 -26 59 15. 67.30013|K 1- 4 | 1+01 1 |17374-2700 |KOHOUTEK 1962 |ESO 520-16,He 2- 264,Sa 3- 69,Wray 17-95 +001.0-02.6 |17 55 14. -29 20 36. d 76.26001|Sa 3-104 | |17552-2920 |SANDULEAK 1976 | +001.1-01.6 |17 51 41.4 -28 48 26. 76.26001|Sa 3- 92 | | |SANDULEAK 1976 |Al 2-S = PK 1-01 5 +001.2+02.1 |17 37 09. -26 42 48. d 76.26001|He 2-262 | 1+02 1 |17371-2641 |HENIZE 1964 |ESO 520-15,Sa 3- 68,Wray 17- 94 +001.2-03.0 |17 57 26.3 -29 21 46.3 83..1405|H 1-47 | 1-03 1 |17574-2921 |HARO 1952 |ESO 456-35,He 2- 323,VV' 312,Wray 16- 347 +001.2-03.9 |18 00 42. -29 51 36. d 85..3143|ShWi 2-5 | | |SHAW et al 1985 |KFL 5 +001.3-01.2 |17 50 37. -28 26 42. d 77..1552|Bl M | 1-01 1 |17506-2826 |BLANCO 1961 |ESO 456-10,Sa 3- 89,Wray 17- 101 +001.4+05.3 |17 25 33. -24 48 42. d 77..1552|H 1-15 | 1+05 2 | |HARO 1952 |ESO 520-01,He 2- 229,Sa 2-201,VV' 197,Wray 17- 84 +001.4-03.4 |17 59 16. -29 25 12. d 85..3143|ShWi 2-1 | | |SHAW et al 1985 | +001.5-06.7 |18 12 58.63-30 53 11.3 90..1502|SwSt 1 | 1-06 2 |18129-3053 |SWINGS et al 1940 |AS 295B,ESO 457-02,He 2-377,Sa 2-319,VV 164,VV' 378,Wray 16-397 +001.6-01.3 |17 51 25. -28 12 12. d 77..1552|Bl Q | 1-01 2 |17513-2812 |BLANCO 1961 |ESO 456-14,Sa 3- 91,Wray 17- 102 +001.7+05.7 |17 25 00. -24 22 54. d 67.30013|H 1-14 | 1+05 1 |17249-2423 |HARO 1952 |ESO 519-19,Sa 2-200,VV' 196 +001.7-01.6 |17 52 53. -28 13 48. d 77..1552|H 2-31 | 1-01 3 | |HARO 1952 |ESO 456-19,Sa 3- 95,VV' 288 +001.7-04.4 |18 04 02.7 -29 41 48.7 83..1405|H 1-55 | 1-04 1 | |HARO 1952 |ESO 456-56,He 2- 347,VV' 345,Wray 16- 373 +001.7-04.6 |18 04 41.9 -29 45 02.4 83..1405|H 1-56 | 1-04 2 |18047-2945 |HARO 1952 |ESO 456-57,He 3-1592,Sa 2-299,VV' 347 +001.8-03.8 |18 01 53. -29 19 42. d 85..3143|ShWi 2-7 | | |SHAW et al 1985 | +002.0-02.0 |17 55 12. -28 14 36. d 77..1552|H 1-45 | 2-02 1 |17552-2814 |HARO 1952 |ESO 456-27,He 2- 317,Sa 2-272,VV' 303,Wray 16- 340 +002.0-06.2 |18 11 53.8 -30 16 32. 76..9055|M 2-33 | 2-06 1 |18118-3016 |MINKOWSKI 1947 |ESO 456-80,He 2- 372,Sa 2-317,StWr 2-11,VV 162,VV' 375,Wray 16- 394 +002.0-13.4 |18 42 34.1 -33 23 52. 73..9034|IC 4776 | 2-13 1 |18425-3323 |FLEMING 1896 |ARO 522,ESO 396-02,He 2- 421,Sa 2-363,StWr 2-23,VV 204,VV' 446,Wray 16- 418,Y-C 2- 27 +002.1+03.3 |17 34 46.0 -25 19 01. 88.30862|PBOZ 24 | |17347-2519 |POTTASCH et al 1988 | +002.1-02.2 |17 56 09.7 -28 13 38. 76..9055|M 3-20 | 2-02 2 |17561-2813 |MINKOWSKI 1948 |ESO 456-32,He 2- 319,Sa 2-276,VV' 307,Wray 16- 343 +002.1-04.2 |18 03 56.1 -29 13 20. 76..9055|H 1-54 | 2-04 1 |18039-2913 |HARO 1952 |AS 272,ESO 456-55,He 2- 346,MHa 82- 21,Sa 2-298,VV' 344,Wray 16- 372 +002.2+00.5 |17 45 38.3 -26 42 34.7 89.30002|Te 2337 | | |TERZAN 1989 | +002.2-02.5 |17 57 50.1 -28 16 16. 88..2065|KFL 2 | | |KINMAN et al 1988 | +002.2-02.7 |17 58 32.7 -28 25 46. 76..9055|M 2-23 | 2-02 4 |17585-2825 |MINKOWSKI 1947 |ESO 456-34,He 2- 326,My 112,Sa 2-281,VV 136,VV'316,Wray 16- 350 +002.2-06.3 |18 13 06.1 -30 08 40. 73..9034|H 1-63 | 2-06 2 |18131-3008 |HARO 1952 |ESO 457-03,He 2- 380,Sa 2-321,VV' 381,Wray 15-1853 +002.2-09.4 |18 25 57.2 -31 32 00. 67.30013|Cn 1-5 | 2-09 1 |18259-3132 |CANNON 1921 |Em 1,ESO 457-12,He 2- 402,Sa 2-337,StWr 2-17,Wray 16- 412 +002.3+02.2 |17 39 24.2 -25 44 05.5 89.30002|Te 5 | | |TERZAN 1980 | +002.3-03.4 |18 01 18. -28 37 54. d 77..1552|H 2-37 | 2-03 2 | |HARO 1952 |ARO 268,ESO 456-46,Sa 2-291,VV' 333 +002.3-07.8 |18 19 21.2 -30 45 01. 76..9055|M 2-41 | 2-07 1 |18194-3045 |MINKOWSKI 1947 |ESO 457-10,He 2- 392,Sa 2-330,StWr 2-13,VV 176,VV' 397,Wray 16- 408 +002.4+05.8 |17 26 17.9 -23 43 12. 73..9034|NGC 6369 | 2+05 1 |17262-2343 |HERSCHEL 1784 |ARO 51,ESO 520- 03,He 2-232,My 101,Sa 2-207,VV 101,VV' 199,Wray 16- 277 +002.4-03.2 |18 00 54.6 -28 28 06. 66.30012|Wray 17-107 | | |WRAY 1966 |Sa 3-115 +002.4-03.7 |18 02 55.6 -28 40 54. 76..9055|M 1-38 | 2-03 5 |18029-2840 |MINKOWSKI 1946 |ESO 456-52,He 2- 344,SaSt 2-18,VV 148,VV' 340,Wray 16- 368 +002.5-01.7 |17 55 22.5 -27 36 52. 67.30013|Pe 2-11 | 2-01 1 | |PEREK 1960 |ESO 456-30,Sa 3-106,VV' 305 +002.5-05.4 |18 09 49.1 -29 26 02. 88..2065|KFL 14 | | |KINMAN et al 1988 | +002.6+02.1 |17 40 33.8 -25 35 26.8 89.30002|Te 1580 | | |TERZAN 1989 | +002.6+04.2 |17 32 54.6 -24 24 30. 76..9055|Th 3-27 | 2+04 1 |17329-2423 |THE 1964 |ARO 254,ESO 520-10,Sa 2-219 +002.6+08.1 |17 18 18. -22 16 a 80..1575|H 1-11 | 2+08 1 |17182-2215 |HARO 1952 |ESO 587-07,He 2- 214,Sa 2-189,VV' 180 +002.6-03.4 |18 02 16.0 -28 22 20.9 83..1405|M 1-37 | 2-03 3 |18022-2822 |MINKOWSKI 1946 |ESO 456-50,He 2- 339,VV 146,VV' 338,Wray 16- 367 +002.7-04.8 |18 07 54.0 -28 59 42. 73..9034|M 1-42 | 2-04 2 |18079-2859 |MINKOWSKI 1946 |ESO 456-67,He 2- 359,Sa 2-305,StWr 2- 8,VV 153,VV' 357,Wray 16- 380 +002.7-52.4 |21 56 30. -39 37 a 67.30013|IC 5148-50 | 2-52 1 |21565-3937 |HOFFMEISTER 1961 |ESO 344-05 +002.8+01.7 |17 42 35.6 -25 36 42. 76..9055|H 2-20 | 2+01 1 | |HARO 1952 |ESO 520-23,VV' 241,Wray 17- 97 +002.8+01.8 |17 42 22.6 -25 37 03.1 89.30002|Te 1567 | | |TERZAN 1989 | +002.8-02.2 |17 58 01. -27 38 24. d 77..1552|Pe 2-12 | 2-02 3 |17580-2738 |PEREK 1960 |ESO 456-36,Sa 3-110,VV' 314,Wray 17- 105 +002.9+06.5 |17 24 51.9 -22 54 53. 88.30862|PM 1-149 | | |PREITE-MARTINEZ 1988 |PBOZ 6 +002.9-03.9 |18 04 54. -28 24 a 75..9016|H 2-39 | 2-03 6 | |HARO 1952 |ESO 456-58,Sa 2-301,VV' 350 +003.0-02.6 |17 59 42.7 -27 41 08. 88..2065|KFL 4 | | |KINMAN et al 1988 | +003.1+02.9 |17 38 48.40-24 40 42.1 90..1502|Hb 4 | 3+02 1 |17388-2440 |HUBBLE 1921 |ARO 94,ESO 520-17,He 2- 266,Sa 2- 228,VV 110,VV' 232,Wray 16- 296 +003.1+03.4 |17 37 03.0 -24 24 11. 76..9055|H 2-17 | 3+03 1 |17370-2424 |HARO 1952 |ARO 257,ESO 520-14,He 2- 263,VV' 228,Wray 17- 93 +003.2-04.4 |18 07 21.0 -28 20 01. 88..2065|KFL 12 | | |KINMAN et al 1988 | +003.2-06.2 |18 14 31. -29 09 30. d 80..1575|M 2-36 | 3-06 1 |18144-2909 |MINKOWSKI 1947 |Em 5,ESO 457-05,He 2- 385,Sa 2- 325,StWr 2- 10,VV 169,VV' 385,Wray 16- 404 +003.3-04.6 |18 08 25.3 -28 23 21. 76..9055|Ap 1-12 | 3-04 7 |18084-2823 |APRIAMASVILI 1961 |AS 283,ESO 456-69,He 2- 360,MHa 304-120,,Wray 16- 381 +003.3-07.5 |18 19 57.2 -29 44 59. 88..2065|KFL 19 | | |KINMAN et al 1988 | +003.4-04.8 |18 09 38.2 -28 20 50. 83..1405|H 2-43 | 3-04 9 |18095-2820 |HARO 1952 |AS 288,ESO 456-75,He 2- 366,MHa 304-119,VV' 367,Wray 16- 388 +003.5-02.4 |18 00 10.0 -27 06 24. 73..9034|IC 4673 | 3-02 3 |18001-2706 |BARNARD 1896 |ESO 521-15,He 2- 333,M 1-36,Sa 2- 286,VV 142,VV' 330,Wray 16- 357 +003.5-04.6 |18 08 43.3 -28 11 23. 73..9034|NGC 6565 | 3-04 5 |18087-2811 |PICKERING 1880 |ARO 68,BD -28 14266,ESO 456-70,GCRV 10632,He 2- 362,HD 166468,Sa 2-307,StWr 2- 9,VV 155,VV' 360,Wray 16-382 +003.6+03.1 |17 38 54. -24 10 a 77..1552|M 2-14 | 3+03 2 |17389-2409 |MINKOWSKI 1947 |ESO 520-18,He 2- 267,Sa 2-229,VV 109,VV' 231,Wray 16- 297 +003.6-02.3 |18 00 04.2 -26 58 38. 67.30013|M 2-26 | 3-02 2 |18001-2659 |MINKOWSKI 1947 |ESO 521-14,He 2- 332,Sa 3-113,VV 139,VV' 322,Wray 17- 106? +003.7+07.9 |17 21 46.2 -21 31 04. 67.30013|H 2- 8 | 3+07 1 | |HARO 1952 |ESO 588-02,VV' 187 +003.7-04.6 |18 09 24.9 -27 59 01. 76..9055|M 2-30 | 3-04 8 |18094-2758 |MINKOWSKI 1947 |ESO 456-74,He 2- 365,VV 157,VV' 366,Sa 2-312,StWr 2- 7,Wray 16- 386 +003.8+05.3 |17 31 25.0 -22 51 22. 76..9055|H 2-15 | 3+05 1 |17314-2251 |HARO 1952 |ESO 520-08,He 2- 249,VV' 217 +003.8-04.3 |18 08 20.3 -27 46 59. 76..9055|H 1-59 | 3-04 3 | |HARO 1952 |ESO 456-68,Sa 2-306,StWr 2- 6,VV' 356 +003.8-04.5 |18 09 14.7 -27 53 01. 67.30013|H 2-41 | 3-04 4 |18092-2752 |HARO 1952 |ESO 456-71,Sa 2-309,VV' 363 +003.8-17.1 |19 02 20.5 -33 16 15. 76..9055|Hb 8 | 3-17 1 |19022-3316 |HUBBLE 1921 |ESO 397-02,He 2- 426,Sa 2-381,StWr 2-24,VV 218,VV' 475,Y-C 2- 33 +003.9+01.6 |17 45 23.9 -24 40 31.8 89.30002|Te 2111 | | |TERZAN 1989 | +003.9-02.3 |18 00 31.9 -26 43 34. 76..9055|M 1-35 | 3-02 1 |18005-2643 |MINKOWSKI 1946 |ESO 521-17,He 2- 336,Sa 2-287,VV 141,VV' 328,Wray 15- 1830 +003.9-03.1 |18 03 42.0 -27 06 41. 88..2065|KFL 7 | | |KINMAN et al 1988 | +003.9-14.9 |18 52 23.8 -32 19 49. 76..9055|Hb 7 | 3-14 1 |18523-3219 |HUBBLE 1921 |ARO 523,Cn 1-6,AS 330,ESO 458-09,He 2- 425,Sa 2-375,StWr 2-20,VV 212,VV' 463,Wray 16-422,Y-C 2- 31 +004.0-03.0 |18 03 34.7 -26 55 43. 76..9055|M 2-29 | 4-03 1 |18035-2655 |MINKOWSKI 1947 |ESO 521-27,He 2- 345,Sa 2-296,VV 149,VV' 343,Wray 17- 109 +004.0-05.8 |18 14 32.4 -28 18 29. 76..9055|Pe 1-12 | 4-05 3 | |PEREK 1960 |ESO 457-06,VV' 386 +004.0-11.1 |18 36 12.9 -30 43 21. 76..9055|M 3-29 | 4-11 1 |18362-3043 |MINKOWSKI 1948 |Em 2,ESO 458-01,He 2- 416,Sa 2-355,StWr 2-14,VV' 434,Wray 16- 416 +004.1-03.8 |18 07 04.1 -27 17 14. 88..2065|KFL 11 | | |KINMAN et al 1988 | +004.2-03.2 |18 04 53.8 -26 54 29. 88..2065|KFL 10 | | |KINMAN et al 1988 | +004.2-04.3 |18 09 16.2 -27 29 42. 76..9055|H 1-60 | 4-04 1 | |HARO 1952 |ESO 522-03,Sa 2-310,VV' 362 +004.2-05.9 |18 15 29.3 -28 09 20. 76..9055|M 2-37 | 4-05 5 |18154-2809 |MINKOWSKI 1947 |ESO 457-08,He 2- 387,Sa 3-131,VV 170,VV' 390,Wray 15- 1858 +004.3+01.8 |17 45 32.5 -24 15 39. 76..9055|H 2-24 | 4+01 1 | |HARO 1952 |ESO 520-29,Sa 3- 77,VV' 254 +004.3-02.6 |18 02 50.0 -26 30 01. 76..9055|H 1-53 | 4-02 1 | |HARO 1952 |ARO 269,ESO 521-24,He 2- 342,VV' 341 +004.5+06.8 |17 27 36. -21 26 36. d 67.30013|H 2-12 | 4+06 1 |17276-2126 |HARO 1952 |ESO 588-04,VV' 208 +004.6+06.0 |17 30 37.5 -21 44 16. 76..9055|H 1-24 | 4+06 2 |17306-2144 |HARO 1952 |ARO 253,ESO 588-05,He 2- 244,VV' 215 +004.7-11.8 |18 41 01.2 -30 21 32. 80..1575|He 2-418 | 4-11 2 | |HENIZE 1964 |ESO 458-04,Sa 2-360,StWr 2-15,Wray 16- 417 +004.8+02.0 |17 45 57.5 -23 42 00. 76..9055|H 2-25 | 4+02 1 |17459-2342 |HARO 1952 |ESO 520-30,VV' 258 +004.8-05.0 |18 13 03.3 -27 16 01. 76..9055|M 3-26 | 4-05 1 |18130-2715 |MINKOWSKI 1948 |ESO 522-10,He 2- 378,Sa 2-320,VV' 379,Wray 16- 398 +004.8-22.7 |19 28 51.5 -34 18 59. 73..9034|He 2-436 | 4-22 1 |19288-3419 |HENIZE 1964 |ESO 398-07,Sa 2-391,StWr 2-25 +004.9+04.9 |17 35 29.50-22 06 58.4 90..1502|M 1-25 | 4+04 1 |17355-2206 |MINKOWSKI 1946 |ARO 255,ESO 588-13,He 2- 259,Sa 2-224,VV 108,VV' 226 +004.9-04.9 |18 13 09.5 -27 05 37. 76..9055|M 1-44 | 4-04 2 |18131-2705 |MINKOWSKI 1946 |ESO 522-11,He 2- 379,VV 165,VV' 380,Wray 16- 399 +005.0+03.0 |17 42 34.8 -23 01 17. 67.30013|Pe 1- 9 | 5+03 1 | |PEREK 1960 |ESO 520-22,Sa 3- 71,VV' 244 +005.0+04.4 |17 37 17.0 -22 17 45. 76..9055|H 1-27 | 5+04 1 |17372-2217 |HARO 1952 |ARO 258,ESO 588-16,He 2- 265,Sa 2-227,VV' 229 +005.0-03.9 |18 09 16. -26 33 42. d 81..1503|H 2-42 | 5-03 2 | |HARO 1952 |ESO 522-02,VV' 365 +005.1-03.0 |18 06 07. -26 03 00. d 81..1503|H 1-58 | 5-03 1 |18061-2603 |HARO 1952 |ESO 521-34,Sa 2-303,VV' 354,Wray 17- 111 +005.1-08.9 |18 29 21. -28 45 36. d 80..1575|Hf 2-2 | 5-08 1 |18293-2845 |HOFFLEIT 1953 |ESO 457-16,He 2- 407,Sa 3-135,Wray 16- 414 +005.2+04.2 |17 38 36. -22 11 36. d 81..1551|M 3-13 | 5+04 2 |17385-2211 |MINKOWSKI 1948 |ESO 588-17,VV' 230 +005.2+05.6 |17 33 24. -21 29 a 81..1551|M 3-12 | 5+05 1 |17334-2129 |MINKOWSKI 1948 |ESO 588-10,He 2- 255,Sa 2-221,VV' 222 +005.2-18.6 |19 11 08.9 -32 39 31. 72.30006|StWr 2-21 | | |STOCK et al 1972 |ESO 397-07,Sa 2-383 +005.4-01.9 |18 02 18.3 -25 12 54. 88.30862|PBOZ 34 | |18023-2513 |POTTASCH et al 1988 | +005.5+02.7 |17 45 06. -22 45 48. d 77..1552|H 1-34 | 5+02 1 |17451-2245 |HARO 1952 |ESO 520-28,VV' 253 +005.5+06.1 |17 32 22. -20 55 24. d 81..1551|M 3-11 | 5+06 1 |17323-2055 |MINKOWSKI 1948 |ESO 588-09,He 2- 254,Sa 3- 66,VV' 221 +005.5-02.5 |18 04 48. -25 24 30. d 81..1503|M 3-24 | 5-02 1 |18048-2524 |MINKOWSKI 1948 |ESO 521-30,He 2- 350,Sa 2-300,VV'348,Wray 17- 110 +005.5-04.0 |18 10 34. -26 09 36. d 81..1503|H 2-44 | 5-04 1 |18105-2609 |HARO 1952 |ESO 522-07,Sa 3-124,VV' 371 +005.6-04.7 |18 13 46.8 -26 24 31. 88..2065|KFL 16 | | |KINMAN et al 1988 | +005.7-03.6 |18 09 39.0 -25 45 12. 88..2065|KFL 13 | | |KINMAN et al 1988 | +005.7-05.3 |18 16 18.0 -26 36 37. 76..9055|M 2-38 | 5-05 1 |18163-2636 |MINKOWSKI 1947 |ARO 272,ESO 522-17,He 2- 388,Sa 2-328,VV 172,VV' 392,Wray 16- 406 +005.8+05.1 |17 36 55.0 -21 12 32. 76..9055|H 2-16 | 5+05 2 |17369-2112 |HARO 1952 |ARO 256,ESO 588-15,He 2- 261,Sa 2-226,VV' 227 +005.8-06.1 |18 19 46.8 -26 50 50. 73..9034|NGC 6620 | 5-06 1 |18198-2650 |PICKERING 1880 |ARO 99,ESO 522-22,He 2- 394,Sa 2-332,StWr 2-4,VV 173,VV' 394,Wray 16-410 +005.9-02.6 |18 06 07.5 -25 05 09. 78..1561|MaC 1-10 | |18061-2505 |MAC CONNELL 1978 | PM 1-213 +006.0+02.8 |17 45 36.0 -22 15 53. 76..9055|Th 4- 3 | 6+02 1 |17456-2215 |THE 1964 |ARO 259,ESO 589-07,Sa 3- 78 +006.0+03.1 |17 44 37.4 -22 05 19. 76..9055|M 1-28 | 6+03 2 |17446-2205 |MINKOWSKI 1946 |ESO 589-06,He 2- 285,Sa 3- 76,VV 115,VV' 250 +006.0-03.6 |18 10 10.5 -25 30 56.8 83..1405|M 2-31 | 6-03 3 |18101-2530 |MINKOWSKI 1947 |ESO 522- 06,He 2- 368,Sa 2-313,StWr 2- 1,VV 158,VV' 369,Wray 16- 390 +006.0-41.9 |21 02 44.5 -37 20 18.7 89.13504|PRMG 1 | | |PENA et al 1989 | +006.1+08.3 |17 26 00.74-19 13 32.1 90..1502|M 1-20 | 6+08 1 |17260-1913 |MINKOWSKI 1946 |ESO 588-03,He 2- 235,Sa 2-204,VV 102,VV' 203 +006.2+01.0 |17 52 53.8 -22 58 37. 83.28035|HaTr 8 | | |HARTL et al 1983 | +006.2-03.7 |18 11 14.0 -25 21 46. 88..2065|KFL 15 | | |KINMAN et al 1988 | +006.3+03.3 |17 44 34. -21 46 24. d 81..1551|H 2-22 | 6+03 1 |17445-2146 |HARO 1952 |ESO 589-05,Sa 3- 75,VV' 251 +006.3+04.4 |17 40 29.3 -21 08 33.8 83..1405|H 2-18 | 6+04 1 | |HARO 1952 |ESO 589-01,Sa 2-232,VV' 234 +006.4+02.0 |17 49 40.2 -22 21 18. 76..9055|M 1-31 | 6+02 5 |17496-2221 |MINKOWSKI 1946 |ESO 589-16,He 2- 299,Sa 2-260,Ve 59,VV 123,VV' 275 +006.4-04.6 |18 15 08. -25 39 24. d 81..1503|Pe 2-13 | 6-04 1 |18150-2539 |PEREK 1960 |ESO 522-14,Sa 3-129,VV' 387 +006.5-03.1 |18 09 29. -24 50 48. d 81..1503|H 1-61 | 6-03 1 |18094-2450 |HARO 1952 |ESO 522-04,He 2- 364,VV' 364,Wray 16- 387 +006.7-02.2 |18 06 26.1 -24 13 03. 67.30013|M 1-41 | 6-02 1 |18064-2413 |MINKOWSKI 1946 |He 2- 355,Ve 62,VV 152,VV' 355,Wray 17- 112 +006.8+02.0 |17 50 36. -21 58 06. d 81..1551|Pe 2-10 | 6+02 4 | |PEREK 1960 |ESO 589-19,VV' 280 +006.8+02.3 |17 49 22.0 -21 50 33. 76..9055|Th 4- 7 | 6+02 3 |17493-2150 |THE 1964 |ARO 263,ESO 589-15,Sa 2-257 +006.8+04.1 |17 42 32.4 -20 56 52.0 67.30013|M 3-15 | 6+04 2 |17425-2056 |MINKOWSKI 1948 |ESO 589-02,He 2- 279,Sa 2-240,VV' 243 +006.8-03.4 |18 11 24. -24 44 30. d 81..1503|H 2-45 | 6-03 2 |18114-2443 |HARO 1952 |ESO 522-08,Sa 2-315,VV' 374 +006.8-08.6 |18 31 47. -27 08 48. * 70..9104|Al 1 | |18318-2708 |WRAY 1966 |ESO 523-02,Wray 15-1876 +006.8-19.8 |19 18 58.3 -31 36 25. 66.30012|Wray 16-423 | | |WRAY 1966 |ESO 459-17,Sa 2-389,StWr 2-18 +007.0+06.3 |17 35 15. -19 36 00. d 81..1551|M 1-24 | 7+06 2 |17352-1935 |MINKOWSKI 1946 |ESO 588-12,He 2- 258,Sa 2-223,VV 107,VV' 225 +007.0-06.0 |18 21 51. -25 43 36. d 81..1503|H 1-66 | 7-06 1 |18218-2543 |HARO 1952 |AS 303,ESO 522-24,He 2- 397,MHa 366-101,Sa 2- 333,StWr 2-2,VV' 401 +007.0-06.8 |18 24 53.2 -26 08 36. 76..9055|VY 2- 1 | 7-06 2 |18248-2608 |VYSSOTSKY 1945 |ESO 522- 27,He 2- 400,Sa 2-336,StWr 2- 5,VV 181,VV' 405,Wray 15-1872 +007.2+01.8 |17 52 06.8 -21 44 10. 73..9034|Hb 6 | 7+01 1 |17521-2144 |HUBBLE 1921 |ARO 96,ESO 589-20,He 2- 305,Sa 2-264,Ve 60,VV 128,VV' 285 +007.5+04.3 |17 43 22. -20 12 48. d 81..1551|Th 4- 1 | 7+04 1 | |THE 1964 |ESO 589-04,He 2- 282,Sa 3- 63 +007.5+07.4 |17 32 14. -18 32 24. d 81..1551|M 1-22 | 7+07 1 |17322-1832 |MINKOWSKI 1946 |ESO 588-08,He 2- 252,Sa 2-217,VV 104,VV' 219 +007.6+06.9 |17 34 26. -18 45 00. d 81..1551|M 1-23 | 7+06 1 |17344-1844 |MINKOWSKI 1946 |ESO 588-11,He 2- 256,Sa 2-222,VV 105,VV' 223 +007.8-03.7 |18 14 13. -24 00 00. d 81..1503|M 2-34 | 7-03 1 | |MINKOWSKI 1947 |ESO 522-12,He 2- 382,Sa 3-127,VV 166,VV' 382,Wray 16- 402 +007.8-04.4 |18 17 05.0 -24 16 27. 76..9055|H 1-65 | 7-04 1 |18170-2416 |HARO 1952 |ARO 273,AS 301,ESO 522-18,He 2- 389,MHa 304-145,VV' 393,Wray 16- 407 +007.9+10.1 |17 23 44.4 -16 45 57. 78..1561|MaC 1- 4 | | |MAC CONNELL 1978 | +008.0+03.9 |17 46 17.2 -19 59 41. 73..9034|NGC 6445 | 8+03 1 |17462-1959 |PICKERING 1882 |ARO 67,He 2- 290,Sa 2-248,ESO 589-09,VV 118,VV' 260 +008.1-04.7 |18 18 57.5 -24 12 09. 76..9055|M 2-39 | 8-04 1 |18189-2412 |MINKOWSKI 1947 |ESO 522-20,He 2- 391,Sa 2-329,VV 174,VV' 395,Wra y 15-1866 +008.2+06.8 |17 36 01.63-18 15 57.5 90..1502|He 2-260 | 8+06 1 |17360-1815 |HENIZE 1964 |AS 235,ESO 588-14,SaSt 2-15 +008.2-04.8 |18 19 28.1 -24 11 00. 76..9055|M 2-42 | 8-04 2 |18194-2410 |MINKOWSKI 1947 |ESO 522-21,He 2- 393,Sa 2-331,VV 177,VV' 398,Wray 16- 409 +008.3-01.1 |18 05 24.2 -22 17 23. 76..9055|M 1-40 | 8-01 1 |18054-2217 |MINKOWSKI 1946 |AS 278,ESO 590-02,He 2- 352,MHa 79- 25,Sa 2-302,VV 151,VV' 352 +008.3-07.3 |18 29 29.9 -25 09 59.2 83..1405|NGC 6644 | 8-07 2 |18295-2510 |PICKERING 1885 |ESO 522-23,He 2- 408,Sa 2-343,VV 188,VV' 417,Wray 16- 415 +008.4-03.6 |18 15 21. -23 26 06. d 81..1551|H 1-64 | 8-03 1 |18153-2326 |HARO 1952 |ESO 522-15,He 2-386,Sa 3-130,VV' 389,Wray 15-1857 +008.6-02.6 |18 11 49.1 -22 44 53. 78..1561|MaC 1-11 | | |MAC CONNELL 1978 | +008.6-07.0 |18 28 49. -24 48 30. d 81..1503|He 2-406 | 8-07 1 |18288-2448 |HENIZE 1964 |ARO 280,ESO 522-31,Sa 2-342,Wray 16- 413 +008.8+05.2 |17 43 13. -18 38 30. d 81..1551|Th 4- 2 | 8+05 1 |17432-1838 |THE 1964 |ESO 589-03,He 2- 281,Sa 3- 72 +009.0+04.1 |17 47 31.6 -19 02 24. 81..1550|Th 4- 5 | 9+04 1 |17475-1902 |THE 1964 |ESO 589-11,He 2- 293,Sa 2-252 +009.3+02.8 |17 53 00.0 -19 28 00. 76..9055|Th 4- 9 | 9+02 1 |17530-1929 |THE 1964 |ARO 266,ESO 589-21 +009.3+04.1 |17 48 00.8 -18 46 00. 76..9055|Th 4- 6 | 9+04 2 |17480-1846 |THE 1964 |ARO 262,ESO 589-12,Sa 2-254 +009.4-05.0 |18 22 41.2 -23 13 45. 73..9034|NGC 6629 | 9-05 1 |18226-2313 |HERSCHEL 1868 |ARO 30,ESO 522-26,He 2- 399,Sa 2-335,VV 179,VV' 403,Wray 15-1869 +009.4-09.8 |18 41 38. -25 24 42. d 81..1503|M 3-32 | 9-09 1 |18416-2524 |MINKOWSKI 1948 |ESO 523-06,He 2- 420,Sa 2-362,VV' 445 +009.6+10.5 |17 26 12. -15 11 a 67.30013|A 41 | 9+10 1 |17262-1510 |ABELL 1955 |A55 29,He 2- 236,Sa 2-205,VV' 202 +009.6+14.8 |17 11 14.9 -12 51 11. 73..9034|NGC 6309 | 9+14 1 |17112-1251 |PICKERING 1882 |ARO 66,He 2- 206,Sa 2-181,VV 96,VV' 171 +009.6-10.6 |18 45 07. -25 32 12. d 81..1503|M 3-33 | 9-10 1 |18451-2532 |MINKOWSKI 1948 |ESO 523-09,He 2- 423,Sa 2-367,VV' 452,Wray 16- 420 +009.8-04.6 |18 22 03. -22 36 36. d 81..1503|H 1-67 | 9-04 1 |18220-2236 |HARO 1952 |ESO 522-25,He 2- 398,Sa 2-334,VV' 402 +009.8-07.5 |18 33 20.3 -23 57 52. 89...191|GJJC 1 | | |GILLETT et al 1989 | +010.1+00.7 |18 02 15.5 -19 50 30. 73..9034|NGC 6537 | 10+00 1 |18021-1950 |PICKERING 1882 |ARO 52,ESO 590-01,He 2- 340,My 115,Sa 2-294,VV 147,VV' 339 +010.4+04.5 |17 49 09.6 -17 35 34. 76..9055|M 2-17 | 10+04 1 |17491-1735 |MINKOWSKI 1947 |ESO 589-14,He 2- 298,Sa 2-255,VV 122,VV' 274 +010.6+03.2 |17 54 11. -18 06 24. d 81..1551|Th 4-10 | 10+03 1 |17541-1806 |THE 1964 |ESO 589-23,He 2- 311,Sa 3-99 +010.7+07.4 |17 39 10. -15 54 48. d 75..9016|Sa 2-230 | |17391-1554 |SANDULEAK 1975 | +010.7-06.4 |18 30 53.2 -22 41 01. 73..9034|IC 4732 | 10-06 1 |18308-2241 |FLEMING 1901 |ARO 71,ESO 523-01,He 2- 410,Sa 2-345,VV 191,VV' 424,Y-C 2- 24 +010.7-06.7 |18 31 50. -22 45 48. d 81..1503|Pe 1-13 | 10-06 2 |18318-2245 |PEREK 1960 |ESO 523-03,Sa 2-348,VV' 427 +010.8+18.0 |17 02 52.5 -10 04 31. 73..9034|M 2- 9 | 10+18 2 |17028-1004 |MINKOWSKI 1947 |MHa 362- 8,VV 92,VV' 161 +010.8-01.8 |18 13 18.6 -20 28 04. 73..9034|NGC 6578 | 10-01 1 |18132-2028 |PICKERING 1882 |ARO 70,ESO 590-12,He 2- 381,Sa 2-322,VV 163,VV' 376 +011.0+05.8 |17 45 26.31-16 27 47.1 90..1502|NGC 6439 | 11+05 1 |17454-1627 |PICKERING 1882 |ARO 95,He 2- 287,Sa 2-245,VV 117,VV' 256,Y-C 2- 21 +011.0+06.2 |17 44 01.0 -16 16 20. 76..9055|M 2-15 | 11+06 1 |17440-1616 |MINKOWSKI 1947 |He 2- 284,Sa 2-242,VV 114,VV' 249 +011.0-05.1 |18 26 11. -21 48 54. d 81..1551|M 1-47 | 11-05 1 |18261-2148 |MINKOWSKI 1946 |ESO 591-02,He 2- 403,Sa 2-338,VV 184,VV' 409 +011.1+07.0 |17 41 49. -15 44 00. d 75..9016|Sa 2-237 | | |SANDULEAK 1975 | +011.1+11.5 |17 25 44.63-13 23 57.4 90..1502|M 2-13 | 11+11 1 |17257-1323 |MINKOWSKI 1947 |He 2-230,Sa 2-203,VV 100,VV' 198 +011.3+02.8 |17 57 14.00-17 40 24.0 90..1502|Th 4-11 | 11+02 1 |17572-1740 |THE 1964 |ARO 267,ESO 589-25,He 2- 322 +011.3-09.4 |18 43 32. -23 30 06. d 81..1503|H 2-48 | 11-09 1 |18435-2330 |HARO 1952 |AS 957,ESO 523-07,He 2- 422,MHa 152- 1,My 121,SaSt 2-23,VV' 449,Wray 16-419,Y-C 2- 30 +011.7-00.0 |18 08 52. -18 46 48. d 81..1551|M 1-43 | 11-00 1 | |MINKOWSKI 1946 |ESO 590-05,He 2- 363,VV 156,Sa 3-122,VV' 361 +011.7-00.6 |18 10 48.2 -19 05 13. 73..9034|NGC 6567 | 11-00 2 |18108-1905 |PICKERING 1882 |ARO 69,ESO 590-08,He 2-369,Sa 2-314,VV 160,VV' 372 +011.7-06.6 |18 33 34. -21 51 30. d 81..1551|M 1-55 | 11-06 1 |18335-2151 |MINKOWSKI 1946 |ESO 591-10,He 2- 414,SaSt 2-22,VV 195,VV' 431 +011.9+04.2 |17 53 26.0 -16 28 39. 76..9055|M 1-32 | 11+04 1 |17534-1628 |MINKOWSKI 1946 |He 2- 309,Sa 2-268,VV 130,VV' 292 +012.2+04.9 |17 51 28.0 -15 55 20. 88..1632|PM 1-188 | |17514-1555 |PREITE-MARTINEZ 1988 |HuBi 1 +012.5-09.8 |18 47 25. -22 37 54. d 81..1503|M 1-62 | 12-09 1 |18474-2237 |MINKOWSKI 1946 |ESO 523-10,He 2- 424,Sa 2-369,VV 207,VV' 457 +012.6-02.7 |18 20 11.0 -19 18 41. 76..9055|M 1-45 | 12-02 1 |18201-1918 |MINKOWSKI 1946 |ARO 276,ESO 590-18,He 2- 395,VV 178,VV' 399 +013.0-04.3 |18 27 02. -19 42 42. d 81..1551|Pe 2-14 | 13-04 1 |18271-1942 |PEREK 1960 |ESO 591-04,Sa 2-340,VV' 412 +013.1+04.1 |17 56 06. -15 32 06. * 75..9016|M 1-33 | 13+04 1 |17561-1532 |MINKOWSKI 1946 |He 2- 321,Sa 2-275,VV 134,VV' 309,Y-C 2-22 +013.3+32.7 |16 18 30.44-00 09 06.6 90..1502|Sn 1 | 13+32 1 | |SHANE | +013.4-03.9 |18 26 33.0 -19 07 47. 76..9055|M 1-48 | 13-03 1 |18265-1908 |MINKOWSKI 1946 |ESO 591-03,He 2- 404,Sa 2-339,VV 185,VV' 411 +013.7-10.6 |18 52 30.8 -21 53 33. 73..9018|Y-C 2-32 | |18525-2153 |CESCO et al 1973 |ESO 592-06,Sa 2-376 +013.8-02.8 |18 23 07.5 -18 13 53. 87..1594|SaWe 3 | | |SAURER et al 1987 | +013.8-07.9 |18 42 37. -20 38 12. d 81..1551|PC 21 | 13-07 1 | |PEIMBERT et al 1961 |ESO 591-16,Sa 2-364,Y-C 2-28 +014.0-05.5 |18 33 34.70-19 22 00.0 90..1502|V-V 3-5 | |18335-1922 |VORONCOV-VEL'JAMINOV et al 1972 |ESO 591-09,He 3-1716,Sa 1- 7,Sa 2-351,V-V Anon.2 +014.2+04.2 |17 58 16. -14 30 18. d 67.30013|Sa 3-111 | |17582-1430 |SANDULEAK 1973 | +014.2-07.3 |18 41 04. -19 58 00. d 81..1551|M 3-31 | 14-07 1 |18410-1958 |MINKOWSKI 1948 |ESO 591-15,He 2- 419,Sa 2-361,VV' 444 +014.3-05.5 |18 34 14.53-19 04 57.6 90..1502|V-V 3-6 | |18342-1904 |VORONCOV-VEL'JAMINOV et al 1972 |ESO 591-11,Sa 2-352,V-V Anon. 3,Y-C 2-25 +014.6-04.3 |18 30 25.2 -18 18 49. 76..9055|M 1-50 | 14-04 1 |18304-1818 |MINKOWSKI 1946 |ESO 591-07,He 2- 409,Sa 2-344,VV 189,VV' 421,Y-C 2- 23 +014.7-11.8 |18 59 16.9 -21 31 14. 87..1594|SaWe 4 | | |SAURER et al 1987 | +014.8-25.6 |19 55 10.3 -26 36 24. 83.28034|HDW 12 | | |HARTL et al 1983 |HaWe 14 +014.9+06.4 |17 51 36.0 -12 47 47. 76..9055|K 2- 5 | 14+06 1 | |KOHOUTEK 1963 |ARO 265 +014.9-03.1 |18 26 16.7 -17 29 14. 73..9055|SaSt 3-166 | | |SANDULEAK et al 1973 | +015.4-04.5 |18 32 53.5 -17 38 38. 76..9055|M 1-53 | 15-04 1 |18328-1738 |MINKOWSKI 1946 |ESO 591-08,He 2- 412,Sa 2-349,VV 193,VV' 428 +015.6-03.0 |18 27 17.5 -16 47 32. 76..9055|A 44 | 15-03 1 | |ABELL 1955 |A55 32,ARO 278,VV' 413 +015.9+03.3 |18 04 41. -13 29 18. d 76.26001|M 1-39 | 15+03 1 |18046-1329 |MINKOWSKI 1946 |He 2- 351,VV 150,VV' 349 +016.0+13.5 |17 28 48. -08 17 a 67.30013|A 42 | 16+13 1 |17288-0816 |ABELL 1955 |A55 30,VV' 213 +016.0-04.3 |18 33 14.4 -17 02 30. 76..9055|M 1-54 | 16-04 1 |18332-1702 |MINKOWSKI 1946 |He 2- 413,Sa 2-350,VV 194,VV' 430 +016.1-04.7 |18 34 52.2 -17 08 25. 76..9055|M 1-56 | 16-04 2 |18348-1708 |MINKOWSKI 1946 |He 2- 415,Sa 2-353,VV 196,VV' 432 +016.4-01.9 |18 25 04.5 -15 34 53. 73..9034|M 1-46 | 16-01 1 |18250-1534 |MINKOWSKI 1946 |ARO 387,He 2- 401,SaSt 2-21,VV 182,VV' 406 +016.9-02.0 |18 26 28. -15 09 42. d 76.26001|Sa 3-134 | |18264-1509 |SANDULEAK 1976 | +017.3-21.9 |19 43 34.3 -23 15 36. 83...481|A 65 | 17-21 1 |19435-2315 |ABELL 1964 |ARO 26,ESO 526-03,Sh 2- 52,VV' 513 +017.6-10.2 |18 58 06.0 -18 16 33. 83...481|A 51 | 17-10 1 |18581-1816 |ABELL 1955 |A55 38,ARO 300,VV' 471 +017.7-02.9 |18 31 07.0 -14 54 48. 76..9055|M 1-52 | 17-02 1 |18311-1454 |MINKOWSKI 1946 |ARO 283,Sa 2-346,VV 192,VV' 46 +017.9-04.8 |18 38 23.0 -15 36 40. 76..9055|M 3-30 | 17-04 1 |18383-1536 |MINKOWSKI 1948 |ARO 288,Sa 3-143,VV' 438 +018.0+20.1 |17 10 13.8 -03 12 27. 76..9055|Na 1 | 18+20 1 |17102-0312 |NASSAU 1964 |Sa 2-179 +018.6-02.2 |18 30 13.78-13 46 38.0 90..1502|M 3-54 | 18-02 1 |18302-1346 |MINKOWSKI 1948 |Sa 3-137,VV' 420 +018.9+03.6 |18 09 23.18-10 43 45.9 90..1502|M 4- 8 | 18+03 1 |18093-1043 |MINKOWSKI 1948 |ARO 270,Sa 3-123 +018.9+04.1 |18 07 40. -10 29 48. 67.30013|M 3-52 | 18+04 1 | |MINKOWSKI 1948 |VV' 358 +019.2-02.2 |18 31 24.52-13 14 47.7 90..1502|M 4-10 | 19-02 1 |18313-1314 |MINKOWSKI 1948 |ARO 284,Sa 2-347 +019.4-05.3 |18 43 04.40-14 30 51.1 90..1502|M 1-61 | 19-05 1 |18430-1430 |MINKOWSKI 1946 |Sa 2-365,VV 205,VV' 448 +019.4-13.6 |19 14 10.2 -18 06 59. 80..1011|DeHt 3 | | |DENGEL et al 1980 |ESO 593-09,DHW 1-1 +019.4-19.6 |19 37 36. -20 34 a 67.30013|K 2- 7 | 19-19 1 | |KOHOUTEK 1962 |ESO 594-10 +019.7+03.2 |18 12 31. -10 11 12. d 75..9016|M 3-25 | 19+03 1 |18125-1011 |MINKOWSKI 1948 |Sa 2-318,VV' 377 +019.7-04.5 |18 40 48.25-13 47 52.3 90..1502|M 1-60 | 19-04 1 |18408-1347 |MINKOWSKI 1946 |Sa 2-359,VV 203,VV' 443 +019.8+05.6 |18 04 18. -08 56 24. * 89.50014|CTS 1 | | |CAPELLARO et al 1989 | +019.8-23.7 |19 54 34.8 -21 44 43. 76..9055|A 66 | 19-23 1 |19545-2144 |ABELL 1955 |A55 53,ARO 339,ESO 595-04,VV' 519 +019.9+00.9 |18 21 21. -11 08 24. d 76.26001|M 3-53 | 19+00 1 |18213-1108 |MINKOWSKI 1948 |Sa 3-132,VV' 400 +020.2-00.6 |18 27 30. -11 39 a 67.30013|A 45 | 20-00 1 | |ABELL 1955 |A55 33,VV' 415 +020.7-05.9 |18 47 54.80-13 34 36.4 90..1502|Sa 1-8 | |18479-1334 |SANDULEAK 1974 |AS 326,MHa 204-32,Sa 2-370 +020.9-01.1 |18 30 42. -11 09 42. d 76.26001|M 1-51 | 21-01 1 |18307-1109 |MINKOWSKI 1946 |He 2- 411,VV 190,VV' 423 +021.1-05.9 |18 48 41.6 -13 14 14. 76..9055|M 1-63 | 21-05 1 |18486-1314 |MINKOWSKI 1946 |Sa 2-371,VV 209,VV' 459 +021.2-03.9 |18 41 19.4 -12 16 04. 77..1547|We 1- 7 | |18413-1216 |WEINBERGER 1977 | +021.7-00.6 |18 30 28.9 -10 17 26. 76..9055|M 3-55 | 21-00 2 | |MINKOWSKI 1948 |ARO 282,Sa 3-138,VV' 422 +021.8-00.4 |18 29 55.6 -10 08 05. 76..9055|M 3-28 | 21-00 1 |18299-1008 |MINKOWSI 1948 |ARO 281,Sa 3-136,VV' 418 +022.0-03.1 |18 40 10.3 -11 09 54. 76..9055|M 1-58 | 22-03 1 | |MINKOWSKI 1946 |Sa 2-357,VV 201,VV' 440 +022.1-02.4 |18 37 34.0 -10 42 37. 76..9055|M 1-57 | 22-02 1 |18375-1042 |MINKOWSKI 1946 |ARO 287,Sa 2-356,VV 199,VV' 436 +022.5+01.0 |18 25 51.1 -08 45 23. 78..1561|MaC 1-13 | |18258-0845 |MAC CONNELL 1978 | +022.5+04.8 |18 12 31. -06 58 12. * 82.30016|MA 2 | | |MAEHARA 1982 | +023.0+04.3 |18 15 07. -06 49 36. * 82.30016|MA 3 | | |MAEHARA 1982 | +023.3-07.6 |18 58 33.8 -12 02 43. 67.30013|MaC 1-16 | | |MAC CONNELL 1978 | +023.8-01.7 |18 38 23.18-08 58 52.2 90..1502|K 3-11 | 23-01 2 |18383-0858 |KOHOUTEK 1964 |Sa 3-144 +023.9+01.2 |18 27 48. -07 29 48. * 82.30016|MA 13 | | |MAEHARA 1982 | +023.9-02.3 |18 40 35.89-09 07 51.6 90..1502|M 1-59 | 23-02 1 |18405-0907 |MINKOWSKI 1946 |ARO 289,Sa 2-358,VV 202,VV' 442 +024.1+03.8 |18 18 43.0 -06 03 26. 76..9055|M 2-40 | 24+03 1 |18187-0603 |MINKOWSKI 1947 |ARO 275,MA 5,VV 175,VV' 396 +024.2+05.9 |18 11 39. -05 00 18. 67.30013|M 4- 9 | 24+05 1 |18116-0500 |MINKOWSKI 1948 |MA 1,Sa 3-125 +024.2-05.2 |18 51 32. -10 09 00. d 75..9016|M 4-11 | 24-05 1 |18515-1009 |SHAPLEY |Sa 2-373 +024.3-03.3 |18 45 04. -09 12 30. d 67.30013|Pe 1-17 | 24-03 1 |18450-0912 |PEREK 1960 |Sa 3-147,VV' 454 +024.8-02.7 |18 43 51. -08 31 18. * 76.26001|M 2-46 | 24-02 1 |18437-0831 |MINKOWSKI 1947 |Sa 3-146,VV 206,VV' 451 +025.0-11.6 |19 16 30.0 -12 20 26. 76..9055|A 60 | 25-11 1 | |ABELL 1955 |A55 47,ARO 314,VV' 493 +025.3+40.8 |16 09 23.3 +12 12 08. 73..9034|IC 4593 | 25+40 1 | |FLEMING 1907 |ARO 27,VV 79,VV' 133 +025.3-04.6 |18 51 36.1 -08 57 22. 81..1550|K 4- 8 | 25-04 1 |18516-0851 |KOHOUTEK 1964 |Sa 2-374 +025.4-04.7 |18 51 52.6 -08 53 40. 67.30013|IC 1295 | 25-04 2 |18519-0853 |CURTIS 1919 |ARO 8,VV 213,VV' 465 +025.8-17.9 |19 41 09.0 -14 16 21. 73..9034|NGC 6818 | 25-17 1 |19411-1416 |HERSCHEL 1787 |ARO 12,Sa 2-392,VV 241,VV' 511 +025.9-00.9 |18 39 24. -06 44 a 76.26001|Pe 1-14 | 25-00 1 | |PEREK 1960 |VV' 439 +025.9-02.1 |18 43 42.47-07 17 49.9 90..1502|Pe 1-15 | 25-02 1 |18436-0717 |PEREK 1960 |Sa 3-145,VV' 450 +025.9-10.9 |19 15 33.1 -11 11 42. 76..9055|Na 2 | 26-11 1 |19155-1111 |NASSAU 1964 |AS 350,MHa 319- 34,Sa 2-387 +026.0-01.8 |18 42 45.77-07 00 09.6 90..1502|Pe 2-15 | 26-01 2 | |PEREK 1960 |VV' 447 +026.3-02.2 |18 44 50.6 -06 57 17. 73..9034|Pe 1-16 | 26-02 1 |18448-0657 |PEREK 1960 |ARO 291,Sa 2-366,Th 1- C,VV' 453 +026.5-03.0 |18 48 03.0 -07 05 06. 76..9055|Pe 1-19 | 26-02 3 |18470-0705 |PEREK 1960 |ARO 293,Sa 2-368,VV' 456 +026.6-01.5 |18 42 54.10-06 21 42.0 90..1502|K 4- 5 | 26-01 1 |18429-0621 |KOHOUTEK 1964 | +027.3-02.1 |18 46 06. -05 59 30. d 76.26001|Pe 1-18 | 27-02 1 |18461-0559 |PEREK 1960 |Sa 3-148,Th 1- D,VV' 455 +027.3-03.4 |18 50 48. -06 33 a 67.30013|A 49 | 27-03 1 | |ABELL 1955 |A55 37,VV' 461 +027.4-03.5 |18 51 20.75-06 30 08.7 90..1502|Vy 1- 4 | 27-03 2 |18513-0630 |VYSSOTSKY 1942 |Sa 2-372,Th 1- E,VV 211,VV' 462 +027.6+04.2 |18 24 03.09-02 44 48.4 90..1502|M 2-43 | 27+04 1 |18240-0244 |MINKOWSKI 1947 |ARO 277,MA 9,Sa 3-133,VV 180,VV' 404 +027.6+16.9 |17 39 10.5 +03 08 27. 80..1011|DeHt 2 | | |DENGEL et al 1980 | +027.6-09.6 |19 13 44.32-09 07 59.2 90..1502|IC 4846 | 27-09 1 |19137-0908 |FLEMING 1901 |ARO 103,AS 348,VV 226,VV' 488,Sa 2-385 +027.7+00.7 |18 36 43.0 -04 22 36. 76..9055|M 2-45 | 27+00 1 |18367-0422 |MINKOWSKI 1947 |ARO 286,Sa 3-141,Th 1- B,VV 198,VV' 43 +028.0+10.2 |18 03 27.4 +00 22 16. 81..1143|WeSb 3 | | |WEINBERGER et al 1981 | +028.2-04.0 |18 54 36.6 -06 03 43. 76..9055|Pe 1-20 | 28-04 1 |18546-0604 |PEREK 1960 |ARO 298,Sa 2-377,Th 1- G,VV' 468 +028.5+01.6 |18 34 59. -03 08 36. d 75..9016|M 2-44 | 28+01 1 |18349-0308 |MINKOWSKI 1947 |Sa 2-354,Th 1- A,VV 197,VV' 433 +028.5+05.1 |18 22 25.00-01 32 36.5 90..1502|K 3- 2 | 28+05 1 |18224-0132 |KOHOUTEK 1964 | +028.7+02.7 |18 31 36.98-02 30 01.0 90..1502|K 3- 7 | 28+02 1 |18316-0230 |KOHOUTEK 1964 |ARO 285,MA 19,Sa 3-140 +028.7-03.9 |18 55 10. -05 31 42. d 76.26001|Pe 1-21 | 28-03 1 |18551-0531 |PEREK 1960 |Sa 3-150,Th 1- H,VV' 469 +029.0+00.4 |18 40 12. -03 16 a 76.26001|A 48 | 29+00 1 |18401-0316 |ABELL 1955 |A55 36,VV' 441 +029.2-00.0 |18 42 15.8 -03 23 43. 91..3001|TDC 1 | | |THOMPSON et al 1991 |IR 29.211 +029.2-05.9 |19 03 15.0 -06 04 07. 73..9034|NGC 6751 | 29-05 1 |19032-0604 |FLEMING 1907 |ARO 101,Sa 2-382,Th 1- J,VV 219,VV' 477 +029.8-07.8 |19 11 14.9 -06 24 03. 88..1266|LSA 1 | | |LUNDSTROM et a 1988 | +030.6+06.2 |18 22 25.7 +00 49 55. 83..3100|Sh 2- 68 | | |FESEN et al 1983 |HDW 9,Simeiz 291,YM 15 +030.8+03.4 |18 32 48.0 -00 16 00. 76..9055|A 47 | 30+03 1 |18328-0016 |ABELL 1955 |A55 35,ARO 138,VV' 429 +031.0+04.1 |18 30 43.90+00 09 26.9 90..1502|K 3- 6 | 30+04 1 |18307+0009 |KOHOUTEK 1964 | +031.0-10.8 |19 24 20.7 -06 41 00. 76..9055|M 3-34 | 31-10 1 |19243-0641 |MINKOWSKI 1948 |ARO 322,Sa 2-390,VV' 498 +031.2+05.9 |18 24 37.1 +01 12 37. 67.30013|K 3- 3 | 31+05 1 |18246+0112 |KOHOUTEK 1964 | +031.3-00.5 |18 47 49. -01 43 42. * 83.28035|HaTr 10 | | |HARTL et al 1983 |S 2-68 +031.7+01.7 |18 40 29.3 -00 19 37. 76..9055|PC 20 | 31+01 1 |18404-0019 |PEIMBERT et al 1961 |ARO 140 +031.9-00.3 |18 48 05.2 -01 06 48. 81..1143|WeSb 4 | | |WEINBERGER et al 1981 | +032.0-03.0 |18 57 58.0 -02 16 13. 76..9055|K 3-18 | 32-03 1 |18579-0216 |KOHOUTEK 1964 |ARO 299,Sa 3-152 +032.1+07.0 |18 22 13.61+02 27 45.0 90..1502|PC 19 | 32+07 2 |18221+0227 |PEIMBERT et al 1961 |ARO 136 +032.5-03.2 |18 59 34.1 -01 53 03. 81..1550|K 3-20 | 32-03 2 |18595-0153 |KOHOUTEK 1964 |Sa 3-153 +032.7+05.6 |18 28 29.5 +02 23 26. 73..9034|K 3- 4 | 32+05 1 |18284+0223 |KOHOUTEK 1964 |ARO 279 +032.7-02.0 |18 55 51.22-01 07 53.0 90..1502|M 1-66 | 32-02 1 |18558-0107 |MINKOWSKI 1946 |Sa 2-378,VV 216,VV' 470 +032.9+07.8 |18 20 52.10+03 34 51.6 90..1502|K 3- 1 | 32+07 1 | |KOHOUTEK 1964 | +032.9-02.8 |18 59 01.30-01 23 28.5 90..1502|K 3-19 | 32-02 2 |18590-0123 |KOHOUTEK 1964 |ARO 301,Sa 2-379 +033.0-05.3 |19 07 54.0 -02 26 00. 89..1570|A 55 | 33-05 1 |19078-0225 |ABELL 1955 |A55 43,VV' 480 +033.1-06.3 |19 11 51.6 -02 47 41. 83...481|NGC 6772 | 33-06 1 |19119-0247 |PICKERING 1879 |ARO 102,Sa 2-384,VV 224,VV' 486 +033.2-01.9 |18 56 17. -00 37 06. d 76.26001|Sa 3-151 | |18563-0037 |SANDULEAK 1976 | +033.8-02.6 |19 00 02.0 -00 31 12. 73..9034|NGC 6741 | 33-02 1 |19000-0031 |PICKERING 1885 |ARO 53,J 475,Sa 2-380,VV 217,VV' 474 +034.0+02.2 |18 42 53.06+01 58 11.4 90..1502|K 3-13 | 34+02 1 |18428+0158 |KOHOUTEK 1964 |ARO 290 +034.1-10.5 |19 28 29.2 -03 48 47. 83.28034|HDW 11 | | |HARTL et al 1983 |HaWe 13 +034.3+06.2 |18 29 16.8 +04 02 59. 67.30013|K 3- 5 | 34+06 1 |18292+0402 |KOHOUTEK 1964 | +034.5-06.7 |19 15 49.4 -01 41 24. 73..9034|NGC 6778 | 34-06 1 |19158-0141 |PICKERING 1882 |ARO 72,Sa 2-388,VV 227,VV' 491 +034.6+11.8 |18 09 41.7 +06 50 37. 73..9034|NGC 6572 | 34+11 1 |18096+0650 |STRUVE 1825 |ARO 7,VV 159,VV' 370 +035.1-00.7 |18 55 36. +01 33 a 67.30013|Ap 2-1 | 35-00 1 | |APRIAMASVILI 1962 |ARO 143 +035.7-05.0 |19 12 06.00+00 08 22.0 90..1502|K 3-26 | 35-05 1 |19120+0008 |KOHOUTEK 1964 |ARO 309 +035.9-01.1 |18 58 28.7 +02 05 05. 83...481|Sh 2- 71 | 36-01 1 |18594+0204 |SHARPLESS 1959 |ARO 31,V-V 1-9,VV'473 +036.0+17.6 |17 51 11.1 +10 37 53. 83...481|A 43 | 36+17 1 |17511+1037 |ABELL 1955 |A55 31,,ARO 181,VV' 284 +036.1-57.1 |22 26 55.0 -21 05 38. 83...481|NGC 7293 | 36-57 1 |22267-2102 |CURTIS 1918 |ARO 17,VV 275,VV' 563 +036.9-01.1 |19 00 28.9 +02 57 54. 83.28035|HaTr 11 | | |HARTL et al 1983 | +036.9-02.6 |19 05 30.9 +02 16 36. 83.28035|HaTr 13 | | |HARTL et al 1983 | +037.5-05.1 |19 15 48.5 +01 41 20. 76..9055|A 58 | 37-05 1 |19158+0141 |ABELL 1955 |A55 45,ARO 150,VV' 489 +037.7-34.5 |21 01 27.6 -11 33 54. 73..9034|NGC 7009 | 37-34 1 |21014-1133 |HERSCHEL 1782 |ARO 16,VV 259,VV' 541,EM* CDS 1211 +037.8-06.3 |19 20 24.77+01 24 56.9 90..1502|NGC 6790 | 37-06 1 | |PICKERING 1882 |ARO 33,VV 229,VV' 496 +037.9-03.4 |19 10 36.0 +02 47 40. 76..9055|A 56 | 37-03 2 | |ABELL 1955 |A55 44,ARO 146,VV' 483 +038.1-25.4 |20 28 52.7 -07 15 32. 83...481|A 70 | 38-25 1 | |ABELL 1955 |A55 57,ARO 351,VV' 536 +038.2+12.0 |18 15 10.7 +10 08 02. 73..9034|Cn 3-1 | 38+12 1 |18152+1007 |CANNON 1926 |Anon. 18h15m,ARO 97,SaSt 2-20,VV 171,VV' 391 +038.4-03.3 |19 10 52.6 +03 19 53. 67.30013|K 4-19 | 38-03 1 |19108+0319 |KOHOUTEK 1964 | +038.7+01.9 |18 52 29.9 +05 58 48. 76..9055|YM 16 | 38+02 1 | |SHARPLESS 1959 |ARO 141,RCW 181 +038.7-03.3 |19 11 24.0 +03 32 33. 76..9055|M 1-69 | 38-03 2 |19113+0332 |MINKOWSKI 1946 |ARO 187,VV 223,VV' 485 +039.5-02.7 |19 11 05.8 +04 32 55. 76..9055|M 2-47 | 39-02 1 |19110+0432 |MINKOWSKI 1947 |ARO 147,VV 222,VV' 484 +039.8+02.1 |18 53 52.5 +07 03 24. 73..9034|K 3-17 | 39+02 1 |18538+0703 |KOHOUTEK 1964 |ARO 297 +040.3-00.4 |19 04 19.2 +06 19 13. 83...481|A 53 | 40-00 1 |19043+0619 |ABELL 1955 |A55 41,ARO 183,VV' 478 +040.4-03.1 |19 13 59.64+05 07 56.3 90..1502|K 3-30 | 40-03 1 |19140+0507 |KOHOUTEK 1964 |ARO 312 +041.2-00.6 |19 06 47.6 +07 00 50. 83.28035|HaTr 14 | | |HARTL et al 1983 | +041.8+04.4 |18 49 19.11+09 51 13.3 90..1502|K 3-15 | 41+04 1 |18493+0951 |KOHOUTEK 1964 |ARO 294 +041.8-02.9 |19 16 01.7 +06 26 52. 83...481|NGC 6781 | 41-02 1 |19160+0626 |HERSCHEL 1830 |ARO 32,VV 228,VV' 492 +042.0+05.4 |18 46 11.22+10 32 25.2 90..1502|K 3-14 | 42+05 1 |18461+1032 |KOHOUTEK 1964 |AS 324,MHa 352- 9 +042.5-14.5 |19 58 07.6 +01 35 33. 76..9055|NGC 6852 | 42-14 1 |19581+0135 |KOHOUTEK 1963 |ARO 167,K 1-18 +042.9-06.9 |19 32 05.79+05 34 25.5 90..1502|NGC 6807 | 42-06 1 |19320+0534 |PICKERING 1882 |ARO 74,VV 234,VV' 502 +043.0-03.0 |19 18 35.7 +07 31 17. 73..9034|M 4-14 | 43-03 1 | |MINKOWSKI 1948 |ARO 120 +043.1+03.8 |18 54 11.9 +10 48 14. 76..9055|M 1-65 | 43+03 1 |18541+1048 |MONKOWSKI 1946 |ARO 142,VV 215,VV' 467 +043.1+37.7 |16 42 23.5 +23 53 17. 73..9034|NGC 6210 | 43+37 1 |16423+2353 |STRUVE 1827 |ARO 5,EM* CDS 904;VV 82,VV' 143 +043.3+02.2 |18 59 56. +10 13 00. 90..1004|PM 1-276 | | |PREITE-MARTINEZ 1988 |CTSS 1 +043.3+11.6 |18 25 31.6 +14 27 11. 76..9055|M 3-27 | 43+11 1 |18255+1427 |MINKOWSKI 1948 |ARO 137,VV' 410 +043.5-13.4 |19 55 58.5 +02 54 12. 73..9034|A 67 | 43-13 1 | |ABELL 1955 |A55 54,ARO 117,VV' 520 +044.0+05.2 |18 50 42.00+12 12 17.0 90..1502|K 3-16 | 44+05 1 | |KOHOUTEK 1964 |ARO 295 +044.1+05.8 |18 48 25. +12 33 00. 90..1004|CTSS 2 | | |CAPELLARO et al 1990 | +044.3+10.4 |18 31 46.2 +14 46 55. 78.10519|We 3- 1 | | |WEINBERGER 1978 | +044.3-05.6 |19 30 13.10+07 21 29.0 90..1502|K 3-36 | 44-05 1 |19302+0721 |KOHOUTEK 1964 | +045.4-02.7 |19 21 59.0 +09 47 59. 73..9034|Vy 2- 2 | 45-02 1 |19219+0947 |VYSSOTSKY 1945 |ARO 151,M 1-70,VV 230,VV' 497 +045.6+01.5 |19 07 06.3 +11 55 54. 81..1550|K 3-22 | 45+01 1 | |KOHOUTEK 1964 | +045.6+24.3 |17 40 29.5 +21 28 11. 83...481|K 1-14 | 45+24 1 |17404+2128 |KOHOUTEK 1963 |ARO 48 +045.7-04.5 |19 29 12.0 +09 07 13. 73..9034|NGC 6804 | 45-04 1 |19291+0907 |PEASE 1917 |ARO 34,VV 233,VV' 500 +045.9-01.9 |19 20 04.66+10 35 33.4 90..1502|K 3-33 | 45-01 1 |19200+1035 |KOHOUTEK 1964 | +046.3-03.1 |19 25 22.35+10 18 11.0 90..1502|PB 9 | 46-03 1 |19253+1018 |PEIMBERT et al 1960 |ARO 152 +046.4-04.1 |19 28 53.5 +09 57 00. 73..9034|NGC 6803 | 46-04 1 |19289+0956 |PICKERING 1882 |ARO 73,VV 232,VV' 499 +046.8+02.9 |19 04 05. +13 40 00. 90..1004|CTSS 4 | | |CAPELLARO et al 1990 | +046.8+03.8 |19 00 50. +14 02 30. 90..1004|CTSS 3 | | |CAPELLARO et al 1990 |Sh 2-78 +047.0+42.4 |16 25 32.2 +28 01 12. 83...481|A 39 | 47+42 1 |16255+2801 |ABELL 1955 |A55 27,ARO 180,VV' 140 +047.1+04.1 |19 00 23.1 +14 24 26. 67.30013|K 3-21 | 47+04 1 | |KOHOUTEK 1964 | +047.1-04.2 |19 30 56.0 +10 30 29. 83...481|A 62 | 47-04 1 | |ABELL 1955 |A55 50,ARO 155,VV' 501 +048.0-02.3 |19 25 54.15+12 13 25.1 90..1502|PB 10 | 48-02 1 |19258+1213 |PEIMBERT et al 1960 |Ap 4- 1,ARO 153 +048.1+01.1 |19 13 12.58+13 58 30.4 90..1502|K 3-29 | 48+01 2 |19132+1358 |KOHOUTEK 1964 | +048.5+04.2 |19 02 35.75+15 43 00.9 90..1502|K 4-16 | 48+04 2 |19025+1542 |KOHOUTEK 1964 |ARO 303 +048.7+01.9 |19 11 21.2 +14 54 18. 76..9055|He 2-429 | 48+01 1 |19113+1454 |HENIZE 1964 |ARO 148,M 4-13 +048.7+02.3 |19 09 49.5 +15 03 56. 76..9055|K 3-24 | 48+02 1 |19098+1504 |KOHOUTEK 1964 |ARO 305 +048.7-01.5 |19 24 07.35+13 13 38. 80..1011|DeHt 4 | | |DENGEL et al 1980 | +049.3+88.1 |12 57 02.70+27 54 24.0 90..1502|H 4- 1 | 49+88 1 | |HARO 1951 |ARO 179 +049.4+02.4 |19 10 49.5 +15 41 32. 76..9055|He 2-428 | 49+02 1 |19108+1541 |HENIZE 1964 |ARO 186,M 4-12 +050.1+03.3 |19 09 16.7 +16 46 29. 73..9034|M 1-67 | 50+03 1 |19092+1646 |MERRILL 1938 |ARO 10,He 2- 427,Sh 2- 80,VV 220,VV' 481 +050.4+05.2 |19 02 19.2 +17 52 36. 76..9055|A 52 | 50+05 1 |19023+1752 |ABELL 1955 |A55 40,ARO 144,VV' 476 +050.4-01.6 |19 27 59.12+14 41 01.7 90..1502|K 4-28 | 50-01 1 |19279+1441 |KOHOUTEK 1964 | +051.0+02.8 |19 12 46. +17 17 30. * 86..2788|WhMe 1 | | |WHITELOCK et al 1986 | +051.0+03.0 |19 11 50.9 +17 26 20. 76..9055|He 2-430 | 51+03 1 |19118+1726 |HENIZE 1964 |ARO 308,AS 345,MHa 305- 11 +051.0-04.5 |19 39 44.20+13 43 32.0 90..1502|PC 22 | 51-04 1 |19397+1343 |APRIAMASVILI 1959 |ARO 160,VV' 508 +051.3+01.8 |19 17 04. +17 06 14. 90..2003|PM 1-295 | | |PREITE-MARTINEZ 1988 |TCSS 1 +051.4+09.6 |18 47 38.60+20 47 07.9 90..1502|Hu 2-1 | 51+09 1 |18476+2047 |HUMASON 1922 |Anon. 18h47m,ARO 100,VV 208,VV' 458 +051.5+06.1 |19 01 26.0 +19 16 53. 73..9034|K 1-17 | 51+06 1 |19014+1916 |KOHOUTEK 1963 |ARO 83 +051.9+25.8 |17 42 57.8 +27 21 17. 73..9034|K 1-15 | 51+25 1 | |KOHOUTEK 1963 |ARO 98 +051.9-03.8 |19 38 51.4 +14 49 50. 76..9055|M 1-73 | 51-03 1 |19388+1449 |MINKOWSKI 1946 |ARO 158,He 2- 443,VV 238,VV' 506 +052.2+07.6 |18 56 53.70+20 32 52.0 90..1502|K 4-10 | 52+07 1 |18569+2032 |KOHOUTEK 1964 | +052.2-04.0 |19 40 01.3 +15 01 57. 73..9034|M 1-74 | 52-04 1 |19400+1502 |MINKOWSKI 1946 |ARO 162,He 2- 445,VV 240,VV' 510 +052.5-02.9 |19 36 53.5 +15 49 54. 73..9034|Me 1-1 | 52-02 2 |19368+1549 |MERRILL 1942 |ARO 104,He 2- 441,VV' 505,VV 237 +052.9+02.7 |19 16 50.54+18 56 46.8 90..1502|K 3-31 | 52+02 1 |19168+1856 |KOHOUTEK 1964 |ARO 315 +052.9-02.7 |19 37 02.41+16 14 20.8 90..1502|K 3-41 | 52-02 1 |19370+1613 |KOHOUTEK 1964 |ARO 328 +053.2-01.5 |19 33 03.4 +17 06 22. 67.30013|K 3-38 | 53-01 1 |19330+1706 |KOHOUTEK 1964 | +053.3+03.0 |19 16 29.5 +19 28 23. 73..9034|A 59 | 53+03 1 |19164+1928 |ABELL 1955 |A55 48,ARO 84,VV' 494 +053.3+24.0 |17 52 24.7 +28 00 29. 67.30013|Vy 1- 2 | 53+24 1 |17524+2800 |VYSSOTSKY 1942 |ARO 182,VV 129,VV' 291 +053.8-03.0 |19 39 55.2 +16 58 00. 76..9055|A 63 | 53-03 1 | |ABELL 1955 |A55 51,ARO 161,VV' 509 +054.1-12.1 |20 12 48.0 +12 32 54. 73..9034|NGC 6891 | 54-12 1 |20127+1233 |COPELAND 1884 |ARO 37,VV 253,VV' 529 +054.4-02.5 |19 39 19.48+17 38 12.2 90..1502|M 1-72 | 54-02 1 |19393+1738 |MINKOWSKI 1946 |ARO 159,He 2- 444,VV 239,VV' 507 +055.1-01.8 |19 38 12.00+18 42 18.0 90..1502|K 3-43 | 55-01 1 |19382+1842 |KOHOUTEK 1964 | +055.2+02.8 |19 21 15.13+21 02 08.1 90..1502|He 2-432 | 55+02 1 |19212+2102 |HENIZE 1964 |ARO 321 +055.3+02.7 |19 21 37.1 +21 00 46. 73..9034|He 1- 1 | 55+02 2 |19216+2100 |HENIZE 1961 |ARO 188,He 2- 433 +055.3+06.6 |19 06 32.6 +22 54 00. 76..9055|A 54 | 55+06 1 | |ABELL 1955 |A55 42,ARO 184,VV' 479 +055.4+16.0 |18 29 18.7 +26 54 05. 83...481|A 46 | 55+16 1 | |ABELL 1955 |A55 34,ARO 119,VV' 419 +055.5-00.5 |19 34 14.6 +19 35 45. 76..9055|M 1-71 | 55-00 1 |19342+1935 |MINKOWSKI 1946 |ARO 156,He 2- 439,VV 236,VV' 504 +055.6+02.1 |19 24 28.0 +21 03 30. 76..9055|He 1- 2 | 55+02 3 |19244+2103 |HENIZE 1961 |ARO 189,He 2- 435 +056.0+02.0 |19 25 34.63+21 23 53.5 90..1502|K 3-35 | 56+02 1 |19255+2123 |KOHOUTEK 1964 |ARO 323 +056.4-00.9 |19 37 24.41+20 12 04.4 90..1502|K 3-42 | 56-00 1 | |KOHOUTEK 1964 | +056.8-06.9 |20 00 20.60+17 28 23.0 90..1502|K 3-51 | 56-06 1 |20003+1728 |KOHOUTEK 1964 |ARO 340 +057.2-08.9 |20 08 09.9 +16 46 24. 73..9034|NGC 6879 | 57-08 1 |20081+1646 |PICKERING 1883 |ARO 107,He 2- 455,VV 249,VV' 525 +057.9-01.5 |19 43 11.74+21 12 43.4 90..1502|He 2-447 | 57-01 1 |19431+2112 |HENIZE 1964 |VES 47 +058.3-10.9 |20 17 51.4 +16 34 22. 86..1121|IC 4997 | 58-10 1 |20178+1634 |FLEMING 1896 |ARO 38,He 2- 464,VV 256,VV' 532 +058.6+06.1 |19 15 00. +25 32 a 67.30013|A 57 | 58+06 1 | |ABELL 1955 |A55 46,ARO 149,VV' 490 +058.6-05.5 |19 59 29.1 +19 46 18. 81..1143|WeSb 5 | | |WEINBERGER et al 1981 | +058.9+01.3 |19 34 14.75+23 33 02.8 90..1502|K 3-40 | 58+01 1 |19342+2333 |KOHOUTEK 1964 |VES 16 +059.0+04.6 |19 21 58.5 +25 12 54. 67.30013|K 3-34 | 59+04 1 | |KOHOUTEK 1964 | +059.0-01.7 |19 46 15.5 +22 02 28. 76..9055|He 1- 3 | 59-01 1 |19462+2201 |HENIZE 1961 |ARO 164,He 2- 448 +059.4+02.3 |19 31 40.92+24 25 52.5 90..1502|K 3-37 | 59+02 1 |19316+2425 |KOHOUTEK 1964 |ARO 325 +059.7-18.7 |20 47 40.1 +13 22 15. 83...481|A 72 | 59-18 1 |20476+1322 |ABELL 1955 |A55 59,ARO 173,VV' 538 +059.9+02.0 |19 33 48.98+24 48 07.2 90..1502|K 3-39 | 59+02 2 |19338+2448 |KOHOUTEK 1964 |ARO 326 +060.0-04.3 |19 58 00.0 +21 34 40. 76..9055|A 68 | 60-04 1 |19579+2134 |ABELL 1955 |A55 55,ARO 166,VV' 522 +060.1-07.7 |20 10 29.4 +19 50 18. 86..1121|NGC 6886 | 60-07 2 |20104+1950 |COPELAND 1884 |ARO 109,He 2- 458,VV 252,VV' 528 +060.3-07.3 |20 09 42.9 +20 11 04. 76..9055|He 1- 5 | 60-07 1 |20097+2010 |HENIZE 1961 |ARO 169,He 2- 457,He 3-1844 +060.4+01.5 |19 36 46.9 +24 58 36. 91.30001|PM 1-310 | |19367+2458 |PREITE-MARTINEZ 1988 |HuDo 1 +060.5+01.8 |19 36 03.24+25 08 48.9 90..1502|He 2-440 | 60+01 1 |19360+2508 |HENIZE 1964 |VES 26 +060.5-00.3 |19 44 08.7 +24 03 43. 67.30013|K 3-45 | 60-00 1 |19442+2404 |KOHOUTEK 1964 | +060.8-03.6 |19 57 26.6 +22 34 45. 73..9034|NGC 6853 | 60-03 1 |19574+2234 |HUGGINS 1864 |ARO 14,He 2- 452,M 27,VV 246,VV' 521 +061.0+08.0 |19 12 30.9 +28 35 27. 83...481|K 3-27 | 61+08 1 |19125+2835 |KOHOUTEK 1964 | +061.3+03.6 |19 30 54.9 +26 46 13. 76..9055|He 2-437 | 61+03 1 |19309+2646 |HENIZE 1964 |ARO 154,M 4-15 +061.4-09.5 |20 20 08.5 +19 56 39. 73..9034|NGC 6905 | 61-09 1 |20201+1956 |HERSCHEL 1831 |ARO 75,He 2- 466,VV 257,VV' 535 +061.8+02.1 |19 37 36. +26 24 a 67.30013|He 2-442 | 61+02 1 | |HENIZE 1964 |ARO 157,M 4-16 +061.9+41.3 |16 38 34.71+38 48 05.1 90..1502|DdDm 1 | |16385+3848 |DOLIDZE et al 1966 |KO 1,DDDM 1 +062.4+09.5 |19 09 11. +30 27 52. 67.30013|NGC 6765 | 62+09 1 |19091+3027 |MINKOWSKI 1946 |ARO 185,M 1-68,VV 221,VV' 482 +062.4-00.2 |19 48 23.1 +25 46 41. 76..9055|M 2-48 | 62-00 1 |19483+2546 |MINKOWSKI 1947 |ARO 190,He 2- 449,VV 243,VV' 515 +063.1+13.9 |18 51 44.2 +32 57 52. 67.30013|NGC 6720 | 63+13 1 |18517+3257 |MESSIER et al 1779 |ARO 9,M 57,VV 214,VV' 466 +063.8-03.3 |20 02 52.01+25 18 01.2 90..1502|K 3-54 | 63-03 1 |20028+2518 |KOHOUTEK 1964 |ARO 343 +064.6+48.2 |16 02 43.4 +40 49 04. 83...481|NGC 6058 | 64+48 1 |16027+4049 |CURTIS 1918 |ARO 49,VV 76,VV' 129 +064.7+05.0 |19 32 47.5 +30 24 20. 86..1121|BD+30 3639 | 64+05 1 |19327+3024 |CAMPBELL 1893 |ARO 11,He 2- 438,VV 235,VV' 503 +064.9+15.5 |18 48 14.0 +35 11 02. 71..9067|M 1-64 | 64+15 1 |18482+3510 |MINKOWSKI 1946 |ARO 82,VV 210,VV' 460 +064.9-02.1 |20 01 17.89+26 52 25.0 90..1502|K 3-53 | 64-02 1 |20012+2652 |KOHOUTEK 1964 |ARO 341 +065.0-27.3 |21 27 34.4 +11 57 14.6 83..1351|Ps 1 | 65-27 1 |21274+1156 |PEASE 1928 |ARO 111,Ku 648,VV 265,VV' 550 +065.1-03.5 |20 06 58.8 +26 18 02. 77..1547|We 1- 9 | |20069+2618 |WEINBERGER 1977 | +065.2-05.6 |20 15 13.9 +25 12 22. 76..9055|He 1- 6 | 65-05 1 |20152+2512 |HENIZE 1961 |ARO 171,He 2- 462 +065.9+00.5 |19 53 01.4 +29 09 23. 83...481|NGC 6842 | 65+00 1 |19530+2909 |CURTIS 1919 |ARO 106,He 2- 451,Sh 1- 72,Sh 2- 95,VV 245,VV' 518 +066.7-28.2 |21 34 28.0 +12 33 48. 83...481|NGC 7094 | 66-28 1 |21344+1233 |KOHOUTEK 1963 |ARO 194,K 1-19 +066.9+02.2 |19 49 02.4 +30 54 48. 81..1550|K 4-37 | 66+02 1 | |KOHOUTEK 1964 | +066.9-05.2 |20 17 32.2 +26 50 44. 67.30013|PC 24 | 66-05 1 |20175+2650 |PEIMBERT et al 1961 |ARO 192,He 1- 7,He 2- 463 +067.9-00.2 |20 01 11.51+30 24 04.8 90..1502|K 3-52 | 67-00 1 |20011+3024 |KOHOUTEK 1964 | +068.3-02.7 |20 11 55.70+29 24 46.7 90..1502|He 2-459 | 68-02 1 |20119+2924 |HENIZE 1964 |ARO 347,VES 123 +068.6+01.1 |19 57 20.0 +31 47 03. 67.30013|He 1- 4 | 68+01 2 | |HENIZE 1961 |ARO 191,AS 375,He 2- 453,MHa 92- 31 +068.7+01.9 |19 54 37.21+32 14 08.6 90..1502|K 4-41 | 68+01 1 |19546+3214 |KOHOUTEK 1964 | +068.7+03.0 |19 49 57.21+32 51 31.7 90..1502|PC 23 | 68+03 1 |19499+3251 |PEIMBERT et al 1961 |ARO 165,He 2- 450 +068.7+14.8 |18 58 44.9 +38 17 03. 85..3129|Sp 4-1 | | |STEPHENSON 1985 | +068.8-00.0 |20 02 45.1 +31 18 51. 67.30013|M 1-75 | 68-00 1 |20027+3118 |MINKOWSKI 1946 |ARO 168,He 2- 454,VV 248,VV' 524 +069.2+02.8 |19 52 05.29+33 14 05.8 90..1502|K 3-49 | 69+02 1 |19520+3314 |KOHOUTEK 1964 |ARO 338 +069.2+03.8 |19 48 06.0 +33 38 16. 67.30013|K 3-46 | 69+03 1 |19481+3338 |KOHOUTEK 1964 |ARO 334 +069.4-02.6 |20 14 22.8 +30 24 36. 67.30013|NGC 6894 | 69-02 1 |20143+3024 |HERSCHEL 1823 |ARO 110,HE 2- 460,VV 254,VV' 530 +069.6-03.9 |20 19 56.0 +29 49 46. 67.30013|K 3-58 | 69-03 1 | |KOHOUTEK 1964 |ARO 348 +069.7-00.0 |20 04 58.30+32 07 49.9 90..1502|K 3-55 | 69+00 1 | |KOHOUTEK 1964 | +071.6-02.3 |20 19 04.71+32 19 49.2 90..1502|M 3-35 | 71-02 1 |20190+3219 |MINKOWSKI 1948 |ARO 172,He 2- 465,VV' 534 +072.1+00.1 |20 10 52.05+34 11 27.4 90..1502|K 3-57 | 72+00 1 |20108+3411 |KOHOUTEK 1964 | +072.7-17.1 |21 14 38.15+23 56 15.6 67.30013|A 74 | 72-17 1 | |ABELL 1955 |A55 61,ARO 193,VV' 546 +073.0-02.4 |20 23 09.14+33 24 22.5 90..1502|K 3-76 | | |KOHOUTEK 1972 | +074.5+02.1 |20 09 01.63+37 15 44.3 90..1502|NGC 6881 | 74+02 1 |20090+3715 |PICKERING 1881 |ARO 108,He 2- 456,VV 250,VV' 526 +075.6+04.3 |20 02 36. +39 26 a 67.30013|Anon. 20h02m | 75+04 1 | |ANON. |ARO 342 +075.7+35.8 |17 12 30. +49 19 00. 83..3101|Sa 4- 1 | | |SANDULEAK 1983 | +076.3+01.1 |20 18 06. +38 15 a 67.30013|A 69 | 76+01 1 | |ABELL 1955 |A55 56,ARO 15,VV' 533 +076.4+01.8 |20 15 25.8 +38 40 54. 71..9082|KjPn 3 | | |KAZARYAN et al 1971 |K 4-52 +077.5+03.7 |20 10 24. +40 41 12. * 71..9082|KjPn 1 | |20107+4038 |KAZARYAN et al 1971 |AS 389,K 4-51,MHa 328-107 +077.6+14.7 |19 17 42. +46 09 a 67.30013|A 61 | 77+14 1 | |ABELL 1955 |A55 49,VV' 495 +077.7+03.1 |20 13 30. +40 31 18. * 71..9082|KjPn 2 | |20136+4025 |KAZARYAN et al 1971 |K 3-75 +078.3-02.7 |20 40 21.0 +37 29 42. 72..9045|K 4-53 | |20403+3729 |KOHOUTEK 1972 | +078.5+18.7 |18 58 00. +48 24 a 67.30013|A 50 | 78+18 1 | |ABELL 1955 |A55 39,NGC,6742,VV' 472 +078.6+05.2 |20 07 01.2 +42 21 18. 72..9045|Dd 1 | | |DOLIDZE 1971 |K 3-74 +078.9+00.7 |20 27 30. +40 05 18. * 72..9045|Sd 1 | | |SHERWOOD 1969 |K 3-77,KjPn 5 +079.6+05.8 |20 07 22.2 +43 34 54. 67.30013|M 4-17 | 79+05 1 |20073+4334 |MINKOWSKI 1948 |ARO 346 +079.9+06.4 |20 05 17.0 +44 05 37. 67.30013|K 3-56 | 79+06 1 |20052+4405 |KOHOUTEK 1964 |ARO 345 +081.2-14.9 |21 33 20.1 +31 28 18. 83...481|A 78 | 81-14 1 | |ABELL 1955 |A55 64,ARO 174,VV' 554 +082.1+07.0 |20 08 49.0 +46 18 42. 86..1121|NGC 6884 | 82+07 1 |20088+4618 |COPELAND 1884 |ARO 57,VV 251,VV' 527 +082.5+11.3 |19 48 20.85+48 50 01.1 90..1502|NGC 6833 | 82+11 1 | |PICKERING 1883 |ARO 105,VV 244,VV' 516 +083.5+12.7 |19 43 27.2 +50 24 10. 67.30013|NGC 6826 | 83+12 1 |19434+5024 |HERSCHEL 1793 |ARO 13,VV 242,VV' 514 +083.9-08.4 |21 20 16.2 +37 54 24. 72..9045|K 3-81 | | |KOHOUTEK 1972 | +084.0+09.5 |20 02 31.8 +49 10 36. 72..9045|K 3-73 | | |KOHOUTEK 1972 | +084.2+01.0 |20 43 25.8 +44 28 18. 72..9045|K 4-55 | | |KOHOUTEK 1972 | +084.2-04.2 |21 05 46.2 +40 58 48. 72..9045|K 3-80 | | |KOHOUTEK 1972 | +084.9+04.4 |20 30 46.5 +47 10 48. 83...481|A 71 | 85+04 1 | |ABELL 1955 |A55 58,ARO 352,Sh 2-116,VV' 537 +084.9-03.4 |21 05 09.5 +42 02 02.8 82..1149|NGC 7027 | 84-03 1 | |WEBB 1879 |ARO 40,Sh 2-113,VV 261,VV' 543 +086.1+05.4 |20 30 19.2 +48 42 27. 77..1547|We 1- 10 | | |WEINBERGER 1977 | +086.5-08.8 |21 31 07.4 +39 24 40. 67.30013|Hu 1-2 | 86-08 1 |21311+3924 |HUMASON 1921 |Anon.21h31m,ARO 89,VV 267,VV' 553 +087.4-03.8 |21 16 14.9 +43 36 00. 77..1548|We 2-245 | | |WEINBERGER 1977 | +088.7+04.6 |20 43 49.47+50 11 40.5 90..1502|K 3-78 | |20438+5011 |KOHOUTEK 1972 | +088.7-01.6 |21 12 27.7 +46 04 50. 67.30013|NGC 7048 | 88-01 1 |21124+4604 |CURTIS 1919 |ARO 41,Hb 9,VV 262,VV' 545 +089.0+00.3 |21 04 35.5 +47 39 02. 86..1121|NGC 7026 | 89+00 1 |21046+4739 |COPELAND 1880 |ARO 59,EM* CDS 1218,VV 260,VV' 542 +089.3-02.2 |21 17 19. +46 06 05. 67.30013|M 1-77 | 89-02 1 |21173+4606 |MINKOWSKI 1946 |ARO 42,VV 263,VV' 547 +089.8-00.6 |21 12 19. +47 32 67.30013|Sh 1- 89 | 89-00 1 |21123+4733 |SHARPLESS 1959 |ARO 357,VV' 544 +089.8-05.1 |21 30 36.76+44 22 28.5 90..1502|IC 5117 | 89-05 1 |21306+4422 |FLEMING 1905 |ARO 112,VV 266,VV' 552 +091.6+01.8 |21 09 13.8 +50 34 48. 77..1547|We 1- 11 | |21092+5035 |WEINBERGER 1977 | +091.6-04.8 |21 36 55.2 +45 46 54. 72..9045|K 3-84 | |21369+4546 |KOHOUTEK 1972 | +092.1+05.8 |20 51 46.2 +53 34 18. 72..9045|K 3-79 | | |KOHOUTEK 1972 | +093.3-00.9 |21 29 06. +49 46 54. * 72..9045|K 3-82 | |21291+4946 |KOHOUTEK 1972 | +093.3-02.4 |21 35 11.7 +48 42 41. 83....46|M 1-79 | 93-02 1 |21351+4842 |MINKOWSKI 1946 |ARO 365,VV 268,VV'555 +093.4+05.4 |20 59 05.1 +54 20 41. 67.30013|NGC 7008 | 93+05 2 |20590+5420 |PEASE 1917 |ARO 39,VV 258,VV' 540 +093.5+01.4 |21 19 05.7 +51 40 38. 83....46|M 1-78 | 93+01 1 |21190+5140 |MINKOWSKI 1946 |ARO 358,VV 264,VV' 548 +094.0+27.4 |18 21 35.3 +64 20 30. 83...481|K 1-16 | 94+27 1 |18216+6419 |KOHOUTEK 1963 | +094.5-00.8 |21 33 58.8 +50 40 48. 72..9045|K 3-83 | |21339+5040 |KOHOUTEK 1972 | +095.1-02.0 |21 41 29.30+50 11 28.2 90..1502|M 2-49 | 95-02 1 |21414+5011 |MINKOWSKI 1947 |ARO 367,VV 269,VV' 556 +095.2+00.7 |21 30 09.00+52 20 34.0 90..1502|K 3-62 | 95+00 1 |21301+5220 |KOHOUTEK 1964 |ARO 362 +095.2+07.8 |20 55 07.5 +57 14 21. 83...481|A 73 | 95+07 1 |20551+5714 |ABELL 1955 |A55 60,ARO 356,VV' 539 +096.3+02.3 |21 28 23.8 +54 14 17. 67.30013|K 3-61 | 96+02 1 |21284+5414 |KOHOUTEK 1964 |ARO 361 +096.4+29.9 |17 58 34.2 +66 38 05. 67.30013|NGC 6543 | 96+29 1 | |HERSCHEL 1786 |ARO 6,VV 143,VV' 335 +097.5+03.1 |21 30 36.2 +55 39 27. 83....46|A 77 | 97+03 1 |21306+5540 |ABELL 1955 |A55 63,ARO 363,Sh 2-128,VV' 551 +097.6-02.4 |21 55 51.2 +51 27 20. 67.30013|M 2-50 | 97-02 1 |21559+5127 |MINKOWSKI 1947 |ARO 368,VV 271,VV' 558 +098.1+02.4 |21 37 34.5 +55 32 27. 83....46|K 3-63 | 98+02 1 |21375+5532 |KOHOUTEK 1964 |ARO 366 +098.2+04.9 |21 25 57.82+57 26 00.5 90..1502|K 3-60 | 98+04 1 |21259+5726 |KOHOUTEK 1964 | +100.0-08.7 |22 29 37.78+47 32 37.1 90..1502|Me 2-2 |100-08 1 |22296+4732 |MERRILL 1941 |Anon.22h29m,ARO 373 +100.6-05.4 |22 21 55.7 +50 42 47. 86..1121|IC 5217 |100-05 1 |22219+5042 |FLEMING 1904 |ARO 85,VV 274,VV' 561 +101.8+08.7 |21 25 11.3 +62 40 23. 83...481|A 75 |101+08 1 |21251+6240 |ABELL 1964 |ARO 359 +102.8-05.0 |22 32 43.8 +52 10 32. 83...481|A 80 |102-05 1 | |ABELL 1955 |A55 66,ARO 375,VV' 565 +102.9-02.3 |22 24 21.5 +54 34 23. 83...481|A 79 |102-02 1 | |ABELL 1955 |A55 65,ARO 372,VV' 562 +103.2+00.6 |22 14 15.6 +57 13 42. 83...481|M 2-51 |103+00 1 |22142+5713 |MINKOWSKI 1947 |ARO 369,VV 272,VV' 559 +103.7+00.4 |22 18 41.8 +57 21 11. 67.30013|M 2-52 |103+00 2 |22187+5721 |MINKOWSKI 1947 |ARO 371,VV 273,VV' 560 +104.1+01.0 |22 18 28.49+57 59 09.8 90..1502|Bl 2- 1 |104+00 1 |22184+5759 |BLANCO 1964 |ARO 370 +104.1+07.9 |21 44 51.2 +63 33 21. 83...481|NGC 7139 |104+07 1 | |CURTIS 1918 |ARO 54,VV 270,VV' 557 +104.2-29.6 |23 33 24.1 +30 11 26. 83...481|Jn 1 |104-29 1 | |JONES 1941 |ARO 195,VV' 578 +104.4-01.6 |22 30 21.4 +55 54 55. 67.30013|M 2-53 |104-01 1 |22303+5554 |MINKOWSKI 1947 |ARO 374,VV 276,VV' 564 +104.8-06.7 |22 49 30. +51 35 a 67.30013|M 2-54 |104-06 1 |22495+5134 |MINKOWSKI 1947 |ARO 377,EM* CDS 1406,VV 279,VV' 569 +106.5-17.6 |23 23 29.4 +42 15 36. 67.30013|NGC 7662 |106-17 1 |23234+4215 |HERSCHEL 1784 |ARO 20,VV 285,VV' 575 +107.4-00.6 |22 46 34.8 +58 13 12. 72..9045|K 4-57 | |22465+5813 |KOHOUTEK 1972 | +107.4-02.6 |22 53 01.8 +56 26 30. 72..9045|K 3-87 | |22529+5626 |KOHOUTEK 1972 | +107.6-13.3 |23 20 36.0 +46 37 29. 83....46|Vy 2- 3 |107-13 1 |23206+4637 |MILLER 1945 |VV 284,VV 284,VV' 574 +107.7+07.8 |22 11 56.0 +65 39 01. 87..1248|IsWe 2 | | |ISHIDA et al 1987 | +107.7-02.2 |22 54 14.6 +56 53 19. 67.30013|M 1-80 |107-02 1 |22542+5653 |MINKOWSKI 1946 |Anon. 22h54m,ARO 113,VV 281,VV' 571 +107.8+02.3 |22 38 28.1 +61 01 25. 86..1121|NGC 7354 |107+02 1 |22384+6101 |LORD ROSSE 1862 |ARO 55,VV 278,VV' 567 +108.4-76.1 |00 34 47. -13 58 42. 77...257|BoBn 1 | | |BOESHAAR et al 1977 | +110.1+01.9 |22 56 51.2 +61 41 37. 89.13501|PM 1-339 | |22568+6141 |PREITE-MARTINEZ 1988 |MRMG 1 +110.6-12.9 |23 36 42.0 +47 56 00. 89..1570|K 1-20 |110-12 1 | |KOHOUTEK 1963 |Anon.23h24m,ARO 384 +111.0+11.6 |22 18 21.8 +70 40 55. 80..1011|DeHt 5 | | |DENGEL et al 1980 | +111.2+07.0 |22 46 12. +66 46 42. * 71..9082|KjPn 6 | |22472+6645 |KAZARYAN et al 1971 |K 4-58 +111.8-02.8 |23 23 57.30+57 54 24.3 90..1502|Hb 12 |111-02 1 |23239+5754 |HUBBLE 1921 |ARO 381,VV 286,VV'576 +112.5+03.7 |23 10 11.00+64 23 00.0 90..1502|K 3-88 | | |KOHOUTEK 1972 | +112.5-00.1 |23 22 06. +60 40 30. * 71..9082|KjPn 8 | | |KAZARYAN et al 1971 |K 3-89 +112.9-10.2 |23 45 16.0 +51 07 17. 83...481|A 84 |112-10 1 |23452+5107 |ABELL 1955 |A55 70,ARO 115,VV' 581 +113.6-06.9 |23 44 18. +54 28 a 67.30013|A 83 |113-06 1 | |ABELL 1955 |A55 69,ARO 385,VV' 580 +114.0-04.6 |23 43 20.6 +56 47 21. 83...481|A 82 |114-04 1 |23433+5646 |ABELL 1955 |A55 68,ARO 114,VV' 579 +116.2+08.5 |23 29 41.0 +70 05 40. 83...481|M 2-55 |116+08 1 |23296+7005 |MINKOWSKI 1947 |ARO 382,VV 287,VV' 577 +117.5+18.9 |22 42 12.0 +80 11 00. 89..1570|IC 1454 |117+18 1 |22419+8010 |ABELL 1955 |A55 67,A 81,ARO 376,VV' 568 +118.0-08.6 |00 16 00.0 +53 36 00.0 90..1502|Vy 1- 1 |118-08 1 |00160+5335 |VYSSOTSKY 1942 |ARO 90,VV 2,VV' 4 +118.7+08.2 |23 59 00. +70 26 a 67.30013|A 86 |118+08 2 | |ABELL 1955 |A55 73,ARO 245,VV' 584 +118.8-74.7 |00 44 32.9 -12 08 44. 83...481|NGC 246 |118-74 1 |00445-1207 |HERSCHEL 1785 |ARO 43,VV 4,VV' 7 +119.3+00.3 |00 17 15.00+62 42 22.0 90..1502|BV 5-1 |119+00 1 |00172+6242 |BOHM-VITENSE 1956 |ARO 199 +119.4+06.5 |00 09 54.0 +68 54 00. 89..1570|A 1 |119+06 1 | |ABELL 1955 |A55 1,ARO 198,VV' 2 +119.6-06.7 |00 25 30.2 +55 41 20. 67.30013|Hu 1-1 |119-06 1 |00255+5541 |HUMASON 1921 |ARO 18,VV 3,VV' 5 +120.0+09.8 |00 10 16.5 +72 14 39. 67.30013|NGC 40 |120+09 1 |00102+7214 |FLEMING 1912 |ARO 1,VV 1,VV' 3 +120.2-05.3 |00 29 06. +57 06 a 83...109|Sh 2-176 | | |SABBADIN et al 1977 | +121.6+03.5 |00 35 55.2 +66 07 12. 89..1570|We 1- 1 | |00359+6607 |WEINBERGER 1977 | +121.6-00.0 |00 37 26.00+62 34 49.0 90..1502|BV 5-2 |121+00 1 |00374+6234 |BOHM-VITENSE 1956 |ARO 201,Sh 2-179 +122.1-04.9 |00 42 42.0 +57 41 00. 89..1570|A 2 |122-04 1 |00426+5741 |ABELL 1955 |A55 2,ARO 202,VV' 6 +123.6+34.5 |12 31 46.6 +82 50 22. 67.30013|IC 3568 |123+34 1 |12317+8250 |AITKEN 1900 |ARO 56,VV 63,VV' 111 +124.0+10.7 |01 03 31.2 +73 17 22. 84..3036|EGB 1 | | |ELLIS et al 1984 |ELO 103+73,HaWe 1 +124.3-07.7 |00 57 55.7 +54 47 30. 81..1143|WeSb 1 | | |WEINBERGER et al 1981 | +125.9-47.0 |00 57 19. +15 28 a 67..9003|PHL 932 | |00572+1528 |ARP et al 1967 | +126.3+02.9 |01 21 33.0 +65 23 00. 72..9045|K 3-90 | |01215+6523 |KOHOUTEK 1972 | +128.0-04.1 |01 27 25. +58 06 33. 82.13501|Simeiz 22 | | |SHARPLESS 1959 |Sh 2-188 +129.2-02.0 |01 39 15. +59 55 77..1548|We 2- 5 | | |WEINBERGER 1977 | +129.5+04.5 |01 54 47.4 +66 19 29. 89..1570|K 3-91 | | |KOHOUTEK 1972 | +130.2+01.3 |01 53 57.9 +63 04 42. 86..1121|IC 1747 |130+01 1 |01539+6304 |FLEMING 1905 |ARO 91,VV 7,VV' 10 +130.3-11.7 |01 34 12.9 +50 12 57. 67.30013|M 1- 1 |130-11 1 |01342+5012 |MINKOWSKI 1946 |ARO 58,VV 5,VV' 8 +130.4+03.1 |01 59 54.6 +64 43 12. 89..1570|K 3-92 | |02000+6443 |KOHOUTEK 1972 | +130.9-10.5 |01 39 12. +51 19 a 76.25010|NGC 650-51 |130-10 1 |01391+5119 |CURTIS 1918 |ARO 2 ,M 76,VV 6 ,VV'9 +131.4-05.4 |01 49 42.00+56 09 36.0 90..1502|BV 5-3 |131-05 1 | |BOHM-VITENSE 1956 |ARO 203 +131.5+02.6 |02 08 24.0 +63 55 00. 89..1570|A 3 |131+02 1 | |ABELL 1955 |A55 3,ARO 204,Sh 2-189,VV'12 +132.4+04.7 |02 22 29.4 +65 34 24. 72..9045|K 3-93 | | |KOHOUTEK 1972 | +133.1-08.6 |01 55 32.5 +52 39 10. 83....46|M 1- 2 |133-08 1 |01555+5239 |MINKOWSKI 1946 |VV 8,ARO 116,VV' 11 +136.1+04.9 |02 54 42.0 +64 18 00. 89..1570|A 6 |136+04 1 |02545+6417 |ABELL 1955 |A55 5,ARO 207 +136.3+05.5 |02 59 34. +64 41 45. 82.17255|HFG 1 | | |HECKATHORN et al 1982 | +138.1+04.1 |03 06 51.7 +62 36 43. 83.28034|HDW 2 | | |HARTL et al 1983 |HaWe 2 +138.8+02.8 |03 06 16.4 +61 07 39. 67.30013|IC 289 |138+02 1 |03062+6107 |HUBBLE 1921 |ARO 86,Hb 1,VV 9,VV' 15 +141.7-07.8 |02 48 44.8 +50 23 35. 83...481|A 5 |141-07 1 | |ABELL 1955 |A55 4,ARO 206,VV' 14 +142.1+03.4 |03 32 01.24+59 53 51.4 90..1502|K 3-94 | |03319+5953 |KOHOUTEK 1972 | +143.6+23.8 |06 23 48. +71 06 a 84..3036|EGB 4 | | |ELLIS et al 1984 | +144.3-15.5 |02 42 12.0 +42 19 59. 89..1570|A 4 |144-15 1 |02421+4222 |ABELL 1964 |ARO 205,VV' 13 +144.5+06.5 |04 02 42. +60 47 a 76.25010|NGC 1501 |144+06 1 |04026+6047 |HERSCHEL 1787 |ARO 44,VV 16,VV' 22 +146.7+07.6 |04 21 31.16+60 00 24.1 90..1502|M 4-18 |146+07 1 |04215+6000 |MINKOWSKI 1959 |ARO 213 +147.4-02.3 |03 37 59.13+52 07 25.2 90..1502|M 1- 4 |147-02 1 |03379+5207 |MINKOWSKI 1946 |ARO 209,VV 11,VV' 17 +147.8+04.1 |04 09 10.2 +56 49 16. 83....46|M 2- 2 |147+04 1 |04091+5649 |MINKOWSKI 1947 |ARO 211,VV 18,VV' 24 +148.4+57.0 |11 11 53.3 +55 17 21. 80..2080|NGC 3587 |148+57 1 |11119+5517 |LORD ROSSE 1850 |ARO 25,M 97,VV 59,VV'107 +149.0+04.4 |04 16 41.18+56 11 04.3 90..1502|K 4-47 | |04166+5611 |KOHOUTEK 1969 | +149.4-09.2 |03 23 48.9 +45 13 54. 83.28034|HDW 3 | | |HARTL et al 1983 |HaWe 4 +149.7-03.3 |03 45 25.7 +49 51 06.7 87..1248|IsWe 1 | | |ISHIDA et al 1987 | +151.4+00.5 |04 09 37.9 +51 43 25. 77..1548|K 3-64 | | |KOHOUTEK 1969 | +153.7+22.8 |06 39 18.9 +61 50 26. 83...481|A 16 |153+22 1 | |ABELL 1955 |A55 11,ARO 222,VV' 47 +153.7-01.4 |04 12 12.60+48 42 14.0 90..1502|K 3-65 | |04122+4842 |KOHOUTEK 1969 | +156.9-13.3 |03 42 10.1 +37 39 27. 87..1593|HaWe 5 | | |HARTL et al 1987 | +158.8+37.1 |08 37 37.8 +58 24 37. 83...481|A 28 |158+37 1 | |ABELL 1955 |A55 18,VV' 78 +158.9+17.8 |06 15 23.2 +55 37 59. 83...481|PuWe 1 | | |PURGATHOFER et al 1980 | +159.0-15.1 |03 44 20.23+34 53 35.8 90..1502|IC 351 |159-15 1 |03443+3453 |BARNARD 1891 |ARO 19,VV 12,VV' 18 +160.5-00.5 |04 43 07.0 +44 22 38. 77..1547|We 1- 2 | | |WEINBERGER 1977 | +161.2-14.8 |03 53 10.05+33 43 50.0 90..1502|IC 2003 |161-14 1 |03531+3343 |HUBBLE 1920 |ARO 76,VV 15,VV' 21 +163.1-00.8 |04 50 59.7 +42 11 47. 77..1547|We 1- 3 | | |WEINBERGER 1977 | +164.8+31.1 |07 53 59.9 +53 33 24. 83...481|JnEr 1 |164+31 1 |07539+5333 |JONES et al 1939 |ARO 121,VV 47,VV' 74 +165.5-06.5 |04 36 27.52+36 39 52.3 90..1502|K 3-67 | |04364+3639 |KOHOUTEK 1969 | +165.5-15.2 |04 06 08.3 +30 38 43. 66.32011|NGC 1514 |165-15 1 |04061+3038 |PICKERING 1879 |ARO 21,VV 17,VV' 23 +166.1+10.4 |05 52 40.8 +46 05 53. 86..1121|IC 2149 |166+10 1 |05526+4605 |FLEMING 1906 |ARO 23,VV 26,VV' 37 +166.4-06.5 |04 39 33.8 +36 01 15. 75..9035|CRL 618 | |04395+3601 |WESTBROOK et al 1975 | +167.0-00.9 |05 03 11.4 +39 04 09. 83...481|A 8 |167-00 1 | |ABELL 1955 |A55 7,ARO 216,VV' 28 +167.4-09.1 |04 33 22.12+33 33 27.0 90..1502|K 3-66 | |04333+3333 |KOHOUTEK 1969 | +170.3+15.8 |06 30 27.98+44 48 58.4 87..3004|NGC 2242 | |06304+4448 |SHAW et al 1987 | +170.7+04.6 |05 37 54.05+39 13 39.2 90..1502|K 3-69 | |05378+3913 |KOHOUTEK 1969 | +171.3-25.8 |03 50 36.0 +19 19 00. 89..1570|Ba 1 |171-25 1 |03506+1920 |BAADE 1935 |ARO 87,VV 14,VV' 20 +173.5+03.2 |05 39 12. +36 07 42. d 80..1015|Pu 2 | | |PURGATHOFER 1980 | +173.7+02.7 |05 37 31. +35 41 04. * 85..2007|PP 40 | | |TURNER et al 1985 |GM 1-66 +173.7-05.8 |05 03 56.2 +30 46 07. 83...481|K 2- 1 |173-05 1 | |KOHOUTEK 1963 |ARO 175 +174.2-14.6 |04 34 18.0 +24 57 00. 89..1570|H 3-29 |174-14 1 |04343+2456 |MAYALL 1964 |ARO 214 +178.3-02.5 |05 28 25.2 +28 56 30. 89..1570|K 3-68 | |05284+2856 |KOHOUTEK 1969 |We 2-21 +181.5+00.9 |05 49 39. +28 05 48. d 78..1082|Pu 1 | | |PURGATHOFER 1978 | +183.8+05.5 |06 13 01.2 +28 23 09. 81..1143|WeSb 2 | | |WEINBERGER et al 1981 | +184.0-02.1 |05 43 46.09+24 20 58.5 90..1502|M 1- 5 |184-02 1 |05437+2420 |MINKOWSKI 1946 |ARO 123,ARO 219,VV 24,VV' 35 +184.6+00.6 |05 55 40.01+25 18 31.8 90..1502|K 3-70 | |05556+2518 |KOHOUTEK 1969 | +184.8+04.4 |06 10 47.4 +26 53 51. 77..1548|K 3-71 | | |KOHOUTEK 1969 | +189.1+19.8 |07 22 26.2 +29 35 35. 81.27752|NGC 2371-72 |189+19 1 |07224+2935 |PEASE 1917 |ARO 45,VV 37,VV' 61 +189.8+07.7 |06 34 17.8 +24 03 12. 76..9055|M 1- 7 |189+07 1 |06342+2403 |MINKOWSKI 1946 |ARO 127,VV 30,VV' 46 +190.3-17.7 |05 02 48.42+10 38 20.0 90..1502|J 320 |190-17 1 |05028+1038 |JONCKHEERE 1916 |ARO 60,VV 20,VV' 29 +192.5+07.2 |06 37 10.2 +21 27 45. 83.28034|HDW 6 | | |HARTL et al 1983 |HaWe 8 +193.6-09.5 |05 37 56.10+12 19 47.0 90..1502|H 3-75 |193-09 1 | |MAYALL 1964 |ARO 218 +194.2+02.5 |06 23 02.18+17 49 14.3 90..1502|J 900 |194+02 1 |06230+1749 |JONCKHEERE 1916 |ARO 92,VV 28,VV'44 +196.6-10.9 |05 39 22.0 +09 03 54. 73..9034|NGC 2022 |196-10 1 |05393+0903 |HERSCHEL 1785 |ARO 61,VV 23,VV' 34 +197.2-14.2 |05 29 06.0 +06 54 00. 89..1570|K 1- 7 |197-14 1 | |KOHOUTEK 1963 |A 10,ARO 176 +197.4-06.4 |05 56 38.4 +10 41 32. 83...109|WeDe 1 | | |WEINBERGER et al 1983 | +197.8+17.3 |07 26 13.2 +21 00 51. 73..9034|NGC 2392 |197+17 1 |07262+2100 |LASELL 1853 |ARO 24,VV 38,VV' 63 +197.8-03.3 |06 08 21.1 +11 47 30. 76..9055|A 14 |197-03 1 | |ABELL 1955 |A55 10,ARO 125,VV' 39 +198.6-06.3 |05 59 37.7 +09 39 07. 73..9034|A 12 |198-06 1 |05595+0939 |ABELL 1964 |ARO 220 +200.7+08.4 |06 57 06.0 +14 41 00. 76..9055|A 19 |200+08 1 | |ABELL 1955 |A55 14,ARO 130,VV' 51 +201.7+02.5 |06 37 09.17+11 09 18.0 90..1502|K 4-48 | |06371+1109 |KOHOUTEK 1969 | +201.9-04.6 |06 11 51.0 +07 35 30. 77..1547|We 1- 4 | | |WEINBERGER 1977 | +204.0-08.5 |06 02 08.4 +03 56 42. 83...481|A 13 |204-08 1 | |ABELL 1955 |A55 9,ARO 124,VV' 38,YM 28 +204.1+04.7 |06 49 45.2 +10 01 30. 76..9055|K 2- 2 |204+04 1 | |KOHOUTEK 1963 |ARO 128 +204.8-03.5 |06 21 14.7 +05 31 51. 77..1548|K 3-72 | | |KOHOUTEK 1969 | +205.1+14.2 |07 26 14.5 +13 20 44. 83...481|A 21 |205+14 1 | |JOHNSON et al 1971 |A55 16,A 21,ARO 388,Sh 2-274 , YM 29 +205.8-26.7 |05 01 15.1 -06 13 43. 82..1530|MaC 2- 1 | | |MAC CONNELL 1982 | +206.4-40.5 |04 11 57.0 -12 51 42. 73..9034|NGC 1535 |206-40 1 |04119-1251 |HERSCHEL 1785 |ARO 22,VV 19,VV' 25 +208.5+33.2 |08 44 04.4 +18 03 35. 83...481|A 30 |208+33 1 |08440+1803 |ABELL 1964 | +210.0+03.9 |06 57 49. +04 25 77..1548|We 2- 34 | | |WEINBERGER 1977 | +210.3+01.9 |06 50 56.5 +03 12 11. 76..9055|M 1- 8 |210+01 1 | |MINKOWSKI 1946 |ARO 129,VV 31,VV' 49 +211.2-03.5 |06 33 11.0 -00 03 11. 76..9055|M 1- 6 |211-03 1 |06331-0003 |MINKOWSKI 1946 |ARO 126,Sa 3- 1,VV 29,VV' 45 +211.4+18.4 |07 52 27.6 +09 41 09. 83.28034|HDW 7 | | |HARTL et al 1983 |HaWe 10 +211.9+22.6 |08 08 30. +11 06 00. 84..3036|EGB 5 | | |ELLIS et al 1984 | +212.0+04.3 |07 02 42.29+02 51 35.5 90..1502|M 1- 9 |212+04 1 |07026+0251 |MINKOWSKI 1946 |ARO 131,VV 32,VV' 53 +214.9+07.8 |07 20 22.1 +01 51 27. 83...481|A 20 |214+07 1 |07203+0151 |ABELL 1955 |A55 15,ARO 132,VV' 60 +215.2-24.2 |05 25 09.5 -12 44 15. 73..9034|IC 418 |215-24 1 |05251-1244 |FLEMING 1891 |ARO 3,VV 22,VV' 32 +215.5-30.8 |05 00 52.4 -15 40 24. 76..9055|A 7 |215-30 1 | |ABELL 1955 |A55 6,ARO 215,VV' 27 +215.6+03.6 |07 06 49.2 -00 43 24. 73..9034|NGC 2346 |215+03 1 |07068-0043 |MINKOWSKI 1946 |ARO 80,M 1-10,Sa 2- 5,VV 33,VV' 54 +215.6+11.1 |07 33 30.0 +02 49 00. 76..9055|K 1-11 |215+11 1 | |KOHOUTEK 1963 |A 22,ARO 133 +216.0-00.2 |06 53 43.8 -02 49 10. 76..9055|A 18 |216-00 1 | |ABELL 1955 |A55 13,ARO 224,VV' 50 +216.3-04.4 |06 39 06.5 -04 59 44. 77..1547|We 1- 5 | | |WEINBERGER 1977 | +217.1+14.7 |07 49 01.6 +03 08 11. 73..9034|A 24 |217+14 1 | |ABELL 1955 |A55 17,ARO 134,VV' 73 +217.4+02.0 |07 04 18. -03 00 a 78..3006|St 3-1 | |07043-0300 |STEPHENSON 1978 | +218.9-10.7 |06 21 15.5 -10 11 45. 83.28034|HDW 5 | | |HARTL et al 1983 |HaWe 7 +219.1+31.2 |08 51 31.7 +09 05 25. 83...481|A 31 |219+31 1 |08515+0905 |ABELL 1955 |A55 20,ARO 135,Sh 2-290,VV' 81 +220.3-53.9 |03 31 07.6 -26 02 15. 83...481|NGC 1360 |220-53 1 |03311-2601 |MINKOWSKI 1946 |ARO 208,CD -26 1339,ESO 482-07,M 1- 3,VV 10,VV' 16 +221.3-12.3 |06 19 24.2 -12 57 40. 73..9034|IC 2165 |221-12 1 |06194-1257 |FLEMING 1898 |ARO 62,Sa 2- 1,VV 27,VV'43 +221.5+46.3 |09 50 18. +13 59 84..3036|EGB 6 | | |ELLIS et al 1984 |BN 0950+13,PG 0950+139 +221.7+05.3 |07 24 06.1 -05 15 49. 83...481|M 3- 3 |221+05 1 | |MINKOWSKI 1948 |ARO 236,Sa 2- 8,VV' 62, Y-C 38 +224.3+15.3 |08 04 14.3 -02 44 01. 76..9055|K 1-13 |224+15 1 | |KOHOUTEK 1963 |A 25,ARO 246 +224.9+01.0 |07 15 03.6 -10 05 13. 77..1547|We 1- 6 | | |WEINBERGER 1977 | +226.4-03.7 |07 00 28.6 -13 38 24. 73..9034|PB 1 |226-03 1 |07004-1338 |PEIMBERT et al 1960 |ARO 225,Sa 2- 2 +226.7+05.6 |07 34 55.48-09 32 00.0 90..1502|M 1-16 |226+05 1 |07349-0932 |MINKOWSKI 1946 |ARO 239,Sa 2-11,VV 41,VV' 66 +228.2-22.1 |05 53 00.9 -22 54 27. 80..1011|DeHt 1 | | |DENGEL et al 1980 |LoTr 1 +228.8+05.3 |07 38 00.78-11 25 29.7 90..1502|M 1-17 |228+05 1 |07380-1125 |MINKOWSKI 1946 |ARO 240,Sa 2- 12,VV 42,VV' 67 +229.6-02.7 |07 10 20.0 -16 00 36. 73..9034|K 1-10 |229-02 1 | |KOHOUTEK 1963 |ARO 230 +231.4+04.3 |07 39 45.0 -14 14 05. 89..1570|M 1-18 |231+04 1 | |MINKOWSKI 1946 |Sa 2- 15,VV 44,VV' 70 +231.8+04.1 |07 39 32.4 -14 37 02. 83...481|NGC 2438 |231+04 2 |07395-1437 |HERSCHEL 1827 |ARO 46,Sa 2- 13,VV 43,VV' 69 +232.0+05.7 |07 45 44.8 -14 00 12.0 90..1502|SaSt 2- 3 | | |SANDULEAK et al 1972 |MWC 574 +232.4-01.8 |07 19 01.68-18 02 52.7 90..1502|M 1-13 |232-01 1 |07190-1802 |MINKOWSKI 1946 |ESO 559-06,ARO 23,Sa 2- 7,VV 36,VV' 59 +232.8-04.7 |07 09 05.90-19 46 00.9 90..1502|M 1-11 |232-04 1 |07090-1946 |MINKOWSKI 1946 |ARO 229,ESO 558-14,SaSt 2- 1,VV 34,VV' 55 +233.0-10.1 |06 48 34.2 -22 22 34. 87..1594|SaWe 1 | | |SAURER et al 1987 | +233.5-16.3 |06 24 59.9 -25 21 01. 83...481|A 15 |233-16 1 |06249-2520 |ABELL 1964 |ARO 221,ESO 490-01 +234.3-06.6 |07 04 49.3 -21 57 30. 73..9034|K 2- 3 |234-06 1 | |KOHOUTEK 1963 |ARO 227,ESO 558-11 +234.8+02.4 |07 39 41.5 -18 05 26. 73..9034|NGC 2440 |234+02 1 |07396-1805 |HERSCHEL 1790 |ARO 47,ESO 560-09,Sa 2- 14,VV 45,VV' 71 +234.9-01.4 |07 25 45.60-20 07 12.7 90..1502|M 1-14 |235-01 1 |07257-2007 |MINKOWSKI 1946 |ARO 237,ESO 559-11,Sa 2- 9,VV 39,VV' 64 +235.3-03.9 |07 17 12.77-21 38 19.6 90..1502|M 1-12 |235-03 1 |07172-2138 |MINKOWSKI 1946 |ARO 233,ESO 559-03,SaSt 2- 2,VV 35,VV' 58 +236.0-10.6 |06 52 26. -25 17 20. 83.28034|HaWe 9 | | |HARTL et al 1983 | +236.7+03.5 |07 47 58.9 -19 10 30. 76..9055|K 1-12 |236+03 1 | |KOHOUTEK 1963 |ARO 243,ESO 560-16 +238.0+34.8 |09 36 37.1 -02 34 57. 83...481|A 33 |238+34 1 | |ABELL 1955 |A55 22,ARO 65,VV' 91 +238.9+07.3 |08 06 30. -19 05 a 75..9016|Sa 2- 21 | | |SANDULEAK 1975 |ESO 561-16 +239.6+13.9 |08 31 04.9 -15 58 38. 83...481|NGC 2610 |239+13 1 |08310-1558 |REYNOLDS 1914 |ARO 64,Sa 2- 27,VV 48,VV' 77 +239.6-12.0 |06 53 14.5 -29 03 33.5 84..1537|ESO 427-19 |239-12 1 | |HOLMBERG et al 1978 | +240.3+07.0 |08 08 29.0 -20 22 36. 77..1548|Y-C 2- 5 | |08084-2022 |CESCO et al 1973 |Sa 2- 22 +240.3-07.6 |07 12 49.2 -27 45 01. 76..9055|M 3- 2 |240-07 1 | |MINKOWSKI 1948 |ARO 231,ESO 428-05,He 2- 2,Sa 3- 2,VV' 56 +241.0+02.3 |07 53 03.1 -23 29 47. 73..9034|M 3- 4 |241+02 1 |07530-2330 |MINKOWSKI 1948 |ARO 81,ESO 494-02,Sa 2- 19,VV' 75,Wray 19- 3 +242.6-11.6 |07 00 55.5 -31 31 14. 73..9034|M 3- 1 |242-11 1 |07009-3131 |MINKOWSKI 1948 |ARO 534,ESO 427- 30,He 2- 1,Sa 2-3,StWr 3- 1,VV' 52,Wray 16- 1 +243.3-01.0 |07 45 23.2 -27 12 37. 81.27752|NGC 2452 |243-01 1 |07453-2712 |HERSCHEL 1837 |ARO 93,ESO 493-11,He 2- 4,RCW 17,Sa 2- 16,VV 46,VV' 72,Wray 15- 85 +243.8-37.1 |05 01 21.9 -39 49 54.2 90..1006|PRTM 1 | | |PENA et al 1990 | +244.5+12.5 |08 38 00. -20 43 a 67.30013|A 29 |244+12 1 | |ABELL 1955 |A55 19,ESO 563-09,VV' 79 +245.4+01.6 |08 00 25.2 -27 33 31. 76..9055|M 3- 5 |245+01 1 |08004-2733 |MINKOWSKI 1948 |ARO 244,ESO 430-10,He 2- 6,Sa 2- 20,VV' 76,Wray 16- 10 +248.7+29.5 |09 43 10.0 -12 56 22. 83...481|A 34 |248+29 1 | |ABELL 1955 |A55 23,VV' 93 +248.8-08.5 |07 27 06. -35 39 a 67.30013|M 4- 2 |248-08 1 |07270-3539 |MINKOWSKI 1948 |ARO 539,ESO 368-03,He 2- 3,Sa 2-1,Wray 16- 4 +249.0+06.9 |08 29 36.8 -27 35 20. 72..9043|SaSt 1- 1 | |08296-2735 |SANDULEAK et al 1972 |AS 201,MHA 382-43 +249.3-05.4 |07 41 26.9 -34 38 00. 73..9034|A 23 |249-05 1 |07415-3435 |ABELL 1964 |ARO 542,ESO 368-10 +250.3+00.1 |08 07 03.8 -32 31 24. 76..9055|A 26 |250+00 1 |08070-3231 |ABELL 1964 |ARO 545,ESO 369-05 +251.1-01.5 |08 02 19.8 -34 07 30. 71..9006|K 1-21 | | |KOHOUTEK 1971 |ESO 369-04 +252.6+04.4 |08 29 51.9 -31 55 54. 73..9034|K 1- 1 |252+04 1 | |KOHOUTEK 1962 |A 27,ESO 431-14 +253.5+10.7 |08 55 42. -28 45 a 76.26001|K 1- 2 |253+10 1 |08556-2846 |KOHOUTEK 1962 |ESO 432-14 +253.9+05.7 |08 38 42.9 -32 11 26. 73..9034|M 3- 6 |254+05 1 |08386-3211 |MINKOWSKI 1948 |ARO 553,He 2- 12,Sa 2- 29,VV' 80,Wray 16- 25 +254.6+00.2 |08 19 03. -36 04 12. d 84..1537|Ns 238 | |08189-3602 |NORDSTROM 1975 |ESO 370-09 +255.3-59.6 |02 55 09.8 -44 22 20. 77..1134|Lo 1 | | |LONGMORE 1977 |ESO 247-13,K 1-26 +255.7+03.3 |08 34 19.3 -35 05 23. 77..1548|Wray 16- 22 | | |WRAY 1966 |ESO 370-18,Sa 2-28 +257.1-02.6 |08 14 22.6 -39 42 33. 88.30003|Vo 2 | | |VOLK 1988 |PM 1-38 +257.5+00.6 |08 29 06. -38 09 42. d 76.26001|VBRC 1 | | |VAN DEN BERGH et al 1973 |ESO 313-01,RCW 21,Wray 19- 11 +258.0-15.7 |07 13 22. -46 52 06. d 77..2615|Wray 17- 1 | |07133-4652 |WRAY 1966 |ESO 256-19,Lo 3,Sa 2- 6,StWr 3- 2 +258.1-00.3 |08 26 38.0 -39 13 41. 73..9034|He 2- 9 |258-00 1 |08266-3913 |HENIZE 1964 |AS 200,ESO 312-05,MHa 392- 16,Sa 2- 26,Wray 16- 21 +259.1+00.9 |08 35 17. -39 15 54. d 76.26001|He 2- 11 |259+00 1 | |HENIZE 1964 |ESO 313-05,Wray 16- 23 +260.7+00.9 |08 40 26. -40 33 18. d 78..1991|Vo 3 | |08355-4027 |VOLK 1988 |PM 1-41 +260.7-03.3 |08 21 57.5 -43 02 59. 66.30012|Wray 16- 20 | | |WRAY 1966 | +261.0+32.0 |10 22 21.3 -18 23 23. 73..9034|NGC 3242 |261+32 1 |10223-1823 |HERSCHEL 1785 |ARO 4,ESO 568-05,VV 57,VV' 98 +261.6+03.0 |08 51 37.7 -39 52 09. 76..9055|He 2- 15 |261+02 1 |08516-3952 |HENIZE 1964 |AS 204,ESO 313-17,MHa 392- 12,Sa 2- 32 ,Wray 16- 32 +261.9+08.5 |09 13 59.4 -36 24 58. 73..9034|NGC 2818 |261+08 1 |09140-3625 |HERSCHEL 1838 |ARO 508,ESO 372-13,Hb 2,He 2- 23,My 45,Sa 2- 39,StWr 4-6,VV 51,VV' 88,Wray 16- 38 +262.6-04.6 |08 22 15. -45 21 24. d 84..1537|Wray 17- 18 | | |WRAY 1966 |ESO 259-06,LoTr 2 +263.0-05.5 |08 19 03.3 -46 10 39. 76..9055|PB 2 |263-05 1 |08190-4613 |PEIMBERT et al 1960 |ESO 259-04,He 2- 8,Sa 2- 24,Wray 16- 18 +263.2+00.4 |08 46 51. -42 42 36. * 71..9006|K 2-15 | |08470-4243 |KOHOUTEK 1971 |ESO 260-08 +263.3-08.8 |08 03 41.5 -48 14 52.2 84..1537|ESO 209-15 | | |HOLMBERG et al 1978 | +264.1-08.1 |08 10 02.1 -48 34 13. 76..9055|He 2- 7 |264-08 1 |08100-4834 |HENIZE 1964 |ESO 209-19,StWr 3- 3,Wray 16- 16 +264.4-03.6 |08 32 50.0 -46 15 16. 66.30012|Wray 17- 20 | | |WRAY 1966 | +264.4-12.7 |07 46 01.1 -51 07 41. 76..9055|He 2- 5 |264-12 1 |07460-5107 |HENIZE 1964 |ESO 209-01,Sa 2- 17,StWr 3- 4,Wray 16- 8 +265.1-02.2 |08 41 43. -45 57 36. d 75..9016|Ve 26 |265-02 1 |08417-4555 |VELGHE 1957 |ESO 260-05,He 2- 13,Sa 2- 31,Wray 16- 27 +265.1-04.2 |08 32 29.9 -47 06 16.5 84..1537|ESO 259-10 | | |HOLMBERG et al 1978 |LoTr 3 +265.7+04.1 |09 10 33.7 -42 13 08. 73..9034|NGC 2792 |265+04 1 |09105-4213 |HERSCHEL 1835 |ARO 507,ESO 314-06,He 2- 20,Sa 2- 36,VV 50,VV' 86,Wray 16- 36 +268.4+02.4 |09 14 21.0 -45 16 12. 73..9034|PB 5 |268+02 1 |09143-4516 |PEIMBERT et al 1960 |ESO 261-04,He 2- 24,Sa 2- 40,Wray 16- 39 +269.7-03.6 |08 52 43.0 -50 20 51. 76..9055|PB 3 |269-03 1 |08527-5020 |PEIMBERT et al 1960 |ESO 211-04,He 2- 16,Sa 2- 33,Wray 16- 33 +270.1+24.8 |10 32 10.6 -28 55 44. 77..1134|K 1-28 | | |KOHOUTEK 1977 |ESO 436-41 +272.1+12.3 |10 04 55.1 -40 11 29. 73..9034|NGC 3132 |272+12 1 | |HERSCHEL 1835 |ARO 504,ESO 316-27,He 2- 40,Sa 2- 53,StWr 4- 8,VV 54,VV' 94 +272.4-05.9 |08 52 10.0 -53 53 42. 90..2581|MeWe 1- 1 | | |MELMER et al 1990 | +273.2-03.7 |09 07 08.0 -53 06 55. 76..9055|He 2- 18 |273-03 1 |09071-5307 |HENIZE 1964 |ESO 166-02,Sa 2- 35,Wray 16- 35 +273.6+06.1 |09 50 48. -46 03 a 84.28020|HBDS 1 | | |HEBER et al 1984 | +274.1+02.5 |09 39 21. -49 09 00. d 77..1550|He 2- 34 |274+02 1 |09394-4909 |HENIZE 1964 |ESO 212-13,Wray 16- 56 +274.3+09.1 |10 03 44. -44 07 06. d 80..1013|Lo 4 | | |LONGMORE 1977 |ESO 263-02 +274.6+02.1 |09 39 47.9 -49 44 02. 73..9034|He 2- 35 |274+02 2 |09398-4944 |HENIZE 1964 |ESO 212-14,Sa 2- 48,Wray 16- 57 +274.6+03.5 |09 45 32.6 -48 44 22. 76..9055|He 2- 37 |274+03 1 |09455-4844 |HENIZE 1964 |ESO 213-01,Sa 2- 50,Wray 16- 59 +275.0-04.1 |09 13 36.5 -54 40 07. 76..9055|PB 4 |275-04 1 |09136-5440 |PEIMBERT et al 1960 |ESO 166-06,He 2- 22,Sa 2- 38,Wray 16- 37 +275.2-02.9 |09 20 31.5 -53 56 55. 76..9055|He 2- 28 |275-02 1 |09205-5356 |HENIZE 1964 |ESO 166-09,Sa 2- 43,Wray 16- 44 +275.2-03.7 |09 16 28.8 -54 26 49. 72..9043|He 2- 25 |275-03 1 |09164-5426 |HENIZE 1964 |ESO 166-07,SaSt 1-2,Wray 16- 40 +275.3-04.7 |09 12 22.9 -55 15 53. 76..9055|He 2- 21 |275-04 2 | |HENIZE 1964 |ESO 166-05,Sa 2- 37,Wray 15- 344 +275.5-01.3 |09 29 09. -52 56 42. * 75..9016|Pe 2- 4 |275-01 1 |09291-5256 |PEREK 1960 |ESO 166-18,He 2- 31,Sa 2- 46,VV' 90,Wray 16- 48 +275.8-02.9 |09 23 10.0 -54 23 21. 76..9055|He 2- 29 |275-02 2 |09231-5423 |HENIZE 1964 |ESO 166-10,Sa 2- 44,Wray 16- 46 +277.1-03.8 |09 25 31.3 -55 53 13. 76..9055|NGC 2899 |277-03 1 |09255-5553 |HENIZE 1964 |ESO 166-13,Gum 27,He 2- 30,My 48,RCW 43,Sa 2- 45,Wray 16- 47 +277.7-03.5 |09 29 53.9 -56 04 24. 66.30012|Wray 17- 31 | | |WRAY 1966 |ESO 166-21,RCW 44,Sa 3- 10,VBRC 2 +278.1-05.9 |09 20 00.9 -58 05 58. 81.27752|NGC 2867 |278-05 1 |09200-5805 |HERSCHEL 1834 |ARO 509,ESO 126-08,He 2- 27,StWr 3- 6,VV 52,VV' 89,Wray 16- 43 +278.5-04.5 |09 29 26. -57 23 42. d 77..1550|He 2- 32 |278-04 1 |09294-5723 |HENIZE 1964 |ESO 166-19,Sa 3- 9,Wray 16- 49 +278.6-06.7 |09 18 06.4 -58 59 23. 76..9055|He 2- 26 |278-06 1 |09181-5859 |HENIZE 1964 |ESO 126-06,My 47,Sa 2- 41,StWr 3- 5,Wray 16- 41 +278.8+04.9 |10 11 18.8 -50 05 07. 76..9055|PB 6 |278+05 1 |10113-5005 |PEIMBERT et al 1960 |ESO 213-07,He 2- 43,Sa 2- 58,Wray 16- 68 +279.6-03.1 |09 41 50.7 -57 03 12. 76..9055|He 2- 36 |279-03 1 |09418-5703 |HENIZE 1964 |ESO 167-03,Sa 2-49,Wray 15- 428 +280.0+02.9 |10 10 04. -52 23 24. * 77..1548|Ste 2-1 | |10100-5223 |STENHOLM 1975 |Sa 2- 56 +281.0-05.6 |09 37 20.9 -59 51 52. 76..9055|IC 2501 |281-05 1 |09373-5951 |FLEMING 1904 |ARO 510,He 2- 33,Sa 2- 47,StWr 3- 7,VV 53,VV'92,Wray 16- 54 +282.9+03.8 |10 29 33. -53 18 00. d 77..1550|He 2- 48 |282+03 1 | |HENIZE 1964 |ESO 168-05,Sa 2- 60,Wray 17- 45 +283.3+03.9 |10 32 18.0 -53 25 27. 76..9055|He 2- 50 |283+03 1 |10323-5325 |HENIZE 1964 |ESO 168-08,Sa 2- 62,Wray 16- 72 +283.6+25.3 |11 24 17.5 -34 05 44. 83...481|K 1-22 | |11242-3405 |KOHOUTEK 1971 |ESO 378-01,V-V 3-1 +283.8+02.2 |10 29 36.0 -55 05 27. 76..9055|My 60 |283+02 1 |10296-5505 |MAYALL 1951 |ESO 168-06,He 2- 49,PB 7,Sa 2- 61,Wray 16- 71 +283.8-04.2 |10 02 14. -60 29 12. d 75..9026|He 2- 39 |283-04 1 |10022-6029 |HENIZE 1964 |ESO 127-03,Sa 2- 52,Wray 16- 64 +283.9+09.7 |10 52 30. -48 31 83...423|ESO 215-04 | | |HOLMBERG et al 1978 |DS 1 +283.9-01.8 |10 13 49. -58 36 12. * 76.26001|Hf 4 |283-01 1 |10138-5836 |HOFFLEIT 1953 |ESO 127-12,He 2- 45,Sa 3- 12,Wray 16- 69 +285.4+01.5 |10 36 34.5 -56 30 55. 67.30013|Pe 1- 1 |285+01 1 |10364-5631 |PEREK 1960 |ESO 168-10,He 2- 52,Sa 2- 64,VV'101,Wray 16- 75 +285.4+02.2 |10 39 20. -55 53 36. d 77..1550|Pe 2- 7 |285+02 1 |10393-5553 |PEREK 1960 |ESO 168-13,Sa 2- 66,VV' 103,Wray 16- 77 +285.4-01.1 |10 26 53. -58 48 48. d 75..9026|Pe 2- 5 |285-01 1 | |PEREK 1960 |ESO 127-22,VV' 99 +285.4-05.3 |10 07 47.9 -62 21 55. 76..9055|IC 2553 |285-05 1 |10077-6222 |FLEMING 1893 |ESO 127-10,He 2- 42,Sa 2- 55,VV 55,VV' 95,Wray 16- 67 +285.6-02.7 |10 21 24.0 -60 17 22. 76..9055|He 2- 47 |285-02 1 |10214-6017 |HENIZE 1964 |ESO 127-16,My 59,SaSt 2- 5,Wray 15- 558 +285.7+01.2 |10 37 34. -56 50 30. d 77..1550|Pe 1- 2 |285+01 2 |10375-5650 |HENIZE 1964 |ESO 168-12,HFE 15,(He 2- 53),Sa 2- 65,VV' 102,,Wray 16- 76 +285.7-14.9 |09 06 37.3 -69 44 07. 76..9055|IC 2448 |285-14 1 |09066-6944 |FLEMING 1898 |ARO 506,ESO 061-01,He 2- 19,Sa 2- 34,StWr 3- 8,VV 49,VV'84,Wray 16- 34 +286.0-06.5 |10 05 54.0 -63 39 50. 76..9055|He 2- 41 |286-06 1 |10059-6339 |HENIZE 1964 |ESO 092-11,Sa 2- 54,Wray 16- 66 +286.2-06.9 |10 05 27.8 -64 07 05. 66.30012|Wray 17- 40 | |10055-6407 |WRAY 1966 | +286.3+02.8 |10 46 40. -55 47 30. d 77..1550|He 2- 55 |286+02 1 |10466-5547 |HENIZE 1964 |ESO 169-03, Sa 2- 68,Wray 16- 79 +286.3-04.8 |10 16 12.5 -62 25 06. 76..9055|NGC 3211 |286-04 1 |10162-6225 |HERSCHEL 1837 |ARO 512,ESO 127-15,He 2-46,Sa 2- 59,VV 56,VV' 97,Wray 16- 70 +286.5+11.6 |11 11 32. -47 49 12. d 77..2615|Lo 5 | | |LONGMORE 1977 |ESO 215-35 +286.8-29.5 |05 58 50. -75 40 30. d 77..1134|K 1-27 | |05587-7540 |KOHOUTEK 1977 |ESO 033-33 +288.4+00.3 |10 52 33. -58 53 48. d 75..9026|Hf 38 |288+00 1 |10525-5853 |HOFFLEIT 1953 |ESO 128-19,He 2- 56,Sa 2-69,Wray 16- 80 +288.4-02.4 |10 42 38.1 -61 23 54. 76..9055|Pe 1- 3 |288-02 1 | |PEREK 1960 |ESO 128-09,He 2- 54,Sa 2- 67,VV'104,Wray 16- 78 +288.7+08.1 |11 15 52. -51 53 42. d 77..1548|ESO 216-02 | | |HOLMBERG et al 1977 | +288.8-05.2 |10 34 02.3 -64 03 30. 76..9055|He 2- 51 |288-05 1 |10340-6403 |HENIZE 1964 |ESO 092-23,Sa 2- 63,Wray 16- 74 +288.9-00.8 |10 51 59. -60 10 42. d 76..9055|Hf 39 |288-00 1 |10520-6010 |HOFFLEIT 1953 |ESO 128-18,He 3-519,Wray 15-682 +289.6-01.6 |10 54 03. -61 12 00. d 75..9026|He 2- 57 |289-01 1 | |HENIZE 1964 |ESO 128-20,Sa 3- 13 +289.8+07.7 |11 21 40.8 -52 34 52. 76..9055|He 2- 63 |289+07 1 | |HENIZE 1964 |ESO 170-01,Sa 2- 73,StWr 4-15,Wray 16- 88,Y-C 2-10 +290.1-00.4 |11 01 51. -60 19 54. d 75..9026|Hf 48 |290-00 1 | |HOFFLEIT 1953 |ESO 128-29,He 2- 60,Sa 2- 71,Wray 16- 85 +290.5+07.9 |11 26 14.6 -52 39 34. 76..9055|Fg 1 |290+07 1 |11262-5239 |FLEMING 1907 |ARO 554,ESO 170-06,He 2- 66,Sa 2- 75,StWr 4-16,VV 60,VV' 108,Wray 16- 91,Y-C 2-11 +291.3-26.2 |07 02 45.3 -79 34 23. 90..2503|Vo 1 | |07027-7934 |VOLK 1988 | +291.4+19.2 |11 49 58. -42 00 54. d 84..1537|ESO 320-28 | | |HOLMBERG et al 1978 |LoTr 4 +291.6-04.8 |10 58 23.5 -64 58 47. 76..9055|IC 2621 |291-04 1 |10583-6458 |FLEMING 1907 |ARO 513,ESO 093-04,He 2- 59,Sa 2- 70,VV 58,VV' 105,Wray 16- 81 +291.7+03.7 |11 25 05. -57 01 24. d 77..1550|He 2- 64 |291+03 1 | |HENIZE 1964 |ESO 170-05,Wray 16- 89 +292.4+04.1 |11 30 57.5 -56 49 43. 76..9055|PB 8 |292+04 1 |11309-5649 |PEIMBERT et al 1960 |ESO 170-07,He 2- 69,My 68,Sa 2- 77,Wray 16- 95 +292.6+01.2 |11 25 42.0 -59 41 00. 76..9055|NGC 3699 |292+01 1 |11256-5940 |HOFFLEIT 1953 |ESO 129-21,He 2- 65,Hf 62,Sa 2- 74,Wray 16- 90 +292.7+01.9 |11 28 29.7 -59 00 30. 66.30012|Wray 16- 93 | |11285-5900 |WRAY 1966 | +292.8+01.1 |11 26 30.5 -59 50 00. 76..9055|He 2- 67 |292+01 2 |11265-5950 |HENIZE 1964 |ESO 129-22,Sa 2- 76,Wray 16- 92 +293.6+01.2 |11 32 52. -60 00 18. d 77..1550|He 2- 70 |293+01 1 |11328-6000 |HENIZE 1964 |ESO 129-26,Sa 2- 78,Wray 16- 96 +293.6+10.9 |11 50 33. -50 34 75...826|BlDz 1 | |11506-5034 |BLAAUW et al 1975 |ESO 217-11 +294.1+14.4 |11 58 10. -47 16 30. d 77..2615|Lo 6 | | |LONGMORE 1977 | +294.1+43.6 |12 21 55.0 -18 30 32. 73..9034|NGC 4361 |294+43 1 |12219-1830 |HERSCHEL 1868 |ARO 26,ESO 573-19,VV 62,VV' 110 +294.6+04.7 |11 47 50.1 -56 54 10. 76..9055|NGC 3918 |294+04 1 |11478-5654 |HERSCHEL 1834 |ARO 514,ESO 170-13,He 2-74,Sa 2- 81,VV 61,VV' 109,Wray 16- 101 +294.9-00.6 |11 39 15. -62 12 18. d 77..1550|He 2- 72 |294-00 1 | |HENIZE 1964 |ESO 129-29,Hf 69,Sa 2- 79 +294.9-04.3 |11 29 31.8 -65 41 40. 76..9055|He 2- 68 |294-04 1 |11295-6541 |HENIZE 1964 |ESO 094- 03,SaSt 2- 6,Wray 16- 94 +295.3-09.3 |11 15 45. -70 33 06. d 77..1550|He 2- 62 |295-09 1 |11157-7033 |HENIZE 1964 |Sa 2- 72,StWr 1- 4,Wray 16- 86 +296.3-03.0 |11 46 12.8 -64 51 53. 76..9055|He 2- 73 |296-03 1 |11462-6451 |HENIZE 1964 |ESO 094-07,Sa 2- 80,Wray 16- 100 +296.4-06.9 |11 36 54.1 -68 35 30. 76..9055|He 2- 71 |296-06 1 |11369-6835 |HENIZE 1964 |ESO 063-18,SaSt 2- 7,Wray 16- 98 +296.6-20.0 |10 09 58. -80 36 42. d 77..1550|NGC 3195 |296-20 1 |10099-8036 |HERSCHEL 1835 |ARO 51,ESO 019-02,He 2- 44,My 56,Sa 2- 57,VV' 96 +297.4+03.7 |12 06 33. -58 25 54. d 78..1991|He 2- 78 |297+03 1 |12065-5825 |HENIZE 1964 |ESO 130-07,Sa 3- 17,Wray 16- 107 +298.0+34.8 |12 30 36. -27 32 76...525|CTIO 1230-275| | |SMITH et al 1976 | +298.1-00.7 |12 06 23. -62 50 24. d 67.30013|He 2- 77 |298-00 1 |12063-6259 |HENIZE 1964 |ARO 555,ESO 095-01,Sa 3- 16,Wray 16- 106 +298.2-01.7 |12 05 48. -63 55 30. d 77..1550|He 2- 76 |298-01 2 |12057-6355 |HENIZE 1964 |ESO 094-14,Sa 3- 15,Wray 16- 105 +298.3-04.8 |12 01 39.5 -67 01 53. 76..9055|NGC 4071 |298-04 1 |12016-6701 |HENIZE 1964 |ESO 094-12,He 2- 75,Sa 2- 82,Wray 16- 104 +299.0+18.4 |12 28 10. -43 57 48. * 71..9006|K 1-23 | | |KOHOUTEK 1971 |ESO 268-12,V-V 3-2 +299.4-04.1 |12 13 49.3 -66 28 58. 83.28035|HaTr 1 | | |HARTL et al 1983 | +299.5+02.4 |12 21 08. -59 56 36. d 75..9026|He 2- 82 |299+02 1 | |HENIZE 1964 |ESO 131-01,Sa 3- 19,Wray 16- 112 +299.8-01.3 |12 20 16. -63 45 30. d 77..1550|He 2- 81 |299-01 1 |12202-6344 |HENIZE 1964 |ESO 095-08,Sa 3- 18,Wray 16- 111 +300.2+00.6 |12 25 57. -61 49 00. d 75..9026|He 2- 83 |300+00 1 |12259-6148 |HENIZE 1964 |ESO 131-08,Sa 3- 21,Wray 16- 114 +300.4-00.9 |12 25 57. -63 28 00. d 77..1550|He 2- 84 |300-00 1 | |HENIZE 1964 |ESO 095-09,Sa 2- 84,Wray 16- 115 +300.5-01.1 |12 27 17. -63 36 24. d 77..1550|He 2- 85 |300-01 1 |12272-6336 |HENIZE 1964 |ESO 095-11,Sa 2- 85,Wray 16- 116 +300.7-02.0 |12 27 38.7 -64 34 35. 76..9055|He 2- 86 |300-02 1 |12276-6435 |HENIZE 1964 |ESO 095-13,Sa 2- 86,Wray 16- 117 +300.8-03.4 |12 27 31.8 -65 57 51.3 84..1537|ESO 095-12 | |12275-6557 |HOLMBERG et al 1977 | +302.2+02.5 |12 42 58.7 -60 03 51. 77..1548|Wray 16-120 | |12429-6003 |WRAY 1966 |ESO 131-15 +302.3-01.3 |12 42 51.1 -63 53 14. 90..1202|DuRe 1 | | |DUERBECK et al 1990 |We 21 +302.6-00.9 |12 45 29.8 -63 33 35. 77..1548|Wray 16-121 | | |WRAY 1966 |ARO 529,ESO 095-17,Lo 7,RCW 70,Sa 2- 87,VBRC 4 +303.6+40.0 |12 51 01.3 -22 35 26. 76..9055|A 35 |303+40 1 | |ABELL 1955 |A55 24,Sh 2-313,VV' 112 +304.2+05.9 |12 57 41.6 -56 37 19. 77..1548|Wray 16-122 | |12577-5637 |WRAY 1966 |ESO 173-01 +304.5-04.8 |13 05 28.0 -67 22 33. 76..9055|IC 4191 |304-04 1 |13054-6722 |FLEMING 1907 |ESO 096-02,He 2- 89,Sa 2- 89,VV 64,VV' 113,Wray 16- 124 +304.8+05.1 |13 02 45. -57 23 18. d 75..9026|He 2- 88 |304+05 1 | |HENIZE 1964 |ESO 173-04,Sa 2- 88,Wray 16- 123 +305.1+01.4 |13 06 26.8 -61 03 35. 82..2501|He 2- 90 |305+01 1 |13064-6103 |HENIZE 1964 |ESO 132-01,Sa 2- 90,Wray 16- 125 +305.6-13.1 |13 29 59. -75 31 06. d 84..1537|ESO 040-11 | |13299-7531 |HOLMBERG et al 1977 | +305.7-03.4 |13 16 06.5 -65 53 23. 66.30012|Wray 17- 59 | |13160-6553 |WRAY 1966 |ESO 096-07,Sa 2- 91 +306.4-00.6 |13 19 15.3 -63 05 15. 76..9055|Th 2-A |306-00 1 |13192-6305 |THE 1962 |ESO 096-09,He 2- 92,Sa 2- 92,Wray 16- 127 +307.2-03.4 |13 30 10. -65 43 06. 81.27752|NGC 5189 |307-03 1 |13300-6543 |FLEMING 1901 |ARO 515,ESO 096-16,Gum 47,He 2- 94,IC 4274,Sa 2- 95,RCW 76,Th 2- C,VV 65,VV' 114,Wray 16- 131 +307.2-09.0 |13 41 24.0 -71 13 47. 76..9055|He 2- 97 |307-09 1 |13413-7113 |HENIZE 1964 |Sa 2- 98,StWr 1- 6,Wray 16- 135 +307.3+05.0 |13 21 11. -57 15 42. * 66.30012|Wray 16-128 | |13212-5715 |WRAY 1966 |ESO 173-12,Sa 2- 93 +307.5-04.9 |13 35 54.4 -67 07 33. 76..9055|MyCn 18 |307-04 1 |13359-6707 |MAYALL et al 1940 |ARO 530,ESO 097-01,He 2- 95,Sa 2- 96,RCW 77,VV 66,VV' 115,Wray 16- 132 +308.2+07.7 |13 24 56.6 -54 26 25. 90..2581|MeWe 1- 3 | | |MELMER et al 1990 | +308.6-12.2 |14 10 43.4 -73 58 52. 67.30013|He 2-105 |308-12 1 |14107-7358 |HENIZE 1964 |ESO 041-03,Sa 3- 24 +309.0+00.8 |13 39 10. -61 07 24. d 75..9026|He 2- 96 |309+00 1 |13391-6107 |HENIZE 1964 |ESO 133-01,Sa 2- 97,Wray 16- 133 +309.0-04.2 |13 48 46.7 -66 08 40. 81.27752|He 2- 99 |309-04 1 |13487-6608 |HENIZE 1964 |ESO 097-08,Sa 3- 23,Wray 16- 139 +309.1-04.3 |13 50 12.3 -66 16 07. 81.27752|NGC 5315 |309-04 2 |13501-6616 |COPELAND 1883 |ESO 097-09,He 2- 100,Sa 2-100,VV 68,VV' 118,Wray 16- 140 +309.2+01.3 |13 40 34. -60 34 36. d 73..9025|VBRC 5 | | |VAN DEN BERG et al 1973 |ESO 133-02,SuWt 1 +309.5-02.9 |13 50 46.1 -64 44 44. 78..1561|MaC 1- 2 | | |MAC CONNELL 1978 | +310.3+24.7 |13 22 45.1 -37 20 40. 77..1134|Lo 8 | | |LONGMORE 1977 |ESO 382-63,K 1-29 +310.4+01.3 |13 49 54.4 -60 19 06. 88.30003|Vo 4 | |13499-6019 |VOLK 1988 | +310.7-02.9 |14 01 50.9 -64 26 37. 76..9055|He 2-103 |310-02 1 | |HENIZE 1964 |ESO 097-11,Sa 2-103,Wray 16- 144 +310.8-05.9 |14 11 21. -67 18 00. d 80..2605|LoTr 7 | | |LONGMORE et al 1980 | +311.0+02.4 |13 52 18. -59 08 a 76..9003|SuWt 2 | | |SCHUSTER et al 1976 | +311.1+03.4 |13 51 31. -58 12 36. d 67.30013|He 2-101 |311+03 1 |13515-5812 |HENIZE 1964 |ESO 133-07,Wray 16- 141 +311.4+02.8 |13 54 45.9 -58 39 54. 76..9055|He 2-102 |311+02 1 |13547-5839 |HENIZE 1964 |ESO 133-08,Sa 2-101,Wray 16- 142 +312.3+10.5 |13 47 51.6 -50 57 26. 76..9055|NGC 5307 |312+10 1 |13478-5057 |HERSCHEL 1836 |ARO 516,ESO 221-11,He 2- 98,Sa 2- 99,StWr 4-14,VV 67,VV' 117,Wray 16- 138 +312.6-01.8 |14 14 55.1 -62 53 22. 76..9055|He 2-107 |312-01 1 |14149-6253 |HENIZE 1964 |ESO 097-16,Sa 3- 26,Wray 16- 151 +313.8-12.6 |15 15 58. -72 03 18. d 80..2605|LoTr 11 | | |LONGMORE et al 1980 | +315.0-00.3 |14 29 31.4 -60 36 33. 76..9055|He 2-111 |315-00 1 |14295-6036 |HENIZE 1964 |ESO 134-07,Sa 2-106,Wray 16- 156 +315.1-13.0 |15 31 54.0 -71 45 00. 76..9055|He 2-131 |315-13 1 |15318-7144 |HENIZE 1964 |MWC 236,ESO 068-08,My 90,SaSt 2- 9,Wray 15-1329 +315.4+05.2 |14 17 20. -55 14 12. d 75..9026|He 2-109 |315+05 1 | |HENIZE 1964 |ESO 175-07,Sa 2-104,Wray 16- 152 +315.4+09.4 |14 08 33.5 -51 12 19. 67.30013|He 2-104 |315+09 1 |14085-5112 |HENIZE 1964 |ESO 221-31,Wray 16- 147 +315.7+05.5 |14 18 31. -54 48 36. d 80..2605|LoTr 8 | | |LONGMORE et al 1980 | +315.7-01.2 |14 37 26. -61 07 06. d 80..2605|LoTr 9 | | |LONGMORE et al 1980 | +316.1+08.4 |14 14 47.5 -51 56 50. 76..9055|He 2-108 |316+08 1 |14147-5156 |HENIZE 1964 |ESO 221-36,SaSt 2- 8,Wray 16- 149 +316.3-01.3 |14 42 28. -61 01 12. d 80..2605|LoTr 10 | | |LONGMORE et al 1980 | +317.1-05.7 |15 06 23.1 -64 28 57. 76..9055|He 2-119 |317-05 1 |15064-6429 |HENIZE 1964 |ESO 099-01,Sa 2-115,Wray 16- 168 +317.8+03.3 |14 37 58. -56 02 18. d 77..1550|VBRC 6 | |14379-5602 |VAN DEN BERGH et al 1973 |ESO 176-01,Wray 17- 68 +318.3-02.0 |15 00 09.7 -60 41 39. 76..9055|He 2-114 |318-02 1 |15000-6041 |HENIZE 1964 |ESO 135-02,Sa 2-109,Wray 16- 159 +318.3-02.5 |15 01 59.4 -61 09 48. 76..9055|He 2-116 |318-02 2 |15020-6109 |HENIZE 1964 |ESO 135-03,Sa 3- 37,Wray 16- 163 +318.4+41.4 |13 37 57.4 -19 37 47. 83...481|A 36 |318+41 1 |13379-1938 |ABELL 1955 |A55 25,ESO 577-24,VV' 116 +318.4-03.0 |15 04 39. -61 32 36. d 82.20401|ESO 135-04 | |15047-6133 |HOLMBERG et al 1974 | Zo 1 +319.2+06.8 |14 37 00.7 -52 22 00. 76..9055|He 2-112 |319+06 1 |14370-5222 |HENIZE 1964 |ESO 222-13,Sa 2-107,Wray 16- 157,Y-C 2-15 +319.6+15.7 |14 19 15.5 -43 55 27. 73..9034|IC 4406 |319+15 1 |14192-4355 |FLEMING 1901 |ARO 517,ESO 272-06,He 2- 110,Sa 2-105,StWr 4-12,VV 69,VV' 120,Wray 16- 153 +320.1-09.6 |15 51 19.2 -66 00 26. 76..9055|He 2-138 |320-09 1 |15513-6600 |HENIZE 1964 |ESO 100-03,MWC 238,SaSt 2-10,Wray 15-1377 +320.3-28.8 |19 27 33.2 -74 39 25. 76..9055|He 2-434 |320-28 1 |19275-7439 |HENIZE 1964 |ESO 046-03 +320.9+02.0 |15 02 14.5 -55 47 45. 76..9055|He 2-117 |321+02 2 |15022-5547 |HENIZE 1964 |ESO 176-12,RCW 90,Sa 2-113,Wray 16- 164 +321.0+03.9 |14 56 15. -54 06 12. d 76.26001|He 2-113 | |14562-5406 |HENIZE 1967 |He 3-1044,GL 4205,Wray 15-1269 +321.0+08.3 |14 43 08.2 -50 10 53. 90..2581|MeWe 1- 5 | | |MELMER et al 1990 | +321.0-03.8 |15 26 10.0 -60 51 23. 83.28035|HaTr 2 | |15261-6051 |HARTL et al 1983 | +321.3+02.8 |15 01 34.2 -54 59 34. 76..9055|He 2-115 |321+02 1 |15015-5459 |HENIZE 1964 |ESO 176-10,Sa 2-112,Wray 16- 162 +321.3-16.7 |16 55 45.4 -70 01 40. 76..9055|He 2-185 |321-16 1 |16557-7001 |HENIZE 1964 |ESO 070-01,Sa 2-162,StWr 1- 5,Wray 16- 244 +321.8+01.9 |15 08 10.4 -55 28 34. 76..9055|He 2-120 |321+01 1 |15081-5528 |HENIZE 1964 |ESO 177-01,Sa 2-116,Wray 16- 169 +322.1-06.6 |15 47 47.9 -62 21 54. 76..9055|He 2-136 |322-06 1 |15478-6221 |HENIZE 1964 |ESO 136-05,My 91,Sa 2-126,Wray 16- 190 +322.4-00.1 |15 19 48.9 -56 58 39. 76..9055|Pe 2- 8 |322-00 1 |15198-5658 |PEREK 1960 |ESO 177-03,He 2- 124,Pe -0 1,Sa 3- 28,VV' 123,Wray 16- 177 +322.4-02.6 |15 30 13.8 -58 58 57. 76..9055|Mz 1 |322-02 1 |15302-5859 |MENZEL 1922 |ARO 531,ESO 135-11,He 2- 130,My 89,RCW 93,Sa 2-123,VV 73,VV' 125,Wray 16- 183 +322.5-05.2 |15 43 26.0 -61 03 48. 76..9055|NGC 5979 |322-05 1 |15434-6103 |HERSCHEL 1835 |ESO 136-03,He 2- 135,Sa 2-124,VV 74,VV' 126,Wray 16- 187 +323.1-02.5 |15 33 57.9 -58 35 02. 76..9055|He 2-132 |323-02 1 |15339-5834 |HENIZE 1964 |ESO 136-01,Sa 3- 30,Wray 16- 184 +323.9+02.4 |15 18 35.2 -53 57 34. 76..9055|He 2-123 |323+02 1 |15186-5357 |HENIZE 1964 |ESO 177-02,Sa 2-119,Wray 16- 175 +324.0+03.5 |15 15 27.7 -52 58 57. 89..1351|PM 1- 89 | | |PREITE-MARTINEZ 1988 |MGP 2 +324.1+09.0 |14 58 13.8 -48 09 14.2 84..1537|ESO 223-10 | |14582-4809 |HOLMBERG et al 1977 | +324.2+02.5 |15 19 51.7 -53 40 46. 76..9055|He 2-125 |324+02 1 |15198-5340 |HENIZE 1964 |ESO 177-04,Sa 3- 29,Wray 16- 178 +324.8-01.1 |15 38 00.9 -56 27 11. 76..9055|He 2-133 |324-01 1 |15380-5626 |HENIZE 1964 |ESO 177-10,Sa 3- 31,Wray 15-1341? +325.0+03.2 |15 21 50.6 -52 40 11. 76..9055|He 2-129 |325+03 1 |15218-5240 |HENIZE 1964 |ESO 177-05,Sa 2- 122,Wray 16- 182 +325.4-04.0 |15 55 02.3 -58 15 19. 76..9055|He 2-141 |325-04 1 |15550-5815 |HENIZE 1964 |ESO 136-11,Sa 2- 129,Wray 16- 195 +325.8+04.5 |15 21 29.7 -51 09 08. 76..9055|He 2-128 |325+04 1 |15214-5109 |HENIZE 1964 |ESO 224-03,Sa 2-121,Wray 16- 181 +325.8-12.8 |16 49 49.3 -64 09 39. 76..9055|He 2-182 |325-12 1 |16498-6409 |HENIZE 1964 |MWC 242,ESO 101-16,Sa 2-157,StWr 1- 2,Wray 16- 238 +326.0-06.5 |16 11 25.4 -59 46 34. 76..9055|He 2-151 |326-06 1 |16114-5946 |HENIZE 1964 |ESO 137-09,Wray 15-1440 +326.1-01.9 |15 49 00. -56 15 79.....2|VBe 3 | |15489-5615 |VAN DEN BERGH 1979 | +326.7+42.2 |14 01 41.8 -16 59 13. 76..9055|IC 972 |326+42 1 | |ABELL 1955 |A55 26,A 37,VV' 119 +327.1-01.8 |15 54 11.4 -55 33 17. 76..9055|He 2-140 |327-01 2 |15541-5533 |HENIZE 1964 |ESO 178-04,Wray 16- 194 +327.1-02.2 |15 55 59.5 -55 46 57. 76..9055|He 2-142 |327-02 1 |15559-5546 |HENIZE 1964 |ESO 178-05,SaSt 2-11,Wray 16- 198 +327.5+13.3 |15 02 55.2 -42 48 24. 73..9034|He 2-118 |327+13 1 |15029-4248 |HENIZE 1964 |ESO 273-16,Sa 2-114,StWr 4-11,Wray 16-165 +327.7-05.4 |16 15 06. -57 51 10. 89.30812|KoRe 1 | | |KOESTER et al 1989 | +327.8+10.0 |15 13 24.9 -45 27 56. 76..9055|NGC 5882 |327+10 1 |15134-4527 |HERSCHEL 1834 |ARO 505,ESO 274-07,He 2- 122,Sa 2-118,StWr 4-13,VV 71,VV' 122,Wray 16- 171 +327.8-01.6 |15 57 03.3 -54 57 14. 76..9055|He 2-143 |327-01 1 |15570-5457 |HENIZE 1964 |ESO 178-07,Sa 2-130,Wray 16- 200 +327.8-06.1 |16 19 18.7 -58 12 26. 76..9055|He 2-158 |327-06 1 |16193-5812 |HENIZE 1964 |ESO 137-22,Sa 2-142,StWr 2-46,Wray 16- 218 +327.8-07.2 |16 25 13.9 -59 02 48. 76..9055|He 2-163 |327-07 1 |16252-5902 |HENIZE 1964 |ESO 137-30,Sa 2-145,StWr 2-47,Wray 16- 222 +327.9-04.3 |16 09 56. -56 51 54. d 76..9055|He 2-147 |327-04 1 |16099-5651 |HENIZE 1964 |ESO 178-13,Wray 16- 208 +328.2+01.3 |15 45 46. -52 21 24. d 77..2615|Lo 10 | | |LONGMORE 1977 | +328.9-02.4 |16 06 43.1 -54 49 44. 76..9055|He 2-146 |328-02 1 |16067-5449 |HENIZE 1964 |ESO 178-10,Sa 2-133,Wray 16- 205 +329.0+01.9 |15 47 56.8 -51 22 24. 76..9055|Sp 1 |329+02 1 |15479-5122 |SHAPLEY 1936 |ARO 518,RCW 100 +329.3-02.8 |16 10 33.5 -54 49 31. 76..9055|Mz 2 |329-02 2 |16105-5449 |MENZEL 1922 |ESO 178-15,He 2- 150,Sa 2-137,VV 78,VV' 132,Wray 16- 210 +329.4-02.7 |16 10 26.6 -54 40 06. 76..9055|He 2-149 |329-02 1 |16104-5440 |HENIZE 1964 |ESO 178-14,Sa 2-136 +329.5+01.7 |15 51 24. -51 15 a 73..9025|VBRC 7 | | |VAN DEN BERGH et al 1973 |ARO 532,ESO 225-03,Wray 16- 191 +329.5-02.2 |16 08 38. -54 15 55. 83.30015|Wray 17- 75 | | |WRAY 1966 |HeFa 1 +330.2+05.9 |15 38 39.6 -47 31 12. 77..1134|Lo 9 | | |LONGMORE 1977 |K 1-30 +330.6-02.1 |16 13 19.3 -53 24 41. 76..9055|He 2-153 |330-02 1 | |HENIZE 1964 |ESO 178-17,Sa 2-140,Wray 16- 212 +330.6-03.6 |16 20 21.9 -54 29 09. 76..9055|He 2-159 |330-03 1 |16203-5429 |HENIZE 1964 |ESO 179-04,Sa 2-143,Wray 16- 219 +330.7+04.1 |15 47 38.5 -48 36 00. 76..9055|Cn 1-1 |330+04 1 |15476-4836 |CANNON 1921 |ESO 225-01,Wray 15-1364 +330.9+04.3 |15 47 42.8 -48 17 03. 66.30012|Wray 16-189 | |15478-4817 |WRAY 1966 |Sa 2-125 +331.0-02.7 |16 18 17.1 -53 33 53. 76..9055|He 2-157 |331-02 1 |16183-5333 |HENIZE 1964 |ESO 179-03,Wray 16- 217 +331.1-05.7 |16 33 37.1 -55 36 25. 76..9055|PC 11 |331-05 1 |16336-5536 |PEIMBERT et al 1961 |ESO 179-11,He 2- 172,He 3-1223,StWr 2- 43,Wray 16- 228 +331.3+16.8 |15 09 38.0 -37 56 16. 73..9034|NGC 5873 |331+16 1 |15096-3756 |COPELAND 1883 |ARO 533,ESO 328-34,He 2- 121,Sa 2-117,StWr 4- 7,VV 70,VV' 121,Wray 16- 170 +331.4+00.5 |16 05 13.0 -50 54 08. 76..9055|He 2-145 |331+00 1 |16051-5053 |HENIZE 1964 |ARO 556,ESO 225-05,Pe 1- 4,Sa 3- 34,VV' 130,Wray 16- 204 +331.4-03.5 |16 23 53.6 -53 54 47. 76..9055|He 2-162 |331-03 1 |16238-5354 |HENIZE 1964 |ESO 179-06,Wray 16- 221 +331.5-02.7 |16 20 41.7 -53 15 41. 76..9055|He 2-161 |331-02 2 |16206-5315 |HENIZE 1964 |ESO 179-05,Sa 2-144,Wray 16- 220 +331.5-03.9 |16 26 00.8 -54 03 05. 76..9055|He 2-165 |331-03 2 |16260-5402 |HENIZE 1964 |ESO 179-08,Sa 2-147,Wray 16- 224 +331.7-01.0 |16 13 23.3 -51 51 44. 76..9055|Mz 3 |331-01 1 |16133-5151 |MENZEL 1922 |ESO 225-09,He 2- 154,RCW 101,VV 80,VV' 136,Wray 16- 213 +332.0-03.3 |16 25 56.8 -53 16 32. 76..9055|He 2-164 |332-03 1 |16259-5316 |HENIZE 1964 |ESO 179-07,Sa 2-146,Wray 16- 223 +332.2+03.5 |15 56 43.7 -48 07 08. 66.30012|Wray 16-199 | |15567-4807 |WRAY 1966 |Sa 3-32 +332.3-04.2 |16 31 22.9 -53 43 59. 76..9055|He 2-170 |332-04 1 |16313-5344 |HENIZE 1964 |ESO 179-10,Sa 2-149,StWr 2- 42,Wray 16- 227 +332.8-16.4 |17 47 21.8 -60 22 35. 83.28035|HaTr 6 | | |HARTL et al 1983 | +332.9-09.9 |17 04 48.0 -56 51 01. 76...524|He 3-1333 | | |HENIZE 1976 | +333.4+01.1 |16 11 37.4 -49 05 56. 76..9055|He 2-152 |333+01 1 |16116-4905 |HENIZE 1964 |ESO 225-08,Pe 1- 5,Sa 2-139,VV' 135,Wray 16- 211 +333.4-04.0 |16 35 41.4 -52 43 21. 83.28035|HaTr 3 | | |HARTL et al 1983 | +334.3-01.4 |16 27 18.5 -50 20 46. 90..2581|MeWe 1- 6 | | |MELMER et al 1990 | +334.3-09.3 |17 07 37.2 -55 20 24. 76..9055|IC 4642 |334-09 1 |17075-5520 |FLEMING 1901 |ESO 180-04,He 2- 201,Sa 2- 176,Sp 2 +334.8-07.4 |16 59 00.2 -53 51 31. 77..1548|SaSt 2- 12 | |16590-5351 |SANDULEAK et al 1972 |He 3-1312 +335.2-03.6 |16 41 08.0 -51 06 48. 83.28035|HaTr 4 | | |HARTL et al 1983 | +335.4+09.2 |15 49 48.3 -41 41 33.1 84..1537|ESO 330-02 | | |HOLMBERG et al 1975 |K 1-31 +335.4-01.1 |16 30 29.0 -49 15 06. 76..9055|He 2-169 |335-01 1 |16304-4914 |HENIZE 1964 |ESO 226-15,Sa 3- 36,Wray 15-1508 +335.5+12.4 |15 39 42. -39 10 83...423|DS 2 | | |DRILLING 1983 | +335.6-04.0 |16 44 47.8 -51 03 59. 90..2581|MeWe 1- 8 | | |MELMER et al 1990 | +335.9-03.6 |16 44 06.3 -50 37 15. 90..2581|MeWe 1- 7 | | |MELMER et al 1990 | +336.2+01.9 |16 20 16.5 -46 35 17. 76..9055|Pe 1- 6 |336+01 1 |16202-4635 |PEREK 1960 |ESO 276-03,He 2- 160,Sa 3- 35,VV' 137 +336.2-06.9 |17 02 16.5 -52 25 58. 73..9018|PC 14 |336-06 1 |17023-5226 |PEIMBERT et al 1961 |ESO 227-05,He 2- 195,Sa 2-171,Wray 15-1611,Y-C 2-20 +336.3-05.6 |16 55 40.5 -51 37 36. 76..9055|He 2-186 |336-05 1 |16556-5137 |HENIZE 1964 |ESO 227-01,Sa 2-161,Wray 15-1585 +336.8-07.2 |17 05 38.2 -52 09 16. 77..1134|K 2-17 | |17056-5209 |KOHOUTEK 1977 |ESO 227-06 +336.9+08.3 |15 58 48. -41 25 12. * 66.30012|StWr 4-10 | |15587-4125 |WRAY 1966 |ESO 330-08,Sa 1- 3,Sa 2-132,Wray 15-1407 +336.9-11.5 |17 30 21.6 -54 26 47. 90..2581|MeWe 1-10 | | |MELMER et al 1990 | +337.4+01.6 |16 26 48.1 -45 56 22. 76..9055|Pe 1- 7 |337+01 1 |16268-4556 |PEREK 1960 |ESO 276-04,He 2- 166,VV' 139,Wray 15-1495 +337.4-09.1 |17 18 36.5 -52 43 39. 77..1548|Wray 16-266 | |17186-5243 |WRAY 1966 |ESO 180-07 +337.5-05.1 |16 57 45.9 -50 18 36. 76..9055|He 2-187 |337-05 1 |16577-5018 |HENIZE 1964 |ESO 227-02,Wray 15-1594 +337.6-04.2 |16 53 39.4 -49 42 14. 90..2581|MeWe 1- 9 | | |MELMER et al 1990 | +338.1-08.3 |17 16 49.1 -51 42 20. 76..9055|NGC 6326 |338-08 1 |17168-5142 |HERSCHEL 1835 |ARO 519,ESO 228-01,He 2- 208,VV' 174,Sa 2-39,StWr 2-39,VV 97,Wray 16- 262 +338.8+05.6 |16 15 54.7 -42 08 23. 73..9034|He 2-155 |338+05 1 |16158-4208 |HENIZE 1964 |Sa 2-141,ESO 331-01,Wray 16- 215 +339.9+88.4 |12 53 08. +26 09 42. d 80..2605|LoTr 5 | | |LONGMORE et al 1980 | +340.4-14.1 |17 56 57.6 -52 44 17. 77..1548|Sa 1- 6 | | |WRAY 1966 |ESO 182-02,Sa 2- 278,StWr 2- 4l,Wray 15-1818 +340.8+10.8 |16 05 08.1 -37 00 53. 77..1134|Lo 12 | | |LONGMORE 1977 |ESO 389-14,K 1-33 +340.8+12.3 |16 00 06.2 -35 52 39. 77..1134|Lo 11 | |16000-3552 |LONGMORE 1977 |ESO 389-09,K 1-32 +340.9-04.6 |17 07 42.7 -47 21 22. 66.30012|Sa 1-5 | |17077-4721 |SANDULEAK 1974 |ESO 278-05,Sa 2-177,Wray 15-1633 +341.2-24.6 |19 05 38. -55 39 30. d 77..2615|Lo 18 | | |LONGMORE 1977 | +341.5-09.1 |17 32 16.3 -49 23 43. 76..9055|He 2-248 |341-09 1 | |HENIZE 1964 |ESO 228-06,Sa 2-218,StWr 2-38,Wray 16- 290 +341.6+13.7 |15 58 07.4 -34 24 16. 76..9055|NGC 6026 |341+13 1 |15581-3424 |DE VAUCOULEURS 1955 |ESO 389-07,He 2- 144,Sa 2- 131,StWr 4- 4,VV' 128,Wray 16- 201 +341.8+05.4 |16 28 05.0 -40 08 58. 73..9034|NGC 6153 |341+05 1 |16280-4008 |COPELAND 1883 |ARO 501,ESO 331-06,He 2- 167,RCW 112,Sa 2- 148,VV 81,VV' 141,Wray 16-225 +342.1+10.8 |16 09 41.6 -36 06 01. 73..9034|NGC 6072 |342+10 1 |16097-3606 |HUBBLE 1921 |ARO 500,ESO 389-15,My 93,Sa 2- 134,VV 77 +342.1+27.5 |15 19 23.16-23 26 50.0 90..1502|Me 2-1 |342+27 1 |15193-2326 |MERRILL 1942 |ARO 88,ESO 514-12,He 2- 126,Sa 2- 120,StWr 4- 2 ,VV 72,VV' 124,Wray 16- 176,Y-C 2-18 +342.5-14.3 |18 03 22.8 -51 01 35. 76..9055|Sp 3 |342-14 1 |18033-5101 |SHAPLEY 1936 |ESO 229-06, +342.7+00.7 |16 49 59. -42 34 24. d 77..1550|H 1- 3 |342+00 1 | |HARO 1952 |ESO 277-17,Sa 3- 38,VV' 146,Wray 16- 239 +342.8-06.6 |17 24 04. -46 53 06. d 77..1550|Cn 1-4 |342-06 1 |17240-4653 |CANNON 1921 |ESO 278-10,He 2- 224,PC 16,Sa 2-197,StWr 2- 33,W ray 16- 274 +342.9-02.0 |17 02 46. -44 09 12. d 77..1550|Pe 1- 8 |342-02 1 |17027-4409 |HENIZE 1964 |ESO 278-03,He 2- 198,Sa 2-173,VV' 159,Wray 16- 249 +342.9-04.9 |17 15 51. -45 50 06. d 77..1550|He 2-207 |342-04 1 |17158-4550 |HENIZE 1964 |ESO 278-08,Sa 2-183,Wray 16- 261 +343.0-01.7 |17 02 03. -43 53 24. d 77..1550|Vd 1-9 |343-01 1 |17020-4352 |VANDERVORT 1964 |ESO 278-01 +343.3-00.6 |16 57 54.0 -43 01 35. 83.28035|HaTr 5 | | |HARTL et al 1983 | +343.4+11.9 |16 10 13. -34 28 06. d 77..1552|H 1- 1 |343+11 1 | |HARO 1952 |ESO 389-16,Sa 2-135,StWr 4- 5,VV' 134,Wray 16- 209 +343.5-07.8 |17 31 56.3 -46 57 57. 76..9055|PC 17 |343-07 1 |17319-4657 |PEIMBERT et al 1961 |ESO 279-01,He 2-246,Sa 2-216,StWr 2-34,Wray 16- 288 +343.6+03.7 |16 40 57. -39 57 48. d 80..1013|SuWt 3 | | |SCHUSTER et al 1980 | +343.9+00.8 |16 53 53. -41 33 18. d 76.26001|H 1- 5 |344+00 1 |16538-4133 |HARO 1952 |ESO 332-15,Sa 3- 39,VV' 149,Wray 16- 243 +344.2+04.7 |16 39 09. -38 48 48. d 77..1550|Vd 1-1 |344+04 1 |16391-3848 |VANDERVORT 1964 |ESO 331-08,He 2- 178,Sa 2-151,Wray 16- 231 +344.2-01.2 |17 03 26. -42 37 18. d 77..1550|H 1- 6 |344-01 1 | |HARO 1952 |ESO 278-04,He 2- 199,Sa 3- 40,VV' 160,Wray 16- 250 +344.4+02.8 |16 47 06. -39 57 54. d 77..1550|Vd 1-5 |344+02 1 | |VANDERVORT 1964 |ESO 332-04,Sa 2-156 +344.4-06.1 |17 26 23.2 -45 20 31. 66.30012|Wray 16-278 | | |WRAY 1966 |Sa 2-208 +344.8+03.4 |16 46 07. -39 16 00. d 77..1550|Vd 1-3 |344+03 1 | |VANDERVORT 1964 |ESO 332-02,Sa 3- 37 +345.0+03.4 |16 47 00. -39 03 12. d 77..1550|Vd 1-4 |345+03 1 |16469-3903 |VANDERVORT 1964 |ESO 332-03,He 3-1261,Sa 2-154,Wray 16- 235 +345.0+04.3 |16 43 21. -38 31 36. d 77..1550|Vd 1-2 |345+04 1 |16433-3831 |VANDERVORT 1964 |ESO 332-01 +345.0-04.9 |17 22 34. -44 08 54. d 77..1550|Cn 1-3 |345-04 1 |17225-4408 |CANNON 1921 |ESO 278-09,He 2- 220,PC 15,Sa 2-195,StWr 2-30,Wray 16- 272 +345.2-01.2 |17 06 55.4 -41 49 06. 67.30013|H 1- 7 |345-01 1 |17069-4149 |HARO 1952 |AS 219,ESO 332-24,He 2- 200,Sa 2-174,VV' 164,Wray 16- 254 +345.2-08.8 |17 41 52.6 -46 04 10. 76..9055|Tc 1 |345-08 1 |17418-4604 |THACKERAY 1950 |MWC 267,ESO 279-07,He 2- 274,SaSt 2-16,StWr 2-35,Wray 15- 1771 +345.3-10.2 |17 49 02.6 -46 41 14. 90..2581|MeWe 1-11 | | |MELMER et al 1990 | +345.4+00.1 |17 01 39.2 -40 48 52. 73..9034|IC 4637 |345+00 1 | |FLEMING 1901 |ESO 332-21,He 2- 193,Sa 2-168,VV 89,VV' 156,Wray 15-1607 +345.5+15.1 |16 06 35. -30 46 12. d 77..2615|Lo 13 | | |LONGMORE 1977 | +345.6+06.7 |16 36 08. -36 28 30. d 77..1552|He 2-175 |345+06 1 |16361-3628 |HENIZE 1964 |ESO 391-01,Sa 2-150,Wray 16- 229 +345.9+03.0 |16 51 02. -38 39 18. d 77..1550|Vd 1-6 |345+03 2 |16510-3839 |VANDERVORT 1964 |ESO 332-07,Sa 2- 159,Wray 16- 241 +345.9-11.2 |17 55 52. -46 38 42. d 77..1548|ESO 279-14 | | |HOLMBERG et al 1975 | +346.0+08.5 |16 30 47. -34 59 12. d 77..1552|He 2-171 |346+08 1 |16307-3459 |HENIZE 1964 |ESO 390-07,Wray 16- 226 +346.2-08.2 |17 41 48.4 -44 53 00. 76..9055|IC 4663 |346-08 1 |17417-4453 |FLEMING 1901 |ESO 279-06,He 2- 273,Sa 2- 236,StWr 2- 32,VV 111,VV' 239,Wray 16- 303 +346.3-06.8 |17 35 42. -44 08 a 75..9016|Fg 2 |346-06 1 |17356-4408 |FLEMING 1909 |ESO 279-04,He 2- 257,Sa 2-225,StWr 2-31,VV 106,VV' 224,Wray 16- 293 +346.9+12.4 |16 20 06.0 -31 38 00. 76..9055|K 1- 3 |346+12 1 | |KOHOUTEK 1962 |A 38,ESO 452-01,Wray 19- 45 +347.4+05.8 |16 45 34. -35 42 00. d 77..1552|H 1- 2 |347+05 1 |16456-3542 |HARO 1952 |AS 208,ESO 391- 03,He 2- 181,MHa 300- 58,Sa 2-153,VV' 144,Wray 16- 234 +347.7+02.0 |17 01 10. -37 49 06. d 77..1550|Vd 1-8 |347+01 1 |17011-3749 |VANDERVORT 1964 |ESO 332-18,Sa 2- 167 +348.0+06.3 |16 45 30.2 -34 55 44. 90..1016|MGP 1 | | |MANCHADO et al 1989 |RPZM 2- 1,Wray 15-1537 +348.0-13.8 |18 14 48.5 -46 00 16. 76..9055|IC 4699 |348-13 1 |18148-4600 |FLEMING 1901 |ARO 521,ESO 280- 08,He 2- 383,Sa 2-326,StWr 2-36,VV 167,VV' 383,Wray 16- 405 +348.4-04.1 |17 29 17. -40 56 18. d 77..1550|H 1-21 |348-04 1 |17292-4056 |HARO 1952 |ESO 333-13,Sa 2-213,VV' 211,Wray 16- 284 +348.8-09.0 |17 52 57. -43 02 54. d 75..9026|He 2-306 |348-09 1 |17529-4302 |HENIZE 1964 |ESO 279-12,Sa 2-267,StWr 2-29,Wray 16- 330 +349.2-03.5 |17 28 51. -39 49 12. d 77..1550|H 2-14 |349-03 1 | |HARO 1952 |ESO 333-11,Sa 3- 62,RPZM 2-22, VV' 210 +349.3-01.1 |17 18 50.0 -38 26 06. 73..9034|NGC 6337 |349-01 1 |17188-3826 |HERSCHEL 1834 |ESO 333-05,H 1-10,He 2- 215,Sa 2- 191,Sh 1- 6,VV' 181,Wray 16- 267 +349.3-04.2 |17 32 10. -40 10 06. d 77..2615|Lo 16 | |17322-4009 |LONGMORE 1977 | +349.5+01.0 |17 10 21.1 -37 02 38. 73..9034|NGC 6302 |349+01 1 |17103-3702 |FLEMING 1896 |ARO 502,ESO 392-05,Gum 60,He 2- 204,RCW 124,Sa 2- 180,Sh 1- 3,Sh 2- 6,VV 94,VV' 168,Wray 16- 259 +349.8+04.4 |16 57 47.7 -34 45 17.4 83..1405|M 2- 4 |349+04 1 |16578-3445 |MINKOWSKI 1947 |ESO 391-07,He 2- 188,Sa 2-163,VV 84,VV' 150,Wray 16- 2456 +350.1-03.9 |17 33 02. -39 20 12. d 77..1550|H 1-26 |350-03 1 |17330-3920 |HARO 1952 |ESO 334-01,He 2- 253,Sa 2-220,VV' 220,Wray 16- 291 +350.5-05.0 |17 39 25. -39 35 06. d 77..1550|H 1-28 |350-05 1 |17394-3935 |HARO 1952 |ESO 334-05,He 2- 268,Sa 2-231,VV4 233,Wray 15-1760 +350.8-02.4 |17 28 55. -37 55 30. d 77..1550|H 1-22 |350-02 1 |17289-3755 |HARO 1952 |ESO 333-12,He 2- 241,Sa 2-212,VV' 212,Wray 16- 283 +350.9+04.4 |17 01 19.4 -33 55 05. 73..9034|H 2- 1 |350+04 1 |17013-3355 |HARO 1952 |MWC 247,ESO 392-02,He 2- 194,SaSt 2- 14,VV' 155,Wray 16- 247 +351.0-10.4 |18 05 24.4 -41 48 56. 83.28035|HaTr 9 | | |HARTL et al 1983 | +351.1+04.8 |17 00 30. -33 25 42. d 77..1552|M 1-19 |351+04 1 |17005-3325 |MINKOWSKI 1946 |ESO 392-01,He 2- 191,Sa 2-165,VV' 153,Wray 15-1601 +351.2+05.2 |16 59 03.2 -33 05 47.3 83..1405|M 2- 5 |351+05 1 |16590-3305 |MINKOWSKI 1947 |ESO 391-08,He 2- 190,SaSt 2-13,VV 86,VV' 152,Wray 16- 246 +351.3+07.6 |16 50 24. -31 35 42. d 80..1575|H 1- 4 |351+07 1 | |HARO 1952 |ESO 453-09,Sa 2-158,VV' 147,Wray 16- 240 +351.6-06.2 |17 47 16. -39 16 36. d 77..1550|H 1-37 |351-06 1 |17472-3916 |HARO 1952 |ESO 334-09,He 2- 291,Sa 2-251,VV' 262,Wray 16- 314 +351.7-10.9 |18 09 20.0 -41 31 15. 66.30012|Wray 16-385 | | |WRAY 1966 |Sa 2-311,StWr 2-28 +351.9+09.0 |16 47 06. -30 14 48. d 80..1575|PC 13 |351+09 1 |16471-3014 |PEIMBERT et al 1961 |ESO 453-06,Sa 2-155,StWr 4- 3,Wray 16- 236 +351.9-01.9 |17 29 37.3 -36 41 48. 66.30012|Wray 16-286 | |17296-3641 |WRAY 1966 |ESO 393-06,Sa 2-215 +352.0-04.6 |17 41 41. -38 07 36. d 77..1550|H 1-30 |352-04 1 |17416-3807 |HARO 1952 |ESO 334-06,He 2- 272,VV' 237,Sa 2-23,Wray 16- 301 +352.1+05.1 |17 02 16. -32 28 06. d 80..1575|M 2- 8 |352+05 1 |17022-3228 |MINKOWSKI 1947 |ESO 453-18,He 2- 197,Sa 2-170,VV 91,VV' 158,Wray 16- 248 +352.6+00.1 |17 23 04. -34 59 12. d 77..1552|H 1-12 |352+00 1 |17230-3459 |HARO 1952 |ESO 392-12,He 2- 222,Sa 3- 51,VV' 190,Wray 16-273 +352.6+03.0 |17 11 26. -33 21 24. d 77..1552|H 1- 8 |352+03 2 | |HARO 1952 |ARO 549,ESO 392-06,Sa 2-182,VV' 170 +352.8-00.2 |17 25 07. -35 05 18. d 77..1552|H 1-13 |352-00 1 |17251-3505 |HARO 1952 |ESO 393-01,He 2- 227,Sa 3-55,VV' 195,Wray 15-1712 +352.9+11.4 |16 41 41.7 -27 58 36. 77..1134|K 2-16 | |16416-2758 |KOHOUTEK 1977 |ESO 453-02,Wray 17- 76, Anon 16h38 +352.9-07.5 |17 56 44.4 -38 49 45. 73..9034|Fg 3 |352-07 1 |17567-3849 |FLEMING 1911 |ARO 520,ESO 334- 10,He 2- 320,Sa 2-277,StWr 2-26,VV 133,VV' 308,Wray 16- 346 +353.2-05.2 |17 47 20. -37 23 06. d 77..1552|H 1-38 |353-05 1 | |HARO 1952 |ESO 393-35,Sa 3- 81,VV' 264,Wray 16- 315 +353.3+06.3 |17 01 05.9 -30 49 20.9 83..1405|M 2- 6 |353+06 2 |17012-3049 |MINKOWSKI 1947 |ESO 453-16,He 2- 192,Sa 2-166,VV 88,VV' 154 +353.5-04.9 |17 46 24.13-37 00 35.0 90..1502|H 1-36 |353-04 1 |17463-3700 |HARO 1952 |ESO 393-31,He 2- 289,Sa 2-249,VV' 259 +353.7+06.3 |17 02 02. -30 28 24. d 80..1575|M 2- 7 |353+06 1 |17020-3028 |MINKOWSKI 1947 |ESO 453-17,He 2- 196,Sa 2-169,VV 90,VV' 157,Wray 15-1509 +353.7-12.8 |18 23 11.0 -40 31 40. 66.30012|Wray 16-411 | |18232-4031 |WRAY 1966 | +354.2+04.3 |17 10 53.5 -31 16 16.0 83..1405|M 2-10 |354+04 1 |17108-3116 |MINKOWSKI 1947 |ESO 454-01,He 2- 205,VV 95,VV' 169,Wray 15-1647 +354.4-07.8 |18 01 32. -37 38 24. d 77..1550|H 1-52 |354-07 1 | |HARO 1952 |ESO 335-01,Sa 2-292,VV' 332,Wray 16- 364 +354.5+03.3 |17 15 38. -31 36 00. d 77..1552|Th 3- 4 |354+03 1 |17156-3135 |THE 1964 |ESO 454-07,Sa 3- 44 +354.9+03.5 |17 16 07. -31 09 30. d 77..1552|Th 3- 6 |355+03 3 |17161-3109 |THE 1964 |ESO 454-09,Sa 3- 45 +355.1+02.3 |17 21 12. -31 40 36. d 67.30013|Th 3-11 |355+02 3 |17212-3140 |THE 1964 |ESO 454-18,Sa 3- 47 +355.1-02.9 |17 42 12.6 -34 32 45.4 83..1405|H 1-31 |355-02 4 |17422-3432 |HARO 1952 |ESO 393-21,He 2- 276,Sa 2-238,VV' 240,Wray 16- 305 +355.1-06.9 |17 59 08.0 -36 38 55. 73..9034|M 3-21 |355-06 1 |17591-3639 |MINKOWSKI 1948 |ESO 394-21,He 2- 328,Sa 2-284,VV' 319,Wray 16- 352 +355.2-02.5 |17 40 55. -34 16 12. d 77..1552|H 1-29 |355-02 2 |17409-3416 |HARO 1952 |ESO 193-16,He 2- 270,Sa 2-233,VV' 235,Wray 16- 299 +355.4-02.4 |17 41 01.6 -34 05 25. 73..9034|M 3-14 |355-02 1 |17410-3405 |MINKOWSKI 1948 |ARO 552,ESO 393-19,He 2- 271,Sa 2-234,VV' 236,Wray 16- 300 +355.4-04.0 |17 47 51.9 -34 54 40. 76..9055|Hf 2-1 |355-04 1 |17478-3454 |HOFFLEIT 1953 |ESO 393-37,Pe 1-10,Sa 2-253,VV' 266,Wray 16-316 +355.6-02.7 |17 42 47.5 -34 02 38.0 83..1405|H 1-32 |355-02 3 |17427-3402 |HARO 1952 |ESO 393-23,He 2- 278,Sa 2-241,VV' 245,Wray 16- 307 +355.7-03.0 |17 44 31. -34 07 00. d 77..1552|H 1-33 |355-03 1 | |HARO 1952 |ESO 393-26,He 2- 283,VV' 248 +355.7-03.4 |17 45 39. -34 21 00. d 77..1552|H 2-23 |355-03 2 | |HARO 1952 |ESO 393-27,He 3-1489,Sa 2-246,VV' 255 +355.7-03.5 |17 45 54.6 -34 21 59. 76..9055|H 1-35 |355-03 3 |17459-3421 |HARO 1952 |ESO 393-29,He 2- 288,My 103,Sa 2-247,VV' 257,Wray 16- 311 +355.9+02.7 |17 21 27. -30 49 12. d 77..1552|Th 3-10 |355+02 2 |17214-3049 |THE 1964 |ESO 454-21,Sa 3- 48 +355.9+03.6 |17 18 20. -30 17 54. d 77..1552|H 1- 9 |355+03 2 |17183-3017 |HARO 1952 |AS 226,ESO 454-14,He 2- 213,VV' 176,Wray 15-1689 ,MHa 76- 33,EM* AS 226,Sa 2- 190 +355.9-04.2 |17 49 39.1 -34 37 45.0 83..1405|M 1-30 |355-04 2 |17496-3437 |MINKOWSKI 1946 |ESO 394-05,He 2- 295,Sa 2-259,VV 120,VV' 271,Wray 16- 322 +356.1+02.7 |17 22 06. -30 38 06. d 77..1552|Th 3-13 |356+02 1 |17221-3038 |THE 1964 |ESO 454-24 +356.1-03.3 |17 46 32. -33 59 24. d 77..1552|H 2-26 |356-03 1 | |HARO 1952 |ESO 393-32,Sa 3- 79,VV' 261,Wray 17- 99 +356.2-04.4 |17 51 13.6 -34 21 50. 76..9055|Cn 2-1 |356-04 1 |17512-3421 |CANNON 1922 |ESO 394-10,He 2- 303,Sa 2-263,VV 126,VV' 281,Wra y 16- 327 +356.3-06.2 |17 59 11. -35 13 12. d 81..1503|M 3-49 |356-06 1 | |MINKOWSKI 1948 |ESO 394-22,He 2- 329,Sa 3-112,VV' 318,Wray 16- 353 +356.5+01.5 |17 27 45. -30 58 54. d 81..1503|Th 3-55 |356+01 2 |17277-3058 |THE 1964 |ESO 455-10,Sa 3- 58 +356.5+05.1 |17 14 10. -28 56 18. d 77..1552|Th 3- 3 |356+05 1 | |THE 1964 |ESO 454-05,Sa 3- 42 +356.5-02.3 |17 43 28.2 -33 07 30. 67.30013|M 1-27 |356-02 2 |17434-3307 |MINKOWSKI 1946 |ESO 393-24,He 2- 280,VV 113,VV' 246,Wray 16- 308 +356.5-03.6 |17 48 32. -33 46 54. d 81..1503|H 2-27 |356-03 2 |17485-3346 |HARO 1952 |ESO 394-02,Sa 3- 83,VV' 269 +356.5-03.9 |17 50 02. -33 55 24. d 76.26001|H 1-39 |356-03 3 |17500-3355 |HARO 1952 |ESO 394-07,He 2- 300,VV' 277,Wray 16- 323 +356.6-07.8 |18 06 27. -35 44 48. d 81..1503|H 1-57 |356-07 2 | |HARO 1952 |ESO 394-31,He 2- 353,Sa 3-121,VV' 353,Wray 17- 113 +356.7-04.8 |17 54 00.1 -34 09 30. 76..9055|H 1-41 |356-04 2 |17539-3409 |HARO 1952 |AS 256,ESO 394-13,He 2- 308,MHa 304- 10,Sa 2-269,VV' 293,Wray 16- 333 +356.7-06.4 |18 01 09. -34 58 12. d 81..1503|H 1-51 |356-06 2 | |HARO 1952 |ESO 394-26,Sa 3-116,VV' 331,Wray 16- 362 +356.8+03.3 |17 21 55. -29 42 36. d 77..1552|Th 3-12 |356+03 1 |17219-2942 |THE 1964 |ESO 454-23,Sa 3- 49 +356.8-05.4 |17 56 59. -34 27 36. d 81..1503|H 2-35 |356-05 1 | |HARO 1952 |ESO 394-17,Sa 3-109,VV' 311 +356.8-11.7 |18 24 24. -37 17 54. d 77..2615|Lo 17 | | |LONGMORE 1977 |ESO 395-07 +356.9+04.4 |17 17 54.0 -29 00 03. 76..9055|M 3-38 |356+04 2 |17178-2900 |MINKOWSKI 1948 |ARO 248,ESO 454-13,He 2- 211,Sa 2-187,VV' 178,Wray 16- 264 +356.9+04.5 |17 17 23.1 -28 57 40. 76..9055|M 2-11 |356+04 1 |17173-2857 |MINKOWSKI 1947 |ESO 454-11,He 2- 210,Sa 2-186,VV 98,VV' 177,Wray 16-263 +356.9-05.8 |17 58 43.3 -34 27 49. 76..9055|M 2-24 |356-05 2 |17587-3427 |MINKOWSKI 1947 |ESO 394-20,He 2- 327,Sa 2-282,VV 137,VV' 317,Wray 16- 351 +357.0+02.4 |17 25 38. -30 05 30. d 77..1552|M 4- 4 |357+02 5 |17255-3005 |MINKOWSKI 1948 |ESO 454-36,Sa 3- 56,Th 3-42 +357.1+01.9 |17 27 39. -30 15 00. d 81..1503|Th 3-24 |357+02 7 | |THE 1964 |ESO 455-09 +357.1+03.6 |17 21 23.6 -29 21 33. 76..9055|M 3- 7 |357+03 1 | |MINKOWSKI 1948 |ESO 454-19,He 2- 218,Sa 2-194,VV' 185,Wray 16- 270 +357.1+04.4 |17 18 27.8 -28 52 20. 88.30862|TeJu 18 | | |TERZAN et al 1980 |PBOZ 1 +357.1-04.7 |17 54 57. -33 47 24. d 81..1503|H 1-43 |357-04 3 |17549-3347 |HARO 1952 |ESO 394-15,He 2- 313,VV' 297,Wray 16-335 +357.1-06.1 |18 00 45. -34 28 42. d 81..1503|M 3-50 |357-06 1 | |MINKOWSKI 1948 |ESO 394-25,Sa 2-290,VV' 327 +357.2+01.4 |17 30 04.3 -30 24 27. 79.10517|Al 2-H | | |ALLEN 1979 | +357.2+02.0 |17 27 55. -30 08 24. d 81..1503|H 2-13 |357+02 6 | |HARO 1952 |ESO 455-12,VV' 209,Sa 3- 59,Wray 17- 86 +357.2+07.4 |17 07 34.7 -27 05 03.3 83..1405|M 4- 3 |357+07 1 |17075-2705 |MINKOWSKI 1948 |ESO 519-07,He 2- 202,Sa 2-175,Th 3- 2,Wray 16- 256 +357.2-04.5 |17 54 07. -33 35 24. d 81..1503|H 1-42 |357-04 1 |17541-3335 |HARO 1952 |ESO 394-14,He 2- 310,Sa 2- 270,VV' 294,Wray 16- 334 +357.3+03.3 |17 22 48. -29 19 18. d 77..1552|M 3-41 |357+03 2 |17228-2919 |MINKOWSKI 1948 |ESO 454-25,He 2- 223,VV' 191,Wray 17- 79 +357.3+04.0 |17 20 14.7 -28 56 19. 67.30013|H 2- 7 |357+04 1 |17202-2856 |HARO 1952 |ESO 454-16,Sa 2-192,VV' 183 +357.4-03.2 |17 49 17.7 -32 45 12. 76..9055|M 2-16 |357-03 2 |17492-3245 |MINKOWSKI 1947 |ESO 394-04,He 2- 297,Sa 2- 256,VV 121,VV' 273,Wray 16- 320 +357.4-03.5 |17 50 21. -32 58 18. d 81..1503|M 2-18 |357-03 4 |17503-3258 |MINKOWSKI 1947 |ESO 394-08,He 2- 301,Sa 2- 261,VV 124,VV' 278,Wray 16- 324 +357.4-04.6 |17 55 14.7 -33 28 23. 76..9055|M 2-22 |357-04 2 |17552-3328 |MINKOWSKI 1947 |ESO 394-16,He 2- 316,Sa 2-273,VV 132,VV' 302,Wray 16- 341 +357.5+03.1 |17 24 13.4 -29 18 44. 67.30013|Th 3-16 |357+03 5 | |THE 1964 |ESO 454-28,Sa 3-53 +357.5+03.2 |17 23 49.1 -29 13 01. 76.26001|M 3-42 |357+03 4 |17238-2913 |MINKOWSKI 1948 |Sa 3- 52,VV' 192,Wray 17- 80 +357.6+01.0 |17 32 31. -30 19 36. 78..5001|TrBr 4 | | |TERZAN et al 1978 |TeJu 21 +357.6+01.7 |17 29 34.9 -29 58 09.2 83..1405|H 1-23 |357+01 1 |17296-2958 |HARO 1952 |ESO 455-16,He 2- 242,Sa 2-214,VV' 214,Wray 16- 285 +357.6+02.6 |17 26 32.0 -29 30 30. 76..9055|H 1-18 |357+02 4 |17265-2930 |HARO 1952 |ARO 252,ESO 455-03,He 2- 234,Sa 2-210,VV' 205 +357.6-03.3 |17 50 00.2 -32 40 04. 67.30013|H 2-29 |357-03 3 |17499-3240 |HARO 1952 |ESO 394-06,Sa 3- 87,VV' 276 +357.9-03.8 |17 52 57.2 -32 37 10. 67.30013|H 2-30 |358-03 2 |17529-3236 |HARO 1952 |ESO 394-11,VV' 287 +357.9-05.1 |17 58 04.7 -33 17 43. 76..9055|M 1-34 |357-05 1 |17580-3317 |MINKOWSKI 1946 |ESO 394-18,He 2- 324,Sa 2-279,VV 135,VV' 313,Wray 16- 348 +358.0+02.6 |17 27 13. -29 07 18. d 81..1503|Th 3-23 |358+02 2 |17271-2907 |THE 1964 |ESO 455-06 +358.0+07.5 |17 09 24. -26 22 a 90..2002|TeJu 8 | | |TERZAN et al 1980 | +358.0+09.3 |17 02 42. -25 20 a 75..9016|Th 3- 1 |358+09 1 | |THE 1964 |ESO 518-11,Sa 2-172 +358.0-05.1 |17 58 25. -33 15 18. d 81..1503|Pe 1-11 |358-05 1 |17584-3315 |MINKOWSKI 1948 |ESO 394-19,Sa 2-280,VV' 315,Wray 16- 349 +358.2+03.5 |17 24 23. -28 28 42. d 77..1552|H 2-10 |358+03 2 |17243-2828 |HARO 1952 |ESO 454-31,He 2- 226,Sa 2-199,VV' 194,Wray 17- 82 +358.2+03.6 |17 24 11.0 -28 25 22. 76..9055|M 3-10 |358+03 1 |17241-2825 |MINKOWSKI 1948 |ARO 250,ESO 454- 27,He 2- 225,Sa 2-198,VV' 193,Wray 16- 275 +358.2+04.2 |17 21 43.2 -28 03 15. 76..9055|M 3- 8 |358+04 1 |17217-2803 |MINKOWSKI 1948 |ESO 454-22,He 2- 219,VV' 186,Wray 16- 271 +358.2-01.1 |17 42 49. -31 02 24. d 81..1503|Bl D |358-01 1 | |BLANCO 1961 |Al 2- L,ESO 455-34,Wray 17- 98 +358.3+01.2 |17 33 49. -29 38 30. d 67.30013|Bl B |358+01 4 | |BLANCO 1961 |ESO 455-26 +358.3+03.0 |17 26 31. -28 38 12. d 81..1503|H 1-17 |358+03 7 |17265-2838 |HARO 1952 |ESO 455-02,He 2- 233,Sa 2-209,VV' 204,Wray 17- 85 +358.3-02.5 |17 48 29.9 -31 35 17. 79.10517|Al 2-O | |17484-3135 |ALLEN 1979 | +358.3-21.6 |19 13 57. -39 42 12. d 77..1550|IC 1297 |358-21 1 |19139-3942 |FLEMING 1894 |ESO 337-20,He 2- 431,Sa 2-386,StWr 2-27,VV 225,VV' 487 +358.4+03.3 |17 25 32.2 -28 24 56.0 83..1405|Th 3-19 |358+03 3 |17253-2824 |THE 1964 |Al 2- C?,ESO 454-34 +358.5+02.6 |17 28 36.9 -28 39 47. 83.28034|HDW 8 | | |HARTL et al 1983 | Wray 16-282, HaWe 11 +358.5+02.9 |17 27 20.6 -28 33 41. 79.10517|Al 2-F | | |ALLEN 1979 | +358.5+03.7 |17 24 37.9 -28 08 36. 79.10517|Al 2-B | | |ALLEN 1979 | +358.5+05.4 |17 18 04.1 -27 08 32. 76..9055|M 3-39 |358+05 1 |17180-2708 |MINKOWSKI 1948 |ESO 519-13,He 2- 212,Sa 2-188,VV' 179,Wray 16- 265 +358.5-02.5 |17 48 55. -31 29 22. d 81..1503|M 4- 7 |358-02 1 | |MINKOWSKI 1948 |ESO 455-54,Al 2-P +358.5-04.2 |17 55 46.3 -32 21 33. 76..9055|H 1-46 |358-04 1 |17557-3221 |HARO 1952 |ESO 456-31,He 2- 318,Sa 2-274,VV' 306,Wray 16- 342 +358.5-07.3 |18 08 44.6 -33 52 46. 73..9034|NGC 6563 |358-07 1 |18087-3352 |HERSCHEL 1837 |ARO 503,CD -33 12935,ESO 394-33,GCRV 10633,He 2- 361,HD 166469,Sa 2- 308,StWr 2- 22,VV 154,VV' 359,Wray 16-383 +358.6+01.8 |17 32 03.4 -29 01 16.0 83..1405|M 4- 6 |358+01 1 |17320-2901 |MINKOWSKI 1948 |ESO 455-20,Sa 3- 65,Th 3-68 +358.6+07.8 |17 09 34. -25 40 00. d 81..1503|M 3-36 |358+07 1 |17095-2540 |MINKOWSKI 1948 |ESO 519- 10,He 2- 203,Sa 2-178,VV' 167,Wray 16- 258 +358.6-05.5 |18 01 39. -32 54 18. d 81..1503|M 3-51 |358-05 4 | |MINKOWSKI 1948 |ESO 394-27,He 2- 337,Sa 3- 118,VV' 334,Wray 16- 365 +358.7+05.2 |17 19 20.8 -27 05 45. 76..9055|M 3-40 |358+05 2 |17193-2705 |MINKOWSKI 1948 |ESO 519-14,He 2- 216,Sa 3- 46,VV' 182 +358.7-02.7 |17 50 22.8 -31 24 58. 79.10517|Al 2-R | | |ALLEN 1979 | +358.7-05.2 |18 00 37. -32 41 48. d 81..1503|H 1-50 |358-05 3 |18006-3241 |HARO 1952 |ESO 394-24,He 2- 334,Sa 2-288,VV' 325,Wray 16- 359 +358.8+03.0 |17 28 00. -28 12 48. d 81..1503|Th 3-26 |358+03 8 |17280-2812 |THE 1964 |ESO 455-13,He 2- 240,Sa 3- 60,Wray 17- 87 +358.8+04.0 |17 24 01. -27 41 54. d 77..1552|Th 3-15 |358+04 2 | |THE 1964 |Al 2- A,ESO 454-26 +358.8+04.1 |17 23 46.5 -27 38 10. 87..1594|SaWe 2 | |17236-2739 |SAURER et al 1987 |PBOZ 4 +358.8-00.0 |17 39 30.5 -29 50 12.9 90..2002|Te 2022 | | |TERZAN 1989 | +358.9+03.2 |17 27 34.8 -28 01 51. 76..9055|H 1-20 |358+03 6 |17275-2801 |HARO 1952 |ESO 456-08,He 2- 238,Sa 2-211,VV' 207,Wray 16- 280 +358.9+03.4 |17 26 54. -27 57 06. d 81..1503|H 1-19 |358+03 4 |17268-2756 |HARO 1952 |ESO 455-05,He 2- 237,VV' 206,Wray 16- 279 +358.9-00.7 |17 42 45.10-30 10 52.0 90..1502|M 1-26 |358-00 2 |17427-3010 |MINKOWSKI 1946 |Bl C,AS 270,ESO 455-33,He 2- 277,RCW 135,SaSt 2-17,VV 112,VV' 242,Wray 16- 306 +358.9-03.7 |17 54 56. -31 42 42. d 77..1552|H 1-44 |358-03 1 |17549-3142 |HARO 1952 |ESO 456-23,He 2- 314,RCW 136,Sa 3-101,VV' 299,Wray 16- 336 +359.0+02.8 |17 29 13.2 -28 12 23. 79.10517|Al 2-G | |17291-2812 |ALLEN 1979 | +359.0-04.1 |17 56 41.4 -31 54 27. 67.30013|M 3-48 |359-04 1 | |MINKOWSKI 1948 |ESO 456-34,Sa 3-108,VV' 310,Wray 16- 345 +359.0-04.8 |17 59 31. -32 09 36. d 77..1552|M 2-25 |359-04 3 |17594-3209 |MINKOWSKI 1947 |ESO 456-40,He 2- 330,Sa 2-285,VV 138,VV' 321,Wray 16- 354 +359.1+15.1 |16 45 35.8 -20 55 26. 76..9055|A 40 |359+15 1 |16456-2055 |ABELL 1955 |A55 28,ESO 586-03,VV' 145 +359.1-01.7 |17 47 04.8 -30 34 06. 76..9055|M 1-29 |359-01 1 |17471-3034 |MINKOWSKI 1946 |Bl F,ESO 455-47,He 2- 292,Sa 2-250,VV 119,VV' 263,Wray 16- 313 +359.1-02.3 |17 49 33. -30 49 06. d 77..1552|M 3-16 |359-02 2 |17495-3048 |MINKOWSKI 1948 |VV' 272,Sa 2-258,ESO 456-02,Wray 16- 321,He 2- 296,Bl J=K +359.1-02.9 |17 51 52. -31 11 54. d 77..1552|M 3-46 |359-02 4 |17518-3111 |MINKOWSKI 1948 |ESO 456-15,Sa 3- 93,VV' 283,Wray 17- 103 +359.2+01.2 |17 35 52.4 -28 54 59. 80..1016|19W32 | |17358-2854 |WOUTERLOOT et al 1979 | PM 1-166 +359.2+04.7 |17 22 37. -26 55 12. d 81..1503|Th 3-14 |359+04 1 |17226-2655 |THE 1964 |ESO 519-18,Sa 3- 50 +359.2-33.5 |20 16 05.2 -41 40 57. 91.00001|CRBB 1 | | |MAC CARTHY 1991 |He 3-1863 +359.3+01.4 |17 35 32.0 -28 41 06. 67.30013|Th 3-35 |359+01 1 | |THE 1964 |ESO 455-28,19W27 +359.3+03.6 |17 27 06.2 -27 28 04. 79.10517|Al 2-E | |17270-2728 |ALLEN 1979 | +359.3-00.9 |17 44 44.5 -29 58 53. 73..9034|Hb 5 |359-00 1 |17447-2958 |HUBBLE 1921 |ARO 389,Bl E,ESO 455-42,He 2- 286,VV 116,VV' 252,Wray 16- 310 +359.3-01.8 |17 48 06.0 -30 23 08.6 83..1405|M 3-44 |359-01 2 |17480-3023 |MINKOWSKI 1948 |Bl H,ESO 455-51,Sa 3- 82,VV' 267,Wray 16- 317 +359.3-03.1 |17 53 12. -31 04 00. d 77..1552|M 3-17 |359-03 1 |17531-3103 |MINKOWSKI 1948 |ESO 456-21,He 2- 307,Sa 3- 97,VV' 289,Wray 16- 331 +359.4+02.3 |17 32 06. -28 05 12. d 81..1503|Th 3-32 |359+02 4 | |THE 1964 |ESO 455-21 +359.4-03.4 |17 54 58.6 -31 07 53. 67.30013|H 2-33 |359-03 2 |17549-3107 |HARO 1952 |ESO 456-25,Sa 3-102,VV' 298,Wray 16- 338 +359.5+02.6 |17 31 05.0 -27 54 01. 79.10517|Al 2-K | |17310-2754 |ALLEN 1979 | +359.6+02.2 |17 33 05.2 -27 58 55. 79.10517|Al 2-I | |17329-2756 |ALLEN 1979 | +359.6-04.8 |18 00 52. -31 39 24. d 77..1552|H 2-36 |359-04 4 | |HARO 1952 |ESO 456-45,Sa 3-114,VV' 329,Wray 16- 361 +359.7-01.8 |17 48 53. -30 04 36. d 81..1503|M 3-45 |359-01 3 |17489-3004 |MINKOWSKI 1948 |Bl I,ESO 455-53,Sa 3- 84,VV' 270,Wray 17- 100 +359.7-02.6 |17 52 22.9 -30 33 06.2 83..1405|H 1-40 |359-02 3 |17523-3033 |HARO 1952 |Bl 3-8,ARO 29,ESO 456-17,Sa 2-266,VV' 286,Wray 16- 328 +359.7-04.4 |17 59 38.3 -31 24 03. 88..2065|KFL 3 | | |KINMAN et al 1988 | +359.8+02.4 |17 32 38. -27 41 12. d 81..1503|Th 3-33 |359+02 3 |17326-2741 |THE 1964 |ESO 455-24,Sa 3- 67 +359.8+03.7 |17 27 39. -27 03 42. d 77..1552|Th 3-25 |359+03 2 |17276-2703 |THE 1964 |ESO 520-05,He 2- 239,Sa 3- 57,Wray 16- 281 +359.8+05.2 |17 22 12. -26 10 a 90..2002|TeJu 19 | | |TERZAN et al 1980 | +359.8+05.6 |17 20 55.6 -25 56 40. 76..9055|M 2-12 |359+05 1 |17209-2556A|MINKOWSKI 1947 |ESO 519-16,He 2- 217,VV 99,VV' 184,Wray 17- 77 +359.8+06.9 |17 16 08. -25 14 12. d 81..1503|M 3-37 |359+06 1 |17161-2514 |MINKOWSKI 1948 |ESO 519-12,He 2- 209,Sa 2-184,VV' 175 +359.8-07.2 |18 11 34. -32 38 07. d 81..1503|M 2-32 |359-07 1 |18115-3237 |MINKOWSKI 1957 |ESO 394-35,He 2- 371,Sa 2-316,StWr 2-19,VV 161,VV' 373,Wray 16- 393 +359.9+05.1 |17 22 37.2 -26 09 18. 76..9055|M 3- 9 |359+05 2 |17226-2609 |MINKOWSKI 1948 |ESO 519-17,He 2- 221,Sa 2-196,VV' 189,Wray 17- 78 +359.9-04.5 |18 00 38.1 -31 17 55. 76..9055|M 2-27 |359-04 2 |18006-3117 |MINKOWSKI 1947 |ESO 456-44,He 2- 335,Sa 2-289,VV 140,VV' 326,Wray 16- 360 +359.9-05.4 |18 04 04.3 -31 43 19. 88..2065|KFL 9 | | |KINMAN et al 1988 | diff --git a/astro_data/perek_kohoutek/pk.desc b/astro_data/perek_kohoutek/pk.desc new file mode 100644 index 000000000..e5e1f69d1 --- /dev/null +++ b/astro_data/perek_kohoutek/pk.desc @@ -0,0 +1,14 @@ +The Perek-Kohoutek catalog is the standard reference list of galactic planetary nebulae. +Lubos Perek and Lubos Kohoutek published the first edition in 1967 (CGPN). +This import uses Kohoutek's 2001 revision, which holds 1510 confirmed galactic planetary nebulae. + +A PK designation encodes galactic position, not brightness: PK 036+17.1 sits at galactic longitude 36 degrees and latitude +17 degrees, and is the first nebula listed in that one-degree cell. +The full designation is stored as a name, so search finds it. +PiFinder numbers the entries 1 to 1510 in order of right ascension, the same numbering the printed catalog uses. +So "PK 743" is a position in the list, not a real designation. + +Most entries carry no magnitude, because the source catalog holds only positions and identifications. +Entries that are also NGC, IC, Abell or Sharpless objects take their magnitude from that catalog. +Around 200 to 300 of these nebulae are within reach of a small telescope; many of the rest are faint or heavily reddened in the galactic plane. + +Sizes come from the Strasbourg-ESO Catalogue of Galactic Planetary Nebulae (Acker et al. 1992), which covers 1112 of the entries. diff --git a/astro_data/perek_kohoutek/simbad_pk.tsv b/astro_data/perek_kohoutek/simbad_pk.tsv new file mode 100644 index 000000000..25ab4c349 --- /dev/null +++ b/astro_data/perek_kohoutek/simbad_pk.tsv @@ -0,0 +1,1968 @@ +id main_id ra dec otype +"PK 151+02 1" "LBN 151.25+02.12" 64.92088 53.14204 "HII" +"PK 102-05 1" "PN A66 80" 338.69003189956 52.4349527839 "PN" +"PK 123+34 1" "IC 3568" 188.27856215089 82.56394517878 "PN" +"PK 289+01 1" "WRAY 16-84" 165.81613939134 -58.45724062091 "No*" +"PK 332-09 1" "CPD-56 8032" 257.2538659938558 -56.91329552292667 "PN" +"PK 328-01 1" "IRAS 15579-5445" 240.46192908968996 -54.89445465708 "PN" +"PK 017-01 1" "VSP 2-18" 276.80569999999994 -14.143199999999998 "PN" +"PK 014+04 1" "PN Sa 3-111" 270.27811308421957 -14.505914797064724 "PN" +"PK 006+04 1" "PN H 2-18" 265.86979884416746 -21.16433756736361 "PN" +"PK 093+05 1" "NGC 7008" 315.13674000000003 54.54316 "PN" +"PK 137+16 1" "NAME Camel Galaxy" 66.31916666666667 72.80666666666666 "LSB" +"PK 275-03 2" "WRAY 17-30" 141.13499097949 -54.78237246521 "LP?" +"PK 004-05 2" "EM* AS 294" 273.9429519728 -27.89616880391 "LP*" +"PK 334+03 1" "WRAY 16-206" 243.15614039667 -46.62691044901 "WR*" +"PK 309+00 2" "WRAY 16-136" 207.38567647081 -61.528408937710005 "WR*" +"PK 001+00 1" "[B61] 9" 266.47991765648993 -26.96967144746 "Em*" +"PK 346-04 1" "PN Sa 2-202" 262.29156368701 -42.54595497273001 "PN" +"PK 334+00 1" "PN Pe 2-9" 246.23905406028 -48.727822377219994 "Em*" +"PK 217+14 1" "PN A66 24" 117.90647315719 3.0058769117800006 "PN" +"PK 080-06 1" "V* V1610 Cyg" 315.576125 36.69361111111111 "pA*" +"PK 083-08 1" "PN G083.9-08.4" 320.5640586966 38.12089828899 "PN" +"PK 086-08 1" "PN Hu 1-2" 323.284627601 39.63598734132 "PN" +"PK 107-13 1" "PN Vy 2-3" 350.74126801609 46.89946483246 "PN" +"PK 078-02 1" "PN K 4-53" 310.5697666666667 37.67377222222222 "PN" +"PK 084-04 1" "PN K 3-80" 316.91531391691 40.96457261682 "PN" +"PK 100-08 1" "PN Me 2-2" 337.9319807425 47.80106579073 "PN" +"PK 099-08 1" "PN HDW 13" 337.64012499999995 47.52388888888889 "PN" +"PK 110-12 1" "PN K 1-20" 354.795175 48.20807500000001 "PN" +"PK 084-03 1" "NGC 7027" 316.75654979999996 42.236242000000004 "PN" +"PK 087-03 1" "PN We 2-245" 319.53095833333333 43.81274166666667 "PN" +"PK 089-05 1" "IC 5117" 323.129038 44.596539 "PN" +"PK 091-04 1" "PN K 3-84" 324.70417523717 46.00769269889 "PN" +"PK 104-06 1" "LS III +51 42" 342.9121548414 51.84512245399 "Em*" +"PK 112-10 1" "PN A66 84" 356.93355960171994 51.39921165369 "PN" +"PK 130-11 1" "PN M 1-1" 24.33067664078 50.46981779701 "PN" +"PK 144-15 1" "PN A66 4" 41.348548386749165 42.55127544112055 "PN" +"PK 079+00 1" "PN KjPn 4" 307.07175 40.33580555555556 "PN?" +"PK 078+00 1" "PN Sd 1" 307.32887916666664 40.25572222222222 "PN" +"PK 077+02 1" "PN Kj 2-1" 304.30179191825 39.763379949240004 "PN?" +"PK 089-00 1" "SH 1-89" 318.53178333333335 47.772825 "PN" +"PK 088-01 1" "NGC 7048" 318.5632820424063 46.288084395584995 "PN" +"PK 089-02 1" "PN M 1-77" 319.78070189449 46.31310018421 "PN" +"PK 093-02 1" "PN M 1-79" 324.25625 48.93406111111111 "PN" +"PK 095-02 1" "PN M 2-49" 325.8233333333333 50.42066666666666 "PN" +"PK 097-02 1" "PN G097.6-02.4" 329.42410270401 51.69424718793001 "PN" +"PK 100-05 1" "IC 5217" 335.98215839050994 50.96679565007 "PN" +"PK 108-05 1" "V* LL Cas" 347.33401898733 54.7472349393 "Mi*" +"PK 106-04 1" "PN K 3-86" 343.6884166666666 54.93369444444444 "PN" +"PK 113-06 1" "PN A66 83" 356.6946208333333 54.74380277777778 "PN" +"PK 119-06 1" "PN Hu 1-1" 7.064312499999999 55.965133333333334 "PN" +"PK 118-08 1" "PN Vy 1-1" 4.67572179064 53.87216072861 "PN" +"PK 124-07 1" "PN WeSb 1" 15.2254412139625 55.06667601543195 "PN" +"PK 130-10 1" "M 76" 25.58189905342 51.57542638057 "PN" +"PK 077+03 2" "PN KjPn 2" 303.84245833333335 40.579055555555556 "PN" +"PK 077+03 1" "EM* AS 389" 303.1000842725 40.75817686211 "Em*" +"PK 084+01 1" "PN K 4-55" 311.29175416666664 44.65405 "PN" +"PK 084+02 1" "PN K 4-54" 310.72201464935995 45.941978172469994 "LP*" +"PK 089+00 1" "NGC 7026" 316.57738475622 47.85188187105 "PN" +"PK 091+01 1" "PN G091.6+01.8" 317.71843750000005 50.78734166666666 "PN" +"PK 093-00 1" "PN K 3-82" 322.71448036426 50.002351604 "PN" +"PK 093+01 1" "IRAS 21190+5140" 320.1868333333333 51.89097222222223 "HII" +"PK 094-00 1" "PN K 3-83" 323.932639 50.90451000000001 "PN" +"PK 095+00 1" "PN K 3-62" 322.95910743763 52.56432549611 "PN" +"PK 102-02 1" "PN G102.9-02.3" 336.5719476793299 54.82729005508 "PN" +"PK 104-01 1" "PN M 2-53" 338.07383333333337 56.173922222222224 "PN" +"PK 107-02 2" "PN K 3-87" 343.77889481724 56.70861739018999 "PN" +"PK 107-02 1" "PN M 1-80" 344.08291099999997 57.155795999999995 "PN" +"PK 111-03 1" "PN We 2-260" 350.59583333333336 57.77333333333333 "PN?" +"PK 111-02 1" "PN Hb 12" 351.56176515686 58.18181758121 "PN" +"PK 114-04 1" "PN G114.0-04.6" 356.44895873241 57.06623417784 "PN" +"PK 120-05 1" "SH 2-176" 7.952499999999998 57.382880555555545 "PN" +"PK 120-05" "SH 2-176" 7.952499999999998 57.382880555555545 "PN" +"PK 122-04 1" "PN A66 2" 11.394491666666667 57.9596888888889 "PN" +"PK 133-08 1" "V* V471 Per" 29.706936066180003 52.89679522182 "EB*" +"PK 141-07 1" "PN A66 5" 43.06279583333333 50.59835 "PN" +"PK 147-09 1" "PN HaWe 3" 49.1418306267 46.89369369318 "PN?" +"PK 149-09 1" "PN HDW 3" 51.81422008625 45.40566411358001 "PN" +"PK 078+05 1" "PN Dd 1" 302.17949999999996 42.50310833333333 "PN" +"PK 079+06 1" "PN K 3-56" 301.73077083333334 44.23851388888889 "PN" +"PK 079+05 1" "PN M 4-17" 302.2580291666667 43.72876111111111 "PN" +"PK 086+05 1" "PN G086.1+05.4" 307.96826666666664 48.88051388888889 "PN" +"PK 085+04 1" "PN A66 71" 308.09673333333336 47.34733611111111 "PN" +"PK 088+04 1" "PN K 3-78" 311.34453576485 50.37773891281 "PN" +"PK 096+02 1" "PN K 3-61" 322.50315237460995 54.45755419742 "PN" +"PK 096+01 1" "PN K 4-45" 323.8377541666666 53.78644722222222 "Y*O" +"PK 098+02 1" "PN K 3-63" 324.7999 55.767761111111106 "PN" +"PK 104+00 1" "PN Bl 2-1" 335.06928 58.237934 "PN" +"PK 103+00 2" "PN M 2-52" 335.12676999999996 57.60545694444444 "PN" +"PK 103+00 1" "PN M 2-51" 334.0162083333333 57.47604166666667 "PN" +"PK 108+00 1" "PN K 3-85" 342.71823444588 59.50532057996999 "Em*" +"PK 107-00 1" "PN K 4-57" 342.14302157242 58.48563004118 "PN" +"PK 110-01 1" "PN WeSb 6" 348.26624999999996 59.29694444444444 "PN" +"PK 110-00 1" "V* V807 Cas" 348.05409618817 59.59975785935 "El*" +"PK 112-00 1" "PN KjPn 8" 351.04363333333333 60.95854166666667 "PN" +"PK 121-02 1" "PK 121-02 1" 9.675 60.266666666666666 "?" +"PK 128-04 1" "SH 2-188" 22.638241073129997 58.41397930163 "PN" +"PK 129-05 1" "PN G129.6-05.6" 25.024429166666664 56.58187222222222 "PN" +"PK 131-05 1" "PN G131.4-05.4" 28.264299999999995 56.40475277777777 "PN" +"PK 082+07 1" "NGC 6884" 302.59851032684 46.46100883178 "PN" +"PK 088+06 1" "LEDA 166684" 308.87021940212003 51.59094407294 "rG" +"PK 093+05 2" "NGC 7008" 315.13674000000003 54.54316 "PN" +"PK 092+05 1" "PN K 3-79" 313.30639583333334 53.7616 "PN" +"PK 098+04 1" "PN K 3-60" 321.860331 57.651714 "PN" +"PK 107+02 1" "NGC 7354" 340.08280569342 61.28576296827001 "PN" +"PK 116+00 1" "PN We 2-262" 358.07495234323886 62.53644949510759 "PN?" +"PK 119+00 1" "PN BV 1" 5.001874999999999 62.98421111111111 "PN" +"PK 121+00 1" "PN BV 2" 10.090058333333333 62.859522222222225 "PN" +"PK 127-01 1" "PN K 4-59" 22.637823085610002 60.52208267959 "Em*" +"PK 129-02 1" "PN G129.2-02.0" 25.658333333333335 60.162366666666664 "PN" +"PK 132-00 1" "IRAS 02044+6031" 32.02098147503 60.76683419508999 "Y*O" +"PK 084+09 1" "PN K 3-73" 300.9998041666667 49.318375 "PN" +"PK 095+07 1" "PN A66 73" 314.11263333333335 57.43418055555555 "PN" +"PK 114+03 1" "SH 2-167" 353.8767561974037 64.87192922990857 "HII" +"PK 113+05 1" "2MASS J23091627+6647306" 347.31784842815 66.79175103191 "Em*" +"PK 112+03 1" "PN K 3-88" 348.0645583333333 64.654925 "PN" +"PK 118+02 1" "SH 1-118" 1.8339073896500004 64.95590445082 "PN" +"PK 121+03 1" "PN G121.6+03.5" 9.725741666666666 66.39684166666667 "PN" +"PK 124+02 1" "PN G124.0+02.9" 15.601895800370002 65.77569236778 "PN" +"PK 126+03 1" "PN K 3-90" 21.24423347157 65.6433605957 "PN" +"PK 130+01 1" "IC 1747" 29.39870800127 63.32179092466 "PN" +"PK 147-02 1" "PN M 1-4" 55.43091307073 52.28340762551 "PN" +"PK 150-03" "PN IsWe 1" 57.27460565837 50.004138477219996 "PN" +"PK 150-03 1" "PN IsWe 1" 57.27460565837 50.004138477219996 "PN" +"PK 082+11 1" "NGC 6833" 297.44402811438 48.96114257691001 "PN" +"PK 083+12 1" "NGC 6826" 296.20062509412 50.52506917637 "PN" +"PK 101+08 1" "NGC 7076" 321.59808333333336 62.892174999999995 "PN" +"PK 104+07 1" "NGC 7139" 326.535775 63.791513888888886 "PN" +"PK 107+07 1" "PN G107.7+07.8" 333.34382235064 65.8987232333 "PN" +"PK 108+08" "PN G107.7+07.8" 333.34382235064 65.8987232333 "PN" +"PK 111+06 1" "PN KjPn 6" 342.25907188701 67.02729237217 "PN" +"PK 113+06 1" "PN KjPn 7" 346.9166666666667 66.98833333333333 "PN?" +"PK 119+06 1" "PN A66 1" 3.229166666666667 69.17333333333333 "PN" +"PK 129+04 1" "PN K 3-91" 29.651122883890004 66.5662492734 "PN" +"PK 130+03 1" "PN K 3-92" 30.92154583333333 64.96052222222222 "PN" +"PK 131+02 1" "PN A66 3" 33.02776467542 64.15064801706 "PN" +"PK 132+04 1" "PN K 3-93" 36.625062500000006 65.79808055555554 "PN" +"PK 138+02 1" "IC 289" 47.58042305376 61.316920423170004 "PN" +"PK 153-01 1" "PN K 3-65" 63.97720833333332 48.827805555555564 "PN" +"PK 077+14 1" "PN A66 61" 289.79251136779 46.24777050590999 "PN" +"PK 077+14" "PN A66 61" 289.79251136779 46.24777050590999 "PN" +"PK 110+12" "WD 2218+706" 334.89034444260994 70.93421743764 "WD*" +"PK 111+11 1" "WD 2218+706" 334.89034444260994 70.93421743764 "WD*" +"PK 114+10 1" "UGC 12261" 344.1612896 71.4792975 "AG?" +"PK 116+08 1" "PN M 2-55" 352.96961666666664 70.369475 "PN" +"PK 118+08 1" "PN M 2-56" 359.15168738598 70.80506850278 "pA*" +"PK 120+09 1" "NGC 40" 3.25423754052 72.5219537052 "PN" +"PK 118+08 2" "PN A66 86" 0.37905833333333333 70.7083138888889 "PN" +"PK 136+04 1" "PN A66 6" 44.674432769984584 64.50174334988388 "PN" +"PK 136+05" "PN HFG 1" 45.94587365126 64.9098660212 "PN" +"PK 136+05 1" "PN HFG 1" 45.94587365126 64.9098660212 "PN" +"PK 138+04 1" "PN HDW 2" 47.74525 62.79858333333333 "PN" +"PK 142+03 1" "PN K 3-94" 54.03369166666666 60.06285833333333 "PN" +"PK 151+00 1" "PN K 3-64" 63.3635625 51.850255555555556 "PN" +"PK 158+00 1" "SH 2-216" 70.83859926169 46.70162088691 "PN" +"PK 160-00 1" "PN G160.5-00.5" 71.67933333333333 44.46711111111111 "PN" +"PK 124+10 1" "PN HDW 1" 16.781763920849997 73.55651324428 "PN" +"PK 124+10 7" "PN HDW 1" 16.781763920849997 73.55651324428 "PN" +"PK 144+06 1" "NGC 1501" 61.74746704555 60.920632928340005 "PN" +"PK 147+04 1" "PN M 2-2" 63.312619352709994 56.94955772461 "PN" +"PK 149+04 1" "PN K 4-47" 65.18842461764 56.303365309259995 "PN" +"PK 078+18 1" "NGC 6742" 284.83345833333334 48.46534444444445 "PN" +"PK 146+07 1" "PN M 4-18" 66.46181506781 60.12021679075001 "PN" +"PK 117+18 1" "IC 1454" 340.60257999655 80.44201308472 "PN" +"PK 156+12 1" "PN HDW 4" 84.48431009241 55.53770865489 "PN" +"PK 094+27 1" "PN K 1-16" 275.46711951582 64.36483508114 "PN" +"PK 144+24 1" "EGB 4" 97.39150014745002 71.07677628155 "CV*" +"PK 158+17 1" "PN PuWe 1" 94.89142856127 55.61219653839 "PN" +"PK 153+22 1" "PN A66 16" 100.98090868597 61.79018253695 "PN" +"PK 075+35 1" "PN Sa 4-1" 258.45979638103 49.26972958016 "PN" +"PK 075+35" "PN Sa 4-1" 258.45979638103 49.26972958016 "PN" +"PK 076+36" "PN Sa 4-1" 258.45979638103 49.26972958016 "PN" +"PK 094+38 1" "EGB 7" 251.87362500000003 64.12488888888889 "PN?" +"PK 095+38" "EGB 7" 251.87362500000003 64.12488888888889 "PN?" +"PK 095+38 1" "EGB 7" 251.87362500000003 64.12488888888889 "PN?" +"PK 170+15" "NGC 2242" 98.53061791728 44.77716333248 "PN" +"PK 170+15 1" "NGC 2242" 98.53061791728 44.77716333248 "PN" +"PK 158+37 1" "PN A66 28" 130.39814568511 58.23010684998 "PN" +"PK 158+37" "PN A66 28" 130.39814568511 58.23010684998 "PN" +"PK 164+31 1" "PN ARO 121" 119.46507051555 53.42137513468 "PN" +"PK 148+57 1" "M 97" 168.69880122825 55.01902300891 "PN" +"PK 220-53 1" "NGC 1360" 53.31102855331001 -25.87166045775 "PN" +"PK 156-13 1" "PN HaWe 5" 56.36117156784 37.81450496333 "PN" +"PK 159-15 1" "IC 351" 56.88741935131 35.04684420203 "PN" +"PK 171-25 1" "PN Ba 1" 58.4022875 19.49406111111111 "PN" +"PK 161-14 1" "IC 2003" 59.09161841126999 33.87521110473 "PN" +"PK 165-15 1" "NGC 1514" 62.32077328068 30.775964141030002 "PN" +"PK 165-06 1" "PN K 3-67" 69.949701 36.761841000000004 "PN" +"PK 167-09 1" "PN K 3-66" 69.1551562981 33.65835408055 "PN" +"PK 174-14 1" "PN H 3-29" 69.34818750000001 25.04552777777778 "PN" +"PK 166-06 1" "RAFGL 618" 70.72343418025 36.11483358395 "pA*" +"PK 163-00 1" "PN G163.1-00.8" 73.62910000000001 42.27802777777778 "PN" +"PK 205-26 1" "PN MaC 2-1" 75.92438685913 -6.167507540489999 "PN" +"PK 215-30 1" "PN A66 7" 75.78138642496 -15.606311337320001 "PN" +"PK 243-37" "PN PRTM 1" 75.75721626934 -39.762368339169996 "PN" +"PK 167-00 1" "PN A66 8" 76.66007749112 39.13574117967999 "PN" +"PK 173-05 1" "LBN 809" 76.78790000000001 30.824480555555557 "RNe" +"PK 190-17 1" "Jonckheere 320" 76.39282407943 10.706367993930002 "PN" +"PK 169-00 1" "IC 2120" 79.537 37.53786 "HII" +"PK 172+00 1" "PN A66 9" 82.23625 36.05138888888889 "PN?" +"PK 178-02 1" "PN K 3-68" 82.89939999999999 28.97820833333333 "PN" +"PK 196-12 1" "PN A66 11" 84.33986234255 8.258134763910002 "G" +"PK 197-14 1" "PN K 1-7" 82.939575 6.933772222222222 "PN" +"PK 203-18 1" "PN MaC 2-2" 82.24166666666666 -0.6797222222222222 "PN?" +"PK 215-24 1" "IC 418" 81.86752480565 -12.69730063549 "PN" +"PK 170+04 1" "PN K 3-69" 85.34222145529 39.25219042097 "PN" +"PK 173+02 1" "SH 2-235 A" 85.22222083333334 35.70619166666667 "HII" +"PK 173+03 1" "PN G173.5+03.2" 85.64355416666668 36.15216388888889 "PN" +"PK 176+00 1" "NGC 1985" 84.44925943541195 31.98999821825503 "RNe" +"PK 184-02 1" "PN M 1-5" 86.70838331475 24.36745779151 "PN" +"PK 193-09 1" "PN H 3-75" 85.18738459848 12.35625503279 "PN" +"PK 196-10 1" "NGC 2022" 85.52579343888 9.08627388766 "PN" +"PK 204-16 1" "PN MaC 2-3" 84.56958333333333 0.24055555555555555 "PN?" +"PK 204-13 1" "EM* LkHA 316" 86.89901186267 0.64441820187 "TT*" +"PK 181+00 1" "PN Pu 1" 88.20189806504 28.09976554257 "PN" +"PK 181+01 1" "PN Pu 1" 88.20189806504 28.09976554257 "PN" +"PK 184+00 1" "PN K 3-70" 89.68897865747 25.31219734256 "PN" +"PK 193-04 1" "KLSS 1-5" 89.28320000000001 15.425352777777778 "PN" +"PK 197-06 1" "PN G197.4-06.4" 89.85361224947 10.69455882627 "PN" +"PK 197-06" "PN G197.4-06.4" 89.85361224947 10.69455882627 "PN" +"PK 228-22 1" "V* AB Lep" 88.77753750632 -22.900672858930005 "RS*" +"PK 197-03 1" "PN A66 14" 92.78606958434 11.77884012754 "PN" +"PK 198-06 1" "PN A66 12" 90.58352083333334 9.65391388888889 "PN" +"PK 204-08 1" "PN A66 13" 91.19956666666667 3.943266666666667 "PN" +"PK 243-25 1" "PN K 2-12" 90.5286355328 -37.4236686515 "PN?" +"PK 183+05 1" "PN G183.8+05.5" 94.04727916666667 28.36971388888889 "PN" +"PK 184+04 1" "PN K 3-71" 93.47909583333333 26.8825 "PN" +"PK 196-01 1" "LBN 196.21-01.17" 93.97726907402141 14.299084976119474 "HII" +"PK 197-02 2" "SH 2-272" 93.75000000000001 12.333333333333336 "HII" +"PK 197-02 1" "SH 2-271" 93.80154599671864 12.366580319979246 "HII" +"PK 201-04 1" "PN We 1-4" 93.64048333333332 7.574963888888889 "PN" +"PK 221-12 1" "IC 2165" 95.4282699181525 -12.987233610298889 "PN" +"PK 194+02 1" "PN VV 28" 96.48862934421 17.790871263379998 "PN" +"PK 204-03 1" "PN K 3-72" 95.97866666666665 5.503577777777777 "PN" +"PK 218-10 1" "PN HDW 5" 95.90480312901 -10.223235436079998 "PN" +"PK 219-10 1" "PN HDW 5" 95.90480312901 -10.223235436079998 "PN" +"PK 233-16 1" "PN A66 15" 96.75849339642 -25.38047222257 "PN" +"PK 239-18 1" "ESO 426-13" 96.88166666666666 -31.19527777777778 "G" +"PK 247-21 1" "PN K 2-13" 96.36958333333334 -39.86333333333334 "err" +"PK 249-22 1" "ESO 308-8" 96.48583333333333 -41.19027777777777 "?" +"PK 189+07 1" "PN M 1-7" 99.33716471335333 24.009852212519718 "PN" +"PK 192+07 1" "PN HDW 6" 100.0386625 21.413494444444442 "PN" +"PK 197+05 1" "PN G197.0+05.8" 100.85884549575002 16.81432962993 "PN" +"PK 201+02 1" "PN K 4-48" 99.982675 11.108427777777779 "PN" +"PK 210-00 2" "EM* MWC 819" 101.15695419668 1.32572547557 "Em*" +"PK 210-00 1" "EM* MWC 819" 101.15695419668 1.32572547557 "Em*" +"PK 211-03 1" "PN M 1-6" 98.93801711364002 -0.09372137738000001 "PN" +"PK 204+04 1" "PN K 2-2" 103.09652284929001 9.965492267059998 "PN" +"PK 204+04" "PN K 2-2" 103.09652284929001 9.965492267059998 "PN" +"PK 208+01 1" "PN K 4-50" 101.7673919327 4.6215839570199995 "PN" +"PK 210+01 1" "PN M 1-8" 103.3908125 3.140822222222222 "PN" +"PK 216-00 1" "PN A66 18" 104.06107916666667 -2.8855027777777775 "PN" +"PK 221-04 1" "PN A66 17" 102.15839648271 -9.5440968699 "PN?" +"PK 231-08 1" "MCG-03-18-004" 102.95139760617002 -20.24055005316 "G" +"PK 236-10 1" "PN HaWe 9" 103.58666816764293 -25.409342742053887 "PN" +"PK 239-12 1" "ESO 427-19" 103.80065416666666 -29.124255555555557 "PN" +"PK 200+08 1" "PN A66 19" 104.98511666666667 14.609436111111112 "PN" +"PK 210+03 1" "PN We 2-34" 105.11834583333335 4.3417666666666666 "PN" +"PK 212+04 1" "PN M 1-9" 106.3300006771 2.7831811593799993 "PN" +"PK 217-00 1" "PN MaC 1-1" 104.68484318314 -3.6861058677800003 "Ae?" +"PK 217+02 1" "PN St 3-1" 106.7121267177 -3.0858824040699995 "PN" +"PK 219+01 1" "PN K 1-9" 106.81502247911 -5.16874343454 "PN" +"PK 223-02 1" "PN K 1-8" 105.82208333333332 -10.58388888888889 "HII" +"PK 225-02 1" "PN Sa 2-4" 106.68670833333334 -11.755666666666668 "PN" +"PK 226-03 1" "PN PB 1" 105.69503750000001 -13.709372222222221 "PN" +"PK 234-06 1" "PN K 2-3" 106.73666666666665 -22.040555555555557 "PN" +"PK 233-08 1" "PN MaC 2-5" 105.20666666666668 -22.34861111111111 "?" +"PK 242-11 1" "PN M 3-1" 105.70793078762959 -31.59143410695444 "PN" +"PK 215+03 1" "NGC 2346" 107.34383991685002 -0.8065586103699999 "PN" +"PK 224+01 1" "PN We 1-6" 109.35851043560001 -10.17692763754 "PN" +"PK 225+00 1" "PN We 2-37" 109.03333333333335 -10.885 "PN" +"PK 229-02 1" "PN K 1-10" 108.14788750000001 -16.099919444444446 "PN" +"PK 232-04 1" "PN M 1-11" 107.81956200665 -19.85080513234 "PN" +"PK 240-07 1" "PN M 3-2" 108.70800965398001 -27.839787109900005 "PN" +"PK 241-07 1" "MCG-05-18-002" 109.13002590105002 -29.324689673990008 "Sy2" +"PK 247-10 1" "WRAY 17-2" 109.55583333333333 -34.912055555555554 "PN?" +"PK 248-12 1" "ESO 367-3" 107.58617491730001 -37.32087441427 "Sy2" +"PK 189+19 1" "NGC 2371" 111.39453497042 29.490675070019996 "PN" +"PK 197+17 1" "NGC 2392" 112.29486308254002 20.91179858002 "PN" +"PK 205+14 1" "PN A66 21" 112.26129027258001 13.24682987644 "PN" +"PK 214+07 1" "PN A66 20" 110.74030435369 1.7594284733799996 "PN" +"PK 219+07 1" "PN G219.2+07.5" 112.49364681618 -2.1104447385 "PN" +"PK 221+05 1" "PN M 3-3" 111.64261666666667 -5.364488888888888 "PN" +"PK 221+04 1" "MCG-01-19-001" 110.54534298257002 -5.9297009998600005 "AG?" +"PK 223+04 1" "MCG-01-19-002" 111.72340094742 -7.5476136163500005 "AG?" +"PK 233-00 1" "PN Sa 3-5" 112.10895541242 -17.96094194271 "*" +"PK 232-01 1" "PN M 1-13" 110.31265416666666 -18.142958333333333 "PN" +"PK 235-01 1" "PN M 1-14" 111.98545910321 -20.22295846818 "PN" +"PK 235-03 1" "PN M 1-12" 109.83945216185 -21.73205617454 "PN" +"PK 242-06 1" "WRAY 16-2" 111.05875 -28.991944444444446 "PN?" +"PK 244-06 2" "WRAY 17-5" 112.00874999999999 -30.758333333333333 "PN?" +"PK 244-06 1" "WRAY 16-3" 111.99499999999999 -30.701666666666664 "PN?" +"PK 245-08 1" "WRAY 17-3" 109.78083333333335 -32.58638888888889 "PN?" +"PK 248-08 1" "PN M 4-2" 112.22427040922 -35.75389890255 "PN" +"PK 247-08 1" "WRAY 17-4" 111.56666666666668 -34.95055555555556 "PN?" +"PK 215+11 1" "PN K 1-11" 114.03299165266002 2.7076511075900007 "PN" +"PK 226+05 1" "PN M 1-16" 114.32875804166667 -9.646654999999999 "PN" +"PK 228+05 1" "PN M 1-17" 115.09238514980001 -11.54160656699 "PN" +"PK 234-00 1" "SS73 6" 112.95354583333334 -19.45931111111111 "Be*" +"PK 235+01 1" "HD 62001" 115.30792878688999 -18.99372565914 "*" +"PK 238-01 1" "PN KW 8" 113.35414583333333 -23.435769444444446 "PN" +"PK 242-03 1" "ESO 429-4" 113.87333333333333 -28.152777777777775 "G" +"PK 244-04 1" "WRAY 17-7" 114.34333333333333 -30.12666666666667 "PN?" +"PK 231+04 1" "PN M 1-18" 115.51736250000002 -14.353686111111111 "PN" +"PK 232+05 1" "PN SaSt 2-3" 117.01530553448 -14.127895860300002 "PN" +"PK 231+04 2" "NGC 2438" 115.46049760579002 -14.73540837354 "PN" +"PK 234+02 1" "NGC 2440" 115.48060845833332 -18.208447694444445 "PN" +"PK 236+03 1" "PN K 1-12" 117.54834166666666 -19.304575 "PN" +"PK 235+04 1" "PN Y-C 40" 117.51183514718998 -17.86761731777 "PN?" +"PK 241+00 1" "ESO 493-13" 117.02791666666667 -25.231944444444444 "EmG" +"PK 243-01 1" "NGC 2452" 116.85943729381002 -27.335227772830002 "PN" +"PK 243-00 1" "WRAY 17-8" 117.41625 -27.593055555555555 "PN" +"PK 245-03 1" "ESO 429-17" 116.23091358703464 -30.30225696992085 "G" +"PK 246-04 1" "WRAY 16-6" 115.49499999999999 -31.774166666666666 "PN?" +"PK 247-04 1" "NAME FEGU 248-5" 115.59833333333336 -32.795833333333334 "PN" +"PK 248-04 1" "WRAY 16-7" 116.69541666666667 -33.43111111111111 "PN?" +"PK 249-05 1" "PN A66 23" 115.82493333333333 -34.75434444444445 "PN" +"PK 251-04 1" "ESO 369-1" 118.07583333333335 -36.44333333333333 "?" +"PK 211+18 1" "PN HDW 7" 118.79711244040003 9.55255041616 "PN" +"PK 241+02 1" "PN M 3-4" 118.79749211817999 -23.636835077649998 "PN" +"PK 245+01 1" "PN M 3-5" 120.62065112499998 -27.698610000000002 "PN" +"PK 252-04 1" "PN Sa 2-18" 118.2406205697 -36.73184028618 "PN?" +"PK 254-06 1" "ESO 311-18" 118.49175416666667 -39.82587222222222 "EmG" +"PK 211+22 1" "EGB 5" 122.80319079470999 10.954749829 "HS*" +"PK 212+23 1" "EGB 5" 122.80319079470999 10.954749829 "HS*" +"PK 224+15 1" "PN K 1-13" 121.6937546267 -2.876439274 "PN" +"PK 224+15" "PN K 1-13" 121.6937546267 -2.876439274 "PN" +"PK 238+07 2" "PN Sa 2-21" 122.18458333333332 -19.233888888888888 "PN" +"PK 238+07 1" "MCG-03-21-005" 122.30869780814 -18.695060483219997 "GiG" +"PK 240+07 1" "PN Y-C 2-5" 122.67350524977999 -20.52564150029 "PN" +"PK 246+02 1" "WRAY 16-13" 122.14708333333333 -27.6875 "PN?" +"PK 251-01 1" "PN K 1-21" 121.0591375 -34.2687 "PN" +"PK 250+00 1" "PN A66 26" 122.25685 -32.673586111111106 "PN" +"PK 252-00 1" "V* CP Pup" 122.9419308778 -35.35138513353 "No*" +"PK 245+05 1" "WRAY 17-16" 123.94041666666665 -25.97611111111111 "PN?" +"PK 251+01 1" "WRAY 17-17" 123.96875000000001 -33.26416666666667 "PN?" +"PK 254+00 1" "NGC 2579" 125.23041666666666 -36.223055555555554 "OpC" +"PK 239+13 1" "NGC 2610" 128.3475993403 -16.14938798211 "PN" +"PK 249+06 1" "EM* AS 201" 127.92867845070002 -27.75876209024 "PN" +"PK 248+08 1" "MCG-04-21-005" 129.06329166666666 -26.409349999999996 "AGN" +"PK 252+04 1" "PN K 1-1" 127.96930416666666 -32.10241388888889 "PN" +"PK 257+00 1" "PN VBRC 1" 127.72582083333334 -38.301938888888884 "PN" +"PK 255+03 1" "WRAY 16-22" 129.0685 -35.250388888888885 "PN" +"PK 208+33 1" "PN A66 30" 131.72276661453 17.87954705405 "PN" +"PK 214+31 1" "NGC 2661" 131.49822361508 12.619860660489998 "EmG" +"PK 244+12 1" "PN A66 29" 130.07884024198 -20.91017085962 "PN" +"PK 254+05 1" "PN M 3-6" 130.16760866182 -32.37599885811 "PN" +"PK 256+03 1" "WRAY 16-26" 130.31295833333334 -36.032916666666665 "PN?" +"PK 219+31 1" "PN A66 31" 133.55485047748 8.8980392975 "PN" +"PK 219+31" "PN A66 31" 133.55485047748 8.8980392975 "PN" +"PK 253+10 1" "PN K 1-2" 134.44150892198 -28.960160512909997 "PN" +"PK 002-52 1" "IC 5148" 329.89619389693 -39.38562028893 "PN" +"PK 237-65 1" "NAME Fornax PN" 39.955416666666665 -34.546388888888885 "PN" +"PK 036-57" "NGC 7293" 337.41060585298 -20.837152011779995 "PN" +"PK 036-57 1" "NGC 7293" 337.41060585298 -20.837152011779995 "PN" +"PK 037-34 1" "NGC 7009" 316.04506466152 -11.363494488210002 "PN" +"PK 108-76 1" "PN BoBn 1" 9.316791666666669 -13.716277777777778 "PN" +"PK 118-74 1" "NGC 246" 11.763925142340002 -11.871936423910004 "PN" +"PK 130-52 1" "EGGR 900" 17.777380315790005 10.360606425770001 "WD*" +"PK 116+08" "4C 08.06" 19.755309476958335 8.498528884194442 "BLL" +"PK 148-48 1" "EGB 2" 29.49619315278 10.94397200716 "PN?" +"PK 148-49 1" "EGB 2" 29.49619315278 10.94397200716 "PN?" +"PK 065-27 1" "PN Ps 1" 322.4974886089134 12.173965373259719 "PN" +"PK 065-27 2" "PK 065-27 2" 322.5 12.166666666666666 "?" +"PK 066-28 1" "NGC 7094" 324.22070306836997 12.78863868726 "PN" +"PK 125-47 1" "PG 0057+155" 14.986114041559999 15.737150079049997 "HS*" +"PK 202+14" "4C 15.05" 31.21005788724999 15.236401002694441 "Bla" +"PK 072-17 1" "PN A66 74" 319.2180885512199 24.1475264752 "PN" +"PK 072-17" "PN A66 74" 319.2180885512199 24.1475264752 "PN" +"PK 104-29 1" "PN Jn 1" 353.97217284945 30.46842687366999 "PN" +"PK 081-14 1" "PN A66 78" 323.87242344129993 31.695958110030002 "PN" +"PK 106-17 1" "NGC 7662" 351.47429949701046 42.53495439677222 "PN" +"PK 227+33 1" "PN A66 32" 139.10333333333332 3.8905555555555553 "?" +"PK 261+08 1" "NGC 2818A" 139.006208969 -36.62708788246 "PN" +"PK 238+34 1" "PN A66 33" 144.78809110247 -2.80846861074 "PN" +"PK 221+46 1" "EGB 6" 148.24577744798 13.742950806460001 "PN" +"PK 221+45 1" "IRC +10216" 146.989193 13.278768 "C*" +"PK 248+29 1" "PN A66 34" 146.39723783146 -13.171065319370001 "PN" +"PK 272+12 1" "NGC 3132" 151.75735684271 -40.43642515362001 "PN" +"PK 270+24 1" "PN K 1-28" 158.62758478375 -29.187559912819996 "PN" +"PK 283+25 1" "PN K 1-22" 171.6823630198745 -34.3697718807111 "PN" +"PK 291+19 1" "PN LoTr 4" 178.12190175201 -42.29415102793 "PN" +"PK 275+72 1" "PN K 2-4" 184.57708333333335 11.052222222222223 "PN?" +"PK 294+43 1" "NGC 4361" 186.12812938646996 -18.78487981564 "PN" +"PK 298+34 1" "PN G298.0+34.8" 188.30409233562 -27.814859653869995 "PN" +"PK 299+18 1" "PN K 1-23" 187.71907997550997 -44.23780733174 "PN" +"PK 339+88 1" "PN LoTr 5" 193.89061296183996 25.891822023899998 "PN" +"PK 303+40 1" "PN A66 35" 193.38660712712 -22.87293600714 "PN" +"PK 049+88 1" "PN H 4-1" 194.8657544583333 27.636294777777778 "PN" +"PK 315+59 1" "Z 16-38" 199.20906899888996 -3.06271293986 "Sy1" +"PK 308+25 6" "V* V1044 Cen" 199.00573231437997 -37.00299250376 "Sy*" +"PK 310+24 1" "PN Lo 8" 201.40626055577 -37.60409336207999 "PN" +"PK 318+41 1" "PN A66 36" 205.17227309606997 -19.88203467884 "PN" +"PK 312+25 1" "ESO 383-20" 203.51941056332 -36.84392350499 "EmG" +"PK 326+42 1" "IC 972" 211.10800195247998 -17.2279388701 "PN" +"PK 333+32 1" "MCG-04-35-008" 221.23720893349 -23.794368421410002 "Sy1" +"PK 341+05 1" "NGC 6153" 247.87737851855996 -40.25351283575001 "PN" +"PK 342+00 1" "PN H 1-3" 253.38054166666666 -42.65633333333333 "PN" +"PK 344+00 1" "PN H 1-5" 254.34897664491996 -41.63283784362999 "PN" +"PK 343-00 1" "PN HaTr 5" 255.36659999999998 -43.098644444444446 "PN" +"PK 344-01 1" "PN H 1-6" 256.7461782999 -42.68568693133 "PN" +"PK 343-01 1" "ESO 278-1" 256.4094920039189 -43.93840065759762 "PN" +"PK 345-01 1" "PN H 1-7" 257.61409300422 -41.88038681489001 "PN" +"PK 345-00 1" "RCW 117" 257.39166666666665 -41.60333333333333 "HII" +"PK 345-04 1" "PN Cn 1-3" 261.55131149173 -44.19042004791 "PN" +"PK 346-06 1" "PN Fg 2" 264.83275 -44.16041666666667 "PN" +"PK 346-08 1" "IC 4663" 266.36928961717 -44.90499642995999 "PN" +"PK 348-09 1" "WRAY 16-330" 269.1404583047 -43.0553154687 "PN" +"PK 349-10 1" "ESO 280-2" 271.13054042289 -43.39575998785 "EmG" +"PK 350-11 1" "V* Y CrA" 273.59562726169 -42.84231089187 "Sy*" +"PK 340+12 1" "PN Lo 11" 240.84254583333333 -36.014925000000005 "PN" +"PK 340+10 1" "PN Lo 12" 242.11054166666662 -37.145833333333336 "PN" +"PK 342+05 1" "WRAY 15-1518" 249.10266375152997 -39.86233059368 "Sy*" +"PK 343+03 1" "PN SuWt 3" 251.10052500000003 -40.055722222222215 "PN" +"PK 344+04 1" "Hen 2-178" 250.63955539241996 -38.91114994926 "PN" +"PK 344+02 1" "ESO 332-4" 252.88989583333333 -40.04889166666667 "PN" +"PK 344+03 1" "ESO 332-2" 252.386875 -39.35252777777778 "PN" +"PK 345+03 1" "PN Vd 4" 252.60562825986 -39.13863762586 "PN" +"PK 345+04 1" "ESO 332-1" 251.68809891206996 -38.61612080786 "PN" +"PK 345+03 2" "PN Vd 6" 253.61399999999998 -38.736250000000005 "PN" +"PK 345+00 1" "IC 4637" 256.29362499999996 -40.885472222222226 "PN" +"PK 348-00 1" "SH 2-4" 259.5995833333334 -39.31944444444445 "HII" +"PK 350-03 1" "PN H 1-26" 264.12457653874 -39.36575078986 "PN" +"PK 348-04 1" "PN H 1-21" 263.19921432933995 -40.9746258697 "PN" +"PK 349-04 1" "PN Lo 16" 263.92450219394 -40.19068928909 "PN" +"PK 349-03 1" "PN H 2-14" 263.08372083333336 -39.85711111111111 "PN" +"PK 350-05 1" "PN H 1-28" 265.72545833333334 -39.60688888888889 "PN" +"PK 352-09 1" "WRAY 16-376" 272.65647791734 -39.88737757472 "PN?" +"PK 351-10 2" "PN HaTr 9" 272.2454125 -41.81066388888888 "PN" +"PK 351-10 1" "WRAY 16-385" 273.2205959968 -41.50741604187 "PN" +"PK 353-12 1" "WRAY 16-411" 276.67377561377 -40.49805533676 "PN" +"PK 356-18 1" "ESO 337-4" 284.6022341021 -39.90607104244 "G" +"PK 358-21 1" "IC 1297" 289.347697995 -39.61284824052 "PN" +"PK 341+17 1" "ESO 450-16" 237.18022880129 -32.1197798027 "rG" +"PK 341+13 1" "NGC 6026" 240.33801450415 -34.54327397305 "PN" +"PK 343+11 1" "PN H 1-1" 243.36740369531003 -34.59427442877 "Em*" +"PK 343+11 9" "PN H 1-1" 243.36740369531003 -34.59427442877 "Em*" +"PK 342+10 1" "NGC 6072" 243.2431814107 -36.22983197394 "PN" +"PK 345+10 1" "ESO 390-5" 246.09699196737 -34.25186544608 "EmG" +"PK 346+08 1" "WRAY 16-226" 248.51767651918 -35.090761069020004 "Sy*" +"PK 345+06 1" "WRAY 16-229" 249.86711609068 -36.57128131081 "PN" +"PK 347+05 1" "PN H 1-2" 252.22544382591997 -35.78582011943 "PN" +"PK 347+03 1" "ESO 391-5" 254.36666666666667 -37.098333333333336 "PN" +"PK 347+01 1" "ESO 332-18" 256.1408091875673 -37.8874542478312 "PN" +"PK 349+01 1" "NGC 6302" 258.4354 -37.1031 "PN" +"PK 349-01 1" "NGC 6337" 260.56530058907 -38.48381544257 "PN" +"PK 351-01 1" "WRAY 16-286" 263.2527916666667 -36.73105555555556 "PN" +"PK 350-02 1" "PN H 1-22" 263.09229011602 -37.95658736562 "PN" +"PK 350-02 2" "WRAY 16-287" 263.58333333333337 -38.151944444444446 "PN" +"PK 352-04 1" "PN H 1-30" 266.2783333333333 -38.14713888888889 "PN" +"PK 351-05 1" "WRAY 16-304" 266.3780619953499 -38.66272389529 "Sy*" +"PK 351-04 1" "EM* AS 241" 266.3093149637 -38.29051113571 "Sy*" +"PK 353-04 1" "Hen 2-289" 267.45087820616 -37.0243882307 "Sy*" +"PK 353-05 1" "PN H 1-38" 267.6885 -37.39780555555556 "PN" +"PK 351-06 1" "PN H 1-37" 267.68566666666663 -39.290499999999994 "PN" +"PK 352-07 1" "PN Fg 3" 270.0492345622 -38.83128331339 "PN" +"PK 355-06 1" "PN M 3-21" 270.6347083333334 -36.65313888888889 "PN" +"PK 354-07 1" "PN H 1-52" 271.24006970711 -37.63540589951 "PN" +"PK 356-11 1" "PN Lo 17" 276.95798284952 -37.26442814823 "PN" +"PK 343+16 1" "ESO 451-3" 239.76458333333332 -31.196666666666665 "G" +"PK 342+15 1" "ESO 451-2" 239.69517648559 -32.0054299863 "Sy1" +"PK 343+15 1" "ESO 451-2" 239.69517648559 -32.0054299863 "Sy1" +"PK 345+15 1" "PN Lo 13" 242.44139102503 -30.918839196089994 "PN" +"PK 346+12 1" "PN K 1-3" 245.82920445325993 -31.749619062549996 "PN" +"PK 347+07 1" "ESO 391-2" 250.44375 -34.288333333333334 "?" +"PK 351+05 1" "PN M 2-5" 255.57953553896996 -33.16801199488 "PN" +"PK 349+04 1" "PN M 2-4" 255.27592923965 -34.82739188803 "PN" +"PK 348+04 1" "PN G348.9+04.6" 254.48798749999997 -35.41515 "PN" +"PK 351+04 1" "PN M 1-19" 255.94520499727997 -33.49567597981 "PN" +"PK 350+04 1" "PN H 2-1" 256.15105328259165 -33.988550427823334 "PN" +"PK 352+03 2" "PN H 1-8" 258.67887500000006 -33.41316666666666 "PN" +"PK 351+03 1" "EM* AS 217" 256.84056060443 -34.08734354467 "Sy*" +"PK 352+00 2" "WRAY 16-269" 261.1262499999999 -34.69833333333333 "PN?" +"PK 352-00 1" "PN H 1-13" 262.11491586384 -35.12544506418 "PN" +"PK 352+00 1" "PN H 1-12" 261.60124298303 -35.02816066206 "PN" +"PK 354-02 1" "WRAY 16-295" 265.15083333333337 -34.50944444444445 "PN?" +"PK 355-02 3" "PN H 1-32" 266.526365 -34.062870999999994 "PN" +"PK 355-02 4" "PN H 1-31" 266.3831973745499 -34.56522436111 "PN" +"PK 355-03 1" "PN H 1-33" 266.955901066662 -34.1347574114658 "PN" +"PK 355-02 2" "PN H 1-29" 266.0577880055771 -34.292471596282496 "WV*" +"PK 353-03 1" "PN G353.5-03.3" 265.7110416666667 -36.226444444444446 "PN?" +"PK 355-02 1" "PN M 3-14" 266.08591666666666 -34.11127777777778 "PN" +"PK 356-03 2" "PN H 2-27" 267.96070549268 -33.79342041502999 "PN" +"PK 356-03 1" "PN H 2-26" 267.4616666666667 -34.008472222222224 "PN" +"PK 355-04 1" "PN Hf 2-1" 267.80062083333337 -34.92341944444444 "PN" +"PK 355-03 3" "PN H 1-35" 267.30808269133 -34.38133682646 "PN" +"PK 355-03 2" "PN H 2-23" 267.24129166666665 -34.36508333333334 "PN" +"PK 357-04 3" "PN H 1-43" 269.56016611717996 -33.79378378942 "PN" +"PK 356-03 3" "PN H 1-39" 268.33758601332 -33.93290147698 "PN" +"PK 355-04 2" "PN M 1-30" 268.245625 -34.63961111111111 "PN" +"PK 356-04 2" "PN H 1-41" 269.32961874107 -34.16355128177 "PN" +"PK 356-04 1" "PN Cn 2-1" 268.6375416666666 -34.37254166666667 "PN" +"PK 356-06 1" "PN M 3-49" 270.6333333333334 -35.220555555555556 "PN" +"PK 356-05 2" "PN M 2-24" 270.51206077269 -34.46313199322 "PN" +"PK 356-05 1" "PN H 2-35" 270.0760791666666 -34.46091388888889 "PN" +"PK 357-06 1" "PN M 3-50" 271.0215958333333 -34.47705277777778 "PN" +"PK 356-07 2" "PN H 1-57" 272.4551666666666 -35.73708333333334 "PN" +"PK 356-06 2" "PN H 1-51" 271.1220833333333 -34.966944444444444 "PN" +"PK 356-07 1" "SV* HV 7199" 271.91666476415 -36.10590977482 "Sy*" +"PK 358-07 1" "NGC 6563" 273.01041666666663 -33.868611111111115 "PN" +"PK 003-17 1" "PN Hb 8" 286.3997438199 -33.19389221463 "PN" +"PK 005-18 1" "PN StWr 2-21" 288.597305 -32.571377000000005 "PN" +"PK 004-22 1" "Hen 2-436" 293.02795318187 -34.21597797911 "PN" +"PK 351+09 1" "PN PC 13" 252.57129166666664 -30.332083333333333 "PN" +"PK 351+07 1" "PN H 1-4" 253.40448516997998 -31.675870991730008 "PN" +"PK 353+06 2" "PN M 2-6" 256.076368 -30.891356 "PN" +"PK 353+06 1" "PN M 2-7" 256.3079583333333 -30.53880555555556 "PN" +"PK 352+05 1" "PN M 2-8" 256.3779166666667 -32.535583333333335 "PN" +"PK 354+04 1" "PN M 2-10" 258.52927750179 -31.32860656336999 "PN" +"PK 352+03 1" "EM* AS 221" 258.05359351734 -32.629651971250006 "Sy*" +"PK 354+04 4" "PN G354.6+04.9" 258.22307916666665 -30.668250000000004 "PN" +"PK 352+04 1" "WRAY 16-255" 257.5572166666667 -32.98078611111111 "Em*" +"PK 354+04 2" "WRAY 15-1655" 258.83258939252 -31.564831331579995 "Sy*" +"PK 356+02 1" "PN Th 3-13" 261.33070423315 -30.678355451619996 "PN" +"PK 355+02 3" "PN Th 3-11" 261.1097083333333 -31.722166666666666 "PN" +"PK 355+02 2" "PN Th 3-10" 261.1704166666667 -30.866555555555557 "PN" +"PK 355+03 3" "PN Th 3-6" 259.8343436222 -31.21134707454 "PN" +"PK 354+03 1" "PN Th 3-4" 259.71640821037994 -31.651841920450003 "PN" +"PK 354+02 1" "PN Th 3-8" 260.64699166666674 -32.23438055555555 "PN?" +"PK 355+03 1" "PN Th 3-5" 259.7638916666666 -30.898322222222223 "PN" +"PK 353+02 1" "IRAS 17164-3226" 259.9200911000621 -32.49797558594528 "PN" +"PK 355+02 1" "PN Th 3-9" 260.99688285856996 -31.030970641239996 "Em*" +"PK 356+01 2" "PN Th 3-55" 262.74515833333334 -31.018258333333332 "PN" +"PK 355-00 1" "MR 74" 264.0828970906899 -33.43674218454001 "WR*" +"PK 356-00 1" "PN Th 3-34" 264.43704124335 -32.25830087328999 "PN" +"PK 355-01 1" "PN RPZM 30" 265.1270833333333 -33.49916666666667 "PN" +"PK 358-01 1" "PN Bl D" 266.51149999999996 -31.060750000000002 "PN" +"PK 357-02 1" "PN Al 2-M" 266.94740319349 -32.34768438451 "*" +"PK 357-01 1" "WRAY 16-298" 266.0404166666667 -32.028888888888886 "PN?" +"PK 356-02 2" "PN M 1-27" 266.68948158482 -33.14309269776 "WR?" +"PK 356-02 1" "PN H 2-21" 266.86477500000007 -32.83345277777778 "PN?" +"PK 358-01 2" "WRAY 16-312" 267.56941666666665 -30.95961111111111 "Sy*" +"PK 357-03 1" "WRAY 16-318" 267.94051321613995 -32.91436890103 "Sy*" +"PK 356-03 4" "ESO 393-33" 267.45 -33.535 "?" +"PK 358-02 3" "PN MaC 1-7" 267.84674935907 -31.22957281696 "Em*" +"PK 358-02 4" "PN Al 2-O" 267.9387109981371 -32.051107134851385 "PN" +"PK 358-02 1" "PN M 4-7" 267.93609583333335 -31.600050000000003 "PN" +"PK 359-04 1" "PN M 3-48" 269.9867916666667 -31.907805555555555 "PN" +"PK 359-03 2" "PN H 2-33" 269.55228728759994 -31.13510406186001 "PN" +"PK 359-03 1" "PN M 3-17" 269.106875 -31.071444444444445 "PN" +"PK 359-02 4" "PN M 3-46" 268.7735416666667 -31.204555555555554 "PN" +"PK 358-03 3" "PN MaC 1-8" 269.00997499999994 -31.640772222222218 "*" +"PK 358-03 1" "PN H 1-44" 269.54435984744 -31.715550023919995 "EB*" +"PK 358-02 5" "OGLE BLG-LPV-102396" 268.40194028758 -31.423845055380003 "LP*" +"PK 358-02 2" "PN Bl 3-6" 268.2346334996 -31.32177188778 "Sy*" +"PK 358-04 2" "WRAY 16-344" 269.97915826843996 -32.98661080314 "PN" +"PK 358-04 1" "PN H 1-46" 269.76042975295 -32.36208186071 "PN" +"PK 358-03 2" "PN H 2-30" 269.05930416666666 -32.622083333333336 "PN" +"PK 357-04 2" "PN M 2-22" 269.63575000000003 -33.47688888888889 "PN" +"PK 357-04 1" "PN H 1-42" 269.3548833716191 -33.5953144973977 "PN" +"PK 357-03 2" "PN M 2-16" 268.1432083333333 -32.76427777777778 "PN" +"PK 357-03 3" "PN H 2-29" 268.3200965378799 -32.67736144445 "PN" +"PK 357-03 4" "PN M 2-18" 268.4077083333333 -32.97994444444444 "PN" +"PK 357-04 4" "WRAY 17-104" 269.6079583333333 -33.08330555555556 "PN" +"PK 359-04 3" "PN M 2-25" 270.69375 -32.158055555555556 "PN" +"PK 358-05 1" "PN Pe 1-11" 270.4286929189 -33.25786510345001 "PN" +"PK 357-05 1" "PN M 1-34" 270.34226384896203 -33.29591074279167 "PN" +"PK 359-04" "PN KFL 3" 270.72054583333335 -31.399580555555556 "PN" +"PK 359-04 2" "PN M 2-27" 270.96904932673 -31.296433832340007 "PN" +"PK 359-04 4" "PN H 2-36" 271.0323333333333 -31.653166666666664 "PN" +"PK 000-05 1" "PN H 2-40" 272.12816666666663 -31.609805555555557 "PN" +"PK 000-04 3" "WRAY 16-363" 271.18362499999995 -31.0465 "PN" +"PK 000-04 1" "PN M 2-28" 271.26137499999993 -30.971666666666664 "PN" +"PK 358-06 1" "EM* AS 280" 272.46795862092995 -33.33053480561 "Sy*" +"PK 358-05 4" "PN M 3-51" 271.2341666666666 -32.900555555555556 "PN" +"PK 358-05 3" "PN H 1-50" 270.97295123123996 -32.69500418573 "PN" +"PK 358-05 2" "EM* AS 269" 270.849833 -32.706928000000005 "Sy*" +"PK 359-05" "PN KFL 9" 271.8307541666667 -31.715819444444442 "PN" +"PK 000-05 2" "PN SB 2" 272.14458333333334 -31.114444444444445 "PN" +"PK 359-06 1" "PN H 1-62" 273.32483487062996 -32.32858479913 "PN" +"PK 000-06 1" "ESO 456-73" 273.15708333333333 -32.099722222222226 "?" +"PK 000-07 1" "PN M 2-35" 274.405 -31.946333333333335 "PN" +"PK 000-07 2" "PN H 2-46" 274.65605433465 -31.912591903100008 "PN" +"PK 359-07 1" "PN M 2-32" 273.71085793521996 -32.61532180390999 "PN" +"PK 002-09 1" "PN Cn 1-5" 277.29854208203 -31.499759780110004 "PN" +"PK 004-11 1" "PN M 3-29" 279.85757610389 -30.67700632382 "PN" +"PK 003-14 1" "PN Hb 7" 283.90751556799 -32.26348711427 "PN" +"PK 006-19 1" "WRAY 16-423" 290.54429166666665 -31.51075 "PN" +"PK 009-21 1" "MCG-05-46-002" 293.08402007854 -29.38592929228 "EmG" +"PK 339+29 1" "PN Y-C 2-17" 227.08639505836996 -23.24735398219 "PN?" +"PK 342+27 1" "PN Me 2-1" 230.58033824731004 -23.625392333639997 "PN" +"PK 346+22 1" "WRAY 17-71" 237.47583333333333 -24.42555555555556 "?" +"PK 346+19 1" "ESO 515-19" 239.995 -27.238611111111112 "G" +"PK 352+11 1" "ESO 452-12" 250.40833333333333 -27.97833333333333 "PN?" +"PK 352+11 2" "PN K 2-16" 251.20438434660997 -28.06797403175 "PN" +"PK 353+08 1" "PN MyCn 26" 253.94703373037999 -29.838504016260003 "PN" +"PK 356+05 1" "PN Th 3-3" 259.33554583333336 -28.991566666666667 "PN" +"PK 355+04 1" "PN Sa 3-43" 259.48242012934 -30.02848483844 "Sy*" +"PK 358+04 1" "PN M 3-8" 261.21729166666665 -28.098499999999998 "PN" +"PK 357+03 2" "PN M 3-41" 261.49925 -29.364 "PN" +"PK 357+03 1" "PN M 3-7" 261.1435541069 -29.405498955570003 "PN" +"PK 357+04 1" "PN H 2-7" 260.8539 -28.98501388888889 "PN" +"PK 356+03 1" "PN Th 3-12" 261.2755274912421 -29.75472190475277 "PN" +"PK 356+04 3" "PN Th 3-7" 260.26056448838995 -29.381331929619996 "Sy*" +"PK 356+04 2" "PN M 3-38" 260.26862460438997 -29.049916728809993 "PN" +"PK 355+03 2" "PN H 1-9" 260.38296409440125 -30.34683557186362 "PN" +"PK 356+04 1" "PN M 2-11" 260.13862499999993 -29.01086111111111 "PN" +"PK 357+03 3" "PN Th 3-17" 261.8818068349 -29.049021382860005 "Sy*" +"PK 358+03 5" "PN Th 3-18" 262.11220555876 -28.642954879890002 "Sy*" +"PK 358+03 3" "PN Th 3-19" 262.1741819622208 -28.45547788221222 "PN" +"PK 358+03 9" "PN Al 2-B" 261.94637358884995 -28.184276555559997 "PN" +"PK 358+03 2" "PN H 2-10" 261.88691666666665 -28.518583333333332 "PN" +"PK 358+03 1" "PN M 3-10" 261.83412500000003 -28.464222222222222 "PN" +"PK 357+02 3" "PN Th 3-20" 262.27584415311 -29.72155577676 "Sy*" +"PK 357+02 2" "ESO 455-1" 262.2791666666667 -29.231666666666666 "?" +"PK 357+02 1" "ESO 454-35" 262.19999999999993 -29.095 "?" +"PK 357+03 5" "PN Th 3-16" 261.85151666666667 -29.35403611111111 "PN?" +"PK 357+03 4" "PN M 3-42" 261.74937500000004 -29.258916666666668 "PN" +"PK 357+02 5" "PN M 4-4" 262.20957396344 -30.12916605284 "PN" +"PK 359+02 7" "PN Al 2-K" 264.059075 -28.012869444444444 "PN" +"PK 358+03 4" "PN H 1-19" 262.51070833333335 -27.988194444444446 "PN" +"PK 357+02 4" "PN H 1-18" 262.42816666666664 -29.547305555555557 "PN" +"PK 358+01 1" "PN M 4-6" 263.80829166666666 -29.052944444444442 "PN" +"PK 359+02 5" "PN Al 2-G" 263.09406982726 -28.241344978280004 "PN" +"PK 359+02 4" "PN Th 3-32" 263.81441005879 -28.11738148737 "Be*" +"PK 359+02 2" "ESO 455-17" 263.30833333333334 -28.33833333333333 "?" +"PK 359+02 1" "PN Th 3-30" 263.43076330810993 -28.122520238170004 "Sy*" +"PK 358+01 4" "PN Bl B" 264.24931666666674 -29.669147222222225 "PN" +"PK 358+01 3" "PN H 1-25" 263.84266418039 -29.75553007888 "Sy*" +"PK 358+01 2" "PN Th 3-31" 263.57002672091 -29.4866938699 "Sy*" +"PK 358+02 4" "PN Al 2-F" 262.62683333333337 -28.598583333333334 "PN" +"PK 358+02 3" "PN Th 3-29" 263.1161958333334 -29.085766666666665 "Sy*" +"PK 358+02 2" "PN Th 3-23" 262.58899999999994 -29.170194444444448 "PN" +"PK 358+02 1" "ESO 455-14" 262.80583333333334 -28.389166666666664 "?" +"PK 358+03 7" "PN H 1-17" 262.41914012244 -28.67287047406 "PN" +"PK 358+03 6" "PN H 1-20" 262.68253852918997 -28.06856700048001 "PN" +"PK 357+02 8" "PN Al 2-D" 262.36565443368 -29.785746509319996 "*" +"PK 358+02 5" "PN HDW 8" 262.94708333333335 -28.700972222222216 "PN" +"PK 357+01 3" "PN TrBr 4" 263.9310541666666 -30.35733888888889 "PN" +"PK 357+01 2" "PN Al 2-H" 263.3204416666667 -30.441872222222223 "PN" +"PK 357+02 7" "PN Th 3-24" 262.713975 -30.28680277777778 "PN" +"PK 357+02 6" "PN H 2-13" 262.7837916666666 -30.17452777777778 "PN" +"PK 356+01 1" "PN Th 3-21" 262.49926228709 -30.640680003070006 "*" +"PK 358+03 8" "PN Th 3-26" 262.78875 -28.247333333333334 "PN" +"PK 357+01 1" "PN H 1-23" 263.19550000000004 -30.00413888888889 "PN" +"PK 359+01 2" "PN Th 3-36" 264.8364145081699 -28.78366071920999 "LP?" +"PK 359+01 3" "ESO 455-139" 264.76215494231997 -28.943231748169996 "PN" +"PK 359+01 1" "PN Th 3-35" 264.6760152696125 -28.712836438905835 "PN" +"PK 000-00 2" "PN Bl 3-22" 266.73940045836997 -29.01168102753 "Em*" +"PK 359-00 1" "PN Hb 5" 266.9841666666667 -29.994333333333334 "PN" +"PK 358-00 2" "PN M 1-26" 266.49028050596996 -30.200212848099998 "PN" +"PK 358-00 1" "PN Bl 3-5" 265.58203781488 -30.448587864300002 "*" +"PK 000-00 1" "LBN 3" 266.78333333333336 -28.775 "HII" +"PK 359-01 2" "PN M 3-44" 267.82884604408 -30.398104670549998 "PN" +"PK 359-01 1" "PN M 1-29" 267.5748575606836 -30.581941078115 "PN" +"PK 000-01 1" "PN M 3-43" 267.60141666666664 -29.421805555555554 "PN" +"PK 002-02 2" "PN M 3-20" 269.83062500000005 -28.230055555555552 "PN" +"PK 002-02 1" "PN H 1-45" 269.59110951517994 -28.24783197018 "Mi*" +"PK 001-02 2" "PN Sa 3-104" 269.60796815625656 -29.346801015710838 "Sy*" +"PK 001-02 1" "PN H 2-34" 269.6168131544599 -28.561671866100003 "Sy*" +"PK 001-01 4" "PN Sa 3-92" 268.71692499999995 -28.815372222222223 "PN" +"PK 001-01 3" "PN H 2-31" 269.0097916666667 -28.23648888888889 "PN" +"PK 001-01 2" "PN Bl Q" 268.64569195281996 -28.2119879255 "PN" +"PK 001-01 1" "PN Bl M" 268.446325 -28.454752777777777 "PN" +"PK 000-02 6" "PN M 3-19" 269.5806666666666 -30.010916666666667 "PN" +"PK 000-02 4" "PN M 2-21" 269.53991666666667 -29.738916666666668 "PN" +"PK 000-02 2" "PN Bl 3-10" 268.83557083333335 -29.960036111111112 "PN" +"PK 000-02 1" "PN Bl 3-13" 269.01161467917996 -29.187931166639995 "PN" +"PK 000-01 7" "PN Al 2-Q" 268.3543333333333 -29.285758333333334 "PN" +"PK 000-01 6" "PN M 2-20" 268.60549999999995 -29.60227777777778 "PN" +"PK 000-01 5" "PN M 2-19" 268.44020221564995 -29.729715381629997 "PN" +"PK 000-01 2" "PN Bl 3-15" 268.14945833333337 -29.110722222222222 "PN" +"PK 359-02 3" "PN H 1-40" 268.90022737445 -30.55898869366 "PN" +"PK 359-02 2" "PN M 3-16" 268.19186317635 -30.826394740500003 "PN" +"PK 359-02 1" "PN Bl L" 268.30741339228996 -30.301591630180003 "LP*" +"PK 359-01 3" "PN M 3-45" 268.0248333333334 -30.08722222222222 "PN" +"PK 000-02 5" "PN M 3-47" 269.43069583333335 -30.041641666666667 "PN" +"PK 000-03 2" "PN KFL 1" 269.8149375 -30.04643055555556 "PN" +"PK 000-02 3" "PN H 2-32" 269.10138588100995 -29.635205814490003 "PN" +"PK 000-01 4" "PN Bl 3-14" 268.10808749999995 -29.76583611111111 "LP*" +"PK 000-01 3" "PN Bl O" 268.45723622233993 -28.98653725375 "PN" +"PK 001-03 1" "PN H 1-47" 270.15675083953 -29.36406628479 "PN" +"PK 002-02 4" "PN M 2-23" 270.42767210451 -28.428921470389998 "PN" +"PK 001-03 2" "HD 316989" 270.37603623499 -29.32489194664 "Be*" +"PK 001-03 3" "PN ShWi 1" 270.60770833333333 -29.418166666666668 "PN" +"PK 358-03 4" "PN ShWi 1" 270.60770833333333 -29.418166666666668 "PN" +"PK 358-03 5" "PN ShWi 2" 270.76423919551 -29.771219751209998 "PN?" +"PK 001-03 4" "PN ShWi 2" 270.76423919551 -29.771219751209998 "PN?" +"PK 000-03 1" "PN M 3-22" 270.5803162916667 -30.24061836111111 "PN" +"PK 002-02" "PN KFL 2" 270.24969230622 -28.272146094100002 "PN" +"PK 001-04 1" "PN H 1-55" 271.81066302577 -29.69018113915 "PN" +"PK 001-04 2" "PN H 1-56" 271.97451751287 -29.742871891879997 "PN" +"PK 002-03 3" "PN M 1-37" 271.35753870875 -28.367856247210003 "PN" +"PK 002-03 5" "PN M 1-38" 271.5239166666667 -28.675 "PN" +"PK 002-04 1" "PN H 1-54" 271.78033052539 -29.21832577369 "PN" +"PK 003-04 6" "EM* AS 282" 272.75703400237 -28.54454471503 "Sy*" +"PK 003-04 2" "PN Ap 1-9" 272.62053347878 -28.1280665824 "LP*" +"PK 002-04 2" "PN M 1-42" 272.77079166666664 -28.983083333333333 "PN" +"PK 002-03 7" "WRAY 17-107" 271.0229166666667 -28.46472222222222 "PN" +"PK 002-03 6" "PN H 2-39" 272.02399583333334 -28.436249999999998 "PN" +"PK 002-03 4" "Haro 3-38" 271.50477054226 -28.284502370720002 "Mi*" +"PK 002-03 2" "PN H 2-37" 271.12030833333336 -28.62626388888889 "PN" +"PK 002-03 1" "ESO 456-47" 271.12416666666667 -28.35777777777778 "Em*" +"PK 358-03 6" "PN ShWi 3" 270.82273742302 -29.84522173541 "PN?" +"PK 358-03 7" "PN ShWi 4" 270.9119278686 -29.76282245974 "PN?" +"PK 001-03 6" "PN ShWi 4" 270.9119278686 -29.76282245974 "PN?" +"PK 358-03 9" "PN ShWi 6" 270.9923791666667 -29.44918055555556 "PN?" +"PK 001-03 8" "PN ShWi 6" 270.9923791666667 -29.44918055555556 "PN?" +"PK 001-04 3" "PN KFL 8" 271.77305045246 -29.608290737260003 "Sy*" +"PK 003-04" "PN KFL 12" 272.6283625 -28.323030555555555 "PN" +"PK 358-03 8" "PN ShWi 5" 270.9737132906499 -29.856146828900002 "Sy*" +"PK 001-03 7" "PN ShWi 5" 270.9737132906499 -29.856146828900002 "Sy*" +"PK 000-04 2" "PN M 3-23" 271.77566666666667 -30.571611111111114 "PN" +"PK 003-04 9" "PN H 2-43" 273.19994300367 -28.33326158387 "PN" +"PK 003-04 7" "EM* AS 283" 272.8962529052292 -28.376868305475558 "PN" +"PK 002-05" "PN KFL 14" 273.2546083333333 -29.420997222222223 "PN" +"PK 003-04 5" "NGC 6565" 272.96869093037 -28.178450344790004 "PN" +"PK 004-05 5" "PN M 2-37" 274.6604208333333 -28.13376388888889 "PN" +"PK 004-05 4" "PN K 2-9" 274.67083333333335 -28.156666666666666 "?" +"PK 004-05 3" "PN Pe 1-12" 274.42657916666667 -28.28716666666667 "PN" +"PK 002-05 1" "EM* AS 293" 273.6438396514392 -29.823292906709174 "Sy*" +"PK 003-06 1" "PN M 2-36" 274.422625 -29.13886111111111 "PN" +"PK 001-06 2" "PN SwSt 1" 274.05118087682 -30.868862938609997 "PN" +"PK 002-06 1" "PN M 2-33" 273.77734763655 -30.259240336550004 "PN" +"PK 002-06 2" "PN H 1-63" 274.0806004569 -30.126685535149996 "PN" +"PK 001-06 1" "HD 319167" 273.85280352835 -30.53203817386 "Sy*" +"PK 002-07 1" "PN M 2-41" 275.64374999999995 -30.725277777777777 "PN" +"PK 003-07" "PN KFL 19" 275.78704166666665 -29.72365833333333 "PN" +"PK 005-08 1" "PN Hf 2-2" 278.12875663253 -28.72229891842001 "PN" +"PK 004-11 2" "WRAY 16-417" 281.06083310022996 -30.327052528200003 "PN" +"PK 014-25 1" "PN HDW 12" 299.55451236540995 -26.47115863128 "PN" +"PK 355+11 1" "EM* AS 210" 252.83501956015 -26.007450741789995 "Sy*" +"PK 358+09 1" "PN Th 3-1" 256.43549999999993 -25.417147222222223 "PN" +"PK 358+07 1" "PN M 3-36" 258.1631880863599 -25.72708399979 "PN" +"PK 357+07 1" "PN M 4-3" 257.67408091351 -27.14557739964 "PN" +"PK 359+05 1" "PN M 2-12" 261.0061463436 -25.98980091218 "PN" +"PK 359+04 1" "PN Th 3-14" 261.43367822672 -26.963314976470006 "PN" +"PK 359+05 2" "PN M 3-9" 261.43071669298 -26.19872429115 "PN" +"PK 358+05 2" "PN M 3-40" 260.61787713114 -27.145102582 "PN" +"PK 358+05 1" "PN M 3-39" 260.29705499999994 -27.19362688888889 "PN" +"PK 357+04" "PK 357+04" 259.6023333333334 -26.371944444444445 "PN?" +"PK 359+06 1" "PN M 3-37" 259.80577500000004 -25.288208333333337 "PN" +"PK 358+04 2" "PN Th 3-15" 261.79417534424 -27.733004800929997 "PN" +"PK 000+04 1" "PN H 2-11" 262.35817144938 -25.818668119379996 "PN" +"PK 000+03 1" "PN M 4-5" 263.728 -26.599249999999998 "PN" +"PK 359+02 3" "PN Th 3-33" 263.95051249999995 -27.722327777777778 "PN" +"PK 359+03 5" "PN Al 2-E" 262.5601514991299 -27.505662527150005 "PN" +"PK 359+03 4" "PN Al 2-E" 262.5601514991299 -27.505662527150005 "PN" +"PK 359+03 3" "ESO 520-7" 263.0291666666667 -27.073333333333334 "?" +"PK 000+04 2" "PN H 1-16" 262.3476201277062 -26.4349372196228 "PN" +"PK 359+02 6" "PN Al 2-I" 263.5575791666667 -27.93359722222222 "PN" +"PK 000+02 1" "PN Al 2-J" 263.89792916666664 -27.401802777777775 "PN" +"PK 000+04 3" "PN K 5-1" 262.46817802264997 -26.18711442914 "PN" +"PK 359+03 2" "PN Th 3-25" 262.69504166666667 -27.099444444444444 "PN" +"PK 359+03 1" "PN Th 3-28" 262.73668669992 -26.986367559499996 "WR*" +"PK 001+01 1" "PN K 1-4" 265.11466666666666 -27.017249999999997 "PN" +"PK 000+02 2" "ESO 520-13" 264.8458333333333 -27.265 "?" +"PK 001+02 1" "WRAY 17-94" 265.05350000000004 -26.739416666666667 "PN" +"PK 002+01 1" "PN H 2-20" 266.415875 -25.66675 "PN" +"PK 001-00 1" "HD 316285" 267.05848838298 -28.01475590822 "s*b" +"PK 002+02 2" "Terz N 1580" 265.9143416666667 -25.611808333333336 "PN" +"PK 001-00 2" "PN Bl 3-3" 267.3835625 -27.767038888888887 "*" +"PK 002-01 1" "PN Pe 2-11" 269.6302916666666 -27.61827777777778 "PN" +"PK 003-01 1" "Hen 2-325" 270.27625250539 -26.35724931193 "Em*" +"PK 002-02 3" "PN Pe 2-12" 270.29277722079 -27.63881678275 "PN" +"PK 003-02" "PN KFL 4" 270.71529166666676 -27.683222222222224 "PN" +"PK 005-02 1" "PN M 3-24" 271.9746666666667 -25.40075 "PN" +"PK 005-03 1" "PN H 1-58" 272.30767675228 -26.04134878659 "PN" +"PK 004-02 1" "PN H 1-53" 271.4893194177116 -26.495042670839446 "PN" +"PK 003-04 10" "ESO 456-64" 272.6379166666667 -27.84722222222222 "?" +"PK 003-04 1" "EM* AS 281" 272.68276078854 -27.96391796868 "Sy*" +"PK 003-03 1" "PN Sa 3-119" 271.62619591672 -27.73985851421 "LP*" +"PK 003-02 2" "PN M 2-26" 270.79966666666667 -26.97533333333333 "PN" +"PK 003-02 1" "PN M 1-35" 270.91375 -26.72608333333333 "PN" +"PK 003-02 3" "IC 4673" 270.82691080221 -27.106309879119998 "PN" +"PK 003-03" "PN KFL 7" 271.7081541666667 -27.104469444444447 "PN" +"PK 004-03 B" "PN KFL 11" 272.5510166666667 -27.27638888888889 "PN" +"PK 004-03 1" "PN M 2-29" 271.6704396715 -26.91565993565 "PN" +"PK 004-03 A" "PN KFL 10" 272.0054666666667 -26.900422222222222 "PN" +"PK 005-03" "PN KFL 13" 273.18783033324996 -25.74009623124 "PN" +"PK 005-04 1" "PN H 2-44" 273.41854166666667 -26.14397222222222 "PN" +"PK 005-03 2" "PN H 2-42" 273.0968958333333 -26.548338888888892 "PN" +"PK 004-04 1" "PN H 1-60" 273.1050833333333 -27.486888888888892 "PN" +"PK 003-04 8" "PN M 2-30" 273.1433333333333 -27.96958333333333 "PN" +"PK 003-04 3" "PN H 1-59" 272.8719291666667 -27.771024999999998 "PN" +"PK 006-03 3" "PN M 2-31" 273.31688392999 -25.501478033509997 "PN" +"PK 006-03" "PN KFL 15" 273.58051666666665 -25.347561111111112 "PN" +"PK 003-04 4" "PN H 2-41" 273.0990208333333 -27.870516666666667 "PN" +"PK 006-04 1" "PN Pe 2-13" 274.55586261533 -25.63620569519 "PN" +"PK 005-05 2" "V* V3929 Sgr" 275.24528063955 -26.80712050794 "Sy*" +"PK 005-05 1" "PN M 2-38" 274.85495833333334 -26.588944444444444 "PN" +"PK 004-05 1" "PN M 3-26" 274.04766666666666 -27.24952777777778 "PN" +"PK 004-04 2" "PN M 1-44" 274.07225812673 -27.07514915844 "PN" +"PK 005-04" "PN KFL 16" 274.2248640772 -26.390028379119997 "PN" +"PK 007-06 1" "PN H 1-66" 276.2397458333333 -25.698822222222223 "PN" +"PK 005-06 1" "NGC 6620" 275.7257583333334 -26.82144166666667 "PN" +"PK 008-07 2" "NGC 6644" 278.144595 -25.128933 "PN" +"PK 007-06 2" "PN Vy 2-1" 276.99844183439 -26.113351463689998 "PN" +"PK 006-08 1" "PN Al 1" 278.73022232287 -27.105300518479996 "PN" +"PK 009-09 1" "PN M 3-32" 281.1792916666667 -25.35966666666667 "PN" +"PK 009-10 1" "PN M 3-33" 282.0505848474 -25.481228817320005 "PN" +"PK 011-14 1" "PN HDW 10" 286.42674999999997 -25.395833333333332 "PN?" +"PK 017-21 1" "PN A66 65" 296.64253829593 -23.136935023080003 "PN" +"PK 000+06 2" "PN G000.3+06.9" 260.0915208333333 -24.864508333333333 "PN" +"PK 002+08 1" "PN H 1-11" 260.32385969361997 -22.30986599954 "PN" +"PK 001+05 1" "PN H 1-14" 262.00729832622994 -24.42314339769 "PN" +"PK 001+05 2" "PN H 1-15" 262.15678598843994 -24.852005252499996 "PN" +"PK 002+05 1" "NGC 6369" 262.33523604620996 -23.75965883868 "PN" +"PK 003+05 1" "PN H 2-15" 263.6117375 -22.888808333333333 "PN" +"PK 002+04 1" "PN Th 3-27" 263.9936125 -24.42476388888889 "PN" +"PK 001+04 1" "V* V2116 Oph" 263.00897184809 -24.745591435860003 "Sy*" +"PK 003+03 3" "ESO 520-12" 264.70642113247084 -23.901833353906113 "Sy*" +"PK 003+03 1" "PN H 2-17" 265.03094102466 -24.428497793179996 "PN" +"PK 005+02 1" "PN H 1-34" 267.03155000000004 -22.77981388888889 "PN" +"PK 004+03 1" "PK 004+03 1" 265.40000000000003 -23.566666666666666 "PN" +"PK 004+01 1" "PN H 2-24" 267.15225000000004 -24.276333333333334 "PN" +"PK 003+02 1" "PN Hb 4" 265.47000086054993 -24.70231407311 "PN" +"PK 003+03 2" "PN M 2-14" 265.48861595663 -24.187834187420002 "PN" +"PK 004+02 2" "PN PBOZ 16" 266.8830416666667 -24.218625 "PN" +"PK 004+02 1" "PN H 2-25" 267.25200416666667 -23.71516388888889 "PN" +"PK 006+01 1" "PN HaTr 8" 268.98298025229 -22.983637963649997 "PN" +"PK 005-02 2" "PN MaC 1-10" 272.3017128327842 -25.07622971555278 "PN" +"PK 006-02 1" "PN M 1-41" 272.37541666666664 -24.20722222222222 "PN" +"PK 006-03 1" "PN H 1-61" 273.141625 -24.83347222222222 "PN" +"PK 008-03 1" "PN H 1-64" 274.59931463559 -23.415967533890004 "PN" +"PK 008-02 1" "PN MaC 1-11" 273.71204166666666 -22.73213888888889 "PN" +"PK 007-04 1" "PN H 1-65" 275.03686103834 -24.251463468190003 "PN" +"PK 007-03 2" "PN Sa 3-128" 274.44845833333335 -24.04416666666667 "PN" +"PK 007-03 1" "PN M 2-34" 274.31625 -23.981583333333333 "PN" +"PK 006-03 2" "PN H 2-45" 273.6201833333334 -24.727319444444444 "PN" +"PK 008-04 1" "PN M 2-39" 275.50484206061 -24.177754691600004 "PN" +"PK 009-04 1" "PN H 1-67" 276.27073333333334 -22.58128888888889 "PN" +"PK 008-04 2" "PN M 2-42" 275.63366666666667 -24.157694444444445 "PN" +"PK 009-05 1" "NGC 6629" 276.42689240649 -23.202930996509995 "PN" +"PK 009-06 1" "ESO 522-29" 277.2695833333334 -23.85888888888889 "G" +"PK 008-07 1" "WRAY 16-413" 277.970141859 -24.77158090065 "PN" +"PK 010-06 1" "IC 4732" 278.47764195053 -22.644828518120004 "PN" +"PK 010-06 2" "PN Pe 1-13" 278.71487500000006 -22.721777777777774 "PN" +"PK 010-08 1" "PN GJJC 1" 279.0950833333333 -23.92173888888889 "PN" +"PK 009-08 1" "PN Y-C 47" 279.35770614312 -24.443581427970003 "PN?" +"PK 011-07 1" "V* V348 Sgr" 280.08303767866994 -22.908141168810005 "pA*" +"PK 011-09 1" "PN H 2-48" 281.64632601982 -23.44673929689 "PN" +"PK 012-09 1" "PN M 1-62" 282.60852929173 -22.572974415349996 "PN" +"PK 011-11 1" "EM* AS 327" 283.3194297357 -24.383000280869993 "Sy*" +"PK 019-23 1" "PN A66 66" 299.38126193687 -21.61283597868 "PN" +"PK 000+17 1" "PN PC 12" 250.97409965078 -18.95331979004 "PN" +"PK 359+15 1" "PN A66 40" 252.1438125 -21.014075000000002 "PN" +"PK 000+12 1" "IC 4634" 255.38992365620996 -21.82583764331 "PN" +"PK 003+07 1" "PN H 2-8" 261.1906916666667 -21.559944444444447 "PN" +"PK 005+05 1" "PN M 3-12" 264.0943083333333 -21.52006111111111 "PN" +"PK 005+06 1" "PN M 3-11" 263.83929872907 -20.956508586570003 "PN" +"PK 004+06 2" "PN H 1-24" 263.40659250332993 -21.773545781620005 "PN" +"PK 004+06 1" "NAME Kepler's SN" 262.66878999999994 -21.487320000000004 "SNR" +"PK 007+06 2" "PN M 1-24" 264.5482833333333 -19.627122222222223 "PN" +"PK 005+05 2" "PN H 2-16" 264.98172916666664 -21.23703055555556 "PN" +"PK 005+04 1" "PN H 1-27" 265.07477016230996 -22.32172560537 "PN" +"PK 004+04 1" "PN M 1-25" 264.62631687549 -22.14414840807 "PN" +"PK 006+04 2" "PN M 3-15" 266.38212362465 -20.9670816379 "PN" +"PK 007+04 1" "PN Th 4-1" 266.58674339433003 -20.23007671743 "PN" +"PK 006+03 1" "PN H 2-22" 266.8914222583629 -21.789782596155835 "PN" +"PK 006+02 1" "PN Th 4-3" 267.1557916666667 -22.28021944444444 "PN" +"PK 005+04 2" "PN M 3-13" 265.4025141913967 -22.217481327695 "PN" +"PK 006+03 2" "PN M 1-28" 266.90958333333333 -22.105555555555558 "PN" +"PK 008+03 2" "PN Th 4-4" 267.59925726325 -19.895327802440004 "Sy*" +"PK 008+03 1" "NGC 6445" 267.3126176602546 -20.00948878890889 "PN" +"PK 007+01 2" "Ve 3-61" 269.3166971407699 -21.691418794839997 "Sy*" +"PK 007+01 1" "IC 4670" 268.77929450000005 -21.744455900000002 "PN" +"PK 007+02 1" "PN Th 4-8" 268.17795076750997 -21.260008304059998 "PN?" +"PK 006+02 4" "PN Pe 2-10" 268.4050833333333 -21.978277777777777 "PN" +"PK 006+02 3" "PN Th 4-7" 268.0940375 -21.853730555555558 "PN" +"PK 006+02 5" "PN M 1-31" 268.17268684334 -22.36587758444 "PN" +"PK 006+02 2" "EM* AS 245" 267.75381370731 -22.32640591269 "Sy*" +"PK 008-01 1" "PN M 1-40" 272.10828749999996 -22.281369444444444 "PN" +"PK 010+00 1" "NGC 6537" 271.3046 -19.84302222222222 "PN" +"PK 010-01 1" "NGC 6578" 274.06877984485584 -20.450761997778326 "PN" +"PK 009-02 1" "Hen 2-374" 273.87944733034 -21.5896692442 "Sy*" +"PK 010-03 1" "V* V3811 Sgr" 275.87084324611 -21.885971775350004 "LP*" +"PK 013-04 1" "PN Pe 2-14" 277.4981041666667 -19.67715 "PN" +"PK 011-05 1" "PN M 1-47" 277.29642500523 -21.781685725449996 "PN" +"PK 014-07 1" "PN M 3-31" 281.00738591504 -19.914651084419997 "PN" +"PK 013-07 2" "PN Y-C 2-26" 280.48541666666665 -20.53880555555556 "PN?" +"PK 012-07 1" "EM* AS 316" 280.63667529222 -21.296294153080005 "Sy*" +"PK 013-07 1" "PN PC 21" 281.39672916666666 -20.582866666666668 "PN" +"PK 013-10 1" "PN Y-C 2-32" 283.87779405301 -21.82772538162 "PN" +"PK 015-08 1" "ESO 592-1" 282.28422242672 -19.56822614906 "G" +"PK 016-10" "V* V4368 Sgr" 283.66798774363 -19.69991426312 "Sy?" +"PK 019-19 1" "PN K 2-7" 295.12121223078 -20.45163879355 "PN" +"PK 007+10 1" "PN G007.9+10.1" 261.65869179957 -16.80833652435 "PN" +"PK 006+08 1" "PN M 1-20" 262.24006875636 -19.26500936646 "PN" +"PK 006+07 1" "Hen 2-247" 263.57174179978 -19.15633508688 "Sy*" +"PK 007+06 1" "PN M 1-23" 264.3417083333333 -18.778277777777777 "PN" +"PK 007+07 1" "PN M 1-22" 263.79266249999995 -18.572336111111113 "PN" +"PK 008+06 1" "PN SaSt 2-15" 264.7390473849799 -18.293274449089996 "PN" +"PK 008+05 1" "PN Th 4-2" 266.5408875 -18.658580555555552 "PN" +"PK 009+04 1" "PN Th 4-5" 267.6182375 -19.052780555555554 "PN" +"PK 009+04 2" "PN Th 4-6" 267.73849999999993 -18.780111111111108 "PN" +"PK 010+04 7" "ATO J267.7129-17.7992" 267.71298819767 -17.79921875915 "LP*" +"PK 010+03 1" "PN Th 4-10" 269.2774958333333 -18.11206388888889 "PN" +"PK 009+02 1" "PN Th 4-9" 269.00251160401996 -19.490767195980002 "PN" +"PK 010+04 1" "PN M 2-17" 268.02040000000005 -17.60145277777778 "PN" +"PK 011+02 1" "PN Th 4-11" 270.03661444616 -17.6787040208 "PN" +"PK 011-00 1" "PN M 1-43" 272.95379166666663 -18.772555555555552 "PN" +"PK 011-00 2" "NGC 6567" 273.43818193473 -19.076131010319997 "PN" +"PK 012-02 1" "PN M 1-45" 275.78326342221 -19.284812048479996 "PN" +"PK 015-03 1" "PN A66 44" 277.54684166666664 -16.75731111111111 "PN" +"PK 014-04 1" "PN M 1-50" 278.33700000000005 -18.27697222222222 "PN" +"PK 013-04 2" "PN V-V 3-4" 277.6420300182917 -19.246017258669166 "PN" +"PK 013-03 1" "PN M 1-48" 277.3752307582299 -19.09554269745 "PN" +"PK 013-02 1" "PN SaWe 3" 276.5181721863 -18.20863148947 "PN" +"PK 014-03 1" "PN SaSt 3-166" 277.29694632571 -17.45361726604 "PN" +"PK 016-04 1" "PN M 1-54" 279.03482083333336 -16.999172222222224 "PN" +"PK 014-05 1" "PN V-V 3-5" 279.13435673678 -19.32474218273 "PN" +"PK 015-04 1" "PN M 1-53" 278.95111249999997 -17.602419444444447 "PN" +"PK 016-04 2" "PN M 1-56" 279.44279166666666 -17.096333333333334 "PN" +"PK 014-05 2" "PN V-V 3" 279.29629166666666 -19.039416666666668 "PN" +"PK 017-10 1" "PN A66 51" 285.25580079711995 -18.204256015339997 "PN" +"PK 019-13 1" "PN DeHt 3" 289.26736250000005 -18.02698333333333 "PN" +"PK 009+10 1" "PN A66 41" 262.25844119045996 -15.217911698599998 "PN" +"PK 011+07 1" "PN Sa 2-237" 266.17617500000006 -15.753180555555556 "PN" +"PK 011+06 1" "PN M 2-15" 266.7268708333333 -16.290222222222226 "PN" +"PK 010+07 1" "PN Sa 2-230" 265.5083625 -15.935405555555555 "PN" +"PK 011+05 1" "NGC 6439" 267.08258333333333 -16.479005555555553 "PN" +"PK 013+04 1" "PN M 1-33" 269.745055 -15.537442800000003 "PN" +"PK 013+05 2" "PN MaC 1-9" 268.96951830079996 -14.113645126130002 "Sy*" +"PK 013+05 1" "PN Sa 3-96" 268.937721 -15.061894999999998 "PN" +"PK 011+04 1" "PN M 1-32" 269.0837916666667 -16.48461111111111 "PN" +"PK 016-02 1" "PN Sa 3-134" 277.33258333333333 -15.12775 "PN" +"PK 016-01 1" "PN M 1-46" 276.98465643093994 -15.548453899239998 "PN" +"PK 017-02 1" "PN M 1-52" 278.49375 -14.874055555555556 "PN" +"PK 017-04 1" "PN M 3-30" 280.31224166666664 -15.562105555555556 "PN" +"PK 019-05 1" "PN M 1-61" 281.47966666666673 -14.460527777777777 "PN" +"PK 019-08 1" "PN MaC 1-15" 284.30802818248 -15.487018391989997 "PN" +"PK 025-17 1" "NGC 6818" 295.9907103 -14.153713700000003 "PN" +"PK 009+14 1" "NGC 6309" 258.5179477501499 -12.91052590885 "PN" +"PK 011+11 1" "PN M 2-13" 262.1424682099331 -13.4390952475535 "PN" +"PK 014+06 1" "PN K 2-5" 268.6090791666666 -12.809986111111112 "PN" +"PK 015+03 1" "PN M 1-39" 271.87799999999993 -13.480166666666666 "PN" +"PK 020-00 1" "PN A66 45" 277.5642583333333 -11.615952777777776 "PN" +"PK 018-02 1" "PN M 3-54" 278.26560416666666 -13.738874999999998 "PN" +"PK 018-01 1" "PN M 1-49" 277.55518550449 -13.899087594439997 "PN" +"PK 019-02 1" "PN M 4-10" 278.5577083333333 -13.20686111111111 "PN" +"PK 022-03 1" "PN VV 201" 280.73753147151376 -11.114805070108886 "PN" +"PK 021-03 1" "PN G021.2-03.9" 281.02597083333336 -12.215874999999999 "PN" +"PK 020-03 1" "PN MaC 1-14" 280.30450127812 -13.195308238100003 "Em*" +"PK 019-04 1" "PN M 1-60" 280.90872081192 -13.74702239854 "PN" +"PK 021-05 1" "PN M 1-63" 282.8790083333334 -13.176827777777778 "PN" +"PK 020-05 1" "PN Sa 1-8" 282.68476220114 -13.51732371778 "PN" +"PK 023-07 1" "PN MaC 1-16" 285.34068749999994 -11.972219444444445 "PN" +"PK 026-11 1" "EM* AS 350" 289.58145 -11.104505555555557 "PN" +"PK 025-11 1" "PN A66 60" 289.82412779929996 -12.243369065190002 "PN" +"PK 010+18 1" "PN K 2-8" 256.37988149554997 -10.096926247350002 "*" +"PK 010+18 2" "PN M 2-9" 256.4081729999999 -10.142363 "PN" +"PK 011+18 1" "DHW 1-2" 256.72931295781 -9.78307872316 "PN" +"PK 011+17 1" "DHW 1-2" 256.72931295781 -9.78307872316 "PN" +"PK 018+04 1" "PN G018.9+04.1" 272.61033333333336 -10.484194444444443 "PN" +"PK 019+05 1" "IRAS 18042-0855" 271.7491767135829 -8.9258258459575 "PN" +"PK 018+03 1" "PN M 4-8" 273.04002340254 -10.71620988639 "PN" +"PK 019+03 1" "PN M 3-25" 273.820724 -10.169267 "PN" +"PK 021+02 1" "PN MaC 1-12" 275.3379523268885 -8.5284825693859 "PN" +"PK 019+00 1" "PN M 3-53" 276.0330125 -11.11176388888889 "PN" +"PK 022+01 1" "PN G022.5+01.0" 277.1468416666666 -8.723005555555554 "PN" +"PK 021-00 2" "PN M 3-55" 278.31155416666667 -10.255402777777778 "PN" +"PK 021-00 1" "PN M 3-28" 278.17203333333333 -10.097230555555557 "PN" +"PK 021-01 1" "PN M 1-51" 278.37104166666666 -11.124027777777778 "PN" +"PK 023-02 1" "PN M 1-59" 280.83412999999996 -9.0802853 "PN" +"PK 023-01 1" "PN K 3-9" 280.1007655206299 -8.72953386126 "Sy*" +"PK 022-02 1" "PN M 1-57" 280.08440068333 -10.663115817100001 "PN" +"PK 023-01 2" "PN K 3-11" 280.2804625 -8.933047222222223 "PN" +"PK 024-02 1" "PN M 2-46" 281.64423883931704 -8.467219434377776 "PN" +"PK 025-04 2" "IC 1295" 283.65478433595 -8.82706110929 "PN" +"PK 025-04 1" "PN K 4-8" 283.5834157442499 -8.79256510968 "PN" +"PK 024-03 1" "PN Pe 1-17" 281.95332916666666 -9.151925 "PN" +"PK 024-05 1" "PN M 4-11" 283.57362916666665 -10.087358333333334 "PN" +"PK 027-09 1" "IC 4846" 289.1176110404 -9.043521430720002 "PN" +"PK 028-09 3" "[ALS88] 1" 289.0669996848654 -8.296083104990833 "Sy*" +"PK 038-25 1" "PN A66 70" 307.88836479172 -7.08834303071 "PN" +"PK 016+13 1" "PN A66 42" 262.87111450628 -8.319421008700001 "PN" +"PK 024+03 1" "PN M 2-40" 275.34940797475997 -6.03215745102 "PN" +"PK 023+04 1" "PN MA 3" 274.45584584823996 -6.80596531072 "PN" +"PK 022+04 1" "PN G022.5+04.8" 273.80567624469995 -6.95347458315 "PN" +"PK 023+01 1" "PN MA 13" 277.6266418309 -7.460605114010002 "PN" +"PK 025-00 1" "PN Pe 1-14" 280.53351250000003 -6.6820305555555555 "PN" +"PK 026-02 1" "PN Pe 1-16" 281.8843791666667 -6.900977777777778 "PN" +"PK 026-01 2" "PN Pe 2-15" 281.3647583333334 -6.949286111111111 "PN" +"PK 026-01 1" "PN K 4-5" 281.4027291666667 -6.311133333333333 "PN" +"PK 025-02 1" "PN Pe 1-15" 281.60146454795995 -7.24307626553 "PN" +"PK 027-02 1" "PN Pe 1-18" 282.193486 -5.935266 "PN" +"PK 027-03 1" "PN A66 49" 283.36788333333334 -6.479675 "PN" +"PK 026-02 3" "PN Pe 1-19" 282.43601249999995 -7.026397222222222 "PN" +"PK 026-02 2" "EM* AS 323" 282.1486510444 -6.68623405458 "Sy*" +"PK 027-03 2" "PN Vy 1-4" 283.50788803036 -6.43895266902 "PN" +"PK 028-03 1" "PN Pe 1-21" 284.45684166666666 -5.461036111111111 "PN" +"PK 028-04 1" "PN Pe 1-20" 284.3222958333333 -5.997719444444445 "PN" +"PK 029-05 1" "NGC 6751" 286.48140990643 -5.9923024615400005 "PN" +"PK 030-07 1" "PN MaC 1-17" 288.23862221345 -5.35569737187 "Sy*" +"PK 031-10 1" "PN M 3-34" 291.75790893752 -6.58464989681 "PN" +"PK 018+20 1" "PN Na 1" 258.21616779929997 -3.2666192902799995 "PN" +"PK 024+05 1" "PN M 4-9" 273.57670833333333 -4.989472222222222 "PN" +"PK 026+01 1" "EM* AS 310" 278.33830848512 -4.96832682161 "Ae*" +"PK 029+00 1" "PN A66 48" 280.69550279009 -3.2214709643299995 "PN" +"PK 028+01 1" "PN M 2-44" 279.40398414453 -3.09917433553 "PN" +"PK 027+00 1" "PN M 2-45" 279.8410243931054 -4.330837740389722 "PN" +"PK 029-02 1" "PN Pe 2-16" 283.5418022238 -4.647749319390001 "Sy*" +"PK 028-02 1" "THA 14-39" 282.53761334701 -5.251148473910001 "Em*" +"PK 028-04 2" "PN Th 1-I" 284.69665268671 -5.38324168852 "LP*" +"PK 033-06 1" "NGC 6772" 288.6515541666667 -2.706955555555556 "PN" +"PK 032-06 1" "PN K 2-10" 288.25 -3.533333333333333 "?" +"PK 032-08 1" "PN ARO 318" 290.50720215815 -4.2006092959 "PN" +"PK 034-10 1" "PN HDW 11" 292.7801090378445 -3.7089649401625002 "PN" +"PK 013+32 1" "PN Sn 1" 245.26832900826997 -0.26963348887 "PN" +"PK 028+05 1" "PN K 3-2" 276.25235520274 -1.51458273831 "PN" +"PK 027+04 1" "PN M 2-43" 276.66687508568 -2.7159344919200006 "PN" +"PK 028+02 1" "PN K 3-7" 278.5566666666667 -2.4603055555555557 "PN" +"PK 030+03 1" "PN A66 47" 278.84401527705 -0.23086966401999998 "PN" +"PK 031+01 1" "PN PC 20" 280.764475 -0.2771472222222222 "PN" +"PK 031-00 1" "PN WeSb 4" 282.66792499999997 -1.0531000000000001 "PN" +"PK 031-00 2" "PN HaTr 10" 282.60310416666664 -1.6721944444444443 "PN" +"PK 032-02 1" "PN M 1-66" 284.60933333333327 -1.0626666666666666 "PN" +"PK 033-02 1" "NGC 6741" 285.65458333333333 -0.44908333333333333 "PN" +"PK 032-03 2" "PN K 3-20" 285.54232529147 -1.8126126711500001 "PN" +"PK 032-02 2" "PN K 3-19" 285.40239583333334 -1.3188472222222223 "PN" +"PK 032-03 1" "PN K 3-18" 285.1451227236016 -2.1994348262177774 "PN" +"PK 033-01 1" "PN Sa 3-151" 284.71548997529 -0.54838769128 "PN" +"PK 033-04 1" "PN K 4-17" 287.3520833333333 -1.1513888888888888 "PN?" +"PK 034-06 1" "NGC 6778" 289.6039759722496 -1.5964320566336112 "PN" +"PK 033-05 1" "PN A66 55" 287.6073666666667 -2.33985 "PN" +"PK 028+10 1" "PN WeSb 3" 271.50319166666674 0.3773805555555555 "PN" +"PK 030+08 1" "PN K 4-1" 274.13573989469 1.8841665768000002 "*" +"PK 032+07 2" "PN PC 19" 276.18552315853 2.4911122308099998 "PN" +"PK 030+06 1" "SH 2-68" 276.24345600621 0.86000590252 "PN" +"PK 032+05 1" "PN K 3-4" 277.7509458333333 2.4242638888888886 "PN" +"PK 031+05 1" "PN K 3-3" 276.7884833333333 1.2400916666666666 "PN" +"PK 030+04 1" "PN K 3-6" 278.32290391749996 0.19632850668999996 "PN" +"PK 034+02 1" "PN K 3-13" 281.35278425518993 2.0237156528300004 "PN" +"PK 034+01 1" "[KW97] 35-4" 282.0788416666666 1.7185111111111113 "TT*" +"PK 035-02 1" "V* V1561 Aql" 286.16480547737 1.3716337848000002 "Mi*" +"PK 034-02 1" "PN K 4-15" 286.22609839843 0.3399401283 "*" +"PK 036-01 1" "SH 2-71" 285.50118742649 2.15304923096 "PN" +"PK 036-02 1" "PN HaTr 13" 287.0089541666666 2.356736111111111 "PN" +"PK 037-04 1" "IRAS 19128+0227" 288.83947590371 2.550579210710001 "Mi*" +"PK 037-03 3" "PN K 3-25" 288.39038058117 2.30362522019 "Sy*" +"PK 037-03 1" "IRAS 19096+0232" 288.03798497402 2.63253267707 "LP*" +"PK 035-05 1" "PN K 3-26" 288.6632416666667 0.22674722222222224 "PN" +"PK 037-05 1" "PN A66 58" 289.5853166666667 1.7832277777777776 "PN" +"PK 037-06 1" "NGC 6790" 290.7373874 1.5128892 "PN" +"PK 036-06 1" "PN K 4-25" 290.60420088235 0.21078521969 "Mi*" +"PK 037-06 2" "V* V850 Aql" 290.89447293181 0.63292478847 "Sy*" +"PK 042-14 1" "NGC 6852" 300.1633752811 1.72803369265 "PN" +"PK 027+16 1" "PN DeHt 2" 265.42041692367 3.11598389827 "PN" +"PK 032+07 1" "PN K 3-1" 275.8405416666666 3.6078333333333332 "PN" +"PK 034+06 1" "PN K 3-5" 277.94095073143 4.08592197968 "PN" +"PK 035+05 1" "IRAS 18324+0502" 278.72429813389 5.08118126811 "Mi*" +"PK 038-00 1" "PN HaTr 12" 285.94694994813 5.161401376770001 "PN" +"PK 036-01 2" "PN HaTr 11" 285.74738750000006 3.0391027777777775 "PN" +"PK 040-03 1" "PN K 3-30" 289.1154078399108 5.222055282163334 "PN" +"PK 039-02 1" "PN M 2-47" 288.3939336893 4.63444831183 "PN" +"PK 038-04 1" "PN K 4-22" 289.4510383062299 2.8207081553000006 "LP*" +"PK 038-03 3" "PN K 2-11" 288.5708333333334 3.579722222222222 "?" +"PK 038-03 2" "PN M 1-69" 288.4745416666666 3.6282722222222223 "PN" +"PK 037-03 2" "PN A66 56" 288.2753703053741 2.879808693977222 "PN" +"PK 037-02 1" "PN Ap 3-1" 287.65055021038 2.8244880154100005 "Sy*" +"PK 038-03 1" "PN K 4-19" 288.344176185 3.41672483168 "PN" +"PK 043-13 1" "PN A66 67" 299.61259118176 3.0500026503800006 "PN" +"PK 034+11 1" "NGC 6572" 273.02632579548 6.853618870899999 "PN" +"PK 038+07 1" "PN K 1-25" 278.29270467 8.305994870000003 "Opt" +"PK 037+07 1" "PN K 4-2" 278.06317231416 7.23480477965 "Mi*" +"PK 036+06 1" "PN K 4-3" 278.45660931213 5.88530480704 "LP?" +"PK 038+04 1" "PN K 4-4" 281.04374704925 6.7819744642 "*" +"PK 037+04 1" "IPHAS J184446.08+060703.5" 281.19200538289 6.11765597661 "Sy*" +"PK 038+02 1" "PN YM 16" 283.7387666666666 6.04196111111111 "PN" +"PK 020-02 1" "PK 020-02 1" 283.68749999999994 6.031666666666666 "PN" +"PK 039+02 1" "PN K 3-17" 284.0756833333333 7.123855555555555 "PN" +"PK 040-00 1" "PN A66 53" 286.6912916666667 6.397908333333333 "PN" +"PK 041-00 1" "PN HaTr 14" 287.30710431605996 7.0956245321199996 "PN" +"PK 042-01 1" "PN K 4-20" 288.38176653733 7.456060536089999 "*" +"PK 041-02 1" "NGC 6781" 289.61702083333336 6.538691666666667 "PN" +"PK 043-03 1" "PN M 4-14" 290.2529916666667 7.614547222222221 "PN" +"PK 044-05 1" "PN K 3-36" 293.1648208333334 7.4643250000000005 "PN" +"PK 042-06 1" "NGC 6807" 293.6397083333333 5.684027777777778 "PN" +"PK 044-10 1" "PN K 4-36" 297.39122408878 5.31106953895 "LP*" +"PK 044-09 1" "Z 397-5" 296.39508 5.56436 "AG?" +"PK 036+17 1" "PN A66 43" 268.38448656592 10.6233918771 "PN" +"PK 038+12 1" "PN Cn 3-1" 274.39208959822 10.150918030109999 "PN" +"PK 040+07 1" "LEDA 86290" 279.1009833333334 10.312977777777778 "AG?" +"PK 042+05 1" "PN K 3-14" 282.13671338411 10.597420820099998 "PN" +"PK 041+04 1" "PN K 3-15" 282.92308333333335 9.914611111111112 "PN" +"PK 043+03 1" "PN M 1-65" 284.14014540114 10.86933014739 "PN" +"PK 043+01 1" "PN K 4-13" 286.04671294882 10.179602725540004 "LP*" +"PK 042+01 1" "PN K 4-11" 285.89153895785 8.74007200768 "*" +"PK 043+02 1" "IRAS 18599+1013" 285.574388 10.292387 "PN" +"PK 046-03 1" "PN PB 9" 291.93671827282 10.4057494767 "PN" +"PK 045-02 1" "PN Vy 2-2" 291.0926625695556 9.898960861785 "PN" +"PK 045-04 1" "NGC 6804" 292.89643902328 9.225360727830001 "PN" +"PK 046-04 1" "NGC 6803" 292.81867750822914 10.056005611216946 "PN" +"PK 025+40 1" "IC 4593" 242.93561644285 12.07139760794 "PN" +"PK 036+21 1" "PN Y-C 44" 264.60819458787 12.683277180449998 "PN?" +"PK 036+20 1" "PN Y-C 45" 265.77257257469705 12.34253635846389 "PN?" +"PK 044+05 1" "PN K 3-16" 283.256625 12.266722222222223 "PN" +"PK 044+05 2" "PN G044.1+05.8" 282.69525449711 12.624956629109999 "PN" +"PK 045+01 1" "PN K 3-22" 287.3608333333333 12.01238888888889 "Sy*" +"PK 044+01 1" "PN K 3-23" 287.4301209865 11.08749989833 "Em*" +"PK 045-00 1" "HaroChavira 58" 288.62661081333 10.846007520480002 "Mi*" +"PK 045-01 1" "PN K 3-33" 290.61111452414 10.689239147570001 "PN" +"PK 048-02 1" "PN PB 10" 292.06036249999994 12.326975 "PN" +"PK 047-03 1" "V* V976 Aql" 292.57728330824 11.393141780950002 "Mi*" +"PK 047-04 1" "PN A66 62" 293.3245354548713 10.616600495300833 "PN" +"PK 043+11 1" "PN M 3-27" 276.9510994377599 14.48501851361 "PN" +"PK 044+10 1" "PN We 3-1" 278.5096125 14.81948888888889 "PN" +"PK 044+08 1" "IRAS 18378+1408" 280.0290407072 14.195776928780003 "Mi*" +"PK 048+04 2" "PN K 4-16" 286.21460657967 15.794201460440005 "PN" +"PK 047+04 1" "PN K 3-21" 285.66829913395 14.48022100702 "PN" +"PK 046+03 1" "SH 2-78" 285.7919821557 14.116326549410001 "PN" +"PK 046+02 1" "PN G046.8+02.9" 286.5957583333333 13.746027777777776 "PN" +"PK 048+01 1" "PN M 4-13" 288.41009839359 14.98865489854 "PN" +"PK 048+02 1" "PN K 3-24" 288.0245 15.151250000000001 "PN" +"PK 048+01 2" "PN K 3-29" 288.87736859411 14.063854615779999 "PN" +"PK 049+02 1" "PN M 4-12" 288.2727056598129 15.777754198557776 "PN" +"PK 049+00 1" "PN K 4-23" 289.64479661794996 14.997566322140003 "LP*" +"PK 048-00 1" "PN K 4-24" 290.31174727297 14.102921998259998 "LP*" +"PK 048-01 1" "PN DeHt 4" 291.61109999999996 13.326308333333333 "PN" +"PK 050-01 1" "PN K 4-28" 292.56945 14.7894 "PN" +"PK 051-03 1" "PN M 1-73" 295.28872395454 14.94971666836 "PN" +"PK 050-03 1" "V* V998 Aql" 294.26954028251 13.68689255535 "Mi*" +"PK 052-04 1" "PN M 1-74" 295.57824999999997 15.152305555555555 "PN" +"PK 051-04 1" "PN PC 22" 295.51464166666665 13.843702777777779 "PN" +"PK 054-12 1" "NGC 6891" 303.7868480856599 12.704328929650002 "PN" +"PK 050+05 1" "PN A66 52" 286.13475833333337 17.951980555555554 "PN" +"PK 048+04 1" "EM* AS 338" 285.94515502177 16.43804762192 "Sy*" +"PK 051+03 1" "EM* AS 345" 288.51724009163 17.5258679034 "PN" +"PK 050+03 1" "Hen 2-427" 287.87864548657 16.860611371739996 "WR*" +"PK 051+02 1" "SS 438" 288.74885794176 17.37945212631 "PN" +"PK 051+01 1" "IRAS 19170+1706" 289.82794158921 17.196910540920005 "PN" +"PK 052-02 1" "PN K 3-41" 294.81608333333327 16.346305555555556 "PN" +"PK 052-02 2" "PN Me 1-1" 294.7909175819 15.94674298431 "PN" +"PK 053-01 1" "PN K 3-38" 293.82647499999996 17.216863888888888 "PN" +"PK 054-02 1" "PN M 1-72" 295.39155401762 17.754868194489998 "PN" +"PK 053-03 2" "V* HM Sge" 295.48783161872 16.74439051773 "Sy*" +"PK 054-03 1" "PN K 4-34" 296.60835657291 17.01733332031 "LP*" +"PK 053-03 1" "PN A66 63" 295.54287357862 17.08734958587 "PN" +"PK 059-18 1" "PN A66 72" 312.50855126813 13.558201504869999 "PN" +"PK 045+24 1" "PN K 1-14" 265.65318295829 21.450677559979997 "PN" +"PK 051+09 1" "PN Hu 2-1" 282.44817090972 20.84427691521 "PN" +"PK 052+07 1" "PN K 4-10" 284.76566301443 20.61697791406 "PN" +"PK 051+06 1" "PN K 1-17" 285.9056757673329 19.3562323989797 "PN" +"PK 053+03 1" "PN A66 59" 289.6666791666667 19.575819444444445 "PN" +"PK 052+02 1" "PN K 3-31" 289.76102369833 19.039169085010002 "PN" +"PK 055+02 2" "Hen 1-1" 290.9452083333333 21.110416666666666 "PN" +"PK 055+02 1" "Hen 2-432" 290.8533675013599 21.1334395892025 "PN" +"PK 055+01 1" "PN G055.0+01.8" 291.66726666666665 20.487508333333334 "PN" +"PK 055-01 2" "V* FT Sge" 295.22639757516 18.7467087347 "Mi*" +"PK 055-01 1" "PN K 3-43" 295.10795 18.82061111111111 "PN" +"PK 055-00 1" "PN M 1-71" 294.112169785032 19.7066718975207 "PN" +"PK 057-03 1" "PN K 4-38" 297.83775002604 19.9592341595 "LP*" +"PK 057-02 1" "PN K 4-35" 297.22243246025 20.11881361144 "Mi*" +"PK 056-06 1" "PN K 3-51" 300.6514324748417 17.61413909460917 "PN" +"PK 057-08 1" "NGC 6879" 302.611220856817 16.922575586261388 "PN" +"PK 058-10 1" "IC 4997" 305.03648248915 16.731583037049997 "PN" +"PK 043+37 1" "NGC 6210" 251.12299625806997 23.79983943286 "PN" +"PK 055+06 1" "PN A66 54" 287.16464298447 22.9832049338 "PN" +"PK 056+04 1" "PN K 3-32" 289.90368073882996 22.576323065600004 "PN" +"PK 056+02 1" "PN K 3-35" 291.93322916579996 21.50080777506 "PN" +"PK 055+02 3" "Hen 1-2" 291.65727002121 21.15748374663 "PN" +"PK 057+02 1" "PN K 4-29" 292.66177970533 23.059577193589995 "Mi*" +"PK 057+01 1" "PN K 4-30" 293.28761186665 22.976009997 "PN?" +"PK 059-01 1" "Hen 1-3" 297.11000147765 22.14369662618 "PN" +"PK 057-01 1" "Hen 2-447" 296.34234876074 21.33442312584 "PN" +"PK 060-04 1" "PN A66 68" 300.0441780443387 21.715561238676663 "PN" +"PK 058-05 1" "PN WeSb 5" 300.42504751661 19.911148048200005 "PN" +"PK 060-07 2" "NGC 6886" 303.178459 19.989620000000002 "PN" +"PK 060-07 1" "Hen 1-5" 302.98358148667 20.334561373369997 "pA*" +"PK 061-09 1" "NGC 6905" 305.59579967728 20.104523625579997 "PN" +"PK 051+25 1" "2MASS J17445657+2720070" 266.23574116552 27.33530118724 "*" +"PK 053+24 1" "PN Vy 1-2" 268.59574999999995 27.999472222222224 "PN" +"PK 055+16 1" "PN A66 46" 277.8274627956499 26.93669743058 "PN" +"PK 056+14 1" "IRAS 18390+2653" 280.2632073965 26.93893157726 "G" +"PK 058+06 1" "PN A66 57" 289.27356660005 25.62580344644 "PN" +"PK 059+04 1" "PN K 3-34" 291.01139583333327 25.313211111111112 "PN" +"PK 060+01 1" "Hen 2-440" 294.5348333333333 25.26141666666667 "PN" +"PK 059+02 2" "PN K 3-39" 293.97695416666664 24.913388888888885 "PN" +"PK 059+02 1" "PN K 3-37" 293.4447916666667 24.540861111111113 "PN" +"PK 058+01 1" "PN K 3-40" 294.090875 23.66325 "PN" +"PK 060-00 1" "PN K 3-45" 296.5651125 24.18435277777778 "PN" +"PK 059-00 1" "Hen 2-446" 296.02191443941 23.446654761010002 "LP*" +"PK 062-01 1" "IRAS 19521+2449" 298.5628942405 24.964339377279998 "Mi*" +"PK 060-02 1" "PN K 4-39" 298.27398425912 23.226674002129997 "*" +"PK 060-03 1" "M 27" 299.90151327087 22.721197794319995 "PN" +"PK 060-03" "M 27" 299.90151327087 22.721197794319995 "PN" +"PK 064-09 1" "PN K 4-43" 307.03614166666665 22.852336111111114 "PN?" +"PK 063-12 1" "V* LT Del" 308.98848105816995 20.190974138280005 "Sy*" +"PK 047+42 1" "PN A66 39" 246.89049967631996 27.909297605660004 "PN" +"PK 058+12 1" "PN K 4-9" 283.42154753538 28.536798254759997 "*" +"PK 061+08 1" "PN K 3-27" 288.6248331996 28.67924856753 "PN" +"PK 061+03 1" "Hen 2-437" 293.24001688947 26.87863553405 "PN" +"PK 063+00 1" "PN K 3-48" 298.03802500000006 27.308608333333332 "PN" +"PK 062-00 1" "PN M 2-48" 297.618855 25.908206999999997 "PN" +"PK 064-02 1" "PN K 3-53" 300.8435833333333 27.015222222222224 "PN" +"PK 063-03 1" "PN K 3-54" 301.24430911057 25.44368680259 "PN" +"PK 065-03 1" "PN G065.1-03.5" 302.2706583333333 26.448369444444445 "PN" +"PK 063-03 2" "PN K 4-42" 301.66965922605 25.00319367044 "LP*" +"PK 065-05 1" "Hen 1-6" 304.3392666666667 25.362994444444446 "PN" +"PK 062+09 1" "NGC 6765" 287.77732634759 30.545465020359998 "PN" +"PK 064+05 1" "HD 184738" 293.68847400852 30.516375180899995 "PN" +"PK 064+02 1" "PN K 4-33" 296.43065107023 28.635508265060004 "LP?" +"PK 064+00 1" "V* AA Vul" 297.6085324612 28.188763621790006 "Mi*" +"PK 065+00 1" "NGC 6842" 298.75891666666666 29.289500000000004 "PN" +"PK 066-05 1" "Hen 1-7" 304.90886956057 27.003117664889995 "PN" +"PK 064+15 1" "PN M 1-64" 282.5087083333333 35.24336111111111 "PN" +"PK 063+13 1" "M 57" 283.39623652463 33.029134246539996 "PN" +"PK 063+13" "M 57" 283.39623652463 33.029134246539996 "PN" +"PK 068+03 1" "PN PC 23" 297.9696666666667 32.988277777777775 "PN" +"PK 066+02 1" "PN K 4-37" 297.7525039746 31.04135708514 "PN" +"PK 068+01 1" "PN K 4-41" 299.14177916666665 32.370266666666666 "PN" +"PK 068+01 2" "EM* AS 375" 299.8250583333333 31.91087222222222 "PN" +"PK 067-00 1" "PN K 3-52" 300.7976666666667 30.542805555555557 "PN" +"PK 068-00 1" "PN M 1-75" 301.18421125 31.45740758333333 "PN" +"PK 068-02 1" "Hen 2-459" 303.49121227672 29.565520567990003 "PN" +"PK 069-02 1" "NGC 6894" 304.09985416666666 30.564769444444444 "PN" +"PK 069-03 1" "PN K 3-58" 305.4928291666667 29.989188888888886 "PN" +"PK 068+14 1" "PN Sp 4-1" 285.11060850206 38.35202225056 "PN" +"PK 069+03 1" "PN K 3-46" 297.5013041666666 33.7644 "PN" +"PK 069+02 1" "PN K 3-49" 298.50256955641 33.37013641156 "PN" +"PK 070+01 2" "NGC 6857" 300.44879166666664 33.52594444444444 "HII" +"PK 069+01 1" "LBN 070.13+01.71" 300.22187 33.49056 "HII" +"PK 070+01 1" "W 58a" 300.44083333333333 33.54527777777778 "HII" +"PK 072+00 1" "PN K 3-57" 303.19885416666665 34.34244166666667 "PN" +"PK 069+00 1" "PN K 3-55" 301.73448200368 32.27704004098 "PN" +"PK 071-02 1" "PN M 3-35" 305.26567993463993 32.49000145325001 "PN" +"PK 061+41 1" "PN DdDm 1" 250.07563218679 38.70556496093 "PN" +"PK 073-02 1" "PN K 3-76" 306.27030468481996 33.58069265723999 "PN" +"PK 064+48 1" "NGC 6058" 241.11061734697 40.68304149751 "PN" +"PK 075+05 1" "EM* AS 373" 299.27090271051 39.82668781750999 "Sy*" +"PK 075+04 1" "PN G075.6+04.3" 301.06709166666667 39.59246944444445 "PN" +"PK 074+02 1" "NGC 6881" 302.7185416666667 37.41177777777777 "PN" +"PK 074+01 1" "Hen 2-461" 304.11006634254 37.10165946126 "AB*" +"PK 076+01 2" "PN KjPn 3" 304.31442768958 38.83994242318 "PN?" +"PK 076+01 1" "PN A66 69" 304.9930958333333 38.4006 "PN" +"PK 075-04 1" "V* V2428 Cyg" 310.32923834806877 34.74785108470695 "Sy*" +"PK 077-05 1" "V* V1329 Cyg" 312.75513405938 35.58169762731 "Sy*" +"PK 259+00 2" "WRAY 16-24" 129.49333333333337 -39.739444444444445 "PN?" +"PK 259+00 1" "WRAY 16-23" 129.28375 -39.41861111111111 "PN" +"PK 258-00 1" "EM* AS 200" 127.11648804555001 -39.394455851290004 "PN" +"PK 258-03 1" "V* RX Pup" 123.55126656175 -41.70807779696 "Sy*" +"PK 257-05 1" "PN G257.8-05.4" 121.39032500000002 -41.93805555555555 "PN" +"PK 256-11 1" "WRAY 17-6" 113.84833333333333 -44.0175 "PN?" +"PK 261+06 1" "WRAY 17-25" 137.31166666666667 -37.71333333333334 "?" +"PK 261+04 1" "WRAY 17-22" 134.06208333333333 -39.03611111111111 "PN?" +"PK 261+02 1" "EM* AS 204" 133.37867242875 -40.06188325013 "PN" +"PK 260-03 1" "WRAY 16-20" 125.91954166666665 -43.21308333333334 "SNR" +"PK 261-04 1" "WRAY 16-19" 125.26712402928 -44.39826848117 "PN?" +"PK 259-07 1" "2MASS J07593083-4443590" 119.87846150683 -44.73304457816 "G" +"PK 259-09 2" "2MASX J07522956-4550587" 118.12319274726 -45.84963663923 "G" +"PK 259-09 1" "PN Y-C 2-2" 118.1931578293 -45.20057741802001 "PN?" +"PK 258-15 1" "WRAY 17-1" 108.70593362416001 -46.96088862875 "PN" +"PK 264+08 1" "WRAY 17-29" 141.125 -38.611111111111114 "PN?" +"PK 264+03 1" "WRAY 17-24" 136.77875 -42.25694444444444 "PN?" +"PK 263+00 1" "PN K 2-15" 132.16273076736 -42.89833492694 "HII" +"PK 262-04 1" "WRAY 17-18" 125.97427083333332 -45.51963888888889 "PN" +"PK 264-03 1" "WRAY 17-20" 128.61452916666667 -46.42604166666666 "PN" +"PK 263-05 1" "PN PB 2" 125.16744776526998 -46.38291911662 "PN" +"PK 262-08 1" "WRAY 16-11" 120.68750000000001 -47.96194444444445 "?" +"PK 261-08 2" "WRAY 17-11" 119.88374999999999 -47.03527777777778 "PN?" +"PK 261-08 1" "WRAY 17-14" 120.35166666666667 -46.95 "PN?" +"PK 263-09 1" "WRAY 17-13" 120.10666666666667 -48.515277777777776 "PN?" +"PK 263-08 1" "ESO 209-15" 121.29660833333332 -48.391927777777774 "PN" +"PK 262-10 1" "WRAY 16-9" 118.90208333333332 -48.82944444444445 "PN?" +"PK 266+08 1" "WRAY 16-50" 143.18416666666667 -39.56638888888889 "PN?" +"PK 265+05 1" "ESO 314-12" 139.79094316283 -41.18420571644 "G" +"PK 266+02 2" "PN Pe 2-2" 137.26530057205 -44.2956799872 "*" +"PK 266+02 1" "PN Pe 2-3" 137.56961036165 -44.40889181225 "LP*" +"PK 265+04 1" "NGC 2792" 138.1106708333333 -42.427477777777774 "PN" +"PK 266+00 1" "Ve 6-22" 134.81624425683 -45.59309587366 "LP*" +"PK 266+01 1" "PN Pe 2-1" 136.04533920044 -44.54793831562999 "*" +"PK 265-02 1" "Ve 7-26" 130.86706628506 -46.11109902221 "PN" +"PK 266-01 1" "Ve 7-27" 132.99869722268 -46.30202167033 "PN" +"PK 266-00 1" "Ve 6-21" 134.15203333333332 -46.399252777777775 "Be*" +"PK 265-04 1" "ESO 259-10" 128.5294320399 -47.276973458209994 "PN" +"PK 264-08 1" "WRAY 16-16" 122.88250000000001 -48.721583333333335 "PN" +"PK 265-09 1" "WRAY 16-14" 122.09999999999998 -50.55 "PN?" +"PK 264-12 1" "WRAY 16-8" 116.83350589353999 -51.25095350052 "PN" +"PK 255-59 1" "PN Lo 1" 44.24347043833001 -44.1716230434 "PN" +"PK 268+07 1" "WRAY 16-52" 143.67333333333332 -41.6825 "?" +"PK 268+02 1" "PN PB 5" 139.04003100000003 -45.478558 "PN" +"PK 268-03 1" "WRAY 17-21" 131.65249999999997 -49.35444444444445 "PN?" +"PK 267-03 1" "WRAY 16-28" 130.87228333333334 -48.91318055555555 "PN" +"PK 268-14 1" "WRAY 17-9" 117.86375 -55.69972222222222 "PN" +"PK 271+03 1" "WRAY 16-51" 143.37313590119 -46.58081756768 "LP*" +"PK 270-04 1" "WRAY 16-31" 133.1854166666667 -51.6825 "PN?" +"PK 269-03 1" "PN PB 3" 133.57649088631 -50.53961122554 "PN" +"PK 270-05 1" "WRAY 16-29" 132.69541666666666 -52.60722222222223 "PN?" +"PK 271-08 1" "CSRG 557" 128.69380587794 -55.06144431626 "AG?" +"PK 269-13 1" "WRAY 17-12" 119.815 -55.60944444444445 "PN?" +"PK 274+09 1" "PN Lo 4" 151.44078337892 -44.35931207844 "PN" +"PK 273+06 1" "PN HbDs 1" 148.18551141474 -46.27984909188 "PN" +"PK 274+03 3" "WRAY 17-37" 147.06083333333336 -48.55638888888888 "PN?" +"PK 274+01 1" "WRAY 16-53" 144.50504339944 -50.16167101889 "PN?" +"PK 274+02 3" "WRAY 17-33" 144.63958333333335 -49.76277777777778 "PN?" +"PK 274+02 2" "WRAY 16-57" 145.40624521210708 -49.966274495640555 "PN" +"PK 274+02 1" "WRAY 16-56" 145.30832782151 -49.3797795707 "Sy*" +"PK 274+03 1" "WRAY 16-59" 146.85331805579 -48.97073693499001 "PN" +"PK 272+00 1" "WRAY 16-45" 141.01833333333335 -50.2525 "PN?" +"PK 273-03 1" "WRAY 16-35" 137.16688145051 -53.32049513542 "PN" +"PK 275+06 1" "WRAY 16-65" 151.21249999999998 -47.10638888888889 "PN" +"PK 274+03 2" "WRAY 16-58" 146.72 -49.39416666666666 "PN?" +"PK 274-00 1" "ESO 212-8" 142.84916666666666 -52.12111111111111 "?" +"PK 275-01 1" "PN Pe 2-4" 142.70175300000002 -53.166584 "PN" +"PK 275-03 1" "WRAY 16-40" 139.50548870949 -54.65810155448 "PN" +"PK 275-02 2" "WRAY 16-46" 141.19097972705 -54.60430882046 "PN" +"PK 275-02 1" "WRAY 16-44" 140.52826215035 -54.16096171987999 "PN" +"PK 277-03 1" "NGC 2899" 141.7625833333333 -56.10586111111112 "PN" +"PK 275-04 2" "WRAY 15-344" 138.47020833333335 -55.471444444444444 "PN" +"PK 275-04 1" "PN PB 4" 138.78227990366 -54.87885349076 "PN" +"PK 276-18 1" "ESO 89-5" 117.65869720320998 -64.26302183894 "EmG" +"PK 278+05 1" "PN PB 6" 153.31650940299 -50.33321221658 "PN" +"PK 279+01 1" "WRAY 17-38" 149.92 -53.47 "PN" +"PK 278+00 1" "WRAY 16-61" 148.01833333333335 -53.56583333333333 "PN?" +"PK 279-03 2" "WRAY 17-35" 145.21958333333333 -56.965833333333336 "PN" +"PK 277-03 2" "WRAY 17-31" 142.83552056802 -56.29431773579 "PN" +"PK 279-03 1" "CD-56 2932" 145.85680049264917 -57.282091942548604 "PN" +"PK 278-05 1" "NGC 2867" 140.3557635284 -58.31128518988999 "PN" +"PK 278-04 1" "WRAY 16-49" 142.72958333333332 -57.61388888888889 "PN" +"PK 278-06 3" "WRAY 16-42" 139.90625 -59.06333333333333 "PN?" +"PK 278-06 1" "PN My 47" 139.86458333333334 -59.20008333333334 "PN" +"PK 278-06 2" "WRAY 17-28" 140.81125 -58.86611111111111 "PN?" +"PK 279-08 1" "WRAY 17-26" 138.41958333333332 -60.76555555555556 "PN?" +"PK 277-07 1" "ESO 126-1" 138.15603226522 -58.84227973095 "GiG" +"PK 279-38 1" "SMP LMC 104A" 66.38412276978 -66.78785511134 "PN" +"PK 280+02 1" "PN Sa 2-56" 152.99025833333334 -52.638080555555554 "PN" +"PK 280-00 1" "WRAY 17-39" 150.73872220005 -55.83597366616001 "LP*" +"PK 280-02 2" "ESO 167-10" 148.24833333333333 -57.42444444444444 "?" +"PK 280-02 1" "WRAY 16-62" 148.68036992894 -57.3145610838 "Sy*" +"PK 282-02 1" "CPD-57 2561" 150.56670374215 -58.23057258676 "Em*" +"PK 281-04 1" "V* SV Car" 147.08593127357 -59.53656759911 "Mi*" +"PK 281-05 1" "IC 2501" 144.69662570911 -60.09189101070001 "PN" +"PK 282-07 1" "WRAY 17-32" 144.26375 -62.45166666666667 "PN?" +"PK 282-10 1" "WRAY 17-27" 139.19333333333336 -64.97111111111111 "PN?" +"PK 284-39 1" "ESO 55-9" 60.76490771268999 -70.24376831483 "G" +"PK 283+12 1" "ESO 264-53" 164.31906865281 -46.17338189795999 "EmG" +"PK 283+06 2" "WRAY 15-619" 159.78616116446 -51.40351440735 "Sy*" +"PK 282+03 1" "WRAY 17-45" 157.88312499999998 -53.558194444444446 "PN" +"PK 283+03 1" "WRAY 16-72" 158.57954583333333 -53.68419722222222 "PN" +"PK 283+02 1" "PN My 60" 157.88930628913 -55.34745043899999 "PN" +"PK 283-01 1" "PN Hf 4" 153.89575 -58.85294444444445 "PN" +"PK 283-04 1" "WRAY 16-64" 150.95502008004 -60.73007576050001 "PN" +"PK 284-05 1" "WRAY 15-490" 150.510404711 -61.95450571213 "Em*" +"PK 283-07 1" "WRAY 17-34" 144.98708333333335 -63.20638888888888 "*" +"PK 286-29 1" "PN K 1-27" 89.25906185735 -75.6729105667 "PN" +"PK 283+09 1" "CD-48 6027" 163.6690004584 -48.78411550501001 "HS*" +"PK 286+02 1" "WRAY 16-79" 162.18012581723 -56.05267790162 "PN" +"PK 285+02 1" "PN Pe 2-7" 160.331625 -56.1545 "PN" +"PK 285+01 1" "PN Pe 1-1" 159.61494020057 -56.785340783790005 "PN" +"PK 285+01 2" "PN Pe 1-2" 159.8862837684 -57.10392847032 "PN" +"PK 285-01 2" "WRAY 17-44" 157.32166666666666 -59.8275 "PN?" +"PK 285-01 1" "PN Pe 2-5" 157.14426895975 -59.05648986084 "PN" +"PK 286-02 1" "WRAY 17-43" 156.6725 -60.926944444444445 "PN?" +"PK 285-02 1" "PN My 59" 155.78807541853 -60.545028817440006 "PN" +"PK 287-02 1" "WRAY 16-73" 158.90287515317 -60.64553178537 "PN?" +"PK 286-06 1" "WRAY 16-66" 151.84840982094 -63.9083509342 "PN" +"PK 285-05 1" "IC 2553" 152.33692325378 -62.61348478392 "PN" +"PK 286-04 1" "NGC 3211" 154.4606 -62.670027777777776 "PN" +"PK 286-06 2" "WRAY 17-40" 151.74831632682 -64.36386029108 "PN" +"PK 285-07 1" "ESO 92-2" 149.87019304166665 -64.73306305555555 "EmG" +"PK 285-14 1" "IC 2448" 136.77632990827 -69.94185907713 "PN" +"PK 286+11 1" "PN Lo 5" 168.47560416666667 -47.95017777777778 "PN" +"PK 286+10 1" "ESO 215-31" 167.64486321618 -49.102637078709996 "EmG" +"PK 287+10 1" "ESO 215-39" 169.2675625 -49.201461111111115 "EmG" +"PK 288+05 1" "UCAC2 8008259" 166.62745613728 -54.80960567494999 "Be*" +"PK 288+00 1" "PN Hf 38" 163.64766666666668 -59.16313888888889 "PN" +"PK 289-00 1" "V* AG Car" 164.04824225602 -60.45355852034999 "WR*" +"PK 288+00 2" "ESO 128-25" 164.91874583333333 -59.019600000000004 "PN?" +"PK 288-00 1" "WRAY 15-682" 163.49824055405 -60.44565585981001 "WR*" +"PK 289-01 1" "Hen 2-57" 164.0125 -61.468722222222226 "PN" +"PK 288-02 1" "PN Pe 1-3" 161.12966666666665 -61.660694444444445 "PN" +"PK 288-05 1" "WRAY 16-74" 158.94050901558 -64.31987849332 "PN" +"PK 289-08 1" "WRAY 17-42" 155.26416666666665 -67.53305555555555 "?" +"PK 288-08 1" "WRAY 17-41" 152.20939118174 -67.03158127265 "*" +"PK 289-11 1" "LEDA 275837" 151.44833671969 -70.01983540377 "EmG" +"PK 289+10 1" "PN Y-C 2-13" 172.86087636025 -49.97747198342999 "PN?" +"PK 290+09 1" "LEDA 5060485" 172.48532603358 -51.257956410300004 "AG?" +"PK 289+07 1" "WRAY 16-88" 171.004351 -52.855385 "PN" +"PK 290+07 1" "PN Fg 1" 172.15093479587 -52.93447735954 "PN" +"PK 288+08 1" "ESO 216-2" 169.54070425931 -52.16741033567 "PN" +"PK 290-00 1" "PN Hf 48" 165.98325 -60.601277777777774 "PN" +"PK 289-00 2" "BRAN 334B" 165.28041666666667 -60.79388888888889 "ISM" +"PK 291-04 1" "IC 2621" 165.0834518 -65.249397 "PN" +"PK 292+04 1" "PN PB 8" 173.32423015163 -57.10414608635 "PN" +"PK 291+03 1" "WRAY 16-89" 171.85129166666664 -57.29969444444444 "PN" +"PK 292+01 3" "WRAY 16-93" 172.70141666666666 -59.284611111111104 "PN" +"PK 292+01 2" "WRAY 16-92" 172.19745853649 -60.1101855568 "PN" +"PK 292+01 1" "NGC 3699" 171.990999335015 -59.95790397583083 "PN" +"PK 323-88 1" "WRAY 15-807" 171.38646252581 -59.942804861970004 "Sy*" +"PK 293+01 1" "WRAY 16-96" 173.79568233231 -60.28361903639 "PN" +"PK 294-00 2" "[W65] c18" 174.52123384035 -62.2671944595 "WR*" +"PK 292-01 1" "WRAY 17-46" 170.79936028859 -62.34108832554999 "*" +"PK 294-04 1" "WRAY 16-94" 172.93941881742 -65.97059546079 "PN" +"PK 295-09 2" "WRAY 16-87" 169.51666666666668 -70.63444444444445 "PN" +"PK 295-09 1" "WRAY 16-86" 169.42981747553 -70.82560160605 "PN" +"PK 295-13 1" "ESO 38-7" 165.68041666666664 -74.88777777777779 "?" +"PK 296-20 1" "NGC 3195" 152.33712500000001 -80.8585361111111 "PN" +"PK 293+10 1" "ESO 217-11" 178.27750833333334 -50.84976666666667 "PN" +"PK 292+10 1" "WRAY 17-49" 176.9 -51.46666666666667 "PN?" +"PK 295+06 1" "WRAY 16-102" 179.06833333333336 -55.550555555555555 "PN?" +"PK 293+05 1" "WRAY 17-48" 176.42458333333332 -56.347500000000004 "PN?" +"PK 295+04 1" "WRAY 17-50" 179.07500000000002 -57.2 "PN?" +"PK 294+04 1" "NGC 3918" 177.57404562706 -57.18250480623001 "PN" +"PK 294+00 1" "WRAY 17-47" 176.14166666666665 -61.19416666666666 "PN?" +"PK 294-00 1" "PN Hf 69" 175.40538949765917 -62.48190055227389 "PN" +"PK 296-03 1" "WRAY 16-100" 177.1587316 -65.14345699337 "PN" +"PK 296-06 2" "WRAY 16-99" 174.81416666666667 -68.77 "PN?" +"PK 296-06 1" "WRAY 16-98" 174.79665246087 -68.86916190244 "PN" +"PK 294+14 1" "PN Lo 6" 180.18121275216998 -47.55342629047 "PN" +"PK 294+12 1" "WRAY 16-103" 180.05 -49.43333333333333 "PN?" +"PK 296+10 1" "WRAY 17-53" 182.51916666666665 -51.775555555555556 "PN?" +"PK 295+07 1" "WRAY 17-52" 180.86458333333334 -54.407777777777774 "PN?" +"PK 297+03 1" "WRAY 16-107" 182.29252904393996 -58.710356768980006 "PN" +"PK 299-01 1" "WRAY 16-111" 185.75549999999998 -64.0295 "PN" +"PK 299-00 2" "BRAN 386E" 184.97291666666666 -62.91888888888889 "HII" +"PK 298-01 2" "WRAY 16-105" 182.10541666666666 -64.20222222222222 "PN" +"PK 298-01 1" "WRAY 16-108" 183.83562506505996 -63.65371305731001 "PN" +"PK 298-00 1" "ESO 95-1" 182.25524999999996 -63.26656388888888 "HII" +"PK 299-00 1" "WRAY 16-110" 185.59658143482997 -63.28800569988999 "Ae*" +"PK 298-04 1" "NGC 4071" 181.06125638405996 -67.310127293 "PN" +"PK 299-04 1" "PN HaTr 1" 184.13806666666667 -66.76251944444445 "PN" +"PK 297-03 1" "WRAY 17-51" 180.09833333333333 -65.7925 "PN?" +"PK 297+13 1" "WRAY 17-54" 184.1291666666667 -49.19305555555555 "PN?" +"PK 297+07 1" "WRAY 17-55" 184.34166666666664 -54.596111111111114 "PN?" +"PK 299+02 1" "WRAY 16-112" 185.9720833333333 -60.22027777777778 "PN" +"PK 300+00 1" "WRAY 16-114" 187.18327416813997 -62.09308890917001 "PN" +"PK 300-01 1" "WRAY 16-116" 187.5319314455 -63.88354423741 "PN" +"PK 300-00 1" "WRAY 16-115" 187.1951907480192 -63.7436312809147 "PN" +"PK 300-02 1" "WRAY 16-117" 187.62681030297998 -64.86824699632 "PN" +"PK 300-03 1" "ESO 95-12" 187.60274583333333 -66.23977222222223 "PN" +"PK 300-02 2" "WRAY 16-113" 187.154125 -65.3223611111111 "Em*" +"PK 302-05 1" "PN Y-C 2-14" 190.839875 -68.21158333333334 "PN?" +"PK 302+02 1" "WRAY 16-120" 191.47762500000002 -60.3376388888889 "PN" +"PK 303+01 1" "THA 17-3" 193.37876496159998 -61.85899912647 "Em*" +"PK 302-00 1" "WRAY 16-119" 191.44586336166998 -63.00990097454 "LP?" +"PK 302-00 2" "WRAY 16-121" 192.1291666666667 -63.83305555555556 "PN" +"PK 304-04 1" "IC 4191" 197.19711332414 -67.64376190573 "PN" +"PK 305-13 1" "ESO 40-11" 203.55971856901 -75.77535829055 "PN" +"PK 304+05 2" "WRAY 16-122" 195.17182061844 -56.89458874163 "PN" +"PK 304+05 1" "WRAY 16-123" 196.45094642630997 -57.656794952620004 "PN" +"PK 305+03 2" "WRAY 17-58" 197.58209360522 -59.75308799795 "PN" +"PK 305+03 1" "PN Sa 3-22" 198.62625212183997 -58.86378579014001 "Sy*" +"PK 305+01 1" "WRAY 16-125" 197.40099608992915 -61.32666006981806 "PN" +"PK 305-00 1" "THA 17-18" 197.52022315087999 -63.191661482389996 "Be*" +"PK 306-00 1" "PN Th 2-A" 200.64150915219085 -63.35055963819972 "PN" +"PK 306-00 2" "PK 306-00 2" 201.55791666666664 -63.573888888888895 "PN?" +"PK 307-01 1" "PN Th 2-B" 202.16188095038748 -63.82953388288445 "PN" +"PK 305-03 1" "WRAY 17-59" 199.87460977195997 -66.15225064762 "PN" +"PK 307-03 1" "NGC 5189" 203.38699183926 -65.97417817452 "PN" +"PK 307-04 1" "PN MyCn 18" 204.89608174103998 -67.38104180476 "PN" +"PK 307-09 1" "WRAY 16-135" 206.34317784362 -71.48225505712 "PN" +"PK 308-12 2" "WRAY 17-65" 213.8975 -74.11583333333333 "PN?" +"PK 308-12 1" "Hen 2-105" 213.85325278984996 -74.21279724556 "PN" +"PK 313-21 1" "ESO 23-8" 255.50526134403998 -78.45442002474 "AG?" +"PK 307+05 1" "WRAY 16-128" 201.09140841723996 -57.52210737477999 "PN" +"PK 309+01 1" "PN VBRC 5" 206.00012916666665 -60.829683333333335 "PN" +"PK 308+00 2" "WRAY 17-63" 205.0945833333333 -62.10888888888889 "PN?" +"PK 307+01 1" "WRAY 16-129" 201.53625 -61.254444444444445 "PN?" +"PK 309+00 1" "WRAY 16-133" 205.65068280545 -61.37469790595999 "PN" +"PK 308-01 1" "ESO 97-3" 205.27083333333331 -64.26166666666667 "?" +"PK 307-01 2" "WRAY 17-61" 204.4195754784 -64.01153517413 "EmO" +"PK 302-02 1" "PN MaC 1-2" 208.61277916666668 -64.99337222222223 "PN" +"PK 310-03 1" "WRAY 16-143" 210.08125 -65.42472222222223 "PN?" +"PK 310-02 1" "WRAY 16-144" 211.403125 -64.68352777777778 "PN" +"PK 309-04 1" "WRAY 16-139" 208.12783646241 -66.39071595802 "PN" +"PK 309-04 2" "NGC 5315" 208.48738616486 -66.51412763424 "PN" +"PK 310-05 1" "PN LoTr 7" 213.85010416666665 -67.53218611111112 "PN" +"PK 313-12 1" "PN LoTr 11" 230.29349871903 -72.22385373879 "PN" +"PK 310+06 1" "SV* HV 4656" 205.99510602884996 -55.3286882815 "Em*" +"PK 309+06 1" "PK 309+06 1" 204.73749999999998 -56.11666666666667 "?" +"PK 311+03 1" "WRAY 16-141" 208.73205750594 -58.45458840486 "Sy*" +"PK 311+02 1" "WRAY 16-142" 209.55791590357998 -58.90877333609 "PN" +"PK 312-02 1" "WRAY 16-148" 213.53921486989 -63.42953314828 "Sy*" +"PK 312-01 1" "WRAY 16-151" 214.68058037915 -63.119469213950005 "PN" +"PK 311-00 1" "WRAY 17-64" 212.19625 -62.499722222222225 "PN" +"PK 311-02 1" "WRAY 16-146" 212.94280704643998 -64.27332043269 "PN" +"PK 313-05 1" "WRAY 17-67" 220.22166666666664 -65.84805555555555 "PN?" +"PK 320-28 1" "Hen 2-434" 293.4556891352 -74.54962657041 "PN" +"PK 313+04 1" "WRAY 16-145" 212.19568045775998 -57.07683512796 "Sy*" +"PK 315-01 1" "PN LoTr 9" 220.32474583333334 -61.332661111111115 "PN" +"PK 315-00 1" "WRAY 16-156" 218.32487500000002 -60.826750000000004 "PN" +"PK 314-00 2" "WRAY 16-154" 217.77557666987542 -61.34989857414029 "WR*" +"PK 314-00 1" "WRAY 16-155" 218.26708333333332 -60.91611111111111 "PN?" +"PK 315-04 1" "WRAY 16-158" 223.15097639305998 -64.0395279012 "PN" +"PK 317-05 1" "NGC 5844" 227.66916666666665 -64.67361111111111 "PN" +"PK 312+10 1" "NGC 5307" 207.76357536599 -51.20578770694 "PN" +"PK 315+05 2" "PN LoTr 8" 215.499875 -55.03805555555555 "PN" +"PK 315+05 1" "WRAY 16-152" 215.20383333333336 -55.46644444444445 "PN" +"PK 316-01 1" "PN LoTr 10" 221.58432916666666 -61.22649166666667 "PN" +"PK 318-03 1" "ESO 135-4" 227.1814375 -61.737322222222225 "PN" +"PK 318-02 3" "WRAY 16-161" 226.38515416666667 -60.81419444444444 "PN?" +"PK 318-02 2" "WRAY 16-163" 226.50791666666663 -61.35527777777778 "PN" +"PK 318-02 1" "WRAY 16-159" 226.03593988850997 -60.888928053360004 "PN" +"PK 319-04 1" "ESO 135-9" 231.86124999999998 -62.51888888888889 "?" +"PK 320-09 1" "HD 141969" 239.00706253171 -66.1525643947 "PN" +"PK 321-09 1" "ESO 100-7" 240.330675 -64.79821944444444 "EmG" +"PK 319-09 1" "WRAY 16-186" 236.7937622365 -66.48779685817 "Sy*" +"PK 321-11 1" "ESO 100-12" 243.10221026939 -66.65374027703 "EmG" +"PK 321-11 2" "ESO 100-16" 244.27961981671 -66.63349132272 "EmG" +"PK 315+09 1" "WRAY 16-147" 212.96691848157 -51.44005197834 "Sy*" +"PK 317+03 1" "PN VBRC 6" 220.40024836486 -56.25372750707 "PN" +"PK 320+00 2" "RCW 88" 226.78125 -57.80611111111111 "HII" +"PK 320+00 1" "RCW 87" 226.33025176321888 -57.53027915106846 "HII" +"PK 320-01 2" "WRAY 16-172" 229.58649355064 -59.63814559747999 "WR*" +"PK 320-01 1" "WRAY 16-172" 229.58649355064 -59.63814559747999 "WR*" +"PK 321-01 1" "WRAY 17-70" 231.72708333333335 -58.97722222222223 "PN?" +"PK 321-03 1" "PN HaTr 2" 232.578144 -61.027389 "PN" +"PK 322-05 1" "NGC 5979" 236.92155526555 -61.21820819841 "PN" +"PK 323-07 1" "WRAY 17-72" 241.12624999999997 -62.379444444444445 "PN?" +"PK 322-06 1" "WRAY 16-190" 238.0444604880712 -62.513112693707 "PN" +"PK 325-12 1" "HD 151895" 253.64637379019 -64.24126789696 "PN" +"PK 353-55 1" "ESO 289-19" 335.27879411645 -43.8816654572 "G" +"PK 319+06 1" "WRAY 16-157" 220.12888101728 -52.5824772089 "PN" +"PK 321+02 1" "WRAY 16-162" 226.32000000000002 -55.18625 "PN" +"PK 321+02 2" "RCW 90" 226.49668954162996 -55.98793925071 "PN" +"PK 321+01 1" "WRAY 16-169" 227.98566666666667 -55.66294444444444 "PN" +"PK 322-00 1" "PN Pe 2-8" 230.92867719335 -57.15700500734 "PN" +"PK 321-00 1" "WRAY 16-174" 229.87340346955003 -57.37366700462 "Em*" +"PK 321-00 2" "WRAY 17-69" 230.27833333333336 -57.94944444444444 "PN?" +"PK 323-02 1" "WRAY 16-184" 234.50514082462 -58.745123763959995 "PN" +"PK 322-02 1" "PN Mz 1" 233.56933790981 -59.15225150631 "PN" +"PK 325-04 1" "WRAY 16-195" 239.78687499999998 -58.397999999999996 "PN" +"PK 326-06 1" "WRAY 15-1440" 243.92621362974 -59.90028146784001 "PN" +"PK 325-07 1" "WRAY 17-73" 243.9633333333333 -61.04194444444444 "PN?" +"PK 326-10 1" "V* KX TrA" 251.14778369200002 -62.62057188591 "Sy*" +"PK 328-17 1" "IC 4662" 266.78830000000005 -64.63868055555557 "bCG" +"PK 317+19 1" "NGC 5408" 210.8371125 -41.37770833333333 "EmG" +"PK 325+03 1" "WRAY 16-182" 231.3860627633032 -52.8438729295804 "PN" +"PK 324+02 1" "WRAY 16-178" 230.90145833333332 -53.85780555555556 "PN" +"PK 323+02 1" "WRAY 16-175" 230.58075434095997 -54.13685861497 "PN" +"PK 324-01 1" "WRAY 15-1341" 235.495125 -56.60711111111111 "PN" +"PK 327-01 2" "WRAY 16-194" 239.53376373925 -55.69731978764 "PN" +"PK 326-01 1" "WRAY 16-193" 238.68517458533 -55.49278555784 "Sy*" +"PK 326-01 2" "PN G326.1-01.9" 238.2467041666667 -56.407552777777774 "PN" +"PK 325-01 1" "NAME PL 1547.3-5612" 237.82841666666667 -56.35605555555556 "PN" +"PK 327-02 1" "WRAY 16-198" 239.99015341244916 -55.92583408137055 "PN" +"PK 326-03 1" "WRAY 16-197" 239.94799999999998 -57.50161111111111 "PN?" +"PK 327-04 1" "WRAY 16-208" 243.50462258401996 -56.99112326483 "Sy*" +"PK 327-06 1" "WRAY 16-218" 245.87769425485 -58.32300019744001 "PN" +"PK 327-07 1" "WRAY 16-222" 247.3791666666667 -59.156666666666666 "PN" +"PK 331-13 1" "PN StWr 2-48" 261.28096970447 -59.53760736257999 "PN?" +"PK 319+15 1" "IC 4406" 215.60893374036996 -44.15060697583001 "PN" +"PK 322+14 1" "PN K 1-24" 219.56622414482996 -44.21818503987 "PN?" +"PK 324+09 1" "ESO 223-10" 225.41957425607998 -48.35076690782 "PN" +"PK 325+04 3" "WRAY 16-179" 231.17499999999998 -51.61666666666667 "PN?" +"PK 325+04 2" "WRAY 16-180" 231.20744158392662 -51.831274402785 "Sy*" +"PK 325+04 1" "WRAY 16-181" 231.28269309842995 -51.32837089625 "PN" +"PK 326+00 1" "IRAS 15411-5352" 236.2477 -54.0372 "HII" +"PK 328+01 1" "PN Lo 10" 237.37070833333334 -52.50452777777778 "PN" +"PK 328-00 1" "GRS G328.59 -00.52" 239.8683333333333 -53.74916666666667 "bub" +"PK 327-01 1" "WRAY 16-200" 240.24641666666668 -55.09447222222223 "PN" +"PK 330-02 3" "PN G329.5-02.2" 243.14166666666665 -54.39333333333333 "PN" +"PK 329-02 3" "PN G329.5-02.2" 243.14166666666665 -54.39333333333333 "PN" +"PK 330-02 1" "WRAY 16-212" 244.30986330043004 -53.53486444522 "PN" +"PK 330-02 2" "PN Sa 1-4" 243.83874999999995 -53.859833333333334 "PN?" +"PK 329-02 2" "PN Mz 2" 243.6349885712039 -54.9512946818853 "PN" +"PK 328-02 1" "WRAY 16-205" 242.67084801033002 -54.95962714072 "HII" +"PK 329-02 1" "Hen 2-149" 243.60110833333334 -54.79411666666667 "PN" +"PK 331-03 1" "WRAY 16-221" 246.96217519226997 -54.02458228283 "PN" +"PK 331-03 2" "WRAY 16-224" 247.49875000000006 -54.157777777777774 "PN" +"PK 330-03 1" "WRAY 16-219" 246.08933333333331 -54.60088888888889 "PN" +"PK 331-05 1" "HD 149427" 249.42791687299 -55.70733143785 "PN" +"PK 333-11 1" "ESO 180-6" 259.73333333333335 -56.906666666666666 "G" +"PK 341-24 1" "PN Lo 18" 287.4492333333333 -55.58639166666667 "PN" +"PK 327+10 1" "NGC 5882" 229.20815106385996 -45.64961563337 "PN" +"PK 329+02 1" "PN Sp 1" 237.92062929944 -51.52459606278 "PN" +"PK 329+01 1" "PN VBRC 7" 238.71254166666668 -51.376111111111115 "PN" +"PK 331+00 1" "PN Pe 1-4" 242.24510248486 -51.03229242241001 "PN" +"PK 331+00 2" "CD-50 10202" 242.94067482683 -51.29851051618 "AB*" +"PK 331-01 1" "PN Mz 3" 244.30579807604 -51.9863088593 "PN" +"PK 331-02 1" "WRAY 16-217" 245.5597218545324 -53.6817008133097 "PN" +"PK 331-02 2" "WRAY 16-220" 246.1574583333333 -53.376138888888896 "PN" +"PK 332-03 1" "WRAY 16-223" 247.47206721913997 -53.38734382721 "PN" +"PK 332-04 1" "WRAY 16-227" 248.83845907991002 -53.836496666399995 "PN" +"PK 333-04 1" "PN HaTr 3" 249.9066041666666 -52.820347222222225 "PN" +"PK 336-08 1" "ESO 180-5" 259.29 -53.60583333333334 "?" +"PK 334-09 1" "IC 4642" 257.93835218711 -55.40046213942999 "PN" +"PK 327+14 1" "ESO 328-4" 225.35416666666669 -41.915277777777774 "?" +"PK 327+13 1" "WRAY 16-165" 226.55714077613996 -42.99902768914001 "PN" +"PK 330+05 1" "PN Lo 9" 235.55558333333332 -47.67953611111111 "PN" +"PK 331+03 1" "WRAY 16-192" 238.36922083333332 -48.72303333333333 "PN?" +"PK 330+04 1" "HD 330036" 237.81637086038836 -48.749599753154165 "PN" +"PK 332+03 1" "WRAY 16-199" 240.09181364506998 -48.25988589341 "PN" +"PK 330+04 2" "WRAY 16-189" 237.83273894975997 -48.4354119147 "PN" +"PK 332+01 1" "WRAY 16-202" 241.73738270335997 -49.44488648068 "Sy*" +"PK 333+01 1" "PN Pe 1-5" 243.83386195833327 -49.2226638888889 "PN" +"PK 333-00 1" "WRAY 16-216" 245.23124999999993 -50.025 "PN" +"PK 332-00 2" "WRAY 16-214" 244.86818797866 -50.63075565407999 "LP*" +"PK 335-01 1" "WRAY 15-1508" 248.55625 -49.35341666666667 "PN" +"PK 336-02 1" "EM* VRMF 104" 250.52733333333327 -49.75194444444445 "PN?" +"PK 335-03 1" "PN HaTr 4" 251.25017499999998 -51.20565555555556 "PN" +"PK 337-05 1" "WRAY 15-1594" 255.40415096817003 -50.38266087446 "Em*" +"PK 336-05 1" "WRAY 15-1585" 254.90053874081997 -51.70239486578 "PN" +"PK 336-07 1" "PN K 2-17" 257.39945068458997 -52.21731937384 "PN" +"PK 336-06 1" "PN PC 14" 256.56145833333335 -52.50013888888889 "PN" +"PK 338-08 1" "NGC 6326" 260.1927166666667 -51.754213888888884 "PN" +"PK 337-09 1" "WRAY 16-266" 260.6541629080217 -52.77627458906389 "PN" +"PK 339-09 1" "ESO 228-5" 263.60613004412 -51.04354572975 "G" +"PK 340-14 1" "PN Sa 1-6" 270.24781034497 -52.73889902524 "PN" +"PK 342-14 1" "PN Sp 3" 271.81583647142 -51.01950399816 "PN" +"PK 341-15 1" "ESO 182-4" 272.37718088123 -52.56565692518 "EmG" +"PK 329+12 1" "ESO 328-40" 229.41250000000002 -42.6225 "G" +"PK 337+01 1" "PN Pe 1-7" 247.60777364554997 -46.04746232946 "PN" +"PK 336+01 1" "PN Pe 1-6" 245.9762875 -46.70424444444445 "PN" +"PK 336-00 1" "HD 148937" 248.4682788273 -48.11124344965 "SB*" +"PK 336-01 1" "EM* VRMF 90" 249.5367916666667 -48.71227777777778 "PN?" +"PK 339-03 1" "PN MaC 1-3" 255.36535870161998 -47.75985050724 "Sy*" +"PK 340-04 1" "PN Sa 1-5" 257.8641441096587 -47.4172363827424 "PN" +"PK 341-09 1" "WRAY 16-290" 264.0289234622899 -49.42923399327999 "PN" +"PK 345-13 1" "PN StWr 2-37" 272.64733333333334 -48.430388888888885 "PN?" +"PK 331+16 1" "NGC 5873" 228.21191901194996 -38.12544041579 "PN" +"PK 335+09 1" "PN K 1-31" 238.30213750000001 -41.84059722222223 "PN" +"PK 336+08 1" "PN StWr 4-10" 240.55438787031 -41.56001865709 "PN" +"PK 338+05 2" "V* QS Nor" 245.28233486603 -42.39835488007001 "Sy*" +"PK 338+05 1" "IC 4599" 244.84670336596002 -42.26019692047 "PN" +"PK 338+01 1" "WRAY 15-1520" 249.61928736369 -45.39484810979 "Be*" +"PK 339+00 2" "WRAY 16-232" 250.81820899289994 -46.011779697959994 "Be*" +"PK 339+00 1" "WRAY 16-230" 250.38003744431998 -45.21794477755 "Sy*" +"PK 339-00 1" "AJG 54" 251.325 -46.153055555555554 "HII" +"PK 341-00 1" "WRAY 15-1552" 253.35276112803996 -44.88133006193 "Be*" +"PK 342-02 1" "PN Pe 1-8" 256.5937083333333 -44.219277777777776 "PN" +"PK 342-02 2" "WRAY 16-251" 256.87751437884 -44.38065086337999 "PN?" +"PK 342-04 1" "WRAY 16-261" 259.8854166666667 -45.8875 "PN" +"PK 344-06 1" "WRAY 16-278" 262.51616993231 -45.38075551993 "PN" +"PK 342-06 1" "PN Cn 1-4" 261.9532708333333 -46.92813888888889 "PN" +"PK 343-07 1" "PN PC 17" 263.92389222379995 -46.997020356300006 "PN" +"PK 344-08 1" "V* AE Ara" 265.27049282561995 -47.057552578999996 "Sy*" +"PK 345-08 1" "PN Tc 1" 266.39703300509996 -46.089921422980005 "PN" +"PK 345-11 1" "ESO 279-14" 269.90074734642997 -46.64772108676 "Sy2" +"PK 348-13 1" "IC 4699" 274.63352090400997 -45.98381533833 "PN" +"PK 348-16 1" "ESO 281-7" 278.38696510621 -46.24520705351 "EmG" +"PK 006-41" "PN G006.0-41.9" 316.47322042706 -37.14454993608 "PN" +"PK 006-41 1" "PN G006.0-41.9" 316.47322042706 -37.14454993608 "PN" +"PK 006+06 1" "PK 006+06 1" "PN" +"PK 049+35 1" "PK 049+35 1" "PN" +"PK 321-06 1" "PK 321-06 1" "PN" +"PK 345-10" "PK 345-10" "PN" +"PK 351+11 2" "PK 351+11 2" "PN" +"PK 002+64" "PK 002+64" "PN" +"PK 002+02 A" "PK 002+02 A" "PN" +"PK 002+02 B" "PK 002+02 B" "PN" +"PK 002+01 B" "PK 002+01 B" "PN" +"PK 326-01 9" "PK 326-01 9" "PN" +"PK 358-03 10" "PN ShWi 7" 271.2730618019729 -29.337618848506104 "PN" +"PK 001-00 3" "PN Bl 3-19" 267.9812541666667 -27.8 "Be*" +"PK 285+11 1" "2MASX J11090905-4802559" 167.28778126459 -48.04895185825 "G" +"PK 357-07 1" "PN G357.4-07.2" 272.31828333333334 -34.79424722222222 "PN" +"PK 221+05 2" "PN Y-C 37" 111.61543175694 -5.367120345140001 "PN?" +"PK 251+00 1" "WRAY 17-15" 123.33872916666667 -33.01793055555555 "PN" +"PK 277-01 1" "IRAS 09362-5413" 144.4658902767029 -54.45241097532778 "PN" +"PK 257-00 1" "WRAY 17-19" 126.77394166666664 -39.03747222222222 "PN?" +"PK 270-02 1" "WRAY 17-23" 134.76217785369 -50.39450518959 "PN" +"PK 358+04 3" "PN SaWe 2" 261.75082083333336 -27.676419444444445 "PN" +"PK 358+00 1" "PN G358.6+00.7" 264.84458333333333 -29.69613888888889 "PN" +"PK 332-16 2" "PN HaTr 7" 268.53936985242 -60.83268324732 "PN" +"PK 251-03 1" "WRAY 17-10" 119.277275 -36.11387777777778 "PN" +"PK 308+00 1" "WRAY 17-62" 204.67718749999997 -61.92931388888889 "PN" +"PK 313+01 1" "WRAY 17-66" 213.97195833333333 -60.02719444444445 "PN" +"PK 358-02 6" "PN G358.6-02.4" 268.00142500000004 -31.2972 "PN" +"PK 003+02 2" "PN PBOZ 11" 266.135775 -24.22447777777778 "PN" +"PK 357+05 1" "PK 357+05 1" 259.70666666666665 -27.86722222222222 "PN?" +"PK 199+14 1" "EM* StHA 62" 110.00644301999002 18.29052944578 "PN" +"PK 307-03 2" "PN G307.5-03.6" 204.38516254803997 -66.1426516601 "PN" +"PK 316+00 1" "IRAS 14345-5858" 219.58332151048 -59.19616867905 "PN" +"PK 052+50 1" "BD+33 2642" 237.99952264502 32.948424857019994 "pA*" +"PK 350+07 1" "IRAS 16478-3217" 252.7763559504275 -32.3834790542564 "PN" +"PK 342-06 2" "PN G342.3-06.0" 260.71954166666666 -47.04685555555555 "PN" +"PK 356-01 1" "PN RPZM 36" 266.29083333333335 -32.77138888888888 "PN" +"PK 000-01 14" "PN G000.6-01.0" 267.79793333333333 -28.9406 "PN" +"PK 359-01 4" "PN RPZM 43" 267.9534541666667 -30.04231944444445 "PN" +"PK 351-06 4" "PN G351.7-06.6" 268.2619583333333 -39.40247222222222 "PN" +"PK 000-01 10" "PN G000.1-01.9" 268.3517456613599 -29.82992322078 "PN" +"PK 002-02 5" "PN KFL 2" 270.24969230622 -28.272146094100002 "PN" +"PK 352-08 1" "PN SB 38" 270.87095531701 -39.35746562551 "PN" +"PK 359-06 2" "PN G359.3-06.0" 272.13062916666667 -32.49715277777778 "PN" +"PK 003-07 1" "PN KFL 19" 275.78704166666665 -29.72365833333333 "PN" +"PK 020+00 1" "IRAS 18231-1047" 276.49204000000003 -10.75798 "PN" +"PK 029-07 1" "PN LSA 1" 288.48204999999996 -6.3145 "PN" +"PK 358-01 3" "JaSt 64" 267.23343909799996 -31.111849026540007 "PN" +"PK 358+09 2" "LEDA 89007" 256.93966279703 -25.060798573640003 "PN?" +"PK 002+01 2" "PN K 5-16" 266.3682777916666 -25.636909361111112 "PN" +"PK 006+03 3" "IRAS 17448-2131" 266.95191258347995 -21.536434532319998 "PN" +"PK 351-06 3" "PN SB 34" 268.03924533538 -39.5374627344 "PN" +"PK 354-07 2" "PN SB 40" 270.7320416666667 -37.13697222222223 "PN" +"PK 003-04 11" "PN KFL 12" 272.6283625 -28.323030555555555 "PN" +"PK 006-05 1" "PN G006.5-05.8" 275.7526875 -26.088055555555556 "PN" +"PK 033-02 2" "CBSS 1" 285.06722083333335 -0.2423861111111111 "PN" +"PK 041+01 1" "IRAS 18586+0821" 285.27384490977 8.42664747105 "PN" +"PK 044-00 1" "AGP 2" 288.405 10.658611111111112 "PN" +"PK 046-01 1" "IRAS 19204+1122" 290.70975 11.465239 "PN" +"PK 070+03 1" "PN G070.8+03.7" 298.57239583333336 35.11734166666667 "PN" +"PK 059-01 2" "PN We 1-8" 297.2212083333334 22.420638888888888 "PN" +"PK 332-16 1" "PN HaTr 6" 267.97008945051374 -60.38934749355389 "PN" +"PK 359-04 5" "PN KFL 3" 270.72054583333335 -31.399580555555556 "PN" +"PK 359-07 2" "PN G359.9-07.4" 273.8853333333334 -32.63341666666667 "PN" +"PK 029-00 1" "PN G029.2+00.0" 281.2224166666667 -3.3424722222222223 "PN" +"PK 149-03 1" "PN IsWe 1" 57.27460565837 50.004138477219996 "PN" +"PK 233-10 1" "PN G233.0-10.1" 102.66962500000001 -22.436444444444444 "PN" +"PK 255-03 1" "PN G255.3-03.6" 121.61816666666665 -38.89 "PN" +"PK 260+00 1" "PK 260+00 1" 130.56670833333334 -40.73522222222222 "RNe" +"PK 321+02 3" "CVMP 1" 227.35483333333335 -55.55158333333333 "PN" +"PK 358+06 1" "PK 357+04" 259.6023333333334 -26.371944444444445 "PN?" +"PK 347-02 1" "PN RPZM 15" 261.16336474172005 -40.871001955649284 "PN?" +"PK 355+02 4" "PN G355.4+02.3" 261.2644583333333 -31.477361111111108 "PN" +"PK 000+04 4" "PN G000.3+04.2" 262.5509583333333 -26.350638888888888 "PN" +"PK 002+05 2" "PN K 5-3" 262.6716583333333 -23.75011111111111 "PN" +"PK 347-06 1" "IRAS 17364-4222" 265.0140702811074 -42.40163637752973 "PN" +"PK 014+03 1" "IRAS 17597-1442" 270.6594491250871 -14.701099553516663 "PN" +"PK 356-07 4" "PN SB 45" 271.71872916666666 -36.111894444444445 "PN" +"PK 001-05 2" "PN SB 6" 273.3160083333333 -30.43291388888889 "PN" +"PK 014-11 1" "PN SaWe 4" 285.57341666666673 -21.44758333333333 "PN" +"PK 049+02 2" "VSP 2-30" 288.32340481194 15.655819287250003 "PN" +"PK 104-01 2" "PN G104.1-01.4" 337.5284 56.198283333333336 "PN" +"PK 105+00 1" "GLMP 1062" 338.7528659434649 58.41149744757288 "HII" +"PK 120+18 1" "LBN 120.29+18.39" 356.25944999999996 80.94989444444444 "PN" +"PK 001-00 4" "PN G001.5-00.7" 268.0363208333334 -28.037933333333335 "PN" +"PK 356-06 3" "PN SB 48" 271.30998333333326 -35.468761111111114 "PN" +"PK 004-05 6" "PN SB 8" 273.95958333333334 -27.816666666666666 "PN" +"PK 326+07 1" "NeVe 3-2" 229.93287657923003 -48.99857809083999 "PN" +"PK 327-05 1" "PN KoRe 1" 244.79376249999999 -57.982077777777775 "PN" +"PK 340+03 1" "PN MeWe 2-5" 248.7070833333333 -42.06194444444444 "PN" +"PK 335-03 2" "PN MeWe 1-7" 251.98779166666668 -50.71342222222223 "PN" +"PK 358+08 1" "Terz N 29" 257.0822083333333 -25.228222222222218 "PN?" +"PK 336-11 1" "PN MeWe 1-10" 263.61750996139995 -54.48265060148 "PN" +"PK 003+04 1" "PN K 5-6" 263.8803333333333 -23.196888888888893 "PN" +"PK 355-01 2" "PN G355.4-01.4" 265.0014458333333 -33.59230277777778 "PN" +"PK 353-03 2" "PN K 6-11" 266.1476416666667 -36.23379722222222 "PN" +"PK 358-01 5" "PN G358.9-01.5" 267.33342076881297 -30.601654923734724 "PN" +"PK 001-01 6" "PN G001.3-01.0" 268.277375 -28.302555555555557 "PN" +"PK 352-06 1" "PN G352.0-06.7" 268.58678189254 -39.17718958777 "PN" +"PK 006-03 4" "PN KFL 15" 273.58051666666665 -25.347561111111112 "PN" +"PK 001-03 9" "PN ShWi 7" 271.2730618019729 -29.337618848506104 "PN" +"PK 228-11 1" "PN G228.5-11.4" 99.41304166666667 -18.956594444444445 "PN" +"PK 272-05 1" "PN MeWe 1-1" 133.40124999999998 -54.08527777777778 "PN" +"PK 312-00 1" "SV* HV 6516" 213.99866350083997 -61.89729641120999 "AB*" +"PK 336+04 1" "PN G336.1+04.1" 243.76167916666662 -45.19836111111111 "PN" +"PK 357+07 2" "PN G357.2+07.2" 257.81166666666667 -27.191944444444445 "PN" +"PK 354+04 3" "PN G354.4+04.0" 258.975 -31.366666666666667 "PN" +"PK 355+03 4" "PN Th 3-5" 259.7638916666666 -30.898322222222223 "PN" +"PK 359+05 3" "Terz N 19" 261.3484380483354 -26.19803351882611 "PN" +"PK 004+06 3" "NAME G 4.4+6.4" 262.96951046944 -21.825199614650003 "PN" +"PK 000-00 4" "PN G000.7-00.8" 267.6952375 -28.74417777777778 "PN" +"PK 000-00 5" "PN G000.9-00.9" 267.85211666666675 -28.595241666666666 "PN" +"PK 050+19 1" "HD 341617" 272.0836906358 24.17870040201 "pA*" +"PK 356-08 1" "PN G356.1-08.6" 273.1661375 -36.53032222222222 "PN" +"PK 005-03 3" "PN KFL 13" 273.18783033324996 -25.74009623124 "PN" +"PK 354-10 1" "PN G354.7-10.0" 273.9125291666667 -38.465566666666675 "PN" +"PK 005-04 2" "PN KFL 16" 274.2248640772 -26.390028379119997 "PN" +"PK 021+00 1" "VSP 2-19" 276.94020416666655 -9.636938888888887 "PN" +"PK 011-07 2" "PN G011.4-07.3" 279.67935414008 -22.404020347109995 "PN" +"PK 032-00 1" "PN G032.9-00.7" 283.5274958333333 -0.33343055555555556 "PN" +"PK 001-01 5" "PN G001.2-01.2 a" 268.39758333333333 -28.480905555555555 "PN" +"PK 001-03 5" "PN ShWi 3" 270.82273742302 -29.84522173541 "PN?" +"PK 160-02 1" "PN G160.7-02.9" 69.33889166666667 42.78580833333333 "PN" +"PK 240-19 1" "PN G240.8-19.6" 96.15275 -33.08233333333334 "PN?" +"PK 144+65 1" "V* BE UMa" 179.43678327373 48.93842048827 "CV*" +"PK 310+01 2" "WeKG 3" 208.60441250000002 -60.45567222222222 "PN" +"PK 003+66 1" "NAME PN SkAc 1" 214.09145500511997 13.873402453829998 "PN" +"PK 357+04 2" "PN PBOZ 1" 260.4083208333333 -28.92081111111111 "PN" +"PK 357+01 4" "PN K 6-2" 263.4619625 -30.710208333333334 "PN" +"PK 358+01 6" "PN G358.4+01.6" 263.84477083333326 -29.3715 "PN" +"PK 358+01 7" "PN G358.6+01.7" 263.9061249999999 -29.221583333333335 "PN" +"PK 003+04 2" "PN G003.1+04.1" 264.3340291666667 -24.057733333333335 "PN" +"PK 359+01 4" "WR 99" 264.82612891646994 -28.25234379719 "WR*" +"PK 358-01 4" "PN G358.6-01.1" 266.7175 -30.628555555555558 "PN" +"PK 005+02 2" "PN G005.1+02.0" 267.463675 -23.46229722222222 "PN" +"PK 009-06 2" "PN SB 15" 277.81104166666665 -23.968083333333333 "PN" +"PK 032-01 1" "CBSS 2" 284.0654166666667 -1.5668333333333333 "PN" +"PK 083+05 1" "PN G083.7+05.7" 305.5681875 47.06554166666666 "PN" +"PK 100+04 1" "IRAS 21394+5844" 325.24717400000003 58.97743800000001 "PN" +"PK 285-02 2" "THA 35-II-27" 154.88542083333334 -60.22485555555556 "PN" +"PK 308+07 1" "PN MeWe 1-3" 202.02054024491 -54.699669497180004 "PN" +"PK 344-01 2" "IRAS 17088-4227" 258.09186201201993 -42.51152407395 "PN" +"PK 359+01 6" "PN G359.0+01.1" 264.69129166666664 -29.150444444444442 "PN" +"PK 000+01 1" "PN G000.5+01.9" 264.88007916666663 -27.462991666666667 "PN" +"PK 009+05 1" "Hen 3-1475" 266.30909139291 -17.94632726839 "PN" +"PK 001+00 4" "PN G001.6+00.1" 267.19239166666665 -27.427425 "PN" +"PK 000-06 2" "PN SB 3" 273.06033333333335 -31.33277777777778 "PN" +"PK 034-11 1" "SS 441" 294.07299445646 -3.89030516309 "PN" +"PK 076-05 1" "LS II +34 26" 312.06930056402 34.45676236933 "PN" +"PK 110+01 1" "IRAS 22568+6141" 344.71511799999996 61.96209000000001 "PN" +"PK 208-07 1" "PN G208.9-07.8" 94.06409893778002 -0.00695221759 "PN" +"PK 222-04 1" "IRAS 06518-1041" 103.55598222596001 -10.760632554260003 "PN" +"PK 314+02 1" "IRAS 14177-5824" 215.33311899999998 -58.63959500000001 "PN" +"PK 341+09 1" "PN SB 25" 243.40973749999998 -37.999575 "PN" +"PK 340-03 1" "SS 293" 255.79196063020999 -47.007703301810004 "pA*" +"PK 353-02 2" "PN K 5-8" 264.82145854260995 -35.7831413231 "Sy*" +"PK 000+01 4" "PN G000.8+01.3" 265.6361416666667 -27.55245 "PN" +"PK 002+01 4" "PN JaFu 1" 265.9890833333333 -26.198327777777777 "PN" +"PK 352-04 2" "PN SB 37" 266.9694958333333 -37.80086111111111 "PN" +"PK 003+01 1" "PN G003.9+01.6" 267.1186041666667 -24.69029722222222 "PN" +"PK 355-07 1" "PN SB 42" 271.4689833333333 -36.76038888888889 "PN" +"PK 356-07 3" "PN G356.0-07.4 A" 271.7831375 -36.04601111111111 "PN" +"PK 002-05 2" "PN KFL 14" 273.2546083333333 -29.420997222222223 "PN" +"PK 022-04 1" "EM* AS 321" 281.76660733148 -11.6866534632 "PN" +"PK 016-07 2" "PN SB 22" 282.12579166666666 -17.731666666666666 "PN" +"PK 346+14 1" "PN G346.6+14.6" 243.73333333333332 -30.52861111111111 "PN" +"PK 342-00 1" "IRAS 16529-4341" 254.14155399999999 -43.770762999999995 "PN" +"PK 001+03 1" "PN G001.5+03.6" 263.84197499999993 -25.71291111111111 "PN" +"PK 358+01 8" "PN G358.8+01.7" 263.96937499999996 -28.973805555555554 "PN" +"PK 017+11 1" "SS 318" 265.5599583333333 -8.722083333333334 "PN" +"PK 000-01 8" "PN G000.0-01.0" 267.54168333432 -29.317356175039993 "PN" +"PK 000-01 12" "PN G000.3-01.6" 268.2175 -29.500027777777778 "PN" +"PK 005-01 1" "PN PBOZ 34" 271.35628749999995 -25.22700833333333 "PN" +"PK 358-07 2" "PN SB 52" 272.91625000000005 -34.00610833333334 "PN" +"PK 005-06 2" "PN G005.4-06.1" 275.4795833333334 -27.162777777777777 "PN" +"PK 060+01 2" "IRAS 19367+2458" 294.71710929647037 25.092351428877222 "PN" +"PK 065+03 1" "PN G065.4+03.1" 295.94972083333334 30.235525 "PN" +"PK 243-37 1" "PN PRTM 1" 75.75721626934 -39.762368339169996 "PN" +"PK 290+27 1" "ESO 379-13" 179.17875 -34.42861111111111 "G" +"PK 308-03 1" "IRAS 13427-6531" 206.60704882519371 -65.7733951719986 "PN?" +"PK 321+08 1" "PN MeWe 1-5" 221.64626607985 -50.39020441632999 "PN" +"PK 323-04 1" "NAME WKK136-337" 237.62045833333335 -59.980555555555554 "PN" +"PK 334-01 1" "PN G334.3-01.4" 247.77772499999995 -50.443911111111106 "PN" +"PK 000+02 3" "PN K 6-4" 264.42887083333335 -27.819319444444446 "PN" +"PK 001+01 2" "PN K 6-10" 265.82062499999995 -26.73820555555556 "PN" +"PK 343-09 1" "PN G343.7-09.6" 266.38958660265 -47.730984438680004 "PN" +"PK 001+01 5" "PN G001.6+00.9" 266.40566666666666 -27.021777777777775 "PN" +"PK 353-04 2" "PN G353.4-04.5" 267.00473303040997 -36.8359074062 "PN" +"PK 353-05 2" "PN JaFu 2" 267.54625 -37.0575 "PN" +"PK 000-00 3" "PN G000.0-01.2" 267.5965583333333 -28.552022222222224 "PN" +"PK 010+04 2" "V* V4334 Sgr" 268.136223 -17.68556 "CV*" +"PK 003-02 4" "PN KFL 4" 270.71529166666676 -27.683222222222224 "PN" +"PK 001-05 1" "PN SB 5" 272.8141583333333 -30.630472222222224 "PN" +"PK 357-09 1" "PN G357.2-09.8" 275.03815416666663 -36.122525 "PN" +"PK 007-05 1" "PN G007.7-05.3" 275.9297916666667 -24.791333333333338 "PN" +"PK 004-09 1" "PN G004.6-09.9" 278.9259291666666 -29.64014722222222 "PN" +"PK 017-09 1" "PN G017.5-09.2" 284.31889880635 -17.84692065362 "PN" +"PK 013-15 1" "PN We 4-5" 288.54777083333335 -23.691069444444445 "PN" +"PK 071+04 1" "PN G071.5+04.9" 297.695 36.33361111111111 "PN" +"PK 093-00 2" "[D75b] Em* 21-021" 322.49362991115 51.06675664570001 "PN" +"PK 275-01 2" "NeVe 3-1" 143.5057 -53.19946944444444 "PN" +"PK 280+01 1" "KLSS 1-12" 152.63958333333335 -53.93555555555555 "PN" +"PK 314+10 1" "PN MeWe 2-4" 210.31356986227996 -50.67012188519 "PN" +"PK 331-12 1" "CD-59 6479" 259.08774625050995 -59.48982878009 "PN" +"PK 002+06 1" "IRAS 17248-2254" 261.97370228296 -22.95517533564 "PN" +"PK 001+02 2" "PN G001.9+02.3" 265.3521666666667 -26.064833333333333 "PN" +"PK 357-06 2" "PN G357.3-06.5" 271.53458750000004 -34.55853333333333 "PN" +"PK 355-08 1" "PN G355.8-08.7" 273.0986833333333 -36.88158888888889 "PN" +"PK 014-06 1" "PN SB 19" 279.9175 -19.235555555555557 "PN" +"PK 035+03 1" "IRAS 18411+0343" 280.90251347700996 3.77784451861 "PN" +"PK 044+00 1" "AGP 1" 288.06708333333336 10.609166666666667 "PN" +"PK 260+00 2" "IRAS 08355-4027" 129.35246304166668 -40.63530305555556 "PN" +"PK 085+52 1" "PG 1520+525" 230.44401463768 52.36774092815 "PN" +"PK 331+01 1" "PN G331.0+01.2" 241.07445683407002 -50.83403898356 "PN" +"PK 348+06 1" "WRAY 15-1537" 252.20229166666667 -35.016 "PN" +"PK 337-04 1" "PN MeWe 1-9" 254.37044583333332 -49.781888888888886 "PN" +"PK 358+07 2" "Terz N 8" 258.14016666666663 -26.423394444444448 "PN" +"PK 003+06 1" "IRAS 17269-2235" 262.4998739221804 -22.628756865075 "pA?" +"PK 359+01 5" "PN G359.2+01.3" 264.61558333333335 -28.86702777777778 "PN" +"PK 000+01 5" "PN G000.9+01.1" 265.84710416666667 -27.567658333333334 "PN" +"PK 001+01 6" "PN G001.7+01.3" 266.155125 -26.790416666666665 "PN" +"PK 351-06 2" "PN G351.2-06.3" 267.6154166666667 -39.671499999999995 "PN" +"PK 004-05 7" "PN G004.7-05.5" 274.5370833333334 -27.5323 "PN" +"PK 005-05 3" "IRAS 18176-2717" 275.18554798217997 -27.263413194721938 "PN" +"PK 047+01 1" "IRAS 19092+1326" 287.89931220971 13.51982315707 "PN" +"PK 069+01 2" "PN G069.2+01.2" 300.17533333333324 32.4615 "PN" +"PK 257-02 1" "[M81] I-224" 124.04172200000001 -39.864185 "PN" +"PK 277+03 1" "PN MeWe 2-2" 149.54416666666668 -50.659444444444446 "PN" +"PK 283-01 2" "PN MeWe 1-2" 153.60458333333332 -58.196666666666665 "PN" +"PK 298+06 1" "NAME WKK171-090" 184.63636666666667 -55.90121666666666 "PN" +"PK 310+01 1" "PN G310.4+01.3" 208.345875 -60.563138888888886 "PN" +"PK 313+02 1" "IRAS 14132-5839" 214.2159599286314 -58.8861103972678 "PN" +"PK 335-04 1" "PN MeWe 1-8" 252.16747500000002 -51.155627777777774 "PN" +"PK 354+06 1" "PK 354+06 1" 256.75416666666666 -29.62666666666667 "PN?" +"PK 354+05 1" "IRAS 17084-3025" 257.92057539845 -30.480412682529998 "PN" +"PK 341-06 1" "PN G341.7-06.0" 260.26213333333334 -47.59091666666667 "PN" +"PK 358+01 5" "PN G358.4+01.7" 263.754 -29.37102777777778 "PN" +"PK 354-01 1" "PN G354.6-01.7" 264.72631666666666 -34.46091666666667 "PN" +"PK 001+00 2" "PN G001.1+00.8" 266.2961875 -27.54388888888889 "PN" +"PK 355-03 4" "PN G355.0-03.7" 267.1233333333333 -35.091705555555556 "PN" +"PK 001-00 5" "PN Bl 3-19" 267.9812541666667 -27.8 "Be*" +"PK 359-05 1" "PN KFL 9" 271.8307541666667 -31.715819444444442 "PN" +"PK 359-08 1" "PN SB 55" 274.8597125 -33.61801666666666 "PN" +"PK 058+09 1" "NAME Si 1-2" 286.53094492051 27.215970927510003 "PN" +"PK 051+00 1" "IRAS 19234+1627" 291.41868910749 16.55161407916 "PN" +"PK 029-21 1" "BD-13 5550" 300.45762148388 -12.68826884866 "pA*" +"PK 073-02 2" "PK 073-02 2" 306.1141666666666 34.01305555555555 "PN?" +"PK 279-00 1" "WRAY 18-173" 148.36278157284 -54.87775405759 "PN" +"PK 299+00 1" "V* BI Cru" 185.85830528538997 -62.63777452465 "Sy*" +"PK 301-01 1" "[GM76] 96" 188.65005086319997 -64.30470490903 "PN" +"PK 315+08 1" "PN MeWe 1-4" 214.37166666666667 -52.44083333333333 "PN" +"PK 326+02 1" "IRAS 15359-5226" 234.92934459629203 -52.60936846092028 "PN" +"PK 341+08 1" "PN SB 27" 244.80848625855998 -37.7910864813 "Y*O" +"PK 343-05 1" "PN G343.9-05.8" 261.7594438530148 -45.5441199897024 "PN" +"PK 002+01 3" "PN G002.6+01.7" 266.2858333333333 -25.733611111111113 "CV*" +"PK 001+00 3" "PN G001.2+00.7" 266.44534306413 -27.511650225850005 "PN" +"PK 000-01 11" "IRAS 17486-2930" 267.97315376312 -29.514869303710004 "Mi*" +"PK 012+04 1" "IRAS 17514-1555" 268.5880459999999 -15.931111999999999 "PN" +"PK 356-07 5" "PN G356.3-07.3" 271.8394666666667 -35.762233333333334 "PN" +"PK 003-06 2" "PN G003.3-06.1" 274.4431791666667 -29.10208888888889 "PN" +"PK 000-08 1" "PN G000.1-08.0" 274.703325 -32.79945277777777 "PN" +"PK 019-04 2" "IRAS 18395-1418" 280.60331749782665 -14.253080823102222 "PN" +"PK 016-07 1" "PN SB 21" 282.04568333333333 -18.49388888888889 "PN" +"PK 059-00 2" "IRAS 19434+2251" 296.39281900000003 22.975557 "PN" +"PK 072-07 1" "IRAS 20406+2953" 310.69147601812 30.068466901650005 "OH*" +"PK 282-00 1" "IRAS 10115-5640" 153.33197779058418 -56.925632342085 "PN" +"PK 355+04 2" "Terz N 140" 258.76292916666665 -30.343786111111108 "PN" +"PK 357+03 6" "PK 357+03 6" 261.1708333333333 -28.741666666666667 "PN?" +"PK 000+01 2" "PN G000.2+01.7" 264.91355416666664 -27.78987777777778 "PN" +"PK 353-02 1" "PN G353.6-02.6" 265.19003333333336 -35.732616666666665 "PN?" +"PK 001+01 3" "PN G001.0+01.3" 265.70816666666667 -27.355472222222225 "PN" +"PK 356-03 5" "PN G356.8-03.0" 267.54472499999997 -33.238324999999996 "PN" +"PK 000-01 9" "PN G000.1-01.2" 267.7000416666666 -29.412166666666668 "PN" +"PK 345-10 1" "PN MeWe 1-11" 268.1961 -46.70045555555556 "PN" +"PK 000-01 13" "JaSt 96" 268.48782916666664 -29.337691666666665 "PN" +"PK 358-05 5" "PN G358.7-05.1" 270.8688833333333 -32.62401666666667 "PN" +"PK 004-03 2" "PN KFL 10" 272.0054666666667 -26.900422222222222 "PN" +"PK 004-03 3" "PN KFL 11" 272.5510166666667 -27.27638888888889 "PN" +"PK 001-06 3" "PN SB 4" 273.55909583333334 -31.18586388888889 "PN" +"PK 009-07 1" "PN GJJC 1" 279.0950833333333 -23.92173888888889 "PN" +"PK 017-07 1" "PN SB 23" 282.55495833333333 -17.03933333333333 "PN" +"PK 039-02 2" "IRAS 19084+0422" 287.72234490479 4.45785549245 "PN" +"PK 053+01 1" "PN G053.0+01.7" 290.7288916666667 18.70223888888889 "PN" +"PK 053-02 1" "PN G053.1-02.1" 294.36625000000004 16.891944444444444 "PN" +"PK 253+00 1" "PN MeWe 2-1" 125.21833333333336 -35.27611111111111 "PN" +"PK 309-02 1" "PN MaC 1-2" 208.61277916666668 -64.99337222222223 "PN" +"PK 324+03 1" "IRAS 15154-5258" 229.78650414734582 -53.16381470275861 "PN" +"PK 359+07 1" "2MASX J17164680-2459103" 259.1950083333333 -24.986219444444448 "GiG" +"PK 000+06 1" "Terz N 67" 260.72208333333333 -25.416944444444447 "PN" +"PK 357+04 3" "PK 357+04 3" 261.0625 -28.778333333333332 "PN?" +"PK 353-01 1" "PN G353.8-01.2" 263.864 -34.79486111111111 "PN" +"PK 000+01 3" "PN G000.4+01.1" 265.60461666666663 -27.92665277777778 "PN" +"PK 356-02 3" "PN K 6-12" 266.8241666666667 -33.26083333333333 "PN" +"PK 001-00 6" "JaSt 81" 268.01785029702 -27.61056545355 "PN" +"PK 349-09 1" "PN G349.7-09.1" 269.8620833333334 -42.41444444444444 "PN" +"PK 353-08 1" "PN SB 39" 271.132 -38.79422222222222 "PN" +"PK 003-03 2" "PN KFL 7" 271.7081541666667 -27.104469444444447 "PN" +"PK 009-05 2" "PN G009.4-05.6" 277.08858749999996 -23.423761111111112 "PN" +"PK 014-08 1" "PN SB 20" 282.35125 -19.871111111111112 "PN" +"PK 036-01 3" "IRAS 19021+0209" 286.16101040985 2.2400547689699994 "PN" +"PK 066+02 2" "PN G065.9+02.4" 297.495 30.24830000000001 "PN" +"PK 070+02 1" "PN G070.9+02.4" 299.9816666666667 34.48444444444444 "PN" +"PK 080-10 1" "MWP 1" 319.28450740933 34.20761555427 "PN" +"PK 006+00 1" "PK 006+00 1" 270.0 -23.216666666666665 "?" +"PK 349-03 2" "PN H 2-14" 263.08372083333336 -39.85711111111111 "PN" +"PK 311-06 1" "WRAY 16-150" 214.78110899999996 -67.536789 "PN" +"PK 060+00 1" "[AHB74] Red 22" 295.53283505756 24.500544095900004 "LP*" +"PK 310+02 1" "IRAS 13499-5841" 208.35000820596 -58.93637327983001 "LP*" +"PK 301+01 1" "GUM 43" 188.72666666666666 -61.656944444444434 "HII" +"PK 011-06 1" "PN M 1-55" 279.1410748660225 -21.81741618961611 "PN" +"PK 002+02 1" "PN G002.3+02.2" 265.62541666666664 -25.757972222222225 "PN" +"PK 061+02 1" "Hen 2-442" 294.93063868904994 26.49250923072 "PN" +"PK 050-36 1" "IRAS F21274-0301" 322.5158 -2.8081000000000005 "EmG" +"PK 149-01 1" "BFS 32" 57.895833333333336 51.5 "RNe" +"PK 311+02 2" "PN SuWt 2" 208.93012911512997 -59.37772570667 "PN" +"PK 107+21 1" "PN K 1-6" 301.05949580064 74.42677261076 "PN" +"PK 081+03 1" "PN K 3-59" 306.29410822691 43.87584534574 "Sy*" +"PK 056-00 1" "PN K 3-42" 294.8991041666667 20.317186111111113 "PN" +"PK 355-04 3" "V* V720 Sco" 267.9925 -35.39083333333333 "No*" +"PK 338+14 1" "V* HM Lup" 236.9609534883 -35.47650113223 "Or*" +"PK 339+09 1" "WRAY 16-203" 242.12386460973994 -39.053062322360006 "Or*" +"PK 292-03 1" "IRAS 11086-6327" 167.66933396324 -63.73140629928999 "LP*" +"PK 086+00 1" "EM* UHA 78" 313.93463308854 46.55366023452 "Em*" +"PK 285-09 1" "CD-65 807" 146.58006509148 -65.71890902677 "*" +"PK 035-00 1" "[DLW84] G35.2S" 284.5436862407 1.6158963101200003 "HII" +"PK 097+03 1" "SH 2-128" 323.0412 55.8814 "HII" +"PK 013+51" "PN Sa 3-96" 268.937721 -15.061894999999998 "PN" +"PK 001+01 4" "JaSt 46" 265.87654699999996 -26.792406000000003 "PN" +"PK 008-06 1" "Haro 3-47" 277.21102669674997 -24.53383022169 "Em*" +"PK 166+10 1" "IC 2149" 89.09958821746 46.10477911856 "PN" +"PK 096+29 1" "NGC 6543" 269.63918316137 66.632986315 "PN" +"PK 206-40 1" "NGC 1535" 63.56570413057 -12.73942569009 "PN" +"PK 261+32 1" "NGC 3242" 156.19222313408 -18.64230468272 "PN" +"PK 002-13 1" "IC 4776" 281.46127083333334 -33.34281111111112 "PN" +"PK 335+12 1" "PN DS 2" 235.77100784058 -39.30405663683 "PN" +"PK 359-33 1" "Hen 3-1863" 304.86958134916 -41.52430306089 "PN" +"PK 316+08 1" "CPD-51 6744" 214.53702243268998 -52.17764352572 "PN" +"PK 321+03 1" "WRAY 15-1269" 224.97284140464 -54.30208920522 "PN" +"PK 337-18 1" "WRAY 16-400" 274.53761723083 -57.18707152556 "PN" +"PK 334-07 1" "CD-53 7049" 255.76199358520995 -53.93165722903 "PN" +"PK 315-13 1" "HD 138403" 234.29669714157 -71.9146908623 "PN" +"PK 321-16 1" "WRAY 16-244" 255.32179863125 -70.10089910012 "PN" +"PK 195-00 1" "EM* MWC 137" 94.68967536384 15.281179026279997 "Ae*" +"PK 332-00 1" "MSX6C G332.1544-00.4487" 244.1699 -51.2851 "HII" +"PK 005+03 1" "PN Pe 1-9" 266.40315461874 -23.04064412639 "PN" +"PK 216-04 1" "PN We 1-5" 100.39411402958001 -5.04321600335 "PN" diff --git a/astro_data/perek_kohoutek/simbad_pk_aliases.tsv b/astro_data/perek_kohoutek/simbad_pk_aliases.tsv new file mode 100644 index 000000000..aca229a47 --- /dev/null +++ b/astro_data/perek_kohoutek/simbad_pk_aliases.tsv @@ -0,0 +1,248 @@ +pk_id alias +"PK 102-05 1" "PN A66 80" +"PK 123+34 1" "IC 3568" +"PK 093+05 1" "NGC 7008" +"PK 217+14 1" "PN A66 24" +"PK 084-03 1" "NGC 7027" +"PK 089-05 1" "IC 5117" +"PK 112-10 1" "PN A66 84" +"PK 144-15 1" "PN A66 4" +"PK 088-01 1" "NGC 7048" +"PK 100-05 1" "IC 5217" +"PK 113-06 1" "PN A66 83" +"PK 130-10 1" "M 76" +"PK 130-10 1" "NGC 651" +"PK 130-10 1" "NGC 650" +"PK 089+00 1" "NGC 7026" +"PK 102-02 1" "PN A66 79" +"PK 114-04 1" "PN A66 82" +"PK 122-04 1" "PN A66 2" +"PK 141-07 1" "PN A66 5" +"PK 085+04 1" "PN A66 71" +"PK 082+07 1" "NGC 6884" +"PK 082+07 1" "NGC 6766" +"PK 093+05 2" "NGC 7008" +"PK 107+02 1" "NGC 7354" +"PK 095+07 1" "PN A66 73" +"PK 130+01 1" "IC 1747" +"PK 082+11 1" "NGC 6833" +"PK 083+12 1" "NGC 6826" +"PK 101+08 1" "PN A66 75" +"PK 101+08 1" "NGC 7076" +"PK 104+07 1" "NGC 7139" +"PK 119+06 1" "PN A66 1" +"PK 131+02 1" "PN A66 3" +"PK 138+02 1" "IC 289" +"PK 077+14 1" "PN A66 61" +"PK 077+14" "PN A66 61" +"PK 120+09 1" "NGC 40" +"PK 118+08 2" "PN A66 86" +"PK 136+04 1" "PN A66 6" +"PK 144+06 1" "NGC 1501" +"PK 078+18 1" "NGC 6742" +"PK 078+18 1" "PN A66 50" +"PK 117+18 1" "IC 1454" +"PK 117+18 1" "PN A66 81" +"PK 153+22 1" "PN A66 16" +"PK 170+15" "NGC 2242" +"PK 170+15 1" "NGC 2242" +"PK 158+37 1" "PN A66 28" +"PK 158+37" "PN A66 28" +"PK 148+57 1" "M 97" +"PK 148+57 1" "NGC 3587" +"PK 220-53 1" "NGC 1360" +"PK 159-15 1" "IC 351" +"PK 161-14 1" "IC 2003" +"PK 165-15 1" "NGC 1514" +"PK 215-30 1" "PN A66 7" +"PK 167-00 1" "PN A66 8" +"PK 169-00 1" "IC 2120" +"PK 172+00 1" "PN A66 9" +"PK 196-12 1" "PN A66 11" +"PK 197-14 1" "PN A66 10" +"PK 215-24 1" "IC 418" +"PK 176+00 1" "NGC 1985" +"PK 196-10 1" "NGC 2022" +"PK 197-03 1" "PN A66 14" +"PK 198-06 1" "PN A66 12" +"PK 204-08 1" "PN A66 13" +"PK 221-12 1" "IC 2165" +"PK 233-16 1" "PN A66 15" +"PK 216-00 1" "PN A66 18" +"PK 221-04 1" "PN A66 17" +"PK 200+08 1" "PN A66 19" +"PK 215+03 1" "NGC 2346" +"PK 189+19 1" "NGC 2371" +"PK 189+19 1" "NGC 2372" +"PK 189+19 1" "NGC 2371 2" +"PK 197+17 1" "NGC 2392" +"PK 205+14 1" "PN A66 21" +"PK 214+07 1" "PN A66 20" +"PK 215+11 1" "PN A66 22" +"PK 231+04 2" "NGC 2438" +"PK 234+02 1" "NGC 2440" +"PK 243-01 1" "NGC 2452" +"PK 249-05 1" "PN A66 23" +"PK 224+15 1" "PN A66 25" +"PK 224+15" "PN A66 25" +"PK 250+00 1" "PN A66 26" +"PK 254+00 1" "NGC 2579" +"PK 239+13 1" "NGC 2610" +"PK 252+04 1" "PN A66 27" +"PK 208+33 1" "PN A66 30" +"PK 214+31 1" "NGC 2661" +"PK 244+12 1" "PN A66 29" +"PK 219+31 1" "PN A66 31" +"PK 219+31" "PN A66 31" +"PK 002-52 1" "IC 5148" +"PK 002-52 1" "IC 5150" +"PK 036-57" "NGC 7293" +"PK 036-57 1" "NGC 7293" +"PK 037-34 1" "NGC 7009" +"PK 118-74 1" "NGC 246" +"PK 065-27 1" "NGC 7078 648" +"PK 066-28 1" "NGC 7094" +"PK 072-17 1" "PN A66 74" +"PK 072-17" "PN A66 74" +"PK 081-14 1" "PN A66 78" +"PK 106-17 1" "NGC 7662" +"PK 227+33 1" "PN A66 32" +"PK 261+08 1" "NGC 2818A" +"PK 238+34 1" "PN A66 33" +"PK 248+29 1" "PN A66 34" +"PK 272+12 1" "NGC 3132" +"PK 294+43 1" "NGC 4361" +"PK 303+40 1" "PN A66 35" +"PK 318+41 1" "PN A66 36" +"PK 326+42 1" "IC 972" +"PK 326+42 1" "PN A66 37" +"PK 341+05 1" "NGC 6153" +"PK 346-08 1" "IC 4663" +"PK 345+00 1" "IC 4637" +"PK 358-21 1" "IC 1297" +"PK 341+13 1" "NGC 6026" +"PK 342+10 1" "NGC 6072" +"PK 349+01 1" "NGC 6302" +"PK 349-01 1" "NGC 6337" +"PK 346+12 1" "PN A66 38" +"PK 358-07 1" "NGC 6563" +"PK 003-04 5" "NGC 6565" +"PK 003-02 3" "IC 4673" +"PK 005-06 1" "NGC 6620" +"PK 008-07 2" "NGC 6644" +"PK 017-21 1" "PN A66 65" +"PK 002+05 1" "NGC 6369" +"PK 009-05 1" "NGC 6629" +"PK 010-06 1" "IC 4732" +"PK 019-23 1" "PN A66 66" +"PK 359+15 1" "PN A66 40" +"PK 000+12 1" "IC 4634" +"PK 008+03 1" "NGC 6445" +"PK 007+01 1" "IC 4670" +"PK 010+00 1" "NGC 6537" +"PK 010-01 1" "NGC 6578" +"PK 011-00 2" "NGC 6567" +"PK 015-03 1" "PN A66 44" +"PK 017-10 1" "PN A66 51" +"PK 009+10 1" "PN A66 41" +"PK 011+05 1" "NGC 6439" +"PK 025-17 1" "NGC 6818" +"PK 009+14 1" "NGC 6309" +"PK 020-00 1" "PN A66 45" +"PK 025-11 1" "PN A66 60" +"PK 025-04 2" "IC 1295" +"PK 027-09 1" "IC 4846" +"PK 038-25 1" "PN A66 70" +"PK 016+13 1" "PN A66 42" +"PK 027-03 1" "PN A66 49" +"PK 029-05 1" "NGC 6751" +"PK 029+00 1" "PN A66 48" +"PK 033-06 1" "NGC 6772" +"PK 030+03 1" "PN A66 47" +"PK 033-02 1" "NGC 6741" +"PK 034-06 1" "NGC 6778" +"PK 033-05 1" "PN A66 55" +"PK 037-05 1" "PN A66 58" +"PK 037-06 1" "NGC 6790" +"PK 042-14 1" "NGC 6852" +"PK 037-03 2" "PN A66 56" +"PK 043-13 1" "PN A66 67" +"PK 034+11 1" "NGC 6572" +"PK 040-00 1" "PN A66 53" +"PK 041-02 1" "NGC 6781" +"PK 042-06 1" "NGC 6807" +"PK 044-09 1" "PN A66 64" +"PK 036+17 1" "PN A66 43" +"PK 045-04 1" "NGC 6804" +"PK 046-04 1" "NGC 6803" +"PK 025+40 1" "IC 4593" +"PK 047-04 1" "PN A66 62" +"PK 054-12 1" "NGC 6891" +"PK 050+05 1" "PN A66 52" +"PK 053-03 1" "PN A66 63" +"PK 059-18 1" "PN A66 72" +"PK 053+03 1" "PN A66 59" +"PK 057-08 1" "NGC 6879" +"PK 058-10 1" "IC 4997" +"PK 043+37 1" "NGC 6210" +"PK 055+06 1" "PN A66 54" +"PK 060-04 1" "PN A66 68" +"PK 060-07 2" "NGC 6886" +"PK 061-09 1" "NGC 6905" +"PK 055+16 1" "PN A66 46" +"PK 058+06 1" "PN A66 57" +"PK 060-03 1" "M 27" +"PK 060-03 1" "NGC 6853" +"PK 060-03" "M 27" +"PK 060-03" "NGC 6853" +"PK 047+42 1" "PN A66 39" +"PK 062+09 1" "NGC 6765" +"PK 065+00 1" "NGC 6842" +"PK 063+13 1" "M 57" +"PK 063+13 1" "NGC 6720" +"PK 063+13" "M 57" +"PK 063+13" "NGC 6720" +"PK 069-02 1" "NGC 6894" +"PK 070+01 2" "NGC 6857" +"PK 064+48 1" "NGC 6058" +"PK 074+02 1" "NGC 6881" +"PK 076+01 1" "PN A66 69" +"PK 265+04 1" "NGC 2792" +"PK 277-03 1" "NGC 2899" +"PK 278-05 1" "NGC 2867" +"PK 281-05 1" "IC 2501" +"PK 285-05 1" "IC 2553" +"PK 286-04 1" "NGC 3211" +"PK 285-14 1" "IC 2448" +"PK 291-04 1" "IC 2621" +"PK 292+01 1" "NGC 3699" +"PK 296-20 1" "NGC 3195" +"PK 294+04 1" "NGC 3918" +"PK 298-04 1" "NGC 4071" +"PK 304-04 1" "IC 4191" +"PK 307-03 1" "IC 4274" +"PK 307-03 1" "NGC 5189" +"PK 309-04 2" "NGC 5315" +"PK 317-05 1" "NGC 5844" +"PK 312+10 1" "NGC 5307" +"PK 322-05 1" "NGC 5979" +"PK 328-17 1" "IC 4662" +"PK 317+19 1" "NGC 5408" +"PK 319+15 1" "IC 4406" +"PK 327+10 1" "IC 1108" +"PK 327+10 1" "NGC 5882" +"PK 334-09 1" "IC 4642" +"PK 338-08 1" "NGC 6326" +"PK 336-00 1" "NGC 6164" +"PK 336-00 1" "NGC 6165" +"PK 331+16 1" "NGC 5873" +"PK 338+05 1" "IC 4599" +"PK 345-08 1" "IC 1266" +"PK 348-13 1" "IC 4699" +"PK 050-36 1" "PN A66 76" +"PK 097+03 1" "PN A66 77" +"PK 166+10 1" "IC 2149" +"PK 096+29 1" "NGC 6543" +"PK 206-40 1" "NGC 1535" +"PK 261+32 1" "NGC 3242" +"PK 002-13 1" "IC 4776" diff --git a/astro_data/perek_kohoutek/table2.dat b/astro_data/perek_kohoutek/table2.dat new file mode 100644 index 000000000..09b7fe890 --- /dev/null +++ b/astro_data/perek_kohoutek/table2.dat @@ -0,0 +1,1510 @@ +119+06.1 A 1 00 10.2 +68 54 00 12.9 +69 11 119.4+06.5 +120+09.1 NGC 40 00 10.3 +72 15 00 13.0 +72 32 120.0+09.8 +118-08.1 Vy 1-1 00 16.0 +53 36 00 18.7 +53 53 118.0-08.6 +119+00.1 BV 1 00 17.2 +62 42 00 19.9 +62 59 119.3+00.3 +119-06.1 Hu 1-1 00 25.5 +55 41 00 28.3 +55 58 119.6-06.7 +120-05.1 Sh 2-176 00 29.0 +57 06 051 00 31.8 +57 23 120.2-05.3 +108-76.1 BOBN 1 00 34.7 -13 59 050 00 37.2 -13 43 108.4-76.1 +121+03.1 We 1-1 00 35.9 +66 07 052 00 38.9 +66 23 121.6+03.5 +121+00.1 BV 2 00 37.4 +62 35 00 40.3 +62 51 121.6-00.0 +122-04.1 A 2 00 42.7 +57 41 00 45.6 +57 57 122.1-04.9 +118-74.1 NGC 246 00 44.5 -12 09 00 47.0 -11 53 118.8-74.7 +125-47.1 PHL 932 00 57.3 +15 28 052 00 59.9 +15 44 125.9-47.0 +124-07.1 WeSb 1 00 57.9 +54 48 052 01 00.9 +55 04 124.3-07.7 +124+02.1 * KLSS 2-7 00 59.2 +65 30 052 01 02.4 +65 46 124.0+02.9 * +124+10.1 EL 0103+73 01 03.5 +73 17 052 01 07.1 +73 33 124.0+10.7 * +126+03.1 K 3-90 01 21.5 +65 23 052 01 24.9 +65 39 126.3+02.9 +128-04.1 * S 22 01 27.3 +58 09 053 01 30.5 +58 24 128.0-04.1 +130-11.1 M 1-1 01 34.2 +50 13 01 37.3 +50 28 130.3-11.7 +129-05.1 KLSS 2-8 01 36.8 +56 20 053 01 40.1 +56 35 129.6-05.6 * +130-10.1 NGC 650-1 01 39.2 +51 19 01 42.4 +51 34 130.9-10.5 +129-02.1 * We 2-5 01 39.2 +59 55 053 01 42.6 +60 10 129.2-02.0 +131-05.1 BV 3 01 49.7 +56 10 01 53.0 +56 25 131.4-05.4 +130+01.1 IC 1747 01 54.0 +63 05 01 57.6 +63 20 130.2+01.3 +129+04.1 K 3-91 01 54.8 +66 19 053 01 58.6 +66 34 129.5+04.5 +148-48.1 * GR 0155+10 01 55.3 +10 42 055 01 58.0 +10 57 poss. * +133-08.1 * M 1-2 01 55.5 +52 39 01 58.8 +52 54 133.1-08.6 +130+03.1 K 3-92 01 59.9 +64 43 053 02 03.7 +64 57 130.4+03.1 +131+02.1 A 3 02 08.3 +63 55 02 12.1 +64 09 131.5+02.6 +132+04.1 K 3-93 02 22.5 +65 34 053 02 26.5 +65 47 132.4+04.7 +144-15.1 A 4 02 42.2 +42 21 02 45.4 +42 34 144.3-15.5 +141-07.1 A 5 02 48.8 +50 24 02 52.3 +50 36 141.7-07.8 +136+04.1 A 6 02 54.5 +64 18 02 58.7 +64 30 136.1+04.9 +255-59.1 Lo 1 02 55.2 -44 22 068 02 57.0 -44 10 255.3-59.6 +136+05.1 HEFE 1 02 59.6 +64 42 054 03 03.8 +64 54 136.3+05.5 * +138+02.1 IC 289 03 06.3 +61 08 03 10.3 +61 19 138.8+02.8 +138+04.1 * HtDe 2 03 06.9 +62 37 054 03 11.0 +62 48 138.1+04.1 * +147-09.1 * HtWe 3 03 13.1 +46 43 054 03 16.6 +46 54 poss. +149-09.1 * HtDe 3 03 23.8 +45 14 055 03 27.2 +45 24 149.4-09.2 * +220-53.1 NGC 1360 03 31.1 -26 02 03 33.2 -25 52 220.3-53.9 +142+03.1 K 3-94 03 32.0 +59 54 054 03 36.1 +60 04 142.1+03.4 +147-02.1 M 1-4 03 38.0 +52 07 03 41.7 +52 17 147.4-02.3 +156-13.1 * HtWe 5 03 42.2 +37 39 056 03 45.5 +37 48 156.9-13.3 +159-15.1 IC 351 03 44.3 +34 54 03 47.5 +35 03 159.0-15.1 +149-03.1 * IsWe 1 03 45.4 +49 51 055 03 49.1 +50 00 149.7-03.3 +171-25.1 Ba 1 03 50.7 +19 21 03 53.6 +19 30 171.3-25.8 +161-14.1 IC 2003 03 53.2 +33 44 03 56.4 +33 53 161.2-14.8 +144+06.1 NGC 1501 04 02.7 +60 47 04 07.0 +60 55 144.5+06.5 +165-15.1 NGC 1514 04 06.1 +30 39 04 09.2 +30 47 165.5-15.2 +147+04.1 M 2-2 04 09.2 +56 49 04 13.3 +56 57 147.8+04.1 +151+00.1 K 3-64 04 09.6 +51 43 055 04 13.4 +51 51 151.4+00.5 +206-40.1 NGC 1535 04 11.9 -12 52 04 14.2 -12 44 206.4-40.5 +153-01.1 K 3-65 04 12.2 +48 42 055 04 15.9 +48 49 153.7-01.4 +149+04.1 * K 4-47 04 16.7 +56 11 055 04 20.8 +56 18 149.0+04.4 +137+16.1 * EL 0419+72 04 19.4 +72 42 054 04 25.2 +72 49 poss. * +146+07.1 M 4-18 04 21.5 +60 00 04 25.8 +60 07 146.7+07.6 +167-09.1 K 3-66 04 33.4 +33 33 057 04 36.7 +33 39 167.4-09.1 +160-02.1 WSLS 1 04 33.8 +42 41 056 04 37.3 +42 47 160.7-02.9 +174-14.1 H 3-29 04 34.3 +24 57 04 37.3 +25 03 174.2-14.6 +165-06.1 K 3-67 04 36.5 +36 40 057 04 39.8 +36 46 165.5-06.5 +166-06.1 * CRL 618 04 39.6 +36 01 057 04 42.9 +36 07 166.4-06.5 +158+00.1 * Sh 2-216 04 39.7 +46 36 056 04 43.4 +46 42 158.6+00.7 * +160-00.1 We 1-2 04 43.1 +44 23 056 04 46.7 +44 28 160.5-00.5 +163-00.1 We 1-3 04 51.0 +42 12 057 04 54.5 +42 17 163.1-00.8 +215-30.1 A 7 05 00.9 -15 41 05 03.2 -15 37 215.5-30.8 +205-26.1 * MaC 2-1 05 01.3 -06 14 061 05 03.7 -06 10 205.8-26.7 +243-37.1 PaRu 2-1 05 01.4 -39 50 066 05 03.1 -39 46 243.8-37.1 * +190-17.1 J 320 05 02.8 +10 38 05 05.6 +10 42 190.3-17.7 +167-00.1 A 8 05 03.2 +39 04 05 06.6 +39 08 167.0-00.9 +173-05.1 * K 2-1 05 03.9 +30 45 05 07.1 +30 49 173.7-05.8 +215-24.1 IC 418 05 25.2 -12 44 05 27.5 -12 42 215.2-24.2 +172+00.1 * A 9 05 25.6 +36 01 05 29.0 +36 03 poss. +203-18.1 * MaC 2-2 05 26.4 -00 43 060 05 28.9 -00 41 poss. +178-02.1 K 3-68 05 28.4 +28 57 058 05 31.6 +28 59 178.3-02.5 +197-14.1 K 1-7 05 29.1 +06 54 05 31.8 +06 56 197.2-14.2 +156+12.1 * HtDe 4 05 33.8 +55 30 056 05 38.0 +55 32 156.3+12.5 * +170+04.1 K 3-69 05 37.9 +39 14 058 05 41.4 +39 15 170.7+04.6 +193-09.1 H 3-75 05 37.9 +12 20 05 40.7 +12 22 193.6-09.5 +173+03.1 * Pu 2 05 39.2 +36 08 058 05 42.6 +36 09 173.5+03.2 +196-10.1 NGC 2022 05 39.4 +09 04 05 42.1 +09 05 196.6-10.9 +184-02.1 M 1-5 05 43.8 +24 21 05 46.9 +24 22 184.0-02.1 +204-13.1 * MaC 2-4 05 45.0 +00 38 060 05 47.6 +00 39 rej. * +181+00.1 Pu 1 05 49.7 +28 05 058 05 52.9 +28 06 181.5+00.9 +166+10.1 IC 2149 05 52.7 +46 06 05 56.4 +46 06 166.1+10.4 +228-22.1 DeHt 1 05 53.0 -22 54 064 05 55.1 -22 54 228.2-22.1 +193-04.1 KLSS 1-5 05 54.3 +15 25 059 05 57.2 +15 25 193.0-04.5 * +184+00.1 K 3-70 05 55.7 +25 19 059 05 58.8 +25 19 184.6+00.6 +197-06.1 WeDe 1 05 56.6 +10 42 059 05 59.4 +10 42 197.4-06.4 +286-29.1 K 1-27 05 58.8 -75 41 075 05 57.0 -75 41 286.8-29.5 +198-06.1 A 12 05 59.6 +09 39 06 02.4 +09 39 198.6-06.3 +243-25.1 * K 2-12 06 00.4 -37 25 065 06 02.1 -37 25 poss. +204-08.1 A 13 06 02.2 +03 57 06 04.8 +03 57 204.0-08.5 +197-03.1 A 14 06 08.4 +11 48 06 11.2 +11 47 197.8-03.3 +184+04.1 K 3-71 06 10.8 +26 54 058 06 13.9 +26 53 184.8+04.4 +201-04.1 We 1-4 06 11.9 +07 35 060 06 14.6 +07 34 201.9-04.6 +183+05.1 WeSb 2 06 13.0 +28 23 058 06 16.2 +28 22 183.8+05.5 +208-07.1 * TuWe 2-1 06 13.7 +00 01 061 06 16.3 -00 00 208.9-07.8 +158+17.1 PuWe 1 06 15.4 +55 38 056 06 19.6 +55 37 158.9+17.8 +221-12.1 IC 2165 06 19.4 -12 58 06 21.7 -12 59 221.3-12.3 +204-03.1 K 3-72 06 21.2 +05 32 060 06 23.9 +05 30 204.8-03.5 +218-10.1 HtDe 5 06 21.3 -10 12 062 06 23.7 -10 14 218.9-10.7 * +240-19.1 * KLSS 1-9 06 22.8 -33 03 065 06 24.6 -33 05 240.8-19.6 * +194+02.1 J 900 06 23.0 +17 49 06 25.9 +17 47 194.2+02.5 +233-16.1 A 15 06 25.0 -25 21 06 27.0 -25 23 233.5-16.3 +170+15.1 NGC 2242 06 30.5 +44 49 057 06 34.2 +44 47 170.3+15.8 +211-03.1 M 1-6 06 33.2 -00 03 06 35.8 -00 06 211.2-03.5 +189+07.1 M 1-7 06 34.3 +24 03 06 37.4 +24 00 189.8+07.7 +228-11.1 * KLSS 1-7 06 35.5 -18 55 064 06 37.7 -18 58 228.5-11.4 * +201+02.1 K 4-48 06 37.2 +11 09 060 06 40.0 +11 06 201.7+02.5 +192+07.1 * HtDe 6 06 37.2 +21 28 059 06 40.2 +21 25 192.5+07.2 * +216-04.1 We 1-5 06 39.1 -05 00 062 06 41.6 -05 03 216.3-04.4 +153+22.1 A 16 06 39.3 +61 50 06 43.9 +61 47 153.7+22.8 +197+05.1 KLSS 1-6 06 40.5 +16 52 059 06 43.4 +16 49 197.0+05.8 * +210-00.2 * K 2-14 06 42.0 +01 22 061 06 44.6 +01 19 rej. * +208+01.1 * K 4-50 06 44.4 +04 41 061 06 47.1 +04 38 poss. +221-04.1 * A 17 06 46.3 -09 29 06 48.7 -09 32 rej. * +233-10.1 SrWe 1 06 48.6 -22 23 064 06 50.7 -22 27 233.0-10.1 +204+04.1 K 2-2 06 49.8 +10 02 06 52.6 +09 58 204.1+04.7 +210+01.1 M 1-8 06 50.9 +03 12 06 53.5 +03 08 210.3+01.9 +222-04.1 * IRAS06518-1041 06 51.9 -10 42 063 06 54.3 -10 46 222.8-04.2 * +236-10.1 * HtWe 9 06 52.3 -25 21 064 06 54.3 -25 25 236.0-10.6 +239-12.1 * ESO-427-19 06 53.2 -29 04 065 06 55.2 -29 08 239.6-12.0 +216-00.1 A 18 06 53.7 -02 49 06 56.2 -02 53 216.0-00.2 +217-00.1 * MaC 1-1 06 56.2 -03 37 062 06 58.7 -03 41 217.0-00.0 * +200+08.1 A 19 06 57.1 +14 41 06 59.9 +14 37 200.7+08.4 +210+03.1 * We 2-34 06 57.8 +04 25 061 07 00.4 +04 21 210.0+03.9 +226-03.1 PB 1 07 00.5 -13 38 07 02.8 -13 42 226.4-03.7 +242-11.1 M 3-1 07 00.9 -31 31 07 02.8 -31 35 242.6-11.6 +212+04.1 M 1-9 07 02.7 +02 52 07 05.3 +02 47 212.0+04.3 +217+02.1 SP 3-1 07 04.3 -03 00 062 07 06.8 -03 05 217.4+02.0 +225-02.1 * Sa 2-4 07 04.4 -11 41 064 07 06.7 -11 46 poss. +234-06.1 K 2-3 07 04.8 -21 58 07 06.9 -22 03 234.3-06.6 +215+03.1 NGC 2346 07 06.8 -00 44 07 09.3 -00 49 215.6+03.6 +232-04.1 M 1-11 07 09.1 -19 46 07 11.3 -19 51 232.8-04.7 +229-02.1 K 1-10 07 10.3 -16 01 07 12.6 -16 06 229.6-02.7 +240-07.1 M 3-2 07 12.8 -27 45 07 14.8 -27 50 240.3-07.6 +258-15.1 SKWL 3-2 07 13.4 -46 52 069 07 14.8 -46 57 258.0-15.7 * +225+00.1 * We 2-37 07 13.8 -10 48 063 07 16.2 -10 53 poss. +224+01.1 We 1-6 07 15.1 -10 05 063 07 17.5 -10 10 224.9+01.0 +247-10.1 * Sa 3-4 07 16.4 -34 49 066 07 18.2 -34 55 poss. * +199+14.1 * IRAS07171+1823 07 17.1 +18 23 060 07 20.0 +18 17 199.4+14.3 * +235-03.1 M 1-12 07 17.2 -21 38 07 19.3 -21 44 235.3-03.9 +232-01.1 M 1-13 07 19.0 -18 03 07 21.2 -18 09 232.4-01.8 +214+07.1 A 20 07 20.4 +01 51 07 23.0 +01 45 214.9+07.8 +189+19.1 NGC 2371-2 07 22.4 +29 35 07 25.6 +29 29 189.1+19.8 +221+05.2 * Y-C 37 07 24.0 -05 16 063 07 26.5 -05 22 poss. +221+05.1 M 3-3 07 24.1 -05 16 07 26.6 -05 22 221.7+05.3 +235-01.1 M 1-14 07 25.8 -20 07 07 28.0 -20 13 234.9-01.4 +197+17.1 NGC 2392 07 26.2 +21 01 059 07 29.2 +20 55 197.8+17.3 +205+14.1 * A 21 07 26.2 +13 21 061 07 29.0 +13 15 205.1+14.2 +248-08.1 M 4-2 07 27.1 -35 39 07 28.9 -35 45 248.8-08.5 +219+07.1 RWT 152 07 27.4 -02 00 063 07 29.9 -02 06 poss. +238-01.1 * KLSS 1-8 07 31.3 -23 20 065 07 33.4 -23 27 238.4-01.8 * +215+11.1 K 1-11 07 33.5 +02 49 07 36.1 +02 42 215.6+11.1 +226+05.1 M 1-16 07 34.9 -09 32 07 37.3 -09 39 226.7+05.6 +228+05.1 M 1-17 07 38.0 -11 25 07 40.4 -11 32 228.8+05.3 +231+04.2 NGC 2438 07 39.5 -14 37 07 41.8 -14 44 231.8+04.1 +234+02.1 NGC 2440 07 39.7 -18 05 07 41.9 -18 12 234.8+02.4 +231+04.1 M 1-18 07 39.8 -14 14 07 42.1 -14 21 231.4+04.3 +247-04.1 * FEGU 248-5 07 40.5 -32 41 066 07 42.4 -32 48 poss. * +249-05.1 A 23 07 41.4 -34 38 066 07 43.3 -34 45 249.3-05.4 +243-01.1 NGC 2452 07 45.4 -27 13 07 47.4 -27 20 243.3-01.0 +264-12.1 He 2-5 07 46.0 -51 08 07 47.3 -51 15 264.4-12.7 +235+04.1 * Y-C 40 07 47.8 -17 44 064 07 50.0 -17 52 poss. +236+03.1 K 1-12 07 48.0 -19 11 07 50.2 -19 19 236.7+03.5 +217+14.1 A 24 07 49.0 +03 08 07 51.6 +03 00 217.1+14.7 +252-04.1 * Sa 2-18 07 51.1 -36 36 067 07 52.9 -36 44 poss. +259-09.1 * Y-C 2 07 51.2 -45 04 069 07 52.8 -45 12 poss. +211+18.1 * HtDe 7 07 52.5 +09 41 062 07 55.2 +09 33 211.4+18.4 * +241+02.1 M 3-4 07 53.1 -23 30 07 55.2 -23 38 241.0+02.3 +164+31.1 JnEr 1 07 54.0 +53 33 057 07 57.9 +53 25 164.8+31.1 +251-03.1 CSST 1 07 55.3 -35 59 067 07 57.2 -36 07 251.9-03.7 * +245+01.1 M 3-5 08 00.4 -27 33 08 02.5 -27 41 245.4+01.6 +251-01.1 K 1-21 08 02.3 -34 07 067 08 04.2 -34 16 251.1-01.5 +263-08.1 * ESO-209-15 08 03.7 -48 15 070 08 05.2 -48 24 263.3-08.8 +257-05.1 KLSS 1-10 08 03.9 -41 48 069 08 05.6 -41 57 257.8-05.4 * +224+15.1 K 1-13 08 04.3 -02 44 08 06.8 -02 53 224.3+15.3 +255-03.1 * IRAS08046-3844 08 04.7 -38 45 068 08 06.5 -38 54 255.3-03.6 * +238+07.2 Sa 2-21 08 06.5 -19 05 065 08 08.7 -19 14 238.9+07.3 +246+02.1 * Sa 3-6 08 06.5 -27 32 066 08 08.6 -27 41 poss. * +250+00.1 A 26 08 07.1 -32 32 08 09.1 -32 41 250.3+00.1 +211+22.1 * BN 0808+11 08 08.5 +11 06 062 08 11.2 +10 57 211.9+22.6 * +240+07.1 Y-C 5 08 08.5 -20 23 065 08 10.7 -20 32 240.3+07.0 +264-08.1 He 2-7 08 10.0 -48 34 08 11.5 -48 43 264.1-08.1 +251+00.1 CSST 2 08 11.4 -32 52 067 08 13.4 -33 01 251.1+00.7 * +257-02.1 Vo 2 08 14.4 -39 43 068 08 16.2 -39 52 257.1-02.6 +253+00.1 * MmWe 2-1 08 19.0 -35 07 067 08 20.9 -35 17 poss. +263-05.1 PB 2 08 19.1 -46 13 08 20.7 -46 23 263.0-05.5 +261-04.1 * Sa 2-25 08 19.4 -44 14 070 08 21.1 -44 24 poss. * +262-04.1 * ESO-259-06 08 22.3 -45 21 070 08 23.9 -45 31 262.6-04.6 * +257-00.1 * IRAS08252-3852 08 25.3 -38 52 068 08 27.1 -39 02 -- +258-00.1 He 2-9 08 26.6 -39 14 08 28.4 -39 24 258.1-00.3 +257+00.1 VBRC 1 08 29.0 -38 08 068 08 30.9 -38 18 257.5+00.6 +249+06.1 * AS 201 08 29.6 -27 35 066 08 31.7 -27 45 249.0+06.9 * +252+04.1 K 1-1 08 29.9 -31 56 08 31.9 -32 06 252.6+04.4 +239+13.1 NGC 2610 08 31.1 -15 59 08 33.4 -16 09 239.6+13.9 +265-04.1 ESO-259-10 08 32.5 -47 06 071 08 34.1 -47 16 265.1-04.2 +264-03.1 * WRA 17-20 08 32.8 -46 15 070 08 34.4 -46 25 264.4-03.6 +255+03.1 Sa 2-28 08 34.3 -35 05 067 08 36.3 -35 15 255.7+03.3 * +259+00.1 He 2-11 08 35.3 -39 15 08 37.2 -39 26 259.1+00.9 +260+00.2 PN 0835-4027 08 35.6 -40 28 069 08 37.4 -40 39 260.1+00.2 * +158+37.1 A 28 08 37.6 +58 25 08 41.5 +58 14 158.8+37.1 +244+12.1 A 29 08 38.1 -20 44 08 40.3 -20 55 244.5+12.5 +254+05.1 M 3-6 08 38.6 -32 12 08 40.6 -32 23 253.9+05.7 +256+03.1 * Sa 2-30 08 39.2 -35 52 068 08 41.1 -36 03 poss. * +260+00.1 Vo 3 08 40.4 -40 33 069 08 42.2 -40 44 260.7+00.9 +265-02.1 Ve 26 08 41.8 -45 56 070 08 43.5 -46 07 265.1-02.2 +267-03.1 * Sa 3-7 08 41.9 -48 44 071 08 43.5 -48 55 poss. * +208+33.1 A 30 08 44.1 +18 04 08 46.9 +17 53 208.5+33.2 +263+00.1 * K 2-15 08 46.9 -42 43 070 08 48.7 -42 54 263.2+00.4 +219+31.1 A 31 08 51.5 +09 06 08 54.2 +08 55 219.1+31.2 +261+02.1 He 2-15 08 51.6 -39 52 08 53.5 -40 03 261.6+03.0 +272-05.1 MmWe 1-1 08 52.2 -53 54 071 08 53.6 -54 05 272.4-05.9 +269-03.1 PB 3 08 52.7 -50 21 08 54.3 -50 32 269.7-03.6 +253+10.1 K 1-2 08 55.6 -28 46 08 57.7 -28 58 253.5+10.7 +270-02.1 PN 0857-5011 08 57.4 -50 12 071 08 59.0 -50 24 270.1-02.9 * +285-14.1 IC 2448 09 06.6 -69 44 09 07.1 -69 56 285.7-14.9 +273-03.1 He 2-18 09 07.1 -53 07 09 08.6 -53 19 273.2-03.7 +265+04.1 NGC 2792 09 10.6 -42 13 09 12.5 -42 25 265.7+04.1 +275-04.2 He 2-21 09 12.4 -55 16 09 13.9 -55 28 275.3-04.7 +275-04.1 PB 4 09 13.6 -54 40 09 15.1 -54 53 275.0-04.1 +261+08.1 NGC 2818 09 14.0 -36 25 09 16.0 -36 38 261.9+08.5 +268+02.1 PB 5 09 14.3 -45 16 09 16.1 -45 29 268.4+02.4 +275-03.1 He 2-25 09 16.5 -54 27 09 18.0 -54 40 275.2-03.7 +278-06.1 He 2-26 09 18.1 -58 59 09 19.5 -59 12 278.6-06.7 +278-05.1 NGC 2867 09 20.0 -58 06 09 21.4 -58 19 278.1-05.9 +275-02.1 He 2-28 09 20.5 -53 57 09 22.1 -54 10 275.2-02.9 +275-02.2 He 2-29 09 23.2 -54 23 09 24.8 -54 36 275.8-02.9 +277-03.1 NGC 2899 09 25.5 -55 53 09 27.0 -56 06 277.1-03.8 +275-01.1 Pe 2-4 09 29.2 -52 57 09 30.9 -53 10 275.5-01.3 +278-04.1 He 2-32 09 29.4 -57 24 09 30.9 -57 37 278.5-04.5 +277-03.2 * VBRC 2 09 29.8 -56 04 072 09 31.4 -56 17 277.7-03.5 * +275-01.2 NeVe 3-1 09 32.3 -52 59 072 09 34.0 -53 12 275.9-01.0 * +277-01.1 PN 0936-5413 09 36.2 -54 14 072 09 37.9 -54 28 277.1-01.5 * +238+34.1 A 33 09 36.6 -02 35 09 39.1 -02 49 238.0+34.8 +281-05.1 IC 2501 09 37.3 -59 52 09 38.7 -60 06 281.0-05.6 +279-03.2 VBRC 3 09 39.3 -56 44 073 09 40.9 -56 58 poss. * +274+02.1 * He 2-34 09 39.4 -49 09 072 09 41.2 -49 23 274.1+02.5 +274+02.2 He 2-35 09 39.8 -49 44 09 41.6 -49 58 274.6+02.1 +279-03.1 He 2-36 09 41.8 -57 03 09 43.4 -57 17 279.6-03.1 +248+29.1 A 34 09 43.2 -12 56 09 45.6 -13 10 248.7+29.5 +274+03.1 He 2-37 09 45.6 -48 44 09 47.5 -48 58 274.6+03.5 +221+46.1 * BN 0950+13 09 50.3 +13 59 063 09 53.0 +13 45 221.5+46.3 * +273+06.1 * HBDS 1 09 50.8 -46 03 071 09 52.7 -46 17 273.6+06.1 +279-00.1 * IRAS09517-5438 09 51.7 -54 38 073 09 53.4 -54 52 279.1-00.4 +280-02.1 * He 2-38 09 53.1 -57 05 09 54.8 -57 19 rej. * +277+03.1 * MmWe 2-2 09 56.3 -50 25 072 09 58.2 -50 39 poss. +284-05.1 * SP 1-1 10 00.5 -61 43 074 10 02.0 -61 58 rej. * +283-04.1 He 2-39 10 02.2 -60 29 10 03.8 -60 44 283.8-04.2 +274+09.1 Lo 4 10 03.7 -44 07 072 10 05.7 -44 22 274.3+09.1 +272+12.1 NGC 3132 10 04.9 -40 12 10 07.0 -40 27 272.1+12.3 +286-06.2 WRA 17-40 10 05.5 -64 07 075 10 07.0 -64 22 286.2-06.9 +286-06.1 He 2-41 10 05.9 -63 40 10 07.4 -63 55 286.0-06.5 +285-05.1 IC 2553 10 07.8 -62 22 10 09.4 -62 37 285.4-05.3 +280+01.1 KLSS 1-12 10 08.7 -53 41 073 10 10.6 -53 56 280.5+01.8 * +296-20.1 NGC 3195 10 10.0 -80 37 10 09.4 -80 52 296.6-20.0 +280+02.1 SM 1 10 10.1 -52 23 073 10 12.0 -52 38 280.0+02.9 * +278+05.1 PB 6 10 11.3 -50 05 10 13.3 -50 20 278.8+04.9 +282-00.1 * IRAS10115-5640 10 11.5 -56 41 073 10 13.3 -56 56 282.6-00.4 +283-01.2 MmWe 1-2 10 12.6 -57 57 074 10 14.4 -58 12 poss. +283-01.1 Hf 4 10 13.8 -58 36 10 15.5 -58 51 283.9-01.8 +286-04.1 NGC 3211 10 16.2 -62 25 10 17.8 -62 40 286.3-04.8 +285-02.2 * He 3-401 10 17.8 -59 58 074 10 19.5 -60 13 285.1-02.7 * +285-02.1 He 2-47 10 21.4 -60 17 10 23.2 -60 32 285.6-02.7 +261+32.1 NGC 3242 10 22.4 -18 23 069 10 24.8 -18 38 261.0+32.0 +285-01.1 Pe 2-5 10 26.7 -58 48 10 28.5 -59 03 285.4-01.1 +282+03.1 He 2-48 10 29.5 -53 18 10 31.5 -53 33 282.9+03.8 +283+02.1 My 60 10 29.6 -55 05 10 31.6 -55 20 283.8+02.2 +270+24.1 K 1-28 10 32.2 -28 56 071 10 34.5 -29 12 270.1+24.8 +283+03.1 He 2-50 10 32.3 -53 25 10 34.3 -53 41 283.3+03.9 +288-05.1 He 2-51 10 34.0 -64 04 10 35.7 -64 20 288.8-05.2 +285+01.1 He 2-52 10 36.5 -56 31 074 10 38.5 -56 47 285.4+01.5 * +285+01.2 He 2-53 10 37.6 -56 51 10 39.6 -57 07 285.7+01.2 * +285+02.1 Pe 2-7 10 39.3 -55 54 10 41.3 -56 10 285.4+02.2 +288-02.1 Pe 1-3 10 42.6 -61 24 10 44.5 -61 40 288.4-02.4 +286+02.1 He 2-55 10 46.7 -55 47 10 48.8 -56 03 286.3+02.8 +288-00.1 * Hf 39 10 52.0 -60 11 075 10 54.0 -60 27 288.9-00.8 +283+09.1 * ESO-215-04 10 52.5 -48 31 074 10 54.7 -48 47 283.9+09.7 +288+00.1 Hf 38 10 52.6 -58 54 10 54.6 -59 10 288.4+00.3 +289-01.1 He 2-57 10 54.1 -61 12 10 56.1 -61 28 289.6-01.6 +288+00.2 * ESO-128-25 10 57.6 -58 45 075 10 59.7 -59 01 rej. * +291-04.1 IC 2621 10 58.4 -64 59 11 00.3 -65 15 291.6-04.8 +290-00.1 Hf 48 11 01.8 -60 20 11 03.9 -60 36 290.1-00.4 +286+11.1 Lo 5 11 11.6 -47 41 074 11 13.9 -47 57 286.5+11.6 +148+57.1 NGC 3587 11 11.9 +55 17 11 14.8 +55 01 148.4+57.0 +295-09.1 He 2-62 11 15.8 -70 33 11 17.8 -70 49 295.3-09.3 +288+08.1 * ESO-216-02 11 15.9 -51 54 075 11 18.2 -52 10 288.7+08.1 +289+07.1 He 2-63 11 21.7 -52 35 11 24.0 -52 51 289.8+07.7 +283+25.1 K 1-22 11 24.3 -34 06 073 11 26.7 -34 23 283.6+25.3 +291+03.1 He 2-64 11 25.1 -57 01 11 27.4 -57 18 291.7+03.7 +292+01.1 NGC 3699 11 25.7 -59 41 11 28.0 -59 58 292.6+01.2 +290+07.1 Fg 1 11 26.2 -52 40 11 28.6 -52 57 290.5+07.9 +292+01.2 He 2-67 11 26.5 -59 50 11 28.8 -60 07 292.8+01.1 +292+01.3 WRA 16-93 11 28.5 -59 01 076 11 30.8 -59 18 292.7+01.9 * +289+10.1 * Y-C 13 11 29.1 -49 42 075 11 31.5 -49 59 poss. +294-04.1 He 2-68 11 29.5 -65 42 11 31.7 -65 59 294.9-04.3 +292+04.1 PB 8 11 30.9 -56 50 11 33.3 -57 07 292.4+04.1 +293+01.1 He 2-70 11 32.9 -60 00 11 35.2 -60 17 293.6+01.2 +296-06.1 He 2-71 11 36.9 -68 36 11 39.2 -68 53 296.4-06.9 +294-00.1 He 2-72 11 39.2 -62 12 11 41.6 -62 29 294.9-00.6 +296-03.1 He 2-73 11 46.2 -64 52 11 48.6 -65 09 296.3-03.0 +294+04.1 NGC 3918 11 47.8 -56 54 11 50.3 -57 11 294.6+04.7 +291+19.1 ESO-320-28 11 50.0 -42 01 076 11 52.5 -42 18 291.4+19.2 +293+10.1 BLDZ 1 11 50.6 -50 34 076 11 53.1 -50 51 293.6+10.9 +290+27.1 * MmWe 2-3 11 54.2 -34 09 076 11 56.7 -34 26 poss. +144+65.1 BE UMa 11 55.2 +49 13 054 11 57.8 +48 56 144.8+65.8 * +294+14.1 Lo 6 11 58.2 -47 16 076 12 00.8 -47 33 294.1+14.4 +298-04.1 NGC 4071 12 01.6 -67 02 12 04.2 -67 19 298.3-04.8 +298-01.2 He 2-76 12 05.8 -63 55 12 08.4 -64 12 298.2-01.7 +297+03.1 He 2-78 12 06.5 -58 26 12 09.1 -58 43 297.4+03.7 +298-01.1 * He 2-79 12 12.6 -63 23 12 15.3 -63 40 rej. * +299-04.1 * HtTr 1 12 13.8 -66 29 077 12 16.5 -66 46 299.4-04.1 +275+72.1 * K 2-4 12 15.8 +11 20 12 18.3 +11 03 poss. +298+06.1 WKK 171-090 12 15.9 -55 37 077 12 18.6 -55 54 298.3+06.6 * +299-01.1 He 2-81 12 20.2 -63 45 12 23.0 -64 02 299.8-01.3 +299+00.1 * BI Cru 12 20.7 -62 22 077 12 23.5 -62 39 -- +299+02.1 He 2-82 12 21.1 -59 57 12 23.9 -60 14 299.5+02.4 +294+43.1 NGC 4361 12 21.9 -18 30 12 24.5 -18 47 294.1+43.6 +300-02.2 * Sa 3-20 12 25.8 -65 03 077 12 28.6 -65 20 poss. * +300+00.1 He 2-83 12 25.9 -61 49 12 28.7 -62 06 300.2+00.6 +300-00.1 He 2-84 12 25.9 -63 28 12 28.7 -63 45 300.4-00.9 +300-01.1 He 2-85 12 27.3 -63 36 12 30.1 -63 53 300.5-01.1 +300-03.1 ESO-095-12 12 27.5 -65 58 077 12 30.4 -66 15 300.8-03.4 +300-02.1 He 2-86 12 27.6 -64 36 12 30.5 -64 53 300.7-02.0 +299+18.1 K 1-23 12 28.2 -43 58 077 12 30.9 -44 15 299.0+18.4 +298+34.1 CTIO 1230-275 12 30.6 -27 32 076 12 33.2 -27 49 298.0+34.8 +301-01.1 PN 1231-6401 12 31.7 -64 02 078 12 34.6 -64 19 301.1-01.4 * +123+34.1 IC 3568 12 31.8 +82 50 12 33.1 +82 33 123.6+34.5 +302-05.1 * Y-C 14 12 40.3 -67 56 078 12 43.4 -68 12 poss. +302+02.1 ESO-131-15 12 43.0 -60 04 078 12 45.9 -60 20 302.2+02.5 * +302-00.2 VBRC 4 12 45.5 -63 34 078 12 48.5 -63 50 302.6-00.9 * +303+40.1 A 35 12 50.9 -22 36 12 53.6 -22 52 303.6+40.0 +339+88.1 LoTr 5 12 53.1 +26 10 092 12 55.5 +25 54 339.9+88.4 +049+88.1 H 4-1 12 57.1 +27 54 12 59.5 +27 38 049.3+88.1 +304+05.2 ESO-173-01 12 57.7 -56 38 078 13 00.7 -56 54 304.2+05.9 * +304+05.1 He 2-88 13 02.8 -57 23 13 05.8 -57 39 304.8+05.1 +304-04.1 IC 4191 13 05.5 -67 23 13 08.8 -67 39 304.5-04.8 +305+01.1 He 2-90 13 06.4 -61 04 13 09.6 -61 20 305.1+01.4 +305+03.1 * SP 2-22 13 11.4 -58 36 078 13 14.5 -58 52 rej. * +305-03.1 Sa 2-91 13 16.1 -65 53 079 13 19.5 -66 09 305.7-03.4 * +306-00.1 Th 2-A 13 19.2 -63 05 13 22.5 -63 21 306.4-00.6 +307+05.1 Sa 2-93 13 21.2 -57 16 079 13 24.4 -57 32 307.3+05.0 * +310+24.1 Lo 8 13 22.8 -37 21 080 13 25.7 -37 37 310.3+24.7 +308+07.1 MmWe 1-3 13 24.9 -54 26 079 13 28.0 -54 42 308.2+07.7 +307-01.1 * Th 2-B 13 25.3 -63 34 13 28.7 -63 50 rej. * +305-13.1 ESO-040-11 13 30.0 -75 31 079 13 34.3 -75 46 305.6-13.1 +307-03.1 NGC 5189 13 30.0 -65 43 13 33.5 -65 58 307.2-03.4 +307-03.2 WeKG 1 13 34.0 -65 53 079 13 37.6 -66 09 307.5-03.6 +308+00.1 WeKG 2 13 35.3 -61 41 079 13 38.7 -61 56 308.4+00.4 * +307-04.1 MyCn 18 13 35.9 -67 08 13 39.6 -67 23 307.5-04.9 +318+41.1 A 36 13 38.0 -19 38 13 40.7 -19 53 318.4+41.4 +309+00.1 He 2-96 13 39.2 -61 07 13 42.6 -61 22 309.0+00.8 +309+01.1 VBRC 5 13 40.6 -60 35 080 13 44.0 -60 50 309.2+01.3 +307-09.1 He 2-97 13 41.4 -71 14 13 45.4 -71 29 307.2-09.0 +308-03.1 * IRAS13427-6531 13 42.8 -65 31 080 13 46.4 -65 46 308.5-03.5 * +312+10.1 NGC 5307 13 47.9 -50 57 13 51.1 -51 12 312.3+10.5 +309-04.1 He 2-99 13 48.8 -66 09 13 52.5 -66 24 309.0-04.2 +310+01.1 Vo 4 13 49.9 -60 19 080 13 53.4 -60 34 310.4+01.3 +309-04.2 NGC 5315 13 50.2 -66 16 13 54.0 -66 31 309.1-04.3 +309-02.1 * MaC 1-2 13 50.8 -64 45 080 13 54.5 -65 00 309.5-02.9 +310+01.2 WeKG 3 13 50.9 -60 13 080 13 54.4 -60 28 310.6+01.4 * +311+03.1 * He 2-101 13 51.5 -58 13 13 54.9 -58 28 311.1+03.4 +311+02.2 SuWt 2 13 52.3 -59 08 081 13 55.8 -59 23 311.0+02.4 +311+02.1 He 2-102 13 54.8 -58 40 13 58.3 -58 55 311.4+02.8 +314+10.1 * MmWe 2-4 13 58.0 -50 26 082 14 01.2 -50 40 poss. +326+42.1 IC 972 14 01.7 -16 59 14 04.4 -17 13 326.7+42.2 +310-02.1 He 2-103 14 01.8 -64 27 14 05.6 -64 41 310.7-02.9 +315+09.1 * He 2-104 14 08.6 -51 12 14 11.9 -51 26 315.4+09.4 +312-02.1 * He 2-106 14 10.4 -63 12 14 14.2 -63 26 poss. +308-12.1 He 2-105 14 10.7 -73 59 14 15.4 -74 13 308.6-12.2 +310-05.1 LoTr 7 14 11.4 -67 18 081 14 15.4 -67 32 310.8-05.9 +313+01.1 * PN 1412-5947 14 12.3 -59 48 081 14 15.9 -60 02 313.3+01.1 * +312-00.1 * V 417 Cen 14 12.3 -61 40 081 14 16.0 -61 54 -- +313+02.1 BeVa 1 14 13.3 -58 39 081 14 16.9 -58 53 313.7+02.1 * +003+66.1 SkAc 1 14 14.0 +14 06 015 14 16.4 +13 52 003.3+66.1 +315+08.1 MmWe 1-4 14 14.1 -52 12 082 14 17.5 -52 26 poss. +316+08.1 He 2-108 14 14.8 -51 57 14 18.2 -52 11 316.1+08.4 +312-01.1 He 2-107 14 14.9 -62 53 14 18.7 -63 07 312.6-01.8 +311-06.1 * Sa 3-25 14 14.9 -67 15 081 14 19.0 -67 29 poss. * +315+05.1 He 2-109 14 17.3 -55 14 14 20.8 -55 28 315.4+05.2 +314+02.1 PN 1417-5824 14 17.7 -58 25 082 14 21.3 -58 39 314.4+02.2 * +315+05.2 LoTr 8 14 18.5 -54 49 082 14 22.0 -55 03 315.7+05.5 +319+15.1 IC 4406 14 19.3 -43 55 14 22.5 -44 09 319.6+15.7 +315-00.1 He 2-111 14 29.5 -60 37 14 33.3 -60 50 315.0-00.3 +316+00.1 * PN 1434-5858 14 34.6 -58 59 083 14 38.3 -59 12 316.2+00.8 * +319+06.1 He 2-112 14 37.0 -52 22 14 40.5 -52 35 319.2+06.8 +315-01.1 LoTr 9 14 37.4 -61 07 082 14 41.3 -61 20 315.7-01.2 +317+03.1 VBRC 6 14 38.0 -56 02 083 14 41.6 -56 15 317.8+03.3 +316-01.1 LoTr 10 14 42.4 -61 01 083 14 46.3 -61 14 316.3-01.3 +321+08.1 MmWe 1-5 14 43.1 -50 11 084 14 46.5 -50 24 321.0+08.3 +315-04.1 * Sa 2-108 14 48.5 -63 50 083 14 52.6 -64 02 poss. * +324+09.1 ESO-223-10 14 58.2 -48 09 084 15 01.6 -48 21 324.1+09.0 +318-02.1 He 2-114 15 00.2 -60 42 15 04.2 -60 54 318.3-02.0 +318-02.3 * Sa 2-111 15 01.6 -60 37 083 15 05.6 -60 49 poss. * +321+02.1 He 2-115 15 01.6 -54 59 15 05.3 -55 11 321.3+02.8 +318-02.2 He 2-116 15 02.0 -61 10 15 06.0 -61 22 318.3-02.5 +321+02.2 He 2-117 15 02.2 -55 48 15 05.9 -56 00 320.9+02.0 +327+13.1 He 2-118 15 02.9 -42 48 15 06.2 -43 00 327.5+13.3 +318-03.1 ESO-135-04 15 04.7 -61 33 083 15 08.8 -61 44 318.4-03.0 +339+29.1 * Y-C 17 15 05.4 -23 03 092 15 08.3 -23 14 poss. +321+02.3 CoVi 1 15 05.7 -55 22 084 15 09.4 -55 33 -- +317-05.1 He 2-119 15 06.4 -64 29 15 10.7 -64 40 317.1-05.7 +321+01.1 He 2-120 15 08.2 -55 29 15 12.0 -55 40 321.8+01.9 +331+16.1 NGC 5873 15 09.6 -37 56 15 12.8 -38 07 331.3+16.8 +327+10.1 NGC 5882 15 13.4 -45 28 15 16.8 -45 39 327.8+10.0 +324+03.1 IRAS15154-5258 15 15.5 -52 59 084 15 19.2 -53 10 324.0+03.5 * +313-12.1 LoTr 11 15 16.0 -72 03 082 15 21.2 -72 14 313.8-12.6 +326+07.1 NeVe 3-2 15 16.2 -48 49 085 15 19.7 -49 00 326.4+07.0 * +323+02.1 He 2-123 15 18.6 -53 58 15 22.3 -54 09 323.9+02.4 +342+27.1 Me 2-1 15 19.4 -23 27 15 22.3 -23 38 342.1+27.5 +322-00.1 Pe 2-8 15 19.8 -56 59 15 23.7 -57 10 322.4-00.1 +324+02.1 He 2-125 15 19.9 -53 41 15 23.6 -53 52 324.2+02.5 +085+52.1 * PG 1520+525 15 20.3 +52 33 046 15 21.7 +52 22 -- +325+04.2 * He 2-127 15 21.2 -51 39 15 24.9 -51 50 rej. * +325+04.1 He 2-128 15 21.5 -51 09 15 25.1 -51 20 325.8+04.5 +325+03.1 He 2-129 15 21.8 -52 40 15 25.5 -52 51 325.0+03.2 +321-03.1 HtTr 2 15 26.2 -60 51 084 15 30.3 -61 01 321.0-03.8 +322-02.1 Mz 1 15 30.2 -58 59 15 34.2 -59 09 322.4-02.6 +315-13.1 He 2-131 15 31.9 -71 45 15 37.2 -71 55 315.1-13.0 +323-02.1 He 2-132 15 34.0 -58 35 15 38.0 -58 45 323.1-02.5 +326+02.1 * IRAS15359-5226 15 36.0 -52 27 085 15 39.7 -52 37 326.9+02.2 * +324-01.1 He 2-133 15 38.0 -56 27 085 15 41.9 -56 37 324.8-01.1 +330+05.1 Lo 9 15 38.7 -47 31 087 15 42.3 -47 41 330.2+05.9 +335+12.1 * DS 2 15 39.8 -39 09 089 15 43.1 -39 18 335.5+12.4 +326+00.1 * WRA 16-185 15 41.2 -53 53 085 15 45.0 -54 02 326.7+00.6 +322-05.1 NGC 5979 15 43.4 -61 04 15 47.6 -61 13 322.5-05.2 +328+01.1 Lo 10 15 45.7 -52 21 086 15 49.5 -52 30 328.2+01.3 +323-04.1 WKK 136-337 15 46.3 -59 50 084 15 50.5 -59 59 -- +325-01.1 VB 2 15 47.4 -56 12 085 15 51.4 -56 21 poss. +330+04.1 * Cn 1-1 15 47.6 -48 36 15 51.2 -48 45 330.7+04.1 +330+04.2 Sa 2-125 15 47.7 -48 17 087 15 51.3 -48 26 330.9+04.3 * +322-06.1 He 2-136 15 47.8 -62 22 15 52.2 -62 31 322.1-06.6 +329+02.1 Sp 1 15 47.9 -51 22 15 51.6 -51 31 329.0+01.9 +326-01.2 VB 3 15 49.0 -56 16 086 15 53.0 -56 25 326.1-01.9 +335+09.1 ESO-330-02 15 49.8 -41 42 089 15 53.2 -41 51 335.4+09.2 +331+03.1 * Sa 2-128 15 49.8 -48 35 087 15 53.4 -48 44 poss. * +052+50.1 * BD+33 2642 15 50.0 +33 06 039 15 51.9 +32 57 052.7+50.7 * +329+01.1 VBRC 7 15 51.1 -51 14 086 15 54.8 -51 23 329.5+01.7 +320-09.1 He 2-138 15 51.3 -66 00 15 56.0 -66 09 320.1-09.6 +327-01.2 He 2-140 15 54.2 -55 33 15 58.2 -55 42 327.1-01.8 +325-04.1 He 2-141 15 55.0 -58 15 15 59.1 -58 24 325.4-04.0 +342+15.1 * Y-C 19 15 55.6 -31 52 094 15 58.8 -32 01 poss. +327-02.1 He 2-142 15 56.0 -55 47 16 00.0 -55 55 327.1-02.2 +332+03.1 * Sa 3-32 15 56.7 -48 07 088 16 00.3 -48 15 332.2+03.5 * +327-01.1 He 2-143 15 57.1 -54 57 16 01.0 -55 05 327.8-01.6 +328-01.1 * PN 1557-5445 15 57.9 -54 45 086 16 01.8 -54 53 328.0-01.6 * +341+13.1 NGC 6026 15 58.1 -34 24 16 01.3 -34 32 341.6+13.7 +336+08.1 SKWL 4-10 15 58.8 -41 25 090 16 02.2 -41 33 336.9+08.3 * +340+12.1 Lo 11 16 00.1 -35 53 092 16 03.4 -36 01 340.8+12.3 +331+01.1 * PN 1600-5041 16 00.5 -50 42 087 16 04.2 -50 50 331.0+01.2 * +064+48.1 NGC 6058 16 02.7 +40 49 16 04.4 +40 41 064.6+48.2 +332+01.1 * Sa 3-33 16 03.3 -49 19 088 16 07.0 -49 27 rej. * +340+10.1 Lo 12 16 05.1 -37 01 092 16 08.4 -37 09 340.8+10.8 +331+00.1 He 2-145 16 05.2 -50 54 16 09.0 -51 02 331.4+00.5 +345+15.1 Lo 13 16 06.6 -30 47 096 16 09.7 -30 55 345.5+15.1 +328-02.1 He 2-146 16 06.7 -54 50 16 10.7 -54 58 328.9-02.4 +329-02.3 HeFa 1 16 08.6 -54 16 087 16 12.5 -54 24 329.5-02.2 * +025+40.1 IC 4593 16 09.4 +12 12 16 11.7 +12 04 025.3+40.8 +342+10.1 NGC 6072 16 09.7 -36 06 16 13.0 -36 14 342.1+10.8 +327-04.1 * He 2-147 16 09.9 -56 52 16 14.0 -57 00 327.9-04.3 +343+11.1 H 1-1 16 10.2 -34 28 16 13.4 -34 36 343.4+11.9 +341+09.1 SB 25 16 10.3 -37 52 093 16 13.6 -38 00 341.0+09.4 +329-02.1 He 2-149 16 10.4 -54 40 16 14.4 -54 48 329.4-02.7 +329-02.2 Mz 2 16 10.6 -54 50 16 14.6 -54 58 329.3-02.8 +326-06.1 He 2-151 16 11.4 -59 47 16 15.7 -59 54 326.0-06.5 +330-02.2 * Sa 1-4 16 11.4 -53 44 087 16 15.3 -53 51 poss. +336+04.1 PN 1611-4504 16 11.5 -45 04 090 16 15.1 -45 11 336.1+04.1 * +333+01.1 He 2-152 16 11.6 -49 06 16 15.3 -49 13 333.4+01.1 +346+14.1 * KLSS 1-14 16 11.8 -30 24 096 16 14.9 -30 31 346.6+14.6 * +330-02.1 He 2-153 16 13.3 -53 25 16 17.2 -53 32 330.6-02.1 +331-01.1 Mz 3 16 13.4 -51 52 16 17.2 -51 59 331.7-01.0 +327-05.1 KsRm 1 16 15.0 -57 52 086 16 19.2 -57 59 327.7-05.4 * +341+08.1 * SB 27 16 15.9 -37 40 093 16 19.2 -37 47 341.9+08.8 +338+05.1 He 2-155 16 15.9 -42 08 16 19.4 -42 15 338.8+05.6 +331-02.1 He 2-157 16 18.3 -53 34 16 22.2 -53 41 331.0-02.7 +013+32.1 Sn 1 16 18.5 -00 09 16 21.1 -00 16 013.3+32.7 +327-06.1 He 2-158 16 19.3 -58 12 16 23.5 -58 19 327.8-06.1 +346+12.1 K 1-3 16 20.1 -31 38 16 23.3 -31 45 346.9+12.4 +336+01.1 Pe 1-6 16 20.3 -46 35 16 23.9 -46 42 336.2+01.9 +330-03.1 He 2-159 16 20.4 -54 29 16 24.4 -54 36 330.6-03.6 +331-02.2 He 2-161 16 20.7 -53 16 16 24.6 -53 23 331.5-02.7 +331-03.1 He 2-162 16 23.9 -53 55 16 27.9 -54 02 331.4-03.5 +327-07.1 He 2-163 16 25.2 -59 03 16 29.5 -59 10 327.8-07.2 +047+42.1 A 39 16 25.5 +28 01 16 27.5 +27 54 047.0+42.4 +332-03.1 He 2-164 16 25.9 -53 17 16 29.8 -53 24 332.0-03.3 +331-03.2 He 2-165 16 26.0 -54 03 16 30.0 -54 10 331.5-03.9 +337+01.1 Pe 1-7 16 26.8 -45 56 16 30.4 -46 02 337.4+01.6 +334-01.1 MmWe 1-6 16 27.3 -50 20 089 16 31.1 -50 26 334.3-01.4 +341+05.1 NGC 6153 16 28.1 -40 09 16 31.5 -40 15 341.8+05.4 +335-01.1 He 2-169 16 30.5 -49 15 16 34.3 -49 21 335.4-01.1 +346+08.1 * He 2-171 16 30.8 -34 59 16 34.1 -35 05 346.0+08.5 +340+03.1 * MmWe 2-5 16 31.3 -41 58 093 16 34.8 -42 04 poss. +332-04.1 He 2-170 16 31.4 -53 44 16 35.4 -53 50 332.3-04.2 +342+05.1 * He 2-173 16 33.0 -39 46 16 36.4 -39 52 rej. * +331-05.1 * PC 11 16 33.6 -55 36 16 37.7 -55 42 331.1-05.7 +336-01.1 * VERA 90 16 34.4 -48 37 090 16 38.1 -48 43 poss. +333-04.1 HtTr 3 16 35.7 -52 43 089 16 39.6 -52 49 333.4-04.0 +345+06.1 He 2-175 16 36.1 -36 28 16 39.4 -36 34 345.6+06.7 +339+00.1 * He 2-176 16 37.9 -45 07 16 41.5 -45 13 rej. * +336-02.1 * VERA 104 16 38.3 -49 39 091 16 42.1 -49 45 poss. +061+41.1 DDDM 1 16 38.6 +38 48 041 16 40.3 +38 42 061.9+41.3 +344+04.1 Vd 1-1 16 39.1 -38 49 16 42.5 -38 55 344.2+04.7 +339+00.2 * He 2-179 16 39.6 -45 55 16 43.2 -46 01 rej. * +326-10.1 * Cn 1-2 16 40.0 -62 32 085 16 44.7 -62 38 rej. * +343+03.1 SuWt 3 16 41.0 -39 58 095 16 44.4 -40 04 343.6+03.7 +000+17.1 PC 12 16 41.0 -18 52 16 43.9 -18 58 000.1+17.2 +335-03.1 HtTr 4 16 41.1 -51 07 090 16 45.0 -51 13 335.2-03.6 +339-00.1 * VB 1 16 41.6 -46 04 092 16 45.3 -46 09 poss. +352+11.2 * K 2-16 16 41.7 -27 59 099 16 44.8 -28 04 352.9+11.4 +043+37.1 NGC 6210 16 42.4 +23 53 16 44.5 +23 48 043.1+37.7 +345+04.1 Vd 1-2 16 43.3 -38 32 16 46.7 -38 37 345.0+04.3 +335-03.2 MmWe 1-7 16 44.1 -50 37 090 16 47.9 -50 42 335.9-03.6 +335-04.1 MmWe 1-8 16 44.8 -51 04 090 16 48.7 -51 09 335.6-04.0 +348+06.1 IRAS16455-3455 16 45.5 -34 56 097 16 48.8 -35 01 348.0+06.3 * +347+05.1 H 1-2 16 45.6 -35 42 16 48.9 -35 47 347.4+05.8 +359+15.1 A 40 16 45.6 -20 56 16 48.6 -21 01 359.1+15.1 +344+03.1 Vd 1-3 16 46.1 -39 16 16 49.5 -39 21 344.8+03.4 +345+03.1 Vd 1-4 16 47.0 -39 03 16 50.4 -39 08 345.0+03.4 +351+09.1 PC 13 16 47.1 -30 15 16 50.3 -30 20 351.9+09.0 +094+38.1 * EL 1647+64 16 47.1 +64 13 047 16 47.5 +64 08 poss. * +350+07.1 * IRAS16478-3217 16 47.9 -32 18 097 16 51.1 -32 23 -- +344+02.1 Vd 1-5 16 48.1 -39 58 16 51.6 -40 03 344.4+02.8 +325-12.1 He 2-182 16 49.8 -64 10 16 54.6 -64 15 325.8-12.8 +342+00.1 H 1-3 16 50.0 -42 34 16 53.5 -42 39 342.7+00.7 +351+07.1 H 1-4 16 50.4 -31 36 16 53.6 -31 41 351.3+07.6 +345+03.2 Vd 1-6 16 51.0 -38 39 16 54.4 -38 44 345.9+03.0 +353+08.1 * MyCn 26 16 52.6 -29 46 099 16 55.8 -29 51 poss. +342-00.1 * PN 1652-4341 16 53.0 -43 42 094 16 56.6 -43 47 342.2-00.3 * +337-04.1 MmWe 1-9 16 53.7 -49 42 091 16 57.5 -49 47 337.6-04.2 +344+00.1 H 1-5 16 53.9 -41 33 16 57.4 -41 38 343.9+00.8 +347+03.1 * Vd 1-7 16 54.1 -37 01 096 16 57.5 -37 06 rej. * +348+04.1 KLSS 1-15 16 54.6 -35 20 097 16 57.9 -35 25 348.9+04.6 * +336-05.1 He 2-186 16 55.7 -51 38 16 59.6 -51 42 336.3-05.6 +321-16.1 He 2-185 16 55.8 -70 02 17 01.3 -70 06 321.3-16.7 +339-03.1 * MaC 1-3 16 57.7 -47 41 092 17 01.4 -47 45 rej. * +349+04.1 M 2-4 16 57.8 -34 45 17 01.1 -34 49 349.8+04.4 +343-00.1 * HtTr 5 16 57.9 -43 02 095 17 01.5 -43 06 343.3-00.6 +000+12.1 IC 4634 16 58.6 -21 45 17 01.6 -21 49 000.3+12.2 +334-07.1 * CPD-53 8315 16 59.0 -53 52 089 17 03.0 -53 56 334.8-07.4 * +351+05.1 M 2-5 16 59.1 -33 06 17 02.4 -33 10 351.2+05.2 +340-03.1 * IRAS16594-4656 16 59.5 -46 56 093 17 03.1 -47 00 340.3-03.2 * +351+04.1 M 1-19 17 00.5 -33 26 17 03.8 -33 30 351.1+04.8 +353+06.2 M 2-6 17 01.1 -30 49 17 04.3 -30 53 353.3+06.3 +347+01.1 Vd 1-8 17 01.2 -37 49 17 04.6 -37 53 347.7+02.0 +350+04.1 H 2-1 17 01.3 -33 55 17 04.6 -33 59 350.9+04.4 +345+00.1 IC 4637 17 01.7 -40 49 17 05.2 -40 53 345.4+00.1 +353+06.1 M 2-7 17 02.0 -30 28 17 05.2 -30 32 353.7+06.3 +343-01.1 Vd 1-9 17 02.0 -43 52 17 05.6 -43 56 343.0-01.7 +352+05.1 M 2-8 17 02.3 -32 28 17 05.5 -32 32 352.1+05.1 +336-06.1 PC 14 17 02.3 -52 26 17 06.3 -52 30 336.2-06.9 +358+09.1 Th 3-1 17 02.7 -25 21 110 17 05.8 -25 25 358.0+09.3 +342-02.1 He 2-198 17 02.8 -44 09 17 06.4 -44 13 342.9-02.0 * +010+18.2 M 2-9 17 02.9 -10 05 17 05.7 -10 09 010.8+18.0 +344-01.1 H 1-6 17 03.4 -42 37 17 07.0 -42 41 344.2-01.2 +354+06.1 * Ta 48 17 03.8 -29 34 102 17 07.0 -29 38 poss. +342-02.2 * Sa 3-41 17 03.9 -44 19 094 17 07.5 -44 23 poss. * +351+03.1 * H 2-2 17 04.1 -34 01 17 07.4 -34 05 rej. * +011+17.1 * DeHt 10 17 04.2 -09 43 024 17 06.9 -09 47 011.4+17.9 * +358+09.2 * Ta 26 17 04.7 -25 00 110 17 07.8 -25 04 poss. +332-09.1 * CPD-56 8032 17 04.8 -56 51 088 17 09.0 -56 55 332.9-09.9 * +358+08.1 * Ta 29 17 05.3 -25 10 110 17 08.4 -25 14 poss. +336-07.1 * K 2-17 17 05.6 -52 09 091 17 09.6 -52 13 336.8-07.2 +345-01.1 H 1-7 17 06.9 -41 49 17 10.4 -41 53 345.2-01.2 +357+07.1 M 4-3 17 07.6 -27 05 17 10.7 -27 09 357.2+07.4 +334-09.1 IC 4642 17 07.6 -55 20 17 11.7 -55 24 334.3-09.3 +340-04.1 Sa 1-5 17 07.7 -47 21 093 17 11.4 -47 25 340.9-04.6 +357+07.2 TaJu 5 17 08.1 -27 08 107 17 11.2 -27 12 -- +354+05.1 * IRAS17084-3025 17 08.5 -30 25 102 17 11.7 -30 29 poss. * +344-01.2 * PN 1708-4227 17 08.8 -42 27 095 17 12.4 -42 31 344.9-01.9 * +352+03.1 * H 2-4 17 08.9 -32 34 17 12.2 -32 38 rej. * +358+07.2 TaJu 8 17 09.5 -26 22 110 17 12.6 -26 26 358.0+07.5 +358+07.1 M 3-36 17 09.6 -25 40 17 12.7 -25 44 358.6+07.8 +354+04.4 Ta 139 17 09.7 -30 37 102 17 12.9 -30 41 354.6+04.9 +018+20.1 Na 1 17 10.2 -03 12 17 12.8 -03 16 018.0+20.1 +349+01.1 NGC 6302 17 10.4 -37 03 17 13.8 -37 06 349.5+01.0 +354+04.1 M 2-10 17 10.9 -31 16 17 14.1 -31 19 354.2+04.3 +009+14.1 NGC 6309 17 11.3 -12 51 17 14.1 -12 54 009.6+14.8 +352+03.2 H 1-8 17 11.4 -33 21 17 14.7 -33 24 352.6+03.0 +355+04.2 Ta 140 17 11.8 -30 17 103 17 15.0 -30 20 355.1+04.7 +331-12.1 CPD-59 6926 17 11.9 -59 26 088 17 16.3 -59 29 331.3-12.1 * +075+35.1 Sa 4-1 17 12.5 +49 20 043 17 13.8 +49 17 075.7+35.8 +354+04.3 Ta 233 17 12.7 -31 19 102 17 15.9 -31 22 354.4+04.0 +359+07.1 * Ta 40 17 13.7 -24 56 115 17 16.8 -24 59 poss. +356+05.1 Th 3-3 17 14.2 -28 56 17 17.4 -28 59 356.5+05.1 +355+04.1 * Sa 3-43 17 14.7 -29 59 103 17 17.9 -30 02 poss. +358+06.1 * TaJu 14 17 15.3 -26 19 110 17 18.4 -26 22 poss. +357+05.1 * TaJu 13 17 15.6 -27 47 107 17 18.6 -27 50 -- +354+03.1 Th 3-4 17 15.6 -31 36 17 18.8 -31 39 354.5+03.3 +355+03.4 Ta 137 17 15.8 -30 51 103 17 19.0 -30 54 355.2+03.7 +342-04.1 He 2-207 17 15.8 -45 50 17 19.5 -45 53 342.9-04.9 +355+03.3 Th 3-6 17 16.1 -31 10 17 19.3 -31 13 354.9+03.5 +359+06.1 M 3-37 17 16.1 -25 14 17 19.2 -25 17 359.8+06.9 +353+02.1 * IRAS17164-3226 17 16.4 -32 26 099 17 19.7 -32 29 353.9+02.7 * +338-08.1 NGC 6326 17 16.8 -51 42 17 20.7 -51 45 338.1-08.3 +341-06.1 SB 26 17 17.3 -47 32 094 17 21.1 -47 35 341.7-06.0 +000+06.2 Trz 41 17 17.3 -24 49 001 17 20.4 -24 52 000.3+06.9 +356+04.1 M 2-11 17 17.4 -28 58 17 20.6 -29 01 356.9+04.5 +356+04.3 * Th 3-7 17 17.9 -29 20 17 21.1 -29 23 rej. * +356+04.2 M 3-38 17 17.9 -29 00 17 21.1 -29 03 356.9+04.4 +358+05.1 M 3-39 17 18.1 -27 09 17 21.2 -27 12 358.5+05.4 +002+08.1 H 1-11 17 18.3 -22 16 17 21.3 -22 19 002.6+08.1 +355+03.2 H 1-9 17 18.3 -30 18 17 21.5 -30 21 355.9+03.6 +357+04.2 TaJu 18 17 18.5 -28 52 107 17 21.7 -28 55 357.1+04.4 +337-09.1 * ESO-180-07 17 18.6 -52 44 091 17 22.6 -52 47 337.4-09.1 * +349-01.1 NGC 6337 17 18.8 -38 26 17 22.2 -38 29 349.3-01.1 +342-06.2 SB 28 17 19.1 -47 00 094 17 22.8 -47 03 342.3-06.0 +354+02.1 * Th 3-8 17 19.3 -32 11 17 22.6 -32 14 rej. * +000+06.1 * Ta 67 17 19.8 -25 22 001 17 22.9 -25 25 poss. +357+04.1 H 2-7 17 20.2 -28 56 17 23.4 -28 59 357.3+04.0 +331-13.1 * SKWL 2-48 17 20.7 -59 30 088 17 25.1 -59 33 poss. * +355+02.1 * Th 3-9 17 20.8 -30 59 17 24.0 -31 02 rej. * +359+05.1 M 2-12 17 20.9 -25 57 17 24.0 -26 00 359.8+05.6 +357+04.3 * Ta 68 17 21.1 -28 44 107 17 24.3 -28 47 poss. +347-02.1 * IRAS17211-4049 17 21.2 -40 50 096 17 24.7 -40 53 poss. * +355+02.3 Th 3-11 17 21.2 -31 41 17 24.4 -31 44 355.1+02.3 +357+03.1 M 3-7 17 21.4 -29 22 17 24.6 -29 25 357.1+03.6 +355+02.2 Th 3-10 17 21.5 -30 49 17 24.7 -30 52 355.9+02.7 +357+03.6 * Ta 69 17 21.5 -28 42 108 17 24.7 -28 45 poss. +358+04.1 M 3-8 17 21.7 -28 03 17 24.8 -28 06 358.2+04.2 +003+07.1 H 2-8 17 21.8 -21 31 17 24.8 -21 34 003.7+07.9 +355+02.4 Ta 138 17 21.8 -31 26 104 17 25.0 -31 29 355.4+02.3 +356+03.1 Th 3-12 17 21.9 -29 43 17 25.1 -29 46 356.8+03.3 +356+02.1 Th 3-13 17 22.1 -30 38 17 25.3 -30 41 356.1+02.7 +359+05.3 TaJu 19 17 22.3 -26 09 116 17 25.4 -26 12 359.8+05.2 +345-04.1 Cn 1-3 17 22.6 -44 09 17 26.2 -44 12 345.0-04.9 +359+04.1 Th 3-14 17 22.6 -26 55 17 25.7 -26 58 359.2+04.7 +359+05.2 M 3-9 17 22.6 -26 09 17 25.7 -26 12 359.9+05.1 +357+03.2 M 3-41 17 22.8 -29 19 17 26.0 -29 22 357.3+03.3 +352+00.1 H 1-12 17 23.1 -34 59 17 26.4 -35 02 352.6+00.1 +343-05.1 SB 30 17 23.4 -45 30 095 17 27.1 -45 33 343.9-05.8 +007+10.1 * MaC 1-4 17 23.7 -16 46 022 17 26.6 -16 49 007.9+10.1 +357+03.4 M 3-42 17 23.8 -29 13 17 27.0 -29 16 357.5+03.2 +358+04.3 SrWe 2 17 23.9 -27 38 110 17 27.0 -27 41 358.8+04.1 +358+04.2 Th 3-15 17 24.0 -27 41 111 17 27.1 -27 43 358.8+04.0 * +342-06.1 Cn 1-4 17 24.1 -46 53 17 27.8 -46 55 342.8-06.6 +358+03.1 M 3-10 17 24.2 -28 25 17 27.4 -28 27 358.2+03.6 +358+03.2 H 2-10 17 24.4 -28 29 17 27.6 -28 31 358.2+03.5 +358+03.9 * Ae 2-B 17 24.6 -28 09 111 17 27.8 -28 11 358.5+03.7 +002+06.1 * IRAS17248-2254 17 24.9 -22 55 012 17 27.9 -22 57 002.9+06.5 * +001+05.1 H 1-14 17 25.0 -24 23 006 17 28.1 -24 25 001.7+05.7 +352-00.1 H 1-13 17 25.1 -35 05 17 28.4 -35 07 352.8-00.2 +358+03.3 Th 3-19 17 25.5 -28 25 17 28.7 -28 27 358.4+03.3 +001+05.2 H 1-15 17 25.6 -24 49 17 28.7 -24 51 001.4+05.3 +357+02.5 M 4-4 17 25.6 -30 05 108 17 28.8 -30 07 357.0+02.4 +011+11.1 M 2-13 17 25.7 -13 24 17 28.5 -13 26 011.1+11.5 +006+08.1 M 1-20 17 26.0 -19 14 17 28.9 -19 16 006.1+08.3 +009+10.1 A 41 17 26.2 -15 11 17 29.1 -15 13 009.6+10.5 +000+04.2 H 1-16 17 26.3 -26 24 17 29.4 -26 26 000.1+04.3 +002+05.1 NGC 6369 17 26.3 -23 43 17 29.3 -23 45 002.4+05.8 +000+04.1 * H 2-11 17 26.3 -25 47 17 29.4 -25 49 000.7+04.7 +344-06.1 Sa 2-208 17 26.4 -45 21 095 17 30.1 -45 23 344.4-06.1 * +358+03.7 H 1-17 17 26.5 -28 38 17 29.7 -28 40 358.3+03.0 +357+02.4 H 1-18 17 26.5 -29 31 17 29.7 -29 33 357.6+02.6 +000+04.3 * IRAS17267-2608 17 26.8 -26 09 001 17 29.9 -26 11 poss. * +358+03.4 H 1-19 17 26.9 -27 57 17 30.0 -27 59 358.9+03.4 +003+06.1 * IRAS17269-2235 17 27.0 -22 35 015 17 30.0 -22 37 003.4+06.3 * +000+04.4 * IRAS17270-2618 17 27.1 -26 19 001 17 30.2 -26 21 poss. * +359+03.4 Ae 2-E 17 27.1 -27 28 116 17 30.2 -27 30 359.3+03.6 +358+02.2 Th 3-23 17 27.2 -29 08 17 30.4 -29 10 358.0+02.6 +358+02.4 Ae 2-F 17 27.3 -28 34 111 17 30.5 -28 36 358.5+02.9 +358+03.6 H 1-20 17 27.6 -28 02 17 30.7 -28 04 358.9+03.2 +002+05.2 K 5-3 17 27.6 -23 43 012 17 30.6 -23 45 002.6+05.5 * +357+02.7 Th 3-24 17 27.6 -30 15 17 30.8 -30 17 357.1+01.9 +359+03.2 Th 3-25 17 27.7 -27 04 17 30.8 -27 06 359.8+03.7 +356+01.2 Th 3-55 17 27.8 -30 59 17 31.0 -31 01 356.5+01.5 +357+02.6 H 2-13 17 27.9 -30 08 17 31.1 -30 10 357.2+02.0 +358+03.8 Th 3-26 17 28.0 -28 13 17 31.2 -28 15 358.8+03.0 +358+02.5 * HtDe 8 17 28.6 -28 40 112 17 31.8 -28 42 358.5+02.6 * +016+13.1 A 42 17 28.8 -08 17 17 31.5 -08 19 016.0+13.5 +349-03.1 H 2-14 17 28.9 -39 49 17 32.4 -39 51 349.2-03.5 +004+06.3 * G 4.4+6.4 17 28.9 -21 48 017 17 31.9 -21 50 -- +350-02.1 H 1-22 17 28.9 -37 55 17 32.3 -37 57 350.8-02.4 +359+02.5 Ae 2-G 17 29.2 -28 12 116 17 32.4 -28 14 359.0+02.8 +348-04.1 H 1-21 17 29.3 -40 56 17 32.8 -40 58 348.4-04.1 +357+01.1 H 1-23 17 29.6 -29 58 17 32.8 -30 00 357.6+01.7 +351-01.1 Sa 2-215 17 29.6 -36 42 098 17 33.0 -36 44 351.9-01.9 * +357+01.2 Ae 2-H 17 30.1 -30 24 108 17 33.3 -30 26 357.2+01.4 +336-11.1 * MmWe 1-10 17 30.4 -54 27 091 17 34.5 -54 29 336.9-11.5 +004+06.2 H 1-24 17 30.6 -21 44 17 33.6 -21 46 004.6+06.0 +357+01.4 * K 6-2 17 30.6 -30 41 109 17 33.8 -30 43 357.1+01.2 +359+02.6 Ae 2-I 17 31.1 -27 54 117 17 34.2 -27 56 359.6+02.2 * +003+05.1 H 2-15 17 31.4 -22 51 17 34.4 -22 53 003.8+05.3 +000+03.1 He 2-250 17 31.8 -26 34 17 34.9 -26 36 000.7+03.2 +358+01.5 JaSt 2 17 31.8 -29 20 112 17 35.0 -29 22 358.4+01.7 +343-07.1 PC 17 17 31.9 -46 58 17 35.6 -47 00 343.5-07.8 +358+01.1 M 4-6 17 32.1 -29 01 17 35.3 -29 03 358.6+01.8 +353-01.1 * K 6-3 17 32.1 -34 46 100 17 35.4 -34 48 353.8-01.2 +358+01.3 * H 1-25 17 32.2 -29 43 17 35.4 -29 45 rej. * +349-04.1 Lo 16 17 32.2 -40 10 097 17 35.7 -40 12 349.3-04.2 +358+01.6 JaSt 3 17 32.2 -29 20 112 17 35.4 -29 22 358.4+01.6 +007+07.1 M 1-22 17 32.2 -18 32 17 35.1 -18 34 007.5+07.4 +341-09.1 He 2-248 17 32.3 -49 24 17 36.2 -49 26 341.5-09.1 +001+03.1 K 5-5 17 32.3 -25 41 006 17 35.4 -25 43 001.5+03.6 * +005+06.1 M 3-11 17 32.4 -20 55 17 35.4 -20 57 005.5+06.1 +358+01.7 JaSt 4 17 32.4 -29 11 112 17 35.6 -29 13 358.6+01.7 +000+02.1 Ae 2-J 17 32.5 -27 22 001 17 35.6 -27 24 000.1+02.6 +003+04.1 K 5-6 17 32.5 -23 10 015 17 35.5 -23 12 003.6+04.9 * +357+01.3 * TaJu 21 17 32.5 -30 20 108 17 35.7 -30 22 357.6+01.0 * +359+02.3 Th 3-33 17 32.7 -27 41 17 35.8 -27 43 359.8+02.4 +358+01.8 JaSt 5 17 32.7 -28 57 112 17 35.9 -28 59 358.8+01.7 +002+04.1 Th 3-27 17 32.9 -24 24 17 36.0 -24 26 002.6+04.2 +350-03.1 H 1-26 17 33.0 -39 20 17 36.5 -39 22 350.1-03.9 +359+02.7 Ae 2-K 17 33.1 -27 59 116 17 36.2 -28 01 359.5+02.6 * +005+05.1 M 3-12 17 33.4 -21 29 17 36.4 -21 31 005.2+05.6 +358+01.4 * Bl B 17 33.8 -29 38 112 17 37.0 -29 40 358.3+01.2 * +003+04.2 K 5-7 17 34.3 -24 02 015 17 37.4 -24 04 003.1+04.1 +007+06.1 M 1-23 17 34.4 -18 45 17 37.3 -18 47 007.6+06.9 +356-00.1 * Th 3-34 17 34.5 -32 14 105 17 37.8 -32 16 poss. +000+02.3 * K 6-4 17 34.6 -27 47 002 17 37.7 -27 49 000.0+02.0 +007+06.2 M 1-24 17 35.2 -19 36 17 38.2 -19 38 007.0+06.3 +359+01.5 JaSt 8 17 35.3 -28 50 117 17 38.5 -28 52 359.2+01.3 +004+04.1 M 1-25 17 35.5 -22 07 17 38.5 -22 09 004.9+04.9 +359+01.1 Th 3-35 17 35.5 -28 41 17 38.7 -28 43 359.3+01.4 +359+01.6 JaSt 9 17 35.6 -29 07 117 17 38.8 -29 09 359.0+01.1 +354-01.1 * K 6-5 17 35.6 -34 26 103 17 38.9 -34 28 354.5-01.7 +346-06.1 Fg 2 17 35.7 -44 08 17 39.3 -44 10 346.3-06.8 +359+01.3 * 19W32 17 35.9 -28 55 117 17 39.1 -28 57 359.2+01.2 +353-02.2 K 5-8 17 35.9 -35 45 100 17 39.3 -35 47 353.4-02.4 +008+06.1 He 2-260 17 36.0 -18 16 17 38.9 -18 18 008.2+06.8 +036+21.1 * Y-C 44 17 36.1 +12 43 035 17 38.4 +12 41 poss. +359+01.4 * K 6-6 17 36.1 -28 14 117 17 39.3 -28 16 rej. * +358+00.1 JaSt 16 17 36.2 -29 40 113 17 39.4 -29 42 358.6+00.7 +000+01.1 K 6-7 17 36.4 -27 26 002 17 39.5 -27 28 000.5+01.9 +347-06.1 SB 31 17 36.5 -42 23 097 17 40.1 -42 25 347.9-06.0 +000+01.2 K 6-8 17 36.5 -27 46 002 17 39.6 -27 48 000.2+01.7 +355-01.2 * K 6-9 17 36.7 -33 34 104 17 40.0 -33 36 355.4-01.4 * +005+05.2 H 2-16 17 36.9 -21 13 17 39.9 -21 15 005.8+05.1 +003+03.1 * H 2-17 17 37.1 -24 24 17 40.2 -24 26 003.1+03.4 * +001+02.1 He 2-262 17 37.1 -26 43 17 40.2 -26 45 001.2+02.1 +355-01.1 * IRAS17372-3328 17 37.2 -33 28 104 17 40.5 -33 30 poss. * +005+04.1 H 1-27 17 37.3 -22 18 17 40.3 -22 20 005.0+04.4 +344-08.1 * PC 18 17 37.3 -47 02 17 41.1 -47 04 rej. * +001+01.1 K 1-4 17 37.3 -26 59 17 40.4 -27 01 001.0+01.9 +353-02.1 * IRAS17373-3542 17 37.4 -35 42 100 17 40.8 -35 44 poss. * +001+02.2 K 5-10 17 38.3 -26 02 006 17 41.4 -26 03 001.9+02.3 +005+04.2 M 3-13 17 38.6 -22 12 17 41.6 -22 13 005.2+04.2 +003+02.1 Hb 4 17 38.8 -24 41 17 41.9 -24 42 003.1+02.9 +003+03.2 M 2-14 17 38.9 -24 10 17 42.0 -24 11 003.6+03.1 +010+07.1 Sa 2-230 17 39.2 -15 55 024 17 42.1 -15 56 010.7+07.4 +027+16.1 * DeHt 2 17 39.2 +03 08 032 17 41.7 +03 07 027.6+16.9 +000+01.3 JaSt 34 17 39.3 -27 54 002 17 42.4 -27 55 000.4+01.1 +000+01.4 JaSt 36 17 39.4 -27 32 003 17 42.5 -27 33 000.8+01.3 +002+02.1 Ta 5 17 39.4 -25 44 012 17 42.5 -25 45 002.3+02.2 +350-05.1 H 1-28 17 39.4 -39 35 17 42.9 -39 36 350.5-05.0 +353-03.1 * IRAS17393-3612 17 39.5 -36 12 100 17 42.9 -36 13 poss. * +017+11.1 IRAS17395-0841 17 39.5 -08 42 028 17 42.2 -08 43 017.0+11.1 * +001+01.3 JaSt 39 17 39.7 -27 20 007 17 42.8 -27 21 001.0+01.3 +001+01.2 K 6-10 17 40.2 -26 43 006 17 43.3 -26 44 001.6+01.5 +000+01.5 JaSt 41 17 40.3 -27 33 003 17 43.4 -27 34 000.9+01.1 +001+01.4 JaSt 43 17 40.4 -26 46 007 17 43.5 -26 47 001.5+01.5 +006+04.1 H 2-18 17 40.5 -21 09 17 43.5 -21 10 006.3+04.4 +045+24.1 K 1-14 17 40.5 +21 28 17 42.6 +21 27 045.6+24.3 +002+02.2 Ta 1580 17 40.6 -25 35 012 17 43.7 -25 36 002.6+02.1 +036+20.1 * Y-C 45 17 40.8 +12 22 035 17 43.1 +12 21 poss. +002+01.4 JaFu 1 17 40.8 -26 11 013 17 43.9 -26 12 002.1+01.7 +355-02.2 H 1-29 17 40.9 -34 16 17 44.2 -34 17 355.2-02.5 +355-02.1 M 3-14 17 41.0 -34 05 17 44.3 -34 06 355.4-02.4 +353-03.2 * K 6-11 17 41.2 -36 13 100 17 44.6 -36 14 353.6-03.6 +003+02.2 * IRAS17414-2412 17 41.5 -24 12 016 17 44.6 -24 13 poss. * +001+01.6 JaSt 49 17 41.5 -26 46 007 17 44.6 -26 47 001.7+01.3 +352-04.1 H 1-30 17 41.7 -38 08 17 45.1 -38 09 352.0-04.6 +343-09.1 SB 29 17 41.8 -47 43 095 17 45.6 -47 44 343.7-09.6 +351-04.1 * H 2-19 17 41.8 -38 16 17 45.2 -38 17 rej. * +346-08.1 IC 4663 17 41.8 -44 53 17 45.5 -44 54 346.2-08.2 +011+07.1 Sa 2-237 17 41.8 -15 44 025 17 44.7 -15 45 011.1+07.0 +345-08.1 Tc 1 17 41.9 -46 04 17 45.6 -46 05 345.2-08.8 +356-01.1 TaJu 23 17 41.9 -32 45 105 17 45.2 -32 46 -- +002+01.3 * K 5-15 17 42.0 -25 43 013 17 45.1 -25 44 002.6+01.7 +001+00.2 JaSt 51 17 42.0 -27 31 007 17 45.1 -27 32 001.1+00.8 +355-02.4 H 1-31 17 42.2 -34 33 17 45.5 -34 34 355.1-02.9 +009+05.1 * He 3-1475 17 42.3 -17 56 023 17 45.2 -17 57 009.3+05.7 * +002+01.2 Ta 1567 17 42.4 -25 37 013 17 45.5 -25 38 002.8+01.8 +001+01.5 JaSt 52 17 42.5 -27 00 007 17 45.6 -27 01 001.6+00.9 +006+04.2 M 3-15 17 42.5 -20 57 17 45.5 -20 58 006.8+04.1 +002+01.1 H 2-20 17 42.6 -25 39 012 17 45.7 -25 40 002.8+01.7 +005+03.1 Pe 1-9 17 42.6 -23 01 17 45.6 -23 02 005.0+03.0 +001+00.3 JaSt 53 17 42.6 -27 30 007 17 45.7 -27 31 001.2+00.7 +358-00.2 M 1-26 17 42.8 -30 11 17 46.0 -30 12 358.9-00.7 +355-02.3 H 1-32 17 42.8 -34 03 17 46.1 -34 04 355.6-02.7 +358-01.1 Bl D 17 42.8 -31 02 17 46.0 -31 03 358.2-01.1 +051+25.1 K 1-15 17 43.0 +27 21 17 45.0 +27 20 051.9+25.8 +008+05.1 Th 4-2 17 43.2 -18 38 17 46.1 -18 39 008.8+05.2 +007+04.1 Th 4-1 17 43.4 -20 13 17 46.4 -20 14 007.5+04.3 +356-02.2 * M 1-27 17 43.5 -33 08 17 46.8 -33 09 356.5-02.3 +358-01.4 JaSt 55 17 43.7 -30 37 113 17 46.9 -30 38 358.6-01.1 +356-02.3 * K 6-12 17 44.0 -33 15 105 17 47.3 -33 16 356.4-02.5 +011+06.1 M 2-15 17 44.0 -16 16 17 46.9 -16 17 011.0+06.2 +356-02.1 * H 2-21 17 44.2 -32 49 17 47.5 -32 50 rej. * +352-04.2 SB 37 17 44.5 -37 47 099 17 47.9 -37 48 352.6-04.9 +004+02.2 IRAS17445-2412 17 44.5 -24 12 017 17 47.6 -24 13 poss. * +355-03.1 H 1-33 17 44.5 -34 07 17 47.8 -34 08 355.7-03.0 +006+03.1 * H 2-22 17 44.6 -21 47 17 47.6 -21 48 006.3+03.3 +353-04.2 * K 6-13 17 44.6 -36 49 101 17 48.0 -36 50 353.4-04.5 +006+03.2 M 1-28 17 44.6 -22 05 17 47.6 -22 06 006.0+03.1 +359-00.1 Hb 5 17 44.7 -29 59 17 47.9 -30 00 359.3-00.9 +006+03.3 * IRAS17448-2131 17 44.8 -21 31 021 17 47.8 -21 32 006.5+03.4 * +005+02.1 H 1-34 17 45.1 -22 46 17 48.1 -22 47 005.5+02.7 +355-03.4 K 5-18 17 45.2 -35 05 104 17 48.5 -35 06 355.0-03.7 +003+01.1 Ta 2111 17 45.4 -24 40 015 17 48.5 -24 41 003.9+01.6 +011+05.1 NGC 6439 17 45.4 -16 28 17 48.3 -16 29 011.0+05.8 +004+01.1 H 2-24 17 45.5 -24 16 17 48.6 -24 17 004.3+01.8 +006+02.1 Th 4-3 17 45.6 -22 16 17 48.6 -22 17 006.0+02.8 +001+00.4 JaSt 60 17 45.6 -27 25 008 17 48.7 -27 26 001.6+00.1 +355-03.2 H 2-23 17 45.6 -34 21 17 48.9 -34 22 355.7-03.4 +358-01.3 JaSt 61 17 45.7 -31 06 113 17 48.9 -31 07 358.5-01.7 +355-03.3 H 1-35 17 45.9 -34 22 17 49.2 -34 23 355.7-03.5 +004+02.1 H 2-25 17 46.0 -23 42 17 49.0 -23 43 004.8+02.0 +358-01.5 JaSt 62 17 46.1 -30 35 113 17 49.3 -30 36 358.9-01.5 +008+03.1 NGC 6445 17 46.3 -20 00 17 49.3 -20 01 008.0+03.9 +353-04.1 * H 1-36 17 46.4 -37 01 17 49.8 -37 02 353.5-04.9 +356-03.1 H 2-26 17 46.5 -34 00 17 49.8 -34 01 356.1-03.3 +353-05.2 JaFu 2 17 46.8 -37 03 101 17 50.2 -37 04 353.5-05.0 +005+02.2 K 5-19 17 46.8 -23 27 019 17 49.8 -23 28 005.1+02.0 +356-03.5 K 5-20 17 46.9 -33 13 106 17 50.2 -33 14 356.8-03.0 +351-06.2 SB 33 17 47.0 -39 40 098 17 50.5 -39 41 351.2-06.3 +000-01.8 JaSt 66 17 47.0 -29 18 003 17 50.2 -29 19 000.1-01.0 +359-01.1 M 1-29 17 47.1 -30 34 17 50.3 -30 35 359.1-01.7 +000-01.1 M 3-43 17 47.2 -29 24 17 50.4 -29 25 000.1-01.1 +000-00.3 JaSt 68 17 47.2 -28 32 003 17 50.4 -28 33 000.0-01.2 +351-06.1 H 1-37 17 47.3 -39 17 17 50.8 -39 18 351.6-06.2 +353-05.1 H 1-38 17 47.3 -37 23 17 50.7 -37 24 353.2-05.2 +332-16.1 HtTr 6 17 47.4 -60 23 088 17 51.9 -60 24 332.8-16.4 +008+03.2 * Th 4-4 17 47.4 -19 53 17 50.4 -19 54 poss. +009+04.1 Th 4-5 17 47.5 -19 02 17 50.4 -19 03 009.0+04.1 +000-00.4 JaSt 71 17 47.6 -28 44 003 17 50.8 -28 45 000.7-00.8 +000-01.9 JaSt 72 17 47.6 -29 24 004 17 50.8 -29 25 000.1-01.2 +355-04.1 Hf 2-1 17 47.9 -34 55 17 51.2 -34 56 355.4-04.0 +006+02.2 * H 2-28 17 48.0 -22 19 17 51.0 -22 20 rej. * +009+04.2 Th 4-6 17 48.0 -18 46 17 50.9 -18 47 009.3+04.1 +000-01.14 JaSt 74 17 48.0 -28 56 005 17 51.2 -28 57 000.6-01.0 +359-01.2 * M 3-44 17 48.1 -30 23 17 51.3 -30 24 359.3-01.8 +358-02.3 * MaC 1-7 17 48.2 -31 13 113 17 51.4 -31 14 rej. * +000-00.5 JaSt 75 17 48.2 -28 35 003 17 51.4 -28 36 000.9-00.9 +358-02.4 Ae 2-O 17 48.5 -32 02 114 17 51.8 -32 03 358.3-02.5 * +358-02.1 M 4-7 17 48.5 -31 35 113 17 51.7 -31 36 358.5-02.5 * +356-03.2 H 2-27 17 48.5 -33 47 17 51.8 -33 48 356.5-03.6 +359-01.4 * IRAS17486-3001 17 48.6 -30 02 118 17 51.8 -30 03 poss. * +351-06.3 SB 34 17 48.7 -39 32 098 17 52.2 -39 33 351.5-06.5 +000-01.11 JaSt 76 17 48.7 -29 30 004 17 51.9 -29 31 000.2-01.4 +358-02.6 * K 6-16 17 48.8 -31 17 114 17 52.0 -31 18 358.6-02.4 +001-00.5 JaSt 77 17 48.8 -27 47 008 17 51.9 -27 48 001.6-00.6 +359-01.3 M 3-45 17 48.9 -30 05 17 52.1 -30 06 359.7-01.8 +001-00.6 JaSt 78 17 48.9 -27 36 008 17 52.0 -27 37 001.8-00.5 * +001-00.4 K 6-17 17 49.0 -28 02 008 17 52.2 -28 03 001.5-00.7 +345-10.1 MmWe 1-11 17 49.0 -46 41 096 17 52.7 -46 42 345.3-10.2 +010+04.1 M 2-17 17 49.2 -17 35 17 52.1 -17 36 010.4+04.5 +357-03.2 M 2-16 17 49.3 -32 45 17 52.6 -32 46 357.4-03.2 +006+02.3 Th 4-7 17 49.4 -21 51 17 52.4 -21 52 006.8+02.3 +000-01.2 Bl 3-15 17 49.4 -29 06 17 52.6 -29 07 000.6-01.3 +359-02.2 M 3-16 17 49.5 -30 49 17 52.7 -30 50 359.1-02.3 +351-06.4 SB 35 17 49.6 -39 24 098 17 53.1 -39 25 351.7-06.6 +332-16.2 * HtTr 7 17 49.6 -60 49 089 17 54.2 -60 50 poss. +010+04.2 V 4334 Sgr 17 49.6 -17 40 024 17 52.5 -17 41 -- +355-04.2 M 1-30 17 49.7 -34 38 17 53.0 -34 39 355.9-04.2 +006+02.5 M 1-31 17 49.7 -22 21 17 52.7 -22 22 006.4+02.0 +000-01.12 JaSt 83 17 49.7 -29 29 004 17 52.9 -29 30 000.3-01.6 +007+02.1 * Th 4-8 17 49.8 -21 15 17 52.8 -21 16 rej. * +001-01.6 JaSt 86 17 50.0 -28 18 009 17 53.2 -28 19 001.3-01.0 +357-03.3 H 2-29 17 50.0 -32 40 17 53.3 -32 41 357.6-03.3 +356-03.3 H 1-39 17 50.0 -33 55 17 53.3 -33 56 356.5-03.9 +000-01.10 JaSt 90 17 50.2 -29 49 004 17 53.4 -29 50 000.1-01.9 +000-01.7 Ae 2-Q 17 50.2 -29 17 004 17 53.4 -29 18 000.5-01.6 +357-03.4 M 2-18 17 50.3 -32 58 17 53.6 -32 59 357.4-03.5 +358-02.5 Ae 2-R 17 50.4 -31 25 114 17 53.6 -31 26 358.7-02.7 +001-01.5 JaSt 92 17 50.4 -28 28 008 17 53.6 -28 29 001.2-01.2a +000-01.5 M 2-19 17 50.6 -29 43 17 53.8 -29 44 000.2-01.9 +006+02.4 Pe 2-10 17 50.6 -21 58 17 53.6 -21 59 006.8+02.0 +000-01.13 JaSt 93 17 50.8 -29 20 005 17 54.0 -29 21 000.5-01.7 +352-06.1 SB 36 17 50.9 -39 10 099 17 54.4 -39 11 352.0-06.7 +036+17.1 A 43 17 51.2 +10 38 17 53.6 +10 37 036.0+17.6 +356-04.1 Cn 2-1 17 51.2 -34 22 17 54.5 -34 23 356.2-04.4 +000-01.6 M 2-20 17 51.2 -29 36 17 54.4 -29 37 000.4-01.9 +001-01.2 Bl Q 17 51.4 -28 12 17 54.6 -28 13 001.6-01.3 +012+04.1 * IRAS17514-1555 17 51.5 -15 55 025 17 54.4 -15 56 012.2+04.9 * +014+06.1 K 2-5 17 51.6 -12 48 17 54.4 -12 49 014.9+06.4 +001-01.4 Sa 3-92 17 51.7 -28 48 008 17 54.9 -28 48 001.1-01.6 +359-02.4 M 3-46 17 51.9 -31 12 17 55.1 -31 12 359.1-02.9 +007+01.1 Hb 6 17 52.1 -21 44 17 55.1 -21 44 007.2+01.8 +000-02.2 Bl 3-10 17 52.1 -29 57 17 55.3 -29 57 000.1-02.3 +359-02.3 H 1-40 17 52.4 -30 33 17 55.6 -30 33 359.7-02.6 +053+24.1 Vy 1-2 17 52.4 +28 00 17 54.4 +28 00 053.3+24.0 +358-03.3 * MaC 1-8 17 52.8 -31 38 115 17 56.0 -31 38 rej. * +000-02.1 Bl 3-13 17 52.9 -29 11 17 56.1 -29 11 000.9-02.0 +001-01.3 * H 2-31 17 52.9 -28 13 17 56.1 -28 13 001.7-01.6 +006+01.1 * HtTr 8 17 52.9 -22 59 021 17 55.9 -22 59 006.2+01.0 +013+05.1 * Sa 3-96 17 52.9 -15 02 025 17 55.8 -15 02 poss. +348-09.1 He 2-306 17 53.0 -43 03 17 56.6 -43 03 348.8-09.0 +013+05.2 * MaC 1-9 17 53.0 -14 06 026 17 55.8 -14 06 rej. * +009+02.1 Th 4-9 17 53.1 -19 29 17 56.1 -19 29 009.3+02.8 +359-03.1 M 3-17 17 53.2 -31 04 17 56.4 -31 04 359.3-03.1 +011+04.1 M 1-32 17 53.4 -16 29 17 56.3 -16 29 011.9+04.2 +356-04.2 H 1-41 17 54.0 -34 09 17 57.3 -34 09 356.7-04.8 +357-04.1 H 1-42 17 54.1 -33 35 17 57.4 -33 35 357.2-04.5 +010+03.1 Th 4-10 17 54.2 -18 06 17 57.1 -18 06 010.6+03.2 +007+01.2 * M 3-18 17 54.3 -21 41 17 57.3 -21 41 rej. * +000-02.5 M 3-47 17 54.5 -30 02 17 57.7 -30 02 000.3-02.8 +358-03.1 H 1-44 17 54.9 -31 43 17 58.1 -31 43 358.9-03.7 +357-04.3 H 1-43 17 54.9 -33 47 109 17 58.2 -33 47 357.1-04.7 +000-02.4 M 2-21 17 55.0 -29 44 17 58.2 -29 44 000.7-02.7 +359-03.2 H 2-33 17 55.0 -31 08 17 58.2 -31 08 359.4-03.4 +000-02.6 M 3-19 17 55.1 -30 00 17 58.3 -30 00 000.4-02.9 +002-02.1 H 1-45 17 55.2 -28 15 17 58.4 -28 15 002.0-02.0 +001-02.2 Sa 3-104 17 55.2 -29 21 009 17 58.4 -29 21 001.0-02.6 +357-04.2 M 2-22 17 55.2 -33 28 17 58.5 -33 28 357.4-04.6 +001-02.1 * H 2-34 17 55.3 -28 33 17 58.5 -28 33 rej. * +002-01.1 Pe 2-11 17 55.4 -27 37 013 17 58.5 -27 37 002.5-01.7 +358-04.1 H 1-46 17 55.8 -32 22 17 59.1 -32 22 358.5-04.2 +349-09.1 SB 32 17 55.9 -42 25 097 17 59.5 -42 25 349.7-09.1 * +000-03.2 KnFs 1 17 56.1 -30 03 005 17 59.3 -30 03 000.5-03.1 * +013+04.1 M 1-33 17 56.1 -15 32 17 59.0 -15 32 013.1+04.1 +002-02.2 M 3-20 17 56.2 -28 14 17 59.4 -28 14 002.1-02.2 +358-04.2 * Sa 3-107 17 56.6 -32 59 115 17 59.9 -32 59 poss. * +359-04.1 M 3-48 17 56.7 -31 54 18 00.0 -31 54 359.0-04.1 +352-07.1 Fg 3 17 56.7 -38 50 18 00.2 -38 50 352.9-07.5 +340-14.1 SKWL 2-41 17 57.0 -52 44 093 18 01.0 -52 44 340.4-14.1 * +356-05.1 H 2-35 17 57.0 -34 28 18 00.3 -34 28 356.8-05.4 +011+02.1 Th 4-11 17 57.2 -17 41 18 00.1 -17 41 011.3+02.8 +002-02.5 KnFs 2 17 57.8 -28 16 014 18 01.0 -28 16 002.2-02.5 * +002-02.3 Pe 2-12 17 58.0 -27 38 18 01.1 -27 38 002.8-02.2 +357-05.1 M 1-34 17 58.1 -33 18 18 01.4 -33 18 357.9-05.1 +014+04.1 Sa 3-111 17 58.3 -14 30 027 18 01.1 -14 30 014.2+04.2 +358-05.1 Pe 1-11 17 58.4 -33 15 18 01.7 -33 15 358.0-05.1 +002-02.4 M 2-23 17 58.5 -28 26 18 01.7 -28 26 002.2-02.7 +096+29.1 NGC 6543 17 58.6 +66 38 048 17 58.6 +66 38 096.4+29.9 +356-05.2 M 2-24 17 58.7 -34 28 18 02.0 -34 28 356.9-05.8 +000-03.1 M 3-22 17 59.1 -30 14 18 02.3 -30 14 000.7-03.7 +355-06.1 M 3-21 17 59.1 -36 39 18 02.5 -36 39 355.1-06.9 +356-06.1 M 3-49 17 59.2 -35 13 18 02.5 -35 13 356.3-06.2 +001-03.3 SAWI 1 17 59.2 -29 25 009 18 02.4 -29 25 001.4-03.4 * +359-04.3 M 2-25 17 59.5 -32 10 18 02.8 -32 10 359.0-04.8 +354-07.2 SB 40 17 59.5 -37 08 103 18 02.9 -37 08 354.7-07.2 +359-04.5 KnFs 3 17 59.6 -31 24 118 18 02.8 -31 24 359.7-04.4 * +003-02.4 * KnFs 4 17 59.7 -27 41 016 18 02.8 -27 41 003.0-02.6 * +014+03.1 * IRAS17597-1442 17 59.8 -14 42 027 18 02.7 -14 42 014.2+03.8 * +001-03.4 * SAWI 2 17 59.9 -29 46 010 18 03.1 -29 46 poss. * +352-08.1 SB 38 18 00.0 -39 22 099 18 03.5 -39 22 352.7-08.4 +003-02.2 M 2-26 18 00.1 -26 59 18 03.2 -26 59 003.6-02.3 +001-03.5 * SAWI 3 18 00.1 -29 51 009 18 03.3 -29 51 rej. * +358-05.2 * H 1-49 18 00.1 -32 43 18 03.4 -32 43 rej. * +003-02.3 IC 4673 18 00.2 -27 07 18 03.3 -27 07 003.5-02.4 +358-05.5 SB 53 18 00.2 -32 38 114 18 03.5 -32 38 358.7-05.1 +001-03.6 * SAWI 4 18 00.4 -29 46 010 18 03.6 -29 46 poss. * +003-02.1 M 1-35 18 00.5 -26 44 18 03.6 -26 44 003.9-02.3 +358-05.3 H 1-50 18 00.6 -32 42 18 03.9 -32 42 358.7-05.2 +359-04.2 M 2-27 18 00.6 -31 18 18 03.8 -31 18 359.9-04.5 +001-03.7 SAWI 5 18 00.7 -29 52 010 18 03.9 -29 52 001.2-03.9 * +357-06.1 M 3-50 18 00.8 -34 29 18 04.1 -34 29 357.1-06.1 +001-03.8 * SAWI 6 18 00.8 -29 27 011 18 04.0 -29 27 poss. * +359-04.4 H 2-36 18 00.9 -31 39 118 18 04.1 -31 39 359.6-04.8 +002-03.7 Sa 3-115 18 00.9 -28 28 014 18 04.1 -28 28 002.4-03.2 * +353-08.1 SB 39 18 01.1 -38 48 101 18 04.6 -38 48 353.3-08.3 +356-06.2 H 1-51 18 01.1 -34 58 18 04.4 -34 58 356.7-06.4 +002-03.2 H 2-37 18 01.3 -28 38 18 04.5 -28 38 002.3-03.4 +002-03.1 * Ap 1-8 18 01.3 -28 22 18 04.5 -28 22 rej. * +000-04.3 Sa 3-117 18 01.5 -31 03 005 18 04.7 -31 03 000.2-04.6 * +354-07.1 H 1-52 18 01.5 -37 38 18 04.9 -37 38 354.4-07.8 +358-05.4 M 3-51 18 01.7 -32 54 18 05.0 -32 54 358.6-05.5 +000-04.1 M 2-28 18 01.8 -30 59 18 05.0 -30 59 000.3-04.6 +356-06.3 SB 48 18 01.9 -35 28 105 18 05.3 -35 28 356.4-06.8 +001-03.9 SAWI 7 18 01.9 -29 21 011 18 05.1 -29 21 001.8-03.8 * +010+00.1 NGC 6537 18 02.3 -19 51 18 05.3 -19 51 010.1+00.7 +002-03.3 M 1-37 18 02.3 -28 22 18 05.5 -28 22 002.6-03.4 +005-01.1 IRAS18023-2513 18 02.3 -25 14 019 18 05.4 -25 14 005.4-01.9 * +355-07.1 SB 42 18 02.5 -36 46 105 18 05.9 -36 46 355.3-07.5 +357-06.2 SB 50 18 02.8 -34 34 109 18 06.1 -34 34 357.3-06.5 +004-02.1 H 1-53 18 02.8 -26 30 18 05.9 -26 30 004.3-02.6 +002-03.4 * H 2-38 18 02.9 -28 17 18 06.1 -28 17 rej. * +002-03.5 M 1-38 18 02.9 -28 41 18 06.1 -28 41 002.4-03.7 +342-14.1 Sp 3 18 03.3 -51 02 18 07.2 -51 02 342.5-14.3 +028+10.1 WeSb 3 18 03.5 +00 22 032 18 06.1 +00 22 028.0+10.2 +356-07.4 SB 45 18 03.5 -36 07 106 18 06.9 -36 07 356.0-07.4B +004-03.1 M 2-29 18 03.6 -26 55 18 06.7 -26 55 004.0-03.0 +003-03.2 KnFs 7 18 03.7 -27 07 016 18 06.8 -27 07 003.9-03.1 * +356-07.3 SB 44 18 03.8 -36 03 106 18 07.2 -36 03 356.0-07.4A +000-04.2 M 3-23 18 03.9 -30 35 18 07.1 -30 35 000.9-04.8 +002-04.1 H 1-54 18 03.9 -29 13 18 07.1 -29 13 002.1-04.2 +356-07.5 SB 47 18 04.0 -35 46 106 18 07.4 -35 46 356.3-07.3 +001-04.1 H 1-55 18 04.0 -29 42 18 07.2 -29 42 001.7-04.4 +359-05.1 * KnFs 9 18 04.1 -31 43 119 18 07.3 -31 43 359.9-05.4 * +019+05.1 IRAS18042-0855 18 04.3 -08 56 029 18 07.0 -08 56 019.8+05.6 * +356-07.1 * He 2-349 18 04.3 -36 07 18 07.7 -36 07 rej. * +015+03.1 M 1-39 18 04.7 -13 29 18 07.5 -13 29 015.9+03.3 +001-04.2 H 1-56 18 04.7 -29 45 18 07.9 -29 45 001.7-04.6 +005-02.1 M 3-24 18 04.8 -25 25 18 07.9 -25 25 005.5-02.5 +004-03.2 KnFs 10 18 04.9 -26 55 018 18 08.0 -26 55 004.2-03.2 * +002-03.6 H 2-39 18 04.9 -28 27 18 08.1 -28 27 002.9-03.9 +359-06.2 SB 54 18 05.3 -32 30 119 18 08.6 -32 29 359.3-06.0 +000-05.1 H 2-40 18 05.3 -31 37 18 08.5 -31 36 000.1-05.6 +000-05.2 SB 2 18 05.4 -31 07 005 18 08.6 -31 06 000.5-05.3 +351-10.2 HtTr 9 18 05.4 -41 49 098 18 09.0 -41 48 351.0-10.4 +008-01.1 M 1-40 18 05.4 -22 17 18 08.4 -22 16 008.3-01.1 +357-07.1 SB 51 18 05.9 -34 48 109 18 09.2 -34 47 357.4-07.2 +005-02.2 * MaC 1-10 18 06.1 -25 05 020 18 09.2 -25 04 005.9-02.6 +005-03.1 H 1-58 18 06.1 -26 03 18 09.2 -26 02 005.1-03.0 +050+19.1 IRAS18062+2410 18 06.3 +24 10 038 18 08.4 +24 11 -- +006-02.1 M 1-41 18 06.4 -24 13 18 09.5 -24 12 006.7-02.2 +356-07.2 H 1-57 18 06.5 -35 45 18 09.9 -35 44 356.6-07.8 +345-13.1 * SKWL 2-37 18 06.8 -48 26 096 18 10.6 -48 25 poss. * +004-03.3 KnFs 11 18 07.1 -27 17 018 18 10.2 -27 16 004.1-03.8 * +003-04.2 * Ap 1-9 18 07.3 -28 08 18 10.5 -28 07 rej. * +003-04.11 KnFs 12 18 07.4 -28 20 017 18 10.6 -28 19 003.2-04.4 * +018+04.1 M 3-52 18 07.7 -10 30 18 10.5 -10 29 018.9+04.1 +002-04.2 M 1-42 18 07.9 -29 00 18 11.1 -28 59 002.7-04.8 +001-05.1 SB 5 18 08.0 -30 39 011 18 11.2 -30 38 001.3-05.6 +003-04.3 H 1-59 18 08.3 -27 47 18 11.4 -27 46 003.8-04.3 +358-07.2 SB 52 18 08.4 -34 01 115 18 11.7 -34 00 358.3-07.3 +003-04.7 * Ap 1-12 18 08.4 -28 23 18 11.6 -28 22 003.3-04.6 +003-04.5 NGC 6565 18 08.7 -28 11 18 11.9 -28 10 003.5-04.6 +358-07.1 NGC 6563 18 08.7 -33 53 18 12.0 -33 52 358.5-07.3 +011-00.1 M 1-43 18 08.9 -18 47 18 11.8 -18 46 011.7-00.0 +355-08.1 SB 43 18 09.0 -36 54 105 18 12.4 -36 53 355.8-08.7 +000-06.2 SB 3 18 09.0 -31 21 005 18 12.2 -31 20 000.7-06.1 +003-04.4 H 2-41 18 09.2 -27 53 18 12.3 -27 52 003.8-04.5 +005-03.2 H 2-42 18 09.3 -26 34 18 12.4 -26 33 005.0-03.9 +004-04.1 H 1-60 18 09.3 -27 30 18 12.4 -27 29 004.2-04.3 +356-08.1 SB 46 18 09.3 -36 33 106 18 12.7 -36 32 356.1-08.6 +351-10.1 SKWL 2-28 18 09.3 -41 31 098 18 12.8 -41 30 351.7-10.9 * +003-04.8 M 2-30 18 09.4 -27 59 18 12.6 -27 58 003.7-04.6 +006-03.1 H 1-61 18 09.5 -24 51 18 12.6 -24 50 006.5-03.1 +003-04.9 * H 2-43 18 09.6 -28 21 18 12.8 -28 20 003.4-04.8 +005-03.3 KnFs 13 18 09.6 -25 45 020 18 12.7 -25 44 005.7-03.6 * +034+11.1 NGC 6572 18 09.7 +06 50 18 12.1 +06 51 034.6+11.8 +002-05.2 KnFs 14 18 09.8 -29 26 014 18 13.0 -29 25 002.5-05.4 * +359-06.1 H 1-62 18 10.0 -32 21 18 13.3 -32 20 000.0-06.8 +001-05.2 SB 6 18 10.0 -30 27 011 18 13.2 -30 26 001.6-05.9 +006-03.3 M 2-31 18 10.2 -25 31 18 13.3 -25 30 006.0-03.6 +005-04.1 H 2-44 18 10.6 -26 10 18 13.7 -26 09 005.5-04.0 +011-00.2 NGC 6567 18 10.8 -19 05 18 13.7 -19 04 011.7-00.6 +001-06.3 SB 4 18 11.0 -31 12 012 18 14.2 -31 11 001.1-06.4 +006-03.4 KnFs 15 18 11.2 -25 22 022 18 14.3 -25 21 006.2-03.7 * +002-05.1 * He 2-370 18 11.4 -29 50 18 14.6 -29 49 rej. * +006-03.2 H 2-45 18 11.4 -24 45 18 14.5 -24 44 006.8-03.4 +359-07.1 M 2-32 18 11.6 -32 38 18 14.9 -32 37 359.8-07.2 +024+05.1 M 4-9 18 11.6 -05 00 18 14.3 -04 59 024.2+05.9 +008-02.1 MaC 1-11 18 11.8 -22 45 023 18 14.8 -22 44 008.6-02.6 +002-06.1 M 2-33 18 11.9 -30 17 18 15.1 -30 16 002.0-06.2 +001-06.1 * CnMy 17 18 12.2 -30 33 18 15.4 -30 32 rej. * +354-10.1 SB 41 18 12.2 -38 29 103 18 15.6 -38 28 354.7-10.0 +359-07.2 SB 56 18 12.3 -32 39 119 18 15.6 -32 38 359.9-07.4 +019+03.1 M 3-25 18 12.5 -10 11 18 15.3 -10 10 019.7+03.2 +022+04.1 * MA 2 18 12.5 -06 58 031 18 15.2 -06 57 022.5+04.8 +004-05.2 * He 2-376 18 12.6 -27 55 018 18 15.8 -27 54 rej. * +004-05.6 SB 8 18 12.7 -27 50 019 18 15.8 -27 49 004.2-05.2 +001-06.2 SwSt 1 18 13.0 -30 53 18 16.2 -30 52 001.5-06.7 +004-05.1 M 3-26 18 13.1 -27 16 18 16.2 -27 15 004.8-05.0 +002-06.2 H 1-63 18 13.1 -30 09 18 16.3 -30 08 002.2-06.3 +004-04.2 * M 1-44 18 13.2 -27 06 18 16.3 -27 05 004.9-04.9 +010-01.1 NGC 6578 18 13.3 -20 28 18 16.3 -20 27 010.8-01.8 +005-04.2 KnFs 16 18 13.8 -26 25 020 18 16.9 -26 24 005.6-04.7 * +337-18.1 He 2-375 18 13.9 -57 12 091 18 18.2 -57 11 poss. +007-03.1 M 2-34 18 14.2 -24 00 18 17.3 -23 59 007.8-03.7 +000-07.1 M 2-35 18 14.4 -31 58 18 17.7 -31 57 000.7-07.4 +003-06.1 M 2-36 18 14.5 -29 10 18 17.7 -29 09 003.2-06.2 +004-05.3 Pe 1-12 18 14.5 -28 18 18 17.7 -28 17 004.0-05.8 +003-06.2 SB 7 18 14.6 -29 07 017 18 17.8 -29 06 003.3-06.1 +007-03.2 * SP 2-128 18 14.7 -24 04 023 18 17.8 -24 03 poss. +348-13.1 IC 4699 18 14.8 -46 00 18 18.5 -45 59 348.0-13.8 +004-05.7 SB 10 18 15.0 -27 33 019 18 18.1 -27 32 004.7-05.5 +023+04.1 * MA 3 18 15.1 -06 50 031 18 17.8 -06 49 023.0+04.3 +006-04.1 Pe 2-13 18 15.1 -25 39 18 18.2 -25 38 006.4-04.6 +038+12.1 Cn 3-1 18 15.2 +10 08 18 17.6 +10 09 038.2+12.0 +008-03.1 H 1-64 18 15.4 -23 26 18 18.4 -23 25 008.4-03.6 +000-07.2 H 2-46 18 15.4 -31 56 18 18.7 -31 55 000.8-07.6 +000-08.1 SB 1 18 15.5 -32 49 006 18 18.8 -32 48 000.1-08.0 +004-05.5 M 2-37 18 15.5 -28 09 18 18.7 -28 08 004.2-05.9 +359-08.1 SB 55 18 16.1 -33 38 119 18 19.4 -33 37 359.4-08.5 +005-05.1 M 2-38 18 16.3 -26 37 18 19.4 -26 36 005.7-05.3 +357-09.1 SB 49 18 16.8 -36 09 109 18 20.2 -36 08 357.2-09.8 +007-04.1 H 1-65 18 17.1 -24 16 18 20.2 -24 15 007.8-04.4 +005-05.3 SB 11 18 17.6 -27 17 021 18 20.7 -27 16 005.2-05.9 +005-05.2 * He 2-390 18 17.9 -26 50 18 21.0 -26 49 rej. * +021+02.1 MaC 1-12 18 18.6 -08 33 030 18 21.3 -08 32 021.9+02.7 * +024+03.1 M 2-40 18 18.7 -06 03 18 21.4 -06 02 024.1+03.8 +005-06.2 SB 12 18 18.8 -27 11 021 18 21.9 -27 10 005.4-06.1 +008-04.1 M 2-39 18 19.0 -24 12 18 22.1 -24 11 008.1-04.7 +002-07.1 M 2-41 18 19.4 -30 45 18 22.6 -30 43 002.3-07.8 +008-04.2 M 2-42 18 19.5 -24 11 18 22.6 -24 09 008.2-04.8 +005-06.1 NGC 6620 18 19.8 -26 51 18 22.9 -26 49 005.8-06.1 +006-05.1 * SB 13 18 19.9 -26 07 021 18 23.0 -26 05 006.5-05.8 +003-07.1 KnFs 19 18 20.0 -29 45 017 18 23.2 -29 43 003.3-07.5 * +012-02.1 M 1-45 18 20.2 -19 19 18 23.1 -19 17 012.6-02.7 +007-05.1 SB 14 18 20.6 -24 49 023 18 23.7 -24 47 007.7-05.3 +032+07.1 K 3-1 18 20.9 +03 35 18 23.4 +03 37 032.9+07.8 +019+00.1 M 3-53 18 21.4 -11 08 18 24.2 -11 06 019.9+00.9 +094+27.1 K 1-16 18 21.6 +64 20 18 21.9 +64 22 094.0+27.4 +007-06.1 H 1-66 18 21.9 -25 44 18 25.0 -25 42 007.0-06.0 +009-04.1 H 1-67 18 22.1 -22 37 18 25.1 -22 35 009.8-04.6 +032+07.2 PC 19 18 22.2 +02 28 18 24.7 +02 30 032.1+07.0 +028+05.1 K 3-2 18 22.4 -01 33 18 25.0 -01 31 028.5+05.1 +030+06.1 * Sh 2-68 18 22.4 +00 50 033 18 24.9 +00 52 030.6+06.2 +009-05.1 NGC 6629 18 22.7 -23 14 18 25.7 -23 12 009.4-05.0 +013-02.1 SrWe 3 18 23.1 -18 14 026 18 26.0 -18 12 013.8-02.8 +353-12.1 WRA 16-411 18 23.2 -40 32 101 18 26.7 -40 30 353.7-12.8 +020+00.1 PN 1823-1047 18 23.2 -10 47 030 18 26.0 -10 45 020.4+00.6 * +027+04.1 M 2-43 18 24.1 -02 45 18 26.7 -02 43 027.6+04.2 +017-01.1 PN 1824-1410 18 24.4 -14 10 029 18 27.2 -14 08 017.6-01.1 * +356-11.1 Lo 17 18 24.4 -37 18 107 18 27.8 -37 16 356.8-11.7 +031+05.1 K 3-3 18 24.6 +01 13 18 27.1 +01 15 031.2+05.9 +007-06.2 Vy 2-1 18 24.9 -26 09 18 28.0 -26 07 007.0-06.8 +021+00.1 * PN 1825-0940 18 25.0 -09 40 030 18 27.7 -09 38 021.6+00.8 * +016-01.1 M 1-46 18 25.1 -15 35 18 28.0 -15 33 016.4-01.9 +009-05.2 SB 16 18 25.3 -23 27 023 18 28.3 -23 25 009.4-05.6 +043+11.1 M 3-27 18 25.5 +14 27 18 27.8 +14 29 043.3+11.6 +022+01.1 MaC 1-13 18 25.9 -08 45 031 18 28.6 -08 43 022.5+01.0 +002-09.1 Cn 1-5 18 26.0 -31 32 18 29.2 -31 30 002.2-09.4 +011-05.1 M 1-47 18 26.2 -21 49 18 29.2 -21 47 011.0-05.1 +016-02.1 Sa 3-134 18 26.5 -15 10 028 18 29.4 -15 08 016.9-02.0 +013-03.1 M 1-48 18 26.6 -19 08 18 29.5 -19 06 013.4-03.9 +013-04.1 Pe 2-14 18 27.0 -19 43 18 30.0 -19 41 013.0-04.3 +015-03.1 A 44 18 27.3 -16 47 18 30.2 -16 45 015.6-03.0 +018-01.1 * M 1-49 18 27.4 -13 56 18 30.2 -13 54 rej. * +020-00.1 A 45 18 27.4 -11 39 18 30.2 -11 37 020.0-00.6 +013-04.2 V-V 3-4 18 27.6 -19 17 026 18 30.5 -19 15 poss. +023+01.1 * MA 13 18 27.8 -07 30 031 18 30.5 -07 28 023.9+01.2 +009-06.2 * SB 15 18 28.2 -24 00 023 18 31.3 -23 58 009.3-06.5 +032+05.1 K 3-4 18 28.5 +02 23 18 31.0 +02 25 032.7+05.6 +008-07.1 He 2-406 18 28.8 -24 48 18 31.9 -24 46 008.6-07.0 +034+06.1 K 3-5 18 29.3 +04 03 18 31.8 +04 05 034.3+06.2 +055+16.1 A 46 18 29.3 +26 54 18 31.3 +26 56 055.4+16.0 +005-08.1 Hf 2-2 18 29.3 -28 46 18 32.5 -28 44 005.1-08.9 +008-07.2 NGC 6644 18 29.5 -25 10 18 32.6 -25 08 008.3-07.3 +021-00.1 M 3-28 18 29.9 -10 08 18 32.7 -10 06 021.8-00.4 +018-02.1 M 3-54 18 30.2 -13 47 18 33.0 -13 45 018.6-02.2 +014-04.1 M 1-50 18 30.4 -18 19 18 33.3 -18 17 014.6-04.3 +021-00.2 M 3-55 18 30.5 -10 18 18 33.3 -10 16 021.7-00.6 +021-01.1 M 1-51 18 30.7 -11 10 18 33.5 -11 08 020.9-01.1 +030+04.1 K 3-6 18 30.7 +00 09 18 33.3 +00 11 031.0+04.1 +038+07.1 * K 1-25 18 30.8 +08 16 036 18 33.2 +08 18 rej. * +010-06.1 IC 4732 18 30.9 -22 41 18 33.9 -22 39 010.7-06.4 +017-02.1 M 1-52 18 31.1 -14 55 18 34.0 -14 53 017.7-02.9 +019-02.1 M 4-10 18 31.4 -13 15 18 34.2 -13 13 019.2-02.2 +028+02.1 K 3-7 18 31.6 -02 30 18 34.2 -02 28 028.7+02.7 +044+10.1 * We 3-1 18 31.8 +14 47 037 18 34.1 +14 49 044.3+10.4 +006-08.1 Ae 1 18 31.8 -27 09 022 18 34.9 -27 07 006.8-08.6 * +010-06.2 Pe 1-13 18 31.8 -22 46 18 34.8 -22 44 010.7-06.7 +004-09.1 SB 9 18 32.5 -29 41 019 18 35.7 -29 39 004.6-09.9 +030+03.1 A 47 18 32.8 -00 16 18 35.4 -00 14 030.8+03.4 +015-04.1 M 1-53 18 32.9 -17 39 18 35.8 -17 37 015.4-04.5 +016-04.1 M 1-54 18 33.2 -17 02 18 36.1 -16 59 016.0-04.3 +009-07.1 IRAS18333-2357 18 33.3 -23 58 024 18 36.4 -23 55 009.8-07.5 * +011-06.1 M 1-55 18 33.6 -21 52 18 36.6 -21 49 011.7-06.6 +014-05.1 V-V 3-5 18 33.6 -19 22 027 18 36.5 -19 19 014.0-05.5 +014-05.2 V-V 3-6 18 34.2 -19 05 027 18 37.1 -19 02 014.3-05.5 +009-08.1 * Y-C 47 18 34.4 -24 29 024 18 37.5 -24 26 poss. +016-04.2 M 1-56 18 34.9 -17 08 18 37.8 -17 05 016.1-04.7 +028+01.1 M 2-44 18 35.0 -03 09 18 37.6 -03 06 028.5+01.6 +011-07.2 SB 18 18 35.7 -22 27 025 18 38.7 -22 24 011.4-07.3 +004-11.1 M 3-29 18 36.2 -30 43 18 39.4 -30 40 004.0-11.1 +027+00.1 M 2-45 18 36.7 -04 23 18 39.3 -04 20 027.7+00.7 +014-06.1 SB 19 18 36.7 -19 17 027 18 39.6 -19 14 014.4-06.1 +011-07.1 * V 348 Sgr 18 37.3 -22 57 025 18 40.3 -22 54 011.1-07.9 * +022-02.1 M 1-57 18 37.6 -10 43 18 40.4 -10 40 022.1-02.4 +023-01.1 * K 3-9 18 37.7 -08 47 18 40.4 -08 44 rej. * +017-04.1 M 3-30 18 38.4 -15 37 18 41.3 -15 34 017.9-04.8 +023-01.2 K 3-11 18 38.4 -08 59 18 41.1 -08 56 023.8-01.7 +020-03.1 * MaC 1-14 18 38.4 -13 15 030 18 41.2 -13 12 rej. * +013-07.2 * Y-C 26 18 39.0 -20 35 026 18 42.0 -20 32 poss. +025-00.1 Pe 1-14 18 39.4 -06 44 18 42.1 -06 41 025.9-00.9 +019-04.2 PN 1839-1418 18 39.6 -14 18 029 18 42.4 -14 15 019.2-04.4 * +029+00.1 A 48 18 40.2 -03 16 18 42.8 -03 13 029.0+00.4 +022-03.1 M 1-58 18 40.2 -11 10 18 43.0 -11 07 022.0-03.1 +031+01.1 PC 20 18 40.5 -00 20 18 43.1 -00 17 031.7+01.7 +023-02.1 M 1-59 18 40.6 -09 08 18 43.3 -09 05 023.9-02.3 +019-04.1 M 1-60 18 40.8 -13 48 18 43.6 -13 45 019.7-04.5 +004-11.2 He 2-418 18 41.0 -30 23 18 44.2 -30 20 004.7-11.8 +014-07.1 M 3-31 18 41.1 -19 58 18 44.1 -19 55 014.2-07.3 +035+03.1 PN 1841+0343 18 41.1 +03 44 034 18 43.6 +03 47 035.4+03.4 * +021-03.1 We 1-7 18 41.3 -12 16 031 18 44.1 -12 13 021.2-03.9 +009-09.1 M 3-32 18 41.6 -25 25 18 44.7 -25 22 009.4-09.8 +029-00.1 ToDo 5 18 42.3 -03 24 032 18 44.9 -03 21 029.2-00.0 * +037+04.1 * K 3-12 18 42.3 +06 04 18 44.7 +06 07 rej. * +002-13.1 IC 4776 18 42.6 -33 24 18 45.9 -33 21 002.0-13.4 +013-07.1 PC 21 18 42.6 -20 38 18 45.6 -20 35 013.8-07.9 +026-01.2 Pe 2-15 18 42.8 -07 00 18 45.5 -06 57 026.0-01.8 +034+02.1 K 3-13 18 42.9 +01 58 18 45.4 +02 01 034.0+02.2 +026-01.1 K 4-5 18 42.9 -06 22 18 45.6 -06 19 026.6-01.5 +019-05.1 M 1-61 18 43.1 -14 31 18 45.9 -14 28 019.4-05.3 +011-09.1 H 2-48 18 43.5 -23 30 18 46.5 -23 27 011.3-09.4 +025-02.1 Pe 1-15 18 43.7 -07 18 18 46.4 -07 15 025.9-02.1 +024-02.1 M 2-46 18 43.8 -08 31 18 46.5 -08 28 024.8-02.7 +022-04.1 * IRAS18442-1144 18 44.3 -11 44 031 18 47.1 -11 41 022.0-04.3 * +026-02.1 Pe 1-16 18 44.8 -06 57 18 47.5 -06 54 026.3-02.2 +024-03.1 Pe 1-17 18 45.1 -09 12 18 47.8 -09 09 024.3-03.3 +009-10.1 M 3-33 18 45.1 -25 32 18 48.2 -25 29 009.6-10.6 +016-07.1 SB 21 18 45.3 -18 33 028 18 48.2 -18 30 016.0-07.6 +016-07.2 SB 22 18 45.6 -17 47 028 18 48.5 -17 44 016.7-07.3 +027-02.1 Pe 1-18 18 46.1 -06 00 18 48.8 -05 57 027.3-02.1 +042+05.1 K 3-14 18 46.2 +10 32 18 48.6 +10 35 042.0+05.4 +014-08.1 SB 20 18 46.4 -19 56 027 18 49.4 -19 53 014.8-08.4 +026-02.3 Pe 1-19 18 47.0 -07 05 18 49.7 -07 02 026.5-03.0 +017-07.1 SB 23 18 47.3 -17 06 029 18 50.2 -17 02 017.5-07.4 +012-09.1 M 1-62 18 47.4 -22 38 18 50.4 -22 34 012.5-09.8 +028-02.1 * SP 2-149 18 47.5 -05 19 032 18 50.2 -05 15 rej. * +051+09.1 Hu 2-1 18 47.6 +20 47 18 49.7 +20 51 051.4+09.6 +031-00.2 * HtTr 10 18 47.8 -01 44 033 18 50.4 -01 40 031.3-00.5 +020-05.1 Sa 1-8 18 47.9 -13 35 030 18 50.7 -13 31 020.7-05.9 +031-00.1 WeSb 4 18 48.1 -01 07 033 18 50.7 -01 03 031.9-00.3 +064+15.1 M 1-64 18 48.2 +35 11 18 50.0 +35 15 064.9+15.5 +044+05.2 CTSS 2 18 48.5 +12 34 037 18 50.8 +12 38 044.1+05.8 +021-05.1 M 1-63 18 48.7 -13 14 18 51.5 -13 10 021.1-05.9 +041+04.1 K 3-15 18 49.3 +09 51 18 51.7 +09 55 041.8+04.4 +044+05.1 K 3-16 18 50.7 +12 12 18 53.0 +12 16 044.0+05.2 +027-03.1 A 49 18 50.8 -06 32 18 53.5 -06 28 027.3-03.4 +027-03.2 Vy 1-4 18 51.3 -06 30 18 54.0 -06 26 027.4-03.5 +029-02.1 * Pe 2-16 18 51.5 -04 43 18 54.2 -04 39 rej. * +024-05.1 M 4-11 18 51.5 -10 09 18 54.3 -10 05 024.2-05.2 +032-00.1 CBSS 2 18 51.5 -00 24 033 18 54.1 -00 20 032.9-00.7 * +025-04.1 K 4-8 18 51.6 -08 51 18 54.3 -08 47 025.3-04.6 * +058+12.1 * K 4-9 18 51.7 +28 28 18 53.7 +28 32 rej. * +063+13.1 NGC 6720 18 51.7 +32 58 18 53.6 +33 02 063.1+13.9 +025-04.2 IC 1295 18 51.9 -08 54 18 54.6 -08 50 025.4-04.7 +003-14.1 Hb 7 18 52.4 -32 20 18 55.6 -32 16 003.9-14.9 +038+02.1 YM 16 18 52.5 +05 59 18 54.9 +06 03 038.7+01.9 +013-10.1 Y-C 32 18 52.5 -21 54 026 18 55.5 -21 50 013.7-10.6 +032-01.1 CBSS 1 18 53.7 -01 38 034 18 56.3 -01 34 032.0-01.7 * +039+02.1 K 3-17 18 53.9 +07 03 18 56.3 +07 07 039.8+02.1 +043+03.1 M 1-65 18 54.2 +10 48 18 56.6 +10 52 043.1+03.8 +017-09.1 SB 24 18 54.4 -17 55 029 18 57.3 -17 51 017.5-09.2 +019-08.1 * MaC 1-15 18 54.4 -15 33 029 18 57.3 -15 29 poss. +028-04.1 Pe 1-20 18 54.6 -06 04 18 57.3 -06 00 028.2-04.0 +028-03.1 Pe 1-21 18 55.2 -05 32 18 57.9 -05 28 028.7-03.9 +035-00.1 * Ap 2-1 18 55.6 +01 33 18 58.1 +01 37 035.1-00.7 +032-02.1 M 1-66 18 55.8 -01 08 18 58.4 -01 04 032.7-02.0 +033-01.1 * SP 2-151 18 56.3 -00 37 034 18 58.9 -00 33 033.2-01.9 * +052+07.1 * K 4-10 18 56.9 +20 33 18 59.1 +20 37 052.2+07.6 +033-02.2 CBSS 3 18 57.7 -00 19 034 19 00.3 -00 15 033.7-02.0 * +032-03.1 K 3-18 18 58.0 -02 16 19 00.6 -02 12 032.0-03.0 +078+18.1 A 50 18 58.0 +48 24 18 59.3 +48 28 078.5+18.7 +017-10.1 A 51 18 58.1 -18 17 19 01.0 -18 13 017.6-10.2 +023-07.1 MaC 1-16 18 58.6 -12 03 032 19 01.4 -11 59 023.3-07.6 +041+01.1 * PN 1858+0821 18 58.7 +08 21 036 19 01.1 +08 25 041.5+01.7 * +068+14.1 * SP 4-1 18 58.7 +38 17 041 19 00.4 +38 21 068.7+14.8 +032-02.2 K 3-19 18 59.0 -01 23 19 01.6 -01 19 032.9-02.8 +014-11.1 SrWe 4 18 59.3 -21 31 028 19 02.3 -21 27 014.7-11.8 +036-01.1 Sh 2-71 18 59.5 +02 05 19 02.0 +02 09 035.9-01.1 +032-03.2 K 3-20 18 59.6 -01 53 19 02.2 -01 49 032.5-03.2 +043+02.1 CTSS 1 18 59.9 +10 13 037 19 02.3 +10 17 043.3+02.2 * +033-02.1 NGC 6741 19 00.0 -00 31 19 02.6 -00 27 033.8-02.6 +047+04.1 K 3-21 19 00.4 +14 24 19 02.7 +14 28 047.1+04.1 +036-01.2 * HtTr 11 19 00.5 +02 58 035 19 03.0 +03 02 036.9-01.1 +046+03.1 Sh 2-78 19 00.9 +14 02 037 19 03.2 +14 06 046.8+03.8 * +038-00.1 * HtTr 12 19 01.3 +05 05 036 19 03.8 +05 10 poss. +051+06.1 K 1-17 19 01.4 +19 17 19 03.6 +19 21 051.5+06.1 +048+04.1 * K 4-12 19 01.5 +16 22 19 03.7 +16 27 rej. * +036-01.3 * IRAS19021+0209 19 02.1 +02 10 035 19 04.6 +02 15 -- +050+05.1 A 52 19 02.3 +17 53 19 04.5 +17 58 050.4+05.2 +003-17.1 Hb 8 19 02.3 -33 16 19 05.6 -33 11 003.8-17.1 +048+04.2 * K 4-16 19 02.6 +15 43 19 04.9 +15 48 048.5+04.2 +011-14.1 * HtDe 10 19 02.6 -25 28 025 19 05.7 -25 23 poss. * +029-05.1 NGC 6751 19 03.3 -06 04 19 06.0 -05 59 029.2-05.9 +046+02.1 CTSS 4 19 04.1 +13 40 038 19 06.4 +13 45 046.8+02.9 +058+09.1 Si 1-2 19 04.1 +27 08 040 19 06.1 +27 13 058.9+09.0 * +040-00.1 A 53 19 04.3 +06 19 19 06.7 +06 24 040.3-00.4 +036-02.1 * HtTr 13 19 05.5 +02 17 035 19 08.0 +02 22 036.9-02.6 +341-24.1 Lo 18 19 05.7 -55 40 094 19 09.8 -55 35 341.2-24.6 +055+06.1 A 54 19 06.5 +22 54 19 08.6 +22 59 055.3+06.6 +041-00.1 * HtTr 14 19 06.8 +07 01 036 19 09.2 +07 06 041.2-00.6 +045+01.1 * K 3-22 19 07.1 +11 56 19 09.4 +12 01 045.6+01.5 +033-05.1 A 55 19 07.8 -02 25 19 10.4 -02 20 033.0-05.3 +039-02.2 * PN 1908+0422 19 08.4 +04 22 036 19 10.9 +04 27 039.1-02.2 * +062+09.1 NGC 6765 19 09.2 +30 28 19 11.1 +30 33 062.4+09.5 +047+01.1 PN 1909+1326 19 09.3 +13 26 038 19 11.6 +13 31 047.2+01.7 * +048+02.1 K 3-24 19 09.8 +15 04 19 12.1 +15 09 048.7+02.3 +044+00.1 AGPF 1 19 09.9 +10 31 037 19 12.3 +10 36 -- +030-07.1 * MaC 1-17 19 10.3 -05 26 033 19 13.0 -05 21 rej. * +037-03.2 A 56 19 10.6 +02 48 19 13.1 +02 53 037.9-03.4 +049+02.1 He 2-428 19 10.8 +15 42 19 13.1 +15 47 049.4+02.4 +038-03.1 * K 4-19 19 10.9 +03 20 19 13.4 +03 25 038.4-03.3 +037-03.3 * K 3-25 19 11.0 +02 13 19 13.5 +02 18 rej. * +049+02.2 * PN 1911+1534 19 11.0 +15 34 038 19 13.3 +15 39 049.3+02.3 * +039-02.1 M 2-47 19 11.1 +04 33 19 13.6 +04 38 039.5-02.7 +042-01.1 * K 4-20 19 11.1 +07 21 19 13.5 +07 26 rej. * +005-18.1 SKWL 2-21 19 11.1 -32 40 021 19 14.3 -32 35 005.2-18.6 * +013-15.1 * We 4-5 19 11.2 -23 47 026 19 14.2 -23 42 013.7-15.3 * +029-07.1 LSA 1 19 11.2 -06 24 032 19 13.9 -06 19 029.8-07.8 +044-00.1 AGPF 2 19 11.3 +10 34 037 19 13.7 +10 39 -- +048+01.1 He 2-429 19 11.4 +14 54 19 13.7 +14 59 048.7+01.9 +038-03.2 M 1-69 19 11.4 +03 33 19 13.9 +03 38 038.7-03.3 +051+03.1 He 2-430 19 11.8 +17 26 19 14.0 +17 31 051.0+03.0 +033-06.1 NGC 6772 19 12.0 -02 48 19 14.6 -02 43 033.1-06.3 +035-05.1 K 3-26 19 12.1 +00 08 19 14.7 +00 13 035.7-05.0 +061+08.1 K 3-27 19 12.5 +28 35 19 14.5 +28 40 061.0+08.0 +051+02.1 IRAS19127+1717 19 12.8 +17 17 039 19 15.0 +17 22 051.0+02.8 * +048+01.2 K 3-29 19 13.2 +13 59 19 15.5 +14 04 048.1+01.1 +027-09.1 IC 4846 19 13.7 -09 08 19 16.4 -09 03 027.6-09.6 +358-21.1 IC 1297 19 14.0 -39 42 19 17.4 -39 37 358.3-21.6 +040-03.1 K 3-30 19 14.0 +05 08 19 16.5 +05 13 040.4-03.1 +019-13.1 DeHt 3 19 14.2 -18 07 030 19 17.1 -18 02 019.4-13.6 +058+06.1 A 57 19 15.0 +25 32 19 17.1 +25 37 058.6+06.1 +026-11.1 Na 2 19 15.6 -11 12 19 18.4 -11 06 025.9-10.9 +037-05.1 A 58 19 15.8 +01 41 035 19 18.3 +01 47 037.5-05.1 +034-06.1 NGC 6778 19 15.8 -01 41 19 18.4 -01 35 034.5-06.7 +041-02.1 NGC 6781 19 16.0 +06 27 19 18.4 +06 33 041.8-02.9 +053+03.1 A 59 19 16.5 +19 29 19 18.7 +19 35 053.3+03.0 +025-11.1 A 60 19 16.5 -12 20 19 19.3 -12 14 025.0-11.6 +052+02.1 K 3-31 19 16.8 +18 57 19 19.0 +19 03 052.9+02.7 +051+01.1 * IRAS19170+1706 19 17.1 +17 06 039 19 19.3 +17 12 051.3+01.8 * +056+04.1 * K 3-32 19 17.5 +22 29 19 19.6 +22 35 rej. * +077+14.1 A 61 19 17.7 +46 09 19 19.2 +46 15 077.6+14.7 +043-03.1 M 4-14 19 18.6 +07 31 19 21.0 +07 37 043.0-03.0 +006-19.1 SKWL 2-18 19 19.0 -31 36 022 19 22.2 -31 30 006.8-19.8 * +032-08.1 Anon. 19 19.4 -04 18 19 22.0 -04 12 poss. +045-01.1 * K 3-33 19 20.1 +10 36 19 22.5 +10 42 045.9-01.9 +037-06.1 NGC 6790 19 20.4 +01 25 19 22.9 +01 31 037.8-06.3 +046-01.1 * PN 1920+1122 19 20.5 +11 22 038 19 22.9 +11 28 046.7-01.6 * +053+01.1 * KLSS 1-1 19 20.7 +18 36 039 19 22.9 +18 42 053.0+01.7 * +055+02.1 He 2-432 19 21.3 +21 02 19 23.5 +21 08 055.2+02.8 +055+02.2 He 1-1 19 21.6 +21 01 19 23.8 +21 07 055.3+02.7 +059+04.1 K 3-34 19 22.0 +25 13 19 24.1 +25 19 059.0+04.6 +045-02.1 Vy 2-2 19 22.0 +09 48 19 24.4 +09 54 045.4-02.7 +051+00.1 KLW 1 19 23.4 +16 27 039 19 25.7 +16 33 051.5+00.2 * +048-01.1 * DeHt 4 19 24.1 +13 14 038 19 26.4 +13 20 048.7-01.5 +031-10.1 M 3-34 19 24.3 -06 41 19 27.0 -06 35 031.0-10.8 +055+02.3 He 1-2 19 24.5 +21 03 19 26.7 +21 09 055.6+02.1 +055+01.1 KLSS 1-2 19 24.5 +20 23 040 19 26.7 +20 29 055.0+01.8 * +046-03.1 PB 9 19 25.4 +10 18 19 27.8 +10 24 046.3-03.1 +056+02.1 K 3-35 19 25.6 +21 24 19 27.8 +21 30 056.0+02.0 +048-02.1 PB 10 19 25.9 +12 13 19 28.2 +12 19 048.0-02.3 +320-28.1 He 2-434 19 27.6 -74 39 19 33.9 -74 33 320.3-28.8 +050-01.1 * K 4-28 19 28.0 +14 41 19 30.3 +14 47 050.4-01.6 +034-10.1 * HtDe 11 19 28.5 -03 49 034 19 31.1 -03 43 034.1-10.5 * +004-22.1 He 2-436 19 28.9 -34 19 19 32.2 -34 13 004.8-22.7 +046-04.1 NGC 6803 19 28.9 +09 57 19 31.3 +10 03 046.4-04.1 +045-04.1 NGC 6804 19 29.2 +09 07 19 31.6 +09 13 045.7-04.5 +044-05.1 K 3-36 19 30.2 +07 21 19 32.6 +07 27 044.3-05.6 +061+03.1 He 2-437 19 30.9 +26 46 19 32.9 +26 53 061.3+03.6 +047-04.1 A 62 19 30.9 +10 31 19 33.3 +10 38 047.1-04.2 +057+01.1 * K 4-30 19 31.0 +22 52 19 33.1 +22 59 poss. +059+02.1 K 3-37 19 31.7 +24 26 19 33.8 +24 33 059.4+02.3 +042-06.1 NGC 6807 19 32.1 +05 34 19 34.6 +05 41 042.9-06.9 +064+05.1 BD+30 3639 19 32.8 +30 24 19 34.8 +30 31 064.7+05.0 +053-01.1 K 3-38 19 33.1 +17 06 19 35.3 +17 13 053.2-01.5 +034-11.1 * PN 1933-0400 19 33.7 -04 00 034 19 36.3 -03 53 034.5-11.7 * +059+02.2 K 3-39 19 33.8 +24 48 19 35.9 +24 55 059.9+02.0 +058+01.1 K 3-40 19 34.2 +23 33 19 36.3 +23 40 058.9+01.3 +055-00.1 M 1-71 19 34.3 +19 36 19 36.5 +19 43 055.5-00.5 +053-02.1 WiOl 1 19 35.2 +16 47 039 19 37.5 +16 54 -- +060+01.1 He 2-440 19 36.1 +25 09 19 38.2 +25 16 060.5+01.8 +060+01.2 IRAS19367+2458 19 36.8 +24 59 041 19 38.9 +25 06 060.4+01.5 * +052-02.2 Me 1-1 19 36.9 +15 50 19 39.2 +15 57 052.5-02.9 +052-02.1 K 3-41 19 37.0 +16 14 19 39.3 +16 21 052.9-02.7 +056-00.1 K 3-42 19 37.4 +20 12 19 39.6 +20 19 056.4-00.9 +019-19.1 * K 2-7 19 37.5 -20 34 19 40.4 -20 27 019.4-19.6 +061+02.1 * He 2-442 19 37.7 +26 23 19 39.8 +26 30 061.8+02.1 +055-01.1 K 3-43 19 38.2 +18 42 19 40.4 +18 49 055.1-01.8 +051-03.1 M 1-73 19 38.9 +14 50 19 41.2 +14 57 051.9-03.8 +054-02.1 M 1-72 19 39.3 +17 38 19 41.5 +17 45 054.4-02.5 +051-04.1 PC 22 19 39.7 +13 44 19 42.0 +13 51 051.0-04.5 +053-03.1 A 63 19 39.9 +16 58 19 42.2 +17 05 053.8-03.0 +052-04.1 M 1-74 19 40.0 +15 02 19 42.3 +15 09 052.2-04.0 +025-17.1 NGC 6818 19 41.1 -14 16 19 43.9 -14 09 025.8-17.9 +065+03.1 TuWe 1 19 41.8 +30 07 041 19 43.8 +30 14 065.4+03.1 +044-09.1 A 64 19 43.1 +05 27 19 45.6 +05 34 poss. +057-01.1 He 2-447 19 43.2 +21 13 19 45.4 +21 20 057.9-01.5 +059-00.2 PN 1943+2251 19 43.4 +22 51 040 19 45.5 +22 58 059.4-00.7 * +083+12.1 NGC 6826 19 43.5 +50 24 19 44.8 +50 31 083.5+12.7 +017-21.1 A 65 19 43.6 -23 16 19 46.6 -23 09 017.3-21.9 +060-00.1 K 3-45 19 44.1 +24 04 19 46.2 +24 11 060.5-00.3 +059-01.1 He 1-3 19 46.3 +22 01 040 19 48.5 +22 09 059.0-01.7 +059-01.2 We 1-8 19 46.7 +22 18 040 19 48.9 +22 26 poss. +066+02.2 KLW 4 19 48.0 +30 07 041 19 50.0 +30 15 065.9+02.4 * +069+03.1 K 3-46 19 48.1 +33 38 19 50.0 +33 46 069.2+03.8 +082+11.1 NGC 6833 19 48.3 +48 50 19 49.7 +48 58 082.5+11.3 +062-00.1 M 2-48 19 48.4 +25 47 19 50.5 +25 55 062.4-00.2 +071+04.1 * TuWe 2-3 19 49.0 +36 12 042 19 50.8 +36 20 071.5+04.9 +066+02.1 * K 4-37 19 49.0 +30 55 19 51.0 +31 03 066.9+02.2 +068+03.1 PC 23 19 50.0 +32 52 19 51.9 +33 00 068.7+03.0 +063+00.1 * K 3-48 19 50.1 +27 11 19 52.2 +27 19 rej. * +069+02.1 K 3-49 19 52.1 +33 14 19 54.0 +33 22 069.2+02.8 +070+03.1 * TuWe 2-4 19 52.4 +34 59 042 19 54.3 +35 07 070.8+03.7 +065+00.1 NGC 6842 19 53.0 +29 09 19 55.0 +29 17 065.9+00.5 +019-23.1 A 66 19 54.6 -21 45 19 57.5 -21 37 019.8-23.7 +068+01.1 K 4-41 19 54.6 +32 14 19 56.5 +32 22 068.7+01.9 +014-25.1 * HtDe 12 19 55.2 -26 36 028 19 58.2 -26 28 014.8-25.6 * +075+05.1 * V 1016 Cyg 19 55.3 +39 42 043 19 57.1 +39 49 poss. +043-13.1 A 67 19 55.9 +02 55 19 58.4 +03 03 043.5-13.4 +068+01.2 He 1-4 19 57.3 +31 46 19 59.3 +31 54 068.6+01.1 +060-03.1 NGC 6853 19 57.4 +22 35 19 59.6 +22 43 060.8-03.6 +060-04.1 A 68 19 58.0 +21 35 20 00.2 +21 43 060.0-04.3 +070+02.1 KLW 6 19 58.0 +34 21 042 19 59.9 +34 29 070.9+02.4 * +042-14.1 NGC 6852 19 58.1 +01 35 20 00.6 +01 43 042.5-14.5 +069+01.2 KLW 5 19 58.8 +32 19 042 20 00.7 +32 27 069.2+01.2 * +029-21.1 * LSIV-12 111 19 59.1 -12 50 033 20 01.9 -12 42 -- +058-05.1 WeSb 5 19 59.5 +19 46 040 20 01.7 +19 54 058.6-05.5 +056-06.1 K 3-51 20 00.3 +17 28 20 02.6 +17 36 056.8-06.9 +067-00.1 K 3-52 20 01.2 +30 24 20 03.2 +30 32 067.9-00.2 +064-02.1 K 3-53 20 01.3 +26 52 20 03.4 +27 00 064.9-02.1 +075+04.1 Anon. 20 02.5 +39 27 20 04.3 +39 36 075.6+04.3 +084+09.1 K 3-73 20 02.5 +49 11 045 20 04.0 +49 20 084.0-09.5 +068-00.1 M 1-75 20 02.8 +31 19 20 04.8 +31 28 068.8-00.0 +063-03.1 * K 3-54 20 02.9 +25 18 20 05.0 +25 27 063.8-03.3 +069+00.1 K 3-55 20 05.0 +32 08 20 07.0 +32 17 069.7-00.0 +107+21.1 K 1-6 20 05.1 +74 18 20 04.3 +74 27 poss. +079+06.1 K 3-56 20 05.3 +44 06 20 06.9 +44 15 079.9+06.4 +065-03.1 We 1-9 20 07.0 +26 18 041 20 09.1 +26 27 065.1-03.5 +078+05.1 DD 1 20 07.0 +42 21 044 20 08.7 +42 30 078.6+05.2 +079+05.1 M 4-17 20 07.4 +43 35 20 09.1 +43 44 079.6+05.8 +057-08.1 NGC 6879 20 08.2 +16 46 20 10.5 +16 55 057.2-08.9 +082+07.1 NGC 6884 20 08.8 +46 19 20 10.4 +46 28 082.1+07.0 +074+02.1 NGC 6881 20 09.0 +37 16 20 10.8 +37 25 074.5+02.1 +060-07.1 He 1-5 20 09.7 +20 11 20 11.9 +20 20 060.3-07.3 +060-07.2 NGC 6886 20 10.5 +19 50 20 12.7 +19 59 060.1-07.7 +077+03.1 KJPN 1 20 10.7 +40 36 044 20 12.5 +40 45 077.5+03.7 +072+00.1 K 3-57 20 10.9 +34 11 20 12.8 +34 20 072.1+00.1 +068-02.1 He 2-459 20 11.9 +29 25 20 13.9 +29 34 068.3-02.7 +054-12.1 NGC 6891 20 12.8 +12 33 20 15.2 +12 42 054.1-12.1 +077+03.2 KJPN 2 20 13.6 +40 25 044 20 15.4 +40 35 077.7+03.1 +069-02.1 NGC 6894 20 14.4 +30 25 20 16.4 +30 34 069.4-02.6 +065-05.1 He 1-6 20 15.2 +25 12 20 17.3 +25 21 065.2-05.6 +077+02.1 * KJ 2-1 20 15.4 +39 36 044 20 17.2 +39 45 poss. +076+01.2 * KJPN 3 20 15.4 +38 41 043 20 17.2 +38 50 076.4+01.8 +359-33.1 CD-41 13967 20 16.1 -41 41 119 20 19.5 -41 32 359.2-33.5 * +066-05.1 PC 24 20 17.5 +26 51 20 19.6 +27 00 066.9-05.2 +058-10.1 IC 4997 20 17.9 +16 34 20 20.2 +16 44 058.3-10.9 +076+01.1 A 69 20 18.1 +38 15 20 19.9 +38 25 076.3+01.1 +071-02.1 M 3-35 20 19.1 +32 20 20 21.1 +32 30 071.6-02.3 +069-03.1 K 3-58 20 19.9 +29 50 20 21.9 +30 00 069.6-03.9 +061-09.1 NGC 6905 20 20.2 +19 57 20 22.4 +20 07 061.4-09.5 +083+05.1 KLW 7 20 20.7 +46 54 045 20 22.3 +47 04 083.7+05.7 +073-02.2 * GM 1-11 20 22.5 +33 52 043 20 24.5 +34 02 poss. * +073-02.1 K 3-76 20 23.1 +33 25 043 20 25.1 +33 35 073.0-02.4 +064-09.1 * K 4-43 20 26.0 +22 41 20 28.2 +22 51 rej. * +079+00.1 * KJPN 4 20 26.5 +40 10 045 20 28.3 +40 20 poss. +078+00.1 SD 1 20 27.5 +40 05 044 20 29.3 +40 15 078.9+00.7 +038-25.1 A 70 20 28.9 -07 16 20 31.6 -07 06 038.1-25.4 +086+05.1 We 1-10 20 30.3 +48 43 046 20 31.9 +48 53 086.1+05.4 +085+04.1 A 71 20 30.8 +47 11 20 32.4 +47 21 084.9+04.4 +063-12.1 * He 2-467 20 33.7 +20 01 20 35.9 +20 11 rej. * +078-02.1 K 4-53 20 40.4 +37 30 044 20 42.3 +37 41 078.3-02.7 +072-07.1 * IRAS20406+2953 20 40.7 +29 53 042 20 42.8 +30 04 -- +084+01.1 K 4-55 20 43.4 +44 28 045 20 45.1 +44 39 084.2+01.0 +088+04.1 K 3-78 20 43.8 +50 12 046 20 45.4 +50 23 088.7+04.6 +076-05.1 * LSII+34 26 20 46.3 +34 16 043 20 48.3 +34 27 076.6-05.7 * +059-18.1 A 72 20 47.7 +13 22 20 50.1 +13 33 059.7-18.7 +092+05.1 K 3-79 20 51.8 +53 34 047 20 53.3 +53 45 092.1+05.8 +086+00.1 * K 4-56 20 54.0 +46 22 046 20 55.7 +46 34 rej. * +095+07.1 A 73 20 55.1 +57 14 20 56.4 +57 26 095.2+07.8 +093+05.2 NGC 7008 20 59.1 +54 21 21 00.6 +54 33 093.4+05.4 +037-34.1 NGC 7009 21 01.5 -11 34 036 21 04.2 -11 22 037.7-34.5 +006-41.1 PaRu 1-1 21 02.7 -37 21 022 21 05.8 -37 09 006.0-41.9 * +089+00.1 NGC 7026 21 04.6 +47 39 21 06.3 +47 51 089.0+00.3 +084-03.1 NGC 7027 21 05.2 +42 02 21 07.1 +42 14 084.9-03.4 +084-04.1 K 3-80 21 05.8 +40 46 046 21 07.7 +40 58 084.2-04.2 * +091+01.1 We 1-11 21 09.2 +50 35 047 21 10.8 +50 47 091.6+01.8 +089-00.1 Sh 1-89 21 12.4 +47 34 21 14.1 +47 46 089.8-00.6 +088-01.1 NGC 7048 21 12.5 +46 05 21 14.3 +46 17 088.7-01.6 +072-17.1 A 74 21 14.6 +23 56 042 21 16.8 +24 09 072.7-17.1 +080-10.1 * RXJ 2117+3412 21 15.1 +34 00 045 21 17.2 +34 13 080.3-10.4 * +087-03.1 * We 2-245 21 16.2 +43 36 046 21 18.1 +43 49 087.4-03.8 +089-02.1 * M 1-77 21 17.3 +46 06 21 19.1 +46 19 089.3-02.2 +083-08.1 K 3-81 21 20.3 +37 54 045 21 22.3 +38 07 083.9-08.4 +101+08.1 A 75 21 25.2 +62 40 21 26.4 +62 53 101.8+08.7 +098+04.1 K 3-60 21 26.0 +57 26 21 27.5 +57 39 098.2+04.9 +065-27.1 Ps 1 21 27.6 +11 57 21 30.0 +12 10 065.0-27.3 +093-00.2 * IRAS21282+5050 21 28.3 +50 51 047 21 30.0 +51 04 poss. +096+02.1 K 3-61 21 28.4 +54 14 21 30.0 +54 27 096.3+02.3 +093-00.1 K 3-82 21 29.1 +49 47 047 21 30.9 +50 00 093.3-00.9 +095+00.1 K 3-62 21 30.1 +52 21 21 31.8 +52 34 095.2+00.7 +089-05.1 IC 5117 21 30.6 +44 22 21 32.5 +44 35 089.8-05.1 +086-08.1 Hu 1-2 21 31.1 +39 25 21 33.1 +39 38 086.5-08.8 +081-14.1 A 78 21 33.3 +31 28 21 35.5 +31 41 081.2-14.9 +094-00.1 K 3-83 21 34.0 +50 41 048 21 35.8 +50 54 094.5-00.8 +066-28.1 NGC 7094 21 34.5 +12 34 21 36.9 +12 47 066.7-28.2 +093-02.1 M 1-79 21 35.2 +48 43 21 37.0 +48 57 093.3-02.4 +091-04.1 K 3-84 21 36.9 +45 47 047 21 38.8 +46 01 091.6-04.8 +098+02.1 K 3-63 21 37.6 +55 32 21 39.2 +55 46 098.1+02.4 +100+04.1 * IRAS21394+5844 21 39.5 +58 45 048 21 41.0 +58 59 -- +095-02.1 M 2-49 21 41.5 +50 11 21 43.3 +50 25 095.1-02.0 +104+07.1 NGC 7139 21 44.8 +63 34 21 46.1 +63 48 104.1+07.9 +097-02.1 M 2-50 21 55.9 +51 27 21 57.7 +51 41 097.6-02.4 +002-52.1 IC 5148-50 21 56.6 -39 38 21 59.6 -39 24 002.7-52.4 +107+07.1 * IsWe 2 22 11.9 +65 39 049 22 13.3 +65 54 107.7+07.8 +103+00.1 M 2-51 22 14.3 +57 14 22 16.1 +57 29 103.2+00.6 +111+11.1 * DeHt 5 22 18.4 +70 41 050 22 19.6 +70 56 111.0+11.6 +104+00.1 Bl 2-1 22 18.5 +57 59 22 20.3 +58 14 104.1+01.0 +103+00.2 M 2-52 22 18.7 +57 21 22 20.5 +57 36 103.7+00.4 +100-05.1 IC 5217 22 21.9 +50 43 22 23.9 +50 58 100.6-05.4 +102-02.1 A 79 22 24.4 +54 34 22 26.3 +54 49 102.9-02.3 +036-57.1 NGC 7293 22 26.9 -21 06 22 29.6 -20 51 036.1-57.1 +104-01.2 KLW 8 22 28.2 +55 56 048 22 30.1 +56 11 104.1-01.4 +099-08.1 * HtDe 13 22 28.5 +47 16 048 22 30.6 +47 31 poss. * +100-08.1 Me 2-2 22 29.6 +47 33 22 31.7 +47 48 100.0-08.7 +104-01.1 M 2-53 22 30.4 +55 55 22 32.3 +56 10 104.4-01.6 +102-05.1 A 80 22 32.7 +52 11 22 34.7 +52 27 102.8-05.0 +105+00.1 * IRAS22331+5809 22 33.1 +58 09 048 22 35.0 +58 25 -- +107+02.1 NGC 7354 22 38.5 +61 01 22 40.4 +61 17 107.8+02.3 +117+18.1 IC 1454 22 42.0 +80 11 22 42.4 +80 27 117.5+18.9 +107-00.1 * K 4-57 22 46.6 +58 13 049 22 48.6 +58 29 107.4-00.6 +111+06.1 * KJPN 6 22 47.3 +66 46 050 22 49.1 +67 02 111.2+07.0 +108+00.1 * K 3-85 22 48.9 +59 14 050 22 50.9 +59 30 rej. * +106-04.1 K 3-86 22 52.6 +54 40 049 22 54.7 +54 56 poss. +107-02.2 K 3-87 22 53.0 +56 26 049 22 55.1 +56 42 107.4-02.6 +107-02.1 M 1-80 22 54.2 +56 53 22 56.3 +57 09 107.7-02.2 +110+01.1 * IRAS22568+6141 22 56.9 +61 42 050 22 58.9 +61 58 110.1+01.9 * +112+03.1 K 3-88 23 10.2 +64 23 051 23 12.3 +64 39 112.5+03.7 +110-01.1 WeSb 6 23 10.9 +59 01 050 23 13.1 +59 17 poss. +111-03.1 * We 2-260 23 20.2 +57 30 051 23 22.5 +57 46 rej. * +107-13.1 Vy 2-3 23 20.6 +46 38 23 23.0 +46 54 107.6-13.3 +112-00.1 KJPN 8 23 21.9 +60 41 051 23 24.1 +60 57 112.5-00.1 +106-17.1 NGC 7662 23 23.5 +42 16 049 23 25.9 +42 33 106.5-17.6 +111-02.1 Hb 12 23 24.0 +57 54 23 26.3 +58 11 111.8-02.8 +116+08.1 M 2-55 23 29.7 +70 06 23 31.9 +70 23 116.2+08.5 +104-29.1 Jn 1 23 33.4 +30 11 23 35.9 +30 28 104.2-29.6 +110-12.1 K 1-20 23 36.7 +47 56 23 39.1 +48 13 110.6-12.9 +120+18.1 * Sh 2-174 23 43.0 +80 40 051 23 45.1 +80 57 120.3+18.3 * +114-04.1 A 82 23 43.3 +56 47 23 45.7 +57 04 114.0-04.6 +113-06.1 A 83 23 44.3 +54 28 23 46.8 +54 45 113.6-06.9 +112-10.1 A 84 23 45.3 +51 07 23 47.8 +51 24 112.9-10.2 +116+00.1 * We 2-262 23 49.9 +62 16 051 23 52.4 +62 33 poss. * +118+08.1 * M 2-56 23 54.1 +70 32 23 56.6 +70 49 poss. +118+08.2 A 86 23 59.0 +70 26 00 01.6 +70 43 118.7+08.2 * diff --git a/astro_data/perek_kohoutek/table4.dat b/astro_data/perek_kohoutek/table4.dat new file mode 100644 index 000000000..ddd2c895c --- /dev/null +++ b/astro_data/perek_kohoutek/table4.dat @@ -0,0 +1,6576 @@ +119+06.1 A 1 00 10 12.6 +68 53 36. 1950 50.134.178 00 12 55.16 +69 10 16.7 +119+06.1 A 1 00 10 12.0 +68 53 42. 1950 70.002.006 00 12 54.56 +69 10 22.7 +119+06.1 A 1 00 12 55.12 +69 10 16.8 2000 72.002.012 rad 00 12 55.12 +69 10 16.8 +119+06.1 A 1 00 10 12.2 +68 53 41. 1950 Ko,Ku (1999) 00 12 54.76 +69 10 21.7 +120+09.1 NGC 40 00 07 35.10 +71 57 57.4 1900 CGPN/Kb 09 00 13 01.26 +72 31 19.8 +120+09.1 NGC 40 00 06 31.12 +71 51 17.3 1880 CGPN/Wn 09 00 13 01.24 +72 31 20.5 +120+09.1 NGC 40 00 10 16.5 +72 14 39. 1950 CGPN/Ko 64d 00 13 00.96 +72 31 19.7 +120+09.1 NGC 40 00 10 16.64 +72 14 38.6 1950 12.133.017 00 13 01.10 +72 31 19.2 +120+09.1 NGC 40 00 10 16.5 +72 14 39. 1950 65.134.076 00 13 00.96 +72 31 19.7 +120+09.1 NGC 40 00 10 16.4 +72 14 38. 1950 70.002.006 00 13 00.86 +72 31 18.7 +120+09.1 NGC 40 00 13 01.05 +72 31 19.6 2000 72.002.012 rad 00 13 01.05 +72 31 19.6 +120+09.1 NGC 40 00 10 16.54 +72 14 39.3 1950 GSC 4302-01297 00 13 01.00 +72 31 19.9 +120+09.1 NGC 40 00 13 01.03 +72 31 19.0 2000 HIP 001041 00 13 01.03 +72 31 19.0 +120+09.1 NGC 40 00 10 12.6 +68 53 36. 1950 50.134.178 00 12 55.16 +69 10 16.7 +120+09.1 NGC 40 00 10 12.0 +68 53 42. 1950 70.002.006 00 12 54.56 +69 10 22.7 +120+09.1 NGC 40 00 12 55.12 +69 10 16.8 2000 72.002.012 rad 00 12 55.12 +69 10 16.8 +120+09.1 NGC 40 00 10 12.2 +68 53 41. 1950 Ko,Ku (1999) 00 12 54.76 +69 10 21.7 +120+09.1 NGC 40 00 07 35.10 +71 57 57.4 1900 CGPN/Kb 09 00 13 01.26 +72 31 19.8 +120+09.1 NGC 40 00 06 31.12 +71 51 17.3 1880 CGPN/Wn 09 00 13 01.24 +72 31 20.5 +120+09.1 NGC 40 00 10 16.5 +72 14 39. 1950 CGPN/Ko 64d 00 13 00.96 +72 31 19.7 +120+09.1 NGC 40 00 10 16.64 +72 14 38.6 1950 12.133.017 00 13 01.10 +72 31 19.2 +120+09.1 NGC 40 00 10 16.5 +72 14 39. 1950 65.134.076 00 13 00.96 +72 31 19.7 +120+09.1 NGC 40 00 10 16.4 +72 14 38. 1950 70.002.006 00 13 00.86 +72 31 18.7 +120+09.1 NGC 40 00 13 01.05 +72 31 19.6 2000 72.002.012 rad 00 13 01.05 +72 31 19.6 +120+09.1 NGC 40 00 10 16.54 +72 14 39.3 1950 GSC 4302-01297 00 13 01.00 +72 31 19.9 +120+09.1 NGC 40 00 13 01.03 +72 31 19.0 2000 HIP 001041 00 13 01.03 +72 31 19.0 +120+09.1 NGC 40 00 10 16.8 +72 14 37. 1950 IRAS00102+7214 00 13 01.26 +72 31 17.6 +118-08.1 Vy 1-1 00 16 01.5 +53 35 41. 1950 CGPN/Ko 65a 00 18 42.16 +53 52 20.1 +118-08.1 Vy 1-1 00 16 01.58 +53 35 40.6 1950 12.133.017 00 18 42.24 +53 52 19.7 +118-08.1 Vy 1-1 00 16 01.55 +53 35 40.5 1950 37.134.035 00 18 42.21 +53 52 19.6 +118-08.1 Vy 1-1 00 16 01.5 +53 35 41. 1950 70.002.006 00 18 42.16 +53 52 20.1 +118-08.1 Vy 1-1 00 18 41.91 +53 52 19.9 2000 70.002.006 rad 00 18 41.91 +53 52 19.9 +118-08.1 Vy 1-1 00 16 01.4 +53 35 36. 1950 IRAS00160+5335 00 18 42.06 +53 52 15.1 +119+00.1 BV 1 00 17 14.5 +62 42 22. 1950 CGPN/Ko 65a 00 19 58.83 +62 59 00.7 +119+00.1 BV 1 00 17 15.0 +62 42 22. 1950 30.135.052 00 19 59.34 +62 59 00.7 +119+00.1 BV 1 00 17 14.6 +62 42 22. 1950 70.002.006 00 19 58.93 +62 59 00.7 +119+00.1 BV 1 00 20 00.06 +62 58 56.3 2000 72.002.012 rad 00 20 00.06 +62 58 56.3 +119+00.1 BV 1 00 17 14.4 +62 42 15. 1950 IRAS00172+6242 00 19 58.73 +62 58 53.7 +119-06.1 Hu 1-1 00 25 30.2 +55 41 20. 1950 CGPN/Ko 64d 00 28 15.48 +55 57 55.1 +119-06.1 Hu 1-1 00 25 30.29 +55 41 19.5 1950 12.133.017 00 28 15.57 +55 57 54.6 +119-06.1 Hu 1-1 00 25 30.33 +55 41 19.7 1950 37.134.035 00 28 15.61 +55 57 54.8 +119-06.1 Hu 1-1 00 25 30.3 +55 41 19. 1950 50.134.178 00 28 15.58 +55 57 54.1 +119-06.1 Hu 1-1 00 25 30.4 +55 41 19. 1950 70.002.006 00 28 15.68 +55 57 54.1 +119-06.1 Hu 1-1 00 28 15.63 +55 57 54.4 2000 70.002.006 rad 00 28 15.63 +55 57 54.4 +119-06.1 Hu 1-1 00 25 30.2 +55 41 20. 1950 St,Sa (1977) 00 28 15.48 +55 57 55.1 +119-06.1 Hu 1-1 00 25 30.4 +55 41 18. 1950 IRAS00255+5541 00 28 15.68 +55 57 53.1 +120-05.1 Sh 2-176 00 29 06.0 +57 06 00. 1950 70.002.006 * 00 31 53.54 +57 22 33.1 +120-05.1 Sh 2-176 00 28 57.6 +57 05 44. 1950 Ko,Ku (1999) 00 31 45.07 +57 22 17.2 +108-76.1 BOBN 1 00 34 44.8 -13 59 29. 1950 70.002.006 00 37 15.98 -13 42 59.0 +108-76.1 BOBN 1 00 34 44.9 -13 59 28. 1950 Ko,Ku (1999) 00 37 16.08 -13 42 58.0 +121+03.1 We 1-1 00 35 55.2 +66 07 12. 1950 20.135.021 00 38 53.65 +66 23 40.6 +121+03.1 We 1-1 00 35 55.8 +66 07 18. 1950 50.134.178 00 38 54.25 +66 23 46.6 +121+03.1 We 1-1 00 35 55.6 +66 07 22. 1950 70.002.006 00 38 54.05 +66 23 50.6 +121+03.1 We 1-1 00 38 54.19 +66 23 47.2 2000 72.002.012 rad 00 38 54.19 +66 23 47.2 +121+03.1 We 1-1 00 35 55.9 +66 07 13. 1950 IRAS00359+6607 00 38 54.35 +66 23 41.6 +121+00.1 BV 2 00 37 25.7 +62 35 02. 1950 CGPN/Ko 65a 00 40 21.34 +62 51 29.6 +121+00.1 BV 2 00 37 26.0 +62 34 49. 1950 30.135.052 00 40 21.64 +62 51 16.6 +121+00.1 BV 2 00 37 25.6 +62 35 01. 1950 70.002.006 00 40 21.24 +62 51 28.6 +121+00.1 BV 2 00 40 22.48 +62 51 35.1 2000 72.002.012 rad 00 40 22.48 +62 51 35.1 +121+00.1 BV 2 00 37 26.7 +62 34 51. 1950 IRAS00374+6234 00 40 22.35 +62 51 18.6 +122-04.1 A 2 00 42 40.6 +57 41 10. 1950 34.134.010 00 45 34.68 +57 57 33.5 +122-04.1 A 2 00 42 40.9 +57 41 08. 1950 50.134.178 00 45 34.98 +57 57 31.5 +122-04.1 A 2 00 42 40.7 +57 41 12. 1950 70.002.006 00 45 34.78 +57 57 35.5 +122-04.1 A 2 00 45 34.78 +57 57 33.3 2000 70.002.006 rad 00 45 34.78 +57 57 33.3 +122-04.1 A 2 00 42 40.7 +57 41 19. 1950 IRAS00426+5741 00 45 34.78 +57 57 42.5 +118-74.1 NGC 246 00 44 32.1 -12 08 44. 1950 02.133.027 * 00 47 03.04 -11 52 21.6 +118-74.1 NGC 246 00 44 35.3 -12 09 03. 1950 09.133.025 00 47 06.23 -11 52 40.6 +118-74.1 NGC 246 00 44 32.9 -12 08 44. 1950 34.134.010 00 47 03.84 -11 52 21.6 +118-74.1 NGC 246 00 44 31.1 -12 08 44. 1950 50.134.178 00 47 02.04 -11 52 21.6 +118-74.1 NGC 246 00 44 32.7 -12 08 42. 1950 70.002.006 00 47 03.64 -11 52 19.6 +118-74.1 NGC 246 00 47 03.45 -11 52 18.2 2000 AC 2316872 00 47 03.45 -11 52 18.2 +118-74.1 NGC 246 00 47 03.35 -11 52 18.9 2000 HIP 003678 00 47 03.35 -11 52 18.9 +125-47.1 PHL 932 00 57 18.1 +15 28 11. 1950 41.002.074 * 00 59 56.58 +15 44 20.6 +125-47.1 PHL 932 00 57 10.0 +15 26 00. 1950 50.134.178 00 59 48.46 +15 42 09.7 +125-47.1 PHL 932 00 57 19.0 +15 28 00. 1950 70.002.006 00 59 57.48 +15 44 09.6 +125-47.1 PHL 932 00 57 18.3 +15 28 03. 1950 Ko,Ku (1999) 00 59 56.78 +15 44 12.6 +125-47.1 PHL 932 00 59 56.43 +15 44 13.5 2000 AC 0452873 00 59 56.43 +15 44 13.5 +125-47.1 PHL 932 00 57 18.25 +15 28 04.2 1950 GSC 1189-01457 00 59 56.73 +15 44 13.8 +125-47.1 PHL 932 00 59 56.65 +15 44 13.7 2000 HIP 004666 00 59 56.65 +15 44 13.7 +124-07.1 WeSb 1 00 57 55.7 +54 47 30. 1950 30.135.002 * 01 00 53.85 +55 03 38.5 +124-07.1 WeSb 1 00 57 55.7 +54 47 45. 1950 70.002.006 01 00 53.86 +55 03 53.5 +124-07.1 WeSb 1 00 57 56.1 +54 47 52. 1950 Ko,Ku (1999) 01 00 54.26 +55 04 00.5 +124+02.1 * KLSS 2-7 00 59 12.3 +65 30 29. 1950 63.134.060 01 02 24.76 +65 46 35.9 +124+02.1 * KLSS 2-7 01 02 24.7 +65 46 36. 2000 66.134.013 01 02 24.7 +65 46 36. +124+02.1 * KLSS 2-7 00 59 12.1 +65 30 28. 1950 IRAS00592+6530 01 02 24.56 +65 46 34.9 +124+10.1 EL 0103+73 01 03 31.2 +73 17 22. 1950 43.134.029 * 01 07 08.07 +73 33 23.5 +124+10.1 EL 0103+73 01 03 36.0 +73 16 56. 1950 70.002.006 01 07 12.92 +73 32 57.4 +124+10.1 EL 0103+73 01 03 31.1 +73 17 21. 1950 Ko,Ku (1999) 01 07 07.97 +73 33 22.5 +126+03.1 K 3-90 01 21 32.8 +65 22 59. 1950 50.134.178 01 24 58.68 +65 38 35.5 +126+03.1 K 3-90 01 21 32.7 +65 22 59. 1950 70.002.006 01 24 58.58 +65 38 35.5 +126+03.1 K 3-90 01 24 58.78 +65 38 34.2 2000 70.002.006 rad 01 24 58.78 +65 38 34.2 +126+03.1 K 3-90 01 21 33.5 +65 23 02. 1950 IRAS01215+6523 01 24 59.39 +65 38 38.5 +128-04.1 * S 22 01 27 25.0 +58 06 33. 1950 70.002.006 * 01 30 39.63 +58 22 00.3 +128-04.1 * S 22 01 27 18.7 +58 09 22. 1950 Ko,Ku (1999) 01 30 33.36 +58 24 49.5 +130-11.1 M 1-1 01 34 13. +50 12 59. 1950 CGPN/Mi 59 01 37 19.46 +50 28 14.8 +130-11.1 M 1-1 01 34 12.9 +50 12 57. 1950 CGPN/Ko 64d 01 37 19.36 +50 28 12.8 +130-11.1 M 1-1 01 34 13.01 +50 12 56.3 1950 37.134.035 01 37 19.47 +50 28 12.1 +130-11.1 M 1-1 01 34 13.0 +50 12 56. 1950 50.134.178 01 37 19.46 +50 28 11.8 +130-11.1 M 1-1 01 34 13.1 +50 12 55. 1950 70.002.006 01 37 19.56 +50 28 10.8 +130-11.1 M 1-1 01 37 19.27 +50 28 11.7 2000 70.002.006 rad 01 37 19.27 +50 28 11.7 +130-11.1 M 1-1 01 34 13.0 +50 12 55. 1950 IRAS01342+5012 01 37 19.46 +50 28 10.8 +129-05.1 KLSS 2-8 01 36 50.0 +56 19 33. 1950 63.134.060 01 40 05.72 +56 34 43.9 +129-05.1 KLSS 2-8 01 40 05.7 +56 34 44. 2000 66.134.013 01 40 05.7 +56 34 44. +129-05.1 KLSS 2-8 01 36 50.3 +56 19 43. 1950 Ko,Ku (1999) 01 40 06.03 +56 34 53.9 +130-10.1 NGC 650-1 01 35 49.56 +51 02 58.4 1897 CGPN/We 03 * 01 42 18.17 +51 34 13.1 +130-10.1 NGC 650-1 01 34 47.38 +50 58 10.8 1880 CGPN/Wn 09 01 42 19.59 +51 34 37.2 +130-10.1 NGC 650-1 01 39 10.2 +51 19 23. 1950 02.133.027 01 42 19.63 +51 34 29.7 +130-10.1 NGC 650-1 01 39 10.20 +51 19 24.9 1950 12.133.017 01 42 19.64 +51 34 31.6 +130-10.1 NGC 650-1 01 39 10.5 +51 19 30. 1950 50.134.178 01 42 19.94 +51 34 36.7 +130-10.1 NGC 650-1 01 39 10.5 +51 19 28. 1950 70.002.006 01 42 19.94 +51 34 34.7 +130-10.1 NGC 650-1 01 42 19.69 +51 34 31.7 2000 70.002.006 rad 01 42 19.69 +51 34 31.7 +130-10.1 NGC 650-1 01 39 09.6 +51 19 19. 1950 IRAS01391+5119 01 42 19.03 +51 34 25.7 +129-02.1 * We 2-5 01 39 11.0 +59 54 00. 1950 50.134.178 * 01 42 34.11 +60 09 06.5 +129-02.1 * We 2-5 01 39 15.0 +59 55 00. 1950 70.002.006 01 42 38.18 +60 10 06.3 +129-02.1 * We 2-5 01 39 14.8 +59 54 51. 1950 Ko,Ku (1999) 01 42 37.97 +60 09 57.3 +131-05.1 BV 3 01 49 42.0 +56 09 36. 1950 30.135.052 01 53 02.51 +56 24 22.0 +131-05.1 BV 3 01 49 41.2 +56 09 34. 1950 34.134.010 01 53 01.70 +56 24 20.0 +131-05.1 BV 3 01 49 42.6 +56 09 33. 1950 70.002.006 01 53 03.11 +56 24 19.0 +131-05.1 BV 3 01 53 02.40 +56 24 20.0 2000 70.002.006 rad 01 53 02.40 +56 24 20.0 +130+01.1 IC 1747 01 53 57.7 +63 04 42. 1950 CGPN/Ko 64d 01 57 35.46 +63 19 18.8 +130+01.1 IC 1747 01 53 57.9 +63 04 42. 1950 41.134.007 01 57 35.66 +63 19 18.8 +130+01.1 IC 1747 01 53 57.7 +63 04 40. 1950 70.002.006 01 57 35.46 +63 19 16.8 +130+01.1 IC 1747 01 57 35.85 +63 19 18.8 2000 70.002.006 rad 01 57 35.85 +63 19 18.8 +130+01.1 IC 1747 01 53 57.9 +63 04 46. 1950 St,Sa (1977) 01 57 35.67 +63 19 22.8 +130+01.1 IC 1747 01 53 57.8 +63 04 39. 1950 IRAS01539+6304 01 57 35.56 +63 19 15.8 +129+04.1 K 3-91 01 54 47.0 +66 19 24. 1950 50.134.178 * 01 58 35.45 +66 33 58.8 +129+04.1 K 3-91 01 54 46.9 +66 19 27. 1950 70.002.006 01 58 35.35 +66 34 01.9 +129+04.1 K 3-91 01 58 35.43 +66 34 13.8 2000 70.002.006 rad 01 58 35.43 +66 34 13.8 +148-48.1 * GR 0155+10 01 55 19.2 +10 42 02. 1950 Ko,Ku (1999) 01 57 59.18 +10 56 37.2 +133-08.1 * M 1-2 01 55 33. +52 39 17. 1950 CGPN/Mi 59 01 58 49.79 +52 53 50.8 +133-08.1 * M 1-2 01 55 32.9 +52 39 15. 1950 CGPN/Ko 64d 01 58 49.69 +52 53 48.8 +133-08.1 * M 1-2 01 55 32.5 +52 39 10. 1950 33.134.004 01 58 49.28 +52 53 43.8 +133-08.1 * M 1-2 01 55 32.86 +52 39 14.8 1950 51.117.039 01 58 49.65 +52 53 48.6 +133-08.1 * M 1-2 01 55 32.9 +52 39 15. 1950 70.002.006 01 58 49.69 +52 53 48.8 +133-08.1 * M 1-2 01 55 32.7 +52 39 15. 1950 LSV+52 1 01 58 49.48 +52 53 48.8 +133-08.1 * M 1-2 01 55 32.6 +52 39 10. 1950 IRAS01555+5239 01 58 49.38 +52 53 43.8 +130+03.1 K 3-92 01 59 55.9 +64 43 12. 1950 50.134.178 * 02 03 41.74 +64 57 35.7 +130+03.1 K 3-92 01 59 55.4 +64 43 14. 1950 70.002.006 02 03 41.24 +64 57 37.7 +131+02.1 A 3 02 08 19.1 +63 55 02. 1950 34.134.010 02 12 06.67 +64 09 06.5 +131+02.1 A 3 02 08 19.6 +63 54 56. 1950 50.134.178 02 12 07.17 +64 09 00.5 +131+02.1 A 3 02 08 19.1 +63 54 58. 1950 70.002.006 02 12 06.67 +64 09 02.5 +131+02.1 A 3 02 12 06.46 +64 09 08.4 2000 72.002.012 rad 02 12 06.46 +64 09 08.4 +132+04.1 K 3-93 02 22 29.1 +65 34 24. 1950 70.002.006 02 26 30.02 +65 47 53.3 +132+04.1 K 3-93 02 26 29.83 +65 47 52.7 2000 72.002.012 rad 02 26 29.83 +65 47 52.7 +132+04.1 K 3-93 02 22 29.3 +65 34 23. 1950 Ko,Ku (1999) 02 26 30.22 +65 47 52.3 +144-15.1 A 4 02 42 09.6 +42 20 31. 1950 34.134.010 02 45 23.39 +42 33 07.9 +144-15.1 A 4 02 42 10.0 +42 20 28. 1950 70.002.006 02 45 23.79 +42 33 04.9 +141-07.1 A 5 02 48 44.9 +50 23 35. 1950 34.134.010 * 02 52 13.52 +50 35 52.3 +141-07.1 A 5 02 48 46.2 +50 23 37. 1950 70.002.006 02 52 14.83 +50 35 54.2 +141-07.1 A 5 02 48 45.2 +50 23 37. 1950 Ko,Ku (1999) 02 52 13.82 +50 35 54.3 +136+04.1 A 6 02 54 31.0 +64 18 10. 1950 34.134.010 02 58 41.88 +64 30 08.9 +136+04.1 A 6 02 54 31.0 +64 18 05. 1950 50.134.178 02 58 41.88 +64 30 03.9 +136+04.1 A 6 02 54 31.1 +64 18 08. 1950 70.002.006 02 58 41.98 +64 30 06.9 +255-59.1 Lo 1 02 55 09.8 -44 22 20. 1950 19.135.028 * 02 56 58.28 -44 10 19.0 +255-59.1 Lo 1 02 55 10.0 -44 22 20. 1950 Ko,Ku (1999) 02 56 58.48 -44 10 19.0 +255-59.1 Lo 1 02 55 09.89 -44 22 19.0 1950 GSC 7566-00884 02 56 58.37 -44 10 18.0 +136+05.1 HEFE 1 02 59 34. +64 41 45. 1950 32.135.030 * 03 03 48.84 +64 53 28.2 +136+05.1 HEFE 1 02 59 34.0 +64 41 45. 1950 70.002.006 03 03 48.84 +64 53 28.2 +136+05.1 HEFE 1 02 59 34.6 +64 41 42. 1950 Ko,Ku (1999) 03 03 49.44 +64 53 25.2 +138+02.1 IC 289 03 06 16.4 +61 07 39. 1950 CGPN/Ko 64d 03 10 19.21 +61 19 01.4 +138+02.1 IC 289 03 06 16.62 +61 07 38.9 1950 12.133.017 03 10 19.43 +61 19 01.2 +138+02.1 IC 289 03 06 16.4 +61 07 41. 1950 70.002.006 03 10 19.21 +61 19 03.4 +138+02.1 IC 289 03 10 19.26 +61 19 00.4 2000 70.002.006 rad 03 10 19.26 +61 19 00.4 +138+02.1 IC 289 03 06 16.0 +61 07 35. 1950 IRAS03062+6107 03 10 18.80 +61 18 57.4 +138+04.1 * HtDe 2 03 06 51.7 +62 36 43. 1950 43.134.029 * 03 11 00.49 +62 48 03.3 +138+04.1 * HtDe 2 03 06 53.3 +62 36 37. 1950 70.002.006 03 11 02.10 +62 47 57.2 +138+04.1 * HtDe 2 03 06 54.9 +62 36 29. 1950 Ko,Ku (1999) 03 11 03.70 +62 47 49.1 +147-09.1 * HtWe 3 03 13 07.4 +46 42 35. 1950 43.134.029 03 16 34.61 +46 53 36.1 +147-09.1 * HtWe 3 03 13 07.0 +46 42 35. 1950 Ko,Ku (1999) 03 16 34.21 +46 53 36.2 +149-09.1 * HtDe 3 03 23 48.9 +45 13 54. 1950 43.134.029 * 03 27 15.43 +45 24 19.3 +149-09.1 * HtDe 3 03 23 49.0 +45 13 55. 1950 70.002.006 03 27 15.53 +45 24 20.3 +220-53.1 NGC 1360 03 31 06.6 -26 02 12. 1950 09.133.025 * 03 33 14.36 -25 52 09.3 +220-53.1 NGC 1360 03 31 07.6 -26 02 15. 1950 34.134.010 03 33 15.35 -25 52 12.4 +220-53.1 NGC 1360 03 31 05.9 -26 02 22. 1950 50.134.178 03 33 13.65 -25 52 19.3 +220-53.1 NGC 1360 03 31 07.6 -26 02 15. 1950 70.002.006 03 33 15.35 -25 52 12.4 +220-53.1 NGC 1360 03 33 14.62 -25 52 21.0 2000 AC 2888140 03 33 14.62 -25 52 21.0 +220-53.1 NGC 1360 03 33 14.65 -25 52 18.2 2000 HIP 016566 03 33 14.65 -25 52 18.2 +220-53.1 NGC 1360 03 33 14.67 -25 52 18.1 2000 PPM 246372 03 33 14.67 -25 52 18.1 +142+03.1 K 3-94 03 32 01.4 +59 53 51. 1950 50.134.178 03 36 08.11 +60 03 46.7 +142+03.1 K 3-94 03 32 01.24 +59 53 51.4 1950 52.002.003 03 36 07.95 +60 03 47.1 +142+03.1 K 3-94 03 32 01.5 +59 53 51. 1950 70.002.006 03 36 08.21 +60 03 46.7 +142+03.1 K 3-94 03 36 07.77 +60 03 44.0 2000 70.002.006 rad 03 36 07.77 +60 03 44.0 +142+03.1 K 3-94 03 31 59.4 +59 53 52. 1950 IRAS03319+5953 03 36 06.10 +60 03 47.8 +147-02.1 M 1-4 03 37 59. +52 07 26. 1950 CGPN/Mi 59 03 41 43.27 +52 17 01.2 +147-02.1 M 1-4 03 37 59.1 +52 07 26. 1950 CGPN/Ko 64d 03 41 43.37 +52 17 01.2 +147-02.1 M 1-4 03 37 59.0 +52 07 26. 1950 33.134.004 03 41 43.27 +52 17 01.2 +147-02.1 M 1-4 03 37 59.13 +52 07 25.2 1950 37.134.035 03 41 43.40 +52 17 00.4 +147-02.1 M 1-4 03 37 59.13 +52 07 25.2 1950 52.002.003 03 41 43.40 +52 17 00.4 +147-02.1 M 1-4 03 37 59.2 +52 07 26. 1950 70.002.006 03 41 43.47 +52 17 01.2 +147-02.1 M 1-4 03 41 43.34 +52 17 00.6 2000 70.002.006 rad 03 41 43.34 +52 17 00.6 +147-02.1 M 1-4 03 37 58.2 +52 07 22. 1950 IRAS03379+5207 03 41 42.47 +52 16 57.3 +156-13.1 * HtWe 5 03 42 10.1 +37 39 27. 1950 43.134.029 03 45 26.68 +37 48 48.0 +156-13.1 * HtWe 5 03 42 10.0 +37 39 32. 1950 70.002.006 03 45 26.59 +37 48 53.0 +156-13.1 * HtWe 5 03 42 10.3 +37 39 31. 1950 Ko,Ku (1999) 03 45 26.89 +37 48 52.0 +159-15.1 IC 351 03 44 20.2 +34 53 35. 1950 CGPN/Ko 64d 03 47 32.90 +35 02 48.3 +159-15.1 IC 351 03 44 20.27 +34 53 35.4 1950 12.133.017 03 47 32.97 +35 02 48.7 +159-15.1 IC 351 03 44 20.28 +34 53 35.8 1950 37.134.035 03 47 32.98 +35 02 49.1 +159-15.1 IC 351 03 44 20.23 +34 53 35.8 1950 52.002.003 03 47 32.93 +35 02 49.1 +159-15.1 IC 351 03 44 20.3 +34 53 35. 1950 70.002.006 03 47 33.00 +35 02 48.3 +159-15.1 IC 351 03 47 33.04 +35 02 47.9 2000 70.002.006 rad 03 47 33.04 +35 02 47.9 +159-15.1 IC 351 03 44 20.2 +34 53 34. 1950 IRAS03443+3453 03 47 32.90 +35 02 47.3 +149-03.1 * IsWe 1 03 45 25.69 +49 51 06.7 1950 43.134.034 * 03 49 05.90 +50 00 15.1 +149-03.1 * IsWe 1 03 45 25.7 +49 51 06. 1950 70.002.006 03 49 05.91 +50 00 14.4 +149-03.1 * IsWe 1 03 45 25.6 +49 51 06. 1950 Ko,Ku (1999) 03 49 05.81 +50 00 14.4 +171-25.1 Ba 1 03 50 42.6 +19 20 52. 1950 02.133.027 * 03 53 36.33 +19 29 42.5 +171-25.1 Ba 1 03 50 44.7 +19 20 36. 1950 09.133.025 03 53 38.43 +19 29 26.3 +171-25.1 Ba 1 03 50 42.3 +19 20 37. 1950 34.134.010 03 53 36.02 +19 29 27.5 +171-25.1 Ba 1 03 50 42.6 +19 20 48. 1950 50.134.178 03 53 36.33 +19 29 38.5 +171-25.1 Ba 1 03 50 42.7 +19 20 49. 1950 70.002.006 03 53 36.43 +19 29 39.5 +171-25.1 Ba 1 03 53 36.56 +19 29 31.0 2000 70.002.006 rad 03 53 36.56 +19 29 31.0 +161-14.1 IC 2003 03 47 07.1 +33 26 50. 1855 CGPN/Es 07 * 03 56 22.09 +33 52 33.2 +161-14.1 IC 2003 03 53 10.0 +33 43 48. 1950 11.133.008 03 56 21.96 +33 52 28.7 +161-14.1 IC 2003 03 53 10.0 +33 45 49.3 1950 12.133.017 03 56 22.01 +33 54 30.0 +161-14.1 IC 2003 03 53 10.5 +33 43 51. 1950 30.002.012 03 56 22.46 +33 52 31.7 +161-14.1 IC 2003 03 53 10.05 +33 43 49.1 1950 37.134.035 03 56 22.01 +33 52 29.8 +161-14.1 IC 2003 03 53 10.05 +33 43 50.0 1950 52.002.003 03 56 22.01 +33 52 30.7 +161-14.1 IC 2003 03 53 10.0 +33 43 49. 1950 70.002.006 03 56 21.96 +33 52 29.7 +161-14.1 IC 2003 03 56 22.05 +33 52 29.7 2000 70.002.006 rad 03 56 22.05 +33 52 29.7 +161-14.1 IC 2003 03 53 10.1 +33 43 50. 1950 IRAS03531+3343 03 56 22.06 +33 52 30.7 +144+06.1 NGC 1501 03 56 41.10 +60 35 27.8 1880 CGPN/Wn 09 04 06 59.12 +60 55 13.8 +144+06.1 NGC 1501 03 58 23.51 +60 38 53.4 1900 CGPN/Bs 11 04 06 59.23 +60 55 15.2 +144+06.1 NGC 1501 03 58 23.79 +60 38 51.4 1900 CGPN/Lo 11 04 06 59.50 +60 55 13.1 +144+06.1 NGC 1501 04 02 40.65 +60 47 11.7 1950 12.133.017 04 06 59.38 +60 55 14.2 +144+06.1 NGC 1501 04 02 40.7 +60 47 13. 1950 70.002.006 04 06 59.43 +60 55 15.5 +144+06.1 NGC 1501 04 06 59.33 +60 55 14.7 2000 70.002.006 rad 04 06 59.33 +60 55 14.7 +144+06.1 NGC 1501 04 02 41.0 +60 47 09. 1950 IRAS04026+6047 04 06 59.73 +60 55 11.5 +165-15.1 NGC 1514 04 03 00.08 +30 30 38.8 1900 CGPN/Lo 11 04 09 17.06 +30 46 34.2 +165-15.1 NGC 1514 04 03 00.18 +30 30 38.7 1900 CGPN/Rb 14 04 09 17.16 +30 46 34.1 +165-15.1 NGC 1514 04 06 08.26 +30 38 42.2 1950 CGPN/AGK2 04 09 17.02 +30 46 33.8 +165-15.1 NGC 1514 04 06 08.27 +30 38 41.9 1950 12.133.017 04 09 17.03 +30 46 33.5 +165-15.1 NGC 1514 04 06 08.2 +30 38 47. 1950 50.134.178 04 09 16.96 +30 46 38.6 +165-15.1 NGC 1514 04 06 08.1 +30 38 42. 1950 70.002.006 04 09 16.86 +30 46 33.6 +165-15.1 NGC 1514 04 09 16.90 +30 46 32.0 2000 70.002.006 rad 04 09 16.90 +30 46 32.0 +165-15.1 NGC 1514 04 06 08.3 +30 38 41. 1950 Ko,Ku (1999) 04 09 17.06 +30 46 32.6 +165-15.1 NGC 1514 04 06 08.25 +30 38 41.6 1950 AGK3+30 402 04 09 17.01 +30 46 33.2 +165-15.1 NGC 1514 04 06 08.31 +30 38 41.6 1950 GSC 2358-00056 04 09 17.07 +30 46 33.2 +165-15.1 NGC 1514 04 09 16.99 +30 46 33.4 2000 HIP 019395 04 09 16.99 +30 46 33.4 +165-15.1 NGC 1514 04 09 16.99 +30 46 33.3 2000 PPM 069152 04 09 16.99 +30 46 33.3 +165-15.1 NGC 1514 04 06 08.26 +30 38 42.5 1950 SAO 57020 04 09 17.02 +30 46 34.1 +165-15.1 NGC 1514 04 06 09.6 +30 38 49. 1950 IRAS04061+3038 04 09 18.36 +30 46 40.5 +147+04.1 M 2-2 04 09 10. +56 49 20. 1950 CGPN/Mi 59 04 13 14.84 +56 56 57.9 +147+04.1 M 2-2 04 09 10.2 +56 49 20. 1950 CGPN/Ko 64d 04 13 15.04 +56 56 57.9 +147+04.1 M 2-2 04 09 09.98 +56 49 20.7 1950 12.133.017 04 13 14.82 +56 56 58.6 +147+04.1 M 2-2 04 09 10.2 +56 49 16. 1950 33.134.004 04 13 15.04 +56 56 53.9 +147+04.1 M 2-2 04 09 10.2 +56 49 19. 1950 50.134.178 04 13 15.04 +56 56 56.9 +147+04.1 M 2-2 04 09 10.2 +56 49 20. 1950 70.002.006 04 13 15.04 +56 56 57.9 +147+04.1 M 2-2 04 13 14.98 +56 56 57.8 2000 70.002.006 rad 04 13 14.98 +56 56 57.8 +147+04.1 M 2-2 04 09 10.4 +56 49 19. 1950 IRAS04091+5649 04 13 15.24 +56 56 56.9 +151+00.1 K 3-64 04 09 37.9 +51 43 25. 1950 02.133.029 * 04 13 27.17 +51 51 01.6 +151+00.1 K 3-64 04 09 38.0 +51 43 26. 1950 70.002.006 04 13 27.27 +51 51 02.6 +151+00.1 K 3-64 04 13 26.99 +51 50 49.6 2000 70.002.006 rad 04 13 26.99 +51 50 49.6 +206-40.1 NGC 1535 04 08 39.68 -13 02 38.5 1880 CGPN/Wn 09 04 14 15.83 -12 44 21.2 +206-40.1 NGC 1535 04 09 35.69 -12 59 31.8 1900 CGPN/Po 10 04 14 15.88 -12 44 21.1 +206-40.1 NGC 1535 04 09 35.65 -12 59 31.8 1900 CGPN/Si 27 04 14 15.84 -12 44 21.1 +206-40.1 NGC 1535 04 11 57.0 -12 51 42. 1950 09.133.025 04 14 17.18 -12 44 11.3 +206-40.1 NGC 1535 04 11 55.6 -12 52 00.0 1950 11.133.011 04 14 15.78 -12 44 29.2 +206-40.1 NGC 1535 04 11 55.6 -12 51 52. 1950 70.002.006 04 14 15.78 -12 44 21.2 +206-40.1 NGC 1535 04 14 15.77 -12 44 22.3 2000 70.002.006 rad 04 14 15.77 -12 44 22.3 +206-40.1 NGC 1535 04 11 55.57 -12 51 53.0 1950 GSC 5318-00563 04 14 15.75 -12 44 22.2 +206-40.1 NGC 1535 04 11 55.4 -12 51 54. 1950 IRAS04119-1251 04 14 15.58 -12 44 23.2 +153-01.1 K 3-65 04 12 12.6 +48 42 14. 1950 02.133.029 04 15 54.57 +48 49 40.8 +153-01.1 K 3-65 04 12 12.60 +48 42 14.0 1950 52.002.003 04 15 54.57 +48 49 40.8 +153-01.1 K 3-65 04 12 12.6 +48 42 13. 1950 70.002.006 04 15 54.56 +48 49 39.8 +153-01.1 K 3-65 04 12 12.7 +48 42 13. 1950 Ko,Ku (1999) 04 15 54.66 +48 49 39.8 +153-01.1 K 3-65 04 12 12.3 +48 42 18. 1950 IRAS04122+4842 04 15 54.27 +48 49 44.9 +149+04.1 * K 4-47 04 16 40.9 +56 11 02. 1950 02.133.029 04 20 45.00 +56 18 10.5 +149+04.1 * K 4-47 04 16 41.18 +56 11 04.3 1950 52.002.003 04 20 45.28 +56 18 12.8 +149+04.1 * K 4-47 04 16 41.1 +56 11 03. 1950 70.002.006 04 20 45.20 +56 18 11.5 +149+04.1 * K 4-47 04 16 41.4 +56 11 04. 1950 Ko,Ku (1999) 04 20 45.50 +56 18 12.5 +149+04.1 * K 4-47 04 16 40.5 +56 11 02. 1950 IRAS04166+5611 04 20 44.60 +56 18 10.5 +137+16.1 * EL 0419+72 04 19 25.5 +72 41 57. 1950 Ko,Ku (1999) * 04 25 15.22 +72 48 51.1 +146+07.1 M 4-18 04 21 31. +60 00 25. 1950 CGPN/Mi 59 04 25 50.65 +60 07 13.8 +146+07.1 M 4-18 04 21 30.8 +60 00 18. 1950 33.134.004 04 25 50.45 +60 07 06.8 +146+07.1 M 4-18 04 21 31.2 +60 00 23. 1950 50.134.178 04 25 50.85 +60 07 11.8 +146+07.1 M 4-18 04 21 31.16 +60 00 24.1 1950 52.002.003 04 25 50.81 +60 07 12.9 +146+07.1 M 4-18 04 21 31.2 +60 00 25. 1950 70.002.006 04 25 50.86 +60 07 13.8 +146+07.1 M 4-18 04 25 50.75 +60 07 12.7 2000 70.002.006 rad 04 25 50.75 +60 07 12.7 +146+07.1 M 4-18 04 25 50.88 +60 07 12.6 2000 70.134.064 04 25 50.88 +60 07 12.6 +146+07.1 M 4-18 04 21 30.6 +60 00 22. 1950 IRAS04215+6000 04 25 50.25 +60 07 10.8 +167-09.1 K 3-66 04 33 22.12 +33 33 26.6 1950 02.133.029 04 36 37.24 +33 39 29.8 +167-09.1 K 3-66 04 33 22.12 +33 33 27.0 1950 52.002.003 04 36 37.24 +33 39 30.2 +167-09.1 K 3-66 04 33 22.2 +33 33 27. 1950 70.002.006 04 36 37.32 +33 39 30.2 +167-09.1 K 3-66 04 36 37.28 +33 39 30.9 2000 70.002.006 rad 04 36 37.28 +33 39 30.9 +167-09.1 K 3-66 04 36 37.03 +33 39 30.2 2000 70.134.064 04 36 37.03 +33 39 30.2 +167-09.1 K 3-66 04 33 21.8 +33 33 24. 1950 IRAS04333+3333 04 36 36.92 +33 39 27.2 +160-02.1 WSLS 1 04 37 21.2 +42 47 15. 2000 61.134.008 04 37 21.2 +42 47 15. +160-02.1 WSLS 1 04 37 20.3 +42 47 15. 2000 66.134.013 04 37 20.3 +42 47 15. +160-02.1 WSLS 1 04 33 50.2 +42 41 09. 1950 Ko,Ku (1999) 04 37 21.53 +42 47 09.7 +174-14.1 H 3-29 04 34 20.2 +24 57 00. 1950 09.133.025 * 04 37 23.02 +25 02 59.7 +174-14.1 H 3-29 04 34 20.60 +24 56 41.3 1950 26.121.015 04 37 23.41 +25 02 41.0 +174-14.1 H 3-29 04 34 21.5 +24 56 50. 1950 33.134.004 04 37 24.32 +25 02 49.6 +174-14.1 H 3-29 04 34 20.7 +24 56 38. 1950 50.134.178 04 37 23.51 +25 02 37.7 +174-14.1 H 3-29 04 34 20.7 +24 56 42. 1950 70.002.006 04 37 23.51 +25 02 41.7 +174-14.1 H 3-29 04 37 23.41 +25 02 41.8 2000 70.002.006 rad 04 37 23.41 +25 02 41.8 +174-14.1 H 3-29 04 34 20.8 +24 56 39. 1950 Ko,Ku (1999) 04 37 23.61 +25 02 38.7 +174-14.1 H 3-29 04 34 20.5 +24 56 38. 1950 IRAS04343+2456 04 37 23.31 +25 02 37.7 +165-06.1 K 3-67 04 36 27.52 +36 39 52.5 1950 02.133.029 * 04 39 47.94 +36 45 42.9 +165-06.1 K 3-67 04 36 26.9 +36 39 31.7 1950 11.133.011 04 39 47.31 +36 45 22.1 +165-06.1 K 3-67 04 36 27.52 +36 39 52.3 1950 52.002.003 04 39 47.94 +36 45 42.7 +165-06.1 K 3-67 04 36 27.5 +36 39 52. 1950 70.002.006 04 39 47.92 +36 45 42.4 +165-06.1 K 3-67 04 39 47.97 +36 45 42.4 2000 70.002.006 rad 04 39 47.97 +36 45 42.4 +165-06.1 K 3-67 04 36 27.7 +36 39 51. 1950 Ko,Ku (1999) 04 39 48.12 +36 45 41.4 +165-06.1 K 3-67 04 36 27.1 +36 39 49. 1950 IRAS04364+3639 04 39 47.52 +36 45 39.4 +166-06.1 * CRL 618 04 39 33.8 +36 01 15. 1950 14.141.630 04 42 53.36 +36 06 52.7 +166-06.1 * CRL 618 04 39 34.04 +36 01 16.05 1950 30.133.002 04 42 53.60 +36 06 53.7 +166-06.1 * CRL 618 04 39 34.0 +36 01 15. 1950 50.134.178 04 42 53.56 +36 06 52.7 +166-06.1 * CRL 618 04 39 34.0 +36 01 17. 1950 70.002.006 04 42 53.56 +36 06 54.7 +166-06.1 * CRL 618 04 42 53.93 +36 06 51.7 2000 70.002.006 rad 04 42 53.93 +36 06 51.7 +166-06.1 * CRL 618 04 39 34.2 +36 01 14. 1950 Ko,Ku (1999) 04 42 53.76 +36 06 51.6 +166-06.1 * CRL 618 04 39 34.1 +36 01 15. 1950 IRAS04395+3601 04 42 53.66 +36 06 52.6 +158+00.1 * Sh 2-216 04 43 21.01 +46 42 07.2 2000 AC 1439507 * 04 43 21.01 +46 42 07.2 +158+00.1 * Sh 2-216 04 39 40.6 +46 36 29. 1950 LSV+46 21 04 43 21.01 +46 42 05.5 +158+00.1 * Sh 2-216 04 39 41.0 +46 36 28. 1950 Ko,Ku (1999) 04 43 21.41 +46 42 04.4 +160-00.1 We 1-2 04 43 07.0 +44 22 38. 1950 20.135.021 * 04 46 42.73 +44 28 00.4 +160-00.1 We 1-2 04 43 07.2 +44 22 36. 1950 50.134.178 04 46 42.93 +44 27 58.4 +160-00.1 We 1-2 04 43 07.2 +44 22 38. 1950 70.002.006 04 46 42.93 +44 28 00.4 +160-00.1 We 1-2 04 43 07.5 +44 22 38. 1950 Ko,Ku (1999) 04 46 43.23 +44 28 00.4 +163-00.1 We 1-3 04 50 59.7 +42 11 47. 1950 20.135.021 * 04 54 31.50 +42 16 36.8 +163-00.1 We 1-3 04 50 59.4 +42 11 50. 1950 70.002.006 04 54 31.21 +42 16 39.8 +163-00.1 We 1-3 04 50 59.4 +42 11 50. 1950 Ko,Ku (1999) 04 54 31.21 +42 16 39.8 +215-30.1 A 7 05 00 52.4 -15 40 24. 1950 18.133.025 05 03 08.03 -15 36 13.0 +215-30.1 A 7 05 00 51.9 -15 40 34. 1950 70.002.006 05 03 07.53 -15 36 23.0 +215-30.1 A 7 05 00 51.93 -15 40 34.1 1950 GSC 5900-01018 05 03 07.56 -15 36 23.1 +205-26.1 * MaC 2-1 05 01 15.1 -06 13 43. 1950 31.114.214 05 03 41.81 -06 09 34.0 +205-26.1 * MaC 2-1 05 01 15.1 -06 13 35. 1950 Ko,Ku (1999) 05 03 41.82 -06 09 26.0 +243-37.1 PaRu 2-1 05 01 21.91 -39 49 54.2 1950 52.134.020 05 03 01.74 -39 45 44.0 +243-37.1 PaRu 2-1 05 01 22.0 -39 49 55. 1950 70.002.006 05 03 01.83 -39 45 44.8 +243-37.1 PaRu 2-1 05 01 21.6 -39 49 56. 1950 IRAS05013-3949 05 03 01.43 -39 45 45.8 +190-17.1 J 320 05 02 48.6 +10 38 25. 1950 09.133.025 05 05 34.56 +10 42 26.6 +190-17.1 J 320 05 02 48.0 +10 38 28. 1950 11.133.008 05 05 33.96 +10 42 29.7 +190-17.1 J 320 05 02 48.4 +10 38 18.0 1950 11.133.011 05 05 34.36 +10 42 19.7 +190-17.1 J 320 05 02 48.37 +10 38 20.9 1950 37.134.035 05 05 34.33 +10 42 22.6 +190-17.1 J 320 05 02 48.42 +10 38 20.0 1950 52.002.003 05 05 34.38 +10 42 21.7 +190-17.1 J 320 05 02 48.3 +10 38 21. 1950 70.002.006 05 05 34.26 +10 42 22.7 +190-17.1 J 320 05 05 34.26 +10 42 23.8 2000 70.002.006 rad 05 05 34.26 +10 42 23.8 +190-17.1 J 320 05 05 34.30 +10 42 22.8 2000 AC 0469504 05 05 34.30 +10 42 22.8 +190-17.1 J 320 05 02 48.2 +10 38 22. 1950 IRAS05028+1038 05 05 34.16 +10 42 23.7 +167-00.1 A 8 05 03 11.4 +39 04 09. 1950 34.134.010 05 06 37.88 +39 08 07.5 +167-00.1 A 8 05 03 11.9 +39 04 11. 1950 70.002.006 05 06 38.38 +39 08 09.5 +167-00.1 A 8 05 06 39.00 +39 08 15.0 2000 70.002.006 rad 05 06 39.00 +39 08 15.0 +167-00.1 A 8 05 03 12.0 +39 04 10. 1950 Ko,Ku (1999) 05 06 38.48 +39 08 08.5 +173-05.1 * K 2-1 05 03 56.2 +30 46 07. 1950 34.134.010 * 05 07 08.65 +30 50 02.9 +173-05.1 * K 2-1 05 03 55.7 +30 45 30. 1950 70.002.006 05 07 08.13 +30 49 25.9 +173-05.1 * K 2-1 05 07 08.70 +30 49 36.0 2000 70.002.006 rad 05 07 08.70 +30 49 36.0 +173-05.1 * K 2-1 05 03 55.9 +30 45 22. 1950 Ko,Ku (1999) 05 07 08.33 +30 49 17.9 +173-05.1 * K 2-1 05 03 56.5 +30 45 36. 1950 IRAS05039+3045 05 07 08.94 +30 49 31.9 +215-24.1 IC 418 05 25 09.6 -12 44 16. 1950 02.133.027 05 27 28.42 -12 41 49.2 +215-24.1 IC 418 05 25 09.5 -12 44 15. 1950 09.133.025 05 27 28.32 -12 41 48.2 +215-24.1 IC 418 05 25 09.31 -12 44 15.0 1950 11.133.008 05 27 28.13 -12 41 48.2 +215-24.1 IC 418 05 25 09.5 -12 44 15. 1950 65.134.076 05 27 28.32 -12 41 48.2 +215-24.1 IC 418 05 25 09.4 -12 44 17. 1950 70.002.006 05 27 28.22 -12 41 50.2 +215-24.1 IC 418 05 27 28.23 -12 41 50.2 2000 70.002.006 rad 05 27 28.23 -12 41 50.2 +215-24.1 IC 418 05 25 09.41 -12 44 17.2 1950 GSC 5340-00684 05 27 28.23 -12 41 50.4 +215-24.1 IC 418 05 27 28.19 -12 41 50.4 2000 PPM 215798 05 27 28.19 -12 41 50.4 +215-24.1 IC 418 05 27 28.20 -12 41 50.3 2000 TYC 534006841 05 27 28.20 -12 41 50.3 +215-24.1 IC 418 05 25 09.5 -12 44 18. 1950 IRAS05251-1244 05 27 28.32 -12 41 51.2 +172+00.1 * A 9 05 25 35.0 +36 00 39. 1950 Ko,Ku (1999) 05 28 56.84 +36 03 01.6 +203-18.1 * MaC 2-2 05 26 25.1 -00 43 08. 1950 31.114.214 * 05 28 58.03 -00 40 47.2 +203-18.1 * MaC 2-2 05 26 25.9 -00 43 13. 1950 Ko,Ku (1999) 05 28 58.83 -00 40 52.2 +178-02.1 K 3-68 05 28 25.4 +28 56 31. 1950 02.133.029 05 31 35.80 +28 58 41.7 +178-02.1 K 3-68 05 28 25.4 +28 56 30. 1950 50.134.178 05 31 35.80 +28 58 40.7 +178-02.1 K 3-68 05 28 25.4 +28 56 31. 1950 70.002.006 05 31 35.80 +28 58 41.7 +178-02.1 K 3-68 05 31 35.74 +28 58 42.7 2000 70.002.006 rad 05 31 35.74 +28 58 42.7 +178-02.1 K 3-68 05 28 25.6 +28 56 29. 1950 Ko,Ku (1999) 05 31 36.00 +28 58 39.7 +178-02.1 K 3-68 05 28 25.2 +28 56 31. 1950 IRAS05284+2856 05 31 35.60 +28 58 41.8 +197-14.1 K 1-7 05 29 03.8 +06 54 00. 1950 09.133.025 05 31 45.58 +06 56 09.1 +197-14.1 K 1-7 05 29 03.8 +06 53 54. 1950 34.134.010 05 31 45.58 +06 56 03.1 +197-14.1 K 1-7 05 29 03.9 +06 53 55. 1950 50.134.178 05 31 45.68 +06 56 04.0 +197-14.1 K 1-7 05 29 03.8 +06 53 54. 1950 70.002.006 05 31 45.58 +06 56 03.1 +197-14.1 K 1-7 05 31 45.82 +06 55 55.5 2000 70.002.006 rad 05 31 45.82 +06 55 55.5 +156+12.1 * HtDe 4 05 33 45.9 +55 30 24. 1950 43.134.029 * 05 37 56.38 +55 32 09.3 +156+12.1 * HtDe 4 05 33 46.0 +55 30 30. 1950 Ko,Ku (1999) 05 37 56.49 +55 32 15.3 +170+04.1 K 3-69 05 37 54.1 +39 13 39. 1950 02.133.029 05 41 22.19 +39 15 07.9 +170+04.1 K 3-69 05 37 54.05 +39 13 39.2 1950 52.002.003 05 41 22.14 +39 15 08.1 +170+04.1 K 3-69 05 37 54.1 +39 13 39. 1950 70.002.006 05 41 22.19 +39 15 07.9 +170+04.1 K 3-69 05 41 22.35 +39 15 00.3 2000 70.002.006 rad 05 41 22.35 +39 15 00.3 +170+04.1 K 3-69 05 37 53.2 +39 13 37. 1950 IRAS05378+3913 05 41 21.29 +39 15 06.0 +193-09.1 H 3-75 05 37 56.1 +12 19 47. 1950 09.133.025 05 40 44.40 +12 21 17.2 +193-09.1 H 3-75 05 37 56.7 +12 19 53. 1950 70.002.006 05 40 45.00 +12 21 23.2 +193-09.1 H 3-75 05 40 45.00 +12 21 22.5 2000 70.002.006 rad 05 40 45.00 +12 21 22.5 +193-09.1 H 3-75 05 37 56.8 +12 19 51. 1950 Ko,Ku (1999) 05 40 45.10 +12 21 21.2 +173+03.1 * Pu 2 05 39 11.7 +36 07 45. 1950 70.002.006 * 05 42 34.06 +36 09 08.5 +173+03.1 * Pu 2 05 42 34.09 +36 08 59.9 2000 70.002.006 rad 05 42 34.09 +36 08 59.9 +173+03.1 * Pu 2 05 39 12.0 +36 07 44. 1950 Ko,Ku (1999) 05 42 34.36 +36 09 07.5 +196-10.1 NGC 2022 05 36 37.97 +09 02 09.0 1900 CGPN/Kb 09 05 42 06.57 +09 05 09.2 +196-10.1 NGC 2022 05 36 37.82 +09 02 11.5 1900 CGPN/Lo 11 05 42 06.42 +09 05 11.7 +196-10.1 NGC 2022 05 36 37.95 +09 02 12.1 1900 CGPN/Si 27 05 42 06.55 +09 05 12.3 +196-10.1 NGC 2022 05 39 22.0 +09 03 54. 1950 09.133.025 05 42 06.37 +09 05 18.2 +196-10.1 NGC 2022 05 39 21.6 +09 03 42.0 1950 11.133.011 05 42 05.97 +09 05 06.2 +196-10.1 NGC 2022 05 39 21.8 +09 03 49. 1950 70.002.006 05 42 06.17 +09 05 13.2 +196-10.1 NGC 2022 05 42 06.21 +09 05 11.5 2000 70.002.006 rad 05 42 06.21 +09 05 11.5 +196-10.1 NGC 2022 05 39 22.1 +09 03 48. 1950 IRAS05393+0903 05 42 06.47 +09 05 12.1 +184-02.1 M 1-5 05 43 46.1 +24 20 59. 1950 CGPN/Ko 64d 05 46 50.03 +24 22 03.2 +184-02.1 M 1-5 05 43 46.0 +24 20 59. 1950 09.133.025 05 46 49.93 +24 22 03.2 +184-02.1 M 1-5 05 43 46.1 +24 21 00. 1950 11.133.008 05 46 50.03 +24 22 04.2 +184-02.1 M 1-5 05 43 46.0 +24 20 59.9 1950 11.133.011 05 46 49.93 +24 22 04.1 +184-02.1 M 1-5 05 43 46.10 +24 20 58.6 1950 37.134.035 05 46 50.02 +24 22 02.8 +184-02.1 M 1-5 05 43 46.09 +24 20 58.5 1950 52.002.003 05 46 50.01 +24 22 02.7 +184-02.1 M 1-5 05 43 46.1 +24 20 59. 1950 70.002.006 05 46 50.03 +24 22 03.2 +184-02.1 M 1-5 05 46 50.01 +24 22 02.3 2000 70.002.006 rad 05 46 50.01 +24 22 02.3 +184-02.1 M 1-5 05 43 45.9 +24 20 57. 1950 St,Sa (1977) 05 46 49.82 +24 22 01.2 +184-02.1 M 1-5 05 43 46.3 +24 20 58. 1950 IRAS05437+2420 05 46 50.22 +24 22 02.2 +204-13.1 * MaC 2-4 05 45 01.0 +00 37 40. 1950 31.114.214 05 47 35.48 +00 38 39.9 +204-13.1 * MaC 2-4 05 45 01.4 +00 37 39. 1950 Ko,Ku (1999) 05 47 35.88 +00 38 38.9 +181+00.1 Pu 1 05 49 38.8 +28 05 19. 1950 70.002.006 * 05 52 48.18 +28 05 57.4 +181+00.1 Pu 1 05 52 48.50 +28 06 00.0 2000 70.002.006 rad 05 52 48.50 +28 06 00.0 +181+00.1 Pu 1 05 49 39.1 +28 05 19. 1950 Ko,Ku (1999) 05 52 48.48 +28 05 57.3 +166+10.1 IC 2149 05 52 40.9 +46 05 53. 1950 02.133.027 * 05 56 24.04 +46 06 16.8 +166+10.1 IC 2149 05 52 46.9 +46 05 53.0 1950 11.133.011 05 56 30.05 +46 06 16.4 +166+10.1 IC 2149 05 52 40.8 +46 05 53. 1950 41.134.007 05 56 23.94 +46 06 16.8 +166+10.1 IC 2149 05 52 40.7 +46 05 54. 1950 70.002.006 05 56 23.85 +46 06 17.8 +166+10.1 IC 2149 05 56 23.86 +46 06 17.4 2000 70.002.006 rad 05 56 23.86 +46 06 17.4 +166+10.1 IC 2149 05 52 40.75 +46 05 53.4 1950 GSC 3361-01662 05 56 23.90 +46 06 17.2 +166+10.1 IC 2149 05 56 23.91 +46 06 17.3 2000 TYC 336116621 05 56 23.91 +46 06 17.3 +166+10.1 IC 2149 05 52 40.3 +46 05 52. 1950 IRAS05526+4605 05 56 23.44 +46 06 15.9 +228-22.1 DeHt 1 05 53 00.9 -22 54 27. 1950 27.135.032 05 55 06.42 -22 54 01.0 +228-22.1 DeHt 1 05 53 01.3 -22 54 28. 1950 70.002.006 05 55 06.81 -22 54 02.0 +228-22.1 DeHt 1 05 53 01.19 -22 54 28.1 1950 GSC 6491-00367 05 55 06.70 -22 54 02.1 +193-04.1 KLSS 1-5 05 54 16.8 +15 25 10. 1950 63.134.060 * 05 57 08.97 +15 25 28.7 +193-04.1 KLSS 1-5 05 57 09.0 +15 25 29. 2000 66.134.013 05 57 09.0 +15 25 29. +193-04.1 KLSS 1-5 05 54 15.9 +15 25 11. 1950 Ko,Ku (1999) 05 57 08.07 +15 25 29.8 +184+00.1 K 3-70 05 55 40.01 +25 18 31.1 1950 02.133.029 05 58 45.34 +25 18 43.3 +184+00.1 K 3-70 05 55 40.01 +25 18 31.8 1950 52.002.003 05 58 45.34 +25 18 44.0 +184+00.1 K 3-70 05 55 40.0 +25 18 31. 1950 70.002.006 05 58 45.33 +25 18 43.2 +184+00.1 K 3-70 05 58 45.58 +25 18 42.6 2000 70.002.006 rad 05 58 45.58 +25 18 42.6 +184+00.1 K 3-70 05 55 40.2 +25 18 31. 1950 Ko,Ku (1999) 05 58 45.53 +25 18 43.2 +184+00.1 K 3-70 05 55 39.0 +25 18 35. 1950 IRAS05556+2518 05 58 44.33 +25 18 47.3 +197-06.1 WeDe 1 05 56 38.4 +10 41 32. 1950 33.134.006 05 59 24.75 +10 41 40.6 +197-06.1 WeDe 1 05 56 38.1 +10 41 31. 1950 70.002.006 05 59 24.45 +10 41 39.7 +197-06.1 WeDe 1 05 56 38.6 +10 41 31. 1950 Ko,Ku (1999) 05 59 24.95 +10 41 39.6 +286-29.1 K 1-27 05 58 49.6 -75 40 31. 1950 19.135.028 05 57 01.64 -75 40 21.9 +286-29.1 K 1-27 05 58 50.3 -75 40 33. 1950 Ko,Ku (1999) 05 57 02.33 -75 40 23.9 +286-29.1 K 1-27 05 58 46.3 -75 40 31. 1950 IRAS05587-7540 05 56 58.34 -75 40 21.6 +198-06.1 A 12 05 59 37.7 +09 39 07. 1950 09.133.025 * 06 02 22.80 +09 39 02.6 +198-06.1 A 12 05 59 34.7 +09 39 17. 1950 50.134.178 06 02 19.80 +09 39 12.8 +198-06.1 A 12 05 59 34.9 +09 39 19. 1950 70.002.006 06 02 20.00 +09 39 14.8 +198-06.1 A 12 06 02 20.01 +09 39 13.1 2000 70.002.006 rad 06 02 20.01 +09 39 13.1 +198-06.1 A 12 05 59 35.0 +09 39 16. 1950 Ko,Ku (1999) 06 02 20.10 +09 39 11.8 +198-06.1 A 12 05 59 35.6 +09 39 03. 1950 IRAS05595+0939 06 02 20.70 +09 38 58.8 +243-25.1 * K 2-12 06 00 24. -37 25 24. 1950 06.133.002 06 02 06.60 -37 25 29.4 +243-25.1 * K 2-12 06 00 24.3 -37 25 20. 1950 Ko,Ku (1999) 06 02 06.90 -37 25 25.4 +204-08.1 A 13 06 02 08.0 +03 57 00. 1950 09.133.025 * 06 04 46.35 +03 56 44.9 +204-08.1 A 13 06 02 08.4 +03 56 42. 1950 34.134.010 06 04 46.74 +03 56 26.9 +204-08.1 A 13 06 02 09.5 +03 56 51. 1950 70.002.006 06 04 47.85 +03 56 35.8 +204-08.1 A 13 06 02 09.7 +03 56 50. 1950 Ko,Ku (1999) 06 04 48.04 +03 56 34.8 +197-03.1 A 14 06 08 21.1 +11 47 30. 1950 18.133.025 06 11 08.77 +11 46 47.4 +197-03.1 A 14 06 08 21.0 +11 47 28. 1950 70.002.006 06 11 08.67 +11 46 45.4 +197-03.1 A 14 06 08 21.1 +11 47 25. 1950 Ko,Ku (1999) 06 11 08.76 +11 46 42.4 +184+04.1 K 3-71 06 10 47.4 +26 53 51. 1950 02.133.029 06 13 54.97 +26 52 57.0 +184+04.1 K 3-71 06 10 47.4 +26 53 51. 1950 70.002.006 06 13 54.97 +26 52 57.0 +184+04.1 K 3-71 06 13 55.78 +26 52 58.2 2000 70.002.006 rad 06 13 55.78 +26 52 58.2 +201-04.1 We 1-4 06 11 51.0 +07 35 30. 1950 20.135.021 06 14 33.62 +07 34 32.3 +201-04.1 We 1-4 06 11 51.0 +07 35 27. 1950 70.002.006 06 14 33.62 +07 34 29.3 +201-04.1 We 1-4 06 11 51.2 +07 35 27. 1950 Ko,Ku (1999) 06 14 33.82 +07 34 29.3 +183+05.1 WeSb 2 06 13 01.2 +28 23 09. 1950 30.135.002 * 06 16 10.95 +28 22 05.2 +183+05.1 WeSb 2 06 13 01.3 +28 23 21. 1950 70.002.006 06 16 11.06 +28 22 17.2 +183+05.1 WeSb 2 06 13 01.7 +28 23 12. 1950 Ko,Ku (1999) 06 16 11.46 +28 22 08.2 +208-07.1 * TuWe 2-1 06 16 15.3 -00 00 23. 2000 63.134.080 06 16 15.3 -00 00 23. +208-07.1 * TuWe 2-1 06 13 41.7 +00 00 39. 1950 Ko,Ku (1999) 06 16 15.44 -00 00 26.4 +158+17.1 PuWe 1 06 15 23.1 +55 38 01. 1950 28.135.002 06 19 34.20 +55 36 44.6 +158+17.1 PuWe 1 06 15 23.2 +55 37 59. 1950 34.134.010 06 19 34.30 +55 36 42.6 +158+17.1 PuWe 1 06 15 22.8 +55 38 01. 1950 70.002.006 06 19 33.90 +55 36 44.6 +158+17.1 PuWe 1 06 15 23.1 +55 37 59. 1950 Ko,Ku (1999) 06 19 34.20 +55 36 42.6 +221-12.1 IC 2165 06 19 24.2 -12 57 36. 1950 02.133.027 06 21 42.61 -12 59 05.7 +221-12.1 IC 2165 06 19 24.2 -12 57 40. 1950 09.133.025 06 21 42.61 -12 59 09.7 +221-12.1 IC 2165 06 19 24.4 -12 57 47. 1950 11.133.008 06 21 42.80 -12 59 16.8 +221-12.1 IC 2165 06 19 24.37 -12 57 44.7 1950 37.134.035 06 21 42.77 -12 59 14.5 +221-12.1 IC 2165 06 19 24.3 -12 57 44. 1950 70.002.006 06 21 42.70 -12 59 13.8 +221-12.1 IC 2165 06 21 42.82 -12 59 13.9 2000 70.002.006 rad 06 21 42.82 -12 59 13.9 +221-12.1 IC 2165 06 19 24.3 -12 57 44. 1950 IRAS06194-1257 06 21 42.70 -12 59 13.8 +204-03.1 K 3-72 06 21 14.7 +05 31 51. 1950 02.133.029 06 23 54.86 +05 30 12.4 +204-03.1 K 3-72 06 21 14.6 +05 31 51. 1950 50.134.178 06 23 54.76 +05 30 12.4 +204-03.1 K 3-72 06 21 14.6 +05 31 54. 1950 70.002.006 06 23 54.76 +05 30 15.4 +204-03.1 K 3-72 06 23 54.40 +05 30 08.0 2000 70.002.006 rad 06 23 54.40 +05 30 08.0 +218-10.1 HtDe 5 06 21 15.5 -10 11 45. 1950 43.134.029 * 06 23 37.26 -10 13 22.9 +218-10.1 HtDe 5 06 21 15.3 -10 11 46. 1950 70.002.006 06 23 37.06 -10 13 23.9 +218-10.1 HtDe 5 06 23 37.20 -10 12 51.2 2000 70.002.006 rad 06 23 37.20 -10 12 51.2 +218-10.1 HtDe 5 06 21 15.4 -10 11 46. 1950 Ko,Ku (1999) 06 23 37.16 -10 13 23.9 +240-19.1 * KLSS 1-9 06 22 45.9 -33 03 06. 1950 63.134.060 06 24 36.36 -33 04 49.4 +240-19.1 * KLSS 1-9 06 24 36.4 -33 04 49. 2000 We (1996) 06 24 36.4 -33 04 49. +240-19.1 * KLSS 1-9 06 22 46.2 -33 03 13. 1950 Ko,Ku (1999) 06 24 36.66 -33 04 56.4 +194+02.1 J 900 06 20 52.74 +17 50 25.8 1913 CGPN/Br 17 06 25 57.34 +17 47 27.9 +194+02.1 J 900 06 23 01.8 +17 49 15. 1950 09.133.025 06 25 56.87 +17 47 28.1 +194+02.1 J 900 06 23 02.1 +17 49 15.0 1950 11.133.011 06 25 57.17 +17 47 28.1 +194+02.1 J 900 06 23 02.21 +17 49 13.3 1950 12.133.017 06 25 57.28 +17 47 26.4 +194+02.1 J 900 06 23 02.18 +17 49 14.3 1950 37.134.035 06 25 57.25 +17 47 27.4 +194+02.1 J 900 06 23 02.2 +17 49 15. 1950 41.134.007 06 25 57.27 +17 47 28.1 +194+02.1 J 900 06 23 02.18 +17 49 14.3 1950 52.002.003 06 25 57.25 +17 47 27.4 +194+02.1 J 900 06 23 02.1 +17 49 15. 1950 70.002.006 06 25 57.17 +17 47 28.1 +194+02.1 J 900 06 25 57.30 +17 47 27.6 2000 70.002.006 rad 06 25 57.30 +17 47 27.6 +194+02.1 J 900 06 23 02.0 +17 49 14. 1950 IRAS06230+1749 06 25 57.07 +17 47 27.1 +233-16.1 A 15 06 25 00.0 -25 21 00. 1950 18.133.025 06 27 02.26 -25 22 53.5 +233-16.1 A 15 06 24 59.9 -25 21 01. 1950 34.134.010 06 27 02.16 -25 22 54.5 +233-16.1 A 15 06 24 59.7 -25 20 57. 1950 70.002.006 06 27 01.96 -25 22 50.5 +233-16.1 A 15 06 24 59.6 -25 20 54. 1950 IRAS06249-2520 06 27 01.86 -25 22 47.5 +170+15.1 NGC 2242 06 30 27.98 +44 48 58.4 1950 43.134.033 * 06 34 07.40 +44 46 37.6 +170+15.1 NGC 2242 06 30 28.06 +44 48 58.2 1950 45.134.060 06 34 07.47 +44 46 37.4 +170+15.1 NGC 2242 06 30 28.0 +44 48 59. 1950 70.002.006 06 34 07.42 +44 46 38.2 +170+15.1 NGC 2242 06 34 07.48 +44 46 33.7 2000 70.002.006 rad 06 34 07.48 +44 46 33.7 +211-03.1 M 1-6 06 33 11. -00 03 07. 1950 CGPN/Mi 59 * 06 35 44.65 -00 05 37.1 +211-03.1 M 1-6 06 33 11.5 -00 03 09. 1950 11.133.008 06 35 45.15 -00 05 39.2 +211-03.1 M 1-6 06 33 11.0 -00 03 11. 1950 18.133.025 06 35 44.65 -00 05 41.1 +211-03.1 M 1-6 06 33 11.5 +00 03 07. 1950 50.134.178 06 35 45.27 +00 00 36.8 +211-03.1 M 1-6 06 33 11.5 -00 03 08. 1950 70.002.006 06 35 45.15 -00 05 38.2 +211-03.1 M 1-6 06 35 45.13 -00 05 37.7 2000 70.002.006 rad 06 35 45.13 -00 05 37.7 +211-03.1 M 1-6 06 33 11.7 -00 03 06. 1950 IRAS06331-0003 06 35 45.35 -00 05 36.2 +189+07.1 M 1-7 06 34 17.8 +24 03 13. 1950 CGPN/Ko 64d 06 37 20.97 +24 00 37.0 +189+07.1 M 1-7 06 34 17.6 +24 03 09.9 1950 11.133.011 06 37 20.76 +24 00 33.9 +189+07.1 M 1-7 06 34 17.3 +24 03 12.9 1950 11.133.011 06 37 20.47 +24 00 36.9 +189+07.1 M 1-7 06 34 17.68 +24 03 12.3 1950 12.133.017 06 37 20.85 +24 00 36.3 +189+07.1 M 1-7 06 34 17.8 +24 03 12. 1950 18.133.025 06 37 20.96 +24 00 36.0 +189+07.1 M 1-7 06 34 17.8 +24 03 07. 1950 33.134.004 06 37 20.96 +24 00 31.0 +189+07.1 M 1-7 06 34 17.7 +24 03 11. 1950 50.134.178 06 37 20.86 +24 00 35.0 +189+07.1 M 1-7 06 34 17.7 +24 03 13. 1950 70.002.006 06 37 20.87 +24 00 37.0 +189+07.1 M 1-7 06 37 21.03 +24 00 34.3 2000 70.002.006 rad 06 37 21.03 +24 00 34.3 +189+07.1 M 1-7 06 34 17.6 +24 03 13. 1950 IRAS06342+2403 06 37 20.77 +24 00 37.0 +228-11.1 * KLSS 1-7 06 35 28.2 -18 54 51. 1950 63.134.060 * 06 37 39.30 -18 57 30.2 +228-11.1 * KLSS 1-7 06 37 39.3 -18 57 30. 2000 We (1996) 06 37 39.3 -18 57 30. +228-11.1 * KLSS 1-7 06 35 28.1 -18 54 44. 1950 Ko,Ku (1999) 06 37 39.21 -18 57 23.2 +201+02.1 K 4-48 06 37 09.17 +11 09 17.6 1950 02.133.029 06 39 55.87 +11 06 29.9 +201+02.1 K 4-48 06 37 09.17 +11 09 18.0 1950 52.002.003 06 39 55.87 +11 06 30.3 +201+02.1 K 4-48 06 37 09.1 +11 09 20. 1950 70.002.006 06 39 55.80 +11 06 32.3 +201+02.1 K 4-48 06 39 55.91 +11 06 30.8 2000 70.002.006 rad 06 39 55.91 +11 06 30.8 +201+02.1 K 4-48 06 37 09.3 +11 09 18. 1950 Ko,Ku (1999) 06 39 56.00 +11 06 30.3 +201+02.1 K 4-48 06 37 09.5 +11 09 21. 1950 IRAS06371+1109 06 39 56.20 +11 06 33.2 +192+07.1 * HtDe 6 06 37 10.2 +21 27 45. 1950 43.134.029 * 06 40 09.80 +21 24 56.7 +192+07.1 * HtDe 6 06 37 10.0 +21 27 50. 1950 70.002.006 06 40 09.60 +21 25 01.7 +192+07.1 * HtDe 6 06 37 09.8 +21 27 30. 1950 Ko,Ku (1999) 06 40 09.40 +21 24 41.8 +216-04.1 We 1-5 06 39 06.5 -04 59 44. 1950 20.135.021 06 41 34.46 -05 02 39.5 +216-04.1 We 1-5 06 39 06.5 -04 59 41. 1950 70.002.006 06 41 34.46 -05 02 36.5 +216-04.1 We 1-5 06 41 35.00 -05 02 39.0 2000 70.002.006 rad 06 41 35.00 -05 02 39.0 +216-04.1 We 1-5 06 39 06.7 -04 59 41. 1950 Ko,Ku (1999) 06 41 34.66 -05 02 36.5 +153+22.1 A 16 06 39 18.9 +61 50 26. 1950 34.134.010 06 43 55.26 +61 47 25.0 +153+22.1 A 16 06 39 18.5 +61 50 26. 1950 70.002.006 06 43 54.86 +61 47 25.0 +197+05.1 KLSS 1-6 06 40 32.0 +16 51 45. 1950 63.134.060 06 43 25.62 +16 48 42.5 +197+05.1 KLSS 1-6 06 43 25.6 +16 48 42. 2000 66.134.013 06 43 25.6 +16 48 42. +197+05.1 KLSS 1-6 06 40 32.6 +16 51 53. 1950 Ko,Ku (1999) 06 43 26.22 +16 48 50.4 +210-00.2 * K 2-14 06 42 02. +01 22 06. 1950 06.133.002 06 44 37.27 +01 18 57.7 +210-00.2 * K 2-14 06 42 01.7 +01 22 04. 1950 Ko,Ku (1999) 06 44 36.97 +01 18 55.7 +208+01.1 * K 4-50 06 44 25.12 +04 40 36.8 1950 02.133.029 06 47 04.18 +04 37 18.1 +208+01.1 * K 4-50 06 44 25.1 +04 40 36. 1950 Ko,Ku (1999) 06 47 04.16 +04 37 17.3 +221-04.1 A 17 06 46 12.0 -09 29 00. 1950 18.133.025 * 06 48 34.78 -09 32 25.7 +221-04.1 A 17 06 46 15.3 -09 29 14. 1950 Ko,Ku (1999) 06 48 38.08 -09 32 40.0 +233-10.1 SrWe 1 06 48 34.2 -22 22 34. 1950 43.134.030 06 50 41.03 -22 26 09.3 +233-10.1 SrWe 1 06 48 33.8 -22 22 38. 1950 70.002.006 06 50 40.63 -22 26 13.3 +233-10.1 SrWe 1 06 48 33.9 -22 22 38. 1950 Ko,Ku (1999) 06 50 40.73 -22 26 13.3 +204+04.1 K 2-2 06 49 45.2 +10 01 30. 1950 18.133.025 06 52 30.42 +09 57 48.3 +204+04.1 K 2-2 06 49 45.2 +10 01 30. 1950 70.002.006 06 52 30.42 +09 57 48.3 +210+01.1 M 1-8 06 50 56.5 +03 11 51.7 1950 11.133.011 * 06 53 33.84 +03 08 05.2 +210+01.1 M 1-8 06 50 56.5 +03 12 11. 1950 18.133.025 06 53 33.84 +03 08 24.5 +210+01.1 M 1-8 06 50 56.4 +03 12 13. 1950 70.002.006 06 53 33.74 +03 08 26.5 +210+01.1 M 1-8 06 53 33.71 +03 08 26.1 2000 70.002.006 rad 06 53 33.71 +03 08 26.1 +210+01.1 M 1-8 06 50 56.5 +03 12 12. 1950 Ko,Ku (1999) 06 53 33.84 +03 08 25.5 +210+01.1 M 1-8 06 50 56.6 +03 12 10. 1950 IRAS06509+0312 06 53 33.94 +03 08 23.5 +222-04.1 * IRAS06518-1041 06 51 52.1 -10 41 50. 1950 Ko,Ku (1999) 06 54 13.51 -10 45 39.9 +222-04.1 * IRAS06518-1041 06 51 52.0 -10 41 48. 1950 IRAS06518-1041 06 54 13.41 -10 45 37.9 +236-10.1 * HtWe 9 06 52 26.0 -25 17 20. 1950 43.134.029 * 06 54 28.98 -25 21 11.6 +236-10.1 * HtWe 9 06 52 17.9 -25 20 42. 1950 70.002.006 06 54 20.79 -25 24 33.1 +236-10.1 * HtWe 9 06 52 17.9 -25 20 42. 1950 Ko,Ku (1999) 06 54 20.79 -25 24 33.1 +239-12.1 * ESO-427-19 06 53 14.5 -29 03 33.5 1950 37.134.041 06 55 12.09 -29 07 28.4 +239-12.1 * ESO-427-19 06 53 14.7 -29 03 33. 1950 70.002.006 06 55 12.29 -29 07 27.9 +216-00.1 A 18 06 53 43.8 -02 49 10. 1950 18.133.025 06 56 14.30 -02 53 08.1 +216-00.1 A 18 06 53 44.0 -02 49 11. 1950 70.002.006 06 56 14.50 -02 53 09.1 +216-00.1 A 18 06 56 14.45 -02 53 10.8 2000 70.002.006 rad 06 56 14.45 -02 53 10.8 +217-00.1 * MaC 1-1 06 56 14.61 -03 36 59.8 1950 22.135.002 06 58 44.22 -03 41 08.6 +217-00.1 * MaC 1-1 06 56 14.9 -03 37 02. 1950 Ko,Ku (1999) 06 58 44.51 -03 41 10.8 +217-00.1 * MaC 1-1 06 56 14.8 -03 37 03. 1950 IRAS06562-0337 06 58 44.41 -03 41 11.8 +200+08.1 A 19 06 57 06.0 +14 41 00. 1950 18.133.025 06 59 56.63 +14 36 46.9 +200+08.1 A 19 06 57 06.4 +14 40 48. 1950 70.002.006 06 59 57.03 +14 36 34.8 +200+08.1 A 19 06 57 06.46 +14 40 47.5 1950 GSC 00760-00471 06 59 57.09 +14 36 34.3 +210+03.1 * We 2-34 06 57 48.8 +04 24 53. 1950 70.002.006 * 07 00 27.48 +04 20 37.3 +210+03.1 * We 2-34 06 57 49.2 +04 24 37. 1950 Ko,Ku (1999) 07 00 27.88 +04 20 21.2 +226-03.1 PB 1 07 00 28.6 -13 38 24. 1950 09.133.025 07 02 46.66 -13 42 50.2 +226-03.1 PB 1 07 00 28.7 -13 38 08. 1950 70.002.006 07 02 46.77 -13 42 34.3 +226-03.1 PB 1 07 02 46.83 -13 42 34.5 2000 70.002.006 rad 07 02 46.83 -13 42 34.5 +226-03.1 PB 1 07 00 28.8 -13 38 11. 1950 IRAS07004-1338 07 02 46.87 -13 42 37.3 +242-11.1 M 3-1 07 00 55.6 -31 31 03. 1950 08.114.108 * 07 02 49.79 -31 35 30.3 +242-11.1 M 3-1 07 00 55.5 -31 31 14. 1950 09.133.025 07 02 49.68 -31 35 41.3 +242-11.1 M 3-1 07 00 55.7 -31 31 03. 1950 50.134.178 07 02 49.89 -31 35 30.3 +242-11.1 M 3-1 07 00 55.6 -31 31 02. 1950 70.002.006 07 02 49.79 -31 35 29.3 +242-11.1 M 3-1 07 02 49.90 -31 35 29.0 2000 70.002.006 rad 07 02 49.90 -31 35 29.0 +212+04.1 M 1-9 07 02 42.5 +02 51 35. 1950 09.133.025 07 05 19.40 +02 46 58.7 +212+04.1 M 1-9 07 02 42.4 +02 51 36. 1950 11.133.008 07 05 19.30 +02 46 59.7 +212+04.1 M 1-9 07 02 42.29 +02 51 35.5 1950 52.002.003 07 05 19.19 +02 46 59.2 +212+04.1 M 1-9 07 02 42.3 +02 51 36. 1950 70.002.006 07 05 19.20 +02 46 59.7 +212+04.1 M 1-9 07 05 19.28 +02 47 00.0 2000 70.002.006 rad 07 05 19.28 +02 47 00.0 +212+04.1 M 1-9 07 02 41.9 +02 51 38. 1950 IRAS07026+0251 07 05 18.80 +02 47 01.7 +217+02.1 SP 3-1 07 04 20.8 -03 00 30. 1950 25.135.035 07 06 51.12 -03 05 13.0 +217+02.1 SP 3-1 07 04 20.6 -03 00 26. 1950 70.002.006 07 06 50.93 -03 05 08.9 +217+02.1 SP 3-1 07 06 51.12 -03 05 10.7 2000 70.002.006 rad 07 06 51.12 -03 05 10.7 +217+02.1 SP 3-1 07 04 20.6 -03 00 27. 1950 Ko,Ku (1999) 07 06 50.93 -03 05 09.9 +217+02.1 SP 3-1 07 04 20.5 -03 00 28. 1950 IRAS07043-0300 07 06 50.83 -03 05 10.9 +225-02.1 * Sa 2-4 07 04 24.38 -11 40 38.9 1950 40.134.038 * 07 06 44.82 -11 45 21.8 +225-02.1 * Sa 2-4 07 04 24.5 -11 40 39. 1950 Ko,Ku (1999) 07 06 44.94 -11 45 21.9 +225-02.1 * Sa 2-4 07 04 24.6 -11 40 37. 1950 IRAS07044-1140 07 06 45.04 -11 45 19.9 +234-06.1 K 2-3 07 04 49.3 -21 57 30. 1950 09.133.025 07 06 57.15 -22 02 14.2 +234-06.1 K 2-3 07 04 49.9 -21 57 37. 1950 70.002.006 07 06 57.75 -22 02 21.2 +215+03.1 NGC 2346 07 04 16.86 -00 38 47.8 1900 CGPN/Lo 11 07 09 22.61 -00 48 24.1 +215+03.1 NGC 2346 07 06 50. -00 43 29. 1950 CGPN/Mi 59 07 09 22.88 -00 48 22.5 +215+03.1 NGC 2346 07 06 49.68 -00 43 29.4 1950 CGPN/AGK2 07 09 22.56 -00 48 22.8 +215+03.1 NGC 2346 07 06 49.2 -00 43 24. 1950 09.133.025 07 09 22.09 -00 48 17.4 +215+03.1 NGC 2346 07 06 49.5 -00 43 31. 1950 70.002.006 07 09 22.38 -00 48 24.4 +215+03.1 NGC 2346 07 09 22.59 -00 48 24.7 2000 70.002.006 rad 07 09 22.59 -00 48 24.7 +215+03.1 NGC 2346 07 09 22.54 -00 48 23.7 2000 AC 0067795 07 09 22.54 -00 48 23.7 +215+03.1 NGC 2346 07 06 49.64 -00 43 30.6 1950 AGK3-00 965 07 09 22.52 -00 48 24.0 +215+03.1 NGC 2346 07 09 22.52 -00 48 23.6 2000 HIP 034541 07 09 22.52 -00 48 23.6 +215+03.1 NGC 2346 07 09 22.54 -00 48 24.1 2000 PPM 176711 07 09 22.54 -00 48 24.1 +215+03.1 NGC 2346 07 06 49.4 -00 43 32. 1950 IRAS07068-0043 07 09 22.28 -00 48 25.4 +232-04.1 M 1-11 07 09 05.4 -19 45 55. 1950 09.133.025 07 11 16.19 -19 50 57.1 +232-04.1 M 1-11 07 09 05.9 -19 46 01. 1950 11.133.008 07 11 16.69 -19 51 03.2 +232-04.1 M 1-11 07 09 05.9 -19 46 01. 1950 33.134.004 07 11 16.69 -19 51 03.2 +232-04.1 M 1-11 07 09 05.90 -19 46 00.9 1950 52.002.003 07 11 16.69 -19 51 03.1 +232-04.1 M 1-11 07 09 05.9 -19 46 01. 1950 70.002.006 07 11 16.69 -19 51 03.2 +232-04.1 M 1-11 07 11 16.80 -19 51 01.6 2000 70.002.006 rad 07 11 16.80 -19 51 01.6 +232-04.1 M 1-11 07 09 05.9 -19 46 01. 1950 IRAS07090-1946 07 11 16.69 -19 51 03.2 +229-02.1 K 1-10 07 10 20.0 -16 00 36. 1950 09.133.025 07 12 35.44 -16 05 43.5 +229-02.1 K 1-10 07 10 20.5 -16 00 54. 1950 70.002.006 07 12 35.93 -16 06 01.5 +229-02.1 K 1-10 07 12 35.81 -16 05 56.3 2000 70.002.006 rad 07 12 35.81 -16 05 56.3 +229-02.1 K 1-10 07 10 20.1 -16 00 52. 1950 Ko,Ku (1999) 07 12 35.53 -16 05 59.5 +240-07.1 M 3-2 07 12 49.2 -27 45 01. 1950 18.133.025 07 14 49.53 -27 50 18.3 +240-07.1 M 3-2 07 12 49.5 -27 45 06. 1950 70.002.006 07 14 49.82 -27 50 23.3 +240-07.1 M 3-2 07 14 49.70 -27 50 17.0 2000 70.002.006 rad 07 14 49.70 -27 50 17.0 +258-15.1 SKWL 3-2 07 13 23.3 -46 52 59. 1950 Wr (1966) * 07 14 49.26 -46 58 17.5 +258-15.1 SKWL 3-2 07 13 23.6 -46 52 52. 1950 08.114.108 07 14 49.56 -46 58 10.5 +258-15.1 SKWL 3-2 07 13 23.4 -46 52 20. 1950 Ko,Ku (1999) 07 14 49.39 -46 57 38.5 +258-15.1 SKWL 3-2 07 13 22.9 -46 52 21. 1950 IRAS07133-4652 07 14 48.88 -46 57 39.4 +225+00.1 * We 2-37 07 13 46.4 -10 47 39. 1950 20.135.020 * 07 16 08.02 -10 53 01.0 +225+00.1 * We 2-37 07 13 46.7 -10 47 41. 1950 Ko,Ku (1999) 07 16 08.32 -10 53 03.0 +224+01.1 We 1-6 07 15 03.6 -10 05 13. 1950 20.135.021 07 17 26.05 -10 10 40.3 +224+01.1 We 1-6 07 15 03.0 -10 04 56. 1950 50.134.178 07 17 25.46 -10 10 23.3 +224+01.1 We 1-6 07 15 03.1 -10 05 04. 1950 70.002.006 07 17 25.55 -10 10 31.3 +224+01.1 We 1-6 07 17 26.50 -10 10 26.0 2000 70.002.006 rad 07 17 26.50 -10 10 26.0 +224+01.1 We 1-6 07 15 03.6 -10 05 12. 1950 Ko,Ku (1999) 07 17 26.05 -10 10 39.3 +247-10.1 * Sa 3-4 07 16 24.7 -34 49 07. 1950 Wr (1966) * 07 18 14.51 -34 54 38.8 +247-10.1 * Sa 3-4 07 16 23.7 -34 49 14. 1950 Ko,Ku (1999) 07 18 13.50 -34 54 45.7 +199+14.1 * IRAS07171+1823 07 17 07.1 +18 23 02. 1950 Ko,Ku (1999) 07 20 01.69 +18 17 25.1 +199+14.1 * IRAS07171+1823 07 17 06.8 +18 23 02. 1950 IRAS07171+1823 07 20 01.39 +18 17 25.1 +235-03.1 M 1-12 07 17 12.0 -21 38 17. 1950 09.133.025 07 19 20.70 -21 43 52.7 +235-03.1 M 1-12 07 17 12.3 -21 38 18. 1950 20.041.026 07 19 21.00 -21 43 53.7 +235-03.1 M 1-12 07 17 12.8 -21 38 20. 1950 31.116.001 07 19 21.50 -21 43 55.7 +235-03.1 M 1-12 07 17 12.77 -21 38 19.6 1950 52.002.003 07 19 21.47 -21 43 55.3 +235-03.1 M 1-12 07 17 12.8 -21 38 20. 1950 70.002.006 07 19 21.50 -21 43 55.7 +235-03.1 M 1-12 07 19 21.53 -21 43 54.3 2000 70.002.006 rad 07 19 21.53 -21 43 54.3 +235-03.1 M 1-12 07 17 12.8 -21 38 19. 1950 IRAS07172-2138 07 19 21.50 -21 43 54.7 +232-01.1 M 1-13 07 19 00.8 -18 02 46. 1950 09.133.025 * 07 21 14.03 -18 08 29.3 +232-01.1 M 1-13 07 19 02.6 -18 02 50. 1950 33.134.004 07 21 15.83 -18 08 33.4 +232-01.1 M 1-13 07 19 01.68 -18 02 52.7 1950 37.134.035 07 21 14.90 -18 08 36.1 +232-01.1 M 1-13 07 19 01.7 -18 02 54. 1950 70.002.006 07 21 14.92 -18 08 37.4 +232-01.1 M 1-13 07 21 14.99 -18 08 36.0 2000 70.002.006 rad 07 21 14.99 -18 08 36.0 +232-01.1 M 1-13 07 19 01.2 -18 02 51. 1950 IRAS07190-1802 07 21 14.42 -18 08 34.3 +214+07.1 A 20 07 20 22.0 +01 51 26. 1950 18.133.025 * 07 22 57.71 +01 45 36.4 +214+07.1 A 20 07 20 22.1 +01 51 27. 1950 34.134.010 07 22 57.82 +01 45 37.4 +214+07.1 A 20 07 20 21.5 +01 51 34. 1950 50.134.178 07 22 57.22 +01 45 44.4 +214+07.1 A 20 07 20 21.9 +01 51 24. 1950 70.002.006 07 22 57.61 +01 45 34.4 +214+07.1 A 20 07 22 57.40 +01 45 37.0 2000 70.002.006 rad 07 22 57.40 +01 45 37.0 +189+19.1 NGC 2371-2 07 19 16.45 +29 41 10.8 1900 CGPN/Kb 09 07 25 34.85 +29 29 25.3 +189+19.1 NGC 2371-2 07 19 15.51 +29 41 07.7 1900 CGPN/Lo 11 07 25 33.91 +29 29 22.3 +189+19.1 NGC 2371-2 07 19 15.6 +29 41 04.6 1900 CGPN/Lu 28 07 25 34.00 +29 29 19.2 +189+19.1 NGC 2371-2 07 22 25.5 +29 35 23. 1950 02.133.027 07 25 34.58 +29 29 23.9 +189+19.1 NGC 2371-2 07 22 25.54 +29 35 25.6 1950 12.133.017 07 25 34.62 +29 29 26.5 +189+19.1 NGC 2371-2 07 22 26.2 +29 35 35. 1950 30.002.012 07 25 35.29 +29 29 35.8 +189+19.1 NGC 2371-2 07 22 25.6 +29 35 27. 1950 70.002.006 07 25 34.69 +29 29 27.9 +189+19.1 NGC 2371-2 07 25 34.69 +29 29 25.5 2000 70.002.006 rad 07 25 34.69 +29 29 25.5 +189+19.1 NGC 2371-2 07 22 25.2 +29 35 25. 1950 IRAS07224+2935 07 25 34.28 +29 29 25.9 +221+05.2 * Y-C 37 07 23 59.60 -05 15 57.4 1950 40.134.038 * 07 26 27.54 -05 22 01.6 +221+05.2 * Y-C 37 07 23 59.8 -05 15 58. 1950 Ko,Ku (1999) 07 26 27.74 -05 22 02.2 +221+05.1 M 3-3 07 24 06.3 -05 16 00. 1950 09.133.025 * 07 26 34.24 -05 22 04.6 +221+05.1 M 3-3 07 24 06.0 -05 16 15.0 1950 11.133.011 07 26 33.94 -05 22 19.6 +221+05.1 M 3-3 07 24 06.1 -05 15 49. 1950 34.134.010 07 26 34.05 -05 21 53.6 +221+05.1 M 3-3 07 24 05.69 -05 15 47.4 1950 40.134.038 07 26 33.64 -05 21 52.0 +221+05.1 M 3-3 07 24 06.3 -05 15 47. 1950 70.002.006 07 26 34.25 -05 21 51.6 +221+05.1 M 3-3 07 24 06.3 -05 15 48. 1950 Ko,Ku (1999) 07 26 34.25 -05 21 52.6 +221+05.1 M 3-3 07 24 06.26 -05 15 47.6 1950 GSC 4825-00324 07 26 34.21 -05 21 52.2 +235-01.1 M 1-14 07 25 46.0 -20 06 58. 1950 09.133.025 07 27 56.94 -20 13 08.8 +235-01.1 M 1-14 07 25 45.60 -20 07 12.7 1950 52.002.003 07 27 56.53 -20 13 23.5 +235-01.1 M 1-14 07 25 45.6 -20 07 12. 1950 70.002.006 07 27 56.53 -20 13 22.8 +235-01.1 M 1-14 07 27 56.56 -20 13 23.0 2000 70.002.006 rad 07 27 56.56 -20 13 23.0 +235-01.1 M 1-14 07 25 46.0 -20 07 13. 1950 IRAS07257-2007 07 27 56.93 -20 13 23.8 +197+17.1 NGC 2392 07 22 04.66 +21 09 20.4 1880 CGPN/Wn 09 07 29 10.90 +20 54 42.4 +197+17.1 NGC 2392 07 23 15.78 +21 06 59.3 1900 CGPN/Bs 11 07 29 10.90 +20 54 42.8 +197+17.1 NGC 2392 07 23 15.77 +21 06 59.6 1900 CGPN/Lo 11 07 29 10.89 +20 54 43.1 +197+17.1 NGC 2392 07 23 15.81 +21 06 59.1 1900 CGPN/Si 27 07 29 10.93 +20 54 42.6 +197+17.1 NGC 2392 07 26 13.30 +21 00 56.7 1950 CGPN/AGK2 07 29 10.78 +20 54 42.5 +197+17.1 NGC 2392 07 26 13.2 +21 00 51. 1950 09.133.025 07 29 10.68 +20 54 36.8 +197+17.1 NGC 2392 07 26 13.30 +21 00 56.7 1950 11.133.008 07 29 10.78 +20 54 42.5 +197+17.1 NGC 2392 07 26 13.22 +21 00 57.0 1950 12.133.017 07 29 10.70 +20 54 42.8 +197+17.1 NGC 2392 07 26 13.4 +21 00 58. 1950 70.002.006 07 29 10.88 +20 54 43.8 +197+17.1 NGC 2392 07 29 10.81 +20 54 41.6 2000 70.002.006 rad 07 29 10.81 +20 54 41.6 +197+17.1 NGC 2392 07 29 10.77 +20 54 42.5 2000 HIP 036369 07 29 10.77 +20 54 42.5 +197+17.1 NGC 2392 07 29 10.77 +20 54 42.9 2000 PPM 097562 07 29 10.77 +20 54 42.9 +197+17.1 NGC 2392 07 26 13.2 +21 00 56. 1950 IRAS07262+2100 07 29 10.68 +20 54 41.8 +205+14.1 * A 21 07 26 15.7 +13 21 00. 1950 09.133.025 * 07 29 04.09 +13 14 45.9 +205+14.1 * A 21 07 26 14.5 +13 20 44. 1950 34.134.010 07 29 02.88 +13 14 30.0 +205+14.1 * A 21 07 26 14.5 +13 20 44. 1950 70.002.006 07 29 02.88 +13 14 30.0 +205+14.1 * A 21 07 26 14.4 +13 21 03. 1950 Ko,Ku (1999) 07 29 02.79 +13 14 49.0 +248-08.1 M 4-2 07 27 04.6 -35 38 57. 1950 50.134.178 07 28 53.81 -35 45 12.4 +248-08.1 M 4-2 07 27 04.6 -35 38 59. 1950 70.002.006 07 28 53.81 -35 45 14.4 +248-08.1 M 4-2 07 28 53.88 -35 45 14.6 2000 70.002.006 rad 07 28 53.88 -35 45 14.6 +248-08.1 M 4-2 07 27 05.9 -35 39 03. 1950 IRAS07270-3539 07 28 55.11 -35 45 18.5 +219+07.1 RWT 152 07 27 27.0 -02 00 21. 1950 Ko,Ku (1999) 07 29 58.51 -02 06 39.3 +219+07.1 RWT 152 07 27 26.97 -02 00 20.3 1950 GSC 4821-00403 07 29 58.48 -02 06 38.6 +238-01.1 * KLSS 1-8 07 31 18.7 -23 19 35. 1950 63.134.060 * 07 33 25.86 -23 26 08.1 +238-01.1 * KLSS 1-8 07 33 25.9 -23 26 08. 2000 We (1996) 07 33 25.9 -23 26 08. +238-01.1 * KLSS 1-8 07 31 18.4 -23 18 40. 1950 Ko,Ku (1999) 07 33 25.58 -23 25 13.1 +215+11.1 K 1-11 07 33 30.0 +02 49 00. 1950 18.133.025 07 36 06.69 +02 42 17.2 +215+11.1 K 1-11 07 33 31.5 +02 49 07. 1950 70.002.006 07 36 08.19 +02 42 24.1 +215+11.1 K 1-11 07 33 31.2 +02 49 09. 1950 Ko,Ku (1999) 07 36 07.89 +02 42 26.1 +226+05.1 M 1-16 07 34 54.9 -09 31 55. 1950 09.133.025 07 37 18.33 -09 38 43.1 +226+05.1 M 1-16 07 34 55.7 -09 32 05. 1950 11.133.008 07 37 19.13 -09 38 53.1 +226+05.1 M 1-16 07 34 55.48 -09 32 00.4 1950 37.134.035 07 37 18.91 -09 38 48.5 +226+05.1 M 1-16 07 34 55.48 -09 32 00.0 1950 52.002.003 07 37 18.91 -09 38 48.1 +226+05.1 M 1-16 07 34 55.5 -09 32 01. 1950 70.002.006 07 37 18.93 -09 38 49.1 +226+05.1 M 1-16 07 37 18.98 -09 38 47.2 2000 70.002.006 rad 07 37 18.98 -09 38 47.2 +226+05.1 M 1-16 07 34 55.3 -09 32 01. 1950 IRAS07349-0932 07 37 18.73 -09 38 49.1 +228+05.1 M 1-17 07 38 01.0 -11 25 02. 1950 09.133.025 * 07 40 22.42 -11 32 02.4 +228+05.1 M 1-17 07 38 00.76 -11 25 29.7 1950 37.134.035 07 40 22.18 -11 32 30.1 +228+05.1 M 1-17 07 38 00.78 -11 25 29.7 1950 52.002.003 07 40 22.20 -11 32 30.1 +228+05.1 M 1-17 07 38 00.8 -11 25 30. 1950 70.002.006 07 40 22.21 -11 32 30.4 +228+05.1 M 1-17 07 40 22.20 -11 32 28.8 2000 70.002.006 rad 07 40 22.20 -11 32 28.8 +228+05.1 M 1-17 07 38 01.2 -11 25 32. 1950 IRAS07380-1125 07 40 22.61 -11 32 32.4 +231+04.2 NGC 2438 07 36 20.11 -14 27 19.4 1880 CGPN/Wn 09 07 41 51.01 -14 44 07.5 +231+04.2 NGC 2438 07 37 15.21 -14 30 00.7 1900 CGPN/Po 10 07 41 50.97 -14 44 04.4 +231+04.2 NGC 2438 07 37 15.40 -14 30 06.6 1900 CGPN/Bs 11 07 41 51.15 -14 44 10.3 +231+04.2 NGC 2438 07 39 32.5 -14 36 56. 1950 09.133.025 07 41 50.40 -14 44 02.3 +231+04.2 NGC 2438 07 39 32.4 -14 37 02. 1950 34.134.010 07 41 50.30 -14 44 08.3 +231+04.2 NGC 2438 07 39 32.4 -14 36 54. 1950 50.134.178 07 41 50.30 -14 44 00.3 +231+04.2 NGC 2438 07 39 32.5 -14 37 00. 1950 70.002.006 07 41 50.40 -14 44 06.3 +231+04.2 NGC 2438 07 41 50.70 -14 44 07.2 2000 70.002.006 rad 07 41 50.70 -14 44 07.2 +231+04.2 NGC 2438 07 39 33.8 -14 37 04. 1950 IRAS07395-1437 07 41 51.70 -14 44 10.4 +234+02.1 NGC 2440 07 36 34.04 -17 55 43.0 1880 CGPN/Wn 09 07 41 55.36 -18 12 32.5 +234+02.1 NGC 2440 07 37 27.57 -17 58 26.5 1900 CGPN/Po 10 07 41 55.35 -18 12 31.3 +234+02.1 NGC 2440 07 37 27.55 -17 58 26.3 1900 CGPN/Bs 11 07 41 55.33 -18 12 31.1 +234+02.1 NGC 2440 07 39 41.5 -18 05 26. 1950 09.133.025 07 41 55.42 -18 12 32.8 +234+02.1 NGC 2440 07 39 41.0 -18 05 23. 1950 11.133.008 07 41 54.92 -18 12 29.7 +234+02.1 NGC 2440 07 39 41.4 -18 05 25. 1950 50.134.178 07 41 55.32 -18 12 31.8 +234+02.1 NGC 2440 07 39 41.5 -18 05 26. 1950 65.134.076 07 41 55.42 -18 12 32.8 +234+02.1 NGC 2440 07 39 41.5 -18 05 24. 1950 70.002.006 07 41 55.42 -18 12 30.8 +234+02.1 NGC 2440 07 41 55.36 -18 12 30.5 2000 70.002.006 rad 07 41 55.36 -18 12 30.5 +234+02.1 NGC 2440 07 39 41.5 -18 05 27. 1950 IRAS07396-1805 07 41 55.42 -18 12 33.8 +231+04.1 M 1-18 07 39 45.2 -14 14 06. 1950 09.133.025 * 07 42 03.54 -14 21 13.2 +231+04.1 M 1-18 07 39 45.9 -14 14 10. 1950 50.134.178 07 42 04.24 -14 21 17.2 +231+04.1 M 1-18 07 39 45.8 -14 14 10. 1950 70.002.006 07 42 04.14 -14 21 17.2 +231+04.1 M 1-18 07 42 04.28 -14 21 02.2 2000 70.002.006 rad 07 42 04.28 -14 21 02.2 +231+04.1 M 1-18 07 39 46.0 -14 14 12. 1950 Ko,Ku (1999) 07 42 04.33 -14 21 19.2 +247-04.1 * FEGU 248-5 07 40 28.9 -32 40 42. 1950 34.134.028 07 42 23.81 -32 47 51.3 +247-04.1 * FEGU 248-5 07 40 28.9 -32 40 42. 1950 Ko,Ku (1999) 07 42 23.81 -32 47 51.3 +247-04.1 * FEGU 248-5 07 40 28.8 -32 40 29. 1950 IRAS07404-3240 07 42 23.72 -32 47 38.3 +249-05.1 A 23 07 41 26.9 -34 38 00. 1950 09.133.025 07 43 18.92 -34 45 13.0 +249-05.1 A 23 07 41 26.0 -34 37 59. 1950 70.002.006 07 43 18.02 -34 45 12.0 +249-05.1 A 23 07 43 18.10 -34 45 09.0 2000 70.002.006 rad 07 43 18.10 -34 45 09.0 +249-05.1 A 23 07 41 26.1 -34 38 00. 1950 Ko,Ku (1999) 07 43 18.12 -34 45 13.0 +243-01.1 NGC 2452 07 43 20.84 -27 05 15.8 1900 CGPN/Po 10 07 47 26.63 -27 20 05.6 +243-01.1 NGC 2452 07 45 24.7 -27 12 43. 1950 09.133.025 07 47 27.63 -27 20 11.9 +243-01.1 NGC 2452 07 45 23.1 -27 12 27.0 1950 11.133.011 07 47 26.04 -27 19 55.8 +243-01.1 NGC 2452 07 45 23.2 -27 12 37. 1950 30.002.012 07 47 26.14 -27 20 05.8 +243-01.1 NGC 2452 07 45 23.3 -27 12 38. 1950 70.002.006 07 47 26.24 -27 20 06.8 +243-01.1 NGC 2452 07 47 26.26 -27 20 06.7 2000 70.002.006 rad 07 47 26.26 -27 20 06.7 +243-01.1 NGC 2452 07 45 23.4 -27 12 37. 1950 IRAS07453-2712 07 47 26.34 -27 20 05.8 +264-12.1 He 2-5 07 46 00.4 -51 07 34. 1950 08.114.108 07 47 19.89 -51 15 03.9 +264-12.1 He 2-5 07 46 01.1 -51 07 41. 1950 18.133.025 07 47 20.59 -51 15 10.9 +264-12.1 He 2-5 07 46 01.0 -51 07 34. 1950 IRAS07460-5107 07 47 20.49 -51 15 03.9 +235+04.1 * Y-C 40 07 47 48.13 -17 44 24.6 1950 40.134.038 07 50 02.79 -17 52 03.2 +235+04.1 * Y-C 40 07 47 48.3 -17 44 26. 1950 Ko,Ku (1999) 07 50 02.96 -17 52 04.6 +236+03.1 K 1-12 07 47 58.9 -19 10 30. 1950 18.133.025 07 50 11.91 -19 18 09.3 +236+03.1 K 1-12 07 47 58.6 -19 10 37. 1950 70.002.006 07 50 11.61 -19 18 16.2 +236+03.1 K 1-12 07 47 58.6 -19 10 37. 1950 Ko,Ku (1999) 07 50 11.61 -19 18 16.2 +217+14.1 A 24 07 49 01.6 +03 08 11. 1950 09.133.025 * 07 51 38.52 +03 00 26.9 +217+14.1 A 24 07 49 00.7 +03 08 12. 1950 50.134.178 07 51 37.62 +03 00 28.0 +217+14.1 A 24 07 48 30.9 +03 08 10. 1950 70.002.006 07 51 07.82 +03 00 27.9 +217+14.1 A 24 07 49 00.7 +03 08 04. 1950 Ko,Ku (1999) 07 51 37.61 +03 00 20.0 +252-04.1 * Sa 2-18 07 51 07.9 -36 36 04. 1950 52.114.020 07 52 57.72 -36 43 54.7 +252-04.1 * Sa 2-18 07 52 57.8 -36 43 57. 2000 72.002.012 07 52 57.8 -36 43 57. +252-04.1 * Sa 2-18 07 51 08.11 -36 36 07.0 1950 72.002.012 rad 07 52 57.93 -36 43 57.8 +252-04.1 * Sa 2-18 07 51 08.0 -36 36 06. 1950 Ko,Ku (1999) 07 52 57.82 -36 43 56.8 +252-04.1 * Sa 2-18 07 51 07.7 -36 36 02. 1950 IRAS07511-3636 07 52 57.52 -36 43 52.7 +259-09.1 * Y-C 2 07 51 11.87 -45 04 12.0 1950 10.113.006 07 52 46.32 -45 12 02.5 +259-09.1 * Y-C 2 07 51 12.0 -45 04 13. 1950 Ko,Ku (1999) 07 52 46.45 -45 12 03.5 +211+18.1 * HtDe 7 07 52 27.6 +09 41 09. 1950 43.134.029 07 55 11.29 +09 33 11.5 +211+18.1 * HtDe 7 07 52 27.5 +09 41 08. 1950 70.002.006 07 55 11.19 +09 33 10.5 +211+18.1 * HtDe 7 07 52 27.7 +09 41 06. 1950 Ko,Ku (1999) 07 55 11.39 +09 33 08.5 +241+02.1 M 3-4 07 53 03.2 -23 30 14. 1950 02.133.027 * 07 55 11.33 -23 38 12.7 +241+02.1 M 3-4 07 53 03.1 -23 29 47. 1950 09.133.025 07 55 11.23 -23 37 45.7 +241+02.1 M 3-4 07 53 03.4 -23 30 15. 1950 50.134.178 07 55 11.53 -23 38 13.7 +241+02.1 M 3-4 07 53 03.3 -23 30 14. 1950 70.002.006 07 55 11.43 -23 38 12.7 +241+02.1 M 3-4 07 55 11.44 -23 38 16.2 2000 70.002.006 rad 07 55 11.44 -23 38 16.2 +241+02.1 M 3-4 07 53 03.36 -23 30 14.2 1950 GSC 6553-01710 07 55 11.49 -23 38 12.9 +241+02.1 M 3-4 07 53 02.6 -23 30 10. 1950 IRAS07530-2330 07 55 10.73 -23 38 08.7 +164+31.1 JnEr 1 07 53 57.6 +53 33 06. 1950 28.135.019 * 07 57 50.27 +53 25 00.6 +164+31.1 JnEr 1 07 53 59.9 +53 33 24. 1950 34.134.010 07 57 52.58 +53 25 18.4 +164+31.1 JnEr 1 07 53 57.6 +53 33 06.0 1950 57.134.011 07 57 50.27 +53 25 00.6 +164+31.1 JnEr 1 07 53 59.0 +53 33 22. 1950 70.002.006 07 57 51.68 +53 25 16.5 +164+31.1 JnEr 1 07 53 59.0 +53 33 22. 1950 Ko,Ku (1999) 07 57 51.68 +53 25 16.5 +164+31.1 JnEr 1 07 53 58.1 +53 33 23. 1950 IRAS07539+5333 07 57 50.79 +53 25 17.5 +251-03.1 CSST 1 07 55 15.4 -35 58 45. 1950 Ko,Ku (1999) 07 57 06.62 -36 06 51.6 +245+01.1 M 3-5 08 00 25.2 -27 33 31. 1950 18.133.025 08 02 28.76 -27 41 57.6 +245+01.1 M 3-5 08 00 25.4 -27 33 29. 1950 50.134.178 08 02 28.96 -27 41 55.6 +245+01.1 M 3-5 08 00 25.5 -27 33 30. 1950 70.002.006 08 02 29.06 -27 41 56.7 +245+01.1 M 3-5 08 02 28.83 -27 41 56.9 2000 70.002.006 rad 08 02 28.83 -27 41 56.9 +245+01.1 M 3-5 08 00 25.3 -27 33 28. 1950 IRAS08004-2733 08 02 28.86 -27 41 54.6 +251-01.1 K 1-21 08 02 19.6 -34 07 27. 1950 50.134.178 * 08 04 14.34 -34 16 00.6 +251-01.1 K 1-21 08 02 19.8 -34 07 24. 1950 70.002.006 08 04 14.55 -34 15 57.6 +251-01.1 K 1-21 08 04 14.51 -34 16 02.0 2000 70.002.006 rad 08 04 14.51 -34 16 02.0 +251-01.1 K 1-21 08 02 19.5 -34 07 34. 1950 Ko,Ku (1999) 08 04 14.24 -34 16 07.5 +263-08.1 * ESO-209-15 08 03 41.5 -48 14 52.2 1950 37.134.041 08 05 10.97 -48 23 30.1 +263-08.1 * ESO-209-15 08 03 41.5 -48 14 55. 1950 Ko,Ku (1999) 08 05 10.97 -48 23 32.9 +257-05.1 KLSS 1-10 08 03 51.2 -41 47 52. 1950 63.134.060 * 08 05 33.69 -41 56 30.9 +257-05.1 KLSS 1-10 08 05 33.7 -41 56 31. 2000 We (1996) 08 05 33.7 -41 56 31. +257-05.1 KLSS 1-10 08 03 51.2 -41 47 40. 1950 Ko,Ku (1999) 08 05 33.70 -41 56 18.9 +224+15.1 K 1-13 08 04 14.3 -02 44 01. 1950 18.133.025 08 06 45.24 -02 52 42.8 +224+15.1 K 1-13 08 04 15.1 -02 44 00. 1950 70.002.006 08 06 46.04 -02 52 41.8 +224+15.1 K 1-13 08 04 15.6 -02 43 54. 1950 Ko,Ku (1999) 08 06 46.54 -02 52 35.9 +255-03.1 * IRAS08046-3844 08 04 40.6 -38 44 43. 1950 Ko,Ku (1999) 08 06 28.45 -38 53 25.1 +255-03.1 * IRAS08046-3844 08 04 40.5 -38 44 41. 1950 IRAS08046-3844 08 06 28.35 -38 53 23.1 +238+07.2 Sa 2-21 08 06 30.6 -19 05 06. 1950 50.134.178 08 08 44.63 -19 13 55.7 +238+07.2 Sa 2-21 08 06 30.1 -19 05 11. 1950 70.002.006 08 08 44.13 -19 14 00.7 +238+07.2 Sa 2-21 08 08 44.30 -19 14 05.0 2000 70.002.006 rad 08 08 44.30 -19 14 05.0 +246+02.1 * Sa 3-6 08 06 31.2 -27 32 26. 1950 Wr (1966) 08 08 35.26 -27 41 15.5 +246+02.1 * Sa 3-6 08 06 31.6 -27 32 18. 1950 Ko,Ku (1999) 08 08 35.66 -27 41 07.5 +250+00.1 A 26 08 07 03.8 -32 31 24. 1950 18.133.025 08 09 01.30 -32 40 15.3 +250+00.1 A 26 08 07 04.3 -32 31 20. 1950 50.134.178 08 09 01.81 -32 40 11.3 +250+00.1 A 26 08 07 04.2 -32 31 33. 1950 70.002.006 08 09 01.70 -32 40 24.3 +250+00.1 A 26 08 07 04.1 -32 31 35. 1950 Ko,Ku (1999) 08 09 01.60 -32 40 26.3 +211+22.1 * BN 0808+11 08 08 28.1 +11 06 15. 1950 70.002.006 08 11 12.83 +10 57 17.1 +211+22.1 * BN 0808+11 08 08 28.11 +11 06 15.0 1950 GSC 0798-00438 08 11 12.84 +10 57 17.1 +240+07.1 Y-C 5 08 08 28.97 -20 22 35.9 1950 10.113.006 08 10 41.67 -20 31 32.9 +240+07.1 Y-C 5 08 08 28.9 -20 22 35. 1950 50.134.178 08 10 41.60 -20 31 32.0 +240+07.1 Y-C 5 08 08 28.9 -20 22 36. 1950 70.002.006 08 10 41.60 -20 31 33.0 +240+07.1 Y-C 5 08 10 41.77 -20 31 33.3 2000 70.002.006 rad 08 10 41.77 -20 31 33.3 +240+07.1 Y-C 5 08 08 29.1 -20 22 36. 1950 Ko,Ku (1999) 08 10 41.80 -20 31 33.0 +240+07.1 Y-C 5 08 08 28.2 -20 22 34. 1950 IRAS08084-2022 08 10 40.90 -20 31 31.0 +264-08.1 He 2-7 08 10 02.6 -48 34 15. 1950 CGPN/Ko 64c 08 11 32.45 -48 43 16.5 +264-08.1 He 2-7 08 10 02.0 -48 34 17. 1950 08.114.108 08 11 31.84 -48 43 18.5 +264-08.1 He 2-7 08 10 02.1 -48 34 13. 1950 18.133.025 08 11 31.95 -48 43 14.5 +264-08.1 He 2-7 08 10 02.4 -48 34 17. 1950 IRAS08100-4834 08 11 32.24 -48 43 18.5 +251+00.1 CSST 2 08 11 23.9 -32 51 57. 1950 Ko,Ku (1999) 08 13 21.36 -33 01 04.3 +257-02.1 Vo 2 08 14 22.5 -39 42 34. 1950 70.002.006 08 16 10.00 -39 51 51.9 +257-02.1 Vo 2 08 16 10.00 -39 51 48.3 2000 70.002.006 rad 08 16 10.00 -39 51 48.3 +257-02.1 Vo 2 08 14 22.53 -39 42 33.7 1950 GSC 7664-01548 08 16 10.03 -39 51 51.6 +257-02.1 Vo 2 08 14 22.6 -39 42 33. 1950 IRAS08143-3942 08 16 10.10 -39 51 50.9 +253+00.1 * MmWe 2-1 08 18 57.1 -35 07 43. 1950 Wr (1966) * 08 20 52.20 -35 17 17.6 +253+00.1 * MmWe 2-1 08 18 57.8 -35 07 01. 1950 51.134.007 08 20 52.92 -35 16 35.7 +253+00.1 * MmWe 2-1 08 18 57.4 -35 06 59. 1950 Ko,Ku (1999) 08 20 52.52 -35 16 33.6 +263-05.1 PB 2 08 19 03.3 -46 10 39. 1950 18.133.025 * 08 20 39.82 -46 20 13.4 +263-05.1 PB 2 08 19 03.8 -46 13 26. 1950 Ko,Ku (1999) 08 20 40.22 -46 23 00.5 +263-05.1 PB 2 08 19 04.5 -46 13 26. 1950 IRAS08190-4613 08 20 40.93 -46 23 00.5 +261-04.1 * Sa 2-25 08 19 23.9 -44 14 05. 1950 Wr (1966) 08 21 04.23 -44 23 40.8 +261-04.1 * Sa 2-25 08 19 23.8 -44 14 20. 1950 Ko,Ku (1999) 08 21 04.12 -44 23 55.8 +262-04.1 * ESO-259-06 08 22 14. -45 21 12. 1950 28.135.026 08 23 52.68 -45 30 57.8 +262-04.1 * ESO-259-06 08 22 15. -45 21 24. 1950 31.002.098 08 23 53.68 -45 31 09.9 +262-04.1 * ESO-259-06 08 22 15.1 -45 21 25. 1950 Ko,Ku (1999) 08 23 53.78 -45 31 10.9 +262-04.1 * ESO-259-06 08 22 15.3 -45 21 22. 1950 IRAS08222-4521 08 23 53.98 -45 31 07.9 +257-00.1 * IRAS08252-3852 08 25 15.48 -38 52 17.4 1950 72.002.012 rad 08 27 05.81 -39 02 14.3 +257-00.1 * IRAS08252-3852 08 27 05.8 -39 02 17. 2000 72.002.012 08 27 05.8 -39 02 17. +257-00.1 * IRAS08252-3852 08 25 15.5 -38 52 20. 1950 Ko,Ku (1999) 08 27 05.83 -39 02 16.9 +257-00.1 * IRAS08252-3852 08 25 15.4 -38 52 18. 1950 IRAS08252-3852 08 27 05.73 -39 02 14.9 +258-00.1 He 2-9 08 26 38.0 -39 13 41. 1950 09.133.025 08 28 27.97 -39 23 42.7 +258-00.1 He 2-9 08 26 38.0 -39 13 39. 1950 70.002.006 08 28 27.97 -39 23 40.7 +258-00.1 He 2-9 08 28 28.02 -39 23 39.4 2000 70.002.006 rad 08 28 28.02 -39 23 39.4 +258-00.1 He 2-9 08 26 38.9 -39 13 42. 1950 IRAS08266-3913 08 28 28.88 -39 23 43.7 +257+00.1 VBRC 1 08 29 01.9 -38 07 53. 1950 70.002.006 08 30 53.89 -38 18 03.1 +257+00.1 VBRC 1 08 30 54.26 -38 18 03.0 2000 70.002.006 rad 08 30 54.26 -38 18 03.0 +257+00.1 VBRC 1 08 29 01.9 -38 07 56. 1950 Ko,Ku (1999) 08 30 53.89 -38 18 06.1 +257+00.1 VBRC 1 08 29 02.0 -38 07 56. 1950 IRAS08290-3807 08 30 53.99 -38 18 06.1 +249+06.1 * AS 201 08 29 36.8 -27 35 20. 1950 08.114.156 08 31 42.80 -27 45 32.5 +249+06.1 * AS 201 08 29 36.81 -27 35 20.2 1950 51.117.039 08 31 42.81 -27 45 32.7 +249+06.1 * AS 201 08 29 36.8 -27 35 20. 1950 70.002.006 08 31 42.80 -27 45 32.5 +249+06.1 * AS 201 08 29 36.83 -27 35 19.8 1950 GSC 6578-01754 08 31 42.83 -27 45 32.3 +249+06.1 * AS 201 08 29 36.9 -27 35 20. 1950 IRAS08296-2735 08 31 42.90 -27 45 32.5 +252+04.1 K 1-1 08 29 51.9 -31 55 54. 1950 09.133.025 08 31 52.59 -32 06 07.2 +252+04.1 K 1-1 08 29 51.8 -31 55 57. 1950 70.002.006 08 31 52.49 -32 06 10.2 +239+13.1 NGC 2610 08 28 46.70 -15 48 30.1 1900 CGPN/Po 10 08 33 23.83 -16 08 58.0 +239+13.1 NGC 2610 08 31 05.0 -15 58 39. 1950 09.133.025 08 33 23.59 -16 08 56.9 +239+13.1 NGC 2610 08 31 04.9 -15 58 38. 1950 34.134.010 08 33 23.49 -16 08 55.9 +239+13.1 NGC 2610 08 31 04.7 -15 58 41. 1950 50.134.178 08 33 23.29 -16 08 58.9 +239+13.1 NGC 2610 08 31 04.8 -15 58 40. 1950 70.002.006 08 33 23.39 -16 08 57.9 +239+13.1 NGC 2610 08 33 23.33 -16 08 56.6 2000 70.002.006 rad 08 33 23.33 -16 08 56.6 +239+13.1 NGC 2610 08 31 04.7 -15 58 41. 1950 IRAS08310-1558 08 33 23.29 -16 08 58.9 +265-04.1 ESO-259-10 08 32 29. -47 06 24. 1950 28.135.026 08 34 06.14 -47 16 45.6 +265-04.1 ESO-259-10 08 32 29.9 -47 06 16.5 1950 37.134.041 08 34 07.04 -47 16 38.1 +265-04.1 ESO-259-10 08 32 29.4 -47 06 12. 1950 IRAS08324-4706 08 34 06.54 -47 16 33.6 +264-03.1 * WRA 17-20 08 32 50.0 -46 15 16. 1950 Wr (1966) 08 34 28.87 -46 25 38.8 +264-03.1 * WRA 17-20 08 32 48.5 -46 15 17. 1950 Ko,Ku (1999) 08 34 27.36 -46 25 39.8 +255+03.1 Sa 2-28 08 34 19.3 -35 05 23. 1950 Wr (1966) * 08 36 16.35 -35 15 51.4 +255+03.1 Sa 2-28 08 34 19.3 -35 04 36. 1950 70.002.006 08 36 16.36 -35 15 04.4 +255+03.1 Sa 2-28 08 36 15.70 -35 15 09.0 2000 70.002.006 rad 08 36 15.70 -35 15 09.0 +255+03.1 Sa 2-28 08 34 19.4 -35 04 34. 1950 Ko,Ku (1999) 08 36 16.46 -35 15 02.4 +259+00.1 He 2-11 08 35 16.8 -39 15 57. 1950 Wr (1966) * 08 37 07.98 -39 26 28.5 +259+00.1 He 2-11 08 35 16.5 -39 14 34. 1950 70.002.006 08 37 07.72 -39 25 05.5 +259+00.1 He 2-11 08 37 08.05 -39 25 04.9 2000 70.002.006 rad 08 37 08.05 -39 25 04.9 +259+00.1 He 2-11 08 35 17.2 -39 14 39. 1950 Ko,Ku (1999) 08 37 08.42 -39 25 10.5 +259+00.1 He 2-11 08 35 16.6 -39 14 31. 1950 IRAS08352-3914 08 37 07.82 -39 25 02.5 +260+00.2 PN 0835-4027 08 35 35.07 -40 27 36.1 1950 58.134.001 08 37 24.46 -40 38 08.6 +260+00.2 PN 0835-4027 08 35 35.2 -40 27 36. 1950 Ko,Ku (1999) 08 37 24.59 -40 38 08.5 +260+00.2 PN 0835-4027 08 35 35.1 -40 27 31. 1950 IRAS08355-4027 08 37 24.49 -40 38 03.5 +158+37.1 A 28 08 37 37.8 +58 24 37. 1950 34.134.010 08 41 34.59 +58 13 54.2 +158+37.1 A 28 08 37 38.7 +58 24 32. 1950 70.002.006 08 41 35.48 +58 13 49.2 +158+37.1 A 28 08 37 39.0 +58 24 31. 1950 Ko,Ku (1999) 08 41 35.77 +58 13 48.2 +244+12.1 A 29 08 38 06. -20 43 06. 1950 31.002.098 * 08 40 20.23 -20 53 47.6 +244+12.1 A 29 08 38 02.8 -20 43 33. 1950 70.002.006 08 40 17.02 -20 54 14.5 +244+12.1 A 29 08 38 04.8 -20 43 55. 1950 Ko,Ku (1999) 08 40 19.02 -20 54 36.6 +254+05.1 M 3-6 08 38 42.9 -32 11 26. 1950 09.133.025 * 08 40 44.27 -32 22 09.4 +254+05.1 M 3-6 08 38 38.8 -32 11 50. 1950 50.134.178 08 40 40.15 -32 22 33.2 +254+05.1 M 3-6 08 38 38.9 -32 11 51. 1950 70.002.006 08 40 40.25 -32 22 34.2 +254+05.1 M 3-6 08 40 40.24 -32 22 33.5 2000 70.002.006 rad 08 40 40.24 -32 22 33.5 +254+05.1 M 3-6 08 38 38.87 -32 11 50.8 1950 GSC 7140-00153 08 40 40.22 -32 22 34.0 +254+05.1 M 3-6 08 38 39.1 -32 11 53. 1950 IRAS08386-3211 08 40 40.45 -32 22 36.2 +256+03.1 * Sa 2-30 08 39 13.4 -35 51 54. 1950 Wr (1966) 08 41 10.04 -36 02 39.0 +256+03.1 * Sa 2-30 08 39 13.2 -35 51 49. 1950 Ko,Ku (1999) 08 41 09.84 -36 02 34.0 +260+00.1 Vo 3 08 40 26. -40 33 18. 1950 31.002.098 08 42 16.01 -40 44 06.8 +260+00.1 Vo 3 08 40 26.7 -40 33 23. 1950 Ko,Ku (1999) 08 42 16.71 -40 44 11.9 +260+00.1 Vo 3 08 40 27.0 -40 33 22. 1950 IRAS08404-4033 08 42 17.01 -40 44 10.9 +265-02.1 Ve 26 08 41 55.6 -45 55 12. 1950 CGPN/Koal 65 * 08 43 36.85 -46 06 05.6 +265-02.1 Ve 26 08 41 46.7 -45 55 49. 1950 Ko,Ku (1999) 08 43 27.90 -46 06 42.1 +265-02.1 Ve 26 old 08 41 43.1 -45 57 37. 1950 Ko,Ku (1999) 08 43 24.23 -46 08 29.9 +265-02.1 Ve 26 old 08 41 46.6 -45 55 47. 1950 IRAS08417-4555 08 43 27.80 -46 06 40.1 +267-03.1 * Sa 3-7 08 41 53.7 -48 43 55. 1950 Wr (1966) * 08 43 29.50 -48 54 48.3 +267-03.1 * Sa 3-7 08 41 53.6 -48 43 55. 1950 Ko,Ku (1999) 08 43 29.40 -48 54 48.3 +267-03.1 * Sa 3-7 08 43 29.1 -48 54 50. 2000 72.134.011 08 43 29.1 -48 54 50. +267-03.1 * Sa 3-7 08 41 53.4 -48 43 54. 1950 IRAS08418-4843 08 43 29.20 -48 54 47.3 +208+33.1 A 30 08 44 03.29 +18 03 48.4 1950 12.133.017 * 08 46 53.29 +17 52 46.1 +208+33.1 A 30 08 44 03.5 +18 03 48. 1950 30.002.012 08 46 53.50 +17 52 45.7 +208+33.1 A 30 08 44 04.4 +18 03 35. 1950 34.134.010 08 46 54.40 +17 52 32.6 +208+33.1 A 30 08 44 03.5 +18 03 48. 1950 41.002.074 08 46 53.50 +17 52 45.7 +208+33.1 A 30 08 44 03.6 +18 03 46. 1950 70.002.006 08 46 53.60 +17 52 43.7 +208+33.1 A 30 08 44 03.51 +18 03 47.9 1950 GSC 1396-01621 08 46 53.51 +17 52 45.6 +208+33.1 A 30 08 44 03.4 +18 03 47. 1950 IRAS08440+1803 08 46 53.40 +17 52 44.7 +263+00.1 * K 2-15 08 46 51. -42 42 36. 1950 06.133.002 08 48 38.70 -42 53 45.9 +263+00.1 * K 2-15 08 46 51.26 -42 42 44.7 1950 GSC 7683-00744 08 48 38.96 -42 53 54.6 +219+31.1 A 31 08 51 30.0 +09 06 00. 1950 18.133.025 * 08 54 11.46 +08 54 33.8 +219+31.1 A 31 08 51 31.7 +09 05 25. 1950 34.134.010 08 54 13.15 +08 53 58.7 +219+31.1 A 31 08 51 31.7 +09 05 25. 1950 70.002.006 08 54 13.15 +08 53 58.7 +219+31.1 A 31 08 51 27.5 +09 06 04. 1950 Ko,Ku (1999) 08 54 08.96 +08 54 38.0 +261+02.1 He 2-15 08 51 37.7 -39 52 09. 1950 18.133.025 08 53 30.58 -40 03 34.5 +261+02.1 He 2-15 08 51 37.9 -39 52 17. 1950 Ko,Ku (1999) 08 53 30.77 -40 03 42.5 +261+02.1 He 2-15 08 51 38.2 -39 52 17. 1950 IRAS08516-3952 08 53 31.08 -40 03 42.5 +272-05.1 MmWe 1-1 08 52 10.0 -53 53 42. 1950 51.134.007 08 53 36.73 -54 05 08.5 +272-05.1 MmWe 1-1 08 52 10.2 -53 53 44. 1950 Ko,Ku (1999) 08 53 36.93 -54 05 10.5 +269-03.1 PB 3 08 52 43.0 -50 20 51. 1950 18.133.025 08 54 17.93 -50 32 19.5 +269-03.1 PB 3 08 52 43.9 -50 20 52. 1950 IRAS08527-5020 08 54 18.84 -50 32 20.5 +253+10.1 K 1-2 08 55 38.6 -28 45 57. 1950 70.002.006 08 57 45.92 -28 57 35.5 +253+10.1 K 1-2 08 57 45.30 -28 57 36.0 2000 70.002.006 rad 08 57 45.30 -28 57 36.0 +253+10.1 K 1-2 08 55 38.7 -28 46 00. 1950 Ko,Ku (1999) 08 57 46.02 -28 57 38.5 +253+10.1 K 1-2 08 55 39.7 -28 46 00. 1950 IRAS08556-2846 08 57 47.03 -28 57 38.6 +270-02.1 PN 0857-5011 08 57 26.55 -50 11 56.2 1950 58.134.001 08 59 02.94 -50 23 39.6 +270-02.1 PN 0857-5011 08 57 26.6 -50 11 58. 1950 Ko,Ku (1999) 08 59 02.99 -50 23 41.4 +270-02.1 PN 0857-5011 08 57 26.5 -50 11 52. 1950 IRAS08574-5011 08 59 02.90 -50 23 35.4 +285-14.1 IC 2448 09 06 37.7 -69 44 24. 1950 08.114.108 09 07 06.62 -69 56 33.8 +285-14.1 IC 2448 09 06 37.3 -69 44 07. 1950 18.133.025 09 07 06.25 -69 56 16.8 +285-14.1 IC 2448 09 06 37.7 -69 44 20. 1950 IRAS09066-6944 09 07 06.63 -69 56 29.8 +273-03.1 He 2-18 09 07 08.0 -53 06 55. 1950 18.133.025 09 08 40.75 -53 19 07.9 +273-03.1 He 2-18 09 07 07.6 -53 07 02. 1950 IRAS09071-5307 09 08 40.34 -53 19 14.9 +265+04.1 NGC 2792 09 10 33.7 -42 13 08. 1950 09.133.025 09 12 26.62 -42 25 31.5 +265+04.1 NGC 2792 09 10 33.8 -42 13 19. 1950 Ko,Ku (1999) 09 12 26.72 -42 25 42.5 +265+04.1 NGC 2792 09 10 34.1 -42 13 15. 1950 IRAS09105-4213 09 12 27.02 -42 25 38.5 +275-04.2 He 2-21 09 12 22.9 -55 15 53. 1950 18.133.025 09 13 52.25 -55 28 21.3 +275-04.2 He 2-21 09 12 23.6 -55 15 50. 1950 Ko,Ku (1999) 09 13 52.95 -55 28 18.3 +275-04.2 He 2-21 09 12 22.7 -55 15 37. 1950 IRAS09123-5515 09 13 52.06 -55 28 05.3 +275-04.1 PB 4 09 13 36.5 -54 40 07. 1950 18.133.025 09 15 07.64 -54 52 38.9 +275-04.1 PB 4 09 13 36.3 -54 40 08. 1950 IRAS09136-5440 09 15 07.44 -54 52 39.9 +261+08.1 NGC 2818 09 14 00.6 -36 25 16. 1950 08.114.108 09 16 01.71 -36 37 49.7 +261+08.1 NGC 2818 09 13 59.4 -36 24 58. 1950 09.133.025 09 16 00.51 -36 37 31.6 +261+08.1 NGC 2818 09 14 00.4 -36 25 03. 1950 70.002.006 09 16 01.51 -36 37 36.7 +261+08.1 NGC 2818 09 16 01.71 -36 37 38.3 2000 70.002.006 rad 09 16 01.71 -36 37 38.3 +261+08.1 NGC 2818 09 14 00.4 -36 25 03. 1950 IRAS09140-3625 09 16 01.51 -36 37 36.7 +268+02.1 PB 5 09 14 21.0 -45 16 12. 1950 09.133.025 09 16 10.16 -45 28 46.4 +268+02.1 PB 5 09 14 20.6 -45 16 09. 1950 IRAS09143-4516 09 16 09.76 -45 28 43.4 +275-03.1 He 2-25 09 16 28.8 -54 26 49. 1950 08.114.165 09 18 01.34 -54 39 29.1 +275-03.1 He 2-25 09 16 28.5 -54 26 44. 1950 IRAS09164-5426 09 18 01.04 -54 39 24.1 +278-06.1 He 2-26 09 18 06.0 -58 59 18. 1950 08.114.108 09 19 27.52 -59 12 02.5 +278-06.1 He 2-26 09 18 06.4 -58 59 23. 1950 18.133.025 09 19 27.92 -59 12 07.5 +278-06.1 He 2-26 09 18 06.4 -58 59 14. 1950 IRAS09181-5859 09 19 27.93 -59 11 58.5 +278-05.1 NGC 2867 09 20 00.6 -58 05 52. 1950 08.114.108 09 21 25.30 -58 18 42.0 +278-05.1 NGC 2867 09 20 00.8 -58 05 57. 1950 18.133.025 09 21 25.50 -58 18 47.0 +278-05.1 NGC 2867 09 20 00.9 -58 05 58. 1950 30.002.012 09 21 25.60 -58 18 48.0 +278-05.1 NGC 2867 09 20 00.8 -58 05 46. 1950 IRAS09200-5805 09 21 25.51 -58 18 36.0 +275-02.1 He 2-28 09 20 31.5 -53 56 55. 1950 18.133.025 09 22 06.40 -54 09 46.6 +275-02.1 He 2-28 09 20 32.0 -53 56 48. 1950 Ko,Ku (1999) 09 22 06.91 -54 09 39.6 +275-02.1 He 2-28 09 20 31.94 -53 56 47.7 1950 GSC 8584-00735 09 22 06.85 -54 09 39.3 +275-02.1 He 2-28 09 20 32.6 -53 56 51. 1950 IRAS09205-5356 09 22 07.51 -54 09 42.7 +275-02.2 He 2-29 09 23 10.0 -54 23 21. 1950 18.133.025 09 24 44.77 -54 36 19.9 +275-02.2 He 2-29 09 23 11.0 -54 23 17. 1950 Ko,Ku (1999) 09 24 45.78 -54 36 16.0 +275-02.2 He 2-29 09 23 11.0 -54 23 17. 1950 IRAS09231-5423 09 24 45.78 -54 36 16.0 +277-03.1 NGC 2899 09 25 31.3 -55 53 13. 1950 18.133.025 09 27 03.47 -56 06 18.3 +277-03.1 NGC 2899 09 25 30.5 -55 53 11. 1950 IRAS09255-5553 09 27 02.67 -56 06 16.3 +275-01.1 Pe 2-4 09 29 09.5 -52 56 42. 1950 Wr (1966) 09 30 49.14 -53 09 57.3 +275-01.1 Pe 2-4 09 29 08.8 -52 56 43. 1950 66.134.033 09 30 48.44 -53 09 58.2 +275-01.1 Pe 2-4 09 29 09.2 -52 56 49. 1950 IRAS09291-5256 09 30 48.84 -53 10 04.3 +278-04.1 He 2-32 09 29 24.5 -57 23 34. 1950 Wr (1966) * 09 30 54.43 -57 36 49.7 +278-04.1 He 2-32 09 29 26. -57 23 42. 1950 31.002.098 09 30 55.93 -57 36 57.8 +278-04.1 He 2-32 09 29 26.7 -57 23 29. 1950 IRAS09294-5723 09 30 56.65 -57 36 44.8 +277-03.2 * VBRC 2 09 29 53.9 -56 04 24. 1950 Wr (1966) * 09 31 27.14 -56 17 41.1 +277-03.2 * VBRC 2 09 29 47.5 -56 04 24. 1950 Ko,Ku (1999) 09 31 20.70 -56 17 40.8 +275-01.2 NeVe 3-1 09 34 04.6 -53 12 24. 2000 69.134.051 * 09 34 04.6 -53 12 24. +275-01.2 NeVe 3-1 09 32 20.6 -52 58 37. 1950 Ko,Ku (1999) 09 34 01.16 -53 12 00.7 +277-01.1 PN 0936-5413 09 36 12.34 -54 13 35.2 1950 58.134.001 09 37 51.68 -54 27 08.9 +277-01.1 PN 0936-5413 09 36 12.6 -54 13 36. 1950 Ko,Ku (1999) 09 37 51.94 -54 27 09.7 +277-01.1 PN 0936-5413 09 36 12.4 -54 13 31. 1950 IRAS09362-5413 09 37 51.74 -54 27 04.7 +238+34.1 A 33 09 36 37.3 -02 34 54. 1950 02.133.027 * 09 39 09.22 -02 48 29.7 +238+34.1 A 33 09 36 38.6 -02 35 05. 1950 09.133.025 09 39 10.51 -02 48 40.7 +238+34.1 A 33 09 36 37.1 -02 34 57. 1950 34.134.010 09 39 09.01 -02 48 32.6 +238+34.1 A 33 09 36 37.2 -02 35 00. 1950 41.002.074 09 39 09.11 -02 48 35.6 +238+34.1 A 33 09 36 37.0 -02 35 30. 1950 50.134.178 09 39 08.91 -02 49 05.6 +238+34.1 A 33 09 36 37.2 -02 34 56. 1950 70.002.006 09 39 09.12 -02 48 31.6 +238+34.1 A 33 09 36 37.26 -02 34 55.6 1950 GSC 4897-00194 09 39 09.18 -02 48 31.2 +281-05.1 IC 2501 09 37 20.8 -59 51 54. 1950 08.114.108 09 38 47.41 -60 05 30.3 +281-05.1 IC 2501 09 37 20.9 -59 51 52. 1950 18.133.025 09 38 47.51 -60 05 28.3 +281-05.1 IC 2501 09 37 20.7 -59 51 55. 1950 IRAS09373-5951 09 38 47.31 -60 05 31.3 +279-03.2 VBRC 3 09 39 18.3 -56 44 22. 1950 Wr (1966) * 09 40 53.38 -56 58 03.4 +279-03.2 VBRC 3 09 39 17.7 -56 44 18. 1950 Ko,Ku (1999) 09 40 52.78 -56 57 59.4 +274+02.1 * He 2-34 09 39 24.7 -49 08 58. 1950 Wr (1966) 09 41 14.02 -49 22 40.0 +274+02.1 * He 2-34 09 39 24.7 -49 09 04. 1950 10.114.152 09 41 14.02 -49 22 46.0 +274+02.1 * He 2-34 09 39 24.8 -49 09 08. 1950 Ko,Ku (1999) 09 41 14.12 -49 22 50.0 +274+02.1 * He 2-34 09 39 24.8 -49 09 03. 1950 IRAS09394-4909 09 41 14.12 -49 22 45.0 +274+02.2 He 2-35 09 39 47.9 -49 44 02. 1950 09.133.025 * 09 41 36.40 -49 57 44.9 +274+02.2 He 2-35 09 39 49.1 -49 44 18. 1950 Ko,Ku (1999) 09 41 37.60 -49 58 01.0 +274+02.2 He 2-35 09 39 48.96 -49 44 17.1 1950 GSC 8176-01908 09 41 37.46 -49 58 00.1 +274+02.2 He 2-35 09 39 49.2 -49 44 15. 1950 IRAS09398-4944 09 41 37.71 -49 57 58.0 +279-03.1 He 2-36 09 41 50.7 -57 03 12. 1950 18.133.025 09 43 26.01 -57 16 59.8 +279-03.1 He 2-36 09 43 25.65 -57 16 56.1 2000 AC 4092204 09 43 25.65 -57 16 56.1 +279-03.1 He 2-36 09 43 25.63 -57 16 55.7 2000 HIP 047691 09 43 25.63 -57 16 55.7 +279-03.1 He 2-36 09 41 50.3 -57 03 08. 1950 LSS 1340 09 43 25.61 -57 16 55.7 +279-03.1 He 2-36 09 41 49.9 -57 03 03. 1950 IRAS09418-5703 09 43 25.22 -57 16 50.7 +248+29.1 A 34 09 43 10.0 -12 56 22. 1950 34.134.010 09 45 35.10 -13 10 13.9 +248+29.1 A 34 09 43 09.9 -12 56 18. 1950 70.002.006 09 45 35.00 -13 10 09.8 +248+29.1 A 34 09 43 10.2 -12 56 24. 1950 Ko,Ku (1999) 09 45 35.30 -13 10 15.9 +274+03.1 He 2-37 09 45 32.6 -48 44 22. 1950 18.133.025 09 47 24.26 -48 58 19.1 +274+03.1 He 2-37 09 45 33.2 -48 44 20. 1950 Ko,Ku (1999) 09 47 24.86 -48 58 17.1 +274+03.1 He 2-37 09 45 33.1 -48 44 15. 1950 IRAS09455-4844 09 47 24.76 -48 58 12.1 +221+46.1 * BN 0950+13 09 50 16.6 +13 58 43. 1950 41.002.074 09 52 59.10 +13 44 34.0 +221+46.1 * BN 0950+13 09 50 16.6 +13 58 42. 1950 70.002.006 09 52 59.10 +13 44 33.0 +221+46.1 * BN 0950+13 09 50 16.6 +13 58 43. 1950 Ko,Ku (1999) 09 52 59.10 +13 44 34.0 +273+06.1 * HBDS 1 09 50 47.8 -46 02 41. 1950 Ko,Ku (1999) 09 52 44.60 -46 16 50.6 +273+06.1 * HBDS 1 09 52 44.59 -46 16 48.9 2000 AC 3627191 09 52 44.59 -46 16 48.9 +273+06.1 * HBDS 1 09 50 47.8 -46 02 43. 1950 LSS 1362 09 52 44.60 -46 16 52.6 +273+06.1 * HBDS 1 09 50 47.75 -46 02 38.3 1950 GSC 8181-02925 09 52 44.55 -46 16 47.9 +279-00.1 * IRAS09517-5438 09 51 43.4 -54 38 30. 1950 Ko,Ku (1999) 09 53 27.22 -54 52 41.5 +279-00.1 * IRAS09517-5438 09 51 43.4 -54 38 25. 1950 IRAS09517-5438 09 53 27.22 -54 52 36.5 +280-02.1 * He 2-38 09 53 04.3 -57 04 40. 1950 Wr (1966) 09 54 43.83 -57 18 54.5 +280-02.1 * He 2-38 09 53 03.7 -57 04 39. 1950 08.114.165 09 54 43.22 -57 18 53.5 +280-02.1 * He 2-38 09 53 03.7 -57 04 34. 1950 IRAS09530-5704 09 54 43.23 -57 18 48.5 +277+03.1 * MmWe 2-2 09 56 18.6 -50 25 09. 1950 51.134.007 * 09 58 10.91 -50 39 31.1 +277+03.1 * MmWe 2-2 09 56 18.1 -50 25 12. 1950 Ko,Ku (1999) 09 58 10.41 -50 39 34.1 +284-05.1 * SP 1-1 10 00 30.5 -61 42 45. 1950 Wr (1966) 10 02 02.44 -61 57 16.0 +284-05.1 * SP 1-1 10 00 30.6 -61 42 46. 1950 11.133.012 10 02 02.54 -61 57 17.0 +284-05.1 * SP 1-1 10 00 30.8 -61 42 47. 1950 Ko,Ku (1999) 10 02 02.74 -61 57 18.0 +283-04.1 He 2-39 10 02 14. -60 29 12. 1950 31.002.098 10 03 49.78 -60 43 46.7 +283-04.1 He 2-39 10 02 13.5 -60 29 14. 1950 Ko,Ku (1999) 10 03 49.28 -60 43 48.7 +283-04.1 He 2-39 10 02 13.9 -60 29 11. 1950 IRAS10022-6029 10 03 49.68 -60 43 45.7 +274+09.1 Lo 4 10 03 44. -44 07 06. 1950 27.135.042 10 05 46.38 -44 21 44.3 +274+09.1 Lo 4 10 03 43.4 -44 06 57. 1950 Ko,Ku (1999) 10 05 45.78 -44 21 35.3 +274+09.1 Lo 4 10 03 43.0 -44 06 52. 1950 IRAS10037-4406 10 05 45.38 -44 21 30.3 +272+12.1 NGC 3132 10 04 54.8 -40 12 00. 1950 08.114.108 * 10 07 01.47 -40 26 40.9 +272+12.1 NGC 3132 10 04 55.1 -40 11 29. 1950 09.133.025 10 07 01.78 -40 26 09.9 +272+12.1 NGC 3132 10 04 54.83 -40 11 30.6 1950 GSC 7711-00963 10 07 01.51 -40 26 11.5 +272+12.1 NGC 3132 10 04 54.6 -40 11 28. 1950 IRAS10049-4011 10 07 01.28 -40 26 08.9 +286-06.2 WRA 17-40 10 05 27.8 -64 07 05. 1950 Wr (1966) * 10 06 55.56 -64 21 46.4 +286-06.2 WRA 17-40 10 05 33. -64 07 06. 1950 31.002.098 10 07 00.80 -64 21 47.6 +286-06.2 WRA 17-40 10 05 32.0 -64 07 10. 1950 Ko,Ku (1999) 10 06 59.79 -64 21 51.6 +286-06.2 WRA 17-40 10 05 32.8 -64 07 06. 1950 IRAS10055-6407 10 07 00.60 -64 21 47.6 +286-06.1 He 2-41 10 05 54.5 -63 39 49. 1950 Wr (1966) 10 07 23.81 -63 54 31.4 +286-06.1 He 2-41 10 05 54.0 -63 39 50. 1950 18.133.025 10 07 23.31 -63 54 32.4 +286-06.1 He 2-41 10 05 54.7 -63 39 48. 1950 IRAS10059-6339 10 07 24.02 -63 54 30.4 +285-05.1 IC 2553 10 07 47.9 -62 21 55. 1950 18.133.025 10 09 21.69 -62 36 41.4 +285-05.1 IC 2553 10 07 47.4 -62 22 04. 1950 Ko,Ku (1999) 10 09 21.18 -62 36 50.3 +285-05.1 IC 2553 10 07 47.2 -62 22 01. 1950 IRAS10077-6222 10 09 20.98 -62 36 47.3 +280+01.1 KLSS 1-12 10 08 42.3 -53 41 04. 1950 63.134.060 * 10 10 33.74 -53 55 52.5 +280+01.1 KLSS 1-12 10 10 33.7 -53 55 53. 2000 We (1996) 10 10 33.7 -53 55 53. +280+01.1 KLSS 1-12 10 08 43.2 -53 41 25. 1950 Ko,Ku (1999) 10 10 34.64 -53 56 13.5 +296-20.1 NGC 3195 10 09 58. -80 36 42. 1950 31.002.098 10 09 22.01 -80 51 30.6 +296-20.1 NGC 3195 10 09 57.4 -80 36 44. 1950 Ko,Ku (1999) 10 09 21.38 -80 51 32.6 +296-20.1 NGC 3195 10 09 57.4 -80 36 39. 1950 IRAS10099-8036 10 09 21.41 -80 51 27.6 +280+02.1 SM 1 10 10 04.0 -52 23 27. 1950 Ko,Ku (1999) 10 11 57.85 -52 38 18.3 +280+02.1 SM 1 10 10 03.95 -52 23 26.2 1950 GSC 8599-01094 10 11 57.80 -52 38 17.4 +280+02.1 SM 1 10 10 03.7 -52 23 25. 1950 IRAS10100-5223 10 11 57.55 -52 38 16.2 +278+05.1 PB 6 10 11 18.9 -50 05 09. 1950 Wr (1966) 10 13 16.31 -50 20 02.8 +278+05.1 PB 6 10 11 18.8 -50 05 07. 1950 18.133.025 10 13 16.21 -50 20 00.8 +278+05.1 PB 6 10 11 18.4 -50 05 04. 1950 IRAS10113-5005 10 13 15.81 -50 19 57.8 +282-00.1 * IRAS10115-5640 10 11 31.88 -56 40 37.3 1950 58.134.001 10 13 19.43 -56 55 31.4 +282-00.1 * IRAS10115-5640 10 11 32.4 -56 40 39. 1950 Ko,Ku (1999) 10 13 19.95 -56 55 33.1 +282-00.1 * IRAS10115-5640 10 11 31.7 -56 40 33. 1950 IRAS10115-5640 10 13 19.25 -56 55 27.1 +283-01.2 MmWe 1-2 10 12 38.5 -57 56 54. 1950 51.134.007 10 14 24.19 -58 11 50.2 +283-01.2 MmWe 1-2 10 12 38.6 -57 56 57. 1950 Ko,Ku (1999) 10 14 24.29 -58 11 53.2 +283-01.1 Hf 4 10 13 50.1 -58 36 14. 1950 Wr (1966) 10 15 35.05 -58 51 12.6 +283-01.1 Hf 4 10 13 50. -58 36 12. 1950 31.002.098 10 15 34.95 -58 51 10.5 +283-01.1 Hf 4 10 13 50.7 -58 36 13. 1950 IRAS10138-5836 10 15 35.65 -58 51 11.6 +286-04.1 NGC 3211 10 16 12.1 -62 25 13. 1950 Wr (1966) 10 17 49.97 -62 40 16.0 +286-04.1 NGC 3211 10 16 12.5 -62 25 06. 1950 18.133.025 10 17 50.38 -62 40 09.0 +286-04.1 NGC 3211 10 16 12.6 -62 25 10. 1950 IRAS10162-6225 10 17 50.47 -62 40 13.0 +285-02.2 * He 3-401 10 17 48.4 -59 58 17. 1950 Wr (1966) 10 19 32.42 -60 13 23.1 +285-02.2 * He 3-401 10 19 32.52 -60 13 29.3 2000 71.134.039 10 19 32.52 -60 13 29.3 +285-02.2 * He 3-401 10 17 48.7 -59 58 24. 1950 Ko,Ku (1999) 10 19 32.72 -60 13 30.1 +285-02.2 * He 3-401 10 17 48.6 -59 58 23. 1950 IRAS10178-5958 10 19 32.62 -60 13 29.1 +285-02.1 He 2-47 10 21 24.0 -60 17 22. 1950 18.133.025 10 23 09.05 -60 32 34.7 +285-02.1 He 2-47 10 21 24.4 -60 17 30. 1950 52.114.020 10 23 09.45 -60 32 42.8 +285-02.1 He 2-47 10 21 24.5 -60 17 30. 1950 Ko,Ku (1999) 10 23 09.55 -60 32 42.8 +285-02.1 He 2-47 10 21 24.12 -60 17 29.4 1950 GSC 8956-01671 10 23 09.17 -60 32 42.1 +285-02.1 He 2-47 10 21 24.4 -60 17 28. 1950 IRAS10214-6017 10 23 09.45 -60 32 40.8 +261+32.1 NGC 3242 10 18 59.51 -18 02 05.6 1880 CGPN/Wn 09 10 24 46.27 -18 38 34.3 +261+32.1 NGC 3242 10 19 57.01 -18 08 05.9 1900 CGPN/Po 10 10 24 46.03 -18 38 31.5 +261+32.1 NGC 3242 10 22 21.6 -18 23 19. 1950 CGPN/Koal 65 10 24 46.21 -18 38 33.9 +261+32.1 NGC 3242 10 22 21.3 -18 23 23. 1950 09.133.025 10 24 45.90 -18 38 37.9 +261+32.1 NGC 3242 10 22 21.7 -18 23 11. 1950 11.133.008 10 24 46.31 -18 38 25.9 +261+32.1 NGC 3242 10 22 21.6 -18 23 19. 1950 70.002.006 10 24 46.21 -18 38 33.9 +261+32.1 NGC 3242 10 24 46.09 -18 38 32.3 2000 70.002.006 rad 10 24 46.09 -18 38 32.3 +261+32.1 NGC 3242 10 24 46.11 -18 38 32.6 2000 PPM 222919 10 24 46.11 -18 38 32.6 +261+32.1 NGC 3242 10 22 21.50 -18 23 24.3 1950 SAO 155965 10 24 46.10 -18 38 39.2 +261+32.1 NGC 3242 10 24 46.03 -18 38 42.8 2000 TYC 606512001 10 24 46.03 -18 38 42.8 +261+32.1 NGC 3242 10 22 21.6 -18 23 21. 1950 IRAS10223-1823 10 24 46.21 -18 38 35.9 +285-01.1 Pe 2-5 10 26 44.4 -58 48 03. 1950 CGPN/Koal 65 * 10 28 34.65 -59 03 25.2 +285-01.1 Pe 2-5 10 26 44.6 -58 48 02. 1950 Ko,Ku (1999) 10 28 34.86 -59 03 24.2 +282+03.1 He 2-48 10 29 33. -53 18 00. 1950 31.002.098 10 31 32.47 -53 33 27.1 +282+03.1 He 2-48 10 29 32.6 -53 18 04. 1950 Ko,Ku (1999) 10 31 32.07 -53 33 31.1 +283+02.1 My 60 10 29 36.5 -55 05 23. 1950 Wr (1966) 10 31 33.65 -55 20 50.2 +283+02.1 My 60 10 29 36.0 -55 05 27. 1950 18.133.025 10 31 33.14 -55 20 54.1 +283+02.1 My 60 10 29 37.7 -55 05 36. 1950 IRAS10296-5505 10 31 34.85 -55 21 03.2 +270+24.1 K 1-28 10 32 10.6 -28 55 44. 1950 19.135.028 10 34 30.64 -29 11 15.6 +270+24.1 K 1-28 10 32 10.7 -28 55 44. 1950 70.002.006 10 34 30.74 -29 11 15.6 +283+03.1 He 2-50 10 32 19.1 -53 25 32. 1950 Wr (1966) * 10 34 19.43 -53 41 03.6 +283+03.1 He 2-50 10 32 18.0 -53 25 27. 1950 18.133.025 10 34 18.32 -53 40 58.6 +288-05.1 He 2-51 10 34 02.7 -64 03 43. 1950 Wr (1966) 10 35 46.30 -64 19 17.2 +288-05.1 He 2-51 10 34 02.3 -64 03 37. 1950 CGPN/Ko 64c 10 35 45.90 -64 19 11.2 +288-05.1 He 2-51 10 34 02.3 -64 03 30. 1950 18.133.025 10 35 45.91 -64 19 04.2 +288-05.1 He 2-51 10 34 01.8 -64 03 46. 1950 IRAS10340-6403 10 35 45.39 -64 19 20.2 +285+01.1 He 2-52 10 36 29.7 -56 31 29. 1950 Wr (1966) * 10 38 27.66 -56 47 07.2 +285+01.1 He 2-52 10 36 34.5 -56 30 55. 1950 CGPN/Koal 65 10 38 32.51 -56 46 33.3 +285+01.1 He 2-52 10 36 29.8 -56 31 30. 1950 Ko,Ku (1999) 10 38 27.76 -56 47 08.2 +285+01.1 He 2-52 10 36 29.0 -56 31 18. 1950 IRAS10364-5631 10 38 26.96 -56 46 56.2 +285+01.2 He 2-53 10 37 34.7 -56 50 34. 1950 Wr (1966) 10 39 32.68 -57 06 13.9 +285+01.2 He 2-53 10 37 34.0 -56 50 47. 1950 CGPN/Koal 65 10 39 31.97 -57 06 26.9 +285+01.2 He 2-53 10 37 34.9 -56 50 36. 1950 Ko,Ku (1999) 10 39 32.88 -57 06 15.9 +285+01.2 He 2-53 10 37 35.4 -56 50 37. 1950 IRAS10375-5650 10 39 33.38 -57 06 16.9 +285+02.1 Pe 2-7 10 39 19.2 -55 53 34. 1950 Wr (1966) 10 41 19.16 -56 09 16.5 +285+02.1 Pe 2-7 10 39 19.7 -55 53 36. 1950 CGPN/Koal 65 10 41 19.66 -56 09 18.5 +285+02.1 Pe 2-7 10 39 19.5 -55 53 29. 1950 IRAS10393-5553 10 41 19.46 -56 09 11.5 +288-02.1 Pe 1-3 10 42 38.1 -61 23 53. 1950 CGPN/Koal 65 10 44 31.51 -61 39 40.3 +288-02.1 Pe 1-3 10 42 38.0 -61 23 47. 1950 Wr (1966) 10 44 31.41 -61 39 34.3 +288-02.1 Pe 1-3 10 42 38.1 -61 23 54. 1950 18.133.025 10 44 31.51 -61 39 41.3 +288-02.1 Pe 1-3 10 42 37.7 -61 23 52. 1950 52.114.020 10 44 31.10 -61 39 39.3 +286+02.1 He 2-55 10 46 40.7 -55 47 16. 1950 Wr (1966) 10 48 43.80 -56 03 09.0 +286+02.1 He 2-55 10 46 40. -55 47 18. 1950 31.002.098 10 48 43.09 -56 03 11.0 +286+02.1 He 2-55 10 46 40.4 -55 47 18. 1950 IRAS10466-5547 10 48 43.50 -56 03 11.0 +288-00.1 * Hf 39 10 51 59.3 -60 10 44. 1950 10.114.152 10 53 59.26 -60 26 44.0 +288-00.1 * Hf 39 10 53 59.69 -60 26 44.8 2000 AC 4155032 10 53 59.69 -60 26 44.8 +288-00.1 * Hf 39 10 51 59.75 -60 10 44.8 1950 GSC 8958-01166 10 53 59.71 -60 26 44.8 +288-00.1 * Hf 39 10 51 59.3 -60 10 44. 1950 LSS 2015 10 53 59.26 -60 26 44.0 +288-00.1 * Hf 39 10 52 00.1 -60 10 44. 1950 IRAS10520-6010 10 54 00.06 -60 26 44.0 +283+09.1 * ESO-215-04 10 52 28.7 -48 31 04. 1950 Ko,Ku (1999) 10 54 40.75 -48 47 04.7 +283+09.1 * ESO-215-04 10 52 28.7 -48 31 01. 1950 LSS 2018 10 54 40.75 -48 47 01.7 +283+09.1 * ESO-215-04 10 52 28.58 -48 31 02.6 1950 GSC 8207-02114 10 54 40.63 -48 47 03.3 +283+09.1 * ESO-215-04 10 52 28.7 -48 31 00. 1950 IRAS10524-4831 10 54 40.75 -48 47 00.7 +288+00.1 Hf 38 10 52 33.7 -58 53 44. 1950 CGPN/Koal 65 10 54 35.62 -59 09 44.7 +288+00.1 Hf 38 10 52 33.4 -58 53 47. 1950 IRAS10525-5853 10 54 35.32 -59 09 47.7 +289-01.1 He 2-57 10 54 03. -61 12 00. 1950 31.002.098 10 56 02.56 -61 28 02.5 +289-01.1 He 2-57 10 54 03.7 -61 12 07. 1950 Ko,Ku (1999) 10 56 03.27 -61 28 09.5 +288+00.2 * ESO-128-25 10 57 36. -58 45 00. 1950 31.002.098 10 59 40.45 -59 01 06.8 +288+00.2 * ESO-128-25 10 57 36.3 -58 45 05. 1950 Ko,Ku (1999) 10 59 40.76 -59 01 11.8 +288+00.2 * ESO-128-25 10 57 35.9 -58 44 58. 1950 IRAS10575-5844 10 59 40.35 -59 01 04.8 +291-04.1 IC 2621 10 58 24.8 -64 58 53. 1950 Wr (1966) 11 00 20.88 -65 15 00.7 +291-04.1 IC 2621 10 58 23.5 -64 58 47. 1950 18.133.025 11 00 19.57 -65 14 54.6 +291-04.1 IC 2621 10 58 23.8 -64 58 48. 1950 IRAS10583-6458 11 00 19.87 -65 14 55.6 +290-00.1 Hf 48 11 01 51.6 -60 19 48. 1950 Wr (1966) 11 03 56.26 -60 35 59.6 +290-00.1 Hf 48 11 01 51. -60 19 54. 1950 31.002.098 11 03 55.65 -60 36 05.6 +286+11.1 Lo 5 11 11 32. -47 49 12. 1950 19.135.001 * 11 13 50.56 -48 05 33.2 +286+11.1 Lo 5 11 11 35.7 -47 40 41. 1950 Ko,Ku (1999) 11 13 54.35 -47 57 02.2 +148+57.1 NGC 3587 11 08 59.87 +55 33 51.0 1900 CGPN/Re 15 11 14 47.46 +55 01 10.6 +148+57.1 NGC 3587 11 09 00.56 +55 33 40.2 1900 CGPN/Wz 16 11 14 48.13 +55 00 59.8 +148+57.1 NGC 3587 11 11 54.4 +55 17 31. 1950 02.133.027 11 14 47.55 +55 01 09.7 +148+57.1 NGC 3587 11 11 54.66 +55 17 29.9 1950 12.133.017 11 14 47.80 +55 01 08.6 +148+57.1 NGC 3587 11 11 53.3 +55 17 21. 1950 28.135.019 11 14 46.45 +55 00 59.7 +148+57.1 NGC 3587 11 11 54.0 +55 17 30. 1950 50.134.178 11 14 47.15 +55 01 08.7 +148+57.1 NGC 3587 11 11 54.7 +55 17 30. 1950 70.002.006 11 14 47.84 +55 01 08.7 +148+57.1 NGC 3587 11 14 47.73 +55 01 08.3 2000 70.002.006 rad 11 14 47.73 +55 01 08.3 +148+57.1 NGC 3587 11 11 55.1 +55 17 25. 1950 IRAS11119+5517 11 14 48.24 +55 01 03.7 +295-09.1 He 2-62 11 15 46.1 -70 33 00. 1950 Wr (1966) 11 17 44.07 -70 49 24.8 +295-09.1 He 2-62 11 15 45.2 -70 33 06. 1950 08.114.108 11 17 43.15 -70 49 30.7 +295-09.1 He 2-62 11 15 45.4 -70 33 11. 1950 Ko,Ku (1999) 11 17 43.35 -70 49 35.7 +295-09.1 He 2-62 11 15 45.2 -70 33 05. 1950 IRAS11157-7033 11 17 43.15 -70 49 29.7 +288+08.1 * ESO-216-02 11 15 52. -51 53 42. 1950 31.002.098 11 18 09.78 -52 10 06.9 +288+08.1 * ESO-216-02 11 15 52.0 -51 53 38. 1950 Ko,Ku (1999) 11 18 09.78 -52 10 02.9 +289+07.1 He 2-63 11 21 41.5 -52 34 43. 1950 08.114.108 11 24 01.08 -52 51 12.4 +289+07.1 He 2-63 11 21 41.56 -52 34 50.6 1950 10.113.006 11 24 01.14 -52 51 20.0 +289+07.1 He 2-63 11 21 40.8 -52 34 52. 1950 18.133.025 11 24 00.38 -52 51 21.4 +283+25.1 K 1-22 11 24 17.5 -34 05 44. 1950 34.134.010 * 11 26 44.44 -34 22 15.1 +283+25.1 K 1-22 11 24 14.3 -34 04 26. 1950 50.134.178 11 26 41.23 -34 20 57.1 +283+25.1 K 1-22 11 24 16.8 -34 05 47. 1950 70.002.006 11 26 43.73 -34 22 18.1 +283+25.1 K 1-22 11 26 43.40 -34 22 01.0 2000 70.002.006 rad 11 26 43.40 -34 22 01.0 +283+25.1 K 1-22 11 24 16.9 -34 05 41. 1950 Ko,Ku (1999) 11 26 43.83 -34 22 12.1 +291+03.1 He 2-64 11 25 05.6 -57 01 26. 1950 Wr (1966) 11 27 24.15 -57 17 57.7 +291+03.1 He 2-64 11 25 05.8 -57 01 28. 1950 Ko,Ku (1999) 11 27 24.36 -57 17 59.7 +292+01.1 NGC 3699 11 25 42.0 -59 41 00. 1950 18.133.025 11 27 59.18 -59 57 32.1 +292+01.1 NGC 3699 11 25 40.5 -59 40 59. 1950 Ko,Ku (1999) 11 27 57.67 -59 57 31.0 +292+01.1 NGC 3699 11 25 40.4 -59 40 57. 1950 IRAS11256-5940 11 27 57.57 -59 57 29.0 +290+07.1 Fg 1 11 26 14.4 -52 39 46. 1950 08.114.108 * 11 28 35.67 -52 56 18.4 +290+07.1 Fg 1 11 26 08.98 -52 41 06.6 1950 10.113.006 11 28 30.21 -52 57 38.9 +290+07.1 Fg 1 11 26 14.6 -52 39 34. 1950 18.133.025 11 28 35.88 -52 56 06.4 +290+07.1 Fg 1 11 26 14.6 -52 39 31. 1950 IRAS11262-5239 11 28 35.88 -52 56 03.4 +292+01.2 He 2-67 11 26 30.1 -59 50 09. 1950 Wr (1966) * 11 28 47.58 -60 06 41.6 +292+01.2 He 2-67 11 26 30.5 -59 50 00. 1950 18.133.025 11 28 47.98 -60 06 32.6 +292+01.2 He 2-67 11 26 30.0 -59 50 05. 1950 Ko,Ku (1999) 11 28 47.48 -60 06 37.6 +292+01.3 WRA 16-93 11 28 29.7 -59 00 30. 1950 Wr (1966) * 11 30 48.68 -59 17 03.7 +292+01.3 WRA 16-93 11 28 29.7 -59 00 33. 1950 Ko,Ku (1999) 11 30 48.68 -59 17 06.7 +292+01.3 WRA 16-93 11 28 30.2 -59 00 40. 1950 IRAS11285-5900 11 30 49.18 -59 17 13.8 +289+10.1 * Y-C 13 11 29 03.11 -49 42 04.5 1950 10.113.006 11 31 26.61 -49 58 38.6 +289+10.1 * Y-C 13 11 29 03.2 -49 42 07. 1950 Ko,Ku (1999) 11 31 26.70 -49 58 41.1 +294-04.1 He 2-68 11 29 31.8 -65 41 40. 1950 18.133.025 11 31 46.53 -65 58 14.3 +294-04.1 He 2-68 11 29 30.7 -65 41 40. 1950 52.114.020 11 31 45.42 -65 58 14.3 +294-04.1 He 2-68 11 29 30.9 -65 41 39. 1950 IRAS11295-6541 11 31 45.62 -65 58 13.3 +292+04.1 PB 8 11 30 56.2 -56 49 38. 1950 Wr (1966) 11 33 17.48 -57 06 13.1 +292+04.1 PB 8 11 30 57.5 -56 49 43. 1950 18.133.025 11 33 18.78 -57 06 18.1 +292+04.1 PB 8 11 30 56.6 -56 49 40. 1950 Ko,Ku (1999) 11 33 17.88 -57 06 15.1 +292+04.1 PB 8 11 30 56.4 -56 49 38. 1950 IRAS11309-5649 11 33 17.68 -57 06 13.1 +293+01.1 He 2-70 11 32 50.6 -60 00 34. 1950 Wr (1966) 11 35 11.17 -60 17 10.1 +293+01.1 He 2-70 11 32 52. -60 00 18. 1950 31.002.098 11 35 12.59 -60 16 54.1 +293+01.1 He 2-70 11 32 50.5 -60 00 24. 1950 IRAS11328-6000 11 35 11.07 -60 17 00.1 +296-06.1 He 2-71 11 36 55.8 -68 35 12. 1950 Wr (1966) * 11 39 13.15 -68 51 50.0 +296-06.1 He 2-71 11 36 54.1 -68 35 30. 1950 18.133.025 11 39 11.42 -68 52 08.0 +296-06.1 He 2-71 11 36 53.8 -68 35 34. 1950 52.114.020 11 39 11.12 -68 52 12.0 +296-06.1 He 2-71 11 36 54.1 -68 35 31. 1950 IRAS11369-6835 11 39 11.42 -68 52 09.0 +294-00.1 He 2-72 11 39 15. -62 12 18. 1950 31.002.098 11 41 37.88 -62 28 56.9 +294-00.1 He 2-72 11 39 14.6 -62 12 15. 1950 Ko,Ku (1999) 11 41 37.47 -62 28 53.9 +296-03.1 He 2-73 11 46 12.4 -64 51 31. 1950 Wr (1966) * 11 48 38.29 -65 08 12.0 +296-03.1 He 2-73 11 46 12.8 -64 51 53. 1950 18.133.025 11 48 38.69 -65 08 34.0 +296-03.1 He 2-73 11 46 12.5 -64 51 57. 1950 52.114.020 11 48 38.39 -65 08 38.0 +296-03.1 He 2-73 11 46 12.2 -64 51 53. 1950 IRAS11462-6451 11 48 38.08 -65 08 34.0 +294+04.1 NGC 3918 11 47 50.1 -56 54 10. 1950 18.133.025 11 50 18.94 -57 10 51.4 +294+04.1 NGC 3918 11 50 18.07 -57 10 54.3 2000 TYC 863923151 11 50 18.07 -57 10 54.3 +294+04.1 NGC 3918 11 47 48.4 -56 54 12. 1950 IRAS11478-5654 11 50 17.23 -57 10 53.4 +291+19.1 ESO-320-28 11 49 58. -42 00 54. 1950 31.002.098 11 52 29.44 -42 17 35.7 +291+19.1 ESO-320-28 11 49 57.8 -42 00 57. 1950 Ko,Ku (1999) 11 52 29.24 -42 17 38.7 +291+19.1 ESO-320-28 11 49 57.7 -42 00 56. 1950 IRAS11499-4200 11 52 29.14 -42 17 37.7 +293+10.1 BLDZ 1 11 50 36. -50 34 48. 1950 31.002.098 11 53 06.85 -50 51 29.9 +293+10.1 BLDZ 1 11 50 35.9 -50 34 17. 1950 Ko,Ku (1999) 11 53 06.75 -50 50 58.9 +293+10.1 BLDZ 1 11 50 37.8 -50 34 24. 1950 IRAS11506-5034 11 53 08.66 -50 51 05.9 +290+27.1 * MmWe 2-3 11 54 10.3 -34 09 00. 1950 51.134.007 11 56 43.15 -34 25 42.2 +290+27.1 * MmWe 2-3 11 54 10.2 -34 09 02. 1950 Ko,Ku (1999) 11 56 43.05 -34 25 44.2 +144+65.1 BE UMa 11 55 09.7 +49 13 02. 1950 40.159.001 11 57 44.65 +48 56 20.1 +144+65.1 BE UMa 11 55 09.8 +49 13 01. 1950 41.002.074 11 57 44.74 +48 56 19.1 +144+65.1 BE UMa 11 55 10. +49 13 06. 1950 Li,Tw (1996) 11 57 44.94 +48 56 24.1 +144+65.1 BE UMa 11 55 10.0 +49 12 59. 1950 Ko,Ku (1999) 11 57 44.94 +48 56 17.1 +294+14.1 Lo 6 11 58 10. -47 16 30. 1950 19.135.001 * 12 00 43.58 -47 33 12.5 +294+14.1 Lo 6 11 58 09.6 -47 16 30. 1950 Ko,Ku (1999) 12 00 43.18 -47 33 12.5 +298-04.1 NGC 4071 12 01 37.5 -67 01 36. 1950 Wr (1966) 12 04 13.27 -67 18 18.5 +298-04.1 NGC 4071 12 01 39.5 -67 01 53. 1950 18.133.025 12 04 15.30 -67 18 35.5 +298-04.1 NGC 4071 12 01 38.4 -67 01 50. 1950 IRAS12016-6701 12 04 14.18 -67 18 32.5 +298-01.2 He 2-76 12 05 47.7 -63 55 28. 1950 Wr (1966) 12 08 25.71 -64 12 10.1 +298-01.2 He 2-76 12 05 48. -63 55 30. 1950 31.002.098 12 08 26.02 -64 12 12.1 +298-01.2 He 2-76 12 05 47.5 -63 55 26. 1950 IRAS12057-6355 12 08 25.51 -64 12 08.1 +297+03.1 He 2-78 12 06 32.6 -58 25 55. 1950 Wr (1966) 12 09 10.10 -58 42 36.9 +297+03.1 He 2-78 12 06 33. -58 25 54. 1950 31.002.098 12 09 10.50 -58 42 35.9 +297+03.1 He 2-78 12 06 33.0 -58 25 56. 1950 IRAS12065-5825 12 09 10.50 -58 42 37.9 +298-01.1 * He 2-79 12 12 38.7 -63 22 31. 1950 Wr (1966) 12 15 20.64 -63 39 11.7 +298-01.1 * He 2-79 12 12 38.7 -63 22 34. 1950 Ko,Ku (1999) 12 15 20.64 -63 39 14.7 +298-01.1 * He 2-79 12 12 38.7 -63 22 32. 1950 IRAS12126-6322 12 15 20.64 -63 39 12.7 +299-04.1 * HtTr 1 12 13 49.3 -66 28 58. 1950 34.134.052 * 12 16 33.29 -66 45 38.4 +299-04.1 * HtTr 1 12 13 47.4 -66 29 02. 1950 Ko,Ku (1999) 12 16 31.37 -66 45 42.4 +275+72.1 * K 2-4 12 15 45.5 +11 19 45. 1950 02.133.027 12 18 18.28 +11 03 05.6 +275+72.1 * K 2-4 12 15 45.7 +11 19 47. 1950 09.133.025 12 18 18.48 +11 03 07.6 +298+06.1 WKK 171-090 12 15 51.7 -55 37 25. 1950 66.134.033 12 18 32.82 -55 54 04.7 +298+06.1 WKK 171-090 12 15 51.8 -55 37 27. 1950 Ko,Ku (1999) 12 18 32.92 -55 54 06.7 +299-01.1 He 2-81 12 20 15.0 -63 45 09. 1950 Wr (1966) * 12 23 01.61 -64 01 47.1 +299-01.1 He 2-81 12 20 14.7 -63 45 08. 1950 Ko,Ku (1999) 12 23 01.30 -64 01 46.1 +299+00.1 * BI Cru 12 20 40.3 -62 21 39. 1950 38.002.010 12 23 26.39 -62 38 16.9 +299+00.1 * BI Cru 12 20 39.89 -62 21 38.45 1950 49.041.008 12 23 25.97 -62 38 16.4 +299+00.1 * BI Cru 12 20 39.8 -62 21 37. 1950 Ko,Ku (1999) 12 23 25.88 -62 38 14.9 +299+00.1 * BI Cru 12 20 40.04 -62 21 37.8 1950 GSC 8979-01266 12 23 26.13 -62 38 15.7 +299+00.1 * BI Cru 12 20 40.2 -62 21 39. 1950 IRAS12206-6221 12 23 26.29 -62 38 16.9 +299+02.1 He 2-82 12 21 08.4 -59 56 38. 1950 Wr (1966) 12 23 53.55 -60 13 15.7 +299+02.1 He 2-82 12 21 08.4 -59 56 34. 1950 66.134.033 12 23 53.54 -60 13 11.7 +294+43.1 NGC 4361 12 18 17.47 -18 07 13.1 1880 CGPN/Wn 09 12 24 31.30 -18 47 08.4 +294+43.1 NGC 4361 12 19 19.47 -18 13 50.0 1900 CGPN/Po 10 12 24 31.14 -18 47 05.6 +294+43.1 NGC 4361 12 21 55.0 -18 30 32. 1950 09.133.025 12 24 31.04 -18 47 09.2 +294+43.1 NGC 4361 12 21 54.7 -18 30 25. 1950 70.002.006 12 24 30.74 -18 47 02.2 +294+43.1 NGC 4361 12 24 30.76 -18 47 04.0 2000 70.002.006 rad 12 24 30.76 -18 47 04.0 +294+43.1 NGC 4361 12 21 54.8 -18 30 29. 1950 Ko,Ku (1999) 12 24 30.84 -18 47 06.2 +294+43.1 NGC 4361 12 21 56.6 -18 30 41. 1950 IRAS12219-1830 12 24 32.64 -18 47 18.2 +300-02.2 * Sa 3-20 12 25 46.7 -65 02 43. 1950 Wr (1966) 12 28 37.57 -65 19 18.5 +300-02.2 * Sa 3-20 12 25 46.2 -65 02 45. 1950 Ko,Ku (1999) 12 28 37.06 -65 19 20.5 +300+00.1 He 2-83 12 25 55.5 -61 49 03. 1950 Wr (1966) 12 28 44.18 -62 05 38.4 +300+00.1 He 2-83 12 25 55.6 -61 49 01. 1950 Ko,Ku (1999) 12 28 44.28 -62 05 36.4 +300+00.1 He 2-83 12 25 55.3 -61 48 59. 1950 IRAS12259-6148 12 28 43.98 -62 05 34.4 +300-00.1 He 2-84 12 25 56.9 -63 28 02. 1950 Wr (1966) 12 28 46.69 -63 44 37.4 +300-00.1 He 2-84 12 25 57. -63 28 00. 1950 31.002.098 12 28 46.79 -63 44 35.4 +300-01.1 He 2-85 12 27 16.7 -63 36 25. 1950 Wr (1966) 12 30 07.38 -63 52 59.7 +300-01.1 He 2-85 12 27 17. -63 36 24. 1950 31.002.098 12 30 07.68 -63 52 58.7 +300-01.1 He 2-85 12 27 16.8 -63 36 25. 1950 IRAS12272-6336 12 30 07.48 -63 52 59.7 +300-03.1 ESO-095-12 12 27 32. -65 57 48. 1950 31.002.098 12 30 24.77 -66 14 22.6 +300-03.1 ESO-095-12 12 27 31.8 -65 57 51.3 1950 37.134.041 12 30 24.57 -66 14 25.9 +300-03.1 ESO-095-12 12 27 31.3 -65 57 42. 1950 IRAS12275-6557 12 30 24.06 -66 14 16.6 +300-02.1 He 2-86 12 27 38.7 -64 35 07. 1950 Wr (1966) * 12 30 30.36 -64 51 41.5 +300-02.1 He 2-86 12 27 38.7 -64 34 35. 1950 18.133.025 12 30 30.35 -64 51 09.5 +300-02.1 He 2-86 12 27 39.0 -64 35 31. 1950 Ko,Ku (1999) 12 30 30.67 -64 52 05.5 +300-02.1 He 2-86 12 27 38.5 -64 35 29. 1950 IRAS12276-6435 12 30 30.16 -64 52 03.5 +299+18.1 K 1-23 12 28 11. -43 57 48. 1950 06.133.002 12 30 53.08 -44 14 22.2 +299+18.1 K 1-23 12 28 10.6 -43 57 44. 1950 Ko,Ku (1999) 12 30 52.68 -44 14 18.2 +298+34.1 CTIO 1230-275 12 30 34.5 -27 32 21. 1950 70.002.006 12 33 13.12 -27 48 53.7 +298+34.1 CTIO 1230-275 12 30 34.50 -27 32 22.4 1950 GSC 6690-00674 12 33 13.12 -27 48 55.1 +301-01.1 PN 1231-6401 12 31 42.38 -64 01 44.3 1950 58.134.001 12 34 36.03 -64 18 16.4 +301-01.1 PN 1231-6401 12 31 42.4 -64 01 46. 1950 Ko,Ku (1999) 12 34 36.05 -64 18 18.1 +301-01.1 PN 1231-6401 12 31 42.0 -64 01 43. 1950 IRAS12316-6401 12 34 35.65 -64 18 15.1 +123+34.1 IC 3568 12 31 46.64 +82 50 21.9 1950 CGPN/AGK2 12 33 06.78 +82 33 50.0 +123+34.1 IC 3568 12 31 47.0 +82 50 21.9 1950 11.133.011 12 33 07.12 +82 33 50.0 +123+34.1 IC 3568 12 31 46.84 +82 50 21.9 1950 12.133.017 12 33 06.97 +82 33 50.0 +123+34.1 IC 3568 12 31 46.6 +82 50 22. 1950 70.002.006 12 33 06.74 +82 33 50.1 +123+34.1 IC 3568 12 33 06.83 +82 33 50.3 2000 70.002.006 rad 12 33 06.83 +82 33 50.3 +123+34.1 IC 3568 12 31 46.67 +82 50 21.9 1950 AGK3+82 365 12 33 06.81 +82 33 50.0 +123+34.1 IC 3568 12 33 06.87 +82 33 49.0 2000 PPM 002164 12 33 06.87 +82 33 49.0 +123+34.1 IC 3568 12 33 06.92 +82 33 50.4 2000 TYC 463315231 12 33 06.92 +82 33 50.4 +123+34.1 IC 3568 12 31 44.9 +82 50 24. 1950 IRAS12317+8250 12 33 05.10 +82 33 52.1 +302-05.1 * Y-C 14 12 40 17.57 -67 56 17.6 1950 10.113.006 12 43 21.46 -68 12 43.5 +302-05.1 * Y-C 14 12 40 17.7 -67 56 16. 1950 Ko,Ku (1999) 12 43 21.59 -68 12 41.9 +302+02.1 ESO-131-15 12 42 58.7 -60 03 51. 1950 Wr (1966) 12 45 54.95 -60 20 14.7 +302+02.1 ESO-131-15 12 42 58.5 -60 03 54. 1950 Ko,Ku (1999) 12 45 54.74 -60 20 17.8 +302+02.1 ESO-131-15 12 42 57.8 -60 03 49. 1950 IRAS12429-6003 12 45 54.04 -60 20 12.8 +302-00.2 VBRC 4 12 45 29.8 -63 33 35. 1950 Wr (1966) * 12 48 31.09 -63 49 56.5 +302-00.2 VBRC 4 12 45 29.9 -63 33 41. 1950 Ko,Ku (1999) 12 48 31.19 -63 50 02.5 +303+40.1 A 35 12 51 01.3 -22 35 26. 1950 18.133.025 * 12 53 41.40 -22 51 42.3 +303+40.1 A 35 12 50 55.0 -22 36 15. 1950 50.134.178 12 53 35.09 -22 52 31.4 +303+40.1 A 35 12 50 52.8 -22 36 06.0 1950 65.134.004 12 53 32.89 -22 52 22.5 +303+40.1 A 35 12 51 01.3 -22 35 26. 1950 70.002.006 12 53 41.40 -22 51 42.3 +303+40.1 A 35 12 50 52.8 -22 36 08. 1950 72.002.012 12 53 32.89 -22 52 24.5 +303+40.1 A 35 12 53 33.15 -22 52 21.4 2000 AC 2756444 12 53 33.15 -22 52 21.4 +303+40.1 A 35 12 53 32.78 -22 52 22.4 2000 PPM 260942 12 53 32.78 -22 52 22.4 +303+40.1 A 35 12 50 52.90 -22 36 06.0 1950 SAO 181201 12 53 32.99 -22 52 22.5 +303+40.1 A 35 12 53 32.83 -22 52 22.4 2000 HIP 062905 12 53 32.83 -22 52 22.4 +303+40.1 A 35 12 53 32.83 -22 52 22.5 2000 TYC 669700771 12 53 32.83 -22 52 22.5 +339+88.1 LoTr 5 12 53 07.7 +26 09 44. 1950 70.002.006 12 55 33.80 +25 53 30.0 +339+88.1 LoTr 5 12 55 33.94 +25 53 30.3 2000 AC 0963186 12 55 33.94 +25 53 30.3 +339+88.1 LoTr 5 12 53 07.75 +26 09 43.8 1950 AGK3+26 1312 12 55 33.85 +25 53 29.8 +339+88.1 LoTr 5 12 55 33.76 +25 53 30.6 2000 HIP 063087 12 55 33.76 +25 53 30.6 +339+88.1 LoTr 5 12 55 33.79 +25 53 29.5 2000 PPM 102256 12 55 33.79 +25 53 29.5 +339+88.1 LoTr 5 12 53 07.76 +26 09 44.3 1950 SAO 82570 12 55 33.86 +25 53 30.3 +049+88.1 H 4-1 12 57 03.0 +27 54 22. 1950 CGPN/Ko 65a 12 59 27.91 +27 38 12.1 +049+88.1 H 4-1 12 57 02.7 +27 54 24. 1950 30.135.052 12 59 27.61 +27 38 14.1 +049+88.1 H 4-1 12 57 03.4 +27 54 23. 1950 41.002.074 12 59 28.31 +27 38 13.1 +049+88.1 H 4-1 12 57 03.0 +27 54 19. 1950 70.002.006 12 59 27.91 +27 38 09.1 +304+05.2 ESO-173-01 12 57 41.6 -56 37 19. 1950 Wr (1966) 13 00 41.40 -56 53 28.3 +304+05.2 ESO-173-01 12 57 41.6 -56 37 32. 1950 Ko,Ku (1999) 13 00 41.40 -56 53 41.3 +304+05.2 ESO-173-01 12 57 42.7 -56 37 42. 1950 IRAS12577-5637 13 00 42.51 -56 53 51.3 +304+05.1 He 2-88 13 02 45.5 -57 23 18. 1950 Wr (1966) 13 05 48.32 -57 39 21.4 +304+05.1 He 2-88 13 02 45. -57 23 18. 1950 31.002.098 13 05 47.82 -57 39 21.4 +304-04.1 IC 4191 13 05 28.0 -67 22 33. 1950 18.133.025 13 08 48.37 -67 38 32.9 +304-04.1 IC 4191 13 05 27.1 -67 22 39. 1950 Ko,Ku (1999) 13 08 47.46 -67 38 38.9 +304-04.1 IC 4191 13 05 27.23 -67 22 38.0 1950 GSC 9241-00477 13 08 47.59 -67 38 37.9 +304-04.1 IC 4191 13 05 27.6 -67 22 40. 1950 IRAS13054-6722 13 08 47.97 -67 38 39.9 +305+01.1 He 2-90 13 06 27.0 -61 03 32. 1950 Wr (1966) 13 09 36.30 -61 19 30.7 +305+01.1 He 2-90 13 06 27. -61 03 36. 1950 31.002.098 13 09 36.30 -61 19 34.7 +305+01.1 He 2-90 13 06 26.9 -61 03 40. 1950 IRAS13064-6103 13 09 36.20 -61 19 38.7 +305+03.1 * SP 2-22 13 11 22.4 -58 36 01. 1950 38.002.010 13 14 30.60 -58 51 53.2 +305+03.1 * SP 2-22 13 11 22.3 -58 35 59. 1950 Ko,Ku (1999) 13 14 30.50 -58 51 51.2 +305-03.1 Sa 2-91 13 16 06.5 -65 53 23. 1950 Wr (1966) 13 19 30.29 -66 09 08.3 +305-03.1 Sa 2-91 13 16 06.5 -65 53 26. 1950 Ko,Ku (1999) 13 19 30.30 -66 09 11.3 +305-03.1 Sa 2-91 13 16 03.4 -65 53 23. 1950 IRAS13160-6553 13 19 27.16 -66 09 08.4 +306-00.1 Th 2-A 13 19 13.0 -63 05 21. 1950 Wr (1966) * 13 22 32.52 -63 21 01.8 +306-00.1 Th 2-A 13 19 15.3 -63 05 15. 1950 18.133.025 13 22 34.84 -63 20 55.7 +306-00.1 Th 2-A 13 19 14.7 -63 05 19. 1950 IRAS13192-6305 13 22 34.24 -63 20 59.7 +307+05.1 Sa 2-93 13 21 11.2 -57 15 39. 1950 Wr (1966) 13 24 21.87 -57 31 16.9 +307+05.1 Sa 2-93 13 21 11.4 -57 15 44. 1950 Ko,Ku (1999) 13 24 22.08 -57 31 21.9 +307+05.1 Sa 2-93 13 21 11.37 -57 15 42.0 1950 GSC 8670-01035 13 24 22.05 -57 31 19.9 +307+05.1 Sa 2-93 13 21 12.2 -57 15 48. 1950 IRAS13212-5715 13 24 22.89 -57 31 25.8 +310+24.1 Lo 8 13 22 45.1 -37 20 40. 1950 19.135.028 13 25 37.26 -37 36 15.6 +310+24.1 Lo 8 13 22 44.1 -37 20 50. 1950 70.002.006 13 25 36.26 -37 36 25.6 +310+24.1 Lo 8 13 22 45.4 -37 20 41. 1950 Ko,Ku (1999) 13 25 37.56 -37 36 16.6 +310+24.1 Lo 8 13 22 45.40 -37 20 40.3 1950 GSC 7787-00087 13 25 37.56 -37 36 15.9 +308+07.1 MmWe 1-3 13 24 56.6 -54 26 25. 1950 51.134.007 13 28 04.98 -54 41 56.9 +308+07.1 MmWe 1-3 13 24 57. -54 26 25. 1950 68.134.063 13 28 05.39 -54 41 56.9 +308+07.1 MmWe 1-3 13 24 56.8 -54 26 28. 1950 Ko,Ku (1999) 13 28 05.19 -54 41 59.9 +308+07.1 MmWe 1-3 13 24 56.1 -54 26 23. 1950 IRAS13249-5426 13 28 04.48 -54 41 55.0 +307-01.1 * Th 2-B 13 25 15.4 -63 34 12. 1950 Wr (1966) 13 28 39.24 -63 49 43.3 +307-01.1 * Th 2-B 13 25 16. -63 33 48. 1950 31.002.098 13 28 39.83 -63 49 19.3 +307-01.1 * Th 2-B 13 25 14.4 -63 34 11. 1950 IRAS13252-6334 13 28 38.23 -63 49 42.3 +305-13.1 ESO-040-11 13 29 59. -75 31 06. 1950 31.002.098 13 34 14.93 -75 46 28.7 +305-13.1 ESO-040-11 13 29 58.3 -75 31 08. 1950 Ko,Ku (1999) 13 34 14.22 -75 46 30.7 +305-13.1 ESO-040-11 13 29 58.1 -75 31 08. 1950 IRAS13299-7531 13 34 14.02 -75 46 30.7 +307-03.1 NGC 5189 13 24 41.8 -65 19 50. 1875 CGPN/Pc 01 * 13 33 25.90 -65 58 29.4 +307-03.1 NGC 5189 13 29 59.5 -65 43 00. 1950 18.133.025 13 33 31.34 -65 58 23.3 +307-03.1 NGC 5189 13 30 10. -65 43 06. 1950 30.002.012 13 33 41.95 -65 58 29.0 +307-03.1 NGC 5189 13 30 01.1 -65 43 04. 1950 Ko,Ku (1999) 13 33 32.96 -65 58 27.2 +307-03.1 NGC 5189 13 30 01.6 -65 43 12. 1950 IRAS13300-6543 13 33 33.47 -65 58 35.2 +307-03.2 WeKG 1 13 37 32.7 -66 08 28. 2000 68.134.017 13 37 32.7 -66 08 28. +307-03.2 WeKG 1 13 33 58.0 -65 53 24. 1950 Ko,Ku (1999) 13 37 32.72 -66 08 40.3 +308+00.1 WeKG 2 13 38 41.7 -61 55 51. 2000 68.134.017 13 38 41.7 -61 55 51. +308+00.1 WeKG 2 13 35 17.8 -61 40 32. 1950 Ko,Ku (1999) 13 38 42.76 -61 55 46.1 +307-04.1 MyCn 18 13 35 54.4 -67 07 33. 1950 18.133.025 13 39 34.09 -67 22 45.8 +307-04.1 MyCn 18 13 35 55.6 -67 07 45. 1950 Ko,Ku (1999) 13 39 35.32 -67 22 57.8 +307-04.1 MyCn 18 13 35 55.5 -67 07 41. 1950 IRAS13359-6707 13 39 35.21 -67 22 53.8 +318+41.1 A 36 13 37 57.8 -19 37 33. 1950 18.133.025 * 13 40 41.64 -19 52 42.7 +318+41.1 A 36 13 37 57.4 -19 37 47. 1950 34.134.010 13 40 41.24 -19 52 56.7 +318+41.1 A 36 13 37 56.4 -19 37 00. 1950 50.134.178 13 40 40.23 -19 52 09.7 +318+41.1 A 36 13 37 57.4 -19 37 47. 1950 70.002.006 13 40 41.24 -19 52 56.7 +318+41.1 A 36 13 40 41.24 -19 52 55.7 2000 AC 2760914 13 40 41.24 -19 52 55.7 +318+41.1 A 36 13 40 41.33 -19 52 55.4 2000 HIP 066732 13 40 41.33 -19 52 55.4 +309+00.1 He 2-96 13 39 10.2 -61 07 20. 1950 Wr (1966) 13 42 35.86 -61 22 27.0 +309+00.1 He 2-96 13 39 10. -61 07 24. 1950 31.002.098 13 42 35.67 -61 22 31.0 +309+00.1 He 2-96 13 39 10.9 -61 07 23. 1950 IRAS13391-6107 13 42 36.57 -61 22 30.0 +309+01.1 VBRC 5 13 40 34. -60 34 36. 1950 31.002.098 * 13 43 59.17 -60 49 40.4 +309+01.1 VBRC 5 13 40 35.0 -60 34 43. 1950 Ko,Ku (1999) 13 44 00.18 -60 49 47.3 +307-09.1 He 2-97 13 41 22.6 -71 13 53. 1950 08.114.108 13 45 22.71 -71 28 55.3 +307-09.1 He 2-97 13 41 24.0 -71 13 47. 1950 18.133.025 13 45 24.12 -71 28 49.3 +307-09.1 He 2-97 13 41 22.7 -71 13 57. 1950 Ko,Ku (1999) 13 45 22.82 -71 28 59.3 +307-09.1 He 2-97 13 41 21.7 -71 13 47. 1950 IRAS13413-7113 13 45 21.79 -71 28 49.3 +308-03.1 * IRAS13427-6531 13 42 47.0 -65 31 27. 1950 Ko,Ku (1999) 13 46 25.84 -65 46 26.9 +308-03.1 * IRAS13427-6531 13 42 46.7 -65 31 23. 1950 IRAS13427-6531 13 46 25.54 -65 46 23.0 +312+10.1 NGC 5307 13 47 51.5 -50 57 34. 1950 08.114.108 13 51 03.31 -51 12 24.3 +312+10.1 NGC 5307 13 47 51.6 -50 57 26. 1950 18.133.025 13 51 03.41 -51 12 16.3 +312+10.1 NGC 5307 13 47 51.3 -50 57 29. 1950 IRAS13478-5057 13 51 03.11 -51 12 19.4 +309-04.1 He 2-99 13 48 46.3 -66 08 37. 1950 18.133.025 13 52 30.63 -66 23 25.0 +309-04.1 He 2-99 13 48 46.7 -66 08 40. 1950 30.002.012 13 52 31.03 -66 23 28.0 +309-04.1 He 2-99 13 48 46.4 -66 08 37. 1950 LSS 3169 13 52 30.73 -66 23 25.0 +309-04.1 He 2-99 13 48 45.5 -66 08 42. 1950 IRAS13487-6608 13 52 29.82 -66 23 30.0 +310+01.1 Vo 4 13 49 54.3 -60 19 02. 1950 Ko,Ku (1999) 13 53 23.22 -60 33 47.9 +310+01.1 Vo 4 13 49 54.4 -60 19 06. 1950 IRAS13499-6019 13 53 23.33 -60 33 51.9 +309-04.2 NGC 5315 13 50 12.7 -66 16 06. 1950 18.133.025 13 53 58.30 -66 30 51.0 +309-04.2 NGC 5315 13 50 12.3 -66 16 07. 1950 30.002.012 13 53 57.90 -66 30 52.1 +309-04.2 NGC 5315 13 53 57.05 -66 30 50.5 2000 TYC 901610381 13 53 57.05 -66 30 50.5 +309-04.2 NGC 5315 13 50 11.1 -66 16 05. 1950 IRAS13501-6616 13 53 56.68 -66 30 50.1 +309-02.1 * MaC 1-2 13 50 46.4 -64 44 54. 1950 Ko,Ku (1999) 13 54 27.39 -64 59 38.0 +309-02.1 * MaC 1-2 13 50 46.8 -64 44 49. 1950 IRAS13507-6444 13 54 27.79 -64 59 32.9 +310+01.2 WeKG 3 13 54 25.6 -60 27 20. 2000 68.134.017 * 13 54 25.6 -60 27 20. +310+01.2 WeKG 3 13 50 55.6 -60 12 40. 1950 Ko,Ku (1999) 13 54 24.75 -60 27 23.8 +311+03.1 * He 2-101 13 51 31.0 -58 12 34. 1950 Wr (1966) 13 54 56.14 -58 27 16.7 +311+03.1 * He 2-101 13 51 30.5 -58 12 42. 1950 38.002.010 13 54 55.64 -58 27 24.7 +311+03.1 * He 2-101 13 51 31.1 -58 12 34. 1950 IRAS13515-5812 13 54 56.24 -58 27 16.7 +311+02.2 SuWt 2 13 52 16.0 -59 08 00. 1950 Ko,Ku (1999) 13 55 43.37 -59 22 41.1 +311+02.2 SuWt 2 13 52 15.98 -59 07 59.2 1950 GSC 8676-01161 13 55 43.35 -59 22 40.3 +311+02.1 He 2-102 13 54 46.9 -58 39 56. 1950 Wr (1966) 13 58 14.35 -58 54 31.8 +311+02.1 He 2-102 13 54 45.9 -58 39 54. 1950 18.133.025 13 58 13.34 -58 54 29.8 +311+02.1 He 2-102 13 54 46.8 -58 39 56. 1950 IRAS13547-5839 13 58 14.25 -58 54 31.8 +314+10.1 * MmWe 2-4 13 58 01.1 -50 25 44. 1950 51.134.007 14 01 15.36 -50 40 13.0 +314+10.1 * MmWe 2-4 13 58 01.1 -50 25 45. 1950 Ko,Ku (1999) 14 01 15.36 -50 40 14.0 +326+42.1 IC 972 14 01 41.8 -16 59 13. 1950 18.133.025 14 04 26.09 -17 13 34.3 +326+42.1 IC 972 14 01 41.5 -16 59 19. 1950 70.002.006 14 04 25.79 -17 13 40.3 +326+42.1 IC 972 14 04 25.58 -17 13 41.0 2000 70.002.006 rad 14 04 25.58 -17 13 41.0 +326+42.1 IC 972 14 01 41.8 -16 59 21. 1950 Ko,Ku (1999) 14 04 26.09 -17 13 42.3 +310-02.1 He 2-103 14 01 50.9 -64 26 37. 1950 18.133.025 * 14 05 36.89 -64 40 57.0 +310-02.1 He 2-103 14 01 51.1 -64 26 41. 1950 Ko,Ku (1999) 14 05 37.10 -64 41 01.0 +315+09.1 * He 2-104 14 08 33.3 -51 12 18. 1950 Wr (1966) 14 11 51.99 -51 26 23.0 +315+09.1 * He 2-104 14 08 33.3 -51 12 18. 1950 10.114.152 14 11 51.99 -51 26 23.0 +315+09.1 * He 2-104 14 08 33.5 -51 12 19. 1950 18.133.025 14 11 52.19 -51 26 24.0 +315+09.1 * He 2-104 14 11 52.03 -51 26 24.4 2000 70.134.064 14 11 52.03 -51 26 24.4 +315+09.1 * He 2-104 14 08 33.6 -51 12 19. 1950 IRAS14085-5112 14 11 52.29 -51 26 24.0 +312-02.1 * He 2-106 14 10 22.9 -63 11 42. 1950 Wr (1966) 14 14 09.20 -63 25 42.2 +312-02.1 * He 2-106 14 10 24.0 -63 11 47. 1950 18.133.025 14 14 10.32 -63 25 47.2 +312-02.1 * He 2-106 14 10 22.7 -63 11 45. 1950 38.002.010 14 14 09.00 -63 25 45.2 +312-02.1 * He 2-106 14 10 22.9 -63 11 48. 1950 IRAS14103-6311 14 14 09.21 -63 25 48.2 +308-12.1 He 2-105 14 10 43.4 -73 58 52. 1950 18.133.025 14 15 25.85 -74 12 50.3 +308-12.1 He 2-105 14 10 42.5 -73 58 50. 1950 IRAS14107-7358 14 15 24.93 -74 12 48.3 +310-05.1 LoTr 7 14 11 21. -67 18 00. 1950 28.135.026 14 15 23.08 -67 31 57.6 +310-05.1 LoTr 7 14 11 22.2 -67 18 00. 1950 Ko,Ku (1999) 14 15 24.29 -67 31 57.5 +310-05.1 LoTr 7 14 11 21.5 -67 17 52. 1950 IRAS14113-6717 14 15 23.57 -67 31 49.6 +313+01.1 * PN 1412-5947 14 12 15.94 -59 47 42.4 1950 58.134.001 14 15 53.40 -60 01 38.2 +313+01.1 * PN 1412-5947 14 12 16.2 -59 47 44. 1950 Ko,Ku (1999) 14 15 53.66 -60 01 39.8 +313+01.1 * PN 1412-5947 14 12 14.7 -59 47 31. 1950 IRAS14122-5947 14 15 52.14 -60 01 26.9 +312-00.1 * V 417 Cen 14 12 13. -61 40 00. 1950 61.117.073 * 14 15 55.54 -61 53 55.9 +312-00.1 * V 417 Cen 14 12 17.5 -61 39 56. 1950 Ko,Ku (1999) 14 16 00.07 -61 53 51.7 +312-00.1 * V 417 Cen 14 12 17.40 -61 39 54.6 1950 GSC 9009-00216 14 15 59.97 -61 53 50.3 +312-00.1 * V 417 Cen 14 12 17.0 -61 39 56. 1950 IRAS14122-6139 14 15 59.57 -61 53 51.7 +313+02.1 BeVa 1 14 16 51.8 -58 53 11. 2000 72.134.011 14 16 51.8 -58 53 11. +313+02.1 BeVa 1 14 13 17.0 -58 39 19. 1950 Ko,Ku (1999) 14 16 52.03 -58 53 12.4 +313+02.1 BeVa 1 14 13 16.3 -58 39 16. 1950 IRAS14132-5839 14 16 51.33 -58 53 09.4 +003+66.1 SkAc 1 14 13 57.5 +14 06 17. 1950 Ac,Sk (1996) 14 16 22.01 +13 52 24.2 +003+66.1 SkAc 1 14 13 57.5 +14 06 18. 1950 Ko,Ku (1999) 14 16 22.01 +13 52 25.2 +315+08.1 MmWe 1-4 14 14 08.5 -52 12 26. 1950 51.134.007 * 14 17 30.60 -52 26 17.6 +315+08.1 MmWe 1-4 14 14 08.5 -52 12 30. 1950 Ko,Ku (1999) 14 17 30.60 -52 26 21.6 +316+08.1 He 2-108 14 14 47.2 -51 56 52. 1950 Wr (1966) 14 18 09.05 -52 10 42.0 +316+08.1 He 2-108 14 14 47.5 -51 56 50. 1950 18.133.025 14 18 09.35 -52 10 40.0 +316+08.1 He 2-108 14 14 46.6 -51 56 49. 1950 IRAS14147-5156 14 18 08.45 -52 10 39.0 +312-01.1 He 2-107 14 14 55.1 -62 53 22. 1950 18.133.025 14 18 42.61 -63 07 11.2 +312-01.1 He 2-107 14 14 55.5 -62 53 19. 1950 IRAS14149-6253 14 18 43.01 -63 07 08.2 +311-06.1 * Sa 3-25 14 14 56.1 -67 15 26. 1950 Wr (1966) 14 19 00.08 -67 29 14.8 +311-06.1 * Sa 3-25 14 14 56. -67 15 24. 1950 18.133.034 14 18 59.98 -67 29 12.8 +315+05.1 He 2-109 14 17 20.0 -55 14 21. 1950 Wr (1966) 14 20 48.91 -55 28 04.6 +315+05.1 He 2-109 14 17 20. -55 14 12. 1950 31.002.098 14 20 48.91 -55 27 55.6 +314+02.1 PN 1417-5824 14 17 43.84 -58 24 41.1 1950 58.134.001 14 21 20.04 -58 38 23.5 +314+02.1 PN 1417-5824 14 17 43.9 -58 24 42. 1950 Ko,Ku (1999) 14 21 20.10 -58 38 24.4 +314+02.1 PN 1417-5824 14 17 44.0 -58 24 43. 1950 IRAS14177-5824 14 21 20.20 -58 38 25.4 +315+05.2 LoTr 8 14 18 31. -54 48 36. 1950 28.135.026 14 21 59.44 -55 02 16.6 +315+05.2 LoTr 8 14 18 31.5 -54 48 36. 1950 Ko,Ku (1999) 14 21 59.94 -55 02 16.6 +319+15.1 IC 4406 14 19 15.3 -43 55 47. 1950 08.114.108 * 14 22 26.33 -44 09 26.1 +319+15.1 IC 4406 14 19 15.5 -43 55 27. 1950 09.133.025 14 22 26.53 -44 09 06.1 +319+15.1 IC 4406 14 19 15.5 -43 55 26. 1950 54.134.043 14 22 26.53 -44 09 05.1 +319+15.1 IC 4406 14 19 15.3 -43 55 25. 1950 Ko,Ku (1999) 14 22 26.33 -44 09 04.1 +319+15.1 IC 4406 14 19 15.8 -43 55 26. 1950 IRAS14192-4355 14 22 26.83 -44 09 05.0 +315-00.1 He 2-111 14 29 31.5 -60 36 22. 1950 Wr (1966) 14 33 18.39 -60 49 33.6 +315-00.1 He 2-111 14 29 31.4 -60 36 33. 1950 18.133.025 14 33 18.30 -60 49 44.6 +315-00.1 He 2-111 14 29 32.9 -60 36 36. 1950 IRAS14295-6036 14 33 19.82 -60 49 47.6 +316+00.1 * PN 1434-5858 14 34 35.93 -58 58 48.3 1950 58.134.001 14 38 20.11 -59 11 46.2 +316+00.1 * PN 1434-5858 14 34 36.1 -58 58 50. 1950 Ko,Ku (1999) 14 38 20.29 -59 11 47.9 +316+00.1 * PN 1434-5858 14 34 35.2 -58 58 45. 1950 IRAS14345-5858 14 38 19.38 -59 11 42.9 +319+06.1 He 2-112 14 37 01.54 -52 22 06.0 1950 10.113.006 14 40 30.88 -52 34 57.4 +319+06.1 He 2-112 14 37 00.7 -52 22 00. 1950 18.133.025 14 40 30.03 -52 34 51.5 +319+06.1 He 2-112 14 37 02.1 -52 22 07. 1950 IRAS14370-5222 14 40 31.45 -52 34 58.4 +315-01.1 LoTr 9 14 37 26. -61 07 06. 1950 28.135.026 14 41 17.73 -61 19 55.8 +315-01.1 LoTr 9 14 37 26.4 -61 07 07. 1950 Ko,Ku (1999) 14 41 18.13 -61 19 56.8 +317+03.1 VBRC 6 14 37 58.1 -56 02 30. 1950 Wr (1966) * 14 41 35.84 -56 15 18.6 +317+03.1 VBRC 6 14 37 58.5 -56 02 26. 1950 Ko,Ku (1999) 14 41 36.24 -56 15 14.6 +317+03.1 VBRC 6 14 37 58.8 -56 02 27. 1950 IRAS14379-5602 14 41 36.54 -56 15 15.6 +316-01.1 LoTr 10 14 42 28. -61 01 12. 1950 28.135.026 * 14 46 21.44 -61 13 47.5 +316-01.1 LoTr 10 14 42 26.6 -61 00 58. 1950 Ko,Ku (1999) 14 46 20.02 -61 13 33.5 +321+08.1 MmWe 1-5 14 43 08.2 -50 10 53. 1950 51.134.007 14 46 34.98 -50 23 27.2 +321+08.1 MmWe 1-5 14 43 08.5 -50 10 52. 1950 Ko,Ku (1999) 14 46 35.28 -50 23 26.1 +315-04.1 * Sa 2-108 14 48 30.4 -63 49 59. 1950 Wr (1966) 14 52 36.72 -64 02 16.5 +315-04.1 * Sa 2-108 14 48 30.1 -63 49 57. 1950 Ko,Ku (1999) 14 52 36.42 -64 02 14.6 +324+09.1 ESO-223-10 14 58 14. -48 09 12. 1950 31.002.098 15 01 40.71 -48 21 01.0 +324+09.1 ESO-223-10 14 58 13.8 -48 09 14.2 1950 37.134.041 15 01 40.51 -48 21 03.2 +324+09.1 ESO-223-10 14 58 13.8 -48 09 17. 1950 IRAS14582-4809 15 01 40.51 -48 21 06.0 +318-02.1 He 2-114 15 00 09.8 -60 41 38. 1950 Wr (1966) * 15 04 08.89 -60 53 20.2 +318-02.1 He 2-114 15 00 09.7 -60 41 39. 1950 18.133.025 15 04 08.79 -60 53 21.2 +318-02.3 * Sa 2-111 15 01 33.2 -60 37 13. 1950 Wr (1966) 15 05 32.53 -60 48 50.9 +318-02.3 * Sa 2-111 15 01 33.4 -60 37 15. 1950 Ko,Ku (1999) 15 05 32.74 -60 48 52.9 +321+02.1 He 2-115 15 01 34.2 -54 59 28. 1950 Wr (1966) 15 05 16.68 -55 11 06.3 +321+02.1 He 2-115 15 01 34.2 -54 59 34. 1950 18.133.025 15 05 16.69 -55 11 12.3 +321+02.1 He 2-115 15 05 16.45 -55 11 10.7 2000 70.134.064 15 05 16.45 -55 11 10.7 +321+02.1 He 2-115 15 01 33.1 -54 59 25. 1950 IRAS15015-5459 15 05 15.58 -55 11 03.3 +318-02.2 He 2-116 15 02 00.5 -61 09 47. 1950 Wr (1966) 15 06 01.94 -61 21 23.4 +318-02.2 He 2-116 15 01 59.4 -61 09 48. 1950 18.133.025 15 06 00.83 -61 21 24.5 +318-02.2 He 2-116 15 02 01.2 -61 09 40. 1950 IRAS15020-6109 15 06 02.64 -61 21 16.4 +321+02.2 He 2-117 15 02 14.4 -55 47 37. 1950 Wr (1966) 15 05 59.18 -55 59 13.1 +321+02.2 He 2-117 15 02 14.5 -55 47 45. 1950 18.133.025 15 05 59.29 -55 59 21.1 +321+02.2 He 2-117 15 02 14.5 -55 47 40. 1950 IRAS15022-5547 15 05 59.28 -55 59 16.1 +327+13.1 He 2-118 15 02 55.1 -42 48 25. 1950 08.114.108 15 06 13.65 -42 59 59.6 +327+13.1 He 2-118 15 02 55.2 -42 48 24. 1950 09.133.025 15 06 13.75 -42 59 58.6 +327+13.1 He 2-118 15 02 55.5 -42 48 23. 1950 IRAS15029-4248 15 06 14.06 -42 59 57.6 +318-03.1 ESO-135-04 15 04 39. -61 32 36. 1950 31.002.098 * 15 08 42.83 -61 44 04.0 +318-03.1 ESO-135-04 15 04 39.9 -61 32 46. 1950 Ko,Ku (1999) 15 08 43.74 -61 44 13.9 +339+29.1 * Y-C 17 15 05 26.18 -23 03 23.5 1950 10.113.006 * 15 08 20.76 -23 14 50.7 +339+29.1 * Y-C 17 15 05 26.4 -23 03 25. 1950 Ko,Ku (1999) 15 08 20.98 -23 14 52.1 +321+02.3 CoVi 1 15 09 24. -55 33 03. 2000 68.134.018 * 15 09 24. -55 33 03. +321+02.3 CoVi 1 15 05 40.4 -55 21 39. 1950 Ko,Ku (1999) 15 09 25.04 -55 33 04.2 +317-05.1 He 2-119 15 06 24.7 -64 29 00. 1950 Wr (1966) 15 10 41.53 -64 40 22.0 +317-05.1 He 2-119 15 06 23.1 -64 28 57. 1950 18.133.025 15 10 39.92 -64 40 19.1 +317-05.1 He 2-119 15 06 24.1 -64 29 07. 1950 IRAS15064-6429 15 10 40.94 -64 40 29.0 +321+01.1 He 2-120 15 08 10.7 -55 28 27. 1950 Wr (1966) 15 11 56.36 -55 39 44.1 +321+01.1 He 2-120 15 08 10.4 -55 28 34. 1950 18.133.025 15 11 56.07 -55 39 51.2 +321+01.1 He 2-120 15 08 11.0 -55 28 32. 1950 IRAS15081-5528 15 11 56.67 -55 39 49.1 +331+16.1 NGC 5873 15 09 38.3 -37 56 18. 1950 08.114.108 15 12 50.80 -38 07 31.2 +331+16.1 NGC 5873 15 09 38.0 -37 56 16. 1950 09.133.025 15 12 50.50 -38 07 29.3 +331+16.1 NGC 5873 15 09 38.41 -37 56 18.0 1950 37.134.035 15 12 50.91 -38 07 31.2 +331+16.1 NGC 5873 15 09 38.3 -37 56 19. 1950 70.002.006 15 12 50.80 -38 07 32.2 +331+16.1 NGC 5873 15 12 50.96 -38 07 30.4 2000 70.002.006 rad 15 12 50.96 -38 07 30.4 +331+16.1 NGC 5873 15 09 38.9 -37 56 21. 1950 IRAS15096-3756 15 12 51.40 -38 07 34.2 +327+10.1 NGC 5882 15 13 25.0 -45 27 58. 1950 08.114.108 15 16 50.03 -45 38 58.6 +327+10.1 NGC 5882 15 13 24.9 -45 27 56. 1950 18.133.025 15 16 49.93 -45 38 56.6 +327+10.1 NGC 5882 15 16 49.95 -45 38 58.4 2000 TYC 829403981 15 16 49.95 -45 38 58.4 +327+10.1 NGC 5882 15 13 25.5 -45 28 00. 1950 IRAS15134-4527 15 16 50.53 -45 39 00.6 +324+03.1 IRAS15154-5258 15 15 27.6 -52 58 56. 1950 50.134.176 * 15 19 08.81 -53 09 49.4 +324+03.1 IRAS15154-5258 15 15 27.6 -52 58 58. 1950 Ko,Ku (1999) 15 19 08.81 -53 09 51.4 +324+03.1 IRAS15154-5258 15 15 27.7 -52 58 57. 1950 IRAS15154-5258 15 19 08.91 -53 09 50.4 +313-12.1 LoTr 11 15 15 58. -72 03 18. 1950 28.135.026 * 15 21 09.87 -72 14 07.3 +313-12.1 LoTr 11 15 15 58.9 -72 02 38. 1950 Ko,Ku (1999) 15 21 10.67 -72 13 27.2 +326+07.1 NeVe 3-2 15 19 43.3 -48 59 51. 2000 69.134.051 15 19 43.3 -48 59 51. +326+07.1 NeVe 3-2 15 16 12.1 -48 49 05. 1950 Ko,Ku (1999) 15 19 44.13 -48 59 56.2 +326+07.1 NeVe 3-2 15 16 13.3 -48 49 08. 1950 IRAS15162-4849 15 19 45.34 -48 59 59.1 +323+02.1 He 2-123 15 18 34.8 -53 57 29. 1950 Wr (1966) 15 22 19.27 -54 08 11.9 +323+02.1 He 2-123 15 18 35.2 -53 57 34. 1950 18.133.025 15 22 19.68 -54 08 16.9 +323+02.1 He 2-123 15 18 36.1 -53 57 34. 1950 IRAS15186-5357 15 22 20.58 -54 08 16.9 +342+27.1 Me 2-1 15 19 23.2 -23 26 49. 1950 02.133.027 15 22 19.34 -23 37 30.4 +342+27.1 Me 2-1 15 19 23.1 -23 26 52. 1950 08.114.108 15 22 19.24 -23 37 33.5 +342+27.1 Me 2-1 15 19 23.0 -23 27 05. 1950 09.133.025 15 22 19.14 -23 37 46.5 +342+27.1 Me 2-1 15 19 23.19 -23 26 50.1 1950 10.113.006 15 22 19.33 -23 37 31.6 +342+27.1 Me 2-1 15 19 23.5 -23 26 52. 1950 33.134.004 15 22 19.64 -23 37 33.4 +342+27.1 Me 2-1 15 19 23.16 -23 26 48.2 1950 37.134.035 15 22 19.30 -23 37 29.7 +342+27.1 Me 2-1 15 19 23.16 -23 26 50.0 1950 52.002.003 15 22 19.30 -23 37 31.5 +342+27.1 Me 2-1 15 19 23.2 -23 26 50. 1950 70.002.006 15 22 19.34 -23 37 31.4 +342+27.1 Me 2-1 15 22 19.23 -23 37 32.7 2000 70.002.006 rad 15 22 19.23 -23 37 32.7 +342+27.1 Me 2-1 15 19 23.0 -23 26 50. 1950 IRAS15193-2326 15 22 19.14 -23 37 31.5 +322-00.1 Pe 2-8 15 19 48.9 -56 58 39. 1950 18.133.025 15 23 42.21 -57 09 17.5 +322-00.1 Pe 2-8 15 19 49.8 -56 58 48. 1950 Ko,Ku (1999) 15 23 43.12 -57 09 26.5 +322-00.1 Pe 2-8 15 19 50.2 -56 58 50. 1950 IRAS15198-5658 15 23 43.53 -57 09 28.5 +324+02.1 He 2-125 15 19 51.7 -53 40 46. 1950 18.133.025 15 23 35.78 -53 51 24.6 +324+02.1 He 2-125 15 19 52.4 -53 40 51. 1950 Ko,Ku (1999) 15 23 36.48 -53 51 29.6 +324+02.1 He 2-125 15 19 51.5 -53 40 45. 1950 IRAS15198-5340 15 23 35.58 -53 51 23.6 +085+52.1 * PG 1520+525 15 20 20.0 +52 32 45. 1950 41.002.074 15 21 46.92 +52 22 04.5 +085+52.1 * PG 1520+525 15 20 19.8 +52 32 44. 1950 Ko,Ku (1999) 15 21 46.73 +52 22 03.5 +325+04.2 * He 2-127 15 21 10.4 -51 39 16. 1950 Wr (1966) * 15 24 49.80 -51 49 50.3 +325+04.2 * He 2-127 15 21 10.4 -51 39 15. 1950 10.114.152 15 24 49.80 -51 49 49.3 +325+04.2 * He 2-127 15 21 18.3 -51 39 10. 1950 18.133.025 15 24 57.73 -51 49 43.9 +325+04.2 * He 2-127 15 21 10.4 -51 39 18. 1950 Ko,Ku (1999) 15 24 49.80 -51 49 52.3 +325+04.1 He 2-128 15 21 29.7 -51 09 04. 1950 Wr (1966) 15 25 08.00 -51 19 37.3 +325+04.1 He 2-128 15 21 29.7 -51 09 08. 1950 18.133.025 15 25 08.00 -51 19 41.3 +325+04.1 He 2-128 15 21 29.7 -51 09 11. 1950 IRAS15214-5109 15 25 08.00 -51 19 44.3 +325+03.1 He 2-129 15 21 50.4 -52 40 05. 1950 Wr (1966) 15 25 32.41 -52 50 37.0 +325+03.1 He 2-129 15 21 50.6 -52 40 11. 1950 18.133.025 15 25 32.62 -52 50 43.0 +325+03.1 He 2-129 15 21 50.4 -52 40 05. 1950 IRAS15218-5240 15 25 32.41 -52 50 37.0 +321-03.1 HtTr 2 15 26 10.0 -60 51 23. 1950 34.134.052 15 30 18.63 -61 01 39.4 +321-03.1 HtTr 2 15 26 10.4 -60 51 23. 1950 Ko,Ku (1999) 15 30 19.03 -61 01 39.4 +321-03.1 HtTr 2 15 26 09.9 -60 51 22. 1950 IRAS15261-6051 15 30 18.53 -61 01 38.4 +322-02.1 Mz 1 15 30 13.8 -58 58 57. 1950 18.133.025 15 34 16.71 -59 08 59.5 +322-02.1 Mz 1 15 30 14.1 -58 59 08. 1950 Ko,Ku (1999) 15 34 17.02 -59 09 10.5 +322-02.1 Mz 1 15 30 13.0 -58 59 05. 1950 IRAS15302-5859 15 34 15.91 -59 09 07.5 +315-13.1 He 2-131 15 31 54.0 -71 45 00. 1950 18.133.025 15 37 11.78 -71 54 54.5 +315-13.1 He 2-131 15 37 11.89 -71 54 53.7 2000 70.134.064 15 37 11.89 -71 54 53.7 +315-13.1 He 2-131 15 37 11.34 -71 54 52.5 2000 AC 4531700 15 37 11.34 -71 54 52.5 +315-13.1 He 2-131 15 37 11.18 -71 54 52.8 2000 PPM 372736 15 37 11.18 -71 54 52.8 +315-13.1 He 2-131 15 31 53.98 -71 44 59.1 1950 SAO 257300 15 37 11.75 -71 54 53.6 +315-13.1 He 2-131 15 37 11.22 -71 54 52.9 2000 TYC 926816761 15 37 11.22 -71 54 52.9 +315-13.1 He 2-131 15 31 53.1 -71 45 00. 1950 IRAS15318-7144 15 37 10.87 -71 54 54.5 +323-02.1 He 2-132 15 33 58.8 -58 34 42. 1950 Wr (1966) 15 38 01.36 -58 44 31.3 +323-02.1 He 2-132 15 33 59. -58 34 54. 1950 31.002.09 15 38 01.57 -58 44 43.3 +323-02.1 He 2-132 15 33 58.2 -58 34 52. 1950 IRAS15339-5834 15 38 00.77 -58 44 41.3 +326+02.1 * IRAS15359-5226 15 35 58.7 -52 26 50. 1950 Ko,Ku (1999) 15 39 43.42 -52 36 32.7 +326+02.1 * IRAS15359-5226 15 35 58.3 -52 26 52. 1950 IRAS15359-5226 15 39 43.02 -52 36 34.7 +324-01.1 He 2-133 old 15 38 00.9 -56 27 11. 1950 18.133.025 * 15 41 57.48 -56 36 46.1 +324-01.1 He 2-133 old 15 38 02.5 -56 26 52. 1950 Ko,Ku (1999) 15 41 59.07 -56 36 27.0 +324-01.1 He 2-133 old 15 38 00.9 -56 27 11. 1950 Ko,Ku (1999) 15 41 57.48 -56 36 46.1 +324-01.1 He 2-133 old 15 38 02.5 -56 26 52. 1950 IRAS15380-5626 15 41 59.07 -56 36 27.0 +330+05.1 Lo 9 15 38 39.6 -47 31 12. 1950 19.135.028 * 15 42 13.40 -47 40 45.5 +330+05.1 Lo 9 C1 15 38 39.54 -47 31 14.8 1950 Ko,Ku (1999) 15 42 13.35 -47 40 48.3 +330+05.1 Lo 9 C2 15 38 39.90 -47 31 14.9 1950 Ko,Ku (1999) 15 42 13.71 -47 40 48.3 +335+12.1 * DS 2 15 39 46.3 -39 08 45. 1950 70.002.006 15 43 04.95 -39 18 14.9 +335+12.1 * DS 2 15 39 46.6 -39 08 44. 1950 Ko,Ku (1999) 15 43 05.25 -39 18 13.9 +335+12.1 * DS 2 15 39 46.47 -39 08 45.7 1950 GSC 7837-01483 15 43 05.12 -39 18 15.6 +326+00.1 * WRA 16-185 15 41 09.4 -53 52 46. 1950 Wr (1966) 15 44 59.10 -54 02 10.0 +326+00.1 * WRA 16-185 15 41 09.6 -53 52 41. 1950 58.134.013 15 44 59.30 -54 02 05.0 +326+00.1 * WRA 16-185 15 41 10.8 -53 52 54. 1950 IRAS15411-5352 15 45 00.52 -54 02 17.9 +322-05.1 NGC 5979 15 43 26.2 -61 03 39. 1950 Wr (1966) 15 47 40.96 -61 12 54.0 +322-05.1 NGC 5979 15 43 26.0 -61 03 48. 1950 18.133.025 15 47 40.77 -61 13 03.0 +322-05.1 NGC 5979 15 43 26.0 -61 03 50. 1950 IRAS15434-6103 15 47 40.77 -61 13 05.0 +328+01.1 Lo 10 15 45 46. -52 21 24. 1950 19.135.001 * 15 49 32.57 -52 30 31.3 +328+01.1 Lo 10 15 45 42.7 -52 21 09. 1950 Ko,Ku (1999) 15 49 29.25 -52 30 16.5 +323-04.1 WKK 136-337 15 46 18.4 -59 49 44. 1950 66.134.033 15 50 28.99 -59 58 48.6 +323-04.1 WKK 136-337 15 46 18.7 -59 49 46. 1950 Ko,Ku (1999) 15 50 29.29 -59 58 50.6 +325-01.1 VB 2 15 47 21.0 -56 12 22. 1950 Ko,Ku (1999) * 15 51 19.07 -56 21 23.1 +330+04.1 * Cn 1-1 15 47 37.9 -48 35 56. 1950 Wr (1966) 15 51 15.67 -48 44 56.7 +330+04.1 * Cn 1-1 15 47 38.5 -48 36 00. 1950 18.133.025 15 51 16.28 -48 45 00.7 +330+04.1 * Cn 1-1 15 47 38.0 -48 35 54. 1950 38.002.010 15 51 15.77 -48 44 54.7 +330+04.1 * Cn 1-1 15 51 15.98 -48 44 58.4 2000 AC 3775987 15 51 15.98 -48 44 58.4 +330+04.1 * Cn 1-1 15 51 15.93 -48 44 58.5 2000 HIP 077662 15 51 15.93 -48 44 58.5 +330+04.1 * Cn 1-1 15 47 38.5 -48 36 01. 1950 IRAS15476-4836 15 51 16.28 -48 45 01.7 +330+04.2 Sa 2-125 15 47 42.8 -48 17 03. 1950 Wr (1966) 15 51 19.88 -48 26 03.4 +330+04.2 Sa 2-125 15 47 43.0 -48 17 09. 1950 Ko,Ku (1999) 15 51 20.09 -48 26 09.4 +322-06.1 He 2-136 15 47 47.9 -62 21 54. 1950 18.133.025 15 52 09.67 -62 30 52.8 +322-06.1 He 2-136 15 47 49.3 -62 21 50. 1950 Ko,Ku (1999) 15 52 11.07 -62 30 48.7 +322-06.1 He 2-136 15 47 48.8 -62 21 48. 1950 IRAS15478-6221 15 52 10.56 -62 30 46.7 +329+02.1 Sp 1 15 47 56.8 -51 22 24. 1950 18.133.025 15 51 41.26 -51 31 23.4 +329+02.1 Sp 1 15 47 56.6 -51 22 29. 1950 Ko,Ku (1999) 15 51 41.07 -51 31 28.4 +329+02.1 Sp 1 15 47 55.9 -51 22 27. 1950 IRAS15479-5122 15 51 40.36 -51 31 26.4 +326-01.2 VB 3 15 49 00.6 -56 15 33. 1950 Ko,Ku (1999) 15 52 59.23 -56 24 28.0 +335+09.1 ESO-330-02 15 49 48.2 -41 41 34. 1950 19.135.028 15 53 12.52 -41 50 27.1 +335+09.1 ESO-330-02 15 49 48.3 -41 41 33.1 1950 37.134.041 15 53 12.62 -41 50 26.2 +331+03.1 * Sa 2-128 15 49 50.3 -48 34 28. 1950 Wr (1966) 15 53 28.41 -48 43 20.5 +331+03.1 * Sa 2-128 15 49 50.7 -48 34 32. 1950 Ko,Ku (1999) 15 53 28.81 -48 43 24.5 +052+50.1 * BD+33 2642 15 50 01.9 +33 05 28. 1950 42.113.028 15 51 58.96 +32 56 33.4 +052+50.1 * BD+33 2642 15 51 59.86 +32 56 54.8 2000 51.002.047 15 51 59.86 +32 56 54.8 +052+50.1 * BD+33 2642 15 50 03.1 +33 05 49. 1950 Ko,Ku (1999) 15 52 00.15 +32 56 54.4 +052+50.1 * BD+33 2642 15 51 59.96 +32 56 53.6 2000 AC 1148381 15 51 59.96 +32 56 53.6 +052+50.1 * BD+33 2642 15 51 59.90 +32 56 54.3 2000 HIP 077716 15 51 59.90 +32 56 54.3 +329+01.1 VBRC 7 15 51 05. -51 13 42. 1950 31.002.098 * 15 54 49.70 -51 22 29.7 +329+01.1 VBRC 7 15 51 06.2 -51 13 50. 1950 Ko,Ku (1999) 15 54 50.91 -51 22 37.7 +320-09.1 He 2-138 15 51 19.2 -66 00 26. 1950 18.133.025 15 56 01.33 -66 09 11.1 +320-09.1 He 2-138 15 51 20.1 -66 00 19. 1950 20.041.026 15 56 02.22 -66 09 04.1 +320-09.1 He 2-138 15 56 01.60 -66 09 08.3 2000 70.134.064 15 56 01.60 -66 09 08.3 +320-09.1 He 2-138 15 56 01.79 -66 09 08.5 2000 AC 4537791 15 56 01.79 -66 09 08.5 +320-09.1 He 2-138 15 56 01.70 -66 09 09.2 2000 HIP 078034 15 56 01.70 -66 09 09.2 +320-09.1 He 2-138 15 51 19.5 -66 00 24. 1950 LSS 3418 15 56 01.63 -66 09 09.1 +320-09.1 He 2-138 15 56 01.68 -66 09 09.4 2000 PPM 361740 15 56 01.68 -66 09 09.4 +320-09.1 He 2-138 15 51 19.0 -66 00 23. 1950 IRAS15513-6600 15 56 01.12 -66 09 08.1 +327-01.2 He 2-140 15 54 10.4 -55 33 14. 1950 10.114.152 15 58 07.95 -55 41 49.8 +327-01.2 He 2-140 15 54 11.4 -55 33 17. 1950 18.133.025 15 58 08.96 -55 41 52.7 +327-01.2 He 2-140 15 54 11.9 -55 33 14. 1950 IRAS15541-5533 15 58 09.45 -55 41 49.7 +325-04.1 He 2-141 15 55 01.9 -58 15 14. 1950 Wr (1966) 15 59 08.78 -58 23 46.3 +325-04.1 He 2-141 15 55 02.3 -58 15 19. 1950 18.133.025 15 59 09.19 -58 23 51.3 +325-04.1 He 2-141 15 55 01.5 -58 15 18. 1950 IRAS15550-5815 15 59 08.38 -58 23 50.3 +342+15.1 * Y-C 19 15 55 37.22 -31 51 47.6 1950 10.113.006 15 58 46.81 -32 00 19.4 +342+15.1 * Y-C 19 15 55 37.3 -31 51 49. 1950 Ko,Ku (1999) 15 58 46.89 -32 00 20.8 +327-02.1 He 2-142 15 55 59.5 -55 46 57. 1950 18.133.025 15 59 58.17 -55 55 25.9 +327-02.1 He 2-142 15 59 57.61 -55 55 32.7 2000 70.134.064 15 59 57.61 -55 55 32.7 +327-02.1 He 2-142 15 55 59.1 -55 47 04. 1950 Ko,Ku (1999) 15 59 57.77 -55 55 33.0 +327-02.1 He 2-142 15 55 56.9 -55 46 57. 1950 IRAS15559-5546 15 59 55.56 -55 55 26.1 +332+03.1 * Sa 3-32 15 56 43.7 -48 07 08. 1950 Wr (1966) 16 00 21.94 -48 15 34.8 +332+03.1 * Sa 3-32 15 56 44.0 -48 07 10. 1950 Ko,Ku (1999) 16 00 22.24 -48 15 36.8 +332+03.1 * Sa 3-32 15 56 43.1 -48 07 08. 1950 IRAS15567-4807 16 00 21.34 -48 15 34.8 +327-01.1 He 2-143 15 57 02.8 -54 57 17. 1950 Wr (1966) 16 00 59.10 -55 05 42.0 +327-01.1 He 2-143 15 57 03.3 -54 57 14. 1950 18.133.025 16 00 59.60 -55 05 39.0 +327-01.1 He 2-143 15 57 02.9 -54 57 15. 1950 IRAS15570-5457 16 00 59.20 -55 05 40.0 +328-01.1 * PN 1557-5445 15 57 55.14 -54 45 18.1 1950 58.134.001 16 01 51.01 -54 53 39.8 +328-01.1 * PN 1557-5445 15 57 55.2 -54 45 20. 1950 Ko,Ku (1999) 16 01 51.07 -54 53 41.7 +328-01.1 * PN 1557-5445 15 57 55.4 -54 45 17. 1950 IRAS15579-5445 16 01 51.27 -54 53 38.7 +341+13.1 NGC 6026 15 58 07.6 -34 24 07. 1950 08.114.108 16 01 21.08 -34 32 29.2 +341+13.1 NGC 6026 15 58 07.4 -34 24 16. 1950 18.133.025 16 01 20.89 -34 32 38.2 +341+13.1 NGC 6026 15 58 07.5 -34 24 15. 1950 50.134.178 16 01 20.99 -34 32 37.2 +341+13.1 NGC 6026 15 58 07.5 -34 24 14. 1950 70.002.006 16 01 20.98 -34 32 36.2 +341+13.1 NGC 6026 16 01 21.14 -34 32 37.3 2000 70.002.006 rad 16 01 21.14 -34 32 37.3 +341+13.1 NGC 6026 15 58 07.6 -34 24 13. 1950 IRAS15581-3424 16 01 21.08 -34 32 35.2 +336+08.1 SKWL 4-10 15 58 47.9 -41 25 14. 1950 Wr (1966) 16 02 12.92 -41 33 33.3 +336+08.1 SKWL 4-10 15 58 47.9 -41 25 16. 1950 08.114.108 16 02 12.93 -41 33 35.3 +336+08.1 SKWL 4-10 15 58 47.9 -41 25 15. 1950 11.133.012 16 02 12.93 -41 33 34.3 +336+08.1 SKWL 4-10 15 58 48.2 -41 25 18. 1950 Ko,Ku (1999) 16 02 13.23 -41 33 37.3 +336+08.1 SKWL 4-10 15 58 47.4 -41 25 15. 1950 IRAS15587-4125 16 02 12.42 -41 33 34.4 +340+12.1 Lo 11 16 00 06.2 -35 52 39. 1950 19.135.028 16 03 22.12 -36 00 53.6 +340+12.1 Lo 11 16 00 06.0 -35 52 35. 1950 50.134.178 16 03 21.92 -36 00 49.7 +340+12.1 Lo 11 16 00 06.1 -35 52 39. 1950 70.002.006 16 03 22.02 -36 00 53.7 +340+12.1 Lo 11 16 03 21.70 -36 00 48.0 2000 70.002.006 rad 16 03 21.70 -36 00 48.0 +340+12.1 Lo 11 16 00 06.3 -35 52 41. 1950 Ko,Ku (1999) 16 03 22.22 -36 00 55.6 +340+12.1 Lo 11 16 00 06.0 -35 52 37. 1950 IRAS16000-3552 16 03 21.92 -36 00 51.7 +331+01.1 * PN 1600-5041 16 00 31.78 -50 41 51.0 1950 58.134.001 16 04 16.86 -50 50 03.1 +331+01.1 * PN 1600-5041 16 00 33.0 -50 41 52. 1950 Ko,Ku (1999) 16 04 18.08 -50 50 04.1 +331+01.1 * PN 1600-5041 16 00 32.1 -50 41 53. 1950 IRAS16005-5041 16 04 17.18 -50 50 05.1 +064+48.1 NGC 6058 16 00 59.97 +40 57 20.7 1900 CGPN/Kb 09 * 16 04 26.74 +40 40 59.2 +064+48.1 NGC 6058 16 02 42.97 +40 49 06.6 1950 12.133.017 16 04 26.45 +40 40 59.3 +064+48.1 NGC 6058 16 02 43.4 +40 49 04. 1950 34.134.010 16 04 26.88 +40 40 56.7 +064+48.1 NGC 6058 16 02 36.6 +40 49 06. 1950 41.002.074 16 04 20.09 +40 40 58.2 +064+48.1 NGC 6058 16 02 43.1 +40 49 06. 1950 70.002.006 16 04 26.58 +40 40 58.7 +064+48.1 NGC 6058 16 04 26.86 +40 40 57.8 2000 70.002.006 rad 16 04 26.86 +40 40 57.8 +064+48.1 NGC 6058 16 02 43.1 +40 49 06. 1950 IRAS16027+4049 16 04 26.58 +40 40 58.7 +332+01.1 * Sa 3-33 16 03 14.8 -49 18 37. 1950 Wr (1966) 16 06 56.89 -49 26 38.8 +332+01.1 * Sa 3-33 16 03 15.0 -49 18 40. 1950 38.002.010 16 06 57.10 -49 26 41.8 +332+01.1 * Sa 3-33 16 03 15.2 -49 18 42. 1950 Ko,Ku (1999) 16 06 57.30 -49 26 43.8 +340+10.1 Lo 12 16 05 08.1 -37 00 53. 1950 19.135.028 16 08 26.34 -37 08 48.3 +340+10.1 Lo 12 16 05 08.2 -37 00 52. 1950 70.002.006 16 08 26.44 -37 08 47.3 +340+10.1 Lo 12 16 05 08.1 -37 00 52. 1950 Ko,Ku (1999) 16 08 26.34 -37 08 47.3 +331+00.1 He 2-145 16 05 12.3 -50 54 06. 1950 Wr (1966) 16 08 58.70 -51 02 00.2 +331+00.1 He 2-145 16 05 13.0 -50 54 08. 1950 18.133.025 16 08 59.41 -51 02 02.1 +345+15.1 Lo 13 16 06 36.8 -30 47 16. 1950 70.002.006 16 09 45.84 -30 55 05.9 +345+15.1 Lo 13 16 06 36.9 -30 47 18. 1950 Ko,Ku (1999) 16 09 45.94 -30 55 07.9 +328-02.1 He 2-146 16 06 43.1 -54 49 44. 1950 18.133.025 16 10 40.95 -54 57 32.0 +328-02.1 He 2-146 16 06 44.4 -54 49 49. 1950 IRAS16067-5449 16 10 42.26 -54 57 36.9 +329-02.3 HeFa 1 16 08 37.7 -54 16 01. 1950 Ko,Ku (1999) * 16 12 34.18 -54 23 41.6 +025+40.1 IC 4593 16 09 23.4 +12 12 00. 1950 02.133.027 16 11 44.42 +12 04 19.5 +025+40.1 IC 4593 16 09 23.3 +12 12 08. 1950 09.133.025 16 11 44.31 +12 04 27.5 +025+40.1 IC 4593 16 09 23.5 +12 11 58. 1950 70.002.006 16 11 44.52 +12 04 17.5 +025+40.1 IC 4593 16 11 44.50 +12 04 17.2 2000 70.002.006 rad 16 11 44.50 +12 04 17.2 +025+40.1 IC 4593 16 11 44.61 +12 04 16.6 2000 AC 0554384 16 11 44.61 +12 04 16.6 +025+40.1 IC 4593 16 09 23.55 +12 11 57.7 1950 AGK3+12 1684 16 11 44.57 +12 04 17.2 +025+40.1 IC 4593 16 11 44.53 +12 04 17.2 2000 PPM 132071 16 11 44.53 +12 04 17.2 +025+40.1 IC 4593 16 11 44.55 +12 04 17.0 2000 TYC 95303811 16 11 44.55 +12 04 17.0 +025+40.1 IC 4593 16 09 22.6 +12 11 57. 1950 IRAS16093+1211 16 11 43.62 +12 04 16.4 +342+10.1 NGC 6072 16 06 25.05 -35 58 18.6 1900 CGPN/Po 10 16 12 58.86 -36 13 46.7 +342+10.1 NGC 6072 16 09 40.8 -36 06 09. 1950 CGPN/Koal 65 16 12 58.04 -36 13 46.8 +342+10.1 NGC 6072 16 09 41.6 -36 06 01. 1950 09.133.025 16 12 58.83 -36 13 38.7 +342+10.1 NGC 6072 16 09 41.0 -36 06 10. 1950 70.002.006 16 12 58.24 -36 13 47.7 +342+10.1 NGC 6072 16 12 58.35 -36 13 46.6 2000 70.002.006 rad 16 12 58.35 -36 13 46.6 +342+10.1 NGC 6072 16 09 42.0 -36 06 12. 1950 IRAS16097-3606 16 12 59.24 -36 13 49.7 +327-04.1 * He 2-147 16 09 55.5 -56 51 55. 1950 Wr (1966) 16 14 00.71 -56 59 30.3 +327-04.1 * He 2-147 16 09 55.6 -56 51 56. 1950 38.002.010 16 14 00.81 -56 59 31.3 +327-04.1 * He 2-147 16 09 55.1 -56 51 51. 1950 IRAS16099-5651 16 14 00.31 -56 59 26.3 +343+11.1 H 1-1 16 10 13.3 -34 28 03. 1950 CGPN/Koal 65 16 13 28.03 -34 35 38.7 +343+11.1 H 1-1 16 10 13.1 -34 27 58. 1950 08.114.108 16 13 27.83 -34 35 33.7 +343+11.1 H 1-1 16 10 13.3 -34 28 04. 1950 70.002.006 16 13 28.03 -34 35 39.7 +343+11.1 H 1-1 16 13 28.00 -34 35 37.0 2000 70.002.006 rad 16 13 28.00 -34 35 37.0 +343+11.1 H 1-1 16 10 13.5 -34 28 04. 1950 Ko,Ku (1999) 16 13 28.23 -34 35 39.7 +341+09.1 SB 25 16 13 38.1 -37 59 57.9 2000 71.134.030 16 13 38.1 -37 59 57.9 +341+09.1 SB 25 16 10 18.2 -37 52 26. 1950 Ko,Ku (1999) 16 13 38.39 -38 00 01.2 +329-02.1 He 2-149 16 10 26.6 -54 40 06. 1950 18.133.025 16 14 24.65 -54 47 39.5 +329-02.1 He 2-149 16 10 25.4 -54 40 04. 1950 IRAS16104-5440 16 14 23.45 -54 47 37.6 +329-02.2 Mz 2 16 10 33.5 -54 49 31. 1950 18.133.025 16 14 32.07 -54 57 04.0 +329-02.2 Mz 2 16 10 34.1 -54 49 31. 1950 Ko,Ku (1999) 16 14 32.67 -54 57 04.0 +329-02.2 Mz 2 16 10 33.5 -54 49 30. 1950 IRAS16105-5449 16 14 32.07 -54 57 03.0 +326-06.1 He 2-151 16 11 25.3 -59 46 28. 1950 Wr (1966) 16 15 41.89 -59 53 57.1 +326-06.1 He 2-151 16 11 25.4 -59 46 34. 1950 18.133.025 16 15 42.00 -59 54 03.1 +326-06.1 He 2-151 16 11 27.5 -59 46 34. 1950 IRAS16114-5946 16 15 44.11 -59 54 03.0 +330-02.2 * Sa 1-4 16 11 25.9 -53 44 04. 1950 Wr (1966) * 16 15 21.28 -53 51 33.7 +330-02.2 * Sa 1-4 16 11 25.8 -53 44 05. 1950 11.133.012 16 15 21.18 -53 51 34.7 +330-02.2 * Sa 1-4 16 11 25.2 -53 44 00. 1950 Ko,Ku (1999) 16 15 20.57 -53 51 29.8 +336+04.1 PN 1611-4504 16 11 29.13 -45 04 23.9 1950 58.134.001 16 15 02.90 -45 11 54.1 +336+04.1 PN 1611-4504 16 11 29.3 -45 04 26. 1950 Ko,Ku (1999) 16 15 03.07 -45 11 56.2 +336+04.1 PN 1611-4504 16 11 29.8 -45 04 27. 1950 IRAS16114-4504 16 15 03.57 -45 11 57.2 +333+01.1 He 2-152 16 11 37.3 -49 05 52. 1950 Wr (1966) 16 15 20.19 -49 13 21.4 +333+01.1 He 2-152 16 11 37.4 -49 05 56. 1950 18.133.025 16 15 20.29 -49 13 25.4 +333+01.1 He 2-152 16 11 37.4 -49 05 52. 1950 IRAS16116-4905 16 15 20.29 -49 13 21.4 +346+14.1 * KLSS 1-14 16 11 47.1 -30 24 13. 1950 63.134.060 * 16 14 56.01 -30 31 42.8 +346+14.1 * KLSS 1-14 16 11 47.1 -30 24 06. 1950 Ko,Ku (1999) 16 14 56.00 -30 31 35.8 +346+14.1 * KLSS 1-14 16 14 55.9 -30 31 43. 2000 We (1996) 16 14 55.9 -30 31 43. +330-02.1 He 2-153 16 13 19.3 -53 24 41. 1950 18.133.025 16 17 14.04 -53 32 03.3 +330-02.1 He 2-153 16 13 19.5 -53 24 45. 1950 Ko,Ku (1999) 16 17 14.25 -53 32 07.3 +331-01.1 Mz 3 16 13 23.3 -51 51 44. 1950 18.133.025 16 17 13.63 -51 59 06.2 +331-01.1 Mz 3 16 13 23.3 -51 51 44. 1950 50.134.212 16 17 13.63 -51 59 06.2 +331-01.1 Mz 3 16 13 23.1 -51 51 49. 1950 Ko,Ku (1999) 16 17 13.44 -51 59 11.2 +331-01.1 Mz 3 16 13 22.3 -51 51 46. 1950 IRAS16133-5151 16 17 12.63 -51 59 08.3 +327-05.1 KsRm 1 16 15 06. -57 51 10. 1950 50.134.201 * 16 19 15.82 -57 58 24.9 +327-05.1 KsRm 1 16 15 00.9 -57 51 41. 1950 Ko,Ku (1999) 16 19 10.73 -57 58 56.2 +341+08.1 * SB 27 16 19 13.9 -37 47 30.5 2000 71.134.030 16 19 13.9 -37 47 30.5 +341+08.1 * SB 27 16 15 53.8 -37 40 17. 1950 Ko,Ku (1999) 16 19 14.21 -37 47 30.3 +338+05.1 He 2-155 16 15 54.7 -42 08 23. 1950 09.133.025 16 19 23.13 -42 15 36.0 +338+05.1 He 2-155 16 15 55.0 -42 08 25. 1950 Ko,Ku (1999) 16 19 23.43 -42 15 38.0 +338+05.1 He 2-155 16 15 53.5 -42 08 25. 1950 IRAS16158-4208 16 19 21.93 -42 15 38.1 +331-02.1 He 2-157 16 18 18.2 -53 33 52. 1950 10.114.152 16 22 14.24 -53 40 54.6 +331-02.1 He 2-157 16 18 17.1 -53 33 53. 1950 18.133.025 16 22 13.14 -53 40 55.7 +331-02.1 He 2-157 16 18 19.5 -53 33 53. 1950 IRAS16183-5333 16 22 15.55 -53 40 55.6 +013+32.1 Sn 1 16 18 30.2 -00 09 13. 1950 30.135.052 16 21 04.20 -00 16 17.4 +013+32.1 Sn 1 16 18 30.8 -00 09 09. 1950 41.002.074 16 21 04.80 -00 16 13.3 +013+32.1 Sn 1 16 18 30.44 -00 09 06.6 1950 52.002.003 16 21 04.44 -00 16 11.0 +013+32.1 Sn 1 16 18 30.5 -00 09 08. 1950 70.002.006 16 21 04.50 -00 16 12.4 +013+32.1 Sn 1 16 21 04.31 -00 16 09.2 2000 70.002.006 rad 16 21 04.31 -00 16 09.2 +013+32.1 Sn 1 16 18 30.9 -00 09 05. 1950 IRAS16185-0009 16 21 04.90 -00 16 09.3 +327-06.1 He 2-158 16 19 18.7 -58 12 23. 1950 08.114.108 16 23 30.69 -58 19 21.1 +327-06.1 He 2-158 16 19 18.7 -58 12 26. 1950 18.133.025 16 23 30.69 -58 19 24.1 +327-06.1 He 2-158 16 19 18.4 -58 12 25. 1950 IRAS16193-5812 16 23 30.39 -58 19 23.1 +346+12.1 K 1-3 16 20 06.0 -31 38 00. 1950 18.133.025 16 23 17.30 -31 44 56.9 +346+12.1 K 1-3 16 20 07.4 -31 38 01. 1950 70.002.006 16 23 18.70 -31 44 57.8 +346+12.1 K 1-3 16 20 07.3 -31 38 05. 1950 Ko,Ku (1999) 16 23 18.60 -31 45 01.8 +336+01.1 Pe 1-6 16 20 16.1 -46 35 22. 1950 CGPN/Koal 65 16 23 54.30 -46 42 17.4 +336+01.1 Pe 1-6 16 20 16.5 -46 35 17. 1950 18.133.025 16 23 54.70 -46 42 12.4 +336+01.1 Pe 1-6 16 20 15.9 -46 35 22. 1950 28.113.012 16 23 54.10 -46 42 17.4 +336+01.1 Pe 1-6 16 20 16.1 -46 35 19. 1950 IRAS16202-4635 16 23 54.30 -46 42 14.4 +330-03.1 He 2-159 16 20 21.9 -54 29 09. 1950 18.133.025 16 24 21.13 -54 36 03.3 +330-03.1 He 2-159 16 20 21.1 -54 29 06. 1950 IRAS16203-5429 16 24 20.32 -54 36 00.4 +331-02.2 He 2-161 16 20 42.2 -53 15 35. 1950 Wr (1966) * 16 24 37.72 -53 22 28.1 +331-02.2 He 2-161 16 20 41.7 -53 15 41. 1950 18.133.025 16 24 37.22 -53 22 34.2 +331-03.1 He 2-162 16 23 53.0 -53 54 46. 1950 10.114.152 16 27 51.01 -54 01 26.3 +331-03.1 He 2-162 16 23 53.6 -53 54 47. 1950 18.133.025 16 27 51.61 -54 01 27.3 +331-03.1 He 2-162 16 23 52.6 -53 54 48. 1950 IRAS16238-5354 16 27 50.61 -54 01 28.4 +327-07.1 He 2-163 16 25 14.7 -59 03 17. 1950 08.114.108 * 16 29 31.19 -59 09 51.3 +327-07.1 He 2-163 16 25 13.9 -59 02 48. 1950 18.133.025 16 29 30.35 -59 09 22.3 +327-07.1 He 2-163 16 25 14.9 -59 02 51. 1950 Ko,Ku (1999) 16 29 31.36 -59 09 25.2 +327-07.1 He 2-163 16 25 13.8 -59 02 45. 1950 IRAS16252-5902 16 29 30.25 -59 09 19.3 +047+42.1 A 39 16 25 32.2 +28 01 12. 1950 34.134.010 * 16 27 33.41 +27 54 34.7 +047+42.1 A 39 16 25 32.5 +28 01 11. 1950 41.002.074 16 27 33.71 +27 54 33.7 +047+42.1 A 39 16 25 32.6 +28 01 10. 1950 70.002.006 16 27 33.82 +27 54 32.7 +047+42.1 A 39 16 25 32.7 +28 01 10. 1950 Ko,Ku (1999) 16 27 33.92 +27 54 32.7 +332-03.1 He 2-164 16 25 56.8 -53 16 32. 1950 18.133.025 16 29 53.19 -53 23 04.1 +332-03.1 He 2-164 16 25 56.9 -53 16 44. 1950 Ko,Ku (1999) 16 29 53.30 -53 23 16.1 +332-03.1 He 2-164 16 25 55.8 -53 16 41. 1950 IRAS16259-5316 16 29 52.19 -53 23 13.2 +331-03.2 He 2-165 16 26 01.2 -54 02 53. 1950 Wr (1966) 16 29 59.97 -54 09 24.7 +331-03.2 He 2-165 16 26 00.8 -54 03 05. 1950 18.133.025 16 29 59.58 -54 09 36.7 +331-03.2 He 2-165 16 26 00.4 -54 02 57. 1950 IRAS16260-5402 16 29 59.17 -54 09 28.8 +337+01.1 Pe 1-7 16 26 51.7 -45 56 12. 1950 CGPN/Koal 65 * 16 30 29.24 -46 02 41.0 +337+01.1 Pe 1-7 16 26 48.3 -45 56 20. 1950 10.114.152 16 30 25.83 -46 02 49.2 +337+01.1 Pe 1-7 16 26 48.1 -45 56 22. 1950 18.133.025 16 30 25.64 -46 02 51.3 +337+01.1 Pe 1-7 16 26 50.1 -45 55 32. 1950 28.113.012 16 30 27.61 -46 02 01.1 +337+01.1 Pe 1-7 16 26 48.4 -45 56 22. 1950 IRAS16268-4556 16 30 25.94 -46 02 51.2 +334-01.1 MmWe 1-6 16 27 18.5 -50 20 46. 1950 51.134.007 * 16 31 06.80 -50 27 12.9 +334-01.1 MmWe 1-6 16 27 18.5 -50 20 11. 1950 Ko,Ku (1999) 16 31 06.78 -50 26 37.9 +341+05.1 NGC 6153 16 28 05.0 -40 08 58. 1950 09.133.025 16 31 30.94 -40 15 22.5 +341+05.1 NGC 6153 16 28 04.8 -40 08 50. 1950 Ko,Ku (1999) 16 31 30.73 -40 15 14.5 +341+05.1 NGC 6153 16 28 05.8 -40 08 50. 1950 IRAS16280-4008 16 31 31.73 -40 15 14.4 +335-01.1 He 2-169 16 30 29.0 -49 15 06. 1950 18.133.025 * 16 34 14.87 -49 21 20.1 +335-01.1 He 2-169 16 30 27.2 -49 14 54. 1950 28.113.012 16 34 13.06 -49 21 08.2 +335-01.1 He 2-169 16 30 27.6 -49 15 00. 1950 Ko,Ku (1999) 16 34 13.46 -49 21 14.2 +346+08.1 * He 2-171 16 30 47.0 -34 58 58. 1950 Wr (1966) 16 34 04.25 -35 05 11.8 +346+08.1 * He 2-171 16 30 47.0 -34 59 10. 1950 10.114.152 16 34 04.26 -35 05 23.8 +346+08.1 * He 2-171 16 30 47.0 -34 59 12. 1950 38.002.010 16 34 04.26 -35 05 25.8 +346+08.1 * He 2-171 16 30 47.00 -34 59 14.9 1950 51.117.039 16 34 04.26 -35 05 28.7 +346+08.1 * He 2-171 16 30 46.99 -34 59 12.5 1950 51.117.039 rad 16 34 04.25 -35 05 26.3 +346+08.1 * He 2-171 16 30 47.0 -34 59 13. 1950 70.002.006 16 34 04.26 -35 05 26.8 +346+08.1 * He 2-171 16 30 47.1 -34 59 14. 1950 Ko,Ku (1999) 16 34 04.36 -35 05 27.8 +346+08.1 * He 2-171 16 30 46.9 -34 59 13. 1950 IRAS16307-3459 16 34 04.16 -35 05 26.8 +340+03.1 * MmWe 2-5 16 31 20.1 -41 57 34. 1950 51.134.007 16 34 49.79 -42 03 45.2 +340+03.1 * MmWe 2-5 16 31 20.2 -41 57 34. 1950 Ko,Ku (1999) 16 34 49.89 -42 03 45.2 +332-04.1 He 2-170 16 31 23.0 -53 43 57. 1950 08.114.108 16 35 21.59 -53 50 07.0 +332-04.1 He 2-170 16 31 22.9 -53 43 59. 1950 18.133.025 16 35 21.49 -53 50 09.0 +332-04.1 He 2-170 16 31 22.2 -53 44 02. 1950 IRAS16313-5344 16 35 20.79 -53 50 12.1 +342+05.1 * He 2-173 16 32 59.1 -39 45 23. 1950 Wr (1966) 16 36 24.76 -39 51 27.6 +342+05.1 * He 2-173 16 32 59.0 -39 45 38. 1950 10.114.152 16 36 24.66 -39 51 42.6 +342+05.1 * He 2-173 16 32 58.9 -39 45 40. 1950 38.002.010 16 36 24.56 -39 51 44.6 +342+05.1 * He 2-173 16 32 58.97 -39 45 39.8 1950 51.117.039 16 36 24.63 -39 51 44.4 +331-05.1 * PC 11 16 33 37.7 -55 36 25. 1950 08.114.108 16 37 42.74 -55 42 25.7 +331-05.1 * PC 11 16 33 37.1 -55 36 25. 1950 18.133.025 16 37 42.14 -55 42 25.7 +331-05.1 * PC 11 16 33 37.6 -55 36 26. 1950 IRAS16336-5536 16 37 42.64 -55 42 26.7 +336-01.1 * VERA 90 16 34 24.1 -48 36 46. 1950 28.113.012 16 38 08.83 -48 42 44.2 +336-01.1 * VERA 90 16 34 24.4 -48 36 47. 1950 Ko,Ku (1999) 16 38 09.13 -48 42 45.2 +333-04.1 HtTr 3 16 35 41.4 -52 43 21. 1950 34.134.052 16 39 37.51 -52 49 13.5 +333-04.1 HtTr 3 16 35 41.5 -52 43 21. 1950 Ko,Ku (1999) 16 39 37.61 -52 49 13.5 +345+06.1 He 2-175 16 36 08.2 -36 28 12. 1950 Wr (1966) 16 39 28.31 -36 34 03.9 +345+06.1 He 2-175 16 36 07.9 -36 28 25. 1950 70.002.006 16 39 28.02 -36 34 16.9 +345+06.1 He 2-175 16 39 28.07 -36 34 15.8 2000 70.002.006 rad 16 39 28.07 -36 34 15.8 +345+06.1 He 2-175 16 36 08.0 -36 28 24. 1950 IRAS16361-3628 16 39 28.12 -36 34 15.9 +339+00.1 * He 2-176 16 37 54.4 -45 07 12. 1950 Wr (1966) 16 41 31.32 -45 12 56.1 +339+00.1 * He 2-176 16 37 54.3 -45 07 22. 1950 38.002.010 16 41 31.22 -45 13 06.1 +339+00.1 * He 2-176 16 37 54.4 -45 07 20. 1950 IRAS16379-4507 16 41 31.32 -45 13 04.1 +336-02.1 * VERA 104 16 38 18.8 -49 39 21. 1950 28.113.012 * 16 42 06.66 -49 45 03.0 +336-02.1 * VERA 104 16 38 18.7 -49 39 25. 1950 Ko,Ku (1999) 16 42 06.56 -49 45 07.0 +061+41.1 DDDM 1 16 38 34.8 +38 48 05. 1950 41.002.074 16 40 18.23 +38 42 20.1 +061+41.1 DDDM 1 16 38 34.71 +38 48 05.1 1950 52.002.003 16 40 18.14 +38 42 20.1 +061+41.1 DDDM 1 16 38 34.8 +38 48 04. 1950 70.002.006 16 40 18.23 +38 42 19.1 +061+41.1 DDDM 1 16 40 18.32 +38 42 17.0 2000 70.002.006 rad 16 40 18.32 +38 42 17.0 +061+41.1 DDDM 1 16 38 34.9 +38 48 04. 1950 Ko,Ku (1999) 16 40 18.33 +38 42 19.1 +061+41.1 DDDM 1 16 38 33.8 +38 48 04. 1950 IRAS16385+3848 16 40 17.23 +38 42 19.0 +344+04.1 Vd 1-1 16 39 09.3 -38 48 54. 1950 Wr (1966) 16 42 33.75 -38 54 33.3 +344+04.1 Vd 1-1 16 39 08.9 -38 48 53. 1950 70.002.006 16 42 33.35 -38 54 32.4 +344+04.1 Vd 1-1 16 42 33.51 -38 54 34.7 2000 70.002.006 rad 16 42 33.51 -38 54 34.7 +344+04.1 Vd 1-1 16 39 08.9 -38 48 54. 1950 IRAS16391-3848 16 42 33.35 -38 54 33.4 +339+00.2 * He 2-179 16 39 37.5 -45 55 04. 1950 10.114.152 16 43 16.37 -46 00 40.9 +339+00.2 * He 2-179 16 39 37.6 -45 55 04. 1950 28.113.012 16 43 16.47 -46 00 40.9 +339+00.2 * He 2-179 16 39 37.1 -45 55 02. 1950 IRAS16396-4555 16 43 15.97 -46 00 39.0 +326-10.1 * Cn 1-2 16 39 59.8 -62 31 48. 1950 Wr (1966) * 16 44 35.04 -62 37 21.5 +326-10.1 * Cn 1-2 16 40 00.2 -62 31 41. 1950 08.114.108 16 44 35.44 -62 37 14.5 +326-10.1 * Cn 1-2 16 40 00.5 -62 31 27. 1950 18.133.025 16 44 35.72 -62 37 00.5 +326-10.1 * Cn 1-2 16 40 00.6 -62 31 41. 1950 Ko,Ku (1999) 16 44 35.84 -62 37 14.5 +326-10.1 * Cn 1-2 Allen 16 40 05.0 -62 31 33. 1950 Ko,Ku (1999) 16 44 40.24 -62 37 06.1 +326-10.1 * Cn 1-2 Allen 16 40 00.49 -62 31 40.1 1950 GSC 9042-00092 16 44 35.72 -62 37 13.6 +326-10.1 * Cn 1-2 Allen 16 40 04.82 -62 31 32.2 1950 GSC 9042-00559 16 44 40.06 -62 37 05.4 +343+03.1 SuWt 3 16 40 57. -39 57 48. 1950 27.135.042 16 44 23.71 -40 03 19.9 +343+03.1 SuWt 3 16 40 57.5 -39 57 49. 1950 Ko,Ku (1999) 16 44 24.21 -40 03 20.8 +000+17.1 PC 12 16 40 58.4 -18 51 39. 1950 50.134.178 16 43 53.77 -18 57 11.8 +000+17.1 PC 12 16 40 58.4 -18 51 41. 1950 70.002.006 16 43 53.77 -18 57 13.8 +000+17.1 PC 12 16 43 53.93 -18 57 12.2 2000 70.002.006 rad 16 43 53.93 -18 57 12.2 +000+17.1 PC 12 16 40 58.3 -18 51 40. 1950 IRAS16409-1851 16 43 53.67 -18 57 12.8 +335-03.1 HtTr 4 16 41 08.0 -51 06 48. 1950 34.134.052 * 16 45 00.14 -51 12 18.3 +335-03.1 HtTr 4 16 41 08.3 -51 06 51. 1950 Ko,Ku (1999) 16 45 00.45 -51 12 21.3 +339-00.1 * VB 1 16 41 36. -46 03 48. 1950 Ko,Ku (1999) * 16 45 15.40 -46 09 16.8 +352+11.2 * K 2-16 16 41 41.7 -27 58 36. 1950 Wr (1966) 16 44 49.07 -28 04 05.4 +352+11.2 * K 2-16 16 41 41.7 -27 58 36. 1950 19.135.028 16 44 49.07 -28 04 05.4 +352+11.2 * K 2-16 16 41 41.6 -27 58 34. 1950 70.002.006 16 44 48.97 -28 04 03.4 +352+11.2 * K 2-16 16 41 42.0 -27 58 37. 1950 Ko,Ku (1999) 16 44 49.37 -28 04 06.4 +352+11.2 * K 2-16 16 41 41.6 -27 58 34. 1950 IRAS16416-2758 16 44 48.97 -28 04 03.4 +043+37.1 NGC 6210 16 40 18.03 +23 59 05.4 1900 CGPN/Lo 11 16 44 29.61 +23 47 59.6 +043+37.1 NGC 6210 16 40 18.09 +23 59 06.5 1900 CGPN/Si 27 16 44 29.67 +23 48 00.7 +043+37.1 NGC 6210 16 42 23.67 +23 53 29.1 1950 CGPN/AGK2 16 44 29.55 +23 48 00.6 +043+37.1 NGC 6210 16 42 23.5 +23 53 17. 1950 09.133.025 16 44 29.38 +23 47 48.5 +043+37.1 NGC 6210 16 42 23.55 +23 53 29.1 1950 11.133.008 16 44 29.43 +23 48 00.6 +043+37.1 NGC 6210 16 42 23.7 +23 53 29.1 1950 11.133.011 16 44 29.58 +23 48 00.6 +043+37.1 NGC 6210 16 42 23.7 +23 53 28. 1950 70.002.006 16 44 29.58 +23 47 59.5 +043+37.1 NGC 6210 16 44 29.49 +23 47 59.9 2000 70.002.006 rad 16 44 29.49 +23 47 59.9 +043+37.1 NGC 6210 16 42 23.64 +23 53 28.8 1950 AGK3+23 1564 16 44 29.52 +23 48 00.3 +043+37.1 NGC 6210 16 44 29.49 +23 47 59.7 2000 PPM 105169 16 44 29.49 +23 47 59.7 +043+37.1 NGC 6210 16 44 29.52 +23 47 59.6 2000 TYC 204500221 16 44 29.52 +23 47 59.6 +043+37.1 NGC 6210 16 42 23.4 +23 53 27. 1950 IRAS16423+2353 16 44 29.28 +23 47 58.5 +345+04.1 Vd 1-2 16 43 20.9 -38 31 35. 1950 10.114.152 16 46 45.15 -38 36 57.0 +345+04.1 Vd 1-2 16 43 20.8 -38 31 36. 1950 70.002.006 16 46 45.05 -38 36 58.0 +345+04.1 Vd 1-2 16 46 46.10 -38 37 04.0 2000 70.002.006 rad 16 46 46.10 -38 37 04.0 +345+04.1 Vd 1-2 16 43 20.5 -38 31 36. 1950 IRAS16433-3831 16 46 44.75 -38 36 58.1 +335-03.2 MmWe 1-7 16 44 06.3 -50 37 15. 1950 51.134.007 * 16 47 57.41 -50 42 33.0 +335-03.2 MmWe 1-7 16 44 06.2 -50 37 31. 1950 Ko,Ku (1999) 16 47 57.33 -50 42 49.0 +335-04.1 MmWe 1-8 16 44 47.8 -51 03 59. 1950 51.134.007 * 16 48 40.23 -51 09 14.1 +335-04.1 MmWe 1-8 16 44 47.9 -51 04 05. 1950 Ko,Ku (1999) 16 48 40.34 -51 09 20.1 +348+06.1 IRAS16455-3455 16 45 30.4 -34 55 45. 1950 50.134.176 * 16 48 48.58 -35 00 58.3 +348+06.1 IRAS16455-3455 16 45 30.4 -34 55 45.1 1950 52.134.002 16 48 48.58 -35 00 58.4 +348+06.1 IRAS16455-3455 16 45 30.3 -34 55 44. 1950 70.002.006 16 48 48.48 -35 00 57.3 +348+06.1 IRAS16455-3455 16 48 48.44 -35 00 55.4 2000 70.002.006 rad 16 48 48.44 -35 00 55.4 +348+06.1 IRAS16455-3455 16 45 30.5 -34 55 45. 1950 Ko,Ku (1999) 16 48 48.68 -35 00 58.3 +348+06.1 IRAS16455-3455 16 45 30.2 -34 55 44. 1950 IRAS16455-3455 16 48 48.38 -35 00 57.3 +347+05.1 H 1-2 16 45 34.4 -35 41 56. 1950 CGPN/Koal 65 16 48 53.87 -35 47 09.0 +347+05.1 H 1-2 16 45 34.6 -35 41 52. 1950 50.134.178 16 48 54.07 -35 47 05.0 +347+05.1 H 1-2 16 45 34.5 -35 41 56. 1950 70.002.006 16 48 53.97 -35 47 09.0 +347+05.1 H 1-2 16 48 54.08 -35 47 09.6 2000 70.002.006 rad 16 48 54.08 -35 47 09.6 +347+05.1 H 1-2 16 45 36.0 -35 42 01. 1950 IRAS16456-3542 16 48 55.47 -35 47 13.9 +359+15.1 A 40 16 45 35.8 -20 55 26. 1950 18.133.025 16 48 33.90 -21 00 39.6 +359+15.1 A 40 16 45 36.5 -20 55 37. 1950 50.134.178 16 48 34.61 -21 00 50.5 +359+15.1 A 40 16 45 36.4 -20 55 37. 1950 70.002.006 16 48 34.51 -21 00 50.5 +359+15.1 A 40 16 48 34.40 -21 00 55.0 2000 70.002.006 rad 16 48 34.40 -21 00 55.0 +359+15.1 A 40 16 45 36.7 -20 55 35. 1950 IRAS16456-2055 16 48 34.80 -21 00 48.5 +344+03.1 Vd 1-3 16 46 06.9 -39 15 58. 1950 70.002.006 * 16 49 32.70 -39 21 08.5 +344+03.1 Vd 1-3 16 49 33.20 -39 20 49.0 2000 70.002.006 rad 16 49 33.20 -39 20 49.0 +344+03.1 Vd 1-3 16 46 07.2 -39 16 00. 1950 Ko,Ku (1999) 16 49 33.00 -39 21 10.5 +345+03.1 Vd 1-4 16 47 00.7 -39 03 12. 1950 70.002.006 16 50 26.17 -39 08 18.8 +345+03.1 Vd 1-4 16 50 25.80 -39 08 15.6 2000 70.002.006 rad 16 50 25.80 -39 08 15.6 +345+03.1 Vd 1-4 16 46 59.9 -39 03 12. 1950 Ko,Ku (1999) 16 50 25.37 -39 08 18.8 +345+03.1 Vd 1-4 16 46 59.6 -39 03 13. 1950 IRAS16469-3903 16 50 25.07 -39 08 19.9 +351+09.1 PC 13 16 47 06.1 -30 14 46. 1950 Wr (1966) 16 50 17.04 -30 19 52.9 +351+09.1 PC 13 16 47 06.2 -30 14 47. 1950 08.114.108 16 50 17.14 -30 19 53.9 +351+09.1 PC 13 16 47 06.1 -30 14 49. 1950 70.002.006 16 50 17.04 -30 19 55.9 +351+09.1 PC 13 16 50 17.16 -30 19 55.9 2000 70.002.006 rad 16 50 17.16 -30 19 55.9 +351+09.1 PC 13 16 47 07.0 -30 14 53. 1950 IRAS16471-3014 16 50 17.94 -30 19 59.8 +094+38.1 * EL 1647+64 16 47 07. +64 12 42. 1950 Ko,Ku (1999) * 16 47 29.67 +64 07 29.6 +350+07.1 * IRAS16478-3217 16 47 52.70 -32 17 51.0 1950 72.002.012 rad 16 51 06.80 -32 22 54.5 +350+07.1 * IRAS16478-3217 16 51 06.2 -32 23 01. 2000 72.002.012 16 51 06.2 -32 23 01. +350+07.1 * IRAS16478-3217 16 47 52.3 -32 17 58. 1950 Ko,Ku (1999) 16 51 06.40 -32 23 01.6 +350+07.1 * IRAS16478-3217 16 47 51.7 -32 17 58. 1950 IRAS16478-3217 16 51 05.80 -32 23 01.6 +344+02.1 Vd 1-5 16 48 06. -39 57 54. 1950 31.002.098 * 16 51 33.26 -40 02 56.2 +344+02.1 Vd 1-5 16 48 06.6 -39 57 55. 1950 Ko,Ku (1999) 16 51 33.86 -40 02 57.1 +325-12.1 He 2-182 16 49 49.0 -64 09 36. 1950 08.114.108 16 54 35.02 -64 14 28.3 +325-12.1 He 2-182 16 49 49.3 -64 09 39. 1950 18.133.025 16 54 35.33 -64 14 31.3 +325-12.1 He 2-182 16 49 48.5 -64 09 35. 1950 IRAS16498-6409 16 54 34.52 -64 14 27.4 +342+00.1 H 1-3 16 49 58.7 -42 34 28. 1950 CGPN/Koal 65 16 53 31.26 -42 39 22.2 +342+00.1 H 1-3 16 49 57.8 -42 34 28. 1950 Wr (1966) 16 53 30.35 -42 39 22.2 +351+07.1 H 1-4 16 50 24.0 -31 35 35. 1950 CGPN/Koal 65 16 53 37.15 -31 40 28.1 +351+07.1 H 1-4 16 50 23.9 -31 35 40. 1950 Wr (1966) 16 53 37.05 -31 40 33.1 +351+07.1 H 1-4 16 50 23.8 -31 35 40. 1950 70.002.006 16 53 36.95 -31 40 33.1 +351+07.1 H 1-4 16 53 37.10 -31 40 34.0 2000 70.002.006 rad 16 53 37.10 -31 40 34.0 +345+03.2 Vd 1-6 16 50 49.2 -38 40 13. 1950 CGPN/Koal 65 * 16 54 14.23 -38 45 03.9 +345+03.2 Vd 1-6 16 51 02.6 -38 39 19. 1950 Wr (1966) 16 54 27.62 -38 44 09.0 +345+03.2 Vd 1-6 16 51 02.3 -38 39 20. 1950 70.002.006 16 54 27.32 -38 44 10.0 +345+03.2 Vd 1-6 16 54 27.47 -38 44 09.6 2000 70.002.006 rad 16 54 27.47 -38 44 09.6 +345+03.2 Vd 1-6 16 51 02.7 -38 39 22. 1950 Ko,Ku (1999) 16 54 27.72 -38 44 12.0 +353+08.1 * MyCn 26 old 16 52 39.6 -29 47 03. 1950 CGPN/Koal 65 * 16 55 50.12 -29 51 46.7 +353+08.1 * MyCn 26 old 16 52 36.9 -29 45 33. 1950 Wr (1966) 16 55 47.38 -29 50 16.9 +353+08.1 * MyCn 26 old 16 52 37.0 -29 45 35. 1950 Ko,Ku (1999) 16 55 47.48 -29 50 18.9 +353+08.1 * MyCn 26 old 16 52 39.7 -29 47 03. 1950 Ko,Ku (1999) 16 55 50.22 -29 51 46.7 +353+08.1 * MyCn 26 old 16 52 36.67 -29 45 35.9 1950 72.002.012 rad 16 55 47.15 -29 50 19.8 +353+08.1 * MyCn 26 old 16 55 47.3 -29 50 18. 2000 72.002.012 16 55 47.3 -29 50 18. +353+08.1 * MyCn 26 old 16 52 37.5 -29 45 35. 1950 IRAS16526-2945 16 55 47.98 -29 50 18.8 +342-00.1 * PN 1652-4341 16 52 59.7 -43 41 36. : 1950 58.134.001 16 56 34.84 -43 46 17.4 +342-00.1 * PN 1652-4341 16 52 59.1 -43 41 33. 1950 Ko,Ku (1999) 16 56 34.24 -43 46 14.5 +342-00.1 * PN 1652-4341 16 52 59.6 -43 41 35. 1950 IRAS16529-4341 16 56 34.74 -43 46 16.4 +337-04.1 MmWe 1-9 16 53 39.4 -49 42 14. 1950 51.134.007 16 57 29.00 -49 46 52.2 +337-04.1 MmWe 1-9 16 53 39.6 -49 42 18. 1950 Ko,Ku (1999) 16 57 29.20 -49 46 56.2 +344+00.1 H 1-5 16 53 53.0 -41 33 22. 1950 CGPN/Koal 65 16 57 23.78 -41 37 59.9 +344+00.1 H 1-5 16 53 53.50 -41 33 01.6 1950 52.002.040 16 57 24.26 -41 37 39.4 +344+00.1 H 1-5 16 53 52.6 -41 33 20. 1950 IRAS16538-4133 16 57 23.37 -41 37 57.9 +347+03.1 * Vd 1-7 16 54 06. -37 01 18. 1950 31.002.098 * 16 57 28.28 -37 05 55.2 +347+03.1 * Vd 1-7 C1 16 54 06.0 -37 01 21. 1950 Ko,Ku (1999) 16 57 28.28 -37 05 58.2 +347+03.1 * Vd 1-7 C2 16 54 05.4 -37 01 20. 1950 Ko,Ku (1999) 16 57 27.68 -37 05 57.3 +348+04.1 KLSS 1-15 16 54 37.2 -35 20 06. 1950 63.134.060 16 57 56.60 -35 24 41.1 +348+04.1 KLSS 1-15 16 57 57.0 -35 24 52. 2000 69.134.051 16 57 57.0 -35 24 52. +348+04.1 KLSS 1-15 16 57 56.5 -35 24 41. 2000 We (1996) 16 57 56.5 -35 24 41. +348+04.1 KLSS 1-15 16 54 37.9 -35 20 20. 1950 Ko,Ku (1999) 16 57 57.31 -35 24 55.1 +336-05.1 He 2-186 16 55 40.5 -51 37 36. 1950 18.133.025 16 59 35.68 -51 42 05.5 +336-05.1 He 2-186 16 55 39.9 -51 37 35. 1950 IRAS16556-5137 16 59 35.08 -51 42 04.5 +321-16.1 He 2-185 16 55 45.6 -70 01 39. 1950 08.114.108 17 01 17.06 -70 06 04.8 +321-16.1 He 2-185 16 55 45.4 -70 01 40. 1950 18.133.025 17 01 16.86 -70 06 05.8 +321-16.1 He 2-185 16 55 46.0 -70 01 38. 1950 IRAS16557-7001 17 01 17.45 -70 06 03.8 +339-03.1 * MaC 1-3 16 57 43.22 -47 41 12.7 1950 22.135.002 * 17 01 27.96 -47 45 33.9 +339-03.1 * MaC 1-3 16 57 43.2 -47 41 14. 1950 Ko,Ku (1999) 17 01 27.94 -47 45 35.2 +349+04.1 M 2-4 16 57 47.5 -34 45 16. 1950 CGPN/Mi 59 17 01 06.10 -34 49 37.8 +349+04.1 M 2-4 16 57 47.7 -34 45 17. 1950 CGPN/Koal 65 17 01 06.30 -34 49 38.8 +349+04.1 M 2-4 16 57 47.72 -34 45 17.4 1950 34.134.032 17 01 06.32 -34 49 39.2 +349+04.1 M 2-4 16 57 47.6 -34 45 16. 1950 70.002.006 17 01 06.20 -34 49 37.8 +349+04.1 M 2-4 17 01 06.23 -34 49 38.7 2000 70.002.006 rad 17 01 06.23 -34 49 38.7 +349+04.1 M 2-4 16 57 48.9 -34 45 20. 1950 IRAS16578-3445 17 01 07.50 -34 49 41.7 +343-00.1 * HtTr 5 16 57 54.0 -43 01 35. 1950 34.134.052 * 17 01 28.08 -43 05 55.8 +343-00.1 * HtTr 5 16 57 54.2 -43 01 36. 1950 Ko,Ku (1999) 17 01 28.28 -43 05 56.8 +000+12.1 IC 4634 16 58 33.6 -21 45 12. 1950 02.133.027 * 17 01 33.18 -21 49 31.2 +000+12.1 IC 4634 16 58 34.1 -21 45 12. 1950 08.114.108 17 01 33.68 -21 49 31.2 +000+12.1 IC 4634 16 58 34.6 -21 45 28. 1950 09.133.025 17 01 34.19 -21 49 47.1 +000+12.1 IC 4634 16 58 33.6 -21 45 12.0 1950 11.133.011 17 01 33.18 -21 49 31.2 +000+12.1 IC 4634 16 58 33.98 -21 45 13.7 1950 37.134.035 17 01 33.56 -21 49 32.9 +000+12.1 IC 4634 16 58 34.00 -21 45 14.0 1950 52.002.003 17 01 33.58 -21 49 33.2 +000+12.1 IC 4634 16 58 33.97 -21 45 14.4 1950 54.134.034 17 01 33.56 -21 49 33.6 +000+12.1 IC 4634 16 58 34.0 -21 45 14. 1950 70.002.006 17 01 33.58 -21 49 33.2 +000+12.1 IC 4634 17 01 33.58 -21 49 33.1 2000 70.002.006 rad 17 01 33.58 -21 49 33.1 +000+12.1 IC 4634 16 58 33.9 -21 45 14. 1950 IRAS16585-2145 17 01 33.48 -21 49 33.2 +334-07.1 * CPD-53 8315 16 59 00.7 -53 51 41. 1950 Ko,Ku (1999) 17 03 03.10 -53 55 56.1 +334-07.1 * CPD-53 8315 17 03 02.94 -53 55 53.5 2000 AC 4329699 17 03 02.94 -53 55 53.5 +334-07.1 * CPD-53 8315 17 03 02.88 -53 55 53.9 2000 HIP 083421 17 03 02.88 -53 55 53.9 +334-07.1 * CPD-53 8315 16 59 00.8 -53 51 39. 1950 IRAS16590-5351 17 03 03.20 -53 55 54.1 +351+05.1 M 2-5 16 59 03.4 -33 05 48. 1950 CGPN/Mi 59 17 02 19.34 -33 10 04.5 +351+05.1 M 2-5 16 59 03.2 -33 05 49. 1950 CGPN/Koal 65 17 02 19.14 -33 10 05.6 +351+05.1 M 2-5 16 59 03.20 -33 05 47.3 1950 34.134.032 17 02 19.14 -33 10 03.9 +351+05.1 M 2-5 16 59 03.4 -33 05 48. 1950 70.002.006 17 02 19.34 -33 10 04.5 +351+05.1 M 2-5 17 02 19.16 -33 10 06.1 2000 70.002.006 rad 17 02 19.16 -33 10 06.1 +351+05.1 M 2-5 16 59 03.0 -33 05 49. 1950 IRAS16590-3305 17 02 18.94 -33 10 05.6 +340-03.1 * IRAS16594-4656 16 59 27.2 -46 56 14. 1950 Ko,Ku (1999) 17 03 10.24 -47 00 27.9 +340-03.1 * IRAS16594-4656 16 59 26.7 -46 56 14. 1950 IRAS16594-4656 17 03 09.74 -47 00 28.0 +351+04.1 M 1-19 17 00 30.4 -33 25 37. 1950 CGPN/Mi 59 17 03 46.95 -33 29 47.4 +351+04.1 M 1-19 17 00 30.4 -33 25 35. 1950 CGPN/Koal 65 17 03 46.95 -33 29 45.4 +351+04.1 M 1-19 17 00 30.3 -33 25 34. 1950 50.134.178 17 03 46.84 -33 29 44.4 +351+04.1 M 1-19 17 00 30.2 -33 25 33. 1950 70.002.006 17 03 46.74 -33 29 43.4 +351+04.1 M 1-19 17 03 46.85 -33 29 44.7 2000 70.002.006 rad 17 03 46.85 -33 29 44.7 +351+04.1 M 1-19 17 00 30.6 -33 25 35. 1950 IRAS17005-3325 17 03 47.15 -33 29 45.4 +353+06.2 M 2-6 17 01 06.0 -30 49 22. 1950 CGPN/Mi 59 17 04 18.46 -30 53 30.0 +353+06.2 M 2-6 17 01 05.9 -30 49 20. 1950 CGPN/Koal 65 17 04 18.36 -30 53 28.0 +353+06.2 M 2-6 17 01 05.92 -30 49 20.9 1950 34.134.032 17 04 18.38 -30 53 28.9 +353+06.2 M 2-6 17 01 05.8 -30 49 20. 1950 70.002.006 17 04 18.26 -30 53 28.0 +353+06.2 M 2-6 17 04 18.46 -30 53 29.4 2000 70.002.006 rad 17 04 18.46 -30 53 29.4 +347+01.1 Vd 1-8 17 01 48.3 -37 48 44. 1950 CGPN/Koal 65 * 17 05 12.43 -37 52 48.6 +347+01.1 Vd 1-8 17 01 09.6 -37 49 08. 1950 70.002.006 17 04 33.71 -37 53 15.4 +347+01.1 Vd 1-8 17 04 33.88 -37 53 13.0 2000 70.002.006 rad 17 04 33.88 -37 53 13.0 +347+01.1 Vd 1-8 17 01 09.8 -37 49 10. 1950 Ko,Ku (1999) 17 04 33.91 -37 53 17.4 +347+01.1 Vd 1-8 17 01 11.0 -37 49 09. 1950 IRAS17011-3749 17 04 35.11 -37 53 16.3 +350+04.1 H 2-1 17 01 18.9 -33 55 13. 1950 CGPN/Koal 65 17 04 36.29 -33 59 19.9 +350+04.1 H 2-1 17 01 19.4 -33 55 05. 1950 09.133.025 17 04 36.79 -33 59 11.9 +350+04.1 H 2-1 17 01 18.9 -33 55 11. 1950 31.116.001 17 04 36.29 -33 59 17.9 +350+04.1 H 2-1 17 01 18.9 -33 55 11. 1950 50.134.178 17 04 36.29 -33 59 17.9 +350+04.1 H 2-1 17 01 18.8 -33 55 11. 1950 70.002.006 17 04 36.19 -33 59 17.9 +350+04.1 H 2-1 17 04 36.13 -33 59 18.7 2000 70.002.006 rad 17 04 36.13 -33 59 18.7 +350+04.1 H 2-1 17 01 18.3 -33 55 11. 1950 IRAS17013-3355 17 04 35.69 -33 59 18.0 +345+00.1 IC 4637 17 01 40.8 -40 49 05. 1950 CGPN/Koal 65 * 17 05 10.62 -40 53 10.0 +345+00.1 IC 4637 17 01 39.2 -40 48 52. 1950 09.133.025 17 05 09.01 -40 52 57.1 +345+00.1 IC 4637 17 01 40.63 -40 49 01.0 1950 52.002.040 17 05 10.44 -40 53 06.0 +345+00.1 IC 4637 17 01 40.80 -40 49 03.8 1950 GSC 7873-00897 17 05 10.62 -40 53 08.8 +353+06.1 M 2-7 17 02 01.8 -30 28 14. 1950 CGPN/Mi 59 17 05 13.76 -30 32 18.1 +353+06.1 M 2-7 17 02 01.9 -30 28 15. 1950 CGPN/Koal 65 17 05 13.86 -30 32 19.1 +353+06.1 M 2-7 17 02 02.0 -30 28 13. 1950 50.134.178 17 05 13.96 -30 32 17.1 +353+06.1 M 2-7 17 02 01.8 -30 28 14. 1950 70.002.006 17 05 13.76 -30 32 18.1 +353+06.1 M 2-7 17 05 14.19 -30 32 18.6 2000 70.002.006 rad 17 05 14.19 -30 32 18.6 +353+06.1 M 2-7 17 02 01.2 -30 28 10. 1950 IRAS17020-3028 17 05 13.16 -30 32 14.1 +343-01.1 Vd 1-9 17 02 03. -43 53 24. 1950 31.002.098 * 17 05 39.22 -43 57 27.2 +343-01.1 Vd 1-9 17 02 03.0 -43 52 18. 1950 Ko,Ku (1999) 17 05 39.18 -43 56 21.2 +343-01.1 Vd 1-9 17 02 02.1 -43 52 15. 1950 IRAS17020-4352 17 05 38.28 -43 56 18.2 +352+05.1 M 2-8 17 02 15.3 -32 28 00. 1950 CGPN/Mi 59 17 05 30.38 -32 32 03.0 +352+05.1 M 2-8 17 02 15.6 -32 28 05. 1950 CGPN/Koal 65 17 05 30.68 -32 32 08.0 +352+05.1 M 2-8 17 02 15.6 -32 28 05. 1950 50.134.178 17 05 30.68 -32 32 08.0 +352+05.1 M 2-8 17 02 15.6 -32 28 05. 1950 70.002.006 17 05 30.68 -32 32 08.0 +352+05.1 M 2-8 17 05 30.69 -32 32 07.3 2000 70.002.006 rad 17 05 30.69 -32 32 07.3 +352+05.1 M 2-8 17 02 15.8 -32 28 05. 1950 IRAS17022-3228 17 05 30.89 -32 32 08.0 +336-06.1 PC 14 17 02 16.49 -52 25 58.9 1950 10.113.006 17 06 14.70 -52 30 00.4 +336-06.1 PC 14 17 02 16.0 -52 25 55. 1950 18.133.025 17 06 14.20 -52 29 56.5 +358+09.1 Th 3-1 17 02 40.0 -25 21 00. 1950 70.002.006 * 17 05 44.55 -25 25 01.6 +358+09.1 Th 3-1 17 05 44.24 -25 24 43.0 2000 70.002.006 rad 17 05 44.24 -25 24 43.0 +358+09.1 Th 3-1 17 02 40.2 -25 21 01. 1950 Ko,Ku (1999) 17 05 44.75 -25 25 02.6 +342-02.1 He 2-198 17 02 45.9 -44 09 13. 1950 CGPN/Koal 65 17 06 22.75 -44 13 13.1 +342-02.1 He 2-198 17 02 45.4 -44 09 07. 1950 Wr (1966) 17 06 22.24 -44 13 07.2 +342-02.1 He 2-198 17 02 44.0 -44 09 07. 1950 IRAS17027-4409 17 06 20.84 -44 13 07.3 +010+18.2 M 2-9 17 02 52.7 -10 04 26. 1950 CGPN/Mi 59 17 05 38.04 -10 08 27.4 +010+18.2 M 2-9 17 02 52.5 -10 04 31. 1950 09.133.025 17 05 37.84 -10 08 32.4 +010+18.2 M 2-9 17 02 52.6 -10 04 27. 1950 11.133.008 17 05 37.94 -10 08 28.4 +010+18.2 M 2-9 17 02 52.53 -10 04 32.4 1950 17.141.016 17 05 37.87 -10 08 33.8 +010+18.2 M 2-9 17 02 52.53 -10 04 32.4 1950 20.041.026 17 05 37.87 -10 08 33.8 +010+18.2 M 2-9 17 02 52.7 -10 04 26. 1950 20.041.026 17 05 38.04 -10 08 27.4 +010+18.2 M 2-9 17 02 52.57 -10 04 30.8 1950 27.135.029 17 05 37.91 -10 08 32.2 +010+18.2 M 2-9 17 02 52.7 -10 04 26. 1950 31.116.001 17 05 38.04 -10 08 27.4 +010+18.2 M 2-9 17 02 52.60 -10 04 31.0 1950 39.134.019 17 05 37.94 -10 08 32.4 +010+18.2 M 2-9 17 02 52.63 -10 04 31.0 1950 50.112.135 17 05 37.97 -10 08 32.4 +010+18.2 M 2-9 17 02 52.6 -10 04 30. 1950 50.134.178 17 05 37.94 -10 08 31.4 +010+18.2 M 2-9 17 02 52.6 -10 04 31. 1950 70.002.006 17 05 37.94 -10 08 32.4 +010+18.2 M 2-9 17 05 37.97 -10 08 33.9 2000 70.002.006 rad 17 05 37.97 -10 08 33.9 +010+18.2 M 2-9 17 02 52.7 -10 04 33. 1950 Ko,Ku (1999) 17 05 38.04 -10 08 34.4 +010+18.2 M 2-9 17 02 52.67 -10 04 32.6 1950 GSC 5647-00690 17 05 38.01 -10 08 34.0 +010+18.2 M 2-9 17 02 51.8 -10 04 31. 1950 IRAS17028-1004 17 05 37.14 -10 08 32.4 +344-01.1 H 1-6 17 03 25.7 -42 37 13. 1950 CGPN/Koal 65 * 17 06 59.29 -42 41 10.4 +344-01.1 H 1-6 17 03 25.2 -42 37 13. 1950 Wr (1966) 17 06 58.79 -42 41 10.4 +354+06.1 * Ta 48 17 03 50. -29 33 42. 1950 46.155.079 17 07 00.66 -29 37 38.5 +354+06.1 * Ta 48 17 03 50.0 -29 33 41. 1950 Ko,Ku (1999) 17 07 00.66 -29 37 37.5 +342-02.2 * Sa 3-41 17 03 52.9 -44 18 47. 1950 Wr (1966) 17 07 30.17 -44 22 42.4 +342-02.2 * Sa 3-41 17 03 53.5 -44 18 56. 1950 Ko,Ku (1999) 17 07 30.78 -44 22 51.3 +342-02.2 * Sa 3-41 17 03 51.9 -44 18 56. 1950 IRAS17038-4418 17 07 29.18 -44 22 51.4 +351+03.1 * H 2-2 17 04 04.1 -34 01 19. 1950 CGPN/Koal 65 * 17 07 21.79 -34 05 14.2 +351+03.1 * H 2-2 17 04 03.8 -34 01 20. 1950 Wr (1966) 17 07 21.49 -34 05 15.3 +351+03.1 * H 2-2 17 04 04.0 -34 01 18. 1950 10.114.152 17 07 21.68 -34 05 13.2 +351+03.1 * H 2-2 17 04 04.05 -34 01 18.2 1950 51.117.039 17 07 21.74 -34 05 13.4 +351+03.1 * H 2-2 17 04 04.05 -34 01 18.8 1950 51.117.039 rad 17 07 21.74 -34 05 14.0 +011+17.1 * DeHt 10 17 04 10. -09 43 08. 1950 68.134.063 17 06 54.94 -09 47 03.9 +011+17.1 * DeHt 10 17 04 10.1 -09 43 03. 1950 Ko,Ku (1999) 17 06 55.04 -09 46 58.9 +011+17.1 * DeHt 10 17 04 10.33 -09 43 04.8 1950 GSC 5648-01516 17 06 55.27 -09 47 00.7 +358+09.2 * Ta 26 17 04 41.4 -24 59 47.4 1950 40.155.076 17 07 45.53 -25 03 40.5 +358+09.2 * Ta 26 17 04 41.5 -24 59 47. 1950 Ko,Ku (1999) 17 07 45.63 -25 03 40.0 +332-09.1 * CPD-56 8032 17 04 47.6 -56 50 50. 1950 Wr (1966) 17 09 01.08 -56 54 40.2 +332-09.1 * CPD-56 8032 17 04 47. -56 50 48. 1950 20.041.026 17 09 00.48 -56 54 38.3 +332-09.1 * CPD-56 8032 17 04 48.0 -56 51 01. 1950 30.002.012 17 09 01.49 -56 54 51.2 +332-09.1 * CPD-56 8032 17 04 47.50 -56 50 57.57 1950 49.041.008 17 09 00.99 -56 54 47.8 +332-09.1 * CPD-56 8032 17 04 47.7 -56 50 59. 1950 Ko,Ku (1999) 17 09 01.19 -56 54 49.2 +332-09.1 * CPD-56 8032 17 09 00.86 -56 54 47.4 2000 AC 4331077 17 09 00.86 -56 54 47.4 +332-09.1 * CPD-56 8032 17 09 00.94 -56 54 47.8 2000 HIP 083916 17 09 00.94 -56 54 47.8 +332-09.1 * CPD-56 8032 17 04 47.5 -56 50 58. 1950 IRAS17047-5650 17 09 00.99 -56 54 48.2 +358+08.1 * Ta 29 17 05 15.4 -25 09 51.3 1950 40.155.076 17 08 19.78 -25 13 41.9 +358+08.1 * Ta 29 17 05 15.5 -25 09 52. 1950 Ko,Ku (1999) 17 08 19.88 -25 13 42.6 +336-07.1 * K 2-17 17 05 38.2 -52 09 16. 1950 19.135.028 * 17 09 35.85 -52 13 03.2 +336-07.1 * K 2-17 17 05 38.4 -52 09 17. 1950 Ko,Ku (1999) 17 09 36.05 -52 13 04.2 +336-07.1 * K 2-17 17 05 38.3 -52 09 15. 1950 IRAS17056-5209 17 09 35.95 -52 13 02.2 +345-01.1 H 1-7 17 06 55.4 -41 49 06. 1950 CGPN/Koal 65 17 10 27.54 -41 52 48.6 +345-01.1 H 1-7 17 06 54.4 -41 49 07. 1950 IRAS17069-4149 17 10 26.54 -41 52 49.7 +357+07.1 M 4-3 17 07 35. -27 05 02. 1950 CGPN/Mi 59 17 10 42.16 -27 08 42.6 +357+07.1 M 4-3 17 07 34.67 -27 05 03.3 1950 34.134.032 17 10 41.83 -27 08 43.9 +357+07.1 M 4-3 17 07 34.6 -27 05 04. 1950 70.002.006 17 10 41.76 -27 08 44.7 +357+07.1 M 4-3 17 10 41.75 -27 08 42.9 2000 70.002.006 rad 17 10 41.75 -27 08 42.9 +357+07.1 M 4-3 17 07 35.9 -27 05 07. 1950 IRAS17075-2705 17 10 43.06 -27 08 47.6 +334-09.1 IC 4642 17 07 36.9 -55 20 20. 1950 08.114.108 17 11 45.12 -55 23 58.4 +334-09.1 IC 4642 17 07 37.2 -55 20 24. 1950 18.133.025 17 11 45.42 -55 24 02.4 +334-09.1 IC 4642 17 07 35.9 -55 20 25. 1950 IRAS17075-5520 17 11 44.12 -55 24 03.4 +340-04.1 Sa 1-5 17 07 43.0 -47 21 14. 1950 Wr (1966) 17 11 27.66 -47 24 52.8 +340-04.1 Sa 1-5 17 07 42.7 -47 21 22. 1950 11.133.012 17 11 27.37 -47 25 00.8 +340-04.1 Sa 1-5 17 07 42.9 -47 21 23. 1950 Ko,Ku (1999) 17 11 27.57 -47 25 01.8 +340-04.1 Sa 1-5 17 07 43.1 -47 21 24. 1950 IRAS17077-4721 17 11 27.77 -47 25 02.8 +357+07.2 TaJu 5 17 08 08. -27 08 00. 1950 64.134.024 17 11 15.25 -27 11 38.3 +357+07.2 TaJu 5 17 08 07.7 -27 07 56. 1950 Ko,Ku (1999) 17 11 14.94 -27 11 34.3 +354+05.1 * IRAS17084-3025 17 08 28.8 -30 25 12.3 1950 52.134.002 17 11 40.94 -30 28 48.9 +354+05.1 * IRAS17084-3025 17 08 28.9 -30 25 13. 1950 Ko,Ku (1999) 17 11 41.04 -30 28 49.6 +354+05.1 * IRAS17084-3025 17 08 29.5 -30 25 16. 1950 IRAS17084-3025 17 11 41.64 -30 28 52.6 +344-01.2 * PN 1708-4227 17 08 48.66 -42 27 07.0 1950 58.134.001 17 12 22.22 -42 30 41.5 +344-01.2 * PN 1708-4227 17 08 48.7 -42 27 08. 1950 Ko,Ku (1999) 17 12 22.26 -42 30 42.5 +344-01.2 * PN 1708-4227 17 08 48.3 -42 27 08. 1950 IRAS17088-4227 17 12 21.86 -42 30 42.5 +352+03.1 * H 2-4 17 08 56.4 -32 34 17. 1950 CGPN/Koal 65 17 12 11.93 -32 37 51.5 +352+03.1 * H 2-4 17 08 57.1 -32 34 15. 1950 Wr (1966) 17 12 12.63 -32 37 49.5 +352+03.1 * H 2-4 17 08 57.2 -32 34 11. 1950 10.114.152 17 12 12.73 -32 37 45.5 +352+03.1 * H 2-4 17 08 56.2 -32 34 12. 1950 38.002.010 17 12 11.73 -32 37 46.6 +352+03.1 * H 2-4 17 08 56.17 -32 34 11.9 1950 51.117.039 17 12 11.70 -32 37 46.5 +358+07.2 TaJu 8 17 09 27.4 -26 21 56. 1950 70.002.006 * 17 12 33.59 -26 25 28.7 +358+07.2 TaJu 8 17 12 34.00 -26 25 17.0 2000 70.002.006 rad 17 12 34.00 -26 25 17.0 +358+07.2 TaJu 8 17 09 27.7 -26 21 49. 1950 Ko,Ku (1999) 17 12 33.89 -26 25 21.6 +358+07.1 M 3-36 17 09 33.9 -25 40 05. 1950 CGPN/Koal 65 17 12 39.11 -25 43 37.2 +358+07.1 M 3-36 17 09 34.0 -25 40 06. 1950 50.134.178 17 12 39.21 -25 43 38.2 +358+07.1 M 3-36 17 09 33.91 -25 40 02.4 1950 54.134.034 17 12 39.12 -25 43 34.6 +358+07.1 M 3-36 17 09 34.1 -25 40 05. 1950 70.002.006 17 12 39.31 -25 43 37.2 +358+07.1 M 3-36 17 12 39.08 -25 43 36.0 2000 70.002.006 rad 17 12 39.08 -25 43 36.0 +358+07.1 M 3-36 17 09 34.2 -25 40 07. 1950 IRAS17095-2540 17 12 39.41 -25 43 39.2 +354+04.4 Ta 139 17 12 53.2 -30 40 07.4 2000 62.134.004 17 12 53.2 -30 40 07.4 +354+04.4 Ta 139 17 09 41.2 -30 36 34. 1950 Ko,Ku (1999) 17 12 53.67 -30 40 05.5 +018+20.1 Na 1 17 10 14.4 -03 12 25. 1950 CGPN/Naal 64 17 12 51.87 -03 15 55.3 +018+20.1 Na 1 17 10 13.8 -03 12 27. 1950 18.133.025 17 12 51.28 -03 15 57.3 +018+20.1 Na 1 17 10 14.4 -03 12 19. 1950 50.134.178 17 12 51.87 -03 15 49.3 +018+20.1 Na 1 17 10 14.2 -03 12 30. 1950 70.002.006 17 12 51.68 -03 16 00.3 +018+20.1 Na 1 17 12 51.84 -03 15 59.5 2000 70.002.006 rad 17 12 51.84 -03 15 59.5 +018+20.1 Na 1 17 10 14.9 -03 12 30. 1950 IRAS17102-0312 17 12 52.38 -03 16 00.2 +349+01.1 NGC 6302 17 06 59.16 -36 58 58.1 1900 CGPN/Po 10 17 13 45.09 -37 06 08.9 +349+01.1 NGC 6302 17 10 21.1 -37 02 44. 1950 CGPN/Koal 65 17 13 44.27 -37 06 12.2 +349+01.1 NGC 6302 17 10 21.1 -37 02 38. 1950 09.133.025 17 13 44.27 -37 06 06.2 +349+01.1 NGC 6302 17 10 21.31 -37 02 46.5 1950 11.133.008 17 13 44.48 -37 06 14.7 +349+01.1 NGC 6302 17 10 21.3 -37 02 43. 1950 49.134.023 17 13 44.47 -37 06 11.2 +349+01.1 NGC 6302 17 10 21.06 -37 02 36.3 1950 55.002.049 17 13 44.23 -37 06 04.5 +349+01.1 NGC 6302 17 10 21.1 -37 02 45. 1950 70.002.006 17 13 44.27 -37 06 13.2 +349+01.1 NGC 6302 17 13 44.47 -37 06 11.6 2000 70.002.006 rad 17 13 44.47 -37 06 11.6 +349+01.1 NGC 6302 17 10 21.7 -37 02 45. 1950 IRAS17103-3702 17 13 44.87 -37 06 13.2 +354+04.1 M 2-10 17 10 54. -31 16 13. 1950 CGPN/Mi 59 17 14 07.54 -31 19 39.2 +354+04.1 M 2-10 17 10 53.6 -31 16 16. 1950 CGPN/Koal 65 17 14 07.14 -31 19 42.3 +354+04.1 M 2-10 17 10 53.4 -31 16 16. 1950 10.114.152 17 14 06.94 -31 19 42.3 +354+04.1 M 2-10 17 10 53.53 -31 16 16.0 1950 34.134.032 17 14 07.07 -31 19 42.3 +354+04.1 M 2-10 17 10 53.4 -31 16 16. 1950 70.002.006 17 14 06.94 -31 19 42.3 +354+04.1 M 2-10 17 14 06.91 -31 19 40.3 2000 70.002.006 rad 17 14 06.91 -31 19 40.3 +354+04.1 M 2-10 17 10 53.4 -31 16 18. 1950 IRAS17108-3116 17 14 06.94 -31 19 44.3 +009+14.1 NGC 6309 17 08 27.17 -12 47 33.5 1900 CGPN/Kb 09 17 14 04.39 -12 54 36.6 +009+14.1 NGC 6309 17 08 27.38 -12 47 34.2 1900 CGPN/Po 10 17 14 04.60 -12 54 37.3 +009+14.1 NGC 6309 17 10 05.0 -12 49 23. 1929 CGPN/Sr 30 17 14 04.51 -12 54 18.4 +009+14.1 NGC 6309 17 11 14.9 -12 51 11. 1950 09.133.025 17 14 03.64 -12 54 36.6 +009+14.1 NGC 6309 17 11 15.5 -12 51 18.0 1950 11.133.011 17 14 04.24 -12 54 43.5 +009+14.1 NGC 6309 17 11 15.63 -12 51 20.2 1950 54.134.034 17 14 04.37 -12 54 45.7 +009+14.1 NGC 6309 17 11 15.6 -12 51 12. 1950 70.002.006 17 14 04.34 -12 54 37.5 +009+14.1 NGC 6309 17 14 04.32 -12 54 37.2 2000 70.002.006 rad 17 14 04.32 -12 54 37.2 +009+14.1 NGC 6309 17 11 15.2 -12 51 13. 1950 IRAS17112-1251 17 14 03.94 -12 54 38.6 +352+03.2 H 1-8 17 11 26.1 -33 21 24. 1950 CGPN/Koal 65 17 14 43.00 -33 24 47.8 +352+03.2 H 1-8 17 11 26.0 -33 21 23. 1950 09.133.025 17 14 42.90 -33 24 46.8 +352+03.2 H 1-8 17 11 26.0 -33 21 23. 1950 70.002.006 17 14 42.90 -33 24 46.8 +352+03.2 H 1-8 17 14 42.88 -33 24 47.3 2000 70.002.006 rad 17 14 42.88 -33 24 47.3 +355+04.2 Ta 140 17 15 02.9 -30 20 38.1 2000 62.134.004 17 15 02.9 -30 20 38.1 +355+04.2 Ta 140 17 11 50.9 -30 17 11. 1950 Ko,Ku (1999) 17 15 02.95 -30 20 33.2 +331-12.1 CPD-59 6926 17 11 56.8 -59 25 51. 1950 Wr (1966) 17 16 21.59 -59 29 10.3 +331-12.1 CPD-59 6926 17 11 56.6 -59 26 05. 1950 Ko,Ku (1999) 17 16 21.41 -59 29 24.3 +331-12.1 CPD-59 6926 17 16 21.05 -59 29 23.4 2000 AC 4332717 17 16 21.05 -59 29 23.4 +331-12.1 CPD-59 6926 17 11 56.43 -59 26 04.3 1950 GSC 8739-00311 17 16 21.23 -59 29 23.6 +331-12.1 CPD-59 6926 17 16 21.07 -59 29 23.6 2000 PPM 345830 17 16 21.07 -59 29 23.6 +331-12.1 CPD-59 6926 17 11 56.30 -59 26 04.1 1950 SAO 244567 17 16 21.10 -59 29 23.4 +331-12.1 CPD-59 6926 17 11 56.0 -59 26 06. 1950 IRAS17119-5926 17 16 20.81 -59 29 25.3 +075+35.1 Sa 4-1 17 12 32.7 +49 19 34. 1950 41.002.074 * 17 13 50.43 +49 16 10.8 +075+35.1 Sa 4-1 17 12 32.7 +49 19 34. 1950 70.002.006 17 13 50.43 +49 16 10.8 +075+35.1 Sa 4-1 17 12 32.68 +49 19 34.1 1950 GSC 3504-01072 17 13 50.41 +49 16 10.9 +354+04.3 Ta 233 17 15 52.6 -31 22 03. 2000 56.134.011 17 15 52.6 -31 22 03. +354+04.3 Ta 233 17 12 39.1 -31 18 45. 1950 Ko,Ku (1999) 17 15 52.77 -31 22 03.7 +359+07.1 * Ta 40 17 13 42.5 -24 55 55.9 1950 40.155.076 17 16 46.79 -24 59 10.4 +359+07.1 * Ta 40 17 13 42.7 -24 55 57. 1950 Ko,Ku (1999) 17 16 46.99 -24 59 11.5 +356+05.1 Th 3-3 17 14 10.2 -28 56 15. 1950 70.002.006 17 17 20.28 -28 59 27.3 +356+05.1 Th 3-3 17 14 10.6 -28 56 17. 1950 Ko,Ku (1999) 17 17 20.68 -28 59 29.3 +355+04.1 * Sa 3-43 17 14 44.0 -29 58 34. 1950 38.002.010 17 17 55.67 -30 01 43.9 +355+04.1 * Sa 3-43 17 14 44.13 -29 58 32.3 1950 51.117.039 17 17 55.80 -30 01 42.1 +355+04.1 * Sa 3-43 17 14 44.3 -29 58 34. 1950 Ko,Ku (1999) 17 17 55.97 -30 01 43.8 +358+06.1 * TaJu 14 17 15 18.4 -26 19 12. 1950 Ko,Ku (1999) 17 18 24.69 -26 22 19.6 +357+05.1 * TaJu 13 17 15 32. -27 46 42. 1950 22.134.019 * 17 18 40.40 -27 49 48.5 +357+05.1 * TaJu 13 17 15 33.3 -27 47 09. 1950 Ko,Ku (1999) 17 18 41.72 -27 50 15.4 +354+03.1 Th 3-4 17 15 37.8 -31 36 00. 1950 CGPN/Koal 65 17 18 52.02 -31 39 05.9 +354+03.1 Th 3-4 17 15 37.6 -31 35 59. 1950 70.002.006 17 18 51.82 -31 39 04.9 +354+03.1 Th 3-4 17 15 37.6 -31 36 00. 1950 72.002.012 17 18 51.82 -31 39 05.9 +354+03.1 Th 3-4 17 18 51.99 -31 39 05.2 2000 72.002.012 rad 17 18 51.99 -31 39 05.2 +354+03.1 Th 3-4 17 15 37.4 -31 35 59. 1950 IRAS17156-3135 17 18 51.62 -31 39 04.9 +355+03.4 Ta 137 17 19 03.2 -30 53 52. 2000 58.134.011 * 17 19 03.2 -30 53 52. +355+03.4 Ta 137 17 15 50.4 -30 50 50. 1950 Ko,Ku (1999) 17 19 03.44 -30 53 55.1 +342-04.1 He 2-207 17 15 51. -45 50 06. 1950 31.002.098 17 19 32.48 -45 53 10.0 +342-04.1 He 2-207 17 15 51.3 -45 50 09. 1950 Ko,Ku (1999) 17 19 32.78 -45 53 13.0 +342-04.1 He 2-207 17 15 50.0 -45 50 10. 1950 IRAS17158-4550 17 19 31.48 -45 53 14.1 +355+03.3 Th 3-6 17 16 06.6 -31 09 35. 1950 70.002.006 17 19 20.14 -31 12 38.9 +355+03.3 Th 3-6 17 19 20.07 -31 12 41.1 2000 70.002.006 rad 17 19 20.07 -31 12 41.1 +355+03.3 Th 3-6 17 16 06.8 -31 09 38. 1950 Ko,Ku (1999) 17 19 20.34 -31 12 41.9 +355+03.3 Th 3-6 17 16 06.9 -31 09 36. 1950 IRAS17161-3109 17 19 20.44 -31 12 39.9 +359+06.1 M 3-37 17 16 08.4 -25 14 14. 1950 CGPN/Koal 65 * 17 19 13.18 -25 17 18.0 +359+06.1 M 3-37 17 16 07.2 -25 14 35. 1950 50.134.178 17 19 11.99 -25 17 39.1 +359+06.1 M 3-37 17 16 08.60 -25 14 15.2 1950 54.134.034 17 19 13.38 -25 17 19.2 +359+06.1 M 3-37 17 16 08.5 -25 14 13. 1950 70.002.006 17 19 13.28 -25 17 17.0 +359+06.1 M 3-37 17 19 12.54 -25 17 27.4 2000 70.002.006 rad 17 19 12.54 -25 17 27.4 +359+06.1 M 3-37 17 16 08.8 -25 14 14. 1950 Ko,Ku (1999) 17 19 13.58 -25 17 18.0 +359+06.1 M 3-37 17 16 08.0 -25 14 11. 1950 IRAS17161-2514 17 19 12.78 -25 17 15.1 +353+02.1 * IRAS17164-3226 17 16 25.8 -32 26 22. 1950 Ko,Ku (1999) * 17 19 41.38 -32 29 24.4 +353+02.1 * IRAS17164-3226 17 16 25.4 -32 26 53. 1950 IRAS17164-3226 17 19 41.00 -32 29 55.5 +338-08.1 NGC 6326 17 16 49.2 -51 42 18. 1950 08.114.108 17 20 46.33 -51 45 17.3 +338-08.1 NGC 6326 17 16 49.1 -51 42 20. 1950 18.133.025 17 20 46.23 -51 45 19.3 +338-08.1 NGC 6326 17 16 48.3 -51 42 16. 1950 IRAS17168-5142 17 20 45.42 -51 45 15.4 +341-06.1 SB 26 17 21 02.8 -47 35 25.8 2000 71.134.030 17 21 02.8 -47 35 25.8 +341-06.1 SB 26 17 17 17.4 -47 32 31. 1950 Ko,Ku (1999) 17 21 03.12 -47 35 28.7 +000+06.2 Trz 41 17 17 17.9 -24 48 53.8 1950 40.155.076 17 20 22.12 -24 51 52.9 +000+06.2 Trz 41 17 17 17.8 -24 48 52. 1950 70.002.006 17 20 22.02 -24 51 51.1 +356+04.1 M 2-11 17 17 23. -28 57 43. 1950 CGPN/Mi 59 17 20 33.21 -29 00 41.5 +356+04.1 M 2-11 17 17 23.1 -28 57 44. 1950 CGPN/Fc 62 17 20 33.31 -29 00 42.5 +356+04.1 M 2-11 17 17 23.1 -28 57 40. 1950 CGPN/Koal 65 17 20 33.31 -29 00 38.5 +356+04.1 M 2-11 17 17 23.1 -28 57 40. 1950 18.133.025 17 20 33.31 -29 00 38.5 +356+04.1 M 2-11 17 17 23.1 -28 57 39. 1950 46.134.040 17 20 33.31 -29 00 37.5 +356+04.1 M 2-11 17 17 23.1 -28 57 40. 1950 50.134.178 17 20 33.31 -29 00 38.5 +356+04.1 M 2-11 17 17 23.1 -28 57 40. 1950 70.002.006 17 20 33.31 -29 00 38.5 +356+04.1 M 2-11 17 20 33.32 -29 00 38.8 2000 70.002.006 rad 17 20 33.32 -29 00 38.8 +356+04.1 M 2-11 17 17 22.7 -28 57 41. 1950 IRAS17173-2857 17 20 32.91 -29 00 39.5 +356+04.3 * Th 3-7 17 17 51.7 -29 19 54. 1950 18.133.025 17 21 02.48 -29 22 50.4 +356+04.3 * Th 3-7 17 17 51.9 -29 19 55. 1950 38.002.010 17 21 02.68 -29 22 51.4 +356+04.3 * Th 3-7 17 17 51.75 -29 19 56.8 1950 51.117.039 17 21 02.53 -29 22 53.2 +356+04.3 * Th 3-7 17 17 51.80 -29 19 56.2 1950 51.117.039 17 21 02.58 -29 22 52.6 +356+04.2 M 3-38 17 17 54. -29 00 05. 1950 CGPN/Mi 59 17 21 04.28 -29 03 01.3 +356+04.2 M 3-38 17 17 54.3 -29 00 03. 1950 CGPN/Koal 65 17 21 04.58 -29 02 59.3 +356+04.2 M 3-38 17 17 54.0 -29 00 03. 1950 18.133.025 17 21 04.28 -29 02 59.3 +356+04.2 M 3-38 17 17 54.2 -29 00 03. 1950 46.134.040 17 21 04.48 -29 02 59.3 +356+04.2 M 3-38 17 17 54.2 -29 00 03. 1950 50.134.178 17 21 04.48 -29 02 59.3 +356+04.2 M 3-38 17 17 54.1 -29 00 03. 1950 70.002.006 17 21 04.38 -29 02 59.3 +356+04.2 M 3-38 17 21 04.29 -29 03 05.5 2000 70.002.006 rad 17 21 04.29 -29 03 05.5 +356+04.2 M 3-38 17 17 53.6 -29 00 04. 1950 IRAS17178-2900 17 21 03.88 -29 03 00.3 +358+05.1 M 3-39 17 18 04. -27 08 39. 1950 CGPN/Mi 59 17 21 11.55 -27 11 34.7 +358+05.1 M 3-39 17 18 04.1 -27 08 42. 1950 CGPN/Koal 65 17 21 11.65 -27 11 37.7 +358+05.1 M 3-39 17 18 04.1 -27 08 32. 1950 18.133.025 17 21 11.64 -27 11 27.7 +358+05.1 M 3-39 17 18 04.0 -27 08 41. 1950 46.134.040 17 21 11.55 -27 11 36.7 +358+05.1 M 3-39 17 18 03.8 -27 08 39. 1950 50.134.178 17 21 11.35 -27 11 34.7 +358+05.1 M 3-39 17 18 04.2 -27 08 41. 1950 70.002.006 17 21 11.75 -27 11 36.7 +358+05.1 M 3-39 17 21 11.54 -27 11 37.0 2000 70.002.006 rad 17 21 11.54 -27 11 37.0 +358+05.1 M 3-39 17 18 04.0 -27 08 42. 1950 IRAS17180-2708 17 21 11.55 -27 11 37.7 +002+08.1 H 1-11 17 18 17.0 -22 15 40. 1950 CGPN/Koal 65 17 21 17.75 -22 18 35.0 +002+08.1 H 1-11 17 18 17.0 -22 15 40. 1950 50.134.178 17 21 17.75 -22 18 35.0 +002+08.1 H 1-11 17 18 16.98 -22 15 46.1 1950 54.134.034 17 21 17.73 -22 18 41.1 +002+08.1 H 1-11 17 18 17.0 -22 15 40. 1950 70.002.006 17 21 17.75 -22 18 35.0 +002+08.1 H 1-11 17 21 17.63 -22 18 35.9 2000 70.002.006 rad 17 21 17.63 -22 18 35.9 +002+08.1 H 1-11 17 18 17.0 -22 15 41. 1950 IRAS17182-2215 17 21 17.75 -22 18 36.0 +355+03.2 H 1-9 17 18 20.0 -30 18 01. 1950 CGPN/Koal 65 17 21 32.27 -30 20 55.4 +355+03.2 H 1-9 17 18 19.6 -30 17 54. 1950 46.134.040 17 21 31.87 -30 20 48.4 +355+03.2 H 1-9 17 18 19.6 -30 17 53. 1950 50.134.178 17 21 31.87 -30 20 47.4 +355+03.2 H 1-9 17 18 19.5 -30 17 54. 1950 70.002.006 17 21 31.77 -30 20 48.4 +355+03.2 H 1-9 17 21 31.71 -30 20 49.1 2000 70.002.006 rad 17 21 31.71 -30 20 49.1 +355+03.2 H 1-9 17 18 19.8 -30 17 56. 1950 IRAS17183-3017 17 21 32.07 -30 20 50.4 +357+04.2 TaJu 18 17 18 27.8 -28 52 20. 1950 46.134.040 17 21 37.90 -28 55 13.9 +357+04.2 TaJu 18 17 21 37.9 -28 55 14. 2000 56.134.011 17 21 37.9 -28 55 14. +357+04.2 TaJu 18 17 18 27.8 -28 52 13. 1950 70.002.006 17 21 37.90 -28 55 06.9 +357+04.2 TaJu 18 17 21 38.12 -28 55 10.8 2000 70.002.006 rad 17 21 38.12 -28 55 10.8 +357+04.2 TaJu 18 17 18 28.1 -28 52 21. 1950 Ko,Ku (1999) 17 21 38.21 -28 55 14.8 +357+04.2 TaJu 18 17 18 28.1 -28 52 18. 1950 IRAS17184-2852 17 21 38.20 -28 55 11.8 +337-09.1 * ESO-180-07 17 18 36.5 -52 43 39. 1950 Wr (1966) 17 22 36.87 -52 46 30.5 +337-09.1 * ESO-180-07 17 18 36.6 -52 43 44. 1950 Ko,Ku (1999) 17 22 36.98 -52 46 35.5 +337-09.1 * ESO-180-07 17 18 36.9 -52 43 45. 1950 IRAS17186-5243 17 22 37.28 -52 46 36.5 +349-01.1 NGC 6337 17 18 49.5 -38 26 11. 1950 CGPN/Koal 65 17 22 15.58 -38 29 02.8 +349-01.1 NGC 6337 17 18 50.0 -38 26 06. 1950 09.133.025 17 22 16.07 -38 28 57.7 +349-01.1 NGC 6337 17 18 49.5 -38 26 10. 1950 70.002.006 17 22 15.58 -38 29 01.8 +349-01.1 NGC 6337 17 22 15.61 -38 28 57.8 2000 70.002.006 rad 17 22 15.61 -38 28 57.8 +349-01.1 NGC 6337 17 18 50.3 -38 26 11. 1950 IRAS17188-3826 17 22 16.38 -38 29 02.7 +342-06.2 SB 28 17 22 52.5 -47 02 45.3 2000 71.134.030 * 17 22 52.5 -47 02 45.3 +342-06.2 SB 28 17 19 08.3 -46 59 58. 1950 Ko,Ku (1999) 17 22 52.77 -47 02 47.8 +354+02.1 * Th 3-8 17 19 37.4 -32 11 17. 1950 18.133.025 * 17 22 52.68 -32 14 05.7 +354+02.1 * Th 3-8 17 19 20.1 -32 11 16. 1950 Ko,Ku (1999) 17 22 35.37 -32 14 05.9 +000+06.1 * Ta 67 17 19 48. -25 22 12. 1950 46.155.079 17 22 53.05 -25 25 00.3 +000+06.1 * Ta 67 17 19 48.6 -25 22 11. 1950 Ko,Ku (1999) 17 22 53.65 -25 24 59.2 +357+04.1 H 2-7 17 20 14.7 -28 56 19. 1950 CGPN/Koal 65 17 23 24.95 -28 59 05.2 +357+04.1 H 2-7 17 20 14.7 -28 56 19. 1950 46.134.040 17 23 24.95 -28 59 05.2 +357+04.1 H 2-7 17 20 14.2 -28 56 19. 1950 50.134.178 17 23 24.45 -28 59 05.2 +357+04.1 H 2-7 17 20 14.7 -28 56 20. 1950 70.002.006 17 23 24.95 -28 59 06.2 +357+04.1 H 2-7 17 23 25.02 -28 59 07.2 2000 70.002.006 rad 17 23 25.02 -28 59 07.2 +357+04.1 H 2-7 17 20 15.6 -28 56 21. 1950 IRAS17202-2856 17 23 25.85 -28 59 07.1 +331-13.1 * SKWL 2-48 17 20 42.0 -59 29 34. 1950 08.114.108 17 25 07.82 -59 32 15.6 +331-13.1 * SKWL 2-48 17 20 42.0 -59 29 35. 1950 Ko,Ku (1999) 17 25 07.82 -59 32 16.6 +355+02.1 * Th 3-9 17 20 45.7 -30 59 09. 1950 Wr (1966) 17 23 59.11 -31 01 52.8 +355+02.1 * Th 3-9 17 20 45. -30 59 06. 1950 46.155.079 17 23 58.40 -31 01 49.9 +359+05.1 M 2-12 17 20 55. -25 56 44. 1950 CGPN/Mi 59 17 24 00.89 -25 59 27.4 +359+05.1 M 2-12 17 20 55.6 -25 56 40. 1950 CGPN/Koal 65 17 24 01.49 -25 59 23.4 +359+05.1 M 2-12 17 20 55.5 -25 56 40. 1950 10.114.152 17 24 01.39 -25 59 23.4 +359+05.1 M 2-12 17 20 55.6 -25 56 40. 1950 18.133.025 17 24 01.49 -25 59 23.4 +359+05.1 M 2-12 17 20 55.6 -25 56 40. 1950 46.134.040 17 24 01.49 -25 59 23.4 +359+05.1 M 2-12 17 20 55.4 -25 56 38. 1950 70.002.006 17 24 01.29 -25 59 21.4 +359+05.1 M 2-12 17 24 01.50 -25 59 23.9 2000 70.002.006 rad 17 24 01.50 -25 59 23.9 +359+05.1 M 2-12 17 20 55.5 -25 56 40. 1950 IRAS17209-2556A 17 24 01.39 -25 59 23.4 +357+04.3 * Ta 68 17 21 05. -28 44 00. 1950 46.155.079 17 24 14.96 -28 46 42.6 +357+04.3 * Ta 68 17 21 05.3 -28 44 08. 1950 Ko,Ku (1999) 17 24 15.27 -28 46 50.6 +347-02.1 * IRAS17211-4049 17 21 09.8 -40 49 38.1 1950 52.134.002 17 24 40.61 -40 52 19.6 +347-02.1 * IRAS17211-4049 17 21 09.7 -40 49 36. 1950 Ko,Ku (1999) 17 24 40.51 -40 52 17.5 +347-02.1 * IRAS17211-4049 17 21 08.4 -40 49 34. 1950 IRAS17211-4049 17 24 39.21 -40 52 15.6 +355+02.3 Th 3-11 17 21 12.0 -31 40 37. 1950 CGPN/Koal 65 17 24 26.51 -31 43 18.9 +355+02.3 Th 3-11 17 21 11.6 -31 40 39. 1950 70.002.006 17 24 26.11 -31 43 20.9 +355+02.3 Th 3-11 17 24 26.52 -31 43 20.0 2000 70.002.006 rad 17 24 26.52 -31 43 20.0 +355+02.3 Th 3-11 17 21 12.4 -31 40 39. 1950 IRAS17212-3140 17 24 26.91 -31 43 20.9 +357+03.1 M 3-7 17 21 23. -29 21 37. 1950 CGPN/Mi 59 17 24 33.92 -29 24 18.2 +357+03.1 M 3-7 17 21 23.5 -29 21 44. 1950 CGPN/Fc 62 17 24 34.42 -29 24 25.2 +357+03.1 M 3-7 17 21 23.6 -29 21 38. 1950 CGPN/Koal 65 17 24 34.52 -29 24 19.2 +357+03.1 M 3-7 17 21 23.44 -29 21 37.6 1950 25.135.020 17 24 34.36 -29 24 18.8 +357+03.1 M 3-7 17 21 23.6 -29 21 33. 1950 18.133.025 17 24 34.52 -29 24 14.2 +357+03.1 M 3-7 17 21 23.5 -29 21 38. 1950 50.134.178 17 24 34.42 -29 24 19.2 +357+03.1 M 3-7 17 21 23.5 -29 21 38. 1950 70.002.006 17 24 34.42 -29 24 19.2 +357+03.1 M 3-7 17 24 34.43 -29 24 20.1 2000 70.002.006 rad 17 24 34.43 -29 24 20.1 +355+02.2 Th 3-10 17 21 27.8 -30 49 19. 1950 CGPN/Koal 65 17 24 40.97 -30 51 59.8 +355+02.2 Th 3-10 17 21 27.7 -30 49 20. 1950 46.134.040 17 24 40.87 -30 52 00.8 +355+02.2 Th 3-10 17 21 27.7 -30 49 17. 1950 50.134.178 17 24 40.87 -30 51 57.8 +355+02.2 Th 3-10 17 21 27.5 -30 49 17. 1950 70.002.006 17 24 40.67 -30 51 57.8 +355+02.2 Th 3-10 17 24 40.96 -30 52 00.3 2000 70.002.006 rad 17 24 40.96 -30 52 00.3 +355+02.2 Th 3-10 17 21 26.3 -30 49 20. 1950 IRAS17214-3049 17 24 39.47 -30 52 00.9 +357+03.6 * Ta 69 17 21 31. -28 41 48. 1950 46.155.079 17 24 40.92 -28 44 28.7 +357+03.6 * Ta 69 17 21 30.9 -28 41 49. 1950 Ko,Ku (1999) 17 24 40.82 -28 44 29.7 +358+04.1 M 3-8 17 21 43.1 -28 03 13. 1950 CGPN/Mi 59 17 24 52.07 -28 05 52.9 +358+04.1 M 3-8 17 21 42.9 -28 03 14. 1950 CGPN/Fc 62 17 24 51.87 -28 05 53.9 +358+04.1 M 3-8 17 21 43.2 -28 03 15. 1950 CGPN/Koal 65 17 24 52.17 -28 05 54.9 +358+04.1 M 3-8 17 21 43.1 -28 03 18. 1950 10.114.152 17 24 52.07 -28 05 57.9 +358+04.1 M 3-8 17 21 43.2 -28 03 15. 1950 18.133.025 17 24 52.17 -28 05 54.9 +358+04.1 M 3-8 17 21 43.1 -28 03 14. 1950 46.134.040 17 24 52.07 -28 05 53.9 +358+04.1 M 3-8 17 21 43.2 -28 03 14. 1950 50.134.178 17 24 52.17 -28 05 53.9 +358+04.1 M 3-8 17 21 43.2 -28 03 15. 1950 70.002.006 17 24 52.17 -28 05 54.9 +358+04.1 M 3-8 17 24 51.98 -28 05 53.1 2000 70.002.006 rad 17 24 51.98 -28 05 53.1 +358+04.1 M 3-8 17 21 42.7 -28 03 17. 1950 IRAS17217-2803 17 24 51.67 -28 05 56.9 +003+07.1 H 2-8 17 21 46.2 -21 31 04. 1950 CGPN/Koal 65 17 24 46.02 -21 33 44.0 +003+07.1 H 2-8 17 21 46.2 -21 30 58. 1950 70.002.006 17 24 46.02 -21 33 38.0 +003+07.1 H 2-8 17 24 45.55 -21 33 36.9 2000 70.002.006 rad 17 24 45.55 -21 33 36.9 +355+02.4 Ta 138 17 25 03.4 -31 28 38. 2000 58.134.011 17 25 03.4 -31 28 38. +355+02.4 Ta 138 17 21 49.4 -31 26 00. 1950 Ko,Ku (1999) 17 25 03.54 -31 28 39.2 +356+03.1 Th 3-12 17 21 54.6 -29 42 38. 1950 CGPN/Koal 65 17 25 06.06 -29 45 17.0 +356+03.1 Th 3-12 17 21 54.7 -29 42 38. 1950 46.134.040 17 25 06.16 -29 45 16.9 +356+03.1 Th 3-12 17 21 54.6 -29 42 37. 1950 50.134.178 17 25 06.06 -29 45 16.0 +356+03.1 Th 3-12 17 21 54.5 -29 42 36. 1950 70.002.006 17 25 05.96 -29 45 15.0 +356+03.1 Th 3-12 17 25 06.00 -29 45 19.0 2000 70.002.006 rad 17 25 06.00 -29 45 19.0 +356+03.1 Th 3-12 17 21 55.0 -29 42 26. 1950 IRAS17219-2942 17 25 06.46 -29 45 04.9 +356+02.1 Th 3-13 17 22 06.5 -30 38 04. 1950 46.134.040 17 25 19.39 -30 40 42.0 +356+02.1 Th 3-13 17 22 06.3 -30 38 03. 1950 70.002.006 17 25 19.19 -30 40 41.1 +356+02.1 Th 3-13 17 25 19.64 -30 40 41.1 2000 70.002.006 rad 17 25 19.64 -30 40 41.1 +356+02.1 Th 3-13 17 22 06.1 -30 38 05. 1950 IRAS17221-3038 17 25 18.99 -30 40 43.1 +359+05.3 TaJu 19 17 22 17.4 -26 09 16. 1950 70.002.006 17 25 23.62 -26 11 53.5 +359+05.3 TaJu 19 17 25 23.50 -26 11 59.0 2000 70.002.006 rad 17 25 23.50 -26 11 59.0 +359+05.3 TaJu 19 17 22 17.4 -26 09 17. 1950 Ko,Ku (1999) 17 25 23.62 -26 11 54.5 +345-04.1 Cn 1-3 17 22 34.7 -44 08 53. 1950 Wr (1966) 17 26 12.62 -44 11 28.1 +345-04.1 Cn 1-3 17 22 34.2 -44 08 50. 1950 08.114.108 17 26 12.11 -44 11 25.2 +345-04.1 Cn 1-3 17 22 34.7 -44 08 51. 1950 IRAS17225-4408 17 26 12.61 -44 11 26.1 +359+04.1 Th 3-14 17 22 36.9 -26 55 12. 1950 CGPN/Koal 65 17 25 44.23 -26 57 48.1 +359+04.1 Th 3-14 17 22 36.7 -26 55 12. 1950 46.134.040 17 25 44.03 -26 57 48.1 +359+04.1 Th 3-14 17 22 36.8 -26 55 11. 1950 50.134.178 17 25 44.13 -26 57 47.1 +359+04.1 Th 3-14 17 22 36.7 -26 55 12.1 1950 52.134.002 17 25 44.03 -26 57 48.2 +359+04.1 Th 3-14 17 22 36.7 -26 55 11. 1950 70.002.006 17 25 44.03 -26 57 47.1 +359+04.1 Th 3-14 17 25 44.10 -26 57 52.7 2000 70.002.006 rad 17 25 44.10 -26 57 52.7 +359+04.1 Th 3-14 17 22 37.3 -26 55 13. 1950 IRAS17226-2655 17 25 44.63 -26 57 49.0 +359+05.2 M 3-9 17 22 37. -26 09 24. 1950 CGPN/Mi 59 17 25 43.23 -26 12 00.1 +359+05.2 M 3-9 17 22 37.2 -26 09 18. 1950 CGPN/Koal 65 17 25 43.43 -26 11 54.1 +359+05.2 M 3-9 17 22 37.2 -26 09 18. 1950 18.133.025 17 25 43.43 -26 11 54.1 +359+05.2 M 3-9 17 22 37.1 -26 09 19. 1950 46.134.040 17 25 43.33 -26 11 55.1 +359+05.2 M 3-9 17 22 37.0 -26 09 17. 1950 50.134.178 17 25 43.23 -26 11 53.1 +359+05.2 M 3-9 17 22 37.1 -26 09 20. 1950 70.002.006 17 25 43.33 -26 11 56.1 +359+05.2 M 3-9 17 25 43.34 -26 11 55.6 2000 70.002.006 rad 17 25 43.34 -26 11 55.6 +359+05.2 M 3-9 17 22 37.2 -26 09 19. 1950 IRAS17226-2609 17 25 43.43 -26 11 55.1 +357+03.2 M 3-41 17 22 49. -29 19 22. 1950 CGPN/Mi 59 17 25 59.90 -29 21 57.1 +357+03.2 M 3-41 17 22 48.9 -29 19 17. 1950 CGPN/Fc 62 17 25 59.79 -29 21 52.1 +357+03.2 M 3-41 17 22 49.0 -29 19 14. 1950 CGPN/Koal 65 17 25 59.89 -29 21 49.1 +357+03.2 M 3-41 17 22 48.5 -29 19 17. 1950 10.114.152 17 25 59.39 -29 21 52.1 +357+03.2 M 3-41 17 22 48.9 -29 19 15. 1950 70.002.006 17 25 59.79 -29 21 50.1 +357+03.2 M 3-41 17 25 59.63 -29 21 51.3 2000 70.002.006 rad 17 25 59.63 -29 21 51.3 +357+03.2 M 3-41 17 22 48.7 -29 19 17. 1950 IRAS17228-2919 17 25 59.59 -29 21 52.1 +352+00.1 H 1-12 17 23 04.3 -34 59 07. 1950 CGPN/Koal 65 17 26 24.33 -35 01 40.6 +352+00.1 H 1-12 17 23 04.2 -34 59 08. 1950 50.134.178 17 26 24.23 -35 01 41.6 +352+00.1 H 1-12 17 23 04.09 -34 58 59.7 1950 52.002.040 17 26 24.12 -35 01 33.4 +352+00.1 H 1-12 17 23 04.26 -34 59 06.1 1950 61.155.065 17 26 24.29 -35 01 39.7 +352+00.1 H 1-12 17 23 04.2 -34 59 07. 1950 70.002.006 17 26 24.23 -35 01 40.6 +352+00.1 H 1-12 17 26 24.34 -35 01 41.8 2000 70.002.006 rad 17 26 24.34 -35 01 41.8 +352+00.1 H 1-12 17 23 04.5 -34 59 06. 1950 IRAS17230-3459 17 26 24.53 -35 01 39.6 +343-05.1 SB 30 17 27 02.2 -45 32 39.7 2000 71.134.030 17 27 02.2 -45 32 39.7 +343-05.1 SB 30 17 23 21.5 -45 30 08. 1950 Ko,Ku (1999) 17 27 02.56 -45 32 39.7 +007+10.1 * MaC 1-4 17 23 44.43 -16 45 57.3 1950 22.135.002 17 26 38.14 -16 48 29.0 +007+10.1 * MaC 1-4 17 23 44.4 -16 45 57. 1950 70.002.006 17 26 38.11 -16 48 28.7 +357+03.4 M 3-42 17 23 49. -29 13 03. 1950 CGPN/Mi 59 17 26 59.76 -29 15 33.7 +357+03.4 M 3-42 17 23 49.2 -29 13 00. 1950 CGPN/Koal 65 17 26 59.96 -29 15 30.7 +357+03.4 M 3-42 17 23 49.07 -29 13 01.3 1950 25.135.020 17 26 59.83 -29 15 32.0 +357+03.4 M 3-42 17 23 49.1 -29 13 01. 1950 50.134.178 17 26 59.86 -29 15 31.7 +357+03.4 M 3-42 17 23 49.1 -29 13 01. 1950 70.002.006 17 26 59.86 -29 15 31.7 +357+03.4 M 3-42 17 26 59.70 -29 15 34.4 2000 70.002.006 rad 17 26 59.70 -29 15 34.4 +357+03.4 M 3-42 17 23 49.7 -29 13 05. 1950 IRAS17238-2913 17 27 00.46 -29 15 35.7 +358+04.3 SrWe 2 17 23 46.5 -27 38 10. 1950 43.134.030 * 17 26 54.90 -27 40 41.0 +358+04.3 SrWe 2 17 23 51.2 -27 38 09. 1950 46.134.040 17 26 59.60 -27 40 39.7 +358+04.3 SrWe 2 17 24 02.2 -27 41 27. 1950 50.134.178 17 27 10.69 -27 43 56.9 +358+04.3 SrWe 2 17 23 51.8 -27 38 07. 1950 70.002.006 17 27 00.20 -27 40 37.6 +358+04.3 SrWe 2 17 27 00.24 -27 40 33.7 2000 70.002.006 rad 17 27 00.24 -27 40 33.7 +358+04.3 SrWe 2 17 23 51.9 -27 38 07. 1950 Ko,Ku (1999) 17 27 00.30 -27 40 37.6 +358+04.3 SrWe 2 17 23 51.9 -27 38 09. 1950 IRAS17238-2738 17 27 00.30 -27 40 39.6 +358+04.2 Th 3-15 Ae 17 24 02.2 -27 41 29. 1950 25.135.029 * 17 27 10.69 -27 43 58.9 +358+04.2 Th 3-15 Ae 17 24 02.0 -27 41 27. 1950 70.002.006 17 27 10.49 -27 43 56.9 +358+04.2 Th 3-15 Ae 17 27 10.56 -27 44 03.1 2000 70.002.006 rad 17 27 10.56 -27 44 03.1 +358+04.2 Th 3-15 Ae 17 24 02.2 -27 41 29. 1950 Ko,Ku (1999) 17 27 10.69 -27 43 58.9 +358+04.2 Th 3-15 Th 17 24 01.7 -27 41 36. 1950 Ko,Ku (1999) 17 27 10.19 -27 44 05.9 +342-06.1 Cn 1-4 17 24 04.1 -46 53 10. 1950 Wr (1966) 17 27 48.52 -46 55 38.5 +342-06.1 Cn 1-4 17 24 04.4 -46 53 12. 1950 08.114.108 17 27 48.82 -46 55 40.5 +342-06.1 Cn 1-4 17 24 03.6 -46 53 13. 1950 IRAS17240-4653 17 27 48.03 -46 55 41.5 +358+03.1 M 3-10 17 24 11. -28 25 23. 1950 CGPN/Mi 59 17 27 20.58 -28 27 52.2 +358+03.1 M 3-10 17 24 10.6 -28 25 19. 1950 CGPN/Fc 62 17 27 20.17 -28 27 48.2 +358+03.1 M 3-10 17 24 10.6 -28 25 22. 1950 CGPN/Koal 65 17 27 20.17 -28 27 51.2 +358+03.1 M 3-10 17 24 11.0 -28 25 22. 1950 18.133.025 17 27 20.57 -28 27 51.2 +358+03.1 M 3-10 17 24 10.64 -28 25 22.1 1950 25.135.020 17 27 20.21 -28 27 51.3 +358+03.1 M 3-10 17 24 10.6 -28 25 22. 1950 46.134.040 17 27 20.17 -28 27 51.2 +358+03.1 M 3-10 17 24 10.6 -28 25 23. 1950 70.002.006 17 27 20.17 -28 27 52.2 +358+03.1 M 3-10 17 27 20.13 -28 27 51.2 2000 70.002.006 rad 17 27 20.13 -28 27 51.2 +358+03.1 M 3-10 17 24 09.7 -28 25 23. 1950 IRAS17241-2825 17 27 19.27 -28 27 52.3 +358+03.2 H 2-10 17 24 23. -28 28 40. 1950 CGPN/Mi 59 17 27 32.66 -28 31 08.3 +358+03.2 H 2-10 17 24 23.2 -28 28 39. 1950 CGPN/Koal 65 17 27 32.86 -28 31 07.3 +358+03.2 H 2-10 17 24 23.12 -28 28 38.6 1950 25.135.020 17 27 32.78 -28 31 06.9 +358+03.2 H 2-10 17 24 23.2 -28 28 38. 1950 46.134.040 17 27 32.86 -28 31 06.3 +358+03.2 H 2-10 17 24 23.2 -28 28 38. 1950 50.134.178 17 27 32.86 -28 31 06.3 +358+03.2 H 2-10 17 24 23.2 -28 28 39. 1950 70.002.006 17 27 32.86 -28 31 07.3 +358+03.2 H 2-10 17 27 32.82 -28 31 07.3 2000 70.002.006 rad 17 27 32.82 -28 31 07.3 +358+03.2 H 2-10 17 24 22.0 -28 28 39. 1950 IRAS17243-2828 17 27 31.66 -28 31 07.4 +358+03.9 * Ae 2-B 17 24 37.9 -28 08 36. 1950 25.135.029 * 17 27 47.07 -28 11 03.3 +358+03.9 * Ae 2-B 17 24 37.8 -28 08 35. 1950 70.002.006 17 27 46.97 -28 11 02.3 +358+03.9 * Ae 2-B 17 24 38.0 -28 08 35. 1950 Ko,Ku (1999) 17 27 47.17 -28 11 02.3 +002+06.1 * IRAS17248-2254 17 24 51.9 -22 54 53. 1950 46.134.040 * 17 27 53.65 -22 57 19.5 +002+06.1 * IRAS17248-2254 17 24 51.9 -22 54 51. 1950 70.002.006 17 27 53.65 -22 57 17.5 +002+06.1 * IRAS17248-2254 17 24 52.2 -22 54 53. 1950 Ko,Ku (1999) 17 27 53.95 -22 57 19.5 +002+06.1 * IRAS17248-2254 17 24 52.1 -22 54 54. 1950 IRAS17248-2254 17 27 53.85 -22 57 20.5 +001+05.1 H 1-14 17 24 58.0 -24 22 58. 1950 CGPN/Koal 65 * 17 28 01.77 -24 25 24.0 +001+05.1 H 1-14 17 24 58.0 -24 22 58. 1950 50.134.178 17 28 01.77 -24 25 24.0 +001+05.1 H 1-14 17 24 58.00 -24 22 56.6 1950 61.134.050 17 28 01.77 -24 25 22.6 +001+05.1 H 1-14 17 24 58.1 -24 22 57. 1950 70.002.006 17 28 01.87 -24 25 23.0 +001+05.1 H 1-14 17 28 01.74 -24 25 23.5 2000 70.002.006 rad 17 28 01.74 -24 25 23.5 +001+05.1 H 1-14 17 24 58.1 -24 22 58. 1950 Ko,Ku (1999) 17 28 01.87 -24 25 24.0 +001+05.1 H 1-14 old 17 24 58.1 -24 23 26. 1950 Ko,Ku (1999) 17 28 01.88 -24 25 52.0 +001+05.1 H 1-14 old 17 24 58.4 -24 23 02. 1950 IRAS17249-2423 17 28 02.18 -24 25 28.0 +352-00.1 H 1-13 17 25 07.3 -35 05 06. 1950 CGPN/Koal 65 17 28 27.56 -35 07 30.8 +352-00.1 H 1-13 17 25 07.3 -35 05 05. 1950 50.134.178 17 28 27.56 -35 07 29.8 +352-00.1 H 1-13 17 25 07.05 -35 04 54.7 1950 52.002.040 17 28 27.31 -35 07 19.5 +352-00.1 H 1-13 17 25 07.37 -35 05 06.3 1950 61.134.050 17 28 27.63 -35 07 31.1 +352-00.1 H 1-13 17 25 07.16 -35 04 59.8 1950 61.155.065 17 28 27.42 -35 07 24.6 +352-00.1 H 1-13 17 25 07.2 -35 05 07. 1950 70.002.006 17 28 27.46 -35 07 31.8 +352-00.1 H 1-13 17 28 27.66 -35 07 30.4 2000 70.002.006 rad 17 28 27.66 -35 07 30.4 +352-00.1 H 1-13 17 25 07.4 -35 05 07. 1950 IRAS17251-3505 17 28 27.66 -35 07 31.8 +358+03.3 Th 3-19 17 25 32.17 -28 24 55.7 1950 25.135.020 17 28 41.76 -28 27 19.0 +358+03.3 Th 3-19 17 25 32.2 -28 24 56. 1950 25.135.029 17 28 41.79 -28 27 19.3 +358+03.3 Th 3-19 17 25 32.24 -28 24 56.0 1950 34.134.032 17 28 41.83 -28 27 19.3 +358+03.3 Th 3-19 17 25 32.3 -28 24 56. 1950 46.134.040 17 28 41.89 -28 27 19.3 +358+03.3 Th 3-19 17 25 32.2 -28 24 56. 1950 70.002.006 17 28 41.79 -28 27 19.3 +358+03.3 Th 3-19 17 28 42.40 -28 27 22.0 2000 70.002.006 rad 17 28 42.40 -28 27 22.0 +001+05.2 H 1-15 17 25 33.3 -24 48 45. 1950 CGPN/Koal 65 17 28 37.69 -24 51 08.4 +001+05.2 H 1-15 17 25 33.2 -24 48 44. 1950 46.134.040 17 28 37.58 -24 51 07.4 +001+05.2 H 1-15 17 25 33.2 -24 48 43. 1950 50.134.178 17 28 37.58 -24 51 06.4 +001+05.2 H 1-15 17 25 33.33 -24 48 42.5 1950 61.134.050 17 28 37.71 -24 51 05.9 +001+05.2 H 1-15 17 25 33.3 -24 48 43. 1950 70.002.006 17 28 37.68 -24 51 06.4 +001+05.2 H 1-15 17 28 37.52 -24 51 07.2 2000 70.002.006 rad 17 28 37.52 -24 51 07.2 +001+05.2 H 1-15 17 25 33.9 -24 48 44. 1950 IRAS17255-2448B 17 28 38.28 -24 51 07.4 +357+02.5 M 4-4 17 25 38.2 -30 05 23. 1950 CGPN/Koal 65 * 17 28 50.34 -30 07 45.8 +357+02.5 M 4-4 17 25 38.3 -30 05 22. 1950 46.134.040 17 28 50.44 -30 07 44.8 +357+02.5 M 4-4 17 25 38.2 -30 05 22. 1950 70.002.006 17 28 50.34 -30 07 44.8 +357+02.5 M 4-4 17 28 50.35 -30 07 45.1 2000 70.002.006 rad 17 28 50.35 -30 07 45.1 +357+02.5 M 4-4 17 25 38.4 -30 05 23. 1950 Ko,Ku (1999) 17 28 50.54 -30 07 45.8 +011+11.1 M 2-13 17 25 44. -13 23 56. 1950 CGPN/Mi 59 17 28 33.56 -13 26 19.2 +011+11.1 M 2-13 17 25 44.6 -13 23 49. 1950 30.135.052 17 28 34.16 -13 26 12.1 +011+11.1 M 2-13 17 25 44.63 -13 23 57.4 1950 52.002.003 17 28 34.19 -13 26 20.5 +011+11.1 M 2-13 17 25 44.60 -13 23 57.7 1950 54.134.034 17 28 34.16 -13 26 20.8 +011+11.1 M 2-13 17 25 44.6 -13 23 58. 1950 70.002.006 17 28 34.16 -13 26 21.1 +011+11.1 M 2-13 17 28 34.34 -13 26 20.1 2000 70.002.006 rad 17 28 34.34 -13 26 20.1 +011+11.1 M 2-13 17 25 45.0 -13 23 59. 1950 IRAS17257-1323 17 28 34.56 -13 26 22.1 +006+08.1 M 1-20 17 26 01. -19 13 31. 1950 CGPN/Mi 59 17 28 57.88 -19 15 52.7 +006+08.1 M 1-20 17 26 00.7 -19 13 31. 1950 CGPN/Koal 65 17 28 57.58 -19 15 52.7 +006+08.1 M 1-20 17 26 00.7 -19 13 31. 1950 30.135.052 17 28 57.58 -19 15 52.7 +006+08.1 M 1-20 17 26 00.70 -19 13 31.5 1950 34.134.032 17 28 57.58 -19 15 53.2 +006+08.1 M 1-20 17 26 00.74 -19 13 32.1 1950 52.002.003 17 28 57.62 -19 15 53.8 +006+08.1 M 1-20 17 26 00.69 -19 13 37.7 1950 54.134.034 17 28 57.57 -19 15 59.4 +006+08.1 M 1-20 17 26 00.8 -19 13 32. 1950 70.002.006 17 28 57.68 -19 15 53.7 +006+08.1 M 1-20 17 28 57.62 -19 15 54.0 2000 70.002.006 rad 17 28 57.62 -19 15 54.0 +006+08.1 M 1-20 17 26 00.4 -19 13 32. 1950 IRAS17260-1913 17 28 57.28 -19 15 53.7 +009+10.1 A 41 17 26 10.1 -15 10 43. 1950 50.134.178 * 17 29 01.85 -15 13 04.2 +009+10.1 A 41 17 26 10.3 -15 10 43. 1950 70.002.006 17 29 02.05 -15 13 04.2 +009+10.1 A 41 17 29 01.89 -15 13 03.4 2000 70.002.006 rad 17 29 01.89 -15 13 03.4 +000+04.2 H 1-16 17 26 16.7 -26 23 45. 1950 CGPN/Koal 65 17 29 23.35 -26 26 05.2 +000+04.2 H 1-16 17 26 16.7 -26 23 44. 1950 46.134.040 17 29 23.35 -26 26 04.2 +000+04.2 H 1-16 17 26 16.76 -26 23 44.2 1950 61.134.050 17 29 23.41 -26 26 04.4 +000+04.2 H 1-16 17 26 16.8 -26 23 45. 1950 70.002.006 17 29 23.45 -26 26 05.2 +000+04.2 H 1-16 17 29 23.37 -26 26 05.4 2000 70.002.006 rad 17 29 23.37 -26 26 05.4 +000+04.2 H 1-16 17 26 17.1 -26 23 44. 1950 IRAS17262-2623 17 29 23.75 -26 26 04.2 +002+05.1 NGC 6369 17 22 01.87 -23 39 33.3 1880 CGPN/Wn 09 17 29 20.38 -23 45 32.2 +002+05.1 NGC 6369 17 23 15.59 -23 40 37.1 1900 CGPN/Po 10 17 29 21.09 -23 45 30.8 +002+05.1 NGC 6369 17 26 17.5 -23 43 15. 1950 CGPN/Koal 65 17 29 20.38 -23 45 35.3 +002+05.1 NGC 6369 17 26 17.9 -23 43 12. 1950 09.133.025 17 29 20.78 -23 45 32.3 +002+05.1 NGC 6369 17 26 17.65 -23 43 20. 1950 11.133.008 17 29 20.53 -23 45 40.3 +002+05.1 NGC 6369 17 26 17.60 -23 43 13.7 1950 61.134.050 17 29 20.48 -23 45 34.0 +002+05.1 NGC 6369 17 26 17.6 -23 43 14. 1950 70.002.006 17 29 20.48 -23 45 34.3 +002+05.1 NGC 6369 17 29 20.49 -23 45 35.0 2000 70.002.006 rad 17 29 20.49 -23 45 35.0 +002+05.1 NGC 6369 17 26 17.4 -23 43 14. 1950 IRAS17262-2343 17 29 20.28 -23 45 34.3 +000+04.1 * H 2-11 17 26 20.3 -25 46 46. 1950 CGPN/Koal 65 17 29 26.07 -25 49 06.0 +000+04.1 * H 2-11 17 26 20.1 -25 46 45. 1950 10.114.152 17 29 25.87 -25 49 05.0 +000+04.1 * H 2-11 17 26 20.3 -25 47 03. 1950 31.116.001 17 29 26.07 -25 49 23.0 +000+04.1 * H 2-11 17 26 20.2 -25 46 47. 1950 46.134.040 17 29 25.97 -25 49 07.0 +000+04.1 * H 2-11 17 26 20.24 -25 46 46.2 1950 61.134.050 17 29 26.01 -25 49 06.2 +000+04.1 * H 2-11 17 26 20.2 -25 46 47. 1950 70.002.006 17 29 25.97 -25 49 07.0 +000+04.1 * H 2-11 17 29 25.98 -25 49 08.2 2000 70.002.006 rad 17 29 25.98 -25 49 08.2 +000+04.1 * H 2-11 17 26 20.4 -25 46 48. 1950 IRAS17263-2546 17 29 26.17 -25 49 08.0 +344-06.1 Sa 2-208 17 26 23.2 -45 20 31. 1950 Wr (1966) 17 30 04.01 -45 22 49.6 +344-06.1 Sa 2-208 17 26 23.3 -45 20 33. 1950 Ko,Ku (1999) 17 30 04.11 -45 22 51.6 +358+03.7 H 1-17 17 26 31. -28 38 06. 1950 CGPN/Mi 59 * 17 29 40.94 -28 40 25.1 +358+03.7 H 1-17 17 26 30.8 -28 38 07. 1950 CGPN/Fc 62 17 29 40.74 -28 40 26.1 +358+03.7 H 1-17 17 26 30.7 -28 38 03. 1950 CGPN/Koal 65 17 29 40.64 -28 40 22.1 +358+03.7 H 1-17 17 26 30.56 -28 38 02.3 1950 25.135.020 17 29 40.50 -28 40 21.4 +358+03.7 H 1-17 17 26 30.7 -28 38 29. 1950 50.134.178 17 29 40.65 -28 40 48.1 +358+03.7 H 1-17 17 26 30.65 -28 38 02.8 1950 61.134.050 17 29 40.59 -28 40 21.9 +358+03.7 H 1-17 17 26 30.7 -28 38 03. 1950 70.002.006 17 29 40.64 -28 40 22.1 +358+03.7 H 1-17 17 29 40.36 -28 40 23.7 2000 70.002.006 rad 17 29 40.36 -28 40 23.7 +358+03.7 H 1-17 17 26 30.6 -28 38 03. 1950 IRAS17265-2838 17 29 40.54 -28 40 22.1 +357+02.4 H 1-18 17 26 31.5 -29 30 30. 1950 CGPN/Koal 65 17 29 42.76 -29 32 49.0 +357+02.4 H 1-18 17 26 32.0 -29 30 30. 1950 18.133.025 17 29 43.27 -29 32 49.0 +357+02.4 H 1-18 17 26 31.56 -29 30 31.7 1950 34.134.032 17 29 42.83 -29 32 50.7 +357+02.4 H 1-18 17 26 31.5 -29 30 30. 1950 46.134.040 17 29 42.76 -29 32 49.0 +357+02.4 H 1-18 17 26 31.57 -29 30 31.5 1950 61.134.050 17 29 42.84 -29 32 50.5 +357+02.4 H 1-18 17 26 31.5 -29 30 31. 1950 70.002.006 17 29 42.77 -29 32 50.0 +357+02.4 H 1-18 17 29 42.75 -29 32 50.1 2000 70.002.006 rad 17 29 42.75 -29 32 50.1 +357+02.4 H 1-18 17 26 31.8 -29 30 29. 1950 IRAS17265-2930 17 29 43.06 -29 32 48.0 +000+04.3 * IRAS17267-2608 17 26 46.1 -26 08 55.2 1950 52.134.002 17 29 52.40 -26 11 13.3 +000+04.3 * IRAS17267-2608 17 26 46.12 -26 08 55.1 1950 61.134.050 17 29 52.42 -26 11 13.2 +000+04.3 * IRAS17267-2608 17 29 52.4 -26 11 14. 2000 72.002.012 17 29 52.4 -26 11 14. +000+04.3 * IRAS17267-2608 17 26 46.07 -26 08 55.5 1950 72.002.012 rad 17 29 52.37 -26 11 13.6 +000+04.3 * IRAS17267-2608 17 26 46.2 -26 08 56. 1950 Ko,Ku (1999) 17 29 52.50 -26 11 14.1 +000+04.3 * IRAS17267-2608 17 26 46.1 -26 08 56. 1950 IRAS17267-2608 17 29 52.40 -26 11 14.1 +358+03.4 H 1-19 17 26 53.5 -27 57 03. 1950 CGPN/Fc 62 17 30 02.43 -27 59 20.5 +358+03.4 H 1-19 17 26 53.7 -27 57 00. 1950 CGPN/Koal 65 17 30 02.63 -27 59 17.5 +358+03.4 H 1-19 17 26 53.7 -27 57 01. 1950 10.114.152 17 30 02.63 -27 59 18.5 +358+03.4 H 1-19 17 26 53.59 -27 57 00.3 1950 25.135.020 17 30 02.52 -27 59 17.8 +358+03.4 H 1-19 17 26 53.6 -27 56 58. 1950 31.116.001 17 30 02.53 -27 59 15.5 +358+03.4 H 1-19 17 26 53.6 -27 57 01. 1950 46.134.040 17 30 02.53 -27 59 18.5 +358+03.4 H 1-19 17 26 53.6 -27 57 00. 1950 50.134.178 17 30 02.53 -27 59 17.5 +358+03.4 H 1-19 17 26 53.67 -27 57 00.4 1950 61.134.050 17 30 02.60 -27 59 17.9 +358+03.4 H 1-19 17 26 53.6 -27 57 01. 1950 70.002.006 17 30 02.53 -27 59 18.5 +358+03.4 H 1-19 17 30 02.60 -27 59 17.5 2000 70.002.006 rad 17 30 02.60 -27 59 17.5 +358+03.4 H 1-19 17 26 53.3 -27 56 59. 1950 IRAS17268-2756 17 30 02.23 -27 59 16.5 +003+06.1 * IRAS17269-2235 17 26 57.1 -22 35 18. 1950 Ko,Ku (1999) 17 29 58.44 -22 37 35.5 +003+06.1 * IRAS17269-2235 17 26 57.5 -22 35 25. 1950 IRAS17269-2235 17 29 58.85 -22 37 42.5 +000+04.4 * IRAS17270-2618 17 27 05.7 -26 18 44.7 1950 52.134.002 17 30 12.24 -26 21 01.4 +000+04.4 * IRAS17270-2618 17 27 05.9 -26 18 45. 1950 Ko,Ku (1999) 17 30 12.44 -26 21 01.7 +000+04.4 * IRAS17270-2618 17 27 05.4 -26 18 42. 1950 IRAS17270-2618 17 30 11.94 -26 20 58.7 +359+03.4 Ae 2-E 17 27 06.2 -27 28 04. 1950 25.135.029 17 30 14.42 -27 30 20.6 +359+03.4 Ae 2-E 17 27 06.3 -27 28 04. 1950 61.134.050 17 30 14.52 -27 30 20.6 +359+03.4 Ae 2-E 17 27 06.3 -27 28 03. 1950 70.002.006 17 30 14.52 -27 30 19.6 +359+03.4 Ae 2-E 17 30 14.51 -27 30 20.0 2000 70.002.006 rad 17 30 14.51 -27 30 20.0 +359+03.4 Ae 2-E 17 27 06.4 -27 28 06. 1950 Ko,Ku (1999) 17 30 14.62 -27 30 22.6 +359+03.4 Ae 2-E 17 27 05.6 -27 28 01. 1950 IRAS17270-2728 17 30 13.82 -27 30 17.6 +358+02.2 Th 3-23 17 27 10.8 -29 07 56. 1950 CGPN/Koal 65 17 30 21.51 -29 10 12.2 +358+02.2 Th 3-23 17 27 10.66 -29 07 56.4 1950 61.134.050 17 30 21.37 -29 10 12.6 +358+02.2 Th 3-23 17 27 10.7 -29 07 56. 1950 70.002.006 17 30 21.41 -29 10 12.2 +358+02.2 Th 3-23 17 30 21.39 -29 10 12.7 2000 70.002.006 rad 17 30 21.39 -29 10 12.7 +358+02.2 Th 3-23 17 27 11.5 -29 07 57. 1950 IRAS17271-2907 17 30 22.21 -29 10 13.1 +358+02.4 Ae 2-F 17 27 20.6 -28 33 41. 1950 25.135.029 17 30 30.45 -28 35 56.5 +358+02.4 Ae 2-F 17 27 20.5 -28 33 39. 1950 61.134.050 17 30 30.35 -28 35 54.5 +358+02.4 Ae 2-F 17 27 20.5 -28 33 39. 1950 70.002.006 17 30 30.35 -28 35 54.5 +358+02.4 Ae 2-F 17 30 29.97 -28 35 55.1 2000 70.002.006 rad 17 30 29.97 -28 35 55.1 +358+02.4 Ae 2-F 17 27 20.8 -28 33 41. 1950 Ko,Ku (1999) 17 30 30.65 -28 35 56.5 +358+03.6 H 1-20 17 27 35. -28 01 53. 1950 CGPN/Mi 59 17 30 44.06 -28 04 07.5 +358+03.6 H 1-20 17 27 34.9 -28 01 55. 1950 CGPN/Fc 62 17 30 43.97 -28 04 09.5 +358+03.6 H 1-20 17 27 34.8 -28 01 51. 1950 CGPN/Koal 65 17 30 43.86 -28 04 05.5 +358+03.6 H 1-20 17 27 34.8 -28 01 51. 1950 18.133.025 17 30 43.86 -28 04 05.5 +358+03.6 H 1-20 17 27 34.65 -28 01 52.6 1950 25.135.020 17 30 43.71 -28 04 07.1 +358+03.6 H 1-20 17 27 34.7 -28 01 52. 1950 50.134.178 17 30 43.76 -28 04 06.5 +358+03.6 H 1-20 17 27 34.75 -28 01 52.3 1950 61.134.050 17 30 43.81 -28 04 06.8 +358+03.6 H 1-20 17 27 34.7 -28 01 53. 1950 70.002.006 17 30 43.76 -28 04 07.5 +358+03.6 H 1-20 17 30 43.85 -28 04 06.3 2000 70.002.006 rad 17 30 43.85 -28 04 06.3 +358+03.6 H 1-20 17 27 35.9 -28 01 53. 1950 IRAS17275-2801 17 30 44.97 -28 04 07.4 +002+05.2 K 5-3 17 27 38.4 -23 42 45. 1950 61.134.050 17 30 41.29 -23 44 59.5 +002+05.2 K 5-3 17 27 38.5 -23 42 46. 1950 Ko,Ku (1999) 17 30 41.39 -23 45 00.5 +357+02.7 Th 3-24 17 27 39.0 -30 15 00. 1950 CGPN/Koal 65 17 30 51.43 -30 17 14.1 +357+02.7 Th 3-24 17 27 38.8 -30 14 58. 1950 61.134.050 17 30 51.23 -30 17 12.1 +357+02.7 Th 3-24 17 27 39.0 -30 14 58. 1950 70.002.006 17 30 51.43 -30 17 12.1 +359+03.2 Th 3-25 17 27 39.1 -27 03 45. 1950 CGPN/Koal 65 17 30 46.74 -27 05 59.2 +359+03.2 Th 3-25 17 27 39.1 -27 03 45. 1950 50.134.178 17 30 46.74 -27 05 59.2 +359+03.2 Th 3-25 17 27 39.13 -27 03 44.9 1950 61.134.050 17 30 46.77 -27 05 59.1 +359+03.2 Th 3-25 17 27 39.1 -27 03 46. 1950 70.002.006 17 30 46.74 -27 06 00.2 +359+03.2 Th 3-25 17 30 46.51 -27 06 02.5 2000 70.002.006 rad 17 30 46.51 -27 06 02.5 +359+03.2 Th 3-25 17 27 38.9 -27 03 45. 1950 IRAS17276-2703 17 30 46.54 -27 05 59.3 +356+01.2 Th 3-55 17 27 45.2 -30 58 53. 1950 CGPN/Koal 65 * 17 30 58.77 -31 01 06.6 +356+01.2 Th 3-55 17 27 45.24 -30 58 52.1 1950 54.134.034 17 30 58.81 -31 01 05.7 +356+01.2 Th 3-55 17 27 45.29 -30 58 52.5 1950 55.002.049 17 30 58.86 -31 01 06.1 +356+01.2 Th 3-55 17 27 45.27 -30 58 52.5 1950 61.134.050 17 30 58.84 -31 01 06.1 +356+01.2 Th 3-55 17 27 45.2 -30 58 52. 1950 70.002.006 17 30 58.77 -31 01 05.6 +356+01.2 Th 3-55 17 30 59.20 -31 01 02.4 2000 70.002.006 rad 17 30 59.20 -31 01 02.4 +357+02.6 H 2-13 17 27 56. -30 08 16. 1950 CGPN/Mi 59 17 31 08.26 -30 10 28.9 +357+02.6 H 2-13 17 27 55.8 -30 08 15. 1950 CGPN/Koal 65 17 31 08.06 -30 10 27.9 +357+02.6 H 2-13 17 27 55.83 -30 08 15.4 1950 61.134.050 17 31 08.09 -30 10 28.3 +357+02.6 H 2-13 17 27 55.8 -30 08 15. 1950 70.002.006 17 31 08.06 -30 10 27.9 +357+02.6 H 2-13 17 31 08.23 -30 10 27.7 2000 70.002.006 rad 17 31 08.23 -30 10 27.7 +358+03.8 Th 3-26 17 27 59.5 -28 12 48. 1950 CGPN/Koal 65 * 17 31 08.84 -28 15 00.7 +358+03.8 Th 3-26 17 26 59.80 -28 12 36.6 1950 25.135.020 17 30 09.12 -28 14 53.6 +358+03.8 Th 3-26 17 28 00.0 -28 12 39. 1950 50.134.178 17 31 09.34 -28 14 51.7 +358+03.8 Th 3-26 17 27 59.9 -28 12 37. 1950 61.134.050 17 31 09.24 -28 14 49.7 +358+03.8 Th 3-26 17 28 00.1 -28 12 36. 1950 70.002.006 17 31 09.44 -28 14 48.7 +358+03.8 Th 3-26 17 31 09.38 -28 14 50.5 2000 70.002.006 rad 17 31 09.38 -28 14 50.5 +358+02.5 * HtDe 8 17 28 36.9 -28 39 47. 1950 43.134.029 * 17 31 46.93 -28 41 57.0 +358+02.5 * HtDe 8 17 28 37.0 -28 39 57. 1950 61.134.050 17 31 47.03 -28 42 07.0 +358+02.5 * HtDe 8 17 28 37.3 -28 39 54. 1950 70.002.006 17 31 47.33 -28 42 04.0 +358+02.5 * HtDe 8 17 31 47.30 -28 42 03.5 2000 70.002.006 rad 17 31 47.30 -28 42 03.5 +358+02.5 * HtDe 8 17 28 37.2 -28 39 51. 1950 Ko,Ku (1999) 17 31 47.23 -28 42 01.0 +358+02.5 * HtDe 8 17 28 36.2 -28 39 53. 1950 IRAS17286-2839 17 31 46.23 -28 42 03.0 +016+13.1 A 42 17 28 45.8 -08 16 59. 1950 70.002.006 17 31 29.25 -08 19 09.3 +016+13.1 A 42 17 31 28.82 -08 19 12.2 2000 70.002.006 rad 17 31 28.82 -08 19 12.2 +016+13.1 A 42 17 28 45.7 -08 16 59. 1950 Ko,Ku (1999) 17 31 29.15 -08 19 09.3 +349-03.1 H 2-14 17 28 51.0 -39 49 14.4 1950 52.134.002 17 32 20.08 -39 51 22.7 +349-03.1 H 2-14 17 28 50.9 -39 49 15. 1950 70.002.006 17 32 19.98 -39 51 23.3 +349-03.1 H 2-14 17 32 20.11 -39 51 23.2 2000 70.002.006 rad 17 32 20.11 -39 51 23.2 +349-03.1 H 2-14 17 28 51.2 -39 49 18. 1950 Ko,Ku (1999) 17 32 20.28 -39 51 26.3 +349-03.1 H 2-14 17 28 50.9 -39 49 14. 1950 IRAS17288-3949 17 32 19.98 -39 51 22.3 +004+06.3 * G 4.4+6.4 17 32 00.14 -21 49 13.3 2000 62.134.037 * 17 32 00.14 -21 49 13.3 +004+06.3 * G 4.4+6.4 17 28 51.4 -21 47 32. 1950 Ko,Ku (1999) 17 31 51.70 -21 49 41.3 +350-02.1 H 1-22 17 28 56.8 -37 55 15. 1950 CGPN/Koal 65 17 32 22.25 -37 57 23.0 +350-02.1 H 1-22 17 28 56.7 -37 55 17. 1950 Wr (1966) 17 32 22.15 -37 57 25.0 +350-02.1 H 1-22 17 28 56.6 -37 55 15. 1950 70.002.006 17 32 22.05 -37 57 23.0 +350-02.1 H 1-22 17 32 22.17 -37 57 24.3 2000 70.002.006 rad 17 32 22.17 -37 57 24.3 +350-02.1 H 1-22 17 28 56.9 -37 55 17. 1950 IRAS17289-3755 17 32 22.35 -37 57 25.0 +359+02.5 Ae 2-G 17 29 13.2 -28 12 23. 1950 25.135.029 17 32 22.56 -28 14 30.4 +359+02.5 Ae 2-G 17 29 13.19 -28 12 21.5 1950 61.134.050 17 32 22.55 -28 14 28.9 +359+02.5 Ae 2-G 17 29 13.3 -28 12 19. 1950 70.002.006 17 32 22.66 -28 14 26.4 +359+02.5 Ae 2-G 17 29 13.4 -28 12 23. 1950 Ko,Ku (1999) 17 32 22.76 -28 14 30.4 +348-04.1 H 1-21 17 29 16.5 -40 56 23. 1950 CGPN/Koal 65 * 17 32 47.82 -40 58 29.4 +348-04.1 H 1-21 17 29 16.7 -40 56 23. 1950 Ko,Ku (1999) 17 32 48.02 -40 58 29.4 +357+01.1 H 1-23 17 29 35. -29 58 09. 1950 CGPN/Mi 59 * 17 32 47.04 -30 00 14.7 +357+01.1 H 1-23 17 29 34.9 -29 58 08. 1950 CGPN/Koal 65 17 32 46.94 -30 00 13.7 +357+01.1 H 1-23 17 29 35.0 -29 58 12. 1950 31.116.001 17 32 47.04 -30 00 17.7 +357+01.1 H 1-23 17 29 34.95 -29 58 09.2 1950 34.134.032 17 32 46.99 -30 00 14.9 +357+01.1 H 1-23 17 29 34.74 -29 58 01.3 1950 55.002.049 17 32 46.77 -30 00 07.0 +357+01.1 H 1-23 17 29 34.89 -29 58 08.7 1950 61.134.050 17 32 46.93 -30 00 14.4 +357+01.1 H 1-23 17 29 34.9 -29 58 09. 1950 70.002.006 17 32 46.94 -30 00 14.7 +357+01.1 H 1-23 17 32 46.93 -30 00 16.1 2000 70.002.006 rad 17 32 46.93 -30 00 16.1 +351-01.1 Sa 2-215 17 29 37.3 -36 41 48. 1950 Wr (1966) * 17 33 00.53 -36 43 53.2 +351-01.1 Sa 2-215 17 29 37.44 -36 41 48.1 1950 61.134.050 17 33 00.67 -36 43 53.2 +351-01.1 Sa 2-215 17 29 37.4 -36 41 49. 1950 70.002.006 17 33 00.63 -36 43 54.1 +351-01.1 Sa 2-215 17 33 00.58 -36 43 55.2 2000 70.002.006 rad 17 33 00.58 -36 43 55.2 +351-01.1 Sa 2-215 17 29 37.6 -36 41 49. 1950 Ko,Ku (1999) 17 33 00.83 -36 43 54.1 +351-01.1 Sa 2-215 17 29 38.3 -36 41 46. 1950 IRAS17296-3641 17 33 01.53 -36 43 51.1 +357+01.2 Ae 2-H 17 30 04.3 -30 24 27. 1950 25.135.029 17 33 17.03 -30 26 30.6 +357+01.2 Ae 2-H 17 30 04.2 -30 24 25. 1950 61.134.050 17 33 16.92 -30 26 28.6 +357+01.2 Ae 2-H 17 30 04.3 -30 24 24. 1950 70.002.006 17 33 17.02 -30 26 27.6 +357+01.2 Ae 2-H 17 33 16.85 -30 26 28.8 2000 70.002.006 rad 17 33 16.85 -30 26 28.8 +357+01.2 Ae 2-H 17 30 04.4 -30 24 27. 1950 Ko,Ku (1999) 17 33 17.13 -30 26 30.6 +336-11.1 * MmWe 1-10 17 30 21.6 -54 26 47. 1950 51.134.007 17 34 28.27 -54 28 47.4 +336-11.1 * MmWe 1-10 17 30 21.6 -54 26 58. 1950 Ko,Ku (1999) 17 34 28.28 -54 28 58.4 +004+06.2 H 1-24 17 30 37.2 -21 44 19. 1950 CGPN/Fc 62 17 33 37.45 -21 46 20.6 +004+06.2 H 1-24 17 30 37.4 -21 44 23. 1950 CGPN/Koal 65 17 33 37.65 -21 46 24.6 +004+06.2 H 1-24 17 30 37.3 -21 44 19. 1950 10.114.152 17 33 37.55 -21 46 20.6 +004+06.2 H 1-24 17 30 37.5 -21 44 16. 1950 18.133.025 17 33 37.75 -21 46 17.6 +004+06.2 H 1-24 17 30 37.3 -21 44 22. 1950 50.134.178 17 33 37.55 -21 46 23.6 +004+06.2 H 1-24 17 30 37.35 -21 44 23.7 1950 54.134.034 17 33 37.60 -21 46 25.3 +004+06.2 H 1-24 17 30 37.4 -21 44 23. 1950 70.002.006 17 33 37.65 -21 46 24.6 +004+06.2 H 1-24 17 33 37.88 -21 46 24.4 2000 70.002.006 rad 17 33 37.88 -21 46 24.4 +004+06.2 H 1-24 17 30 37.7 -21 44 24. 1950 IRAS17306-2144 17 33 37.95 -21 46 25.6 +357+01.4 * K 6-2 17 30 37.7 -30 40 34. 1950 61.134.050 17 33 50.86 -30 42 35.1 +357+01.4 * K 6-2 17 30 38.0 -30 40 36. 1950 Ko,Ku (1999) 17 33 51.16 -30 42 37.1 +359+02.6 Ae 2-I 17 31 05.0 -27 54 01. 1950 25.135.029 17 34 13.94 -27 56 00.3 +359+02.6 Ae 2-I 17 31 04.9 -27 54 02. 1950 61.134.050 17 34 13.84 -27 56 01.3 +359+02.6 Ae 2-I 17 31 04.9 -27 54 01. 1950 70.002.006 17 34 13.84 -27 56 00.3 +359+02.6 Ae 2-I 17 34 13.90 -27 56 01.7 2000 70.002.006 rad 17 34 13.90 -27 56 01.7 +359+02.6 Ae 2-I 17 31 05.1 -27 54 03. 1950 Ko,Ku (1999) 17 34 14.04 -27 56 02.3 +359+02.6 Ae 2-I 17 31 04.5 -27 54 04. 1950 IRAS17310-2754 17 34 13.44 -27 56 03.3 +003+05.1 H 2-15 17 31 24.8 -22 51 24. 1950 CGPN/Fc 62 * 17 34 26.57 -22 53 22.1 +003+05.1 H 2-15 17 31 25.0 -22 51 22. 1950 CGPN/Koal 65 17 34 26.77 -22 53 20.1 +003+05.1 H 2-15 17 31 25.0 -22 51 16. 1950 10.114.152 17 34 26.77 -22 53 14.1 +003+05.1 H 2-15 17 31 25.0 -22 51 22. 1950 18.133.025 17 34 26.77 -22 53 20.1 +003+05.1 H 2-15 17 31 25.0 -22 51 22. 1950 50.134.178 17 34 26.77 -22 53 20.1 +003+05.1 H 2-15 17 31 24.98 -22 51 24.9 1950 54.134.034 17 34 26.76 -22 53 23.0 +003+05.1 H 2-15 17 31 25.07 -22 51 21.8 1950 61.134.050 17 34 26.84 -22 53 19.9 +003+05.1 H 2-15 17 31 25.1 -22 51 20. 1950 70.002.006 17 34 26.87 -22 53 18.1 +003+05.1 H 2-15 17 34 26.64 -22 53 31.6 2000 70.002.006 rad 17 34 26.64 -22 53 31.6 +003+05.1 H 2-15 17 31 24.3 -22 51 20. 1950 IRAS17314-2251 17 34 26.07 -22 53 18.2 +000+03.1 He 2-250 17 31 47.8 -26 34 01. 1950 CGPN/Koal 65 17 34 54.79 -26 35 57.3 +000+03.1 He 2-250 17 31 47.75 -26 34 01.3 1950 34.134.032 17 34 54.74 -26 35 57.6 +000+03.1 He 2-250 17 31 47.75 -26 34 00.8 1950 61.134.050 17 34 54.74 -26 35 57.1 +000+03.1 He 2-250 17 31 47.8 -26 34 01. 1950 70.002.006 17 34 54.79 -26 35 57.3 +000+03.1 He 2-250 17 34 54.72 -26 35 58.5 2000 70.002.006 rad 17 34 54.72 -26 35 58.5 +000+03.1 He 2-250 17 31 48.0 -26 34 00. 1950 IRAS17318-2634 17 34 54.99 -26 35 56.3 +358+01.5 JaSt 2 17 31 49.91 -29 20 19.8 1950 Ja,St (1997) 17 35 01.02 -29 22 15.8 +343-07.1 PC 17 17 31 56.8 -46 57 56. 1950 08.114.108 17 35 41.73 -46 59 50.3 +343-07.1 PC 17 17 31 56.3 -46 57 57. 1950 18.133.025 17 35 41.23 -46 59 51.3 +343-07.1 PC 17 17 31 57.8 -46 57 57. 1950 IRAS17319-4657 17 35 42.73 -46 59 51.2 +358+01.1 M 4-6 17 32 03. -29 01 20. 1950 CGPN/Mi 59 17 35 13.64 -29 03 15.1 +358+01.1 M 4-6 17 32 03.5 -29 01 16. 1950 CGPN/Koal 65 17 35 14.13 -29 03 11.0 +358+01.1 M 4-6 17 32 03.41 -29 01 16.0 1950 34.134.032 17 35 14.04 -29 03 11.0 +358+01.1 M 4-6 17 32 03.39 -29 01 15.7 1950 61.134.050 17 35 14.02 -29 03 10.7 +358+01.1 M 4-6 17 32 03.4 -29 01 15. 1950 70.002.006 17 35 14.03 -29 03 10.0 +358+01.1 M 4-6 17 35 14.18 -29 03 09.9 2000 70.002.006 rad 17 35 14.18 -29 03 09.9 +358+01.1 M 4-6 17 32 05.0 -29 01 12. 1950 IRAS17320-2901 17 35 15.63 -29 03 06.9 +353-01.1 * K 6-3 17 32 07.40 -34 45 47.9 1950 61.134.050 17 35 27.29 -34 47 42.3 +353-01.1 * K 6-3 17 32 07.6 -34 45 49. 1950 Ko,Ku (1999) 17 35 27.49 -34 47 43.4 +358+01.3 * H 1-25 17 32 10.6 -29 43 26. 1950 CGPN/Koal 65 17 35 22.31 -29 45 20.5 +358+01.3 * H 1-25 17 32 10.5 -29 43 26. 1950 Wr (1966) 17 35 22.21 -29 45 20.5 +358+01.3 * H 1-25 17 32 10.4 -29 43 27. 1950 10.114.152 17 35 22.11 -29 45 21.5 +358+01.3 * H 1-25 17 32 10.59 -29 43 25.6 1950 61.134.050 17 35 22.30 -29 45 20.1 +358+01.3 * H 1-25 17 32 10.7 -29 43 27. 1950 Ko,Ku (1999) 17 35 22.41 -29 45 21.5 +358+01.3 * H 1-25 17 32 11.1 -29 43 27. 1950 IRAS17321-2943 17 35 22.81 -29 45 21.4 +349-04.1 Lo 16 17 32 10. -40 10 06. 1950 19.135.001 * 17 35 39.86 -40 11 59.9 +349-04.1 Lo 16 17 32 12.3 -40 09 34. 1950 Ko,Ku (1999) 17 35 42.14 -40 11 27.7 +349-04.1 Lo 16 17 32 12.8 -40 09 31. 1950 IRAS17322-4009 17 35 42.64 -40 11 24.7 +358+01.6 JaSt 3 17 32 11.84 -29 20 23.1 1950 Ja,St (1997) 17 35 22.96 -29 22 17.5 +007+07.1 M 1-22 17 32 14. -18 32 25. 1950 CGPN/Mi 59 17 35 10.06 -18 34 19.8 +007+07.1 M 1-22 17 32 14.2 -18 32 26. 1950 CGPN/Koal 65 17 35 10.27 -18 34 20.7 +007+07.1 M 1-22 17 32 14.2 -18 32 26. 1950 50.134.178 17 35 10.27 -18 34 20.7 +007+07.1 M 1-22 17 32 14.1 -18 32 26. 1950 70.002.006 17 35 10.17 -18 34 20.8 +007+07.1 M 1-22 17 35 10.34 -18 34 22.5 2000 70.002.006 rad 17 35 10.34 -18 34 22.5 +007+07.1 M 1-22 17 32 14.4 -18 32 33. 1950 IRAS17322-1832 17 35 10.47 -18 34 27.7 +341-09.1 He 2-248 17 32 15.5 -49 23 52. 1950 08.114.108 17 36 06.79 -49 25 44.7 +341-09.1 He 2-248 17 32 16.3 -49 23 43. 1950 18.133.025 17 36 07.59 -49 25 35.7 +001+03.1 K 5-5 17 32 16.45 -25 40 52.4 1950 61.134.050 17 35 22.18 -25 42 46.6 +001+03.1 K 5-5 17 32 16.32 -25 40 52.4 1950 72.002.012 rad 17 35 22.05 -25 42 46.7 +001+03.1 K 5-5 17 32 16.8 -25 40 55. 1950 IRAS17322-2540 17 35 22.53 -25 42 49.2 +005+06.1 M 3-11 17 32 22. -20 55 22. 1950 CGPN/Mi 59 * 17 35 21.18 -20 57 16.1 +005+06.1 M 3-11 17 32 21.9 -20 55 27. 1950 CGPN/Fc 62 17 35 21.09 -20 57 21.1 +005+06.1 M 3-11 17 32 22.3 -20 55 28. 1950 CGPN/Koal 65 17 35 21.49 -20 57 22.1 +005+06.1 M 3-11 17 32 21.8 -20 55 27.9 1950 11.133.011 17 35 20.99 -20 57 22.0 +005+06.1 M 3-11 17 32 22.2 -20 56 30. 1950 50.134.178 17 35 21.41 -20 58 24.1 +005+06.1 M 3-11 17 32 22.3 -20 55 29. 1950 70.002.006 17 35 21.49 -20 57 23.1 +005+06.1 M 3-11 17 35 21.57 -20 57 23.4 2000 70.002.006 rad 17 35 21.57 -20 57 23.4 +005+06.1 M 3-11 17 32 20.9 -20 55 29. 1950 IRAS17323-2055 17 35 20.09 -20 57 23.2 +358+01.7 JaSt 4 17 32 26.63 -29 11 24.4 1950 Ja,St (1997) 17 35 37.53 -29 13 17.7 +000+02.1 Ae 2-J 17 32 27.2 -27 22 10. 1950 25.135.029 * 17 35 35.38 -27 24 03.4 +000+02.1 Ae 2-J 17 32 27.6 -27 22 16. 1950 70.002.006 17 35 35.78 -27 24 09.4 +000+02.1 Ae 2-J 17 35 35.50 -27 24 04.4 2000 70.002.006 rad 17 35 35.50 -27 24 04.4 +000+02.1 Ae 2-J 17 32 27.6 -27 22 17. 1950 Ko,Ku (1999) 17 35 35.78 -27 24 10.4 +003+04.1 K 5-6 17 32 29.1 -23 09 55. 1950 61.134.050 17 35 31.31 -23 11 48.5 +003+04.1 K 5-6 17 32 29.2 -23 09 55. 1950 Ko,Ku (1999) 17 35 31.41 -23 11 48.4 +003+04.1 K 5-6 17 32 28.8 -23 09 56. 1950 IRAS17324-2309 17 35 31.01 -23 11 49.5 +357+01.3 * TaJu 21 17 32 31. -30 19 36. 1950 22.134.033 * 17 35 43.65 -30 21 29.0 +357+01.3 * TaJu 21 17 35 44.0 -30 21 30. 2000 56.134.011 17 35 44.0 -30 21 30. +357+01.3 * TaJu 21 17 32 30.6 -30 19 34. 1950 70.002.006 17 35 43.25 -30 21 27.0 +357+01.3 * TaJu 21 17 35 43.40 -30 21 28.5 2000 70.002.006 rad 17 35 43.40 -30 21 28.5 +357+01.3 * TaJu 21 17 32 30.9 -30 19 35. 1950 Ko,Ku (1999) 17 35 43.55 -30 21 28.0 +359+02.3 Th 3-33 17 32 39.6 -27 41 28. 1950 CGPN/Koal 65 * 17 35 48.25 -27 43 20.5 +359+02.3 Th 3-33 17 32 39.54 -27 41 28.3 1950 61.134.050 17 35 48.19 -27 43 20.8 +359+02.3 Th 3-33 17 32 39.3 -27 41 30. 1950 70.002.006 17 35 47.95 -27 43 22.5 +359+02.3 Th 3-33 17 35 47.92 -27 43 23.3 2000 70.002.006 rad 17 35 47.92 -27 43 23.3 +359+02.3 Th 3-33 17 32 39.7 -27 41 30. 1950 Ko,Ku (1999) 17 35 48.35 -27 43 22.5 +358+01.8 JaSt 5 17 32 42.05 -28 56 35.7 1950 Ja,St (1997) * 17 35 52.58 -28 58 27.9 +358+01.8 JaSt 5 17 32 42.3 -28 56 36. 1950 Ko,Ku (1999) 17 35 52.83 -28 58 28.2 +002+04.1 Th 3-27 17 32 54.8 -24 23 37. 1950 CGPN/Koal 65 17 35 58.72 -24 25 28.5 +002+04.1 Th 3-27 17 32 54.6 -24 23 30. 1950 18.133.025 17 35 58.52 -24 25 21.5 +002+04.1 Th 3-27 17 32 54.58 -24 23 38.7 1950 54.134.034 17 35 58.50 -24 25 30.3 +002+04.1 Th 3-27 17 32 54.62 -24 23 37.6 1950 61.134.050 17 35 58.54 -24 25 29.1 +002+04.1 Th 3-27 17 32 54.7 -24 23 37. 1950 70.002.006 17 35 58.62 -24 25 28.5 +002+04.1 Th 3-27 17 35 58.49 -24 25 29.7 2000 70.002.006 rad 17 35 58.49 -24 25 29.7 +002+04.1 Th 3-27 17 32 54.7 -24 23 39. 1950 IRAS17329-2423 17 35 58.62 -24 25 30.5 +350-03.1 H 1-26 17 33 01.7 -39 20 08. 1950 CGPN/Koal 65 17 36 29.94 -39 21 58.2 +350-03.1 H 1-26 17 33 01.6 -39 20 07. 1950 70.002.006 17 36 29.84 -39 21 57.2 +350-03.1 H 1-26 17 36 29.93 -39 21 54.8 2000 70.002.006 rad 17 36 29.93 -39 21 54.8 +350-03.1 H 1-26 17 33 00.8 -39 20 06. 1950 IRAS17330-3920 17 36 29.04 -39 21 56.2 +359+02.7 Ae 2-K 17 33 05.2 -27 58 55. 1950 25.135.029 17 36 14.29 -28 00 45.6 +359+02.7 Ae 2-K 17 33 05.1 -27 58 56. 1950 61.134.050 17 36 14.19 -28 00 46.6 +359+02.7 Ae 2-K 17 33 05.1 -27 58 54. 1950 70.002.006 17 36 14.19 -28 00 44.6 +359+02.7 Ae 2-K 17 36 14.34 -28 00 48.3 2000 70.002.006 rad 17 36 14.34 -28 00 48.3 +359+02.7 Ae 2-K 17 33 05.3 -27 58 57. 1950 Ko,Ku (1999) 17 36 14.39 -28 00 47.6 +005+05.1 M 3-12 17 33 23. -21 29 30. 1950 CGPN/Mi 59 * 17 36 22.95 -21 31 19.6 +005+05.1 M 3-12 17 33 25.8 -21 30 34. 1950 CGPN/Fc 62 17 36 25.78 -21 32 23.4 +005+05.1 M 3-12 17 33 22.7 -21 29 23. 1950 CGPN/Koal 65 17 36 22.65 -21 31 12.7 +005+05.1 M 3-12 17 33 22.8 -21 29 22.9 1950 11.133.011 17 36 22.75 -21 31 12.5 +005+05.1 M 3-12 17 33 22.7 -21 29 23. 1950 50.134.178 17 36 22.65 -21 31 12.7 +005+05.1 M 3-12 17 33 22.7 -21 29 23. 1950 70.002.006 17 36 22.65 -21 31 12.7 +005+05.1 M 3-12 17 36 22.51 -21 31 13.3 2000 70.002.006 rad 17 36 22.51 -21 31 13.3 +358+01.4 * Bl B 17 33 48.20 -29 38 17.5 1950 55.002.049 17 36 59.81 -29 40 04.9 +358+01.4 * Bl B 17 33 48.31 -29 38 21.5 1950 61.134.050 17 36 59.92 -29 40 08.9 +358+01.4 * Bl B 17 33 48.2 -29 38 21. 1950 70.002.006 17 36 59.81 -29 40 08.4 +358+01.4 * Bl B 17 36 59.99 -29 40 07.2 2000 70.002.006 rad 17 36 59.99 -29 40 07.2 +358+01.4 * Bl B 17 33 48.8 -29 38 29. 1950 Ko,Ku (1999) 17 37 00.41 -29 40 16.4 +003+04.2 K 5-7 17 34 16.8 -24 01 43. 1950 61.134.050 17 37 20.23 -24 03 28.6 +003+04.2 K 5-7 17 37 20.2 -24 03 29. 2000 72.002.012 17 37 20.2 -24 03 29. +003+04.2 K 5-7 17 34 16.29 -24 01 44.4 1950 72.002.012 rad 17 37 19.72 -24 03 30.0 +003+04.2 K 5-7 17 34 16.5 -24 01 45. 1950 IRAS17342-2401 17 37 19.93 -24 03 30.6 +007+06.1 M 1-23 17 34 26. -18 44 58. 1950 CGPN/Mi 59 17 37 22.36 -18 46 43.2 +007+06.1 M 1-23 17 34 25.7 -18 44 56. 1950 CGPN/Koal 65 17 37 22.06 -18 46 41.2 +007+06.1 M 1-23 17 34 25.6 -18 44 57. 1950 70.002.006 17 37 21.96 -18 46 42.2 +007+06.1 M 1-23 17 37 22.10 -18 46 43.4 2000 70.002.006 rad 17 37 22.10 -18 46 43.4 +007+06.1 M 1-23 17 34 25.5 -18 44 56. 1950 IRAS17344-1844 17 37 21.86 -18 46 41.2 +356-00.1 * Th 3-34 17 34 28.7 -32 13 33. 1950 CGPN/Koal 65 17 37 44.40 -32 15 17.3 +356-00.1 * Th 3-34 17 34 29.18 -32 13 45.9 1950 61.134.050 17 37 44.89 -32 15 30.2 +356-00.1 * Th 3-34 17 34 29.21 -32 13 44.9 1950 61.155.065 17 37 44.92 -32 15 29.2 +356-00.1 * Th 3-34 17 34 29.3 -32 13 46. 1950 Ko,Ku (1999) 17 37 45.01 -32 15 30.3 +356-00.1 * Th 3-34 17 34 28.8 -32 13 50. 1950 IRAS17344-3213 17 37 44.51 -32 15 34.3 +000+02.3 * K 6-4 17 34 34.15 -27 47 26.0 1950 61.134.050 17 37 42.98 -27 49 10.2 +000+02.3 * K 6-4 17 37 43.0 -27 49 10. 2000 72.002.012 17 37 43.0 -27 49 10. +000+02.3 * K 6-4 17 34 35.04 -27 47 26.0 1950 72.002.012 rad 17 37 43.87 -27 49 10.1 +000+02.3 * K 6-4 17 34 34.0 -27 47 24. 1950 IRAS17345-2747 17 37 42.83 -27 49 08.2 +007+06.2 M 1-24 17 35 14. -19 35 55. 1950 CGPN/Mi 59 17 38 11.47 -19 37 36.7 +007+06.2 M 1-24 17 35 14.1 -19 35 55. 1950 CGPN/Koal 65 17 38 11.57 -19 37 36.7 +007+06.2 M 1-24 17 35 14.1 -19 35 56. 1950 70.002.006 17 38 11.57 -19 37 37.7 +007+06.2 M 1-24 17 38 11.60 -19 37 38.3 2000 70.002.006 rad 17 38 11.60 -19 37 38.3 +007+06.2 M 1-24 17 35 14.1 -19 35 56. 1950 IRAS17352-1935 17 38 11.57 -19 37 37.7 +359+01.5 JaSt 8 17 35 17.39 -28 50 20.4 1950 Ja,St (1997) 17 38 27.80 -28 52 01.4 +004+04.1 M 1-25 17 35 30. -22 06 59. 1950 CGPN/Mi 59 17 38 30.82 -22 08 39.4 +004+04.1 M 1-25 17 35 28.7 -22 06 54. 1950 CGPN/Fc 62 17 38 29.52 -22 08 34.5 +004+04.1 M 1-25 17 35 29.5 -22 06 58. 1950 CGPN/Koal 65 17 38 30.32 -22 08 38.4 +004+04.1 M 1-25 17 35 30.2 -22 07 05. 1950 09.133.025 17 38 31.02 -22 08 45.4 +004+04.1 M 1-25 17 35 29.49 -22 06 57.9 1950 37.134.035 17 38 30.31 -22 08 38.3 +004+04.1 M 1-25 17 35 29.50 -22 06 58.4 1950 52.002.003 17 38 30.32 -22 08 38.8 +004+04.1 M 1-25 17 35 29.6 -22 06 58. 1950 70.002.006 17 38 30.42 -22 08 38.4 +004+04.1 M 1-25 17 38 30.34 -22 08 39.3 2000 70.002.006 rad 17 38 30.34 -22 08 39.3 +004+04.1 M 1-25 17 35 30.0 -22 06 59. 1950 IRAS17355-2206 17 38 30.82 -22 08 39.4 +359+01.1 Th 3-35 17 35 32.01 -28 41 05.8 1950 25.135.020 17 38 42.19 -28 42 45.7 +359+01.1 Th 3-35 17 35 32.01 -28 41 04.5 1950 55.002.049 17 38 42.19 -28 42 44.4 +359+01.1 Th 3-35 17 35 32.07 -28 41 05.7 1950 61.134.050 17 38 42.25 -28 42 45.6 +359+01.1 Th 3-35 17 35 32.2 -28 41 08. 1950 70.002.006 17 38 42.38 -28 42 47.9 +359+01.1 Th 3-35 17 38 42.50 -28 42 43.1 2000 70.002.006 rad 17 38 42.50 -28 42 43.1 +359+01.6 JaSt 9 17 35 34.86 -29 07 19.6 1950 Ja,St (1997) 17 38 45.71 -29 08 59.3 +354-01.1 * K 6-5 17 35 34.9 -34 26 00. 1950 61.134.050 17 38 54.29 -34 27 39.4 +354-01.1 * K 6-5 17 35 35.0 -34 26 00. 1950 Ko,Ku (1999) 17 38 54.39 -34 27 39.4 +346-06.1 Fg 2 17 35 41.4 -44 07 59. 1950 08.114.108 17 39 19.73 -44 09 37.2 +346-06.1 Fg 2 17 35 41.4 -44 08 01. 1950 IRAS17356-4408 17 39 19.74 -44 09 39.2 +359+01.3 * 19W32 17 35 52.34 -28 54 57.3 1950 25.135.020 * 17 39 02.88 -28 56 35.7 +359+01.3 * 19W32 17 35 52.36 -28 54 59.3 1950 27.135.041 17 39 02.90 -28 56 37.7 +359+01.3 * 19W32 17 35 52.36 -28 54 57.0 1950 32.135.037 17 39 02.90 -28 56 35.4 +359+01.3 * 19W32 17 35 52.3 -28 54 56.7 1950 52.134.002 17 39 02.84 -28 56 35.1 +359+01.3 * 19W32 17 35 52.43 -28 54 57.2 1950 61.134.050 17 39 02.97 -28 56 35.6 +359+01.3 * 19W32 17 35 52.4 -28 54 57. 1950 70.002.006 17 39 02.94 -28 56 35.4 +359+01.3 * 19W32 17 39 02.88 -28 56 32.7 2000 70.002.006 rad 17 39 02.88 -28 56 32.7 +359+01.3 * 19W32 17 35 52.6 -28 54 58. 1950 Ko,Ku (1999) 17 39 03.14 -28 56 36.4 +353-02.2 K 5-8 17 35 55.39 -35 45 22.0 1950 61.134.050 17 39 17.08 -35 46 59.8 +353-02.2 K 5-8 17 35 55.6 -35 45 23. 1950 Ko,Ku (1999) 17 39 17.29 -35 47 00.8 +008+06.1 He 2-260 17 36 01.5 -18 15 57. 1950 30.135.052 17 38 57.25 -18 17 35.3 +008+06.1 He 2-260 17 36 01.63 -18 15 57.5 1950 52.002.003 17 38 57.38 -18 17 35.8 +008+06.1 He 2-260 17 36 01.7 -18 15 57. 1950 70.002.006 17 38 57.45 -18 17 35.3 +008+06.1 He 2-260 17 38 57.25 -18 17 37.3 2000 70.002.006 rad 17 38 57.25 -18 17 37.3 +008+06.1 He 2-260 17 36 01.5 -18 15 58. 1950 IRAS17360-1815 17 38 57.25 -18 17 36.3 +036+21.1 * Y-C 44 17 36 07.20 +12 42 37.7 1950 40.134.038 17 38 26.00 +12 40 58.5 +036+21.1 * Y-C 44 17 36 07.4 +12 42 38. 1950 Ko,Ku (1999) 17 38 26.20 +12 40 58.9 +359+01.4 * K 6-6 17 36 08.82 -28 13 31.4 1950 61.134.050 17 39 18.32 -28 15 08.7 +359+01.4 * K 6-6 17 36 09.0 -28 13 32. 1950 Ko,Ku (1999) 17 39 18.50 -28 15 09.3 +358+00.1 JaSt 16 17 36 11.07 -29 40 09.1 1950 Ja,St (1997) 17 39 22.76 -29 41 46.1 +358+00.1 JaSt 16 17 36 11.1 -29 40 10. 1950 Ko,Ku (1999) 17 39 22.79 -29 41 47.0 +000+01.1 K 6-7 17 36 23.0 -27 26 12. 1950 61.134.050 17 39 31.33 -27 27 48.3 +000+01.1 K 6-7 17 36 23.1 -27 26 13. 1950 Ko,Ku (1999) 17 39 31.43 -27 27 49.3 +347-06.1 SB 31 17 40 03.5 -42 24 02.6 2000 71.134.030 17 40 03.5 -42 24 02.6 +347-06.1 SB 31 17 36 29.1 -42 22 31. 1950 Ko,Ku (1999) 17 40 03.60 -42 24 05.9 +347-06.1 SB 31 17 36 28.1 -42 22 32. 1950 IRAS17364-4222 17 40 02.60 -42 24 07.0 +000+01.2 K 6-8 17 36 30.5 -27 45 47. 1950 61.134.050 17 39 39.32 -27 47 22.7 +000+01.2 K 6-8 17 36 30.7 -27 45 47. 1950 Ko,Ku (1999) 17 39 39.52 -27 47 22.7 +355-01.2 * K 6-9 17 36 42.45 -33 33 57.4 1950 54.134.034 17 40 00.40 -33 35 31.9 +355-01.2 * K 6-9 17 36 42.5 -33 33 58. 1950 61.134.050 17 40 00.45 -33 35 32.5 +355-01.2 * K 6-9 17 36 42.3 -33 34 01. 1950 IRAS17367-3334 17 40 00.25 -33 35 35.5 +005+05.2 H 2-16 17 36 55.3 -21 12 32. 1950 CGPN/Koal 65 17 39 54.91 -21 14 06.2 +005+05.2 H 2-16 17 36 55.0 -21 12 32. 1950 18.133.025 17 39 54.61 -21 14 06.3 +005+05.2 H 2-16 17 36 55.8 -21 12 38. 1950 50.134.178 17 39 55.42 -21 14 12.2 +005+05.2 H 2-16 17 36 56.1 -21 12 37. 1950 70.002.006 17 39 55.72 -21 14 11.2 +005+05.2 H 2-16 17 39 55.67 -21 14 13.8 2000 70.002.006 rad 17 39 55.67 -21 14 13.8 +005+05.2 H 2-16 17 36 54.4 -21 12 40. 1950 IRAS17369-2112 17 39 54.02 -21 14 14.3 +003+03.1 * H 2-17 17 37 03.4 -24 24 13. 1950 CGPN/Fc 62 17 40 07.38 -24 25 46.5 +003+03.1 * H 2-17 17 37 03.5 -24 24 11. 1950 CGPN/Koal 65 17 40 07.48 -24 25 44.5 +003+03.1 * H 2-17 17 37 03.4 -24 24 07. 1950 10.114.152 17 40 07.38 -24 25 40.5 +003+03.1 * H 2-17 17 37 03.0 -24 24 11. 1950 18.133.025 17 40 06.98 -24 25 44.5 +003+03.1 * H 2-17 17 37 03.5 -24 24 09. 1950 46.134.040 17 40 07.48 -24 25 42.5 +003+03.1 * H 2-17 17 37 03.4 -24 24 08. 1950 50.134.178 17 40 07.38 -24 25 41.5 +003+03.1 * H 2-17 17 37 03.52 -24 24 08.7 1950 61.134.050 17 40 07.50 -24 25 42.2 +003+03.1 * H 2-17 17 37 03.6 -24 24 08. 1950 70.002.006 17 40 07.58 -24 25 41.5 +003+03.1 * H 2-17 17 40 07.56 -24 25 41.9 2000 70.002.006 rad 17 40 07.56 -24 25 41.9 +003+03.1 * H 2-17 17 37 02.9 -24 24 10. 1950 IRAS17370-2424 17 40 06.88 -24 25 43.5 +001+02.1 He 2-262 17 37 05.0 -26 42 44. 1950 CGPN/Koal 65 * 17 40 12.28 -26 44 17.3 +001+02.1 He 2-262 17 37 05.6 -26 42 48. 1950 46.134.040 17 40 12.88 -26 44 21.2 +001+02.1 He 2-262 17 37 05.6 -26 42 48. 1950 50.134.178 17 40 12.88 -26 44 21.2 +001+02.1 He 2-262 17 37 05.59 -26 42 48.5 1950 61.134.050 17 40 12.87 -26 44 21.7 +001+02.1 He 2-262 17 37 05.7 -26 42 49. 1950 70.002.006 17 40 12.98 -26 44 22.2 +001+02.1 He 2-262 17 40 12.92 -26 44 22.2 2000 70.002.006 rad 17 40 12.92 -26 44 22.2 +355-01.1 * IRAS17372-3328 17 37 12.7 -33 28 27.3 1950 52.134.002 17 40 30.50 -33 29 59.6 +355-01.1 * IRAS17372-3328 17 37 12.75 -33 28 23.7 1950 61.134.050 17 40 30.55 -33 29 56.0 +355-01.1 * IRAS17372-3328 17 40 30.6 -33 29 57. 2000 72.002.012 17 40 30.6 -33 29 57. +355-01.1 * IRAS17372-3328 17 37 12.62 -33 28 27.0 1950 72.002.012 rad 17 40 30.42 -33 29 59.4 +355-01.1 * IRAS17372-3328 17 37 12.9 -33 28 25. 1950 Ko,Ku (1999) 17 40 30.70 -33 29 57.3 +355-01.1 * IRAS17372-3328 17 37 12.7 -33 28 28. 1950 IRAS17372-3328 17 40 30.50 -33 30 00.3 +005+04.1 H 1-27 17 37 16.3 -22 17 47. 1950 CGPN/Fc 62 * 17 40 17.38 -22 19 19.7 +005+04.1 H 1-27 17 37 16.9 -22 17 45. 1950 CGPN/Koal 65 17 40 17.98 -22 19 17.6 +005+04.1 H 1-27 17 37 17.0 -22 17 45. 1950 18.133.025 17 40 18.08 -22 19 17.6 +005+04.1 H 1-27 17 37 16.9 -22 17 45. 1950 50.134.178 17 40 17.98 -22 19 17.6 +005+04.1 H 1-27 17 37 16.85 -22 17 47.6 1950 54.134.034 17 40 17.93 -22 19 20.2 +005+04.1 H 1-27 17 37 16.9 -22 17 45. 1950 70.002.006 17 40 17.98 -22 19 17.6 +005+04.1 H 1-27 17 40 17.80 -22 19 20.0 2000 70.002.006 rad 17 40 17.80 -22 19 20.0 +344-08.1 * PC 18 17 37 19.7 -47 01 50. 1950 Wr (1966) 17 41 04.96 -47 03 20.9 +344-08.1 * PC 18 17 37 19.7 -47 01 50. 1950 10.114.152 17 41 04.96 -47 03 20.9 +344-08.1 * PC 18 17 37 19.9 -47 01 57. 1950 Ko,Ku (1999) 17 41 05.16 -47 03 27.8 +344-08.1 * PC 18 17 37 19.77 -47 01 56.4 1950 GSC 8347-01978 17 41 05.03 -47 03 27.3 +001+01.1 K 1-4 17 37 20.4 -26 59 15. 1950 CGPN/Koal 65 17 40 28.09 -27 00 47.1 +001+01.1 K 1-4 17 37 19.5 -26 59 26. 1950 50.134.178 17 40 27.19 -27 00 58.2 +001+01.1 K 1-4 17 37 19.8 -26 59 29. 1950 61.134.050 17 40 27.49 -27 01 01.2 +001+01.1 K 1-4 17 37 19.1 -26 59 31. 1950 70.002.006 17 40 26.79 -27 01 03.2 +001+01.1 K 1-4 17 40 27.37 -27 01 00.6 2000 70.002.006 rad 17 40 27.37 -27 01 00.6 +353-02.1 * IRAS17373-3542 17 37 23.9 -35 42 27.6 1950 52.134.002 * 17 40 45.54 -35 43 59.0 +353-02.1 * IRAS17373-3542 17 37 24.1 -35 42 28. 1950 Ko,Ku (1999) 17 40 45.74 -35 43 59.4 +353-02.1 * IRAS17373-3542 17 37 23.9 -35 42 28. 1950 IRAS17373-3542 17 40 45.54 -35 43 59.4 +001+02.2 K 5-10 17 38 18.2 -26 02 25. 1950 61.134.050 17 41 24.52 -26 03 53.0 +001+02.2 K 5-10 17 38 18.4 -26 02 27. 1950 Ko,Ku (1999) 17 41 24.72 -26 03 55.0 +005+04.2 M 3-13 17 38 36. -22 11 42. 1950 CGPN/Mi 59 17 41 36.96 -22 13 08.9 +005+04.2 M 3-13 17 38 35.1 -22 11 30. 1950 CGPN/Fc 62 17 41 36.05 -22 12 57.0 +005+04.2 M 3-13 17 38 35.7 -22 11 36. 1950 CGPN/Koal 65 17 41 36.66 -22 13 02.9 +005+04.2 M 3-13 17 38 35.8 -22 11 36. 1950 10.114.152 17 41 36.76 -22 13 02.9 +005+04.2 M 3-13 17 38 35.6 -22 11 36. 1950 70.002.006 17 41 36.56 -22 13 02.9 +005+04.2 M 3-13 17 38 35.8 -22 11 36. 1950 IRAS17385-2211 17 41 36.76 -22 13 02.9 +003+02.1 Hb 4 17 38 48.4 -24 40 42. 1950 CGPN/Koal 65 17 41 52.79 -24 42 07.9 +003+02.1 Hb 4 17 38 48.4 -24 40 34. 1950 09.133.025 17 41 52.79 -24 41 59.9 +003+02.1 Hb 4 17 38 48.40 -24 40 42.1 1950 37.134.035 17 41 52.79 -24 42 08.0 +003+02.1 Hb 4 17 38 48.4 -24 40 41. 1950 46.134.040 17 41 52.79 -24 42 06.9 +003+02.1 Hb 4 17 38 48.4 -24 40 42. 1950 50.134.178 17 41 52.79 -24 42 07.9 +003+02.1 Hb 4 17 38 48.40 -24 40 42.1 1950 52.002.003 17 41 52.79 -24 42 08.0 +003+02.1 Hb 4 17 38 48.46 -24 40 42.1 1950 61.134.050 17 41 52.85 -24 42 08.0 +003+02.1 Hb 4 17 38 48.5 -24 40 42. 1950 70.002.006 17 41 52.89 -24 42 07.9 +003+02.1 Hb 4 17 41 52.79 -24 42 09.3 2000 70.002.006 rad 17 41 52.79 -24 42 09.3 +003+02.1 Hb 4 17 38 49.0 -24 40 44. 1950 IRAS17388-2440 17 41 53.39 -24 42 09.8 +003+03.2 M 2-14 17 38 54. -24 09 51. 1950 CGPN/Mi 59 17 41 57.67 -24 11 16.5 +003+03.2 M 2-14 17 38 53.3 -24 10 10. 1950 CGPN/Fc 62 17 41 56.98 -24 11 35.5 +003+03.2 M 2-14 17 38 53.6 -24 09 51. 1950 CGPN/Koal 65 17 41 57.27 -24 11 16.5 +003+03.2 M 2-14 17 38 53.6 -24 09 50. 1950 46.134.040 17 41 57.27 -24 11 15.5 +003+03.2 M 2-14 17 38 53.63 -24 09 50.1 1950 61.134.050 17 41 57.30 -24 11 15.6 +003+03.2 M 2-14 17 38 53.6 -24 09 50. 1950 70.002.006 17 41 57.27 -24 11 15.5 +003+03.2 M 2-14 17 41 57.25 -24 11 18.5 2000 70.002.006 rad 17 41 57.25 -24 11 18.5 +003+03.2 M 2-14 17 38 54.2 -24 09 54. 1950 IRAS17389-2409 17 41 57.87 -24 11 19.5 +010+07.1 Sa 2-230 17 39 08.40 -15 54 39.0 1950 54.134.034 17 42 01.18 -15 56 03.8 +010+07.1 Sa 2-230 17 39 09.2 -15 54 41. 1950 70.002.006 17 42 01.98 -15 56 05.8 +010+07.1 Sa 2-230 17 42 01.58 -15 55 56.2 2000 70.002.006 rad 17 42 01.58 -15 55 56.2 +010+07.1 Sa 2-230 17 39 09.4 -15 54 44. 1950 Ko,Ku (1999) 17 42 02.18 -15 56 08.7 +010+07.1 Sa 2-230 17 39 09.0 -15 54 46. 1950 IRAS17391-1554 17 42 01.78 -15 56 10.8 +027+16.1 * DeHt 2 17 39 10.5 +03 08 27. 1950 27.135.032 17 41 40.64 +03 07 01.5 +027+16.1 * DeHt 2 17 39 10.9 +03 08 22. 1950 70.002.006 17 41 41.04 +03 06 56.6 +000+01.3 JaSt 34 17 39 16.20 -27 54 12.7 1950 Ja,St (1997) 17 42 25.26 -27 55 36.4 +000+01.3 JaSt 34 17 39 16.3 -27 54 14. 1950 Ko,Ku (1999) 17 42 25.36 -27 55 37.7 +000+01.4 JaSt 36 17 39 23.96 -27 31 52.1 1950 Ja,St (1997) 17 42 32.47 -27 33 15.2 +000+01.4 JaSt 36 17 39 24.3 -27 31 46. 1950 Ko,Ku (1999) 17 42 32.81 -27 33 09.1 +002+02.1 Ta 5 17 42 30.1 -25 45 29. 2000 56.134.011 17 42 30.1 -25 45 29. +002+02.1 Ta 5 17 39 24.22 -25 44 03.7 1950 61.134.050 17 42 30.12 -25 45 26.9 +002+02.1 Ta 5 17 39 24.2 -25 44 04. 1950 70.002.006 17 42 30.10 -25 45 27.2 +002+02.1 Ta 5 17 42 30.20 -25 45 23.9 2000 70.002.006 rad 17 42 30.20 -25 45 23.9 +350-05.1 H 1-28 17 39 25.3 -39 35 02. 1950 CGPN/Koal 65 17 42 54.17 -39 36 24.3 +350-05.1 H 1-28 17 39 25.2 -39 35 02. 1950 70.002.006 17 42 54.07 -39 36 24.3 +350-05.1 H 1-28 17 42 54.14 -39 36 21.8 2000 70.002.006 rad 17 42 54.14 -39 36 21.8 +350-05.1 H 1-28 17 39 26.0 -39 35 01. 1950 IRAS17394-3935 17 42 54.87 -39 36 23.3 +353-03.1 * IRAS17393-3612 17 39 28.0 -36 12 12.8 1950 52.134.002 * 17 42 50.55 -36 13 35.2 +353-03.1 * IRAS17393-3612 17 39 28.03 -36 12 12.9 1950 61.134.050 17 42 50.58 -36 13 35.2 +353-03.1 * IRAS17393-3612 17 39 28.2 -36 12 15. 1950 Ko,Ku (1999) 17 42 50.75 -36 13 37.3 +353-03.1 * IRAS17393-3612 17 39 23.5 -36 12 06. 1950 IRAS17393-3612 17 42 46.05 -36 13 28.7 +017+11.1 IRAS17395-0841 17 39 30.5 -08 41 57. 1950 19.114.052 * 17 42 14.48 -08 43 20.5 +017+11.1 IRAS17395-0841 17 42 14.4 -08 43 19. 2000 72.002.012 17 42 14.4 -08 43 19. +017+11.1 IRAS17395-0841 17 39 30.51 -08 41 54.8 1950 72.002.012 rad 17 42 14.49 -08 43 18.3 +017+11.1 IRAS17395-0841 17 39 30.6 -08 41 57. 1950 Ko,Ku (1999) 17 42 14.58 -08 43 20.5 +017+11.1 IRAS17395-0841 17 39 30.1 -08 41 58. 1950 IRAS17395-0841 17 42 14.08 -08 43 21.6 +001+01.3 JaSt 39 17 39 41.80 -27 19 57.8 1950 Ja,St (1997) 17 42 50.02 -27 21 19.7 +001+01.3 JaSt 39 17 39 41.8 -27 19 59. 1950 Ko,Ku (1999) 17 42 50.02 -27 21 20.9 +001+01.2 K 6-10 17 40 09.7 -26 42 58. 1950 61.134.050 17 43 17.02 -26 44 17.9 +001+01.2 K 6-10 17 40 09.9 -26 43 00. 1950 Ko,Ku (1999) 17 43 17.22 -26 44 19.8 +000+01.5 JaSt 41 17 40 15.00 -27 32 46.6 1950 Ja,St (1997) * 17 43 23.54 -27 34 06.0 +000+01.5 JaSt 41 17 40 15.2 -27 32 46. 1950 Ko,Ku (1999) 17 43 23.74 -27 34 05.4 +001+01.4 JaSt 43 17 40 23.09 -26 46 13.5 1950 Ja,St (1997) * 17 43 30.49 -26 47 32.4 +001+01.4 JaSt 43 17 40 23.2 -26 46 15. 1950 Ko,Ku (1999) 17 43 30.61 -26 47 33.9 +006+04.1 H 2-18 17 40 28.9 -21 08 33. 1950 CGPN/Koal 65 17 43 28.46 -21 09 51.7 +006+04.1 H 2-18 17 40 29.28 -21 08 33.8 1950 34.134.032 17 43 28.84 -21 09 52.5 +006+04.1 H 2-18 17 40 29.2 -21 08 33. 1950 70.002.006 17 43 28.76 -21 09 51.7 +006+04.1 H 2-18 17 43 28.88 -21 09 52.0 2000 70.002.006 rad 17 43 28.88 -21 09 52.0 +045+24.1 K 1-14 17 40 29.0 +21 28 20. 1950 02.133.027 17 42 36.60 +21 26 59.5 +045+24.1 K 1-14 17 40 28.9 +21 28 17. 1950 09.133.025 17 42 36.50 +21 26 56.4 +045+24.1 K 1-14 17 40 29.5 +21 28 11. 1950 34.134.010 17 42 37.10 +21 26 50.5 +045+24.1 K 1-14 17 40 29.0 +21 28 22. 1950 70.002.006 17 42 36.60 +21 27 01.5 +045+24.1 K 1-14 17 42 37.10 +21 27 04.0 2000 70.002.006 rad 17 42 37.10 +21 27 04.0 +045+24.1 K 1-14 17 40 29.4 +21 28 18. 1950 IRAS17404+2128 17 42 37.00 +21 26 57.5 +002+02.2 Ta 1580 17 43 39.5 -25 36 45. 2000 56.134.011 17 43 39.5 -25 36 45. +002+02.2 Ta 1580 17 40 33.8 -25 35 23. 1950 61.134.050 17 43 39.50 -25 36 41.2 +002+02.2 Ta 1580 17 40 33.8 -25 35 25. 1950 70.002.006 17 43 39.50 -25 36 43.2 +002+02.2 Ta 1580 17 43 39.53 -25 36 42.9 2000 70.002.006 rad 17 43 39.53 -25 36 42.9 +002+02.2 Ta 1580 17 40 34.0 -25 35 25. 1950 Ko,Ku (1999) 17 43 39.70 -25 36 43.2 +002+02.2 Ta 1580 17 40 34.9 -25 35 28. 1950 IRAS17405-2535 17 43 40.60 -25 36 46.1 +036+20.1 * Y-C 45 17 40 45.19 +12 21 52.4 1950 40.134.038 17 43 04.38 +12 20 33.4 +036+20.1 * Y-C 45 17 40 46.4 +12 21 51. 1950 Ko,Ku (1999) 17 43 05.59 +12 20 32.1 +002+01.4 JaFu 1 17 43 57.4 -26 11 52. 2000 68.154.039 17 43 57.4 -26 11 52. +002+01.4 JaFu 1 17 40 50.9 -26 10 39. 1950 Ko,Ku (1999) 17 43 57.45 -26 11 55.9 +355-02.2 H 1-29 17 40 54.6 -34 16 17. 1950 CGPN/Koal 65 17 44 13.80 -34 17 33.2 +355-02.2 H 1-29 17 40 54.58 -34 16 17.5 1950 61.134.050 17 44 13.78 -34 17 33.7 +355-02.2 H 1-29 17 40 54.6 -34 16 17. 1950 70.002.006 17 44 13.80 -34 17 33.2 +355-02.2 H 1-29 17 44 13.91 -34 17 35.8 2000 70.002.006 rad 17 44 13.91 -34 17 35.8 +355-02.2 H 1-29 17 40 54.4 -34 16 20. 1950 IRAS17409-3416 17 44 13.60 -34 17 36.2 +355-02.1 M 3-14 17 41 02. -34 05 24. 1950 CGPN/Mi 59 17 44 20.90 -34 06 39.6 +355-02.1 M 3-14 17 41 01.6 -34 05 25. 1950 CGPN/Koal 65 17 44 20.50 -34 06 40.7 +355-02.1 M 3-14 17 41 01.6 -34 05 25. 1950 09.133.025 17 44 20.50 -34 06 40.7 +355-02.1 M 3-14 17 41 01.7 -34 05 25. 1950 50.134.178 17 44 20.60 -34 06 40.7 +355-02.1 M 3-14 17 41 01.72 -34 05 25.2 1950 61.134.050 17 44 20.62 -34 06 40.9 +355-02.1 M 3-14 17 41 01.7 -34 05 25. 1950 70.002.006 17 44 20.60 -34 06 40.7 +355-02.1 M 3-14 17 44 20.63 -34 06 42.4 2000 70.002.006 rad 17 44 20.63 -34 06 42.4 +355-02.1 M 3-14 17 41 01.9 -34 05 28. 1950 IRAS17410-3405 17 44 20.80 -34 06 43.7 +353-03.2 * K 6-11 17 41 12.8 -36 12 47. 1950 61.134.050 17 44 35.40 -36 14 01.7 +353-03.2 * K 6-11 17 41 13.1 -36 12 49. 1950 Ko,Ku (1999) 17 44 35.70 -36 14 03.7 +003+02.2 * IRAS17414-2412 17 41 28.9 -24 12 13. 1950 46.134.040 17 44 32.65 -24 13 27.2 +003+02.2 * IRAS17414-2412 17 41 28.90 -24 12 12.8 1950 61.134.050 17 44 32.65 -24 13 27.0 +003+02.2 * IRAS17414-2412 17 41 29.1 -24 12 14. 1950 Ko,Ku (1999) 17 44 32.85 -24 13 28.2 +003+02.2 * IRAS17414-2412 17 41 29.3 -24 12 15. 1950 IRAS17414-2412 17 44 33.05 -24 13 29.2 +001+01.6 JaSt 49 17 41 29.95 -26 46 11.2 1950 Ja,St (1997) 17 44 37.37 -26 47 25.2 +001+01.6 JaSt 49 17 41 30.1 -26 46 12. 1950 Ko,Ku (1999) 17 44 37.52 -26 47 26.0 +352-04.1 H 1-30 17 41 40.7 -38 07 37. 1950 CGPN/Koal 65 17 45 06.81 -38 08 49.6 +352-04.1 H 1-30 17 41 40.7 -38 07 37. 1950 70.002.006 17 45 06.81 -38 08 49.6 +352-04.1 H 1-30 17 45 06.69 -38 08 44.9 2000 70.002.006 rad 17 45 06.69 -38 08 44.9 +352-04.1 H 1-30 17 41 41.5 -38 07 42. 1950 IRAS17416-3807 17 45 07.61 -38 08 54.5 +343-09.1 SB 29 17 45 33.4 -47 43 49.7 2000 71.134.030 17 45 33.4 -47 43 49.7 +343-09.1 SB 29 17 41 46.6 -47 42 40. 1950 Ko,Ku (1999) 17 45 33.69 -47 43 51.4 +343-09.1 SB 29 17 41 46.8 -47 42 42. 1950 IRAS17417-4742 17 45 33.89 -47 43 53.4 +351-04.1 * H 2-19 17 41 47.9 -38 16 13. 1950 CGPN/Koal 65 * 17 45 14.28 -38 17 25.0 +351-04.1 * H 2-19 17 41 47.6 -38 16 14. 1950 Wr (1966) 17 45 13.98 -38 17 26.1 +351-04.1 * H 2-19 17 41 47.87 -38 16 14.1 1950 51.117.039 17 45 14.25 -38 17 26.1 +351-04.1 * H 2-19 17 41 48.0 -38 16 15. 1950 Ko,Ku (1999) 17 45 14.38 -38 17 27.0 +346-08.1 IC 4663 17 41 48.5 -44 53 05. 1950 08.114.108 17 45 28.69 -44 54 16.5 +346-08.1 IC 4663 17 41 48.4 -44 53 00. 1950 18.133.025 17 45 28.59 -44 54 11.5 +346-08.1 IC 4663 17 41 47.6 -44 53 07. 1950 IRAS17417-4453 17 45 27.79 -44 54 18.6 +011+07.1 Sa 2-237 17 41 49.6 -15 43 59. 1950 70.002.006 17 44 42.17 -15 45 12.1 +011+07.1 Sa 2-237 17 44 42.14 -15 45 11.4 2000 70.002.006 rad 17 44 42.14 -15 45 11.4 +011+07.1 Sa 2-237 17 41 49.7 -15 44 00. 1950 Ko,Ku (1999) 17 44 42.27 -15 45 13.1 +011+07.1 Sa 2-237 17 41 49.9 -15 44 00. 1950 IRAS17418-1544 17 44 42.47 -15 45 13.1 +345-08.1 Tc 1 17 41 52.4 -46 04 14. 1950 08.114.108 17 45 35.40 -46 05 25.1 +345-08.1 Tc 1 17 41 52.6 -46 04 10. 1950 18.133.025 17 45 35.60 -46 05 21.1 +345-08.1 Tc 1 17 45 35.32 -46 05 22.6 2000 AC 3861506 17 45 35.32 -46 05 22.6 +345-08.1 Tc 1 17 41 52.46 -46 04 12.1 1950 GSC 8343-01781 17 45 35.46 -46 05 23.2 +345-08.1 Tc 1 17 45 35.29 -46 05 23.6 2000 TYC 834317811 17 45 35.29 -46 05 23.6 +345-08.1 Tc 1 17 41 52.4 -46 04 13. 1950 IRAS17418-4604 17 45 35.40 -46 05 24.1 +356-01.1 TaJu 23 17 41 54. -32 45 06. 1950 64.134.024 * 17 45 10.67 -32 46 17.9 +356-01.1 TaJu 23 17 41 53.2 -32 45 03. 1950 Ko,Ku (1999) 17 45 09.87 -32 46 15.0 +002+01.3 * K 5-15 17 42 02.8 -25 42 49. 1950 61.134.050 * 17 45 08.69 -25 44 00.7 +002+01.3 * K 5-15 C1 17 42 03.4 -25 42 48. 1950 Ko,Ku (1999) 17 45 09.29 -25 43 59.6 +002+01.3 * K 5-15 C2 17 42 02.7 -25 42 49. 1950 Ko,Ku (1999) 17 45 08.59 -25 44 00.7 +001+00.2 JaSt 51 17 42 02.59 -27 31 25.2 1950 Ja,St (1997) * 17 45 11.12 -27 32 36.8 +001+00.2 JaSt 51 17 42 02.8 -27 31 28. 1950 Ko,Ku (1999) 17 45 11.33 -27 32 39.6 +355-02.4 H 1-31 17 42 13. -34 32 43. 1950 CGPN/Mi 59 * 17 45 32.69 -34 33 53.5 +355-02.4 H 1-31 17 42 25.6 -34 29 47. 1950 CGPN/Koal 65 17 45 45.21 -34 30 56.5 +355-02.4 H 1-31 17 42 12.65 -34 32 45.4 1950 34.134.032 17 45 32.34 -34 33 55.9 +355-02.4 H 1-31 17 42 12.51 -34 32 45.6 1950 61.134.050 17 45 32.20 -34 33 56.1 +355-02.4 H 1-31 17 42 12.4 -34 32 44. 1950 70.002.006 17 45 32.09 -34 33 54.5 +355-02.4 H 1-31 17 45 32.51 -34 33 57.8 2000 70.002.006 rad 17 45 32.51 -34 33 57.8 +355-02.4 H 1-31 17 42 14.1 -34 32 49. 1950 IRAS17422-3432 17 45 33.79 -34 33 59.4 +009+05.1 * He 3-1475 17 42 19.0 -17 55 38. 1950 Ko,Ku (1999) 17 45 14.36 -17 56 48.9 +009+05.1 * He 3-1475 17 42 18.8 -17 55 36. 1950 IRAS17423-1755 17 45 14.16 -17 56 46.9 +002+01.2 Ta 1567 17 45 28.4 -25 38 13. 2000 56.134.011 17 45 28.4 -25 38 13. +002+01.2 Ta 1567 17 42 22.7 -25 37 02. 1950 61.134.050 17 45 28.46 -25 38 12.2 +002+01.2 Ta 1567 17 42 22.7 -25 37 02. 1950 70.002.006 17 45 28.46 -25 38 12.2 +002+01.2 Ta 1567 17 45 28.32 -25 38 15.8 2000 70.002.006 rad 17 45 28.32 -25 38 15.8 +002+01.2 Ta 1567 17 42 22.9 -25 37 03. 1950 Ko,Ku (1999) 17 45 28.66 -25 38 13.2 +001+01.5 JaSt 52 17 42 29.66 -27 00 08.8 1950 Ja,St (1997) 17 45 37.43 -27 01 18.5 +006+04.2 M 3-15 17 42 32. -20 56 53. 1950 CGPN/Mi 59 17 45 31.31 -20 58 02.8 +006+04.2 M 3-15 17 42 32.4 -20 56 52. 1950 CGPN/Koal 65 17 45 31.71 -20 58 01.8 +006+04.2 M 3-15 17 42 32.43 -20 56 52.0 1950 34.134.032 17 45 31.74 -20 58 01.8 +006+04.2 M 3-15 17 42 32.4 -20 56 52. 1950 70.002.006 17 45 31.71 -20 58 01.8 +006+04.2 M 3-15 17 45 31.72 -20 58 02.1 2000 70.002.006 rad 17 45 31.72 -20 58 02.1 +006+04.2 M 3-15 17 42 32.3 -20 56 55. 1950 IRAS17425-2056 17 45 31.61 -20 58 04.8 +002+01.1 H 2-20 17 42 33.6 -25 38 49. 1950 CGPN/Koal 65 * 17 45 39.40 -25 39 58.5 +002+01.1 H 2-20 17 42 34.0 -25 38 47. 1950 10.114.152 17 45 39.80 -25 39 56.4 +002+01.1 H 2-20 old 17 42 35.6 -25 36 42. 1950 18.133.025 17 45 41.35 -25 37 51.3 +002+01.1 H 2-20 old 17 42 34.0 -25 38 50.4 1950 52.134.002 17 45 39.80 -25 39 59.8 +002+01.1 H 2-20 old 17 42 33.97 -25 38 51.2 1950 54.134.034 17 45 39.77 -25 40 00.6 +002+01.1 H 2-20 old 17 42 34.01 -25 38 46.3 1950 55.002.049 17 45 39.81 -25 39 55.7 +002+01.1 H 2-20 old 17 42 34.04 -25 38 50.6 1950 61.134.050 17 45 39.84 -25 40 00.0 +002+01.1 H 2-20 old 17 42 34.1 -25 38 51. 1950 70.002.006 17 45 39.90 -25 40 00.4 +002+01.1 H 2-20 old 17 45 39.89 -25 40 01.1 2000 70.002.006 rad 17 45 39.89 -25 40 01.1 +002+01.1 H 2-20 old 17 42 34.3 -25 38 52. 1950 Ko,Ku (1999) 17 45 40.10 -25 40 01.4 +002+01.1 H 2-20 old 17 42 35.8 -25 36 48. 1950 Ko,Ku (1999) 17 45 41.55 -25 37 57.3 +002+01.1 H 2-20 old 17 42 35.90 -25 36 48.9 1950 GSC 6832-00834 17 45 41.65 -25 37 58.2 +002+01.1 H 2-20 old 17 42 32.5 -25 38 52. 1950 IRAS17425-2538 17 45 38.30 -25 40 01.5 +005+03.1 Pe 1-9 17 42 34.8 -23 01 17. 1950 CGPN/Koal 65 17 45 36.92 -23 02 26.5 +005+03.1 Pe 1-9 17 42 34.7 -23 01 16. 1950 61.134.050 17 45 36.82 -23 02 25.5 +005+03.1 Pe 1-9 17 42 34.8 -23 01 17. 1950 70.002.006 17 45 36.92 -23 02 26.5 +005+03.1 Pe 1-9 17 45 36.90 -23 02 26.3 2000 70.002.006 rad 17 45 36.90 -23 02 26.3 +001+00.3 JaSt 53 17 42 38.63 -27 29 33.1 1950 Ja,St (1997) 17 45 47.12 -27 30 42.1 +358-00.2 M 1-26 17 42 41. -30 11 17. 1950 CGPN/Mi 59 * 17 45 53.58 -30 12 25.7 +358-00.2 M 1-26 17 42 45.0 -30 10 52. 1950 CGPN/Koal 65 17 45 57.57 -30 12 00.4 +358-00.2 M 1-26 17 42 45.0 -30 11 02. 1950 09.133.025 17 45 57.57 -30 12 10.4 +358-00.2 M 1-26 17 42 45.11 -30 10 52.5 1950 20.041.026 17 45 57.68 -30 12 00.9 +358-00.2 M 1-26 17 42 45.1 -30 10 52. 1950 31.116.001 17 45 57.67 -30 12 00.4 +358-00.2 M 1-26 17 42 45.09 -30 10 51.8 1950 37.134.035 17 45 57.66 -30 12 00.2 +358-00.2 M 1-26 17 42 45.10 -30 10 52.0 1950 52.002.003 17 45 57.67 -30 12 00.4 +358-00.2 M 1-26 17 42 45.12 -30 10 48.3 1950 52.002.040 17 45 57.69 -30 11 56.7 +358-00.2 M 1-26 17 42 44.95 -30 10 42.7 1950 55.002.049 17 45 57.51 -30 11 51.1 +358-00.2 M 1-26 17 42 45.06 -30 10 52.5 1950 61.134.050 17 45 57.63 -30 12 00.9 +358-00.2 M 1-26 17 42 45.1 -30 10 52. 1950 70.002.006 17 45 57.67 -30 12 00.4 +358-00.2 M 1-26 17 45 57.63 -30 12 02.0 2000 70.002.006 rad 17 45 57.63 -30 12 02.0 +358-00.2 M 1-26 17 45 57.63 -30 12 00.3 2000 70.134.064 17 45 57.63 -30 12 00.3 +358-00.2 M 1-26 17 42 45.20 -30 10 51.9 1950 GSC 7377-00367 17 45 57.77 -30 12 00.3 +358-00.2 M 1-26 17 42 45.1 -30 10 57. 1950 IRAS17427-3010 17 45 57.67 -30 12 05.4 +355-02.3 H 1-32 17 42 48. -34 02 37. 1950 CGPN/Mi 59 17 46 06.84 -34 03 44.9 +355-02.3 H 1-32 17 42 47.4 -34 02 37. 1950 CGPN/Koal 65 17 46 06.24 -34 03 45.0 +355-02.3 H 1-32 17 42 47.55 -34 02 38.0 1950 34.134.032 17 46 06.39 -34 03 46.0 +355-02.3 H 1-32 17 42 47.48 -34 02 37.8 1950 61.134.050 17 46 06.32 -34 03 45.8 +355-02.3 H 1-32 17 42 48.2 -34 02 34. 1950 70.002.006 17 46 07.04 -34 03 41.9 +355-02.3 H 1-32 17 46 06.81 -34 03 45.5 2000 70.002.006 rad 17 46 06.81 -34 03 45.5 +355-02.3 H 1-32 17 42 47.1 -34 02 40. 1950 IRAS17427-3402 17 46 05.94 -34 03 48.0 +358-01.1 Bl D 17 42 48.8 -31 02 30. 1950 CGPN/Koal 65 17 46 02.72 -31 03 38.1 +358-01.1 Bl D 17 42 48.8 -31 02 29. 1950 25.135.029 17 46 02.72 -31 03 37.1 +358-01.1 Bl D 17 42 48.7 -31 02 30. 1950 61.134.050 17 46 02.62 -31 03 38.1 +358-01.1 Bl D 17 42 48.6 -31 02 28. 1950 70.002.006 17 46 02.52 -31 03 36.1 +051+25.1 K 1-15 17 42 57.3 +27 21 20. 1950 02.133.027 17 44 56.61 +27 20 09.9 +051+25.1 K 1-15 17 42 57.8 +27 21 17. 1950 09.133.025 17 44 57.12 +27 20 07.0 +051+25.1 K 1-15 17 42 57.4 +27 21 15. 1950 70.002.006 17 44 56.72 +27 20 04.9 +008+05.1 Th 4-2 17 43 16.86 -18 39 39.6 1950 54.134.034 * 17 46 13.17 -18 40 46.2 +008+05.1 Th 4-2 17 43 13.1 -18 38 21. 1950 70.002.006 17 46 09.38 -18 39 27.9 +008+05.1 Th 4-2 17 46 09.15 -18 39 34.9 2000 70.002.006 rad 17 46 09.15 -18 39 34.9 +008+05.1 Th 4-2 17 43 13.6 -18 38 23. 1950 Ko,Ku (1999) 17 46 09.88 -18 39 29.9 +008+05.1 Th 4-2 17 43 12.9 -18 38 26. 1950 IRAS17432-1838 17 46 09.18 -18 39 32.9 +007+04.1 Th 4-1 17 43 22.4 -20 12 42. 1950 70.002.006 17 46 20.74 -20 13 48.2 +007+04.1 Th 4-1 17 43 22.6 -20 12 44. 1950 Ko,Ku (1999) 17 46 20.94 -20 13 50.2 +356-02.2 * M 1-27 17 43 29. -33 07 29. 1950 CGPN/Mi 59 * 17 46 46.31 -33 08 34.0 +356-02.2 * M 1-27 17 43 28.2 -33 07 30. 1950 CGPN/Koal 65 17 46 45.51 -33 08 35.1 +356-02.2 * M 1-27 17 43 28.2 -33 07 37. 1950 Wr (1966) 17 46 45.51 -33 08 42.1 +356-02.2 * M 1-27 17 43 28.3 -33 07 17. 1950 10.114.152 17 46 45.60 -33 08 22.1 +356-02.2 * M 1-27 17 43 28.2 -33 07 30. 1950 50.134.178 17 46 45.51 -33 08 35.1 +356-02.2 * M 1-27 17 43 28.22 -33 07 29.3 1950 61.134.050 17 46 45.53 -33 08 34.4 +356-02.2 * M 1-27 17 43 28.2 -33 07 30. 1950 70.002.006 17 46 45.51 -33 08 35.1 +356-02.2 * M 1-27 17 46 45.47 -33 08 34.9 2000 70.002.006 rad 17 46 45.47 -33 08 34.9 +356-02.2 * M 1-27 17 43 28.4 -33 07 31. 1950 Ko,Ku (1999) 17 46 45.71 -33 08 36.1 +358-01.4 JaSt 55 17 43 39.01 -30 36 38.4 1950 Ja,St (1997) 17 46 52.26 -30 37 42.8 +356-02.3 * K 6-12 17 44 00.3 -33 14 36. 1950 61.134.050 17 47 17.81 -33 15 38.7 +356-02.3 * K 6-12 17 44 00.5 -33 14 37. 1950 Ko,Ku (1999) 17 47 18.01 -33 15 39.7 +011+06.1 M 2-15 17 44 01. -16 16 20. 1950 CGPN/Mi 59 17 46 54.26 -16 17 23.5 +011+06.1 M 2-15 17 44 01.0 -16 16 20. 1950 18.133.025 17 46 54.26 -16 17 23.5 +011+06.1 M 2-15 17 44 01.3 -16 16 21. 1950 50.134.178 17 46 54.56 -16 17 24.5 +011+06.1 M 2-15 17 44 01.48 -16 16 31.7 1950 54.134.034 17 46 54.74 -16 17 35.2 +011+06.1 M 2-15 17 44 01.3 -16 16 22. 1950 70.002.006 17 46 54.56 -16 17 25.5 +011+06.1 M 2-15 17 46 54.44 -16 17 23.1 2000 70.002.006 rad 17 46 54.44 -16 17 23.1 +011+06.1 M 2-15 17 44 00.3 -16 16 23. 1950 IRAS17440-1616 17 46 53.56 -16 17 26.6 +356-02.1 * H 2-21 17 44 08.6 -32 49 03. 1950 CGPN/Koal 65 * 17 47 25.41 -32 50 05.2 +356-02.1 * H 2-21 17 44 10.7 -32 48 57. 1950 61.134.050 17 47 27.50 -32 49 59.0 +356-02.1 * H 2-21 17 44 11.0 -32 48 59. 1950 Ko,Ku (1999) 17 47 27.81 -32 50 01.0 +352-04.2 SB 37 17 47 52.7 -37 48 03.4 2000 71.134.030 17 47 52.7 -37 48 03.4 +352-04.2 SB 37 17 44 27.3 -37 47 03. 1950 Ko,Ku (1999) 17 47 52.81 -37 48 03.5 +352-04.2 SB 37 17 44 28.7 -37 47 01. 1950 IRAS17444-3747 17 47 54.21 -37 48 01.4 +004+02.2 IRAS17445-2412 17 44 28.2 -24 12 06. 1950 46.134.040 * 17 47 31.97 -24 13 07.2 +004+02.2 IRAS17445-2412 17 44 28.31 -24 12 06.2 1950 61.134.050 17 47 32.08 -24 13 07.4 +004+02.2 IRAS17445-2412 17 44 28.12 -24 12 07.1 1950 72.002.012 rad 17 47 31.89 -24 13 08.3 +004+02.2 IRAS17445-2412 17 47 32.0 -24 13 07. 2000 72.002.012 17 47 32.0 -24 13 07. +004+02.2 IRAS17445-2412 17 44 28.3 -24 12 05. 1950 Ko,Ku (1999) 17 47 32.07 -24 13 06.2 +004+02.2 IRAS17445-2412 17 44 30.8 -24 12 22. 1950 IRAS17445-2412 17 47 34.58 -24 13 23.0 +355-03.1 H 1-33 17 44 30.4 -34 07 04. 1950 CGPN/Koal 65 17 47 49.39 -34 08 04.5 +355-03.1 H 1-33 17 44 30.4 -34 07 04. 1950 50.134.178 17 47 49.39 -34 08 04.5 +355-03.1 H 1-33 17 44 30.48 -34 07 04.8 1950 61.134.050 17 47 49.47 -34 08 05.3 +355-03.1 H 1-33 17 44 30.4 -34 07 05. 1950 70.002.006 17 47 49.39 -34 08 05.5 +355-03.1 H 1-33 17 47 49.53 -34 08 03.3 2000 70.002.006 rad 17 47 49.53 -34 08 03.3 +006+03.1 * H 2-22 17 44 34.2 -21 46 41. 1950 CGPN/Fc 62 * 17 47 34.64 -21 47 41.9 +006+03.1 * H 2-22 17 44 33.5 -21 46 23. 1950 CGPN/Koal 65 17 47 33.93 -21 47 23.9 +006+03.1 * H 2-22 17 44 33.5 -21 46 22. 1950 70.002.006 17 47 33.93 -21 47 22.9 +006+03.1 * H 2-22 17 47 33.65 -21 47 26.6 2000 70.002.006 rad 17 47 33.65 -21 47 26.6 +006+03.1 * H 2-22 17 44 33.2 -21 46 25. 1950 IRAS17445-2146 17 47 33.63 -21 47 25.9 +353-04.2 * K 6-13 17 44 37.0 -36 49 07. 1950 61.134.050 17 48 00.73 -36 50 06.8 +353-04.2 * K 6-13 17 44 37.4 -36 49 08. 1950 Ko,Ku (1999) 17 48 01.13 -36 50 07.8 +006+03.2 M 1-28 17 44 37. -22 05 22. 1950 CGPN/Mi 59 17 47 37.86 -22 06 22.6 +006+03.2 M 1-28 17 44 37.3 -22 05 26. 1950 CGPN/Fc 62 17 47 38.16 -22 06 26.6 +006+03.2 M 1-28 17 44 37.4 -22 05 19. 1950 CGPN/Koal 65 17 47 38.26 -22 06 19.6 +006+03.2 M 1-28 17 44 36.8 -22 05 29.0 1950 11.133.011 17 47 37.67 -22 06 29.7 +006+03.2 M 1-28 17 44 37.4 -22 05 19. 1950 18.133.025 17 47 38.26 -22 06 19.6 +006+03.2 M 1-28 17 44 37.5 -22 05 20. 1950 70.002.006 17 47 38.36 -22 06 20.6 +006+03.2 M 1-28 17 47 38.31 -22 06 20.1 2000 70.002.006 rad 17 47 38.31 -22 06 20.1 +006+03.2 M 1-28 17 44 37.9 -22 05 25. 1950 IRAS17446-2205 17 47 38.76 -22 06 25.6 +359-00.1 Hb 5 17 44 43.9 -29 58 39. 1950 CGPN/Koal 65 * 17 47 56.17 -29 59 38.7 +359-00.1 Hb 5 17 44 44.5 -29 58 53. 1950 09.133.025 17 47 56.78 -29 59 52.7 +359-00.1 Hb 5 17 44 43.97 -29 58 43.1 1950 25.135.020 17 47 56.24 -29 59 42.8 +359-00.1 Hb 5 17 44 43.93 -29 58 38.7 1950 55.002.049 17 47 56.20 -29 59 38.4 +359-00.1 Hb 5 17 44 43.95 -29 58 40.6 1950 61.134.050 17 47 56.22 -29 59 40.3 +359-00.1 Hb 5 17 44 43.9 -29 58 40. 1950 70.002.006 17 47 56.17 -29 59 39.7 +359-00.1 Hb 5 17 47 56.28 -29 59 40.6 2000 70.002.006 rad 17 47 56.28 -29 59 40.6 +359-00.1 Hb 5 17 44 43.8 -29 58 41. 1950 IRAS17447-2958 17 47 56.07 -29 59 40.8 +006+03.3 * IRAS17448-2131 17 44 48.5 -21 31 13. 1950 Ko,Ku (1999) 17 47 48.60 -21 32 12.8 +006+03.3 * IRAS17448-2131 17 44 49.6 -21 31 24. 1950 IRAS17448-2131 17 47 49.70 -21 32 23.8 +005+02.1 H 1-34 17 45 05.9 -22 45 50. 1950 CGPN/Koal 65 17 48 07.68 -22 46 48.5 +005+02.1 H 1-34 17 45 05.79 -22 45 41.6 1950 54.134.034 17 48 07.57 -22 46 40.1 +005+02.1 H 1-34 17 45 05.9 -22 45 48. 1950 61.134.050 17 48 07.68 -22 46 46.5 +005+02.1 H 1-34 17 45 05.7 -22 45 49. 1950 70.002.006 17 48 07.48 -22 46 47.5 +005+02.1 H 1-34 17 45 06.2 -22 45 50. 1950 IRAS17451-2245 17 48 07.98 -22 46 48.5 +355-03.4 K 5-18 17 45 09.0 -35 04 33. 1950 61.134.050 17 48 29.64 -35 05 30.6 +355-03.4 K 5-18 17 45 09.1 -35 04 33. 1950 Ko,Ku (1999) 17 48 29.74 -35 05 30.6 +003+01.1 Ta 2111 17 48 28.3 -24 41 29. 2000 56.134.011 17 48 28.3 -24 41 29. +003+01.1 Ta 2111 17 45 24.1 -24 40 27. 1950 61.134.050 17 48 28.54 -24 41 24.1 +003+01.1 Ta 2111 17 45 24.1 -24 40 24. 1950 70.002.006 17 48 28.54 -24 41 21.1 +003+01.1 Ta 2111 17 48 28.54 -24 41 24.4 2000 70.002.006 rad 17 48 28.54 -24 41 24.4 +003+01.1 Ta 2111 17 45 24.3 -24 40 29. 1950 Ko,Ku (1999) 17 48 28.74 -24 41 26.1 +003+01.1 Ta 2111 17 45 25.3 -24 40 30. 1950 IRAS17454-2440 17 48 29.74 -24 41 27.0 +011+05.1 NGC 6439 17 44 13.6 -16 27 18.4 1929 CGPN/Sr 30 * 17 48 19.91 -16 28 43.6 +011+05.1 NGC 6439 17 45 26.0 -16 27 44. 1950 09.133.025 17 48 19.50 -16 28 41.3 +011+05.1 NGC 6439 17 45 26.30 -16 27 47.4 1950 10.113.006 17 48 19.81 -16 28 44.7 +011+05.1 NGC 6439 17 45 26.31 -16 27 47.1 1950 37.134.035 17 48 19.82 -16 28 44.4 +011+05.1 NGC 6439 17 45 26.31 -16 27 47.1 1950 52.002.003 17 48 19.82 -16 28 44.4 +011+05.1 NGC 6439 17 45 26.3 -16 27 47. 1950 70.002.006 17 48 19.81 -16 28 44.3 +011+05.1 NGC 6439 17 48 19.82 -16 28 42.8 2000 70.002.006 rad 17 48 19.82 -16 28 42.8 +011+05.1 NGC 6439 17 45 26.4 -16 27 47. 1950 Ko,Ku (1999) 17 48 19.91 -16 28 44.3 +011+05.1 NGC 6439 17 45 26.41 -16 27 46.8 1950 GSC 6249-00358 17 48 19.92 -16 28 44.1 +011+05.1 NGC 6439 17 45 26.4 -16 27 50. 1950 IRAS17454-1627 17 48 19.91 -16 28 47.3 +004+01.1 H 2-24 17 45 32.5 -24 15 39. 1950 CGPN/Koal 65 17 48 36.36 -24 16 35.5 +004+01.1 H 2-24 17 45 32.5 -24 15 39. 1950 18.133.025 17 48 36.36 -24 16 35.5 +004+01.1 H 2-24 17 45 32.76 -24 15 38.3 1950 61.134.050 17 48 36.62 -24 16 34.8 +004+01.1 H 2-24 17 45 32.7 -24 15 38. 1950 70.002.006 17 48 36.56 -24 16 34.5 +004+01.1 H 2-24 17 48 36.44 -24 16 33.4 2000 70.002.006 rad 17 48 36.44 -24 16 33.4 +006+02.1 Th 4-3 17 45 36.3 -22 15 53. 1950 CGPN/Koal 65 17 48 37.41 -22 16 49.3 +006+02.1 Th 4-3 17 45 36.0 -22 15 53. 1950 18.133.025 17 48 37.11 -22 16 49.3 +006+02.1 Th 4-3 17 45 36.3 -22 15 53. 1950 70.002.006 17 48 37.41 -22 16 49.3 +006+02.1 Th 4-3 17 48 37.80 -22 16 49.0 2000 70.002.006 rad 17 48 37.80 -22 16 49.0 +006+02.1 Th 4-3 17 45 37.0 -22 15 54. 1950 IRAS17456-2215 17 48 38.11 -22 16 50.3 +001+00.4 JaSt 60 17 45 37.94 -27 24 41.3 1950 Ja,St (1997) 17 48 46.33 -27 25 37.2 +001+00.4 JaSt 60 17 45 38.0 -27 24 41. 1950 Ko,Ku (1999) 17 48 46.39 -27 25 36.9 +355-03.2 H 2-23 17 45 38.6 -34 20 57. 1950 CGPN/Koal 65 17 48 57.99 -34 21 52.5 +355-03.2 H 2-23 17 45 38.71 -34 20 58.6 1950 61.134.050 17 48 58.10 -34 21 54.1 +355-03.2 H 2-23 17 45 38.6 -34 20 58. 1950 70.002.006 17 48 57.99 -34 21 53.5 +355-03.2 H 2-23 17 48 58.11 -34 21 51.8 2000 70.002.006 rad 17 48 58.11 -34 21 51.8 +358-01.3 JaSt 61 17 45 42.07 -31 05 46.5 1950 Ja,St (1997) 17 48 56.11 -31 06 41.9 +358-01.3 JaSt 61 17 45 42.1 -31 05 47. 1950 Ko,Ku (1999) 17 48 56.14 -31 06 42.4 +355-03.3 H 1-35 17 45 55. -34 21 56. 1950 CGPN/Mi 59 17 49 14.42 -34 22 50.3 +355-03.3 H 1-35 17 45 54.6 -34 21 59. 1950 CGPN/Koal 65 17 49 14.03 -34 22 53.3 +355-03.3 H 1-35 17 45 54.6 -34 21 59. 1950 18.133.025 17 49 14.03 -34 22 53.3 +355-03.3 H 1-35 17 45 54.5 -34 21 58. 1950 50.134.178 17 49 13.93 -34 22 52.4 +355-03.3 H 1-35 17 45 54.63 -34 21 59.6 1950 61.134.050 17 49 14.06 -34 22 53.9 +355-03.3 H 1-35 17 45 54.5 -34 21 58. 1950 70.002.006 17 49 13.93 -34 22 52.4 +355-03.3 H 1-35 17 49 13.92 -34 22 54.4 2000 70.002.006 rad 17 49 13.92 -34 22 54.4 +355-03.3 H 1-35 17 45 54.1 -34 21 59. 1950 IRAS17459-3421 17 49 13.53 -34 22 53.4 +004+02.1 H 2-25 17 45 57.5 -23 42 00. 1950 CGPN/Koal 65 17 49 00.58 -23 42 54.7 +004+02.1 H 2-25 17 45 57.4 -23 41 58. 1950 10.114.152 17 49 00.48 -23 42 52.7 +004+02.1 H 2-25 17 45 57.5 -23 42 00. 1950 18.133.025 17 49 00.58 -23 42 54.7 +004+02.1 H 2-25 17 45 57.4 -23 42 00. 1950 50.134.178 17 49 00.48 -23 42 54.7 +004+02.1 H 2-25 17 45 57.44 -23 41 58.2 1950 54.134.034 17 49 00.52 -23 42 52.9 +004+02.1 H 2-25 17 45 57.51 -23 41 59.7 1950 61.134.050 17 49 00.59 -23 42 54.4 +004+02.1 H 2-25 17 45 57.5 -23 42 00. 1950 70.002.006 17 49 00.58 -23 42 54.7 +004+02.1 H 2-25 17 49 00.48 -23 42 56.4 2000 70.002.006 rad 17 49 00.48 -23 42 56.4 +004+02.1 H 2-25 17 45 57.6 -23 42 01. 1950 Ko,Ku (1999) 17 49 00.68 -23 42 55.7 +004+02.1 H 2-25 17 45 58.9 -23 42 02. 1950 IRAS17459-2342 17 49 01.98 -23 42 56.6 +358-01.5 JaSt 62 17 46 06.85 -30 35 11.9 1950 Ja,St (1997) * 17 49 20.09 -30 36 05.6 +358-01.5 JaSt 62 17 46 07.0 -30 35 12. 1950 Ko,Ku (1999) 17 49 20.24 -30 36 05.7 +008+03.1 NGC 6445 17 42 07.96 -19 58 08.3 1880 CGPN/Wn 09 17 49 15.05 -20 00 38.4 +008+03.1 NGC 6445 17 43 19.40 -19 58 36.3 1900 CGPN/Po 10 17 49 15.36 -20 00 36.2 +008+03.1 NGC 6445 17 46 17.2 -19 59 41. 1950 09.133.025 17 49 15.27 -20 00 34.5 +008+03.1 NGC 6445 17 46 16.8 -19 59 43. 1950 70.002.006 17 49 14.87 -20 00 36.5 +008+03.1 NGC 6445 17 49 15.02 -20 00 33.7 2000 70.002.006 rad 17 49 15.02 -20 00 33.7 +008+03.1 NGC 6445 17 46 17.2 -19 59 43. 1950 IRAS17462-1959 17 49 15.27 -20 00 36.5 +353-04.1 * H 1-36 17 46 24.1 -37 00 36. 1950 CGPN/Koal 65 17 49 48.20 -37 01 28.0 +353-04.1 * H 1-36 17 46 24.1 -37 00 36. 1950 20.041.026 17 49 48.20 -37 01 28.0 +353-04.1 * H 1-36 17 46 24.13 -37 00 35.0 1950 52.002.003 17 49 48.23 -37 01 27.0 +353-04.1 * H 1-36 17 46 24.00 -37 00 35.9 1950 61.134.050 17 49 48.10 -37 01 27.9 +353-04.1 * H 1-36 17 46 24.1 -37 00 36. 1950 70.002.006 17 49 48.20 -37 01 28.0 +353-04.1 * H 1-36 17 49 48.10 -37 01 29.8 2000 70.002.006 rad 17 49 48.10 -37 01 29.8 +353-04.1 * H 1-36 17 46 23.6 -37 00 34. 1950 IRAS17463-3700 17 49 47.70 -37 01 26.1 +356-03.1 H 2-26 17 46 32.11 -33 59 39.1 1950 61.134.050 17 49 50.91 -34 00 30.7 +356-03.1 H 2-26 17 46 31.8 -33 59 40. 1950 70.002.006 17 49 50.60 -34 00 31.7 +356-03.1 H 2-26 17 49 51.30 -34 00 34.0 2000 70.002.006 rad 17 49 51.30 -34 00 34.0 +356-03.1 H 2-26 17 46 32.3 -33 59 41. 1950 Ko,Ku (1999) 17 49 51.10 -34 00 32.6 +353-05.2 JaFu 2 17 50 10.8 -37 03 25.6 2000 68.154.039 * 17 50 10.8 -37 03 25.6 +353-05.2 JaFu 2 17 46 46.8 -37 02 37. 1950 Ko,Ku (1999) 17 50 10.97 -37 03 27.4 +005+02.2 K 5-19 17 46 48.7 -23 26 53. 1950 61.134.050 17 49 51.44 -23 27 44.0 +005+02.2 K 5-19 17 46 48.8 -23 26 56. 1950 Ko,Ku (1999) 17 49 51.54 -23 27 47.0 +356-03.5 K 5-20 17 46 53.32 -33 13 26.8 1950 61.134.050 17 50 10.83 -33 14 16.9 +356-03.5 K 5-20 17 46 53.4 -33 13 28. 1950 Ko,Ku (1999) 17 50 10.91 -33 14 18.1 +351-06.2 SB 33 17 50 27.7 -39 40 17.3 2000 71.134.030 17 50 27.7 -39 40 17.3 +000-01.8 JaSt 66 17 46 58.85 -29 18 15.2 1950 Ja,St (1997) 17 50 10.10 -29 19 05.2 +000-01.8 JaSt 66 17 46 58.9 -29 18 14. 1950 Ko,Ku (1999) 17 50 10.15 -29 19 04.0 +359-01.1 M 1-29 17 47 05. -30 34 06. 1950 CGPN/Mi 59 * 17 50 18.21 -30 34 55.4 +359-01.1 M 1-29 17 47 04.8 -30 34 06. 1950 CGPN/Koal 65 17 50 18.01 -30 34 55.5 +359-01.1 M 1-29 17 47 04.8 -30 34 06. 1950 18.133.025 17 50 18.01 -30 34 55.5 +359-01.1 M 1-29 17 47 04.8 -30 34 05. 1950 50.134.178 17 50 18.01 -30 34 54.5 +359-01.1 M 1-29 17 47 04.8 -30 34 04.3 1950 52.134.002 17 50 18.01 -30 34 53.8 +359-01.1 M 1-29 17 47 04.73 -30 34 00.2 1950 55.002.049 17 50 17.94 -30 34 49.7 +359-01.1 M 1-29 17 47 04.70 -30 34 04.5 1950 61.134.050 17 50 17.91 -30 34 54.0 +359-01.1 M 1-29 17 47 04.8 -30 34 05. 1950 70.002.006 17 50 18.01 -30 34 54.5 +359-01.1 M 1-29 17 50 18.09 -30 34 55.2 2000 70.002.006 rad 17 50 18.09 -30 34 55.2 +000-01.1 M 3-43 17 47 13. -29 24 31. 1950 CGPN/Mi 59 17 50 24.41 -29 25 19.9 +000-01.1 M 3-43 17 47 12.8 -29 24 29. 1950 CGPN/Koal 65 17 50 24.21 -29 25 17.9 +000-01.1 M 3-43 17 47 12.85 -29 24 31.0 1950 25.135.020 17 50 24.26 -29 25 19.9 +000-01.1 M 3-43 17 47 12.92 -29 24 26.6 1950 55.002.049 17 50 24.33 -29 25 15.5 +000-01.1 M 3-43 17 47 13.03 -29 24 30.4 1950 61.134.050 17 50 24.44 -29 25 19.3 +000-01.1 M 3-43 17 47 12.8 -29 24 29. 1950 70.002.006 17 50 24.21 -29 25 17.9 +000-01.1 M 3-43 17 50 24.61 -29 25 23.1 2000 70.002.006 rad 17 50 24.61 -29 25 23.1 +000-01.1 M 3-43 17 47 12.9 -29 24 26. 1950 IRAS17472-2924 17 50 24.31 -29 25 14.9 +000-00.3 JaSt 68 17 47 13.29 -28 32 22.0 1950 Ja,St (1997) 17 50 23.38 -28 33 10.9 +000-00.3 JaSt 68 17 47 13.3 -28 32 20. 1950 Ko,Ku (1999) 17 50 23.39 -28 33 08.9 +351-06.1 H 1-37 17 47 16.2 -39 16 37. 1950 CGPN/Koal 65 17 50 44.58 -39 17 25.1 +351-06.1 H 1-37 17 47 16.3 -39 16 38. 1950 70.002.006 17 50 44.68 -39 17 26.1 +351-06.1 H 1-37 17 50 44.64 -39 17 26.5 2000 70.002.006 rad 17 50 44.64 -39 17 26.5 +351-06.1 H 1-37 17 47 15.2 -39 16 40. 1950 IRAS17472-3916 17 50 43.58 -39 17 28.2 +353-05.1 H 1-38 17 47 20.4 -37 23 05. 1950 CGPN/Koal 65 17 50 45.20 -37 23 52.9 +353-05.1 H 1-38 17 47 20.36 -37 23 05.3 1950 61.134.050 17 50 45.16 -37 23 53.2 +353-05.1 H 1-38 17 47 20.5 -37 23 03. 1950 70.002.006 17 50 45.30 -37 23 50.9 +332-16.1 HtTr 6 17 47 21.8 -60 22 35. 1950 34.134.052 * 17 51 53.02 -60 23 20.4 +332-16.1 HtTr 6 17 47 22.0 -60 22 36. 1950 Ko,Ku (1999) 17 51 53.22 -60 23 21.4 +008+03.2 * Th 4-4 17 47 25.9 -19 52 56. 1950 38.002.010 17 50 23.83 -19 53 44.5 +008+03.2 * Th 4-4 17 47 25.88 -19 52 54.4 1950 51.117.039 17 50 23.81 -19 53 42.9 +008+03.2 * Th 4-4 17 47 25.9 -19 52 55. 1950 Ko,Ku (1999) 17 50 23.83 -19 53 43.5 +009+04.1 Th 4-5 17 47 31.6 -19 02 24. 1950 30.135.052 17 50 28.42 -19 03 12.1 +009+04.1 Th 4-5 17 47 31.5 -19 02 20. 1950 50.134.178 17 50 28.32 -19 03 08.1 +009+04.1 Th 4-5 17 47 31.5 -19 02 20. 1950 70.002.006 17 50 28.32 -19 03 08.1 +009+04.1 Th 4-5 17 50 28.52 -19 03 10.2 2000 70.002.006 rad 17 50 28.52 -19 03 10.2 +009+04.1 Th 4-5 17 47 31.9 -19 02 22. 1950 IRAS17475-1902 17 50 28.72 -19 03 10.1 +000-00.4 JaSt 71 17 47 36.53 -28 43 48.2 1950 Ja,St (1997) 17 50 46.91 -28 44 35.4 +000-01.9 JaSt 72 17 47 36.74 -29 23 56.4 1950 Ja,St (1997) 17 50 48.14 -29 24 43.6 +000-01.9 JaSt 72 17 47 36.7 -29 23 57. 1950 Ko,Ku (1999) 17 50 48.10 -29 24 44.2 +355-04.1 Hf 2-1 17 47 51.9 -34 54 40. 1950 CGPN/Koal 65 17 51 12.28 -34 55 25.8 +355-04.1 Hf 2-1 17 47 51.9 -34 54 40. 1950 18.133.025 17 51 12.28 -34 55 25.8 +355-04.1 Hf 2-1 17 47 51.8 -34 54 35. 1950 50.134.178 17 51 12.18 -34 55 20.8 +355-04.1 Hf 2-1 17 47 51.7 -34 54 38. 1950 61.134.050 17 51 12.08 -34 55 23.8 +355-04.1 Hf 2-1 17 47 51.7 -34 54 37. 1950 70.002.006 17 51 12.08 -34 55 22.8 +355-04.1 Hf 2-1 17 51 12.18 -34 55 22.1 2000 70.002.006 rad 17 51 12.18 -34 55 22.1 +355-04.1 Hf 2-1 17 47 51.7 -34 54 37. 1950 IRAS17478-3454 17 51 12.08 -34 55 22.8 +006+02.2 * H 2-28 17 47 51.7 -22 21 29. 1950 CGPN/Fc 62 * 17 50 52.95 -22 22 15.5 +006+02.2 * H 2-28 17 47 59.7 -22 18 48. 1950 CGPN/Koal 65 17 51 00.89 -22 19 33.9 +006+02.2 * H 2-28 17 47 59.8 -22 18 49. 1950 10.114.152 17 51 00.99 -22 19 34.9 +006+02.2 * H 2-28 17 47 59.0 -22 18 48. 1950 18.133.025 17 51 00.19 -22 19 33.9 +006+02.2 * H 2-28 17 47 59.75 -22 18 48.5 1950 51.117.039 17 51 00.94 -22 19 34.4 +009+04.2 Th 4-6 17 48 00.8 -18 46 00. 1950 18.133.025 17 50 57.27 -18 46 46.0 +009+04.2 Th 4-6 17 48 00.78 -18 46 04.8 1950 54.134.034 17 50 57.25 -18 46 50.8 +009+04.2 Th 4-6 17 48 00.7 -18 46 03. 1950 70.002.006 17 50 57.17 -18 46 49.0 +009+04.2 Th 4-6 17 50 57.43 -18 46 45.2 2000 70.002.006 rad 17 50 57.43 -18 46 45.2 +009+04.2 Th 4-6 17 48 00.5 -18 46 01. 1950 IRAS17480-1846 17 50 56.97 -18 46 47.0 +000-01.14 JaSt 74 17 48 01.03 -28 55 41.8 1950 Ja,St (1997) 17 51 11.71 -28 56 27.3 +000-01.14 JaSt 74 17 48 01.0 -28 55 42. 1950 Ko,Ku (1999) 17 51 11.69 -28 56 27.5 +359-01.2 * M 3-44 17 48 06. -30 23 08. 1950 CGPN/Mi 59 17 51 18.93 -30 23 53.0 +359-01.2 * M 3-44 17 48 05.9 -30 23 09. 1950 CGPN/Koal 65 17 51 18.84 -30 23 54.0 +359-01.2 * M 3-44 17 48 06.01 -30 23 08.6 1950 34.134.032 17 51 18.94 -30 23 53.6 +359-01.2 * M 3-44 17 48 05.85 -30 23 06.9 1950 61.134.050 17 51 18.78 -30 23 51.9 +359-01.2 * M 3-44 17 48 05.9 -30 23 08. 1950 70.002.006 17 51 18.83 -30 23 53.0 +359-01.2 * M 3-44 17 51 18.95 -30 23 54.2 2000 70.002.006 rad 17 51 18.95 -30 23 54.2 +359-01.2 * M 3-44 17 48 05.7 -30 23 07. 1950 IRAS17480-3023 17 51 18.63 -30 23 52.0 +358-02.3 * MaC 1-7 17 48 09.28 -31 13 00.7 1950 22.135.002 17 51 23.53 -31 13 45.4 +358-02.3 * MaC 1-7 17 48 09.1 -31 13 02. 1950 Ko,Ku (1999) 17 51 23.35 -31 13 46.7 +000-00.5 JaSt 75 17 48 14.58 -28 34 55.9 1950 Ja,St (1997) 17 51 24.74 -28 35 40.4 +358-02.4 Ae 2-O 17 48 29.8 -32 02 21. 1950 25.135.029 17 51 45.37 -32 03 04.2 +358-02.4 Ae 2-O 17 48 29.67 -32 02 20.5 1950 61.134.050 17 51 45.24 -32 03 03.7 +358-02.4 Ae 2-O 17 48 30.4 -32 02 22. 1950 IRAS17485-3202 17 51 45.97 -32 03 05.1 +358-02.1 M 4-7 17 48 30. -31 35 18. 1950 CGPN/Mi 59 17 51 44.84 -31 36 01.2 +358-02.1 M 4-7 17 48 29.9 -31 35 17. 1950 25.135.029 17 51 44.74 -31 36 00.2 +358-02.1 M 4-7 17 48 29.9 -31 35 17. 1950 50.134.178 17 51 44.74 -31 36 00.2 +358-02.1 M 4-7 17 48 29.8 -31 35 17.24 1950 52.134.002 17 51 44.64 -31 36 00.4 +358-02.1 M 4-7 17 48 29.79 -31 35 17.5 1950 61.134.050 17 51 44.63 -31 36 00.7 +358-02.1 M 4-7 17 48 29.8 -31 35 17. 1950 70.002.006 17 51 44.64 -31 36 00.2 +358-02.1 M 4-7 17 51 44.73 -31 36 00.8 2000 70.002.006 rad 17 51 44.73 -31 36 00.8 +358-02.1 M 4-7 17 48 29.9 -31 35 16. 1950 Ko,Ku (1999) 17 51 44.74 -31 35 59.2 +358-02.1 M 4-7 17 48 29.5 -31 35 19. 1950 IRAS17484-3135 17 51 44.35 -31 36 02.2 +356-03.2 H 2-27 17 48 32.2 -33 46 51. 1950 CGPN/Koal 65 17 51 50.65 -33 47 33.9 +356-03.2 H 2-27 17 48 32.0 -33 46 53. 1950 70.002.006 17 51 50.45 -33 47 35.9 +356-03.2 H 2-27 17 51 50.69 -33 47 35.7 2000 70.002.006 rad 17 51 50.69 -33 47 35.7 +359-01.4 * IRAS17486-3001 17 48 36.3 -30 01 52.2 1950 52.134.002 17 51 48.68 -30 02 35.0 +359-01.4 * IRAS17486-3001 17 48 36.43 -30 01 50.2 1950 61.134.050 17 51 48.81 -30 02 33.0 +359-01.4 * IRAS17486-3001 17 48 36.08 -30 01 52.4 1950 72.002.012 rad 17 51 48.46 -30 02 35.2 +359-01.4 * IRAS17486-3001 17 51 48.7 -30 02 33. 2000 72.002.012 17 51 48.7 -30 02 33. +359-01.4 * IRAS17486-3001 17 48 36.6 -30 01 52. 1950 Ko,Ku (1999) 17 51 48.98 -30 02 34.8 +359-01.4 * IRAS17486-3001 17 48 36.7 -30 01 52. 1950 IRAS17486-3001 17 51 49.08 -30 02 34.8 +351-06.3 SB 34 17 52 09.6 -39 32 16.0 2000 71.134.030 17 52 09.6 -39 32 16.0 +351-06.3 SB 34 17 48 38.8 -39 31 33. 1950 IRAS17486-3931 17 52 07.68 -39 32 15.1 +000-01.11 JaSt 76 17 48 42.12 -29 30 11.0 1950 Ja,St (1997) 17 51 53.69 -29 30 53.4 +000-01.11 JaSt 76 17 48 42.2 -29 30 11. 1950 Ko,Ku (1999) 17 51 53.77 -29 30 53.4 +358-02.6 * K 6-16 17 48 45.9 -31 17 08. 1950 61.134.050 17 52 00.26 -31 17 50.1 +358-02.6 * K 6-16 17 48 46.1 -31 17 08. 1950 Ko,Ku (1999) 17 52 00.46 -31 17 50.0 +001-00.5 JaSt 77 17 48 46.62 -27 47 20.3 1950 Ja,St (1997) 17 51 55.59 -27 48 02.5 +001-00.5 JaSt 77 17 48 46.6 -27 47 20. 1950 Ko,Ku (1999) 17 51 55.57 -27 48 02.2 +359-01.3 M 3-45 17 48 55. -30 04 36. 1950 CGPN/Mi 59 17 52 07.46 -30 05 17.5 +359-01.3 M 3-45 17 48 53.5 -30 04 33. 1950 CGPN/Koal 65 17 52 05.96 -30 05 14.6 +359-01.3 M 3-45 17 48 53.5 -30 04 33.13 1950 52.134.002 17 52 05.96 -30 05 14.7 +359-01.3 M 3-45 17 48 53.49 -30 04 31.9 1950 61.134.050 17 52 05.95 -30 05 13.5 +359-01.3 M 3-45 17 48 53.5 -30 04 32. 1950 70.002.006 17 52 05.96 -30 05 13.6 +359-01.3 M 3-45 17 52 05.97 -30 05 15.9 2000 70.002.006 rad 17 52 05.97 -30 05 15.9 +359-01.3 M 3-45 17 48 54.8 -30 04 36. 1950 IRAS17489-3004 17 52 07.26 -30 05 17.5 +001-00.6 JaSt 78 17 48 55.71 -25 35 57.8 1950 Ja,St (1997) * 17 52 01.49 -25 36 39.4 +001-00.6 JaSt 78 17 48 55.8 -27 35 57. 1950 Ko,Ku (1999) 17 52 04.49 -27 36 38.5 +001-00.4 K 6-17 17 48 59.44 -28 01 36.3 1950 61.134.050 17 52 08.77 -28 02 17.5 +001-00.4 K 6-17 17 48 59.5 -28 01 38. 1950 Ko,Ku (1999) 17 52 08.83 -28 02 19.2 +345-10.1 MmWe 1-11 17 49 02.9 -46 41 14. 1950 51.134.007 * 17 52 47.52 -46 41 53.7 +345-10.1 MmWe 1-11 17 49 02.8 -46 41 17. 1950 Ko,Ku (1999) 17 52 47.43 -46 41 56.7 +010+04.1 M 2-17 17 49 10. -17 35 24. 1950 CGPN/Mi 59 17 52 04.96 -17 36 05.0 +010+04.1 M 2-17 17 49 09.6 -17 35 34. 1950 18.133.025 17 52 04.56 -17 36 15.0 +010+04.1 M 2-17 17 49 09.8 -17 35 25. 1950 50.134.178 17 52 04.76 -17 36 06.0 +010+04.1 M 2-17 17 49 09.9 -17 35 24. 1950 70.002.006 17 52 04.86 -17 36 05.0 +010+04.1 M 2-17 17 52 04.78 -17 36 03.0 2000 70.002.006 rad 17 52 04.78 -17 36 03.0 +010+04.1 M 2-17 17 49 09.3 -17 35 22. 1950 IRAS17491-1735 17 52 04.25 -17 36 03.0 +357-03.2 M 2-16 17 49 14. -32 44 00. 1950 CGPN/Mi 59 * 17 52 30.71 -32 44 39.9 +357-03.2 M 2-16 17 49 17.7 -32 45 12. 1950 CGPN/Koal 65 17 52 34.45 -32 45 51.7 +357-03.2 M 2-16 17 49 17.7 -32 45 12. 1950 18.133.025 17 52 34.45 -32 45 51.7 +357-03.2 M 2-16 17 49 17.6 -32 45 11. 1950 50.134.178 17 52 34.35 -32 45 50.7 +357-03.2 M 2-16 17 49 17.7 -32 45 10. 1950 70.002.006 17 52 34.44 -32 45 49.7 +357-03.2 M 2-16 17 52 34.48 -32 45 50.2 2000 70.002.006 rad 17 52 34.48 -32 45 50.2 +357-03.2 M 2-16 17 49 17.0 -32 45 09. 1950 IRAS17492-3245 17 52 33.74 -32 45 48.7 +006+02.3 Th 4-7 17 49 22.1 -21 50 33. 1950 CGPN/Koal 65 * 17 52 22.65 -21 51 12.9 +006+02.3 Th 4-7 17 49 22.0 -21 50 33. 1950 18.133.025 17 52 22.55 -21 51 12.9 +006+02.3 Th 4-7 17 49 22.29 -21 50 53.5 1950 54.134.034 17 52 22.85 -21 51 33.4 +006+02.3 Th 4-7 17 49 22.1 -21 50 34. 1950 70.002.006 17 52 22.65 -21 51 13.9 +006+02.3 Th 4-7 17 52 22.93 -21 51 14.9 2000 70.002.006 rad 17 52 22.93 -21 51 14.9 +000-01.2 Bl 3-15 17 49 24.8 -29 05 57.8 1950 CGPN/WHal 64 * 17 52 35.75 -29 06 37.1 +000-01.2 Bl 3-15 17 49 29.52 -29 05 23.8 1950 55.002.049 17 52 40.46 -29 06 02.8 +000-01.2 Bl 3-15 17 49 25.09 -29 05 59.9 1950 61.134.050 17 52 36.04 -29 06 39.2 +000-01.2 Bl 3-15 17 49 24.9 -29 05 59. 1950 70.002.006 17 52 35.85 -29 06 38.3 +000-01.2 Bl 3-15 17 52 36.20 -29 06 39.0 2000 70.002.006 rad 17 52 36.20 -29 06 39.0 +359-02.2 M 3-16 17 49 32. -30 48 58. 1950 CGPN/Mi 59 17 52 45.62 -30 49 36.7 +359-02.2 M 3-16 17 49 32.4 -30 48 57. 1950 CGPN/Koal 65 17 52 46.02 -30 49 35.7 +359-02.2 M 3-16 17 49 32.5 -30 48 54. 1950 50.134.178 17 52 46.12 -30 49 32.7 +359-02.2 M 3-16 17 49 32.21 -30 48 55.8 1950 61.134.050 17 52 45.83 -30 49 34.5 +359-02.2 M 3-16 17 49 32.3 -30 48 56. 1950 70.002.006 17 52 45.92 -30 49 34.7 +359-02.2 M 3-16 17 52 45.83 -30 49 36.1 2000 70.002.006 rad 17 52 45.83 -30 49 36.1 +359-02.2 M 3-16 17 49 33.6 -30 48 46. 1950 IRAS17495-3048 17 52 47.22 -30 49 24.6 +351-06.4 SB 35 17 53 02.7 -39 24 08.8 2000 71.134.030 17 53 02.7 -39 24 08.8 +351-06.4 SB 35 17 49 34.4 -39 23 32. 1950 Ko,Ku (1999) 17 53 03.03 -39 24 10.0 +332-16.2 * HtTr 7 17 49 36.2 -60 49 22. 1950 34.134.052 17 54 09.62 -60 49 57.5 +332-16.2 * HtTr 7 17 49 36. -60 49 22. 1950 68.134.063 17 54 09.42 -60 49 57.6 +332-16.2 * HtTr 7 17 49 36.4 -60 49 23. 1950 Ko,Ku (1999) 17 54 09.82 -60 49 58.5 +332-16.2 * HtTr 7 17 49 35.9 -60 49 21. 1950 IRAS17495-6049 17 54 09.32 -60 49 56.6 +010+04.2 V 4334 Sgr 17 52 32.69 -17 41 07.7 2000 Na (1996) 17 52 32.69 -17 41 07.7 +355-04.2 M 1-30 17 49 39. -34 37 46. 1950 CGPN/Mi 59 17 52 58.91 -34 38 24.0 +355-04.2 M 1-30 17 49 39.1 -34 37 43. 1950 CGPN/Koal 65 17 52 59.01 -34 38 21.0 +355-04.2 M 1-30 17 49 39.06 -34 37 45.0 1950 34.134.032 17 52 58.97 -34 38 23.0 +355-04.2 M 1-30 17 49 39.0 -34 37 47. 1950 70.002.006 17 52 58.91 -34 38 25.0 +355-04.2 M 1-30 17 52 59.05 -34 38 21.1 2000 70.002.006 rad 17 52 59.05 -34 38 21.1 +355-04.2 M 1-30 17 49 38.7 -34 37 44. 1950 IRAS17496-3437 17 52 58.61 -34 38 22.0 +006+02.5 M 1-31 17 49 40.2 -22 21 18. 1950 CGPN/Koal 65 17 52 41.45 -22 21 56.6 +006+02.5 M 1-31 17 49 40.2 -22 21 18. 1950 18.133.025 17 52 41.45 -22 21 56.6 +006+02.5 M 1-31 17 49 40.1 -22 21 16. 1950 50.134.178 17 52 41.35 -22 21 54.6 +006+02.5 M 1-31 17 49 40.2 -22 21 18. 1950 70.002.006 17 52 41.45 -22 21 56.6 +006+02.5 M 1-31 17 52 41.38 -22 21 56.5 2000 70.002.006 rad 17 52 41.38 -22 21 56.5 +006+02.5 M 1-31 17 49 40.2 -22 21 18. 1950 IRAS17496-2221 17 52 41.45 -22 21 56.6 +000-01.12 JaSt 83 17 49 40.70 -29 29 21.9 1950 Ja,St (1997) 17 52 52.25 -29 30 00.1 +007+02.1 * Th 4-8 17 49 42.0 -21 14 00. 1950 18.133.025 * 17 52 41.73 -21 14 38.5 +007+02.1 * Th 4-8 17 49 50.1 -21 15 09. 1950 Ko,Ku (1999) 17 52 49.86 -21 15 46.9 +001-01.6 JaSt 86 17 49 57.06 -28 17 32.9 1950 Ja,St (1997) 17 53 06.79 -28 18 09.9 +001-01.6 JaSt 86 17 49 57.0 -28 17 35. 1950 Ko,Ku (1999) 17 53 06.74 -28 18 12.0 +357-03.3 H 2-29 17 50 00.2 -32 40 04. 1950 CGPN/Koal 65 * 17 53 16.81 -32 40 40.6 +357-03.3 H 2-29 17 50 00.2 -32 40 01. 1950 70.002.006 17 53 16.81 -32 40 37.6 +357-03.3 H 2-29 17 53 16.84 -32 40 41.4 2000 70.002.006 rad 17 53 16.84 -32 40 41.4 +357-03.3 H 2-29 17 50 00.4 -32 40 02. 1950 Ko,Ku (1999) 17 53 17.01 -32 40 38.5 +356-03.3 H 1-39 17 50 03. -33 52 02. 1950 CGPN/Mi 59 * 17 53 21.61 -33 52 38.3 +356-03.3 H 1-39 17 50 02.4 -33 55 21. 1950 CGPN/Koal 65 17 53 21.10 -33 55 57.3 +356-03.3 H 1-39 17 50 02.3 -33 55 22. 1950 50.134.178 17 53 21.00 -33 55 58.3 +356-03.3 H 1-39 17 50 02.3 -33 55 22. 1950 70.002.006 17 53 21.00 -33 55 58.3 +356-03.3 H 1-39 17 53 21.15 -33 55 58.5 2000 70.002.006 rad 17 53 21.15 -33 55 58.5 +356-03.3 H 1-39 17 50 02.9 -33 55 23. 1950 IRAS17500-3355 17 53 21.60 -33 55 59.3 +000-01.10 JaSt 90 17 50 12.14 -29 49 12.6 1950 Ja,St (1997) * 17 53 24.21 -29 49 48.5 +000-01.10 JaSt 90 17 50 12.4 -29 49 13. 1950 Ko,Ku (1999) 17 53 24.47 -29 49 48.8 +000-01.7 Ae 2-Q 17 50 13.7 -29 16 31. 1950 25.135.029 * 17 53 24.93 -29 17 06.8 +000-01.7 Ae 2-Q 17 50 13.8 -29 16 27. 1950 70.002.006 17 53 25.03 -29 17 02.8 +000-01.7 Ae 2-Q 17 53 24.88 -29 16 57.7 2000 70.002.006 rad 17 53 24.88 -29 16 57.7 +000-01.7 Ae 2-Q 17 50 13.9 -29 16 35. 1950 Ko,Ku (1999) 17 53 25.13 -29 17 10.8 +000-01.7 Ae 2-Q 17 50 14.2 -29 16 34. 1950 IRAS17502-2916 17 53 25.43 -29 17 09.7 +357-03.4 M 2-18 17 50 22. -32 58 14. 1950 CGPN/Mi 59 17 53 39.11 -32 58 49.0 +357-03.4 M 2-18 17 50 20.8 -32 58 12. 1950 CGPN/Koal 65 17 53 37.91 -32 58 47.0 +357-03.4 M 2-18 17 50 20.8 -32 58 13. 1950 50.134.178 17 53 37.91 -32 58 48.0 +357-03.4 M 2-18 17 50 20.8 -32 58 13. 1950 70.002.006 17 53 37.91 -32 58 48.0 +357-03.4 M 2-18 17 53 37.89 -32 58 48.5 2000 70.002.006 rad 17 53 37.89 -32 58 48.5 +357-03.4 M 2-18 17 50 20.4 -32 58 13. 1950 IRAS17503-3258 17 53 37.51 -32 58 48.1 +358-02.5 Ae 2-R 17 50 22.8 -31 24 58. 1950 25.135.029 17 53 37.38 -31 25 33.0 +358-02.5 Ae 2-R 17 50 21.4 -31 24 49. 1950 70.002.006 17 53 35.98 -31 25 24.1 +358-02.5 Ae 2-R 17 50 21.8 -31 24 51. 1950 Ko,Ku (1999) 17 53 36.38 -31 25 26.1 +001-01.5 JaSt 92 17 50 25.43 -28 28 16.1 1950 Ja,St (1997) 17 53 35.44 -28 28 51.1 +001-01.5 JaSt 92 17 50 25.5 -28 28 17. 1950 Ko,Ku (1999) 17 53 35.51 -28 28 52.0 +000-01.5 M 2-19 17 50 34. -29 43 12. 1950 CGPN/Mi 59 17 53 45.91 -29 43 46.3 +000-01.5 M 2-19 17 50 33.7 -29 43 13. 1950 CGPN/Koal 65 17 53 45.61 -29 43 47.3 +000-01.5 M 2-19 17 50 33.7 -29 43 12. 1950 50.134.178 17 53 45.61 -29 43 46.3 +000-01.5 M 2-19 17 50 33.7 -29 43 10. 1950 70.002.006 17 53 45.61 -29 43 44.3 +000-01.5 M 2-19 17 53 45.64 -29 43 47.7 2000 70.002.006 rad 17 53 45.64 -29 43 47.7 +000-01.5 M 2-19 17 50 34.2 -29 43 12. 1950 IRAS17505-2943 17 53 46.11 -29 43 46.3 +006+02.4 Pe 2-10 17 50 36.4 -21 58 07. 1950 CGPN/Koal 65 17 53 37.13 -21 58 41.5 +006+02.4 Pe 2-10 17 50 36.5 -21 58 08. 1950 70.002.006 17 53 37.23 -21 58 42.5 +006+02.4 Pe 2-10 17 53 36.95 -21 58 43.4 2000 70.002.006 rad 17 53 36.95 -21 58 43.4 +000-01.13 JaSt 93 17 50 45.91 -29 19 41.6 1950 Ja,St (1997) 17 53 57.22 -29 20 15.0 +000-01.13 JaSt 93 17 50 45.9 -29 19 43. 1950 Ko,Ku (1999) 17 53 57.21 -29 20 16.4 +352-06.1 SB 36 17 54 20.6 -39 10 39.8 2000 71.134.030 17 54 20.6 -39 10 39.8 +352-06.1 SB 36 17 50 52.7 -39 10 07. 1950 Ko,Ku (1999) 17 54 20.90 -39 10 39.3 +036+17.1 A 43 17 51 11.1 +10 37 57. 1950 18.133.025 17 53 32.35 +10 37 23.6 +036+17.1 A 43 17 51 11.1 +10 37 53. 1950 34.134.010 17 53 32.35 +10 37 19.6 +036+17.1 A 43 17 51 10.9 +10 37 58. 1950 70.002.006 17 53 32.15 +10 37 24.6 +036+17.1 A 43 17 53 31.60 +10 37 30.0 2000 70.002.006 rad 17 53 31.60 +10 37 30.0 +036+17.1 A 43 17 51 10.8 +10 37 58. 1950 IRAS17511+1037 17 53 32.05 +10 37 24.6 +356-04.1 Cn 2-1 17 51 13.6 -34 21 50. 1950 CGPN/Koal 65 17 54 33.06 -34 22 21.1 +356-04.1 Cn 2-1 17 51 13.6 -34 21 50. 1950 18.133.025 17 54 33.06 -34 22 21.1 +356-04.1 Cn 2-1 17 51 13.6 -34 21 50. 1950 50.134.178 17 54 33.06 -34 22 21.1 +356-04.1 Cn 2-1 17 51 13.4 -34 21 51. 1950 70.002.006 17 54 32.86 -34 22 22.1 +356-04.1 Cn 2-1 17 54 33.07 -34 22 19.2 2000 70.002.006 rad 17 54 33.07 -34 22 19.2 +356-04.1 Cn 2-1 17 51 13.5 -34 21 51. 1950 IRAS17512-3421 17 54 32.96 -34 22 22.1 +000-01.6 M 2-20 17 51 14. -29 35 39. 1950 CGPN/Mi 59 17 54 25.72 -29 36 10.4 +000-01.6 M 2-20 17 51 13.6 -29 35 38. 1950 CGPN/Koal 65 17 54 25.32 -29 36 09.4 +000-01.6 M 2-20 17 51 13.65 -29 35 37.8 1950 54.134.034 17 54 25.37 -29 36 09.2 +000-01.6 M 2-20 17 51 13.7 -29 35 37. 1950 70.002.006 17 54 25.42 -29 36 08.4 +000-01.6 M 2-20 17 54 25.35 -29 36 09.2 2000 70.002.006 rad 17 54 25.35 -29 36 09.2 +000-01.6 M 2-20 17 51 14.0 -29 35 38. 1950 IRAS17512-2935 17 54 25.72 -29 36 09.4 +001-01.2 Bl Q 17 51 25.3 -28 12 13. 1950 CGPN/Koal 65 * 17 54 34.91 -28 12 43.6 +001-01.2 Bl Q 17 51 25.27 -28 12 09.5 1950 55.002.049 17 54 34.88 -28 12 40.1 +001-01.2 Bl Q 17 51 25.3 -28 12 13. 1950 70.002.006 17 54 34.91 -28 12 43.6 +001-01.2 Bl Q 17 54 34.93 -28 12 44.9 2000 70.002.006 rad 17 54 34.93 -28 12 44.9 +012+04.1 * IRAS17514-1555 17 51 28.3 -15 55 20. 1950 70.002.006 17 54 21.14 -15 55 51.0 +012+04.1 * IRAS17514-1555 17 51 28.5 -15 55 22. 1950 Ko,Ku (1999) 17 54 21.34 -15 55 53.0 +012+04.1 * IRAS17514-1555 17 51 28.1 -15 55 21. 1950 IRAS17514-1555 17 54 20.94 -15 55 52.0 +014+06.1 K 2-5 17 51 36.0 -12 47 47. 1950 18.133.025 * 17 54 24.96 -12 48 17.6 +014+06.1 K 2-5 17 51 43.0 -12 47 31. 1950 70.002.006 17 54 31.95 -12 48 01.0 +014+06.1 K 2-5 17 51 37.5 -12 48 05. 1950 Ko,Ku (1999) 17 54 26.46 -12 48 35.4 +001-01.4 Sa 3-92 17 51 41.4 -28 48 26. 1950 25.135.029 17 54 51.92 -28 48 55.4 +001-01.4 Sa 3-92 17 51 41.6 -28 48 26. 1950 70.002.006 17 54 52.12 -28 48 55.4 +359-02.4 M 3-46 17 51 51. -31 11 50. 1950 CGPN/Mi 59 * 17 55 05.24 -31 12 18.6 +359-02.4 M 3-46 17 51 51.5 -31 11 50. 1950 CGPN/Koal 65 17 55 05.74 -31 12 18.5 +359-02.4 M 3-46 17 51 51.8 -31 11 45. 1950 70.002.006 17 55 06.04 -31 12 13.5 +359-02.4 M 3-46 17 55 05.60 -31 12 15.0 2000 70.002.006 rad 17 55 05.60 -31 12 15.0 +007+01.1 Hb 6 17 52 06.6 -21 44 11. 1950 CGPN/Koal 65 17 55 07.02 -21 44 38.9 +007+01.1 Hb 6 17 52 06.8 -21 44 10. 1950 09.133.025 17 55 07.22 -21 44 37.9 +007+01.1 Hb 6 17 52 06.66 -21 44 12.3 1950 37.134.035 17 55 07.08 -21 44 40.2 +007+01.1 Hb 6 17 52 06.7 -21 44 12. 1950 50.134.178 17 55 07.12 -21 44 39.9 +007+01.1 Hb 6 17 52 06.63 -21 44 03.4 1950 55.002.049 17 55 07.04 -21 44 31.3 +007+01.1 Hb 6 17 52 06.6 -21 44 12. 1950 70.002.006 17 55 07.02 -21 44 39.9 +007+01.1 Hb 6 17 55 07.01 -21 44 41.0 2000 70.002.006 rad 17 55 07.01 -21 44 41.0 +007+01.1 Hb 6 17 52 06.5 -21 44 14. 1950 IRAS17521-2144 17 55 06.92 -21 44 41.9 +000-02.2 Bl 3-10 17 52 08.0 -29 57 13.9 1950 CGPN/WHal 64 17 55 20.28 -29 57 41.3 +000-02.2 Bl 3-10 17 52 08.3 -29 57 09. 1950 45.134.061 17 55 20.58 -29 57 36.4 +000-02.2 Bl 3-10 17 52 08.2 -29 57 06. 1950 70.002.006 17 55 20.48 -29 57 33.4 +000-02.2 Bl 3-10 17 55 20.45 -29 57 38.4 2000 70.002.006 rad 17 55 20.45 -29 57 38.4 +359-02.3 H 1-40 17 52 23. -30 33 07. 1950 CGPN/Mi 59 17 55 36.22 -30 33 33.3 +359-02.3 H 1-40 17 52 23.0 -30 33 15.0 1950 CGPN/WHal 64 17 55 36.22 -30 33 41.3 +359-02.3 H 1-40 17 52 22.9 -30 33 07. 1950 CGPN/Koal 65 17 55 36.12 -30 33 33.3 +359-02.3 H 1-40 17 52 23.0 -30 33 05. 1950 09.133.025 17 55 36.22 -30 33 31.3 +359-02.3 H 1-40 17 52 22.89 -30 33 06.2 1950 34.134.032 17 55 36.11 -30 33 32.5 +359-02.3 H 1-40 17 52 22.8 -30 33 05. 1950 70.002.006 17 55 36.02 -30 33 31.3 +359-02.3 H 1-40 17 55 35.85 -30 33 35.2 2000 70.002.006 rad 17 55 35.85 -30 33 35.2 +359-02.3 H 1-40 17 52 22.9 -30 33 05. 1950 IRAS17523-3033 17 55 36.12 -30 33 31.3 +053+24.1 Vy 1-2 17 52 24.7 +28 00 29. 1950 CGPN/Ko 65a 17 54 22.97 +28 00 00.2 +053+24.1 Vy 1-2 17 52 24.7 +28 00 27. 1950 70.002.006 17 54 22.97 +27 59 58.2 +053+24.1 Vy 1-2 17 54 23.49 +27 59 58.5 2000 70.002.006 rad 17 54 23.49 +27 59 58.5 +053+24.1 Vy 1-2 17 52 24.7 +28 00 26. 1950 IRAS17524+2800 17 54 22.97 +27 59 57.2 +358-03.3 * MaC 1-8 17 52 47.24 -31 37 57.4 1950 22.135.002 17 56 02.18 -31 38 21.8 +358-03.3 * MaC 1-8 17 52 47.6 -31 38 03. 1950 Ko,Ku (1999) 17 56 02.54 -31 38 27.4 +000-02.1 Bl 3-13 17 52 50.7 -29 10 53.9 1950 CGPN/WHal 64 17 56 01.79 -29 11 18.2 +000-02.1 Bl 3-13 17 52 50.7 -29 10 53. 1950 18.133.025 17 56 01.79 -29 11 17.3 +000-02.1 Bl 3-13 17 52 51.8 -29 10 53. 1950 45.134.061 17 56 02.89 -29 11 17.3 +000-02.1 Bl 3-13 17 52 51.7 -29 10 52. 1950 70.002.006 17 56 02.79 -29 11 16.3 +000-02.1 Bl 3-13 17 56 02.95 -29 11 17.0 2000 70.002.006 rad 17 56 02.95 -29 11 17.0 +000-02.1 Bl 3-13 17 52 51.3 -29 10 51. 1950 IRAS17528-2910 17 56 02.39 -29 11 15.3 +001-01.3 * H 2-31 17 52 54.2 -28 13 26. 1950 CGPN/Koal 65 * 17 56 03.84 -28 13 50.1 +001-01.3 * H 2-31 17 52 52.7 -28 13 47. 1950 70.002.006 17 56 02.35 -28 14 11.2 +001-01.3 * H 2-31 17 56 02.25 -28 14 11.9 2000 70.002.006 rad 17 56 02.25 -28 14 11.9 +001-01.3 * H 2-31 17 52 52.9 -28 13 49. 1950 Ko,Ku (1999) 17 56 02.55 -28 14 13.2 +006+01.1 * HtTr 8 17 52 53.8 -22 58 37. 1950 34.134.052 17 55 55.91 -22 59 01.4 +006+01.1 * HtTr 8 17 52 54.1 -22 58 38. 1950 70.002.006 17 55 56.21 -22 59 02.4 +006+01.1 * HtTr 8 17 55 55.71 -22 59 05.8 2000 70.002.006 rad 17 55 55.71 -22 59 05.8 +013+05.1 * Sa 3-96 17 52 55. -15 02 12. 1950 18.133.034 17 55 46.73 -15 02 36.7 +013+05.1 * Sa 3-96 17 52 54.8 -15 02 21. 1950 Ko,Ku (1999) 17 55 46.53 -15 02 45.7 +348-09.1 He 2-306 17 52 57.4 -43 02 55. 1950 Wr (1966) 17 56 33.60 -43 03 17.9 +348-09.1 He 2-306 17 52 57.6 -43 02 55. 1950 08.114.108 17 56 33.80 -43 03 17.9 +348-09.1 He 2-306 17 52 58.2 -43 02 56. 1950 IRAS17529-4302 17 56 34.40 -43 03 18.9 +013+05.2 * MaC 1-9 17 53 02.07 -14 06 25.2 1950 22.135.002 17 55 52.64 -14 06 49.4 +013+05.2 * MaC 1-9 17 53 02.3 -14 06 26. 1950 Ko,Ku (1999) 17 55 52.87 -14 06 50.2 +009+02.1 Th 4-9 17 53 00.0 -19 28 00. 1950 18.133.025 * 17 55 57.40 -19 28 24.1 +009+02.1 Th 4-9 17 53 03.3 -19 29 04. 1950 Ko,Ku (1999) 17 56 00.72 -19 29 27.9 +009+02.1 Th 4-9 17 53 03.2 -19 29 03. 1950 70.002.006 17 56 00.62 -19 29 26.9 +009+02.1 Th 4-9 17 55 59.60 -19 29 16.0 2000 70.002.006 rad 17 55 59.60 -19 29 16.0 +009+02.1 Th 4-9 17 53 02.6 -19 29 04. 1950 IRAS17530-1929 17 56 00.02 -19 29 28.0 +359-03.1 M 3-17 17 53 12. -31 03 58. 1950 CGPN/Mi 59 * 17 56 26.03 -31 04 20.7 +359-03.1 M 3-17 17 53 11.7 -31 03 56. 1950 CGPN/Koal 65 17 56 25.73 -31 04 18.7 +359-03.1 M 3-17 17 53 11.6 -31 03 53. 1950 50.134.178 17 56 25.63 -31 04 15.7 +359-03.1 M 3-17 17 53 11.5 -31 03 53. 1950 70.002.006 17 56 25.53 -31 04 15.7 +359-03.1 M 3-17 17 56 25.69 -31 04 17.1 2000 70.002.006 rad 17 56 25.69 -31 04 17.1 +011+04.1 M 1-32 17 53 26. -16 28 39. 1950 CGPN/Mi 59 17 56 19.55 -16 29 01.4 +011+04.1 M 1-32 17 53 26.0 -16 28 39. 1950 18.133.025 17 56 19.55 -16 29 01.4 +011+04.1 M 1-32 17 53 26.4 -16 28 42. 1950 50.134.178 17 56 19.95 -16 29 04.4 +011+04.1 M 1-32 17 53 26.5 -16 28 41. 1950 70.002.006 17 56 20.05 -16 29 03.3 +011+04.1 M 1-32 17 56 19.94 -16 29 04.7 2000 70.002.006 rad 17 56 19.94 -16 29 04.7 +011+04.1 M 1-32 17 53 26.2 -16 28 42. 1950 IRAS17534-1628 17 56 19.75 -16 29 04.4 +356-04.2 H 1-41 17 54 00.1 -34 09 30. 1950 CGPN/Koal 65 17 57 19.22 -34 09 49.0 +356-04.2 H 1-41 17 54 00.1 -34 09 30. 1950 18.133.025 17 57 19.22 -34 09 49.0 +356-04.2 H 1-41 17 54 00.0 -34 09 29. 1950 50.134.178 17 57 19.12 -34 09 48.0 +356-04.2 H 1-41 17 54 00.0 -34 09 30. 1950 70.002.006 17 57 19.12 -34 09 49.0 +356-04.2 H 1-41 17 57 19.13 -34 09 47.5 2000 70.002.006 rad 17 57 19.13 -34 09 47.5 +356-04.2 H 1-41 17 53 59.6 -34 09 31. 1950 IRAS17539-3409 17 57 18.72 -34 09 50.0 +357-04.1 H 1-42 17 54 07.1 -33 35 24. 1950 CGPN/Koal 65 17 57 25.26 -33 35 42.5 +357-04.1 H 1-42 17 54 07.1 -33 35 24. 1950 Wr (1966) 17 57 25.26 -33 35 42.5 +357-04.1 H 1-42 17 54 06.9 -33 35 22. 1950 70.002.006 17 57 25.06 -33 35 40.5 +357-04.1 H 1-42 17 57 25.19 -33 35 42.4 2000 70.002.006 rad 17 57 25.19 -33 35 42.4 +357-04.1 H 1-42 17 54 06.7 -33 35 25. 1950 IRAS17541-3335 17 57 24.86 -33 35 43.5 +010+03.1 Th 4-10 17 54 10.9 -18 06 24. 1950 70.002.006 17 57 06.53 -18 06 43.0 +010+03.1 Th 4-10 17 57 06.56 -18 06 48.7 2000 70.002.006 rad 17 57 06.56 -18 06 48.7 +010+03.1 Th 4-10 17 54 11.0 -18 06 23. 1950 Ko,Ku (1999) 17 57 06.63 -18 06 42.0 +010+03.1 Th 4-10 17 54 11.1 -18 06 24. 1950 IRAS17541-1806 17 57 06.73 -18 06 43.0 +007+01.2 * M 3-18 17 51 16. -21 41 12. 1950 CGPN/Mi 59 * 17 54 16.35 -21 41 43.6 +007+01.2 * M 3-18 17 54 15.6 -21 41 09. 1950 CGPN/Koal 65 17 57 15.95 -21 41 27.5 +007+01.2 * M 3-18 17 54 15.7 -21 41 10. 1950 10.114.152 17 57 16.05 -21 41 28.5 +007+01.2 * M 3-18 17 54 15.6 -21 41 09. 1950 18.133.025 17 57 15.95 -21 41 27.5 +007+01.2 * M 3-18 17 54 15.68 -21 41 10.5 1950 34.134.032 17 57 16.03 -21 41 29.0 +007+01.2 * M 3-18 17 54 15.6 -21 41 10. 1950 38.002.010 17 57 15.95 -21 41 28.5 +007+01.2 * M 3-18 17 54 15.71 -21 41 10.4 1950 51.117.039 17 57 16.06 -21 41 28.9 +007+01.2 * M 3-18 17 54 15.64 -21 41 10.3 1950 51.117.039 rad 17 57 15.99 -21 41 28.8 +000-02.5 M 3-47 17 54 29.27 -30 01 45.2 1950 25.135.020 * 17 57 41.68 -30 02 02.3 +000-02.5 M 3-47 17 54 30.9 -30 02 13. 1950 70.002.006 17 57 43.32 -30 02 30.0 +000-02.5 M 3-47 17 54 31.1 -30 02 14. 1950 Ko,Ku (1999) 17 57 43.52 -30 02 31.0 +358-03.1 H 1-44 17 54 56. -31 42 40. 1950 CGPN/Mi 59 17 58 11.07 -31 42 55.1 +358-03.1 H 1-44 17 54 55.7 -31 42 42. 1950 CGPN/Koal 65 17 58 10.77 -31 42 57.1 +358-03.1 H 1-44 17 54 55.6 -31 42 42. 1950 70.002.006 17 58 10.67 -31 42 57.1 +358-03.1 H 1-44 17 58 10.85 -31 43 00.3 2000 70.002.006 rad 17 58 10.85 -31 43 00.3 +358-03.1 H 1-44 17 54 55.4 -31 42 44. 1950 IRAS17549-3142 17 58 10.47 -31 42 59.1 +357-04.3 H 1-43 17 54 56. -33 47 22. 1950 CGPN/Mi 59 * 17 58 14.50 -33 47 36.9 +357-04.3 H 1-43 old 17 54 57.1 -33 47 31. 1950 CGPN/Koal 65 17 58 15.60 -33 47 45.9 +357-04.3 H 1-43 old 17 54 55.8 -33 47 25. 1950 Wr (1966) 17 58 14.30 -33 47 40.0 +357-04.3 H 1-43 old 17 54 56.0 -33 47 22. 1950 10.114.152 17 58 14.50 -33 47 36.9 +357-04.3 H 1-43 old 17 54 56.0 -33 47 20. 1950 50.134.178 17 58 14.50 -33 47 34.9 +357-04.3 H 1-43 old 17 54 56.0 -33 47 22. 1950 70.002.006 17 58 14.50 -33 47 36.9 +357-04.3 H 1-43 old 17 58 15.25 -33 47 40.2 2000 70.002.006 rad 17 58 15.25 -33 47 40.2 +357-04.3 H 1-43 old 17 54 56.2 -33 47 22. 1950 Ko,Ku (1999) 17 58 14.70 -33 47 36.9 +357-04.3 H 1-43 old 17 54 57.3 -33 47 30. 1950 Ko,Ku (1999) 17 58 15.80 -33 47 44.8 +357-04.3 H 1-43 old 17 54 56.7 -33 47 24. 1950 IRAS17549-3347 17 58 15.20 -33 47 38.9 +000-02.4 M 2-21 17 54 57. -29 44 07. 1950 CGPN/Mi 59 17 58 08.95 -29 44 22.1 +000-02.4 M 2-21 17 54 57.8 -29 44 06. 1950 CGPN/Koal 65 17 58 09.75 -29 44 21.0 +000-02.4 M 2-21 17 54 57.8 -29 44 06. 1950 18.133.025 17 58 09.75 -29 44 21.0 +000-02.4 M 2-21 17 54 57.8 -29 44 06. 1950 25.135.020 17 58 09.75 -29 44 21.0 +000-02.4 M 2-21 17 54 57.6 -29 44 05. 1950 70.002.006 17 58 09.55 -29 44 20.1 +000-02.4 M 2-21 17 58 09.82 -29 44 18.7 2000 70.002.006 rad 17 58 09.82 -29 44 18.7 +359-03.2 H 2-33 17 54 58.6 -31 07 53. 1950 CGPN/Koal 65 17 58 12.74 -31 08 07.9 +359-03.2 H 2-33 17 54 58.4 -31 07 51. 1950 50.134.178 17 58 12.54 -31 08 05.9 +359-03.2 H 2-33 17 54 58.4 -31 07 51. 1950 70.002.006 17 58 12.54 -31 08 05.9 +359-03.2 H 2-33 17 58 12.70 -31 08 09.5 2000 70.002.006 rad 17 58 12.70 -31 08 09.5 +359-03.2 H 2-33 17 54 57.2 -31 07 39. 1950 IRAS17549-3107 17 58 11.34 -31 07 54.0 +000-02.6 M 3-19 17 55 07.1 -30 00 27. 1950 CGPN/Koal 65 * 17 58 19.47 -30 00 41.3 +000-02.6 M 3-19 17 55 05.61 -29 59 56.2 1950 25.135.020 17 58 17.97 -30 00 10.7 +000-02.6 M 3-19 17 55 07.0 -30 00 24. 1950 50.134.178 17 58 19.37 -30 00 38.4 +000-02.6 M 3-19 17 55 06.8 -30 00 24. 1950 70.002.006 17 58 19.17 -30 00 38.4 +000-02.6 M 3-19 17 58 19.36 -30 00 41.6 2000 70.002.006 rad 17 58 19.36 -30 00 41.6 +000-02.6 M 3-19 17 55 07.1 -30 00 27. 1950 IRAS17551-3000 17 58 19.47 -30 00 41.3 +002-02.1 H 1-45 17 55 12. -28 14 40. 1950 CGPN/Mi 59 17 58 21.68 -28 14 54.1 +002-02.1 H 1-45 17 55 11.8 -28 14 41. 1950 CGPN/Fc 62 17 58 21.48 -28 14 55.1 +002-02.1 H 1-45 17 55 12.2 -28 14 38. 1950 CGPN/Koal 65 17 58 21.88 -28 14 52.1 +002-02.1 H 1-45 17 55 12.2 -28 14 39. 1950 70.002.006 17 58 21.88 -28 14 53.1 +002-02.1 H 1-45 17 55 13.4 -28 14 40. 1950 IRAS17552-2814 17 58 23.08 -28 14 54.0 +001-02.2 Sa 3-104 17 55 14.9 -29 20 32. 1950 70.002.006 17 58 26.25 -29 20 45.8 +001-02.2 Sa 3-104 17 55 14.7 -29 20 35. 1950 Ko,Ku (1999) 17 58 26.05 -29 20 48.8 +001-02.2 Sa 3-104 17 55 13.2 -29 20 35. 1950 IRAS17552-2920 17 58 24.55 -29 20 48.9 +357-04.2 M 2-22 17 55 15. -33 28 23. 1950 CGPN/Mi 59 17 58 32.97 -33 28 36.6 +357-04.2 M 2-22 17 55 14.7 -33 28 23. 1950 CGPN/Koal 65 17 58 32.67 -33 28 36.6 +357-04.2 M 2-22 17 55 14.7 -33 28 23. 1950 18.133.025 17 58 32.67 -33 28 36.6 +357-04.2 M 2-22 17 55 14.7 -33 28 23. 1950 50.134.178 17 58 32.67 -33 28 36.6 +357-04.2 M 2-22 17 55 14.7 -33 28 23. 1950 70.002.006 17 58 32.67 -33 28 36.6 +357-04.2 M 2-22 17 58 32.80 -33 28 39.8 2000 70.002.006 rad 17 58 32.80 -33 28 39.8 +357-04.2 M 2-22 17 55 14.1 -33 28 25. 1950 IRAS17552-3328 17 58 32.07 -33 28 38.6 +001-02.1 * H 2-34 17 55 17.9 -28 33 28. 1950 CGPN/Koal 65 17 58 28.05 -28 33 41.6 +001-02.1 * H 2-34 17 55 18.0 -28 33 30. 1950 Ko,Ku (1999) 17 58 28.15 -28 33 43.6 +002-01.1 Pe 2-11 17 55 22.5 -27 36 52. 1950 CGPN/Koal 65 17 58 31.24 -27 37 05.4 +002-01.1 Pe 2-11 17 55 22.1 -27 36 54. 1950 70.002.006 17 58 30.84 -27 37 07.4 +002-01.1 Pe 2-11 17 55 22.2 -27 36 54. 1950 Ko,Ku (1999) 17 58 30.94 -27 37 07.4 +358-04.1 H 1-46 17 55 46.3 -32 21 33. 1950 CGPN/Koal 65 17 59 02.42 -32 21 44.4 +358-04.1 H 1-46 17 55 46.3 -32 21 33. 1950 18.133.025 17 59 02.42 -32 21 44.4 +358-04.1 H 1-46 17 55 46.4 -32 21 32. 1950 50.134.178 17 59 02.52 -32 21 43.3 +358-04.1 H 1-46 17 55 46.3 -32 21 32. 1950 70.002.006 17 59 02.42 -32 21 43.4 +358-04.1 H 1-46 17 59 02.38 -32 21 42.5 2000 70.002.006 rad 17 59 02.38 -32 21 42.5 +358-04.1 H 1-46 17 55 45.6 -32 21 33. 1950 IRAS17557-3221 17 59 01.72 -32 21 44.4 +349-09.1 SB 32 17 59 26.9 -42 24 52.3 2000 71.134.030 17 59 26.9 -42 24 52.3 +349-09.1 SB 32 17 55 52.0 -42 24 38. 1950 Ko,Ku (1999) 17 59 26.83 -42 24 48.3 +000-03.2 KnFs 1 17 56 03.3 -30 02 38. 1950 45.134.023 17 59 15.73 -30 02 48.2 +000-03.2 KnFs 1 17 56 03.2 -30 02 38. 1950 70.002.006 17 59 15.63 -30 02 48.3 +000-03.2 KnFs 1 17 59 16.00 -30 02 52.7 2000 70.002.006 rad 17 59 16.00 -30 02 52.7 +000-03.2 KnFs 1 17 56 03.3 -30 02 39. 1950 Ko,Ku (1999) 17 59 15.73 -30 02 49.2 +013+04.1 M 1-33 17 56 07. -15 32 06. 1950 CGPN/Mi 59 17 58 59.36 -15 32 16.7 +013+04.1 M 1-33 17 56 06.47 -15 32 04.0 1950 10.113.006 17 58 58.83 -15 32 14.7 +013+04.1 M 1-33 17 56 06.4 -15 32 03. 1950 50.134.178 17 58 58.76 -15 32 13.7 +013+04.1 M 1-33 17 56 06.5 -15 32 04. 1950 70.002.006 17 58 58.86 -15 32 14.7 +013+04.1 M 1-33 17 58 58.91 -15 32 15.0 2000 70.002.006 rad 17 58 58.91 -15 32 15.0 +013+04.1 M 1-33 17 56 07.0 -15 32 03. 1950 IRAS17561-1532 17 58 59.36 -15 32 13.7 +002-02.2 M 3-20 17 56 10. -28 13 25. 1950 CGPN/Mi 59 17 59 19.65 -28 13 34.9 +002-02.2 M 3-20 17 56 08.7 -28 13 41. 1950 CGPN/Fc 62 17 59 18.35 -28 13 51.0 +002-02.2 M 3-20 17 56 09.7 -28 13 38. 1950 CGPN/Koal 65 17 59 19.35 -28 13 47.9 +002-02.2 M 3-20 17 56 09.7 -28 13 38. 1950 18.133.025 17 59 19.35 -28 13 47.9 +002-02.2 M 3-20 17 56 09.7 -28 13 39. 1950 70.002.006 17 59 19.35 -28 13 48.9 +002-02.2 M 3-20 17 59 19.44 -28 13 49.6 2000 70.002.006 rad 17 59 19.44 -28 13 49.6 +002-02.2 M 3-20 17 56 10.1 -28 13 39. 1950 IRAS17561-2813 17 59 19.75 -28 13 48.9 +358-04.2 * Sa 3-107 17 56 37.8 -32 59 04. 1950 Wr (1966) 17 59 54.95 -32 59 11.6 +358-04.2 * Sa 3-107 17 56 37.89 -32 59 00.7 1950 72.002.012 rad 17 59 55.04 -32 59 08.3 +358-04.2 * Sa 3-107 17 59 55.0 -32 59 11. 2000 72.002.012 17 59 55.0 -32 59 11. +358-04.2 * Sa 3-107 17 56 38.1 -32 59 04. 1950 Ko,Ku (1999) 17 59 55.25 -32 59 11.5 +358-04.2 * Sa 3-107 17 56 38.6 -32 59 05. 1950 IRAS17566-3259 17 59 55.75 -32 59 12.5 +359-04.1 M 3-48 17 56 42. -31 54 18. 1950 CGPN/Mi 59 17 59 57.38 -31 54 25.3 +359-04.1 M 3-48 17 56 41.4 -31 54 27. 1950 CGPN/Koal 65 17 59 56.79 -31 54 34.4 +359-04.1 M 3-48 17 56 41.5 -31 54 20. 1950 70.002.006 17 59 56.89 -31 54 27.4 +352-07.1 Fg 3 17 56 44.4 -38 49 45. 1950 CGPN/Koal 65 18 00 11.97 -38 49 51.7 +352-07.1 Fg 3 17 56 44.4 -38 49 43. 1950 08.114.108 18 00 11.97 -38 49 49.7 +352-07.1 Fg 3 17 56 44.4 -38 49 45. 1950 09.133.025 18 00 11.97 -38 49 51.7 +352-07.1 Fg 3 17 56 44.2 -38 49 46. 1950 70.002.006 18 00 11.77 -38 49 52.7 +352-07.1 Fg 3 18 00 11.83 -38 49 51.9 2000 70.002.006 rad 18 00 11.83 -38 49 51.9 +352-07.1 Fg 3 17 56 43.4 -38 49 46. 1950 IRAS17567-3849 18 00 10.97 -38 49 52.8 +340-14.1 SKWL 2-41 17 56 57.5 -52 44 16. 1950 Wr (1966) 18 00 59.13 -52 44 20.5 +340-14.1 SKWL 2-41 17 56 57.6 -52 44 17. 1950 08.114.108 18 00 59.23 -52 44 21.5 +340-14.1 SKWL 2-41 17 56 57.6 -52 44 17. 1950 11.133.012 18 00 59.23 -52 44 21.5 +340-14.1 SKWL 2-41 17 56 57.9 -52 44 18. 1950 Ko,Ku (1999) 18 00 59.53 -52 44 22.5 +356-05.1 H 2-35 17 56 58.8 -34 27 35. 1950 CGPN/Koal 65 * 18 00 18.44 -34 27 40.9 +356-05.1 H 2-35 17 56 59.0 -34 27 34. 1950 70.002.006 18 00 18.64 -34 27 39.9 +356-05.1 H 2-35 18 00 17.70 -34 27 43.0 2000 70.002.006 rad 18 00 17.70 -34 27 43.0 +011+02.1 Th 4-11 17 57 13.9 -17 40 40. 1950 10.114.152 18 00 08.98 -17 40 45.7 +011+02.1 Th 4-11 17 57 14.0 -17 40 24. 1950 18.133.025 18 00 09.07 -17 40 29.7 +011+02.1 Th 4-11 17 57 13.7 -17 40 37. 1950 70.002.006 18 00 08.78 -17 40 42.7 +011+02.1 Th 4-11 17 57 13.5 -17 40 37. 1950 IRAS17572-1740 18 00 08.58 -17 40 42.7 +002-02.5 KnFs 2 17 57 50.1 -28 16 16. 1950 45.134.023 18 00 59.82 -28 16 18.6 +002-02.5 KnFs 2 17 57 50.1 -28 16 20. 1950 62.134.030 18 00 59.82 -28 16 22.6 +002-02.5 KnFs 2 17 57 50.1 -28 16 16. 1950 70.002.006 18 00 59.82 -28 16 18.6 +002-02.5 KnFs 2 17 57 50.4 -28 16 18. 1950 Ko,Ku (1999) 18 01 00.12 -28 16 20.5 +002-02.3 Pe 2-12 17 58 01.1 -27 38 29. 1950 Wr (1966) 18 01 09.88 -27 38 30.8 +002-02.3 Pe 2-12 17 58 01.2 -27 38 23. 1950 50.134.178 18 01 09.98 -27 38 24.8 +002-02.3 Pe 2-12 17 58 01.5 -27 38 18. 1950 70.002.006 18 01 10.27 -27 38 19.8 +002-02.3 Pe 2-12 17 58 01.6 -27 38 25. 1950 IRAS17580-2738 18 01 10.38 -27 38 26.8 +357-05.1 M 1-34 17 58 05. -33 17 46. 1950 CGPN/Mi 59 18 01 22.67 -33 17 47.2 +357-05.1 M 1-34 17 58 04.7 -33 17 43. 1950 CGPN/Koal 65 18 01 22.37 -33 17 44.2 +357-05.1 M 1-34 17 58 04.7 -33 17 43. 1950 18.133.025 18 01 22.37 -33 17 44.2 +357-05.1 M 1-34 17 58 04.6 -33 17 41. 1950 70.002.006 18 01 22.27 -33 17 42.2 +357-05.1 M 1-34 18 01 22.19 -33 17 42.2 2000 70.002.006 rad 18 01 22.19 -33 17 42.2 +357-05.1 M 1-34 17 58 04.8 -33 17 41. 1950 IRAS17580-3317 18 01 22.47 -33 17 42.2 +014+04.1 Sa 3-111 17 58 15.2 -14 30 22. 1950 70.002.006 18 01 06.27 -14 30 23.4 +014+04.1 Sa 3-111 18 01 06.68 -14 30 21.7 2000 70.002.006 rad 18 01 06.68 -14 30 21.7 +014+04.1 Sa 3-111 17 58 15.4 -14 30 23. 1950 Ko,Ku (1999) 18 01 06.47 -14 30 24.4 +014+04.1 Sa 3-111 17 58 15.6 -14 30 21. 1950 IRAS17582-1430 18 01 06.67 -14 30 22.4 +358-05.1 Pe 1-11 17 58 25.3 -33 15 26. 1950 CGPN/Koal 65 18 01 42.91 -33 15 25.7 +358-05.1 Pe 1-11 17 58 25.1 -33 15 24. 1950 50.134.178 18 01 42.70 -33 15 23.7 +358-05.1 Pe 1-11 17 58 25.2 -33 15 27. 1950 70.002.006 18 01 42.81 -33 15 26.7 +358-05.1 Pe 1-11 18 01 42.84 -33 15 23.5 2000 70.002.006 rad 18 01 42.84 -33 15 23.5 +358-05.1 Pe 1-11 17 58 24.8 -33 15 29. 1950 IRAS17584-3315 18 01 42.41 -33 15 28.7 +002-02.4 M 2-23 17 58 33. -28 25 48. 1950 CGPN/Mi 59 18 01 42.96 -28 25 47.4 +002-02.4 M 2-23 17 58 32.4 -28 25 45. 1950 CGPN/Fc 62 18 01 42.36 -28 25 44.5 +002-02.4 M 2-23 17 58 32.7 -28 25 46. 1950 CGPN/Koal 65 18 01 42.66 -28 25 45.4 +002-02.4 M 2-23 17 58 32.7 -28 25 46. 1950 18.133.025 18 01 42.66 -28 25 45.4 +002-02.4 M 2-23 17 58 32.72 -28 25 44.5 1950 34.134.032 18 01 42.68 -28 25 43.9 +002-02.4 M 2-23 17 58 32.7 -28 25 45. 1950 70.002.006 18 01 42.66 -28 25 44.4 +002-02.4 M 2-23 18 01 42.53 -28 25 39.4 2000 70.002.006 rad 18 01 42.53 -28 25 39.4 +002-02.4 M 2-23 17 58 31.8 -28 25 45. 1950 IRAS17585-2825 18 01 41.76 -28 25 44.5 +096+29.1 NGC 6543 17 58 35.38 +66 38 12.5 1897 CGPN/We 03 * 17 58 33.41 +66 37 59.7 +096+29.1 NGC 6543 17 58 36.15 +66 38 14.5 1880 CGPN/Wn 09 17 58 33.79 +66 37 59.7 +096+29.1 NGC 6543 17 58 35.63 +66 38 12.3 1900 CGPN/Lo 11 17 58 33.72 +66 37 59.9 +096+29.1 NGC 6543 17 58 35.68 +66 38 12.5 1900 CGPN/Si 27 17 58 33.77 +66 38 00.1 +096+29.1 NGC 6543 17 58 35.6 +66 38 11.7 1932 CGPN/Kz 35 17 58 34.38 +66 38 03.3 +096+29.1 NGC 6543 17 58 34.24 +66 38 05.3 1950 CGPN/AGK2 17 58 33.40 +66 37 59.1 +096+29.1 NGC 6543 17 58 34.20 +66 38 05.3 1950 11.133.008 17 58 33.36 +66 37 59.1 +096+29.1 NGC 6543 17 58 34.2 +66 38 05. 1950 65.134.076 17 58 33.36 +66 37 58.8 +096+29.1 NGC 6543 17 58 34.3 +66 38 05. 1950 70.002.006 17 58 33.46 +66 37 58.8 +096+29.1 NGC 6543 17 58 33.41 +66 37 58.8 2000 70.002.006 rad 17 58 33.41 +66 37 58.8 +096+29.1 NGC 6543 17 58 34.5 +66 38 05. 1950 Ko,Ku (1999) 17 58 33.66 +66 37 58.8 +096+29.1 NGC 6543 17 58 34.20 +66 38 05.5 1950 AGK3+66 812 17 58 33.36 +66 37 59.3 +096+29.1 NGC 6543 17 58 34.22 +66 38 05.2 1950 GSC 4212-00508 17 58 33.38 +66 37 59.0 +096+29.1 NGC 6543 17 58 33.42 +66 37 59.5 2000 PPM 020679 17 58 33.42 +66 37 59.5 +096+29.1 NGC 6543 17 58 33.42 +66 37 58.9 2000 TYC 421205081 17 58 33.42 +66 37 58.9 +356-05.2 M 2-24 17 58 44. -34 27 49. 1950 CGPN/Mi 59 18 02 03.65 -34 27 47.3 +356-05.2 M 2-24 17 58 43.3 -34 27 49. 1950 CGPN/Koal 65 18 02 02.95 -34 27 47.3 +356-05.2 M 2-24 17 58 43.3 -34 27 49. 1950 18.133.025 18 02 02.95 -34 27 47.3 +356-05.2 M 2-24 17 58 43.4 -34 27 47. 1950 50.134.178 18 02 03.05 -34 27 45.3 +356-05.2 M 2-24 17 58 43.2 -34 27 48. 1950 70.002.006 18 02 02.85 -34 27 46.3 +356-05.2 M 2-24 18 02 02.40 -34 27 49.0 2000 70.002.006 rad 18 02 02.40 -34 27 49.0 +356-05.2 M 2-24 17 58 44.5 -34 27 49. 1950 IRAS17587-3427 18 02 04.15 -34 27 47.2 +000-03.1 M 3-22 17 59 06.5 -30 14 29. 1950 CGPN/Koal 65 18 02 19.24 -30 14 25.9 +000-03.1 M 3-22 17 59 05.9 -30 14 22.2 1950 11.133.011 18 02 18.64 -30 14 19.1 +000-03.1 M 3-22 17 59 06.6 -30 14 28. 1950 50.134.178 18 02 19.34 -30 14 24.9 +000-03.1 M 3-22 17 59 06.5 -30 14 29. 1950 70.002.006 18 02 19.24 -30 14 25.9 +000-03.1 M 3-22 18 02 19.07 -30 14 24.3 2000 70.002.006 rad 18 02 19.07 -30 14 24.3 +000-03.1 M 3-22 17 59 05.5 -30 14 26. 1950 IRAS17590-3014 18 02 18.24 -30 14 23.0 +355-06.1 M 3-21 17 59 08.8 -36 39 14. 1950 CGPN/Koal 65 * 18 02 32.31 -36 39 10.3 +355-06.1 M 3-21 17 59 08.0 -36 38 55. 1950 09.133.025 18 02 31.50 -36 38 51.4 +355-06.1 M 3-21 17 59 08.7 -36 39 15. 1950 70.002.006 18 02 32.21 -36 39 11.3 +355-06.1 M 3-21 18 02 32.54 -36 39 09.6 2000 70.002.006 rad 18 02 32.54 -36 39 09.6 +355-06.1 M 3-21 17 59 08.86 -36 39 16.2 1950 GSC 7403-06821 18 02 32.37 -36 39 12.5 +355-06.1 M 3-21 17 59 08.9 -36 39 19. 1950 IRAS17591-3639 18 02 32.41 -36 39 15.3 +356-06.1 M 3-49 17 59 11. -35 13 22. 1950 CGPN/Mi 59 18 02 31.96 -35 13 18.3 +356-06.1 M 3-49 17 59 11.1 -35 13 18. 1950 CGPN/Koal 65 18 02 32.06 -35 13 14.3 +356-06.1 M 3-49 17 59 10.5 -35 13 16. 1950 70.002.006 18 02 31.46 -35 13 12.3 +001-03.3 SAWI 1 17 59 14.4 -29 25 09. 1950 70.002.006 * 18 02 25.86 -29 25 05.4 +001-03.3 SAWI 1 17 59 15.3 -29 25 10. 1950 Ko,Ku (1999) 18 02 26.76 -29 25 06.3 +359-04.3 M 2-25 17 59 31. -32 09 28. 1950 CGPN/Mi 59 * 18 02 46.79 -32 09 23.0 +359-04.3 M 2-25 17 59 30.6 -32 09 32. 1950 CGPN/Koal 65 18 02 46.39 -32 09 27.0 +359-04.3 M 2-25 17 59 30.7 -32 09 33. 1950 70.002.006 18 02 46.50 -32 09 28.0 +359-04.3 M 2-25 18 02 46.29 -32 09 28.1 2000 70.002.006 rad 18 02 46.29 -32 09 28.1 +354-07.2 SB 40 18 02 55.6 -37 08 15.3 2000 71.134.030 18 02 55.6 -37 08 15.3 +354-07.2 SB 40 17 59 31.4 -37 08 20. 1950 Ko,Ku (1999) 18 02 55.79 -37 08 14.7 +359-04.5 KnFs 3 17 59 38.3 -31 24 03. 1950 45.134.023 18 02 52.87 -31 23 57.5 +359-04.5 KnFs 3 17 59 38.1 -31 23 58. 1950 70.002.006 18 02 52.67 -31 23 52.5 +359-04.5 KnFs 3 17 59 38.5 -31 24 05. 1950 Ko,Ku (1999) 18 02 53.07 -31 23 59.5 +003-02.4 * KnFs 4 17 59 42.7 -27 41 08. 1950 45.134.023 * 18 02 51.54 -27 41 02.4 +003-02.4 * KnFs 4 17 59 42.9 -27 41 07. 1950 70.002.006 18 02 51.74 -27 41 01.4 +003-02.4 * KnFs 4 C1 17 59 43.0 -27 41 06. 1950 Ko,Ku (1999) 18 02 51.84 -27 41 00.4 +003-02.4 * KnFs 4 C2 17 59 42.8 -27 41 08. 1950 Ko,Ku (1999) 18 02 51.64 -27 41 02.4 +014+03.1 * IRAS17597-1442 17 59 47.2 -14 42 10. 1950 Ko,Ku (1999) 18 02 38.51 -14 42 04.7 +014+03.1 * IRAS17597-1442 17 59 45.8 -14 42 10. 1950 IRAS17597-1442 18 02 37.11 -14 42 04.8 +001-03.4 * SAWI 2 17 59 51. -29 46 06. 1950 41.134.001 18 03 03.00 -29 45 59.7 +001-03.4 * SAWI 2 17 59 51.5 -29 46 23. 1950 Ko,Ku (1999) 18 03 03.51 -29 46 16.6 +352-08.1 SB 38 18 03 28.9 -39 21 26.8 2000 71.134.030 18 03 28.9 -39 21 26.8 +352-08.1 SB 38 18 00 00.5 -39 21 35. 1950 Ko,Ku (1999) 18 03 29.09 -39 21 27.4 +003-02.2 M 2-26 18 00 05. -26 58 37. 1950 CGPN/Mi 59 * 18 03 12.79 -26 58 29.8 +003-02.2 M 2-26 18 00 04.2 -26 58 38. 1950 CGPN/Koal 65 18 03 11.99 -26 58 30.9 +003-02.2 M 2-26 18 00 04.1 -26 58 38. 1950 50.134.178 18 03 11.89 -26 58 30.9 +003-02.2 M 2-26 18 00 04.1 -26 58 38. 1950 70.002.006 18 03 11.89 -26 58 30.9 +003-02.2 M 2-26 18 03 11.97 -26 58 33.2 2000 70.002.006 rad 18 03 11.97 -26 58 33.2 +001-03.5 * SAWI 3 18 00 05. -29 50 42. 1950 41.134.001 * 18 03 17.12 -29 50 34.6 +001-03.5 * SAWI 3 18 00 05.4 -29 50 50. 1950 Ko,Ku (1999) 18 03 17.52 -29 50 42.6 +358-05.2 * H 1-49 18 00 07.2 -32 42 30. 1950 CGPN/Koal 65 18 03 23.89 -32 42 22.3 +358-05.2 * H 1-49 18 00 07.3 -32 42 32. 1950 Wr (1966) 18 03 23.99 -32 42 24.3 +358-05.2 * H 1-49 18 00 07.2 -32 42 31. 1950 10.114.152 18 03 23.89 -32 42 23.3 +358-05.2 * H 1-49 18 00 07.2 -32 42 30. 1950 18.133.025 18 03 23.89 -32 42 22.3 +358-05.2 * H 1-49 18 00 08.0 -32 42 36. 1950 IRAS18001-3242 18 03 24.70 -32 42 28.3 +003-02.3 IC 4673 18 00 11. -27 06 30. 1950 CGPN/Mi 59 18 03 18.99 -27 06 22.3 +003-02.3 IC 4673 18 00 10.2 -27 06 28. 1950 CGPN/Fc 62 18 03 18.19 -27 06 20.4 +003-02.3 IC 4673 18 00 10.4 -27 06 30. 1950 CGPN/Koal 65 18 03 18.39 -27 06 22.4 +003-02.3 IC 4673 18 00 10.0 -27 06 24. 1950 09.133.025 18 03 17.98 -27 06 16.4 +003-02.3 IC 4673 18 00 10.6 -27 06 38.8 1950 11.133.011 18 03 18.59 -27 06 31.2 +003-02.3 IC 4673 18 00 10.5 -27 06 30. 1950 50.134.178 18 03 18.49 -27 06 22.4 +003-02.3 IC 4673 18 00 10.4 -27 06 30. 1950 70.002.006 18 03 18.39 -27 06 22.4 +003-02.3 IC 4673 18 03 18.42 -27 06 22.1 2000 70.002.006 rad 18 03 18.42 -27 06 22.1 +003-02.3 IC 4673 18 00 11.0 -27 06 35. 1950 IRAS18001-2706 18 03 18.99 -27 06 27.3 +358-05.5 SB 53 18 03 28.4 -32 37 25.6 2000 71.134.030 18 03 28.4 -32 37 25.6 +358-05.5 SB 53 18 00 12.1 -32 37 31. 1950 Ko,Ku (1999) 18 03 28.66 -32 37 23.0 +001-03.6 * SAWI 4 18 00 27. -29 46 00. 1950 41.134.001 18 03 39.00 -29 45 51.0 +001-03.6 * SAWI 4 18 00 27.0 -29 45 56. 1950 Ko,Ku (1999) 18 03 39.00 -29 45 47.0 +003-02.1 M 1-35 18 00 32. -26 43 44. 1950 CGPN/Mi 59 * 18 03 39.43 -26 43 34.8 +003-02.1 M 1-35 18 00 31.9 -26 43 43. 1950 CGPN/Fc 62 18 03 39.33 -26 43 33.8 +003-02.1 M 1-35 18 00 31.9 -26 43 44. 1950 CGPN/Koal 65 18 03 39.33 -26 43 34.8 +003-02.1 M 1-35 18 00 31.9 -26 43 34. 1950 18.133.025 18 03 39.33 -26 43 24.8 +003-02.1 M 1-35 18 00 31.9 -26 43 42. 1950 50.134.178 18 03 39.33 -26 43 32.8 +003-02.1 M 1-35 18 00 31.8 -26 43 43. 1950 70.002.006 18 03 39.23 -26 43 33.9 +003-02.1 M 1-35 18 03 39.35 -26 43 33.7 2000 70.002.006 rad 18 03 39.35 -26 43 33.7 +358-05.3 H 1-50 18 00 36.7 -32 41 50. 1950 CGPN/Koal 65 18 03 53.37 -32 41 40.2 +358-05.3 H 1-50 18 00 36.8 -32 41 50. 1950 50.134.178 18 03 53.47 -32 41 40.2 +358-05.3 H 1-50 18 00 36.6 -32 41 50. 1950 70.002.006 18 03 53.27 -32 41 40.2 +358-05.3 H 1-50 18 03 53.56 -32 41 42.2 2000 70.002.006 rad 18 03 53.56 -32 41 42.2 +358-05.3 H 1-50 18 00 36.8 -32 41 52. 1950 IRAS18006-3241 18 03 53.47 -32 41 42.2 +359-04.2 M 2-27 18 00 38. -31 17 51. 1950 CGPN/Mi 59 * 18 03 52.40 -31 17 41.2 +359-04.2 M 2-27 18 00 38.1 -31 17 55. 1950 CGPN/Koal 65 18 03 52.51 -31 17 45.1 +359-04.2 M 2-27 18 00 38.1 -31 17 55. 1950 18.133.025 18 03 52.51 -31 17 45.1 +359-04.2 M 2-27 18 00 38.22 -31 17 57.0 1950 34.134.032 18 03 52.63 -31 17 47.1 +359-04.2 M 2-27 18 00 38.1 -31 17 56. 1950 70.002.006 18 03 52.51 -31 17 46.1 +359-04.2 M 2-27 18 03 52.58 -31 17 45.9 2000 70.002.006 rad 18 03 52.58 -31 17 45.9 +001-03.7 SAWI 5 18 00 41.6 -29 51 30. 1950 45.134.023 * 18 03 53.74 -29 51 20.0 +001-03.7 SAWI 5 18 00 41.5 -29 51 31. 1950 70.002.006 18 03 53.64 -29 51 21.0 +001-03.7 SAWI 5 18 00 41.7 -29 51 30. 1950 Ko,Ku (1999) 18 03 53.84 -29 51 20.0 +357-06.1 M 3-50 18 00 46. -34 28 49. 1950 CGPN/Mi 59 18 04 05.67 -34 28 38.4 +357-06.1 M 3-50 18 00 45.6 -34 28 50. 1950 CGPN/Koal 65 18 04 05.27 -34 28 39.4 +357-06.1 M 3-50 18 00 45.3 -34 28 49. 1950 70.002.006 18 04 04.97 -34 28 38.4 +001-03.8 * SAWI 6 18 00 48. -29 27 00. 1950 41.134.001 18 03 59.51 -29 26 49.5 +001-03.8 * SAWI 6 18 00 46.8 -29 27 07. 1950 Ko,Ku (1999) 18 03 58.31 -29 26 56.6 +359-04.4 H 2-36 18 00 52.8 -31 39 22. 1950 70.002.006 18 04 07.78 -31 39 11.1 +359-04.4 H 2-36 18 04 07.05 -31 39 19.2 2000 70.002.006 rad 18 04 07.05 -31 39 19.2 +359-04.4 H 2-36 18 00 52.9 -31 39 20. 1950 Ko,Ku (1999) 18 04 07.88 -31 39 09.0 +002-03.7 Sa 3-115 18 00 54.9 -28 28 05. 1950 Wr (1966) 18 04 04.91 -28 27 54.1 +002-03.7 Sa 3-115 18 00 54.6 -28 28 06. 1950 70.002.006 18 04 04.61 -28 27 55.1 +002-03.7 Sa 3-115 18 00 55.6 -28 28 03. 1950 Ko,Ku (1999) 18 04 05.61 -28 27 52.0 +353-08.1 SB 39 18 04 31.8 -38 47 36.8 2000 71.134.030 * 18 04 31.8 -38 47 36.8 +353-08.1 SB 39 18 01 04.2 -38 47 52. 1950 Ko,Ku (1999) 18 04 31.70 -38 47 39.8 +356-06.2 H 1-51 18 01 08.7 -34 58 12. 1950 CGPN/Koal 65 18 04 29.21 -34 57 59.7 +356-06.2 H 1-51 18 01 08.6 -34 58 12. 1950 70.002.006 18 04 29.11 -34 57 59.7 +002-03.2 H 2-37 18 01 18.0 -28 38 12. 1950 CGPN/Koal 65 * 18 04 28.27 -28 37 59.4 +002-03.2 H 2-37 18 01 18.6 -28 37 47. 1950 70.002.006 18 04 28.85 -28 37 34.3 +002-03.2 H 2-37 18 01 18.8 -28 37 51. 1950 Ko,Ku (1999) 18 04 29.06 -28 37 38.3 +002-03.1 * Ap 1-8 18 01 19.8 -28 21 49. 1950 CGPN/Fc 64 18 04 29.65 -28 21 36.3 +002-03.1 * Ap 1-8 18 01 19.7 -28 21 48. 1950 10.114.152 18 04 29.55 -28 21 35.3 +002-03.1 * Ap 1-8 18 01 19.8 -28 21 48. 1950 38.002.010 18 04 29.65 -28 21 35.3 +002-03.1 * Ap 1-8 18 01 19.80 -28 21 47.5 1950 51.117.039 18 04 29.65 -28 21 34.8 +002-03.1 * Ap 1-8 18 01 19.9 -28 21 48. 1950 Ko,Ku (1999) 18 04 29.75 -28 21 35.3 +002-03.1 * Ap 1-8 18 01 20.0 -28 21 41. 1950 IRAS18013-2821 18 04 29.85 -28 21 28.3 +000-04.3 Sa 3-117 18 01 30.2 -31 03 04. 1950 Wr (1966) * 18 04 44.21 -31 02 50.4 +000-04.3 Sa 3-117 18 01 30.0 -31 03 02. 1950 70.002.006 18 04 44.01 -31 02 48.4 +000-04.3 Sa 3-117 18 04 44.00 -31 02 44.0 2000 70.002.006 rad 18 04 44.00 -31 02 44.0 +000-04.3 Sa 3-117 18 01 30.2 -31 03 03. 1950 Ko,Ku (1999) 18 04 44.21 -31 02 49.4 +354-07.1 H 1-52 18 01 32.8 -37 38 21. 1950 CGPN/Koal 65 * 18 04 58.11 -37 38 06.8 +354-07.1 H 1-52 18 01 31.5 -37 38 06. 1950 Wr (1966) 18 04 56.80 -37 37 51.9 +354-07.1 H 1-52 18 01 32.2 -37 38 22. 1950 70.002.006 18 04 57.51 -37 38 07.8 +358-05.4 M 3-51 18 01 39. -32 54 27. 1950 CGPN/Mi 59 * 18 04 56.02 -32 54 12.6 +358-05.4 M 3-51 18 01 39.7 -32 54 14. 1950 CGPN/Koal 65 18 04 56.71 -32 53 59.6 +358-05.4 M 3-51 18 01 39.0 -32 54 08. 1950 Wr (1966) 18 04 56.01 -32 53 53.6 +358-05.4 M 3-51 18 01 39.2 -32 54 15. 1950 70.002.006 18 04 56.21 -32 54 00.6 +358-05.4 M 3-51 18 04 56.41 -32 54 05.6 2000 70.002.006 rad 18 04 56.41 -32 54 05.6 +000-04.1 M 2-28 18 01 49. -30 58 28. 1950 CGPN/Mi 59 18 05 02.89 -30 58 13.0 +000-04.1 M 2-28 18 01 48.8 -30 58 32. 1950 CGPN/Koal 65 18 05 02.69 -30 58 17.0 +000-04.1 M 2-28 18 01 48.9 -30 58 31. 1950 50.134.178 18 05 02.79 -30 58 16.0 +000-04.1 M 2-28 18 01 48.8 -30 58 32. 1950 70.002.006 18 05 02.69 -30 58 17.0 +000-04.1 M 2-28 18 05 02.64 -30 58 15.2 2000 70.002.006 rad 18 05 02.64 -30 58 15.2 +000-04.1 M 2-28 18 01 49.2 -30 58 33. 1950 IRAS18018-3058 18 05 03.09 -30 58 18.0 +356-06.3 SB 48 18 05 14.3 -35 28 07.4 2000 71.134.030 18 05 14.3 -35 28 07.4 +356-06.3 SB 48 18 01 53.1 -35 28 25. 1950 Ko,Ku (1999) 18 05 14.49 -35 28 09.4 +001-03.9 SAWI 7 18 01 54.3 -29 20 27. 1950 70.002.006 * 18 05 05.64 -29 20 11.7 +001-03.9 SAWI 7 18 05 04.96 -29 20 18.6 2000 70.002.006 rad 18 05 04.96 -29 20 18.6 +001-03.9 SAWI 7 18 01 54.5 -29 20 33. 1950 Ko,Ku (1999) 18 05 05.84 -29 20 17.7 +010+00.1 NGC 6537 17 59 17.72 -19 50 55.3 1900 CGPN/Kb 09 * 18 05 13.38 -19 50 35.5 +010+00.1 NGC 6537 18 01 00.5 -19 50 53.8 1929 CGPN/Sr 30 18 05 13.06 -19 50 34.5 +010+00.1 NGC 6537 18 02 15.5 -19 50 30. 1950 09.133.025 18 05 13.39 -19 50 13.6 +010+00.1 NGC 6537 18 02 15.3 -19 50 52. 1950 11.133.008 18 05 13.20 -19 50 35.6 +010+00.1 NGC 6537 18 02 15.19 -19 50 51.0 1950 37.134.035 18 05 13.09 -19 50 34.7 +010+00.1 NGC 6537 18 02 15.15 -19 50 46.9 1950 52.002.040 18 05 13.04 -19 50 30.6 +010+00.1 NGC 6537 18 02 15.24 -19 50 46.5 1950 55.002.049 18 05 13.13 -19 50 30.2 +010+00.1 NGC 6537 18 02 15.2 -19 50 51. 1950 70.002.006 18 05 13.10 -19 50 34.7 +010+00.1 NGC 6537 18 05 13.07 -19 50 34.4 2000 70.002.006 rad 18 05 13.07 -19 50 34.4 +010+00.1 NGC 6537 18 02 15.24 -19 50 50.6 1950 GSC 06259-02412 18 05 13.14 -19 50 34.3 +002-03.3 M 1-37 18 02 17. -28 21 24. 1950 CGPN/Mi 59 * 18 05 26.84 -28 21 07.1 +002-03.3 M 1-37 18 02 16.2 -28 22 26. 1950 CGPN/Fc 62 18 05 26.07 -28 22 09.2 +002-03.3 M 1-37 18 02 16.0 -28 22 22. 1950 CGPN/Koal 65 18 05 25.86 -28 22 05.2 +002-03.3 M 1-37 18 02 16.0 -28 22 20. 1950 10.114.152 18 05 25.86 -28 22 03.2 +002-03.3 M 1-37 18 02 16.02 -28 22 20.9 1950 34.134.032 18 05 25.88 -28 22 04.1 +002-03.3 M 1-37 18 02 15.9 -28 22 21. 1950 70.002.006 18 05 25.76 -28 22 04.2 +002-03.3 M 1-37 18 05 26.00 -28 22 01.2 2000 70.002.006 rad 18 05 26.00 -28 22 01.2 +002-03.3 M 1-37 18 02 16.9 -28 22 22. 1950 IRAS18022-2822 18 05 26.76 -28 22 05.1 +005-01.1 IRAS18023-2513 18 02 18.3 -25 12 54. 1950 46.134.040 * 18 05 23.54 -25 12 37.2 +005-01.1 IRAS18023-2513 18 02 20.0 -25 13 50. 1950 70.002.006 18 05 25.26 -25 13 33.0 +005-01.1 IRAS18023-2513 18 05 25.18 -25 13 36.0 2000 70.002.006 rad 18 05 25.18 -25 13 36.0 +005-01.1 IRAS18023-2513 18 02 20.4 -25 13 54. 1950 Ko,Ku (1999) 18 05 25.66 -25 13 37.0 +005-01.1 IRAS18023-2513 18 02 20.3 -25 13 53. 1950 IRAS18023-2513 18 05 25.56 -25 13 36.0 +355-07.1 SB 42 18 05 52.5 -36 45 35.9 2000 71.134.030 18 05 52.5 -36 45 35.9 +355-07.1 SB 42 18 02 29.1 -36 45 56. 1950 Ko,Ku (1999) 18 05 52.80 -36 45 37.7 +357-06.2 SB 50 18 06 08.2 -34 33 31.1 2000 71.134.030 * 18 06 08.2 -34 33 31.1 +357-06.2 SB 50 18 02 48.5 -34 33 50. 1950 Ko,Ku (1999) 18 06 08.31 -34 33 30.4 +004-02.1 H 1-53 18 02 50.4 -26 30 01. 1950 CGPN/Koal 65 18 05 57.49 -26 29 41.8 +004-02.1 H 1-53 18 02 50.3 -26 30 01. 1950 10.114.152 18 05 57.39 -26 29 41.8 +004-02.1 H 1-53 18 02 50.0 -26 30 01. 1950 18.133.025 18 05 57.09 -26 29 41.8 +004-02.1 H 1-53 18 02 50.4 -26 30 01. 1950 70.002.006 18 05 57.49 -26 29 41.8 +004-02.1 H 1-53 18 05 57.41 -26 29 41.0 2000 70.002.006 rad 18 05 57.41 -26 29 41.0 +002-03.4 * H 2-38 18 02 51.5 -28 17 24. 1950 CGPN/Fc 62 18 06 01.24 -28 17 04.6 +002-03.4 * H 2-38 18 02 51.5 -28 17 24. 1950 CGPN/Koal 65 18 06 01.24 -28 17 04.6 +002-03.4 * H 2-38 18 02 51.0 -28 17 25. 1950 Wr (1966) 18 06 00.74 -28 17 05.6 +002-03.4 * H 2-38 18 02 51.4 -28 17 22. 1950 10.114.152 18 06 01.14 -28 17 02.6 +002-03.4 * H 2-38 18 02 51.5 -28 17 23. 1950 38.002.010 18 06 01.24 -28 17 03.6 +002-03.4 * H 2-38 18 02 51.46 -28 17 23.8 1950 51.117.039 18 06 01.20 -28 17 04.4 +002-03.4 * H 2-38 18 02 51.41 -28 17 23.3 1950 51.117.039 rad 18 06 01.15 -28 17 03.9 +002-03.4 * H 2-38 18 02 50.3 -28 17 24. 1950 IRAS18028-2817 18 06 00.04 -28 17 04.7 +002-03.5 M 1-38 18 02 55. -28 40 50. 1950 CGPN/Mi 59 18 06 05.33 -28 40 30.3 +002-03.5 M 1-38 18 02 55.6 -28 40 53. 1950 CGPN/Fc 62 18 06 05.93 -28 40 33.3 +002-03.5 M 1-38 18 02 55.6 -28 40 54. 1950 18.133.025 18 06 05.93 -28 40 34.3 +002-03.5 M 1-38 18 02 55.45 -28 40 50.0 1950 34.134.032 18 06 05.78 -28 40 30.3 +002-03.5 M 1-38 18 02 55.4 -28 40 49. 1950 70.002.006 18 06 05.73 -28 40 29.3 +002-03.5 M 1-38 18 06 05.78 -28 40 31.7 2000 70.002.006 rad 18 06 05.78 -28 40 31.7 +002-03.5 M 1-38 18 02 54.7 -28 40 51. 1950 IRAS18029-2840 18 06 05.03 -28 40 31.3 +342-14.1 Sp 3 18 03 19.5 -51 01 54. 1950 08.114.108 * 18 07 15.87 -51 01 30.9 +342-14.1 Sp 3 18 03 22.8 -51 01 35. 1950 18.133.025 18 07 19.15 -51 01 11.6 +342-14.1 Sp 3 18 03 19.7 -51 01 34. 1950 Ko,Ku (1999) 18 07 16.05 -51 01 10.9 +342-14.1 Sp 3 18 03 19.59 -51 01 32.4 1950 GSC 8369-01624 18 07 15.94 -51 01 09.3 +342-14.1 Sp 3 18 03 19.5 -51 01 34. 1950 IRAS18033-5101 18 07 15.85 -51 01 10.9 +028+10.1 WeSb 3 18 03 27.4 +00 22 16. 1950 30.135.002 * 18 06 00.75 +00 22 36.7 +028+10.1 WeSb 3 18 03 27.2 +00 22 21. 1950 70.002.006 18 06 00.54 +00 22 41.7 +028+10.1 WeSb 3 18 03 27.3 +00 22 16. 1950 Ko,Ku (1999) 18 06 00.65 +00 22 36.7 +356-07.4 SB 45 18 06 52.2 -36 06 41.2 2000 71.134.030 18 06 52.2 -36 06 41.2 +356-07.4 SB 45 18 03 30.1 -36 07 05. 1950 Ko,Ku (1999) 18 06 52.63 -36 06 42.3 +004-03.1 M 2-29 18 03 34. -26 55 21. 1950 CGPN/Mi 59 * 18 06 41.70 -26 54 58.6 +004-03.1 M 2-29 18 03 33.2 -26 55 15. 1950 CGPN/Fc 62 18 06 40.90 -26 54 52.6 +004-03.1 M 2-29 18 03 34.7 -26 55 23. 1950 CGPN/Koal 65 18 06 42.40 -26 55 00.5 +004-03.1 M 2-29 18 03 34.7 -26 55 43. 1950 18.133.025 18 06 42.41 -26 55 20.5 +004-03.1 M 2-29 18 03 33.2 -26 55 17. 1950 50.134.178 18 06 40.90 -26 54 54.6 +004-03.1 M 2-29 18 03 33.2 -26 55 19. 1950 70.002.006 18 06 40.90 -26 54 56.6 +004-03.1 M 2-29 18 06 41.01 -26 54 55.8 2000 70.002.006 rad 18 06 41.01 -26 54 55.8 +004-03.1 M 2-29 18 03 33.2 -26 55 18. 1950 Ko,Ku (1999) 18 06 40.90 -26 54 55.6 +004-03.1 M 2-29 18 03 32.6 -26 55 22. 1950 IRAS18035-2655 18 06 40.30 -26 54 59.7 +003-03.2 KnFs 7 18 03 42.0 -27 06 41. 1950 45.134.023 * 18 06 49.98 -27 06 18.0 +003-03.2 KnFs 7 18 03 41.8 -27 06 39. 1950 70.002.006 18 06 49.78 -27 06 16.0 +003-03.2 KnFs 7 18 03 42.2 -27 06 44. 1950 Ko,Ku (1999) 18 06 50.18 -27 06 21.0 +356-07.3 SB 44 18 07 07.6 -36 02 52.8 2000 71.134.030 * 18 07 07.6 -36 02 52.8 +000-04.2 M 3-23 18 03 52.9 -30 34 41. 1950 CGPN/Koal 65 18 07 06.15 -30 34 17.0 +000-04.2 M 3-23 18 03 52.9 -30 34 38. 1950 50.134.178 18 07 06.15 -30 34 14.0 +000-04.2 M 3-23 18 03 52.9 -30 34 41. 1950 70.002.006 18 07 06.15 -30 34 17.0 +000-04.2 M 3-23 18 07 06.17 -30 34 16.2 2000 70.002.006 rad 18 07 06.17 -30 34 16.2 +000-04.2 M 3-23 18 03 52.6 -30 34 44. 1950 IRAS18038-3034 18 07 05.85 -30 34 20.0 +002-04.1 H 1-54 18 03 56.1 -29 13 34. 1950 CGPN/Fc 62 18 07 07.25 -29 13 09.8 +002-04.1 H 1-54 18 03 56.1 -29 13 20. 1950 CGPN/Koal 65 18 07 07.25 -29 12 55.8 +002-04.1 H 1-54 18 03 56.1 -29 13 20. 1950 18.133.025 18 07 07.25 -29 12 55.8 +002-04.1 H 1-54 18 03 56.18 -29 13 30.2 1950 34.134.032 18 07 07.33 -29 13 06.0 +002-04.1 H 1-54 18 03 56.1 -29 13 30. 1950 45.134.061 18 07 07.25 -29 13 05.8 +002-04.1 H 1-54 18 03 56.1 -29 13 29. 1950 70.002.006 18 07 07.25 -29 13 04.8 +002-04.1 H 1-54 18 07 07.35 -29 13 01.2 2000 70.002.006 rad 18 07 07.35 -29 13 01.2 +002-04.1 H 1-54 18 03 56.3 -29 13 32. 1950 IRAS18039-2913 18 07 07.45 -29 13 07.8 +356-07.5 SB 47 18 07 21.3 -35 45 43.8 2000 71.134.030 18 07 21.3 -35 45 43.8 +001-04.1 H 1-55 18 04 03. -29 41 49. 1950 CGPN/Mi 59 18 07 14.88 -29 41 24.3 +001-04.1 H 1-55 18 04 02.7 -29 41 49. 1950 CGPN/Koal 65 18 07 14.58 -29 41 24.3 +001-04.1 H 1-55 18 04 02.7 -29 41 47. 1950 10.114.152 18 07 14.58 -29 41 22.3 +001-04.1 H 1-55 18 04 02.7 -29 41 49. 1950 18.133.025 18 07 14.58 -29 41 24.3 +001-04.1 H 1-55 18 04 02.74 -29 41 48.7 1950 34.134.032 18 07 14.62 -29 41 24.0 +001-04.1 H 1-55 18 04 02.7 -29 41 49. 1950 70.002.006 18 07 14.58 -29 41 24.3 +001-04.1 H 1-55 18 07 14.08 -29 41 20.8 2000 70.002.006 rad 18 07 14.08 -29 41 20.8 +001-04.1 H 1-55 18 04 02.9 -29 41 52. 1950 IRAS18040-2941 18 07 14.78 -29 41 27.3 +359-05.1 * KnFs 9 18 04 04.3 -31 43 19. 1950 45.134.023 * 18 07 19.37 -31 42 54.1 +359-05.1 * KnFs 9 18 04 04.2 -31 43 19. 1950 70.002.006 18 07 19.27 -31 42 54.1 +359-05.1 * KnFs 9 18 07 19.40 -31 43 07.0 2000 70.002.006 rad 18 07 19.40 -31 43 07.0 +359-05.1 * KnFs 9 18 04 04.4 -31 43 22. 1950 Ko,Ku (1999) 18 07 19.47 -31 42 57.1 +019+05.1 IRAS18042-0855 18 04 15.5 -08 55 59. 1950 70.002.006 18 06 59.78 -08 55 34.4 +019+05.1 IRAS18042-0855 18 06 59.79 -08 55 33.5 2000 70.002.006 rad 18 06 59.79 -08 55 33.5 +019+05.1 IRAS18042-0855 18 04 15.7 -08 55 59. 1950 Ko,Ku (1999) 18 06 59.98 -08 55 34.4 +019+05.1 IRAS18042-0855 18 04 15.59 -08 55 58.1 1950 GSC 5675-00350 18 06 59.87 -08 55 33.5 +019+05.1 IRAS18042-0855 18 04 15.5 -08 55 59. 1950 IRAS18042-0855 18 06 59.78 -08 55 34.4 +356-07.1 * He 2-349 18 04 17.4 -36 06 30. 1950 Wr (1966) 18 07 39.90 -36 06 03.9 +356-07.1 * He 2-349 18 04 17.5 -36 06 47. 1950 10.114.152 18 07 40.01 -36 06 20.9 +356-07.1 * He 2-349 18 04 17.51 -36 06 48.6 1950 51.117.039 18 07 40.02 -36 06 22.5 +015+03.1 M 1-39 18 04 41. -13 29 12. 1950 CGPN/Mi 59 18 07 30.80 -13 28 45.3 +015+03.1 M 1-39 18 04 40.9 -13 29 16. 1950 10.114.152 18 07 30.70 -13 28 49.3 +015+03.1 M 1-39 18 04 40.9 -13 29 12. 1950 31.116.001 18 07 30.70 -13 28 45.3 +015+03.1 M 1-39 18 04 40.9 -13 29 14. 1950 50.134.178 18 07 30.70 -13 28 47.3 +015+03.1 M 1-39 18 04 41.0 -13 29 15. 1950 70.002.006 18 07 30.80 -13 28 48.3 +015+03.1 M 1-39 18 07 30.72 -13 28 48.6 2000 70.002.006 rad 18 07 30.72 -13 28 48.6 +015+03.1 M 1-39 18 04 40.9 -13 29 14. 1950 IRAS18046-1329 18 07 30.70 -13 28 47.3 +001-04.2 H 1-56 18 04 41.9 -29 45 01. 1950 CGPN/Koal 65 18 07 53.86 -29 44 33.5 +001-04.2 H 1-56 18 04 41.95 -29 45 02.4 1950 34.134.032 18 07 53.91 -29 44 34.9 +001-04.2 H 1-56 18 04 41.9 -29 45 00. 1950 70.002.006 18 07 53.85 -29 44 32.5 +001-04.2 H 1-56 18 07 54.00 -29 44 35.0 2000 70.002.006 rad 18 07 54.00 -29 44 35.0 +001-04.2 H 1-56 18 04 42.2 -29 45 04. 1950 IRAS18047-2945 18 07 54.16 -29 44 36.4 +005-02.1 M 3-24 18 04 48. -25 24 31. 1950 CGPN/Mi 59 * 18 07 53.51 -25 24 03.2 +005-02.1 M 3-24 18 04 48.5 -25 24 30. 1950 CGPN/Koal 65 18 07 54.01 -25 24 02.2 +005-02.1 M 3-24 18 04 48.0 -25 24 33. 1950 Wr (1966) 18 07 53.51 -25 24 05.2 +005-02.1 M 3-24 18 04 48.5 -25 24 31. 1950 70.002.006 18 07 54.01 -25 24 03.2 +005-02.1 M 3-24 18 07 53.97 -25 24 01.7 2000 70.002.006 rad 18 07 53.97 -25 24 01.7 +004-03.2 KnFs 10 18 04 53.8 -26 54 29. 1950 45.134.023 18 08 01.48 -26 54 00.7 +004-03.2 KnFs 10 18 04 53.7 -26 54 30. 1950 70.002.006 18 08 01.38 -26 54 01.8 +004-03.2 KnFs 10 18 08 01.50 -26 53 59.0 2000 70.002.006 rad 18 08 01.50 -26 53 59.0 +004-03.2 KnFs 10 18 04 53.9 -26 54 32. 1950 Ko,Ku (1999) 18 08 01.58 -26 54 03.7 +002-03.6 H 2-39 18 04 55.8 -28 26 39. 1950 70.002.006 18 08 05.76 -28 26 10.5 +002-03.6 H 2-39 18 08 06.14 -28 26 07.9 2000 70.002.006 rad 18 08 06.14 -28 26 07.9 +002-03.6 H 2-39 18 04 56.0 -28 26 39. 1950 Ko,Ku (1999) 18 08 05.96 -28 26 10.5 +359-06.2 SB 54 18 08 31.3 -32 29 54.4 2000 71.134.030 18 08 31.3 -32 29 54.4 +359-06.2 SB 54 18 05 15.3 -32 30 25. 1950 Ko,Ku (1999) 18 08 31.64 -32 29 54.9 +000-05.1 H 2-40 18 05 15.6 -31 37 06. 1950 CGPN/Koal 65 18 08 30.50 -31 36 35.9 +000-05.1 H 2-40 18 05 15.8 -31 37 02. 1950 70.002.006 18 08 30.69 -31 36 31.9 +000-05.1 H 2-40 18 08 31.10 -31 36 54.0 2000 70.002.006 rad 18 08 31.10 -31 36 54.0 +000-05.2 SB 2 18 08 34.7 -31 06 52.1 2000 71.134.030 18 08 34.7 -31 06 52.1 +351-10.2 HtTr 9 18 05 24.4 -41 48 56. 1950 34.134.052 18 08 57.93 -41 48 24.6 +351-10.2 HtTr 9 18 05 25.4 -41 49 10. 1950 Ko,Ku (1999) 18 08 58.93 -41 48 38.5 +008-01.1 M 1-40 18 04 59. -22 17 31. 1950 CGPN/Mi 59 * 18 08 00.16 -22 17 02.6 +008-01.1 M 1-40 18 05 24.9 -22 17 23. 1950 CGPN/Koal 65 18 08 26.06 -22 16 52.7 +008-01.1 M 1-40 18 05 24.2 -22 17 23. 1950 18.133.025 18 08 25.36 -22 16 52.8 +008-01.1 M 1-40 18 05 24.9 -22 17 23. 1950 50.134.178 18 08 26.06 -22 16 52.7 +008-01.1 M 1-40 18 05 24.84 -22 17 22.2 1950 55.002.049 18 08 26.00 -22 16 51.9 +008-01.1 M 1-40 18 05 24.8 -22 17 23. 1950 70.002.006 18 08 25.96 -22 16 52.7 +008-01.1 M 1-40 18 08 26.02 -22 16 53.4 2000 70.002.006 rad 18 08 26.02 -22 16 53.4 +008-01.1 M 1-40 18 05 24.7 -22 17 24. 1950 IRAS18054-2217 18 08 25.86 -22 16 53.7 +357-07.1 SB 51 18 09 16.1 -34 47 41.0 2000 71.134.030 18 09 16.1 -34 47 41.0 +005-02.2 * MaC 1-10 18 06 07.50 -25 05 09.2 1950 22.135.002 18 09 12.54 -25 04 35.7 +005-02.2 * MaC 1-10 18 06 07.8 -25 05 02. 1950 70.002.006 18 09 12.84 -25 04 28.5 +005-02.2 * MaC 1-10 18 09 12.90 -25 04 27.0 2000 70.002.006 rad 18 09 12.90 -25 04 27.0 +005-02.2 * MaC 1-10 18 06 06.1 -25 05 08. 1950 IRAS18061-2505 18 09 11.14 -25 04 34.6 +005-03.1 H 1-58 18 06 07.5 -26 03 02. 1950 CGPN/Koal 65 * 18 09 13.92 -26 02 28.4 +005-03.1 H 1-58 18 06 07.2 -26 03 03. 1950 Wr (1966) 18 09 13.62 -26 02 29.4 +005-03.1 H 1-58 18 06 07.5 -26 03 03. 1950 70.002.006 18 09 13.92 -26 02 29.4 +005-03.1 H 1-58 18 09 13.70 -26 02 42.0 2000 70.002.006 rad 18 09 13.70 -26 02 42.0 +005-03.1 H 1-58 18 06 08.8 -26 03 04. 1950 IRAS18061-2603 18 09 15.22 -26 02 30.3 +050+19.1 IRAS18062+2410 18 06 16.4 +24 10 11. 1950 Ko,Ku (1999) 18 08 20.21 +24 10 43.0 +050+19.1 IRAS18062+2410 18 06 16.34 +24 10 11.7 1950 SAO 85766 18 08 20.15 +24 10 43.7 +050+19.1 IRAS18062+2410 18 06 16.3 +24 10 10. 1950 IRAS18062+2410 18 08 20.11 +24 10 42.0 +006-02.1 M 1-41 18 06 26.1 -24 13 03. 1950 CGPN/Koal 65 18 09 29.91 -24 12 28.2 +006-02.1 M 1-41 18 06 26.4 -24 13 00. 1950 37.132.013 18 09 30.21 -24 12 25.1 +006-02.1 M 1-41 18 06 26.8 -24 13 04. 1950 70.002.006 18 09 30.61 -24 12 29.1 +006-02.1 M 1-41 18 09 30.64 -24 12 28.7 2000 70.002.006 rad 18 09 30.64 -24 12 28.7 +006-02.1 M 1-41 18 06 26.8 -24 13 09. 1950 IRAS18064-2413 18 09 30.62 -24 12 34.1 +356-07.2 H 1-57 18 06 27.4 -35 44 49. 1950 CGPN/Koal 65 * 18 09 49.24 -35 44 13.4 +356-07.2 H 1-57 18 06 27.6 -35 44 27. 1950 Wr (1966) 18 09 49.43 -35 43 51.4 +356-07.2 H 1-57 18 06 27.1 -35 44 47. 1950 70.002.006 18 09 48.94 -35 44 11.4 +345-13.1 * SKWL 2-37 18 06 46.4 -48 26 26. 1950 08.114.108 18 10 35.49 -48 25 48.1 +345-13.1 * SKWL 2-37 18 06 46.4 -48 26 27. 1950 Ko,Ku (1999) 18 10 35.49 -48 25 49.1 +004-03.3 KnFs 11 18 07 04.1 -27 17 14. 1950 45.134.023 18 10 12.32 -27 16 36.2 +004-03.3 KnFs 11 18 07 04.0 -27 17 14. 1950 70.002.006 18 10 12.22 -27 16 36.2 +004-03.3 KnFs 11 18 10 12.20 -27 16 43.0 2000 70.002.006 rad 18 10 12.20 -27 16 43.0 +004-03.3 KnFs 11 18 07 04.2 -27 17 13. 1950 Ko,Ku (1999) 18 10 12.42 -27 16 35.2 +003-04.2 * Ap 1-9 18 07 17.2 -28 09 09. 1950 CGPN/Fc 62 * 18 10 26.71 -28 08 30.2 +003-04.2 * Ap 1-9 18 07 19.5 -28 08 20. 1950 CGPN/Koal 65 18 10 28.99 -28 07 41.1 +003-04.2 * Ap 1-9 18 07 19.5 -28 08 19. 1950 10.114.152 18 10 28.99 -28 07 40.1 +003-04.2 * Ap 1-9 18 07 19.5 -28 08 21. 1950 18.133.025 18 10 28.99 -28 07 42.1 +003-04.2 * Ap 1-9 18 07 19.46 -28 08 20.2 1950 51.117.039 18 10 28.95 -28 07 41.3 +003-04.11 KnFs 12 18 07 21.0 -28 20 01. 1950 45.134.023 18 10 30.78 -28 19 21.9 +003-04.11 KnFs 12 18 07 21.0 -28 20 03. 1950 70.002.006 18 10 30.78 -28 19 23.9 +003-04.11 KnFs 12 18 10 31.10 -28 19 25.0 2000 70.002.006 rad 18 10 31.10 -28 19 25.0 +003-04.11 KnFs 12 18 07 21.2 -28 20 02. 1950 Ko,Ku (1999) 18 10 30.98 -28 19 22.9 +018+04.1 M 3-52 18 07 40. -10 29 48. 1950 CGPN/Mi 59 18 10 26.15 -10 29 08.4 +018+04.1 M 3-52 18 07 40.3 -10 29 44. 1950 50.134.178 18 10 26.44 -10 29 04.4 +018+04.1 M 3-52 18 07 40.3 -10 29 45. 1950 70.002.006 18 10 26.45 -10 29 05.4 +018+04.1 M 3-52 18 10 25.93 -10 29 09.5 2000 70.002.006 rad 18 10 25.93 -10 29 09.5 +002-04.2 M 1-42 18 07 55. -28 59 52. 1950 CGPN/Mi 59 * 18 11 05.78 -28 59 10.4 +002-04.2 M 1-42 18 07 53.7 -28 59 53. 1950 CGPN/Fc 62 18 11 04.48 -28 59 11.5 +002-04.2 M 1-42 18 07 54.3 -28 59 40. 1950 CGPN/Koal 65 18 11 05.07 -28 58 58.5 +002-04.2 M 1-42 18 07 53.6 -28 59 41. 1950 08.114.108 18 11 04.37 -28 58 59.5 +002-04.2 M 1-42 18 07 54.0 -28 59 42. 1950 18.133.025 18 11 04.77 -28 59 00.5 +002-04.2 M 1-42 18 07 54.3 -28 59 42. 1950 50.134.178 18 11 05.07 -28 59 00.5 +002-04.2 M 1-42 18 07 54.3 -28 59 40. 1950 70.002.006 18 11 05.07 -28 58 58.5 +002-04.2 M 1-42 18 11 05.00 -28 59 00.2 2000 70.002.006 rad 18 11 05.00 -28 59 00.2 +001-05.1 SB 5 18 11 15.2 -30 37 48.9 2000 71.134.030 18 11 15.2 -30 37 48.9 +001-05.1 SB 5 18 08 02.3 -30 38 32. 1950 Ko,Ku (1999) 18 11 15.62 -30 37 49.8 +003-04.3 H 1-59 18 08 20.3 -27 46 59. 1950 CGPN/Koal 65 18 11 29.25 -27 46 15.7 +003-04.3 H 1-59 18 08 19.9 -27 47 04. 1950 08.114.108 18 11 28.85 -27 46 20.7 +003-04.3 H 1-59 18 08 20.3 -27 46 59. 1950 18.133.025 18 11 29.25 -27 46 15.7 +003-04.3 H 1-59 18 08 20.24 -27 46 58.7 1950 25.135.020 18 11 29.19 -27 46 15.4 +003-04.3 H 1-59 18 08 20.4 -27 47 00. 1950 70.002.006 18 11 29.35 -27 46 16.7 +003-04.3 H 1-59 18 11 29.27 -27 46 21.8 2000 70.002.006 rad 18 11 29.27 -27 46 21.8 +358-07.2 SB 52 18 11 39.9 -34 00 22.6 2000 71.134.030 18 11 39.9 -34 00 22.6 +358-07.2 SB 52 18 08 21.4 -34 01 08. 1950 Ko,Ku (1999) 18 11 40.23 -34 00 24.2 +003-04.7 * Ap 1-12 18 08 25.3 -28 23 25. 1950 CGPN/Fc 62 18 11 35.16 -28 22 41.3 +003-04.7 * Ap 1-12 18 08 25.3 -28 23 20. 1950 CGPN/Koal 65 18 11 35.15 -28 22 36.3 +003-04.7 * Ap 1-12 18 08 25.3 -28 23 19. 1950 10.114.152 18 11 35.15 -28 22 35.3 +003-04.7 * Ap 1-12 18 08 24.8 -28 23 19.8 1950 11.133.011 18 11 34.65 -28 22 36.1 +003-04.7 * Ap 1-12 18 08 25.3 -28 23 21. 1950 18.133.025 18 11 35.15 -28 22 37.3 +003-04.7 * Ap 1-12 18 08 25.2 -28 23 21. 1950 70.002.006 18 11 35.05 -28 22 37.3 +003-04.7 * Ap 1-12 18 11 34.78 -28 22 35.6 2000 70.002.006 rad 18 11 34.78 -28 22 35.6 +003-04.7 * Ap 1-12 18 08 25.1 -28 23 22. 1950 IRAS18084-2823 18 11 34.95 -28 22 38.3 +003-04.5 NGC 6565 18 08 43.1 -28 11 26. 1950 CGPN/Fc 62 18 11 52.65 -28 10 41.0 +003-04.5 NGC 6565 18 08 43.0 -28 11 27. 1950 CGPN/Koal 65 18 11 52.55 -28 10 42.0 +003-04.5 NGC 6565 18 08 42.9 -28 11 28. 1950 08.114.108 18 11 52.45 -28 10 43.0 +003-04.5 NGC 6565 18 08 43.3 -28 11 23. 1950 09.133.025 18 11 52.85 -28 10 38.0 +003-04.5 NGC 6565 18 08 43.05 -28 11 27.1 1950 25.135.020 18 11 52.60 -28 10 42.1 +003-04.5 NGC 6565 18 08 43.00 -28 11 27.0 1950 37.134.035 18 11 52.55 -28 10 42.0 +003-04.5 NGC 6565 18 08 43.0 -28 11 27. 1950 70.002.006 18 11 52.55 -28 10 42.0 +003-04.5 NGC 6565 18 11 52.55 -28 10 42.6 2000 70.002.006 rad 18 11 52.55 -28 10 42.6 +003-04.5 NGC 6565 18 08 43.06 -28 11 27.8 1950 GSC 6855-01998 18 11 52.61 -28 10 42.8 +003-04.5 NGC 6565 18 08 43.5 -28 11 30. 1950 IRAS18087-2811 18 11 53.05 -28 10 44.9 +358-07.1 NGC 6563 18 08 43.9 -33 52 50. 1950 CGPN/Koal 65 * 18 12 02.50 -33 52 04.6 +358-07.1 NGC 6563 18 08 44.0 -33 53 17. 1950 08.114.108 18 12 02.61 -33 52 31.6 +358-07.1 NGC 6563 18 08 44.6 -33 52 46. 1950 09.133.025 18 12 03.19 -33 52 00.5 +358-07.1 NGC 6563 18 08 43.9 -33 52 51. 1950 70.002.006 18 12 02.50 -33 52 05.6 +358-07.1 NGC 6563 18 12 02.65 -33 52 09.0 2000 70.002.006 rad 18 12 02.65 -33 52 09.0 +358-07.1 NGC 6563 18 08 43.2 -33 52 53. 1950 IRAS18087-3352 18 12 01.80 -33 52 07.6 +011-00.1 M 1-43 18 08 52. -18 47 08. 1950 CGPN/Mi 59 * 18 11 48.48 -18 46 22.8 +011-00.1 M 1-43 18 08 52.38 -18 47 08.0 1950 61.155.065 18 11 48.86 -18 46 22.8 +011-00.1 M 1-43 18 08 52.4 -18 47 06. 1950 70.002.006 18 11 48.88 -18 46 20.8 +011-00.1 M 1-43 18 11 48.79 -18 46 31.7 2000 70.002.006 rad 18 11 48.79 -18 46 31.7 +355-08.1 SB 43 18 12 23.7 -36 52 50.9 2000 71.134.030 18 12 23.7 -36 52 50.9 +000-06.2 SB 3 18 12 14.4 -31 19 58.9 2000 71.134.030 18 12 14.4 -31 19 58.9 +000-06.2 SB 3 18 09 00.2 -31 20 44. 1950 Ko,Ku (1999) 18 12 14.63 -31 19 57.6 +003-04.4 H 2-41 18 09 14.7 -27 53 01. 1950 CGPN/Koal 65 * 18 12 23.79 -27 52 13.7 +003-04.4 H 2-41 18 09 15.9 -27 53 15.8 1950 11.133.011 18 12 25.00 -27 52 28.4 +003-04.4 H 2-41 18 09 13.8 -27 53 00.1 1950 11.133.011 18 12 22.89 -27 52 12.9 +003-04.4 H 2-41 18 09 14.71 -27 53 02.3 1950 25.135.020 18 12 23.80 -27 52 15.0 +003-04.4 H 2-41 18 09 14.6 -27 53 04. 1950 50.134.178 18 12 23.69 -27 52 16.7 +003-04.4 H 2-41 18 09 14.6 -27 52 54. 1950 70.002.006 18 12 23.69 -27 52 06.7 +003-04.4 H 2-41 18 12 23.53 -27 52 05.3 2000 70.002.006 rad 18 12 23.53 -27 52 05.3 +005-03.2 H 2-42 18 09 15.2 -26 33 51. 1950 CGPN/Koal 65 18 12 22.35 -26 33 03.7 +005-03.2 H 2-42 18 09 15.9 -26 33 42. 1950 45.134.061 18 12 23.04 -26 32 54.7 +005-03.2 H 2-42 18 09 15.5 -26 33 39. 1950 70.002.006 18 12 22.64 -26 32 51.7 +005-03.2 H 2-42 18 12 22.98 -26 32 55.7 2000 70.002.006 rad 18 12 22.98 -26 32 55.7 +004-04.1 H 1-60 18 09 16.2 -27 29 42. 1950 CGPN/Koal 65 * 18 12 24.71 -27 28 54.6 +004-04.1 H 1-60 18 09 16.2 -27 29 42. 1950 18.133.025 18 12 24.71 -27 28 54.6 +004-04.1 H 1-60 18 09 16.71 -27 30 00.4 1950 25.135.020 18 12 25.23 -27 29 13.0 +004-04.1 H 1-60 18 09 16.7 -27 30 01. 1950 70.002.006 18 12 25.22 -27 29 13.6 +356-08.1 SB 46 18 12 39.7 -36 31 51.3 2000 71.134.030 18 12 39.7 -36 31 51.3 +356-08.1 SB 46 18 09 16.8 -36 32 39. 1950 Ko,Ku (1999) 18 12 40.04 -36 31 51.0 +351-10.1 SKWL 2-28 18 09 20.0 -41 31 15. 1950 Wr (1966) 18 12 52.86 -41 30 26.5 +351-10.1 SKWL 2-28 18 09 21.2 -41 31 17. 1950 08.114.108 18 12 54.07 -41 30 28.4 +003-04.8 M 2-30 18 09 26. -27 58 56. 1950 CGPN/Mi 59 18 12 35.24 -27 58 07.9 +003-04.8 M 2-30 18 09 24.9 -27 59 01. 1950 CGPN/Fc 62 18 12 34.14 -27 58 12.9 +003-04.8 M 2-30 18 09 24.6 -27 58 58. 1950 08.114.108 18 12 33.84 -27 58 10.0 +003-04.8 M 2-30 18 09 24.9 -27 59 01. 1950 18.133.025 18 12 34.14 -27 58 12.9 +003-04.8 M 2-30 18 09 25.20 -27 58 58.9 1950 25.135.020 18 12 34.44 -27 58 10.8 +003-04.8 M 2-30 18 09 25.2 -27 58 58. 1950 50.134.178 18 12 34.44 -27 58 09.9 +003-04.8 M 2-30 18 09 25.3 -27 58 58. 1950 70.002.006 18 12 34.54 -27 58 09.9 +003-04.8 M 2-30 18 12 34.49 -27 58 10.3 2000 70.002.006 rad 18 12 34.49 -27 58 10.3 +003-04.8 M 2-30 18 09 25.9 -27 58 59. 1950 IRAS18094-2758 18 12 35.14 -27 58 10.9 +006-03.1 H 1-61 18 09 29.3 -24 50 48. 1950 CGPN/Koal 65 18 12 33.98 -24 49 59.8 +006-03.1 H 1-61 18 09 29.4 -24 50 45. 1950 10.114.152 18 12 34.08 -24 49 56.8 +006-03.1 H 1-61 18 09 29.3 -24 50 48. 1950 70.002.006 18 12 33.98 -24 49 59.8 +006-03.1 H 1-61 18 12 34.01 -24 49 59.5 2000 70.002.006 rad 18 12 34.01 -24 49 59.5 +006-03.1 H 1-61 18 09 29.6 -24 50 51. 1950 IRAS18094-2450 18 12 34.28 -24 50 02.8 +003-04.9 * H 2-43 18 09 38.2 -28 20 52. 1950 CGPN/Fc 62 * 18 12 47.98 -28 20 03.0 +003-04.9 * H 2-43 18 09 38.2 -28 20 49. 1950 CGPN/Koal 65 18 12 47.98 -28 20 00.0 +003-04.9 * H 2-43 18 09 37.9 -28 20 55. 1950 Wr (1966) 18 12 47.68 -28 20 06.0 +003-04.9 * H 2-43 18 09 36.9 -28 20 38.6 1950 11.133.011 18 12 46.68 -28 19 49.7 +003-04.9 * H 2-43 18 09 38.16 -28 20 48.8 1950 25.135.020 18 12 47.94 -28 19 59.8 +003-04.9 * H 2-43 18 09 38.2 -28 20 50. 1950 34.134.032 18 12 47.98 -28 20 01.0 +003-04.9 * H 2-43 18 09 38.2 -28 20 49. 1950 70.002.006 18 12 47.98 -28 20 00.0 +005-03.3 KnFs 13 18 09 39.0 -25 45 12. 1950 45.134.023 18 12 44.97 -25 44 23.0 +005-03.3 KnFs 13 18 09 38.7 -25 45 09. 1950 62.134.030 18 12 44.67 -25 44 20.1 +005-03.3 KnFs 13 18 09 39.2 -25 44 55. 1950 70.002.006 18 12 45.16 -25 44 06.0 +005-03.3 KnFs 13 18 12 45.10 -25 44 07.0 2000 70.002.006 rad 18 12 45.10 -25 44 07.0 +005-03.3 KnFs 13 18 09 38.9 -25 45 09. 1950 Ko,Ku (1999) 18 12 44.87 -25 44 20.0 +034+11.1 NGC 6572 18 06 16.74 +06 49 35.9 1880 CGPN/Wn 09 18 12 06.38 +06 51 12.4 +034+11.1 NGC 6572 18 07 14.99 +06 49 48.3 1900 CGPN/Lo 11 18 12 06.39 +06 51 13.0 +034+11.1 NGC 6572 18 07 15.14 +06 49 48.1 1900 CGPN/Si 27 18 12 06.54 +06 51 12.8 +034+11.1 NGC 6572 18 09 40.57 +06 50 25.9 1950 CGPN/AGK2 18 12 06.34 +06 51 13.5 +034+11.1 NGC 6572 18 09 41.7 +06 50 37. 1950 09.133.025 18 12 07.46 +06 51 24.7 +034+11.1 NGC 6572 18 09 40.6 +06 50 25. 1950 11.133.008 18 12 06.37 +06 51 12.6 +034+11.1 NGC 6572 18 09 40.0 +06 50 30. 1950 50.134.212 18 12 05.77 +06 51 17.6 +034+11.1 NGC 6572 18 09 40.6 +06 50 25. 1950 70.002.006 18 12 06.37 +06 51 12.6 +034+11.1 NGC 6572 18 12 06.32 +06 51 12.4 2000 70.002.006 rad 18 12 06.32 +06 51 12.4 +034+11.1 NGC 6572 18 12 06.32 +06 51 13.2 2000 AC 0362784 18 12 06.32 +06 51 13.2 +034+11.1 NGC 6572 18 09 40.57 +06 50 25.3 1950 AGK3+06 2201 18 12 06.34 +06 51 12.9 +034+11.1 NGC 6572 18 12 06.36 +06 51 13.0 2000 PPM 165362 18 12 06.36 +06 51 13.0 +034+11.1 NGC 6572 18 12 06.30 +06 51 13.4 2000 TYC 044314821 18 12 06.30 +06 51 13.4 +034+11.1 NGC 6572 18 09 40.4 +06 50 26. 1950 IRAS18096+0650 18 12 06.17 +06 51 13.6 +002-05.2 KnFs 14 18 09 49.1 -29 26 02. 1950 45.134.023 * 18 13 00.53 -29 25 12.1 +002-05.2 KnFs 14 18 09 49.1 -29 26 02. 1950 70.002.006 18 13 00.53 -29 25 12.1 +002-05.2 KnFs 14 18 09 49.2 -29 26 02. 1950 Ko,Ku (1999) 18 13 00.63 -29 25 12.1 +359-06.1 H 1-62 18 10 02.0 -32 20 34. 1950 CGPN/Koal 65 18 13 18.03 -32 19 43.0 +359-06.1 H 1-62 18 10 01.9 -32 20 33. 1950 70.002.006 18 13 17.93 -32 19 42.0 +359-06.1 H 1-62 18 13 17.85 -32 19 41.7 2000 70.002.006 rad 18 13 17.85 -32 19 41.7 +359-06.1 H 1-62 18 10 01.7 -32 20 34. 1950 IRAS18100-3220 18 13 17.73 -32 19 43.0 +001-05.2 SB 6 18 13 15.5 -30 26 04.6 2000 71.134.030 18 13 15.5 -30 26 04.6 +001-05.2 SB 6 18 10 02.8 -30 26 52. 1950 Ko,Ku (1999) 18 13 15.80 -30 26 01.1 +006-03.3 M 2-31 18 10 10. -25 30 57. 1950 CGPN/Mi 59 18 13 15.63 -25 30 05.8 +006-03.3 M 2-31 18 10 10.5 -25 30 56. 1950 CGPN/Koal 65 18 13 16.13 -25 30 04.8 +006-03.3 M 2-31 18 10 09.9 -25 30 46. 1950 08.114.108 18 13 15.52 -25 29 54.8 +006-03.3 M 2-31 18 10 10.46 -25 30 56.8 1950 34.134.032 18 13 16.09 -25 30 05.6 +006-03.3 M 2-31 18 10 10.4 -25 30 57. 1950 70.002.006 18 13 16.03 -25 30 05.8 +006-03.3 M 2-31 18 13 16.17 -25 30 05.0 2000 70.002.006 rad 18 13 16.17 -25 30 05.0 +006-03.3 M 2-31 18 10 10.0 -25 30 58. 1950 IRAS18101-2530 18 13 15.63 -25 30 06.8 +005-04.1 H 2-44 18 10 34.1 -26 09 32. 1950 CGPN/Koal 65 * 18 13 40.65 -26 08 39.0 +005-04.1 H 2-44 18 10 34.0 -26 09 33. 1950 70.002.006 18 13 40.55 -26 08 40.0 +005-04.1 H 2-44 18 13 40.77 -26 08 44.1 2000 70.002.006 rad 18 13 40.77 -26 08 44.1 +011-00.2 NGC 6567 18 09 33.9 -19 05 45.4 1929 CGPN/Sr 30 18 13 45.00 -19 04 33.0 +011-00.2 NGC 6567 18 10 48.3 -19 05 30. 1950 02.133.027 18 13 45.17 -19 04 36.3 +011-00.2 NGC 6567 18 10 48.2 -19 05 13. 1950 09.133.025 18 13 45.06 -19 04 19.3 +011-00.2 NGC 6567 18 10 48.33 -19 05 24.7 1950 52.002.040 18 13 45.20 -19 04 31.0 +011-00.2 NGC 6567 18 10 48.4 -19 05 27. 1950 70.002.006 18 13 45.27 -19 04 33.3 +011-00.2 NGC 6567 18 13 45.16 -19 04 35.6 2000 70.002.006 rad 18 13 45.16 -19 04 35.6 +011-00.2 NGC 6567 18 10 48.53 -19 05 26.8 1950 GSC 6272-01627 18 13 45.40 -19 04 33.1 +011-00.2 NGC 6567 18 13 45.29 -19 04 33.9 2000 TYC 627216271 18 13 45.29 -19 04 33.9 +011-00.2 NGC 6567 18 10 48.4 -19 05 27. 1950 IRAS18108-1905 18 13 45.27 -19 04 33.3 +001-06.3 SB 4 18 14 14.1 -31 11 09.2 2000 71.134.030 18 14 14.1 -31 11 09.2 +006-03.4 KnFs 15 18 11 14.0 -25 21 46. 1950 45.134.023 18 14 19.40 -25 20 50.1 +006-03.4 KnFs 15 18 11 14.0 -25 21 47. 1950 70.002.006 18 14 19.40 -25 20 51.1 +006-03.4 KnFs 15 18 14 19.48 -25 20 52.1 2000 70.002.006 rad 18 14 19.48 -25 20 52.1 +006-03.4 KnFs 15 18 11 14.2 -25 21 47. 1950 Ko,Ku (1999) 18 14 19.60 -25 20 51.1 +006-03.4 KnFs 15 18 11 14.8 -25 21 47. 1950 IRAS18112-2521 18 14 20.20 -25 20 51.1 +002-05.1 * He 2-370 18 11 22.2 -29 50 22. 1950 Wr (1966) 18 14 34.24 -29 49 25.3 +002-05.1 * He 2-370 18 11 22.4 -29 50 18. 1950 10.114.152 18 14 34.44 -29 49 21.3 +002-05.1 * He 2-370 18 11 22.5 -29 50 19. 1950 38.002.010 18 14 34.54 -29 49 22.3 +002-05.1 * He 2-370 18 11 22.47 -29 50 19.1 1950 51.117.039 18 14 34.51 -29 49 22.4 +006-03.2 H 2-45 18 11 24.3 -24 44 34. 1950 CGPN/Koal 65 18 14 28.82 -24 43 37.4 +006-03.2 H 2-45 18 11 24.3 -24 44 35. 1950 70.002.006 18 14 28.82 -24 43 38.4 +006-03.2 H 2-45 18 14 28.75 -24 43 40.5 2000 70.002.006 rad 18 14 28.75 -24 43 40.5 +359-07.1 M 2-32 18 11 34. -32 37 53. 1950 CGPN/Mi 59 * 18 14 50.49 -32 36 55.3 +359-07.1 M 2-32 18 11 34.1 -32 37 52. 1950 CGPN/Koal 65 18 14 50.59 -32 36 54.3 +359-07.1 M 2-32 18 11 34.0 -32 37 53. 1950 08.114.108 18 14 50.49 -32 36 55.3 +359-07.1 M 2-32 18 11 34.2 -32 37 53. 1950 70.002.006 18 14 50.69 -32 36 55.3 +359-07.1 M 2-32 18 14 50.56 -32 36 54.1 2000 70.002.006 rad 18 14 50.56 -32 36 54.1 +024+05.1 M 4-9 18 11 39. -05 00 18. 1950 CGPN/Mi 59 * 18 14 18.62 -04 59 21.2 +024+05.1 M 4-9 18 11 38.8 -05 00 18.1 1950 11.133.011 18 14 18.42 -04 59 21.4 +024+05.1 M 4-9 18 11 39.5 :-05 00 19. : 1950 31.114.201 18 14 19.12 -04 59 22.2 +024+05.1 M 4-9 18 11 38.9 -05 00 18. 1950 50.134.178 18 14 18.52 -04 59 21.2 +024+05.1 M 4-9 18 11 38.7 -05 00 19. 1950 70.002.006 18 14 18.32 -04 59 22.3 +024+05.1 M 4-9 18 14 18.39 -04 59 20.7 2000 70.002.006 rad 18 14 18.39 -04 59 20.7 +008-02.1 MaC 1-11 18 11 49.05 -22 44 53.4 1950 22.135.002 18 14 50.79 -22 43 55.1 +008-02.1 MaC 1-11 18 11 49.1 -22 44 53. 1950 70.002.006 18 14 50.84 -22 43 54.7 +008-02.1 MaC 1-11 18 14 51.02 -22 43 55.9 2000 70.002.006 rad 18 14 51.02 -22 43 55.9 +008-02.1 MaC 1-11 18 11 49.3 -22 44 55. 1950 Ko,Ku (1999) 18 14 51.04 -22 43 56.7 +002-06.1 M 2-33 18 11 54. -30 16 28. 1950 CGPN/Mi 59 18 15 06.71 -30 15 29.0 +002-06.1 M 2-33 18 11 53.8 -30 16 32. 1950 CGPN/Koal 65 18 15 06.51 -30 15 33.0 +002-06.1 M 2-33 18 11 53.7 -30 16 32. 1950 08.114.108 18 15 06.41 -30 15 33.0 +002-06.1 M 2-33 18 11 53.8 -30 16 32. 1950 18.133.025 18 15 06.51 -30 15 33.0 +002-06.1 M 2-33 18 11 53.93 -30 16 33.0 1950 34.134.032 18 15 06.64 -30 15 34.0 +002-06.1 M 2-33 18 11 53.7 -30 16 32. 1950 70.002.006 18 15 06.41 -30 15 33.0 +002-06.1 M 2-33 18 15 06.70 -30 15 36.0 2000 70.002.006 rad 18 15 06.70 -30 15 36.0 +002-06.1 M 2-33 18 11 53.3 -30 16 34. 1950 IRAS18118-3016 18 15 06.01 -30 15 35.0 +001-06.1 * CnMy 17 18 12 11.8 -30 32 59. 1950 Wr (1966) 18 15 24.94 -30 31 58.7 +001-06.1 * CnMy 17 18 12 11.5 -30 32 53. 1950 10.114.152 18 15 24.64 -30 31 52.7 +001-06.1 * CnMy 17 18 12 11.7 -30 32 54. 1950 18.133.025 18 15 24.84 -30 31 53.7 +001-06.1 * CnMy 17 18 12 11.5 -30 32 56. 1950 38.002.010 18 15 24.64 -30 31 55.7 +001-06.1 * CnMy 17 18 12 11.55 -30 32 54.1 1950 51.117.039 18 15 24.69 -30 31 53.8 +001-06.1 * CnMy 17 18 12 11.42 -30 32 50.5 1950 51.117.039 rad 18 15 24.55 -30 31 50.2 +354-10.1 SB 41 18 15 39.1 -38 27 56.4 2000 71.134.030 18 15 39.1 -38 27 56.4 +354-10.1 SB 41 18 12 12.3 -38 28 57. 1950 Ko,Ku (1999) 18 15 39.09 -38 27 56.1 +359-07.2 SB 56 18 15 32.4 -32 38 01.5 2000 71.134.030 18 15 32.4 -32 38 01.5 +359-07.2 SB 56 18 12 16.3 -32 39 02. 1950 Ko,Ku (1999) 18 15 32.81 -32 38 01.2 +019+03.1 M 3-25 18 12 31. -10 11 12. 1950 CGPN/Mi 59 18 15 16.76 -10 10 11.2 +019+03.1 M 3-25 18 12 31.2 -10 11 09. 1950 50.134.178 18 15 16.96 -10 10 08.2 +019+03.1 M 3-25 18 12 31.2 -10 11 10. 1950 70.002.006 18 15 16.96 -10 10 09.2 +019+03.1 M 3-25 18 15 16.91 -10 10 09.6 2000 70.002.006 rad 18 15 16.91 -10 10 09.6 +019+03.1 M 3-25 18 12 30.7 -10 11 11. 1950 IRAS18125-1011 18 15 16.46 -10 10 10.3 +022+04.1 * MA 2 18 12 31.4 -06 58 13. 1950 31.114.201 18 15 13.33 -06 57 12.3 +022+04.1 * MA 2 18 12 31.5 -06 58 14. 1950 70.002.006 18 15 13.43 -06 57 13.3 +022+04.1 * MA 2 18 15 13.51 -06 57 17.0 2000 70.002.006 rad 18 15 13.51 -06 57 17.0 +022+04.1 * MA 2 18 12 31.6 -06 58 19. 1950 IRAS18125-0658 18 15 13.53 -06 57 18.3 +004-05.2 * He 2-376 18 12 36.8 -27 54 47. 1950 Wr (1966) * 18 15 45.90 -27 53 45.0 +004-05.2 * He 2-376 old 18 12 37. -27 55 06. 1950 31.002.098 18 15 46.11 -27 54 04.0 +004-05.2 * He 2-376 old 18 12 37.4 -27 54 50. 1950 Ko,Ku (1999) 18 15 46.50 -27 53 47.9 +004-05.2 * He 2-376 old 18 12 37.0 -27 55 03. 1950 Ko,Ku (1999) 18 15 46.11 -27 54 01.0 +004-05.6 SB 8 18 15 50.3 -27 48 59.7 2000 71.134.030 18 15 50.3 -27 48 59.7 +001-06.2 SwSt 1 18 12 58.6 -30 53 13. 1950 CGPN/Koal 65 18 16 12.26 -30 52 09.2 +001-06.2 SwSt 1 18 12 58.6 -30 53 12. 1950 08.114.108 18 16 12.26 -30 52 08.2 +001-06.2 SwSt 1 18 12 58.8 -30 53 10. 1950 09.133.025 18 16 12.46 -30 52 06.2 +001-06.2 SwSt 1 18 12 58.7 -30 53 12. 1950 31.116.001 18 16 12.36 -30 52 08.2 +001-06.2 SwSt 1 18 12 58.43 -30 53 18.5 1950 51.117.039 18 16 12.09 -30 52 14.7 +001-06.2 SwSt 1 18 12 58.63 -30 53 11.3 1950 52.002.003 18 16 12.29 -30 52 07.5 +001-06.2 SwSt 1 18 12 58.5 -30 53 12. 1950 70.002.006 18 16 12.16 -30 52 08.2 +001-06.2 SwSt 1 18 16 12.33 -30 52 07.0 2000 70.002.006 rad 18 16 12.33 -30 52 07.0 +001-06.2 SwSt 1 18 16 12.33 -30 52 07.6 2000 AC 3095540 18 16 12.33 -30 52 07.6 +001-06.2 SwSt 1 18 16 12.29 -30 52 07.9 2000 HIP 89535 18 16 12.29 -30 52 07.9 +001-06.2 SwSt 1 18 12 57.5 -30 53 12. 1950 IRAS18129-3053 18 16 11.16 -30 52 08.3 +004-05.1 M 3-26 18 13 05. -27 16 16. 1950 CGPN/Mi 59 * 18 16 13.15 -27 15 12.0 +004-05.1 M 3-26 18 13 03.3 -27 16 01. 1950 CGPN/Koal 65 18 16 11.44 -27 14 57.1 +004-05.1 M 3-26 18 13 03.3 -27 16 01. 1950 18.133.025 18 16 11.44 -27 14 57.1 +004-05.1 M 3-26 18 13 03.3 -27 16 02. 1950 50.134.178 18 16 11.44 -27 14 58.1 +004-05.1 M 3-26 18 13 03.3 -27 16 02. 1950 70.002.006 18 16 11.44 -27 14 58.1 +004-05.1 M 3-26 18 16 11.55 -27 14 54.0 2000 70.002.006 rad 18 16 11.55 -27 14 54.0 +002-06.2 H 1-63 18 13 07. -30 08 38. 1950 CGPN/Mi 59 18 16 19.49 -30 07 33.7 +002-06.2 H 1-63 18 13 06.8 -30 08 40. 1950 CGPN/Koal 65 18 16 19.29 -30 07 35.7 +002-06.2 H 1-63 18 13 06.1 -30 08 40. 1950 18.133.025 18 16 18.59 -30 07 35.7 +002-06.2 H 1-63 18 13 06.9 -30 08 39. 1950 50.134.178 18 16 19.39 -30 07 34.7 +002-06.2 H 1-63 18 13 06.1 -30 08 34. 1950 50.134.212 18 16 18.59 -30 07 29.7 +002-06.2 H 1-63 18 13 06.7 -30 08 39. 1950 70.002.006 18 16 19.19 -30 07 34.7 +002-06.2 H 1-63 18 16 19.28 -30 07 44.9 2000 70.002.006 rad 18 16 19.28 -30 07 44.9 +002-06.2 H 1-63 18 13 06.2 -30 08 40. 1950 IRAS18131-3008 18 16 18.69 -30 07 35.7 +004-04.2 * M 1-44 18 13 10. -27 05 53. 1950 CGPN/Mi 59 18 16 17.89 -27 04 48.6 +004-04.2 * M 1-44 18 13 09.5 -27 05 39. 1950 CGPN/Fc 62 18 16 17.39 -27 04 34.6 +004-04.2 * M 1-44 18 13 09.5 -27 05 37. 1950 CGPN/Koal 65 18 16 17.38 -27 04 32.6 +004-04.2 * M 1-44 18 13 09.4 -27 05 37. 1950 Wr (1966) 18 16 17.28 -27 04 32.7 +004-04.2 * M 1-44 18 13 09.4 -27 05 41. 1950 10.114.152 18 16 17.29 -27 04 36.7 +004-04.2 * M 1-44 18 13 09.5 -27 05 37. 1950 18.133.025 18 16 17.38 -27 04 32.6 +004-04.2 * M 1-44 18 13 09.5 -27 05 38. 1950 50.134.178 18 16 17.38 -27 04 33.6 +004-04.2 * M 1-44 18 13 09.5 -27 05 36. 1950 70.002.006 18 16 17.38 -27 04 31.6 +004-04.2 * M 1-44 18 16 17.13 -27 04 35.1 2000 70.002.006 rad 18 16 17.13 -27 04 35.1 +004-04.2 * M 1-44 18 13 09.6 -27 05 38. 1950 IRAS18131-2705 18 16 17.48 -27 04 33.6 +010-01.1 NGC 6578 18 13 17.9 -20 28 11. 1950 02.133.027 * 18 16 16.56 -20 27 06.4 +010-01.1 NGC 6578 18 13 18.6 -20 28 04. 1950 09.133.025 18 16 17.26 -20 26 59.3 +010-01.1 NGC 6578 18 13 17.9 -20 28 07. 1950 70.002.006 18 16 16.56 -20 27 02.4 +010-01.1 NGC 6578 18 16 16.48 -20 27 03.4 2000 70.002.006 rad 18 16 16.48 -20 27 03.4 +010-01.1 NGC 6578 18 13 17.5 -20 28 09. 1950 IRAS18132-2028 18 16 16.16 -20 27 04.4 +005-04.2 KnFs 16 18 13 46.8 -26 24 31. 1950 45.134.023 * 18 16 53.68 -26 23 24.0 +005-04.2 KnFs 16 18 13 47.0 -26 24 28. 1950 70.002.006 18 16 53.88 -26 23 21.0 +005-04.2 KnFs 16 18 13 47.4 -26 24 30. 1950 Ko,Ku (1999) 18 16 54.28 -26 23 22.9 +337-18.1 He 2-375 18 13 51.6 -57 12 24. 1950 Wr (1966) 18 18 08.82 -57 11 14.1 +337-18.1 He 2-375 18 13 51.8 -57 12 22. 1950 08.114.108 18 18 09.01 -57 11 12.1 +337-18.1 He 2-375 18 13 52.2 -57 12 24. 1950 Ko,Ku (1999) 18 18 09.42 -57 11 14.0 +337-18.1 He 2-375 18 13 52.2 -57 12 23. 1950 IRAS18138-5712 18 18 09.42 -57 11 13.0 +007-03.1 M 2-34 18 14 13. -24 00 02. 1950 CGPN/Mi 59 18 17 16.45 -23 58 53.2 +007-03.1 M 2-34 18 14 12.0 -24 00 01. 1950 CGPN/Fc 62 18 17 15.45 -23 58 52.3 +007-03.1 M 2-34 18 14 12.5 -24 00 03. 1950 CGPN/Koal 65 18 17 15.95 -23 58 54.2 +007-03.1 M 2-34 18 14 12.4 -24 00 03. 1950 70.002.006 18 17 15.85 -23 58 54.2 +007-03.1 M 2-34 18 17 16.30 -23 59 02.0 2000 70.002.006 rad 18 17 16.30 -23 59 02.0 +000-07.1 M 2-35 18 14 22. -31 57 58. 1950 CGPN/Mi 59 18 17 37.37 -31 56 48.1 +000-07.1 M 2-35 18 14 21.5 -31 57 45. 1950 08.114.108 18 17 36.86 -31 56 35.1 +000-07.1 M 2-35 18 14 21.8 -31 57 56. 1950 70.002.006 18 17 37.17 -31 56 46.1 +000-07.1 M 2-35 18 17 37.40 -31 56 59.0 2000 70.002.006 rad 18 17 37.40 -31 56 59.0 +000-07.1 M 2-35 18 14 22.6 -31 58 04. 1950 IRAS18143-3158 18 17 37.97 -31 56 54.1 +003-06.1 M 2-36 18 14 30.5 -29 09 31. 1950 CGPN/Koal 65 * 18 17 41.46 -29 08 20.6 +003-06.1 M 2-36 18 14 30.4 -29 09 32. 1950 08.114.108 18 17 41.36 -29 08 21.7 +003-06.1 M 2-36 18 14 30.5 -29 09 28. 1950 50.134.178 18 17 41.46 -29 08 17.6 +003-06.1 M 2-36 18 14 30.5 -29 09 30. 1950 70.002.006 18 17 41.46 -29 08 19.6 +003-06.1 M 2-36 18 17 41.52 -29 08 18.1 2000 70.002.006 rad 18 17 41.52 -29 08 18.1 +003-06.1 M 2-36 18 14 30.7 -29 09 31. 1950 Ko,Ku (1999) 18 17 41.66 -29 08 20.6 +004-05.3 Pe 1-12 18 14 32.4 -28 18 29. 1950 CGPN/Koal 65 18 17 42.07 -28 17 18.6 +004-05.3 Pe 1-12 18 14 32.4 -28 18 29. 1950 18.133.025 18 17 42.07 -28 17 18.6 +004-05.3 Pe 1-12 18 14 32.7 -28 18 27. 1950 70.002.006 18 17 42.37 -28 17 16.5 +004-05.3 Pe 1-12 18 17 42.60 -28 17 08.0 2000 70.002.006 rad 18 17 42.60 -28 17 08.0 +003-06.2 SB 7 18 17 46.1 -29 06 04.9 2000 71.134.030 18 17 46.1 -29 06 04.9 +007-03.2 * SP 2-128 18 14 44. -24 03 48. 1950 18.133.034 18 17 47.53 -24 02 36.9 +007-03.2 * SP 2-128 18 14 44.2 -24 03 50. 1950 Ko,Ku (1999) 18 17 47.73 -24 02 38.9 +007-03.2 * SP 2-128 18 14 44.1 -24 03 48. 1950 IRAS18147-2403 18 17 47.63 -24 02 36.9 +348-13.1 IC 4699 18 14 49.3 -46 00 17. 1950 08.114.108 18 18 32.09 -45 59 04.1 +348-13.1 IC 4699 18 14 48.5 -46 00 16. 1950 18.133.025 18 18 31.29 -45 59 03.2 +348-13.1 IC 4699 18 14 49.2 -46 00 15. 1950 IRAS18148-4600 18 18 31.99 -45 59 02.1 +004-05.7 SB 10 18 18 06.9 -27 31 35.4 2000 71.134.030 18 18 06.9 -27 31 35.4 +023+04.1 * MA 3 18 15 07.6 -06 49 33. 1950 31.114.201 18 17 49.35 -06 48 21.0 +023+04.1 * MA 3 18 15 07.8 -06 49 35. 1950 70.002.006 18 17 49.55 -06 48 23.0 +023+04.1 * MA 3 18 17 49.23 -06 48 21.5 2000 70.002.006 rad 18 17 49.23 -06 48 21.5 +023+04.1 * MA 3 18 15 07.1 -06 49 34. 1950 IRAS18151-0649 18 17 48.85 -06 48 22.0 +006-04.1 Pe 2-13 18 15 07.7 -25 39 22. 1950 CGPN/Koal 65 18 18 13.48 -25 38 09.1 +006-04.1 Pe 2-13 18 15 07.6 -25 39 21. 1950 70.002.006 18 18 13.38 -25 38 08.1 +006-04.1 Pe 2-13 18 18 13.51 -25 38 07.2 2000 70.002.006 rad 18 18 13.51 -25 38 07.2 +038+12.1 Cn 3-1 18 15 12.6 +10 07 55. 1950 02.133.027 * 18 17 34.46 +10 09 06.7 +038+12.1 Cn 3-1 18 15 10.7 +10 08 02. 1950 09.133.025 18 17 32.56 +10 09 13.5 +038+12.1 Cn 3-1 18 15 11.9 +10 07 54.0 1950 11.133.011 18 17 33.76 +10 09 05.6 +038+12.1 Cn 3-1 18 15 12.24 +10 07 51.8 1950 37.134.035 18 17 34.10 +10 09 03.4 +038+12.1 Cn 3-1 18 15 12.1 +10 07 53. 1950 70.002.006 18 17 33.96 +10 09 04.6 +038+12.1 Cn 3-1 18 17 34.10 +10 09 03.6 2000 70.002.006 rad 18 17 34.10 +10 09 03.6 +038+12.1 Cn 3-1 18 15 12.4 +10 07 52. 1950 IRAS18152+1007 18 17 34.26 +10 09 03.6 +008-03.1 H 1-64 18 15 20.9 -23 26 08. 1950 CGPN/Fc 62 * 18 18 23.56 -23 24 54.3 +008-03.1 H 1-64 18 15 21.3 -23 26 12. 1950 CGPN/Koal 65 18 18 23.96 -23 24 58.2 +008-03.1 H 1-64 18 15 21.2 -23 26 09. 1950 70.002.006 18 18 23.86 -23 24 55.3 +008-03.1 H 1-64 18 18 24.01 -23 24 59.5 2000 70.002.006 rad 18 18 24.01 -23 24 59.5 +000-07.2 H 2-46 18 15 22.2 -31 56 00. 1950 CGPN/Koal 65 18 18 37.50 -31 54 45.7 +000-07.2 H 2-46 18 15 22.1 -31 55 59. 1950 70.002.006 18 18 37.40 -31 54 44.7 +000-07.2 H 2-46 18 18 37.40 -31 54 45.0 2000 70.002.006 rad 18 18 37.40 -31 54 45.0 +000-08.1 SB 1 18 18 48.4 -32 47 56.5 2000 71.134.030 18 18 48.4 -32 47 56.5 +004-05.5 M 2-37 18 15 34. -28 09 12. 1950 CGPN/Mi 59 * 18 18 43.43 -28 07 57.1 +004-05.5 M 2-37 18 15 28.7 -28 09 20. 1950 CGPN/Koal 65 18 18 38.13 -28 08 05.5 +004-05.5 M 2-37 18 15 29.3 -28 09 20. 1950 18.133.025 18 18 38.73 -28 08 05.4 +004-05.5 M 2-37 18 15 29.0 -28 09 14. 1950 70.002.006 18 18 38.43 -28 07 59.4 +004-05.5 M 2-37 18 15 29.1 -28 09 11. 1950 IRAS18154-2809 18 18 38.53 -28 07 56.4 +359-08.1 SB 55 18 19 26.4 -33 37 07.5 2000 71.134.030 18 19 26.4 -33 37 07.5 +359-08.1 SB 55 18 16 08.7 -33 38 25. 1950 Ko,Ku (1999) 18 19 26.80 -33 37 07.3 +359-08.1 SB 55 18 16 10.2 -33 38 22. 1950 IRAS18161-3338 18 19 28.29 -33 37 04.1 +005-05.1 M 2-38 18 16 18. -26 36 37. 1950 CGPN/Mi 59 18 19 25.14 -26 35 19.0 +005-05.1 M 2-38 18 16 18.0 -26 36 37. 1950 CGPN/Koal 65 18 19 25.14 -26 35 19.0 +005-05.1 M 2-38 18 16 18.0 -26 36 37. 1950 18.133.025 18 19 25.14 -26 35 19.0 +005-05.1 M 2-38 18 16 18.2 -26 36 38. 1950 50.134.178 18 19 25.34 -26 35 20.0 +005-05.1 M 2-38 18 16 18.19 -26 36 42.2 1950 54.134.034 18 19 25.33 -26 35 24.2 +005-05.1 M 2-38 18 16 18.0 -26 36 38. 1950 70.002.006 18 19 25.14 -26 35 20.0 +005-05.1 M 2-38 18 19 24.94 -26 35 22.7 2000 70.002.006 rad 18 19 24.94 -26 35 22.7 +005-05.1 M 2-38 18 16 18.4 -26 36 38. 1950 IRAS18163-2636 18 19 25.54 -26 35 19.9 +357-09.1 SB 49 18 20 09.4 -36 07 25.3 2000 71.134.030 18 20 09.4 -36 07 25.3 +357-09.1 SB 49 18 16 47.0 -36 08 43. 1950 Ko,Ku (1999) 18 20 09.41 -36 07 22.3 +007-04.1 H 1-65 18 17 07. -24 16 49. 1950 CGPN/Mi 59 * 18 20 10.81 -24 15 27.5 +007-04.1 H 1-65 18 17 04.8 -24 16 27. 1950 CGPN/Fc 62 18 20 08.60 -24 15 05.7 +007-04.1 H 1-65 18 17 05.1 -24 16 27. 1950 CGPN/Koal 65 18 20 08.90 -24 15 05.7 +007-04.1 H 1-65 18 17 05.1 -24 16 24. 1950 10.114.152 18 20 08.90 -24 15 02.7 +007-04.1 H 1-65 18 17 05.0 -24 16 27. 1950 18.133.025 18 20 08.80 -24 15 05.7 +007-04.1 H 1-65 18 17 05.07 -24 16 26.3 1950 34.134.032 18 20 08.87 -24 15 05.0 +007-04.1 H 1-65 18 17 05.0 -24 16 26. 1950 70.002.006 18 20 08.80 -24 15 04.7 +007-04.1 H 1-65 18 20 08.86 -24 15 05.7 2000 70.002.006 rad 18 20 08.86 -24 15 05.7 +007-04.1 H 1-65 18 17 04.9 -24 16 26. 1950 IRAS18170-2416 18 20 08.70 -24 15 04.7 +005-05.3 SB 11 18 20 44.7 -27 15 48.0 2000 71.134.030 18 20 44.7 -27 15 48.0 +005-05.3 SB 11 18 17 36.6 -27 17 15. 1950 Ko,Ku (1999) 18 20 44.72 -27 15 51.2 +005-05.3 SB 11 18 17 36.2 -27 17 12. 1950 IRAS18176-2717 18 20 44.31 -27 15 48.2 +005-05.2 * He 2-390 18 17 51.2 -26 49 51. 1950 08.114.108 18 20 58.64 -26 48 26.2 +005-05.2 * He 2-390 18 17 51.3 -26 49 52. 1950 10.114.152 18 20 58.74 -26 48 27.2 +005-05.2 * He 2-390 18 17 51.3 -26 49 53. 1950 18.133.025 18 20 58.74 -26 48 28.2 +005-05.2 * He 2-390 18 17 51.4 -26 49 50. 1950 38.002.010 18 20 58.84 -26 48 25.2 +005-05.2 * He 2-390 18 17 51.52 -26 49 49.2 1950 51.117.039 18 20 58.96 -26 48 24.4 +005-05.2 * He 2-390 18 17 51.42 -26 49 50.0 1950 51.117.039 rad 18 20 58.86 -26 48 25.2 +005-05.2 * He 2-390 18 17 49.8 -26 49 51. 1950 IRAS18178-2649 18 20 57.24 -26 48 26.3 +021+02.1 MaC 1-12 18 18 37.26 -08 33 09.3 1950 22.135.002 18 21 21.04 -08 31 42.0 +021+02.1 MaC 1-12 18 18 37.3 -08 33 09. 1950 64.134.005 18 21 21.08 -08 31 41.7 +021+02.1 MaC 1-12 18 21 21.1 -08 31 43. 2000 72.002.012 18 21 21.1 -08 31 43. +021+02.1 MaC 1-12 18 18 37.38 -08 33 09.4 1950 72.002.012 rad 18 21 21.16 -08 31 42.1 +021+02.1 MaC 1-12 18 18 36.9 -08 33 13. 1950 IRAS18186-0833 18 21 20.68 -08 31 45.7 +024+03.1 M 2-40 18 18 43. -06 03 26. 1950 CGPN/Mi 59 18 21 23.83 -06 01 58.4 +024+03.1 M 2-40 18 18 43.0 -06 03 22. 1950 10.114.152 18 21 23.83 -06 01 54.4 +024+03.1 M 2-40 18 18 43.0 -06 03 26. 1950 18.133.025 18 21 23.83 -06 01 58.4 +024+03.1 M 2-40 18 18 42.9 -06 03 24. 1950 31.114.201 18 21 23.73 -06 01 56.4 +024+03.1 M 2-40 18 18 43.1 -06 03 25. 1950 31.116.001 18 21 23.93 -06 01 57.4 +024+03.1 M 2-40 18 18 43.0 -06 03 23. 1950 50.134.178 18 21 23.83 -06 01 55.4 +024+03.1 M 2-40 18 18 43.1 -06 03 25. 1950 70.002.006 18 21 23.93 -06 01 57.4 +024+03.1 M 2-40 18 21 23.69 -06 01 55.8 2000 70.002.006 rad 18 21 23.69 -06 01 55.8 +024+03.1 M 2-40 18 18 42.9 -06 03 25. 1950 IRAS18187-060 18 21 23.73 -06 01 57.4 +005-06.2 SB 12 18 21 55.1 -27 09 46.2 2000 71.134.030 18 21 55.1 -27 09 46.2 +008-04.1 M 2-39 18 18 57. -24 14 52. 1950 CGPN/Mi 59 * 18 22 00.74 -24 13 22.5 +008-04.1 M 2-39 18 18 57.2 -24 12 09. 1950 CGPN/Fc 62 18 22 00.88 -24 10 39.5 +008-04.1 M 2-39 18 18 57.5 -24 12 09. 1950 CGPN/Koal 65 18 22 01.18 -24 10 39.5 +008-04.1 M 2-39 18 18 57.5 -24 12 09. 1950 18.133.025 18 22 01.18 -24 10 39.5 +008-04.1 M 2-39 18 18 57.5 -24 12 09. 1950 70.002.006 18 22 01.18 -24 10 39.5 +008-04.1 M 2-39 18 22 01.13 -24 10 41.3 2000 70.002.006 rad 18 22 01.13 -24 10 41.3 +008-04.1 M 2-39 18 18 58.3 -24 12 11. 1950 IRAS18189-2412 18 22 01.98 -24 10 41.4 +002-07.1 M 2-41 18 19 21. -30 45 03. 1950 CGPN/Mi 59 * 18 22 34.35 -30 43 31.5 +002-07.1 M 2-41 18 19 21.2 -30 45 01. 1950 CGPN/Koal 65 18 22 34.55 -30 43 29.4 +002-07.1 M 2-41 18 19 20.5 -30 44 51. 1950 08.114.108 18 22 33.85 -30 43 19.5 +002-07.1 M 2-41 18 19 21.2 -30 45 01. 1950 18.133.025 18 22 34.55 -30 43 29.4 +002-07.1 M 2-41 18 19 21.2 -30 45 02. 1950 70.002.006 18 22 34.55 -30 43 30.4 +002-07.1 M 2-41 18 22 34.62 -30 43 32.8 2000 70.002.006 rad 18 22 34.62 -30 43 32.8 +008-04.2 M 2-42 18 19 24. -24 11 02. 1950 CGPN/Mi 59 * 18 22 27.65 -24 09 30.6 +008-04.2 M 2-42 18 19 28.3 -24 10 59. 1950 CGPN/Fc 62 18 22 31.95 -24 09 27.3 +008-04.2 M 2-42 18 19 28.5 -24 11 00. 1950 CGPN/Koal 65 18 22 32.15 -24 09 28.3 +008-04.2 M 2-42 18 19 28.1 -24 11 00. 1950 18.133.025 18 22 31.75 -24 09 28.3 +008-04.2 M 2-42 18 19 28.5 -24 10 59. 1950 50.134.178 18 22 32.15 -24 09 27.3 +008-04.2 M 2-42 18 19 28.4 -24 11 01. 1950 70.002.006 18 22 32.05 -24 09 29.3 +008-04.2 M 2-42 18 22 32.07 -24 09 28.6 2000 70.002.006 rad 18 22 32.07 -24 09 28.6 +008-04.2 M 2-42 18 19 28.9 -24 10 57. 1950 IRAS18194-2410 18 22 32.55 -24 09 25.2 +005-06.1 NGC 6620 18 19 46.8 -26 50 51. 1950 CGPN/Koal 65 * 18 22 54.24 -26 49 17.8 +005-06.1 NGC 6620 18 19 46.5 -26 50 51. 1950 08.114.108 18 22 53.94 -26 49 17.8 +005-06.1 NGC 6620 18 19 46.8 -26 50 50. 1950 09.133.025 18 22 54.24 -26 49 16.8 +005-06.1 NGC 6620 18 19 46.8 -26 50 46.3 1950 11.133.011 18 22 54.24 -26 49 13.1 +005-06.1 NGC 6620 18 19 46.74 -26 50 49.2 1950 37.134.035 18 22 54.18 -26 49 16.0 +005-06.1 NGC 6620 18 19 46.7 -26 50 52. 1950 50.134.178 18 22 54.14 -26 49 18.8 +005-06.1 NGC 6620 18 19 46.9 -26 50 51. 1950 70.002.006 18 22 54.34 -26 49 17.8 +005-06.1 NGC 6620 18 22 54.02 -26 49 17.6 2000 70.002.006 rad 18 22 54.02 -26 49 17.6 +006-05.1 * SB 13 18 23 00.0 -26 05 17.1 2000 71.134.030 18 23 00.0 -26 05 17.1 +006-05.1 * SB 13 18 19 53.8 -26 06 50. 1950 Ko,Ku (1999) 18 23 00.18 -26 05 16.3 +003-07.1 KnFs 19 18 19 57.2 -29 44 59. 1950 45.134.023 18 23 08.99 -29 43 24.9 +003-07.1 KnFs 19 18 19 57.1 -29 44 59. 1950 70.002.006 18 23 08.89 -29 43 24.9 +003-07.1 KnFs 19 18 19 57.3 -29 45 00. 1950 Ko,Ku (1999) 18 23 09.09 -29 43 25.9 +012-02.1 M 1-45 18 20 11. -19 18 39. 1950 CGPN/Mi 59 * 18 23 08.08 -19 17 04.4 +012-02.1 M 1-45 18 20 10.9 -19 18 41. 1950 CGPN/Koal 65 18 23 07.98 -19 17 06.4 +012-02.1 M 1-45 18 20 10.7 -19 18 39. 1950 10.114.152 18 23 07.78 -19 17 04.4 +012-02.1 M 1-45 18 20 11.0 -19 18 41. 1950 18.133.025 18 23 08.08 -19 17 06.4 +012-02.1 M 1-45 18 20 10.90 -19 18 39.8 1950 34.134.032 18 23 07.98 -19 17 05.2 +012-02.1 M 1-45 18 20 10.9 -19 18 39. 1950 70.002.006 18 23 07.98 -19 17 04.4 +012-02.1 M 1-45 18 23 07.96 -19 17 04.7 2000 70.002.006 rad 18 23 07.96 -19 17 04.7 +007-05.1 SB 14 18 23 42.4 -24 47 26.2 2000 71.134.030 18 23 42.4 -24 47 26.2 +007-05.1 SB 14 18 20 38.2 -24 49 05. 1950 Ko,Ku (1999) 18 23 42.72 -24 47 28.2 +032+07.1 K 3-1 18 20 52.1 +03 34 52. 1950 CGPN/Ko 65b * 18 23 21.70 +03 36 28.6 +032+07.1 K 3-1 18 20 52.7 +03 34 56. 1950 30.135.052 18 23 22.30 +03 36 32.6 +032+07.1 K 3-1 18 20 52.2 +03 34 52. 1950 70.002.006 18 23 21.80 +03 36 28.6 +032+07.1 K 3-1 18 23 21.78 +03 36 28.2 2000 72.002.012 rad 18 23 21.78 +03 36 28.2 +019+00.1 M 3-53 18 21 21. -11 08 21. 1950 CGPN/Mi 59 18 24 07.86 -11 06 41.7 +019+00.1 M 3-53 18 21 21.09 -11 08 20.0 1950 55.002.049 18 24 07.95 -11 06 40.7 +019+00.1 M 3-53 18 21 21.1 -11 08 21. 1950 70.002.006 18 24 07.96 -11 06 41.7 +019+00.1 M 3-53 18 24 08.08 -11 06 41.8 2000 70.002.006 rad 18 24 08.08 -11 06 41.8 +019+00.1 M 3-53 18 21 19.9 -11 08 25. 1950 IRAS18213-1108 18 24 06.76 -11 06 45.8 +094+27.1 K 1-16 18 21 36.9 +64 20 18. 1950 CGPN/Ko 64d * 18 21 52.18 +64 21 53.0 +094+27.1 K 1-16 18 21 35.3 +64 20 30. 1950 34.134.010 18 21 50.56 +64 22 04.9 +094+27.1 K 1-16 18 21 40.0 +64 19 21. 1950 50.134.178 18 21 55.38 +64 20 56.2 +094+27.1 K 1-16 18 21 36.9 +64 20 18. 1950 70.002.006 18 21 52.18 +64 21 53.0 +007-06.1 H 1-66 18 21 51.5 -25 43 36. 1950 CGPN/Koal 65 * 18 24 57.29 -25 41 53.8 +007-06.1 H 1-66 18 21 51.5 -25 41 09. 1950 08.114.108 18 24 57.23 -25 39 26.8 +007-06.1 H 1-66 18 21 51.5 -25 43 37. 1950 50.134.178 18 24 57.29 -25 41 54.8 +007-06.1 H 1-66 18 21 51.59 -25 43 31.6 1950 54.134.034 18 24 57.38 -25 41 49.4 +007-06.1 H 1-66 18 21 51.7 -25 43 37. 1950 70.002.006 18 24 57.49 -25 41 54.8 +007-06.1 H 1-66 18 24 57.20 -25 41 49.4 2000 70.002.006 rad 18 24 57.20 -25 41 49.4 +007-06.1 H 1-66 18 21 52.0 -25 43 39. 1950 IRAS18218-2543 18 24 57.79 -25 41 56.8 +009-04.1 H 1-67 18 22 03.6 -22 36 35. 1950 CGPN/Koal 65 18 25 05.04 -22 34 52.1 +009-04.1 H 1-67 18 22 03.6 -22 36 35. 1950 50.134.178 18 25 05.04 -22 34 52.1 +009-04.1 H 1-67 18 22 03.71 -22 36 36.2 1950 54.134.034 18 25 05.16 -22 34 53.3 +009-04.1 H 1-67 18 22 03.5 -22 36 33. 1950 70.002.006 18 25 04.94 -22 34 50.1 +009-04.1 H 1-67 18 25 05.13 -22 34 53.8 2000 70.002.006 rad 18 25 05.13 -22 34 53.8 +009-04.1 H 1-67 18 22 04.4 -22 36 34. 1950 IRAS18220-2236 18 25 05.84 -22 34 51.0 +032+07.2 PC 19 18 22 13.6 +02 27 48. 1950 CGPN/Ko 65a 18 24 44.51 +02 29 30.6 +032+07.2 PC 19 18 22 13.6 +02 27 48. 1950 18.133.025 18 24 44.51 +02 29 30.6 +032+07.2 PC 19 18 22 13.61 +02 27 45.0 1950 52.002.003 18 24 44.52 +02 29 27.6 +032+07.2 PC 19 18 22 13.6 +02 27 45. 1950 62.134.030 18 24 44.51 +02 29 27.6 +032+07.2 PC 19 18 22 13.7 +02 27 44. 1950 70.002.006 18 24 44.61 +02 29 26.6 +032+07.2 PC 19 18 24 44.26 +02 29 28.2 2000 72.002.012 rad 18 24 44.26 +02 29 28.2 +028+05.1 K 3-2 18 22 25.1 -01 32 34. 1950 CGPN/Ko 65b 18 25 00.66 -01 30 50.4 +028+05.1 K 3-2 18 22 24.6 -01 32 36. 1950 30.135.052 18 25 00.16 -01 30 52.5 +028+05.1 K 3-2 18 22 25.01 -01 32 36.4 1950 37.134.035 18 25 00.57 -01 30 52.9 +028+05.1 K 3-2 18 22 25.00 -01 32 36.5 1950 52.002.003 18 25 00.56 -01 30 53.0 +028+05.1 K 3-2 18 22 25.0 -01 32 38. 1950 70.002.006 18 25 00.56 -01 30 54.5 +028+05.1 K 3-2 18 25 00.56 -01 30 51.5 2000 72.002.012 rad 18 25 00.56 -01 30 51.5 +028+05.1 K 3-2 18 22 24.7 -01 32 39. 1950 IRAS18224-0132 18 25 00.26 -01 30 55.5 +030+06.1 * Sh 2-68 18 22 25.7 +00 49 55. 1950 34.134.028 * 18 24 58.50 +00 51 38.5 +030+06.1 * Sh 2-68 18 22 25.7 +00 49 53. 1950 70.002.006 18 24 58.50 +00 51 36.5 +030+06.1 * Sh 2-68 18 22 25.8 +00 49 52. 1950 Ko,Ku (1999) 18 24 58.60 +00 51 35.5 +009-05.1 NGC 6629 18 18 25.19 -23 16 02.2 1880 CGPN/Wn 09 18 25 42.59 -23 12 10.9 +009-05.1 NGC 6629 18 19 37.83 -23 15 29.8 1900 CGPN/Po 10 18 25 42.34 -23 12 11.8 +009-05.1 NGC 6629 18 22 40.1 -23 13 52. 1950 CGPN/Fc 62 18 25 42.39 -23 12 06.4 +009-05.1 NGC 6629 18 22 40.2 -23 13 57. 1950 CGPN/Koal 65 18 25 42.49 -23 12 11.4 +009-05.1 NGC 6629 18 22 41.2 -23 13 45. 1950 09.133.025 18 25 43.48 -23 11 59.3 +009-05.1 NGC 6629 18 22 40.1 -23 13 55. 1950 70.002.006 18 25 42.39 -23 12 09.4 +009-05.1 NGC 6629 18 25 42.47 -23 12 11.3 2000 70.002.006 rad 18 25 42.47 -23 12 11.3 +009-05.1 NGC 6629 18 22 40.24 -23 13 55.6 1950 GSC 6857-00814 18 25 42.53 -23 12 10.0 +009-05.1 NGC 6629 18 22 40.6 -23 13 58. 1950 IRAS18226-2313 18 25 42.89 -23 12 12.4 +013-02.1 SrWe 3 18 23 07.5 -18 13 53. 1950 43.134.030 * 18 26 03.15 -18 12 05.7 +013-02.1 SrWe 3 18 23 08.2 -18 14 24. 1950 70.002.006 18 26 03.86 -18 12 36.6 +013-02.1 SrWe 3 18 26 03.70 -18 12 32.0 2000 70.002.006 rad 18 26 03.70 -18 12 32.0 +013-02.1 SrWe 3 18 23 08.2 -18 14 24. 1950 Ko,Ku (1999) 18 26 03.86 -18 12 36.6 +353-12.1 WRA 16-411 18 23 11.0 -40 31 40. 1950 Wr (1966) 18 26 41.54 -40 29 51.2 +353-12.1 WRA 16-411 18 23 11.4 -40 31 44. 1950 Ko,Ku (1999) 18 26 41.95 -40 29 55.1 +353-12.1 WRA 16-411 18 23 12.1 -40 31 42. 1950 IRAS18232-4031 18 26 42.65 -40 29 53.1 +020+00.1 PN 1823-1047 18 23 11.8 -10 47 15. 1950 66.134.003 18 25 58.22 -10 45 27.7 +020+00.1 PN 1823-1047 18 23 11.6 -10 47 16. 1950 66.134.003 rad 18 25 58.02 -10 45 28.7 +020+00.1 PN 1823-1047 18 25 58.1 -10 45 28. 2000 72.002.012 18 25 58.1 -10 45 28. +020+00.1 PN 1823-1047 18 23 11.67 -10 47 17.6 1950 72.002.012 rad 18 25 58.09 -10 45 30.3 +020+00.1 PN 1823-1047 18 23 11.8 -10 47 16. 1950 Ko,Ku (1999) 18 25 58.22 -10 45 28.7 +020+00.1 PN 1823-1047 18 23 11.8 -10 47 15. 1950 IRAS18231-1047 18 25 58.22 -10 45 27.7 +027+04.1 M 2-43 18 24 03. -02 44 47. 1950 CGPN/Mi 59 18 26 39.95 -02 42 56.3 +027+04.1 M 2-43 18 24 03.1 -02 44 47. 1950 CGPN/Ko 65a 18 26 40.05 -02 42 56.3 +027+04.1 M 2-43 18 24 03.0 -02 44 47. 1950 09.133.025 18 26 39.95 -02 42 56.3 +027+04.1 M 2-43 18 24 03.1 -02 44 48. 1950 31.114.201 18 26 40.05 -02 42 57.3 +027+04.1 M 2-43 18 24 03.09 -02 44 48.4 1950 52.002.003 18 26 40.04 -02 42 57.7 +027+04.1 M 2-43 18 24 03.1 -02 44 49. 1950 70.002.006 18 26 40.05 -02 42 58.3 +027+04.1 M 2-43 18 26 40.01 -02 42 58.5 2000 70.002.006 rad 18 26 40.01 -02 42 58.5 +027+04.1 M 2-43 18 24 03.2 -02 44 49. 1950 IRAS18240-0244 18 26 40.15 -02 42 58.3 +017-01.1 PN 1824-1410 18 24 22.8 -14 10 29. 1950 66.134.003 18 27 13.33 -14 08 36.4 +017-01.1 PN 1824-1410 18 24 22.8 -14 10 27. 1950 66.134.003 rad 18 27 13.33 -14 08 34.4 +017-01.1 PN 1824-1410 18 24 22.78 -14 10 28.0 1950 72.002.012 rad 18 27 13.31 -14 08 35.4 +017-01.1 PN 1824-1410 18 27 13.2 -14 08 35. 2000 72.002.012 18 27 13.2 -14 08 35. +017-01.1 PN 1824-1410 18 24 22.9 -14 10 30. 1950 Ko,Ku (1999) 18 27 13.43 -14 08 37.4 +017-01.1 PN 1824-1410 18 24 21.3 -14 10 36. 1950 IRAS18243-1410 18 27 11.84 -14 08 43.5 +356-11.1 Lo 17 18 24 26.3 -37 17 49. 1950 70.002.006 * 18 27 50.62 -37 15 54.9 +356-11.1 Lo 17 18 24 26.7 -37 17 50. 1950 Ko,Ku (1999) 18 27 51.02 -37 15 55.9 +031+05.1 K 3-3 18 24 37.1 +01 12 37. 1950 CGPN/Ko 65b 18 27 09.46 +01 14 30.0 +031+05.1 K 3-3 18 24 37.0 +01 12 33. 1950 50.134.178 18 27 09.36 +01 14 26.0 +031+05.1 K 3-3 18 24 36.9 +01 12 34. 1950 70.002.006 18 27 09.26 +01 14 27.0 +031+05.1 K 3-3 18 27 09.37 +01 14 26.0 2000 70.002.006 rad 18 27 09.37 +01 14 26.0 +031+05.1 K 3-3 18 24 37.0 +01 12 34. 1950 IRAS18246+0112 18 27 09.36 +01 14 27.0 +007-06.2 Vy 2-1 18 24 53.2 -26 08 52. 1950 CGPN/Fc 62 18 27 59.55 -26 06 56.6 +007-06.2 Vy 2-1 18 24 53.2 -26 08 43. 1950 CGPN/Koal 65 18 27 59.54 -26 06 47.6 +007-06.2 Vy 2-1 18 24 53.1 -26 08 43. 1950 08.114.108 18 27 59.44 -26 06 47.6 +007-06.2 Vy 2-1 18 24 53.2 -26 08 36. 1950 18.133.025 18 27 59.54 -26 06 40.6 +007-06.2 Vy 2-1 18 24 53.3 -26 08 43. 1950 50.134.178 18 27 59.64 -26 06 47.6 +007-06.2 Vy 2-1 18 24 53.4 -26 08 43. 1950 70.002.006 18 27 59.74 -26 06 47.6 +007-06.2 Vy 2-1 18 27 59.61 -26 06 48.1 2000 70.002.006 rad 18 27 59.61 -26 06 48.1 +007-06.2 Vy 2-1 18 24 52.7 -26 08 46. 1950 IRAS18248-2608 18 27 59.04 -26 06 50.7 +021+00.1 * PN 1825-0940 18 25 00.7 -09 40 07. 1950 66.134.003 * 18 27 45.77 -09 38 11.8 +021+00.1 * PN 1825-0940 18 25 00.6 -09 40 09. 1950 66.134.003 rad 18 27 45.67 -09 38 13.8 +021+00.1 * PN 1825-0940 18 25 00.14 -09 40 07.6 1950 72.002.012 rad 18 27 45.21 -09 38 12.5 +021+00.1 * PN 1825-0940 18 25 00.7 -09 40 09. 1950 Ko,Ku (1999) 18 27 45.77 -09 38 13.8 +021+00.1 * PN 1825-0940 18 25 01.2 -09 40 08. 1950 IRAS18250-0940 18 27 46.27 -09 38 12.8 +016-01.1 M 1-46 18 25 04. -15 34 51. 1950 CGPN/Mi 59 18 27 56.27 -15 32 55.3 +016-01.1 M 1-46 18 25 04.5 -15 34 53. 1950 09.133.025 18 27 56.77 -15 32 57.3 +016-01.1 M 1-46 18 25 04.1 -15 34 40. 1950 50.134.178 18 27 56.37 -15 32 44.3 +016-01.1 M 1-46 18 25 04.0 -15 34 51. 1950 70.002.006 18 27 56.27 -15 32 55.3 +016-01.1 M 1-46 18 27 56.35 -15 32 54.9 2000 70.002.006 rad 18 27 56.35 -15 32 54.9 +016-01.1 M 1-46 18 25 03.8 -15 34 52. 1950 IRAS18250-1534 18 27 56.07 -15 32 56.4 +009-05.2 SB 16 18 28 21.1 -23 25 28.0 2000 71.134.030 18 28 21.1 -23 25 28.0 +043+11.1 M 3-27 18 25 32. +14 27 09. 1950 CGPN/Mi 59 18 27 48.66 +14 29 05.4 +043+11.1 M 3-27 18 25 31.6 +14 27 11. 1950 CGPN/Ko 64d 18 27 48.26 +14 29 07.4 +043+11.1 M 3-27 18 25 31.6 +14 27 11. 1950 AJB 68.13261 18 27 48.26 +14 29 07.4 +043+11.1 M 3-27 18 25 31.6 +14 27 11. 1950 18.133.025 18 27 48.26 +14 29 07.4 +043+11.1 M 3-27 18 25 31.7 +14 27 09. 1950 70.002.006 18 27 48.36 +14 29 05.4 +043+11.1 M 3-27 18 25 30.9 +14 27 07. 1950 IRAS18255+1427 18 27 47.56 +14 29 03.3 +022+01.1 MaC 1-13 18 25 51.13 -08 45 23.0 1950 22.135.002 18 28 35.11 -08 43 24.2 +022+01.1 MaC 1-13 18 25 51.2 -08 45 22. 1950 70.002.006 18 28 35.18 -08 43 23.2 +022+01.1 MaC 1-13 18 28 35.23 -08 43 24.1 2000 70.002.006 rad 18 28 35.23 -08 43 24.1 +022+01.1 MaC 1-13 18 25 51.4 -08 45 22. 1950 Ko,Ku (1999) 18 28 35.38 -08 43 23.2 +022+01.1 MaC 1-13 18 25 50.0 -08 45 24. 1950 IRAS18258-0845 18 28 33.98 -08 43 25.3 +002-09.1 Cn 1-5 18 25 57.2 -31 32 00. 1950 CGPN/Koal 65 18 29 11.66 -31 29 59.7 +002-09.1 Cn 1-5 18 25 57.2 -31 32 01. 1950 08.114.108 18 29 11.66 -31 30 00.7 +002-09.1 Cn 1-5 18 25 56.2 -31 31 59. 1950 50.134.178 18 29 10.66 -31 29 58.8 +002-09.1 Cn 1-5 18 25 57.2 -31 31 59. 1950 70.002.006 18 29 11.66 -31 29 58.7 +002-09.1 Cn 1-5 18 29 11.48 -31 30 01.1 2000 70.002.006 rad 18 29 11.48 -31 30 01.1 +002-09.1 Cn 1-5 18 25 57.5 -31 32 02. 1950 IRAS18259-3132 18 29 11.96 -31 30 01.7 +011-05.1 M 1-47 18 26 11. -21 49 00. 1950 CGPN/Mi 59 18 29 11.31 -21 46 59.2 +011-05.1 M 1-47 18 26 10.9 -21 48 55. 1950 CGPN/Koal 65 18 29 11.21 -21 46 54.2 +011-05.1 M 1-47 18 26 10.8 -21 48 54. 1950 50.134.178 18 29 11.11 -21 46 53.2 +011-05.1 M 1-47 18 26 10.7 -21 48 56. 1950 70.002.006 18 29 11.01 -21 46 55.2 +011-05.1 M 1-47 18 29 11.04 -21 46 53.2 2000 70.002.006 rad 18 29 11.04 -21 46 53.2 +011-05.1 M 1-47 18 26 10.9 -21 48 55. 1950 IRAS18261-2148 18 29 11.21 -21 46 54.2 +016-02.1 Sa 3-134 18 26 28.1 -15 09 42. 1950 70.002.006 * 18 29 19.83 -15 07 40.3 +016-02.1 Sa 3-134 18 29 19.00 -15 07 51.0 2000 70.002.006 rad 18 29 19.00 -15 07 51.0 +016-02.1 Sa 3-134 18 26 28.2 -15 09 43. 1950 Ko,Ku (1999) 18 29 19.93 -15 07 41.3 +016-02.1 Sa 3-134 18 26 28.8 -15 09 45. 1950 IRAS18264-1509 18 29 20.54 -15 07 43.2 +013-03.1 M 1-48 18 26 33. -19 07 47. 1950 CGPN/Mi 59 * 18 29 29.77 -19 05 44.7 +013-03.1 M 1-48 18 22 33.3 -19 07 48. 1950 CGPN/Koal 65 18 25 30.11 -19 06 03.1 +013-03.1 M 1-48 18 26 33.0 -19 07 47. 1950 18.133.025 18 29 29.77 -19 05 44.7 +013-03.1 M 1-48 18 26 33.3 -19 07 47. 1950 50.134.178 18 29 30.07 -19 05 44.7 +013-03.1 M 1-48 18 26 33.3 -19 07 48. 1950 70.002.006 18 29 30.07 -19 05 45.7 +013-03.1 M 1-48 18 29 29.66 -19 05 41.0 2000 70.002.006 rad 18 29 29.66 -19 05 41.0 +013-04.1 Pe 2-14 18 27 02.0 -19 42 42. 1950 CGPN/Koal 65 18 29 59.52 -19 40 37.6 +013-04.1 Pe 2-14 18 27 02.1 -19 42 42. 1950 70.002.006 18 29 59.62 -19 40 37.6 +013-04.1 Pe 2-14 18 29 59.63 -19 40 36.1 2000 70.002.006 rad 18 29 59.63 -19 40 36.1 +015-03.1 A 44 18 27 16.4 -16 47 22. 1950 CGPN/Koal 65 18 30 10.16 -16 45 16.7 +015-03.1 A 44 18 27 17.2 -16 47 28.6 1950 11.133.011 18 30 10.97 -16 45 23.2 +015-03.1 A 44 18 27 17.5 -16 47 32. 1950 18.133.025 18 30 11.27 -16 45 26.6 +015-03.1 A 44 18 27 17.3 -16 47 23. 1950 50.134.178 18 30 11.06 -16 45 17.6 +015-03.1 A 44 18 27 17.5 -16 47 29. 1950 70.002.006 18 30 11.27 -16 45 23.6 +015-03.1 A 44 18 30 10.99 -16 45 26.1 2000 70.002.006 rad 18 30 10.99 -16 45 26.1 +018-01.1 * M 1-49 18 27 23. -13 56 05. 1950 CGPN/Mi 59 18 30 13.21 -13 53 59.4 +018-01.1 * M 1-49 18 27 22.7 -13 56 04. 1950 IRAS18273-1356 18 30 12.91 -13 53 58.4 +020-00.1 A 45 18 27 28.7 -11 39 02. 1950 70.002.006 * 18 30 16.13 -11 36 56.0 +020-00.1 A 45 18 27 26.9 -11 38 48. 1950 Ko,Ku (1999) 18 30 14.33 -11 36 42.2 +013-04.2 V-V 3-4 18 27 37. -19 16 54. 1950 14.133.028 * 18 30 33.95 -19 14 47.1 +013-04.2 V-V 3-4 18 27 37.13 -19 16 52.4 1950 52.002.003 18 30 34.08 -19 14 45.5 +013-04.2 V-V 3-4 18 27 37.10 -19 16 54.5 1950 54.134.034 18 30 34.05 -19 14 47.6 +013-04.2 V-V 3-4 18 27 40.6 -19 17 36. 1950 Ko,Ku (1999) 18 30 37.56 -19 15 28.8 +013-04.2 V-V 3-4 18 27 37.0 -19 16 54. 1950 IRAS18276-1916 18 30 33.95 -19 14 47.1 +023+01.1 * MA 13 18 27 48.1 :-07 29 45. : 1950 31.114.201 18 30 30.58 -07 27 37.8 +023+01.1 * MA 13 18 27 48.08 -07 29 43.2 1950 55.002.049 18 30 30.56 -07 27 36.0 +023+01.1 * MA 13 18 27 47.9 -07 29 45. 1950 64.134.005 18 30 30.38 -07 27 37.8 +023+01.1 * MA 13 18 27 48.0 -07 29 45. 1950 66.134.003 18 30 30.48 -07 27 37.8 +023+01.1 * MA 13 18 27 48.0 -07 29 47. 1950 70.002.006 18 30 30.48 -07 27 39.8 +023+01.1 * MA 13 18 30 30.41 -07 27 36.3 2000 70.002.006 rad 18 30 30.41 -07 27 36.3 +023+01.1 * MA 13 18 27 47.9 -07 29 45. 1950 IRAS18277-0729 18 30 30.38 -07 27 37.8 +009-06.2 * SB 15 18 31 14.7 -23 58 03.2 2000 71.134.030 18 31 14.7 -23 58 03.2 +009-06.2 * SB 15 18 28 11.6 -24 00 15. 1950 Ko,Ku (1999) 18 31 14.86 -23 58 05.4 +032+05.1 K 3-4 18 28 29.3 +02 23 20. 1950 CGPN/Ko 65b * 18 31 00.30 +02 25 29.8 +032+05.1 K 3-4 18 28 29.5 +02 23 26. 1950 09.133.025 18 31 00.50 +02 25 35.8 +032+05.1 K 3-4 18 28 29.2 +02 23 20. 1950 70.002.006 18 31 00.20 +02 25 29.7 +032+05.1 K 3-4 18 31 00.29 +02 25 26.7 2000 70.002.006 rad 18 31 00.29 +02 25 26.7 +008-07.1 He 2-406 18 28 48.5 -24 48 28. 1950 70.002.006 18 31 52.87 -24 46 15.7 +008-07.1 He 2-406 18 31 52.71 -24 46 09.2 2000 70.002.006 rad 18 31 52.71 -24 46 09.2 +008-07.1 He 2-406 18 28 48.7 -24 48 29. 1950 Ko,Ku (1999) 18 31 53.07 -24 46 16.7 +008-07.1 He 2-406 18 28 48.1 -24 48 35. 1950 IRAS18288-2448 18 31 52.48 -24 46 22.7 +034+06.1 K 3-5 18 29 16.8 +04 02 59. 1950 CGPN/Ko 65b 18 31 45.87 +04 05 12.1 +034+06.1 K 3-5 18 29 16.7 +04 02 54. 1950 50.134.178 18 31 45.77 +04 05 07.1 +034+06.1 K 3-5 18 29 16.8 +04 02 56. 1950 70.002.006 18 31 45.87 +04 05 09.1 +034+06.1 K 3-5 18 31 45.97 +04 05 10.9 2000 70.002.006 rad 18 31 45.97 +04 05 10.9 +034+06.1 K 3-5 18 29 16.8 +04 02 53. 1950 IRAS18292+0402 18 31 45.87 +04 05 06.1 +055+16.1 A 46 18 29 18.9 +26 53 54. 1950 02.133.027 18 31 19.06 +26 56 06.2 +055+16.1 A 46 18 29 18.0 +26 54 05. 1950 09.133.025 18 31 18.15 +26 56 17.2 +055+16.1 A 46 18 29 18.7 +26 54 05. 1950 34.134.010 18 31 18.85 +26 56 17.2 +055+16.1 A 46 18 29 18.4 +26 53 59. 1950 70.002.006 18 31 18.56 +26 56 11.2 +055+16.1 A 46 18 31 18.60 +26 56 20.0 2000 72.002.012 rad 18 31 18.60 +26 56 20.0 +005-08.1 Hf 2-2 18 29 20.7 -28 45 36. 1950 CGPN/Koal 65 18 32 30.80 -28 43 21.1 +005-08.1 Hf 2-2 18 29 20.9 -28 45 39. 1950 Wr (1966) 18 32 31.00 -28 43 24.1 +005-08.1 Hf 2-2 18 29 20.8 -28 45 35. 1950 70.002.006 18 32 30.90 -28 43 20.1 +005-08.1 Hf 2-2 18 32 30.63 -28 43 27.8 2000 70.002.006 rad 18 32 30.63 -28 43 27.8 +005-08.1 Hf 2-2 18 29 20.3 -28 45 37. 1950 IRAS18293-2845 18 32 30.40 -28 43 22.2 +008-07.2 NGC 6644 18 28 11.9 -25 08 51.4 1929 CGPN/Sr 30 * 18 32 34.32 -25 05 43.2 +008-07.2 NGC 6644 18 29 30.0 -25 10 02. 1950 CGPN/Fc 62 18 32 34.87 -25 07 46.6 +008-07.2 NGC 6644 18 29 29.8 -25 09 59. 1950 CGPN/Koal 65 18 32 34.66 -25 07 43.7 +008-07.2 NGC 6644 18 29 29.87 -25 09 59.2 1950 34.134.032 18 32 34.74 -25 07 43.9 +008-07.2 NGC 6644 18 29 29.85 -25 10 00.1 1950 37.134.035 18 32 34.72 -25 07 44.8 +008-07.2 NGC 6644 18 29 29.8 -25 09 59. 1950 70.002.006 18 32 34.66 -25 07 43.7 +008-07.2 NGC 6644 18 32 34.69 -25 07 44.3 2000 70.002.006 rad 18 32 34.69 -25 07 44.3 +008-07.2 NGC 6644 18 29 29.95 -25 09 59.0 1950 GSC 6861-02786 18 32 34.81 -25 07 43.7 +008-07.2 NGC 6644 18 29 30.2 -25 10 01. 1950 IRAS18295-2510 18 32 35.07 -25 07 45.6 +021-00.1 M 3-28 18 29 56. -10 08 08. 1950 CGPN/Mi 59 18 32 41.59 -10 05 51.5 +021-00.1 M 3-28 18 29 55.6 -10 08 05. 1950 18.133.025 18 32 41.19 -10 05 48.5 +021-00.1 M 3-28 18 29 55.7 -10 08 06. 1950 37.132.013 18 32 41.29 -10 05 49.5 +021-00.1 M 3-28 18 29 55.7 -10 08 07. 1950 50.134.178 18 32 41.29 -10 05 50.5 +021-00.1 M 3-28 18 29 55.8 -10 08 07. 1950 70.002.006 18 32 41.39 -10 05 50.5 +021-00.1 M 3-28 18 29 55.7 -10 08 22. 1950 IRAS18299-1008 18 32 41.30 -10 06 05.5 +018-02.1 M 3-54 18 30 14. -13 46 41. 1950 CGPN/Mi 59 18 33 03.99 -13 44 23.0 +018-02.1 M 3-54 18 30 13.7 -13 46 34. 1950 30.135.052 18 33 03.69 -13 44 16.0 +018-02.1 M 3-54 18 30 13.78 -13 46 38.0 1950 52.002.003 18 33 03.77 -13 44 20.0 +018-02.1 M 3-54 18 30 13.8 -13 46 37. 1950 70.002.006 18 33 03.79 -13 44 19.0 +018-02.1 M 3-54 18 33 03.82 -13 44 17.7 2000 70.002.006 rad 18 33 03.82 -13 44 17.7 +018-02.1 M 3-54 18 30 13.9 -13 46 39. 1950 IRAS18302-1346 18 33 03.89 -13 44 21.0 +014-04.1 M 1-50 18 30 24. -18 18 56. 1950 CGPN/Mi 59 18 33 19.66 -18 16 37.1 +014-04.1 M 1-50 18 30 25.2 -18 18 56. 1950 CGPN/Koal 65 18 33 20.86 -18 16 37.0 +014-04.1 M 1-50 18 30 25.21 -18 18 56.2 1950 10.113.006 18 33 20.87 -18 16 37.2 +014-04.1 M 1-50 18 30 25.2 -18 18 49. 1950 18.133.025 18 33 20.86 -18 16 30.0 +014-04.1 M 1-50 18 30 25.3 -18 18 56. 1950 70.002.006 18 33 20.96 -18 16 37.0 +014-04.1 M 1-50 18 33 20.97 -18 16 38.7 2000 70.002.006 rad 18 33 20.97 -18 16 38.7 +014-04.1 M 1-50 18 30 24.9 -18 18 55. 1950 IRAS18304-1818 18 33 20.56 -18 16 36.0 +021-00.2 M 3-55 18 30 30. -10 17 39. 1950 CGPN/Mi 59 18 33 15.78 -10 15 20.0 +021-00.2 M 3-55 18 30 28.9 -10 17 26. 1950 18.133.025 18 33 14.67 -10 15 07.1 +021-00.2 M 3-55 18 30 29.0 -10 17 38. 1950 70.002.006 18 33 14.78 -10 15 19.1 +021-00.2 M 3-55 18 30 29.1 -10 17 40. 1950 Ko,Ku (1999) 18 33 14.88 -10 15 21.1 +021-01.1 M 1-51 18 30 42. -11 09 46. 1950 CGPN/Mi 59 18 33 28.82 -11 07 26.1 +021-01.1 M 1-51 18 30 42.0 -11 09 44. 1950 10.114.152 18 33 28.82 -11 07 24.1 +021-01.1 M 1-51 18 30 42.1 -11 09 46. 1950 50.134.178 18 33 28.92 -11 07 26.1 +021-01.1 M 1-51 18 30 42.29 -11 09 43.2 1950 55.002.049 18 33 29.10 -11 07 23.3 +021-01.1 M 1-51 18 30 42.2 -11 09 46. 1950 70.002.006 18 33 29.02 -11 07 26.1 +021-01.1 M 1-51 18 33 28.96 -11 07 26.3 2000 70.002.006 rad 18 33 28.96 -11 07 26.3 +021-01.1 M 1-51 18 30 42.2 -11 09 46. 1950 IRAS18307-1109 18 33 29.02 -11 07 26.1 +030+04.1 K 3-6 18 30 44.0 +00 09 30. 1950 CGPN/Ko 65b 18 33 17.58 +00 11 49.6 +030+04.1 K 3-6 18 30 43.8 +00 09 32. 1950 30.135.052 18 33 17.38 +00 11 51.6 +030+04.1 K 3-6 18 30 43.90 +00 09 26.9 1950 52.002.003 18 33 17.48 +00 11 46.5 +030+04.1 K 3-6 18 30 43.9 +00 09 27. 1950 70.002.006 18 33 17.48 +00 11 46.6 +030+04.1 K 3-6 18 33 17.67 +00 11 50.3 2000 70.002.006 rad 18 33 17.67 +00 11 50.3 +030+04.1 K 3-6 18 30 43.9 +00 09 25. 1950 IRAS18307+0009 18 33 17.48 +00 11 44.6 +038+07.1 * K 1-25 18 30 46. +08 16 06. 1950 06.133.002 18 33 10.14 +08 18 25.4 +038+07.1 * K 1-25 18 30 46.3 +08 16 01. 1950 Ko,Ku (1999) 18 33 10.45 +08 18 20.4 +010-06.1 IC 4732 18 29 36.8 -22 41 55.8 1929 CGPN/Sr 30 * 18 33 54.37 -22 38 39.2 +010-06.1 IC 4732 18 31 01.9 -22 39 03. 1950 CGPN/Koal 65 18 34 03.26 -22 36 41.1 +010-06.1 IC 4732 18 30 53.3 -22 40 57. 1950 09.133.025 18 33 54.71 -22 38 35.8 +010-06.1 IC 4732 18 30 53.24 -22 41 00.8 1950 10.113.006 18 33 54.65 -22 38 39.6 +010-06.1 IC 4732 18 30 53.25 -22 41 02.8 1950 37.134.035 18 33 54.66 -22 38 41.6 +010-06.1 IC 4732 18 30 53.2 -22 41 02. 1950 70.002.006 18 33 54.61 -22 38 40.8 +010-06.1 IC 4732 18 33 54.55 -22 38 40.5 2000 70.002.006 rad 18 33 54.55 -22 38 40.5 +010-06.1 IC 4732 18 30 53.32 -22 41 01.8 1950 GSC 6858-00905 18 33 54.73 -22 38 40.6 +010-06.1 IC 4732 18 30 53.4 -22 41 01. 1950 IRAS18308-2241 18 33 54.81 -22 38 39.8 +017-02.1 M 1-52 18 31 07. -14 54 48. 1950 CGPN/Mi 59 18 33 58.38 -14 52 26.1 +017-02.1 M 1-52 18 31 07.0 -14 54 48. 1950 18.133.025 18 33 58.38 -14 52 26.1 +017-02.1 M 1-52 18 31 07.2 -14 54 46. 1950 50.134.178 18 33 58.57 -14 52 24.1 +017-02.1 M 1-52 18 31 07.2 -14 54 46. 1950 70.002.006 18 33 58.57 -14 52 24.1 +017-02.1 M 1-52 18 33 58.54 -14 52 30.7 2000 70.002.006 rad 18 33 58.54 -14 52 30.7 +017-02.1 M 1-52 18 31 07.5 -14 54 52. 1950 IRAS18311-1454 18 33 58.88 -14 52 30.1 +019-02.1 M 4-10 18 31 25. -13 14 46. 1950 CGPN/Mi 59 * 18 34 14.33 -13 12 22.9 +019-02.1 M 4-10 18 31 24.1 -13 14 43. 1950 18.133.025 18 34 13.43 -13 12 20.0 +019-02.1 M 4-10 18 31 24.52 -13 14 47.7 1950 52.002.003 18 34 13.85 -13 12 24.6 +019-02.1 M 4-10 18 31 24.5 -13 14 47. 1950 70.002.006 18 34 13.83 -13 12 23.9 +019-02.1 M 4-10 18 34 14.01 -13 12 25.1 2000 70.002.006 rad 18 34 14.01 -13 12 25.1 +028+02.1 K 3-7 18 31 37.1 -02 29 59. 1950 CGPN/Ko 65b 18 34 13.75 -02 27 35.5 +028+02.1 K 3-7 18 31 37.0 -02 29 59. 1950 18.133.025 18 34 13.65 -02 27 35.5 +028+02.1 K 3-7 18 31 37.0 -02 29 59. 1950 31.114.201 18 34 13.65 -02 27 35.5 +028+02.1 K 3-7 18 31 36.98 -02 30 01.0 1950 52.002.003 18 34 13.63 -02 27 37.5 +028+02.1 K 3-7 18 31 37.0 -02 30 01. 1950 70.002.006 18 34 13.65 -02 27 37.5 +028+02.1 K 3-7 18 34 13.66 -02 27 36.0 2000 70.002.006 rad 18 34 13.66 -02 27 36.0 +028+02.1 K 3-7 18 31 36.7 -02 30 03. 1950 IRAS18316-0230 18 34 13.35 -02 27 39.5 +044+10.1 * We 3-1 18 31 46.8 +14 46 54. 1950 70.002.006 18 34 03.11 +14 49 17.5 +044+10.1 * We 3-1 18 31 46.2 +14 46 55. 1950 We (1978) 18 34 02.51 +14 49 18.4 +044+10.1 * We 3-1 18 31 46.1 +14 46 45. 1950 Ko,Ku (1999) 18 34 02.41 +14 49 08.4 +006-08.1 Ae 1 18 31 47.6 -27 08 49. 1950 Wr (1966) * 18 34 55.25 -27 06 23.6 +006-08.1 Ae 1 18 31 47.4 -27 08 46. 1950 70.002.006 18 34 55.05 -27 06 20.6 +006-08.1 Ae 1 18 31 47.9 -27 08 46. 1950 Ko,Ku (1999) 18 34 55.55 -27 06 20.6 +010-06.2 Pe 1-13 18 31 50.3 -22 45 44. 1950 CGPN/Koal 65 18 34 51.80 -22 43 18.6 +010-06.2 Pe 1-13 18 31 50.4 -22 45 42. 1950 50.134.178 18 34 51.90 -22 43 16.6 +010-06.2 Pe 1-13 18 31 50.32 -22 45 34.1 1950 54.134.034 18 34 51.81 -22 43 08.7 +010-06.2 Pe 1-13 18 31 50.1 -22 45 42. 1950 70.002.006 18 34 51.60 -22 43 16.7 +010-06.2 Pe 1-13 18 34 51.64 -22 43 22.4 2000 70.002.006 rad 18 34 51.64 -22 43 22.4 +010-06.2 Pe 1-13 18 31 51.6 -22 45 43. 1950 IRAS18318-2245 18 34 53.10 -22 43 17.5 +004-09.1 SB 9 18 35 42.4 -29 38 22.2 2000 71.134.030 18 35 42.4 -29 38 22.2 +004-09.1 SB 9 18 32 31.2 -29 40 51. 1950 Ko,Ku (1999) 18 35 42.62 -29 38 22.3 +030+03.1 A 47 18 32 48.0 -00 16 00. 1950 18.133.025 * 18 35 22.07 -00 13 31.5 +030+03.1 A 47 18 32 48.5 -00 16 19. 1950 70.002.006 18 35 22.57 -00 13 50.4 +030+03.1 A 47 18 35 22.34 -00 13 50.3 2000 70.002.006 rad 18 35 22.34 -00 13 50.3 +030+03.1 A 47 18 32 48.7 -00 16 20. 1950 Ko,Ku (1999) 18 35 22.77 -00 13 51.4 +015-04.1 M 1-53 18 32 53.5 -17 38 38. 1950 CGPN/Koal 65 18 35 48.27 -17 36 08.3 +015-04.1 M 1-53 18 32 53.5 -17 38 38. 1950 18.133.025 18 35 48.27 -17 36 08.3 +015-04.1 M 1-53 18 32 53.6 -17 38 38. 1950 70.002.006 18 35 48.37 -17 36 08.3 +015-04.1 M 1-53 18 35 48.29 -17 36 11.2 2000 70.002.006 rad 18 35 48.29 -17 36 11.2 +015-04.1 M 1-53 18 32 53.1 -17 38 39. 1950 IRAS18328-1738 18 35 47.87 -17 36 09.4 +016-04.1 M 1-54 18 33 14. -17 02 29. 1950 CGPN/Mi 59 18 36 08.00 -16 59 57.9 +016-04.1 M 1-54 18 33 14.4 -17 02 29. 1950 CGPN/Koal 65 18 36 08.40 -16 59 57.8 +016-04.1 M 1-54 18 33 14.3 -17 02 29.0 1950 11.133.011 18 36 08.30 -16 59 57.9 +016-04.1 M 1-54 18 33 14.3 -17 02 28.9 1950 11.133.011 18 36 08.30 -16 59 57.8 +016-04.1 M 1-54 18 33 14.4 -17 02 30. 1950 18.133.025 18 36 08.40 -16 59 58.8 +016-04.1 M 1-54 18 33 14.3 -17 02 28. 1950 70.002.006 18 36 08.30 -16 59 56.9 +016-04.1 M 1-54 18 36 08.31 -16 59 57.8 2000 70.002.006 rad 18 36 08.31 -16 59 57.8 +016-04.1 M 1-54 18 33 14.3 -17 02 29. 1950 IRAS18332-1702 18 36 08.30 -16 59 57.9 +009-07.1 IRAS18333-2357 18 33 20.03 -23 57 49.5 1950 49.133.005 18 36 23.14 -23 55 17.6 +009-07.1 IRAS18333-2357 18 33 20.3 -23 57 52. 1950 70.002.006 18 36 23.41 -23 55 20.1 +009-07.1 IRAS18333-2357 18 33 19.8 -23 57 50. 1950 Ko,Ku (1999) 18 36 22.91 -23 55 18.1 +009-07.1 IRAS18333-2357 18 33 20.3 -23 57 52. 1950 IRAS18333-2357 18 36 23.41 -23 55 20.1 +011-06.1 M 1-55 18 33 33.6 -21 51 35. 1950 CGPN/Koal 65 18 36 33.85 -21 49 02.2 +011-06.1 M 1-55 18 33 33.5 -21 51 36. 1950 70.002.006 18 36 33.75 -21 49 03.2 +011-06.1 M 1-55 18 36 33.72 -21 49 03.0 2000 70.002.006 rad 18 36 33.72 -21 49 03.0 +011-06.1 M 1-55 18 33 34.2 -21 51 37. 1950 IRAS18335-2151 18 36 34.45 -21 49 04.2 +014-05.1 V-V 3-5 18 33 35.1 -19 21 58. 1950 11.133.012 * 18 36 32.07 -19 19 25.3 +014-05.1 V-V 3-5 18 33 35.3 -19 22 02. 1950 70.002.006 18 36 32.27 -19 19 29.2 +014-05.1 V-V 3-5 18 36 32.31 -19 19 28.0 2000 70.002.006 rad 18 36 32.31 -19 19 28.0 +014-05.1 V-V 3-5 18 33 35.2 -19 22 03. 1950 Ko,Ku (1999) 18 36 32.17 -19 19 30.2 +014-05.2 V-V 3-6 18 34 14.53 -19 04 58.7 1950 10.113.006 18 37 11.12 -19 02 23.1 +014-05.2 V-V 3-6 18 34 14.53 -19 04 57.6 1950 52.002.003 18 37 11.12 -19 02 22.0 +014-05.2 V-V 3-6 18 34 14.50 -19 04 59.9 1950 54.134.034 18 37 11.09 -19 02 24.3 +014-05.2 V-V 3-6 18 34 14.6 -19 04 58. 1950 70.002.006 18 37 11.19 -19 02 22.4 +014-05.2 V-V 3-6 18 37 11.16 -19 02 20.2 2000 70.002.006 rad 18 37 11.16 -19 02 20.2 +014-05.2 V-V 3-6 18 34 14.7 -19 04 59. 1950 Ko,Ku (1999) 18 37 11.29 -19 02 23.4 +014-05.2 V-V 3-6 18 34 13.9 -19 04 58. 1950 IRAS18342-1904 18 37 10.49 -19 02 22.5 +009-08.1 * Y-C 47 18 34 22.01 -24 29 12.3 1950 40.134.038 18 37 25.82 -24 26 35.9 +009-08.1 * Y-C 47 18 34 22.2 -24 29 14. 1950 Ko,Ku (1999) 18 37 26.01 -24 26 37.6 +016-04.2 M 1-56 18 34 52. -17 08 25. 1950 CGPN/Mi 59 18 37 46.10 -17 05 46.8 +016-04.2 M 1-56 18 34 52.2 -17 08 25. 1950 CGPN/Koal 65 18 37 46.30 -17 05 46.8 +016-04.2 M 1-56 18 34 52.2 -17 08 25. 1950 18.133.025 18 37 46.30 -17 05 46.8 +016-04.2 M 1-56 18 34 52.2 -17 08 24. 1950 50.134.178 18 37 46.30 -17 05 45.8 +016-04.2 M 1-56 18 34 52.2 -17 08 25. 1950 70.002.006 18 37 46.30 -17 05 46.8 +016-04.2 M 1-56 18 37 46.38 -17 05 46.7 2000 70.002.006 rad 18 37 46.38 -17 05 46.7 +016-04.2 M 1-56 18 34 52.4 -17 08 25. 1950 IRAS18348-1708 18 37 46.50 -17 05 46.8 +028+01.1 M 2-44 18 34 59.6 -03 08 33. 1950 CGPN/Ko 65a * 18 37 36.98 -03 05 54.9 +028+01.1 M 2-44 18 34 59.5 -03 08 34. 1950 50.134.178 18 37 36.88 -03 05 55.9 +028+01.1 M 2-44 18 34 59.58 -03 08 33.4 1950 55.002.049 18 37 36.96 -03 05 55.3 +028+01.1 M 2-44 18 34 59.5 -03 08 34. 1950 70.002.006 18 37 36.88 -03 05 55.9 +028+01.1 M 2-44 18 37 36.83 -03 05 56.5 2000 70.002.006 rad 18 37 36.83 -03 05 56.5 +011-07.2 SB 18 18 38 43.3 -22 24 15.0 2000 71.134.030 18 38 43.3 -22 24 15.0 +011-07.2 SB 18 18 35 42.2 -22 26 57. 1950 Ko,Ku (1999) 18 38 43.20 -22 24 15.0 +004-11.1 M 3-29 18 36 13. -30 43 26. 1950 CGPN/Mi 59 18 39 25.92 -30 40 41.3 +004-11.1 M 3-29 18 36 12.9 -30 43 21. 1950 CGPN/Koal 65 18 39 25.82 -30 40 36.3 +004-11.1 M 3-29 18 36 12.9 -30 43 22. 1950 08.114.108 18 39 25.82 -30 40 37.3 +004-11.1 M 3-29 18 36 12.6 -30 43 20.9 1950 11.133.011 18 39 25.52 -30 40 36.2 +004-11.1 M 3-29 18 36 12.9 -30 43 30.9 1950 11.133.011 18 39 25.82 -30 40 46.2 +004-11.1 M 3-29 18 36 12.9 -30 43 21. 1950 18.133.025 18 39 25.82 -30 40 36.3 +004-11.1 M 3-29 18 36 12.9 -30 43 21. 1950 70.002.006 18 39 25.82 -30 40 36.3 +004-11.1 M 3-29 18 39 25.84 -30 40 37.7 2000 70.002.006 rad 18 39 25.84 -30 40 37.7 +004-11.1 M 3-29 18 36 13.7 -30 43 22. 1950 IRAS18362-3043 18 39 26.62 -30 40 37.3 +027+00.1 M 2-45 18 36 43. -04 22 36. 1950 CGPN/Mi 59 18 39 21.80 -04 19 50.4 +027+00.1 M 2-45 18 36 43.1 -04 22 36. 1950 CGPN/Ko 65a 18 39 21.90 -04 19 50.4 +027+00.1 M 2-45 18 36 43.0 -04 22 36. 1950 18.133.025 18 39 21.80 -04 19 50.4 +027+00.1 M 2-45 18 36 43.05 -04 22 37.2 1950 37.134.035 18 39 21.85 -04 19 51.6 +027+00.1 M 2-45 18 36 43.0 -04 22 37. 1950 50.134.178 18 39 21.80 -04 19 51.4 +027+00.1 M 2-45 18 36 43.04 -04 22 34.0 1950 52.002.040 18 39 21.84 -04 19 48.4 +027+00.1 M 2-45 18 36 43.23 -04 22 33.5 1950 55.002.049 18 39 22.03 -04 19 47.9 +027+00.1 M 2-45 18 36 43.1 -04 22 37. 1950 70.002.006 18 39 21.90 -04 19 51.4 +027+00.1 M 2-45 18 39 21.86 -04 19 52.5 2000 72.002.012 rad 18 39 21.86 -04 19 52.5 +027+00.1 M 2-45 18 36 42.8 -04 22 39. 1950 IRAS18367-0422 18 39 21.60 -04 19 53.4 +014-06.1 SB 19 18 39 39.9 -19 14 12.5 2000 71.134.030 18 39 39.9 -19 14 12.5 +014-06.1 SB 19 18 36 43.4 -19 17 00. 1950 Ko,Ku (1999) 18 39 40.21 -19 14 13.7 +014-06.1 SB 19 18 36 43.4 -19 16 59. 1950 IRAS18367-1916 18 39 40.21 -19 14 12.7 +011-07.1 * V 348 Sgr 18 40 19.9 -22 54 29.9 2000 71.134.030 * 18 40 19.9 -22 54 29.9 +011-07.1 * V 348 Sgr 18 37 18.4 -22 57 19. 1950 Ko,Ku (1999) 18 40 20.05 -22 54 30.0 +011-07.1 * V 348 Sgr 18 37 17.3 -22 57 20. 1950 IRAS18372-2257 18 40 18.95 -22 54 31.1 +022-02.1 M 1-57 18 37 34. -10 42 37. 1950 CGPN/Mi 59 18 40 20.21 -10 39 47.4 +022-02.1 M 1-57 18 37 34.0 -10 42 37. 1950 18.133.025 18 40 20.21 -10 39 47.4 +022-02.1 M 1-57 18 37 34.1 -10 42 37. 1950 50.134.178 18 40 20.31 -10 39 47.4 +022-02.1 M 1-57 18 37 34.1 -10 42 36. 1950 70.002.006 18 40 20.31 -10 39 46.4 +022-02.1 M 1-57 18 40 20.31 -10 39 48.6 2000 70.002.006 rad 18 40 20.31 -10 39 48.6 +022-02.1 M 1-57 18 37 34.0 -10 42 38. 1950 IRAS18375-1042 18 40 20.21 -10 39 48.4 +023-01.1 * K 3-9 18 37 40.3 -08 46 36. 1950 CGPN/Ko 65b 18 40 24.22 -08 43 46.1 +023-01.1 * K 3-9 18 37 40.3 -08 46 36. 1950 30.135.052 18 40 24.22 -08 43 46.1 +023-01.1 * K 3-9 18 37 40.27 -08 46 36.2 1950 52.002.003 18 40 24.19 -08 43 46.3 +023-01.1 * K 3-9 18 37 40.1 -08 46 38. 1950 IRAS18376-0846 18 40 24.02 -08 43 48.1 +017-04.1 M 3-30 18 38 23. -15 36 34. 1950 CGPN/Mi 59 18 41 15.14 -15 33 40.7 +017-04.1 M 3-30 18 38 22.9 -15 36 40. 1950 CGPN/Koal 65 18 41 15.04 -15 33 46.7 +017-04.1 M 3-30 18 38 23.0 -15 36 40. 1950 18.133.025 18 41 15.14 -15 33 46.7 +017-04.1 M 3-30 18 38 22.5 -15 36 34. 1950 50.134.178 18 41 14.64 -15 33 40.8 +017-04.1 M 3-30 18 38 22.7 -15 36 32. 1950 70.002.006 18 41 14.84 -15 33 38.7 +017-04.1 M 3-30 18 41 14.90 -15 33 44.2 2000 70.002.006 rad 18 41 14.90 -15 33 44.2 +017-04.1 M 3-30 18 38 23.3 -15 36 34. 1950 IRAS18383-1536 18 41 15.44 -15 33 40.7 +023-01.2 K 3-11 18 38 23.2 -08 58 51. 1950 CGPN/Ko 65b 18 41 07.36 -08 55 58.0 +023-01.2 K 3-11 18 38 23.6 -08 58 51. 1950 30.135.052 18 41 07.76 -08 55 58.0 +023-01.2 K 3-11 18 38 23.18 -08 58 52.2 1950 52.002.003 18 41 07.34 -08 55 59.2 +023-01.2 K 3-11 18 38 23.1 -08 58 52. 1950 70.002.006 18 41 07.26 -08 55 59.0 +023-01.2 K 3-11 18 41 07.23 -08 55 59.7 2000 70.002.006 rad 18 41 07.23 -08 55 59.7 +023-01.2 K 3-11 18 38 22.4 -08 58 55. 1950 IRAS18383-0858 18 41 06.56 -08 56 02.0 +020-03.1 * MaC 1-14 18 38 23.74 -13 14 37.2 1950 22.135.002 * 18 41 12.98 -13 11 44.0 +020-03.1 * MaC 1-14 18 38 24.1 -13 14 37. 1950 Ko,Ku (1999) 18 41 13.34 -13 11 43.7 +013-07.2 * Y-C 26 18 38 57.90 -20 35 14.2 1950 10.113.006 18 41 56.36 -20 32 18.2 +013-07.2 * Y-C 26 18 38 58.1 -20 35 16. 1950 Ko,Ku (1999) 18 41 56.56 -20 32 20.0 +025-00.1 Pe 1-14 18 39 26.5 -06 43 53. 1950 CGPN/Ko 65a 18 42 08.02 -06 40 55.5 +025-00.1 Pe 1-14 18 39 26.6 -06 43 53. 1950 70.002.006 18 42 08.12 -06 40 55.5 +025-00.1 Pe 1-14 18 42 07.90 -06 41 02.0 2000 70.002.006 rad 18 42 07.90 -06 41 02.0 +019-04.2 PN 1839-1418 18 39 34.4 -14 18 10. 1950 66.134.003 18 42 24.92 -14 15 11.7 +019-04.2 PN 1839-1418 18 42 24.8 -14 15 11. 2000 72.002.012 18 42 24.8 -14 15 11. +019-04.2 PN 1839-1418 18 39 34.30 -14 18 08.3 1950 72.002.012 rad 18 42 24.82 -14 15 10.0 +019-04.2 PN 1839-1418 18 39 34.4 -14 18 10. 1950 Ko,Ku (1999) 18 42 24.92 -14 15 11.7 +019-04.2 PN 1839-1418 18 39 34.0 -14 18 12. 1950 IRAS18395-1418 18 42 24.52 -14 15 13.7 +029+00.1 A 48 18 40 09.6 -03 16 13.4 1950 11.133.011 * 18 42 47.11 -03 13 13.0 +029+00.1 A 48 18 40 09.4 -03 16 17. 1950 70.002.006 18 42 46.91 -03 13 16.6 +029+00.1 A 48 18 42 46.95 -03 13 16.9 2000 70.002.006 rad 18 42 46.95 -03 13 16.9 +022-03.1 M 1-58 18 40 10. -11 09 53. 1950 CGPN/Mi 59 18 42 56.72 -11 06 52.2 +022-03.1 M 1-58 18 40 10.3 -11 09 54. 1950 18.133.025 18 42 57.02 -11 06 53.2 +022-03.1 M 1-58 18 40 10.3 -11 09 56. 1950 64.134.005 18 42 57.03 -11 06 55.2 +022-03.1 M 1-58 18 40 10.3 -11 09 54. 1950 70.002.006 18 42 57.02 -11 06 53.2 +022-03.1 M 1-58 18 42 56.99 -11 06 54.7 2000 70.002.006 rad 18 42 56.99 -11 06 54.7 +022-03.1 M 1-58 18 40 10.4 -11 09 56. 1950 IRAS18401-1109 18 42 57.13 -11 06 55.2 +031+01.1 PC 20 18 40 29.3 -00 19 37. 1950 CGPN/Ko 65a * 18 43 03.43 -00 16 35.3 +031+01.1 PC 20 18 40 29.3 -00 19 37. 1950 18.133.025 18 43 03.43 -00 16 35.3 +031+01.1 PC 20 18 40 29.61 -00 19 35.2 1950 55.002.049 18 43 03.74 -00 16 33.5 +031+01.1 PC 20 18 40 29.3 -00 19 40. 1950 70.002.006 18 43 03.43 -00 16 38.3 +031+01.1 PC 20 18 43 03.49 -00 16 36.7 2000 70.002.006 rad 18 43 03.49 -00 16 36.7 +031+01.1 PC 20 18 40 29.2 -00 19 37. 1950 IRAS18404-0019 18 43 03.33 -00 16 35.3 +023-02.1 M 1-59 18 40 36. -09 07 51. 1950 CGPN/Mi 59 18 43 20.31 -09 04 48.5 +023-02.1 M 1-59 18 40 35.9 -09 07 52. 1950 CGPN/Koal 65 18 43 20.21 -09 04 49.5 +023-02.1 M 1-59 18 40 35.3 -09 07 44. 1950 09.133.025 18 43 19.61 -09 04 41.5 +023-02.1 M 1-59 18 40 35.89 -09 07 51.6 1950 37.134.035 18 43 20.20 -09 04 49.1 +023-02.1 M 1-59 18 40 35.89 -09 07 51.6 1950 52.002.003 18 43 20.20 -09 04 49.1 +023-02.1 M 1-59 18 40 35.9 -09 07 52. 1950 70.002.006 18 43 20.21 -09 04 49.5 +023-02.1 M 1-59 18 43 20.20 -09 04 48.5 2000 70.002.006 rad 18 43 20.20 -09 04 48.5 +023-02.1 M 1-59 18 40 35.3 -09 07 53. 1950 IRAS18405-0907 18 43 19.61 -09 04 50.5 +019-04.1 M 1-60 18 40 48. -13 47 51. 1950 CGPN/Mi 59 18 43 37.88 -13 44 47.4 +019-04.1 M 1-60 18 40 48.0 -13 47 51. 1950 18.133.025 18 43 37.88 -13 44 47.4 +019-04.1 M 1-60 18 40 48.25 -13 47 52.3 1950 52.002.003 18 43 38.13 -13 44 48.7 +019-04.1 M 1-60 18 40 48.3 -13 47 52. 1950 70.002.006 18 43 38.18 -13 44 48.4 +019-04.1 M 1-60 18 43 38.18 -13 44 48.6 2000 70.002.006 rad 18 43 38.18 -13 44 48.6 +019-04.1 M 1-60 18 40 49.5 -13 47 53. 1950 IRAS18408-1347 18 43 39.38 -13 44 49.3 +004-11.2 He 2-418 18 41 02.4 -30 22 43. 1950 Wr (1966) * 18 44 14.64 -30 19 37.6 +004-11.2 He 2-418 18 41 01.2 -30 21 32. 1950 08.114.108 18 44 13.41 -30 18 26.7 +004-11.2 He 2-418 18 41 02.4 -30 22 41. 1950 70.002.006 18 44 14.64 -30 19 35.6 +004-11.2 He 2-418 18 44 14.22 -30 19 40.8 2000 70.002.006 rad 18 44 14.22 -30 19 40.8 +004-11.2 He 2-418 18 41 02.6 -30 22 43. 1950 Ko,Ku (1999) 18 44 14.84 -30 19 37.6 +014-07.1 M 3-31 18 41 04.2 -19 57 57. 1950 50.134.178 18 44 01.81 -19 54 52.0 +014-07.1 M 3-31 18 41 04.2 -19 57 58. 1950 70.002.006 18 44 01.81 -19 54 53.0 +014-07.1 M 3-31 18 41 02.8 -19 58 01. 1950 IRAS18410-1958 18 44 00.41 -19 54 56.1 +035+03.1 PN 1841+0343 18 41 07.2 +03 43 37.1 1950 66.134.003 18 43 36.67 +03 46 41.4 +035+03.1 PN 1841+0343 18 41 07.22 +03 43 38.1 1950 72.002.012 rad 18 43 36.69 +03 46 42.4 +035+03.1 PN 1841+0343 18 43 36.7 +03 46 42. 2000 72.002.012 18 43 36.7 +03 46 42. +035+03.1 PN 1841+0343 18 41 07.3 +03 43 34. 1950 Ko,Ku (1999) 18 43 36.78 +03 46 38.3 +035+03.1 PN 1841+0343 18 41 07.0 +03 43 35. 1950 IRAS18411+0343 18 43 36.48 +03 46 39.2 +021-03.1 We 1-7 18 41 19.4 -12 16 04. 1950 20.135.021 * 18 44 07.43 -12 12 58.2 +021-03.1 We 1-7 18 41 18.5 -12 15 56. 1950 70.002.006 18 44 06.53 -12 12 50.3 +021-03.1 We 1-7 18 44 06.16 -12 12 58.2 2000 70.002.006 rad 18 44 06.16 -12 12 58.2 +021-03.1 We 1-7 18 41 18.2 -12 16 02. 1950 IRAS18413-1216 18 44 06.23 -12 12 56.3 +009-09.1 M 3-32 18 41 38.2 -25 24 42. 1950 50.134.178 18 44 43.13 -25 21 34.3 +009-09.1 M 3-32 18 41 38.3 -25 24 41. 1950 70.002.006 18 44 43.23 -25 21 33.3 +009-09.1 M 3-32 18 44 43.13 -25 21 33.8 2000 70.002.006 rad 18 44 43.13 -25 21 33.8 +009-09.1 M 3-32 18 41 38.3 -25 24 42. 1950 IRAS18416-2524 18 44 43.23 -25 21 34.3 +029-00.1 ToDo 5 18 42 15.8 -03 23 43. 1950 45.141.014 18 44 53.45 -03 20 33.5 +029-00.1 ToDo 5 18 42 15.9 -03 23 43. 1950 Ko,Ku (1999) 18 44 53.55 -03 20 33.5 +037+04.1 * K 3-12 18 42 19.3 +06 03 56. 1950 CGPN/Ko 65b 18 44 46.08 +06 07 05.3 +037+04.1 * K 3-12 18 42 18.7 +06 03 56. 1950 30.135.052 18 44 45.48 +06 07 05.3 +002-13.1 IC 4776 18 42 33.7 -33 23 45. 1950 08.114.108 18 45 50.68 -33 20 32.9 +002-13.1 IC 4776 18 42 34.1 -33 23 52. 1950 09.133.025 18 45 51.08 -33 20 39.8 +002-13.1 IC 4776 18 42 33.72 -33 23 45.4 1950 10.113.006 18 45 50.70 -33 20 33.3 +002-13.1 IC 4776 18 42 33.76 -33 23 46.0 1950 37.134.035 18 45 50.74 -33 20 33.9 +002-13.1 IC 4776 18 42 33.7 -33 23 47. 1950 70.002.006 18 45 50.68 -33 20 34.9 +002-13.1 IC 4776 18 45 50.80 -33 20 34.2 2000 70.002.006 rad 18 45 50.80 -33 20 34.2 +002-13.1 IC 4776 18 42 33.6 -33 23 48. 1950 IRAS18425-3323 18 45 50.58 -33 20 35.9 +013-07.1 PC 21 18 42 36.85 -20 38 10.5 1950 10.113.006 18 45 35.30 -20 34 58.8 +013-07.1 PC 21 18 42 36.8 -20 38 11. 1950 70.002.006 18 45 35.25 -20 34 59.3 +013-07.1 PC 21 18 45 35.19 -20 34 58.4 2000 70.002.006 rad 18 45 35.19 -20 34 58.4 +013-07.1 PC 21 18 42 36.7 -20 38 13. 1950 IRAS18426-2038 18 45 35.15 -20 35 01.3 +026-01.2 Pe 2-15 18 42 45.8 -07 00 10. 1950 CGPN/Koal 65 18 45 27.61 -06 56 58.2 +026-01.2 Pe 2-15 18 42 45.4 -07 00 01. 1950 30.135.052 18 45 27.20 -06 56 49.3 +026-01.2 Pe 2-15 18 42 45.77 -07 00 09.6 1950 52.002.003 18 45 27.58 -06 56 57.9 +026-01.2 Pe 2-15 18 42 45.8 -07 00 10. 1950 70.002.006 18 45 27.61 -06 56 58.2 +026-01.2 Pe 2-15 18 45 27.47 -06 56 59.7 2000 70.002.006 rad 18 45 27.47 -06 56 59.7 +034+02.1 K 3-13 18 42 53.0 +01 58 15. 1950 CGPN/Ko 65b 18 45 24.50 +02 01 26.9 +034+02.1 K 3-13 18 42 53.0 +01 58 15. 1950 09.133.025 18 45 24.50 +02 01 26.9 +034+02.1 K 3-13 18 42 53.06 +01 58 11.4 1950 52.002.003 18 45 24.56 +02 01 23.3 +034+02.1 K 3-13 18 42 53.1 +01 58 11. 1950 70.002.006 18 45 24.60 +02 01 22.9 +034+02.1 K 3-13 18 45 24.66 +02 01 22.7 2000 70.002.006 rad 18 45 24.66 +02 01 22.7 +034+02.1 K 3-13 18 42 52.7 +01 58 12. 1950 IRAS18428+0158 18 45 24.20 +02 01 23.9 +026-01.1 K 4-5 18 42 54.1 -06 21 46. 1950 CGPN/Ko 65b * 18 45 35.16 -06 18 33.7 +026-01.1 K 4-5 18 42 54.1 -06 21 42. 1950 30.135.052 18 45 35.16 -06 18 29.7 +026-01.1 K 4-5 18 42 55.2 -06 21 55. 1950 70.002.006 18 45 36.27 -06 18 42.6 +026-01.1 K 4-5 18 45 36.60 -06 18 34.5 2000 70.002.006 rad 18 45 36.60 -06 18 34.5 +026-01.1 K 4-5 18 42 54.0 -06 21 50. 1950 Ko,Ku (1999) 18 45 35.07 -06 18 37.7 +019-05.1 M 1-61 18 43 04. -14 30 52. 1950 CGPN/Mi 59 18 45 54.72 -14 27 38.6 +019-05.1 M 1-61 18 43 03.6 -14 31 01. 1950 30.135.052 18 45 54.33 -14 27 47.7 +019-05.1 M 1-61 18 43 04.40 -14 30 51.1 1950 52.002.003 18 45 55.12 -14 27 37.7 +019-05.1 M 1-61 18 43 04.3 -14 30 52. 1950 70.002.006 18 45 55.02 -14 27 38.6 +019-05.1 M 1-61 18 45 55.10 -14 27 39.0 2000 70.002.006 rad 18 45 55.10 -14 27 39.0 +019-05.1 M 1-61 18 43 05.0 -14 30 51. 1950 IRAS18430-1430 18 45 55.72 -14 27 37.6 +011-09.1 H 2-48 18 43 32.9 -23 30 05. 1950 CGPN/Koal 65 18 46 35.14 -23 26 49.2 +011-09.1 H 2-48 18 43 32.9 -23 30 04. 1950 31.116.001 18 46 35.14 -23 26 48.2 +011-09.1 H 2-48 18 43 32.9 -23 30 03. 1950 50.134.178 18 46 35.14 -23 26 47.2 +011-09.1 H 2-48 18 43 32.86 -23 30 05.8 1950 54.134.034 18 46 35.10 -23 26 50.0 +011-09.1 H 2-48 18 43 32.9 -23 30 03. 1950 70.002.006 18 46 35.14 -23 26 47.2 +011-09.1 H 2-48 18 46 35.29 -23 26 48.9 2000 70.002.006 rad 18 46 35.29 -23 26 48.9 +011-09.1 H 2-48 18 43 32.6 -23 30 07. 1950 IRAS18435-2330 18 46 34.84 -23 26 51.2 +025-02.1 Pe 1-15 18 43 42.5 -07 17 51. 1950 CGPN/Koal 65 18 46 24.64 -07 14 35.2 +025-02.1 Pe 1-15 18 43 42.1 -07 18 04.5 1950 11.133.011 18 46 24.25 -07 14 48.7 +025-02.1 Pe 1-15 18 43 42.45 -07 17 50.6 1950 37.134.035 18 46 24.59 -07 14 34.8 +025-02.1 Pe 1-15 18 43 42.47 -07 17 49.9 1950 52.002.003 18 46 24.61 -07 14 34.1 +025-02.1 Pe 1-15 18 43 42.5 -07 17 50. 1950 70.002.006 18 46 24.64 -07 14 34.2 +025-02.1 Pe 1-15 18 46 24.59 -07 14 36.5 2000 70.002.006 rad 18 46 24.59 -07 14 36.5 +025-02.1 Pe 1-15 18 43 41.9 -07 17 47. 1950 IRAS18436-0717 18 46 24.04 -07 14 31.2 +024-02.1 M 2-46 18 43 51. -08 31 18. 1950 CGPN/Mi 59 * 18 46 34.57 -08 28 01.5 +024-02.1 M 2-46 18 43 51.0 -08 31 18. 1950 CGPN/Koal 65 18 46 34.57 -08 28 01.5 +024-02.1 M 2-46 18 43 51.0 -08 31 18. 1950 50.134.178 18 46 34.57 -08 28 01.5 +024-02.1 M 2-46 18 43 51.0 -08 31 18. 1950 70.002.006 18 46 34.57 -08 28 01.5 +024-02.1 M 2-46 18 46 34.58 -08 28 01.2 2000 70.002.006 rad 18 46 34.58 -08 28 01.2 +022-04.1 * IRAS18442-1144 18 44 16.8 -11 44 30. 1950 Ko,Ku (1999) * 18 47 04.16 -11 41 11.5 +022-04.1 * IRAS18442-1144 18 44 16.4 -11 44 31. 1950 IRAS18442-1144 18 47 03.76 -11 41 12.6 +026-02.1 Pe 1-16 18 44 50.6 -06 57 24. 1950 CGPN/Koal 65 18 47 32.34 -06 54 03.3 +026-02.1 Pe 1-16 18 44 50.6 -06 57 17. 1950 09.133.025 18 47 32.34 -06 53 56.3 +026-02.1 Pe 1-16 18 44 50.5 -06 57 27. 1950 70.002.006 18 47 32.24 -06 54 06.3 +026-02.1 Pe 1-16 18 47 32.21 -06 54 04.3 2000 70.002.006 rad 18 47 32.21 -06 54 04.3 +026-02.1 Pe 1-16 18 44 51.6 -06 57 25. 1950 IRAS18448-0657 18 47 33.34 -06 54 04.3 +024-03.1 Pe 1-17 18 45 04.4 -09 12 30. 1950 CGPN/Koal 65 18 47 48.76 -09 09 08.3 +024-03.1 Pe 1-17 18 45 04.4 -09 12 28. 1950 50.134.178 18 47 48.76 -09 09 06.3 +024-03.1 Pe 1-17 18 45 04.4 -09 12 29. 1950 70.002.006 18 47 48.76 -09 09 07.3 +024-03.1 Pe 1-17 18 47 48.90 -09 09 07.4 2000 70.002.006 rad 18 47 48.90 -09 09 07.4 +024-03.1 Pe 1-17 18 45 03.8 -09 12 28. 1950 IRAS18450-0912 18 47 48.16 -09 09 06.3 +009-10.1 M 3-33 18 45 07.4 -25 32 17. 1950 Wr (1966) 18 48 12.41 -25 28 54.3 +009-10.1 M 3-33 18 45 07.2 -25 32 15. 1950 50.134.178 18 48 12.21 -25 28 52.3 +009-10.1 M 3-33 18 45 07.2 -25 32 15. 1950 70.002.006 18 48 12.21 -25 28 52.3 +009-10.1 M 3-33 18 48 12.26 -25 28 53.9 2000 70.002.006 rad 18 48 12.26 -25 28 53.9 +009-10.1 M 3-33 18 45 07.6 -25 32 19. 1950 IRAS18451-2532 18 48 12.61 -25 28 56.3 +016-07.1 SB 21 18 48 11.4 -18 29 39.8 2000 71.134.030 * 18 48 11.4 -18 29 39.8 +016-07.1 SB 21 18 45 15.4 -18 33 00. 1950 Ko,Ku (1999) 18 48 11.11 -18 29 37.1 +016-07.2 SB 22 18 48 30.5 -17 43 56.5 2000 71.134.030 * 18 48 30.5 -17 43 56.5 +016-07.2 SB 22 18 45 35.8 -17 47 20. 1950 Ko,Ku (1999) 18 48 30.54 -17 43 55.6 +027-02.1 Pe 1-18 18 46 06.9 -05 59 19. 1950 CGPN/Koal 65 * 18 48 47.51 -05 55 52.9 +027-02.1 Pe 1-18 18 46 05.8 -05 59 33. 1950 50.134.178 18 48 46.41 -05 56 07.0 +027-02.1 Pe 1-18 18 46 05.9 -05 59 36. 1950 70.002.006 18 48 46.51 -05 56 10.0 +027-02.1 Pe 1-18 18 48 46.68 -05 56 05.7 2000 70.002.006 rad 18 48 46.68 -05 56 05.7 +027-02.1 Pe 1-18 18 46 06.2 -05 59 34. 1950 IRAS18461-0559 18 48 46.81 -05 56 08.0 +042+05.1 K 3-14 18 46 11.2 +10 32 27. 1950 CGPN/Ko 65b 18 48 32.78 +10 35 52.7 +042+05.1 K 3-14 18 46 11.4 +10 32 38. 1950 30.135.052 18 48 32.98 +10 36 03.7 +042+05.1 K 3-14 18 46 11.22 +10 32 25.2 1950 52.002.003 18 48 32.80 +10 35 50.9 +042+05.1 K 3-14 18 46 11.3 +10 32 25. 1950 70.002.006 18 48 32.88 +10 35 50.7 +042+05.1 K 3-14 18 46 11.1 +10 32 23. 1950 IRAS18461+1032 18 48 32.68 +10 35 48.7 +014-08.1 SB 20 18 49 24.3 -19 52 15.6 2000 71.134.030 18 49 24.3 -19 52 15.6 +014-08.1 SB 20 18 46 26.8 -19 55 42. 1950 Ko,Ku (1999) 18 49 24.24 -19 52 13.9 +026-02.3 Pe 1-19 18 47 02.8 -07 05 06. 1950 CGPN/Koal 65 18 49 44.67 -07 01 35.9 +026-02.3 Pe 1-19 18 47 02.5 -07 05 10. 1950 50.134.178 18 49 44.37 -07 01 39.9 +026-02.3 Pe 1-19 18 47 03.0 -07 05 06. 1950 70.002.006 18 49 44.87 -07 01 35.9 +026-02.3 Pe 1-19 18 49 44.93 -07 01 30.4 2000 70.002.006 rad 18 49 44.93 -07 01 30.4 +026-02.3 Pe 1-19 18 47 03.5 -07 05 07. 1950 IRAS18470-0705 18 49 45.37 -07 01 36.8 +017-07.1 SB 23 18 50 13.7 -17 02 27.6 2000 71.134.030 18 50 13.7 -17 02 27.6 +017-07.1 SB 23 18 47 19.5 -17 05 54. 1950 Ko,Ku (1999) 18 50 13.34 -17 02 22.3 +012-09.1 M 1-62 18 47 25. -22 37 58. 1950 CGPN/Mi 59 18 50 25.97 -22 34 25.6 +012-09.1 M 1-62 18 47 25.0 -22 37 56. 1950 CGPN/Koal 65 18 50 25.97 -22 34 23.6 +012-09.1 M 1-62 18 47 25.08 -22 37 54.1 1950 10.113.006 18 50 26.05 -22 34 21.7 +012-09.1 M 1-62 18 47 25.07 -22 37 55.8 1950 54.134.034 18 50 26.04 -22 34 23.4 +012-09.1 M 1-62 18 47 25.0 -22 37 55. 1950 70.002.006 18 50 25.97 -22 34 22.6 +012-09.1 M 1-62 18 50 26.26 -22 34 22.2 2000 70.002.006 rad 18 50 26.26 -22 34 22.2 +012-09.1 M 1-62 18 47 25.7 -22 37 54. 1950 IRAS18474-2237 18 50 26.67 -22 34 21.6 +028-02.1 * SP 2-149 18 47 29. -05 18 30. 1950 18.133.034 * 18 50 08.82 -05 14 58.1 +028-02.1 * SP 2-149 18 47 29.3 -05 18 36. 1950 Ko,Ku (1999) 18 50 09.12 -05 15 04.1 +051+09.1 Hu 2-1 18 47 38.5 +20 47 08. 1950 CGPN/Fc 62 18 49 47.45 +20 50 39.5 +051+09.1 Hu 2-1 18 47 38.3 +20 46 56. 1950 CGPN/Koal 65 18 49 47.26 +20 50 27.5 +051+09.1 Hu 2-1 18 47 39.2 +20 47 12. 1950 09.133.025 18 49 48.15 +20 50 43.5 +051+09.1 Hu 2-1 18 47 38.60 +20 47 08.1 1950 37.134.035 18 49 47.55 +20 50 39.6 +051+09.1 Hu 2-1 18 47 38.60 +20 47 07.9 1950 52.002.003 18 49 47.55 +20 50 39.4 +051+09.1 Hu 2-1 18 47 38.6 +20 47 08. 1950 70.002.006 18 49 47.55 +20 50 39.5 +051+09.1 Hu 2-1 18 49 47.52 +20 50 39.8 2000 70.002.006 rad 18 49 47.52 +20 50 39.8 +051+09.1 Hu 2-1 18 49 47.58 +20 50 40.0 2000 AC 0769055 18 49 47.58 +20 50 40.0 +051+09.1 Hu 2-1 18 49 47.56 +20 50 39.5 2000 HIP 092400 18 49 47.56 +20 50 39.5 +051+09.1 Hu 2-1 18 47 38.4 +20 47 05. 1950 IRAS18476+2047 18 49 47.36 +20 50 36.5 +031-00.2 HtTr 10 18 47 49.1 -01 43 43. 1950 34.134.052 18 50 24.82 -01 40 09.8 +031-00.2 HtTr 10 18 47 48.8 -01 43 51. 1950 70.002.006 18 50 24.52 -01 40 17.8 +020-05.1 Sa 1-8 18 47 54.6 -13 34 40. 1950 11.133.012 18 50 44.11 -13 31 05.9 +020-05.1 Sa 1-8 18 47 54.80 -13 34 36.4 1950 52.002.003 18 50 44.31 -13 31 02.3 +020-05.1 Sa 1-8 18 47 54.9 -13 34 36. 1950 70.002.006 18 50 44.41 -13 31 01.9 +020-05.1 Sa 1-8 18 50 44.40 -13 31 01.7 2000 70.002.006 rad 18 50 44.40 -13 31 01.7 +020-05.1 Sa 1-8 18 47 54.7 -13 34 38. 1950 IRAS18479-1334 18 50 44.21 -13 31 03.9 +031-00.1 WeSb 4 18 48 05.2 -01 06 48. 1950 30.135.002 18 50 40.22 -01 03 13.7 +031-00.1 WeSb 4 18 48 05.2 -01 06 45. 1950 70.002.006 18 50 40.22 -01 03 10.7 +031-00.1 WeSb 4 18 48 05.4 -01 06 46. 1950 Ko,Ku (1999) 18 50 40.42 -01 03 11.7 +064+15.1 M 1-64 18 48 14.0 +35 11 02. 1950 02.133.027 * 18 50 01.71 +35 14 35.2 +064+15.1 M 1-64 18 48 14.4 +35 11 02. 1950 50.134.178 18 50 02.11 +35 14 35.3 +064+15.1 M 1-64 18 48 14.5 +35 11 02. 1950 70.002.006 18 50 02.21 +35 14 35.3 +064+15.1 M 1-64 18 50 01.10 +35 14 29.3 2000 70.002.006 rad 18 50 01.10 +35 14 29.3 +064+15.1 M 1-64 18 48 14.8 +35 10 55. 1950 IRAS18482+3510 18 50 02.51 +35 14 28.3 +044+05.2 CTSS 2 18 48 25. +12 33 00. 1950 52.134.045 * 18 50 44.22 +12 36 35.2 +044+05.2 CTSS 2 18 48 27.7 +12 33 55. 1950 70.002.006 18 50 46.90 +12 37 30.3 +044+05.2 CTSS 2 18 48 27.8 +12 33 54. 1950 Ko,Ku (1999) 18 50 47.00 +12 37 29.3 +021-05.1 M 1-63 18 48 42. -13 14 14. 1950 CGPN/Mi 59 18 51 31.09 -13 10 36.6 +021-05.1 M 1-63 18 48 41.6 -13 14 14. 1950 18.133.025 18 51 30.69 -13 10 36.6 +021-05.1 M 1-63 18 48 41.9 -13 14 15. 1950 70.002.006 18 51 30.99 -13 10 37.6 +021-05.1 M 1-63 18 51 30.89 -13 10 38.2 2000 70.002.006 rad 18 51 30.89 -13 10 38.2 +021-05.1 M 1-63 18 48 41.5 -13 14 16. 1950 IRAS18486-1314 18 51 30.59 -13 10 38.6 +041+04.1 K 3-15 18 49 19.2 +09 51 13. 1950 CGPN/Ko 65b 18 51 41.62 +09 54 52.1 +041+04.1 K 3-15 18 49 19.0 +09 51 13. 1950 30.135.052 18 51 41.42 +09 54 52.1 +041+04.1 K 3-15 18 49 19.11 +09 51 13.3 1950 52.002.003 18 51 41.53 +09 54 52.4 +041+04.1 K 3-15 18 49 19.1 +09 51 15. 1950 70.002.006 18 51 41.52 +09 54 54.1 +041+04.1 K 3-15 18 49 20.4 +09 51 18. 1950 IRAS18493+0951 18 51 42.82 +09 54 57.2 +044+05.1 K 3-16 18 50 41.9 +12 12 17. 1950 CGPN/Ko 65b 18 53 01.56 +12 16 01.9 +044+05.1 K 3-16 18 50 42.0 +12 12 17. 1950 18.133.025 18 53 01.66 +12 16 01.9 +044+05.1 K 3-16 18 50 42.00 +12 12 17.0 1950 52.002.003 18 53 01.66 +12 16 01.9 +044+05.1 K 3-16 18 50 41.9 +12 12 16. 1950 70.002.006 18 53 01.56 +12 16 00.9 +044+05.1 K 3-16 18 53 01.62 +12 16 02.4 2000 70.002.006 rad 18 53 01.62 +12 16 02.4 +027-03.1 A 49 18 50 47.4 -06 32 21. 1950 70.002.006 18 53 28.61 -06 28 34.9 +027-03.1 A 49 18 50 47.2 -06 32 30. 1950 Ko,Ku (1999) 18 53 28.41 -06 28 44.0 +027-03.2 Vy 1-4 18 51 20.8 -06 30 07. 1950 CGPN/Koal 65 18 54 01.96 -06 26 18.6 +027-03.2 Vy 1-4 18 51 20.6 -06 30 07. 1950 30.135.052 18 54 01.76 -06 26 18.6 +027-03.2 Vy 1-4 18 51 20.75 -06 30 08.7 1950 52.002.003 18 54 01.91 -06 26 20.3 +027-03.2 Vy 1-4 18 51 20.8 -06 30 09. 1950 70.002.006 18 54 01.96 -06 26 20.6 +027-03.2 Vy 1-4 18 54 01.87 -02 26 21.7 2000 70.002.006 rad 18 54 01.87 -02 26 21.7 +027-03.2 Vy 1-4 18 51 19.9 -06 30 11. 1950 IRAS18513-0630 18 54 01.06 -06 26 22.6 +029-02.1 * Pe 2-16 18 51 30.9 -04 42 41. 1950 CGPN/Koal 65 18 54 10.01 -04 38 51.9 +029-02.1 * Pe 2-16 18 51 31.0 -04 42 41. 1950 18.133.025 18 54 10.11 -04 38 51.9 +029-02.1 * Pe 2-16 18 51 30.3 -04 42 37. 1950 30.135.052 18 54 09.41 -04 38 48.0 +029-02.1 * Pe 2-16 18 51 30.95 -04 42 40.1 1950 51.117.039 18 54 10.06 -04 38 51.0 +024-05.1 M 4-11 18 51 32.5 -10 09 02. 1950 CGPN/Koal 65 18 54 17.89 -10 05 12.6 +024-05.1 M 4-11 18 51 32.3 -10 08 59. 1950 70.002.006 18 54 17.69 -10 05 09.6 +024-05.1 M 4-11 18 54 17.73 -10 05 11.6 2000 70.002.006 rad 18 54 17.73 -10 05 11.6 +024-05.1 M 4-11 18 51 32.3 -10 09 02. 1950 IRAS18515-1009 18 54 17.69 -10 05 12.6 +032-00.1 CBSS 2 18 54 06.7 -00 20 02. 2000 61.132.046 18 54 06.7 -00 20 02. +032-00.1 CBSS 2 18 51 32.7 -00 23 54. 1950 Ko,Ku (1999) 18 54 06.90 -00 20 05.0 +025-04.1 K 4-8 18 51 36.1 -08 51 22. 1950 CGPN/Ko 65b * 18 54 19.98 -08 47 32.4 +025-04.1 K 4-8 18 51 36.1 -08 57 22. 1950 30.135.052 18 54 20.10 -08 53 32.4 +025-04.1 K 4-8 18 51 36.1 -08 51 23. 1950 70.002.006 18 54 19.98 -08 47 33.4 +025-04.1 K 4-8 18 54 20.45 -08 47 32.0 2000 70.002.006 rad 18 54 20.45 -08 47 32.0 +025-04.1 K 4-8 18 51 35.6 -08 51 26. 1950 Ko,Ku (1999) 18 54 19.48 -08 47 36.4 +058+12.1 * K 4-9 18 51 42.6 +28 28 27. 1950 CGPN/Ko 65b 18 53 41.05 +28 32 15.5 +058+12.1 * K 4-9 18 51 42.1 +28 28 27. 1950 30.135.052 18 53 40.55 +28 32 15.4 +063+13.1 NGC 6720 18 49 52.07 +32 54 14.5 1900 CGPN/Lo 11 18 53 35.01 +33 01 43.1 +063+13.1 NGC 6720 18 50 56.2 +32 56 23.0 1929 CGPN/Sr 30 18 53 34.53 +33 01 44.7 +063+13.1 NGC 6720 18 51 44.2 +32 57 52. 1950 CGPN/Koal 65 18 53 35.74 +33 01 40.3 +063+13.1 NGC 6720 18 51 43.7 +32 57 56. 1950 70.002.006 18 53 35.24 +33 01 44.3 +063+13.1 NGC 6720 18 53 35.08 +33 01 45.1 2000 70.002.006 rad 18 53 35.08 +33 01 45.1 +063+13.1 NGC 6720 18 51 43.7 +32 57 56. 1950 IRAS18517+3257 18 53 35.24 +33 01 44.3 +025-04.2 IC 1295 18 49 23.85 -08 51 36.6 1900 CGPN/Bs 11 * 18 54 51.42 -08 44 04.5 +025-04.2 IC 1295 18 51 52.6 -08 53 40. 1950 CGPN/Koal 65 18 54 36.52 -08 49 49.2 +025-04.2 IC 1295 18 51 53.5 -08 54 28. 1950 09.133.025 18 54 37.44 -08 50 37.2 +025-04.2 IC 1295 18 51 52.8 -08 53 29. 1950 50.134.178 18 54 36.72 -08 49 38.2 +025-04.2 IC 1295 18 51 53.3 -08 53 24. 1950 70.002.006 18 54 37.22 -08 49 33.2 +025-04.2 IC 1295 18 54 37.29 -08 49 43.3 2000 70.002.006 rad 18 54 37.29 -08 49 43.3 +025-04.2 IC 1295 18 51 54.3 -08 53 29. 1950 IRAS18519-0853 18 54 38.22 -08 49 38.1 +003-14.1 Hb 7 18 52 23.0 -32 19 43. 1950 08.114.108 18 55 37.85 -32 15 49.0 +003-14.1 Hb 7 18 52 22.95 -32 19 32.9 1950 10.113.006 18 55 37.80 -32 15 38.9 +003-14.1 Hb 7 18 52 23.8 -32 19 49. 1950 18.133.025 18 55 38.66 -32 15 54.9 +003-14.1 Hb 7 18 52 22.9 -32 19 42. 1950 70.002.006 18 55 37.75 -32 15 48.0 +003-14.1 Hb 7 18 55 37.91 -32 15 48.2 2000 70.002.006 rad 18 55 37.91 -32 15 48.2 +003-14.1 Hb 7 18 52 23.3 -32 19 42. 1950 IRAS18523-3219 18 55 38.15 -32 15 47.9 +038+02.1 YM 16 18 52 29.9 +05 58 48. 1950 18.133.025 18 54 56.84 +06 02 40.8 +038+02.1 YM 16 18 52 29.9 +05 58 48. 1950 70.002.006 18 54 56.84 +06 02 40.8 +013-10.1 Y-C 32 18 52 30.79 -21 53 33.2 1950 10.113.006 18 55 30.64 -21 49 39.1 +013-10.1 Y-C 32 18 52 30.9 -21 53 34. 1950 70.002.006 18 55 30.75 -21 49 39.9 +013-10.1 Y-C 32 18 55 30.40 -21 49 39.6 2000 70.002.006 rad 18 55 30.40 -21 49 39.6 +013-10.1 Y-C 32 18 52 31.0 -21 53 34. 1950 Ko,Ku (1999) 18 55 30.85 -21 49 39.9 +013-10.1 Y-C 32 18 52 30.0 -21 53 38. 1950 IRAS18525-2153 18 55 29.85 -21 49 44.0 +032-01.1 CBSS 1 18 56 15.7 -01 33 56. 2000 61.132.046 18 56 15.7 -01 33 56. +032-01.1 CBSS 1 18 53 40.2 -01 38 00. 1950 Ko,Ku (1999) 18 56 15.80 -01 34 01.9 +039+02.1 K 3-17 18 53 52.5 +07 03 30. 1950 CGPN/Ko 65b 18 56 18.21 +07 07 28.6 +039+02.1 K 3-17 18 53 52.5 +07 03 24. 1950 09.133.025 18 56 18.21 +07 07 22.6 +039+02.1 K 3-17 18 53 52.4 +07 03 27.0 1950 11.133.011 18 56 18.11 +07 07 25.6 +039+02.1 K 3-17 18 53 52.4 +07 03 27. 1950 50.134.178 18 56 18.11 +07 07 25.6 +039+02.1 K 3-17 18 53 52.4 +07 03 27. 1950 65.134.076 18 56 18.11 +07 07 25.6 +039+02.1 K 3-17 18 53 52.5 +07 03 29. 1950 70.002.006 18 56 18.21 +07 07 27.6 +039+02.1 K 3-17 18 56 18.18 +07 07 26.2 2000 70.002.006 rad 18 56 18.18 +07 07 26.2 +039+02.1 K 3-17 18 53 52.4 +07 03 26. 1950 IRAS18538+0703 18 56 18.11 +07 07 24.6 +043+03.1 M 1-65 18 54 11. +10 48 24. 1950 CGPN/Mi 59 18 56 32.36 +10 52 23.8 +043+03.1 M 1-65 18 54 11.9 +10 48 14. 1950 18.133.025 18 56 33.26 +10 52 13.8 +043+03.1 M 1-65 18 54 12.3 +10 48 10. 1950 50.134.178 18 56 33.66 +10 52 09.9 +043+03.1 M 1-65 18 54 12.2 +10 48 12. 1950 70.002.006 18 56 33.56 +10 52 11.9 +043+03.1 M 1-65 18 56 33.68 +10 52 08.9 2000 70.002.006 rad 18 56 33.68 +10 52 08.9 +043+03.1 M 1-65 18 54 12.0 +10 48 07. 1950 IRAS18541+1048 18 56 33.37 +10 52 06.9 +017-09.1 SB 24 18 57 16.6 -17 50 49.1 2000 71.134.030 18 57 16.6 -17 50 49.1 +017-09.1 SB 24 18 54 22.0 -17 54 51. 1950 Ko,Ku (1999) 18 57 16.70 -17 50 49.3 +019-08.1 * MaC 1-15 18 54 22.09 -15 33 17.0 1950 22.135.002 18 57 13.88 -15 29 15.3 +019-08.1 * MaC 1-15 18 54 22.3 -15 33 16. 1950 Ko,Ku (1999) 18 57 14.09 -15 29 14.3 +028-04.1 Pe 1-20 18 54 36.8 -06 03 53. 1950 CGPN/Koal 65 * 18 57 17.43 -05 59 50.7 +028-04.1 Pe 1-20 18 54 36.8 -06 04 06.5 1950 11.133.011 18 57 17.44 -06 00 04.2 +028-04.1 Pe 1-20 18 54 36.6 -06 03 43. 1950 18.133.025 18 57 17.23 -05 59 40.7 +028-04.1 Pe 1-20 18 54 36.8 -06 03 54. 1950 70.002.006 18 57 17.43 -05 59 51.7 +028-04.1 Pe 1-20 18 57 17.29 -05 59 53.5 2000 70.002.006 rad 18 57 17.29 -05 59 53.5 +028-04.1 Pe 1-20 18 54 36.1 -06 04 02. 1950 IRAS18546-0604 18 57 16.74 -05 59 59.8 +028-03.1 Pe 1-21 18 55 09.7 -05 31 44. 1950 CGPN/Koal 65 18 57 49.72 -05 27 39.4 +028-03.1 Pe 1-21 18 55 09.8 -05 31 41. 1950 70.002.006 18 57 49.82 -05 27 36.4 +028-03.1 Pe 1-21 18 57 49.53 -05 27 41.8 2000 70.002.006 rad 18 57 49.53 -05 27 41.8 +028-03.1 Pe 1-21 18 55 09.1 -05 31 47. 1950 IRAS18551-0531 18 57 49.12 -05 27 42.4 +035-00.1 * Ap 2-1 18 55 38.4 +01 32 54. 1950 CGPN/Ko 65a 18 58 10.39 +01 37 00.3 +035-00.1 * Ap 2-1 18 55 38.5 +01 33 00.0 1950 11.133.011 18 58 10.49 +01 37 06.4 +035-00.1 * Ap 2-1 18 55 37.9 +01 32 54.0 1950 11.133.011 18 58 09.89 +01 37 00.3 +035-00.1 * Ap 2-1 18 55 38.4 +01 32 54. 1950 18.133.025 18 58 10.39 +01 37 00.3 +035-00.1 * Ap 2-1 18 55 39.11 +01 32 54.7 1950 55.002.049 18 58 11.10 +01 37 01.1 +035-00.1 * Ap 2-1 18 55 38.5 +01 32 52. 1950 70.002.006 18 58 10.49 +01 36 58.4 +035-00.1 * Ap 2-1 18 58 10.49 +01 36 57.5 2000 72.002.012 rad 18 58 10.49 +01 36 57.5 +032-02.1 M 1-66 18 55 51. -01 07 55. 1950 CGPN/Mi 59 18 58 26.02 -01 03 47.7 +032-02.1 M 1-66 18 55 50.3 -01 07 39. 1950 30.135.052 18 58 25.32 -01 03 31.7 +032-02.1 M 1-66 18 55 51.22 -01 07 53.0 1950 52.002.003 18 58 26.24 -01 03 45.6 +032-02.1 M 1-66 18 55 51.2 -01 07 53. 1950 70.002.006 18 58 26.22 -01 03 45.6 +032-02.1 M 1-66 18 58 26.19 -01 03 46.7 2000 70.002.006 rad 18 58 26.19 -01 03 46.7 +032-02.1 M 1-66 18 55 51.1 -01 07 53. 1950 IRAS18558-0107 18 58 26.12 -01 03 45.7 +033-01.1 * SP 2-151 18 56 17.4 -00 37 02. 1950 70.002.006 18 58 51.84 -00 32 52.8 +033-01.1 * SP 2-151 18 58 51.70 -00 32 55.8 2000 70.002.006 rad 18 58 51.70 -00 32 55.8 +033-01.1 * SP 2-151 18 56 17.4 -00 37 05. 1950 Ko,Ku (1999) 18 58 51.84 -00 32 55.8 +033-01.1 * SP 2-151 18 56 18.7 -00 37 02. 1950 IRAS18563-0037 18 58 53.14 -00 32 52.7 +052+07.1 * K 4-10 18 56 54.2 +20 32 52. 1950 CGPN/Ko 65b 18 59 03.69 +20 37 02.9 +052+07.1 * K 4-10 18 56 53.7 +20 32 52. 1950 30.135.052 18 59 03.19 +20 37 02.9 +052+07.1 * K 4-10 18 56 54.3 +20 32 49. 1950 70.002.006 18 59 03.79 +20 36 59.9 +052+07.1 * K 4-10 18 56 54.4 +20 32 51. 1950 IRAS18569+2032 18 59 03.89 +20 37 01.9 +033-02.2 CBSS 3 19 00 17.1 -00 14 02. 2000 61.132.046 * 19 00 17.1 -00 14 02. +033-02.2 CBSS 3 18 57 42.2 -00 18 49. 1950 Ko,Ku (1999) 19 00 16.30 -00 14 33.8 +032-03.1 K 3-18 18 57 58.5 -02 16 13. 1950 CGPN/Ko 65b 19 00 34.80 -02 11 56.6 +032-03.1 K 3-18 18 57 58.0 -02 16 13. 1950 18.133.025 19 00 34.30 -02 11 56.7 +032-03.1 K 3-18 18 57 58.5 -02 16 14. 1950 50.134.178 19 00 34.80 -02 11 57.6 +032-03.1 K 3-18 18 57 58.7 -02 16 13. 1950 70.002.006 19 00 35.00 -02 11 56.6 +032-03.1 K 3-18 18 57 57.8 -02 16 18. 1950 IRAS18579-0216 19 00 34.10 -02 12 01.7 +078+18.1 A 50 18 57 58.5 +48 23 42. 1950 50.134.178 18 59 19.41 +48 27 55.7 +078+18.1 A 50 18 57 59.0 +48 23 41. 1950 70.002.006 18 59 19.91 +48 27 54.7 +078+18.1 A 50 18 59 20.20 +48 28 01.0 2000 70.002.006 rad 18 59 20.20 +48 28 01.0 +017-10.1 A 51 18 58 06.0 -18 16 20. 1950 18.133.025 19 01 01.06 -18 12 02.4 +017-10.1 A 51 18 58 06.0 -18 16 33. 1950 34.134.010 19 01 01.06 -18 12 15.4 +017-10.1 A 51 18 58 06.3 -18 16 32. 1950 70.002.006 19 01 01.36 -18 12 14.4 +017-10.1 A 51 19 01 01.24 -18 12 19.3 2000 70.002.006 rad 19 01 01.24 -18 12 19.3 +017-10.1 A 51 18 58 06.4 -18 16 31. 1950 IRAS18581-1816 19 01 01.46 -18 12 13.4 +023-07.1 MaC 1-16 18 58 33.76 -12 02 43.3 1950 22.135.002 19 01 21.27 -11 58 24.0 +023-07.1 MaC 1-16 18 58 34.3 -12 02 39. 1950 70.002.006 19 01 21.81 -11 58 19.7 +023-07.1 MaC 1-16 19 01 22.10 -11 58 19.0 2000 70.002.006 rad 19 01 22.10 -11 58 19.0 +023-07.1 MaC 1-16 18 58 34.5 -12 02 41. 1950 Ko,Ku (1999) 19 01 22.01 -11 58 21.7 +041+01.1 * PN 1858+0821 18 58 41.6 +08 21 17. 1950 66.134.003 19 01 05.86 +08 25 36.0 +041+01.1 * PN 1858+0821 18 58 41.5 +08 21 20. 1950 66.134.003 rad 19 01 05.76 +08 25 39.0 +041+01.1 * PN 1858+0821 19 01 05.7 +08 25 36. 2000 72.002.012 19 01 05.7 +08 25 36. +041+01.1 * PN 1858+0821 18 58 41.40 +08 21 12.2 1950 72.002.012 rad 19 01 05.66 +08 25 31.2 +041+01.1 * PN 1858+0821 18 58 41.6 +08 21 16. 1950 Ko,Ku (1999) 19 01 05.86 +08 25 35.0 +041+01.1 * PN 1858+0821 18 58 41.5 +08 21 16. 1950 IRAS18586+0821 19 01 05.76 +08 25 35.0 +068+14.1 * SP 4-1 18 57 02.3 +38 12 53. 1900 40.134.054 19 00 27.68 +38 21 21.3 +068+14.1 * SP 4-1 18 58 43.8 +38 16 48. 1950 70.002.006 19 00 26.56 +38 21 05.7 +068+14.1 * SP 4-1 19 00 26.56 +38 21 06.7 2000 72.002.012 rad 19 00 26.56 +38 21 06.7 +068+14.1 * SP 4-1 18 58 43.9 +38 16 50. 1950 Ko,Ku (1999) 19 00 26.66 +38 21 07.7 +068+14.1 * SP 4-1 18 58 43.6 +38 16 45. 1950 IRAS18587+3816 19 00 26.37 +38 21 02.7 +032-02.2 K 3-19 18 59 01.3 -01 23 27. 1950 CGPN/Ko 65b 19 01 36.61 -01 19 06.2 +032-02.2 K 3-19 18 59 01.3 -01 23 20. 1950 18.133.025 19 01 36.61 -01 18 59.2 +032-02.2 K 3-19 18 59 01.30 -01 23 28.5 1950 52.002.003 19 01 36.61 -01 19 07.7 +032-02.2 K 3-19 18 59 01.3 -01 23 29. 1950 70.002.006 19 01 36.61 -01 19 08.2 +032-02.2 K 3-19 19 01 36.66 -01 19 09.1 2000 70.002.006 rad 19 01 36.66 -01 19 09.1 +032-02.2 K 3-19 18 59 01.6 -01 23 27. 1950 IRAS18590-0123 19 01 36.91 -01 19 06.2 +014-11.1 SrWe 4 18 59 16.9 -21 31 14. 1950 43.134.030 * 19 02 16.06 -21 26 51.3 +014-11.1 SrWe 4 18 59 17.7 -21 31 16. 1950 70.002.006 19 02 16.86 -21 26 53.2 +014-11.1 SrWe 4 18 59 18.4 -21 31 13. 1950 Ko,Ku (1999) 19 02 17.56 -21 26 50.2 +036-01.1 Sh 2-71 18 59 28.9 +02 04 51. 1950 CGPN/Ko 65a * 19 02 00.30 +02 09 13.6 +036-01.1 Sh 2-71 18 59 28.0 +02 04 56. 1950 09.133.025 19 01 59.40 +02 09 18.5 +036-01.1 Sh 2-71 18 58 28.7 +02 05 05. 1950 34.134.010 19 01 00.09 +02 09 23.3 +036-01.1 Sh 2-71 18 59 28.8 +02 05 00. 1950 50.134.178 19 02 00.20 +02 09 22.6 +036-01.1 Sh 2-71 18 59 28.7 +02 05 01. 1950 70.002.006 19 02 00.10 +02 09 23.6 +036-01.1 Sh 2-71 19 01 59.97 +02 09 21.3 2000 70.002.006 rad 19 01 59.97 +02 09 21.3 +036-01.1 Sh 2-71 18 59 28.8 +02 04 48. 1950 IRAS18594+0204 19 02 00.20 +02 09 10.6 +032-03.2 K 3-20 18 59 34.3 -01 53 07. 1950 CGPN/Ko 65b 19 02 10.16 -01 48 43.9 +032-03.2 K 3-20 18 59 34.1 -01 53 03. 1950 30.135.052 19 02 09.96 -01 48 39.9 +032-03.2 K 3-20 18 59 34.3 -01 53 09. 1950 70.002.006 19 02 10.16 -01 48 45.9 +032-03.2 K 3-20 19 02 10.05 -01 48 43.5 2000 70.002.006 rad 19 02 10.05 -01 48 43.5 +032-03.2 K 3-20 18 59 35.6 -01 53 06. 1950 IRAS18595-0153 19 02 11.46 -01 48 42.8 +043+02.1 CTSS 1 18 59 56. +10 13 00. 1950 52.134.045 19 02 18.12 +10 17 24.1 +043+02.1 CTSS 1 18 59 56.1 +10 13 12. 1950 66.134.003 19 02 18.22 +10 17 36.2 +043+02.1 CTSS 1 18 59 55.8 +10 13 12. 1950 70.002.006 19 02 17.92 +10 17 36.1 +043+02.1 CTSS 1 19 02 17.82 +10 17 30.6 2000 70.002.006 rad 19 02 17.82 +10 17 30.6 +043+02.1 CTSS 1 18 59 56.3 +10 13 08. 1950 IRAS18599+1013 19 02 18.42 +10 17 32.2 +033-02.1 NGC 6741 18 57 28.56 -00 35 37.5 1900 CGPN/Bs 11 * 19 02 37.16 -00 26 58.2 +033-02.1 NGC 6741 18 58 57.9 -00 33 12.0 1929 CGPN/Sr 30 19 02 37.02 -00 26 58.9 +033-02.1 NGC 6741 19 00 02.0 -00 31 12. 1950 09.133.025 19 02 36.33 -00 26 47.0 +033-02.1 NGC 6741 19 00 02.5 -00 31 21.0 1950 11.133.011 19 02 36.83 -00 26 56.0 +033-02.1 NGC 6741 19 00 02.74 -00 31 21.6 1950 37.134.035 19 02 37.07 -00 26 56.5 +033-02.1 NGC 6741 19 00 02.8 -00 31 22. 1950 70.002.006 19 02 37.13 -00 26 56.9 +033-02.1 NGC 6741 19 02 36.96 -00 26 57.2 2000 70.002.006 rad 19 02 36.96 -00 26 57.2 +033-02.1 NGC 6741 19 00 02.3 -00 31 23. 1950 IRAS19000-0031 19 02 36.63 -00 26 58.0 +047+04.1 K 3-21 19 00 23.1 +14 24 26. 1950 CGPN/Ko 65b 19 02 40.29 +14 28 51.9 +047+04.1 K 3-21 19 00 23.0 +14 24 24. 1950 70.002.006 19 02 40.19 +14 28 49.9 +036-01.2 HtTr 11 19 00 28.9 +02 57 54. 1950 34.134.052 19 02 59.30 +03 02 20.8 +036-01.2 HtTr 11 19 00 29.0 +02 57 53. 1950 70.002.006 19 02 59.41 +03 02 19.8 +036-01.2 HtTr 11 19 02 59.43 +03 02 19.8 2000 70.002.006 rad 19 02 59.43 +03 02 19.8 +036-01.2 HtTr 11 19 00 29.0 +02 57 52. 1950 IRAS19004+0257 19 02 59.41 +03 02 18.8 +046+03.1 Sh 2-78 19 00 50. +14 02 30. 1950 52.134.045 19 03 07.64 +14 06 57.8 +046+03.1 Sh 2-78 19 00 52.7 +14 02 28. 1950 70.002.006 19 03 10.34 +14 06 56.0 +046+03.1 Sh 2-78 19 00 52.6 +14 02 30. 1950 Ko,Ku (1999) 19 03 10.24 +14 06 58.0 +038-00.1 * HtTr 12 19 01 19.2 +05 05 12. 1950 34.134.052 19 03 47.21 +05 09 42.2 +038-00.1 * HtTr 12 19 01 19.4 +05 05 10. 1950 Ko,Ku (1999) 19 03 47.41 +05 09 40.2 +051+06.1 K 1-17 19 01 26.2 +19 16 53. 1950 CGPN/Ko 64d 19 03 37.43 +19 21 23.1 +051+06.1 K 1-17 19 01 26.0 +19 16 53. 1950 09.133.025 19 03 37.23 +19 21 23.1 +051+06.1 K 1-17 19 01 26.2 +19 16 51. 1950 70.002.006 19 03 37.43 +19 21 21.1 +051+06.1 K 1-17 19 03 37.30 +19 21 13.0 2000 70.002.006 rad 19 03 37.30 +19 21 13.0 +051+06.1 K 1-17 19 01 26.4 +19 16 48. 1950 IRAS19014+1916 19 03 37.63 +19 21 18.1 +048+04.1 * K 4-12 19 01 32.1 +16 21 49. 1950 CGPN/Ko 65b * 19 03 46.95 +16 26 19.6 +048+04.1 * K 4-12 19 01 32.2 +16 21 48. 1950 19.114.052 19 03 47.05 +16 26 18.6 +048+04.1 * K 4-12 19 01 32.1 +16 21 49. 1950 30.135.052 19 03 46.95 +16 26 19.6 +048+04.1 * K 4-12 19 01 32.0 +16 21 47. 1950 38.002.010 19 03 46.85 +16 26 17.6 +048+04.1 * K 4-12 19 01 32. +16 21 05. 1950 46.114.003 19 03 46.86 +16 25 35.6 +048+04.1 * K 4-12 19 01 32.02 +16 21 47.0 1950 51.117.039 19 03 46.87 +16 26 17.6 +036-01.3 * IRAS19021+0209 19 04 38.7 +02 14 21. 2000 72.002.012 19 04 38.7 +02 14 21. +036-01.3 * IRAS19021+0209 19 02 07.44 +02 09 49.9 1950 72.002.012 rad 19 04 38.75 +02 14 23.6 +036-01.3 * IRAS19021+0209 19 02 07.6 +02 09 50. 1950 Ko,Ku (1999) 19 04 38.91 +02 14 23.7 +036-01.3 * IRAS19021+0209 19 02 07.2 +02 09 49. 1950 IRAS19021+0209 19 04 38.51 +02 14 22.7 +050+05.1 A 52 19 02 19.2 +17 52 36. 1950 18.133.025 19 04 32.21 +17 57 09.9 +050+05.1 A 52 19 02 19.4 +17 52 34. 1950 70.002.006 19 04 32.41 +17 57 07.9 +050+05.1 A 52 19 04 32.40 +17 57 02.0 2000 70.002.006 rad 19 04 32.40 +17 57 02.0 +050+05.1 A 52 19 02 19.2 +17 52 31. 1950 IRAS19023+1752 19 04 32.21 +17 57 04.9 +003-17.1 Hb 8 19 02 20.0 -33 16 16. 1950 08.114.108 * 19 05 35.87 -33 11 39.8 +003-17.1 Hb 8 19 02 20.20 -33 16 15.3 1950 10.113.006 19 05 36.07 -33 11 39.1 +003-17.1 Hb 8 19 02 20.5 -33 16 15. 1950 18.133.025 19 05 36.37 -33 11 38.8 +003-17.1 Hb 8 19 02 20.10 -33 16 13.4 1950 34.134.032 19 05 35.97 -33 11 37.2 +003-17.1 Hb 8 19 02 20.0 -33 16 13. 1950 70.002.006 19 05 35.87 -33 11 36.8 +003-17.1 Hb 8 19 05 35.96 -33 11 44.0 2000 70.002.006 rad 19 05 35.96 -33 11 44.0 +048+04.2 * K 4-16 19 02 35.8 +15 43 03. 1950 CGPN/Ko 65b * 19 04 51.46 +15 47 38.1 +048+04.2 * K 4-16 19 02 36.0 +15 43 03. 1950 18.133.025 19 04 51.66 +15 47 38.1 +048+04.2 * K 4-16 19 02 35.75 +15 43 00.9 1950 52.002.003 19 04 51.41 +15 47 36.0 +048+04.2 * K 4-16 19 02 35.8 +15 43 04. 1950 70.002.006 19 04 51.46 +15 47 39.1 +048+04.2 * K 4-16 19 04 51.24 +15 47 40.2 2000 70.002.006 rad 19 04 51.24 +15 47 40.2 +011-14.1 * HtDe 10 19 02 37.8 -25 28 14. 1950 43.134.029 19 05 42.12 -25 23 37.0 +011-14.1 * HtDe 10 19 02 38.1 -25 28 22. 1950 Ko,Ku (1999) 19 05 42.42 -25 23 45.0 +029-05.1 NGC 6751 19 00 34.53 -06 08 38.5 1900 CGPN/Kb 09 19 05 55.62 -05 59 32.2 +029-05.1 NGC 6751 19 00 34.63 -06 08 39.0 1900 CGPN/Po 10 19 05 55.72 -05 59 32.7 +029-05.1 NGC 6751 19 00 34.45 -06 08 37.5 1900 CGPN/Em 16 19 05 55.54 -05 59 31.2 +029-05.1 NGC 6751 19 02 07.5 -06 06 02.2 1929 CGPN/Sr 30 19 05 55.48 -05 59 29.7 +029-05.1 NGC 6751 19 03 15.0 -06 04 07. 1950 09.133.025 19 05 55.56 -05 59 28.2 +029-05.1 NGC 6751 19 03 15.4 -06 04 10. 1950 30.002.012 19 05 55.96 -05 59 31.2 +029-05.1 NGC 6751 19 03 14.9 -06 04 11. 1950 70.002.006 19 05 55.46 -05 59 32.2 +029-05.1 NGC 6751 19 05 55.57 -05 59 33.1 2000 70.002.006 rad 19 05 55.57 -05 59 33.1 +029-05.1 NGC 6751 19 03 15.2 -06 04 11. 1950 IRAS19032-0604 19 05 55.76 -05 59 32.2 +046+02.1 CTSS 4 19 04 05. +13 40 00. 1950 52.134.045 19 06 23.14 +13 44 41.5 +046+02.1 CTSS 4 19 04 04.8 +13 40 05. 1950 70.002.006 19 06 22.94 +13 44 46.5 +046+02.1 CTSS 4 19 04 05.0 +13 40 03. 1950 Ko,Ku (1999) 19 06 23.14 +13 44 44.5 +058+09.1 Si 1-2 19 04 06.4 +27 08 18. 1950 Ko,Ku (1999) * 19 06 07.25 +27 12 59.0 +040-00.1 A 53 19 04 19.3 +06 19 08. 1950 CGPN/Ko 65a 19 06 45.94 +06 23 50.8 +040-00.1 A 53 19 04 19.3 +06 19 15. 1950 18.133.025 19 06 45.94 +06 23 57.8 +040-00.1 A 53 19 04 19.2 +06 19 13. 1950 34.134.010 19 06 45.84 +06 23 55.8 +040-00.1 A 53 19 04 19.2 +06 19 11. 1950 70.002.006 19 06 45.84 +06 23 53.8 +040-00.1 A 53 19 06 45.96 +06 23 53.0 2000 70.002.006 rad 19 06 45.96 +06 23 53.0 +040-00.1 A 53 19 04 20.1 +06 19 09. 1950 IRAS19043+0619 19 06 46.74 +06 23 51.8 +036-02.1 HtTr 13 19 05 30.9 +02 16 36. 1950 34.134.052 19 08 02.09 +02 21 23.9 +036-02.1 HtTr 13 19 05 31.0 +02 16 36. 1950 70.002.006 19 08 02.19 +02 21 23.9 +036-02.1 HtTr 13 19 08 02.48 +02 21 31.9 2000 70.002.006 rad 19 08 02.48 +02 21 31.9 +341-24.1 Lo 18 19 05 38. -55 39 30. 1950 19.135.001 * 19 09 45.22 -55 34 38.2 +341-24.1 Lo 18 19 05 40.7 -55 40 02. 1950 Ko,Ku (1999) 19 09 47.95 -55 35 10.0 +055+06.1 A 54 19 06 32.6 +22 54 00. 1950 18.133.025 19 08 39.33 +22 58 51.4 +055+06.1 A 54 19 06 32.9 +22 54 08. 1950 70.002.006 19 08 39.62 +22 58 59.4 +055+06.1 A 54 19 06 32.9 +22 54 08. 1950 Ko,Ku (1999) 19 08 39.62 +22 58 59.4 +041-00.1 * HtTr 14 19 06 47.6 +07 00 50. 1950 34.134.052 19 09 13.48 +07 05 43.1 +041-00.1 * HtTr 14 19 06 47.3 +07 00 49. 1950 70.002.006 19 09 13.18 +07 05 42.1 +041-00.1 * HtTr 14 19 06 47.9 +07 00 49. 1950 Ko,Ku (1999) 19 09 13.78 +07 05 42.1 +045+01.1 * K 3-22 19 07 06.3 +11 55 54. 1950 CGPN/Ko 65b 19 09 26.54 +12 00 48.2 +045+01.1 * K 3-22 19 07 06.3 +11 55 54. 1950 30.135.052 19 09 26.54 +12 00 48.2 +045+01.1 * K 3-22 19 07 06.6 +11 55 50. 1950 70.002.006 19 09 26.84 +12 00 44.2 +045+01.1 * K 3-22 19 07 05.9 +11 55 48. 1950 IRAS19070+1155 19 09 26.14 +12 00 42.2 +033-05.1 A 55 19 07 49.9 -02 25 21. 1950 50.134.178 19 10 26.34 -02 20 23.2 +033-05.1 A 55 19 07 49.4 -02 25 23. 1950 70.002.006 19 10 25.84 -02 20 25.2 +033-05.1 A 55 19 10 25.87 -02 20 23.5 2000 70.002.006 rad 19 10 25.87 -02 20 23.5 +033-05.1 A 55 19 07 48.9 -02 25 21. 1950 IRAS19078-0225 19 10 25.34 -02 20 23.3 +039-02.2 * PN 1908+0422 19 08 24.5 +04 22 28. 1950 66.134.003 19 10 53.36 +04 27 27.9 +039-02.2 * PN 1908+0422 19 08 24.4 +04 22 28. 1950 66.134.003 rad 19 10 53.26 +04 27 27.9 +039-02.2 * PN 1908+0422 19 10 53.3 +04 27 29. 2000 72.002.012 19 10 53.3 +04 27 29. +039-02.2 * PN 1908+0422 19 08 24.45 +04 22 25.8 1950 72.002.012 rad 19 10 53.31 +04 27 25.7 +039-02.2 * PN 1908+0422 19 08 24.7 +04 22 28. 1950 Ko,Ku (1999) 19 10 53.56 +04 27 28.0 +039-02.2 * PN 1908+0422 19 08 24.1 +04 22 26. 1950 IRAS19084+0422 19 10 52.96 +04 27 25.9 +062+09.1 NGC 6765 19 07 14.75 +30 22 59.9 1900 CGPN/Em 16 19 11 07.11 +30 32 55.9 +062+09.1 NGC 6765 19 09 11. +30 27 52. 1950 CGPN/Mi 59 19 11 07.25 +30 32 54.0 +062+09.1 NGC 6765 19 09 10.2 +30 27 42. 1950 70.002.006 19 11 06.45 +30 32 44.0 +062+09.1 NGC 6765 19 11 06.77 +30 32 44.3 2000 70.002.006 rad 19 11 06.77 +30 32 44.3 +062+09.1 NGC 6765 19 09 10.3 +30 27 40. 1950 Ko,Ku (1999) 19 11 06.55 +30 32 42.0 +062+09.1 NGC 6765 19 09 10.0 +30 27 37. 1950 IRAS19091+3027 19 11 06.25 +30 32 39.0 +047+01.1 PN 1909+1326 19 09 17.4 +13 26 08. 1950 66.134.003 19 11 35.92 +13 31 11.3 +047+01.1 PN 1909+1326 19 09 17.3 +13 26 09. 1950 66.134.003 rad 19 11 35.82 +13 31 12.3 +047+01.1 PN 1909+1326 19 09 17.5 +13 26 08. 1950 Ko,Ku (1999) 19 11 36.02 +13 31 11.3 +047+01.1 PN 1909+1326 19 09 17.6 +13 26 06. 1950 IRAS19092+1326 19 11 36.12 +13 31 09.3 +048+02.1 K 3-24 19 09 49.3 +15 03 59. 1950 CGPN/Ko 65b 19 12 05.90 +15 09 04.4 +048+02.1 K 3-24 19 09 49.3 +15 03 52.3 1950 11.133.011 19 12 05.90 +15 08 57.7 +048+02.1 K 3-24 19 09 48.8 +15 03 58.9 1950 11.133.011 19 12 05.40 +15 09 04.3 +048+02.1 K 3-24 19 09 49.5 +15 03 56. 1950 18.133.025 19 12 06.10 +15 09 01.4 +048+02.1 K 3-24 19 09 49.2 +15 03 58. 1950 70.002.006 19 12 05.80 +15 09 03.4 +048+02.1 K 3-24 19 12 05.79 +15 09 06.0 2000 70.002.006 rad 19 12 05.79 +15 09 06.0 +048+02.1 K 3-24 19 09 49.5 +15 04 03. 1950 IRAS19098+1504 19 12 06.10 +15 09 08.4 +044+00.1 AGPF 1 19 12 16. +10 36 33. 2000 68.134.022 19 12 16. +10 36 33. +044+00.1 AGPF 1 19 09 54.4 +10 31 25. 1950 Ko,Ku (1999) 19 12 16.31 +10 36 30.9 +030-07.1 * MaC 1-17 19 10 17.51 -05 26 28.3 1950 22.135.002 19 12 57.30 -05 21 20.1 +030-07.1 * MaC 1-17 19 10 17.6 -05 26 30. 1950 Ko,Ku (1999) 19 12 57.39 -05 21 21.8 +037-03.2 A 56 19 10 36.0 +02 47 40. 1950 18.133.025 19 13 06.63 +02 52 49.1 +037-03.2 A 56 19 10 36.0 +02 47 40. 1950 70.002.006 19 13 06.63 +02 52 49.1 +049+02.1 He 2-428 19 10 49.5 +15 41 32. 1950 CGPN/Ko 65a 19 13 05.38 +15 46 41.6 +049+02.1 He 2-428 19 10 49.5 +15 41 32. 1950 18.133.025 19 13 05.38 +15 46 41.6 +049+02.1 He 2-428 19 10 49.7 +15 41 29. 1950 50.134.178 19 13 05.58 +15 46 38.6 +049+02.1 He 2-428 19 10 49.4 +15 41 38. 1950 70.002.006 19 13 05.28 +15 46 47.6 +049+02.1 He 2-428 19 13 05.42 +15 46 42.6 2000 70.002.006 rad 19 13 05.42 +15 46 42.6 +049+02.1 He 2-428 19 10 49.5 +15 41 31. 1950 IRAS19108+1541 19 13 05.38 +15 46 40.6 +038-03.1 * K 4-19 19 10 52.6 +03 19 53. 1950 CGPN/Ko 65b 19 13 22.64 +03 25 03.3 +038-03.1 * K 4-19 19 10 52.6 +03 19 52. 1950 70.002.006 19 13 22.64 +03 25 02.3 +038-03.1 * K 4-19 19 13 22.60 +03 25 01.0 2000 70.002.006 rad 19 13 22.60 +03 25 01.0 +038-03.1 * K 4-19 19 10 52.3 +03 19 49. 1950 IRAS19108+0319 19 13 22.34 +03 24 59.3 +037-03.3 * K 3-25 19 11 02.3 +02 13 03. 1950 CGPN/Ko 65b 19 13 33.57 +02 18 14.0 +037-03.3 * K 3-25 19 11 02.0 +02 13 03. 1950 09.133.025 19 13 33.27 +02 18 14.0 +049+02.2 * PN 1911+1534 19 11 03.2 +15 34 30. 1950 66.134.003 * 19 13 19.22 +15 39 40.5 +049+02.2 * PN 1911+1534 19 11 03.1 +15 34 31. 1950 66.134.003 rad 19 13 19.12 +15 39 41.5 +049+02.2 * PN 1911+1534 19 11 01.8 +15 34 09. 1950 Ko,Ku (1999) 19 13 17.83 +15 39 19.4 +039-02.1 M 2-47 19 11 06. +04 32 55. 1950 CGPN/Mi 59 19 13 34.68 +04 38 06.2 +039-02.1 M 2-47 19 11 05.7 +04 32 55.0 1950 11.133.011 19 13 34.38 +04 38 06.1 +039-02.1 M 2-47 19 11 05.8 +04 32 54.9 1950 11.133.011 19 13 34.48 +04 38 06.0 +039-02.1 M 2-47 19 11 05.8 +04 32 55. 1950 18.133.025 19 13 34.48 +04 38 06.1 +039-02.1 M 2-47 19 11 05.8 +04 32 53. 1950 50.134.178 19 13 34.48 +04 38 04.1 +039-02.1 M 2-47 19 11 05.8 +04 32 53. 1950 70.002.006 19 13 34.48 +04 38 04.1 +039-02.1 M 2-47 19 13 34.50 +04 38 06.1 2000 70.002.006 rad 19 13 34.50 +04 38 06.1 +039-02.1 M 2-47 19 11 04.5 +04 32 47. 1950 IRAS19110+0432 19 13 33.18 +04 37 58.0 +042-01.1 * K 4-20 19 11 06.1 +07 22 10. 1950 CGPN/Ko 65b * 19 13 31.62 +07 27 21.0 +042-01.1 * K 4-20 19 11 07.0 +07 21 19. 1950 30.135.052 19 13 32.53 +07 26 30.1 +042-01.1 * K 4-20 19 11 07.3 +07 21 15. 1950 Ko,Ku (1999) 19 13 32.84 +07 26 26.1 +005-18.1 SKWL 2-21 19 11 08.9 -32 39 31. 1950 08.114.108 * 19 14 23.31 -32 34 18.0 +005-18.1 SKWL 2-21 19 11 08.9 -32 39 30. 1950 70.002.006 19 14 23.31 -32 34 17.0 +005-18.1 SKWL 2-21 19 11 09.0 -32 39 31. 1950 Ko,Ku (1999) 19 14 23.41 -32 34 18.0 +013-15.1 * We 4-5 19 14 11.5 -23 41 26. 2000 63.013.098 * 19 14 11.5 -23 41 26. +013-15.1 * We 4-5 19 11 09.5 -23 46 37. 1950 Ko,Ku (1999) 19 14 11.20 -23 41 24.4 +029-07.1 LSA 1 19 11 14.9 -06 24 03. 1950 45.134.035 19 13 55.76 -06 18 50.8 +029-07.1 LSA 1 19 11 14.8 -06 24 05. 1950 70.002.006 19 13 55.66 -06 18 52.8 +029-07.1 LSA 1 19 13 56.10 -06 18 58.0 2000 70.002.006 rad 19 13 56.10 -06 18 58.0 +029-07.1 LSA 1 19 11 15.0 -06 24 05. 1950 Ko,Ku (1999) 19 13 55.86 -06 18 52.8 +044-00.1 AGPF 2 19 13 37. +10 39 31. 2000 68.134.022 * 19 13 37. +10 39 31. +044-00.1 AGPF 2 19 11 15.5 +10 34 21. 1950 Ko,Ku (1999) 19 13 37.38 +10 39 32.6 +048+01.1 He 2-429 19 11 22. +14 54 08. 1950 CGPN/Mi 59 19 13 38.83 +14 59 19.8 +048+01.1 He 2-429 19 11 21.8 +14 54 08. 1950 CGPN/Koal 65 19 13 38.63 +14 59 19.8 +048+01.1 He 2-429 19 11 21.2 +14 54 18. 1950 18.133.025 19 13 38.03 +14 59 29.8 +048+01.1 He 2-429 19 11 21.7 +14 54 06. 1950 70.002.006 19 13 38.53 +14 59 17.8 +048+01.1 He 2-429 19 13 38.49 +14 59 18.4 2000 70.002.006 rad 19 13 38.49 +14 59 18.4 +048+01.1 He 2-429 19 11 21.5 +14 54 06. 1950 IRAS19113+1454 19 13 38.33 +14 59 17.8 +038-03.2 M 1-69 19 11 24. +03 32 33. 1950 CGPN/Mi 59 19 13 53.80 +03 37 45.4 +038-03.2 M 1-69 19 11 24.0 +03 32 33. 1950 18.133.025 19 13 53.80 +03 37 45.4 +038-03.2 M 1-69 19 11 24.1 +03 32 32. 1950 70.002.006 19 13 53.90 +03 37 44.4 +038-03.2 M 1-69 19 13 53.97 +03 37 42.4 2000 70.002.006 rad 19 13 53.97 +03 37 42.4 +038-03.2 M 1-69 19 11 23.6 +03 32 26. 1950 IRAS19113+0332 19 13 53.41 +03 37 38.4 +051+03.1 He 2-430 19 11 50.4 +17 26 20. 1950 CGPN/Ko 65a 19 14 04.20 +17 31 33.7 +051+03.1 He 2-430 19 11 50.9 +17 26 20. 1950 18.133.025 19 14 04.70 +17 31 33.7 +051+03.1 He 2-430 19 11 50.34 +17 26 19.5 1950 37.134.035 19 14 04.14 +17 31 33.2 +051+03.1 He 2-430 19 11 50.34 +17 26 19.5 1950 52.002.003 19 14 04.14 +17 31 33.2 +051+03.1 He 2-430 19 11 50.3 +17 26 18. 1950 70.002.006 19 14 04.10 +17 31 31.7 +051+03.1 He 2-430 19 14 04.18 +17 31 33.7 2000 70.002.006 rad 19 14 04.18 +17 31 33.7 +051+03.1 He 2-430 19 11 50.3 +17 26 20. 1950 St,Sa (1977) 19 14 04.10 +17 31 33.7 +051+03.1 He 2-430 19 11 49.4 +17 26 15. 1950 IRAS19118+1726 19 14 03.20 +17 31 28.6 +033-06.1 NGC 6772 19 08 20.56 -02 54 53.6 1880 CGPN/Wn 09 * 19 14 36.92 -02 42 35.4 +033-06.1 NGC 6772 19 09 23.38 -02 52 39.3 1900 CGPN/Po 10 19 14 37.00 -02 42 19.8 +033-06.1 NGC 6772 19 12 00.5 -02 47 35. 1950 09.133.025 19 14 37.33 -02 42 19.8 +033-06.1 NGC 6772 19 11 51.6 -02 47 41. 1950 34.134.010 19 14 28.43 -02 42 26.4 +033-06.1 NGC 6772 19 11 59.3 -02 47 35. 1950 50.134.178 19 14 36.13 -02 42 19.9 +033-06.1 NGC 6772 19 12 00.5 -02 47 35.0 1950 57.134.011 19 14 37.33 -02 42 19.8 +033-06.1 NGC 6772 19 11 59.6 -02 47 42. 1950 70.002.006 19 14 36.43 -02 42 26.8 +033-06.1 NGC 6772 19 14 36.40 -02 42 22.8 2000 70.002.006 rad 19 14 36.40 -02 42 22.8 +033-06.1 NGC 6772 19 11 59.3 -02 47 39. 1950 IRAS19119-0247 19 14 36.13 -02 42 23.9 +035-05.1 K 3-26 19 12 05.6 +00 08 22. 1950 CGPN/Ko 65b 19 14 39.18 +00 13 37.5 +035-05.1 K 3-26 19 12 06.0 +00 08 22. 1950 09.133.025 19 14 39.58 +00 13 37.5 +035-05.1 K 3-26 19 12 05.6 +00 08 21. 1950 70.002.006 19 14 39.18 +00 13 36.5 +035-05.1 K 3-26 19 14 39.16 +00 13 35.5 2000 70.002.006 rad 19 14 39.16 +00 13 35.5 +035-05.1 K 3-26 19 12 05.0 +00 08 19. 1950 IRAS19120+0008 19 14 38.58 +00 13 34.4 +061+08.1 K 3-27 19 12 30.9 +28 35 33. 1950 CGPN/Ko 65b 19 14 30.06 +28 40 49.0 +061+08.1 K 3-27 19 12 30.9 +28 35 27. 1950 34.134.010 19 14 30.06 +28 40 43.0 +061+08.1 K 3-27 19 12 30.7 +28 35 30. 1950 70.002.006 19 14 29.86 +28 40 46.0 +061+08.1 K 3-27 19 14 30.03 +28 40 43.7 2000 70.002.006 rad 19 14 30.03 +28 40 43.7 +061+08.1 K 3-27 19 12 30.7 +28 35 26. 1950 IRAS19125+2835 19 14 29.86 +28 40 42.0 +051+02.1 IRAS19127+1717 19 12 45.7 +17 17 28. 1950 19.114.052 19 14 59.70 +17 22 45.5 +051+02.1 IRAS19127+1717 19 12 46. +17 17 28. 1950 46.114.003 19 15 00.00 +17 22 45.6 +051+02.1 IRAS19127+1717 19 12 45.8 +17 17 29. 1950 70.002.006 19 14 59.80 +17 22 46.5 +051+02.1 IRAS19127+1717 19 12 45.9 +17 17 27. 1950 Ko,Ku (1999) 19 14 59.90 +17 22 44.5 +051+02.1 IRAS19127+1717 19 12 45.83 +17 17 29.1 1950 GSC 1603-01383 19 14 59.83 +17 22 46.6 +051+02.1 IRAS19127+1717 19 12 45.5 +17 17 25. 1950 IRAS19127+1717 19 14 59.50 +17 22 42.5 +048+01.2 K 3-29 19 13 12.6 +13 58 33. 1950 CGPN/Ko 65b 19 15 30.57 +14 03 52.5 +048+01.2 K 3-29 19 13 12.4 +13 58 33. 1950 30.135.052 19 15 30.37 +14 03 52.5 +048+01.2 K 3-29 19 13 12.58 +13 58 30.4 1950 52.002.003 19 15 30.55 +14 03 49.9 +048+01.2 K 3-29 19 13 12.6 +13 58 30. 1950 70.002.006 19 15 30.57 +14 03 49.5 +048+01.2 K 3-29 19 15 30.51 +14 03 48.6 2000 70.002.006 rad 19 15 30.51 +14 03 48.6 +048+01.2 K 3-29 19 13 12.6 +13 58 29. 1950 IRAS19132+1358 19 15 30.57 +14 03 48.5 +027-09.1 IC 4846 19 11 51.7 -09 07 08.8 1929 CGPN/Sr 30 * 19 15 44.36 -08 59 38.3 +027-09.1 IC 4846 19 13 44.9 -09 08 06. 1950 09.133.025 19 16 28.80 -09 02 43.3 +027-09.1 IC 4846 19 13 44.31 -09 07 59.0 1950 37.134.035 19 16 28.21 -09 02 36.4 +027-09.1 IC 4846 19 13 44.32 -09 07 59.2 1950 52.002.003 19 16 28.22 -09 02 36.6 +027-09.1 IC 4846 19 13 44.4 -09 07 59. 1950 70.002.006 19 16 28.30 -09 02 36.4 +027-09.1 IC 4846 19 16 28.25 -09 02 35.7 2000 70.002.006 rad 19 16 28.25 -09 02 35.7 +027-09.1 IC 4846 19 13 44.46 -09 07 59.3 1950 GSC 5708-00961 19 16 28.36 -09 02 36.7 +027-09.1 IC 4846 19 13 43.9 -09 08 01. 1950 IRAS19137-0908 19 16 27.80 -09 02 38.4 +358-21.1 IC 1297 19 13 57.3 -39 42 11. 1950 08.114.108 19 17 23.49 -39 36 46.0 +358-21.1 IC 1297 19 13 57.3 -39 42 12. 1950 70.002.006 19 17 23.49 -39 36 47.0 +358-21.1 IC 1297 19 17 23.51 -39 36 43.7 2000 70.002.006 rad 19 17 23.51 -39 36 43.7 +358-21.1 IC 1297 19 13 57.34 -39 42 11.6 1950 GSC 7922-00271 19 17 23.53 -39 36 46.6 +358-21.1 IC 1297 19 13 57.1 -39 42 10. 1950 IRAS19139-3942 19 17 23.29 -39 36 45.0 +040-03.1 K 3-30 19 13 59.7 +05 07 58. 1950 CGPN/Ko 65b * 19 16 27.75 +05 13 21.1 +040-03.1 K 3-30 19 13 59.4 +05 07 58. 1950 18.133.025 19 16 27.45 +05 13 21.1 +040-03.1 K 3-30 19 13 59.64 +05 07 56.3 1950 52.002.003 19 16 27.69 +05 13 19.4 +040-03.1 K 3-30 19 13 59.6 +05 07 57. 1950 70.002.006 19 16 27.65 +05 13 20.1 +040-03.1 K 3-30 19 16 27.61 +05 13 18.5 2000 70.002.006 rad 19 16 27.61 +05 13 18.5 +019-13.1 DeHt 3 19 14 10.2 -18 06 59. 1950 27.135.032 19 17 04.61 -18 01 34.2 +019-13.1 DeHt 3 19 14 09.7 -18 06 59. 1950 70.002.006 19 17 04.11 -18 01 34.2 +058+06.1 A 57 19 15 02.4 +25 32 06. 1950 70.002.006 19 17 05.95 +25 37 32.6 +058+06.1 A 57 19 17 05.70 +25 37 36.0 2000 70.002.006 rad 19 17 05.70 +25 37 36.0 +058+06.1 A 57 19 15 02.2 +25 32 06. 1950 Ko,Ku (1999) 19 17 05.75 +25 37 32.6 +026-11.1 Na 2 19 15 53.1 -11 11 42. 1950 CGPN/Naal 64 * 19 18 39.31 -11 06 10.4 +026-11.1 Na 2 19 15 33.1 -11 11 42. 1950 18.133.025 19 18 19.32 -11 06 11.8 +026-11.1 Na 2 19 15 33.3 -11 11 46. 1950 70.002.006 19 18 19.52 -11 06 15.8 +026-11.1 Na 2 19 18 19.71 -11 06 17.6 2000 70.002.006 rad 19 18 19.71 -11 06 17.6 +026-11.1 Na 2 19 15 33.5 -11 11 46. 1950 Ko,Ku (1999) 19 18 19.72 -11 06 15.8 +026-11.1 Na 2 19 15 32.3 -11 11 51. 1950 IRAS19155-1111 19 18 18.52 -11 06 20.8 +037-05.1 A 58 19 15 48.5 +01 41 20. 1950 18.133.025 * 19 18 20.37 +01 46 50.8 +037-05.1 A 58 19 15 46.3 +01 41 22. 1950 50.134.212 19 18 18.17 +01 46 52.6 +037-05.1 A 58 19 15 48.9 +01 41 22. 1950 70.002.006 19 18 20.77 +01 46 52.8 +037-05.1 A 58 19 18 20.40 +01 46 52.0 2000 70.002.006 rad 19 18 20.40 +01 46 52.0 +037-05.1 A 58 19 15 48.8 +01 41 28. 1950 Ko,Ku (1999) 19 18 20.67 +01 46 58.8 +037-05.1 A 58 19 15 48.7 +01 41 27. 1950 IRAS19158+0141 19 18 20.57 +01 46 57.8 +034-06.1 NGC 6778 19 13 14.02 -01 46 37.8 1900 CGPN/Po 10 19 18 25.16 -01 35 46.5 +034-06.1 NGC 6778 19 13 13.83 -01 46 37.6 1900 CGPN/Bs 11 19 18 24.97 -01 35 46.4 +034-06.1 NGC 6778 19 15 49.4 -01 41 24. 1950 09.133.025 19 18 24.99 -01 35 53.0 +034-06.1 NGC 6778 19 15 49.2 -01 41 18.0 1950 11.133.011 19 18 24.79 -01 35 47.1 +034-06.1 NGC 6778 19 15 49.3 -01 41 17. 1950 70.002.006 19 18 24.89 -01 35 46.0 +034-06.1 NGC 6778 19 18 25.02 -01 35 46.6 2000 70.002.006 rad 19 18 25.02 -01 35 46.6 +034-06.1 NGC 6778 19 15 49.5 -01 41 19. 1950 IRAS19158-0141 19 18 25.09 -01 35 48.0 +041-02.1 NGC 6781 19 12 37.66 +06 18 59.5 1880 CGPN/Wn 09 * 19 18 29.44 +06 31 58.4 +041-02.1 NGC 6781 19 13 34.87 +06 21 15.9 1900 CGPN/Wz 16 19 18 28.02 +06 32 08.8 +041-02.1 NGC 6781 19 16 01.9 +06 26 48. 1950 CGPN/Ko 65a 19 18 28.51 +06 32 19.5 +041-02.1 NGC 6781 19 16 01.9 +06 26 46. 1950 09.133.025 19 18 28.51 +06 32 17.5 +041-02.1 NGC 6781 19 16 01.7 +06 26 52. 1950 34.134.010 19 18 28.31 +06 32 23.5 +041-02.1 NGC 6781 19 16 01.3 +06 26 59. 1950 50.134.178 19 18 27.90 +06 32 30.5 +041-02.1 NGC 6781 19 16 01.9 +06 26 46.0 1950 57.134.011 19 18 28.51 +06 32 17.5 +041-02.1 NGC 6781 19 16 01.5 +06 26 57. 1950 70.002.006 19 18 28.10 +06 32 28.5 +041-02.1 NGC 6781 19 18 28.13 +06 32 20.0 2000 70.002.006 rad 19 18 28.13 +06 32 20.0 +041-02.1 NGC 6781 19 16 02.8 +06 26 51. 1950 IRAS19160+0626 19 18 29.41 +06 32 22.6 +053+03.1 A 59 19 16 29.5 +19 28 23. 1950 09.133.025 * 19 18 40.94 +19 33 55.9 +053+03.1 A 59 19 16 28.3 +19 28 56. 1950 50.134.178 19 18 39.73 +19 34 28.8 +053+03.1 A 59 19 16 28.7 +19 28 53. 1950 70.002.006 19 18 40.13 +19 34 25.8 +053+03.1 A 59 19 18 40.41 +19 34 30.7 2000 70.002.006 rad 19 18 40.41 +19 34 30.7 +053+03.1 A 59 19 16 28.4 +19 28 51. 1950 Ko,Ku (1999) 19 18 39.83 +19 34 23.8 +053+03.1 A 59 19 16 28.5 +19 28 59. 1950 IRAS19164+1928 19 18 39.93 +19 34 31.8 +025-11.1 A 60 19 16 30.0 -12 20 26. 1950 18.133.025 19 19 17.51 -12 14 51.8 +025-11.1 A 60 19 16 31.0 -12 20 27. 1950 70.002.006 19 19 18.51 -12 14 52.8 +052+02.1 K 3-31 19 16 50.6 +18 56 48. 1950 CGPN/Ko 65b 19 19 02.70 +19 02 22.3 +052+02.1 K 3-31 19 16 50.6 +18 56 51. 1950 18.133.025 19 19 02.70 +19 02 25.3 +052+02.1 K 3-31 19 16 50.54 +18 56 46.8 1950 52.002.003 19 19 02.64 +19 02 21.1 +052+02.1 K 3-31 19 16 50.6 +18 56 47. 1950 70.002.006 19 19 02.70 +19 02 21.3 +052+02.1 K 3-31 19 19 02.69 +19 02 22.0 2000 70.002.006 rad 19 19 02.69 +19 02 22.0 +052+02.1 K 3-31 19 16 50.6 +18 56 47. 1950 IRAS19168+1856 19 19 02.70 +19 02 21.3 +051+01.1 * IRAS19170+1706 19 17 04. +17 06 14. 1950 51.134.016 19 19 18.35 +17 11 49.3 +051+01.1 * IRAS19170+1706 19 17 04.3 +17 06 15. 1950 70.002.006 19 19 18.65 +17 11 50.4 +051+01.1 * IRAS19170+1706 19 19 18.65 +17 11 48.9 2000 70.002.006 rad 19 19 18.65 +17 11 48.9 +051+01.1 * IRAS19170+1706 19 17 04.9 +17 06 12. 1950 IRAS19170+1706 19 19 19.25 +17 11 47.4 +056+04.1 * K 3-32 19 17 29.3 +22 29 03. 1950 CGPN/Ko 65b 19 19 36.98 +22 34 39.8 +056+04.1 * K 3-32 19 17 29.0 +22 29 03. 1950 18.133.025 19 19 36.68 +22 34 39.8 +056+04.1 * K 3-32 19 17 28.2 +22 29 03. 1950 Ko,Ku (1999) 19 19 35.88 +22 34 39.8 +077+14.1 A 61 19 17 42.1 +46 09 15. 1950 70.002.006 19 19 10.25 +46 14 51.3 +077+14.1 A 61 19 17 42.2 +46 09 15. 1950 Ko,Ku (1999) 19 19 10.36 +46 14 51.4 +043-03.1 M 4-14 19 18 35.3 +07 31 12. 1950 CGPN/Ko 65a 19 21 00.74 +07 36 54.0 +043-03.1 M 4-14 19 18 35.7 +07 31 17. 1950 09.133.025 19 21 01.14 +07 36 59.0 +043-03.1 M 4-14 19 18 35.1 +07 31 15. 1950 50.134.178 19 21 00.54 +07 36 57.0 +043-03.1 M 4-14 19 18 35.3 +07 31 13. 1950 70.002.006 19 21 00.74 +07 36 55.0 +043-03.1 M 4-14 19 21 00.80 +07 36 52.4 2000 70.002.006 rad 19 21 00.80 +07 36 52.4 +043-03.1 M 4-14 19 18 35.1 +07 31 11. 1950 IRAS19185+0731 19 21 00.54 +07 36 53.0 +006-19.1 SKWL 2-18 19 18 59.1 -31 36 40. 1950 Wr (1966) * 19 22 11.42 -31 30 54.7 +006-19.1 SKWL 2-18 19 18 58.3 -31 36 25. 1950 08.114.108 19 22 10.62 -31 30 39.8 +006-19.1 SKWL 2-18 19 18 58.2 -31 36 24. 1950 70.002.006 19 22 10.52 -31 30 38.8 +006-19.1 SKWL 2-18 19 22 10.62 -31 30 27.7 2000 70.002.006 rad 19 22 10.62 -31 30 27.7 +006-19.1 SKWL 2-18 19 18 58.4 -31 36 25. 1950 Ko,Ku (1999) 19 22 10.72 -31 30 39.8 +032-08.1 Anon. 19 19 23.0 -04 17 36. 1950 18.133.025 19 22 01.44 -04 11 50.3 +032-08.1 Anon. 19 19 23.4 -04 17 49. 1950 Ko,Ku (1999) 19 22 01.84 -04 12 03.3 +045-01.1 * K 3-33 19 20 04.8 +10 35 36. 1950 CGPN/Ko 65b * 19 22 26.81 +10 41 24.0 +045-01.1 * K 3-33 19 20 04.2 +10 35 36. 1950 30.135.052 19 22 26.21 +10 41 24.0 +045-01.1 * K 3-33 19 20 04.66 +10 35 33.4 1950 52.002.003 19 22 26.67 +10 41 21.4 +045-01.1 * K 3-33 19 20 04.7 +10 35 34. 1950 70.002.006 19 22 26.71 +10 41 22.0 +045-01.1 * K 3-33 19 22 26.75 +10 41 21.2 2000 70.002.006 rad 19 22 26.75 +10 41 21.2 +037-06.1 NGC 6790 19 17 52.79 +01 19 17.4 1900 CGPN/Bs 11 19 22 57.11 +01 30 46.5 +037-06.1 NGC 6790 19 19 21.1 +01 22 32.2 1929 CGPN/Sr 30 19 22 57.17 +01 30 45.7 +037-06.1 NGC 6790 19 20 24.5 +01 25 02. 1950 09.133.025 19 22 56.68 +01 30 51.7 +037-06.1 NGC 6790 19 20 24.77 +01 24 56.9 1950 37.134.035 19 22 56.95 +01 30 46.6 +037-06.1 NGC 6790 19 20 24.77 +01 24 56.9 1950 52.002.003 19 22 56.95 +01 30 46.6 +037-06.1 NGC 6790 19 20 24.7 +01 24 58. 1950 70.002.006 19 22 56.88 +01 30 47.7 +037-06.1 NGC 6790 19 22 56.95 +01 30 47.2 2000 70.002.006 rad 19 22 56.95 +01 30 47.2 +037-06.1 NGC 6790 19 20 24.86 +01 24 57.5 1950 GSC 0465-00361 19 22 57.04 +01 30 47.2 +037-06.1 NGC 6790 19 20 24.8 +01 24 56. 1950 IRAS19204+0124 19 22 56.98 +01 30 45.7 +046-01.1 * PN 1920+1122 19 20 29.3 +11 22 06. 1950 66.134.003 19 22 50.44 +11 27 55.6 +046-01.1 * PN 1920+1122 19 20 29.1 +11 22 09. 1950 66.134.003 rad 19 22 50.24 +11 27 58.6 +046-01.1 * PN 1920+1122 19 20 29.3 +11 22 06. 1950 Ko,Ku (1999) 19 22 50.44 +11 27 55.6 +046-01.1 * PN 1920+1122 19 20 29.1 +11 22 03. 1950 IRAS19204+1122 19 22 50.24 +11 27 52.6 +053+01.1 * KLSS 1-1 19 20 42.3 +18 36 23. 1950 63.134.060 19 22 54.95 +18 42 13.2 +053+01.1 * KLSS 1-1 19 22 54.9 +18 42 13. 2000 66.134.013 19 22 54.9 +18 42 13. +053+01.1 * KLSS 1-1 19 20 42.5 +18 36 17. 1950 Ko,Ku (1999) 19 22 55.15 +18 42 07.2 +055+02.1 He 2-432 19 21 15.2 +21 02 11. 1950 CGPN/Ko 65a 19 23 24.87 +21 08 03.4 +055+02.1 He 2-432 19 21 15.1 +21 02 07.8 1950 11.133.011 19 23 24.77 +21 08 00.2 +055+02.1 He 2-432 19 21 14.8 +21 02 10.8 1950 11.133.011 19 23 24.47 +21 08 03.1 +055+02.1 He 2-432 19 21 14.8 +21 02 21. 1950 18.133.025 19 23 24.46 +21 08 13.3 +055+02.1 He 2-432 19 21 15.13 +21 02 08.1 1950 37.134.035 19 23 24.80 +21 08 00.5 +055+02.1 He 2-432 19 21 15.13 +21 02 08.1 1950 52.002.003 19 23 24.80 +21 08 00.5 +055+02.1 He 2-432 19 21 15.1 +21 02 08. 1950 62.134.030 19 23 24.77 +21 08 00.4 +055+02.1 He 2-432 19 21 15.1 +21 02 08. 1950 70.002.006 19 23 24.77 +21 08 00.4 +055+02.1 He 2-432 19 23 24.83 +21 08 00.4 2000 70.002.006 rad 19 23 24.83 +21 08 00.4 +055+02.1 He 2-432 19 21 15.2 +21 02 07. 1950 IRAS19212+2102 19 23 24.87 +21 07 59.4 +055+02.2 He 1-1 19 21 37.1 +21 00 46. 1950 CGPN/Koal 65 19 23 46.81 +21 06 39.9 +055+02.2 He 1-1 19 21 37.1 +21 00 46. 1950 09.133.025 19 23 46.81 +21 06 39.9 +055+02.2 He 1-1 19 21 37.1 +21 00 44. 1950 50.134.178 19 23 46.81 +21 06 37.9 +055+02.2 He 1-1 19 21 37.3 +21 00 44. 1950 70.002.006 19 23 47.01 +21 06 37.9 +055+02.2 He 1-1 19 23 46.78 +21 06 37.9 2000 70.002.006 rad 19 23 46.78 +21 06 37.9 +055+02.2 He 1-1 19 21 37.8 +21 00 46. 1950 IRAS19216+2100 19 23 47.51 +21 06 39.9 +059+04.1 K 3-34 19 21 58.5 +25 12 54. 1950 CGPN/Ko 65b * 19 24 02.80 +25 18 49.1 +059+04.1 K 3-34 19 21 58.5 +25 12 53. 1950 70.002.006 19 24 02.80 +25 18 48.1 +059+04.1 K 3-34 19 24 02.80 +25 18 33.0 2000 70.002.006 rad 19 24 02.80 +25 18 33.0 +045-02.1 Vy 2-2 19 21 59. +09 47 59. 1950 CGPN/Mi 59 19 24 21.94 +09 53 54.8 +045-02.1 Vy 2-2 19 21 59.0 +09 47 59. 1950 09.133.025 19 24 21.94 +09 53 54.8 +045-02.1 Vy 2-2 19 21 59.30 +09 48 00.1 1950 20.041.026 19 24 22.24 +09 53 55.9 +045-02.1 Vy 2-2 19 21 59.3 +09 48 00. 1950 31.116.001 19 24 22.24 +09 53 55.8 +045-02.1 Vy 2-2 19 21 59.3 +09 48 00. 1950 49.134.023 19 24 22.24 +09 53 55.8 +045-02.1 Vy 2-2 19 21 59.26 +09 48 00.4 1950 63.134.081 19 24 22.20 +09 53 56.2 +045-02.1 Vy 2-2 19 21 59.4 +09 48 00. 1950 70.002.006 19 24 22.34 +09 53 55.9 +045-02.1 Vy 2-2 19 24 22.21 +09 53 58.2 2000 70.002.006 rad 19 24 22.21 +09 53 58.2 +045-02.1 Vy 2-2 19 24 22.22 +09 53 56.8 2000 70.134.064 19 24 22.22 +09 53 56.8 +045-02.1 Vy 2-2 19 21 59.1 +09 47 58. 1950 IRAS19219+0947 19 24 22.04 +09 53 53.8 +051+00.1 KLW 1 19 25 40.5 +16 33 05. 2000 66.134.013 * 19 25 40.5 +16 33 05. +051+00.1 KLW 1 19 23 25.4 +16 27 02. 1950 Ko,Ku (1999) 19 25 40.72 +16 33 03.4 +051+00.1 KLW 1 19 23 25.6 +16 27 03. 1950 IRAS19234+1627 19 25 40.92 +16 33 04.5 +048-01.1 * DeHt 4 19 24 07.3 +13 13 38. 1950 27.135.032 * 19 26 26.39 +13 19 42.4 +048-01.1 * DeHt 4 19 24 08.6 +13 13 31. 1950 70.002.006 19 26 27.70 +13 19 35.5 +048-01.1 * DeHt 4 19 24 07.7 +13 13 28. 1950 Ko,Ku (1999) 19 26 26.80 +13 19 32.4 +031-10.1 M 3-34 19 24 22. -06 41 10. 1950 CGPN/Mi 59 19 27 03.02 -06 35 03.8 +031-10.1 M 3-34 19 24 20.7 -06 41 00. 1950 18.133.025 19 27 01.72 -06 34 53.9 +031-10.1 M 3-34 19 24 20.9 -06 41 11. 1950 50.134.178 19 27 01.92 -06 35 04.9 +031-10.1 M 3-34 19 24 20.9 -06 41 09. 1950 70.002.006 19 27 01.92 -06 35 02.9 +031-10.1 M 3-34 19 27 01.91 -06 35 07.1 2000 70.002.006 rad 19 27 01.91 -06 35 07.1 +031-10.1 M 3-34 19 24 20.3 -06 41 14. 1950 IRAS19243-0641 19 27 01.32 -06 35 07.9 +055+02.3 He 1-2 19 24 28.0 +21 03 23. 1950 CGPN/Ko 65a 19 26 37.77 +21 09 28.5 +055+02.3 He 1-2 19 24 28.0 +21 03 30. 1950 18.133.025 19 26 37.77 +21 09 35.5 +055+02.3 He 1-2 19 24 28.0 +21 03 21. 1950 50.134.178 19 26 37.77 +21 09 26.5 +055+02.3 He 1-2 19 24 27.9 +21 03 21. 1950 70.002.006 19 26 37.67 +21 09 26.5 +055+02.3 He 1-2 19 26 37.60 +21 09 28.5 2000 70.002.006 rad 19 26 37.60 +21 09 28.5 +055+02.3 He 1-2 19 24 27.6 +21 03 19. 1950 IRAS19244+2103 19 26 37.37 +21 09 24.5 +055+01.1 KLSS 1-2 19 24 29.4 +20 23 15. 1950 63.134.060 19 26 40.00 +20 29 20.6 +055+01.1 KLSS 1-2 19 26 39.9 +20 29 21. 2000 66.134.013 19 26 39.9 +20 29 21. +055+01.1 KLSS 1-2 19 24 29.7 +20 23 07. 1950 Ko,Ku (1999) 19 26 40.30 +20 29 12.6 +046-03.1 PB 9 19 25 22.3 +10 18 12. 1950 CGPN/Ko 65a 19 27 44.73 +10 24 21.6 +046-03.1 PB 9 19 25 22.3 +10 18 15. 1950 18.133.025 19 27 44.73 +10 24 24.6 +046-03.1 PB 9 19 25 22.35 +10 18 11.0 1950 52.002.003 19 27 44.78 +10 24 20.6 +046-03.1 PB 9 19 25 22.4 +10 18 11. 1950 70.002.006 19 27 44.83 +10 24 20.6 +046-03.1 PB 9 19 27 44.82 +10 24 19.5 2000 70.002.006 rad 19 27 44.82 +10 24 19.5 +046-03.1 PB 9 19 25 21.7 +10 18 10. 1950 IRAS19253+1018 19 27 44.13 +10 24 19.6 +056+02.1 K 3-35 19 25 34.6 +21 23 55. 1950 CGPN/Ko 65b 19 27 43.99 +21 30 05.0 +056+02.1 K 3-35 19 25 35.0 +21 23 55. 1950 18.133.025 19 27 44.39 +21 30 05.0 +056+02.1 K 3-35 19 25 34.63 +21 23 53.5 1950 52.002.003 19 27 44.02 +21 30 03.5 +056+02.1 K 3-35 19 25 34.6 +21 23 56. 1950 70.002.006 19 27 43.99 +21 30 06.0 +056+02.1 K 3-35 19 27 44.04 +21 30 06.2 2000 70.002.006 rad 19 27 44.04 +21 30 06.2 +056+02.1 K 3-35 19 25 34.3 +21 23 52. 1950 IRAS19255+2123 19 27 43.69 +21 30 02.0 +048-02.1 PB 10 19 25 54.1 +12 13 28. 1950 CGPN/Ko 65a 19 28 14.38 +12 19 39.7 +048-02.1 PB 10 19 25 54.4 +12 13 35. 1950 18.133.025 19 28 14.68 +12 19 46.7 +048-02.1 PB 10 19 25 54.15 +12 13 25.1 1950 52.002.003 19 28 14.43 +12 19 36.8 +048-02.1 PB 10 19 25 54.2 +12 13 23. 1950 70.002.006 19 28 14.48 +12 19 34.7 +048-02.1 PB 10 19 28 14.40 +12 19 35.8 2000 70.002.006 rad 19 28 14.40 +12 19 35.8 +048-02.1 PB 10 19 25 54.3 +12 13 26. 1950 St,Sa (1977) 19 28 14.58 +12 19 37.7 +048-02.1 PB 10 19 25 53.8 +12 13 21. 1950 IRAS19258+1213 19 28 14.08 +12 19 32.7 +320-28.1 He 2-434 19 27 33.2 -74 39 25. 1950 18.133.025 19 33 50.92 -74 32 58.5 +320-28.1 He 2-434 19 27 32.4 -74 39 26. 1950 Ko,Ku (1999) 19 33 50.13 -74 32 59.6 +320-28.1 He 2-434 19 27 30.9 -74 39 26. 1950 IRAS19275-7439 19 33 48.64 -74 32 59.7 +050-01.1 * K 4-28 19 27 59.1 +14 41 04. 1950 CGPN/Ko 65b 19 30 16.62 +14 47 24.0 +050-01.1 * K 4-28 19 27 58.7 +14 40 57. 1950 30.135.052 19 30 16.22 +14 47 17.0 +050-01.1 * K 4-28 19 27 59.12 +14 41 01.7 1950 52.002.003 19 30 16.64 +14 47 21.7 +050-01.1 * K 4-28 19 27 58.9 +14 41 01. 1950 70.002.006 19 30 16.42 +14 47 21.0 +050-01.1 * K 4-28 19 30 16.76 +14 47 25.2 2000 70.002.006 rad 19 30 16.76 +14 47 25.2 +050-01.1 * K 4-28 19 27 59.4 +14 41 01. 1950 IRAS19279+1441 19 30 16.92 +14 47 21.1 +034-10.1 * HtDe 11 19 28 29.2 -03 48 47. 1950 43.134.029 19 31 07.04 -03 42 24.2 +034-10.1 * HtDe 11 19 28 29.4 -03 48 55. 1950 70.002.006 19 31 07.24 -03 42 32.2 +034-10.1 * HtDe 11 19 28 29.5 -03 48 55. 1950 Ko,Ku (1999) 19 31 07.34 -03 42 32.2 +004-22.1 He 2-436 19 28 50.9 -34 19 22. 1950 08.114.108 * 19 32 06.71 -34 12 56.4 +004-22.1 He 2-436 19 28 51.5 -34 18 59. 1950 09.133.025 19 32 07.30 -34 12 33.4 +004-22.1 He 2-436 19 28 51.0 -34 19 24. 1950 70.002.006 19 32 06.81 -34 12 58.4 +004-22.1 He 2-436 19 28 51.04 -34 19 23.0 1950 GSC 7433-01939 19 32 06.85 -34 12 57.4 +004-22.1 He 2-436 19 28 50.1 -34 19 27. 1950 IRAS19288-3419 19 32 05.92 -34 13 01.5 +046-04.1 NGC 6803 19 27 53.6 +09 54 20.4 1929 CGPN/Sr 30 19 31 16.48 +10 03 22.7 +046-04.1 NGC 6803 19 28 53.5 +09 57 00. 1950 09.133.025 19 31 16.40 +10 03 23.9 +046-04.1 NGC 6803 19 28 53.39 +09 56 57.8 1950 37.134.035 19 31 16.29 +10 03 21.7 +046-04.1 NGC 6803 19 28 53.7 +09 57 00. 1950 70.002.006 19 31 16.60 +10 03 23.9 +046-04.1 NGC 6803 19 31 16.47 +10 03 21.6 2000 70.002.006 rad 19 31 16.47 +10 03 21.6 +046-04.1 NGC 6803 19 28 53.69 +09 56 57.9 1950 GSC 1059-01140 19 31 16.59 +10 03 21.8 +046-04.1 NGC 6803 19 28 54.3 +09 56 57. 1950 IRAS19289+0956 19 31 17.20 +10 03 21.0 +045-04.1 NGC 6804 19 26 39.44 +09 00 28.8 1897 CGPN/We 03 * 19 31 35.64 +09 13 31.7 +045-04.1 NGC 6804 19 25 50.24 +08 58 22.0 1880 CGPN/Wn 09 19 31 35.32 +09 13 30.2 +045-04.1 NGC 6804 19 26 47.81 +09 00 50.4 1900 CGPN/Lo 11 19 31 35.38 +09 13 31.1 +045-04.1 NGC 6804 19 26 48.59 +09 01 01.8 1900 CGPN/Re 15 19 31 36.15 +09 13 42.6 +045-04.1 NGC 6804 19 26 47.75 +09 00 51.2 1900 CGPN/Re 15 19 31 35.32 +09 13 31.9 +045-04.1 NGC 6804 19 26 47.88 +09 00 47.7 1900 CGPN/Si 27 19 31 35.45 +09 13 28.4 +045-04.1 NGC 6804 19 29 12.0 +09 07 13. 1950 09.133.025 19 31 35.82 +09 13 38.2 +045-04.1 NGC 6804 19 29 11.6 +09 06 58.5 1950 11.133.011 19 31 35.42 +09 13 23.7 +045-04.1 NGC 6804 19 29 11.4 +09 07 06. 1950 70.002.006 19 31 35.22 +09 13 31.1 +045-04.1 NGC 6804 19 31 35.14 +09 13 30.2 2000 70.002.006 rad 19 31 35.14 +09 13 30.2 +045-04.1 NGC 6804 19 29 11.6 +09 07 06. 1950 IRAS19291+0907 19 31 35.42 +09 13 31.2 +044-05.1 K 3-36 19 30 13.7 +07 21 25. 1950 CGPN/Ko 65b 19 32 39.47 +07 27 54.4 +044-05.1 K 3-36 19 30 13.1 +07 21 29. 1950 30.135.052 19 32 38.87 +07 27 58.4 +044-05.1 K 3-36 19 30 13.7 +07 21 24. 1950 70.002.006 19 32 39.47 +07 27 53.4 +044-05.1 K 3-36 19 32 39.50 +07 27 53.0 2000 70.002.006 rad 19 32 39.50 +07 27 53.0 +044-05.1 K 3-36 19 30 13.9 +07 21 23. 1950 IRAS19302+0721 19 32 39.67 +07 27 52.4 +061+03.1 He 2-437 19 30 54.9 +26 46 13. 1950 CGPN/Ko 65a 19 32 57.58 +26 52 44.4 +061+03.1 He 2-437 19 30 54.9 +26 46 13. 1950 18.133.025 19 32 57.58 +26 52 44.4 +061+03.1 He 2-437 19 30 54.9 +26 46 13. 1950 70.002.006 19 32 57.58 +26 52 44.4 +061+03.1 He 2-437 19 32 57.59 +26 52 45.2 2000 70.002.006 rad 19 32 57.59 +26 52 45.2 +061+03.1 He 2-437 19 30 55.1 +26 46 11. 1950 Ko,Ku (1999) 19 32 57.78 +26 52 42.4 +061+03.1 He 2-437 19 30 54.6 +26 46 09. 1950 IRAS19309+2646 19 32 57.28 +26 52 40.3 +047-04.1 A 62 19 30 56.2 +10 30 43. 1950 18.133.025 * 19 33 18.51 +10 37 15.1 +047-04.1 A 62 19 30 56.0 +10 30 29. 1950 34.134.010 19 33 18.32 +10 37 01.1 +047-04.1 A 62 19 30 56.0 +10 30 32. 1950 70.002.006 19 33 18.32 +10 37 04.1 +047-04.1 A 62 19 33 16.70 +10 36 55.0 2000 70.002.006 rad 19 33 16.70 +10 36 55.0 +057+01.1 * K 4-30 19 31 01.2 +22 52 02. 1950 CGPN/Ko 65b 19 33 08.98 +22 58 34.0 +057+01.1 * K 4-30 19 31 00.7 +22 52 02. 1950 30.135.052 19 33 08.48 +22 58 33.9 +057+01.1 * K 4-30 19 31 01.22 +22 52 01.7 1950 52.002.003 19 33 09.00 +22 58 33.7 +057+01.1 * K 4-30 19 33 09.1 +22 58 34. 2000 72.002.012 19 33 09.1 +22 58 34. +057+01.1 * K 4-30 19 31 01.29 +22 52 02.6 1950 72.002.012 rad 19 33 09.07 +22 58 34.6 +057+01.1 * K 4-30 19 31 01.2 +22 52 01. 1950 IRAS19310+2252 19 33 08.98 +22 58 33.0 +059+02.1 K 3-37 19 31 40.9 +24 25 54. 1950 CGPN/Ko 65b 19 33 46.71 +24 32 28.6 +059+02.1 K 3-37 19 31 41.0 +24 25 54. 1950 18.133.025 19 33 46.81 +24 32 28.6 +059+02.1 K 3-37 19 31 40.92 +24 25 52.5 1950 52.002.003 19 33 46.73 +24 32 27.1 +059+02.1 K 3-37 19 31 40.9 +24 25 53. 1950 70.002.006 19 33 46.71 +24 32 27.6 +059+02.1 K 3-37 19 33 46.70 +24 32 26.7 2000 70.002.006 rad 19 33 46.70 +24 32 26.7 +059+02.1 K 3-37 19 31 40.5 +24 25 48. 1950 IRAS19316+2425 19 33 46.31 +24 32 22.5 +042-06.1 NGC 6807 19 31 04.1 +05 31 40.3 1929 CGPN/Sr 30 19 34 33.86 +05 41 01.1 +042-06.1 NGC 6807 19 32 06.0 +05 34 28. 1950 09.133.025 19 34 33.73 +05 41 05.0 +042-06.1 NGC 6807 19 32 05.4 +05 34 32. 1950 30.135.052 19 34 33.13 +05 41 08.9 +042-06.1 NGC 6807 19 32 05.78 +05 34 25.6 1950 37.134.035 19 34 33.52 +05 41 02.6 +042-06.1 NGC 6807 19 32 05.79 +05 34 25.5 1950 52.002.003 19 34 33.53 +05 41 02.5 +042-06.1 NGC 6807 19 32 05.8 +05 34 26. 1950 70.002.006 19 34 33.54 +05 41 03.0 +042-06.1 NGC 6807 19 34 33.41 +05 41 02.2 2000 70.002.006 rad 19 34 33.41 +05 41 02.2 +042-06.1 NGC 6807 19 32 05.8 +05 34 25. 1950 IRAS19320+0534 19 34 33.54 +05 41 02.0 +064+05.1 BD+30 3639 19 31 58.3 +30 21 35.9 1929 CGPN/Sr 30 19 34 45.43 +30 30 59.8 +064+05.1 BD+30 3639 19 32 47.53 +30 24 20.6 1950 CGPN/AGK2 19 34 45.26 +30 30 59.3 +064+05.1 BD+30 3639 19 32 47.6 +30 24 17. 1950 CGPN/Koal 65 19 34 45.33 +30 30 55.7 +064+05.1 BD+30 3639 19 32 47.50 +30 24 20.6 1950 11.133.008 19 34 45.23 +30 30 59.3 +064+05.1 BD+30 3639 19 32 47.49 +30 24 20.3 1950 12.133.017 19 34 45.22 +30 30 59.0 +064+05.1 BD+30 3639 19 32 47.5 +30 24 20. 1950 41.134.007 19 34 45.23 +30 30 58.7 +064+05.1 BD+30 3639 19 32 47.5 +30 24 22. 1950 70.002.006 19 34 45.23 +30 31 00.7 +064+05.1 BD+30 3639 19 34 45.18 +30 30 59.2 2000 70.002.006 rad 19 34 45.18 +30 30 59.2 +064+05.1 BD+30 3639 19 34 45.23 +30 30 59.9 2000 AC 1033370 19 34 45.23 +30 30 59.9 +064+05.1 BD+30 3639 19 32 47.55 +30 24 20.3 1950 AGK3+30 1906 19 34 45.28 +30 30 59.0 +064+05.1 BD+30 3639 19 34 45.24 +30 30 59.0 2000 HIP 096295 19 34 45.24 +30 30 59.0 +064+05.1 BD+30 3639 19 32 47.5 +30 24 21. 1950 LSII+30 04 19 34 45.23 +30 30 59.7 +064+05.1 BD+30 3639 19 34 45.33 +30 30 58.6 2000 PPM 083157 19 34 45.33 +30 30 58.6 +064+05.1 BD+30 3639 19 32 47.2 +30 24 18. 1950 IRAS19327+3024 19 34 44.93 +30 30 56.7 +053-01.1 K 3-38 19 33 03.4 +17 06 22. 1950 CGPN/Ko 65b 19 35 18.27 +17 13 02.4 +053-01.1 K 3-38 19 33 03.46 +17 06 20.4 1950 37.134.035 19 35 18.33 +17 13 00.8 +053-01.1 K 3-38 19 33 03.4 +17 06 20. 1950 50.134.178 19 35 18.27 +17 13 00.4 +053-01.1 K 3-38 19 33 03.4 +17 06 22. 1950 70.002.006 19 35 18.27 +17 13 02.4 +053-01.1 K 3-38 19 35 18.35 +17 12 59.8 2000 70.002.006 rad 19 35 18.35 +17 12 59.8 +053-01.1 K 3-38 19 33 03.3 +17 06 19. 1950 IRAS19330+1706 19 35 18.17 +17 12 59.4 +034-11.1 * PN 1933-0400 19 33 39.6 -04 00 08. 1950 66.134.003 19 36 17.60 -03 53 24.4 +034-11.1 * PN 1933-0400 19 33 39.5 -04 00 00. 1950 66.134.003 rad 19 36 17.50 -03 53 16.4 +034-11.1 * PN 1933-0400 19 36 17.6 -03 53 26. 2000 72.002.012 19 36 17.6 -03 53 26. +034-11.1 * PN 1933-0400 19 33 39.50 -04 00 12.1 1950 72.002.012 rad 19 36 17.50 -03 53 28.5 +034-11.1 * PN 1933-0400 19 33 39.7 -04 00 10. 1950 Ko,Ku (1999) 19 36 17.70 -03 53 26.4 +034-11.1 * PN 1933-0400 19 33 39.5 -04 00 09. 1950 IRAS19336-0400 19 36 17.50 -03 53 25.4 +059+02.2 K 3-39 19 33 49.0 +24 48 10. 1950 CGPN/Ko 65b 19 35 54.44 +24 54 53.1 +059+02.2 K 3-39 19 33 49.0 +24 48 10. 1950 18.133.025 19 35 54.44 +24 54 53.1 +059+02.2 K 3-39 19 33 48.98 +24 48 07.2 1950 52.002.003 19 35 54.42 +24 54 50.3 +059+02.2 K 3-39 19 33 49.0 +24 48 08. 1950 70.002.006 19 35 54.44 +24 54 51.1 +059+02.2 K 3-39 19 35 54.73 +24 54 48.8 2000 70.002.006 rad 19 35 54.73 +24 54 48.8 +059+02.2 K 3-39 19 33 49.3 +24 48 08. 1950 IRAS19338+2448 19 35 54.74 +24 54 51.1 +058+01.1 K 3-40 19 34 14.7 +23 33 05. 1950 CGPN/Ko 65b 19 36 21.77 +23 39 49.9 +058+01.1 K 3-40 19 34 14.7 +23 33 05. 1950 30.135.052 19 36 21.77 +23 39 49.9 +058+01.1 K 3-40 19 34 14.75 +23 33 02.8 1950 52.002.003 19 36 21.82 +23 39 47.7 +058+01.1 K 3-40 19 34 14.8 +23 33 04. 1950 70.002.006 19 36 21.87 +23 39 48.9 +058+01.1 K 3-40 19 36 21.85 +23 39 49.4 2000 70.002.006 rad 19 36 21.85 +23 39 49.4 +058+01.1 K 3-40 19 34 15.0 +23 33 03. 1950 IRAS19342+2333 19 36 22.07 +23 39 47.9 +055-00.1 M 1-71 19 34 15. +19 35 39. 1950 CGPN/Mi 59 19 36 26.96 +19 42 24.1 +055-00.1 M 1-71 19 34 16.0 +19 35 38. 1950 CGPN/Koal 65 19 36 27.96 +19 42 23.1 +055-00.1 M 1-71 19 34 14.6 +19 35 45. 1950 18.133.025 19 36 26.56 +19 42 30.0 +055-00.1 M 1-71 19 34 15.0 +19 35 39. 1950 50.134.178 19 36 26.96 +19 42 24.1 +055-00.1 M 1-71 19 34 14.96 +19 35 39.0 1950 52.002.040 19 36 26.92 +19 42 24.1 +055-00.1 M 1-71 19 34 14.9 +19 35 39. 1950 70.002.006 19 36 26.86 +19 42 24.1 +055-00.1 M 1-71 19 36 26.96 +19 42 24.6 2000 70.002.006 rad 19 36 26.96 +19 42 24.6 +055-00.1 M 1-71 19 34 15.07 +19 35 38.3 1950 GSC 1610-01301 19 36 27.03 +19 42 23.4 +055-00.1 M 1-71 19 34 14.5 +19 35 35. 1950 IRAS19342+1935 19 36 26.46 +19 42 20.0 +053-02.1 WiOl 1 19 35 12.6 +16 46 42. 1950 57.125.025 * 19 37 27.93 +16 53 31.0 +053-02.1 WiOl 1 19 35 12.5 +16 47 06. 1950 Ko,Ku (1999) 19 37 27.82 +16 53 55.0 +060+01.1 He 2-440 19 36 03.2 +25 08 51. 1950 CGPN/Ko 65a 19 38 08.32 +25 15 43.0 +060+01.1 He 2-440 19 36 03.5 +25 09 00. 1950 30.135.052 19 38 08.61 +25 15 52.0 +060+01.1 He 2-440 19 36 03.24 +25 08 48.9 1950 52.002.003 19 38 08.36 +25 15 40.9 +060+01.1 He 2-440 19 36 03.3 +25 08 50. 1950 70.002.006 19 38 08.42 +25 15 42.0 +060+01.1 He 2-440 19 38 08.36 +25 15 41.1 2000 70.002.006 rad 19 38 08.36 +25 15 41.1 +060+01.1 He 2-440 19 36 03.2 +25 08 46. 1950 IRAS19360+2508 19 38 08.32 +25 15 38.0 +060+01.2 IRAS19367+2458 19 36 46.6 +24 58 43. 1950 70.002.006 19 38 51.98 +25 05 37.9 +060+01.2 IRAS19367+2458 19 36 46.7 +24 58 42. 1950 Ko,Ku (1999) 19 38 52.08 +25 05 36.9 +060+01.2 IRAS19367+2458 19 36 47.0 +24 58 37. 1950 IRAS19367+2458 19 38 52.38 +25 05 31.9 +052-02.2 Me 1-1 19 36 53.3 +15 49 50. 1950 CGPN/Fc 62 19 39 09.78 +15 56 45.7 +052-02.2 Me 1-1 19 36 53.5 +15 49 52. 1950 CGPN/Koal 65 19 39 09.98 +15 56 47.8 +052-02.2 Me 1-1 19 36 53.5 +15 49 54. 1950 09.133.025 19 39 09.98 +15 56 49.8 +052-02.2 Me 1-1 19 36 53.3 +15 49 52. 1950 50.134.178 19 39 09.78 +15 56 47.7 +052-02.2 Me 1-1 19 36 53.4 +15 49 49. 1950 70.002.006 19 39 09.88 +15 56 44.7 +052-02.2 Me 1-1 19 39 09.82 +15 56 49.3 2000 70.002.006 rad 19 39 09.82 +15 56 49.3 +052-02.2 Me 1-1 19 36 53.3 +15 49 52. 1950 IRAS19368+1549 19 39 09.78 +15 56 47.7 +052-02.1 K 3-41 19 36 59.8 +16 13 55. 1950 CGPN/Ko 65b * 19 39 15.82 +16 20 51.2 +052-02.1 K 3-41 19 37 00.0 +16 13 49. 1950 09.133.025 19 39 16.02 +16 20 45.2 +052-02.1 K 3-41 19 37 02.41 +16 14 20.8 1950 52.002.003 19 39 18.42 +16 21 17.1 +052-02.1 K 3-41 19 36 59.8 +16 13 53. 1950 70.002.006 19 39 15.82 +16 20 49.2 +052-02.1 K 3-41 19 39 15.80 +16 20 51.0 2000 70.002.006 rad 19 39 15.80 +16 20 51.0 +052-02.1 K 3-41 19 37 00.2 +16 13 55. 1950 IRAS19370+1613 19 39 16.22 +16 20 51.2 +056-00.1 K 3-42 19 37 24.5 +20 12 07. 1950 CGPN/Ko 65b 19 39 35.86 +20 19 04.6 +056-00.1 K 3-42 19 37 24.5 +20 12 07. 1950 30.135.052 19 39 35.86 +20 19 04.6 +056-00.1 K 3-42 19 37 24.41 +20 12 04.4 1950 52.002.003 19 39 35.77 +20 19 02.0 +056-00.1 K 3-42 19 37 24.4 +20 12 04. 1950 70.002.006 19 39 35.76 +20 19 01.6 +056-00.1 K 3-42 19 39 35.99 +20 19 03.3 2000 70.002.006 rad 19 39 35.99 +20 19 03.3 +056-00.1 K 3-42 19 37 23.7 +20 12 02. 1950 IRAS19373+2012 19 39 35.06 +20 18 59.6 +019-19.1 * K 2-7 19 37 32.6 -20 34 05. 1950 70.002.006 19 40 29.08 -20 27 05.3 +019-19.1 * K 2-7 19 37 32.8 -20 34 06. 1950 Ko,Ku (1999) 19 40 29.28 -20 27 06.3 +061+02.1 * He 2-442 19 37 35. +26 23 39. 1950 CGPN/Mi 59 * 19 39 38.57 +26 30 37.1 +061+02.1 * He 2-442 19 37 40.1 +26 22 48. 1950 18.133.025 19 39 43.69 +26 29 46.4 +061+02.1 * He 2-442 19 37 39.74 +26 22 34.7 1950 52.002.003 19 39 43.34 +26 29 33.1 +061+02.1 * He 2-442 19 37 39.7 +26 22 36. 1950 70.002.006 19 39 43.30 +26 29 34.4 +061+02.1 * He 2-442 19 37 39.7 +26 22 33. 1950 IRAS19376+2622 19 39 43.30 +26 29 31.4 +055-01.1 K 3-43 19 38 12.3 +18 42 14. 1950 CGPN/Ko 65b 19 40 25.48 +18 49 14.9 +055-01.1 K 3-43 19 38 12.0 +18 42 18. 1950 30.135.052 19 40 25.18 +18 49 18.8 +055-01.1 K 3-43 19 38 12.6 +18 42 12. 1950 70.002.006 19 40 25.78 +18 49 12.9 +055-01.1 K 3-43 19 40 26.00 +18 49 15.0 2000 70.002.006 rad 19 40 26.00 +18 49 15.0 +055-01.1 K 3-43 19 38 13.1 +18 42 11. 1950 IRAS19382+1842 19 40 26.29 +18 49 11.9 +051-03.1 M 1-73 19 38 52. +14 50 07. 1950 CGPN/Mi 59 19 41 09.68 +14 57 10.6 +051-03.1 M 1-73 19 38 51.6 +14 49 50. 1950 CGPN/Fc 62 19 41 09.28 +14 56 53.6 +051-03.1 M 1-73 19 38 51.4 +14 49 50. 1950 18.133.025 19 41 09.08 +14 56 53.6 +051-03.1 M 1-73 19 38 51.62 +14 49 55.4 1950 37.134.035 19 41 09.30 +14 56 59.0 +051-03.1 M 1-73 19 38 51.6 +14 49 55. 1950 50.134.178 19 41 09.28 +14 56 58.6 +051-03.1 M 1-73 19 38 51.5 +14 49 55. 1950 70.002.006 19 41 09.18 +14 56 58.6 +051-03.1 M 1-73 19 41 09.30 +14 56 59.3 2000 70.002.006 rad 19 41 09.30 +14 56 59.3 +051-03.1 M 1-73 19 38 51.4 +14 49 52. 1950 IRAS19388+1449 19 41 09.08 +14 56 55.6 +054-02.1 M 1-72 19 39 20. +17 38 16. 1950 CGPN/Mi 59 19 41 34.48 +17 45 21.4 +054-02.1 M 1-72 19 39 19.6 +17 38 09. 1950 CGPN/Koal 65 19 41 34.08 +17 45 14.4 +054-02.1 M 1-72 19 39 19.3 +17 38 14. 1950 18.133.025 19 41 33.78 +17 45 19.3 +054-02.1 M 1-72 19 39 19.48 +17 38 12.2 1950 52.002.003 19 41 33.96 +17 45 17.5 +054-02.1 M 1-72 19 39 19.5 +17 38 15. 1950 70.002.006 19 41 33.98 +17 45 20.3 +054-02.1 M 1-72 19 41 34.15 +17 45 21.3 2000 70.002.006 rad 19 41 34.15 +17 45 21.3 +054-02.1 M 1-72 19 39 19.2 +17 38 10. 1950 IRAS19393+1738 19 41 33.68 +17 45 15.3 +051-04.1 PC 22 19 39 44.6 +13 43 32. 1950 CGPN/Ko 65a 19 42 03.55 +13 50 39.2 +051-04.1 PC 22 19 39 44.2 +13 43 32. 1950 18.133.025 19 42 03.15 +13 50 39.1 +051-04.1 PC 22 19 39 44.5 +13 43 32. 1950 70.002.006 19 42 03.45 +13 50 39.1 +051-04.1 PC 22 19 42 03.56 +13 50 37.5 2000 70.002.006 rad 19 42 03.56 +13 50 37.5 +051-04.1 PC 22 19 39 44.5 +13 43 30. 1950 IRAS19397+1343 19 42 03.45 +13 50 37.1 +053-03.1 A 63 19 39 55.2 +16 58 00. 1950 18.133.025 * 19 42 10.48 +17 05 07.7 +053-03.1 A 63 19 39 55.1 +16 58 06. 1950 70.002.006 19 42 10.38 +17 05 13.7 +053-03.1 A 63 19 42 10.09 +17 05 13.0 2000 70.002.006 rad 19 42 10.09 +17 05 13.0 +053-03.1 A 63 19 39 55.2 +16 58 07. 1950 Ko,Ku (1999) 19 42 10.48 +17 05 14.7 +052-04.1 M 1-74 19 40 01.3 +15 01 57. 1950 CGPN/Fc 62 19 42 18.79 +15 09 05.2 +052-04.1 M 1-74 19 40 01.3 +15 01 57. 1950 09.133.025 19 42 18.79 +15 09 05.2 +052-04.1 M 1-74 19 40 01.3 +15 01 57. 1950 20.041.026 19 42 18.79 +15 09 05.2 +052-04.1 M 1-74 19 40 00.8 +15 02 00. 1950 31.116.001 19 42 18.29 +15 09 08.2 +052-04.1 M 1-74 19 40 01.3 +15 02 00. 1950 50.134.178 19 42 18.79 +15 09 08.2 +052-04.1 M 1-74 19 40 01.2 +15 02 01. 1950 70.002.006 19 42 18.69 +15 09 09.2 +052-04.1 M 1-74 19 42 18.89 +15 09 11.9 2000 70.002.006 rad 19 42 18.89 +15 09 11.9 +052-04.1 M 1-74 19 40 02.2 +15 02 02. 1950 IRAS19400+1502 19 42 19.69 +15 09 10.3 +025-17.1 NGC 6818 19 36 04.24 -14 28 52.9 1860 CGPN/Pt 82 19 43 57.82 -14 09 06.5 +025-17.1 NGC 6818 19 37 12.11 -14 26 14.4 1880 CGPN/Wn 09 19 43 57.97 -14 09 12.1 +025-17.1 NGC 6818 19 38 19.63 -14 23 26.0 1900 CGPN/Po 10 19 43 57.79 -14 09 09.7 +025-17.1 NGC 6818 19 38 19.58 -14 23 28.4 1900 CGPN/Lo 11 19 43 57.74 -14 09 12.1 +025-17.1 NGC 6818 19 38 19.55 -14 23 28.7 1900 CGPN/Si 27 19 43 57.71 -14 09 12.4 +025-17.1 NGC 6818 19 41 09.0 -14 16 21. 1950 09.133.025 19 43 58.04 -14 09 07.3 +025-17.1 NGC 6818 19 41 08.8 -14 16 24. 1950 70.002.006 19 43 57.84 -14 09 10.3 +025-17.1 NGC 6818 19 43 57.75 -14 09 11.8 2000 70.002.006 rad 19 43 57.75 -14 09 11.8 +025-17.1 NGC 6818 19 41 08.1 -14 16 27. 1950 IRAS19411-1416 19 43 57.14 -14 09 13.3 +065+03.1 TuWe 1 19 41 49. +30 06 49. 1950 57.134.071 19 43 47.78 +30 14 03.6 +065+03.1 TuWe 1 19 43 47.3 +30 14 08. 2000 63.134.080 19 43 47.3 +30 14 08. +065+03.1 TuWe 1 19 43 47.9 +30 14 08. 2000 66.134.013 19 43 47.9 +30 14 08. +065+03.1 TuWe 1 19 41 49.4 +30 06 51. 1950 Ko,Ku (1999) 19 43 48.18 +30 14 05.7 +044-09.1 A 64 19 43 09.3 +05 27 19. 1950 CGPN/Ko 65a * 19 45 37.29 +05 34 39.9 +044-09.1 A 64 19 43 07.1 +05 26 35. 1950 18.133.025 19 45 35.10 +05 33 55.8 +044-09.1 A 64 19 43 07.0 +05 26 37. 1950 Ko,Ku (1999) 19 45 35.00 +05 33 57.8 +044-09.1 A 64 19 43 06.0 +05 26 36. 1950 IRAS19430+0526 19 45 34.00 +05 33 56.7 +057-01.1 He 2-447 19 43 11.7 +21 12 46. 1950 CGPN/Ko 65a 19 45 22.11 +21 20 06.5 +057-01.1 He 2-447 19 43 11.7 +21 12 46. 1950 30.135.052 19 45 22.11 +21 20 06.5 +057-01.1 He 2-447 19 43 11.74 +21 12 43.4 1950 52.002.003 19 45 22.16 +21 20 03.9 +057-01.1 He 2-447 19 43 11.9 +21 12 44. 1950 70.002.006 19 45 22.32 +21 20 04.5 +057-01.1 He 2-447 19 45 22.31 +21 20 02.8 2000 70.002.006 rad 19 45 22.31 +21 20 02.8 +057-01.1 He 2-447 19 43 12.0 +21 12 44. 1950 IRAS19431+2112 19 45 22.42 +21 20 04.5 +059-00.2 PN 1943+2251 19 43 25.9 +22 51 12. 1950 66.134.003 19 45 34.32 +22 58 33.3 +059-00.2 PN 1943+2251 19 43 25.8 +22 51 12. 1950 66.134.003 rad 19 45 34.22 +22 58 33.3 +059-00.2 PN 1943+2251 19 45 34.4 +22 58 33. 2000 72.002.012 19 45 34.4 +22 58 33. +059-00.2 PN 1943+2251 19 43 25.80 +22 51 12.0 1950 72.002.012 rad 19 45 34.22 +22 58 33.3 +059-00.2 PN 1943+2251 19 43 26.0 +22 51 12. 1950 Ko,Ku (1999) 19 45 34.42 +22 58 33.3 +059-00.2 PN 1943+2251 19 43 26.1 +22 51 12. 1950 IRAS19434+2251 19 45 34.52 +22 58 33.3 +083+12.1 NGC 6826 19 42 01.53 +50 16 35.4 1897 CGPN/We 03 19 44 48.43 +50 31 35.8 +083+12.1 NGC 6826 19 41 34.04 +50 14 06.7 1880 CGPN/Wn 09 19 44 48.49 +50 31 33.6 +083+12.1 NGC 6826 19 42 06.45 +50 16 57.2 1900 CGPN/Lo 11 19 44 48.49 +50 31 31.7 +083+12.1 NGC 6826 19 42 06.59 +50 16 59.2 1900 CGPN/Si 27 19 44 48.63 +50 31 33.7 +083+12.1 NGC 6826 19 43 27.16 +50 24 10.8 1950 CGPN/AGK2 19 44 48.21 +50 31 30.6 +083+12.1 NGC 6826 19 43 27.03 +50 24 10.4 1950 12.133.017 19 44 48.08 +50 31 30.2 +083+12.1 NGC 6826 19 43 27.2 +50 24 12. 1950 65.134.076 19 44 48.25 +50 31 31.8 +083+12.1 NGC 6826 19 43 27.1 +50 24 11. 1950 70.002.006 19 44 48.15 +50 31 30.8 +083+12.1 NGC 6826 19 44 48.19 +50 31 31.3 2000 70.002.006 rad 19 44 48.19 +50 31 31.3 +083+12.1 NGC 6826 19 43 27.11 +50 24 10.7 1950 AGK3+50 1416 19 44 48.16 +50 31 30.5 +083+12.1 NGC 6826 19 44 48.16 +50 31 30.3 2000 PPM 037732 19 44 48.16 +50 31 30.3 +083+12.1 NGC 6826 19 43 27.18 +50 24 11.8 1950 SAO 31951 19 44 48.23 +50 31 31.6 +083+12.1 NGC 6826 19 44 48.16 +50 31 30.3 2000 TYC 356502051 19 44 48.16 +50 31 30.3 +083+12.1 NGC 6826 19 43 27.9 +50 24 11. 1950 IRAS19434+5024 19 44 48.96 +50 31 30.9 +017-21.1 A 65 19 43 34.9 -23 15 35. 1950 02.133.027 * 19 46 34.36 -23 08 11.3 +017-21.1 A 65 19 43 33.2 -23 15 19. 1950 09.133.025 19 46 32.66 -23 07 55.5 +017-21.1 A 65 19 43 34.3 -23 15 36. 1950 34.134.010 19 46 33.76 -23 08 12.4 +017-21.1 A 65 19 43 34.4 -23 15 17. 1950 50.134.178 19 46 33.86 -23 07 53.4 +017-21.1 A 65 19 43 34.8 -23 15 38. 1950 70.002.006 19 46 34.26 -23 08 14.4 +017-21.1 A 65 19 46 34.40 -23 08 11.0 2000 70.002.006 rad 19 46 34.40 -23 08 11.0 +017-21.1 A 65 19 43 35.4 -23 15 38. 1950 IRAS19435-2315 19 46 34.86 -23 08 14.3 +060-00.1 K 3-45 19 44 08.7 +24 03 43. 1950 CGPN/Ko 65b 19 46 15.66 +24 11 07.1 +060-00.1 K 3-45 19 44 08.6 +24 03 40. 1950 70.002.006 19 46 15.56 +24 11 04.1 +059-01.1 He 1-3 19 46 16.7 +22 01 07. 1950 CGPN/Ko 65a * 19 48 26.30 +22 08 39.5 +059-01.1 He 1-3 old 19 46 15.5 +22 02 28. 1950 18.133.025 19 48 25.07 +22 10 00.4 +059-01.1 He 1-3 old 19 46 17.0 +22 01 03. 1950 70.002.006 19 48 26.60 +22 08 35.5 +059-01.1 He 1-3 old 19 48 26.46 +22 08 37.7 2000 70.002.006 rad 19 48 26.46 +22 08 37.7 +059-01.1 He 1-3 old 19 46 16.8 +22 01 03. 1950 Ko,Ku (1999) 19 48 26.40 +22 08 35.5 +059-01.1 He 1-3 old 19 46 15.8 +22 02 22. 1950 Ko,Ku (1999) 19 48 25.37 +22 09 54.4 +059-01.1 He 1-3 old 19 46 15.91 +22 02 24.6 1950 GSC 1627-00936 19 48 25.48 +22 09 57.1 +059-01.1 He 1-3 old 19 46 16.6 +22 01 02. 1950 IRAS19462+2201 19 48 26.20 +22 08 34.5 +059-01.2 We 1-8 19 46 43.2 +22 17 41. 1950 20.135.021 19 48 52.49 +22 25 15.2 +059-01.2 We 1-8 19 46 43.8 +22 17 40. 1950 Ko,Ku (1999) 19 48 53.09 +22 25 14.3 +066+02.2 KLW 4 19 49 59.0 +30 14 55. 2000 66.134.013 * 19 49 59.0 +30 14 55. +066+02.2 KLW 4 19 47 59.8 +30 07 14. 1950 Ko,Ku (1999) 19 49 59.03 +30 14 52.9 +069+03.1 K 3-46 19 48 06.0 +33 38 16. 1950 CGPN/Ko 65a * 19 50 00.17 +33 45 55.1 +069+03.1 K 3-46 19 48 06.1 +33 38 14. 1950 70.002.006 19 50 00.27 +33 45 53.1 +069+03.1 K 3-46 19 50 00.20 +33 45 57.0 2000 70.002.006 rad 19 50 00.20 +33 45 57.0 +082+11.1 NGC 6833 19 48 20.9 +48 50 01. 1950 CGPN/Ko 64d * 19 49 46.62 +48 57 40.1 +082+11.1 NGC 6833 19 48 20.87 +48 50 01.1 1950 37.134.035 19 49 46.59 +48 57 40.2 +082+11.1 NGC 6833 19 48 20.9 +48 50 01. 1950 70.002.006 19 49 46.62 +48 57 40.1 +082+11.1 NGC 6833 19 49 46.82 +48 57 43.5 2000 70.002.006 rad 19 49 46.82 +48 57 43.5 +082+11.1 NGC 6833 19 48 20.5 +48 51 35. 1950 St,Sa (1977) 19 49 46.15 +48 59 14.1 +062-00.1 M 2-48 19 48 24. +25 46 48. 1950 CGPN/Mi 59 19 50 29.04 +25 54 28.6 +062-00.1 M 2-48 19 48 23.1 +25 46 41. 1950 18.133.025 19 50 28.14 +25 54 21.6 +062-00.1 M 2-48 19 48 23.5 +25 46 49. 1950 50.134.178 19 50 28.54 +25 54 29.6 +062-00.1 M 2-48 19 48 23.4 +25 46 49. 1950 70.002.006 19 50 28.44 +25 54 29.6 +062-00.1 M 2-48 19 50 28.80 +25 54 28.8 2000 70.002.006 rad 19 50 28.80 +25 54 28.8 +062-00.1 M 2-48 19 48 22.9 +25 46 47. 1950 IRAS19483+2546 19 50 27.94 +25 54 27.5 +071+04.1 * TuWe 2-3 19 50 46.7 +36 20 01. 2000 63.134.080 * 19 50 46.7 +36 20 01. +071+04.1 * TuWe 2-3 19 48 57.0 +36 12 12. 1950 Ko,Ku (1999) 19 50 47.29 +36 19 54.3 +066+02.1 * K 4-37 19 49 02.4 +30 54 48. 1950 CGPN/Ko 65b 19 51 00.61 +31 02 30.9 +066+02.1 * K 4-37 19 49 02.4 +30 54 48. 1950 30.135.052 19 51 00.61 +31 02 30.9 +066+02.1 * K 4-37 19 49 02.5 +30 54 45. 1950 70.002.006 19 51 00.71 +31 02 27.9 +068+03.1 PC 23 19 49 57.2 +32 51 33. 1950 CGPN/Ko 65a 19 51 52.69 +32 59 19.3 +068+03.1 PC 23 19 49 57.2 +32 51 33. 1950 30.135.052 19 51 52.69 +32 59 19.3 +068+03.1 PC 23 19 49 57.2 +32 51 31. 1950 50.134.178 19 51 52.69 +32 59 17.3 +068+03.1 PC 23 19 49 57.21 +32 51 31.7 1950 52.002.003 19 51 52.70 +32 59 18.0 +068+03.1 PC 23 19 49 57.4 +32 51 31. 1950 70.002.006 19 51 52.89 +32 59 17.3 +068+03.1 PC 23 19 51 52.57 +32 59 14.8 2000 70.002.006 rad 19 51 52.57 +32 59 14.8 +068+03.1 PC 23 19 49 57.7 +32 51 33. 1950 IRAS19499+3251 19 51 53.19 +32 59 19.3 +063+00.1 * K 3-48 19 50 05.8 +27 10 47. 1950 CGPN/Ko 65b 19 52 09.15 +27 18 34.1 +063+00.1 * K 3-48 19 50 05.6 +27 10 49. 1950 30.135.052 19 52 08.94 +27 18 36.1 +063+00.1 * K 3-48 19 50 05.73 +27 10 43.8 1950 52.002.003 19 52 09.08 +27 18 30.9 +063+00.1 * K 3-48 19 50 05.74 +27 10 43.8 1950 52.002.040 19 52 09.09 +27 18 30.9 +063+00.1 * K 3-48 19 52 09.1 +27 18 30. 2000 72.002.012 19 52 09.1 +27 18 30. +063+00.1 * K 3-48 19 50 05.71 +27 10 44.3 1950 72.002.012 rad 19 52 09.06 +27 18 31.4 +063+00.1 * K 3-48 19 50 06.0 +27 10 43. 1950 Ko,Ku (1999) 19 52 09.35 +27 18 30.1 +063+00.1 * K 3-48 19 50 05.9 +27 10 43. 1950 IRAS19500+2710 19 52 09.25 +27 18 30.1 +069+02.1 K 3-49 19 52 05.4 +33 14 20. 1950 CGPN/Ko 65b * 19 54 00.52 +33 22 14.6 +069+02.1 K 3-49 19 52 05.9 +33 14 20. 1950 30.135.052 19 54 01.02 +33 22 14.6 +069+02.1 K 3-49 19 52 05.29 +33 14 05.8 1950 52.002.003 19 54 00.42 +33 22 00.3 +069+02.1 K 3-49 19 52 05.7 +33 14 17. 1950 70.002.006 19 54 00.82 +33 22 11.6 +069+02.1 K 3-49 19 52 04.9 +33 14 14. 1950 IRAS19520+3314 19 54 00.02 +33 22 08.5 +070+03.1 * TuWe 2-4 19 54 17.1 +35 07 08. 2000 63.134.080 19 54 17.1 +35 07 08. +070+03.1 * TuWe 2-4 19 54 17.3 +35 07 08. 2000 66.134.013 19 54 17.3 +35 07 08. +070+03.1 * TuWe 2-4 19 52 24.8 +34 59 07. 1950 Ko,Ku (1999) 19 54 17.33 +35 07 02.7 +065+00.1 NGC 6842 19 53 01.5 +29 09 23. 1950 CGPN/Ko 64d * 19 55 02.44 +29 17 21.3 +065+00.1 NGC 6842 19 53 02.9 +29 09 17. 1950 CGPN/Koal 65 19 55 03.84 +29 17 15.4 +065+00.1 NGC 6842 19 53 02.6 +29 09 10.9 1950 11.133.011 19 55 03.55 +29 17 09.3 +065+00.1 NGC 6842 19 53 01.4 +29 09 23. 1950 34.134.010 19 55 02.34 +29 17 21.3 +065+00.1 NGC 6842 19 53 00.8 +19 09 20. 1950 50.134.178 19 55 14.12 +19 17 18.7 +065+00.1 NGC 6842 19 53 01.4 +29 09 25. 1950 70.002.006 19 55 02.34 +29 17 23.3 +065+00.1 NGC 6842 19 55 02.14 +29 17 22.2 2000 70.002.006 rad 19 55 02.14 +29 17 22.2 +065+00.1 NGC 6842 19 53 01.1 +29 09 18. 1950 IRAS19530+2909 19 55 02.04 +29 17 16.3 +019-23.1 A 66 19 54 34.8 -21 44 43. 1950 18.133.025 * 19 57 31.81 -21 36 36.8 +019-23.1 A 66 19 54 34.8 -21 44 43. 1950 70.002.006 19 57 31.81 -21 36 36.8 +068+01.1 K 4-41 19 54 37.2 +32 14 09. 1950 CGPN/Ko 65b * 19 56 34.00 +32 22 13.3 +068+01.1 K 4-41 19 54 37.0 +32 14 13. 1950 30.135.052 19 56 33.80 +32 22 17.3 +068+01.1 K 4-41 19 54 37.21 +32 14 08.6 1950 52.002.003 19 56 34.01 +32 22 12.9 +068+01.1 K 4-41 19 54 37.2 +32 14 09. 1950 70.002.006 19 56 34.00 +32 22 13.3 +068+01.1 K 4-41 19 56 33.96 +32 22 15.5 2000 70.002.006 rad 19 56 33.96 +32 22 15.5 +014-25.1 * HtDe 12 19 55 10.3 -26 36 24. 1950 43.134.029 19 58 13.22 -26 28 15.4 +014-25.1 * HtDe 12 19 55 10.3 -26 36 25. 1950 70.002.006 19 58 13.22 -26 28 16.4 +075+05.1 * V 1016 Cyg 19 55 19.84 +39 41 29.6 1950 09.141.115 19 57 05.03 +39 49 36.3 +075+05.1 * V 1016 Cyg 19 55 19.80 +39 41 29.9 1950 17.141.016 19 57 04.99 +39 49 36.6 +075+05.1 * V 1016 Cyg 19 55 19.80 +39 41 29.9 1950 20.041.026 19 57 04.99 +39 49 36.6 +075+05.1 * V 1016 Cyg 19 55 19.80 +39 41 30.3 1950 20.041.026 19 57 04.99 +39 49 37.0 +075+05.1 * V 1016 Cyg 19 55 19.8 +39 41 30. 1950 31.116.001 19 57 04.99 +39 49 36.7 +075+05.1 * V 1016 Cyg 19 55 20.0 +39 41 28. 1950 Ko,Ku (1999) 19 57 05.19 +39 49 34.7 +075+05.1 * V 1016 Cyg 19 55 19.7 +39 41 27. 1950 IRAS19553+3941 19 57 04.89 +39 49 33.6 +043-13.1 A 67 19 55 56.4 +02 54 53. 1950 02.133.027 * 19 58 27.15 +03 03 03.5 +043-13.1 A 67 19 55 58.5 +02 54 12. 1950 09.133.025 19 58 29.26 +03 02 22.6 +043-13.1 A 67 19 55 56.3 +02 54 50. 1950 70.002.006 19 58 27.05 +03 03 00.5 +043-13.1 A 67 19 55 56.4 +02 54 49. 1950 Ko,Ku (1999) 19 58 27.15 +03 02 59.5 +068+01.2 He 1-4 19 57 20.0 +31 47 03. 1950 CGPN/Ko 65a * 19 59 17.68 +31 55 17.7 +068+01.2 He 1-4 19 57 20.8 +31 47 02.8 1950 11.133.011 19 59 18.48 +31 55 17.6 +068+01.2 He 1-4 19 57 20.8 +31 46 19. 1950 70.002.006 19 59 18.50 +31 54 33.8 +068+01.2 He 1-4 19 59 18.31 +31 54 37.8 2000 70.002.006 rad 19 59 18.31 +31 54 37.8 +068+01.2 He 1-4 19 57 20.7 +31 46 23. 1950 Ko,Ku (1999) 19 59 18.40 +31 54 37.7 +060-03.1 NGC 6853 19 57 26.6 +22 34 45. 1950 09.133.025 19 59 36.15 +22 43 00.5 +060-03.1 NGC 6853 19 57 26.8 +22 35 00.7 1950 12.133.017 19 59 36.35 +22 43 16.2 +060-03.1 NGC 6853 19 57 26.6 +22 34 57. 1950 70.002.006 19 59 36.15 +22 43 12.5 +060-03.1 NGC 6853 19 57 25.4 +22 34 43. 1950 IRAS19574+2234 19 59 34.95 +22 42 58.4 +060-04.1 A 68 19 58 00.0 +21 34 40. 1950 18.133.025 20 00 10.77 +21 42 57.7 +060-04.1 A 68 19 57 59.7 +21 34 36. 1950 70.002.006 20 00 10.47 +21 42 53.6 +060-04.1 A 68 19 57 59.1 +21 34 36. 1950 IRAS19579+2134 20 00 09.87 +21 42 53.6 +070+02.1 KLW 6 19 59 55.8 +34 29 05. 2000 66.134.013 * 19 59 55.8 +34 29 05. +070+02.1 KLW 6 19 58 01.8 +34 20 47. 1950 Ko,Ku (1999) 19 59 55.84 +34 29 04.2 +042-14.1 NGC 6852 19 58 07.1 +01 35 23. 1950 CGPN/Ko 64d 20 00 39.20 +01 43 41.8 +042-14.1 NGC 6852 19 58 07.6 +01 35 33. 1950 18.133.025 20 00 39.70 +01 43 51.9 +042-14.1 NGC 6852 19 58 07.1 +01 35 22. 1950 70.002.006 20 00 39.20 +01 43 40.8 +042-14.1 NGC 6852 20 00 39.73 +01 43 40.8 2000 70.002.006 rad 20 00 39.73 +01 43 40.8 +042-14.1 NGC 6852 19 58 07.0 +01 35 23. 1950 IRAS19581+0135 20 00 39.10 +01 43 41.8 +069+01.2 KLW 5 20 00 42.0 +32 27 40. 2000 66.134.013 * 20 00 42.0 +32 27 40. +069+01.2 KLW 5 20 00 42.1 +32 27 41. 2000 72.002.012 20 00 42.1 +32 27 41. +069+01.2 KLW 5 19 58 45.03 +32 19 21.3 1950 72.002.012 rad 20 00 42.08 +32 27 41.4 +069+01.2 KLW 5 19 58 45.2 +32 19 20. 1950 Ko,Ku (1999) 20 00 42.25 +32 27 40.1 +029-21.1 * LSIV-12 111 19 59 03.2 -12 49 41. 1950 Ko,Ku (1999) 20 01 50.07 -12 41 18.1 +029-21.1 * LSIV-12 111 19 59 03.0 -12 49 39. 1950 LSIV-12 111 20 01 49.87 -12 41 16.1 +029-21.1 * LSIV-12 111 20 01 49.83 -12 41 17.5 2000 AC 2567412 20 01 49.83 -12 41 17.5 +029-21.1 * LSIV-12 111 20 01 49.84 -12 41 17.6 2000 TYC 574600967 20 01 49.84 -12 41 17.6 +029-21.1 * LSIV-12 111 19 59 02.1 -12 49 44. 1950 IRAS19590-1249 20 01 48.97 -12 41 21.2 +058-05.1 WeSb 5 19 59 29.1 +19 46 18. 1950 30.135.002 * 20 01 42.03 +19 54 41.4 +058-05.1 WeSb 5 19 59 29.2 +19 46 14. 1950 70.002.006 20 01 42.14 +19 54 37.4 +058-05.1 WeSb 5 19 59 29.2 +19 46 16. 1950 Ko,Ku (1999) 20 01 42.13 +19 54 39.4 +056-06.1 K 3-51 20 00 20.7 +17 28 26. 1950 CGPN/Ko 65b 20 02 36.26 +17 36 52.7 +056-06.1 K 3-51 20 00 20.6 +17 28 23. 1950 18.133.025 20 02 36.16 +17 36 49.7 +056-06.1 K 3-51 20 00 20.8 +17 28 23. 1950 70.002.006 20 02 36.36 +17 36 49.7 +056-06.1 K 3-51 20 02 36.33 +17 36 55.6 2000 70.002.006 rad 20 02 36.33 +17 36 55.6 +056-06.1 K 3-51 20 00 20.3 +17 28 17. 1950 IRAS20003+1728 20 02 35.86 +17 36 43.7 +067-00.1 K 3-52 20 01 11.5 +30 24 07. 1950 CGPN/Ko 65b 20 03 11.43 +30 32 36.4 +067-00.1 K 3-52 20 01 11.3 +30 24 09. 1950 30.135.052 20 03 11.23 +30 32 38.4 +067-00.1 K 3-52 20 01 11.51 +30 24 04.8 1950 52.002.003 20 03 11.44 +30 32 34.2 +067-00.1 K 3-52 20 01 11.4 +30 24 06. 1950 70.002.006 20 03 11.33 +30 32 35.4 +067-00.1 K 3-52 20 03 11.26 +30 32 35.5 2000 70.002.006 rad 20 03 11.26 +30 32 35.5 +067-00.1 K 3-52 20 01 12.0 +30 24 06. 1950 IRAS20011+3024 20 03 11.93 +30 32 35.4 +064-02.1 K 3-53 20 01 17.9 +26 52 28. 1950 CGPN/Ko 65b 20 03 22.44 +27 00 57.9 +064-02.1 K 3-53 20 01 18.0 +26 52 28. 1950 18.133.025 20 03 22.54 +27 00 57.9 +064-02.1 K 3-53 20 01 17.89 +26 52 25.0 1950 52.002.003 20 03 22.44 +27 00 54.9 +064-02.1 K 3-53 20 01 18.0 +26 52 23. 1950 70.002.006 20 03 22.55 +27 00 52.9 +064-02.1 K 3-53 20 03 22.30 +27 00 52.2 2000 70.002.006 rad 20 03 22.30 +27 00 52.2 +064-02.1 K 3-53 20 01 17.9 +26 52 23. 1950 IRAS20012+2652 20 03 22.45 +27 00 52.9 +075+04.1 Anon. 20 02 29.4 +39 27 01. 1950 70.002.006 20 04 15.86 +39 35 34.8 +075+04.1 Anon. 20 02 29.8 +39 26 58. 1950 Ko,Ku (1999) 20 04 16.26 +39 35 31.8 +084+09.1 K 3-73 20 02 32.8 +49 10 34. 1950 70.002.006 20 04 00.00 +49 19 07.4 +084+09.1 K 3-73 20 02 33.0 +49 10 32. 1950 Ko,Ku (1999) 20 04 00.21 +49 19 05.4 +068-00.1 M 1-75 20 02 45. +31 18 09. 1950 CGPN/Mi 59 * 20 04 43.84 +31 26 44.2 +068-00.1 M 1-75 20 02 45.1 +31 18 51. 1950 CGPN/Ko 65a 20 04 43.92 +31 27 26.2 +068-00.1 M 1-75 20 02 45.2 +31 18 50.8 1950 11.133.011 20 04 44.02 +31 27 26.0 +068-00.1 M 1-75 20 02 45.2 +31 18 44.1 1950 11.133.011 20 04 44.02 +31 27 19.3 +068-00.1 M 1-75 20 02 45.2 +31 18 51. 1950 70.002.006 20 04 44.02 +31 27 26.2 +068-00.1 M 1-75 20 04 44.10 +31 27 24.7 2000 70.002.006 rad 20 04 44.10 +31 27 24.7 +068-00.1 M 1-75 20 02 45.2 +31 18 49. 1950 IRAS20027+3118 20 04 44.02 +31 27 24.2 +063-03.1 * K 3-54 20 02 52.0 +25 18 04. 1950 CGPN/Ko 65b * 20 04 58.62 +25 26 39.9 +063-03.1 * K 3-54 20 02 52.0 +25 18 04. 1950 18.133.025 20 04 58.62 +25 26 39.9 +063-03.1 * K 3-54 20 02 52.01 +25 18 01.9 1950 37.134.035 20 04 58.63 +25 26 37.8 +063-03.1 * K 3-54 20 02 52.01 +25 18 01.2 1950 52.002.003 20 04 58.63 +25 26 37.1 +063-03.1 * K 3-54 20 02 52.1 +25 18 00. 1950 70.002.006 20 04 58.72 +25 26 35.9 +063-03.1 * K 3-54 20 04 58.83 +25 26 36.6 2000 70.002.006 rad 20 04 58.83 +25 26 36.6 +069+00.1 K 3-55 20 04 58.3 +32 07 52. 1950 CGPN/Ko 65b 20 06 56.20 +32 16 35.5 +069+00.1 K 3-55 20 04 58.3 +32 07 52. 1950 30.135.052 20 06 56.20 +32 16 35.5 +069+00.1 K 3-55 20 04 58.30 +32 07 49.9 1950 52.002.003 20 06 56.20 +32 16 33.4 +069+00.1 K 3-55 20 04 58.31 +32 07 50.1 1950 52.002.040 20 06 56.21 +32 16 33.6 +069+00.1 K 3-55 20 04 58.4 +32 07 51. 1950 70.002.006 20 06 56.30 +32 16 34.5 +069+00.1 K 3-55 20 06 56.21 +32 16 33.5 2000 70.002.006 rad 20 06 56.21 +32 16 33.5 +069+00.1 K 3-55 20 04 58.7 +32 07 52. 1950 IRAS20049+3207 20 06 56.60 +32 16 35.5 +107+21.1 K 1-6 20 05 06.4 +74 17 34. 1950 Ko,Ku (1999) 20 04 15.96 +74 26 12.7 +079+06.1 K 3-56 20 05 17.0 +44 05 37. 1950 CGPN/Ko 65b 20 06 55.47 +44 14 21.0 +079+06.1 K 3-56 20 05 16.9 +44 05 35. 1950 70.002.006 20 06 55.37 +44 14 19.0 +079+06.1 K 3-56 20 05 17.6 +44 05 38. 1950 IRAS20052+4405 20 06 56.07 +44 14 22.0 +065-03.1 We 1-9 20 06 58.8 +26 18 02. 1950 20.135.021 20 09 04.49 +26 26 53.2 +065-03.1 We 1-9 20 06 59.0 +26 18 04. 1950 70.002.006 20 09 04.69 +26 26 55.2 +065-03.1 We 1-9 20 09 04.67 +26 26 56.0 2000 70.002.006 rad 20 09 04.67 +26 26 56.0 +065-03.1 We 1-9 20 06 58.6 +26 18 02. 1950 IRAS20069+2618 20 09 04.29 +26 26 53.2 +078+05.1 DD 1 20 07 01.0 +42 21 20. 1950 70.002.006 20 08 42.98 +42 30 10.6 +078+05.1 DD 1 20 07 01.1 +42 21 17. 1950 Ko,Ku (1999) 20 08 43.08 +42 30 07.6 +079+05.1 M 4-17 20 07 23. +43 34 54. 1950 CGPN/Mi 59 20 09 02.76 +43 43 45.9 +079+05.1 M 4-17 20 07 22.2 +43 34 54. 1950 CGPN/Ko 65a 20 09 01.95 +43 43 45.8 +079+05.1 M 4-17 20 07 22.2 +43 34 54. 1950 70.002.006 20 09 01.95 +43 43 45.8 +079+05.1 M 4-17 20 09 02.28 +43 43 42.6 2000 70.002.006 rad 20 09 02.28 +43 43 42.6 +079+05.1 M 4-17 20 07 22.0 +43 34 50. 1950 IRAS20073+4334 20 09 01.76 +43 43 41.8 +057-08.1 NGC 6879 20 05 53.35 +16 37 38.0 1900 CGPN/Bs 11 * 20 10 26.62 +16 55 21.6 +057-08.1 NGC 6879 20 07 12.8 +16 42 45.6 1929 CGPN/Sr 30 20 10 26.85 +16 55 24.2 +057-08.1 NGC 6879 20 08 10.5 +16 46 22. 1950 CGPN/Koal 65 20 10 27.18 +16 55 18.0 +057-08.1 NGC 6879 20 08 09.9 +16 46 24. 1950 09.133.025 20 10 26.58 +16 55 19.9 +057-08.1 NGC 6879 20 08 09.9 +16 46 24.8 1950 11.133.011 20 10 26.58 +16 55 20.7 +057-08.1 NGC 6879 20 08 10.0 +16 46 25. 1950 50.134.178 20 10 26.68 +16 55 20.9 +057-08.1 NGC 6879 20 08 10.2 +16 46 31. 1950 70.002.006 20 10 26.88 +16 55 27.0 +057-08.1 NGC 6879 20 10 26.65 +16 55 22.7 2000 70.002.006 rad 20 10 26.65 +16 55 22.7 +057-08.1 NGC 6879 20 07 50.0 +16 46 23. 1950 St,Sa (1977) 20 10 06.67 +16 55 17.7 +057-08.1 NGC 6879 20 08 10.0 +16 46 24. 1950 IRAS20081+1646 20 10 26.68 +16 55 19.9 +082+07.1 NGC 6884 20 08 49.1 +46 18 44. 1950 CGPN/Ko 65a * 20 10 23.68 +46 27 41.0 +082+07.1 NGC 6884 20 08 49.08 +46 18 42.3 1950 37.134.035 20 10 23.66 +46 27 39.3 +082+07.1 NGC 6884 20 08 49.0 +46 18 42. 1950 41.134.007 20 10 23.58 +46 27 39.0 +082+07.1 NGC 6884 20 08 49.1 +46 18 42. 1950 70.002.006 20 10 23.68 +46 27 39.0 +082+07.1 NGC 6884 20 10 23.70 +46 27 40.0 2000 70.002.006 rad 20 10 23.70 +46 27 40.0 +082+07.1 NGC 6884 20 08 48.9 +46 17 36. 1950 St,Sa (1977) 20 10 23.52 +46 26 33.0 +082+07.1 NGC 6884 20 08 48.7 +46 18 38. 1950 IRAS20088+4618 20 10 23.28 +46 27 35.0 +074+02.1 NGC 6881 20 06 26.38 +37 03 25.2 1880 CGPN/Pc 81 20 10 52.06 +37 24 45.8 +074+02.1 NGC 6881 20 09 01.6 +37 15 51.0 1950 11.133.011 20 10 52.39 +37 24 49.3 +074+02.1 NGC 6881 20 09 01.63 +37 15 44.3 1950 37.134.035 20 10 52.42 +37 24 42.6 +074+02.1 NGC 6881 20 09 01.63 +37 15 44.3 1950 52.002.003 20 10 52.42 +37 24 42.6 +074+02.1 NGC 6881 20 09 01.0 +37 15 47. 1950 65.134.076 20 10 51.79 +37 24 45.2 +074+02.1 NGC 6881 20 09 01.8 +37 15 42. 1950 70.002.006 20 10 52.59 +37 24 40.3 +074+02.1 NGC 6881 20 10 52.46 +37 24 43.6 2000 70.002.006 rad 20 10 52.46 +37 24 43.6 +074+02.1 NGC 6881 20 09 01.8 +37 15 45. 1950 IRAS20090+3715 20 10 52.59 +37 24 43.3 +060-07.1 He 1-5 20 09 43.7 +20 10 42. 1950 CGPN/Koal 65 * 20 11 56.74 +20 19 43.6 +060-07.1 He 1-5 20 09 42.9 +20 11 04. 1950 18.133.025 20 11 55.93 +20 20 05.5 +060-07.1 He 1-5 20 09 43.1 +20 11 02. 1950 70.002.006 20 11 56.13 +20 20 03.5 +060-07.1 He 1-5 20 11 56.09 +20 20 04.7 2000 70.002.006 rad 20 11 56.09 +20 20 04.7 +060-07.1 He 1-5 20 09 43.21 +20 11 02.3 1950 GSC 1626-00619 20 11 56.24 +20 20 03.9 +060-07.1 He 1-5 20 11 56.06 +20 20 04.4 2000 HIP 099527 20 11 56.06 +20 20 04.4 +060-07.1 He 1-5 20 09 43.1 +20 11 07. 1950 LSII+20 19 20 11 56.13 +20 20 08.5 +060-07.1 He 1-5 20 09 42.4 +20 10 54. 1950 IRAS20097+2010 20 11 55.43 +20 19 55.5 +060-07.2 NGC 6886 20 08 16.10 +19 41 22.4 1900 CGPN/Bs 11 * 20 12 42.91 +19 59 23.1 +060-07.2 NGC 6886 20 09 33.6 +19 46 51.2 1929 CGPN/Sr 30 20 12 43.06 +19 59 41.9 +060-07.2 NGC 6886 20 10 29.6 +19 50 16. 1950 09.133.025 20 12 43.06 +19 59 20.4 +060-07.2 NGC 6886 20 10 29.2 +19 50 21.0 1950 11.133.011 20 12 42.66 +19 59 25.4 +060-07.2 NGC 6886 20 10 29.32 +19 50 18.6 1950 37.134.035 20 12 42.78 +19 59 23.0 +060-07.2 NGC 6886 20 10 29.4 +19 50 18. 1950 41.134.007 20 12 42.86 +19 59 22.4 +060-07.2 NGC 6886 20 10 29.4 +19 50 19. 1950 70.002.006 20 12 42.86 +19 59 23.4 +060-07.2 NGC 6886 20 12 42.81 +19 59 23.6 2000 70.002.006 rad 20 12 42.81 +19 59 23.6 +060-07.2 NGC 6886 20 10 29.4 +19 50 17. 1950 IRAS20104+1950 20 12 42.86 +19 59 21.4 +077+03.1 KJPN 1 20 10 40.0 +40 36 18. 1950 70.002.006 20 12 25.56 +40 45 22.1 +077+03.1 KJPN 1 20 10 40.2 +40 36 15. 1950 Ko,Ku (1999) 20 12 25.76 +40 45 19.2 +072+00.1 K 3-57 20 10 52.2 +34 11 22. 1950 30.135.052 20 12 47.79 +34 20 27.2 +072+00.1 K 3-57 20 10 52.05 +34 11 27.4 1950 52.002.003 20 12 47.64 +34 20 32.6 +072+00.1 K 3-57 20 10 52.10 +34 11 27.2 1950 52.002.040 20 12 47.69 +34 20 32.4 +072+00.1 K 3-57 20 10 52.2 +34 11 26. 1950 70.002.006 20 12 47.79 +34 20 31.2 +072+00.1 K 3-57 20 12 47.64 +34 20 32.5 2000 70.002.006 rad 20 12 47.64 +34 20 32.5 +072+00.1 K 3-57 20 10 52.6 +34 11 28. 1950 IRAS20108+3411 20 12 48.19 +34 20 33.2 +068-02.1 He 2-459 20 11 55.7 +29 24 48. 1950 CGPN/Ko 65a 20 13 57.88 +29 33 57.3 +068-02.1 He 2-459 20 11 55.7 +29 24 48. 1950 20.041.026 20 13 57.88 +29 33 57.3 +068-02.1 He 2-459 20 11 55.1 +29 24 52. 1950 30.135.052 20 13 57.28 +29 34 01.3 +068-02.1 He 2-459 20 11 55.7 +29 24 47. 1950 31.116.001 20 13 57.88 +29 33 56.3 +068-02.1 He 2-459 20 11 55.70 +29 24 46.7 1950 52.002.003 20 13 57.88 +29 33 56.0 +068-02.1 He 2-459 20 11 55.7 +29 24 47. 1950 70.002.006 20 13 57.88 +29 33 56.3 +068-02.1 He 2-459 20 13 57.91 +29 33 57.3 2000 70.002.006 rad 20 13 57.91 +29 33 57.3 +068-02.1 He 2-459 20 11 55.5 +29 24 44. 1950 IRAS20119+2924 20 13 57.68 +29 33 53.3 +054-12.1 NGC 6891 20 10 26.42 +12 23 57.6 1900 CGPN/Bs 11 20 15 08.94 +12 42 15.3 +054-12.1 NGC 6891 20 12 47.7 +12 32 59. 1950 CGPN/Koal 65 20 15 09.00 +12 42 12.1 +054-12.1 NGC 6891 20 12 48.0 +12 32 54. 1950 09.133.025 20 15 09.30 +12 42 07.1 +054-12.1 NGC 6891 20 12 47.5 +12 33 02.0 1950 11.133.011 20 15 08.80 +12 42 15.1 +054-12.1 NGC 6891 20 12 47.5 +12 33 04. 1950 70.002.006 20 15 08.80 +12 42 17.1 +054-12.1 NGC 6891 20 15 08.86 +12 42 15.4 2000 70.002.006 rad 20 15 08.86 +12 42 15.4 +054-12.1 NGC 6891 20 12 47.64 +12 33 02.3 1950 GSC 1081-00805 20 15 08.94 +12 42 15.4 +054-12.1 NGC 6891 20 15 08.86 +12 42 15.3 2000 TYC 108108051 20 15 08.86 +12 42 15.3 +054-12.1 NGC 6891 20 12 47.2 +12 33 02. 1950 IRAS20127+1233 20 15 08.50 +12 42 15.1 +077+03.2 KJPN 2 20 13 35.5 +40 25 29. 1950 70.002.006 * 20 15 21.76 +40 34 43.9 +077+03.2 KJPN 2 20 15 21.95 +40 34 30.2 2000 70.002.006 rad 20 15 21.95 +40 34 30.2 +077+03.2 KJPN 2 20 13 36.1 +40 25 29. 1950 Ko,Ku (1999) 20 15 22.36 +40 34 43.9 +069-02.1 NGC 6894 20 12 22.00 +30 15 20.5 1900 CGPN/Kb 09 20 16 24.08 +30 33 49.7 +069-02.1 NGC 6894 20 11 33.61 +30 11 51.0 1880 CGPN/Wn 09 20 16 24.06 +30 33 58.6 +069-02.1 NGC 6894 20 12 21.74 +30 15 21.4 1900 CGPN/Re 15 20 16 23.82 +30 33 50.6 +069-02.1 NGC 6894 20 14 22.8 +30 24 36. 1950 CGPN/Koal 65 20 16 23.91 +30 33 54.2 +069-02.1 NGC 6894 20 14 23.0 +30 24 34. 1950 50.134.178 20 16 24.11 +30 33 52.2 +069-02.1 NGC 6894 20 14 22.8 +30 24 37. 1950 70.002.006 20 16 23.91 +30 33 55.2 +069-02.1 NGC 6894 20 16 24.05 +30 33 54.3 2000 72.002.012 rad 20 16 24.05 +30 33 54.3 +069-02.1 NGC 6894 20 14 23.3 +30 24 37. 1950 IRAS20143+3024 20 16 24.41 +30 33 55.2 +065-05.1 He 1-6 20 15 13.9 +25 12 22. 1950 18.133.025 * 20 17 21.54 +25 21 43.5 +065-05.1 He 1-6 20 15 13.8 +25 12 25. 1950 70.002.006 20 17 21.44 +25 21 46.5 +065-05.1 He 1-6 20 17 21.37 +25 21 46.1 2000 72.002.012 rad 20 17 21.37 +25 21 46.1 +077+02.1 * KJ 2-1 20 15 24.7 +39 36 26. 1950 Ko,Ku (1999) 20 17 12.56 +39 45 47.5 +076+01.2 * KJPN 3 20 15 26.0 +38 41 01. 1950 70.002.006 20 17 15.36 +38 50 22.6 +076+01.2 * KJPN 3 20 15 26.2 +38 41 01. 1950 Ko,Ku (1999) 20 17 15.56 +38 50 22.7 +359-33.1 CD-41 13967 20 16 06.1 -41 40 55. 1950 Ko,Ku (1999) 20 19 28.81 -41 31 28.0 +359-33.1 CD-41 13967 20 19 28.69 -41 31 27.1 2000 AC 3952409 20 19 28.69 -41 31 27.1 +359-33.1 CD-41 13967 20 16 06.04 -41 40 53.9 1950 GSC 7956-01014 20 19 28.75 -41 31 26.9 +359-33.1 CD-41 13967 20 19 28.70 -41 31 27.4 2000 TYC 795610141 20 19 28.70 -41 31 27.4 +359-33.1 CD-41 13967 20 16 05.3 -41 40 57. 1950 IRAS20160-4140 20 19 28.02 -41 31 30.0 +066-05.1 PC 24 20 17 32.2 +26 50 44. 1950 CGPN/Ko 65a 20 19 38.07 +27 00 13.8 +066-05.1 PC 24 20 17 32.2 +26 50 41. 1950 50.134.178 20 19 38.07 +27 00 10.8 +066-05.1 PC 24 20 17 32.3 +26 50 40. 1950 70.002.006 20 19 38.17 +27 00 09.8 +066-05.1 PC 24 20 19 38.07 +27 00 11.5 2000 70.002.006 rad 20 19 38.07 +27 00 11.5 +066-05.1 PC 24 20 17 32.3 +26 50 40. 1950 IRAS20175+2650 20 19 38.17 +27 00 09.8 +058-10.1 IC 4997 20 17 51.5 +16 34 22. 1950 02.133.027 20 20 08.86 +16 43 53.3 +058-10.1 IC 4997 20 17 51.0 +16 34 27. 1950 09.133.025 20 20 08.36 +16 43 58.3 +058-10.1 IC 4997 20 17 51.35 +16 34 23.0 1950 11.133.008 20 20 08.71 +16 43 54.3 +058-10.1 IC 4997 20 17 51.0 +16 34 27. 1950 20.041.026 20 20 08.36 +16 43 58.3 +058-10.1 IC 4997 20 17 51.35 +16 34 22.6 1950 37.134.035 20 20 08.71 +16 43 53.9 +058-10.1 IC 4997 20 17 51.4 +16 34 22. 1950 41.134.007 20 20 08.76 +16 43 53.3 +058-10.1 IC 4997 20 17 51.4 +16 34 23. 1950 70.002.006 20 20 08.76 +16 43 54.3 +058-10.1 IC 4997 20 20 08.72 +16 43 53.8 2000 70.002.006 rad 20 20 08.72 +16 43 53.8 +058-10.1 IC 4997 20 17 51.5 +16 34 20. 1950 St,Sa (1977) 20 20 08.86 +16 43 51.3 +058-10.1 IC 4997 20 20 08.75 +16 43 53.9 2000 TYC 163117851 20 20 08.75 +16 43 53.9 +058-10.1 IC 4997 20 17 51.4 +16 34 21. 1950 IRAS20178+1634 20 20 08.76 +16 43 52.3 +076+01.1 A 69 20 18 08.0 +38 14 31. 1950 02.133.027 20 19 58.40 +38 24 02.4 +076+01.1 A 69 20 18 07.7 +38 14 32. 1950 70.002.006 20 19 58.10 +38 24 03.4 +071-02.1 M 3-35 20 19 04. +32 19 49. 1950 CGPN/Mi 59 20 21 03.04 +32 29 24.0 +071-02.1 M 3-35 20 19 04.8 +32 19 47. 1950 CGPN/Koal 65 20 21 03.84 +32 29 22.1 +071-02.1 M 3-35 20 19 04.8 +32 19 49. 1950 30.135.052 20 21 03.84 +32 29 24.1 +071-02.1 M 3-35 20 19 04.71 +32 19 49.2 1950 52.002.003 20 21 03.75 +32 29 24.3 +071-02.1 M 3-35 20 19 04.7 +32 19 49. 1950 70.002.006 20 21 03.74 +32 29 24.1 +071-02.1 M 3-35 20 21 03.79 +32 29 25.5 2000 70.002.006 rad 20 21 03.79 +32 29 25.5 +071-02.1 M 3-35 20 19 04.2 +32 19 45. 1950 IRAS20190+3219 20 21 03.24 +32 29 20.0 +069-03.1 K 3-58 20 19 56.0 +29 49 46. 1950 CGPN/Ko 65b 20 21 58.39 +29 59 24.2 +069-03.1 K 3-58 20 19 56.4 +29 49 39. 1950 70.002.006 20 21 58.79 +29 59 17.3 +069-03.1 K 3-58 20 21 58.66 +29 59 26.7 2000 70.002.006 rad 20 21 58.66 +29 59 26.7 +069-03.1 K 3-58 20 19 56.0 +29 49 45. 1950 IRAS20199+2949 20 21 58.39 +29 59 23.2 +061-09.1 NGC 6905 20 17 47.26 +19 46 27.8 1897 CGPN/We 03 20 22 23.00 +20 06 12.8 +061-09.1 NGC 6905 20 17 02.13 +19 43 17.3 1880 CGPN/Wn 09 20 22 23.36 +20 06 14.7 +061-09.1 NGC 6905 20 17 55.57 +19 47 03.0 1900 CGPN/Bs 11 20 22 23.28 +20 06 14.0 +061-09.1 NGC 6905 20 17 55.38 +19 47 05.0 1900 CGPN/Lo 11 20 22 23.09 +20 06 15.9 +061-09.1 NGC 6905 20 17 55.34 +19 47 06.3 1900 CGPN/Lp 16 20 22 23.05 +20 06 17.2 +061-09.1 NGC 6905 20 17 55.46 +19 47 03.4 1900 CGPN/Si 27 20 22 23.17 +20 06 14.3 +061-09.1 NGC 6905 20 20 08.5 +19 56 39. 1950 09.133.025 20 22 22.41 +20 06 18.4 +061-09.1 NGC 6905 20 20 09.7 +19 56 38. 1950 30.002.012 20 22 23.61 +20 06 17.4 +061-09.1 NGC 6905 20 20 09.1 +19 56 37. 1950 70.002.006 20 22 23.01 +20 06 16.4 +061-09.1 NGC 6905 20 22 22.98 +20 06 17.2 2000 70.002.006 rad 20 22 22.98 +20 06 17.2 +061-09.1 NGC 6905 20 20 09.16 +19 56 37.1 1950 GSC 1639-01907 20 22 23.07 +20 06 16.5 +061-09.1 NGC 6905 20 20 09.0 +19 56 37. 1950 IRAS20201+1956 20 22 22.91 +20 06 16.4 +083+05.1 KLW 7 20 22 15.9 +47 03 53. 2000 66.134.013 20 22 15.9 +47 03 53. +083+05.1 KLW 7 20 20 41.2 +46 54 15. 1950 Ko,Ku (1999) 20 22 16.59 +47 03 55.1 +073-02.2 * GM 1-11 20 22 30. +33 51 00. 1950 37.131.111 20 24 27.36 +34 00 47.2 +073-02.2 * GM 1-11 20 22 28.7 +33 51 41. 1950 Ko,Ku (1999) 20 24 26.04 +34 01 28.1 +073-02.1 K 3-76 20 23 09.14 +33 24 22.5 1950 52.002.003 * 20 25 07.18 +33 34 12.0 +073-02.1 K 3-76 20 23 07.0 +33 25 04. 1950 70.002.006 20 25 05.02 +33 34 53.4 +073-02.1 K 3-76 20 23 07.0 +33 25 01. 1950 Ko,Ku (1999) 20 25 05.02 +33 34 50.4 +073-02.1 K 3-76 20 23 06.9 +33 24 59. 1950 IRAS20231+3324 20 25 04.92 +33 34 48.4 +064-09.1 * K 4-43 20 25 57.4 +22 41 19. 1950 CGPN/Ko 65b 20 28 08.71 +22 51 18.8 +064-09.1 * K 4-43 20 25 57.3 +22 41 26. 1950 18.133.025 20 28 08.61 +22 51 25.8 +079+00.1 * KJPN 4 20 26 28.7 +40 10 08. 1950 Ko,Ku (1999) * 20 28 17.22 +40 20 08.9 +078+00.1 SD 1 20 27 30.1 +40 05 13.5 1950 11.133.011 20 29 18.90 +40 15 18.0 +078+00.1 SD 1 20 27 30.2 +40 05 16. 1950 70.002.006 20 29 19.00 +40 15 20.5 +038-25.1 A 70 20 28 53.2 -07 15 30. 1950 09.133.025 20 31 33.65 -07 05 19.0 +038-25.1 A 70 20 28 52.7 -07 15 32. 1950 34.134.010 20 31 33.15 -07 05 21.1 +038-25.1 A 70 20 28 52.8 -07 15 29. 1950 70.002.006 20 31 33.25 -07 05 18.1 +038-25.1 A 70 20 31 33.10 -07 05 22.0 2000 70.002.006 rad 20 31 33.10 -07 05 22.0 +086+05.1 We 1-10 20 30 19.2 +48 42 27. 1950 20.135.021 20 31 52.68 +48 52 40.9 +086+05.1 We 1-10 20 30 18.9 +48 42 37. 1950 70.002.006 20 31 52.37 +48 52 50.8 +086+05.1 We 1-10 20 30 19.1 +48 42 35. 1950 Ko,Ku (1999) 20 31 52.57 +48 52 48.8 +085+04.1 A 71 20 30 46.5 +47 10 48. 1950 34.134.010 20 32 23.22 +47 21 03.5 +085+04.1 A 71 20 30 46.7 +47 10 39. 1950 70.002.006 20 32 23.42 +47 20 54.5 +063-12.1 * He 2-467 20 33 42.6 +20 01 07. 1950 18.133.025 20 35 57.30 +20 11 33.7 +063-12.1 * He 2-467 20 33 42.6 +20 01 02. 1950 38.002.010 20 35 57.30 +20 11 28.7 +063-12.1 * He 2-467 20 33 42. +20 01 01. 1950 46.114.003 20 35 56.70 +20 11 27.7 +063-12.1 * He 2-467 20 33 42.56 +20 01 02.2 1950 51.117.039 20 35 57.26 +20 11 28.9 +078-02.1 K 4-53 20 40 21.2 +37 29 40. 1950 70.002.006 20 42 15.78 +37 40 28.5 +078-02.1 K 4-53 20 42 16.03 +37 40 29.3 2000 70.002.006 rad 20 42 16.03 +37 40 29.3 +078-02.1 K 4-53 20 40 21.8 +37 29 38. 1950 Ko,Ku (1999) 20 42 16.38 +37 40 26.6 +078-02.1 K 4-53 20 40 22.1 +37 29 42. 1950 IRAS20403+3729 20 42 16.68 +37 40 30.6 +072-07.1 * IRAS20406+2953 20 40 41.7 +29 53 16. 1950 Ko,Ku (1999) * 20 42 46.15 +30 04 06.0 +072-07.1 * IRAS20406+2953 20 40 41.5 +29 53 16. 1950 IRAS20406+2953 20 42 45.95 +30 04 06.0 +084+01.1 K 4-55 20 43 25.7 +44 28 16. 1950 70.002.006 20 45 09.88 +44 39 14.4 +084+01.1 K 4-55 20 45 10.54 +44 39 10.5 2000 70.002.006 rad 20 45 10.54 +44 39 10.5 +084+01.1 K 4-55 20 43 26.0 +44 28 14. 1950 Ko,Ku (1999) 20 45 10.18 +44 39 12.4 +088+04.1 K 3-78 20 43 49.4 +50 11 40. 1950 50.134.178 20 45 22.62 +50 22 39.4 +088+04.1 K 3-78 20 43 49.47 +50 11 40.5 1950 52.002.003 20 45 22.69 +50 22 39.9 +088+04.1 K 3-78 20 43 49.6 +50 11 40. 1950 70.002.006 20 45 22.82 +50 22 39.4 +088+04.1 K 3-78 20 45 22.77 +50 22 43.3 2000 70.002.006 rad 20 45 22.77 +50 22 43.3 +088+04.1 K 3-78 20 43 49.4 +50 11 38. 1950 IRAS20438+5011 20 45 22.62 +50 22 37.4 +076-05.1 * LSII+34 26 20 46 17.1 +34 16 15. 1950 Ko,Ku (1999) 20 48 16.84 +34 27 23.2 +076-05.1 * LSII+34 26 20 46 16.9 +34 16 22. 1950 LSII-Cat. 20 48 16.63 +34 27 30.2 +076-05.1 * LSII+34 26 20 46 17.1 +34 16 17. 1950 GSC 2695-02549 20 48 16.83 +34 27 25.2 +076-05.1 * LSII+34 26 20 48 16.64 +34 27 24.4 2000 TYC 269525491 20 48 16.64 +34 27 24.4 +076-05.1 * LSII+34 26 20 46 16.6 +34 16 14. 1950 IRAS20462+3416 20 48 16.33 +34 27 22.2 +059-18.1 A 72 20 47 40.4 +13 22 13. 1950 18.133.025 20 50 02.33 +13 33 26.4 +059-18.1 A 72 20 47 40.1 +13 22 15. 1950 34.134.010 20 50 02.03 +13 33 28.4 +059-18.1 A 72 20 47 40.2 +13 22 16. 1950 70.002.006 20 50 02.13 +13 33 29.4 +059-18.1 A 72 20 47 39.1 +13 22 10. 1950 IRAS20476+1322 20 50 01.03 +13 33 23.3 +092+05.1 K 3-79 20 51 46.3 +53 34 17. 1950 70.002.006 20 53 13.79 +53 45 42.0 +092+05.1 K 3-79 20 53 14.70 +53 45 38.0 2000 70.002.006 rad 20 53 14.70 +53 45 38.0 +092+05.1 K 3-79 20 51 46.3 +53 34 17. 1950 Ko,Ku (1999) 20 53 13.79 +53 45 42.0 +086+00.1 * K 4-56 20 54 01. +46 21 42. 1950 07.133.004 20 55 43.97 +46 33 14.6 +086+00.1 * K 4-56 20 54 01.5 +46 21 40. 1950 Ko,Ku (1999) 20 55 44.48 +46 33 12.6 +095+07.1 A 73 20 55 07.5 +57 14 21. 1950 34.134.010 20 56 26.26 +57 25 56.4 +095+07.1 A 73 20 55 07.9 +57 14 25. 1950 70.002.006 20 56 26.65 +57 26 00.4 +095+07.1 A 73 20 56 26.81 +57 26 02.9 2000 70.002.006 rad 20 56 26.81 +57 26 02.9 +095+07.1 A 73 20 55 08.4 +57 14 26. 1950 IRAS20551+5714 20 56 27.16 +57 26 01.5 +093+05.2 NGC 7008 20 57 04.23 +54 04 50.3 1880 CGPN/Wn 09 * 21 00 34.38 +54 33 02.5 +093+05.2 NGC 7008 20 59 05.1 +54 20 47. 1950 CGPN/Ko 64d 21 00 32.74 +54 32 35.0 +093+05.2 NGC 7008 20 59 05.1 +54 20 41. 1950 CGPN/Ko 65a 21 00 32.74 +54 32 29.0 +093+05.2 NGC 7008 20 59 05.21 +54 20 47.7 1950 12.133.017 21 00 32.85 +54 32 35.7 +093+05.2 NGC 7008 20 59 05.1 +54 20 55. 1950 50.134.178 21 00 32.73 +54 32 43.0 +093+05.2 NGC 7008 20 59 05.5 +54 20 44. 1950 70.002.006 21 00 33.14 +54 32 32.0 +093+05.2 NGC 7008 21 00 32.68 +54 32 39.4 2000 70.002.006 rad 21 00 32.68 +54 32 39.4 +093+05.2 NGC 7008 20 59 04.9 +54 20 49. 1950 IRAS20590+5420 21 00 32.53 +54 32 37.0 +037-34.1 NGC 7009 20 58 34.14 -11 46 12.9 1897 CGPN/We 03 21 04 10.57 -11 21 44.0 +037-34.1 NGC 7009 20 57 38.86 -11 50 18.6 1880 CGPN/Wn 09 21 04 10.91 -11 21 50.7 +037-34.1 NGC 7009 20 58 44.48 -11 45 33.7 1900 CGPN/Po 10 21 04 11.10 -11 21 47.1 +037-34.1 NGC 7009 20 58 44.13 -11 45 33.6 1900 CGPN/Bs 11 21 04 10.76 -11 21 47.0 +037-34.1 NGC 7009 20 58 44.16 -11 45 34.7 1900 CGPN/Go 16 21 04 10.79 -11 21 48.1 +037-34.1 NGC 7009 20 58 44.18 -11 45 34.5 1900 CGPN/Lp 16 21 04 10.81 -11 21 47.9 +037-34.1 NGC 7009 20 58 44.14 -11 45 35.6 1900 CGPN/Si 27 21 04 10.77 -11 21 49.0 +037-34.1 NGC 7009 21 00 19.0 -11 38 41.3 1929 CGPN/Sr 30 21 04 10.83 -11 21 45.0 +037-34.1 NGC 7009 21 01 27.6 -11 33 54. 1950 09.133.025 21 04 10.84 -11 21 56.6 +037-34.1 NGC 7009 21 01 27.7 -11 33 52. 1950 11.133.008 21 04 10.94 -11 21 54.6 +037-34.1 NGC 7009 21 01 27.6 -11 33 45. 1950 70.002.006 21 04 10.84 -11 21 47.6 +037-34.1 NGC 7009 21 04 10.82 -11 21 48.5 2000 70.002.006 rad 21 04 10.82 -11 21 48.5 +037-34.1 NGC 7009 21 04 10.79 -11 21 47.7 2000 HIP 103992 21 04 10.79 -11 21 47.7 +037-34.1 NGC 7009 21 04 10.85 -11 21 48.2 2000 TYC 577918041 21 04 10.85 -11 21 48.2 +037-34.1 NGC 7009 21 01 27.4 -11 33 48. 1950 IRAS21014-1133 21 04 10.64 -11 21 50.6 +006-41.1 PaRu 1-1 21 02 44.5 -37 20 18.7 1950 50.134.235 * 21 05 53.51 -37 08 16.6 +006-41.1 PaRu 1-1 21 02 44.7 -37 20 44. 1950 70.002.006 21 05 53.72 -37 08 41.9 +006-41.1 PaRu 1-1 21 02 44.8 -37 20 44. 1950 Ko,Ku (1999) 21 05 53.82 -37 08 41.9 +089+00.1 NGC 7026 21 02 52.85 +47 27 03.7 1900 CGPN/Kb 09 21 06 18.69 +47 51 09.3 +089+00.1 NGC 7026 21 04 35.6 +47 39 02. 1950 CGPN/Ko 64d 21 06 18.62 +47 51 07.2 +089+00.1 NGC 7026 21 04 35.5 +47 39 03. 1950 CGPN/Koal 65 21 06 18.52 +47 51 08.2 +089+00.1 NGC 7026 21 04 35.58 +47 39 01.9 1950 12.133.017 21 06 18.60 +47 51 07.1 +089+00.1 NGC 7026 21 04 35.5 +47 39 02. 1950 41.134.007 21 06 18.52 +47 51 07.2 +089+00.1 NGC 7026 21 04 35.56 +47 39 01.9 1950 52.002.040 21 06 18.58 +47 51 07.1 +089+00.1 NGC 7026 21 04 35.5 +47 39 03. 1950 65.134.076 21 06 18.52 +47 51 08.2 +089+00.1 NGC 7026 21 04 35.5 +47 39 03. 1950 70.002.006 21 06 18.52 +47 51 08.2 +089+00.1 NGC 7026 21 06 18.73 +47 51 07.5 2000 70.002.006 rad 21 06 18.73 +47 51 07.5 +089+00.1 NGC 7026 21 04 35.4 +47 39 02. 1950 St,Sa (1977) 21 06 18.42 +47 51 07.2 +089+00.1 NGC 7026 21 04 35.68 +47 39 02.7 1950 GSC 3592-02931 21 06 18.70 +47 51 07.9 +089+00.1 NGC 7026 21 04 36.0 +47 39 02. 1950 IRAS21046+4739 21 06 19.02 +47 51 07.3 +084-03.1 NGC 7027 21 03 17.51 +41 49 59.8 1900 CGPN/Bs 11 21 07 01.68 +42 14 08.8 +084-03.1 NGC 7027 21 05 09.40 +42 02 03.1 1950 CGPN/AGK2 21 07 01.59 +42 14 10.3 +084-03.1 NGC 7027 21 05 09.4 +42 02 03. 1950 CGPN/Ko 64d 21 07 01.59 +42 14 10.2 +084-03.1 NGC 7027 21 05 09.50 +42 02 03.1 1950 11.133.008 21 07 01.69 +42 14 10.3 +084-03.1 NGC 7027 21 05 09.4 +42 02 02.8 1950 11.133.011 21 07 01.59 +42 14 10.0 +084-03.1 NGC 7027 21 05 09.48 +42 02 02.8 1950 31.135.014 21 07 01.67 +42 14 10.0 +084-03.1 NGC 7027 21 05 09.4 +42 02 05. 1950 39.134.039 21 07 01.59 +42 14 12.2 +084-03.1 NGC 7027 21 05 09.5 +42 02 04. 1950 39.134.039 21 07 01.69 +42 14 11.2 +084-03.1 NGC 7027 21 05 09.5 +42 02 04. 1950 70.002.006 21 07 01.69 +42 14 11.2 +084-03.1 NGC 7027 21 07 01.73 +42 14 10.2 2000 70.002.006 rad 21 07 01.73 +42 14 10.2 +084-03.1 NGC 7027 21 05 09.1 +42 02 01. 1950 St,Sa (1977) 21 07 01.29 +42 14 08.2 +084-03.1 NGC 7027 21 05 09.46 +42 02 02.6 1950 SAO 50463 21 07 01.65 +42 14 09.8 +084-03.1 NGC 7027 21 07 01.46 +42 14 10.5 2000 TYC 317607981 21 07 01.46 +42 14 10.5 +084-03.1 NGC 7027 21 05 09.4 +42 02 03. 1950 IRAS2105+4202 21 07 01.59 +42 14 10.2 +084-04.1 K 3-80 21 05 45.6 +40 45 44. 1950 70.002.006 21 07 39.72 +40 57 53.0 +084-04.1 K 3-80 21 07 39.56 +40 57 51.5 2000 70.002.006 rad 21 07 39.56 +40 57 51.5 +084-04.1 K 3-80 21 05 45.7 +40 45 44. 1950 Ko,Ku (1999) 21 07 39.83 +40 57 53.0 +091+01.1 We 1-11 21 09 13.8 +50 34 48. 1950 20.135.021 * 21 10 52.49 +50 47 07.0 +091+01.1 We 1-11 21 09 13.5 +50 34 56. 1950 70.002.006 21 10 52.18 +50 47 14.9 +091+01.1 We 1-11 21 10 52.33 +50 47 15.7 2000 70.002.006 rad 21 10 52.33 +50 47 15.7 +091+01.1 We 1-11 21 09 13.9 +50 34 55. 1950 Ko,Ku (1999) 21 10 52.58 +50 47 14.0 +089-00.1 Sh 1-89 21 12 22.5 +47 33 58. 1950 70.002.006 21 14 07.50 +47 46 26.3 +089-00.1 Sh 1-89 21 14 07.45 +47 46 16.8 2000 70.002.006 rad 21 14 07.45 +47 46 16.8 +089-00.1 Sh 1-89 21 12 22.6 +47 33 53. 1950 Ko,Ku (1999) 21 14 07.60 +47 46 21.3 +089-00.1 Sh 1-89 21 12 21.7 +47 33 39. 1950 IRAS21123+4733 21 14 06.71 +47 46 07.3 +088-01.1 NGC 7048 21 10 39.80 +45 52 33.0 1900 CGPN/Kb 09 21 14 14.55 +46 17 25.3 +088-01.1 NGC 7048 21 10 40.46 +45 52 26.9 1900 CGPN/Em 16 21 14 15.22 +46 17 19.3 +088-01.1 NGC 7048 21 12 27.5 +46 04 49. 1950 50.134.178 21 14 15.00 +46 17 17.6 +088-01.1 NGC 7048 21 12 27.7 +46 04 50. 1950 70.002.006 21 14 15.20 +46 17 18.7 +088-01.1 NGC 7048 21 14 15.25 +46 17 16.1 2000 70.002.006 rad 21 14 15.25 +46 17 16.1 +088-01.1 NGC 7048 21 12 27.8 +46 04 46. 1950 IRAS21124+4604 21 14 15.30 +46 17 14.7 +072-17.1 A 74 21 14 39.0 +23 59 42. 1950 18.133.025 * 21 16 53.15 +24 12 17.7 +072-17.1 A 74 21 14 38.1 +23 56 16. 1950 70.002.006 21 16 52.30 +24 08 51.6 +072-17.1 A 74 21 14 38.3 +23 56 15. 1950 Ko,Ku (1999) 21 16 52.50 +24 08 50.7 +080-10.1 * RXJ2117.1+3412 21 17 07.6 +34 12 22.0 2000 57.126.019 21 17 07.6 +34 12 22.0 +080-10.1 * RXJ2117.1+3412 21 15 04.4 +33 59 49. 1950 Ko,Ku (1999) 21 17 08.52 +34 12 25.6 +087-03.1 * We 2-245 21 16 14.9 +43 36 00. 1950 20.135.020 * 21 18 07.04 +43 48 39.7 +087-03.1 * We 2-245 21 16 14.8 +43 36 06. 1950 70.002.006 21 18 06.93 +43 48 45.7 +087-03.1 * We 2-245 21 16 15.1 +43 36 04. 1950 Ko,Ku (1999) 21 18 07.23 +43 48 43.7 +089-02.1 * M 1-77 21 17 19. +46 06 05. 1950 CGPN/Mi 59 21 19 07.57 +46 18 47.6 +089-02.1 * M 1-77 21 17 18.7 +46 06 05. 1950 50.134.178 21 19 07.27 +46 18 47.6 +089-02.1 * M 1-77 21 17 18.6 +46 06 05. 1950 70.002.006 21 19 07.17 +46 18 47.6 +089-02.1 * M 1-77 21 19 07.37 +46 18 47.5 2000 72.002.012 rad 21 19 07.37 +46 18 47.5 +089-02.1 * M 1-77 21 17 18.5 +46 06 05. 1950 St,Sa (1977) 21 19 07.07 +46 18 47.6 +089-02.1 * M 1-77 21 17 18.8 +46 06 04. 1950 LSIII+46 54 21 19 07.37 +46 18 46.6 +089-02.1 * M 1-77 21 17 19.2 +46 06 06. 1950 IRAS21173+4606 21 19 07.77 +46 18 48.6 +083-08.1 K 3-81 21 20 15.0 +37 54 24. 1950 70.002.006 21 22 15.43 +38 07 15.2 +083-08.1 K 3-81 21 20 15.1 +37 54 23. 1950 Ko,Ku (1999) 21 22 15.53 +38 07 14.2 +101+08.1 A 75 21 25 11.3 +62 40 23. 1950 34.134.010 21 26 24.14 +62 53 26.6 +101+08.1 A 75 21 25 11.0 +62 40 33. 1950 50.134.178 21 26 23.82 +62 53 36.6 +101+08.1 A 75 21 25 10.7 +62 40 29. 1950 70.002.006 21 26 23.53 +62 53 32.6 +101+08.1 A 75 21 26 24.28 +62 53 34.3 2000 70.002.006 rad 21 26 24.28 +62 53 34.3 +101+08.1 A 75 21 25 11.4 +62 40 34. 1950 IRAS21251+6240 21 26 24.23 +62 53 37.6 +098+04.1 K 3-60 21 25 57.9 +57 26 03. 1950 CGPN/Ko 65b 21 27 26.55 +57 39 09.1 +098+04.1 K 3-60 21 25 57.9 +57 26 05. 1950 30.135.052 21 27 26.54 +57 39 11.1 +098+04.1 K 3-60 21 25 58.1 +57 26 05. 1950 33.134.004 21 27 26.75 +57 39 11.1 +098+04.1 K 3-60 21 25 57.82 +57 26 00.5 1950 52.002.003 21 27 26.47 +57 39 06.6 +098+04.1 K 3-60 21 25 57.9 +57 25 59. 1950 70.002.006 21 27 26.55 +57 39 05.1 +098+04.1 K 3-60 21 27 26.44 +57 39 06.5 2000 70.002.006 rad 21 27 26.44 +57 39 06.5 +098+04.1 K 3-60 21 25 58.1 +57 26 01. 1950 IRAS21259+5726 21 27 26.75 +57 39 07.1 +065-27.1 Ps 1 21 25 09.51 +11 44 09.1 1900 CGPN/Ku 21 21 29 59.46 +12 10 26.5 +065-27.1 Ps 1 21 27 33.0 +11 57 12. 1950 09.133.025 21 29 58.02 +12 10 23.8 +065-27.1 Ps 1 21 27 34.36 +11 57 14.3 1950 28.135.033 21 29 59.38 +12 10 26.2 +065-27.1 Ps 1 21 27 34.40 +11 57 14.6 1950 34.134.019 21 29 59.42 +12 10 26.5 +065-27.1 Ps 1 21 27 34.4 +11 57 14. 1950 70.002.006 21 29 59.42 +12 10 25.9 +093-00.2 * IRAS21282+5050 21 28 15.1 +50 50 47. 1950 42.131.050 21 29 58.48 +51 03 59.6 +093-00.2 * IRAS21282+5050 21 28 15.5 +50 50 47. 1950 57.134.065 21 29 58.88 +51 03 59.6 +093-00.2 * IRAS21282+5050 21 28 15.1 +50 50 48. 1950 58.134.047 21 29 58.48 +51 04 00.6 +093-00.2 * IRAS21282+5050 21 28 15.08 +50 50 48.0 1950 61.134.007 21 29 58.46 +51 04 00.6 +093-00.2 * IRAS21282+5050 21 28 15.3 +50 50 47. 1950 Ko,Ku (1999) 21 29 58.68 +51 03 59.6 +093-00.2 * IRAS21282+5050 21 28 15.0 +50 50 43. 1950 IRAS21282+5050 21 29 58.38 +51 03 55.6 +096+02.1 K 3-61 21 28 23.8 +54 14 17. 1950 CGPN/Ko 65b 21 30 00.63 +54 27 29.9 +096+02.1 K 3-61 21 28 24.0 +54 14 14. 1950 50.134.178 21 30 00.83 +54 27 26.9 +096+02.1 K 3-61 21 28 24.0 +54 14 14. 1950 70.002.006 21 30 00.83 +54 27 26.9 +096+02.1 K 3-61 21 30 00.60 +54 27 27.5 2000 70.002.006 rad 21 30 00.60 +54 27 27.5 +096+02.1 K 3-61 21 28 24.1 +54 14 14. 1950 IRAS21284+5414 21 30 00.93 +54 27 26.9 +093-00.1 K 3-82 21 29 06.0 +49 46 50. 1950 50.134.178 21 30 51.49 +50 00 04.9 +093-00.1 K 3-82 21 29 05.9 +49 46 54. 1950 70.002.006 21 30 51.39 +50 00 08.9 +093-00.1 K 3-82 21 30 51.51 +50 00 09.0 2000 70.002.006 rad 21 30 51.51 +50 00 09.0 +093-00.1 K 3-82 21 29 06.2 +49 46 52. 1950 IRAS21291+4946 21 30 51.69 +50 00 06.9 +095+00.1 K 3-62 21 30 09.0 +52 20 37. 1950 CGPN/Ko 65b 21 31 50.17 +52 33 54.6 +095+00.1 K 3-62 21 30 08.8 +52 20 37. 1950 30.135.052 21 31 49.96 +52 33 54.6 +095+00.1 K 3-62 21 30 09.00 +52 20 34.0 1950 52.002.002 21 31 50.17 +52 33 51.6 +095+00.1 K 3-62 21 30 09.0 +52 20 34. 1950 70.002.006 21 31 50.17 +52 33 51.6 +095+00.1 K 3-62 21 31 50.22 +52 33 51.0 2000 70.002.006 rad 21 31 50.22 +52 33 51.0 +095+00.1 K 3-62 21 30 09.0 +52 20 33. 1950 IRAS21301+5220 21 31 50.17 +52 33 50.6 +089-05.1 IC 5117 21 30 36.8 +44 22 29. 1950 CGPN/Ko 64d 21 32 30.99 +44 35 48.2 +089-05.1 IC 5117 21 30 36.77 +44 22 28.9 1950 37.134.035 21 32 30.96 +44 35 48.1 +089-05.1 IC 5117 21 30 36.7 +44 22 29. 1950 41.134.007 21 32 30.89 +44 35 48.2 +089-05.1 IC 5117 21 30 36.76 +44 22 28.5 1950 52.002.003 21 32 30.95 +44 35 47.7 +089-05.1 IC 5117 21 30 36.77 +44 22 28.8 1950 63.134.081 21 32 30.96 +44 35 48.0 +089-05.1 IC 5117 21 30 36.8 +44 22 29. 1950 70.002.006 21 32 30.99 +44 35 48.2 +089-05.1 IC 5117 21 32 30.94 +44 35 47.4 2000 70.002.006 rad 21 32 30.94 +44 35 47.4 +089-05.1 IC 5117 21 30 36.7 +44 22 29. 1950 St,Sa (1977) 21 32 30.89 +44 35 48.2 +089-05.1 IC 5117 21 30 37.2 +44 22 31. 1950 IRAS21306+4422 21 32 31.39 +44 35 50.2 +086-08.1 Hu 1-2 21 31 07.4 +39 24 40. 1950 CGPN/Fc 62 21 33 08.03 +39 38 00.7 +086-08.1 Hu 1-2 21 31 07.64 +39 24 49.1 1950 37.134.035 21 33 08.27 +39 38 09.8 +086-08.1 Hu 1-2 21 31 07.0 +39 24 40. 1950 65.134.076 21 33 07.63 +39 38 00.6 +086-08.1 Hu 1-2 21 31 07.6 +39 24 51. 1950 70.002.006 21 33 08.23 +39 38 11.7 +086-08.1 Hu 1-2 21 33 08.20 +39 38 08.3 2000 70.002.006 rad 21 33 08.20 +39 38 08.3 +086-08.1 Hu 1-2 21 31 07.4 +39 24 44. 1950 IRAS21311+3924 21 33 08.03 +39 38 04.7 +081-14.1 A 78 21 33 20.4 +31 28 13. 1950 30.002.012 21 35 29.81 +31 41 39.7 +081-14.1 A 78 21 33 20.1 +31 28 18. 1950 34.134.010 21 35 29.50 +31 41 44.7 +081-14.1 A 78 21 33 20.1 +31 28 17. 1950 70.002.006 21 35 29.50 +31 41 43.7 +081-14.1 A 78 21 35 30.00 +31 41 45.0 2000 70.002.006 rad 21 35 30.00 +31 41 45.0 +094-00.1 K 3-83 21 33 58.5 +50 40 49. 1950 50.134.178 21 35 43.81 +50 54 16.7 +094-00.1 K 3-83 21 33 58.6 +50 40 50. 1950 70.002.006 21 35 43.91 +50 54 17.7 +094-00.1 K 3-83 21 35 43.52 +50 54 15.1 2000 70.002.006 rad 21 35 43.52 +50 54 15.1 +094-00.1 K 3-83 21 33 58.6 +50 40 50. 1950 IRAS21339+5040 21 35 43.91 +50 54 17.7 +066-28.1 NGC 7094 21 34 27.9 +12 33 49. 1950 CGPN/Ko 64d * 21 36 52.83 +12 47 19.0 +066-28.1 NGC 7094 21 34 27.9 +12 33 49. 1950 09.133.025 21 36 52.83 +12 47 19.0 +066-28.1 NGC 7094 21 34 27.9 +12 33 49. 1950 18.133.025 21 36 52.83 +12 47 19.0 +066-28.1 NGC 7094 21 34 28.0 +12 33 48. 1950 34.134.010 21 36 52.93 +12 47 18.0 +066-28.1 NGC 7094 21 34 28.6 +12 33 41. 1950 41.002.074 21 36 53.53 +12 47 11.0 +066-28.1 NGC 7094 21 34 26.4 +12 34 07. 1950 50.134.178 21 36 51.32 +12 47 36.9 +066-28.1 NGC 7094 21 34 28.1 +12 33 49. 1950 70.002.006 21 36 53.03 +12 47 19.0 +066-28.1 NGC 7094 21 36 52.73 +12 47 28.9 2000 70.002.006 rad 21 36 52.73 +12 47 28.9 +066-28.1 NGC 7094 21 34 28.2 +12 33 49. 1950 Ko,Ku (1999) 21 36 53.13 +12 47 19.0 +066-28.1 NGC 7094 21 34 28.14 +12 33 49.3 1950 GSC 1128-00057 21 36 53.07 +12 47 19.3 +066-28.1 NGC 7094 21 34 27.1 +12 33 48. 1950 IRAS21344+1233 21 36 52.03 +12 47 17.9 +093-02.1 M 1-79 21 35 12.7 +48 42 27. 1950 CGPN/Ko 64d * 21 37 01.62 +48 55 58.0 +093-02.1 M 1-79 21 35 11.7 +48 42 41. 1950 33.134.004 21 37 00.61 +48 56 12.0 +093-02.1 M 1-79 21 35 12.2 +48 42 34. 1950 50.134.178 21 37 01.12 +48 56 05.0 +093-02.1 M 1-79 21 35 12.5 +48 42 34. 1950 70.002.006 21 37 01.42 +48 56 05.0 +093-02.1 M 1-79 21 37 01.45 +48 56 05.0 2000 70.002.006 rad 21 37 01.45 +48 56 05.0 +093-02.1 M 1-79 21 35 11.8 +48 42 37. 1950 St,Sa (1977) 21 37 00.71 +48 56 08.0 +093-02.1 M 1-79 21 35 11.7 +48 42 26. 1950 IRAS21351+4842 21 37 00.62 +48 55 57.0 +091-04.1 K 3-84 21 36 55.3 +45 46 53. 1950 70.002.006 21 38 49.02 +46 00 28.5 +091-04.1 K 3-84 21 38 48.80 +46 00 27.0 2000 70.002.006 rad 21 38 48.80 +46 00 27.0 +091-04.1 K 3-84 21 36 55.4 +45 46 52. 1950 Ko,Ku (1999) 21 38 49.12 +46 00 27.5 +091-04.1 K 3-84 21 36 56.1 +45 46 56. 1950 IRAS21369+4546 21 38 49.82 +46 00 31.5 +098+02.1 K 3-63 21 37 34.8 +55 32 29. 1950 CGPN/Ko 65b 21 39 11.94 +55 46 05.8 +098+02.1 K 3-63 21 37 34.5 +55 32 27. 1950 33.134.004 21 39 11.64 +55 46 03.8 +098+02.1 K 3-63 21 37 34.9 +55 32 26. 1950 70.002.006 21 39 12.04 +55 46 02.8 +098+02.1 K 3-63 21 39 12.06 +55 45 59.7 2000 70.002.006 rad 21 39 12.06 +55 45 59.7 +098+02.1 K 3-63 21 37 34.9 +55 32 27. 1950 IRAS21375+5532 21 39 12.04 +55 46 03.8 +100+04.1 * IRAS21394+5844 21 40 59.2 +58 58 39. 2000 72.002.012 * 21 40 59.2 +58 58 39. +100+04.1 * IRAS21394+5844 21 39 28.83 +58 45 00.2 1950 72.002.012 rad 21 40 59.27 +58 58 41.6 +100+04.1 * IRAS21394+5844 21 39 28.8 +58 45 00. 1950 Ko,Ku (1999) 21 40 59.24 +58 58 41.4 +100+04.1 * IRAS21394+5844 21 39 28.7 +58 44 56. 1950 IRAS21394+5844 21 40 59.14 +58 58 37.4 +095-02.1 M 2-49 21 41 29. +50 11 27. 1950 CGPN/Mi 59 21 43 17.30 +50 25 13.8 +095-02.1 M 2-49 21 41 29.3 +50 11 27. 1950 CGPN/Ko 64d 21 43 17.60 +50 25 13.8 +095-02.1 M 2-49 21 41 29.3 +50 11 29. 1950 CGPN/Ko 65a 21 43 17.60 +50 25 15.8 +095-02.1 M 2-49 21 41 29.9 +50 11 29. 1950 30.135.052 21 43 18.21 +50 25 15.8 +095-02.1 M 2-49 21 41 29.35 +50 11 28.0 1950 37.134.035 21 43 17.65 +50 25 14.8 +095-02.1 M 2-49 21 41 29.30 +50 11 28.2 1950 52.002.003 21 43 17.60 +50 25 15.0 +095-02.1 M 2-49 21 41 29.3 +50 11 28. 1950 70.002.006 21 43 17.60 +50 25 14.8 +095-02.1 M 2-49 21 43 17.72 +50 25 15.6 2000 70.002.006 rad 21 43 17.72 +50 25 15.6 +095-02.1 M 2-49 21 41 29.6 +50 11 29. 1950 IRAS21414+5011 21 43 17.90 +50 25 15.8 +104+07.1 NGC 7139 21 44 49.8 +63 33 33. 1950 02.133.027 21 46 08.81 +63 47 27.3 +104+07.1 NGC 7139 21 44 51.2 +63 33 21. 1950 34.134.010 21 46 10.23 +63 47 15.4 +104+07.1 NGC 7139 21 44 49.6 +63 33 37. 1950 70.002.006 21 46 08.60 +63 47 31.3 +104+07.1 NGC 7139 21 46 08.64 +63 47 30.9 2000 70.002.006 rad 21 46 08.64 +63 47 30.9 +104+07.1 NGC 7139 21 44 49.9 +63 33 34. 1950 Ko,Ku (1999) 21 46 08.91 +63 47 28.3 +104+07.1 NGC 7139 21 44 49.2 +63 33 40. 1950 IRAS21448+6333 21 46 08.20 +63 47 34.3 +097-02.1 M 2-50 21 55 51. +51 27 19. 1950 CGPN/Mi 59 * 21 57 41.65 +51 41 39.7 +097-02.1 M 2-50 21 55 51.2 +51 27 20. 1950 CGPN/Ko 65a 21 57 41.85 +51 41 40.7 +097-02.1 M 2-50 21 55 51.2 +51 27 18. 1950 50.134.178 21 57 41.85 +51 41 38.7 +097-02.1 M 2-50 21 55 51.3 +51 27 20. 1950 70.002.006 21 57 41.95 +51 41 40.7 +097-02.1 M 2-50 21 57 41.49 +51 41 40.9 2000 70.002.006 rad 21 57 41.49 +51 41 40.9 +002-52.1 IC 5148-50 21 56 33.5 -39 37 33. 1950 70.002.006 21 59 35.23 -39 23 09.1 +002-52.1 IC 5148-50 21 59 35.29 -39 23 04.2 2000 70.002.006 rad 21 59 35.29 -39 23 04.2 +002-52.1 IC 5148-50 21 56 33.5 -39 37 32. 1950 Ko,Ku (1999) 21 59 35.23 -39 23 08.1 +002-52.1 IC 5148-50 21 56 34.3 -39 37 29. 1950 IRAS21565-3937 21 59 36.02 -39 23 05.0 +107+07.1 * IsWe 2 22 11 55.66 +65 39 01.2 1950 43.134.034 * 22 13 22.41 +65 53 55.3 +107+07.1 * IsWe 2 22 11 56.0 +65 39 01. 1950 70.002.006 22 13 22.76 +65 53 55.1 +107+07.1 * IsWe 2 22 11 56.1 +65 39 00. 1950 Ko,Ku (1999) 22 13 22.86 +65 53 54.1 +103+00.1 M 2-51 22 14 16. +57 13 36. 1950 CGPN/Mi 59 * 22 16 03.73 +57 28 35.0 +103+00.1 M 2-51 22 14 18.6 +57 13 43. 1950 CGPN/Ko 64d 22 16 06.34 +57 28 42.1 +103+00.1 M 2-51 22 14 15.6 +57 13 42. 1950 34.134.010 22 16 03.32 +57 28 41.0 +103+00.1 M 2-51 22 14 16.1 +57 13 34. 1950 70.002.006 22 16 03.83 +57 28 33.0 +103+00.1 M 2-51 22 16 03.53 +57 28 31.8 2000 70.002.006 rad 22 16 03.53 +57 28 31.8 +103+00.1 M 2-51 22 14 16.6 +57 13 42. 1950 IRAS22142+5713 22 16 04.33 +57 28 41.0 +111+11.1 * DeHt 5 22 18 21.8 +70 40 55. 1950 27.135.032 22 19 33.69 +70 56 01.2 +111+11.1 * DeHt 5 22 18 22.0 +70 40 59. 1950 70.002.006 22 19 33.89 +70 56 05.2 +111+11.1 * DeHt 5 22 18 22.1 +70 40 59. 1950 Ko,Ku (1999) 22 19 33.99 +70 56 05.2 +104+00.1 Bl 2-1 22 18 28.5 +57 59 08. 1950 CGPN/BlFG 64 22 20 16.63 +58 14 15.0 +104+00.1 Bl 2-1 22 18 28.0 +57 59 01. 1950 30.135.052 22 20 16.13 +58 14 08.0 +104+00.1 Bl 2-1 22 18 28.49 +57 59 09.8 1950 52.002.003 22 20 16.62 +58 14 16.8 +104+00.1 Bl 2-1 22 18 28.6 +57 59 11. 1950 70.002.006 22 20 16.73 +58 14 18.0 +104+00.1 Bl 2-1 22 20 16.51 +58 14 17.0 2000 70.002.006 rad 22 20 16.51 +58 14 17.0 +104+00.1 Bl 2-1 22 18 28.7 +57 59 07. 1950 IRAS22184+5759 22 20 16.84 +58 14 14.0 +103+00.2 M 2-52 22 18 41. +57 21 14. 1950 CGPN/Mi 59 22 20 30.33 +57 36 21.4 +103+00.2 M 2-52 22 18 41.8 +57 21 11. 1950 CGPN/Ko 64d 22 20 31.13 +57 36 18.4 +103+00.2 M 2-52 22 18 41.6 +57 21 14. 1950 50.134.178 22 20 30.93 +57 36 21.4 +103+00.2 M 2-52 22 18 41.3 +57 21 15. 1950 70.002.006 22 20 30.63 +57 36 22.4 +103+00.2 M 2-52 22 20 30.60 +57 36 22.6 2000 70.002.006 rad 22 20 30.60 +57 36 22.6 +103+00.2 M 2-52 22 18 42.6 +57 21 16. 1950 IRAS22187+5721 22 20 31.94 +57 36 23.4 +100-05.1 IC 5217 22 21 55.6 +50 42 52. 1950 CGPN/Ko 65a 22 23 55.66 +50 58 05.5 +100-05.1 IC 5217 22 21 55.66 +50 42 47.2 1950 12.133.017 22 23 55.72 +50 58 00.7 +100-05.1 IC 5217 22 21 55.65 +50 42 47.7 1950 37.134.035 22 23 55.71 +50 58 01.2 +100-05.1 IC 5217 22 21 55.7 +50 42 47. 1950 41.134.007 22 23 55.76 +50 58 00.5 +100-05.1 IC 5217 22 21 55.6 +50 42 52. 1950 65.134.076 22 23 55.66 +50 58 05.5 +100-05.1 IC 5217 22 21 55.6 +50 42 47. 1950 70.002.006 22 23 55.66 +50 58 00.5 +100-05.1 IC 5217 22 23 55.78 +50 58 00.6 2000 70.002.006 rad 22 23 55.78 +50 58 00.6 +100-05.1 IC 5217 22 21 55.6 +50 42 46. 1950 St,Sa (1977) 22 23 55.66 +50 57 59.5 +100-05.1 IC 5217 22 21 55.9 +50 42 44. 1950 IRAS22219+5042 22 23 55.96 +50 57 57.5 +102-02.1 A 79 22 24 21.4 +54 34 20. 1950 CGPN/Ko 64d 22 26 17.30 +54 49 37.7 +102-02.1 A 79 22 24 21.5 +54 34 23. 1950 34.134.010 22 26 17.40 +54 49 40.7 +102-02.1 A 79 22 24 21.4 +54 34 22. 1950 70.002.006 22 26 17.30 +54 49 39.7 +102-02.1 A 79 22 26 17.82 +54 49 35.8 2000 70.002.006 rad 22 26 17.82 +54 49 35.8 +036-57.1 NGC 7293 22 26 54.4 -21 05 32. 1950 02.133.027 * 22 29 38.15 -20 50 08.8 +036-57.1 NGC 7293 22 26 54.6 -21 05 50. 1950 09.133.025 22 29 38.35 -20 50 26.8 +036-57.1 NGC 7293 22 26 54.8 -21 05 41. 1950 28.135.019 22 29 38.55 -20 50 17.8 +036-57.1 NGC 7293 22 26 55.0 -21 05 38. 1950 34.134.010 22 29 38.75 -20 50 14.8 +036-57.1 NGC 7293 22 26 55.0 -21 06 09. 1950 50.134.178 22 29 38.75 -20 50 45.8 +036-57.1 NGC 7293 22 29 38.46 -20 50 13.3 2000 51.002.047 22 29 38.46 -20 50 13.3 +036-57.1 NGC 7293 22 26 54.7 -21 05 35. 1950 70.002.006 22 29 38.45 -20 50 11.8 +104-01.2 KLW 8 22 30 10.4 +56 11 43. 2000 66.134.013 * 22 30 10.4 +56 11 43. +104-01.2 KLW 8 22 28 11.5 +55 56 28. 1950 Ko,Ku (1999) 22 30 06.94 +56 11 52.3 +099-08.1 * HtDe 13 22 28 27.8 +47 16 01. 1950 43.134.029 * 22 30 33.63 +47 31 26.0 +099-08.1 * HtDe 13 22 28 27.8 +47 15 57. 1950 Ko,Ku (1999) 22 30 33.63 +47 31 22.0 +100-08.1 Me 2-2 22 29 36.4 +47 32 46. 1950 CGPN/Ko 64d 22 31 42.30 +47 48 12.9 +100-08.1 Me 2-2 22 29 37.74 +47 32 37.5 1950 37.134.035 22 31 43.65 +47 48 04.4 +100-08.1 Me 2-2 22 29 37.78 +47 32 37.1 1950 52.002.003 22 31 43.69 +47 48 04.0 +100-08.1 Me 2-2 22 29 37.8 +47 32 37. 1950 70.002.006 22 31 43.71 +47 48 03.9 +100-08.1 Me 2-2 22 31 43.70 +47 48 03.0 2000 70.002.006 rad 22 31 43.70 +47 48 03.0 +100-08.1 Me 2-2 22 31 43.68 +47 48 03.8 2000 70.134.064 22 31 43.68 +47 48 03.8 +100-08.1 Me 2-2 22 29 38.3 +47 32 41. 1950 IRAS22296+4732 22 31 44.21 +47 48 07.9 +104-01.1 M 2-53 22 30 21. +55 54 58. 1950 CGPN/Mi 59 22 32 17.34 +56 10 25.9 +104-01.1 M 2-53 22 30 21.4 +55 54 55. 1950 CGPN/Ko 64d 22 32 17.74 +56 10 23.0 +104-01.1 M 2-53 22 30 21.3 +55 54 59. 1950 50.134.178 22 32 17.64 +56 10 26.9 +104-01.1 M 2-53 22 30 21.3 +55 54 58. 1950 70.002.006 22 32 17.64 +56 10 25.9 +104-01.1 M 2-53 22 32 17.80 +56 10 27.1 2000 70.002.006 rad 22 32 17.80 +56 10 27.1 +104-01.1 M 2-53 22 30 21.0 +55 54 52. 1950 IRAS22303+5554 22 32 17.34 +56 10 19.9 +102-05.1 A 80 22 32 43.8 +52 10 32. 1950 34.134.010 * 22 34 45.80 +52 26 03.9 +102-05.1 A 80 22 32 42.0 +52 10 15. 1950 50.134.178 22 34 44.00 +52 25 46.9 +102-05.1 A 80 22 32 43.5 +52 10 40. 1950 70.002.006 22 34 45.50 +52 26 11.9 +102-05.1 A 80 22 32 43.3 +52 10 37. 1950 Ko,Ku (1999) 22 34 45.30 +52 26 08.9 +105+00.1 * IRAS22331+5809 22 33 05.9 +58 09 11. 1950 72.002.012 rad 22 35 00.08 +58 24 43.4 +105+00.1 * IRAS22331+5809 22 35 01.1 +58 24 47. 2000 72.002.012 22 35 01.1 +58 24 47. +105+00.1 * IRAS22331+5809 22 33 07.0 +58 09 14. 1950 Ko,Ku (1999) 22 35 01.19 +58 24 46.4 +105+00.1 * IRAS22331+5809 22 33 06.5 +58 09 09. 1950 IRAS22331+5809 22 35 00.69 +58 24 41.4 +107+02.1 NGC 7354 22 35 52.24 +60 39 33.8 1880 CGPN/Wn 09 * 22 40 20.01 +61 17 07.3 +107+02.1 NGC 7354 22 36 36.51 +60 45 51.0 1900 CGPN/Si 27 22 40 19.87 +61 17 09.9 +107+02.1 NGC 7354 22 38 27.9 +61 01 26. 1950 CGPN/Ko 64d 22 40 19.89 +61 17 06.7 +107+02.1 NGC 7354 22 38 26.2 +61 01 17. 1950 CGPN/Koal 65 22 40 18.18 +61 16 57.6 +107+02.1 NGC 7354 22 38 27.9 +61 01 28. 1950 11.133.008 22 40 19.89 +61 17 08.7 +107+02.1 NGC 7354 22 38 28.1 +61 01 25. 1950 41.134.007 22 40 20.10 +61 17 05.7 +107+02.1 NGC 7354 22 38 27.9 +61 01 28. 1950 70.002.006 22 40 19.89 +61 17 08.7 +107+02.1 NGC 7354 22 40 19.95 +61 17 08.0 2000 70.002.006 rad 22 40 19.95 +61 17 08.0 +107+02.1 NGC 7354 22 38 28.1 +61 01 26. 1950 IRAS22384+6101 22 40 20.10 +61 17 06.7 +117+18.1 IC 1454 22 42 34.0 +80 10 48. 1950 50.134.178 * 22 42 58.43 +80 26 33.6 +117+18.1 IC 1454 22 42 00.7 +80 10 47. 1950 70.002.006 22 42 24.23 +80 26 31.8 +117+18.1 IC 1454 22 42 24.50 +80 26 33.0 2000 70.002.006 rad 22 42 24.50 +80 26 33.0 +117+18.1 IC 1454 22 42 01.7 +80 10 46. 1950 Ko,Ku (1999) 22 42 25.26 +80 26 30.8 +117+18.1 IC 1454 22 41 56.9 +80 10 53. 1950 IRAS22419+8010 22 42 20.30 +80 26 37.7 +107-00.1 * K 4-57 22 46 34.3 +58 13 16. 1950 70.002.006 22 48 34.39 +58 29 08.4 +107-00.1 * K 4-57 22 46 34.5 +58 13 15. 1950 Ko,Ku (1999) 22 48 34.59 +58 29 07.4 +107-00.1 * K 4-57 22 46 34.5 +58 13 14. 1950 IRAS22465+5813 22 48 34.59 +58 29 06.4 +111+06.1 * KJPN 6 22 47 16.6 +66 45 46. 1950 50.134.178 22 49 02.09 +67 01 39.2 +111+06.1 * KJPN 6 22 47 16.7 +66 45 47. 1950 70.002.006 22 49 02.19 +67 01 40.2 +111+06.1 * KJPN 6 22 49 02.21 +67 01 34.1 2000 70.002.006 rad 22 49 02.21 +67 01 34.1 +111+06.1 * KJPN 6 22 47 16.9 +66 45 46. 1950 Ko,Ku (1999) 22 49 02.40 +67 01 39.2 +111+06.1 * KJPN 6 22 47 16.2 +66 45 45. 1950 IRAS22472+6645 22 49 01.69 +67 01 38.1 +108+00.1 * K 3-85 22 48 53. +59 14 24. 1950 07.133.004 * 22 50 52.79 +59 30 19.5 +108+00.1 * K 3-85 22 48 53.2 +59 14 22. 1950 Ko,Ku (1999) 22 50 52.99 +59 30 17.5 +108+00.1 * K 3-85 22 48 53.3 +59 14 27. 1950 IRAS22488+5914 22 50 53.09 +59 30 22.5 +106-04.1 K 3-86 22 52 39. +54 40 00. 1950 07.133.004 22 54 45.76 +54 56 00.4 +106-04.1 K 3-86 22 52 38.6 +54 40 00. 1950 Ko,Ku (1999) 22 54 45.36 +54 56 00.4 +107-02.2 K 3-87 22 53 01.9 +56 26 30. 1950 50.134.178 * 22 55 06.96 +56 42 30.8 +107-02.2 K 3-87 22 53 02.0 +56 26 29. 1950 70.002.006 22 55 07.06 +56 42 29.8 +107-02.2 K 3-87 22 55 06.45 +56 42 29.5 2000 70.002.006 rad 22 55 06.45 +56 42 29.5 +107-02.1 M 1-80 22 54 15. +56 53 19. 1950 CGPN/Mi 59 22 56 20.09 +57 09 21.3 +107-02.1 M 1-80 22 54 14.6 +56 53 19. 1950 CGPN/Ko 64d 22 56 19.69 +57 09 21.3 +107-02.1 M 1-80 22 54 14.7 +56 53 19. 1950 50.134.178 22 56 19.79 +57 09 21.3 +107-02.1 M 1-80 22 54 14.8 +56 53 18. 1950 70.002.006 22 56 19.89 +57 09 20.3 +107-02.1 M 1-80 22 56 19.88 +57 09 19.7 2000 70.002.006 rad 22 56 19.88 +57 09 19.7 +107-02.1 M 1-80 22 54 14.8 +56 53 19. 1950 St,Sa (1977) 22 56 19.89 +57 09 21.3 +107-02.1 M 1-80 22 54 14.8 +56 53 17. 1950 IRAS22542+5653 22 56 19.89 +57 09 19.3 +110+01.1 * IRAS22568+6141 22 56 51.2 +61 41 37. 1950 53.112.200 22 58 51.57 +61 57 42.4 +110+01.1 * IRAS22568+6141 22 56 51.1 +61 41 39. 1950 70.002.006 22 58 51.46 +61 57 44.4 +110+01.1 * IRAS22568+6141 22 58 51.86 +61 57 43.4 2000 70.002.006 rad 22 58 51.86 +61 57 43.4 +110+01.1 * IRAS22568+6141 22 56 51.4 +61 41 37. 1950 Ko,Ku (1999) 22 58 51.77 +61 57 42.4 +110+01.1 * IRAS22568+6141 22 56 51.6 +61 41 39. 1950 IRAS22568+6141 22 58 51.97 +61 57 44.4 +112+03.1 K 3-88 23 10 11.4 +64 23 00. 1950 70.002.006 23 12 15.57 +64 39 19.4 +112+03.1 K 3-88 23 12 15.08 +64 39 14.1 2000 70.002.006 rad 23 12 15.08 +64 39 14.1 +112+03.1 K 3-88 23 10 11.6 +64 22 58. 1950 Ko,Ku (1999) 23 12 15.77 +64 39 17.4 +110-01.1 WeSb 6 23 10 53.4 +59 01 29. 1950 30.135.002 * 23 13 03.90 +59 17 49.1 +110-01.1 WeSb 6 23 10 51.9 +59 01 17. 1950 Ko,Ku (1999) 23 13 02.39 +59 17 37.1 +111-03.1 * We 2-260 23 20 04.9 +57 29 38. 1950 20.135.020 * 23 22 20.92 +57 46 05.7 +111-03.1 * We 2-260 23 20 09.7 +57 29 50. 1950 Ko,Ku (1999) 23 22 25.76 +57 46 17.7 +107-13.1 Vy 2-3 23 20 36.0 +46 37 32. 1950 CGPN/Ko 65a 23 22 57.98 +46 54 00.1 +107-13.1 Vy 2-3 23 20 36.0 +46 37 29. 1950 33.134.004 23 22 57.98 +46 53 57.1 +107-13.1 Vy 2-3 23 20 36.0 +46 37 31. 1950 50.134.178 23 22 57.98 +46 53 59.1 +107-13.1 Vy 2-3 23 20 36.0 +46 37 30. 1950 70.002.006 23 22 57.98 +46 53 58.1 +107-13.1 Vy 2-3 23 22 58.14 +46 53 58.7 2000 70.002.006 rad 23 22 58.14 +46 53 58.7 +107-13.1 Vy 2-3 23 20 36.5 +46 37 35. 1950 IRAS23206+4637 23 22 58.48 +46 54 03.1 +112-00.1 KJPN 8 23 21 55.8 +60 41 04. 1950 70.002.006 23 24 10.37 +60 57 33.0 +112-00.1 KJPN 8 23 21 56.0 +60 41 01. 1950 Ko,Ku (1999) 23 24 10.57 +60 57 30.0 +106-17.1 NGC 7662 23 20 57.10 +41 58 08.3 1897 CGPN/We 03 23 25 53.85 +42 32 06.7 +106-17.1 NGC 7662 23 20 08.40 +41 52 31.0 1880 CGPN/Wn 09 23 25 53.88 +42 32 05.3 +106-17.1 NGC 7662 23 21 05.74 +41 59 05.9 1900 CGPN/Lo 11 23 25 53.89 +42 32 05.0 +106-17.1 NGC 7662 23 21 05.84 +41 59 10.9 1900 CGPN/Si 27 23 25 53.99 +42 32 10.0 +106-17.1 NGC 7662 23 23 29.4 +42 15 36. 1950 CGPN/Ko 64d 23 25 53.81 +42 32 06.2 +106-17.1 NGC 7662 23 23 29.20 +42 15 35.6 1950 11.133.008 23 25 53.61 +42 32 05.8 +106-17.1 NGC 7662 23 23 29.55 +42 15 35.7 1950 12.133.01 23 25 53.96 +42 32 05.9 +106-17.1 NGC 7662 23 23 29.5 +42 15 35. 1950 50.134.178 23 25 53.91 +42 32 05.2 +106-17.1 NGC 7662 23 23 29.4 +42 15 36. 1950 65.134.076 23 25 53.81 +42 32 06.2 +106-17.1 NGC 7662 23 23 29.5 +42 15 36. 1950 70.002.006 23 25 53.91 +42 32 06.2 +106-17.1 NGC 7662 23 25 53.89 +42 32 04.7 2000 70.002.006 rad 23 25 53.89 +42 32 04.7 +106-17.1 NGC 7662 23 23 29.52 +42 15 36.0 1950 AGK3+42 2277 23 25 53.93 +42 32 06.2 +106-17.1 NGC 7662 23 25 54.00 +42 32 06.0 2000 PPM 064213 23 25 54.00 +42 32 06.0 +106-17.1 NGC 7662 23 23 29.8 +42 15 37. 1950 IRAS23234+4215 23 25 54.21 +42 32 07.2 +111-02.1 Hb 12 23 23 57.2 +57 54 24. 1950 CGPN/Ko 64d 23 26 14.73 +58 10 54.4 +111-02.1 Hb 12 23 23 57.29 +57 54 24.8 1950 20.041.026 23 26 14.82 +58 10 55.2 +111-02.1 Hb 12 23 23 57.3 +57 54 25. 1950 31.116.001 23 26 14.83 +58 10 55.4 +111-02.1 Hb 12 23 23 57.30 +57 54 24.3 1950 52.002.003 23 26 14.83 +58 10 54.7 +111-02.1 Hb 12 23 23 57.28 +57 54 24.2 1950 63.134.081 23 26 14.81 +58 10 54.6 +111-02.1 Hb 12 23 23 57.2 +57 54 25. 1950 65.134.076 23 26 14.73 +58 10 55.4 +111-02.1 Hb 12 23 26 14.82 +58 10 54.9 2000 70.134.064 23 26 14.82 +58 10 54.9 +111-02.1 Hb 12 23 23 57.4 +57 54 22. 1950 70.002.006 23 26 14.93 +58 10 52.4 +111-02.1 Hb 12 23 23 57.3 +57 54 24. 1950 St,Sa (1977) 23 26 14.83 +58 10 54.4 +111-02.1 Hb 12 23 23 57.6 +57 54 24. 1950 IRAS23239+5754 23 26 15.13 +58 10 54.4 +116+08.1 M 2-55 23 29 41. +70 05 39. 1950 CGPN/Mi 59 23 31 51.13 +70 22 12.8 +116+08.1 M 2-55 23 29 41.0 +70 05 40. 1950 34.134.010 23 31 51.13 +70 22 13.8 +116+08.1 M 2-55 23 29 40.8 +70 05 46. 1950 50.134.178 23 31 50.93 +70 22 19.8 +116+08.1 M 2-55 23 29 41.4 +70 05 42. 1950 70.002.006 23 31 51.54 +70 22 15.8 +116+08.1 M 2-55 23 31 51.16 +70 22 13.8 2000 70.002.006 rad 23 31 51.16 +70 22 13.8 +116+08.1 M 2-55 23 29 41.1 +70 05 38. 1950 IRAS23296+7005 23 31 51.23 +70 22 11.8 +104-29.1 Jn 1 23 33 24.1 +30 11 26. 1950 34.134.010 * 23 35 53.55 +30 28 02.0 +104-29.1 Jn 1 23 33 20.9 +30 10 59. 1950 50.134.178 23 35 50.34 +30 27 35.0 +104-29.1 Jn 1 23 33 24.1 +30 11 26. 1950 70.002.006 23 35 53.55 +30 28 02.0 +104-29.1 Jn 1 23 33 24.1 +30 11 30. 1950 Ko,Ku (1999) 23 35 53.55 +30 28 06.0 +110-12.1 K 1-20 23 36 44.2 +47 55 52. 1950 CGPN/Ko 64d 23 39 10.83 +48 12 29.4 +110-12.1 K 1-20 23 36 44.6 +47 55 54. 1950 34.134.010 23 39 11.23 +48 12 31.4 +110-12.1 K 1-20 23 36 44.1 +47 55 53. 1950 70.002.006 23 39 10.73 +48 12 30.4 +120+18.1 * Sh 2-174 23 42 57. +80 40 12. 1950 04.126.008 * 23 45 01.98 +80 56 51.5 +120+18.1 * Sh 2-174 23 42 57.6 +80 40 20. 1950 Ko,Ku (1999) 23 45 02.59 +80 56 59.5 +114-04.1 A 82 23 43 20.4 +56 47 24. 1950 02.133.027 * 23 45 47.27 +57 04 03.7 +114-04.1 A 82 23 43 20.6 +56 47 21. 1950 34.134.010 23 45 47.47 +57 04 00.7 +114-04.1 A 82 23 43 20.3 +56 47 14. 1950 50.134.178 23 45 47.17 +57 03 53.7 +114-04.1 A 82 23 43 20.6 +56 47 16. 1950 70.002.006 23 45 47.47 +57 03 55.7 +114-04.1 A 82 23 45 46.10 +57 03 53.0 2000 70.002.006 rad 23 45 46.10 +57 03 53.0 +113-06.1 A 83 23 44 19.1 +54 27 58. 1950 70.002.006 23 46 46.95 +54 44 38.0 +113-06.1 A 83 23 44 18.9 +54 27 59. 1950 Ko,Ku (1999) 23 46 46.74 +54 44 39.0 +112-10.1 A 84 23 45 15.1 +51 07 17. 1950 02.133.027 23 47 43.96 +51 23 57.3 +112-10.1 A 84 23 45 16.0 +51 07 17. 1950 34.134.010 23 47 44.87 +51 23 57.3 +112-10.1 A 84 23 45 16.2 +51 07 19. 1950 50.134.178 23 47 45.07 +51 23 59.3 +112-10.1 A 84 23 45 15.0 +51 07 16. 1950 70.002.006 23 47 43.86 +51 23 56.3 +112-10.1 A 84 23 45 14.5 +51 07 18. 1950 IRAS23452+5107 23 47 43.36 +51 23 58.3 +116+00.1 * We 2-262 23 49 52.9 +62 15 59. 1950 50.134.178 * 23 52 21.72 +62 32 40.2 +116+00.1 * We 2-262 23 49 50.2 +62 15 30. 1950 Ko,Ku (1999) 23 52 19.00 +62 32 11.2 +118+08.1 * M 2-56 23 54 07. +70 31 38. 1950 CGPN/Mi 59 23 56 36.92 +70 48 19.7 +118+08.1 * M 2-56 23 54 06.6 +70 31 31. 1950 30.135.052 23 56 36.52 +70 48 12.7 +118+08.1 * M 2-56 23 54 06.7 +70 31 35. 1950 IRAS23541+7031 23 56 36.62 +70 48 16.7 +118+08.2 A 86 23 59 00.0 +70 26 00. 1950 70.002.006 * 00 01 34.01 +70 42 42.0 +118+08.2 A 86 23 58 56.6 +70 25 48. 1950 72.002.012 00 01 30.56 +70 42 30.0 +118+08.2 A 86 23 58 57.1 +70 25 47. 1950 Ko,Ku (1999) 00 01 31.07 +70 42 29.0 diff --git a/astro_data/pifinder_objects.db b/astro_data/pifinder_objects.db index 40efa599b..43e01d247 100644 Binary files a/astro_data/pifinder_objects.db and b/astro_data/pifinder_objects.db differ diff --git a/bin/cedar-detect-server-aarch64 b/bin/cedar-detect-server-aarch64 deleted file mode 100755 index 7b44b89b7..000000000 Binary files a/bin/cedar-detect-server-aarch64 and /dev/null differ diff --git a/bin/cedar-detect-server-arm64 b/bin/cedar-detect-server-arm64 deleted file mode 100755 index ea792437f..000000000 Binary files a/bin/cedar-detect-server-arm64 and /dev/null differ diff --git a/default_config.json b/default_config.json index 7684bff0f..26309ca1e 100644 --- a/default_config.json +++ b/default_config.json @@ -180,7 +180,9 @@ "active_eyepiece_index": 0 }, "imu_threshold_scale": 1, + "dev_mode": false, "telemetry_record": false, - "telemetry_images": false, - "telemetry_raw_imu": false + "telemetry_raw_imu": false, + "telemetry_sections": ["imu", "sqm", "solve", "target"], + "telemetry_max_session_mb": 1024 } diff --git a/deploy-image-to-nfs.sh b/deploy-image-to-nfs.sh new file mode 100755 index 000000000..1aec63990 --- /dev/null +++ b/deploy-image-to-nfs.sh @@ -0,0 +1,383 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Deploy PiFinder NixOS netboot configuration to proxnix +# +# Builds the pifinder-netboot closure (NFS root baked in), copies the nix store +# closure to NFS, and sets up TFTP with kernel/initrd/firmware for PXE boot. +# +# Boot sequence: Pi firmware → u-boot → extlinux/extlinux.conf (TFTP) → NFS root + +PROXNIX="mike@192.168.5.12" +NFS_ROOT="/srv/nfs/pifinder" +TFTP_ROOT="/srv/tftp" +PI_IP="192.168.5.150" +PI_MAC="e4-5f-01-b7-37-31" # For PXE boot speedup + +# SSH options to prevent timeout during long transfers +SSH_OPTS="-o ServerAliveInterval=30 -o ServerAliveCountMax=10" +export RSYNC_RSH="ssh ${SSH_OPTS}" + +SSH_PUBKEY="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGrPg9hSgxwg0EECxXSpYi7t3F/w/BgpymlD1uUDedRz mike@nixtop" + +# Password hash for "solveit" +SHADOW_HASH='$6$upbQ1/Jfh7zDiIYW$jPVQdYJCZn/Pe/OIGx89DZm9trIhEJp7Q4LNZsq/5x9csj6U08.P2avebrQIDJCEyD0xipsV6C19Sr5iAbCuv1' + +# ── Helpers ────────────────────────────────────────────────────────────────── + +run_proxnix() { + ssh ${SSH_OPTS} "${PROXNIX}" "bash -euo pipefail -c \"$1\"" +} + +# ── Build netboot closure ──────────────────────────────────────────────────── + +echo "=== Building pifinder-netboot closure ===" +nix build .#nixosConfigurations.pifinder-netboot.config.system.build.toplevel \ + -o result-netboot --system aarch64-linux + +CLOSURE=$(readlink -f result-netboot) +echo "Closure: $CLOSURE" + +# Extract paths from closure +KERNEL=$(readlink -f result-netboot/kernel) +INITRD=$(readlink -f result-netboot/initrd) +DTBS=$(readlink -f result-netboot/dtbs) +INIT_PATH="${CLOSURE}/init" + +KERNEL_NAME=$(basename "$(dirname "$KERNEL")")-Image +INITRD_NAME=$(basename "$(dirname "$INITRD")")-initrd + +echo "Kernel: $KERNEL" +echo "Initrd: $INITRD" +echo "DTBs: $DTBS" +echo "Init: $INIT_PATH" + +# ── Stop TFTP — prevent Pi from netbooting during deploy ───────────────────── + +echo "Stopping TFTP server..." +ssh "${PROXNIX}" "sudo systemctl stop atftpd.service" + +# ── Halt Pi if running — prevent NFS corruption ────────────────────────────── + +if ssh -o ConnectTimeout=3 -o BatchMode=yes "pifinder@${PI_IP}" "echo ok" 2>/dev/null; then + echo "Pi is running — halting..." + ssh "pifinder@${PI_IP}" "echo solveit | sudo -S poweroff" 2>/dev/null || true + echo "Waiting for Pi to go down..." + sleep 3 + while ping -c1 -W1 "${PI_IP}" &>/dev/null; do sleep 1; done + echo "Pi is down" +else + echo "Pi not reachable, proceeding" +fi + +# ── Backup SSH host keys ───────────────────────────────────────────────────── + +echo "Backing up SSH host keys..." +ssh "${PROXNIX}" "sudo cp -a ${NFS_ROOT}/etc/ssh/ssh_host_* /tmp/ 2>/dev/null || true" + +# ── Copy nix store closure to NFS ──────────────────────────────────────────── + +echo "Copying nix store closure to NFS..." +ssh "${PROXNIX}" "sudo mkdir -p ${NFS_ROOT}/nix/store" + +# Get list of store paths and stream via tar (fast, handles duplicates via overwrite) +STORE_PATHS=$(nix path-info -r "$CLOSURE") +TOTAL_PATHS=$(echo "$STORE_PATHS" | wc -l) +echo "Streaming ${TOTAL_PATHS} store paths via tar..." + +# Rsync store paths with -R to preserve directory structure +# shellcheck disable=SC2086 +rsync -avR --rsync-path="sudo rsync" $STORE_PATHS "${PROXNIX}:${NFS_ROOT}/" +echo "Transfer complete" + +# ── Set up NFS root directory structure ────────────────────────────────────── + +echo "Setting up NFS root directory structure..." +ssh "${PROXNIX}" "sudo bash -euo pipefail" << SETUP +# Create standard directories (bin/usr are symlinks, not dirs) +mkdir -p ${NFS_ROOT}/{etc/ssh,home/pifinder/.ssh,root/.ssh,var,tmp,proc,sys,dev,run,boot} +chmod 1777 ${NFS_ROOT}/tmp + +# Symlinks from NixOS system (remove existing dirs/symlinks first) +rm -rf ${NFS_ROOT}/bin ${NFS_ROOT}/usr +ln -sfT ${CLOSURE}/sw/bin ${NFS_ROOT}/bin +ln -sfT ${CLOSURE}/sw ${NFS_ROOT}/usr + +# /etc/static points to the NixOS etc derivation (required for PAM, etc.) +ln -sfT ${CLOSURE}/etc ${NFS_ROOT}/etc/static + +# Critical /etc symlinks that NixOS activation would normally create +rm -rf ${NFS_ROOT}/etc/pam.d 2>/dev/null || true +ln -sfT /etc/static/pam.d ${NFS_ROOT}/etc/pam.d +ln -sfT /etc/static/bashrc ${NFS_ROOT}/etc/bashrc +# passwd/shadow/group are created as real files later (need to be writable for netboot) +rm -f ${NFS_ROOT}/etc/passwd ${NFS_ROOT}/etc/shadow ${NFS_ROOT}/etc/group 2>/dev/null || true +ln -sfT /etc/static/sudoers ${NFS_ROOT}/etc/sudoers 2>/dev/null || true +ln -sfT /etc/static/sudoers.d ${NFS_ROOT}/etc/sudoers.d 2>/dev/null || true +ln -sfT /etc/static/nsswitch.conf ${NFS_ROOT}/etc/nsswitch.conf 2>/dev/null || true +ln -sfT /etc/static/systemd ${NFS_ROOT}/etc/systemd 2>/dev/null || true +ln -sfT /etc/static/polkit-1 ${NFS_ROOT}/etc/polkit-1 2>/dev/null || true + +# Create nix profile symlinks +mkdir -p ${NFS_ROOT}/nix/var/nix/profiles +ln -sfT ${CLOSURE} ${NFS_ROOT}/nix/var/nix/profiles/system +ln -sfT ${CLOSURE} ${NFS_ROOT}/run/current-system 2>/dev/null || true +SETUP + +# ── Restore SSH host keys ──────────────────────────────────────────────────── + +echo "Restoring/generating SSH host keys..." +ssh "${PROXNIX}" "bash -euo pipefail -c ' +if ls /tmp/ssh_host_* >/dev/null 2>&1; then + sudo cp -a /tmp/ssh_host_* ${NFS_ROOT}/etc/ssh/ + echo \"Restored existing host keys\" +else + sudo ssh-keygen -A -f ${NFS_ROOT} + echo \"Generated new host keys\" +fi +'" + +# ── Link NixOS /etc files ──────────────────────────────────────────────────── + +echo "Linking NixOS etc files..." +ssh "${PROXNIX}" "sudo bash -euo pipefail -c ' +ln -sf /etc/static/ssh/sshd_config ${NFS_ROOT}/etc/ssh/sshd_config +ln -sf /etc/static/ssh/ssh_config ${NFS_ROOT}/etc/ssh/ssh_config 2>/dev/null || true +ln -sf /etc/static/ssh/moduli ${NFS_ROOT}/etc/ssh/moduli 2>/dev/null || true +# pam.d already symlinked to /etc/static/pam.d in SETUP block +'" + +# ── Static user files ──────────────────────────────────────────────────────── + +echo "Creating static user files..." + +ssh "${PROXNIX}" "sudo tee ${NFS_ROOT}/etc/passwd > /dev/null" << 'PASSWD' +root:x:0:0:System administrator:/root:/run/current-system/sw/bin/bash +pifinder:x:1000:100::/home/pifinder:/run/current-system/sw/bin/bash +nobody:x:65534:65534:Unprivileged account:/var/empty:/run/current-system/sw/bin/nologin +sshd:x:993:993:SSH daemon user:/var/empty:/run/current-system/sw/bin/nologin +avahi:x:994:994:Avahi daemon user:/var/empty:/run/current-system/sw/bin/nologin +gpsd:x:992:992:GPSD daemon user:/var/empty:/run/current-system/sw/bin/nologin +PASSWD + +ssh "${PROXNIX}" "sudo tee ${NFS_ROOT}/etc/group > /dev/null" << 'GROUP' +root:x:0: +wheel:x:1:pifinder +users:x:100:pifinder +kmem:x:9:pifinder +input:x:174:pifinder +nobody:x:65534: +spi:x:996:pifinder +i2c:x:997:pifinder +gpio:x:998:pifinder +dialout:x:995:pifinder +video:x:994:pifinder +networkmanager:x:993:pifinder +sshd:x:993: +avahi:x:994: +gpsd:x:992: +GROUP + +ssh "${PROXNIX}" "echo 'root:${SHADOW_HASH}:1:::::: +pifinder:${SHADOW_HASH}:1:::::: +nobody:!:1:::::: +sshd:!:1:::::: +avahi:!:1:::::: +gpsd:!:1::::::' | sudo tee ${NFS_ROOT}/etc/shadow > /dev/null" + +run_proxnix "sudo chmod 644 ${NFS_ROOT}/etc/passwd ${NFS_ROOT}/etc/group" +run_proxnix "sudo chmod 640 ${NFS_ROOT}/etc/shadow" + +# ── SSH authorized_keys ────────────────────────────────────────────────────── + +echo "Setting up SSH authorized_keys..." +ssh "${PROXNIX}" "echo '${SSH_PUBKEY}' | sudo tee ${NFS_ROOT}/home/pifinder/.ssh/authorized_keys > /dev/null" +ssh "${PROXNIX}" "echo '${SSH_PUBKEY}' | sudo tee ${NFS_ROOT}/root/.ssh/authorized_keys > /dev/null" +run_proxnix "sudo chown -R 1000:100 ${NFS_ROOT}/home/pifinder" +run_proxnix "sudo chmod 700 ${NFS_ROOT}/home/pifinder/.ssh ${NFS_ROOT}/root/.ssh" +run_proxnix "sudo chmod 600 ${NFS_ROOT}/home/pifinder/.ssh/authorized_keys ${NFS_ROOT}/root/.ssh/authorized_keys" + +# ── PiFinder symlink ───────────────────────────────────────────────────────── + +echo "Setting up PiFinder directory..." +# Find pifinder-src from the current closure (not just any old one in the store) +PFSRC_REL=$(nix path-info -r "$CLOSURE" | grep pifinder-src | head -1) +echo "PiFinder source from closure: $PFSRC_REL" +ssh "${PROXNIX}" "sudo bash -euo pipefail -c ' +PFSRC=\"${NFS_ROOT}${PFSRC_REL}\" +if [ ! -d \"\$PFSRC\" ]; then + echo \"ERROR: pifinder-src not found: \$PFSRC\" + exit 1 +fi +PFHOME=${NFS_ROOT}/home/pifinder/PiFinder + +echo \"PiFinder source: ${PFSRC_REL}\" + +[ -L \"\$PFHOME\" ] && rm \"\$PFHOME\" +[ -d \"\$PFHOME\" ] && rm -rf \"\$PFHOME\" + +ln -sfT \"${PFSRC_REL}\" \"\$PFHOME\" + +mkdir -p ${NFS_ROOT}/home/pifinder/PiFinder_data +chown 1000:100 ${NFS_ROOT}/home/pifinder/PiFinder_data +'" + +# ── Copy firmware to TFTP (from raspberrypi firmware package) ──────────────── + +echo "Copying firmware to TFTP..." +FW_PKG=$(nix build nixpkgs#raspberrypifw --print-out-paths --system aarch64-linux 2>/dev/null) +ssh "${PROXNIX}" "sudo mkdir -p ${TFTP_ROOT}" + +# Copy firmware files +rsync -avz "${FW_PKG}/share/raspberrypi/boot/"*.{elf,dat,bin,dtb} "${PROXNIX}:/tmp/fw/" +ssh "${PROXNIX}" "sudo cp /tmp/fw/* ${TFTP_ROOT}/ && rm -rf /tmp/fw" + +# Copy custom u-boot with network boot priority +UBOOT=$(nix build .#packages.aarch64-linux.uboot-netboot --print-out-paths --system aarch64-linux 2>/dev/null) +echo "Using custom u-boot: $UBOOT" +rsync -avz "${UBOOT}/u-boot.bin" "${PROXNIX}:/tmp/u-boot-rpi4.bin" +ssh "${PROXNIX}" "sudo mv /tmp/u-boot-rpi4.bin ${TFTP_ROOT}/" + +# ── Copy kernel, initrd, DTBs to TFTP ──────────────────────────────────────── + +echo "Copying kernel/initrd/DTBs to TFTP..." +ssh "${PROXNIX}" "sudo mkdir -p ${TFTP_ROOT}/nixos" +rsync -avz "${KERNEL}" "${PROXNIX}:/tmp/${KERNEL_NAME}" +rsync -avz "${INITRD}" "${PROXNIX}:/tmp/${INITRD_NAME}" +ssh "${PROXNIX}" "sudo mv /tmp/${KERNEL_NAME} /tmp/${INITRD_NAME} ${TFTP_ROOT}/nixos/" + +# Copy NixOS-built DTBs (with camera overlay baked in) to dtbs/ subdirectory +ssh "${PROXNIX}" "sudo mkdir -p ${TFTP_ROOT}/dtbs" +rsync -avz "${DTBS}/broadcom/" "${PROXNIX}:/tmp/dtbs/" +ssh "${PROXNIX}" "sudo cp /tmp/dtbs/*.dtb ${TFTP_ROOT}/dtbs/ && sudo rm -rf /tmp/dtbs" + +# Copy overlays from kernel package +KERNEL_DIR=$(dirname "$KERNEL") +rsync -avz "${KERNEL_DIR}/dtbs/overlays/" "${PROXNIX}:/tmp/overlays/" +ssh "${PROXNIX}" "sudo rm -rf ${TFTP_ROOT}/overlays && sudo mv /tmp/overlays ${TFTP_ROOT}/" + +# ── Write config.txt for u-boot ────────────────────────────────────────────── + +echo "Writing config.txt..." +ssh "${PROXNIX}" "sudo tee ${TFTP_ROOT}/config.txt > /dev/null" << CONFIG +[pi4] +kernel=u-boot-rpi4.bin +enable_gic=1 +armstub=armstub8-gic.bin + +disable_overscan=1 +arm_boost=1 + +[all] +arm_64bit=1 +enable_uart=1 +avoid_warnings=1 +CONFIG + +# ── Generate extlinux/extlinux.conf ──────────────────────────────────────────── + +echo "Generating extlinux/extlinux.conf..." +ssh "${PROXNIX}" "sudo mkdir -p ${TFTP_ROOT}/extlinux && sudo tee ${TFTP_ROOT}/extlinux/extlinux.conf > /dev/null" << EXTLINUX +TIMEOUT 10 +DEFAULT nixos-default + +LABEL nixos-default + MENU LABEL NixOS - Default + LINUX /nixos/${KERNEL_NAME} + INITRD /nixos/${INITRD_NAME} + FDTDIR /dtbs + APPEND init=${INIT_PATH} ip=dhcp console=ttyS0,115200n8 console=ttyAMA0,115200n8 console=tty0 loglevel=4 +EXTLINUX + +# ── Create pxelinux.cfg for faster MAC-based boot ───────────────────────────── + +echo "Creating pxelinux.cfg/01-${PI_MAC}..." +ssh "${PROXNIX}" "sudo mkdir -p ${TFTP_ROOT}/pxelinux.cfg && sudo ln -sf ../extlinux/extlinux.conf ${TFTP_ROOT}/pxelinux.cfg/01-${PI_MAC}" + +# ── Clean up old artifacts ─────────────────────────────────────────────────── + +echo "Cleaning up old artifacts..." +ssh "${PROXNIX}" "sudo rm -f ${TFTP_ROOT}/cmdline.txt ${TFTP_ROOT}/nixos/patched-initrd 2>/dev/null || true" +ssh "${PROXNIX}" "sudo rm -f /tmp/ssh_host_*" + +# ── Restart TFTP ───────────────────────────────────────────────────────────── + +echo "Restarting TFTP server..." +ssh "${PROXNIX}" "sudo systemctl start atftpd.service" + +# ── Verification ───────────────────────────────────────────────────────────── + +echo "" +echo "==========================================" +echo "VERIFYING DEPLOYMENT CONSISTENCY" +echo "==========================================" +VERIFY_FAILED=0 + +echo -n "Checking u-boot... " +if ssh "${PROXNIX}" "test -f ${TFTP_ROOT}/u-boot-rpi4.bin"; then + echo "OK" +else + echo "FAILED" + VERIFY_FAILED=1 +fi + +echo -n "Checking config.txt... " +if ssh "${PROXNIX}" "grep -q 'kernel=u-boot-rpi4.bin' ${TFTP_ROOT}/config.txt"; then + echo "OK" +else + echo "FAILED" + VERIFY_FAILED=1 +fi + +echo -n "Checking extlinux/extlinux.conf... " +if ssh "${PROXNIX}" "test -f ${TFTP_ROOT}/extlinux/extlinux.conf"; then + echo "OK" +else + echo "FAILED" + VERIFY_FAILED=1 +fi + +echo -n "Checking kernel... " +if ssh "${PROXNIX}" "test -f ${TFTP_ROOT}/nixos/${KERNEL_NAME}"; then + echo "OK" +else + echo "FAILED" + VERIFY_FAILED=1 +fi + +echo -n "Checking initrd... " +if ssh "${PROXNIX}" "test -f ${TFTP_ROOT}/nixos/${INITRD_NAME}"; then + echo "OK" +else + echo "FAILED" + VERIFY_FAILED=1 +fi + +echo -n "Checking NFS closure... " +if ssh "${PROXNIX}" "test -f ${NFS_ROOT}${INIT_PATH}"; then + echo "OK" +else + echo "FAILED" + VERIFY_FAILED=1 +fi + +echo -n "Checking PiFinder symlink... " +PFSRC_TARGET=$(ssh "${PROXNIX}" "readlink ${NFS_ROOT}/home/pifinder/PiFinder 2>/dev/null || true") +if [ -n "$PFSRC_TARGET" ] && ssh "${PROXNIX}" "test -d ${NFS_ROOT}${PFSRC_TARGET}/python"; then + echo "OK" +else + echo "FAILED" + VERIFY_FAILED=1 +fi + +echo "==========================================" + +if [ $VERIFY_FAILED -eq 1 ]; then + echo "=== DEPLOY FAILED VERIFICATION — DO NOT BOOT ===" + exit 1 +fi + +echo "=== Deploy complete and verified ===" +echo "" +echo "Boot chain: Pi firmware → u-boot → extlinux/extlinux.conf → NFS root" +echo "To boot the Pi: power cycle it" diff --git a/docs/adr/0023-sqm-per-frame-optical-black.md b/docs/adr/0023-sqm-per-frame-optical-black.md new file mode 100644 index 000000000..752a61099 --- /dev/null +++ b/docs/adr/0023-sqm-per-frame-optical-black.md @@ -0,0 +1,60 @@ +# Per-frame optical black as the IMX290/IMX462 SQM pedestal + +## Decision + +On IMX290/IMX462 the SQM pedestal is the sensor's own shielded optical-black +(OB) rows, measured on every frame, rather than a static profile offset or a +nightly-fitted dark-current model. + +The IMX290/462 already transmits ten front vertical OB rows per frame. A kernel +patch adds a second sensor source pad (`MEDIA_BUS_FMT_SENSOR_DATA`) so those +rows reach the receiver as a separate metadata stream without changing the +1920x1080 image matrix. A libcamera cam-helper unpacks the shielded pixels, +trims the outer 5% each side, averages the central 90% and publishes the result +through `controls::SensorBlackLevels` on the 16-bit scale, tagging it +`{level, level, level, level + 1}`. The one-count sentinel in the fourth +channel distinguishes a measured value from libcamera's static tuning tuple. +`camera_pi` converts a marked value back to native ADU and attaches it to the +radiometer sample as `optical_black_pedestal`. + +A valid marked OB value is the complete per-frame pedestal: it already contains +the bias and the frame's accumulated dark signal. Pedestal precedence is +therefore: valid same-frame OB, then a user-calibrated pedestal, then the +profile `bias_offset`. No dark-current rate is applied on top of OB and no +nightly rate is fitted or persisted for these sensors. + +## Status + +Accepted for IMX462 (and IMX290, same driver). Supersedes the earlier +scheduled-pedestal-probe proposal, which is not implemented: same-frame OB makes +scheduled probe frames unnecessary on these sensors. + +## Rationale + +Sony documents OB as the reference zero for image signals, but documentation +alone did not prove OB dark accumulation matches active-pixel dark accumulation +on this stack. A same-frame cupboard test on mr2 (IMX462, production gain, +requested 30 / reported 29.512) settled it: comparing normal Bayer pixels and +shielded OB rows from identical frames, the active-green and OB +dark-accumulation slopes agreed to well under 1 ADU/s, with active green a fixed +~0.8-1.0 ADU below OB (~0.01 mag). That residual is too small to justify a +per-unit constant from one camera and is left unmodelled. + +A same-frame measurement strictly dominates a once-per-night model: it tracks +bias and accumulated dark signal live, with no user action. The rolling +radiometer median smooths gain-30 frame noise without storing a fitted rate. +Central-90% averaging (not a whole-code median) preserves sub-ADU resolution, +which matters because the exposure-dependent dark signal is small. + +## Consequences + +- IMX462 SQM is zero-touch: no lens cap, dark frames, or calibration wizard. +- Manual calibration remains the fallback for sensors without usable OB and for + frames where OB is missing or unmarked; it never overrides valid OB. +- The patched kernel is built via `nixos-hardware`; `pifinder-fast` / + `pifinder-kernel-cross` provide a fast x86_64 cross build to seed the binary + cache so CI substitutes the kernel rather than compiling it. +- Added camera-process cost is about +0.23 percentage points of one core. +- Open: IMX296 OB uses a different CSI line-type path; IMX477 OB is not yet + proved accessible in this stack. Independent-unit and temperature-range + validation of IMX462 remains useful but is not required for users. diff --git a/docs/adr/0024-perek-kohoutek-catalog.md b/docs/adr/0024-perek-kohoutek-catalog.md new file mode 100644 index 000000000..85642cda2 --- /dev/null +++ b/docs/adr/0024-perek-kohoutek-catalog.md @@ -0,0 +1,98 @@ +# The Perek-Kohoutek catalog is imported from VizieR IV/24, keyed by list position + +PiFinder ships the 1510 galactic planetary nebulae of Kohoutek's 2001 revision of the Perek-Kohoutek catalogue as catalog code **PK**. Rows come from VizieR `IV/24/table2`; positions come from SIMBAD or `IV/24/table4`, both J2000; sizes and cross-identifications come from `V/84`. The **Sequence** is the printed catalogue's 1-1510 running number, not the PK designation, which is stored as a name instead. + +Status: accepted; implemented 2026-08. Data provenance is recorded in [`astro_data/perek_kohoutek/PROVENANCE.md`](../../astro_data/perek_kohoutek/PROVENANCE.md). + +## Context + +PiFinder had Abell (79 planetary nebulae) and Sharpless, but no general catalogue of galactic planetary nebulae. Perek-Kohoutek is the standard reference: PK designations are what SIMBAD, star atlases and planetary-nebula observing guides use. + +Four facts about the source material drive the decisions below. + +1. **The PK designation is not a number.** `PK 036+17.1` encodes galactic longitude, galactic latitude and a running index within that one-degree cell. PiFinder's **Sequence** is an integer, unique within a catalog. +2. **The catalogue holds no photometry.** `IV/24` is deliberately "restricted only to the data belonging to the location and identification of the objects" — no magnitudes, no diameters, no morphological type. +3. **It is fundamentally a B1950 catalogue,** with author-computed J2000 columns on some tables and not others. +4. **Its cross-identification field is a minefield.** 188 of the 1510 entries have a `Name` beginning `M `, and every one of them is **Minkowski**, not Messier. + +## Decision + +### Source: VizieR IV/24, not the astronomy.com PDF + +The request pointed at `astronomy.com/wp-content/uploads/2024/05/Perek-Kohoutek-Catalog.pdf`. That PDF states its own provenance on page 1: it is a typeset reprint of Kohoutek 2001. It carries the same 1510 rows in the same order with the same five fields, but substitutes en-dashes for hyphens in designations and drops the PN G designation, the flags and the notes. So the PDF is not parsed; `IV/24/table2` is taken instead. + +Rejected alternatives: `V/84` alone (Strasbourg-ESO, 1992 — richer in physics but keyed on PN G with PK only as a secondary column); `V/127A` (MASH — a different, newer survey that assigns no PK designations); `V/34` (does not exist); `V/42` (Svechnikov & Bessonova close double stars, unrelated). + +`V/84` is still used, joined on the PN G designation, for the things `IV/24` lacks: apparent sizes (1034 of 1510 entries) and the `Idents` cross-identification string. + +### Sequence: the printed 1-1510 running number + +Encoding the PK designation into an integer — say `lll * 100000 + (bb + 90) * 1000 + n` — was rejected. It yields 8-digit sequences, which makes the **Designator** unreadable on a 128-pixel display and keypad entry impractical. + +Instead the **Sequence** is the row's position in `table2`, which is ordered by right ascension and is exactly the "Catalog number" column the printed catalogue prints. The real designation goes into `names`, in both spellings PK is written (`PK 036+17.1` and `PK 036+17 1`), so **Text search** and **T9 search** find either. + +The consequence is that the auto-generated name `PK 743` is a position in the list, not a designation. This is accepted: WDS and Harris have the same property, and here the numbering at least matches a published one. It is called out in the catalog description and in the user documentation. + +### Epoch: J2000 columns only, no precession + +No precession runs in this loader. `calc_utils.b1950_to_j2000` is not called and the B1950 columns are never read. Positions are taken from the first source that agrees with the catalogue's own coarse position: + +1. **SIMBAD ICRS**, for entries SIMBAD also classifies as a planetary nebula — 1399 of 1510. +2. **`IV/24/table4`**, whose `RAJ2000`/`DEJ2000` columns are author-computed from each row's own equinox — the remaining 111. +3. **`IV/24/table2`**'s own J2000 columns, rounded to 0.1 minute of right ascension and 1 arcminute of declination, as the anchor and last resort. + +The agreement check is not ceremonial. Measured against the anchor, SIMBAD and table4 agree to a median of 0.04 arcminutes, and table4 agrees with table2 to a median of 0.56 arcminutes — consistent with table2's rounding and confirming no B1950 leakage. One row fails it: `table4`'s equinox-2000 row for PK 027-03.2 (Vy 1-4) reads declination `-02 26` where its five sibling rows and SIMBAD all read `-06 26`, a four-degree typo in the source. A 5-arcminute agreement tolerance rejects it, and the same guard would catch a SIMBAD identifier resolving to the wrong object. A rejected candidate costs precision, never correctness, because the fallback is the catalogue's own position. + +### Magnitude: left empty, and that is the useful behaviour + +No PK source carries an integrated nebular magnitude, so every entry is built with an empty `MagnitudeObject`. + +This composes correctly with the existing import machinery rather than fighting it. `NewCatalogObject.insert()` skips `insert_object()` when `find_object_id()` matches, so the 211 PK entries that resolve to an existing NGC, IC, Messier, Abell or Sharpless **sky object** keep that object's real magnitude and size. The rest fall back to `UNKNOWN_MAG` and drop out of any magnitude filter on their own. No arbitrary brightness cutoff had to be invented, and no source data is overwritten. + +Roughly 200 to 300 of these nebulae are within reach of a small telescope. A metre-class instrument under dark sky with an OIII filter plausibly reaches 600 to 800. The remainder are radio- or infrared-discovered nebulae in the galactic plane, heavily reddened or of very low surface brightness, and are not visually reachable at any aperture. None of that is derivable from the source data, so none of it is encoded as a filter. + +### Alias matching: fixed in the shared util, not in this loader + +`ObjectFinder.get_object_id()` resolved aliases through `ui_utils.normalize()`, which strips spaces **and hyphens**. Any designation with a compound numeric part therefore collapsed into a plausible but wrong sequence number. Checked against the shipped database, feeding it `table2`'s `Name` column produced **147 matches, of which 145 are false**: + +| Alias | `normalize()` | Bound to | +| --- | --- | --- | +| `M 1-1`, `M 2-9`, `M 3-1` (Minkowski) | `m11`, `m29`, `m31` | Messier 11, 29, 31 | +| `H 1-1`, `H 3-29` (Haro) | `h11`, `h329` | Herschel 400 #11, #329 | +| `NGC 650-1` (M76) | `ngc6501` | NGC 6501 | +| `Sh 2-176` | `sh2176` | Sharpless 176 — correct | + +Left alone, 145 planetary nebulae would have been silently merged onto Messier open clusters, galaxies and Herschel objects, and displayed those objects' positions and magnitudes. + +The fix went into `catalog_imports/catalog_import_utils.py`, where every loader benefits, rather than into a PK-local normaliser: + +- `CATALOG_CODE_ALIASES` maps a designation prefix to a PiFinder catalog code, explicitly and by allowlist. It covers the several spellings sources use for the same catalog, including SIMBAD's `PN A66 nn` for Abell planetaries and `Sh 2-nnn` for Sharpless. +- `parse_designation()` splits a designation into prefix and trailing integer, then requires the prefix to be in that allowlist. `M 1-92` leaves prefix `m1`, `H 3-29` leaves `h3`, `NGC 650-1` leaves `ngc650` — none is a catalog, so all are rejected. `Sh 2-176` leaves `sh2`, which is, so it still resolves. +- `ObjectFinder.get_object_id()` uses that path instead of the blunt `normalize()` fallback, so a compound designation can no longer reach hyphen-stripping at all. + +A bare `h` is deliberately absent from the allowlist. Herschel 400 uses catalog code `H`, but a bare `H 12` is as likely to mean Hubble or Haro. + +Adding `cr` -> `Col` to the allowlist also made an intent already present in `post_processing.add_missing_messier_objects` finally work. It lists `"Cr 42"` among M45's aka names precisely so the Pleiades resolve to one sky object, but `Cr` had never been mapped to `Col`, so the database shipped **two** Pleiades objects. They are now one, with the M 45 and Col 42 listings sharing it. + +`NGC 650-1` is the one designation naming two catalog entries. Expanding it is loader knowledge, not util knowledge, so `pk_loader._ngc_pair()` does it — and correctly: the digits after the hyphen replace the tail of the first number, so `650-1` means NGC 650 and NGC 651, not NGC 650 and NGC 1. + +### Three data errors this import exposed + +PK carries its own positions, so every cross-link is also a check on the catalog it links to. Of the 211 linked entries, 6 disagreed with the PK position by more than 5 arcminutes, and each traced to a real defect. All three are fixed here. + +1. **`load_sharpless` never precessed declination.** It computed `j_dec_deg` from `b1950_to_j2000()` and then passed the unconverted `dec_deg`, so only right ascension was precessed. All 313 Sharpless objects sat 0.26 to 0.37 degrees off in declination — exactly the 1950-to-2000 shift. Four linked PK entries made it visible. +2. **`abell.tsv` row 47 had its declination sign dropped.** Abell 47 is at -00 13 51 per SIMBAD and `IV/24`; the file read `+0.2306`. Its constellation, Serpens, spans the celestial equator, so nothing else caught it. +3. **`abell.tsv` row 51 carried the `ngc6742` alias on the wrong row.** NGC 6742 matches row **50** to 0.1 arcminutes and is 66 degrees from row 51; `V/84` independently gives A 50, not A 51, as NGC 6742. The misplaced alias had bound the Abell 51 listing onto NGC 6742's sky object. + +After the fixes, 2 of 211 links still disagree — Sh2 176 by 6 arcminutes and Sh2 216 by 17. Both are large diffuse nebulae (Sh2 216 spans roughly 1.6 degrees), where catalogues legitimately place the centre differently. Neither is treated as an error. + +The remaining `abell.tsv` aliases were audited positionally against the database: IC 972, NGC 6742, NGC 7076 and IC 1454 all agree within 0.12 arcminutes. + +## Consequences + +- **211 PK entries share a sky object** with an existing NGC, IC, Messier, Abell or Sharpless listing, inheriting magnitude and size and showing a composed description with both catalog sections. The four Messier links are exactly the four Messier planetary nebulae: M 27, M 57, M 76 and M 97. +- **The util fix changes alias matching for every catalog**, not just PK. Two SAC Multistars listings stopped merging onto a shared object, and M45 started merging with Col 42 as intended. Any catalog whose source data fed compound designations through `ObjectFinder` stops producing false links. +- **Sharpless declinations move by about a third of a degree.** That is a correction, but it changes 313 shipped positions, so it is worth calling out to anyone comparing against an older database. +- **`PK 743` is not a designation.** Anyone reading catalog codes out of the database has to know that the `names` rows, not the sequence, carry the real PK identifier. +- **The vendored snapshot is static.** `astro_data/perek_kohoutek/fetch_sources.sh` regenerates it, but SIMBAD positions drift as astrometry improves, so a future refresh will move some coordinates slightly. +- **A future magnitude source** — HASH, or Frew's planetary-nebula database — could fill in the missing photometry. It would slot in as another join in the loader without touching any of the decisions above. diff --git a/docs/ax/nixos.md b/docs/ax/nixos.md new file mode 100644 index 000000000..4c958217d --- /dev/null +++ b/docs/ax/nixos.md @@ -0,0 +1,20 @@ +# NixOS — architecture notes + +Companion to [`nixos/CONTEXT.md`](./nixos/CONTEXT.md): how the pieces named there actually move. Sections are added as they're worked through; today it covers the on-device download. + +## Installing a version (download, availability, progress) + +Installing any version works the same way whether it's a channel pick, a rollback, or the first-boot download during the move to NixOS: the device **downloads** the files that make up that version from the cache and switches to them. It never rebuilds anything — if a file is missing from the cache, the install stops rather than compiling it. + +### One up-front query, two jobs + +When a version is chosen, the device makes a single request to the cache for that version's complete set of files and each file's download size. From the answer it gets: + +- **The download size, up front.** Drop the files already on the device, add up the sizes of the rest — a fixed total in megabytes, known before the download starts. +- **Whether the version is still there.** If the cache can't return the full set, the version has been removed: stop immediately with "no longer available" instead of failing partway through. Only **unstable** versions can reach this state; **stable** and **beta** are kept forever (see [`nixos/CONTEXT.md`](./nixos/CONTEXT.md) and [ADR 0002](./nixos/adr/0002-update-channels-and-rollback.md)). The check happens at the moment a version is picked, so browsing the list costs nothing. + +### Progress + +The bar is **size-based**: megabytes downloaded out of the up-front total, advancing each time a file finishes (its known size is added to the running total). Because the total is fixed from the start, the bar is honest from the first moment. + +This replaces the earlier behaviour, which counted files against a total that itself grew as the download proceeded — so early percentages were meaningless, and even a correct count would misreport progress because file sizes vary by orders of magnitude. The first-boot download already fixed its total up front but still counted files; it moves to the same size-based approach so both downloads behave identically. diff --git a/docs/ax/nixos/CONTEXT.md b/docs/ax/nixos/CONTEXT.md new file mode 100644 index 000000000..25bb5bd02 --- /dev/null +++ b/docs/ax/nixos/CONTEXT.md @@ -0,0 +1,98 @@ +# NixOS + +How a NixOS PiFinder system is built, published, and updated over the air — the binary cache, the release/channel metadata, and the on-device upgrade flow. Distinct from the Raspbian→NixOS one-time **Migration**, which this context feeds but does not own. + +## Language + +### Repositories and their roles + +**Upstream**: +The canonical public PiFinder repo, `brickbots/PiFinder`. The to-be home of releases, update channels, and (eventually) build infrastructure. On-device update channels already read from here (the **update manifest** on the `nixos-manifest` branch). +_Avoid_: "the main repo", bare "brickbots" in prose, "official". + +**Fork**: +`mrosseel/PiFinder` (git remote `origin`). Where NixOS is developed (the `nixos` branch) and, through the transition, where every NixOS artifact is produced — CI builds, the Attic cache, the update manifest, release tags, and the migration tarball. +_Avoid_: "my repo", bare "mrosseel", "the staging repo" used interchangeably with branch names. + +**Trunk**: +The branch that holds the live NixOS development tip and feeds the "unstable" channel's non-PR entry. Today that is `nixos` **on the Fork**; in the steady state it is `main` on the Upstream. The branch is a single switch (`TRUNK_BRANCH`), not hard-coded to `main`. +_Avoid_: conflating "trunk" with the literal branch name `main`. + +### Transition + +**Phase 1**: +Release/channel metadata and the migration gate live on the **Upstream**; the **Attic cache** and the **pi5 runner** (build infrastructure) stay on the **Fork**. A Pi reads release metadata from the Upstream but substitutes store paths from the Fork's cache. + +**Phase 2**: +Everything — builds, cache, releases, channels — is hosted by the **Upstream**. The Fork reverts to an ordinary contributor fork. + +**In-between phase**: +The current state: no NixOS artifacts exist on the Upstream yet (PR #379 not merged), so all three channels are temporarily sourced from the **Fork** (its releases for stable/beta, its `nixos` trunk + testable PRs for unstable) via a single switch, purely so they can be exercised for testing. Reverts to Upstream/`main` at upstreaming. + +### Channels + +The on-device UI offers three update **channels**, each mapped to one stage of the branch promotion flow (testable PRs → `main` → `release`). Choosing a channel and a version resolves through the **update manifest** to a store path and installs it. + +**stable**: +The production channel — official release entries in the generated manifest. The default for ordinary users. +_Avoid_: "release channel" (the *branch* is `release`; the *channel* is "stable"). + +**beta**: +The integration channel — GitHub **prereleases** (the `prerelease` flag), cut deliberately from `main`. Curated like stable (notes, explicit semver `vX.Y.Z-beta`, the version gate) and pushed to the *retained* cache, so beta builds reinstall durably too. Ceremonial, not continuous. +_Avoid_: naming the channel "prerelease" — it is "beta"; prerelease is its mechanism. + +**unstable**: +The bleeding-edge channel — the live `main`/**trunk** head plus open PRs carrying the `testable` label, each installable at its own head. The `main` entry is rendered more prominently to set it apart from the per-PR rows. Hidden until unlocked (7× square). +_Avoid_: "preview", "nightly". + +**As-is vs to-be:** channel *sourcing* matches the current code (stable/beta = Releases split on the prerelease flag; unstable = `main` head + testable PRs). The only deltas are cosmetic and transitional: render the unstable `main` entry more prominently than PR rows, and — until upstreaming — read from the Fork's `nixos` trunk (see In-between phase). + +### Rollback + +**Rollback**: +Returning a device — or the fleet — to a known-good build after a bad one ships. Guaranteed for **stable** and **beta** — both are Releases whose closures live in the retained `pifinder-release` cache; only **unstable** (`main` head / PR) builds may be GC'd from the short-retention dev cache. + +**Watchdog**: +The on-device boot guardian. It health-checks every boot of a not-yet-**confirmed** generation (a **trial**) and performs a **generation rollback** when the trial fails — capturing evidence and telling the operator on screen. It never rolls back a confirmed generation, but it still *reports*: a confirmed generation whose app fails gets an on-screen advisory naming the **recovery hold** (see [NixOS ADR 0005](./adr/0005-self-arming-watchdog-confirmed-generations.md)). + +**Trial**: +The probation boot of a generation that has not yet proven itself on this device. Every boot of an unconfirmed generation is a trial, regardless of which build installed it. A passed trial **confirms** the generation. +_Avoid_: "first boot" as a synonym — a trial can recur (e.g. after a crash before the health check completed). + +**Health check**: +What a trial must pass: the app *itself* declares that its UI is live (readiness announced from the first drawn frame), and then stays up briefly. A merely-running process is not healthy — a build that starts but never turns the screen on must fail its trial. Outside supervised boots (development runs), the readiness announcement is a harmless no-op. +_Avoid_: equating "healthy" with "the service started". + +**Confirmed generation**: +A generation that has passed a trial on this device, recorded locally. Confirmed generations are never auto-rolled-back — later failures are for the user-driven recovery ladder (Rollback channel, **recovery hold**, SSH), not the watchdog. +_Avoid_: "committed" (overloaded with VCS meaning). + +**Recovery hold**: +The user gesture that enters **recovery mode**: hold the square-equivalent input while powering on, and keep holding until RECOVERY appears. Detected only during a short boot window (so it can never fire mid-observation). Deliberately a single input: v4's joystick makes multi-key chords physically impossible, and a square-equivalent will always exist. +_Avoid_: "recovery chord" (one input, not a chord). + +**Recovery mode**: +The interactive rescue environment the **recovery hold** boots into: the update screen alone (no camera/solver/positioning), offering the local generation overview — marking the generation that was about to boot and each **confirmed generation** — plus the normal internet channels. Choosing a generation is *sticky* (it becomes the boot default); an internet pick installs through the ordinary upgrade flow and faces a **trial** like any install. If recovery mode itself fails its **health check**, the device falls back to a blind **generation rollback** to the newest confirmed generation. Never touches user data. +_Avoid_: "safe mode" (nothing about the broken build is run "safely" — recovery either works or falls through), "factory reset" (nothing is wiped). + +**Generation rollback**: +The instance-local revert to an earlier NixOS generation. Triggered automatically by the **watchdog** when a **trial** fails, or manually. Bounded — local generations are pruned to three (the running one plus two rollback targets, surfaced in the Software screen's Rollback channel). + +**Reinstall an older build**: +The durable rollback path: pick a prior version and install it — the device substitutes its prebuilt closure (it never compiles; the upgrade is `nix build … --max-jobs 0`), so the only requirement is that the closure still lives in a reachable cache. For **stable** and **beta** that is guaranteed (their closures live in the never-GC'd `pifinder-release` cache), so any past release reinstalls forever; **unstable** closures may be GC'd from the short-retention cache, at which point that exact build is un-installable until CI rebuilds and re-pushes it. Survives generation pruning and covers boots-but-misbehaves bugs the watchdog cannot catch. + +**Yank**: +A release-level rollback — demoting a buggy official Release (to draft/prerelease, or superseding it) so it leaves the **stable** channel for *new* installs. There is no fleet-wide auto-revert: a device already on a yanked build surfaces an **advisory** (a status/notification that its version is withdrawn) prompting the user to choose the latest, who then recovers by **reinstalling an older build**. User-initiated, never automatic. + +### Build and cache + +**Attic cache**: +The binary cache at `cache.pifinder.eu`, with two namespaces: `pifinder` (dev builds, short retention) and `pifinder-release` (tagged releases, GC-disabled). Every Pi substitutes signed store paths from here. Hosted on the Fork's side through Phase 1. +_Avoid_: "cachix" (an earlier/alternative cache; the current one is Attic — see [NixOS ADR 0001](./adr/0001-attic-binary-cache.md)). + +**pi5 runner**: +The self-hosted aarch64 GitHub Actions runner that builds NixOS systems natively, with a hosted `ubuntu-*-arm` runner (also native aarch64 — no emulation) as fallback. Fork-side infrastructure through Phase 1. + +**Update manifest**: +`update-manifest.json` — the generated channel listing published on a metadata-only branch (`nixos-manifest` during the fork transition). It maps releases, trunk builds, and testable PR builds to signed Nix `store_path`s in the Attic cache (and, for releases, to the migration tarball). The device reads this raw JSON file instead of calling the GitHub API; it is the single mapping between versions and store paths. +_Avoid_: bare "manifest" (say *update* manifest), "build stamp" (a retired concept: `pifinder-build.json` is gone — a device's identity lives in one file, seeded at image build and rewritten by every upgrade). diff --git a/docs/ax/nixos/HANDOVER.md b/docs/ax/nixos/HANDOVER.md new file mode 100644 index 000000000..1d678b5c0 --- /dev/null +++ b/docs/ax/nixos/HANDOVER.md @@ -0,0 +1,56 @@ +# NixOS Handover + +Current state as of `2026-06-24`: + +- Latest pushed commit on `mrosseel/PiFinder:nixos` is `210f2c08` (`feat(nixos): drive update channels from manifest`). +- The branch is clean locally in the current worktree. +- GitHub Actions run `28119693140` is in progress for that push. + +## What changed + +- The PiFinder software UI no longer queries the GitHub REST API at runtime. +- Device channel data now comes from one generated raw JSON file: + - `https://raw.githubusercontent.com/mrosseel/PiFinder/nixos-manifest/update-manifest.json` +- The manifest contains: + - stable release entries + - beta prerelease entries + - unstable trunk + testable PR entries +- Old stamp-commit behavior on the source branch was removed. +- CI now updates the metadata-only `nixos-manifest` branch instead of committing `pifinder-build.json` back onto `nixos`. + +## Important files + +- [`python/PiFinder/ui/software.py`](../../python/PiFinder/ui/software.py) +- [`python/tests/test_software.py`](../../python/tests/test_software.py) +- [`.github/scripts/update_manifest.py`](../../.github/scripts/update_manifest.py) +- [`.github/workflows/build.yml`](../../.github/workflows/build.yml) +- [`.github/workflows/release.yml`](../../.github/workflows/release.yml) +- [`docs/ax/nixos/CONTEXT.md`](./CONTEXT.md) +- [`nixos/RELEASE.md`](../../nixos/RELEASE.md) + +## Verified locally + +- `nix develop path:. -c bash -lc 'cd python && pytest -m unit tests/test_software.py -q'` +- `nix develop path:. -c bash -lc 'cd python && mypy PiFinder/ui/software.py'` +- `python3 -m py_compile .github/scripts/update_manifest.py` + +The focused software tests pass in the Nix Python 3.13 environment. + +## Device state + +- On the real PiFinder, `/home/pifinder/PiFinder` is a root-owned symlink into `/nix/store`. +- The running `pifinder.service` uses the store-backed source tree, not writable local source. +- `/var/lib/pifinder/current-build.json` reflects the installed build after updates. + +## Current risk + +- The manifest workflow is new and needs CI confirmation. +- Build-native and update-manifest passed in CI on the last run before this handover. +- Release workflow still writes a temporary `pifinder-build.json` in the workspace for build stamping inside the job, but it no longer commits that file back to the source branch. + +## If you continue + +1. Watch run `28119693140` to completion. +2. Verify `nixos-manifest` exists and contains `update-manifest.json`. +3. If CI fails, look first at the `update-manifest` job and the release workflow step that pushes the metadata branch. +4. If the device still shows no PRs, inspect the manifest contents, not the GitHub API, because runtime no longer calls GitHub REST. diff --git a/docs/ax/nixos/adr/0001-attic-binary-cache.md b/docs/ax/nixos/adr/0001-attic-binary-cache.md new file mode 100644 index 000000000..3a26fd2ce --- /dev/null +++ b/docs/ax/nixos/adr/0001-attic-binary-cache.md @@ -0,0 +1,95 @@ +# Self-hosted Attic for NixOS binary distribution + +A NixOS PiFinder runs from pre-built binaries in `/nix/store/`; updates work by +atomically swapping the running system for a new closure of pre-built binaries. +Distributing those binaries requires a **binary cache** — a server that hands +them out on demand, since recompiling from source on a Pi is not viable (Rust +crates alone take hours). We will self-host the [Attic](https://github.com/zhaofengli/attic) +binary cache at `cache.pifinder.eu`, backed by SQLite and local disk initially, +with Cloudflare R2 as the eventual chunk store. Attic is a small Rust server +that adds **content-defined chunking (FastCDC)** on top of the standard Nix +substituter protocol: every NAR is sliced into variable-size chunks by byte +content and identical chunks are stored exactly once. This dedup is +**server-side** — it shrinks storage across releases, and because `attic push` +chunks on the runner it makes the **CI upload** proportional to actual changes. +It does **not** delta the device download: Attic serves whole NARs over the +standard binary-cache protocol, so a device fetches the full (compressed) NAR of +every store path whose hash changed — not a chunk-delta against the previous +version of that path. The saving devices get is **path-level**: the 90–95% of a +closure that is unchanged between releases (identical store hashes) is not +refetched at all, so an update pulls only the changed paths' NARs — on the order +of tens of MB for a 1.5 GB closure, but each of those in full. True client-side +chunk-delta downloads need a casync/desync-style client that keeps a local chunk +store; the standard Nix client — and therefore Attic, harmonia, and nix-casync +used as substituters — does not do this. (That client-delta property is exactly +why desync is used for the out-of-closure astro-data blobs; see the data-blob +distribution notes.) + +## Considered Options + +- **Stay on cachix.org indefinitely.** Rejected: SaaS quota caps (storage tier, + push throttling) become a planning concern as the system closure grows; ships + full NARs per closure (no chunking), so every update transfers the full + closure even when 5% of bytes changed; per-cache pricing scales linearly with + closure count. +- **Magic Nix Cache (DetSys) alone.** Rejected: backed by GitHub Actions Cache + (~10 GB per repo, ephemeral, HTTP-418 rate-limited under sustained traffic — + already broke a `type-check` job once). Useful for CI runner-local caching, + not for distributing binaries to end-user devices, which it cannot do at all. +- **nix-casync.** Same content-defined-chunking idea, predates Attic, but + distributed as a standalone tool rather than a hosted server; would need to + assemble the server side ourselves. Attic delivers the same dedup story as a + complete package. +- **harmonia.** Newer self-hosted alternative; simpler than Attic but no + chunking. Loses the headline bandwidth-and-storage saving. + +## Consequences + +- **Operational ownership:** PiFinder takes on a small piece of infrastructure + (one VPS, one Rust binary, one SQLite file, one Caddy reverse-proxy with + Let's Encrypt). Sized at Hetzner CX22 / €4 month for the foreseeable future; + SQLite handles millions of chunks before PostgreSQL becomes necessary. Backup + story is "snapshot the SQLite file and the chunk directory" — same pattern as + a typical small VPS service. +- **Egress economics:** Cloudflare R2 charges zero egress, which matters when + distributing updates to a globally-dispersed PiFinder fleet. Self-hosted on a + Hetzner VPS the egress is also effectively free at typical hobby volumes. + Either way, the bandwidth question stops being a recurring concern. +- **CI publish step:** `build.yml`'s `cachix-action` step is replaced by an + `attic push` step using a long-lived JWT minted by `atticadm make-token + --push pifinder`, stored as `secrets.ATTIC_TOKEN`. Chunking happens on the + runner; the server only ingests new chunks. Push payload is proportional to + actual changes, not to closure size. +- **Device pull side:** `services.nix` declares `cache.pifinder.eu` as a + substituter alongside `cache.nixos.org`, with the Attic public key in + `trusted-public-keys`. The existing on-device upgrade flow + (`pifinder-upgrade.service`, `nix build "$STORE_PATH" --max-jobs 0`) is + unchanged — the new substituter is transparent. Users see the same + "downloading N/M" progress in the menu, just with smaller N. +- **Failure model:** Nix tries substituters in order and falls through. If + `cache.pifinder.eu` is unreachable, the device falls through to + `cache.nixos.org` for any path that exists there. The "Attic outage = bricked + PiFinders" scenario does not exist for paths nixpkgs already publishes; only + locally-built paths (kernel with our overlays, `cedar-detect-server`, Python + wheels) are at risk during an outage, and those are cached locally on devices + that previously updated successfully. +- **Migration tarball stays self-contained.** The boot-from-tarball path + (`pifinder-nixos-v3.0.0.tar.zst` on the GitHub release) is independent of the + cache and remains the way a stock Debian PiFinder bootstraps into NixOS. A + later refinement could ship a smaller tarball that pulls the bulk of the + closure from Attic on first boot, but that is out of scope for this ADR. +- **No retirement of cachix.org is mandated here.** Whether to keep cachix.org + as a fallback or drop it after Attic is proven is a separate operational + decision; the substituter list can carry both indefinitely with no penalty + beyond the cachix subscription cost. +- **Two caches, split by retention.** The server hosts two Attic caches: + `pifinder` (dev/nightly builds from `build.yml`, short retention — these churn + on every push) and `pifinder-release` (tagged release closures from + `release.yml`, garbage collection disabled). The split exists because Attic + retention is per-cache, not per-path: a device may upgrade to a release months + after it was cut, so its closure must never be GC'd, while dev builds should + not accumulate forever. Chunk dedup is global across caches on the same + server, so storing a release closure separately costs only its genuinely-new + chunks. Each cache has its own signing key; devices trust both, plus + `cache.nixos.org`. (Originally a single `pifinder` cache; this followed once + releases started flowing through Attic instead of cachix.) diff --git a/docs/ax/nixos/adr/0002-update-channels-and-rollback.md b/docs/ax/nixos/adr/0002-update-channels-and-rollback.md new file mode 100644 index 000000000..f0b92a641 --- /dev/null +++ b/docs/ax/nixos/adr/0002-update-channels-and-rollback.md @@ -0,0 +1,16 @@ +# Update channels stay Release-based (stable/beta) over a live main+PR unstable; rollback via reinstall + passive yank + +The three on-device update **channels** map onto the git promotion flow (testable PRs → `main` → `release`) and resolve through a **build stamp** (`pifinder-build.json`) to a store path: **stable** = official GitHub Releases (non-prerelease, `≥ MIN_NIXOS_VERSION`); **beta** = GitHub **prereleases** cut from `main`; **unstable** = the live `main`/trunk head plus open `testable`-labeled PRs (the `main` entry rendered more prominently than the PR rows). stable and beta are ceremonial Releases — both curated (notes, explicit semver, the version gate) and pushed to the *retained* cache; unstable tracks ref heads continuously and is hidden until unlocked. + +A bad build is recovered three ways, never by fleet-wide auto-revert: the **watchdog** reverts to the previous NixOS generation on a boot failure (once); a user can **reinstall any older build** by selecting it (the device only substitutes the prebuilt closure — `nix build … --max-jobs 0`, it never compiles); and a bad official release is **yanked** (demoted/superseded so it leaves the channel for new installs) plus a device **advisory** prompting affected units to choose the latest. + +## Considered options + +- **beta = live `main` head (continuous), rejected.** Briefly chosen, then reverted: GitHub's prerelease flag is built in and keeps beta symmetric with stable (notes, semver, gate). Decisively, a prerelease lands in the *retained* `pifinder-release` cache, so beta gets durable rollback; a `main`-head beta would sit in the short-retention cache and lose it. Continuous "every merge" delivery is unstable's job — `main` head lives there — not beta's. +- **Fully uniform branch-head channels (stable = `release` head), rejected.** Drops release notes, explicit versioning, the gate, and the SD-image/migration assets, and would need `build.yml` to stamp `release`. +- **Active kill-switch for yank, rejected for now.** Passive yank + advisory avoids a server-side bad-builds list and device polling/auto-revert; revisit only if the field shows the "already-running unit that never opens the update screen" gap is real. + +## Consequences + +- **Rollback is guaranteed for stable and beta** — both are Releases whose closures live in the never-GC'd `pifinder-release` cache ([0001](./0001-attic-binary-cache.md)), and the device never builds. Only **unstable** (`main`-head / PR) closures may be GC'd from the short-retention cache and become un-installable until CI rebuilds and re-pushes them. +- Channel *sourcing* matches the current code; the only deltas are cosmetic (render the unstable `main` entry more prominently than PR rows) and transitional (read from the Fork's `nixos` trunk until the NixOS line is upstreamed). diff --git a/docs/ax/nixos/adr/0003-migration-tarball-rides-latest-stable.md b/docs/ax/nixos/adr/0003-migration-tarball-rides-latest-stable.md new file mode 100644 index 000000000..e71ad352e --- /dev/null +++ b/docs/ax/nixos/adr/0003-migration-tarball-rides-latest-stable.md @@ -0,0 +1,20 @@ +# Migration tarball resolves its full system from the update manifest at first boot (rides latest stable), instead of pinning a closure + +> **Amended by [0004](./0004-migration-tarball-published-per-release.md):** publication is a per-(pre)release asset, not a built-once file. The resolve-at-first-boot mechanism below is unchanged. + +The migration tarball is the **minimal** bootable system; on first boot it downloads the **full** PiFinder system from the binary cache and switches to it. We will have first-boot resolve that store path from the **same update manifest the on-device updater reads** (`brickbots/PiFinder@nixos-manifest:update-manifest.json`, see [0002](./0002-update-channels-and-rollback.md)) — taking the newest entry in the best available channel, **stable → beta → unstable trunk** — rather than baking a fixed store path into the tarball. Because **stable** holds only Releases, whose closures live in the never-GC'd `pifinder-release` cache ([0001](./0001-attic-binary-cache.md)), a resolved stable path can't be garbage-collected out from under a published tarball. The tarball therefore never goes stale, is built **once** (not per Release), and every new migrator gets the *current* system rather than the snapshot the tarball was cut from. + +The trap this avoids: a baked/pinned closure couples the tarball's lifetime (months — until the next cut) to a single cache entry's lifetime. Pin into the short-retention `pifinder` cache and the closure is GC'd while the tarball is still the published download → first-boot fails. Pin into the retained `pifinder-release` cache and every intermediate test build piles up there forever (it is never GC'd) → the retained cache fills with dead closures, the exact thing "persist only the last version" is meant to prevent. Resolving *latest stable* at boot escapes both horns: nothing per-tarball is pinned, test churn stays in the self-cleaning unstable cache, and the only durable closures are deliberate Releases. + +## Considered options + +- **Bake the full closure into the tarball (self-contained), rejected.** Drops the cache dependency entirely and can never rot, but bloats the download (full system vs minimal) and freezes the migrated version to the tarball's build date. Resolving latest-stable keeps the tarball minimal and current. +- **Bake a pinned store path + push it to `pifinder-release`, rejected.** Durable, but every iteration pushes another full closure into the never-GC'd cache, and the tarball must be rebuilt and re-uploaded every Release. Directly conflicts with "only the last version persists." +- **Bake a pinned store path served from the short-retention `pifinder` cache, rejected.** Small and self-cleaning, but the pinned closure is GC'd (~90 days) and the still-published tarball breaks. + +## Consequences + +- First-boot reads the **update manifest**, not `pifinder-build.json` (which it previously fetched from `mrosseel/PiFinder@nixos`). First-boot and the updater now share one source of truth. +- Resolution order is **stable → beta → unstable trunk → baked-in `first-boot-target`**. The baked-in path survives only as a last-ditch fallback when the manifest can't be fetched. +- **Transitional:** with `stable`/`beta` empty until the first Release is cut, migration currently resolves the **unstable trunk**, which is the **`nixos` branch** (`source_ref == "nixos"`), not `main` — the NixOS line isn't upstream yet ([0002](./0002-update-channels-and-rollback.md)). Drop the `source_ref == "nixos"` guard once `nixos` becomes the mainline trunk. +- The tarball is built **once** and only rebuilt when the minimal migration system itself changes — never per Release. A "cut stable release" flow (build full system → push closure to `pifinder-release` → stamp a `stable` entry) is what makes new closures reachable; the tarball just rides whatever that produces. diff --git a/docs/ax/nixos/adr/0004-migration-tarball-published-per-release.md b/docs/ax/nixos/adr/0004-migration-tarball-published-per-release.md new file mode 100644 index 000000000..d11706ff1 --- /dev/null +++ b/docs/ax/nixos/adr/0004-migration-tarball-published-per-release.md @@ -0,0 +1,14 @@ +# Migration tarball is published as a (pre)release asset, not a built-once file (amends 0003) + +The tarball keeps [0003](./0003-migration-tarball-rides-latest-stable.md)'s *mechanism* — minimal system (`images.pifinder-migration`), full system resolved from the update manifest at first boot, so the tarball's content never goes stale — but its *publication* moves from "built once at a fixed URL" to an asset (with `.sha256` sidecar) on every stable/beta Release, referenced per-entry as `migration_url` in the manifest. Releases are visible, versioned, documented, and in the canonical place; a replace-in-place file on a private file server is none of those, and un-auditable after an incident. + +## Considered options + +- **Built-once evergreen tarball at a fixed URL (0003's original), rejected.** Minimal asset churn, but the artifact lives outside the release record: no version, no notes, no checksum ceremony, silent replace-in-place. The Raspbian-side updater would also need a hardcoded URL instead of reading the manifest like everything else. +- **Per-release *full-system* tarball (shipped briefly in the first release.yml), rejected.** ~1.4 GB per release forever, and it freezes the migrated system to the tarball's build date — the exact staleness trap 0003 exists to avoid. + +## Consequences + +- `release.yml` must tar `images.pifinder-migration`, **not** `images.pifinder` (the full SD image remains a separate asset for fresh flashes). +- Two-stage resolution: the Raspbian device picks a *tarball* (first manifest entry with a `migration_url`, stable → beta → unstable); first boot then picks the *closure* from the manifest — the authoritative version decision. Any reasonably recent tarball yields the same end state. +- Asset cost per release drops to the minimal system's size; old tarballs remain downloadable alongside their releases. diff --git a/docs/ax/nixos/adr/0005-self-arming-watchdog-confirmed-generations.md b/docs/ax/nixos/adr/0005-self-arming-watchdog-confirmed-generations.md new file mode 100644 index 000000000..486c4f1b8 --- /dev/null +++ b/docs/ax/nixos/adr/0005-self-arming-watchdog-confirmed-generations.md @@ -0,0 +1,17 @@ +# Boot watchdog is self-arming via a confirmed-generations ledger; confirmed generations are never auto-rolled-back + +A generation is a **trial** until it passes one boot health check, which **confirms** it permanently on that device (recorded in a device-local ledger). Any boot of an *unconfirmed* generation is a trial — regardless of which build installed it — so recovery never depends on the previous system's code: the version-skew hole where an older build (unaware of trial markers) installs a broken new one and leaves it unprotected, which is exactly how the first v3.0.0-beta crash-looped with no rollback on 2026-07-03. Confirmed generations are never auto-rolled-back: a transient failure in the field must not cause a surprise downgrade. + +## Considered options + +- **Marker-armed only (upgrade writes a trial marker; no marker → nothing to watch), rejected.** The original design. Protection depends on the *installing* build knowing to arm the marker — any device upgrading from an older build gets one unprotected hop, proven in the field. +- **Auto-rollback on any repeated boot failure (no confirmation concept), rejected.** Self-heals late-life breakage, but a confirmed build failing transiently (cold night, flaky SD read) would be silently downgraded — the failure mode the trial/confirm split exists to prevent. + +## Consequences + +- Persistent breakage of an already-confirmed generation does **not** self-heal — deliberate. It is covered by the explicit recovery ladder instead: the Software screen's Rollback channel, the power-on **recovery hold** into recovery mode (rollback without any working UI, see [0006](./0006-recovery-mode-reuses-update-screen.md)), and SSH. +- The upgrade-written trial marker survives as a *hint* (it names the exact pre-upgrade system, camera specialisation included); the ledger is what's load-bearing. Rollback targets are chosen newest-first from the profile, preferring confirmed generations. +- Ledger loss is benign: a healthy generation simply re-confirms on its next boot; an unhealthy one gets a rollback it genuinely needs. +- A failing trial with no rollback target at all (first-ever install) shows an on-screen failure message and stays up for rescue instead of boot-looping. +- "Never touches a confirmed generation" means never *acts on* — the watchdog still *reports*: a confirmed generation whose app fails gets an on-screen advisory naming the recovery hold, so the escape hatch reveals itself exactly when needed and never clutters a healthy boot. +- Known floor: a generation that dies before userspace (kernel/initrd) boot-loops — the watchdog never runs, and neither NixOS nor extlinux offers boot counting. Chosen future fix (backlogged): **U-Boot `bootcount`/`altbootcmd`** — the trial's confirm step resets the counter; exceeding the limit boots the previous generation's entry. Preferred over Raspberry Pi firmware `tryboot`, which works at the config.txt/partition level and would force an A/B boot-chain redesign; bootcount preserves the single-extlinux generation model. diff --git a/docs/ax/nixos/adr/0006-recovery-mode-reuses-update-screen.md b/docs/ax/nixos/adr/0006-recovery-mode-reuses-update-screen.md new file mode 100644 index 000000000..1bab15257 --- /dev/null +++ b/docs/ax/nixos/adr/0006-recovery-mode-reuses-update-screen.md @@ -0,0 +1,14 @@ +# Recovery mode is the update screen in isolation, with a blind-rollback fallback — not a separate minimal tool + +The recovery hold boots a stripped app entry running only the update screen (display + keypad; no camera/solver/positioning), so rescue gets the generation overview and the internet channels from the same code, screen, and install path users already know — one machinery, one set of bugs. Because that screen runs inside the possibly-broken generation, it is a *rung*, not the ladder: if recovery mode fails its own health check, the device falls back to a blind generation rollback to the newest confirmed generation with an on-screen message ([0005](./0005-self-arming-watchdog-confirmed-generations.md)). + +## Considered options + +- **Standalone minimal recovery tool (own renderer, own generation lister), rejected.** Smaller failure domain, but duplicates the generation list, manifest fetch, install trigger, and keypad/display handling — a second UI that rots separately from the real one, for a rung the blind fallback already backstops. +- **Blind rollback only (no interactive mode), rejected.** Works when everything is broken, but forces the newest-confirmed choice on the user; the "it's broken" scenario often wants *a specific* known-good version or a fresh install from a channel. + +## Consequences + +- Selection semantics are **sticky**: choosing a generation sets the boot default (a telescope user in recovery means "go back until I say otherwise"), never a one-shot boot. Internet picks go through the ordinary upgrade flow and face a normal trial. +- Recovery mode inherits the update screen's offline behavior: no network degrades to "rollback only". +- The app's readiness signal (health check) pulls double duty: it is also what decides whether recovery mode itself is alive or the blind fallback fires. diff --git a/docs/ax/nixos/adr/0007-boot-on-ext4-fat-firmware-only.md b/docs/ax/nixos/adr/0007-boot-on-ext4-fat-firmware-only.md new file mode 100644 index 000000000..e509faf4c --- /dev/null +++ b/docs/ax/nixos/adr/0007-boot-on-ext4-fat-firmware-only.md @@ -0,0 +1,13 @@ +# extlinux and kernels live on the ext4 root; the FAT partition is firmware-only + +A custom U-Boot (`CONFIG_CMD_SYSBOOT`) reads `extlinux.conf` and the per-generation kernels from `/boot` **on the ext4 root** (`mmc 0:2`); the FAT partition carries only what the GPU firmware itself must parse — `config.txt`, `start*.elf`, U-Boot, DTBs — written once at install and never touched at runtime. NixOS mutates `/boot` on every generation switch (upgrade, rollback, camera specialisation, watchdog auto-rollback, `set-extlinux-default`), and those rewrites must be crash-safe: ext4 renames are atomic, FAT's are not — a power cut mid-rewrite on FAT can corrupt the one file the boot chain needs, which is unacceptable for a bootloader the watchdog rewrites unattended. + +## Considered options + +- **Everything on FAT (Raspbian convention: firmware loads the kernel directly), rejected.** No atomic rename (crash-unsafe generation switches), no symlinks, and per-generation kernels+initrds (~50MB each, `configurationLimit` of them plus specialisation entries) outgrow a 256MB firmware partition. +- **extlinux on FAT, kernels on ext4, rejected.** Splits one logical unit (the boot menu and what it points at) across filesystems and still leaves the menu rewrite non-atomic. + +## Consequences + +- The partition most fragile to corruption (FAT, which the GPU bootloader must parse) is also the one never written after install. +- The tarball layout follows: its top-level `boot/` is the firmware payload, while `rootfs/boot` is a **populated** directory — anything consuming the tarball must not assume Raspbian's everything-in-FAT layout. The migration initramfs did exactly that (empty-`/boot` assumption + extlinux-on-FAT verifications) and failed the first real migration against this layout (2026-07-05); it now stages the firmware payload aside and verifies each partition for what its boot-chain stage actually needs. diff --git a/docs/ax/nixos/adr/0008-imx462-xclk-override.md b/docs/ax/nixos/adr/0008-imx462-xclk-override.md new file mode 100644 index 000000000..74f229346 --- /dev/null +++ b/docs/ax/nixos/adr/0008-imx462-xclk-override.md @@ -0,0 +1,23 @@ +# The imx462 camera gets an explicit 74.25 MHz xclk overlay because fdtoverlay drops overlay parameters + +**Status: proposed — pending a build on pi5 and a camera test on a device.** + +PiFinder's imx462 camera module has a 74.25 MHz oscillator. The kernel's `imx290`/`imx462` DT overlays default the sensor xclk to 37.125 MHz; on Raspbian, PiFinder corrects this with an overlay *parameter* (`switch_camera.py` writes `dtoverlay=imx290,clock-frequency=74250000` to `config.txt`, applied by the RPi firmware loader). The NixOS image applies overlays with `fdtoverlay`, which **cannot apply overlay parameters** (`__overrides__`) — so the 37.125 MHz default silently survived. The driver (`imx290.c`) reads the sensor node's `clock-frequency` property and programs a per-frequency INCKSEL/PLL register set; with the wrong xclk the sensor enumerates on I2C but never delivers frames, and libcamera reports `Camera frontend has timed out` with an empty kernel log. + +The image therefore compiles a small additional overlay, applied after the camera overlay, that sets `clock-frequency = 74250000` in both places the Raspbian parameter writes: the `cam1_clk` fixed-clock node (the driver `clk_set_rate`s it and errors on mismatch) and the sensor node property (selects the INCKSEL register set). + +This supersedes an earlier draft of this ADR that blamed the kernel: the hypothesis was that the mainline `imx290` driver's lack of an imx462 model caused the failure, to be fixed by switching to `pkgs.linuxPackages_rpi4`. That was wrong on both ends — the image already runs the Raspberry Pi vendor kernel (the `nixos-hardware` `raspberry-pi-4` module pins the downstream tree, `stable_20250916` / 6.12.47, whose `imx290` driver does carry imx462 support), and the mr2 diagnosis that "verified" the DT clock at 37.125 MHz was in fact confirming the bug: 37.125 MHz matches the overlay default, not the hardware. + +## Considered options + +- **Compiled xclk-override overlay applied after the camera overlay (chosen).** Reproduces Raspbian's field-proven configuration (`sony,imx290lqr` compatible + 74.25 MHz xclk) exactly, using the overlay machinery `hardware.nix` already has. Relies on `fdtoverlay` merging the camera overlay's `__symbols__` so `&cam_node` resolves — same mechanism the existing custom overlays use against base-DT labels. +- **Switch to the vendor kernel via `boot.kernelPackages = pkgs.linuxPackages_rpi4`, rejected.** The earlier draft's fix. Redundant — nixos-hardware already pins the same vendor tree at the same tag — and actively harmful: it swaps in an equivalent-but-different kernel derivation, forcing a full kernel rebuild on pi5 and re-opening the u-boot/extlinux boot-chain question for zero functional change. +- **Use the kernel's `imx462.dtbo` (compatible `sony,imx462lqr`, dedicated init registers), deferred.** Arguably the "more correct" driver model, but it is not what PiFinder runs on Raspbian, it still needs the same xclk override, and it changes the libcamera tuning file (sensor name `imx462` vs `imx290`). Not worth the untested variables while getting the camera working; worth revisiting once streaming is confirmed. +- **Patch the camera overlay source and compile it ourselves, rejected.** Duplicates kernel dtsi includes into the flake for something a two-property override achieves. + +## Consequences + +- imx296 and imx477 are unaffected: on Raspbian PiFinder configures them without a clock parameter, so the overlay defaults are already correct and the override is gated on `cameraType == "imx462"`. +- No kernel change, so no new boot-chain risk and no kernel rebuild on pi5; the DTB derivation is the only thing that changes. +- The override must stay ordered after the camera overlay in the `fdtoverlay` invocation — `&cam_node` only exists in the merged symbol table at that point. A future refactor that reorders the overlay list will break it at DTB build time (fdtoverlay fails to resolve the symbol), not silently. +- If the sensor still does not stream with the correct xclk, the next suspects are the `imx462.dtbo` model path above and the libcamera/IPA tuning — not the kernel. diff --git a/docs/ax/nixos/adr/README.md b/docs/ax/nixos/adr/README.md new file mode 100644 index 000000000..597fee9a2 --- /dev/null +++ b/docs/ax/nixos/adr/README.md @@ -0,0 +1,10 @@ +# NixOS ADRs + +Architecture-decision records for the **NixOS** context (NixOS build, binary cache, update channels, on-device upgrade/rollback). Numbered locally — `0001`, `0002`, … — independent of the repo-root `docs/adr/`. + +**Why a separate namespace.** These decisions are fork-only (`mrosseel/PiFinder`, the NixOS line) and have no counterpart upstream (`brickbots/PiFinder`). The root `docs/adr/` is shared with upstream and is merged on every sync; putting a fork ADR there means picking a number that will collide with the next upstream ADR, and a rename on the fork is undone/duplicated by the next merge. A context-local namespace keeps fork deploy decisions collision-proof until the NixOS line becomes upstream mainline, at which point these fold into the shared sequence. + +- [0001 — Self-hosted Attic for NixOS binary distribution](./0001-attic-binary-cache.md) +- [0002 — Update channels stay Release-based (stable/beta) over a live main+PR unstable; rollback via reinstall + passive yank](./0002-update-channels-and-rollback.md) +- [0003 — Migration tarball resolves its full system from the update manifest at first boot (rides latest stable), instead of pinning a closure](./0003-migration-tarball-rides-latest-stable.md) +- [0008 — The imx462 camera gets an explicit 74.25 MHz xclk overlay because fdtoverlay drops overlay parameters (proposed)](./0008-imx462-xclk-override.md) diff --git a/docs/ax/sqm.md b/docs/ax/sqm.md index 9784e4cf9..6d5f718cf 100644 --- a/docs/ax/sqm.md +++ b/docs/ax/sqm.md @@ -204,6 +204,33 @@ mean exposure-dependent signal is included. This keeps factory behavior tied to the validated sensor offsets while allowing a measured calibration to refine it. +### Per-frame optical black (IMX290/IMX462) + +Sony defines the shielded optical-black (OB) rows as the sensor's own signal +reference. The IMX290/462 already transmits ten front vertical OB rows on every +frame; a kernel patch routes them to the receiver as a separate metadata +stream, and a libcamera helper publishes their central-90% trimmed mean through +`SensorBlackLevels` at 1/16 native ADU resolution. `camera_pi` reads that value +for these sensors and attaches it to the radiometer sample as +`optical_black_pedestal`. + +When a valid marked OB value is present it is the complete per-frame pedestal — +it already contains the bias and that frame's accumulated dark signal, so no +separate dark-current model is applied and no nightly rate is fitted or stored. +The precedence is: valid same-frame OB, then a user-calibrated pedestal, then +the profile `bias_offset`. Manual calibration therefore never overrides a valid +same-frame measurement; it remains the fallback for sensors without usable OB. + +This was validated on mr2 (IMX462, production gain, requested 30 / reported +29.512) with a same-frame cupboard test: comparing the normal Bayer pixels and +the shielded OB rows from identical frames, the active-green and OB dark- +accumulation slopes agreed to well under 1 ADU/s (active green sat ~0.8-1.0 ADU +below OB as a small fixed offset, ~0.01 mag — too small to persist as a per-unit +constant from one camera). The added camera-process cost was about +0.23 +percentage points of one core. This is strong evidence for the shipped IMX462 +path, not proof for every Sony sensor: IMX296 and IMX477 OB plumbing remains +open, and independent-unit and temperature-range validation is still useful. + Read noise is zero-mean RMS uncertainty and is never subtracted as signal. `NoiseFloorEstimator` retains a low image percentile only as a diagnostic; ordinary sky pixels cannot provide an automatic dark calibration because they diff --git a/docs/ax/sqm/CONTEXT.md b/docs/ax/sqm/CONTEXT.md index 101357c6d..ab779cfb3 100644 --- a/docs/ax/sqm/CONTEXT.md +++ b/docs/ax/sqm/CONTEXT.md @@ -122,10 +122,21 @@ signal, not an RMS noise term. Factory profile rates are unverified engineering estimates and remain diagnostic until optional per-device calibration measures the rate. +**Optical black** (OB): +Shielded sensor rows carrying no sky light — the sensor's own signal reference. +On IMX290/IMX462 the ten transmitted OB rows are surfaced per frame and their +central-90% trimmed mean is published as `optical_black_pedestal` in native +ADU. A valid OB value is the *complete* per-frame pedestal (bias plus that +frame's accumulated dark signal); it is measured, not modelled, so no +dark-current rate is applied on top of it. Do not call it "black level" (an +overloaded libcamera/tuning term). + **Pedestal**: -The mean detector signal subtracted from sky background. The validated -zero-touch path uses `bias_offset`; an optional measured calibration uses -`bias_offset + mean_dark_signal`. An explicit total `pedestal_override` wins. +The mean detector signal subtracted from sky background. Precedence: a valid +same-frame `optical_black_pedestal` (IMX290/462) wins; else a user-calibrated +`bias_offset + mean_dark_signal`; else the zero-touch profile `bias_offset`. An +explicit total `pedestal_override` wins over all. `pedestal_source` in the +details records which applied. **Read noise**: Zero-mean RMS variation in raw ADU. Diagnostic uncertainty; never subtracted diff --git a/docs/source/catalogs.rst b/docs/source/catalogs.rst index f5d7badb1..ec2426694 100644 --- a/docs/source/catalogs.rst +++ b/docs/source/catalogs.rst @@ -59,6 +59,26 @@ NGC ---------- NGC 2000.0, The Complete New General Catalogue and Index Catalogue of Nebulae and Star Clusters by J.L.E. Dreyer (edited by R.W. Sinnott). +PK +---- +The Perek-Kohoutek catalog of galactic planetary nebulae — 1,510 objects, from +Kohoutek's 2001 revision of the 1967 original. + +A PK designation encodes galactic position rather than brightness: +PK 036+17.1 lies at galactic longitude 36°, latitude +17°, and is the first +nebula listed in that cell. Use **Name Search** to jump straight to one. The +list itself is numbered 1 to 1,510 in order of right ascension, matching the +printed catalog, so ``PK 743`` is a position in the list rather than a +designation. + +The source catalog records positions and identifications only, so most entries +carry no magnitude. Entries that are also NGC, IC, Abell or Sharpless objects +take their magnitude from that catalog. Roughly 200 to 300 of these nebulae are +within reach of a small telescope; many of the rest are faint or heavily +reddened by dust in the galactic plane. Sizes come from the Strasbourg-ESO +Catalogue of Galactic Planetary Nebulae (Acker et al. 1992), which covers about +two thirds of the entries. + RDS ---- The RASC Double Stars Observing Program: 110 double-star targets visible from the northern hemisphere across many constellations. diff --git a/docs/source/dev_arch.rst b/docs/source/dev_arch.rst index fe81f8dcc..3b150dcf0 100644 --- a/docs/source/dev_arch.rst +++ b/docs/source/dev_arch.rst @@ -312,9 +312,9 @@ Testing Unit Testing ............... -On commit or pull request to the repository the unit tests in ``python/tests`` are run using the -configuration in ``pyproject.toml`` using nox (also see its configuration in -``noxfile.py``). **Please provide unit tests with your pull requests.** +On commit or pull request to the repository the unit tests in ``python/tests`` are +run in CI inside ``nix develop`` with ``pytest -m unit``, configured in +``pyproject.toml``. **Please provide unit tests with your pull requests.** Fuzz Testing ............... diff --git a/docs/source/dev_guide.rst b/docs/source/dev_guide.rst index 11ab7b99d..e71e3c331 100644 --- a/docs/source/dev_guide.rst +++ b/docs/source/dev_guide.rst @@ -57,61 +57,36 @@ to discuss the issue on the to sort things out and prioritize. Beta Testing --------------- - -When you look at the `PiFinder GitHub repository `_ you will see, that there are different branches. -That is the way, how we develop the PiFinder. The main branch is the one, on which development is happening. If you want to test the latest changes, you can -check out the main branch and run its code. For this your PiFinder needs to be connected to the internet, i.e. your WiFi. -Once you have connected, log into your PiFinder via ssh and run the following commands in the terminal: - -.. code-block:: bash - - cd ~/PiFinder - git fetch --all - sudo systemctl stop pifinder - git checkout main - git pull - ./pifinder_post_update.sh - sudo systemctl start pifinder - -This will stop the PiFinder, update the code and dependencies to the latest development version and start it again. - -If you want to return to the stable version, you can run the following command: - -.. code-block:: bash - - ./pifinder_update.sh - -If you really, really would like to use bleeding edge code, you can check out a different branch, or checkout one of the forks of the repository. - -To list all branches, run the following command: - -.. code-block:: bash - - cd ~/PiFinder - git branch -a - -To checkout one of the forks of the repository, run the following commands: - -.. code-block:: bash - - cd ~/PiFinder - git remote add - git fetch --all - git checkout -b / - -You have to replace with the name of the remote you added, with the URL of the fork you want to check out (you can copy this from github, by pressing on the "code" button), and with the name of the branch you want to check out. This will create a new branch in your local repository, which follows the branch of the fork you checked out. - -To keep up to date with the latest changes in the fork, you can run the following commands: - -.. code-block:: bash - - cd ~/PiFinder - git pull - cd python - sudo pip install -r requirements.txt - -The last command will install the requirements and only needs to be run occasionally, depending on the changes in the branch. You need to restart the pifinder service to see the changes. +------------ + +PiFinder updates over the air, right from the device. Open the +:ref:`user_guide:tools` menu and choose Software Upd; the PiFinder downloads a +prebuilt image and switches to it. The update screen is arranged as three +**channels** that you move between on the device: + +- **stable** — where Software Upd opens. The production channel of official + releases, listing the versions you can switch to. The safe choice for ordinary + observing. +- **beta** — press **RIGHT** from the stable channel to reach it. Pre-release + builds cut from the development branch, curated with release notes before they + go stable. This is the channel for most beta testers. +- **unstable** — the bleeding edge: the live tip of development plus individual + open pull requests, each installable before it's merged. It stays hidden until + you unlock it by pressing **SQUARE** seven times on the update screen. + +Each version you pick resolves to a build the project's binary cache has already +compiled, so the device only downloads and activates it — it never compiles +anything itself, and the switch takes a couple of minutes. If a build misbehaves +you can switch back to an earlier stable or beta version the same way, since +those are kept in the cache. + +The PiFinder needs internet access to reach the cache, so put it in Client Mode +on a WiFi network with a connection. See :ref:`user_guide:update software` for a +full walkthrough of the update screen. + +When you hit a problem on a beta or unstable build, report it as described in +`Submitting issues, bugs and ideas`_ above, and say which channel and version +you were running. Fork me - getting or contributing to the sources with pull request ------------------------------------------------------------------ @@ -139,15 +114,19 @@ The files are located in PiFinders GitHub repository under ``docs/source`` and h the ending ``.rst``. The documentation is then published to `readthedocs.io `_, when the change is committed to the official GitHub repository (using readthedocs's infrastructure). -You can link your fork also to your account on readthedocs.io, but it is easier to build the documentation locally. -For this, install Sphinx and the Read the Docs theme from the pinned -requirements file (run this from the ``docs`` directory): +Read the Docs rebuilds and publishes the site automatically whenever a change +lands on the official GitHub repository, so you don't have to do anything to +publish. To preview your changes first, build the site locally with the pinned +requirements. The dev shell provides ``uv``, which can run Sphinx in a throwaway +environment without installing anything globally — run this from the ``docs`` +directory: .. code-block:: - pip install -r source/requirements.txt + uv run --no-project --with-requirements source/requirements.txt --python 3.11 \ + sphinx-build -b html source build/html -You can then use the supplied ``Makefile`` to build a html tree using ``make html`` and running a http server in the directory with the files: +Then serve the result and open it in your browser: .. code-block:: @@ -248,22 +227,22 @@ also contain the compiled ``.mo`` files, which are binary representations of the When you edit the files, check for each entry that has a ``msgstr ""`` line, which means the string is not translated yet. You also need to check the translations of strings marked as "fuzzy". You need to remove the "fuzzy" line, once you have checked the translation. -In order to run the PiFinder software with the latest translation, you need to run the following commands: +The Babel toolchain extracts the strings, updates the ``.po`` files, and compiles +them into the ``.mo`` files the PiFinder reads. Run it from ``python/`` inside the +dev shell (see `Install dependencies with Nix`_): .. code-block:: - cd ~/PiFinder/python - sudo pip install -r requirements_dev.txt - nox -s babel - -The ``pip`` command installs the dependencies for the translation, the second command runs the babel toolchain to extract the strings -to translate and update the .po files. This also compiles the .po files into .mo files, which are then used by the PiFinder software. + cd python + pybabel extract -F babel.cfg -c TRANSLATORS -o locale/messages.pot ./PiFinder ./views + pybabel update -i locale/messages.pot -d locale + pybabel compile -d locale -So if you want to test your translations, you need to run the ``nox`` command every time you change the .po files, then restart the PiFinder software: +Run these again every time you change a ``.po`` file, then restart the PiFinder +to pick up the new ``.mo`` files. On a running device that is: .. code-block:: - nox -s babel sudo systemctl restart pifinder Please post the changed po files in the Discord channel "translation" and we will include it in the next release. @@ -271,46 +250,56 @@ Please post the changed po files in the Discord channel "translation" and we wil Setup the development environment --------------------------------- -On the PiFinder -.................. +PiFinder is developed on a Linux machine with the `Nix package manager +`_, which provides the exact toolchain the project +builds and tests with. An x86_64 machine running Linux — including WSL2 on +Windows — is the primary platform, and the rest of this guide assumes it. -The best development platform for the PiFinder is the PiFinder itself via SSH or with a -monitor keyboard attached. This will let you develop and test any part of the code. +Most UI and catalog work can be done on that machine alone: the display is +emulated and the camera, IMU and GPS are faked with the flags described under +`Running/Debugging from the command line`_. Those physical features can only be +exercised on a real PiFinder. -See the :ref:`software:build from scratch` section of the Software Setup guide for -information on creating a base SD card and getting the base software running. +The device itself runs an immutable NixOS image, so its software sits read-only in +the Nix store. For a finished change you build an image and install it over the +air through the update channels (see `Beta Testing`_), or cut a release. For quick +iteration against the real camera, IMU and GPS, though, you can point the device +at an editable copy of your code and skip the image build entirely — see +`Developing on the PiFinder itself`_. -Other Options -................ - -Second to this is a standalone Raspberry Pi hooked up to a keyboard and monitor. This -will make sure your code will run on the PiFinder, but you won't be able to test the -IMU, GPS or other physical hardware features. You can emulate these using the -`--fakehardware` and `--display` flags. See below for more details. +To get started, fork the repo and clone your fork, then set up the environment as +described next. -You can also develop on any Posix compatible system (Linux / MacOS) in roughly the -same way you can on a Raspberry Pi. The emulated hardware and networking features -will work differently so this is mostly useful for UI/Catalog feature development. +Install dependencies with Nix +............................. -Note that you can develop on Windows by activating Windows Subsystem for Linux (WSL2) -and installing Ubuntu from the Microsoft Store. The window launched by PiFinder will -be fully integrated into your windows desktop. +PiFinder's development environment is described by the ``flake.nix`` at the +repository root, so you don't install Python or its libraries by hand. On NixOS +the Nix package manager is built in; on another Linux machine, install it and +enable flakes. If you use `direnv `_, let it manage the +shell automatically from the repository root: -To get started, fork the repo and set up your virtual environment system of choice -using Python 3.9. Then follow some of the steps below! +.. code-block:: -Install python dependencies -........................... + direnv allow -For running PiFinder, you need to install some python libraries in certain -versions. These lists can be installed via -`pip tool chain `_ and are separated in two -files: one for getting PiFinder to run, one for development purposes: +The shell then loads and unloads as you enter and leave the checkout. If you do +not use direnv, enter the identical shell explicitly instead: .. code-block:: - pip install -r requirements.txt - pip install -r requirements_dev.txt + nix develop + +Both routes give you everything PiFinder needs on your ``PATH``: a Python +interpreter with the project's dependencies, the ``ruff`` linter, the ``uv`` +package manager, and the ``cedar-detect-server`` plate-solving helper. The +repo's ``.envrc`` uses the classic ``shell.nix`` entry point, which selects the +same flake dev shell but filters large runtime data out of the source copied to +the Nix store. This keeps direnv reloads quick; manual ``nix develop`` and CI +still evaluate the flake directly. + +You still need to fetch the Tetra3 submodule once; see +`Install the Tetra3/Cedar solver`_ below. Hipparcos catalog @@ -341,76 +330,58 @@ command from with your checked out repo Code Quality Automation ----------------------- -The PiFinder codebase includes features for maintaining code quality, -adherence to style guide and for evaluation and testing. These will -be installed along with the dev dependencies and should be available -to run immediately. - -NOX -.... +PiFinder uses Ruff for linting and formatting, MyPy for type checking, and +PyTest for the test suite. They all come with the dev shell, so inside +``nix develop`` you run them directly from the ``python`` directory. Every push +and pull request runs the same commands in CI, so it's worth running them +locally before you open a PR. -We use `Nox `_ as an entrypoint to all of -the code quality tools. Simply run ``nox`` to from the ``PiFinder/python`` -directory and it will run (almost) all of the code quality checks and tests. +Linting and formatting +...................... -The first time it runs Nox will set up suitable environments for each session -it manages and this might take a bit. Subsequent runs will be much faster. +`Ruff `_ handles both. From ``python/``: -To see what sessions are available use ``nox -l`` +.. code-block:: -To run only a specific session use ``nox -s [session_name]`` + ruff check # report common issues (add --fix to repair them) + ruff format # reformat code in the Black style -The defined sessions are: +CI runs ``ruff check`` and ``ruff format --check`` and fails if either reports +anything, so run them before you push. -- lint -> Runs `RUFF `_ using ``ruff check --fix`` to - check/fix common code issues. It may produce warnings or fail completely if - there are issues with new code you are working on. See the documentation for - details on any errors it finds. +Type checking +............. -- format -> Runs ``ruff format`` to reformat code in the Black style. +`MyPy `_ does static type analysis. The +PiFinder code is not fully typed yet, but new contributions need to be +annotated. From ``python/``: -- type_hints -> Runs `my[py] `_ to do static - type analysis. The PiFinder code is not fully typed (yet!) but we are working on it - and any new contributions will need to be fully annotated. If you've not worked - with type-hinted Python before, we'll help you out, so feel free to put up PR's - for non-type-hinted code and we can collaborate. +.. code-block:: -- smoke_tests -> Runs `PyTest `_ and executes - all tests marked SMOKE. Smoke tests should be FAST and provide some basic - checking of sanity/syntax. + mypy . -- unit_tests -> Runs PyTest and executes all tests marked as UNIT. Unit tests - should exercise more functionality and make take a bit more time. This Nox - session is not run by default, but is executed on code check in to the PiFinder - repository. +If you've not worked with type hints before we'll help you out, so feel free to +open a PR for non-type-hinted code and we can collaborate. -- ui_tests -> Runs PyTest against the UI module smoke harness - (``tests/test_ui_modules.py``). It builds every UI screen through a real - ``MenuManager`` and exercises each screen's key handlers as a crash-only smoke - test. Because it builds the real catalogs and may download ``hip_main.dat`` on - first run, it is heavier and more network-dependent than the unit suite, so it - lives in its own session and is not run by default. +Tests +..... -- babel -> Runs the complete toolchain for internationalization (based on `pybabel`). - That means extracts strings to translate and updates the `.po`-files in `python/locale/**` - Then these are compiled into `.mo`-files. Unfortunately, this changes the `.mo`-files in any case, - even if the there have been no changes to strings or their translation. As this will show up - as changes to checked-in, this is not run by default. +`PyTest `_ runs the test suite. Tests carry markers so +you can run a slice of them. From ``python/``: -- web_tests -> Runs PyTest and executes all tests marked as WEB. Web tests use Selenium - to automate browser testing of the PiFinder web interface. These tests require a - running Selenium Grid server and a running PiFinder web server. You can test against a real PiFinder - or a locally running instance. See the sections below for setup instructions. - +.. code-block:: -CI/CD -....... + pytest -m smoke # fast sanity/syntax checks + pytest -m unit # broader unit coverage + pytest -m web # browser tests of the web interface (see below) -All pushes to the PiFinder repository will run all the defined Nox sessions. Automations -for PR's will need to be triggered by a maintainer, but you can (and should!) set up -your fork to run the existing automation to validate your code as you develop. +There is also a UI smoke harness that builds every screen through a real +``MenuManager`` and exercises its key handlers — run it with +``pytest tests/test_ui_modules.py``. It builds the real catalogs and may +download ``hip_main.dat`` on first run, so it's heavier than the unit suite. -If you need help, reach out via email or discord. We are happy to help :-) +Smoke and unit tests run in CI on every push. The web tests need extra setup — +a Selenium Grid and a running PiFinder web server — described next. Website Tests ............. @@ -455,20 +426,18 @@ Running against a locally running instance at localhost:8080: .. code-block:: bash - cd ~/PiFinder/python - . .venv/bin/activate # Optionally active your virtual environment + cd python export SELENIUM_GRID_URL= # Optional, default is http://localhost:4444/wd/hub - nox -s web_tests + pytest -m web --local If you want to test against a real PiFinder, set the ``PIFINDER_HOMEPAGE`` environment variable to the URL of your PiFinder instance: .. code-block:: bash - cd ~/PiFinder/python - . .venv/bin/activate # Optionally active your virtual environment + cd python export SELENIUM_GRID_URL= # Optional, default is http://localhost:4444/wd/hub export PIFINDER_HOMEPAGE=http://pifinder.local # Change to the URL of your PiFinder, which needs to be in the same WiFi - nox -s web_tests + pytest -m web If you run the tests with-out a working Selenium Grid instance, the tests will all be skipped. You can also run individual tests with PyTest directly, use ``SELENIUM_GRID_URL=... PIFINDER_HOMEPAGE=... pytest tests/website/test_file.py``. @@ -507,6 +476,13 @@ python program with the command line parameters you need for the certain use cas You simply stop the program with "Ctrl + C". +.. note:: + + On a Nix development machine, enter the dev shell first (``nix develop``, or + let direnv load it) and run these commands from the ``python`` folder of your + own checkout rather than ``/home/pifinder/PiFinder``. Everything you need, + including ``cedar-detect-server``, is already on your ``PATH``. + **Remember**: PiFinder is designed to automatically start after boot. So a PiFinder process is likely running. Before you can start a PiFinder process for testing purposes from the command line, you have to stop all currently running @@ -522,14 +498,16 @@ PiFinder: Running cedar-detect-server ............................. -You will need to start the ``cedar-detect`` process manually, if your development machine is not a PiFinder, -as it is started as a separate process on the PiFinder starting with v2.4.0. -You can do this by running the following command in another terminal window: +If your development machine isn't a PiFinder, you need to start the +``cedar-detect`` star-detection process yourself — since v2.4.0 it runs as a +separate process. The Nix dev shell puts ``cedar-detect-server`` on your +``PATH``, so in another terminal window run: .. code-block:: - cd /home/pifinder/PiFinder/bin - ./cedar-detect-server- -p 50551 + cedar-detect-server -p 50551 + +The ``-p 50551`` port is required — PiFinder looks for the server there. -h, --help | available command line arguments ............................................. @@ -621,6 +599,117 @@ be retired because the remote server is always started. python3 -m PiFinder.main -fh -k server --camera debug -x +Developing on the PiFinder itself +--------------------------------- + +Most development happens on your desktop, but the camera, IMU, GPS and the +physical keypad and screen only exist on the device. When a change needs testing +against that real hardware, you can run your own code on the PiFinder directly, +without building and flashing an image for every edit. + +The shipped software sits read-only in the Nix store, and +``/home/pifinder/PiFinder`` is a symlink pointing at it. Repoint that symlink at a +writable copy of your code and the app runs your files instead, using the Python +interpreter and libraries already installed on the device. The service follows +the symlink into your checkout, so the loop is just edit, restart, look — no +rebuild. + +Connect to the PiFinder over SSH, then: + +1. Stop the running app. It starts automatically at boot, and only one instance + can use the hardware at a time: + + .. code-block:: bash + + sudo systemctl stop pifinder + +2. Get a copy of your fork into the ``pifinder`` home directory, under any name + except ``PiFinder`` itself — that's the symlink you're about to move. The + device carries ``git`` and ``rsync``, so clone your fork directly: + + .. code-block:: bash + + git clone --depth 1 https://github.com//PiFinder.git PiFinder-dev + + The checkout includes the bundled catalog data, so it's a few hundred + megabytes; ``--depth 1`` keeps the Git history lean. If you'd rather edit on + your desktop, ``rsync`` the changed files over between runs: + + .. code-block:: bash + + rsync -a --exclude .git ./ pifinder@pifinder.local:PiFinder-dev/ + +3. Note where the symlink currently points, so you can get back to the shipped + code later, then aim it at your copy: + + .. code-block:: bash + + readlink /home/pifinder/PiFinder # save this store path + ln -sfT /home/pifinder/PiFinder-dev /home/pifinder/PiFinder + +4. Start the app again. It now runs your code: + + .. code-block:: bash + + sudo systemctl start pifinder + +From here the cycle is quick. Edit a file — ``vim`` is on the device, or re-copy +it from your desktop — then restart the app and follow its log: + +.. code-block:: bash + + sudo systemctl restart pifinder + journalctl -u pifinder -f + +For verbose, interactive output (the ``-x`` flag and the other switches above), +stop the service instead and run the app in the foreground from your copy's +``python`` folder, exactly as in `Running/Debugging from the command line`_. + +For work that changes Python dependencies or needs development tools, enter the +repository's complete Nix development environment first: + +.. code-block:: bash + + cd /home/pifinder/PiFinder-dev + nix develop + +The flake provides this shell for both desktop Linux and the PiFinder's +``aarch64-linux`` system. It uses the checked-in ``flake.lock``, +``python/pyproject.toml`` and ``python/uv.lock`` and supplies the same native +``libcamera`` and GObject bindings as the service. CI publishes the aarch64 +shell dependency closure for testable PRs and releases to the PiFinder binary +caches. + +Why ``nix develop`` here instead of the desktop's preferred ``direnv allow``? +The released device does not currently ship direnv. More importantly, the +current dev-shell output still includes the PiFinder project source: editing a +file changes that output's store hash even when none of its dependencies +changed. ``--option max-jobs 0`` would therefore reject an ordinary edited +checkout whose exact source-dependent output cannot already exist in a cache. +The intended end state is to make the shell dependency-only and ship direnv on +the device; at that point ``direnv allow`` can be the identical entry point on +desktop and PiFinder while the editable source remains outside the cached +environment. + +.. note:: + + This override is deliberately temporary. A reboot or an over-the-air software + update re-runs the device's activation step, which restores + ``/home/pifinder/PiFinder`` to the shipped store path. To return to the + released software at any time, reboot — or repoint the symlink at the path you + saved with ``readlink``. + +.. note:: + + Repointing the symlink runs your code against the image's existing Python + environment, which is the fastest path for pure-Python edits. Use ``nix + develop`` when changing the environment itself; do not create a separate + ``uv venv`` on the device, because that omits native bindings supplied by + Nix. A dependency you intend to keep belongs in ``python/pyproject.toml`` + with an updated ``uv.lock`` and ultimately in a new image (see `Beta + Testing`_) so every device runs the same tested environment. + + Troubleshooting --------------- @@ -694,6 +783,3 @@ Finally, you can start straight into this mode from the command line — see the .. image:: images/user_guide/DEMO_MODE_001_docs.png .. image:: images/user_guide/DEMO_MODE_002_docs.png - - - diff --git a/flake.lock b/flake.lock new file mode 100644 index 000000000..27b08dcbc --- /dev/null +++ b/flake.lock @@ -0,0 +1,115 @@ +{ + "nodes": { + "nixos-hardware": { + "locked": { + "lastModified": 1770631810, + "narHash": "sha256-b7iK/x+zOXbjhRqa+XBlYla4zFvPZyU5Ln2HJkiSnzc=", + "owner": "NixOS", + "repo": "nixos-hardware", + "rev": "2889685785848de940375bf7fea5e7c5a3c8d502", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixos-hardware", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1770617025, + "narHash": "sha256-1jZvgZoAagZZB6NwGRv2T2ezPy+X6EFDsJm+YSlsvEs=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "2db38e08fdadcc0ce3232f7279bab59a15b94482", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-25.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "pyproject-build-systems": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ], + "pyproject-nix": [ + "pyproject-nix" + ], + "uv2nix": [ + "uv2nix" + ] + }, + "locked": { + "lastModified": 1781807804, + "narHash": "sha256-04KFQME8sE1LSywNiYS1B6Ucf5rEiUD7/vxwFMgooXU=", + "owner": "pyproject-nix", + "repo": "build-system-pkgs", + "rev": "b84e03a7870c66033d309e0e00abd513e2299627", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "build-system-pkgs", + "type": "github" + } + }, + "pyproject-nix": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1781812259, + "narHash": "sha256-uRqDouxg3b0EuOHQd1HhmFZouHebM7pz+H6EWAXd3FM=", + "owner": "pyproject-nix", + "repo": "pyproject.nix", + "rev": "d9847acff422152a03764fd60c96ae0dd9f9fa73", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "pyproject.nix", + "type": "github" + } + }, + "root": { + "inputs": { + "nixos-hardware": "nixos-hardware", + "nixpkgs": "nixpkgs", + "pyproject-build-systems": "pyproject-build-systems", + "pyproject-nix": "pyproject-nix", + "uv2nix": "uv2nix" + } + }, + "uv2nix": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ], + "pyproject-nix": [ + "pyproject-nix" + ] + }, + "locked": { + "lastModified": 1781810314, + "narHash": "sha256-PQfvfKWaBvCysdHFUO5GewwvwIqI/WL6OcrJhDSUdbc=", + "owner": "pyproject-nix", + "repo": "uv2nix", + "rev": "14aa44100859a44144878fe079f8089d3fa4dc4e", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "uv2nix", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 000000000..a1c1cf7c4 --- /dev/null +++ b/flake.nix @@ -0,0 +1,465 @@ +{ + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11"; + nixos-hardware.url = "github:NixOS/nixos-hardware"; + + pyproject-nix = { + url = "github:pyproject-nix/pyproject.nix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + uv2nix = { + url = "github:pyproject-nix/uv2nix"; + inputs.pyproject-nix.follows = "pyproject-nix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + pyproject-build-systems = { + url = "github:pyproject-nix/build-system-pkgs"; + inputs.pyproject-nix.follows = "pyproject-nix"; + inputs.uv2nix.follows = "uv2nix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; + + outputs = { self, nixpkgs, nixos-hardware, pyproject-nix, uv2nix, pyproject-build-systems, ... }: let + # Flake inputs the python-env module needs, passed via specialArgs. + pythonInputs = { inherit nixos-hardware pyproject-nix uv2nix pyproject-build-systems; }; + crossPkgsAarch64 = import nixpkgs { + localSystem = "x86_64-linux"; + crossSystem = "aarch64-linux"; + }; + pifinderCrossKernel = import ./nixos/pkgs/pifinder-kernel.nix { + pkgs = crossPkgsAarch64; + inherit nixos-hardware; + }; + # Headless config shared by all profiles + headlessModule = { lib, ... }: { + services.xserver.enable = false; + security.polkit.enable = true; + fonts.fontconfig.enable = false; + documentation.enable = false; + documentation.man.enable = false; + documentation.nixos.enable = false; + xdg.portal.enable = false; + services.pipewire.enable = false; + services.pulseaudio.enable = false; + boot.initrd.availableKernelModules = lib.mkForce [ "mmc_block" "usbhid" "usb_storage" "vc4" ]; + }; + + # Shared modules for all PiFinder configurations + commonModules = [ + nixos-hardware.nixosModules.raspberry-pi-4 + ./nixos/hardware.nix + ./nixos/networking.nix + ./nixos/services.nix + ./nixos/python-env.nix + headlessModule + ]; + + # Migration profile — minimal bootable system, full config fetched on first boot + migrationModules = [ + nixos-hardware.nixosModules.raspberry-pi-4 + ./nixos/hardware.nix + ./nixos/networking.nix + ./nixos/wifi-fallback-minimal.nix + ./nixos/device.nix + headlessModule + ]; + + mkPifinderSystem = { includeSDImage ? false, kernel ? null }: + nixpkgs.lib.nixosSystem { + system = "aarch64-linux"; + # pifinderKernel must always be present in specialArgs: a NixOS module's + # `arg ? default` formal is not honoured by the module system, so an + # absent arg fails evaluation. null selects the natively-built patched + # kernel; a non-null value injects a prebuilt (e.g. cross-built) one. + specialArgs = pythonInputs // { pifinderKernel = kernel; }; + modules = commonModules ++ [ + { pifinder.devMode = false; } + # Camera specialisations — base is imx462 (default), specialisations for others + ({ ... }: { + specialisation = { + imx296.configuration = { pifinder.cameraType = "imx296"; }; + imx477.configuration = { pifinder.cameraType = "imx477"; }; + }; + }) + ({ lib, ... }: { + boot.supportedFilesystems = lib.mkForce [ "vfat" "ext4" ]; + boot.loader.timeout = 0; + }) + ] ++ nixpkgs.lib.optionals includeSDImage [ + "${nixpkgs}/nixos/modules/installer/sd-card/sd-image-aarch64.nix" + ({ config, pkgs, lib, ... }: { + # Catalog images (~5GB compressed) are not baked into the SD image: the + # app fetches per-object images on demand from the CDN (get_images.py) + # and renders a placeholder when one is absent. Shipping only the empty + # data dir keeps the image slim and the build fast. + # + # current-build.json seeds the device's identity with its own store + # path; human version labels come from the update manifest (which maps + # store paths to versions), and every upgrade rewrites this file. + sdImage.populateRootCommands = '' + mkdir -p ./files/home/pifinder/PiFinder_data + mkdir -p ./files/var/lib/pifinder + printf '{"store_path": "%s"}\n' "${config.system.build.toplevel}" \ + > ./files/var/lib/pifinder/current-build.json + ''; + sdImage.populateFirmwareCommands = lib.mkForce '' + (cd ${pkgs.raspberrypifw}/share/raspberrypi/boot && cp bootcode.bin fixup*.dat start*.elf $NIX_BUILD_TOP/firmware/) + + cp ${configTxt} firmware/config.txt + + # Pi3 files + cp ${pkgs.ubootRaspberryPi3_64bit}/u-boot.bin firmware/u-boot-rpi3.bin + cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2710-rpi-2-b.dtb firmware/ + cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2710-rpi-3-b.dtb firmware/ + cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2710-rpi-3-b-plus.dtb firmware/ + cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2710-rpi-cm3.dtb firmware/ + cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2710-rpi-zero-2.dtb firmware/ + cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2710-rpi-zero-2-w.dtb firmware/ + + # Pi4 files + cp ${ubootSD}/u-boot.bin firmware/u-boot-rpi4.bin + cp ${pkgs.raspberrypi-armstubs}/armstub8-gic.bin firmware/armstub8-gic.bin + cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2711-rpi-4-b.dtb firmware/ + cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2711-rpi-400.dtb firmware/ + cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2711-rpi-cm4.dtb firmware/ + cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2711-rpi-cm4s.dtb firmware/ + ''; + }) + ] ++ nixpkgs.lib.optionals (!includeSDImage) [ + # Minimal filesystem stub for closure builds (CI) + ({ lib, ... }: { + fileSystems."/" = { + device = "/dev/disk/by-label/NIXOS_SD"; + fsType = "ext4"; + }; + fileSystems."/boot/firmware" = { + device = "/dev/disk/by-label/FIRMWARE"; + fsType = "vfat"; + }; + }) + ]; + }; + + mkPifinderMigration = { includeSDImage ? false }: nixpkgs.lib.nixosSystem { + system = "aarch64-linux"; + specialArgs = pythonInputs // { pifinderKernel = null; }; + modules = migrationModules ++ [ + { pifinder.devMode = false; } + ({ lib, ... }: { + boot.supportedFilesystems = lib.mkForce [ "vfat" "ext4" ]; + boot.loader.timeout = 0; + }) + ] ++ nixpkgs.lib.optionals includeSDImage [ + "${nixpkgs}/nixos/modules/installer/sd-card/sd-image-aarch64.nix" + ({ config, pkgs, lib, ... }: { + sdImage.populateRootCommands = '' + mkdir -p ./files/home/pifinder/PiFinder_data + mkdir -p ./files/var/lib/pifinder + # ADR 0003: last-ditch fallback for first-boot resolution when the + # update manifest is unreachable. The manifest is the primary + # source; this file is otherwise ignored and removed on success. + # (The old closure-based tarball builder used to write it; the + # image-based pipeline must bake it.) + echo "${(mkPifinderSystem {}).config.system.build.toplevel}" \ + > ./files/var/lib/pifinder/first-boot-target + ''; + sdImage.populateFirmwareCommands = lib.mkForce '' + (cd ${pkgs.raspberrypifw}/share/raspberrypi/boot && cp bootcode.bin fixup*.dat start*.elf $NIX_BUILD_TOP/firmware/) + + cp ${configTxt} firmware/config.txt + + # Pi3 files + cp ${pkgs.ubootRaspberryPi3_64bit}/u-boot.bin firmware/u-boot-rpi3.bin + cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2710-rpi-2-b.dtb firmware/ + cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2710-rpi-3-b.dtb firmware/ + cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2710-rpi-3-b-plus.dtb firmware/ + cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2710-rpi-cm3.dtb firmware/ + cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2710-rpi-zero-2.dtb firmware/ + cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2710-rpi-zero-2-w.dtb firmware/ + + # Pi4 files + cp ${ubootSD}/u-boot.bin firmware/u-boot-rpi4.bin + cp ${pkgs.raspberrypi-armstubs}/armstub8-gic.bin firmware/armstub8-gic.bin + cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2711-rpi-4-b.dtb firmware/ + cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2711-rpi-400.dtb firmware/ + cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2711-rpi-cm4.dtb firmware/ + cp ${pkgs.raspberrypifw}/share/raspberrypi/boot/bcm2711-rpi-cm4s.dtb firmware/ + ''; + }) + ] ++ nixpkgs.lib.optionals (!includeSDImage) [ + ({ lib, ... }: { + fileSystems."/" = { + device = "/dev/disk/by-label/NIXOS_SD"; + fsType = "ext4"; + }; + fileSystems."/boot/firmware" = { + device = "/dev/disk/by-label/FIRMWARE"; + fsType = "vfat"; + }; + }) + ]; + }; + + # Netboot configuration — NFS root, DHCP network in initrd + mkPifinderNetboot = nixpkgs.lib.nixosSystem { + system = "aarch64-linux"; + specialArgs = pythonInputs // { pifinderKernel = null; }; + modules = commonModules ++ [ + { pifinder.devMode = true; } + { pifinder.cameraType = nixpkgs.lib.mkDefault "imx477"; } # HQ camera for netboot dev + # Camera specialisations for netboot (base is imx477) + ({ ... }: { + specialisation = { + imx296.configuration = { pifinder.cameraType = "imx296"; }; + imx462.configuration = { pifinder.cameraType = "imx462"; }; + }; + }) + ({ lib, pkgs, ... }: + let + boot-splash = import ./nixos/pkgs/boot-splash.nix { inherit pkgs; }; + in { + # Static passwd/group — NFS can't run activation scripts + users.mutableUsers = false; + # DNS for netboot (udhcpc doesn't configure resolvconf properly) + networking.nameservers = [ "192.168.5.1" "8.8.8.8" ]; + boot.supportedFilesystems = lib.mkForce [ "vfat" "ext4" "nfs" ]; + boot.initrd.supportedFilesystems = [ "nfs" ]; + # Add SPI kernel module for early OLED splash + boot.initrd.kernelModules = [ "spi_bcm2835" ]; + # Override the minimal module list from commonModules — add network drivers + # Note: genet (RPi4 ethernet) is built into the kernel, not a module + boot.initrd.availableKernelModules = lib.mkForce [ + "mmc_block" "usbhid" "usb_storage" "vc4" + ]; + # Add boot-splash to initrd + boot.initrd.extraUtilsCommands = '' + copy_bin_and_libs ${boot-splash}/bin/boot-splash + ''; + # Disable predictable interface names so eth0 works + boot.kernelParams = [ "net.ifnames=0" "biosdevname=0" ]; + boot.initrd.network = { + enable = true; + }; + # Show static splash, then configure network + boot.initrd.postDeviceCommands = '' + # Create device nodes for SPI OLED + mkdir -p /dev + mknod -m 666 /dev/spidev0.0 c 153 0 2>/dev/null || true + mknod -m 666 /dev/gpiochip0 c 254 0 2>/dev/null || true + + # Show static splash image (--static flag = display once and exit) + boot-splash --static || true + # Wait for interface to appear (up to 30 seconds) + echo "Waiting for eth0..." + for i in $(seq 1 60); do + if ip link show eth0 >/dev/null 2>&1; then + echo "eth0 found after $i attempts" + break + fi + sleep 0.5 + done + + ip link set eth0 up + + # Wait for link carrier (cable connected) + echo "Waiting for link carrier..." + for i in $(seq 1 20); do + if [ "$(cat /sys/class/net/eth0/carrier 2>/dev/null)" = "1" ]; then + echo "Link up after $i attempts" + break + fi + sleep 0.5 + done + + # DHCP with retries + echo "Starting DHCP..." + for attempt in 1 2 3; do + if udhcpc -i eth0 -t 5 -T 3 -n -q -s /etc/udhcpc.script; then + echo "DHCP succeeded on attempt $attempt" + break + fi + echo "DHCP attempt $attempt failed, retrying..." + sleep 2 + done + + # Verify we got an IP + if ip addr show eth0 | grep -q "inet "; then + echo "Network configured:" + ip addr show eth0 + else + echo "WARNING: No IP address on eth0!" + ip addr show eth0 + fi + ''; + # NFS root filesystem - NFSv4 with disabled caching for Nix compatibility + fileSystems."/" = { + device = "192.168.5.12:/srv/nfs/pifinder"; + fsType = "nfs"; + options = [ "vers=4" "noac" "actimeo=0" ]; + }; + # Dummy /boot — not used for netboot but NixOS requires it + fileSystems."/boot" = { + device = "none"; + fsType = "tmpfs"; + neededForBoot = false; + }; + }) + ]; + }; + # Custom u-boot variants + pkgsAarch64 = import nixpkgs { system = "aarch64-linux"; }; + # SD boot: skip PCI/USB/net probe, go straight to mmc extlinux + ubootSD = pkgsAarch64.ubootRaspberryPi4_64bit.override { + extraConfig = '' + CONFIG_CMD_PXE=y + CONFIG_CMD_SYSBOOT=y + CONFIG_BOOTDELAY=0 + CONFIG_PREBOOT="" + CONFIG_BOOTCOMMAND="sysboot mmc 0:2 any 0x02400000 /boot/extlinux/extlinux.conf" + CONFIG_PCI=n + CONFIG_USB=n + CONFIG_CMD_USB=n + CONFIG_CMD_PCI=n + CONFIG_USB_KEYBOARD=n + CONFIG_BCMGENET=n + ''; + }; + # Netboot: PCI + DHCP + PXE + ubootNetboot = pkgsAarch64.ubootRaspberryPi4_64bit.override { + extraConfig = '' + CONFIG_BOOTCOMMAND="pci enum; dhcp; pxe get; pxe boot" + ''; + }; + + configTxt = pkgsAarch64.writeText "config.txt" '' + [pi3] + kernel=u-boot-rpi3.bin + + [pi02] + kernel=u-boot-rpi3.bin + + [pi4] + kernel=u-boot-rpi4.bin + enable_gic=1 + armstub=armstub8-gic.bin + + disable_overscan=1 + arm_boost=1 + + [cm4] + otg_mode=1 + + [all] + arm_64bit=1 + enable_uart=1 + avoid_warnings=1 + ''; + + # Reproducible development environment for both desktop Linux and the + # aarch64 PiFinder itself. Runtime-native bindings come from Nix, just as + # they do in the systemd service; uv supplies the locked Python workspace. + mkDevShell = system: let + pkgs = import nixpkgs { + inherit system; + overlays = [(final: prev: { + libcamera = prev.libcamera.overrideAttrs (old: { + mesonFlags = (old.mesonFlags or []) ++ [ "-Dpycamera=enabled" ]; + buildInputs = (old.buildInputs or []) ++ [ + final.python313 + final.python313.pkgs.pybind11 + ]; + }); + })]; + }; + pyPkgs = import ./nixos/pkgs/uv-python.nix { + inherit pkgs pyproject-nix uv2nix pyproject-build-systems; + }; + cedar-detect = import ./nixos/pkgs/cedar-detect.nix { inherit pkgs; }; + in pkgs.mkShell { + packages = [ + pyPkgs.devEnv + pkgs.bashInteractive + pkgs.ruff + pkgs.uv + pkgs.git + pkgs.rsync + pkgs.gobject-introspection + pkgs.networkmanager + pkgs.libcamera + pkgs.gpsd + cedar-detect + ]; + shellHook = '' + export PYTHONPATH="${pkgs.libcamera}/lib/python3.13/site-packages:$PYTHONPATH" + export GI_TYPELIB_PATH="${pkgs.lib.makeSearchPath "lib/girepository-1.0" [ + pkgs.networkmanager + pkgs.glib.out + pkgs.gobject-introspection + ]}:$GI_TYPELIB_PATH" + export LIBCAMERA_IPA_MODULE_PATH="${pkgs.libcamera}/lib/libcamera" + ''; + }; + + in { + nixosConfigurations = { + # SD card boot — camera baked into DT, switched via specialisations + pifinder = mkPifinderSystem {}; + # Cache-compatible aarch64 userspace with a kernel cross-built on x86_64. + pifinder-fast = mkPifinderSystem { kernel = pifinderCrossKernel; }; + # Migration — minimal bootable system, defers full system to first boot + pifinder-migration = mkPifinderMigration {}; + # NFS netboot — for development on proxnix + pifinder-netboot = mkPifinderNetboot; + }; + images = { + pifinder = (mkPifinderSystem { includeSDImage = true; }).config.system.build.sdImage; + pifinder-migration = (mkPifinderMigration { includeSDImage = true; }).config.system.build.sdImage; + }; + packages.aarch64-linux = { + uboot-sd = ubootSD; + uboot-netboot = ubootNetboot; + migration-boot-firmware = pkgsAarch64.runCommand "migration-boot-firmware" {} '' + mkdir -p $out + FW=${pkgsAarch64.raspberrypifw}/share/raspberrypi/boot + + # RPi firmware + cp $FW/bootcode.bin $FW/fixup*.dat $FW/start*.elf $out/ + + # Pi3 DTBs + cp $FW/bcm2710-rpi-2-b.dtb $FW/bcm2710-rpi-3-b.dtb $FW/bcm2710-rpi-3-b-plus.dtb $out/ + cp $FW/bcm2710-rpi-cm3.dtb $FW/bcm2710-rpi-zero-2.dtb $FW/bcm2710-rpi-zero-2-w.dtb $out/ + + # Pi4 DTBs + cp $FW/bcm2711-rpi-4-b.dtb $FW/bcm2711-rpi-400.dtb $FW/bcm2711-rpi-cm4.dtb $FW/bcm2711-rpi-cm4s.dtb $out/ + + # config.txt + cp ${configTxt} $out/config.txt + + # u-boot binaries + cp ${pkgsAarch64.ubootRaspberryPi3_64bit}/u-boot.bin $out/u-boot-rpi3.bin + cp ${ubootSD}/u-boot.bin $out/u-boot-rpi4.bin + + # armstub + cp ${pkgsAarch64.raspberrypi-armstubs}/armstub8-gic.bin $out/armstub8-gic.bin + ''; + }; + + packages.x86_64-linux.pifinder-kernel-cross = pifinderCrossKernel; + + devShells = { + x86_64-linux.default = mkDevShell "x86_64-linux"; + aarch64-linux.default = mkDevShell "aarch64-linux"; + }; + + devShells.aarch64-darwin.default = let + pkgs = import nixpkgs { system = "aarch64-darwin"; }; + pyPkgs = import ./nixos/pkgs/uv-python-darwin.nix { + inherit pkgs pyproject-nix uv2nix pyproject-build-systems; + }; + cedar-detect = import ./nixos/pkgs/cedar-detect.nix { inherit pkgs; }; + in pkgs.mkShell { + packages = [ pyPkgs.devEnv pkgs.ruff pkgs.uv cedar-detect ]; + }; + }; +} diff --git a/migration_gate.json b/migration_gate.json deleted file mode 100644 index 703d93f21..000000000 --- a/migration_gate.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "nixos_for_everyone": false, - "nixos_url": "https://github.com/mrosseel/PiFinder/releases/download/v3.0.0-migration/pifinder-nixos-v3.0.0.tar.zst" -} diff --git a/migration_source/v1.x.x.sh b/migration_source/v1.x.x.sh deleted file mode 100644 index e17ee2c65..000000000 --- a/migration_source/v1.x.x.sh +++ /dev/null @@ -1,48 +0,0 @@ -# GPSD -sudo apt install -y gpsd -sudo dpkg-reconfigure -plow gpsd -sudo cp ~/PiFinder/pi_config_files/gpsd.conf /etc/default/gpsd - -# PWM -sudo sed -zi '/dtoverlay=pwm,pin=13,func=4\n/!s/$/\ndtoverlay=pwm,pin=13,func=4\n/' /boot/config.txt - -# Uart for GPS -sudo sed -zi '/dtoverlay=uart3\n/!s/$/\ndtoverlay=uart3\n/' /boot/config.txt - -# Migrate DB -if [ -f "/home/pifinder/PiFinder/astro_data/observations.db" ] -then - echo "Migrating astro_data DB" - python -c "from PiFinder import setup;setup.create_logging_tables();" - sqlite3 < /home/pifinder/PiFinder/migrate_db.sql - rm /home/pifinder/PiFinder/astro_data/observations.db -fi - -# Migrate Config files -if ! [ -f "/home/pifinder/PiFinder_data/config.json" ] -then - echo "Migrating config.json" - mv /home/pifinder/PiFinder/config.json /home/pifinder/PiFinder_data/config.json -fi - -# Adjust service definition -sudo systemctl disable pifinder -sudo rm /etc/systemd/system/pifinder.service -sudo cp /home/pifinder/PiFinder/pi_config_files/pifinder.service /lib/systemd/system/pifinder.service -sudo systemctl daemon-reload -sudo systemctl enable pifinder - -# add PiFinder_splash if not already in place -if ! [ -f "/lib/systemd/system/pifinder_spash.service" ] -then - sudo cp /home/pifinder/PiFinder/pi_config_files/pifinder_splash.service /lib/systemd/system/pifinder_splash.service - sudo systemctl daemon-reload - sudo systemctl enable pifinder_splash -fi - -# open permissisons on wpa_supplicant file so we can adjust network config -sudo chmod 666 /etc/wpa_supplicant/wpa_supplicant.conf - -# DONE -echo "Post Update Complete" - diff --git a/migration_source/v2.1.0.sh b/migration_source/v2.1.0.sh deleted file mode 100644 index b066c1875..000000000 --- a/migration_source/v2.1.0.sh +++ /dev/null @@ -1,7 +0,0 @@ -# swap tetra3 submodule -git submodule sync -git submodule update --init --recursive - -# Set up symlink -ln -s /home/pifinder/PiFinder/python/PiFinder/tetra3/tetra3 /home/pifinder/PiFinder/python/tetra3 - diff --git a/migration_source/v2.2.1.sh b/migration_source/v2.2.1.sh deleted file mode 100644 index a2c5a38e9..000000000 --- a/migration_source/v2.2.1.sh +++ /dev/null @@ -1,6 +0,0 @@ -# install lib input -sudo apt install -y libinput10 - -# Add PiFinder user to input group -sudo usermod -G input -a "pifinder" - diff --git a/migration_source/v2.2.2.sh b/migration_source/v2.2.2.sh deleted file mode 100644 index 3aa07b7f1..000000000 --- a/migration_source/v2.2.2.sh +++ /dev/null @@ -1,7 +0,0 @@ -# Enable usb-host on usb-c port - -#Add it to the dw2 line if it exist -sudo sed -zi "s/dtoverlay=dwc2\n/dtoverlay=dwc2,dr_mode=host\n/" /boot/config.txt - -#Add the line if it does not exist -sudo sed -zi '/dtoverlay=dwc2,dr_mode=host\n/!s/$/\ndtoverlay=dwc2,dr_mode=host\n/' /boot/config.txt diff --git a/migration_source/v2.4.0.sh b/migration_source/v2.4.0.sh deleted file mode 100644 index 949219087..000000000 --- a/migration_source/v2.4.0.sh +++ /dev/null @@ -1,4 +0,0 @@ -#Add and enable cedar-detect as system process -sudo cp /home/pifinder/PiFinder/pi_config_files/cedar_detect.service /lib/systemd/system/cedar_detect.service -sudo systemctl daemon-reload -sudo systemctl enable cedar_detect diff --git a/migration_source/v2.6.0.sh b/migration_source/v2.6.0.sh deleted file mode 100644 index 65b771c00..000000000 --- a/migration_source/v2.6.0.sh +++ /dev/null @@ -1,6 +0,0 @@ -# Clear stale flop_image=true on the shipped "Generic Dobsonian" default. -# flip/flop are now applied to the object-detail image; a Dobsonian needs -# neither flag, so repair any persisted config that froze the bad default. -# Idempotent and version-gated by pifinder_post_update.sh. See -# docs/adr/0003-object-image-orientation.md. -python /home/pifinder/PiFinder/python/PiFinder/migrations/v2_6_0_dob_flop.py /home/pifinder/PiFinder_data/config.json diff --git a/nixos/RELEASE.md b/nixos/RELEASE.md new file mode 100644 index 000000000..5f45ecba6 --- /dev/null +++ b/nixos/RELEASE.md @@ -0,0 +1,171 @@ +# NixOS Release Process + +How PiFinder NixOS builds are versioned, published, and updated on devices. + +> Not to be confused with the repo-root `RELEASE.md`, which is hand-written release notes for a specific version. This file documents the plumbing. + +## Single Source Of Truth + +``` +update-manifest.json (committed to the metadata-only nixos-manifest branch) + │ + └─ channels[] + ├─ "version": "3.0.0" ← what the device displays + └─ "store_path": "/nix/store/…" ← what the device installs +``` + +Source branches stay source-only. CI writes generated install metadata to the +manifest branch after successful builds and releases. The device fetches the raw +manifest JSON; it does not call the GitHub API and it does not probe branch-head +`pifinder-build.json` files. + +At runtime, `python/PiFinder/utils.py::get_version()` reads +`/var/lib/pifinder/current-build.json` — the device's single identity file. +The image builder seeds it with the system's own store path; the updater +rewrites it (with version/label/channel) on every install. Human version +labels come from the update manifest, which maps store paths to versions. +(`pifinder-build.json` is retired.) + +## Artifacts + +| Artifact | Where | Purpose | +| ------------------------------ | --------------------------------- | -------------------------------------- | +| Release closure on Attic | `cache.pifinder.eu/pifinder-release` | What the device upgrade pulls (retained) | +| `update-manifest.json` | `nixos-manifest` branch | Tells the channel checker what's live | +| Git tag `vX.Y.Z` | GitHub | Marks a release commit | +| GitHub Release | GitHub Releases | Carries the SD image + tarball | +| `pifinder-vX.Y.Z.img.zst` | GitHub Release asset | SD card image for fresh installs | +| `pifinder-migration-vX.Y.Z.tar.zst` | GitHub Release asset | Tarball for in-place migration | + +## Binary caches + +Two self-hosted Attic caches on `cache.pifinder.eu` (ADR 0004): + +| Cache | Pushed by | Retention | Holds | +| ------------------ | -------------------------- | ---------------- | ------------------------------ | +| `pifinder-release` | `release.yml` | never GC'd | tagged release closures | +| `pifinder` | `build.yml` | short (dev GC) | dev + nightly branch builds | + +Release closures go to `pifinder-release` so a device upgrading long after a +release still resolves the store path; dev builds churn through `pifinder`. +Devices subscribe to both (`nixos/services.nix`), release cache first, with +`cache.nixos.org` as the fall-through for upstream paths. `cachix.org` is no +longer used. + +Both caches are declared server-side in nixos-config +(`machines/general-server/attic-service.nix`). To prune the dev cache later, set +retention **per-cache** (`attic cache configure local:pifinder --retention-period +`), never globally — a global retention would also evict `pifinder-release`. + +## Who Writes `update-manifest.json` + +``` +┌──────────────────────────────────────────────────────────────────┐ +│ CI dev build (.github/workflows/build.yml :: update-manifest) │ +│ After a successful build, commits to nixos-manifest only: │ +│ PR → channel=unstable, kind=pr, store_path= │ +│ else→ channel=unstable, kind=trunk, store_path= │ +├──────────────────────────────────────────────────────────────────┤ +│ Release workflow (.github/workflows/release.yml) │ +│ workflow_dispatch with `version: 3.0.0`. Builds, tags, │ +│ publishes the GitHub Release, then updates stable/beta in the │ +│ manifest branch. │ +└──────────────────────────────────────────────────────────────────┘ +``` + +That's it. Generated metadata never lands on the source branch. + +## Update channels + +`python/PiFinder/ui/software.py` (Software-update menu) discovers what to offer: + +| Channel | Source | +| ------- | ---------------------------------------------------------------------- | +| stable | `update-manifest.json` release entries (`kind=release`) | +| beta | `update-manifest.json` prerelease entries (`kind=release`) | +| unstable | `update-manifest.json` trunk + PR entries | + +For each candidate, it reads `version` (to display) and `store_path` (to +install). Entries with `available=false` or invalid store paths are visible but +not installable. + +## Release flow + +``` + workflow_dispatch (Release) + inputs: version=3.0.0, type=stable|beta, source_branch=main, notes=… + │ + ▼ + ┌─────────────────────────────────────────────────────────────┐ + │ 1. checkout source_branch │ + │ 2. nix build .#…toplevel → store path A │ + │ 3. nix build .#images.pifinder → SD image embedding A│ + │ (image seeds /var/lib/pifinder/current-build.json │ + │ with store path A; labels resolve via the manifest) │ + │ 5. extract migration tarball from SD image │ + │ 6. attic push A → pifinder-release (retained) │ + │ 7. tag v3.0.0 (or v3.0.0-beta) │ + │ 8. create GitHub Release with SD image + tarball │ + │ 9. update nixos-manifest with store_path A │ + └─────────────────────────────────────────────────────────────┘ +``` + +SD image, tarball, Attic (`pifinder-release`) closure, and manifest entry all +agree on store path A. Devices display `3.0.0`. Channel checker sees `3.0.0` +pointing at A. + +## Dev build flow + +``` + push / testable PR build + │ + ▼ + ┌─────────────────────────────────────────┐ + │ build.yml │ + │ 1. nix build closure (native + emulated) │ + │ 2. attic push → pifinder (dev cache) │ + │ 3. update-manifest job: │ + │ version = "-" or PR │ + │ commit update-manifest.json only │ + │ on nixos-manifest │ + │ 4. (nixos branch only) build migration tarball, │ + │ upload to GitHub Release │ + └─────────────────────────────────────────┘ +``` + +A device installed from the manifest reports the exact manifest version selected. +There is no one-commit lag and no source-branch stamp commit. + +## Cutting a release + +1. Make sure `source_branch` (usually `main` or `nixos`) is at the commit you want to release. +2. GitHub → Actions → **Release** → Run workflow. +3. Inputs: + - `version`: semver only, no `v` prefix — e.g. `3.0.0` + - `notes`: markdown body for the GitHub Release + - `type`: `stable` or `beta` (beta tags as `vX.Y.Z-beta` and marks the release as prerelease) + - `source_branch`: branch to release from (default `main`) +4. Workflow runs end-to-end (~30–45 min). +5. Verify the GitHub Release has both `pifinder-vX.Y.Z.img.zst` and `pifinder-migration-vX.Y.Z.tar.zst`. +6. If the release should hide older entries, update the manifest generator policy + or prune the manifest branch in a follow-up change. + +## Hotfix release + +Use `source_branch=release/X.Y` (long-lived hotfix branches). The release +workflow builds and tags that source branch, then writes install metadata to +`nixos-manifest`. + +## Files of interest + +| File | Role | +| ------------------------------------- | ------------------------------------------ | +| `.github/scripts/update_manifest.py` | Manifest merge/update helper | +| `update-manifest.json` | Generated JSON on `nixos-manifest` | +| `python/PiFinder/utils.py` | `get_version()` reader | +| `python/PiFinder/ui/software.py` | Manifest-driven channel update UI | +| `nixos/pkgs/pifinder-src.nix` | Copies the source tree into the store path | +| `nixos/services.nix` | Symlinks `/home/pifinder/PiFinder` → store path | +| `nixos/device.nix` | `BUILD_JSON_URL` for nightly channel check | +| `.github/workflows/build.yml` | Dev builds + manifest update | +| `.github/workflows/release.yml` | Manual release dispatcher | diff --git a/nixos/brickbots-attic-setup.md b/nixos/brickbots-attic-setup.md new file mode 100644 index 000000000..a43567345 --- /dev/null +++ b/nixos/brickbots-attic-setup.md @@ -0,0 +1,74 @@ +# Giving brickbots/PiFinder access to the Attic cache + +The NixOS CI builds substitute from the self-hosted Attic cache +`cache.pifinder.eu/pifinder` (ADR 0004). There are two levels of access: + +| Access | Needs a token? | Who | Status | +| ------ | -------------- | --- | ------ | +| **Pull** (download prebuilt paths) | No — public, via the cache's public key | everyone, incl. fork PRs | ✅ already wired in the workflows | +| **Push** (upload build results) | **Yes** — `ATTIC_TOKEN` secret | trusted (non-fork) runs only | ⬇️ optional, set up below | + +**Pull already works with no setup.** The workflows configure the public +substituter directly: + +``` +extra-substituters = https://cache.pifinder.eu/pifinder +extra-trusted-public-keys = pifinder:8UU/O3oLkaJHHUyqEcPGl+9F1m4MqDca39Ewl49jBmE= +``` + +So brickbots PR builds (and the hosted `ubuntu-24.04-arm` runner) download from +the cache without any secret. GitHub never exposes secrets to **fork** PRs, which +is why push is gated and pull must be tokenless. + +You only need the steps below if you want **brickbots' own CI builds** (pushes to +its `main`/branches, or maintainer-triggered runs) to **upload** their results so +the shared cache stays warm. + +## 1. Mint a push token (mrosseel — cache admin) + +On the Attic server (the cache lives in `nixos-config`, +`machines/general-server/attic-service.nix`): + +```bash +# Scope the token to the `pifinder` cache: pull + push, 1-year validity. +atticd-atticadm make-token \ + --sub "brickbots-ci" \ + --validity "1y" \ + --pull "pifinder" \ + --push "pifinder" +``` + +This prints a JWT. Treat it as a secret. Scope it to **only** the `pifinder` +cache (not `pifinder-release`) so a leak can't poison release closures. + +## 2. Add it as a repo secret (brickbots — maintainer) + +In **github.com/brickbots/PiFinder**: + +1. **Settings → Secrets and variables → Actions → New repository secret** +2. Name: `ATTIC_TOKEN` +3. Value: the JWT from step 1 +4. Save. + +(Use an **organization** secret instead if more than one repo needs it.) + +## 3. That's it + +The workflows already do the right thing once the secret exists: + +- **With `ATTIC_TOKEN`** (brickbots' own branch pushes / trusted runs): the + `Attic login for push` step logs in and the `Push to Attic` step uploads. +- **Without it** (fork PRs): those steps no-op; the build still pulls from the + public cache and is verify-only. + +No workflow edits are required on the brickbots side — the logic keys off whether +the secret is present. + +## Security notes + +- The token is exposed only to non-fork runs, so external contributors' fork PRs + can never push, even after this is set up. +- Rotate by minting a new token and updating the secret; revoke the old one on + the Attic server. +- Keep push scoped to `pifinder` (dev cache). Release closures go to + `pifinder-release` via the separate, mrosseel-only release workflow. diff --git a/nixos/device.nix b/nixos/device.nix new file mode 100644 index 000000000..bdf30d539 --- /dev/null +++ b/nixos/device.nix @@ -0,0 +1,323 @@ +{ config, lib, pkgs, ... }: +let + boot-splash = import ./pkgs/boot-splash.nix { inherit pkgs; }; +in { + options.pifinder = { + devMode = lib.mkOption { + type = lib.types.bool; + default = false; + description = "Enable development mode (NFS netboot support, etc.)"; + }; + }; + + config = { + # --------------------------------------------------------------------------- + # Minimal system packages for migration troubleshooting + # --------------------------------------------------------------------------- + environment.systemPackages = with pkgs; [ + # nano over vim: 40MB smaller on a size-critical image (2GB boards must + # hold the whole tarball in RAM during migration) + nano + htop + e2fsprogs + dosfstools + parted + file + curl + ]; + + + # --------------------------------------------------------------------------- + # Binary substituters — Pi downloads pre-built paths, never compiles. + # Two Attic caches on cache.pifinder.eu (NixOS ADR 0001): pifinder-release + # (retained release closures) and pifinder (dev/nightly). The first-boot + # download below resolves its target from the update manifest's best available + # channel (NixOS ADR 0003). + # --------------------------------------------------------------------------- + nix.settings = { + experimental-features = [ "nix-command" "flakes" ]; + substituters = [ + "https://cache.pifinder.eu/pifinder-release" + "https://cache.pifinder.eu/pifinder" + "https://cache.nixos.org" + ]; + trusted-public-keys = [ + # Attic cache signing keys (same values as nixos/services.nix); pifinder + # restored to the original 8UU after the cutover rotation stranded the + # fleet. Real keys — never ship a placeholder; invalid base64 aborts nix. + "pifinder:8UU/O3oLkaJHHUyqEcPGl+9F1m4MqDca39Ewl49jBmE=" + "pifinder-release:WG/Fw1cIX7YpwfWrbWTP5eCzn3bz6AaicW5qKxLKpoM=" + "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" + ]; + }; + + # Don't pull nixpkgs source into closure (~186 MB) + nix.channel.enable = false; + nix.registry = lib.mkForce {}; + nix.nixPath = lib.mkForce []; + + # nixos-rebuild-ng pulls in Python 3.13 (~110 MB) — not needed for migration + system.disableInstallerTools = true; + + # Perl is included by default (~59 MB) — not needed for migration + environment.defaultPackages = lib.mkForce []; + + # Strip NetworkManager VPN plugins (openconnect/stoken/gtk3 deps) + networking.networkmanager.plugins = lib.mkForce []; + + # --------------------------------------------------------------------------- + # SD card optimizations + # --------------------------------------------------------------------------- + boot.loader.generic-extlinux-compatible.configurationLimit = 2; + + nix.gc = { + automatic = true; + dates = "weekly"; + options = "--delete-older-than 3d"; + }; + nix.settings.auto-optimise-store = true; + + boot.tmp.useTmpfs = true; + boot.tmp.tmpfsSize = "200M"; + + services.journald.extraConfig = '' + Storage=volatile + RuntimeMaxUse=50M + ''; + + zramSwap = { + enable = true; + memoryPercent = 50; + }; + + fileSystems."/" = lib.mkDefault { + device = "/dev/disk/by-label/NIXOS_SD"; + fsType = "ext4"; + options = [ "noatime" "nodiratime" ]; + }; + + # --------------------------------------------------------------------------- + # Nix DB registration (first boot after migration) + # --------------------------------------------------------------------------- + systemd.services.nix-path-registration = { + description = "Load Nix store path registration from migration"; + after = [ "local-fs.target" ]; + before = [ "nix-daemon.service" ]; + wantedBy = [ "multi-user.target" ]; + unitConfig.ConditionPathExists = "/nix-path-registration"; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + }; + path = with pkgs; [ nix coreutils ]; + script = '' + nix-store --load-db < /nix-path-registration + rm /nix-path-registration + ''; + }; + + # --------------------------------------------------------------------------- + # First boot: download full PiFinder system from the binary cache and switch + # --------------------------------------------------------------------------- + systemd.services.pifinder-first-boot = { + description = "Download full PiFinder NixOS system from the binary cache"; + # time-sync.target ordering pairs with the explicit clock-wait in the + # script below — the Pi has no RTC, and TLS to the binary cache fails + # while the clock is still in the past. + after = [ "network-online.target" "time-sync.target" "nix-path-registration.service" "nix-daemon.service" ]; + wants = [ "time-sync.target" ]; + requires = [ "network-online.target" ]; + wantedBy = [ "multi-user.target" ]; + # No existence condition: the manifest is the primary source (ADR 0003) and + # needs no local file. The baked first-boot-target, when present, is only + # the offline fallback — the old ConditionPathExists on it silently skipped + # the whole service when the tarball pipeline stopped baking the file. + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + TimeoutStartSec = "30min"; + }; + path = with pkgs; [ nix coreutils systemd curl jq gnugrep ]; + script = '' + set -euo pipefail + + # Real-progress splash on the OLED, fed via a progress file (0-100). + PROGRESS_FILE=/run/pifinder-boot-progress + echo 0 > "$PROGRESS_FILE" + ${boot-splash}/bin/boot-splash --progress "$PROGRESS_FILE" & + SPLASH_PID=$! + trap 'kill $SPLASH_PID 2>/dev/null || true' EXIT + + # Resolve the full system from the update manifest — the same file the + # on-device updater reads (NixOS ADR 0003). Migration rides the newest entry + # in the best available channel: stable, then beta, then the unstable trunk. + # Stable holds only releases, whose closures live in the retained + # pifinder-release cache, so a resolved stable path can't be GC'd out from + # under a published tarball. Falls back to the baked-in target if the + # manifest can't be fetched. + MANIFEST_URL="https://raw.githubusercontent.com/brickbots/PiFinder/nixos-manifest/update-manifest.json" + STORE_PATH="" + if MANIFEST_JSON=$(curl -sf --max-time 15 "$MANIFEST_URL" 2>/dev/null); then + # jq comma-stream encodes the priority order; first available, valid path + # wins. TEMPORARY: the unstable trunk is pinned to source_ref "nixos" + # because the NixOS line still lives on the nixos branch, not main. Drop + # the source_ref guard once nixos becomes the mainline trunk (ADR 0003). + STORE_PATH=$(printf '%s\n' "$MANIFEST_JSON" | jq -r ' + [ ( .channels.stable[]?, + .channels.beta[]?, + (.channels.unstable[]? | select(.kind == "trunk" and .source_ref == "nixos")) ) + | select(.available == true and ((.store_path // "") | startswith("/nix/store/"))) + | .store_path ] | .[0] // empty' 2>/dev/null) + [ -n "$STORE_PATH" ] && echo "Resolved full system from manifest: $STORE_PATH" + fi + if [ -z "$STORE_PATH" ] || [[ "$STORE_PATH" != /nix/store/* ]]; then + echo "Manifest unavailable or empty, falling back to baked-in target" + [ -f /var/lib/pifinder/first-boot-target ] && \ + STORE_PATH=$(cat /var/lib/pifinder/first-boot-target) + fi + if [ -z "$STORE_PATH" ] || [[ "$STORE_PATH" != /nix/store/* ]]; then + echo "ERROR: No valid store path found" + exit 1 + fi + + # The Pi has no RTC: at cold boot the clock starts in the past, so TLS + # validation against the binary cache fails ("certificate is not yet + # valid") and the download aborts. Wait for timesyncd to fix the clock. + echo "Waiting for clock synchronization..." + for _ in $(seq 1 120); do + [ "$(timedatectl show -p NTPSynchronized --value 2>/dev/null)" = yes ] && break + [ -e /run/systemd/timesync/synchronized ] && break + sleep 1 + done + echo "Clock: $(date -u)" + + # First-boot fetches the whole system, so per-path byte sizing would mean + # tens of thousands of cache lookups — too slow. Count the paths to fetch + # (one dry-run, timeout-bounded so it can't hang) and show a path-count + # percentage on the splash. set +e keeps it advisory — never aborts. + echo "Computing download size..." + set +e + TOTAL_PATHS=$(timeout 120 nix-store --realise --dry-run "$STORE_PATH" 2>&1 | grep -c '^ /nix/store/') + [ "$TOTAL_PATHS" -gt 0 ] 2>/dev/null || TOTAL_PATHS=0 + set -e + echo "Downloading full PiFinder system: $STORE_PATH ($TOTAL_PATHS paths)" + + COPIED=0 + nix build "$STORE_PATH" --max-jobs 0 2>&1 | while IFS= read -r line; do + echo "$line" + case "$line" in + *"copying path "*) + COPIED=$((COPIED + 1)) + [ "$TOTAL_PATHS" -gt 0 ] && echo "$((COPIED * 100 / TOTAL_PATHS))" > "$PROGRESS_FILE" + ;; + esac + done + echo 100 > "$PROGRESS_FILE" + + echo "Setting system profile..." + nix-env -p /nix/var/nix/profiles/system --set "$STORE_PATH" + + # Record the device identity: the update UI hides the running build by + # store path (current-build.json), and every later upgrade rewrites this + # file. Label/version/channel come from the manifest entry we resolved; + # a fallback-target install records just the store path. + IDENTITY=$(printf '%s\n' "''${MANIFEST_JSON:-}" | jq -c --arg sp "$STORE_PATH" ' + [ .channels | to_entries[] | .key as $ch | .value[]? + | select(.store_path == $sp) + | {channel: $ch, label: .label, version: .version, store_path: .store_path} ] + | .[0] // empty' 2>/dev/null) + [ -n "$IDENTITY" ] || IDENTITY=$(jq -nc --arg sp "$STORE_PATH" '{store_path: $sp}') + printf '%s\n' "$IDENTITY" > /var/lib/pifinder/current-build.json + + echo "Configuring bootloader..." + "$STORE_PATH/bin/switch-to-configuration" boot + + echo "Removing first-boot trigger..." + rm -f /var/lib/pifinder/first-boot-target + + echo "Cleaning up migration closure..." + nix-env --delete-generations +2 -p /nix/var/nix/profiles/system || true + nix-collect-garbage || true + + echo "Rebooting into full PiFinder system..." + systemctl reboot + ''; + }; + + # --------------------------------------------------------------------------- + # Polkit rules for NetworkManager control + # --------------------------------------------------------------------------- + security.polkit.extraConfig = '' + polkit.addRule(function(action, subject) { + if (subject.user == "pifinder") { + if (action.id.indexOf("org.freedesktop.NetworkManager") == 0) { + return polkit.Result.YES; + } + if (action.id == "org.freedesktop.login1.reboot" || + action.id == "org.freedesktop.login1.reboot-multiple-sessions" || + action.id == "org.freedesktop.login1.power-off" || + action.id == "org.freedesktop.login1.power-off-multiple-sessions") { + return polkit.Result.YES; + } + } + }); + ''; + + # --------------------------------------------------------------------------- + # Sudoers — minimal for migration + # --------------------------------------------------------------------------- + security.sudo.extraRules = [{ + users = [ "pifinder" ]; + commands = [ + { command = "/run/current-system/sw/bin/shutdown -r now"; options = [ "NOPASSWD" ]; } + { command = "/run/current-system/sw/bin/shutdown now"; options = [ "NOPASSWD" ]; } + { command = "/run/current-system/sw/bin/hostname *"; options = [ "NOPASSWD" ]; } + { command = "/run/current-system/sw/bin/avahi-set-host-name *"; options = [ "NOPASSWD" ]; } + { command = "/run/current-system/sw/bin/systemctl restart pifinder-first-boot.service"; options = [ "NOPASSWD" ]; } + { command = "/run/current-system/sw/bin/systemctl restart pifinder*"; options = [ "NOPASSWD" ]; } + { command = "/run/current-system/sw/bin/systemctl status *"; options = [ "NOPASSWD" ]; } + { command = "/run/current-system/sw/bin/journalctl *"; options = [ "NOPASSWD" ]; } + ]; + }]; + + # --------------------------------------------------------------------------- + # Early boot splash + # --------------------------------------------------------------------------- + systemd.services.boot-splash = { + description = "Early boot splash screen"; + wantedBy = [ "sysinit.target" ]; + after = [ "systemd-modules-load.service" ]; + wants = [ "systemd-modules-load.service" ]; + unitConfig.DefaultDependencies = false; + serviceConfig = { + Type = "oneshot"; + ExecStart = pkgs.writeShellScript "boot-splash-wait" '' + for i in $(seq 1 40); do + [ -e /dev/spidev0.0 ] && exec ${boot-splash}/bin/boot-splash --static + sleep 0.25 + done + echo "SPI device never appeared" >&2 + exit 1 + ''; + }; + }; + + # --------------------------------------------------------------------------- + # SSH access + # --------------------------------------------------------------------------- + services.openssh = { + enable = true; + settings = { + PasswordAuthentication = true; + PermitRootLogin = "no"; + }; + }; + + # NetworkManager-wait-online adds ~10s to boot but is needed for + # pifinder-first-boot to have internet. The first-boot script also has + # its own connectivity retry loop as a fallback. + systemd.services.NetworkManager-wait-online.serviceConfig.TimeoutStartSec = "30s"; + + system.stateVersion = "24.11"; + }; # config +} diff --git a/nixos/hardware.nix b/nixos/hardware.nix new file mode 100644 index 000000000..09d2ea8b0 --- /dev/null +++ b/nixos/hardware.nix @@ -0,0 +1,226 @@ +{ config, lib, pkgs, nixos-hardware, pifinderKernel ? null, ... }: +let + cfg = config.pifinder; + + # Camera overlay name mapping. imx462 deliberately uses the imx290 overlay: + # that is the exact configuration PiFinder ships on Raspbian + # (switch_camera.py writes "dtoverlay=imx290,clock-frequency=74250000"), so + # the sony,imx290lqr driver path is field-proven on this sensor. The kernel + # also ships imx462.dtbo (sony,imx462lqr, dedicated init registers) — an + # untested-here alternative. The clock-frequency parameter is the part that + # actually matters; see cameraClockDtbo below. + cameraDriver = { + imx296 = "imx296"; + imx462 = "imx290"; + imx477 = "imx477"; + }.${cfg.cameraType}; + + # Compile DTS text to DTBO + compileOverlay = name: dtsText: pkgs.deviceTree.compileDTS { + name = "${name}-dtbo"; + dtsFile = pkgs.writeText "${name}.dts" dtsText; + }; + + # SPI0 — no nixos-hardware option, use custom overlay + spi0Dtbo = compileOverlay "spi0" '' + /dts-v1/; + /plugin/; + / { compatible = "brcm,bcm2711"; }; + &spi0 { status = "okay"; }; + ''; + + # UART3 for the on-board GPS (published as /dev/gpsuart by udev) + uart3Dtbo = compileOverlay "uart3" '' + /dts-v1/; + /plugin/; + / { compatible = "brcm,bcm2711"; }; + &uart3 { status = "okay"; }; + ''; + + # Peripheral I2C (BNO055 IMU, rev-4 BQ25895 charger) as a bit-banged + # i2c-gpio bus on the standard SDA/SCL pins (GPIO2/GPIO3). The BCM2711 + # hardware I2C block corrupts transfers when a slave stretches the clock + # (a silicon bug; the BNO055 stretches routinely) — the previous + # workaround, running &i2c1 at 10 kHz, only lowered the corruption odds + # while making every IMU transaction ~10x slower. i2c-gpio implements + # clock stretching per spec at ~60-100 kHz effective. &i2c1 is disabled + # explicitly so the hardware block never claims the pins; the Python + # side (PiFinder.i2c_bus.get_i2c) discovers this adapter through sysfs. + i2cGpioDtbo = compileOverlay "i2c-gpio" '' + /dts-v1/; + /plugin/; + / { compatible = "brcm,bcm2711"; }; + &i2c1 { status = "disabled"; }; + &{/} { + i2c_gpio: i2c-gpio { + compatible = "i2c-gpio"; + sda-gpios = <&gpio 2 6>; /* GPIO_OPEN_DRAIN */ + scl-gpios = <&gpio 3 6>; /* GPIO_OPEN_DRAIN */ + i2c-gpio,delay-us = <2>; + #address-cells = <1>; + #size-cells = <0>; + }; + }; + ''; + + # PWM: GPIO 13 (channel 1) keypad backlight + GPIO 12 (channel 0) rev-4 + # buzzer earcons. Both ALT0 (function 4): GPIO12 = PWM0_0, GPIO13 = PWM0_1. + # Muxing GPIO12 unconditionally is safe — rev-3 boards leave it unconnected + # and the sound process only spawns when the rev-4 charger is detected. + pwmDtbo = compileOverlay "pwm" '' + /dts-v1/; + /plugin/; + / { compatible = "brcm,bcm2711"; }; + &gpio { + pwm_pins: pwm_pins { + brcm,pins = <12 13>; + brcm,function = <4 4>; /* ALT0 = PWM0_0, PWM0_1 */ + }; + }; + &pwm { + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&pwm_pins>; + }; + ''; + + # Rev-4 power-off latch (ADR 0007 on main): driving GPIO14 low trips the + # LTC2954 and cuts power. The kernel's gpio-poweroff handler runs strictly + # after filesystems are down, and only on a real power-off (reboot takes a + # different path). Active-low; the board's hardware pull-up on GPIO14 holds + # power on until the handler fires. Deliberately unconditional across + # revisions: on rev-3 GPIO14-low does nothing electrically — the only effect + # is a cosmetic kernel WARN + ~3s wait at halt. + gpioPoweroffDtbo = compileOverlay "gpio-poweroff" '' + /dts-v1/; + /plugin/; + / { compatible = "brcm,bcm2711"; }; + &{/} { + power_ctrl: power_ctrl { + compatible = "gpio-poweroff"; + gpios = <&gpio 14 1>; /* GPIO_ACTIVE_LOW */ + timeout-ms = <3000>; + }; + }; + ''; + + # Camera overlay from kernel's DTB overlays directory + cameraDtbo = "${config.boot.kernelPackages.kernel}/dtbs/overlays/${cameraDriver}.dtbo"; + + # PiFinder's imx462 module has a 74.25 MHz oscillator, but the kernel's + # imx290/imx462 overlays default the xclk to 37.125 MHz. Raspbian fixes this + # with the overlay parameter "clock-frequency=74250000"; fdtoverlay cannot + # apply overlay parameters (__overrides__), so without this the default + # sneaks through and the driver programs INCKSEL/PLL for the wrong xclk — + # the sensor enumerates on I2C but never delivers frames and libcamera + # reports "Camera frontend has timed out" with an empty kernel log. + # Override both places the Raspbian parameter writes: the fixed-clock node + # (the driver's clk_set_rate must match its rate) and the sensor node + # property (the driver selects the INCKSEL register set from it). Must be + # applied after cameraDtbo: &cam_node is defined by the camera overlay and + # resolves from its merged symbols. + cameraClockDtbo = compileOverlay "imx462-xclk" '' + /dts-v1/; + /plugin/; + / { compatible = "brcm,bcm2711"; }; + &cam1_clk { clock-frequency = <74250000>; }; + &cam_node { clock-frequency = <74250000>; }; + ''; +in { + options.pifinder = { + cameraType = lib.mkOption { + type = lib.types.enum [ "imx296" "imx462" "imx477" ]; + default = "imx462"; + description = "Camera sensor type for PiFinder"; + }; + }; + + config = { + # The nixos-hardware Raspberry Pi kernel expression fixes its patch list + # after normal package overrides, so boot.kernelPatches cannot extend it. + boot.kernelPackages = lib.mkForce (pkgs.linuxPackagesFor ( + if pifinderKernel != null then pifinderKernel else + import ./pkgs/pifinder-kernel.nix { inherit pkgs nixos-hardware; } + )); + + # Only include RPi 4B device tree (not CM4 variants) + hardware.deviceTree.filter = "*rpi-4-b.dtb"; + # Explicit DTB name so extlinux uses FDT instead of FDTDIR + # (DTBs are in broadcom/ subdirectory, FDTDIR doesn't descend into it) + hardware.deviceTree.name = "broadcom/bcm2711-rpi-4-b.dtb"; + + # Firmware: the nixos-hardware Pi 4 module enables the full redistributable + # set — linux-firmware alone is ~723MB uncompressed, 40% of the migration + # tarball, for hardware this board doesn't have. The Pi 4 needs only the + # Broadcom wifi/BT blobs (~10MB). Boot firmware (start.elf etc.) is + # separate and unaffected (populateFirmwareCommands). + hardware.enableRedistributableFirmware = lib.mkForce false; + hardware.firmware = [ pkgs.raspberrypiWirelessFirmware ]; + + # I2C enabled (loads i2c-dev module, creates i2c group) + hardware.i2c.enable = true; + # The bit-banged bus driver (DT modalias autoload also works when built + # as a module; listing it here makes the dependency explicit) + boot.kernelModules = [ "i2c-gpio" ]; + + # GPIO14 is the rev-4 power-off kill line (gpio-poweroff overlay above) — + # its default function is UART0 TXD, so nothing may drive serial console + # bytes onto it (ADR 0007). No console= kernel param points there, and this + # keeps a getty from ever claiming the port. + systemd.services."serial-getty@ttyAMA0".enable = false; + + # Apply all DT overlays via fdtoverlay, bypassing NixOS apply_overlays.py + # which rejects RPi camera overlays due to compatible string mismatch + # (overlays declare "brcm,bcm2835" but kernel DTBs use "brcm,bcm2711") + hardware.deviceTree.package = let + kernelDtbs = config.hardware.deviceTree.dtbSource; + in lib.mkForce (pkgs.runCommand "device-tree-with-overlays" { + nativeBuildInputs = [ pkgs.dtc ]; + } '' + mkdir -p $out/broadcom + for dtb in ${kernelDtbs}/broadcom/*rpi-4-b.dtb; do + fdtoverlay -i "$dtb" \ + -o "$out/broadcom/$(basename $dtb)" \ + ${i2cGpioDtbo} ${spi0Dtbo} ${uart3Dtbo} ${pwmDtbo} ${gpioPoweroffDtbo} ${cameraDtbo} \ + ${lib.optionalString (cfg.cameraType == "imx462") cameraClockDtbo} + done + ''); + + # udev rules for hardware access without root + services.udev.extraRules = '' + SUBSYSTEM=="spidev", GROUP="spi", MODE="0660" + SUBSYSTEM=="i2c-dev", GROUP="i2c", MODE="0660" + SUBSYSTEM=="pwm", GROUP="gpio", MODE="0660" + SUBSYSTEM=="gpio", GROUP="gpio", MODE="0660" + KERNEL=="gpiomem", GROUP="gpio", MODE="0660" + # On-board GPS UART (uart3, fe201600 on BCM2711): the kernel's ttyAMA + # numbering is not stable across versions, so match the DT node and + # publish a fixed name for gpsd to open. + SUBSYSTEM=="tty", KERNELS=="fe201600.serial", SYMLINK+="gpsuart", GROUP="dialout", MODE="0660", TAG+="systemd", ENV{SYSTEMD_WANTS}+="gpsd-add-uart.service" + # DMA heap for libcamera/picamera2 (CMA memory allocation) + SUBSYSTEM=="dma_heap", GROUP="video", MODE="0660" + ''; + + # Deterministic root password (sha-512 crypt of "solveit"), enforced on + # every activation — unlike initialPassword, which only applies at account + # creation and drifts if changed at runtime. Test-device convenience; the + # hash lives in the world-readable store, which is fine for a known cred. + users.users.root.hashedPassword = + "$6$caME5a7TbhnPfrV2$sXHx/OuQCaRkjCG/Lba8vxL5R8.SgD72YHKWzHwDVj9CfDgz1xJ766ht0VCB18Q/igzceaoQM8fwgYNj2ygap/"; + users.users.pifinder = { + isNormalUser = true; + # MUST stay initialPassword (not hashedPassword): the web UI changes this + # password at runtime via `sudo chpasswd` (sys_utils.change_password). + # initialPassword applies only at account creation, so that change + # persists; hashedPassword would re-enforce "solveit" on every activation + # and silently revert the user's password on the next upgrade. + initialPassword = "solveit"; + extraGroups = [ "spi" "i2c" "gpio" "dialout" "video" "networkmanager" "systemd-journal" "input" "kmem" ]; + }; + users.groups = { + spi = {}; + i2c = {}; + gpio = {}; + }; + }; +} diff --git a/nixos/networking.nix b/nixos/networking.nix new file mode 100644 index 000000000..8115945bb --- /dev/null +++ b/nixos/networking.nix @@ -0,0 +1,136 @@ +{ config, lib, pkgs, ... }: +{ + networking = { + hostName = "pifinder"; + networkmanager.enable = true; + wireless.enable = false; # NetworkManager handles WiFi + firewall = { + checkReversePath = "loose"; # Allow multi-interface (WiFi + ethernet) on same subnet + allowedUDPPorts = [ 53 67 ]; # DNS + DHCP for AP mode + # Web UI and the LX200 server used by SkySafari/planetarium clients. + allowedTCPPorts = [ 80 4030 ]; + }; + }; + + # Robust time sync for the RTC-less Pi: NTP= servers are always tried (and + # combined with any per-interface/DHCP servers), so a dead DHCP-advertised + # NTP server can't block the clock. FallbackNTP alone is skipped whenever a + # per-interface server is known — too fragile to rely on for first-boot + # migration, which gates the binary-cache fetch on a synchronized clock. + services.timesyncd.servers = [ + "0.pool.ntp.org" + "1.pool.ntp.org" + "2.pool.ntp.org" + "3.pool.ntp.org" + ]; + + # dnsmasq for NetworkManager AP shared mode (DHCP for AP clients) + services.dnsmasq.enable = false; # NM manages its own dnsmasq instance + environment.systemPackages = [ pkgs.dnsmasq ]; + + # Wired ethernet with DHCP (autoconnect) + environment.etc."NetworkManager/system-connections/Wired.nmconnection" = { + text = '' + [connection] + id=Wired + type=ethernet + autoconnect=true + + [ipv4] + method=auto + + [ipv6] + method=auto + ''; + mode = "0600"; + }; + + # Pre-configured AP profile (activated on demand via nmcli) + environment.etc."NetworkManager/system-connections/PiFinder-AP.nmconnection" = { + text = '' + [connection] + id=PiFinder-AP + type=wifi + # Never self-start: NetworkManager would activate the AP instantly at + # boot (own radio, no scan needed) and win the race against a client + # network that still has to scan + associate, then stay on it. The AP is + # brought up only on demand by pifinder-wifi-fallback below. + autoconnect=false + + [wifi] + mode=ap + ssid=PiFinderAP + band=bg + channel=7 + + [ipv4] + method=shared + address1=10.10.10.1/24 + + [ipv6] + method=disabled + ''; + mode = "0600"; + }; + + # The PiFinder-AP profile has autoconnect disabled, so NetworkManager joins + # a known client network when one is reachable and never self-starts the AP. + # AP-as-fallback policy (wired > wifi client > AP) is enforced by + # pifinder-net-policy in services.nix (full system) or by + # wifi-fallback-minimal.nix (migration image, no Python env) — this shared + # module deliberately carries no fallback service so the two can differ. + + # --------------------------------------------------------------------------- + # Avahi/mDNS for hostname discovery (.local). It lives in this shared + # networking module on purpose: BOTH the running system (commonModules) and + # the migration build (migrationModules) import networking.nix, whereas + # services.nix and device.nix are each only in one of those — so avahi must + # not live in either alone or one system ends up with no mDNS at all. + # --------------------------------------------------------------------------- + services.avahi = { + enable = true; + # PiFinder's application listeners (including LX200) are IPv4-only and AP + # mode disables IPv6. Do not advertise an unusable link-local AAAA address + # ahead of the working IPv4 address to mobile clients. + ipv6 = false; + nssmdns4 = true; + publish = { + enable = true; + addresses = true; + domain = true; + workstation = true; + }; + }; + + systemd.services.avahi-daemon.serviceConfig.ExecStartPre = + "${pkgs.coreutils}/bin/rm -f /run/avahi-daemon/pid"; + + # Apply user-chosen hostname from PiFinder_data (survives NixOS rebuilds), + # overriding networking.hostName above. + systemd.services.pifinder-hostname = { + description = "Apply PiFinder custom hostname"; + after = [ "avahi-daemon.service" ]; + wants = [ "avahi-daemon.service" ]; + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + ExecStart = pkgs.writeShellScript "apply-hostname" '' + f=/home/pifinder/PiFinder_data/hostname + [ -f "$f" ] || exit 0 + name=$(cat "$f") + [ -n "$name" ] || exit 0 + /run/current-system/sw/bin/hostname "$name" + /run/current-system/sw/bin/avahi-set-host-name "$name" || \ + /run/current-system/sw/bin/systemctl restart avahi-daemon.service + ''; + }; + }; + + # Avahi watches interface/address changes itself, so it must remain running + # while NetworkManager brings links up and down. Restarting it from a + # dispatcher briefly withdraws the .local record and also resets a custom + # runtime hostname to the static value above. NetworkManager must not manage + # the hostname either, or it undoes pifinder-hostname's persisted value. + networking.networkmanager.settings.main."hostname-mode" = "none"; +} diff --git a/nixos/patches/imx290-optical-black-stream.patch b/nixos/patches/imx290-optical-black-stream.patch new file mode 100644 index 000000000..10f3e815a --- /dev/null +++ b/nixos/patches/imx290-optical-black-stream.patch @@ -0,0 +1,136 @@ +--- a/drivers/media/i2c/imx290.c ++++ b/drivers/media/i2c/imx290.c +@@ -163,6 +163,13 @@ + + /* Equivalent value for 16bpp */ + #define IMX290_BLACK_LEVEL_DEFAULT 3840 ++#define IMX290_NUM_OPB_LINES 10 ++ ++enum imx290_pad { ++ IMX290_IMAGE_PAD, ++ IMX290_METADATA_PAD, ++ IMX290_NUM_PADS, ++}; + + #define IMX290_NUM_SUPPLIES 3 + +@@ -245,7 +252,7 @@ + const struct imx290_model_info *model; + + struct v4l2_subdev sd; +- struct media_pad pad; ++ struct media_pad pads[IMX290_NUM_PADS]; + + const struct imx290_mode *current_mode; + +@@ -1132,6 +1139,16 @@ + { + const struct imx290 *imx290 = to_imx290(sd); + ++ if (code->pad >= IMX290_NUM_PADS) ++ return -EINVAL; ++ ++ if (code->pad == IMX290_METADATA_PAD) { ++ if (code->index) ++ return -EINVAL; ++ code->code = MEDIA_BUS_FMT_SENSOR_DATA; ++ return 0; ++ } ++ + if (code->index >= ARRAY_SIZE(imx290_formats)) + return -EINVAL; + +@@ -1147,6 +1164,25 @@ + const struct imx290 *imx290 = to_imx290(sd); + const struct imx290_mode *imx290_modes = imx290_modes_ptr(imx290); + ++ if (fse->pad >= IMX290_NUM_PADS) ++ return -EINVAL; ++ ++ if (fse->pad == IMX290_METADATA_PAD) { ++ const struct v4l2_mbus_framefmt *format; ++ const struct imx290_format_info *info; ++ ++ if (fse->code != MEDIA_BUS_FMT_SENSOR_DATA || fse->index) ++ return -EINVAL; ++ ++ format = v4l2_subdev_state_get_format(sd_state, IMX290_IMAGE_PAD); ++ info = imx290_format_info(imx290, format->code); ++ fse->min_width = format->width * (info ? info->bpp : 12) / 8; ++ fse->max_width = fse->min_width; ++ fse->min_height = IMX290_NUM_OPB_LINES; ++ fse->max_height = fse->min_height; ++ return 0; ++ } ++ + if (!imx290_format_info(imx290, fse->code)) + return -EINVAL; + +@@ -1168,6 +1198,22 @@ + struct imx290 *imx290 = to_imx290(sd); + const struct imx290_mode *mode; + struct v4l2_mbus_framefmt *format; ++ const struct imx290_format_info *info; ++ ++ if (fmt->pad >= IMX290_NUM_PADS) ++ return -EINVAL; ++ ++ if (fmt->pad == IMX290_METADATA_PAD) { ++ format = v4l2_subdev_state_get_format(sd_state, IMX290_IMAGE_PAD); ++ info = imx290_format_info(imx290, format->code); ++ fmt->format.width = format->width * (info ? info->bpp : 12) / 8; ++ fmt->format.height = IMX290_NUM_OPB_LINES; ++ fmt->format.code = MEDIA_BUS_FMT_SENSOR_DATA; ++ fmt->format.field = V4L2_FIELD_NONE; ++ *v4l2_subdev_state_get_format(sd_state, IMX290_METADATA_PAD) = ++ fmt->format; ++ return 0; ++ } + + mode = v4l2_find_nearest_size(imx290_modes_ptr(imx290), + imx290_modes_num(imx290), width, height, +@@ -1185,7 +1231,7 @@ + fmt->format.quantization = V4L2_QUANTIZATION_FULL_RANGE; + fmt->format.xfer_func = V4L2_XFER_FUNC_NONE; + +- format = v4l2_subdev_state_get_format(sd_state, 0); ++ format = v4l2_subdev_state_get_format(sd_state, IMX290_IMAGE_PAD); + + if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE) { + imx290->current_mode = mode; +@@ -1196,6 +1242,13 @@ + + *format = fmt->format; + ++ format = v4l2_subdev_state_get_format(sd_state, IMX290_METADATA_PAD); ++ info = imx290_format_info(imx290, fmt->format.code); ++ format->width = fmt->format.width * info->bpp / 8; ++ format->height = IMX290_NUM_OPB_LINES; ++ format->code = MEDIA_BUS_FMT_SENSOR_DATA; ++ format->field = V4L2_FIELD_NONE; ++ + return 0; + } + +@@ -1260,6 +1313,8 @@ + }; + + imx290_set_fmt(subdev, sd_state, &fmt); ++ fmt.pad = IMX290_METADATA_PAD; ++ imx290_set_fmt(subdev, sd_state, &fmt); + + return 0; + } +@@ -1311,8 +1366,10 @@ + imx290->sd.entity.ops = &imx290_subdev_entity_ops; + imx290->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; + +- imx290->pad.flags = MEDIA_PAD_FL_SOURCE; +- ret = media_entity_pads_init(&imx290->sd.entity, 1, &imx290->pad); ++ imx290->pads[IMX290_IMAGE_PAD].flags = MEDIA_PAD_FL_SOURCE; ++ imx290->pads[IMX290_METADATA_PAD].flags = MEDIA_PAD_FL_SOURCE; ++ ret = media_entity_pads_init(&imx290->sd.entity, IMX290_NUM_PADS, ++ imx290->pads); + if (ret < 0) { + dev_err(imx290->dev, "Could not register media entity\n"); + return ret; diff --git a/nixos/patches/libcamera-imx290-optical-black.patch b/nixos/patches/libcamera-imx290-optical-black.patch new file mode 100644 index 000000000..140ee9d3f --- /dev/null +++ b/nixos/patches/libcamera-imx290-optical-black.patch @@ -0,0 +1,136 @@ +--- a/src/ipa/rpi/cam_helper/cam_helper_imx290.cpp ++++ b/src/ipa/rpi/cam_helper/cam_helper_imx290.cpp +@@ -5,9 +5,12 @@ + * camera helper for imx290 sensor + */ + ++#include ++#include + #include + + #include "cam_helper.h" ++#include "controller/optical_black_status.h" + + using namespace RPiController; + +@@ -17,6 +20,9 @@ + CamHelperImx290(); + uint32_t gainCode(double gain) const override; + double gain(uint32_t gainCode) const override; ++ bool sensorEmbeddedDataPresent() const override; ++ void prepare(libcamera::Span buffer, ++ Metadata &metadata) override; + unsigned int hideFramesStartup() const override; + unsigned int hideFramesModeSwitch() const override; + +@@ -44,6 +50,72 @@ + return std::pow(10, 0.015 * gainCode); + } + ++bool CamHelperImx290::sensorEmbeddedDataPresent() const ++{ ++ return true; ++} ++ ++void CamHelperImx290::prepare(libcamera::Span buffer, ++ Metadata &metadata) ++{ ++ std::array histogram{}; ++ size_t count = 0; ++ const unsigned int bits = mode_.bitdepth; ++ const size_t expected = mode_.width * bits / 8 * 10; ++ const size_t size = buffer.size() < expected ? buffer.size() : expected; ++ ++ if (bits == 12) { ++ for (size_t i = 0; i + 2 < size; i += 3) { ++ histogram[(buffer[i] << 4) | (buffer[i + 2] & 0x0f)]++; ++ histogram[(buffer[i + 1] << 4) | (buffer[i + 2] >> 4)]++; ++ count += 2; ++ } ++ } else if (bits == 10) { ++ for (size_t i = 0; i + 4 < size; i += 5) { ++ histogram[(buffer[i] << 2) | (buffer[i + 4] & 0x03)]++; ++ histogram[(buffer[i + 1] << 2) | ((buffer[i + 4] >> 2) & 0x03)]++; ++ histogram[(buffer[i + 2] << 2) | ((buffer[i + 4] >> 4) & 0x03)]++; ++ histogram[(buffer[i + 3] << 2) | (buffer[i + 4] >> 6)]++; ++ count += 4; ++ } ++ } ++ ++ if (!count) ++ return; ++ ++ /* ++ * A raw-code median is quantised to a whole ADU, hiding the sub-ADU ++ * exposure and temperature signal available from thousands of shielded ++ * pixels. Average the central 90% of the OB distribution. Percentile ++ * trimming adapts to gain-dependent read-noise width while rejecting hot ++ * and cold tails. SensorBlackLevels' 16-bit scale preserves 1/16 ADU for ++ * RAW12. ++ */ ++ const size_t trim = count / 20; ++ const size_t target = count - 2 * trim; ++ size_t skipped = 0; ++ size_t kept = 0; ++ uint64_t sum = 0; ++ for (unsigned int value = 0; value < histogram.size() && kept < target; ++ value++) { ++ size_t bin = histogram[value]; ++ const size_t drop = std::min(bin, trim - skipped); ++ bin -= drop; ++ skipped += drop; ++ const size_t take = std::min(bin, target - kept); ++ sum += static_cast(value) * take; ++ kept += take; ++ } ++ if (!kept) ++ return; ++ const double mean = static_cast(sum) / kept; ++ const uint16_t level = std::lround(mean * (1 << (16 - bits))); ++ if (level < 1024 || level > 16384) ++ return; ++ ++ metadata.set("optical_black.status", OpticalBlackStatus{ level }); ++} ++ + unsigned int CamHelperImx290::hideFramesStartup() const + { + /* On startup, we seem to get 1 bad frame. */ +--- a/src/ipa/rpi/common/ipa_base.cpp ++++ b/src/ipa/rpi/common/ipa_base.cpp +@@ -27,6 +27,7 @@ + #include "controller/denoise_algorithm.h" + #include "controller/hdr_algorithm.h" + #include "controller/lux_status.h" ++#include "controller/optical_black_status.h" + #include "controller/sharpen_algorithm.h" + #include "controller/statistics.h" + +@@ -1547,7 +1548,15 @@ + } + + BlackLevelStatus *blackLevelStatus = rpiMetadata.getLocked("black_level.status"); +- if (blackLevelStatus) ++ OpticalBlackStatus *opticalBlackStatus = ++ rpiMetadata.getLocked("optical_black.status"); ++ if (opticalBlackStatus) ++ libcameraMetadata_.set(controls::SensorBlackLevels, ++ { static_cast(opticalBlackStatus->level), ++ static_cast(opticalBlackStatus->level), ++ static_cast(opticalBlackStatus->level), ++ static_cast(opticalBlackStatus->level + 1) }); ++ else if (blackLevelStatus) + libcameraMetadata_.set(controls::SensorBlackLevels, + { static_cast(blackLevelStatus->blackLevelR), + static_cast(blackLevelStatus->blackLevelG), +--- /dev/null ++++ b/src/ipa/rpi/controller/optical_black_status.h +@@ -0,0 +1,8 @@ ++/* SPDX-License-Identifier: BSD-2-Clause */ ++#pragma once ++ ++#include ++ ++struct OpticalBlackStatus { ++ uint16_t level; ++}; diff --git a/nixos/pkgs/boot-splash.c b/nixos/pkgs/boot-splash.c new file mode 100644 index 000000000..045d64b6b --- /dev/null +++ b/nixos/pkgs/boot-splash.c @@ -0,0 +1,441 @@ +/* + * boot-splash - Early boot splash for PiFinder + * + * Displays welcome image with Knight Rider animation until stopped. + * Designed for NixOS early boot (before Python starts). + * + * Hardware: SPI0.0, DC=GPIO24, RST=GPIO25, 128x128 SSD1351 OLED + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define WIDTH 128 +#define HEIGHT 128 +#define SPI_DEVICE "/dev/spidev0.0" +#define SPI_SPEED 40000000 +#define GPIO_DC 24 +#define GPIO_RST 25 + +/* RGB565 colors (display interprets as RGB despite BGR setting) */ +#define COL_BLACK 0x0000 +#define COL_RED 0xF800 +#define COL_DKRED 0x3800 /* dim red — unfilled progress track */ + +#define PROGRESS_FILE_DEFAULT "/run/pifinder-boot-progress" + +/* Include generated image data */ +#include "welcome_image.h" + +static int spi_fd = -1; +static int gpio_fd = -1; +static struct gpio_v2_line_request dc_req; +static struct gpio_v2_line_request rst_req; +static uint16_t framebuf[WIDTH * HEIGHT]; +static volatile int running = 1; + +static void signal_handler(int sig) { + (void)sig; + running = 0; +} + +static void msleep(int ms) { + struct timespec ts = { .tv_sec = ms / 1000, .tv_nsec = (ms % 1000) * 1000000L }; + nanosleep(&ts, NULL); +} + +static int gpio_request_line(int chip_fd, int pin, struct gpio_v2_line_request *req) { + struct gpio_v2_line_request r = {0}; + r.offsets[0] = pin; + r.num_lines = 1; + r.config.flags = GPIO_V2_LINE_FLAG_OUTPUT; + snprintf(r.consumer, sizeof(r.consumer), "boot-splash"); + + if (ioctl(chip_fd, GPIO_V2_GET_LINE_IOCTL, &r) < 0) { + perror("GPIO_V2_GET_LINE_IOCTL"); + return -1; + } + *req = r; + return 0; +} + +static void gpio_set(struct gpio_v2_line_request *req, int value) { + struct gpio_v2_line_values vals = {0}; + vals.bits = value ? 1 : 0; + vals.mask = 1; + ioctl(req->fd, GPIO_V2_LINE_SET_VALUES_IOCTL, &vals); +} + +static void spi_write(const uint8_t *data, size_t len) { + const size_t chunk_size = 4096; + while (len > 0) { + size_t this_len = len > chunk_size ? chunk_size : len; + struct spi_ioc_transfer tr = {0}; + tr.tx_buf = (unsigned long)data; + tr.len = this_len; + tr.speed_hz = SPI_SPEED; + tr.bits_per_word = 8; + ioctl(spi_fd, SPI_IOC_MESSAGE(1), &tr); + data += this_len; + len -= this_len; + } +} + +static void ssd1351_cmd(uint8_t cmd) { + gpio_set(&dc_req, 0); + spi_write(&cmd, 1); +} + +static void ssd1351_data(const uint8_t *data, size_t len) { + gpio_set(&dc_req, 1); + spi_write(data, len); +} + +static void ssd1351_init(void) { + uint8_t d; + + /* Hardware reset */ + gpio_set(&rst_req, 1); + msleep(10); + gpio_set(&rst_req, 0); + msleep(10); + gpio_set(&rst_req, 1); + msleep(10); + + ssd1351_cmd(0xFD); d = 0x12; ssd1351_data(&d, 1); /* Unlock */ + ssd1351_cmd(0xFD); d = 0xB1; ssd1351_data(&d, 1); /* Unlock commands */ + ssd1351_cmd(0xAE); /* Display off */ + ssd1351_cmd(0xB3); d = 0xF1; ssd1351_data(&d, 1); /* Clock divider */ + ssd1351_cmd(0xCA); d = 0x7F; ssd1351_data(&d, 1); /* Mux ratio */ + + uint8_t col[2] = {0x00, 0x7F}; + ssd1351_cmd(0x15); ssd1351_data(col, 2); /* Column address */ + uint8_t row[2] = {0x00, 0x7F}; + ssd1351_cmd(0x75); ssd1351_data(row, 2); /* Row address */ + + ssd1351_cmd(0xA0); d = 0x74; ssd1351_data(&d, 1); /* BGR, 65k color */ + ssd1351_cmd(0xA1); d = 0x00; ssd1351_data(&d, 1); /* Start line */ + ssd1351_cmd(0xA2); d = 0x00; ssd1351_data(&d, 1); /* Display offset */ + ssd1351_cmd(0xB5); d = 0x00; ssd1351_data(&d, 1); /* GPIO */ + ssd1351_cmd(0xAB); d = 0x01; ssd1351_data(&d, 1); /* Function select */ + ssd1351_cmd(0xB1); d = 0x32; ssd1351_data(&d, 1); /* Precharge */ + + uint8_t vsl[3] = {0xA0, 0xB5, 0x55}; + ssd1351_cmd(0xB4); ssd1351_data(vsl, 3); /* VSL */ + + ssd1351_cmd(0xBE); d = 0x05; ssd1351_data(&d, 1); /* VCOMH */ + ssd1351_cmd(0xC7); d = 0x0F; ssd1351_data(&d, 1); /* Master contrast */ + ssd1351_cmd(0xB6); d = 0x01; ssd1351_data(&d, 1); /* Precharge2 */ + ssd1351_cmd(0xA6); /* Normal display */ + + uint8_t contrast[3] = {0xFF, 0xFF, 0xFF}; + ssd1351_cmd(0xC1); ssd1351_data(contrast, 3); /* Contrast */ +} + +static void ssd1351_flush(void) { + uint8_t col[2] = {0x00, 0x7F}; + ssd1351_cmd(0x15); ssd1351_data(col, 2); + uint8_t row[2] = {0x00, 0x7F}; + ssd1351_cmd(0x75); ssd1351_data(row, 2); + ssd1351_cmd(0x5C); /* Write RAM */ + + uint8_t buf[WIDTH * HEIGHT * 2]; + for (int i = 0; i < WIDTH * HEIGHT; i++) { + buf[i * 2] = framebuf[i] >> 8; + buf[i * 2 + 1] = framebuf[i] & 0xFF; + } + ssd1351_data(buf, sizeof(buf)); +} + +static void draw_scanner(int pos, int scanner_width) { + /* Copy welcome image to framebuffer */ + memcpy(framebuf, welcome_image, sizeof(framebuf)); + + /* Draw Knight Rider scanner at bottom (last 4 rows) */ + int y_start = HEIGHT - 4; + int center = pos; + + for (int x = 0; x < WIDTH; x++) { + int dist = abs(x - center); + uint16_t color = COL_BLACK; + + if (dist < scanner_width) { + /* Gradient: brighter at center */ + int intensity = 31 - (dist * 31 / scanner_width); + if (intensity < 8) intensity = 8; /* Minimum brightness */ + /* RGB565: RRRRRGGGGGGBBBBB - red is high 5 bits */ + color = ((uint16_t)intensity & 0x1F) << 11; + } + + for (int y = y_start; y < HEIGHT; y++) { + framebuf[y * WIDTH + x] = color; + } + } + + ssd1351_flush(); +} + +/* Read a 0-100 percentage from a file. Returns -1 if missing/unparseable. */ +static int read_progress(const char *path) { + FILE *f = fopen(path, "r"); + if (!f) return -1; + int pct = -1; + if (fscanf(f, "%d", &pct) != 1) pct = -1; + fclose(f); + if (pct < 0) return -1; + if (pct > 100) pct = 100; + return pct; +} + +static void draw_progress(int pct) { + /* Copy welcome image to framebuffer */ + memcpy(framebuf, welcome_image, sizeof(framebuf)); + + /* Progress bar across the bottom 4 rows, filling left-to-right. + * Filled portion bright red, remaining track dim red. */ + int y_start = HEIGHT - 4; + int fill = pct * WIDTH / 100; + + for (int x = 0; x < WIDTH; x++) { + uint16_t color = (x < fill) ? COL_RED : COL_DKRED; + for (int y = y_start; y < HEIGHT; y++) { + framebuf[y * WIDTH + x] = color; + } + } + + ssd1351_flush(); +} + +/* Classic 5x7 bitmap font, A-Z + space + '!'. Each glyph is 5 column bytes, + * bit 0 = top row. Enough for the watchdog's failure screen; night-vision red + * like everything else on this display. */ +static const uint8_t font5x7[28][5] = { + {0x7E, 0x11, 0x11, 0x11, 0x7E}, /* A */ + {0x7F, 0x49, 0x49, 0x49, 0x36}, /* B */ + {0x3E, 0x41, 0x41, 0x41, 0x22}, /* C */ + {0x7F, 0x41, 0x41, 0x22, 0x1C}, /* D */ + {0x7F, 0x49, 0x49, 0x49, 0x41}, /* E */ + {0x7F, 0x09, 0x09, 0x09, 0x01}, /* F */ + {0x3E, 0x41, 0x49, 0x49, 0x7A}, /* G */ + {0x7F, 0x08, 0x08, 0x08, 0x7F}, /* H */ + {0x00, 0x41, 0x7F, 0x41, 0x00}, /* I */ + {0x20, 0x40, 0x41, 0x3F, 0x01}, /* J */ + {0x7F, 0x08, 0x14, 0x22, 0x41}, /* K */ + {0x7F, 0x40, 0x40, 0x40, 0x40}, /* L */ + {0x7F, 0x02, 0x0C, 0x02, 0x7F}, /* M */ + {0x7F, 0x04, 0x08, 0x10, 0x7F}, /* N */ + {0x3E, 0x41, 0x41, 0x41, 0x3E}, /* O */ + {0x7F, 0x09, 0x09, 0x09, 0x06}, /* P */ + {0x3E, 0x41, 0x51, 0x21, 0x5E}, /* Q */ + {0x7F, 0x09, 0x19, 0x29, 0x46}, /* R */ + {0x46, 0x49, 0x49, 0x49, 0x31}, /* S */ + {0x01, 0x01, 0x7F, 0x01, 0x01}, /* T */ + {0x3F, 0x40, 0x40, 0x40, 0x3F}, /* U */ + {0x1F, 0x20, 0x40, 0x20, 0x1F}, /* V */ + {0x3F, 0x40, 0x38, 0x40, 0x3F}, /* W */ + {0x63, 0x14, 0x08, 0x14, 0x63}, /* X */ + {0x07, 0x08, 0x70, 0x08, 0x07}, /* Y */ + {0x61, 0x51, 0x49, 0x45, 0x43}, /* Z */ + {0x00, 0x00, 0x00, 0x00, 0x00}, /* space */ + {0x00, 0x00, 0x5F, 0x00, 0x00}, /* ! */ +}; + +static const uint8_t *glyph_for(char c) { + if (c >= 'a' && c <= 'z') c -= 32; + if (c >= 'A' && c <= 'Z') return font5x7[c - 'A']; + if (c == '!') return font5x7[27]; + return font5x7[26]; /* everything else renders as space */ +} + +static void draw_text_centered(int y, const char *s, int scale, uint16_t color) { + int len = (int)strlen(s); + int char_w = 6 * scale; /* 5 columns + 1 spacing */ + int x0 = (WIDTH - len * char_w) / 2; + if (x0 < 0) x0 = 0; + + for (int i = 0; i < len; i++) { + const uint8_t *g = glyph_for(s[i]); + for (int col = 0; col < 5; col++) { + for (int row = 0; row < 7; row++) { + if (!(g[col] >> row & 1)) + continue; + for (int sy = 0; sy < scale; sy++) { + for (int sx = 0; sx < scale; sx++) { + int px = x0 + i * char_w + col * scale + sx; + int py = y + row * scale + sy; + if (px >= 0 && px < WIDTH && py >= 0 && py < HEIGHT) + framebuf[py * WIDTH + px] = color; + } + } + } + } + } +} + +/* Generic message screen: centered lines on black, night-vision red. Lines + * short enough for the big font are drawn at 2x, longer ones at 1x. Used by + * pifinder-watchdog for the update-failure screen; usable by any boot-time + * service that needs to talk to the operator without the app running. */ +static void draw_message(char *const lines[], int nlines) { + memset(framebuf, 0, sizeof(framebuf)); + + /* Pick a scale per line and total the height (7*scale + 5px gap each). */ + int scales[16]; + int total_h = 0; + if (nlines > 16) nlines = 16; + for (int i = 0; i < nlines; i++) { + scales[i] = ((int)strlen(lines[i]) * 12 <= WIDTH) ? 2 : 1; + total_h += 7 * scales[i] + 5; + } + + int y = (HEIGHT - total_h) / 2; + if (y < 0) y = 0; + for (int i = 0; i < nlines; i++) { + draw_text_centered(y, lines[i], scales[i], COL_RED); + y += 7 * scales[i] + 5; + } + ssd1351_flush(); +} + +static int hw_init(void) { + spi_fd = open(SPI_DEVICE, O_RDWR); + if (spi_fd < 0) { + perror("open spi"); + return -1; + } + + uint8_t mode = SPI_MODE_0; + uint8_t bits = 8; + uint32_t speed = SPI_SPEED; + ioctl(spi_fd, SPI_IOC_WR_MODE, &mode); + ioctl(spi_fd, SPI_IOC_WR_BITS_PER_WORD, &bits); + ioctl(spi_fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed); + + gpio_fd = open("/dev/gpiochip0", O_RDWR); + if (gpio_fd < 0) { + perror("open gpiochip0"); + return -1; + } + + if (gpio_request_line(gpio_fd, GPIO_DC, &dc_req) < 0) + return -1; + if (gpio_request_line(gpio_fd, GPIO_RST, &rst_req) < 0) + return -1; + + ssd1351_init(); + return 0; +} + +static void hw_cleanup(void) { + if (dc_req.fd > 0) close(dc_req.fd); + if (rst_req.fd > 0) close(rst_req.fd); + if (gpio_fd >= 0) close(gpio_fd); + if (spi_fd >= 0) close(spi_fd); +} + +static void show_static_image(void) { + memcpy(framebuf, welcome_image, sizeof(framebuf)); + ssd1351_flush(); +} + +int main(int argc, char *argv[]) { + int static_mode = 0; + int progress_mode = 0; + const char *progress_path = PROGRESS_FILE_DEFAULT; + char **message_lines = NULL; + int message_nlines = 0; + + for (int i = 1; i < argc; i++) { + if (strcmp(argv[i], "--static") == 0) { + static_mode = 1; + } else if (strcmp(argv[i], "--progress") == 0) { + progress_mode = 1; + /* Optional next arg overrides the progress file path */ + if (i + 1 < argc && argv[i + 1][0] != '-') { + progress_path = argv[++i]; + } + } else if (strcmp(argv[i], "--message") == 0) { + /* All remaining args are message lines */ + message_lines = &argv[i + 1]; + message_nlines = argc - i - 1; + break; + } + } + + signal(SIGTERM, signal_handler); + signal(SIGINT, signal_handler); + + if (hw_init() < 0) { + fprintf(stderr, "Hardware init failed\n"); + hw_cleanup(); + return 1; + } + + /* Turn on display */ + ssd1351_cmd(0xAF); + + if (static_mode) { + /* Static mode: show image once and exit */ + show_static_image(); + hw_cleanup(); + return 0; + } + + if (message_nlines > 0) { + /* Message mode: render the lines once and exit, leaving them shown */ + draw_message(message_lines, message_nlines); + hw_cleanup(); + return 0; + } + + if (progress_mode) { + /* Progress mode: render a real bar from the progress file until 100% + * or until signalled. Only flush when the value changes. */ + int last = -1; + while (running) { + int pct = read_progress(progress_path); + if (pct < 0) pct = 0; + if (pct != last) { + draw_progress(pct); + last = pct; + } + if (pct >= 100) break; + msleep(100); + } + hw_cleanup(); + return 0; + } + + /* Animation mode: Knight Rider scanner */ + int pos = 0; + int dir = 1; + int scanner_width = 20; + + while (running) { + draw_scanner(pos, scanner_width); + + pos += dir * 4; /* Speed */ + if (pos >= WIDTH - scanner_width/2) { + pos = WIDTH - scanner_width/2; + dir = -1; + } else if (pos <= scanner_width/2) { + pos = scanner_width/2; + dir = 1; + } + + msleep(30); /* ~33 FPS */ + } + + hw_cleanup(); + return 0; +} diff --git a/nixos/pkgs/boot-splash.nix b/nixos/pkgs/boot-splash.nix new file mode 100644 index 000000000..9dfad935e --- /dev/null +++ b/nixos/pkgs/boot-splash.nix @@ -0,0 +1,24 @@ +{ pkgs }: + +pkgs.stdenv.mkDerivation { + pname = "boot-splash"; + version = "0.1.0"; + + src = ./.; + + buildInputs = [ pkgs.linuxHeaders ]; + + buildPhase = '' + $CC -O2 -Wall -o boot-splash boot-splash.c + ''; + + installPhase = '' + mkdir -p $out/bin + cp boot-splash $out/bin/ + ''; + + meta = { + description = "Early boot splash for PiFinder OLED display"; + platforms = [ "aarch64-linux" ]; + }; +} diff --git a/nixos/pkgs/cedar-detect-Cargo.lock b/nixos/pkgs/cedar-detect-Cargo.lock new file mode 100644 index 000000000..e5bb4b5eb --- /dev/null +++ b/nixos/pkgs/cedar-detect-Cargo.lock @@ -0,0 +1,2633 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ab_glyph" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" + +[[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 = "aligned" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" +dependencies = [ + "as-slice", +] + +[[package]] +name = "aligned-vec" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" +dependencies = [ + "equator", +] + +[[package]] +name = "anstream" +version = "0.6.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "anyhow" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" + +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" + +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "as-slice" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[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", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "av-scenechange" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" +dependencies = [ + "aligned", + "anyhow", + "arg_enum_proc_macro", + "arrayvec", + "log", + "num-rational", + "num-traits", + "pastey", + "rayon", + "thiserror", + "v_frame", + "y4m", +] + +[[package]] +name = "av1-grain" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "375082f007bd67184fb9c0374614b29f9aaa604ec301635f72338bb65386a53d" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "axum" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +dependencies = [ + "async-trait", + "axum-core", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "bit_field" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" + +[[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" + +[[package]] +name = "bitstream-io" +version = "4.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60d4bd9d1db2c6bdf285e223a7fa369d5ce98ec767dec949c6ca62863ce61757" +dependencies = [ + "core2", +] + +[[package]] +name = "built" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64" + +[[package]] +name = "bumpalo" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" + +[[package]] +name = "cc" +version = "1.2.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cedar_detect" +version = "0.8.0" +dependencies = [ + "approx", + "clap", + "env_logger", + "image", + "imageproc", + "libc", + "log", + "prctl", + "prost", + "prost-build", + "prost-types", + "tokio", + "tonic", + "tonic-build", + "tonic-web", +] + +[[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 = "clap" +version = "4.5.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63be97961acde393029492ce0be7a1af7e323e6bae9511ebfac33751be5e6806" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f13174bda5dfd69d7e947827e5af4b0f2f94a4a3ee92912fba07a66150f21e2" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + +[[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-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +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 = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "env_logger" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "equator" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" +dependencies = [ + "equator-macro", +] + +[[package]] +name = "equator-macro" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[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 = "exr" +version = "1.74.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide", + "rayon-core", + "smallvec", + "zune-inflate", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fax" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab" +dependencies = [ + "fax_derive", +] + +[[package]] +name = "fax_derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +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 = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[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-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-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[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 = "getrandom" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", + "wasip3", +] + +[[package]] +name = "gif" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5df2ba84018d80c213569363bdcd0c64e6933c67fe4c1d60ecf822971a3c35e" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "h2" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 2.13.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[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 = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "http-range-header" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "humantime" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" + +[[package]] +name = "hyper" +version = "0.14.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.5.10", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "image" +version = "0.25.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a" +dependencies = [ + "bytemuck", + "byteorder-lite", + "color_quant", + "exr", + "gif", + "image-webp", + "moxcms", + "num-traits", + "png", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core 0.5.1", + "zune-jpeg 0.5.12", +] + +[[package]] +name = "image-webp" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imageproc" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2393fb7808960751a52e8a154f67e7dd3f8a2ef9bd80d1553078a7b4e8ed3f0d" +dependencies = [ + "ab_glyph", + "approx", + "getrandom 0.2.17", + "image", + "itertools 0.12.1", + "nalgebra", + "num", + "rand 0.8.5", + "rand_distr", + "rayon", +] + +[[package]] +name = "imgref" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8" + +[[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", +] + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", + "serde", + "serde_core", +] + +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "is-terminal" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "lebe" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" + +[[package]] +name = "libc" +version = "0.2.181" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "459427e2af2b9c839b132acb702a1c654d95e10f8c326bfc2ad11310e458b1c5" + +[[package]] +name = "libfuzzer-sys" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f12a681b7dd8ce12bff52488013ba614b869148d54dd79836ab85aafdd53f08d" +dependencies = [ + "arbitrary", + "cc", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "matrixmultiply" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[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", + "windows-sys 0.61.2", +] + +[[package]] +name = "moxcms" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac9557c559cd6fc9867e122e20d2cbefc9ca29d80d027a8e39310920ed2f0a97" +dependencies = [ + "num-traits", + "pxfm", +] + +[[package]] +name = "multimap" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" + +[[package]] +name = "nalgebra" +version = "0.32.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5c17de023a86f59ed79891b2e5d5a94c705dbe904a5b5c9c952ea6221b03e4" +dependencies = [ + "approx", + "matrixmultiply", + "num-complex", + "num-rational", + "num-traits", + "simba", + "typenum", +] + +[[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", +] + +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "owned_ttf_parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" +dependencies = [ + "ttf-parser", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pastey" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap 2.13.0", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[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 = "png" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" +dependencies = [ + "bitflags 2.10.0", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prctl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "059a34f111a9dee2ce1ac2826a68b24601c4298cfeb1a587c3cb493d5ab46f52" +dependencies = [ + "libc", + "nix", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "prost" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" +dependencies = [ + "bytes", + "heck", + "itertools 0.12.1", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" +dependencies = [ + "anyhow", + "itertools 0.12.1", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "prost-types" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" +dependencies = [ + "prost", +] + +[[package]] +name = "pxfm" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7186d3822593aa4393561d186d1393b3923e9d6163d3fbfd6e825e3e6cf3e6a8" +dependencies = [ + "num-traits", +] + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quote" +version = "1.0.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +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.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" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[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_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_distr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "rav1e" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" +dependencies = [ + "aligned-vec", + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av-scenechange", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools 0.14.0", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "paste", + "profiling", + "rand 0.9.2", + "rand_chacha 0.9.0", + "simd_helpers", + "thiserror", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef69c1990ceef18a116855938e74793a5f7496ee907562bd0857b6ac734ab285" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" + +[[package]] +name = "rgb" +version = "0.8.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" + +[[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 = "safe_arch" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", +] + +[[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", +] + +[[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 = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "simba" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" +dependencies = [ + "approx", + "num-complex", + "num-traits", + "paste", + "wide", +] + +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "socket2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "2.0.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "tempfile" +version = "3.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" +dependencies = [ + "fastrand", + "getrandom 0.4.1", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tiff" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f" +dependencies = [ + "fax", + "flate2", + "half", + "quick-error", + "weezl", + "zune-jpeg 0.4.21", +] + +[[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 0.6.2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-io-timeout" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bd86198d9ee903fedd2f9a2e72014287c0d9167e4ae43b5853007205dda1b76" +dependencies = [ + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-stream" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[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 = "tonic" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76c4eb7a4e9ef9d4763600161f12f5070b92a578e1b634db88a6887844c91a13" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64", + "bytes", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost", + "tokio", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tonic-build" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4ef6dd70a610078cb4e338a0f79d06bc759ff1b22d2120c2ff02ae264ba9c2" +dependencies = [ + "prettyplease", + "proc-macro2", + "prost-build", + "quote", + "syn", +] + +[[package]] +name = "tonic-web" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc3b0e1cedbf19fdfb78ef3d672cb9928e0a91a9cb4629cc0c916e8cff8aaaa1" +dependencies = [ + "base64", + "bytes", + "http", + "http-body", + "hyper", + "pin-project", + "tokio-stream", + "tonic", + "tower-http", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand 0.8.5", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140" +dependencies = [ + "bitflags 2.10.0", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-range-header", + "pin-project-lite", + "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", +] + +[[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 = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "ttf-parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicode-ident" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537dd038a89878be9b64dd4bd1b260315c1bb94f4d784956b81e27a088d9a09e" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "v_frame" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + +[[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.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.13.0", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.10.0", + "hashbrown 0.15.5", + "indexmap 2.13.0", + "semver", +] + +[[package]] +name = "weezl" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" + +[[package]] +name = "wide" +version = "0.7.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce5da8ecb62bcd8ec8b7ea19f69a51275e91299be594ea5cc6ef7819e16cd03" +dependencies = [ + "bytemuck", + "safe_arch", +] + +[[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 = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.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", +] + +[[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", + "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_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.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.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.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.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.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.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 = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap 2.13.0", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.10.0", + "indexmap 2.13.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.13.0", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "y4m" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" + +[[package]] +name = "zerocopy" +version = "0.8.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zmij" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4de98dfa5d5b7fef4ee834d0073d560c9ca7b6c46a71d058c48db7960f8cfaf7" + +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9" + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zune-jpeg" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" +dependencies = [ + "zune-core 0.4.12", +] + +[[package]] +name = "zune-jpeg" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "410e9ecef634c709e3831c2cfdb8d9c32164fae1c67496d5b68fff728eec37fe" +dependencies = [ + "zune-core 0.5.1", +] diff --git a/nixos/pkgs/cedar-detect.nix b/nixos/pkgs/cedar-detect.nix new file mode 100644 index 000000000..da84d849d --- /dev/null +++ b/nixos/pkgs/cedar-detect.nix @@ -0,0 +1,27 @@ +{ pkgs }: +pkgs.rustPlatform.buildRustPackage rec { + pname = "cedar-detect-server"; + version = "0.5.0-unstable-2026-02-11"; + + src = pkgs.fetchFromGitHub { + owner = "smroid"; + repo = "cedar-detect"; + rev = "da6be9d318976a1a0853ecdf6dd6cefe41615352"; + hash = "sha256-SqWJ35cBOSCu8w5nK2lcdlMWK/bHINatzjr/p+MH3/o="; + }; + + cargoLock.lockFile = ./cedar-detect-Cargo.lock; + + postPatch = '' + ln -s ${./cedar-detect-Cargo.lock} Cargo.lock + ''; + + nativeBuildInputs = [ pkgs.protobuf ]; + + cargoBuildFlags = [ "--bin" "cedar-detect-server" ]; + + meta = { + description = "Cedar Detect star detection gRPC server"; + homepage = "https://github.com/smroid/cedar-detect"; + }; +} diff --git a/nixos/pkgs/picamera2-optional-previews.patch b/nixos/pkgs/picamera2-optional-previews.patch new file mode 100644 index 000000000..2d31b7d8f --- /dev/null +++ b/nixos/pkgs/picamera2-optional-previews.patch @@ -0,0 +1,22 @@ +Make picamera2's DRM/Qt preview imports optional. + +previews/__init__.py imports DrmPreview (needs pykms) and the Qt previews +(need PyQt) unconditionally, so on a headless device without those native +deps `import picamera2` fails outright and PiFinder's camera process crashes. +PiFinder only ever uses NullPreview, so guard the optional backends. + +--- a/picamera2/previews/__init__.py ++++ b/picamera2/previews/__init__.py +@@ -1,3 +1,10 @@ +-from .drm_preview import DrmPreview + from .null_preview import NullPreview +-from .qt_previews import QtGlPreview, QtPreview ++ ++try: ++ from .drm_preview import DrmPreview ++except ImportError: ++ DrmPreview = None ++try: ++ from .qt_previews import QtGlPreview, QtPreview ++except ImportError: ++ QtGlPreview = QtPreview = None diff --git a/nixos/pkgs/pifinder-kernel.nix b/nixos/pkgs/pifinder-kernel.nix new file mode 100644 index 000000000..05d4adf4f --- /dev/null +++ b/nixos/pkgs/pifinder-kernel.nix @@ -0,0 +1,21 @@ +{ pkgs, nixos-hardware }: + +pkgs.callPackage "${nixos-hardware}/raspberry-pi/common/kernel.nix" { + rpiVersion = 4; + argsOverride.kernelPatches = (with pkgs.kernelPatches; [ + bridge_stp_helper + request_key_helper + ]) ++ [ + { + name = "imx290-optical-black-stream"; + # builtins.path gives the patch its own content-addressed store path. + # A bare ../patches/… reference resolves inside the flake source tree, + # making the kernel derivation depend on the whole repo hash — every + # commit (even Python-only) would rebuild the kernel. + patch = builtins.path { + path = ../patches/imx290-optical-black-stream.patch; + name = "imx290-optical-black-stream.patch"; + }; + } + ]; +} diff --git a/nixos/pkgs/pifinder-src.nix b/nixos/pkgs/pifinder-src.nix new file mode 100644 index 000000000..6142d2f87 --- /dev/null +++ b/nixos/pkgs/pifinder-src.nix @@ -0,0 +1,71 @@ +{ pkgs, python ? pkgs.python313 }: +let + # Stable astro data — catalogs, star patterns, ephemeris (~193MB, rarely changes) + # hip_main.dat is now committed to astro_data/ upstream, so cp -r picks it up. + astro-data = pkgs.stdenv.mkDerivation { + pname = "pifinder-astro-data"; + version = "1.0"; + src = ../../astro_data; + phases = [ "installPhase" ]; + installPhase = '' + mkdir -p $out + cp -r $src/* $out/ + ''; + }; + + # UI fonts — ~31MB, effectively never change. Own derivation + symlink so they + # are distributed once and not rewritten on every code change. + fonts = pkgs.stdenv.mkDerivation { + pname = "pifinder-fonts"; + version = "1.0"; + src = ../../fonts; + phases = [ "installPhase" ]; + installPhase = '' + mkdir -p $out + cp -r $src/* $out/ + ''; + }; + +in +pkgs.stdenv.mkDerivation { + pname = "pifinder-src"; + version = "0.0.1"; + src = ../..; + + nativeBuildInputs = [ python ]; + phases = [ "installPhase" ]; + + installPhase = '' + mkdir -p $out + + # Copy everything except build artifacts and non-runtime directories + cp -r --no-preserve=mode $src/* $out/ || true + + # Remove directories not needed at runtime + rm -rf $out/.git $out/.github $out/nixos $out/result* $out/.venv + # Development environments and caches can also live below python/. In + # particular, python/.venv is hundreds of MiB and must never become part + # of the runtime source closure. + rm -rf $out/python/.venv $out/python/.mypy_cache + rm -rf $out/python/.pytest_cache $out/python/.ruff_cache + find $out/python -type d -name __pycache__ -prune -exec rm -rf {} + + rm -rf $out/case $out/docs $out/gerbers $out/kicad + rm -rf $out/pi_config_files $out/scripts + rm -rf $out/bin + + # Strip doc photos from images/ but keep welcome.png (used at runtime) + find $out/images -type f ! -name 'welcome.png' -delete + + # Bulky, stable inputs live in their own derivations and are symlinked in, + # so a code change rewrites only the (small) code path — not astro-data + # (~193MB) or fonts (~31MB). See ADR 0001. + rm -rf $out/astro_data + ln -s ${astro-data} $out/astro_data + rm -rf $out/fonts + ln -s ${fonts} $out/fonts + + # Pre-compile .pyc bytecode so Python skips compilation at runtime + chmod -R u+w $out/python + python3 -m compileall -q $out/python + ''; +} diff --git a/nixos/pkgs/rpi-gpio-pi-detect.patch b/nixos/pkgs/rpi-gpio-pi-detect.patch new file mode 100644 index 000000000..eebe60114 --- /dev/null +++ b/nixos/pkgs/rpi-gpio-pi-detect.patch @@ -0,0 +1,29 @@ +Make RPi.GPIO board detection fall back to /proc/device-tree/model. + +get_rpi_info() reads the board revision from +/proc/device-tree/system/linux,revision or the /proc/cpuinfo "Revision" +line. On a NixOS Pi 4 (mainline device tree, arm64) neither is present, so +the C module init aborts with "This module can only be run on a Raspberry +Pi!" and any importer (adafruit-blinka -> board -> RPi.GPIO) crashes. Fall +back to the model string, which is always present, and synthesise a Pi 4 +Model B revision code so detection succeeds. + +--- a/source/cpuinfo.c ++++ b/source/cpuinfo.c +@@ -66,6 +66,16 @@ + else + return -1; + fclose(fp); ++ if (!found) { ++ FILE *mp; ++ if ((mp = fopen("/proc/device-tree/model", "r"))) { ++ if (fgets(buffer, sizeof(buffer), mp) && strstr(buffer, "Raspberry Pi")) { ++ found = 1; ++ strcpy(revision, "c03111"); ++ } ++ fclose(mp); ++ } ++ } + + if (!found) + return -1; diff --git a/nixos/pkgs/uv-python-darwin.nix b/nixos/pkgs/uv-python-darwin.nix new file mode 100644 index 000000000..3bea6fadb --- /dev/null +++ b/nixos/pkgs/uv-python-darwin.nix @@ -0,0 +1,47 @@ +{ pkgs, lib ? pkgs.lib, pyproject-nix, uv2nix, pyproject-build-systems }: +let + python = pkgs.python313; + + workspace = uv2nix.lib.workspace.loadWorkspace { workspaceRoot = ../../python; }; + + overlay = workspace.mkPyprojectOverlay { sourcePreference = "wheel"; }; + + # Only the overrides that are needed on macOS — Linux-only packages + # (spidev, rpi-gpio, picamera2, dbus-python, pygobject, python-libinput, + # python-prctl, python-pam, evdev, adafruit-blinka, pidng, videodev2) are + # gated behind sys_platform == 'linux' in pyproject.toml so they are never + # resolved for this platform and need no override here. + pyprojectOverrides = final: prev: { + # cedar-solve (the tetra3 plate-solver) is installed from git source and + # uses setup.py but doesn't declare setuptools as a build dependency. + cedar-solve = prev.cedar-solve.overrideAttrs (old: { + nativeBuildInputs = + (old.nativeBuildInputs or []) + ++ final.resolveBuildSystem { setuptools = []; }; + }); + + timezonefinder = prev.timezonefinder.overrideAttrs (old: { + nativeBuildInputs = + (old.nativeBuildInputs or []) + ++ final.resolveBuildSystem { setuptools = []; }; + }); + + sh = prev.sh.overrideAttrs (old: { + nativeBuildInputs = + (old.nativeBuildInputs or []) + ++ final.resolveBuildSystem { setuptools = []; }; + }); + }; + + pythonSet = + (pkgs.callPackage pyproject-nix.build.packages { inherit python; }).overrideScope + (lib.composeManyExtensions [ + pyproject-build-systems.overlays.default + overlay + pyprojectOverrides + ]); +in { + inherit pythonSet; + pifinderEnv = pythonSet.mkVirtualEnv "pifinder-env" workspace.deps.default; + devEnv = pythonSet.mkVirtualEnv "pifinder-dev-env" workspace.deps.all; +} diff --git a/nixos/pkgs/uv-python.nix b/nixos/pkgs/uv-python.nix new file mode 100644 index 000000000..86f54c944 --- /dev/null +++ b/nixos/pkgs/uv-python.nix @@ -0,0 +1,223 @@ +{ pkgs, lib ? pkgs.lib, pyproject-nix, uv2nix, pyproject-build-systems }: +let + python = pkgs.python313; + + # The uv workspace lives at the repo root (python/pyproject.toml + uv.lock). + workspace = uv2nix.lib.workspace.loadWorkspace { workspaceRoot = ../../python; }; + + # Prefer prebuilt wheels; fall back to sdist where no wheel exists. + overlay = workspace.mkPyprojectOverlay { sourcePreference = "wheel"; }; + + # Native/C-extension packages that can't build from PyPI metadata alone. + # These mirror the patches the old hand-written python-packages.nix carried. + pyprojectOverrides = final: prev: { + python-libinput = prev.python-libinput.overrideAttrs (old: { + nativeBuildInputs = + (old.nativeBuildInputs or []) + ++ [ pkgs.pkg-config ] + ++ final.resolveBuildSystem { setuptools = []; }; + buildInputs = (old.buildInputs or []) ++ [ pkgs.libinput pkgs.systemd ]; + postPatch = (old.postPatch or "") + '' + substituteInPlace setup.py \ + --replace-fail 'from imp import load_source' 'import importlib.util, types +def load_source(name, path): + spec = importlib.util.spec_from_file_location(name, path) + mod = importlib.util.module_from_spec(spec) + spec.loader.exec_module(mod) + return mod' + substituteInPlace libinput/__init__.py \ + --replace-fail "CDLL('libudev.so.1')" "CDLL('${lib.getLib pkgs.systemd}/lib/libudev.so.1')" \ + --replace-fail "CDLL('libinput.so.10')" "CDLL('${lib.getLib pkgs.libinput}/lib/libinput.so.10')" + ''; + }); + + python-prctl = prev.python-prctl.overrideAttrs (old: { + nativeBuildInputs = + (old.nativeBuildInputs or []) + ++ final.resolveBuildSystem { setuptools = []; }; + buildInputs = (old.buildInputs or []) ++ [ pkgs.libcap ]; + }); + + # Installed from a prebuilt wheel (no source at patchPhase), so patch the + # installed module in $out: ctypes find_library("pam") can't locate libpam on + # NixOS, so pin it to the store path. + python-pam = prev.python-pam.overrideAttrs (old: { + postInstall = (old.postInstall or "") + '' + substituteInPlace "$out/${python.sitePackages}/pam/__internals.py" \ + --replace-fail 'find_library("pam")' '"${pkgs.pam}/lib/libpam.so"' \ + --replace-fail 'find_library("pam_misc")' '"${pkgs.pam}/lib/libpam_misc.so"' + ''; + }); + + # dbus-python and PyGObject build from sdist with meson-python; that build + # backend (resolveBuildSystem) plus pkg-config and the C libraries must be on + # the build inputs, otherwise the sdist build fails with "No module named + # 'mesonpy'". + dbus-python = prev.dbus-python.overrideAttrs (old: { + nativeBuildInputs = + (old.nativeBuildInputs or []) + ++ [ pkgs.pkg-config pkgs.ninja ] + ++ final.resolveBuildSystem { meson-python = []; }; + buildInputs = (old.buildInputs or []) ++ [ pkgs.dbus pkgs.glib ]; + }); + + pygobject = prev.pygobject.overrideAttrs (old: { + nativeBuildInputs = + (old.nativeBuildInputs or []) + ++ [ pkgs.pkg-config pkgs.ninja ] + ++ final.resolveBuildSystem { meson-python = []; }; + buildInputs = + (old.buildInputs or []) + ++ [ pkgs.glib pkgs.gobject-introspection pkgs.cairo pkgs.python313Packages.pycairo ]; + }); + + # evdev builds a C extension from sdist: it needs the setuptools backend, the + # kernel input headers on the compiler path (for build_ext), and its setup.py + # only searches /usr/include for linux/input.h — repoint that at linuxHeaders. + evdev = prev.evdev.overrideAttrs (old: { + nativeBuildInputs = + (old.nativeBuildInputs or []) + ++ final.resolveBuildSystem { setuptools = []; }; + buildInputs = (old.buildInputs or []) ++ [ pkgs.linuxHeaders ]; + postPatch = (old.postPatch or "") + '' + substituteInPlace setup.py \ + --replace-fail 'include_paths.add("/usr/include")' 'include_paths.add("${pkgs.linuxHeaders}/include")' + ''; + }); + + # pycairo builds from sdist with meson-python (pulled in by pygobject's + # cairo support); same meson stack as dbus-python/pygobject. + pycairo = prev.pycairo.overrideAttrs (old: { + nativeBuildInputs = + (old.nativeBuildInputs or []) + ++ [ pkgs.pkg-config pkgs.ninja ] + ++ final.resolveBuildSystem { meson-python = []; }; + buildInputs = (old.buildInputs or []) ++ [ pkgs.cairo ]; + }); + + # Legacy setup.py packages (no [build-system]) need the setuptools backend + # provided explicitly, else the sdist build fails with "No module named + # 'setuptools'". + pidng = prev.pidng.overrideAttrs (old: { + nativeBuildInputs = + (old.nativeBuildInputs or []) + ++ final.resolveBuildSystem { setuptools = []; }; + }); + + adafruit-extended-bus = prev.adafruit-extended-bus.overrideAttrs (old: { + nativeBuildInputs = + (old.nativeBuildInputs or []) + ++ final.resolveBuildSystem { setuptools = []; }; + }); + + # cedar-solve declares the setuptools.build_meta backend but ships no + # setuptools in its build env, so the sdist build fails with "No module + # named 'setuptools'" — provide the backend like the other legacy packages. + cedar-solve = prev.cedar-solve.overrideAttrs (old: { + nativeBuildInputs = + (old.nativeBuildInputs or []) + ++ final.resolveBuildSystem { setuptools = []; }; + }); + + rpi-gpio = prev.rpi-gpio.overrideAttrs (old: { + nativeBuildInputs = + (old.nativeBuildInputs or []) + ++ final.resolveBuildSystem { setuptools = []; }; + # RPi.GPIO's C module init aborts with "This module can only be run on a + # Raspberry Pi!" when the board revision is in neither the device tree + # nor /proc/cpuinfo — the case on a mainline-DT arm64 NixOS Pi 4. Without + # this every importer (adafruit-blinka -> board -> RPi.GPIO) crashes and + # the whole app crash-loops. Patch in a /proc/device-tree/model fallback. + postPatch = + (old.postPatch or "") + + '' + patch -p1 < ${./rpi-gpio-pi-detect.patch} + ''; + }); + + # picamera2 installs from a py3-none-any wheel (no source patchPhase to + # hook), so patch the installed module in $out. It imports its DRM (pykms) + # and Qt preview backends unconditionally; the headless device has neither, + # so `import picamera2` dies on a missing 'pykms' and the camera process + # crash-loops. PiFinder only uses NullPreview, so make those optional. + picamera2 = prev.picamera2.overrideAttrs (old: { + postInstall = + (old.postInstall or "") + + '' + f=$(find "$out" -path '*/picamera2/previews/__init__.py' | head -1) + if [ -z "$f" ]; then + echo "picamera2: previews/__init__.py not found under $out" >&2 + exit 1 + fi + echo "picamera2: patching $f" + patch "$f" < ${./picamera2-optional-previews.patch} + ''; + }); + + # No aarch64 wheel, so it builds from sdist on the Pi (fine on x86 via wheel). + timezonefinder = prev.timezonefinder.overrideAttrs (old: { + nativeBuildInputs = + (old.nativeBuildInputs or []) + ++ final.resolveBuildSystem { setuptools = []; }; + }); + + sh = prev.sh.overrideAttrs (old: { + nativeBuildInputs = + (old.nativeBuildInputs or []) + ++ final.resolveBuildSystem { setuptools = []; }; + }); + + spidev = prev.spidev.overrideAttrs (old: { + nativeBuildInputs = + (old.nativeBuildInputs or []) + ++ final.resolveBuildSystem { setuptools = []; }; + }); + + # The manylinux pygame wheel bundles libSDL2, which dlopen()s libX11 / + # libwayland / libxkbcommon / libGL / libdecor at runtime instead of listing + # them as NEEDED, so autoPatchelf never discovers them. On a Nix host those + # libraries aren't on the loader path, so SDL falls back to the "offscreen" + # video driver and the emulator window never opens. Append them to the + # runpath so SDL can load its x11/wayland backends. Dev-only (pulled in via + # luma-emulator); pygame is not in the Pi runtime env. + pygame = prev.pygame.overrideAttrs (old: { + appendRunpaths = map (p: "${lib.getLib p}/lib") [ + pkgs.xorg.libX11 + pkgs.xorg.libXext + pkgs.xorg.libXcursor + pkgs.xorg.libXrandr + pkgs.xorg.libXi + pkgs.xorg.libXfixes + pkgs.libxrender + pkgs.libxscrnsaver + pkgs.libxinerama + pkgs.libxkbcommon + pkgs.wayland + pkgs.libGL + pkgs.libdecor + ]; + }); + + # adafruit-blinka's wheel vendors prebuilt libgpiod_pulsein helpers for + # non-Pi SoCs (amlogic, etc.) that link libgpiod.so.2. PiFinder never uses + # them (BNO055 is I2C), so don't fail auto-patchelf on that missing lib. + adafruit-blinka = prev.adafruit-blinka.overrideAttrs (old: { + autoPatchelfIgnoreMissingDeps = + (old.autoPatchelfIgnoreMissingDeps or []) ++ [ "libgpiod.so.2" ]; + }); + }; + + pythonSet = + (pkgs.callPackage pyproject-nix.build.packages { inherit python; }).overrideScope + (lib.composeManyExtensions [ + pyproject-build-systems.overlays.default + overlay + pyprojectOverrides + ]); +in { + inherit pythonSet; + # Runtime env: [project.dependencies] only. + pifinderEnv = pythonSet.mkVirtualEnv "pifinder-env" workspace.deps.default; + # Dev env: adds the [dependency-groups].dev set (pytest, mypy, selenium…). + devEnv = pythonSet.mkVirtualEnv "pifinder-dev-env" workspace.deps.all; +} diff --git a/nixos/pkgs/welcome_image.h b/nixos/pkgs/welcome_image.h new file mode 100644 index 000000000..ef8cfc2ff --- /dev/null +++ b/nixos/pkgs/welcome_image.h @@ -0,0 +1,1027 @@ +// Auto-generated from welcome.png - 128x128 BGR565 +static const uint16_t welcome_image[16384] = { + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, + 0x4800, 0x4000, 0x4000, 0x4800, 0x4800, 0x5000, 0x5000, 0x5800, 0x6000, 0x6000, 0x6000, 0x6000, 0x6800, 0x6800, 0x5800, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, 0x6000, 0x5800, + 0x5800, 0x5800, 0x6000, 0x6000, 0x6000, 0x6000, 0x5800, 0x5800, 0x6000, 0x6000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, + 0x5800, 0x6000, 0x5800, 0x5800, 0x6000, 0x6000, 0x6000, 0x6800, 0x6800, 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, 0x6000, 0x6000, + 0x6000, 0x6000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, 0x6000, 0x6800, 0x6800, 0x6800, 0x6800, 0x6800, + 0x6800, 0x6800, 0x6800, 0x6800, 0x6000, 0x6000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x6000, 0x5800, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x6000, 0x6000, 0x6000, 0x6800, 0x6800, 0x6800, + 0x6800, 0x5800, 0x5800, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, 0x6000, 0x5800, 0x6000, 0x5800, 0x5800, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, 0x5800, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, 0x6000, 0x6000, 0x6800, 0x6800, 0x6800, + 0x6800, 0x6800, 0x7000, 0x6800, 0x6800, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x6000, 0x6800, 0x6800, 0x7000, + 0x7000, 0x5800, 0x5800, 0x6000, 0x6800, 0x7800, 0x6000, 0x5800, 0x6000, 0x6000, 0x6000, 0x6000, 0x5800, 0x5800, 0x6000, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, + 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, 0x6000, 0x6000, + 0x6800, 0x6800, 0x6800, 0x6800, 0x6800, 0x6800, 0x6800, 0x6000, 0x6000, 0x6000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x6000, 0x6000, 0x6000, 0x6000, + 0x5800, 0x6000, 0x6000, 0x6000, 0x6000, 0x6800, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x5800, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, 0x6000, 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x6800, + 0x6000, 0x5000, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, + 0x6000, 0x6000, 0x6800, 0x6800, 0x6800, 0x6800, 0x6800, 0x6800, 0x6800, 0x6000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, + 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x3800, 0x4000, 0x3800, 0x3800, + 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x4800, 0x5000, 0x5000, 0x5000, 0x5800, 0x6000, 0x6000, 0x6000, + 0x5800, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, 0x6000, 0x6000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, + 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, + 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, + 0x5800, 0x6000, 0x6000, 0x6000, 0x6000, 0x6800, 0x6800, 0x6800, 0x6800, 0x6000, 0x6000, 0x6000, 0x5800, 0x5800, 0x5800, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x5000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5800, 0x5800, + 0x5800, 0x5800, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, 0x6000, 0x6000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5800, + 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, + 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, 0x6000, 0x6800, 0x6800, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x5800, 0x5800, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5800, 0x5800, + 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, + 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5000, 0x5800, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, + 0x5000, 0x5000, 0x7800, 0x8000, 0x5000, 0x5000, 0x5000, 0x4800, 0x5000, 0x4800, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x5800, 0x5800, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5800, 0x5800, + 0x3800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, + 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, + 0x6000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5000, + 0x5000, 0x5000, 0x8000, 0x9000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x6000, 0x6000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x5800, 0x5800, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x5000, 0x4000, 0x4000, 0x4800, 0x4800, + 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x6000, 0x5800, 0x5800, 0x6000, 0x6000, + 0x6000, 0x6000, 0x6000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x5800, 0x5800, 0x5800, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, + 0x3000, 0x3000, 0x3000, 0x4000, 0x3800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x5000, 0x5800, 0x4000, 0x4000, 0x4000, 0x4800, + 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, + 0x5800, 0x6000, 0x6000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, 0x5800, 0x5800, 0x5800, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x4800, 0x5000, 0x5800, 0x5800, 0x6000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, + 0x3000, 0x3000, 0x3000, 0x4000, 0x3800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5800, 0x5800, 0x6800, 0x6000, 0x5800, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, + 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x6000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x6800, 0x6800, 0x5800, 0x5800, + 0x5800, 0x5800, 0x5800, 0x6000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x6000, 0x6800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, + 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x4800, 0x5000, 0x5000, 0x5800, 0x5800, 0x6000, 0x6000, 0x5800, 0x5800, 0x5800, 0x5800, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, + 0x5000, 0x5000, 0x5800, 0x6000, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x6800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5800, 0x5800, 0x5000, 0x5800, 0x5800, 0x5000, 0x5000, 0x5800, 0x5800, 0x6000, 0x5800, 0x5800, 0x6000, 0x6000, 0x5800, 0x5800, + 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5800, 0x5000, 0x5000, 0x5000, 0x5800, 0x6000, 0x6000, 0x6000, 0x5800, 0x5800, 0x5000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, 0x6000, 0x6000, + 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x6800, 0x6000, 0x5000, 0x5000, 0x5800, 0x6000, 0x6000, 0x6000, 0x6000, 0x5800, 0x5800, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, + 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x3800, 0x3800, 0x4000, 0x4000, + 0x4000, 0x4000, 0x3800, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5800, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, 0x6000, + 0x6000, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, 0x6000, 0x6000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3000, + 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x5000, 0x6000, 0x6800, 0x7800, 0x8000, 0x6000, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x6000, 0x8000, 0x7800, 0x7000, 0x6800, 0x5800, 0x5000, 0x4800, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, 0x6000, + 0x6000, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, 0x6000, 0x6000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3000, 0x4800, 0x6000, 0x7800, 0x8800, 0x9000, 0x8000, 0x7000, 0x6800, 0x5800, 0x5000, 0x4000, 0x4000, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x4000, 0x5800, 0x6000, 0x7000, 0x7800, 0x8800, 0xA000, 0xA000, 0x9000, 0x8000, 0x6800, 0x5800, 0x5800, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, + 0x6000, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x6000, 0x6800, 0x6000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x5000, 0x7000, + 0x8800, 0x8000, 0x6800, 0x5800, 0x4800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x5800, 0x7000, 0x9000, 0xA800, 0xB000, 0x9000, 0x7000, + 0x5800, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x6000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x6000, 0x5800, 0x5000, 0x5000, 0x5000, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, + 0x6000, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x7000, 0x6800, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x4800, 0x6800, 0x8800, 0x7800, 0x6000, + 0x4000, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x3800, 0x3800, 0x4000, 0x4000, 0x3800, 0x3800, 0x4000, 0x5000, 0x3800, 0x3800, + 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5800, 0x6000, 0x6800, 0x8000, 0x9800, + 0xA800, 0x9000, 0x6800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5000, 0x5000, 0x5800, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x8000, 0x6800, 0x5000, 0x5000, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, + 0x5800, 0x6000, 0x6000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x6000, 0x6000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x5000, 0x7800, 0x8000, 0x6000, 0x3800, 0x3000, 0x3000, + 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x3800, 0x3800, 0x4000, 0x4000, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x3800, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x5000, 0x5800, 0x6000, 0x6000, 0x5800, 0x5000, + 0x6000, 0x8000, 0xA000, 0x9800, 0x7000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x6800, 0x6800, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, 0x5000, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, + 0x5800, 0x6000, 0x6000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x6000, 0x6000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x5800, 0x8000, 0x7000, 0x5000, 0x3800, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3800, 0x3800, 0x3800, 0x4000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, + 0x5000, 0x5000, 0x5800, 0x7000, 0x9800, 0xA000, 0x7800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x6000, 0x6000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5800, 0x6000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, + 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x6000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x5000, 0x8000, 0x7000, 0x4000, 0x3000, 0x3000, 0x4800, 0x3800, 0x3800, 0x3800, 0x3000, + 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, 0x6000, 0x9000, 0xA000, 0x7000, 0x5000, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x6800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x6000, 0x5800, 0x5000, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x6000, + 0x3000, 0x3000, 0x3000, 0x4800, 0x7800, 0x7800, 0x4000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x4000, 0x3800, 0x3000, + 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, 0x5000, 0x6800, 0x9800, 0x9800, 0x8000, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x6800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5800, 0x5000, 0x7000, 0xA800, 0x8000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, + 0x5000, 0x5000, 0x5000, 0x5000, 0x7000, 0x7800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, + 0x3000, 0x3000, 0x6800, 0x8000, 0x5000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3800, 0x3800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x4800, 0x5000, 0x5000, 0x6000, 0x6800, 0x5000, 0x5000, 0x5000, 0x5000, 0x7000, 0xA800, 0x8800, 0x5800, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x6000, 0x5800, 0x6800, 0x9800, 0x8000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, + 0x4800, 0x8000, 0x6800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, + 0x4800, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x8800, 0xA000, 0x6800, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x6000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, + 0x8000, 0x4800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, + 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x6800, 0xA000, 0x8000, 0x5000, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x7000, + 0x8800, 0x5800, 0x5000, 0x5000, 0x5800, 0x5000, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x3800, 0x4000, 0x3000, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x5000, 0x3800, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, + 0x4800, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x4800, 0x4800, 0x4800, + 0x4800, 0x4800, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, 0x5000, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x9000, 0x9800, + 0x6000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, + 0x5000, 0x5000, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x6800, + 0x7800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x3000, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x4000, 0x3800, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4800, + 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x4800, 0x4800, 0x4800, + 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x6800, 0x7800, 0x5000, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x8000, + 0xA000, 0x6800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, + 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5000, 0x5800, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x7000, 0x5000, 0x5800, 0x6000, 0x5000, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, + 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, + 0x4800, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x4800, + 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x6800, 0x8800, 0x5000, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x7000, 0xA000, 0x7000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x4800, + 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, 0x5800, 0x5800, 0x5000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, + 0x3000, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x4800, + 0x5000, 0x3000, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x4000, 0x4000, 0x4000, 0x5000, 0x6000, + 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x4800, + 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, + 0x5000, 0x6800, 0xA800, 0x7800, 0x5800, 0x5800, 0x5800, 0x6000, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, + 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, + 0x3000, 0x2800, 0x3000, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x8800, + 0xA800, 0x4000, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4800, 0x5800, + 0x5800, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4000, + 0x4000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, + 0x5000, 0x5000, 0x6800, 0xA800, 0x7800, 0x5800, 0x5800, 0x6000, 0x6000, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, + 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x4800, + 0x5800, 0x3000, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4000, + 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, + 0x5000, 0x5000, 0x5000, 0x6800, 0xA800, 0x7800, 0x5800, 0x5800, 0x6000, 0x6000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, + 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, + 0x3800, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x3000, 0x2800, + 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, + 0x4000, 0x4800, 0x4800, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x6800, 0xA800, 0x7000, 0x5800, 0x7000, 0x6800, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, + 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, + 0x4000, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x4000, 0x4000, 0x4800, 0x5000, 0x4800, 0x4800, 0x6000, 0x9800, 0x5000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x6800, 0xA800, 0x6800, 0x6000, 0x6000, 0x5800, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, + 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, + 0x2800, 0x3000, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x5000, 0x6000, 0x4800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, + 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x7000, 0xA800, 0x6800, 0x6000, 0x5800, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, + 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, + 0x3000, 0x3800, 0x3000, 0x3000, 0x3000, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x3000, 0x3000, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, + 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x8000, 0xA000, 0x6000, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, + 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, + 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x3000, 0x3800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, + 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5800, 0xA000, 0x9000, 0x6000, 0x5800, 0x5000, 0x5000, 0x5000, 0x4800, + 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x3000, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x3000, 0x3800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4000, 0x4000, 0x4000, 0x4000, + 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, + 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x6800, 0xB000, 0x7800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5800, + 0x7000, 0x5800, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x5000, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x4000, 0x3000, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, + 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5800, 0x7800, 0xB000, 0x6000, 0x5800, 0x5800, 0x5000, 0x6800, + 0x9800, 0x6800, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5800, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x3800, 0x6000, 0x3800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4800, 0x4000, 0x5000, 0x5000, 0x4000, 0x4000, 0x4000, 0x4000, 0x3800, + 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4000, 0x4000, 0x4800, 0x4000, 0x4000, + 0x4000, 0x4800, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5800, 0x9000, 0x8800, 0x5800, 0x5800, 0x5000, 0x5800, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, + 0x3000, 0x3000, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x4000, 0x5800, 0x6800, 0x5800, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x5000, 0x6800, 0x6000, 0x4800, 0x3800, 0x4000, 0x3800, 0x5800, 0x6000, 0x4000, 0x4000, 0x4000, 0x4000, 0x3800, + 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x5800, 0x4000, 0x4000, + 0x4000, 0x4800, 0x4800, 0x4800, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0xA000, 0x6800, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4000, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x5000, 0x7000, 0x8000, 0x8000, 0x6800, 0x5800, 0x4000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3800, 0x5800, 0x6800, 0x8000, 0x8800, 0x7000, 0x5800, 0x3800, 0x3800, 0x4000, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4800, 0x6000, 0x4800, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x6800, 0x9000, 0x5000, 0x5000, 0x5000, + 0x4800, 0x5000, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x5800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4000, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x3000, 0x5800, 0x8000, 0x7000, 0x5800, 0x3800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x4000, 0x5800, 0x7800, 0x8800, 0x6000, 0x4000, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x3800, 0x3800, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x5800, 0x4800, 0x4000, 0x4000, 0x4800, 0x4800, 0x4000, 0x9000, 0x7000, 0x4800, 0x4800, + 0x4800, 0x4800, 0x6800, 0x6800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x6000, 0x5800, 0x4800, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, + 0x7800, 0x6000, 0x4800, 0x5000, 0x5000, 0x4800, 0x4800, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4000, + 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x5800, 0x8000, 0x6800, 0x4000, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x2800, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3000, 0x3800, 0x4000, 0x5000, 0x7000, 0x8800, 0x6800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x4000, 0x4000, 0x5000, 0x8000, 0x5000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x5800, 0x9800, 0x4800, 0x4800, + 0x4000, 0x4000, 0x8000, 0x7800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5000, 0x4800, 0x4800, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, + 0x5800, 0x5000, 0x4800, 0x4800, 0x4800, 0x7000, 0x7000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4000, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x4800, + 0x7800, 0x6800, 0x3000, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x2800, 0x2800, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x4000, 0x3800, 0x3000, 0x4000, 0x7000, 0x8800, 0x5000, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x8800, 0x7000, 0x4800, + 0x4800, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x6000, 0x5800, 0x5000, + 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x9000, 0x8800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4000, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x6000, 0x7800, + 0x4000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x2800, 0x2800, + 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x5000, 0x8000, 0x6800, + 0x3800, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x5800, 0x9800, 0x4800, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, + 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, + 0x4800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x7000, 0x6800, 0x3000, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x7000, + 0x7800, 0x4000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x8800, 0x6800, + 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, + 0x4800, 0x4800, 0x4800, 0x5800, 0x5800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x6000, 0x6000, 0x5800, + 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, + 0x4000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3800, 0x7800, 0x5800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x6000, 0x8000, 0x4000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x6000, 0x9000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, + 0x4800, 0x4800, 0x4800, 0x5800, 0x5800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x6000, 0x5800, 0x5800, + 0x5000, 0x5000, 0x5000, 0x5000, 0x6000, 0x7000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3800, 0x7800, 0x5000, 0x2800, 0x2800, 0x2800, + 0x3000, 0x4000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x5800, 0x8800, 0x4000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x9000, + 0x5000, 0x3800, 0x3800, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x4800, + 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, + 0x5000, 0x5000, 0x5000, 0x5000, 0x6000, 0x6800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, 0x5000, 0x4800, 0x4800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x7800, 0x5000, 0x2800, 0x2800, 0x3000, 0x2800, + 0x2800, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x4800, 0x3800, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x5800, 0x8000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x6800, + 0x7000, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, + 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x6000, 0x6000, 0x5800, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x5000, 0x5000, 0x4800, + 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x7000, 0x5800, 0x2800, 0x2800, 0x3800, 0x4000, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x6000, 0x7800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4800, 0x4000, 0x3800, 0x4000, 0x4000, 0x4000, 0x3800, 0x4800, + 0x8800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x5000, 0x4800, 0x4800, + 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x6800, 0x6000, 0x5000, 0x5000, + 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, 0x5000, 0x5000, + 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x5800, 0x6800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x2800, 0x3000, 0x3000, 0x3000, 0x3800, + 0x3000, 0x3000, 0x3000, 0x3000, 0x7000, 0x6800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x3800, 0x3800, 0x3800, 0x3800, + 0x8000, 0x5000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x5000, 0x5000, 0x4800, + 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5800, 0x5000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, + 0x5000, 0x5800, 0x5000, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x5000, 0x5000, 0x5000, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x4800, 0x7800, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3800, 0x3000, 0x3000, 0x3000, 0x3800, 0x8000, 0x5000, 0x3800, 0x3800, 0x3800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x6000, 0x7000, 0x3800, 0x4000, 0x4000, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x5000, 0x5000, 0x4800, + 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, + 0x4800, 0x5000, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x8800, 0x7000, 0x5000, 0x4800, 0x4800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x7800, 0x4800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x4800, 0x8000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x4800, 0x8800, 0x3800, 0x3800, 0x4000, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x5000, 0x4800, + 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, + 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x6000, 0xA000, 0x7800, 0x5000, 0x4800, 0x5000, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x5800, 0x6800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x7000, 0x8000, 0x5000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x8800, 0x4800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x5000, + 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, + 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x5000, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x8000, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0xD000, 0x9000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x7000, 0x6000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x5000, + 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, + 0x7000, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x5000, 0x6000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x2800, 0x2800, + 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x7000, 0x6800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x5800, 0x7800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, + 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, + 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x8000, 0x3800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x3000, 0x5800, + 0x4000, 0x2800, 0x3000, 0x2800, 0x2800, 0x3000, 0x3000, 0x3800, 0x8000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x4000, 0x8800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, + 0x5000, 0x5000, 0x4800, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, + 0x2800, 0x2800, 0x2800, 0x3000, 0x4000, 0xA000, 0x5800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x5000, 0x5800, 0x2800, 0x2800, 0x2800, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x3800, 0x6000, + 0x3800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x7800, 0x5000, 0x3000, 0x3000, 0x3800, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x9000, 0x4000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, + 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x7000, 0x6000, 0x5000, 0x5000, 0x5000, 0x5000, 0x4800, + 0x2800, 0x2800, 0x2000, 0x2800, 0x6800, 0x5800, 0x3800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x4000, 0x4000, 0x2800, 0x3000, 0x6000, 0x5800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x5000, 0x6800, 0x3800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x2800, + 0x3000, 0x3800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x5800, 0x7000, 0x3000, 0x3800, 0x3800, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x7800, 0x5000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, + 0x4800, 0x4800, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4000, 0x4800, 0x5000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x5000, 0x7000, 0x6800, 0x5800, 0x5800, 0x5000, 0x5000, 0x5000, + 0x2800, 0x2800, 0x2800, 0x2000, 0x8000, 0x2800, 0x2000, 0x4000, 0x4000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x4000, 0x7800, 0x5800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x5800, 0x7800, 0x4000, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, + 0x5800, 0x6000, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3800, 0x8800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x7000, 0x5800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4800, + 0x4800, 0x4800, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4000, 0x4800, 0x5800, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5000, 0x5000, + 0x2800, 0x2800, 0x2800, 0x3800, 0x7000, 0x2800, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x4000, 0x7800, 0x3800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x4000, 0x7800, 0x4000, 0x2800, 0x2800, 0x2800, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x8000, 0x4800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3800, 0x3800, 0x6000, 0x6800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4800, 0x4800, 0x4800, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, + 0x2800, 0x2800, 0x2800, 0x4800, 0x5800, 0x2800, 0x2800, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x7800, 0x3800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x3800, 0x3000, 0x2800, 0x2800, 0x2800, 0x4000, 0x7800, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x6800, 0x5800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x5800, 0x7000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, 0x5000, + 0x2800, 0x2800, 0x2800, 0x5800, 0x4800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x6000, 0x5800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x3000, + 0x9000, 0x6000, 0x2000, 0x2800, 0x2800, 0x2800, 0x5800, 0x6000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x5800, 0x6800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x5000, 0x7800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4800, 0x4800, 0x4800, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, 0x5800, 0x5800, + 0x2800, 0x2800, 0x2800, 0x4800, 0x3000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x5000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x4000, + 0x7000, 0x4000, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x5800, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x3800, 0x4000, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x4000, 0x5800, 0x3800, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x4000, 0x6000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x6000, 0x5800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x4800, + 0x5800, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x6000, 0x7000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4000, 0x6000, 0x6000, 0x6000, + 0x5000, 0x6000, 0x4000, 0x5800, 0x6000, 0x5000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5800, 0x5800, 0x5800, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x5000, 0x4000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0xF800, + 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x4800, 0x8800, 0x9000, 0x7800, 0x4000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0xA000, 0xA800, 0xA800, 0xA800, 0x6000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x5800, 0x6000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4000, 0x8000, 0xA000, 0x8000, + 0x6000, 0xB000, 0x6800, 0x5800, 0x9800, 0x8000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5800, 0x5800, 0x6000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x4000, 0x4000, 0x2800, 0x2800, 0x2800, 0x2800, 0xB800, 0xF800, 0xF800, 0xE000, 0xD000, + 0xC000, 0xB800, 0xB800, 0xC000, 0xC000, 0xB800, 0x7800, 0x4000, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x2800, 0x2800, 0xF800, + 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x7800, 0x9800, 0x9800, 0xA000, 0xA000, 0x9800, 0x9800, 0x9800, 0x9000, 0x9800, 0x9800, + 0x9800, 0x9000, 0x7800, 0x2800, 0x2800, 0x8800, 0x9000, 0x9000, 0x9000, 0x6000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0xA000, 0xB000, 0xA800, 0xA800, 0x6000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4000, 0x4800, 0x9800, 0x4000, + 0x4000, 0xA000, 0x9000, 0x5000, 0xB000, 0x8000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5800, 0x6000, + 0x2000, 0x2000, 0x2800, 0x2000, 0x2800, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0xB800, 0xF800, 0xF800, 0xF000, 0xE000, + 0xC800, 0xC000, 0xC000, 0xC000, 0xC800, 0xC800, 0xC000, 0xB800, 0x7800, 0x2800, 0x2800, 0x3800, 0x4800, 0xF800, 0xF800, 0xF800, + 0xF800, 0xF800, 0x2800, 0x2000, 0x2800, 0x7000, 0x9800, 0x9800, 0x9800, 0x9800, 0xA000, 0x9800, 0x9800, 0x9800, 0x9800, 0x9800, + 0x9800, 0x9800, 0x7800, 0x2800, 0x2800, 0x9000, 0x9000, 0x9000, 0x9000, 0x6000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0xA800, 0xB000, 0xB000, 0xB800, 0x6000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4800, 0x4800, 0x4000, 0x4000, 0x4800, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4000, 0x4800, 0x9800, 0x4000, + 0x4000, 0xA800, 0x9800, 0x8800, 0x8800, 0x8000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x5000, 0x5000, 0x5800, 0x5800, + 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x2800, 0x2800, 0xB800, 0xF800, 0xF800, 0xF800, 0xF000, + 0xE000, 0xD000, 0xC800, 0xD000, 0xC800, 0xC800, 0xC800, 0xC000, 0xB000, 0x8800, 0x2000, 0x8000, 0xA800, 0x4800, 0x2000, 0xF800, + 0x2800, 0x2800, 0x2000, 0x2000, 0x2800, 0x7000, 0x9800, 0x9800, 0x9800, 0x9800, 0xA000, 0xA000, 0xA000, 0xA000, 0xA000, 0xA000, + 0xA000, 0xA000, 0x8800, 0x2800, 0x2800, 0x5000, 0x9000, 0x9000, 0x7800, 0x3800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x4000, 0x5000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0xA800, 0xB800, 0xB800, 0xB800, 0x6800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4800, 0x4000, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x9800, 0x4000, + 0x4000, 0xB000, 0x7000, 0xA800, 0x6800, 0x8000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5800, 0x5800, + 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0xB000, 0xF800, 0xF800, 0xF800, 0xB800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x3800, 0xA000, 0xC800, 0xC000, 0xB800, 0xB000, 0x6800, 0x4000, 0x5000, 0x3000, 0x2000, 0xF800, + 0x2000, 0x2800, 0x2800, 0x2000, 0x2800, 0x7000, 0x9800, 0x9800, 0x9800, 0x7000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x5000, 0x6800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0xA800, 0xB800, 0xB800, 0xB800, 0x6800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x3800, 0x4000, 0x5800, 0x4000, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x6000, 0x4000, + 0x4000, 0x6000, 0x4000, 0x5800, 0x4800, 0x5000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5800, + 0x2000, 0x2000, 0x2000, 0x4800, 0x3000, 0x2800, 0x2000, 0x2800, 0x2800, 0x2000, 0x2800, 0xA800, 0xF000, 0xF800, 0xF800, 0xB800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0xA800, 0xC000, 0xB800, 0xB000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, + 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x7000, 0x9800, 0x9800, 0x9800, 0x7800, 0x2800, 0x2000, 0x3000, 0x4000, 0x2800, 0x2000, + 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3800, 0x4800, 0x2800, 0x3000, 0x2800, 0x2800, 0x3000, + 0x3000, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3800, 0x5800, 0x3800, 0x3800, 0xB000, 0xB800, 0xC000, 0xC000, 0x6800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x3800, 0x4000, 0x5800, 0x4800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4000, + 0x4800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5800, + 0x2000, 0x2000, 0x2000, 0x5800, 0x4800, 0x2000, 0x2000, 0x2800, 0x2800, 0x2000, 0x2800, 0xA000, 0xE800, 0xF800, 0xF800, 0xB800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x8800, 0xC000, 0xB800, 0xB800, 0xB800, 0x3000, 0x2000, 0x5800, 0xB000, 0xA000, + 0x9800, 0x8800, 0x2800, 0x2800, 0x2800, 0x7000, 0x9000, 0x9800, 0x9800, 0x7800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, + 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x8800, 0xA000, 0xA000, 0xA000, 0x7000, 0x6000, 0x2800, 0x6000, 0x8800, 0x8800, 0x9000, + 0x5800, 0x4000, 0x6000, 0x9000, 0x9000, 0x9800, 0x8800, 0x6000, 0x3000, 0x3000, 0x3000, 0x2800, 0x3000, 0x3000, 0x3000, 0x6000, + 0xA000, 0xC800, 0xC800, 0xD000, 0x8800, 0x3800, 0xB000, 0xC000, 0xC000, 0xC000, 0x6800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, + 0x7000, 0x9000, 0xB800, 0xB800, 0xB800, 0xA000, 0x8000, 0x3800, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0xB000, 0xB800, 0xA800, + 0xA000, 0x4800, 0x6800, 0x9000, 0x9800, 0x8000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5800, + 0x2000, 0x2000, 0x2800, 0x4800, 0x5800, 0x2000, 0x4000, 0x3800, 0x2000, 0x2800, 0x2800, 0x9800, 0xE000, 0xE800, 0xF000, 0xB800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x4800, 0xB800, 0xB800, 0xB000, 0xB000, 0x4000, 0x2000, 0x6000, 0xB800, 0xB000, + 0xA000, 0x8800, 0x2000, 0x2800, 0x2800, 0x7800, 0x9800, 0xA000, 0xA000, 0x7800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x9000, 0xA800, 0xA800, 0xA000, 0x7800, 0x5000, 0x2800, 0x6000, 0x9000, 0x9000, 0x9000, + 0x7800, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9800, 0x9800, 0x6800, 0x3000, 0x3000, 0x4000, 0x3000, 0x3000, 0x7000, 0xC000, + 0xC000, 0xC800, 0xC800, 0xC800, 0xD000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x7000, 0x4000, 0x4000, 0x4000, 0x4800, 0xA800, + 0xC000, 0xC000, 0xC000, 0xC000, 0xB800, 0xB800, 0xB800, 0xA800, 0x5000, 0x4000, 0x4000, 0x4800, 0x4800, 0xB000, 0xB800, 0xA800, + 0xA000, 0x7000, 0xA000, 0xA000, 0xA000, 0x8800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5800, + 0x2000, 0x2800, 0x2000, 0x3800, 0x7000, 0x2000, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x9800, 0xD000, 0xD800, 0xE000, 0xB000, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x5000, 0xB800, 0xB800, 0xB000, 0xB000, 0x3000, 0x2000, 0x6000, 0xC800, 0xC000, + 0xB000, 0x9000, 0x2800, 0x2800, 0x4000, 0x8800, 0xA000, 0xA000, 0xA000, 0x7800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x9000, 0xA800, 0xA800, 0xA800, 0x8800, 0x4000, 0x2800, 0x6800, 0x9000, 0x9800, 0x9800, + 0xA000, 0xA000, 0x9800, 0x9000, 0x9000, 0x9000, 0x9800, 0xA000, 0xA000, 0x4000, 0x3000, 0x4000, 0x4000, 0x5800, 0xB800, 0xB800, + 0xC000, 0xC000, 0xC800, 0xC800, 0xC800, 0xD000, 0xC800, 0xC000, 0xC000, 0xC000, 0x6800, 0x4000, 0x4000, 0x4000, 0xC800, 0xD000, + 0xC800, 0xC800, 0xC000, 0xC000, 0xB800, 0xB800, 0xB800, 0xB800, 0xA800, 0x4800, 0x4000, 0x4000, 0x4800, 0xA800, 0xB800, 0xA800, + 0xA800, 0xA000, 0xA000, 0xA000, 0xA800, 0x9800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, + 0x2800, 0x2800, 0x2000, 0x2800, 0x7800, 0x3000, 0x2000, 0x2000, 0x2800, 0x2000, 0x2800, 0x9800, 0xD000, 0xD000, 0xD800, 0xA800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2800, 0x8800, 0xA800, 0xB000, 0xB800, 0xA800, 0x2800, 0x2000, 0x6000, 0xD000, 0xC800, + 0xB800, 0xA000, 0x2800, 0x5800, 0x7800, 0x8000, 0xA000, 0xA800, 0xA800, 0x8000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x9000, 0xA800, 0xA800, 0xA800, 0x9000, 0x3000, 0x2800, 0x6800, 0xA000, 0xA000, 0xA000, + 0xA000, 0x7800, 0x2800, 0x2800, 0x5000, 0x9000, 0x9800, 0x9800, 0xA000, 0x7000, 0x4000, 0x6800, 0x6000, 0x9800, 0xB000, 0xB800, + 0xB800, 0xA800, 0x8000, 0x5800, 0x5000, 0xA800, 0xC800, 0xC000, 0xC000, 0xC000, 0x6800, 0x4000, 0x4000, 0xA000, 0xE800, 0xD800, + 0xD000, 0xC000, 0x7800, 0x3800, 0x4800, 0xA000, 0xC000, 0xC000, 0xC000, 0x8000, 0x4000, 0x4000, 0x4000, 0xA800, 0xB800, 0xA800, + 0xA800, 0xA000, 0x7000, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, + 0x2800, 0x2800, 0x2800, 0x2800, 0x6000, 0x4800, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x9000, 0xC000, 0xC800, 0xD000, 0xA800, + 0x2000, 0x2800, 0x2800, 0x2000, 0x2000, 0x8000, 0xA800, 0xA000, 0xA800, 0xB000, 0x8800, 0x5000, 0x2800, 0x6000, 0xC800, 0xC800, + 0xC000, 0xA800, 0x4800, 0x6000, 0x3000, 0x7800, 0xA800, 0xB000, 0xB800, 0xB800, 0xB800, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, + 0xC000, 0x9800, 0x2800, 0x2800, 0x2800, 0x9800, 0xB000, 0xA800, 0xA800, 0x8000, 0x2800, 0x2800, 0x7000, 0xA800, 0xA800, 0xA800, + 0x8800, 0x2800, 0x2800, 0x2800, 0x3000, 0x7000, 0xA000, 0xA000, 0xA000, 0x8000, 0x5000, 0x9000, 0x5800, 0xA800, 0xA800, 0xB000, + 0xB800, 0x4800, 0x7800, 0x4800, 0x3800, 0x4000, 0xB800, 0xC000, 0xC000, 0xC800, 0x6800, 0x4000, 0x4000, 0xE800, 0xF000, 0xE000, + 0xD000, 0x8000, 0x3800, 0x3800, 0x3800, 0x4800, 0xB800, 0xC000, 0xC000, 0xB800, 0x4000, 0x4000, 0x4000, 0xA800, 0xB000, 0xA800, + 0xA800, 0x6800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5800, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x4000, 0x6800, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x8000, 0xA800, 0xB800, 0xC000, 0xD000, + 0xF000, 0xF800, 0xF800, 0xE800, 0xD000, 0xB800, 0xA800, 0xA000, 0xA000, 0x9000, 0x2000, 0x2800, 0x2800, 0x6000, 0xC000, 0xC000, + 0xC000, 0xB000, 0x2800, 0x2800, 0x2800, 0x8000, 0xA800, 0xB800, 0xC000, 0xC800, 0xC800, 0xC800, 0xC800, 0xC800, 0xC800, 0xC800, + 0xC800, 0xA000, 0x2800, 0x2800, 0x2800, 0x9800, 0xB800, 0xB000, 0xB000, 0x7800, 0x2800, 0x2800, 0x7000, 0xA800, 0xB000, 0xB000, + 0x8800, 0x2800, 0x2800, 0x2800, 0x2800, 0x6800, 0xA800, 0xA800, 0xA800, 0x9000, 0x3000, 0x2800, 0x6000, 0xA800, 0xA800, 0xA800, + 0x9800, 0x3000, 0x8800, 0x3800, 0x3000, 0x3800, 0xB000, 0xC000, 0xC000, 0xC000, 0x7000, 0x4000, 0x7000, 0xF000, 0xF000, 0xE000, + 0xD000, 0x4800, 0x3800, 0x3800, 0x3800, 0x4000, 0xA000, 0xC000, 0xC000, 0xC000, 0x6000, 0x4000, 0x4000, 0xA800, 0xB000, 0xB000, + 0xB000, 0x5800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x4800, 0x4800, 0x4800, 0x4800, 0x5800, 0x5800, 0x4800, 0x5000, 0x5800, + 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x7800, 0x3000, 0x2000, 0x2000, 0x2000, 0x2000, 0x7000, 0x9000, 0xA000, 0xB000, 0xC800, + 0xE000, 0xF000, 0xF000, 0xE000, 0xD000, 0xC000, 0xB000, 0xA000, 0x7800, 0x3000, 0x2000, 0x2000, 0x2000, 0x5800, 0xC000, 0xB800, + 0xB800, 0xA800, 0x2000, 0x2800, 0x2800, 0x8000, 0xA800, 0xB800, 0xC000, 0xC800, 0xD000, 0xD000, 0xC800, 0xD000, 0xD800, 0xE000, + 0xD800, 0xA800, 0x2800, 0x2800, 0x2800, 0xA000, 0xB800, 0xB800, 0xB800, 0x6800, 0x2000, 0x2000, 0x7000, 0xB000, 0xB800, 0xB800, + 0x8800, 0x2800, 0x2800, 0x3000, 0x3800, 0x6800, 0xA800, 0xB000, 0xB000, 0x9000, 0x3000, 0x2800, 0x7000, 0xA800, 0xA800, 0xA800, + 0x8000, 0x3800, 0x8000, 0x3000, 0x3000, 0x3800, 0xB000, 0xB800, 0xB800, 0xB800, 0x6800, 0x3800, 0x8800, 0xE800, 0xE800, 0xE000, + 0xC000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x9800, 0xC800, 0xC000, 0xC000, 0x7000, 0x4000, 0x4000, 0xA800, 0xB800, 0xB800, + 0xB800, 0x5800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x6000, 0x5800, 0x5000, 0x5000, 0x5000, + 0x2000, 0x2000, 0x2000, 0x2800, 0x2000, 0x5000, 0x5800, 0x2000, 0x2000, 0x2000, 0x2000, 0x6800, 0x9000, 0x9800, 0xA800, 0xC000, + 0xD000, 0xD800, 0xE000, 0xD800, 0xD000, 0xC000, 0x7800, 0x5800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x5800, 0xC000, 0xB800, + 0xB800, 0xA800, 0x2000, 0x2000, 0x2000, 0x7800, 0xA800, 0xB800, 0xC000, 0x9800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, + 0x2000, 0x2800, 0x2000, 0x2000, 0x2800, 0xA800, 0xC000, 0xC000, 0xC000, 0x7000, 0x2000, 0x2000, 0x7800, 0xB800, 0xB800, 0xB800, + 0x8800, 0x2800, 0x2800, 0x3000, 0x3800, 0x6800, 0xA000, 0xA800, 0xB800, 0x9000, 0x3000, 0x3000, 0x7000, 0xA800, 0xA800, 0xA800, + 0x7000, 0x5000, 0x6800, 0x3000, 0x3000, 0x3000, 0xB000, 0xC000, 0xB800, 0xC000, 0x6800, 0x3800, 0x9000, 0xE000, 0xE000, 0xE000, + 0xD800, 0xD000, 0xD000, 0xD800, 0xD800, 0xD800, 0xD800, 0xD000, 0xC800, 0xC000, 0x8000, 0x4000, 0x4000, 0xA800, 0xC000, 0xC000, + 0xC000, 0x5800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x4800, 0x4800, 0x6800, 0x6800, 0x5000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x7800, 0x3000, 0x2800, 0x2000, 0x2000, 0x7000, 0x9800, 0x9800, 0xA000, 0x8800, + 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x5800, 0xC000, 0xB800, + 0xB000, 0xA000, 0x2000, 0x2000, 0x2000, 0x8000, 0xB000, 0xB800, 0xC000, 0x9000, 0x2800, 0x2800, 0x2000, 0x2800, 0x2800, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0xB000, 0xD000, 0xD000, 0xC800, 0x7000, 0x1800, 0x2000, 0x7800, 0xC000, 0xC000, 0xC000, + 0x9000, 0x2800, 0x2800, 0x2800, 0x2800, 0x6800, 0xA000, 0xA000, 0xA800, 0x8800, 0x3000, 0x3000, 0x7000, 0xA000, 0xA000, 0xA000, + 0x7000, 0x6000, 0x5800, 0x3000, 0x3000, 0x3000, 0xB000, 0xC000, 0xC000, 0xC000, 0x6800, 0x3800, 0x8800, 0xD800, 0xD800, 0xD800, + 0xD000, 0xD000, 0xD000, 0xD800, 0xD800, 0xE000, 0xE000, 0xE000, 0xD800, 0xD000, 0x8000, 0x4000, 0x4000, 0xB000, 0xC000, 0xC000, + 0xC800, 0x5800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x5000, 0x6000, 0x2000, 0x2000, 0x2000, 0x7800, 0xA000, 0xA000, 0xA000, 0x8000, + 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x5800, 0xB800, 0xB000, + 0xA800, 0xA000, 0x2800, 0x2800, 0x2800, 0x8000, 0xB000, 0xB000, 0xB800, 0x9000, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0xB000, 0xD800, 0xE000, 0xE800, 0x7800, 0x2800, 0x2000, 0x8000, 0xC000, 0xC000, 0xC000, + 0x9000, 0x2800, 0x2800, 0x2800, 0x2800, 0x7000, 0xA800, 0xA000, 0xA000, 0x8800, 0x3000, 0x3000, 0x7000, 0xA000, 0xA000, 0xA800, + 0x8000, 0x7800, 0x4000, 0x3000, 0x3000, 0x3000, 0xB000, 0xC000, 0xC000, 0xC800, 0x6800, 0x3800, 0x8800, 0xD000, 0xD000, 0xD000, + 0xD000, 0xD000, 0xD000, 0xD800, 0xD800, 0xE000, 0xE000, 0xE000, 0xE000, 0xD800, 0x8800, 0x3800, 0x4000, 0xB800, 0xC000, 0xC800, + 0xC800, 0x5800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x7000, 0x3800, 0x2000, 0x2000, 0x7800, 0x9800, 0x9800, 0xA000, 0x8000, + 0x2800, 0x2000, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x5000, 0xB000, 0xB000, + 0xA800, 0x9800, 0x2000, 0x2000, 0x2800, 0x8000, 0xA800, 0xA800, 0xB000, 0x8800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0xB800, 0xE000, 0xF000, 0xF000, 0x9800, 0x3800, 0x2000, 0x8000, 0xC800, 0xC800, 0xC800, + 0x9800, 0x2800, 0x2800, 0x2800, 0x2800, 0x7000, 0xA800, 0xA000, 0xA000, 0x8800, 0x3000, 0x3000, 0x6000, 0xA800, 0xA800, 0xA800, + 0x9800, 0x8000, 0x3000, 0x3000, 0x3000, 0x3000, 0xB000, 0xC000, 0xC000, 0xC800, 0x6800, 0x3800, 0x6800, 0xC800, 0xC800, 0xC800, + 0xB800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x3800, 0x3800, 0x3800, 0x3800, 0xC000, 0xC800, 0xC800, + 0xC000, 0x5800, 0x4000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x3800, 0x7000, 0x2800, 0x2800, 0x7000, 0x9000, 0x9000, 0x9000, 0x7800, + 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x5800, 0xB000, 0xB800, + 0xB000, 0x9800, 0x2000, 0x2000, 0x2800, 0x8000, 0xA800, 0xA800, 0xA800, 0x8000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0xC000, 0xE000, 0xF000, 0xF000, 0x9000, 0x2000, 0x2000, 0x8800, 0xD000, 0xD000, 0xC800, + 0x9800, 0x3000, 0x2800, 0x2800, 0x2800, 0x7000, 0xA800, 0xA000, 0xA000, 0x8800, 0x3000, 0x3000, 0x3800, 0xB000, 0xB000, 0xB000, + 0xB000, 0x7000, 0x3000, 0x3000, 0x3000, 0x4000, 0xB800, 0xC000, 0xC000, 0xC800, 0x6800, 0x3000, 0x3800, 0xC000, 0xC800, 0xC800, + 0xC800, 0x6800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x5800, 0x6800, 0x3800, 0x3800, 0x3800, 0x3800, 0xC000, 0xC800, 0xC000, + 0xC000, 0x5800, 0x4000, 0x4800, 0x4800, 0x4800, 0x4000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, 0x5000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x5800, 0x6000, 0x2800, 0x6800, 0x9000, 0x9000, 0x9000, 0x7000, + 0x2800, 0x2800, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x5800, 0xB000, 0xB000, + 0xB800, 0xA000, 0x2000, 0x2000, 0x2800, 0x7800, 0xA000, 0xA000, 0xA000, 0x7800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, + 0x2000, 0x2800, 0x2800, 0x2800, 0x6000, 0xB800, 0xE000, 0xF000, 0xF800, 0x8800, 0x2000, 0x2000, 0x8800, 0xD000, 0xD000, 0xC800, + 0xA000, 0x3800, 0x2800, 0x2800, 0x2800, 0x7000, 0xA800, 0xA000, 0xA000, 0x8800, 0x3000, 0x3000, 0x3000, 0x9800, 0xB800, 0xC000, + 0xB800, 0xA800, 0x5000, 0x3000, 0x4800, 0x9800, 0xC000, 0xC000, 0xC000, 0xC000, 0x6800, 0x3000, 0x3000, 0x8800, 0xC800, 0xD000, + 0xD000, 0xD000, 0x9000, 0x3800, 0x3800, 0x3800, 0x9000, 0xD000, 0xD000, 0x6800, 0x3800, 0x3800, 0x3800, 0xC000, 0xC800, 0xC000, + 0xC000, 0x5000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, 0x5800, 0x5800, 0x5000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x6800, 0x5000, 0x6000, 0x8800, 0x9000, 0x9000, 0x7000, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x2800, 0x2800, 0x5000, 0xA800, 0xB000, + 0xB800, 0xA000, 0x2000, 0x2000, 0x2000, 0x7800, 0xA000, 0xA000, 0xA000, 0x7800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, + 0x2000, 0x2800, 0x2800, 0x5000, 0x7000, 0xB800, 0xE800, 0xF800, 0xF800, 0x8800, 0x2000, 0x2800, 0x8800, 0xD000, 0xD000, 0xC800, + 0x9800, 0x2800, 0x2800, 0x2800, 0x2800, 0x7000, 0xB000, 0xA800, 0xA000, 0x8800, 0x3000, 0x3000, 0x3000, 0x5000, 0xC000, 0xC000, + 0xC000, 0xB800, 0xB800, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x3000, 0x3000, 0x3000, 0xA800, 0xD000, + 0xD000, 0xD800, 0xD800, 0xE000, 0xE000, 0xE000, 0xE000, 0xD800, 0xD800, 0xC800, 0x4800, 0x3800, 0x3800, 0xC000, 0xC800, 0xC000, + 0xC000, 0x5800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x5000, 0x5000, 0x5000, 0x5000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x7000, 0x7000, 0x8800, 0x8800, 0x8800, 0x6800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x5000, 0xA000, 0xB000, + 0xB800, 0xA800, 0x2000, 0x2000, 0x2000, 0x8000, 0xA000, 0xA800, 0xA000, 0x7800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2000, 0x4800, 0x7000, 0x3000, 0xB800, 0xF000, 0xF800, 0xF800, 0x9000, 0x2800, 0x2800, 0x9000, 0xD800, 0xD000, 0xD000, + 0x9800, 0x2800, 0x2800, 0x2800, 0x2800, 0x7000, 0xB000, 0xA800, 0xA000, 0x8800, 0x3000, 0x3000, 0x3000, 0x3000, 0x7800, 0xC800, + 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xB800, 0xB000, 0xC000, 0xC000, 0xC000, 0x6000, 0x3000, 0x3000, 0x3000, 0x3000, 0xA800, + 0xD000, 0xD800, 0xE000, 0xE000, 0xE800, 0xE800, 0xE000, 0xE000, 0xC800, 0x6800, 0x3800, 0x3800, 0x3800, 0xB800, 0xC800, 0xC000, + 0xC000, 0x6000, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x4800, 0x5000, 0x5000, + 0x2000, 0x2000, 0x2000, 0x2800, 0x2000, 0x2000, 0x2000, 0x2800, 0x2000, 0x2000, 0x3000, 0x8000, 0x8800, 0x8800, 0x8800, 0x6800, + 0x2800, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x5000, 0xA000, 0xB000, + 0xB800, 0xA800, 0x2000, 0x2800, 0x2800, 0x8000, 0xA800, 0xA800, 0xA800, 0x8000, 0x2800, 0x2000, 0x2000, 0x2000, 0x2800, 0x3000, + 0x2800, 0x4800, 0x7000, 0x3000, 0x2000, 0xB800, 0xF000, 0xF800, 0xF800, 0x9000, 0x2800, 0x2800, 0x9800, 0xE000, 0xE000, 0xD800, + 0xA000, 0x2800, 0x2800, 0x2800, 0x2800, 0x7000, 0xB800, 0xB000, 0xA800, 0x9000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x9000, + 0x9800, 0xC000, 0xC000, 0xC000, 0x8800, 0x5000, 0x8000, 0xC000, 0xC000, 0xC000, 0x6000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x6800, 0x9800, 0xE000, 0xE000, 0xE800, 0xE800, 0xB800, 0x8800, 0x3800, 0x4000, 0x3800, 0x3800, 0x3800, 0xB800, 0xC000, 0xC000, + 0xC000, 0x5000, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x5000, 0x5000, 0x5000, + 0x2800, 0x2000, 0x2800, 0x2800, 0x2000, 0x2000, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x3000, 0x7000, 0x5000, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, + 0x2800, 0x2800, 0x2000, 0x2800, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, + 0x5000, 0x7000, 0x6000, 0x5800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x2800, 0x3000, 0x3000, 0x2800, 0x4800, 0x7800, + 0x3000, 0x3000, 0x3000, 0x3800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3800, 0x3000, 0x3800, 0x5800, 0x6000, 0x5800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4800, 0x4000, 0x4800, 0x5000, 0x5000, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x6800, 0x6000, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2800, 0x2000, 0x2000, + 0x2000, 0x2800, 0x2800, 0x2000, 0x5000, 0x4000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x6000, + 0x6800, 0x2800, 0x3800, 0x3800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x7000, 0x5000, + 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3800, 0x3800, 0x3800, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x3800, 0x4000, 0x4000, 0x5800, 0x5000, 0x4000, 0x4800, 0x5000, 0x5000, + 0x2000, 0x2800, 0x2800, 0x2000, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x5800, 0x7000, + 0x4000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x2800, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2800, 0x2800, 0x4800, 0x4000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x4000, 0x7000, 0x5800, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x4000, 0x8000, 0x3000, + 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x4000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4800, 0x5000, 0x5000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x4000, + 0x7000, 0x6000, 0x2800, 0x2000, 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x3000, 0x3800, 0x2800, 0x2000, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x6000, 0x7000, 0x4000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x7000, 0x5800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4800, 0x4800, 0x5000, 0x5000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2800, 0x5000, 0x7800, 0x5800, 0x3000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x5800, 0x7800, 0x5000, 0x2800, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x4000, 0x8000, 0x3000, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4800, 0x4800, 0x5000, 0x5000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2800, 0x6800, 0x6800, 0x7000, 0x6800, 0x4800, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x4800, 0x6800, 0x7800, 0x5000, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x1800, 0x1800, 0x3000, 0x3000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x7000, 0x5000, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3000, 0x3000, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4800, 0x5000, 0x5000, + 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x4000, 0x2800, 0x2000, 0x4000, 0x6000, 0x7800, 0x7000, 0x5800, 0x4800, 0x3000, 0x2000, 0x2000, 0x2000, 0x2800, + 0x2800, 0x2800, 0x3000, 0x4800, 0x5800, 0x7000, 0x7800, 0x6000, 0x4000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x5000, 0x7800, 0x3000, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3000, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4800, 0x4800, 0x5000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, + 0x2000, 0x2000, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x3800, 0x4800, 0x5800, 0x4800, 0x2000, 0x2000, 0x2000, 0x2800, + 0x2800, 0x2800, 0x4800, 0x5800, 0x4800, 0x3800, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x8000, 0x4000, 0x2800, 0x2800, 0x3000, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, + 0x3800, 0x4800, 0x5800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x3800, 0x4000, 0x4000, 0x4800, 0x4800, + 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x2800, 0x4000, + 0x2000, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x3000, 0x5000, 0x3000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x6000, 0x6800, 0x3000, 0x3000, 0x2800, 0x2800, + 0x4000, 0x3800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x5800, 0x7800, 0x4000, 0x3800, 0x3800, 0x3800, 0x4000, 0x4800, 0x4000, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, + 0x4000, 0x4000, 0x4000, 0x4000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, + 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x4000, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x4800, 0x8000, 0x3000, 0x3000, 0x3000, 0x2800, 0x2800, + 0x6000, 0x5000, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x4000, 0x4000, 0x4000, 0x4000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x3000, 0x8000, 0x4000, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, + 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x4000, 0x4000, 0x4000, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x5800, 0x3800, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x3000, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x7000, 0x6000, 0x2800, 0x3000, 0x2800, 0x2800, 0x3000, 0x2800, + 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3000, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x3800, 0x3800, 0x3800, 0x4000, + 0x4000, 0x3800, 0x4000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x3800, 0x3800, 0x4000, 0x4000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x3800, 0xA000, 0x5800, 0x1800, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x3000, 0x2800, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x5800, 0x7000, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x3800, 0x3800, 0x4800, 0x4000, 0x4000, 0x3800, 0x3800, 0x3800, 0x3800, 0x8800, + 0x8000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x1800, 0x1800, + 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2000, 0x2800, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x4800, 0x7800, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x5800, 0x4800, 0x3800, 0x4000, 0x3800, 0x3800, 0x3800, 0x5800, + 0x5000, 0x4000, 0x4800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, 0x2000, 0x1800, + 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x1800, 0x2000, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x4000, 0x8000, 0x3800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x3000, 0x4000, 0x5800, 0x2000, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x3800, 0x4000, 0x4000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, + 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x3800, 0x3800, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x3000, 0x3000, 0x2800, 0x2800, 0x4000, 0x8000, 0x4800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, + 0x2000, 0x3800, 0x3000, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x4800, 0x4800, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, + 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, 0x6800, 0x5800, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x3000, 0x3000, 0x2800, 0x4000, 0x7800, 0x4800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x1800, 0x1800, 0x1800, 0x1800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x1800, 0x1800, + 0x2000, 0x3800, 0x3800, 0x2000, 0x1800, 0x1800, 0x2000, 0x2800, 0x3000, 0x3000, 0x3000, 0x2000, 0x2000, 0x2800, 0x4800, 0x4800, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x2000, 0x1800, 0x1800, 0x1800, + 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x3000, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x4000, 0x8000, 0x5000, 0x2800, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x4000, 0x5000, 0x3800, 0x3000, 0x3800, 0x3800, + 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x1800, 0x1800, 0x1800, 0x1800, 0x3000, 0x3800, 0x3800, 0x3800, 0x2800, 0x1800, 0x2000, + 0x3000, 0x3800, 0x3800, 0x2000, 0x1800, 0x1800, 0x3000, 0x4000, 0x4000, 0x4000, 0x3800, 0x2000, 0x2000, 0x3800, 0x4800, 0x5000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x1800, 0x1800, 0x1800, + 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x4000, 0x8000, 0x4800, 0x2800, 0x2800, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x3000, 0x3800, 0x3000, 0x2800, 0x3000, + 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x4000, 0x3800, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x1800, 0x3000, + 0x3800, 0x3800, 0x3800, 0x2000, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2800, 0x2000, 0x2000, 0x3800, 0x5000, 0x4800, 0x4800, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, + 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, + 0x2800, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x4800, 0x8000, 0x4000, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x3000, + 0x3800, 0x3800, 0x3800, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x3800, 0x4800, 0x4800, 0x4000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, + 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x3000, 0x5000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x5800, + 0x7800, 0x4000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, + 0x3000, 0x3800, 0x3800, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x1800, 0x2800, 0x2800, 0x3800, 0x4800, 0x4800, + 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, + 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x3800, 0x5000, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x6800, 0x7000, + 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x2800, 0x2800, 0x2800, 0x2000, 0x1800, 0x1800, + 0x2000, 0x3000, 0x3800, 0x2000, 0x1800, 0x1800, 0x2000, 0x2800, 0x3800, 0x3800, 0x2800, 0x2000, 0x2000, 0x2000, 0x4800, 0x4800, + 0x7000, 0x3800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x1800, 0x1800, + 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x4000, 0x7800, 0x5800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x1800, 0x1800, 0x1800, 0x1800, 0x3000, 0x3000, 0x3000, 0x3000, 0x2000, 0x1800, 0x1800, + 0x2000, 0x3000, 0x3000, 0x2000, 0x1800, 0x1800, 0x2800, 0x3800, 0x3800, 0x3800, 0x3800, 0x1800, 0x2000, 0x2000, 0x4000, 0x4000, + 0x3800, 0x7000, 0x5800, 0x2000, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x1800, 0x1800, + 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2000, 0x2800, 0x2800, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x6000, 0x7800, 0x4000, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3800, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x1800, 0x1800, 0x1800, + 0x2000, 0x3000, 0x3000, 0x2000, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x1800, 0x2000, 0x4000, 0x4000, + 0x2000, 0x2800, 0x5800, 0x7000, 0x4000, 0x2000, 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, + 0x1800, 0x1800, 0x2000, 0x2000, 0x1800, 0x2000, 0x2800, 0x2000, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x4800, 0x7800, 0x6000, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, + 0x2000, 0x3000, 0x3000, 0x2000, 0x1800, 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x3800, 0x4000, + 0x2000, 0x2000, 0x2000, 0x3800, 0x6800, 0x6800, 0x4000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x1800, 0x3000, 0x3000, 0x1800, 0x1800, 0x2000, 0x2000, 0x1800, 0x2000, + 0x2800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3800, 0x7000, 0x7000, 0x3800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, + 0x2000, 0x2000, 0x2800, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x2800, 0x3000, 0x3000, 0x3000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x1800, 0x1800, + 0x2800, 0x3000, 0x3000, 0x2000, 0x1800, 0x1800, 0x1800, 0x2800, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x3800, 0x4000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x4800, 0x7800, 0x5800, 0x2800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x2800, 0x6000, 0x3800, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3800, 0x6800, 0x7800, 0x4800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, + 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2000, 0x2800, + 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x2800, 0x2800, 0x2800, 0x2800, 0x3800, 0x4000, 0x4000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x4000, 0x6800, 0x5800, 0x3000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x5800, 0xA000, 0x3800, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x1800, + 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x4000, 0x6800, 0x7800, 0x5000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, + 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, + 0x1800, 0x2000, 0x1800, 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x3800, 0x6000, 0x6800, 0x4800, 0x2800, 0x1800, 0x1800, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x3800, 0x2800, 0x1800, 0x2000, 0x1800, 0x2000, 0x1800, 0x1800, + 0x1800, 0x2000, 0x2000, 0x1800, 0x2000, 0x2000, 0x2800, 0x2800, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x3000, 0x5000, 0x7800, 0x7000, 0x4800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x3800, 0x3800, 0x2000, 0x2800, 0x2800, 0x3800, 0x3000, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x1800, 0x2000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x4800, 0x4000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x4000, 0x4000, 0x4000, + 0x2000, 0x1800, 0x1800, 0x1800, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x3000, 0x5000, 0x7000, 0x6000, 0x4000, + 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x1800, 0x1800, 0x2800, 0x3000, + 0x3000, 0x2000, 0x1800, 0x1800, 0x2000, 0x1800, 0x2800, 0x3000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x3800, 0x5000, 0x7000, + 0x7800, 0x6000, 0x4000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x3000, 0x2000, 0x2000, 0x2800, 0x3000, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x1800, 0x1800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3000, 0x3000, 0x3000, 0x3800, 0x4000, 0x4000, 0x3800, + 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x3800, 0x5800, + 0x7000, 0x6800, 0x5800, 0x4000, 0x2800, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x1800, 0x3000, 0x4000, + 0x4800, 0x2000, 0x1800, 0x1800, 0x2800, 0x4800, 0x2800, 0x2000, 0x2800, 0x3000, 0x4800, 0x6000, 0x7800, 0x7800, 0x6000, 0x4000, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2800, 0x2800, + 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x1800, 0x2000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x1800, 0x1800, 0x1800, + 0x2000, 0x2800, 0x1800, 0x1800, 0x1800, 0x1800, 0x2800, 0x3800, 0x3000, 0x1800, 0x1800, 0x1800, 0x3000, 0x4000, 0x4000, 0x4000, + 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, + 0x2000, 0x3000, 0x4000, 0x5800, 0x7000, 0x7000, 0x6000, 0x5000, 0x4800, 0x4000, 0x3800, 0x2800, 0x1800, 0x1800, 0x1800, 0x1800, + 0x1800, 0x2000, 0x2800, 0x3000, 0x4800, 0x6000, 0x5800, 0x6800, 0x7800, 0x7800, 0x6800, 0x5000, 0x3800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x3000, 0x3000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x4000, + 0x3000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x1800, 0x1800, 0x3800, 0x3800, 0x3000, 0x3000, 0x2800, 0x1800, 0x2000, 0x2000, 0x1800, + 0x2000, 0x2800, 0x1800, 0x2000, 0x2000, 0x1800, 0x2800, 0x3000, 0x1800, 0x2800, 0x2800, 0x2800, 0x3800, 0x3800, 0x4000, 0x4000, + 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, + 0x2000, 0x2000, 0x2000, 0x1800, 0x1800, 0x2000, 0x3000, 0x4000, 0x4800, 0x6000, 0x6800, 0x4000, 0x1800, 0x1800, 0x1800, 0x1800, + 0x1800, 0x2000, 0x4000, 0x6000, 0x5800, 0x4800, 0x4800, 0x3800, 0x2800, 0x2800, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, + 0x2800, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x1800, 0x1800, 0x3000, 0x3800, 0x3000, 0x3000, 0x2800, 0x1800, 0x1800, 0x2000, 0x1800, + 0x2000, 0x2800, 0x1800, 0x2000, 0x2000, 0x2000, 0x3000, 0x2800, 0x1800, 0x2800, 0x2800, 0x2800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x1800, 0x2000, 0x1800, 0x2000, 0x2000, 0x2000, 0x1800, 0x1800, + 0x1800, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x1800, 0x1800, 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, + 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, + 0x2000, 0x2800, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x1800, 0x2000, 0x2800, 0x2800, 0x3000, 0x3000, 0x2800, 0x1800, 0x1800, 0x1800, 0x1800, + 0x2000, 0x2800, 0x1800, 0x1800, 0x1800, 0x1800, 0x3000, 0x2800, 0x2000, 0x1800, 0x1800, 0x1800, 0x3000, 0x3800, 0x3800, 0x4000, + 0x1800, 0x1800, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x1800, + 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, + 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2000, 0x2800, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x5000, 0x6000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x1800, 0x2000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x1800, 0x2000, 0x2800, 0x1800, + 0x2000, 0x2800, 0x1800, 0x2800, 0x2800, 0x1800, 0x2800, 0x3000, 0x3000, 0x3000, 0x2800, 0x2000, 0x3000, 0x3800, 0x3800, 0x3800, + 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x1800, + 0x1800, 0x1800, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, + 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x6000, 0x7000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x4800, 0x4800, 0x2800, 0x3000, 0x2800, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x1800, 0x2000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2000, 0x1000, 0x2800, 0x3000, 0x1800, + 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x2800, 0x2000, 0x1800, 0x1800, 0x2000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, + 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2800, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3800, 0x4000, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x1800, 0x2000, 0x3000, 0x3000, 0x3000, 0x2800, 0x2800, 0x2000, 0x2800, 0x3000, 0x2000, + 0x2800, 0x2800, 0x2000, 0x2000, 0x2800, 0x2800, 0x3000, 0x2800, 0x2800, 0x2800, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x1800, 0x2000, 0x2000, 0x3000, 0x2800, 0x1800, 0x2000, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x2800, 0x3800, 0x1800, 0x1800, 0x1800, 0x1800, + 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2000, 0x2000, 0x2000, 0x2800, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, + 0x2000, 0x2000, 0x2000, 0x3000, 0x2000, 0x1800, 0x2000, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, + 0x1800, 0x1800, 0x2000, 0x2800, 0x2800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x3000, 0x3000, 0x2000, 0x2000, + 0x2000, 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x2800, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2800, 0x3800, 0x3800, + 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x1800, + 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x2000, + 0x2000, 0x1800, 0x1800, 0x2000, 0x2000, 0x1800, 0x1800, 0x1800, 0x2000, 0x2000, 0x2000, 0x2000, 0x4800, 0x4000, 0x2000, 0x2000, + 0x2800, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, + 0x2000, 0x2000, 0x2000, 0x2800, 0x2800, 0x2800, 0x2800, 0x2800, 0x3800, 0x4800, 0x2800, 0x2800, 0x3000, 0x2800, 0x2800, 0x3000, + 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x2800, 0x2800, 0x3000, 0x3000, 0x3000, + 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, 0x3800, +}; diff --git a/nixos/python-env.nix b/nixos/python-env.nix new file mode 100644 index 000000000..ed0f1be4a --- /dev/null +++ b/nixos/python-env.nix @@ -0,0 +1,42 @@ +{ config, lib, pkgs, pyproject-nix, uv2nix, pyproject-build-systems, ... }: +let + env = (import ./pkgs/uv-python.nix { + inherit pkgs lib pyproject-nix uv2nix pyproject-build-systems; + }).pifinderEnv; +in { + # libcamera overlay — enable Python bindings for picamera2 + nixpkgs.overlays = [(final: prev: { + libcamera = prev.libcamera.overrideAttrs (old: { + patches = (old.patches or []) ++ [ + ./patches/libcamera-imx290-optical-black.patch + ]; + mesonFlags = (old.mesonFlags or []) ++ [ + "-Dpycamera=enabled" + ]; + buildInputs = (old.buildInputs or []) ++ [ + final.python313 + final.python313.pkgs.pybind11 + ]; + }); + })]; + + environment.systemPackages = [ + env + pkgs.gobject-introspection + pkgs.networkmanager + pkgs.libcamera + pkgs.gpsd + ]; + + # Ensure GI_TYPELIB_PATH includes NetworkManager typelib + environment.sessionVariables.GI_TYPELIB_PATH = lib.makeSearchPath "lib/girepository-1.0" [ + pkgs.networkmanager + pkgs.glib + ]; + + # Add libcamera Python bindings to PYTHONPATH (for picamera2) + environment.sessionVariables.PYTHONPATH = "${pkgs.libcamera}/lib/python3.13/site-packages"; + + # Export the Python environment for use by services.nix + _module.args.pifinderPythonEnv = env; +} diff --git a/nixos/services.nix b/nixos/services.nix new file mode 100644 index 000000000..69d93e3af --- /dev/null +++ b/nixos/services.nix @@ -0,0 +1,770 @@ +{ config, lib, pkgs, pifinderPythonEnv, ... }: +let + cfg = config.pifinder; + cedar-detect = import ./pkgs/cedar-detect.nix { inherit pkgs; }; + pifinder-src = import ./pkgs/pifinder-src.nix { inherit pkgs; }; + boot-splash = import ./pkgs/boot-splash.nix { inherit pkgs; }; + # Point the extlinux DEFAULT at a specific camera's boot entry. Device-tree + # overlays load only at boot and the generic-extlinux builder always writes + # DEFAULT=nixos-default (the base camera), so without this a switched camera + # never actually boots its matching DTB. Boot-critical and best-effort: on any + # doubt it leaves the existing (bootable) DEFAULT untouched. + set-extlinux-default = pkgs.writeShellScriptBin "set-extlinux-default" '' + set -euo pipefail + CAM="''${1:?usage: set-extlinux-default }" + CONF=/boot/extlinux/extlinux.conf + + [ -f "$CONF" ] || { echo "set-extlinux-default: $CONF missing" >&2; exit 0; } + + if [ "$CAM" = "${cfg.cameraType}" ]; then + # The base camera is the builder's own default entry. + TARGET=nixos-default + else + # Highest-numbered generation carrying this camera's specialisation entry. + TARGET=$(grep -oE "^LABEL nixos-[0-9]+-$CAM" "$CONF" \ + | sed 's/^LABEL //' | sort -t- -k2,2n | tail -n1 || true) + fi + + if [ -z "$TARGET" ] || ! grep -qx "LABEL $TARGET" "$CONF"; then + echo "set-extlinux-default: no boot entry for '$CAM'; DEFAULT left unchanged" >&2 + exit 0 + fi + + TMP="$CONF.tmp.$$" + sed "s/^DEFAULT .*/DEFAULT $TARGET/" "$CONF" > "$TMP" + # Refuse to install anything that isn't exactly one DEFAULT pointing at a + # real LABEL — a malformed extlinux.conf would brick the next boot. + if [ "$(grep -c '^DEFAULT ' "$TMP")" = "1" ] && grep -qx "LABEL $TARGET" "$TMP"; then + mv "$TMP" "$CONF" + sync + echo "set-extlinux-default: DEFAULT -> $TARGET" >&2 + else + rm -f "$TMP" + echo "set-extlinux-default: sanity check failed; DEFAULT left unchanged" >&2 + exit 0 + fi + ''; + pifinder-switch-camera = pkgs.writeShellScriptBin "pifinder-switch-camera" '' + set -euo pipefail + CAM="''${1:?usage: pifinder-switch-camera }" + PERSIST="/var/lib/pifinder/camera-type" + mkdir -p /var/lib/pifinder + + # Accept only the base camera or a camera with a built specialisation. + if [ "$CAM" != "${cfg.cameraType}" ] && [ ! -d "/run/current-system/specialisation/$CAM" ]; then + echo "Unknown camera: $CAM" >&2 + exit 1 + fi + + # Regenerate the bootloader (installs every specialisation entry; 'boot' + # mode touches no running services), make the chosen camera the boot + # default, and persist the choice. + /run/current-system/bin/switch-to-configuration boot + ${set-extlinux-default}/bin/set-extlinux-default "$CAM" + echo "$CAM" > "$PERSIST" + + # Device-tree overlays load only at boot, so apply the new camera by + # rebooting into its entry. + exec ${pkgs.systemd}/bin/systemctl reboot + ''; +in { + options.pifinder = { + devMode = lib.mkOption { + type = lib.types.bool; + default = false; + description = "Enable development mode (NFS netboot support, etc.)"; + }; + }; + + config = { + # --------------------------------------------------------------------------- + # Camera switch wrapper (used by pifinder UI via sudo) + # --------------------------------------------------------------------------- + environment.systemPackages = with pkgs; [ + pifinder-switch-camera + set-extlinux-default + + # Diagnostic tools for SSH troubleshooting + htop + vim + tcpdump + iftop + lsof + strace + file + dnsutils # dig, nslookup + curl + usbutils # lsusb + pciutils # lspci + i2c-tools # i2cdetect (sensor debugging) + iotop + ] ++ lib.optionals cfg.devMode [ + # On-device development only (excluded from the production image). Not used + # by the NixOS image updater, which is manifest/store-path based (ADR 0003). + git # clone/pull a checkout to run live + rsync # sync a checkout from a desktop without re-copying everything + ]; + + + + # --------------------------------------------------------------------------- + # Binary substituters — Pi downloads pre-built paths, never compiles. + # Two Attic caches on cache.pifinder.eu (NixOS ADR 0001): + # pifinder-release — tagged release closures, never garbage-collected, so a + # device upgrading long after a release still resolves it. + # pifinder — dev/nightly builds, short retention. + # cache.nixos.org serves everything not built locally. + # --------------------------------------------------------------------------- + nix.settings = { + experimental-features = [ "nix-command" "flakes" ]; + substituters = [ + "https://cache.pifinder.eu/pifinder-release" + "https://cache.pifinder.eu/pifinder" + "https://cache.nixos.org" + ]; + trusted-public-keys = [ + # Attic cache signing keys. pifinder is the original 8UU key: the S3 + # cutover briefly rotated it (Vkem), but nothing deployed trusted the new + # key so the whole fleet was stranded — the cache and this config were + # restored to 8UU. pifinder-release was minted fresh with the cutover (no + # device trusted a release key before). Real keys — never swap one for a + # placeholder; invalid base64 aborts every nix op and bricks upgrades. + "pifinder:8UU/O3oLkaJHHUyqEcPGl+9F1m4MqDca39Ewl49jBmE=" + "pifinder-release:WG/Fw1cIX7YpwfWrbWTP5eCzn3bz6AaicW5qKxLKpoM=" + "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" + ]; + }; + + # --------------------------------------------------------------------------- + # SD card optimizations + # --------------------------------------------------------------------------- + + # Keep 2 generations max in bootloader + boot.loader.generic-extlinux-compatible.configurationLimit = 2; + + nix.gc = { + automatic = true; + dates = "weekly"; + options = "--delete-older-than 3d"; + }; + # Disable store optimization on NFS (hard links cause issues) + nix.settings.auto-optimise-store = !cfg.devMode; + + boot.tmp.useTmpfs = true; + boot.tmp.tmpfsSize = "200M"; + + services.journald.extraConfig = '' + Storage=volatile + RuntimeMaxUse=50M + ''; + + zramSwap = { + enable = true; + memoryPercent = 50; + }; + + fileSystems."/" = lib.mkDefault { + device = "/dev/disk/by-label/NIXOS_SD"; + fsType = "ext4"; + options = [ "noatime" "nodiratime" ]; + }; + + # --------------------------------------------------------------------------- + # Tmpfiles — runtime directory for upgrade ref file + # --------------------------------------------------------------------------- + systemd.tmpfiles.rules = [ + "d /run/pifinder 0755 pifinder users -" + ]; + + # --------------------------------------------------------------------------- + # PWM permissions setup for keypad backlight + # --------------------------------------------------------------------------- + systemd.services.pwm-permissions = { + description = "Set PWM sysfs permissions for pifinder"; + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + }; + script = '' + # Export PWM channels: 1 (GPIO 13, keypad backlight) and 0 (GPIO 12, + # rev-4 buzzer — harmless no-op wiring on rev-3). + for ch in 0 1; do + if [ ! -d /sys/class/pwm/pwmchip0/pwm$ch ]; then + echo $ch > /sys/class/pwm/pwmchip0/export || true + sleep 0.5 + fi + done + # sysfs doesn't support chgrp, so make files world-writable + chmod 0666 /sys/class/pwm/pwmchip0/export /sys/class/pwm/pwmchip0/unexport + for ch in 0 1; do + if [ -d /sys/class/pwm/pwmchip0/pwm$ch ]; then + chmod 0666 /sys/class/pwm/pwmchip0/pwm$ch/{enable,period,duty_cycle,polarity} + fi + done + # Red PWR LED — the app turns it off for night vision (sys_utils + # set_power_led writes these directly, no sudo). + if [ -d /sys/class/leds/PWR ]; then + chmod 0666 /sys/class/leds/PWR/trigger /sys/class/leds/PWR/brightness + fi + ''; + }; + + # --------------------------------------------------------------------------- + # Nix DB registration (first boot after migration) + # --------------------------------------------------------------------------- + # The migration tarball includes /nix-path-registration with store path data. + # Load it into the Nix DB so nix-store and nixos-rebuild work correctly. + systemd.services.nix-path-registration = { + description = "Load Nix store path registration from migration"; + after = [ "local-fs.target" ]; + before = [ "nix-daemon.service" ]; + wantedBy = [ "multi-user.target" ]; + unitConfig.ConditionPathExists = "/nix-path-registration"; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + }; + path = with pkgs; [ nix coreutils ]; + script = '' + nix-store --load-db < /nix-path-registration + rm /nix-path-registration + ''; + }; + + # --------------------------------------------------------------------------- + # Repair /nix/store ownership before NetworkManager starts + # --------------------------------------------------------------------------- + # NetworkManager (like other security-sensitive plugin loaders) silently + # refuses to load any plugin file not owned by root. Tarball-based migration + # and single-user nix imports can leave /nix/store paths owned by a non-root + # uid; NM then drops its wifi device plugin entirely — wlan0 shows as + # "unmanaged", WIFI-HW as "missing", and no wifi client connection ever comes + # up. Normalise ownership back to root before NM reads its plugins. Idempotent + # and cheap on a clean store (early-exits without touching the ro mount). + systemd.services.fix-nix-store-ownership = { + description = "Normalise /nix/store ownership to root (NM rejects non-root plugins)"; + after = [ "local-fs.target" ]; + before = [ "NetworkManager.service" ]; + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + }; + path = with pkgs; [ util-linux findutils coreutils ]; + script = '' + set -u + if [ -z "$(find /nix/store -mindepth 1 -maxdepth 1 ! -uid 0 -print -quit)" ] \ + && [ "$(stat -c %u /nix/var/nix/db)" = 0 ]; then + exit 0 + fi + echo "normalising non-root /nix/store ownership" + # /nix/store is a read-only bind mount of the same device as /. The + # remount MUST carry "bind" so it flips only this mount's per-mount + # ro flag; a plain "remount,ro" would flip the shared superblock and + # take / (and /nix/var) read-only with it. + remounted=0 + if findmnt -no OPTIONS /nix/store | grep -qw ro; then + if mount -o remount,bind,rw /nix/store; then + remounted=1 + else + echo "WARNING: could not remount /nix/store rw; skipping repair" + exit 0 + fi + fi + find /nix/store -mindepth 1 -maxdepth 1 ! -uid 0 -exec chown -R 0:0 {} + || true + chown 0:0 /nix/var/nix/db || true + if [ "$remounted" = 1 ]; then + mount -o remount,bind,ro /nix/store || true + fi + echo "store ownership normalised" + ''; + }; + + # --------------------------------------------------------------------------- + # PiFinder source + data directory setup + # --------------------------------------------------------------------------- + system.activationScripts.pifinder-home = lib.stringAfter [ "users" ] '' + # Create writable data directory + mkdir -p /home/pifinder/PiFinder_data + chown pifinder:users /home/pifinder/PiFinder_data + + # Symlink immutable source tree from Nix store + # Database is opened read-only, so no need for writable copy + PFHOME=/home/pifinder/PiFinder + + # Remove existing directory (not symlink) to allow symlink creation + if [ -e "$PFHOME" ] && [ ! -L "$PFHOME" ]; then + rm -rf "$PFHOME" + fi + + # Create symlink to immutable Nix store path + ln -sfT ${pifinder-src} "$PFHOME" + ''; + + # --------------------------------------------------------------------------- + # Sudoers — pifinder user can start upgrade and restart services + # --------------------------------------------------------------------------- + # Polkit rules for pifinder user (D-Bus hostname changes, NetworkManager) + security.polkit.extraConfig = '' + polkit.addRule(function(action, subject) { + if (subject.user == "pifinder") { + // Allow hostname changes via systemd-hostnamed + if (action.id == "org.freedesktop.hostname1.set-static-hostname" || + action.id == "org.freedesktop.hostname1.set-hostname") { + return polkit.Result.YES; + } + // Allow NetworkManager control + if (action.id.indexOf("org.freedesktop.NetworkManager") == 0) { + return polkit.Result.YES; + } + // Allow reboot/shutdown via D-Bus (logind) + if (action.id == "org.freedesktop.login1.reboot" || + action.id == "org.freedesktop.login1.reboot-multiple-sessions" || + action.id == "org.freedesktop.login1.power-off" || + action.id == "org.freedesktop.login1.power-off-multiple-sessions") { + return polkit.Result.YES; + } + } + }); + ''; + + security.sudo.extraRules = [{ + users = [ "pifinder" ]; + commands = [ + { command = "/run/current-system/sw/bin/systemctl start --no-block pifinder-upgrade.service"; options = [ "NOPASSWD" ]; } + { command = "/run/current-system/sw/bin/systemctl start pifinder-upgrade.service"; options = [ "NOPASSWD" ]; } + { command = "/run/current-system/sw/bin/systemctl reset-failed pifinder-upgrade.service"; options = [ "NOPASSWD" ]; } + { command = "/run/current-system/sw/bin/systemctl restart pifinder.service"; options = [ "NOPASSWD" ]; } + { command = "/run/current-system/sw/bin/systemctl stop pifinder.service"; options = [ "NOPASSWD" ]; } + { command = "/run/current-system/sw/bin/systemctl start pifinder.service"; options = [ "NOPASSWD" ]; } + { command = "/run/current-system/sw/bin/systemctl restart avahi-daemon.service"; options = [ "NOPASSWD" ]; } + { command = "/run/current-system/sw/bin/avahi-set-host-name *"; options = [ "NOPASSWD" ]; } + { command = "/run/current-system/sw/bin/shutdown -r now"; options = [ "NOPASSWD" ]; } + { command = "/run/current-system/sw/bin/shutdown now"; options = [ "NOPASSWD" ]; } + { command = "/run/current-system/sw/bin/chpasswd"; options = [ "NOPASSWD" ]; } + { command = "/run/current-system/sw/bin/hostname *"; options = [ "NOPASSWD" ]; } + { command = "/run/current-system/sw/bin/pifinder-switch-camera imx296"; options = [ "NOPASSWD" ]; } + { command = "/run/current-system/sw/bin/pifinder-switch-camera imx462"; options = [ "NOPASSWD" ]; } + { command = "/run/current-system/sw/bin/pifinder-switch-camera imx477"; options = [ "NOPASSWD" ]; } + ]; + }]; + + # --------------------------------------------------------------------------- + # Cedar Detect star detection gRPC server + # --------------------------------------------------------------------------- + systemd.services.cedar-detect = { + description = "Cedar Detect Star Detection Server"; + after = [ "basic.target" ]; + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + Type = "idle"; + User = "pifinder"; + ExecStart = "${cedar-detect}/bin/cedar-detect-server --port 50551"; + Restart = "on-failure"; + RestartSec = 5; + }; + }; + + # --------------------------------------------------------------------------- + # Early boot splash — show static welcome image, pifinder overwrites when ready + # --------------------------------------------------------------------------- + systemd.services.boot-splash = { + description = "Early boot splash screen"; + wantedBy = [ "sysinit.target" ]; + after = [ "systemd-modules-load.service" ]; + wants = [ "systemd-modules-load.service" ]; + unitConfig.DefaultDependencies = false; + serviceConfig = { + Type = "oneshot"; + ExecStart = pkgs.writeShellScript "boot-splash-wait" '' + for i in $(seq 1 40); do + [ -e /dev/spidev0.0 ] && exec ${boot-splash}/bin/boot-splash --static + sleep 0.25 + done + echo "SPI device never appeared" >&2 + exit 1 + ''; + }; + }; + + # --------------------------------------------------------------------------- + # Main PiFinder application + # --------------------------------------------------------------------------- + systemd.services.pifinder = { + description = "PiFinder"; + after = [ "basic.target" "cedar-detect.service" "gpsd.socket" ]; + wants = [ "cedar-detect.service" "gpsd.socket" ]; + wantedBy = [ "multi-user.target" ]; + path = let + # Runtime paths not in the nix store — symlinks resolve at boot, not build time + wrapperBins = pkgs.runCommand "wrapper-bins" {} '' + mkdir -p $out + ln -s /run/wrappers/bin $out/bin + ''; + systemBins = pkgs.runCommand "system-bins" {} '' + mkdir -p $out + ln -s /run/current-system/sw/bin $out/bin + ''; + in [ wrapperBins systemBins pkgs.gpsd ]; + environment = { + PIFINDER_HOME = "/home/pifinder/PiFinder"; + PIFINDER_DATA = "/home/pifinder/PiFinder_data"; + GI_TYPELIB_PATH = lib.makeSearchPath "lib/girepository-1.0" [ + pkgs.networkmanager + pkgs.glib.out # Use .out to get the main package with typelibs, not glib-bin + pkgs.gobject-introspection + ]; + # libcamera Python bindings for picamera2 + PYTHONPATH = "${pkgs.libcamera}/lib/python3.13/site-packages"; + # libcamera IPA modules path + LIBCAMERA_IPA_MODULE_PATH = "${pkgs.libcamera}/lib/libcamera"; + }; + serviceConfig = { + # The app sends READY=1 once the UI is constructed and drawing + # (utils.sd_notify in main.py). "active" therefore means "the screen is + # live", which is what the boot watchdog's health check keys off — a + # build that starts but never turns the screen on times out, restarts, + # and fails its trial. + Type = "notify"; + # Cold start on a Pi is ~30-60s (imports dominate); leave ample slack. + TimeoutStartSec = 180; + User = "pifinder"; + Group = "users"; + WorkingDirectory = "/home/pifinder/PiFinder/python"; + ExecStart = "${pifinderPythonEnv}/bin/python -m PiFinder.main"; + # Allow binding to privileged ports (80 for web UI) + AmbientCapabilities = "CAP_NET_BIND_SERVICE"; + Restart = "on-failure"; + RestartSec = 5; + }; + }; + + # --------------------------------------------------------------------------- + # PiFinder Network Policy + # --------------------------------------------------------------------------- + # Enforces connectivity priority wired > wifi client > AP via libnm + # (PiFinder/net_policy.py). Event-driven on NetworkManager state changes; + # brings the AP up only as an offline fallback and periodically drops an + # idle AP so NM can rejoin a client network. The migration image, which has + # no Python env, uses wifi-fallback-minimal.nix instead. + systemd.services.pifinder-net-policy = { + description = "PiFinder network policy (wired > wifi client > AP)"; + after = [ "NetworkManager.service" ]; + wants = [ "NetworkManager.service" ]; + wantedBy = [ "multi-user.target" ]; + path = [ pkgs.iw ]; + environment = { + PIFINDER_DATA = "/home/pifinder/PiFinder_data"; + GI_TYPELIB_PATH = lib.makeSearchPath "lib/girepository-1.0" [ + pkgs.networkmanager + pkgs.glib.out + pkgs.gobject-introspection + ]; + }; + serviceConfig = { + WorkingDirectory = "/home/pifinder/PiFinder/python"; + ExecStart = "${pifinderPythonEnv}/bin/python -m PiFinder.net_policy"; + Restart = "always"; + RestartSec = 5; + }; + }; + + # --------------------------------------------------------------------------- + # PiFinder NixOS Upgrade + # --------------------------------------------------------------------------- + # Downloads from binary caches, sets profile, updates bootloader, reboots. + # No live switch-to-configuration — avoids killing running services. + # The pifinder-watchdog handles rollback if the new generation fails to boot. + systemd.services.pifinder-upgrade = { + description = "PiFinder NixOS Upgrade"; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + WorkingDirectory = "/home/pifinder/PiFinder/python"; + ExecStart = "${pifinderPythonEnv}/bin/python -m PiFinder.nixos_upgrade --default-camera ${cfg.cameraType}"; + }; + path = with pkgs; [ nix systemd coreutils set-extlinux-default ]; + }; + + # --------------------------------------------------------------------------- + # PiFinder Boot Health Watchdog — self-arming trial/commit + # --------------------------------------------------------------------------- + # A generation is on probation until it has passed a health check once + # (recorded in confirmed-generations). Any boot of an UNCONFIRMED generation + # is a trial — whether or not the (possibly older, marker-unaware) system + # that installed it armed the trial marker. Protection never depends on the + # previous build's code. + # - confirmed generation -> never roll back, so a transient failure in + # the field can't cause a surprise downgrade + # - trial gen healthy -> confirm it + # - trial gen unhealthy -> capture the journal to PiFinder_data (journald + # is volatile to spare the SD card; a failed boot is the one moment worth + # a write), leave a notice the app shows after reboot, show the failure + # splash, roll back (marker hint first, else newest other generation), + # reboot. With no rollback target at all, stay up for rescue instead of + # boot-looping. + systemd.services.pifinder-watchdog = { + description = "PiFinder Boot Health Watchdog"; + after = [ "multi-user.target" "pifinder.service" ]; + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + }; + path = with pkgs; [ nix systemd coreutils jq gnugrep boot-splash ]; + script = '' + set -euo pipefail + MARKER=/var/lib/pifinder/trial-generation.json + CONFIRMED=/var/lib/pifinder/confirmed-generations + DATA=/home/pifinder/PiFinder_data + CURRENT=$(readlink -f /run/current-system) + + is_confirmed() { + [ -f "$CONFIRMED" ] && grep -qxF "$1" "$CONFIRMED" + } + + if is_confirmed "$CURRENT"; then + # Stale marker from an aborted/rolled-back upgrade attempt is harmless + # here but must not survive to a later boot. + rm -f "$MARKER" + # Never ACT on a confirmed generation — but still REPORT (ADR 0005): + # if the app can't start, the frozen splash gets replaced by an + # advisory naming the recovery hold, so the escape hatch reveals + # itself exactly when it is needed. + echo "Generation already confirmed — report-only watch." + for i in $(seq 1 24); do + if systemctl is-active --quiet pifinder.service; then + exit 0 + fi + sleep 5 + done + echo "Confirmed generation's app is not starting — showing recovery advisory (no action taken)." + # The crash-looping app redraws its boot console between restarts, so + # re-assert the advisory periodically (bounded — 30 min, then leave + # the last draw standing) while bailing out if the app recovers. + for i in $(seq 1 60); do + if systemctl is-active --quiet pifinder.service; then + exit 0 + fi + boot-splash --message "PIFINDER" "FAILED TO START" "HOLD SQUARE" "AT POWER ON" "FOR RECOVERY" || true + sleep 30 + done + exit 0 + fi + + echo "Trial boot of unconfirmed generation $CURRENT: waiting up to 120s for pifinder.service..." + for i in $(seq 1 24); do + if systemctl is-active --quiet pifinder.service; then + # Verify it stays running (not crash-looping) + UPTIME=$(systemctl show pifinder.service --property=ExecMainStartTimestamp --value) + START_EPOCH=$(date -d "$UPTIME" +%s 2>/dev/null || echo 0) + NOW_EPOCH=$(date +%s) + RUNNING_FOR=$((NOW_EPOCH - START_EPOCH)) + if [ "$RUNNING_FOR" -ge 15 ]; then + echo "pifinder.service healthy (running ''${RUNNING_FOR}s) — confirming generation." + mkdir -p "$(dirname "$CONFIRMED")" + echo "$CURRENT" >> "$CONFIRMED" + rm -f "$MARKER" + exit 0 + fi + fi + sleep 5 + done + + # ----- unhealthy: pick a rollback target ------------------------------ + # Marker hint (exact pre-upgrade system, specialisation included) first; + # otherwise walk the profile, newest first, skipping any generation that + # boots into this same failed build (directly or via a specialisation) + # and preferring confirmed generations. + TARGET="" + if [ -f "$MARKER" ]; then + HINT=$(jq -r '.previous // empty' "$MARKER" 2>/dev/null || true) + if [ -n "$HINT" ] && [ -e "$HINT" ] && [ "$HINT" != "$CURRENT" ]; then + TARGET="$HINT" + fi + fi + if [ -z "$TARGET" ]; then + FALLBACK="" + for GEN in $(ls -d /nix/var/nix/profiles/system-*-link 2>/dev/null | sort -t- -k2 -rn); do + G=$(readlink -f "$GEN") + [ "$G" = "$CURRENT" ] && continue + SKIP=0 + for S in "$G"/specialisation/*/; do + [ -e "$S" ] || continue + [ "$(readlink -f "$S")" = "$CURRENT" ] && SKIP=1 && break + done + [ "$SKIP" = 1 ] && continue + if is_confirmed "$G"; then + TARGET="$G" + break + fi + [ -z "$FALLBACK" ] && FALLBACK="$G" + done + [ -z "$TARGET" ] && TARGET="$FALLBACK" + fi + + # ----- capture evidence ------------------------------------------------ + echo "ERROR: trial generation unhealthy. Capturing evidence..." + TS=$(date +%Y%m%d-%H%M%S) + mkdir -p "$DATA" + journalctl -b > "$DATA/failed-boot-$TS.log" || true + jq -n --arg failed "$CURRENT" --arg reverted_to "''${TARGET:-none}" --arg at "$TS" \ + '{failed: $failed, reverted_to: $reverted_to, at: $at}' \ + > "$DATA/upgrade_failed.json" || true + chown pifinder:users "$DATA/failed-boot-$TS.log" "$DATA/upgrade_failed.json" 2>/dev/null || true + + # Stop the crash-looping app so the display is free for the failure + # message (and so the reboot is clean). + systemctl stop pifinder.service || true + + if [ -z "$TARGET" ]; then + echo "FATAL: no rollback target exists — staying up for rescue (SSH) instead of boot-looping." + boot-splash --message "UPDATE" "FAILED" "NO ROLLBACK" "USE SSH OR REFLASH" "HOLD SQ AT POWER ON" "FOR RECOVERY" || true + exit 1 + fi + + boot-splash --message "UPDATE" "FAILED" "ROLLING BACK" "PLEASE WAIT" "HOLD SQ AT POWER ON" "FOR RECOVERY" || true + + echo "Rolling back to $TARGET and rebooting..." + rm -f "$MARKER" + # current-build.json was written for the (now failed) generation before + # its reboot; left in place it makes the rolled-back system misreport + # its identity (and the update UI mis-hide entries). Remove it — version + # display falls back to the baked build metadata. + rm -f /var/lib/pifinder/current-build.json + nix-env -p /nix/var/nix/profiles/system --set "$TARGET" + "$TARGET/bin/switch-to-configuration" boot || true + systemctl reboot + ''; + }; + + # --------------------------------------------------------------------------- + # GPSD for GPS receiver - full USB hotplug support + # --------------------------------------------------------------------------- + # Don't use services.gpsd module - it doesn't support hotplug. + # Instead, use gpsd's own systemd units with socket activation. + + # Install gpsd's udev rules (25-gpsd.rules) for USB GPS auto-detection + # Includes u-blox 5/6/7/8/9 and many other GPS receivers + services.udev.packages = [ pkgs.gpsd ]; + + # Install gpsd's systemd units (gpsd.service, gpsd.socket, gpsdctl@.service) + systemd.packages = [ pkgs.gpsd ]; + + # Enable socket activation - gpsd starts when something connects to port 2947 + systemd.sockets.gpsd = { + wantedBy = [ "sockets.target" ]; + }; + + # /etc/default/gpsd — same shape as upstream pi_config_files/gpsd.conf. + # DEVICES opens the on-board UART GPS at startup via its stable udev name + # (see hardware.nix — ttyAMA numbering shifts between kernels); USBAUTO lets + # udev hotplug USB GPSes via gpsdctl. GPSD_SOCKET is intentionally omitted — + # gpsd's default (/var/run/gpsd.sock) is already what we want. + environment.etc."default/gpsd".text = '' + DEVICES="/dev/gpsuart" + GPSD_OPTIONS="" + USBAUTO="true" + ''; + + # Ensure gpsd user/group exist (normally created by services.gpsd module) + users.users.gpsd = { + isSystemUser = true; + group = "gpsd"; + description = "GPSD daemon user"; + }; + users.groups.gpsd = {}; + + # Add the on-board UART GPS to gpsd (uart3 overlay, published as + # /dev/gpsuart by udev — platform UARTs are not auto-detected the way USB + # GPSes are). Started by udev via SYSTEMD_WANTS when the device appears + # (see hardware.nix), so a unit without an on-board GPS never starts it + # and USB-only setups still work through USBAUTO hotplug alone. + systemd.services.gpsd-add-uart = { + description = "Add UART GPS to gpsd"; + after = [ "gpsd.socket" "dev-gpsuart.device" ]; + requires = [ "gpsd.socket" ]; + # BindsTo ensures this stops if the GPS UART disappears + bindsTo = [ "dev-gpsuart.device" ]; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + ExecStart = "${pkgs.gpsd}/sbin/gpsdctl add /dev/gpsuart"; + ExecStop = "${pkgs.gpsd}/sbin/gpsdctl remove /dev/gpsuart"; + }; + }; + + # --------------------------------------------------------------------------- + # PAM service for PiFinder web UI password verification + # --------------------------------------------------------------------------- + security.pam.services.pifinder = { + # Auth-only: no account/session management (avoids setuid and pam_lastlog2 errors) + allowNullPassword = false; + unixAuth = true; + setLoginUid = false; + updateWtmp = false; + }; + + # --------------------------------------------------------------------------- + # Samba for file sharing (observation data, backups) + # --------------------------------------------------------------------------- + system.stateVersion = "24.11"; + + # --------------------------------------------------------------------------- + # SSH access + # --------------------------------------------------------------------------- + services.openssh = { + enable = true; + settings = { + PasswordAuthentication = true; + PermitRootLogin = "no"; + }; + }; + + # Avahi/mDNS + the PiFinder custom-hostname service live in nixos/device.nix + # (single owner — this block used to be duplicated here and there). + + # Don't block boot waiting for network — NM still works, just async + systemd.services.NetworkManager-wait-online.enable = false; + + services.samba = { + enable = true; + openFirewall = true; + settings = { + global = { + workgroup = "WORKGROUP"; + security = "user"; + # Anonymous access, as on the original Raspbian PiFinder: unauthenticated + # clients are mapped to the pifinder user, which owns the share, so no SMB + # password is ever needed. (Samba's passdb is separate from the Unix login, + # so "solveit" never authenticated SMB anyway.) + "map to guest" = "bad user"; + "guest account" = "pifinder"; + }; + PiFinder_data = { + path = "/home/pifinder/PiFinder_data"; + browseable = "yes"; + "read only" = "no"; + "guest ok" = "yes"; + }; + }; + }; + + # Advertise the Samba share over mDNS so it appears in file-manager "Network" + # browse views (Finder, Nautilus). Samba itself never publishes an + # _smb._tcp record; Avahi (configured in networking.nix) does the DNS-SD. + # Lives here, tied to the samba block, so only the device build advertises it. + services.avahi.extraServiceFiles.smb = '' + + + + %h + + _smb._tcp + 445 + + + ''; + }; # config +} diff --git a/nixos/wifi-fallback-minimal.nix b/nixos/wifi-fallback-minimal.nix new file mode 100644 index 000000000..5982feae2 --- /dev/null +++ b/nixos/wifi-fallback-minimal.nix @@ -0,0 +1,55 @@ +# Minimal AP fallback for the migration image, which has no Python +# environment. The full system runs pifinder-net-policy (libnm daemon, +# services.nix) instead; this is a stripped-down shell version of the same +# priority — wired > wifi client > AP — good enough for the short-lived +# bootstrap system whose only job is staying reachable until first boot. +{ pkgs, ... }: +{ + systemd.services.pifinder-wifi-fallback = { + description = "Bring up PiFinder AP when offline (migration image)"; + after = [ "NetworkManager.service" ]; + wants = [ "NetworkManager.service" ]; + wantedBy = [ "multi-user.target" ]; + path = [ pkgs.networkmanager pkgs.coreutils pkgs.gnugrep ]; + serviceConfig.Type = "oneshot"; + script = '' + modefile=/home/pifinder/PiFinder_data/wifi_mode + + if [ -r "$modefile" ] && [ "$(cat "$modefile")" = "AP" ]; then + nmcli connection up PiFinder-AP || true + exit 0 + fi + + # Wired connectivity is sufficient — never start the AP over it. + eth_up() { + nmcli -t -f TYPE,STATE device | grep -q '^ethernet:connected' + } + # A wifi CLIENT connection. Matching the device state alone would + # count the AP itself as "connected" and make the AP sticky. + wifi_client_up() { + nmcli -t -f TYPE,NAME connection show --active \ + | grep '^802-11-wireless:' \ + | grep -qvx '802-11-wireless:PiFinder-AP' + } + + # Give NetworkManager a grace period to land on something better. + for _ in $(seq 1 45); do + if eth_up || wifi_client_up; then + exit 0 + fi + sleep 1 + done + + nmcli connection up PiFinder-AP || true + ''; + }; + + systemd.timers.pifinder-wifi-fallback = { + description = "Periodically ensure WiFi falls back to AP when offline"; + wantedBy = [ "timers.target" ]; + timerConfig = { + OnBootSec = "30s"; + OnUnitActiveSec = "120s"; + }; + }; +} diff --git a/python/DEPENDENCIES.md b/python/DEPENDENCIES.md new file mode 100644 index 000000000..4cd998f32 --- /dev/null +++ b/python/DEPENDENCIES.md @@ -0,0 +1,105 @@ +> **Auto-generated** from the Nix development shell on 2026-02-13. +> Do not edit manually — regenerate with: +> ``` +> nix develop --command ./scripts/generate-dependencies-md.sh +> ``` + +> **Note:** These dependencies are managed by Nix (`nixos/pkgs/python-packages.nix`). +> The versions listed here reflect the nixpkgs pin used by the flake and are +> **not necessarily installable via pip**. Some packages require system libraries +> or hardware (SPI, I2C, GPIO) only available on the Raspberry Pi. + +# Python Dependencies + +Python 3.13.11 + +## Runtime + +| Package | Version | +|---------|---------| +| aiofiles | 24.1.0 | +| attrs | 25.3.0 | +| av | 16.0.1 | +| bottle | 0.13.4 | +| cbor2 | 5.7.0 | +| certifi | 2025.7.14 | +| cffi | 2.0.0 | +| charset-normalizer | 3.4.3 | +| cheroot | 10.0.1 | +| dataclasses-json | 0.6.7 | +| dbus-python | 1.4.0 | +| Deprecated | 1.2.18 | +| evdev | 1.9.2 | +| flatbuffers | 25.9.23 | +| gpsdclient | 1.3.2 | +| grpcio | 1.76.0 | +| h3 | 4.3.1 | +| idna | 3.11 | +| jaraco.functools | 4.2.1 | +| joblib | 1.5.1 | +| jplephem | 2.23 | +| json5 | 0.12.0 | +| jsonpath-ng | 1.7.0 | +| jsonschema | 4.25.0 | +| jsonschema-specifications | 2025.4.1 | +| libarchive-c | 5.3 | +| luma.core | 2.4.2 | +| luma.lcd | 2.11.0 | +| luma.oled | 3.13.0 | +| lz4 | 4.4.4 | +| marshmallow | 3.26.2 | +| more-itertools | 10.7.0 | +| numpy | 2.3.4 | +| pandas | 2.3.1 | +| pillow | 12.1.0 | +| ply | 3.11 | +| protobuf | 6.33.1 | +| psutil | 7.1.2 | +| pycairo | 1.28.0 | +| pycparser | 2.23 | +| pydeepskylog | 1.6 | +| pyftdi | 0.57.1 | +| Pygments | 2.19.2 | +| PyGObject | 3.54.5 | +| PyJWT | 2.10.1 | +| pyserial | 3.5 | +| python-dateutil | 2.9.0.post0 | +| python-libinput | 0.3.0a0 | +| python-pam | 2.0.2 | +| pytz | 2025.2 | +| pyusb | 1.3.1 | +| referencing | 0.36.2 | +| requests | 2.32.5 | +| rpds-py | 0.25.0 | +| scikit-learn | 1.7.1 | +| scipy | 1.16.3 | +| sgp4 | 2.25 | +| sh | 1.14.3 | +| six | 1.17.0 | +| skyfield | 1.53 | +| smbus2 | 0.5.0 | +| spidev | 3.8 | +| threadpoolctl | 3.6.0 | +| timezonefinder | 8.1.0 | +| tqdm | 4.67.1 | +| typing_extensions | 4.15.0 | +| typing_inspect | 0.9.0 | +| tzdata | 2025.2 | +| urllib3 | 2.5.0 | +| wrapt | 1.17.2 | + +## Development only + +| Package | Version | +|---------|---------| +| iniconfig | 2.1.0 | +| luma.emulator | 1.5.0 | +| mypy | 1.17.1 | +| mypy_extensions | 1.1.0 | +| pathspec | 0.12.1 | +| pluggy | 1.6.0 | +| pygame | 2.6.1 | +| PyHotKey | 1.5.2 | +| pynput | 1.8.1 | +| pytest | 8.4.2 | +| python-xlib | 0.33 | diff --git a/python/PiFinder/audit_images.py b/python/PiFinder/audit_images.py index ef37fdb70..e34664ce5 100644 --- a/python/PiFinder/audit_images.py +++ b/python/PiFinder/audit_images.py @@ -44,8 +44,8 @@ def check_object_image(catalog_object): aka_rec = conn.execute( f""" SELECT common_name from names - where catalog = "{catalog_object['catalog']}" - and sequence = "{catalog_object['sequence']}" + where catalog = "{catalog_object["catalog"]}" + and sequence = "{catalog_object["sequence"]}" and common_name like "NGC%" """ ).fetchone() diff --git a/python/PiFinder/battery_bq25895.py b/python/PiFinder/battery_bq25895.py index f947f82da..ac0cbb17f 100644 --- a/python/PiFinder/battery_bq25895.py +++ b/python/PiFinder/battery_bq25895.py @@ -46,8 +46,8 @@ Structure note: ``decode_registers`` and ``estimate_soc`` are PURE (no hardware) so the bulk of the logic is unit-testable without a board. -``board`` is imported lazily-guarded so this module — and the pure -pieces ``battery_fake`` reuses — imports cleanly on dev machines. +The I2C bus factory is imported lazily-guarded so this module — and the +pure pieces ``battery_fake`` reuses — imports cleanly on dev machines. """ import logging @@ -57,12 +57,13 @@ from PiFinder.types.hardware import BatteryState, ChargeStatus try: - import board from adafruit_bus_device.i2c_device import I2CDevice + + from PiFinder.i2c_bus import get_i2c except (ImportError, NotImplementedError): # No blinka / not on real hardware: the pure decode helpers and module # constants still import. The BQ25895 class raises on construction. - board = None + get_i2c = None # type: ignore[assignment] I2CDevice = None logger = logging.getLogger("Battery.bq25895") @@ -375,10 +376,10 @@ class BQ25895: """ def __init__(self, address: int = BQ25895_ADDRESS, i2c=None): - if board is None or I2CDevice is None: + if get_i2c is None or I2CDevice is None: raise RuntimeError("blinka / board unavailable — no I2C bus") if i2c is None: - i2c = board.I2C() + i2c = get_i2c() self._device = I2CDevice(i2c, address) def read_reg(self, reg: int) -> int: diff --git a/python/PiFinder/camera_interface.py b/python/PiFinder/camera_interface.py index 77cd3a03a..ef1355af3 100644 --- a/python/PiFinder/camera_interface.py +++ b/python/PiFinder/camera_interface.py @@ -311,7 +311,6 @@ def get_image_loop( # 60 half-second cycles (30 seconds between captures in sleep mode) sleep_delay = 60 was_sleeping = False - test_mode_on = False while True: sleeping = state_utils.sleep_for_framerate( shared_state, limit_framerate=False @@ -336,6 +335,10 @@ def get_image_loop( imu_start = shared_state.imu() image_start_time = time.time() if self._camera_started: + # Test mode is owned by shared state (persisted in config + # and toggled from the menu), so it stays in sync with the + # UI and survives restarts. + test_mode_on = shared_state.test_mode() if not test_mode_on: base_image = self._capture_with_timeout() if base_image is None: @@ -481,9 +484,6 @@ def get_image_loop( logger.error(f"CameraInterface: Command error: {e}") try: - if command == "debug": - test_mode_on = not test_mode_on - if command.startswith("set_exp"): transient_exposure = command.startswith( "set_exp_transient:" diff --git a/python/PiFinder/camera_pi.py b/python/PiFinder/camera_pi.py index 4364bcd2f..e9d125955 100644 --- a/python/PiFinder/camera_pi.py +++ b/python/PiFinder/camera_pi.py @@ -23,6 +23,29 @@ logger = logging.getLogger("Camera.Pi") +def optical_black_pedestal(metadata, bit_depth): + """Return the per-frame optical-black level in native raw ADU. + + libcamera reports SensorBlackLevels on a 16-bit scale. The patched + IMX290/462 helper marks a measured value with a one-count sentinel in the + fourth channel; an unpatched stack's static tuning value is therefore not + mistaken for a measurement. + """ + levels = metadata.get("SensorBlackLevels") + if not isinstance(levels, (tuple, list)) or len(levels) != 4: + return None + values = np.asarray(levels, dtype=np.float64) + if not np.all(np.isfinite(values)) or np.any(values <= 0): + return None + if not (values[0] == values[1] == values[2] and values[3] == values[0] + 1): + return None + scale = float(1 << (16 - int(bit_depth))) + pedestal = float(values[0] / scale) + if pedestal <= 0 or pedestal >= 2 ** int(bit_depth): + return None + return pedestal + + class CameraPI(CameraInterface): """The camera class for PI cameras. Implements the CameraInterface interface.""" @@ -107,6 +130,12 @@ def capture(self) -> Image.Image: # driver chooses to report. self.last_frame_metadata = metadata + frame_optical_black = None + if self.camera_type in ("imx290", "imx462"): + frame_optical_black = optical_black_pedestal( + metadata, self.profile.bit_depth + ) + _request.release() # Apply camera-specific crop and rotation @@ -127,6 +156,7 @@ def capture(self) -> Image.Image: radiometer_exposure, sequence=self._radiometer_sequence, captured_at=time.time(), + optical_black_pedestal=frame_optical_black, ) if sample is not None: self.shared_state.set_sqm_radiometer_sample(sample) diff --git a/python/PiFinder/catalog_cache.py b/python/PiFinder/catalog_cache.py index b7cb11705..c8a55cac1 100644 --- a/python/PiFinder/catalog_cache.py +++ b/python/PiFinder/catalog_cache.py @@ -23,7 +23,10 @@ # Bump when CompositeObject shape, _create_full_composite_object output, or # the pickled payload structure changes. -CACHE_VERSION = 1 +# v2: CompositeObject gained `list_descriptions` (external observing lists). +# Caches pickled at v1 restore objects without that attribute, crashing +# composed_sections() on the object details screen. +CACHE_VERSION = 2 CACHE_DIR = data_dir / "cache" / "catalogs" PICKLE_PATH = CACHE_DIR / "composite_objects.pkl" diff --git a/python/PiFinder/catalog_imports/catalog_import_utils.py b/python/PiFinder/catalog_imports/catalog_import_utils.py index e828e37b2..3405bf014 100644 --- a/python/PiFinder/catalog_imports/catalog_import_utils.py +++ b/python/PiFinder/catalog_imports/catalog_import_utils.py @@ -6,12 +6,11 @@ import logging import re -from typing import Dict, Optional +from typing import Dict, Optional, Tuple from dataclasses import dataclass, field from tqdm import tqdm from PiFinder.composite_object import MagnitudeObject, SizeObject -from PiFinder.ui.ui_utils import normalize from PiFinder import calc_utils from PiFinder.db.objects_db import ObjectsDatabase from PiFinder.db.observations_db import ObservationsDatabase @@ -150,7 +149,10 @@ def get_object_id(self, object_name: str): logging.debug(f"Looking up object id for {object_name}") result = self.mappings.get(object_name.lower()) if not result: - result = self.mappings.get(normalize(object_name)) + parsed = parse_designation(object_name) + if parsed is not None: + catalog_code, sequence = parsed + result = self.mappings.get(f"{catalog_code.lower()}{sequence}") if result: logging.debug(f"Found object id {result} for {object_name}") else: @@ -230,6 +232,64 @@ def trim_string(s): return " ".join(s.split()) +# Designation prefixes that name a PiFinder catalog, keyed on the lowercase, +# whitespace-free prefix as source catalogs write it. A prefix must be listed +# here for an alias to link one object to another; every other designation is +# kept as a plain name. The same catalog is spelled several ways across +# sources, and SIMBAD writes Abell planetaries as "PN A66 nn". +# +# Deliberately absent: a bare "h". Herschel 400 uses catalog code "H", but +# "H 1-1" and friends are Haro planetary nebulae, and a bare "H 12" is just as +# likely to be Hubble or Haro as Herschel. +CATALOG_CODE_ALIASES: Dict[str, str] = { + "a": "Abl", + "abell": "Abl", + "abl": "Abl", + "pna66": "Abl", + "b": "B", + "barnard": "B", + "c": "C", + "caldwell": "C", + "col": "Col", + "collinder": "Col", + "cr": "Col", + "herschel": "H", + "ic": "IC", + "m": "M", + "messier": "M", + "ngc": "NGC", + "sh2": "Sh2", + "sharpless": "Sh2", +} + +# A designation reads "": the sequence is the trailing run of +# digits, the prefix is everything before it. +_DESIGNATION_RE = re.compile(r"(.*?)\s*(\d+)") + + +def parse_designation(raw: str) -> Optional[Tuple[str, int]]: + """Split a source designation into a PiFinder catalog code and sequence. + + "NGC 7008" -> ("NGC", 7008), "Sh 2-176" -> ("Sh2", 176), + "PN A66 80" -> ("Abl", 80). + + Returns None when the designation names no PiFinder catalog. That covers + the planetary-nebula families whose numeric part is compound — "M 1-92" + (Minkowski), "H 3-29" (Haro), "K 2-1" (Kohoutek), "NGC 650-1" (the two + halves of M76). Those leave a prefix of "m1", "h3", "k2" or "ngc650", + none of which is a catalog, so they are rejected instead of being read as + Messier 92, Herschel 29, "K 21" or NGC 6501. + """ + match = _DESIGNATION_RE.fullmatch(trim_string(raw).lower()) + if match is None: + return None + prefix, sequence = match.groups() + catalog_code = CATALOG_CODE_ALIASES.get(prefix.rstrip("-.").replace(" ", "")) + if catalog_code is None: + return None + return catalog_code, int(sequence) + + def delete_catalog_from_database(catalog_code: str): """Delete a catalog and all its related records from the database""" if objects_db is None: @@ -261,7 +321,8 @@ def insert_catalog_max_sequence(catalog_name): if result: query = f""" update catalogs set max_sequence = { - dict(result)['MAX(sequence)']} where catalog_code = '{catalog_name}' + dict(result)["MAX(sequence)"] + } where catalog_code = '{catalog_name}' """ db_c.execute(query) conn.commit() @@ -411,7 +472,7 @@ def resolve_object_images(): ORDER BY {priority_case_sql} ) as priority_rank FROM catalog_objects co - WHERE co.catalog_code IN ({','.join(['?'] * len(catalog_priority))}) + WHERE co.catalog_code IN ({",".join(["?"] * len(catalog_priority))}) ) SELECT o.id as object_id, diff --git a/python/PiFinder/catalog_imports/main.py b/python/PiFinder/catalog_imports/main.py index 7fcaa5bae..f1d88bedb 100644 --- a/python/PiFinder/catalog_imports/main.py +++ b/python/PiFinder/catalog_imports/main.py @@ -35,6 +35,7 @@ ("wds_loader", "load_wds"), ("harris_loader", "load_harris"), ("lynga_loader", "load_lynga"), + ("pk_loader", "load_pk"), ] POST_PROCESSING_FUNCTIONS = [ @@ -130,6 +131,14 @@ def main(): conn.execute("PRAGMA wal_checkpoint(TRUNCATE)") conn.execute("PRAGMA journal_mode = DELETE") + # Finalize database for read-only deployment (NixOS) + logging.info("Finalizing database for read-only deployment...") + conn, _ = objects_db.get_conn_cursor() + conn.execute("PRAGMA journal_mode = DELETE") # Required for read-only FS + conn.execute("VACUUM") # Compact database + conn.commit() + logging.info("Database finalization complete") + if __name__ == "__main__": main() diff --git a/python/PiFinder/catalog_imports/pk_loader.py b/python/PiFinder/catalog_imports/pk_loader.py new file mode 100644 index 000000000..c89684f26 --- /dev/null +++ b/python/PiFinder/catalog_imports/pk_loader.py @@ -0,0 +1,419 @@ +""" +Perek-Kohoutek galactic planetary nebula catalog load script. + +Sources (vendored under astro_data/perek_kohoutek/, see PROVENANCE.md there): + IV/24 - Catalogue of Galactic Planetary Nebulae, Kohoutek 2001 + https://cdsarc.cds.unistra.fr/ftp/IV/24/ + table2 supplies the 1510 rows; table4 supplies arcsecond positions. + V/84 - Strasbourg-ESO Catalogue of Galactic Planetary Nebulae, + Acker et al. 1992, https://cdsarc.cds.unistra.fr/ftp/V/84/ + main supplies cross-identifications, diam supplies sizes. + SIMBAD - positions and cross-identifications keyed on PK designations. + +Every position used here is J2000: SIMBAD is ICRS, and both IV/24 tables carry +author-computed J2000 columns alongside their B1950 originals. The B1950 +columns are never read, so no precession happens in this loader. + +Design notes live in docs/adr/0024-perek-kohoutek-catalog.md. +""" + +import csv +import logging +import math +from pathlib import Path +from typing import Dict, List, NamedTuple, Optional, Tuple + +from tqdm import tqdm + +import PiFinder.utils as utils +from PiFinder.composite_object import MagnitudeObject, SizeObject +from .catalog_import_utils import ( + ObjectFinder, + NewCatalogObject, + delete_catalog_from_database, + insert_catalog, + insert_catalog_max_sequence, + parse_designation, + trim_string, +) + +# Import shared database object +from .database import objects_db + +CATALOG_CODE = "PK" +OBJECT_TYPE = "PN" + +DATA_DIR = Path(utils.astro_data_dir, "perek_kohoutek") + +# SIMBAD spells otype "PN" for a confirmed planetary nebula. Its position is +# preferred for those; for anything else (SIMBAD disagreeing with Kohoutek's +# classification) the catalogue's own position is kept. +SIMBAD_PN_OTYPES = {"PN", "PN?"} + +# A refined position is only accepted when it agrees with the catalogue's own +# coarse position. table2 rounds to 0.1 minute of right ascension and 1 +# arcminute of declination, so honest disagreement stays under ~2 arcminutes. +# Anything beyond this means a typo in the source or a SIMBAD identifier +# resolving to the wrong object — IV/24 table4 carries at least one, an +# equinox-2000 row for Vy 1-4 reading -02 26 where its five sibling rows and +# SIMBAD all read -06 26. +POSITION_AGREEMENT_ARCMIN = 5.0 + + +class Position(NamedTuple): + ra: float + dec: float + source: str + + +def _hms_to_deg(hours: float, minutes: float, seconds: float = 0.0) -> float: + return (hours + minutes / 60.0 + seconds / 3600.0) * 15.0 + + +def _dms_to_deg(sign: str, degrees: float, minutes: float, secs: float = 0.0) -> float: + magnitude = degrees + minutes / 60.0 + secs / 3600.0 + return -magnitude if sign.strip() == "-" else magnitude + + +def _field(line: str, start: int, end: int) -> str: + """One fixed-width field, using the ReadMe's 1-based inclusive byte range.""" + return line[start - 1 : end].strip() + + +def _pk_key(raw: str) -> Optional[str]: + """Canonical join key for a PK designation. + + Each source spells it differently — "036+17.1" in IV/24, "036+17 1" in + SIMBAD, "171-25 1" in V/84 — so reduce them all to "036+17.1". + """ + text = trim_string(raw) + if text.upper().startswith("PK "): + text = text[3:].strip() + if len(text) < 6: + return None + longitude, latitude = text[:3], text[3:6] + if not longitude.isdigit() or latitude[0] not in "+-" or not latitude[1:].isdigit(): + return None + running = text[6:].strip(" .") + if not running.isdigit(): + return None + return f"{longitude}{latitude}.{int(running)}" + + +def _pk_display_names(key: str) -> List[str]: + """Both spellings of a PK designation, so either one is searchable.""" + longitude_latitude, running = key.split(".") + return [f"PK {longitude_latitude}.{running}", f"PK {longitude_latitude} {running}"] + + +def _designation_aliases(raw: str) -> Tuple[List[str], List[str]]: + """Split one source designation into linking aliases and plain names. + + The first list holds canonical " " forms that + ObjectFinder can resolve to an existing sky object. The second holds the + designation as the source wrote it, for search. A hyphenated NGC pair like + "NGC 650-1" (M76) names two catalog entries and yields both. + """ + name = trim_string(raw) + if not name: + return [], [] + + linking: List[str] = [] + parsed = parse_designation(name) + if parsed is not None: + catalog_code, sequence = parsed + linking.append(f"{catalog_code} {sequence}") + elif name.upper().startswith("NGC "): + linking.extend(_ngc_pair(name[4:])) + + return linking, [name] + + +def _ngc_pair(raw: str) -> List[str]: + """Expand a hyphenated NGC pair, e.g. "650-1" -> NGC 650 and NGC 651. + + The digits after the hyphen replace the tail of the first number, so + "650-1" means 650 and 651, not 650 and 1. + """ + halves = [half.strip() for half in raw.split("-")] + if len(halves) != 2 or not all(half.isdigit() for half in halves): + return [] + first, tail = halves + if len(tail) > len(first): + return [] + second = first[: len(first) - len(tail)] + tail + return [f"NGC {int(first)}", f"NGC {int(second)}"] + + +def _read_table2() -> List[Dict[str, str]]: + """IV/24/table2 — the authoritative 1510 rows, ordered by right ascension.""" + rows = [] + with open(DATA_DIR / "table2.dat", "r") as table2: + for line in table2: + if not line.strip(): + continue + rows.append( + { + "pk": _field(line, 1, 9), + "f_pk": _field(line, 10, 10), + "name": _field(line, 12, 25), + "ra_h": _field(line, 50, 51), + "ra_m": _field(line, 53, 56), + "de_sign": _field(line, 59, 59) or "+", + "de_d": _field(line, 60, 61), + "de_m": _field(line, 63, 64), + "png": _field(line, 68, 78), + "note": _field(line, 80, 80), + } + ) + return rows + + +def angular_separation_arcmin(first: Position, second: Position) -> float: + """Great-circle separation between two positions, in arcminutes.""" + ra1, dec1 = math.radians(first.ra), math.radians(first.dec) + ra2, dec2 = math.radians(second.ra), math.radians(second.dec) + cosine = math.sin(dec1) * math.sin(dec2) + math.cos(dec1) * math.cos( + dec2 + ) * math.cos(ra1 - ra2) + return math.degrees(math.acos(max(-1.0, min(1.0, cosine)))) * 60.0 + + +def _read_table4() -> Dict[str, List[Position]]: + """IV/24/table4 — arcsecond J2000 positions, several rows per nebula. + + The J2000 columns are author-computed from the row's own equinox, so any + row is usable. Rows already given at equinox 2000 are listed first, + because they needed no conversion; the caller takes the first one that + agrees with the catalogue's own coarse position. + """ + ranked: Dict[str, List[Tuple[int, Position]]] = {} + with open(DATA_DIR / "table4.dat", "r") as table4: + for line in table4: + key = _pk_key(_field(line, 1, 9)) + if key is None: + continue + ra_h, ra_m, ra_s = ( + _field(line, 82, 83), + _field(line, 85, 86), + _field(line, 88, 92), + ) + de_d, de_m, de_s = ( + _field(line, 95, 96), + _field(line, 98, 99), + _field(line, 101, 104), + ) + if not (ra_h and ra_m and de_d and de_m): + continue + try: + position = Position( + _hms_to_deg(float(ra_h), float(ra_m), float(ra_s or 0)), + _dms_to_deg( + _field(line, 94, 94) or "+", + float(de_d), + float(de_m), + float(de_s or 0), + ), + "IV/24 table4", + ) + except ValueError: + continue + equinox = _field(line, 55, 58) + ranked.setdefault(key, []).append((0 if equinox == "2000" else 1, position)) + return { + key: [position for _rank, position in sorted(rows, key=lambda row: row[0])] + for key, rows in ranked.items() + } + + +def _read_v84_main() -> Dict[str, Dict[str, str]]: + """V/84/main, keyed on the PN G designation shared with IV/24.""" + entries = {} + with open(DATA_DIR / "main.dat", "r") as main: + for line in main: + png = _field(line, 1, 10) + if not png: + continue + entries[png] = { + "name": _field(line, 46, 58), + "iras": _field(line, 70, 80), + "idents": _field(line, 115, 224), + } + return entries + + +def _read_v84_diam() -> Dict[str, SizeObject]: + """V/84/diam — optical diameter preferred, radio diameter as fallback.""" + sizes = {} + with open(DATA_DIR / "diam.dat", "r") as diam: + for line in diam: + png = _field(line, 1, 10) + if not png: + continue + for start, end in ((14, 19), (52, 57)): + try: + arcsec = float(_field(line, start, end)) + except ValueError: + continue + if arcsec > 0: + sizes[png] = SizeObject.from_arcsec(arcsec) + break + return sizes + + +def _read_simbad_positions() -> Dict[str, Position]: + """SIMBAD ICRS positions, keyed on the PK identifier.""" + positions = {} + with open(DATA_DIR / "simbad_pk.tsv", "r") as simbad: + for row in csv.DictReader(simbad, delimiter="\t"): + key = _pk_key(row["id"].strip('"')) + if key is None or row["otype"].strip('"') not in SIMBAD_PN_OTYPES: + continue + try: + positions[key] = Position(float(row["ra"]), float(row["dec"]), "SIMBAD") + except (TypeError, ValueError): + continue + return positions + + +def _read_simbad_aliases() -> Dict[str, List[str]]: + """SIMBAD cross-identifications, keyed on the PK identifier.""" + aliases: Dict[str, List[str]] = {} + with open(DATA_DIR / "simbad_pk_aliases.tsv", "r") as simbad: + for row in csv.DictReader(simbad, delimiter="\t"): + key = _pk_key(row["pk_id"].strip('"')) + if key is None: + continue + alias = trim_string(row["alias"].strip('"')) + if alias and alias not in aliases.setdefault(key, []): + aliases[key].append(alias) + return aliases + + +def _choose_position(candidates: List[Position], anchor: Position) -> Position: + """First candidate that agrees with the catalogue's own coarse position. + + Falls back to the anchor when every refined candidate disagrees, so a bad + source row can only cost precision, never correctness. + """ + for candidate in candidates: + if angular_separation_arcmin(candidate, anchor) <= POSITION_AGREEMENT_ARCMIN: + return candidate + return anchor + + +def _build_description(png: str, v84: Optional[Dict[str, str]]) -> str: + parts = [] + if png and png not in ("possible", "rejected"): + parts.append(f"PN G{png}") + elif png: + parts.append(f"Classified {png} in the Strasbourg-ESO catalogue") + if v84 and v84["idents"]: + parts.append(f"Also {v84['idents']}") + return ". ".join(parts) + + +def load_pk(): + logging.info("Loading Perek-Kohoutek") + assert objects_db is not None, "Database not initialized before load_pk()" + conn, _ = objects_db.get_conn_cursor() + + delete_catalog_from_database(CATALOG_CODE) + insert_catalog(CATALOG_CODE, DATA_DIR / "pk.desc") + + rows = _read_table2() + table4_positions = _read_table4() + simbad_positions = _read_simbad_positions() + simbad_aliases = _read_simbad_aliases() + v84_main = _read_v84_main() + v84_sizes = _read_v84_diam() + logging.info( + "Perek-Kohoutek sources: %d rows, %d table4 positions, %d SIMBAD positions, " + "%d SIMBAD cross-id sets, %d V/84 entries, %d V/84 sizes", + len(rows), + len(table4_positions), + len(simbad_positions), + len(simbad_aliases), + len(v84_main), + len(v84_sizes), + ) + + position_sources: Dict[str, int] = {} + linked = 0 + + shared_finder = ObjectFinder() + NewCatalogObject.set_shared_finder(shared_finder) + try: + for sequence, row in enumerate(tqdm(rows), start=1): + key = _pk_key(row["pk"]) + if key is None: + raise ValueError( + f"Unparseable PK designation {row['pk']!r} at table2 line " + f"{sequence}" + ) + + anchor = Position( + _hms_to_deg(float(row["ra_h"]), float(row["ra_m"])), + _dms_to_deg(row["de_sign"], float(row["de_d"]), float(row["de_m"])), + "IV/24 table2", + ) + position_candidates = [] + if key in simbad_positions: + position_candidates.append(simbad_positions[key]) + position_candidates.extend(table4_positions.get(key, [])) + position = _choose_position(position_candidates, anchor) + position_sources[position.source] = ( + position_sources.get(position.source, 0) + 1 + ) + + png = row["png"] + v84 = v84_main.get(png) + + # Linking aliases lead, because find_object_id() takes the first + # match: a resolvable NGC/IC/Messier designation must win over a + # name that merely looks like one. + linking: List[str] = [] + plain: List[str] = [] + alias_candidates = simbad_aliases.get(key, []) + [row["name"]] + if v84: + alias_candidates.append(v84["name"]) + alias_candidates.extend(v84["idents"].split(",")) + for candidate in alias_candidates: + candidate_linking, candidate_plain = _designation_aliases(candidate) + linking.extend(candidate_linking) + plain.extend(candidate_plain) + + plain.extend(_pk_display_names(key)) + if png and png not in ("possible", "rejected"): + plain.append(f"PN G{png}") + if v84 and v84["iras"]: + plain.append(f"IRAS {v84['iras']}") + + aka_names = list(dict.fromkeys(linking + plain)) + if linking: + linked += 1 + + new_object = NewCatalogObject( + object_type=OBJECT_TYPE, + catalog_code=CATALOG_CODE, + sequence=sequence, + ra=position.ra, + dec=position.dec, + mag=MagnitudeObject([]), + size=v84_sizes.get(png, SizeObject([])), + aka_names=aka_names, + description=_build_description(png, v84), + ) + new_object.insert() + finally: + NewCatalogObject.clear_shared_finder() + + logging.info("Perek-Kohoutek positions by source: %s", position_sources) + logging.info( + "Perek-Kohoutek entries carrying a linking designation: %d of %d", + linked, + len(rows), + ) + + insert_catalog_max_sequence(CATALOG_CODE) + conn.commit() diff --git a/python/PiFinder/catalog_imports/specialized_loaders.py b/python/PiFinder/catalog_imports/specialized_loaders.py index e8d68aee1..677c3d7aa 100644 --- a/python/PiFinder/catalog_imports/specialized_loaders.py +++ b/python/PiFinder/catalog_imports/specialized_loaders.py @@ -578,7 +578,7 @@ def load_sharpless(): catalog_code=catalog, sequence=record["Sh2"], ra=j_ra_deg, - dec=dec_deg, + dec=j_dec_deg, size=SizeObject.from_arcmin(float(record["Diam"])), mag=MagnitudeObject([]), description=desc, @@ -612,7 +612,7 @@ def expand(name): for additional in parts[1:]: if additional.isdigit(): # If the additional part is a number, add it directly - expanded_list.append(f"{base_part[:-len(additional)]}{additional}") + expanded_list.append(f"{base_part[: -len(additional)]}{additional}") else: expanded_list.append(additional) else: diff --git a/python/PiFinder/catalog_imports/wds_loader.py b/python/PiFinder/catalog_imports/wds_loader.py index 395f35ec0..983f2f5e8 100644 --- a/python/PiFinder/catalog_imports/wds_loader.py +++ b/python/PiFinder/catalog_imports/wds_loader.py @@ -263,7 +263,7 @@ def handle_multiples(key, values) -> dict: coord_2000 = entry["Coordinates_2000"] coord_arcsec = entry["Coordinates_Arcsec"] logging.error( - f"Empty or invalid RA/DEC detected for WDS object at line {i+1}" + f"Empty or invalid RA/DEC detected for WDS object at line {i + 1}" ) logging.error(f" Coordinates_2000: '{coord_2000}'") logging.error(f" Coordinates_Arcsec: '{coord_arcsec}'") @@ -273,7 +273,7 @@ def handle_multiples(key, values) -> dict: ) logging.error(f" Final RA: {entry['ra']}, DEC: {entry['dec']}") raise ValueError( - f"Invalid RA/DEC coordinates for WDS object at line {i+1}: RA={entry['ra']}, DEC={entry['dec']}" + f"Invalid RA/DEC coordinates for WDS object at line {i + 1}: RA={entry['ra']}, DEC={entry['dec']}" ) # make a dictionary of WDS objects to group duplicates diff --git a/python/PiFinder/comets.py b/python/PiFinder/comets.py index 4621f32a1..2f9819608 100644 --- a/python/PiFinder/comets.py +++ b/python/PiFinder/comets.py @@ -251,8 +251,16 @@ def _calc_comets_vectorized(comets_df: pd.DataFrame, dt) -> Dict[str, Any]: # builder), propagated in a single call -> heliocentric state, AU, # equatorial ICRF, relative to the Sun. kepler = mpc._comet_orbits(comets_df, sf_utils.ts, GM_SUN) - helio_pos = kepler._at(t)[0] - if helio_pos.ndim == 1: # propagate() squeezes a single comet to (3,) + # Skyfield 1.51+ lays the result out as (3, #orbits, #times) but sets + # output_shape from only t1.shape, so a batched orbit only reshapes cleanly + # when the target time is itself shaped (#orbits, 1). Give every comet the + # same target time as an (N, 1) column. Versions through 1.50 squeeze the + # singleton time dimension back out, so accept both return shapes. + t_batched = sf_utils.ts.tt_jd(np.full((len(comets_df), 1), t.tt)) + helio_pos = kepler._at(t_batched)[0] + if helio_pos.ndim == 3: + helio_pos = helio_pos[:, :, 0] + elif helio_pos.ndim == 1: helio_pos = helio_pos[:, np.newaxis] # Sun and observer are single 3-vectors relative to the solar-system diff --git a/python/PiFinder/composite_object.py b/python/PiFinder/composite_object.py index 36fdc39f2..127d007ed 100644 --- a/python/PiFinder/composite_object.py +++ b/python/PiFinder/composite_object.py @@ -298,7 +298,11 @@ def composed_sections(self, extra_descriptions=None, dedup=True) -> list: sections: list = [] seen: set = set() have_list_description = False - for source, desc in self.list_descriptions.items(): + # getattr guard: objects restored from a pre-v2 pickle cache lack this + # field (it isn't applied on unpickle). The cache version bump rebuilds + # such caches, but this keeps the details screen from hard-crashing if a + # stale object ever reaches here. + for source, desc in getattr(self, "list_descriptions", {}).items(): if desc: sections.append((source, desc)) have_list_description = True diff --git a/python/PiFinder/db/objects_db.py b/python/PiFinder/db/objects_db.py index 95eaa3c2b..e2d947739 100644 --- a/python/PiFinder/db/objects_db.py +++ b/python/PiFinder/db/objects_db.py @@ -11,20 +11,7 @@ class ObjectsDatabase(Database): def __init__(self, db_path=utils.pifinder_db): conn, cursor = self.get_database(db_path) super().__init__(conn, cursor, db_path) - - # Performance optimizations for Pi/SD card environments - logging.info("Applying database performance optimizations...") - self.cursor.execute("PRAGMA foreign_keys = ON;") - self.cursor.execute("PRAGMA mmap_size = 268435456;") # 256MB memory mapping - self.cursor.execute("PRAGMA cache_size = -64000;") # 64MB cache (negative = KB) - self.cursor.execute("PRAGMA temp_store = MEMORY;") # Keep temporary data in RAM - self.cursor.execute( - "PRAGMA synchronous = NORMAL;" - ) # Balanced safety/performance - logging.info("Database optimizations applied") - - self.conn.commit() - self.bulk_mode = False # Flag to disable commits during bulk operations + self.bulk_mode = False def create_tables(self): # Create objects table @@ -315,6 +302,53 @@ def get_catalog_objects(self): ) return results + def get_priority_catalog_joined(self, priority_codes=("NGC", "IC", "M")): + """Combined JOIN query: catalog_objects + objects for priority catalogs only.""" + start_time = time.time() + placeholders = ",".join("?" * len(priority_codes)) + self.cursor.execute( + f""" + SELECT co.id, co.object_id, co.catalog_code, co.sequence, co.description, + o.ra, o.dec, o.obj_type, o.const, o.size, o.mag, o.surface_brightness + FROM catalog_objects co + JOIN objects o ON co.object_id = o.id + WHERE co.catalog_code IN ({placeholders}) + """, + priority_codes, + ) + rows = self.cursor.fetchall() + elapsed = time.time() - start_time + logging.info( + f"get_priority_catalog_joined took {elapsed:.2f}s, returned {len(rows)} rows" + ) + return rows + + def get_priority_names(self, priority_codes=("NGC", "IC", "M")): + """Get names only for objects in priority catalogs (much smaller than full names table).""" + start_time = time.time() + placeholders = ",".join("?" * len(priority_codes)) + self.cursor.execute( + f""" + SELECT n.object_id, n.common_name FROM names n + WHERE n.object_id IN ( + SELECT DISTINCT co.object_id FROM catalog_objects co + WHERE co.catalog_code IN ({placeholders}) + ) + """, + priority_codes, + ) + results = self.cursor.fetchall() + name_dict = defaultdict(list) + for object_id, common_name in results: + name_dict[object_id].append(common_name.strip()) + for object_id in name_dict: + name_dict[object_id] = list(set(name_dict[object_id])) + elapsed = time.time() - start_time + logging.info( + f"get_priority_names took {elapsed:.2f}s, {len(results)} rows for {len(name_dict)} objects" + ) + return name_dict + # ---- IMAGES_OBJECTS methods ---- def insert_image_object(self, object_id, image_name): self.cursor.execute( diff --git a/python/PiFinder/db/observations_db.py b/python/PiFinder/db/observations_db.py index 7409c6d8a..34b72930f 100644 --- a/python/PiFinder/db/observations_db.py +++ b/python/PiFinder/db/observations_db.py @@ -11,7 +11,12 @@ class ObservationsDatabase(Database): - def __init__(self, db_path: Path = utils.observations_db): + def __init__(self, db_path: Optional[Path] = None): + # Resolved at call time, not as a default argument: an import-time + # default captures utils.observations_db before the test sandbox + # patches it, sending writes to the real ~/PiFinder_data. + if db_path is None: + db_path = utils.observations_db self._objects_db = None new_db = False if not db_path.exists(): diff --git a/python/PiFinder/displays.py b/python/PiFinder/displays.py index f42e3b883..b3b84c042 100644 --- a/python/PiFinder/displays.py +++ b/python/PiFinder/displays.py @@ -1,4 +1,5 @@ import functools +import logging import math from collections import namedtuple @@ -15,6 +16,7 @@ from PiFinder.ui.fonts import Fonts +logger = logging.getLogger("Display") ColorMask = namedtuple("ColorMask", ["mask", "mode"]) RED_RGB: ColorMask = ColorMask(np.array([1, 0, 0]), "RGB") @@ -78,7 +80,6 @@ class DisplayPygame_128(DisplayBase): def __init__(self): from luma.emulator.device import pygame - # init display (SPI hardware) pygame = pygame( width=128, height=128, diff --git a/python/PiFinder/gen_images.py b/python/PiFinder/gen_images.py index 10e3ec9a3..63ac568cb 100644 --- a/python/PiFinder/gen_images.py +++ b/python/PiFinder/gen_images.py @@ -59,7 +59,7 @@ def check_sdss_image(image: Image.Image) -> bool: return False black_pixel_count = 0 - for pixel in image.getdata(): + for pixel in cast(List, image.getdata()): if pixel == 0: black_pixel_count += 1 if black_pixel_count > 120000: diff --git a/python/PiFinder/gps_ubx_parser.py b/python/PiFinder/gps_ubx_parser.py index 0c41f41b7..12e4a062e 100644 --- a/python/PiFinder/gps_ubx_parser.py +++ b/python/PiFinder/gps_ubx_parser.py @@ -7,17 +7,24 @@ from PiFinder.multiproclogging import MultiprocLogging import asyncio import aiofiles -from typing import Dict, Callable, Optional, Tuple +from typing import Dict, Callable, Optional, Tuple, Union, TYPE_CHECKING + +if TYPE_CHECKING: + from aiofiles.threadpool.binary import AsyncBufferedReader from dataclasses import dataclass from enum import IntEnum import datetime logger = logging.getLogger("GPS.parser") -# u-blox quality indicator (qualityInd / flags bits 0-2) value at which the -# signal is code locked; below this the receiver is still searching and any -# reported C/N0 is an unconfirmed acquisition candidate. -QUALITY_CODE_LOCKED = 4 +# u-blox quality indicator (qualityInd / flags bits 0-2) scale: 0 no signal, +# 1 searching, 2 signal acquired, 3 signal detected but unusable, 4 code +# locked, 5-7 code and carrier locked. At 1 the receiver is still searching +# and any reported C/N0 is only an estimate for a candidate — counting those +# makes the seen count start near the channel count and sink; counting only +# code-locked (>= 4) makes it flap to zero during marginal re-acquisition. +# "Signal acquired" is the honest definition of a satellite being seen. +QUALITY_SIGNAL_ACQUIRED = 2 class UBXClass(IntEnum): @@ -55,7 +62,9 @@ class UBXParser: def __init__( self, log_queue, - reader: Optional[asyncio.StreamReader] = None, + # StreamReader when connected to gpsd, AsyncBufferedReader when + # replaying a capture file (from_file); both only need .read(). + reader: Optional[Union[asyncio.StreamReader, "AsyncBufferedReader"]] = None, writer: Optional[asyncio.StreamWriter] = None, file_path: Optional[str] = None, ): @@ -164,7 +173,7 @@ async def connect(cls, log_queue, host="127.0.0.1", port=2947, max_attempts=5): async def from_file(cls, file_path: str): """Create a UBXParser instance from a file.""" f = await aiofiles.open(file_path, "rb") - return cls(log_queue=None, reader=f, file_path=file_path) # type:ignore[arg-type] + return cls(log_queue=None, reader=f, file_path=file_path) async def close(self): """Clean up resources and close the connection.""" @@ -321,9 +330,7 @@ def _parse_nav_sat(self, data: bytes) -> dict: azim = int.from_bytes(data[offset + 4 : offset + 6], "little", signed=True) flags = data[offset + 8] # X4 bitfield, only the first byte is needed here: # bits 0-2 are the quality indicator, bit 3 is svUsed - # NAV-SAT lists every known satellite, including acquisition - # candidates with an estimated C/N0; only count tracked signals - if (flags & 0x07) >= QUALITY_CODE_LOCKED: + if cno > 0 and (flags & 0x07) >= QUALITY_SIGNAL_ACQUIRED: satellites.append( { "id": svId, @@ -374,11 +381,7 @@ def _parse_nav_svinfo(self, data: bytes) -> dict: if is_used: used_sats += 1 - # During cold-start acquisition the receiver reports estimated - # C/N0 for candidates it is still searching for; counting those - # makes the seen count start high and sink as they fail to - # confirm. Only quality >= 4 (code locked) is really tracked. - if quality >= QUALITY_CODE_LOCKED: + if cno > 0 and quality >= QUALITY_SIGNAL_ACQUIRED: satellites.append( { "id": svid, diff --git a/python/PiFinder/hardware_detect.py b/python/PiFinder/hardware_detect.py index 26956b863..5771982e0 100644 --- a/python/PiFinder/hardware_detect.py +++ b/python/PiFinder/hardware_detect.py @@ -9,8 +9,8 @@ BQ25895 charger?". The battery monitor only spawns when the charger is detected. -Import-safe on dev machines: ``board`` is imported under try/except so -this module loads even without blinka / an I2C bus. +Import-safe on dev machines: the I2C bus factory is imported under +try/except so this module loads even without blinka / an I2C bus. """ import logging @@ -18,17 +18,17 @@ from PiFinder.types.hardware import HardwareCapabilities try: - import board + from PiFinder.i2c_bus import get_i2c except (ImportError, NotImplementedError): - board = None + get_i2c = None # type: ignore[assignment] logger = logging.getLogger("HardwareDetect") -# BQ25895 single-cell Li-ion charger, I2C address 0x6A on bus 1. +# BQ25895 single-cell Li-ion charger, I2C address 0x6A. BQ25895_ADDRESS = 0x6A -def i2c_present(address: int, bus: int = 1) -> bool: +def i2c_present(address: int) -> bool: """Non-destructive I2C presence check: does ``address`` ACK on the bus? @@ -41,10 +41,10 @@ def i2c_present(address: int, bus: int = 1) -> bool: Raises if no I2C bus is available (no blinka); callers that want a soft answer should catch. """ - if board is None: + if get_i2c is None: raise RuntimeError("blinka / board unavailable — no I2C bus") - i2c = board.I2C() + i2c = get_i2c() locked = False try: while not i2c.try_lock(): diff --git a/python/PiFinder/i2c_bus.py b/python/PiFinder/i2c_bus.py new file mode 100644 index 000000000..4232bc1a3 --- /dev/null +++ b/python/PiFinder/i2c_bus.py @@ -0,0 +1,62 @@ +#!/usr/bin/python +# -*- coding:utf-8 -*- +""" +I2C bus selection for PiFinder peripherals (BNO055 IMU, BQ25895 charger). + +The BCM2835/BCM2711 hardware I2C block (Pi 4 and earlier) has a +well-documented silicon bug: when a slave stretches the clock — which the +BNO055 does on almost every transaction — the controller can emit a +too-short SCL pulse and corrupt the transfer. Boards affected by that bug +provision a software (bit-banged) i2c-gpio bus on the same SDA/SCL pins +via a device-tree overlay; i2c-gpio implements clock stretching per spec. + +Which bus exists is a boot-configuration decision (the per-board NixOS +hardware profile). This module hands out whatever the device tree +provides: the i2c-gpio adapter when one is present, the default hardware +bus otherwise. Boards with a correct I2C controller (Pi 5 / CM5 with RP1) +simply don't provision the overlay and get the hardware bus. +""" + +import glob +import logging + +import board +from adafruit_extended_bus import ExtendedI2C + +logger = logging.getLogger("I2C") + + +def _is_gpio_adapter(adapter_dir: str) -> bool: + """Return True when the sysfs adapter dir belongs to an i2c-gpio bus. + + Checks the adapter name first, then the platform device's device-tree + compatible string (the adapter dir's parent) — the name format has + varied across kernel versions, the compatible string has not. + """ + try: + with open(adapter_dir + "/name") as handle: + if handle.read().strip().startswith("i2c-gpio"): + return True + except OSError: + pass + try: + with open(adapter_dir + "/../of_node/compatible", "rb") as handle: + return b"i2c-gpio" in handle.read() + except OSError: + return False + + +def get_i2c(): + """Return the I2C bus object for PiFinder peripherals. + + Prefers a bit-banged i2c-gpio adapter when the device tree provides + one; falls back to the default hardware bus (``board.I2C()``). + """ + for name_path in sorted(glob.glob("/sys/bus/i2c/devices/i2c-*/name")): + adapter_dir = name_path.rsplit("/", 1)[0] + if _is_gpio_adapter(adapter_dir): + bus_number = int(adapter_dir.rsplit("/i2c-", 1)[1]) + logger.info("Using i2c-gpio bus /dev/i2c-%d", bus_number) + return ExtendedI2C(bus_number) + logger.info("Using default hardware I2C bus") + return board.I2C() diff --git a/python/PiFinder/image_util.py b/python/PiFinder/image_util.py index cf1d1b4fe..6768e82bd 100644 --- a/python/PiFinder/image_util.py +++ b/python/PiFinder/image_util.py @@ -10,7 +10,6 @@ from PIL import Image, ImageChops import numpy as np -import scipy.ndimage def make_red(in_image, colors): @@ -37,6 +36,8 @@ def gamma_correct(in_value, gamma): def subtract_background(image, percent=1): + import scipy.ndimage + image = np.asarray(image, dtype=np.float32) if image.ndim == 3: assert image.shape[2] in (1, 3), "Colour image must have 1 or 3 colour channels" diff --git a/python/PiFinder/imu_pi.py b/python/PiFinder/imu_pi.py index adc2a85f3..348635ebb 100644 --- a/python/PiFinder/imu_pi.py +++ b/python/PiFinder/imu_pi.py @@ -9,7 +9,7 @@ from PiFinder import config from PiFinder.multiproclogging import MultiprocLogging from PiFinder.types.positioning import ImuSample -import board +from PiFinder.i2c_bus import get_i2c import adafruit_bno055 import logging import quaternion # Numpy quaternion @@ -27,7 +27,7 @@ class Imu: """ def __init__(self): - i2c = board.I2C() + i2c = get_i2c() self.sensor = adafruit_bno055.BNO055_I2C(i2c) # IMPLUS mode: Accelerometer + Gyro + Fusion data self.sensor.mode = adafruit_bno055.IMUPLUS_MODE @@ -197,9 +197,33 @@ def imu_monitor(shared_state, console_queue, log_queue): # fake-IMU fallback has no such attr (and self-throttles), hence the default. sample_period = getattr(imu, "imu_sample_frequency", 1 / 30) + # A transient bus error (e.g. the BCM2711 clock-stretching bug NACKing + # a transfer) must not kill the IMU process: skip the sample and retry. + # Only a persistent failure warrants re-creating Imu() — construction + # re-opens the bus and restores IMUPLUS mode, which matters because a + # power-glitched BNO055 wakes up in CONFIG mode. + reinit_after_errors = 60 # consecutive errors (~2 s at 30 Hz) + consecutive_errors = 0 + while True: loop_start = time.monotonic() - imu.update() + try: + imu.update() + consecutive_errors = 0 + except (OSError, RuntimeError) as e: + consecutive_errors += 1 + if consecutive_errors == 1: + logger.warning("IMU: bus error, retrying: %s", e) + if consecutive_errors >= reinit_after_errors: + logger.error("IMU: persistent bus errors, re-initialising sensor") + console_queue.put("IMU: bus errors, re-initialising") + try: + imu = Imu() + except (OSError, RuntimeError) as reinit_error: + logger.error("IMU: re-init failed: %s", reinit_error) + consecutive_errors = 0 + time.sleep(sample_period) + continue imu_sample.status = imu.calibration # Raw data + read epoch are captured by imu.update() in the same diff --git a/python/PiFinder/main.py b/python/PiFinder/main.py index d21252791..58b0339c0 100644 --- a/python/PiFinder/main.py +++ b/python/PiFinder/main.py @@ -22,7 +22,9 @@ import datetime import json import uuid +import sys import logging +import traceback import argparse import pickle from pathlib import Path @@ -124,6 +126,31 @@ def set_brightness(level, cfg): set_keypad_brightness(level * 0.05 * keypad_offsets[keypad_brightness]) +def apply_test_mode_gps(shared_state, location, console): + """ + Fake GPS fix + datetime used while test mode is active. + Called on toggle-ON and at startup when test_mode was persisted, + so a reboot in test mode comes back fully in test mode. + """ + dt = timez.utc(2025, 6, 28, 11, 0, 0) + shared_state.set_datetime(dt) + location.lat = 41.13 + location.lon = -120.97 + location.altitude = 1315 + location.source = "test" + location.error_in_m = 5 + location.lock = True + location.lock_type = 3 + location.last_gps_lock = timez.local_now().time().isoformat()[:8] + console.write(f"GPS: Location {location.lat} {location.lon} {location.altitude}") + shared_state.set_location(location) + sf_utils.set_location( + location.lat, + location.lon, + location.altitude, + ) + + def setup_dirs(): utils.create_path(Path(utils.data_dir)) utils.create_path(Path(utils.data_dir, "captures")) @@ -153,6 +180,8 @@ def __init__(self, cfg, shared_state, display_device): self.shared_state = shared_state self.display_device = display_device self.last_activity = time.time() + self.sleep_start_time = None + self.screen_off_start_time = None def register_activity(self): """ @@ -162,8 +191,9 @@ def register_activity(self): self.last_activity = time.time() # power states - # 0 = Sleep - # 1 = Wake + # -1 = Screen off + # 0 = Sleep + # 1 = Wake if self.shared_state.power_state() < 1: # wake up self.wake_up() @@ -176,6 +206,8 @@ def wake_up(self): Do all the wakeup things """ self.last_activity = time.time() + self.sleep_start_time = None + self.screen_off_start_time = None self.shared_state.set_power_state(1) self.wake_screen() @@ -184,6 +216,7 @@ def go_to_sleep(self): Do all the sleep things """ self.shared_state.set_power_state(0) + self.sleep_start_time = time.time() self.sleep_screen() def update(self): @@ -202,11 +235,36 @@ def update(self): if time.time() - self.last_activity > self.get_sleep_timeout(): self.go_to_sleep() - else: # We are asleepd, should we wake up? + elif self.shared_state.power_state() == 0: + # We are asleep, should we wake up or go to screen off? _imu = self.shared_state.imu() if _imu: if _imu.moving: self.wake_up() + return + + # Check if we should turn screen off + screen_off_timeout = self.get_screen_off_timeout() + if ( + screen_off_timeout > 0 + and self.sleep_start_time is not None + and time.time() - self.sleep_start_time > screen_off_timeout + ): + self.screen_off() + + # Screen off mode: LED heartbeat, longer sleep + if self.shared_state.power_state() == -1: + _imu = self.shared_state.imu() + if _imu and _imu.moving: + self.wake_up() + return + self.update_heartbeat() + time.sleep(1.0) + return + + # should we pause execution for a bit? + if self.shared_state.power_state() < 1: + time.sleep(0.2) def get_sleep_timeout(self): """ @@ -247,6 +305,23 @@ def sleep_screen(self): set_brightness(int(screen_brightness / 4), self.cfg) self.display_device.device.show() + def screen_off(self): + """Completely blank screen and turn off LEDs""" + self.shared_state.set_power_state(-1) + self.screen_off_start_time = time.time() + self.display_device.device.hide() + set_keypad_brightness(0) + + def update_heartbeat(self): + """Pulse all LEDs briefly every hour""" + if self.screen_off_start_time is None: + return + seconds_into_hour = (time.time() - self.screen_off_start_time) % 3600 + if seconds_into_hour < 0.5: + set_keypad_brightness(2) + else: + set_keypad_brightness(0) + def start_profiling(): """Start profiling for performance analysis""" @@ -444,14 +519,31 @@ def main( shared_state.set_ui_state(ui_state) shared_state.set_arch(arch) # Normal shared_state.set_hardware(capabilities) + # Initialize test_mode from config so camera process can read it at startup + shared_state.set_test_mode(cfg.get_option("test_mode", False)) logger.debug("Ui state in main is" + str(shared_state.ui_state())) console = UIConsole( display_device, None, shared_state, command_queues, cfg, Catalogs([]) ) + if shared_state.test_mode(): + apply_test_mode_gps(shared_state, location, console) console.write("Starting....") console.update() logger.info("Starting ....") + # One-shot notice from the boot watchdog: a failed upgrade was + # auto-rolled-back to this (previous) generation. + upgrade_failed_notice = utils.data_dir / "upgrade_failed.json" + if upgrade_failed_notice.exists(): + console.write("!! Update failed") + console.write("!! Rolled back") + console.update() + logger.warning("Previous upgrade failed; watchdog rolled back") + try: + upgrade_failed_notice.unlink() + except OSError: + pass + # spawn gps service.... console.write(" GPS") console.update() @@ -658,6 +750,12 @@ def main( logger.info(" Event Loop") console.update() + # Everything is constructed and the display is live: declare readiness + # to systemd. This is the health signal the boot watchdog keys off — + # a build that dies before this line never reports READY and fails its + # trial. No-op outside systemd (development runs). + utils.sd_notify("READY=1") + # Stop profiling (uncomment to analyze startup performance) # stop_profiling(profiler, startup_profile_start) @@ -809,25 +907,17 @@ def main( catalogs.catalog_filter.mark_dirty() menu_manager.message(_("Catalogs\nFully Loaded"), 2) elif ui_command == "test_mode": - dt = timez.utc(2025, 6, 28, 11, 0, 0) - shared_state.set_datetime(dt) - location.lat = 41.13 - location.lon = -120.97 - location.altitude = 1315 - location.source = "test" - location.error_in_m = 5 - location.lock = True - location.lock_type = 3 - location.last_gps_lock = timez.local_now().time().isoformat()[:8] - console.write( - f"GPS: Location {location.lat} {location.lon} {location.altitude}" - ) - shared_state.set_location(location) - sf_utils.set_location( - location.lat, - location.lon, - location.altitude, - ) + # Toggle test mode (store in both shared_state and config). + # The camera process follows shared_state.test_mode() + # directly, so this is the single point of control. + new_test_mode = not cfg.get_option("test_mode", False) + shared_state.set_test_mode(new_test_mode) + cfg.set_option("test_mode", new_test_mode) + if new_test_mode: + apply_test_mode_gps(shared_state, location, console) + menu_manager.message(_("Test Mode ON\nfake cam+GPS"), 2) + else: + menu_manager.message(_("Test Mode\nOFF"), 2) elif ui_command == "set_volume": # Master volume changed in the menu: re-push the level # (main owns both cfg and sound_queue). The player plays @@ -1115,11 +1205,6 @@ def main( if __name__ == "__main__": import sys - # Ensure the active log config symlink exists, defaulting to logconf_default.json - _logconf_link = Path("pifinder_logconf.json") - if not _logconf_link.exists(): - _logconf_link.symlink_to("logconf_default.json") - debug_no_file_logs = "--debug-no-file-logs" in sys.argv if debug_no_file_logs: os.environ["PIFINDER_DEBUG_NO_FILE_LOGS"] = "1" @@ -1130,13 +1215,13 @@ def main( rlogger.setLevel(logging.DEBUG if debug_no_file_logs else logging.INFO) if debug_no_file_logs: - log_helper = MultiprocLogging(Path("pifinder_logconf.json"), console_only=True) + log_helper = MultiprocLogging(utils.active_logconf_path(), console_only=True) MultiprocLogging.configurer(log_helper.get_queue()) else: log_path = utils.data_dir / "pifinder.log" try: log_helper = MultiprocLogging( - Path("pifinder_logconf.json"), + utils.active_logconf_path(), log_path, ) MultiprocLogging.configurer(log_helper.get_queue()) @@ -1354,4 +1439,11 @@ def main( main(log_helper, args.script, args.fps, args.verbose, args.profile_startup) except Exception: rlogger.exception("Exception in main(). Aborting program.") + # Logging is multiprocess (QueueHandler -> listener); os._exit() below + # can kill this process before the queued traceback is ever written to + # the log file. Write it straight to stderr (captured by the journal) + # and flush every handler so the cause is never lost on a hard abort. + traceback.print_exc() + sys.stderr.flush() + logging.shutdown() os._exit(1) diff --git a/python/PiFinder/multiproclogging.py b/python/PiFinder/multiproclogging.py index 46c780a12..9e150af51 100644 --- a/python/PiFinder/multiproclogging.py +++ b/python/PiFinder/multiproclogging.py @@ -10,7 +10,6 @@ import multiprocessing.queues from pathlib import Path from multiprocessing import Queue, Process -import multiprocessing from queue import Empty from time import sleep from typing import TextIO, List, Optional @@ -19,6 +18,8 @@ import logging.config import logging.handlers +from PiFinder import utils + class MultiprocLogging: """ @@ -190,7 +191,7 @@ def configurer(queue: Queue): queue, multiprocessing.queues.Queue ), "That's not a Queue! You have to pass a queue" - log_conf_file = Path("pifinder_logconf.json") + log_conf_file = utils.active_logconf_path() with open(log_conf_file, "r") as logconf: config = json5.load(logconf) logging.config.dictConfig(config) diff --git a/python/PiFinder/nearby.py b/python/PiFinder/nearby.py index ea7c36a9a..84e703c59 100644 --- a/python/PiFinder/nearby.py +++ b/python/PiFinder/nearby.py @@ -2,7 +2,6 @@ from typing import List import time import numpy as np -from sklearn.neighbors import BallTree import logging logger = logging.getLogger("Catalog.Nearby") @@ -80,6 +79,8 @@ def calculate_objects_balltree(self, objects: list[CompositeObject]) -> None: object_radecs = np.array( [[np.deg2rad(x.ra), np.deg2rad(x.dec)] for x in deduplicated_objects] ) + from sklearn.neighbors import BallTree + self._objects = np.array(deduplicated_objects) self._objects_balltree = BallTree( object_radecs, leaf_size=20, metric="haversine" diff --git a/python/PiFinder/net_policy.py b/python/PiFinder/net_policy.py new file mode 100644 index 000000000..10b9284f7 --- /dev/null +++ b/python/PiFinder/net_policy.py @@ -0,0 +1,206 @@ +"""Network policy daemon: wired -> wifi client -> access point. + +Event-driven via NetworkManager's GObject API (libnm) — the same API +sys_utils uses — plus a slow tick for the time-based rules. Replaces the +nmcli-parsing shell fallback, whose "wifi connected" check matched the AP +itself, so once the AP was up nothing ever retried the client network. + +The decision logic lives in net_policy_core (pure, unit-tested); this module +only observes NetworkManager and executes the returned actions. +""" + +from __future__ import annotations + +import logging +import os +import subprocess +import time +from pathlib import Path +from typing import Optional + +import gi + +gi.require_version("NM", "1.0") +from gi.repository import GLib, NM # noqa: E402 + +from PiFinder.net_policy_core import ( # noqa: E402 + AP_DOWN, + AP_UP, + PolicyState, + Snapshot, + decide, +) + +logger = logging.getLogger("NetPolicy") + +AP_CONNECTION_NAME = "PiFinder-AP" +WIFI_MODE_FILE = ( + Path(os.environ.get("PIFINDER_DATA", "/home/pifinder/PiFinder_data")) / "wifi_mode" +) + +# Safety-net re-evaluation cadence; NM signals are the primary trigger. +TICK_SECONDS = 10 +# Collapse bursts of NM signals into one evaluation. +DEBOUNCE_SECONDS = 2 + + +def _read_forced_ap() -> bool: + try: + return WIFI_MODE_FILE.read_text().strip() == "AP" + except OSError: + return False + + +def _count_ap_stations(iface: str) -> int: + """Associated stations on the AP interface, via `iw` (libnm has no API + for AP client lists). Errs toward "occupied" so a counting failure never + causes the retry logic to yank a possibly-used AP.""" + try: + out = subprocess.run( + ["iw", "dev", iface, "station", "dump"], + capture_output=True, + text=True, + timeout=10, + ).stdout + except (OSError, subprocess.SubprocessError): + return 1 + return sum(1 for line in out.splitlines() if line.startswith("Station")) + + +class NetPolicyDaemon: + def __init__(self) -> None: + self._client = NM.Client.new(None) + self._state = PolicyState() + self._debounce_id: Optional[int] = None + + self._client.connect("notify::active-connections", self._on_change) + self._client.connect("device-added", self._on_device_added) + self._client.connect("device-removed", self._on_change) + for dev in self._client.get_devices(): + self._hook_device(dev) + + GLib.timeout_add_seconds(TICK_SECONDS, self._on_tick) + self._evaluate() + + # -- NM signal plumbing -------------------------------------------------- + + def _hook_device(self, dev: NM.Device) -> None: + dev.connect("state-changed", self._on_change) + + def _on_device_added(self, _client, dev) -> None: + self._hook_device(dev) + self._schedule_evaluate() + + def _on_change(self, *_args) -> None: + self._schedule_evaluate() + + def _on_tick(self) -> bool: + self._evaluate() + return True # keep the tick alive + + def _schedule_evaluate(self) -> None: + if self._debounce_id is not None: + GLib.source_remove(self._debounce_id) + self._debounce_id = GLib.timeout_add_seconds( + DEBOUNCE_SECONDS, self._debounced_evaluate + ) + + def _debounced_evaluate(self) -> bool: + self._debounce_id = None + self._evaluate() + return False # one-shot + + # -- state observation --------------------------------------------------- + + def _wifi_iface(self) -> Optional[str]: + for dev in self._client.get_devices(): + if dev.get_device_type() == NM.DeviceType.WIFI: + return dev.get_iface() + return None + + def _snapshot(self) -> Snapshot: + eth_connected = False + wifi_client_active = False + ap_active = False + + for ac in self._client.get_active_connections(): + if ac.get_state() != NM.ActiveConnectionState.ACTIVATED: + continue + conn_type = ac.get_connection_type() + if conn_type == "802-3-ethernet": + eth_connected = True + elif conn_type == "802-11-wireless": + if ac.get_id() == AP_CONNECTION_NAME: + ap_active = True + else: + wifi_client_active = True + + ap_stations = 0 + if ap_active: + iface = self._wifi_iface() + ap_stations = _count_ap_stations(iface) if iface else 1 + + return Snapshot( + forced_ap=_read_forced_ap(), + eth_connected=eth_connected, + wifi_client_active=wifi_client_active, + ap_active=ap_active, + ap_stations=ap_stations, + ) + + # -- actions --------------------------------------------------------------- + + def _evaluate(self) -> None: + snap = self._snapshot() + action = decide(snap, self._state, time.monotonic()) + if action == AP_UP: + logger.info("no connectivity after grace period — bringing AP up") + self._ap_up() + elif action == AP_DOWN: + reason = ( + "wired connectivity present" + if snap.eth_connected + else ("idle AP — retrying client network") + ) + logger.info("%s — bringing AP down", reason) + self._ap_down() + + def _ap_up(self) -> None: + conn = None + for c in self._client.get_connections(): + if c.get_id() == AP_CONNECTION_NAME: + conn = c + break + if conn is None: + logger.error("AP connection %r not found", AP_CONNECTION_NAME) + return + self._client.activate_connection_async( + conn, None, None, None, self._on_action_done, "activate" + ) + + def _ap_down(self) -> None: + for ac in self._client.get_active_connections(): + if ac.get_id() == AP_CONNECTION_NAME: + self._client.deactivate_connection_async( + ac, None, self._on_action_done, "deactivate" + ) + return + + def _on_action_done(self, client, result, verb) -> None: + try: + if verb == "activate": + client.activate_connection_finish(result) + else: + client.deactivate_connection_finish(result) + except GLib.Error as e: + logger.warning("AP %s failed: %s", verb, e.message) + + +def main() -> None: + logging.basicConfig(level=logging.INFO, format="%(name)s: %(message)s") + NetPolicyDaemon() + GLib.MainLoop().run() + + +if __name__ == "__main__": + main() diff --git a/python/PiFinder/net_policy_core.py b/python/PiFinder/net_policy_core.py new file mode 100644 index 000000000..5b59547bd --- /dev/null +++ b/python/PiFinder/net_policy_core.py @@ -0,0 +1,95 @@ +"""Decision core for the PiFinder network policy daemon. + +Pure logic with no NetworkManager dependency, so it is unit-testable on any +machine. The daemon (net_policy.py) feeds it snapshots of the current network +state and executes the actions it returns. + +Connectivity priority: wired -> wifi client -> access point. The AP is a +fallback for reaching an otherwise-offline device, never a preference: with a +cable plugged in or a client network joined, the AP stays down. +""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Optional + +# How long NetworkManager gets to join a known client network before the AP +# comes up. Also applies after an idle-AP retry drops the AP. +GRACE_SECONDS = 45 + +# While the AP is up with nobody connected to it, drop it this often so NM can +# rescan and rejoin a client network that has come into range. Without this +# the AP is sticky: an active AP counts as "wifi connected", so nothing ever +# retries the client network. +CLIENT_RETRY_SECONDS = 300 + +AP_UP = "ap_up" +AP_DOWN = "ap_down" + + +@dataclass +class Snapshot: + """Point-in-time network state, as observed by the daemon.""" + + forced_ap: bool # operator forced AP mode via PiFinder_data/wifi_mode + eth_connected: bool # an ethernet connection is activated + wifi_client_active: bool # a non-AP wifi connection is activated + ap_active: bool # the PiFinder-AP connection is activated + ap_stations: int # clients associated to the AP (0 when ap inactive) + + +@dataclass +class PolicyState: + """Timing state carried between decisions.""" + + disconnected_since: Optional[float] = None + last_client_retry: Optional[float] = None + + +def decide(snap: Snapshot, state: PolicyState, now: float) -> Optional[str]: + """Return the action to take (AP_UP / AP_DOWN / None), updating `state`. + + `now` is a monotonic timestamp supplied by the caller. + """ + if snap.forced_ap: + state.disconnected_since = None + return None if snap.ap_active else AP_UP + + if snap.eth_connected: + # Wired connectivity is sufficient: the device is reachable and + # online. Dropping the AP frees the radio so NM autoconnects to a + # client network whenever one appears. + state.disconnected_since = None + return AP_DOWN if snap.ap_active else None + + if snap.wifi_client_active: + state.disconnected_since = None + return None + + if snap.ap_active: + # Offline fallback is serving. Periodically drop an *idle* AP so NM + # can retry the client network; the grace path below restores the AP + # if nothing joins. Never yanks the AP away from a connected user. + if state.last_client_retry is None: + state.last_client_retry = now + return None + if ( + snap.ap_stations == 0 + and now - state.last_client_retry >= CLIENT_RETRY_SECONDS + ): + state.last_client_retry = now + state.disconnected_since = now + return AP_DOWN + return None + + # Fully disconnected: give NM a grace period to join a known client + # network, then bring up the AP. + if state.disconnected_since is None: + state.disconnected_since = now + return None + if now - state.disconnected_since >= GRACE_SECONDS: + state.disconnected_since = None + state.last_client_retry = now + return AP_UP + return None diff --git a/python/PiFinder/nixos_migration_wifi.py b/python/PiFinder/nixos_migration_wifi.py deleted file mode 100644 index 03b0e688e..000000000 --- a/python/PiFinder/nixos_migration_wifi.py +++ /dev/null @@ -1,276 +0,0 @@ -"""Convert wpa_supplicant.conf to NetworkManager keyfiles. - -Runs during the pre-migration phase on Debian, before reboot into the -initramfs. Keyfiles get staged into the initramfs build dir and the -init script just copies them into the new rootfs — much safer than -generating them in busybox shell after the rootfs has been formatted. -""" - -from __future__ import annotations - -import argparse -import os -import re -import sys -import uuid -from pathlib import Path -from typing import Callable, Iterable, List, Optional - - -WPA_NETWORK_OPEN = re.compile(r"^\s*network\s*=\s*\{") -WPA_NETWORK_CLOSE = re.compile(r"^\s*\}") -WPA_KEY_VALUE = re.compile(r"^\s*([a-zA-Z0-9_]+)\s*=\s*(.*?)\s*$") - -HEX_PSK_RE = re.compile(r"^[0-9a-fA-F]{64}$") -HEX_STRING_RE = re.compile(r"^(?:[0-9a-fA-F]{2})+$") - - -class Network: - __slots__ = ("ssid", "psk") - - def __init__(self, ssid: str, psk: Optional[str]) -> None: - self.ssid = ssid - self.psk = psk - - def __eq__(self, other: object) -> bool: - return ( - isinstance(other, Network) - and self.ssid == other.ssid - and self.psk == other.psk - ) - - def __repr__(self) -> str: - psk_repr = "None" if self.psk is None else f"<{len(self.psk)}c>" - return f"Network(ssid={self.ssid!r}, psk={psk_repr})" - - -def _unquote(value: str) -> str: - """Strip a single surrounding pair of double quotes if present.""" - if len(value) >= 2 and value.startswith('"') and value.endswith('"'): - return value[1:-1] - return value - - -def _parse_ssid(value: str) -> str: - """Decode a wpa_supplicant ssid value. - - Quoted values are plain strings. Unquoted values are hex-encoded byte - strings per wpa_supplicant syntax — decode them here, or the network - name ends up mangled; surrogateescape keeps non-UTF-8 SSID bytes - round-trippable into the keyfile byte list. - """ - if len(value) >= 2 and value.startswith('"') and value.endswith('"'): - return value[1:-1] - if HEX_STRING_RE.fullmatch(value): - return bytes.fromhex(value).decode("utf-8", "surrogateescape") - return value - - -def parse_wpa_supplicant_conf(text: str) -> List[Network]: - """Parse the subset of wpa_supplicant.conf we care about. - - Recognises `network={ ... }` blocks containing `ssid=` and `psk=`. - Quoted values get their outer quotes stripped. Unquoted PSKs (the - 64-hex-char pre-shared-key form) are kept verbatim — NetworkManager - accepts both. Networks without an SSID are skipped. - - Returns the networks in declaration order. - """ - networks: List[Network] = [] - in_net = False - ssid: Optional[str] = None - psk: Optional[str] = None - - for raw_line in text.splitlines(): - line = raw_line.split("#", 1)[0].strip() - if not line: - continue - - if WPA_NETWORK_OPEN.match(line): - in_net = True - ssid = None - psk = None - continue - - if WPA_NETWORK_CLOSE.match(line): - if in_net and ssid is not None: - networks.append(Network(ssid=ssid, psk=psk)) - in_net = False - ssid = None - psk = None - continue - - if not in_net: - continue - - match = WPA_KEY_VALUE.match(line) - if not match: - continue - key, value = match.group(1), match.group(2) - if key == "ssid": - ssid = _parse_ssid(value) - elif key == "psk": - psk = _unquote(value) - - return networks - - -def ssid_to_bytelist(ssid: str) -> str: - """Encode an SSID as a NetworkManager keyfile byte list (`97;112;...`). - - NM's keyfile format documents exactly two ssid forms: a plain string and - a semicolon-separated list of DECIMAL byte values. Anything else (hex, - 0x-prefixed or not) is silently kept as a literal-string SSID, mangling - the network name so the device can never join it. surrogateescape - restores non-UTF-8 bytes captured from wpa_supplicant's hex ssid form. - """ - return "".join(f"{b};" for b in ssid.encode("utf-8", "surrogateescape")) - - -def escape_keyfile_value(value: str) -> str: - """Escape characters that have meaning in NM keyfile values. - - Backslash and semicolon are the only special characters in a plain - string value. (The byte-list format uses the semicolon as separator, - but we don't use that for the PSK.) - """ - return value.replace("\\", "\\\\").replace(";", "\\;") - - -_SAFE_FN_CHARS = re.compile(r"[^A-Za-z0-9._-]") - - -def sanitize_filename(ssid: str) -> str: - """Build a safe filename for a connection keyfile from an SSID. - - Non-alphanumeric characters (except `.`, `_`, `-`) are replaced with - `_`. The result is also guarded against the empty string and `.`/`..` - so a hostile or odd SSID can't escape the connections directory. - """ - cleaned = _SAFE_FN_CHARS.sub("_", ssid) - if cleaned in ("", ".", ".."): - return "wifi" - return cleaned - - -def build_keyfile( - ssid: str, - psk: Optional[str], - connection_uuid: Optional[str] = None, -) -> str: - """Build a NetworkManager keyfile body for a single WiFi connection. - - `psk=None` produces an open-network keyfile (no [wifi-security]). - `connection_uuid=None` generates a fresh v4 UUID. - """ - if connection_uuid is None: - connection_uuid = str(uuid.uuid4()) - - id_escaped = escape_keyfile_value(ssid) - ssid_encoded = ssid_to_bytelist(ssid) - - lines = [ - "[connection]", - f"id={id_escaped}", - f"uuid={connection_uuid}", - "type=wifi", - "autoconnect=true", - "", - "[wifi]", - "mode=infrastructure", - f"ssid={ssid_encoded}", - "", - ] - - if psk is not None and psk != "": - psk_escaped = escape_keyfile_value(psk) - lines.extend( - [ - "[wifi-security]", - "key-mgmt=wpa-psk", - f"psk={psk_escaped}", - "", - ] - ) - - lines.extend( - [ - "[ipv4]", - "method=auto", - "", - "[ipv6]", - "method=auto", - "", - ] - ) - return "\n".join(lines) - - -def emit_keyfiles( - networks: Iterable[Network], - output_dir: Path, - uuid_factory: Callable[[], str] = lambda: str(uuid.uuid4()), -) -> List[Path]: - """Write a keyfile per network into `output_dir`. - - Filenames are based on a sanitised SSID; collisions get a numeric - suffix. Files are mode 0600. Returns the list of paths written. - """ - output_dir.mkdir(parents=True, exist_ok=True) - written: List[Path] = [] - used: set = set() - - for net in networks: - base = sanitize_filename(net.ssid) - name = base - n = 1 - while name in used: - n += 1 - name = f"{base}_{n}" - used.add(name) - - path = output_dir / f"{name}.nmconnection" - body = build_keyfile(net.ssid, net.psk, connection_uuid=uuid_factory()) - path.write_text(body) - os.chmod(path, 0o600) - written.append(path) - - return written - - -def _main(argv: Optional[List[str]] = None) -> int: - parser = argparse.ArgumentParser( - description=( - "Convert wpa_supplicant.conf to NetworkManager keyfiles for " - "the PiFinder NixOS migration." - ) - ) - parser.add_argument( - "--wpa-conf", - required=True, - help="Path to the source wpa_supplicant.conf file.", - ) - parser.add_argument( - "--out", - required=True, - help="Directory to write the .nmconnection files into (created if absent).", - ) - args = parser.parse_args(argv) - - src = Path(args.wpa_conf) - if not src.exists(): - print(f"wpa_supplicant.conf not found at {src}", file=sys.stderr) - return 0 - - networks = parse_wpa_supplicant_conf(src.read_text()) - if not networks: - print(f"No networks parsed from {src}", file=sys.stderr) - return 0 - - written = emit_keyfiles(networks, Path(args.out)) - print(f"Wrote {len(written)} keyfile(s) to {args.out}", file=sys.stderr) - return 0 - - -if __name__ == "__main__": - sys.exit(_main()) diff --git a/python/PiFinder/nixos_upgrade.py b/python/PiFinder/nixos_upgrade.py new file mode 100644 index 000000000..1b37d5322 --- /dev/null +++ b/python/PiFinder/nixos_upgrade.py @@ -0,0 +1,582 @@ +"""NixOS upgrade runner for PiFinder. + +This module is intentionally small and standard-library only. It is launched by +systemd as root, writes the status file consumed by the UI, and guarantees a +terminal status for every non-reboot exit. +""" + +from __future__ import annotations + +import argparse +import json +import logging +import re +import subprocess +import urllib.error +import urllib.request +from collections import deque +from dataclasses import dataclass +from pathlib import Path +from typing import Iterable + +logger = logging.getLogger("PiFinder.nixos_upgrade") + +RUN_DIR = Path("/run/pifinder") +UPGRADE_REF_FILE = RUN_DIR / "upgrade-ref" +UPGRADE_SELECTION_FILE = RUN_DIR / "upgrade-selection.json" +UPGRADE_STATUS_FILE = RUN_DIR / "upgrade-status" +UPGRADE_LOG_FILE = RUN_DIR / "upgrade-nix.log" +CURRENT_BUILD_FILE = Path("/var/lib/pifinder/current-build.json") +CAMERA_TYPE_FILE = Path("/var/lib/pifinder/camera-type") +# Arms pifinder-watchdog: present = the next boot is a trial of an unproven +# generation (roll back on failure); absent = committed system, never touched. +TRIAL_MARKER_FILE = Path("/var/lib/pifinder/trial-generation.json") + +RELEASE_CACHE = "https://cache.pifinder.eu/pifinder-release" +DEV_CACHE = "https://cache.pifinder.eu/pifinder" +CACHES = (DEV_CACHE, RELEASE_CACHE) + +STORE_PATH_RE = re.compile(r"/nix/store/[a-z0-9]+-[A-Za-z0-9._+=?,-]+") + +# nix's --dry-run prints e.g. "(0.0 KiB download, 894.9 MiB unpacked)". Attic +# narinfos carry no compressed FileSize, so the unpacked figure is the only +# whole-download size nix can report; we use it as the progress denominator. +_UNPACKED_RE = re.compile(r"([\d.]+)\s+(B|KiB|MiB|GiB|TiB)\s+unpacked") +_SIZE_UNITS = {"B": 1, "KiB": 1024, "MiB": 1024**2, "GiB": 1024**3, "TiB": 1024**4} + + +def parse_unpacked_total(dry_output: str) -> int: + m = _UNPACKED_RE.search(dry_output) + if not m: + return 0 + return int(float(m.group(1)) * _SIZE_UNITS[m.group(2)]) + + +class UpgradeError(RuntimeError): + """Generic upgrade failure.""" + + +class UnavailableError(UpgradeError): + """Selected store path is no longer available from configured caches.""" + + +@dataclass(frozen=True) +class ProgressEvent: + action: str + activity_id: int + activity_type: int | None + path: str | None + done: int | None = None + expected: int | None = None + + +@dataclass(frozen=True) +class DownloadEstimate: + paths: tuple[str, ...] + # nix's dry-run "unpacked" byte total (0 if unknown). Per-path byte progress + # streams live from the build's internal-json, so we keep no size map here. + total_bytes: int = 0 + + @property + def path_count(self) -> int: + return len(self.paths) + + +def write_status(status: str, status_file: Path = UPGRADE_STATUS_FILE) -> None: + status_file.parent.mkdir(parents=True, exist_ok=True) + status_file.write_text(status) + + +def valid_store_path(ref: str) -> bool: + return bool(STORE_PATH_RE.fullmatch(ref)) + + +def parse_store_paths(text: str) -> tuple[str, ...]: + return tuple(dict.fromkeys(STORE_PATH_RE.findall(text))) + + +def parse_progress_event(line: str) -> ProgressEvent | None: + if not line.startswith("@nix "): + return None + try: + payload = json.loads(line[5:]) + except json.JSONDecodeError: + return None + + action = payload.get("action") + activity_id = payload.get("id") + if not isinstance(activity_id, int): + return None + + # resProgress (type 105): fields = [done, expected, running, failed]. Used + # for smooth within-path byte progress (summed over copyPath activities). + if action == "result" and payload.get("type") == 105: + fields = payload.get("fields") + if ( + isinstance(fields, list) + and len(fields) >= 2 + and isinstance(fields[0], int) + and isinstance(fields[1], int) + ): + return ProgressEvent( + "result", activity_id, None, None, fields[0], fields[1] + ) + return None + + if action not in ("start", "stop"): + return None + + activity_type = payload.get("type") + if activity_type is not None and not isinstance(activity_type, int): + activity_type = None + + path = None + for value in payload.values(): + if isinstance(value, str): + match = STORE_PATH_RE.search(value) + if match: + path = match.group(0) + break + + return ProgressEvent(action, activity_id, activity_type, path) + + +def command( + args: list[str], + *, + check: bool = True, + timeout: int | None = None, + input_text: str | None = None, +) -> subprocess.CompletedProcess[str]: + result = subprocess.run( + args, + input=input_text, + capture_output=True, + text=True, + timeout=timeout, + ) + if check and result.returncode != 0: + raise UpgradeError( + f"{args[0]} failed rc={result.returncode}: {result.stderr.strip()}" + ) + return result + + +def path_exists(path: str) -> bool: + return Path(path).exists() + + +# Availability of a build on the binary caches, kept distinct on purpose: a +# cache we cannot reach must never be reported as "the build is gone". +AVAILABLE = "available" +ABSENT = "absent" +UNREACHABLE = "unreachable" + + +def _narinfo_url(store_path: str, cache: str) -> str: + digest = Path(store_path).name.split("-", 1)[0] + return f"{cache.rstrip('/')}/{digest}.narinfo" + + +def classify_store_path( + store_path: str, caches: Iterable[str] = CACHES, timeout: int = 15 +) -> str: + """Decide whether a build is downloadable, gone, or simply unreachable. + + Probes each cache's narinfo over HTTPS so a network failure is never + mistaken for a deleted build: + - AVAILABLE already in the local store, or a cache serves the narinfo + - ABSENT every cache answered and at least one returned 404 — the + build really is gone + - UNREACHABLE no cache could be reached (offline / DNS / cache down), so + availability is unknown and the upgrade should be retried + """ + if path_exists(store_path): + return AVAILABLE + + saw_404 = False + unreachable = False + for cache in caches: + url = _narinfo_url(store_path, cache) + try: + with urllib.request.urlopen(url, timeout=timeout) as resp: + if resp.status == 200: + return AVAILABLE + except urllib.error.HTTPError as exc: + if exc.code == 404: + saw_404 = True + else: + # 5xx and friends mean a troubled cache, not a deleted build. + unreachable = True + except (urllib.error.URLError, OSError, TimeoutError): + unreachable = True + + if unreachable: + return UNREACHABLE + return ABSENT if saw_404 else UNREACHABLE + + +def fetch_cache_public_keys( + caches: Iterable[str] = CACHES, timeout: int = 15 +) -> list[str]: + """Fetch each cache's current signing key from its anonymous Attic + cache-config endpoint, so the upgrade trusts whatever key the cache uses + *now*. This makes a cache signing-key rotation invisible to devices — they + can never be stranded by a key change — while signature verification stays + on (verified against the freshly-fetched key, over the same HTTPS trust + boundary as the cache we already pull from). Best-effort: a cache we cannot + reach contributes no key and we fall back to the device's configured keys. + """ + keys: list[str] = [] + for cache in caches: + base, _, name = cache.rstrip("/").rpartition("/") + url = f"{base}/_api/v1/cache-config/{name}" + try: + with urllib.request.urlopen(url, timeout=timeout) as resp: + key = json.load(resp).get("public_key") + if key: + keys.append(key) + except Exception as exc: # network / JSON errors are non-fatal + logger.warning("could not fetch cache key from %s: %s", url, exc) + return keys + + +def estimate_download(store_path: str) -> DownloadEstimate: + """Best-effort delta estimate: which paths nix will fetch, plus nix's own + "unpacked" byte total from a dry-run. We deliberately do NOT query per-path + sizes — the real byte progress streams live from the build's internal-json. + An empty estimate must never block the actual build. + """ + try: + dry_result = command( + ["nix-store", "--realise", "--dry-run", store_path], + check=False, + timeout=120, + ) + dry = f"{dry_result.stdout}\n{dry_result.stderr}" + except (subprocess.TimeoutExpired, OSError): + return DownloadEstimate(()) + return DownloadEstimate(parse_store_paths(dry), parse_unpacked_total(dry)) + + +def _short_pkg(path: str | None) -> str: + """A screen-friendly package name from a store path: drop the + /nix/store/- prefix and trim, e.g. + '/nix/store/xxx-python3-3.13.11' -> 'python3-3.13.11'.""" + if not path: + return "" + return path.rsplit("/", 1)[-1].split("-", 1)[-1][:22] + + +class _DownloadProgress: + """Best-effort download progress from nix's internal-json stream. + + Numerator = running sum of bytes copied across copyPath activities (their + resProgress events); denominator = nix's dry-run "unpacked" total. So the + bar moves *within* a path, not only when one finishes — and it names the + package being copied. Status writes are throttled (the stream emits hundreds + of thousands of events). Best-effort throughout: run_build wraps feed() so a + bug here can never abort the upgrade. + """ + + def __init__(self, total_bytes: int, total_paths: int, status_file: Path): + self.total_bytes = total_bytes + self.use_bytes = total_bytes > 0 + self.total_paths = total_paths + self.status_file = status_file + self._active: dict[int, str] = {} # copyPath id -> short label + self._done: dict[int, int] = {} # copyPath id -> bytes copied + self._expected: dict[int, int] = {} # copyPath id -> expected bytes + self._bytes = 0 + self._paths_seen = 0 + self._paths_done = 0 + self._label = "" + self._last_written = -1 + # Only rewrite the status file every ~0.5% of the total (or 1 MiB). + self._step = max(1 << 20, total_bytes // 200) if self.use_bytes else 0 + + def feed(self, line: str) -> None: + event = parse_progress_event(line) + if event is None: + return + if event.action == "result": + self._on_progress(event) + elif event.activity_type == 100: + if event.action == "start": + self._on_start(event) + elif event.action == "stop": + self._on_stop(event) + + def _on_start(self, event: ProgressEvent) -> None: + self._active[event.activity_id] = _short_pkg(event.path) + self._paths_seen += 1 + self._label = self._active[event.activity_id] or self._label + if not self.use_bytes: + self._write_paths() + + def _on_progress(self, event: ProgressEvent) -> None: + aid = event.activity_id + if aid not in self._active: # only copyPath activities we track + return + self._bytes += (event.done or 0) - self._done.get(aid, 0) + self._done[aid] = event.done or 0 + if event.expected: + self._expected[aid] = event.expected + if self.use_bytes: + pct = min(self._bytes, self.total_bytes) + if pct - self._last_written >= self._step: + self._write_bytes() + + def _on_stop(self, event: ProgressEvent) -> None: + aid = event.activity_id + if aid not in self._active: + return + label = self._active.pop(aid) + self._paths_done += 1 + if self.use_bytes: + full = self._expected.get(aid, self._done.get(aid, 0)) + self._bytes += full - self._done.get(aid, 0) + self._done[aid] = full + # show something still in flight, else the path that just finished + self._label = next(iter(self._active.values()), label) or self._label + self._write_bytes() + else: + self._write_paths() + + def _write_bytes(self) -> None: + pct = min(self._bytes, self.total_bytes) + self._last_written = pct + msg = f"downloading {pct}/{self.total_bytes}" + if self._label: + msg += f" {self._label}" + write_status(msg, self.status_file) + + def _write_paths(self) -> None: + denom = self.total_paths or self._paths_seen + write_status(f"downloading {self._paths_done}/{denom} paths", self.status_file) + + +def run_build( + store_path: str, + estimate: DownloadEstimate, + *, + status_file: Path = UPGRADE_STATUS_FILE, + log_file: Path = UPGRADE_LOG_FILE, +) -> int: + if estimate.total_bytes > 0: + write_status(f"downloading 0/{estimate.total_bytes}", status_file) + else: + write_status(f"downloading 0/{estimate.path_count} paths", status_file) + + # Trust the cache's current signing key(s), fetched from the cache itself, + # so a key rotation can never strand this device mid-upgrade. This ADDS to + # the trusted set (verification stays on) — it is not a require-sigs bypass. + build_args = [ + "nix", + "--log-format", + "internal-json", + "build", + store_path, + "--max-jobs", + "0", + "--no-link", + ] + cache_keys = fetch_cache_public_keys() + if cache_keys: + build_args += ["--option", "extra-trusted-public-keys", " ".join(cache_keys)] + + progress = _DownloadProgress(estimate.total_bytes, estimate.path_count, status_file) + tail: deque[str] = deque(maxlen=40) + + process = subprocess.Popen( + build_args, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + ) + assert process.stdout is not None + for line in process.stdout: + tail.append(line.rstrip()) + # Progress is a nice-to-have: never let an accounting bug stall the + # stream (which would deadlock the build) or abort the upgrade. + try: + progress.feed(line) + except Exception: + logger.debug("progress tracking error", exc_info=True) + return_code = process.wait() + + # Persist only a short tail for diagnostics — not the ~800k-line stream. + try: + log_file.parent.mkdir(parents=True, exist_ok=True) + log_file.write_text("\n".join(tail) + "\n") + except OSError: + logger.debug("could not write upgrade log tail", exc_info=True) + + if return_code != 0: + logger.error("nix build failed rc=%s; tail=%s", return_code, list(tail)) + return return_code + + +def load_selection(selection_file: Path = UPGRADE_SELECTION_FILE) -> dict: + try: + with selection_file.open() as f: + data = json.load(f) + if isinstance(data, dict): + return data + except (FileNotFoundError, OSError, json.JSONDecodeError): + pass + return {} + + +def persist_current_build(store_path: str, selection: dict) -> None: + CURRENT_BUILD_FILE.parent.mkdir(parents=True, exist_ok=True) + data = { + "store_path": store_path, + "version": selection.get("version") or selection.get("label") or store_path, + "label": selection.get("label"), + "channel": selection.get("channel"), + } + CURRENT_BUILD_FILE.write_text(json.dumps(data, sort_keys=True) + "\n") + + +def arm_trial_marker(boot_target: Path) -> None: + """Arm the boot-health watchdog for the next boot. + + Records the currently-running (known-good) system and the generation the + next boot is expected to run, so pifinder-watchdog can roll back if that + generation fails its first boot. The watchdog deletes the marker once the + new generation proves healthy (commit); no marker means a committed + system, which is never auto-rolled-back. + + Best-effort: a marker failure must not block the upgrade — it only means + this upgrade proceeds without the automatic safety net. + """ + try: + previous = Path("/run/current-system").resolve() + new = boot_target.resolve() + TRIAL_MARKER_FILE.parent.mkdir(parents=True, exist_ok=True) + TRIAL_MARKER_FILE.write_text( + json.dumps({"previous": str(previous), "new": str(new)}, sort_keys=True) + + "\n" + ) + except OSError as exc: + logger.warning("could not arm trial marker: %s", exc) + + +def activate_system(store_path: str, default_camera: str) -> None: + write_status("activating") + command(["nix-env", "-p", "/nix/var/nix/profiles/system", "--set", store_path]) + + try: + camera = CAMERA_TYPE_FILE.read_text().strip() + except OSError: + camera = default_camera + + # Whether the chosen camera boots via a specialisation entry is a property + # of the NEW build, so ask the new store path — never compare against + # --default-camera, which is the RUNNING generation's base camera. When the + # two builds disagree about the base (e.g. an imx477-base device upgrading + # onto an imx462-base build), that comparison concludes "camera is the + # base, nothing to do" and reboots into the wrong DTB, killing the camera. + specialisation = Path(store_path) / "specialisation" / camera if camera else None + if specialisation is not None and specialisation.is_dir(): + # The specialisation has its own toplevel — arm the watchdog with + # what will actually be running after reboot. + arm_trial_marker(specialisation) + command([str(specialisation / "bin/switch-to-configuration"), "boot"]) + set_extlinux_default(camera, store_path) + return + + arm_trial_marker(Path(store_path)) + command([str(Path(store_path) / "bin/switch-to-configuration"), "boot"]) + set_extlinux_default(camera or default_camera, store_path) + + +def set_extlinux_default(camera: str, store_path: str | None = None) -> None: + """Point the extlinux DEFAULT at the selected camera's boot entry. + + Device-tree overlays load only at boot, and the generic-extlinux builder + rewrites DEFAULT to the base camera on every activation — so without this an + upgrade would reboot into the base camera's DTB regardless of the device's + chosen camera. Best-effort: the helper leaves a bootable DEFAULT in place if + the entry is missing, so a hiccup here never blocks the upgrade. + + The helper maps camera name -> boot entry using its build's own base-camera + constant, so it must come from the NEW store path when available: the + running generation's copy applies the OLD base mapping to the NEW entries + and picks the wrong one whenever the two builds' base cameras differ. + """ + helper = "set-extlinux-default" + if store_path: + candidate = Path(store_path) / "sw/bin/set-extlinux-default" + if candidate.exists(): + helper = str(candidate) + command([helper, camera], check=False) + + +def cleanup_old_generations() -> None: + # Keep the 3 newest generations: current + 2 rollback targets (surfaced in + # the Software screen's Rollback channel). + command( + ["nix-env", "--delete-generations", "+3", "-p", "/nix/var/nix/profiles/system"], + check=False, + ) + command(["nix-collect-garbage"], check=False) + + +def run_upgrade(ref_file: Path, default_camera: str) -> int: + terminal = False + selected_unavailable = False + try: + write_status("starting") + store_path = ref_file.read_text().strip() + if not valid_store_path(store_path): + raise UpgradeError(f"invalid store path: {store_path!r}") + + estimate = estimate_download(store_path) + build_rc = run_build(store_path, estimate) + if build_rc != 0: + availability = classify_store_path(store_path) + if availability == ABSENT: + selected_unavailable = True + write_status("unavailable") + terminal = True + raise UnavailableError( + f"{store_path} is no longer on configured caches" + ) + if availability == UNREACHABLE: + # Couldn't reach the caches to download — a connection problem, + # not a missing build. Retryable, so don't claim it's gone. + write_status("connfail") + terminal = True + raise UpgradeError(f"caches unreachable for {store_path}") + raise UpgradeError(f"nix build failed rc={build_rc}") + + selection = load_selection() + activate_system(store_path, default_camera) + persist_current_build(store_path, selection) + cleanup_old_generations() + write_status("rebooting") + command(["systemctl", "reboot"]) + terminal = True + return 0 + except UnavailableError: + return 1 + except Exception as exc: + logger.exception("upgrade failed: %s", exc) + if not terminal and not selected_unavailable: + write_status("failed") + return 1 + + +def main(argv: Iterable[str] | None = None) -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--ref-file", type=Path, default=UPGRADE_REF_FILE) + parser.add_argument("--default-camera", default="imx462") + args = parser.parse_args(list(argv) if argv is not None else None) + logging.basicConfig(level=logging.INFO) + return run_upgrade(args.ref_file, args.default_camera) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/python/PiFinder/plot.py b/python/PiFinder/plot.py index 265ae122c..7cf1094cb 100644 --- a/python/PiFinder/plot.py +++ b/python/PiFinder/plot.py @@ -426,9 +426,9 @@ def render_starfield_pil( # Keep edges where at least one endpoint is on-screen. start_on = (sx_pos > 0) & (sx_pos < W) & (sy_pos > 0) & (sy_pos < H) end_on = (ex_pos > 0) & (ex_pos < W) & (ey_pos > 0) & (ey_pos < H) - for i in np.flatnonzero(start_on | end_on): + for edge_i in np.flatnonzero(start_on | end_on): idraw.line( - [sx_pos[i], sy_pos[i], ex_pos[i], ey_pos[i]], + [sx_pos[edge_i], sy_pos[edge_i], ex_pos[edge_i], ey_pos[edge_i]], fill=constellation_brightness, ) diff --git a/python/PiFinder/server.py b/python/PiFinder/server.py index 92122bba9..3e0a38b8a 100644 --- a/python/PiFinder/server.py +++ b/python/PiFinder/server.py @@ -110,7 +110,7 @@ def __init__( shared_state=None, is_debug=False, ): - self.version_txt = f"{utils.pifinder_dir}/version.txt" + self._software_version = utils.get_version() self.keyboard_queue = keyboard_queue or multiprocessing.Queue() self.ui_queue = ui_queue or multiprocessing.Queue() self.gps_queue = gps_queue or multiprocessing.Queue() @@ -211,12 +211,8 @@ def send_css(filename): def home(): # logger.debug("/ called") # Get version info - software_version = "Unknown" - try: - with open(self.version_txt, "r") as ver_f: - software_version = ver_f.read() - except (FileNotFoundError, IOError) as e: - logger.warning(f"Could not read version file: {str(e)}") + + software_version = self._software_version # Try to update GPS state try: @@ -254,7 +250,7 @@ def home(): software_version=software_version, wifi_mode=self.network.wifi_mode(), ip=self.network.local_ip(), - network_name=self.network.get_connected_ssid(), + network_name=self.network.get_active_label(), gps_icon=gps_icon, gps_text=gps_text, lat_text=lat_text, @@ -536,7 +532,18 @@ def network_update(): self.network.set_wifi_mode(wifi_mode) self.network.set_ap_name(ap_name) self.network.set_host_name(host_name) - return app.jinja_env.get_template("restart.html").render(title=_("Restart")) + + applied_host = self.network.get_host_name() + return app.jinja_env.get_template("network.html").render( + title=_("Network"), + net=self.network, + show_new_form=0, + status_message=_( + "Network settings updated — no restart needed. This device is " + "now reachable at http://{host}.local. If you changed the host " + "name, the previous address stops working, so reconnect there." + ).format(host=applied_host), + ) @app.route("/tools/pwchange", methods=["POST"]) @auth_required @@ -741,13 +748,13 @@ def equipment_add_eyepiece(eyepiece_id: int): ) if eyepiece_id >= 0: - cfg.equipment.update_eyepiece(eyepiece_id, eyepiece) + cfg.equipment.eyepieces[eyepiece_id] = eyepiece else: try: index = cfg.equipment.telescopes.index(eyepiece) - cfg.equipment.update_eyepiece(index, eyepiece) + cfg.equipment.eyepieces[index] = eyepiece except ValueError: - cfg.equipment.add_eyepiece(eyepiece) + cfg.equipment.eyepieces.append(eyepiece) cfg.save_equipment() self.ui_queue.put("reload_config") @@ -1028,23 +1035,16 @@ def remove_file(response): @app.route("/logs/configs") @auth_required def list_log_configs(): - """Return all available logconf_*.json files with display names.""" - import glob - + """Return all available logconf_*.json presets with display names.""" + active = utils.active_logconf_name() configs = [] - active = ( - os.path.realpath("pifinder_logconf.json") - if os.path.exists("pifinder_logconf.json") - else None - ) - for path in sorted(glob.glob("logconf_*.json")): - stem = path[len("logconf_") : -len(".json")] - display = stem.replace("_", " ").title() + for name in utils.available_logconfs(): + stem = name[len("logconf_") : -len(".json")] configs.append( { - "file": path, - "name": display, - "active": os.path.realpath(path) == active, + "file": name, + "name": stem.replace("_", " ").title(), + "active": name == active, } ) return jsonify({"configs": configs}) @@ -1052,29 +1052,15 @@ def list_log_configs(): @app.route("/logs/switch_config", methods=["POST"]) @auth_required def switch_log_config(): - """Atomically repoint pifinder_logconf.json to the chosen config, then restart.""" + """Persist the chosen log config to the data dir, then restart.""" logconf_file = request.form.get("logconf_file", "").strip() - if ( - not logconf_file - or not logconf_file.startswith("logconf_") - or not logconf_file.endswith(".json") - ): + try: + utils.set_active_logconf(logconf_file) + logger.info("Switched log config to %s", logconf_file) + except (ValueError, FileNotFoundError): return jsonify( {"status": "error", "message": "Invalid log config file name"} ) - if not os.path.exists(logconf_file): - return jsonify( - { - "status": "error", - "message": f"Log config file not found: {logconf_file}", - } - ) - try: - link = "pifinder_logconf.json" - tmp = link + ".tmp" - os.symlink(logconf_file, tmp) - os.replace(tmp, link) - logger.info("Switched log config to %s", logconf_file) except Exception as e: logger.error("Failed to switch log config: %s", e) return jsonify({"status": "error", "message": str(e)}) diff --git a/python/PiFinder/solver.py b/python/PiFinder/solver.py index f6fc17d88..a5a926afd 100644 --- a/python/PiFinder/solver.py +++ b/python/PiFinder/solver.py @@ -13,7 +13,6 @@ import numpy as np import time import logging -import sys from time import perf_counter as precision_timestamp import os import platform @@ -32,6 +31,7 @@ from PiFinder.sqm.wings import WingEstimator from PiFinder.sqm.clouds import CloudEstimator from PiFinder.sqm.black_level import BlackLevelTracker +from PiFinder.sqm.airglow import AirglowTracker, sample_diagnostics from PiFinder.sqm.radiometer import ( RadiometerAccumulator, extract_photometry_image, @@ -49,7 +49,6 @@ SuccessfulSolve, ) -sys.path.append(str(utils.tetra3_dir)) import tetra3 from tetra3 import cedar_detect_client @@ -61,6 +60,12 @@ # need not track the five-second primary radiometer publication cadence. SQM_STELLAR_DIAGNOSTIC_INTERVAL_SECONDS = 10.0 +# Disabled to isolate the per-frame optical-black pedestal during OB +# rollout/validation. When False, the radiometer pedestal is the same-frame OB +# value when present, otherwise the static profile bias_offset — no tracker in +# between. Re-enable (or remove) once OB is field-proven. +SQM_BLACK_LEVEL_TRACKER_ENABLED = False + def create_sqm_calculator(shared_state): """Create a new SQM calculator instance with current calibration. @@ -159,36 +164,13 @@ def update_radiometric_sqm( calculation_interval_seconds=1.0, now=None, black_level_tracker=None, + airglow_tracker=None, ): """Collect every frame and publish a solve-independent value at cadence.""" from datetime import datetime - fresh_sample = accumulator.add(sample) current_time = time.time() if now is None else float(now) - # Every fresh radiometer sample carries (exposure, background) — feed the - # black-level tracker here rather than only from the 10-second stellar - # diagnostics: this cadence conditions its fit in minutes and keeps working - # through failed solves. Withheld while the last transmission diagnostic - # said cloud (a moving sky breaks the intercept's single-line model; the - # tracker's own stderr gate catches drift the flag misses). - if black_level_tracker is not None and fresh_sample: - cloudy_now = shared_state.sqm_details().get("cloud_flag") is True - black_level_tracker.add_sample( - float(sample["exposure_sec"]), - float(sample["background_per_pixel"]), - stable=not cloudy_now, - ) - - current_sqm = shared_state.sqm() - if current_sqm.last_update is not None: - try: - last_update = datetime.fromisoformat(current_sqm.last_update).timestamp() - if current_time - last_update < calculation_interval_seconds: - return False - except (ValueError, AttributeError): - logger.warning("Failed to parse SQM timestamp, recalculating") - noise = sqm_calculator.noise_floor_estimator def tracked_or_static_bias(): @@ -212,6 +194,55 @@ def pedestal_for_exposure(exposure_sec): # dark from sky (both are linear in exposure). return bias + sqm_calculator.profile.dark_current_rate * exposure_sec + if sample is not None: + sample = dict(sample) + if airglow_tracker is not None and sample is not None: + optical_black = sample.get("optical_black_pedestal") + if optical_black is not None and np.isfinite(optical_black): + colour_pedestal = float(optical_black) + colour_pedestal_source = "optical_black" + else: + colour_pedestal = pedestal_for_exposure(float(sample["exposure_sec"])) + colour_pedestal_source = "tracked_or_calibrated" + diagnostic = sample_diagnostics( + sample, airglow_tracker.camera_type, colour_pedestal + ) + diagnostic["pedestal_source"] = colour_pedestal_source + sample["airglow_diagnostic"] = diagnostic + if diagnostic["valid"]: + sample["paired_pedestal"] = colour_pedestal + sample["spectral_floor"] = diagnostic["correction_adu_per_sec"] + sample["paired_radiometric_zero_point"] = diagnostic["paired_zero_point"] + + fresh_sample = accumulator.add(sample) + + # Every fresh radiometer sample carries (exposure, background) — feed the + # black-level tracker here rather than only from the 10-second stellar + # diagnostics: this cadence conditions its fit in minutes and keeps working + # through failed solves. Withheld while the last transmission diagnostic + # said cloud (a moving sky breaks the intercept's single-line model; the + # tracker's own stderr gate catches drift the flag misses). + if black_level_tracker is not None and fresh_sample: + cloudy_now = shared_state.sqm_details().get("cloud_flag") is True + black_level_tracker.add_sample( + float(sample["exposure_sec"]), + float(sample["background_per_pixel"]), + stable=not cloudy_now, + ) + if airglow_tracker is not None and fresh_sample: + airglow_tracker.add_sample( + sample, float(sample["airglow_diagnostic"]["pedestal"]) + ) + + current_sqm = shared_state.sqm() + if current_sqm.last_update is not None: + try: + last_update = datetime.fromisoformat(current_sqm.last_update).timestamp() + if current_time - last_update < calculation_interval_seconds: + return False + except (ValueError, AttributeError): + logger.warning("Failed to parse SQM timestamp, recalculating") + sqm_value, details = accumulator.estimate( sqm_calculator.profile, current_time, @@ -219,6 +250,11 @@ def pedestal_for_exposure(exposure_sec): ) if sqm_value is None: previous = shared_state.sqm_details() + details["window_radiometer"] = accumulator.dump() + if black_level_tracker is not None: + details["window_black_level"] = black_level_tracker.dump() + if airglow_tracker is not None: + details["window_airglow"] = airglow_tracker.dump() shared_state.set_sqm_details({**previous, **details}) return False @@ -244,6 +280,8 @@ def pedestal_for_exposure(exposure_sec): details["black_level_pedestal"] = tracked details["black_level_stderr"] = tracked_stderr details["window_black_level"] = black_level_tracker.dump() + if airglow_tracker is not None: + details["window_airglow"] = airglow_tracker.dump() details["window_radiometer"] = accumulator.dump() details["measurement_role"] = "primary_radiometer" shared_state.set_sqm_details({**previous, **details}) @@ -658,6 +696,13 @@ def _get_stub(self): ) return self._stub + def _alloc_shmem(self, size): + # Report a freshly created segment (not just a resized one) so the + # request sets reopen_shmem and the server drops its stale cached fd. + fresh = self._shmem is None + resized = super()._alloc_shmem(size) + return resized or fresh + def extract_centroids( self, image, sigma, max_size, use_binned, detect_hot_pixels=True ): @@ -671,14 +716,17 @@ def extract_centroids( # Use shared memory path (same machine) if self._use_shmem: - self._alloc_shmem(size=width * height) + reopen = self._alloc_shmem(size=width * height) shimg = np.ndarray( np_image.shape, dtype=np_image.dtype, buffer=self._shmem.buf ) shimg[:] = np_image[:] im = cedar_detect_pb2.Image( - width=width, height=height, shmem_name=self._shmem.name + width=width, + height=height, + shmem_name=self._shmem.name, + reopen_shmem=reopen, ) req = cedar_detect_pb2.CentroidsRequest( input_image=im, @@ -834,7 +882,9 @@ def solver( ): MultiprocLogging.configurer(log_queue) logger.debug("Starting Solver") - t3 = tetra3.Tetra3(str(utils.tetra3_dir / "data" / "default_database.npz")) + # Load tetra3's bundled pattern database by name; tetra3 resolves it from + # its own package data dir (shipped inside the cedar-solve wheel). + t3 = tetra3.Tetra3("default_database") align_ra = 0 align_dec = 0 last_solve_attempt: float = 0.0 @@ -858,6 +908,7 @@ def solver( # camera type is not yet known here. sqm_cloud_estimator = None sqm_black_level = None + sqm_airglow = None sqm_radiometer = RadiometerAccumulator() last_stellar_diagnostic = 0.0 @@ -902,6 +953,7 @@ def solver( # here so stale seeds/history cannot carry over. sqm_cloud_estimator = None sqm_black_level = None + sqm_airglow = None sqm_radiometer.reset() last_stellar_diagnostic = 0.0 else: @@ -943,7 +995,15 @@ def solver( clear_zero_point=profile.clear_zero_point, clear_sky_brightness=profile.clear_sky_brightness, ) - sqm_black_level = BlackLevelTracker(profile.bias_offset) + sqm_black_level = ( + BlackLevelTracker(profile.bias_offset) + if SQM_BLACK_LEVEL_TRACKER_ENABLED + else None + ) + camera_type = shared_state.camera_type() + sqm_airglow = ( + AirglowTracker(camera_type) if camera_type == "imx462" else None + ) if sqm_calculator is not None: update_radiometric_sqm( shared_state, @@ -952,6 +1012,7 @@ def solver( radiometer_sample, calculation_interval_seconds=SQM_CALCULATION_INTERVAL_SECONDS, black_level_tracker=sqm_black_level, + airglow_tracker=sqm_airglow, ) try: @@ -1019,7 +1080,11 @@ def solver( clear_zero_point=profile.clear_zero_point, clear_sky_brightness=profile.clear_sky_brightness, ) - sqm_black_level = BlackLevelTracker(profile.bias_offset) + sqm_black_level = ( + BlackLevelTracker(profile.bias_offset) + if SQM_BLACK_LEVEL_TRACKER_ENABLED + else None + ) # Expensive stellar photometry is diagnostic-only in the # radiometer-first path and remains limited to 10 seconds. diff --git a/python/PiFinder/splash.py b/python/PiFinder/splash.py index 3fdb31b7d..ff20fe71f 100644 --- a/python/PiFinder/splash.py +++ b/python/PiFinder/splash.py @@ -13,7 +13,7 @@ import os from PIL import Image, ImageDraw from PiFinder import displays -from PiFinder import hardware_detect +from PiFinder import hardware_detect, utils import numpy as np @@ -46,8 +46,7 @@ def show_splash(): screen_draw = ImageDraw.Draw(welcome_image) # Display version and Wifi mode in a top banner spanning the panel width - with open(os.path.join(root_dir, "version.txt"), "r") as ver_f: - version = "v" + ver_f.read() + version = utils.get_version() with open(os.path.join(root_dir, "wifi_status.txt"), "r") as wifi_f: wifi_mode = wifi_f.read() diff --git a/python/PiFinder/sqm/airglow.py b/python/PiFinder/sqm/airglow.py new file mode 100644 index 000000000..3caecd2e3 --- /dev/null +++ b/python/PiFinder/sqm/airglow.py @@ -0,0 +1,198 @@ +"""Per-frame airglow floor from the colour of the sky background. + +At a dark site the radiometer's background carries a diffuse floor a hand-held +SQM-L does not report: measured on the 2026-07 imx462/HQ reference sweeps it is +~45-70 ADU/s while catalog-calibrated unresolved starlight accounts for only +~3-4 ADU/s of it — the rest fits a single zenith rate through the van Rhijn +law, i.e. it is atmospheric airglow. Airglow varies across the sky and night +to night (the OH bands swing 2-3x with season and solar activity), so no +stored constant or all-sky map can carry it; it must be measured in-session. + +The Bayer mosaic supplies that measurement for free. OH airglow lives at +700-1000 nm where every Bayer filter leaks about equally, so an +airglow-dominated background is grey (R = G = B), while visible sky light is +green-peaked: bright LP skies measure R/G = 0.83-0.87, dark airglow-dominated +skies R/G = 1.0. The red excess of the background above the visible-sky colour +line is therefore a direct airglow gauge: + + floor = red_response * max(R_rate - visible_r_over_g * G_rate, 0) + +One measured constant (``visible_r_over_g``, the bright-sky background colour) +and one fitted constant (``red_response``) for the test imx462. A deliberately minimal +form: a knob-count ablation under leave-one-night-out cross-validation showed +richer models (fitted colour, two-endmember unmixing with a blue channel) +generalize WORSE — dark-night RMS 0.21-0.23 mag against 0.14 for this form, +with bright skies at 0.08. The fitted ``red_response`` also matches its +physical prior: grey light adds only (NIR_r_over_g - visible_r_over_g) = 0.2 +of itself to the red excess, and the SQM-L already sees ~15% of airglow, so +1/0.2 * 0.85 = 4.3 vs 4.07 fitted. + +``paired_zero_point`` was calibrated together with ``red_response`` and +replaces the profile ``radiometric_zero_point`` whenever the floor is applied +— using either half of the pairing alone reintroduces a constant offset. + +Other cameras are deliberately absent: ``floor_from_sample`` returns None and +the live process does not create a tracker for them. +""" + +from __future__ import annotations + +from collections import deque +from typing import Optional + +import numpy as np + +# Calibrated on the 2026-07 imx462 reference archive (22 sweeps over 5 nights): +# leave-one-sweep-out bright/dark RMS 0.08/0.14 mag. +_CAMERA = { + "imx462": { + "visible_r_over_g": 0.85, + "red_response": 4.07, + "paired_zero_point": 15.19, + }, +} + + +def paired_zero_point(camera_type: str) -> Optional[float]: + """Radiometric zero point calibrated together with ``red_response``.""" + cam = _CAMERA.get(camera_type) + return cam["paired_zero_point"] if cam else None + + +def calibration(camera_type: str) -> Optional[dict]: + """Stored airglow calibration constants for a camera (a copy), or None. + + Snapshotting these into a telemetry header keeps a session recomputable if + the constants change in code later. + """ + cam = _CAMERA.get(camera_type) + return dict(cam) if cam is not None else None + + +def floor_from_sample( + sample: dict, + camera_type: str, + pedestal: float, +) -> Optional[float]: + """NIR-excess airglow floor (ADU/s) for one radiometer sample. + + Needs the per-channel red background ``collect_radiometer_sample`` records + on Bayer sensors (``background_red``); returns None on mono sensors or + incomplete samples, so callers fall back to their static floor. + """ + cam = _CAMERA.get(camera_type) + if cam is None: + return None + red = sample.get("background_red") + exposure = sample.get("exposure_sec") + if red is None or not exposure or exposure <= 0: + return None + green_rate = (float(sample["background_per_pixel"]) - pedestal) / exposure + red_rate = (float(red) - pedestal) / exposure + excess = red_rate - cam["visible_r_over_g"] * green_rate + return cam["red_response"] * max(excess, 0.0) + + +def sample_diagnostics(sample: dict, camera_type: str, pedestal: float) -> dict: + """Return every intermediate used by the experimental colour correction.""" + result = { + "camera_type": camera_type, + "sequence": sample.get("sequence"), + "captured_at": sample.get("captured_at"), + "exposure_sec": sample.get("exposure_sec"), + "pedestal": float(pedestal), + "valid": False, + } + cam = _CAMERA.get(camera_type) + if cam is None: + result["failure_reason"] = "camera_not_calibrated" + return result + exposure = sample.get("exposure_sec") + red = sample.get("background_red") + green = sample.get("background_per_pixel") + blue = sample.get("background_blue") + if red is None or green is None or not exposure or exposure <= 0: + result["failure_reason"] = "colour_sample_incomplete" + return result + + exposure = float(exposure) + red_rate = (float(red) - pedestal) / exposure + green_rate = (float(green) - pedestal) / exposure + blue_rate = (float(blue) - pedestal) / exposure if blue is not None else None + excess = red_rate - cam["visible_r_over_g"] * green_rate + clipped = max(excess, 0.0) + correction = cam["red_response"] * clipped + result.update( + { + "valid": True, + "background_red": float(red), + "background_green": float(green), + "background_blue": float(blue) if blue is not None else None, + "red_rate": red_rate, + "green_rate": green_rate, + "blue_rate": blue_rate, + "red_over_green": red_rate / green_rate if green_rate > 0 else None, + "blue_over_green": ( + blue_rate / green_rate + if blue_rate is not None and green_rate > 0 + else None + ), + "visible_r_over_g": cam["visible_r_over_g"], + "red_excess_unclipped": excess, + "red_excess_clipped": clipped, + "red_response": cam["red_response"], + "correction_adu_per_sec": correction, + "paired_zero_point": cam["paired_zero_point"], + } + ) + return result + + +class AirglowTracker: + """Rolling median of per-frame airglow floors for a stable estimate. + + Single frames are shot-noise limited at short exposures; the tracker + medians the recent per-frame floors the same way the radiometer + accumulator medians its SQM samples. + """ + + def __init__(self, camera_type: str, max_samples: int = 12): + self.camera_type = camera_type + self.max_samples = max_samples + self._samples: deque[dict] = deque(maxlen=max_samples) + + def add_sample(self, sample: dict, pedestal: float) -> Optional[float]: + stored = sample.get("airglow_diagnostic") + diagnostic = ( + dict(stored) + if stored is not None + else sample_diagnostics(sample, self.camera_type, pedestal) + ) + if not diagnostic["valid"]: + return None + self._samples.append(diagnostic) + return diagnostic["correction_adu_per_sec"] + + def floor(self) -> Optional[float]: + if not self._samples: + return None + return float( + np.median([sample["correction_adu_per_sec"] for sample in self._samples]) + ) + + def dump(self) -> dict: + """Full JSON-serializable state for post-observation replay.""" + floors = [sample["correction_adu_per_sec"] for sample in self._samples] + return { + "camera_type": self.camera_type, + "n_samples": len(self._samples), + "max_samples": self.max_samples, + "floor": self.floor(), + "floor_stddev": float(np.std(floors)) if floors else None, + "floor_min": min(floors) if floors else None, + "floor_max": max(floors) if floors else None, + "samples": list(self._samples), + } + + def reset(self) -> None: + self._samples.clear() diff --git a/python/PiFinder/sqm/radiometer.py b/python/PiFinder/sqm/radiometer.py index 95063e7e0..d77215dca 100644 --- a/python/PiFinder/sqm/radiometer.py +++ b/python/PiFinder/sqm/radiometer.py @@ -33,6 +33,27 @@ def extract_photometry_image(raw, profile) -> Optional[np.ndarray]: return arr.astype(np.float32) +def extract_bayer_rb(raw, profile) -> Optional[tuple[np.ndarray, np.ndarray]]: + """Return the (red, blue) Bayer planes as ``float32``, or None for mono. + + The background's colour is a per-frame airglow gauge (see ``airglow``): + OH airglow lives at 700-1000 nm where every Bayer filter leaks equally, so + an airglow-dominated background is grey (R = G = B) while visible sky light + is green-peaked. The green plane alone cannot see that difference. + """ + if raw is None: + return None + arr = np.asarray(raw) + if arr.ndim != 2 or not str(profile.format).upper().startswith("SRGGB"): + return None + height, width = arr.shape + if height < 2 or width < 2: + return None + red = arr[0 : height - height % 2 : 2, 0 : width - width % 2 : 2] + blue = arr[1:height:2, 1:width:2] + return red.astype(np.float32), blue.astype(np.float32) + + def collect_radiometer_sample( raw, profile, @@ -42,6 +63,7 @@ def collect_radiometer_sample( captured_at: float, border_fraction: float = 0.10, stride: int = 4, + optical_black_pedestal: Optional[float] = None, ) -> Optional[dict]: """Reduce a raw frame to a robust sky-background sample. @@ -75,7 +97,23 @@ def collect_radiometer_sample( ) quadrant_medians = [float(np.median(part)) for part in quadrants if part.size] - return { + background_red = background_blue = None + rb = extract_bayer_rb(raw, profile) + if rb is not None: + red, blue = rb + for name, plane in (("red", red), ("blue", blue)): + b_y = int(plane.shape[0] * border_fraction) + b_x = int(plane.shape[1] * border_fraction) + grid = plane[ + b_y : plane.shape[0] - b_y : stride, b_x : plane.shape[1] - b_x : stride + ] + if grid.size >= 64: + if name == "red": + background_red = float(np.median(grid)) + else: + background_blue = float(np.median(grid)) + + sample = { "sequence": int(sequence), "captured_at": float(captured_at), "exposure_sec": float(exposure_sec), @@ -87,6 +125,13 @@ def collect_radiometer_sample( "pixels_per_side": int(image.shape[0]), "method": "sparse_central_median", } + if background_red is not None: + sample["background_red"] = background_red + if background_blue is not None: + sample["background_blue"] = background_blue + if optical_black_pedestal is not None and np.isfinite(optical_black_pedestal): + sample["optical_black_pedestal"] = float(optical_black_pedestal) + return sample def radiometric_sqm( @@ -94,24 +139,50 @@ def radiometric_sqm( profile, *, pedestal: Optional[float] = None, + floor: float = 0.0, + zero_point: Optional[float] = None, ) -> tuple[Optional[float], dict]: - """Convert one camera sample directly to SQM-L-equivalent brightness.""" + """Convert one camera sample directly to SQM-L-equivalent brightness. + + ``floor`` is the expected diffuse-background rate (ADU/s) for this pointing + — integrated starlight, airglow, zodiacal — that a hand-held reference does + not see the same way (see ``skyglow_map``). It accumulates with exposure + like the sky, so ``floor * exposure`` is removed from the signal before the + magnitude conversion. Zero (the default) leaves the pre-floor behaviour. + """ exposure_sec = float(sample["exposure_sec"]) background = float(sample["background_per_pixel"]) - if pedestal is None: + optical_black = sample.get("optical_black_pedestal") + if optical_black is not None and np.isfinite(optical_black): + # Shielded pixels from the same frame already contain bias plus the + # frame's accumulated dark signal, so a valid OB value is the complete + # pedestal. Calibrated or tracked pedestals only apply without OB. + pedestal = float(optical_black) + pedestal_source = "optical_black" + elif pedestal is not None: + pedestal_source = "calibrated" + else: pedestal = float(profile.bias_offset) - signal = background - pedestal + pedestal_source = "profile" + signal = background - pedestal - floor * exposure_sec + effective_zero_point = ( + float(zero_point) + if zero_point is not None + else float(profile.radiometric_zero_point) + ) details = { **sample, "pedestal": pedestal, + "pedestal_source": pedestal_source, + "skyglow_floor": floor, "background_corrected": signal, - "radiometric_zero_point": profile.radiometric_zero_point, + "radiometric_zero_point": effective_zero_point, "radiometric_fov_degrees": profile.radiometric_fov_degrees, } if signal <= 1.0: details["failure_reason"] = "background_not_resolved_above_pedestal" return None, details - if not profile.radiometric_zero_point or not profile.radiometric_fov_degrees: + if not effective_zero_point or not profile.radiometric_fov_degrees: details["failure_reason"] = "radiometric_factory_calibration_unavailable" return None, details @@ -121,7 +192,7 @@ def radiometric_sqm( ) ** 2 / pixels_per_side**2 flux_density = signal / arcsec_squared_per_pixel value = ( - profile.radiometric_zero_point + effective_zero_point + 2.5 * math.log10(exposure_sec) - 2.5 * math.log10(flux_density) ) @@ -156,19 +227,27 @@ def add(self, sample: Optional[dict]) -> bool: self._samples.append(dict(sample)) return True - def estimate(self, profile, now: float, pedestal_for_exposure=None): + def estimate( + self, profile, now: float, pedestal_for_exposure=None, floor: float = 0.0 + ): values = [] accepted = [] for sample in self._samples: age = now - float(sample["captured_at"]) if age < 0 or age > self.max_age_seconds: continue - pedestal = ( - pedestal_for_exposure(float(sample["exposure_sec"])) - if pedestal_for_exposure is not None - else None + pedestal = sample.get("paired_pedestal") + if pedestal is None and pedestal_for_exposure is not None: + pedestal = pedestal_for_exposure(float(sample["exposure_sec"])) + sample_floor = float(sample.get("spectral_floor", floor)) + sample_zero_point = sample.get("paired_radiometric_zero_point") + value, details = radiometric_sqm( + sample, + profile, + pedestal=pedestal, + floor=sample_floor, + zero_point=sample_zero_point, ) - value, details = radiometric_sqm(sample, profile, pedestal=pedestal) if value is not None: values.append(value) accepted.append(details) diff --git a/python/PiFinder/sqm/skyglow_map.py b/python/PiFinder/sqm/skyglow_map.py new file mode 100644 index 000000000..bec07a150 --- /dev/null +++ b/python/PiFinder/sqm/skyglow_map.py @@ -0,0 +1,190 @@ +"""Expected natural-sky diffuse background ("floor") for the radiometer. + +At a dark site the median sky background the radiometer converts to SQM sits +above the true patch the reference meter reports, by a diffuse floor that a +zenith-pointed hand-held meter does not integrate the same way. Measured on +the imx462/HQ cross-calibration sweeps, that floor is real light through the +optics — not pedestal, dark current, amp glow, or self-light — and it varies +with where the telescope points and how low in the sky it looks. + +This module predicts that floor from three natural components, each of which is +a genuine sky-brightness term (the pieces GAMBONS / Leinert 1998 combine into a +full natural-sky-brightness map): + + integrated starlight depends on galactic latitude b (and longitude l): a + field into the Milky Way plane carries far more + unresolved starlight than one toward the pole. The + b-profile here is fitted to Gaia DR3 faint-star + (13 < G < 19) surface density sampled along l ~ 70: + an exponential in |b| with a ~19.5 deg scale height, + dropping ~20x from plane to pole. + airglow brightens toward the horizon as the van Rhijn + function of airmass (needs the pointing altitude, + hence an observer location + time). + base the isotropic remainder (instrumental diffuse light, + zodiacal residual, extragalactic background). + +The absolute scale is per camera: the sensitive, NIR-enhanced imx462 collects +~11x more of this red-rich diffuse light than the IR-cut HQ, which is why the +HQ reads much closer to the reference without any correction. + +The correction is OPTIONAL and solve-gated: ``expected_floor`` returns ``None`` +when no RA/Dec is available (unsolved frame), and the caller falls back to the +per-camera base floor. When an observer location/time is not supplied the +airglow term is dropped (zenith assumption) rather than guessed. + +CALIBRATION STATUS: the per-camera scale constants are fitted from only three +dark sweeps (imx462) that confound galactic latitude with altitude, plus the +Gaia vertical profile. The *structure* is physical and the b-profile is +data-grounded; the absolute constants are provisional and want a calibration +campaign spanning |b| and altitude independently. Upgrade path: replace +``_integrated_starlight`` with a bundled all-sky GAMBONS/Gaia radiance map +looked up by (l, b). +""" + +from __future__ import annotations + +import math +from datetime import datetime, timezone +from typing import Optional + +# Equatorial (ICRS) -> galactic rotation matrix, J2000. +_EQ2GAL = ( + (-0.0548755604, -0.8734370902, -0.4838350155), + (0.4941094279, -0.4448296300, 0.7469822445), + (-0.8676661490, -0.1980763734, 0.4559837762), +) + +# Integrated-starlight vertical profile, fitted to Gaia DR3 faint-star flux +# (13 < G < 19, 0.3 deg cones) along l ~ 70: isl(|b|) = C + A*exp(-|b|/H). +_ISL_C = 0.000100 +_ISL_A = 0.002662 +_ISL_H_DEG = 19.5 +_ISL_PLANE = _ISL_C + _ISL_A # value at b = 0, used to normalise to 1.0 + +# Per-camera floor model (ADU/s): +# floor = base + k_isl * isl_norm(l, b) + k_air * (van_rhijn(airmass) - 1) +# imx462 fitted to the three 2026-07-20 dark sweeps + the Gaia profile. +# HQ is provisional: its dark sweeps sit near the plane and cannot constrain +# the slope, so it carries a flat base only until a |b|-spread calibration. +_CAMERA_FLOOR = { + "imx462": {"base": 27.2, "k_isl": 33.4, "k_air": 29.4}, + "imx290": {"base": 27.2, "k_isl": 33.4, "k_air": 29.4}, # shares imx462 optics + "hq": {"base": 4.5, "k_isl": 0.0, "k_air": 0.0}, + "imx477": {"base": 4.5, "k_isl": 0.0, "k_air": 0.0}, +} + + +def equatorial_to_galactic(ra_deg: float, dec_deg: float) -> tuple[float, float]: + """(l, b) in degrees for ICRS (ra, dec) in degrees; l in [0, 360).""" + ra, dec = math.radians(ra_deg), math.radians(dec_deg) + v = ( + math.cos(dec) * math.cos(ra), + math.cos(dec) * math.sin(ra), + math.sin(dec), + ) + g = tuple(sum(_EQ2GAL[i][j] * v[j] for j in range(3)) for i in range(3)) + b = math.degrees(math.asin(max(-1.0, min(1.0, g[2])))) + gl = math.degrees(math.atan2(g[1], g[0])) % 360.0 + return gl, b + + +def _julian_date(when: datetime) -> float: + when = when.astimezone(timezone.utc) + y, m = when.year, when.month + d = when.day + (when.hour + (when.minute + when.second / 60.0) / 60.0) / 24.0 + if m <= 2: + y -= 1 + m += 12 + a = y // 100 + b = 2 - a + a // 4 + return ( + math.floor(365.25 * (y + 4716)) + math.floor(30.6001 * (m + 1)) + d + b - 1524.5 + ) + + +def altitude_deg( + ra_deg: float, dec_deg: float, lat_deg: float, lon_deg: float, when: datetime +) -> float: + """Apparent altitude (deg) of (ra, dec) from (lat, lon) at UTC ``when``. + + lon_deg is positive east. Refraction is not applied (irrelevant to the + airmass weighting at the altitudes SQM sweeps use). + """ + jd = _julian_date(when) + t = jd - 2451545.0 + gmst = (280.46061837 + 360.98564736629 * t) % 360.0 + lst = (gmst + lon_deg) % 360.0 + ha = math.radians((lst - ra_deg) % 360.0) + dec, lat = math.radians(dec_deg), math.radians(lat_deg) + sin_alt = math.sin(dec) * math.sin(lat) + math.cos(dec) * math.cos(lat) * math.cos( + ha + ) + return math.degrees(math.asin(max(-1.0, min(1.0, sin_alt)))) + + +def _airmass(alt_deg: float) -> float: + """Plane-parallel airmass, floored at ~5 deg altitude.""" + return 1.0 / math.sin(math.radians(max(alt_deg, 5.0))) + + +def _van_rhijn(airmass: float) -> float: + """Airglow brightness relative to zenith for a ~90 km emitting layer.""" + sin_z = math.sqrt(max(0.0, 1.0 - 1.0 / airmass**2)) + return 1.0 / math.sqrt(max(1e-6, 1.0 - 0.96 * sin_z**2)) + + +def _integrated_starlight(l_deg: float, b_deg: float) -> float: + """Integrated-starlight surface brightness, normalised to 1.0 at b = 0. + + Longitude dependence is not yet calibrated (all sampled fields sit near + l ~ 70), so only the well-constrained |b| profile is applied. + """ + isl = _ISL_C + _ISL_A * math.exp(-abs(b_deg) / _ISL_H_DEG) + return isl / _ISL_PLANE + + +def expected_floor( + ra_deg: Optional[float], + dec_deg: Optional[float], + camera_type: str, + *, + alt_deg: Optional[float] = None, + when: Optional[datetime] = None, + lat_deg: Optional[float] = None, + lon_deg: Optional[float] = None, +) -> Optional[float]: + """Predicted diffuse-background floor (ADU/s) for a solved pointing. + + Returns ``None`` when no RA/Dec is available (unsolved frame) so the caller + falls back to the per-camera base floor. + + The airglow term needs the pointing altitude. Pass ``alt_deg`` directly + (PiFinder knows it from the solve + IMU) or supply observer ``lat_deg`` / + ``lon_deg`` / ``when`` to derive it. With neither, airglow is dropped + (zenith assumption) rather than guessed. + """ + cam = _CAMERA_FLOOR.get(camera_type) + if cam is None: + return None + if ra_deg is None or dec_deg is None: + return None + gl, b = equatorial_to_galactic(ra_deg, dec_deg) + floor = cam["base"] + cam["k_isl"] * _integrated_starlight(gl, b) + if cam["k_air"]: + if ( + alt_deg is None + and lat_deg is not None + and lon_deg is not None + and when is not None + ): + alt_deg = altitude_deg(ra_deg, dec_deg, lat_deg, lon_deg, when) + if alt_deg is not None: + floor += cam["k_air"] * (_van_rhijn(_airmass(alt_deg)) - 1.0) + return floor + + +def base_floor(camera_type: str) -> float: + """Solve-independent fallback floor (ADU/s) when RA/Dec is unavailable.""" + cam = _CAMERA_FLOOR.get(camera_type) + return cam["base"] if cam else 0.0 diff --git a/python/PiFinder/state.py b/python/PiFinder/state.py index 4b7c3cd0f..7b1f941d1 100644 --- a/python/PiFinder/state.py +++ b/python/PiFinder/state.py @@ -314,6 +314,7 @@ def __init__(self) -> None: # We need gps lock and datetime self.__tz_finder = TimezoneFinder() self.__current_ui_state = None + self.__test_mode = False def serialize(self, output_file): with open(output_file, "wb") as f: @@ -340,10 +341,11 @@ def power_state(self): def set_power_state(self, v): """ - Sets the power_state. Allowed states are 0 (sleep) or 1 (awake). If - the input v is any other value, power_state will be unchanged. + Sets the power_state. Allowed states are -1 (screen off), 0 (sleep) + or 1 (awake). If the input v is any other value, power_state will be + unchanged. """ - if v in (0, 1): + if v in (-1, 0, 1): self.__power_state = v else: logger.error( @@ -611,3 +613,9 @@ def __str__(self): f"Screen: {self.__screen}\n" f"Target Pixel: {self.__target_pixel}" ) + + def test_mode(self): + return self.__test_mode + + def set_test_mode(self, v: bool): + self.__test_mode = v diff --git a/python/PiFinder/sys_utils.py b/python/PiFinder/sys_utils.py index a3094dc08..9ed1d9d7b 100644 --- a/python/PiFinder/sys_utils.py +++ b/python/PiFinder/sys_utils.py @@ -1,571 +1,809 @@ -import glob -import json +""" +NixOS system utilities for PiFinder. + +Uses: +- NetworkManager GLib bindings (gi.repository.NM) for WiFi management +- python-pam for password verification +- D-Bus for hostname/reboot/shutdown +- stdlib zipfile for backup/restore +- NixOS specialisations for camera switching +- systemd service for software updates +""" + +import os import re -from typing import Dict, Any +import json +import subprocess +import logging + +from PiFinder import timez +from pathlib import Path +from typing import Optional +import dbus import pam -import requests -import sh -from sh import wpa_cli, unzip, passwd +import gi -import socket -from PiFinder import utils -import logging +gi.require_version("NM", "1.0") +from gi.repository import GLib, NM # noqa: E402 + +from PiFinder.sys_utils_base import ( # noqa: E402 + NetworkBase, + BACKUP_PATH, # noqa: F401 + remove_backup, # noqa: F401 + backup_userdata, # noqa: F401 + restore_userdata, # noqa: F401 + restart_pifinder, # noqa: F401 +) + +AP_CONNECTION_NAME = "PiFinder-AP" -BACKUP_PATH = "/home/pifinder/PiFinder_data/PiFinder_backup.zip" +logger = logging.getLogger("SysUtils.NixOS") -logger = logging.getLogger("SysUtils") + +# --------------------------------------------------------------------------- +# Internal helpers +# --------------------------------------------------------------------------- + + +def _run(cmd: list[str], **kwargs) -> subprocess.CompletedProcess: + """Run a command, logging failures.""" + result = subprocess.run(cmd, capture_output=True, text=True, **kwargs) + if result.returncode != 0: + logger.error( + "Command %s failed (rc=%d): %s", + cmd, + result.returncode, + result.stderr.strip(), + ) + return result -class Network: +def _nm_client() -> NM.Client: + """Create a NetworkManager client (synchronous).""" + return NM.Client.new(None) + + +def _nm_run_async(async_fn, *args): """ - Provides wifi network info + Run an async NM operation synchronously by spinning a local GLib MainLoop. """ + loop = GLib.MainLoop.new(None, False) + state = {"result": None, "error": None} + + def callback(source, async_result, _user_data): + try: + method_name = async_fn.__name__.replace("_async", "_finish") + finish_fn = getattr(source, method_name) + state["result"] = finish_fn(async_result) + except Exception as e: + state["error"] = e + finally: + loop.quit() + + async_fn(*args, callback, None) + loop.run() + + if state["error"]: + raise state["error"] + return state["result"] + + +def _get_system_bus() -> dbus.SystemBus: + return dbus.SystemBus() + + +# --------------------------------------------------------------------------- +# Network class — WiFi management via NM GLib bindings +# --------------------------------------------------------------------------- - def __init__(self): - self.wifi_txt = f"{utils.pifinder_dir}/wifi_status.txt" - with open(self.wifi_txt, "r") as wifi_f: - self._wifi_mode = wifi_f.read() +class Network(NetworkBase): + """ + Provides wifi network info via NetworkManager GLib bindings (libnm). + """ + + def __init__(self): + self._client = _nm_client() + self._wifi_networks: list[dict] = [] + self._wifi_mode = self._detect_wifi_mode() self.populate_wifi_networks() + def _detect_wifi_mode(self) -> str: + """Detect whether we're in AP or Client mode.""" + for ac in self._client.get_active_connections(): + if ac.get_id() == AP_CONNECTION_NAME: + return "AP" + return "Client" + def populate_wifi_networks(self) -> None: - wpa_supplicant_path = "/etc/wpa_supplicant/wpa_supplicant.conf" + """Get saved WiFi connections from NetworkManager.""" self._wifi_networks = [] - try: - with open(wpa_supplicant_path, "r") as wpa_conf: - contents = wpa_conf.readlines() - except IOError as e: - logger.error(f"Error reading wpa_supplicant.conf: {e}") - return - - self._wifi_networks = Network._parse_wpa_supplicant(contents) - - @staticmethod - def _parse_wpa_supplicant(contents: list[str]) -> list: - """ - Parses wpa_supplicant.conf to get current config - """ - wifi_networks = [] - network_dict: Dict[str, Any] = {} network_id = 0 - in_network_block = False - for line in contents: - line = line.strip() - if line.startswith("network={"): - in_network_block = True - network_dict = { + for conn in self._client.get_connections(): + s_wifi = conn.get_setting_wireless() + if s_wifi is None: + continue + if conn.get_id() == AP_CONNECTION_NAME: + continue + ssid_bytes = s_wifi.get_ssid() + ssid = ( + ssid_bytes.get_data().decode("utf-8", "replace") if ssid_bytes else "" + ) + self._wifi_networks.append( + { "id": network_id, - "ssid": None, + "uuid": conn.get_uuid(), + "ssid": ssid, "psk": None, - "key_mgmt": None, + "key_mgmt": "WPA-PSK", } - - elif line == "}" and in_network_block: - in_network_block = False - wifi_networks.append(network_dict) - network_id += 1 - - elif in_network_block: - match = re.match(r"(\w+)=(.+)", line) - if match: - key, value = match.groups() - if key in network_dict: - network_dict[key] = value.strip('"') - - return wifi_networks + ) + network_id += 1 def get_wifi_networks(self): - return self._wifi_networks + """Return the saved networks, re-queried live from NetworkManager. - def delete_wifi_network(self, network_id): + The list is not cached: changes made outside this process (the AP/CLI + switch, another tool, a repair) are reflected on the next read. """ - Immediately deletes a wifi network - """ - self._wifi_networks.pop(network_id) - - with open("/etc/wpa_supplicant/wpa_supplicant.conf", "r") as wpa_conf: - wpa_contents = list(wpa_conf) + self.populate_wifi_networks() + return self._wifi_networks - with open("/etc/wpa_supplicant/wpa_supplicant.conf", "w") as wpa_conf: - in_networks = False - for line in wpa_contents: - if not in_networks: - if line.startswith("network={"): - in_networks = True - else: - wpa_conf.write(line) + def wifi_mode(self) -> str: + """Report the actual current mode from NetworkManager. - for network in self._wifi_networks: - ssid = network["ssid"] - key_mgmt = network["key_mgmt"] - psk = network["psk"] + AP fallback (or any out-of-band change) can flip the radio after init, + so detect live rather than trusting the value cached at construction — + otherwise the UI shows "Client" while the device is really broadcasting + the AP. Refreshing the cached field keeps local_ip()/set_wifi_mode() + consistent too. + """ + self._wifi_mode = self._detect_wifi_mode() + return self._wifi_mode - wpa_conf.write("\nnetwork={\n") - wpa_conf.write(f'\tssid="{ssid}"\n') - if key_mgmt == "WPA-PSK": - wpa_conf.write(f'\tpsk="{psk}"\n') - wpa_conf.write(f"\tkey_mgmt={key_mgmt}\n") + def is_wired_connected(self) -> bool: + """True if an ethernet device has an active connection.""" + try: + for dev in self._client.get_devices(): + if ( + dev.get_device_type() == NM.DeviceType.ETHERNET + and dev.get_active_connection() is not None + ): + return True + except Exception: + return False + return False - wpa_conf.write("}\n") + def delete_wifi_network(self, network_id): + """Delete a saved WiFi connection by its NetworkManager UUID. + Matching on the UUID (not the connection id or SSID) is what makes this + robust: a connection's id need not equal its SSID, and corrupt entries + store unrelated text in the SSID field, so an id/SSID match silently + fails to delete them. + """ + if network_id < 0 or network_id >= len(self._wifi_networks): + logger.error("Invalid network_id: %d", network_id) + return + entry = self._wifi_networks[network_id] + conn = self._client.get_connection_by_uuid(entry["uuid"]) + if conn is None: + logger.error("Connection uuid %s not found", entry["uuid"]) + else: + try: + _nm_run_async(conn.delete_async, None) + except Exception as e: + logger.error("Failed to delete connection '%s': %s", entry["ssid"], e) self.populate_wifi_networks() def add_wifi_network(self, ssid, key_mgmt, psk=None): - """ - Add a wifi network - """ - with open("/etc/wpa_supplicant/wpa_supplicant.conf", "a") as wpa_conf: - wpa_conf.write("\nnetwork={\n") - wpa_conf.write(f'\tssid="{ssid}"\n') - if key_mgmt == "WPA-PSK": - wpa_conf.write(f'\tpsk="{psk}"\n') - wpa_conf.write(f"\tkey_mgmt={key_mgmt}\n") + """Add and connect to a WiFi network.""" + profile = NM.SimpleConnection.new() + + s_con = NM.SettingConnection.new() + s_con.set_property(NM.SETTING_CONNECTION_ID, ssid) + s_con.set_property(NM.SETTING_CONNECTION_TYPE, "802-11-wireless") + s_con.set_property(NM.SETTING_CONNECTION_AUTOCONNECT, True) + profile.add_setting(s_con) + + s_wifi = NM.SettingWireless.new() + s_wifi.set_property( + NM.SETTING_WIRELESS_SSID, + GLib.Bytes.new(ssid.encode("utf-8")), + ) + s_wifi.set_property(NM.SETTING_WIRELESS_MODE, "infrastructure") + profile.add_setting(s_wifi) + + if key_mgmt == "WPA-PSK" and psk: + s_wsec = NM.SettingWirelessSecurity.new() + s_wsec.set_property(NM.SETTING_WIRELESS_SECURITY_KEY_MGMT, "wpa-psk") + s_wsec.set_property(NM.SETTING_WIRELESS_SECURITY_PSK, psk) + profile.add_setting(s_wsec) + + s_ip4 = NM.SettingIP4Config.new() + s_ip4.set_property(NM.SETTING_IP_CONFIG_METHOD, "auto") + profile.add_setting(s_ip4) + + # Persist the connection first. Saving must not depend on being able to + # activate it right now: wlan0 is often unavailable at add time (in AP + # mode, or out of range of the new network), and add_and_activate would + # then fail and save nothing. + try: + conn = _nm_run_async(self._client.add_connection_async, profile, True, None) + except Exception as e: + logger.error("Failed to add WiFi network '%s': %s", ssid, e) + self.populate_wifi_networks() + return - wpa_conf.write("}\n") + # Best effort: bring it up now if the radio is available. + device = self._client.get_device_by_iface("wlan0") + if device is not None: + try: + _nm_run_async( + self._client.activate_connection_async, conn, device, None, None + ) + except Exception as e: + logger.warning("Saved '%s' but could not activate it now: %s", ssid, e) self.populate_wifi_networks() - if self._wifi_mode == "Client": - # Restart the supplicant - wpa_cli("reconfigure") - - def get_ap_name(self): - with open("/etc/hostapd/hostapd.conf", "r") as conf: - for line in conf: - if line.startswith("ssid="): - return line[5:-1] - return "UNKN" - - def set_ap_name(self, ap_name): + + def get_ap_name(self) -> str: + """Get the current AP SSID from the PiFinder-AP profile.""" + for conn in self._client.get_connections(): + if conn.get_id() == AP_CONNECTION_NAME: + s_wifi = conn.get_setting_wireless() + if s_wifi: + ssid_bytes = s_wifi.get_ssid() + if ssid_bytes: + return ssid_bytes.get_data().decode("utf-8") + return "PiFinderAP" + + def set_ap_name(self, ap_name: str) -> None: + """Change the AP SSID. + + Commit the new SSID to the PiFinder-AP profile and, when AP is the live + WiFi mode, re-activate the connection so the running access point + rebroadcasts under the new name without a reboot. (Clients must rejoin + anyway once the SSID changes.) + """ if ap_name == self.get_ap_name(): return - with open("/tmp/hostapd.conf", "w") as new_conf: - with open("/etc/hostapd/hostapd.conf", "r") as conf: - for line in conf: - if line.startswith("ssid="): - line = f"ssid={ap_name}\n" - new_conf.write(line) - sh.sudo("cp", "/tmp/hostapd.conf", "/etc/hostapd/hostapd.conf") - - def get_host_name(self): - return socket.gethostname() + conn = None + for c in self._client.get_connections(): + if c.get_id() == AP_CONNECTION_NAME: + conn = c + break + if conn is None: + logger.error("Connection '%s' not found", AP_CONNECTION_NAME) + return + s_wifi = conn.get_setting_wireless() + if s_wifi is None: + return + s_wifi.set_property( + NM.SETTING_WIRELESS_SSID, + GLib.Bytes.new(ap_name.encode("utf-8")), + ) + try: + _nm_run_async(conn.commit_changes_async, True, None) + except Exception as e: + logger.error("Failed to update AP SSID: %s", e) + return + if self.wifi_mode() == "AP": + self._activate_connection(AP_CONNECTION_NAME) def get_connected_ssid(self) -> str: - """ - Returns the SSID of the connected wifi network or - None if not connected or in AP mode - """ + """Returns the SSID of the connected wifi network.""" if self.wifi_mode() == "AP": return "" - # get output from iwgetid - try: - iwgetid = sh.Command("iwgetid") - _t = iwgetid(_ok_code=(0, 255)).strip() - return _t.split(":")[-1].strip('"') - except sh.CommandNotFound: - return "ssid_not_found" + device = self._client.get_device_by_iface("wlan0") + if device is None: + return "" + ac = device.get_active_connection() + if ac is None: + return "" + conn = ac.get_connection() + if conn is None: + return "" + s_wifi = conn.get_setting_wireless() + if s_wifi is None: + return "" + ssid_bytes = s_wifi.get_ssid() + if ssid_bytes is None: + return "" + return ssid_bytes.get_data().decode("utf-8") + + _HOSTNAME_RE = re.compile(r"^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$") - def set_host_name(self, hostname) -> None: + def set_host_name(self, hostname: str) -> None: + """Set kernel hostname and update avahi mDNS announcement. + + NixOS makes /etc/hostname read-only (nix store symlink), so we set + the kernel hostname directly and persist to a file that a boot + service reads on startup. + """ + hostname = hostname.strip() + if not self._HOSTNAME_RE.match(hostname): + logger.warning("Invalid hostname rejected: %r", hostname) + return if hostname == self.get_host_name(): return - _result = sh.sudo("hostnamectl", "set-hostname", hostname) - self._update_etc_hosts(hostname) + subprocess.run(["sudo", "hostname", hostname], check=False) + result = subprocess.run(["sudo", "avahi-set-host-name", hostname], check=False) + if result.returncode != 0: + logger.warning( + "avahi-set-host-name failed (rc=%d), restarting avahi-daemon", + result.returncode, + ) + subprocess.run( + ["sudo", "systemctl", "restart", "avahi-daemon.service"], + check=False, + ) + data_dir = Path(os.environ.get("PIFINDER_DATA", "/home/pifinder/PiFinder_data")) + (data_dir / "hostname").write_text(hostname) + + def _go_ap(self) -> None: + """Activate the AP connection and remember the choice across reboots.""" + self._persist_wifi_mode("AP") + self._activate_connection(AP_CONNECTION_NAME) + + def _go_client(self) -> None: + """Deactivate the AP connection (fall back to client).""" + self._persist_wifi_mode("Client") + self._deactivate_connection(AP_CONNECTION_NAME) @staticmethod - def _rewrite_hosts(contents: str, new_hostname: str) -> str: - """ - Rewrite the Debian-convention ``127.0.1.1`` line in /etc/hosts to point - at ``new_hostname``. Preserves indentation, the IP, and any trailing - aliases/comments. If no ``127.0.1.1`` line exists, appends one so that - ``sudo`` can still resolve the host. - """ - lines = contents.splitlines(keepends=True) - pattern = re.compile(r"^(\s*127\.0\.1\.1\s+)\S+(.*)$") - replaced = False - for i, line in enumerate(lines): - match = pattern.match(line) - if match: - eol = "\n" if line.endswith("\n") else "" - lines[i] = f"{match.group(1)}{new_hostname}{match.group(2)}{eol}" - replaced = True - break - if not replaced: - if lines and not lines[-1].endswith("\n"): - lines[-1] += "\n" - lines.append(f"127.0.1.1\t{new_hostname}\n") - return "".join(lines) + def _persist_wifi_mode(mode: str) -> None: + """Persist the desired WiFi mode for the boot-time fallback service. - def _update_etc_hosts(self, new_hostname: str) -> None: + The PiFinder-AP NetworkManager profile has a low autoconnect priority, + so a forced AP would otherwise be lost on reboot; the fallback service + reads this file to restore it. + """ + data_dir = Path(os.environ.get("PIFINDER_DATA", "/home/pifinder/PiFinder_data")) try: - with open("/etc/hosts", "r") as hosts_f: - contents = hosts_f.read() - except IOError as e: - logger.error(f"Error reading /etc/hosts: {e}") + (data_dir / "wifi_mode").write_text(mode) + except OSError as e: + logger.warning("Could not persist WiFi mode %r: %s", mode, e) + + def _activate_connection(self, name: str) -> None: + """Activate a saved connection by name.""" + conn = None + for c in self._client.get_connections(): + if c.get_id() == name: + conn = c + break + if conn is None: + logger.error("Connection '%s' not found", name) return - new_contents = Network._rewrite_hosts(contents, new_hostname) - with open("/tmp/hosts", "w") as new_hosts: - new_hosts.write(new_contents) - sh.sudo("cp", "/tmp/hosts", "/etc/hosts") + device = self._client.get_device_by_iface("wlan0") + try: + _nm_run_async( + self._client.activate_connection_async, + conn, + device, + None, + None, + ) + except Exception as e: + logger.error("Failed to activate '%s': %s", name, e) + + def _deactivate_connection(self, name: str) -> None: + """Deactivate an active connection by name.""" + for ac in self._client.get_active_connections(): + if ac.get_id() == name: + try: + _nm_run_async( + self._client.deactivate_connection_async, + ac, + None, + ) + except Exception as e: + logger.error("Failed to deactivate '%s': %s", name, e) + return + logger.warning("No active connection named '%s' to deactivate", name) - def wifi_mode(self): - return self._wifi_mode - def set_wifi_mode(self, mode): - if mode == self._wifi_mode: - return - if mode == "AP": - go_wifi_ap() +# --------------------------------------------------------------------------- +# Module-level WiFi switching (called by callbacks.py and status.py) +# --------------------------------------------------------------------------- - if mode == "Client": - go_wifi_cli() +_network_instance: Optional[Network] = None - def local_ip(self): - if self._wifi_mode == "AP": - return "10.10.10.1" - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - try: - s.connect(("192.255.255.255", 1)) - ip = s.getsockname()[0] - except Exception: - ip = "NONE" - finally: - s.close() - return ip +def _get_network() -> Network: + global _network_instance + if _network_instance is None: + _network_instance = Network() + return _network_instance def go_wifi_ap(): logger.info("SYS: Switching to AP") - sh.sudo("/home/pifinder/PiFinder/switch-ap.sh") + net = _get_network() + net.set_wifi_mode("AP") return True def go_wifi_cli(): logger.info("SYS: Switching to Client") - sh.sudo("/home/pifinder/PiFinder/switch-cli.sh") + net = _get_network() + net.set_wifi_mode("Client") return True -def remove_backup(): - """ - Removes backup file - """ - sh.sudo("rm", BACKUP_PATH, _ok_code=(0, 1)) +def get_wifi_mode() -> str: + """The live WiFi mode ("AP" or "Client") from NetworkManager.""" + return _get_network().wifi_mode() -def backup_userdata(): - """ - Back up userdata to a single zip file for later - restore. Returns the path to the zip file. +# --------------------------------------------------------------------------- +# System control (systemctl subprocess + D-Bus for reboot/shutdown) +# --------------------------------------------------------------------------- - Backs up: - config.json - observations.db - obslist/* - """ - remove_backup() +def restart_system() -> None: + """Restart the system via D-Bus to login1.""" + logger.info("SYS: Initiating System Restart") + try: + bus = _get_system_bus() + login1 = bus.get_object( + "org.freedesktop.login1", + "/org/freedesktop/login1", + ) + manager = dbus.Interface(login1, "org.freedesktop.login1.Manager") + manager.Reboot(False) + except dbus.DBusException as e: + logger.error("D-Bus reboot failed, falling back to subprocess: %s", e) + _run(["sudo", "shutdown", "-r", "now"]) - _zip = sh.Command("zip") - _zip( - BACKUP_PATH, - "/home/pifinder/PiFinder_data/config.json", - "/home/pifinder/PiFinder_data/observations.db", - glob.glob("/home/pifinder/PiFinder_data/obslists/*"), - ) - return BACKUP_PATH +def shutdown() -> None: + """Shut down the system via D-Bus to login1.""" + logger.info("SYS: Initiating Shutdown") + try: + bus = _get_system_bus() + login1 = bus.get_object( + "org.freedesktop.login1", + "/org/freedesktop/login1", + ) + manager = dbus.Interface(login1, "org.freedesktop.login1.Manager") + manager.PowerOff(False) + except dbus.DBusException as e: + logger.error("D-Bus shutdown failed, falling back to subprocess: %s", e) + _run(["sudo", "shutdown", "now"]) -def restore_userdata(zip_path): - """ - Compliment to backup_userdata - restores userdata - OVERWRITES existing data! - """ - unzip("-d", "/", "-o", zip_path) +# --------------------------------------------------------------------------- +# Software updates — async upgrade via systemd service +# --------------------------------------------------------------------------- +UPGRADE_STATE_IDLE = "idle" +UPGRADE_STATE_RUNNING = "running" +UPGRADE_STATE_SUCCESS = "success" +UPGRADE_STATE_FAILED = "failed" -def restart_pifinder() -> None: - """ - Uses systemctl to restart the PiFinder - service - """ - logger.info("SYS: Restarting PiFinder") - sh.sudo("systemctl", "restart", "pifinder") +UPGRADE_REF_FILE = Path("/run/pifinder/upgrade-ref") +UPGRADE_SELECTION_FILE = Path("/run/pifinder/upgrade-selection.json") +UPGRADE_STATUS_FILE = Path("/run/pifinder/upgrade-status") -def restart_system() -> None: - """ - Restarts the system - """ - logger.info("SYS: Initiating System Restart") - sh.sudo("shutdown", "-r", "now") +def _upgrade_service_state() -> str: + result = subprocess.run( + ["systemctl", "is-active", "pifinder-upgrade.service"], + capture_output=True, + text=True, + ) + return result.stdout.strip() -def shutdown() -> None: - """ - shuts down the system - """ - logger.info("SYS: Initiating Shutdown") - sh.sudo("shutdown", "now") - +def start_upgrade(ref: str = "release", selection: Optional[dict] = None) -> bool: + """Start pifinder-upgrade.service with a specific git ref.""" + try: + UPGRADE_REF_FILE.write_text(ref) + if selection: + UPGRADE_SELECTION_FILE.write_text(json.dumps(selection, sort_keys=True)) + else: + UPGRADE_SELECTION_FILE.unlink(missing_ok=True) + except OSError as e: + logger.error("Failed to write upgrade ref file: %s", e) + return False -def update_software(): - """ - Uses systemctl to git pull and then restart - service - """ - logger.info("SYS: Running update") - sh.bash("/home/pifinder/PiFinder/pifinder_update.sh") + # Clean stale status from previous run + UPGRADE_STATUS_FILE.unlink(missing_ok=True) + + # reset-failed errors on a unit that isn't loaded, so only clear an + # actual failed state + if _upgrade_service_state() == "failed": + _run(["sudo", "systemctl", "reset-failed", "pifinder-upgrade.service"]) + result = _run( + [ + "sudo", + "systemctl", + "start", + "--no-block", + "pifinder-upgrade.service", + ] + ) + if result.returncode != 0: + UPGRADE_STATUS_FILE.write_text("failed") + return False return True -def verify_password(username, password): - """ - Checks the provided password against the provided user - password +def list_rollback_targets(profile_dir: Path = Path("/nix/var/nix/profiles")) -> list: + """On-disk system generations available for rollback (all but the current). + + Reads only immutable generation data — the profile symlinks and the + store-path names — so there is NO sidecar state file to evolve or corrupt, + and it works even when the updater is offline. Each entry mirrors a + Software-screen version entry so the same list UI can render it. """ - p = pam.pam() + try: + current = (profile_dir / "system").resolve() + except OSError: + return [] - return p.authenticate(username, password) + targets = [] + for link in profile_dir.glob("system-*-link"): + try: + generation = int(link.name.split("-")[1]) + store_path = link.resolve() + mtime = link.lstat().st_mtime + except (OSError, ValueError, IndexError): + continue + if store_path == current: + continue + marker = "nixos-system-pifinder-" + name = store_path.name + label = name.split(marker, 1)[-1] if marker in name else name + # Local time for display, via the tz-aware timez helper (DTZ) + date = timez.utc_from_timestamp(mtime).astimezone().strftime("%d %b %H:%M") + targets.append( + ( + generation, + { + "ref": str(store_path), + "label": label, + "version": label, + "notes": None, + "subtitle": f"gen {generation} · {date}", + "channel": "rollback", + }, + ) + ) + targets.sort(key=lambda t: t[0], reverse=True) + return [entry for _generation, entry in targets] -def change_password(username, current_password, new_password): - """ - Changes the PiFinder User password +def get_upgrade_state() -> str: + """Poll upgrade status file written by the upgrade service.""" + try: + status = UPGRADE_STATUS_FILE.read_text().strip() + except FileNotFoundError: + # Service hasn't written status yet — check if it's still starting + svc = _upgrade_service_state() + if svc in ("activating", "active"): + return UPGRADE_STATE_RUNNING + if svc == "failed": + return UPGRADE_STATE_FAILED + return UPGRADE_STATE_IDLE + + if status == "success": + return UPGRADE_STATE_SUCCESS + elif status in ("failed", "unavailable", "connfail"): + return UPGRADE_STATE_FAILED + elif status.startswith("downloading") or status in ( + "starting", + "activating", + "rebooting", + ): + return UPGRADE_STATE_RUNNING + return UPGRADE_STATE_IDLE + + +def get_upgrade_progress() -> dict: + """Return structured upgrade progress for UI display. + + Returns dict with keys: + phase: "starting" | "downloading" | "activating" | "rebooting" + | "success" | "failed" | "unavailable" | "connfail" | "" + done: int (downloaded so far, in `unit`) + total: int (total to download, in `unit`) + unit: "bytes" | "paths" + percent: int (0-100) + + The download status line is "downloading /" in bytes; + a trailing " paths" marks the fallback where byte sizes were not + available and the figures are path counts instead. """ - result = passwd( - username, - _in=f"{current_password}\n{new_password}\n{new_password}\n", - _ok_code=(0, 10), + empty = { + "phase": "", + "done": 0, + "total": 0, + "unit": "bytes", + "percent": 0, + "item": "", + } + try: + raw = UPGRADE_STATUS_FILE.read_text().strip() + except FileNotFoundError: + svc = _upgrade_service_state() + if svc in ("activating", "active"): + return {**empty, "phase": "starting"} + if svc == "failed": + return {**empty, "phase": "failed"} + return empty + + svc = _upgrade_service_state() + if raw in ("starting", "activating") or raw.startswith("downloading "): + if svc in ("failed", "inactive"): + return {**empty, "phase": "failed"} + + if raw.startswith("downloading "): + body = raw[len("downloading ") :].strip() + unit = "bytes" + if body.endswith(" paths"): + unit = "paths" + body = body[: -len(" paths")].strip() + # body is "/" optionally followed by " " + nums, _sep, item = body.partition(" ") + parts = nums.split("/") + try: + done, total = int(parts[0]), int(parts[1]) + pct = int(done * 100 / total) if total > 0 else 0 + pct = max(0, min(100, pct)) + return { + "phase": "downloading", + "done": done, + "total": total, + "unit": unit, + "percent": pct, + "item": item.strip(), + } + except (ValueError, IndexError): + return {**empty, "phase": "downloading"} + if raw == "starting": + return {**empty, "phase": "starting"} + if raw == "activating": + return {**empty, "phase": "activating", "percent": 100} + if raw == "rebooting": + return {**empty, "phase": "rebooting", "percent": 100} + if raw == "success": + return {**empty, "phase": "success", "percent": 100} + if raw == "unavailable": + return {**empty, "phase": "unavailable"} + if raw == "connfail": + return {**empty, "phase": "connfail"} + if raw == "failed": + return {**empty, "phase": "failed"} + return empty + + +def get_upgrade_log_tail(lines: int = 3) -> str: + """Last N lines from upgrade journal for UI display.""" + result = _run( + [ + "journalctl", + "-u", + "pifinder-upgrade.service", + "-n", + str(lines), + "--no-pager", + "-o", + "cat", + ] ) + return result.stdout.strip() if result.returncode == 0 else "" - if result.exit_code == 0: - return True - else: - return False +def update_software(ref: str = "release", selection: Optional[dict] = None) -> bool: + """Start the upgrade service (non-blocking). -def switch_cam_imx477() -> None: - logger.info("SYS: Switching cam to imx477") - sh.sudo("python", "-m", "PiFinder.switch_camera", "imx477") + The service downloads, sets the boot profile, and reboots. + UI should poll get_upgrade_progress() for status. + """ + return start_upgrade(ref=ref, selection=selection) -def switch_cam_imx296() -> None: - logger.info("SYS: Switching cam to imx296") - sh.sudo("python", "-m", "PiFinder.switch_camera", "imx296") +# --------------------------------------------------------------------------- +# Password management (python-pam + chpasswd) +# --------------------------------------------------------------------------- -def switch_cam_imx462() -> None: - logger.info("SYS: Switching cam to imx462") - sh.sudo("python", "-m", "PiFinder.switch_camera", "imx462") +def verify_password(username: str, password: str) -> bool: + """Verify a password against PAM.""" + p = pam.pam() + return p.authenticate(username, password, service="pifinder") -def check_and_sync_gpsd_config(baud_rate: int) -> bool: - """ - Checks if GPSD configuration matches the desired baud rate, - and updates it only if necessary. +def change_password(username: str, current_password: str, new_password: str) -> bool: + """Change the user password via chpasswd.""" + if not verify_password(username, current_password): + return False + result = subprocess.run( + ["sudo", "chpasswd"], + input=f"{username}:{new_password}\n", + capture_output=True, + text=True, + ) + return result.returncode == 0 - Args: - baud_rate: The desired baud rate (9600 or 115200) - Returns: - True if configuration was updated, False if already correct - """ - logger.info(f"SYS: Checking GPSD config for baud rate {baud_rate}") +# --------------------------------------------------------------------------- +# Camera switching (specialisations + reboot) +# --------------------------------------------------------------------------- - try: - # Read current config - with open("/etc/default/gpsd", "r") as f: - content = f.read() - - # Determine expected GPSD_OPTIONS - if baud_rate == 115200: - # NOTE: the space before -s in the next line is really needed - expected_options = 'GPSD_OPTIONS=" -s 115200"' - else: - expected_options = 'GPSD_OPTIONS=""' - - # Check if update is needed - current_match = re.search(r"^GPSD_OPTIONS=.*$", content, re.MULTILINE) - if current_match: - current_options = current_match.group(0) - if current_options == expected_options: - logger.info("SYS: GPSD config already correct, no update needed") - return False - - # Update is needed - logger.info(f"SYS: GPSD config mismatch, updating to {expected_options}") - update_gpsd_config(baud_rate) - return True - - except Exception as e: - logger.error(f"SYS: Error checking/syncing GPSD config: {e}") - return False +CAMERA_TYPE_FILE = "/var/lib/pifinder/camera-type" -def update_gpsd_config(baud_rate: int) -> None: +def switch_camera(cam_type: str) -> None: """ - Updates the GPSD configuration file with the specified baud rate - and restarts the GPSD service. - - Args: - baud_rate: The baud rate to configure (9600 or 115200) + Switch camera via NixOS specialisation. + Requires reboot (dtoverlay change). """ - logger.info(f"SYS: Updating GPSD config with baud rate {baud_rate}") - - try: - # Read the current config - with open("/etc/default/gpsd", "r") as f: - lines = f.readlines() - - # Update GPSD_OPTIONS line - updated_lines = [] - for line in lines: - if line.startswith("GPSD_OPTIONS="): - if baud_rate == 115200: - # NOTE: the space before -s in the next line is really needed - updated_lines.append('GPSD_OPTIONS=" -s 115200"\n') - else: - updated_lines.append('GPSD_OPTIONS=""\n') - else: - updated_lines.append(line) - - # Write the updated config to a temporary file - with open("/tmp/gpsd.conf", "w") as f: - f.writelines(updated_lines) - - # Copy the temp file to the actual location with sudo - sh.sudo("cp", "/tmp/gpsd.conf", "/etc/default/gpsd") + logger.info("SYS: Switching camera to %s via specialisation", cam_type) + result = _run(["sudo", "pifinder-switch-camera", cam_type]) + if result.returncode != 0: + logger.error("SYS: Camera switch failed: %s", result.stderr) - # Restart GPSD service - sh.sudo("systemctl", "restart", "gpsd") - logger.info("SYS: GPSD configuration updated and service restarted") +def get_camera_type() -> list[str]: + try: + with open(CAMERA_TYPE_FILE) as f: + return [f.read().strip()] + except FileNotFoundError: + return ["imx462"] - except Exception as e: - logger.error(f"SYS: Error updating GPSD config: {e}") - raise +def switch_cam_imx477() -> None: + logger.info("SYS: Switching cam to imx477") + switch_camera("imx477") -# Raspberry Pi red power LED. It is a plain gpio-led (on/off only, not -# dimmable), so the brightness file is effectively a boolean. -PWR_LED_PATH = "/sys/class/leds/PWR" +def switch_cam_imx296() -> None: + logger.info("SYS: Switching cam to imx296") + switch_camera("imx296") -def set_power_led(on: bool) -> None: - """ - Turn the Raspberry Pi's red PWR LED on or off. - The LED is not dimmable, so this is strictly on/off. We set the kernel - trigger to "none" first, otherwise the firmware's "default-on" trigger - keeps re-asserting the LED, then write the brightness directly. Uses - passwordless sudo, like the other privileged helpers in this module. - """ - value = "1" if on else "0" - sh.sudo( - "sh", - "-c", - f"echo none > {PWR_LED_PATH}/trigger; " - f"echo {value} > {PWR_LED_PATH}/brightness", - ) - logger.info("SYS: Power LED %s", "on" if on else "off") +def switch_cam_imx462() -> None: + logger.info("SYS: Switching cam to imx462") + switch_camera("imx462") # --------------------------------------------------------------------------- -# NixOS migration +# GPSD config (declarative on NixOS — no-ops) # --------------------------------------------------------------------------- -MIGRATION_PROGRESS_FILE = "/tmp/nixos_migration_progress" -MIGRATION_SCRIPT = "/home/pifinder/PiFinder/python/scripts/nixos_migration.sh" - -def _fetch_migration_sha256(version_info: dict) -> str: - """Fetch SHA256 from sidecar URL, falling back to hardcoded value.""" - sha256_url = version_info.get("migration_sha256_url", "") - if sha256_url: - try: - resp = requests.get(sha256_url, timeout=15) - if resp.status_code == 200: - sha256 = resp.text.strip().split()[0] - logger.info(f"SYS: Fetched migration SHA256: {sha256[:16]}...") - return sha256 - logger.warning(f"SYS: SHA256 fetch returned {resp.status_code}") - except requests.exceptions.RequestException as e: - logger.warning(f"SYS: Failed to fetch SHA256: {e}") - - sha256 = version_info.get("migration_sha256", "") - if sha256: - logger.info("SYS: Using hardcoded migration SHA256") - return sha256 - - -def start_nixos_migration(version_info: dict) -> None: +def check_and_sync_gpsd_config(baud_rate: int) -> bool: """ - Start the NixOS migration process in the background. - - Raises ValueError if migration_url or a migration SHA256 cannot be - obtained — an in-place OS replacement must not run without checksum - verification. + On NixOS, GPSD config is managed declaratively via services.nix. + This is a no-op. """ - url = version_info.get("migration_url", "") - if not url: - raise ValueError("Missing migration_url") - sha256 = _fetch_migration_sha256(version_info) - if not sha256: - raise ValueError( - "No migration SHA256 available (neither migration_sha256_url nor " - "migration_sha256 produced a value); refusing to migrate without " - "checksum verification" - ) - display_class = str(version_info.get("display_class", "")) - display_resolution_value = version_info.get("display_resolution", "") - if isinstance(display_resolution_value, (list, tuple)): - display_resolution = "x".join(str(part) for part in display_resolution_value) - else: - display_resolution = str(display_resolution_value) - - logger.info(f"SYS: Starting NixOS migration to {version_info.get('version', '?')}") + logger.info("SYS: GPSD baud rate %d — managed by NixOS configuration", baud_rate) + return False - with open(MIGRATION_PROGRESS_FILE, "w") as f: - json.dump({"percent": 0, "status": "Starting..."}, f) - def _log_output(line): - logger.info(f"SYS: migration: {line.strip()}") +def update_gpsd_config(baud_rate: int) -> None: + """On NixOS, GPSD configuration is declarative. This is a no-op.""" + logger.info( + "SYS: GPSD config is managed declaratively on NixOS (baud=%d)", baud_rate + ) - def _log_error(line): - logger.error(f"SYS: migration: {line.strip()}") - def _on_done(cmd, success, exit_code): - if not success: - logger.error(f"SYS: Migration script failed with exit code {exit_code}") +# Raspberry Pi red power LED — a plain gpio-led (on/off only, not dimmable). +PWR_LED_PATH = Path("/sys/class/leds/PWR") - try: - sh.bash( - MIGRATION_SCRIPT, - url, - sha256, - MIGRATION_PROGRESS_FILE, - display_class, - display_resolution, - _bg=True, - _bg_exc=False, - _out=_log_output, - _err=_log_error, - _done=_on_done, - ) - except Exception as e: - logger.error(f"SYS: Migration failed to start: {e}") - raise +def set_power_led(on: bool) -> None: + """Turn the Raspberry Pi's red PWR LED on or off. -def get_migration_progress() -> Dict[str, Any]: - """ - Read current migration progress from the progress file. + The kernel trigger is set to "none" first, otherwise the firmware's + "default-on" trigger keeps re-asserting the LED. Direct sysfs writes — + pwm-permissions (services.nix) makes these files user-writable at boot, + so no sudo is needed. A missing LED (dev box, other SBC) raises OSError, + which the caller treats as non-fatal. """ - try: - with open(MIGRATION_PROGRESS_FILE, "r") as f: - return json.load(f) - except (OSError, json.JSONDecodeError): - return {} + (PWR_LED_PATH / "trigger").write_text("none") + (PWR_LED_PATH / "brightness").write_text("1" if on else "0") diff --git a/python/PiFinder/sys_utils_base.py b/python/PiFinder/sys_utils_base.py new file mode 100644 index 000000000..8dcb5ccfb --- /dev/null +++ b/python/PiFinder/sys_utils_base.py @@ -0,0 +1,181 @@ +""" +Abstract base for PiFinder system utilities. + +Defines the public API contract and shared implementations used by all +platform backends (Debian, NixOS, fake/testing). +""" + +import logging +import socket +import zipfile +from abc import ABC, abstractmethod +from pathlib import Path + +from PiFinder import utils + +BACKUP_PATH = str(utils.data_dir / "PiFinder_backup.zip") + +logger = logging.getLogger("SysUtils") + + +# --------------------------------------------------------------------------- +# Network ABC — shared + abstract methods +# --------------------------------------------------------------------------- + + +class NetworkBase(ABC): + """Base class for platform-specific Network implementations.""" + + _wifi_mode: str = "Client" + _wifi_networks: list = [] + + def get_host_name(self) -> str: + return socket.gethostname() + + def is_wired_connected(self) -> bool: + """True when a wired (ethernet) link is the active uplink. Overridden + on hardware; the base default assumes no wired link.""" + return False + + def local_ip(self) -> str: + # In AP mode the only address is the AP's own — unless an ethernet + # cable is plugged in, in which case the device is really reachable on + # the wired IP, so fall through to it. + if self._wifi_mode == "AP" and not self.is_wired_connected(): + return "10.10.10.1" + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + try: + s.connect(("192.255.255.255", 1)) + ip = s.getsockname()[0] + except Exception: + ip = "NONE" + finally: + s.close() + return ip + + def get_active_label(self) -> str: + """Label for the active uplink, for the status display: a wired link + wins (shown as 'Ethernet'), then the connected client SSID, then the + AP name; empty if nothing is up.""" + if self.is_wired_connected(): + return "Ethernet" + ssid = self.get_connected_ssid() + if ssid: + return ssid + if self.wifi_mode() == "AP": + return self.get_ap_name() + return "" + + def wifi_mode(self) -> str: + return self._wifi_mode + + def get_wifi_networks(self): + return self._wifi_networks + + def set_wifi_mode(self, mode: str) -> None: + if mode == self._wifi_mode: + return + if mode == "AP": + self._go_ap() + elif mode == "Client": + self._go_client() + self._wifi_mode = mode + + @abstractmethod + def _go_ap(self) -> None: ... + + @abstractmethod + def _go_client(self) -> None: ... + + @abstractmethod + def populate_wifi_networks(self) -> None: ... + + @abstractmethod + def delete_wifi_network(self, network_id) -> None: ... + + @abstractmethod + def add_wifi_network(self, ssid, key_mgmt, psk=None) -> None: ... + + @abstractmethod + def get_ap_name(self) -> str: ... + + @abstractmethod + def set_ap_name(self, ap_name: str) -> None: ... + + @abstractmethod + def get_connected_ssid(self) -> str: ... + + @abstractmethod + def set_host_name(self, hostname: str) -> None: ... + + +# --------------------------------------------------------------------------- +# Backup / restore (stdlib zipfile — portable across all platforms) +# --------------------------------------------------------------------------- + + +def remove_backup() -> None: + """Removes backup file.""" + path = Path(BACKUP_PATH) + if path.exists(): + path.unlink() + + +def backup_userdata() -> str: + """ + Back up userdata to a single zip file. + + Backs up: + config.json + observations.db + obslists/* + """ + remove_backup() + + files = [ + utils.data_dir / "config.json", + utils.data_dir / "observations.db", + ] + for p in utils.data_dir.glob("obslists/*"): + files.append(p) + + with zipfile.ZipFile(BACKUP_PATH, "w", zipfile.ZIP_DEFLATED) as zf: + for filepath in files: + filepath = Path(filepath) + if filepath.exists(): + zf.write(filepath, filepath.relative_to("/")) + + return BACKUP_PATH + + +def restore_userdata(zip_path: str) -> None: + """ + Restore userdata from a zip backup. + OVERWRITES existing data! + """ + with zipfile.ZipFile(zip_path, "r") as zf: + zf.extractall("/") + + +# --------------------------------------------------------------------------- +# Service control (shared across Debian + NixOS) +# --------------------------------------------------------------------------- + + +def restart_pifinder() -> None: + """Restart the PiFinder service via systemctl.""" + import subprocess + + logger.info("SYS: Restarting PiFinder") + # Must be the full unit name: the NixOS sudoers rule allows exactly + # "systemctl restart pifinder.service", and sudo matches arguments + # verbatim — "restart pifinder" is refused and the restart silently + # never happens (the UI shows "Restarting..." but the stale process + # keeps running, e.g. with the old screen_direction IMU geometry). + result = subprocess.run( + ["sudo", "-n", "systemctl", "restart", "pifinder.service"], + capture_output=True, + text=True, + ) + if result.returncode != 0: + logger.error("SYS: PiFinder restart failed: %s", result.stderr.strip()) diff --git a/python/PiFinder/sys_utils_fake.py b/python/PiFinder/sys_utils_fake.py index 77ca71504..9f6952e58 100644 --- a/python/PiFinder/sys_utils_fake.py +++ b/python/PiFinder/sys_utils_fake.py @@ -1,244 +1,91 @@ -import socket import logging -import os -import zipfile -import tempfile - -# For testing, use a directory structure that mimics the production setup -# but in a writable location. The server serves from /home/pifinder/PiFinder_data -# so we need to create a backup file that can be served from there. -# Since we can't write to /home/pifinder as a regular user, we'll use the current -# user's directory structure that mirrors the production layout. -_pifinder_data_dir = os.path.expanduser("~/PiFinder_data") -os.makedirs(_pifinder_data_dir, exist_ok=True) -BACKUP_PATH = os.path.join(_pifinder_data_dir, "PiFinder_backup.zip") + +from PiFinder.sys_utils_base import ( + NetworkBase, + BACKUP_PATH, +) logger = logging.getLogger("SysUtils.Fake") -class Network: +class Network(NetworkBase): """ - Provides wifi network info + Fake network for testing/development. """ def __init__(self): - pass + self._wifi_mode = "Client" + self._wifi_networks: list = [] - def populate_wifi_networks(self): - """ - Parses wpa_supplicant.conf to get current config - """ + def populate_wifi_networks(self) -> None: pass - def get_wifi_networks(self): - return "" - - def delete_wifi_network(self, network_id): - """ - Immediately deletes a wifi network - """ + def delete_wifi_network(self, network_id) -> None: pass - def add_wifi_network(self, ssid, key_mgmt, psk=None): - """ - Add a wifi network - """ + def add_wifi_network(self, ssid, key_mgmt, psk=None) -> None: pass - def get_ap_name(self): + def get_ap_name(self) -> str: return "UNKN" - def set_ap_name(self, ap_name): + def set_ap_name(self, ap_name: str) -> None: pass - def get_host_name(self): - return socket.gethostname() - - def get_connected_ssid(self): - """ - Returns the SSID of the connected wifi network or - None if not connected or in AP mode - """ - return "UNKN" - - def set_host_name(self, hostname): - if hostname == self.get_host_name(): - return - - def wifi_mode(self): + def get_connected_ssid(self) -> str: return "UNKN" - def set_wifi_mode(self, mode): + def set_host_name(self, hostname: str) -> None: pass - def local_ip(self): - return "NONE" + def _go_ap(self) -> None: + logger.info("SYS: Fake switching to AP") + def _go_client(self) -> None: + logger.info("SYS: Fake switching to Client") -def remove_backup(): - """ - Removes backup file - """ - try: - if os.path.exists(BACKUP_PATH): - os.remove(BACKUP_PATH) - except OSError: - pass +def remove_backup() -> None: + pass -def backup_userdata(): - """ - Back up userdata to a single zip file for later - restore. Returns the path to the zip file. - - Backs up: - config.json - observations.db - obslist/* - """ - remove_backup() - - # Use actual files from ~/PiFinder_data directory - source_dir = _pifinder_data_dir - - # Create zip file with actual user data - with zipfile.ZipFile(BACKUP_PATH, "w", zipfile.ZIP_DEFLATED) as zipf: - # Add config.json if it exists - config_path = os.path.join(source_dir, "config.json") - if os.path.exists(config_path): - zipf.write(config_path, "home/pifinder/PiFinder_data/config.json") - - # Add observations.db if it exists - db_path = os.path.join(source_dir, "observations.db") - if os.path.exists(db_path): - zipf.write(db_path, "home/pifinder/PiFinder_data/observations.db") - - # Add all files from obslists directory if it exists - obslists_dir = os.path.join(source_dir, "obslists") - if os.path.exists(obslists_dir): - for filename in os.listdir(obslists_dir): - file_path = os.path.join(obslists_dir, filename) - if os.path.isfile(file_path): - zipf.write( - file_path, f"home/pifinder/PiFinder_data/obslists/{filename}" - ) +def backup_userdata() -> str: return BACKUP_PATH -def restore_userdata(zip_path): - """ - Compliment to backup_userdata - "restores" userdata +def restore_userdata(zip_path) -> None: + pass - For the fake version, this compares the zip contents - with the current ~/PiFinder_data contents and throws - an exception if they don't match. - """ - import zipfile - import filecmp - - if not os.path.exists(zip_path): - raise FileNotFoundError(f"Backup file not found: {zip_path}") - - # Extract zip to temporary directory for comparison - with tempfile.TemporaryDirectory() as temp_dir: - with zipfile.ZipFile(zip_path, "r") as zipf: - # Extract all files - zipf.extractall(temp_dir) - - # Compare extracted files with actual files in ~/PiFinder_data - extracted_base = os.path.join(temp_dir, "home", "pifinder", "PiFinder_data") - actual_base = _pifinder_data_dir - - if not os.path.exists(extracted_base): - raise ValueError( - "Invalid backup file: missing expected directory structure" - ) - - # Check each file that should exist - files_to_check = ["config.json", "observations.db"] - - for filename in files_to_check: - extracted_file = os.path.join(extracted_base, filename) - actual_file = os.path.join(actual_base, filename) - - # If file exists in backup but not in actual directory - if os.path.exists(extracted_file) and not os.path.exists(actual_file): - raise ValueError( - f"Backup contains {filename} but it doesn't exist in {actual_base}" - ) - - # If file exists in both, compare contents - if os.path.exists(extracted_file) and os.path.exists(actual_file): - if not filecmp.cmp(extracted_file, actual_file, shallow=False): - raise ValueError( - f"Backup file {filename} differs from current version in {actual_base}" - ) - - # Check obslists directory - extracted_obslists = os.path.join(extracted_base, "obslists") - actual_obslists = os.path.join(actual_base, "obslists") - - if os.path.exists(extracted_obslists): - if not os.path.exists(actual_obslists): - raise ValueError( - "Backup contains obslists directory but it doesn't exist in current data" - ) - - # Compare each file in obslists - for filename in os.listdir(extracted_obslists): - extracted_obslist = os.path.join(extracted_obslists, filename) - actual_obslist = os.path.join(actual_obslists, filename) - - if os.path.isfile(extracted_obslist): - if not os.path.exists(actual_obslist): - raise ValueError( - f"Backup contains obslist {filename} but it doesn't exist in current obslists" - ) - - if not filecmp.cmp( - extracted_obslist, actual_obslist, shallow=False - ): - raise ValueError( - f"Backup obslist {filename} differs from current version" - ) - - # If we get here, all files match - logger.info("Restore validation successful: backup contents match current data") - return True - - -def shutdown(): - """ - shuts down the Pi - """ + +def shutdown() -> None: logger.info("SYS: Initiating Shutdown") - return True -def update_software(): - """ - Uses systemctl to git pull and then restart - service - """ - logger.info("SYS: Running update") +def update_software(ref: str = "release", selection=None): + logger.info("SYS: Running update (ref=%s)", ref) return True -def restart_pifinder(): - """ - Uses systemctl to restart the PiFinder - service - """ +def list_rollback_targets() -> list: + return [] + + +def get_upgrade_progress() -> dict: + return { + "phase": "", + "done": 0, + "total": 0, + "unit": "bytes", + "percent": 0, + "item": "", + } + + +def restart_pifinder() -> None: logger.info("SYS: Restarting PiFinder") - return True -def restart_system(): - """ - Restarts the system - """ +def restart_system() -> None: logger.info("SYS: Initiating System Restart") @@ -252,29 +99,41 @@ def go_wifi_cli(): return True +def get_wifi_mode() -> str: + return "Client" + + def verify_password(username, password): - """ - Checks the provided password against the provided user - password - """ return True def change_password(username, current_password, new_password): - """ - Changes the PiFinder User password - """ return False +def get_camera_type() -> list[str]: + return ["imx462"] + + def switch_cam_imx477() -> None: logger.info("SYS: Switching cam to imx477") - logger.info('sh.sudo("python", "-m", "PiFinder.switch_camera", "imx477")') def switch_cam_imx296() -> None: logger.info("SYS: Switching cam to imx296") - logger.info('sh.sudo("python", "-m", "PiFinder.switch_camera", "imx296")') + + +def switch_cam_imx462() -> None: + logger.info("SYS: Switching cam to imx462") + + +def check_and_sync_gpsd_config(baud_rate: int) -> bool: + logger.info("SYS: Checking GPSD config for baud rate %d (fake)", baud_rate) + return False + + +def update_gpsd_config(baud_rate: int) -> None: + logger.info("SYS: Updating GPSD config with baud rate %d (fake)", baud_rate) def set_power_led(on: bool) -> None: diff --git a/python/PiFinder/telemetry.py b/python/PiFinder/telemetry.py index f4625c5db..90970869e 100644 --- a/python/PiFinder/telemetry.py +++ b/python/PiFinder/telemetry.py @@ -11,10 +11,12 @@ import copy import json import logging +import os import queue import threading import time from collections import deque +from dataclasses import asdict from datetime import datetime, timedelta from pathlib import Path @@ -23,6 +25,14 @@ from PiFinder import calc_utils from PiFinder import utils from PiFinder import timez +from PiFinder.sqm.camera_profiles import get_camera_profile + +try: + from PiFinder.sqm import airglow +except ImportError: + # The airglow model is an optional part of the SQM stack; on a branch + # without it there are simply no airglow constants to snapshot. + airglow = None # type: ignore[assignment] from PiFinder.types.positioning import ( FailedSolve, ImuSample, @@ -41,12 +51,58 @@ # Stationary IMU downsampling: record every Nth sample when not moving _STATIONARY_DECIMATION = 10 +# Independently toggleable recording sections. "imu"/"sqm"/"solve"/"target" +# each gate one event class in the session file; "images" gates saving the +# solve-frame PNGs alongside solve events. Stored as a list of enabled names +# under the single ``telemetry_sections`` config option (a multi-select +# checklist in the menu); an absent/None value means all enabled. +# +# "images" ships OFF by default: one 512x512 PNG is written per solve, so at a +# typical ~1 solve/s it costs ~300 MB/hour against a few MB/hour for every +# other section combined. Turn it on deliberately, for short diagnostic runs. +SECTION_NAMES = ("imu", "sqm", "solve", "target", "images") +SECTION_CONFIG_OPTION = "telemetry_sections" + +# Session size cap (MB, 0 = unlimited). Frames are written by the camera +# process, so the recorder measures the session directory rather than counting +# its own writes. On reaching the cap the Images section is suspended — that is +# the only unbounded consumer; the event log keeps running at a few MB/hour so +# a capped session stays useful instead of going dark. +MAX_SESSION_MB_OPTION = "telemetry_max_session_mb" + def _rf(v): """Round a float for compact serialization.""" return round(v, _R) +def _rfn(v): + """Round a float, or pass through None (for optional fields).""" + return None if v is None else round(v, _R) + + +def _sqm_calibration_snapshot(camera_type): + """Every SQM/airglow constant for a camera, for the session header. + + Snapshots the full camera profile (zero points, FOV, pedestal, band + offsets, …) plus the airglow calibration so a recorded session stays + recomputable even if these numbers change in code later — the radio-event + ingredients are only reproducible against the constants that produced them. + Returns None for an unknown or unset camera. + """ + if not camera_type: + return None + try: + profile = get_camera_profile(camera_type) + except Exception: + return None + snapshot = {"profile": asdict(profile)} + cal = airglow.calibration(camera_type) if airglow is not None else None + if cal is not None: + snapshot["airglow"] = cal + return snapshot + + def _serialize_quat(q): """Serialize a quaternion to a list [w, x, y, z].""" if q is None: @@ -77,7 +133,15 @@ class TelemetryRecorder: def __init__(self): self.enabled = False - self.images_enabled = False + # Per-section record gates (including "images"); refreshed from config + # on start() and by apply_sections() so menu toggles reach an + # in-progress recording. + self.sections = {name: True for name in SECTION_NAMES} + # Session size cap; 0 disables it. _session_bytes is refreshed by the + # flush loop, so the cap is checked at most every 5 s. + self.max_session_bytes = 0 + self._session_bytes = 0 + self._cap_logged = False self._buffer = deque(maxlen=300) self._file = None self._flush_thread = None @@ -115,6 +179,7 @@ def start(self, cfg, shared_state): self._file = open(session_file, "a") self.enabled = True + self.apply_sections(cfg) self._last_flush = time.time() # Reset per-session state @@ -124,12 +189,31 @@ def start(self, cfg, shared_state): self._last_radio_time = 0.0 self._last_target_id = None self._dropped_events = 0 - - # Write header (no location — written to separate .location file) + try: + cap_mb = float(cfg.get_option(MAX_SESSION_MB_OPTION) or 0) + except (TypeError, ValueError): + cap_mb = 0 + self.max_session_bytes = int(max(cap_mb, 0) * 1024 * 1024) + self._session_bytes = 0 + self._cap_logged = False + + # Write header (no location — written to separate .location file). + # camera_type + sqm_calibration snapshot the SQM/airglow constants + # (zero point, FOV, pedestal, red response, …) so the logged radio + # ingredients can be recomputed under a future calculation. dt = shared_state.datetime() + camera_type = None + try: + candidate = shared_state.camera_type() + if isinstance(candidate, str): + camera_type = candidate + except Exception: + pass self._header_cfg = { "screen_direction": cfg.get_option("screen_direction"), "mount_type": cfg.get_option("mount_type"), + "camera_type": camera_type, + "sqm_calibration": _sqm_calibration_snapshot(camera_type), } header = { "t": time.time(), @@ -152,6 +236,19 @@ def start(self, cfg, shared_state): self._flush_thread.start() logger.info("Telemetry recording started: %s", session_file) + def apply_sections(self, cfg): + """Refresh the per-section record gates from config. + + Reads the ``telemetry_sections`` checklist (a list of enabled names); + an absent value means all enabled. Safe to call on a live recording: a + menu toggle takes effect on the next event of that class without + restarting the session. + """ + enabled = cfg.get_option(SECTION_CONFIG_OPTION) + if enabled is None: + enabled = SECTION_NAMES + self.sections = {name: name in enabled for name in SECTION_NAMES} + def _write_location_sidecar(self, location): """Write the .location sidecar. Returns True if written.""" if not location or self._session_dir is None: @@ -214,7 +311,7 @@ def record_imu(self, imu): When stationary, only records every _STATIONARY_DECIMATION-th sample to reduce file size during long sessions. """ - if not self.enabled or imu is None: + if not self.enabled or not self.sections["imu"] or imu is None: return if imu.timestamp == self._last_imu_timestamp: return # same sample re-polled by a faster loop @@ -238,17 +335,26 @@ def record_imu(self, imu): } self._append(record) - def record_radio(self, sample): + def record_radio(self, sample, sqm=None, floor=None): """Record one radiometer sample event (camera-side sky background). - Fields: t = capture epoch [s], exp = driver-reported exposure [s], - bg = background median [ADU], mad = median absolute deviation [ADU], - grad = quadrant gradient [ADU], seq = camera frame sequence. - Dedupes on sequence and rate-limits to ~1 Hz: the integrator loop - polls far faster than frames arrive at night, and daytime short - exposures produce many frames per second. + Ingredients (raw inputs — a future SQM/airglow algorithm can recompute + the sky brightness from these alone): exp = exposure [s], bg / red / + blue = green/red/blue Bayer background medians [ADU] (red/blue None on + mono sensors), ped = per-frame optical-black pedestal [ADU] (None if + the sensor exposes no shielded pixels), px = photometry image side + [px], mad = background MAD [ADU], grad = quadrant gradient [ADU]. + + Derived (audit only — what the device published at capture time, so the + floor and its warm-up are visible without a rerun; do NOT treat as + ground truth if the calculation later changes): sqm = sky brightness + [mag/arcsec²], floor = applied airglow floor [ADU/s]. + + seq = camera frame sequence. Dedupes on sequence and rate-limits to + ~1 Hz: the integrator loop polls far faster than frames arrive at + night, and daytime short exposures produce many frames per second. """ - if not self.enabled or not sample: + if not self.enabled or not self.sections["sqm"] or not sample: return seq = sample.get("sequence") t = sample.get("captured_at") @@ -267,6 +373,12 @@ def record_radio(self, sample): "bg": _rf(sample.get("background_per_pixel")), "mad": _rf(sample.get("background_mad")), "grad": _rf(sample.get("background_gradient")), + "red": _rfn(sample.get("background_red")), + "blue": _rfn(sample.get("background_blue")), + "ped": _rfn(sample.get("optical_black_pedestal")), + "px": sample.get("pixels_per_side"), + "sqm": _rfn(sqm), + "floor": _rfn(floor), } ) @@ -279,7 +391,7 @@ def record_solve(self, solve_result, predicted=None): Returns the timestamp used for the record, or None if not recorded. """ - if not self.enabled or solve_result is None: + if not self.enabled or not self.sections["solve"] or solve_result is None: return None t = time.time() success = isinstance(solve_result, SuccessfulSolve) @@ -308,7 +420,7 @@ def record_solve(self, solve_result, predicted=None): def record_target(self, target, alt=None, az=None): """Record a target change event. Pass None when target is cleared.""" - if not self.enabled: + if not self.enabled or not self.sections["target"]: return if target is None: target_id = None @@ -345,6 +457,49 @@ def get_session_dir(self): """Return current session directory path, or None.""" return self._session_dir + @property + def session_bytes(self) -> int: + """Bytes on disk for this session as of the last flush.""" + return self._session_bytes + + @property + def images_capped(self) -> bool: + """True once the session has grown past its size cap. + + Frame saving is suspended while this holds; the (small) event log + continues, so the cap bounds growth without ending the session. + """ + return bool(self.max_session_bytes) and ( + self._session_bytes >= self.max_session_bytes + ) + + def _refresh_session_bytes(self): + """Measure the session directory (event log plus any saved frames). + + Frames are written by the camera process, so the recorder cannot count + them as it writes; measuring the directory captures both. Called from + the flush path, i.e. at most every 5 seconds. + """ + if self._session_dir is None or not self.max_session_bytes: + return + total = 0 + try: + with os.scandir(self._session_dir) as entries: + for entry in entries: + if entry.is_file(): + total += entry.stat().st_size + except OSError: + return # a transient stat failure must not break recording + self._session_bytes = total + if self.images_capped and not self._cap_logged: + self._cap_logged = True + logger.warning( + "Telemetry session reached its %d MB cap (%d MB on disk); " + "suspending frame capture, event log continues", + self.max_session_bytes // (1024 * 1024), + total // (1024 * 1024), + ) + def flush(self): """Time-gated flush - only actually flushes every 5 seconds.""" if not self.enabled: @@ -385,6 +540,9 @@ def _flush_loop(self): while not self._stop_event.is_set(): self._stop_event.wait(5.0) self._do_flush() + # Runs unconditionally: frames can grow the session even in a + # stretch where no events were buffered to flush. + self._refresh_session_bytes() class TelemetryPlayer: @@ -566,8 +724,9 @@ def __init__(self, cfg, shared_state, console_queue, camera_command_queue=None): self._console_queue = console_queue self._camera_command_queue = camera_command_queue self._recorder = TelemetryRecorder() - self._recorder.images_enabled = bool(cfg.get_option("telemetry_images")) self._player = None + # One console notice per session when the size cap suspends frames. + self._cap_announced = False # Pre-replay state to restore when replay ends. self._saved_location = None self._datetime_overridden = False @@ -592,9 +751,7 @@ def poll_commands(self, command_queue): def _handle_command(self, cmd_name, cmd_arg): """Dispatch a telemetry command.""" if cmd_name == "telemetry_record_on": - self._recorder.images_enabled = bool( - self._cfg.get_option("telemetry_images") - ) + self._cap_announced = False self._recorder.start(self._cfg, self._shared_state) self._console_queue.put("Telemetry: Recording") @@ -602,6 +759,11 @@ def _handle_command(self, cmd_name, cmd_arg): self._recorder.stop() self._console_queue.put("Telemetry: Stopped") + elif cmd_name == "telemetry_update_sections": + # A section toggle in the menu; apply it to a live recording so the + # change takes effect without stopping and restarting the session. + self._recorder.apply_sections(self._cfg) + elif cmd_name == "replay": logger.info("Entering replay mode: %s", cmd_arg) try: @@ -652,19 +814,46 @@ def next_replay_message(self): return None def record_radio(self, sample): - """Record a radiometer sample event (no-op while replaying).""" + """Record a radiometer sample event (no-op while replaying). + + Pulls the last published SQM value and applied airglow floor from + shared state so each camera-side background frame is stamped with the + sky brightness the device was reporting at the time. + """ if self.replaying: return - self._recorder.record_radio(sample) + sqm_value = None + floor = None + try: + sqm_state = self._shared_state.sqm() + if sqm_state is not None: + sqm_value = getattr(sqm_state, "value", None) + details = self._shared_state.sqm_details() + if details: + floor = details.get("skyglow_floor") + except Exception: + # Shared-state access must never break recording. + pass + self._recorder.record_radio(sample, sqm=sqm_value, floor=floor) def record_solve(self, solve_result, predicted=None): - """Record a solve event and send save_image command if enabled.""" + """Record a solve event and save the frame if both sections are on. + + ``record_solve`` returns a timestamp only when the Solves section is + enabled, so image saving is naturally gated on solves as well as the + Images section. + """ if self.replaying: return t = self._recorder.record_solve(solve_result, predicted) + if t is not None and self._recorder.images_capped: + if not self._cap_announced: + self._cap_announced = True + self._console_queue.put("Telemetry: Size cap, frames off") + return if ( t is not None - and self._recorder.images_enabled + and self._recorder.sections.get("images") and self._camera_command_queue is not None ): session_dir = self._recorder.get_session_dir() diff --git a/python/PiFinder/tetra3 b/python/PiFinder/tetra3 deleted file mode 160000 index 38c3f48f5..000000000 --- a/python/PiFinder/tetra3 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 38c3f48f57d1005e9b65cbb26136f9f13ec0a1b0 diff --git a/python/PiFinder/ui/base.py b/python/PiFinder/ui/base.py index 436ada913..800b30d59 100644 --- a/python/PiFinder/ui/base.py +++ b/python/PiFinder/ui/base.py @@ -8,7 +8,7 @@ import time import uuid from itertools import cycle -from typing import Type, Union +from typing import Union from PIL import Image, ImageDraw from PiFinder import utils @@ -104,6 +104,7 @@ class UIModule: __uuid__ = str(uuid.uuid1()).split("-")[0] _config_options: dict _CAM_ICON = "" + _CAM_ICON_HOLLOW = "" _IMU_ICON = "" _GPS_ICON = "󰤉" _LEFT_ARROW = "" @@ -133,7 +134,7 @@ class UIModule: def __init__( self, - display_class: Type[DisplayBase], + display_class: DisplayBase, camera_image, shared_state, command_queues, @@ -490,6 +491,8 @@ def screen_update(self, title_bar=True, button_hints=True) -> None: if self.shared_state: if self.shared_state.solve_state(): solution = self.shared_state.solution() + if solution is None: + return cam_active = solution.is_camera_solve() # a fresh cam solve sets unmoved to True self._unmoved = True if cam_active else self._unmoved @@ -501,9 +504,14 @@ def screen_update(self, title_bar=True, button_hints=True) -> None: # self.draw.rectangle([115, 2, 125, 14], fill=bg) if self._unmoved: + is_test = self.config_object.get_option("test_mode", False) + icon_x = self.display_class.resX * 0.91 + # In test mode the camera feed is faked, so show the + # hollow (outline) camera icon as a subtle indicator + # rather than a bright inverted box. self.draw.text( - (self.display_class.resX * 0.91, icon_y), - self._CAM_ICON, + (icon_x, icon_y), + self._CAM_ICON_HOLLOW if is_test else self._CAM_ICON, font=self.fonts.icon_bold_large.font, fill=var_fg, ) diff --git a/python/PiFinder/ui/callbacks.py b/python/PiFinder/ui/callbacks.py index 6b48ddda6..58e9c4a97 100644 --- a/python/PiFinder/ui/callbacks.py +++ b/python/PiFinder/ui/callbacks.py @@ -71,13 +71,18 @@ def reset_filters(ui_module: UIModule) -> None: def activate_debug(ui_module: UIModule) -> None: """ - Sets camera into debug - add fake gps info + Toggles test mode (fake camera image + fake GPS). + Main flips shared_state/config; the camera process follows + shared_state.test_mode() on its own. """ - ui_module.command_queues["camera"].put("debug") - ui_module.command_queues["console"].put("Test Mode Activated") ui_module.command_queues["ui_queue"].put("test_mode") - ui_module.message(_("Test Mode")) + + +def test_mode_suffix(ui_module: UIModule) -> str: + """Returns ON/OFF suffix for Test Mode menu entry.""" + if ui_module.config_object.get_option("test_mode", False): + return " ON" + return " OFF" def set_exposure(ui_module: UIModule) -> None: @@ -211,21 +216,7 @@ def switch_cam_imx462(ui_module: UIModule) -> None: def get_camera_type(ui_module: UIModule) -> list[str]: - cam_id = "000" - - # read config.txt into a list - with open("/boot/config.txt", "r") as boot_in: - boot_lines = list(boot_in) - - # Look for the line without a comment... - for line in boot_lines: - if line.startswith("dtoverlay=imx"): - cam_id = line[10:16] - # imx462 uses imx290 driver - if cam_id == "imx290": - cam_id = "imx462" - - return [cam_id] + return sys_utils.get_camera_type() def switch_language(ui_module: UIModule) -> None: @@ -237,9 +228,6 @@ def switch_language(ui_module: UIModule) -> None: ) lang.install() logger.info("Switch Language: %s", iso2_code) - if iso2_code == "zh": - # Chinese requires a new font, so we have to restart - restart_pifinder(ui_module) def go_wifi_ap(ui_module: UIModule) -> None: @@ -255,9 +243,15 @@ def go_wifi_cli(ui_module: UIModule) -> None: def get_wifi_mode(ui_module: UIModule) -> list[str]: - wifi_txt = f"{utils.pifinder_dir}/wifi_status.txt" - with open(wifi_txt, "r") as wfs: - return [wfs.read()] + # Report the live mode from NetworkManager (as the web UI does), not the + # static wifi_status.txt — that file is written once at setup and never + # tracks reality, so it showed "Client" while the device was on the AP. + try: + return [sys_utils.get_wifi_mode()] + except Exception: + wifi_txt = f"{utils.pifinder_dir}/wifi_status.txt" + with open(wifi_txt, "r") as wfs: + return [wfs.read()] def set_location(ui_module: UIModule) -> None: @@ -491,8 +485,9 @@ def generate_custom_object_name(ui_module: UIModule) -> str: def telemetry_record_toggle(ui_module: UIModule) -> None: - """Toggle telemetry recording on/off via integrator command queue.""" - enabled = ui_module.config_object.get_option("telemetry_record") + """Flip telemetry recording on/off in place (inline menu toggle).""" + enabled = not ui_module.config_object.get_option("telemetry_record") + ui_module.config_object.set_option("telemetry_record", enabled) if "integrator" in ui_module.command_queues: if enabled: ui_module.command_queues["integrator"].put(("telemetry_record_on", None)) @@ -504,6 +499,21 @@ def telemetry_record_toggle(ui_module: UIModule) -> None: ui_module.message("No integrator\nqueue", 2) +def telemetry_record_suffix(ui_module: UIModule) -> str: + """Return ' On'/' Off' for the inline Record toggle's current state.""" + return " On" if ui_module.config_object.get_option("telemetry_record") else " Off" + + +def telemetry_section_toggle(ui_module: UIModule) -> None: + """Apply a telemetry section on/off change to any live recording. + + The section flag is already persisted to config by the menu; nudge the + integrator's recorder to re-read it so the change takes effect mid-session. + """ + if "integrator" in ui_module.command_queues: + ui_module.command_queues["integrator"].put(("telemetry_update_sections", None)) + + def update_gpsd_baud_rate(ui_module: UIModule) -> None: """ Updates the GPSD configuration with the current baud rate setting. diff --git a/python/PiFinder/ui/console.py b/python/PiFinder/ui/console.py index db20086a4..3af561e5b 100644 --- a/python/PiFinder/ui/console.py +++ b/python/PiFinder/ui/console.py @@ -11,7 +11,6 @@ from PIL import Image from PiFinder.ui.base import GPS_ANIM_RATE, UIModule -from PiFinder import timez from PiFinder.ui.layout import rows_below_titlebar from PiFinder.image_util import convert_image_to_mode @@ -36,7 +35,7 @@ def __init__(self, *args, **kwargs): self.dirty = True self.welcome = True - # load welcome image to screen + # Load welcome image as startup backdrop root_dir = os.path.realpath( os.path.join(os.path.dirname(__file__), "..", "..", "..") ) @@ -53,21 +52,13 @@ def __init__(self, *args, **kwargs): self.lines = ["---- TOP ---", "Sess UUID:" + self.__uuid__] self.scroll_offset = 0 - self.debug_mode = False def set_shared_state(self, shared_state): self.shared_state = shared_state def key_number(self, number): if number == 0: - self.command_queues["camera"].put("debug") - if self.debug_mode: - self.debug_mode = False - else: - self.debug_mode = True - self.command_queues["console"].put("Debug: " + str(self.debug_mode)) - dt = timez.utc(2022, 11, 15, 2, 0, 0) - self.shared_state.set_datetime(dt) + self.command_queues["ui_queue"].put("test_mode") def key_enter(self): # reset scroll offset @@ -94,6 +85,13 @@ def write(self, line): self.scroll_offset = 0 self.dirty = True + def finish_startup(self): + """End the startup splash phase and clear the welcome backdrop.""" + self.welcome = False + self.clear_screen() + self.dirty = True + self.update() + def active(self): self.welcome = False self.dirty = True @@ -188,12 +186,28 @@ def screen_update(self, title_bar=True, button_hints=True): # self.draw.rectangle([115, 2, 125, 14], fill=bg) if self._unmoved: - self.draw.text( - (self.display_class.resX * 0.91, -2), - self._CAM_ICON, - font=self.fonts.icon_bold_large.font, - fill=var_fg, - ) + is_test = self.config_object.get_option("test_mode", False) + icon_x = self.display_class.resX * 0.91 + icon_y = -2 + if is_test: + # Invert camera icon: white bg, dark icon + self.draw.rectangle( + [icon_x - 1, 0, icon_x + 13, 13], + fill=self.colors.get(128), + ) + self.draw.text( + (icon_x, icon_y), + self._CAM_ICON, + font=self.fonts.icon_bold_large.font, + fill=self.colors.get(0), + ) + else: + self.draw.text( + (icon_x, icon_y), + self._CAM_ICON, + font=self.fonts.icon_bold_large.font, + fill=var_fg, + ) if len(self.title) < 9: # draw the constellation diff --git a/python/PiFinder/ui/menu_manager.py b/python/PiFinder/ui/menu_manager.py index f6b6c993d..9ecd79aee 100644 --- a/python/PiFinder/ui/menu_manager.py +++ b/python/PiFinder/ui/menu_manager.py @@ -126,7 +126,7 @@ def __init__( self._stack_anim_counter: float = 0 self._stack_anim_direction: int = 0 - self.stack: list[type[UIModule]] = [] + self.stack: list[UIModule] = [] self.add_to_stack(menu_structure.pifinder_menu) self.marking_menu_stack: list[MarkingMenu] = [] @@ -150,7 +150,7 @@ def __init__( def screengrab(self): self.ss_count += 1 - filename = f"{self.stack[-1].__uuid__}_{self.ss_count :0>3}_{self.stack[-1].title.replace('/','-')}" + filename = f"{self.stack[-1].__uuid__}_{self.ss_count:0>3}_{self.stack[-1].title.replace('/', '-')}" ss_imagepath = self.ss_path + f"/{filename}.png" ss = self.shared_state.screen().copy() ss.save(ss_imagepath) @@ -159,9 +159,9 @@ def screengrab(self): def remove_from_stack(self) -> None: if len(self.stack) > 1: self._stack_top_image = self.stack[-1].screen.copy() - self.stack[-1].inactive() # type: ignore[call-arg] + self.stack[-1].inactive() self.stack.pop() - self.stack[-1].active() # type: ignore[call-arg] + self.stack[-1].active() self._stack_anim_counter = time.time() + self.config_object.get_option( "menu_anim_speed", 0 ) @@ -195,7 +195,7 @@ def add_to_stack(self, item: dict) -> None: item dict """ if item.get("state") is not None: - self.stack[-1].inactive() # type: ignore[call-arg] + self.stack[-1].inactive() self.stack.append(item["state"]) else: self.stack.append( @@ -215,7 +215,7 @@ def add_to_stack(self, item: dict) -> None: if item.get("stateful", False): item["state"] = self.stack[-1] - self.stack[-1].active() # type: ignore[call-arg] + self.stack[-1].active() if len(self.stack) > 1: self._stack_anim_counter = time.time() + self.config_object.get_option( "menu_anim_speed", 0 @@ -223,7 +223,7 @@ def add_to_stack(self, item: dict) -> None: self._stack_anim_direction = -1 def message(self, message: str, timeout: float) -> None: - self.stack[-1].message(message, timeout) # type: ignore[arg-type] + self.stack[-1].message(message, timeout) def jump_to_label(self, label: str) -> None: # to prevent many recent/object UI modules @@ -235,7 +235,7 @@ def jump_to_label(self, label: str) -> None: for stack_index, ui_module in enumerate(self.stack): if ui_module.item_definition.get("label", "") == label: self.stack = self.stack[: stack_index + 1] - self.stack[-1].active() # type: ignore[call-arg] + self.stack[-1].active() return # either this is not a special case, or we didn't find # the label already in the stack @@ -290,7 +290,7 @@ def update(self) -> None: return # Business as usual, update the module at the top of the stack - self.stack[-1].update() # type: ignore[call-arg] + self.stack[-1].update() # are we animating? if self._stack_anim_counter > time.time(): diff --git a/python/PiFinder/ui/menu_structure.py b/python/PiFinder/ui/menu_structure.py index ca8f1866e..3d206dbd4 100644 --- a/python/PiFinder/ui/menu_structure.py +++ b/python/PiFinder/ui/menu_structure.py @@ -191,6 +191,12 @@ def _(key: str) -> Any: "objects": "catalog", "value": "NGC", }, + { + "name": _("PK Planetary"), + "class": UIObjectList, + "objects": "catalog", + "value": "PK", + }, { "name": _("Sharpless"), "class": UIObjectList, @@ -369,6 +375,10 @@ def _(key: str) -> Any: "name": _("NGC"), "value": "NGC", }, + { + "name": _("PK Planetary"), + "value": "PK", + }, { "name": _("Sharpless"), "value": "Sh2", @@ -1199,7 +1209,11 @@ def _(key: str) -> Any: }, {"name": _("Console"), "class": UIConsole}, {"name": _("Software Upd"), "class": UISoftware}, - {"name": _("Test Mode"), "callback": callbacks.activate_debug}, + { + "name": _("Test Mode"), + "callback": callbacks.activate_debug, + "name_suffix_callback": callbacks.test_mode_suffix, + }, { "name": _("Experimental"), "class": UITextMenu, @@ -1215,6 +1229,29 @@ def _(key: str) -> Any: "class": UITextMenu, "select": "single", "items": [ + { + "name": _("Dev Mode"), + "class": UITextMenu, + "select": "single", + "config_option": "dev_mode", + "items": [ + {"name": _("Off"), "value": False}, + {"name": _("On"), "value": True}, + ], + }, + { + "name": _("Screen Off"), + "class": UITextMenu, + "select": "single", + "config_option": "screen_off_timeout", + "items": [ + {"name": _("Off"), "value": "Off"}, + {"name": "30s", "value": "30s"}, + {"name": "1m", "value": "1m"}, + {"name": "10m", "value": "10m"}, + {"name": "30m", "value": "30m"}, + ], + }, { "name": _("Telemetry"), "class": UITextMenu, @@ -1222,35 +1259,40 @@ def _(key: str) -> Any: "items": [ { "name": _("Record"), + "callback": callbacks.telemetry_record_toggle, + "name_suffix_callback": callbacks.telemetry_record_suffix, + }, + { + "name": _("Sections"), "class": UITextMenu, - "select": "single", - "config_option": "telemetry_record", - "post_callback": callbacks.telemetry_record_toggle, + "select": "multi", + "config_option": "telemetry_sections", + "post_callback": callbacks.telemetry_section_toggle, "items": [ + {"name": _("IMU"), "value": "imu"}, + {"name": _("SQM"), "value": "sqm"}, + {"name": _("Solves"), "value": "solve"}, { - "name": _("Off"), - "value": False, + "name": _("Targets"), + "value": "target", }, { - "name": _("On"), - "value": True, + "name": _("Images"), + "value": "images", }, ], }, { - "name": _("Images"), + "name": _("Max Size"), "class": UITextMenu, "select": "single", - "config_option": "telemetry_images", + "config_option": "telemetry_max_session_mb", "items": [ - { - "name": _("Off"), - "value": False, - }, - { - "name": _("On"), - "value": True, - }, + {"name": _("250 MB"), "value": 250}, + {"name": _("500 MB"), "value": 500}, + {"name": _("1 GB"), "value": 1024}, + {"name": _("2 GB"), "value": 2048}, + {"name": _("Unlimited"), "value": 0}, ], }, { diff --git a/python/PiFinder/ui/preview.py b/python/PiFinder/ui/preview.py index a3d6fe566..9b0581b2a 100644 --- a/python/PiFinder/ui/preview.py +++ b/python/PiFinder/ui/preview.py @@ -3,7 +3,6 @@ """Raw, magnified multi-star Focus screen.""" import math -import sys import time from collections import deque from typing import Optional @@ -11,12 +10,10 @@ import numpy as np from PIL import Image, ImageChops, ImageDraw, ImageOps -from PiFinder import focus, utils +from PiFinder import focus from PiFinder.ui.base import UIModule from PiFinder.ui.marking_menus import MarkingMenu, MarkingMenuOption -sys.path.append(str(utils.tetra3_dir)) - # Ten times the apparent size of the old full-frame preview. On a square panel # this maps a 26x26 patch from the 512x512 camera frame into each half-screen # tile. The crop expands for a broad blob so a defocused star remains visible. @@ -71,8 +68,6 @@ def focus_crop_size( class UIPreview(UIModule): - from PiFinder import tetra3 - __title__ = "CAMERA" __help_name__ = "camera" _display_mode_list = [DISPLAY_STARS, DISPLAY_SINGLE, DISPLAY_IMAGE, DISPLAY_STATS] diff --git a/python/PiFinder/ui/software.py b/python/PiFinder/ui/software.py index 09acb39fd..5489e3b3f 100644 --- a/python/PiFinder/ui/software.py +++ b/python/PiFinder/ui/software.py @@ -1,144 +1,305 @@ #!/usr/bin/python # -*- coding:utf-8 -*- """ -This module contains the UI Module classes for -software updates and NixOS migration. +UI modules for software updates, channel selection, and release notes. + +Channels: + - stable: release entries from update-manifest.json + - beta: prerelease entries from update-manifest.json + - unstable: trunk + testable PR entries from update-manifest.json """ +import json import logging -import time -from typing import Any, Optional, TYPE_CHECKING +import re +import threading +from datetime import datetime, timezone +from typing import Dict, List, Optional, Tuple, TYPE_CHECKING import requests -from PiFinder import utils -from PiFinder.ui.base import UIModule -from PiFinder.ui.ui_utils import TextLayouter - if TYPE_CHECKING: + # At runtime PiFinder.i18n gettext-installs _ into builtins; mypy only + # sees it inside annotated functions, so give it a signature here. + def _(message: str) -> str: ... - def _(a) -> Any: - return a +from PiFinder import utils +from PiFinder.ui.base import UIModule +from PiFinder.ui.ui_utils import TextLayouter, TextLayouterScroll sys_utils = utils.get_sys_utils() logger = logging.getLogger("UISoftware") -REQUEST_TIMEOUT = 10 -MIGRATION_GATE_URL = ( - "https://raw.githubusercontent.com/brickbots/PiFinder/release/migration_gate.json" -) +# --- Update channel source ----------------------------------------------------- +# CI publishes generated update metadata to a metadata-only branch. Devices read +# one raw JSON file instead of calling the GitHub REST API, so they do not burn +# unauthenticated rate limits. +MANIFEST_REPO = "brickbots/PiFinder" +MANIFEST_BRANCH = "nixos-manifest" +# ------------------------------------------------------------------------------ UPDATE_MANIFEST_URL = ( - "https://raw.githubusercontent.com/brickbots/PiFinder/" - "nixos-manifest/update-manifest.json" + f"https://raw.githubusercontent.com/{MANIFEST_REPO}/" + f"{MANIFEST_BRANCH}/update-manifest.json" ) +REQUEST_TIMEOUT = 10 +_STORE_PATH_RE = re.compile(r"^/nix/store/[a-z0-9]+-[A-Za-z0-9._+=?,-]+$") -# Secret unlock: 7x square button -_UNLOCK_SEQUENCE = ["square"] * 7 +# Last successfully fetched manifest, kept on disk so the screen can render a +# version list immediately on entry while a fresh copy is fetched in the +# background. +MANIFEST_CACHE_PATH = utils.data_dir / "update_manifest.json" -# Migration targets are read from the update manifest, consulted in descending -# stability; the first available entry carrying a migration tarball wins. -_MIGRATION_CHANNELS = ("stable", "beta", "unstable") +# A trunk entry is only offered when the branch it tracks is actually a NixOS +# branch — detected by this file existing in the branch's tree. Keeps a +# non-NixOS upstream main from showing up as an installable build. +NIXOS_MARKER_FILE = "flake.nix" -def _fetch_migration_config() -> Optional[dict]: - """Fetch and parse the remote migration gate JSON. +def _entry_from_manifest(item: dict, channel: str) -> Optional[dict]: + label = item.get("label") + if not isinstance(label, str) or not label: + return None - Returns the parsed dict on success; None on network error, non-200 - response, or malformed JSON. Only the `nixos_for_everyone` flag is used by - the caller — the tarball itself comes from the update manifest. + title = item.get("title") or item.get("subtitle") or label + entry = { + "label": label, + "ref": item.get("store_path"), + "notes": item.get("notes") or None, + "version": item.get("version") or label, + "subtitle": title, + "title": title, + "channel": channel, + "kind": item.get("kind"), + "number": item.get("number"), + "built_at": item.get("built_at"), + "source_ref": item.get("source_ref"), + "source_sha": item.get("source_sha"), + } + if item.get("kind") == "trunk": + entry["is_trunk"] = True + + store_path = item.get("store_path") + available = item.get("available", bool(store_path)) + if not available or not isinstance(store_path, str): + entry["ref"] = None + entry["unavailable"] = True + reason = item.get("reason") + if reason: + entry["subtitle"] = f"{title} ({reason})" + elif not _STORE_PATH_RE.fullmatch(store_path): + entry["ref"] = None + entry["unavailable"] = True + entry["subtitle"] = f"{title} (invalid build)" + + return entry + + +def _fetch_raw_manifest() -> dict: """ - try: - res = requests.get(MIGRATION_GATE_URL, timeout=REQUEST_TIMEOUT) - except requests.exceptions.RequestException: - return None - if res.status_code != 200: - return None - try: - data = res.json() - except ValueError: - return None - if not isinstance(data, dict): - return None - return data + Fetch CI-generated update metadata as the raw manifest document. + Raises RequestException for network failures so the caller can show offline. + """ + res = requests.get(UPDATE_MANIFEST_URL, timeout=REQUEST_TIMEOUT) + res.raise_for_status() + manifest = res.json() + if manifest.get("schema") != 1: + raise ValueError("unsupported update manifest schema") + if not isinstance(manifest.get("channels", {}), dict): + raise ValueError("invalid update manifest channels") + return manifest + +def _parse_manifest(manifest: dict) -> dict[str, list[dict]]: + """Convert a raw manifest document into per-channel UI entries. -def _fetch_update_manifest() -> Optional[dict]: - """Fetch and parse the update manifest, or None on any failure.""" + Trunk entries whose branch is known to lack the NixOS marker file are + dropped (annotation left by _annotate_trunk_entries; unknown means keep). + """ + channels: dict[str, list[dict]] = {} + manifest_channels = manifest.get("channels", {}) + if not isinstance(manifest_channels, dict): + manifest_channels = {} + + for channel in ("stable", "beta", "unstable"): + entries: list[dict] = [] + raw_entries = manifest_channels.get(channel, []) + if not isinstance(raw_entries, list): + continue + for item in raw_entries: + if not isinstance(item, dict): + continue + if item.get("kind") == "trunk" and item.get("nixos_branch") is False: + continue + entry = _entry_from_manifest(item, channel) + if entry is not None: + entries.append(entry) + channels[channel] = entries + + return channels + + +def _fetch_update_manifest() -> dict[str, list[dict]]: + """Fetch and parse update metadata in one step (no cache involvement).""" + return _parse_manifest(_fetch_raw_manifest()) + + +def _load_cached_manifest() -> Optional[dict]: + """Return the last cached raw manifest, or None when absent/invalid.""" try: - res = requests.get(UPDATE_MANIFEST_URL, timeout=REQUEST_TIMEOUT) - except requests.exceptions.RequestException: + with open(MANIFEST_CACHE_PATH) as f: + manifest = json.load(f) + except (OSError, ValueError): return None - if res.status_code != 200: + if not isinstance(manifest, dict) or manifest.get("schema") != 1: return None + return manifest + + +def _save_cached_manifest(manifest: dict) -> None: + """Best-effort atomic write of the manifest cache.""" try: - data = res.json() - except ValueError: - return None - if not isinstance(data, dict): - return None - return data + MANIFEST_CACHE_PATH.parent.mkdir(parents=True, exist_ok=True) + tmp_path = MANIFEST_CACHE_PATH.with_suffix(".json.tmp") + with open(tmp_path, "w") as f: + json.dump(manifest, f) + tmp_path.replace(MANIFEST_CACHE_PATH) + except OSError as e: + logger.warning("Could not cache update manifest: %s", e) -def _fetch_download_size_mb(url: str) -> Optional[int]: - """Return the tarball download size in MB from a HEAD request, or None. +def _branch_has_nixos_marker(source_repo: str, source_ref: str) -> Optional[bool]: + """Whether the branch's tree contains the NixOS marker file. - GitHub release assets 302-redirect to a signed URL whose response carries - the real Content-Length, so redirects must be followed. Returns None on - network error, non-200 status, or a missing/unparseable Content-Length. + Returns None when the check is inconclusive (network trouble, unexpected + status) so callers can keep the entry rather than hide a real build. """ + url = ( + f"https://raw.githubusercontent.com/{source_repo}/" + f"{source_ref}/{NIXOS_MARKER_FILE}" + ) try: - res = requests.head(url, allow_redirects=True, timeout=REQUEST_TIMEOUT) + res = requests.head(url, timeout=REQUEST_TIMEOUT) except requests.exceptions.RequestException: return None - if res.status_code != 200: - return None - length = res.headers.get("Content-Length") - if length is None: + if res.status_code == 200: + return True + if res.status_code == 404: + return False + return None + + +def _annotate_trunk_entries(manifest: dict) -> None: + """Stamp nixos_branch on trunk entries in a raw manifest (in place). + + An inconclusive check leaves the entry unannotated, and unannotated trunk + entries stay visible — a flaky network must not hide a real build. The + annotation is persisted with the cache, so the cached list applies the + same verdict without re-checking. + """ + channels = manifest.get("channels", {}) + if not isinstance(channels, dict): + return + unstable = channels.get("unstable", []) + if not isinstance(unstable, list): + return + for item in unstable: + if not isinstance(item, dict) or item.get("kind") != "trunk": + continue + repo = item.get("source_repo") + ref = item.get("source_ref") + if not repo or not ref: + continue + marker = _branch_has_nixos_marker(repo, ref) + if marker is not None: + item["nixos_branch"] = marker + + +def _format_age(built_at: Optional[str]) -> Optional[str]: + """Human-readable age of a build timestamp ("5m ago", "3h ago", "2d ago").""" + if not built_at: return None try: - return round(int(length) / (1024 * 1024)) - except (TypeError, ValueError): + built = datetime.fromisoformat(built_at) + except ValueError: return None + if built.tzinfo is None: + built = built.replace(tzinfo=timezone.utc) + minutes = max(0, int((datetime.now(timezone.utc) - built).total_seconds() // 60)) + if minutes < 60: + return _("{minutes}m ago").format(minutes=minutes) + hours = minutes // 60 + if hours < 24: + return _("{hours}h ago").format(hours=hours) + return _("{days}d ago").format(days=hours // 24) + + +def _entry_row_parts(entry: dict) -> Tuple[str, str]: + """Split a version row into a fixed prefix and the scrollable text. + + PR rows lead with the bare PR number, trunk rows with a dot; the store + hash never appears in the list — titles/branch names are what a human + scans for. + """ + if entry.get("kind") == "pr" and entry.get("number"): + return f"{entry['number']} ", entry.get("title") or entry["label"] + if entry.get("is_trunk"): + return "• ", entry.get("source_ref") or entry["label"] + return "", entry["label"] -def _migration_version_info_from_manifest() -> Optional[dict]: - """Select a migration target from the update manifest. +def _entry_detail(entry: dict) -> str: + """Second line of a focused version row: unavailability beats build info. - Walks channels stable -> beta -> unstable and returns version_info for the - first available entry that carries a migration tarball, or None if the - manifest can't be fetched or has no such entry. + Build info is age plus the short commit hash ("built 5h ago · 2692406") — + the hash stays out of the list rows but remains one focus away. """ - manifest = _fetch_update_manifest() - if not manifest: - return None - channels = manifest.get("channels") - if not isinstance(channels, dict): - return None - for channel in _MIGRATION_CHANNELS: - entries = channels.get(channel) - if not isinstance(entries, list): - continue - for entry in entries: - if not isinstance(entry, dict) or not entry.get("available"): - continue - url = entry.get("migration_url") - sha_url = entry.get("migration_sha256_url") - if not url or not sha_url: - continue - version_info = { - "version": entry.get("version", "?"), - "type": "upgrade", - "migration_url": url, - "migration_sha256_url": sha_url, - } - # Size comes from a live HEAD on the tarball; omitted on failure - # (the confirm screen then shows "?"). - size_mb = _fetch_download_size_mb(url) - if size_mb is not None: - version_info["migration_size_mb"] = size_mb - return version_info - return None + if entry.get("unavailable"): + return entry.get("subtitle", "") + parts = [] + age = _format_age(entry.get("built_at")) + if age: + parts.append(_("built {age}").format(age=age)) + sha = entry.get("source_sha") + if isinstance(sha, str) and sha: + parts.append(sha[:7]) + if parts: + return " · ".join(parts) + return entry.get("subtitle", "") + + +def _current_store_path() -> Optional[str]: + """Store path of the running build, or None when unknown. + + The store path — not the version string — is a build's identity: a re-cut + release keeps its version/label but is a different system. Prefer + current-build.json (it names the base store path even on a camera-specialised + device), but only when it actually describes the running system: it is + written before the reboot, so a failed boot or rollback can leave it naming a + build that isn't running. When stale, fall back to the actually-running + system so the update list hides the real build, not a phantom one. + """ + try: + with open(utils.current_build_json) as f: + recorded = json.load(f).get("store_path") or None + except (OSError, ValueError): + recorded = None + if recorded and utils.build_is_running(recorded): + return recorded + return utils.running_system_store_path() + + +def _hide_current_build(entries: List[dict], current_ref: Optional[str]) -> List[dict]: + """Hide only the exact running build, matched by store path. + + A same-version entry with a different store path (e.g. a re-cut release) + is a real upgrade and must stay visible. When the current build is + unknown, nothing is hidden — offering the running build is harmless, + hiding a real upgrade is not. + """ + if not current_ref: + return list(entries) + return [e for e in entries if e.get("ref") != current_ref] def update_needed(current_version: str, repo_version: str) -> bool: @@ -173,463 +334,802 @@ def update_needed(current_version: str, repo_version: str) -> bool: class UISoftware(UIModule): """ - UI for updating software versions. - Includes secret 7x square unlock to trigger NixOS migration. + Software update UI. + + Phases: + loading - animated "Checking for updates..." + browse - header (version + channel selector) + scrollable version list + confirm - selected version details + Install / Notes / Cancel + upgrading - progress bar with download progress, then reboot + failed - update failed + Retry / Cancel """ __title__ = "SOFTWARE" + MAX_VISIBLE = 4 def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) - self.version_txt = f"{utils.pifinder_dir}/version.txt" self.wifi_txt = f"{utils.pifinder_dir}/wifi_status.txt" - with open(self.wifi_txt, "r") as wfs: - self._wifi_mode = wfs.read() - with open(self.version_txt, "r") as ver: - self._software_version = ver.read() - - self._release_version = "-.-.-" + with open(self.wifi_txt, "r") as f: + self._wifi_mode = f.read().strip() + self._software_version = utils.get_version() + self._software_subtitle: Optional[str] = None + + self._channels: Dict[str, List[dict]] = {} + self._manifest_channels: Dict[str, List[dict]] = {} + self._channel_names: List[str] = [] + self._channel_index = 0 + + self._version_list: List[dict] = [] + self._list_index = 0 + self._scroll_offset = 0 + + self._phase = "loading" + self._focus = "channel" # "channel" or "list" (browse phase) self._elipsis_count = 0 - self._go_for_update = False - self._option_select = "Update" - - # Unlock sequence tracking (7x square triggers migration) - self._key_buffer: list = [] - - def _record_key(self, key_name: str): - """Record a key press for unlock sequence detection.""" - self._key_buffer.append(key_name) - if len(self._key_buffer) > len(_UNLOCK_SEQUENCE): - self._key_buffer = self._key_buffer[-len(_UNLOCK_SEQUENCE) :] - if self._key_buffer == _UNLOCK_SEQUENCE: - self._key_buffer = [] - # Unlock: offer the first available migration target from the - # manifest, ignoring the nixos_for_everyone gate (that governs only - # the public path). - version_info = _migration_version_info_from_manifest() - if version_info: - self._trigger_migration(version_info) - else: - self.message(_("No release found"), 2) - - def _trigger_migration(self, version_info: dict): - """Push UIMigrationConfirm onto the UI stack with the supplied - version_info (must already contain migration_url and - migration_sha256_url).""" - self.message("System Upgrade", 1) - self.add_to_stack( - { - "class": UIMigrationConfirm, - "version_info": version_info, - "current_version": self._software_version.strip(), - } + + self._selected_version: Optional[dict] = None + self._confirm_options: List[str] = [] + self._confirm_index = 0 + + self._fail_option = "Retry" + self._fail_reason = "" + self._unstable_entries: List[dict] = [] + + # Background manifest refresh: the worker thread writes a single + # ("ok", channels) / ("error", None) tuple; update() consumes it. + self._refresh_thread: Optional[threading.Thread] = None + self._refresh_result: Optional[Tuple[str, Optional[Dict[str, List[dict]]]]] = ( + None ) + self._checking = False + self._check_failed = False - def get_release_version(self): - """ - Fetches current release version from - github, sets class variable if found. - Also checks the remote migration config. - """ - config = _fetch_migration_config() - if config and config.get("nixos_for_everyone"): - # Gate is open for everyone; the tarball comes from the manifest - # (stable -> beta -> unstable). - version_info = _migration_version_info_from_manifest() - if version_info: - self._trigger_migration(version_info) - return + self._scrollers: Dict[str, TextLayouterScroll] = {} + self._scroller_phase: Optional[str] = None + self._scroller_index: Optional[int] = None + def active(self): + super().active() + self._elipsis_count = 0 + self._focus = "channel" + self._channel_index = 0 + self._list_index = 0 + self._scroll_offset = 0 + self._selected_version = None + self._scrollers = {} + self._scroller_phase = None + self._scroller_index = None + self._check_failed = False + + # Render the last cached manifest immediately; a fresh copy is fetched + # in the background and swapped in when it lands. + cached = _load_cached_manifest() + if cached is not None: + self._apply_manifest(_parse_manifest(cached)) + self._phase = "browse" + else: + self._phase = "loading" + self._start_refresh() + + # ------------------------------------------------------------------ + # Data + # ------------------------------------------------------------------ + + def _list_rollback_targets(self) -> List[dict]: + # Rollback targets come from local, immutable generation data, so they + # are available even when the manifest can't be fetched — which is + # exactly when rollback matters most. Entries are validated like + # manifest entries: anything without a string label can't be rendered + # or installed, so it is dropped rather than crash the screen. try: - res = requests.get( - "https://raw.githubusercontent.com/brickbots/PiFinder/release/version.txt", - timeout=REQUEST_TIMEOUT, - ) - except requests.exceptions.RequestException: - logger.warning("Could not fetch release version from github") - self._release_version = "Unknown" + targets = sys_utils.list_rollback_targets() + return [ + t + for t in targets + if isinstance(t, dict) and isinstance(t.get("label"), str) + ] + except Exception as e: # never let rollback listing break the screen + logger.warning("Could not list rollback targets: %s", e) + return [] + + def _start_refresh(self): + if self._refresh_thread is not None and self._refresh_thread.is_alive(): return + self._checking = True + self._refresh_result = None + self._refresh_thread = threading.Thread( + target=self._refresh_worker, daemon=True + ) + self._refresh_thread.start() - if res.status_code == 200: - self._release_version = res.text[:-1] + def _refresh_worker(self): + """Background thread: fetch the manifest, annotate, cache, parse.""" + try: + manifest = _fetch_raw_manifest() + except (requests.exceptions.RequestException, ValueError) as e: + logger.warning("Software update check failed (offline/invalid?): %s", e) + self._refresh_result = ("error", None) + return + _annotate_trunk_entries(manifest) + _save_cached_manifest(manifest) + self._refresh_result = ("ok", _parse_manifest(manifest)) + + def _consume_refresh_result(self): + """Apply a finished background refresh, if any (main thread only).""" + result = self._refresh_result + if result is None: + return + self._refresh_result = None + self._checking = False + status, manifest_channels = result + + if status == "ok" and manifest_channels is not None: + self._check_failed = False + self._apply_manifest(manifest_channels, keep_position=True) + if self._phase in ("loading", "offline"): + self._phase = "browse" + return + + # Refresh failed. With a cached list on screen just flag it; without + # one fall back to rollback-only browse, or the offline notice. + if self._phase != "loading": + self._check_failed = True + return + rollback = self._list_rollback_targets() + if rollback: + self._check_failed = True + self._manifest_channels = {} + self._channels = {"rollback": rollback} + self._channel_names = list(self._channels.keys()) + self._channel_index = 0 + self._refresh_version_list() + self._phase = "browse" + else: + self._phase = "offline" + + def _apply_manifest( + self, manifest_channels: Dict[str, List[dict]], keep_position: bool = False + ): + self._manifest_channels = manifest_channels + self._channels = { + "stable": manifest_channels.get("stable", []), + "beta": manifest_channels.get("beta", []), + } + + if self.config_object.get_option("dev_mode", False): + self._unstable_entries = manifest_channels.get("unstable", []) + self._channels["unstable"] = self._unstable_entries + + rollback = self._list_rollback_targets() + if rollback: + self._channels["rollback"] = rollback + + # Try to find subtitle for current version from fetched entries + self._software_subtitle = self._find_current_subtitle() + + # A background refresh should not yank the user's channel selection. + prev_channel = ( + self._channel_names[self._channel_index] if self._channel_names else None + ) + self._channel_names = list(self._channels.keys()) + if keep_position and prev_channel in self._channel_names: + self._channel_index = self._channel_names.index(prev_channel) else: - self._release_version = "Unknown" + self._channel_index = 0 + self._refresh_version_list(keep_position=keep_position) - def update_software(self): - self.message(_("Updating..."), 10) - if sys_utils.update_software(): - self.message(_("Ok! Restarting"), 10) - sys_utils.restart_system() + def _find_current_subtitle(self) -> Optional[str]: + """Find a subtitle for the running build. + + Matches by store path (the build's identity) first, falling back to + the version string when the current store path is unknown. + """ + current_ref = _current_store_path() + for entries in self._channels.values(): + for entry in entries: + if current_ref and entry.get("ref") == current_ref: + return entry.get("subtitle") + if not current_ref and entry.get("version") == self._software_version: + return entry.get("subtitle") + + return None + + def _refresh_version_list(self, keep_position: bool = False): + if not self._channel_names: + self._version_list = [] + return + channel = self._channel_names[self._channel_index] + entries = self._channels.get(channel, []) + if channel == "rollback": + self._version_list = entries else: - self.message(_("Error on Upd"), 3) + self._version_list = _hide_current_build(entries, _current_store_path()) + if keep_position and self._version_list: + self._list_index = min(self._list_index, len(self._version_list) - 1) + self._scroll_offset = min(self._scroll_offset, self._list_index) + else: + self._list_index = 0 + self._scroll_offset = 0 + self._scrollers = {} + self._scroller_phase = None + self._scroller_index = None + + def _get_scrollspeed_config(self): + scroll_dict = { + "Off": 0, + "Fast": TextLayouterScroll.FAST, + "Med": TextLayouterScroll.MEDIUM, + "Slow": TextLayouterScroll.SLOW, + } + scrollspeed = self.config_object.get_option("text_scroll_speed", "Med") + return scroll_dict[scrollspeed] + + def _get_scroller(self, key: str, text: str, font, color, width: int): + """Get or create a cached scroller, reset cache on phase/index change.""" + phase_index = (self._phase, self._list_index) + if (self._scroller_phase, self._scroller_index) != phase_index: + self._scrollers = {} + self._scroller_phase = self._phase + self._scroller_index = self._list_index + + if key not in self._scrollers: + self._scrollers[key] = TextLayouterScroll( + text, + draw=self.draw, + color=color, + font=font, + width=width, + scrollspeed=self._get_scrollspeed_config(), + ) + return self._scrollers[key] - def update(self, force=False): - self.clear_screen() - draw_pos = self.display_class.titlebar_height + 2 + # ------------------------------------------------------------------ + # Drawing helpers + # ------------------------------------------------------------------ + + def _draw_separator(self, y): + self.draw.line([(0, y), (127, y)], fill=self.colors.get(64)) + + def _draw_loading(self): + y = self.display_class.titlebar_height + 2 + ver_scroller = self._get_scroller( + "loading_ver", + self._software_version, + self.fonts.bold, + self.colors.get(255), + self.fonts.bold.line_length, + ) + ver_scroller.draw((0, y)) + dots = "." * (self._elipsis_count // 10) self.draw.text( - (0, draw_pos), - _("Wifi Mode: {mode}").format(mode=self._wifi_mode), - font=self.fonts.base.font, - fill=self.colors.get(128), + (10, 90), + _("Checking for"), + font=self.fonts.large.font, + fill=self.colors.get(255), ) - draw_pos += self.fonts.base.height + 4 - self.draw.text( - (0, draw_pos), - _("Current Version"), - font=self.fonts.bold.font, - fill=self.colors.get(128), + (10, 105), + _("updates{elipsis}").format(elipsis=dots), + font=self.fonts.large.font, + fill=self.colors.get(255), ) - draw_pos += self.fonts.bold.height - 3 + self._elipsis_count += 1 + if self._elipsis_count > 39: + self._elipsis_count = 0 + def _draw_wifi_warning(self): + y = self.display_class.titlebar_height + 2 + ver_scroller = self._get_scroller( + "wifi_ver", + self._software_version, + self.fonts.bold, + self.colors.get(255), + self.fonts.bold.line_length, + ) + ver_scroller.draw((0, y)) self.draw.text( - (10, draw_pos), - f"{self._software_version}", - font=self.fonts.bold.font, - fill=self.colors.get(192), + (10, 90), + _("WiFi must be"), + font=self.fonts.large.font, + fill=self.colors.get(255), ) - draw_pos += self.fonts.bold.height + 3 - self.draw.text( - (0, draw_pos), - _("Release Version"), - font=self.fonts.bold.font, - fill=self.colors.get(128), + (10, 105), + _("client mode"), + font=self.fonts.large.font, + fill=self.colors.get(255), ) - draw_pos += self.fonts.bold.height - 3 + def _draw_offline(self): + y = self.display_class.titlebar_height + 2 + ver_scroller = self._get_scroller( + "offline_ver", + self._software_version, + self.fonts.bold, + self.colors.get(255), + self.fonts.bold.line_length, + ) + ver_scroller.draw((0, y)) self.draw.text( - (10, draw_pos), - f"{self._release_version}", - font=self.fonts.bold.font, - fill=self.colors.get(192), + (10, 90), + _("No internet -"), + font=self.fonts.large.font, + fill=self.colors.get(255), + ) + self.draw.text( + (10, 105), + _("check WiFi"), + font=self.fonts.large.font, + fill=self.colors.get(255), ) - # The two-line status / action message is anchored up from the bottom - # so it clears the (taller-font) info block on larger displays. - msg_pitch = self.fonts.large.height - msg_top = self.display_class.resY - 2 * msg_pitch - 6 - msg_bottom = msg_top + msg_pitch + def _draw_browse(self): + y = self.display_class.titlebar_height + 2 - if self._wifi_mode != "Client": - self.draw.text( - (10, msg_top), - _("WiFi must be"), - font=self.fonts.large.font, - fill=self.colors.get(255), + # Current version + ver_scroller = self._get_scroller( + "browse_cur_ver", + self._software_version, + self.fonts.bold, + self.colors.get(255), + self.fonts.bold.line_length, + ) + ver_scroller.draw((0, y)) + y += 12 + if self._software_subtitle: + sub_scroller = self._get_scroller( + "browse_cur_sub", + self._software_subtitle, + self.fonts.base, + self.colors.get(128), + self.fonts.base.line_length, ) + sub_scroller.draw((0, y)) + y += 12 + else: + y += 2 + + # Channel selector + channel_name = ( + self._channel_names[self._channel_index].capitalize() + if self._channel_names + else "---" + ) + if self._focus == "channel": self.draw.text( - (10, msg_bottom), - _("client mode"), - font=self.fonts.large.font, + (0, y), + self._RIGHT_ARROW, + font=self.fonts.bold.font, fill=self.colors.get(255), ) - return self.screen_update() - - if self._release_version == "-.-.-": - # check elipsis count here... if we are at >30 check for - # release versions - if self._elipsis_count > 30: - self.get_release_version() self.draw.text( - (10, msg_top), - _("Checking for"), - font=self.fonts.large.font, + (10, y), + channel_name, + font=self.fonts.bold.font, fill=self.colors.get(255), ) + else: self.draw.text( - (10, msg_bottom), - _("updates{elipsis}").format( - elipsis="." * int(self._elipsis_count / 10) - ), - font=self.fonts.large.font, - fill=self.colors.get(255), + (10, y), + channel_name, + font=self.fonts.base.font, + fill=self.colors.get(128), ) - self._elipsis_count += 1 - if self._elipsis_count > 39: - self._elipsis_count = 0 - return self.screen_update() + y += 14 - if not update_needed( - self._software_version.strip(), self._release_version.strip() - ): + self._draw_separator(y) + y += 4 + + # Version list + if not self._version_list: self.draw.text( - (10, msg_top), - _("No Update"), - font=self.fonts.large.font, - fill=self.colors.get(255), + (10, y + 10), + _("No versions"), + font=self.fonts.base.font, + fill=self.colors.get(128), ) self.draw.text( - (10, msg_bottom), - _("needed"), - font=self.fonts.large.font, - fill=self.colors.get(255), + (10, y + 22), + _("available"), + font=self.fonts.base.font, + fill=self.colors.get(128), ) - return self.screen_update() + self._draw_refresh_status() + return - # If we are here, go for update! - self._go_for_update = True - self.draw.text( - (10, 90), - _("Update Now"), - font=self.fonts.large.font, - fill=self.colors.get(255), - ) - self.draw.text( - (10, 105), - _("Cancel"), - font=self.fonts.large.font, - fill=self.colors.get(255), - ) - if self._option_select == "Update": - ind_pos = msg_top + label_width = self.fonts.base.line_length - 2 + list_bottom = 114 if (self._checking or self._check_failed) else 128 + current_y = y + for i in range(len(self._version_list)): + idx = self._scroll_offset + i + if idx >= len(self._version_list): + break + entry = self._version_list[idx] + prefix, text = _entry_row_parts(entry) + + if self._focus == "list" and idx == self._list_index: + if current_y + 24 > list_bottom: + break + self.draw.text( + (0, current_y), + self._RIGHT_ARROW, + font=self.fonts.bold.font, + fill=self.colors.get(255), + ) + # The prefix (PR number / trunk dot) stays fixed; only the + # title scrolls after it. + text_x = 10 + scroll_width = label_width + if prefix: + self.draw.text( + (text_x, current_y), + prefix, + font=self.fonts.bold.font, + fill=self.colors.get(255), + ) + text_x += int(self.fonts.bold.width * len(prefix)) + scroll_width = max(1, label_width - len(prefix)) + scroller = self._get_scroller( + "browse_label", + text, + self.fonts.bold, + self.colors.get(255), + scroll_width, + ) + scroller.draw((text_x, current_y)) + current_y += 12 + detail = _entry_detail(entry) + if detail: + sub_scroller = self._get_scroller( + "browse_sub", + detail, + self.fonts.base, + self.colors.get(255), + label_width, + ) + sub_scroller.draw((10, current_y)) + current_y += 12 + else: + # Unfocused rows stay dim so the selected row and its detail + # line carry the visual weight. + if current_y + 12 > list_bottom: + break + # The trunk ("main") row stands out from the PR rows: bold and + # brighter, with a leading dot. + if entry.get("is_trunk"): + self.draw.text( + (10, current_y), + f"{prefix}{text}"[:label_width], + font=self.fonts.bold.font, + fill=self.colors.get(192), + ) + else: + self.draw.text( + (10, current_y), + f"{prefix}{text}"[:label_width], + font=self.fonts.base.font, + fill=self.colors.get(128), + ) + current_y += 12 + + self._draw_refresh_status() + + def _draw_refresh_status(self): + """Bottom-line indicator for the background manifest refresh.""" + if self._checking: + dots = "." * ((self._elipsis_count // 10) % 4) + text = _("checking for updates") + dots + self._elipsis_count += 1 + if self._elipsis_count > 39: + self._elipsis_count = 0 + elif self._check_failed: + text = _("update check failed") else: - ind_pos = msg_bottom + return self.draw.text( - (0, ind_pos), - self._RIGHT_ARROW, - font=self.fonts.large.font, - fill=self.colors.get(255), + (4, 115), + text, + font=self.fonts.base.font, + fill=self.colors.get(96), ) - return self.screen_update() - - def toggle_option(self): - if not self._go_for_update: - return - if self._option_select == "Update": - self._option_select = "Cancel" - else: - self._option_select = "Update" - - def key_square(self): - self._record_key("square") - - def key_up(self): - self.toggle_option() - - def key_down(self): - self.toggle_option() - - def key_right(self): - if self._option_select == "Cancel": - self.remove_from_stack() - else: - self.update_software() - - -class UIMigrationConfirm(UIModule): - """ - Warning screen before initiating NixOS migration. - Shows version info, warns about irreversibility, requires confirmation. - """ - - __title__ = "UPGRADE" - - def __init__(self, *args, **kwargs) -> None: - super().__init__(*args, **kwargs) - self._version_info = self.item_definition.get("version_info", {}) - self._current_version = self.item_definition.get("current_version", "?") - self._target_version = self._version_info.get("version", "?") - self._option_index = 0 - self._options = [_("Confirm"), _("Cancel")] - - def update(self, force=False): - time.sleep(1 / 30) - self.clear_screen() + def _draw_confirm(self): y = self.display_class.titlebar_height + 2 self.draw.text( (0, y), - _("Major Upgrade"), - font=self.fonts.bold.font, - fill=self.colors.get(255), + _("Update to:"), + font=self.fonts.base.font, + fill=self.colors.get(128), ) y += 14 - self.draw.text( - (5, y), - f"{self._current_version} -> {self._target_version}", - font=self.fonts.bold.font, - fill=self.colors.get(192), + label_width = self.fonts.base.line_length + version_label = ( + self._selected_version.get("version") or self._selected_version["label"] ) - y += 16 - - # Separator - self.draw.line([(0, y), (127, y)], fill=self.colors.get(64)) - y += 4 - - self.draw.text( - (0, y), - _("IRREVERSIBLE"), - font=self.fonts.bold.font, - fill=self.colors.get(255), + scroller = self._get_scroller( + "confirm_label", + version_label, + self.fonts.bold, + self.colors.get(255), + label_width, ) + scroller.draw((0, y)) y += 12 - size_mb = self._version_info.get("migration_size_mb", "?") - self.draw.text( - (0, y), - _("Download: {}MB").format(size_mb), - font=self.fonts.base.font, - fill=self.colors.get(128), - ) - y += 11 - - self.draw.text( - (0, y), - _("Power + WiFi req"), - font=self.fonts.base.font, - fill=self.colors.get(128), - ) - y += 11 + subtitle = self._selected_version.get("subtitle", "") + if subtitle: + sub_scroller = self._get_scroller( + "confirm_sub", + subtitle, + self.fonts.base, + self.colors.get(128), + label_width, + ) + sub_scroller.draw((0, y)) + y += 14 - if not self._version_info.get( - "migration_sha256_url" - ) and not self._version_info.get("migration_sha256"): + age = _format_age(self._selected_version.get("built_at")) + if age: self.draw.text( (0, y), - _("No checksum avail."), + _("built {age}").format(age=age), font=self.fonts.base.font, fill=self.colors.get(128), ) y += 11 - y += 5 + self._draw_separator(y) + y += 4 - # Options - for i, label in enumerate(self._options): - oy = y + i * 12 + for i, opt in enumerate(self._confirm_options): + item_y = y + i * 12 + if i == self._confirm_index: + self.draw.text( + (0, item_y), + self._RIGHT_ARROW, + font=self.fonts.bold.font, + fill=self.colors.get(255), + ) + self.draw.text( + (10, item_y), + _(opt), + font=self.fonts.bold.font, + fill=self.colors.get(255), + ) + else: + self.draw.text( + (10, item_y), + _(opt), + font=self.fonts.base.font, + fill=self.colors.get(192), + ) + + def _draw_failed(self): + y = self.display_class.titlebar_height + 20 + reason = self._fail_reason or _("Update failed!") + for line in reason.split("\n"): self.draw.text( - (10, oy), - label, + (10, y), + line, font=self.fonts.bold.font, fill=self.colors.get(255), ) - if i == self._option_index: + y += 14 + y += 6 + for label in ("Retry", "Cancel"): + if self._fail_option == label: self.draw.text( - (0, oy), + (0, y), self._RIGHT_ARROW, font=self.fonts.bold.font, fill=self.colors.get(255), ) + self.draw.text( + (10, y), + _(label), + font=self.fonts.bold.font, + fill=self.colors.get(255), + ) + y += 12 - return self.screen_update() + # ------------------------------------------------------------------ + # Main update loop + # ------------------------------------------------------------------ - def key_up(self): - self._option_index = (self._option_index - 1) % len(self._options) + def update(self, force=False): + self.clear_screen() - def key_down(self): - self._option_index = (self._option_index + 1) % len(self._options) + if self._phase == "upgrading": + self._draw_upgrading() + return self.screen_update() - def key_left(self): - return True + if self._phase == "failed": + self._draw_failed() + return self.screen_update() - def key_right(self): - if self._options[self._option_index] == _("Cancel"): - self.remove_from_stack() - elif self._options[self._option_index] == _("Confirm"): - self.add_to_stack( - { - "class": UIMigrationProgress, - "version_info": self._version_info, - } - ) + if self._wifi_mode != "Client": + self._draw_wifi_warning() + return self.screen_update() + self._consume_refresh_result() -class UIMigrationProgress(UIModule): - """ - Migration download and preparation progress screen. - Triggers the actual migration via sys_utils. - """ + if self._phase == "loading": + self._draw_loading() + return self.screen_update() - __title__ = "UPGRADE" + if self._phase == "offline": + self._draw_offline() + return self.screen_update() - def __init__(self, *args, **kwargs) -> None: - super().__init__(*args, **kwargs) - self._version_info = self.item_definition.get("version_info", {}) - self._started = False - self._status = _("Starting...") - self._progress = 0 - self._terminal_failure = False - self._status_layout = TextLayouter( - self._status, - draw=self.draw, - color=self.colors.get(255), - colors=self.colors, - font=self.fonts.base, - available_lines=4, - ) + if self._phase == "browse": + self._draw_browse() + elif self._phase == "confirm": + self._draw_confirm() - def active(self): - super().active() - if not self._started: - self._started = True - self._start_migration() + return self.screen_update() - def _start_migration(self): - """Kick off the migration process in the background.""" - self._status = _("Downloading...") - try: - version_info = dict(self._version_info) - version_info["display_class"] = self.display_class.__class__.__name__ - version_info["display_resolution"] = list(self.display_class.resolution) - supported_displays = { - "DisplaySSD1351": (128, 128), - "DisplaySSD1333": (176, 176), - } - display_class = version_info["display_class"] - display_resolution = tuple(version_info["display_resolution"]) - display_supported = ( - supported_displays.get(display_class) == display_resolution - ) - display_supported = display_supported or ( - "SSD1333" in display_class and display_resolution == (176, 176) - ) - if not display_supported: - logger.error( - "Unsupported migration progress renderer display: " - f"{display_class} {version_info['display_resolution']}" + # ------------------------------------------------------------------ + # Key handlers + # ------------------------------------------------------------------ + + def key_up(self): + if self._phase == "upgrading": + return + if self._phase == "failed": + self._fail_option = "Cancel" if self._fail_option == "Retry" else "Retry" + elif self._phase == "browse": + if self._focus == "list": + if self._list_index == 0: + self._focus = "channel" + else: + self._list_index -= 1 + if self._list_index < self._scroll_offset: + self._scroll_offset = self._list_index + elif self._phase == "confirm": + if self._confirm_index > 0: + self._confirm_index -= 1 + + def key_down(self): + if self._phase == "upgrading": + return + if self._phase == "failed": + self._fail_option = "Cancel" if self._fail_option == "Retry" else "Retry" + elif self._phase == "browse": + if self._focus == "channel": + if self._version_list: + self._focus = "list" + self._list_index = 0 + self._scroll_offset = 0 + elif self._focus == "list": + if self._list_index < len(self._version_list) - 1: + self._list_index += 1 + if self._list_index >= self._scroll_offset + self.MAX_VISIBLE: + self._scroll_offset = self._list_index - self.MAX_VISIBLE + 1 + elif self._phase == "confirm": + if self._confirm_index < len(self._confirm_options) - 1: + self._confirm_index += 1 + + def key_right(self): + if self._phase == "upgrading": + return + if self._phase == "failed": + if self._fail_option == "Retry": + # Re-enters update_software() → "upgrading" phase, so Retry + # reuses the same progress UI as the first attempt. + self.update_software() + else: + self.remove_from_stack() + elif self._phase == "browse": + if self._focus == "channel" and self._channel_names: + self._channel_index = (self._channel_index + 1) % len( + self._channel_names ) - self._status = _("Not supported") - return - sys_utils.start_nixos_migration(version_info) - except AttributeError: - logger.error("sys_utils.start_nixos_migration not available") - self._status = _("Not supported") - self._status_layout.set_text(self._status) - self._terminal_failure = True - except Exception as e: - logger.error(f"Migration failed to start: {e}") - self._status = _("Failed: ") + str(e) - self._status_layout.set_text(self._status) - self._terminal_failure = True + self._refresh_version_list() + elif self._focus == "list" and self._version_list: + self._selected_version = self._version_list[self._list_index] + self._confirm_options = [] + if not self._selected_version.get("unavailable"): + self._confirm_options.append("Install") + if self._selected_version.get("notes"): + self._confirm_options.append("Notes") + self._confirm_options.append("Cancel") + self._confirm_index = 0 + self._phase = "confirm" + elif self._phase == "confirm": + opt = self._confirm_options[self._confirm_index] + if opt == "Install": + self.update_software() + elif opt == "Notes": + notes = self._selected_version.get("notes") + if notes: + self.add_to_stack({"class": UIReleaseNotes, "notes_text": notes}) + elif opt == "Cancel": + self._phase = "browse" - def update(self, force=False): - time.sleep(1 / 30) + def key_left(self): + if self._phase == "upgrading": + return False + if self._phase == "confirm": + self._phase = "browse" + return False + return True + + def key_square(self): + # Manual refresh: re-fetch the manifest with the same feedback as the + # automatic check on entry — the bottom status line in browse, the + # full "Checking for updates" screen when currently offline. + if self._phase == "browse": + self._start_refresh() + elif self._phase == "offline": + self._phase = "loading" + self._elipsis_count = 0 + self._start_refresh() + + # ------------------------------------------------------------------ + # Update action + # ------------------------------------------------------------------ + + def update_software(self): + if not self._selected_version: + return + if self._selected_version.get("unavailable"): + self._phase = "failed" + self._fail_reason = _("Version no\nlonger available") + self._fail_option = "Cancel" + return + self._phase = "upgrading" self.clear_screen() + self._draw_upgrading() + self.screen_update() + + ref = self._selected_version.get("ref") or "release" + selection = { + "ref": ref, + "label": self._selected_version.get("label"), + "version": self._selected_version.get("version"), + "channel": self._selected_version.get("channel"), + } + if not sys_utils.update_software(ref=ref, selection=selection): + self._phase = "failed" + self._fail_option = "Retry" + + def _draw_upgrading(self): y = self.display_class.titlebar_height + 2 - # Try to read progress from sys_utils. AttributeError happens when - # running against sys_utils_fake (no migration support); the helper - # itself swallows OS/JSON errors and returns {}. - try: - progress = sys_utils.get_migration_progress() - except AttributeError: - progress = None - if progress: - try: - self._progress = int(progress.get("percent", self._progress)) - except (TypeError, ValueError): - pass # bad/missing percent — keep prior value - new_status = progress.get("status", self._status) - if isinstance(new_status, str) and new_status != self._status: - self._status = new_status - self._status_layout.set_text(self._status) + progress = sys_utils.get_upgrade_progress() + phase = progress["phase"] + pct = progress["percent"] + done = progress["done"] + total = progress["total"] + unit = progress.get("unit", "bytes") + + if phase in ("failed", "unavailable", "connfail"): + if phase == "unavailable": + self._fail_reason = _("Version no\nlonger available") + elif phase == "connfail": + self._fail_reason = _("Can't reach\nupdate server") + else: + self._fail_reason = _("Update failed!") + self._phase = "failed" + self._fail_option = "Retry" + return + + # Title + if phase == "rebooting": + label = _("Rebooting...") + elif phase == "activating": + label = _("Activating...") + elif phase == "starting": + label = _("Preparing...") + else: + label = _("Downloading...") self.draw.text( (0, y), - _("System Upgrade"), + label, font=self.fonts.bold.font, fill=self.colors.get(255), ) @@ -637,17 +1137,21 @@ def update(self, force=False): # Progress bar bar_x, bar_w, bar_h = 4, 120, 12 + # Background fill so bar is always visible self.draw.rectangle( [bar_x, y, bar_x + bar_w, y + bar_h], - outline=self.colors.get(64), + fill=self.colors.get(48), + outline=self.colors.get(128), ) - fill_w = int(bar_w * self._progress / 100) + fill_w = int(bar_w * pct / 100) if fill_w > 0: self.draw.rectangle( [bar_x + 1, y + 1, bar_x + fill_w, y + bar_h - 1], fill=self.colors.get(255), ) - pct_text = f"{self._progress}%" + + # Percentage centered on bar + pct_text = f"{pct}%" pct_bbox = self.fonts.base.font.getbbox(pct_text) pct_w = pct_bbox[2] - pct_bbox[0] pct_h = pct_bbox[3] - pct_bbox[1] @@ -657,44 +1161,46 @@ def update(self, force=False): (pct_x, pct_y), pct_text, font=self.fonts.base.font, - fill=self.colors.get(0) if self._progress > 45 else self.colors.get(192), + fill=self.colors.get(0) if pct > 45 else self.colors.get(192), ) - y += bar_h + 4 - - # Use TextLayouter for scrollable status text - self._status_layout.draw((0, y)) - - return self.screen_update() - - def key_up(self): - self._status_layout.previous() + y += bar_h + 6 - def key_down(self): - self._status_layout.next() - - def key_left(self): - # Allow exit only if the migration never actually started (e.g., - # pre-flight refused due to missing checksum or unsupported display). - # Once the bash script is running, going back is unsafe. - if self._terminal_failure: - self.remove_from_stack() - return True - return False + # Amount below the bar: megabytes downloaded out of the total, or a + # path count in the fallback case where byte sizes were unavailable. + if phase == "downloading" and total > 0: + if unit == "bytes": + amount_text = f"{done / 1048576:.0f}/{total / 1048576:.0f} MB" + else: + amount_text = f"{done}/{total} paths" + self.draw.text( + (4, y), + amount_text, + font=self.fonts.base.font, + fill=self.colors.get(128), + ) + # Name the package currently being copied, if known. + item = progress.get("item", "") + if item: + self.draw.text( + (4, y + 12), + item[:22], + font=self.fonts.base.font, + fill=self.colors.get(96), + ) class UIReleaseNotes(UIModule): """ Scrollable release notes viewer. - Fetches markdown from a URL and displays as plain text. + Accepts markdown text directly via notes_text in item_definition. """ __title__ = "NOTES" def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) - self._notes_url = self.item_definition.get("notes_url", "") + self._notes_text = self.item_definition.get("notes_text", "") self._loaded = False - self._error = False self._text_layout = TextLayouter( "", draw=self.draw, @@ -707,38 +1213,31 @@ def __init__(self, *args, **kwargs) -> None: def active(self): super().active() if not self._loaded: - self._fetch_notes() - - def _fetch_notes(self): - """Fetch release notes from the configured URL.""" - try: - res = requests.get(self._notes_url, timeout=REQUEST_TIMEOUT) - if res.status_code == 200: - text = _strip_markdown(res.text) - self._text_layout.set_text(text) - self._loaded = True - else: - self._error = True - logger.warning(f"Failed to fetch release notes: HTTP {res.status_code}") - except requests.exceptions.RequestException as e: - self._error = True - logger.warning(f"Failed to fetch release notes: {e}") + self._load_notes() + + def _load_notes(self): + """Process notes text for display.""" + if self._notes_text: + text = _strip_markdown(self._notes_text) + self._text_layout.set_text(text) + self._loaded = True + else: + self._loaded = True def update(self, force=False): - time.sleep(1 / 30) self.clear_screen() draw_pos = self.display_class.titlebar_height + 2 - if self._error: + if not self._notes_text: self.draw.text( (10, draw_pos + 20), - _("Could not load"), + _("No release notes"), font=self.fonts.large.font, fill=self.colors.get(255), ) self.draw.text( (10, draw_pos + 35), - _("release notes"), + _("available"), font=self.fonts.large.font, fill=self.colors.get(255), ) diff --git a/python/PiFinder/ui/status.py b/python/PiFinder/ui/status.py index 838b69364..c2c104648 100644 --- a/python/PiFinder/ui/status.py +++ b/python/PiFinder/ui/status.py @@ -49,10 +49,6 @@ def __init__(self, *args, **kwargs): "CPU TMP": "--", } - with open(f"{utils.pifinder_dir}/wifi_status.txt", "r") as wfs: - wifi_mode = wfs.read() - self.status_dict["WIFI"] = "Client" if wifi_mode == "Client" else "AP" - self.last_temp_time = 0 self.last_IP_time = 0 self.net = sys_utils.Network() @@ -105,16 +101,14 @@ def update_status_dict(self): self.status_dict["RA/DEC"] = "--/--" else: hh, mm, _ = calc_utils.ra_to_hms(aligned.RA) - self.status_dict["RA/DEC"] = ( - f"{hh:02.0f}h{mm:02.0f}m/{aligned.Dec :.2f}" - ) + self.status_dict["RA/DEC"] = f"{hh:02.0f}h{mm:02.0f}m/{aligned.Dec:.2f}" # AZ/ALT if solution.Az is None or solution.Alt is None: self.status_dict["AZ/ALT"] = "--/--" else: self.status_dict["AZ/ALT"] = ( - f"{solution.Az : >6.2f}/{solution.Alt : >6.2f}" + f"{solution.Az: >6.2f}/{solution.Alt: >6.2f}" ) imu = self.shared_state.imu() @@ -125,10 +119,10 @@ def update_status_dict(self): mtext = "Moving" else: mtext = "Static" - self.status_dict["IMU"] = f"{mtext : >11}" + " " + str(imu.status) + self.status_dict["IMU"] = f"{mtext: >11}" + " " + str(imu.status) - self.status_dict["IMU qw,qx"] = f"{imu.quat.w:>.2f},{imu.quat.x : >.2f}" - self.status_dict["IMU qy,qz"] = f"{imu.quat.y:>.2f},{imu.quat.z : >.2f}" + self.status_dict["IMU qw,qx"] = f"{imu.quat.w:>.2f},{imu.quat.x: >.2f}" + self.status_dict["IMU qy,qz"] = f"{imu.quat.y:>.2f},{imu.quat.z: >.2f}" else: self.status_dict["IMU"] = "--" self.status_dict["IMU qw,qx"] = "--" @@ -161,18 +155,17 @@ def update_status_dict(self): try: with open("/sys/class/thermal/thermal_zone0/temp", "r") as f: raw_temp = int(f.read().strip()) - self.status_dict["CPU TMP"] = f"{raw_temp / 1000 : >13.1f}" + self.status_dict["CPU TMP"] = f"{raw_temp / 1000: >13.1f}" except FileNotFoundError: self.status_dict["CPU TMP"] = "Error" if time.time() - self.last_IP_time > 20: self.last_IP_time = time.time() - # IP address + # Live network state: WIFI radio mode, the reachable IP, and the + # active-uplink label (Ethernet when wired, else SSID / AP name). + self.status_dict["WIFI"] = self.net.wifi_mode() self.status_dict["IP"] = self.net.local_ip() - if self.net.wifi_mode() == "AP": - self.status_dict["SSID"] = self.net.get_ap_name() - else: - self.status_dict["SSID"] = self.net.get_connected_ssid() + self.status_dict["SSID"] = self.net.get_active_label() def update(self, force=False): self.update_status_dict() diff --git a/python/PiFinder/ui/ui_utils.py b/python/PiFinder/ui/ui_utils.py index 661092691..86d3d9cad 100644 --- a/python/PiFinder/ui/ui_utils.py +++ b/python/PiFinder/ui/ui_utils.py @@ -375,10 +375,10 @@ def format_number(num: float, width=5): return f"{num:{width}d}" elif num < 1000000: decimal_places = max(0, width - 3) # 'K' and at least one digit - return f"{num/1000:{width}.{decimal_places}f}K" + return f"{num / 1000:{width}.{decimal_places}f}K" else: decimal_places = max(0, width - 3) # 'M' and at least one digit - return f"{num/1000000:{width}.{decimal_places}f}M" + return f"{num / 1000000:{width}.{decimal_places}f}M" def pointing_arrows(ui, point_az, point_alt, mount_type=None): @@ -448,7 +448,7 @@ def draw_pointing_instructions( decimals = 2 if value < 1 else 1 ui.draw.text( anchor, - f"{arrow}{value : >5.{decimals}f}", + f"{arrow}{value: >5.{decimals}f}", font=ui.fonts.huge.font, fill=ui.colors.get(brightness), ) diff --git a/python/PiFinder/utils.py b/python/PiFinder/utils.py index 5b9bbdb9d..15cccfbb0 100644 --- a/python/PiFinder/utils.py +++ b/python/PiFinder/utils.py @@ -1,6 +1,7 @@ import os import errno import fcntl +import socket import time import logging import json @@ -8,6 +9,8 @@ from typing import Optional import importlib +logger = logging.getLogger("Utils") + home_dir = Path.home() # Repo root, anchored on this file (python/PiFinder/utils.py) so paths @@ -15,12 +18,162 @@ pifinder_dir = Path(__file__).resolve().parents[2] assert (pifinder_dir / "astro_data").is_dir(), f"repo root not at {pifinder_dir}" astro_data_dir = pifinder_dir / "astro_data" -tetra3_dir = pifinder_dir / "python/PiFinder/tetra3/tetra3" data_dir = Path(Path.home(), "PiFinder_data") pifinder_db = astro_data_dir / "pifinder_objects.db" observations_db = data_dir / "observations.db" +# The device's single identity file: seeded with the store path at image +# build, rewritten (with version/label/channel) by every upgrade. Human +# version labels come from the update manifest, which maps store paths to +# versions — the retired pifinder-build.json duplicated that mapping. +current_build_json = Path("/var/lib/pifinder/current-build.json") +# The booted system's own toplevel — ground truth for "what is actually +# running". current_build_json is written at upgrade time, before the reboot, +# so it can outlive a failed boot or a rollback; this symlink cannot. +running_system_link = Path("/run/current-system") + + +def sd_notify(state: str) -> None: + """Send a systemd service notification (e.g. "READY=1"). + + The app's readiness signal is what the boot watchdog's health check keys + off (pifinder.service is Type=notify). Outside systemd — development + runs, tests — NOTIFY_SOCKET is unset and this is a silent no-op; a + notification failure must never be able to break the app itself. + """ + addr = os.environ.get("NOTIFY_SOCKET") + if not addr: + return + if addr.startswith("@"): + # Abstract-namespace socket (leading @ in the env var) + addr = "\0" + addr[1:] + try: + with socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) as sock: + sock.connect(addr) + sock.sendall(state.encode()) + except OSError as e: + logger.warning("sd_notify failed (harmless outside systemd): %s", e) + + +def running_system_store_path() -> Optional[str]: + """Store path the system is actually running, or None when unavailable. + + Reflects the booted generation, so it stays correct across a failed reboot, + a manual rollback, or a watchdog revert — cases where current_build_json, + written before the reboot, still names the build that was merely selected. + None off-device (no /run/current-system symlink into the Nix store). + """ + try: + if not running_system_link.is_symlink(): + return None + resolved = os.path.realpath(running_system_link) + except OSError: + return None + return resolved if resolved.startswith("/nix/store/") else None + + +def build_is_running(store_path: Optional[str]) -> bool: + """Whether store_path is the running system, directly or as the base of the + running camera specialisation. + + A camera specialisation boots /specialisation/ — a different + store path from the recorded base — so a plain equality check would flag + every specialised device as stale. When the running path can't be read + (e.g. off-device), assume a match rather than cry stale. + """ + if not store_path: + return False + running = running_system_store_path() + if running is None: + return True + if os.path.realpath(store_path) == running: + return True + spec_dir = os.path.join(store_path, "specialisation") + try: + specs = os.listdir(spec_dir) + except OSError: + return False + return any( + os.path.realpath(os.path.join(spec_dir, name)) == running for name in specs + ) + + +def _store_path_hash(store_path: str) -> str: + """The 8-char store-hash prefix of a build, or "Unknown".""" + name = store_path.rsplit("/", 1)[-1] + return name.split("-", 1)[0][:8] if name else "Unknown" + + +def get_version() -> str: + """Best available version string for the running build. + + The upgrade service writes an explicit version; a freshly-flashed image + only knows its store path, so fall back to its hash prefix (the update + screen upgrades that to a proper label once the manifest is fetched). + + current_build_json is written before the reboot, so its label can be stale + (failed boot, rollback). When it doesn't describe the running system, ignore + the label and report the running build's hash rather than assert an identity + the device isn't running. + """ + try: + with open(current_build_json, "r") as f: + data = json.load(f) + except (OSError, json.JSONDecodeError): + return "Unknown" + store_path = data.get("store_path") or "" + if store_path and not build_is_running(store_path): + running = running_system_store_path() + return _store_path_hash(running) if running else "Unknown" + version = data.get("version") + if version: + return version + return _store_path_hash(store_path) if store_path else "Unknown" + + debug_dump_dir = data_dir / "solver_debug_dumps" -comet_file = astro_data_dir / Path("comets.txt") +comet_file = data_dir / "comets.txt" + +# Logging-config presets ship read-only in the source tree; the user's active +# selection is persisted in the writable data dir (like config.json), stored as +# a bare filename so it survives upgrades (no immutable store path is baked in). +logconf_dir = pifinder_dir / "python" +_active_logconf_file = data_dir / "log_config" +DEFAULT_LOGCONF = "logconf_default.json" + + +def _valid_logconf_name(name: str) -> bool: + return ( + name.startswith("logconf_") + and name.endswith(".json") + and (logconf_dir / name).is_file() + ) + + +def active_logconf_name() -> str: + """Name of the active logging-config preset (defaults to logconf_default.json).""" + try: + name = _active_logconf_file.read_text().strip() + except OSError: + return DEFAULT_LOGCONF + return name if _valid_logconf_name(name) else DEFAULT_LOGCONF + + +def active_logconf_path() -> Path: + """Absolute path to the active logging-config file in the source tree.""" + return logconf_dir / active_logconf_name() + + +def available_logconfs() -> list: + """Sorted bare filenames of the available logconf_*.json presets.""" + return sorted(p.name for p in logconf_dir.glob("logconf_*.json")) + + +def set_active_logconf(name: str) -> None: + """Persist the chosen logging-config preset name to the writable data dir.""" + if not _valid_logconf_name(name): + raise ValueError(f"Invalid log config: {name}") + _active_logconf_file.parent.mkdir(parents=True, exist_ok=True) + _active_logconf_file.write_text(name + "\n") def create_dir(adir: str): @@ -167,23 +320,28 @@ def serialize_solution(solution) -> str: return json.dumps(out_dict) +_sys_utils_module = None + + def get_sys_utils(): - # Check if we should use fake sys_utils for local development - use_fake = os.environ.get("PIFINDER_USE_FAKE_SYS_UTILS", "").lower() in ( - "1", - "true", - "yes", - ) + global _sys_utils_module + if _sys_utils_module is not None: + return _sys_utils_module - if use_fake: - sys_utils = importlib.import_module("PiFinder.sys_utils_fake") - else: - try: - # Attempt to import the real sys_utils - sys_utils = importlib.import_module("PiFinder.sys_utils") - except ImportError: - sys_utils = importlib.import_module("PiFinder.sys_utils_fake") - return sys_utils + try: + _sys_utils_module = importlib.import_module("PiFinder.sys_utils") + except Exception as exc: + logger.info( + "Running without on-device system controls (%s). This is normal " + "on a desktop/dev machine: WiFi/AP/hostname/reboot options are " + "stubbed out, everything else works as usual. On the PiFinder " + "hardware these controls are available automatically.", + exc, + ) + logger.debug("PiFinder.sys_utils import failed", exc_info=True) + _sys_utils_module = importlib.import_module("PiFinder.sys_utils_fake") + + return _sys_utils_module def get_os_info(): diff --git a/python/locale/de/LC_MESSAGES/messages.mo b/python/locale/de/LC_MESSAGES/messages.mo index fd9551311..2007e769c 100644 Binary files a/python/locale/de/LC_MESSAGES/messages.mo and b/python/locale/de/LC_MESSAGES/messages.mo differ diff --git a/python/locale/de/LC_MESSAGES/messages.po b/python/locale/de/LC_MESSAGES/messages.po index 8f884b178..1c65b02dc 100644 --- a/python/locale/de/LC_MESSAGES/messages.po +++ b/python/locale/de/LC_MESSAGES/messages.po @@ -3126,6 +3126,20 @@ msgstr "Hochladen und wiederherstellen" msgid "Restore User Data" msgstr "Benutzerdaten wiederherstellen" +# AI-TRANSLATED (claude): needs human review +#: PiFinder/server.py:527 +msgid "" +"Network settings updated — no restart needed. This device is now " +"reachable at http://{host}.local. If you changed the host name, the " +"previous address stops working, so reconnect there." +msgstr "" +"Netzwerkeinstellungen aktualisiert – kein Neustart nötig. Dieses Gerät ist jetzt unter http://{host}.local erreichbar. Wenn Sie den Hostnamen geändert haben, funktioniert die vorherige Adresse nicht mehr – verbinden Sie sich dort neu." + +# AI-TRANSLATED (claude): needs human review +#: views/network.html:39 +msgid "Update" +msgstr "Aktualisieren" + # AI-TRANSLATED (claude): needs human review #: views/tools.html:93 msgid "" diff --git a/python/locale/es/LC_MESSAGES/messages.mo b/python/locale/es/LC_MESSAGES/messages.mo index a38731d7f..8c410a17b 100644 Binary files a/python/locale/es/LC_MESSAGES/messages.mo and b/python/locale/es/LC_MESSAGES/messages.mo differ diff --git a/python/locale/es/LC_MESSAGES/messages.po b/python/locale/es/LC_MESSAGES/messages.po index 4b1d2ebd9..26465a8cd 100644 --- a/python/locale/es/LC_MESSAGES/messages.po +++ b/python/locale/es/LC_MESSAGES/messages.po @@ -2449,6 +2449,20 @@ msgstr "ss" msgid "Enter Local Time" msgstr "Ingresar Hora Local" +# AI-TRANSLATED (claude): needs human review +#: PiFinder/server.py:527 +msgid "" +"Network settings updated — no restart needed. This device is now " +"reachable at http://{host}.local. If you changed the host name, the " +"previous address stops working, so reconnect there." +msgstr "" +"Configuración de red actualizada: no es necesario reiniciar. Este dispositivo ahora es accesible en http://{host}.local. Si cambió el nombre de host, la dirección anterior deja de funcionar; vuelva a conectarse allí." + +# AI-TRANSLATED (claude): needs human review +#: views/network.html:39 +msgid "Update" +msgstr "Actualizar" + # AI-TRANSLATED (claude): needs human review #: PiFinder/ui/menu_structure.py:626 msgid "Volume" diff --git a/python/locale/fr/LC_MESSAGES/messages.mo b/python/locale/fr/LC_MESSAGES/messages.mo index f7e1b5a91..c8785aede 100644 Binary files a/python/locale/fr/LC_MESSAGES/messages.mo and b/python/locale/fr/LC_MESSAGES/messages.mo differ diff --git a/python/locale/fr/LC_MESSAGES/messages.po b/python/locale/fr/LC_MESSAGES/messages.po index 0bc4aabe8..3a8f0b3c0 100644 --- a/python/locale/fr/LC_MESSAGES/messages.po +++ b/python/locale/fr/LC_MESSAGES/messages.po @@ -2524,6 +2524,20 @@ msgstr "ss" msgid "Enter Local Time" msgstr "Entrez heure locale" +# AI-TRANSLATED (claude): needs human review +#: PiFinder/server.py:527 +msgid "" +"Network settings updated — no restart needed. This device is now " +"reachable at http://{host}.local. If you changed the host name, the " +"previous address stops working, so reconnect there." +msgstr "" +"Paramètres réseau mis à jour — aucun redémarrage nécessaire. Cet appareil est maintenant accessible à l'adresse http://{host}.local. Si vous avez modifié le nom d'hôte, l'adresse précédente cesse de fonctionner ; reconnectez-vous à la nouvelle adresse." + +# AI-TRANSLATED (claude): needs human review +#: views/network.html:39 +msgid "Update" +msgstr "Mettre à jour" + # AI-TRANSLATED (claude): needs human review #: PiFinder/ui/menu_structure.py:626 msgid "Volume" diff --git a/python/locale/zh/LC_MESSAGES/messages.mo b/python/locale/zh/LC_MESSAGES/messages.mo index aa3dba964..a571df718 100644 Binary files a/python/locale/zh/LC_MESSAGES/messages.mo and b/python/locale/zh/LC_MESSAGES/messages.mo differ diff --git a/python/locale/zh/LC_MESSAGES/messages.po b/python/locale/zh/LC_MESSAGES/messages.po index 4e5e8c37a..9fde4cf23 100644 --- a/python/locale/zh/LC_MESSAGES/messages.po +++ b/python/locale/zh/LC_MESSAGES/messages.po @@ -2580,6 +2580,20 @@ msgstr "ss" msgid "Enter Local Time" msgstr "输入本地时间" +# AI-TRANSLATED (claude): needs human review +#: PiFinder/server.py:527 +msgid "" +"Network settings updated — no restart needed. This device is now " +"reachable at http://{host}.local. If you changed the host name, the " +"previous address stops working, so reconnect there." +msgstr "" +"网络设置已更新——无需重启。现在可通过 http://{host}.local 访问本设备。如果您更改了主机名,之前的地址将失效,请在新地址重新连接。" + +# AI-TRANSLATED (claude): needs human review +#: views/network.html:39 +msgid "Update" +msgstr "更新" + # AI-TRANSLATED (claude): needs human review #: PiFinder/ui/menu_structure.py:626 msgid "Volume" diff --git a/python/noxfile.py b/python/noxfile.py deleted file mode 100644 index 6166b3f93..000000000 --- a/python/noxfile.py +++ /dev/null @@ -1,143 +0,0 @@ -import nox - -nox.options.sessions = ["lint", "format", "type_hints", "smoke_tests"] - - -@nox.session(reuse_venv=True, python="3.9") -def lint(session: nox.Session) -> None: - """ - Lint the project's codebase. - - This session installs necessary dependencies for linting and then runs the linter to check for - stylistic errors and coding standards compliance across the project's codebase. - - Args: - session (nox.Session): The Nox session being run, providing context and methods for session actions. - """ - session.install("ruff==0.4.8") - session.run("ruff", "check", "--fix", "--config", "builtins=['_']") - - -@nox.session(reuse_venv=True, python="3.9") -def format(session: nox.Session) -> None: - """ - Format the project's codebase. - - This session installs necessary dependencies for code formatting and runs the formatter - to check (and optionally correct) the code format according to the project's style guide. - - Args: - session (nox.Session): The Nox session being run, providing context and methods for session actions. - """ - session.install("ruff==0.4.8") - session.run("ruff", "format") - - -@nox.session(reuse_venv=True, python="3.9") -def type_hints(session: nox.Session) -> None: - """ - Check type hints in the project's codebase. - - This session installs necessary dependencies for type checking and runs a static type checker - to validate the type hints throughout the project's codebase, ensuring they are correct and consistent. - - Args: - session (nox.Session): The Nox session being run, providing context and methods for session actions. - """ - session.install("-r", "requirements.txt") - session.install("-r", "requirements_dev.txt") - # First run populates the cache so --install-types knows what stubs are needed. - # success_codes=[0, 1] here is expected: missing-stub errors before stubs are - # installed. The second run (with stubs) must exit 0; real type errors fail CI. - # Targets PiFinder/ explicitly to avoid broken tetra3 symlink in the tree. - session.run("mypy", "PiFinder", success_codes=[0, 1]) - session.run("mypy", "--install-types", "--non-interactive", "PiFinder") - - -@nox.session(reuse_venv=True, python="3.9") -def unit_tests(session: nox.Session) -> None: - """ - Run the project's unit tests. - - This session installs the necessary dependencies and runs the project's unit tests. - It is focused on testing the functionality of individual units of code in isolation. - - Args: - session (nox.Session): The Nox session being run, providing context and methods for session actions. - """ - session.install("-r", "requirements.txt") - session.install("-r", "requirements_dev.txt") - session.run("pytest", "-m", "unit") - - -@nox.session(reuse_venv=True, python="3.9") -def web_tests(session: nox.Session) -> None: - """ - Run the project's test suite on the web interface. - - This session installs the necessary dependencies and tests the web interface using Selenium. - - Args: - session (nox.Session): The Nox session being run, providing context and methods for session actions. - """ - session.install("-r", "requirements.txt") - session.install("-r", "requirements_dev.txt") - session.run("pytest", "-m", "web") - - -@nox.session(reuse_venv=True, python="3.9") -def smoke_tests(session: nox.Session) -> None: - """ - Run the project's smoke tests. - nox - This session installs the necessary dependencies and runs a subset of tests designed to quickly - check the most important functions of the program, often as a prelude to more thorough testing. - - Args: - session (nox.Session): The Nox session being run, providing context and methods for session actions. - """ - session.install("-r", "requirements.txt") - session.install("-r", "requirements_dev.txt") - session.run("pytest", "-m", "smoke") - - -@nox.session(reuse_venv=True, python="3.9") -def ui_tests(session: nox.Session) -> None: - """ - Run the UI module smoke harness (tests/test_ui_modules.py). - - Constructs every UI screen through a real MenuManager and exercises its - key_* methods (crash-only smoke). Builds the real catalogs and, for - chart/align, may download hip_main.dat on first run. Heavier and more - network-dependent than the unit suite, so it lives in its own session. - - Args: - session (nox.Session): The Nox session being run, providing context and methods for session actions. - """ - session.install("-r", "requirements.txt") - session.install("-r", "requirements_dev.txt") - session.run("pytest", "-m", "integration", "tests/test_ui_modules.py") - - -@nox.session(reuse_venv=True, python="3.9") -def babel(session: nox.Session) -> None: - """ - Run the I18N toolchain - """ - session.install("-r", "requirements.txt") - session.install("-r", "requirements_dev.txt") - - session.run( - "pybabel", - "extract", - "-F", - "babel.cfg", - "-c", - "TRANSLATORS", - "-o", - "locale/messages.pot", - "./PiFinder", - "./views", - ) - session.run("pybabel", "update", "-i", "locale/messages.pot", "-d", "locale") - session.run("pybabel", "compile", "-d", "locale") diff --git a/python/pyproject.toml b/python/pyproject.toml index ad0f02e62..d90f917c2 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -1,4 +1,142 @@ +[project] +name = "pifinder" +version = "0.0.0" +description = "PiFinder runtime dependencies (resolved by uv, realized into the Nix store via uv2nix)" +requires-python = ">=3.13,<3.14" +dependencies = [ + # Scientific / astronomy core + "numpy", + "numpy-quaternion", + "pyerfa", + "scipy", + "scikit-learn", + "pillow", + "pandas", + "skyfield", + "timezonefinder", + "pytz", + # Plate solver (the `tetra3` import package). Pinned to a cedar-solve rev via + # [tool.uv.sources]; its stale numpy<2/Pillow<9 caps are relaxed in + # [tool.uv.dependency-metadata] so it resolves against the env's numpy 2.x. + "cedar-solve", + # Web / RPC + "grpcio", + "protobuf", + "flask", + "flask-babel", + "waitress", + "requests", + "pyjwt", + "aiofiles", + "json5", + "jsonschema", + "libarchive-c", + "tqdm", + # System / IPC bindings + "pygobject; platform_machine == 'aarch64'", # libnm bindings — device-only (dev uses sys_utils_fake) + "dbus-python; platform_machine == 'aarch64'", + "av", + "smbus2", + "spidev; platform_machine == 'aarch64'", + # sh 2.x changed the API; PiFinder targets the 1.x interface. + "sh>=1.14,<2", + "gpsdclient", + "dataclasses-json", + "pydeepskylog", + "python-pam; sys_platform == 'linux'", + # 0.3.0a0 (prerelease) is the version that builds on 3.13; its setup.py + # and .so lookups are patched in the uv2nix override (see uv-python.nix). + "python-libinput==0.3.0a0; platform_machine == 'aarch64'", + # Display + "luma-oled", + "luma-lcd", + # Hardware / camera + "rpi-gpio; platform_machine == 'aarch64'", + "rpi-hardware-pwm; platform_machine == 'aarch64'", + "adafruit-blinka; sys_platform == 'linux'", + "adafruit-circuitpython-bno055; sys_platform == 'linux'", + "adafruit-extended-bus; sys_platform == 'linux'", + "picamera2; platform_machine == 'aarch64'", + "pidng; sys_platform == 'linux'", + "simplejpeg", + "python-prctl; platform_machine == 'aarch64'", + "videodev2; sys_platform == 'linux'", +] + +[dependency-groups] +dev = [ + "pytest", + "mypy", + "luma-emulator", + # pyhotkey -> pynput -> evdev (sdist, kernel headers): only buildable where + # the uv2nix override supplies headers (the device). Dev keyboard input on + # x86 uses the pygame path instead (docs/adr/0004-pygame-keyboard...). + "pyhotkey; platform_machine == 'aarch64'", + "selenium", + # pandas reads the Steinicke .xls catalog through xlrd (test_steinicke_parsing). + "xlrd>=2.0.1", + # mypy type stubs (main tracks these in requirements_dev.txt; here they + # ride the uv dev group) + "types-pytz", + # pynput drags evdev (sdist, kernel headers) — keep it off x86 dev boxes + "pynput; platform_machine == 'aarch64'", + "types-pynput", + "types-requests", + "types-aiofiles", + "types-tqdm", + "pandas-stubs", + "types-waitress", +] + +[build-system] +requires = ["setuptools>=61"] +build-backend = "setuptools.build_meta" + +# Dependency-only (virtual) workspace — nothing here is installed into the env +# (the PiFinder source is deployed separately via pkgs/pifinder-src.nix). Declare +# an empty package set so uv2nix's build of the root produces an empty wheel +# instead of tripping setuptools flat-layout discovery on views/locale/PiFinder. +[tool.setuptools] +packages = [] + +[tool.uv] +# Dependency-only workspace: the PiFinder source itself is deployed separately +# (pkgs/pifinder-src.nix), so uv must not try to build/install this root project. +package = false +# Deployment + dev are both Linux (aarch64 Pi, x86_64 dev); keep the lock focused. +environments = ["sys_platform == 'linux'", "sys_platform == 'darwin'"] + +# Plate solver source: pinned cedar-solve rev (smroid upstream for now; point this +# at our fork here when we need to carry patches). +[tool.uv.sources] +cedar-solve = { git = "https://github.com/smroid/cedar-solve", rev = "d8ff1d857a363c88917fd8e126ab90e24b1cfbcc" } + +# python-libinput's setup.py imports the removed `imp` module, so uv cannot +# execute it to discover metadata. Declare it statically; the actual build is +# patched in the uv2nix override. +[[tool.uv.dependency-metadata]] +name = "python-libinput" +version = "0.3.0a0" +requires-dist = ["cffi"] + +# python-prctl's setup.py aborts without libcap headers present; it has no +# runtime Python deps. libcap is supplied by the uv2nix build override. +[[tool.uv.dependency-metadata]] +name = "python-prctl" +version = "1.8.1" +requires-dist = [] + +# cedar-solve's published metadata caps numpy<2 / Pillow<9, but those bounds are +# stale: it runs against the env's numpy 2.x / Pillow 12 (as it did when vendored +# as a git submodule). Override so uv resolves it without dragging the env back. +[[tool.uv.dependency-metadata]] +name = "cedar-solve" +version = "0.5.1" +requires-dist = ["numpy", "pillow", "scipy"] + [tool.ruff] +builtins = ["_"] + # Exclude a variety of commonly ignored directories. exclude = [ ".bzr", @@ -27,18 +165,14 @@ exclude = [ "node_modules", "site-packages", "venv", - "tetra3", ] # Same as Black. line-length = 88 indent-width = 4 -# Assume Python 3.9 -target-version = "py39" - -# _ is the i18n/gettext builtin injected at runtime -builtins = ["_"] +# Assume Python 3.13 +target-version = "py313" [tool.ruff.lint] # Enable preview mode, allow os.env changes before imports @@ -60,6 +194,7 @@ unfixable = [] dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" [tool.ruff.lint.per-file-ignores] +"*.ipynb" = ["E402", "F841"] "PiFinder/timez.py" = ["DTZ"] [tool.ruff.format] @@ -90,7 +225,7 @@ docstring-code-format = false docstring-code-line-length = "dynamic" [tool.mypy] -exclude = "venv|tetra3|conftest" +exclude = "venv|conftest" # Start off with these warn_unused_configs = true warn_redundant_casts = true @@ -123,28 +258,54 @@ extra_checks = true [[tool.mypy.overrides]] module = [ 'board', - 'adafruit_bno055', 'adafruit_bus_device.*', + 'adafruit_bno055', + 'adafruit_extended_bus', 'scipy.*', 'luma.*', 'skyfield.*', 'sh.*', 'sklearn.*', - 'pam.*', 'PyHotKey.*', - 'PiFinder.tetra3.*', - 'quaternion', - 'tetra3.*', 'grpc', 'ceder_detect_pb2', 'RPi.*', 'picamera2', 'bottle', 'libinput', + 'pytz', + 'aiofiles', + 'requests', + 'tqdm', + 'pandas', + 'rpi_hardware_pwm', + 'gpsdclient', + 'timezonefinder', + 'pydeepskylog.*', + 'dbus', + 'pam', + 'pam.*', + 'quaternion', + 'gi', + 'gi.*', + 'pynput.*', + 'waitress', + 'google.*', + 'cedar_detect_pb2', + 'cedar_detect_pb2_grpc', ] ignore_missing_imports = true ignore_errors = true +# tetra3 / cedar-solve is an external (untyped) dependency. Treat it as opaque: +# skip following its imports so mypy never analyses it or its transitive deps +# (protobuf, grpc stubs, …). Without this, `mypy --install-types` tries to +# pip-install those stubs, which fails in the pip-less Nix dev env. +[[tool.mypy.overrides]] +module = ['tetra3', 'tetra3.*'] +follow_imports = "skip" +ignore_missing_imports = true + [tool.pytest.ini_options] pythonpath = ["."] testpaths = [ diff --git a/python/requirements.txt b/python/requirements.txt deleted file mode 100644 index 796057bdf..000000000 --- a/python/requirements.txt +++ /dev/null @@ -1,32 +0,0 @@ -adafruit-blinka==8.12.0 -adafruit-circuitpython-bno055 -cheroot==10.0.0 -Flask==3.0.3 -flask-babel==4.0.0 -waitress==3.0.1 -dataclasses_json==0.6.7 -gpsdclient==1.3.2 -grpcio==1.64.1 -json5==0.9.25 -luma.oled==3.12.0 -luma.lcd==2.11.0 -numpy==1.26.4 -numpy-quaternion==2023.0.4 -pam==0.2.0 -pandas==2.0.3 -pillow==10.4.0 -pydeepskylog==1.6 -pyerfa==2.0.1.5 -pyjwt==2.8.0 -python-libinput==0.3.0a0 -pytz==2022.7.1 -requests==2.28.2 -rpi-hardware-pwm==0.1.4 -scipy -scikit-learn==1.2.2 -sh==1.14.3 -skyfield==1.45 -timezonefinder==6.1.9 -tqdm==4.65.0 -protobuf==4.25.2 -aiofiles==24.1.0 diff --git a/python/requirements_dev.txt b/python/requirements_dev.txt deleted file mode 100644 index 7e864ae70..000000000 --- a/python/requirements_dev.txt +++ /dev/null @@ -1,24 +0,0 @@ -# dev requirements -luma.emulator==1.5.0 -PyHotKey==1.5.2 -ruff==0.4.8 -nox==2024.4.15 -mypy==1.10.0 -pytest==8.2.2 -pygame==2.6.1 -pre-commit==3.7.1 -Babel==2.16.0 -xlrd==2.0.2 -selenium==4.15.0 -types-pytz==2022.7.1 -pynput -types-pynput -types-requests==2.28.2 -types-aiofiles -types-tqdm==4.65.0 -pandas-stubs -types-waitress -# Test-only: drift guard for the .pifinder JSON Schema (test_pifinder_schema.py) -jsonschema==4.23.0 -# Pin to avoid pyobjc 12.0 which has macOS 15 build issues -pyobjc-framework-Quartz==11.1; sys_platform == "darwin" diff --git a/python/scripts/migration_progress b/python/scripts/migration_progress deleted file mode 100755 index 4d87f1758..000000000 Binary files a/python/scripts/migration_progress and /dev/null differ diff --git a/python/scripts/migration_progress.c b/python/scripts/migration_progress.c deleted file mode 100644 index 3b0a37319..000000000 --- a/python/scripts/migration_progress.c +++ /dev/null @@ -1,579 +0,0 @@ -/* - * migration_progress - OLED progress display for PiFinder initramfs - * - * Drives supported SPI OLED displays to show migration progress. - * Designed to be statically compiled and included in the initramfs. - * - * Usage: migration_progress - * percent: 0-100 - * message: status text (max ~20 chars fits on screen) - * - * Examples: - * migration_progress 0 1 22 "Starting..." - * migration_progress 45 10 22 "Moving data" - * migration_progress 100 22 22 "Complete!" - * - * Hardware: SPI0.0, DC=GPIO24, RST=GPIO25, BGR565 - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MAX_WIDTH 176 -#define MAX_HEIGHT 176 -#define SPI_DEVICE "/dev/spidev0.0" -#define SPI_SPEED 40000000 -#define GPIO_DC 24 -#define GPIO_RST 25 - -/* BGR565 colors */ -#define COL_BLACK 0x0000 -#define COL_WHITE 0xFFFF -#define COL_RED 0x001F /* BGR565: blue=0, green=0, red=31 */ -#define COL_GREEN 0x07E0 -#define COL_DKGRAY 0x4208 -#define COL_DKRED 0x0010 - -static int spi_fd = -1; -static int gpio_fd = -1; -static struct gpio_v2_line_request dc_req; -static struct gpio_v2_line_request rst_req; -static uint16_t framebuf[MAX_WIDTH * MAX_HEIGHT]; - -enum oled_controller { - CTRL_SSD1351, - CTRL_SSD1333, -}; - -static enum oled_controller controller = CTRL_SSD1351; -static int display_width = 128; -static int display_height = 128; - -/* 5x7 bitmap font - ASCII 32-126 */ -static const uint8_t font5x7[][5] = { - {0x00,0x00,0x00,0x00,0x00}, /* space */ - {0x00,0x00,0x5F,0x00,0x00}, /* ! */ - {0x00,0x07,0x00,0x07,0x00}, /* " */ - {0x14,0x7F,0x14,0x7F,0x14}, /* # */ - {0x24,0x2A,0x7F,0x2A,0x12}, /* $ */ - {0x23,0x13,0x08,0x64,0x62}, /* % */ - {0x36,0x49,0x55,0x22,0x50}, /* & */ - {0x00,0x05,0x03,0x00,0x00}, /* ' */ - {0x00,0x1C,0x22,0x41,0x00}, /* ( */ - {0x00,0x41,0x22,0x1C,0x00}, /* ) */ - {0x08,0x2A,0x1C,0x2A,0x08}, /* * */ - {0x08,0x08,0x3E,0x08,0x08}, /* + */ - {0x00,0x50,0x30,0x00,0x00}, /* , */ - {0x08,0x08,0x08,0x08,0x08}, /* - */ - {0x00,0x60,0x60,0x00,0x00}, /* . */ - {0x20,0x10,0x08,0x04,0x02}, /* / */ - {0x3E,0x51,0x49,0x45,0x3E}, /* 0 */ - {0x00,0x42,0x7F,0x40,0x00}, /* 1 */ - {0x42,0x61,0x51,0x49,0x46}, /* 2 */ - {0x21,0x41,0x45,0x4B,0x31}, /* 3 */ - {0x18,0x14,0x12,0x7F,0x10}, /* 4 */ - {0x27,0x45,0x45,0x45,0x39}, /* 5 */ - {0x3C,0x4A,0x49,0x49,0x30}, /* 6 */ - {0x01,0x71,0x09,0x05,0x03}, /* 7 */ - {0x36,0x49,0x49,0x49,0x36}, /* 8 */ - {0x06,0x49,0x49,0x29,0x1E}, /* 9 */ - {0x00,0x36,0x36,0x00,0x00}, /* : */ - {0x00,0x56,0x36,0x00,0x00}, /* ; */ - {0x00,0x08,0x14,0x22,0x41}, /* < */ - {0x14,0x14,0x14,0x14,0x14}, /* = */ - {0x41,0x22,0x14,0x08,0x00}, /* > */ - {0x02,0x01,0x51,0x09,0x06}, /* ? */ - {0x32,0x49,0x79,0x41,0x3E}, /* @ */ - {0x7E,0x11,0x11,0x11,0x7E}, /* A */ - {0x7F,0x49,0x49,0x49,0x36}, /* B */ - {0x3E,0x41,0x41,0x41,0x22}, /* C */ - {0x7F,0x41,0x41,0x22,0x1C}, /* D */ - {0x7F,0x49,0x49,0x49,0x41}, /* E */ - {0x7F,0x09,0x09,0x01,0x01}, /* F */ - {0x3E,0x41,0x41,0x51,0x32}, /* G */ - {0x7F,0x08,0x08,0x08,0x7F}, /* H */ - {0x00,0x41,0x7F,0x41,0x00}, /* I */ - {0x20,0x40,0x41,0x3F,0x01}, /* J */ - {0x7F,0x08,0x14,0x22,0x41}, /* K */ - {0x7F,0x40,0x40,0x40,0x40}, /* L */ - {0x7F,0x02,0x04,0x02,0x7F}, /* M */ - {0x7F,0x04,0x08,0x10,0x7F}, /* N */ - {0x3E,0x41,0x41,0x41,0x3E}, /* O */ - {0x7F,0x09,0x09,0x09,0x06}, /* P */ - {0x3E,0x41,0x51,0x21,0x5E}, /* Q */ - {0x7F,0x09,0x19,0x29,0x46}, /* R */ - {0x46,0x49,0x49,0x49,0x31}, /* S */ - {0x01,0x01,0x7F,0x01,0x01}, /* T */ - {0x3F,0x40,0x40,0x40,0x3F}, /* U */ - {0x1F,0x20,0x40,0x20,0x1F}, /* V */ - {0x7F,0x20,0x18,0x20,0x7F}, /* W */ - {0x63,0x14,0x08,0x14,0x63}, /* X */ - {0x03,0x04,0x78,0x04,0x03}, /* Y */ - {0x61,0x51,0x49,0x45,0x43}, /* Z */ - {0x00,0x00,0x7F,0x41,0x41}, /* [ */ - {0x02,0x04,0x08,0x10,0x20}, /* \ */ - {0x41,0x41,0x7F,0x00,0x00}, /* ] */ - {0x04,0x02,0x01,0x02,0x04}, /* ^ */ - {0x40,0x40,0x40,0x40,0x40}, /* _ */ - {0x00,0x01,0x02,0x04,0x00}, /* ` */ - {0x20,0x54,0x54,0x54,0x78}, /* a */ - {0x7F,0x48,0x44,0x44,0x38}, /* b */ - {0x38,0x44,0x44,0x44,0x20}, /* c */ - {0x38,0x44,0x44,0x48,0x7F}, /* d */ - {0x38,0x54,0x54,0x54,0x18}, /* e */ - {0x08,0x7E,0x09,0x01,0x02}, /* f */ - {0x08,0x14,0x54,0x54,0x3C}, /* g */ - {0x7F,0x08,0x04,0x04,0x78}, /* h */ - {0x00,0x44,0x7D,0x40,0x00}, /* i */ - {0x20,0x40,0x44,0x3D,0x00}, /* j */ - {0x00,0x7F,0x10,0x28,0x44}, /* k */ - {0x00,0x41,0x7F,0x40,0x00}, /* l */ - {0x7C,0x04,0x18,0x04,0x78}, /* m */ - {0x7C,0x08,0x04,0x04,0x78}, /* n */ - {0x38,0x44,0x44,0x44,0x38}, /* o */ - {0x7C,0x14,0x14,0x14,0x08}, /* p */ - {0x08,0x14,0x14,0x18,0x7C}, /* q */ - {0x7C,0x08,0x04,0x04,0x08}, /* r */ - {0x48,0x54,0x54,0x54,0x20}, /* s */ - {0x04,0x3F,0x44,0x40,0x20}, /* t */ - {0x3C,0x40,0x40,0x20,0x7C}, /* u */ - {0x1C,0x20,0x40,0x20,0x1C}, /* v */ - {0x3C,0x40,0x30,0x40,0x3C}, /* w */ - {0x44,0x28,0x10,0x28,0x44}, /* x */ - {0x0C,0x50,0x50,0x50,0x3C}, /* y */ - {0x44,0x64,0x54,0x4C,0x44}, /* z */ - {0x00,0x08,0x36,0x41,0x00}, /* { */ - {0x00,0x00,0x7F,0x00,0x00}, /* | */ - {0x00,0x41,0x36,0x08,0x00}, /* } */ - {0x08,0x08,0x2A,0x1C,0x08}, /* ~ */ -}; - -static void msleep(int ms) -{ - struct timespec ts = { .tv_sec = ms / 1000, .tv_nsec = (ms % 1000) * 1000000L }; - nanosleep(&ts, NULL); -} - -static int gpio_request_line(int chip_fd, int pin, struct gpio_v2_line_request *req) -{ - struct gpio_v2_line_request r = {0}; - r.offsets[0] = pin; - r.num_lines = 1; - r.config.flags = GPIO_V2_LINE_FLAG_OUTPUT; - snprintf(r.consumer, sizeof(r.consumer), "migration"); - - if (ioctl(chip_fd, GPIO_V2_GET_LINE_IOCTL, &r) < 0) { - perror("GPIO_V2_GET_LINE_IOCTL"); - return -1; - } - *req = r; - return 0; -} - -static void gpio_set(struct gpio_v2_line_request *req, int value) -{ - struct gpio_v2_line_values vals = {0}; - vals.bits = value ? 1 : 0; - vals.mask = 1; - ioctl(req->fd, GPIO_V2_LINE_SET_VALUES_IOCTL, &vals); -} - -static void spi_write(const uint8_t *data, size_t len) -{ - /* Chunk large transfers - SPI driver may limit to 4KB */ - const size_t chunk_size = 4096; - while (len > 0) { - size_t this_len = len > chunk_size ? chunk_size : len; - struct spi_ioc_transfer tr = {0}; - tr.tx_buf = (unsigned long)data; - tr.len = this_len; - tr.speed_hz = SPI_SPEED; - tr.bits_per_word = 8; - ioctl(spi_fd, SPI_IOC_MESSAGE(1), &tr); - data += this_len; - len -= this_len; - } -} - -static void oled_cmd(uint8_t cmd) -{ - gpio_set(&dc_req, 0); - spi_write(&cmd, 1); -} - -static void oled_data(const uint8_t *data, size_t len) -{ - gpio_set(&dc_req, 1); - spi_write(data, len); -} - -static void oled_cmd_data(uint8_t cmd, uint8_t data) -{ - oled_cmd(cmd); - oled_data(&data, 1); -} - -static int display_on = 0; - -static void detect_display(void) -{ - const char *display_class = getenv("MIGRATION_DISPLAY_CLASS"); - const char *display_resolution = getenv("MIGRATION_DISPLAY_RESOLUTION"); - - controller = CTRL_SSD1351; - display_width = 128; - display_height = 128; - - if (display_class && strstr(display_class, "SSD1333")) { - controller = CTRL_SSD1333; - display_width = 176; - display_height = 176; - return; - } - - if (display_resolution && strcmp(display_resolution, "176x176") == 0) { - controller = CTRL_SSD1333; - display_width = 176; - display_height = 176; - } -} - -static void oled_reset(void) -{ - gpio_set(&rst_req, 1); - msleep(10); - gpio_set(&rst_req, 0); - msleep(10); - gpio_set(&rst_req, 1); - msleep(10); -} - -static void oled_common_init(int mux_ratio, uint8_t remap) -{ - oled_reset(); - - /* SSD13xx 65k-color OLED setup. */ - oled_cmd_data(0xFD, 0x12); /* Unlock */ - oled_cmd_data(0xFD, 0xB1); /* Unlock commands */ - - oled_cmd(0xAE); /* Display off */ - oled_cmd_data(0xB3, 0xF1); /* Clock divider */ - oled_cmd_data(0xCA, (uint8_t)mux_ratio); /* Mux ratio */ - - oled_cmd(0x15); /* Column address */ - uint8_t col[2] = {0x00, (uint8_t)(display_width - 1)}; - oled_data(col, 2); - - oled_cmd(0x75); /* Row address */ - uint8_t row[2] = {0x00, (uint8_t)(display_height - 1)}; - oled_data(row, 2); - - oled_cmd_data(0xA0, remap); /* Remap/color depth */ - oled_cmd_data(0xA1, 0x00); /* Start line */ - oled_cmd_data(0xA2, 0x00); /* Display offset */ - oled_cmd_data(0xB5, 0x00); /* GPIO */ - oled_cmd_data(0xAB, 0x01); /* Function select */ - oled_cmd_data(0xB1, 0x32); /* Precharge */ - - oled_cmd(0xB4); /* VSL */ - uint8_t vsl[3] = {0xA0, 0xB5, 0x55}; - oled_data(vsl, 3); - - oled_cmd_data(0xBE, 0x05); /* VCOMH */ - oled_cmd_data(0xC7, 0x0F); /* Master contrast */ - oled_cmd_data(0xB6, 0x01); /* Precharge2 */ - oled_cmd(0xA6); /* Normal display */ - - /* Display ON (0xAF) happens after first framebuffer flush. */ -} - -static void oled_init(void) -{ - if (controller == CTRL_SSD1333) - oled_common_init(0xAF, 0x74); - else - oled_common_init(0x7F, 0x74); -} - -static void oled_flush(void) -{ - /* Set contrast before first frame (matching luma) */ - if (!display_on) { - oled_cmd(0xC1); /* Contrast */ - uint8_t contrast[3] = {0xFF, 0xFF, 0xFF}; - oled_data(contrast, 3); - } - - oled_cmd(0x15); - uint8_t col[2] = {0x00, (uint8_t)(display_width - 1)}; - oled_data(col, 2); - - oled_cmd(0x75); - uint8_t row[2] = {0x00, (uint8_t)(display_height - 1)}; - oled_data(row, 2); - - oled_cmd(0x5C); /* Write RAM */ - - /* Send framebuffer as big-endian 16-bit pixels */ - uint8_t buf[MAX_WIDTH * MAX_HEIGHT * 2]; - int pixels = display_width * display_height; - for (int i = 0; i < pixels; i++) { - buf[i * 2] = framebuf[i] >> 8; - buf[i * 2 + 1] = framebuf[i] & 0xFF; - } - oled_data(buf, (size_t)pixels * 2); - - /* Turn display on after first frame */ - if (!display_on) { - oled_cmd(0xAF); /* Display on */ - display_on = 1; - } -} - -static void fb_clear(uint16_t color) -{ - for (int i = 0; i < display_width * display_height; i++) - framebuf[i] = color; -} - -static void fb_pixel(int x, int y, uint16_t color) -{ - if (x >= 0 && x < display_width && y >= 0 && y < display_height) - framebuf[y * display_width + x] = color; -} - -static void fb_rect(int x, int y, int w, int h, uint16_t color) -{ - for (int j = y; j < y + h && j < display_height; j++) - for (int i = x; i < x + w && i < display_width; i++) - fb_pixel(i, j, color); -} - -static void fb_char(int x, int y, char c, uint16_t color, int scale) -{ - if (c < 32 || c > 126) - c = '?'; - const uint8_t *glyph = font5x7[c - 32]; - for (int col = 0; col < 5; col++) { - uint8_t bits = glyph[col]; - for (int row = 0; row < 7; row++) { - if (bits & (1 << row)) { - for (int sy = 0; sy < scale; sy++) - for (int sx = 0; sx < scale; sx++) - fb_pixel(x + col * scale + sx, - y + row * scale + sy, color); - } - } - } -} - -static void fb_string(int x, int y, const char *s, uint16_t color, int scale) -{ - int cx = x; - while (*s) { - fb_char(cx, y, *s, color, scale); - cx += 6 * scale; /* 5px char + 1px gap */ - s++; - } -} - -/* Center a string horizontally */ -static void fb_string_centered(int y, const char *s, uint16_t color, int scale) -{ - int len = strlen(s); - int px_width = len * 6 * scale - scale; /* subtract trailing gap */ - int x = (display_width - px_width) / 2; - if (x < 0) x = 0; - fb_string(x, y, s, color, scale); -} - -/* Center a string, shrinking the scale (and finally truncating) so it always - * fits the display width. Used for the variable-length stage name. */ -static void fb_string_centered_fit(int y, const char *s, uint16_t color, int max_scale) -{ - int len = strlen(s); - for (int scale = max_scale; scale >= 1; scale--) { - if (len * 6 * scale - scale <= display_width) { - fb_string_centered(y, s, color, scale); - return; - } - } - /* Too long even at scale 1: render a head that fits. */ - int max_chars = (display_width + 1) / 6; - char buf[64]; - if (max_chars > (int)sizeof(buf) - 1) - max_chars = (int)sizeof(buf) - 1; - int n = len < max_chars ? len : max_chars; - memcpy(buf, s, (size_t)n); - buf[n] = '\0'; - fb_string_centered(y, buf, color, 1); -} - -static void draw_progress(int percent, const char *stage, int stage_num, int stage_total) -{ - if (percent < 0) percent = 0; - if (percent > 100) percent = 100; - - fb_clear(COL_BLACK); - - int scale = display_width >= 160 ? 2 : 1; - int margin = display_width >= 160 ? 14 : 10; - int banner_h = display_width >= 160 ? 18 : 12; - int title_y = display_width >= 160 ? 28 : 18; - int subtitle_y = display_width >= 160 ? 55 : 38; - int stage_y = display_width >= 160 ? 76 : 52; - int bar_y = display_width >= 160 ? 94 : 65; - int pct_y = display_width >= 160 ? 116 : 82; - int stage_name_y = display_width >= 160 ? 145 : 105; - int wait_y = display_height - (8 * scale); - - /* Warning banner at top: solid bright bar with black text for contrast */ - fb_rect(0, 0, display_width, banner_h, COL_RED); - fb_string_centered(3, "DO NOT POWER OFF", COL_BLACK, scale); - - /* Title */ - fb_string_centered(title_y, "NixOS", COL_RED, 2); - fb_string_centered(subtitle_y, "Migration", COL_RED, scale); - - /* Stage indicator (e.g., "3/7") */ - if (stage_total > 0) { - char stage_str[32]; - snprintf(stage_str, sizeof(stage_str), "Stage %d/%d", stage_num, stage_total); - fb_string_centered(stage_y, stage_str, COL_DKGRAY, scale); - } - - /* Progress bar */ - int bar_x = margin; - int bar_w = display_width - (margin * 2); - int bar_h = display_width >= 160 ? 16 : 12; - - /* Border */ - fb_rect(bar_x, bar_y, bar_w, 1, COL_DKGRAY); - fb_rect(bar_x, bar_y + bar_h - 1, bar_w, 1, COL_DKGRAY); - fb_rect(bar_x, bar_y, 1, bar_h, COL_DKGRAY); - fb_rect(bar_x + bar_w - 1, bar_y, 1, bar_h, COL_DKGRAY); - - /* Fill */ - int fill_w = (bar_w - 4) * percent / 100; - if (fill_w > 0) - fb_rect(bar_x + 2, bar_y + 2, fill_w, bar_h - 4, COL_RED); - - /* Dark red background for unfilled */ - int unfill_x = bar_x + 2 + fill_w; - int unfill_w = (bar_w - 4) - fill_w; - if (unfill_w > 0) - fb_rect(unfill_x, bar_y + 2, unfill_w, bar_h - 4, COL_DKRED); - - /* Percentage */ - char pct_str[8]; - snprintf(pct_str, sizeof(pct_str), "%d%%", percent); - fb_string_centered(pct_y, pct_str, COL_RED, 2); - - /* Current stage name */ - if (stage && *stage) - fb_string_centered_fit(stage_name_y, stage, COL_RED, scale); - - /* Bottom warning */ - fb_string_centered(wait_y, "Please wait...", COL_DKGRAY, scale); - - oled_flush(); -} - -static int hw_init(void) -{ - /* Open SPI */ - spi_fd = open(SPI_DEVICE, O_RDWR); - if (spi_fd < 0) { - perror("open spi"); - return -1; - } - - uint8_t mode = SPI_MODE_0; - uint8_t bits = 8; - uint32_t speed = SPI_SPEED; - ioctl(spi_fd, SPI_IOC_WR_MODE, &mode); - ioctl(spi_fd, SPI_IOC_WR_BITS_PER_WORD, &bits); - ioctl(spi_fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed); - - /* Open GPIO chip */ - gpio_fd = open("/dev/gpiochip0", O_RDWR); - if (gpio_fd < 0) { - perror("open gpiochip0"); - return -1; - } - - if (gpio_request_line(gpio_fd, GPIO_DC, &dc_req) < 0) - return -1; - if (gpio_request_line(gpio_fd, GPIO_RST, &rst_req) < 0) - return -1; - - detect_display(); - oled_init(); - return 0; -} - -static void hw_cleanup(void) -{ - if (dc_req.fd > 0) close(dc_req.fd); - if (rst_req.fd > 0) close(rst_req.fd); - if (gpio_fd >= 0) close(gpio_fd); - if (spi_fd >= 0) close(spi_fd); -} - -/* Persistent mode: initialise the panel once, then redraw in place for each - * " " line read from stdin. - * Because the panel is never reset between frames, the display updates without - * blanking to black. Returns on EOF (writer closed). */ -static void serve_loop(void) -{ - char line[256]; - while (fgets(line, sizeof(line), stdin)) { - int percent = 0, stage_num = 0, stage_total = 0, name_off = 0; - if (sscanf(line, "%d %d %d %n", &percent, &stage_num, &stage_total, - &name_off) < 3) - continue; - char *name = line + name_off; - size_t len = strlen(name); - while (len > 0 && (name[len - 1] == '\n' || name[len - 1] == '\r')) - name[--len] = '\0'; - draw_progress(percent, name, stage_num, stage_total); - } -} - -int main(int argc, char *argv[]) -{ - int serve = (argc >= 2 && strcmp(argv[1], "--serve") == 0); - - if (!serve && argc < 5) { - fprintf(stderr, "Usage: %s --serve\n", argv[0]); - fprintf(stderr, " read ' '\n"); - fprintf(stderr, " lines from stdin and redraw in place (no flicker)\n"); - fprintf(stderr, " or: %s \n", argv[0]); - fprintf(stderr, " draw a single frame and exit\n"); - fprintf(stderr, "\nExample: %s 50 3 7 'Extracting system'\n", argv[0]); - return 1; - } - - if (hw_init() < 0) { - fprintf(stderr, "Hardware init failed\n"); - hw_cleanup(); - return 1; - } - - if (serve) { - serve_loop(); - } else { - draw_progress(atoi(argv[1]), argv[4], atoi(argv[2]), atoi(argv[3])); - } - - hw_cleanup(); - return 0; -} diff --git a/python/scripts/nixos_migration_calc.py b/python/scripts/nixos_migration_calc.py deleted file mode 100755 index d3500bdc7..000000000 --- a/python/scripts/nixos_migration_calc.py +++ /dev/null @@ -1,243 +0,0 @@ -#!/usr/bin/env python3 -""" -Pre-flight checks for NixOS migration. - -Validates hardware requirements before migration can proceed. -Run on the Pi to verify it meets minimum specs. - -Usage: python3 nixos_migration_calc.py [--json] --display-class CLASS --display-resolution WxH -""" - -import argparse -import json -import platform -import re -import shutil -import subprocess -import sys -from pathlib import Path - -MIN_RAM_MB = 1800 # 2GB Pi reports ~1849MB due to GPU memory reservation -MIN_SD_GB = 16 -REQUIRED_MODEL = "Raspberry Pi 4" -# Must match the initramfs progress renderer, not just the main PiFinder UI. -SUPPORTED_DISPLAYS = { - "DisplaySSD1351": "128x128", - "DisplaySSD1333": "176x176", -} -# The initramfs script hardcodes these paths and unconditionally extends -# partition 2 to fill the disk. Migration only supports the stock layout. -SD_DISK = "/dev/mmcblk0" -EXPECTED_BOOT = "/dev/mmcblk0p1" -EXPECTED_ROOT = "/dev/mmcblk0p2" -EXPECTED_PARTITION_COUNT = 2 - - -def get_model() -> str: - """Read Pi model from device-tree.""" - try: - return Path("/proc/device-tree/model").read_text().rstrip("\x00").strip() - except OSError: - return "Unknown" - - -def get_ram_mb() -> int: - """Get total RAM in MB from /proc/meminfo.""" - try: - text = Path("/proc/meminfo").read_text() - match = re.search(r"MemTotal:\s+(\d+)\s+kB", text) - if match: - return int(match.group(1)) // 1024 - except OSError: - pass - return 0 - - -def get_sd_size_gb() -> float: - """Get SD card size in GB (root device).""" - try: - result = subprocess.run( - ["lsblk", "-b", "-d", "-n", "-o", "SIZE", "/dev/mmcblk0"], - capture_output=True, - text=True, - ) - if result.returncode == 0: - return int(result.stdout.strip()) / (1024**3) - except (OSError, ValueError): - pass - return 0.0 - - -def get_free_space_gb(path: str = "/home/pifinder") -> float: - """Get free space in GB at the given path.""" - try: - usage = shutil.disk_usage(path) - return usage.free / (1024**3) - except OSError: - return 0.0 - - -def get_root_source() -> str: - """Device backing the / mount, e.g. /dev/mmcblk0p2.""" - try: - result = subprocess.run( - ["findmnt", "-no", "SOURCE", "/"], - capture_output=True, - text=True, - ) - if result.returncode == 0: - return result.stdout.strip() - except OSError: - pass - return "" - - -def get_partition_count(disk: str = SD_DISK) -> int: - """Number of partitions on the SD disk node (excludes the disk itself).""" - try: - result = subprocess.run( - ["lsblk", "-no", "NAME", "-l", disk], - capture_output=True, - text=True, - ) - if result.returncode != 0: - return 0 - lines = [line for line in result.stdout.splitlines() if line.strip()] - return max(len(lines) - 1, 0) - except OSError: - return 0 - - -def get_wifi_mode() -> str: - """Detect WiFi mode.""" - wifi_status = Path("/home/pifinder/PiFinder/wifi_status.txt") - try: - return wifi_status.read_text().strip() - except OSError: - return "Unknown" - - -def normalize_resolution(value: str) -> str: - """Normalize a live UI resolution string to WIDTHxHEIGHT.""" - match = re.fullmatch(r"\s*(\d+)\s*[x,]\s*(\d+)\s*", value) - if not match: - return value.strip() - return f"{int(match.group(1))}x{int(match.group(2))}" - - -def is_pi4() -> bool: - """Check if running on a Raspberry Pi 4.""" - model = get_model() - return REQUIRED_MODEL in model - - -def check_all(display_class: str = "", display_resolution: str = "") -> dict: - """Run all pre-flight checks. Returns dict with results.""" - model = get_model() - ram_mb = get_ram_mb() - sd_gb = get_sd_size_gb() - free_gb = get_free_space_gb() - wifi = get_wifi_mode() - display_class = display_class.strip() or "Unknown" - display_resolution = normalize_resolution(display_resolution) or "Unknown" - display_ok = SUPPORTED_DISPLAYS.get(display_class) == display_resolution - display_ok = display_ok or ( - "SSD1333" in display_class and display_resolution == "176x176" - ) - root_source = get_root_source() - partition_count = get_partition_count() - boot_present = Path(EXPECTED_BOOT).is_block_device() - layout_ok = ( - root_source == EXPECTED_ROOT - and boot_present - and partition_count == EXPECTED_PARTITION_COUNT - ) - - checks = { - "model": model, - "is_pi4": REQUIRED_MODEL in model, - "ram_mb": ram_mb, - "ram_ok": ram_mb >= MIN_RAM_MB, - "sd_gb": round(sd_gb, 1), - "sd_ok": sd_gb >= MIN_SD_GB, - "free_gb": round(free_gb, 1), - "free_ok": free_gb >= 1.5, - "wifi_mode": wifi, - "wifi_ok": wifi == "Client", - "display_class": display_class, - "display_resolution": display_resolution, - "display_ok": display_ok, - "root_source": root_source, - "partition_count": partition_count, - "boot_present": boot_present, - "layout_ok": layout_ok, - "arch": platform.machine(), - } - checks["all_ok"] = all( - [ - checks["is_pi4"], - checks["ram_ok"], - checks["sd_ok"], - checks["free_ok"], - checks["wifi_ok"], - checks["display_ok"], - checks["layout_ok"], - ] - ) - return checks - - -def main(): - parser = argparse.ArgumentParser(description="NixOS migration pre-flight checks") - parser.add_argument("--json", action="store_true", help="Output as JSON") - parser.add_argument( - "--display-class", - default="", - help="Live PiFinder display class name from the running UI", - ) - parser.add_argument( - "--display-resolution", - default="", - help="Live PiFinder logical display resolution as WIDTHxHEIGHT", - ) - args = parser.parse_args() - - checks = check_all(args.display_class, args.display_resolution) - - if args.json: - print(json.dumps(checks, indent=2)) - sys.exit(0 if checks["all_ok"] else 1) - - print(f"Model: {checks['model']}") - print(f" Pi 4: {'OK' if checks['is_pi4'] else 'FAIL'}") - print(f"RAM: {checks['ram_mb']} MB") - print(f" >= {MIN_RAM_MB}MB: {'OK' if checks['ram_ok'] else 'FAIL'}") - print(f"SD Card: {checks['sd_gb']} GB") - print(f" >= {MIN_SD_GB}GB: {'OK' if checks['sd_ok'] else 'FAIL'}") - print(f"Free Space: {checks['free_gb']} GB") - print(f" >= 1.5GB: {'OK' if checks['free_ok'] else 'FAIL'}") - print(f"WiFi Mode: {checks['wifi_mode']}") - print(f" Client: {'OK' if checks['wifi_ok'] else 'FAIL'}") - print(f"Display: {checks['display_class']} {checks['display_resolution']}") - print( - f" initramfs renderer supported: " - f"{'OK' if checks['display_ok'] else 'FAIL'}" - ) - print(f"Root: {checks['root_source'] or 'Unknown'}") - print(f"Partitions: {checks['partition_count']} on {SD_DISK}") - print( - f" stock SD layout ({EXPECTED_BOOT} + {EXPECTED_ROOT}, 2 partitions): " - f"{'OK' if checks['layout_ok'] else 'FAIL'}" - ) - print(f"Arch: {checks['arch']}") - print() - if checks["all_ok"]: - print("All checks PASSED - migration can proceed") - else: - print("Some checks FAILED - migration cannot proceed") - - sys.exit(0 if checks["all_ok"] else 1) - - -if __name__ == "__main__": - main() diff --git a/python/tests/test_build_identity.py b/python/tests/test_build_identity.py new file mode 100644 index 000000000..7ec10f702 --- /dev/null +++ b/python/tests/test_build_identity.py @@ -0,0 +1,110 @@ +import json +import os + +import pytest + +from PiFinder import utils + + +def _write_build(tmp_path, monkeypatch, **fields): + f = tmp_path / "current-build.json" + f.write_text(json.dumps(fields)) + monkeypatch.setattr(utils, "current_build_json", f) + return f + + +def _fake_running(monkeypatch, store_path): + """Pretend the booted system resolves to store_path (None = off-device).""" + monkeypatch.setattr(utils, "running_system_store_path", lambda: store_path) + + +@pytest.mark.unit +class TestGetVersion: + def test_missing_file_is_unknown(self, tmp_path, monkeypatch): + monkeypatch.setattr(utils, "current_build_json", tmp_path / "nope.json") + assert utils.get_version() == "Unknown" + + def test_label_returned_when_build_is_running(self, tmp_path, monkeypatch): + store = "/nix/store/abc12345-nixos-system-pifinder" + _write_build(tmp_path, monkeypatch, store_path=store, version="PR362-005abc") + _fake_running(monkeypatch, store) + assert utils.get_version() == "PR362-005abc" + + def test_off_device_trusts_the_label(self, tmp_path, monkeypatch): + # No /run/current-system to compare against — don't cry stale. + _write_build( + tmp_path, monkeypatch, store_path="/nix/store/x-nixos-system", version="v1" + ) + _fake_running(monkeypatch, None) + assert utils.get_version() == "v1" + + def test_stale_label_falls_back_to_running_hash(self, tmp_path, monkeypatch): + # current-build.json names the selected build; the device booted another. + _write_build( + tmp_path, + monkeypatch, + store_path="/nix/store/selected00-nixos-system-pifinder", + version="PR362-005abc", + ) + _fake_running(monkeypatch, "/nix/store/running99-nixos-system-pifinder") + # Never assert the label the device isn't running; report the real build. + assert utils.get_version() == "running9" + + def test_stale_and_no_running_path_is_unknown(self, tmp_path, monkeypatch): + _write_build( + tmp_path, + monkeypatch, + store_path="/nix/store/selected00-nixos-system", + version="PR362-005abc", + ) + # build_is_running -> False (mismatch), running unknown -> Unknown, not a lie. + monkeypatch.setattr(utils, "build_is_running", lambda p: False) + _fake_running(monkeypatch, None) + assert utils.get_version() == "Unknown" + + +@pytest.mark.unit +class TestBuildIsRunning: + def test_direct_match(self, monkeypatch): + store = "/nix/store/base00-nixos-system-pifinder" + _fake_running(monkeypatch, store) + assert utils.build_is_running(store) is True + + def test_mismatch(self, monkeypatch): + _fake_running(monkeypatch, "/nix/store/other-nixos-system") + assert utils.build_is_running("/nix/store/base00-nixos-system") is False + + def test_none_running_assumes_match(self, monkeypatch): + _fake_running(monkeypatch, None) + assert utils.build_is_running("/nix/store/base00-nixos-system") is True + + def test_empty_store_path_is_false(self, monkeypatch): + _fake_running(monkeypatch, "/nix/store/x") + assert utils.build_is_running("") is False + assert utils.build_is_running(None) is False + + def test_running_camera_specialisation_matches_base(self, tmp_path, monkeypatch): + # The device boots /specialisation/, a distinct store path; + # the recorded base must still count as running. + base = tmp_path / "base-nixos-system" + spec_target = tmp_path / "specialised00-nixos-system" + spec_target.mkdir() + (base / "specialisation").mkdir(parents=True) + os.symlink(spec_target, base / "specialisation" / "imx462") + _fake_running(monkeypatch, os.path.realpath(spec_target)) + assert utils.build_is_running(str(base)) is True + + +@pytest.mark.unit +class TestRunningSystemStorePath: + def test_none_when_not_a_symlink(self, tmp_path, monkeypatch): + monkeypatch.setattr(utils, "running_system_link", tmp_path / "absent") + assert utils.running_system_store_path() is None + + def test_none_when_not_a_store_path(self, tmp_path, monkeypatch): + target = tmp_path / "somewhere" + target.mkdir() + link = tmp_path / "current-system" + os.symlink(target, link) + monkeypatch.setattr(utils, "running_system_link", link) + assert utils.running_system_store_path() is None diff --git a/python/tests/test_catalog_data.py b/python/tests/test_catalog_data.py index 7478cef13..c2523ea28 100644 --- a/python/tests/test_catalog_data.py +++ b/python/tests/test_catalog_data.py @@ -34,11 +34,12 @@ def test_object_counts(): "TLK": 93, "Har": 147, "Lyn": 1151, + "PK": 1510, } # catalog count num_catalogs = len(list(db.get_catalogs())) - assert num_catalogs == 21 + assert num_catalogs == 22 actual_catalogs = [row["catalog_code"] for row in db.get_catalogs()] expected_catalogs = list(catalog_counts.keys()) missing_catalogs = set(expected_catalogs) - set(actual_catalogs) @@ -103,14 +104,23 @@ def check_messier_objects(): assert m45_obj is not None, "M45 object should exist in objects table" # Validate M45 coordinates (Pleiades) - # Expected: RA=56.85°, Dec=+24.117° + # M45 is one sky object with two catalog listings, M 45 and Col 42, so the + # position is Collinder's: RA=56.75°, Dec=+24.117°. assert coords_are_close( - m45_obj["ra"], 56.85 - ), f"M45 RA should be ~56.85°, got {m45_obj['ra']}" + m45_obj["ra"], 56.75 + ), f"M45 RA should be ~56.75°, got {m45_obj['ra']}" assert coords_are_close( m45_obj["dec"], 24.117 ), f"M45 Dec should be ~24.117°, got {m45_obj['dec']}" + # The Pleiades must not be duplicated: post-processing lists "Cr 42" among + # M45's aka names precisely so the two listings resolve to one object. + col42_catalog_obj = db.get_catalog_object_by_sequence("Col", 42) + assert col42_catalog_obj is not None, "Col 42 should exist in catalog_objects" + assert ( + col42_catalog_obj["object_id"] == m45_catalog_obj["object_id"] + ), "M45 and Col 42 are the Pleiades and must share one sky object" + # Validate M45 object type and constellation assert ( m45_obj["obj_type"] == "OC" @@ -353,6 +363,51 @@ def test_catalog_data_validation(): check_ic_objects() +@pytest.mark.unit +def test_pk_cross_identification(): + """ + Perek-Kohoutek entries that name an existing object must share it. + + The sequence is the catalogue's own 1-1510 running number, so the pairs + below are fixed by the published list. + """ + db = objects_db.ObjectsDatabase() + + # (PK sequence, catalog code, sequence of the same sky object) + same_object = [ + (2, "NGC", 40), # PK 120+09.1 + (1, "Abl", 1), # PK 119+06.1 + (1227, "NGC", 6742), # PK 078+18.1, also Abell 50 + (6, "Sh2", 176), # PK 120-05.1 + ] + for pk_sequence, catalog_code, sequence in same_object: + pk_obj = db.get_catalog_object_by_sequence("PK", pk_sequence) + other = db.get_catalog_object_by_sequence(catalog_code, sequence) + assert pk_obj is not None, f"PK {pk_sequence} should exist" + assert other is not None, f"{catalog_code} {sequence} should exist" + assert pk_obj["object_id"] == other["object_id"], ( + f"PK {pk_sequence} and {catalog_code} {sequence} are the same " + f"nebula and must share one sky object" + ) + + # Minkowski planetary nebulae are named "M n-m" in the source. Collapsing + # the hyphen turns "M 3-1" into "M 31", so these must never be bound onto + # the Messier object of the same digits. + minkowski = [ + (18, 11), # M 1-1 + (41, 14), # M 1-4 + (127, 31), # M 3-1 + (150, 42), # M 4-2 + (552, 29), # M 2-9 + ] + for pk_sequence, messier in minkowski: + pk_obj = db.get_catalog_object_by_sequence("PK", pk_sequence) + messier_obj = db.get_catalog_object_by_sequence("M", messier) + assert ( + pk_obj["object_id"] != messier_obj["object_id"] + ), f"PK {pk_sequence} is a Minkowski nebula, not M {messier}" + + @pytest.mark.unit def test_background_loader(): """ diff --git a/python/tests/test_designation_parsing.py b/python/tests/test_designation_parsing.py new file mode 100644 index 000000000..ebf40bd70 --- /dev/null +++ b/python/tests/test_designation_parsing.py @@ -0,0 +1,72 @@ +"""Designation parsing for catalog imports. + +The regression these guard against: `ObjectFinder` used to resolve aliases by +stripping spaces *and hyphens*, so any designation with a compound numeric +part collapsed into a plausible but wrong sequence number. Feeding it the +Perek-Kohoutek name column produced 147 matches, 145 of them false — 188 of +those names are Minkowski planetary nebulae ("M 1-92"), not Messier objects. +""" + +import pytest + +from PiFinder.catalog_imports.catalog_import_utils import parse_designation + + +@pytest.mark.unit +@pytest.mark.parametrize( + "designation, expected", + [ + ("NGC 40", ("NGC", 40)), + ("NGC 7008", ("NGC", 7008)), + ("NGC7008", ("NGC", 7008)), + ("IC 418", ("IC", 418)), + ("M 27", ("M", 27)), + ("M 76", ("M", 76)), + ("Messier 31", ("M", 31)), + ("A 43", ("Abl", 43)), + ("Abell 43", ("Abl", 43)), + ("PN A66 80", ("Abl", 80)), + ("Sh 2-176", ("Sh2", 176)), + ("SH 2-216", ("Sh2", 216)), + ("Sharpless 176", ("Sh2", 176)), + ("Cr 24", ("Col", 24)), + ("Collinder 24", ("Col", 24)), + ("Caldwell 14", ("C", 14)), + ("Barnard 33", ("B", 33)), + ], +) +def test_recognized_designations(designation, expected): + assert parse_designation(designation) == expected + + +@pytest.mark.unit +@pytest.mark.parametrize( + "designation", + [ + # Minkowski planetary nebulae. Stripping the hyphen would read these + # as Messier 11, 29, 32 and 92. + "M 1-1", + "M 2-9", + "M 3-2", + "M 1-92", + # Haro planetary nebulae, not Herschel 400 entries. + "H 1-1", + "H 3-29", + # Two halves of one object; expanding it is the loader's job, because + # the trailing digits replace the tail of the first number. + "NGC 650-1", + # Designation families PiFinder has no catalog for. + "K 2- 1", + "He 2-47", + "Vy 2-2", + "Hu 1-2", + "Wray 16-93", + "IRAS 06518-1041", + # Nothing to key on. + "40", + "", + "Andromeda", + ], +) +def test_rejected_designations(designation): + assert parse_designation(designation) is None diff --git a/python/tests/test_gps_ubx_parser.py b/python/tests/test_gps_ubx_parser.py index c4265d7ea..a803f061f 100644 --- a/python/tests/test_gps_ubx_parser.py +++ b/python/tests/test_gps_ubx_parser.py @@ -49,22 +49,24 @@ def test_svinfo_field_alignment(parser): @pytest.mark.unit -def test_svinfo_only_code_locked_counted_as_seen(parser): - # Idle channels (e.g. SBAS) and cold-start acquisition candidates - # (quality < 4 with an estimated cno) must not inflate the seen count. +def test_svinfo_seen_needs_acquired_signal(parser): + # Search candidates (quality 1, estimated cno) and idle channels must + # not inflate the seen count, but satellites being acquired (quality + # 2-3) must count so the display climbs instead of flapping to zero + # during marginal re-acquisition. payload = make_svinfo_payload( [ - (0, 14, 0x0D, 4, 26, 30, 90), - (7, 25, 0x00, 2, 9, 0, 0), - (11, 120, 0x10, 1, 0, 0, 0), - (5, 193, 0x10, 1, 0, 0, 0), + (0, 14, 0x0D, 4, 26, 30, 90), # code locked, used + (7, 25, 0x00, 2, 9, 0, 0), # signal acquired: seen + (3, 30, 0x00, 1, 12, 0, 0), # search candidate: not seen + (11, 120, 0x10, 1, 0, 0, 0), # idle SBAS channel: not seen ] ) result = parser._parse_nav_svinfo(payload) - assert result["nSat"] == 1 + assert result["nSat"] == 2 assert result["uSat"] == 1 - assert result["satellites"][0]["id"] == 14 + assert [s["id"] for s in result["satellites"]] == [14, 25] @pytest.mark.unit @@ -88,7 +90,7 @@ def test_nav_sat_used_from_svused_bit(parser): [ (0, 17, 27, 45, 180, 0x0C), # quality 4, used (0, 13, 15, -5, 300, 0x04), # quality 4, tracked but not used - (0, 25, 9, 0, 0, 0x02), # acquisition candidate: not seen + (0, 25, 9, 0, 0, 0x01), # search candidate: not seen (6, 3, 0, 0, 0, 0x01), # searching, no signal: not seen ] ) diff --git a/python/tests/test_hardware_detect.py b/python/tests/test_hardware_detect.py index 72acb546d..3b4b61a7d 100644 --- a/python/tests/test_hardware_detect.py +++ b/python/tests/test_hardware_detect.py @@ -1,10 +1,10 @@ """ Unit tests for hardware_detect. -The I2C bus is faked: a stand-in ``board`` whose ``I2C().scan()`` returns -a chosen address list, so the BQ25895 presence probe can be exercised -both ways without real hardware. The no-blinka path (board is None) must -degrade to all-False capabilities. +The I2C bus is faked: a stand-in ``get_i2c`` factory whose bus ``scan()`` +returns a chosen address list, so the BQ25895 presence probe can be +exercised both ways without real hardware. The no-blinka path (get_i2c is +None) must degrade to all-False capabilities. """ import pytest @@ -29,46 +29,47 @@ def scan(self): return list(self._addresses) -class FakeBoard: - """Stand-in for the ``board`` module: ``I2C()`` returns a FakeI2C.""" +def fake_get_i2c(addresses): + """Stand-in for ``i2c_bus.get_i2c``: returns a FakeI2C factory.""" - def __init__(self, addresses): - self._addresses = addresses + def factory(): + return FakeI2C(addresses) - def I2C(self): - return FakeI2C(self._addresses) + return factory @pytest.mark.unit def test_i2c_present_true(monkeypatch): - monkeypatch.setattr(hardware_detect, "board", FakeBoard([0x28, BQ25895_ADDRESS])) + monkeypatch.setattr( + hardware_detect, "get_i2c", fake_get_i2c([0x28, BQ25895_ADDRESS]) + ) assert hardware_detect.i2c_present(BQ25895_ADDRESS) is True @pytest.mark.unit def test_i2c_present_false(monkeypatch): - monkeypatch.setattr(hardware_detect, "board", FakeBoard([0x28, 0x77])) + monkeypatch.setattr(hardware_detect, "get_i2c", fake_get_i2c([0x28, 0x77])) assert hardware_detect.i2c_present(BQ25895_ADDRESS) is False @pytest.mark.unit def test_detect_capabilities_present(monkeypatch): - monkeypatch.setattr(hardware_detect, "board", FakeBoard([BQ25895_ADDRESS])) + monkeypatch.setattr(hardware_detect, "get_i2c", fake_get_i2c([BQ25895_ADDRESS])) caps = hardware_detect.detect_capabilities() assert caps.has_bq25895 is True @pytest.mark.unit def test_detect_capabilities_absent(monkeypatch): - monkeypatch.setattr(hardware_detect, "board", FakeBoard([0x28])) + monkeypatch.setattr(hardware_detect, "get_i2c", fake_get_i2c([0x28])) caps = hardware_detect.detect_capabilities() assert caps.has_bq25895 is False @pytest.mark.unit def test_detect_capabilities_no_blinka(monkeypatch): - """No blinka / no bus (board is None) -> all-False, no exception.""" - monkeypatch.setattr(hardware_detect, "board", None) + """No blinka / no bus (get_i2c is None) -> all-False, no exception.""" + monkeypatch.setattr(hardware_detect, "get_i2c", None) caps = hardware_detect.detect_capabilities() assert caps.has_bq25895 is False # The raw probe surfaces the failure; detect_capabilities swallows it. diff --git a/python/tests/test_net_policy.py b/python/tests/test_net_policy.py new file mode 100644 index 000000000..d9f0ecde3 --- /dev/null +++ b/python/tests/test_net_policy.py @@ -0,0 +1,135 @@ +import pytest + +from PiFinder.net_policy_core import ( + AP_DOWN, + AP_UP, + CLIENT_RETRY_SECONDS, + GRACE_SECONDS, + PolicyState, + Snapshot, + decide, +) + + +def _snap(**overrides): + snap = Snapshot( + forced_ap=False, + eth_connected=False, + wifi_client_active=False, + ap_active=False, + ap_stations=0, + ) + for key, value in overrides.items(): + setattr(snap, key, value) + return snap + + +@pytest.mark.unit +class TestForcedAp: + def test_brings_ap_up(self): + assert decide(_snap(forced_ap=True), PolicyState(), 100.0) == AP_UP + + def test_noop_when_already_up(self): + snap = _snap(forced_ap=True, ap_active=True) + assert decide(snap, PolicyState(), 100.0) is None + + def test_forced_ap_wins_over_ethernet(self): + snap = _snap(forced_ap=True, eth_connected=True, ap_active=True) + assert decide(snap, PolicyState(), 100.0) is None + + +@pytest.mark.unit +class TestWiredPriority: + def test_ap_dropped_when_wired(self): + snap = _snap(eth_connected=True, ap_active=True) + assert decide(snap, PolicyState(), 100.0) == AP_DOWN + + def test_noop_when_wired_and_no_ap(self): + assert decide(_snap(eth_connected=True), PolicyState(), 100.0) is None + + def test_wired_resets_grace_timer(self): + state = PolicyState(disconnected_since=50.0) + decide(_snap(eth_connected=True), state, 100.0) + assert state.disconnected_since is None + + +@pytest.mark.unit +class TestWifiClient: + def test_noop_when_client_connected(self): + snap = _snap(wifi_client_active=True) + assert decide(snap, PolicyState(), 100.0) is None + + def test_client_resets_grace_timer(self): + state = PolicyState(disconnected_since=50.0) + decide(_snap(wifi_client_active=True), state, 100.0) + assert state.disconnected_since is None + + +@pytest.mark.unit +class TestGraceFallback: + def test_no_immediate_ap(self): + state = PolicyState() + assert decide(_snap(), state, 100.0) is None + assert state.disconnected_since == 100.0 + + def test_ap_up_after_grace(self): + state = PolicyState() + decide(_snap(), state, 100.0) + assert decide(_snap(), state, 100.0 + GRACE_SECONDS) == AP_UP + + def test_no_ap_before_grace(self): + state = PolicyState() + decide(_snap(), state, 100.0) + assert decide(_snap(), state, 100.0 + GRACE_SECONDS - 1) is None + + def test_reconnect_within_grace_cancels_fallback(self): + state = PolicyState() + decide(_snap(), state, 100.0) + decide(_snap(wifi_client_active=True), state, 110.0) + # Disconnect again much later: the grace clock must restart. + assert decide(_snap(), state, 500.0) is None + assert state.disconnected_since == 500.0 + + +@pytest.mark.unit +class TestIdleApClientRetry: + def _aged_state(self, now): + """State as it looks after the AP has been up for a while.""" + return PolicyState(last_client_retry=now - CLIENT_RETRY_SECONDS) + + def test_idle_ap_retries_client(self): + now = 1000.0 + snap = _snap(ap_active=True, ap_stations=0) + assert decide(snap, self._aged_state(now), now) == AP_DOWN + + def test_occupied_ap_never_dropped(self): + now = 1000.0 + snap = _snap(ap_active=True, ap_stations=2) + assert decide(snap, self._aged_state(now), now) is None + + def test_no_retry_before_interval(self): + now = 1000.0 + state = PolicyState(last_client_retry=now - CLIENT_RETRY_SECONDS + 5) + assert decide(_snap(ap_active=True), state, now) is None + + def test_first_observation_arms_but_does_not_retry(self): + # An externally-activated AP (e.g. at boot) must not be dropped on + # the daemon's first look; the retry clock starts then. + state = PolicyState() + assert decide(_snap(ap_active=True), state, 1000.0) is None + assert state.last_client_retry == 1000.0 + + def test_retry_then_fallback_restores_ap(self): + # Full cycle: idle AP dropped for a retry, no client appears, + # grace expires, AP comes back. + now = 1000.0 + state = self._aged_state(now) + assert decide(_snap(ap_active=True, ap_stations=0), state, now) == AP_DOWN + assert decide(_snap(), state, now + GRACE_SECONDS) == AP_UP + + def test_retry_then_client_joins(self): + now = 1000.0 + state = self._aged_state(now) + assert decide(_snap(ap_active=True, ap_stations=0), state, now) == AP_DOWN + assert decide(_snap(wifi_client_active=True), state, now + 10) is None + assert state.disconnected_since is None diff --git a/python/tests/test_nixos_migration_wifi.py b/python/tests/test_nixos_migration_wifi.py deleted file mode 100644 index 9b621fb45..000000000 --- a/python/tests/test_nixos_migration_wifi.py +++ /dev/null @@ -1,321 +0,0 @@ -import re - -import pytest - -from PiFinder.nixos_migration_wifi import ( - Network, - _parse_ssid, - build_keyfile, - emit_keyfiles, - escape_keyfile_value, - parse_wpa_supplicant_conf, - sanitize_filename, - ssid_to_bytelist, -) - - -UUID_V4_RE = re.compile( - r"^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" -) - - -@pytest.mark.unit -class TestParseWpaSupplicantConf: - def test_empty(self): - assert parse_wpa_supplicant_conf("") == [] - - def test_single_wpa_network(self): - conf = """ - ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev - update_config=1 - country=BE - - network={ - ssid="APME" - psk="hunter12" - } - """ - assert parse_wpa_supplicant_conf(conf) == [Network("APME", "hunter12")] - - def test_open_network_has_no_psk(self): - conf = """ - network={ - ssid="OpenNet" - key_mgmt=NONE - } - """ - assert parse_wpa_supplicant_conf(conf) == [Network("OpenNet", None)] - - def test_multiple_networks_preserve_order(self): - conf = """ - network={ - ssid="first" - psk="pw1" - } - network={ - ssid="second" - psk="pw2" - } - network={ - ssid="third" - psk="pw3" - } - """ - nets = parse_wpa_supplicant_conf(conf) - assert [n.ssid for n in nets] == ["first", "second", "third"] - - def test_hex_psk_preserved_verbatim(self): - hex_psk = "a" * 64 - conf = f""" - network={{ - ssid="HexPsk" - psk={hex_psk} - }} - """ - result = parse_wpa_supplicant_conf(conf) - assert result == [Network("HexPsk", hex_psk)] - - def test_unquoted_ssid_kept(self): - # Some configs use unquoted SSIDs for short alphanumerics. - conf = """ - network={ - ssid=plain - psk="pw" - } - """ - assert parse_wpa_supplicant_conf(conf) == [Network("plain", "pw")] - - def test_ssid_with_special_chars(self): - conf = """ - network={ - ssid="0x20" - psk="pw" - } - network={ - ssid="hackerspace.gent" - psk="pw2" - } - """ - nets = parse_wpa_supplicant_conf(conf) - assert nets == [ - Network("0x20", "pw"), - Network("hackerspace.gent", "pw2"), - ] - - def test_network_without_ssid_skipped(self): - conf = """ - network={ - psk="orphan" - } - network={ - ssid="valid" - psk="pw" - } - """ - assert parse_wpa_supplicant_conf(conf) == [Network("valid", "pw")] - - def test_comments_and_blank_lines_ignored(self): - conf = """ - # global comment - ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev - - network={ - # inner comment - ssid="commented" - psk="pw" # trailing comment - } - """ - assert parse_wpa_supplicant_conf(conf) == [Network("commented", "pw")] - - -@pytest.mark.unit -class TestSsidToBytelist: - def test_ascii(self): - assert ssid_to_bytelist("APME") == "65;80;77;69;" - - def test_bytes_are_decimal(self): - # The whole point of this function — NM only parses DECIMAL byte - # lists; hex (with or without 0x prefix) is silently kept as a - # literal-string SSID and the network name is mangled. - assert ssid_to_bytelist("apollo") == "97;112;111;108;108;111;" - - def test_utf8_bytes(self): - # SSID can contain non-ASCII; should be encoded as utf-8 bytes - assert ssid_to_bytelist("é") == "195;169;" - - def test_empty(self): - assert ssid_to_bytelist("") == "" - - def test_non_utf8_bytes_round_trip(self): - # A hex wpa ssid holding non-UTF-8 bytes survives parse -> encode. - assert ssid_to_bytelist(_parse_ssid("ff00")) == "255;0;" - - -@pytest.mark.unit -class TestParseSsidValue: - def test_quoted_is_plain_string(self): - assert _parse_ssid('"apollo"') == "apollo" - - def test_unquoted_hex_is_decoded(self): - # wpa_supplicant stores SSIDs with special characters as unquoted - # hex strings; these must be decoded, not used as the name. - assert _parse_ssid("61706f6c6c6f") == "apollo" - - def test_quoted_hex_lookalike_stays_verbatim(self): - # A network genuinely NAMED like a hex string is quoted in - # wpa_supplicant, so it must not be decoded. - assert _parse_ssid('"61706f"') == "61706f" - - def test_non_hex_unquoted_stays_verbatim(self): - assert _parse_ssid("abc") == "abc" - - def test_hex_ssid_end_to_end(self): - conf = """ - network={ - ssid=61706f6c6c6f - psk="hunter12" - } - """ - assert parse_wpa_supplicant_conf(conf) == [Network("apollo", "hunter12")] - - -@pytest.mark.unit -class TestEscapeKeyfileValue: - def test_plain(self): - assert escape_keyfile_value("hunter12") == "hunter12" - - def test_semicolon_escaped(self): - assert escape_keyfile_value("a;b") == "a\\;b" - - def test_backslash_escaped(self): - assert escape_keyfile_value("a\\b") == "a\\\\b" - - def test_backslash_before_semicolon(self): - # Backslash must be escaped first so we don't double-escape the - # semicolon escape sequence we just produced. - assert escape_keyfile_value("\\;") == "\\\\\\;" - - -@pytest.mark.unit -class TestSanitizeFilename: - def test_plain(self): - assert sanitize_filename("APME") == "APME" - - def test_dot_preserved(self): - assert sanitize_filename("hackerspace.gent") == "hackerspace.gent" - - def test_slash_replaced(self): - assert sanitize_filename("a/b") == "a_b" - - def test_pathy_chars_replaced(self): - assert sanitize_filename("../etc/passwd") == ".._etc_passwd" - - def test_empty_becomes_wifi(self): - assert sanitize_filename("") == "wifi" - - def test_dot_becomes_wifi(self): - assert sanitize_filename(".") == "wifi" - - def test_dotdot_becomes_wifi(self): - assert sanitize_filename("..") == "wifi" - - -@pytest.mark.unit -class TestBuildKeyfile: - def test_contains_required_sections(self): - body = build_keyfile("APME", "hunter12", connection_uuid="fixed-uuid") - assert "[connection]" in body - assert "[wifi]" in body - assert "[wifi-security]" in body - assert "[ipv4]" in body - assert "[ipv6]" in body - - def test_uuid_present(self): - body = build_keyfile("APME", "pw", connection_uuid="abc-123") - assert "uuid=abc-123" in body - - def test_uuid_generated_when_not_provided(self): - body = build_keyfile("APME", "pw") - match = re.search(r"^uuid=(.+)$", body, re.MULTILINE) - assert match - assert UUID_V4_RE.match(match.group(1)) - - def test_ssid_encoded_as_decimal_bytelist(self): - body = build_keyfile("APME", "pw", connection_uuid="x") - assert "ssid=65;80;77;69;" in body - - def test_open_network_omits_security(self): - body = build_keyfile("OpenNet", None, connection_uuid="x") - assert "[wifi-security]" not in body - assert "key-mgmt" not in body - assert "psk=" not in body - - def test_empty_psk_treated_as_open(self): - body = build_keyfile("OpenNet", "", connection_uuid="x") - assert "[wifi-security]" not in body - - def test_psk_with_semicolon_escaped(self): - body = build_keyfile("S", "p;w", connection_uuid="x") - assert "psk=p\\;w" in body - - def test_psk_with_backslash_escaped(self): - body = build_keyfile("S", "p\\w", connection_uuid="x") - assert "psk=p\\\\w" in body - - def test_ipv4_method_auto(self): - body = build_keyfile("S", "pw", connection_uuid="x") - assert "[ipv4]\nmethod=auto" in body - - def test_id_uses_ssid(self): - body = build_keyfile("MyNet", "pw", connection_uuid="x") - assert "id=MyNet" in body - - -@pytest.mark.unit -class TestEmitKeyfiles: - def test_writes_one_file_per_network(self, tmp_path): - nets = [Network("a", "pw"), Network("b", None), Network("c", "pw3")] - written = emit_keyfiles(nets, tmp_path) - assert len(written) == 3 - assert {p.name for p in written} == { - "a.nmconnection", - "b.nmconnection", - "c.nmconnection", - } - - def test_file_mode_is_600(self, tmp_path): - emit_keyfiles([Network("a", "pw")], tmp_path) - mode = (tmp_path / "a.nmconnection").stat().st_mode & 0o777 - assert mode == 0o600 - - def test_creates_output_dir(self, tmp_path): - target = tmp_path / "nested" / "wifi" - emit_keyfiles([Network("a", "pw")], target) - assert (target / "a.nmconnection").exists() - - def test_collision_suffix(self, tmp_path): - # Two SSIDs that sanitize to the same filename - nets = [Network("a/b", "pw"), Network("a.b", "pw")] - # sanitize: "a/b" -> "a_b", "a.b" -> "a.b" (different) — pick another pair - nets = [Network("a/b", "pw"), Network("a;b", "pw")] - # Both sanitize to "a_b" - written = emit_keyfiles(nets, tmp_path) - names = sorted(p.name for p in written) - assert names == ["a_b.nmconnection", "a_b_2.nmconnection"] - - def test_each_file_gets_unique_uuid(self, tmp_path): - nets = [Network("a", "pw"), Network("b", "pw")] - emit_keyfiles(nets, tmp_path) - u1 = (tmp_path / "a.nmconnection").read_text() - u2 = (tmp_path / "b.nmconnection").read_text() - uuid1 = re.search(r"^uuid=(.+)$", u1, re.MULTILINE).group(1) - uuid2 = re.search(r"^uuid=(.+)$", u2, re.MULTILINE).group(1) - assert uuid1 != uuid2 - assert UUID_V4_RE.match(uuid1) - assert UUID_V4_RE.match(uuid2) - - def test_deterministic_with_injected_uuid(self, tmp_path): - nets = [Network("a", "pw")] - emit_keyfiles(nets, tmp_path, uuid_factory=lambda: "fixed-uuid-1234") - body = (tmp_path / "a.nmconnection").read_text() - assert "uuid=fixed-uuid-1234" in body diff --git a/python/tests/test_nixos_upgrade.py b/python/tests/test_nixos_upgrade.py new file mode 100644 index 000000000..8de7c9c3b --- /dev/null +++ b/python/tests/test_nixos_upgrade.py @@ -0,0 +1,433 @@ +import json +import urllib.error + +import pytest + +from PiFinder import nixos_upgrade + + +STORE = "/nix/store/abc123-nixos-system-pifinder" + + +class _FakeResp: + def __init__(self, status): + self.status = status + + def __enter__(self): + return self + + def __exit__(self, *exc): + return False + + +def _fake_urlopen(outcomes): + """Build a urlopen stub that returns/raises one outcome per cache probe. + + Each outcome is either an int HTTP status (-> a response) or an Exception + instance to raise (a 404 HTTPError, a URLError, etc.). + """ + calls = iter(outcomes) + + def _open(url, timeout=None): + outcome = next(calls) + if isinstance(outcome, Exception): + raise outcome + return _FakeResp(outcome) + + return _open + + +def _http_error(code): + return urllib.error.HTTPError( + url="https://cache/abc.narinfo", code=code, msg="x", hdrs=None, fp=None + ) + + +@pytest.mark.unit +def test_valid_store_path_rejects_non_store_refs(): + assert nixos_upgrade.valid_store_path(STORE) + assert not nixos_upgrade.valid_store_path("release") + assert not nixos_upgrade.valid_store_path("/tmp/not-a-store-path") + + +@pytest.mark.unit +def test_parse_progress_event_ignores_malformed_lines(): + assert nixos_upgrade.parse_progress_event("copying path") is None + assert nixos_upgrade.parse_progress_event("@nix {") is None + + +@pytest.mark.unit +def test_parse_progress_event_extracts_copy_path(): + line = ( + '@nix {"action":"start","id":7,"type":100,' + f'"text":"copying path \'{STORE}\' from cache"}}' + ) + event = nixos_upgrade.parse_progress_event(line) + + assert event == nixos_upgrade.ProgressEvent("start", 7, 100, STORE) + + +@pytest.mark.unit +def test_parse_progress_event_extracts_byte_progress(): + line = '@nix {"action":"result","id":3,"type":105,"fields":[1024,4096,1,0]}' + event = nixos_upgrade.parse_progress_event(line) + assert event == nixos_upgrade.ProgressEvent("result", 3, None, None, 1024, 4096) + + +@pytest.mark.unit +def test_download_progress_tracks_bytes_and_label(monkeypatch): + statuses: list[str] = [] + monkeypatch.setattr( + nixos_upgrade, "write_status", lambda s, _f=None: statuses.append(s) + ) + progress = nixos_upgrade._DownloadProgress(10_000_000, 2, None) + progress.feed( + f'@nix {{"action":"start","id":1,"type":100,' + f'"text":"copying path \'{STORE}\' from cache"}}' + ) + progress.feed( + '@nix {"action":"result","id":1,"type":105,"fields":[5000000,8000000,1,0]}' + ) + progress.feed('@nix {"action":"stop","id":1,"type":100}') + + # within-path byte movement, the package label, and never a crash on junk + assert statuses and all(s.startswith("downloading ") for s in statuses) + assert any("nixos-system-pifinder" in s for s in statuses) + for bad in ["garbage", "@nix {oops", ""]: + progress.feed(bad) + + +@pytest.mark.unit +def test_run_build_uses_no_link(monkeypatch, tmp_path): + started = {} + + class FakeStdout: + def __iter__(self): + return iter(()) + + class FakeProcess: + stdout = FakeStdout() + + def wait(self): + return 0 + + def fake_popen(args, **kwargs): + started["args"] = args + return FakeProcess() + + monkeypatch.setattr(nixos_upgrade.subprocess, "Popen", fake_popen) + monkeypatch.setattr(nixos_upgrade, "fetch_cache_public_keys", lambda: []) + + rc = nixos_upgrade.run_build( + STORE, + nixos_upgrade.DownloadEstimate(()), + status_file=tmp_path / "status", + log_file=tmp_path / "log", + ) + + assert rc == 0 + assert "--no-link" in started["args"] + + +@pytest.mark.unit +def test_estimate_download_parses_paths_and_total(monkeypatch): + dry = ( + "these 1 paths will be fetched (0.0 KiB download, 12.5 MiB unpacked):\n" + f" {STORE}\n" + ) + + def fake_command(args, **kwargs): + class Result: + returncode = 0 + stdout = dry + stderr = "" + + return Result() + + monkeypatch.setattr(nixos_upgrade, "command", fake_command) + + estimate = nixos_upgrade.estimate_download(STORE) + + assert estimate.paths == (STORE,) + assert estimate.path_count == 1 + assert estimate.total_bytes == int(12.5 * 1024 * 1024) + + +def _capture_status(monkeypatch): + statuses = [] + monkeypatch.setattr(nixos_upgrade, "write_status", statuses.append) + return statuses + + +@pytest.mark.unit +def test_classify_local_path_is_available(monkeypatch): + monkeypatch.setattr(nixos_upgrade, "path_exists", lambda _p: True) + assert nixos_upgrade.classify_store_path(STORE) == nixos_upgrade.AVAILABLE + + +@pytest.mark.unit +def test_classify_cache_hit_is_available(monkeypatch): + monkeypatch.setattr(nixos_upgrade, "path_exists", lambda _p: False) + monkeypatch.setattr("urllib.request.urlopen", _fake_urlopen([200])) + assert nixos_upgrade.classify_store_path(STORE) == nixos_upgrade.AVAILABLE + + +@pytest.mark.unit +def test_classify_all_404_is_absent(monkeypatch): + monkeypatch.setattr(nixos_upgrade, "path_exists", lambda _p: False) + monkeypatch.setattr( + "urllib.request.urlopen", _fake_urlopen([_http_error(404), _http_error(404)]) + ) + assert nixos_upgrade.classify_store_path(STORE) == nixos_upgrade.ABSENT + + +@pytest.mark.unit +def test_classify_connection_error_is_unreachable(monkeypatch): + monkeypatch.setattr(nixos_upgrade, "path_exists", lambda _p: False) + err = urllib.error.URLError("no route to host") + monkeypatch.setattr("urllib.request.urlopen", _fake_urlopen([err, err])) + assert nixos_upgrade.classify_store_path(STORE) == nixos_upgrade.UNREACHABLE + + +@pytest.mark.unit +def test_classify_partial_unreachable_is_not_absent(monkeypatch): + # One cache says 404, the other can't be reached: the build might still be + # on the unreachable cache, so this must be retryable, not "gone". + monkeypatch.setattr(nixos_upgrade, "path_exists", lambda _p: False) + outcomes = [_http_error(404), urllib.error.URLError("timeout")] + monkeypatch.setattr("urllib.request.urlopen", _fake_urlopen(outcomes)) + assert nixos_upgrade.classify_store_path(STORE) == nixos_upgrade.UNREACHABLE + + +@pytest.mark.unit +def test_run_upgrade_invalid_ref_writes_failed(tmp_path, monkeypatch): + ref_file = tmp_path / "ref" + ref_file.write_text("release") + statuses = _capture_status(monkeypatch) + + rc = nixos_upgrade.run_upgrade(ref_file, "imx462") + + assert rc == 1 + assert statuses == ["starting", "failed"] + + +@pytest.mark.unit +def test_run_upgrade_unavailable_writes_unavailable(tmp_path, monkeypatch): + ref_file = tmp_path / "ref" + ref_file.write_text(STORE) + statuses = _capture_status(monkeypatch) + monkeypatch.setattr( + nixos_upgrade, + "estimate_download", + lambda _store: nixos_upgrade.DownloadEstimate(()), + ) + monkeypatch.setattr(nixos_upgrade, "run_build", lambda _store, _estimate: 1) + monkeypatch.setattr( + nixos_upgrade, "classify_store_path", lambda _store: nixos_upgrade.ABSENT + ) + + rc = nixos_upgrade.run_upgrade(ref_file, "imx462") + + assert rc == 1 + assert statuses == ["starting", "unavailable"] + + +@pytest.mark.unit +def test_run_upgrade_unreachable_writes_connfail(tmp_path, monkeypatch): + ref_file = tmp_path / "ref" + ref_file.write_text(STORE) + statuses = _capture_status(monkeypatch) + monkeypatch.setattr( + nixos_upgrade, + "estimate_download", + lambda _store: nixos_upgrade.DownloadEstimate(()), + ) + monkeypatch.setattr(nixos_upgrade, "run_build", lambda _store, _estimate: 1) + monkeypatch.setattr( + nixos_upgrade, "classify_store_path", lambda _store: nixos_upgrade.UNREACHABLE + ) + + rc = nixos_upgrade.run_upgrade(ref_file, "imx462") + + assert rc == 1 + assert statuses == ["starting", "connfail"] + + +@pytest.mark.unit +def test_run_upgrade_build_failure_writes_failed(tmp_path, monkeypatch): + ref_file = tmp_path / "ref" + ref_file.write_text(STORE) + statuses = _capture_status(monkeypatch) + monkeypatch.setattr( + nixos_upgrade, + "estimate_download", + lambda _store: nixos_upgrade.DownloadEstimate(()), + ) + monkeypatch.setattr(nixos_upgrade, "run_build", lambda _store, _estimate: 1) + monkeypatch.setattr( + nixos_upgrade, "classify_store_path", lambda _store: nixos_upgrade.AVAILABLE + ) + + rc = nixos_upgrade.run_upgrade(ref_file, "imx462") + + assert rc == 1 + assert statuses == ["starting", "failed"] + + +@pytest.mark.unit +def test_run_upgrade_activation_failure_writes_failed(tmp_path, monkeypatch): + ref_file = tmp_path / "ref" + ref_file.write_text(STORE) + statuses = _capture_status(monkeypatch) + monkeypatch.setattr( + nixos_upgrade, + "estimate_download", + lambda _store: nixos_upgrade.DownloadEstimate(()), + ) + monkeypatch.setattr(nixos_upgrade, "run_build", lambda _store, _estimate: 0) + monkeypatch.setattr(nixos_upgrade, "load_selection", dict) + monkeypatch.setattr( + nixos_upgrade, + "activate_system", + lambda _store, _camera: (_ for _ in ()).throw(RuntimeError("boom")), + ) + + rc = nixos_upgrade.run_upgrade(ref_file, "imx462") + + assert rc == 1 + assert statuses == ["starting", "failed"] + + +@pytest.mark.unit +def test_run_upgrade_success_writes_rebooting_and_persists(tmp_path, monkeypatch): + ref_file = tmp_path / "ref" + ref_file.write_text(STORE) + current_build = tmp_path / "current-build.json" + statuses = _capture_status(monkeypatch) + commands = [] + monkeypatch.setattr(nixos_upgrade, "CURRENT_BUILD_FILE", current_build) + monkeypatch.setattr( + nixos_upgrade, + "estimate_download", + lambda _store: nixos_upgrade.DownloadEstimate(()), + ) + monkeypatch.setattr(nixos_upgrade, "run_build", lambda _store, _estimate: 0) + monkeypatch.setattr( + nixos_upgrade, + "load_selection", + lambda: {"version": "nixos-test", "label": "test", "channel": "unstable"}, + ) + monkeypatch.setattr(nixos_upgrade, "activate_system", lambda _store, _camera: None) + monkeypatch.setattr(nixos_upgrade, "cleanup_old_generations", lambda: None) + monkeypatch.setattr( + nixos_upgrade, + "command", + lambda args, **_kwargs: commands.append(args), + ) + + rc = nixos_upgrade.run_upgrade(ref_file, "imx462") + + assert rc == 0 + assert statuses == ["starting", "rebooting"] + assert commands == [["systemctl", "reboot"]] + assert json.loads(current_build.read_text())["version"] == "nixos-test" + + +@pytest.mark.unit +def test_run_upgrade_reboot_failure_writes_failed(tmp_path, monkeypatch): + ref_file = tmp_path / "ref" + ref_file.write_text(STORE) + current_build = tmp_path / "current-build.json" + statuses = _capture_status(monkeypatch) + monkeypatch.setattr(nixos_upgrade, "CURRENT_BUILD_FILE", current_build) + monkeypatch.setattr( + nixos_upgrade, + "estimate_download", + lambda _store: nixos_upgrade.DownloadEstimate(()), + ) + monkeypatch.setattr(nixos_upgrade, "run_build", lambda _store, _estimate: 0) + monkeypatch.setattr(nixos_upgrade, "load_selection", dict) + monkeypatch.setattr(nixos_upgrade, "activate_system", lambda _store, _camera: None) + monkeypatch.setattr(nixos_upgrade, "cleanup_old_generations", lambda: None) + + def fail_reboot(_args, **_kwargs): + raise RuntimeError("reboot failed") + + monkeypatch.setattr(nixos_upgrade, "command", fail_reboot) + + rc = nixos_upgrade.run_upgrade(ref_file, "imx462") + + assert rc == 1 + assert statuses == ["starting", "rebooting", "failed"] + + +def _setup_activation(tmp_path, monkeypatch, camera_type, specialisations): + """Fixture for activate_system: fake store path, persisted camera, and + captured command()/arm_trial_marker() calls.""" + store = tmp_path / "store" / "new-system" + store.mkdir(parents=True) + (store / "bin").mkdir() + for cam in specialisations: + (store / "specialisation" / cam / "bin").mkdir(parents=True) + + camera_file = tmp_path / "camera-type" + if camera_type is not None: + camera_file.write_text(camera_type + "\n") + monkeypatch.setattr(nixos_upgrade, "CAMERA_TYPE_FILE", camera_file) + + calls = [] + monkeypatch.setattr( + nixos_upgrade, "command", lambda args, **kw: calls.append(list(args)) + ) + armed = [] + monkeypatch.setattr(nixos_upgrade, "arm_trial_marker", armed.append) + monkeypatch.setattr(nixos_upgrade, "write_status", lambda *_a, **_k: None) + return store, calls, armed + + +@pytest.mark.unit +def test_activate_boots_specialisation_even_when_old_base_matches( + tmp_path, monkeypatch +): + """Regression: device persisted imx477 while upgrading from an imx477-BASE + build onto an imx462-base build. Comparing against the old build's base + (--default-camera imx477) concluded 'camera is the base' and booted the + new imx462 base, killing the camera. The decision must instead ask the + NEW store path whether it carries a specialisation for the camera.""" + store, calls, armed = _setup_activation(tmp_path, monkeypatch, "imx477", ["imx477"]) + + nixos_upgrade.activate_system(str(store), "imx477") + + spec = store / "specialisation" / "imx477" + assert armed == [spec] + assert [str(spec / "bin/switch-to-configuration"), "boot"] in calls + assert calls[-1][-1] == "imx477" + + +@pytest.mark.unit +def test_activate_base_branch_when_no_specialisation(tmp_path, monkeypatch): + store, calls, armed = _setup_activation(tmp_path, monkeypatch, "imx462", ["imx477"]) + + nixos_upgrade.activate_system(str(store), "imx477") + + assert armed == [nixos_upgrade.Path(str(store))] + assert [str(store / "bin/switch-to-configuration"), "boot"] in calls + assert calls[-1][-1] == "imx462" + + +@pytest.mark.unit +def test_set_extlinux_default_prefers_new_builds_helper(tmp_path, monkeypatch): + calls = [] + monkeypatch.setattr( + nixos_upgrade, "command", lambda args, **kw: calls.append(list(args)) + ) + store = tmp_path / "sys" + helper = store / "sw" / "bin" / "set-extlinux-default" + helper.parent.mkdir(parents=True) + helper.write_text("#!/bin/sh\n") + + nixos_upgrade.set_extlinux_default("imx477", str(store)) + assert calls[-1] == [str(helper), "imx477"] + + nixos_upgrade.set_extlinux_default("imx477", str(tmp_path / "missing")) + assert calls[-1] == ["set-extlinux-default", "imx477"] diff --git a/python/tests/test_radec_entry.py b/python/tests/test_radec_entry.py index 447f43056..1eaa01138 100644 --- a/python/tests/test_radec_entry.py +++ b/python/tests/test_radec_entry.py @@ -1,5 +1,5 @@ import pytest -from unittest.mock import Mock +from unittest.mock import patch from PiFinder.ui.radec_entry import ( CoordinateState, CoordinateEntryLogic, @@ -71,68 +71,68 @@ def test_with_dec_sign_toggled(self): class TestBlinkingCursor: - """Test the BlinkingCursor with time injection""" + """Test the BlinkingCursor against a controlled clock.""" def test_blinking_cursor_visibility(self): """Test cursor blinking with mocked time""" - mock_time = Mock() - mock_time.return_value = 0.0 + with patch("PiFinder.ui.radec_entry.time") as mock_time: + # Cursor records start_time at construction. + mock_time.time.return_value = 0.0 + cursor = BlinkingCursor(blink_interval=1.0) - cursor = BlinkingCursor(blink_interval=1.0, time_provider=mock_time) + # At start (t=0), cursor should be visible + mock_time.time.return_value = 0.0 + assert cursor.is_visible() - # At start (t=0), cursor should be visible - mock_time.return_value = 0.0 - assert cursor.is_visible() + # At t=0.5, still visible (within first half of cycle) + mock_time.time.return_value = 0.5 + assert cursor.is_visible() - # At t=0.5, still visible (within first half of cycle) - mock_time.return_value = 0.5 - assert cursor.is_visible() + # At t=1.0, should be invisible (second half of cycle) + mock_time.time.return_value = 1.0 + assert not cursor.is_visible() - # At t=1.0, should be invisible (second half of cycle) - mock_time.return_value = 1.0 - assert not cursor.is_visible() + # At t=1.5, still invisible + mock_time.time.return_value = 1.5 + assert not cursor.is_visible() - # At t=1.5, still invisible - mock_time.return_value = 1.5 - assert not cursor.is_visible() - - # At t=2.0, visible again (new cycle) - mock_time.return_value = 2.0 - assert cursor.is_visible() + # At t=2.0, visible again (new cycle) + mock_time.time.return_value = 2.0 + assert cursor.is_visible() class TestCoordinateConverter: - """Test coordinate conversion with dependency injection""" + """Test coordinate conversion, with calc_utils patched at the module level.""" def test_hms_dms_conversion(self): """Test HMS/DMS to decimal degree conversion""" - mock_calc_utils = Mock() - mock_calc_utils.ra_to_deg.return_value = 150.0 # 10h 0m 0s - mock_calc_utils.dec_to_deg.return_value = 30.0 # +30d 0m 0s + with patch("PiFinder.ui.radec_entry.calc_utils") as mock_calc_utils: + mock_calc_utils.ra_to_deg.return_value = 150.0 # 10h 0m 0s + mock_calc_utils.dec_to_deg.return_value = 30.0 # +30d 0m 0s - converter = CoordinateConverter(mock_calc_utils) - ra_deg, dec_deg = converter.hms_dms_to_degrees( - ["10", "0", "0", "30", "0", "0"], "+" - ) + converter = CoordinateConverter() + ra_deg, dec_deg = converter.hms_dms_to_degrees( + ["10", "0", "0", "30", "0", "0"], "+" + ) - assert ra_deg == 150.0 - assert dec_deg == 30.0 - mock_calc_utils.ra_to_deg.assert_called_with(10, 0, 0) - mock_calc_utils.dec_to_deg.assert_called_with(30, 0, 0) + assert ra_deg == 150.0 + assert dec_deg == 30.0 + mock_calc_utils.ra_to_deg.assert_called_with(10, 0, 0) + mock_calc_utils.dec_to_deg.assert_called_with(30, 0, 0) def test_hms_dms_negative_dec(self): """Test HMS/DMS with negative declination""" - mock_calc_utils = Mock() - mock_calc_utils.ra_to_deg.return_value = 150.0 - mock_calc_utils.dec_to_deg.return_value = 30.0 + with patch("PiFinder.ui.radec_entry.calc_utils") as mock_calc_utils: + mock_calc_utils.ra_to_deg.return_value = 150.0 + mock_calc_utils.dec_to_deg.return_value = 30.0 - converter = CoordinateConverter(mock_calc_utils) - ra_deg, dec_deg = converter.hms_dms_to_degrees( - ["10", "0", "0", "30", "0", "0"], "-" - ) + converter = CoordinateConverter() + ra_deg, dec_deg = converter.hms_dms_to_degrees( + ["10", "0", "0", "30", "0", "0"], "-" + ) - assert ra_deg == 150.0 - assert dec_deg == -30.0 + assert ra_deg == 150.0 + assert dec_deg == -30.0 def test_mixed_format_conversion(self): """Test Mixed format (hours/degrees) conversion""" @@ -315,24 +315,24 @@ def test_deletion_hms_dms(self): def test_coordinate_conversion_integration(self): """Test coordinate conversion through the logic""" - mock_calc_utils = Mock() - mock_calc_utils.ra_to_deg.return_value = 150.0 - mock_calc_utils.dec_to_deg.return_value = 30.0 + with patch("PiFinder.ui.radec_entry.calc_utils") as mock_calc_utils: + mock_calc_utils.ra_to_deg.return_value = 150.0 + mock_calc_utils.dec_to_deg.return_value = 30.0 - logic = CoordinateEntryLogic(calc_utils_provider=mock_calc_utils) + logic = CoordinateEntryLogic() - # Set up some coordinates manually for testing - logic._state = logic._state.with_field_updated(0, "10") - logic._state = logic._state.with_field_updated(1, "0") - logic._state = logic._state.with_field_updated(2, "0") - logic._state = logic._state.with_field_updated(3, "30") - logic._state = logic._state.with_field_updated(4, "0") - logic._state = logic._state.with_field_updated(5, "0") + # Set up some coordinates manually for testing + logic._state = logic._state.with_field_updated(0, "10") + logic._state = logic._state.with_field_updated(1, "0") + logic._state = logic._state.with_field_updated(2, "0") + logic._state = logic._state.with_field_updated(3, "30") + logic._state = logic._state.with_field_updated(4, "0") + logic._state = logic._state.with_field_updated(5, "0") - ra_deg, dec_deg = logic.get_coordinates() + ra_deg, dec_deg = logic.get_coordinates() - assert ra_deg == 150.0 - assert dec_deg == 30.0 + assert ra_deg == 150.0 + assert dec_deg == 30.0 class TestFormatConfig: @@ -406,12 +406,23 @@ def test_get_default_fields(self): assert len(decimal_fields) == 2 +class _FakeDisplay: + """Minimal display_class stub: LayoutConfig only reads these three.""" + + class fonts: + class base: + height = 11 # base font height on the 128 panel + + titlebar_height = 16 + resX = 128 + + class TestLayoutConfig: """Test layout configuration constants""" def test_layout_constants(self): """Test that layout constants are defined""" - layout = LayoutConfig() + layout = LayoutConfig(_FakeDisplay()) assert hasattr(layout, "FIELD_HEIGHT") assert hasattr(layout, "FIELD_WIDTH") @@ -431,44 +442,44 @@ class TestIntegration: def test_full_coordinate_entry_workflow(self): """Test complete workflow from input to coordinate conversion""" - mock_calc_utils = Mock() - mock_calc_utils.ra_to_deg.return_value = 150.0 # 10h - mock_calc_utils.dec_to_deg.return_value = 45.0 # +45d + with patch("PiFinder.ui.radec_entry.calc_utils") as mock_calc_utils: + mock_calc_utils.ra_to_deg.return_value = 150.0 # 10h + mock_calc_utils.dec_to_deg.return_value = 45.0 # +45d - logic = CoordinateEntryLogic(calc_utils_provider=mock_calc_utils) + logic = CoordinateEntryLogic() - # Enter coordinates: 10h 30m 0s, +45d 15m 0s + # Enter coordinates: 10h 30m 0s, +45d 15m 0s - # RA hours - logic.handle_numeric_input(1) - logic.handle_numeric_input(0) # Auto-advances to next field + # RA hours + logic.handle_numeric_input(1) + logic.handle_numeric_input(0) # Auto-advances to next field - # RA minutes - logic.handle_numeric_input(3) - logic.handle_numeric_input(0) # Auto-advances + # RA minutes + logic.handle_numeric_input(3) + logic.handle_numeric_input(0) # Auto-advances - # RA seconds (skip - leave as 0) - logic.move_to_next_field() # Move to DEC degrees + # RA seconds (skip - leave as 0) + logic.move_to_next_field() # Move to DEC degrees - # DEC degrees - logic.handle_numeric_input(4) - logic.handle_numeric_input(5) # Auto-advances + # DEC degrees + logic.handle_numeric_input(4) + logic.handle_numeric_input(5) # Auto-advances - # DEC minutes - logic.handle_numeric_input(1) - logic.handle_numeric_input(5) # Auto-advances + # DEC minutes + logic.handle_numeric_input(1) + logic.handle_numeric_input(5) # Auto-advances - # Skip DEC seconds + # Skip DEC seconds - # Get final coordinates - ra_deg, dec_deg = logic.get_coordinates() + # Get final coordinates + ra_deg, dec_deg = logic.get_coordinates() - # Verify mock was called correctly - mock_calc_utils.ra_to_deg.assert_called_with(10, 30, 0) - mock_calc_utils.dec_to_deg.assert_called_with(45, 15, 0) + # Verify mock was called correctly + mock_calc_utils.ra_to_deg.assert_called_with(10, 30, 0) + mock_calc_utils.dec_to_deg.assert_called_with(45, 15, 0) - assert ra_deg == 150.0 - assert dec_deg == 45.0 + assert ra_deg == 150.0 + assert dec_deg == 45.0 def test_format_switching_preserves_state(self): """Test that switching formats and back preserves state where possible""" diff --git a/python/tests/test_radiometer.py b/python/tests/test_radiometer.py index 134c708f1..d3603876d 100644 --- a/python/tests/test_radiometer.py +++ b/python/tests/test_radiometer.py @@ -11,6 +11,8 @@ extract_photometry_image, radiometric_sqm, ) +from PiFinder.sqm.airglow import AirglowTracker, floor_from_sample, sample_diagnostics +from PiFinder.camera_pi import optical_black_pedestal @pytest.mark.unit @@ -33,6 +35,50 @@ def test_sparse_median_ignores_small_bright_sources(): assert sample["pixels_per_side"] == 256 +@pytest.mark.unit +def test_bayer_colour_and_airglow_intermediates_are_replayable(): + profile = get_camera_profile("imx462") + raw = np.empty((256, 256), dtype=np.uint16) + raw[0::2, 0::2] = 300 + raw[0::2, 1::2] = 280 + raw[1::2, 0::2] = 280 + raw[1::2, 1::2] = 270 + sample = collect_radiometer_sample(raw, profile, 0.5, sequence=9, captured_at=10.0) + diagnostic = sample_diagnostics(sample, "imx462", pedestal=240.0) + assert sample["background_red"] == 300.0 + assert sample["background_blue"] == 270.0 + assert diagnostic["green_rate"] == 80.0 + assert diagnostic["red_rate"] == 120.0 + assert diagnostic["blue_rate"] == 60.0 + assert diagnostic["red_over_green"] == 1.5 + assert diagnostic["blue_over_green"] == 0.75 + assert diagnostic["red_excess_unclipped"] == 52.0 + assert diagnostic["correction_adu_per_sec"] == pytest.approx(4.07 * 52.0) + assert floor_from_sample(sample, "imx462", 240.0) == pytest.approx( + diagnostic["correction_adu_per_sec"] + ) + + +@pytest.mark.unit +def test_airglow_is_imx462_only_and_tracker_dump_keeps_full_window(): + sample = { + "sequence": 3, + "captured_at": 10.0, + "exposure_sec": 1.0, + "background_per_pixel": 260.0, + "background_red": 265.0, + "background_blue": 250.0, + } + assert not sample_diagnostics(sample, "imx290", 240.0)["valid"] + tracker = AirglowTracker("imx462", max_samples=2) + assert tracker.add_sample(sample, 240.0) is not None + dump = tracker.dump() + assert dump["n_samples"] == 1 + assert dump["samples"][0]["sequence"] == 3 + assert dump["samples"][0]["red_excess_unclipped"] is not None + assert dump["floor"] == dump["samples"][0]["correction_adu_per_sec"] + + @pytest.mark.unit def test_radiometric_result_is_exposure_invariant(): profile = get_camera_profile("imx462") @@ -149,3 +195,132 @@ def test_recent_conditioned_optics_deficit_corrects_radiometer(monkeypatch): assert solver.update_radiometric_sqm(shared, calc, acc, sample, now=100.0) published = shared.set_sqm.call_args.args[0] assert published.value == pytest.approx(uncorrected - 0.7) + + +@pytest.mark.unit +def test_converts_marked_libcamera_optical_black_to_native_adu(): + metadata = {"SensorBlackLevels": [3808, 3808, 3808, 3809]} + assert optical_black_pedestal(metadata, 12) == 238.0 + # an ordinary static four-channel tuning value carries no marker + assert ( + optical_black_pedestal({"SensorBlackLevels": [3840, 3840, 3840, 3840]}, 12) + is None + ) + assert optical_black_pedestal({}, 12) is None + assert optical_black_pedestal({"SensorBlackLevels": [3808, 3808, 3808]}, 12) is None + assert ( + optical_black_pedestal( + {"SensorBlackLevels": [float("nan")] * 3 + [float("nan")]}, 12 + ) + is None + ) + assert optical_black_pedestal({"SensorBlackLevels": [0, 0, 0, 1]}, 12) is None + + +@pytest.mark.unit +def test_optical_black_travels_through_sample_collection(): + profile = get_camera_profile("imx462") + raw = np.full((256, 256), 300, dtype=np.uint16) + sample = collect_radiometer_sample( + raw, profile, 0.5, sequence=1, captured_at=1.0, optical_black_pedestal=241.5 + ) + assert sample["optical_black_pedestal"] == 241.5 + without = collect_radiometer_sample(raw, profile, 0.5, sequence=2, captured_at=1.0) + assert "optical_black_pedestal" not in without + nan_ob = collect_radiometer_sample( + raw, + profile, + 0.5, + sequence=3, + captured_at=1.0, + optical_black_pedestal=float("nan"), + ) + assert "optical_black_pedestal" not in nan_ob + + +@pytest.mark.unit +def test_per_frame_optical_black_is_complete_pedestal(): + profile = get_camera_profile("imx462") + base = { + "captured_at": 1.0, + "pixels_per_side": 490, + "method": "test", + } + short, short_details = radiometric_sqm( + { + **base, + "sequence": 1, + "exposure_sec": 0.25, + "background_per_pixel": 250.0, + "optical_black_pedestal": 240.0, + }, + profile, + ) + long, long_details = radiometric_sqm( + { + **base, + "sequence": 2, + "exposure_sec": 0.50, + "background_per_pixel": 262.0, + "optical_black_pedestal": 242.0, + }, + profile, + ) + assert short == pytest.approx(long) + assert short_details["pedestal"] == 240.0 + assert long_details["pedestal"] == 242.0 + assert short_details["pedestal_source"] == "optical_black" + + +@pytest.mark.unit +def test_optical_black_wins_over_calibrated_pedestal(): + profile = get_camera_profile("imx462") + sample = { + "sequence": 1, + "captured_at": 1.0, + "exposure_sec": 0.5, + "background_per_pixel": 260.0, + "pixels_per_side": 490, + "method": "test", + "optical_black_pedestal": 241.0, + } + value, details = radiometric_sqm(sample, profile, pedestal=235.0) + assert details["pedestal"] == 241.0 + assert details["pedestal_source"] == "optical_black" + assert value is not None + + +@pytest.mark.unit +def test_missing_optical_black_keeps_calibrated_then_profile_pedestal(): + profile = get_camera_profile("imx462") + sample = { + "sequence": 1, + "captured_at": 1.0, + "exposure_sec": 0.5, + "background_per_pixel": 260.0, + "pixels_per_side": 490, + "method": "test", + } + _, calibrated = radiometric_sqm(sample, profile, pedestal=239.0) + assert calibrated["pedestal"] == 239.0 + assert calibrated["pedestal_source"] == "calibrated" + _, fallback = radiometric_sqm(sample, profile) + assert fallback["pedestal"] == profile.bias_offset + assert fallback["pedestal_source"] == "profile" + + +@pytest.mark.unit +def test_unresolved_background_with_optical_black_returns_no_value(): + profile = get_camera_profile("imx462") + sample = { + "sequence": 1, + "captured_at": 1.0, + "exposure_sec": 0.5, + "background_per_pixel": 241.5, + "pixels_per_side": 490, + "method": "test", + "optical_black_pedestal": 241.0, + } + value, details = radiometric_sqm(sample, profile) + assert value is None + assert details["failure_reason"] == "background_not_resolved_above_pedestal" diff --git a/python/tests/test_sd_notify.py b/python/tests/test_sd_notify.py new file mode 100644 index 000000000..c4251f8f0 --- /dev/null +++ b/python/tests/test_sd_notify.py @@ -0,0 +1,30 @@ +import socket + +import pytest + +from PiFinder.utils import sd_notify + + +@pytest.mark.unit +class TestSdNotify: + def test_noop_without_notify_socket(self, monkeypatch): + # Development runs / tests: no systemd, no socket — must be silent. + monkeypatch.delenv("NOTIFY_SOCKET", raising=False) + sd_notify("READY=1") # must not raise + + def test_sends_state_to_socket(self, monkeypatch, tmp_path): + sock_path = str(tmp_path / "notify.sock") + server = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) + server.bind(sock_path) + server.settimeout(2) + try: + monkeypatch.setenv("NOTIFY_SOCKET", sock_path) + sd_notify("READY=1") + assert server.recv(64) == b"READY=1" + finally: + server.close() + + def test_broken_socket_is_swallowed(self, monkeypatch, tmp_path): + # Socket path set but nothing listening: failure must not propagate. + monkeypatch.setenv("NOTIFY_SOCKET", str(tmp_path / "gone.sock")) + sd_notify("READY=1") # must not raise diff --git a/python/tests/test_software.py b/python/tests/test_software.py index 2aefc08dd..f27746674 100644 --- a/python/tests/test_software.py +++ b/python/tests/test_software.py @@ -1,15 +1,24 @@ -from unittest.mock import patch, MagicMock +from datetime import datetime, timedelta, timezone +from unittest.mock import MagicMock, patch import pytest import requests +# Installs the _() gettext builtin the UI modules rely on; must precede ui imports. +import PiFinder.i18n # noqa: F401 from PiFinder.ui.software import ( - update_needed, - _strip_markdown, - _fetch_migration_config, + UISoftware, + UPDATE_MANIFEST_URL, + _annotate_trunk_entries, + _entry_detail, + _entry_row_parts, _fetch_update_manifest, - _migration_version_info_from_manifest, - _UNLOCK_SEQUENCE, + _format_age, + _load_cached_manifest, + _parse_manifest, + _save_cached_manifest, + _strip_markdown, + update_needed, ) @@ -46,15 +55,6 @@ def test_unknown_returns_true(self): assert update_needed("2.4.0", "Unknown") is True -@pytest.mark.unit -class TestUnlockSequence: - def test_sequence_length(self): - assert len(_UNLOCK_SEQUENCE) == 7 - - def test_sequence_content(self): - assert _UNLOCK_SEQUENCE == ["square"] * 7 - - @pytest.mark.unit class TestStripMarkdown: def test_removes_headings(self): @@ -99,189 +99,505 @@ def _mock_invalid_json_response(status_code=200): @pytest.mark.unit -class TestFetchMigrationConfig: +class TestFetchUpdateManifest: @patch("PiFinder.ui.software.requests.get") - def test_returns_dict_when_gate_open_and_url_set(self, mock_get): - payload = {"nixos_for_everyone": True, "nixos_url": _NIXOS_URL} - mock_get.return_value = _mock_json_response(payload) - assert _fetch_migration_config() == payload + def test_parses_manifest_channels(self, mock_get): + mock_resp = MagicMock() + mock_resp.raise_for_status.return_value = None + mock_resp.json.return_value = { + "schema": 1, + "channels": { + "stable": [ + { + "kind": "release", + "label": "v3.1.0", + "title": "PiFinder v3.1.0", + "version": "3.1.0", + "store_path": "/nix/store/aaa-nixos-system-pifinder", + "available": True, + } + ], + "beta": [], + "unstable": [ + { + "kind": "trunk", + "label": "nixos-abc1234", + "title": "nixos branch", + "version": "nixos-abc1234", + "store_path": "/nix/store/bbb-nixos-system-pifinder", + "available": True, + }, + { + "kind": "pr", + "label": "PR#42-def5678", + "title": "Fix star matching algorithm", + "version": "PR#42-def5678", + "store_path": "/nix/store/ccc-nixos-system-pifinder", + "available": True, + }, + ], + }, + } + mock_get.return_value = mock_resp - @patch("PiFinder.ui.software.requests.get") - def test_returns_dict_when_gate_closed(self, mock_get): - # Gate check is the caller's job; fetch just parses the JSON. - payload = {"nixos_for_everyone": False} - mock_get.return_value = _mock_json_response(payload) - assert _fetch_migration_config() == payload + channels = _fetch_update_manifest() - @patch("PiFinder.ui.software.requests.get") - def test_returns_dict_without_url(self, mock_get): - # The tarball comes from the manifest now, so the gate no longer needs a - # nixos_url — only the nixos_for_everyone flag matters to the caller. - payload = {"nixos_for_everyone": True} - mock_get.return_value = _mock_json_response(payload) - assert _fetch_migration_config() == payload + assert channels["stable"][0]["ref"] == "/nix/store/aaa-nixos-system-pifinder" + assert channels["stable"][0]["channel"] == "stable" + assert channels["unstable"][0]["is_trunk"] is True + assert channels["unstable"][1]["label"] == "PR#42-def5678" + mock_get.assert_called_once_with(UPDATE_MANIFEST_URL, timeout=10) @patch("PiFinder.ui.software.requests.get") - def test_returns_none_on_http_error(self, mock_get): - mock_get.return_value = _mock_json_response( - {"nixos_for_everyone": True, "nixos_url": _NIXOS_URL}, status_code=404 - ) - assert _fetch_migration_config() is None + def test_unavailable_manifest_entry_has_no_ref(self, mock_get): + mock_resp = MagicMock() + mock_resp.raise_for_status.return_value = None + mock_resp.json.return_value = { + "schema": 1, + "channels": { + "stable": [], + "beta": [], + "unstable": [ + { + "kind": "trunk", + "label": "main", + "title": "main branch", + "version": "main", + "store_path": None, + "available": False, + "reason": "no build", + } + ], + }, + } + mock_get.return_value = mock_resp - @patch("PiFinder.ui.software.requests.get") - def test_returns_none_on_connection_error(self, mock_get): - mock_get.side_effect = requests.exceptions.ConnectionError - assert _fetch_migration_config() is None + channels = _fetch_update_manifest() - @patch("PiFinder.ui.software.requests.get") - def test_returns_none_on_timeout(self, mock_get): - mock_get.side_effect = requests.exceptions.Timeout - assert _fetch_migration_config() is None + entry = channels["unstable"][0] + assert entry["ref"] is None + assert entry["unavailable"] is True + assert entry["subtitle"] == "main branch (no build)" @patch("PiFinder.ui.software.requests.get") - def test_returns_none_on_malformed_json(self, mock_get): - mock_get.return_value = _mock_invalid_json_response() - assert _fetch_migration_config() is None + def test_invalid_store_path_is_unavailable(self, mock_get): + mock_resp = MagicMock() + mock_resp.raise_for_status.return_value = None + mock_resp.json.return_value = { + "schema": 1, + "channels": { + "stable": [], + "beta": [], + "unstable": [ + { + "kind": "pr", + "label": "PR#42-abcdef0", + "title": "Bad build", + "version": "PR#42-abcdef0", + "store_path": "not-a-store-path", + "available": True, + } + ], + }, + } + mock_get.return_value = mock_resp + + channels = _fetch_update_manifest() + + entry = channels["unstable"][0] + assert entry["ref"] is None + assert entry["unavailable"] is True + assert entry["subtitle"] == "Bad build (invalid build)" @patch("PiFinder.ui.software.requests.get") - def test_returns_none_when_payload_is_not_object(self, mock_get): - mock_get.return_value = _mock_json_response(["nixos_for_everyone"]) - assert _fetch_migration_config() is None - - -def _migration_entry(version="3.0.0", available=True, with_urls=True): - entry = {"version": version, "available": available} - if with_urls: - base = f"https://example.invalid/releases/download/v{version}" - entry["migration_url"] = f"{base}/pifinder-migration-v{version}.tar.zst" - entry["migration_sha256_url"] = ( - f"{base}/pifinder-migration-v{version}.tar.zst.sha256" - ) - return entry + def test_rejects_unknown_schema(self, mock_get): + mock_resp = MagicMock() + mock_resp.raise_for_status.return_value = None + mock_resp.json.return_value = {"schema": 99, "channels": {}} + mock_get.return_value = mock_resp + with pytest.raises(ValueError): + _fetch_update_manifest() -def _manifest(stable=None, beta=None, unstable=None): - return { - "channels": { - "stable": stable or [], - "beta": beta or [], - "unstable": unstable or [], - } + +@pytest.mark.unit +def test_unstable_list_hides_exact_running_build(): + # The running build is hidden from unstable by store-path identity; a + # rebuilt PR (same number, new store path) is a real upgrade and stays. + ui = UISoftware.__new__(UISoftware) + ui._channel_names = ["unstable"] + ui._channel_index = 0 + ui._software_version = "PR#1-abcdef0" + ui._channels = { + "unstable": [ + { + "label": "nixos-trunk", + "version": "nixos-trunk", + "is_trunk": True, + "ref": "/nix/store/bbb-trunk", + }, + { + "label": "PR#1-abcdef0", + "version": "PR#1-abcdef0", + "ref": "/nix/store/aaa-running", + }, + ] } + with patch( + "PiFinder.ui.software._current_store_path", + return_value="/nix/store/aaa-running", + ): + ui._refresh_version_list() + + assert [entry["label"] for entry in ui._version_list] == ["nixos-trunk"] + @pytest.mark.unit -class TestFetchUpdateManifest: - @patch("PiFinder.ui.software.requests.get") - def test_returns_dict(self, mock_get): - payload = {"channels": {}} - mock_get.return_value = _mock_json_response(payload) - assert _fetch_update_manifest() == payload +def test_stable_list_filters_current_build_by_store_path(): + ui = UISoftware.__new__(UISoftware) + ui._channel_names = ["stable"] + ui._channel_index = 0 + ui._software_version = "3.0.0" + ui._channels = { + "stable": [ + {"label": "v3.0.0", "version": "3.0.0", "ref": "/nix/store/aaa-current"}, + {"label": "v3.1.0", "version": "3.1.0", "ref": "/nix/store/bbb-next"}, + ] + } - @patch("PiFinder.ui.software.requests.get") - def test_none_on_http_error(self, mock_get): - mock_get.return_value = _mock_json_response({}, status_code=500) - assert _fetch_update_manifest() is None + with patch( + "PiFinder.ui.software._current_store_path", + return_value="/nix/store/aaa-current", + ): + ui._refresh_version_list() - @patch("PiFinder.ui.software.requests.get") - def test_none_on_malformed_json(self, mock_get): - mock_get.return_value = _mock_invalid_json_response() - assert _fetch_update_manifest() is None + assert [entry["label"] for entry in ui._version_list] == ["v3.1.0"] -def _mock_head_response(size_bytes=None, status_code=200): - resp = MagicMock() - resp.status_code = status_code - resp.headers = {} if size_bytes is None else {"Content-Length": str(size_bytes)} - return resp +@pytest.mark.unit +def test_recut_release_with_same_version_stays_visible(): + # A re-cut release reuses its version/label but is a different store path + # — it must be offered as an upgrade, not hidden by a version-string match. + ui = UISoftware.__new__(UISoftware) + ui._channel_names = ["beta"] + ui._channel_index = 0 + ui._software_version = "3.0.0" + ui._channels = { + "beta": [ + {"label": "v3.0.0-beta", "version": "3.0.0", "ref": "/nix/store/bbb-recut"}, + ] + } + + with patch( + "PiFinder.ui.software._current_store_path", + return_value="/nix/store/aaa-old-build", + ): + ui._refresh_version_list() + + assert [entry["label"] for entry in ui._version_list] == ["v3.0.0-beta"] -# Selection also HEADs the chosen tarball for its size, so requests.head is -# stubbed throughout (never hit the network from tests). @pytest.mark.unit -@patch( - "PiFinder.ui.software.requests.head", - side_effect=requests.exceptions.ConnectionError, -) -class TestMigrationVersionInfoFromManifest: - @patch("PiFinder.ui.software.requests.get") - def test_prefers_stable(self, mock_get, _mock_head): - mock_get.return_value = _mock_json_response( - _manifest( - stable=[_migration_entry("3.0.0")], - beta=[_migration_entry("3.1.0-beta")], - unstable=[_migration_entry("nixos-abc")], - ) - ) - info = _migration_version_info_from_manifest() - assert info["version"] == "3.0.0" - assert info["type"] == "upgrade" - assert info["migration_url"].endswith("pifinder-migration-v3.0.0.tar.zst") - assert info["migration_sha256_url"].endswith(".sha256") +def test_unknown_current_build_hides_nothing(): + ui = UISoftware.__new__(UISoftware) + ui._channel_names = ["stable"] + ui._channel_index = 0 + ui._software_version = "3.0.0" + ui._channels = { + "stable": [ + {"label": "v3.0.0", "version": "3.0.0", "ref": "/nix/store/aaa"}, + ] + } - @patch("PiFinder.ui.software.requests.get") - def test_includes_size_when_head_succeeds(self, mock_get, mock_head): - mock_get.return_value = _mock_json_response( - _manifest(stable=[_migration_entry("3.0.0")]) - ) - mock_head.side_effect = None - mock_head.return_value = _mock_head_response(size_bytes=300 * 1024 * 1024) - info = _migration_version_info_from_manifest() - assert info["migration_size_mb"] == 300 + with patch("PiFinder.ui.software._current_store_path", return_value=None): + ui._refresh_version_list() - @patch("PiFinder.ui.software.requests.get") - def test_omits_size_when_head_fails(self, mock_get, _mock_head): - mock_get.return_value = _mock_json_response( - _manifest(stable=[_migration_entry("3.0.0")]) - ) - info = _migration_version_info_from_manifest() - assert "migration_size_mb" not in info + assert [entry["label"] for entry in ui._version_list] == ["v3.0.0"] - @patch("PiFinder.ui.software.requests.get") - def test_falls_back_to_beta_when_stable_empty(self, mock_get, _mock_head): - mock_get.return_value = _mock_json_response( - _manifest(beta=[_migration_entry("3.1.0-beta")]) - ) - assert _migration_version_info_from_manifest()["version"] == "3.1.0-beta" - @patch("PiFinder.ui.software.requests.get") - def test_falls_back_to_unstable_last(self, mock_get, _mock_head): - mock_get.return_value = _mock_json_response( - _manifest(unstable=[_migration_entry("nixos-abc")]) +@pytest.mark.unit +def test_unavailable_version_has_no_install_option(): + ui = UISoftware.__new__(UISoftware) + ui._phase = "browse" + ui._focus = "list" + ui._list_index = 0 + ui._version_list = [ + { + "label": "main", + "version": "main", + "subtitle": "main branch (no build)", + "unavailable": True, + } + ] + + ui.key_right() + + assert ui._phase == "confirm" + assert ui._confirm_options == ["Cancel"] + + +def _iso_ago(**delta) -> str: + return (datetime.now(timezone.utc) - timedelta(**delta)).isoformat() + + +@pytest.mark.unit +class TestFormatAge: + def test_minutes(self): + assert _format_age(_iso_ago(minutes=5)) == "5m ago" + + def test_hours(self): + assert _format_age(_iso_ago(hours=3, minutes=10)) == "3h ago" + + def test_days(self): + assert _format_age(_iso_ago(days=2, hours=1)) == "2d ago" + + def test_future_timestamp_clamps_to_zero(self): + assert _format_age(_iso_ago(minutes=-5)) == "0m ago" + + def test_none(self): + assert _format_age(None) is None + + def test_garbage(self): + assert _format_age("not-a-date") is None + + +@pytest.mark.unit +class TestEntryRowParts: + def test_pr_row_leads_with_bare_number(self): + prefix, text = _entry_row_parts( + { + "kind": "pr", + "number": 534, + "label": "PR#534-2692406", + "title": "feat(catalog): add observable asteroids", + } ) - assert _migration_version_info_from_manifest()["version"] == "nixos-abc" + assert prefix == "534 " + assert text == "feat(catalog): add observable asteroids" + + def test_trunk_row_shows_branch_name(self): + prefix, text = _entry_row_parts( + { + "kind": "trunk", + "is_trunk": True, + "label": "nixos-d1657e6", + "source_ref": "nixos", + } + ) + assert prefix == "• " + assert text == "nixos" - @patch("PiFinder.ui.software.requests.get") - def test_skips_unavailable_entries(self, mock_get, _mock_head): - mock_get.return_value = _mock_json_response( - _manifest( - stable=[_migration_entry("3.0.0", available=False)], - beta=[_migration_entry("3.1.0-beta")], - ) + def test_release_row_shows_label(self): + prefix, text = _entry_row_parts( + {"kind": "release", "label": "v3.0.0-beta", "title": "PiFinder v3.0.0-beta"} ) - assert _migration_version_info_from_manifest()["version"] == "3.1.0-beta" + assert prefix == "" + assert text == "v3.0.0-beta" - @patch("PiFinder.ui.software.requests.get") - def test_skips_entries_without_migration_tarball(self, mock_get, _mock_head): - mock_get.return_value = _mock_json_response( - _manifest( - stable=[_migration_entry("3.0.0", with_urls=False)], - beta=[_migration_entry("3.1.0-beta")], - ) + +@pytest.mark.unit +class TestEntryDetail: + def test_unavailable_reason_wins_over_age(self): + entry = { + "unavailable": True, + "subtitle": "Broken build (not in cache)", + "built_at": _iso_ago(minutes=5), + } + assert _entry_detail(entry) == "Broken build (not in cache)" + + def test_build_age_and_short_hash_when_available(self): + entry = { + "subtitle": "Some title", + "built_at": _iso_ago(minutes=12), + "source_sha": "2692406bff684a56a2acce1febffb015aad72038", + } + assert _entry_detail(entry) == "built 12m ago · 2692406" + + def test_build_age_without_hash(self): + entry = {"subtitle": "Some title", "built_at": _iso_ago(minutes=12)} + assert _entry_detail(entry) == "built 12m ago" + + def test_hash_without_build_age(self): + entry = {"subtitle": "Some title", "source_sha": "d1657e66b6ca4e14"} + assert _entry_detail(entry) == "d1657e6" + + def test_falls_back_to_subtitle_without_build_info(self): + assert _entry_detail({"subtitle": "Some title"}) == "Some title" + + +@pytest.mark.unit +class TestTrunkNixosMarker: + def _manifest_with_trunk(self, **extra): + trunk = { + "kind": "trunk", + "label": "main-abc1234", + "title": "main branch", + "version": "main-abc1234", + "source_repo": "brickbots/PiFinder", + "source_ref": "main", + "store_path": "/nix/store/aaa-nixos-system-pifinder", + "available": True, + } + trunk.update(extra) + return {"schema": 1, "channels": {"unstable": [trunk]}} + + def test_parse_drops_trunk_marked_non_nixos(self): + channels = _parse_manifest(self._manifest_with_trunk(nixos_branch=False)) + assert channels["unstable"] == [] + + def test_parse_keeps_trunk_marked_nixos(self): + channels = _parse_manifest(self._manifest_with_trunk(nixos_branch=True)) + assert channels["unstable"][0]["is_trunk"] is True + + def test_parse_keeps_unannotated_trunk(self): + channels = _parse_manifest(self._manifest_with_trunk()) + assert len(channels["unstable"]) == 1 + + @patch("PiFinder.ui.software.requests.head") + def test_annotate_marks_nixos_branch(self, mock_head): + mock_head.return_value = MagicMock(status_code=200) + manifest = self._manifest_with_trunk() + _annotate_trunk_entries(manifest) + assert manifest["channels"]["unstable"][0]["nixos_branch"] is True + url = mock_head.call_args[0][0] + assert url == ( + "https://raw.githubusercontent.com/brickbots/PiFinder/main/flake.nix" ) - assert _migration_version_info_from_manifest()["version"] == "3.1.0-beta" - @patch("PiFinder.ui.software.requests.get") - def test_none_when_no_migration_entries(self, mock_get, _mock_head): - mock_get.return_value = _mock_json_response(_manifest()) - assert _migration_version_info_from_manifest() is None + @patch("PiFinder.ui.software.requests.head") + def test_annotate_marks_non_nixos_branch(self, mock_head): + mock_head.return_value = MagicMock(status_code=404) + manifest = self._manifest_with_trunk() + _annotate_trunk_entries(manifest) + assert manifest["channels"]["unstable"][0]["nixos_branch"] is False - @patch("PiFinder.ui.software.requests.get") - def test_none_on_network_error(self, mock_get, _mock_head): - mock_get.side_effect = requests.exceptions.ConnectionError - assert _migration_version_info_from_manifest() is None + @patch("PiFinder.ui.software.requests.head") + def test_annotate_leaves_entry_alone_on_network_error(self, mock_head): + mock_head.side_effect = requests.exceptions.ConnectionError + manifest = self._manifest_with_trunk() + _annotate_trunk_entries(manifest) + assert "nixos_branch" not in manifest["channels"]["unstable"][0] - @patch("PiFinder.ui.software.requests.get") - def test_none_when_channels_missing(self, mock_get, _mock_head): - mock_get.return_value = _mock_json_response({"schema": 1}) - assert _migration_version_info_from_manifest() is None + +@pytest.mark.unit +class TestManifestCache: + def test_round_trip(self, tmp_path): + manifest = {"schema": 1, "channels": {"stable": [], "beta": [], "unstable": []}} + cache = tmp_path / "update_manifest.json" + with patch("PiFinder.ui.software.MANIFEST_CACHE_PATH", cache): + _save_cached_manifest(manifest) + assert _load_cached_manifest() == manifest + + def test_missing_cache_returns_none(self, tmp_path): + cache = tmp_path / "update_manifest.json" + with patch("PiFinder.ui.software.MANIFEST_CACHE_PATH", cache): + assert _load_cached_manifest() is None + + def test_wrong_schema_returns_none(self, tmp_path): + cache = tmp_path / "update_manifest.json" + cache.write_text('{"schema": 99}') + with patch("PiFinder.ui.software.MANIFEST_CACHE_PATH", cache): + assert _load_cached_manifest() is None + + def test_corrupt_cache_returns_none(self, tmp_path): + cache = tmp_path / "update_manifest.json" + cache.write_text("{nope") + with patch("PiFinder.ui.software.MANIFEST_CACHE_PATH", cache): + assert _load_cached_manifest() is None + + +@pytest.mark.unit +class TestManualRefresh: + def _ui(self, phase): + ui = UISoftware.__new__(UISoftware) + ui._phase = phase + ui._key_buffer = [] + ui._elipsis_count = 30 + return ui + + def test_square_refetches_in_browse(self): + ui = self._ui("browse") + with patch.object(UISoftware, "_start_refresh") as mock_start: + ui.key_square() + mock_start.assert_called_once() + assert ui._phase == "browse" + + def test_square_retries_from_offline_via_loading(self): + ui = self._ui("offline") + with patch.object(UISoftware, "_start_refresh") as mock_start: + ui.key_square() + mock_start.assert_called_once() + assert ui._phase == "loading" + + def test_square_does_not_refetch_in_confirm(self): + ui = self._ui("confirm") + with patch.object(UISoftware, "_start_refresh") as mock_start: + ui.key_square() + mock_start.assert_not_called() + + +@pytest.mark.unit +class TestListRollbackTargets: + def _targets(self, value): + ui = UISoftware.__new__(UISoftware) + with patch("PiFinder.ui.software.sys_utils") as mock_sys: + mock_sys.list_rollback_targets.return_value = value + return ui._list_rollback_targets() + + def test_valid_entries_pass_through(self): + entries = [{"label": "gen 42", "ref": "/nix/store/aaa"}] + assert self._targets(entries) == entries + + def test_non_dict_and_unlabeled_entries_dropped(self): + entries = [ + "garbage", + {"ref": "/nix/store/aaa"}, + {"label": 7}, + {"label": "gen 42"}, + ] + assert self._targets(entries) == [{"label": "gen 42"}] + + def test_non_iterable_result_yields_empty(self): + assert self._targets(None) == [] + + +@pytest.mark.unit +class TestConsumeRefreshResult: + def _ui(self, phase): + ui = UISoftware.__new__(UISoftware) + ui._phase = phase + ui._checking = True + ui._check_failed = False + ui._refresh_result = None + return ui + + def test_success_moves_loading_to_browse(self): + ui = self._ui("loading") + ui._refresh_result = ("ok", {"stable": [], "beta": [], "unstable": []}) + with patch.object(UISoftware, "_apply_manifest") as mock_apply: + ui._consume_refresh_result() + assert ui._phase == "browse" + assert ui._checking is False + assert ui._check_failed is False + mock_apply.assert_called_once() + + def test_failure_without_cache_or_rollback_goes_offline(self): + ui = self._ui("loading") + ui._refresh_result = ("error", None) + with patch.object(UISoftware, "_list_rollback_targets", return_value=[]): + ui._consume_refresh_result() + assert ui._phase == "offline" + assert ui._checking is False + + def test_failure_with_cached_list_only_flags(self): + ui = self._ui("browse") + ui._refresh_result = ("error", None) + ui._consume_refresh_result() + assert ui._phase == "browse" + assert ui._check_failed is True + + def test_no_result_is_a_noop(self): + ui = self._ui("browse") + ui._consume_refresh_result() + assert ui._checking is True diff --git a/python/tests/test_solver_shmem.py b/python/tests/test_solver_shmem.py index 0a536da4a..e54bb2043 100644 --- a/python/tests/test_solver_shmem.py +++ b/python/tests/test_solver_shmem.py @@ -1,11 +1,16 @@ -"""Regression test for stale cedar_detect shared-memory cleanup. +"""Regression tests for cedar_detect shared-memory recovery on restart. -A solver process that is killed leaks its POSIX shmem segment; the next -PFCedarDetectClient must clear it at startup instead of dying on -FileExistsError on every solve. +All cedar clients share one hard-coded segment name, so a second client on +the same host (e.g. an offline analysis script) can leave the server's +cached fd pointing at its own frozen image — the live solver then "solves" +that frame forever. A solver restart must always recover: clear whatever +segment exists at startup, and force the server to reopen the fresh one on +the first request. A killed solver similarly leaks its segment; the next +client must clear it instead of dying on FileExistsError on every solve. """ from multiprocessing import shared_memory +from types import SimpleNamespace import pytest @@ -38,3 +43,31 @@ def test_clear_stale_shmem_unlinks_leaked_segment(monkeypatch): stray.unlink() except FileNotFoundError: pass + + +@pytest.mark.unit +def test_alloc_shmem_requests_reopen_on_fresh_segment(monkeypatch): + # Restart recovery: the first allocation after startup must return True + # so the request sets reopen_shmem and the server drops a cached fd that + # may point at another client's (possibly unlinked) segment. Upstream's + # _alloc_shmem returns False here — only PFCedarDetectClient's override + # guarantees a restart always resynchronizes solver and server. + name = "/cedar_detect_image_pftest_fresh" + monkeypatch.setattr( + "tetra3.cedar_detect_client.shared_memory", + SimpleNamespace( + SharedMemory=lambda _name, create=False, size=0: ( + shared_memory.SharedMemory(name, create=create, size=size) + ) + ), + ) + + client = object.__new__(PFCedarDetectClient) + client._shmem = None + client._shmem_size = 0 + try: + assert client._alloc_shmem(16) is True # fresh segment → reopen + assert client._alloc_shmem(16) is False # unchanged → no reopen + assert client._alloc_shmem(32) is True # resized → reopen + finally: + client._del_shmem() diff --git a/python/tests/test_solver_sqm.py b/python/tests/test_solver_sqm.py index 50dbd1a01..a513b974d 100644 --- a/python/tests/test_solver_sqm.py +++ b/python/tests/test_solver_sqm.py @@ -334,3 +334,36 @@ def test_radiometer_duplicate_sequence_not_refed(self): ) # Same camera frame seen twice by the loop: fed exactly once. assert black_level.add_sample.call_count == 1 + + def test_imx462_publishes_frame_paired_colour_and_tracker_diagnostics(self): + shared_state, calc, black_level, sample = self._radiometer_harness() + sample.update( + { + "background_per_pixel": 280.0, + "background_red": 275.0, + "background_blue": 265.0, + } + ) + accumulator = solver.RadiometerAccumulator() + airglow = solver.AirglowTracker("imx462") + assert solver.update_radiometric_sqm( + shared_state, + calc, + accumulator, + sample, + now=1001.0, + black_level_tracker=black_level, + airglow_tracker=airglow, + ) + details = shared_state.set_sqm_details.call_args[0][0] + diagnostic = details["airglow_diagnostic"] + assert diagnostic["valid"] is True + assert diagnostic["pedestal"] == 237.5 + assert diagnostic["pedestal_source"] == "tracked_or_calibrated" + assert details["pedestal"] == 237.5 + assert details["skyglow_floor"] == diagnostic["correction_adu_per_sec"] + assert details["radiometric_zero_point"] == 15.19 + assert details["window_airglow"]["samples"][0] == diagnostic + stored = details["window_radiometer"]["samples"][0] + assert stored["paired_pedestal"] == 237.5 + assert stored["paired_radiometric_zero_point"] == 15.19 diff --git a/python/tests/test_sys_utils.py b/python/tests/test_sys_utils.py index ce9b1f1b2..02e1e33b1 100644 --- a/python/tests/test_sys_utils.py +++ b/python/tests/test_sys_utils.py @@ -106,6 +106,29 @@ def test_rewrite_hosts_ignores_commented_line(): assert "# 127.0.1.1 oldname\n" in result assert result.endswith("127.0.1.1\tpf-rich\n") + @pytest.mark.unit + def test_upgrade_progress_missing_status_failed_service(tmp_path, monkeypatch): + monkeypatch.setattr(sys_utils, "UPGRADE_STATUS_FILE", tmp_path / "missing") + monkeypatch.setattr(sys_utils, "_upgrade_service_state", lambda: "failed") + + assert sys_utils.get_upgrade_progress()["phase"] == "failed" + + @pytest.mark.unit + def test_upgrade_progress_stale_downloading_failed_service(tmp_path, monkeypatch): + status = tmp_path / "upgrade-status" + status.write_text("downloading 1/10 paths") + monkeypatch.setattr(sys_utils, "UPGRADE_STATUS_FILE", status) + monkeypatch.setattr(sys_utils, "_upgrade_service_state", lambda: "failed") + + assert sys_utils.get_upgrade_progress()["phase"] == "failed" + + @pytest.mark.unit + def test_upgrade_progress_missing_status_active_service(tmp_path, monkeypatch): + monkeypatch.setattr(sys_utils, "UPGRADE_STATUS_FILE", tmp_path / "missing") + monkeypatch.setattr(sys_utils, "_upgrade_service_state", lambda: "active") + + assert sys_utils.get_upgrade_progress()["phase"] == "starting" + -except ImportError: +except (ImportError, ValueError): pass diff --git a/python/tests/test_telemetry.py b/python/tests/test_telemetry.py index 66febe74f..039aa9daf 100644 --- a/python/tests/test_telemetry.py +++ b/python/tests/test_telemetry.py @@ -12,6 +12,7 @@ import pytest import quaternion as quaternion_module +from PiFinder import telemetry as telemetry_module from PiFinder.telemetry import ( TelemetryManager, TelemetryPlayer, @@ -95,20 +96,26 @@ def _make_shared_state(location=None, dt=None): return ss +_ALL_SECTIONS = ["imu", "sqm", "solve", "target", "images"] + + def _make_cfg( telemetry_record=False, - telemetry_images=False, screen_direction="flat", mount_type="Alt/Az", + telemetry_sections=None, + telemetry_max_session_mb=0, ): cfg = MagicMock() + sections = list(_ALL_SECTIONS if telemetry_sections is None else telemetry_sections) def get_option(key): return { "telemetry_record": telemetry_record, - "telemetry_images": telemetry_images, "screen_direction": screen_direction, "mount_type": mount_type, + "telemetry_sections": sections, + "telemetry_max_session_mb": telemetry_max_session_mb, }.get(key) cfg.get_option = get_option @@ -243,6 +250,250 @@ def sample(seq, t): finally: rec.stop() + def test_record_radio_logs_ingredients_and_derived(self, tmp_path): + with patch("PiFinder.telemetry.TELEMETRY_DIR", tmp_path / "telemetry"): + rec = TelemetryRecorder() + rec.start(_make_cfg(), _make_shared_state()) + try: + rec.record_radio( + { + "sequence": 7, + "captured_at": 200.0, + "exposure_sec": 1.0, + "background_per_pixel": 515.0, + "background_mad": 28.0, + "background_gradient": 12.0, + "background_red": 540.0, + "background_blue": 470.0, + "optical_black_pedestal": 238.0, + "pixels_per_side": 512, + }, + sqm=20.9, + floor=51.5, + ) + event = json.loads(rec._buffer[-1]) + # raw ingredients — recompute-able under a future calculation + assert event["bg"] == 515.0 + assert event["red"] == 540.0 + assert event["blue"] == 470.0 + assert event["ped"] == 238.0 + assert event["px"] == 512 + # derived audit values — what the device published + assert event["sqm"] == 20.9 + assert event["floor"] == 51.5 + finally: + rec.stop() + + def test_record_radio_optional_fields_default_none(self, tmp_path): + """Mono sensor / no published SQM: optional fields serialize as None.""" + with patch("PiFinder.telemetry.TELEMETRY_DIR", tmp_path / "telemetry"): + rec = TelemetryRecorder() + rec.start(_make_cfg(), _make_shared_state()) + try: + rec.record_radio( + { + "sequence": 1, + "captured_at": 100.0, + "exposure_sec": 1.0, + "background_per_pixel": 515.0, + "background_mad": 28.0, + "background_gradient": 12.0, + } + ) + event = json.loads(rec._buffer[-1]) + for key in ("red", "blue", "ped", "px", "sqm", "floor"): + assert event[key] is None + finally: + rec.stop() + + def test_no_cap_by_default(self, tmp_path): + with patch("PiFinder.telemetry.TELEMETRY_DIR", tmp_path / "telemetry"): + rec = TelemetryRecorder() + rec.start(_make_cfg(), _make_shared_state()) + try: + assert rec.max_session_bytes == 0 + assert rec.images_capped is False + finally: + rec.stop() + + def test_session_cap_suspends_images(self, tmp_path): + """Once the session dir exceeds the cap, frame capture is suspended.""" + with patch("PiFinder.telemetry.TELEMETRY_DIR", tmp_path / "telemetry"): + rec = TelemetryRecorder() + rec.start(_make_cfg(telemetry_max_session_mb=1), _make_shared_state()) + try: + assert rec.max_session_bytes == 1024 * 1024 + rec._refresh_session_bytes() + assert rec.images_capped is False # header only, well under 1 MB + + # Simulate saved frames pushing the session past the cap. + (rec.get_session_dir() / "img_1.png").write_bytes(b"x" * 1_200_000) + rec._refresh_session_bytes() + assert rec.session_bytes >= 1024 * 1024 + assert rec.images_capped is True + finally: + rec.stop() + + def test_header_snapshots_sqm_calibration(self, tmp_path): + with patch("PiFinder.telemetry.TELEMETRY_DIR", tmp_path / "telemetry"): + rec = TelemetryRecorder() + ss = _make_shared_state() + ss.camera_type.return_value = "imx462" + rec.start(_make_cfg(), ss) + try: + cfg_hdr = json.loads(rec._buffer[0])["cfg"] + assert cfg_hdr["camera_type"] == "imx462" + cal = cfg_hdr["sqm_calibration"] + # full profile is captured, not a hand-picked subset + assert "radiometric_zero_point" in cal["profile"] + assert "radiometric_fov_degrees" in cal["profile"] + assert "bias_offset" in cal["profile"] + # Airglow constants only exist on branches carrying the model. + if telemetry_module.airglow is not None: + assert cal["airglow"]["red_response"] == 4.07 + finally: + rec.stop() + + def test_header_calibration_mono_has_no_airglow(self, tmp_path): + with patch("PiFinder.telemetry.TELEMETRY_DIR", tmp_path / "telemetry"): + rec = TelemetryRecorder() + ss = _make_shared_state() + ss.camera_type.return_value = "imx296" # mono: no airglow entry + rec.start(_make_cfg(), ss) + try: + cal = json.loads(rec._buffer[0])["cfg"]["sqm_calibration"] + assert "profile" in cal + assert "airglow" not in cal + finally: + rec.stop() + + def test_header_calibration_none_for_unknown_camera(self, tmp_path): + with patch("PiFinder.telemetry.TELEMETRY_DIR", tmp_path / "telemetry"): + rec = TelemetryRecorder() + ss = _make_shared_state() + ss.camera_type.return_value = "no_such_cam" + rec.start(_make_cfg(), ss) + try: + cfg_hdr = json.loads(rec._buffer[0])["cfg"] + assert cfg_hdr["camera_type"] == "no_such_cam" + assert cfg_hdr["sqm_calibration"] is None + finally: + rec.stop() + + def test_sections_default_all_on(self, tmp_path): + with patch("PiFinder.telemetry.TELEMETRY_DIR", tmp_path / "telemetry"): + rec = TelemetryRecorder() + rec.start(_make_cfg(), _make_shared_state()) + try: + assert rec.sections == { + "imu": True, + "sqm": True, + "solve": True, + "target": True, + "images": True, + } + finally: + rec.stop() + + def test_imu_section_off_skips_imu_only(self, tmp_path): + with patch("PiFinder.telemetry.TELEMETRY_DIR", tmp_path / "telemetry"): + rec = TelemetryRecorder() + rec.start( + _make_cfg(telemetry_sections=["sqm", "solve", "target"]), + _make_shared_state(), + ) + try: + base = len(rec._buffer) + rec.record_imu(_make_imu_sample(moving=True)) + assert len(rec._buffer) == base # IMU gated off + rec.record_radio( + { + "sequence": 1, + "captured_at": 100.0, + "exposure_sec": 1.0, + "background_per_pixel": 515.0, + "background_mad": 28.0, + "background_gradient": 12.0, + } + ) + assert len(rec._buffer) == base + 1 # SQM still records + finally: + rec.stop() + + def test_sqm_section_off_skips_radio(self, tmp_path): + with patch("PiFinder.telemetry.TELEMETRY_DIR", tmp_path / "telemetry"): + rec = TelemetryRecorder() + rec.start( + _make_cfg(telemetry_sections=["imu", "solve", "target"]), + _make_shared_state(), + ) + try: + base = len(rec._buffer) + rec.record_radio( + { + "sequence": 1, + "captured_at": 100.0, + "exposure_sec": 1.0, + "background_per_pixel": 515.0, + } + ) + assert len(rec._buffer) == base + finally: + rec.stop() + + def test_solve_section_off_skips_solve(self, tmp_path): + with patch("PiFinder.telemetry.TELEMETRY_DIR", tmp_path / "telemetry"): + rec = TelemetryRecorder() + rec.start( + _make_cfg(telemetry_sections=["imu", "sqm", "target"]), + _make_shared_state(), + ) + try: + base = len(rec._buffer) + result = rec.record_solve(_make_successful_solve()) + assert result is None + assert len(rec._buffer) == base + finally: + rec.stop() + + def test_target_section_off_skips_target(self, tmp_path): + with patch("PiFinder.telemetry.TELEMETRY_DIR", tmp_path / "telemetry"): + rec = TelemetryRecorder() + rec.start( + _make_cfg(telemetry_sections=["imu", "sqm", "solve"]), + _make_shared_state(), + ) + try: + base = len(rec._buffer) + target = MagicMock() + target.object_id = 42 + target.display_name = "M31" + target.ra = 10.68 + target.dec = 41.27 + rec.record_target(target, alt=45.0, az=90.0) + assert len(rec._buffer) == base + finally: + rec.stop() + + def test_apply_sections_updates_live_recording(self, tmp_path): + with patch("PiFinder.telemetry.TELEMETRY_DIR", tmp_path / "telemetry"): + rec = TelemetryRecorder() + rec.start(_make_cfg(), _make_shared_state()) + try: + base = len(rec._buffer) + rec.record_imu(_make_imu_sample(moving=True, timestamp=1000.0)) + assert len(rec._buffer) == base + 1 # recorded while on + + rec.apply_sections( + _make_cfg(telemetry_sections=["sqm", "solve", "target"]) + ) + assert rec.sections["imu"] is False + # Distinct timestamp so IMU dedup can't mask the section gate. + rec.record_imu(_make_imu_sample(moving=True, timestamp=1001.0)) + assert len(rec._buffer) == base + 1 # now gated off + finally: + rec.stop() + def test_record_imu_when_enabled(self, tmp_path): with patch("PiFinder.telemetry.TELEMETRY_DIR", tmp_path / "telemetry"): rec = TelemetryRecorder() @@ -774,6 +1025,59 @@ def test_handle_command_record_on(self, tmp_path): finally: mgr.stop() + def test_record_radio_stamps_published_sqm_and_floor(self, tmp_path): + """The manager pulls the last published SQM/floor from shared state.""" + with patch("PiFinder.telemetry.TELEMETRY_DIR", tmp_path / "telemetry"): + ss = _make_shared_state() + ss.sqm.return_value = MagicMock(value=20.9) + ss.sqm_details.return_value = {"skyglow_floor": 51.5} + cq = queue.Queue() + mgr = TelemetryManager(_make_cfg(telemetry_record=True), ss, cq) + try: + mgr.record_radio( + { + "sequence": 1, + "captured_at": 100.0, + "exposure_sec": 1.0, + "background_per_pixel": 515.0, + "background_mad": 28.0, + "background_gradient": 12.0, + "background_red": 540.0, + } + ) + event = json.loads(mgr._recorder._buffer[-1]) + assert event["e"] == "radio" + assert event["red"] == 540.0 + assert event["sqm"] == 20.9 + assert event["floor"] == 51.5 + finally: + mgr.stop() + + def test_record_radio_survives_missing_sqm_state(self, tmp_path): + """No SQM published yet: sqm/floor log as None, recording continues.""" + with patch("PiFinder.telemetry.TELEMETRY_DIR", tmp_path / "telemetry"): + ss = _make_shared_state() + ss.sqm.return_value = None + ss.sqm_details.return_value = None + cq = queue.Queue() + mgr = TelemetryManager(_make_cfg(telemetry_record=True), ss, cq) + try: + mgr.record_radio( + { + "sequence": 1, + "captured_at": 100.0, + "exposure_sec": 1.0, + "background_per_pixel": 515.0, + "background_mad": 28.0, + "background_gradient": 12.0, + } + ) + event = json.loads(mgr._recorder._buffer[-1]) + assert event["sqm"] is None + assert event["floor"] is None + finally: + mgr.stop() + def test_handle_command_record_off(self, tmp_path): with patch("PiFinder.telemetry.TELEMETRY_DIR", tmp_path / "telemetry"): cq = queue.Queue() @@ -982,10 +1286,10 @@ def test_record_solve_delegates(self): def test_record_solve_sends_image_command(self, tmp_path): with patch("PiFinder.telemetry.TELEMETRY_DIR", tmp_path / "telemetry"): cam_q = queue.Queue() - cfg = _make_cfg(telemetry_images=True) - mgr = TelemetryManager(cfg, _make_shared_state(), queue.Queue(), cam_q) - mgr._recorder.start(_make_cfg(), _make_shared_state()) - mgr._recorder.images_enabled = True + mgr = TelemetryManager( + _make_cfg(), _make_shared_state(), queue.Queue(), cam_q + ) + mgr._recorder.start(_make_cfg(), _make_shared_state()) # images section on try: mgr.record_solve(_make_successful_solve()) msg = cam_q.get_nowait() @@ -993,6 +1297,45 @@ def test_record_solve_sends_image_command(self, tmp_path): finally: mgr.stop() + def test_record_solve_no_image_once_cap_reached(self, tmp_path): + with patch("PiFinder.telemetry.TELEMETRY_DIR", tmp_path / "telemetry"): + cam_q = queue.Queue() + console_q = queue.Queue() + mgr = TelemetryManager(_make_cfg(), _make_shared_state(), console_q, cam_q) + mgr._recorder.start( + _make_cfg(telemetry_max_session_mb=1), _make_shared_state() + ) + try: + # Push the session past the cap, then re-measure. + (mgr._recorder.get_session_dir() / "img_1.png").write_bytes( + b"x" * 1_200_000 + ) + mgr._recorder._refresh_session_bytes() + assert mgr._recorder.images_capped + + mgr.record_solve(_make_successful_solve()) + assert cam_q.empty() # no further frames requested + assert console_q.get_nowait() == "Telemetry: Size cap, frames off" + finally: + mgr.stop() + + def test_record_solve_no_image_when_images_section_off(self, tmp_path): + with patch("PiFinder.telemetry.TELEMETRY_DIR", tmp_path / "telemetry"): + cam_q = queue.Queue() + mgr = TelemetryManager( + _make_cfg(), _make_shared_state(), queue.Queue(), cam_q + ) + # Solves on, Images off: solve recorded but no frame saved. + mgr._recorder.start( + _make_cfg(telemetry_sections=["imu", "sqm", "solve", "target"]), + _make_shared_state(), + ) + try: + mgr.record_solve(_make_successful_solve()) + assert cam_q.empty() + finally: + mgr.stop() + def test_record_imu_delegates(self): mgr = TelemetryManager(_make_cfg(), _make_shared_state(), queue.Queue()) mgr._recorder = MagicMock() diff --git a/python/tests/test_ui_modules.py b/python/tests/test_ui_modules.py index 49c4110c8..31a51f024 100644 --- a/python/tests/test_ui_modules.py +++ b/python/tests/test_ui_modules.py @@ -53,7 +53,7 @@ import pkgutil import queue import shutil -from typing import Iterator, cast +from typing import Iterator from unittest import mock import pytest @@ -87,7 +87,6 @@ from PiFinder.ui.dateentry import UIDateEntry from PiFinder.ui.sqm_calibration import UISQMCalibration from PiFinder.ui.sqm_sweep import UISQMSweep -from PiFinder.ui.software import UIMigrationConfirm, UIMigrationProgress # --------------------------------------------------------------------------- # @@ -121,7 +120,11 @@ # UIModule subclasses that are intentionally *not* exercised, with the reason. # Keeps the completeness guard (test_all_ui_modules_covered) honest. _COVERAGE_SKIP: dict[str, str] = { - "UIReleaseNotes": "fetches markdown via HTTP in active(); needs a network mock", + "UIReleaseNotes": ( + "Pushed onto the stack by UISoftware's Notes action with a " + "notes-payload item_definition; not reachable from the menu tree " + "and needs live update-channel state to construct." + ), } # Bound on the auto-sweep so a handler that keeps pushing modules @@ -182,8 +185,6 @@ def _node_id(node) -> str: "UIDateEntry", "UISQMCalibration", "UISQMSweep", - "UIMigrationConfirm", - "UIMigrationProgress", ] @@ -219,23 +220,6 @@ def _build_dynamic_item_definition(spec_id: str, sample_object) -> dict: if spec_id == "UISQMSweep": # sqm.py:302 return {"name": "SQM Sweep", "class": UISQMSweep, "label": "sqm_sweep"} - if spec_id == "UIMigrationConfirm": - # Pushed by UISoftware.key_square() after a 7x-square unlock. - return { - "name": "Confirm Migration", - "class": UIMigrationConfirm, - "version_info": {"version": "2.5.0"}, - "current_version": "2.4.0", - "label": "migration_confirm", - } - if spec_id == "UIMigrationProgress": - # Pushed by UIMigrationConfirm after the user confirms. - return { - "name": "Migration Progress", - "class": UIMigrationProgress, - "version_info": {"version": "2.5.0"}, - "label": "migration_progress", - } raise KeyError(spec_id) # pragma: no cover @@ -248,7 +232,11 @@ def _all_uimodule_subclasses() -> set[str]: def _recurse(cls): for sub in cls.__subclasses__(): - found.add(sub.__name__) + # Only classes that live in the UI package count — test helpers + # subclassing UIModule elsewhere (e.g. test_battery_titlebar_icon's + # _BareModule) must not trip the coverage guard. + if sub.__module__.startswith("PiFinder.ui"): + found.add(sub.__name__) _recurse(sub) _recurse(UIModule) @@ -428,7 +416,7 @@ def camera_image(): @pytest.fixture(scope="session") -def catalogs(_no_comet_download) -> Iterator[Catalogs]: +def catalogs(_sandbox_data_dir, _no_comet_download) -> Iterator[Catalogs]: """Build the real catalogs once from the bundled DB. Teardown stops the perpetual catalog timers. The planet and comet catalogs @@ -559,10 +547,7 @@ def _sweep_stack(menu_manager: MenuManager, seen: set) -> None: """ count = 0 while count < _MAX_SWEEP_MODULES: - # MenuManager.stack is annotated list[type[UIModule]] upstream - # but holds instances; cast so the sweep sees them - # as the UIModule instances they are. - pending = [cast(UIModule, m) for m in menu_manager.stack if id(m) not in seen] + pending = [m for m in menu_manager.stack if id(m) not in seen] if not pending: break for module in pending: diff --git a/python/tests/website/conftest.py b/python/tests/website/conftest.py index 3f6e7aec1..d66b9566d 100644 --- a/python/tests/website/conftest.py +++ b/python/tests/website/conftest.py @@ -13,6 +13,9 @@ def _create_local_driver(browser: str): """Create a local WebDriver instance for the given browser.""" if browser == "chrome": options = ChromeOptions() + chrome_binary = os.environ.get("CHROME_BINARY") + if chrome_binary: + options.binary_location = chrome_binary options.add_argument("--headless") options.add_argument("--no-sandbox") options.add_argument("--disable-dev-shm-usage") @@ -36,6 +39,9 @@ def _create_grid_driver(selenium_grid_url: str, browser: str): """Create a remote WebDriver via Selenium Grid.""" if browser == "chrome": options = ChromeOptions() + chrome_binary = os.environ.get("CHROME_BINARY") + if chrome_binary: + options.binary_location = chrome_binary options.add_argument("--headless") options.add_argument("--no-sandbox") options.add_argument("--disable-dev-shm-usage") diff --git a/python/tetra3 b/python/tetra3 deleted file mode 120000 index 866d074d4..000000000 --- a/python/tetra3 +++ /dev/null @@ -1 +0,0 @@ -PiFinder/tetra3/tetra3 \ No newline at end of file diff --git a/python/uv.lock b/python/uv.lock index bda020730..5f6b87bce 100644 --- a/python/uv.lock +++ b/python/uv.lock @@ -1,3 +1,1791 @@ version = 1 revision = 3 -requires-python = ">=3.13" +requires-python = "==3.13.*" +resolution-markers = [ + "sys_platform == 'linux'", + "sys_platform == 'darwin'", +] +supported-markers = [ + "sys_platform == 'linux'", + "sys_platform == 'darwin'", +] + +[manifest] + +[[manifest.dependency-metadata]] +name = "cedar-solve" +version = "0.5.1" +requires-dist = ["numpy", "pillow", "scipy"] + +[[manifest.dependency-metadata]] +name = "python-libinput" +version = "0.3.0a0" +requires-dist = ["cffi"] + +[[manifest.dependency-metadata]] +name = "python-prctl" +version = "1.8.1" + +[[package]] +name = "adafruit-blinka" +version = "9.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "adafruit-circuitpython-typing", marker = "sys_platform == 'linux'" }, + { name = "adafruit-platformdetect", marker = "sys_platform == 'linux'" }, + { name = "adafruit-pureio", marker = "sys_platform == 'linux'" }, + { name = "binho-host-adapter", marker = "sys_platform == 'linux'" }, + { name = "pyftdi", marker = "sys_platform == 'linux'" }, + { name = "sysv-ipc", marker = "platform_machine != 'mips' and sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a6/43/1addb059d8e589799571718f4c6f7456a3112681c9f92442939d06f67605/adafruit_blinka-9.1.0.tar.gz", hash = "sha256:6d17122358d5f9c4a550eae4f78207ac4c239662236bb37fc646b9f4166e3248", size = 929886, upload-time = "2026-04-21T18:29:55.987Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/97/17dac675981730d29b2d583de2aa0a9c2963d6c63f6bdc7eebf2711914ef/adafruit_blinka-9.1.0-py3-none-any.whl", hash = "sha256:6f617d4ebb7c2e14dfe1259c63f21df4a77d1b12d5efd92cf71ae4bf34d21b91", size = 1059892, upload-time = "2026-04-21T18:29:54.24Z" }, +] + +[[package]] +name = "adafruit-circuitpython-bno055" +version = "5.4.22" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "adafruit-blinka", marker = "sys_platform == 'linux'" }, + { name = "adafruit-circuitpython-busdevice", marker = "sys_platform == 'linux'" }, + { name = "adafruit-circuitpython-register", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e0/bc/ce0935061f77f7f48e1ecf35111cafeadbb8e7dbd450ab05e0d235fb8010/adafruit_circuitpython_bno055-5.4.22.tar.gz", hash = "sha256:8f67c4f24d9d01eaf1ede1ee2f1e04038bbe4227ac60e968bc34a18bb5d2ca98", size = 2191414, upload-time = "2026-04-23T20:55:31.913Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/d5/4d500c4f5b0ad8d643d9dd1b22e3b45b5e33beff4357b2473611d966f40e/adafruit_circuitpython_bno055-5.4.22-py3-none-any.whl", hash = "sha256:4240371dbffd501b7f6863819b85d0524edcb7f83f3c17b4176ab5d4fb2bd2ff", size = 10724, upload-time = "2026-04-23T20:55:30.989Z" }, +] + +[[package]] +name = "adafruit-circuitpython-busdevice" +version = "5.2.17" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "adafruit-blinka", marker = "sys_platform == 'linux'" }, + { name = "adafruit-circuitpython-typing", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/40/c0/f789bfc16d2e7eed23171f264b961ceb25314ba92d733be5bd47a4ecb23e/adafruit_circuitpython_busdevice-5.2.17.tar.gz", hash = "sha256:01887ba0056d3635536f0bf1e580a2969c67fc2c4c7b42a4093bcf7a3308bc9b", size = 24423, upload-time = "2026-04-23T21:18:13.438Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/0d/66a4e0fbd7b35107f7dee04fed890f77b83d1da9dd1f7474af2ed21700ea/adafruit_circuitpython_busdevice-5.2.17-py3-none-any.whl", hash = "sha256:5a834fbe0b88b07d20494bec566815da154aa4b1b668e2e665277b34b3578e44", size = 7494, upload-time = "2026-04-23T21:18:12.284Z" }, +] + +[[package]] +name = "adafruit-circuitpython-connectionmanager" +version = "3.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "adafruit-blinka", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a0/29/1653838bc0e5c6119fa2b03edb58b592a2475e7cf99810064a99e5eb8994/adafruit_circuitpython_connectionmanager-3.1.8.tar.gz", hash = "sha256:ce7436d62ac26312fbd2fc7d8f70ab0582a7c7807d7033ae5bd5cb53e4f66f3b", size = 33828, upload-time = "2026-04-23T21:18:42.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/43/929d17e5dbe0773e3a3c728b12cf1a777ada32639764b09365a1b56703c0/adafruit_circuitpython_connectionmanager-3.1.8-py3-none-any.whl", hash = "sha256:f93e27874a840f728b5cdbb1bcf0aee4e75ed1c0ba46b4562606ac3ac3ea2cca", size = 7755, upload-time = "2026-04-23T21:18:40.984Z" }, +] + +[[package]] +name = "adafruit-circuitpython-register" +version = "1.11.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "adafruit-blinka", marker = "sys_platform == 'linux'" }, + { name = "adafruit-circuitpython-busdevice", marker = "sys_platform == 'linux'" }, + { name = "adafruit-circuitpython-typing", marker = "sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c3/68/9eea7a41e92a8c641b3b457925001d5b0d15161f54e2c55effb36f715915/adafruit_circuitpython_register-1.11.3.tar.gz", hash = "sha256:4da69922e5f4fed9842dd90bc2e58848e2bc3ea959cbec788d4fb4b5d41021ae", size = 31696, upload-time = "2026-04-23T21:24:47.875Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/12/e23f35b7b16d39295c0c63765b1be0342ae33991bb64974a86fcb29a7142/adafruit_circuitpython_register-1.11.3-py3-none-any.whl", hash = "sha256:83b5e9ad1b7afb35330a549ef62fb3ce5cf8e13128ef52fb6eb13f3cd8f2cca6", size = 19009, upload-time = "2026-04-23T21:24:46.961Z" }, +] + +[[package]] +name = "adafruit-circuitpython-requests" +version = "4.1.17" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "adafruit-blinka", marker = "sys_platform == 'linux'" }, + { name = "adafruit-circuitpython-connectionmanager", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/5c/cb31dd0a6e56a92bd9bf672539ba6102204bc443fe9af9a5f8e893b99169/adafruit_circuitpython_requests-4.1.17.tar.gz", hash = "sha256:7259976be340324d34da1ba6f4b935430b46ceece2e5c1632387a24e6f94e9a3", size = 67777, upload-time = "2026-04-23T21:24:48.423Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/8c/15a2de09cc3c30793336cf79798948768611463ddfb2b2669f51569228fb/adafruit_circuitpython_requests-4.1.17-py3-none-any.whl", hash = "sha256:4c205188a052f52b3bb8ab4af97798d7d56ae3701857d31f03b164f029fae44f", size = 10841, upload-time = "2026-04-23T21:24:47.522Z" }, +] + +[[package]] +name = "adafruit-circuitpython-typing" +version = "1.12.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "adafruit-blinka", marker = "sys_platform == 'linux'" }, + { name = "adafruit-circuitpython-busdevice", marker = "sys_platform == 'linux'" }, + { name = "adafruit-circuitpython-requests", marker = "sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/65/a2/40a3440aed2375371507af668570b68523ee01db9c25c47ce5a05883170e/adafruit_circuitpython_typing-1.12.3.tar.gz", hash = "sha256:63f196f834e47842bcd4cf8c37aaa0c61e1aeb5d07f056c875fc3016cda91a12", size = 25603, upload-time = "2025-10-27T18:17:38.56Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/a1/578a03ba2bce0809b4e30974b47958963c9efe67b9fe74e7dbcdbbd45318/adafruit_circuitpython_typing-1.12.3-py3-none-any.whl", hash = "sha256:f6d0a02150e1e4efb5a2c2945b88d948809fdb465875f39947108b8467c986d9", size = 11014, upload-time = "2025-10-27T18:17:37.771Z" }, +] + +[[package]] +name = "adafruit-extended-bus" +version = "1.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "adafruit-blinka", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d3/1c/26ccaf2d7a3fd3d16504173df591973b9f1de5520b0b4d81af038b9e4ed3/adafruit-extended-bus-1.0.2.tar.gz", hash = "sha256:f34e3c114e274e5aa475673794019af1ab438df6e45141e16201b6a8c4bea3ea", size = 18966, upload-time = "2021-06-14T15:03:48.711Z" } + +[[package]] +name = "adafruit-platformdetect" +version = "3.88.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/92/3d991a9e322855be20c2df771b632ed81f1640b43a9969524765da23f4af/adafruit_platformdetect-3.88.0.tar.gz", hash = "sha256:dc2188ddb348bfd2a02a9533263294cc0f1762bd9f6b3b20866547d98820cd71", size = 49558, upload-time = "2026-02-24T19:01:07.066Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/29/c4/32572c051f1554d73633a802447321bff2a2332ef4210d47de807afd26c7/adafruit_platformdetect-3.88.0-py3-none-any.whl", hash = "sha256:69e694d80d551c6cb8e39f731e6ee0de1f135e64cffee0e2a665b1f9579c10d7", size = 26964, upload-time = "2026-02-24T19:01:05.646Z" }, +] + +[[package]] +name = "adafruit-pureio" +version = "1.1.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/b7/f1672435116822079bbdab42163f9e6424769b7db778873d95d18c085230/Adafruit_PureIO-1.1.11.tar.gz", hash = "sha256:c4cfbb365731942d1f1092a116f47dfdae0aef18c5b27f1072b5824ad5ea8c7c", size = 35511, upload-time = "2023-05-25T19:01:34.654Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/9d/28e9d12f36e13c5f2acba3098187b0e931290ecd1d8df924391b5ad2db19/Adafruit_PureIO-1.1.11-py3-none-any.whl", hash = "sha256:281ab2099372cc0decc26326918996cbf21b8eed694ec4764d51eefa029d324e", size = 10678, upload-time = "2023-05-25T19:01:32.397Z" }, +] + +[[package]] +name = "aiofiles" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/c3/534eac40372d8ee36ef40df62ec129bee4fdb5ad9706e58a29be53b2c970/aiofiles-25.1.0.tar.gz", hash = "sha256:a8d728f0a29de45dc521f18f07297428d56992a742f0cd2701ba86e44d23d5b2", size = 46354, upload-time = "2025-10-09T20:51:04.358Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/8a/340a1555ae33d7354dbca4faa54948d76d89a27ceef032c8c3bc661d003e/aiofiles-25.1.0-py3-none-any.whl", hash = "sha256:abe311e527c862958650f9438e859c1fa7568a141b22abcd015e120e86a85695", size = 14668, upload-time = "2025-10-09T20:51:03.174Z" }, +] + +[[package]] +name = "ast-serialize" +version = "0.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/81/9d/09e27731bd5864a9ce04e3244074e674bb8936bf62b45e0357248717adac/ast_serialize-0.5.0.tar.gz", hash = "sha256:5880091bfe6f4f986f22866375c2e884843e7a0b6343ae41aeea659613d879b6", size = 61157, upload-time = "2026-05-17T17:48:29.429Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/9e/dc2530acb3a60dc6e46d65abf27d1d9f86721694757906a148d90a6860de/ast_serialize-0.5.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:0668aa9459cfa8c9c49ddd2163ebcf43088ba045ef7492af6fe22e0098303101", size = 1191380, upload-time = "2026-05-17T17:48:03.738Z" }, + { url = "https://files.pythonhosted.org/packages/26/0a/bd3d18a582f273d6c843d16bb9e22e9e16365ff7991e92f18f798e9f1224/ast_serialize-0.5.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:bf683d6363edf2b39eed6b6d4fe22d34b6203867a67e27134d9e2a2680c4bc4a", size = 1183879, upload-time = "2026-05-17T17:48:05.463Z" }, + { url = "https://files.pythonhosted.org/packages/40/ae/1f919100f8620887af58fcc381c61a1f218cdf89c6e155f87b213e61010a/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc22cf0c9be65e71cf88fda130af60d61eb4a79370ad4cfe7900d48a4aa2211", size = 1244529, upload-time = "2026-05-17T17:48:07.008Z" }, + { url = "https://files.pythonhosted.org/packages/c6/ca/6376559dcce707cdbc1d0d9a13c8d3baaaa501e949ce0ebdc4230cd881aa/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f66173891548c9f2726bf27957b41cabce12fa679dc6da505ddbde4d4b3b31cf", size = 1240560, upload-time = "2026-05-17T17:48:08.46Z" }, + { url = "https://files.pythonhosted.org/packages/35/b2/a620e206b5aeb7efbf2710336df57d457cffbb3991076bbcc1147ef9abd4/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e42d729ef2be96a14efbad355093284739e3670ece3e534f82cc8832790911d9", size = 1451172, upload-time = "2026-05-17T17:48:09.922Z" }, + { url = "https://files.pythonhosted.org/packages/fa/e0/4ad5c04c24a40481b2935ce9a0ccdb6023dc8b667167d06ae530cc3512f2/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b725026bafa801dbd7310eb13a75f0a2e370e7e51b2cb225f9d21fcfadf919ee", size = 1265072, upload-time = "2026-05-17T17:48:11.469Z" }, + { url = "https://files.pythonhosted.org/packages/b2/71/4d1d479aa56d0101c40e17720c3d6ac2af7269ea0487a80b18e7bfd1a5b7/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b54f60c1d78767a53b67eaa663f0dfac3afe606aa07f1301572f588b73d64809", size = 1270488, upload-time = "2026-05-17T17:48:13.575Z" }, + { url = "https://files.pythonhosted.org/packages/6d/4f/0de1bbe06f6edef9fde4ed12ca8e7b3ec7e6e2bd4e672c5af487f7957665/ast_serialize-0.5.0-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:27d51654fc240a1e87e742d353d98eb45b75f62f129086b3596ab53df2ac2a43", size = 1260702, upload-time = "2026-05-17T17:48:15.141Z" }, + { url = "https://files.pythonhosted.org/packages/75/61/e00872439cfdddcc3c1b6cdaa6e5d904ba8e26a18807c67c4e14409d0ca8/ast_serialize-0.5.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c36237c46dd1674542f2109740ea5ea485a169bf1431939ada0434e17934", size = 1311182, upload-time = "2026-05-17T17:48:16.779Z" }, + { url = "https://files.pythonhosted.org/packages/76/8e/699a5b955f7926956c95e9e1d74132acad73c2fe7a426f94da89123c20aa/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1943db345233cc7194a470f13afa9c59772c0b123dea0c9414c4d4ca54369759", size = 1421410, upload-time = "2026-05-17T17:48:18.527Z" }, + { url = "https://files.pythonhosted.org/packages/a9/ae/d5b7626874478997adc7a29ab28accf21e596fb590c944290401dfd0b29e/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:df1c00022cbbcb064bfaa505aa9c9295362443ce5dacb459d1331d3da353f887", size = 1516587, upload-time = "2026-05-17T17:48:20.133Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ce/b59e02a82d9c4244d64cde502e0b00e83e38816abe19155ceb5437402c7f/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:cae65289fc456fde04af979a2be09302ef5d8ab92ef23e596d6746dc267ada27", size = 1515171, upload-time = "2026-05-17T17:48:21.921Z" }, + { url = "https://files.pythonhosted.org/packages/8b/38/d8d90042747d05aa08d4efcf1c99035a5f670a6bf4c214d31644392afbca/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:239a4c354e8d676e9d94631d1d4a64edc6b266f86ff3a5a80aedd344f342c01d", size = 1464668, upload-time = "2026-05-17T17:48:23.544Z" }, +] + +[[package]] +name = "attrs" +version = "26.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" }, +] + +[[package]] +name = "av" +version = "17.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/e3/477fa20578c284abeda08d91b63ee9abaebc93445d8feeb989d3d444bae1/av-17.1.0.tar.gz", hash = "sha256:7f1e71ff621b66253333926f948e00faae11d855b2442133c65128bca64cdeb3", size = 4288546, upload-time = "2026-06-07T05:52:55.999Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/87/8036b5c781bc3639ea04ef42d4e26da253bd4bd4311d8705b6a1c8824047/av-17.1.0-cp311-abi3-macosx_11_0_x86_64.whl", hash = "sha256:ad7b4aa011093324b7118245f50ac6db244cfe9900d4072508a5245a2b0d3f41", size = 22460847, upload-time = "2026-06-07T05:52:04.261Z" }, + { url = "https://files.pythonhosted.org/packages/6d/af/dfdf6fc7b17814b50d0aa9e7a7e37b87be91be3890f44b0d525433cd1fd1/av-17.1.0-cp311-abi3-macosx_14_0_arm64.whl", hash = "sha256:43ebbe977f19a7f2d2bd1a4e119675a0b15e05852cf7309846b6ab922ba7ffe9", size = 18159115, upload-time = "2026-06-07T05:52:06.64Z" }, + { url = "https://files.pythonhosted.org/packages/ad/13/64f6c466471cea225b8b2f4cdc51a571f8a286984b55a08d169b932fda5d/av-17.1.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6a20658ec7d96a70e14b1196eff00b7cdd8831ac3b99868e16b8ba8b24090847", size = 33224427, upload-time = "2026-06-07T05:52:09.165Z" }, + { url = "https://files.pythonhosted.org/packages/77/43/96b35170bf2e64e00a41748c6400ff73232dc0fc62ded283679fb07c7fe0/av-17.1.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f9a65d1f48b818323fb411e80358f89d77dec340b01d27c6b2dfbb9cbf4b779f", size = 35370183, upload-time = "2026-06-07T05:52:11.959Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b3/8e8b4b6498731bfbd88e8399a756543f8088f1bd33d08eab678b5aebe728/av-17.1.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:58f7593726437cda5bd19793027e027768450b5c4a594777bf487798a33db702", size = 24459265, upload-time = "2026-06-07T05:52:14.66Z" }, + { url = "https://files.pythonhosted.org/packages/14/ac/ceb84b7553db21f1143d817245c560d9267168e1e58b1a8eeae2b62c4d04/av-17.1.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:bbab058bd965309f39962e53caac8126987c68c0be094fc4f9427e5615b0218f", size = 34283709, upload-time = "2026-06-07T05:52:17.389Z" }, + { url = "https://files.pythonhosted.org/packages/59/f9/4115fd84148c9a1cf365096694be6ac882fd3cd3cdb7a2f35e71fecf1631/av-17.1.0-cp311-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:9514cfda85180554c430695282faf4be3ffdf95775d8519733821244eecb58e0", size = 25397573, upload-time = "2026-06-07T05:52:20.012Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ac/92e52d5ed0e0b84d9d93e52b4338c2713d8a44082b8696e6516fdae7c4e4/av-17.1.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e1c90f85cd7431ede95b11e8e711571a896ebea433f298849c2c0f1594c8d86e", size = 36451495, upload-time = "2026-06-07T05:52:22.581Z" }, +] + +[[package]] +name = "babel" +version = "2.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, +] + +[[package]] +name = "binho-host-adapter" +version = "0.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyserial", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/68/36/29b7b896e83e195fac6d64ccff95c0f24a18ee86e7437a22e60e0331d90a/binho-host-adapter-0.1.6.tar.gz", hash = "sha256:1e6da7a84e208c13b5f489066f05774bff1d593d0f5bf1ca149c2b8e83eae856", size = 10068, upload-time = "2020-06-04T19:38:11.789Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/6b/0f13486003aea3eb349c2946b7ec9753e7558b78e35d22c938062a96959c/binho_host_adapter-0.1.6-py3-none-any.whl", hash = "sha256:f71ca176c1e2fc1a5dce128beb286da217555c6c7c805f2ed282a6f3507ec277", size = 10540, upload-time = "2020-06-04T19:38:10.612Z" }, +] + +[[package]] +name = "blinker" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", size = 22460, upload-time = "2024-11-08T17:25:47.436Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458, upload-time = "2024-11-08T17:25:46.184Z" }, +] + +[[package]] +name = "cbor2" +version = "6.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/75/af/473c241e41c142ea06ebef8d1f660fa6ff928fb97210e7bec8ee5974f8cd/cbor2-6.1.2.tar.gz", hash = "sha256:6b43037a66947dee5af0abb1a4c3a13b3abac5a4a3f32f9771efbbcd030fd909", size = 86760, upload-time = "2026-06-02T19:01:29.333Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/dc/bc045c8f36317e4e5f7a60d94b36833139909fc32e3a65f44bc61a36def0/cbor2-6.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f1aa38c422d87ea61849b2a823b10b64053fb4da8763f19ac78ea9a69d682b2a", size = 408846, upload-time = "2026-06-02T19:00:55.476Z" }, + { url = "https://files.pythonhosted.org/packages/2b/36/d66f5f0dd98ecbdcfc7da1fbd423f7b3782a27719f0062a560476f00b334/cbor2-6.1.2-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:ff7d0bd8ff432832338a8d2430aee34f8a082342480ff537c0ba90e2b8ff7894", size = 454624, upload-time = "2026-06-02T19:00:56.744Z" }, + { url = "https://files.pythonhosted.org/packages/38/6b/4884b9cf03db14dc5007825d5d1bf8678a75c49d4268d8e0c1c6e9580104/cbor2-6.1.2-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:c1eedf3290d88a5f663bd8b4b8f0f0e2103d0594c293fa5f4e62e53100972309", size = 466585, upload-time = "2026-06-02T19:00:58.209Z" }, + { url = "https://files.pythonhosted.org/packages/50/f6/36a15beb3915f56a79d6e9213c6d40c0f5cb90cd3462923f555d78068847/cbor2-6.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3049b04bddf9a5a2d0e5bb25dccdaf4552fcaf607b404e249d4f78f010fcc7d0", size = 521678, upload-time = "2026-06-02T19:00:59.524Z" }, + { url = "https://files.pythonhosted.org/packages/c6/3f/e899313371ebeb7a191d751de97ccd8242abc24bbc9d8e2c58e04475cfb0/cbor2-6.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:96eb687a62040401668f06a85de8f47361ef44574de1493899e0ec678109fc04", size = 534044, upload-time = "2026-06-02T19:01:00.875Z" }, +] + +[[package]] +name = "cedar-solve" +version = "0.5.1" +source = { git = "https://github.com/smroid/cedar-solve?rev=d8ff1d857a363c88917fd8e126ab90e24b1cfbcc#d8ff1d857a363c88917fd8e126ab90e24b1cfbcc" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pillow", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "scipy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] + +[[package]] +name = "certifi" +version = "2026.6.17" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/c7/424b75da314c1045981bd9777432fad05a9e0c69daa4ed7e308bbaffe405/certifi-2026.6.17.tar.gz", hash = "sha256:024c88eeec92ca068db80f02b8b07c9cef7b9fe261d1d535abfd5abd6f6af432", size = 134594, upload-time = "2026-06-17T10:31:07.894Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl", hash = "sha256:2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db", size = 133289, upload-time = "2026-06-17T10:31:06.348Z" }, +] + +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "(implementation_name != 'PyPy' and sys_platform == 'darwin') or (implementation_name != 'PyPy' and sys_platform == 'linux')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063", size = 309627, upload-time = "2026-04-02T09:26:45.198Z" }, + { url = "https://files.pythonhosted.org/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c", size = 207008, upload-time = "2026-04-02T09:26:46.824Z" }, + { url = "https://files.pythonhosted.org/packages/c4/bb/ec73c0257c9e11b268f018f068f5d00aa0ef8c8b09f7753ebd5f2880e248/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66", size = 228303, upload-time = "2026-04-02T09:26:48.397Z" }, + { url = "https://files.pythonhosted.org/packages/85/fb/32d1f5033484494619f701e719429c69b766bfc4dbc61aa9e9c8c166528b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18", size = 224282, upload-time = "2026-04-02T09:26:49.684Z" }, + { url = "https://files.pythonhosted.org/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd", size = 215595, upload-time = "2026-04-02T09:26:50.915Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7c/fc890655786e423f02556e0216d4b8c6bcb6bdfa890160dc66bf52dee468/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215", size = 201986, upload-time = "2026-04-02T09:26:52.197Z" }, + { url = "https://files.pythonhosted.org/packages/d8/97/bfb18b3db2aed3b90cf54dc292ad79fdd5ad65c4eae454099475cbeadd0d/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859", size = 211711, upload-time = "2026-04-02T09:26:53.49Z" }, + { url = "https://files.pythonhosted.org/packages/6f/a5/a581c13798546a7fd557c82614a5c65a13df2157e9ad6373166d2a3e645d/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8", size = 210036, upload-time = "2026-04-02T09:26:54.975Z" }, + { url = "https://files.pythonhosted.org/packages/8c/bf/b3ab5bcb478e4193d517644b0fb2bf5497fbceeaa7a1bc0f4d5b50953861/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5", size = 202998, upload-time = "2026-04-02T09:26:56.303Z" }, + { url = "https://files.pythonhosted.org/packages/e7/4e/23efd79b65d314fa320ec6017b4b5834d5c12a58ba4610aa353af2e2f577/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832", size = 230056, upload-time = "2026-04-02T09:26:57.554Z" }, + { url = "https://files.pythonhosted.org/packages/b9/9f/1e1941bc3f0e01df116e68dc37a55c4d249df5e6fa77f008841aef68264f/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6", size = 211537, upload-time = "2026-04-02T09:26:58.843Z" }, + { url = "https://files.pythonhosted.org/packages/80/0f/088cbb3020d44428964a6c97fe1edfb1b9550396bf6d278330281e8b709c/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48", size = 226176, upload-time = "2026-04-02T09:27:00.437Z" }, + { url = "https://files.pythonhosted.org/packages/6a/9f/130394f9bbe06f4f63e22641d32fc9b202b7e251c9aef4db044324dac493/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a", size = 217723, upload-time = "2026-04-02T09:27:02.021Z" }, + { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" }, +] + +[[package]] +name = "click" +version = "8.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9b/98/518d8e5081007684232226f475082b30087d0f585e8457db087298259f49/click-8.4.1.tar.gz", hash = "sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96", size = 353007, upload-time = "2026-05-22T04:08:37.769Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl", hash = "sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2", size = 116639, upload-time = "2026-05-22T04:08:35.26Z" }, +] + +[[package]] +name = "dataclasses-json" +version = "0.6.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "marshmallow", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "typing-inspect", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/64/a4/f71d9cf3a5ac257c993b5ca3f93df5f7fb395c725e7f1e6479d2514173c3/dataclasses_json-0.6.7.tar.gz", hash = "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0", size = 32227, upload-time = "2024-06-09T16:20:19.103Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", size = 28686, upload-time = "2024-06-09T16:20:16.715Z" }, +] + +[[package]] +name = "dbus-python" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/24/63118050c7dd7be04b1ccd60eab53fef00abe844442e1b6dec92dae505d6/dbus-python-1.4.0.tar.gz", hash = "sha256:991666e498f60dbf3e49b8b7678f5559b8a65034fdf61aae62cdecdb7d89c770", size = 232490, upload-time = "2025-03-13T19:57:54.212Z" } + +[[package]] +name = "evdev" +version = "1.9.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a5/f5/397b61091120a9ca5001041dd7bf76c385b3bfd67a0e5bcb74b852bd22a4/evdev-1.9.3.tar.gz", hash = "sha256:2c140e01ac8437758fa23fe5c871397412461f42d421aa20241dc8fe8cfccbc9", size = 32723, upload-time = "2026-02-05T21:54:24.987Z" } + +[[package]] +name = "flask" +version = "3.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "blinker", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "click", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "itsdangerous", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "jinja2", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "markupsafe", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "werkzeug", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/26/00/35d85dcce6c57fdc871f3867d465d780f302a175ea360f62533f12b27e2b/flask-3.1.3.tar.gz", hash = "sha256:0ef0e52b8a9cd932855379197dd8f94047b359ca0a78695144304cb45f87c9eb", size = 759004, upload-time = "2026-02-19T05:00:57.678Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/9c/34f6962f9b9e9c71f6e5ed806e0d0ff03c9d1b0b2340088a0cf4bce09b18/flask-3.1.3-py3-none-any.whl", hash = "sha256:f4bcbefc124291925f1a26446da31a5178f9483862233b23c0c96a20701f670c", size = 103424, upload-time = "2026-02-19T05:00:56.027Z" }, +] + +[[package]] +name = "flask-babel" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "flask", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "jinja2", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pytz", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/1a/4c65e3b90bda699a637bfb7fb96818b0a9bbff7636ea91aade67f6020a31/flask_babel-4.0.0.tar.gz", hash = "sha256:dbeab4027a3f4a87678a11686496e98e1492eb793cbdd77ab50f4e9a2602a593", size = 10178, upload-time = "2023-10-02T01:10:49.914Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/c2/e0ab5abe37882e118482884f2ec660cd06da644ddfbceccf5f88f546b574/flask_babel-4.0.0-py3-none-any.whl", hash = "sha256:638194cf91f8b301380f36d70e2034c77ee25b98cb5d80a1626820df9a6d4625", size = 9602, upload-time = "2023-10-02T01:10:48.58Z" }, +] + +[[package]] +name = "flatbuffers" +version = "25.12.19" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/2d/d2a548598be01649e2d46231d151a6c56d10b964d94043a335ae56ea2d92/flatbuffers-25.12.19-py2.py3-none-any.whl", hash = "sha256:7634f50c427838bb021c2d66a3d1168e9d199b0607e6329399f04846d42e20b4", size = 26661, upload-time = "2025-12-19T23:16:13.622Z" }, +] + +[[package]] +name = "gpsdclient" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/85/9bfbc7ea5dd5c61f43ad048efe10d0a5a2d8ffd82143329fa380771221b8/gpsdclient-1.3.2.tar.gz", hash = "sha256:70a496550a9747dff5e0e50b3c95a6e1dcab9d842860997e95120767e2060a7a", size = 7619, upload-time = "2023-01-09T11:29:17.995Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/e9/f8a624fbbe177da2274e8d37d08fabde8269e8fead25b22deda94c3caf88/gpsdclient-1.3.2-py3-none-any.whl", hash = "sha256:35a7f781ae69a04f2d80278a6ae94564e524efaf061646c0a9bbb6ba4ffbcac8", size = 7934, upload-time = "2023-01-09T11:29:16.461Z" }, +] + +[[package]] +name = "grpcio" +version = "1.81.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b0/b5/1ff353970a87eda4c98251e34d2dfd214abd4982dc89119c9252a2a482d2/grpcio-1.81.1.tar.gz", hash = "sha256:6fa10a767143a5e82e8eaab53918af0cd8909a57a27f8cb2288b80a613ac671b", size = 13026582, upload-time = "2026-06-11T12:46:51.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/42/dcc2e4b600538ef18327c0839d56b7d3c3812337c5d710df5877dbb39b1e/grpcio-1.81.1-cp313-cp313-linux_armv7l.whl", hash = "sha256:b10e1ff4756ed27d5a29d7fc79cfce7ef1ff56ad20025b89bac7cf79e09abbbe", size = 6054466, upload-time = "2026-06-11T12:45:48.43Z" }, + { url = "https://files.pythonhosted.org/packages/7b/4a/a36e03210183a8a7d4c80c3936acee679f4bd77d5861f369db47b2cc5f05/grpcio-1.81.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:819edbdcb42ab8598b494bcf0222684bbb7a3c772bd1b1f0be7e029a6063c28e", size = 12048795, upload-time = "2026-06-11T12:45:54.011Z" }, + { url = "https://files.pythonhosted.org/packages/b0/d5/d68e30b29098f63beab6fe501100fe82674ff142b32c672532da86a99b3a/grpcio-1.81.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c5bf2dc311127d91230cc79b92188c082634a06cf66c5234db49a43b910183b0", size = 6599094, upload-time = "2026-06-11T12:45:57.799Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b3/e837954d279754f638a11cca5dcf6b24a005efb398984cefaf7735945a54/grpcio-1.81.1-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:e8ca6a1fcdb2943c9cbc1804a1baf3acb6071d72a471591678ded84218006e14", size = 7307182, upload-time = "2026-06-11T12:46:00.568Z" }, + { url = "https://files.pythonhosted.org/packages/0d/1e/b47957057e729adc6cdf519a47f8be2562b7140e280f1418443eb4022192/grpcio-1.81.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e64dd101d380a115cc5a0c7856788adb535f1a4e21fc543775602f8be95180ae", size = 6810962, upload-time = "2026-06-11T12:46:03.312Z" }, + { url = "https://files.pythonhosted.org/packages/40/26/569868e364e05b19ec8f969da53d230bcd89c962cd198f7c29943155c4d3/grpcio-1.81.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:98a07f9bf591e3a8919797bee1c53f026ba4acd587e5a4404c8e57c9ec36b2a5", size = 7415698, upload-time = "2026-06-11T12:46:06.005Z" }, + { url = "https://files.pythonhosted.org/packages/36/0c/5440a0582cb5653fc42a6e262eeb22700943313f8076f9dc927491b20a59/grpcio-1.81.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c261d74b1a945cf895a9d6eccd1685a8e837531beaab782da4d630a8d12deffb", size = 8407779, upload-time = "2026-06-11T12:46:08.84Z" }, + { url = "https://files.pythonhosted.org/packages/ff/aa/66fe9f39871d766987d869a03ee0842a026f499c7b1e62decb9e78a8088e/grpcio-1.81.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:58ad1131c300d3c9b933802b3cc4dc69d380822935ba50b28703156ea826fbf7", size = 7844521, upload-time = "2026-06-11T12:46:12.171Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "h3" +version = "4.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/1c/12f1e2842d6493de4dd8244538c30a556712e9a6b25c5151a0e0e522a67e/h3-4.5.0.tar.gz", hash = "sha256:a1e279a1674fc799445c710e35bc4b1b388a406c881d8b5e59a9b8bebeb5bb43", size = 180838, upload-time = "2026-05-30T00:59:24.988Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/a9/bb36156db3a1f9eebb27de9c72d1229c69a643bc5bf9f59cbc05a8b0a634/h3-4.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:44f9eee75985ecf06af82cfbce5fe7a0fd1cae73bee53d15155fe8fdb165578a", size = 843578, upload-time = "2026-05-30T00:59:07.415Z" }, + { url = "https://files.pythonhosted.org/packages/00/d0/4256f2515f8dd1a322e95a7a5f4174ecc405098f8b217d1d29767989c171/h3-4.5.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf8fe70eef1c122e7465f3b9c57f793fa1a6885cf067be3a83423c0f30c0d80c", size = 1007119, upload-time = "2026-05-30T00:59:08.629Z" }, + { url = "https://files.pythonhosted.org/packages/eb/37/a60d26681ac540788c4ef656960084c9cbf4c24657f7e7347f07e97ba27f/h3-4.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df23f9ff0a9ff9c6195f48ebc8fb8fc6d50c2025ec37649991749d5282a2950f", size = 1059523, upload-time = "2026-05-30T00:59:09.854Z" }, + { url = "https://files.pythonhosted.org/packages/de/76/6e2eab23667a6ee153e3c369fb6fb793d4b09c81030495da989e8e5bf66d/h3-4.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e8af93363b9b14fe1797a2557b22bb158b1be7696f145ea8ee6f8b9315860fa", size = 1069134, upload-time = "2026-05-30T00:59:11.235Z" }, +] + +[[package]] +name = "idna" +version = "3.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "itsdangerous" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173", size = 54410, upload-time = "2024-04-16T21:28:15.614Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", size = 16234, upload-time = "2024-04-16T21:28:14.499Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "joblib" +version = "1.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/f2/d34e8b3a08a9cc79a50b2208a93dce981fe615b64d5a4d4abee421d898df/joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3", size = 331603, upload-time = "2025-12-15T08:41:46.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713", size = 309071, upload-time = "2025-12-15T08:41:44.973Z" }, +] + +[[package]] +name = "jplephem" +version = "2.24" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/90/8b/a50514f000fcd0207cd281370b0db66e7712a5db9f96b77a0301a7205f96/jplephem-2.24.tar.gz", hash = "sha256:354fe1adae022264ab46f18afb6af26211277cfd7b3ef90400755fcabe93bc11", size = 45289, upload-time = "2026-01-23T21:03:01.07Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/3f/b9d5739352badc11ca637c8f72525d519458622936bc3313ddefdc7dee96/jplephem-2.24-py3-none-any.whl", hash = "sha256:2de15608a0f13010a71a0a8af8765646d5884402006dac0dd7639d7db13629ac", size = 49585, upload-time = "2026-01-23T21:03:00.079Z" }, +] + +[[package]] +name = "json5" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/4b/6f8906aaf67d501e259b0adab4d312945bb7211e8b8d4dcc77c92320edaa/json5-0.14.0.tar.gz", hash = "sha256:b3f492fad9f6cdbced8b7d40b28b9b1c9701c5f561bef0d33b81c2ff433fefcb", size = 52656, upload-time = "2026-03-27T22:50:48.108Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/42/cf027b4ac873b076189d935b135397675dac80cb29acb13e1ab86ad6c631/json5-0.14.0-py3-none-any.whl", hash = "sha256:56cf861bab076b1178eb8c92e1311d273a9b9acea2ccc82c276abf839ebaef3a", size = 36271, upload-time = "2026-03-27T22:50:47.073Z" }, +] + +[[package]] +name = "jsonschema" +version = "4.26.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "jsonschema-specifications", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "referencing", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "rpds-py", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, +] + +[[package]] +name = "libarchive-c" +version = "5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/23/e72434d5457c24113e0c22605cbf7dd806a2561294a335047f5aa8ddc1ca/libarchive_c-5.3.tar.gz", hash = "sha256:5ddb42f1a245c927e7686545da77159859d5d4c6d00163c59daff4df314dae82", size = 54349, upload-time = "2025-05-22T08:08:04.604Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/3f/ff00c588ebd7eae46a9d6223389f5ae28a3af4b6d975c0f2a6d86b1342b9/libarchive_c-5.3-py3-none-any.whl", hash = "sha256:651550a6ec39266b78f81414140a1e04776c935e72dfc70f1d7c8e0a3672ffba", size = 17035, upload-time = "2025-05-22T08:08:03.045Z" }, +] + +[[package]] +name = "librt" +version = "0.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/40/08/9e7f6b5d2b5bed6ad055cdd5925f192bb403a51280f86b56554d9d0699a2/librt-0.11.0.tar.gz", hash = "sha256:075dc3ef4458a278e0195cbf6ac9d38808d9b906c5a6c7f7f79c3888276a3fb1", size = 200139, upload-time = "2026-05-10T18:17:25.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/61/e59168d4d0bf2bf90f4f0caf7a001bfc60254c3af4586013b04dc3ef517b/librt-0.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:78dc31f7fdfe9c9d0eb0e8f42d139db230e826415bbcabd9f0e9faaaee909894", size = 144119, upload-time = "2026-05-10T18:16:11.771Z" }, + { url = "https://files.pythonhosted.org/packages/61/fd/caa1d60b12f7dd79ccea23054e06eeaebe266a5f52c40a6b651069200ce5/librt-0.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fa475675db22290c3158e1d42326d0f5a65f04f44a0e68c3630a25b53560fb9c", size = 143565, upload-time = "2026-05-10T18:16:13.334Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a9/dc744f5c2b4978d48db970be29f22716d3413d28b14ad99740817315cf2c/librt-0.11.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:621db29691044bdeda22e789e482e1b0f3a985d90e3426c9c6d17606416205ea", size = 485395, upload-time = "2026-05-10T18:16:14.729Z" }, + { url = "https://files.pythonhosted.org/packages/8f/21/7f8e97a1e4dae952a5a95948f6f8507a173bc1e669f54340bba6ca1ca31b/librt-0.11.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:a9010e2ed5b3a9e158c5fd966b3ab7e834bb3d3aacc8f66c91dd4b57a3799230", size = 479383, upload-time = "2026-05-10T18:16:16.321Z" }, + { url = "https://files.pythonhosted.org/packages/a6/6d/d8ee9c114bebf2c50e29ec2aa940826fccb62a645c3e4c18760987d0e16d/librt-0.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7c39513d8b7477a2e1ed8c43fc21c524e8d5a0f8d4e8b7b074dbdbe7820a08e2", size = 513010, upload-time = "2026-05-10T18:16:17.647Z" }, + { url = "https://files.pythonhosted.org/packages/f0/43/0b5708af2bd30a46400e72ba6bdaa8f066f15fb9a688527e34220e8d6c06/librt-0.11.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7aef3cf1d5af86e770ab04bfd993dfc4ae8b8c17f66fb77dd4a7d50de7bbb1a3", size = 508433, upload-time = "2026-05-10T18:16:19.309Z" }, + { url = "https://files.pythonhosted.org/packages/4a/50/356187247d09013490481033183b3532b58acf8028bcb34b2b56a375c9b2/librt-0.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:557183ddc36babe46b27dd60facbd5adb4492181a5be887587d57cda6e092f21", size = 522595, upload-time = "2026-05-10T18:16:20.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/e7/c6ac4240899c7f3248079d5a9900debe0dadb3fdeaf856684c987105ba47/librt-0.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:83d3e1f72bd42f6c5c0b7daec530c3f829bd02db42c70b8ddf0c2d90a2459930", size = 527255, upload-time = "2026-05-10T18:16:22.352Z" }, + { url = "https://files.pythonhosted.org/packages/eb/b5/a81322dbeedeeaf9c1ee6f001734d28a09d8383ac9e6779bc24bbd0743c6/librt-0.11.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:4ce1f21fbe589bc1afd7872dece84fb0e1144f794a288e58a10d2c54a55c43be", size = 516847, upload-time = "2026-05-10T18:16:23.627Z" }, + { url = "https://files.pythonhosted.org/packages/ae/66/6e6323787d592b55204a42595ff1102da5115601b53a7e9ddebc889a6da5/librt-0.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b09f7044ea2b64c9da42fd3d335666518cfd1c6e8a182c95da73d0214b41e", size = 553920, upload-time = "2026-05-10T18:16:25.025Z" }, +] + +[[package]] +name = "luma-core" +version = "2.5.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cbor2", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pillow", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "smbus2", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e6/a3/0abb456daf2279483579bed6cf2a7305f93f56ab89f0f238f206fffce303/luma_core-2.5.3.tar.gz", hash = "sha256:ecfb1c12fc32f8ee6cff0f613804b2609387c17547f739d002649f2e6d56ec2f", size = 105745, upload-time = "2025-12-16T21:56:28.065Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/de/eb014859db3b59eaa35b157451121fbd8cffb96da8f4f52b4fa223fe0bc7/luma_core-2.5.3-py3-none-any.whl", hash = "sha256:ad466acb7bc805ad87cf1ed591d1d0588c3fa9900cba338d4eebf02a4226b95c", size = 72744, upload-time = "2025-12-16T21:56:26.277Z" }, +] + +[[package]] +name = "luma-emulator" +version = "1.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "luma-core", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pygame", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/65/ea/4962e87863341c70996b02ab3387c902b7308c153251373765d78c19ef9e/luma_emulator-1.7.0.tar.gz", hash = "sha256:0f4bc1d528fe4f4aa4a6f98c8f7120b915bba1878f67899067ba88e98250b444", size = 879307, upload-time = "2026-02-01T17:14:46.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/1b/98b23ed86658b0134fefcbeea986943acfc368f3e37b5b691219edefb3eb/luma_emulator-1.7.0-py2.py3-none-any.whl", hash = "sha256:0accb342e12441bdb602c5daa8a1d54a93e09eba8f0c4be2093d7ab066dfa151", size = 27129, upload-time = "2026-02-01T17:14:45.358Z" }, +] + +[[package]] +name = "luma-lcd" +version = "2.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "luma-core", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/8f/75cf0bf8c97c3d13766d3b6bb86be4835f9f7c79dff20f89fdfb4ea23440/luma_lcd-2.13.0.tar.gz", hash = "sha256:e814dd3f4c12fe6febe5ce85b98362834b3396bea108fa70f9325f44ec3226f8", size = 25330324, upload-time = "2026-02-01T17:05:44.817Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/f6/c3a7e043d4cbc0af443a5a54c13b15b0b3632bc559996599b8bcd82e9477/luma_lcd-2.13.0-py2.py3-none-any.whl", hash = "sha256:a4a3483d87b9608ce64e3cb767547ef3334fc5b3f26a3821c5462240c1a10feb", size = 34810, upload-time = "2026-02-01T17:05:43.376Z" }, +] + +[[package]] +name = "luma-oled" +version = "3.15.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "luma-core", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f9/36/cad8c85b0206ffbbbb7d2609fdb376666521a503837b6e853a4600f09d5f/luma_oled-3.15.0.tar.gz", hash = "sha256:16925fe668f484803df0683add800b19e5dd7316a1d64eb06ec2ae817473901e", size = 20220114, upload-time = "2026-03-07T14:25:42.169Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/17/0c5addb4e42b3494a11384344f1899e4f2b9b98c64c0285cb426963af255/luma_oled-3.15.0-py3-none-any.whl", hash = "sha256:2928d9465ab71b1cd8538c6aec2d51c0fc61a42a5bd27b51b0e6fdd80bc0fd39", size = 33829, upload-time = "2026-03-07T14:25:40.071Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, +] + +[[package]] +name = "marshmallow" +version = "3.26.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/79/de6c16cc902f4fc372236926b0ce2ab7845268dcc30fb2fbb7f71b418631/marshmallow-3.26.2.tar.gz", hash = "sha256:bbe2adb5a03e6e3571b573f42527c6fe926e17467833660bebd11593ab8dfd57", size = 222095, upload-time = "2025-12-22T06:53:53.309Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/2f/5108cb3ee4ba6501748c4908b908e55f42a5b66245b4cfe0c99326e1ef6e/marshmallow-3.26.2-py3-none-any.whl", hash = "sha256:013fa8a3c4c276c24d26d84ce934dc964e2aa794345a0f8c7e5a7191482c8a73", size = 50964, upload-time = "2025-12-22T06:53:51.801Z" }, +] + +[[package]] +name = "mypy" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ast-serialize", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "librt", marker = "(platform_python_implementation != 'PyPy' and sys_platform == 'darwin') or (platform_python_implementation != 'PyPy' and sys_platform == 'linux')" }, + { name = "mypy-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pathspec", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/15/cca9d88503549ed6fedeaa1d448cdddd542ee8a490232d732e278036fbf2/mypy-2.1.0.tar.gz", hash = "sha256:81e76ad12c2d804512e9b13240d1588316531bfba07558286078bfbce9613633", size = 3898359, upload-time = "2026-05-11T18:37:36.237Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/dd/c7191469c777f07689c032a8f7326e393ea34c92d6d76eb7ce5ba57ea66d/mypy-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35aac3bb114e03888f535d5eb51b8bafbb3266586b599da1940f9b1be3ec5bd5", size = 14852174, upload-time = "2026-05-11T18:31:38.929Z" }, + { url = "https://files.pythonhosted.org/packages/55/8c/aed55408879043d72bb9135f4d0d19a02b886dd569631e113e3d2706cb8d/mypy-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8de55a8c861f2a49331f807be98d90caeceeef520bde13d43a160207f8af613e", size = 13651542, upload-time = "2026-05-11T18:36:04.636Z" }, + { url = "https://files.pythonhosted.org/packages/3a/8e/f371a824b1f1fa8ea6e3dbb8703d232977d572be2329554a3bc4d960302f/mypy-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5fdf2941a07434af755837d9880f7d7d25f1dacb1af9dcd4b9b66f2220a3024e", size = 14033929, upload-time = "2026-05-11T18:35:55.742Z" }, + { url = "https://files.pythonhosted.org/packages/94/21/f54be870d6dd53a82c674407e0f8eed7174b05ec78d42e5abd7b42e84fd5/mypy-2.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e195b817c13f02352a9c124301f9f30f078405444679b6753c1b96b6eed37285", size = 15039200, upload-time = "2026-05-11T18:33:10.281Z" }, + { url = "https://files.pythonhosted.org/packages/17/99/bf21748626a40ce59fd29a39386ab46afec88b7bd2f0fa6c3a97c995523f/mypy-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5431d42af987ebd92ba2f71d45c85ed41d8e6ca9f5fd209a69f68f707d2469e5", size = 15272690, upload-time = "2026-05-11T18:32:07.205Z" }, + { url = "https://files.pythonhosted.org/packages/0d/2a/13ca1f292f6db1b98ff495ef3467736b331621c5917cad984b7043e7348d/mypy-2.1.0-py3-none-any.whl", hash = "sha256:a663814603a5c563fb87a4f96fb473eeb30d1f5a4885afcf44f9db000a366289", size = 2693302, upload-time = "2026-05-11T18:31:29.246Z" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, +] + +[[package]] +name = "narwhals" +version = "2.22.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/62/3c/c4ef2164a71c1a63d7f1ae411c4082c5fa872405106db60a4b7114989ad7/narwhals-2.22.1.tar.gz", hash = "sha256:d62920805a0a43b7ff8b54b0c0d3142d796f8a9301836ada37e573d6a33cbcd9", size = 647493, upload-time = "2026-06-05T12:34:34.051Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/ca/36339329c4604adbcc99c899b7eb1ce1a555c499b6a6860757dc9bfed36d/narwhals-2.22.1-py3-none-any.whl", hash = "sha256:60567d774edf77db53906f89d9fbd164e66e56d66d388e1e6990f17ac33cfb53", size = 454815, upload-time = "2026-06-05T12:34:32.289Z" }, +] + +[[package]] +name = "numpy" +version = "2.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/ad/fed0499ce6a338d2a03ebae59cd15093910c8875328855781952abf6c2fe/numpy-2.4.6.tar.gz", hash = "sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda", size = 20735807, upload-time = "2026-05-18T23:37:14.07Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/82/bdab26d7438c6791ca31b7c024ca37c1eab8b726ba236129005cd4a06e45/numpy-2.4.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:511dbaf848decaaaf4b4ca48032619fb3138710c4bf7da7617765edad1ef96b0", size = 16684648, upload-time = "2026-05-18T23:34:29.41Z" }, + { url = "https://files.pythonhosted.org/packages/1b/30/a80189bcc7f5e4258b3fbc3968d909d1756f54d023299ecc39ad6fdb9ef8/numpy-2.4.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bf162abab1c1a736333192707cef898e735a5ca00f38f27eeedf44b39d9e85eb", size = 14693902, upload-time = "2026-05-18T23:34:33.013Z" }, + { url = "https://files.pythonhosted.org/packages/97/12/70b5d0d7c15e1ebb8a6a84a8caa1d19e181d84fb58bb6d70aca29099dec1/numpy-2.4.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:043191bfa8eab18c776647b62723ac9dddece59743b13f49b2016094129c2b3f", size = 5198992, upload-time = "2026-05-18T23:34:36.132Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8c/ebd2a8f8a83541f8d38cc5667e8c2b69cecfd30da6e45693e8158857d44b/numpy-2.4.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:6180d8b35af935aed8ece3a85e0a43f87393ae0ac87c8d2c8bd2c993f7270ef3", size = 6546944, upload-time = "2026-05-18T23:34:38.484Z" }, + { url = "https://files.pythonhosted.org/packages/bb/c5/7b863a97a91671a0338f4253bd3b5a3d3852f0692dae91711c9f4a10e787/numpy-2.4.6-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72fbe16c6fac95aedf5937fa873445cec2110be35d8a4e9433d7501fd98dae6b", size = 15669392, upload-time = "2026-05-18T23:34:41.257Z" }, + { url = "https://files.pythonhosted.org/packages/a5/9d/3584b9984ca4c047aea75214ce1a4c4c73d849bd71b604264b7f5653f8a8/numpy-2.4.6-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7830bab239b79cda9c08c2da014761cafb48da6150e1da17ac06283f43b6089", size = 16633220, upload-time = "2026-05-18T23:34:45.075Z" }, + { url = "https://files.pythonhosted.org/packages/05/ae/7c67fba23bd98caec7c99261f3a16072ade14813486b0282cb29846de832/numpy-2.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ef4aea96ce4d3b074422cb4f2f64e216bf9e213004bb58ecfdf50ea02ea8eb9a", size = 17020800, upload-time = "2026-05-18T23:34:49.065Z" }, + { url = "https://files.pythonhosted.org/packages/d9/5d/3b6725cb31d983c5e66916f5d36f6d7e5521129e4c4404d64f918292a5b6/numpy-2.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dfa20cc6ca228e6b155b11da03825975ce66aea520985dbbddf0f2a5a495c605", size = 18357600, upload-time = "2026-05-18T23:34:52.709Z" }, + { url = "https://files.pythonhosted.org/packages/63/6d/cc5619247c8f4204e507f5883528372e4ac4bb189e579fb859a12e480b1f/numpy-2.4.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:112b06a867b235ef466ed3508ddf0238050df9c727cafb5301ac385b899189a1", size = 14821197, upload-time = "2026-05-18T23:35:05.468Z" }, + { url = "https://files.pythonhosted.org/packages/00/58/f1c39161c87d9e9bed660f1ed4bafc0e403d5ec9650b6dd77aead07d489b/numpy-2.4.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:eaf7fa2de5c0be8ae6ff8e9bea2ccd725e980541244521d8d4b5f3354a27babe", size = 5326287, upload-time = "2026-05-18T23:35:08.693Z" }, + { url = "https://files.pythonhosted.org/packages/af/57/3917ab0fd97f271a8694513581b8a36c655f111c446852c302f04ccdb6fc/numpy-2.4.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7265a2f3d436e54ef9f2b52b5c937e6be778781bd97a590319d7348f1c1ca997", size = 6646763, upload-time = "2026-05-18T23:35:11.459Z" }, + { url = "https://files.pythonhosted.org/packages/eb/0f/037e64c494b67581ae18193d770adef354c41f3f2c8ebf865602d949bf8f/numpy-2.4.6-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f74a575920ab21fe304421a3fc28793d82e299cae9eccb37084e9fc7f3617c20", size = 15728070, upload-time = "2026-05-18T23:35:14.79Z" }, + { url = "https://files.pythonhosted.org/packages/21/a6/5d2bae9c9542eb4df16dc9c46dc79c186e9bad53805dfa5399a6023c6db0/numpy-2.4.6-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ede83e07a75dd06bc501566c1eca2afc0d61677c1472ac9ad93fdee6e638a48d", size = 16681752, upload-time = "2026-05-18T23:35:18.836Z" }, + { url = "https://files.pythonhosted.org/packages/92/14/23d1dfb410ae362cd59ce53e936b1513d545eb40db3949ced632e19a459e/numpy-2.4.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:68bb27509ac1b9a3443094260f6326150663b06abe40b73a2f81160623da5b67", size = 17086024, upload-time = "2026-05-18T23:35:22.52Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6e/23595a2c642cdf3bc567877064bdd7f91c8b0038a4453cf2daf7248eafe9/numpy-2.4.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a0df0043bdb289bde1f62da130d20df23d58b45429f752bc7a8fc5325a225ecd", size = 18403398, upload-time = "2026-05-18T23:35:26.398Z" }, +] + +[[package]] +name = "numpy-quaternion" +version = "2024.0.13" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "scipy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/a0/dad368bca6ef25e2c242fe9a774ee46143d2ab186c521fdc5342e95291a4/numpy_quaternion-2024.0.13.tar.gz", hash = "sha256:e155853fefdfb972b4674f47c30ddb12c825f3ab135a2ea14c67472905c49fd1", size = 66645, upload-time = "2025-11-24T18:51:56.73Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/60/135ab1c887344d4f1e70a4025733b2e9e19f2349ac21106b713911620a40/numpy_quaternion-2024.0.13-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0cd3f2256debaffd8407d1829c1ced71d3b910e75245152d1be673fcb7f23f08", size = 86875, upload-time = "2025-11-24T18:51:37.313Z" }, + { url = "https://files.pythonhosted.org/packages/4f/0b/26ba2dbfe74da3a956828dee249483fdb90d0f1b08b2a55872ff20e12736/numpy_quaternion-2024.0.13-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:070df97e1ad59d6a41b4759ddba53e214488de63c948f144c3c61c9374a64f8d", size = 61668, upload-time = "2025-11-24T18:51:57.82Z" }, + { url = "https://files.pythonhosted.org/packages/af/2b/bb67708f88beea90bddc74229ac7eaa1d9c38c7415179e16a6cba013f5b3/numpy_quaternion-2024.0.13-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:87f062c9258baa5c00ee3dc8c90553314668551d8893d500e101eae25fc4826f", size = 55901, upload-time = "2025-11-24T18:51:50.39Z" }, + { url = "https://files.pythonhosted.org/packages/fe/21/562f81ebae486f6068c12a2be7523c08c2a21110ed0773a1d38088248109/numpy_quaternion-2024.0.13-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b5596e429f3c15d736f23380c7d054903e44fdd4d07a2b9af6f75ec6c9acfe4c", size = 190859, upload-time = "2025-11-24T18:51:47.196Z" }, + { url = "https://files.pythonhosted.org/packages/2e/c4/3fe4f7957d6d79d508ff99a62951034bd19956f4d2c98ada26d5575ff3cc/numpy_quaternion-2024.0.13-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1771afd3abe8477adc0af1fe7b2542eaebf31fafa64a134059e21f8b606d2f0e", size = 185263, upload-time = "2025-11-24T18:51:38.218Z" }, + { url = "https://files.pythonhosted.org/packages/77/77/77e84011dbe4bb08504e45052d7177efeed90cc66139922b6de467a9a4a3/numpy_quaternion-2024.0.13-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:eb438f4d9ab1fd1697f884be0840944d0c55dd934065811473237451b96ec2e2", size = 87811, upload-time = "2025-11-24T18:51:39.625Z" }, + { url = "https://files.pythonhosted.org/packages/bc/3b/343695fc743d2a0814ef9a221a52733c576abe08d17f3795e5b84bfa8355/numpy_quaternion-2024.0.13-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:e0a299e25b6d874b4cd169afd0cf4b703a4ddc8817513eb425fa5a6488001116", size = 62102, upload-time = "2025-11-24T18:51:52.997Z" }, + { url = "https://files.pythonhosted.org/packages/d8/c5/6a105c9a4ffbe3ec51cc45ed916f0a0d9aae35dc9a8dfd29e8cd66122043/numpy_quaternion-2024.0.13-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:41a84c60e50533f833c536475dc49bce4e53a5c100c639cf503f37216b49c8f8", size = 56447, upload-time = "2025-11-24T18:51:48.48Z" }, + { url = "https://files.pythonhosted.org/packages/61/1b/17612dc0517f30ea2679de936975a5c6c827e299ddcbb2b7cc9471b3de10/numpy_quaternion-2024.0.13-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:af4ee46bd834a822c200fb1dc8dc15bee8fa97e2286227fdd0acf243e6974fb9", size = 196462, upload-time = "2025-11-24T18:51:36.13Z" }, + { url = "https://files.pythonhosted.org/packages/ef/08/57ea9c58700211ef7ecbb30ee3bb076c9f9a4f12595f270b4cf5ea2da1e9/numpy_quaternion-2024.0.13-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77a6c9c10de8636cf3b7706045ef21edfc09746f73d4adb883b525ddcb19823a", size = 193631, upload-time = "2025-11-24T18:52:09.318Z" }, +] + +[[package]] +name = "openexr" +version = "3.4.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f0/ca/b7aa434bcde0e7222683415ee15121fdd5cf9b0eb6c34f81d83603cc36ae/openexr-3.4.12.tar.gz", hash = "sha256:877da800b30146e5e29851da2a80147883244966f5b2e932e04f1f1a06ff4fc7", size = 25610803, upload-time = "2026-05-25T02:08:10.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/dc/be431b0b11551b3700c539e8b1296475accdfec2c665b9fe708fddf7b27d/openexr-3.4.12-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:3031ed47d3a579d3fa6998d0a6dad22012ce9fd6a33485fa5339ca4a079d0665", size = 2159902, upload-time = "2026-05-25T02:07:24.134Z" }, + { url = "https://files.pythonhosted.org/packages/01/3c/6b520d85f0e37ca01e88601e744472f4768652748a4e7c9f2933c1ba914b/openexr-3.4.12-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:553f4267221490e846b7f63edcca807fac1757cd242a49063f048fd0e757029c", size = 1023864, upload-time = "2026-05-25T02:07:28.398Z" }, + { url = "https://files.pythonhosted.org/packages/49/43/93762fdef22afb648748910b2c7a4ce58b04a1f3e5d4bdb7fd071b32617b/openexr-3.4.12-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4dc03aa88a57d47c49780bee40c4f0febabf8ed150e2bd60e55f3ee6bea62493", size = 1167448, upload-time = "2026-05-25T02:07:30.381Z" }, + { url = "https://files.pythonhosted.org/packages/e1/f6/36f53b26114955df4c996abb96edb7fc6112fa1db52e30daf1c64b6f9ab1/openexr-3.4.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b8be14c4794f4ad19112fbbed7767c5bf6216435f27cb42a499cdab0f3d26562", size = 2159502, upload-time = "2026-05-25T02:07:33.944Z" }, +] + +[[package]] +name = "outcome" +version = "1.3.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/df/77698abfac98571e65ffeb0c1fba8ffd692ab8458d617a0eed7d9a8d38f2/outcome-1.3.0.post0.tar.gz", hash = "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8", size = 21060, upload-time = "2023-10-26T04:26:04.361Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/8b/5ab7257531a5d830fc8000c476e63c935488d74609b50f9384a643ec0a62/outcome-1.3.0.post0-py2.py3-none-any.whl", hash = "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b", size = 10692, upload-time = "2023-10-26T04:26:02.532Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pandas" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "python-dateutil", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/87/4341c6252d1c47b08768c3d25ac487362bf403f0313ddae4a2a26c9b1b4c/pandas-3.0.3.tar.gz", hash = "sha256:696a4a00a2a2a35d4e5deb3fc946641b96c944f02230e4f76137fe35d806c4fc", size = 4651414, upload-time = "2026-05-11T18:54:29.21Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/90/62d8302883c44308c477e222c3daf7c813a34c8e96985882fbd53d964352/pandas-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:67b3b64c11910cfa29f4e94a14d3bff9ee693b6fc76055e7cad549cee0aec5fa", size = 10331071, upload-time = "2026-05-11T18:52:58.838Z" }, + { url = "https://files.pythonhosted.org/packages/7f/ae/6a6493c783a101f165e4356953ba3c74d6f77f0042fa7d753da9dfbb640c/pandas-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:39436b377d56d2a2e52d0395bdbee171f01068e99af5250509aceeb929f765c7", size = 9875690, upload-time = "2026-05-11T18:53:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/62/7c/5df8e9f56c69a2769fbe9382a5ef8f2658c007e376434e1e2cbb57ad895f/pandas-3.0.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4be06d68f9ddcfc645b87534911da79a8fbffc7573c80e0edcf42a5020624d8", size = 10381634, upload-time = "2026-05-11T18:53:04.393Z" }, + { url = "https://files.pythonhosted.org/packages/99/68/1237369725aa617bb358263d535803e3053fdbc593513ec5ed9c9896b5b6/pandas-3.0.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a4eeb6830daf35a71cc09649bd823e2b542dac246cdee9614c6e4bd65028cd6a", size = 10891243, upload-time = "2026-05-11T18:53:07.643Z" }, + { url = "https://files.pythonhosted.org/packages/25/93/77d108e8af7222b4a503ebde0e30215b1c2e4f8e53a526431890f22d5586/pandas-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1928e07221f82db493cd4af1e23c1bfca524a19a4699887975bff68f49a72bfb", size = 11388659, upload-time = "2026-05-11T18:53:10.634Z" }, + { url = "https://files.pythonhosted.org/packages/d0/bd/eff5b4399f332ac386c853f6cd2bd3fa2ca0061b9f36ecd9c4d7c4265649/pandas-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51b1fe551acb77dac643c6fda86084d8d446c10fe64b06a9cc29c4cc8540e7f2", size = 11942880, upload-time = "2026-05-11T18:53:13.536Z" }, + { url = "https://files.pythonhosted.org/packages/57/0e/efe801b0e6811e8e650cd21b7f2608e30f08a7067e2bf6e8752b0d56ee3c/pandas-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:46997386d528eb40376ecd6b033cf4a8a1e5282580f68f43de875b78cba2199d", size = 10767016, upload-time = "2026-05-11T18:53:21.227Z" }, + { url = "https://files.pythonhosted.org/packages/ea/dc/eb55135a1d5f0f0519f28da1f609a206d2cad1f9c35c32d51e38dd7261ae/pandas-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:261e308dfb22448384b7580cf719d2f998fe2966c92893c3e77d14008af1f066", size = 10420210, upload-time = "2026-05-11T18:53:23.982Z" }, + { url = "https://files.pythonhosted.org/packages/c6/3e/b1d5d955ce33ffecb407465a60bc32769d74fcf68224b7ae67ae11d4dea4/pandas-3.0.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dd1a5d1def6a46002e964510bdc67c368aa0951df5d1d9f8365336f5a1f490cd", size = 10336126, upload-time = "2026-05-11T18:53:26.731Z" }, + { url = "https://files.pythonhosted.org/packages/f5/76/a01261711ab60a22d71b862f0de20e4c504bf80457270ad8cb42110f6abc/pandas-3.0.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d72828c20c6d6e83e1e22a6a3b47b326b71664112fa9705dcbccfd7a39b62085", size = 10728051, upload-time = "2026-05-11T18:53:29.125Z" }, + { url = "https://files.pythonhosted.org/packages/e9/21/ea191195e587b18cf682e97f433f81b2d0fbe341380e80a3e0d6e4403c8e/pandas-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d26cbe1fcfc12e8fd900e2454163e466b2d3af84f7c75481df7683ffc073d870", size = 11350796, upload-time = "2026-05-11T18:53:32.056Z" }, + { url = "https://files.pythonhosted.org/packages/64/69/f0eaaf54939f0e8c6768fd06be9af2cef9b36048b96dfb9e1b2c685a807e/pandas-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e91cec1879ada0624fc3dc9953c5cbd60208e59c0db28f540c5d6d47502422f", size = 11799741, upload-time = "2026-05-11T18:53:34.985Z" }, +] + +[[package]] +name = "pandas-stubs" +version = "3.0.3.260530" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/aa/c41a8a0ff86fd85dbb3ec0c1f3fa488ca64a8b5f82654ae1b07d84acefe5/pandas_stubs-3.0.3.260530.tar.gz", hash = "sha256:d1efe47b2e5a312c047d7feabec5cb7a55365747983420077e9fcbe9ab74f714", size = 113183, upload-time = "2026-05-30T17:47:40.34Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/e0/99ec5b02203c4e9ce878bc63d8caa06ac1f891e4d63bded9a5ced70fcb4f/pandas_stubs-3.0.3.260530-py3-none-any.whl", hash = "sha256:a6277eb1c8cebf48d9b2413fcd2e9a6b4ff479c934a223c29eacbc3058c4cb55", size = 173780, upload-time = "2026-05-30T17:47:39.13Z" }, +] + +[[package]] +name = "pathspec" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180, upload-time = "2026-04-27T01:46:08.907Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z" }, +] + +[[package]] +name = "picamera2" +version = "0.3.36" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "av", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "jsonschema", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "libarchive-c", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "openexr", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pidng", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "piexif", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pillow", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "python-prctl", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "simplejpeg", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "tqdm", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "videodev2", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/9a/1e4a8cb27098735b8d6bf1d68e6ed3e2ca758c078fdebb3728334d3381a8/picamera2-0.3.36.tar.gz", hash = "sha256:3add10c8e5613234f39f271c90b886306e6fa4a64c99196a2451c308bd278d70", size = 109041, upload-time = "2026-05-06T14:51:25.772Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/e9/484a810cfd4564df7fbf632925971a2d12be8867866aa539f3136ec1cea4/picamera2-0.3.36-py3-none-any.whl", hash = "sha256:99c2b97a65e5739ce68743b79e627b1bbb9024d91bc5e3915b98cfd0dcbec1a0", size = 129664, upload-time = "2026-05-06T14:51:24.521Z" }, +] + +[[package]] +name = "pidng" +version = "4.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/65/2670c465c8a63a23eb3a5e5547262e247e1aa2d3889a0a6781da9109d5f7/pidng-4.0.9.tar.gz", hash = "sha256:560eb008086f8a715fd9e1ab998817a7d4c8500a7f161b9ce6af5ab27501f82c", size = 21907, upload-time = "2022-05-06T19:09:32.093Z" } + +[[package]] +name = "piexif" +version = "1.1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/84/a3f25cec7d0922bf60be8000c9739d28d24b6896717f44cc4cfb843b1487/piexif-1.1.3.zip", hash = "sha256:83cb35c606bf3a1ea1a8f0a25cb42cf17e24353fd82e87ae3884e74a302a5f1b", size = 1011134, upload-time = "2019-07-01T15:29:23.045Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/d8/6f63147dd73373d051c5eb049ecd841207f898f50a5a1d4378594178f6cf/piexif-1.1.3-py2.py3-none-any.whl", hash = "sha256:3bc435d171720150b81b15d27e05e54b8abbde7b4242cddd81ef160d283108b6", size = 20691, upload-time = "2019-07-01T15:43:20.907Z" }, +] + +[[package]] +name = "pifinder" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "adafruit-blinka", marker = "sys_platform == 'linux'" }, + { name = "adafruit-circuitpython-bno055", marker = "sys_platform == 'linux'" }, + { name = "adafruit-extended-bus", marker = "sys_platform == 'linux'" }, + { name = "aiofiles", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "av", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "cedar-solve", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "dataclasses-json", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "dbus-python", marker = "(platform_machine == 'aarch64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux')" }, + { name = "flask", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "flask-babel", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "gpsdclient", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "grpcio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "json5", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "jsonschema", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "libarchive-c", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "luma-lcd", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "luma-oled", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "numpy-quaternion", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pandas", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "picamera2", marker = "(platform_machine == 'aarch64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux')" }, + { name = "pidng", marker = "sys_platform == 'linux'" }, + { name = "pillow", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "protobuf", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pydeepskylog", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pyerfa", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pygobject", marker = "(platform_machine == 'aarch64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux')" }, + { name = "pyjwt", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "python-libinput", marker = "(platform_machine == 'aarch64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux')" }, + { name = "python-pam", marker = "sys_platform == 'linux'" }, + { name = "python-prctl", marker = "(platform_machine == 'aarch64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux')" }, + { name = "pytz", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "requests", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "rpi-gpio", marker = "(platform_machine == 'aarch64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux')" }, + { name = "rpi-hardware-pwm", marker = "(platform_machine == 'aarch64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux')" }, + { name = "scikit-learn", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "scipy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "sh", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "simplejpeg", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "skyfield", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "smbus2", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "spidev", marker = "(platform_machine == 'aarch64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux')" }, + { name = "timezonefinder", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "tqdm", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "videodev2", marker = "sys_platform == 'linux'" }, + { name = "waitress", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] + +[package.dev-dependencies] +dev = [ + { name = "luma-emulator", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "mypy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pandas-stubs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pyhotkey", marker = "(platform_machine == 'aarch64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux')" }, + { name = "pynput", marker = "(platform_machine == 'aarch64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux')" }, + { name = "pytest", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "selenium", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "types-aiofiles", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "types-pynput", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "types-pytz", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "types-requests", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "types-tqdm", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "types-waitress", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "xlrd", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] + +[package.metadata] +requires-dist = [ + { name = "adafruit-blinka", marker = "sys_platform == 'linux'" }, + { name = "adafruit-circuitpython-bno055", marker = "sys_platform == 'linux'" }, + { name = "adafruit-extended-bus", marker = "sys_platform == 'linux'" }, + { name = "aiofiles" }, + { name = "av" }, + { name = "cedar-solve", git = "https://github.com/smroid/cedar-solve?rev=d8ff1d857a363c88917fd8e126ab90e24b1cfbcc" }, + { name = "dataclasses-json" }, + { name = "dbus-python", marker = "platform_machine == 'aarch64'" }, + { name = "flask" }, + { name = "flask-babel" }, + { name = "gpsdclient" }, + { name = "grpcio" }, + { name = "json5" }, + { name = "jsonschema" }, + { name = "libarchive-c" }, + { name = "luma-lcd" }, + { name = "luma-oled" }, + { name = "numpy" }, + { name = "numpy-quaternion" }, + { name = "pandas" }, + { name = "picamera2", marker = "platform_machine == 'aarch64'" }, + { name = "pidng", marker = "sys_platform == 'linux'" }, + { name = "pillow" }, + { name = "protobuf" }, + { name = "pydeepskylog" }, + { name = "pyerfa" }, + { name = "pygobject", marker = "platform_machine == 'aarch64'" }, + { name = "pyjwt" }, + { name = "python-libinput", marker = "platform_machine == 'aarch64'", specifier = "==0.3.0a0" }, + { name = "python-pam", marker = "sys_platform == 'linux'" }, + { name = "python-prctl", marker = "platform_machine == 'aarch64'" }, + { name = "pytz" }, + { name = "requests" }, + { name = "rpi-gpio", marker = "platform_machine == 'aarch64'" }, + { name = "rpi-hardware-pwm", marker = "platform_machine == 'aarch64'" }, + { name = "scikit-learn" }, + { name = "scipy" }, + { name = "sh", specifier = ">=1.14,<2" }, + { name = "simplejpeg" }, + { name = "skyfield" }, + { name = "smbus2" }, + { name = "spidev", marker = "platform_machine == 'aarch64'" }, + { name = "timezonefinder" }, + { name = "tqdm" }, + { name = "videodev2", marker = "sys_platform == 'linux'" }, + { name = "waitress" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "luma-emulator" }, + { name = "mypy" }, + { name = "pandas-stubs" }, + { name = "pyhotkey", marker = "platform_machine == 'aarch64'" }, + { name = "pynput", marker = "platform_machine == 'aarch64'" }, + { name = "pytest" }, + { name = "selenium" }, + { name = "types-aiofiles" }, + { name = "types-pynput" }, + { name = "types-pytz" }, + { name = "types-requests" }, + { name = "types-tqdm" }, + { name = "types-waitress" }, + { name = "xlrd", specifier = ">=2.0.1" }, +] + +[[package]] +name = "pillow" +version = "12.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/01/53d10cf0dbad820a8db274d259a37ba50b88b24768ddccec07355382d5ad/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8297651f5b5679c19968abefd6bb84d95fe30ef712eb1b2d9b2d31ca61267f4c", size = 4100837, upload-time = "2026-04-01T14:43:41.506Z" }, + { url = "https://files.pythonhosted.org/packages/0f/98/f3a6657ecb698c937f6c76ee564882945f29b79bad496abcba0e84659ec5/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:50d8520da2a6ce0af445fa6d648c4273c3eeefbc32d7ce049f22e8b5c3daecc2", size = 4176528, upload-time = "2026-04-01T14:43:43.773Z" }, + { url = "https://files.pythonhosted.org/packages/69/bc/8986948f05e3ea490b8442ea1c1d4d990b24a7e43d8a51b2c7d8b1dced36/pillow-12.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:766cef22385fa1091258ad7e6216792b156dc16d8d3fa607e7545b2b72061f1c", size = 3640401, upload-time = "2026-04-01T14:43:45.87Z" }, + { url = "https://files.pythonhosted.org/packages/34/46/6c717baadcd62bc8ed51d238d521ab651eaa74838291bda1f86fe1f864c9/pillow-12.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5d2fd0fa6b5d9d1de415060363433f28da8b1526c1c129020435e186794b3795", size = 5308094, upload-time = "2026-04-01T14:43:48.438Z" }, + { url = "https://files.pythonhosted.org/packages/71/43/905a14a8b17fdb1ccb58d282454490662d2cb89a6bfec26af6d3520da5ec/pillow-12.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b25336f502b6ed02e889f4ece894a72612fe885889a6e8c4c80239ff6e5f5f", size = 4695402, upload-time = "2026-04-01T14:43:51.292Z" }, + { url = "https://files.pythonhosted.org/packages/73/dd/42107efcb777b16fa0393317eac58f5b5cf30e8392e266e76e51cff28c3d/pillow-12.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f1c943e96e85df3d3478f7b691f229887e143f81fedab9b20205349ab04d73ed", size = 6280005, upload-time = "2026-04-01T14:43:54.242Z" }, + { url = "https://files.pythonhosted.org/packages/a8/68/b93e09e5e8549019e61acf49f65b1a8530765a7f812c77a7461bca7e4494/pillow-12.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03f6fab9219220f041c74aeaa2939ff0062bd5c364ba9ce037197f4c6d498cd9", size = 8090669, upload-time = "2026-04-01T14:43:57.335Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6e/3ccb54ce8ec4ddd1accd2d89004308b7b0b21c4ac3d20fa70af4760a4330/pillow-12.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdfebd752ec52bf5bb4e35d9c64b40826bc5b40a13df7c3cda20a2c03a0f5ed", size = 6395194, upload-time = "2026-04-01T14:43:59.864Z" }, + { url = "https://files.pythonhosted.org/packages/67/ee/21d4e8536afd1a328f01b359b4d3997b291ffd35a237c877b331c1c3b71c/pillow-12.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eedf4b74eda2b5a4b2b2fb4c006d6295df3bf29e459e198c90ea48e130dc75c3", size = 7082423, upload-time = "2026-04-01T14:44:02.74Z" }, + { url = "https://files.pythonhosted.org/packages/78/5f/e9f86ab0146464e8c133fe85df987ed9e77e08b29d8d35f9f9f4d6f917ba/pillow-12.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9", size = 6505667, upload-time = "2026-04-01T14:44:05.381Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1e/409007f56a2fdce61584fd3acbc2bbc259857d555196cedcadc68c015c82/pillow-12.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e1757442ed87f4912397c6d35a0db6a7b52592156014706f17658ff58bbf795", size = 7208580, upload-time = "2026-04-01T14:44:08.39Z" }, + { url = "https://files.pythonhosted.org/packages/4d/a4/b342930964e3cb4dce5038ae34b0eab4653334995336cd486c5a8c25a00c/pillow-12.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:042db20a421b9bafecc4b84a8b6e444686bd9d836c7fd24542db3e7df7baad9b", size = 5309927, upload-time = "2026-04-01T14:44:18.89Z" }, + { url = "https://files.pythonhosted.org/packages/9f/de/23198e0a65a9cf06123f5435a5d95cea62a635697f8f03d134d3f3a96151/pillow-12.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd025009355c926a84a612fecf58bb315a3f6814b17ead51a8e48d3823d9087f", size = 4698624, upload-time = "2026-04-01T14:44:21.115Z" }, + { url = "https://files.pythonhosted.org/packages/01/a6/1265e977f17d93ea37aa28aa81bad4fa597933879fac2520d24e021c8da3/pillow-12.2.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88ddbc66737e277852913bd1e07c150cc7bb124539f94c4e2df5344494e0a612", size = 6321252, upload-time = "2026-04-01T14:44:23.663Z" }, + { url = "https://files.pythonhosted.org/packages/3c/83/5982eb4a285967baa70340320be9f88e57665a387e3a53a7f0db8231a0cd/pillow-12.2.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d362d1878f00c142b7e1a16e6e5e780f02be8195123f164edf7eddd911eefe7c", size = 8126550, upload-time = "2026-04-01T14:44:26.772Z" }, + { url = "https://files.pythonhosted.org/packages/4e/48/6ffc514adce69f6050d0753b1a18fd920fce8cac87620d5a31231b04bfc5/pillow-12.2.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c727a6d53cb0018aadd8018c2b938376af27914a68a492f59dfcaca650d5eea", size = 6433114, upload-time = "2026-04-01T14:44:29.615Z" }, + { url = "https://files.pythonhosted.org/packages/36/a3/f9a77144231fb8d40ee27107b4463e205fa4677e2ca2548e14da5cf18dce/pillow-12.2.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd8c21c98c5cc60653bcb311bef2ce0401642b7ce9d09e03a7da87c878289d4", size = 7115667, upload-time = "2026-04-01T14:44:32.773Z" }, + { url = "https://files.pythonhosted.org/packages/c1/fc/ac4ee3041e7d5a565e1c4fd72a113f03b6394cc72ab7089d27608f8aaccb/pillow-12.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f08483a632889536b8139663db60f6724bfcb443c96f1b18855860d7d5c0fd4", size = 6538966, upload-time = "2026-04-01T14:44:35.252Z" }, + { url = "https://files.pythonhosted.org/packages/c0/a8/27fb307055087f3668f6d0a8ccb636e7431d56ed0750e07a60547b1e083e/pillow-12.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dac8d77255a37e81a2efcbd1fc05f1c15ee82200e6c240d7e127e25e365c39ea", size = 7238241, upload-time = "2026-04-01T14:44:37.875Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "protobuf" +version = "7.35.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/01/9ef0afd7999eb9badb3a768b4aedd78c86d4c65cfaf1958ab276199e76b4/protobuf-7.35.1.tar.gz", hash = "sha256:ce115a26fe0c39a2c29973d914d327e516a6455464489fe3cd1e51a1b354f81a", size = 458717, upload-time = "2026-06-11T21:55:40.257Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/03/8aeeb7458d22546bf64b5250ca1daeb5ff757d900e8e4a7476c6f0db843e/protobuf-7.35.1-cp310-abi3-macosx_10_9_universal2.whl", hash = "sha256:24f857477359a85c0c235261b8ba905fd51b2562f4a64ca1df5473f29850cbf6", size = 433226, upload-time = "2026-06-11T21:55:31.719Z" }, + { url = "https://files.pythonhosted.org/packages/37/4b/dfb89eb0e652a1ff073c39a59fb5e3a83cfe9b57a2c83fa6d78270101767/protobuf-7.35.1-cp310-abi3-manylinux2014_aarch64.whl", hash = "sha256:11d6b0ec246892d85215b0a13ca6e0233cf5284b68f0ac02646427f4ff88a799", size = 328847, upload-time = "2026-06-11T21:55:34.035Z" }, + { url = "https://files.pythonhosted.org/packages/0f/58/dc12f2cd484951524af6e3382c785869b9b3fb5e52ee95ae23add53ee8f9/protobuf-7.35.1-cp310-abi3-manylinux2014_s390x.whl", hash = "sha256:b73f9489a4b8b1c9cb1f8ed951c736392592edb24b9d6819f36d2e10b171d5b4", size = 344030, upload-time = "2026-06-11T21:55:34.941Z" }, + { url = "https://files.pythonhosted.org/packages/e4/be/5b3cfe508bfab6761414ff944e3366eb13be4fd71efcd69450f89ba39f43/protobuf-7.35.1-cp310-abi3-manylinux2014_x86_64.whl", hash = "sha256:74758715c53d7158fb76caf4f0cfdacc5329a4b1bb994f865d6cf302d413a1c4", size = 327130, upload-time = "2026-06-11T21:55:35.921Z" }, + { url = "https://files.pythonhosted.org/packages/19/c7/5f7c636ec43e0c545e28d1f1db71990108306f7bdcb89f069ba97e428e7f/protobuf-7.35.1-py3-none-any.whl", hash = "sha256:4bc97768d8fe4ad6743c8a19403e314511ed9f6d13205b687e52421c023ac1b9", size = 171659, upload-time = "2026-06-11T21:55:39.155Z" }, +] + +[[package]] +name = "pycairo" +version = "1.29.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/d9/1728840a22a4ef8a8f479b9156aa2943cd98c3907accd3849fb0d5f82bfd/pycairo-1.29.0.tar.gz", hash = "sha256:f3f7fde97325cae80224c09f12564ef58d0d0f655da0e3b040f5807bd5bd3142", size = 665871, upload-time = "2025-11-11T19:13:01.584Z" } + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pydeepskylog" +version = "1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/45/ed/ea27d8e554cce16ba402aa349251c9d1bbc269efa93a9546a389b9ea1e4e/pydeepskylog-1.6.tar.gz", hash = "sha256:ddeae6d004817cfb50d5c9e0cecaa4654ae72a82cd201bbc5350fa880e1e3e61", size = 37915, upload-time = "2025-07-30T15:01:59.976Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/00/e7f11ab824ef760fe22c93012b90631d8772c7af3a58d22f15d0b383f51e/pydeepskylog-1.6-py3-none-any.whl", hash = "sha256:f4fa53b1f980a61846a3e79fa8d4134f809703d9ac346dc98bfc49091ee237f9", size = 39814, upload-time = "2025-07-30T15:01:58.864Z" }, +] + +[[package]] +name = "pyerfa" +version = "2.0.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/39/63cc8291b0cf324ae710df41527faf7d331bce573899199d926b3e492260/pyerfa-2.0.1.5.tar.gz", hash = "sha256:17d6b24fe4846c65d5e7d8c362dcb08199dc63b30a236aedd73875cc83e1f6c0", size = 818430, upload-time = "2024-11-11T15:22:30.852Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7d/d9/3448a57cb5bd19950de6d6ab08bd8fbb3df60baa71726de91d73d76c481b/pyerfa-2.0.1.5-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b282d7c60c4c47cf629c484c17ac504fcb04abd7b3f4dfcf53ee042afc3a5944", size = 341818, upload-time = "2024-11-11T15:22:16.467Z" }, + { url = "https://files.pythonhosted.org/packages/11/4a/31a363370478b63c6289a34743f2ba2d3ae1bd8223e004d18ab28fb92385/pyerfa-2.0.1.5-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:be1aeb70390dd03a34faf96749d5cabc58437410b4aab7213c512323932427df", size = 329370, upload-time = "2024-11-11T15:22:17.829Z" }, + { url = "https://files.pythonhosted.org/packages/cb/96/b6210fc624123c8ae13e1eecb68fb75e3f3adff216d95eee1c7b05843e3e/pyerfa-2.0.1.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0603e8e1b839327d586c8a627cdc634b795e18b007d84f0cda5500a0908254e", size = 692794, upload-time = "2024-11-11T15:22:19.429Z" }, + { url = "https://files.pythonhosted.org/packages/e5/e0/050018d855d26d3c0b4a7d1b2ed692be758ce276d8289e2a2b44ba1014a5/pyerfa-2.0.1.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e43c7194e3242083f2350b46c09fd4bf8ba1bcc0ebd1460b98fc47fe2389906", size = 738711, upload-time = "2024-11-11T15:22:20.661Z" }, + { url = "https://files.pythonhosted.org/packages/b9/f5/ff91ee77308793ae32fa1e1de95e9edd4551456dd888b4e87c5938657ca5/pyerfa-2.0.1.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:07b80cd70701f5d066b1ac8cce406682cfcd667a1186ec7d7ade597239a6021d", size = 722966, upload-time = "2024-11-11T15:22:21.905Z" }, +] + +[[package]] +name = "pyftdi" +version = "0.57.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyserial", marker = "sys_platform == 'linux'" }, + { name = "pyusb", marker = "sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/de/260694fa63dab6629c6ba7c2315de64dbd766eb761198b61fba96cbe7ea4/pyftdi-0.57.2-py3-none-any.whl", hash = "sha256:dec3acdc262594d8b1850a6aee608b861c2973f90011faf5cccae3107d3c67a4", size = 146319, upload-time = "2026-06-02T16:14:37.818Z" }, +] + +[[package]] +name = "pygame" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/49/cc/08bba60f00541f62aaa252ce0cfbd60aebd04616c0b9574f755b583e45ae/pygame-2.6.1.tar.gz", hash = "sha256:56fb02ead529cee00d415c3e007f75e0780c655909aaa8e8bf616ee09c9feb1f", size = 14808125, upload-time = "2024-09-29T13:41:34.698Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/91/718acf3e2a9d08a6ddcc96bd02a6f63c99ee7ba14afeaff2a51c987df0b9/pygame-2.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae6039f3a55d800db80e8010f387557b528d34d534435e0871326804df2a62f2", size = 13090765, upload-time = "2024-09-29T14:27:02.377Z" }, + { url = "https://files.pythonhosted.org/packages/0e/c6/9cb315de851a7682d9c7568a41ea042ee98d668cb8deadc1dafcab6116f0/pygame-2.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2a3a1288e2e9b1e5834e425bedd5ba01a3cd4902b5c2bff8ed4a740ccfe98171", size = 12381704, upload-time = "2024-09-29T14:27:10.228Z" }, + { url = "https://files.pythonhosted.org/packages/9f/8f/617a1196e31ae3b46be6949fbaa95b8c93ce15e0544266198c2266cc1b4d/pygame-2.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27eb17e3dc9640e4b4683074f1890e2e879827447770470c2aba9f125f74510b", size = 13581091, upload-time = "2024-09-29T11:30:27.653Z" }, + { url = "https://files.pythonhosted.org/packages/3b/87/2851a564e40a2dad353f1c6e143465d445dab18a95281f9ea458b94f3608/pygame-2.6.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c1623180e70a03c4a734deb9bac50fc9c82942ae84a3a220779062128e75f3b", size = 14273844, upload-time = "2024-09-29T11:40:04.138Z" }, + { url = "https://files.pythonhosted.org/packages/85/b5/aa23aa2e70bcba42c989c02e7228273c30f3b44b9b264abb93eaeff43ad7/pygame-2.6.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef07c0103d79492c21fced9ad68c11c32efa6801ca1920ebfd0f15fb46c78b1c", size = 13951197, upload-time = "2024-09-29T11:40:06.785Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pygobject" +version = "3.56.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycairo", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/da/61/978c5fbca34f10a90df362502fbb5a005637909e7b5a0e9212349ea9d010/pygobject-3.56.3.tar.gz", hash = "sha256:12760e4a0e3d04b6eb95e06f7a27e362c826d567ea613373a92c003b6c70d2d6", size = 1411853, upload-time = "2026-05-08T20:46:39.904Z" } + +[[package]] +name = "pyhotkey" +version = "1.5.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pynput", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5d/0b/f61560ed6cb554b5973b1902419adf616ed678781e40d7c0de2f4600593f/PyHotKey-1.5.2.tar.gz", hash = "sha256:39b579c038e7850c26aa67cc1f917d5546c9d973ce60ab991fd386a1d49d1ab4", size = 17993, upload-time = "2024-08-01T05:40:25.139Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/f3/9033d43dce32e075430a78d2c2d96fb1f81b16159f459723e3e5f818c3fb/PyHotKey-1.5.2-py3-none-any.whl", hash = "sha256:9a353ac6cd8385038dcf7142df10cf113f8541bc3128e8349b08b051f79d9983", size = 19890, upload-time = "2024-08-01T05:40:23.563Z" }, +] + +[[package]] +name = "pyjwt" +version = "2.13.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/81/58d0ac84e1ef3a3843791d6954d94c0b33d526c75eeb1efbce9d0a4c4077/pyjwt-2.13.0.tar.gz", hash = "sha256:41571c89ca91598c79e8ef18a2d07367d4810fbbd6f637794879baf1b7703423", size = 107515, upload-time = "2026-05-21T19:54:36.618Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/5e/ecf12fdb62546d64385c158514e9b2b671f7832108ef2ecd2020ce0af2d1/pyjwt-2.13.0-py3-none-any.whl", hash = "sha256:66adcc2aff09b3f1bbd95fc1e1577df8ac8723c978552fd43304c8a290ac5728", size = 31274, upload-time = "2026-05-21T19:54:35.362Z" }, +] + +[[package]] +name = "pynput" +version = "1.7.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "evdev", marker = "(sys_platform == 'darwin' and 'linux' in sys_platform) or (sys_platform == 'linux' and 'linux' in sys_platform)" }, + { name = "pyobjc-framework-applicationservices", marker = "sys_platform == 'darwin'" }, + { name = "pyobjc-framework-quartz", marker = "sys_platform == 'darwin'" }, + { name = "python-xlib", marker = "(sys_platform == 'darwin' and 'linux' in sys_platform) or (sys_platform == 'linux' and 'linux' in sys_platform)" }, + { name = "six", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/1d/fdef3fdc9dc8dedc65898c8ad0e8922a914bb89c5308887e45f9aafaec36/pynput-1.7.7-py2.py3-none-any.whl", hash = "sha256:afc43f651684c98818de048abc76adf9f2d3d797083cb07c1f82be764a2d44cb", size = 90243, upload-time = "2024-05-10T13:30:04.238Z" }, +] + +[[package]] +name = "pyobjc-core" +version = "12.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b4/b1/729f7458a63758bd21716648a8abcd9a0c8f2d2e9897763c8a1a1c7fd31b/pyobjc_core-12.2.1.tar.gz", hash = "sha256:7a7b9b018402342cf32bf1956366896350fbe5c0478cb3ef59778f77abed7f07", size = 1063383, upload-time = "2026-06-19T16:19:39.357Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/1e/b9b0ddffae66996b8779f1f7958adc9f21c13a0448cd3be8d7fe589b5b0f/pyobjc_core-12.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:af101222762665a4125157906cb4b23f5d5a63d3851d5e0504f72a1eaaa2cfd2", size = 6436004, upload-time = "2026-06-19T16:04:53.257Z" }, + { url = "https://files.pythonhosted.org/packages/8f/26/bd309ede07784c6e5fac4b440c90a5f72a66da7859ed303a9392fe8a5f3f/pyobjc_core-12.2.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:efe465e3ecc6fc73f7c7622620345d134a8d34564ab1c29d8247e45f4ed55071", size = 6687044, upload-time = "2026-06-19T16:04:57.42Z" }, +] + +[[package]] +name = "pyobjc-framework-applicationservices" +version = "12.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core", marker = "sys_platform == 'darwin'" }, + { name = "pyobjc-framework-cocoa", marker = "sys_platform == 'darwin'" }, + { name = "pyobjc-framework-coretext", marker = "sys_platform == 'darwin'" }, + { name = "pyobjc-framework-quartz", marker = "sys_platform == 'darwin'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5e/4d/0ebdd8144aba94b8fe9828ccee5616a4bf53d1f8bc51cff55f3cce86d695/pyobjc_framework_applicationservices-12.2.1.tar.gz", hash = "sha256:048ea663c9ac75c44a15dc7d5b8d78cbb4c97bf1c76e83835e8d5498e184001f", size = 109342, upload-time = "2026-06-19T16:19:46.149Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/6e/8e928d5e3025529ed92c6eb5fd88a5e6e485cc6df945c541f29b4af7f2c6/pyobjc_framework_applicationservices-12.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8749290f796e6cca341d443769b79329dde5d157bcc4413c1f7fdb68ea4a8e48", size = 32782, upload-time = "2026-06-19T16:05:40.284Z" }, + { url = "https://files.pythonhosted.org/packages/50/a5/c7b5a31777fe2ce7c07b9c16941ff4fbf0a150bf755164d96228d32ccb4f/pyobjc_framework_applicationservices-12.2.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:9ee11677fbd6a0987234814c7dde88ffd11242e8c1f76952e6654ea07f2370ac", size = 33048, upload-time = "2026-06-19T16:05:41.308Z" }, +] + +[[package]] +name = "pyobjc-framework-cocoa" +version = "12.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core", marker = "sys_platform == 'darwin'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/51/34/fbe38a204643aa4e1b91391cdce07a34da565a69171ebcad08de7438a556/pyobjc_framework_cocoa-12.2.1.tar.gz", hash = "sha256:b94b37fe5730e5ae1fb0052912cd174e6ec329b0bfba4a012ae5db1014b5864b", size = 3125751, upload-time = "2026-06-19T16:20:05.159Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/46/68e8e4d926a2f70fed0437047bc3f9fe08af8fe620d94d80656ebc3cfa9b/pyobjc_framework_cocoa-12.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3b74a78fa7803e547b32e5e8ec1b49987b52fe318383e793bc6cd49b80efbd9f", size = 388183, upload-time = "2026-06-19T16:07:40.483Z" }, + { url = "https://files.pythonhosted.org/packages/2e/f3/dfc9af4c9eb2e5389c860ad5ef252be9fe456db09f39d537555dc5057aa1/pyobjc_framework_cocoa-12.2.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:dc2eaca2f13c7bcd8e41e51a372e47825dea9dd3126108760eed7ba883d2945c", size = 392275, upload-time = "2026-06-19T16:07:42.078Z" }, +] + +[[package]] +name = "pyobjc-framework-coretext" +version = "12.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core", marker = "sys_platform == 'darwin'" }, + { name = "pyobjc-framework-cocoa", marker = "sys_platform == 'darwin'" }, + { name = "pyobjc-framework-quartz", marker = "sys_platform == 'darwin'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/9c/4c7f452059dc1d3845b8e627b9113c247a997b9b07518e848c2ab7ff3149/pyobjc_framework_coretext-12.2.1.tar.gz", hash = "sha256:af740e784d7c592c34025ec7165f4f6c1a69b5a2d9075f06e41e4f77c212aed2", size = 97349, upload-time = "2026-06-19T16:20:22.508Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/8c/154e8f34923b24aade64a20eca2b759f8f67e109654308103080751f246f/pyobjc_framework_coretext-12.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5c5a3c6e2d905a17efb15572dad97ce582feeab5c3b92537015445e0e0bb46de", size = 30116, upload-time = "2026-06-19T16:09:52.219Z" }, + { url = "https://files.pythonhosted.org/packages/01/61/f53458c8f7fe74008e342946eca1fa82b777b284d4e13d8bd2e3e5724cab/pyobjc_framework_coretext-12.2.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5c979058c77df8cd3dac5fd7db4c484f9886fbe09e2687bfaf269a856f631f78", size = 30659, upload-time = "2026-06-19T16:09:53.034Z" }, +] + +[[package]] +name = "pyobjc-framework-quartz" +version = "12.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core", marker = "sys_platform == 'darwin'" }, + { name = "pyobjc-framework-cocoa", marker = "sys_platform == 'darwin'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3b/f6/2a8b84dbf1fe7c04dd96ea73d991678d4e09a909f51971ecc51629bb2ab4/pyobjc_framework_quartz-12.2.1.tar.gz", hash = "sha256:b3b8b6f71e66147f8ff9e6213864cc8527e3a0b1ee90835b93ce221f4802d9b0", size = 3215521, upload-time = "2026-06-19T16:21:30.199Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/4b/861f91a1565d3189ee899e177b915551fb9a7e2ca25414025a8974f04e74/pyobjc_framework_quartz-12.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:54c9bc7f507192691841ee4eba5bf36990b259df83ac728efed2d7ea1cd021e4", size = 219403, upload-time = "2026-06-19T16:16:05.645Z" }, + { url = "https://files.pythonhosted.org/packages/ba/b5/b27010d2f288737f627f74be6d5549f49c841542365c84b9a3011fe39ce7/pyobjc_framework_quartz-12.2.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:bfc0d2badd819823d21df8069dcf9544ce360ed747a8895c51bdb25d8d125f45", size = 224458, upload-time = "2026-06-19T16:16:07.252Z" }, +] + +[[package]] +name = "pyserial" +version = "3.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1e/7d/ae3f0a63f41e4d2f6cb66a5b57197850f919f59e558159a4dd3a818f5082/pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb", size = 159125, upload-time = "2020-11-23T03:59:15.045Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/bc/587a445451b253b285629263eb51c2d8e9bcea4fc97826266d186f96f558/pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0", size = 90585, upload-time = "2020-11-23T03:59:13.41Z" }, +] + +[[package]] +name = "pysocks" +version = "1.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/11/293dd436aea955d45fc4e8a35b6ae7270f5b8e00b53cf6c024c83b657a11/PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0", size = 284429, upload-time = "2019-09-20T02:07:35.714Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/59/b4572118e098ac8e46e399a1dd0f2d85403ce8bbaad9ec79373ed6badaf9/PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5", size = 16725, upload-time = "2019-09-20T02:06:22.938Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "iniconfig", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pluggy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "pygments", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/84/0e/b5858858d74958632c49b72cb25a3976ff9f632397626715be71c89d3971/pytest-9.1.0.tar.gz", hash = "sha256:41dd9148c08072446394cefd3d79701701335a9f4cae69ba92e39f6c7f5c061c", size = 1634181, upload-time = "2026-06-13T18:52:45.983Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/5a/ba30a81239b909821b3153e303e7def45178bf353da4f72380e6c5e8793b/pytest-9.1.0-py3-none-any.whl", hash = "sha256:8ebb0e7888bdf2bdfc602ec51f8f62d50200af37356c74e503c79a94f5c81f32", size = 386453, upload-time = "2026-06-13T18:52:44.045Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "python-libinput" +version = "0.3.0a0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cb/26/9db7619dd90e5575ece0f029630099bc9be53eaa84b37aa54232bfe012bb/python-libinput-0.3.0a0.tar.gz", hash = "sha256:7e3d3c9786aaa79bf2f14601648581b4624b692d3f0d9199902d0d0834219302", size = 28441, upload-time = "2018-03-19T16:53:01.086Z" } + +[[package]] +name = "python-pam" +version = "2.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/da/879f1c849e886b783239b8a4710daac73535ba2cfcf672ee4548543e3a74/python-pam-2.0.2.tar.gz", hash = "sha256:97235235ba9b82dbae8068d1099508455949b275f77273ca22fdbd8b1fb5d950", size = 11439, upload-time = "2022-03-18T00:32:09.856Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/2d/9fbb3bd686a474d76fbd0b79abdcc016f3da760b1d1c2048bf4c611a4939/python_pam-2.0.2-py3-none-any.whl", hash = "sha256:4ac51dd8953ac59aa45505882b565eef6a22e0423dcf25d63369902080416c20", size = 10658, upload-time = "2022-03-18T00:32:07.802Z" }, +] + +[[package]] +name = "python-prctl" +version = "1.8.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c0/99/be5393cfe9c16376b4f515d90a68b11f1840143ac1890e9008bc176cf6a6/python-prctl-1.8.1.tar.gz", hash = "sha256:b4ca9a25a7d4f1ace4fffd1f3a2e64ef5208fe05f929f3edd5e27081ca7e67ce", size = 28033, upload-time = "2020-11-02T19:30:25.257Z" } + +[[package]] +name = "python-xlib" +version = "0.33" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/86/f5/8c0653e5bb54e0cbdfe27bf32d41f27bc4e12faa8742778c17f2a71be2c0/python-xlib-0.33.tar.gz", hash = "sha256:55af7906a2c75ce6cb280a584776080602444f75815a7aff4d287bb2d7018b32", size = 269068, upload-time = "2022-12-25T18:53:00.824Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/b8/ff33610932e0ee81ae7f1269c890f697d56ff74b9f5b2ee5d9b7fa2c5355/python_xlib-0.33-py2.py3-none-any.whl", hash = "sha256:c3534038d42e0df2f1392a1b30a15a4ff5fdc2b86cfa94f072bf11b10a164398", size = 182185, upload-time = "2022-12-25T18:52:58.662Z" }, +] + +[[package]] +name = "pytz" +version = "2026.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/46/dd499ec9038423421951e4fad73051febaa13d2df82b4064f87af8b8c0c3/pytz-2026.2.tar.gz", hash = "sha256:0e60b47b29f21574376f218fe21abc009894a2321ea16c6754f3cad6eb7cdd6a", size = 320861, upload-time = "2026-05-04T01:35:29.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/dd/96da98f892250475bdf2328112d7468abdd4acc7b902b6af23f4ed958ea0/pytz-2026.2-py2.py3-none-any.whl", hash = "sha256:04156e608bee23d3792fd45c94ae47fae1036688e75032eea2e3bf0323d1f126", size = 510141, upload-time = "2026-05-04T01:35:27.408Z" }, +] + +[[package]] +name = "pyusb" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/00/6b/ce3727395e52b7b76dfcf0c665e37d223b680b9becc60710d4bc08b7b7cb/pyusb-1.3.1.tar.gz", hash = "sha256:3af070b607467c1c164f49d5b0caabe8ac78dbed9298d703a8dbf9df4052d17e", size = 77281, upload-time = "2025-01-08T23:45:01.866Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/b8/27e6312e86408a44fe16bd28ee12dd98608b39f7e7e57884a24e8f29b573/pyusb-1.3.1-py3-none-any.whl", hash = "sha256:bf9b754557af4717fe80c2b07cc2b923a9151f5c08d17bdb5345dac09d6a0430", size = 58465, upload-time = "2025-01-08T23:45:00.029Z" }, +] + +[[package]] +name = "referencing" +version = "0.37.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "rpds-py", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "charset-normalizer", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "idna", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "urllib3", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "rpds-py" +version = "2026.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/43/25a8dcd3feedd735039a8f0b5b7e3b118232b5eae288c4fd9ab200d41094/rpds_py-2026.5.1.tar.gz", hash = "sha256:07b24fea40541e28570e5b795a4a38fbdcd12550c06bd0748005ecc8116ca256", size = 64459, upload-time = "2026-05-28T12:02:13.232Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/32/14c961ad295f490eb0849ada8b79683e93a59b9de3afdd983eaf55fa6867/rpds_py-2026.5.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:efef4ac29c6ff495531eb17ee705b62841ecaa291b7c7077e848ea03e237164d", size = 352787, upload-time = "2026-05-28T11:59:33.655Z" }, + { url = "https://files.pythonhosted.org/packages/ca/bb/d1b85117967c11191441a7274ae616c65d93901d082c588f89a50a8da5ae/rpds_py-2026.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c39f5b67a8a2e67179ada2a954227d670fe65fa9098457f698f56ddf248709b3", size = 345179, upload-time = "2026-05-28T11:59:35Z" }, + { url = "https://files.pythonhosted.org/packages/7c/46/d84105f062e626a1b233f863907288a4708c2d833b8b4c6fb2764bc080c0/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5c30f3f04eef4fbd362226a6f31d7c8895ca4fbb6e0b790f6890a98d8da8559", size = 376173, upload-time = "2026-05-28T11:59:36.43Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ae/469d7959ce5b1201e1de135dc735b86db3b35dd0d1734f6a44246d5f061c/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:277f6c82f0580848796c7ecc8a7173aa3bfb928e4ff831261c2f60a81dc270db", size = 383162, upload-time = "2026-05-28T11:59:37.995Z" }, + { url = "https://files.pythonhosted.org/packages/dc/a2/57853d31a1116a561aa072794602ad3f6341e18d70a8523f1bd5b9fc1e5a/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63c2c4c213f1a4e3f3de28ecab029dbdee976324e729c0d7a55211be72576b02", size = 495093, upload-time = "2026-05-28T11:59:39.453Z" }, + { url = "https://files.pythonhosted.org/packages/99/63/3a8eabcad9314b7daf5c65f451d2c33d989235cd8a5762186cf2c3f5a4f8/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3350ec808fb538fe71a1f94dfaa0e29c598dfad805ce49f0caec5ae3183c652b", size = 389829, upload-time = "2026-05-28T11:59:40.896Z" }, + { url = "https://files.pythonhosted.org/packages/4b/25/05678d97fc25e2622df14dc530fb82023174ecfff6733991ed0d78f167bd/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1b964e3ab599e718dc46c018d104b1ebc007cbc6567d827c94a687fca56d77e", size = 374786, upload-time = "2026-05-28T11:59:42.626Z" }, + { url = "https://files.pythonhosted.org/packages/88/d1/8c90b6431e80a3b91b284a5c7c8c0c4f9c006444d90477a740d6e0f9c694/rpds_py-2026.5.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:19cb09fab7b7fc96b2a6e28f2e34b72a3705ff27b37edb77455316e5d3f3dc9b", size = 386920, upload-time = "2026-05-28T11:59:44.124Z" }, + { url = "https://files.pythonhosted.org/packages/ff/99/4638f672ab356682d633ee0da9255f5b67ce6efd0b85eb94ad3e255e65a5/rpds_py-2026.5.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abe76bcdba31e576cb83eeb8797aa0d882b738fef6dc65d0601fc753806a5b46", size = 405059, upload-time = "2026-05-28T11:59:47.177Z" }, + { url = "https://files.pythonhosted.org/packages/66/3f/3546524b6eb4cc2e1f363a3d638fa52f6c24faae3500c25fb488b02f1740/rpds_py-2026.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8bff7073db3899158fff55ebf57b113a67030af26f80a18978f9f0aa60250ddf", size = 553030, upload-time = "2026-05-28T11:59:48.603Z" }, + { url = "https://files.pythonhosted.org/packages/c6/c3/7b3388c796fcf471bd17194242d4dc1a7608567c0fa422bcc1c5e79f9c1e/rpds_py-2026.5.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8ba264fa49be666cd9cc56bf34ec7002fb3d27a4aee5bcb4d43d0d18feb1bb6f", size = 618975, upload-time = "2026-05-28T11:59:50.314Z" }, + { url = "https://files.pythonhosted.org/packages/61/1e/a3cb07f2795075d1d88efddae2f541359fde5f08c81ee114c29c2949c90a/rpds_py-2026.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4860b603ddda0475a8885499b3729e90229d480105b42651962a5397d995fa89", size = 581178, upload-time = "2026-05-28T11:59:51.673Z" }, + { url = "https://files.pythonhosted.org/packages/18/e2/408105fd611823f00882aea810f3989a30d26b1bab8b6beb20f98c724e0e/rpds_py-2026.5.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:b4e4bc98639ec915f512fde3aa7a95e0041d95d9c3cc86eea841fa63cb1e8600", size = 355287, upload-time = "2026-05-28T11:59:57.448Z" }, + { url = "https://files.pythonhosted.org/packages/8d/58/5c4a43436843c90d0f6d19f82c200c80e3843ca9fa07b237623327f6d384/rpds_py-2026.5.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cacedb7a6e167680acba45ad5716e89067d225dc80da0d7040cae8c81d4572fa", size = 347033, upload-time = "2026-05-28T11:59:58.881Z" }, + { url = "https://files.pythonhosted.org/packages/fb/c2/1a71acdacaf4e259b10278fb87b039ded3cf80041bcd89dd8a3ea702ded6/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68700371c5d7ae1412862ddfa719090925c93ecf351c566d66f09d04b136ea00", size = 376891, upload-time = "2026-05-28T12:00:00.516Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c8/535f3d9b65addd8e28aa87b83c6e526799c3717a88273db8ea795beeef7a/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:296c799becfa849c779c8725494fe9ed94959ed886787df4364b058465bad7f0", size = 385646, upload-time = "2026-05-28T12:00:02.394Z" }, + { url = "https://files.pythonhosted.org/packages/1c/91/dc033f313345c354ade914dbe73cdb90b615a4409ea02430d5356794f3d8/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3858b908218ee108d0bbfb2095ccc237648053c9bf98affad7cb079acaf1d97", size = 498830, upload-time = "2026-05-28T12:00:04.189Z" }, + { url = "https://files.pythonhosted.org/packages/27/fc/90fcbea459dbb8ddc18a2e0fd1de9412b48bc84ffff2db771cf714bacfd6/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4fb8d2e7cb2f850b169806d61d1b991738acec96500a75c30f49caf064ce7cef", size = 392830, upload-time = "2026-05-28T12:00:05.797Z" }, + { url = "https://files.pythonhosted.org/packages/b2/1d/46cd11a228c9750684a798d98f878be6f614aa762438da7378f035e79e35/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27b74c10ed6a8f190f4287f53bcfea348b92a84a9c9f70d30183d1e6172d580d", size = 379613, upload-time = "2026-05-28T12:00:07.433Z" }, + { url = "https://files.pythonhosted.org/packages/24/4a/d9b0c6af3a1de03eb93741bbe8be2bdce84d8fda8224f3005451d86df389/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:b9a6528956191c48c52294a592dbd4a8386d7048bdb25c0efcb6b966466c6d83", size = 388183, upload-time = "2026-05-28T12:00:09.227Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b4/db7aaabdda6d020afc87d981bcc2f57a434c7dec60ecfc2ab3dd50b20351/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:af03e34e860047bc7a352b842856fcf78798fbb81132cc98bd2f907ab4eb9cd2", size = 408578, upload-time = "2026-05-28T12:00:10.779Z" }, + { url = "https://files.pythonhosted.org/packages/08/d6/070f6a41cbb343e2ac4171859bf3f3623e0ab002f72619d6d505313ec2de/rpds_py-2026.5.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fea6e836d10abbe191d557d33bd58bd5987725fe63aa1eefe557d230209855bd", size = 553573, upload-time = "2026-05-28T12:00:12.443Z" }, + { url = "https://files.pythonhosted.org/packages/75/ab/1a71ea3589c4345dac0a0518f0e6a031cb42689277851b683c46d27463a5/rpds_py-2026.5.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:fc0c0f878ea770a0a8a462456c5ad36fc9fe6358e6b76fdadc7f17575e0b8bf1", size = 620861, upload-time = "2026-05-28T12:00:14.09Z" }, + { url = "https://files.pythonhosted.org/packages/8a/22/9bf80a56069c0c443fcfefac639a86a744550a2898817a6dfd3e26654924/rpds_py-2026.5.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e0b360f316d966b048b085857630b3cc51f3db2f07b06f440eac8f695374d1e3", size = 585633, upload-time = "2026-05-28T12:00:15.66Z" }, +] + +[[package]] +name = "rpi-gpio" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/0f/10b524a12b3445af1c607c27b2f5ed122ef55756e29942900e5c950735f2/RPi.GPIO-0.7.1.tar.gz", hash = "sha256:cd61c4b03c37b62bba4a5acfea9862749c33c618e0295e7e90aa4713fb373b70", size = 29090, upload-time = "2022-02-06T15:15:06.022Z" } + +[[package]] +name = "rpi-hardware-pwm" +version = "0.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/32/ecd3e230a806c7894a13780a1c7d614f0d316d85cde7a2256626e2af2c45/rpi_hardware_pwm-0.3.1.tar.gz", hash = "sha256:dcb2627ab1248a9c532c86e013914416c55f11bd70976dd6ec6ecfd1109b0fe8", size = 5261, upload-time = "2026-02-09T17:10:41.757Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/17/c8d4d2efa5bb1af38644a6202c26e4d990d30cf6124ace32f33e7c488e9e/rpi_hardware_pwm-0.3.1-py3-none-any.whl", hash = "sha256:ad0f7f3e8ec83dd76a552cff92ea1dbb1bf773210316519ea66e3e85d3ac9ae0", size = 5112, upload-time = "2026-02-09T17:10:41.003Z" }, +] + +[[package]] +name = "scikit-learn" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "joblib", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "narwhals", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "scipy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "threadpoolctl", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fa/6f/37092bdb25f712817231799fc5674d8e704066a8a70c1d2d40517e18b4ab/scikit_learn-1.9.0.tar.gz", hash = "sha256:8833266989d3a5110178a9fae30783675460724d0e1efb13b14901d2c660c557", size = 7750767, upload-time = "2026-06-02T11:54:32.706Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/01/cf3310626b6d48d3e9be69a1223f9180360b5e6edb045f50fade723ce494/scikit_learn-1.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:80746d63bd4b6eaca54d36fe5feaf4d28bb38dc6f9470f81c7cad7c40155f119", size = 8705188, upload-time = "2026-06-02T11:53:41.964Z" }, + { url = "https://files.pythonhosted.org/packages/3e/04/5acd7ae280c5f93b6ac5ef6cdec14eef4c8d1cd91d85b3292989c94d96b1/scikit_learn-1.9.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:5b934c45c252844a91d69fda3a34cff5e7307e1db10d77cb10a3980312c74713", size = 8228299, upload-time = "2026-06-02T11:53:44.817Z" }, + { url = "https://files.pythonhosted.org/packages/0c/39/ffe829a5b8ecb40a518724a997794657fdc354ada5e8fe8e64d998c0bac9/scikit_learn-1.9.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:38c3dcb9a1ffb85505ec53d54c7b4aea0cff70050425a7760c2af661ac85df05", size = 8789690, upload-time = "2026-06-02T11:53:47.461Z" }, + { url = "https://files.pythonhosted.org/packages/1f/88/8dab5de10c638c083772a6be83a3d8106ced492f74a928c8693638e5bb50/scikit_learn-1.9.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da76d09304a4706db7cc1e3ebaa3b6b98a67365cc11d2996c4f1e58ba47df714", size = 9087723, upload-time = "2026-06-02T11:53:50.702Z" }, +] + +[[package]] +name = "scipy" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/97/5a3609c4f8d58b039179648e62dd220f89864f56f7357f5d4f45c29eb2cc/scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0", size = 30573822, upload-time = "2026-02-23T00:26:24.851Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/27/07ee1b57b65e92645f219b37148a7e7928b82e2b5dbeccecb4dff7c64f0b/scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:5e3c5c011904115f88a39308379c17f91546f77c1667cea98739fe0fccea804c", size = 31590199, upload-time = "2026-02-23T00:19:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ae/db19f8ab842e9b724bf5dbb7db29302a91f1e55bc4d04b1025d6d605a2c5/scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:6fac755ca3d2c3edcb22f479fceaa241704111414831ddd3bc6056e18516892f", size = 28154001, upload-time = "2026-02-23T00:19:22.241Z" }, + { url = "https://files.pythonhosted.org/packages/5b/58/3ce96251560107b381cbd6e8413c483bbb1228a6b919fa8652b0d4090e7f/scipy-1.17.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:7ff200bf9d24f2e4d5dc6ee8c3ac64d739d3a89e2326ba68aaf6c4a2b838fd7d", size = 20325719, upload-time = "2026-02-23T00:19:26.329Z" }, + { url = "https://files.pythonhosted.org/packages/b2/83/15087d945e0e4d48ce2377498abf5ad171ae013232ae31d06f336e64c999/scipy-1.17.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4b400bdc6f79fa02a4d86640310dde87a21fba0c979efff5248908c6f15fad1b", size = 22683595, upload-time = "2026-02-23T00:19:30.304Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e0/e58fbde4a1a594c8be8114eb4aac1a55bcd6587047efc18a61eb1f5c0d30/scipy-1.17.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b64ca7d4aee0102a97f3ba22124052b4bd2152522355073580bf4845e2550b6", size = 32896429, upload-time = "2026-02-23T00:19:35.536Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5f/f17563f28ff03c7b6799c50d01d5d856a1d55f2676f537ca8d28c7f627cd/scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:581b2264fc0aa555f3f435a5944da7504ea3a065d7029ad60e7c3d1ae09c5464", size = 35203952, upload-time = "2026-02-23T00:19:42.259Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a5/9afd17de24f657fdfe4df9a3f1ea049b39aef7c06000c13db1530d81ccca/scipy-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:beeda3d4ae615106d7094f7e7cef6218392e4465cc95d25f900bebabfded0950", size = 34979063, upload-time = "2026-02-23T00:19:47.547Z" }, + { url = "https://files.pythonhosted.org/packages/8b/13/88b1d2384b424bf7c924f2038c1c409f8d88bb2a8d49d097861dd64a57b2/scipy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6609bc224e9568f65064cfa72edc0f24ee6655b47575954ec6339534b2798369", size = 37598449, upload-time = "2026-02-23T00:19:53.238Z" }, + { url = "https://files.pythonhosted.org/packages/6f/6b/17787db8b8114933a66f9dcc479a8272e4b4da75fe03b0c282f7b0ade8cd/scipy-1.17.1-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:d59c30000a16d8edc7e64152e30220bfbd724c9bbb08368c054e24c651314f0a", size = 31936708, upload-time = "2026-02-23T00:19:58.694Z" }, + { url = "https://files.pythonhosted.org/packages/38/2e/524405c2b6392765ab1e2b722a41d5da33dc5c7b7278184a8ad29b6cb206/scipy-1.17.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:010f4333c96c9bb1a4516269e33cb5917b08ef2166d5556ca2fd9f082a9e6ea0", size = 28570135, upload-time = "2026-02-23T00:20:03.934Z" }, + { url = "https://files.pythonhosted.org/packages/fd/c3/5bd7199f4ea8556c0c8e39f04ccb014ac37d1468e6cfa6a95c6b3562b76e/scipy-1.17.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:2ceb2d3e01c5f1d83c4189737a42d9cb2fc38a6eeed225e7515eef71ad301dce", size = 20741977, upload-time = "2026-02-23T00:20:07.935Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b8/8ccd9b766ad14c78386599708eb745f6b44f08400a5fd0ade7cf89b6fc93/scipy-1.17.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:844e165636711ef41f80b4103ed234181646b98a53c8f05da12ca5ca289134f6", size = 23029601, upload-time = "2026-02-23T00:20:12.161Z" }, + { url = "https://files.pythonhosted.org/packages/6d/a0/3cb6f4d2fb3e17428ad2880333cac878909ad1a89f678527b5328b93c1d4/scipy-1.17.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:158dd96d2207e21c966063e1635b1063cd7787b627b6f07305315dd73d9c679e", size = 33019667, upload-time = "2026-02-23T00:20:17.208Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c3/2d834a5ac7bf3a0c806ad1508efc02dda3c8c61472a56132d7894c312dea/scipy-1.17.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74cbb80d93260fe2ffa334efa24cb8f2f0f622a9b9febf8b483c0b865bfb3475", size = 35264159, upload-time = "2026-02-23T00:20:23.087Z" }, + { url = "https://files.pythonhosted.org/packages/4d/77/d3ed4becfdbd217c52062fafe35a72388d1bd82c2d0ba5ca19d6fcc93e11/scipy-1.17.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dbc12c9f3d185f5c737d801da555fb74b3dcfa1a50b66a1a93e09190f41fab50", size = 35102771, upload-time = "2026-02-23T00:20:28.636Z" }, + { url = "https://files.pythonhosted.org/packages/bd/12/d19da97efde68ca1ee5538bb261d5d2c062f0c055575128f11a2730e3ac1/scipy-1.17.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94055a11dfebe37c656e70317e1996dc197e1a15bbcc351bcdd4610e128fe1ca", size = 37665910, upload-time = "2026-02-23T00:20:34.743Z" }, +] + +[[package]] +name = "selenium" +version = "4.45.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "trio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "trio-websocket", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "urllib3", extra = ["socks"], marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "websocket-client", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/86/48/486aa67320f27452e9f551b8608f1a59ce7091c8fe7ebc9f4eba274775d4/selenium-4.45.0.tar.gz", hash = "sha256:563f0c4102f112df1cda30d46ce6d177b2e4a7a3d4b0756902d5dc84d3a8a365", size = 1005503, upload-time = "2026-06-16T04:43:57.915Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/8a/6ff6beb9c7c6cc642f628df9328a8b6637f86602eff8d28e70b5d4e8bca7/selenium-4.45.0-py3-none-any.whl", hash = "sha256:1fd9d0dc08192b2f8100e264ed720f83b05d2dd3a7feff673df04e0c7580df4b", size = 9536616, upload-time = "2026-06-16T04:43:55.968Z" }, +] + +[[package]] +name = "sgp4" +version = "2.25" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/d0/fc467010d17742321f73b16a71acac88439a88f2b166641942a6566c9b2a/sgp4-2.25.tar.gz", hash = "sha256:e19edc6dcc25d69fb8fde0a267b8f0c44d7e915c7bcbeacf5d3a8b595baf0674", size = 181016, upload-time = "2025-08-04T18:02:33.765Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/0f/daf4a70829be7c1550b914c98b3abbd15404d00899835432ae8d4a9be502/sgp4-2.25-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c4d4eab0f2c94aad3a0ab0bedd59f2137484af5480a3b40df8e4ab5a1fbc6b86", size = 162974, upload-time = "2025-08-04T18:02:02.816Z" }, + { url = "https://files.pythonhosted.org/packages/27/88/af20e342590c3ede18cc8dc6a1e1da708f576e1a97dcb69e2870e739ae21/sgp4-2.25-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2822ca25f3724694bfced16cad8b3018678bee47fa3baf4eea20876d0e35ad33", size = 161957, upload-time = "2025-08-04T18:02:03.835Z" }, + { url = "https://files.pythonhosted.org/packages/6e/14/81f0df0cc39bdc95336a6f5834c84a6e5f79b5e728918cb9dadff3278017/sgp4-2.25-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7beca36492eb6d20ef15eeedd9520b8af4fa0cbaaae46a9269d5a2e7c8e56e46", size = 236195, upload-time = "2025-08-04T18:02:05.121Z" }, + { url = "https://files.pythonhosted.org/packages/a3/a7/3740791f656d9b7ad78da7c0d9f6f842a18642fead2d26b2d69fb701892e/sgp4-2.25-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e9dfd18cacf6bfb1faad29c89a6cec98a642558f805851080dea9c394520db2", size = 232992, upload-time = "2025-08-04T18:02:06.086Z" }, + { url = "https://files.pythonhosted.org/packages/62/45/0e35398ef8d4b07ecfa9f7f680e183b2b6af9215a56af34f9e621c29b495/sgp4-2.25-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5789b7add136362684dfcbf0862919f8c3018f74ab11a05a9964edd5fdd4d2a7", size = 235584, upload-time = "2025-08-04T18:02:07.152Z" }, + { url = "https://files.pythonhosted.org/packages/3a/47/8231e3d4a88341316ec8d0eb98d3a8a972477d8b038555259522735a8371/sgp4-2.25-py3-none-any.whl", hash = "sha256:4f39ecf6c2663109fed04adfe9982815ac83893271b521d92d5b186820f8c78e", size = 137376, upload-time = "2026-04-27T18:29:23.71Z" }, +] + +[[package]] +name = "sh" +version = "1.14.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/09/89c28aaf2a49f226fef8587c90c6386bd2cc03a0295bc4ff7fc6ee43c01d/sh-1.14.3.tar.gz", hash = "sha256:e4045b6c732d9ce75d571c79f5ac2234edd9ae4f5fa9d59b09705082bdca18c7", size = 62851, upload-time = "2022-07-18T07:17:50.947Z" } + +[[package]] +name = "simplejpeg" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/90/64/da60f0ba80570f9a36c9b6e055f4364bda2c547715296d5773d2ea6d5a60/simplejpeg-1.9.0.tar.gz", hash = "sha256:5ac7d9489eeb812c2e7ea5c283994a29d9fefdfe5ed7b86c09d485e0dd366689", size = 3965764, upload-time = "2025-10-10T10:58:08.197Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/32/c2d5baa4af82551feae9082d1800c7c7e96586f67292dad4e1442298ad34/simplejpeg-1.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:52b4e8e0d68caa3e0962415daff12df2911df36a697e53a75878a45e9e34e9ad", size = 423518, upload-time = "2025-10-10T10:57:45.291Z" }, + { url = "https://files.pythonhosted.org/packages/84/97/6a4018d4c1c980d9f4c48c29d3d6bfaeb18444dd8e82997246c9950fb79a/simplejpeg-1.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:475d1932f50264d63dbc752678b5a6629ed8c6b0f5edfbe4e9cd7881d5f8a1f1", size = 400574, upload-time = "2025-10-10T10:57:46.475Z" }, + { url = "https://files.pythonhosted.org/packages/88/8b/d8ca384f1362371d61690d7460d3ae4cec4a5a25d9eb06cd15623de3725a/simplejpeg-1.9.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0c375130f73bb08229a3ded392d84ee2d916b3e87e7ec5d2ac4e47b7144346a", size = 448142, upload-time = "2025-10-10T10:57:47.894Z" }, + { url = "https://files.pythonhosted.org/packages/cf/0a/58d6d8e997ee01486cfcfd4406a74638f2f63bb65122694b10411dadf1d5/simplejpeg-1.9.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d00feb1cc0348aba0a41db6dbda4db468db92099b1b3d473159e6f68aa990795", size = 406252, upload-time = "2025-10-10T10:57:49.158Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "skyfield" +version = "1.54" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "jplephem", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "sgp4", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/8c/98bf5d9042218580fc10c4ba0c51b9af26bc73b614ce64341c0dfad39074/skyfield-1.54.tar.gz", hash = "sha256:bf8b79d6dbbe1add0327aca485d6388bb6a13cab70528d015913a9b07a1d6903", size = 346829, upload-time = "2026-01-18T19:16:15.114Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/8a/f196038b2bea40c372d900803dac0d5e4eab578cb05b92ff7172ced4c1cf/skyfield-1.54-py3-none-any.whl", hash = "sha256:c9b313185448963ea7fa4cf8e4298ba028b179b80ebd4c5675497519f21c04a2", size = 370380, upload-time = "2026-01-18T19:16:13.806Z" }, +] + +[[package]] +name = "smbus2" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/87/37/b3f7b501502c4915ba3819d1dc277bf3f5fae4a9d067caa4f502aaddd889/smbus2-0.6.1.tar.gz", hash = "sha256:2b043372abf8f6029a632c3aab36b641c5d5872b1cbad599fc68e17ac4fd90a5", size = 17274, upload-time = "2026-04-09T20:37:54.821Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/f2/c78a68bd739ac8fc608747cff73a4db3b19f3135658ed4e64374f6425cbf/smbus2-0.6.1-py2.py3-none-any.whl", hash = "sha256:650feeb27ca0ed58b07db4c10201c2a662c41305b7bf6e5fab9d888056f48180", size = 11767, upload-time = "2026-04-09T20:37:53.728Z" }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, +] + +[[package]] +name = "sortedcontainers" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594, upload-time = "2021-05-16T22:03:42.897Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" }, +] + +[[package]] +name = "spidev" +version = "3.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/67/87/039b6eeea781598015b538691bc174cc0bf77df9d4d2d3b8bf9245c0de8c/spidev-3.8.tar.gz", hash = "sha256:2bc02fb8c6312d519ebf1f4331067427c0921d3f77b8bcaf05189a2e8b8382c0", size = 13893, upload-time = "2025-09-15T18:56:20.672Z" } + +[[package]] +name = "sysv-ipc" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/5e/59208c6dd05ebc6f46ce2023c4fc01ffe814a1967d21b35d312c7e6ffeae/sysv_ipc-1.2.0.tar.gz", hash = "sha256:ef96ab33bb62e4d14142f0be0524dcc0c3c70c96442df2fc773c67b7c7514199", size = 102810, upload-time = "2026-01-09T14:05:02.231Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/2d/2e4f55201cca54666c08468538348be4af16a52c7296bdd038a303e7be9f/sysv_ipc-1.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:977f0e313c2e663000f0c316682ea2c3f6d2f86bbbdb1bcd274fea244a211df0", size = 72727, upload-time = "2026-01-09T14:04:28.317Z" }, + { url = "https://files.pythonhosted.org/packages/d0/6a/e04914984503317dd2481d6ff5fa9ab85e70960b79514309b0bcb0ef08d8/sysv_ipc-1.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0b40e147277a954c41f94207dfab402bfa8371198c191b826d833b40c5e83e9", size = 73643, upload-time = "2026-01-09T14:04:29.234Z" }, + { url = "https://files.pythonhosted.org/packages/54/46/6f9aacbbf4c71ddce08f645bd67fa4223573a3191fd938acc926ca2b94c4/sysv_ipc-1.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:83ff789f67477dc09424f674e1eb9195d8edd9b4044c3d5833d1a252d49034fc", size = 71319, upload-time = "2026-01-09T14:04:30.059Z" }, + { url = "https://files.pythonhosted.org/packages/34/21/0127cb9ecbc281c5b5a79d4be7a61e2d35442f72baaa1594e089dbe9206a/sysv_ipc-1.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fc541299c3af8351abff804e287a0c203338c140f70ee70855f46a1710cc0ff7", size = 71575, upload-time = "2026-01-09T14:04:32.011Z" }, +] + +[[package]] +name = "threadpoolctl" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274, upload-time = "2025-03-13T13:49:23.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" }, +] + +[[package]] +name = "timezonefinder" +version = "8.2.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "flatbuffers", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "h3", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/67/f2/77f407fac773a72e18e91657896fdec9b61ed4e31b35adf7270d8f5f71b0/timezonefinder-8.2.4.tar.gz", hash = "sha256:d80fae37adf1497729cc3e69826c22f3b2fec16db07932bf389b6ae545400b42", size = 54286323, upload-time = "2026-05-01T12:47:22.142Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/7b/422744a1ac2a5a2bec21f0d17f927a5324ed3e0c442c64337d265a266a0f/timezonefinder-8.2.4-cp311-abi3-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c824271053f0e3ad0700a2c504d609317c8c288655d8e48e1f382d0da094e94c", size = 54286013, upload-time = "2026-05-01T12:47:09.99Z" }, + { url = "https://files.pythonhosted.org/packages/b0/e4/9b5c948bc657420fa7d0a86acc1489f977e4d459b088a957c0e046b2897f/timezonefinder-8.2.4-cp311-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:97e9336391be6e10ca85f2ccdd36491c2aa2611e5265561de0f2e3b1652c2a68", size = 54285876, upload-time = "2026-05-01T12:47:13.93Z" }, + { url = "https://files.pythonhosted.org/packages/c5/8a/4fc4538471cc34ca5aab758d0e372afedb93428170c18da1e5706a9e1119/timezonefinder-8.2.4-cp311-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:54f3a8cae6715bf2f6a4c1a31189dc709d2fbabc5671147d5cb461455d6c6f39", size = 54287989, upload-time = "2026-05-01T12:47:17.903Z" }, +] + +[[package]] +name = "tqdm" +version = "4.68.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/87/d7/0535a28b1f5f24f6612fb3ff1e89fb1a8d160fee0f976e0aa6803862134b/tqdm-4.68.3.tar.gz", hash = "sha256:00dfa48452b6b6cfae3dd9885636c23d3422d1ec97c66d96818cbd5e0821d482", size = 170596, upload-time = "2026-06-17T07:36:52.105Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/8e/bb97bb0c71802080bfc8952937d174e49cfc50de5c951dd47b2496f0dcdb/tqdm-4.68.3-py3-none-any.whl", hash = "sha256:39832cc2def2789a6f29df83f172db7416cea70052c0907a57801c5f2fdccb03", size = 78337, upload-time = "2026-06-17T07:36:50.132Z" }, +] + +[[package]] +name = "trio" +version = "0.33.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "idna", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "outcome", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "sniffio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "sortedcontainers", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/b6/c744031c6f89b18b3f5f4f7338603ab381d740a7f45938c4607b2302481f/trio-0.33.0.tar.gz", hash = "sha256:a29b92b73f09d4b48ed249acd91073281a7f1063f09caba5dc70465b5c7aa970", size = 605109, upload-time = "2026-02-14T18:40:55.386Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/93/dab25dc87ac48da0fe0f6419e07d0bfd98799bed4e05e7b9e0f85a1a4b4b/trio-0.33.0-py3-none-any.whl", hash = "sha256:3bd5d87f781d9b0192d592aef28691f8951d6c2e41b7e1da4c25cde6c180ae9b", size = 510294, upload-time = "2026-02-14T18:40:53.313Z" }, +] + +[[package]] +name = "trio-websocket" +version = "0.12.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "outcome", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "trio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "wsproto", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d1/3c/8b4358e81f2f2cfe71b66a267f023a91db20a817b9425dd964873796980a/trio_websocket-0.12.2.tar.gz", hash = "sha256:22c72c436f3d1e264d0910a3951934798dcc5b00ae56fc4ee079d46c7cf20fae", size = 33549, upload-time = "2025-02-25T05:16:58.947Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/19/eb640a397bba49ba49ef9dbe2e7e5c04202ba045b6ce2ec36e9cadc51e04/trio_websocket-0.12.2-py3-none-any.whl", hash = "sha256:df605665f1db533f4a386c94525870851096a223adcb97f72a07e8b4beba45b6", size = 21221, upload-time = "2025-02-25T05:16:57.545Z" }, +] + +[[package]] +name = "types-aiofiles" +version = "25.1.0.20260518" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/42/f5b9b90162d2196f016b87228d6bf43f2c2c0c6501bfd5415001b3eb68bb/types_aiofiles-25.1.0.20260518.tar.gz", hash = "sha256:c0c95eb78755d4fa7b397d4f0332c632714dd7cd0d17f49b96e31d4d7a8d8c76", size = 14891, upload-time = "2026-05-18T06:05:27.804Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/3d/7a9ed9faafeae3aa3b5bc22fa5b979ff9cf3c83ecbe919b58eae07795b8c/types_aiofiles-25.1.0.20260518-py3-none-any.whl", hash = "sha256:f776bdfb4bec17f743d9ef042e61edf03bdcc7821fc08556fba9b63d873fdea9", size = 14377, upload-time = "2026-05-18T06:05:26.871Z" }, +] + +[[package]] +name = "types-pynput" +version = "1.8.1.20260603" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4b/fb/71a9c1ad440a7f1c6c2bd3a8ffb889f6983a4a5b1f782804c3015b60fac6/types_pynput-1.8.1.20260603.tar.gz", hash = "sha256:c22690e389ce6ae5ca19ae496176d5ebac507aa742bfcdf34cb530c8c1ba9450", size = 12215, upload-time = "2026-06-03T06:42:02.578Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/50/5a7b71dd98fdecc0133133c72581acf637faaafc1e244ae6d39a8d7592fe/types_pynput-1.8.1.20260603-py3-none-any.whl", hash = "sha256:59a73c1c9d51f74a20aa57d26278e4db1e8501c609177182beca378eab016802", size = 12302, upload-time = "2026-06-03T06:42:01.545Z" }, +] + +[[package]] +name = "types-pytz" +version = "2026.2.0.20260518" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/d9/9fa4019d2235bd374293e1fd4153879b28b6ae1d2bae98addd352c9713f2/types_pytz-2026.2.0.20260518.tar.gz", hash = "sha256:e5d254329e9c4e91f0781b22c43a4bb2d10bb044d97b24c4b05d45567b0eae16", size = 10871, upload-time = "2026-05-18T06:02:45.789Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/89/41e80670779a223d8bc8bc83019a619988cfa5c432cedac5cec23884fbc4/types_pytz-2026.2.0.20260518-py3-none-any.whl", hash = "sha256:3a12eaa38f476bd650902a9c9bb442f03f3c7dee2be5c5848bce61bd708d205a", size = 10125, upload-time = "2026-05-18T06:02:44.968Z" }, +] + +[[package]] +name = "types-requests" +version = "2.33.0.20260518" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "urllib3", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e0/01/c5a19253fe1ac159159ddf9a3a07cec8bb5e486ec4d9002ad2821da0e5d2/types_requests-2.33.0.20260518.tar.gz", hash = "sha256:df7bd3bfe0ca8402dfb841e7d9be714bb5578203283d66d7dc4ef69343449a5e", size = 24752, upload-time = "2026-05-18T06:07:37.966Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/bc/b139710a3b6018f7fb2b9508b35c8af564e61bf2bf4fa619d088f3e16f85/types_requests-2.33.0.20260518-py3-none-any.whl", hash = "sha256:626d697d1adaaff76e2044dc8c5c051d8f21abc157bdfe204a75558076fe0bf0", size = 21391, upload-time = "2026-05-18T06:07:37.044Z" }, +] + +[[package]] +name = "types-tqdm" +version = "4.68.0.20260608" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "types-requests", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dc/e0/3facccb1ff69970c73fca7a8028286c233d4c1312c475a65fb3d896f56d9/types_tqdm-4.68.0.20260608.tar.gz", hash = "sha256:e1dfddf8770fbc30ecaf95ae57c286397831235064308f7dfc2b1d6684a76107", size = 18470, upload-time = "2026-06-08T06:26:06.661Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/e8/61d95bfd49d1609fb8e8c5e06f4a094183411988a6f448873f5de6602499/types_tqdm-4.68.0.20260608-py3-none-any.whl", hash = "sha256:450a6e7e9e9b604928968927c414b32970e40091213c4180e1ed470905b13eff", size = 24858, upload-time = "2026-06-08T06:26:05.741Z" }, +] + +[[package]] +name = "types-waitress" +version = "3.0.1.20260508" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/38/45d06b9fa7d2834f8e06f4704352e18763d3303ab8921d39c888007f33c1/types_waitress-3.0.1.20260508.tar.gz", hash = "sha256:3f9389096f1504a459064fbb02be53ad4326200a78dedae532967d3c13eb8d89", size = 14468, upload-time = "2026-05-08T04:49:31.247Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/44/d2e166e59677b4c99e4c49a33a7f23210f012e5188bd176bdcc40dc35395/types_waitress-3.0.1.20260508-py3-none-any.whl", hash = "sha256:b34c6dbb5da568eea4a883f9492574233c8fb0c793b91aa2fe0b847ab871252a", size = 17492, upload-time = "2026-05-08T04:49:29.556Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspect" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mypy-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dc/74/1789779d91f1961fa9438e9a8710cdae6bd138c80d7303996933d117264a/typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78", size = 13825, upload-time = "2023-05-24T20:25:47.612Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f", size = 8827, upload-time = "2023-05-24T20:25:45.287Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[package.optional-dependencies] +socks = [ + { name = "pysocks", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] + +[[package]] +name = "videodev2" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/82/ffdba8838b1f24b83268863a8f66fe9334d7f28a5b9c368f9c48f7516e69/videodev2-0.0.4.tar.gz", hash = "sha256:c34ba70491d148c23a08cbacd8efabeb413cff5baa943a7548ac4abd1eb19e2a", size = 50108, upload-time = "2025-07-23T10:18:51.631Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/30/4982441a03860ab8f656702d8a2c13d0cf6f56d65bfb78fe288028dcb473/videodev2-0.0.4-py3-none-any.whl", hash = "sha256:d35f7ab39ddb06d50fec96a99bfc8d5b8b525bc7ea03788259d386393f1a64ba", size = 49923, upload-time = "2025-07-23T10:18:50.378Z" }, +] + +[[package]] +name = "waitress" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/cb/04ddb054f45faa306a230769e868c28b8065ea196891f09004ebace5b184/waitress-3.0.2.tar.gz", hash = "sha256:682aaaf2af0c44ada4abfb70ded36393f0e307f4ab9456a215ce0020baefc31f", size = 179901, upload-time = "2024-11-16T20:02:35.195Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/57/a27182528c90ef38d82b636a11f606b0cbb0e17588ed205435f8affe3368/waitress-3.0.2-py3-none-any.whl", hash = "sha256:c56d67fd6e87c2ee598b76abdd4e96cfad1f24cacdea5078d382b1f9d7b5ed2e", size = 56232, upload-time = "2024-11-16T20:02:33.858Z" }, +] + +[[package]] +name = "websocket-client" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/41/aa4bf9664e4cda14c3b39865b12251e8e7d239f4cd0e3cc1b6c2ccde25c1/websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98", size = 70576, upload-time = "2025-10-07T21:16:36.495Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef", size = 82616, upload-time = "2025-10-07T21:16:34.951Z" }, +] + +[[package]] +name = "werkzeug" +version = "3.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dd/b2/381be8cfdee792dd117872481b6e378f85c957dd7c5bca38897b08f765fd/werkzeug-3.1.8.tar.gz", hash = "sha256:9bad61a4268dac112f1c5cd4630a56ede601b6ed420300677a869083d70a4c44", size = 875852, upload-time = "2026-04-02T18:49:14.268Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/8c/2e650f2afeb7ee576912636c23ddb621c91ac6a98e66dc8d29c3c69446e1/werkzeug-3.1.8-py3-none-any.whl", hash = "sha256:63a77fb8892bf28ebc3178683445222aa500e48ebad5ec77b0ad80f8726b1f50", size = 226459, upload-time = "2026-04-02T18:49:12.72Z" }, +] + +[[package]] +name = "wsproto" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "h11", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/79/12135bdf8b9c9367b8701c2c19a14c913c120b882d50b014ca0d38083c2c/wsproto-1.3.2.tar.gz", hash = "sha256:b86885dcf294e15204919950f666e06ffc6c7c114ca900b060d6e16293528294", size = 50116, upload-time = "2025-11-20T18:18:01.871Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl", hash = "sha256:61eea322cdf56e8cc904bd3ad7573359a242ba65688716b0710a5eb12beab584", size = 24405, upload-time = "2025-11-20T18:18:00.454Z" }, +] + +[[package]] +name = "xlrd" +version = "2.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/07/5a/377161c2d3538d1990d7af382c79f3b2372e880b65de21b01b1a2b78691e/xlrd-2.0.2.tar.gz", hash = "sha256:08b5e25de58f21ce71dc7db3b3b8106c1fa776f3024c54e45b45b374e89234c9", size = 100167, upload-time = "2025-06-14T08:46:39.039Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/62/c8d562e7766786ba6587d09c5a8ba9f718ed3fa8af7f4553e8f91c36f302/xlrd-2.0.2-py2.py3-none-any.whl", hash = "sha256:ea762c3d29f4cca48d82df517b6d89fbce4db3107f9d78713e48cd321d5c9aa9", size = 96555, upload-time = "2025-06-14T08:46:37.766Z" }, +] diff --git a/python/views/network.html b/python/views/network.html index 637332961..9d61cf398 100644 --- a/python/views/network.html +++ b/python/views/network.html @@ -4,6 +4,9 @@
{{ _('Network Settings') }}
+ {% if status_message %} +

{{ status_message }}

+ {% endif %}
@@ -33,17 +36,7 @@
{{ _('Network Settings') }}
- -
diff --git a/scripts/generate-dependencies-md.sh b/scripts/generate-dependencies-md.sh new file mode 100755 index 000000000..859d0a4da --- /dev/null +++ b/scripts/generate-dependencies-md.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +# Generates python/DEPENDENCIES.md from the nix devShell environment. +# Run from repo root: nix develop --command ./scripts/generate-dependencies-md.sh +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +OUTPUT="$REPO_ROOT/python/DEPENDENCIES.md" + +python3 << 'PYEOF' > "$OUTPUT" +import importlib.metadata +from datetime import date + +pkgs = sorted( + ((d.name, d.version) for d in importlib.metadata.distributions()), + key=lambda x: x[0].lower(), +) + +# Dev-only packages (from pyproject.toml [dependency-groups].dev) +dev_only = {"pytest", "mypy", "mypy_extensions", "luma.emulator", "PyHotKey", + "pynput", "python-xlib", "pygame", "pathspec", "pluggy", "iniconfig"} + +# Build/infra packages not relevant to PiFinder +infra = {"pip", "flit_core", "virtualenv", "distlib", "filelock", "platformdirs", + "packaging", "setuptools"} + +prod = [(n, v) for n, v in pkgs if n not in dev_only and n not in infra] +dev = [(n, v) for n, v in pkgs if n in dev_only] + +print(f"""\ +> **Auto-generated** from the Nix development shell on {date.today()}. +> Do not edit manually — regenerate with: +> ``` +> nix develop --command ./scripts/generate-dependencies-md.sh +> ``` + +> **Note:** These dependencies are declared in `python/pyproject.toml`, pinned in +> `python/uv.lock`, and realized into the Nix store via uv2nix. Some packages +> require system libraries or hardware (SPI, I2C, GPIO) only available on the +> Raspberry Pi. + +# Python Dependencies + +Python {'.'.join(str(x) for x in __import__('sys').version_info[:3])} + +## Runtime + +| Package | Version | +|---------|---------|""") + +for name, ver in prod: + print(f"| {name} | {ver} |") + +print(f""" +## Development only + +| Package | Version | +|---------|---------|""") + +for name, ver in dev: + print(f"| {name} | {ver} |") +PYEOF + +echo "Generated $OUTPUT" diff --git a/shell.nix b/shell.nix new file mode 100644 index 000000000..d17bd1da0 --- /dev/null +++ b/shell.nix @@ -0,0 +1,34 @@ +# Classic-nix entry point for the devShell, used by direnv (.envrc: `use nix`). +# +# `use flake` would copy the entire working tree (~1.3 GB: astro_data, images, +# docs, python/.venv, …) into /nix/store on every flake change, because nix +# hashes the whole flake source. The devShell only needs the flake files, +# nixos/, and python/ (sans .venv) — so build a filtered copy (~25 MB) and +# evaluate the flake through flake-compat with that as its source. +# +# CI and remote builds keep evaluating the flake directly via github: refs; +# they fetch this file with the repository but do not evaluate it. +let + flake-compat = builtins.fetchTarball { + url = "https://github.com/edolstra/flake-compat/archive/5edf11c44bc78a0d334f6334cdaf7d60d732daab.tar.gz"; + sha256 = "0yqfa6rx8md81bcn4szfp0hjq2f3h9i8zjzhqqyfqdkrj5559nmw"; + }; + + # Only what the devShell evaluation actually reads. + wanted = [ "flake.nix" "flake.lock" "nixos" "python" ]; + + src = builtins.path { + path = ./.; + name = "pifinder-devshell-src"; + filter = path: type: + let + rel = builtins.substring (builtins.stringLength (toString ./. + "/")) + (builtins.stringLength path) (toString path); + top = builtins.head (builtins.split "/" rel); + in + builtins.elem top wanted && rel != "python/.venv"; + }; + + flake = import flake-compat { inherit src; }; +in +flake.defaultNix.devShells.${builtins.currentSystem}.default diff --git a/switch-ap.sh b/switch-ap.sh deleted file mode 100755 index 7d527bf58..000000000 --- a/switch-ap.sh +++ /dev/null @@ -1,8 +0,0 @@ -#! /usr/bin/bash -cp /etc/dhcpcd.conf.ap /etc/dhcpcd.conf -systemctl enable dnsmasq -systemctl enable hostapd -echo -n "AP" > /home/pifinder/PiFinder/wifi_status.txt -#systemctl start dnsmasq -#systemctl start hostapd -#systemctl restart dhcpcd diff --git a/switch-cli.sh b/switch-cli.sh deleted file mode 100755 index f802f4cc6..000000000 --- a/switch-cli.sh +++ /dev/null @@ -1,8 +0,0 @@ -#! /usr/bin/bash -#systemctl stop dnsmasq -#systemctl stop hostapd -cp /etc/dhcpcd.conf.sta /etc/dhcpcd.conf -systemctl disable dnsmasq -systemctl disable hostapd -#systemctl restart dhcpcd -echo -n "Client" > /home/pifinder/PiFinder/wifi_status.txt diff --git a/upd.json b/upd.json new file mode 100644 index 000000000..20c718545 --- /dev/null +++ b/upd.json @@ -0,0 +1,6 @@ +{ + "message": "ci(nixos): simplify publish_manifest.sh (drop one-time collapse)", + "content": "IyEvdXNyL2Jpbi9lbnYgYmFzaAojIFVwZGF0ZSB1cGRhdGUtbWFuaWZlc3QuanNvbiBvbiB0aGUgbWV0YWRhdGEtb25seSBgbml4b3MtbWFuaWZlc3RgIGJyYW5jaC4KIwojIFRoZSBicmFuY2ggaG9sZHMgb25seSB0aGF0IG9uZSBKU09OIGZpbGU7IGl0IGNhcnJpZXMgbm8gc291cmNlIHRyZWUuIFRoZSBqb2IKIyBoZXJlIGlzIGp1c3Q6IHJlYWQgdGhlIGN1cnJlbnQgbWFuaWZlc3QsIGxldCB0aGUgdXBkYXRlciByZXdyaXRlIGl0cyBlbnRyeSwKIyBhbmQgcHVzaC4gQ29uY3VycmVuY3ktc2FmZTogYSBnaXQgcmVmIHVwZGF0ZSBpcyBjb21wYXJlLWFuZC1zd2FwLCBzbyBpZiBhCiMgY29uY3VycmVudCB3cml0ZXIgbGFuZHMgZmlyc3Qgb3VyIHB1c2ggaXMgcmVqZWN0ZWQsIGFuZCB3ZSByZS1mZXRjaCB0aGUgbmV3CiMgdGlwLCByZS1hcHBseSB0aGlzIHJ1bidzIGVudHJ5IG9udG8gaXQsIGFuZCByZXRyeS4KIwojIFVzYWdlOgojICAgcHVibGlzaF9tYW5pZmVzdC5zaCAiPGNvbW1pdCBtZXNzYWdlPiIgPHVwZGF0ZXIgYXJndi4uLj4KIyBUaGUgdXBkYXRlciBhcmd2IGNvbnRhaW5zIHRoZSBsaXRlcmFsIHRva2VuIEBNQU5JRkVTVEAsIHJlcGxhY2VkIHdpdGggdGhlCiMgbWFuaWZlc3QgcGF0aCBvbiBlYWNoIGF0dGVtcHQuIEl0IG11c3QgYmUgaWRlbXBvdGVudCAocmVwbGFjZXMgaXRzIG93biBlbnRyeSkuCnNldCAtZXVvIHBpcGVmYWlsCgpCUkFOQ0g9Im5peG9zLW1hbmlmZXN0IgpDT01NSVRfTVNHPSIkMSIKc2hpZnQKCmdpdCBjb25maWcgdXNlci5uYW1lICJnaXRodWItYWN0aW9uc1tib3RdIgpnaXQgY29uZmlnIHVzZXIuZW1haWwgImdpdGh1Yi1hY3Rpb25zW2JvdF1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgoKV09SS1RSRUU9IiQobWt0ZW1wIC1kKSIKdHJhcCAnZ2l0IHdvcmt0cmVlIHJlbW92ZSAtLWZvcmNlICIkV09SS1RSRUUiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlJyBFWElUCmdpdCB3b3JrdHJlZSBhZGQgLS1kZXRhY2ggIiRXT1JLVFJFRSIgPi9kZXYvbnVsbApNQU5JRkVTVD0iJFdPUktUUkVFL3VwZGF0ZS1tYW5pZmVzdC5qc29uIgoKZm9yIGF0dGVtcHQgaW4gMSAyIDMgNCA1OyBkbwogIGdpdCBmZXRjaCBvcmlnaW4gIiRCUkFOQ0giID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCgogIGlmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0ICJyZWZzL3JlbW90ZXMvb3JpZ2luLyRCUkFOQ0giOyB0aGVuCiAgICAjIHJlc2V0IC0taGFyZCBzbyBhIHJldHJ5IGFmdGVyIGEgcmVqZWN0ZWQgcHVzaCBzdGFydHMgZnJvbSB0aGUgdHJ1ZSB0aXAsCiAgICAjIG5vdCB0aGUgc3RhbGUgZW50cnkgZnJvbSB0aGUgcHJldmlvdXMgYXR0ZW1wdCAod2hpY2ggd291bGQgb3RoZXJ3aXNlCiAgICAjIHNpbGVudGx5IGRyb3AgdGhlIGNvbmN1cnJlbnQgd3JpdGVyJ3MgY2hhbmdlKS4KICAgIGdpdCAtQyAiJFdPUktUUkVFIiBjaGVja291dCAtcSAtQiAiJEJSQU5DSCIgInJlZnMvcmVtb3Rlcy9vcmlnaW4vJEJSQU5DSCIKICAgIGdpdCAtQyAiJFdPUktUUkVFIiByZXNldCAtcSAtLWhhcmQgInJlZnMvcmVtb3Rlcy9vcmlnaW4vJEJSQU5DSCIKICBlbHNlCiAgICAjIEJyYW5jaCBkb2VzIG5vdCBleGlzdCB5ZXQ6IHN0YXJ0IGl0IGVtcHR5LgogICAgZ2l0IC1DICIkV09SS1RSRUUiIGNoZWNrb3V0IC1xIC0tb3JwaGFuICIkQlJBTkNIIgogICAgZ2l0IC1DICIkV09SS1RSRUUiIHJtIC1yZnEgLS1jYWNoZWQgLiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogIGZpCgogIGNtZD0oKQogIGZvciBhcmcgaW4gIiRAIjsgZG8KICAgIGNtZCs9KCAiJHthcmcvQE1BTklGRVNUQC8kTUFOSUZFU1R9IiApCiAgZG9uZQogICIke2NtZFtAXX0iCgogIGdpdCAtQyAiJFdPUktUUkVFIiBhZGQgdXBkYXRlLW1hbmlmZXN0Lmpzb24KICBpZiBnaXQgLUMgIiRXT1JLVFJFRSIgZGlmZiAtLXN0YWdlZCAtLXF1aWV0OyB0aGVuCiAgICBlY2hvICJNYW5pZmVzdCB1bmNoYW5nZWQiCiAgICBleGl0IDAKICBmaQoKICBnaXQgLUMgIiRXT1JLVFJFRSIgY29tbWl0IC1xIC1tICIkQ09NTUlUX01TRyIKICBpZiBnaXQgLUMgIiRXT1JLVFJFRSIgcHVzaCBvcmlnaW4gIkhFQUQ6JEJSQU5DSCIgMj4vZGV2L251bGw7IHRoZW4KICAgIGVjaG8gIk1hbmlmZXN0IHB1Ymxpc2hlZCAoYXR0ZW1wdCAkYXR0ZW1wdCkiCiAgICBleGl0IDAKICBmaQoKICBlY2hvICJQdXNoIHJlamVjdGVkIGJ5IGEgY29uY3VycmVudCB1cGRhdGU7IHJldHJ5aW5nICgkYXR0ZW1wdC81KSIKICBzbGVlcCAkKChhdHRlbXB0ICogMikpCmRvbmUKCmVjaG8gIkZhaWxlZCB0byBwdWJsaXNoIG1hbmlmZXN0IGFmdGVyIDUgYXR0ZW1wdHMiID4mMgpleGl0IDEK", + "branch": "ci-nixos-testable-pr-builds", + "sha": "a4b2c72776c7efa1faac1fda8767a1a83d1e06ec" +} diff --git a/version.txt b/version.txt deleted file mode 100644 index e70b4523a..000000000 --- a/version.txt +++ /dev/null @@ -1 +0,0 @@ -2.6.0