diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..9622faf --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,16 @@ +--- +name: Bug report +about: Report a problem +labels: bug +--- + +## Steps to Reproduce + +## Expected + +## Actual + +## Logs/Screenshots + +## Proposed Fix + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..c45d5dd --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,15 @@ +--- +name: Feature request +about: Suggest an enhancement +labels: enhancement +--- + +## Summary + +## Rationale + +## Acceptance Criteria +- [ ] + +## Notes + diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..0048a80 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,20 @@ +## Summary + +Briefly describe the change and why it’s needed. + +## Linked Issue + +Closes # + +## Changes +- + +## Testing +- [ ] Unit tests added/updated +- [ ] `pytest -q` passes locally +- [ ] CI green + +## Checklist +- [ ] Follows style (Black/Ruff) +- [ ] Docs updated (README/docs/* if needed) + diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..4c7d8e5 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,34 @@ +name: CI + +on: + push: + branches: [ "**" ] + pull_request: + branches: [ "**" ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + if [ -f requirements-dev.txt ]; then pip install -r requirements-dev.txt; fi + + - name: Lint (ruff) + run: ruff check . + + - name: Format check (black) + run: black --check . + + - name: Run tests + run: pytest -q + diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml new file mode 100644 index 0000000..a51944c --- /dev/null +++ b/.github/workflows/labeler.yml @@ -0,0 +1,55 @@ +name: PR Labeler + +on: + pull_request: + types: [opened, synchronize, reopened] + +jobs: + label: + runs-on: ubuntu-latest + steps: + - uses: actions/github-script@v7 + with: + script: | + const branch = context.payload.pull_request.head.ref; + const labels = new Set(); + + // Type by prefix + if (branch.startsWith('feat/')) labels.add('type: feature'); + if (branch.startsWith('fix/')) labels.add('type: fix'); + if (branch.startsWith('chore/')) labels.add('type: chore'); + + // Area by path fragment + if (branch.includes('cad-core')) labels.add('area: cad-core'); + if (branch.includes('backend')) labels.add('area: backend'); + if (branch.includes('frontend')) labels.add('area: frontend'); + if (branch.includes('qa')) labels.add('area: qa'); + if (branch.includes('integration')) labels.add('area: integration'); + + // Ensure labels exist + for (const name of labels) { + try { + await github.rest.issues.getLabel({ + owner: context.repo.owner, + repo: context.repo.repo, + name, + }); + } catch (e) { + await github.rest.issues.createLabel({ + owner: context.repo.owner, + repo: context.repo.repo, + name, + color: 'ededed', + }); + } + } + + if (labels.size) { + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.payload.pull_request.number, + labels: [...labels], + }); + } + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..34b2119 --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +# Python caches +__pycache__/ +*.py[cod] +*.pyd +*.pyo +*.pyi + +# Virtual environments +.venv/ +venv/ +env/ +ENV/ + +# Build artifacts +build/ +dist/ + +# Backups and temp files +*.bak +*.bak-* +*.bak_* +*.old +*.tmp +*.log + +# Tool caches +.mypy_cache/ +.pytest_cache/ +.ruff_cache/ +.coverage +.coverage.* +htmlcov/ + +# Editors/OS +.vscode/ +.idea/ +.DS_Store +Thumbs.db + +# Packaging +*.egg-info/ +.eggs/ +*.dist-info/ +pip-wheel-metadata/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..50f5b55 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,19 @@ +repos: + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.6.5 + hooks: + - id: ruff + args: ["--fix"] + - id: ruff-format + + - repo: https://github.com/psf/black + rev: 24.8.0 + hooks: + - id: black + + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 + hooks: + - id: end-of-file-fixer + - id: trailing-whitespace + diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..a14b4c1 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,30 @@ +# AutoFire – Agent Guide (HAL Lead) + +Scope: Entire repository. + +Principles +- Keep `main` green: all work via feature branches + PRs. +- Small, focused changes (≤300 lines) with clear rationale. +- Prefer composition over monoliths; avoid editing unrelated code. + +Directory Layout (target state) +- `frontend/` – UI: Qt widgets, views, input handling. +- `backend/` – non-UI logic, persistence, loaders, settings. +- `cad_core/` – geometry kernels, tools, algorithms, units. +- `tests/` – pytest suite and tiny fixtures. +- `docs/` – architecture, decisions, and contribution guides. +- `build/` – build outputs (ignored). Packaging specs live at repo root for now. + +Working Rules +- Code style: Black (line length 100) + Ruff; fix lint before commit. +- Tests: add/adjust tests with each change; no PR without tests if logic changed. +- Imports: do not rely on implicit side effects; keep module-level state minimal. +- UI vs core: GUI code stays in `frontend/`; algorithms in `cad_core/`; glue in `backend/`. + +Branching +- `feat/` for features, `fix/` for fixes, `chore/` for maintenance. +- Reference the GitHub issue number in the PR description. + +Reviews +- HAL reviews and requests changes as needed. At least one human approval to merge. + diff --git a/AutoFire.spec b/AutoFire.spec index 25f131a..3952dbc 100644 --- a/AutoFire.spec +++ b/AutoFire.spec @@ -6,7 +6,7 @@ a = Analysis( pathex=['.'], binaries=[], datas=[('app', 'app'), ('core', 'core'), ('updater', 'updater')], - hiddenimports=['app.main', 'app.minwin', 'app.tools.array', 'app.tools.draw', 'app.tools.dimension'], + hiddenimports=['app.main', 'app.minwin', 'app.tools.array', 'app.tools.draw', 'app.tools.dimension', 'app.tools.text_tool', 'app.tools.trim_tool', 'app.tools.measure_tool', 'app.tools.extend_tool', 'app.tools.fillet_tool', 'app.tools.fillet_radius_tool', 'app.tools.rotate_tool', 'app.tools.mirror_tool', 'app.tools.scale_tool', 'app.tools.chamfer_tool', 'app.layout', 'app.dxf_import'], hookspath=[], hooksconfig={}, runtime_hooks=[], diff --git a/AutoFire_Debug.spec b/AutoFire_Debug.spec index 83b15cc..754f101 100644 --- a/AutoFire_Debug.spec +++ b/AutoFire_Debug.spec @@ -6,7 +6,7 @@ a = Analysis( pathex=['.'], binaries=[], datas=[('VERSION.txt', '.')], - hiddenimports=['app', 'app.main', 'app.minwin', 'app.scene', 'app.device', 'app.catalog', 'app.tools', 'app.tools.draw', 'core.logger', 'core.logger_bridge', 'core.error_hook', 'updater.auto_update'], + hiddenimports=['app', 'app.main', 'app.minwin', 'app.scene', 'app.device', 'app.catalog', 'app.tools', 'app.tools.draw', 'app.tools.text_tool', 'app.tools.dimension', 'app.tools.trim_tool', 'app.tools.measure_tool', 'app.tools.extend_tool', 'app.tools.fillet_tool', 'app.tools.fillet_radius_tool', 'app.tools.rotate_tool', 'app.tools.mirror_tool', 'app.tools.scale_tool', 'app.tools.chamfer_tool', 'app.layout', 'app.dxf_import', 'core.logger', 'core.logger_bridge', 'core.error_hook', 'updater.auto_update'], hookspath=[], hooksconfig={}, runtime_hooks=[], diff --git a/CHANGELOG.md b/CHANGELOG.md index a2b6259..264001e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # CHANGELOG +## Unreleased (CAD Base) +- Added: DXF underlay import with layer-aware rendering and auto-fit. +- Added: Draw tools (Line, Rect, Circle, Polyline, Arc-3pt), Wire, Text. +- Added: Modify tools (Offset Selected…, Trim Lines, Extend Lines, Fillet/Corner, Fillet/Radius, Rotate, Mirror, Scale, Chamfer). +- Added: Measure tool (temporary readout). +- Added: OSNAP (Endpoint/Midpoint/Center/Intersection/Perpendicular) with toggles under View. +- Added: Export PNG/PDF (letter landscape, fit to content). +- Added: Settings menu with themes (Dark/Light/High Contrast) and improved menu contrast. +- Improved: Panning (Space or Middle Mouse), Esc commits polyline, sketch/wires included in Save/Open. +- UI: Keep Draw/Modify in menus; removed CAD toolbars from top bar; status bar shows Grid opacity and Grid size. +- Added: DXF Layers dock (visibility, color override, lock, print flags). +- Added: Command Bar (commands + coordinate entry in feet; absolute, relative, polar). +- Coverage: Placement and global/per-device overlay toggles; Candela mapping for strobes (placeholder). +- DB: SQLite catalog scaffold (auto-created at %USERPROFILE%/AutoFire/catalog.db); palette loads from DB if present and seeds demo devices. +- Annotations: MText (scalable) and Freehand sketch tool added. +- UI: Device Palette is now a dockable panel (tabbed with other docks); Properties and DXF Layers appear as tabs. +- Underlay: Added scale by reference (two picks + real distance), scale by factor, and scale by drag (anchor + live factor); respect non-print DXF layers on export; underlay transform persists with project. + ## 0.5.3 – coverage + array (2025-09-08 21:04) - Restored **Coverage** overlays: - Detector circle diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 0000000..00667f1 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,8 @@ +# Default owner (human) for all files +* @Obayne + +# HAL lead for repo hygiene and CI +.github/ @Obayne +AGENTS.md @Obayne +docs/ @Obayne + diff --git a/Projects/Star-Wars-Logo.dxf b/Projects/Star-Wars-Logo.dxf new file mode 100644 index 0000000..442075d --- /dev/null +++ b/Projects/Star-Wars-Logo.dxf @@ -0,0 +1,23724 @@ + 0 +SECTION + 2 +HEADER + 9 +$ACADVER + 1 +AC1018 + 9 +$ACADMAINTVER + 70 + 104 + 9 +$DWGCODEPAGE + 3 +ANSI_1252 + 9 +$LASTSAVEDBY + 1 +Republic Gamer + 9 +$INSBASE + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$EXTMIN + 10 +-160.4738485844569 + 20 +-129.1636700722808 + 30 +0.0 + 9 +$EXTMAX + 10 +620.1148364484866 + 20 +600.4572153218629 + 30 +0.0 + 9 +$LIMMIN + 10 +0.0 + 20 +0.0 + 9 +$LIMMAX + 10 +12.0 + 20 +9.0 + 9 +$ORTHOMODE + 70 + 0 + 9 +$REGENMODE + 70 + 1 + 9 +$FILLMODE + 70 + 1 + 9 +$QTEXTMODE + 70 + 0 + 9 +$MIRRTEXT + 70 + 1 + 9 +$LTSCALE + 40 +1.0 + 9 +$ATTMODE + 70 + 1 + 9 +$TEXTSIZE + 40 +0.2 + 9 +$TRACEWID + 40 +0.05 + 9 +$TEXTSTYLE + 7 +Standard + 9 +$CLAYER + 8 +0 + 9 +$CELTYPE + 6 +ByLayer + 9 +$CECOLOR + 62 + 256 + 9 +$CELTSCALE + 40 +1.0 + 9 +$DISPSILH + 70 + 0 + 9 +$DIMSCALE + 40 +1.0 + 9 +$DIMASZ + 40 +0.18 + 9 +$DIMEXO + 40 +0.0625 + 9 +$DIMDLI + 40 +0.38 + 9 +$DIMRND + 40 +0.0 + 9 +$DIMDLE + 40 +0.0 + 9 +$DIMEXE + 40 +0.18 + 9 +$DIMTP + 40 +0.0 + 9 +$DIMTM + 40 +0.0 + 9 +$DIMTXT + 40 +0.18 + 9 +$DIMCEN + 40 +0.09 + 9 +$DIMTSZ + 40 +0.0 + 9 +$DIMTOL + 70 + 0 + 9 +$DIMLIM + 70 + 0 + 9 +$DIMTIH + 70 + 1 + 9 +$DIMTOH + 70 + 1 + 9 +$DIMSE1 + 70 + 0 + 9 +$DIMSE2 + 70 + 0 + 9 +$DIMTAD + 70 + 0 + 9 +$DIMZIN + 70 + 0 + 9 +$DIMBLK + 1 + + 9 +$DIMASO + 70 + 1 + 9 +$DIMSHO + 70 + 1 + 9 +$DIMPOST + 1 + + 9 +$DIMAPOST + 1 + + 9 +$DIMALT + 70 + 0 + 9 +$DIMALTD + 70 + 2 + 9 +$DIMALTF + 40 +25.4 + 9 +$DIMLFAC + 40 +1.0 + 9 +$DIMTOFL + 70 + 0 + 9 +$DIMTVP + 40 +0.0 + 9 +$DIMTIX + 70 + 0 + 9 +$DIMSOXD + 70 + 0 + 9 +$DIMSAH + 70 + 0 + 9 +$DIMBLK1 + 1 + + 9 +$DIMBLK2 + 1 + + 9 +$DIMSTYLE + 2 +Standard + 9 +$DIMCLRD + 70 + 0 + 9 +$DIMCLRE + 70 + 0 + 9 +$DIMCLRT + 70 + 0 + 9 +$DIMTFAC + 40 +1.0 + 9 +$DIMGAP + 40 +0.09 + 9 +$DIMJUST + 70 + 0 + 9 +$DIMSD1 + 70 + 0 + 9 +$DIMSD2 + 70 + 0 + 9 +$DIMTOLJ + 70 + 1 + 9 +$DIMTZIN + 70 + 0 + 9 +$DIMALTZ + 70 + 0 + 9 +$DIMALTTZ + 70 + 0 + 9 +$DIMUPT + 70 + 0 + 9 +$DIMDEC + 70 + 4 + 9 +$DIMTDEC + 70 + 4 + 9 +$DIMALTU + 70 + 2 + 9 +$DIMALTTD + 70 + 2 + 9 +$DIMTXSTY + 7 +Standard + 9 +$DIMAUNIT + 70 + 0 + 9 +$DIMADEC + 70 + 0 + 9 +$DIMALTRND + 40 +0.0 + 9 +$DIMAZIN + 70 + 0 + 9 +$DIMDSEP + 70 + 46 + 9 +$DIMATFIT + 70 + 3 + 9 +$DIMFRAC + 70 + 0 + 9 +$DIMLDRBLK + 1 + + 9 +$DIMLUNIT + 70 + 2 + 9 +$DIMLWD + 70 + -2 + 9 +$DIMLWE + 70 + -2 + 9 +$DIMTMOVE + 70 + 0 + 9 +$LUNITS + 70 + 2 + 9 +$LUPREC + 70 + 4 + 9 +$SKETCHINC + 40 +0.1 + 9 +$FILLETRAD + 40 +0.0 + 9 +$AUNITS + 70 + 0 + 9 +$AUPREC + 70 + 0 + 9 +$MENU + 1 +. + 9 +$ELEVATION + 40 +0.0 + 9 +$PELEVATION + 40 +0.0 + 9 +$THICKNESS + 40 +0.0 + 9 +$LIMCHECK + 70 + 0 + 9 +$CHAMFERA + 40 +0.0 + 9 +$CHAMFERB + 40 +0.0 + 9 +$CHAMFERC + 40 +0.0 + 9 +$CHAMFERD + 40 +0.0 + 9 +$SKPOLY + 70 + 0 + 9 +$TDCREATE + 40 +2460437.006168982 + 9 +$TDUCREATE + 40 +2460437.172835648 + 9 +$TDUPDATE + 40 +2460436.841064815 + 9 +$TDUUPDATE + 40 +2460437.007731481 + 9 +$TDINDWG + 40 +0.0010069560 + 9 +$TDUSRTIMER + 40 +0.0010069560 + 9 +$USRTIMER + 70 + 1 + 9 +$ANGBASE + 50 +0.0 + 9 +$ANGDIR + 70 + 0 + 9 +$PDMODE + 70 + 0 + 9 +$PDSIZE + 40 +0.0 + 9 +$PLINEWID + 40 +0.0 + 9 +$SPLFRAME + 70 + 0 + 9 +$SPLINETYPE + 70 + 6 + 9 +$SPLINESEGS + 70 + 8 + 9 +$HANDSEED + 5 +2DD + 9 +$SURFTAB1 + 70 + 6 + 9 +$SURFTAB2 + 70 + 6 + 9 +$SURFTYPE + 70 + 6 + 9 +$SURFU + 70 + 6 + 9 +$SURFV + 70 + 6 + 9 +$UCSBASE + 2 + + 9 +$UCSNAME + 2 + + 9 +$UCSORG + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSXDIR + 10 +1.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSYDIR + 10 +0.0 + 20 +1.0 + 30 +0.0 + 9 +$UCSORTHOREF + 2 + + 9 +$UCSORTHOVIEW + 70 + 0 + 9 +$UCSORGTOP + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSORGBOTTOM + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSORGLEFT + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSORGRIGHT + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSORGFRONT + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSORGBACK + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSBASE + 2 + + 9 +$PUCSNAME + 2 + + 9 +$PUCSORG + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSXDIR + 10 +1.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSYDIR + 10 +0.0 + 20 +1.0 + 30 +0.0 + 9 +$PUCSORTHOREF + 2 + + 9 +$PUCSORTHOVIEW + 70 + 0 + 9 +$PUCSORGTOP + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSORGBOTTOM + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSORGLEFT + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSORGRIGHT + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSORGFRONT + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSORGBACK + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$USERI1 + 70 + 0 + 9 +$USERI2 + 70 + 0 + 9 +$USERI3 + 70 + 0 + 9 +$USERI4 + 70 + 0 + 9 +$USERI5 + 70 + 0 + 9 +$USERR1 + 40 +0.0 + 9 +$USERR2 + 40 +0.0 + 9 +$USERR3 + 40 +0.0 + 9 +$USERR4 + 40 +0.0 + 9 +$USERR5 + 40 +0.0 + 9 +$WORLDVIEW + 70 + 1 + 9 +$SHADEDGE + 70 + 3 + 9 +$SHADEDIF + 70 + 70 + 9 +$TILEMODE + 70 + 1 + 9 +$MAXACTVP + 70 + 64 + 9 +$PINSBASE + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PLIMCHECK + 70 + 0 + 9 +$PEXTMIN + 10 +1.000000000000000E+20 + 20 +1.000000000000000E+20 + 30 +1.000000000000000E+20 + 9 +$PEXTMAX + 10 +-1.000000000000000E+20 + 20 +-1.000000000000000E+20 + 30 +-1.000000000000000E+20 + 9 +$PLIMMIN + 10 +0.0 + 20 +0.0 + 9 +$PLIMMAX + 10 +12.0 + 20 +9.0 + 9 +$UNITMODE + 70 + 0 + 9 +$VISRETAIN + 70 + 1 + 9 +$PLINEGEN + 70 + 0 + 9 +$PSLTSCALE + 70 + 1 + 9 +$TREEDEPTH + 70 + 3020 + 9 +$CMLSTYLE + 2 +Standard + 9 +$CMLJUST + 70 + 0 + 9 +$CMLSCALE + 40 +1.0 + 9 +$PROXYGRAPHICS + 70 + 1 + 9 +$MEASUREMENT + 70 + 0 + 9 +$CELWEIGHT +370 + -1 + 9 +$ENDCAPS +280 + 0 + 9 +$JOINSTYLE +280 + 0 + 9 +$LWDISPLAY +290 + 0 + 9 +$INSUNITS + 70 + 1 + 9 +$HYPERLINKBASE + 1 + + 9 +$STYLESHEET + 1 +monochrome.ctb + 9 +$XEDIT +290 + 1 + 9 +$CEPSNTYPE +380 + 0 + 9 +$PSTYLEMODE +290 + 1 + 9 +$FINGERPRINTGUID + 2 +{7b2c6465-fd14-45a6-876c-95e3afc07039} + 9 +$VERSIONGUID + 2 +{66C4565C-C879-3142-B8A0-139E3FA35217} + 9 +$EXTNAMES +290 + 1 + 9 +$PSVPSCALE + 40 +0.0 + 9 +$OLESTARTUP +290 + 0 + 9 +$SORTENTS +280 + 127 + 9 +$INDEXCTL +280 + 0 + 9 +$HIDETEXT +280 + 1 + 9 +$XCLIPFRAME +290 + 0 + 9 +$HALOGAP +280 + 0 + 9 +$OBSCOLOR + 70 + 257 + 9 +$OBSLTYPE +280 + 0 + 9 +$INTERSECTIONDISPLAY +280 + 0 + 9 +$INTERSECTIONCOLOR + 70 + 257 + 9 +$DIMASSOC +280 + 2 + 9 +$PROJECTNAME + 1 + + 0 +ENDSEC + 0 +SECTION + 2 +CLASSES + 0 +CLASS + 1 +ACDBDICTIONARYWDFLT + 2 +AcDbDictionaryWithDefault + 3 +ObjectDBX Classes + 90 + 0 + 91 + 1 +280 + 0 +281 + 0 + 0 +CLASS + 1 +VISUALSTYLE + 2 +AcDbVisualStyle + 3 +ObjectDBX Classes + 90 + 4095 + 91 + 24 +280 + 0 +281 + 0 + 0 +CLASS + 1 +MATERIAL + 2 +AcDbMaterial + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 3 +280 + 0 +281 + 0 + 0 +CLASS + 1 +SCALE + 2 +AcDbScale + 3 +ObjectDBX Classes + 90 + 1153 + 91 + 17 +280 + 0 +281 + 0 + 0 +CLASS + 1 +TABLESTYLE + 2 +AcDbTableStyle + 3 +ObjectDBX Classes + 90 + 4095 + 91 + 1 +280 + 0 +281 + 0 + 0 +CLASS + 1 +MLEADERSTYLE + 2 +AcDbMLeaderStyle + 3 +ACDB_MLEADERSTYLE_CLASS + 90 + 4095 + 91 + 1 +280 + 0 +281 + 0 + 0 +CLASS + 1 +SUN + 2 +AcDbSun + 3 +SCENEOE + 90 + 1153 + 91 + 1 +280 + 0 +281 + 0 + 0 +CLASS + 1 +DICTIONARYVAR + 2 +AcDbDictionaryVar + 3 +ObjectDBX Classes + 90 + 0 + 91 + 9 +280 + 0 +281 + 0 + 0 +CLASS + 1 +CELLSTYLEMAP + 2 +AcDbCellStyleMap + 3 +ObjectDBX Classes + 90 + 1152 + 91 + 2 +280 + 0 +281 + 0 + 0 +CLASS + 1 +ACDBSECTIONVIEWSTYLE + 2 +AcDbSectionViewStyle + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 1 +280 + 0 +281 + 0 + 0 +CLASS + 1 +ACDBDETAILVIEWSTYLE + 2 +AcDbDetailViewStyle + 3 +ObjectDBX Classes + 90 + 1025 + 91 + 1 +280 + 0 +281 + 0 + 0 +ENDSEC + 0 +SECTION + 2 +TABLES + 0 +TABLE + 2 +VPORT + 5 +8 +102 +{ACAD_XDICTIONARY +360 +244 +102 +} +330 +0 +100 +AcDbSymbolTable + 70 + 1 + 0 +VPORT + 5 +29 +330 +8 +100 +AcDbSymbolTableRecord +100 +AcDbViewportTableRecord + 2 +*Active + 70 + 0 + 10 +0.0 + 20 +0.0 + 11 +1.0 + 21 +1.0 + 12 +470.0660072101736 + 22 +482.1568225369373 + 13 +0.0 + 23 +0.0 + 14 +0.5 + 24 +0.5 + 15 +0.5 + 25 +0.5 + 16 +0.0 + 26 +0.0 + 36 +1.0 + 17 +0.0 + 27 +0.0 + 37 +-1000.0 + 40 +347.8388043516652 + 41 +2.273709483793517 + 42 +50.0 + 43 +777.8755633984892 + 44 +778.8755633984892 + 50 +0.0 + 51 +0.0 + 71 + 0 + 72 + 100 + 73 + 1 + 74 + 3 + 75 + 0 + 76 + 0 + 77 + 0 + 78 + 0 +281 + 0 + 65 + 1 +110 +0.0 +120 +0.0 +130 +0.0 +111 +1.0 +121 +0.0 +131 +0.0 +112 +0.0 +122 +1.0 +132 +0.0 + 79 + 0 +146 +0.0 +1001 +ACAD_NAV_VCDISPLAY +1070 + 3 + 0 +ENDTAB + 0 +TABLE + 2 +LTYPE + 5 +5 +330 +0 +100 +AcDbSymbolTable + 70 + 2 + 0 +LTYPE + 5 +14 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +ByBlock + 70 + 0 + 3 + + 72 + 65 + 73 + 0 + 40 +0.0 + 0 +LTYPE + 5 +15 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +ByLayer + 70 + 0 + 3 + + 72 + 65 + 73 + 0 + 40 +0.0 + 0 +LTYPE + 5 +16 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +Continuous + 70 + 0 + 3 +Solid line + 72 + 65 + 73 + 0 + 40 +0.0 + 0 +ENDTAB + 0 +TABLE + 2 +LAYER + 5 +2 +330 +0 +100 +AcDbSymbolTable + 70 + 3 + 0 +LAYER + 5 +10 +102 +{ACAD_XDICTIONARY +360 +28E +102 +} +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0 + 70 + 0 + 62 + 7 + 6 +Continuous +370 + -3 +390 +26E + 0 +LAYER + 5 +5E +102 +{ACAD_XDICTIONARY +360 +290 +102 +} +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +Edges + 70 + 0 + 62 + 7 + 6 +Continuous +370 + -3 +390 +26E + 0 +ENDTAB + 0 +TABLE + 2 +STYLE + 5 +3 +330 +0 +100 +AcDbSymbolTable + 70 + 2 + 0 +STYLE + 5 +11 +330 +3 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord + 2 +Standard + 70 + 0 + 40 +0.0 + 41 +1.0 + 50 +0.0 + 71 + 0 + 42 +0.2 + 3 +txt + 4 + + 0 +ENDTAB + 0 +TABLE + 2 +VIEW + 5 +6 +330 +0 +100 +AcDbSymbolTable + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +UCS + 5 +7 +330 +0 +100 +AcDbSymbolTable + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +APPID + 5 +9 +330 +0 +100 +AcDbSymbolTable + 70 + 5 + 0 +APPID + 5 +12 +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +ACAD + 70 + 0 + 0 +APPID + 5 +262 +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +ACAD_MLEADERVER + 70 + 0 + 0 +APPID + 5 +286 +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +ACAD_EXEMPT_FROM_CAD_STANDARDS + 70 + 0 + 0 +APPID + 5 +294 +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +Acad_TC + 70 + 0 + 0 +APPID + 5 +2A0 +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +ACAD_NAV_VCDISPLAY + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +DIMSTYLE + 5 +A +330 +0 +100 +AcDbSymbolTable + 70 + 3 +100 +AcDbDimStyleTable + 71 + 1 +340 +27 + 0 +DIMSTYLE +105 +27 +330 +A +100 +AcDbSymbolTableRecord +100 +AcDbDimStyleTableRecord + 2 +Standard + 70 + 0 +340 +11 + 0 +ENDTAB + 0 +TABLE + 2 +BLOCK_RECORD + 5 +1 +330 +0 +100 +AcDbSymbolTable + 70 + 3 + 0 +BLOCK_RECORD + 5 +1F +102 +{ACAD_XDICTIONARY +360 +22E +102 +} +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord + 2 +*Model_Space +340 +22 + 0 +BLOCK_RECORD + 5 +1B +102 +{ACAD_XDICTIONARY +360 +230 +102 +} +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord + 2 +*Paper_Space +340 +1E + 0 +BLOCK_RECORD + 5 +23 +102 +{ACAD_XDICTIONARY +360 +232 +102 +} +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord + 2 +*Paper_Space0 +340 +26 + 0 +ENDTAB + 0 +ENDSEC + 0 +SECTION + 2 +BLOCKS + 0 +BLOCK + 5 +20 +330 +1F +100 +AcDbEntity + 8 +0 +100 +AcDbBlockBegin + 2 +*Model_Space + 70 + 0 + 10 +0.0 + 20 +0.0 + 30 +0.0 + 3 +*Model_Space + 1 + + 0 +ENDBLK + 5 +21 +330 +1F +100 +AcDbEntity + 8 +0 +100 +AcDbBlockEnd + 0 +BLOCK + 5 +1C +330 +1B +100 +AcDbEntity + 67 + 1 + 8 +0 +100 +AcDbBlockBegin + 2 +*Paper_Space + 70 + 0 + 10 +0.0 + 20 +0.0 + 30 +0.0 + 3 +*Paper_Space + 1 + + 0 +ENDBLK + 5 +1D +330 +1B +100 +AcDbEntity + 67 + 1 + 8 +0 +100 +AcDbBlockEnd + 0 +BLOCK + 5 +24 +330 +23 +100 +AcDbEntity + 67 + 1 + 8 +0 +100 +AcDbBlockBegin + 2 +*Paper_Space0 + 70 + 0 + 10 +0.0 + 20 +0.0 + 30 +0.0 + 3 +*Paper_Space0 + 1 + + 0 +ENDBLK + 5 +25 +330 +23 +100 +AcDbEntity + 67 + 1 + 8 +0 +100 +AcDbBlockEnd + 0 +ENDSEC + 0 +SECTION + 2 +ENTITIES + 0 +LWPOLYLINE + 5 +272 +330 +1F +100 +AcDbEntity + 8 +Edges +100 +AcDbPolyline + 90 + 48 + 70 + 1 + 43 +0.0 + 10 +585.069198308488 + 20 +425.3447381604359 + 10 +584.3960777825615 + 20 +422.3301138628062 + 10 +583.3146585386621 + 20 +419.4367450102044 + 10 +581.8455023631472 + 20 +416.7196452641094 + 10 +580.0165433579643 + 20 +414.2304767572293 + 10 +577.8625568098798 + 20 +412.0165678049565 + 10 +575.4244979834395 + 20 +410.1200130187457 + 10 +572.748723409655 + 20 +408.5768729315952 + 10 +569.8861094766039 + 20 +407.416488353714 + 10 +566.8910850808012 + 20 +406.6609224950161 + 10 +492.8910850808013 + 20 +406.6609224950161 + 10 +472.5934184964059 + 20 +424.4655491754248 + 10 +472.5934184964059 + 20 +404.9655491754248 + 10 +441.843418496406 + 20 +404.9655491754248 + 10 +441.843418496406 + 20 +480.4655491754248 + 10 +495.5802084577618 + 20 +480.4655491754248 + 10 +500.5536140366139 + 20 +479.4301158372928 + 10 +505.2130106619864 + 20 +477.4060337399116 + 10 +509.3641230020676 + 20 +474.4776977637132 + 10 +512.8338688335354 + 20 +470.7672060019 + 10 +515.4775757713349 + 20 +466.4292688335557 + 10 +517.1850134393357 + 20 +461.6447582149695 + 10 +517.8849895682013 + 20 +456.6131661539524 + 10 +517.5483183844017 + 20 +451.5442868139532 + 10 +516.189037522249 + 20 +446.6494690658386 + 10 +513.863822719345 + 20 +442.1328042155505 + 10 +510.6696246999332 + 20 +438.1826163387202 + 10 +506.7396267772165 + 20 +434.9636100360059 + 10 +547.7396267772165 + 20 +434.9636100360059 + 10 +535.7583198059312 + 20 +450.348611929403 + 10 +534.4232435167635 + 20 +453.717006688559 + 10 +533.6751754318184 + 20 +457.2622719948082 + 10 +533.5355323144441 + 20 +460.8829089209827 + 10 +534.0083120675833 + 20 +464.4752606933498 + 10 +535.0799792760879 + 20 +467.9364803260262 + 10 +536.7198527179481 + 20 +471.1674750716253 + 10 +538.8809837502098 + 20 +474.0757433901961 + 10 +541.5015004218921 + 20 +476.5780232156441 + 10 +544.5063788327148 + 20 +478.602675701277 + 10 +547.8095910246487 + 20 +480.0917361991976 + 10 +551.316567913372 + 20 +481.002573755169 + 10 +554.9269067473105 + 20 +481.3091116085631 + 10 +603.9269067473106 + 20 +481.3091116085631 + 10 +603.9269067473106 + 20 +454.8091116085632 + 10 +568.9269067473105 + 20 +454.8091116085632 + 10 +584.5509066324096 + 20 +434.5379865937578 + 10 +585.1473557648167 + 20 +431.5072607185369 + 10 +585.3212216014115 + 20 +428.4232987263671 + 0 +LWPOLYLINE + 5 +273 +330 +1F +100 +AcDbEntity + 8 +Edges +100 +AcDbPolyline + 90 + 85 + 70 + 1 + 43 +0.0 + 10 +494.4361385985553 + 20 +475.2398521733165 + 10 +498.3228415382188 + 20 +474.191326840086 + 10 +501.9087950864767 + 20 +472.3619000814124 + 10 +505.0390497919826 + 20 +469.8306216308518 + 10 +507.5783470010297 + 20 +466.7068683115673 + 10 +509.4169633990094 + 20 +463.125617851645 + 10 +510.4754521670296 + 20 +459.2416164814611 + 10 +510.7080758877889 + 20 +455.2226923318714 + 10 +510.1047828644603 + 20 +451.2425035620243 + 10 +508.6916414556291 + 20 +447.4730345710042 + 10 +506.529713658621 + 20 +444.0771645328347 + 10 +503.712416613811 + 20 +441.2016293692659 + 10 +500.3614860396069 + 20 +438.9706812742895 + 10 +499.8954868958985 + 20 +438.6899103931039 + 10 +499.4657875136647 + 20 +438.356225016489 + 10 +499.0783656363314 + 20 +437.9742671933955 + 10 +498.7386108657367 + 20 +437.5493505127193 + 10 +498.4512496849297 + 20 +437.087386183551 + 10 +498.2202797059165 + 20 +436.5948008016593 + 10 +498.0489140570625 + 20 +436.0784469461962 + 10 +497.9395366838032 + 20 +435.5455078503535 + 10 +497.8936691844952 + 20 +435.0033974721408 + 10 +497.9119496427707 + 20 +434.4596573554453 + 10 +497.9941237508652 + 20 +433.9218517161874 + 10 +498.1390483474085 + 20 +433.397462213074 + 10 +504.7995326612049 + 20 +427.722918292575 + 10 +550.0495326612049 + 20 +427.722918292575 + 10 +551.0136413886122 + 20 +428.0190246799788 + 10 +551.9163969580268 + 20 +428.4687101398459 + 10 +552.7335254731846 + 20 +429.0598832284081 + 10 +553.4430554353962 + 20 +429.7766480877927 + 10 +554.0259085279142 + 20 +430.5997318644926 + 10 +554.466412606491 + 20 +431.5070029307576 + 10 +554.7527231024864 + 20 +432.4740659746214 + 10 +554.8771415075621 + 20 +433.4749179573856 + 10 +554.8363223763279 + 20 +434.4826473007361 + 10 +554.6313632809178 + 20 +435.4701575032825 + 10 +554.2677752987367 + 20 +436.4108957294314 + 10 +553.7553348269189 + 20 +437.279566779811 + 10 +540.0480890200251 + 20 +454.8059443972594 + 10 +539.5687204671341 + 20 +456.8197310873889 + 10 +539.3494749714489 + 20 +458.8781436931279 + 10 +539.3939164028908 + 20 +460.9477223947035 + 10 +539.7013223590211 + 20 +462.9948258657032 + 10 +540.2666959078057 + 20 +464.9861781181132 + 10 +541.0808468135289 + 20 +466.8894094087224 + 10 +542.1305409255165 + 20 +468.6735824143757 + 10 +543.3987153013315 + 20 +470.3096951230146 + 10 +544.864755567579 + 20 +471.7711522659323 + 10 +546.5048310097791 + 20 +473.0341976280375 + 10 +548.2922819443695 + 20 +474.0783002088578 + 10 +550.1980530760424 + 20 +474.8864879571721 + 10 +598.9480530760424 + 20 +474.8864879571721 + 10 +598.9480530760424 + 20 +460.1364879571721 + 10 +568.1980530760425 + 20 +460.1364879571721 + 10 +567.3576511654498 + 20 +460.0656888816739 + 10 +566.540938803538 + 20 +459.8552873647609 + 10 +565.770937769543 + 20 +459.5112142794055 + 10 +565.0693531271367 + 20 +459.0431684804084 + 10 +564.455961394352 + 20 +458.4643434096224 + 10 +563.9480530760424 + 20 +457.7910551945085 + 10 +563.559945272967 + 20 +457.0422827233191 + 10 +563.3025781062493 + 20 +456.2391326614285 + 10 +563.1832063333425 + 20 +455.404244489125 + 10 +563.2051948483406 + 20 +454.5611523318686 + 10 +563.3679238311433 + 20 +453.733621571972 + 10 +563.666806219166 + 20 +452.944978941531 + 10 +577.9330021887802 + 20 +432.4151067413304 + 10 +578.4117177481873 + 20 +430.4097000620079 + 10 +578.63664081585 + 20 +428.3602527828803 + 10 +578.6042606161204 + 20 +426.2987542844682 + 10 +578.3150825645516 + 20 +424.2573820521743 + 10 +577.7736203789759 + 20 +422.2679994248546 + 10 +576.9883256258561 + 20 +420.3616582468352 + 10 +575.9714558016078 + 20 +418.5681141863717 + 10 +574.7388830079824 + 20 +416.9153622858422 + 10 +573.3098462078529 + 20 +415.4291999931682 + 10 +571.7066509283941 + 20 +414.1328244950155 + 10 +569.9543210989183 + 20 +413.0464706369106 + 10 +568.0802084577619 + 20 +412.1870950819012 + 10 +495.5802084577618 + 20 +412.1870950819012 + 10 +467.809083118665 + 20 +435.4857452016008 + 10 +467.809083118665 + 20 +412.1870950819012 + 10 +447.809083118665 + 20 +412.1870950819012 + 10 +446.1861385985553 + 20 +475.2398521733165 + 0 +LWPOLYLINE + 5 +274 +330 +1F +100 +AcDbEntity + 8 +Edges +100 +AcDbPolyline + 90 + 15 + 70 + 1 + 43 +0.0 + 10 +466.8987840373298 + 20 +462.8016654621506 + 10 +488.6487840373297 + 20 +462.8016654621506 + 10 +490.5400285958321 + 20 +462.2004983068036 + 10 +492.2447816105523 + 20 +461.1846119511834 + 10 +493.6735369707988 + 20 +459.807344348537 + 10 +494.7512795076169 + 20 +458.1410073618906 + 10 +495.4214235795885 + 20 +456.2730901122422 + 10 +495.6487840373298 + 20 +454.3016654621506 + 10 +495.4214235795885 + 20 +452.3302408120591 + 10 +494.7512795076169 + 20 +450.4623235624107 + 10 +493.6735369707988 + 20 +448.7959865757644 + 10 +492.2447816105523 + 20 +447.4187189731179 + 10 +490.5400285958321 + 20 +446.4028326174978 + 10 +488.6487840373297 + 20 +445.8016654621506 + 10 +466.8987840373298 + 20 +445.8016654621506 + 0 +LWPOLYLINE + 5 +275 +330 +1F +100 +AcDbEntity + 8 +Edges +100 +AcDbPolyline + 90 + 15 + 70 + 1 + 43 +0.0 + 10 +486.9814876454336 + 20 +457.6029513766667 + 10 +487.6674676749267 + 20 +457.32757172089 + 10 +488.278407347904 + 20 +456.9114524210952 + 10 +488.7858633263401 + 20 +456.3739666206982 + 10 +489.1662101320317 + 20 +455.7401378874591 + 10 +489.4017400710123 + 20 +455.0394751986259 + 10 +489.4814876454336 + 20 +454.3045991001896 + 10 +489.4017400710123 + 20 +453.5697230017533 + 10 +489.1662101320317 + 20 +452.8690603129201 + 10 +488.7858633263401 + 20 +452.2352315796812 + 10 +488.278407347904 + 20 +451.697745779284 + 10 +487.6674676749267 + 20 +451.2816264794893 + 10 +486.9814876454336 + 20 +451.0062468237125 + 10 +472.7314876454337 + 20 +451.0062468237125 + 10 +472.7314876454337 + 20 +457.6029513766667 + 0 +LWPOLYLINE + 5 +276 +330 +1F +100 +AcDbEntity + 8 +Edges +100 +AcDbPolyline + 90 + 8 + 70 + 1 + 43 +0.0 + 10 +374.4870647381839 + 20 +405.8833493656875 + 10 +345.9870647381839 + 20 +405.8833493656875 + 10 +370.7752618736522 + 20 +481.1525972423007 + 10 +409.5252618736521 + 20 +481.1525972423007 + 10 +436.1231235613508 + 20 +406.2339496728066 + 10 +406.3731235613508 + 20 +406.2339496728066 + 10 +403.8575898942422 + 20 +415.9123839661024 + 10 +378.3575898942422 + 20 +415.9123839661024 + 0 +LWPOLYLINE + 5 +277 +330 +1F +100 +AcDbEntity + 8 +Edges +100 +AcDbPolyline + 90 + 8 + 70 + 1 + 43 +0.0 + 10 +370.5141638132231 + 20 +412.5802389159008 + 10 +354.0141638132231 + 20 +412.5802389159008 + 10 +374.2231830586563 + 20 +476.3255075832949 + 10 +404.2924498794227 + 20 +476.3255075832949 + 10 +427.7879791819437 + 20 +411.7149619827942 + 10 +412.0379791819436 + 20 +411.7149619827942 + 10 +407.8103758232582 + 20 +421.3262766609032 + 10 +374.2231830586563 + 20 +421.3262766609032 + 0 +LWPOLYLINE + 5 +278 +330 +1F +100 +AcDbEntity + 8 +Edges +100 +AcDbPolyline + 90 + 3 + 70 + 1 + 43 +0.0 + 10 +378.5424498794228 + 20 +434.8227874120055 + 10 +390.5433433343426 + 20 +467.8231596706943 + 10 +404.2924498794227 + 20 +434.8227874120055 + 0 +LWPOLYLINE + 5 +279 +330 +1F +100 +AcDbEntity + 8 +Edges +100 +AcDbPolyline + 90 + 3 + 70 + 1 + 43 +0.0 + 10 +386.4303997683616 + 20 +440.301399582092 + 10 +393.9303997683616 + 20 +440.301399582092 + 10 +390.5433433343426 + 20 +451.0407522265979 + 0 +LWPOLYLINE + 5 +27A +330 +1F +100 +AcDbEntity + 8 +Edges +100 +AcDbPolyline + 90 + 13 + 70 + 1 + 43 +0.0 + 10 +276.7290165800682 + 20 +480.1851107579647 + 10 +281.8834201853322 + 20 +462.4176651488165 + 10 +289.3601077158698 + 20 +480.4273609699763 + 10 +316.8601077158698 + 20 +480.4273609699763 + 10 +322.9393873417111 + 20 +462.9547435578417 + 10 +329.3311746192208 + 20 +480.315476704776 + 10 +358.3311746192208 + 20 +480.315476704776 + 10 +333.890557398396 + 20 +405.717177596384 + 10 +312.390557398396 + 20 +405.717177596384 + 10 +302.7103977226141 + 20 +434.3765043269854 + 10 +292.1935166234129 + 20 +405.7470577388087 + 10 +271.4435166234129 + 20 +405.7470577388087 + 10 +247.1518991391009 + 20 +480.1851107579647 + 0 +LWPOLYLINE + 5 +27B +330 +1F +100 +AcDbEntity + 8 +Edges +100 +AcDbPolyline + 90 + 16 + 70 + 1 + 43 +0.0 + 10 +272.0615922397511 + 20 +475.2257648319487 + 10 +281.3064801615718 + 20 +448.0027130685447 + 10 +283.8064801615717 + 20 +448.0027130685447 + 10 +292.939027610243 + 20 +474.9998717541872 + 10 +312.689027610243 + 20 +474.9998717541872 + 10 +321.7986765777879 + 20 +448.5231971954722 + 10 +325.0486765777879 + 20 +448.5231971954722 + 10 +334.171274173759 + 20 +474.9954130661164 + 10 +351.421274173759 + 20 +474.9954130661164 + 10 +328.6205484272979 + 20 +411.7286018185541 + 10 +317.6205484272979 + 20 +411.7286018185541 + 10 +303.967059049975 + 20 +449.5921030806314 + 10 +301.467059049975 + 20 +449.5921030806314 + 10 +288.2290165800682 + 20 +411.8461863270944 + 10 +276.7290165800682 + 20 +411.8461863270944 + 10 +253.8115922397511 + 20 +475.2257648319487 + 0 +LWPOLYLINE + 5 +27C +330 +1F +100 +AcDbEntity + 8 +Edges +100 +AcDbPolyline + 90 + 20 + 70 + 1 + 43 +0.0 + 10 +501.056922959271 + 20 +485.0159707497697 + 10 +501.056922959271 + 20 +558.8726296823118 + 10 +555.1216597004891 + 20 +558.8726296823118 + 10 +560.4561723212043 + 20 +557.7731915429125 + 10 +565.4456106740321 + 20 +555.5888623446763 + 10 +569.8719918260744 + 20 +552.4150729660659 + 10 +573.5419321783338 + 20 +548.3904826845846 + 10 +576.2950961769911 + 20 +543.6909213093676 + 10 +578.0112011928734 + 20 +538.52170737518 + 10 +578.6152725338268 + 20 +533.108678007259 + 10 +578.0809190044363 + 20 +527.6883223520862 + 10 +576.4314859075807 + 20 +522.4974496333681 + 10 +573.7390351144856 + 20 +517.762843224204 + 10 +570.1211967628661 + 20 +513.6913527373569 + 10 +565.7360301289108 + 20 +510.460856999025 + 10 +604.2360301289108 + 20 +510.460856999025 + 10 +604.2360301289108 + 20 +484.4608569990249 + 10 +551.7360301289109 + 20 +484.4608569990249 + 10 +532.556922959271 + 20 +501.2659707497697 + 10 +532.556922959271 + 20 +485.0159707497697 + 0 +LWPOLYLINE + 5 +27D +330 +1F +100 +AcDbEntity + 8 +Edges +100 +AcDbPolyline + 90 + 34 + 70 + 1 + 43 +0.0 + 10 +556.8286692350517 + 20 +553.4449402126937 + 10 +560.6546452623361 + 20 +551.8742411817636 + 10 +564.0786369122555 + 20 +549.5544417963849 + 10 +566.9559708117335 + 20 +546.5835601699926 + 10 +569.1650714304349 + 20 +543.0871244901075 + 10 +570.6125979922569 + 20 +539.2128690958492 + 10 +571.2373883882557 + 20 +535.1244922824686 + 10 +571.0130434494796 + 20 +530.9947395833876 + 10 +569.9490423868453 + 20 +526.9981047807276 + 10 +568.0903422675494 + 20 +523.3034570473639 + 10 +565.5154784512802 + 20 +520.066905744698 + 10 +562.3332462481898 + 20 +517.4252043587091 + 10 +558.6781040080068 + 20 +515.4899722767226 + 10 +558.2536682296717 + 20 +515.2674529028032 + 10 +557.881237440711 + 20 +514.9658639289754 + 10 +557.5753360479661 + 20 +514.596967006222 + 10 +557.3478938821958 + 20 +514.1751487243397 + 10 +557.2077809472948 + 20 +513.7168595501564 + 10 +557.1604614995236 + 20 +513.2399722767226 + 10 +557.2077809472948 + 20 +512.7630850032891 + 10 +557.3478938821958 + 20 +512.3047958291055 + 10 +557.5753360479661 + 20 +511.8829775472234 + 10 +557.881237440711 + 20 +511.5140806244698 + 10 +558.2536682296717 + 20 +511.2124916506422 + 10 +558.6781040080068 + 20 +510.9899722767226 + 10 +562.8716597004892 + 20 +506.3556880111593 + 10 +597.6216597004892 + 20 +506.3556880111593 + 10 +597.6216597004892 + 20 +490.6056880111593 + 10 +555.1216597004891 + 20 +490.6056880111593 + 10 +529.0441780433568 + 20 +513.5736537552545 + 10 +525.2941780433568 + 20 +513.5736537552545 + 10 +525.2941780433568 + 20 +490.6056880111593 + 10 +506.5441780433569 + 20 +490.6056880111593 + 10 +506.0786692350517 + 20 +553.4449402126937 + 0 +LWPOLYLINE + 5 +27E +330 +1F +100 +AcDbEntity + 8 +Edges +100 +AcDbPolyline + 90 + 15 + 70 + 1 + 43 +0.0 + 10 +525.4872067098808 + 20 +541.5841673114092 + 10 +525.4872067098808 + 20 +524.0766831395669 + 10 +546.9800502684734 + 20 +524.0766831395669 + 10 +548.9366466818976 + 20 +524.6876342302821 + 10 +550.7018416676487 + 20 +525.729563893239 + 10 +552.1822076509388 + 20 +527.1473252680083 + 10 +553.2993923790516 + 20 +528.8658796149936 + 10 +553.9942659198374 + 20 +530.7942679375537 + 10 +554.2300502684735 + 20 +532.8304252254882 + 10 +553.9942659198374 + 20 +534.8665825134226 + 10 +553.2993923790516 + 20 +536.7949708359827 + 10 +552.1822076509388 + 20 +538.5135251829678 + 10 +550.7018416676487 + 20 +539.9312865577372 + 10 +548.9366466818976 + 20 +540.9732162206941 + 10 +546.9800502684734 + 20 +541.5841673114092 + 0 +LWPOLYLINE + 5 +27F +330 +1F +100 +AcDbEntity + 8 +Edges +100 +AcDbPolyline + 90 + 15 + 70 + 1 + 43 +0.0 + 10 +532.2300502684734 + 20 +536.2206643947449 + 10 +546.9800502684734 + 20 +536.2206643947449 + 10 +547.4857349105714 + 20 +535.8000494325039 + 10 +547.9182211915849 + 20 +535.304479537888 + 10 +548.2665366148586 + 20 +534.7465276854631 + 10 +548.5218441606189 + 20 +534.1403495261795 + 10 +548.6776664876994 + 20 +533.5013242480426 + 10 +548.7300502684735 + 20 +532.845664394745 + 10 +548.6776664876994 + 20 +532.1900045414471 + 10 +548.5218441606189 + 20 +531.5509792633102 + 10 +548.2665366148586 + 20 +530.9448011040267 + 10 +547.9182211915849 + 20 +530.3868492516019 + 10 +547.4857349105714 + 20 +529.8912793569859 + 10 +546.9800502684734 + 20 +529.4706643947449 + 10 +532.2300502684734 + 20 +529.4706643947449 + 0 +LWPOLYLINE + 5 +280 +330 +1F +100 +AcDbEntity + 8 +Edges +100 +AcDbPolyline + 90 + 8 + 70 + 1 + 43 +0.0 + 10 +469.5487544976409 + 20 +558.5094467805597 + 10 +496.1466161853395 + 20 +483.5907992110656 + 10 +466.3966161853394 + 20 +483.5907992110656 + 10 +463.8810825182309 + 20 +493.2692335043614 + 10 +438.3810825182309 + 20 +493.2692335043614 + 10 +434.5105573621725 + 20 +483.2401989039465 + 10 +406.0105573621725 + 20 +483.2401989039465 + 10 +430.7987544976409 + 20 +558.5094467805597 + 0 +LWPOLYLINE + 5 +281 +330 +1F +100 +AcDbEntity + 8 +Edges +100 +AcDbPolyline + 90 + 8 + 70 + 1 + 43 +0.0 + 10 +464.3159425034114 + 20 +553.6823571215538 + 10 +487.8114718059324 + 20 +489.0718115210532 + 10 +472.0614718059324 + 20 +489.0718115210532 + 10 +467.833868447247 + 20 +498.6831261991621 + 10 +434.2466756826451 + 20 +498.6831261991621 + 10 +430.5376564372117 + 20 +489.9370884541598 + 10 +414.0376564372117 + 20 +489.9370884541598 + 10 +434.2466756826451 + 20 +553.6823571215538 + 0 +LWPOLYLINE + 5 +282 +330 +1F +100 +AcDbEntity + 8 +Edges +100 +AcDbPolyline + 90 + 3 + 70 + 1 + 43 +0.0 + 10 +464.3159425034114 + 20 +512.1796369502646 + 10 +438.5659425034114 + 20 +512.1796369502646 + 10 +450.5668359583313 + 20 +545.1800092089533 + 0 +LWPOLYLINE + 5 +283 +330 +1F +100 +AcDbEntity + 8 +Edges +100 +AcDbPolyline + 90 + 3 + 70 + 1 + 43 +0.0 + 10 +446.4538923923503 + 20 +517.658249120351 + 10 +453.9538923923503 + 20 +517.658249120351 + 10 +450.5668359583313 + 20 +528.3976017648569 + 0 +LWPOLYLINE + 5 +284 +330 +1F +100 +AcDbEntity + 8 +Edges +100 +AcDbPolyline + 90 + 36 + 70 + 1 + 43 +0.0 + 10 +419.327609467706 + 20 +532.7829023880266 + 10 +386.3276094677061 + 20 +532.7829023880266 + 10 +386.3276094677061 + 20 +484.0329023880266 + 10 +357.0776094677061 + 20 +484.0329023880266 + 10 +357.0776094677061 + 20 +532.7829023880266 + 10 +325.0776094677061 + 20 +532.7829023880266 + 10 +340.0168580271829 + 20 +513.3646415885067 + 10 +341.1195945498008 + 20 +510.4324845173024 + 10 +341.7595774337375 + 20 +507.3658911571065 + 10 +341.9216630594496 + 20 +504.2374248909521 + 10 +341.6020160696003 + 20 +501.1211131718827 + 10 +340.8082001233499 + 20 +498.0906958455054 + 10 +339.5589989209806 + 20 +495.2178802780649 + 10 +337.8839717338681 + 20 +492.5706445781389 + 10 +335.8227539570882 + 20 +490.2116290620356 + 10 +333.4241192353609 + 20 +488.1966540249066 + 10 +330.7448253548105 + 20 +486.5733988908705 + 10 +327.8482712096744 + 20 +485.3802739968114 + 10 +324.8029966235355 + 20 +484.6455117063079 + 10 +245.3029966235355 + 20 +484.6455117063079 + 10 +245.3029966235355 + 20 +511.3955117063079 + 10 +303.5529966235355 + 20 +511.3955117063079 + 10 +291.872598440055 + 20 +527.321302056408 + 10 +290.7722486288596 + 20 +530.5737479203392 + 10 +290.1259326171406 + 20 +533.9459058967388 + 10 +289.9457376179441 + 20 +537.374710873267 + 10 +290.2350335854497 + 20 +540.796038341953 + 10 +290.9884101910734 + 20 +544.1459036369908 + 10 +292.1917780058499 + 20 +547.3616585572483 + 10 +293.8226319968133 + 20 +550.3831629946039 + 10 +295.8504724095423 + 20 +553.1539096566615 + 10 +298.2373751656479 + 20 +555.6220808496089 + 10 +300.938701107798 + 20 +557.7415175575733 + 10 +303.9039308281827 + 20 +559.4725826950386 + 10 +307.0776094677061 + 20 +560.7829023880266 + 10 +419.327609467706 + 20 +560.7829023880266 + 0 +LWPOLYLINE + 5 +285 +330 +1F +100 +AcDbEntity + 8 +Edges +100 +AcDbPolyline + 90 + 60 + 70 + 1 + 43 +0.0 + 10 +333.9164753199791 + 20 +509.9057753319951 + 10 +334.1589361522703 + 20 +507.7244328484501 + 10 +334.1303811738793 + 20 +505.5298424768948 + 10 +333.831246827406 + 20 +503.3555469752498 + 10 +333.2661051692574 + 20 +501.2347789087374 + 10 +332.4435939890077 + 20 +499.1999527136833 + 10 +331.3762847869071 + 20 +497.2821692658392 + 10 +330.0804906274146 + 20 +495.5107405255454 + 10 +328.576016805573 + 20 +493.9127415251992 + 10 +326.8858581371155 + 20 +492.5125965465804 + 10 +325.0358474990097 + 20 +491.3317058130199 + 10 +323.0542609922486 + 20 +490.3881184021585 + 10 +251.8042609922485 + 20 +490.3881184021585 + 10 +251.8042609922485 + 20 +505.6381184021586 + 10 +303.3042609922485 + 20 +505.6381184021586 + 10 +304.4920166714415 + 20 +505.7417768021622 + 10 +305.6438597701422 + 20 +506.049617821719 + 10 +306.7249635485413 + 20 +506.5523336834913 + 10 +307.7026401170817 + 20 +507.2347244400766 + 10 +308.5473287764733 + 20 +508.076157554496 + 10 +309.2334898050352 + 20 +509.0511917386296 + 10 +309.7403766691154 + 20 +510.1303461874317 + 10 +310.0526633082913 + 20 +511.280991950618 + 10 +310.1609075289681 + 20 +512.4683384906123 + 10 +310.0618364953634 + 20 +513.6564855975173 + 10 +309.7584456858663 + 20 +514.8095088557644 + 10 +309.2599083227629 + 20 +515.892545842638 + 10 +297.1290811691048 + 20 +530.1895921308778 + 10 +296.6098710841455 + 20 +532.4200397882151 + 10 +296.3413917268492 + 20 +534.6943297211724 + 10 +296.3269597779627 + 20 +536.9843663111195 + 10 +296.5667535236955 + 20 +539.261859411867 + 10 +297.057810653248 + 20 +541.4986738342008 + 10 +297.7940648539494 + 20 +543.6671769161434 + 10 +298.7664207519257 + 20 +545.7405798852055 + 10 +299.962866272513 + 20 +547.6932687955832 + 10 +301.3686210323613 + 20 +549.5011209520408 + 10 +302.9663189300566 + 20 +551.1418029115153 + 10 +304.7362226796138 + 20 +552.5950463810511 + 10 +306.6564676365832 + 20 +553.8428986037435 + 10 +413.2846768558269 + 20 +554.7399697761473 + 10 +413.2846768558269 + 20 +539.2399697761474 + 10 +381.0346768558269 + 20 +539.2399697761474 + 10 +381.0346768558269 + 20 +490.7399697761474 + 10 +362.7846768558269 + 20 +490.7399697761474 + 10 +362.7846768558269 + 20 +539.2399697761474 + 10 +324.2846768558269 + 20 +539.2399697761474 + 10 +323.239552298193 + 20 +539.1441433133219 + 10 +322.2292796883079 + 20 +538.8598594663252 + 10 +321.2875487600456 + 20 +538.3965982973269 + 10 +320.4457635760757 + 20 +537.7698082559286 + 10 +319.7319952912029 + 20 +537.0003910170673 + 10 +319.1700460587565 + 20 +536.114004469279 + 10 +318.7786552961043 + 20 +535.1402070966919 + 10 +318.5708747780894 + 20 +534.11147228719 + 10 +318.5536333972581 + 20 +533.0621054367825 + 10 +318.7275061048918 + 20 +532.0270999616822 + 10 +319.0866947380089 + 20 +531.0409703668588 + 10 +319.6192213716987 + 20 +530.1366012849248 + 10 +333.4067045189287 + 20 +512.0405296541854 + 0 +LWPOLYLINE + 5 +28D +330 +1F +100 +AcDbEntity + 8 +Edges +100 +AcDbPolyline + 90 + 4 + 70 + 1 + 43 +0.0 + 10 +229.3313335795673 + 20 +600.4572153218629 + 10 +620.1148364484866 + 20 +600.4572153218629 + 10 +620.1148364484866 + 20 +364.4239795890357 + 10 +229.3313335795673 + 20 +364.4239795890357 + 0 +ENDSEC + 0 +SECTION + 2 +OBJECTS + 0 +DICTIONARY + 5 +C +330 +0 +100 +AcDbDictionary +281 + 1 + 3 +ACAD_CIP_PREVIOUS_PRODUCT_INFO +350 +271 + 3 +ACAD_COLOR +350 +269 + 3 +ACAD_DETAILVIEWSTYLE +350 +26C + 3 +ACAD_GROUP +350 +D + 3 +ACAD_LAYOUT +350 +1A + 3 +ACAD_MATERIAL +350 +43 + 3 +ACAD_MLEADERSTYLE +350 +5B + 3 +ACAD_MLINESTYLE +350 +17 + 3 +ACAD_PLOTSETTINGS +350 +19 + 3 +ACAD_PLOTSTYLENAME +350 +E + 3 +ACAD_SCALELIST +350 +47 + 3 +ACAD_SECTIONVIEWSTYLE +350 +26A + 3 +ACAD_TABLESTYLE +350 +59 + 3 +ACAD_VISUALSTYLE +350 +2A + 3 +ACDB_RECOMPOSE_DATA +350 +2A2 + 3 +AcDbVariableDictionary +350 +226 + 0 +DICTIONARY + 5 +244 +330 +8 +100 +AcDbDictionary +280 + 1 +281 + 1 + 0 +DICTIONARY + 5 +28E +330 +10 +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ADSK_XREC_LAYER_RECONCILED +360 +28F + 0 +DICTIONARY + 5 +290 +330 +5E +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ADSK_XREC_LAYER_RECONCILED +360 +291 + 0 +DICTIONARY + 5 +22E +330 +1F +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_LAYOUTSELFREF +360 +24F + 0 +DICTIONARY + 5 +230 +330 +1B +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_LAYOUTSELFREF +360 +24E + 0 +DICTIONARY + 5 +232 +330 +23 +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_LAYOUTSELFREF +360 +250 + 0 +XRECORD + 5 +271 +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbXrecord +280 + 1 +300 +ACD +300 +2022 +300 + + 0 +DICTIONARY + 5 +269 +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary +281 + 1 + 0 +DICTIONARY + 5 +26C +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary +281 + 1 + 3 +Imperial24 +350 +26D + 0 +DICTIONARY + 5 +D +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary +281 + 1 + 0 +DICTIONARY + 5 +1A +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary +281 + 1 + 3 +Layout1 +350 +1E + 3 +Layout2 +350 +26 + 3 +Model +350 +22 + 0 +DICTIONARY + 5 +43 +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary +281 + 1 + 3 +ByBlock +350 +45 + 3 +ByLayer +350 +44 + 3 +Global +350 +46 + 0 +DICTIONARY + 5 +5B +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary +281 + 1 + 3 +Standard +350 +5C + 0 +DICTIONARY + 5 +17 +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary +281 + 1 + 3 +Standard +350 +18 + 0 +DICTIONARY + 5 +19 +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary +281 + 1 + 0 +ACDBDICTIONARYWDFLT + 5 +E +102 +{ACAD_XDICTIONARY +360 +24A +102 +} +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary +281 + 1 + 3 +Color_7 +350 +26E + 3 +NORMAL +350 +F +100 +AcDbDictionaryWithDefault +340 +F + 0 +DICTIONARY + 5 +47 +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary +281 + 1 + 3 +A0 +350 +48 + 3 +A1 +350 +49 + 3 +A2 +350 +4A + 3 +A3 +350 +4B + 3 +A4 +350 +4C + 3 +A5 +350 +4D + 3 +A6 +350 +4E + 3 +A7 +350 +4F + 3 +A8 +350 +50 + 3 +A9 +350 +51 + 3 +B1 +350 +52 + 3 +B2 +350 +53 + 3 +B3 +350 +54 + 3 +B4 +350 +55 + 3 +B5 +350 +56 + 3 +B6 +350 +57 + 3 +B7 +350 +58 + 0 +DICTIONARY + 5 +26A +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary +281 + 1 + 3 +Imperial24 +350 +26B + 0 +DICTIONARY + 5 +59 +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary +281 + 1 + 3 +Standard +350 +5A + 0 +DICTIONARY + 5 +2A +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary +281 + 1 + 3 +2dWireframe +350 +2F + 3 +Basic +350 +32 + 3 +Brighten +350 +36 + 3 +ColorChange +350 +3A + 3 +Conceptual +350 +34 + 3 +Dim +350 +35 + 3 +EdgeColorOff +350 +3D + 3 +Facepattern +350 +39 + 3 +Flat +350 +2B + 3 +FlatWithEdges +350 +2C + 3 +Gouraud +350 +2D + 3 +GouraudWithEdges +350 +2E + 3 +Hidden +350 +31 + 3 +JitterOff +350 +3B + 3 +Linepattern +350 +38 + 3 +OverhangOff +350 +3C + 3 +Realistic +350 +33 + 3 +Shaded +350 +42 + 3 +Shaded with edges +350 +41 + 3 +Shades of Gray +350 +3E + 3 +Sketchy +350 +3F + 3 +Thicken +350 +37 + 3 +Wireframe +350 +30 + 3 +X-Ray +350 +40 + 0 +XRECORD + 5 +2A2 +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbXrecord +280 + 1 + 90 + 1 +330 +5A + 0 +DICTIONARY + 5 +226 +102 +{ACAD_REACTORS +330 +C +102 +} +330 +C +100 +AcDbDictionary +281 + 1 + 3 +CANNOSCALE +350 +248 + 3 +CMLEADERSTYLE +350 +228 + 3 +CTABLESTYLE +350 +227 + 3 +CVIEWDETAILSTYLE +350 +29D + 3 +CVIEWSECTIONSTYLE +350 +29E + 3 +DIMASSOC +350 +22B + 3 +HIDETEXT +350 +22C + 3 +MSLTSCALE +350 +249 + 3 +XCLIPFRAME +350 +29F + 0 +XRECORD + 5 +28F +102 +{ACAD_REACTORS +330 +28E +102 +} +330 +28E +100 +AcDbXrecord +280 + 1 +290 + 1 + 0 +XRECORD + 5 +291 +102 +{ACAD_REACTORS +330 +290 +102 +} +330 +290 +100 +AcDbXrecord +280 + 1 +290 + 1 + 0 +XRECORD + 5 +24F +102 +{ACAD_REACTORS +330 +22E +102 +} +330 +22E +100 +AcDbXrecord +280 + 1 +340 +1F + 0 +XRECORD + 5 +24E +102 +{ACAD_REACTORS +330 +230 +102 +} +330 +230 +100 +AcDbXrecord +280 + 1 +340 +1B + 0 +XRECORD + 5 +250 +102 +{ACAD_REACTORS +330 +232 +102 +} +330 +232 +100 +AcDbXrecord +280 + 1 +340 +23 + 0 +ACDBDETAILVIEWSTYLE + 5 +26D +102 +{ACAD_XDICTIONARY +360 +2DB +102 +} +102 +{ACAD_REACTORS +330 +26C +102 +} +330 +26C +100 +AcDbModelDocViewStyle + 70 + 0 + 3 +Imperial24 +290 + 0 +100 +AcDbDetailViewStyle + 70 + 0 + 71 + 0 + 90 + 3 + 71 + 1 +340 +11 + 62 + 256 + 40 +0.24 +340 +0 + 62 + 256 + 40 +0.24 +300 + + 40 +0.36 +280 + 3 + 71 + 2 +340 +16 + 90 + 25 + 62 + 256 + 71 + 3 +340 +11 + 62 + 256 + 40 +0.24 + 90 + 1 + 40 +0.75 + 90 + 1 +300 +%<\AcVar ViewType \f "%tc1">% %<\AcVar ViewDetailId>%\PSCALE %<\AcVar ViewScale \f "%sn">% + 71 + 4 +340 +16 + 90 + 25 + 62 + 256 +340 +16 + 90 + 25 + 62 + 256 +280 + 0 + 0 +LAYOUT + 5 +1E +102 +{ACAD_REACTORS +330 +1A +102 +} +330 +1A +100 +AcDbPlotSettings + 1 + + 2 +none_device + 4 + + 6 + + 40 +0.0 + 41 +0.0 + 42 +0.0 + 43 +0.0 + 44 +0.0 + 45 +0.0 + 46 +0.0 + 47 +0.0 + 48 +0.0 + 49 +0.0 +140 +0.0 +141 +0.0 +142 +1.0 +143 +1.0 + 70 + 688 + 72 + 0 + 73 + 0 + 74 + 5 + 7 + + 75 + 16 +147 +1.0 + 76 + 0 + 77 + 2 + 78 + 300 +148 +0.0 +149 +0.0 +100 +AcDbLayout + 1 +Layout1 + 70 + 1 + 71 + 1 + 10 +0.0 + 20 +0.0 + 11 +12.0 + 21 +9.0 + 12 +0.0 + 22 +0.0 + 32 +0.0 + 14 +1.000000000000000E+20 + 24 +1.000000000000000E+20 + 34 +1.000000000000000E+20 + 15 +-1.000000000000000E+20 + 25 +-1.000000000000000E+20 + 35 +-1.000000000000000E+20 +146 +0.0 + 13 +0.0 + 23 +0.0 + 33 +0.0 + 16 +1.0 + 26 +0.0 + 36 +0.0 + 17 +0.0 + 27 +1.0 + 37 +0.0 + 76 + 0 +330 +1B + 0 +LAYOUT + 5 +26 +102 +{ACAD_REACTORS +330 +1A +102 +} +330 +1A +100 +AcDbPlotSettings + 1 + + 2 +none_device + 4 + + 6 + + 40 +0.0 + 41 +0.0 + 42 +0.0 + 43 +0.0 + 44 +0.0 + 45 +0.0 + 46 +0.0 + 47 +0.0 + 48 +0.0 + 49 +0.0 +140 +0.0 +141 +0.0 +142 +1.0 +143 +1.0 + 70 + 688 + 72 + 0 + 73 + 0 + 74 + 5 + 7 + + 75 + 16 +147 +1.0 + 76 + 0 + 77 + 2 + 78 + 300 +148 +0.0 +149 +0.0 +100 +AcDbLayout + 1 +Layout2 + 70 + 1 + 71 + 2 + 10 +0.0 + 20 +0.0 + 11 +0.0 + 21 +0.0 + 12 +0.0 + 22 +0.0 + 32 +0.0 + 14 +0.0 + 24 +0.0 + 34 +0.0 + 15 +0.0 + 25 +0.0 + 35 +0.0 +146 +0.0 + 13 +0.0 + 23 +0.0 + 33 +0.0 + 16 +1.0 + 26 +0.0 + 36 +0.0 + 17 +0.0 + 27 +1.0 + 37 +0.0 + 76 + 0 +330 +23 + 0 +LAYOUT + 5 +22 +102 +{ACAD_REACTORS +330 +1A +102 +} +330 +1A +100 +AcDbPlotSettings + 1 + + 2 +none_device + 4 +Letter_(8.50_x_11.00_Inches) + 6 + + 40 +6.349999999999999 + 41 +6.349999999999999 + 42 +6.350005079999999 + 43 +6.350005079999999 + 44 +215.9 + 45 +279.4 + 46 +0.0 + 47 +0.0 + 48 +0.0 + 49 +0.0 +140 +0.0 +141 +0.0 +142 +1.0 +143 +1.0 + 70 + 1712 + 72 + 0 + 73 + 0 + 74 + 0 + 7 + + 75 + 0 +147 +1.0 + 76 + 0 + 77 + 2 + 78 + 300 +148 +0.0 +149 +0.0 +100 +AcDbLayout + 1 +Model + 70 + 1 + 71 + 0 + 10 +0.0 + 20 +0.0 + 11 +12.0 + 21 +9.0 + 12 +0.0 + 22 +0.0 + 32 +0.0 + 14 +1.000000000000000E+20 + 24 +1.000000000000000E+20 + 34 +1.000000000000000E+20 + 15 +-1.000000000000000E+20 + 25 +-1.000000000000000E+20 + 35 +-1.000000000000000E+20 +146 +0.0 + 13 +0.0 + 23 +0.0 + 33 +0.0 + 16 +1.0 + 26 +0.0 + 36 +0.0 + 17 +0.0 + 27 +1.0 + 37 +0.0 + 76 + 0 +330 +1F +331 +29 + 0 +MATERIAL + 5 +45 +102 +{ACAD_XDICTIONARY +360 +2D5 +102 +} +102 +{ACAD_REACTORS +330 +43 +102 +} +330 +43 +100 +AcDbMaterial + 1 +BYBLOCK + 73 + 1 + 78 + 1 +172 + 1 +176 + 1 +270 + 1 +274 + 1 + 0 +MATERIAL + 5 +44 +102 +{ACAD_XDICTIONARY +360 +2D3 +102 +} +102 +{ACAD_REACTORS +330 +43 +102 +} +330 +43 +100 +AcDbMaterial + 1 +BYLAYER + 73 + 1 + 78 + 1 +172 + 1 +176 + 1 +270 + 1 +274 + 1 + 0 +MATERIAL + 5 +46 +102 +{ACAD_XDICTIONARY +360 +29B +102 +} +102 +{ACAD_REACTORS +330 +43 +102 +} +330 +43 +100 +AcDbMaterial + 1 +GLOBAL + 73 + 1 + 78 + 1 +172 + 1 +176 + 1 +270 + 1 +274 + 1 + 0 +MLEADERSTYLE + 5 +5C +102 +{ACAD_REACTORS +330 +5B +102 +} +330 +5B +100 +AcDbMLeaderStyle +170 + 2 +171 + 1 +172 + 0 + 90 + 2 + 40 +0.0 + 41 +0.0 +173 + 1 + 91 +-1056964608 +340 +14 + 92 + -2 +290 + 1 + 42 +0.09 +291 + 1 + 43 +0.36 + 3 +Standard + 44 +0.18 +300 + +342 +11 +174 + 1 +178 + 6 +175 + 1 +176 + 0 + 93 +-1056964608 + 45 +0.18 +292 + 0 +297 + 0 + 46 +0.18 + 94 +-1056964608 + 47 +1.0 + 49 +1.0 +140 +1.0 +293 + 1 +141 +0.0 +294 + 1 +177 + 0 +142 +1.0 +295 + 0 +296 + 0 +143 +0.125 +1001 +ACAD_MLEADERVER +1070 + 2 + 0 +MLINESTYLE + 5 +18 +102 +{ACAD_REACTORS +330 +17 +102 +} +330 +17 +100 +AcDbMlineStyle + 2 +STANDARD + 70 + 0 + 3 + + 62 + 256 + 51 +90.0 + 52 +90.0 + 71 + 2 + 49 +0.5 + 62 + 256 + 6 +BYLAYER + 49 +-0.5 + 62 + 256 + 6 +BYLAYER + 0 +DICTIONARY + 5 +24A +330 +E +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +24B + 0 +ACDBPLACEHOLDER + 5 +26E +102 +{ACAD_REACTORS +330 +E +102 +} +330 +E + 0 +ACDBPLACEHOLDER + 5 +F +102 +{ACAD_REACTORS +330 +E +102 +} +330 +E + 0 +SCALE + 5 +48 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbScale + 70 + 0 +300 +1:1 +140 +1.0 +141 +1.0 +290 + 1 + 0 +SCALE + 5 +49 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbScale + 70 + 0 +300 +1/128" = 1'-0" +140 +0.0078125 +141 +12.0 +290 + 0 + 0 +SCALE + 5 +4A +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbScale + 70 + 0 +300 +1/64" = 1'-0" +140 +0.015625 +141 +12.0 +290 + 0 + 0 +SCALE + 5 +4B +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbScale + 70 + 0 +300 +1/32" = 1'-0" +140 +0.03125 +141 +12.0 +290 + 0 + 0 +SCALE + 5 +4C +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbScale + 70 + 0 +300 +1/16" = 1'-0" +140 +0.0625 +141 +12.0 +290 + 0 + 0 +SCALE + 5 +4D +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbScale + 70 + 0 +300 +3/32" = 1'-0" +140 +0.09375 +141 +12.0 +290 + 0 + 0 +SCALE + 5 +4E +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbScale + 70 + 0 +300 +1/8" = 1'-0" +140 +0.125 +141 +12.0 +290 + 0 + 0 +SCALE + 5 +4F +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbScale + 70 + 0 +300 +3/16" = 1'-0" +140 +0.1875 +141 +12.0 +290 + 0 + 0 +SCALE + 5 +50 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbScale + 70 + 0 +300 +1/4" = 1'-0" +140 +0.25 +141 +12.0 +290 + 0 + 0 +SCALE + 5 +51 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbScale + 70 + 0 +300 +3/8" = 1'-0" +140 +0.375 +141 +12.0 +290 + 0 + 0 +SCALE + 5 +52 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbScale + 70 + 0 +300 +1/2" = 1'-0" +140 +0.5 +141 +12.0 +290 + 0 + 0 +SCALE + 5 +53 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbScale + 70 + 0 +300 +3/4" = 1'-0" +140 +0.75 +141 +12.0 +290 + 0 + 0 +SCALE + 5 +54 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbScale + 70 + 0 +300 +1" = 1'-0" +140 +1.0 +141 +12.0 +290 + 0 + 0 +SCALE + 5 +55 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbScale + 70 + 0 +300 +1-1/2" = 1'-0" +140 +1.5 +141 +12.0 +290 + 0 + 0 +SCALE + 5 +56 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbScale + 70 + 0 +300 +3" = 1'-0" +140 +3.0 +141 +12.0 +290 + 0 + 0 +SCALE + 5 +57 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbScale + 70 + 0 +300 +6" = 1'-0" +140 +6.0 +141 +12.0 +290 + 0 + 0 +SCALE + 5 +58 +102 +{ACAD_REACTORS +330 +47 +102 +} +330 +47 +100 +AcDbScale + 70 + 0 +300 +1'-0" = 1'-0" +140 +12.0 +141 +12.0 +290 + 0 + 0 +ACDBSECTIONVIEWSTYLE + 5 +26B +102 +{ACAD_XDICTIONARY +360 +2D9 +102 +} +102 +{ACAD_REACTORS +330 +26A +102 +} +330 +26A +100 +AcDbModelDocViewStyle + 70 + 0 + 3 +Imperial24 +290 + 0 +100 +AcDbSectionViewStyle + 70 + 0 + 71 + 0 + 90 + 78 + 71 + 1 +340 +11 + 62 + 256 + 40 +0.24 +340 +0 +340 +0 + 62 + 256 + 40 +0.24 +300 +I, O, Q, S, X, Z + 40 +0.48 + 90 + 3 + 40 +0.18 + 90 + 1 + 71 + 2 +340 +16 + 90 + 25 + 62 + 256 +340 +16 + 90 + 50 + 62 + 256 + 40 +0.24 + 40 +0.0 + 40 +0.24 + 71 + 3 +340 +11 + 62 + 256 + 40 +0.24 + 90 + 1 + 40 +0.75 + 90 + 1 +300 +%<\AcVar ViewType \f "%tc1">% %<\AcVar ViewSectionStartId>%-%<\AcVar ViewSectionEndId>%\PSCALE %<\AcVar ViewScale \f "%sn">% + 71 + 4 + 62 + 256 + 62 + 257 +300 +ANSI31 + 40 +1.0 + 90 + 0 +290 + 0 +290 + 0 + 90 + 6 + 40 +0.0 + 40 +1.570796326794896 + 40 +0.2617993877991494 + 40 +1.308996938995747 + 40 +-0.2617993877991494 + 40 +1.832595714594046 + 0 +TABLESTYLE + 5 +5A +102 +{ACAD_XDICTIONARY +360 +25D +102 +} +102 +{ACAD_REACTORS +330 +59 +102 +} +330 +59 +100 +AcDbTableStyle + 3 +Standard + 70 + 0 + 71 + 0 + 40 +0.06 + 41 +0.06 +280 + 0 +281 + 0 + 7 +Standard +140 +0.18 +170 + 2 + 62 + 0 + 63 + 7 +283 + 0 +274 + -2 +284 + 1 + 64 + 0 +275 + -2 +285 + 1 + 65 + 0 +276 + -2 +286 + 1 + 66 + 0 +277 + -2 +287 + 1 + 67 + 0 +278 + -2 +288 + 1 + 68 + 0 +279 + -2 +289 + 1 + 69 + 0 + 7 +Standard +140 +0.25 +170 + 5 + 62 + 0 + 63 + 7 +283 + 0 +274 + -2 +284 + 1 + 64 + 0 +275 + -2 +285 + 1 + 65 + 0 +276 + -2 +286 + 1 + 66 + 0 +277 + -2 +287 + 1 + 67 + 0 +278 + -2 +288 + 1 + 68 + 0 +279 + -2 +289 + 1 + 69 + 0 + 7 +Standard +140 +0.18 +170 + 5 + 62 + 0 + 63 + 7 +283 + 0 +274 + -2 +284 + 1 + 64 + 0 +275 + -2 +285 + 1 + 65 + 0 +276 + -2 +286 + 1 + 66 + 0 +277 + -2 +287 + 1 + 67 + 0 +278 + -2 +288 + 1 + 68 + 0 +279 + -2 +289 + 1 + 69 + 0 + 0 +VISUALSTYLE + 5 +2F +102 +{ACAD_XDICTIONARY +360 +2AB +102 +} +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +2dWireframe + 70 + 4 + 71 + 0 + 72 + 2 + 73 + 0 + 90 + 0 + 40 +-0.6 + 41 +-30.0 + 62 + 5 + 63 + 7 + 74 + 1 + 91 + 4 + 64 + 7 + 65 + 257 + 75 + 1 +175 + 1 + 42 +1.0 + 92 + 0 + 66 + 257 + 43 +1.0 + 76 + 1 + 77 + 6 + 78 + 2 + 67 + 7 + 79 + 5 +170 + 0 +171 + 0 +290 + 0 +174 + 0 + 93 + 1 + 44 +0.0 +173 + 0 +291 + 0 + 45 +0.0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +32 +102 +{ACAD_XDICTIONARY +360 +2B1 +102 +} +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Basic + 70 + 7 + 71 + 1 + 72 + 0 + 73 + 1 + 90 + 0 + 40 +-0.6 + 41 +-30.0 + 62 + 5 + 63 + 7 + 74 + 0 + 91 + 4 + 64 + 7 + 65 + 257 + 75 + 1 +175 + 1 + 42 +1.0 + 92 + 8 + 66 + 7 + 43 +1.0 + 76 + 1 + 77 + 6 + 78 + 2 + 67 + 7 + 79 + 5 +170 + 0 +171 + 0 +290 + 0 +174 + 0 + 93 + 1 + 44 +0.0 +173 + 0 +291 + 1 + 45 +0.0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +36 +102 +{ACAD_XDICTIONARY +360 +2B9 +102 +} +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Brighten + 70 + 12 + 71 + 2 + 72 + 2 + 73 + 0 + 90 + 0 + 40 +-0.6 + 41 +-30.0 + 62 + 5 + 63 + 7 + 74 + 1 + 91 + 4 + 64 + 7 + 65 + 257 + 75 + 1 +175 + 1 + 42 +1.0 + 92 + 8 + 66 + 7 + 43 +1.0 + 76 + 1 + 77 + 6 + 78 + 2 + 67 + 7 + 79 + 5 +170 + 0 +171 + 0 +290 + 0 +174 + 0 + 93 + 1 + 44 +50.0 +173 + 0 +291 + 1 + 45 +0.0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +3A +102 +{ACAD_XDICTIONARY +360 +2C1 +102 +} +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +ColorChange + 70 + 16 + 71 + 2 + 72 + 2 + 73 + 3 + 90 + 0 + 40 +-0.6 + 41 +-30.0 + 62 + 5 + 63 + 8 + 74 + 1 + 91 + 4 + 64 + 7 + 65 + 257 + 75 + 1 +175 + 1 + 42 +1.0 + 92 + 8 + 66 + 8 + 43 +1.0 + 76 + 1 + 77 + 6 + 78 + 2 + 67 + 7 + 79 + 5 +170 + 0 +171 + 0 +290 + 0 +174 + 0 + 93 + 1 + 44 +0.0 +173 + 0 +291 + 1 + 45 +0.0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +34 +102 +{ACAD_XDICTIONARY +360 +2B5 +102 +} +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Conceptual + 70 + 9 + 71 + 3 + 72 + 2 + 73 + 0 + 90 + 0 + 40 +-0.6 + 41 +-30.0 + 62 + 5 + 63 + 7 + 74 + 2 + 91 + 2 + 64 + 7 + 65 + 257 + 75 + 1 +175 + 1 + 42 +179.0 + 92 + 8 + 66 + 7 + 43 +1.0 + 76 + 1 + 77 + 6 + 78 + 2 + 67 + 7 + 79 + 3 +170 + 0 +171 + 0 +290 + 0 +174 + 0 + 93 + 1 + 44 +0.0 +173 + 0 +291 + 0 + 45 +0.0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +35 +102 +{ACAD_XDICTIONARY +360 +2B7 +102 +} +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Dim + 70 + 11 + 71 + 2 + 72 + 2 + 73 + 0 + 90 + 0 + 40 +-0.6 + 41 +-30.0 + 62 + 5 + 63 + 7 + 74 + 1 + 91 + 4 + 64 + 7 + 65 + 257 + 75 + 1 +175 + 1 + 42 +1.0 + 92 + 8 + 66 + 7 + 43 +1.0 + 76 + 1 + 77 + 6 + 78 + 2 + 67 + 7 + 79 + 5 +170 + 0 +171 + 0 +290 + 0 +174 + 0 + 93 + 1 + 44 +-50.0 +173 + 0 +291 + 1 + 45 +0.0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +3D +102 +{ACAD_XDICTIONARY +360 +2C7 +102 +} +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +EdgeColorOff + 70 + 22 + 71 + 2 + 72 + 2 + 73 + 0 + 90 + 0 + 40 +-0.6 + 41 +-30.0 + 62 + 5 + 63 + 7 + 74 + 1 + 91 + 4 + 64 + 7 + 65 + 257 + 75 + 1 +175 + 1 + 42 +1.0 + 92 + 8 + 66 + 7 + 43 +1.0 + 76 + 1 + 77 + 6 + 78 + 2 + 67 + 7 + 79 + 5 +170 + 0 +171 + 0 +290 + 0 +174 + 0 + 93 + 1 + 44 +0.0 +173 + 0 +291 + 1 + 45 +0.0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +39 +102 +{ACAD_XDICTIONARY +360 +2BF +102 +} +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Facepattern + 70 + 15 + 71 + 2 + 72 + 2 + 73 + 0 + 90 + 0 + 40 +-0.6 + 41 +-30.0 + 62 + 5 + 63 + 7 + 74 + 1 + 91 + 4 + 64 + 7 + 65 + 257 + 75 + 1 +175 + 1 + 42 +1.0 + 92 + 8 + 66 + 7 + 43 +1.0 + 76 + 1 + 77 + 6 + 78 + 2 + 67 + 7 + 79 + 5 +170 + 0 +171 + 0 +290 + 0 +174 + 0 + 93 + 1 + 44 +0.0 +173 + 0 +291 + 1 + 45 +0.0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +2B +102 +{ACAD_XDICTIONARY +360 +2A3 +102 +} +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Flat + 70 + 0 + 71 + 2 + 72 + 1 + 73 + 1 + 90 + 2 + 40 +-0.6 + 41 +30.0 + 62 + 5 + 63 + 7 + 74 + 0 + 91 + 0 + 64 + 7 + 65 + 257 + 75 + 1 +175 + 1 + 42 +1.0 + 92 + 8 + 66 + 7 + 43 +1.0 + 76 + 1 + 77 + 6 + 78 + 2 + 67 + 7 + 79 + 5 +170 + 0 +171 + 0 +290 + 0 +174 + 0 + 93 + 13 + 44 +0.0 +173 + 0 +291 + 1 + 45 +0.0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +2C +102 +{ACAD_XDICTIONARY +360 +2A5 +102 +} +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +FlatWithEdges + 70 + 1 + 71 + 2 + 72 + 1 + 73 + 1 + 90 + 2 + 40 +-0.6 + 41 +30.0 + 62 + 5 + 63 + 7 + 74 + 1 + 91 + 0 + 64 + 7 + 65 + 257 + 75 + 1 +175 + 1 + 42 +1.0 + 92 + 0 + 66 + 257 + 43 +1.0 + 76 + 1 + 77 + 6 + 78 + 2 + 67 + 7 + 79 + 5 +170 + 0 +171 + 0 +290 + 0 +174 + 0 + 93 + 13 + 44 +0.0 +173 + 0 +291 + 1 + 45 +0.0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +2D +102 +{ACAD_XDICTIONARY +360 +2A7 +102 +} +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Gouraud + 70 + 2 + 71 + 2 + 72 + 2 + 73 + 1 + 90 + 2 + 40 +-0.6 + 41 +30.0 + 62 + 5 + 63 + 7 + 74 + 0 + 91 + 0 + 64 + 7 + 65 + 257 + 75 + 1 +175 + 1 + 42 +1.0 + 92 + 0 + 66 + 7 + 43 +1.0 + 76 + 1 + 77 + 6 + 78 + 2 + 67 + 7 + 79 + 5 +170 + 0 +171 + 0 +290 + 0 +174 + 0 + 93 + 13 + 44 +0.0 +173 + 0 +291 + 1 + 45 +0.0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +2E +102 +{ACAD_XDICTIONARY +360 +2A9 +102 +} +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +GouraudWithEdges + 70 + 3 + 71 + 2 + 72 + 2 + 73 + 1 + 90 + 2 + 40 +-0.6 + 41 +30.0 + 62 + 5 + 63 + 7 + 74 + 1 + 91 + 0 + 64 + 7 + 65 + 257 + 75 + 1 +175 + 1 + 42 +1.0 + 92 + 0 + 66 + 257 + 43 +1.0 + 76 + 1 + 77 + 6 + 78 + 2 + 67 + 7 + 79 + 5 +170 + 0 +171 + 0 +290 + 0 +174 + 0 + 93 + 13 + 44 +0.0 +173 + 0 +291 + 1 + 45 +0.0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +31 +102 +{ACAD_XDICTIONARY +360 +2AF +102 +} +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Hidden + 70 + 6 + 71 + 1 + 72 + 2 + 73 + 2 + 90 + 0 + 40 +-0.6 + 41 +-30.0 + 62 + 5 + 63 + 7 + 74 + 2 + 91 + 2 + 64 + 7 + 65 + 257 + 75 + 2 +175 + 1 + 42 +40.0 + 92 + 0 + 66 + 257 + 43 +1.0 + 76 + 1 + 77 + 6 + 78 + 2 + 67 + 7 + 79 + 3 +170 + 0 +171 + 0 +290 + 0 +174 + 0 + 93 + 1 + 44 +0.0 +173 + 0 +291 + 0 + 45 +0.0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +3B +102 +{ACAD_XDICTIONARY +360 +2C3 +102 +} +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +JitterOff + 70 + 20 + 71 + 2 + 72 + 2 + 73 + 0 + 90 + 0 + 40 +-0.6 + 41 +-30.0 + 62 + 5 + 63 + 7 + 74 + 1 + 91 + 4 + 64 + 7 + 65 + 257 + 75 + 1 +175 + 1 + 42 +1.0 + 92 + 10 + 66 + 7 + 43 +1.0 + 76 + 1 + 77 + 6 + 78 + 2 + 67 + 7 + 79 + 5 +170 + 0 +171 + 0 +290 + 0 +174 + 0 + 93 + 1 + 44 +0.0 +173 + 0 +291 + 1 + 45 +0.0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +38 +102 +{ACAD_XDICTIONARY +360 +2BD +102 +} +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Linepattern + 70 + 14 + 71 + 2 + 72 + 2 + 73 + 0 + 90 + 0 + 40 +-0.6 + 41 +-30.0 + 62 + 5 + 63 + 7 + 74 + 1 + 91 + 4 + 64 + 7 + 65 + 257 + 75 + 7 +175 + 7 + 42 +1.0 + 92 + 8 + 66 + 7 + 43 +1.0 + 76 + 1 + 77 + 6 + 78 + 2 + 67 + 7 + 79 + 5 +170 + 0 +171 + 0 +290 + 0 +174 + 0 + 93 + 1 + 44 +0.0 +173 + 0 +291 + 1 + 45 +0.0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +3C +102 +{ACAD_XDICTIONARY +360 +2C5 +102 +} +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +OverhangOff + 70 + 21 + 71 + 2 + 72 + 2 + 73 + 0 + 90 + 0 + 40 +-0.6 + 41 +-30.0 + 62 + 5 + 63 + 7 + 74 + 1 + 91 + 4 + 64 + 7 + 65 + 257 + 75 + 1 +175 + 1 + 42 +1.0 + 92 + 9 + 66 + 7 + 43 +1.0 + 76 + 1 + 77 + 6 + 78 + 2 + 67 + 7 + 79 + 5 +170 + 0 +171 + 0 +290 + 0 +174 + 0 + 93 + 1 + 44 +0.0 +173 + 0 +291 + 1 + 45 +0.0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +33 +102 +{ACAD_XDICTIONARY +360 +2B3 +102 +} +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Realistic + 70 + 8 + 71 + 2 + 72 + 3 + 73 + 0 + 90 + 2 + 40 +-0.6 + 41 +30.0 + 62 + 5 + 63 + 7 + 74 + 0 + 91 + 0 + 64 + 7 + 65 + 257 + 75 + 1 +175 + 1 + 42 +1.0 + 92 + 8 + 66 + 257 + 43 +1.0 + 76 + 1 + 77 + 6 + 78 + 2 + 67 + 7 + 79 + 3 +170 + 0 +171 + 0 +290 + 0 +174 + 0 + 93 + 13 + 44 +0.0 +173 + 0 +291 + 0 + 45 +0.0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +42 +102 +{ACAD_XDICTIONARY +360 +2D1 +102 +} +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Shaded + 70 + 27 + 71 + 2 + 72 + 2 + 73 + 1 + 90 + 2 + 40 +-0.6 + 41 +30.0 + 62 + 5 + 63 + 7 + 74 + 0 + 91 + 4 + 64 + 7 + 65 + 257 + 75 + 1 +175 + 1 + 42 +1.0 + 92 + 8 + 66 + 257 + 43 +1.0 + 76 + 1 + 77 + 6 + 78 + 2 + 67 + 8 + 79 + 3 +170 + 0 +171 + 0 +290 + 0 +174 + 0 + 93 + 5 + 44 +0.0 +173 + 0 +291 + 0 + 45 +0.0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +41 +102 +{ACAD_XDICTIONARY +360 +2CF +102 +} +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Shaded with edges + 70 + 26 + 71 + 2 + 72 + 2 + 73 + 1 + 90 + 2 + 40 +-0.6 + 41 +30.0 + 62 + 5 + 63 + 7 + 74 + 1 + 91 + 2 + 64 + 7 + 65 + 257 + 75 + 2 +175 + 1 + 42 +1.0 + 92 + 8 + 66 + 257 + 43 +1.0 + 76 + 1 + 77 + 6 + 78 + 2 + 67 + 7 + 79 + 3 +170 + 0 +171 + 0 +290 + 0 +174 + 0 + 93 + 5 + 44 +0.0 +173 + 0 +291 + 0 + 45 +0.0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +3E +102 +{ACAD_XDICTIONARY +360 +2C9 +102 +} +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Shades of Gray + 70 + 23 + 71 + 2 + 72 + 2 + 73 + 3 + 90 + 0 + 40 +-0.6 + 41 +-30.0 + 62 + 5 + 63 + 7 + 74 + 2 + 91 + 2 + 64 + 7 + 65 + 7 + 75 + 1 +175 + 1 + 42 +40.0 + 92 + 8 + 66 + 7 + 43 +1.0 + 76 + 1 + 77 + 6 + 78 + 2 + 67 + 7 + 79 + 3 +170 + 0 +171 + 0 +290 + 0 +174 + 0 + 93 + 1 + 44 +0.0 +173 + 0 +291 + 0 + 45 +0.0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +3F +102 +{ACAD_XDICTIONARY +360 +2CB +102 +} +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Sketchy + 70 + 24 + 71 + 1 + 72 + 2 + 73 + 2 + 90 + 0 + 40 +-0.6 + 41 +-30.0 + 62 + 5 + 63 + 7 + 74 + 2 + 91 + 2 + 64 + 7 + 65 + 7 + 75 + 1 +175 + 1 + 42 +40.0 + 92 + 11 + 66 + 7 + 43 +1.0 + 76 + 1 + 77 + 6 + 78 + 2 + 67 + 7 + 79 + 6 +170 + 0 +171 + 0 +290 + 0 +174 + 0 + 93 + 1 + 44 +0.0 +173 + 0 +291 + 0 + 45 +0.0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +37 +102 +{ACAD_XDICTIONARY +360 +2BB +102 +} +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Thicken + 70 + 13 + 71 + 2 + 72 + 2 + 73 + 0 + 90 + 0 + 40 +-0.6 + 41 +-30.0 + 62 + 5 + 63 + 7 + 74 + 1 + 91 + 4 + 64 + 7 + 65 + 257 + 75 + 1 +175 + 1 + 42 +1.0 + 92 + 12 + 66 + 7 + 43 +1.0 + 76 + 1 + 77 + 6 + 78 + 2 + 67 + 7 + 79 + 5 +170 + 0 +171 + 0 +290 + 0 +174 + 0 + 93 + 1 + 44 +0.0 +173 + 0 +291 + 1 + 45 +0.0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +30 +102 +{ACAD_XDICTIONARY +360 +2AD +102 +} +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +Wireframe + 70 + 5 + 71 + 0 + 72 + 2 + 73 + 0 + 90 + 0 + 40 +-0.6 + 41 +-30.0 + 62 + 5 + 63 + 7 + 74 + 1 + 91 + 4 + 64 + 7 + 65 + 257 + 75 + 1 +175 + 1 + 42 +1.0 + 92 + 0 + 66 + 257 + 43 +1.0 + 76 + 1 + 77 + 6 + 78 + 2 + 67 + 7 + 79 + 3 +170 + 0 +171 + 0 +290 + 0 +174 + 0 + 93 + 1 + 44 +0.0 +173 + 0 +291 + 0 + 45 +0.0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +VISUALSTYLE + 5 +40 +102 +{ACAD_XDICTIONARY +360 +2CD +102 +} +102 +{ACAD_REACTORS +330 +2A +102 +} +330 +2A +100 +AcDbVisualStyle + 2 +X-Ray + 70 + 25 + 71 + 2 + 72 + 2 + 73 + 1 + 90 + 1 + 40 +0.5 + 41 +-30.0 + 62 + 5 + 63 + 7 + 74 + 1 + 91 + 0 + 64 + 7 + 65 + 257 + 75 + 1 +175 + 1 + 42 +1.0 + 92 + 8 + 66 + 7 + 43 +1.0 + 76 + 1 + 77 + 6 + 78 + 2 + 67 + 7 + 79 + 3 +170 + 0 +171 + 0 +290 + 0 +174 + 0 + 93 + 13 + 44 +0.0 +173 + 0 +291 + 0 + 45 +0.0 +1001 +ACAD +1000 +AcDbSavedByObjectVersion +1070 + 0 + 0 +DICTIONARYVAR + 5 +248 +102 +{ACAD_REACTORS +330 +226 +102 +} +330 +226 +100 +DictionaryVariables +280 + 0 + 1 +1:1 + 0 +DICTIONARYVAR + 5 +228 +102 +{ACAD_REACTORS +330 +226 +102 +} +330 +226 +100 +DictionaryVariables +280 + 0 + 1 +STANDARD + 0 +DICTIONARYVAR + 5 +227 +102 +{ACAD_REACTORS +330 +226 +102 +} +330 +226 +100 +DictionaryVariables +280 + 0 + 1 +STANDARD + 0 +DICTIONARYVAR + 5 +29D +102 +{ACAD_REACTORS +330 +226 +102 +} +330 +226 +100 +DictionaryVariables +280 + 0 + 1 +Imperial24 + 0 +DICTIONARYVAR + 5 +29E +102 +{ACAD_REACTORS +330 +226 +102 +} +330 +226 +100 +DictionaryVariables +280 + 0 + 1 +Imperial24 + 0 +DICTIONARYVAR + 5 +22B +102 +{ACAD_REACTORS +330 +226 +102 +} +330 +226 +100 +DictionaryVariables +280 + 0 + 1 +2 + 0 +DICTIONARYVAR + 5 +22C +102 +{ACAD_REACTORS +330 +226 +102 +} +330 +226 +100 +DictionaryVariables +280 + 0 + 1 +1 + 0 +DICTIONARYVAR + 5 +249 +102 +{ACAD_REACTORS +330 +226 +102 +} +330 +226 +100 +DictionaryVariables +280 + 0 + 1 +1 + 0 +DICTIONARYVAR + 5 +29F +102 +{ACAD_REACTORS +330 +226 +102 +} +330 +226 +100 +DictionaryVariables +280 + 0 + 1 +2 + 0 +DICTIONARY + 5 +2DB +330 +26D +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2DC + 0 +DICTIONARY + 5 +2D5 +330 +45 +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2D6 + 0 +DICTIONARY + 5 +2D3 +330 +44 +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2D4 + 0 +DICTIONARY + 5 +29B +330 +46 +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2D7 + 3 +FBXASSET +360 +29C + 0 +XRECORD + 5 +24B +102 +{ACAD_REACTORS +330 +24A +102 +} +330 +24A +100 +AcDbXrecord +280 + 1 +102 +EXTNAMES + 1 +NORMAL + 2 +Normal + 0 +DICTIONARY + 5 +2D9 +330 +26B +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2DA + 0 +DICTIONARY + 5 +25D +330 +5A +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_ROUNDTRIP_2008_TABLESTYLE_CELLSTYLEMAP +360 +2A1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2D8 + 0 +DICTIONARY + 5 +2AB +330 +2F +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2AC + 0 +DICTIONARY + 5 +2B1 +330 +32 +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2B2 + 0 +DICTIONARY + 5 +2B9 +330 +36 +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2BA + 0 +DICTIONARY + 5 +2C1 +330 +3A +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2C2 + 0 +DICTIONARY + 5 +2B5 +330 +34 +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2B6 + 0 +DICTIONARY + 5 +2B7 +330 +35 +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2B8 + 0 +DICTIONARY + 5 +2C7 +330 +3D +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2C8 + 0 +DICTIONARY + 5 +2BF +330 +39 +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2C0 + 0 +DICTIONARY + 5 +2A3 +330 +2B +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2A4 + 0 +DICTIONARY + 5 +2A5 +330 +2C +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2A6 + 0 +DICTIONARY + 5 +2A7 +330 +2D +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2A8 + 0 +DICTIONARY + 5 +2A9 +330 +2E +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2AA + 0 +DICTIONARY + 5 +2AF +330 +31 +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2B0 + 0 +DICTIONARY + 5 +2C3 +330 +3B +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2C4 + 0 +DICTIONARY + 5 +2BD +330 +38 +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2BE + 0 +DICTIONARY + 5 +2C5 +330 +3C +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2C6 + 0 +DICTIONARY + 5 +2B3 +330 +33 +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2B4 + 0 +DICTIONARY + 5 +2D1 +330 +42 +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2D2 + 0 +DICTIONARY + 5 +2CF +330 +41 +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2D0 + 0 +DICTIONARY + 5 +2C9 +330 +3E +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2CA + 0 +DICTIONARY + 5 +2CB +330 +3F +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2CC + 0 +DICTIONARY + 5 +2BB +330 +37 +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2BC + 0 +DICTIONARY + 5 +2AD +330 +30 +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2AE + 0 +DICTIONARY + 5 +2CD +330 +40 +100 +AcDbDictionary +280 + 1 +281 + 1 + 3 +ACAD_XREC_ROUNDTRIP +360 +2CE + 0 +XRECORD + 5 +2DC +102 +{ACAD_REACTORS +330 +2DB +102 +} +330 +2DB +100 +AcDbXrecord +280 + 1 +102 +DISPLAYNAME + 1 +Imperial24 +102 +FLAGS + 90 + 0 + 0 +XRECORD + 5 +2D6 +102 +{ACAD_REACTORS +330 +2D5 +102 +} +330 +2D5 +100 +AcDbXrecord +280 + 1 +102 +MATERIAL +148 +0.0 +149 +0.0 +149 +0.0 + 93 + 0 + 94 + 127 +282 + 0 + 72 + 1 + 77 + 1 +171 + 1 +175 + 1 +179 + 1 +273 + 0 + 0 +XRECORD + 5 +2D4 +102 +{ACAD_REACTORS +330 +2D3 +102 +} +330 +2D3 +100 +AcDbXrecord +280 + 1 +102 +MATERIAL +148 +0.0 +149 +0.0 +149 +0.0 + 93 + 0 + 94 + 127 +282 + 0 + 72 + 1 + 77 + 1 +171 + 1 +175 + 1 +179 + 1 +273 + 0 + 0 +XRECORD + 5 +2D7 +102 +{ACAD_REACTORS +330 +29B +102 +} +330 +29B +100 +AcDbXrecord +280 + 1 +102 +MATERIAL +148 +0.0 +149 +0.0 +149 +0.0 + 93 + 0 + 94 + 127 +282 + 0 + 72 + 1 + 77 + 1 +171 + 1 +175 + 1 +179 + 1 +273 + 0 + 0 +XRECORD + 5 +29C +102 +{ACAD_REACTORS +330 +29B +102 +} +330 +29B +100 +AcDbXrecord +280 + 1 + 70 + 1 + 90 +-1625056298 + 71 + 1 + 1 +2DFC261B-F45F-4FD0-9066-D5FBAABF7738 +311 +504B030414000608080051A1A558F87EDA772A010000A80100004F00000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F4173736574446174612F446566696E6974696F6E4974657261746F7250726F706572746965732E62696E3550BB4EC33014350C2006A422F5033AB09A +311 +3CDC38361242715CB31451C1078009A68D94A6559D08B175A9C467F049FC04032C30011B5C2BC6D2F1B98FE37B8FFC8410FAF50742B40558C3BD0F7C666AB32A8BAB6266E61AEDB8CAF84264E3438888A4B9548CE288708E8722E398255C6046D298B191923917DBA0DB054873AFDBAA7123CF4B5B98AAD2B559B4F6000A7E +311 +C760AE1BD8A5AB23F7680F21476B00FA6F583769DA3972261F00FA6E797CAAAD35CD49104694C88CC598468482A1748445A41456220E9394A47996F0E0D2D845BB2A8C0D62A9F2984602AB61A2F050C910F390522C1325B24CA834252C6866ADFB9ABEB3715BEBB20AC2C05BB85ED6D33E98ECBD6D1E1D3FBF761C7E757CE3 +311 +EBE8BDCB271F5EE779ED7513DF7FF1F9E0BBD3F57E3AFEF4FA3F504B030414000608080051A1A5581999830046010000300200004500000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F4173736574446174612F496E7374616E636550726F706572746965732E62696EEB60 +311 +6060F80F0540260323103700495E20ED9E9A975A94991C9C9C919A9BA802143072717336323374D275333175D335717331D0B5343033D37531757372747472333737B6604768046931363471713532B5D435353131D635313332D475727372D13534373670367376B67474B5042A03DBCBA019D37FE8ABC6157B20CD04146B +311 +0062181F4C03F940F0C11EA29A8141C08141002C0426541C106CAC2CA046088033B02A030AC2157C6006F21A8018AAF50194E6010A610250382264E08660284CD9E98021862280A91564B406929A0FF62C401E28B6F88038B83CB1243943D7A928312F25350524737EFD5C3EC6FFCFCE06D8474F3CAAD8A731F3942867BB48 +311 +4B37CB9FA7A91E2DAB3F3C0DF9289FA378DD36366AED35EFEAC9EA77D77673D7D6E6E6B2B3B327EFE1B7B378F1DA59E0F5EBEEC37737BB3F7E5C1DE1B4B3C6CF65C131032700504B030414000608080051A1A558B5A795FFE3790000DE7900006B00000030313633444138322D363133362D344237452D423146462D464232 +311 +3035373337434135392F5265736F75726365732F32444643323631422D463435462D344644302D393036362D4435464241414246373733382F7468756D626E61696C2F302F67656E657269635F706E6701DE79218689504E470D0A1A0A0000000D49484452000001000000010008030000006BAC58540000000467414D4100 +311 +00B18F0BFC6105000000017352474200AECE1CE900000192504C5445818181B3B3B35A5A5A4848486060605C5C5C6464648383835E5E5E6262624E4E4EAFAFAF4A4A4AB5B5B54C4C4CB1B1B1858585B7B7B7585858ADADAD7C7C7C464646787878ABABAB747474A7A7A7686868707070B9B9B96E6E6E6A6A6A8B8B8B666666 +311 +545454565656A5A5A5505050A1A1A1BBBBBB8F8F8F9F9F9F4242425252527676764040403E3E3E9B9B9B7A7A7A8989897E7E7E9393939797974444448787873C3C3C727272BDBDBD3A3A3A6C6C6CA9A9A9A3A3A32020209D9D9DBFBFBF8D8D8D9595959191912626269999992222222424241E1E1EC1C1C1282828C3C3C32C +311 +2C2C2A2A2A2E2E2E303030C5C5C53232321C1C1C363636383838343434C7C7C71A1A1A0E0E0E121212484A484C4E4C1616160A0A0A4A4C4A787A781414147C7E7C9193915E605E464846838583878987B1B3B18587856668665A5C5A626462818381A7A7A5A3A3A1B1B1AFADAFAD7072705C5E5C9D9D9BABADAB7E817EB7B9 +311 +B7585A58BBBDBB4C4C4A8D8F8D747674B5B5B3B7B7B59FA19F606260ABABA9A5A5A39B9B99A9A9A78F8F8D6C6C6AC7C7C5451AD12700002000494441547801DCBD89771BD7B5A70B8EE04C702641712605CE034890E220088028C93245451215B713AF388E7DFD9EEDB8DDCE6ABFF4B57D97137BE50FEFEFDBA74049B6AEED +311 +74869B7E87404D2814EBB7F76F0F67A8835CEEBFA0E42B854AA5B2BB5B6BCC951A8D52A93657A914FE0BEEE39FFE2FF395B9B9C6CAD2D4C4606F4B7FFF8D1B37EEDCB97587F7CD9B4343BD134BABE7DB48E3FFA7A228ECD6F6574E4786C0FC8B5FFCE2CD5FFCE297BF7CF3CD5FFC92B52FFE58BFF9E69B776E0EF5F79E55CB +311 +BBF9FC3F5D3DFFB07F5898ABAF7CDA3B74E74EC0CE20230561BF096E97E05712BFFCC59BC80539DCE83DDD6E54FE61B7747DE17FB8980BBBFB2BBD4337DF487881AAE6C5ACC6AF25207877B2B527BFF1CB3B77FA47561ABBD7F7FA7FE146A5B6BD74E3164C7F51449AE95DB412200EC539418717E7F2F11B376FF62E95FEAF +311 +1442BED0581DBCA1BD2780D23F506AFA16E1A7AD974EF17876F00DD7BCB187A1A97AE51FCED5BF2BC1F2BBE5B3C19BE27B43CF26DE00933658FE129B109C2FFF922CC22C4260FA01BEFB462A77DEBC35F42F600C3F5B0795D2E9E02DAD5E650B4438A92801B65C35CBAB7B1EE5041CE69D3B6F1822DFB873EBD6AD3B6FBC71 +311 +EBC6C86AE967DFC2DFA4CEBFF1BF54F6276EBC114E2F43FEC60B01A0D440A868B2920E5C4BC10D60931ADCB871F3268B21D3851B08E1D6AD9BFD4BF57F7577909FAB86F29B982571136AF01DF5FE32AC3BD9406CAAF2440A54CF176EDD01FBADA1FEFEFE21FE4C9858DFF4183458A9FD2B6708A5A5A137E0EE1D11A9EC0C7C +311 +58B2C73C0AD6B479BD76B7790CF899E287FA5B06FB7B07C9195B7851FA8794031EF1FC5F9406BBFB23375420286399B631E93B08022A785C4DBF9996EC3551874094D71B6F487E80F6837E50F483BDBDBD83232323AC420A18C68DA196EDDADF68A77F938F78FD972BABBDB7B87FB164AC6FC2CB760365821ACB74AED44FFA +311 +D7E7431ECD7E08AC421F391D199998989A383D9D98E8E56F84A318C58D9BFD2DAB73FF5222C8EFAEF4DE7AF30D756E5108683DA471E70D0502099A7240F19E4089D3FD203E620F1B47BF43501E85031AE44B4B9F2E4D2D9D4D51D8970983FA861B3706FF950CA170DE82F6B312CC4F42C8966295F7D725ED29882415DC055F +311 +36DEA1FE96FEC141493F05FAA9A9A5A595B333DED5B3D5A533F62183323032F46EFF13EA0AAFA5FBF7C8976F8C10F7280A014832593B90004D52341980D907EAEB73411EB2F1EBC9F507F92746C40E7AE0AFAE54292BAB2BAB67CAE0746264A277B06508168C94BF772BE9765F7BF0B548FE1E07F3B5A521340A5CB5297C4B +311 +12811B89E82191ECF3E41B3259C529F135E23CF4C7F961FB13537F5A02ECCAEA76B5BA5D3D3FDF3F2FEFEFB3AA22053E5008833428DC6C59FA2F770595F311F235D427F379BB8A121BD901B96076A388DC4C3C61C7933CCCD770FF375A6E0CE9F535FE2534BF5ADD3E3FAFD71BF57AA951B6D4CFEBFB8864758A2615443008 +311 +0B06ABFF557610ECC93726224F155D1471041E0D42F82F4891C926C1355B0831649FF365F46FF05300A7A790BD8ADEEB0D4AA9569A9BDBADCCD56AA55AE377F5F3F3EA2A34983A1DE91D810543138D7F28E57FF4E2B5335A3928B76EA1CB9B00BF158C8F63A2E788826896D0B5E7C461949ECE089144F8EBEFC7FB4D8C9C4E +311 +9DAD60F7FBE572B416C2F2423ECF8B86C439E450DA970634ACFDA977629098D0B2FAF313A36B3869E37AF7853378CDA1171FBEBA95DF1E44FD5144A420588641B0055A79ED91CC0DC41E27064512FB33F1F04D09D0D2DF0203A646A6CECE80DF28356A348CED8C4F1EF137B9319E1BCD29867CA556AA97F7B757567006A447 +311 +FD375A26CAAFDED9CFDCFB2BB0BEEE8AA5911BC2C7F85DF88A3775389990AA72219D582409210F85A4E66F2987D875C30848023088FDF77E87F96FD7CBA5B9DCCEF4F4C9FC7C676777577B7B7B67E7ECCCE4E8DEE85E81A6D55AA3BC7FBEB242589CE8ED4770E785D7DDE23FF2587EBF57F50B9E820527316488E5C32D50F9 +311 +79BCA58207297E2B6D658702FFCD211840FE43FC9F3A5BAD9E97E6F21B9FCF16BBBB3A3A5A175B5B1787875B5B3B86DFEFFC687A72674F19D46A8DFDF3EACA59E405375ACE76FFA922C817CE86A89BDD92F400F2C55B7462F610459837D3A61ACF50C7471C8F2F2A9D38C3DA2F068007F80EFCDBFBE5DCC674B1D83EBCBEB8 +311 +BCBCBC3ED0D3D333D0B3DE33BCBEB0D8DA35FBF9F8CECE68AE020BCE61C112A4C1138CD47F9AD13F7DC6AB9CF9CFCFAF9D0E01FFE6CD503F5B91C5218E2899CA15098714848B04FCE5654884ABF0E554F11F6C21D73D5D5AADD64B7B9327DDAD8B0B7D7D6D6D07070763BC0F3E38E8EB4310EBEB8BC3DDB347E3E37B5842B9 +311 +7C4E44A0C630427E5CFDFB71E03F471E12CA9FF70E055AE141042DD81234B879EB4606361D9328149037D7D76A571A7E974FA20AD0323832713AB5BA7ABE3B3E3D3FBC30307070B0B9B645D93C3CDC3CDCA41CFC6AAC2D64D0D579B4B1B397A7C1BDBEBD7D36657A3CD4B2F44F4909F2B9CA597F4245C59DEC354316F05870 +311 +20D0C661742BC02869435FD12CF195C422DB3C5A3E2305C000CE6B7B27ED8B7D63079B5B5B878787C787C7C7C757C76C51B60ED60EDAFA06D67B965B3B672677080BB5329E60E9B477847AE2E9EB53E35779FD37EFCD2D0DDD68AA355B6B0D81860502B8B68C801F5C697E9AD62F4B406244CB975560BAC756AAA577675B07 +311 +C6D03778C17E7C95CAF1B3ABABE3E3ADADE3CDB1B1B6B681014470343EBA979F8B90383545727C63E43549D14FD0F927E5F1FDEFD7263058FE02EBCD1BDCBCA053496BD58E69BC44F9F854D4D979AE9ADB908824382AC1D4014E9756EAF9CE85B6B54DB01F02F8EA5908E0D9D5F1B3E72188C3C3AB67879B07C8A0A767B8B8 +311 +31FE5E7EB754DEAE5261460243FFF07858D8EF0D658BDC563A2C5EF5833C13C90B69248C4DD97842B61DFA7F210A2F6108A0F96B62E2D3B3F3DD939EA47E30ABF5AB2B903F4BE5F9B36757CF65021E616DAC6F60A1FB647274B4B05B2E5341B082D43278F67D8DFDA48AFF9A13F22B34C7586C9992BA6E66CABC190E313E7C +311 +811AA57304B421A75B289B9D174CC868C24548823E230B9A5A2DCD2CAFE1F98E61C015CA7E96B083FC59F3ED06EE60F360B3AD6F79787ED278D0A86FAFE00BA9220EAEFE1D5DE1F7855939C3FCC1332426B377F692406E022C010DB437EF009803F0DCFD3B7C94440571D8F2C328F115F47FD324802070BAB43FBA80EFDB92 +311 +FCA1F7E7CF9FA875CBB327CF9EB08C4DE4815BC4210E2CB7CF1CEDECEDCED5B757490968286899FAF95583BF46F9393CEE6A86D6F618CAAD9BFF0BE22B042412C5CFB50556815CC5BBE33E9F61ECEC26A9BCB8145FD10590078F9C9E953B513FAE1FE387FAC246E14F9E3CE7F5F8194BD6594140876B6B84C5D6799C61A164 +311 +34201E5237582AFD75C07EEED9863F463284E2E13425A036BD41061259289B6BDC1ED656FC8B8592C9D00701E27CEA749F0D8EF44EAD8C1F80FFF8F8F9D513191F6803384C800097F24069C407CFAE88136B7DCB3D5D4A60B711F19070D83235F77331FD35E715966889038E2E0B346EAB7936C4162043E1A1F14409369544 +311 +3A570144898BC4079CEF1912809A3035A1D3F361235F90FFF1E3E0FB93C7E2750719F88E7D8E68123883ADB5B18185AE99F1D11C1238A792DC4BEDE8EC6FF503DF377E0445F68FAF4E08D43082D02170F30131A154206CC559A8D9CFDD762B31273E4947A581E0D9BB71E33FFA07CD02CE2A6BE1EC80167497F2A81CFA3F7E +311 +FE58D0CF5D5D170DE4F89070B0BC4040CC17BEAC6B0586C3D3FF0309BC06F44B04A1E13729929B4DF73C44070692C810B08AC3012E8EE9EAE22067796288C193B2139B970B86F47FAD0F98382B1E035D9C32FD318A4FAFCB274F2E1FA772F94411B0CD42493C23393A685B5FEF3E1ACF554AF5F3552A478383374E6B2FDDFC +311 +4F6DFE38F4F4ED7A7FE838F488EA852482F412D3CB07E293D02C9F074F12E84C5AAC423271450572A385449844706475FD38DC3C22486A0639E5F1E38B0CFE93CB4B25910EF309A2224BD8DAD40C682C28341AD69047E8539A6AFC14EC573F7FAD10AE0FE6EB13E87B28E093B513B5803514DE408809BC12A14876DE0A25F6 +311 +43009E9176D9F0C330164285A7444DC8CAF0E9FE41429EE0A2F6A6DE91C0856C501272404A8468822E24C807030B1D33D40D4AFBDBABB411D093D88C86D7205E05FC57EDD1F805FA4CED5920F0CED39157E007CE21757C5DE440ECBCB46CD283E378029B43FB077B4F47E60E9F61E8D01BE017D7E843EB49F50A2028F1E442 +311 +FCC90C9EE308E4C0C2C94EAE30B75FAD3A0EAFA57FE9EF960F14BE15638840EAF3BA490BB6850EDB38EECAFD21A0C746D0C4234DBD035EFC7EDD121FA585FAB73DB89FE6A03CF833AB0730E5E2F1A36CE3F202A128934B44E396961121E1F2C9F32BFCC0C140CFE22C1CA8E109B182919696BFB98120234F61B59F7BF46EC3 +311 +0CF067B21A33B0FB3E402448EE266CCD93135A8E823DB31F85E677434E608F53F8100BC0098EA2FD6BC01770E0F2F2D1E5452A711C4BB8486248FAD756D852026B6DC90A2AA5C6B69E9068B8F27AFABFFEE8AB36F1D23985D5960014FD711940800B560250D2272CC54FF1D3A660B275AC3881E349689C1616E1E9044129D0 +311 +32313509DE4700BC867C71F128C400159407C761022BA8A040F40A244788808C60B3AD67A17576279F6F946923191921B0545FC2F12AC0EFEFBD7262B6935679FC7F80629160ABFAEC88E8430E76D82A8DE62ACE50BD4A42FBF03B387B37FD321B37E31C3F063D99703F5160E6C9E5A300CF32A91E0A085A29C0FC507F6C21 +311 +012303C6104B82C1F1E156DB3229D1A855A32A8352C9077AF733A0AFE0FB3EF81FDF2F0F82C21B0EB06998866878B103305E31EC17F4FD43831E570A2118D1667632D4FFFFB125782F96168A833DBE78C3F11F8383A79D49F58F1E3DBC780417AE6581381E8610604888E2913E12492881274822C221AD04CB0B1D273B8542 +311 +837460898C686864FF6F801E8269F40AD0481DFAF5E6E9C1F3BE391C325004DF0746A4E4448F7B52C0D5EAD39EC46896B888C4210D68E99DFA2820DF7FF850EC407EB55C3EBC5028611409BFCB8889C90F1C52355AEF98B18100094C9D0EF6F64FD47E5CBF3FF5293DDFB4B50DDD54F351446FA1F14580DC3902C085F593CB +311 +24ACC917B213BBC11B3F0A61042FD8B24F4FB9C4556D0CB9E1A880DE89934CE9607F18F81FDD950DD0E1D143F41D56110E227C250621FF098838042BC85B5B6BCBCBC31DD37B34966E9FFD9936A2FEFEA9EBA4182E5CD3E17AE35501FCE0707E5525A7DBC64DFD077825BE37CE0BBE1BBEC061410C660B6E49912665E2B374 +311 +9C7C9F93834022F74CDE6CA5EB501D9CBC04B768292C5CCB84478F3CA83074092C6082169015E5800D5839DC6C1B58EFE83ECA513BDE3EFB8EF1242D2D4B3FD55AFE03D42F8492AF8A3F21444FA2FA9ABBF525EAF84C09F0168527B0138A85D1EC0443C467B28BF844EAF76323BE13D7C11F72FED783837B970FEFDE7D7817 +311 +E077C17EF7E2A1C2C0FE851FE4C008388C15E818958746129E1009D054B67530D6B3D8DA3D59D82D9D57CF70039FF50FFE0DE94089DB269C3655A4F25B38C49D0BD48E59F1526887C18FC5272197F85CA72862A593A4843CD25F920487DDF7AA0441A2C0600D062001F103FCEEA3D8560CEC3EBACB01CAE5A51E420349F602 +311 +191E5F901893142381351CE17047E764BE50DEAF9E4D8C38B6ECFFACEB141E54A6865A88A60133EE9CBB4C256930B0B168C1C3AB59FE1743FB422C7166082E934AFA5EFA3E4BCE0B69362FA7041818B7FDECE1DDFB4D022007CA23E521F0700AAEB5888BBBF08023E128B4045381542FA256B0D04E28A0C3804E233A1BFB47 +311 +6A2F48FD135BAF9843BEDA3264EB42BA499601F16B566E72C7EA35908ABCB9176BBED43204C696AFD3D7B24B08D3AFA44BE243D88A6D9D0B6562B52F741E1610C0EFBBAF2B0829289A640EC4C8A4FF66A24430786CEBE1E1E61AF9507BFB496EAEB64F8F49B4129EBDEC065EC1F8A3F228A3CD0950883B41BEC6D1944AE061 +311 +47289600A7726313AC69A3F91197F1438BCB743E76F01F6EF1D1C854071670FFFE43FF1EDED702EE5A14C85D0C42DF90B86068800659AC88981855E3E774A71C0CAC2F76754EE7CC87C808D1E1E0F6CF47FD4224731337BE1E39C5010823EE997B1491BBD99FC8D8EF77482BEB5EB2CF66499A8E0F7511B19B3EFBDACB6507 +311 +BC78731B1B383D02FFDD7BE8DD9256F7D0BA7B46015941097B80018F700FFA024CC08078F51806100ADBFA163ABA8A3B95B9D2F92AC30BC908ED31FABE0CBEBFFF0279B675868F9AA24E9530B08C174055B7F48E4F58002F3E82F0BDFA003E8B431EB6C4A91E4D9B5FFB791265BA8827BBE5F1BCFA7F789F72F75EC800F8AE +311 +43FFAEC42F13009FB905A9A0132015D0068ED7682AC608BA6771038DEDB3B33082891FAB1ABF5614F93238079726B833958796B845B731FCB86316713C1DC581B1E19B424EE32674093F80776F7E27C6FBFAC85C536CD955B96EDA2A3FBF770FF4BE11845470EB3E42D022000E0FE07D161811020742162444668308801E13 +311 +3A4C163BE68F6826A5523071CA78B2FED51F28F8C70FE4190073A3E5D3259D7A288CD19BDE623F10021BAB0C6E327FD507B2741627727EA00D31856492F9F009D7F152D930704E642795C1C1B336E0DEBB7F0FDCB79318543B25341F36802D64A981A690B94259607DE0B19D466BF8C1C5E1CEF9A3FC5C639FD6117B4BAEAB +311 +453F8EFBDA500A67E8BAF76C8A06566E36EE1184E8329419161F83D843D5DE7D8221163E145F56921C3EE383978072129E290A9B7166E63D26BAB1FCDBF710009E4051842390031845F20077CD079407C575F20364C4910ED2A574BC357630B0BCD8DE39335EB175646A698458F6A346F003A93002E846FFE0C459B8006E50 +311 +6D79BF902908A0AA05CB5E73530E33BA1D3C2EF99C712B7C8B41DF4D2A7830BE8707485FCFAEEB85A09AB6D39BBF7B4F23E00509C20DB04E240822A4B810E04D8D53D10D504C059ED86BB8697F514777717A8F8144D48A4C89077F7EDB00E2D89DC02A7B975640A282C49A4AA84B70B12BFED8EA6584860DFB7EE23FCB00C6 +311 +BAF7332FF259FA3C9346508813E372F1DDE425065BB61FDF8300F7EEDDBE8D0C6EDF46F7D8823478590AE23759D60DA6B7A9F125EDE8F4A5D2B37470D0B63C30DCDE3D3D59A8D1501EB1B0A5377517BDD6E301F995E3F955F0F58FAC2E81CE172A8344AC03DC6781939D2484B8FFC15E8F3ACCD3954CE19576B942D0A02918 +311 +8EC7013FE59AE90B71292DE774F1F63D60230180B30A2EDC65291B6211B4081128856001A680015CE000708254891851D4B3BED0FA4D7166B466BFF1D2A924885AD12B387FC0FCE6819AC3AE06A7AA4B715F0927B74D119D4A668FB54B8A8C268D8B038A207D10A7B1E95E42195B695BE0240F7408B311257C23F581E987C1 +311 +80140C584A02B1670CB817CEC0A080F259F1360E58452013200E3EC107AC1DF4FD7B0F6D23F33347F9527D9F51E6138E31AF35F1BDAAEEEBA3D71BB402E2FB47CECEE96B4DB85536772B07C82A34F3E66D0BCEC207FEB9E70643761276F7B50D5EE963CFF80C7AF4A2130F5BF8C4EBFB5F07B709840480DBD8007FB7EF3F90 +311 +104908BA457D43AA2A6A02C91422285E5AAC143F3313A0CB74D9D164933B86C25587134E8D342B453FC982860D09FD13ABE72055ED020E85D3E312F74C25CB0293D978A1C4001927C80B86FD06349126EC219F0C735C8053D8F5F310817EA01F1B7851F406144C211C6362C27DD51F1E310C0102280ADB891E9B085CC528A2 +311 +B1369A46BA195B9A2B351862CE43174BA73FB7CBB430A5798F4C54B7333B96C3224A9863AD02B9FBD8E63092191924E77C199D92887DA594B6DCF0112857162FD0949FE6A441F5E62E42FB2105BC405A2301A3424601DC807912CB2C39C604A27908021CDA30C4C8C2019A883B3A8BD393BB3546136EAF561980FB63E9E035 +311 +FF73B96D09A905ACB2C11D79571C5159026227DDBDB81396EB03F14100BEB66DE1FA9EF82C3ECCBE318119C4269FD014E66361FC8BB0B4EA9A98EF3D8848A01360430284335004C183CC25BCA82D2302EB03B8419241C64DF4F5ADAF77B533BE786334BFCBB8DA72BDBEFFC36103AFB30608A0B39B58D93F0BF42180841DD2 +311 +6BDC22CF0A770E90240006BAC65197D90920131C7B2EB3CFD3C71C6378A305EE8488FC1FF8D391E2BDDB0F6E3F45E7C8207C419800DB410073A3173942CA8D5242642A74496FF115832A6314D9FA4257577BF7FCF8F8E8CEE8DEDE5EBE76DD3CF892BA7FB8B90F629431B5525E92A15A3A4A6FEA3FDD731361720609592065 +311 +91F4C927196CF645AA285CF3014630121754261C0D31E1A7E3DA2DBDB54B04703BDE3A4209F02045C4BB0F529A14BED07098A2A1CD47513DA64B512F409BC01663090796D787173B5AA141B1B39BB470EEBCF1E30F9D263ACC4D05110797CEF7B923B027F089F74D1D06F0A4D8C0CDA6604023FCA45B76C5CDE0BF3845ECBE +311 +13E0C0ED73700A8A753C1AC8AEFFF1B407FC8A20F42F0D94019121DE304077A027D4112283BB8FF0072444D68AAD111D6F591BC0061854BBC048EBBE9E81F6A33A95C21BFD13AF3C7E7DCDFFEB0DE8903F77B41DF178E99C289895B0EA8CD640549D68935BA7C5294E0A1D66DA0CC419BD398E6265789CA1241441AC94532A +311 +3C19C95340BEFC68703077EFC1D307B71F3C500859C11494838E902203A2BE90EACC5135B80B078804340C920C2300BCC06F7A1C71B875DC572C9BD1D84BD5FB9363CA6BA7D03E5C40FDFC54FC23C9B4B9DDD028787D89219038523BF64E638BB37CC25335937A00DFD32869C5B390C8C32FF25C8C47A7181B4A599A224A9D +311 +ADB0E0406FEFF9F183B7448F081E3C55024FB33828784AB61704482CD0160C04174F9E33BA9291D58C2F1F1B1B3B5863B0D9F3E51C35C253D54A23E560E2C0CB3A6F7A81382601C2079CAE96B7B1560D20A341E85A928A4E01083256420576C2ED477E2E565FD9223BCC691CF394D3D8E281501E0EE5C1C8159E92585D255C +311 +F30CC854C75318006EA4A01028EC853F9407C6053910BE105348324002260254886C156260F9189EE0F8C9A3CBAE9D5A992184568A69D5183A7DB97DB089FDC57AEE54F858FE54F577DBA85309640290F2D220952620750C5811FB772A7876D1E4040FBFC6474D51246D8B3FB378283FB514F8AB3C20B8BF7DBE5DE541C9A5 +311 +D3D38DDB30E00151E02523081BC89C2214103E0BC1B3D0199A08E002681A2613A2616CEDF0F0F9C5DDC75DA395C25C0309C03DEC8091A4AFD3FEB504AAC6633930556DAC86EE3561941E862C4A75DD6B6BB3A0C59BE153DFA73EDFCBC3CE2188D3D378FC976D0EF9A95B7C8532F527CE3CF539581E0FE501291E9139FFB65E +311 +FF5DBD8E0C18DE3077170A64E033FD278F18068028802F156C3809FDEB11B1019C208D020C9BA2870457F0F8E1FDC7EDD393E3B9FC9C4308E9315704233F960E554802C14716B0B45DAB5EAB5E25AB7830EBB8D25E6CA94E4AA01794FB1EE164FE9F040FE82C940A4BCEF913075D087E85A7237D3CF29C47E4E67677777952 +311 +8C4781761F0BFBC1D3A77880E40C9A2E5109180D5255317890394229F0F082010354082D574F1E3FBAB7D6553C2113DACB97BEB5526C7C6F69F9310A94C46CD89FF8F379AD1AA035FD00FF3F320180F01417A6F255A3A8D86319FE0C0B0E06A0DCD33F79841339C01E5BBE1911AFCFF7C1E0A540BFBDBFCF2372352686D863 +311 +F83F59CB6865F43104007EE06F52406F680341102048A01BB048823082CBCB0B6AC48C313F3E7CFEF8F2D1FDC3D6F6F9F9D9E98D9D7CAE5EADE2A6512FAD7AB526E17F600C85550DDE9ACFE9D97E694513103BC69F8A2813176032C890C1E9C49FC09C61670FF8705B1D7386260E7C8E7122C7F8208A55139E8C8D4763F7EB +311 +F5728DF9C34677364E3A3F9AEFDEC9CD95470788834F9FBEC512379890B38C94205B2557987C4186DF5C0837608DF0F9F3CB87B7EF6E920475752A01460E556919B2B64296FB9FB70DD5F47232A0F77465BF140CD001F00ADCA175090E2665A14E6329B62660E02A1CB50C6025E3DA252A670B3F0FFAA5EAD94A509FE7036B +311 +159E0D1D9F2E76B7AE1FD5A606198D3A747AF450023CBDFD162278B9446688111009B4029B0F2180AE20A542D40610C073B47FEFE1416B2B12200F3C991C2F54EC2491027A816B0A34A9D05C6F437AC23462385DADD75642EDDA738AF1600DBE07EE8437804D2D011A94DF71C2085EDD40266A407FFA1D1C00B0C03927E603 +311 +38E3B9D8C47D1F8CAED578E06F7CFAA4BB63B175FA7C301B747CB377F45192003CB8FD34B12009224543D8604494011A80C1903CE0518C986208E1C5FDDB8FDA161686873BBABABAE74FA637BEA894A44078C19696F326E057D7F95D061A6B0394A9D5F2DCAAFE4C2388D8A6E9AB7695CB0BDD0A332430F1A9333DA41D1FFB +311 +97FA09AE84E738C75C407C260408F8DBD5EDED7DE1570A7BE333C54F16963B46AB0C2B71208EA3D16EF4EEDCD7005241166C005A73C03164792151205C007288AE337B4D7103741BDE7B7AC913350B348B2D767515674EC6F72A0402BBCB41C81305AFCF05F2758D3ECAC8D26AB97606DB9581A4B7A8FFB068CD5C0604E684 +311 +9046B70C2B60FF0CDDF93C13822B4E82FA0479A68220E66D9FD775FB3C1A9CDBDB9829B6AF2F77EC9E0678FB20ED8D1B1A1A39D10F9812E20D6281F5673121AACAA9C53424000DAC173F7E18C3052EEE3E78E7F1160F5AAEAFB70E0F7775CFCE4EF384DDEEBEB9C0889D5243BDF557559FEDE5F17AB21E118C4C31A3DF6A96 +311 +B56AC62180293910ECD6B721047664BCFCC6B2DD3C65CA0F0C823DFEF84083C7ECCDF05898EEF158F4FEF97EB9C123F1B9D1D1A3D9F9AEC5F5CEDA84A3C96C14A55584D62893D6A54D8D2028D05C8B1F124884543F3223B29D208B04910D3FC43F5C52196AEB5B5F5E58E8E82610F08C21BD443801233C0CE8BD1E40F84A1C +311 +A86001990048031ABBAB11EF83F9283EA89F181F2A0D9A9F62D94B7F625FD727E6A93F63F200F614F7CF100D4511C07DB45FC5F0CB4CA359ABE4774631FDAE85E599EA0878A3C33D5AD6430CF4C055EE5FDB80629000D7855DED3F436F3B61B3DC7FFACEFD2B1BC6FB0696312CFA477CE87A87070C7998E04FBA78AE3F915A +311 +065E819FCF35B410321D9ABB308146A11AD5196CDDD7C477A171C8AFC74B45CBC6F641AB53C8D4ADA5870C02379BC0470CF83DB55F073E29CF5CE5F7A3F8FD62EB7AEB1774C2C6780B9523F9287193FD23DDB79FBEA513B45200E2E0C1B51350163AC19043C600F2C1DBF7DEBA7BB9B5457BC0D840CF325EB0BBABBB786D30 +311 +1437000020004944415472B491ABCCEDAFC0591201CAC8EBFACBF367FE7B6E40E69F551BBBE7123E3C00AC560CE20C62436E8C3C54CC225EE08C0D74CE26148877689EDD004FB2BFBFFFBB984035373A7954EC5EE8591FE531348654514DB1D1C56411DFA2A7C212BE5ED91278F2851A432244C6822C29C85A8B320ADCBDFD +311 +D63BF71FD32648E7D098CD018BC35D7FE89E250EF2AC75F96C15271602687965C844B8807C6E7729D93F22E81D39ABD62A0820C1FE9F11CFA7208125D33E96FD69E83AF6052DD32D49FF0802CD9F9DFD39260389A950887A647CCC99BAB17132DFB5DED35138FB3A060F6295AA5E195BF0BB56495A5A4A8FA440026E46A047 +311 +D40ED2520A441C302D240F201FB8F7E0EDDB0E12A04D8816215A0579E8FE1B1281E9F19C9900DE79842E2A7CCD48E9876EB01C75DBA0E0C8D44AB5512947A00BE7CF5DE9E1A6A6BE43CF1A78783DFD5A404E4477336C1ED8B18908B2A847B2AFE9839E891137A6673BBB96FBBA2A4B8E9373B001F08369BA11BE8ABC4302FD +311 +2345FD6014A127068427D007BE28B41D9B0D40FFB7EE531FA673C8870A69135B1CEEE8D009C08042A5B4EDA314920B635BF941E7487E45256439DFE9D276295F87E698389CD49FB394FE19720412DEDDC40E9CE9C6DD605E0B719FADC416CB15AB3A61F9B5B9B9426E54F81D8B03DD950946D432B40CEDAB7BB5AF11213CBA +311 +73C9BCCCDAFBCF06127C7980FE6D1DC9B4DF14832D6568FEAEEBA76FBF438300B541064ED33F3AC0B0D10505306FD370AED02859234402F6C3FED006766DDED2034D90D119057225EEE3DAF787EBF30EC51ACB4F551678BD6728E1944730C095F13E4D81A4DFFBF67C5BEE37E62A85FCCEC6CC6C7BC77A5B477E22223ECA4F +311 +CC0F87E2A5E3EB782BDB25B8CFC6736A044DE5A7CDA604526361D650484FE283B77EFBD65D52C1C73C4F48E7D0D81ACF572F2E2280F98FB230508FA906B42DE240ED651B301CEC83DE1790C9FD96B6CBF986BECF3BD332C18EF627A0B6EECD5B152E02088D03D828AFFAD26B05BF671B4F9A09A8CE0CD2707F67F2A4B3BB75 +311 +B9ADA331C1305BBAC182FB4A79820B7EEAF73199B8404C0B81231CDCBB871B80FC41FF5860E8E108222A1A076C29E6E03B6F3FBD4F1F295DC457573C7ADED636D6B7B8C88413DDF3B327E1046AA51040B40CB50C7E3F1D2E44DAD34CFA604029BFFBE714DF0C069908027EB275F1F366C132E1A7450B04011CF82B2B647CE7 +311 +54F650FF6E25BF37AAF65B7BDA16CAA791F1D09F6CAB989EC5AB7809BE145FA459E8D3E4B0FB47DAEF093B946FED585B80FE1A0305FD5330FEDB4FDF79FBF6BDE81D8300CF6815E5F9896552412A03F31FCDCC7CB5E32365550CD9365FDCCEC8752E943161D78047336F8AF6539840A1F2E764FDA2970999F205CD2BD1F5CF +311 +496571F76EAEFA0E1CF8FD2A55FD06391F9EEF8B9DC9994E72BEBEE1FC928E2F223EBA0FBFBFB4F2DF137BC894B8087643D64ADE6EDED67F7680FAC9060239E845FC94AE93D880F994FBF71FBCF5F66F9F32C292EA900F9C1E6F1105E81C5B5F58A067A448143842008D7275EA3BBA3D2516FDF02FF79260020D6B3C714711 +311 +F3CFB61BFF56A826E627E82256F7400FB387FEF23C1C1E77FD6A21EBB1B2B35F2F95E7760BE1FA3ABB3A981423477517EEE36FF96F122B942F6FB64D9502BD1B9089162532A2FEFED255028FE653C9F46FA321E0B588B7DE79FBED07C44106CC85133CA65190543004D01D02D8181DDDA5A9C91A7110805B7875B689FC3902 +311 +200FB192E7DFD936B37B57D9C338BD49E99E181F4E5FCAB2ABC1CA7AAB382CBC7D515457CFABE6FBC63D525E5CDF74B16378B9AD6774A58531912D232DF01BAA913DFB7D3AAFF912984302B84D0500077800D26C60A4742101DE420C610C2E92FA93056022EFBCFD5BB6B38651470CD33BD87630C05831BA864C85997B8754 +311 +B05167F0706499DC442FCD22592AEC2ABF3FF13F950039BF159FA9B36ABDB2778EFF83F70972B83BFD3F4899E64DD8346AA495CB155A7499F2CE39B0AAE755125EB84FD8CF8D8E4F4E9FB4B72E8F1DBCCB98B31BC4607C2CFF21C8145FB48EA0F2159F86A3098415609554DEFA7B27EF1301033DD06D274BAF6821D220DEF9 +311 +6FA4CBB60B3CA241C021D38E1AA76B4406B4767576166766A6C7F77273F5F395291BBA19F64F2E3095C14F3E60371827741CB27E89543857D6D96BF9A47C6A9A26057840332EB843717AAD171880217B71FCCC0355AED3D4819911F79D0EA8AD6DA31A83E36C5DC2D470295C011302387069158F6C9966022367ECF1D00BA9 +311 +BB95C389AE7B6105A1FB640689033A7FCCFFEDB762189103A61C3A4FEFE0D6A6B5A19EC5755A443AE78BC5E9235B047890A65919A0D2F96AA3C01CEE913BB3ED239C3E0CD8DDAB99E4348BF3F8B977B6C43DEBEFBD7721A839A63B94C06A10DB87FCBFA3C2932F8C26F88B6D6BB30C3C4E09AFE40FAB52EFAA1EC0316920E0 +311 +31A46D65A0FFE45A673432E907FBCF86717AC04F2CD0EF512D665FF53F05BFCDC43489F150890C60A8E0314E70A06F619D30D841189CA15D3417F3CD50191AE4396543F0C42BCFD696C58DF163F5B46D708BD5FDDA5E5E5FDF9401BC4F7E00E8A17520833D1CBFF495B5D1CE037C664123EEE74737268B5D1D3DBFDA6AAD8C +311 +08DF2C0BC7A737E10AAB2A7B958990CEBF556CDBEE823CB09FB344143463C630CFFF585D330CF0320E921744A7918280FEEF981161008E9FBC78C830217A07B7D6985E83F9A79884ABB5AB383B4D7D788F9FB3D867A2112A43F19042B33A108690CF6F472F8661CFAC971478757F6E6F2F7AEB82FEA85E5715941778B27828 +311 +1F28C268AB24BDB470EF3303E09C359E9DF1CF990D8A096106E6A66C8620DDE7D281DF0B2831F20439A30D68386CE13E002F7EDA8D7806162B205D6A19AA1FABFD6B1B400EC2BFFDD66FDF7E8755B4883C043F43046C1326136680404F1F934EBDDFDD39CB58A98DF1BD7880E0532E671FA1435E9D6EA5E9071000BE8F262E +311 +7C4044FD95D5FD526EB40A05A634775F32205C3D779FDC168CD5E56BF982508BF572BDA4F6F57D3304BE9EB18149461B12F760D7485891CA47CFC44909136FBF4931716A2E100123FC6CCAA6A644F25EDF4AC980B14039009BECE8B798BF69A05DC5B6885CD23F8E13A46FF0C0A986D617F001C52241801E87C2974C31411D +311 +A3A5D7B6175472763D637D3E57C33B908F867F4A59CFCA7923375E5F027A983E18BD7BD4E6FDDBB2250C1529F4202EFAAF979DFFB1F2612E87EBEFEC58581EDB9AA95AD1D7C1905F7305BF8182D5BBB524D47C4E3B81CD843220DE1E6536497C0962C225F75A2D6A998303B23FC501F0B3F736EE1FF01200FC8C99F5515207 +311 +C9C40081DF304C0A17D06E26CCBC5B3C47459308178301FA8057C2C0AE9D99B05F038828B08400F2E3251254DD7EB8BC4853B101F99AB48E387457C96951E5DB670648BAB70A7B04FE93EEC5F5B183F9739C98952C6845C380D401B8FC86E70A20744EC720E09D35955D96A9041720196D183AC2CFE6AEA816652D0234883D +311 +788BEC8F5DF2615261DB031C2381092401B48D8D2D870FECEA9C3D99DDB036C8A051058030E32190976718C89F031DFBFF2EEA3D88606A8A19BD0AE305BDFD12BA4FF46F1A0002B07137989C748936E9DB2C91F43B07E4E4D16C3779CF5A4FFE8CC981F07C29E34B7C012AF0054FAEA4A6A3D49D3A16D2B3CF220A02900336 +311 +6663053C89B3FB1827080DEC2780076FBFFD8E39810CB0593CC68B5D9009F2D400418028B0BC6CC74067E7C9CC0C2690FBB084AA5254A12AF63543B35EB40D17B693F7E3464D5094C00AA9E04E0E0524F5C35C5EC6BA94B21AAF2440725E2A9FF94FE7A8F0E769EB83FDEB039B631B18BF396F5C13CF89ACC02C387DA56DC3 +311 +B1CD84B96CFAAA37B55FE723B611062258257D331F186AC93D8AD600B4FEF4AD777E4BF68F2168FF08C081A37AC13446C859964803961928476D78F68419390D830C1935B5C2A0A22A3AB17D3D6428BF12DC373B8D464E04C0A496BB3B3B75639DCC2500E0F0B15FB6F47B5A7ED0183A87CAE8D535F2EDBD4B3B7FC762DFE6 +311 +5A07C30B2851DB890082ADC07131EEEFA3DB7DD5CD32C0860CA83CD4B7993A175F422A8149B1C1D94C1145059D9C78A8A572A90B7C8B1E3392FF77A80C50220880FF3669004E90F101740D2B808181455A044904674E7482CC3EC85C4BCE339404C0B0BF6A5611E4F9B8157BAB6DE327EC9BFBA1B4557ECB609C1F45326499 +311 +EFB90EE78F18227F09E563C9E63D847EDB3B68EB9C39E95AC4F7ADCF7D87F6752BB6912040281E4A0D8A8314E80D60470999B8A51FB1488A66A9F3F81FFA61C83F4FA6969E472288FADFD61B005E0EA4284822E018911828E868614DA0C36E11F3A051070BF2F0840E35F200E2C0C80A776CC9E7E6841C0503D0EDF15ED9AF +311 +E527E798D23BEE5F0604E58DFB7099D739BF0BA5D332EF29F1535995BDBD0DE681C4F71DFE6A7AC5A13554AE6910963E9ABC9A0DB5B202225545F5CFACC942B5B93C207352B6E5310BF349AF200175D7DFDF78F6D683B7C87E087FA9B35812C4F8F13452CED610A2207541E6D659A739441F3833CD0C9C3C3DC2B0712F6233 +311 +3C4FA9327C9CA1124904B4FDE0FE21C119776CB0C212AAFBA5CAF80EB43772ADFE77CD9FA8A4144C54C2FB2304C65F62FC3678E4F6C68F30FEE1BE8383CE7DB86F58B1AE0C51F0F055E188D02F00911DDB0991832228B3172B3E623E513FF1734FF414A611A603163F401BEA790FC9FF7FC3FD3DB02DC00184145B850D01D1 +311 +20424DC03C00FCEB7880EEEE939399F1F18DBD4AA54C939899304D913CC2D5CFBC55E50C7FBE4C0E14AEEF53D6843DFF56BE2D554637EA047D3C210E2C61077875FB5B40E19F43AB7470CAFE1C0D3ED3B3B4778D1DF6D4F837C08747180FE8394F2CA1E0A46B6DA62CE2B2DABEDE0B1924098580FC16B369730E9E90541D37 +311 +30D47FDE16EE1FFAD3419CDA05ED1F2715C607F2E81893AFC5936303F40EB776F1D808BDE393A3FA401E1C706E154C892860AD74A2949C409E28A8FB3349C764D13E4D1D3468952B7B1B35001BF41142CAD58D6011C8B78961EACAB66E9AFBC627673B61FFDA4167950A274145BF11EA17BA9AA60815C2C43AE1F648E3772E +311 +53C94E6364AF826019E723069A8AA353A3BF7FB5359281700061FF64C28C10B9AF0B70B0B0D30A31CD1CFD22F68C76DA1E44558869257892363C091D313EFA46B57C3BEB252E9C6BF5B4799EC58F1910F469E25AA17B343799DB3E33CF410061F96C6D63FA91B1000CEBB7D2971BDD39A2A76361E000F5DBC1688D47CB812D +311 +D60F8001AF25B328D173A9E4BAC18CE9F1F628704330741B2649B92E9714447C68559C6CD2F681919367E4811100750058809D0230C087A89FF3C80C23C4C60882E481F48D531764BABD5CCECA308DE2F63D3BB50373D630796126803C2D1FBAC148F7592881B395ED7D26B7DD38D7096AF98841CB37592561D9C6565317AF +311 +BE9FC4AF7371E060736C7635E0CBA1809FC80F544DBAA1F2F9393D970D44C0615A0C6930E758B9E63AE690F73045F0C8C0731DE9CD80F718E94652383458799E02C06D328010011C7090D8C5E5336A83D4059953877EA1E1D66FBE994F04608C4C991917230FB61F9AEE183A40AB9108D032449FD1A7283DD25ED15360EF7E +311 +A9303EDDC0043403531EDEAB10DFF87F5E2FD56DF0F1B701A9F614DB17FA0E0EDF6FD0B1622A81FA3D1DE5A33F551930335C353A87F9AB05C60455193448246944A232C5D07636D864CDD7A50D0B4440CDCC465D1C418321F50E1648D500294065D869559EF3C40C8FCC6C323E989AD0F0C73142480B200842802C061008B4 +311 +80A9954AF282052B3AF67350FD0DD30D1F4075AC303A5D490250F5400ACF479656861E4C77AFF327F3EBECA4B57B6B6C8FF62602BF150744656A87DABD7BC6BED50527B2120C001A0B3718C74F0C65CD34F275164D7968148DDF259AB8AD6CA81CDA4E8819509B996A7F642D987A401A2B04018C01E6C169A8700F9DE3B489 +311 +DB2BC49C9B7B858A4F50D22AE15428FCA4A1EDB20C83492690CFE361CC7F8C8066FFD0D77AEE797977F468A36E0B0DFC87F90EE6348BC748F7CB73B5B9DD5C6EE7AB19ADBF6DF359F1DC2A0F9E44F213F8041F64274C0859A2AB7C37440FEDDD2F95BE44065F22067E3EA0CC3BD8C0D8194EAB291CCEE20B9CD8E02950AD80 +311 +6080047A279F19024C837C848816719AC4A34DF8F0706CED904E8185753A458A27E4C1E37B5F30A104932BE140E0BF4E400160F320B054A8705042FFC47B4940810173F9C9E97240C7FCC3F3813EA239B745DE9F1B1F3FC2F9330374DBD1A7B475923F9A2ED81716D18D1B577DAAB9D1A0458655AD3CA7E211867AE7C702DC +311 +ACCD291E0F798013DC01BC326087775C0833E04EA3778FBCB8DA4687A0255CA0AD210C15661E4E92001A4449031D1DD27D327334BE830B64DAD90CBF537A45FBD4E94A7A88888E715B7E74FCD040E818BDC1BF5AC609CCCC015DED23877080FCDC47BD8EF3A7B783A17D33F3ADEB6D6BC7AD75EA7C7852C5B6FDADA6AFEFC2 +311 +D181C03F8C40DD8A4AB5024F0B72E34B57BC1182472DC80946789AFB711DB7F1193C03C893B0345F420246114D3EA71D04FBA731C0DAB0D3CD311B218F0D5A15ECC105D02F3AC32F13600084731A83220040019B03180634B5923D438300B05BAC80881F061095FED5D572A3323ABD83F1D37A2301A8C930AB3F66ADF7CBEF +311 +ED30BAAD7D78A06DEB6A87F15491F5AB7E25842B6B34BEFC12C8A159F187C64B3CBD2356DE5FBAB98BBE9583F0E3280C0076DA15BF34C15238145742B07080B1EFB83382F9FEF2239D003541041083C5AF9EF3C8944DC2030BC3ADEDDD9D27475800693049E05413BFB3FEB4308731512F13400D06F813368A0101D8D863EB +311 +3E75FCCADED124F532AD3F123F131AB46A93DF1ECE7F96CE9EB6C365C6D6A07EEC461FC919FE288AF7AE1A7D012D291EB073735FF26BBB1C99FB706E972192819B7A34BF22424BEA1CC7958AC2E04BFC8E02DB90A4A1DD04811ACDBC181037864672C78F6C0EC3073A40CC49D5E813593B7002763BC6A909D31AC86F3F6E33 +311 +5C9E1C309BC58F16418642E2AF6B290A34FEDC0CFEE08FCA0F56700699CB73B9C99302AA17BD516D7F1FD755A2B32B3FBE7134D3BEC813195BD355020A7DBB541539CD2C06E45F46FC0EE08293E6C0E1972176D9B678340AA1A4823404EF79B1E2347E47C35D0A2260730E0B513025DC0BD1C07E3366E9B9D17F767405FB53 +311 +1070700035618606F0B40C73C974CFD321B0C174A80C0F3AA54945FFEF348F5488895713E89B5C98DA501E06D8D24FF04FF0CD7ECD7BAA755A854EC6A180AD13BE094E8D5D63BFD6DFA5F5D3E4DB1BA18FD8473DC6E17FFC9832B71A2A94D96E808BB53F9192955D62C82E282B05168AA0927D54AB20A20A74800B7CC9655C +311 +8B15F62377CA4C91641F9F4D0478F4FEFDCE273A002CC0A725EC165CE3A149F0333E8E9600B2C05A7D15FD831F0938DBE5D0FF13E3C0F0765965A0961C3FA86DEEB0E28304747BFBA5FCDEE44C23544F7BB7BF7A132DDE34F99E44EC3FEEAE92F667A10F7E90B0E8C6442DF5A5318B0F816311DB2E6DC6F172C363FC800EE0 +311 +9186BB9EC82A24C0117700CD884AA42023B81EA6E0CF8B3056411110D78606EBC5AD5417B45BCC8E61EA01C4006AC233933E35D860BC1B6CB9C9CCCE7840D2E0C1C1FFC11CCE54D59300F2B47D66A10F09D8E24B71B9BDDF98FB62A3B897C53EC88D16D1FFE8C649B17BB8E760EB20B784F52F992544753F2CBF642CD3C9C7 +311 +0D8722C197142C567E74FB431EE248A8F3FC00377F5142144A82FFC28AC2970A780C85A7EE9146FA4B2981F3C93BCB0F3FBCB6DD3DE69C72B6073B99140DE28B8E919D9D9E7C2F5FA99FC1FFD07E9AC0965CDAEA0A945FADE52C791EA989E8E7A21A355FB37E44405D171B98A6E946DB26AE71DBD01FEF07FD378F5B4B5187 +311 +24481820890E7486E3FCE61A60E096D577701890EE07CA5D7F2B086040749FCEF3F81972E510A86359C9BB579883035887542090614E5C4461705D7CA1CF84DB564838606CF1597E8119790D021080C935A908324EDE9F60A04B7830A33F0670CB08605B8D01BF9A3D435693FAB4FD84EF6754930640C1F9D74B052A7ABBA9 +311 +F502B39DA3BF6BC7514EA4BEC71D752BFDC198EDA8DFE8F32B3EF811E4576B0A2074B99B070A069F60173E7427BDF285024E35A4418B7A412914F2800F1965C4F1120A2D5D2C64400563D5942044807BE7C738EBF3034C4A6F4D70C04ED1F97673C039FABC4CFF18866E08200BB66BDC9CCDCC3FFD1E43BEFC52C317F0F5E6 +311 +4900FBFCDA4DEE68768FFF46350E0EDADB7B34DBBEDE3776BC55599AF84E312229F931E700D04478D66A0D88D09B2276141AF0F8811C5F8067DC04C0F90929F7F1AC9CCD368488AFB965C97B855A3E2E93AE5B4866502E55991B82D4388614F2C36B8484A5FA06E3EFFA984A6AF17D5C2073299D9F12FD63826F67FC460E54 +311 +030981684E9FBFC22009A3006962285FDF4FC84B699FB5BEF3736C6072F6844C15EDF25883037DE6BB7AFAD6AE164B367812FA8CFCA6FA25725D99AEC5C6EDEEC64ADDA2BE0056002032E1D7A20A54CF444E360D520A5B69816C0A953CE0434A8A898BF18E2B704588C01BDB2133342F5404FEE698957C200EF54E31BE6DF4 +311 +E888C9C67F5F3F1B41F922777E7FA6332677C20098C59F762F5DFE4A23F9801A3BB6F8A4F66E0D40EC867E92DEFCE84C714FC7CE8DD3DD3BDBF9C781B1C3B549FAD2C89D711808CAB100E09700BB85240374A7209212F320CA577222A7020E7824500179FC7096C714884BDFD9499E027ABEB3CB0226CD293CAE6E0C41A678 +311 +8F396606A073E28CBE5CC67D584D36CA39D37974FE1023253E3FFB007A26F657FFC901D851130DDC2BF54884F20D5D40A0B7E5C7BCC7CC87B84F2ED820192CCE1AABA1FF24ADBE1D03635B5B3B53D4A5F84120125FADC36A0E792D3AD7E255792CD5241A4C84171F1104090017DA493D0A7790A7BDE6DF326180398E4B0DEA +311 +DA5C2763825E43E05C388E184678C88CE6422606C017F030366981353DF03A753DBF6370879F79889DD0BF75408724DB53C5B0063AB6568D02DC47AE4627B58D7E367A6000267E7840C23A0940B992DB98ED1C4731B4FB4DCFB6D3EAFB6CAC7646F0335C5031888CD74E2103380260AD47176D703960230370FBBF28813524 +311 +C17FFFBD6288BB28E4F905ADB4A788B40B4A6201C1878BED224DE9906C4C79EF32EE679B9F5D3B5DFA137327320643909A823F62106CB8F9BFE4BFEAFF0FC7A6393EC7F64A698EFF8ACE31BA05ECE6DAB6DF124118D1D13F892F3D3530602E3F3ED3D59DFB821ECFA3D9AE85B1ADAB9E328DE738BF55D5DFD039445AE76D01 +311 +94180F57B15BEE5F09C07F952F9A10372BC894CF7DA12CF6507E2A8916E0DF430C519485C55D61EFE209912D8C32866214E121611E22A0B1238DB18E86636A3BFAFD5B4EE02FF1E505F902BDF424D0516907BFC95EF3A76B6B3872769D67E25B548F0DA46E2B93DFDFD5F2B9E9EEE1EE1DCC7FBE6380DFBF38A165CAC73DF9 +311 +12AD76A4690D2B766A3EB4AFA2D05BE543EA20B095FB17AE3F1928D84482049B659E671A4763CFA567C08824913D37F2F92F841FC244085C1681225C04AD6DE1684831682CE0D6096B56101C0D4FB3A1BD3F11FC1105AECF5660BD3FEEDF162B0D9DEC6DB55AF27FC98050BDDEDFF63ED14B01336053A19DE9AEF5F5D9E9D9 +311 +F9E19ECDADCD497BCC57681922F327EB41FF681E17C1921B04FBAE371AC69E53F98183E91B84897A5DB164158BD1D12FF6F6BEF0E02847727BF2628F9FD48B6FB11DF6928C868B29590A0606F92140D0C08850DAA7DD8A5FE8A50389F61288AEB743E9C801BB67DBE0A7F64F63BC87770FDF57AA73FE1F5A84F8DD3AADDFC3 +311 +2087FBC0A7D645C327B97D65E7A8BBA76DFD9BCEE1B1CDE3F5F7CE4E6DF4013ECD7CB60BD1239E8A4E9A5722AD9C4FAC8F7FF17B214AF8801950430639A08E3ABD05A0D94E253BD5951C885B0CE750309070555FF21F2EF83FF53F4E15038B8D8A244740A5C9CBC120043DA0B323FB1DA0A4EDA268C05A304619505000BE10 +311 +415DE898809DB6B66896E60AE347ED3D6DC707CB7D5B5BC374A158EDC343D0EA61C217D4878CBBDC1D85686782C3CF4272E7DCFB5E9EF628F5A95AC1AC0C6848F5771329EF8DF2BB79EFEDEC8DBEC72EB7F245287FD4B31008AB38EA4D52F2BF57167159E3004CD8950E217DDD6F699FC763E9D1A0AECC701F7BD4430A3E03 +311 +0374066938F883C01DE40E7DAFD609345E33570F4CE6BE467FBD7F793B5AF2A9D331D86DBA7BF98067918F9FCDD609A0384B523F4413B574B818C6889FAEFC5E7B8F90CEFD62BC2C85B2478D54DD076635BE434FCADE68B3ECF1C8708E27863DBEC352D87BCC7A92A8E135700CDE65BC114026DE5DB68275E656D2C0D40872 +311 +93D43BB4C9C14EA83C0D806783B40DD7CD4F19EE9F33801F55A3F1FD600017A6CD5DE607783D5F74E34680E7DAB98D99F6E5B5ABC7F7DF19D8278322F6A97FDB2FADE1539BD945DDF868EE2B8B70D9EDAA45D1BB0A5801198CF1DA891540474745BF0317F8A3703E02510AE94B084221F887FE950272D62D4232781054A87C +311 +58D015CD45EBF9B70E60820A2056E9D4D619E8494BBFA68B61EBDD8CF52CCBA124BACD4A4077E8420A7F36FCDAF661E577B792A7E1B7E337C7CF1FDEBB3B49F501F3C7366C1730E793F51FA20A9C3D2E9F18E63DC277449054CEADA36DA0807467D45F8A744E1BDED725A033868703F1392BBE221158220588F30574A0B089 +311 +3D0515B0B7C404AD0E7F40C11D504C49BD7DA39A85A19CD7357DFC966E5D92272FF06D59CA5A6A1C8AE30E52F1247C1F1D78F81887F9F3E387075B170F9F5EEE4A7F5BFC69DF02FD8795FCFFAB472E7C88D563DA514861B85BD41594A75F5E866BE69471110A9F75C8609C7E6BF6C7C727431EE3E9E3773D2378C25226E82C +311 +08104A57ED273FE0921D6990E02B006BD038263BA360355E8DC446A380F0BA35FA9945A80CF60DFD54054202F91897C241C147D59F8E0FC67CD0F2BF377A3463F8BBBABCFBD6833C57E214AC3F5AE9C2FDE88852968F20337972C7E04EE5658223008AE82D93BC37D8DDD900BD6B16EF221F0D4149045D740A8A215D4FC186 +311 +C658E01994B8CCD317465828704BB630DA2243B3B4ADD3EA554A97408454148C04A1A0CAAC2E04033C04073851F54380E0BF2DFFA43FAD3D6B574F2E1E5EF6E5F4FEFBD1CA87C161FCBCF5C7AAE2F726F814027BAE10F79BC3D765D61D1803952210A9AA07F8C6BB2105B61145B324F96014EF223D4A9261080239F03FF6F4 +311 +DD4975C183B887E081F7A467A25EAA0C94028FEB808637768B07400A8235D4EF33143253198900E079E3FACB0C59B00F827A5785A6FFE2FCF0C0E6F1714F11CDE5140D931D707950631F3DE877F300002000494441540ADFB08704E252AADE1BD4E8DF55796A32B9B6F17737C67702E5C638682737286CB0E0A89B624D5BF2 +311 +8222432848C9AB8C07170C97B814FF492A61072407D638006F7C8400860444C01B1930A522788045633DFA9507267A3A42BA05925BAD705CDD3792FA23C1075C6EE768A673919EB6C3FCFE7629B7310AA794CC9C0D14A1FB88F95C845BF22543F57996E0B26C9E4C2ADF187F979F8A55F11B47BC26594C52588518D25E6C2B +311 +1CCED231EA1B748F093E5726A21A54C91EF95789041030C20FD5AD68613432E19A4D0DA2505B6BD843516E10BB00AF9AC315EE9FDB39CC1F9EA59CD88F9CD071D470C86C4647FDEDDBB1CDAB81DA94034747A779F4CED497CFF817348F69F52E55490840E48840BA72DB71F3E84F6DA2F4717AA928F153DA6E4C7E8E00363C +311 +EC9A2E1C8E65F298FC4A52F087FCDEE5CBA38A80CBE11FF7BC2AFF249203FFAB77A128A001B1987BD334AD9B901890A8C2005B6B248196AD09C0025ED841325B31845032E327C531C839E66DBAB39566B631C2FF0A1DA5A3CC47E665AD8751B47CFE33899DF047C9F3C365E3B11278D49DF939298E09002F6430F995880330 +311 +9827A7C791048CA070061B7E9A64C557D235F83EE24822E5EAB805F9862F20FC58F483DC0EF02181F572930205107E00E523861895A2811309808F2B6C14B2AA579E893753C155D2F54302007E9FF36AC5FEDBCAD47E182D91A73920CFA5C18E01F8FFF4C3F1FF553BCAD0E58DEF85DD63B91BE38ECE1A9FFC4AD4A1FBA30D +311 +462C328C5A0340DFD393D3D3D3C0659195C96990F391EFF4175213BC74C020922D4830FE215E76940962BC0713A3B82784C0CB6623DC40D6E1485BAD454F6892200B225096127FBD82D2B12006BAE2E329C771E25FEBC0DAB3B5395289D56D7A8A89081B34EE06F80F819EFE75C67DEEE95D227E283FE98A7B9F1C97D2D05B +311 +4D07A469153C3DA3048EA68FA667A6D90E291C7D7E2D063E4D044964D055F2DBF3E31BB851AE9F78A0A7314F0AD24901F581D74A6929142039C65AF5830D1C809536CDC05E4BA51038F79D713DA930CF18BA3010E385351CF47F74D439BCBC793556A1F99814926AF12835E251C59BEA3C083EC2B2760FEBDF4304C9EB87B3 +311 +5769E1EB24B648542CFA4EBA9EF93CD42F03C08F249A2C98897D8E2225E90077823F4A52171A61219998CED6FA050992B6B0A74A2220ED12123004FB977084208F8E2AFC80F456CB110BCA647A3A0F854085D84FE0052BE31FFE7F925610BAFEC06FC33F9931BF063F39DB3D1BB20EE357F594045F4226131578582CB055A5 +311 +9A073AE0413989D215019B6EB8A21CF154D71164E0D8F4E730C2CD382D098DA5261456A425643686BC8301710F2C50665881399156AA2B4C3191BC555728384800CE10040F746A3D8A80A5F0E500A93456FEC52833BBB45203DACCA37FE1D3EE4B9BF0EC27ED47D89B8266F11EA2DB8B5A8BB93EAEDF0C06B7AD0402B9EAC6 +311 +E787365535AF19F15158308A9D9785C1BC1C01377F8C6B4D07B50DAD25649764A91DC9812C7B34CA98184084F7C01055466B48058CD44085AF26648520C85C41C67805462D8425680425559F4440F3ABBE1F3F81B1EC72708767DDC8FFB6465796C8FE310FEABE0C9B242A74137EC3E0427091967023299BE5D6D4D0C6D157 +311 +47DC2AEA4ECC57C72856E827D33CBD319D70FF854369EB841282F84B7CA4881447ACFCB257E252E00FBB3272120A75B99119840858486615636E0E0334031AAA8C08A62E080053A0AAA4158431EC727A084021D41CF5D630C94184F6FE7432E8F5F9A4FCDF3EA7CF136FC2988093F98ED622E38E4976E1BF0CF49D2889E6DF +311 +3566719FE1F9B47A2D3BF89C69155DCF24F88C609EE551160F0415900B4C48FB013D8900A9192A700748002924771A3686A0A580FE4009E00ACC090253E280B90AC15048E047020483A038A60ED232831F2CC90498648690D960C48E439F18F4DDBEB0B6F5AC7B7B89F6230243B4FA160A7B9327F3AD5D937C8BFFE5FF8B3A +311 +5E64283BEF8EAB9F71159514CFED62DBC880614AA1F7994CCFAE7D8C87057F451733699B8DF87056E1F0654B5021E38097E4E23221B810DE20559AD183A61C2C88A648DB096081E9801CA00BC1DA0124E08DAAC15FD2936905CA8DA1C40E42B13F1764E0C4015EAD7F8BFEC99A310B1B7C0BCC7746D3C0702759C89EAD5712 +311 +2092122D1F857067684A578F1DAB7EAC400841F493A468113282FFE42316CC74C756B1C880FE78795C692813CF4644480EE9B02991BCA257A71861F00666D9410288487618D120D0E80D7773E2B7DD180E100EC98B221C94BFC4FF531A09B986230F1CD08378A8E4D0FDD7D9B1BC75F5C12EAD7FF83F3ED19EB018620303C2 +311 +17A6A35D826E72ABF2D8E2BB1B783F6E48D2E3F360806E1D192085D022103473A10375B63853EC54F500B5B064DBC20945B88160DCF7E4F83A0200BF6FAEAC88E9F54D22D898E43F378D20B51B5D6B1457000922202800DD401A9266483029C0D6D57ED80D42A0E6E08835F0F3AC73D7FAE6D56185F04FC44472B854EB7D9C +311 +BF7134DF3DDC35A9F6B38417DD6F508B37C1A718B0D054124176F7222F62DFB327F34D451799D56216880193254FF782D7DDE26C271BF38C6E422E271CE4AB8823C9510F021126A7A944E00DB4031D013C88EA0746C96D4574069BD5439C4110403B40020C30B07A604F1E41D19C21A93FD9002DFC35F23B1E7B98E95E3838 +311 +7E3603FE7393680410D702FF9ED5A3C5E5CE68B5827D721FA78F3A9A0C08A79722D9C9B418F46C0057BB1640C70AA4A03D29CECF33987596D53CFB27B32C3BE304C540E14BF8464E080918268D254838C91A01F0FFB99154FD8A9C0495EAA6534A6C464440B4A71E16100E7405088122A35F7A511DC003D002E6C8E7E15F6D +311 +1D2FD09014139EC11FDC89394621F77B9F88EB5A583C41E2FEDBC8F82334494C0BFA97FF3C3A34ADE60385B60E5A30CF036E5E75370BE3B83AE73B3B7DC0BB337DA0045299ED0C66681E4AE223D01B1BC3BD4C921E2005FEB5114739040758189BA8A320067B62A3995E4720055065AC2B4A8006BF8CFCC907C0063EACE418 +311 +13C5F017065AD46CFDC6FF1BFEE052932CA3478C8E5A6F25DC8503D40F61FC1B047E4DFFE8E84407C81F1AC7B5C79DA358551CD0D13785A9AEB38D6EB68A0A8087FC6543E7471082873CDCE5CBEA1EFC5CC0579469E225428E9A43D6A6000B4219DE52E8DF00A55F4BF5035960661C2DB88AC1F67C2890A93FC420193C8326 +311 +409E7B595FBBBA9AE1D1511B3F6D65B09AC10A71C2317201A603E88C56CC68C91279E83F5C147787EFE6C675F00941D23EF092920330982DF38C65EDFCA89DA98E8ADDECCD77CB86D85118F3DD9884820B1128010D02F1060F582871CC8FF42024C02239273A1CC3BF71E770DFB7E96081682803188118B50310BD620234F2 +311 +30B12711B063E0F0490FCDA9248B580D3D3DE944A30CFCF2A1E0F6E59E8FBEA289CCCC943785BB8880ADA9C2FD70F6A13F5418444E3A669273C006C4B4EEEC067827539FFBEA9CFF04D84E7F170480037005AAC8829084329899F90B5E013927F8E646514B4824B01D11F72C012CEACD163B6358A4454A4221D06E68A71062 +311 +520649BF9E9127D0772D6E5EADED52FF216BC2FC513C7D3C5CC4C8AF009811826AE20203B076A2AA66D8D32E317DEE0EFC000FCE16D9E0BEB17C74AB009256C5D8AD1CBABBDA61402612C675FBD72D07E633B1A42F2421208CE01397560811204306617A5141706105C9F4984C459F2D0F6C392FA05BED808512B0B9A8A9FC +311 +6CED89640EA347D31F0DF76D3D9E61E800FE9F7601BE4C9614A1C58E6C839F13A12D0EB426DE6386B82369A9E6A7F1F9146EB578A2EF4289AA109B4F6CEFEC0463E0072A05CC9DEDEDFE08407B173B8AA65399C80B2911252E6290C82CC1B8909140C11B7AE161B42B93905045D017E00CED6D27AAA15F2C2179F1E83D411A +311 +7020B9408D202381E7E5DEE5A9E7E5CDE3B186433F488AC81554BEC09BC579018ADD1DCB3D9D70F02B14BF9159A4DA376225FE43DA224FED327941705DA582B2FD1BB5DC0540667B650BECDD1D5DDFB0C7F36DEE2B94F6EE2EE4E426F20A1174C31DF153321A24114C4FFF25E505475F6906D4149B21F1BD9D9DF7B059F8E0 +311 +FD83323CB97991FE80EE131A9003B81C491B218B1D42C0C0D593D9D548003839DC29A740298B0C23F0CE14BB167BD61989AEF0B985C8FAC8F923A73F31953989F0F6C96CA6C4D0A9A88184BEDBBBDA3BBADE77CD8E2FFEDEEF46184A86671D7DDC51417477BE9F04804F305AC82C2D018A21EA903866A0F959FBD4139916D0 +311 +36635EE03DDB7408BCF0627A03027AD314C09B0A27F0A79490D53839D0DAF1416995CAB24101FA63F75029D57A4CBBA9FB4D120ADB17FB5A999FC9420DFE04FA670430B90FE7F589F7FE8D50A4B5F004CE5F07EB4EA007F8AEAE8E8EF7DB3BE2F81F42166C7246FA9E62D02C8209BA1024414C483498B50229FD923F241404 +311 +0B2081390AAC353B5283EADA12A30B1080866D746B9ABF5BC107F33C2A015B275480759334B83AB02175EFD0DEC785DFC505E0064F4EBA5A97073A74C5C9FEC97BD25D819E28AEE661FD2732B8BBFB1BF13441B3C1F45E8AC1752BBF80C113DE960E0AC7D9D02C58C80505A19BA0E84B14402601A590A4AE00A825E98C3212 +311 +342302EE10FC5100681F86834A2804BC409D70270A2091DCE874B16BE0706C974EB3D26EFEDFFCA6C4579AA4DB781708469F055532A7046C6BEB0CF39F3ED2EC4FBCA3D00EA91CA68FD2B87B5C191E0EB2C300F00A1C9881F263571C6CFD83D079D09F176FAD839340CF030F70458F81F09AEE1329505150CA0A00576B56C0 +311 +6D58070B23086F685E44232D9D53DE3FC3731044F286D19F459351863F749F1104198D6E14BBC68E17CAE70D7AFD958E350BEBBC70C9C4DFBA075240DA27D40AD7DB063A097DD3F041EDB3E4B682A7A12A548F3393DB01945547175879989302521EEB1431B08759B632B174E0F700E774FCA1BB83F95029ED1A084288C889 +311 +3520E49415E00DA080AE8027C34206D35491D050A4C6B080F6A20889A2FF82379AB6234F6710C05F9080ADF002B9C9F9C583AB220F45D618D7E7F7547FB27CED8A8B7A7D24EDA4988B0C1C2A1AFB53FDC61BF3DE50D63C560F0120B0372F0839DDDAF13E583B868717C1CB8CC71D1D7F440CC82184803144196EFD58BBE00B +311 +7EE77DE8C015942357FB06FC906A5E2B8882CCF9FFE184B0035A5CF186A962A63F84B3AAEE3D5A2C830008807568B6A9F424086D2095A3E262DBF124350082C4B5DF4704A9D2C93553DE47BD6766B69349610716999FA25854F759CA9792599D3837ACF6247CE8597B0F960FA3EC45B61715050260C5844FCCFEC9666BC71F +311 +875B17E3BCB4CB151405D7D08F846B4CB952248B4603CC402B609E90F0044A007FA800EC46D07A51232B00E5683C55D5096E1374DA4FCBBDE2C25A5B8D26008227CA7758033D7D70DF12CAF7F247939F93F1CC63047D63ADA0B7CC8771B234D8095FCDB577B586D1834062035670E204B245EC093FCBE15626C10D210CB38A +311 +13F50E10A0D5C0814B0C4B30AA9858516001669002229618F100767AA3D6D2528595FE7A398C2D2300ED0013A0AE60B91644A057327BD3C36BEBF48C91279B45F8BD145494674AFB211A91977CB838DF35DCB3D6D6AA2FB2784B591ED785DFD7DB77747DAC9D2F7674810EFC2895F9ED8007EC7885101679C06F21E4B1C8A6 +311 +120956F80518D1DAF1717BEBFB5803E20C6F2A11B2E48AFF4AD2810A70054623E341B3D1ACD92DA91150DE631EEB2C28882D092049C0DD38E262A7BD6F98549930C9D44B7C37028AEA9F8C5628A2BEF5704C0DCB2B428181B1BE766F43014498D2E57791E4C8DA6BD2ABF5003F0C40202E2E32EDFB02852D16C30B7F646B98 +311 +FDF86C7891690043128B0A0DE6B4EA27F08C30CA34C9D0AA0852A5997F8D11A6EE84E040B20472020256F4AFEBBB74E6705A12083B249089218E6452C8E5A69717E904A3F5EF3D5D08EC1F4D4E85086B238CFFC11AB9AE972CB775616C6D1DE04DDF073B4DE3747C41FBAE6072901CAD0237100670C5A00C2C3CE063610ED8 +311 +24826C1F6650700E88C00B62468903A0D71D3A390255AD7040048348C56C4647413C2C2561216E0C469203EF06A5B101AD40D0E207F78B124747DB5B4BBB4E88B1C373C114E0470B345156EDDBCE1B4DBDF81DBC400746B0B54E05F693707B89A5E430982C2AC7D10DFF11D5B102B9505034B35D07E8E5F585757F088B390F +311 +2D4C85CF7218E8418BB4F25B885053D07D5A908326809F31D6CC6B77CC948413B28664484439D118DBAC27DB5AC40C1AD166F25E6A2F0AE82100C0BF220405323E1FF80DFC518CACA8DE1003F3C9FAE9C7B2D60703A0004F8EAEAD2DE0F5485452D15B77B4B67F4C2403B8D8F9C533558ADE058A9E177A1698F75DC0EB4C80 +311 +0F74C0270178C8579C1FACD025F0560844502D2BBC01E620030CB93636C1041636A693949CD80139FD15BE107F905590A292840F8860706D07E2970A2F15E5B13B87C3143CB2930374CC46A6F9B9D7A5CCCC14E11B9E879A49FBE27ADBD6DA82410FBB94FAA8487D61B51F4BE0A03FD08743C31020D6628ED20305A22C2C2F +311 +AFA7ED1E7881C438AA5B9035F20759E243C51F34D0D5F02F11403B9E204CC1686C0B6C9000470561519CBE1B0E4FBEAB37A39EE4B84C05F023858779341991F36D9D9F351E7BB3B5ADF00148D9D05784F9AD8B037D48C01BFA83D4247F03BB768BEEF973A14E610090D4B96B1EEC5C5E66928F28EBEB6CF578B067DD830860 +311 +81579848E60DFC7684044D8174993C39F886043481F6A2B743B18749E52447CD4D230513032D20D20206E536E15BCF7B7D211634F98FF9986287F33F9A94615A5A0A7CACF8DF5DCC1AC6EF9AF1945EB78E0A2FED1DA2ACC00EF983F9A012260BD722EF61C9DBCDD8719703ECF839029010CA0B9F100B1D2842153E01A1A383 +311 +7AB579516A31982FD2908A09100DAE591016CBCD4B011A2F4DE299E1338CE065DC4841BF9895D8C81714800CD08F5AD39601BC929B55D291F6CDCEF2AB40DD5D98F4E6F107C47AEE4A09A079C05316F479DAF4C2BAB83221BCC0CE23FE3D3D4C7BC9AB673D89A3677D6020F6E182332028012FA0FBE0B2668FB85485902A8E +311 +7FA0BA2105C213E20BC2169211A4BABA7D693C3F1DA961F203694853137073AD5CD25F1C017DE0477626D7BA55B88F83B5EE513C41D814639FD1BF759171F4577D3CAB0C3DFF68B2D3B1F8478C18F67BEBB2598FA76A4545E9E961BACF657E0791D2373030E0EC9FAEDD17BEA7703A738185D08236C407448A4CB504CBF01F +311 +F43859D3115488EA01B55078000DF085911805790DE1B41B6F8CB2889C3834FE02AFE07D85143C6C008438A944EA63E047023A7EF37E13B0903AFEA7BBAB9579330FAFDAACD540022980B65A75FBA17D388F1E6576405CCE7032D95BDA420E7DC0EFA320879E5F8B3B04C1D2D9C1114210C19FCC49DC6A855E12010184DB89 +311 +68109ED016E4683CD552A36B3AFA13BFC2114068935A7E774CD2C7225642B73325938052D8634ABC18DC9442BF9E0402E85B42F9F3273672DA8E8F1070405D1DC3248487574CD98092B8B956E6AFE1566530B78FAE05B4A0DE51FBAF85DD075C7E11939F80E015A58D1F87E400CFFD2306C4D1D3C634380A201545A92BE01F +311 +445800BE12302AB477BD6F62600D211232EB061448A0D2B877BB940D63D059C37E0569A83DE93E214F4BD86209FF6F479C640AFF8AF6D1BFD987D029A94DB7C329B4184D4BB013BF912FB88FEEF913071A8D82B651BC10DB067A7EC52FE1B421883144C00F64FA23A11CF708BF16CA59F18D4C04B8085964B2D8DA4A855187 +311 +000BE440BC816FFB13374640B0EB1D0998AF38A1AEF503F14302E2811081FC12EA6CD38A63B33035125F40F170C0B0AA45E9FCA38FC6D688D48563B5C4B4B7C359D3C7AE0EFB16ACD5E2FAA47EF8307044B4EBE1C71E84E742D81431FB06B90B600B9C239E277A57C94C427EE10E7826980C0136600D916A06058CBE8604DB +311 +4D314FBC014EDAACD0820F14BF75449B70339490FE5A0491221BF95F949DF1235380E969AABDBE2D32EB4403D3FDF17F42F9A0A7C28ED75BE86BDB7C7EC80C76F86B8800F77B305EB88F00A4352E0F8089EF811EA02A3DF08F7DA008F803BE4B4EF5F41E56087099E920708C3D720916444440FDFA013D4E1201414123A092 +311 +90F5BD7AB729298209C4306D007BB0829FD4EC3A6D7E4F00B67DF38CA0764F832F0448E58439B952CB4F70DF964AFA74CCFDBABBDF273E2FF4F56D3DBFF2A78D42FFF2755DF307066497F44062AADFC0CC546F6DCCFECECFA232E14F408F05477D311B683A35BC245FCF8A5CD2AF20022C21022266905A5BCC8B20235D6FF0 +311 +4019CC04058AC80023662E25F342063165956320BE50370F2A657BACC817DDA3DDD3EFE04028645780A768FE38DBA88BF2EF3ADADFC7FEACA952E5A77568ECF0C971DF32BF1D24F8486B22A649EC81B1B60315CBEFC026091CA45F858D7D04C1B437079431E63E38F880758842E780A9E03791C0FAAFE10012588C3C592FE3 +311 +5461A6047802BA18686887023A422A49599399893103942CF6DA53A8E387825FA0678B261F139F801E2B17C901D0F5217E07AC2401A87D0480F753FBED44FE949C93A1D042B879FCE499B3D861AEB23F9C1F372F0C24D0B7D6E70FE1AAF60F84BAE642D82F0A9F53E22783915518494FDBC0AFAE7DA282E5050B703570E063 +311 +19A015E00D693A6BEFFAE493941C3B08C13B96BD20D0115A9565701DC58568A3009DA13E965765C03091F0FF339F7309D44F6E61F837F1B1FF920450EB8FC48F9B40158BE89C81A597CFB0DAF5F5755D3886DC13D4479599B583758CBF35663AA234F133F91D3BCCFCE0A794367F385C59B19431780F1C099131384056616E +311 +15A1563B50021D369C593FB292685A68A8B2A50A0A2085CF05434617E05FC24A6B077B990014421A68401AC4D65788EE25F737EB780D08A6E38F060F2ABD889E1B889C44852C2FF368C1E3E710D73B6589EA83F7417B341ADA1F639A23D15298F087AD0326410E116C3A1B325218433C71AE62C07C1480F1C045629724A076 +311 +A4BB8D622D24690486727F56108D07046DAB065000678E04C4F8C342DE27F4AC102D854F2D08D59B4ED0E4F697B0FF62F113646BC5B7F3131D4EA8BF8B265EA3F2026E7061B96F6DF3D993276B2180B8E57067587428579460551049049B074CF8B1066C7E14C705F0B39298C0997C17F701097023BAC31081390196801FB0 +311 +C2A12380042927503D5A01CA127F9841B460310639C674BC8CDF1A320501448E0068905B07F6E5602F8C1F07786253438CEC51AE61FDB25FF71B09893AC026A9EAE3F30F369F5D5EAEA5801FBAD3C98B38C13EE017B054F81A56F05259DBDA64FE270B1FC4C77200FE276FE814B916E222575ED717A62A9295650460526840 +311 +8CFE13FD61F84252228376060206802B9550F00B9D47E6AF1022538A752CF4FFF1F5931384A9FF8700EDD4FFA2B93FCBFABB3EA6C607FF714B0B8B04EBBE83B52B246092AB018C0D0002FC490849F1E214AE6FC42009D6D86616C835B65DB9862EFC4480C14137603C3089D0A5588FA27E693DD184131BA4E88C35045ACEF1 +311 +CDE1A82323C20B842F2419604821196EE8185BC834AD44F8E9B7549A32900196E9ECBBE20FFB4706861AACADBBFD9B56A23FFD3AB8BFACC18B1B5AC0ECD7B6AE2E2E9CCD2BE8AF1B1BC3A813B94107E82DE67A42E7CC7D4A6116700B5B2EE3C338A09B840F07C40A64800D7C605AC42B72227C4C7020AB1F20056E26F54271 +311 +7F56534261DE3766AC10A6ED2D006DD03BA9DBA507AE0510A8B385C92363B9154167F1230C40D76AF6F3BE0CA08F8BA2FFBBCEFB09D0986550E0F0EAE2F2780CDF850CB0F88CFC2815FE87BD83909F474F45DD47F1C821DB2107A8817FD45384F57891B65F2543D0C1E20A89B4A8DF806862AC27C60F6A054627FD34425071 +311 +8AC0FA21CDC4E28DBF2650D1B39D8B8A420C348A4F846E2BE824BF8C45E1DB8EEB52F576F47A75FF95F90FCE0FD3A7A08D48D5B9AFBE3EA658E1676FE3372FB57F0AD8D70ED4AEBA3D4C2BE0AAF1C3AD63A6004D12900CFC481A47430C9EACB390038642C8C41B13303166614210592736B8603AD4FAB17189DBB32F3915F0 +311 +C380795A089A15228460BDE8E52203527D41B5470901B088D84FF8B3FE2BA7F4FD30ACAB3DE0B7E2FF95807AB0010FFDE3A048F7360F9F3FB9380EE537F16F8673131325D3351A3F664022020811A0FE8C019CA17370725CBFF64132025DA1BE2555102212E80A907FB43ED80A991A8AAC183932C19AE17524B06590B6AD28 +311 +6EB99BAD18FF4BD64BAB519202F992A963648ED30E7521F909F090C0213E367A77D8836BEB6F34D92EDA624183070248351F1A079E5D3E7A9EE81F2CE6678F92E299EE312B6C0572C0A7B5EEE07853612403813152C7125E2022A20C18F855DBAFA399817FC97FB6E1CDCA31D348434ACD0012F0D32A5456B4007E6E92D72B +311 +1A4E9971223A42C1042819E4049C0C5801300C0013FA48F8944FBAE71DAFC27F1826FA2304ECDF3F6C10FF47D5C7E49748DDD687DE8E91C09394EE0682A4F84CFD6067EEDF43E67EA46CB2F4070160439245F00343D03BF25D7E2F26FC400A896DBF19FB8D4D0A66DA669C3D608F9CD048A0533621B25690EE19D5D15248E3 +311 +90F042B12C682511B02BFE3E5700E4C9A9B2107A8F45248FA48234FD23005ED1F4EFE80D1320836F04003BF42856D478D1DCA3ABEEE3C68F9F30C3A16E5C238EA5DE3FF37DACC2F8B7980033F47FAC34421EF0418A045394802CE032D61C70023D788136788613887C0011A4EA316E005718AE191F8D0D841B9C679CD2FC47 +311 +8442D005429166F5A24403B1E6ACF3298F388B6D0BA933D92339D48969A5C11F09B4FF017A9900A4F887010C474717E10F36468032FF33F4AD610517777104CD920C3CD15FC5F3B3A0C75BBCA3B00F2724863C10BCD4A0E00736C7981F2F72E4B001438B99714FCFAF713A2603BC710376A1715FC602022202E06FDEBBC680 +311 +A3DF1C4C095A12C50B554FE7623B50374FB2129DDEA4C392C9188077658C87F55FF92FFA507FF03FC8DFD3F31BDAB46DD51AEB03F7E1B38B8B87CFF47EA1479C3EBAD5C6B382C221C0F1B358B39D76D9D3142C4A20935F541E492E0EF081BA41B3620A8E172B584EA1485632E22A8221CEDAC6110AFA4B6D43E2B76A18AB24 +311 +0BB24337721C9321D2C033B2D3E2641A55A400A28403C12D1DADE39AD23FC5FC08C47A64DC3FF6DFF76B5235124022D7E6D6D5F3CB870F9F31C96FE477FAFE54100068A3A87FA5908A2C08011CF31309C10025B089FEF9C510522B8DC07C30AA469841723A10C08E27F00F7FBC181C083F2809EC3B2B328E294AEAD5A071B3 +311 +A95C81D2DE3F930372D022C9C793535B92FDAD5426E90490C3C81D000017C6494441544698C416520C1C40C71FC204B22448FD9303782FBA67089A1A7D4CE38E89050FEF5F1E078A4DCCFADA058032C34C1CBC2E1202B1F8962B1A8024F0EB7A11F209E96FB369D4B64202FE7BA230AD24C46413536EAE955B341B726C593B +311 +5D4630C0BE822480908522B0D85430230352618DCD4F7BA6D568BF4343801480006658EA3EDCBFFA9702B4FDE9022163C43F9B72B58001A23FCE6F0B3FF0E4E1DDFB9801A6FC42FD0132CC1F2224F89933107AD30B6C9131A53818AE944BE25A70810821C38F098411980E46D108F483DC63F49B91B852351604091D605467 +311 +02F58A3872A1716411B642C7629C267E64E77719F46B0548FD6BFFFC86A38DBFADFCDF700228C124C8664FAA02BFB1F92B09800876FCE4F2D1C3FB4FD0A44E0106A8DB8079751CBF0BD9340066C3D52BC64706467C05B5A54401BE4A1B0132A55EAC1CCCB10D378A3DFEB9812022327745EF2102886A9142C812A1A2C97080 +311 +27BB55B7006357459F9C2080E0BC34489FC629510F3017B62D5073E2A2C64048A0A42580E413BA9E08274091A398EA80B5BF31C87BF5ECF8F1C5DDFB4F22AAC181F070AAFDDAE5650C4000516440D8806786D874215149E69ABEC43FF0EFC820FEA112B0522003C84BE03FB76623513B6D840820358B084119B0CEC8C00AE8 +311 +88826339A54091F5FCA513AFE147975BB1A86FC50618D9D74502F0C7C8815AA306602FEE3A5E79E0D7DED1B221001118B73182CD439A092FF801105D1AA14E1918EC282F6260869D55108065988BD67F68E5581720A708051F7C8070F582389C682BE53F2AFD85853F2A013D21564028E06E79B7A71E43212180A81541EBC8 +311 +8F451E02385100491AB0C4A3BC5309A95911E66D04C0B448366988ECD204C2FC930F8CEE8FA410EE4C25B58DD1B6EBAD83F6196670F7DE635282C0A56A851AB035831725F0471A10FE52097089C80495804100318405F0DFC2136004B4C40705EC9154315129205EC357930035688F61AC02188250CFA9A980233925F16A11 +311 +7A48CA54DAB6400221976B75D863330942E20EE3B00B08FBB71AA813B0E502FD2B023DF70114E0D7DF2E2EEEDE7B789504200112075478F2FBD6897835C91F0C20782401E801A2F9142700B74805703426023A81CC0BE88B537D0003E0C5181D29EB8D83050964DD2580910A1E7A8138F76253DC01DC2F3824391AD748276C +311 +0B0CDF12366625D038603D0003E0266CB42704C8CE7FA7F11B4D59C0BF454A78F8FCF1E50513715D469607031272358F04E0003C90107223A581218F10008B10247CD20D860FF0BF48801040B361808148714764028EAC137E871501EFDD97C89B52107FF1235B0928C562530082573CE137840EFEF82A0BDC602736C59591 +311 +2FBEC69E6A3A26903B3A300C5A098A9E3F1810CDFFBA019D97B4E7A7A075850F2E92569BD960CA7B8304995FD006FC4213BB1448A6F4BFBB3A9F9FC4962D0A1369129B10073771FEDA38B1737B663A71C088D8848027FC3008DAC4E4397A6F76271DFFFCF77D6BD7F1F67DA51E0E08875A6BAFBD6BD7AE52CC04A0B4A2206F +311 +650EC412841A48258258E8662C3838FBE21E25172C2A15A4F78D82DCF68A005DCF07047C183E1CE47731BBCCB5469D9169E0D588945BEB637E87802A03D88FB82486210D28FB3B858D13DC7CE75F5E6F3B03C1744D30CC58C7C7A256146853A05243060B850072A7010CA47CFBF9A1E24F414037B8781E8E9F219A774B3648 +311 +1CB43E48A79819D638C8760D672FAC19FB9D3FC5EA9158DBD0159C27860409682E8FF2595652FE189D2CC2D7C023E944158355806FC320087CC74116030CC376C559C098B93A041C5DDA48AF33827D2327DC761D19C17CC62780D82A170E6CE7415A5E7FE825E053048F88D2AC2A561CA4D4C60098DA28EF1A013827724846 +311 +98F60C8DD24BF396EA76260542810A625978C03580A9CAB91D10249BE579B0377A3DD15749A45F24C4D81FF3D7D7996F6A1690288008C0FF6CC186DA9D5FC95BB09B1301004B016E707FDFED306A1BE8FA208828F00BF342186839839F1F6FA338DC5A0200FF383DE92614C03A4508DA18F4D85F9354F7E867AA77A42FF49B +311 +BE6757A1A7454448D0BFC3C220714FE43A3D8F1547BE10F0BC5A05985AC3C28829A06FE24CD062700601F4AF12AF99099B08E7071DC4626A97C920C3FF96E190C9D1FD7CB6163E800D79E5F3F10A9306C02B799E80F1AB380E0571A584C0370A220C3125000B500900D96FEA40409F980E2083E4EDF4D8D2480AE5667222E0 +311 +20BCDAD4EF19682120818FE18EC7FD6AAD67C03F7DF1955E697456F517AC4F24700C30171C67E9168B109A4F60AFA60F98BE30941BF776DBC7C70792A2FBE98AAA97224F8BEA39B47BFD14A8CD03320DA2B676E3AA397E652E30A42CE2987B7DA1EF7F75242413800A04C0270C62A13372400B435ACD84B8B5009208F5AC73 +311 +EB149FFF3508E21C2201E0338BE07E50EB47E7FF6D97724A601028C5519073E7978EC88834410450E074DD58AD13A4900103A6444A9CB99103229F0EF8C0C78161EBC68137240734CDCFC349807851E0EB46CE864D2E405ED341B71A390CF2DE20CF5193189E1901E866D0230409684B193D17E2928534D04240937D3C8447 +311 +7494FC5E0FE0B448E35AFC19007926C1C6A6E622FDB8A12E30993C6710E070397C4B26304C0AE38218D19F01FFB15BAE1C0E7E74DF75F2406E373C414E848FF8E500EFAF3C1029C9C0ADAB2313A7426CA9B2C1B9E30032C84EF31A09A88A386F136E8C2F1D582EA0459207015F10F1F001F0B1B7DF7222011EA2001F00BFD3 +311 +6BAEE0850928B08C077030FE3806C880EAA74BCE0863A952812E6008B3A89199C1EE918AF96AF583F1A073B0A355B9D861AF1460DCFB3BFC6B7EFDC834B09700CBED3510E48DC7129041C991F06BA5006CA6B5B34EE21501374E8DFC910042036111EC9C7CFA1C05D48A7270F7F835BF04A4194DA4CF76CEC66718C84CD020 +311 +D04C412AC848F03E3C61A1C8D50D0EA6838A00376054D3DF61A0E393E1F8B058A6C994093476D601A4A06F0CFD3C0A6BFA910E75CC10400A80FDA93AC9B5EA4303F6C0D188B559086091CC5910137772E14F2376D03181B5CFE74C0EA38440D0AC256D6C4D104CE05302FCC00B60B9CD4D71E08BD40C144A025E60D4C1F45F +311 +E846A2105D717EEA84808A5DD90A168E133640311CF05DD870768683F5D2F1800F485AEBE5CABD8FFA3C0BEB33702493AEB551B1EB035EF5C8E5757FA7832141F88E8578A363802B560007AF93D7D470B478C4D00B412D634C9140C4F9275C00DCE8DFE3C7F8C0AFBC5B2CE82E3C3BDF393D4375D50C43CD1C17E3777CD2C1 +311 +70725B7B42B41DF15BFC344DAD089C1E9118522B4A2C60B794E4E8F33081BB7C8CFCEEA0B2015E49D586429C6C78646180B7710E06018A3082243C275F077FBE412C17DE80D3E6B9462C5204C5D980D1DF84A864401C483CD01B143F4A4868087A0F780F37230200A4FBF6AED325114C367C22512750A5C7C3E32D545CE20A +311 +0904183BA10015DCAD89864B3E1EE97EBAE8B204266A48E010511838E2FE413FB116E60880C2D8440AC3880DDA6DF6618C138CF1CB2A09637E18D00F80CB0DC05322E31EADB8081C29410903F06BFCDF5AB46024E4A75828056440503C707856EF0C037623DD4922A400E8A6BD75E4D2800905F18450A00CEE88860C8964C7 +311 +B3F90F56528BA18F71CFBBBCD2D05797E168FC37DB26DBE0DD2EAEF39686C18440820013C1444055402A541400DD362A0A402F1FE51246404E098249FEE30708C10CA0B54601053159480C00BAA9B1223A773234FE72FD5C3BD81804D8D196FE3D5315A0C981D88D04FA01DFC185CA93F9120E1F480B08063364A0A318F08D +311 +F95056E4C91F1150D31B011200383502E079EE43CC18603AE2F88FD139C802A739F208E88D06DC78267C448C27C4113C19B0F51B0E9C1C021CF8F9167C6B1F2E10E461002910105D1042792D1CA303F469714C018C23D72179E165049C40E801CB96CF334562E5807291D1E0C70FE6CAD91656715F0E5C5E70F8D7F8329054 +311 +9B1BAA6F781D25180EBCA93EC84E72A74081CE3020789B3790E1A9E478E658C099BECFF01E530E80EC5FE31204ACFF70AF8177A03059240CD074978A002A878BF883FEEC81DD684E406CA630ACFDE87292822A11953710F000885D6F68A67ED40CD772B0828359B753F7CE23D9479AB9845771B389D6A77130F8C134EFC839 +311 +47392029B10E4425440A84AF0E54825228FC1634D369874739C837A9DDC83C20D320C36042610ECDFA750303710224D01202488012CA847424F8D53F78AB6BECE9B3B35A7F32396AC6B7444566327DBB4DF06FD9616744F4D3A397EB3B0A3FBA8D763702883ED742FE5CD24146D8E353ACCF811C806AE09914D8446E93840F +311 +F4D6C963FF32BFB6AB015D1D3B0C9A0968776F021F21404B6260CF84A14F35180CE20B5E85BDA2EC91FD5A7DBA7E5705F4F0F97AF26CE18E3BA078138202400A62930FA6CC7882F911A92F33E547E64990B0F27323D73B6222863F86425153FA8009361C675554C25382CE148420C8DCC47A20122806CA178A0918C14CBD33 +311 +440289078A00EC6070184CA9907FD0A1270478E0B325B67C2193694EDB7DD0F3C238447C8A11485562FB4902134E6AC952FD5320A4F7C780882DA9684285CD81D278C0E8FF8DEC9F45D22DC3C2CA99C2728110888799575B6834BF22B0F01EDE72D7F21B672C40F0A972999E2200B7C91403F9BB3D09C01990819238CBAE5E +311 +7510D7D57450507E3DB04AAA0A3C280064E0775380C8C16EEA4834346A04BF0CE847B4B3AF760D06D24BBB267C32E2C9257DE5EB748AD101AF1FD33265E2B674EED8C01A0AC901392211011AC810560F77778E85B13BAFE3E25C95B70919A4862C15928BD8989664AD8638101D009A80F00BDC41AF27602A4BDA0C077E5500 +311 +48E7F1011410F01405045E1C140B4D0E70E0F6E034171C3D6FD12004FCC1FA304312518910356628A4A326EC9ADF5DFFD1B2C0399503F14B4F8E3E0E4E39A06ABCB56A8014687E86E462BDDE5124615ECDB412B7314F62E6E0C76ADEC0F717B360E741960104CF1706CFA18E0605004B01AE007869B095ED92144A807841EF +311 +F2811C047889A04901C809062057192688C92346F97F279449F89B113500BAD282D1DA80A55C27EFFE02C8D4F395003F285B617BBF0831F49B055342DDDD414378E8888E92C16789F269A27C9A221FAA4A0DFDDB9F935B2ECC04DC51481558A69301E0460B02665AC4DD30C03D480866C3409400051811876014C0F294C542 +311 +821AB045011A3E3F09001FF304E3A0BED05CC11A811B865001769507FC01ADC611F400CF68C7B093606E30F3C7E0F00C1D10C31951C1E2D7252181DA00345842A19130715C736EC9ECE686A712FDB31E4D3E50AB336E5666D7B212C0113C4A4406029709B43D0228F3FBAF49921B19CA0C82A2D5BC4A2079809240F37D3E10 +311 +F9637607C3983F0458508A98B8B4EFC92AC13530180CF55359500080061DF59B98BB3FEACEE881DC8127F182A885A86FB12B43C590A4380504E32305E3148BBEEB2D2782029765428092545BA5C2C681FC5F8E869C0EE1034A822FF09A12C94084505AA868080303473F8161F7AA0A6610745E280BE4427FB770106F8800EA +311 +DABA19F453210435BDB2348471B13B65F2FCB554827632C4C44467333E4127095D22092ED492009930413251B5408345065065E415266E20279A40B3F520370BE2050C8360E6BB4601C1673B9BFE007EF5200B6483CD195400A783E6DEA0653515B0FCE8E86D1618FC1EFC15C2E727F24F2A2DAB57326D8D0877D4E298894E +311 +7A0C3C7D9CE8A0E2D17AA2020FA1097D6372F2A9F955060FDD467AD0426368C24A8340FD0D6687A76316DEF5179ED9042005A2BF02A5DD810A4DEFA4A8F700EFC50FF4FB8C06410F0303C106ADF8852ACC6A2CA9046E9ED070739339857222CC009E206479886EA26227BF7A341A15C351A8404A6C10080A2140FA4B4E8D9B +311 +9A11645899332363FD69887F436A660566964250FD752E787B64BCF8E6C8190DF8EA0C854C062D8A5A1346F810414313E606ECA0AC3A01D6928544029D5F42E202C0CB386F880F7842A31287061F32F3CBE09F2950783394F2F2B23D85386C6F51943E99DD10C8A0000BA9569A14805693274BD0E4F4DC3F28E331EEA91C4F +311 +33ABE057889BFB92819187840A08E57A276A8BFCB75B0342668C70C565C8059996D209C2800941A21FB82B2F520BC2E6FE6F1A8827043DE17000DACC8193E78BBB8DF1467978C06F6AFE986123E3A95272CAC122046F4C65C4B88FED2F1CD1D918F7CDBF8903BF1A90057D42F4DC133AF804ACBB58446A0DB78806FC053FA1 +311 +E45D0AF1112613CC0DD976C5E70AD3282F42725C0D02AC8588DE451B1C01ABF063E7748A3882F0DD484BB78D037F9812240EB88B6034C0AD53E5116D4C6D920C6A89F084E6D0598AD7EB6930CC7B293E27A666E5CDFE9A3FA52FEB3C97976FDAAE9A60008FCA6B33099CF9880D35D419FC687D424378E3099441E110C5B3C6 +311 +DC311E6653514A67A530D863326C4D8430E0C28024803B5B069B0E60C10EDB6DF087034171DF01F1F3404B27B1056D8C0E56E7CA6056E7798147BE4C2F01CED5987E413AC6A724876DE3F599E0601CE7B9CEF3BEB3671E12DCE8AF9631B8031D3F360B6955DC2342B2A0E4632A00264C0DA002220CFEC3E10D9BADC8904D88 +311 +DC51928593AA16C91DF6FFF82B3234404C7214D0F8608E0052283EFB2B0563F1D072936C4017706010BCF1B16CDE0C1FA9C777E44E1F5259B0C9BBC8794A82A6C182A3AF56B16921405351FDDC91B5BAAA617860E8D76C97C377FE701A4EB4378FA97C2C8E3CC8950886C6FD93AF70A1F5F676B7ED16CBC56AF5D09110EEB8 +311 +607CC08A795882358280DDB98AFFE7087C6EB593D62F041CDB4018935238E73F1098100D0C8769818F777057F64C703C6530E142FDF5C837AE1CF66C94C4887D3A3726AB990DEA248F73B5D32C8E04F6714B1E67C53FC52040252E605B322407CBF8C7F05453462A295ABF4D95592DDD76AC23512E9A2DF964715C80DD752C +311 +A8E263AC36F02C3C28A133EB22AC8D099BDEFDE28C3E8FFEE3815D5D00C17C00511058354D62443C1A546280E43572A9C661A34FA5891F8E7570608C8DF21DF51DF9D2A84D4501F41B8CD4F4C9DEB2F901E810C0E4CEB6EC08DFB06341C864CF8D0EEE779A606545E1E64AAF30A4324C20FDD3BD558BD966BA994FA915CD16 +311 +2B1978642AD01694E533EC190368A68234657085B5F88E27A0805E04B8BB6A00A51646EE3C10A50FF007FF410F1963CA69BE2002F0F902E701AEC995FD41F83A3F0C3809A3288A083003A6CC2A20E6D703EE48E3777AC07ADD51EB6101603A9FCF17B3D5928F6D742EE7E4CF38AE2B03C5FB39C81D7B2978FAFE85AF3D2710 +311 +B0582C970F0FEB0E4D1103B8BE2B4D560CA10002FC8F334C891C07B44FE06B2E3ACE5E1E2D1FC32203110ABF9CA0E8381F68EC3C06701328E5A38278A5FCD944CEA5283DA933DF2A2448BD23F1C5D8BE04CC2DC3B43B3EEC29F8B5FF926D11D3E97EBF7FA1BD1E5E5F5FE6D3D972F548547783146ECD84873F377C5820F7F9 +311 +FCE5E07378D6CBCB7E036DF7F7104079A05B77C6942D1BA95D47424BFC3DB6411009A42E207871B7EE9B06614BBD20F22F7523FB985F3F7068E37600273A3ED0C1CCC380F6EC4AF01CC1CF95E4848B7BF950AD14C44F10460221E02D21D01DAE800F323704C00035DFE97CB37F797D3D1C0E4FBF35EE1E5E9E0E879FBF3DF6 +311 +F474780A01FB3DAF01FE0C0798218007C2090A3008BA7682A338F4A8804A06CBFE6A80CEC766F49853F15B2F45FCEA3F8250012841315016E75E797EFEEC4ACA6C79F515CF1738F7C36E2406071051043817C9E8C5888D49D0332E800062FF54FA562BF7446CC0BFDFBF8603D1FEFCC9F7FFB5A7F000430755C2D3F72F2D02 +311 +A022820897ABDD44594475BDCCA4A10AF34C06B08B4AB58BBFAE30999DC66C7CE903A83CF8EB006EEEAA063430F84B05F0ECF644825F5E95073870E72A0771AB89B080022A0C5A9FAF34C89286257FB7BEA000EC65B59750C68E0815B0D9834B15606328F80709DE09018AC2A7817F83F96DB3D562C10A0A31300230CD4200 +311 +B87F85808BAF64D04600254047F9C14DE93464009E7F5AABB4FDD6D55142A2C0BF1541FCE19C20C899BF4F76AB54B84CB97F88F48ECC029FD253F0C70DF4816B9AC94BCBD653B1A283C4001A0337955E4AFED3FB790B6B1F5EA0B5514074103A38D84280EE0F5F9BE974EAB2D16AB1EA969684B6E4166CA28264B300474C73 +311 +08D20013B204A65F82970718D05678B3315D442E1C0A327E2F56556040C005D2FAB1326A68A07507C9E46A3648555A7080F5F50219A00E6222E3E0862CE95B5680930530742F1D041805E69B788161F015944D041182B861A2C17F3AF01CF5BFDF6C343F9171F5B004BF59C016719164B888EA206A02AD05E8464D06B48E43 +311 +81A0E9345FD171625AC22198F57C003BEA5510F81FF78D31C9B033D0030000000049454E44AE426082504B030414000608080051A1A55828BB58AF800100009E0500003D00000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F536368656D61732F436F6D6D6F6E536368656D +311 +612E786D6CBD544D4FC23018BEFB2B96DE15493C78601010A34B880709DEDFB52FD0D8B54BD70DF6EFED3AC0B12E6442E2716BFB3CEFF3D18E26FB440405EA8C2B1992E1C323095052C5B8DC842437EBFB673219DF8DA659866649B798C078B48AE6410122242F2A4994AC7F93815DF85C049C8564CA0A901499DD886B2EB9 +311 +B1E02448F358701A9235880C49A0119892A20C89D1B9FD768815CAD268CB5E0355B40B1E47F3E37A2020464BED06AA57CE8FCC20C3C3446D46761A2632A8C1283D07031EFF2AE7CCB1BFEEE916E406DFAC8E36FFD99A9D60A6944090EEDC3B670C7DC13DE86B6B2C5C240D6E503BB85ACD579D513F1B9F9A69DC9CC22AFA80 +311 +C426D40AF0B21EA168559156B6276F0F726A6BFF04DCD513A87A62CAD41FB24FCB2858B3952E3D852084DA25B9303C15687973CC8E8AAE11DF2836C38C6A9E765E8C1BA1BFB1DC29CDFE518C8B5A7655A4ED7E77291ABEB80DBD82EC866ADE1B8D05AF9E35CF09D7A061F38A986D9EC412B8F0F65E5D81534D9B231D1E5A8F +311 +E577A241F3A5FD01504B030414000608080051A1A558670136ADA9040000B41400003E00000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F536368656D61732F47656E65726963536368656D612E786D6CDD586D6FE3360CFEBE5F21F87BD3245B0E2D90F4905CD12E1F8A0C +311 +CDF5BE0A8AAC24DAE417C872DAECD78FD48BE3D44EE3B5C3E16E010EE75A34C5877C48911A7F7E4914D9095DC82C9D44835E3F2222E5592CD3CD242ACDFAE22AFA7CF3CB785A14C22CF95624EC66FC34BF253BA626D1BD488596DCBD8F2E6FC6335608B7F428D258E807664080A98384D9E75E22F16B2CCF05D32CE5023594 +311 +92C878124DE31DBE89612BB196A934605E44F272A5249F446BA60A11112D589CA56A3F898C2EE16F6B136C595C7AC3C2FF076D3D808BDBC824572211A961A8D96E393F7AF5806BEA91EDDFB1ABFB769EB08DE8BCDFE27EF98E9DE0ABCE3BFCA1C54E8AE777ECE2BFFC92A94C87EDE6A9111BA1ADE75C74BF391275D33FAAC5 +311 +FABF89F1D33C9836CB3225980B2A479BE96A4FB3D59F821BCF11CF1FC55602586C7191D99E2C9C0CF2B8A662E3484E59466361985485D7E248E7953C01F19DA23B9D256461B6E09C40FF02D1DEA98C19EBAFBA4659184B7D47DEDF22E2F53DB017721B164F5B845961697F0C699AAC2410982C385725A6361A500F59CD8482 +311 +21F103A8C1A7CA84A55F407794695C905C688E69B111550ACA946B9B4785FC1BDE0E229240B62665328986D5B32C400CEDD88188F35AC25EBCD40836F47F35E5C0EA4B6F767B50568CFFB5665C505E2AD5EA8A9997205F50A2350EAB32C9294B0024108429953DF32C4D812E226658F78A490408362A94987E6F787DFCBBBA +311 +BAAEDC36758ADEE9B58B41BF0F35D87BB1E991E02BF0B513748E6C0AA2EB2CE56EC68E97585643D82DE284E51DE03E4E22B00738761F1E66E1616A03EE093B0327B6BB9797262B0DCD72C6A5817ADAC1C3C0A3909CF6639B404D18B15CAF4B3C09CEAA4414BD5F0723F059ED37048E7A64271711EDC9C5230F58FBDA5DE00D +311 +A512CF04BA6671A0D201A83D2EC81D2EB552C7E5CD1BF9D6913567B2CD53A659AC362A2B200B440195E2ACBBD167A32A86F7874F7F00686DB55D163481DADE5E417E979BAD827FC6B2B0AD8A6AB1567038E466EB4B10C4C2F3F71196A09260938125FDAB8662456EAD68AB2F7C1DFF709C874887B76A4355564F017256531B +311 +F73D7D754A40E23401DA38EFC907CF8D8E3C1E5E7505D8E432C60BE1EDA01E5166683F169B6EAC6EC046153F66C2BE0679FD3F407982ABFA28F92E0E457501938D96B12090869079360D3F947CA8BBC3D9FCE1ECF3C676C9BE80EB67CABE004FC290F8E26BE6A0371AD6CE66781C408A1FAA8CFFA63DD93A94CD5E1F3BA6A3 +311 +DFB05B34E1247BB3949E3C332105035203136EA14AE89FF99E3E0B3C4EFE65C581A3A3D2D0EE84EFDB22B49DA31A07059E69B81628A8ED1228B63E42C3D840C3C01F460D1F331FE199821B03F22CCDB6DBF074B49566B12C3B3626074EA1B130B4596BDBFBB642A835954A9509E5769234228129889952870EEE13F494954A +311 +D7A27EAD09411BDEEC5B6B6AD752C11509F826EF4007E86281B1AE63750FD09DBA87A34EF4CE2A75F3E85960004EA6B519F4806609E8C91CD18380BD81691D9F2CB5730631E6DDBAFBC30E96D3E1D3D67EE8FB72BAD92AD4C1FD3CEDFBD2681858ED6583CA3853294B80AF67AECFAC6418D08164D5FD1E52E8B546BCC77B87 +311 +C6E9D1655FFD384FB26A28AADD82E04B9C64EBF78FFF00504B030414000608080051A1A5588DFFFC99640100009B0300004500000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F536368656D61732F52656E6465724D6174657269616C536368656D612E786D6CA5535D6BC2 +311 +30147DDFAF08799F5FDB600FADA20EA430D968A7AF12D36B1B481349529DFF7EF9A85A718860DFDA73EFB987734EA3D16FC5D10E946652C4B8DFE9610482CA9C8922C6B5D93CBFE3D1F0291A6B0D26A3255464182D920FB4233CC629881CD49C18508CF000E3EE309A100D61622AAB4A8A33B2483F11CB639C545B0E150843 +311 +8C3D3C0361192846DB7ACD198DF186700D182920B914FC1063A36AFBEE8FBA03FFD3CC1D1F4FC9E151A2AF59F628C5B7821D83FDFD3489305080F2EE04BF962195FB285E9D2DD352320A9E827AE357594914E42B1F5FE35F83688F60C4C91A6C946ED0668E8F244BC2EB0BA6E3BCCFC0B6A4B507F9F9F8D51EB315D9BA9E08 +311 +D308E89F96931666E577837E2B4172199C68C4FE306156D47DF51C698C7B9D97FE5BEFE2190C3C38BB054E6E8163FB039CB4B993C80BF18D969203116D6BBD26238B821F9BB909AD6D9C71B85BCD8C33D66FEA3D31B4BC0AD45BEA46BBEDDFEC0F504B030414000608080051A1A5580013BC14510000005700000047000000 +311 +30313633444138322D363133362D344237452D423146462D4642323035373337434135392F4173736574446174612F41737365745461626C654F66436F6E74656E74732E62696E536160603072717336323374D275333175D335717331D0B5343033D37531757372747472333737B61002AACB4D2C492DCA4CCC492C28484D +311 +2C4ACC4B4E050A82012F90744FCD03CA26072767A4E6260200504B030414000608080051A1A558C55C663656000000680000004500000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F4173736574446174612F53747265616D56657273696F6E5461626C652E696E665D8CBD +311 +0A80300C06F73E4B29FE6CDD8A2E82A083B8B7F209014925C9FBA3AEAEC7DD2555D896CB85E51C2A1BD834F6A1F56EC4494C4695278364ABB24ABD2146F88CCEBB89D5321FF8F3F43D672A3B44DF3CB6A1710F504B030414000608080051A1A5584BBD911037010000A20400003600000030313633444138322D363133362D +311 +344237452D423146462D4642323035373337434135392F4173736574446174612F636E782E786D6CCD94414B03311085FFCA12F0D8245D2B48C9A6885E7A52B078F036CDCEB6A1D964496645FFBD49BB07A5E2A987424EC337939747DEA8D567EFAA0F8CC906DFB03997AC426F426BFDAE612375B37B56ADB48A21D00F8C55 +311 +1E7A6C582933AD76318CC3546AB183D195AAB3FE30151F5242DAC0D6E173F7183CA1A7C42AE320A58625B3C71E388C145A4C07DE02019FF388298CD1609E44B6C769928908842DD3B5AC17337997CFA696CBB95CDE2EDE9528A456DB10DCC4DB7C590CC34D2DCDE95EA6A51205D06A8C76A2CA6B98FE4B25DF5AAF4426B54A +311 +14B32B53077D0DB90386C1590394CD13C110D22C4308BD1227582B515CF8E5C51376D6DBD2B2CED280427CC9023192C52BF4E43FB597F766ED13813778CD8E9C6BBCBC0FAFC75FF4768AE53137D79796738DDCFAEE025911C77592A353B68BFE06504B030414000608080051A1A5582A11BD14E60000006001000067000000 +311 +30313633444138322D363133362D344237452D423146462D4642323035373337434135392F5265736F75726365732F32444643323631422D463435462D344644302D393036362D4435464241414246373733382F7468756D626E61696C2F302F636E782E786D6C4D90416AC4300C45AF120C5D2676D22994C1F15C6256DD14 +311 +D7D1A4661CCBD872696F5FB9F5624020F1F510FA5F5FBE8F307C412E1EE32AE6498901A2C3CDC77D15956EE3AB182E4667447AC0C410ED01AB68B2307ACF58539736B8D91A9A1A7CBC77718708D9BBF7147731B8604B5945719F70D8C956C20DCA7DDA2CD9699E3214ACD9011F207F403FE03258824D98452DA751BD705D17 +311 +759ED5F9F9F4A665238DFE400C9DF79120637A5A94431E23FFA3B46C80D135FB4E3513C23C3CA7252F8D2E94D97F87E8273164530ADE59E298243A021A19027B68F90F1B2D9B5F6E7F61706FD9985F504B030414000608080051A1A558A233C2345D000000800000006500000030313633444138322D363133362D34423745 +311 +2D423146462D4642323035373337434135392F5265736F75726365732F32444643323631422D463435462D344644302D393036362D4435464241414246373733382F7468756D626E61696C2F636E782E786D6C4D8B490E80201004BF42E6EE76F3C0F216234B883063108CCF170C074F95AE5473F5C4C06E932E4F28601967 +311 +600677D21E9D8092EDB002539227A2FCCB80E1168D80A6417297A89C5D6963B7129A0D1E8F2EE73AA7B62BBEB8B27DE50B504B030414000608080051A1A558BE89762363000000880000005B00000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F5265736F75726365732F32 +311 +444643323631422D463435462D344644302D393036362D4435464241414246373733382F636E782E786D6C4DCC3B0E80201004D0AB90EDFD75167CCE820A4A845D83603CBE602CAC26799919AEEEE0D965E2E908050C6D0FCCE04C8BC355404EB6198129C92351FAD580A10E464065907C8D948F8F166375F655BDC3FDC3B4 +311 +E530A176BE7057BDC43B2A593FE403504B030414000608080051A1A5583C49B9847F000000A30000003600000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F5265736F75726365732F636E782E786D6C4D8CD10E822018465F85FDF7149AA26D809318EFE1121D0BA191B41E +311 +3F685E74F56D67DF396CF86C0EBD4D7CD9E039542702C8F87B98AD5F39A47DC13DA041B018C2FE7703E4A7CD702818045B6348CF03CD6699922BD459FF3860ADF4ADA695C4BA69356EB422F84A28C5AAD5721CA5EEBA4B9F8D7351F2FC7A794B5E7C01504B030414000608080051A1A558DD723FD60A010000550300003400 +311 +000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F536368656D61732F636E782E786D6CCD933F4F432114C5BFCA0B896381F7AC8969787470707251273784DB9614B82FFC31FAED85CAD0266E3A346180935F6ECE3980D87E7A377C404C16C34C46CAC90041A3B1613F939277 +311 +AB7B326CA58888F90C2343501E66D26422C53E6259BA6460A78A6BAAB3E1D8C507F41EC38B3E805764D04EA53493743A5255321A48476A545674A4111296A8A14EC8D6439FA023A80C86C8894FEB15BFABEB75E29B916F6ED76F8235528A7744D7791B32445C6E26AEB16E4335C4056B801425DA4EB514449EBBA3B50FC12A +311 +2145CAB1B6D0C9FCB554522D8BB35AE55A163B813F8C14AC85BD88FC0801A2D5D79AF9C2DEBF857E8660203ED59B8A56B96BCDFE9BCBBF55C04E3FA03E83F621E437504B030414000608080051A1A558E3603EBE7A000000C20000002C00000030313633444138322D363133362D344237452D423146462D46423230353733 +311 +37434135392F636E782E786D6C6DCD410EC2201085E1AB90D9DBEACE05D09878023D01A1D34A8419C380F1F82DA68B9AB8FDFEC93C3D7C52546FCC12980C9CBA232824CF63A0D9402DD3E10C6AB03A3397DD192872090D3406ABE7CCF5B5D18893ABB1690CF4DCF02282E5EA8A5BB96FFE536F285CB347F95BEFFE81C9ED5A +311 +FF9D5B1FB575BB00504B030414000608080051A1A5587028CBC47F000000A300000007000000636E782E786D6C4D8CD10E822018465F85FDF71448826D8A938AF770898E85D0485A8F1F342FBAFAB6B3EF9CB6FFAC0EBD4D7CD9E03BA00702C8F87B98AC5F3A48DB8C1B40BD6C6308DBDF0D901F57D341C120DB2586F4DCD1 +311 +64E631B9429DF58F1D12CAD975682ACC29E3F8A4C40D2BAA35D6AA22B560E232D4E76C1C8B92E7D7CB5BF2F20B504B030414000608080051A1A558CA1DF9C9A900000073010000130000005B436F6E74656E745F54797065735D2E786D6CA590410EC2300C04BF12E5DEBA70400835E500FC800F84E0B411AD13252E2ABF27 +311 +A55740421CEDDDD9B55CEFA7A117778CC979527255565220197F75D42A39B22DB652EC9BFAFC089844F65252B2630E3B80643A1C742A7D40CA8AF571D09CC7D842D0E6A65B8475556DC07862242E78CE904D7D44ABC79EC569CAEBA537E3521C16DF5CA5A40EA17746733E0B6615DE7217475F386F18B9481C510F1F021CD9 +311 +FF027EA0E1F5C4E609504B030414000608080051A1A5583DEE336E64000000790000001B0000006175746F6465736B2D64657369676E2D7061636B6167652E786D6C35CBC10E83200C00D05F21DCA56CA76D41FC96062B120735B69A7DBE268BB7777961F8D5AF396893C2ADB70FE7ADA196782C2DF776D7A97B5933C430F1 +311 +5651E5469C55D70F80A4992A3ADC954792C525AE70A1E4D6AD9816CC044FEFDF01FE3FDE907802504B030414000608080051A1A5580FBF3580F8000000960100003700000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F4173736574446174612F636F72652E786D6C8550CB +311 +6E833010FC15B477C0E6A1A0C8382240BFA0A7DE2CDB2156828DFCA8FAF9B50395DA53254B6BCDCECCEE0EB97CADCFEC535AA78CEE01170832A9B9114A2F3D047FCB3BC82E945863FC2F1A649AADB2870403258B35613B206EB4973AA1DA087980CC39E921E3CFF8E9C1F1BB5C59C1828F0CF72836C61F6C91052E761E2521 +311 +28714895886EEAA6A4053AA0799EE661CCC7EEDAE5CDA97ACBAF538BF2BA3D8D038E4D5C23522631255EAD3FD3B995CC4B01B4425593A336BEF70A9D313AD7CD0729139312E76DBCF9189AAE8BE3D2D613F38C947BF78F6BD8C4FFAE41695F5787EBAE7040715CF2D5A0A44C29C5F28A30D69428FD06504B03041400060808 +311 +0051A1A55871AE4488F30000008E0100006800000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F5265736F75726365732F32444643323631422D463435462D344644302D393036362D4435464241414246373733382F7468756D626E61696C2F302F636F72652E786D6C8550 +311 +CB6EC32010FC156BEFD8E087624598C871DC2FE8A93704C44189C1E251F5F30B892BB5A74A488B66676677879EBED647F1A99CD7D60C404A0C8532C24A6D960162B8A21E8A13A3CEDAF08B0685E1AB1A20C3C0E8E26CDC7648581394C9A8B152ED20F75E0528C4237D06F0E2A6565EF21812C3DFCB8D8B3B5F5449CA178FD1 +311 +18B5DCA55A26377DD5CA011BF13C5FE67142537FEE517BA8DFD0F9D261D474876924A9491A4CAB2C6634E8F567BA708A072581D5B86E11EED27BAFF191E063D37ED02A3319F5C1A59BF7A1F93A60C9EB85FE718B9BFCDF2D6A139A7A777B293C3092967B3618AD723AA93CA34B3527C9BE01504B030414000608080051A1A5 +311 +586F710482F9000000960100006600000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F5265736F75726365732F32444643323631422D463435462D344644302D393036362D4435464241414246373733382F7468756D626E61696C2F636F72652E786D6C8550CB6EC32010FC +311 +156BEFD8E087124598C871DC2FE8A9378A89836283C523EAE71762576A4F959016CDCCCEEE0E3D7F2D73F694D629A35B2039864C6A6146A5A71682BFA123646746AD31FE970C32CD17D9428281D1C99AB0EE9030DA4B9D506D46B983DC39E9211373FCB4E0C45D2E3CE7C147857BE42B170F3EC99CE49B8ED110D4B8B7AA31 +311 +BAA99B9216588787E13A743DEA8F9723AA0FE51BBA5C1B8CAAE6D0772492A4C2B448CD8C7AB5FC4C1756722F4760252E6B849BF8DE4B7C22F854D51FB4484A469DB7F1E67D68BA0E98BF87E5537335D36263FFB88675FCDF3528EDAB7277DD3A1C3012977C118C1629A5585E11C69A1265DF504B030414000608080051A1A5 +311 +587B1C939B0C010000B10100005C00000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F5265736F75726365732F32444643323631422D463435462D344644302D393036362D4435464241414246373733382F636F72652E786D6C8550CB6EC32010FC158B3B36F8DD0813F9C5 +311 +17F4D41BB28983128365A0EAE71762576A4F9556DAD5EC0CC30EB97EADCFE853EC466AD5001C23100935E959AAA501CEDE600DA22B25BBD6F6170D448AAFA2010106942CBB76DB094D5A59A102AAF42C4E901B232C88A6A71F1A60A6BB5879CC9DF50CF388373E3DF822621C1F3C4A9C93F32995B37F4DDEA4D8016DD1380E +311 +63DBC3BEEE6A98572983DD5020981555DF62BFC4192249105362E5FAE33EED825B31039AA23487A8F0F59EA20B46972CFF2049605262ECEE6F3E4DC3759E3EB03E2D7107595E3098B301C1375496702858D7B61DABAAAC26C921FC63E8B6F97F432795CDD2D3F0501840B1FFFF6B41491202F4ED95AEEF216CFA0D504B0304 +311 +14000608080051A1A5589BE352DDF9000000960100003700000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F5265736F75726365732F636F72652E786D6C8550CB6AC33010FC15B377DB921F240459C171DC0F283DF526E48D2B124B468FD2CFAF14BBD09E0A821533B3B3BB +311 +C3CE5FCB23FB44EB94D11DD08240865A9A49E9B983E06FF911B23367D618FF4B0699160B769060E06CB626AC3B248DF6A813AACD843B289C430F997CC44F074E7EE0220A117C54B87BB10A79173316B4D8749C85A0A6BD554DD14DDD145AE03D19C7EBD80FF970BC1CF3E650BDE4976B4BF2BA3D0C3D8D24AD092B5333675E +311 +2D3FD3A545E171025E91AAC9491BDF5B454E949CEAE69D9549C999F336DEBC0F4DD7017F45678295E858B9B17F5CC33AFDEF1A94F675B5BB6E1D0E388D4B3E09CECA94522CCF08634D89F26F504B030414000608080051A1A558E02AFB9CF7000000940100003500000030313633444138322D363133362D344237452D4231 +311 +46462D4642323035373337434135392F536368656D61732F636F72652E786D6C8550CB6E833010FC15B47783CD434191714408FD81F6D49B651C6A25D8C88FAA9F5F1BA8D49E2A595A6B66767677E8E56B79669FD23A65740724C790492DCCA4F4DC41F077D4427661D41AE37FC920D37C911D2418189DAD09EB0109A3BDD4 +311 +09D5669207C89D931E32F18C9F0E9CF8900BCF79F051E11EF9CAC583CF3227F9AE633404351DAD6A8A6EEAAEA405D6E371BC8DFD8086F6DAA2FA54BEA0EBADC1A86A4E434F22492A4C8BD4CCA857CBCF746125F7720256E2B246B889EFADC46782CF55FD4E8BA464D4791B6F3E86A6EB80BD6E7B3A5AECDC1FCFB04EFF7B06 +311 +A57D551E9E7B870346E28A1BC16891328A650B30D69427FB06504B030414000608080051A1A55841C4659C02010000D80100002D00000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F636F72652E786D6C9591DD4EC42010855F85CC7D5BE8EFBAA16CB66A9FC02BEF10662B +311 +D92D34851A1F5F6A6BD43B4D482087EF0C9C197E7A1F6FE40D676F9C6D81A514085AE5B4B1430B4BB824072027C167E7C20F0C889523B6B0CA20F830BB65DA25E56C40BBAAD669DC45E93D0620EA160F2D78F58AA34CE51222E1AFE924D5550E98B274E3040F66FCB2AA1965400D22A77999D02AAEA79C1E193D16E533CF56 +311 +52F0C5D850E4FB6338BEA0266E0A311288AAE0D9761DB1C5E81D323A7ED25C0CCE2028AB8B87F3214F6A56D449D9358F49C7FA3EE9BB9C564DD1DC9FABBB58249A05F7618EADD98BAC4DF8AB7D33FE8AB64CFA9FD1368707C1BE43656B9F05CF3E8710F77526E203504B030414000608080051A1A558F1E0A43D07010000B2 +311 +01000008000000636F72652E786D6C8D50CB6E833010FC156BEF80792951641C1142BFA0A7DE5CEC502B6023DB44EDDF771DA8D4DE2A595A6B66766776D9F9739EC84339AFAD69204F291065062BB5191B58C32D39023973E6AC0DBF64408C9855031106CE4667D76587066B8232113556AA1D14DEAB006498F0D3801F3ED4 +311 +2C52B10654F87BBA88E12E4695E6E9A6E32CE8F9A775704A04258117B4A8125AE37B2DE829A7A7B27A63595472B6AE5AEE565AA2BBBE69E580B7B4EFAF7DDB25DDF1724CAA43F1925CAE354DCAFAD0B53992794959169B39F3C1E1CEFB10CC1988178FE8CBB28DE2ECDDDA6917602849AC99BE80E38448FC09BD2EF21FA1B5 +311 +0965B10FDC3A3CF01C033D09348E17C4F23C2FD6786DFE0D504B0102140014000608080051A1A558F87EDA772A010000A80100004F000000000000000000000000000000000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F4173736574446174612F446566696E6974696F6E +311 +4974657261746F7250726F706572746965732E62696E504B0102140014000608080051A1A55819998300460100003002000045000000000000000000000000009701000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F4173736574446174612F496E7374616E636550726F70 +311 +6572746965732E62696E504B0102140014000608080051A1A558B5A795FFE3790000DE7900006B000000000000000000000000004003000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F5265736F75726365732F32444643323631422D463435462D344644302D393036362D +311 +4435464241414246373733382F7468756D626E61696C2F302F67656E657269635F706E67504B0102140014000608080051A1A55828BB58AF800100009E0500003D00000000000000000000000000AC7D000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F536368656D61732F +311 +436F6D6D6F6E536368656D612E786D6C504B0102140014000608080051A1A558670136ADA9040000B41400003E00000000000000000000000000877F000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F536368656D61732F47656E65726963536368656D612E786D6C504B01 +311 +02140014000608080051A1A5588DFFFC99640100009B03000045000000000000000000000000008C84000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F536368656D61732F52656E6465724D6174657269616C536368656D612E786D6C504B0102140014000608080051A1A5 +311 +580013BC14510000005700000047000000000000000000000000005386000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F4173736574446174612F41737365745461626C654F66436F6E74656E74732E62696E504B0102140014000608080051A1A558C55C66365600000068 +311 +00000045000000000000000000000000000987000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F4173736574446174612F53747265616D56657273696F6E5461626C652E696E66504B0102140014000608080051A1A5584BBD911037010000A2040000360000000000000000 +311 +0000000000C287000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F4173736574446174612F636E782E786D6C504B0102140014000608080051A1A5582A11BD14E60000006001000067000000000000000000000000004D89000030313633444138322D363133362D34423745 +311 +2D423146462D4642323035373337434135392F5265736F75726365732F32444643323631422D463435462D344644302D393036362D4435464241414246373733382F7468756D626E61696C2F302F636E782E786D6C504B0102140014000608080051A1A558A233C2345D000000800000006500000000000000000000000000 +311 +B88A000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F5265736F75726365732F32444643323631422D463435462D344644302D393036362D4435464241414246373733382F7468756D626E61696C2F636E782E786D6C504B0102140014000608080051A1A558BE8976236300 +311 +0000880000005B00000000000000000000000000988B000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F5265736F75726365732F32444643323631422D463435462D344644302D393036362D4435464241414246373733382F636E782E786D6C504B01021400140006080800 +311 +51A1A5583C49B9847F000000A30000003600000000000000000000000000748C000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F5265736F75726365732F636E782E786D6C504B0102140014000608080051A1A558DD723FD60A010000550300003400000000000000000000 +311 +000000478D000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F536368656D61732F636E782E786D6C504B0102140014000608080051A1A558E3603EBE7A000000C20000002C00000000000000000000000000A38E000030313633444138322D363133362D344237452D423146 +311 +462D4642323035373337434135392F636E782E786D6C504B0102140014000608080051A1A5587028CBC47F000000A30000000700000000000000000000000000678F0000636E782E786D6C504B0102140014000608080051A1A558CA1DF9C9A90000007301000013000000000000000000000000000B9000005B436F6E7465 +311 +6E745F54797065735D2E786D6C504B0102140014000608080051A1A5583DEE336E64000000790000001B00000000000000000000000000E59000006175746F6465736B2D64657369676E2D7061636B6167652E786D6C504B0102140014000608080051A1A5580FBF3580F80000009601000037000000000000000000000000 +311 +008291000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F4173736574446174612F636F72652E786D6C504B0102140014000608080051A1A55871AE4488F30000008E0100006800000000000000000000000000CF92000030313633444138322D363133362D344237452D4231 +311 +46462D4642323035373337434135392F5265736F75726365732F32444643323631422D463435462D344644302D393036362D4435464241414246373733382F7468756D626E61696C2F302F636F72652E786D6C504B0102140014000608080051A1A5586F710482F90000009601000066000000000000000000000000004894 +311 +000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F5265736F75726365732F32444643323631422D463435462D344644302D393036362D4435464241414246373733382F7468756D626E61696C2F636F72652E786D6C504B0102140014000608080051A1A5587B1C939B0C0100 +311 +00B10100005C00000000000000000000000000C595000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F5265736F75726365732F32444643323631422D463435462D344644302D393036362D4435464241414246373733382F636F72652E786D6C504B01021400140006080800 +311 +51A1A5589BE352DDF90000009601000037000000000000000000000000004B97000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F5265736F75726365732F636F72652E786D6C504B0102140014000608080051A1A558E02AFB9CF70000009401000035000000000000000000 +311 +000000009998000030313633444138322D363133362D344237452D423146462D4642323035373337434135392F536368656D61732F636F72652E786D6C504B0102140014000608080051A1A55841C4659C02010000D80100002D00000000000000000000000000E399000030313633444138322D363133362D344237452D42 +311 +3146462D4642323035373337434135392F636F72652E786D6C504B0102140014000608080051A1A558F1E0A43D07010000B20100000800000000000000000000000000309B0000636F72652E786D6C504B0506000000001A001A00210B00005D9C00000000 +310 +504B030414000608080051A1A558000000000000000000000000370000006662782F46333343314631312D433039312D343442382D393038332D3537363542373941374146442F617474726962757465732E62696E504B030414000608080051A1A558000000000000000000000000350000006662782F4633334331463131 +310 +2D433039312D343442382D393038332D3537363542373941374146442F76657274696365732E62696E504B030414000608080051A1A558F270F1330600000004000000360000006662782F46333343314631312D433039312D343442382D393038332D3537363542373941374146442F747269616E676C65732E62696E6366 +310 +60600000504B030414000608080051A1A558B5A795FFE3790000DE790000420000006662782F46333343314631312D433039312D343442382D393038332D3537363542373941374146442F7265736F75726365732F322F305F67656E657269632E706E6701DE79218689504E470D0A1A0A0000000D49484452000001000000 +310 +010008030000006BAC58540000000467414D410000B18F0BFC6105000000017352474200AECE1CE900000192504C5445818181B3B3B35A5A5A4848486060605C5C5C6464648383835E5E5E6262624E4E4EAFAFAF4A4A4AB5B5B54C4C4CB1B1B1858585B7B7B7585858ADADAD7C7C7C464646787878ABABAB747474A7A7A768 +310 +6868707070B9B9B96E6E6E6A6A6A8B8B8B666666545454565656A5A5A5505050A1A1A1BBBBBB8F8F8F9F9F9F4242425252527676764040403E3E3E9B9B9B7A7A7A8989897E7E7E9393939797974444448787873C3C3C727272BDBDBD3A3A3A6C6C6CA9A9A9A3A3A32020209D9D9DBFBFBF8D8D8D9595959191912626269999 +310 +992222222424241E1E1EC1C1C1282828C3C3C32C2C2C2A2A2A2E2E2E303030C5C5C53232321C1C1C363636383838343434C7C7C71A1A1A0E0E0E121212484A484C4E4C1616160A0A0A4A4C4A787A781414147C7E7C9193915E605E464846838583878987B1B3B18587856668665A5C5A626462818381A7A7A5A3A3A1B1B1AF +310 +ADAFAD7072705C5E5C9D9D9BABADAB7E817EB7B9B7585A58BBBDBB4C4C4A8D8F8D747674B5B5B3B7B7B59FA19F606260ABABA9A5A5A39B9B99A9A9A78F8F8D6C6C6AC7C7C5451AD12700002000494441547801DCBD89771BD7B5A70B8EE04C702641712605CE034890E220088028C93245451215B713AF388E7DFD9EEDB8DD +310 +CE6ABFF4B57D97137BE50FEFEFDBA74049B6AEED74869B7E87404D2814EBB7F76F0F67A8835CEEBFA0E42B854AA5B2BB5B6BCC951A8D52A93657A914FE0BEEE39FFE2FF395B9B9C6CAD2D4C4606F4B7FFF8D1B37EEDCB97587F7CD9B4343BD134BABE7DB48E3FFA7A228ECD6F6574E4786C0FC8B5FFCE2CD5FFCE297BF7CF3 +310 +CD5FFC92B52FFE58BFF9E69B776E0EF5F79E55CBBBF9FC3F5D3DFFB07F5898ABAF7CDA3B74E74EC0CE20230561BF096E97E05712BFFCC59BC80539DCE83DDD6E54FE61B7747DE17FB8980BBBFB2BBD4337DF487881AAE6C5ACC6AF25207877B2B527BFF1CB3B77FA47561ABBD7F7FA7FE146A5B6BD74E3164C7F51449AE95D +310 +B412200EC539418717E7F2F11B376FF62E95FEAF1442BED0581DBCA1BD2780D23F506AFA16E1A7AD974EF17876F00DD7BCB187A1A97AE51FCED5BF2BC1F2BBE5B3C19BE27B43CF26DE00933658FE129B109C2FFF922CC22C4260FA01BEFB462A77DEBC35F42F600C3F5B0795D2E9E02DAD5E650B4438A92801B65C35CBAB7B +310 +1EE5041CE69D3B6F1822DFB873EBD6AD3B6FBC71EBC6C86AE967DFC2DFA4CEBFF1BF54F6276EBC114E2F43FEC60B01A0D440A868B2920E5C4BC10D60931ADCB871F3268B21D3851B08E1D6AD9BFD4BF57F7577909FAB86F29B982571136AF01DF5FE32AC3BD9406CAAF2440A54CF176EDD01FBADA1FEFEFE21FE4C9858DFF4 +310 +183458A9FD2B6708A5A5A137E0EE1D11A9EC0C7C58B2C73C0AD6B479BD76B7790CF899E287FA5B06FB7B07C9195B7851FA8794031EF1FC5F9406BBFB23375420286399B631E93B08022A785C4DBF9996EC3551874094D71B6F487E80F6837E50F483BDBDBD83232323AC420A18C68DA196EDDADF68A77F938F78FD972BABBD +310 +B7B87FB164AC6FC2CB760365821ACB74AED44FFAD7E7431ECD7E08AC421F391D199998989A383D9D98E8E56F84A318C58D9BFD2DAB73FF5222C8EFAEF4DE7AF30D756E5108683DA471E70D0502099A7240F19E4089D3FD203E620F1B47BF43501E85031AE44B4B9F2E4D2D9D4D51D8970983FA861B3706FF950CA170DE82F6 +310 +B312CC4F42C8966295F7D725ED29882415DC055F36DEA1FE96FEC141493F05FAA9A9A5A595B333DED5B3D5A533F62183323032F46EFF13EA0AAFA5FBF7C8976F8C10F7280A014832593B90004D52341980D907EAEB73411EB2F1EBC9F507F92746C40E7AE0AFAE54292BAB2BAB67CAE0746264A277B06508168C94BF772BE9 +310 +765F7BF0B548FE1E07F3B5A521340A5CB5297C4B12811B89E82191ECF3E41B3259C529F135E23CF4C7F961FB13537F5A02ECCAEA76B5BA5D3D3FDF3F2FEFEFB3AA22053E5008833428DC6C59FA2F770595F311F235D427F379BB8A121BD901B96076A388DC4C3C61C7933CCCD770FF375A6E0CE9F535FE2534BF5ADD3E3FAF +310 +D71BF57AA951B6D4CFEBFB8864758A26154430080B06ABFF557610ECC93726224F155D1471041E0D42F82F4891C926C1355B0831649FF365F46FF05300A7A790BD8ADEEB0D4AA9569A9BDBADCCD56AA55AE377F5F3F3EA2A34983A1DE91D810543138D7F28E57FF4E2B5335A3928B76EA1CB9B00BF158C8F63A2E788826896 +310 +D0B5E7C461949ECE089144F8EBEFC7FB4D8C9C4E9DAD60F7FBE572B416C2F2423ECF8B86C439E450DA970634ACFDA977629098D0B2FAF313A36B3869E37AF7853378CDA1171FBEBA95DF1E44FD5144A420588641B0055A79ED91CC0DC41E27064512FB33F1F04D09D0D2DF0203A646A6CECE80DF28356A348CED8C4F1EF137 +310 +B9319E1BCD29867CA556AA97F7B757567006A447FD375A26CAAFDED9CFDCFB2BB0BEEE8AA5911BC2C7F85DF88A3775389990AA72219D582409210F85A4E66F2987D875C30848023088FDF77E87F96FD7CBA5B9DCCEF4F4C9FC7C676777577B7B7B67E7ECCCE4E8DEE85E81A6D55AA3BC7FBEB242589CE8ED4770E785D7DDE2 +310 +3FF2587EBF57F50B9E820527316488E5C32D50F979BCA58207297E2B6D658702FFCD211840FE43FC9F3A5BAD9E97E6F21B9FCF16BBBB3A3A5A175B5B1787875B5B3B86DFEFFC687A72674F19D46A8DFDF3EACA59E405375ACE76FFA922C817CE86A89BDD92F400F2C55B7462F610459837D3A61ACF50C7471C8F2F2A9D38C3 +310 +DA2F068007F80EFCDBFBE5DCC674B1D83EBCBEB8BCBCBC3ED0D3D333D0B3DE33BCBEB0D8DA35FBF9F8CECE68AE020BCE61C112A4C1138CD47F9AD13F7DC6AB9CF9CFCFAF9D0E01FFE6CD503F5B91C5218E2899CA15098714848B04FCE5654884ABF0E554F11F6C21D73D5D5AADD64B7B9327DDAD8B0B7D7D6D6D07070763BC +310 +0F3E38E8EB4310EBEB8BC3DDB347E3E37B5842B97C4E44A0C630427E5CFDFB71E03F471E12CA9FF70E055AE141042DD81234B879EB4606361D9328149037D7D76A571A7E974FA20AD0323832713AB5BA7ABE3B3E3D3FBC30307070B0B9B645D93C3CDC3CDCA41CFC6AAC2D64D0D579B4B1B397A7C1BDBEBD7D36657A3CD4B2 +310 +F44F4909F2B9CA597F4245C59DEC354316F0587020D0C661742BC02869435FD12CF195C422DB3C5A3E2305C000CE6B7B27ED8B7D63079B5B5B878787C787C7C7C757C76C51B60ED60EDAFA06D67B965B3B672677080BB5329E60E9B477847AE2E9EB53E35779FD37EFCD2D0DDD68AA355B6B0D81860502B8B68C801F5C697E +310 +9AD62F4B406244CB975560BAC756AAA577675B07C6D03778C17E7C95CAF1B3ABABE3E3ADADE3CDB1B1B6B681014470343EBA979F8B90383545727C63E43549D14FD0F927E5F1FDEFD7263058FE02EBCD1BDCBCA053496BD58E69BC44F9F854D4D979AE9ADB908824382AC1D4014E9756EAF9CE85B6B54DB01F02F8EA5908E0 +310 +D9D5F1B3E72188C3C3AB67879B07C8A0A767B8B831FE5E7EB754DEAE5261460243FFF07858D8EF0D658BDC563A2C5EF5833C13C90B69248C4DD97842B61DFA7F210A2F6108A0F96B62E2D3B3F3DD939EA47E30ABF5AB2B903F4BE5F9B36757CF65021E616DAC6F60A1FB647274B4B05B2E5341B082D43278F67D8DFDA48AFF +310 +9A13F22B34C7586C9992BA6E66CABC190E313E7C811AA57304B421A75B289B9D174CC868C24548823E230B9A5A2DCD2CAFE1F98E61C015CA7E96B083FC59F3ED06EE60F360B3AD6F79787ED278D0A86FAFE00BA9220EAEFE1D5DE1F7855939C3FCC1332426B377F692406E022C010DB437EF009803F0DCFD3B7C94440571D8 +310 +F2C328F115F47FD324802070BAB43FBA80EFDB92FCA1F7E7CF9FA875CBB327CF9EB08C4DE4815BC4210E2CB7CF1CEDECEDCED5B757490968286899FAF95583BF46F9393CEE6A86D6F618CAAD9BFF0BE22B042412C5CFB50556815CC5BBE33E9F61ECEC26A9BCB8145FD10590078F9C9E953B513FAE1FE387FAC246E14F9E3C +310 +E7F5F8194BD6594140876B6B84C5D6799C61A16434201E5237582AFD75C07EEED9863F463284E2E13425A036BD41061259289B6BDC1ED656FC8B8592C9D00701E27CEA749F0D8EF44EAD8C1F80FFF8F8F9D513191F6803384C800097F24069C407CFAE88136B7DCB3D5D4A60B711F19070D83235F77331FD35E71596688903 +310 +8E2E0B346EAB7936C4162043E1A1F144093695443A570144898BC4079CEF1912809A3035A1D3F361235F90FFF1E3E0FB93C7E2750719F88E7D8E68123883ADB5B18185AE99F1D11C1238A792DC4BEDE8EC6FF503DF377E0445F68FAF4E08D43082D02170F30131A154206CC559A8D9CFDD762B31273E4947A581E0D9BB71E3 +310 +3FFA07CD02CE2A6BE1EC80167497F2A81CFA3F7EFE58D0CF5D5D170DE4F89070B0BC4040CC17BEAC6B0586C3D3FF0309BC06F44B04A1E13729929B4DF73C44070692C810B08AC3012E8EE9EAE22067796288C193B2139B970B86F47FAD0F98382B1E035D9C32FD318A4FAFCB274F2E1FA772F94411B0CD42493C23393A685B +310 +5FEF3E1ACF554AF5F3552A478383374E6B2FDDFC4F6DFE38F4F4ED7A7FE838F488EA852482F412D3CB07E293D02C9F074F12E84C5AAC423271450572A385449844706475FD38DC3C22486A0639E5F1E38B0CFE93CB4B25910EF309A2224BD8DAD40C682C28341AD69047E8539A6AFC14EC573F7FAD10AE0FE6EB13E87B28E0 +310 +93B513B5803514DE408809BC12A14876DE0A25F643009E9176D9F0C330164285A7444DC8CAF0E9FE41429EE0A2F6A6DE91C0856C501272404A8468822E24C807030B1D33D40D4AFBDBABB411D093D88C86D7205E05FC57EDD1F805FA4CED5920F0CED39157E007CE21757C5DE440ECBCB46CD283E378029B43FB077B4F47E6 +310 +0E9F61E8D01BE017D7E843EB49F50A2028F1E442FCC90C9EE308E4C0C2C94EAE30B75FAD3A0EAFA57FE9EF960F14BE15638840EAF3BA490BB6850EDB38EECAFD21A0C746D0C4234DBD035EFC7EDD121FA585FAB73DB89FE6A03CF833AB0730E5E2F1A36CE3F202A128934B44E396961121E1F2C9F32BFCC0C140CFE22C1CA8 +310 +E109B182919696BFB98120234F61B59F7BF46EC30CF067B21A33B0FB3E402448EE266CCD93135A8E823DB31F85E677434E608F53F8100BC0098EA2FD6BC01770E0F2F2D1E5452A711C4BB8486248FAD756D852026B6DC90A2AA5C6B69E9068B8F27AFABFFEE8AB36F1D23985D5960014FD711940800B560250D2272CC54FF1 +310 +D3A660B275AC3881E349689C1616E1E9044129D032313509DE4700BC867C71F128C400159407C761022BA8A040F40A244788808C60B3AD67A17576279F6F946923191921B0545FC2F12AC0EFEFBD7262B6935679FC7F80629160ABFAEC88E8430E76D82A8DE62ACE50BD4A42FBF03B387B37FD321B37E31C3F063D99703F51 +310 +60E6C9E5A300CF32A91E0A085A29C0FC507F6C21012303C6104B82C1F1E156DB3229D1A855A32A8352C9077AF733A0AFE0FB3EF81FDF2F0F82C21B0EB06998866878B103305E31EC17F4FD43831E570A2118D1667632D4FFFFB125782F96168A833DBE78C3F11F8383A79D49F58F1E3DBC780417AE6581381E8610604888E2 +310 +913E12492881274822C221AD04CB0B1D273B8542837460898C686864FF6F801E8269F40AD0481DFAF5E6E9C1F3BE391C325004DF0746A4E4448F7B52C0D5EAD39EC46896B888C4210D68E99DFA2820DF7FF850EC407EB55C3EBC5028611409BFCB8889C90F1C52355AEF98B18100094C9D0EF6F64FD47E5CBF3FF5293DDFB4 +310 +B50DDD54F351446FA1F14580DC3902C085F593CB24ACC917B213BBC11B3F0A61042FD8B24F4FB9C4556D0CB9E1A880DE89934CE9607F18F81FDD950DD0E1D143F41D56110E227C250621FF098838042BC85B5B6BCBCBC31DD37B34966E9FFD9936A2FEFEA9EBA4182E5CD3E17AE35501FCE0707E5525A7DBC64DFD077825BE +310 +37CE0BBE1BBEC061410C660B6E49912665E2B3749C7C9F93834022F74CDE6CA5EB501D9CBC04B768292C5CCB84478F3CA83074092C6082169015E5800D5839DC6C1B58EFE83ECA513BDE3EFB8EF1242D2D4B3FD55AFE03D42F8492AF8A3F21444FA2FA9ABBF525EAF84C09F0168527B0138A85D1EC0443C467B28BF844EAF7 +310 +6323BE13D7C11F72FED783837B970FEFDE7D7817E077C17EF7E2A1C2C0FE851FE4C008388C15E818958746129E1009D054B67530D6B3D8DA3D59D82D9D57CF70039FF50FFE0DE94089DB269C3655A4F25B38C49D0BD48E59F1526887C18FC5272197F85CA72862A593A4843CD25F920487DDF7AA0441A2C0600D062001F103 +310 +FCEEA3D8560CEC3EBACB01CAE5A51E420349F602191E5F901893142381351CE17047E764BE50DEAF9E4D8C38B6ECFFACEB141E54A6865A88A60133EE9CBB4C256930B0B168C1C3AB59FE1743FB422C7166082E934AFA5EFA3E4BCE0B69362FA7041818B7FDECE1DDFB4D022007CA23E521F0700AAEB5888BBBF08023E128B4 +310 +045381542FA256B0D04E28A0C3804E233A1BFB476A2F48FD135BAF9843BEDA3264EB42BA499601F16B566E72C7EA35908ABCB9176BBED43204C696AFD3D7B24B08D3AFA44BE243D88A6D9D0B6562B52F741E1610C0EFBBAF2B0829289A640EC4C8A4FF66A24430786CEBE1E1E61AF9507BFB496EAEB64F8F49B4129EBDEC06 +310 +5EC1F8A3F228A3CD0950883B41BEC6D1944AE06147289600A7726313AC69A3F91197F1438BCB743E76F01F6EF1D1C854071670FFFE43FF1EDED702EE5A14C85D0C42DF90B86068800659AC88981855E3E774A71C0CAC2F76754EE7CC87C808D1E1E0F6CF47FD4224731337BE1E39C5010823EE997B1491BBD99FC8D8EF7748 +310 +2BEB5EB2CF66499A8E0F7511B19B3EFBDACB6507BC78731B1B383D02FFDD7BE8DD9256F7D0BA7B46015941097B80018F700FFA024CC08078F51806100ADBFA163ABA8A3B95B9D2F92AC30BC908ED31FABE0CBEBFFF0279B675868F9AA24E9530B08C174055B7F48E4F58002F3E82F0BDFA003E8B431EB6C4A91E4D9B5FFB79 +310 +1265BA8827BBE5F1BCFA7F789F72F75EC800F8AE43FFAEC42F13009FB905A9A0132015D0068ED7682AC608BA6771038DEDB3B33082891FAB1ABF5614F93238079726B833958796B845B731FCB86316713C1DC581B1E19B424EE32674093F80776F7E27C6FBFAC85C536CD955B96EDA2A3FBF770FF4BE11845470EB3E42D022 +310 +000E0FE07D161811020742162444668308801E133A4C163BE68F6826A5523071CA78B2FED51F28F8C70FE4190073A3E5D3259D7A288CD19BDE623F10021BAB0C6E327FD507B2741627727EA00D31856492F9F009D7F152D930704E642795C1C1B336E0DEBB7F0FDCB79318543B25341F36802D64A981A690B94259607DE0B1 +310 +9D466BF8C1C5E1CEF9A3FC5C639FD6117B4BAEAB453F8EFBDA500A67E8BAF76C8A06566E36EE1184E8329419161F83D843D5DE7D8221163E145F56921C3EE383978072129E290A9B7166E63D26BAB1FCDBF710009E4051842390031845F20077CD079407C575F20364C4910ED2A574BC357630B0BCD8DE39335EB175646A69 +310 +8458F6A346F003A93002E846FFE0C459B8006E506D79BF902908A0AA05CB5E73530E33BA1D3C2EF99C712B7C8B41DF4D2A7830BE8707485FCFAEEB85A09AB6D39BBF7B4F23E00509C20DB04E240822A4B810E04D8D53D10D504C059ED86BB8697F514777717A8F8144D48A4C89077F7EDB00E2D89DC02A7B975640A282C49A +310 +4AA84B70B12BFED8EA6584860DFB7EE23FCB00C6BAF7332FF259FA3C9346508813E372F1DDE425065BB61FDF8300F7EEDDBE8D0C6EDF46F7D8823478590AE23759D60DA6B7A9F125EDE8F4A5D2B37470D0B63C30DCDE3D3D59A8D1501EB1B0A5377517BDD6E301F995E3F955F0F58FAC2E81CE172A8344AC03DC6781939D24 +310 +84B8FFC15E8F3ACCD3954CE19576B942D0A029188EC7013FE59AE90B71292DE774F1F63D60230180B30A2EDC65291B6211B4081128856001A680015CE000708254891851D4B3BED0FA4D7166B466BFF1D2A924885AD12B387FC0FCE6819AC3AE06A7AA4B715F0927B74D119D4A668FB54B8A8C268D8B038A207D10A7B1E95E +310 +42195B695BE0240F7408B311257C23F581E987C180140C584A02B1670CB817CEC0A080F259F1360E58452013200E3EC107AC1DF4FD7B0F6D23F33347F9527D9F51E6138E31AF35F1BDAAEEEBA3D71BB402E2FB47CECEE96B4DB85536772B07C82A34F3E66D0BCEC207FEB9E70643761276F7B50D5EE963CFF80C7AF4A2130F +310 +5BF8C4EBFB5F07B709840480DBD8007FB7EF3F90104908BA457D43AA2A6A02C91422285E5AAC143F3313A0CB74D9D164933B86C25587134E8D342B453FC982860D09FD13ABE72055ED020E85D3E312F74C25CB0293D978A1C4001927C80B86FD06349126EC219F0C735C8053D8F5F310817EA01F1B7851F406144C211C6362 +310 +C27DD51F1E310C0102280ADB891E9B085CC528A2B1369A46BA195B9A2B351862CE43174BA73FB7CBB430A5798F4C54B7333B96C3224A9863AD02B9FBD8E63092191924E77C199D92887DA594B6DCF0112857162FD0949FE6A441F5E62E42FB2105BC405A2301A3424601DC807912CB2C39C604A27908021CDA30C4C8C2019A +310 +883B3A8BD393BB3546136EAF561980FB63E9E035FF73B96D09A905ACB2C11D79571C5159026227DDBDB81396EB03F14100BEB66DE1FA9EF82C3ECCBE318119C4269FD014E66361FC8BB0B4EA9A98EF3D8848A01360430284335004C183CC25BCA82D2302EB03B8419241C64DF4F5ADAF77B533BE786334BFCBB8DA72BDBEFF +310 +C36103AFB30608A0B39B58D93F0BF42180841DD26BDC22CF0A770E90240006BAC65197D90920131C7B2EB3CFD3C71C6378A305EE8488FC1FF8D391E2BDDB0F6E3F45E7C8207C419800DB410073A3173942CA8D5242642A74496FF115832A6314D9FA4257577BF7FCF8F8E8CEE8DEDE5EBE76DD3CF892BA7FB8B90F629431B5 +310 +525E92A15A3A4A6FEA3FDD73136172060959206591F4C927196CF645AA285CF3014630121754261C0D31E1A7E3DA2DBDB54B04703BDE3A4209F02045C4BB0F529A14BED07098A2A1CD47513DA64B512F409BC01663090796D787173B5AA141B1B39BB470EEBCF1E30F9D263ACC4D05110797CEF7B923B027F089F74D1D06F0 +310 +A4D8C0CDA6604023FCA45B76C5CDE0BF3845ECBE13E0C0ED73700A8A753C1AC8AEFFF1B407FC8A20F42F0D94019121DE304077A027D4112283BB8FF0072444D68AAD111D6F591BC0061854BBC048EBBE9E81F6A33A95C21BFD13AF3C7E7DCDFFEB0DE8903F77B41DF178E99C289895B0EA8CD640549D68935BA7C5294E0A1D +310 +66DA0CC419BD398E6265789CA1241441AC94532A3C19C95340BEFC68703077EFC1D307B71F3C500859C11494838E902203A2BE90EACC5135B80B078804340C920C2300BCC06F7A1C71B875DC572C9BD1D84BD5FB9363CA6BA7D03E5C40FDFC54FC23C9B4B9DDD028787D89219038523BF64E638BB37CC25335937A00DFD328 +310 +69C5B390C8C32FF25C8C47A7181B4A599A224A9DADB0E0406FEFF9F183B7448F081E3C55024FB33828784AB61704482CD0160C04174F9E33BA9291D58C2F1F1B1B3B5863B0D9F3E51C35C253D54A23E560E2C0CB3A6F7A81382601C2079CAE96B7B1560D20A341E85A928A4E01083256420576C2ED477E2E565FD9223BCC69 +310 +1CF394D3D8E281501E0EE5C1C8159E92585D255CF30CC854C75318006EA4A01028EC853F9407C6053910BE105348324002260254886C156260F9189EE0F8C9A3CBAE9D5A992184568A69D5183A7DB97DB089FDC57AEE54F858FE54F577DBA85309640290F2D220952620750C5811FB772A7876D1E4040FBFC6474D51246D8B +310 +3FB378283FB514F8AB3C20B8BF7DBE5DE541C9A5D3D38DDB30E00151E02523081BC89C2214103E0BC1B3D0199A08E002681A2613A2616CEDF0F0F9C5DDC75DA395C25C0309C03DEC8091A4AFD3FEB504AAC6633930556DAC86EE3561941E862C4A75DD6B6BB3A0C59BE153DFA73EDFCBC3CE2188D3D378FC976D0EF9A95B7C +310 +8532F527CE3CF539581E0FE501291E9139FFB65EFF5DBD8E0C18DE3077170A64E033FD278F18068028802F156C3809FDEB11B1019C208D020C9BA2870457F0F8E1FDC7EDD393E3B9FC9C4308E9315704233F960E554802C14716B0B45DAB5EAB5E25AB7830EBB8D25E6CA94E4AA01794FB1EE164FE9F040FE82C940A4BCEF9 +310 +13075D087E85A7237D3CF29C47E4E676777779528C4781761F0BFBC1D3A77880E40C9A2E5109180D5255317890394229F0F082010354082D574F1E3FBAB7D6553C2113DACB97BEB5526C7C6F69F9310A94C46CD89FF8F379AD1AA035FD00FF3F320180F01417A6F255A3A8D86319FE0C0B0E06A0DCD33F79841339C01E5BBE +310 +1911AFCFF7C1E0A540BFBDBFCF2372352686D863F83F59CB6865F43104007EE06F52406F680341102048A01BB048823082CBCB0B6AC48C313F3E7CFEF8F2D1FDC3D6F6F9F9D9E98D9D7CAE5EADE2A6512FAD7AB526E17F600C85550DDE9ACFE9D97E694513103BC69F8A2813176032C890C1E9C49FC09C61670FF8705B1D73 +310 +86260E7C8E7122C7F8208A55139E8C8D4763F7EBF5728DF9C34677364E3A3F9AEFDEC9CD95470788834F9FBEC512379890B38C94205B2557987C4186DF5C0837608DF0F9F3CB87B7EF6E920475752A01460E556919B2B64296FB9FB70DD5F47232A0F77465BF140CD001F00ADCA175090E2665A14E6329B62660E02A1CB50C +310 +6025E3DA252A670B3F0FFAA5EAD94A509FE7036B159E0D1D9F2E76B7AE1FD5A606198D3A747AF450023CBDFD162278B9446688111009B4029B0F2180AE20A542D40610C073B47FEFE1416B2B12200F3C991C2F54EC2491027A816B0A34A9D05C6F437AC23462385DADD75642EDDA738AF1600DBE07EE8437804D2D011A94DF +310 +71C2085EDD40266A407FFA1D1C00B0C03927E60338E3B9D8C47D1F8CAED578E06F7CFAA4BB63B175FA7C301B747CB377F45192003CB8FD34B12009224543D8604494011A80C1903CE0518C986208E1C5FDDB8FDA161686873BBABABAE74FA637BEA894A44078C19696F326E057D7F95D061A6B0394A9D5F2DCAAFE4C2388D8 +310 +A6E9AB7695CB0BDD0A332430F1A9333DA41D1FFB97FA09AE84E738C75C407C260408F8DBD5EDED7DE1570A7BE333C54F16963B46AB0C2B71208EA3D16EF4EEDCD7005241166C005A73C03164792151205C007288AE337B4D7103741BDE7B7AC913350B348B2D767515674EC6F72A0402BBCB41C81305AFCF05F2758D3ECAC8 +310 +D26AB97606DB9581A4B7A8FFB068CD5C0604E6849046B70C2B60FF0CDDF93C13822B4E82FA0479A68220E66D9FD775FB3C1A9CDBDB9829B6AF2F77EC9E0678FB20ED8D1B1A1A39D10F9812E20D6281F5673121AACAA9C53424000DAC173F7E18C3052EEE3E78E7F1160F5AAEAFB70E0F7775CFCE4EF384DDEEBEB9C0889D52 +310 +43BDF557559FEDE5F17AB21E118C4C31A3DF6A96B56AC62180293910ECD6B721047664BCFCC6B2DD3C65CA0F0C823DFEF84083C7ECCDF05898EEF158F4FEF97EB9C123F1B9D1D1A3D9F9AEC5F5CEDA84A3C96C14A55584D62893D6A54D8D2028D05C8B1F124884543F3223B29D208B04910D3FC43F5C52196AEB5B5F5E58E8 +310 +E82610F08C21BD443801233C0CE8BD1E40F84A1CA86001990048031ABBAB11EF83F9283EA89F181F2A0D9A9F62D94B7F625FD727E6A93F63F200F614F7CF100D4511C07DB45FC5F0CB4CA359ABE4774631FDAE85E599EA0878A3C33D5AD6430CF4C055EE5FDB80629000D7855DED3F436F3B61B3DC7FFACEFD2B1BC6FB0696 +310 +312CFA477CE87A87070C7998E04FBA78AE3F915A065E819FCF35B410321D9ABB308146A11AD5196CDDD7C477A171C8AFC74B45CBC6F641AB53C8D4ADA5870C02379BC0470CF83DB55F073E29CF5CE5F7A3F8FD62EB7AEB1774C2C6780B9523F9287193FD23DDB79FBEA513B45200E2E0C1B51350163AC19043C600F2C1DBF7 +310 +DEBA7BB9B5457BC0D840CF325EB0BBABBB786D301437000020004944415472B491ABCCEDAFC0591201CAC8EBFACBF367FE7B6E40E69F551BBBE7123E3C00AC560CE20C62436E8C3C54CC225EE08C0D74CE26148877689EDD004FB2BFBFFFBB984035373A7954EC5EE8591FE531348654514DB1D1C56411DFA2A7C212BE5ED9 +310 +1278F2851A432244C6822C29C85A8B320ADCBDFDD63BF71FD32648E7D098CD018BC35D7FE89E250EF2AC75F96C15271602687965C844B8807C6E7729D93F22E81D39ABD62A0820C1FE9F11CFA7208125D33E96FD69E83AF6052DD32D49FF0802CD9F9DFD39260389A950887A647CCC99BAB17132DFB5DED35138FB3A060F62 +310 +95AA5E195BF0BB56495A5A4A8FA440026E46A047D40ED2520A441C302D240F201FB8F7E0EDDB0E12A04D8816215A0579E8FE1B1281E9F19C9900DE79842E2A7CCD48E9876EB01C75DBA0E0C8D44AB5512947A00BE7CF5DE9E1A6A6BE43CF1A78783DFD5A404E4477336C1ED8B18908B2A847B2AFE9839E891137A6673BBB96 +310 +FBBA2A4B8E9373B001F08369BA11BE8ABC4302FD2345FD6014A127068427D007BE28B41D9B0D40FFB7EE531FA673C8870A69135B1CEEE8D009C08042A5B4EDA314920B635BF941E7487E45256439DFE9D276295F87E698389CD49FB394FE19720412DEDDC40E9CE9C6DD605E0B719FADC416CB15AB3A61F9B5B9B9426E54F8 +310 +1D8B03DD950946D432B40CEDAB7BB5AF11213CBA73C9BCCCDAFBCF06127C7980FE6D1DC9B4DF14832D6568FEAEEBA76FBF438300B541064ED33F3AC0B0D10505306FD370AED02859234402F6C3FED006766DDED2034D90D119057225EEE3DAF787EBF30EC51ACB4F551678BD6728E1944730C095F13E4D81A4DFFBF67C5BEE +310 +37E62A85FCCEC6CC6C7BC77A5B477E22223ECA4FCC0F87E2A5E3EB782BDB25B8CFC6736A044DE5A7CDA604526361D650484FE283B77EFBD65D52C1C73C4F48E7D0D81ACF572F2E2280F98FB230508FA906B42DE240ED651B301CEC83DE1790C9FD96B6CBF986BECF3BD332C18EF627A0B6EECD5B152E02088D03D828AFFAD2 +310 +6B05BF671B4F9A09A8CE0CD2707F67F2A4B3BB75B9ADA331C1305BBAC182FB4A79820B7EEAF73199B8404C0B81231CDCBB871B80FC41FF5860E8E108222A1A076C29E6E03B6F3FBD4F1F295DC457573C7ADED636D6B7B8C88413DDF3B327E1046AA51040B40CB50C7E3F1D2E44DAD34CFA604029BFFBE714DF0C069908027E +310 +B275F1F366C132E1A7450B04011CF82B2B647CE754F650FF6E25BF37AAF65B7BDA16CAA791F1D09F6CAB989EC5AB7809BE145FA459E8D3E4B0FB47DAEF093B946FED585B80FE1A0305FD5330FEDB4FDF79FBF6BDE81D8300CF6815E5F9896552412A03F31FCDCC7CB5E32365550CD9365FDCCEC8752E943161D78047336F8A +310 +F6539840A1F2E764FDA2970999F205CD2BD1F5CF496571F76EAEFA0E1CF8FD2A55FD06391F9EEF8B9DC9994E72BEBEE1FC928E2F223EBA0FBFBFB4F2DF137BC894B8087643D64ADE6EDED67F7680FAC9060239E845FC94AE93D880F994FBF71FBCF5F66F9F32C292EA900F9C1E6F1105E81C5B5F58A067A448143842008D72 +310 +75EA3BBA3D2516FDF02FF79260020D6B3C714711F3CFB61BFF56A826E627E82256F7400FB387FEF23C1C1E77FD6A21EBB1B2B35F2F95E7760BE1FA3ABB3A981423477517EEE36FF96F122B942F6FB64D9502BD1B9089162532A2FEFED255028FE653C9F46FA321E0B588B7DE79FBED07C44106CC85133CA65190543004D01D +310 +02D8181DDDA5A9C91A7110805B7875B689FC3902200FB192E7DFD936B37B57D9C338BD49E99E181F4E5FCAB2ABC1CA7AAB382CBC7D515457CFABE6FBC63D525E5CDF74B16378B9AD6774A58531912D232DF01BAA913DFB7D3AAFF912984302B84D0500077800D26C60A4742101DE420C610C2E92FA93056022EFBCFD5BB6B3 +310 +8651470CD33BD87630C05831BA864C85997B8754B05167F0706499DC442FCD22592AEC2ABF3FF13F950039BF159FA9B36ABDB2778EFF83F70972B83BFD3F4899E64DD8346AA495CB155A7499F2CE39B0AAE755125EB84FD8CF8D8E4F4E9FB4B72E8F1DBCCB98B31BC4607C2CFF21C8145FB48EA0F2159F86A3098415609554 +310 +DEFA7B27EF1301033DD06D274BAF6821D220DEF96FA4CBB60B3CA241C021D38E1AA76B4406B4767576166766A6C7F77273F5F395291BBA19F64F2E3095C14F3E60371827741CB27E89543857D6D96BF9A47C6A9A26057840332EB843717AAD171880217B71FCCC0355AED3D4819911F79D0EA8AD6DA31A83E36C5DC2D47029 +310 +5C011302387069158F6C9966022367ECF1D00BA9BB95C389AE7B6105A1FB640689033A7FCCFFEDB762189103A61C3A4FEFE0D6A6B5A19EC5755A443AE78BC5E9235B047890A65919A0D2F96AA3C01CEE913BB3ED239C3E0CD8DDAB99E4348BF3F8B977B6C43DEBEFBD7721A839A63B94C06A10DB87FCBFA3C2932F8C26F88B +310 +6D6BB30C3C4E09AFE40FAB52EFAA1EC0316920E031A46D65A0FFE45A673432E907FBCF86717AC04F2CD0EF512D665FF53F05BFCDC43489F150890C60A8E0314E70A06F619D30D841189CA15D3417F3CD50191AE4396543F0C42BCFD696C58DF163F5B46D708BD5FDDA5E5E5FDF9401BC4F7E00E8A17520833D1CBFF495B5D1 +310 +CE037C664123EEE74737268B5D1D3DBFDA6AAD8C08DF2C0BC7A737E10AAB2A7B958990CEBF556CDBEE823CB09FB344143463C630CFFF585D330CF0320E921744A7918280FEEF981161008E9FBC78C830217A07B7D6985E83F9A79884ABB5AB383B4D7D788F9FB3D867A2112A43F19042B33A108690CF6F472F8661CFAC9714 +310 +78757F6E6F2F7AEB82FEA85E5715941778B278281F28C268AB24BDB470EF3303E09C359E9DF1CF990D8A096106E6A66C8620DDE7D281DF0B2831F20439A30D68386CE13E002F7EDA8D7806162B205D6A19AA1FABFD6B1B400EC2BFFDD66FDF7E8755B4883C043F43046C1326136680404F1F934EBDDFDD39CB58A98DF1BD78 +310 +80E0532E671FA1435E9D6EA5E9071000BE8F262E7C4044FD95D5FD526EB40A05A634775F32205C3D779FDC168CD5E56BF982508BF572BDA4F6F57D3304BE9EB18149461B12F760D7485891CA47CFC44909136FBF4931716A2E100123FC6CCAA6A644F25EDF4AC980B14039009BECE8B798BF69A05DC5B6885CD23F8E13A46F +310 +F0C0A986D617F001C52241801E87C2974C31411DA3A5D7B6175472763D637D3E57C33B908F867F4A59CFCA7923375E5F027A983E18BD7BD4E6FDDBB2250C1529F4202EFAAF979DFFB1F2612E87EBEFEC58581EDB9AA95AD1D7C1905F7305BF8182D5BBB524D47C4E3B81CD843220DE1E6536497C0962C225F75A2D6A998303 +310 +B23FC501F0B3F736EE1FF01200FC8C99F5515207C9C40081DF304C0A17D06E26CCBC5B3C47459308178301FA8057C2C0AE9D99B05F038828B08400F2E3251254DD7EB8BC4853B101F99AB48E387457C96951E5DB670648BAB70A7B04FE93EEC5F5B183F9739C98952C6845C380D401B8FC86E70A20744EC720E09D35955D96 +310 +A9041720196D183AC2CFE6AEA816652D0234883D788BEC8F5DF2615261DB031C2381092401B48D8D2D870FECEA9C3D99DDB036C8A051058030E32190976718C89F031DFBFF2EEA3D88606A8A19BD0AE305BDFD12BA4FF46F1A0002B07137989C748936E9DB2C91F43B07E4E4D16C3779CF5A4FFE8CC981F07C29E34B7C012A +310 +F0054FAEA4A6A3D49D3A16D2B3CF220A029003366663053C89B3FB1827080DEC2780076FBFFD8E39810CB0593CC68B5D9009F2D400418028B0BC6CC74067E7C9CC0C2690FBB084AA5254A12AF63543B35EB40D17B693F7E3464D5094C00AA9E04E0E0524F5C35C5EC6BA94B21AAF2440725E2A9FF94FE7A8F0E769EB83FDEB +310 +039B631B18BF396F5C13CF89ACC02C387DA56DC3B1CD84B96CFAAA37B55FE723B611062258257D331F186AC93D8AD600B4FEF4AD777E4BF68F2168FF08C081A37AC13446C859964803961928476D78F68419390D830C1935B5C2A0A22A3AB17D3D6428BF12DC373B8D464E04C0A496BB3B3B75639DCC2500E0F0B15FB6F47B +310 +5A7ED0183A87CAE8D535F2EDBD4B3B7FC762DFE65A07C30B2851DB890082ADC07131EEEFA3DB7DD5CD32C0860CA83CD4B7993A175F422A8149B1C1D94C1145059D9C78A8A572A90B7C8B1E3392FF77A80C50220880FF3669004E90F101740D2B808181455A044904674E7482CC3EC85C4BCE339404C0B0BF6A5611E4F9B815 +310 +7BAB6DE327EC9BFBA1B4557ECB609C1F45326499EFB90EE78F18227F09E563C9E63D847EDB3B68EB9C39E95AC4F7ADCF7D87F6752BB6912040281E4A0D8A8314E80D60470999B8A51FB1488A66A9F3F81FFA61C83F4FA6969E472288FADFD61B005E0EA4284822E018911828E868614DA0C36E11F3A051070BF2F0840E35F2 +310 +00E2C0C80A776CC9E7E6841C0503D0EDF15ED9AFE527E798D23BEE5F0604E58DFB7099D739BF0BA5D332EF29F1535995BDBD0DE681C4F71DFE6A7AC5A13554AE6910963E9ABC9A0DB5B202225545F5CFACC942B5B93C207352B6E5310BF349AF200175D7DFDF78F6D683B7C87E087FA9B35812C4F8F13452CED610A2207541 +310 +E6D659A739441F3833CD0C9C3C3DC2B0712F62333C4FA9327C9CA1124904B4FDE0FE21C119776CB0C212AAFBA5CAF80EB43772ADFE77CD9FA8A4144C54C2FB2304C65F62FC3678E4F6C68F30FEE1BE8383CE7DB86F58B1AE0C51F0F055E188D02F00911DDB0991832228B3172B3E623E513FF1734FF414A611A603163F401B +310 +EA790FC9FF7FC3FD3DB02DC00184145B850D01D120424DC03C00FCEB7880EEEE939399F1F18DBD4AA54C939899304D913CC2D5CFBC55E50C7FBE4C0E14AEEF53D6843DFF56BE2D554637EA047D3C210E2C61077875FB5B40E19F43AB7470CAFE1C0D3ED3B3B4778D1DF6D4F837C08747180FE8394F2CA1E0A46B6DA62CE2B2 +310 +DABEDE0B1924098580FC16B369730E9E90541D3730D47FDE16EE1FFAD3419CDA05ED1F2715C607F2E81893AFC5936303F40EB776F1D808BDE393A3FA401E1C706E154C892860AD74A2949C409E28A8FB3349C764D13E4D1D3468952B7B1B35001BF41142CAD58D6011C8B78961EACAB66E9AFBC627673B61FFDA4167950A27 +310 +4145BF11EA17BA9AA60815C2C43AE1F648E3772E53C94E6364AF826019E723069A8AA353A3BF7FB5359281700061FF64C28C10B9AF0B70B0B0D30A31CD1CFD22F68C76DA1E44558869257892363C091D313EFA46B57C3BEB252E9C6BF5B4799EC58F1910F469E25AA17B343799DB3E33CF410061F96C6D63FA91B1000CEBB7 +310 +D2971BDD39A2A76361E000F5DBC1688D47CB812DD60F8001AF25B328D173A9E4BAC18CE9F1F628704330741B2649B92E9714447C68559C6CD2F681919367E4811100750058809D0230C087A89FF3C80C23C4C60882E481F48D531764BABD5CCECA308DE2F63D3BB50373D630796126803C2D1FBAC148F7592881B395ED7D26 +310 +B7DD38D7096AF98841CB37592561D9C6565317AFBE9FC4AF7371E060736C7635E0CBA1809FC80F544DBAA1F2F9393D970D44C0615A0C6930E758B9E63AE690F73045F0C8C0731DE9CD80F718E94652383458799E02C06D328010011C7090D8C5E5336A83D4059953877EA1E1D66FBE994F04608C4C991917230FB61F9AEE18 +310 +3A40AB9108D032449FD1A7283DD25ED15360EF7EA9303EDDC0043403531EDEAB10DFF87F5E2FD56DF0F1B701A9F614DB17FA0E0EDF6FD0B1622A81FA3D1DE5A33F551930335C353A87F9AB05C60455193448246944A232C5D07636D864CDD7A50D0B4440CDCC465D1C418321F50E1648D500294065D869559EF3C40C8FCC6C +310 +323E989AD0F0C73142480B200842802C061008B480A9954AF282052B3AF67350FD0DD30D1F4075AC303A5D490250F5400ACF479656861E4C77AFF327F3EBECA4B57B6B6C8FF62602BF150744656A87DABD7BC6BED50527B2120C001A0B3718C74F0C65CD34F275164D7968148DDF259AB8AD6CA81CDA4E8819509B996A7F64 +310 +2D987A401A2B04018C01E6C169A8700F9DE3B489DB2BC49C9B7B858A4F50D22AE15428FCA4A1EDB20C83492690CFE361CC7F8C8066FFD0D77AEE797977F468A36E0B0DFC87F90EE6348BC748F7CB73B5B9DD5C6EE7AB19ADBF6DF359F1DC2A0F9E44F213F8041F64274C0859A2AB7C37440FEDDD2F95BE44065F22067E3EA0 +310 +CC3BD8C0D8194EAB291CCEE20B9CD8E02950AD806080047A279F19024C837C848816719AC4A34DF8F0706CED904E8185753A458A27E4C1E37B5F30A104932BE140E0BF4E400160F320B054A8705042FFC47B4940810173F9C9E97240C7FCC3F3813EA239B745DE9F1B1F3FC2F9330374DBD1A7B475923F9A2ED81716D18D1B +310 +577DAAB9D1A0458655AD3CA7E211867AE7C702DCACCD291E0F798013DC01BC326087775C0833E04EA3778FBCB8DA4687A0255CA0AD210C15661E4E92001A4449031D1DD27D327334BE830B64DAD90CBF537A45FBD4E94A7A88888E715B7E74FCD040E818BDC1BF5AC609CCCC015DED23877080FCDC47BD8EF3A7B783A17D33 +310 +F3ADEB6D6BC7AD75EA7C7852C5B6FDADA6AFEFC2D181C03F8C40DD8A4AB5024F0B72E34B57BC1182472DC80946789AFB711DB7F1193C03C893B0345F420246114D3EA71D04FBA731C0DAB0D3CD311B218F0D5A15ECC105D02F3AC32F13600084731A83220040019B03180634B5923D438300B05BAC80881F061095FED5D572 +310 +A3323ABD83F1D37A2301A8C930AB3F66ADF7CBEFED30BAAD7D78A06DEB6A87F15491F5AB7E25842B6B34BEFC12C8A159F187C64B3CBD2356DE5FBAB98BBE9583F0E3280C0076DA15BF34C15238145742B07080B1EFB83382F9FEF2239D003541041083C5AF9EF3C8944DC2030BC3ADEDDD9D27475800693049E05413BFB3FE +310 +B4308731512F13400D06F813368A0101D8D863EB3E75FCCADED124F532AD3F123F131AB46A93DF1ECE7F96CE9EB6C365C6D6A07EEC461FC919FE288AF7AE1A7D012D291EB073735FF26BBB1C99FB706E972192819B7A34BF22424BEA1CC7958AC2E04BFC8E02DB90A4A1DD04811ACDBC181037864672C78F6C0EC3073A40CC +310 +49D5E813593B7002763BC6A909D31AC86F3F6E335C9E1C309BC58F16418642E2AF6B290A34FEDC0CFEE08FCA0F56700699CB73B9C99302AA17BD516D7F1FD755A2B32B3FBE7134D3BEC813195BD355020A7DBB541539CD2C06E45F46FC0EE08293E6C0E1972176D9B678340AA1A4823404EF79B1E2347E47C35D0A2260730E +310 +0B513025DC0BD1C07E3366E9B9D17F767405FB531070700035618606F0B40C73C974CFD321B0C174A80C0F3AA54945FFEF348F5488895713E89B5C98DA501E06D8D24FF04FF0CD7ECD7BAA755A854EC6A180AD13BE094E8D5D63BFD6DFA5F5D3E4DB1BA18FD8473DC6E17FFC9832B71A2A94D96E808BB53F9192955D62C82E +310 +282B05168AA0927D54AB20A20A74800B7CC9655C8B15F62377CA4C91641F9F4D0478F4FEFDCE273A002CC0A725EC165CE3A149F0333E8E9600B2C05A7D15FD831F0938DBE5D0FF13E3C0F0765965A0961C3FA86DEEB0E28304747BFBA5FCDEE44C23544F7BB7BF7A132DDE34F99E44EC3FEEAE92F667A10F7E90B0E8C6442D +310 +F5A5318B0F816311DB2E6DC6F172C363FC800EE09186BB9EC82A24C0117700CD884AA42023B81EA6E0CF8B3056411110D78606EBC5AD5417B45BCC8E61EA01C4006AC233933E35D860BC1B6CB9C9CCCE7840D2E0C1C1FFC11CCE54D59300F2B47D66A10F09D8E24B71B9BDDF98FB62A3B897C53EC88D16D1FFE8C649B17BB8 +310 +E760EB20B784F52F992544753F2CBF642CD3C9C70D8722C197142C567E74FB431EE248A8F3FC00377F5142144A82FFC28AC2970A780C85A7EE9146FA4B2981F3C93BCB0F3FBCB6DD3DE69C72B6073B99140DE28B8E919D9D9E7C2F5FA99FC1FFD07E9AC0965CDAEA0A945FADE52C791EA989E8E7A21A355FB37E44405D171B +310 +98A6E946DB26AE71DBD01FEF07FD378F5B4B518724481820890E7486E3FCE61A60E096D577701890EE07CA5D7F2B086040749FCEF3F81972E510A86359C9BB579883035887542090614E5C4461705D7CA1CF84DB564838606CF1597E8119790D021080C935A908324EDE9F60A04B7830A33F0670CB08605B8D01BF9A3D4356 +310 +93FAB4FD84EF6754930640C1F9D74B052A7ABBA9F502B39DA3BF6BC7514EA4BEC71D752BFDC198EDA8DFE8F32B3EF811E4576B0A2074B99B070A069F60173E7427BDF285024E35A4418B7A412914F2800F1965C4F1120A2D5D2C64400563D5942044807BE7C738EBF3034C4A6F4D70C04ED1F97673C039FABC4CFF18866E08 +310 +200BB66BDC9CCDCC3FFD1E43BEFC52C317F0F5E64900FBFCDA4DEE68768FFF46350E0EDADB7B34DBBEDE3776BC55599AF84E312229F931E700D04478D66A0D88D09B2276141AF0F8811C5F8067DC04C0F90929F7F1AC9CCD368488AFB965C97B855A3E2E93AE5B4866502E55991B82D4388614F2C36B8484A5FA06E3EFFA98 +310 +4A6AF17D5C2073299D9F12FD63826F67FC460E54030981684E9FBFC22009A3006962285FDF4FC84B699FB5BEF3736C6072F6844C15EDF25883037DE6BB7AFAD6AE164B367812FA8CFCA6FA25725D99AEC5C6EDEEC64ADDA2BE0056002032E1D7A20A54CF444E360D520A5B69816C0A953CE0434A8A898BF18E2B704588C01B +310 +DB2133342F5404FEE698957C200EF54E31BE6DF4E888C9C67F5F3F1B41F922777E7FA6332677C20098C59F762F5DFE4A23F9801A3BB6F8A4F66E0D40EC867E92DEFCE84C714FC7CE8DD3DD3BDBF9C781B1C3B549FAD2C89D711808CAB100E09700BB85240374A7209212F320CA577222A7020E7824500179FC7096C714884B +310 +DFD9499E027ABEB3CB0226CD293CAE6E0C41A6788F396606A073E28CBE5CC67D584D36CA39D37974FE1023253E3FFB007A26F657FFC901D851130DDC2BF54884F20D5D40A0B7E5C7BCC7CC87B84F2ED820192CCE1AABA1FF24ADBE1D03635B5B3B53D4A5F84120125FADC36A0E792D3AD7E255792CD5241A4C84171F110409 +310 +0017DA493D0A7790A7BDE6DF326180398E4B0DEADA5C2763825E43E05C388E184678C88CE6422606C017F030366981353DF03A753DBF6370879F79889DD0BF75408724DB53C5B0063AB6568D02DC47AE4627B58D7E367A6000267E7840C23A0940B992DB98ED1C4731B4FB4DCFB6D3EAFB6CAC7646F0335C5031888CD74E21 +310 +03380260AD47176D703960230370FBBF28813524C17FFFBD6288BB28E4F905ADB4A788B40B4A6201C1878BED224DE9906C4C79EF32EE679B9F5D3B5DFA137327320643909A823F62106CB8F9BFE4BFEAFF0FC7A6393EC7F64A698EFF8ACE31BA05ECE6DAB6DF124118D1D13F892F3D3530602E3F3ED3D59DFB821ECFA3D9AE +310 +85B1ADAB9E328DE738BF55D5DFD039445AE76D0194180F57B15BEE5F09C07F952F9A10372BC894CF7DA12CF6507E2A8916E0DF430C519485C55D61EFE209912D8C32866214E121611E22A0B1238DB18E86636A3BFAFD5B4EE02FF1E505F902BDF424D0516907BFC95EF3A76B6B3872769D67E25B548F0DA46E2B93DFDFD5F2 +310 +B9E9EEE1EE1DCC7FBE6380DFBF38A165CAC73DF912AD76A4690D2B766A3EB4AFA2D05BE543EA20B095FB17AE3F1928D84482049B659E671A4763CFA567C08824913D37F2F92F841FC244085C1681225C04AD6DE1684831682CE0D6096B56101C0D4FB3A1BD3F11FC1105AECF5660BD3FEEDF162B0D9DEC6DB55AF27FC98050 +310 +BDDEDFF63ED14B01336053A19DE9AEF5F5D9E9D9F9E19ECDADCD497BCC57681922F327EB41FF681E17C1921B04FBAE371AC69E53F98183E91B84897A5DB164158BD1D12FF6F6BEF0E02847727BF2628F9FD48B6FB11DF6928C868B29590A0606F92140D0C08850DAA7DD8A5FE8A50389F61288AEB743E9C801BB67DBE0A7F6 +310 +4F63BC87770FDF57AA73FE1F5A84F8DD3AADDFC32087FBC0A7D645C327B97D65E7A8BBA76DFD9BCEE1B1CDE3F5F7CE4E6DF4013ECD7CB60BD1239E8A4E9A5722AD9C4FAC8F7FF17B214AF8801950430639A08E3ABD05A0D94E253BD5951C885B0CE750309070555FF21F2EF83FF53F4E15038B8D8A244740A5C9CBC120043D +310 +A0B323FB1DA0A4EDA268C05A304619505000BE10415DE898809DB6B66896E60AE347ED3D6DC707CB7D5B5BC374A158EDC343D0EA61C217D4878CBBDC1D85686782C3CF4272E7DCFB5E9EF628F5A95AC1AC0C6848F5771329EF8DF2BB79EFEDEC8DBEC72EB7F245287FD4B31008AB38EA4D52F2BF57167159E3004CD8950E21 +310 +7DDD6F699FC763E9D1A0AECC701F7BD4430A3E030374066938F883C01DE40E7DAFD609345E33570F4CE6BE467FBD7F793B5AF2A9D331D86DBA7BF98067918F9FCDD609A0384B523F4413B574B818C6889FAEFC5E7B8F90CEFD62BC2C85B2478D54DD076635BE434FCADE68B3ECF1C8708E27863DBEC352D87BCC7A92A8E135 +310 +700CDE65BC114026DE5DB68275E656D2C0D4087293D43BB4C9C14EA83C0D806783B40DD7CD4F19EE9F33801F55A3F1FD600017A6CD5DE607783D5F74E34680E7DAB98D99F6E5B5ABC7F7DF19D8278322F6A97FDB2FADE1539BD945DDF868EE2B8B70D9EDAA45D1BB0A5801198CF1DA891540474745BF0317F8A3703E02510A +310 +E94B084221F887FE950272D62D4232781054A87C58D015CD45EBF9B70E60820A2056E9D4D619E8494BBFA68B61EBDD8CF52CCBA124BACD4A4077E8420A7F36FCDAF661E577B792A7E1B7E337C7CF1FDEBB3B49F501F3C7366C1730E793F51FA20A9C3D2E9F18E63DC277449054CEADA36DA0807467D45F8A744E1BDED725A0 +310 +33868703F1392BBE221158220588F30574A0B0893D0515B0B7C404AD0E7F40C11D504C49BD7DA39A85A19CD7357DFC966E5D92272FF06D59CA5A6A1C8AE30E52F1247C1F1D78F81887F9F3E387075B170F9F5EEE4A7F5BFC69DF02FD8795FCFFAB472E7C88D563DA514861B85BD41594A75F5E866BE69471110A9F75C8609C +310 +7E6BF6C7C727431EE3E9E3773D2378C25226E82C08104A57ED273FE0921D6990E02B006BD038263BA360355E8DC446A380F0BA35FA9945A80CF60DFD54054202F91897C241C147D59F8E0FC67CD0F2BF377A3463F8BBBABCFBD6833C57E214AC3F5AE9C2FDE88852968F20337972C7E04EE5658223008AE82D93BC37D8DDD9 +310 +00BD6B16EF221F0D4149045D740A8A215D4FC186C658E01994B8CCD317465828704BB630DA2243B3B4ADD3EA554A97408454148C04A1A0CAAC2E04033C04073851F54380E0BF2DFFA43FAD3D6B574F2E1E5EF6E5F4FEFBD1CA87C161FCBCF5C7AAE2F726F814027BAE10F79BC3D765D61D1803952210A9AA07F8C6BB2105B6 +310 +1145B324F96014EF223D4A9261080239F03FF6F4DD4975C183B887E081F7A467A25EAA0C94028FEB808637768B07400A8235D4EF33143253198900E079E3FACB0C59B00F827A5785A6FFE2FCF0C0E6F1714F11CDE5140D931D707950631F3DE877F300002000494441540ADFB08704E252AADE1BD4E8DF55796A32B9B6F177 +310 +37C67702E5C638682737286CB0E0A89B624D5BF28222432848C9AB8C07170C97B814FF492A61072407D638006F7C8400860444C01B1930A522788045633DFA9507267A3A42BA05925BAD705CDD3792FA23C1075C6EE768A673919EB6C3FCFE7629B7310AA794CC9C0D14A1FB88F95C845BF22543F57996E0B26C9E4C2ADF18 +310 +7F979F8A55F11B47BC26594C52588518D25E6C2B1CCED231EA1B748F093E5726A21A54C91EF95789041030C20FD5AD68613432E19A4D0DA2505B6BD843516E10BB00AF9AC315EE9FDB39CC1F9EA59CD88F9CD071D470C86C4647FDEDDBB1CDAB81DA94034747A779F4CED497CFF817348F69F52E55490840E48840BA72DB71 +310 +F3E84F6DA2F4717AA928F153DA6E4C7E8E00363CEC9A2E1C8E65F298FC4A52F087FCDEE5CBA38A80CBE11FF7BC2AFF249203FFAB77A128A001B1987BD334AD9B901890A8C2005B6B248196AD09C0025ED841325B31845032E327C531C839E66DBAB39566B631C2FF0A1DA5A3CC47E665AD8751B47CFE33899DF047C9F3C365 +310 +E3B11278D49DF939298E09002F6430F9958803309827A7C791048CA070061B7E9A64C557D235F83EE24822E5EAB805F9862F20FC58F483DC0EF02181F572930205107E00E523861895A2811309808F2B6C14B2AA579E893753C155D2F54302007E9FF36AC5FEDBCAD47E182D91A73920CFA5C18E01F8FFF4C3F1FF553BCAD0 +310 +E58DEF85DD63B91BE38ECE1A9FFC4AD4A1FBA30D462C328C5A0340DFD393D3D3D3C0659195C96990F391EFF4175213BC74C020922D4830FE215E76940962BC0713A3B82784C0CB6623DC40D6E1485BAD454F6892200B225096127FBD82D2B12006BAE2E329C771E25FEBC0DAB3B5395289D56D7A8A89081B34EE06F80F819E +310 +FE75C67DEEE95D227E283FE98A7B9F1C97D2D05B4D07A469153C3DA3048EA68FA667A6D90E291C7D7E2D063E4D044964D055F2DBF3E31BB851AE9F78A0A7314F0AD24901F581D74A6929142039C65AF5830D1C809536CDC05E4BA51038F79D713DA930CF18BA3010E385351CF47F74D439BCBC793556A1F99814926AF12835 +310 +E251C59BEA3C083EC2B2760FEBDF4304C9EB87B35769E1EB24B648542CFA4EBA9EF93CD42F03C08F249A2C98897D8E2225E90077823F4A52171A61219998CED6FA050992B6B0A74A2220ED12123004FB977084208F8E2AFC80F456CB110BCA647A3A0F854085D84FE0052BE31FFE7F925610BAFEC06FC33F9931BF063F39DB +310 +3D1BB20EE357F594045F4226131578582CB055A59A073AE0413989D215019B6EB8A21CF154D71164E0D8F4E730C2CD382D098DA5261456A425643686BC8301710F2C50665881399156AA2B4C3191BC555728384800CE10040F746A3D8A80A5F0E500A93456FEC52833BBB45203DACCA37FE1D3EE4B9BF0EC27ED47D89B8266 +310 +F11EA2DB8B5A8BB93EAEDF0C06B7AD0402B9EAC6E787365535AF19F15158308A9D9785C1BC1C01377F8C6B4D07B50DAD25649764A91DC9812C7B34CA98184084F7C01055466B48058CD44085AF26648520C85C41C67805462D8425680425559F4440F3ABBE1F3F81B1EC72708767DDC8FFB6465796C8FE310FEABE0C9B242A +310 +74137EC3E0427091967023299BE5D6D4D0C6D15747DC2AEA4ECC57C72856E827D33CBD319D70FF854369EB841282F84B7CA4881447ACFCB257E252E00FBB3272120A75B99119840858486615636E0E0334031AAA8C08A62E080053A0AAA4158431EC727A084021D41CF5D630C94184F6FE7432E8F5F9A4FCDF3EA7CF136FC2 +310 +988093F98ED622E38E4976E1BF0CF49D2889E6DF3566719FE1F9B47A2D3BF89C69155DCF24F88C609EE551160F0415900B4C48FB013D8900A9192A700748002924771A3686A0A580FE4009E00ACC090253E280B90AC15048E047020483A038A60ED232831F2CC90498648690D960C48E439F18F4DDBEB0B6F5AC7B7B89F623 +310 +0243B4FA160A7B9327F3AD5D937C8BFFE5FF8B3A5E64283BEF8EAB9F71159514CFED62DBC880614AA1F7994CCFAE7D8C87057F451733699B8DF87056E1F0654B5021E38097E4E23221B810DE20559AD183A61C2C88A648DB096081E9801CA00BC1DA0124E08DAAC15FD2936905CA8DA1C40E42B13F1764E0C4015EAD7F8BFE +310 +C99A310B1B7C0BCC7746D3C0702759C89EAD57122092122D1F857067684A578F1DAB7EAC400841F493A468113282FFE42316CC74C756B1C880FE78795C692813CF4644480EE9B02991BCA257A71861F00666D9410288487618D120D0E80D7773E2B7DD180E100EC98B221C94BFC4FF531A09B986230F1CD08378A8E4D0FDD7 +310 +D9B1BC75F5C12EAD7FF83F3ED19EB018620303C217A6A35D826E72ABF2D8E2BB1B783F6E48D2E3F360806E1D192085D022103473A10375B63853EC54F500B5B064DBC20945B88160DCF7E4F83A0200BF6FAEAC88E9F54D22D898E43F378D20B51B5D6B1457000922202800DD401A9266483029C0D6D57ED80D42A0E6E08835 +310 +F0F3AC73D7FAE6D56185F04FC44472B854EB7D9CBF7134DF3DDC35A9F6B38417DD6F508B37C1A718B0D054124176F7222F62DFB327F34D451799D56216880193254FF782D7DDE26C271BF38C6E422E271CE4AB8823C9510F021126A7A944E00DB4031D013C88EA0746C96D4574069BD5439C4110403B40020C30B07A604F1E +310 +41D19C21A93FD9002DFC35F23B1E7B98E95E38387E3603FE7393680410D702FF9ED5A3C5E5CE68B5827D721FA78F3A9A0C08A79722D9C9B418F46C0057BB1640C70AA4A03D29CECF33987596D53CFB27B32C3BE304C540E14BF8464E080918268D254838C91A01F0FFB99154FD8A9C0495EAA6534A6C464440B4A71E16100E +310 +7405088122A35F7A511DC003D002E6C8E7E15F6D1D2FD09014139EC11FDC89394621F77B9F88EB5A583C41E2FEDBC8F82334494C0BFA97FF3C3A34ADE60385B60E5A30CF036E5E75370BE3B83AE73B3B7DC0BB337DA0045299ED0C66681E4AE223D01B1BC3BD4C921E2005FEB5114739040758189BA8A320067B62A3995E47 +310 +20055065AC2B4A8006BF8CFCC907C0063EACE41813C5F017065AD46CFDC6FF1BFEE052932CA3478C8E5A6F25DC8503D40F61FC1B047E4DFFE8E84407C81F1AC7B5C79DA358551CD0D13785A9AEB38D6EB68A0A8087FC6543E7471082873CDCE5CBEA1EFC5CC0579469E225428E9A43D6A6000B4219DE52E8DF00A55F4BF503 +310 +5960661C2DB88AC1F67C2890A93FC420193C8326409E7B595FBBBA9AE1D1511B3F6D65B09AC10A71C2317201A603E88C56CC68C91279E83F5C147787EFE6C675F00941D23EF092920330982DF38C65EDFCA89DA98E8ADDECCD77CB86D85118F3DD9884820B1128010D02F1060F582871CC8FF42024C02239273A1CC3BF71E7 +310 +70DFB7E96081682803188118B50310BD620234F230B12711B063E0F0490FCDA9248B580D3D3DE944A30CFCF2A1E0F6E59E8FBEA289CCCC943785BB8880ADA9C2FD70F6A13F5418444E3A669273C006C4B4EEEC067827539FFBEA9CFF04D84E7F170480037005AAC8829084329899F90B5E013927F8E646514B4824B01D11F7 +310 +2C012CEACD163B6358A4454A4221D06E68A71062520649BF9E9127D0772D6E5EADED52FF216BC2FC513C7D3C5CC4C8AF009811826AE20203B076A2AA66D8D32E317DEE0EFC000FCE16D9E0BEB17C74AB009256C5D8AD1CBABBDA61402612C675FBD72D07E633B1A42F2421208CE01397560811204306617A5141706105C9F4 +310 +984C459F2D0F6C392FA05BED808512B0B9A8A9FC6CED89640EA347D31F0DF76D3D9E61E800FE9F7601BE4C9614A1C58E6C839F13A12D0EB426DE6386B82369A9E6A7F1F9146EB578A2EF4289AA109B4F6CEFEC0463E0072A05CC9DEDEDFE08407B173B8AA65399C80B2911252E6290C82CC1B8909140C11B7AE161B42B9390 +310 +5045D017E00CED6D27AAA15F2C2179F1E83D411A7020B9408D202381E7E5DEE5A9E7E5CDE3B186433F488AC81554BEC09BC579018ADD1DCB3D9D70F02B14BF9159A4DA376225FE43DA224FED327941705DA582B2FD1BB5DC0540667B650BECDD1D5DDFB0C7F36DEE2B94F6EE2EE4E426F20A1174C31DF153321A24114C4FFF +310 +25E505475F6906D4149B21F1BD9D9DF7B059F8E0FD83323CB97991FE80EE131A9003B81C491B218B1D42C0C0D593D9D548003839DC29A740298B0C23F0CE14BB167BD61989AEF0B985C8FAC8F923A73F31953989F0F6C96CA6C4D0A9A88184BEDBBBDA3BBADE77CD8E2FFEDEEF46184A86671D7DDC51417477BE9F04804F30 +310 +5AC82C2D018A21EA903866A0F959FBD4139916D036635EE03DDB7408BCF0627A03027AD314C09B0A27F0A79490D53839D0DAF1416995CAB24101FA63F75029D57A4CBBA9FB4D120ADB17FB5A999FC9420DFE04FA670430B90FE7F589F7FE8D50A4B5F004CE5F07EB4EA007F8AEAE8E8EF7DB3BE2F81F42166C7246FA9E62D0 +310 +2C8209BA1024414C483498B50229FD923F2414040B2081390AAC353B5283EADA12A30B1080866D746B9ABF5BC107F33C2A015B275480759334B83AB02175EFD0DEC785DFC505E0064F4EBA5A97073A74C5C9FEC97BD25D819E28AEE661FD2732B8BBFB1BF13441B3C1F45E8AC1752BBF80C113DE960E0AC7D9D02C58C80505 +310 +A19BA0E84B14402601A590A4AE00A825E98C3212342302EE10FC5100681F86834A2804BC409D70270A2091DCE874B16BE0706C974EB3D26EFEDFFCA6C4579AA4DB781708469F055532A7046C6BEB0CF39F3ED2EC4FBCA3D00EA91CA68FD2B87B5C191E0EB2C300F00A1C9881F263571C6CFD83D079D09F176FAD839340CF03 +310 +0F70458F81F09AEE1329505150CA0A00576B56C06D58070B23086F685E44232D9D53DE3FC3731044F286D19F459351863F749F1104198D6E14BBC68E17CAE70D7AFD958E350BEBBC70C9C4DFBA075240DA27D40AD7DB063A097DD3F041EDB3E4B682A7A12A548F3393DB01945547175879989302521EEB1431B08759B632B1 +310 +74E0F700E774FCA1BB83F95029ED1A084288C8893520E49415E00DA080AE8027C34206D35491D050A4C6B080F6A20889A2FF82379AB6234F6710C05F9080ADF002B9C9F9C583AB220F45D618D7E7F7547FB27CED8A8B7A7D24EDA4988B0C1C2A1AFB53FDC61BF3DE50D63C560F0120B0372F0839DDDAF13E583B868717C1CB +310 +8CC71D1D7F440CC82184803144196EFD58BBE00B7EE77DE8C015942357FB06FC906A5E2B8882CCF9FFE184B0035A5CF186A962A63F84B3AAEE3D5A2C830008807568B6A9F424086D2095A3E262DBF124350082C4B5DF4704A9D2C93553DE47BD6766B69349610716999FA25854F759CA9792599D3837ACF6247CE8597B0F96 +310 +0FA3EC45B61715050260C5844FCCFEC9666BC71F875B17E3BCB4CB151405D7D08F846B4CB952248B4603CC402B609E90F0044A007FA800EC46D07A51232B00E5683C55D5096E1374DA4FCBBDE2C25A5B8D26008227CA7758033D7D70DF12CAF7F247939F93F1CC63047D63ADA0B7CC8771B234D8095FCDB577B586D1834062 +310 +035670E204B245EC093FCBE15626C10D210CB38A13F50E10A0D5C0814B0C4B30AA9858516001669002229618F100767AA3D6D2528595FE7A398C2D2300ED0013A0AE60B91644A057327BD3C36BEBF48C91279B45F8BD145494674AFB211A91977CB838DF35DCB3D6D6AA2FB2784B591ED785DFD7DB77747DAC9D2F7674810E +310 +FC2895F9ED8007EC7885101679C06F21E4B1C8A6120956F80518D1DAF1717BEBFB5803E20C6F2A11B2E48AFF4AD2810A70054623E341B3D1ACD92DA91150DE631EEB2C28882D092049C0DD38E262A7BD6F98549930C9D44B7C37028AEA9F8C5628A2BEF5704C0DCB2B428181B1BE766F43014498D2E57791E4C8DA6BD2ABF5 +310 +003F0C40202E2E32EDFB02852D16C30B7F646B98FDF86C7891690043128B0A0DE6B4EA27F08C30CA34C9D0AA0852A5997F8D11A6EE84E040B20472020256F4AFEBBB74E6705A12083B249089218E6452C8E5A69717E904A3F5EF3D5D08EC1F4D4E85086B238CFFC11AB9AE972CB775616C6D1DE04DDF073B4DE3747C41FBAE +310 +6072901CAD0237100670C5A00C2C3CE063610ED824826C1F6650700E88C00B62468903A0D71D3A390255AD7040048348C56C4647413C2C2561216E0C469203EF06A5B101AD40D0E207F78B124747DB5B4BBB4E88B1C373C114E0470B345156EDDBCE1B4DBDF81DBC400746B0B54E05F693707B89A5E430982C2AC7D10DFF11 +310 +D5B102B9505034B35D07E8E5F585757F088B390F2D4C85CF7218E8418BB4F25B885053D07D5A908326809F31D6CC6B77CC948413B28664484439D118DBAC27DB5AC40C1AD166F25E6A2F0AE82100C0BF220405323E1FF80DFC518CACA8DE1003F3C9FAE9C7B2D60703A0004F8EAEAD2DE0F5485452D15B77B4B67F4C2403B8 +310 +D8F9C533558ADE058A9E177A1698F75DC0EB4C800F74C0270178C8579C1FACD025F0560844502D2BBC01E620030CB93636C1041636A693949CD80139FD15BE107F905590A292840F8860706D07E2970A2F15E5B13B87C3143CB2930374CC46A6F9B9D7A5CCCC14E11B9E879A49FBE27ADBD6DA82410FBB94FAA8487D61B51F +310 +4BE0A03FD08743C31020D6628ED20305A22C2C2FAFA7ED1E7881C438AA5B9035F20759E243C51F34D0D5F02F11403B9E204CC1686C0B6C9000470561519CBE1B0E4FBEAB37A39EE4B84C05F023858779341991F36D9D9F351E7BB3B5ADF00148D9D05784F9AD8B037D48C01BFA83D4247F03BB768BEEF973A14E610090D4B9 +310 +6B1EEC5C5E66928F28EBEB6CF578B067DD83086081579848E60DFC7684044D8174993C39F886043481F6A2B743B18749E52447CD4D230513032D20D20206E536E15BCF7B7D211634F98FF9986287F33F9A94615A5A0A7CACF8DF5DCC1AC6EF9AF1945EB78E0A2FED1DA2ACC00EF983F9A012260BD722EF61C9DBCDD8719703 +310 +ECF839029010CA0B9F100B1D2842153E01A1A3837AB579516A31982FD2908A09100DAE591016CBCD4B011A2F4DE299E1338CE065DC4841BF9895D8C81714800CD08F5AD39601BC929B55D291F6CDCEF2AB40DD5D98F4E6F107C47AEE4A09A079C05316F479DAF4C2BAB83221BCC0CE23FE3D3D4C7BC9AB673D89A3677D6020 +310 +F6E182332028012FA0FBE0B2668FB85485902A8E7FA0BA2105C213E20BC2169211A4BABA7D693C3F1DA961F203694853137073AD5CD25F1C017DE0477626D7BA55B88F83B5EE513C41D814639FD1BF759171F4577D3CAB0C3DFF68B2D3B1F8478C18F67BEBB2598FA76A4545E9E961BACF657E0791D2373030E0EC9FAEDD17 +310 +BEA7703A738185D08236C407448A4CB504CBF01FF43859D3115488EA01B55078000DF085911805790DE1B41B6F8CB2889C3834FE02AFE07D85143C6C008438A944EA63E047023A7EF37E13B0903AFEA7BBAB9579330FAFDAACD540022980B65A75FBA17D388F1E6576405CCE7032D95BDA420E7DC0EFA320879E5F8B3B04C1 +310 +D2D9C1114210C19FCC49DC6A855E12010184DB8968109ED016E4683CD552A36B3AFA13BFC2114068935A7E774CD2C7225642B73325938052D8634ABC18DC9442BF9E0402E85B42F9F3273672DA8E8F1070405D1DC3248487574CD98092B8B956E6AFE1566530B78FAE05B4A0DE51FBAF85DD075C7E11939F80E015A58D1F87 +310 +E400CFFD2306C4D1D3C634380A201545A92BE01F445800BE12302AB477BD6F62600D211232EB061448A0D2B877BB940D63D059C37E0569A83DE93E214F4BD86209FF6F479C640AFF8AF6D1BFD987D029A94DB7C329B4184D4BB013BF912FB88FEEF913071A8D82B651BC10DB067A7EC52FE1B421883144C00F64FA23A11CF7 +310 +08BF16CA59F18D4C04B8085964B2D8DA4A855187000BE440BC816FFB13374640B0EB1D0998AF38A1AEF503F14302E2811081FC12EA6CD38A63B33035125F40F170C0B0AA45E9FCA38FC6D688D48563B5C4B4B7C359D3C7AE0EFB16ACD5E2FAA47EF8307044B4EBE1C71E84E742D81431FB06B90B600B9C239E277A57C94C42 +310 +7EE10E7826980C0136600D916A06058CBE8604DB4D314FBC014EDAACD0820F14BF75449B70339490FE5A0491221BF95F949DF1235380E969AABDBE2D32EB4403D3FDF17F42F9A0A7C28ED75BE86BDB7C7EC80C76F86B8800F77B305EB88F00A4352E0F8089EF811EA02A3DF08F7DA008F803BE4B4EF5F41E56087099E92070 +310 +8C3D720916444440FDFA013D4E1201414123A09290F5BD7AB729298209C4306D007BB0829FD4EC3A6D7E4F00B67DF38CA0764F832F0448E58439B952CB4F70DF964AFA74CCFDBABBDF273E2FF4F56D3DBFF2A78D42FFF2755DF307066497F44062AADFC0CC546F6DCCFECECFA232E14F408F05477D311B683A35BC245FCF8A +310 +5CD2AF20022C21022266905A5BCC8B20235D6FF04019CC04058AC80023662E25F342063165956320BE50370F2A657BACC817DDA3DDD3EFE04028645780A768FE38DBA88BF2EF3ADADFC7FEACA952E5A77568ECF0C971DF32BF1D24F8486B22A649EC81B1B60315CBEFC026091CA45F858D7D04C1B437079431E63E38F88075 +310 +8842E780A9E03791C0FAAFE10012588C3C592FE35461A6047802BA18686887023A422A49599399893103942CF6DA53A8E387825FA0678B261F139F801E2B17C901D0F5217E07AC2401A87D0480F753FBED44FE949C93A1D042B879FCE499B3D861AEB23F9C1F372F0C24D0B7D6E70FE1AAF60F84BAE642D82F0A9F53E22783 +310 +915518494FDBC0AFAE7DA282E5050B703570E06319A015E00D693A6BEFFAE493941C3B08C13B96BD20D0115A9565701DC58568A3009DA13E965765C03091F0FF339F7309D44F6E61F837F1B1FF920450EB8FC48F9B40158BE89C81A597CFB0DAF5F5755D3886DC13D4479599B583758CBF35663AA234F133F91D3BCCFCE0A7 +310 +94367F385C59B19431780F1C099131384056616E15A1563B50021D369C593FB292685A68A8B2A50A0A2085CF05434617E05FC24A6B077B990014421A68401AC4D65788EE25F737EB780D08A6E38F060F2ABD889E1B889C44852C2FF368C1E3E710D73B6589EA83F7417B341ADA1F639A23D15298F087AD0326410E116C3A1B +310 +325218433C71AE62C07C1480F1C045629724A076A4BB8D622D24690486727F56108D07046DAB065000678E04C4F8C342DE27F4AC102D854F2D08D59B4ED0E4F697B0FF62F113646BC5B7F3131D4EA8BF8B265EA3F2026E7061B96F6DF3D993276B2180B8E57067587428579460551049049B074CF8B1066C7E14C705F0B392 +310 +98C0997C17F701097023BAC31081390196801FB0C2A12380042927503D5A01CA127F9841B460310639C674BC8CDF1A320501448E0068905B07F6E5602F8C1F07786253438CEC51AE61FDB25FF71B09893AC026A9EAE3F30F369F5D5EAEA5801FBAD3C98B38C13EE017B054F81A56F05259DBDA64FE270B1FC4C77200FE276F +310 +E814B916E222575ED717A62A92956504605268408CFE13FD61F84252228376060206802B9550F00B9D47E6AF1022538A752CF4FFF1F5931384A9FF8700EDD4FFA2B93FCBFABB3EA6C607FF714B0B8B04EBBE83B52B246092AB018C0D0002FC490849F1E214AE6FC42009D6D86616C835B65DB9862EFC4480C14137603C3089 +310 +D0A5588FA27E693DD184131BA4E88C35045ACEF1CDE1A82323C20B842F2419604821196EE8185BC834AD44F8E9B7549A32900196E9ECBBE20FFB4706861AACADBBFD9B56A23FFD3AB8BFACC18B1B5AC0ECD7B6AE2E2E9CCD2BE8AF1B1BC3A813B94107E82DE67A42E7CC7D4A6116700B5B2EE3C338A09B840F07C40A64800D +310 +7C605AC42B72227C4C7020AB1F20056E26F542717F56534261DE3766AC10A6ED2D006DD03BA9DBA507AE0510A8B385C92363B9154167F1230C40D76AF6F3BE0CA08F8BA2FFBBCEFB09D0986550E0F0EAE2F2780CDF850CB0F88CFC2815FE87BD83909F474F45DD47F1C821DB2107A8817FD45384F57891B65F2543D0C1E20A +310 +89B4A8DF806862AC27C60F6A054627FD344250718AC0FA21CDC4E28DBF2650D1B39D8B8A420C348A4F846E2BE824BF8C45E1DB8EEB52F576F47A75FF95F90FCE0FD3A7A08D48D5B9AFBE3EA658E1676FE3372FB57F0AD8D70ED4AEBA3D4C2BE0AAF1C3AD63A6004D12900CFC481A47430C9EACB390038642C8C41B13303166 +310 +614210592736B8603AD4FAB17189DBB32F3915F0C380795A089A15228460BDE8E52203527D41B5470901B088D84FF8B3FE2BA7F4FD30ACAB3DE0B7E2FF95807AB0010FFDE3A048F7360F9F3FB9380EE537F16F8673131325D3351A3F664022020811A0FE8C019CA17370725CBFF64132025DA1BE2555102212E80A907FB43E +310 +D80A991A8AAC183932C19AE17524B06590B6AD286EB99BAD18FF4BD64BAB519202F992A963648ED30E7521F909F090C0213E367A77D8836BEB6F34D92EDA624183070248351F1A079E5D3E7A9EE81F2CE6678F92E299EE312B6C0572C0A7B5EEE07853612403813152C7125E2022A20C18F855DBAFA399817FC97FB6E1CDCA +310 +31D348434ACD0012F0D32A5456B4007E6E92D72B1A4E9971223A42C1042819E4049C0C5801300C0013FA48F8944FBAE71DAFC27F1826FA2304ECDF3F6C10FF47D5C7E49748DDD687DE8E91C09394EE0682A4F84CFD6067EEDF43E67EA46CB2F4070160439245F00343D03BF25D7E2F26FC400A896DBF19FB8D4D0A66DA669C +310 +3D608F9CD048A0533621B25690EE19D5D15248E390F042B12C682511B02BFE3E5700E4C9A9B2107A8F45248FA48234FD23005ED1F4EFE80D1320836F04003BF42856D478D1DCA3ABEEE3C68F9F30C3A16E5C238EA5DE3FF37DACC2F8B7980033F47FAC34421EF0418A045394802CE032D61C70023D788136788613887C0011 +310 +A4EA316E005718AE191F8D0D841B9C679CD2FC478442D005429166F5A24403B1E6ACF3298F388B6D0BA933D92339D48969A5C11F09B4FF017A9900A4F887010C474717E10F36468032FF33F4AD610517777104CD920C3CD15FC5F3B3A0C75BBCA3B00F2724863C10BCD4A0E00736C7981F2F72E4B001438B99714FCFAF713A +310 +2603BC710376A1715FC602022202E06FDEBBC680A3DF1C4C095A12C50B554FE7623B50374FB2129DDEA4C392C9188077658C87F55FF92FFA507FF03FC8DFD3F31BDAB46DD51AEB03F7E1B38B8B87CFF47EA1479C3EBAD5C6B382C221C0F1B358B39D76D9D3142C4A20935F541E492E0EF081BA41B3620A8E172B584EA14856 +310 +32E22A8221CEDAC6110AFA4B6D43E2B76A18AB240BB24337721C9321D2C033B2D3E2641A55A400A28403C12D1DADE39AD23FC5FC08C47A64DC3FF6DFF76B5235124022D7E6D6D5F3CB870F9F31C96FE477FAFE54100068A3A87FA5908A2C08011CF31309C10025B089FEF9C510522B8DC07C30AA469841723A10C08E27F00F +310 +7FBC181C083F2809EC3B2B328E294AEAD5A071B3A95C81D2DE3F930372D022C9C793535B92FDAD5426E90490C3C81D000017C6494441544698C416520C1C40C71FC204B22448FD9303782FBA67089A1A7D4CE38E89050FEF5F1E078A4DCCFADA058032C34C1CBC2E1202B1F8962B1A8024F0EB7A11F209E96FB369D4B64202 +310 +FE7BA230AD24C46413536EAE955B341B726C593B5D4630C0BE822480908522B0D85430230352618DCD4F7BA6D568BF4343801480006658EA3EDCBFFA9702B4FDE9022163C43F9B72B58001A23FCE6F0B3FF0E4E1DDFB9801A6FC42FD0132CC1F2224F89933107AD30B6C9131A53818AE944BE25A70810821C38F098411980E +310 +46D108F483DC63F49B91B852351604091D60546702F58A3872A1716411B642C7629C267E64E77719F46B0548FD6BFFFC86A38DBFADFCDF700228C124C8664FAA02BFB1F92B09800876FCE4F2D1C3FB4FD0A44E0106A8DB8079751CBF0BD9340066C3D52BC64706467C05B5A54401BE4A1B0132A55EAC1CCCB10D378A3DFEB9 +310 +812022327745EF2102886A9142C812A1A2C9708027BB55B7006357459F9C2080E0BC34489FC629510F3017B62D5073E2A2C64048A0A42580E413BA9E08274091A398EA80B5BF31C87BF5ECF8F1C5DDFB4F22AAC181F070AAFDDAE5650C4000516440D8806786D874215149E69ABEC43FF0EFC820FEA112B0522003C84BE03F +310 +B76623513B6D840820358B084119B0CEC8C00AE888826339A54091F5FCA513AFE147975BB1A86FC50618D9D74502F0C7C8815AA306602FEE3A5E79E0D7DED1B221001118B73182CD439A092FF801105D1AA14E1918EC282F6260869D55108065988BD67F68E5581720A708051F7C8070F582389C682BE53F2AFD85853F2A01 +310 +3D21564028E06E79B7A71E43212180A81541EBC88F451E02385100491AB0C4A3BC5309A95911E66D04C0B448366988ECD204C2FC930F8CEE8FA410EE4C25B58DD1B6EBAD83F6196670F7DE635282C0A56A851AB035831725F0471A10FE52097089C80495804100318405F0DFC2136004B4C40705EC9154315129205EC35793 +310 +0035688F61AC02188250CFA9A980233925F16A117A48CA54DAB6400221976B75D863330942E20EE3B00B08FBB71AA813B0E502FD2B023DF70114E0D7DF2E2EEEDE7B789504200112075478F2FBD6897835C91F0C20782401E801A2F9142700B74805703426023A81CC0BE88B537D0003E0C5181D29EB8D83050964DD258091 +310 +0A1E7A8138F76253DC01DC2F3824391AD748276C0B0CDF12366625D038603D0003E0266CB42704C8CE7FA7F11B4D59C0BF454A78F8FCF1E50513715D469607031272358F04E0003C90107223A581218F10008B10247CD20D860FF0BF48801040B361808148714764028EAC137E871501EFDD97C89B52107FF1235B0928C562 +310 +530082573CE137840EFEF82A0BDC602736C595912FBEC69E6A3A26903B3A300C5A098A9E3F1810CDFFBA019D97B4E7A7A075850F2E92569BD960CA7B8304995FD006FC4213BB1448A6F4BFBB3A9F9FC4962D0A1369129B10073771FEDA38B1737B663A71C088D8848027FC3008DAC4E4397A6F76271DFFFCF77D6BD7F1F67D +310 +A51E0E08875A6BAFBD6BD7AE52CC04A0B4A2206F650EC412841A48258258E8662C3838FBE21E25172C2A15A4F78D82DCF68A005DCF07047C183E1CE47731BBCCB5469D9169E0D588945BEB637E87802A03D88FB82486210D28FB3B858D13DC7CE75F5E6F3B03C1744D30CC58C7C7A256146853A05243060B850072A7010CA4 +310 +7CFBF9A1E24F414037B8781E8E9F219A774B36481CB43E48A79819D638C8760D672FAC19FB9D3FC5EA9158DBD0159C27860409682E8FF2595652FE189D2CC2D7C023E944158355806FC320087CC74116030CC376C559C098B93A041C5DDA48AF33827D2327DC761D19C17CC62780D82A170E6CE7415A5E7FE825E053048F88 +310 +D2AC2A561CA4D4C60098DA28EF1A01382772484698F60C8DD24BF396EA76260542810A625978C03580A9CAB91D10249BE579B0377A3DD15749A45F24C4D81FF3D7D7996F6A1690288008C0FF6CC186DA9D5FC95BB09B1301004B016E707FDFED306A1BE8FA208828F00BF342186839839F1F6FA338DC5A0200FF383DE92614 +310 +C03A4508DA18F4D85F9354F7E867AA77A42FF49BBE6757A1A7454448D0BFC3C220714FE43A3D8F1547BE10F0BC5A05985AC3C28829A06FE24CD062700601F4AF12AF99099B08E7071DC4626A97C920C3FF96E190C9D1FD7CB6163E800D79E5F3F10A9306C02B799E80F1AB380E0571A584C0370A220C3125000B500900D96F +310 +EA40409F980E2083E4EDF4D8D2480AE5667222E020BCDAD4EF19682120818FE18EC7FD6AAD67C03F7DF1955E697456F517AC4F24700C30171C67E9168B109A4F60AFA60F98BE30941BF776DBC7C70792A2FBE98AAA97224F8BEA39B47BFD14A8CD03320DA2B676E3AA397E652E30A42CE2987B7DA1EF7F75242413800A04C0 +310 +270C62A13372400B435ACD84B8B5009208F5AC73EB149FFF3508E21C2201E0338BE07E50EB47E7FF6D97724A601028C5519073E7978EC88834410450E074DD58AD13A4900103A6444A9CB99103229F0EF8C0C78161EBC68137240734CDCFC349807851E0EB46CE864D2E405ED341B71A390CF2DE20CF5193189E1901E866D0 +310 +230409684B193D17E2928534D04240937D3C84477494FC5E0FE0B448E35AFC19007926C1C6A6E622FDB8A12E30993C6710E070397C4B26304C0AE38218D19F01FFB15BAE1C0E7E74DF75F2406E373C414E848FF8E500EFAF3C1029C9C0ADAB2313A7426CA9B2C1B9E30032C84EF31A09A88A386F136E8C2F1D582EA0459207 +310 +015F10F1F001F0B1B7DF7222011EA2001F00BFD36BAEE0850928B08C077030FE3806C880EAA74BCE0863A952812E6008B3A89199C1EE918AF96AF583F1A073B0A355B9D861AF1460DCFB3BFC6B7EFDC834B09700CBED3510E48DC7129041C991F06BA5006CA6B5B34EE21501374E8DFC910042036111EC9C7CFA1C05D48A72 +310 +70F7F835BF04A4194DA4CF76CEC66718C84CD020D04C412AC848F03E3C61A1C8D50D0EA6838A00376054D3DF61A0E393E1F8B058A6C994093476D601A4A06F0CFD3C0A6BFA910E75CC10400A80FDA93AC9B5EA4303F6C0D188B559086091CC5910137772E14F2376D03181B5CFE74C0EA38440D0AC256D6C4D104CE05302FC +310 +C00B60B9CD4D71E08BD40C144A025E60D4C1F45FE846A2105D717EEA84808A5DD90A168E133640311CF05DD870768683F5D2F1800F485AEBE5CABD8FFA3C0BEB33702493AEB551B1EB035EF5C8E5757FA7832141F88E8578A363802B560007AF93D7D470B478C4D00B412D634C9140C4F9275C00DCE8DFE3C7F8C0AFBC5B2C +310 +E82E3C3BDF393D4375D50C43CD1C17E3777CD2C170725B7B42B41DF15BFC344DAD089C1E9118522B4A2C60B794E4E8F33081BB7C8CFCEEA0B2015E49D586429C6C78646180B7710E06018A3082243C275F077FBE412C17DE80D3E6B9462C5204C5D980D1DF84A864401C483CD01B143F4A4868087A0F780F37230200A4FBF6 +310 +AED325114C367C22512750A5C7C3E32D545CE20A0904183BA10015DCAD89864B3E1EE97EBAE8B204266A48E010511838E2FE413FB116E60880C2D8440AC3880DDA6DF6618C138CF1CB2A09637E18D00F80CB0DC05322E31EADB8081C29410903F06BFCDF5AB46024E4A75828056440503C707856EF0C037623DD4922A400E8 +310 +A6BD75E4D2800905F18450A00CEE88860C8964C7B3F90F56528BA18F71CFBBBCD2D05797E168FC37DB26DBE0DD2EAEF39686C18440820013C1444055402A541400DD362A0A402F1FE51246404E098249FEE30708C10CA0B54601053159480C00BAA9B1223A773234FE72FD5C3BD81804D8D196FE3D5315A0C981D88D04FA01 +310 +DFC185CA93F9120E1F480B08063364A0A318F08DF95056E4C91F1150D31B011200383502E079EE43CC18603AE2F88FD139C802A739F208E88D06DC78267C448C27C4113C19B0F51B0E9C1C021CF8F9167C6B1F2E10E461002910105D1042792D1CA303F469714C018C23D72179E165049C40E801CB96CF334562E5807291D1 +310 +E0C70FE6CAD91656715F0E5C5E70F8D7F83290549B1BAA6F781D25180EBCA93EC84E72A74081CE3020789B3790E1A9E478E658C099BECFF01E530E80EC5FE31204ACFF70AF8177A03059240CD074978A002A878BF883FEEC81DD684E406CA630ACFDE87292822A11953710F000885D6F68A67ED40CD772B0828359B753F7CE +310 +23D9479AB9845771B389D6A77130F8C134EFC83947392029B10E4425440A84AF0E54825228FC1634D369874739C837A9DDC83C20D320C36042610ECDFA750303710224D01202488012CA847424F8D53F78AB6BECE9B3B35A7F32396AC6B7444566327DBB4DF06FD9616744F4D3A397EB3B0A3FBA8D763702883ED742FE5CD2 +310 +4146D8E353ACCF811C806AE09914D8446E93840FF4D6C963FF32BFB6AB015D1D3B0C9A0968776F021F21404B6260CF84A14F35180CE20B5E85BDA2EC91FD5A7DBA7E5705F4F0F97AF26CE18E3BA078138202400A62930FA6CC7882F911A92F33E547E64990B0F27323D73B6222863F86425153FA8009361C675554C25382CE +310 +148420C8DCC47A20122806CA178A0918C14CBD33440289078A00EC6070184CA9907FD0A1270478E0B325B67C2193694EDB7DD0F3C238447C8A11485562FB4902134E6AC952FD5320A4F7C780882DA9684285CD81D278C0E8FF8DEC9F45D22DC3C2CA99C2728110888799575B6834BF22B0F01EDE72D7F21B672C40F0A97299 +310 +9E2200B7C91403F9BB3D09C01990819238CBAE5E7510D7D57450507E3DB04AAA0A3C280064E0775380C8C16EEA4834346A04BF0CE847B4B3AF760D06D24BBB267C32E2C9257DE5EB748AD101AF1FD33265E2B674EED8C01A0AC901392211011AC810560F77778E85B13BAFE3E25C95B70919A4862C15928BD8989664AD8638 +310 +101D009A80F00BDC41AF27602A4BDA0C077E550048E7F1011410F01405045E1C140B4D0E70E0F6E034171C3D6FD12004FCC1FA304312518910356628A4A326EC9ADF5DFFD1B2C0399503F14B4F8E3E0E4E39A06ABCB56A8014687E86E462BDDE5124615ECDB412B7314F62E6E0C76ADEC0F717B360E741960104CF1706CFA1 +310 +8E0605004B01AE007869B095ED92144A807841EFF2811C047889A04901C809062057192688C92346F97F279449F89B113500BAD282D1DA80A55C27EFFE02C8D4F395003F285B617BBF0831F49B055342DDDD414378E8888E92C16789F269A27C9A221FAA4A0DFDDB9F935B2ECC04DC51481558A69301E0460B02665AC4DD30 +310 +C03D480866C3409400051811876014C0F294C542821AB045011A3E3F09001FF304E3A0BED05CC11A811B865001769507FC01ADC611F400CF68C7B093606E30F3C7E0F00C1D10C31951C1E2D7252181DA00345842A19130715C736EC9ECE686A712FDB31E4D3E50AB336E5666D7B212C0113C4A4406029709B43D0228F3FBAF +310 +49921B19CA0C82A2D5BC4A2079809240F37D3E10F9637607C3983F0458508A98B8B4EFC92AC13530180CF55359500080061DF59B98BB3FEACEE881DC8127F182A885A86FB12B43C590A4380504E32305E3148BBEEB2D2782029765428092545BA5C2C681FC5F8E869C0EE1034A822FF09A12C94084505AA868080303473F81 +310 +61F7AA0A6610745E280BE4427FB770106F8800EADABA19F453210435BDB2348471B13B65F2FCB554827632C4C44467333E4127095D22092ED492009930413251B5408345065065E415266E20279A40B3F520370BE2050C8360E6BB4601C1673B9BFE007EF5200B6483CD195400A783E6DEA0653515B0FCE8E86D1618FC1EFC +310 +15C2E727F24F2A2DAB57326D8D0877D4E298894E7A0C3C7D9CE8A0E2D17AA2020FA1097D6372F2A9F955060FDD467AD0426368C24A8340FD0D6687A76316DEF5179ED9042005A2BF02A5DD810A4DEFA4A8F700EFC50FF4FB8C06410F0303C106ADF8852ACC6A2CA9046E9ED070739339857222CC009E206479886EA26227BF +310 +7A341A15C351A8404A6C10080A2140FA4B4E8D9B9A11645899332363FD69887F436A660566964250FD752E787B64BCF8E6C8190DF8EA0C854C062D8A5A1346F810414313E606ECA0AC3A01D6928544029D5F42E202C0CB386F880F7842A31287061F32F3CBE09F2950783394F2F2B23D85386C6F51943E99DD10C8A0000BA9 +310 +569A14805693274BD0E4F4DC3F28E331EEA91C4F33ABE057889BFB92819187840A08E57A276A8BFCB75B0342668C70C565C8059996D209C2800941A21FB82B2F520BC2E6FE6F1A8827043DE17000DACC8193E78BBB8DF1467978C06F6AFE986123E3A95272CAC122046F4C65C4B88FED2F1CD1D918F7CDBF8903BF1A90057D +310 +42F4DC133AF804ACBB58446A0DB78806FC053FA1E45D0AF1112613CC0DD976C5E70AD3282F42725C0D02AC8588DE451B1C01ABF063E7748A3882F0DD484BB78D037F9812240EB88B6034C0AD53E5116D4C6D920C6A89F084E6D0598AD7EB6930CC7B293E27A666E5CDFE9A3FA52FEB3C97976FDAAE9A60008FCA6B33099CF9 +310 +880D35D419FC687D424378E3099441E110C5B3C6DC311E6653514A67A530D863326C4D8430E0C28024803B5B069B0E60C10EDB6DF087034171DF01F1F3404B27B1056D8C0E56E7CA6056E7798147BE4C2F01CED5987E413AC6A724876DE3F599E0601CE7B9CEF3BEB3671E12DCE8AF9631B8031D3F360B6955DC2342B2A0E4 +310 +632A00264C0DA002220CFEC3E10D9BADC8904D88DC51928593AA16C91DF6FFF82B3234404C7214D0F8608E0052283EFB2B0563F1D072936C4017706010BCF1B16CDE0C1FA9C777E44E1F5259B0C9BBC8794A82A6C182A3AF56B16921405351FDDC91B5BAAA617860E8D76C97C377FE701A4EB4378FA97C2C8E3CC8950886C6 +310 +FD93AF70A1F5F676B7ED16CBC56AF5D09110EEB8607CC08A795882358280DDB98AFFE7087C6EB593D62F041CDB4018935238E73F1098100D0C8769818F777057F64C703C6530E142FDF5C837AE1CF66C94C4887D3A3726AB990DEA248F73B5D32C8E04F6714B1E67C53FC52040252E605B322407CBF8C7F05453462A295ABF +310 +4D95592DDD76AC23512E9A2DF964715C80DD752CA8E263AC36F02C3C28A133EB22AC8D099BDEFDE28C3E8FFEE3815D5D00C17C00511058354D62443C1A546280E43572A9C661A34FA5891F8E7570608C8DF21DF51DF9D2A84D4501F41B8CD4F4C9DEB2F901E810C0E4CEB6EC08DFB06341C864CF8D0EEE779A606545E1E64A +310 +AF30A4324C20FDD3BD558BD966BA994FA915CD162B1978642AD01694E533EC190368A68234657085B5F88E27A0805E04B8BB6A00A51646EE3C10A50FF007FF410F1963CA69BE2002F0F902E701AEC995FD41F83A3F0C3809A3288A083003A6CC2A20E6D703EE48E3777AC07ADD51EB6101603A9FCF17B3D5928F6D742EE7E4 +310 +CF38AE2B03C5FB39C81D7B2978FAFE85AF3D2710B0582C970F0FEB0E4D1103B8BE2B4D560CA10002FC8F334C891C07B44FE06B2E3ACE5E1E2D1FC32203110ABF9CA0E8381F68EC3C06701328E5A38278A5FCD944CEA5283DA933DF2A2448BD23F1C5D8BE04CC2DC3B43B3EEC29F8B5FF926D11D3E97EBF7FA1BD1E5E5F5FE6 +310 +D3D972F548547783146ECD84873F377C5820F7F9FCE5E07378D6CBCB7E036DF7F7104079A05B77C6942D1BA95D47424BFC3DB6411009A42E207871B7EE9B06614BBD20F22F7523FB985F3F7068E37600273A3ED0C1CCC380F6EC4AF01CC1CF95E4848B7BF950AD14C44F10460221E02D21D01DAE800F323704C00035DFE97C +310 +B37F797D3D1C0E4FBF35EE1E5E9E0E879FBF3DF6F474780A01FB3DAF01FE0C0798218007C2090A3008BA7682A338F4A8804A06CBFE6A80CEC766F49853F15B2F45FCEA3F8250012841315016E75E797EFEEC4ACA6C79F515CF1738F7C36E2406071051043817C9E8C5888D49D0332E800062FF54FA562BF7446CC0BFDFBF86 +310 +03D1FEFCC9F7FFB5A7F000430755C2D3F72F2D02A022820897ABDD44594475BDCCA4A10AF34C06B08B4AB58BBFAE30999DC66C7CE903A83CF8EB006EEEAA063430F84B05F0ECF644825F5E95073870E72A0771AB89B080022A0C5A9FAF34C89286257FB7BEA000EC65B59750C68E0815B0D9834B15606328F80709DE09018A +310 +C2A7817F83F96DB3D562C10A0A31300230CD4200B87F85808BAF64D04600254047F9C14DE93464009E7F5AABB4FDD6D55142A2C0BF1541FCE19C20C899BF4F76AB54B84CB97F88F48ECC029FD253F0C70DF4816B9AC94BCBD653B1A283C4001A0337955E4AFED3FB790B6B1F5EA0B5514074103A38D84280EE0F5F9BE974EA +310 +B2D16AB1EA969684B6E4166CA28264B300474C7308D20013B204A65F82970718D05678B3315D442E1C0A327E2F56556040C005D2FAB1326A68A07507C9E46A3648555A7080F5F50219A00E6222E3E0862CE95B5680930530742F1D041805E69B788161F015944D041182B861A2C17F3AF01CF5BFDF6C343F9171F5B004BF59 +310 +C016719164B888EA206A02AD05E8464D06B48E4381A0E9345FD171625AC22198F57C003BEA5510F81FF78D31C9B033D0030000000049454E44AE426082504B030414000608080051A1A55851464CB48900000043010000360000006662782F46333343314631312D433039312D343442382D393038332D3537363542373941 +310 +374146442F6469726563746F72792E786D6C9D8F310EC2300C45AF127987122606C71DD918B841D4B851A43646695A717C52A85029031293A5A76FBF6FACEF7DA7264E43906840EF0FA03836E242F406C6DCEE4EA06AC22492573150D1F66C60C640E8938CB705396EEDD86DE9B5042FE27813D640EA63BB001C722AF6E55C +310 +B61E4863F58284D5D3F53DD715CE1C3985E63FD7F1B7EBDD617E9F1E504B030414000608080051A1A558CE3C599846070000541C0000340000006662782F46333343314631312D433039312D343442382D393038332D3537363542373941374146442F6F626A656374732E786D6CDD59596FDB3810FE2B84F665F741A78FD8 +310 +85E3C2C7BA30DAB4458D2EF64DA065DAE14617282971F6D7EF90226551916DA507506C02C40E450E67BEB94793B7C728448F846534896F0DD7720C44E220D9D1F8706B14F9DE1C19E8ED144D5892E4B57D068A71446E0DBE6C4C27079614A95CDA913D2EC2E6EA6AFE37CA021213030521CEB25B230BEE49842D5CE4C98E64 +310 +0FD60EE7D83AEC8F966B951B75B20786D3FBC655296624CE8155588F818AE4C0D5FF0591ECE9C4E61BB46DBD6EDBBC0BDB6C21B8CE288DB31CC7C10BAE1AD77967B86A5CD773FBCB3FBDC1D81CF4FB3DB33FF45C73BE9A2F4DF7A6E72C868BC578F6E7D840D3C93649C24A01298977A0C56763EA4E6CFEA4125FA2D0C67790 +310 +C43109249A6D1B7644D2A5246B62A201EB0AD16A0A2965AD2DF43A0A7F665B2750349634B49570EAB36EBDC9F61F0021EB62A52C23DCCAB39C81AE25F6A53F3813BB5CD5F4423314E19C308A4314D22DC30C14045B4B056964B8B77052886326B4A8E8D57905C3BEEE4B6D5CEE8B30E4FE6B4C85A7F9E08F24CF0467F45FC2 +310 +4EDCD76F039E40DA82C6F9480A9B3FA740623CB1C562F9ACE7C9872590681FE203580B88C937F5BC065E0B1E0BD64B63FA7EB53D6E787C68BF3C65494A58CE2D4F38B3F43BA5C19A6981F17500A5C455D7DD09952F00FD4740BEE2054D40738C1EFBC7BE929DE138DB272C02ED2007990EFC7110FFFAE2DBC4AE0E4F11D262 +310 +E5394CC16D7F10A69A18DADD3548A7934730FA84F5A4709B008760D37734E67E0E8682C2049620DEEFB74763BA86600A8B700A87203DFC4E6CFE15C1474907E24D43436DE1B783A294C334FDECA4AB7760338C0695AA3419CFE13BF821F8CE969BF79B82ED7140EEA4632FC99EC6348764DACE9006BAE6F25FD71F8547BEFB +310 +F0693EFB703AAD6D0AE09A43C2E3468B5A36522D48E80538E169B8D48C58B9A3E0ED6188639214995C6F8B53411226CCDF3EFBA50BB7DEF597B281F2326900ADB10C927BC068CA3131A6525B5520B46A82828561262DF0506AD5DF1651EAE32829621E6A5F9A62930F8833DC1281AAA0A60C5B79AD22BBA3FB7D9141F06A25 +310 +B9D08094FEAC089716DE8738D6C62F237B86218926B14F210783B3B4DEA05D50817799E78C847B9F866111F97B1A421EF1239C9EA1DF51827AE67A20CF4F09DBB512D42D4BF9A4B2210EB8045681A4B25519F3A54E1979A4BCCC14F94C65036D87AC438D69FF4CBAE099A20550658CC2CCBDE56AE10DDDB9B9EA0F56667FB5 +310 +74CCB1331C9ACBC16A3E9BCD573737BD51934F15ADEAF90E54C9CB1CCDFFF2FB22DAC69886F0808B8D77E99BB7227BDEDA101AED55AFB77057AE6B2E9CB16BF6FBF311DC3DEA99839BE1607E339EDDCC564B9B912C29584032DBB31D5F99641A1FCE71A5B87B1943A1ACB99EEC94BE9AC2FC8F63683327684AFC55836815BB +310 +5A0AC2AE41941F6D86501C3CF014E50750F5B5BA4F238836F9688B73AF8CCB8ED573C48FEB8E3D67EC8DC68341C7B0276EFAEE48D72643009D6791FB498A039AB7A7D406321D597E5576B17AEEA0C446FDF53C0478755EAD98BA9C9924533E8DF081F87BCCFB8A96507A4DE2D6AC7708932CA331C9445FF8A25E6CD0742C28 +310 +BFF42CDD62B634F32392E36FB158D16834BC00A279E843079BF319C2D53AA27201D9B39CA3C8FB6548F542FE673FC3511A96BDF1350C5C4F41A0BAA2360BE54CF32B1EC13E7D9CFBCE8E8851C735EA15FBAAA268D55A93FAF89BC99F814755423F111E7545F762CB1AB863FE338230341CB8BDE14DA58A6B68A9CB72DEFB85 +310 +0574ABC1B3FF44E8E1BE5371DA4D2BB532AF2CC4731241EB8BF38275F2D8214413655B4A2019191A2E51BBE99505A5E8F954D7079789A6EF5C495CBB066A571AC36CAC93202FA4683562A10B3107E4E3AE5778B6C2E62AD5EF8E983FBDCAAEBB5F240646D771800ABB0CC132FE6875786BA5AED550D913CE0308A51BF169CE +310 +C1237664776AE634726D65BDAA69AF55DC6B1E522398F2621E69EFF897F00B065543C79DD9EFCA42CF2ED7D73CB55930D03EF1A131ADD3FAF46ED3A0022B9D4F7FE61891A70605B9BAE01DF405525FD7A73941838294E8EBFAC2F15FA20B510AAC8DDE60829C252185413ED9A10349207FC3A8A24387C2229289BC0CC62B83 +310 +947A8BD0E1F4633987CDF13654A7837B0CC3EC50F66F45008354C899B7865C47BFC1E8944F2FC540CB7A80D64DC63003158CDE1A60B139850ECDDAC2084C0C1C05F5C688131C1BC7079EF1CB53D5FFA7631C1D884A27B9AA3D5D70919269CE04A5702ADE2D40DD573E984EBE5D74C50EC2397CDD167925CC69E1248D0441BD +310 +4428858349E18384F70825C565B95C4BECD120E934CDBF6807255533C7EC2046F235BC67CBCF369FA6AF3FA1342C0E5C9D973A668D92C93BF5B028275713300C29668A7915B978637F6609BC968AD08A8211A0DF8FA3E11FF62289A2242E97EC997CB98536F7F0AA6A67AB3121B4FE8EE7D96272205F05F85B9C110BEFB207 +310 +5800D532CAE7A925C49A0154D1B466004A235C17704CDBBF5E22591DD5A62AF5B0CBE111EF011038127FFFC3DDA6BEA136B4045F00AEC4C3D317B530B1190CCEA7FF01504B030414000608080051A1A558550EFCFAE0000000550100003C0000006662782F46333343314631312D433039312D343442382D393038332D3537 +310 +363542373941374146442F7265736F75726365732F322F636E782E786D6C4D90DD6A032110855F45845E46DD6D0A25B8E62572D59B60756225BBCEE24F69DFBE636AA1208C9CF3319C39FAFCB5ADEC13728998163E09C51924873EA6B0F0566F8757CECE4667C4FA0FE32CD90D16DE656E74C8D8F62179B8D9B676758DE93E +310 +44750D90204777DD53E0CCADB6948517F7019B15B655F450EEC2DB6AC52432146CD901ADA87183B1C265B0153C37B39A8F07F542EF32ABD3A44ECFC7372D3B69F43BE23AF8982A64DC9F66E590BE8912292D3B6074CB7150FD0C32FEE2098AA725D946979AA98381D5EF9DB0B8D900F281FCBA46CB7E248D4703347B21E607 +310 +504B030414000608080051A1A558FF15A4A45D000000800000003A0000006662782F46333343314631312D433039312D343442382D393038332D3537363542373941374146442F7265736F75726365732F636E782E786D6C4D8B3B0E80201005AF42B6F75B59F0390B113044D83508C6E30BC6C26AF226F3B8BA6360974DA7 +310 +271430F523308B2B198F9B80925DB700539227A2FCCB80A18E5640D320F996A81C9F32D6E9129A0D1EF74FCE750E6D57BC7165FBCA07504B030414000608080051A1A558BABAF6024201000056050000300000006662782F46333343314631312D433039312D343442382D393038332D3537363542373941374146442F636E +310 +782E786D6CCD94D14AC33014865FA504BC6C9AD60932D20CBCF009BC10EFD2F4ACC6B549494EC5BDBD27B3DB14197A31D82017E1E40BFCFFC99F23571F439FBD4388D6BB9A955CB00C9CF1AD755DCD265CE7F72C5B2919BCC76F18CB9C1EA066A9CC94EC829FC6B9D4C25A4F7DAAF6D66DE6A2460CB6991022CB4CAF63AC59 +310 +34AF3068AE27F42DC40D6F356A5EF200D14FC100DD473BC07CDF04D0082D5395A816B9B8A3F55489652996B78B17592452C9C6FB7EE6AD43087EBCA984F1B4752447C822014A4EC1CE54F2C0D4511B6FAC93059D2B1949AFEB660EB763E2C6B1B7462335AAF006017382400FB2F882952C92E31FBE1F1F9E8F1A68D7DA0006 +310 +7DD85EAC0DE5A9361CA4714AC4FFBAB003FF32EF9B37B27CB9773F6978167636BBFBE4468AEEEF24509EB4EBFA6BFC000769E7CF3F0D16B4E61A4DEF959DC973B11B81F4F06922AA4F504B030414000608080051A1A558C8AB9B3F7E000000A30000000B0000006662782F636E782E786D6C4D8CD10A832018465F45FE7B37 +310 +A59A0A5A54C3F7886521330D97638F3F1D5DECEA83C3778EEC3E9B436F135F367805F4420019FF08B3F5AB82742C9803EA5A194338FE6E80FCB4190505432BD718D27EA2D92C5372853AEB9F27D45535524D291E89A0B8AE078E05E1156ED8AD1998E859AFEFD9B81625CFAF97B7E4DB2F504B030414000608080051A1A558 +310 +A6D797065F0000008200000007000000636E782E786D6C4DCB3B0E80201045D1AD90E9FD7516806B51190811670C8A61F982B1B0BAC9C97B72CA7B1037C6D3332918DA1E04D2CAC69353902EDB8C20262D23F3F59B81A079470595414B17391D1F19B4730A5583A7ED43BBE4025D9592775E5ADFFA01504B03041400060808 +310 +0051A1A558ECFD112DA800000026010000130000005B436F6E74656E745F54797065735D2E786D6C7D4F4B0EC22010BD0A61DF525D18634ABB506FE00510A79458060253536F2FD89D5197F3FED3F68B9BD80362B21E25DFD40D6780DADF2C1AC9671AAA3D677DD75E9E0112CB5A4C928F44E12044D22338956A1F003333F8 +310 +E814E5331A1194BE2B0362DB343BA13D122055543278D79E6050F344ECBC6478EDCD76CE8EABAE5449AE4298AC56946789C28AAFBEABC53F3EAF09A84A1441B91F0101CD4780756578C173A578FFDDBD00504B030414000608080051A1A5583DEE336E64000000790000001B0000006175746F6465736B2D64657369676E2D +310 +7061636B6167652E786D6C35CBC10E83200C00D05F21DCA56CA76D41FC96062B120735B69A7DBE268BB7777961F8D5AF396893C2ADB70FE7ADA196782C2DF776D7A97B5933C430F15651E5469C55D70F80A4992A3ADC954792C525AE70A1E4D6AD9816CC044FEFDF01FE3FDE907802504B030414000608080051A1A558D5CB +310 +C925F20000008E0100003D0000006662782F46333343314631312D433039312D343442382D393038332D3537363542373941374146442F7265736F75726365732F322F636F72652E786D6C8550CB6EC32010FC156BEFD8601CD58E30519DF40F7AEA0D01715062B07854FDFC42EC4AEDA9D24ABB1A6666D961A7AFE5517D6A +310 +1F8CB323901A43A5AD74CAD8798414AFA887EAC499772EFEA24165C5A247283070367B97D61D92CE466D0B6A9DD23B2842D0112AF9C8C30841DEF4226A916266847BBD0A7917B3AE49BDF1384BC9A85D6A54763357A33DF009634ACEE709BD914B87BA0399503F508CE8407A7AE987EEF585B0A688398B66F9D92EBD16512B +310 +E02D6E3B840FB9DE5B7C24F848BB0FD614266721FA7CF3BEB45C97E9ACD9D03F6E6955FFBB2563236D77B74D118097CF3D1F386B4A3AB93DA3CBBD24C9BF01504B030414000608080051A1A5584F37992BF7000000960100003B0000006662782F46333343314631312D433039312D343442382D393038332D353736354237 +310 +3941374146442F7265736F75726365732F636F72652E786D6C8550CB6E833010FC15B477C0C64485C8382A49FFA0A7DE2CB32156828DFCA8FAF9B50395DA53254B6BCDCECCEE0E3F7D2D8FE2139DD7D60C402B02051A65276DE60162B8961D1427C19DB5E1170D0A23171C20C320F8EC6C5C77485913D064D4D80977507A8F +310 +010AF5489F01BCBAE1222B194362F87BB54A75973356B4DA7882C7A8A75DAAA7E4A6AF1A1D88911046CFE7B17CA397B66C0F742CBB9E9192F5B46397AE6F5F5F28AFB358F0A0979FE9CAA10C38816848D396E490DE7B438E941C59FBC1EBCC14DC07976EDE87E6EB4038F4363A859ED75BF78F6B5CA7FF5DA3368135BBEBA6 +310 +F020F292CF86E0754E29956784A9E644C537504B030414000608080051A1A558478592A7F3000000B1010000310000006662782F46333343314631312D433039312D343442382D393038332D3537363542373941374146442F636F72652E786D6C8D504B6EC32014BC8AF5F6D8E04F6D47982849E51374D51DC2C44189C1E2 +310 +53F5F885D895DA5D24A487861966DED0E3F7F2C8BEA475CAE801488E21935A9849E97980E0AFA883ECC8A835C6FFA141A6F922074830303A5B13D61D12467BA913AACD2477903B273D64E2112F033871930BCF79F091E1EEF9CAC59DCF3227F9C663D4ABE5572AACE45E4EC04A5CD60837F17C94F840F0A1AA3F6991988C86 +310 +A0A6DD4A4DD15D5D95B4C0C6AABA90911074C13D41757DEE508FBB0A35ED5B736EFB537B1ADF6991C48C3A6FE3CEFB2769BB57E59BF05FE6B04E2F6456DA57E56EB8291C3012F33C1F182D5281713CDB8D3395CD7E00504B030414000608080051A1A558FCD75C2F51010000DD0200000C0000006662782F636F72652E786D +310 +6C8D52CB6E833010FC15E43B60035149651C3549FFA0A7DE1CE3502B602363A37C7ED73C9472685A81B035BB33BB33821EEE5D1B8DD20ECAE80A9104A3486A616AA59B0A79778D4B141D18B5C6B81F6D28D2BC93150A3062B4B1C6F70B248C765207549B5A2E201F06E950245AB85468105FB2E309F70E3A865BD27371E38D +310 +4C4832F731EABDAA17AAAA414D5D95B4881D31CEC9E9748CDFC9B9888B1D39C6E53EC771BE27657E2EF7C5DB0BA1692033EA54B74E175672276BC4329C1531DEC1FB91E157825FF3E293A6A193D1C159F0BC0C0DEE10BB5EEE349DF18D9EEFEBBFF5BCD22ECF16BD99312016D69B0A8CA6211F38A6F0B619C260C8CFF14BBB +310 +5AB801344AE18C2DA0521BFF288DBCF512A471343D349DABA03C09FCA6933DD179AE014171DDC06ADCC1F5E25D98BEDDA997361EDD3DD2C676BC7D2C37AFF8F83E066D2CAD74615A63FFC35EADAE61A6E1C764DF504B030414000608080051A1A558EBA2B54806010000B201000008000000636F72652E786D6C8D50416EC3 +310 +2010FC0ADA3B361847B5234C5427FD414FBD51435C141B2C0351FBFB42EC4AEDAD12D2A299D99DD9E5A7CF794277BD7AE36C07B42080B41D9C3276EC20862B6E009D045F9D0BBF6480AC9C75071906C1C7D5C56587066783B619B54EE91D94DEEB006898D2A7033F7CE859163286A4F0B76291C34D8EBAA0C5A6133C98F9A7 +310 +7558B50C5A81A84855637248EFB522474A8EAC7EE365560A1EA351BB9551C9DD5C8D5E41F484307A3EF7F8855E6A5C1F688F9B9611CC5ADAB04BD3D6CF4F9497B959701FD6B4F33E24E50CC8CB7BF6E5E54609FEEEDCB40B5228859C9DBE40105E66E24FE8B8A87F843636B06A1FB875781039D08348C6F982A93CCE9B6ABE +310 +B6F806504B0102140014000608080051A1A5580000000000000000000000003700000000000000000000000000000000006662782F46333343314631312D433039312D343442382D393038332D3537363542373941374146442F617474726962757465732E62696E504B0102140014000608080051A1A55800000000000000 +310 +00000000003500000000000000000000000000550000006662782F46333343314631312D433039312D343442382D393038332D3537363542373941374146442F76657274696365732E62696E504B0102140014000608080051A1A558F270F13306000000040000003600000000000000000000000000A80000006662782F46 +310 +333343314631312D433039312D343442382D393038332D3537363542373941374146442F747269616E676C65732E62696E504B0102140014000608080051A1A558B5A795FFE3790000DE7900004200000000000000000000000000020100006662782F46333343314631312D433039312D343442382D393038332D35373635 +310 +42373941374146442F7265736F75726365732F322F305F67656E657269632E706E67504B0102140014000608080051A1A55851464CB489000000430100003600000000000000000000000000457B00006662782F46333343314631312D433039312D343442382D393038332D3537363542373941374146442F646972656374 +310 +6F72792E786D6C504B0102140014000608080051A1A558CE3C599846070000541C00003400000000000000000000000000227C00006662782F46333343314631312D433039312D343442382D393038332D3537363542373941374146442F6F626A656374732E786D6C504B0102140014000608080051A1A558550EFCFAE000 +310 +0000550100003C00000000000000000000000000BA8300006662782F46333343314631312D433039312D343442382D393038332D3537363542373941374146442F7265736F75726365732F322F636E782E786D6C504B0102140014000608080051A1A558FF15A4A45D000000800000003A00000000000000000000000000F4 +310 +8400006662782F46333343314631312D433039312D343442382D393038332D3537363542373941374146442F7265736F75726365732F636E782E786D6C504B0102140014000608080051A1A558BABAF60242010000560500003000000000000000000000000000A98500006662782F46333343314631312D433039312D3434 +310 +42382D393038332D3537363542373941374146442F636E782E786D6C504B0102140014000608080051A1A558C8AB9B3F7E000000A30000000B00000000000000000000000000398700006662782F636E782E786D6C504B0102140014000608080051A1A558A6D797065F000000820000000700000000000000000000000000 +310 +E0870000636E782E786D6C504B0102140014000608080051A1A558ECFD112DA8000000260100001300000000000000000000000000648800005B436F6E74656E745F54797065735D2E786D6C504B0102140014000608080051A1A5583DEE336E64000000790000001B000000000000000000000000003D8900006175746F64 +310 +65736B2D64657369676E2D7061636B6167652E786D6C504B0102140014000608080051A1A558D5CBC925F20000008E0100003D00000000000000000000000000DA8900006662782F46333343314631312D433039312D343442382D393038332D3537363542373941374146442F7265736F75726365732F322F636F72652E78 +310 +6D6C504B0102140014000608080051A1A5584F37992BF7000000960100003B00000000000000000000000000278B00006662782F46333343314631312D433039312D343442382D393038332D3537363542373941374146442F7265736F75726365732F636F72652E786D6C504B0102140014000608080051A1A558478592A7 +310 +F3000000B10100003100000000000000000000000000778C00006662782F46333343314631312D433039312D343442382D393038332D3537363542373941374146442F636F72652E786D6C504B0102140014000608080051A1A558FCD75C2F51010000DD0200000C00000000000000000000000000B98D00006662782F636F +310 +72652E786D6C504B0102140014000608080051A1A558EBA2B54806010000B20100000800000000000000000000000000348F0000636F72652E786D6C504B050600000000120012002D060000609000000000 + 0 +XRECORD + 5 +2DA +102 +{ACAD_REACTORS +330 +2D9 +102 +} +330 +2D9 +100 +AcDbXrecord +280 + 1 +102 +DISPLAYNAME + 1 +Imperial24 +102 +FLAGS + 90 + 0 + 0 +CELLSTYLEMAP + 5 +2A1 +102 +{ACAD_REACTORS +330 +25D +102 +} +330 +25D +100 +AcDbCellStyleMap + 90 + 3 +300 +CELLSTYLE + 1 +TABLEFORMAT_BEGIN + 90 + 5 +170 + 1 + 91 + 0 + 92 + 32768 + 62 + 257 + 93 + 1 +300 +CONTENTFORMAT + 1 +CONTENTFORMAT_BEGIN + 90 + 0 + 91 + 0 + 92 + 4 + 93 + 0 +300 + + 40 +0.0 +140 +1.0 + 94 + 5 + 62 + 0 +340 +11 +144 +0.25 +309 +CONTENTFORMAT_END +171 + 1 +301 +MARGIN + 1 +CELLMARGIN_BEGIN + 40 +0.06 + 40 +0.06 + 40 +0.06 + 40 +0.06 + 40 +0.06 + 40 +0.06 +309 +CELLMARGIN_END + 94 + 6 + 95 + 1 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +14 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 2 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +14 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 4 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +14 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 8 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +14 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 16 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +14 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 32 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +14 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END +309 +TABLEFORMAT_END + 1 +CELLSTYLE_BEGIN + 90 + 1 + 91 + 1 +300 +_TITLE +309 +CELLSTYLE_END +300 +CELLSTYLE + 1 +TABLEFORMAT_BEGIN + 90 + 5 +170 + 1 + 91 + 0 + 92 + 0 + 62 + 257 + 93 + 1 +300 +CONTENTFORMAT + 1 +CONTENTFORMAT_BEGIN + 90 + 0 + 91 + 0 + 92 + 4 + 93 + 0 +300 + + 40 +0.0 +140 +1.0 + 94 + 5 + 62 + 0 +340 +11 +144 +0.18 +309 +CONTENTFORMAT_END +171 + 1 +301 +MARGIN + 1 +CELLMARGIN_BEGIN + 40 +0.06 + 40 +0.06 + 40 +0.06 + 40 +0.06 + 40 +0.06 + 40 +0.06 +309 +CELLMARGIN_END + 94 + 6 + 95 + 1 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +14 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 2 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +14 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 4 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +14 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 8 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +14 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 16 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +14 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 32 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +14 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END +309 +TABLEFORMAT_END + 1 +CELLSTYLE_BEGIN + 90 + 2 + 91 + 1 +300 +_HEADER +309 +CELLSTYLE_END +300 +CELLSTYLE + 1 +TABLEFORMAT_BEGIN + 90 + 5 +170 + 1 + 91 + 0 + 92 + 0 + 62 + 257 + 93 + 1 +300 +CONTENTFORMAT + 1 +CONTENTFORMAT_BEGIN + 90 + 0 + 91 + 0 + 92 + 4 + 93 + 0 +300 + + 40 +0.0 +140 +1.0 + 94 + 2 + 62 + 0 +340 +11 +144 +0.18 +309 +CONTENTFORMAT_END +171 + 1 +301 +MARGIN + 1 +CELLMARGIN_BEGIN + 40 +0.06 + 40 +0.06 + 40 +0.06 + 40 +0.06 + 40 +0.06 + 40 +0.06 +309 +CELLMARGIN_END + 94 + 6 + 95 + 1 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +14 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 2 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +14 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 4 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +14 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 8 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +14 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 16 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +14 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END + 95 + 32 +302 +GRIDFORMAT + 1 +GRIDFORMAT_BEGIN + 90 + 0 + 91 + 1 + 62 + 0 + 92 + -2 +340 +14 + 93 + 0 + 40 +0.045 +309 +GRIDFORMAT_END +309 +TABLEFORMAT_END + 1 +CELLSTYLE_BEGIN + 90 + 3 + 91 + 2 +300 +_DATA +309 +CELLSTYLE_END + 0 +XRECORD + 5 +2D8 +102 +{ACAD_REACTORS +330 +25D +102 +} +330 +25D +100 +AcDbXrecord +280 + 1 +102 +ACAD_ROUNDTRIP_PRE2007_TABLESTYLE + 90 + 4 + 91 + 0 + 1 + + 92 + 4 + 93 + 0 + 2 + + 94 + 4 + 95 + 0 + 3 + + 0 +XRECORD + 5 +2AC +102 +{ACAD_REACTORS +330 +2AB +102 +} +330 +2AB +100 +AcDbXrecord +280 + 1 +102 +RTVSPost2010Prop28 +280 + 1 +102 +RTVSPost2010PropOp28 + 70 + 1 +102 +RTVSPost2010Prop29 +280 + 1 +102 +RTVSPost2010PropOp29 + 70 + 1 +102 +RTVSPost2010Prop30 +280 + 0 +102 +RTVSPost2010PropOp30 + 70 + 1 +102 +RTVSPost2010Prop31 +280 + 0 +102 +RTVSPost2010PropOp31 + 70 + 1 +102 +RTVSPost2010Prop32 +280 + 0 +102 +RTVSPost2010PropOp32 + 70 + 1 +102 +RTVSPost2010Prop33 +280 + 0 +102 +RTVSPost2010PropOp33 + 70 + 1 +102 +RTVSPost2010Prop34 +280 + 0 +102 +RTVSPost2010PropOp34 + 70 + 1 +102 +RTVSPost2010Prop35 +280 + 0 +102 +RTVSPost2010PropOp35 + 70 + 1 +102 +RTVSPost2010Prop36 +280 + 0 +102 +RTVSPost2010PropOp36 + 70 + 1 +102 +RTVSPost2010Prop37 + 90 + 50 +102 +RTVSPost2010PropOp37 + 70 + 1 +102 +RTVSPost2010Prop38 +140 +0.0 +102 +RTVSPost2010PropOp38 + 70 + 1 +102 +RTVSPost2010Prop39 +140 +1.0 +102 +RTVSPost2010PropOp39 + 70 + 1 +102 +RTVSPost2010Prop40 + 90 + 0 +102 +RTVSPost2010PropOp40 + 70 + 1 +102 +RTVSPost2010Prop41ColorIndex + 90 + 18 +102 +RTVSPost2010Prop41ColorRGB + 90 + 0 +102 +RTVSPost2010PropOp41 + 70 + 1 +102 +RTVSPost2010Prop42 + 90 + 50 +102 +RTVSPost2010PropOp42 + 70 + 1 +102 +RTVSPost2010Prop43 + 90 + 3 +102 +RTVSPost2010PropOp43 + 70 + 1 +102 +RTVSPost2010Prop44ColorIndex + 90 + 5 +102 +RTVSPost2010Prop44ColorRGB + 90 + 255 +102 +RTVSPost2010PropOp44 + 70 + 1 +102 +RTVSPost2010Prop45 +280 + 0 +102 +RTVSPost2010PropOp45 + 70 + 1 +102 +RTVSPost2010Prop46 + 90 + 50 +102 +RTVSPost2010PropOp46 + 70 + 1 +102 +RTVSPost2010Prop47 + 90 + 50 +102 +RTVSPost2010PropOp47 + 70 + 1 +102 +RTVSPost2010Prop48 + 90 + 50 +102 +RTVSPost2010PropOp48 + 70 + 1 +102 +RTVSPost2010Prop49 +280 + 0 +102 +RTVSPost2010PropOp49 + 70 + 1 +102 +RTVSPost2010Prop50 + 90 + 50 +102 +RTVSPost2010PropOp50 + 70 + 1 +102 +RTVSPost2010Prop51ColorIndex + 90 + 256 +102 +RTVSPost2010Prop51ColorRGB + 90 +-16777216 +102 +RTVSPost2010PropOp51 + 70 + 0 +102 +RTVSPost2010Prop52 +140 +1.0 +102 +RTVSPost2010PropOp52 + 70 + 0 +102 +RTVSPost2010Prop53 + 90 + 2 +102 +RTVSPost2010PropOp53 + 70 + 1 +102 +RTVSPost2010Prop54 + 1 +strokes_ogs.tif +102 +RTVSPost2010PropOp54 + 70 + 1 +102 +RTVSPost2010Prop55 +280 + 0 +102 +RTVSPost2010PropOp55 + 70 + 1 +102 +RTVSPost2010Prop56 +140 +1.0 +102 +RTVSPost2010PropOp56 + 70 + 1 +102 +RTVSPost2010Prop57 +140 +1.0 +102 +RTVSPost2010PropOp57 + 70 + 1 +102 +RTVSPropertyOp0 + 70 + 1 +102 +RTVSPropertyOp1 + 70 + 1 +102 +RTVSPropertyOp2 + 70 + 1 +102 +RTVSPropertyOp3 + 70 + 1 +102 +RTVSPropertyOp4 + 70 + 1 +102 +RTVSPropertyOp5 + 70 + 1 +102 +RTVSPropertyOp6 + 70 + 1 +102 +RTVSPropertyOp7 + 70 + 1 +102 +RTVSPropertyOp8 + 70 + 1 +102 +RTVSPropertyOp9 + 70 + 1 +102 +RTVSPropertyOp10 + 70 + 1 +102 +RTVSPropertyOp11 + 70 + 1 +102 +RTVSPropertyOp12 + 70 + 1 +102 +RTVSPropertyOp13 + 70 + 1 +102 +RTVSPropertyOp14 + 70 + 1 +102 +RTVSPropertyOp15 + 70 + 1 +102 +RTVSPropertyOp16 + 70 + 1 +102 +RTVSPropertyOp17 + 70 + 1 +102 +RTVSPropertyOp18 + 70 + 1 +102 +RTVSPropertyOp19 + 70 + 1 +102 +RTVSPropertyOp20 + 70 + 1 +102 +RTVSPropertyOp21 + 70 + 1 +102 +RTVSPropertyOp22 + 70 + 1 +102 +RTVSPropertyOp23 + 70 + 1 +102 +RTVSPropertyOp24 + 70 + 1 +102 +RTVSPropertyOp25 + 70 + 1 +102 +RTVSPropertyOp26 + 70 + 1 +102 +RTVSPropertyOp27 + 70 + 1 +102 +RTVSPropertyOp28 + 70 + 1 +102 +RTVSPropertyOp29 + 70 + 1 +102 +RTVSPropertyOp30 + 70 + 1 +102 +RTVSPropertyOp31 + 70 + 1 +102 +RTVSPropertyOp32 + 70 + 1 +102 +RTVSPropertyOp33 + 70 + 1 +102 +RTVSPropertyOp34 + 70 + 1 +102 +RTVSPropertyOp35 + 70 + 1 +102 +RTVSPropertyOp36 + 70 + 1 +102 +RTVSPropertyOp37 + 70 + 1 +102 +RTVSPropertyOp38 + 70 + 1 +102 +RTVSPropertyOp39 + 70 + 1 +102 +RTVSPropertyOp40 + 70 + 1 +102 +RTVSPropertyOp41 + 70 + 1 +102 +RTVSPropertyOp42 + 70 + 1 +102 +RTVSPropertyOp43 + 70 + 1 +102 +RTVSPropertyOp44 + 70 + 1 +102 +RTVSPropertyOp45 + 70 + 1 +102 +RTVSPropertyOp46 + 70 + 1 +102 +RTVSPropertyOp47 + 70 + 1 +102 +RTVSPropertyOp48 + 70 + 1 +102 +RTVSPropertyOp49 + 70 + 1 +102 +RTVSPropertyOp50 + 70 + 1 +102 +RTVSPropertyOp51 + 70 + 0 +102 +RTVSPropertyOp52 + 70 + 0 +102 +RTVSPropertyOp53 + 70 + 1 +102 +RTVSPropertyOp54 + 70 + 1 +102 +RTVSPropertyOp55 + 70 + 1 +102 +RTVSPropertyOp56 + 70 + 1 +102 +RTVSPropertyOp57 + 70 + 1 +102 +RTVSPropertyOp58 + 70 + 1 +102 +RTVSPropertyOp59 + 70 + 1 +102 +RTVSPropertyOp60 + 70 + 1 +102 +RTVSPropertyOp61 + 70 + 1 +102 +RTVSPropertyOp62 + 70 + 1 + 0 +XRECORD + 5 +2B2 +102 +{ACAD_REACTORS +330 +2B1 +102 +} +330 +2B1 +100 +AcDbXrecord +280 + 1 +102 +RTVSPost2010Prop28 +280 + 0 +102 +RTVSPost2010PropOp28 + 70 + 1 +102 +RTVSPost2010Prop29 +280 + 1 +102 +RTVSPost2010PropOp29 + 70 + 1 +102 +RTVSPost2010Prop30 +280 + 1 +102 +RTVSPost2010PropOp30 + 70 + 1 +102 +RTVSPost2010Prop31 +280 + 0 +102 +RTVSPost2010PropOp31 + 70 + 1 +102 +RTVSPost2010Prop32 +280 + 0 +102 +RTVSPost2010PropOp32 + 70 + 1 +102 +RTVSPost2010Prop33 +280 + 0 +102 +RTVSPost2010PropOp33 + 70 + 1 +102 +RTVSPost2010Prop34 +280 + 0 +102 +RTVSPost2010PropOp34 + 70 + 1 +102 +RTVSPost2010Prop35 +280 + 0 +102 +RTVSPost2010PropOp35 + 70 + 1 +102 +RTVSPost2010Prop36 +280 + 0 +102 +RTVSPost2010PropOp36 + 70 + 1 +102 +RTVSPost2010Prop37 + 90 + 50 +102 +RTVSPost2010PropOp37 + 70 + 1 +102 +RTVSPost2010Prop38 +140 +0.0 +102 +RTVSPost2010PropOp38 + 70 + 1 +102 +RTVSPost2010Prop39 +140 +1.0 +102 +RTVSPost2010PropOp39 + 70 + 1 +102 +RTVSPost2010Prop40 + 90 + 0 +102 +RTVSPost2010PropOp40 + 70 + 1 +102 +RTVSPost2010Prop41ColorIndex + 90 + 18 +102 +RTVSPost2010Prop41ColorRGB + 90 + 0 +102 +RTVSPost2010PropOp41 + 70 + 1 +102 +RTVSPost2010Prop42 + 90 + 50 +102 +RTVSPost2010PropOp42 + 70 + 1 +102 +RTVSPost2010Prop43 + 90 + 3 +102 +RTVSPost2010PropOp43 + 70 + 1 +102 +RTVSPost2010Prop44ColorIndex + 90 + 5 +102 +RTVSPost2010Prop44ColorRGB + 90 + 255 +102 +RTVSPost2010PropOp44 + 70 + 1 +102 +RTVSPost2010Prop45 +280 + 0 +102 +RTVSPost2010PropOp45 + 70 + 1 +102 +RTVSPost2010Prop46 + 90 + 50 +102 +RTVSPost2010PropOp46 + 70 + 1 +102 +RTVSPost2010Prop47 + 90 + 50 +102 +RTVSPost2010PropOp47 + 70 + 1 +102 +RTVSPost2010Prop48 + 90 + 50 +102 +RTVSPost2010PropOp48 + 70 + 1 +102 +RTVSPost2010Prop49 +280 + 0 +102 +RTVSPost2010PropOp49 + 70 + 1 +102 +RTVSPost2010Prop50 + 90 + 50 +102 +RTVSPost2010PropOp50 + 70 + 1 +102 +RTVSPost2010Prop51ColorIndex + 90 + 256 +102 +RTVSPost2010Prop51ColorRGB + 90 +-16777216 +102 +RTVSPost2010PropOp51 + 70 + 0 +102 +RTVSPost2010Prop52 +140 +1.0 +102 +RTVSPost2010PropOp52 + 70 + 0 +102 +RTVSPost2010Prop53 + 90 + 2 +102 +RTVSPost2010PropOp53 + 70 + 1 +102 +RTVSPost2010Prop54 + 1 +strokes_ogs.tif +102 +RTVSPost2010PropOp54 + 70 + 1 +102 +RTVSPost2010Prop55 +280 + 0 +102 +RTVSPost2010PropOp55 + 70 + 1 +102 +RTVSPost2010Prop56 +140 +1.0 +102 +RTVSPost2010PropOp56 + 70 + 1 +102 +RTVSPost2010Prop57 +140 +1.0 +102 +RTVSPost2010PropOp57 + 70 + 1 +102 +RTVSPropertyOp0 + 70 + 1 +102 +RTVSPropertyOp1 + 70 + 1 +102 +RTVSPropertyOp2 + 70 + 1 +102 +RTVSPropertyOp3 + 70 + 1 +102 +RTVSPropertyOp4 + 70 + 1 +102 +RTVSPropertyOp5 + 70 + 1 +102 +RTVSPropertyOp6 + 70 + 1 +102 +RTVSPropertyOp7 + 70 + 1 +102 +RTVSPropertyOp8 + 70 + 1 +102 +RTVSPropertyOp9 + 70 + 1 +102 +RTVSPropertyOp10 + 70 + 1 +102 +RTVSPropertyOp11 + 70 + 1 +102 +RTVSPropertyOp12 + 70 + 1 +102 +RTVSPropertyOp13 + 70 + 1 +102 +RTVSPropertyOp14 + 70 + 1 +102 +RTVSPropertyOp15 + 70 + 1 +102 +RTVSPropertyOp16 + 70 + 1 +102 +RTVSPropertyOp17 + 70 + 1 +102 +RTVSPropertyOp18 + 70 + 1 +102 +RTVSPropertyOp19 + 70 + 1 +102 +RTVSPropertyOp20 + 70 + 1 +102 +RTVSPropertyOp21 + 70 + 1 +102 +RTVSPropertyOp22 + 70 + 1 +102 +RTVSPropertyOp23 + 70 + 1 +102 +RTVSPropertyOp24 + 70 + 1 +102 +RTVSPropertyOp25 + 70 + 1 +102 +RTVSPropertyOp26 + 70 + 1 +102 +RTVSPropertyOp27 + 70 + 1 +102 +RTVSPropertyOp28 + 70 + 1 +102 +RTVSPropertyOp29 + 70 + 1 +102 +RTVSPropertyOp30 + 70 + 1 +102 +RTVSPropertyOp31 + 70 + 1 +102 +RTVSPropertyOp32 + 70 + 1 +102 +RTVSPropertyOp33 + 70 + 1 +102 +RTVSPropertyOp34 + 70 + 1 +102 +RTVSPropertyOp35 + 70 + 1 +102 +RTVSPropertyOp36 + 70 + 1 +102 +RTVSPropertyOp37 + 70 + 1 +102 +RTVSPropertyOp38 + 70 + 1 +102 +RTVSPropertyOp39 + 70 + 1 +102 +RTVSPropertyOp40 + 70 + 1 +102 +RTVSPropertyOp41 + 70 + 1 +102 +RTVSPropertyOp42 + 70 + 1 +102 +RTVSPropertyOp43 + 70 + 1 +102 +RTVSPropertyOp44 + 70 + 1 +102 +RTVSPropertyOp45 + 70 + 1 +102 +RTVSPropertyOp46 + 70 + 1 +102 +RTVSPropertyOp47 + 70 + 1 +102 +RTVSPropertyOp48 + 70 + 1 +102 +RTVSPropertyOp49 + 70 + 1 +102 +RTVSPropertyOp50 + 70 + 1 +102 +RTVSPropertyOp51 + 70 + 0 +102 +RTVSPropertyOp52 + 70 + 0 +102 +RTVSPropertyOp53 + 70 + 1 +102 +RTVSPropertyOp54 + 70 + 1 +102 +RTVSPropertyOp55 + 70 + 1 +102 +RTVSPropertyOp56 + 70 + 1 +102 +RTVSPropertyOp57 + 70 + 1 +102 +RTVSPropertyOp58 + 70 + 1 +102 +RTVSPropertyOp59 + 70 + 1 +102 +RTVSPropertyOp60 + 70 + 1 +102 +RTVSPropertyOp61 + 70 + 1 +102 +RTVSPropertyOp62 + 70 + 1 + 0 +XRECORD + 5 +2BA +102 +{ACAD_REACTORS +330 +2B9 +102 +} +330 +2B9 +100 +AcDbXrecord +280 + 1 +102 +RTVSPost2010Prop28 +280 + 0 +102 +RTVSPost2010PropOp28 + 70 + 1 +102 +RTVSPost2010Prop29 +280 + 1 +102 +RTVSPost2010PropOp29 + 70 + 1 +102 +RTVSPost2010Prop30 +280 + 1 +102 +RTVSPost2010PropOp30 + 70 + 1 +102 +RTVSPost2010Prop31 +280 + 0 +102 +RTVSPost2010PropOp31 + 70 + 1 +102 +RTVSPost2010Prop32 +280 + 0 +102 +RTVSPost2010PropOp32 + 70 + 1 +102 +RTVSPost2010Prop33 +280 + 0 +102 +RTVSPost2010PropOp33 + 70 + 1 +102 +RTVSPost2010Prop34 +280 + 0 +102 +RTVSPost2010PropOp34 + 70 + 1 +102 +RTVSPost2010Prop35 +280 + 0 +102 +RTVSPost2010PropOp35 + 70 + 1 +102 +RTVSPost2010Prop36 +280 + 0 +102 +RTVSPost2010PropOp36 + 70 + 1 +102 +RTVSPost2010Prop37 + 90 + 50 +102 +RTVSPost2010PropOp37 + 70 + 1 +102 +RTVSPost2010Prop38 +140 +0.0 +102 +RTVSPost2010PropOp38 + 70 + 1 +102 +RTVSPost2010Prop39 +140 +1.0 +102 +RTVSPost2010PropOp39 + 70 + 1 +102 +RTVSPost2010Prop40 + 90 + 0 +102 +RTVSPost2010PropOp40 + 70 + 1 +102 +RTVSPost2010Prop41ColorIndex + 90 + 18 +102 +RTVSPost2010Prop41ColorRGB + 90 + 0 +102 +RTVSPost2010PropOp41 + 70 + 1 +102 +RTVSPost2010Prop42 + 90 + 50 +102 +RTVSPost2010PropOp42 + 70 + 1 +102 +RTVSPost2010Prop43 + 90 + 3 +102 +RTVSPost2010PropOp43 + 70 + 1 +102 +RTVSPost2010Prop44ColorIndex + 90 + 5 +102 +RTVSPost2010Prop44ColorRGB + 90 + 255 +102 +RTVSPost2010PropOp44 + 70 + 1 +102 +RTVSPost2010Prop45 +280 + 0 +102 +RTVSPost2010PropOp45 + 70 + 1 +102 +RTVSPost2010Prop46 + 90 + 50 +102 +RTVSPost2010PropOp46 + 70 + 1 +102 +RTVSPost2010Prop47 + 90 + 50 +102 +RTVSPost2010PropOp47 + 70 + 1 +102 +RTVSPost2010Prop48 + 90 + 50 +102 +RTVSPost2010PropOp48 + 70 + 1 +102 +RTVSPost2010Prop49 +280 + 0 +102 +RTVSPost2010PropOp49 + 70 + 1 +102 +RTVSPost2010Prop50 + 90 + 50 +102 +RTVSPost2010PropOp50 + 70 + 1 +102 +RTVSPost2010Prop51ColorIndex + 90 + 256 +102 +RTVSPost2010Prop51ColorRGB + 90 +-16777216 +102 +RTVSPost2010PropOp51 + 70 + 0 +102 +RTVSPost2010Prop52 +140 +1.0 +102 +RTVSPost2010PropOp52 + 70 + 0 +102 +RTVSPost2010Prop53 + 90 + 2 +102 +RTVSPost2010PropOp53 + 70 + 1 +102 +RTVSPost2010Prop54 + 1 +strokes_ogs.tif +102 +RTVSPost2010PropOp54 + 70 + 1 +102 +RTVSPost2010Prop55 +280 + 0 +102 +RTVSPost2010PropOp55 + 70 + 1 +102 +RTVSPost2010Prop56 +140 +1.0 +102 +RTVSPost2010PropOp56 + 70 + 1 +102 +RTVSPost2010Prop57 +140 +1.0 +102 +RTVSPost2010PropOp57 + 70 + 1 +102 +RTVSPropertyOp0 + 70 + 1 +102 +RTVSPropertyOp1 + 70 + 1 +102 +RTVSPropertyOp2 + 70 + 1 +102 +RTVSPropertyOp3 + 70 + 1 +102 +RTVSPropertyOp4 + 70 + 1 +102 +RTVSPropertyOp5 + 70 + 1 +102 +RTVSPropertyOp6 + 70 + 1 +102 +RTVSPropertyOp7 + 70 + 1 +102 +RTVSPropertyOp8 + 70 + 1 +102 +RTVSPropertyOp9 + 70 + 1 +102 +RTVSPropertyOp10 + 70 + 1 +102 +RTVSPropertyOp11 + 70 + 1 +102 +RTVSPropertyOp12 + 70 + 1 +102 +RTVSPropertyOp13 + 70 + 1 +102 +RTVSPropertyOp14 + 70 + 1 +102 +RTVSPropertyOp15 + 70 + 1 +102 +RTVSPropertyOp16 + 70 + 1 +102 +RTVSPropertyOp17 + 70 + 1 +102 +RTVSPropertyOp18 + 70 + 1 +102 +RTVSPropertyOp19 + 70 + 1 +102 +RTVSPropertyOp20 + 70 + 1 +102 +RTVSPropertyOp21 + 70 + 1 +102 +RTVSPropertyOp22 + 70 + 1 +102 +RTVSPropertyOp23 + 70 + 1 +102 +RTVSPropertyOp24 + 70 + 1 +102 +RTVSPropertyOp25 + 70 + 1 +102 +RTVSPropertyOp26 + 70 + 1 +102 +RTVSPropertyOp27 + 70 + 1 +102 +RTVSPropertyOp28 + 70 + 1 +102 +RTVSPropertyOp29 + 70 + 1 +102 +RTVSPropertyOp30 + 70 + 1 +102 +RTVSPropertyOp31 + 70 + 1 +102 +RTVSPropertyOp32 + 70 + 1 +102 +RTVSPropertyOp33 + 70 + 1 +102 +RTVSPropertyOp34 + 70 + 1 +102 +RTVSPropertyOp35 + 70 + 1 +102 +RTVSPropertyOp36 + 70 + 1 +102 +RTVSPropertyOp37 + 70 + 1 +102 +RTVSPropertyOp38 + 70 + 1 +102 +RTVSPropertyOp39 + 70 + 1 +102 +RTVSPropertyOp40 + 70 + 1 +102 +RTVSPropertyOp41 + 70 + 1 +102 +RTVSPropertyOp42 + 70 + 1 +102 +RTVSPropertyOp43 + 70 + 1 +102 +RTVSPropertyOp44 + 70 + 1 +102 +RTVSPropertyOp45 + 70 + 1 +102 +RTVSPropertyOp46 + 70 + 1 +102 +RTVSPropertyOp47 + 70 + 1 +102 +RTVSPropertyOp48 + 70 + 1 +102 +RTVSPropertyOp49 + 70 + 1 +102 +RTVSPropertyOp50 + 70 + 1 +102 +RTVSPropertyOp51 + 70 + 0 +102 +RTVSPropertyOp52 + 70 + 0 +102 +RTVSPropertyOp53 + 70 + 1 +102 +RTVSPropertyOp54 + 70 + 1 +102 +RTVSPropertyOp55 + 70 + 1 +102 +RTVSPropertyOp56 + 70 + 1 +102 +RTVSPropertyOp57 + 70 + 1 +102 +RTVSPropertyOp58 + 70 + 1 +102 +RTVSPropertyOp59 + 70 + 1 +102 +RTVSPropertyOp60 + 70 + 1 +102 +RTVSPropertyOp61 + 70 + 1 +102 +RTVSPropertyOp62 + 70 + 1 + 0 +XRECORD + 5 +2C2 +102 +{ACAD_REACTORS +330 +2C1 +102 +} +330 +2C1 +100 +AcDbXrecord +280 + 1 +102 +RTVSPost2010Prop28 +280 + 0 +102 +RTVSPost2010PropOp28 + 70 + 1 +102 +RTVSPost2010Prop29 +280 + 1 +102 +RTVSPost2010PropOp29 + 70 + 1 +102 +RTVSPost2010Prop30 +280 + 1 +102 +RTVSPost2010PropOp30 + 70 + 1 +102 +RTVSPost2010Prop31 +280 + 0 +102 +RTVSPost2010PropOp31 + 70 + 1 +102 +RTVSPost2010Prop32 +280 + 0 +102 +RTVSPost2010PropOp32 + 70 + 1 +102 +RTVSPost2010Prop33 +280 + 0 +102 +RTVSPost2010PropOp33 + 70 + 1 +102 +RTVSPost2010Prop34 +280 + 0 +102 +RTVSPost2010PropOp34 + 70 + 1 +102 +RTVSPost2010Prop35 +280 + 0 +102 +RTVSPost2010PropOp35 + 70 + 1 +102 +RTVSPost2010Prop36 +280 + 0 +102 +RTVSPost2010PropOp36 + 70 + 1 +102 +RTVSPost2010Prop37 + 90 + 50 +102 +RTVSPost2010PropOp37 + 70 + 1 +102 +RTVSPost2010Prop38 +140 +0.0 +102 +RTVSPost2010PropOp38 + 70 + 1 +102 +RTVSPost2010Prop39 +140 +1.0 +102 +RTVSPost2010PropOp39 + 70 + 1 +102 +RTVSPost2010Prop40 + 90 + 0 +102 +RTVSPost2010PropOp40 + 70 + 1 +102 +RTVSPost2010Prop41ColorIndex + 90 + 18 +102 +RTVSPost2010Prop41ColorRGB + 90 + 0 +102 +RTVSPost2010PropOp41 + 70 + 1 +102 +RTVSPost2010Prop42 + 90 + 50 +102 +RTVSPost2010PropOp42 + 70 + 1 +102 +RTVSPost2010Prop43 + 90 + 3 +102 +RTVSPost2010PropOp43 + 70 + 1 +102 +RTVSPost2010Prop44ColorIndex + 90 + 5 +102 +RTVSPost2010Prop44ColorRGB + 90 + 255 +102 +RTVSPost2010PropOp44 + 70 + 1 +102 +RTVSPost2010Prop45 +280 + 0 +102 +RTVSPost2010PropOp45 + 70 + 1 +102 +RTVSPost2010Prop46 + 90 + 50 +102 +RTVSPost2010PropOp46 + 70 + 1 +102 +RTVSPost2010Prop47 + 90 + 50 +102 +RTVSPost2010PropOp47 + 70 + 1 +102 +RTVSPost2010Prop48 + 90 + 50 +102 +RTVSPost2010PropOp48 + 70 + 1 +102 +RTVSPost2010Prop49 +280 + 0 +102 +RTVSPost2010PropOp49 + 70 + 1 +102 +RTVSPost2010Prop50 + 90 + 50 +102 +RTVSPost2010PropOp50 + 70 + 1 +102 +RTVSPost2010Prop51ColorIndex + 90 + 256 +102 +RTVSPost2010Prop51ColorRGB + 90 +-16777216 +102 +RTVSPost2010PropOp51 + 70 + 0 +102 +RTVSPost2010Prop52 +140 +1.0 +102 +RTVSPost2010PropOp52 + 70 + 0 +102 +RTVSPost2010Prop53 + 90 + 2 +102 +RTVSPost2010PropOp53 + 70 + 1 +102 +RTVSPost2010Prop54 + 1 +strokes_ogs.tif +102 +RTVSPost2010PropOp54 + 70 + 1 +102 +RTVSPost2010Prop55 +280 + 0 +102 +RTVSPost2010PropOp55 + 70 + 1 +102 +RTVSPost2010Prop56 +140 +1.0 +102 +RTVSPost2010PropOp56 + 70 + 1 +102 +RTVSPost2010Prop57 +140 +1.0 +102 +RTVSPost2010PropOp57 + 70 + 1 +102 +RTVSPropertyOp0 + 70 + 1 +102 +RTVSPropertyOp1 + 70 + 1 +102 +RTVSPropertyOp2 + 70 + 1 +102 +RTVSPropertyOp3 + 70 + 1 +102 +RTVSPropertyOp4 + 70 + 1 +102 +RTVSPropertyOp5 + 70 + 1 +102 +RTVSPropertyOp6 + 70 + 1 +102 +RTVSPropertyOp7 + 70 + 1 +102 +RTVSPropertyOp8 + 70 + 1 +102 +RTVSPropertyOp9 + 70 + 1 +102 +RTVSPropertyOp10 + 70 + 1 +102 +RTVSPropertyOp11 + 70 + 1 +102 +RTVSPropertyOp12 + 70 + 1 +102 +RTVSPropertyOp13 + 70 + 1 +102 +RTVSPropertyOp14 + 70 + 1 +102 +RTVSPropertyOp15 + 70 + 1 +102 +RTVSPropertyOp16 + 70 + 1 +102 +RTVSPropertyOp17 + 70 + 1 +102 +RTVSPropertyOp18 + 70 + 1 +102 +RTVSPropertyOp19 + 70 + 1 +102 +RTVSPropertyOp20 + 70 + 1 +102 +RTVSPropertyOp21 + 70 + 1 +102 +RTVSPropertyOp22 + 70 + 1 +102 +RTVSPropertyOp23 + 70 + 1 +102 +RTVSPropertyOp24 + 70 + 1 +102 +RTVSPropertyOp25 + 70 + 1 +102 +RTVSPropertyOp26 + 70 + 1 +102 +RTVSPropertyOp27 + 70 + 1 +102 +RTVSPropertyOp28 + 70 + 1 +102 +RTVSPropertyOp29 + 70 + 1 +102 +RTVSPropertyOp30 + 70 + 1 +102 +RTVSPropertyOp31 + 70 + 1 +102 +RTVSPropertyOp32 + 70 + 1 +102 +RTVSPropertyOp33 + 70 + 1 +102 +RTVSPropertyOp34 + 70 + 1 +102 +RTVSPropertyOp35 + 70 + 1 +102 +RTVSPropertyOp36 + 70 + 1 +102 +RTVSPropertyOp37 + 70 + 1 +102 +RTVSPropertyOp38 + 70 + 1 +102 +RTVSPropertyOp39 + 70 + 1 +102 +RTVSPropertyOp40 + 70 + 1 +102 +RTVSPropertyOp41 + 70 + 1 +102 +RTVSPropertyOp42 + 70 + 1 +102 +RTVSPropertyOp43 + 70 + 1 +102 +RTVSPropertyOp44 + 70 + 1 +102 +RTVSPropertyOp45 + 70 + 1 +102 +RTVSPropertyOp46 + 70 + 1 +102 +RTVSPropertyOp47 + 70 + 1 +102 +RTVSPropertyOp48 + 70 + 1 +102 +RTVSPropertyOp49 + 70 + 1 +102 +RTVSPropertyOp50 + 70 + 1 +102 +RTVSPropertyOp51 + 70 + 0 +102 +RTVSPropertyOp52 + 70 + 0 +102 +RTVSPropertyOp53 + 70 + 1 +102 +RTVSPropertyOp54 + 70 + 1 +102 +RTVSPropertyOp55 + 70 + 1 +102 +RTVSPropertyOp56 + 70 + 1 +102 +RTVSPropertyOp57 + 70 + 1 +102 +RTVSPropertyOp58 + 70 + 1 +102 +RTVSPropertyOp59 + 70 + 1 +102 +RTVSPropertyOp60 + 70 + 1 +102 +RTVSPropertyOp61 + 70 + 1 +102 +RTVSPropertyOp62 + 70 + 1 + 0 +XRECORD + 5 +2B6 +102 +{ACAD_REACTORS +330 +2B5 +102 +} +330 +2B5 +100 +AcDbXrecord +280 + 1 +102 +RTVSPost2010Prop28 +280 + 0 +102 +RTVSPost2010PropOp28 + 70 + 1 +102 +RTVSPost2010Prop29 +280 + 1 +102 +RTVSPost2010PropOp29 + 70 + 1 +102 +RTVSPost2010Prop30 +280 + 1 +102 +RTVSPost2010PropOp30 + 70 + 1 +102 +RTVSPost2010Prop31 +280 + 0 +102 +RTVSPost2010PropOp31 + 70 + 1 +102 +RTVSPost2010Prop32 +280 + 0 +102 +RTVSPost2010PropOp32 + 70 + 1 +102 +RTVSPost2010Prop33 +280 + 0 +102 +RTVSPost2010PropOp33 + 70 + 1 +102 +RTVSPost2010Prop34 +280 + 0 +102 +RTVSPost2010PropOp34 + 70 + 1 +102 +RTVSPost2010Prop35 +280 + 0 +102 +RTVSPost2010PropOp35 + 70 + 1 +102 +RTVSPost2010Prop36 +280 + 0 +102 +RTVSPost2010PropOp36 + 70 + 1 +102 +RTVSPost2010Prop37 + 90 + 50 +102 +RTVSPost2010PropOp37 + 70 + 1 +102 +RTVSPost2010Prop38 +140 +0.0 +102 +RTVSPost2010PropOp38 + 70 + 1 +102 +RTVSPost2010Prop39 +140 +1.0 +102 +RTVSPost2010PropOp39 + 70 + 1 +102 +RTVSPost2010Prop40 + 90 + 0 +102 +RTVSPost2010PropOp40 + 70 + 1 +102 +RTVSPost2010Prop41ColorIndex + 90 + 18 +102 +RTVSPost2010Prop41ColorRGB + 90 + 0 +102 +RTVSPost2010PropOp41 + 70 + 1 +102 +RTVSPost2010Prop42 + 90 + 50 +102 +RTVSPost2010PropOp42 + 70 + 1 +102 +RTVSPost2010Prop43 + 90 + 3 +102 +RTVSPost2010PropOp43 + 70 + 1 +102 +RTVSPost2010Prop44ColorIndex + 90 + 5 +102 +RTVSPost2010Prop44ColorRGB + 90 + 255 +102 +RTVSPost2010PropOp44 + 70 + 1 +102 +RTVSPost2010Prop45 +280 + 0 +102 +RTVSPost2010PropOp45 + 70 + 1 +102 +RTVSPost2010Prop46 + 90 + 50 +102 +RTVSPost2010PropOp46 + 70 + 1 +102 +RTVSPost2010Prop47 + 90 + 50 +102 +RTVSPost2010PropOp47 + 70 + 1 +102 +RTVSPost2010Prop48 + 90 + 50 +102 +RTVSPost2010PropOp48 + 70 + 1 +102 +RTVSPost2010Prop49 +280 + 0 +102 +RTVSPost2010PropOp49 + 70 + 1 +102 +RTVSPost2010Prop50 + 90 + 50 +102 +RTVSPost2010PropOp50 + 70 + 1 +102 +RTVSPost2010Prop51ColorIndex + 90 + 256 +102 +RTVSPost2010Prop51ColorRGB + 90 +-16777216 +102 +RTVSPost2010PropOp51 + 70 + 0 +102 +RTVSPost2010Prop52 +140 +1.0 +102 +RTVSPost2010PropOp52 + 70 + 0 +102 +RTVSPost2010Prop53 + 90 + 2 +102 +RTVSPost2010PropOp53 + 70 + 1 +102 +RTVSPost2010Prop54 + 1 +strokes_ogs.tif +102 +RTVSPost2010PropOp54 + 70 + 1 +102 +RTVSPost2010Prop55 +280 + 0 +102 +RTVSPost2010PropOp55 + 70 + 1 +102 +RTVSPost2010Prop56 +140 +1.0 +102 +RTVSPost2010PropOp56 + 70 + 1 +102 +RTVSPost2010Prop57 +140 +1.0 +102 +RTVSPost2010PropOp57 + 70 + 1 +102 +RTVSPropertyOp0 + 70 + 1 +102 +RTVSPropertyOp1 + 70 + 1 +102 +RTVSPropertyOp2 + 70 + 1 +102 +RTVSPropertyOp3 + 70 + 1 +102 +RTVSPropertyOp4 + 70 + 1 +102 +RTVSPropertyOp5 + 70 + 1 +102 +RTVSPropertyOp6 + 70 + 1 +102 +RTVSPropertyOp7 + 70 + 1 +102 +RTVSPropertyOp8 + 70 + 1 +102 +RTVSPropertyOp9 + 70 + 1 +102 +RTVSPropertyOp10 + 70 + 1 +102 +RTVSPropertyOp11 + 70 + 1 +102 +RTVSPropertyOp12 + 70 + 1 +102 +RTVSPropertyOp13 + 70 + 1 +102 +RTVSPropertyOp14 + 70 + 1 +102 +RTVSPropertyOp15 + 70 + 1 +102 +RTVSPropertyOp16 + 70 + 1 +102 +RTVSPropertyOp17 + 70 + 1 +102 +RTVSPropertyOp18 + 70 + 1 +102 +RTVSPropertyOp19 + 70 + 1 +102 +RTVSPropertyOp20 + 70 + 1 +102 +RTVSPropertyOp21 + 70 + 1 +102 +RTVSPropertyOp22 + 70 + 1 +102 +RTVSPropertyOp23 + 70 + 1 +102 +RTVSPropertyOp24 + 70 + 1 +102 +RTVSPropertyOp25 + 70 + 1 +102 +RTVSPropertyOp26 + 70 + 1 +102 +RTVSPropertyOp27 + 70 + 1 +102 +RTVSPropertyOp28 + 70 + 1 +102 +RTVSPropertyOp29 + 70 + 1 +102 +RTVSPropertyOp30 + 70 + 1 +102 +RTVSPropertyOp31 + 70 + 1 +102 +RTVSPropertyOp32 + 70 + 1 +102 +RTVSPropertyOp33 + 70 + 1 +102 +RTVSPropertyOp34 + 70 + 1 +102 +RTVSPropertyOp35 + 70 + 1 +102 +RTVSPropertyOp36 + 70 + 1 +102 +RTVSPropertyOp37 + 70 + 1 +102 +RTVSPropertyOp38 + 70 + 1 +102 +RTVSPropertyOp39 + 70 + 1 +102 +RTVSPropertyOp40 + 70 + 1 +102 +RTVSPropertyOp41 + 70 + 1 +102 +RTVSPropertyOp42 + 70 + 1 +102 +RTVSPropertyOp43 + 70 + 1 +102 +RTVSPropertyOp44 + 70 + 1 +102 +RTVSPropertyOp45 + 70 + 1 +102 +RTVSPropertyOp46 + 70 + 1 +102 +RTVSPropertyOp47 + 70 + 1 +102 +RTVSPropertyOp48 + 70 + 1 +102 +RTVSPropertyOp49 + 70 + 1 +102 +RTVSPropertyOp50 + 70 + 1 +102 +RTVSPropertyOp51 + 70 + 0 +102 +RTVSPropertyOp52 + 70 + 0 +102 +RTVSPropertyOp53 + 70 + 1 +102 +RTVSPropertyOp54 + 70 + 1 +102 +RTVSPropertyOp55 + 70 + 1 +102 +RTVSPropertyOp56 + 70 + 1 +102 +RTVSPropertyOp57 + 70 + 1 +102 +RTVSPropertyOp58 + 70 + 1 +102 +RTVSPropertyOp59 + 70 + 1 +102 +RTVSPropertyOp60 + 70 + 1 +102 +RTVSPropertyOp61 + 70 + 1 +102 +RTVSPropertyOp62 + 70 + 1 + 0 +XRECORD + 5 +2B8 +102 +{ACAD_REACTORS +330 +2B7 +102 +} +330 +2B7 +100 +AcDbXrecord +280 + 1 +102 +RTVSPost2010Prop28 +280 + 0 +102 +RTVSPost2010PropOp28 + 70 + 1 +102 +RTVSPost2010Prop29 +280 + 1 +102 +RTVSPost2010PropOp29 + 70 + 1 +102 +RTVSPost2010Prop30 +280 + 1 +102 +RTVSPost2010PropOp30 + 70 + 1 +102 +RTVSPost2010Prop31 +280 + 0 +102 +RTVSPost2010PropOp31 + 70 + 1 +102 +RTVSPost2010Prop32 +280 + 0 +102 +RTVSPost2010PropOp32 + 70 + 1 +102 +RTVSPost2010Prop33 +280 + 0 +102 +RTVSPost2010PropOp33 + 70 + 1 +102 +RTVSPost2010Prop34 +280 + 0 +102 +RTVSPost2010PropOp34 + 70 + 1 +102 +RTVSPost2010Prop35 +280 + 0 +102 +RTVSPost2010PropOp35 + 70 + 1 +102 +RTVSPost2010Prop36 +280 + 0 +102 +RTVSPost2010PropOp36 + 70 + 1 +102 +RTVSPost2010Prop37 + 90 + 50 +102 +RTVSPost2010PropOp37 + 70 + 1 +102 +RTVSPost2010Prop38 +140 +0.0 +102 +RTVSPost2010PropOp38 + 70 + 1 +102 +RTVSPost2010Prop39 +140 +1.0 +102 +RTVSPost2010PropOp39 + 70 + 1 +102 +RTVSPost2010Prop40 + 90 + 0 +102 +RTVSPost2010PropOp40 + 70 + 1 +102 +RTVSPost2010Prop41ColorIndex + 90 + 18 +102 +RTVSPost2010Prop41ColorRGB + 90 + 0 +102 +RTVSPost2010PropOp41 + 70 + 1 +102 +RTVSPost2010Prop42 + 90 + 50 +102 +RTVSPost2010PropOp42 + 70 + 1 +102 +RTVSPost2010Prop43 + 90 + 3 +102 +RTVSPost2010PropOp43 + 70 + 1 +102 +RTVSPost2010Prop44ColorIndex + 90 + 5 +102 +RTVSPost2010Prop44ColorRGB + 90 + 255 +102 +RTVSPost2010PropOp44 + 70 + 1 +102 +RTVSPost2010Prop45 +280 + 0 +102 +RTVSPost2010PropOp45 + 70 + 1 +102 +RTVSPost2010Prop46 + 90 + 50 +102 +RTVSPost2010PropOp46 + 70 + 1 +102 +RTVSPost2010Prop47 + 90 + 50 +102 +RTVSPost2010PropOp47 + 70 + 1 +102 +RTVSPost2010Prop48 + 90 + 50 +102 +RTVSPost2010PropOp48 + 70 + 1 +102 +RTVSPost2010Prop49 +280 + 0 +102 +RTVSPost2010PropOp49 + 70 + 1 +102 +RTVSPost2010Prop50 + 90 + 50 +102 +RTVSPost2010PropOp50 + 70 + 1 +102 +RTVSPost2010Prop51ColorIndex + 90 + 256 +102 +RTVSPost2010Prop51ColorRGB + 90 +-16777216 +102 +RTVSPost2010PropOp51 + 70 + 0 +102 +RTVSPost2010Prop52 +140 +1.0 +102 +RTVSPost2010PropOp52 + 70 + 0 +102 +RTVSPost2010Prop53 + 90 + 2 +102 +RTVSPost2010PropOp53 + 70 + 1 +102 +RTVSPost2010Prop54 + 1 +strokes_ogs.tif +102 +RTVSPost2010PropOp54 + 70 + 1 +102 +RTVSPost2010Prop55 +280 + 0 +102 +RTVSPost2010PropOp55 + 70 + 1 +102 +RTVSPost2010Prop56 +140 +1.0 +102 +RTVSPost2010PropOp56 + 70 + 1 +102 +RTVSPost2010Prop57 +140 +1.0 +102 +RTVSPost2010PropOp57 + 70 + 1 +102 +RTVSPropertyOp0 + 70 + 1 +102 +RTVSPropertyOp1 + 70 + 1 +102 +RTVSPropertyOp2 + 70 + 1 +102 +RTVSPropertyOp3 + 70 + 1 +102 +RTVSPropertyOp4 + 70 + 1 +102 +RTVSPropertyOp5 + 70 + 1 +102 +RTVSPropertyOp6 + 70 + 1 +102 +RTVSPropertyOp7 + 70 + 1 +102 +RTVSPropertyOp8 + 70 + 1 +102 +RTVSPropertyOp9 + 70 + 1 +102 +RTVSPropertyOp10 + 70 + 1 +102 +RTVSPropertyOp11 + 70 + 1 +102 +RTVSPropertyOp12 + 70 + 1 +102 +RTVSPropertyOp13 + 70 + 1 +102 +RTVSPropertyOp14 + 70 + 1 +102 +RTVSPropertyOp15 + 70 + 1 +102 +RTVSPropertyOp16 + 70 + 1 +102 +RTVSPropertyOp17 + 70 + 1 +102 +RTVSPropertyOp18 + 70 + 1 +102 +RTVSPropertyOp19 + 70 + 1 +102 +RTVSPropertyOp20 + 70 + 1 +102 +RTVSPropertyOp21 + 70 + 1 +102 +RTVSPropertyOp22 + 70 + 1 +102 +RTVSPropertyOp23 + 70 + 1 +102 +RTVSPropertyOp24 + 70 + 1 +102 +RTVSPropertyOp25 + 70 + 1 +102 +RTVSPropertyOp26 + 70 + 1 +102 +RTVSPropertyOp27 + 70 + 1 +102 +RTVSPropertyOp28 + 70 + 1 +102 +RTVSPropertyOp29 + 70 + 1 +102 +RTVSPropertyOp30 + 70 + 1 +102 +RTVSPropertyOp31 + 70 + 1 +102 +RTVSPropertyOp32 + 70 + 1 +102 +RTVSPropertyOp33 + 70 + 1 +102 +RTVSPropertyOp34 + 70 + 1 +102 +RTVSPropertyOp35 + 70 + 1 +102 +RTVSPropertyOp36 + 70 + 1 +102 +RTVSPropertyOp37 + 70 + 1 +102 +RTVSPropertyOp38 + 70 + 1 +102 +RTVSPropertyOp39 + 70 + 1 +102 +RTVSPropertyOp40 + 70 + 1 +102 +RTVSPropertyOp41 + 70 + 1 +102 +RTVSPropertyOp42 + 70 + 1 +102 +RTVSPropertyOp43 + 70 + 1 +102 +RTVSPropertyOp44 + 70 + 1 +102 +RTVSPropertyOp45 + 70 + 1 +102 +RTVSPropertyOp46 + 70 + 1 +102 +RTVSPropertyOp47 + 70 + 1 +102 +RTVSPropertyOp48 + 70 + 1 +102 +RTVSPropertyOp49 + 70 + 1 +102 +RTVSPropertyOp50 + 70 + 1 +102 +RTVSPropertyOp51 + 70 + 0 +102 +RTVSPropertyOp52 + 70 + 0 +102 +RTVSPropertyOp53 + 70 + 1 +102 +RTVSPropertyOp54 + 70 + 1 +102 +RTVSPropertyOp55 + 70 + 1 +102 +RTVSPropertyOp56 + 70 + 1 +102 +RTVSPropertyOp57 + 70 + 1 +102 +RTVSPropertyOp58 + 70 + 1 +102 +RTVSPropertyOp59 + 70 + 1 +102 +RTVSPropertyOp60 + 70 + 1 +102 +RTVSPropertyOp61 + 70 + 1 +102 +RTVSPropertyOp62 + 70 + 1 + 0 +XRECORD + 5 +2C8 +102 +{ACAD_REACTORS +330 +2C7 +102 +} +330 +2C7 +100 +AcDbXrecord +280 + 1 +102 +RTVSPost2010Prop28 +280 + 0 +102 +RTVSPost2010PropOp28 + 70 + 1 +102 +RTVSPost2010Prop29 +280 + 1 +102 +RTVSPost2010PropOp29 + 70 + 1 +102 +RTVSPost2010Prop30 +280 + 1 +102 +RTVSPost2010PropOp30 + 70 + 1 +102 +RTVSPost2010Prop31 +280 + 0 +102 +RTVSPost2010PropOp31 + 70 + 1 +102 +RTVSPost2010Prop32 +280 + 0 +102 +RTVSPost2010PropOp32 + 70 + 1 +102 +RTVSPost2010Prop33 +280 + 0 +102 +RTVSPost2010PropOp33 + 70 + 1 +102 +RTVSPost2010Prop34 +280 + 0 +102 +RTVSPost2010PropOp34 + 70 + 1 +102 +RTVSPost2010Prop35 +280 + 0 +102 +RTVSPost2010PropOp35 + 70 + 1 +102 +RTVSPost2010Prop36 +280 + 0 +102 +RTVSPost2010PropOp36 + 70 + 1 +102 +RTVSPost2010Prop37 + 90 + 50 +102 +RTVSPost2010PropOp37 + 70 + 1 +102 +RTVSPost2010Prop38 +140 +0.0 +102 +RTVSPost2010PropOp38 + 70 + 1 +102 +RTVSPost2010Prop39 +140 +1.0 +102 +RTVSPost2010PropOp39 + 70 + 1 +102 +RTVSPost2010Prop40 + 90 + 0 +102 +RTVSPost2010PropOp40 + 70 + 1 +102 +RTVSPost2010Prop41ColorIndex + 90 + 18 +102 +RTVSPost2010Prop41ColorRGB + 90 + 0 +102 +RTVSPost2010PropOp41 + 70 + 1 +102 +RTVSPost2010Prop42 + 90 + 50 +102 +RTVSPost2010PropOp42 + 70 + 1 +102 +RTVSPost2010Prop43 + 90 + 3 +102 +RTVSPost2010PropOp43 + 70 + 1 +102 +RTVSPost2010Prop44ColorIndex + 90 + 5 +102 +RTVSPost2010Prop44ColorRGB + 90 + 255 +102 +RTVSPost2010PropOp44 + 70 + 1 +102 +RTVSPost2010Prop45 +280 + 0 +102 +RTVSPost2010PropOp45 + 70 + 1 +102 +RTVSPost2010Prop46 + 90 + 50 +102 +RTVSPost2010PropOp46 + 70 + 1 +102 +RTVSPost2010Prop47 + 90 + 50 +102 +RTVSPost2010PropOp47 + 70 + 1 +102 +RTVSPost2010Prop48 + 90 + 50 +102 +RTVSPost2010PropOp48 + 70 + 1 +102 +RTVSPost2010Prop49 +280 + 0 +102 +RTVSPost2010PropOp49 + 70 + 1 +102 +RTVSPost2010Prop50 + 90 + 50 +102 +RTVSPost2010PropOp50 + 70 + 1 +102 +RTVSPost2010Prop51ColorIndex + 90 + 256 +102 +RTVSPost2010Prop51ColorRGB + 90 +-16777216 +102 +RTVSPost2010PropOp51 + 70 + 0 +102 +RTVSPost2010Prop52 +140 +1.0 +102 +RTVSPost2010PropOp52 + 70 + 0 +102 +RTVSPost2010Prop53 + 90 + 2 +102 +RTVSPost2010PropOp53 + 70 + 1 +102 +RTVSPost2010Prop54 + 1 +strokes_ogs.tif +102 +RTVSPost2010PropOp54 + 70 + 1 +102 +RTVSPost2010Prop55 +280 + 0 +102 +RTVSPost2010PropOp55 + 70 + 1 +102 +RTVSPost2010Prop56 +140 +1.0 +102 +RTVSPost2010PropOp56 + 70 + 1 +102 +RTVSPost2010Prop57 +140 +1.0 +102 +RTVSPost2010PropOp57 + 70 + 1 +102 +RTVSPropertyOp0 + 70 + 1 +102 +RTVSPropertyOp1 + 70 + 1 +102 +RTVSPropertyOp2 + 70 + 1 +102 +RTVSPropertyOp3 + 70 + 1 +102 +RTVSPropertyOp4 + 70 + 1 +102 +RTVSPropertyOp5 + 70 + 1 +102 +RTVSPropertyOp6 + 70 + 1 +102 +RTVSPropertyOp7 + 70 + 1 +102 +RTVSPropertyOp8 + 70 + 1 +102 +RTVSPropertyOp9 + 70 + 1 +102 +RTVSPropertyOp10 + 70 + 1 +102 +RTVSPropertyOp11 + 70 + 1 +102 +RTVSPropertyOp12 + 70 + 1 +102 +RTVSPropertyOp13 + 70 + 1 +102 +RTVSPropertyOp14 + 70 + 1 +102 +RTVSPropertyOp15 + 70 + 1 +102 +RTVSPropertyOp16 + 70 + 1 +102 +RTVSPropertyOp17 + 70 + 1 +102 +RTVSPropertyOp18 + 70 + 1 +102 +RTVSPropertyOp19 + 70 + 1 +102 +RTVSPropertyOp20 + 70 + 1 +102 +RTVSPropertyOp21 + 70 + 1 +102 +RTVSPropertyOp22 + 70 + 1 +102 +RTVSPropertyOp23 + 70 + 1 +102 +RTVSPropertyOp24 + 70 + 1 +102 +RTVSPropertyOp25 + 70 + 1 +102 +RTVSPropertyOp26 + 70 + 1 +102 +RTVSPropertyOp27 + 70 + 1 +102 +RTVSPropertyOp28 + 70 + 1 +102 +RTVSPropertyOp29 + 70 + 1 +102 +RTVSPropertyOp30 + 70 + 1 +102 +RTVSPropertyOp31 + 70 + 1 +102 +RTVSPropertyOp32 + 70 + 1 +102 +RTVSPropertyOp33 + 70 + 1 +102 +RTVSPropertyOp34 + 70 + 1 +102 +RTVSPropertyOp35 + 70 + 1 +102 +RTVSPropertyOp36 + 70 + 1 +102 +RTVSPropertyOp37 + 70 + 1 +102 +RTVSPropertyOp38 + 70 + 1 +102 +RTVSPropertyOp39 + 70 + 1 +102 +RTVSPropertyOp40 + 70 + 1 +102 +RTVSPropertyOp41 + 70 + 1 +102 +RTVSPropertyOp42 + 70 + 1 +102 +RTVSPropertyOp43 + 70 + 1 +102 +RTVSPropertyOp44 + 70 + 1 +102 +RTVSPropertyOp45 + 70 + 1 +102 +RTVSPropertyOp46 + 70 + 1 +102 +RTVSPropertyOp47 + 70 + 1 +102 +RTVSPropertyOp48 + 70 + 1 +102 +RTVSPropertyOp49 + 70 + 1 +102 +RTVSPropertyOp50 + 70 + 1 +102 +RTVSPropertyOp51 + 70 + 0 +102 +RTVSPropertyOp52 + 70 + 0 +102 +RTVSPropertyOp53 + 70 + 1 +102 +RTVSPropertyOp54 + 70 + 1 +102 +RTVSPropertyOp55 + 70 + 1 +102 +RTVSPropertyOp56 + 70 + 1 +102 +RTVSPropertyOp57 + 70 + 1 +102 +RTVSPropertyOp58 + 70 + 1 +102 +RTVSPropertyOp59 + 70 + 1 +102 +RTVSPropertyOp60 + 70 + 1 +102 +RTVSPropertyOp61 + 70 + 1 +102 +RTVSPropertyOp62 + 70 + 1 + 0 +XRECORD + 5 +2C0 +102 +{ACAD_REACTORS +330 +2BF +102 +} +330 +2BF +100 +AcDbXrecord +280 + 1 +102 +RTVSPost2010Prop28 +280 + 0 +102 +RTVSPost2010PropOp28 + 70 + 1 +102 +RTVSPost2010Prop29 +280 + 1 +102 +RTVSPost2010PropOp29 + 70 + 1 +102 +RTVSPost2010Prop30 +280 + 1 +102 +RTVSPost2010PropOp30 + 70 + 1 +102 +RTVSPost2010Prop31 +280 + 0 +102 +RTVSPost2010PropOp31 + 70 + 1 +102 +RTVSPost2010Prop32 +280 + 0 +102 +RTVSPost2010PropOp32 + 70 + 1 +102 +RTVSPost2010Prop33 +280 + 0 +102 +RTVSPost2010PropOp33 + 70 + 1 +102 +RTVSPost2010Prop34 +280 + 0 +102 +RTVSPost2010PropOp34 + 70 + 1 +102 +RTVSPost2010Prop35 +280 + 0 +102 +RTVSPost2010PropOp35 + 70 + 1 +102 +RTVSPost2010Prop36 +280 + 0 +102 +RTVSPost2010PropOp36 + 70 + 1 +102 +RTVSPost2010Prop37 + 90 + 50 +102 +RTVSPost2010PropOp37 + 70 + 1 +102 +RTVSPost2010Prop38 +140 +0.0 +102 +RTVSPost2010PropOp38 + 70 + 1 +102 +RTVSPost2010Prop39 +140 +1.0 +102 +RTVSPost2010PropOp39 + 70 + 1 +102 +RTVSPost2010Prop40 + 90 + 0 +102 +RTVSPost2010PropOp40 + 70 + 1 +102 +RTVSPost2010Prop41ColorIndex + 90 + 18 +102 +RTVSPost2010Prop41ColorRGB + 90 + 0 +102 +RTVSPost2010PropOp41 + 70 + 1 +102 +RTVSPost2010Prop42 + 90 + 50 +102 +RTVSPost2010PropOp42 + 70 + 1 +102 +RTVSPost2010Prop43 + 90 + 3 +102 +RTVSPost2010PropOp43 + 70 + 1 +102 +RTVSPost2010Prop44ColorIndex + 90 + 5 +102 +RTVSPost2010Prop44ColorRGB + 90 + 255 +102 +RTVSPost2010PropOp44 + 70 + 1 +102 +RTVSPost2010Prop45 +280 + 0 +102 +RTVSPost2010PropOp45 + 70 + 1 +102 +RTVSPost2010Prop46 + 90 + 50 +102 +RTVSPost2010PropOp46 + 70 + 1 +102 +RTVSPost2010Prop47 + 90 + 50 +102 +RTVSPost2010PropOp47 + 70 + 1 +102 +RTVSPost2010Prop48 + 90 + 50 +102 +RTVSPost2010PropOp48 + 70 + 1 +102 +RTVSPost2010Prop49 +280 + 0 +102 +RTVSPost2010PropOp49 + 70 + 1 +102 +RTVSPost2010Prop50 + 90 + 50 +102 +RTVSPost2010PropOp50 + 70 + 1 +102 +RTVSPost2010Prop51ColorIndex + 90 + 256 +102 +RTVSPost2010Prop51ColorRGB + 90 +-16777216 +102 +RTVSPost2010PropOp51 + 70 + 0 +102 +RTVSPost2010Prop52 +140 +1.0 +102 +RTVSPost2010PropOp52 + 70 + 0 +102 +RTVSPost2010Prop53 + 90 + 2 +102 +RTVSPost2010PropOp53 + 70 + 1 +102 +RTVSPost2010Prop54 + 1 +strokes_ogs.tif +102 +RTVSPost2010PropOp54 + 70 + 1 +102 +RTVSPost2010Prop55 +280 + 0 +102 +RTVSPost2010PropOp55 + 70 + 1 +102 +RTVSPost2010Prop56 +140 +1.0 +102 +RTVSPost2010PropOp56 + 70 + 1 +102 +RTVSPost2010Prop57 +140 +1.0 +102 +RTVSPost2010PropOp57 + 70 + 1 +102 +RTVSPropertyOp0 + 70 + 1 +102 +RTVSPropertyOp1 + 70 + 1 +102 +RTVSPropertyOp2 + 70 + 1 +102 +RTVSPropertyOp3 + 70 + 1 +102 +RTVSPropertyOp4 + 70 + 1 +102 +RTVSPropertyOp5 + 70 + 1 +102 +RTVSPropertyOp6 + 70 + 1 +102 +RTVSPropertyOp7 + 70 + 1 +102 +RTVSPropertyOp8 + 70 + 1 +102 +RTVSPropertyOp9 + 70 + 1 +102 +RTVSPropertyOp10 + 70 + 1 +102 +RTVSPropertyOp11 + 70 + 1 +102 +RTVSPropertyOp12 + 70 + 1 +102 +RTVSPropertyOp13 + 70 + 1 +102 +RTVSPropertyOp14 + 70 + 1 +102 +RTVSPropertyOp15 + 70 + 1 +102 +RTVSPropertyOp16 + 70 + 1 +102 +RTVSPropertyOp17 + 70 + 1 +102 +RTVSPropertyOp18 + 70 + 1 +102 +RTVSPropertyOp19 + 70 + 1 +102 +RTVSPropertyOp20 + 70 + 1 +102 +RTVSPropertyOp21 + 70 + 1 +102 +RTVSPropertyOp22 + 70 + 1 +102 +RTVSPropertyOp23 + 70 + 1 +102 +RTVSPropertyOp24 + 70 + 1 +102 +RTVSPropertyOp25 + 70 + 1 +102 +RTVSPropertyOp26 + 70 + 1 +102 +RTVSPropertyOp27 + 70 + 1 +102 +RTVSPropertyOp28 + 70 + 1 +102 +RTVSPropertyOp29 + 70 + 1 +102 +RTVSPropertyOp30 + 70 + 1 +102 +RTVSPropertyOp31 + 70 + 1 +102 +RTVSPropertyOp32 + 70 + 1 +102 +RTVSPropertyOp33 + 70 + 1 +102 +RTVSPropertyOp34 + 70 + 1 +102 +RTVSPropertyOp35 + 70 + 1 +102 +RTVSPropertyOp36 + 70 + 1 +102 +RTVSPropertyOp37 + 70 + 1 +102 +RTVSPropertyOp38 + 70 + 1 +102 +RTVSPropertyOp39 + 70 + 1 +102 +RTVSPropertyOp40 + 70 + 1 +102 +RTVSPropertyOp41 + 70 + 1 +102 +RTVSPropertyOp42 + 70 + 1 +102 +RTVSPropertyOp43 + 70 + 1 +102 +RTVSPropertyOp44 + 70 + 1 +102 +RTVSPropertyOp45 + 70 + 1 +102 +RTVSPropertyOp46 + 70 + 1 +102 +RTVSPropertyOp47 + 70 + 1 +102 +RTVSPropertyOp48 + 70 + 1 +102 +RTVSPropertyOp49 + 70 + 1 +102 +RTVSPropertyOp50 + 70 + 1 +102 +RTVSPropertyOp51 + 70 + 0 +102 +RTVSPropertyOp52 + 70 + 0 +102 +RTVSPropertyOp53 + 70 + 1 +102 +RTVSPropertyOp54 + 70 + 1 +102 +RTVSPropertyOp55 + 70 + 1 +102 +RTVSPropertyOp56 + 70 + 1 +102 +RTVSPropertyOp57 + 70 + 1 +102 +RTVSPropertyOp58 + 70 + 1 +102 +RTVSPropertyOp59 + 70 + 1 +102 +RTVSPropertyOp60 + 70 + 1 +102 +RTVSPropertyOp61 + 70 + 1 +102 +RTVSPropertyOp62 + 70 + 1 + 0 +XRECORD + 5 +2A4 +102 +{ACAD_REACTORS +330 +2A3 +102 +} +330 +2A3 +100 +AcDbXrecord +280 + 1 +102 +RTVSPost2010Prop28 +280 + 0 +102 +RTVSPost2010PropOp28 + 70 + 1 +102 +RTVSPost2010Prop29 +280 + 1 +102 +RTVSPost2010PropOp29 + 70 + 1 +102 +RTVSPost2010Prop30 +280 + 1 +102 +RTVSPost2010PropOp30 + 70 + 1 +102 +RTVSPost2010Prop31 +280 + 0 +102 +RTVSPost2010PropOp31 + 70 + 1 +102 +RTVSPost2010Prop32 +280 + 0 +102 +RTVSPost2010PropOp32 + 70 + 1 +102 +RTVSPost2010Prop33 +280 + 0 +102 +RTVSPost2010PropOp33 + 70 + 1 +102 +RTVSPost2010Prop34 +280 + 0 +102 +RTVSPost2010PropOp34 + 70 + 1 +102 +RTVSPost2010Prop35 +280 + 0 +102 +RTVSPost2010PropOp35 + 70 + 1 +102 +RTVSPost2010Prop36 +280 + 0 +102 +RTVSPost2010PropOp36 + 70 + 1 +102 +RTVSPost2010Prop37 + 90 + 50 +102 +RTVSPost2010PropOp37 + 70 + 1 +102 +RTVSPost2010Prop38 +140 +0.0 +102 +RTVSPost2010PropOp38 + 70 + 1 +102 +RTVSPost2010Prop39 +140 +1.0 +102 +RTVSPost2010PropOp39 + 70 + 1 +102 +RTVSPost2010Prop40 + 90 + 0 +102 +RTVSPost2010PropOp40 + 70 + 1 +102 +RTVSPost2010Prop41ColorIndex + 90 + 18 +102 +RTVSPost2010Prop41ColorRGB + 90 + 0 +102 +RTVSPost2010PropOp41 + 70 + 1 +102 +RTVSPost2010Prop42 + 90 + 50 +102 +RTVSPost2010PropOp42 + 70 + 1 +102 +RTVSPost2010Prop43 + 90 + 3 +102 +RTVSPost2010PropOp43 + 70 + 1 +102 +RTVSPost2010Prop44ColorIndex + 90 + 5 +102 +RTVSPost2010Prop44ColorRGB + 90 + 255 +102 +RTVSPost2010PropOp44 + 70 + 1 +102 +RTVSPost2010Prop45 +280 + 0 +102 +RTVSPost2010PropOp45 + 70 + 1 +102 +RTVSPost2010Prop46 + 90 + 50 +102 +RTVSPost2010PropOp46 + 70 + 1 +102 +RTVSPost2010Prop47 + 90 + 50 +102 +RTVSPost2010PropOp47 + 70 + 1 +102 +RTVSPost2010Prop48 + 90 + 50 +102 +RTVSPost2010PropOp48 + 70 + 1 +102 +RTVSPost2010Prop49 +280 + 0 +102 +RTVSPost2010PropOp49 + 70 + 1 +102 +RTVSPost2010Prop50 + 90 + 50 +102 +RTVSPost2010PropOp50 + 70 + 1 +102 +RTVSPost2010Prop51ColorIndex + 90 + 256 +102 +RTVSPost2010Prop51ColorRGB + 90 +-16777216 +102 +RTVSPost2010PropOp51 + 70 + 0 +102 +RTVSPost2010Prop52 +140 +1.0 +102 +RTVSPost2010PropOp52 + 70 + 0 +102 +RTVSPost2010Prop53 + 90 + 2 +102 +RTVSPost2010PropOp53 + 70 + 1 +102 +RTVSPost2010Prop54 + 1 +strokes_ogs.tif +102 +RTVSPost2010PropOp54 + 70 + 1 +102 +RTVSPost2010Prop55 +280 + 0 +102 +RTVSPost2010PropOp55 + 70 + 1 +102 +RTVSPost2010Prop56 +140 +1.0 +102 +RTVSPost2010PropOp56 + 70 + 1 +102 +RTVSPost2010Prop57 +140 +1.0 +102 +RTVSPost2010PropOp57 + 70 + 1 +102 +RTVSPropertyOp0 + 70 + 1 +102 +RTVSPropertyOp1 + 70 + 1 +102 +RTVSPropertyOp2 + 70 + 1 +102 +RTVSPropertyOp3 + 70 + 1 +102 +RTVSPropertyOp4 + 70 + 1 +102 +RTVSPropertyOp5 + 70 + 1 +102 +RTVSPropertyOp6 + 70 + 1 +102 +RTVSPropertyOp7 + 70 + 1 +102 +RTVSPropertyOp8 + 70 + 1 +102 +RTVSPropertyOp9 + 70 + 1 +102 +RTVSPropertyOp10 + 70 + 1 +102 +RTVSPropertyOp11 + 70 + 1 +102 +RTVSPropertyOp12 + 70 + 1 +102 +RTVSPropertyOp13 + 70 + 1 +102 +RTVSPropertyOp14 + 70 + 1 +102 +RTVSPropertyOp15 + 70 + 1 +102 +RTVSPropertyOp16 + 70 + 1 +102 +RTVSPropertyOp17 + 70 + 1 +102 +RTVSPropertyOp18 + 70 + 1 +102 +RTVSPropertyOp19 + 70 + 1 +102 +RTVSPropertyOp20 + 70 + 1 +102 +RTVSPropertyOp21 + 70 + 1 +102 +RTVSPropertyOp22 + 70 + 1 +102 +RTVSPropertyOp23 + 70 + 1 +102 +RTVSPropertyOp24 + 70 + 1 +102 +RTVSPropertyOp25 + 70 + 1 +102 +RTVSPropertyOp26 + 70 + 1 +102 +RTVSPropertyOp27 + 70 + 1 +102 +RTVSPropertyOp28 + 70 + 1 +102 +RTVSPropertyOp29 + 70 + 1 +102 +RTVSPropertyOp30 + 70 + 1 +102 +RTVSPropertyOp31 + 70 + 1 +102 +RTVSPropertyOp32 + 70 + 1 +102 +RTVSPropertyOp33 + 70 + 1 +102 +RTVSPropertyOp34 + 70 + 1 +102 +RTVSPropertyOp35 + 70 + 1 +102 +RTVSPropertyOp36 + 70 + 1 +102 +RTVSPropertyOp37 + 70 + 1 +102 +RTVSPropertyOp38 + 70 + 1 +102 +RTVSPropertyOp39 + 70 + 1 +102 +RTVSPropertyOp40 + 70 + 1 +102 +RTVSPropertyOp41 + 70 + 1 +102 +RTVSPropertyOp42 + 70 + 1 +102 +RTVSPropertyOp43 + 70 + 1 +102 +RTVSPropertyOp44 + 70 + 1 +102 +RTVSPropertyOp45 + 70 + 1 +102 +RTVSPropertyOp46 + 70 + 1 +102 +RTVSPropertyOp47 + 70 + 1 +102 +RTVSPropertyOp48 + 70 + 1 +102 +RTVSPropertyOp49 + 70 + 1 +102 +RTVSPropertyOp50 + 70 + 1 +102 +RTVSPropertyOp51 + 70 + 0 +102 +RTVSPropertyOp52 + 70 + 0 +102 +RTVSPropertyOp53 + 70 + 1 +102 +RTVSPropertyOp54 + 70 + 1 +102 +RTVSPropertyOp55 + 70 + 1 +102 +RTVSPropertyOp56 + 70 + 1 +102 +RTVSPropertyOp57 + 70 + 1 +102 +RTVSPropertyOp58 + 70 + 1 +102 +RTVSPropertyOp59 + 70 + 1 +102 +RTVSPropertyOp60 + 70 + 1 +102 +RTVSPropertyOp61 + 70 + 1 +102 +RTVSPropertyOp62 + 70 + 1 + 0 +XRECORD + 5 +2A6 +102 +{ACAD_REACTORS +330 +2A5 +102 +} +330 +2A5 +100 +AcDbXrecord +280 + 1 +102 +RTVSPost2010Prop28 +280 + 0 +102 +RTVSPost2010PropOp28 + 70 + 1 +102 +RTVSPost2010Prop29 +280 + 1 +102 +RTVSPost2010PropOp29 + 70 + 1 +102 +RTVSPost2010Prop30 +280 + 1 +102 +RTVSPost2010PropOp30 + 70 + 1 +102 +RTVSPost2010Prop31 +280 + 0 +102 +RTVSPost2010PropOp31 + 70 + 1 +102 +RTVSPost2010Prop32 +280 + 0 +102 +RTVSPost2010PropOp32 + 70 + 1 +102 +RTVSPost2010Prop33 +280 + 0 +102 +RTVSPost2010PropOp33 + 70 + 1 +102 +RTVSPost2010Prop34 +280 + 0 +102 +RTVSPost2010PropOp34 + 70 + 1 +102 +RTVSPost2010Prop35 +280 + 0 +102 +RTVSPost2010PropOp35 + 70 + 1 +102 +RTVSPost2010Prop36 +280 + 0 +102 +RTVSPost2010PropOp36 + 70 + 1 +102 +RTVSPost2010Prop37 + 90 + 50 +102 +RTVSPost2010PropOp37 + 70 + 1 +102 +RTVSPost2010Prop38 +140 +0.0 +102 +RTVSPost2010PropOp38 + 70 + 1 +102 +RTVSPost2010Prop39 +140 +1.0 +102 +RTVSPost2010PropOp39 + 70 + 1 +102 +RTVSPost2010Prop40 + 90 + 0 +102 +RTVSPost2010PropOp40 + 70 + 1 +102 +RTVSPost2010Prop41ColorIndex + 90 + 18 +102 +RTVSPost2010Prop41ColorRGB + 90 + 0 +102 +RTVSPost2010PropOp41 + 70 + 1 +102 +RTVSPost2010Prop42 + 90 + 50 +102 +RTVSPost2010PropOp42 + 70 + 1 +102 +RTVSPost2010Prop43 + 90 + 3 +102 +RTVSPost2010PropOp43 + 70 + 1 +102 +RTVSPost2010Prop44ColorIndex + 90 + 5 +102 +RTVSPost2010Prop44ColorRGB + 90 + 255 +102 +RTVSPost2010PropOp44 + 70 + 1 +102 +RTVSPost2010Prop45 +280 + 0 +102 +RTVSPost2010PropOp45 + 70 + 1 +102 +RTVSPost2010Prop46 + 90 + 50 +102 +RTVSPost2010PropOp46 + 70 + 1 +102 +RTVSPost2010Prop47 + 90 + 50 +102 +RTVSPost2010PropOp47 + 70 + 1 +102 +RTVSPost2010Prop48 + 90 + 50 +102 +RTVSPost2010PropOp48 + 70 + 1 +102 +RTVSPost2010Prop49 +280 + 0 +102 +RTVSPost2010PropOp49 + 70 + 1 +102 +RTVSPost2010Prop50 + 90 + 50 +102 +RTVSPost2010PropOp50 + 70 + 1 +102 +RTVSPost2010Prop51ColorIndex + 90 + 256 +102 +RTVSPost2010Prop51ColorRGB + 90 +-16777216 +102 +RTVSPost2010PropOp51 + 70 + 0 +102 +RTVSPost2010Prop52 +140 +1.0 +102 +RTVSPost2010PropOp52 + 70 + 0 +102 +RTVSPost2010Prop53 + 90 + 2 +102 +RTVSPost2010PropOp53 + 70 + 1 +102 +RTVSPost2010Prop54 + 1 +strokes_ogs.tif +102 +RTVSPost2010PropOp54 + 70 + 1 +102 +RTVSPost2010Prop55 +280 + 0 +102 +RTVSPost2010PropOp55 + 70 + 1 +102 +RTVSPost2010Prop56 +140 +1.0 +102 +RTVSPost2010PropOp56 + 70 + 1 +102 +RTVSPost2010Prop57 +140 +1.0 +102 +RTVSPost2010PropOp57 + 70 + 1 +102 +RTVSPropertyOp0 + 70 + 1 +102 +RTVSPropertyOp1 + 70 + 1 +102 +RTVSPropertyOp2 + 70 + 1 +102 +RTVSPropertyOp3 + 70 + 1 +102 +RTVSPropertyOp4 + 70 + 1 +102 +RTVSPropertyOp5 + 70 + 1 +102 +RTVSPropertyOp6 + 70 + 1 +102 +RTVSPropertyOp7 + 70 + 1 +102 +RTVSPropertyOp8 + 70 + 1 +102 +RTVSPropertyOp9 + 70 + 1 +102 +RTVSPropertyOp10 + 70 + 1 +102 +RTVSPropertyOp11 + 70 + 1 +102 +RTVSPropertyOp12 + 70 + 1 +102 +RTVSPropertyOp13 + 70 + 1 +102 +RTVSPropertyOp14 + 70 + 1 +102 +RTVSPropertyOp15 + 70 + 1 +102 +RTVSPropertyOp16 + 70 + 1 +102 +RTVSPropertyOp17 + 70 + 1 +102 +RTVSPropertyOp18 + 70 + 1 +102 +RTVSPropertyOp19 + 70 + 1 +102 +RTVSPropertyOp20 + 70 + 1 +102 +RTVSPropertyOp21 + 70 + 1 +102 +RTVSPropertyOp22 + 70 + 1 +102 +RTVSPropertyOp23 + 70 + 1 +102 +RTVSPropertyOp24 + 70 + 1 +102 +RTVSPropertyOp25 + 70 + 1 +102 +RTVSPropertyOp26 + 70 + 1 +102 +RTVSPropertyOp27 + 70 + 1 +102 +RTVSPropertyOp28 + 70 + 1 +102 +RTVSPropertyOp29 + 70 + 1 +102 +RTVSPropertyOp30 + 70 + 1 +102 +RTVSPropertyOp31 + 70 + 1 +102 +RTVSPropertyOp32 + 70 + 1 +102 +RTVSPropertyOp33 + 70 + 1 +102 +RTVSPropertyOp34 + 70 + 1 +102 +RTVSPropertyOp35 + 70 + 1 +102 +RTVSPropertyOp36 + 70 + 1 +102 +RTVSPropertyOp37 + 70 + 1 +102 +RTVSPropertyOp38 + 70 + 1 +102 +RTVSPropertyOp39 + 70 + 1 +102 +RTVSPropertyOp40 + 70 + 1 +102 +RTVSPropertyOp41 + 70 + 1 +102 +RTVSPropertyOp42 + 70 + 1 +102 +RTVSPropertyOp43 + 70 + 1 +102 +RTVSPropertyOp44 + 70 + 1 +102 +RTVSPropertyOp45 + 70 + 1 +102 +RTVSPropertyOp46 + 70 + 1 +102 +RTVSPropertyOp47 + 70 + 1 +102 +RTVSPropertyOp48 + 70 + 1 +102 +RTVSPropertyOp49 + 70 + 1 +102 +RTVSPropertyOp50 + 70 + 1 +102 +RTVSPropertyOp51 + 70 + 0 +102 +RTVSPropertyOp52 + 70 + 0 +102 +RTVSPropertyOp53 + 70 + 1 +102 +RTVSPropertyOp54 + 70 + 1 +102 +RTVSPropertyOp55 + 70 + 1 +102 +RTVSPropertyOp56 + 70 + 1 +102 +RTVSPropertyOp57 + 70 + 1 +102 +RTVSPropertyOp58 + 70 + 1 +102 +RTVSPropertyOp59 + 70 + 1 +102 +RTVSPropertyOp60 + 70 + 1 +102 +RTVSPropertyOp61 + 70 + 1 +102 +RTVSPropertyOp62 + 70 + 1 + 0 +XRECORD + 5 +2A8 +102 +{ACAD_REACTORS +330 +2A7 +102 +} +330 +2A7 +100 +AcDbXrecord +280 + 1 +102 +RTVSPost2010Prop28 +280 + 0 +102 +RTVSPost2010PropOp28 + 70 + 1 +102 +RTVSPost2010Prop29 +280 + 1 +102 +RTVSPost2010PropOp29 + 70 + 1 +102 +RTVSPost2010Prop30 +280 + 1 +102 +RTVSPost2010PropOp30 + 70 + 1 +102 +RTVSPost2010Prop31 +280 + 0 +102 +RTVSPost2010PropOp31 + 70 + 1 +102 +RTVSPost2010Prop32 +280 + 0 +102 +RTVSPost2010PropOp32 + 70 + 1 +102 +RTVSPost2010Prop33 +280 + 0 +102 +RTVSPost2010PropOp33 + 70 + 1 +102 +RTVSPost2010Prop34 +280 + 0 +102 +RTVSPost2010PropOp34 + 70 + 1 +102 +RTVSPost2010Prop35 +280 + 0 +102 +RTVSPost2010PropOp35 + 70 + 1 +102 +RTVSPost2010Prop36 +280 + 0 +102 +RTVSPost2010PropOp36 + 70 + 1 +102 +RTVSPost2010Prop37 + 90 + 50 +102 +RTVSPost2010PropOp37 + 70 + 1 +102 +RTVSPost2010Prop38 +140 +0.0 +102 +RTVSPost2010PropOp38 + 70 + 1 +102 +RTVSPost2010Prop39 +140 +1.0 +102 +RTVSPost2010PropOp39 + 70 + 1 +102 +RTVSPost2010Prop40 + 90 + 0 +102 +RTVSPost2010PropOp40 + 70 + 1 +102 +RTVSPost2010Prop41ColorIndex + 90 + 18 +102 +RTVSPost2010Prop41ColorRGB + 90 + 0 +102 +RTVSPost2010PropOp41 + 70 + 1 +102 +RTVSPost2010Prop42 + 90 + 50 +102 +RTVSPost2010PropOp42 + 70 + 1 +102 +RTVSPost2010Prop43 + 90 + 3 +102 +RTVSPost2010PropOp43 + 70 + 1 +102 +RTVSPost2010Prop44ColorIndex + 90 + 5 +102 +RTVSPost2010Prop44ColorRGB + 90 + 255 +102 +RTVSPost2010PropOp44 + 70 + 1 +102 +RTVSPost2010Prop45 +280 + 0 +102 +RTVSPost2010PropOp45 + 70 + 1 +102 +RTVSPost2010Prop46 + 90 + 50 +102 +RTVSPost2010PropOp46 + 70 + 1 +102 +RTVSPost2010Prop47 + 90 + 50 +102 +RTVSPost2010PropOp47 + 70 + 1 +102 +RTVSPost2010Prop48 + 90 + 50 +102 +RTVSPost2010PropOp48 + 70 + 1 +102 +RTVSPost2010Prop49 +280 + 0 +102 +RTVSPost2010PropOp49 + 70 + 1 +102 +RTVSPost2010Prop50 + 90 + 50 +102 +RTVSPost2010PropOp50 + 70 + 1 +102 +RTVSPost2010Prop51ColorIndex + 90 + 256 +102 +RTVSPost2010Prop51ColorRGB + 90 +-16777216 +102 +RTVSPost2010PropOp51 + 70 + 0 +102 +RTVSPost2010Prop52 +140 +1.0 +102 +RTVSPost2010PropOp52 + 70 + 0 +102 +RTVSPost2010Prop53 + 90 + 2 +102 +RTVSPost2010PropOp53 + 70 + 1 +102 +RTVSPost2010Prop54 + 1 +strokes_ogs.tif +102 +RTVSPost2010PropOp54 + 70 + 1 +102 +RTVSPost2010Prop55 +280 + 0 +102 +RTVSPost2010PropOp55 + 70 + 1 +102 +RTVSPost2010Prop56 +140 +1.0 +102 +RTVSPost2010PropOp56 + 70 + 1 +102 +RTVSPost2010Prop57 +140 +1.0 +102 +RTVSPost2010PropOp57 + 70 + 1 +102 +RTVSPropertyOp0 + 70 + 1 +102 +RTVSPropertyOp1 + 70 + 1 +102 +RTVSPropertyOp2 + 70 + 1 +102 +RTVSPropertyOp3 + 70 + 1 +102 +RTVSPropertyOp4 + 70 + 1 +102 +RTVSPropertyOp5 + 70 + 1 +102 +RTVSPropertyOp6 + 70 + 1 +102 +RTVSPropertyOp7 + 70 + 1 +102 +RTVSPropertyOp8 + 70 + 1 +102 +RTVSPropertyOp9 + 70 + 1 +102 +RTVSPropertyOp10 + 70 + 1 +102 +RTVSPropertyOp11 + 70 + 1 +102 +RTVSPropertyOp12 + 70 + 1 +102 +RTVSPropertyOp13 + 70 + 1 +102 +RTVSPropertyOp14 + 70 + 1 +102 +RTVSPropertyOp15 + 70 + 1 +102 +RTVSPropertyOp16 + 70 + 1 +102 +RTVSPropertyOp17 + 70 + 1 +102 +RTVSPropertyOp18 + 70 + 1 +102 +RTVSPropertyOp19 + 70 + 1 +102 +RTVSPropertyOp20 + 70 + 1 +102 +RTVSPropertyOp21 + 70 + 1 +102 +RTVSPropertyOp22 + 70 + 1 +102 +RTVSPropertyOp23 + 70 + 1 +102 +RTVSPropertyOp24 + 70 + 1 +102 +RTVSPropertyOp25 + 70 + 1 +102 +RTVSPropertyOp26 + 70 + 1 +102 +RTVSPropertyOp27 + 70 + 1 +102 +RTVSPropertyOp28 + 70 + 1 +102 +RTVSPropertyOp29 + 70 + 1 +102 +RTVSPropertyOp30 + 70 + 1 +102 +RTVSPropertyOp31 + 70 + 1 +102 +RTVSPropertyOp32 + 70 + 1 +102 +RTVSPropertyOp33 + 70 + 1 +102 +RTVSPropertyOp34 + 70 + 1 +102 +RTVSPropertyOp35 + 70 + 1 +102 +RTVSPropertyOp36 + 70 + 1 +102 +RTVSPropertyOp37 + 70 + 1 +102 +RTVSPropertyOp38 + 70 + 1 +102 +RTVSPropertyOp39 + 70 + 1 +102 +RTVSPropertyOp40 + 70 + 1 +102 +RTVSPropertyOp41 + 70 + 1 +102 +RTVSPropertyOp42 + 70 + 1 +102 +RTVSPropertyOp43 + 70 + 1 +102 +RTVSPropertyOp44 + 70 + 1 +102 +RTVSPropertyOp45 + 70 + 1 +102 +RTVSPropertyOp46 + 70 + 1 +102 +RTVSPropertyOp47 + 70 + 1 +102 +RTVSPropertyOp48 + 70 + 1 +102 +RTVSPropertyOp49 + 70 + 1 +102 +RTVSPropertyOp50 + 70 + 1 +102 +RTVSPropertyOp51 + 70 + 0 +102 +RTVSPropertyOp52 + 70 + 0 +102 +RTVSPropertyOp53 + 70 + 1 +102 +RTVSPropertyOp54 + 70 + 1 +102 +RTVSPropertyOp55 + 70 + 1 +102 +RTVSPropertyOp56 + 70 + 1 +102 +RTVSPropertyOp57 + 70 + 1 +102 +RTVSPropertyOp58 + 70 + 1 +102 +RTVSPropertyOp59 + 70 + 1 +102 +RTVSPropertyOp60 + 70 + 1 +102 +RTVSPropertyOp61 + 70 + 1 +102 +RTVSPropertyOp62 + 70 + 1 + 0 +XRECORD + 5 +2AA +102 +{ACAD_REACTORS +330 +2A9 +102 +} +330 +2A9 +100 +AcDbXrecord +280 + 1 +102 +RTVSPost2010Prop28 +280 + 0 +102 +RTVSPost2010PropOp28 + 70 + 1 +102 +RTVSPost2010Prop29 +280 + 1 +102 +RTVSPost2010PropOp29 + 70 + 1 +102 +RTVSPost2010Prop30 +280 + 1 +102 +RTVSPost2010PropOp30 + 70 + 1 +102 +RTVSPost2010Prop31 +280 + 0 +102 +RTVSPost2010PropOp31 + 70 + 1 +102 +RTVSPost2010Prop32 +280 + 0 +102 +RTVSPost2010PropOp32 + 70 + 1 +102 +RTVSPost2010Prop33 +280 + 0 +102 +RTVSPost2010PropOp33 + 70 + 1 +102 +RTVSPost2010Prop34 +280 + 0 +102 +RTVSPost2010PropOp34 + 70 + 1 +102 +RTVSPost2010Prop35 +280 + 0 +102 +RTVSPost2010PropOp35 + 70 + 1 +102 +RTVSPost2010Prop36 +280 + 0 +102 +RTVSPost2010PropOp36 + 70 + 1 +102 +RTVSPost2010Prop37 + 90 + 50 +102 +RTVSPost2010PropOp37 + 70 + 1 +102 +RTVSPost2010Prop38 +140 +0.0 +102 +RTVSPost2010PropOp38 + 70 + 1 +102 +RTVSPost2010Prop39 +140 +1.0 +102 +RTVSPost2010PropOp39 + 70 + 1 +102 +RTVSPost2010Prop40 + 90 + 0 +102 +RTVSPost2010PropOp40 + 70 + 1 +102 +RTVSPost2010Prop41ColorIndex + 90 + 18 +102 +RTVSPost2010Prop41ColorRGB + 90 + 0 +102 +RTVSPost2010PropOp41 + 70 + 1 +102 +RTVSPost2010Prop42 + 90 + 50 +102 +RTVSPost2010PropOp42 + 70 + 1 +102 +RTVSPost2010Prop43 + 90 + 3 +102 +RTVSPost2010PropOp43 + 70 + 1 +102 +RTVSPost2010Prop44ColorIndex + 90 + 5 +102 +RTVSPost2010Prop44ColorRGB + 90 + 255 +102 +RTVSPost2010PropOp44 + 70 + 1 +102 +RTVSPost2010Prop45 +280 + 0 +102 +RTVSPost2010PropOp45 + 70 + 1 +102 +RTVSPost2010Prop46 + 90 + 50 +102 +RTVSPost2010PropOp46 + 70 + 1 +102 +RTVSPost2010Prop47 + 90 + 50 +102 +RTVSPost2010PropOp47 + 70 + 1 +102 +RTVSPost2010Prop48 + 90 + 50 +102 +RTVSPost2010PropOp48 + 70 + 1 +102 +RTVSPost2010Prop49 +280 + 0 +102 +RTVSPost2010PropOp49 + 70 + 1 +102 +RTVSPost2010Prop50 + 90 + 50 +102 +RTVSPost2010PropOp50 + 70 + 1 +102 +RTVSPost2010Prop51ColorIndex + 90 + 256 +102 +RTVSPost2010Prop51ColorRGB + 90 +-16777216 +102 +RTVSPost2010PropOp51 + 70 + 0 +102 +RTVSPost2010Prop52 +140 +1.0 +102 +RTVSPost2010PropOp52 + 70 + 0 +102 +RTVSPost2010Prop53 + 90 + 2 +102 +RTVSPost2010PropOp53 + 70 + 1 +102 +RTVSPost2010Prop54 + 1 +strokes_ogs.tif +102 +RTVSPost2010PropOp54 + 70 + 1 +102 +RTVSPost2010Prop55 +280 + 0 +102 +RTVSPost2010PropOp55 + 70 + 1 +102 +RTVSPost2010Prop56 +140 +1.0 +102 +RTVSPost2010PropOp56 + 70 + 1 +102 +RTVSPost2010Prop57 +140 +1.0 +102 +RTVSPost2010PropOp57 + 70 + 1 +102 +RTVSPropertyOp0 + 70 + 1 +102 +RTVSPropertyOp1 + 70 + 1 +102 +RTVSPropertyOp2 + 70 + 1 +102 +RTVSPropertyOp3 + 70 + 1 +102 +RTVSPropertyOp4 + 70 + 1 +102 +RTVSPropertyOp5 + 70 + 1 +102 +RTVSPropertyOp6 + 70 + 1 +102 +RTVSPropertyOp7 + 70 + 1 +102 +RTVSPropertyOp8 + 70 + 1 +102 +RTVSPropertyOp9 + 70 + 1 +102 +RTVSPropertyOp10 + 70 + 1 +102 +RTVSPropertyOp11 + 70 + 1 +102 +RTVSPropertyOp12 + 70 + 1 +102 +RTVSPropertyOp13 + 70 + 1 +102 +RTVSPropertyOp14 + 70 + 1 +102 +RTVSPropertyOp15 + 70 + 1 +102 +RTVSPropertyOp16 + 70 + 1 +102 +RTVSPropertyOp17 + 70 + 1 +102 +RTVSPropertyOp18 + 70 + 1 +102 +RTVSPropertyOp19 + 70 + 1 +102 +RTVSPropertyOp20 + 70 + 1 +102 +RTVSPropertyOp21 + 70 + 1 +102 +RTVSPropertyOp22 + 70 + 1 +102 +RTVSPropertyOp23 + 70 + 1 +102 +RTVSPropertyOp24 + 70 + 1 +102 +RTVSPropertyOp25 + 70 + 1 +102 +RTVSPropertyOp26 + 70 + 1 +102 +RTVSPropertyOp27 + 70 + 1 +102 +RTVSPropertyOp28 + 70 + 1 +102 +RTVSPropertyOp29 + 70 + 1 +102 +RTVSPropertyOp30 + 70 + 1 +102 +RTVSPropertyOp31 + 70 + 1 +102 +RTVSPropertyOp32 + 70 + 1 +102 +RTVSPropertyOp33 + 70 + 1 +102 +RTVSPropertyOp34 + 70 + 1 +102 +RTVSPropertyOp35 + 70 + 1 +102 +RTVSPropertyOp36 + 70 + 1 +102 +RTVSPropertyOp37 + 70 + 1 +102 +RTVSPropertyOp38 + 70 + 1 +102 +RTVSPropertyOp39 + 70 + 1 +102 +RTVSPropertyOp40 + 70 + 1 +102 +RTVSPropertyOp41 + 70 + 1 +102 +RTVSPropertyOp42 + 70 + 1 +102 +RTVSPropertyOp43 + 70 + 1 +102 +RTVSPropertyOp44 + 70 + 1 +102 +RTVSPropertyOp45 + 70 + 1 +102 +RTVSPropertyOp46 + 70 + 1 +102 +RTVSPropertyOp47 + 70 + 1 +102 +RTVSPropertyOp48 + 70 + 1 +102 +RTVSPropertyOp49 + 70 + 1 +102 +RTVSPropertyOp50 + 70 + 1 +102 +RTVSPropertyOp51 + 70 + 0 +102 +RTVSPropertyOp52 + 70 + 0 +102 +RTVSPropertyOp53 + 70 + 1 +102 +RTVSPropertyOp54 + 70 + 1 +102 +RTVSPropertyOp55 + 70 + 1 +102 +RTVSPropertyOp56 + 70 + 1 +102 +RTVSPropertyOp57 + 70 + 1 +102 +RTVSPropertyOp58 + 70 + 1 +102 +RTVSPropertyOp59 + 70 + 1 +102 +RTVSPropertyOp60 + 70 + 1 +102 +RTVSPropertyOp61 + 70 + 1 +102 +RTVSPropertyOp62 + 70 + 1 + 0 +XRECORD + 5 +2B0 +102 +{ACAD_REACTORS +330 +2AF +102 +} +330 +2AF +100 +AcDbXrecord +280 + 1 +102 +RTVSPost2010Prop28 +280 + 0 +102 +RTVSPost2010PropOp28 + 70 + 1 +102 +RTVSPost2010Prop29 +280 + 1 +102 +RTVSPost2010PropOp29 + 70 + 1 +102 +RTVSPost2010Prop30 +280 + 1 +102 +RTVSPost2010PropOp30 + 70 + 1 +102 +RTVSPost2010Prop31 +280 + 0 +102 +RTVSPost2010PropOp31 + 70 + 1 +102 +RTVSPost2010Prop32 +280 + 0 +102 +RTVSPost2010PropOp32 + 70 + 1 +102 +RTVSPost2010Prop33 +280 + 0 +102 +RTVSPost2010PropOp33 + 70 + 1 +102 +RTVSPost2010Prop34 +280 + 0 +102 +RTVSPost2010PropOp34 + 70 + 1 +102 +RTVSPost2010Prop35 +280 + 0 +102 +RTVSPost2010PropOp35 + 70 + 1 +102 +RTVSPost2010Prop36 +280 + 0 +102 +RTVSPost2010PropOp36 + 70 + 1 +102 +RTVSPost2010Prop37 + 90 + 50 +102 +RTVSPost2010PropOp37 + 70 + 1 +102 +RTVSPost2010Prop38 +140 +0.0 +102 +RTVSPost2010PropOp38 + 70 + 1 +102 +RTVSPost2010Prop39 +140 +1.0 +102 +RTVSPost2010PropOp39 + 70 + 1 +102 +RTVSPost2010Prop40 + 90 + 0 +102 +RTVSPost2010PropOp40 + 70 + 1 +102 +RTVSPost2010Prop41ColorIndex + 90 + 18 +102 +RTVSPost2010Prop41ColorRGB + 90 + 0 +102 +RTVSPost2010PropOp41 + 70 + 1 +102 +RTVSPost2010Prop42 + 90 + 50 +102 +RTVSPost2010PropOp42 + 70 + 1 +102 +RTVSPost2010Prop43 + 90 + 3 +102 +RTVSPost2010PropOp43 + 70 + 1 +102 +RTVSPost2010Prop44ColorIndex + 90 + 5 +102 +RTVSPost2010Prop44ColorRGB + 90 + 255 +102 +RTVSPost2010PropOp44 + 70 + 1 +102 +RTVSPost2010Prop45 +280 + 0 +102 +RTVSPost2010PropOp45 + 70 + 1 +102 +RTVSPost2010Prop46 + 90 + 50 +102 +RTVSPost2010PropOp46 + 70 + 1 +102 +RTVSPost2010Prop47 + 90 + 50 +102 +RTVSPost2010PropOp47 + 70 + 1 +102 +RTVSPost2010Prop48 + 90 + 50 +102 +RTVSPost2010PropOp48 + 70 + 1 +102 +RTVSPost2010Prop49 +280 + 0 +102 +RTVSPost2010PropOp49 + 70 + 1 +102 +RTVSPost2010Prop50 + 90 + 50 +102 +RTVSPost2010PropOp50 + 70 + 1 +102 +RTVSPost2010Prop51ColorIndex + 90 + 256 +102 +RTVSPost2010Prop51ColorRGB + 90 +-16777216 +102 +RTVSPost2010PropOp51 + 70 + 0 +102 +RTVSPost2010Prop52 +140 +1.0 +102 +RTVSPost2010PropOp52 + 70 + 0 +102 +RTVSPost2010Prop53 + 90 + 2 +102 +RTVSPost2010PropOp53 + 70 + 1 +102 +RTVSPost2010Prop54 + 1 +strokes_ogs.tif +102 +RTVSPost2010PropOp54 + 70 + 1 +102 +RTVSPost2010Prop55 +280 + 0 +102 +RTVSPost2010PropOp55 + 70 + 1 +102 +RTVSPost2010Prop56 +140 +1.0 +102 +RTVSPost2010PropOp56 + 70 + 1 +102 +RTVSPost2010Prop57 +140 +1.0 +102 +RTVSPost2010PropOp57 + 70 + 1 +102 +RTVSPropertyOp0 + 70 + 1 +102 +RTVSPropertyOp1 + 70 + 1 +102 +RTVSPropertyOp2 + 70 + 1 +102 +RTVSPropertyOp3 + 70 + 1 +102 +RTVSPropertyOp4 + 70 + 1 +102 +RTVSPropertyOp5 + 70 + 1 +102 +RTVSPropertyOp6 + 70 + 1 +102 +RTVSPropertyOp7 + 70 + 1 +102 +RTVSPropertyOp8 + 70 + 1 +102 +RTVSPropertyOp9 + 70 + 1 +102 +RTVSPropertyOp10 + 70 + 1 +102 +RTVSPropertyOp11 + 70 + 1 +102 +RTVSPropertyOp12 + 70 + 1 +102 +RTVSPropertyOp13 + 70 + 1 +102 +RTVSPropertyOp14 + 70 + 1 +102 +RTVSPropertyOp15 + 70 + 1 +102 +RTVSPropertyOp16 + 70 + 1 +102 +RTVSPropertyOp17 + 70 + 1 +102 +RTVSPropertyOp18 + 70 + 1 +102 +RTVSPropertyOp19 + 70 + 1 +102 +RTVSPropertyOp20 + 70 + 1 +102 +RTVSPropertyOp21 + 70 + 1 +102 +RTVSPropertyOp22 + 70 + 1 +102 +RTVSPropertyOp23 + 70 + 1 +102 +RTVSPropertyOp24 + 70 + 1 +102 +RTVSPropertyOp25 + 70 + 1 +102 +RTVSPropertyOp26 + 70 + 1 +102 +RTVSPropertyOp27 + 70 + 1 +102 +RTVSPropertyOp28 + 70 + 1 +102 +RTVSPropertyOp29 + 70 + 1 +102 +RTVSPropertyOp30 + 70 + 1 +102 +RTVSPropertyOp31 + 70 + 1 +102 +RTVSPropertyOp32 + 70 + 1 +102 +RTVSPropertyOp33 + 70 + 1 +102 +RTVSPropertyOp34 + 70 + 1 +102 +RTVSPropertyOp35 + 70 + 1 +102 +RTVSPropertyOp36 + 70 + 1 +102 +RTVSPropertyOp37 + 70 + 1 +102 +RTVSPropertyOp38 + 70 + 1 +102 +RTVSPropertyOp39 + 70 + 1 +102 +RTVSPropertyOp40 + 70 + 1 +102 +RTVSPropertyOp41 + 70 + 1 +102 +RTVSPropertyOp42 + 70 + 1 +102 +RTVSPropertyOp43 + 70 + 1 +102 +RTVSPropertyOp44 + 70 + 1 +102 +RTVSPropertyOp45 + 70 + 1 +102 +RTVSPropertyOp46 + 70 + 1 +102 +RTVSPropertyOp47 + 70 + 1 +102 +RTVSPropertyOp48 + 70 + 1 +102 +RTVSPropertyOp49 + 70 + 1 +102 +RTVSPropertyOp50 + 70 + 1 +102 +RTVSPropertyOp51 + 70 + 0 +102 +RTVSPropertyOp52 + 70 + 0 +102 +RTVSPropertyOp53 + 70 + 1 +102 +RTVSPropertyOp54 + 70 + 1 +102 +RTVSPropertyOp55 + 70 + 1 +102 +RTVSPropertyOp56 + 70 + 1 +102 +RTVSPropertyOp57 + 70 + 1 +102 +RTVSPropertyOp58 + 70 + 1 +102 +RTVSPropertyOp59 + 70 + 1 +102 +RTVSPropertyOp60 + 70 + 1 +102 +RTVSPropertyOp61 + 70 + 1 +102 +RTVSPropertyOp62 + 70 + 1 + 0 +XRECORD + 5 +2C4 +102 +{ACAD_REACTORS +330 +2C3 +102 +} +330 +2C3 +100 +AcDbXrecord +280 + 1 +102 +RTVSPost2010Prop28 +280 + 0 +102 +RTVSPost2010PropOp28 + 70 + 1 +102 +RTVSPost2010Prop29 +280 + 1 +102 +RTVSPost2010PropOp29 + 70 + 1 +102 +RTVSPost2010Prop30 +280 + 1 +102 +RTVSPost2010PropOp30 + 70 + 1 +102 +RTVSPost2010Prop31 +280 + 0 +102 +RTVSPost2010PropOp31 + 70 + 1 +102 +RTVSPost2010Prop32 +280 + 0 +102 +RTVSPost2010PropOp32 + 70 + 1 +102 +RTVSPost2010Prop33 +280 + 0 +102 +RTVSPost2010PropOp33 + 70 + 1 +102 +RTVSPost2010Prop34 +280 + 0 +102 +RTVSPost2010PropOp34 + 70 + 1 +102 +RTVSPost2010Prop35 +280 + 0 +102 +RTVSPost2010PropOp35 + 70 + 1 +102 +RTVSPost2010Prop36 +280 + 0 +102 +RTVSPost2010PropOp36 + 70 + 1 +102 +RTVSPost2010Prop37 + 90 + 50 +102 +RTVSPost2010PropOp37 + 70 + 1 +102 +RTVSPost2010Prop38 +140 +0.0 +102 +RTVSPost2010PropOp38 + 70 + 1 +102 +RTVSPost2010Prop39 +140 +1.0 +102 +RTVSPost2010PropOp39 + 70 + 1 +102 +RTVSPost2010Prop40 + 90 + 0 +102 +RTVSPost2010PropOp40 + 70 + 1 +102 +RTVSPost2010Prop41ColorIndex + 90 + 18 +102 +RTVSPost2010Prop41ColorRGB + 90 + 0 +102 +RTVSPost2010PropOp41 + 70 + 1 +102 +RTVSPost2010Prop42 + 90 + 50 +102 +RTVSPost2010PropOp42 + 70 + 1 +102 +RTVSPost2010Prop43 + 90 + 3 +102 +RTVSPost2010PropOp43 + 70 + 1 +102 +RTVSPost2010Prop44ColorIndex + 90 + 5 +102 +RTVSPost2010Prop44ColorRGB + 90 + 255 +102 +RTVSPost2010PropOp44 + 70 + 1 +102 +RTVSPost2010Prop45 +280 + 0 +102 +RTVSPost2010PropOp45 + 70 + 1 +102 +RTVSPost2010Prop46 + 90 + 50 +102 +RTVSPost2010PropOp46 + 70 + 1 +102 +RTVSPost2010Prop47 + 90 + 50 +102 +RTVSPost2010PropOp47 + 70 + 1 +102 +RTVSPost2010Prop48 + 90 + 50 +102 +RTVSPost2010PropOp48 + 70 + 1 +102 +RTVSPost2010Prop49 +280 + 0 +102 +RTVSPost2010PropOp49 + 70 + 1 +102 +RTVSPost2010Prop50 + 90 + 50 +102 +RTVSPost2010PropOp50 + 70 + 1 +102 +RTVSPost2010Prop51ColorIndex + 90 + 256 +102 +RTVSPost2010Prop51ColorRGB + 90 +-16777216 +102 +RTVSPost2010PropOp51 + 70 + 0 +102 +RTVSPost2010Prop52 +140 +1.0 +102 +RTVSPost2010PropOp52 + 70 + 0 +102 +RTVSPost2010Prop53 + 90 + 2 +102 +RTVSPost2010PropOp53 + 70 + 1 +102 +RTVSPost2010Prop54 + 1 +strokes_ogs.tif +102 +RTVSPost2010PropOp54 + 70 + 1 +102 +RTVSPost2010Prop55 +280 + 0 +102 +RTVSPost2010PropOp55 + 70 + 1 +102 +RTVSPost2010Prop56 +140 +1.0 +102 +RTVSPost2010PropOp56 + 70 + 1 +102 +RTVSPost2010Prop57 +140 +1.0 +102 +RTVSPost2010PropOp57 + 70 + 1 +102 +RTVSPropertyOp0 + 70 + 1 +102 +RTVSPropertyOp1 + 70 + 1 +102 +RTVSPropertyOp2 + 70 + 1 +102 +RTVSPropertyOp3 + 70 + 1 +102 +RTVSPropertyOp4 + 70 + 1 +102 +RTVSPropertyOp5 + 70 + 1 +102 +RTVSPropertyOp6 + 70 + 1 +102 +RTVSPropertyOp7 + 70 + 1 +102 +RTVSPropertyOp8 + 70 + 1 +102 +RTVSPropertyOp9 + 70 + 1 +102 +RTVSPropertyOp10 + 70 + 1 +102 +RTVSPropertyOp11 + 70 + 1 +102 +RTVSPropertyOp12 + 70 + 1 +102 +RTVSPropertyOp13 + 70 + 1 +102 +RTVSPropertyOp14 + 70 + 1 +102 +RTVSPropertyOp15 + 70 + 1 +102 +RTVSPropertyOp16 + 70 + 1 +102 +RTVSPropertyOp17 + 70 + 1 +102 +RTVSPropertyOp18 + 70 + 1 +102 +RTVSPropertyOp19 + 70 + 1 +102 +RTVSPropertyOp20 + 70 + 1 +102 +RTVSPropertyOp21 + 70 + 1 +102 +RTVSPropertyOp22 + 70 + 1 +102 +RTVSPropertyOp23 + 70 + 1 +102 +RTVSPropertyOp24 + 70 + 1 +102 +RTVSPropertyOp25 + 70 + 1 +102 +RTVSPropertyOp26 + 70 + 1 +102 +RTVSPropertyOp27 + 70 + 1 +102 +RTVSPropertyOp28 + 70 + 1 +102 +RTVSPropertyOp29 + 70 + 1 +102 +RTVSPropertyOp30 + 70 + 1 +102 +RTVSPropertyOp31 + 70 + 1 +102 +RTVSPropertyOp32 + 70 + 1 +102 +RTVSPropertyOp33 + 70 + 1 +102 +RTVSPropertyOp34 + 70 + 1 +102 +RTVSPropertyOp35 + 70 + 1 +102 +RTVSPropertyOp36 + 70 + 1 +102 +RTVSPropertyOp37 + 70 + 1 +102 +RTVSPropertyOp38 + 70 + 1 +102 +RTVSPropertyOp39 + 70 + 1 +102 +RTVSPropertyOp40 + 70 + 1 +102 +RTVSPropertyOp41 + 70 + 1 +102 +RTVSPropertyOp42 + 70 + 1 +102 +RTVSPropertyOp43 + 70 + 1 +102 +RTVSPropertyOp44 + 70 + 1 +102 +RTVSPropertyOp45 + 70 + 1 +102 +RTVSPropertyOp46 + 70 + 1 +102 +RTVSPropertyOp47 + 70 + 1 +102 +RTVSPropertyOp48 + 70 + 1 +102 +RTVSPropertyOp49 + 70 + 1 +102 +RTVSPropertyOp50 + 70 + 1 +102 +RTVSPropertyOp51 + 70 + 0 +102 +RTVSPropertyOp52 + 70 + 0 +102 +RTVSPropertyOp53 + 70 + 1 +102 +RTVSPropertyOp54 + 70 + 1 +102 +RTVSPropertyOp55 + 70 + 1 +102 +RTVSPropertyOp56 + 70 + 1 +102 +RTVSPropertyOp57 + 70 + 1 +102 +RTVSPropertyOp58 + 70 + 1 +102 +RTVSPropertyOp59 + 70 + 1 +102 +RTVSPropertyOp60 + 70 + 1 +102 +RTVSPropertyOp61 + 70 + 1 +102 +RTVSPropertyOp62 + 70 + 1 + 0 +XRECORD + 5 +2BE +102 +{ACAD_REACTORS +330 +2BD +102 +} +330 +2BD +100 +AcDbXrecord +280 + 1 +102 +RTVSPost2010Prop28 +280 + 0 +102 +RTVSPost2010PropOp28 + 70 + 1 +102 +RTVSPost2010Prop29 +280 + 1 +102 +RTVSPost2010PropOp29 + 70 + 1 +102 +RTVSPost2010Prop30 +280 + 1 +102 +RTVSPost2010PropOp30 + 70 + 1 +102 +RTVSPost2010Prop31 +280 + 0 +102 +RTVSPost2010PropOp31 + 70 + 1 +102 +RTVSPost2010Prop32 +280 + 0 +102 +RTVSPost2010PropOp32 + 70 + 1 +102 +RTVSPost2010Prop33 +280 + 0 +102 +RTVSPost2010PropOp33 + 70 + 1 +102 +RTVSPost2010Prop34 +280 + 0 +102 +RTVSPost2010PropOp34 + 70 + 1 +102 +RTVSPost2010Prop35 +280 + 0 +102 +RTVSPost2010PropOp35 + 70 + 1 +102 +RTVSPost2010Prop36 +280 + 0 +102 +RTVSPost2010PropOp36 + 70 + 1 +102 +RTVSPost2010Prop37 + 90 + 50 +102 +RTVSPost2010PropOp37 + 70 + 1 +102 +RTVSPost2010Prop38 +140 +0.0 +102 +RTVSPost2010PropOp38 + 70 + 1 +102 +RTVSPost2010Prop39 +140 +1.0 +102 +RTVSPost2010PropOp39 + 70 + 1 +102 +RTVSPost2010Prop40 + 90 + 0 +102 +RTVSPost2010PropOp40 + 70 + 1 +102 +RTVSPost2010Prop41ColorIndex + 90 + 18 +102 +RTVSPost2010Prop41ColorRGB + 90 + 0 +102 +RTVSPost2010PropOp41 + 70 + 1 +102 +RTVSPost2010Prop42 + 90 + 50 +102 +RTVSPost2010PropOp42 + 70 + 1 +102 +RTVSPost2010Prop43 + 90 + 3 +102 +RTVSPost2010PropOp43 + 70 + 1 +102 +RTVSPost2010Prop44ColorIndex + 90 + 5 +102 +RTVSPost2010Prop44ColorRGB + 90 + 255 +102 +RTVSPost2010PropOp44 + 70 + 1 +102 +RTVSPost2010Prop45 +280 + 0 +102 +RTVSPost2010PropOp45 + 70 + 1 +102 +RTVSPost2010Prop46 + 90 + 50 +102 +RTVSPost2010PropOp46 + 70 + 1 +102 +RTVSPost2010Prop47 + 90 + 50 +102 +RTVSPost2010PropOp47 + 70 + 1 +102 +RTVSPost2010Prop48 + 90 + 50 +102 +RTVSPost2010PropOp48 + 70 + 1 +102 +RTVSPost2010Prop49 +280 + 0 +102 +RTVSPost2010PropOp49 + 70 + 1 +102 +RTVSPost2010Prop50 + 90 + 50 +102 +RTVSPost2010PropOp50 + 70 + 1 +102 +RTVSPost2010Prop51ColorIndex + 90 + 256 +102 +RTVSPost2010Prop51ColorRGB + 90 +-16777216 +102 +RTVSPost2010PropOp51 + 70 + 0 +102 +RTVSPost2010Prop52 +140 +1.0 +102 +RTVSPost2010PropOp52 + 70 + 0 +102 +RTVSPost2010Prop53 + 90 + 2 +102 +RTVSPost2010PropOp53 + 70 + 1 +102 +RTVSPost2010Prop54 + 1 +strokes_ogs.tif +102 +RTVSPost2010PropOp54 + 70 + 1 +102 +RTVSPost2010Prop55 +280 + 0 +102 +RTVSPost2010PropOp55 + 70 + 1 +102 +RTVSPost2010Prop56 +140 +1.0 +102 +RTVSPost2010PropOp56 + 70 + 1 +102 +RTVSPost2010Prop57 +140 +1.0 +102 +RTVSPost2010PropOp57 + 70 + 1 +102 +RTVSPropertyOp0 + 70 + 1 +102 +RTVSPropertyOp1 + 70 + 1 +102 +RTVSPropertyOp2 + 70 + 1 +102 +RTVSPropertyOp3 + 70 + 1 +102 +RTVSPropertyOp4 + 70 + 1 +102 +RTVSPropertyOp5 + 70 + 1 +102 +RTVSPropertyOp6 + 70 + 1 +102 +RTVSPropertyOp7 + 70 + 1 +102 +RTVSPropertyOp8 + 70 + 1 +102 +RTVSPropertyOp9 + 70 + 1 +102 +RTVSPropertyOp10 + 70 + 1 +102 +RTVSPropertyOp11 + 70 + 1 +102 +RTVSPropertyOp12 + 70 + 1 +102 +RTVSPropertyOp13 + 70 + 1 +102 +RTVSPropertyOp14 + 70 + 1 +102 +RTVSPropertyOp15 + 70 + 1 +102 +RTVSPropertyOp16 + 70 + 1 +102 +RTVSPropertyOp17 + 70 + 1 +102 +RTVSPropertyOp18 + 70 + 1 +102 +RTVSPropertyOp19 + 70 + 1 +102 +RTVSPropertyOp20 + 70 + 1 +102 +RTVSPropertyOp21 + 70 + 1 +102 +RTVSPropertyOp22 + 70 + 1 +102 +RTVSPropertyOp23 + 70 + 1 +102 +RTVSPropertyOp24 + 70 + 1 +102 +RTVSPropertyOp25 + 70 + 1 +102 +RTVSPropertyOp26 + 70 + 1 +102 +RTVSPropertyOp27 + 70 + 1 +102 +RTVSPropertyOp28 + 70 + 1 +102 +RTVSPropertyOp29 + 70 + 1 +102 +RTVSPropertyOp30 + 70 + 1 +102 +RTVSPropertyOp31 + 70 + 1 +102 +RTVSPropertyOp32 + 70 + 1 +102 +RTVSPropertyOp33 + 70 + 1 +102 +RTVSPropertyOp34 + 70 + 1 +102 +RTVSPropertyOp35 + 70 + 1 +102 +RTVSPropertyOp36 + 70 + 1 +102 +RTVSPropertyOp37 + 70 + 1 +102 +RTVSPropertyOp38 + 70 + 1 +102 +RTVSPropertyOp39 + 70 + 1 +102 +RTVSPropertyOp40 + 70 + 1 +102 +RTVSPropertyOp41 + 70 + 1 +102 +RTVSPropertyOp42 + 70 + 1 +102 +RTVSPropertyOp43 + 70 + 1 +102 +RTVSPropertyOp44 + 70 + 1 +102 +RTVSPropertyOp45 + 70 + 1 +102 +RTVSPropertyOp46 + 70 + 1 +102 +RTVSPropertyOp47 + 70 + 1 +102 +RTVSPropertyOp48 + 70 + 1 +102 +RTVSPropertyOp49 + 70 + 1 +102 +RTVSPropertyOp50 + 70 + 1 +102 +RTVSPropertyOp51 + 70 + 0 +102 +RTVSPropertyOp52 + 70 + 0 +102 +RTVSPropertyOp53 + 70 + 1 +102 +RTVSPropertyOp54 + 70 + 1 +102 +RTVSPropertyOp55 + 70 + 1 +102 +RTVSPropertyOp56 + 70 + 1 +102 +RTVSPropertyOp57 + 70 + 1 +102 +RTVSPropertyOp58 + 70 + 1 +102 +RTVSPropertyOp59 + 70 + 1 +102 +RTVSPropertyOp60 + 70 + 1 +102 +RTVSPropertyOp61 + 70 + 1 +102 +RTVSPropertyOp62 + 70 + 1 + 0 +XRECORD + 5 +2C6 +102 +{ACAD_REACTORS +330 +2C5 +102 +} +330 +2C5 +100 +AcDbXrecord +280 + 1 +102 +RTVSPost2010Prop28 +280 + 0 +102 +RTVSPost2010PropOp28 + 70 + 1 +102 +RTVSPost2010Prop29 +280 + 1 +102 +RTVSPost2010PropOp29 + 70 + 1 +102 +RTVSPost2010Prop30 +280 + 1 +102 +RTVSPost2010PropOp30 + 70 + 1 +102 +RTVSPost2010Prop31 +280 + 0 +102 +RTVSPost2010PropOp31 + 70 + 1 +102 +RTVSPost2010Prop32 +280 + 0 +102 +RTVSPost2010PropOp32 + 70 + 1 +102 +RTVSPost2010Prop33 +280 + 0 +102 +RTVSPost2010PropOp33 + 70 + 1 +102 +RTVSPost2010Prop34 +280 + 0 +102 +RTVSPost2010PropOp34 + 70 + 1 +102 +RTVSPost2010Prop35 +280 + 0 +102 +RTVSPost2010PropOp35 + 70 + 1 +102 +RTVSPost2010Prop36 +280 + 0 +102 +RTVSPost2010PropOp36 + 70 + 1 +102 +RTVSPost2010Prop37 + 90 + 50 +102 +RTVSPost2010PropOp37 + 70 + 1 +102 +RTVSPost2010Prop38 +140 +0.0 +102 +RTVSPost2010PropOp38 + 70 + 1 +102 +RTVSPost2010Prop39 +140 +1.0 +102 +RTVSPost2010PropOp39 + 70 + 1 +102 +RTVSPost2010Prop40 + 90 + 0 +102 +RTVSPost2010PropOp40 + 70 + 1 +102 +RTVSPost2010Prop41ColorIndex + 90 + 18 +102 +RTVSPost2010Prop41ColorRGB + 90 + 0 +102 +RTVSPost2010PropOp41 + 70 + 1 +102 +RTVSPost2010Prop42 + 90 + 50 +102 +RTVSPost2010PropOp42 + 70 + 1 +102 +RTVSPost2010Prop43 + 90 + 3 +102 +RTVSPost2010PropOp43 + 70 + 1 +102 +RTVSPost2010Prop44ColorIndex + 90 + 5 +102 +RTVSPost2010Prop44ColorRGB + 90 + 255 +102 +RTVSPost2010PropOp44 + 70 + 1 +102 +RTVSPost2010Prop45 +280 + 0 +102 +RTVSPost2010PropOp45 + 70 + 1 +102 +RTVSPost2010Prop46 + 90 + 50 +102 +RTVSPost2010PropOp46 + 70 + 1 +102 +RTVSPost2010Prop47 + 90 + 50 +102 +RTVSPost2010PropOp47 + 70 + 1 +102 +RTVSPost2010Prop48 + 90 + 50 +102 +RTVSPost2010PropOp48 + 70 + 1 +102 +RTVSPost2010Prop49 +280 + 0 +102 +RTVSPost2010PropOp49 + 70 + 1 +102 +RTVSPost2010Prop50 + 90 + 50 +102 +RTVSPost2010PropOp50 + 70 + 1 +102 +RTVSPost2010Prop51ColorIndex + 90 + 256 +102 +RTVSPost2010Prop51ColorRGB + 90 +-16777216 +102 +RTVSPost2010PropOp51 + 70 + 0 +102 +RTVSPost2010Prop52 +140 +1.0 +102 +RTVSPost2010PropOp52 + 70 + 0 +102 +RTVSPost2010Prop53 + 90 + 2 +102 +RTVSPost2010PropOp53 + 70 + 1 +102 +RTVSPost2010Prop54 + 1 +strokes_ogs.tif +102 +RTVSPost2010PropOp54 + 70 + 1 +102 +RTVSPost2010Prop55 +280 + 0 +102 +RTVSPost2010PropOp55 + 70 + 1 +102 +RTVSPost2010Prop56 +140 +1.0 +102 +RTVSPost2010PropOp56 + 70 + 1 +102 +RTVSPost2010Prop57 +140 +1.0 +102 +RTVSPost2010PropOp57 + 70 + 1 +102 +RTVSPropertyOp0 + 70 + 1 +102 +RTVSPropertyOp1 + 70 + 1 +102 +RTVSPropertyOp2 + 70 + 1 +102 +RTVSPropertyOp3 + 70 + 1 +102 +RTVSPropertyOp4 + 70 + 1 +102 +RTVSPropertyOp5 + 70 + 1 +102 +RTVSPropertyOp6 + 70 + 1 +102 +RTVSPropertyOp7 + 70 + 1 +102 +RTVSPropertyOp8 + 70 + 1 +102 +RTVSPropertyOp9 + 70 + 1 +102 +RTVSPropertyOp10 + 70 + 1 +102 +RTVSPropertyOp11 + 70 + 1 +102 +RTVSPropertyOp12 + 70 + 1 +102 +RTVSPropertyOp13 + 70 + 1 +102 +RTVSPropertyOp14 + 70 + 1 +102 +RTVSPropertyOp15 + 70 + 1 +102 +RTVSPropertyOp16 + 70 + 1 +102 +RTVSPropertyOp17 + 70 + 1 +102 +RTVSPropertyOp18 + 70 + 1 +102 +RTVSPropertyOp19 + 70 + 1 +102 +RTVSPropertyOp20 + 70 + 1 +102 +RTVSPropertyOp21 + 70 + 1 +102 +RTVSPropertyOp22 + 70 + 1 +102 +RTVSPropertyOp23 + 70 + 1 +102 +RTVSPropertyOp24 + 70 + 1 +102 +RTVSPropertyOp25 + 70 + 1 +102 +RTVSPropertyOp26 + 70 + 1 +102 +RTVSPropertyOp27 + 70 + 1 +102 +RTVSPropertyOp28 + 70 + 1 +102 +RTVSPropertyOp29 + 70 + 1 +102 +RTVSPropertyOp30 + 70 + 1 +102 +RTVSPropertyOp31 + 70 + 1 +102 +RTVSPropertyOp32 + 70 + 1 +102 +RTVSPropertyOp33 + 70 + 1 +102 +RTVSPropertyOp34 + 70 + 1 +102 +RTVSPropertyOp35 + 70 + 1 +102 +RTVSPropertyOp36 + 70 + 1 +102 +RTVSPropertyOp37 + 70 + 1 +102 +RTVSPropertyOp38 + 70 + 1 +102 +RTVSPropertyOp39 + 70 + 1 +102 +RTVSPropertyOp40 + 70 + 1 +102 +RTVSPropertyOp41 + 70 + 1 +102 +RTVSPropertyOp42 + 70 + 1 +102 +RTVSPropertyOp43 + 70 + 1 +102 +RTVSPropertyOp44 + 70 + 1 +102 +RTVSPropertyOp45 + 70 + 1 +102 +RTVSPropertyOp46 + 70 + 1 +102 +RTVSPropertyOp47 + 70 + 1 +102 +RTVSPropertyOp48 + 70 + 1 +102 +RTVSPropertyOp49 + 70 + 1 +102 +RTVSPropertyOp50 + 70 + 1 +102 +RTVSPropertyOp51 + 70 + 0 +102 +RTVSPropertyOp52 + 70 + 0 +102 +RTVSPropertyOp53 + 70 + 1 +102 +RTVSPropertyOp54 + 70 + 1 +102 +RTVSPropertyOp55 + 70 + 1 +102 +RTVSPropertyOp56 + 70 + 1 +102 +RTVSPropertyOp57 + 70 + 1 +102 +RTVSPropertyOp58 + 70 + 1 +102 +RTVSPropertyOp59 + 70 + 1 +102 +RTVSPropertyOp60 + 70 + 1 +102 +RTVSPropertyOp61 + 70 + 1 +102 +RTVSPropertyOp62 + 70 + 1 + 0 +XRECORD + 5 +2B4 +102 +{ACAD_REACTORS +330 +2B3 +102 +} +330 +2B3 +100 +AcDbXrecord +280 + 1 +102 +RTVSPost2010Prop28 +280 + 0 +102 +RTVSPost2010PropOp28 + 70 + 1 +102 +RTVSPost2010Prop29 +280 + 1 +102 +RTVSPost2010PropOp29 + 70 + 1 +102 +RTVSPost2010Prop30 +280 + 1 +102 +RTVSPost2010PropOp30 + 70 + 1 +102 +RTVSPost2010Prop31 +280 + 0 +102 +RTVSPost2010PropOp31 + 70 + 1 +102 +RTVSPost2010Prop32 +280 + 0 +102 +RTVSPost2010PropOp32 + 70 + 1 +102 +RTVSPost2010Prop33 +280 + 0 +102 +RTVSPost2010PropOp33 + 70 + 1 +102 +RTVSPost2010Prop34 +280 + 0 +102 +RTVSPost2010PropOp34 + 70 + 1 +102 +RTVSPost2010Prop35 +280 + 0 +102 +RTVSPost2010PropOp35 + 70 + 1 +102 +RTVSPost2010Prop36 +280 + 0 +102 +RTVSPost2010PropOp36 + 70 + 1 +102 +RTVSPost2010Prop37 + 90 + 50 +102 +RTVSPost2010PropOp37 + 70 + 1 +102 +RTVSPost2010Prop38 +140 +0.0 +102 +RTVSPost2010PropOp38 + 70 + 1 +102 +RTVSPost2010Prop39 +140 +1.0 +102 +RTVSPost2010PropOp39 + 70 + 1 +102 +RTVSPost2010Prop40 + 90 + 0 +102 +RTVSPost2010PropOp40 + 70 + 1 +102 +RTVSPost2010Prop41ColorIndex + 90 + 18 +102 +RTVSPost2010Prop41ColorRGB + 90 + 0 +102 +RTVSPost2010PropOp41 + 70 + 1 +102 +RTVSPost2010Prop42 + 90 + 50 +102 +RTVSPost2010PropOp42 + 70 + 1 +102 +RTVSPost2010Prop43 + 90 + 3 +102 +RTVSPost2010PropOp43 + 70 + 1 +102 +RTVSPost2010Prop44ColorIndex + 90 + 5 +102 +RTVSPost2010Prop44ColorRGB + 90 + 255 +102 +RTVSPost2010PropOp44 + 70 + 1 +102 +RTVSPost2010Prop45 +280 + 0 +102 +RTVSPost2010PropOp45 + 70 + 1 +102 +RTVSPost2010Prop46 + 90 + 50 +102 +RTVSPost2010PropOp46 + 70 + 1 +102 +RTVSPost2010Prop47 + 90 + 50 +102 +RTVSPost2010PropOp47 + 70 + 1 +102 +RTVSPost2010Prop48 + 90 + 50 +102 +RTVSPost2010PropOp48 + 70 + 1 +102 +RTVSPost2010Prop49 +280 + 0 +102 +RTVSPost2010PropOp49 + 70 + 1 +102 +RTVSPost2010Prop50 + 90 + 50 +102 +RTVSPost2010PropOp50 + 70 + 1 +102 +RTVSPost2010Prop51ColorIndex + 90 + 256 +102 +RTVSPost2010Prop51ColorRGB + 90 +-16777216 +102 +RTVSPost2010PropOp51 + 70 + 0 +102 +RTVSPost2010Prop52 +140 +1.0 +102 +RTVSPost2010PropOp52 + 70 + 0 +102 +RTVSPost2010Prop53 + 90 + 2 +102 +RTVSPost2010PropOp53 + 70 + 1 +102 +RTVSPost2010Prop54 + 1 +strokes_ogs.tif +102 +RTVSPost2010PropOp54 + 70 + 1 +102 +RTVSPost2010Prop55 +280 + 0 +102 +RTVSPost2010PropOp55 + 70 + 1 +102 +RTVSPost2010Prop56 +140 +1.0 +102 +RTVSPost2010PropOp56 + 70 + 1 +102 +RTVSPost2010Prop57 +140 +1.0 +102 +RTVSPost2010PropOp57 + 70 + 1 +102 +RTVSPropertyOp0 + 70 + 1 +102 +RTVSPropertyOp1 + 70 + 1 +102 +RTVSPropertyOp2 + 70 + 1 +102 +RTVSPropertyOp3 + 70 + 1 +102 +RTVSPropertyOp4 + 70 + 1 +102 +RTVSPropertyOp5 + 70 + 1 +102 +RTVSPropertyOp6 + 70 + 1 +102 +RTVSPropertyOp7 + 70 + 1 +102 +RTVSPropertyOp8 + 70 + 1 +102 +RTVSPropertyOp9 + 70 + 1 +102 +RTVSPropertyOp10 + 70 + 1 +102 +RTVSPropertyOp11 + 70 + 1 +102 +RTVSPropertyOp12 + 70 + 1 +102 +RTVSPropertyOp13 + 70 + 1 +102 +RTVSPropertyOp14 + 70 + 1 +102 +RTVSPropertyOp15 + 70 + 1 +102 +RTVSPropertyOp16 + 70 + 1 +102 +RTVSPropertyOp17 + 70 + 1 +102 +RTVSPropertyOp18 + 70 + 1 +102 +RTVSPropertyOp19 + 70 + 1 +102 +RTVSPropertyOp20 + 70 + 1 +102 +RTVSPropertyOp21 + 70 + 1 +102 +RTVSPropertyOp22 + 70 + 1 +102 +RTVSPropertyOp23 + 70 + 1 +102 +RTVSPropertyOp24 + 70 + 1 +102 +RTVSPropertyOp25 + 70 + 1 +102 +RTVSPropertyOp26 + 70 + 1 +102 +RTVSPropertyOp27 + 70 + 1 +102 +RTVSPropertyOp28 + 70 + 1 +102 +RTVSPropertyOp29 + 70 + 1 +102 +RTVSPropertyOp30 + 70 + 1 +102 +RTVSPropertyOp31 + 70 + 1 +102 +RTVSPropertyOp32 + 70 + 1 +102 +RTVSPropertyOp33 + 70 + 1 +102 +RTVSPropertyOp34 + 70 + 1 +102 +RTVSPropertyOp35 + 70 + 1 +102 +RTVSPropertyOp36 + 70 + 1 +102 +RTVSPropertyOp37 + 70 + 1 +102 +RTVSPropertyOp38 + 70 + 1 +102 +RTVSPropertyOp39 + 70 + 1 +102 +RTVSPropertyOp40 + 70 + 1 +102 +RTVSPropertyOp41 + 70 + 1 +102 +RTVSPropertyOp42 + 70 + 1 +102 +RTVSPropertyOp43 + 70 + 1 +102 +RTVSPropertyOp44 + 70 + 1 +102 +RTVSPropertyOp45 + 70 + 1 +102 +RTVSPropertyOp46 + 70 + 1 +102 +RTVSPropertyOp47 + 70 + 1 +102 +RTVSPropertyOp48 + 70 + 1 +102 +RTVSPropertyOp49 + 70 + 1 +102 +RTVSPropertyOp50 + 70 + 1 +102 +RTVSPropertyOp51 + 70 + 0 +102 +RTVSPropertyOp52 + 70 + 0 +102 +RTVSPropertyOp53 + 70 + 1 +102 +RTVSPropertyOp54 + 70 + 1 +102 +RTVSPropertyOp55 + 70 + 1 +102 +RTVSPropertyOp56 + 70 + 1 +102 +RTVSPropertyOp57 + 70 + 1 +102 +RTVSPropertyOp58 + 70 + 1 +102 +RTVSPropertyOp59 + 70 + 1 +102 +RTVSPropertyOp60 + 70 + 1 +102 +RTVSPropertyOp61 + 70 + 1 +102 +RTVSPropertyOp62 + 70 + 1 + 0 +XRECORD + 5 +2D2 +102 +{ACAD_REACTORS +330 +2D1 +102 +} +330 +2D1 +100 +AcDbXrecord +280 + 1 +102 +RTVSPost2010Prop28 +280 + 0 +102 +RTVSPost2010PropOp28 + 70 + 1 +102 +RTVSPost2010Prop29 +280 + 1 +102 +RTVSPost2010PropOp29 + 70 + 1 +102 +RTVSPost2010Prop30 +280 + 1 +102 +RTVSPost2010PropOp30 + 70 + 1 +102 +RTVSPost2010Prop31 +280 + 0 +102 +RTVSPost2010PropOp31 + 70 + 1 +102 +RTVSPost2010Prop32 +280 + 0 +102 +RTVSPost2010PropOp32 + 70 + 1 +102 +RTVSPost2010Prop33 +280 + 0 +102 +RTVSPost2010PropOp33 + 70 + 1 +102 +RTVSPost2010Prop34 +280 + 0 +102 +RTVSPost2010PropOp34 + 70 + 1 +102 +RTVSPost2010Prop35 +280 + 0 +102 +RTVSPost2010PropOp35 + 70 + 1 +102 +RTVSPost2010Prop36 +280 + 0 +102 +RTVSPost2010PropOp36 + 70 + 1 +102 +RTVSPost2010Prop37 + 90 + 50 +102 +RTVSPost2010PropOp37 + 70 + 1 +102 +RTVSPost2010Prop38 +140 +0.0 +102 +RTVSPost2010PropOp38 + 70 + 1 +102 +RTVSPost2010Prop39 +140 +1.0 +102 +RTVSPost2010PropOp39 + 70 + 1 +102 +RTVSPost2010Prop40 + 90 + 0 +102 +RTVSPost2010PropOp40 + 70 + 1 +102 +RTVSPost2010Prop41ColorIndex + 90 + 18 +102 +RTVSPost2010Prop41ColorRGB + 90 + 0 +102 +RTVSPost2010PropOp41 + 70 + 1 +102 +RTVSPost2010Prop42 + 90 + 50 +102 +RTVSPost2010PropOp42 + 70 + 1 +102 +RTVSPost2010Prop43 + 90 + 3 +102 +RTVSPost2010PropOp43 + 70 + 1 +102 +RTVSPost2010Prop44ColorIndex + 90 + 5 +102 +RTVSPost2010Prop44ColorRGB + 90 + 255 +102 +RTVSPost2010PropOp44 + 70 + 1 +102 +RTVSPost2010Prop45 +280 + 0 +102 +RTVSPost2010PropOp45 + 70 + 1 +102 +RTVSPost2010Prop46 + 90 + 50 +102 +RTVSPost2010PropOp46 + 70 + 1 +102 +RTVSPost2010Prop47 + 90 + 50 +102 +RTVSPost2010PropOp47 + 70 + 1 +102 +RTVSPost2010Prop48 + 90 + 50 +102 +RTVSPost2010PropOp48 + 70 + 1 +102 +RTVSPost2010Prop49 +280 + 0 +102 +RTVSPost2010PropOp49 + 70 + 1 +102 +RTVSPost2010Prop50 + 90 + 50 +102 +RTVSPost2010PropOp50 + 70 + 1 +102 +RTVSPost2010Prop51ColorIndex + 90 + 256 +102 +RTVSPost2010Prop51ColorRGB + 90 +-16777216 +102 +RTVSPost2010PropOp51 + 70 + 0 +102 +RTVSPost2010Prop52 +140 +1.0 +102 +RTVSPost2010PropOp52 + 70 + 0 +102 +RTVSPost2010Prop53 + 90 + 2 +102 +RTVSPost2010PropOp53 + 70 + 1 +102 +RTVSPost2010Prop54 + 1 +strokes_ogs.tif +102 +RTVSPost2010PropOp54 + 70 + 1 +102 +RTVSPost2010Prop55 +280 + 0 +102 +RTVSPost2010PropOp55 + 70 + 1 +102 +RTVSPost2010Prop56 +140 +1.0 +102 +RTVSPost2010PropOp56 + 70 + 1 +102 +RTVSPost2010Prop57 +140 +1.0 +102 +RTVSPost2010PropOp57 + 70 + 1 +102 +RTVSPropertyOp0 + 70 + 1 +102 +RTVSPropertyOp1 + 70 + 1 +102 +RTVSPropertyOp2 + 70 + 1 +102 +RTVSPropertyOp3 + 70 + 1 +102 +RTVSPropertyOp4 + 70 + 1 +102 +RTVSPropertyOp5 + 70 + 1 +102 +RTVSPropertyOp6 + 70 + 1 +102 +RTVSPropertyOp7 + 70 + 1 +102 +RTVSPropertyOp8 + 70 + 1 +102 +RTVSPropertyOp9 + 70 + 1 +102 +RTVSPropertyOp10 + 70 + 1 +102 +RTVSPropertyOp11 + 70 + 1 +102 +RTVSPropertyOp12 + 70 + 1 +102 +RTVSPropertyOp13 + 70 + 1 +102 +RTVSPropertyOp14 + 70 + 1 +102 +RTVSPropertyOp15 + 70 + 1 +102 +RTVSPropertyOp16 + 70 + 1 +102 +RTVSPropertyOp17 + 70 + 1 +102 +RTVSPropertyOp18 + 70 + 1 +102 +RTVSPropertyOp19 + 70 + 1 +102 +RTVSPropertyOp20 + 70 + 1 +102 +RTVSPropertyOp21 + 70 + 1 +102 +RTVSPropertyOp22 + 70 + 1 +102 +RTVSPropertyOp23 + 70 + 1 +102 +RTVSPropertyOp24 + 70 + 1 +102 +RTVSPropertyOp25 + 70 + 1 +102 +RTVSPropertyOp26 + 70 + 1 +102 +RTVSPropertyOp27 + 70 + 1 +102 +RTVSPropertyOp28 + 70 + 1 +102 +RTVSPropertyOp29 + 70 + 1 +102 +RTVSPropertyOp30 + 70 + 1 +102 +RTVSPropertyOp31 + 70 + 1 +102 +RTVSPropertyOp32 + 70 + 1 +102 +RTVSPropertyOp33 + 70 + 1 +102 +RTVSPropertyOp34 + 70 + 1 +102 +RTVSPropertyOp35 + 70 + 1 +102 +RTVSPropertyOp36 + 70 + 1 +102 +RTVSPropertyOp37 + 70 + 1 +102 +RTVSPropertyOp38 + 70 + 1 +102 +RTVSPropertyOp39 + 70 + 1 +102 +RTVSPropertyOp40 + 70 + 1 +102 +RTVSPropertyOp41 + 70 + 1 +102 +RTVSPropertyOp42 + 70 + 1 +102 +RTVSPropertyOp43 + 70 + 1 +102 +RTVSPropertyOp44 + 70 + 1 +102 +RTVSPropertyOp45 + 70 + 1 +102 +RTVSPropertyOp46 + 70 + 1 +102 +RTVSPropertyOp47 + 70 + 1 +102 +RTVSPropertyOp48 + 70 + 1 +102 +RTVSPropertyOp49 + 70 + 1 +102 +RTVSPropertyOp50 + 70 + 1 +102 +RTVSPropertyOp51 + 70 + 0 +102 +RTVSPropertyOp52 + 70 + 0 +102 +RTVSPropertyOp53 + 70 + 1 +102 +RTVSPropertyOp54 + 70 + 1 +102 +RTVSPropertyOp55 + 70 + 1 +102 +RTVSPropertyOp56 + 70 + 1 +102 +RTVSPropertyOp57 + 70 + 1 +102 +RTVSPropertyOp58 + 70 + 1 +102 +RTVSPropertyOp59 + 70 + 1 +102 +RTVSPropertyOp60 + 70 + 1 +102 +RTVSPropertyOp61 + 70 + 1 +102 +RTVSPropertyOp62 + 70 + 1 + 0 +XRECORD + 5 +2D0 +102 +{ACAD_REACTORS +330 +2CF +102 +} +330 +2CF +100 +AcDbXrecord +280 + 1 +102 +RTVSPost2010Prop28 +280 + 0 +102 +RTVSPost2010PropOp28 + 70 + 1 +102 +RTVSPost2010Prop29 +280 + 1 +102 +RTVSPost2010PropOp29 + 70 + 1 +102 +RTVSPost2010Prop30 +280 + 1 +102 +RTVSPost2010PropOp30 + 70 + 1 +102 +RTVSPost2010Prop31 +280 + 0 +102 +RTVSPost2010PropOp31 + 70 + 1 +102 +RTVSPost2010Prop32 +280 + 0 +102 +RTVSPost2010PropOp32 + 70 + 1 +102 +RTVSPost2010Prop33 +280 + 0 +102 +RTVSPost2010PropOp33 + 70 + 1 +102 +RTVSPost2010Prop34 +280 + 0 +102 +RTVSPost2010PropOp34 + 70 + 1 +102 +RTVSPost2010Prop35 +280 + 0 +102 +RTVSPost2010PropOp35 + 70 + 1 +102 +RTVSPost2010Prop36 +280 + 0 +102 +RTVSPost2010PropOp36 + 70 + 1 +102 +RTVSPost2010Prop37 + 90 + 50 +102 +RTVSPost2010PropOp37 + 70 + 1 +102 +RTVSPost2010Prop38 +140 +0.0 +102 +RTVSPost2010PropOp38 + 70 + 1 +102 +RTVSPost2010Prop39 +140 +1.0 +102 +RTVSPost2010PropOp39 + 70 + 1 +102 +RTVSPost2010Prop40 + 90 + 0 +102 +RTVSPost2010PropOp40 + 70 + 1 +102 +RTVSPost2010Prop41ColorIndex + 90 + 18 +102 +RTVSPost2010Prop41ColorRGB + 90 + 0 +102 +RTVSPost2010PropOp41 + 70 + 1 +102 +RTVSPost2010Prop42 + 90 + 50 +102 +RTVSPost2010PropOp42 + 70 + 1 +102 +RTVSPost2010Prop43 + 90 + 3 +102 +RTVSPost2010PropOp43 + 70 + 1 +102 +RTVSPost2010Prop44ColorIndex + 90 + 5 +102 +RTVSPost2010Prop44ColorRGB + 90 + 255 +102 +RTVSPost2010PropOp44 + 70 + 1 +102 +RTVSPost2010Prop45 +280 + 0 +102 +RTVSPost2010PropOp45 + 70 + 1 +102 +RTVSPost2010Prop46 + 90 + 50 +102 +RTVSPost2010PropOp46 + 70 + 1 +102 +RTVSPost2010Prop47 + 90 + 50 +102 +RTVSPost2010PropOp47 + 70 + 1 +102 +RTVSPost2010Prop48 + 90 + 50 +102 +RTVSPost2010PropOp48 + 70 + 1 +102 +RTVSPost2010Prop49 +280 + 0 +102 +RTVSPost2010PropOp49 + 70 + 1 +102 +RTVSPost2010Prop50 + 90 + 50 +102 +RTVSPost2010PropOp50 + 70 + 1 +102 +RTVSPost2010Prop51ColorIndex + 90 + 256 +102 +RTVSPost2010Prop51ColorRGB + 90 +-16777216 +102 +RTVSPost2010PropOp51 + 70 + 0 +102 +RTVSPost2010Prop52 +140 +1.0 +102 +RTVSPost2010PropOp52 + 70 + 0 +102 +RTVSPost2010Prop53 + 90 + 2 +102 +RTVSPost2010PropOp53 + 70 + 1 +102 +RTVSPost2010Prop54 + 1 +strokes_ogs.tif +102 +RTVSPost2010PropOp54 + 70 + 1 +102 +RTVSPost2010Prop55 +280 + 0 +102 +RTVSPost2010PropOp55 + 70 + 1 +102 +RTVSPost2010Prop56 +140 +1.0 +102 +RTVSPost2010PropOp56 + 70 + 1 +102 +RTVSPost2010Prop57 +140 +1.0 +102 +RTVSPost2010PropOp57 + 70 + 1 +102 +RTVSPropertyOp0 + 70 + 1 +102 +RTVSPropertyOp1 + 70 + 1 +102 +RTVSPropertyOp2 + 70 + 1 +102 +RTVSPropertyOp3 + 70 + 1 +102 +RTVSPropertyOp4 + 70 + 1 +102 +RTVSPropertyOp5 + 70 + 1 +102 +RTVSPropertyOp6 + 70 + 1 +102 +RTVSPropertyOp7 + 70 + 1 +102 +RTVSPropertyOp8 + 70 + 1 +102 +RTVSPropertyOp9 + 70 + 1 +102 +RTVSPropertyOp10 + 70 + 1 +102 +RTVSPropertyOp11 + 70 + 1 +102 +RTVSPropertyOp12 + 70 + 1 +102 +RTVSPropertyOp13 + 70 + 1 +102 +RTVSPropertyOp14 + 70 + 1 +102 +RTVSPropertyOp15 + 70 + 1 +102 +RTVSPropertyOp16 + 70 + 1 +102 +RTVSPropertyOp17 + 70 + 1 +102 +RTVSPropertyOp18 + 70 + 1 +102 +RTVSPropertyOp19 + 70 + 1 +102 +RTVSPropertyOp20 + 70 + 1 +102 +RTVSPropertyOp21 + 70 + 1 +102 +RTVSPropertyOp22 + 70 + 1 +102 +RTVSPropertyOp23 + 70 + 1 +102 +RTVSPropertyOp24 + 70 + 1 +102 +RTVSPropertyOp25 + 70 + 1 +102 +RTVSPropertyOp26 + 70 + 1 +102 +RTVSPropertyOp27 + 70 + 1 +102 +RTVSPropertyOp28 + 70 + 1 +102 +RTVSPropertyOp29 + 70 + 1 +102 +RTVSPropertyOp30 + 70 + 1 +102 +RTVSPropertyOp31 + 70 + 1 +102 +RTVSPropertyOp32 + 70 + 1 +102 +RTVSPropertyOp33 + 70 + 1 +102 +RTVSPropertyOp34 + 70 + 1 +102 +RTVSPropertyOp35 + 70 + 1 +102 +RTVSPropertyOp36 + 70 + 1 +102 +RTVSPropertyOp37 + 70 + 1 +102 +RTVSPropertyOp38 + 70 + 1 +102 +RTVSPropertyOp39 + 70 + 1 +102 +RTVSPropertyOp40 + 70 + 1 +102 +RTVSPropertyOp41 + 70 + 1 +102 +RTVSPropertyOp42 + 70 + 1 +102 +RTVSPropertyOp43 + 70 + 1 +102 +RTVSPropertyOp44 + 70 + 1 +102 +RTVSPropertyOp45 + 70 + 1 +102 +RTVSPropertyOp46 + 70 + 1 +102 +RTVSPropertyOp47 + 70 + 1 +102 +RTVSPropertyOp48 + 70 + 1 +102 +RTVSPropertyOp49 + 70 + 1 +102 +RTVSPropertyOp50 + 70 + 1 +102 +RTVSPropertyOp51 + 70 + 0 +102 +RTVSPropertyOp52 + 70 + 0 +102 +RTVSPropertyOp53 + 70 + 1 +102 +RTVSPropertyOp54 + 70 + 1 +102 +RTVSPropertyOp55 + 70 + 1 +102 +RTVSPropertyOp56 + 70 + 1 +102 +RTVSPropertyOp57 + 70 + 1 +102 +RTVSPropertyOp58 + 70 + 1 +102 +RTVSPropertyOp59 + 70 + 1 +102 +RTVSPropertyOp60 + 70 + 1 +102 +RTVSPropertyOp61 + 70 + 1 +102 +RTVSPropertyOp62 + 70 + 1 + 0 +XRECORD + 5 +2CA +102 +{ACAD_REACTORS +330 +2C9 +102 +} +330 +2C9 +100 +AcDbXrecord +280 + 1 +102 +RTVSPost2010Prop28 +280 + 0 +102 +RTVSPost2010PropOp28 + 70 + 1 +102 +RTVSPost2010Prop29 +280 + 1 +102 +RTVSPost2010PropOp29 + 70 + 1 +102 +RTVSPost2010Prop30 +280 + 1 +102 +RTVSPost2010PropOp30 + 70 + 1 +102 +RTVSPost2010Prop31 +280 + 0 +102 +RTVSPost2010PropOp31 + 70 + 1 +102 +RTVSPost2010Prop32 +280 + 0 +102 +RTVSPost2010PropOp32 + 70 + 1 +102 +RTVSPost2010Prop33 +280 + 0 +102 +RTVSPost2010PropOp33 + 70 + 1 +102 +RTVSPost2010Prop34 +280 + 0 +102 +RTVSPost2010PropOp34 + 70 + 1 +102 +RTVSPost2010Prop35 +280 + 0 +102 +RTVSPost2010PropOp35 + 70 + 1 +102 +RTVSPost2010Prop36 +280 + 0 +102 +RTVSPost2010PropOp36 + 70 + 1 +102 +RTVSPost2010Prop37 + 90 + 50 +102 +RTVSPost2010PropOp37 + 70 + 1 +102 +RTVSPost2010Prop38 +140 +0.0 +102 +RTVSPost2010PropOp38 + 70 + 1 +102 +RTVSPost2010Prop39 +140 +1.0 +102 +RTVSPost2010PropOp39 + 70 + 1 +102 +RTVSPost2010Prop40 + 90 + 0 +102 +RTVSPost2010PropOp40 + 70 + 1 +102 +RTVSPost2010Prop41ColorIndex + 90 + 18 +102 +RTVSPost2010Prop41ColorRGB + 90 + 0 +102 +RTVSPost2010PropOp41 + 70 + 1 +102 +RTVSPost2010Prop42 + 90 + 50 +102 +RTVSPost2010PropOp42 + 70 + 1 +102 +RTVSPost2010Prop43 + 90 + 3 +102 +RTVSPost2010PropOp43 + 70 + 1 +102 +RTVSPost2010Prop44ColorIndex + 90 + 5 +102 +RTVSPost2010Prop44ColorRGB + 90 + 255 +102 +RTVSPost2010PropOp44 + 70 + 1 +102 +RTVSPost2010Prop45 +280 + 0 +102 +RTVSPost2010PropOp45 + 70 + 1 +102 +RTVSPost2010Prop46 + 90 + 50 +102 +RTVSPost2010PropOp46 + 70 + 1 +102 +RTVSPost2010Prop47 + 90 + 50 +102 +RTVSPost2010PropOp47 + 70 + 1 +102 +RTVSPost2010Prop48 + 90 + 50 +102 +RTVSPost2010PropOp48 + 70 + 1 +102 +RTVSPost2010Prop49 +280 + 0 +102 +RTVSPost2010PropOp49 + 70 + 1 +102 +RTVSPost2010Prop50 + 90 + 50 +102 +RTVSPost2010PropOp50 + 70 + 1 +102 +RTVSPost2010Prop51ColorIndex + 90 + 256 +102 +RTVSPost2010Prop51ColorRGB + 90 +-16777216 +102 +RTVSPost2010PropOp51 + 70 + 0 +102 +RTVSPost2010Prop52 +140 +1.0 +102 +RTVSPost2010PropOp52 + 70 + 0 +102 +RTVSPost2010Prop53 + 90 + 2 +102 +RTVSPost2010PropOp53 + 70 + 1 +102 +RTVSPost2010Prop54 + 1 +strokes_ogs.tif +102 +RTVSPost2010PropOp54 + 70 + 1 +102 +RTVSPost2010Prop55 +280 + 0 +102 +RTVSPost2010PropOp55 + 70 + 1 +102 +RTVSPost2010Prop56 +140 +1.0 +102 +RTVSPost2010PropOp56 + 70 + 1 +102 +RTVSPost2010Prop57 +140 +1.0 +102 +RTVSPost2010PropOp57 + 70 + 1 +102 +RTVSPropertyOp0 + 70 + 1 +102 +RTVSPropertyOp1 + 70 + 1 +102 +RTVSPropertyOp2 + 70 + 1 +102 +RTVSPropertyOp3 + 70 + 1 +102 +RTVSPropertyOp4 + 70 + 1 +102 +RTVSPropertyOp5 + 70 + 1 +102 +RTVSPropertyOp6 + 70 + 1 +102 +RTVSPropertyOp7 + 70 + 1 +102 +RTVSPropertyOp8 + 70 + 1 +102 +RTVSPropertyOp9 + 70 + 1 +102 +RTVSPropertyOp10 + 70 + 1 +102 +RTVSPropertyOp11 + 70 + 1 +102 +RTVSPropertyOp12 + 70 + 1 +102 +RTVSPropertyOp13 + 70 + 1 +102 +RTVSPropertyOp14 + 70 + 1 +102 +RTVSPropertyOp15 + 70 + 1 +102 +RTVSPropertyOp16 + 70 + 1 +102 +RTVSPropertyOp17 + 70 + 1 +102 +RTVSPropertyOp18 + 70 + 1 +102 +RTVSPropertyOp19 + 70 + 1 +102 +RTVSPropertyOp20 + 70 + 1 +102 +RTVSPropertyOp21 + 70 + 1 +102 +RTVSPropertyOp22 + 70 + 1 +102 +RTVSPropertyOp23 + 70 + 1 +102 +RTVSPropertyOp24 + 70 + 1 +102 +RTVSPropertyOp25 + 70 + 1 +102 +RTVSPropertyOp26 + 70 + 1 +102 +RTVSPropertyOp27 + 70 + 1 +102 +RTVSPropertyOp28 + 70 + 1 +102 +RTVSPropertyOp29 + 70 + 1 +102 +RTVSPropertyOp30 + 70 + 1 +102 +RTVSPropertyOp31 + 70 + 1 +102 +RTVSPropertyOp32 + 70 + 1 +102 +RTVSPropertyOp33 + 70 + 1 +102 +RTVSPropertyOp34 + 70 + 1 +102 +RTVSPropertyOp35 + 70 + 1 +102 +RTVSPropertyOp36 + 70 + 1 +102 +RTVSPropertyOp37 + 70 + 1 +102 +RTVSPropertyOp38 + 70 + 1 +102 +RTVSPropertyOp39 + 70 + 1 +102 +RTVSPropertyOp40 + 70 + 1 +102 +RTVSPropertyOp41 + 70 + 1 +102 +RTVSPropertyOp42 + 70 + 1 +102 +RTVSPropertyOp43 + 70 + 1 +102 +RTVSPropertyOp44 + 70 + 1 +102 +RTVSPropertyOp45 + 70 + 1 +102 +RTVSPropertyOp46 + 70 + 1 +102 +RTVSPropertyOp47 + 70 + 1 +102 +RTVSPropertyOp48 + 70 + 1 +102 +RTVSPropertyOp49 + 70 + 1 +102 +RTVSPropertyOp50 + 70 + 1 +102 +RTVSPropertyOp51 + 70 + 0 +102 +RTVSPropertyOp52 + 70 + 0 +102 +RTVSPropertyOp53 + 70 + 1 +102 +RTVSPropertyOp54 + 70 + 1 +102 +RTVSPropertyOp55 + 70 + 1 +102 +RTVSPropertyOp56 + 70 + 1 +102 +RTVSPropertyOp57 + 70 + 1 +102 +RTVSPropertyOp58 + 70 + 1 +102 +RTVSPropertyOp59 + 70 + 1 +102 +RTVSPropertyOp60 + 70 + 1 +102 +RTVSPropertyOp61 + 70 + 1 +102 +RTVSPropertyOp62 + 70 + 1 + 0 +XRECORD + 5 +2CC +102 +{ACAD_REACTORS +330 +2CB +102 +} +330 +2CB +100 +AcDbXrecord +280 + 1 +102 +RTVSPost2010Prop28 +280 + 0 +102 +RTVSPost2010PropOp28 + 70 + 1 +102 +RTVSPost2010Prop29 +280 + 1 +102 +RTVSPost2010PropOp29 + 70 + 1 +102 +RTVSPost2010Prop30 +280 + 1 +102 +RTVSPost2010PropOp30 + 70 + 1 +102 +RTVSPost2010Prop31 +280 + 0 +102 +RTVSPost2010PropOp31 + 70 + 1 +102 +RTVSPost2010Prop32 +280 + 0 +102 +RTVSPost2010PropOp32 + 70 + 1 +102 +RTVSPost2010Prop33 +280 + 0 +102 +RTVSPost2010PropOp33 + 70 + 1 +102 +RTVSPost2010Prop34 +280 + 0 +102 +RTVSPost2010PropOp34 + 70 + 1 +102 +RTVSPost2010Prop35 +280 + 0 +102 +RTVSPost2010PropOp35 + 70 + 1 +102 +RTVSPost2010Prop36 +280 + 0 +102 +RTVSPost2010PropOp36 + 70 + 1 +102 +RTVSPost2010Prop37 + 90 + 50 +102 +RTVSPost2010PropOp37 + 70 + 1 +102 +RTVSPost2010Prop38 +140 +0.0 +102 +RTVSPost2010PropOp38 + 70 + 1 +102 +RTVSPost2010Prop39 +140 +1.0 +102 +RTVSPost2010PropOp39 + 70 + 1 +102 +RTVSPost2010Prop40 + 90 + 0 +102 +RTVSPost2010PropOp40 + 70 + 1 +102 +RTVSPost2010Prop41ColorIndex + 90 + 18 +102 +RTVSPost2010Prop41ColorRGB + 90 + 0 +102 +RTVSPost2010PropOp41 + 70 + 1 +102 +RTVSPost2010Prop42 + 90 + 50 +102 +RTVSPost2010PropOp42 + 70 + 1 +102 +RTVSPost2010Prop43 + 90 + 3 +102 +RTVSPost2010PropOp43 + 70 + 1 +102 +RTVSPost2010Prop44ColorIndex + 90 + 5 +102 +RTVSPost2010Prop44ColorRGB + 90 + 255 +102 +RTVSPost2010PropOp44 + 70 + 1 +102 +RTVSPost2010Prop45 +280 + 0 +102 +RTVSPost2010PropOp45 + 70 + 1 +102 +RTVSPost2010Prop46 + 90 + 50 +102 +RTVSPost2010PropOp46 + 70 + 1 +102 +RTVSPost2010Prop47 + 90 + 50 +102 +RTVSPost2010PropOp47 + 70 + 1 +102 +RTVSPost2010Prop48 + 90 + 50 +102 +RTVSPost2010PropOp48 + 70 + 1 +102 +RTVSPost2010Prop49 +280 + 0 +102 +RTVSPost2010PropOp49 + 70 + 1 +102 +RTVSPost2010Prop50 + 90 + 50 +102 +RTVSPost2010PropOp50 + 70 + 1 +102 +RTVSPost2010Prop51ColorIndex + 90 + 256 +102 +RTVSPost2010Prop51ColorRGB + 90 +-16777216 +102 +RTVSPost2010PropOp51 + 70 + 0 +102 +RTVSPost2010Prop52 +140 +1.0 +102 +RTVSPost2010PropOp52 + 70 + 0 +102 +RTVSPost2010Prop53 + 90 + 2 +102 +RTVSPost2010PropOp53 + 70 + 1 +102 +RTVSPost2010Prop54 + 1 +strokes_ogs.tif +102 +RTVSPost2010PropOp54 + 70 + 1 +102 +RTVSPost2010Prop55 +280 + 0 +102 +RTVSPost2010PropOp55 + 70 + 1 +102 +RTVSPost2010Prop56 +140 +1.0 +102 +RTVSPost2010PropOp56 + 70 + 1 +102 +RTVSPost2010Prop57 +140 +1.0 +102 +RTVSPost2010PropOp57 + 70 + 1 +102 +RTVSPropertyOp0 + 70 + 1 +102 +RTVSPropertyOp1 + 70 + 1 +102 +RTVSPropertyOp2 + 70 + 1 +102 +RTVSPropertyOp3 + 70 + 1 +102 +RTVSPropertyOp4 + 70 + 1 +102 +RTVSPropertyOp5 + 70 + 1 +102 +RTVSPropertyOp6 + 70 + 1 +102 +RTVSPropertyOp7 + 70 + 1 +102 +RTVSPropertyOp8 + 70 + 1 +102 +RTVSPropertyOp9 + 70 + 1 +102 +RTVSPropertyOp10 + 70 + 1 +102 +RTVSPropertyOp11 + 70 + 1 +102 +RTVSPropertyOp12 + 70 + 1 +102 +RTVSPropertyOp13 + 70 + 1 +102 +RTVSPropertyOp14 + 70 + 1 +102 +RTVSPropertyOp15 + 70 + 1 +102 +RTVSPropertyOp16 + 70 + 1 +102 +RTVSPropertyOp17 + 70 + 1 +102 +RTVSPropertyOp18 + 70 + 1 +102 +RTVSPropertyOp19 + 70 + 1 +102 +RTVSPropertyOp20 + 70 + 1 +102 +RTVSPropertyOp21 + 70 + 1 +102 +RTVSPropertyOp22 + 70 + 1 +102 +RTVSPropertyOp23 + 70 + 1 +102 +RTVSPropertyOp24 + 70 + 1 +102 +RTVSPropertyOp25 + 70 + 1 +102 +RTVSPropertyOp26 + 70 + 1 +102 +RTVSPropertyOp27 + 70 + 1 +102 +RTVSPropertyOp28 + 70 + 1 +102 +RTVSPropertyOp29 + 70 + 1 +102 +RTVSPropertyOp30 + 70 + 1 +102 +RTVSPropertyOp31 + 70 + 1 +102 +RTVSPropertyOp32 + 70 + 1 +102 +RTVSPropertyOp33 + 70 + 1 +102 +RTVSPropertyOp34 + 70 + 1 +102 +RTVSPropertyOp35 + 70 + 1 +102 +RTVSPropertyOp36 + 70 + 1 +102 +RTVSPropertyOp37 + 70 + 1 +102 +RTVSPropertyOp38 + 70 + 1 +102 +RTVSPropertyOp39 + 70 + 1 +102 +RTVSPropertyOp40 + 70 + 1 +102 +RTVSPropertyOp41 + 70 + 1 +102 +RTVSPropertyOp42 + 70 + 1 +102 +RTVSPropertyOp43 + 70 + 1 +102 +RTVSPropertyOp44 + 70 + 1 +102 +RTVSPropertyOp45 + 70 + 1 +102 +RTVSPropertyOp46 + 70 + 1 +102 +RTVSPropertyOp47 + 70 + 1 +102 +RTVSPropertyOp48 + 70 + 1 +102 +RTVSPropertyOp49 + 70 + 1 +102 +RTVSPropertyOp50 + 70 + 1 +102 +RTVSPropertyOp51 + 70 + 0 +102 +RTVSPropertyOp52 + 70 + 0 +102 +RTVSPropertyOp53 + 70 + 1 +102 +RTVSPropertyOp54 + 70 + 1 +102 +RTVSPropertyOp55 + 70 + 1 +102 +RTVSPropertyOp56 + 70 + 1 +102 +RTVSPropertyOp57 + 70 + 1 +102 +RTVSPropertyOp58 + 70 + 1 +102 +RTVSPropertyOp59 + 70 + 1 +102 +RTVSPropertyOp60 + 70 + 1 +102 +RTVSPropertyOp61 + 70 + 1 +102 +RTVSPropertyOp62 + 70 + 1 + 0 +XRECORD + 5 +2BC +102 +{ACAD_REACTORS +330 +2BB +102 +} +330 +2BB +100 +AcDbXrecord +280 + 1 +102 +RTVSPost2010Prop28 +280 + 0 +102 +RTVSPost2010PropOp28 + 70 + 1 +102 +RTVSPost2010Prop29 +280 + 1 +102 +RTVSPost2010PropOp29 + 70 + 1 +102 +RTVSPost2010Prop30 +280 + 1 +102 +RTVSPost2010PropOp30 + 70 + 1 +102 +RTVSPost2010Prop31 +280 + 0 +102 +RTVSPost2010PropOp31 + 70 + 1 +102 +RTVSPost2010Prop32 +280 + 0 +102 +RTVSPost2010PropOp32 + 70 + 1 +102 +RTVSPost2010Prop33 +280 + 0 +102 +RTVSPost2010PropOp33 + 70 + 1 +102 +RTVSPost2010Prop34 +280 + 0 +102 +RTVSPost2010PropOp34 + 70 + 1 +102 +RTVSPost2010Prop35 +280 + 0 +102 +RTVSPost2010PropOp35 + 70 + 1 +102 +RTVSPost2010Prop36 +280 + 0 +102 +RTVSPost2010PropOp36 + 70 + 1 +102 +RTVSPost2010Prop37 + 90 + 50 +102 +RTVSPost2010PropOp37 + 70 + 1 +102 +RTVSPost2010Prop38 +140 +0.0 +102 +RTVSPost2010PropOp38 + 70 + 1 +102 +RTVSPost2010Prop39 +140 +1.0 +102 +RTVSPost2010PropOp39 + 70 + 1 +102 +RTVSPost2010Prop40 + 90 + 0 +102 +RTVSPost2010PropOp40 + 70 + 1 +102 +RTVSPost2010Prop41ColorIndex + 90 + 18 +102 +RTVSPost2010Prop41ColorRGB + 90 + 0 +102 +RTVSPost2010PropOp41 + 70 + 1 +102 +RTVSPost2010Prop42 + 90 + 50 +102 +RTVSPost2010PropOp42 + 70 + 1 +102 +RTVSPost2010Prop43 + 90 + 3 +102 +RTVSPost2010PropOp43 + 70 + 1 +102 +RTVSPost2010Prop44ColorIndex + 90 + 5 +102 +RTVSPost2010Prop44ColorRGB + 90 + 255 +102 +RTVSPost2010PropOp44 + 70 + 1 +102 +RTVSPost2010Prop45 +280 + 0 +102 +RTVSPost2010PropOp45 + 70 + 1 +102 +RTVSPost2010Prop46 + 90 + 50 +102 +RTVSPost2010PropOp46 + 70 + 1 +102 +RTVSPost2010Prop47 + 90 + 50 +102 +RTVSPost2010PropOp47 + 70 + 1 +102 +RTVSPost2010Prop48 + 90 + 50 +102 +RTVSPost2010PropOp48 + 70 + 1 +102 +RTVSPost2010Prop49 +280 + 0 +102 +RTVSPost2010PropOp49 + 70 + 1 +102 +RTVSPost2010Prop50 + 90 + 50 +102 +RTVSPost2010PropOp50 + 70 + 1 +102 +RTVSPost2010Prop51ColorIndex + 90 + 256 +102 +RTVSPost2010Prop51ColorRGB + 90 +-16777216 +102 +RTVSPost2010PropOp51 + 70 + 0 +102 +RTVSPost2010Prop52 +140 +1.0 +102 +RTVSPost2010PropOp52 + 70 + 0 +102 +RTVSPost2010Prop53 + 90 + 2 +102 +RTVSPost2010PropOp53 + 70 + 1 +102 +RTVSPost2010Prop54 + 1 +strokes_ogs.tif +102 +RTVSPost2010PropOp54 + 70 + 1 +102 +RTVSPost2010Prop55 +280 + 0 +102 +RTVSPost2010PropOp55 + 70 + 1 +102 +RTVSPost2010Prop56 +140 +1.0 +102 +RTVSPost2010PropOp56 + 70 + 1 +102 +RTVSPost2010Prop57 +140 +1.0 +102 +RTVSPost2010PropOp57 + 70 + 1 +102 +RTVSPropertyOp0 + 70 + 1 +102 +RTVSPropertyOp1 + 70 + 1 +102 +RTVSPropertyOp2 + 70 + 1 +102 +RTVSPropertyOp3 + 70 + 1 +102 +RTVSPropertyOp4 + 70 + 1 +102 +RTVSPropertyOp5 + 70 + 1 +102 +RTVSPropertyOp6 + 70 + 1 +102 +RTVSPropertyOp7 + 70 + 1 +102 +RTVSPropertyOp8 + 70 + 1 +102 +RTVSPropertyOp9 + 70 + 1 +102 +RTVSPropertyOp10 + 70 + 1 +102 +RTVSPropertyOp11 + 70 + 1 +102 +RTVSPropertyOp12 + 70 + 1 +102 +RTVSPropertyOp13 + 70 + 1 +102 +RTVSPropertyOp14 + 70 + 1 +102 +RTVSPropertyOp15 + 70 + 1 +102 +RTVSPropertyOp16 + 70 + 1 +102 +RTVSPropertyOp17 + 70 + 1 +102 +RTVSPropertyOp18 + 70 + 1 +102 +RTVSPropertyOp19 + 70 + 1 +102 +RTVSPropertyOp20 + 70 + 1 +102 +RTVSPropertyOp21 + 70 + 1 +102 +RTVSPropertyOp22 + 70 + 1 +102 +RTVSPropertyOp23 + 70 + 1 +102 +RTVSPropertyOp24 + 70 + 1 +102 +RTVSPropertyOp25 + 70 + 1 +102 +RTVSPropertyOp26 + 70 + 1 +102 +RTVSPropertyOp27 + 70 + 1 +102 +RTVSPropertyOp28 + 70 + 1 +102 +RTVSPropertyOp29 + 70 + 1 +102 +RTVSPropertyOp30 + 70 + 1 +102 +RTVSPropertyOp31 + 70 + 1 +102 +RTVSPropertyOp32 + 70 + 1 +102 +RTVSPropertyOp33 + 70 + 1 +102 +RTVSPropertyOp34 + 70 + 1 +102 +RTVSPropertyOp35 + 70 + 1 +102 +RTVSPropertyOp36 + 70 + 1 +102 +RTVSPropertyOp37 + 70 + 1 +102 +RTVSPropertyOp38 + 70 + 1 +102 +RTVSPropertyOp39 + 70 + 1 +102 +RTVSPropertyOp40 + 70 + 1 +102 +RTVSPropertyOp41 + 70 + 1 +102 +RTVSPropertyOp42 + 70 + 1 +102 +RTVSPropertyOp43 + 70 + 1 +102 +RTVSPropertyOp44 + 70 + 1 +102 +RTVSPropertyOp45 + 70 + 1 +102 +RTVSPropertyOp46 + 70 + 1 +102 +RTVSPropertyOp47 + 70 + 1 +102 +RTVSPropertyOp48 + 70 + 1 +102 +RTVSPropertyOp49 + 70 + 1 +102 +RTVSPropertyOp50 + 70 + 1 +102 +RTVSPropertyOp51 + 70 + 0 +102 +RTVSPropertyOp52 + 70 + 0 +102 +RTVSPropertyOp53 + 70 + 1 +102 +RTVSPropertyOp54 + 70 + 1 +102 +RTVSPropertyOp55 + 70 + 1 +102 +RTVSPropertyOp56 + 70 + 1 +102 +RTVSPropertyOp57 + 70 + 1 +102 +RTVSPropertyOp58 + 70 + 1 +102 +RTVSPropertyOp59 + 70 + 1 +102 +RTVSPropertyOp60 + 70 + 1 +102 +RTVSPropertyOp61 + 70 + 1 +102 +RTVSPropertyOp62 + 70 + 1 + 0 +XRECORD + 5 +2AE +102 +{ACAD_REACTORS +330 +2AD +102 +} +330 +2AD +100 +AcDbXrecord +280 + 1 +102 +RTVSPost2010Prop28 +280 + 0 +102 +RTVSPost2010PropOp28 + 70 + 1 +102 +RTVSPost2010Prop29 +280 + 1 +102 +RTVSPost2010PropOp29 + 70 + 1 +102 +RTVSPost2010Prop30 +280 + 1 +102 +RTVSPost2010PropOp30 + 70 + 1 +102 +RTVSPost2010Prop31 +280 + 0 +102 +RTVSPost2010PropOp31 + 70 + 1 +102 +RTVSPost2010Prop32 +280 + 0 +102 +RTVSPost2010PropOp32 + 70 + 1 +102 +RTVSPost2010Prop33 +280 + 0 +102 +RTVSPost2010PropOp33 + 70 + 1 +102 +RTVSPost2010Prop34 +280 + 0 +102 +RTVSPost2010PropOp34 + 70 + 1 +102 +RTVSPost2010Prop35 +280 + 0 +102 +RTVSPost2010PropOp35 + 70 + 1 +102 +RTVSPost2010Prop36 +280 + 0 +102 +RTVSPost2010PropOp36 + 70 + 1 +102 +RTVSPost2010Prop37 + 90 + 50 +102 +RTVSPost2010PropOp37 + 70 + 1 +102 +RTVSPost2010Prop38 +140 +0.0 +102 +RTVSPost2010PropOp38 + 70 + 1 +102 +RTVSPost2010Prop39 +140 +1.0 +102 +RTVSPost2010PropOp39 + 70 + 1 +102 +RTVSPost2010Prop40 + 90 + 0 +102 +RTVSPost2010PropOp40 + 70 + 1 +102 +RTVSPost2010Prop41ColorIndex + 90 + 18 +102 +RTVSPost2010Prop41ColorRGB + 90 + 0 +102 +RTVSPost2010PropOp41 + 70 + 1 +102 +RTVSPost2010Prop42 + 90 + 50 +102 +RTVSPost2010PropOp42 + 70 + 1 +102 +RTVSPost2010Prop43 + 90 + 3 +102 +RTVSPost2010PropOp43 + 70 + 1 +102 +RTVSPost2010Prop44ColorIndex + 90 + 5 +102 +RTVSPost2010Prop44ColorRGB + 90 + 255 +102 +RTVSPost2010PropOp44 + 70 + 1 +102 +RTVSPost2010Prop45 +280 + 0 +102 +RTVSPost2010PropOp45 + 70 + 1 +102 +RTVSPost2010Prop46 + 90 + 50 +102 +RTVSPost2010PropOp46 + 70 + 1 +102 +RTVSPost2010Prop47 + 90 + 50 +102 +RTVSPost2010PropOp47 + 70 + 1 +102 +RTVSPost2010Prop48 + 90 + 50 +102 +RTVSPost2010PropOp48 + 70 + 1 +102 +RTVSPost2010Prop49 +280 + 0 +102 +RTVSPost2010PropOp49 + 70 + 1 +102 +RTVSPost2010Prop50 + 90 + 50 +102 +RTVSPost2010PropOp50 + 70 + 1 +102 +RTVSPost2010Prop51ColorIndex + 90 + 256 +102 +RTVSPost2010Prop51ColorRGB + 90 +-16777216 +102 +RTVSPost2010PropOp51 + 70 + 0 +102 +RTVSPost2010Prop52 +140 +1.0 +102 +RTVSPost2010PropOp52 + 70 + 0 +102 +RTVSPost2010Prop53 + 90 + 2 +102 +RTVSPost2010PropOp53 + 70 + 1 +102 +RTVSPost2010Prop54 + 1 +strokes_ogs.tif +102 +RTVSPost2010PropOp54 + 70 + 1 +102 +RTVSPost2010Prop55 +280 + 0 +102 +RTVSPost2010PropOp55 + 70 + 1 +102 +RTVSPost2010Prop56 +140 +1.0 +102 +RTVSPost2010PropOp56 + 70 + 1 +102 +RTVSPost2010Prop57 +140 +1.0 +102 +RTVSPost2010PropOp57 + 70 + 1 +102 +RTVSPropertyOp0 + 70 + 1 +102 +RTVSPropertyOp1 + 70 + 1 +102 +RTVSPropertyOp2 + 70 + 1 +102 +RTVSPropertyOp3 + 70 + 1 +102 +RTVSPropertyOp4 + 70 + 1 +102 +RTVSPropertyOp5 + 70 + 1 +102 +RTVSPropertyOp6 + 70 + 1 +102 +RTVSPropertyOp7 + 70 + 1 +102 +RTVSPropertyOp8 + 70 + 1 +102 +RTVSPropertyOp9 + 70 + 1 +102 +RTVSPropertyOp10 + 70 + 1 +102 +RTVSPropertyOp11 + 70 + 1 +102 +RTVSPropertyOp12 + 70 + 1 +102 +RTVSPropertyOp13 + 70 + 1 +102 +RTVSPropertyOp14 + 70 + 1 +102 +RTVSPropertyOp15 + 70 + 1 +102 +RTVSPropertyOp16 + 70 + 1 +102 +RTVSPropertyOp17 + 70 + 1 +102 +RTVSPropertyOp18 + 70 + 1 +102 +RTVSPropertyOp19 + 70 + 1 +102 +RTVSPropertyOp20 + 70 + 1 +102 +RTVSPropertyOp21 + 70 + 1 +102 +RTVSPropertyOp22 + 70 + 1 +102 +RTVSPropertyOp23 + 70 + 1 +102 +RTVSPropertyOp24 + 70 + 1 +102 +RTVSPropertyOp25 + 70 + 1 +102 +RTVSPropertyOp26 + 70 + 1 +102 +RTVSPropertyOp27 + 70 + 1 +102 +RTVSPropertyOp28 + 70 + 1 +102 +RTVSPropertyOp29 + 70 + 1 +102 +RTVSPropertyOp30 + 70 + 1 +102 +RTVSPropertyOp31 + 70 + 1 +102 +RTVSPropertyOp32 + 70 + 1 +102 +RTVSPropertyOp33 + 70 + 1 +102 +RTVSPropertyOp34 + 70 + 1 +102 +RTVSPropertyOp35 + 70 + 1 +102 +RTVSPropertyOp36 + 70 + 1 +102 +RTVSPropertyOp37 + 70 + 1 +102 +RTVSPropertyOp38 + 70 + 1 +102 +RTVSPropertyOp39 + 70 + 1 +102 +RTVSPropertyOp40 + 70 + 1 +102 +RTVSPropertyOp41 + 70 + 1 +102 +RTVSPropertyOp42 + 70 + 1 +102 +RTVSPropertyOp43 + 70 + 1 +102 +RTVSPropertyOp44 + 70 + 1 +102 +RTVSPropertyOp45 + 70 + 1 +102 +RTVSPropertyOp46 + 70 + 1 +102 +RTVSPropertyOp47 + 70 + 1 +102 +RTVSPropertyOp48 + 70 + 1 +102 +RTVSPropertyOp49 + 70 + 1 +102 +RTVSPropertyOp50 + 70 + 1 +102 +RTVSPropertyOp51 + 70 + 0 +102 +RTVSPropertyOp52 + 70 + 0 +102 +RTVSPropertyOp53 + 70 + 1 +102 +RTVSPropertyOp54 + 70 + 1 +102 +RTVSPropertyOp55 + 70 + 1 +102 +RTVSPropertyOp56 + 70 + 1 +102 +RTVSPropertyOp57 + 70 + 1 +102 +RTVSPropertyOp58 + 70 + 1 +102 +RTVSPropertyOp59 + 70 + 1 +102 +RTVSPropertyOp60 + 70 + 1 +102 +RTVSPropertyOp61 + 70 + 1 +102 +RTVSPropertyOp62 + 70 + 1 + 0 +XRECORD + 5 +2CE +102 +{ACAD_REACTORS +330 +2CD +102 +} +330 +2CD +100 +AcDbXrecord +280 + 1 +102 +RTVSPost2010Prop28 +280 + 0 +102 +RTVSPost2010PropOp28 + 70 + 1 +102 +RTVSPost2010Prop29 +280 + 1 +102 +RTVSPost2010PropOp29 + 70 + 1 +102 +RTVSPost2010Prop30 +280 + 1 +102 +RTVSPost2010PropOp30 + 70 + 1 +102 +RTVSPost2010Prop31 +280 + 0 +102 +RTVSPost2010PropOp31 + 70 + 1 +102 +RTVSPost2010Prop32 +280 + 0 +102 +RTVSPost2010PropOp32 + 70 + 1 +102 +RTVSPost2010Prop33 +280 + 0 +102 +RTVSPost2010PropOp33 + 70 + 1 +102 +RTVSPost2010Prop34 +280 + 0 +102 +RTVSPost2010PropOp34 + 70 + 1 +102 +RTVSPost2010Prop35 +280 + 0 +102 +RTVSPost2010PropOp35 + 70 + 1 +102 +RTVSPost2010Prop36 +280 + 0 +102 +RTVSPost2010PropOp36 + 70 + 1 +102 +RTVSPost2010Prop37 + 90 + 50 +102 +RTVSPost2010PropOp37 + 70 + 1 +102 +RTVSPost2010Prop38 +140 +0.0 +102 +RTVSPost2010PropOp38 + 70 + 1 +102 +RTVSPost2010Prop39 +140 +1.0 +102 +RTVSPost2010PropOp39 + 70 + 1 +102 +RTVSPost2010Prop40 + 90 + 0 +102 +RTVSPost2010PropOp40 + 70 + 1 +102 +RTVSPost2010Prop41ColorIndex + 90 + 18 +102 +RTVSPost2010Prop41ColorRGB + 90 + 0 +102 +RTVSPost2010PropOp41 + 70 + 1 +102 +RTVSPost2010Prop42 + 90 + 50 +102 +RTVSPost2010PropOp42 + 70 + 1 +102 +RTVSPost2010Prop43 + 90 + 3 +102 +RTVSPost2010PropOp43 + 70 + 1 +102 +RTVSPost2010Prop44ColorIndex + 90 + 5 +102 +RTVSPost2010Prop44ColorRGB + 90 + 255 +102 +RTVSPost2010PropOp44 + 70 + 1 +102 +RTVSPost2010Prop45 +280 + 0 +102 +RTVSPost2010PropOp45 + 70 + 1 +102 +RTVSPost2010Prop46 + 90 + 50 +102 +RTVSPost2010PropOp46 + 70 + 1 +102 +RTVSPost2010Prop47 + 90 + 50 +102 +RTVSPost2010PropOp47 + 70 + 1 +102 +RTVSPost2010Prop48 + 90 + 50 +102 +RTVSPost2010PropOp48 + 70 + 1 +102 +RTVSPost2010Prop49 +280 + 0 +102 +RTVSPost2010PropOp49 + 70 + 1 +102 +RTVSPost2010Prop50 + 90 + 50 +102 +RTVSPost2010PropOp50 + 70 + 1 +102 +RTVSPost2010Prop51ColorIndex + 90 + 256 +102 +RTVSPost2010Prop51ColorRGB + 90 +-16777216 +102 +RTVSPost2010PropOp51 + 70 + 0 +102 +RTVSPost2010Prop52 +140 +1.0 +102 +RTVSPost2010PropOp52 + 70 + 0 +102 +RTVSPost2010Prop53 + 90 + 2 +102 +RTVSPost2010PropOp53 + 70 + 1 +102 +RTVSPost2010Prop54 + 1 +strokes_ogs.tif +102 +RTVSPost2010PropOp54 + 70 + 1 +102 +RTVSPost2010Prop55 +280 + 0 +102 +RTVSPost2010PropOp55 + 70 + 1 +102 +RTVSPost2010Prop56 +140 +1.0 +102 +RTVSPost2010PropOp56 + 70 + 1 +102 +RTVSPost2010Prop57 +140 +1.0 +102 +RTVSPost2010PropOp57 + 70 + 1 +102 +RTVSPropertyOp0 + 70 + 1 +102 +RTVSPropertyOp1 + 70 + 1 +102 +RTVSPropertyOp2 + 70 + 1 +102 +RTVSPropertyOp3 + 70 + 1 +102 +RTVSPropertyOp4 + 70 + 1 +102 +RTVSPropertyOp5 + 70 + 1 +102 +RTVSPropertyOp6 + 70 + 1 +102 +RTVSPropertyOp7 + 70 + 1 +102 +RTVSPropertyOp8 + 70 + 1 +102 +RTVSPropertyOp9 + 70 + 1 +102 +RTVSPropertyOp10 + 70 + 1 +102 +RTVSPropertyOp11 + 70 + 1 +102 +RTVSPropertyOp12 + 70 + 1 +102 +RTVSPropertyOp13 + 70 + 1 +102 +RTVSPropertyOp14 + 70 + 1 +102 +RTVSPropertyOp15 + 70 + 1 +102 +RTVSPropertyOp16 + 70 + 1 +102 +RTVSPropertyOp17 + 70 + 1 +102 +RTVSPropertyOp18 + 70 + 1 +102 +RTVSPropertyOp19 + 70 + 1 +102 +RTVSPropertyOp20 + 70 + 1 +102 +RTVSPropertyOp21 + 70 + 1 +102 +RTVSPropertyOp22 + 70 + 1 +102 +RTVSPropertyOp23 + 70 + 1 +102 +RTVSPropertyOp24 + 70 + 1 +102 +RTVSPropertyOp25 + 70 + 1 +102 +RTVSPropertyOp26 + 70 + 1 +102 +RTVSPropertyOp27 + 70 + 1 +102 +RTVSPropertyOp28 + 70 + 1 +102 +RTVSPropertyOp29 + 70 + 1 +102 +RTVSPropertyOp30 + 70 + 1 +102 +RTVSPropertyOp31 + 70 + 1 +102 +RTVSPropertyOp32 + 70 + 1 +102 +RTVSPropertyOp33 + 70 + 1 +102 +RTVSPropertyOp34 + 70 + 1 +102 +RTVSPropertyOp35 + 70 + 1 +102 +RTVSPropertyOp36 + 70 + 1 +102 +RTVSPropertyOp37 + 70 + 1 +102 +RTVSPropertyOp38 + 70 + 1 +102 +RTVSPropertyOp39 + 70 + 1 +102 +RTVSPropertyOp40 + 70 + 1 +102 +RTVSPropertyOp41 + 70 + 1 +102 +RTVSPropertyOp42 + 70 + 1 +102 +RTVSPropertyOp43 + 70 + 1 +102 +RTVSPropertyOp44 + 70 + 1 +102 +RTVSPropertyOp45 + 70 + 1 +102 +RTVSPropertyOp46 + 70 + 1 +102 +RTVSPropertyOp47 + 70 + 1 +102 +RTVSPropertyOp48 + 70 + 1 +102 +RTVSPropertyOp49 + 70 + 1 +102 +RTVSPropertyOp50 + 70 + 1 +102 +RTVSPropertyOp51 + 70 + 0 +102 +RTVSPropertyOp52 + 70 + 0 +102 +RTVSPropertyOp53 + 70 + 1 +102 +RTVSPropertyOp54 + 70 + 1 +102 +RTVSPropertyOp55 + 70 + 1 +102 +RTVSPropertyOp56 + 70 + 1 +102 +RTVSPropertyOp57 + 70 + 1 +102 +RTVSPropertyOp58 + 70 + 1 +102 +RTVSPropertyOp59 + 70 + 1 +102 +RTVSPropertyOp60 + 70 + 1 +102 +RTVSPropertyOp61 + 70 + 1 +102 +RTVSPropertyOp62 + 70 + 1 + 0 +ENDSEC + 0 +EOF diff --git a/Projects/floorplan-sample.pdf b/Projects/floorplan-sample.pdf new file mode 100644 index 0000000..8358c9c Binary files /dev/null and b/Projects/floorplan-sample.pdf differ diff --git a/Projects/test save.autofire b/Projects/test save.autofire new file mode 100644 index 0000000..8cb3bde Binary files /dev/null and b/Projects/test save.autofire differ diff --git a/README.md b/README.md index 7c9a78d..4a8deb4 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,39 @@ # AutoFireBase +Overview +- Python app with CAD-style drawing tools and packaging via PyInstaller. +- This repo now includes standard Python hygiene: .gitignore, formatting, linting, and pre-commit hooks. + +Prerequisites +- Python 3.11 (recommended), Git, PowerShell on Windows. + +Quick Start (Windows, PowerShell) +- Clone and open this repo. +- Run: `./setup_dev.ps1` (creates `.venv`, installs requirements, sets up pre-commit). +- Activate later: `. .venv/Scripts/Activate.ps1` +- Run the app: `python app/main.py` + +Daily Workflow +- Activate venv: `. .venv/Scripts/Activate.ps1` +- Sync: `git pull` (ensure you’re on the correct branch). +- Code changes. +- Format/lint: `ruff check --fix .` and `black .` (pre-commit will also run these on commit). +- Commit: `git add -A && git commit -m "..."` +- Push: `git push` and open a PR. + +Code Style & Tooling +- Black (line length 100) for formatting. +- Ruff for lint + import sorting; targets Python 3.11. +- Pre-commit runs Ruff + Black + basic whitespace fixes on commit. + +Build +- Use the existing scripts: `Build_AutoFire.ps1` or `Build_AutoFire_Debug.ps1`. +- PyInstaller spec files (`AutoFire.spec`, `AutoFire_Debug.spec`) are kept in repo; build artifacts are ignored (`build/`, `dist/`). + +Repo Hygiene +- Do not commit virtual envs, caches, `build/`, `dist/`, or backup files. Patterns are covered in `.gitignore`. +- Samples: the `Projects/` folder currently contains example assets (DXF/PDF/.autofire). Keep or move into a dedicated `samples/` folder in future if desired. + +Contributing +- Branch from `main` using feature branches: `feat/` or `fix/`. +- Create small, focused PRs. The CI/tooling will enforce formatting and linting locally via pre-commit. diff --git a/app/__pycache__/__init__.cpython-311.pyc b/app/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 521597a..0000000 Binary files a/app/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/app/__pycache__/assistant.cpython-311.pyc b/app/__pycache__/assistant.cpython-311.pyc deleted file mode 100644 index fa40fd1..0000000 Binary files a/app/__pycache__/assistant.cpython-311.pyc and /dev/null differ diff --git a/app/__pycache__/boot.cpython-311.pyc b/app/__pycache__/boot.cpython-311.pyc deleted file mode 100644 index 16c785c..0000000 Binary files a/app/__pycache__/boot.cpython-311.pyc and /dev/null differ diff --git a/app/__pycache__/catalog.cpython-311.pyc b/app/__pycache__/catalog.cpython-311.pyc deleted file mode 100644 index 37a3cba..0000000 Binary files a/app/__pycache__/catalog.cpython-311.pyc and /dev/null differ diff --git a/app/__pycache__/coverage.cpython-311.pyc b/app/__pycache__/coverage.cpython-311.pyc deleted file mode 100644 index 454f268..0000000 Binary files a/app/__pycache__/coverage.cpython-311.pyc and /dev/null differ diff --git a/app/__pycache__/device.cpython-311.pyc b/app/__pycache__/device.cpython-311.pyc deleted file mode 100644 index b2c9b85..0000000 Binary files a/app/__pycache__/device.cpython-311.pyc and /dev/null differ diff --git a/app/__pycache__/main.cpython-311.pyc b/app/__pycache__/main.cpython-311.pyc deleted file mode 100644 index be84e11..0000000 Binary files a/app/__pycache__/main.cpython-311.pyc and /dev/null differ diff --git a/app/__pycache__/minwin.cpython-311.pyc b/app/__pycache__/minwin.cpython-311.pyc deleted file mode 100644 index 695d9c4..0000000 Binary files a/app/__pycache__/minwin.cpython-311.pyc and /dev/null differ diff --git a/app/__pycache__/scene.cpython-311.pyc b/app/__pycache__/scene.cpython-311.pyc deleted file mode 100644 index 2b62914..0000000 Binary files a/app/__pycache__/scene.cpython-311.pyc and /dev/null differ diff --git a/app/__pycache__/units.cpython-311.pyc b/app/__pycache__/units.cpython-311.pyc deleted file mode 100644 index 1b3dac5..0000000 Binary files a/app/__pycache__/units.cpython-311.pyc and /dev/null differ diff --git a/app/__pycache__/wiring.cpython-311.pyc b/app/__pycache__/wiring.cpython-311.pyc deleted file mode 100644 index 870fc2e..0000000 Binary files a/app/__pycache__/wiring.cpython-311.pyc and /dev/null differ diff --git a/app/catalog.py b/app/catalog.py index ca79854..8acab56 100644 --- a/app/catalog.py +++ b/app/catalog.py @@ -1,4 +1,9 @@ -# Minimal, built-in catalog with filters; replace with DB later +# Minimal catalog; loads from SQLite if available, else builtin +import os +try: + from db import loader as db_loader +except Exception: + db_loader = None def _builtin(): return [ {"name":"Smoke Detector", "symbol":"SD", "type":"Detector", "manufacturer":"(Any)", "part_number":"GEN-SD"}, @@ -10,7 +15,17 @@ def _builtin(): ] def load_catalog(): - # In the future, look for a JSON file; for now return builtin + if db_loader is not None: + try: + con = db_loader.connect() + db_loader.ensure_schema(con) + db_loader.seed_demo(con) + devs = db_loader.fetch_devices(con) + con.close() + if devs: + return devs + except Exception: + pass return _builtin() def list_manufacturers(devs): diff --git a/app/device.py b/app/device.py index 1ab3ebd..8d059ff 100644 --- a/app/device.py +++ b/app/device.py @@ -21,6 +21,8 @@ def __init__(self, x, y, symbol, name, manufacturer="", part_number=""): self._glyph = QtWidgets.QGraphicsEllipseItem(-6, -6, 12, 12) pen = QtGui.QPen(QtGui.QColor("#D8D8D8")); pen.setCosmetic(True) self._glyph.setPen(pen); self._glyph.setBrush(QtGui.QColor("#20252B")) + self._glyph.setAcceptedMouseButtons(QtCore.Qt.NoButton) + self._glyph.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, False) self.addToGroup(self._glyph) # Label @@ -28,6 +30,10 @@ def __init__(self, x, y, symbol, name, manufacturer="", part_number=""): self._label.setBrush(QtGui.QBrush(QtGui.QColor("#EAEAEA"))) self._label.setFlag(QtWidgets.QGraphicsItem.ItemIgnoresTransformations, True) self._label.setPos(QtCore.QPointF(12, -14)) + # Track label offset in scene pixels relative to device origin + self.label_offset = QtCore.QPointF(self._label.pos()) + self._label.setAcceptedMouseButtons(QtCore.Qt.NoButton) + self._label.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, False) self.addToGroup(self._label) # Selection halo @@ -42,12 +48,19 @@ def __init__(self, x, y, symbol, name, manufacturer="", part_number=""): "params":{}, # mode-specific inputs "computed_radius_ft":0.0, "px_per_ft":12.0} + self.coverage_enabled = True self._cov_circle = QtWidgets.QGraphicsEllipseItem(); self._cov_circle.setZValue(-10); self._cov_circle.setVisible(False) + self._cov_circle.setAcceptedMouseButtons(QtCore.Qt.NoButton) + self._cov_circle.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, False) + self._cov_circle.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, False) cpen = QtGui.QPen(QtGui.QColor(80,170,255,200)); cpen.setCosmetic(True); cpen.setStyle(QtCore.Qt.DashLine) self._cov_circle.setPen(cpen); self._cov_circle.setBrush(QtGui.QColor(80,170,255,40)) self.addToGroup(self._cov_circle) self._cov_square = QtWidgets.QGraphicsRectItem(); self._cov_square.setZValue(-11); self._cov_square.setVisible(False) + self._cov_square.setAcceptedMouseButtons(QtCore.Qt.NoButton) + self._cov_square.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, False) + self._cov_square.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, False) spen = QtGui.QPen(QtGui.QColor(80,170,255,140)); spen.setCosmetic(True); spen.setStyle(QtCore.Qt.DotLine) self._cov_square.setPen(spen); self._cov_square.setBrush(QtGui.QColor(80,170,255,25)) self.addToGroup(self._cov_square) @@ -64,6 +77,13 @@ def itemChange(self, change, value): def set_label_text(self, text: str): self._label.setText(text) + def set_label_offset(self, dx_px: float, dy_px: float): + try: + self.label_offset = QtCore.QPointF(float(dx_px), float(dy_px)) + self._label.setPos(self.label_offset) + except Exception: + pass + # ---- coverage API def set_coverage(self, cfg: dict): if not cfg: return @@ -71,6 +91,10 @@ def set_coverage(self, cfg: dict): self._update_coverage_items() def _update_coverage_items(self): + if not self.coverage_enabled: + self._cov_circle.setVisible(False) + self._cov_square.setVisible(False) + return mode = self.coverage.get("mode","none") r_ft = float(self.coverage.get("computed_radius_ft") or 0.0) ppf = float(self.coverage.get("px_per_ft") or 12.0) @@ -92,6 +116,10 @@ def _update_coverage_items(self): self._cov_square.setRect(-side/2, -side/2, side, side) self._cov_square.setVisible(True) + def set_coverage_enabled(self, on: bool): + self.coverage_enabled = bool(on) + self._update_coverage_items() + # ---- serialization def to_json(self): return { @@ -102,6 +130,7 @@ def to_json(self): "manufacturer": self.manufacturer, "part_number": self.part_number, "coverage": self.coverage, + "show_coverage": bool(getattr(self, 'coverage_enabled', True)), } @staticmethod @@ -111,4 +140,5 @@ def from_json(d: dict): d.get("manufacturer",""), d.get("part_number","")) cov = d.get("coverage") if cov: it.set_coverage(cov) + it.set_coverage_enabled(bool(d.get("show_coverage", True))) return it diff --git a/app/dialogs/__pycache__/__init__.cpython-311.pyc b/app/dialogs/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 8bdf977..0000000 Binary files a/app/dialogs/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/app/dialogs/__pycache__/coverage.cpython-311.pyc b/app/dialogs/__pycache__/coverage.cpython-311.pyc deleted file mode 100644 index ec48fa4..0000000 Binary files a/app/dialogs/__pycache__/coverage.cpython-311.pyc and /dev/null differ diff --git a/app/dialogs/__pycache__/gridstyle.cpython-311.pyc b/app/dialogs/__pycache__/gridstyle.cpython-311.pyc deleted file mode 100644 index 4815a77..0000000 Binary files a/app/dialogs/__pycache__/gridstyle.cpython-311.pyc and /dev/null differ diff --git a/app/dxf_import.py b/app/dxf_import.py index 11f7a83..d58c299 100644 --- a/app/dxf_import.py +++ b/app/dxf_import.py @@ -28,7 +28,7 @@ def _build_paths(doc, px_per_ft: float): feet_per_unit = _insunits_to_feet(ins) S = feet_per_unit * float(px_per_ft) - # layer -> (QPainterPath, QPen) + # layer -> (QPainterPath, QPen, QColor) layers = {} def get_layer_pack(name: str): if name not in layers: @@ -37,18 +37,26 @@ def get_layer_pack(name: str): aci = getattr(lay, "color", 7) except Exception: aci = 7 - pen = QtGui.QPen(_aci_to_qcolor(aci)) + color = _aci_to_qcolor(aci) + pen = QtGui.QPen(color) pen.setCosmetic(True); pen.setWidthF(0.0) - layers[name] = (QtGui.QPainterPath(), pen) + layers[name] = (QtGui.QPainterPath(), pen, color) return layers[name] - # Gather supported entities - for e in msp: + def add_poly_points(layer_name: str, pts): + if not pts: return + p, pen, _ = get_layer_pack(layer_name) + x0, y0 = pts[0] + p.moveTo(x0*S, -y0*S) + for (x, y) in pts[1:]: + p.lineTo(x*S, -y*S) + + def emit_entity(e): typ = e.dxftype() try: if typ == "LINE": (sx, sy, _), (ex, ey, _) = e.dxf.start, e.dxf.end - p, pen = get_layer_pack(e.dxf.layer) + p, pen, _ = get_layer_pack(e.dxf.layer) p.moveTo(sx*S, -sy*S); p.lineTo(ex*S, -ey*S) elif typ in ("LWPOLYLINE", "POLYLINE"): @@ -60,7 +68,7 @@ def get_layer_pack(name: str): points = [(v.dxf.location[0], v.dxf.location[1]) for v in e.vertices] closed = bool(e.is_closed) if points: - p, pen = get_layer_pack(e.dxf.layer) + p, pen, _ = get_layer_pack(e.dxf.layer) x0, y0 = points[0] p.moveTo(x0*S, -y0*S) for (x, y) in points[1:]: @@ -72,7 +80,7 @@ def get_layer_pack(name: str): cx, cy, _ = e.dxf.center r = float(e.dxf.radius) * S rect = QtCore.QRectF(cx*S - r, -cy*S - r, 2*r, 2*r) - p, pen = get_layer_pack(e.dxf.layer) + p, pen, _ = get_layer_pack(e.dxf.layer) p.addEllipse(rect) elif typ == "ARC": @@ -81,19 +89,42 @@ def get_layer_pack(name: str): start = float(e.dxf.start_angle) end = float(e.dxf.end_angle) rect = QtCore.QRectF(cx*S - r, -cy*S - r, 2*r, 2*r) - # painterpath uses cw/ccw in degrees: use arcMoveTo + arcTo - path, pen = get_layer_pack(e.dxf.layer) + path, pen, _ = get_layer_pack(e.dxf.layer) path.arcMoveTo(rect, start) sweep = end - start path.arcTo(rect, start, sweep) + elif typ == "ELLIPSE": + try: + tool = e.construction_tool() + pts = [(p.x, p.y) for p in tool.flattening(distance=tool.major_axis.magnitude/60.0)] + add_poly_points(e.dxf.layer, pts) + except Exception: + pass + + elif typ == "SPLINE": + try: + pts = e.approximate(segments=128) + add_poly_points(e.dxf.layer, [(pt[0], pt[1]) for pt in pts]) + except Exception: + pass + + elif typ == "INSERT": + try: + for ve in e.virtual_entities(): + emit_entity(ve) + except Exception: + pass except Exception: - # ignore malformed entity - continue + pass + + # Gather supported entities (including virtual entities for INSERT) + for e in msp: + emit_entity(e) return layers -def import_dxf_into_group(path: str, target_group: QtWidgets.QGraphicsItemGroup, px_per_ft: float) -> QtCore.QRectF: +def import_dxf_into_group(path: str, target_group: QtWidgets.QGraphicsItemGroup, px_per_ft: float) -> tuple[QtCore.QRectF, dict]: try: import ezdxf from ezdxf import recover @@ -113,11 +144,25 @@ def import_dxf_into_group(path: str, target_group: QtWidgets.QGraphicsItemGroup, packs = _build_paths(doc, px_per_ft) + # Create per-layer groups for easier layer management + layer_groups = {} bounds = QtCore.QRectF() - for (p, pen) in packs.values(): + for layer_name, (p, pen, color) in packs.items(): + grp = QtWidgets.QGraphicsItemGroup() + grp.setZValue(target_group.zValue()) + grp.setParentItem(target_group) + grp.setData(2000, 'dxf_layer_group') + grp.setData(2001, layer_name) + grp.setData(2002, color.name()) + grp.setFlags(QtWidgets.QGraphicsItem.ItemIsMovable | QtWidgets.QGraphicsItem.ItemIsSelectable) item = QtWidgets.QGraphicsPathItem(p) item.setPen(pen); item.setBrush(QtCore.Qt.NoBrush) - item.setParentItem(target_group) - bounds = bounds.united(p.controlPointRect()) - - return bounds + item.setParentItem(grp) + item.setData(2001, layer_name) + item.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True) + layer_groups[layer_name] = grp + rect = p.controlPointRect() + if rect.isValid(): + bounds = bounds.united(rect) + + return bounds, layer_groups diff --git a/app/layout.py b/app/layout.py index 2361014..b1d4d9a 100644 --- a/app/layout.py +++ b/app/layout.py @@ -8,6 +8,12 @@ "A2": (16.54, 23.39), "A1": (23.39, 33.11), "A0": (33.11, 46.81), + # Architectural sizes (inches) + "Arch A": (9, 12), + "Arch B": (12, 18), + "Arch C": (18, 24), + "Arch D": (24, 36), + "Arch E": (36, 48), } class PageFrame(QtWidgets.QGraphicsItemGroup): @@ -41,3 +47,123 @@ def set_params(self, *, size_name=None, orientation=None, margin_in=None, px_per if margin_in is not None: self._margin_in = float(margin_in) if px_per_ft is not None: self._px_per_ft = float(px_per_ft) self._recalc() + + +class TitleBlock(QtWidgets.QGraphicsItemGroup): + def __init__(self, px_per_ft: float, size_name="Letter", orientation="Landscape", meta: dict | None = None): + super().__init__() + self._px_per_ft = float(px_per_ft) + self._size = size_name + self._orient = orientation + self._meta = meta or {} + self._items = [] + self.setZValue(10) + self._build() + + +class ViewportItem(QtWidgets.QGraphicsRectItem): + def __init__(self, model_scene: QtWidgets.QGraphicsScene, rect: QtCore.QRectF, window: QtWidgets.QMainWindow | None = None): + super().__init__(rect) + self.model_scene = model_scene + self.win = window + # model pixels shown per viewport pixel (higher = zoomed out) + self.scale_factor = 1.0 + # model source center + try: + self.src_center = model_scene.itemsBoundingRect().center() + except Exception: + self.src_center = QtCore.QPointF(0, 0) + self.locked = False + self.setPen(QtGui.QPen(QtGui.QColor(160,160,160))) + self.setBrush(QtCore.Qt.NoBrush) + self.setZValue(5) + self.setFlags(QtWidgets.QGraphicsItem.ItemIsSelectable | QtWidgets.QGraphicsItem.ItemIsMovable) + + def set_scale_factor(self, f: float): + self.scale_factor = max(0.001, float(f)) + self.update() + + def set_src_center(self, c: QtCore.QPointF): + self.src_center = QtCore.QPointF(c) + self.update() + + def contextMenuEvent(self, event: QtWidgets.QGraphicsSceneContextMenuEvent): + m = QtWidgets.QMenu() + act_scale = m.addAction("Set Scale Factor…") + act_center = m.addAction("Center on Model View") + act_lock = m.addAction("Lock Viewport") + act_lock.setCheckable(True); act_lock.setChecked(self.locked) + chosen = m.exec(event.screenPos()) + if chosen == act_scale: + val, ok = QtWidgets.QInputDialog.getDouble(self.win or None, "Viewport Scale", "Scale factor", self.scale_factor, 0.001, 1000.0, 3) + if ok: + self.set_scale_factor(val) + elif chosen == act_center: + try: + if self.win is not None: + vc = self.win.view.mapToScene(self.win.view.viewport().rect().center()) + self.set_src_center(vc) + except Exception: + pass + elif chosen == act_lock: + self.locked = act_lock.isChecked() + self.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, not self.locked) + self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, not self.locked) + + def paint(self, painter: QtGui.QPainter, option, widget=None): + # clip to rect and render source from model scene + r = self.rect() + painter.save() + painter.setClipRect(r) + w_src = r.width() * self.scale_factor + h_src = r.height() * self.scale_factor + src = QtCore.QRectF(self.src_center.x() - w_src/2, self.src_center.y() - h_src/2, w_src, h_src) + # draw border + super().paint(painter, option, widget) + # render model scene into this item + try: + self.model_scene.render(painter, r, src) + except Exception: + pass + painter.restore() + + def _inch_to_px(self, inches: float) -> float: + return (float(inches)/12.0) * self._px_per_ft + + def _build(self): + # Simple block at bottom right with a few fields + for it in self._items: + try: + if it.scene(): it.scene().removeItem(it) + except Exception: pass + self._items.clear() + w_in, h_in = PAGE_SIZES.get(self._size, PAGE_SIZES["Letter"]) + if (self._orient or "").lower().startswith("port"): pass + else: + w_in, h_in = h_in, w_in + w = self._inch_to_px(w_in); h = self._inch_to_px(h_in) + # Block rectangle 3x10 inches in bottom-right + bw = self._inch_to_px(10); bh = self._inch_to_px(3) + rect = QtCore.QRectF(w - bw - self._inch_to_px(0.5), h - bh - self._inch_to_px(0.5), bw, bh) + box = QtWidgets.QGraphicsRectItem(rect) + pen = QtGui.QPen(QtGui.QColor(180,180,180)); pen.setCosmetic(True) + box.setPen(pen); box.setBrush(QtCore.Qt.NoBrush) + self.addToGroup(box); self._items.append(box) + # Text rows + def add_line(label, value, y_off_in): + y = rect.top() + self._inch_to_px(y_off_in) + t = QtWidgets.QGraphicsSimpleTextItem(f"{label}: {value}") + t.setPen(QtGui.QPen(QtGui.QColor(200,200,210))) + t.setBrush(QtGui.QBrush(QtGui.QColor(200,200,210))) + t.setFlag(QtWidgets.QGraphicsItem.ItemIgnoresTransformations, True) + t.setPos(rect.left() + self._inch_to_px(0.3), y) + self.addToGroup(t); self._items.append(t) + add_line("Project", self._meta.get("project",""), 0.3) + add_line("Address", self._meta.get("address",""), 0.8) + add_line("Sheet", self._meta.get("sheet",""), 1.3) + add_line("Date", self._meta.get("date",""), 1.8) + add_line("By", self._meta.get("by",""), 2.3) + + def set_meta(self, meta: dict | None): + self._meta = meta or {} + self._build() diff --git a/app/main.py b/app/main.py index c064e94..ba43c3f 100644 --- a/app/main.py +++ b/app/main.py @@ -1,4 +1,8 @@ import os, json, zipfile +import sys +# Allow running as `python app\main.py` by fixing sys.path for absolute `app.*` imports +if __package__ in (None, ""): + sys.path.insert(0, os.path.dirname(os.path.dirname(__file__))) from PySide6 import QtCore, QtGui, QtWidgets from PySide6.QtCore import Qt, QPointF, QSize from PySide6.QtWidgets import ( @@ -9,9 +13,26 @@ ) from app.scene import GridScene, DEFAULT_GRID_SIZE +from app.layout import PageFrame, PAGE_SIZES, TitleBlock from app.device import DeviceItem from app import catalog from app.tools import draw as draw_tools +from app.tools.text_tool import TextTool, MTextTool +from app.tools.freehand import FreehandTool +from app.tools.scale_underlay import ScaleUnderlayRefTool, ScaleUnderlayDragTool, scale_underlay_by_factor +from app.tools.leader import LeaderTool +from app.tools.revision_cloud import RevisionCloudTool +from app.tools.trim_tool import TrimTool +from app.tools.extend_tool import ExtendTool +from app.tools.fillet_tool import FilletTool +from app.tools.measure_tool import MeasureTool +from app.tools.move_tool import MoveTool +from app.tools.fillet_radius_tool import FilletRadiusTool +from app.tools.rotate_tool import RotateTool +from app.tools.mirror_tool import MirrorTool +from app.tools.scale_tool import ScaleTool +from app.tools.chamfer_tool import ChamferTool +from app import dxf_import try: from app.tools.dimension import DimensionTool except Exception: @@ -68,7 +89,7 @@ def apply(self): self.prefs["grid_opacity"]=op; self.prefs["grid_width_px"]=wd; self.prefs["grid_major_every"]=mj return op, wd, mj -APP_VERSION = "0.6.6-esc-theme-pan" +APP_VERSION = "0.6.8-cad-base" APP_TITLE = f"Auto-Fire {APP_VERSION}" PREF_DIR = os.path.join(os.path.expanduser("~"), "AutoFire") PREF_PATH = os.path.join(PREF_DIR, "preferences.json") @@ -123,14 +144,151 @@ def __init__(self, scene, devices_group, wires_group, sketch_group, overlay_grou self.current_proto = None self.current_kind = "other" self.ghost = None + self._mmb_panning = False + self._mmb_last = QtCore.QPointF() + # OSNAP toggles (read from prefs via window later) + self.osnap_end = True + self.osnap_mid = True + self.osnap_center = True + self.osnap_intersect = True + self.osnap_perp = False + self.osnap_marker = QtWidgets.QGraphicsEllipseItem(-3, -3, 6, 6) + pen = QtGui.QPen(QtGui.QColor('#ffd166')); pen.setCosmetic(True) + brush = QtGui.QBrush(QtGui.QColor('#ffd166')) + self.osnap_marker.setPen(pen); self.osnap_marker.setBrush(brush) + self.osnap_marker.setZValue(250) + self.osnap_marker.setVisible(False) + self.osnap_marker.setParentItem(self.overlay_group) + self.osnap_marker.setAcceptedMouseButtons(Qt.NoButton) + self.osnap_marker.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, False) + self.osnap_marker.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, False) self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse) + self.setResizeAnchor(QGraphicsView.AnchorUnderMouse) # crosshair - self.cross_v = QtWidgets.QGraphicsLineItem(); self.cross_h = QtWidgets.QGraphicsLineItem() - pen = QtGui.QPen(QtGui.QColor(150,150,160,150)); pen.setCosmetic(True); pen.setStyle(Qt.DashLine) - self.cross_v.setPen(pen); self.cross_h.setPen(pen) + self.cross_v = QtWidgets.QGraphicsLineItem() + self.cross_h = QtWidgets.QGraphicsLineItem() + pen_ch = QtGui.QPen(QtGui.QColor(150,150,160,150)) + pen_ch.setCosmetic(True); pen_ch.setStyle(Qt.DashLine) + self.cross_v.setPen(pen_ch); self.cross_h.setPen(pen_ch) self.cross_v.setParentItem(self.overlay_group); self.cross_h.setParentItem(self.overlay_group) + self.cross_v.setAcceptedMouseButtons(Qt.NoButton) + self.cross_h.setAcceptedMouseButtons(Qt.NoButton) + self.cross_v.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, False) + self.cross_h.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, False) + self.cross_v.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, False) + self.cross_h.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, False) self.show_crosshair = True + # snap cycling state + self._snap_candidates = [] + self._snap_index = 0 + + def _px_to_scene(self, px: float) -> float: + a = self.mapToScene(QtCore.QPoint(0, 0)) + b = self.mapToScene(QtCore.QPoint(int(px), int(px))) + return QtCore.QLineF(a, b).length() + + def _compute_osnap(self, p: QPointF) -> QtCore.QPointF | None: + # Search nearby items and return nearest enabled snap point + try: + thr_scene = self._px_to_scene(12) + box = QtCore.QRectF(p.x() - thr_scene, p.y() - thr_scene, thr_scene * 2, thr_scene * 2) + best = None; best_d = 1e18 + items = list(self.scene().items(box)) + # First pass: endpoint/mid/center + cand = [] + for it in items: + # skip overlay helpers + if it is self.osnap_marker: + continue + pts = [] + if isinstance(it, QtWidgets.QGraphicsLineItem): + l = it.line() + if self.osnap_end: + pts += [QtCore.QPointF(l.x1(), l.y1()), QtCore.QPointF(l.x2(), l.y2())] + if self.osnap_mid: + pts += [QtCore.QPointF((l.x1() + l.x2()) / 2.0, (l.y1() + l.y2()) / 2.0)] + elif isinstance(it, QtWidgets.QGraphicsRectItem): + if self.osnap_center: + r = it.rect(); pts = [QtCore.QPointF(r.center())] + elif isinstance(it, QtWidgets.QGraphicsEllipseItem): + if self.osnap_center: + r = it.rect(); pts = [QtCore.QPointF(r.center())] + elif isinstance(it, QtWidgets.QGraphicsPathItem): + pth = it.path(); n = pth.elementCount() + if n >= 1 and (self.osnap_end or self.osnap_mid): + e0 = pth.elementAt(0); eN = pth.elementAt(n - 1) + if self.osnap_end: + pts += [QtCore.QPointF(e0.x, e0.y), QtCore.QPointF(eN.x, eN.y)] + if self.osnap_mid and n >= 2: + e1 = pth.elementAt(1) + pts += [QtCore.QPointF((e0.x + e1.x) / 2.0, (e0.y + e1.y) / 2.0)] + for q in pts: + d = QtCore.QLineF(p, q).length() + if d <= thr_scene: + cand.append((d, q)) + # Intersection snaps between nearby lines + if self.osnap_intersect: + lines = [it for it in items if isinstance(it, QtWidgets.QGraphicsLineItem)] + n = len(lines) + for i in range(n): + li = QtCore.QLineF(lines[i].line()) + for j in range(i+1, n): + lj = QtCore.QLineF(lines[j].line()) + ip = QtCore.QPointF() + if li.intersect(lj, ip) != QtCore.QLineF.NoIntersection: + d = QtCore.QLineF(p, ip).length() + if d <= thr_scene: + cand.append((d, ip)) + # Perpendicular from point to line + if self.osnap_perp: + for it in items: + if not isinstance(it, QtWidgets.QGraphicsLineItem): + continue + l = QtCore.QLineF(it.line()) + # project point onto line segment + ax, ay, bx, by = l.x1(), l.y1(), l.x2(), l.y2() + vx, vy = bx-ax, by-ay + wx, wy = p.x()-ax, p.y()-ay + denom = vx*vx + vy*vy + if denom <= 1e-6: + continue + t = (wx*vx + wy*vy) / denom + if 0.0 <= t <= 1.0: + qx, qy = ax + t*vx, ay + t*vy + qpt = QtCore.QPointF(qx, qy) + d = QtCore.QLineF(p, qpt).length() + if d <= thr_scene: + cand.append((d, qpt)) + # Sort candidates by distance and deduplicate + cand.sort(key=lambda x: x[0]) + uniq = [] + seen = set() + for _, q in cand: + key = (round(q.x(),2), round(q.y(),2)) + if key in seen: continue + seen.add(key); uniq.append(q) + self._snap_candidates = uniq + self._snap_index = 0 + return uniq[0] if uniq else None + except Exception: + return None + + def _apply_osnap(self, p: QPointF) -> QtCore.QPointF: + sp = QtCore.QPointF(p) + q = None + if self.osnap_end or self.osnap_mid or self.osnap_center: + q = self._compute_osnap(sp) + if q is None: + sp = self.scene().snap(sp) + self.osnap_marker.setVisible(False) + return sp + else: + self.osnap_marker.setPos(q) + self.osnap_marker.setVisible(True) + return q + + def set_current_device(self, proto: dict): self.current_proto = proto @@ -164,15 +322,31 @@ def _ensure_ghost(self): "params":{"spacing_ft":spacing_ft}, "computed_radius_ft": spacing_ft/2.0, "px_per_ft": ppf}) + # placement coverage toggle + self.ghost.set_coverage_enabled(bool(self.win.prefs.get('show_placement_coverage', True))) def _update_crosshair(self, sp: QPointF): - if not self.show_crosshair: return + if not getattr(self, 'show_crosshair', True): + return rect = self.scene().sceneRect() self.cross_v.setLine(sp.x(), rect.top(), sp.x(), rect.bottom()) self.cross_h.setLine(rect.left(), sp.y(), rect.right(), sp.y()) dx_ft = sp.x()/self.win.px_per_ft dy_ft = sp.y()/self.win.px_per_ft - self.win.statusBar().showMessage(f"x={dx_ft:.2f} ft y={dy_ft:.2f} ft scale={self.win.px_per_ft:.2f} px/ft snap={self.win.snap_label}") + # Append draw info if applicable + draw_info = "" + try: + if getattr(self.win, 'draw', None) and getattr(self.win.draw, 'points', None): + pts = self.win.draw.points + if pts: + p0 = pts[-1] + vec = QtCore.QLineF(p0, sp) + length_ft = vec.length()/self.win.px_per_ft + ang = vec.angle() # 0 to 360 CCW from +x in Qt + draw_info = f" len={length_ft:.2f} ft ang={ang:.1f}°" + except Exception: + pass + self.win.statusBar().showMessage(f"x={dx_ft:.2f} ft y={dy_ft:.2f} ft scale={self.win.px_per_ft:.2f} px/ft snap={self.win.snap_label}{draw_info}") def wheelEvent(self, e: QtGui.QWheelEvent): s = 1.15 if e.angleDelta().y() > 0 else 1/1.15 @@ -184,10 +358,17 @@ def keyPressEvent(self, e: QtGui.QKeyEvent): self.setDragMode(QGraphicsView.ScrollHandDrag) self.setCursor(Qt.OpenHandCursor); e.accept(); return if k==Qt.Key_Shift: self.ortho=True; e.accept(); return - if k==Qt.Key_C: self.show_crosshair = not self.show_crosshair; e.accept(); return + # Crosshair toggle moved to 'X' (keyboard shortcut handled in MainWindow too) if k==Qt.Key_Escape: self.win.cancel_active_tool() e.accept(); return + if k==Qt.Key_Tab: + # cycle snap candidates + if getattr(self, '_snap_candidates', None): + self._snap_index = (self._snap_index + 1) % len(self._snap_candidates) + q = self._snap_candidates[self._snap_index] + self.osnap_marker.setPos(q); self.osnap_marker.setVisible(True) + e.accept(); return super().keyPressEvent(e) def keyReleaseEvent(self, e: QtGui.QKeyEvent): @@ -199,8 +380,19 @@ def keyReleaseEvent(self, e: QtGui.QKeyEvent): super().keyReleaseEvent(e) def mouseMoveEvent(self, e: QtGui.QMouseEvent): + # Middle-mouse panning (standard CAD feel) + if self._mmb_panning: + dx = e.position().x() - self._mmb_last.x() + dy = e.position().y() - self._mmb_last.y() + self._mmb_last = e.position() + h = self.horizontalScrollBar(); v = self.verticalScrollBar() + h.setValue(h.value() - int(dx)) + v.setValue(v.value() - int(dy)) + e.accept(); return + sp = self.mapToScene(e.position().toPoint()) - sp = self.scene().snap(sp) + sp = self._apply_osnap(sp) + self.last_scene_pos = sp self._update_crosshair(sp) if getattr(self.win, "draw", None): try: self.win.draw.on_mouse_move(sp, shift_ortho=self.ortho) @@ -208,13 +400,67 @@ def mouseMoveEvent(self, e: QtGui.QMouseEvent): if getattr(self.win, "dim_tool", None): try: self.win.dim_tool.on_mouse_move(sp) except Exception: pass + if getattr(self.win, "text_tool", None): + try: self.win.text_tool.on_mouse_move(sp) + except Exception: pass + if getattr(self.win, "mtext_tool", None) and getattr(self.win.mtext_tool, "active", False): + try: self.win.mtext_tool.on_mouse_move(sp) + except Exception: pass + if getattr(self.win, "freehand_tool", None) and getattr(self.win.freehand_tool, "active", False): + try: self.win.freehand_tool.on_mouse_move(sp) + except Exception: pass + if getattr(self.win, "measure_tool", None) and getattr(self.win.measure_tool, "active", False): + try: self.win.measure_tool.on_mouse_move(sp) + except Exception: pass + if getattr(self.win, "leader_tool", None) and getattr(self.win.leader_tool, "active", False): + try: self.win.leader_tool.on_mouse_move(sp) + except Exception: pass + if getattr(self.win, "cloud_tool", None) and getattr(self.win.cloud_tool, "active", False): + try: self.win.cloud_tool.on_mouse_move(sp) + except Exception: pass + if getattr(self.win, "trim_tool", None) and getattr(self.win.trim_tool, "active", False): + try: self.win.trim_tool.on_mouse_move(sp) + except Exception: pass + if getattr(self.win, "extend_tool", None) and getattr(self.win.extend_tool, "active", False): + try: self.win.extend_tool.on_mouse_move(sp) + except Exception: pass + if getattr(self.win, "fillet_tool", None) and getattr(self.win.fillet_tool, "active", False): + try: self.win.fillet_tool.on_mouse_move(sp) + except Exception: pass + if getattr(self.win, "fillet_radius_tool", None) and getattr(self.win.fillet_radius_tool, "active", False): + try: self.win.fillet_radius_tool.on_mouse_move(sp) + except Exception: pass + if getattr(self.win, "move_tool", None) and getattr(self.win.move_tool, "active", False): + try: self.win.move_tool.on_mouse_move(sp) + except Exception: pass + if getattr(self.win, "underlay_drag_tool", None) and getattr(self.win.underlay_drag_tool, "active", False): + try: self.win.underlay_drag_tool.on_mouse_move(sp) + except Exception: pass + if getattr(self.win, "rotate_tool", None) and getattr(self.win.rotate_tool, "active", False): + try: self.win.rotate_tool.on_mouse_move(sp) + except Exception: pass + if getattr(self.win, "mirror_tool", None) and getattr(self.win.mirror_tool, "active", False): + try: self.win.mirror_tool.on_mouse_move(sp) + except Exception: pass + if getattr(self.win, "scale_tool", None) and getattr(self.win.scale_tool, "active", False): + try: self.win.scale_tool.on_mouse_move(sp) + except Exception: pass if self.ghost: self.ghost.setPos(sp) super().mouseMoveEvent(e) def mousePressEvent(self, e: QtGui.QMouseEvent): win = self.win - sp = self.scene().snap(self.mapToScene(e.position().toPoint())) + sp = self._apply_osnap(self.mapToScene(e.position().toPoint())) + # If we're in hand-drag mode (Space held), defer to QGraphicsView to pan + if self.dragMode() == QGraphicsView.ScrollHandDrag: + return super().mousePressEvent(e) + # Middle mouse starts panning regardless of mode + if e.button() == Qt.MiddleButton: + self._mmb_panning = True + self._mmb_last = e.position() + self.setCursor(Qt.ClosedHandCursor) + e.accept(); return if e.button()==Qt.LeftButton: if getattr(win, "draw", None) and getattr(win.draw, "mode", 0) != 0: try: @@ -228,17 +474,153 @@ def mousePressEvent(self, e: QtGui.QMouseEvent): e.accept(); return except Exception: pass + if getattr(win, "text_tool", None) and getattr(win.text_tool, "active", False): + try: + if win.text_tool.on_click(sp): + win.push_history(); e.accept(); return + except Exception: + pass + if getattr(win, "mtext_tool", None) and getattr(win.mtext_tool, "active", False): + try: + if win.mtext_tool.on_click(sp): + win.push_history(); e.accept(); return + except Exception: + pass + if getattr(win, "freehand_tool", None) and getattr(win.freehand_tool, "active", False): + try: + # freehand starts on press; release will commit + if win.freehand_tool.on_press(sp): + win.push_history(); e.accept(); return + except Exception: + pass + if getattr(win, "leader_tool", None) and getattr(win.leader_tool, "active", False): + try: + if win.leader_tool.on_click(sp): + win.push_history(); e.accept(); return + except Exception: + pass + if getattr(win, "cloud_tool", None) and getattr(win.cloud_tool, "active", False): + try: + if win.cloud_tool.on_click(sp): + e.accept(); return + except Exception: + pass + if getattr(win, "measure_tool", None) and getattr(win.measure_tool, "active", False): + try: + if win.measure_tool.on_click(sp): + e.accept(); return + except Exception: + pass + if getattr(win, "trim_tool", None) and getattr(win.trim_tool, "active", False): + try: + if win.trim_tool.on_click(sp): + win.push_history(); e.accept(); return + except Exception: + pass + if getattr(win, "extend_tool", None) and getattr(win.extend_tool, "active", False): + try: + if win.extend_tool.on_click(sp): + win.push_history(); e.accept(); return + except Exception: + pass + if getattr(win, "fillet_tool", None) and getattr(win.fillet_tool, "active", False): + try: + if win.fillet_tool.on_click(sp): + win.push_history(); e.accept(); return + except Exception: + pass + if getattr(win, "move_tool", None) and getattr(win.move_tool, "active", False): + try: + if win.move_tool.on_click(sp): + win.push_history(); e.accept(); return + except Exception: + pass + if getattr(win, "rotate_tool", None) and getattr(win.rotate_tool, "active", False): + try: + if win.rotate_tool.on_click(sp): + win.push_history(); e.accept(); return + except Exception: + pass + if getattr(win, "mirror_tool", None) and getattr(win.mirror_tool, "active", False): + try: + if win.mirror_tool.on_click(sp): + win.push_history(); e.accept(); return + except Exception: + pass + if getattr(win, "scale_tool", None) and getattr(win.scale_tool, "active", False): + try: + if win.scale_tool.on_click(sp): + win.push_history(); e.accept(); return + except Exception: + pass + if getattr(win, "chamfer_tool", None) and getattr(win.chamfer_tool, "active", False): + try: + if win.chamfer_tool.on_click(sp): + win.push_history(); e.accept(); return + except Exception: + pass + if getattr(win, "underlay_drag_tool", None) and getattr(win.underlay_drag_tool, "active", False): + try: + if win.underlay_drag_tool.on_click(sp): + win.push_history(); e.accept(); return + except Exception: + pass + if getattr(win, "fillet_radius_tool", None) and getattr(win.fillet_radius_tool, "active", False): + try: + if win.fillet_radius_tool.on_click(sp): + win.push_history(); e.accept(); return + except Exception: + pass + # Prefer selection when clicking over existing selectable content + try: + under_items = self.items(e.position().toPoint()) + for it in under_items: + if it in (self.cross_v, self.cross_h, self.osnap_marker): + continue + if isinstance(it, QtWidgets.QGraphicsItem) and (it.flags() & QtWidgets.QGraphicsItem.ItemIsSelectable): + return super().mousePressEvent(e) + except Exception: + pass if self.current_proto: d = self.current_proto it = DeviceItem(sp.x(), sp.y(), d["symbol"], d["name"], d.get("manufacturer",""), d.get("part_number","")) if self.ghost and self.current_kind in ("strobe","speaker","smoke"): it.set_coverage(self.ghost.coverage) + # Respect global overlay toggle on placement + try: it.set_coverage_enabled(bool(self.win.show_coverage)) + except Exception: pass it.setParentItem(self.devices_group) win.push_history(); e.accept(); return + else: + # Clear selection when clicking empty space with no active tool + self.scene().clearSelection() elif e.button()==Qt.RightButton: win.canvas_menu(e.globalPosition().toPoint()); e.accept(); return super().mousePressEvent(e) + def mouseReleaseEvent(self, e: QtGui.QMouseEvent): + if e.button() == Qt.MiddleButton and self._mmb_panning: + self._mmb_panning = False + self.unsetCursor() + e.accept(); return + # If hand-drag mode (Space), let base handle release + if self.dragMode() == QGraphicsView.ScrollHandDrag: + return super().mouseReleaseEvent(e) + if e.button() == Qt.LeftButton: + if getattr(self.win, "freehand_tool", None) and getattr(self.win.freehand_tool, "active", False): + try: + if self.win.freehand_tool.on_release(self.last_scene_pos): + self.win.push_history(); e.accept(); return + except Exception: + pass + if getattr(self.win, "cloud_tool", None) and getattr(self.win.cloud_tool, "active", False): + try: + if self.win.cloud_tool.finish(): + self.win.push_history(); e.accept(); return + except Exception: + pass + super().mouseReleaseEvent(e) + class MainWindow(QMainWindow): def __init__(self): super().__init__() @@ -253,9 +635,16 @@ def __init__(self): self.prefs.setdefault("grid_opacity", 0.25) self.prefs.setdefault("grid_width_px", 0.0) self.prefs.setdefault("grid_major_every", 5) + self.prefs.setdefault("print_in_per_ft", 0.125) + self.prefs.setdefault("print_dpi", 300) + self.prefs.setdefault("page_size", "Letter") + self.prefs.setdefault("page_orient", "Landscape") + self.prefs.setdefault("page_margin_in", 0.5) + self.prefs.setdefault("show_placement_coverage", True) save_prefs(self.prefs) - self.apply_dark_theme() # << restore theme early + # Theme + self.set_theme(self.prefs.get("theme", "dark")) # apply early self.devices_all = catalog.load_catalog() @@ -273,10 +662,39 @@ def __init__(self): self.layer_overlay = QtWidgets.QGraphicsItemGroup(); self.layer_overlay.setZValue(200); self.scene.addItem(self.layer_overlay) self.view = CanvasView(self.scene, self.layer_devices, self.layer_wires, self.layer_sketch, self.layer_overlay, self) + self.page_frame = None + self.title_block = None + self.paper_scene = None + self.in_paper_space = False + # Auto-add a default page frame on first run (can be removed via Layout menu) + if bool(self.prefs.setdefault('auto_page_frame', True)): + try: + pf = PageFrame(self.px_per_ft, size_name=self.prefs.get('page_size','Letter'), orientation=self.prefs.get('page_orient','Landscape'), margin_in=self.prefs.get('page_margin_in',0.5)) + pf.setParentItem(self.layer_underlay) + self.page_frame = pf + except Exception: + pass # CAD tools self.draw = draw_tools.DrawController(self, self.layer_sketch) self.dim_tool = DimensionTool(self, self.layer_overlay) + self.text_tool = TextTool(self, self.layer_sketch) + self.mtext_tool = MTextTool(self, self.layer_sketch) + self.freehand_tool = FreehandTool(self, self.layer_sketch) + self.underlay_ref_tool = ScaleUnderlayRefTool(self, self.layer_underlay) + self.underlay_drag_tool = ScaleUnderlayDragTool(self, self.layer_underlay) + self.leader_tool = LeaderTool(self, self.layer_overlay) + self.cloud_tool = RevisionCloudTool(self, self.layer_overlay) + self.trim_tool = TrimTool(self) + self.extend_tool = ExtendTool(self) + self.fillet_tool = FilletTool(self) + self.measure_tool = MeasureTool(self, self.layer_overlay) + self.move_tool = MoveTool(self) + self.rotate_tool = RotateTool(self) + self.mirror_tool = MirrorTool(self) + self.scale_tool = ScaleTool(self) + self.chamfer_tool = ChamferTool(self) + self.fillet_radius_tool = FilletRadiusTool(self, self.layer_sketch) # Menus menubar = self.menuBar() @@ -285,40 +703,170 @@ def __init__(self): m_file.addAction("Open…", self.open_project, QtGui.QKeySequence.Open) m_file.addAction("Save As…", self.save_project_as, QtGui.QKeySequence.SaveAs) m_file.addSeparator() + imp = m_file.addMenu("Import") + imp.addAction("DXF Underlay…", self.import_dxf_underlay) + imp.addAction("PDF Underlay…", self.import_pdf_underlay) + exp = m_file.addMenu("Export") + exp.addAction("PNG…", self.export_png) + exp.addAction("PDF…", self.export_pdf) + exp.addAction("Device Schedule (CSV)…", self.export_device_schedule_csv) + exp.addAction("Place Symbol Legend", self.place_symbol_legend) + # Settings submenu (moved under File) + m_settings = m_file.addMenu("Settings") + theme = m_settings.addMenu("Theme") + theme.addAction("Dark", lambda: self.set_theme("dark")) + theme.addAction("Light", lambda: self.set_theme("light")) + theme.addAction("High Contrast (Dark)", lambda: self.set_theme("high_contrast")) + m_file.addSeparator() m_file.addAction("Quit", self.close, QtGui.QKeySequence.Quit) + # Edit menu + m_edit = menubar.addMenu("&Edit") + act_undo = QtGui.QAction("Undo", self); act_undo.setShortcut(QtGui.QKeySequence.Undo); act_undo.triggered.connect(self.undo); m_edit.addAction(act_undo) + act_redo = QtGui.QAction("Redo", self); act_redo.setShortcut(QtGui.QKeySequence.Redo); act_redo.triggered.connect(self.redo); m_edit.addAction(act_redo) + m_edit.addSeparator() + act_del = QtGui.QAction("Delete", self); act_del.setShortcut(Qt.Key_Delete); act_del.triggered.connect(self.delete_selection); m_edit.addAction(act_del) + m_tools = menubar.addMenu("&Tools") def add_tool(name, cb): act = QtGui.QAction(name, self); act.triggered.connect(cb); m_tools.addAction(act); return act - self.act_draw_line = add_tool("Draw Line", lambda: self.draw.set_mode(draw_tools.DrawMode.LINE)) - self.act_draw_rect = add_tool("Draw Rect", lambda: self.draw.set_mode(draw_tools.DrawMode.RECT)) - self.act_draw_circle = add_tool("Draw Circle", lambda: self.draw.set_mode(draw_tools.DrawMode.CIRCLE)) - self.act_draw_poly = add_tool("Draw Polyline",lambda: self.draw.set_mode(draw_tools.DrawMode.POLYLINE)) + self.act_draw_line = add_tool("Draw Line", lambda: (setattr(self.draw, 'layer', self.layer_sketch), self.draw.set_mode(draw_tools.DrawMode.LINE))) + self.act_draw_rect = add_tool("Draw Rect", lambda: (setattr(self.draw, 'layer', self.layer_sketch), self.draw.set_mode(draw_tools.DrawMode.RECT))) + self.act_draw_circle = add_tool("Draw Circle", lambda: (setattr(self.draw, 'layer', self.layer_sketch), self.draw.set_mode(draw_tools.DrawMode.CIRCLE))) + self.act_draw_poly = add_tool("Draw Polyline",lambda: (setattr(self.draw, 'layer', self.layer_sketch), self.draw.set_mode(draw_tools.DrawMode.POLYLINE))) + self.act_draw_arc3 = add_tool("Draw Arc (3-Point)", lambda: (setattr(self.draw, 'layer', self.layer_sketch), self.draw.set_mode(draw_tools.DrawMode.ARC3))) + self.act_draw_wire = add_tool("Draw Wire", lambda: self._set_wire_mode()) + self.act_text = add_tool("Text", self.start_text) + self.act_mtext = add_tool("MText", self.start_mtext) + self.act_freehand = add_tool("Freehand", self.start_freehand) + self.act_leader = add_tool("Leader", self.start_leader) + self.act_cloud = add_tool("Revision Cloud", self.start_cloud) m_tools.addSeparator() m_tools.addAction("Dimension (D)", self.start_dimension) + m_tools.addAction("Measure (M)", self.start_measure) + + # (Settings moved under File) + + # Layout / Paper Space + m_layout = menubar.addMenu("&Layout") + m_layout.addAction("Add Page Frame…", self.add_page_frame) + m_layout.addAction("Remove Page Frame", self.remove_page_frame) + m_layout.addAction("Add/Update Title Block…", self.add_or_update_title_block) + m_layout.addAction("Page Setup…", self.page_setup_dialog) + m_layout.addAction("Add Viewport", self.add_viewport) + scale_menu = m_layout.addMenu("Print Scale") + def add_scale(label, inches_per_ft): + act = QtGui.QAction(label, self) + act.triggered.connect(lambda v=inches_per_ft: self.set_print_scale(v)) + scale_menu.addAction(act) + for lbl, v in [("1/16\" = 1'", 1.0/16.0), ("3/32\" = 1'", 3.0/32.0), ("1/8\" = 1'", 1.0/8.0), ("3/16\" = 1'", 3.0/16.0), ("1/4\" = 1'", 0.25), ("3/8\" = 1'", 0.375), ("1/2\" = 1'", 0.5), ("1\" = 1'", 1.0)]: + add_scale(lbl, v) + scale_menu.addAction("Custom…", self.set_print_scale_custom) + # Underlay tools + m_underlay = m_layout.addMenu("Underlay") + m_underlay.addAction("Scale by Reference…", self.start_underlay_scale_ref) + m_underlay.addAction("Scale by Factor…", self.underlay_scale_factor) + m_underlay.addAction("Scale by Drag…", self.start_underlay_scale_drag) + m_underlay.addAction("Center Underlay In View", self.center_underlay_in_view) + m_underlay.addAction("Move Underlay To Origin", self.move_underlay_to_origin) + m_underlay.addAction("Reset Underlay Transform", self.reset_underlay_transform) + + # Modify menu + m_modify = menubar.addMenu("&Modify") + m_modify.addAction("Offset Selected…", self.offset_selected_dialog) + m_modify.addAction("Trim Lines", self.start_trim) + m_modify.addAction("Finish Trim", self.finish_trim) + m_modify.addAction("Extend Lines", self.start_extend) + m_modify.addAction("Fillet (Corner)", self.start_fillet) + m_modify.addAction("Fillet (Radius)…", self.start_fillet_radius) + m_modify.addAction("Move", self.start_move) + m_modify.addAction("Copy", self.start_copy) + m_modify.addAction("Rotate", self.start_rotate) + m_modify.addAction("Mirror", self.start_mirror) + m_modify.addAction("Scale", self.start_scale) + m_modify.addAction("Chamfer…", self.start_chamfer) + + # Help menu + m_help = menubar.addMenu("&Help") + m_help.addAction("User Guide", self.show_user_guide) + m_help.addAction("Keyboard Shortcuts", self.show_shortcuts) + m_help.addSeparator() + m_help.addAction("About Auto-Fire", self.show_about) m_view = menubar.addMenu("&View") self.act_view_grid = QtGui.QAction("Grid", self, checkable=True); self.act_view_grid.setChecked(True); self.act_view_grid.toggled.connect(self.toggle_grid); m_view.addAction(self.act_view_grid) self.act_view_snap = QtGui.QAction("Snap", self, checkable=True); self.act_view_snap.setChecked(self.scene.snap_enabled); self.act_view_snap.toggled.connect(self.toggle_snap); m_view.addAction(self.act_view_snap) - self.act_view_cross = QtGui.QAction("Crosshair (C)", self, checkable=True); self.act_view_cross.setChecked(True); self.act_view_cross.toggled.connect(self.toggle_crosshair); m_view.addAction(self.act_view_cross) + self.act_view_cross = QtGui.QAction("Crosshair (X)", self, checkable=True); self.act_view_cross.setChecked(True); self.act_view_cross.toggled.connect(self.toggle_crosshair); m_view.addAction(self.act_view_cross) + self.act_paperspace = QtGui.QAction("Paper Space Mode", self, checkable=True); self.act_paperspace.setChecked(False); self.act_paperspace.toggled.connect(self.toggle_paper_space); m_view.addAction(self.act_paperspace) + self.show_coverage = bool(self.prefs.get('show_coverage', True)) + self.act_view_cov = QtGui.QAction("Show Device Coverage", self, checkable=True); self.act_view_cov.setChecked(self.show_coverage); self.act_view_cov.toggled.connect(self.toggle_coverage); m_view.addAction(self.act_view_cov) + self.act_view_place_cov = QtGui.QAction("Show Coverage During Placement", self, checkable=True) + self.act_view_place_cov.setChecked(bool(self.prefs.get('show_placement_coverage', True))) + self.act_view_place_cov.toggled.connect(self.toggle_placement_coverage) + m_view.addAction(self.act_view_place_cov) m_view.addSeparator() act_scale = QtGui.QAction("Set Pixels per Foot…", self); act_scale.triggered.connect(self.set_px_per_ft); m_view.addAction(act_scale) act_gridstyle = QtGui.QAction("Grid Style…", self); act_gridstyle.triggered.connect(self.grid_style_dialog); m_view.addAction(act_gridstyle) - - # Toolbar minimal - tb = QToolBar("Main"); tb.setIconSize(QSize(16,16)); self.addToolBar(tb) - tb.addAction(self.act_view_grid); tb.addAction(self.act_view_snap); tb.addAction(self.act_view_cross) - - # Status bar Grid opacity slider + # Quick snap step presets (guardrail: snap to fixed inch steps or grid) + snap_menu = m_view.addMenu("Snap Step") + def add_snap(label, inches): + act = QtGui.QAction(label, self) + act.triggered.connect(lambda v=inches: self.set_snap_inches(v)) + snap_menu.addAction(act) + add_snap("Grid (default)", 0.0) + add_snap("3 inches", 3.0) + add_snap("6 inches", 6.0) + add_snap("12 inches", 12.0) + add_snap("24 inches", 24.0) + + # Object Snaps (OSNAP) toggles in View menu + m_view.addSeparator() + m_osnap = m_view.addMenu("Object Snaps") + self.act_os_end = QtGui.QAction("Endpoint", self, checkable=True) + self.act_os_mid = QtGui.QAction("Midpoint", self, checkable=True) + self.act_os_cen = QtGui.QAction("Center", self, checkable=True) + self.act_os_int = QtGui.QAction("Intersection", self, checkable=True) + self.act_os_perp = QtGui.QAction("Perpendicular", self, checkable=True) + self.act_os_end.setChecked(bool(self.prefs.get('osnap_end', True))) + self.act_os_mid.setChecked(bool(self.prefs.get('osnap_mid', True))) + self.act_os_cen.setChecked(bool(self.prefs.get('osnap_center', True))) + self.act_os_int.setChecked(bool(self.prefs.get('osnap_intersect', True))) + self.act_os_perp.setChecked(bool(self.prefs.get('osnap_perp', False))) + self.act_os_end.toggled.connect(lambda v: self._set_osnap('end', v)) + self.act_os_mid.toggled.connect(lambda v: self._set_osnap('mid', v)) + self.act_os_cen.toggled.connect(lambda v: self._set_osnap('center', v)) + self.act_os_int.toggled.connect(lambda v: self._set_osnap('intersect', v)) + self.act_os_perp.toggled.connect(lambda v: self._set_osnap('perp', v)) + m_osnap.addAction(self.act_os_end) + m_osnap.addAction(self.act_os_mid) + m_osnap.addAction(self.act_os_cen) + m_osnap.addAction(self.act_os_int) + m_osnap.addAction(self.act_os_perp) + # apply initial states to view + self._set_osnap('end', self.act_os_end.isChecked()) + self._set_osnap('mid', self.act_os_mid.isChecked()) + self._set_osnap('center', self.act_os_cen.isChecked()) + self._set_osnap('intersect', self.act_os_int.isChecked()) + self._set_osnap('perp', self.act_os_perp.isChecked()) + + # No toolbars for base feel; reserve top bar for AutoFire items later + + # Status bar Grid controls sb = self.statusBar() - wrap = QWidget(); lay = QHBoxLayout(wrap); lay.setContentsMargins(6,0,6,0); lay.setSpacing(6) + wrap = QWidget(); lay = QHBoxLayout(wrap); lay.setContentsMargins(6,0,6,0); lay.setSpacing(10) + # Grid opacity control lay.addWidget(QLabel("Grid")) self.slider_grid = QtWidgets.QSlider(Qt.Horizontal); self.slider_grid.setMinimum(10); self.slider_grid.setMaximum(100) - self.slider_grid.setFixedWidth(120) + self.slider_grid.setFixedWidth(110) cur_op = float(self.prefs.get("grid_opacity", 0.25)) self.slider_grid.setValue(int(max(10, min(100, round(cur_op*100))))) self.lbl_gridp = QLabel(f"{int(self.slider_grid.value())}%") lay.addWidget(self.slider_grid); lay.addWidget(self.lbl_gridp) + # Grid size control + lay.addWidget(QLabel("Size")) + self.spin_grid_status = QSpinBox(); self.spin_grid_status.setRange(2, 500); self.spin_grid_status.setValue(self.scene.grid_size) + self.spin_grid_status.setFixedWidth(70) + lay.addWidget(self.spin_grid_status) sb.addPermanentWidget(wrap) def _apply_grid_op(val:int): op = max(0.10, min(1.00, val/100.0)) @@ -327,12 +875,26 @@ def _apply_grid_op(val:int): save_prefs(self.prefs) self.lbl_gridp.setText(f"{int(val)}%") self.slider_grid.valueChanged.connect(_apply_grid_op) + self.spin_grid_status.valueChanged.connect(self.change_grid_size) + + # Command bar + cmd_wrap = QWidget(); cmd_l = QHBoxLayout(cmd_wrap); cmd_l.setContentsMargins(6,0,6,0); cmd_l.setSpacing(6) + cmd_l.addWidget(QLabel("Cmd:")) + self.cmd = QLineEdit(); self.cmd.setPlaceholderText("Type command (e.g., L, RECT, MOVE)…") + self.cmd.returnPressed.connect(self._run_command) + cmd_l.addWidget(self.cmd) + sb.addPermanentWidget(cmd_wrap, 1) + + # Toolbars removed: keeping top bar clean for AutoFire-specific UI later # Left panel (device palette) self._build_left_panel() # Right dock: Layers & Properties self._build_layers_and_props_dock() + # DXF Layers dock + self._dxf_layers = {} + self._build_dxf_layers_dock() # Shortcuts QtGui.QShortcut(QtGui.QKeySequence("D"), self, activated=self.start_dimension) @@ -344,6 +906,11 @@ def _apply_grid_op(val:int): self.history = []; self.history_index = -1 self.push_history() + # Fit view after UI ready + try: + QtCore.QTimer.singleShot(0, self.fit_view_to_content) + except Exception: + pass # ---------- Theme ---------- def apply_dark_theme(self): @@ -364,11 +931,77 @@ def apply_dark_theme(self): pal.setColor(QtGui.QPalette.ColorRole.Highlight, QtGui.QColor(66,133,244)) pal.setColor(QtGui.QPalette.ColorRole.HighlightedText, QtGui.QColor(255,255,255)) app.setPalette(pal) + self._apply_menu_stylesheet(contrast_boost=False) + + def apply_light_theme(self): + app = QtWidgets.QApplication.instance() + pal = app.palette() + bg = QtGui.QColor(245,246,248) + base = QtGui.QColor(255,255,255) + text = QtGui.QColor(20,20,25) + pal.setColor(QtGui.QPalette.ColorRole.Window, bg) + pal.setColor(QtGui.QPalette.ColorRole.Base, base) + pal.setColor(QtGui.QPalette.ColorRole.AlternateBase, QtGui.QColor(240,240,245)) + pal.setColor(QtGui.QPalette.ColorRole.Text, text) + pal.setColor(QtGui.QPalette.ColorRole.WindowText, text) + pal.setColor(QtGui.QPalette.ColorRole.Button, base) + pal.setColor(QtGui.QPalette.ColorRole.ButtonText, text) + pal.setColor(QtGui.QPalette.ColorRole.ToolTipBase, base) + pal.setColor(QtGui.QPalette.ColorRole.ToolTipText, text) + pal.setColor(QtGui.QPalette.ColorRole.Highlight, QtGui.QColor(33,99,255)) + pal.setColor(QtGui.QPalette.ColorRole.HighlightedText, QtGui.QColor(255,255,255)) + app.setPalette(pal) + self._apply_menu_stylesheet(contrast_boost=False) + + def apply_high_contrast_theme(self): + app = QtWidgets.QApplication.instance() + pal = app.palette() + bg = QtGui.QColor(18,18,18) + base = QtGui.QColor(10,10,12) + text = QtGui.QColor(245,245,245) + pal.setColor(QtGui.QPalette.ColorRole.Window, bg) + pal.setColor(QtGui.QPalette.ColorRole.Base, base) + pal.setColor(QtGui.QPalette.ColorRole.AlternateBase, QtGui.QColor(28,28,32)) + pal.setColor(QtGui.QPalette.ColorRole.Text, text) + pal.setColor(QtGui.QPalette.ColorRole.WindowText, text) + pal.setColor(QtGui.QPalette.ColorRole.Button, QtGui.QColor(26,26,30)) + pal.setColor(QtGui.QPalette.ColorRole.ButtonText, text) + pal.setColor(QtGui.QPalette.ColorRole.ToolTipBase, QtGui.QColor(30,30,30)) + pal.setColor(QtGui.QPalette.ColorRole.ToolTipText, QtGui.QColor(255,255,255)) + pal.setColor(QtGui.QPalette.ColorRole.Highlight, QtGui.QColor(90,160,255)) + pal.setColor(QtGui.QPalette.ColorRole.HighlightedText, QtGui.QColor(0,0,0)) + app.setPalette(pal) + self._apply_menu_stylesheet(contrast_boost=True) + + def set_theme(self, name: str): + name = (name or "dark").lower() + if name == "light": self.apply_light_theme() + elif name in ("hc","high","high_contrast","high-contrast"): self.apply_high_contrast_theme() + else: self.apply_dark_theme() + self.prefs["theme"] = name + save_prefs(self.prefs) + + def _apply_menu_stylesheet(self, contrast_boost: bool): + if contrast_boost: + ss = """ + QMenuBar { background: #0f1113; color: #eaeaea; } + QMenuBar::item:selected { background: #2f61ff; color: #ffffff; } + QMenu { background: #14161a; color: #f0f0f0; border: 1px solid #364049; } + QMenu::item:selected { background: #2f61ff; color: #ffffff; } + QToolBar { background: #0f1113; border-bottom: 1px solid #364049; } + QStatusBar { background: #0f1113; color: #cfd8e3; } + """ + else: + ss = """ + QMenuBar { background: transparent; } + QMenu { border: 1px solid rgba(0,0,0,40); } + """ + self.setStyleSheet(ss) # ---------- UI building ---------- def _build_left_panel(self): + # Device Palette as dockable panel left = QWidget(); ll = QVBoxLayout(left) - ll.addWidget(QLabel("Device Palette")) self.search = QLineEdit(); self.search.setPlaceholderText("Search name / part number…") self.cmb_mfr = QComboBox(); self.cmb_type = QComboBox() ll_top = QHBoxLayout(); ll_top.addWidget(QLabel("Manufacturer:")); ll_top.addWidget(self.cmb_mfr) @@ -378,8 +1011,11 @@ def _build_left_panel(self): self._populate_filters() - splitter = QtWidgets.QSplitter(); splitter.addWidget(left); splitter.addWidget(self.view); splitter.setStretchFactor(1,1) - container = QWidget(); lay = QHBoxLayout(container); lay.addWidget(splitter); self.setCentralWidget(container) + dock = QDockWidget("Device Palette", self) + dock.setWidget(left) + self.addDockWidget(Qt.LeftDockWidgetArea, dock) + # Ensure central widget is just the view + self.setCentralWidget(self.view) self.search.textChanged.connect(self._refresh_device_list) self.cmb_mfr.currentIndexChanged.connect(self._refresh_device_list) @@ -387,33 +1023,44 @@ def _build_left_panel(self): self.list.itemClicked.connect(self.choose_device) self._refresh_device_list() + # OSNAP initial states are wired in View → Object Snaps + + # CAD-style shortcuts + QtGui.QShortcut(QtGui.QKeySequence("L"), self, activated=lambda: (setattr(self.draw,'layer', self.layer_sketch), self.draw.set_mode(draw_tools.DrawMode.LINE))) + QtGui.QShortcut(QtGui.QKeySequence("R"), self, activated=lambda: (setattr(self.draw,'layer', self.layer_sketch), self.draw.set_mode(draw_tools.DrawMode.RECT))) + QtGui.QShortcut(QtGui.QKeySequence("P"), self, activated=lambda: (setattr(self.draw,'layer', self.layer_sketch), self.draw.set_mode(draw_tools.DrawMode.POLYLINE))) + QtGui.QShortcut(QtGui.QKeySequence("A"), self, activated=lambda: (setattr(self.draw,'layer', self.layer_sketch), self.draw.set_mode(draw_tools.DrawMode.ARC3))) + QtGui.QShortcut(QtGui.QKeySequence("C"), self, activated=lambda: (setattr(self.draw,'layer', self.layer_sketch), self.draw.set_mode(draw_tools.DrawMode.CIRCLE))) + QtGui.QShortcut(QtGui.QKeySequence("W"), self, activated=self._set_wire_mode) + QtGui.QShortcut(QtGui.QKeySequence("T"), self, activated=self.start_text) + QtGui.QShortcut(QtGui.QKeySequence("M"), self, activated=self.start_measure) + QtGui.QShortcut(QtGui.QKeySequence("O"), self, activated=self.offset_selected_dialog) + # Crosshair toggle moved to X to free C for Circle + QtGui.QShortcut(QtGui.QKeySequence("X"), self, activated=lambda: self.toggle_crosshair(not self.view.show_crosshair)) + def _build_layers_and_props_dock(self): - dock = QDockWidget("Layers & Properties", self) + dock = QDockWidget("Properties", self) panel = QWidget(); form = QVBoxLayout(panel); form.setContentsMargins(8,8,8,8); form.setSpacing(6) - # layer toggles + # layer toggles (visibility) form.addWidget(QLabel("Layers")) self.chk_underlay = QCheckBox("Underlay"); self.chk_underlay.setChecked(True); self.chk_underlay.toggled.connect(lambda v: self.layer_underlay.setVisible(v)); form.addWidget(self.chk_underlay) self.chk_sketch = QCheckBox("Sketch"); self.chk_sketch.setChecked(True); self.chk_sketch.toggled.connect(lambda v: self.layer_sketch.setVisible(v)); form.addWidget(self.chk_sketch) self.chk_wires = QCheckBox("Wiring"); self.chk_wires.setChecked(True); self.chk_wires.toggled.connect(lambda v: self.layer_wires.setVisible(v)); form.addWidget(self.chk_wires) self.chk_devices = QCheckBox("Devices"); self.chk_devices.setChecked(True); self.chk_devices.toggled.connect(lambda v: self.layer_devices.setVisible(v)); form.addWidget(self.chk_devices) - # grid size - form.addSpacing(6); form.addWidget(QLabel("Grid Size")) - self.spin_grid = QSpinBox(); self.spin_grid.setRange(2, 500); self.spin_grid.setValue(self.scene.grid_size) - self.spin_grid.valueChanged.connect(self.change_grid_size) - form.addWidget(self.spin_grid) - # properties form.addSpacing(10); lblp = QLabel("Device Properties"); lblp.setStyleSheet("font-weight:600;"); form.addWidget(lblp) grid = QtWidgets.QGridLayout(); grid.setHorizontalSpacing(8); grid.setVerticalSpacing(4) r = 0 grid.addWidget(QLabel("Label"), r, 0); self.prop_label = QLineEdit(); grid.addWidget(self.prop_label, r, 1); r+=1 + grid.addWidget(QLabel("Show Coverage"), r, 0); self.prop_showcov = QCheckBox(); self.prop_showcov.setChecked(True); grid.addWidget(self.prop_showcov, r, 1); r+=1 grid.addWidget(QLabel("Offset X (ft)"), r, 0); self.prop_offx = QDoubleSpinBox(); self.prop_offx.setRange(-500,500); self.prop_offx.setDecimals(2); grid.addWidget(self.prop_offx, r, 1); r+=1 grid.addWidget(QLabel("Offset Y (ft)"), r, 0); self.prop_offy = QDoubleSpinBox(); self.prop_offy.setRange(-500,500); self.prop_offy.setDecimals(2); grid.addWidget(self.prop_offy, r, 1); r+=1 grid.addWidget(QLabel("Mount"), r, 0); self.prop_mount = QComboBox(); self.prop_mount.addItems(["ceiling","wall"]); grid.addWidget(self.prop_mount, r, 1); r+=1 grid.addWidget(QLabel("Coverage Mode"), r, 0); self.prop_mode = QComboBox(); self.prop_mode.addItems(["none","strobe","speaker","smoke"]); grid.addWidget(self.prop_mode, r, 1); r+=1 + grid.addWidget(QLabel("Candela (strobe)"), r, 0); self.prop_candela = QComboBox(); self.prop_candela.addItems(["(custom)","15","30","75","95","110","135","185"]); grid.addWidget(self.prop_candela, r, 1); r+=1 grid.addWidget(QLabel("Size (ft)"), r, 0); self.prop_size = QDoubleSpinBox(); self.prop_size.setRange(0,1000); self.prop_size.setDecimals(2); self.prop_size.setSingleStep(1.0); grid.addWidget(self.prop_size, r, 1); r+=1 form.addLayout(grid) @@ -426,13 +1073,126 @@ def _build_layers_and_props_dock(self): self.prop_label.editingFinished.connect(self._apply_label_offset_live) self.prop_offx.valueChanged.connect(self._apply_label_offset_live) self.prop_offy.valueChanged.connect(self._apply_label_offset_live) + self.prop_mode.currentTextChanged.connect(self._on_mode_changed_props) panel.setLayout(form); dock.setWidget(panel); self.addDockWidget(Qt.RightDockWidgetArea, dock) + self.dock_layers_props = dock def _enable_props(self, on: bool): for w in (self.prop_label, self.prop_offx, self.prop_offy, self.prop_mount, self.prop_mode, self.prop_size, self.btn_apply_props): w.setEnabled(on) + # ---------- DXF layers dock ---------- + def _build_dxf_layers_dock(self): + dock = QDockWidget("DXF Layers", self) + self.dxf_panel = QWidget(); v = QVBoxLayout(self.dxf_panel); v.setContentsMargins(8,8,8,8); v.setSpacing(6) + self.lst_dxf = QtWidgets.QListWidget() + self.lst_dxf.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection) + v.addWidget(self.lst_dxf) + # Controls row + row1 = QHBoxLayout(); + self.btn_dxf_color = QPushButton("Set Color…"); self.btn_dxf_reset = QPushButton("Reset Color") + row1.addWidget(self.btn_dxf_color); row1.addWidget(self.btn_dxf_reset) + wrap1 = QWidget(); wrap1.setLayout(row1); v.addWidget(wrap1) + # Flags row + row2 = QHBoxLayout(); + self.chk_dxf_lock = QCheckBox("Lock Selected"); self.chk_dxf_print = QCheckBox("Print Selected") + self.chk_dxf_print.setChecked(True) + row2.addWidget(self.chk_dxf_lock); row2.addWidget(self.chk_dxf_print) + wrap2 = QWidget(); wrap2.setLayout(row2); v.addWidget(wrap2) + dock.setWidget(self.dxf_panel) + self.addDockWidget(Qt.RightDockWidgetArea, dock) + self.dock_dxf_layers = dock + self.btn_dxf_color.clicked.connect(self._pick_dxf_color) + self.btn_dxf_reset.clicked.connect(self._reset_dxf_color) + self.lst_dxf.itemChanged.connect(self._toggle_dxf_layer) + self.chk_dxf_lock.toggled.connect(self._lock_dxf_layer) + self.chk_dxf_print.toggled.connect(self._print_dxf_layer) + self._refresh_dxf_layers_dock() + # Tabify with properties dock if available + if hasattr(self, 'dock_layers_props'): + try: + self.tabifyDockWidget(self.dock_layers_props, self.dock_dxf_layers) + except Exception: + pass + + def _refresh_dxf_layers_dock(self): + if not hasattr(self, 'lst_dxf'): return + self.lst_dxf.blockSignals(True) + self.lst_dxf.clear() + for name, grp in sorted((self._dxf_layers or {}).items()): + it = QListWidgetItem(name) + it.setFlags(it.flags() | Qt.ItemIsUserCheckable) + it.setCheckState(Qt.Checked if grp.isVisible() else Qt.Unchecked) + self.lst_dxf.addItem(it) + self.lst_dxf.blockSignals(False) + + def _get_dxf_group(self, name: str): + return (self._dxf_layers or {}).get(name) + + def _toggle_dxf_layer(self, item: QListWidgetItem): + name = item.text(); grp = self._get_dxf_group(name) + if grp is None: return + grp.setVisible(item.checkState()==Qt.Checked) + + def _pick_dxf_color(self): + it = self.lst_dxf.currentItem() + if not it: return + color = QtWidgets.QColorDialog.getColor(parent=self) + if not color.isValid(): return + grp = self._get_dxf_group(it.text()) + if grp is None: return + pen = QtGui.QPen(color); pen.setCosmetic(True) + for ch in grp.childItems(): + try: + if hasattr(ch,'setPen'): ch.setPen(pen) + except Exception: pass + + def _reset_dxf_color(self): + it = self.lst_dxf.currentItem() + if not it: return + grp = self._get_dxf_group(it.text()) + if grp is None: return + # Reset to original DXF color if stored + orig = grp.data(2002) + col = QtGui.QColor(orig) if orig else QtGui.QColor('#C0C0C0') + pen = QtGui.QPen(col); pen.setCosmetic(True) + for ch in grp.childItems(): + try: + if hasattr(ch,'setPen'): ch.setPen(pen) + except Exception: pass + + def _current_dxf_group(self): + it = self.lst_dxf.currentItem() + return self._get_dxf_group(it.text()) if it else None + + def _lock_dxf_layer(self, on: bool): + grp = self._current_dxf_group() + if grp is None: return + # toggle selectable/movable flags on children + for ch in grp.childItems(): + try: + if on: + ch.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, False) + ch.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, False) + else: + ch.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True) + ch.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True) + except Exception: + pass + # also toggle on the group + try: + grp.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, not on) + grp.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, not on) + except Exception: + pass + grp.setData(2004, bool(on)) + + def _print_dxf_layer(self, on: bool): + grp = self._current_dxf_group() + if grp is None: return + grp.setData(2003, bool(on)) + # ---------- palette ---------- def _populate_filters(self): mfrs = catalog.list_manufacturers(self.devices_all) @@ -462,6 +1222,103 @@ def toggle_grid(self, on: bool): self.scene.show_grid = bool(on); self.scene.upd def toggle_snap(self, on: bool): self.scene.snap_enabled = bool(on) def toggle_crosshair(self, on: bool): self.view.show_crosshair = bool(on) + def toggle_coverage(self, on: bool): + self.show_coverage = bool(on) + for it in self.layer_devices.childItems(): + if isinstance(it, DeviceItem): + try: it.set_coverage_enabled(self.show_coverage) + except Exception: pass + self.prefs['show_coverage'] = self.show_coverage; save_prefs(self.prefs) + + def toggle_placement_coverage(self, on: bool): + self.prefs['show_placement_coverage'] = bool(on); save_prefs(self.prefs) + + # ---------- command bar ---------- + def _run_command(self): + txt = (self.cmd.text() or '').strip().lower() + self.cmd.clear() + def set_draw(mode): + setattr(self.draw, 'layer', self.layer_sketch) + self.draw.set_mode(mode) + m = { + 'l': lambda: set_draw(draw_tools.DrawMode.LINE), 'line': lambda: set_draw(draw_tools.DrawMode.LINE), + 'r': lambda: set_draw(draw_tools.DrawMode.RECT), 'rect': lambda: set_draw(draw_tools.DrawMode.RECT), 'rectangle': lambda: set_draw(draw_tools.DrawMode.RECT), + 'c': lambda: set_draw(draw_tools.DrawMode.CIRCLE), 'circle': lambda: set_draw(draw_tools.DrawMode.CIRCLE), + 'p': lambda: set_draw(draw_tools.DrawMode.POLYLINE), 'pl': lambda: set_draw(draw_tools.DrawMode.POLYLINE), 'polyline': lambda: set_draw(draw_tools.DrawMode.POLYLINE), + 'a': lambda: set_draw(draw_tools.DrawMode.ARC3), 'arc': lambda: set_draw(draw_tools.DrawMode.ARC3), + 'w': self._set_wire_mode, 'wire': self._set_wire_mode, + 'dim': self.start_dimension, 'd': self.start_dimension, + 'meas': self.start_measure, 'm': self.start_measure, + 'off': self.offset_selected_dialog, 'offset': self.offset_selected_dialog, 'o': self.offset_selected_dialog, + 'tr': self.start_trim, 'trim': self.start_trim, + 'ex': self.start_extend, 'extend': self.start_extend, + 'fi': self.start_fillet, 'fillet': self.start_fillet, + 'mo': self.start_move, 'move': self.start_move, + 'co': self.start_copy, 'copy': self.start_copy, + 'ro': self.start_rotate, 'rotate': self.start_rotate, + 'mi': self.start_mirror, 'mirror': self.start_mirror, + 'sc': self.start_scale, 'scale': self.start_scale, + 'ch': self.start_chamfer, 'chamfer': self.start_chamfer, + } + try: + # If a draw tool is active, try to parse coordinate input + if getattr(self.draw, 'mode', 0) != 0 and txt: + pt = self._parse_coord_input(txt) + if pt is not None: + if self.draw.add_point_command(pt): + self.push_history() + return + fn = m.get(txt) + if fn: + fn() + else: + self.statusBar().showMessage(f"Unknown command: {txt}") + except Exception as ex: + QMessageBox.critical(self, "Command Error", str(ex)) + + def _parse_coord_input(self, s: str) -> QtCore.QPointF | None: + # Supports: x,y (abs ft), @dx,dy (rel ft), r= 2) + except Exception: + committing_poly = False try: self.draw.finish() except Exception: pass + if committing_poly: + self.push_history() # cancel dimension tool if getattr(self, "dim_tool", None): try: if hasattr(self.dim_tool, "cancel"): self.dim_tool.cancel() else: self.dim_tool.active=False except Exception: pass + # cancel text tool + if getattr(self, "text_tool", None): + try: self.text_tool.cancel() + except Exception: pass + # cancel trim tool + if getattr(self, "trim_tool", None): + try: self.trim_tool.cancel() + except Exception: pass + # cancel extend tool + if getattr(self, "extend_tool", None): + try: self.extend_tool.cancel() + except Exception: pass + # cancel fillet tool + if getattr(self, "fillet_tool", None): + try: self.fillet_tool.cancel() + except Exception: pass # clear device placement self.view.current_proto = None if self.view.ghost: @@ -516,13 +1395,63 @@ def cancel_active_tool(self): # ---------- scene menu ---------- def canvas_menu(self, global_pos): menu = QMenu(self) - sel = [it for it in self.scene.selectedItems() if isinstance(it, DeviceItem)] - if sel: - d = sel[0] + # Determine item under cursor + view_pt = self.view.mapFromGlobal(global_pos) + try: + scene_pt = self.view.mapToScene(view_pt) + except Exception: + scene_pt = None + item_under = None + if scene_pt is not None: + try: + item_under = self.scene.itemAt(scene_pt, self.view.transform()) + except Exception: + item_under = None + + # Selection actions + act_sel = None; act_sim = None + if item_under is not None and (not isinstance(item_under, QtWidgets.QGraphicsItemGroup) or isinstance(item_under, DeviceItem)): + act_sel = menu.addAction("Select") + act_sim = menu.addAction("Select Similar") + act_all = menu.addAction("Select All") + act_none = menu.addAction("Clear Selection") + if self.scene.selectedItems(): + menu.addAction("Delete Selection", self.delete_selection) + + # Device-specific when a device is selected + dev_sel = [it for it in self.scene.selectedItems() if isinstance(it, DeviceItem)] + if dev_sel: + menu.addSeparator() + d = dev_sel[0] act_cov = menu.addAction("Coverage…") act_tog = menu.addAction("Toggle Coverage On/Off") act_lbl = menu.addAction("Edit Label…") - act = menu.exec(global_pos) + + # Scene actions + menu.addSeparator() + act_clear_underlay = menu.addAction("Clear Underlay") + + act = menu.exec(global_pos) + if act is None: + return + if act == act_sel and item_under is not None: + try: item_under.setSelected(True) + except Exception: pass + return + if act == act_sim and item_under is not None: + self._select_similar_from(item_under) + return + if act == act_all: + self.scene.clearSelection() + for it in self.scene.items(): + try: + if not isinstance(it, QtWidgets.QGraphicsItemGroup): it.setSelected(True) + except Exception: pass + return + if act == act_none: + self.scene.clearSelection(); return + if dev_sel and act in (act_cov, act_tog, act_lbl): + d = dev_sel[0] if act == act_cov: dlg = CoverageDialog(self, existing=d.coverage) if dlg.exec() == QtWidgets.QDialog.Accepted: @@ -539,26 +1468,86 @@ def canvas_menu(self, global_pos): elif act == act_lbl: txt, ok = QtWidgets.QInputDialog.getText(self, "Device Label", "Text:", text=d.name) if ok: d.set_label_text(txt) - else: - menu.addAction("Clear Underlay", self.clear_underlay) - menu.exec(global_pos) + return + if act == act_clear_underlay: + self.clear_underlay(); return # ---------- history / serialize ---------- def serialize_state(self): devs = [] for it in self.layer_devices.childItems(): if isinstance(it, DeviceItem): devs.append(it.to_json()) + # underlay transform + ut = self.layer_underlay.transform() + underlay = { + "m11": ut.m11(), "m12": ut.m12(), "m13": ut.m13(), + "m21": ut.m21(), "m22": ut.m22(), "m23": ut.m23(), + "m31": ut.m31(), "m32": ut.m32(), "m33": ut.m33(), + } + # DXF layer states + dxf_layers = {} + for name, grp in (self._dxf_layers or {}).items(): + # get first child pen color + color_hex = None + for ch in grp.childItems(): + try: + if hasattr(ch,'pen'): + color_hex = ch.pen().color().name() + break + except Exception: + pass + dxf_layers[name] = { + 'visible': bool(grp.isVisible()), + 'locked': bool(grp.data(2004) or False), + 'print': False if grp.data(2003) is False else True, + 'color': color_hex, + 'orig_color': grp.data(2002) + } + # sketch geometry + def _line_json(it: QtWidgets.QGraphicsLineItem): + l = it.line(); return {"type":"line","x1":l.x1(),"y1":l.y1(),"x2":l.x2(),"y2":l.y2()} + def _rect_json(it: QtWidgets.QGraphicsRectItem): + r = it.rect(); return {"type":"rect","x":r.x(),"y":r.y(),"w":r.width(),"h":r.height()} + def _ellipse_json(it: QtWidgets.QGraphicsEllipseItem): + r = it.rect(); return {"type":"circle","x":r.center().x(),"y":r.center().y(),"r":r.width()/2.0} + def _path_json(it: QtWidgets.QGraphicsPathItem): + p = it.path(); pts=[] + for i in range(p.elementCount()): + e = p.elementAt(i); pts.append({"x":e.x, "y":e.y}) + return {"type":"poly","pts":pts} + def _text_json(it: QtWidgets.QGraphicsSimpleTextItem): + p = it.pos(); return {"type":"text","x":p.x(),"y":p.y(),"text":it.text()} + sketch=[] + for it in self.layer_sketch.childItems(): + if isinstance(it, QtWidgets.QGraphicsLineItem): sketch.append(_line_json(it)) + elif isinstance(it, QtWidgets.QGraphicsRectItem): sketch.append(_rect_json(it)) + elif isinstance(it, QtWidgets.QGraphicsEllipseItem): sketch.append(_ellipse_json(it)) + elif isinstance(it, QtWidgets.QGraphicsPathItem): sketch.append(_path_json(it)) + elif isinstance(it, QtWidgets.QGraphicsSimpleTextItem): sketch.append(_text_json(it)) + # wires + wires=[] + for it in self.layer_wires.childItems(): + if isinstance(it, QtWidgets.QGraphicsPathItem): + p=it.path(); + if p.elementCount()>=2: + a=p.elementAt(0); b=p.elementAt(1) + wires.append({"ax":a.x, "ay":a.y, "bx":b.x, "by":b.y}) return {"grid":int(self.scene.grid_size), "snap":bool(self.scene.snap_enabled), "px_per_ft": float(self.px_per_ft), "snap_step_in": float(self.snap_step_in), "grid_opacity": float(self.prefs.get("grid_opacity",0.25)), "grid_width_px": float(self.prefs.get("grid_width_px",0.0)), "grid_major_every": int(self.prefs.get("grid_major_every",5)), - "devices":devs,"wires":[]} + "devices":devs, + "underlay_transform": underlay, + "dxf_layers": dxf_layers, + "sketch":sketch, + "wires":wires} def load_state(self, data): for it in list(self.layer_devices.childItems()): it.scene().removeItem(it) for it in list(self.layer_wires.childItems()): it.scene().removeItem(it) + for it in list(self.layer_sketch.childItems()): it.scene().removeItem(it) self.scene.snap_enabled = bool(data.get("snap", True)); self.act_view_snap.setChecked(self.scene.snap_enabled) self.scene.grid_size = int(data.get("grid", DEFAULT_GRID_SIZE)); if hasattr(self, "spin_grid"): self.spin_grid.setValue(self.scene.grid_size) @@ -571,6 +1560,52 @@ def load_state(self, data): self._apply_snap_step_from_inches(self.snap_step_in) for d in data.get("devices", []): it = DeviceItem.from_json(d); it.setParentItem(self.layer_devices) + # underlay transform + ut = data.get("underlay_transform") + if ut: + tr = QtGui.QTransform(ut.get("m11",1), ut.get("m12",0), ut.get("m13",0), + ut.get("m21",0), ut.get("m22",1), ut.get("m23",0), + ut.get("m31",0), ut.get("m32",0), ut.get("m33",1)) + self.layer_underlay.setTransform(tr) + # restore sketch + from PySide6 import QtGui + for s in data.get("sketch", []): + t = s.get("type") + if t == "line": + it = QtWidgets.QGraphicsLineItem(s["x1"], s["y1"], s["x2"], s["y2"]) + elif t == "rect": + it = QtWidgets.QGraphicsRectItem(s["x"], s["y"], s["w"], s["h"]) + elif t == "circle": + r = float(s.get("r",0.0)); cx=float(s.get("x",0.0)); cy=float(s.get("y",0.0)) + it = QtWidgets.QGraphicsEllipseItem(cx-r, cy-r, 2*r, 2*r) + elif t == "poly": + pts = [QtCore.QPointF(p["x"], p["y"]) for p in s.get("pts", [])] + if len(pts) < 2: continue + path = QtGui.QPainterPath(pts[0]) + for p in pts[1:]: path.lineTo(p) + it = QtWidgets.QGraphicsPathItem(path) + elif t == "text": + it = QtWidgets.QGraphicsSimpleTextItem(s.get("text","")) + it.setPos(float(s.get("x",0.0)), float(s.get("y",0.0))) + it.setFlag(QtWidgets.QGraphicsItem.ItemIgnoresTransformations, True) + else: + continue + pen = QtGui.QPen(QtGui.QColor("#e0e0e0")); pen.setCosmetic(True) + if hasattr(it, 'setPen'): + it.setPen(pen) + it.setZValue(20); it.setParentItem(self.layer_sketch) + it.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True) + it.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True) + # restore wires + for w in data.get("wires", []): + a = QtCore.QPointF(float(w.get("ax",0.0)), float(w.get("ay",0.0))) + b = QtCore.QPointF(float(w.get("bx",0.0)), float(w.get("by",0.0))) + path = QtGui.QPainterPath(a); path.lineTo(b) + wi = QtWidgets.QGraphicsPathItem(path) + pen = QtGui.QPen(QtGui.QColor("#2aa36b")); pen.setCosmetic(True); pen.setWidth(2) + wi.setPen(pen); wi.setZValue(60); wi.setParentItem(self.layer_wires) + wi.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True) + wi.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True) def push_history(self): if self.history_index < len(self.history)-1: self.history = self.history[:self.history_index+1] @@ -592,28 +1627,38 @@ def _get_selected_device(self): return None def _on_selection_changed(self): + # Update device properties panel if a device is selected d = self._get_selected_device() if not d: - self._enable_props(False); - return - self._enable_props(True) - # label + offset in ft - self.prop_label.setText(d._label.text()) - offx = d.label_offset.x()/self.px_per_ft - offy = d.label_offset.y()/self.px_per_ft - self.prop_offx.blockSignals(True); self.prop_offy.blockSignals(True) - self.prop_offx.setValue(offx); self.prop_offy.setValue(offy) - self.prop_offx.blockSignals(False); self.prop_offy.blockSignals(False) - # coverage - cov = d.coverage or {} - self.prop_mount.setCurrentText(cov.get("mount","ceiling")) - mode = cov.get("mode","none") - if mode not in ("none","strobe","speaker","smoke"): mode="none" - self.prop_mode.setCurrentText(mode) - size_ft = float(cov.get("computed_radius_ft",0.0))*2.0 if mode=="strobe" else ( - float(cov.get("params",{}).get("spacing_ft",0.0)) if mode=="smoke" else - float(cov.get("computed_radius_ft",0.0))) - self.prop_size.setValue(max(0.0, size_ft)) + self._enable_props(False) + else: + self._enable_props(True) + # label + offset in ft + self.prop_label.setText(d._label.text()) + self.prop_showcov.setChecked(bool(getattr(d, 'coverage_enabled', True))) + offx = d.label_offset.x()/self.px_per_ft + offy = d.label_offset.y()/self.px_per_ft + self.prop_offx.blockSignals(True); self.prop_offy.blockSignals(True) + self.prop_offx.setValue(offx); self.prop_offy.setValue(offy) + self.prop_offx.blockSignals(False); self.prop_offy.blockSignals(False) + # coverage + cov = d.coverage or {} + self.prop_mount.setCurrentText(cov.get("mount","ceiling")) + mode = cov.get("mode","none") + if mode not in ("none","strobe","speaker","smoke"): mode="none" + self.prop_mode.setCurrentText(mode) + # strobe candela + cand = str(cov.get('params',{}).get('candela','')) + if cand in {"15","30","75","95","110","135","185"}: + self.prop_candela.setCurrentText(cand) + else: + self.prop_candela.setCurrentText("(custom)") + size_ft = float(cov.get("computed_radius_ft",0.0))*2.0 if mode=="strobe" else ( + float(cov.get("params",{}).get("spacing_ft",0.0)) if mode=="smoke" else + float(cov.get("computed_radius_ft",0.0))) + self.prop_size.setValue(max(0.0, size_ft)) + # Always update selection highlight for geometry + self._update_selection_visuals() def _apply_label_offset_live(self): d = self._get_selected_device() @@ -626,6 +1671,7 @@ def _apply_label_offset_live(self): def _apply_props_clicked(self): d = self._get_selected_device() if not d: return + d.set_coverage_enabled(bool(self.prop_showcov.isChecked())) mode = self.prop_mode.currentText() mount = self.prop_mount.currentText() sz = float(self.prop_size.value()) @@ -633,7 +1679,16 @@ def _apply_props_clicked(self): if mode == "none": cov["computed_radius_ft"] = 0.0 elif mode == "strobe": - cov["computed_radius_ft"] = max(0.0, sz/2.0) + cand_txt = self.prop_candela.currentText() + if cand_txt != "(custom)": + try: + cand = int(cand_txt) + cov.setdefault('params',{})['candela']=cand + cov["computed_radius_ft"] = self._strobe_radius_from_candela(cand) + except Exception: + cov["computed_radius_ft"] = max(0.0, sz/2.0) + else: + cov["computed_radius_ft"] = max(0.0, sz/2.0) elif mode == "smoke": spacing_ft = max(0.0, sz) cov["params"] = {"spacing_ft": spacing_ft} @@ -644,10 +1699,68 @@ def _apply_props_clicked(self): self.push_history() self.scene.update() + def _on_mode_changed_props(self, mode: str): + # Show candela chooser only for strobe + want = (mode == 'strobe') + self.prop_candela.setEnabled(want) + # ---------- underlay / file ops ---------- def clear_underlay(self): for it in list(self.layer_underlay.childItems()): it.scene().removeItem(it) + # ---------- selection helpers ---------- + def _select_similar_from(self, base_item: QtWidgets.QGraphicsItem): + try: + # Device similarity: match symbol or name + if isinstance(base_item, DeviceItem): + sym = getattr(base_item, 'symbol', None) + name = getattr(base_item, 'name', None) + for it in self.layer_devices.childItems(): + if isinstance(it, DeviceItem): + if (sym and getattr(it, 'symbol', None) == sym) or (name and getattr(it, 'name', None) == name): + it.setSelected(True) + return + # Geometry similarity: same class within same layer group + layer = base_item.parentItem() + if layer is None: + items = self.scene.items() + else: + items = list(layer.childItems()) + t = type(base_item) + for it in items: + try: + if type(it) is t: it.setSelected(True) + except Exception: + pass + except Exception: + pass + + # ---------- selection visuals ---------- + def _update_selection_visuals(self): + hi_pen = QtGui.QPen(QtGui.QColor(66, 160, 255)) + hi_pen.setCosmetic(True); hi_pen.setWidthF(2.0) + def apply(item, on: bool): + try: + if hasattr(item, 'setPen'): + if on: + if item.data(1001) is None: + # store original pen + try: item.setData(1001, item.pen()) + except Exception: item.setData(1001, None) + item.setPen(hi_pen) + else: + op = item.data(1001) + if op is not None: + try: item.setPen(op) + except Exception: pass + item.setData(1001, None) + except Exception: + pass + # clear highlights on non-selected geometry + for layer in (self.layer_sketch, self.layer_wires): + for it in layer.childItems(): + apply(it, it.isSelected()) + def new_project(self): self.clear_underlay() for it in list(self.layer_devices.childItems()): it.scene().removeItem(it) @@ -690,6 +1803,697 @@ def fit_view_to_content(self): if rect.isNull(): rect=QtCore.QRectF(0,0,1000,800) self.view.fitInView(rect, Qt.KeepAspectRatio) + # ---------- underlay import ---------- + def import_dxf_underlay(self): + p, _ = QFileDialog.getOpenFileName(self, "Import DXF Underlay", "", "DXF Files (*.dxf)") + if not p: + return + try: + bounds, layer_groups = dxf_import.import_dxf_into_group(p, self.layer_underlay, self.px_per_ft) + if bounds and not bounds.isNull(): + # Expand scene rect to include underlay, then fit + self.scene.setSceneRect(self.scene.sceneRect().united(bounds.adjusted(-200,-200,200,200))) + self.view.fitInView(bounds.adjusted(-100,-100,100,100), Qt.KeepAspectRatio) + self.statusBar().showMessage(f"Imported underlay: {os.path.basename(p)}") + self._dxf_layers = layer_groups + self._refresh_dxf_layers_dock() + except Exception as ex: + QMessageBox.critical(self, "DXF Import Error", str(ex)) + + def import_pdf_underlay(self): + p,_ = QFileDialog.getOpenFileName(self, "Import PDF Underlay", "", "PDF Files (*.pdf)") + if not p: + return + try: + from PySide6 import QtPdf, QtPdfWidgets # type: ignore + except Exception as ex: + QMessageBox.critical(self, "PDF Import Error", "QtPdf module not available.\n\nInstall PySide6 with QtPdf support.") + return + try: + doc = QtPdf.QPdfDocument(self) + st = doc.load(p) + if st != QtPdf.QPdfDocument.NoError: + raise RuntimeError("Failed to load PDF") + page = 0 + sz = doc.pagePointSize(page) + # Render at a reasonable DPI (96) and then scale via px_per_ft + dpi = 96.0 + img = QtGui.QImage(int(sz.width()/72.0*dpi), int(sz.height()/72.0*dpi), QtGui.QImage.Format_ARGB32_Premultiplied) + img.fill(QtGui.QColor(255,255,255)) + painter = QtGui.QPainter(img) + r = QtCore.QRectF(0,0,img.width(), img.height()) + QtPdf.QPdfDocumentRenderOptions() + doc.render(painter, page, r) + painter.end() + pix = QtGui.QPixmap.fromImage(img) + item = QtWidgets.QGraphicsPixmapItem(pix) + item.setOpacity(0.9) + item.setTransformationMode(Qt.SmoothTransformation) + item.setParentItem(self.layer_underlay) + self.statusBar().showMessage(f"Imported PDF underlay: {os.path.basename(p)} (page 1)") + except Exception as ex: + QMessageBox.critical(self, "PDF Import Error", str(ex)) + + # ---------- edit helpers ---------- + def delete_selection(self): + sel = self.scene.selectedItems() + if not sel: return + for it in sel: + if isinstance(it, QtWidgets.QGraphicsItemGroup): + continue + sc = it.scene() + if sc: sc.removeItem(it) + self.push_history() + + # ---------- text / wire ---------- + def start_text(self): + try: + self.text_tool.start() + except Exception as ex: + QMessageBox.critical(self, "Text Tool Error", str(ex)) + + def _set_wire_mode(self): + # temporarily direct draw controller to wires layer for wire mode + self.draw.layer = self.layer_wires + self.draw.set_mode(draw_tools.DrawMode.WIRE) + + def start_mtext(self): + try: + self.mtext_tool.start() + except Exception as ex: + QMessageBox.critical(self, "MText Tool Error", str(ex)) + + def start_freehand(self): + try: + self.freehand_tool.start() + except Exception as ex: + QMessageBox.critical(self, "Freehand Tool Error", str(ex)) + + def start_leader(self): + try: + self.leader_tool.start() + except Exception as ex: + QMessageBox.critical(self, "Leader Tool Error", str(ex)) + + def start_cloud(self): + try: + self.cloud_tool.start() + except Exception as ex: + QMessageBox.critical(self, "Revision Cloud Error", str(ex)) + + # ---------- underlay scaling ---------- + def start_underlay_scale_ref(self): + try: + self.underlay_ref_tool.start() + except Exception as ex: + QMessageBox.critical(self, "Underlay Scale (Ref) Error", str(ex)) + + def underlay_scale_factor(self): + val, ok = QtWidgets.QInputDialog.getDouble(self, "Underlay Scale", "Factor", 1.0, 0.001, 1000.0, 4) + if not ok: + return + try: + scale_underlay_by_factor(self.layer_underlay, float(val), QtCore.QPointF(0,0)) + self.push_history() + self.statusBar().showMessage(f"Underlay scaled by factor {float(val):.4f}") + except Exception as ex: + QMessageBox.critical(self, "Underlay Scale Error", str(ex)) + + def start_underlay_scale_drag(self): + try: + self.underlay_drag_tool.start() + except Exception as ex: + QMessageBox.critical(self, "Underlay Scale (Drag) Error", str(ex)) + + def center_underlay_in_view(self): + try: + bounds = self.layer_underlay.childrenBoundingRect() + if bounds.isNull(): + return + vc = self.view.mapToScene(self.view.viewport().rect().center()) + # current center of underlay in scene coords + cur_center = bounds.center() + self.layer_underlay.pos() + delta = vc - cur_center + self.layer_underlay.setPos(self.layer_underlay.pos() + delta) + # ensure sceneRect includes new underlay pos + ub = self.layer_underlay.mapRectToScene(self.layer_underlay.childrenBoundingRect()) + self.scene.setSceneRect(self.scene.sceneRect().united(ub.adjusted(-200,-200,200,200))) + self.push_history(); self.statusBar().showMessage("Underlay centered in view") + except Exception as ex: + QMessageBox.critical(self, "Center Underlay Error", str(ex)) + + def move_underlay_to_origin(self): + try: + self.layer_underlay.setPos(0,0) + ub = self.layer_underlay.mapRectToScene(self.layer_underlay.childrenBoundingRect()) + self.scene.setSceneRect(self.scene.sceneRect().united(ub.adjusted(-200,-200,200,200))) + self.push_history(); self.statusBar().showMessage("Underlay moved to origin") + except Exception as ex: + QMessageBox.critical(self, "Move Underlay Error", str(ex)) + + def reset_underlay_transform(self): + try: + self.layer_underlay.setTransform(QtGui.QTransform()) + self.layer_underlay.setPos(0,0) + ub = self.layer_underlay.mapRectToScene(self.layer_underlay.childrenBoundingRect()) + self.scene.setSceneRect(self.scene.sceneRect().united(ub.adjusted(-200,-200,200,200))) + self.push_history(); self.statusBar().showMessage("Underlay transform reset") + except Exception as ex: + QMessageBox.critical(self, "Reset Underlay Error", str(ex)) + + def start_measure(self): + try: + self.measure_tool.start() + except Exception as ex: + QMessageBox.critical(self, "Measure Tool Error", str(ex)) + + # ---------- modify: trim ---------- + def start_trim(self): + try: + self.trim_tool.start() + except Exception as ex: + QMessageBox.critical(self, "Trim Tool Error", str(ex)) + + def finish_trim(self): + try: + self.trim_tool.cancel() + except Exception: + pass + def start_extend(self): + try: + self.extend_tool.start() + except Exception as ex: + QMessageBox.critical(self, "Extend Tool Error", str(ex)) + def start_fillet(self): + try: + self.fillet_tool.start() + except Exception as ex: + QMessageBox.critical(self, "Fillet Tool Error", str(ex)) + def start_move(self): + try: + self.move_tool.start(copy=False) + except Exception as ex: + QMessageBox.critical(self, "Move Tool Error", str(ex)) + def start_copy(self): + try: + self.move_tool.start(copy=True) + except Exception as ex: + QMessageBox.critical(self, "Copy Tool Error", str(ex)) + def start_rotate(self): + try: + self.rotate_tool.start() + except Exception as ex: + QMessageBox.critical(self, "Rotate Tool Error", str(ex)) + def start_mirror(self): + try: + self.mirror_tool.start() + except Exception as ex: + QMessageBox.critical(self, "Mirror Tool Error", str(ex)) + def start_scale(self): + try: + self.scale_tool.start() + except Exception as ex: + QMessageBox.critical(self, "Scale Tool Error", str(ex)) + def start_chamfer(self): + try: + self.chamfer_tool.start() + except Exception as ex: + QMessageBox.critical(self, "Chamfer Tool Error", str(ex)) + def start_fillet_radius(self): + try: + self.fillet_radius_tool.start() + except Exception as ex: + QMessageBox.critical(self, "Fillet (Radius) Error", str(ex)) + + # ---------- modify: offset ---------- + def offset_selected_dialog(self): + dlg = QtWidgets.QDialog(self); dlg.setWindowTitle("Offset Selected") + form = QtWidgets.QFormLayout(dlg) + spin = QDoubleSpinBox(); spin.setRange(-1000, 1000); spin.setDecimals(3); spin.setValue(1.0) + side = QComboBox(); side.addItems(["Right","Left"]) # relative to first segment direction + dup = QCheckBox("Create copy (do not modify original)"); dup.setChecked(True) + units = QLabel("feet") + wrap = QtWidgets.QHBoxLayout(); wrap.addWidget(spin); wrap.addWidget(units) + field = QWidget(); field.setLayout(wrap) + form.addRow("Distance:", field) + form.addRow("Side:", side) + form.addRow(dup) + bb = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok|QtWidgets.QDialogButtonBox.Cancel) + form.addRow(bb) + bb.accepted.connect(dlg.accept); bb.rejected.connect(dlg.reject) + if dlg.exec() != QtWidgets.QDialog.Accepted: + return + dist_ft = float(spin.value()); right = (side.currentText()=="Right"); make_copy = bool(dup.isChecked()) + self._apply_offset_selected(dist_ft, right, make_copy) + self.push_history() + + def _apply_offset_selected(self, dist_ft: float, right: bool, make_copy: bool): + import math + sel = [it for it in self.scene.selectedItems() if isinstance(it, (QtWidgets.QGraphicsLineItem, QtWidgets.QGraphicsRectItem, QtWidgets.QGraphicsEllipseItem, QtWidgets.QGraphicsPathItem))] + if not sel: + return + dpx = dist_ft * self.px_per_ft + sign = 1.0 if right else -1.0 + def add_flags(it): + it.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True) + it.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True) + return it + for it in sel: + layer = it.parentItem() or self.layer_sketch + if isinstance(it, QtWidgets.QGraphicsLineItem): + l = it.line(); dx = l.x2()-l.x1(); dy=l.y2()-l.y1() + ln = math.hypot(dx,dy) or 1.0 + nx, ny = sign*(-dy/ln)*dpx, sign*(dx/ln)*dpx + nl = QtCore.QLineF(l.x1()+nx, l.y1()+ny, l.x2()+nx, l.y2()+ny) + tgt = QtWidgets.QGraphicsLineItem(nl) if make_copy else it + if make_copy: + tgt.setParentItem(layer) + pen = tgt.pen() if hasattr(tgt,'pen') else QtGui.QPen(QtGui.QColor("#e0e0e0")) + pen.setCosmetic(True); tgt.setPen(pen); tgt.setZValue(20); add_flags(tgt) + elif isinstance(it, QtWidgets.QGraphicsRectItem): + r = it.rect(); g = sign*dpx + nr = QtCore.QRectF(r.x()-g, r.y()-g, r.width()+2*g, r.height()+2*g) + tgt = QtWidgets.QGraphicsRectItem(nr) if make_copy else it + if make_copy: + tgt.setParentItem(layer) + pen = QtGui.QPen(QtGui.QColor("#e0e0e0")); pen.setCosmetic(True); tgt.setPen(pen); tgt.setZValue(20); add_flags(tgt) + elif isinstance(it, QtWidgets.QGraphicsEllipseItem): + r = it.rect(); g = sign*dpx + nr = QtCore.QRectF(r.x()-g, r.y()-g, r.width()+2*g, r.height()+2*g) + tgt = QtWidgets.QGraphicsEllipseItem(nr) if make_copy else it + if make_copy: + tgt.setParentItem(layer) + pen = QtGui.QPen(QtGui.QColor("#e0e0e0")); pen.setCosmetic(True); tgt.setPen(pen); tgt.setZValue(20); add_flags(tgt) + elif isinstance(it, QtWidgets.QGraphicsPathItem): + p = it.path(); + if p.elementCount() < 2: continue + e0 = p.elementAt(0); e1 = p.elementAt(1) + dx, dy = (e1.x - e0.x), (e1.y - e0.y) + ln = math.hypot(dx,dy) or 1.0 + nx, ny = sign*(-dy/ln)*dpx, sign*(dx/ln)*dpx + path = QtGui.QPainterPath() + for i in range(p.elementCount()): + e = p.elementAt(i) + if i == 0: + path.moveTo(e.x+nx, e.y+ny) + else: + path.lineTo(e.x+nx, e.y+ny) + tgt = QtWidgets.QGraphicsPathItem(path) if make_copy else it + if make_copy: + tgt.setParentItem(layer) + pen = QtGui.QPen(QtGui.QColor("#e0e0e0")); pen.setCosmetic(True); tgt.setPen(pen); tgt.setZValue(20); add_flags(tgt) + + # ---------- export ---------- + def export_png(self): + p,_ = QFileDialog.getSaveFileName(self, "Export PNG", "", "PNG Image (*.png)") + if not p: + return + if not p.lower().endswith('.png'): + p += '.png' + # If a page frame exists, render to exact paper size using print scale + if self.page_frame and self.page_frame.scene(): + size_name = self.prefs.get('page_size','Letter'); dpi=int(self.prefs.get('print_dpi',300)) + w_in, h_in = PAGE_SIZES.get(size_name, PAGE_SIZES['Letter']) + if (self.prefs.get('page_orient','Landscape')).lower().startswith('land'): + w_in, h_in = h_in, w_in + img = QtGui.QImage(int(w_in*dpi), int(h_in*dpi), QtGui.QImage.Format_ARGB32_Premultiplied) + img.fill(QtGui.QColor(255,255,255)) + painter = QtGui.QPainter(img) + painter.setRenderHint(QtGui.QPainter.Antialiasing, True) + rect = self.page_frame.childrenBoundingRect() + # Temporarily hide DXF layers flagged as non-print + hidden = [] + for grp in (self._dxf_layers or {}).values(): + if grp.data(2003) is False: + hidden.append(grp); grp.setVisible(False) + s = (dpi*float(self.prefs.get('print_in_per_ft',0.125))) / float(self.px_per_ft) + # center + page_rect = QtCore.QRectF(0,0, w_in*dpi, h_in*dpi) + tx = (page_rect.width() - rect.width()*s)/2 + ty = (page_rect.height() - rect.height()*s)/2 + painter.translate(tx, ty) + painter.scale(s, s) + painter.translate(-rect.topLeft()) + self.scene.render(painter, QtCore.QRectF(0,0,rect.width(),rect.height()), rect) + painter.end() + for grp in hidden: + grp.setVisible(True) + img.save(p) + self.statusBar().showMessage(f"Exported PNG: {os.path.basename(p)}") + return + rect = self.scene.itemsBoundingRect().adjusted(-20,-20,20,20) + if rect.isNull(): + rect = QtCore.QRectF(0,0,1000,800) + scale = 2.0 + img = QtGui.QImage(int(rect.width()*scale), int(rect.height()*scale), QtGui.QImage.Format_ARGB32_Premultiplied) + img.fill(QtGui.QColor(25,26,28)) + painter = QtGui.QPainter(img) + painter.setRenderHint(QtGui.QPainter.Antialiasing, True) + painter.scale(scale, scale) + painter.translate(-rect.topLeft()) + self.scene.render(painter, QtCore.QRectF(0,0,rect.width(),rect.height()), rect) + painter.end() + img.save(p) + self.statusBar().showMessage(f"Exported PNG: {os.path.basename(p)}") + + def export_pdf(self): + p,_ = QFileDialog.getSaveFileName(self, "Export PDF", "", "PDF Document (*.pdf)") + if not p: + return + if not p.lower().endswith('.pdf'): + p += '.pdf' + writer = QtGui.QPdfWriter(p) + dpi = int(self.prefs.get('print_dpi', 300)) + writer.setResolution(dpi) + # Page setup + size_name = self.prefs.get('page_size', 'Letter') + orient = self.prefs.get('page_orient', 'Landscape') + qsize_map = { + 'Letter': QtGui.QPageSize.Letter, + 'Tabloid': QtGui.QPageSize.Tabloid, + 'A3': QtGui.QPageSize.A3, + 'A2': QtGui.QPageSize.A2, + 'A1': QtGui.QPageSize.A1, + 'A0': QtGui.QPageSize.A0, + 'Arch A': QtGui.QPageSize.ArchA, + 'Arch B': QtGui.QPageSize.ArchB, + 'Arch C': QtGui.QPageSize.ArchC, + 'Arch D': QtGui.QPageSize.ArchD, + 'Arch E': QtGui.QPageSize.ArchE, + } + writer.setPageSize(QtGui.QPageSize(qsize_map.get(size_name, QtGui.QPageSize.Letter))) + writer.setPageOrientation(QtGui.QPageLayout.Landscape if orient.lower().startswith('land') else QtGui.QPageLayout.Portrait) + painter = QtGui.QPainter(writer) + painter.setRenderHint(QtGui.QPainter.Antialiasing, True) + if self.page_frame and self.page_frame.scene(): + rect = self.page_frame.childrenBoundingRect() + hidden = [] + for grp in (self._dxf_layers or {}).values(): + if grp.data(2003) is False: + hidden.append(grp); grp.setVisible(False) + s = (dpi*float(self.prefs.get('print_in_per_ft',0.125))) / float(self.px_per_ft) + page_rect = writer.pageLayout().paintRectPixels(dpi) + tx = (page_rect.width() - rect.width()*s)/2 + ty = (page_rect.height() - rect.height()*s)/2 + painter.translate(tx, ty) + painter.scale(s, s) + painter.translate(-rect.topLeft()) + self.scene.render(painter, QtCore.QRectF(0,0,rect.width(),rect.height()), rect) + for grp in hidden: + grp.setVisible(True) + else: + rect = self.scene.itemsBoundingRect().adjusted(-20,-20,20,20) + if rect.isNull(): rect = QtCore.QRectF(0,0,1000,800) + page_rect = writer.pageLayout().paintRectPixels(dpi) + sx = page_rect.width() / rect.width(); sy = page_rect.height() / rect.height(); s = min(sx, sy) + tx = (page_rect.width() - rect.width()*s)/2; ty = (page_rect.height() - rect.height()*s)/2 + painter.translate(tx, ty) + painter.scale(s, s) + painter.translate(-rect.topLeft()) + self.scene.render(painter, QtCore.QRectF(0,0,rect.width(),rect.height()), rect) + painter.end() + self.statusBar().showMessage(f"Exported PDF: {os.path.basename(p)}") + + # coverage helpers + def _strobe_radius_from_candela(self, cand: int) -> float: + # Try DB first + try: + from db import loader as db_loader + con = db_loader.connect() + db_loader.ensure_schema(con) + r = db_loader.strobe_radius_for_candela(con, int(cand)) + con.close() + if r is not None: + return float(r) + except Exception: + pass + # Fallback mapping + table = {15:15.0,30:20.0,75:30.0,95:35.0,110:38.0,135:43.0,185:50.0} + return float(table.get(int(cand), 25.0)) + + # ---------- layout / paperspace ---------- + def add_page_frame(self): + dlg = QtWidgets.QDialog(self); dlg.setWindowTitle("Add Page Frame") + form = QtWidgets.QFormLayout(dlg) + cmb = QComboBox(); cmb.addItems(list(PAGE_SIZES.keys())); cmb.setCurrentText(self.prefs.get('page_size','Letter')) + ori = QComboBox(); ori.addItems(["Portrait","Landscape"]); ori.setCurrentText(self.prefs.get('page_orient','Landscape')) + spm = QDoubleSpinBox(); spm.setRange(0.0, 2.0); spm.setSingleStep(0.1); spm.setValue(float(self.prefs.get('page_margin_in',0.5))) + form.addRow("Size:", cmb); form.addRow("Orientation:", ori); form.addRow("Margin (in):", spm) + bb = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok|QtWidgets.QDialogButtonBox.Cancel); form.addRow(bb) + bb.accepted.connect(dlg.accept); bb.rejected.connect(dlg.reject) + if dlg.exec() != QtWidgets.QDialog.Accepted: + return + self.prefs['page_size'] = cmb.currentText(); self.prefs['page_orient']=ori.currentText(); self.prefs['page_margin_in']=float(spm.value()); save_prefs(self.prefs) + if self.page_frame and self.page_frame.scene(): + try: self.scene.removeItem(self.page_frame) + except Exception: pass + self.page_frame = None + pf = PageFrame(self.px_per_ft, size_name=self.prefs['page_size'], orientation=self.prefs['page_orient'], margin_in=self.prefs['page_margin_in']) + pf.setParentItem(self.layer_underlay) # keep frame below content + self.page_frame = pf + self.statusBar().showMessage("Page frame added") + + def add_or_update_title_block(self): + # Project metadata dialog + dlg = QtWidgets.QDialog(self); dlg.setWindowTitle("Title Block") + form = QtWidgets.QFormLayout(dlg) + ed_project = QLineEdit(self.prefs.get('proj_project','')) + ed_address = QLineEdit(self.prefs.get('proj_address','')) + ed_sheet = QLineEdit(self.prefs.get('proj_sheet','')) + ed_date = QLineEdit(self.prefs.get('proj_date','')) + ed_by = QLineEdit(self.prefs.get('proj_by','')) + form.addRow("Project", ed_project) + form.addRow("Address", ed_address) + form.addRow("Sheet", ed_sheet) + form.addRow("Date", ed_date) + form.addRow("By", ed_by) + bb = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok|QtWidgets.QDialogButtonBox.Cancel) + form.addRow(bb); bb.accepted.connect(dlg.accept); bb.rejected.connect(dlg.reject) + if dlg.exec() != QtWidgets.QDialog.Accepted: + return + meta = { + 'project': ed_project.text(), 'address': ed_address.text(), 'sheet': ed_sheet.text(), 'date': ed_date.text(), 'by': ed_by.text() + } + self.prefs.update({ 'proj_'+k:v for k,v in meta.items() }); save_prefs(self.prefs) + # Add or update + if self.title_block and self.title_block.scene(): + self.title_block.set_meta(meta) + else: + tb = TitleBlock(self.px_per_ft, size_name=self.prefs.get('page_size','Letter'), orientation=self.prefs.get('page_orient','Landscape'), meta=meta) + tb.setParentItem(self.layer_underlay) + self.title_block = tb + self.statusBar().showMessage("Title block updated") + + def page_setup_dialog(self): + dlg = QtWidgets.QDialog(self); dlg.setWindowTitle("Page Setup") + form = QtWidgets.QFormLayout(dlg) + size = QComboBox(); size.addItems(list(PAGE_SIZES.keys())); size.setCurrentText(self.prefs.get('page_size','Letter')) + orient = QComboBox(); orient.addItems(["Portrait","Landscape"]); orient.setCurrentText(self.prefs.get('page_orient','Landscape')) + margin = QDoubleSpinBox(); margin.setRange(0.0, 2.0); margin.setDecimals(2); margin.setSingleStep(0.1); margin.setValue(float(self.prefs.get('page_margin_in',0.5))) + form.addRow("Size:", size); form.addRow("Orientation:", orient); form.addRow("Margin (in):", margin) + bb = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok|QtWidgets.QDialogButtonBox.Cancel); form.addRow(bb) + bb.accepted.connect(dlg.accept); bb.rejected.connect(dlg.reject) + if dlg.exec() != QtWidgets.QDialog.Accepted: + return + self.prefs['page_size'] = size.currentText() + self.prefs['page_orient'] = orient.currentText() + self.prefs['page_margin_in'] = float(margin.value()) + save_prefs(self.prefs) + # refresh frame and title block + if self.page_frame and self.page_frame.scene(): + try: + self.page_frame.set_params(size_name=self.prefs['page_size'], orientation=self.prefs['page_orient'], margin_in=self.prefs['page_margin_in'], px_per_ft=self.px_per_ft) + except Exception: + pass + if self.title_block and self.title_block.scene(): + try: + self.layer_underlay.removeFromGroup(self.title_block) + except Exception: + pass + # rebuild title block with same meta + meta = { + 'project': self.prefs.get('proj_project',''), 'address': self.prefs.get('proj_address',''), + 'sheet': self.prefs.get('proj_sheet',''), 'date': self.prefs.get('proj_date',''), 'by': self.prefs.get('proj_by','') + } + tb = TitleBlock(self.px_per_ft, size_name=self.prefs['page_size'], orientation=self.prefs['page_orient'], meta=meta) + tb.setParentItem(self.layer_underlay) + self.title_block = tb + self.statusBar().showMessage("Page setup updated") + + # ---------- paper space / viewports ---------- + def _ensure_paper_scene(self): + if getattr(self, 'paper_scene', None): + return + sc = QtWidgets.QGraphicsScene() + # page frame and title block (reuse prefs) + pf = PageFrame(self.px_per_ft, size_name=self.prefs.get('page_size','Letter'), orientation=self.prefs.get('page_orient','Landscape'), margin_in=self.prefs.get('page_margin_in',0.5)) + sc.addItem(pf) + inner = pf._inner.rect() + vp = ViewportItem(self.scene, inner.adjusted(10,10,-10,-10), self) + sc.addItem(vp) + meta = { + 'project': self.prefs.get('proj_project',''), 'address': self.prefs.get('proj_address',''), + 'sheet': self.prefs.get('proj_sheet',''), 'date': self.prefs.get('proj_date',''), 'by': self.prefs.get('proj_by','') + } + tb = TitleBlock(self.px_per_ft, size_name=self.prefs.get('page_size','Letter'), orientation=self.prefs.get('page_orient','Landscape'), meta=meta) + sc.addItem(tb) + self.paper_scene = sc + + def add_viewport(self): + if not self.in_paper_space: + self.toggle_paper_space(True) + if not self.paper_scene: + self._ensure_paper_scene() + # add a new viewport in the center + rect = QtCore.QRectF(100, 100, 600, 400) + vp = ViewportItem(self.scene, rect, self) + self.paper_scene.addItem(vp) + self.statusBar().showMessage("Viewport added") + + def toggle_paper_space(self, on: bool): + self.in_paper_space = bool(on) + if self.in_paper_space: + self._ensure_paper_scene() + self.view.setScene(self.paper_scene) + else: + self.view.setScene(self.scene) + self.fit_view_to_content() + + def remove_page_frame(self): + if self.page_frame and self.page_frame.scene(): + try: self.scene.removeItem(self.page_frame) + except Exception: pass + self.page_frame = None + self.statusBar().showMessage("Page frame removed") + + def set_print_scale(self, inches_per_ft: float): + self.prefs['print_in_per_ft'] = float(inches_per_ft); save_prefs(self.prefs) + self.statusBar().showMessage(f"Print scale set: {inches_per_ft}\" = 1'-0\"") + + def set_print_scale_custom(self): + val, ok = QtWidgets.QInputDialog.getDouble(self, "Custom Print Scale", "Inches per foot", float(self.prefs.get('print_in_per_ft',0.125)), 0.01, 12.0, 3) + if ok: + self.set_print_scale(val) + + # ---------- help / about ---------- + def show_user_guide(self): + self._show_text_dialog("User Guide", _USER_GUIDE_TEXT) + + def show_shortcuts(self): + self._show_text_dialog("Keyboard Shortcuts", _SHORTCUTS_TEXT) + + def show_about(self): + txt = f"Auto-Fire CAD Base\nVersion: {APP_VERSION}\n\nA lightweight CAD base inspired by LibreCAD, with paper space and DXF/PDF underlays." + self._show_text_dialog("About Auto-Fire", txt) + + def _show_text_dialog(self, title: str, text: str): + dlg = QtWidgets.QDialog(self); dlg.setWindowTitle(title); dlg.resize(720, 480) + lay = QtWidgets.QVBoxLayout(dlg) + edit = QtWidgets.QTextEdit(); edit.setReadOnly(True); edit.setPlainText(text) + lay.addWidget(edit) + bb = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Close) + bb.rejected.connect(dlg.reject); bb.accepted.connect(dlg.accept) + lay.addWidget(bb) + dlg.exec() + + def export_device_schedule_csv(self): + p,_ = QFileDialog.getSaveFileName(self, "Export Device Schedule", "", "CSV Files (*.csv)") + if not p: + return + if not p.lower().endswith('.csv'): + p += '.csv' + import csv + # Count devices by model/name/symbol + rows = [] + counts = {} + for it in self.layer_devices.childItems(): + if isinstance(it, DeviceItem): + key = (it.name, it.symbol, getattr(it, 'manufacturer',''), getattr(it, 'part_number','')) + counts[key] = counts.get(key, 0) + 1 + try: + with open(p, 'w', newline='', encoding='utf-8') as f: + w = csv.writer(f) + w.writerow(['Name','Symbol','Manufacturer','Model','Qty']) + for (name, sym, mfr, model), qty in sorted(counts.items()): + w.writerow([name, sym, mfr, model, qty]) + self.statusBar().showMessage(f"Exported schedule: {os.path.basename(p)}") + except Exception as ex: + QMessageBox.critical(self, "Export CSV Error", str(ex)) + + def place_symbol_legend(self): + # Counts by name/symbol and places a simple table on overlay + counts = {} + for it in self.layer_devices.childItems(): + if isinstance(it, DeviceItem): + key = (it.name, it.symbol) + counts[key] = counts.get(key, 0) + 1 + if not counts: + QMessageBox.information(self, "Legend", "No devices to list.") + return + # Place near current view center + try: + vc = self.view.mapToScene(self.view.viewport().rect().center()) + x0, y0 = vc.x() - 150, vc.y() - 100 + except Exception: + x0, y0 = 50, 50 + row_h = 18 + header = QtWidgets.QGraphicsSimpleTextItem("Legend: Device Counts") + header.setBrush(QtGui.QBrush(QtGui.QColor("#e0e0e0"))) + header.setFlag(QtWidgets.QGraphicsItem.ItemIgnoresTransformations, True) + header.setPos(x0, y0) + header.setParentItem(self.layer_overlay) + i = 1 + for (name, sym), qty in sorted(counts.items()): + t = QtWidgets.QGraphicsSimpleTextItem(f"{sym} {name} x {qty}") + t.setBrush(QtGui.QBrush(QtGui.QColor("#e0e0e0"))) + t.setFlag(QtWidgets.QGraphicsItem.ItemIgnoresTransformations, True) + t.setPos(x0, y0 + i*row_h) + t.setParentItem(self.layer_overlay) + i += 1 + self.statusBar().showMessage("Placed symbol legend") + +# Inline help content (can be moved to a file later) +_USER_GUIDE_TEXT = """ +Auto-Fire CAD Base — User Guide (Quick) + +• Pan: Hold Space + Left Drag, or Middle-mouse Drag +• Zoom: Mouse wheel +• Select: Click items, or Drag a box in empty space +• Delete: Del key or Edit → Delete + +Draw (Tools menu): Line, Rect, Circle, Polyline, Arc (3‑Point), Wire, Text + +Modify (Modify menu): Offset, Trim, Extend, Fillet (Corner), Move, Copy, Rotate, Mirror, Scale, Chamfer + +Measure/Dimension: Tools → Measure, Dimension (D) + +Snaps: View → Object Snaps (Endpoint, Midpoint, Center) + +Underlays: File → Import → DXF/PDF Underlay + +Paper Space: Layout → Add Page Frame, Print Scale presets, Export PNG/PDF + +Settings: File → Settings → Theme +""" + +_SHORTCUTS_TEXT = """ +Keyboard Shortcuts + +• L Line +• R Rect +• C Circle +• P Polyline +• A Arc (3‑Point) +• W Wire +• T Text +• M Measure +• O Offset +• D Dimension +• X Toggle Crosshair +• Esc Cancel/Finish +• F2 Fit View +""" + # factory for boot.py def create_window(): return MainWindow() diff --git a/app/tools/__pycache__/__init__.cpython-311.pyc b/app/tools/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 0d10375..0000000 Binary files a/app/tools/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/app/tools/__pycache__/align.cpython-311.pyc b/app/tools/__pycache__/align.cpython-311.pyc deleted file mode 100644 index 1c10a5b..0000000 Binary files a/app/tools/__pycache__/align.cpython-311.pyc and /dev/null differ diff --git a/app/tools/__pycache__/array.cpython-311.pyc b/app/tools/__pycache__/array.cpython-311.pyc deleted file mode 100644 index cba2208..0000000 Binary files a/app/tools/__pycache__/array.cpython-311.pyc and /dev/null differ diff --git a/app/tools/__pycache__/dimension.cpython-311.pyc b/app/tools/__pycache__/dimension.cpython-311.pyc deleted file mode 100644 index 60ec196..0000000 Binary files a/app/tools/__pycache__/dimension.cpython-311.pyc and /dev/null differ diff --git a/app/tools/__pycache__/draw.cpython-311.pyc b/app/tools/__pycache__/draw.cpython-311.pyc deleted file mode 100644 index 77bd7da..0000000 Binary files a/app/tools/__pycache__/draw.cpython-311.pyc and /dev/null differ diff --git a/app/tools/__pycache__/transform.cpython-311.pyc b/app/tools/__pycache__/transform.cpython-311.pyc deleted file mode 100644 index 9f7aaf3..0000000 Binary files a/app/tools/__pycache__/transform.cpython-311.pyc and /dev/null differ diff --git a/app/tools/cad_core.py b/app/tools/cad_core.py new file mode 100644 index 0000000..be80446 --- /dev/null +++ b/app/tools/cad_core.py @@ -0,0 +1,152 @@ +from __future__ import annotations + +from dataclasses import dataclass +from typing import Iterable, List, Tuple + +from PySide6 import QtCore, QtGui, QtWidgets + + +# Centralized Z-values for drawing layers to keep ordering predictable +Z_UNDERLAY = -50 +Z_SKETCH = 40 +Z_WIRES = 60 +Z_DEVICES = 100 +Z_OVERLAY = 200 + + +def _hairline_pen(color: QtGui.QColor | str, width_px: float = 0.0) -> QtGui.QPen: + col = QtGui.QColor(color) if not isinstance(color, QtGui.QColor) else color + pen = QtGui.QPen(col) + pen.setCosmetic(True) + if width_px > 0: + pen.setWidthF(float(width_px)) + return pen + + +@dataclass +class LayerStyle: + name: str + color: QtGui.QColor + width_px: float = 0.0 + + def pen(self) -> QtGui.QPen: + return _hairline_pen(self.color, self.width_px) + + +class LayerStyleRegistry: + """Manages CAD layer display styles (pen/brush), providing safe defaults. + + This avoids ad-hoc pen setup scattered across tools and keeps a single + place to tweak look-and-feel (and to enforce guardrails, e.g., cosmetic lines). + """ + + def __init__(self): + self._styles: dict[str, LayerStyle] = {} + # Defaults (dark theme friendly) + self.register(LayerStyle("sketch", QtGui.QColor("#e0e0e0"), 0.0)) + self.register(LayerStyle("guide", QtGui.QColor("#7aa2f7"), 0.0)) + self.register(LayerStyle("overlay", QtGui.QColor("#c0caf5"), 0.0)) + self.register(LayerStyle("wire", QtGui.QColor("#2aa36b"), 2.0)) + + def register(self, style: LayerStyle): + self._styles[style.name] = style + + def get(self, name: str, fallback: str = "sketch") -> LayerStyle: + return self._styles.get(name) or self._styles[fallback] + + +STYLES = LayerStyleRegistry() + + +def ensure_parent(item: QtWidgets.QGraphicsItem, parent_group: QtWidgets.QGraphicsItemGroup, z: float) -> None: + """Attach item to a parent group and set Z-order. Safe no-op if already attached.""" + try: + if item.parentItem() is not parent_group: + item.setParentItem(parent_group) + if item.zValue() != z: + item.setZValue(z) + except Exception: + pass + + +def _finite(v: float) -> bool: + return v is not None and v == v and v not in (float("inf"), float("-inf")) + + +def _valid_point(p: QtCore.QPointF) -> bool: + return _finite(p.x()) and _finite(p.y()) + + +def add_line(layer: QtWidgets.QGraphicsItemGroup, + a: QtCore.QPointF, + b: QtCore.QPointF, + style: str = "sketch") -> QtWidgets.QGraphicsLineItem | None: + if not (_valid_point(a) and _valid_point(b)): + return None + it = QtWidgets.QGraphicsLineItem(a.x(), a.y(), b.x(), b.y()) + it.setPen(STYLES.get(style).pen()) + ensure_parent(it, layer, Z_SKETCH) + return it + + +def add_rect(layer: QtWidgets.QGraphicsItemGroup, + p0: QtCore.QPointF, + p1: QtCore.QPointF, + style: str = "sketch") -> QtWidgets.QGraphicsRectItem | None: + if not (_valid_point(p0) and _valid_point(p1)): + return None + rect = QtCore.QRectF(p0, p1).normalized() + it = QtWidgets.QGraphicsRectItem(rect) + it.setPen(STYLES.get(style).pen()) + it.setBrush(QtCore.Qt.NoBrush) + ensure_parent(it, layer, Z_SKETCH) + return it + + +def add_circle(layer: QtWidgets.QGraphicsItemGroup, + center: QtCore.QPointF, + radius: float, + style: str = "sketch") -> QtWidgets.QGraphicsEllipseItem | None: + r = float(radius) + if not _valid_point(center) or not _finite(r) or r <= 0.0: + return None + it = QtWidgets.QGraphicsEllipseItem(center.x()-r, center.y()-r, 2*r, 2*r) + it.setPen(STYLES.get(style).pen()) + it.setBrush(QtCore.Qt.NoBrush) + ensure_parent(it, layer, Z_SKETCH) + return it + + +def add_polyline(layer: QtWidgets.QGraphicsItemGroup, + points: Iterable[QtCore.QPointF], + style: str = "sketch", + close: bool = False) -> QtWidgets.QGraphicsPathItem | None: + pts: List[QtCore.QPointF] = [QtCore.QPointF(p) for p in points if _valid_point(QtCore.QPointF(p))] + if len(pts) < 2: + return None + path = QtGui.QPainterPath(pts[0]) + for p in pts[1:]: + path.lineTo(p) + if close: + path.closeSubpath() + it = QtWidgets.QGraphicsPathItem(path) + it.setPen(STYLES.get(style).pen()) + it.setBrush(QtCore.Qt.NoBrush) + ensure_parent(it, layer, Z_SKETCH) + return it + + +def add_wire(layer: QtWidgets.QGraphicsItemGroup, + a: QtCore.QPointF, + b: QtCore.QPointF) -> QtWidgets.QGraphicsPathItem | None: + """Add a thicker, green cosmetic wire segment with guardrails.""" + if not (_valid_point(a) and _valid_point(b)): + return None + path = QtGui.QPainterPath(a) + path.lineTo(b) + it = QtWidgets.QGraphicsPathItem(path) + it.setPen(STYLES.get("wire").pen()) + it.setBrush(QtCore.Qt.NoBrush) + ensure_parent(it, layer, Z_WIRES) + return it + diff --git a/app/tools/chamfer_tool.py b/app/tools/chamfer_tool.py new file mode 100644 index 0000000..a41f7c2 --- /dev/null +++ b/app/tools/chamfer_tool.py @@ -0,0 +1,79 @@ +from PySide6 import QtCore, QtGui, QtWidgets + + +def _nearest_line_item(scene: QtWidgets.QGraphicsScene, p: QtCore.QPointF): + box = QtCore.QRectF(p.x()-4, p.y()-4, 8, 8) + for it in scene.items(box): + if isinstance(it, QtWidgets.QGraphicsLineItem): + return it + return None + + +class ChamferTool: + def __init__(self, window): + self.win = window + self.active = False + self.first = None + self.d1 = 1.0 + self.d2 = 1.0 + + def start(self): + self.active = True + self.first = None + dlg = QtWidgets.QDialog(self.win); dlg.setWindowTitle("Chamfer") + form = QtWidgets.QFormLayout(dlg) + s1 = QtWidgets.QDoubleSpinBox(); s1.setRange(0, 1000); s1.setDecimals(2); s1.setValue(1.0) + s2 = QtWidgets.QDoubleSpinBox(); s2.setRange(0, 1000); s2.setDecimals(2); s2.setValue(1.0) + form.addRow("Distance 1 (ft):", s1); form.addRow("Distance 2 (ft):", s2) + bb = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok|QtWidgets.QDialogButtonBox.Cancel); form.addRow(bb) + bb.accepted.connect(dlg.accept); bb.rejected.connect(dlg.reject) + if dlg.exec() == QtWidgets.QDialog.Accepted: + self.d1 = float(s1.value()); self.d2 = float(s2.value()) + self.win.statusBar().showMessage("Chamfer: click first line, then second") + else: + self.active = False + + def cancel(self): + self.active = False + self.first = None + + def on_mouse_move(self, p: QtCore.QPointF): + pass + + def on_click(self, p: QtCore.QPointF): + if not self.active: return False + sc = self.win.scene + it = _nearest_line_item(sc, p) + if it is None: + return False + if self.first is None: + self.first = it + return False + if it is self.first: + return False + # Trim both lines back by distances along each from the intersection point + l1 = QtCore.QLineF(self.first.line()); l2 = QtCore.QLineF(it.line()) + ip = QtCore.QPointF() + inter = l1.intersect(l2, ip) + if inter == QtCore.QLineF.NoIntersection: + self.active = False; self.first=None + return False + def move_line(line: QtCore.QLineF, dist_ft: float, px_per_ft: float): + import math + a = QtCore.QPointF(line.x1(), line.y1()); b = QtCore.QPointF(line.x2(), line.y2()) + da = QtCore.QLineF(a, ip).length(); db = QtCore.QLineF(b, ip).length() + dpx = dist_ft * px_per_ft + if da < db: + v = QtCore.QLineF(ip, a); ln = v.length() or 1.0; ux = (a.x()-ip.x())/ln; uy = (a.y()-ip.y())/ln + a = QtCore.QPointF(ip.x()+ux*dpx, ip.y()+uy*dpx) + else: + v = QtCore.QLineF(ip, b); ln = v.length() or 1.0; ux = (b.x()-ip.x())/ln; uy = (b.y()-ip.y())/ln + b = QtCore.QPointF(ip.x()+ux*dpx, ip.y()+uy*dpx) + return QtCore.QLineF(a, b) + nl1 = move_line(l1, self.d1, self.win.px_per_ft) + nl2 = move_line(l2, self.d2, self.win.px_per_ft) + self.first.setLine(nl1) + it.setLine(nl2) + self.active=False; self.first=None + return True + diff --git a/app/tools/draw.py b/app/tools/draw.py index f6ba6b1..a205f98 100644 --- a/app/tools/draw.py +++ b/app/tools/draw.py @@ -7,6 +7,8 @@ class DrawMode(IntEnum): RECT = 2 CIRCLE = 3 POLYLINE = 4 + ARC3 = 5 + WIRE = 6 class DrawController: def __init__(self, window, layer): @@ -22,6 +24,17 @@ def set_mode(self, mode: DrawMode): self.win.statusBar().showMessage(f"Draw: {mode.name.title()} — click to start, Esc to finish") def finish(self): + # Commit polyline if user ends with Esc and we have >=2 points + if self.mode == DrawMode.POLYLINE and len(self.points) >= 2: + path = QtGui.QPainterPath(self.points[0]) + for pt in self.points[1:]: + path.lineTo(pt) + it = QtWidgets.QGraphicsPathItem(path) + pen = QtGui.QPen(QtGui.QColor("#e0e0e0")); pen.setCosmetic(True) + it.setPen(pen); it.setZValue(20); it.setParentItem(self.layer) + it.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True) + it.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True) + # Cleanup preview if self.temp_item and self.temp_item.scene(): self.temp_item.scene().removeItem(self.temp_item) self.temp_item = None @@ -38,10 +51,12 @@ def on_mouse_move(self, pt_scene: QtCore.QPointF, shift_ortho=False): if dx > dy: p1.setY(p0.y()) else: p1.setX(p0.x()) - if self.mode == DrawMode.LINE: + if self.mode in (DrawMode.LINE, DrawMode.WIRE): if self.temp_item is None: self.temp_item = QtWidgets.QGraphicsLineItem() - pen = QtGui.QPen(QtGui.QColor("#7aa2f7")); pen.setCosmetic(True) + col = "#2aa36b" if self.mode==DrawMode.WIRE else "#7aa2f7" + pen = QtGui.QPen(QtGui.QColor(col)); pen.setCosmetic(True) + if self.mode==DrawMode.WIRE: pen.setWidth(2) self.temp_item.setPen(pen); self.temp_item.setParentItem(self.layer) self.temp_item.setLine(p0.x(), p0.y(), p1.x(), p1.y()) @@ -71,6 +86,21 @@ def on_mouse_move(self, pt_scene: QtCore.QPointF, shift_ortho=False): path.lineTo(pt) path.lineTo(p1) self.temp_item.setPath(path) + elif self.mode == DrawMode.ARC3 and len(self.points) == 2: + # live preview for 3-point arc after two points chosen + a, b = self.points[0], self.points[1] + c = p1 + cx, cy, r, start_deg, span_deg = _circle_from_3pts(a, b, c) + if r > 0: + if self.temp_item is None: + self.temp_item = QtWidgets.QGraphicsPathItem() + pen = QtGui.QPen(QtGui.QColor("#bb9af7")); pen.setCosmetic(True) + self.temp_item.setPen(pen); self.temp_item.setParentItem(self.layer) + rect = QtCore.QRectF(cx-r, cy-r, 2*r, 2*r) + path = QtGui.QPainterPath() + path.arcMoveTo(rect, start_deg) + path.arcTo(rect, start_deg, span_deg) + self.temp_item.setPath(path) def on_click(self, pt_scene: QtCore.QPointF, shift_ortho=False): if self.mode == DrawMode.NONE: @@ -84,16 +114,33 @@ def on_click(self, pt_scene: QtCore.QPointF, shift_ortho=False): if dx > dy: p1.setY(p0.y()) else: p1.setX(p0.x()) - if self.mode in (DrawMode.LINE, DrawMode.RECT, DrawMode.CIRCLE): - if self.mode == DrawMode.LINE: + if self.mode in (DrawMode.LINE, DrawMode.WIRE, DrawMode.RECT, DrawMode.CIRCLE, DrawMode.ARC3): + if self.mode in (DrawMode.LINE, DrawMode.WIRE): it = QtWidgets.QGraphicsLineItem(p0.x(), p0.y(), p1.x(), p1.y()) elif self.mode == DrawMode.RECT: it = QtWidgets.QGraphicsRectItem(QtCore.QRectF(p0, p1).normalized()) - else: + elif self.mode == DrawMode.CIRCLE: r = QtCore.QLineF(p0, p1).length() it = QtWidgets.QGraphicsEllipseItem(p0.x()-r, p0.y()-r, 2*r, 2*r) + else: # ARC3: need 3rd click to finalize + if len(self.points) < 2: + self.points.append(p1) + return False + a, b = self.points[0], self.points[1] + c = p1 + cx, cy, r, start_deg, span_deg = _circle_from_3pts(a, b, c) + if r <= 0: + self.finish(); return True + rect = QtCore.QRectF(cx-r, cy-r, 2*r, 2*r) + path = QtGui.QPainterPath() + path.arcMoveTo(rect, start_deg) + path.arcTo(rect, start_deg, span_deg) + it = QtWidgets.QGraphicsPathItem(path) pen = QtGui.QPen(QtGui.QColor("#e0e0e0")); pen.setCosmetic(True) + if self.mode == DrawMode.WIRE: pen.setWidth(2) it.setPen(pen); it.setZValue(20); it.setParentItem(self.layer) + it.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True) + it.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True) self.finish() return True @@ -101,3 +148,36 @@ def on_click(self, pt_scene: QtCore.QPointF, shift_ortho=False): self.points.append(p1) return False return False + + # Programmatic helpers for command bar + def add_point_command(self, pt_scene: QtCore.QPointF) -> bool: + """Feed a point from command input; returns True if an entity was committed.""" + if self.mode == DrawMode.NONE: + return False + if not self.points: + self.points = [QtCore.QPointF(pt_scene)] + return False + return self.on_click(pt_scene, shift_ortho=False) + + +def _circle_from_3pts(a: QtCore.QPointF, b: QtCore.QPointF, c: QtCore.QPointF): + # Compute circle through 3 points; return center, radius, and start/span in degrees from point a→b→c + ax, ay = a.x(), a.y(); bx, by = b.x(), b.y(); cx, cy = c.x(), c.y() + d = 2 * (ax*(by-cy) + bx*(cy-ay) + cx*(ay-by)) + if abs(d) < 1e-6: + return 0.0, 0.0, -1.0, 0.0, 0.0 + ux = ((ax*ax+ay*ay)*(by-cy) + (bx*bx+by*by)*(cy-ay) + (cx*cx+cy*cy)*(ay-by)) / d + uy = ((ax*ax+ay*ay)*(cx-bx) + (bx*bx+by*by)*(ax-cx) + (cx*cx+cy*cy)*(bx-ax)) / d + r = QtCore.QLineF(QtCore.QPointF(ux, uy), a).length() + import math + def ang(px, py): + return math.degrees(math.atan2(- (py-uy), (px-ux))) + a0 = ang(ax, ay); a1 = ang(bx, by); a2 = ang(cx, cy) + # sweep from a0->a2 passing near a1; choose smaller abs sweep that still passes a1 heuristically + def norm(x): + while x <= -180: x += 360 + while x > 180: x -= 360 + return x + s1 = norm(a1 - a0); s2 = norm(a2 - a0) + # ensure sweep includes a1 directionally; simple heuristic: use s2 as span + return ux, uy, r, a0, s2 diff --git a/app/tools/extend_tool.py b/app/tools/extend_tool.py new file mode 100644 index 0000000..b59565a --- /dev/null +++ b/app/tools/extend_tool.py @@ -0,0 +1,81 @@ +from PySide6 import QtCore, QtGui, QtWidgets + + +def _nearest_line_item(scene: QtWidgets.QGraphicsScene, p: QtCore.QPointF): + box = QtCore.QRectF(p.x()-4, p.y()-4, 8, 8) + for it in scene.items(box): + if isinstance(it, QtWidgets.QGraphicsLineItem): + return it + return None + + +def _line_from_item(it: QtWidgets.QGraphicsLineItem) -> QtCore.QLineF: + return QtCore.QLineF(it.line()) + + +def _intersection_point(l1: QtCore.QLineF, l2: QtCore.QLineF): + x1, y1, x2, y2 = l1.x1(), l1.y1(), l1.x2(), l1.y2() + x3, y3, x4, y4 = l2.x1(), l2.y1(), l2.x2(), l2.y2() + den = (x1-x2)*(y3-y4) - (y1-y2)*(x3-x4) + if abs(den) < 1e-9: + return None + px = ((x1*y2 - y1*x2)*(x3 - x4) - (x1 - x2)*(x3*y4 - y3*x4)) / den + py = ((x1*y2 - y1*x2)*(y3 - y4) - (y1 - y2)*(x3*y4 - y3*x4)) / den + return QtCore.QPointF(px, py) + + +class ExtendTool: + """Extend target line to meet boundary (cutting) line at intersection. + + Limitations: operates on QGraphicsLineItem only; extends the endpoint + closest to the pick point. + """ + def __init__(self, window): + self.win = window + self.active = False + self.boundary = None + + def start(self): + self.active = True + self.boundary = None + self.win.statusBar().showMessage("Extend: click boundary line, then target line to extend") + + def cancel(self): + self.active = False + self.boundary = None + + def on_mouse_move(self, p: QtCore.QPointF): + pass + + def on_click(self, p: QtCore.QPointF): + if not self.active: + return False + sc = self.win.scene + it = _nearest_line_item(sc, p) + if it is None: + self.win.statusBar().showMessage("Extend: no line here") + return False + if self.boundary is None: + self.boundary = it + self.win.statusBar().showMessage("Extend: now click target line to extend") + return False + if it is self.boundary: + self.win.statusBar().showMessage("Extend: pick a different target line") + return False + lcut = _line_from_item(self.boundary) + ltar = _line_from_item(it) + ip = _intersection_point(lcut, ltar) + if ip is None: + self.win.statusBar().showMessage("Extend: lines do not intersect") + self.active = False; self.boundary = None + return False + d1 = QtCore.QLineF(p, QtCore.QPointF(ltar.x1(), ltar.y1())).length() + d2 = QtCore.QLineF(p, QtCore.QPointF(ltar.x2(), ltar.y2())).length() + if d1 < d2: + it.setLine(ip.x(), ip.y(), ltar.x2(), ltar.y2()) + else: + it.setLine(ltar.x1(), ltar.y1(), ip.x(), ip.y()) + self.active = False; self.boundary = None + self.win.statusBar().showMessage("Extended") + return True + diff --git a/app/tools/fillet_radius_tool.py b/app/tools/fillet_radius_tool.py new file mode 100644 index 0000000..9c397d1 --- /dev/null +++ b/app/tools/fillet_radius_tool.py @@ -0,0 +1,140 @@ +from PySide6 import QtCore, QtGui, QtWidgets +import math + + +def _nearest_line(scene: QtWidgets.QGraphicsScene, p: QtCore.QPointF): + box = QtCore.QRectF(p.x()-4, p.y()-4, 8, 8) + for it in scene.items(box): + if isinstance(it, QtWidgets.QGraphicsLineItem): + return it + return None + + +def _angle_between(l1: QtCore.QLineF, l2: QtCore.QLineF) -> float: + a1 = math.atan2(l1.y2()-l1.y1(), l1.x2()-l1.x1()) + a2 = math.atan2(l2.y2()-l2.y1(), l2.x2()-l2.x1()) + d = abs(a2-a1) + while d > math.pi: d -= 2*math.pi + return abs(d) + + +def _line_unit(line: QtCore.QLineF) -> tuple[float, float]: + dx = line.x2()-line.x1(); dy = line.y2()-line.y1() + ln = math.hypot(dx, dy) or 1.0 + return dx/ln, dy/ln + + +class FilletRadiusTool: + """Fillet with radius between two lines: trims lines and inserts arc tangent to both. + + Simplified: handles straight QGraphicsLineItem pairs that intersect at a point. + """ + + def __init__(self, window, layer): + self.win = window + self.layer = layer + self.active = False + self.r_ft = 1.0 + self.first = None + + def start(self): + dlg = QtWidgets.QInputDialog(self.win) + dlg.setInputMode(QtWidgets.QInputDialog.DoubleInput) + dlg.setLabelText("Radius (ft)") + dlg.setDoubleDecimals(2) + dlg.setDoubleRange(0.01, 1000.0) + dlg.setDoubleValue(1.0) + if dlg.exec() != QtWidgets.QDialog.Accepted: + self.active = False; self.first=None + return + self.r_ft = float(dlg.doubleValue()) + self.active = True + self.first = None + self.win.statusBar().showMessage("Fillet(radius): click first line, then second line") + + def cancel(self): + self.active = False + self.first = None + + def on_mouse_move(self, p: QtCore.QPointF): + pass + + def on_click(self, p: QtCore.QPointF): + if not self.active: + return False + sc = self.win.scene + it = _nearest_line(sc, p) + if it is None: + return False + if self.first is None: + self.first = it + return False + if it is self.first: + return False + l1 = QtCore.QLineF(self.first.line()) + l2 = QtCore.QLineF(it.line()) + ip = QtCore.QPointF() + if l1.intersect(l2, ip) != QtCore.QLineF.IntersectType.BoundedIntersection and l1.intersect(l2, ip) != QtCore.QLineF.IntersectType.UnboundedIntersection: + self.active=False; self.first=None + return False + theta = _angle_between(l1, l2) + if theta <= 1e-6 or theta >= math.pi-1e-6: + self.active=False; self.first=None + return False + r_px = self.r_ft * float(self.win.px_per_ft) + d = r_px * math.tan(theta/2.0) + # Trim back along each line from ip by distance d + def trim_point(line: QtCore.QLineF): + a = QtCore.QPointF(line.x1(), line.y1()); b = QtCore.QPointF(line.x2(), line.y2()) + # choose endpoint closer to ip to retreat from ip along line direction + da = QtCore.QLineF(ip, a).length(); db = QtCore.QLineF(ip, b).length() + # unit vectors from ip towards endpoints + if da <= db: + dirl = QtCore.QLineF(ip, a) + ux, uy = _line_unit(dirl) + return QtCore.QPointF(ip.x()+ux*d, ip.y()+uy*d) + else: + dirl = QtCore.QLineF(ip, b) + ux, uy = _line_unit(dirl) + return QtCore.QPointF(ip.x()+ux*d, ip.y()+uy*d) + p1 = trim_point(l1); p2 = trim_point(l2) + # Update original lines to end at p1/p2 from their far endpoints + def update_line(orig: QtWidgets.QGraphicsLineItem, line: QtCore.QLineF, trim_pt: QtCore.QPointF): + a = QtCore.QPointF(line.x1(), line.y1()); b = QtCore.QPointF(line.x2(), line.y2()) + # keep far endpoint, set near endpoint to trim_pt + if QtCore.QLineF(ip, a).length() <= QtCore.QLineF(ip, b).length(): + orig.setLine(trim_pt.x(), trim_pt.y(), b.x(), b.y()) + else: + orig.setLine(a.x(), a.y(), trim_pt.x(), trim_pt.y()) + update_line(self.first, l1, p1); update_line(it, l2, p2) + # Arc center calculation: bisector direction from corner + # Compute unit directions from ip towards p1 and p2 + u1 = _line_unit(QtCore.QLineF(ip, p1)) + u2 = _line_unit(QtCore.QLineF(ip, p2)) + # Normalize bisector + bx, by = (u1[0]+u2[0]), (u1[1]+u2[1]) + bl = math.hypot(bx, by) or 1.0 + bx /= bl; by /= bl + # center is at distance r/sin(theta/2) from ip along bisector + cc = r_px / math.sin(theta/2.0) + cx = ip.x() + bx * cc + cy = ip.y() + by * cc + # Build arc between p1 and p2 + rect = QtCore.QRectF(cx - r_px, cy - r_px, 2*r_px, 2*r_px) + start_ang = math.degrees(math.atan2(-(p1.y()-cy), (p1.x()-cx))) + end_ang = math.degrees(math.atan2(-(p2.y()-cy), (p2.x()-cx))) + sweep = end_ang - start_ang + # normalize sweep to the smaller arc consistent with corner + while sweep <= -180: sweep += 360 + while sweep > 180: sweep -= 360 + path = QtGui.QPainterPath() + path.arcMoveTo(rect, start_ang) + path.arcTo(rect, start_ang, sweep) + arc_item = QtWidgets.QGraphicsPathItem(path) + pen = QtGui.QPen(QtGui.QColor("#e0e0e0")); pen.setCosmetic(True) + arc_item.setPen(pen); arc_item.setZValue(20); arc_item.setParentItem(self.layer) + arc_item.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True) + arc_item.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True) + self.active=False; self.first=None + return True + diff --git a/app/tools/fillet_tool.py b/app/tools/fillet_tool.py new file mode 100644 index 0000000..1ca5235 --- /dev/null +++ b/app/tools/fillet_tool.py @@ -0,0 +1,85 @@ +from PySide6 import QtCore, QtGui, QtWidgets + + +def _nearest_line_item(scene: QtWidgets.QGraphicsScene, p: QtCore.QPointF): + box = QtCore.QRectF(p.x()-4, p.y()-4, 8, 8) + for it in scene.items(box): + if isinstance(it, QtWidgets.QGraphicsLineItem): + return it + return None + + +def _line_from_item(it: QtWidgets.QGraphicsLineItem) -> QtCore.QLineF: + return QtCore.QLineF(it.line()) + + +def _intersection_point(l1: QtCore.QLineF, l2: QtCore.QLineF): + x1, y1, x2, y2 = l1.x1(), l1.y1(), l1.x2(), l1.y2() + x3, y3, x4, y4 = l2.x1(), l2.y1(), l2.x2(), l2.y2() + den = (x1-x2)*(y3-y4) - (y1-y2)*(x3-x4) + if abs(den) < 1e-9: + return None + px = ((x1*y2 - y1*x2)*(x3 - x4) - (x1 - x2)*(x3*y4 - y3*x4)) / den + py = ((x1*y2 - y1*x2)*(y3 - y4) - (y1 - y2)*(x3*y4 - y3*x4)) / den + return QtCore.QPointF(px, py) + + +class FilletTool: + """Zero-radius fillet (corner): trims/extends two lines so they meet at intersection. + + Note: This implements fillet with radius=0 for speed. Radius arcs can be + added later. + """ + def __init__(self, window): + self.win = window + self.active = False + self.first = None + + def start(self): + self.active = True + self.first = None + self.win.statusBar().showMessage("Fillet: click first line, then second line") + + def cancel(self): + self.active = False + self.first = None + + def on_mouse_move(self, p: QtCore.QPointF): + pass + + def on_click(self, p: QtCore.QPointF): + if not self.active: + return False + sc = self.win.scene + it = _nearest_line_item(sc, p) + if it is None: + self.win.statusBar().showMessage("Fillet: no line here") + return False + if self.first is None: + self.first = it + self.win.statusBar().showMessage("Fillet: now click the second line") + return False + if it is self.first: + self.win.statusBar().showMessage("Fillet: pick a different second line") + return False + l1 = _line_from_item(self.first) + l2 = _line_from_item(it) + ip = _intersection_point(l1, l2) + if ip is None: + self.win.statusBar().showMessage("Fillet: lines do not intersect") + self.active = False; self.first = None + return False + # Trim/extend both to intersection + it1 = self.first; it2 = it + # choose closer endpoints to move for both lines + for (li, item) in ((l1, it1), (l2, it2)): + d1 = QtCore.QLineF(ip, QtCore.QPointF(li.x1(), li.y1())).length() + d2 = QtCore.QLineF(ip, QtCore.QPointF(li.x2(), li.y2())).length() + if d1 < d2: + item.setLine(ip.x(), ip.y(), li.x2(), li.y2()) + else: + item.setLine(li.x1(), li.y1(), ip.x(), ip.y()) + self.active = False; self.first = None + self.win.statusBar().showMessage("Fillet (corner) applied") + return True + diff --git a/app/tools/freehand.py b/app/tools/freehand.py new file mode 100644 index 0000000..e9fb198 --- /dev/null +++ b/app/tools/freehand.py @@ -0,0 +1,64 @@ +from PySide6 import QtCore, QtGui, QtWidgets + + +class FreehandTool: + def __init__(self, window, layer): + self.win = window + self.layer = layer + self.active = False + self.drawing = False + self.path_item = None + self.last_pt = None + + def start(self): + self.active = True + self.drawing = False + self.path_item = None + self.last_pt = None + self.win.statusBar().showMessage("Freehand: press and drag to draw, release to finish") + + def cancel(self): + self.active = False + if self.path_item and self.path_item.scene(): + try: self.path_item.scene().removeItem(self.path_item) + except Exception: pass + self.path_item = None + self.last_pt = None + self.drawing = False + + def on_press(self, p: QtCore.QPointF): + if not self.active: + return False + self.drawing = True + self.last_pt = QtCore.QPointF(p) + path = QtGui.QPainterPath(p) + self.path_item = QtWidgets.QGraphicsPathItem(path) + pen = QtGui.QPen(QtGui.QColor("#e0e0e0")); pen.setCosmetic(True) + self.path_item.setPen(pen); self.path_item.setZValue(20); self.path_item.setParentItem(self.layer) + return False + + def on_mouse_move(self, p: QtCore.QPointF): + if not (self.active and self.drawing and self.path_item): + return + if self.last_pt is None: + self.last_pt = QtCore.QPointF(p) + if QtCore.QLineF(self.last_pt, p).length() < 2.0: + return + path = QtGui.QPainterPath(self.path_item.path()) + path.lineTo(p) + self.path_item.setPath(path) + self.last_pt = QtCore.QPointF(p) + + def on_release(self, p: QtCore.QPointF): + if not self.active: + return False + if not self.drawing: + return False + self.drawing = False + if self.path_item: + self.path_item.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True) + self.path_item.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True) + self.active = False + self.win.statusBar().showMessage("Freehand path created") + return True + diff --git a/app/tools/leader.py b/app/tools/leader.py new file mode 100644 index 0000000..d4377e7 --- /dev/null +++ b/app/tools/leader.py @@ -0,0 +1,58 @@ +from PySide6 import QtCore, QtGui, QtWidgets + + +class LeaderTool: + def __init__(self, window, layer): + self.win = window + self.layer = layer + self.active = False + self.p0 = None + self.p1 = None + + def start(self): + self.active = True + self.p0 = None; self.p1 = None + self.win.statusBar().showMessage("Leader: click arrow point, then text point") + + def cancel(self): + self.active = False + self.p0 = None; self.p1 = None + + def on_mouse_move(self, p: QtCore.QPointF): + pass + + def on_click(self, p: QtCore.QPointF): + if not self.active: + return False + if self.p0 is None: + self.p0 = QtCore.QPointF(p) + return False + self.p1 = QtCore.QPointF(p) + txt, ok = QtWidgets.QInputDialog.getText(self.win, "Leader Text", "Text:") + if not ok: + self.active=False; return False + # line + line = QtWidgets.QGraphicsLineItem(self.p0.x(), self.p0.y(), self.p1.x(), self.p1.y()) + pen = QtGui.QPen(QtGui.QColor("#e0e0e0")); pen.setCosmetic(True) + line.setPen(pen); line.setZValue(20); line.setParentItem(self.layer) + line.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True) + line.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True) + # arrow head + v = QtCore.QLineF(self.p1, self.p0); v.setLength(12) + left = v.normalVector(); left.setLength(6); right = v.normalVector(); right.setLength(-6) + p2 = v.p2(); lpt = QtCore.QPointF(p2.x()+left.dx(), p2.y()+left.dy()) + rpt = QtCore.QPointF(p2.x()+right.dx(), p2.y()+right.dy()) + poly = QtGui.QPolygonF([self.p0, lpt, rpt]) + head = QtWidgets.QGraphicsPolygonItem(poly) + head.setBrush(QtGui.QColor("#e0e0e0")); head.setPen(QtGui.QPen(QtCore.Qt.NoPen)) + head.setZValue(20); head.setParentItem(self.layer) + # text + t = QtWidgets.QGraphicsSimpleTextItem(txt) + t.setBrush(QtGui.QBrush(QtGui.QColor("#e0e0e0"))) + t.setFlag(QtWidgets.QGraphicsItem.ItemIgnoresTransformations, True) + t.setPos(self.p1 + QtCore.QPointF(8, -8)) + t.setParentItem(self.layer) + t.setZValue(20) + self.active=False + return True + diff --git a/app/tools/measure_tool.py b/app/tools/measure_tool.py new file mode 100644 index 0000000..740230c --- /dev/null +++ b/app/tools/measure_tool.py @@ -0,0 +1,61 @@ +from PySide6 import QtCore, QtGui, QtWidgets + + +class MeasureTool: + def __init__(self, window, overlay_layer): + self.win = window + self.layer = overlay_layer + self.active = False + self.start_pt = None + self.temp = None + + def start(self): + self.active = True + self.start_pt = None + self._clear() + self.win.statusBar().showMessage("Measure: click first point, then second point") + + def cancel(self): + self.active = False + self._clear() + + def _clear(self): + if self.temp and self.temp.scene(): + self.temp.scene().removeItem(self.temp) + self.temp = None + + def on_mouse_move(self, p: QtCore.QPointF): + if not self.active or self.start_pt is None: + return + self._show_temp(self.start_pt, p) + + def _show_temp(self, a: QtCore.QPointF, b: QtCore.QPointF): + from app.tools.dimension import fmt_ft_inches + if self.temp is None: + group = QtWidgets.QGraphicsItemGroup() + pen = QtGui.QPen(QtGui.QColor("#e0e0e0")); pen.setCosmetic(True) + line = QtWidgets.QGraphicsLineItem() + line.setPen(pen); group.addToGroup(line) + txt = QtWidgets.QGraphicsSimpleTextItem("") + txt.setBrush(QtGui.QBrush(QtGui.QColor("#ffd166"))) + txt.setFlag(QtWidgets.QGraphicsItem.ItemIgnoresTransformations, True) + group.addToGroup(txt) + group.setParentItem(self.layer) + self.temp = (group, line, txt) + group, line, txt = self.temp + line.setLine(a.x(), a.y(), b.x(), b.y()) + mid = (a + b)/2 + txt.setText(fmt_ft_inches(QtCore.QLineF(a, b).length(), self.win.px_per_ft)) + txt.setPos(mid + QtCore.QPointF(8, -8)) + + def on_click(self, p: QtCore.QPointF): + if not self.active: + return False + if self.start_pt is None: + self.start_pt = p + return False + # second point finishes measurement (no persistence) + self.active = False + self.start_pt = None + return True + diff --git a/app/tools/mirror_tool.py b/app/tools/mirror_tool.py new file mode 100644 index 0000000..bd383af --- /dev/null +++ b/app/tools/mirror_tool.py @@ -0,0 +1,51 @@ +from PySide6 import QtCore, QtGui, QtWidgets + + +class MirrorTool: + def __init__(self, window): + self.win = window + self.active = False + self.p1 = None + self.p2 = None + + def start(self): + self.active = True + self.p1 = None; self.p2 = None + self.win.statusBar().showMessage("Mirror: click first point of axis, then second point") + + def cancel(self): + self.active = False + self.p1 = None; self.p2 = None + + def on_mouse_move(self, p: QtCore.QPointF): + pass + + def on_click(self, p: QtCore.QPointF): + if not self.active: + return False + if self.p1 is None: + self.p1 = p + return False + self.p2 = p + sel = list(self.win.scene.selectedItems()) + if not sel: + self.active = False; self.p1=None; self.p2=None + return False + # Build reflection transform about line p1-p2 + x1,y1 = self.p1.x(), self.p1.y(); x2,y2 = self.p2.x(), self.p2.y() + import math + a = math.atan2(y2-y1, x2-x1); deg = a*180.0/math.pi + t = QtGui.QTransform() + t.translate(x1, y1) + t.rotate(deg) + t.scale(1, -1) + t.rotate(-deg) + t.translate(-x1, -y1) + for it in sel: + try: + it.setTransform(t, combine=True) + except Exception: + pass + self.active = False; self.p1=None; self.p2=None + return True + diff --git a/app/tools/move_tool.py b/app/tools/move_tool.py new file mode 100644 index 0000000..63c954f --- /dev/null +++ b/app/tools/move_tool.py @@ -0,0 +1,62 @@ +from PySide6 import QtCore, QtWidgets + + +class MoveTool: + def __init__(self, window): + self.win = window + self.active = False + self.base = None + self.copy = False + + def start(self, copy=False): + self.active = True + self.base = None + self.copy = bool(copy) + self.win.statusBar().showMessage("Move: click base point, then destination") + + def cancel(self): + self.active = False + self.base = None + + def on_mouse_move(self, p: QtCore.QPointF): + pass + + def on_click(self, p: QtCore.QPointF): + if not self.active: + return False + if self.base is None: + self.base = p + return False + delta = p - self.base + sel = list(self.win.scene.selectedItems()) + if not sel: + self.active = False; self.base = None + return False + for it in sel: + try: + if self.copy: + # attempt to duplicate simple items + dup = None + if isinstance(it, QtWidgets.QGraphicsLineItem): + l = it.line(); dup = QtWidgets.QGraphicsLineItem(l) + elif isinstance(it, QtWidgets.QGraphicsRectItem): + r = it.rect(); dup = QtWidgets.QGraphicsRectItem(r) + elif isinstance(it, QtWidgets.QGraphicsEllipseItem): + r = it.rect(); dup = QtWidgets.QGraphicsEllipseItem(r) + elif isinstance(it, QtWidgets.QGraphicsPathItem): + dup = QtWidgets.QGraphicsPathItem(it.path()) + elif hasattr(it, 'to_json') and hasattr(type(it), 'from_json'): + dup = type(it).from_json(it.to_json()) + if dup is not None: + dup.setParentItem(it.parentItem()) + dup.setPos(it.pos() + delta) + dup.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True) + dup.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True) + else: + it.setPos(it.pos() + delta) + except Exception: + pass + self.active = False + self.base = None + return True + diff --git a/app/tools/revision_cloud.py b/app/tools/revision_cloud.py new file mode 100644 index 0000000..362dcb8 --- /dev/null +++ b/app/tools/revision_cloud.py @@ -0,0 +1,61 @@ +from PySide6 import QtCore, QtGui, QtWidgets + + +class RevisionCloudTool: + def __init__(self, window, layer): + self.win = window + self.layer = layer + self.active = False + self.points = [] + self.temp = None + + def start(self): + self.active = True + self.points = [] + self.temp = None + self.win.statusBar().showMessage("Rev Cloud: click to add points, Esc to finish") + + def cancel(self): + if self.temp and self.temp.scene(): + try: self.temp.scene().removeItem(self.temp) + except Exception: pass + self.temp=None; self.points=[]; self.active=False + + def on_mouse_move(self, p: QtCore.QPointF): + if not self.active or not self.points: + return + path = QtGui.QPainterPath(self.points[0]) + for pt in self.points[1:]: + path.lineTo(pt) + path.lineTo(p) + if not self.temp: + self.temp = QtWidgets.QGraphicsPathItem() + pen = QtGui.QPen(QtGui.QColor("#ffaa00")); pen.setCosmetic(True); pen.setWidth(3) + self.temp.setPen(pen); self.temp.setBrush(QtCore.Qt.NoBrush); self.temp.setParentItem(self.layer) + self.temp.setPath(path) + + def on_click(self, p: QtCore.QPointF): + if not self.active: + return False + self.points.append(QtCore.QPointF(p)) + return False + + def finish(self): + if not self.points: + self.cancel(); return False + path = QtGui.QPainterPath(self.points[0]) + for pt in self.points[1:]: + path.lineTo(pt) + item = QtWidgets.QGraphicsPathItem(path) + pen = QtGui.QPen(QtGui.QColor("#ffaa00")); pen.setCosmetic(True); pen.setWidth(3) + item.setPen(pen); item.setBrush(QtCore.Qt.NoBrush); item.setParentItem(self.layer) + item.setZValue(40) + item.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True) + item.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True) + if self.temp and self.temp.scene(): + try: self.temp.scene().removeItem(self.temp) + except Exception: pass + self.temp=None; self.points=[]; self.active=False + self.win.statusBar().showMessage("Revision cloud created") + return True + diff --git a/app/tools/rotate_tool.py b/app/tools/rotate_tool.py new file mode 100644 index 0000000..500b942 --- /dev/null +++ b/app/tools/rotate_tool.py @@ -0,0 +1,51 @@ +from PySide6 import QtCore, QtGui, QtWidgets + + +class RotateTool: + def __init__(self, window): + self.win = window + self.active = False + self.base = None + + def start(self): + self.active = True + self.base = None + self.win.statusBar().showMessage("Rotate: click base point, then enter angle") + + def cancel(self): + self.active = False + self.base = None + + def on_mouse_move(self, p: QtCore.QPointF): + pass + + def on_click(self, p: QtCore.QPointF): + if not self.active: + return False + if self.base is None: + self.base = p + # Prompt for angle degrees + val, ok = QtWidgets.QInputDialog.getDouble(self.win, "Rotate", "Angle (deg)", 90.0, -360.0, 360.0, 2) + if not ok: + self.active = False; self.base = None + return False + ang = float(val) + rad = ang * 3.141592653589793 / 180.0 + sel = list(self.win.scene.selectedItems()) + if not sel: + self.active = False; self.base = None + return False + cx, cy = self.base.x(), self.base.y() + t = QtGui.QTransform() + t.translate(cx, cy) + t.rotate(ang) + t.translate(-cx, -cy) + for it in sel: + try: + it.setTransform(t, combine=True) + except Exception: + pass + self.active = False; self.base = None + return True + return False + diff --git a/app/tools/scale_tool.py b/app/tools/scale_tool.py new file mode 100644 index 0000000..732e9b2 --- /dev/null +++ b/app/tools/scale_tool.py @@ -0,0 +1,45 @@ +from PySide6 import QtCore, QtGui, QtWidgets + + +class ScaleTool: + def __init__(self, window): + self.win = window + self.active = False + self.base = None + + def start(self): + self.active = True + self.base = None + self.win.statusBar().showMessage("Scale: click base point, then enter factor") + + def cancel(self): + self.active = False + self.base = None + + def on_mouse_move(self, p: QtCore.QPointF): + pass + + def on_click(self, p: QtCore.QPointF): + if not self.active: + return False + if self.base is None: + self.base = p + val, ok = QtWidgets.QInputDialog.getDouble(self.win, "Scale", "Factor", 1.0, 0.01, 1000.0, 3) + if not ok: + self.active = False; self.base=None + return False + f = float(val) + sel = list(self.win.scene.selectedItems()) + if not sel: + self.active = False; self.base=None + return False + cx, cy = self.base.x(), self.base.y() + t = QtGui.QTransform() + t.translate(cx, cy); t.scale(f, f); t.translate(-cx, -cy) + for it in sel: + try: it.setTransform(t, combine=True) + except Exception: pass + self.active = False; self.base=None + return True + return False + diff --git a/app/tools/scale_underlay.py b/app/tools/scale_underlay.py new file mode 100644 index 0000000..8a2408e --- /dev/null +++ b/app/tools/scale_underlay.py @@ -0,0 +1,111 @@ +from PySide6 import QtCore, QtGui, QtWidgets + + +class ScaleUnderlayRefTool: + def __init__(self, window, underlay_group: QtWidgets.QGraphicsItemGroup): + self.win = window + self.group = underlay_group + self.active = False + self.p1 = None + self.p2 = None + + def start(self): + self.active = True + self.p1 = None; self.p2 = None + self.win.statusBar().showMessage("Underlay Scale (Ref): click first point, then second point") + + def cancel(self): + self.active = False + self.p1 = None; self.p2 = None + + def on_mouse_move(self, p: QtCore.QPointF): + pass + + def on_click(self, p: QtCore.QPointF): + if not self.active: + return False + if self.p1 is None: + self.p1 = QtCore.QPointF(p) + return False + if self.p2 is None: + self.p2 = QtCore.QPointF(p) + # prompt for real distance (feet) + dist_px = QtCore.QLineF(self.p1, self.p2).length() + if dist_px <= 0.0: + self.active=False; return False + val, ok = QtWidgets.QInputDialog.getDouble(self.win, "Real Distance", "Distance (feet)", 10.0, 0.01, 100000.0, 3) + if not ok: + self.active=False; return False + factor = (float(val) * float(self.win.px_per_ft)) / float(dist_px) + # scale underlay about p1 + t = QtGui.QTransform() + t.translate(self.p1.x(), self.p1.y()) + t.scale(factor, factor) + t.translate(-self.p1.x(), -self.p1.y()) + try: + self.group.setTransform(t, combine=True) + except Exception: + pass + self.active=False + self.win.statusBar().showMessage(f"Underlay scaled by factor {factor:.4f}") + return True + return False + + +def scale_underlay_by_factor(group: QtWidgets.QGraphicsItemGroup, factor: float, anchor: QtCore.QPointF = QtCore.QPointF(0,0)): + t = QtGui.QTransform() + t.translate(anchor.x(), anchor.y()) + t.scale(float(factor), float(factor)) + t.translate(-anchor.x(), -anchor.y()) + group.setTransform(t, combine=True) + + +class ScaleUnderlayDragTool: + def __init__(self, window, underlay_group: QtWidgets.QGraphicsItemGroup): + self.win = window + self.group = underlay_group + self.active = False + self.anchor = None + self.orig = None + + def start(self): + self.active = True + self.anchor = None + self.orig = self.group.transform() + self.win.statusBar().showMessage("Underlay Scale (Drag): click anchor point, then move mouse; click again to commit, Esc to cancel") + + def cancel(self): + if self.active and self.orig is not None: + try: self.group.setTransform(self.orig) + except Exception: pass + self.active = False + self.anchor = None + self.orig = None + + def on_mouse_move(self, p: QtCore.QPointF): + if not self.active or self.anchor is None: + return + # scale factor from horizontal drag distance + try: + view = self.win.view + cur = p + dx = cur.x() - self.anchor.x() + factor = max(0.01, 1.0 + dx / 200.0) + t = QtGui.QTransform(self.orig) + t.translate(self.anchor.x(), self.anchor.y()) + t.scale(factor, factor) + t.translate(-self.anchor.x(), -self.anchor.y()) + self.group.setTransform(t) + self.win.statusBar().showMessage(f"Underlay Scale (Drag): factor={factor:.3f}") + except Exception: + pass + + def on_click(self, p: QtCore.QPointF): + if not self.active: + return False + if self.anchor is None: + self.anchor = QtCore.QPointF(p) + return False + # commit current transform + self.active = False; self.anchor=None; self.orig=None + return True diff --git a/app/tools/text_tool.py b/app/tools/text_tool.py new file mode 100644 index 0000000..e99dbc0 --- /dev/null +++ b/app/tools/text_tool.py @@ -0,0 +1,87 @@ +from PySide6 import QtCore, QtGui, QtWidgets + + +class TextTool: + def __init__(self, window, layer): + self.win = window + self.layer = layer + self.active = False + + def start(self): + self.active = True + self.win.statusBar().showMessage("Text: click to place, then enter text (use MText for scalable)") + + def cancel(self): + self.active = False + + def on_mouse_move(self, p: QtCore.QPointF): + pass + + def on_click(self, p: QtCore.QPointF): + if not self.active: + return False + txt, ok = QtWidgets.QInputDialog.getText(self.win, "Insert Text", "Text:") + if not ok or not txt: + self.active = False + return False + it = QtWidgets.QGraphicsSimpleTextItem(txt) + it.setPos(p) + it.setBrush(QtGui.QBrush(QtGui.QColor("#e0e0e0"))) + it.setFlag(QtWidgets.QGraphicsItem.ItemIgnoresTransformations, True) + it.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True) + it.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True) + it.setParentItem(self.layer) + self.active = False + self.win.statusBar().showMessage("Text placed") + return True + + +class MTextTool: + def __init__(self, window, layer): + self.win = window + self.layer = layer + self.active = False + self.text = "" + self.height_ft = 1.0 + + def start(self): + self.active = True + dlg = QtWidgets.QDialog(self.win); dlg.setWindowTitle("MText") + form = QtWidgets.QFormLayout(dlg) + txt = QtWidgets.QTextEdit(); txt.setPlainText("") + h = QtWidgets.QDoubleSpinBox(); h.setRange(0.1, 100.0); h.setDecimals(2); h.setValue(1.0) + form.addRow("Text:", txt); form.addRow("Height (ft):", h) + bb = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok|QtWidgets.QDialogButtonBox.Cancel); form.addRow(bb) + bb.accepted.connect(dlg.accept); bb.rejected.connect(dlg.reject) + if dlg.exec() != QtWidgets.QDialog.Accepted: + self.active = False; return + self.text = txt.toPlainText() + self.height_ft = float(h.value()) + self.win.statusBar().showMessage("MText: click to place") + + def cancel(self): + self.active = False + + def on_mouse_move(self, p: QtCore.QPointF): + pass + + def on_click(self, p: QtCore.QPointF): + if not self.active: + return False + if not self.text: + self.active = False; return False + item = QtWidgets.QGraphicsTextItem(self.text) + item.setDefaultTextColor(QtGui.QColor("#e0e0e0")) + item.setPos(p) + # scale to desired height in pixels + desired_px = float(self.height_ft) * float(self.win.px_per_ft) + br = item.boundingRect() + if br.height() > 0: + s = desired_px / br.height() + item.setScale(s) + item.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True) + item.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True) + item.setParentItem(self.layer) + self.active = False + self.win.statusBar().showMessage("MText placed") + return True diff --git a/app/tools/trim_tool.py b/app/tools/trim_tool.py new file mode 100644 index 0000000..ee62462 --- /dev/null +++ b/app/tools/trim_tool.py @@ -0,0 +1,86 @@ +from PySide6 import QtCore, QtGui, QtWidgets + + +def _nearest_line_item(scene: QtWidgets.QGraphicsScene, p: QtCore.QPointF): + box = QtCore.QRectF(p.x()-4, p.y()-4, 8, 8) + for it in scene.items(box): + if isinstance(it, QtWidgets.QGraphicsLineItem): + return it + return None + + +def _line_from_item(it: QtWidgets.QGraphicsLineItem) -> QtCore.QLineF: + return QtCore.QLineF(it.line()) + + +def _intersection_point(l1: QtCore.QLineF, l2: QtCore.QLineF): + # Compute intersection of infinite lines using vector math + x1, y1, x2, y2 = l1.x1(), l1.y1(), l1.x2(), l1.y2() + x3, y3, x4, y4 = l2.x1(), l2.y1(), l2.x2(), l2.y2() + den = (x1-x2)*(y3-y4) - (y1-y2)*(x3-x4) + if abs(den) < 1e-9: + return None + px = ((x1*y2 - y1*x2)*(x3 - x4) - (x1 - x2)*(x3*y4 - y3*x4)) / den + py = ((x1*y2 - y1*x2)*(y3 - y4) - (y1 - y2)*(x3*y4 - y3*x4)) / den + return QtCore.QPointF(px, py) + + +class TrimTool: + """Simple trim: pick cutting line, then target line; trims target to intersection near pick. + + Limitations: operates on QGraphicsLineItem only. + """ + + def __init__(self, window): + self.win = window + self.active = False + self.cut_item = None + + def start(self): + self.active = True + self.cut_item = None + self.win.statusBar().showMessage("Trim: click cutting line, then target line to trim") + + def cancel(self): + self.active = False + self.cut_item = None + + def on_mouse_move(self, p: QtCore.QPointF): + pass + + def on_click(self, p: QtCore.QPointF): + if not self.active: + return False + sc = self.win.scene + it = _nearest_line_item(sc, p) + if it is None: + self.win.statusBar().showMessage("Trim: no line here") + return False + if self.cut_item is None: + self.cut_item = it + self.win.statusBar().showMessage("Trim: now click target line to trim") + return False + # Trim target to intersection with cut + if it is self.cut_item: + self.win.statusBar().showMessage("Trim: pick a different target line") + return False + lcut = _line_from_item(self.cut_item) + ltar = _line_from_item(it) + ip = _intersection_point(lcut, ltar) + if ip is None: + self.win.statusBar().showMessage("Trim: lines do not intersect") + self.active = False + self.cut_item = None + return False + # pick closer endpoint to the click point + d1 = QtCore.QLineF(p, QtCore.QPointF(ltar.x1(), ltar.y1())).length() + d2 = QtCore.QLineF(p, QtCore.QPointF(ltar.x2(), ltar.y2())).length() + if d1 < d2: + it.setLine(ip.x(), ip.y(), ltar.x2(), ltar.y2()) + else: + it.setLine(ltar.x1(), ltar.y1(), ip.x(), ip.y()) + self.win.statusBar().showMessage("Trimmed") + self.active = False + self.cut_item = None + return True + diff --git a/app/ui/__pycache__/settings.cpython-311.pyc b/app/ui/__pycache__/settings.cpython-311.pyc deleted file mode 100644 index 834f6d0..0000000 Binary files a/app/ui/__pycache__/settings.cpython-311.pyc and /dev/null differ diff --git a/app/ui/__pycache__/theme.cpython-311.pyc b/app/ui/__pycache__/theme.cpython-311.pyc deleted file mode 100644 index 810df11..0000000 Binary files a/app/ui/__pycache__/theme.cpython-311.pyc and /dev/null differ diff --git a/backend/README.md b/backend/README.md new file mode 100644 index 0000000..9fa603b --- /dev/null +++ b/backend/README.md @@ -0,0 +1,8 @@ +# Backend + +Headless logic: loaders, schemas, configuration, and service layer. + +Targets +- Own `db/loader.py` and future persistence. +- Provide clean APIs used by `frontend`. + diff --git a/backend/__init__.py b/backend/__init__.py new file mode 100644 index 0000000..9a14a93 --- /dev/null +++ b/backend/__init__.py @@ -0,0 +1,5 @@ +"""Backend package (logic, I/O, services). + +Hosts loaders, configuration, and headless logic extracted from legacy `db/` and `core/`. +""" + diff --git a/build/AutoFire_20250909_200404/AutoFire/Analysis-00.toc b/build/AutoFire_20250909_200404/AutoFire/Analysis-00.toc deleted file mode 100644 index ce1a358..0000000 --- a/build/AutoFire_20250909_200404/AutoFire/Analysis-00.toc +++ /dev/null @@ -1,1565 +0,0 @@ -(['C:\\Dev\\AutoFireBase\\app\\boot.py'], - ['C:\\Dev\\AutoFireBase', 'C:\\Dev\\AutoFireBase'], - ['app.main', - 'app.minwin', - 'app.tools.array', - 'app.tools.draw', - 'app.tools.dimension'], - [('C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\numpy\\_pyinstaller', - 0), - ('C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\_pyinstaller_hooks_contrib\\stdhooks', - -1000), - ('C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\_pyinstaller_hooks_contrib', - -1000)], - {}, - [], - [], - False, - {}, - 0, - [], - [('app\\README.txt', 'C:\\Dev\\AutoFireBase\\app\\README.txt', 'DATA'), - ('app\\__init__.py', 'C:\\Dev\\AutoFireBase\\app\\__init__.py', 'DATA'), - ('app\\__pycache__\\__init__.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\__pycache__\\__init__.cpython-311.pyc', - 'DATA'), - ('app\\__pycache__\\assistant.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\__pycache__\\assistant.cpython-311.pyc', - 'DATA'), - ('app\\__pycache__\\catalog.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\__pycache__\\catalog.cpython-311.pyc', - 'DATA'), - ('app\\__pycache__\\coverage.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\__pycache__\\coverage.cpython-311.pyc', - 'DATA'), - ('app\\__pycache__\\device.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\__pycache__\\device.cpython-311.pyc', - 'DATA'), - ('app\\__pycache__\\main.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\__pycache__\\main.cpython-311.pyc', - 'DATA'), - ('app\\__pycache__\\scene.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\__pycache__\\scene.cpython-311.pyc', - 'DATA'), - ('app\\__pycache__\\wiring.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\__pycache__\\wiring.cpython-311.pyc', - 'DATA'), - ('app\\ai_scaffold.py', 'C:\\Dev\\AutoFireBase\\app\\ai_scaffold.py', 'DATA'), - ('app\\assistant.py', 'C:\\Dev\\AutoFireBase\\app\\assistant.py', 'DATA'), - ('app\\boot.py', 'C:\\Dev\\AutoFireBase\\app\\boot.py', 'DATA'), - ('app\\boot.py.bak_20250908_213900', - 'C:\\Dev\\AutoFireBase\\app\\boot.py.bak_20250908_213900', - 'DATA'), - ('app\\catalog.py', 'C:\\Dev\\AutoFireBase\\app\\catalog.py', 'DATA'), - ('app\\coverage.py', 'C:\\Dev\\AutoFireBase\\app\\coverage.py', 'DATA'), - ('app\\data\\iface.py', 'C:\\Dev\\AutoFireBase\\app\\data\\iface.py', 'DATA'), - ('app\\data\\sqlite_store.py', - 'C:\\Dev\\AutoFireBase\\app\\data\\sqlite_store.py', - 'DATA'), - ('app\\device.py', 'C:\\Dev\\AutoFireBase\\app\\device.py', 'DATA'), - ('app\\dialogs\\__init__.py', - 'C:\\Dev\\AutoFireBase\\app\\dialogs\\__init__.py', - 'DATA'), - ('app\\dialogs\\__pycache__\\__init__.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\dialogs\\__pycache__\\__init__.cpython-311.pyc', - 'DATA'), - ('app\\dialogs\\array.py', - 'C:\\Dev\\AutoFireBase\\app\\dialogs\\array.py', - 'DATA'), - ('app\\dialogs\\coverage.py', - 'C:\\Dev\\AutoFireBase\\app\\dialogs\\coverage.py', - 'DATA'), - ('app\\dialogs\\device_props.py', - 'C:\\Dev\\AutoFireBase\\app\\dialogs\\device_props.py', - 'DATA'), - ('app\\layout.py', 'C:\\Dev\\AutoFireBase\\app\\layout.py', 'DATA'), - ('app\\main.py', 'C:\\Dev\\AutoFireBase\\app\\main.py', 'DATA'), - ('app\\main.py.bak', 'C:\\Dev\\AutoFireBase\\app\\main.py.bak', 'DATA'), - ('app\\main.py.bak_20250908_211210', - 'C:\\Dev\\AutoFireBase\\app\\main.py.bak_20250908_211210', - 'DATA'), - ('app\\main_startup_safety.py', - 'C:\\Dev\\AutoFireBase\\app\\main_startup_safety.py', - 'DATA'), - ('app\\minwin.py', 'C:\\Dev\\AutoFireBase\\app\\minwin.py', 'DATA'), - ('app\\scene.py', 'C:\\Dev\\AutoFireBase\\app\\scene.py', 'DATA'), - ('app\\scene.py.bak', 'C:\\Dev\\AutoFireBase\\app\\scene.py.bak', 'DATA'), - ('app\\settings.py', 'C:\\Dev\\AutoFireBase\\app\\settings.py', 'DATA'), - ('app\\tools\\__init__.py', - 'C:\\Dev\\AutoFireBase\\app\\tools\\__init__.py', - 'DATA'), - ('app\\tools\\__pycache__\\__init__.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\tools\\__pycache__\\__init__.cpython-311.pyc', - 'DATA'), - ('app\\tools\\__pycache__\\align.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\tools\\__pycache__\\align.cpython-311.pyc', - 'DATA'), - ('app\\tools\\__pycache__\\array.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\tools\\__pycache__\\array.cpython-311.pyc', - 'DATA'), - ('app\\tools\\__pycache__\\draw.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\tools\\__pycache__\\draw.cpython-311.pyc', - 'DATA'), - ('app\\tools\\align.py', - 'C:\\Dev\\AutoFireBase\\app\\tools\\align.py', - 'DATA'), - ('app\\tools\\array.py', - 'C:\\Dev\\AutoFireBase\\app\\tools\\array.py', - 'DATA'), - ('app\\tools\\array.py.bak_20250908_211210', - 'C:\\Dev\\AutoFireBase\\app\\tools\\array.py.bak_20250908_211210', - 'DATA'), - ('app\\tools\\dimension.py', - 'C:\\Dev\\AutoFireBase\\app\\tools\\dimension.py', - 'DATA'), - ('app\\tools\\dimension.py.bak', - 'C:\\Dev\\AutoFireBase\\app\\tools\\dimension.py.bak', - 'DATA'), - ('app\\tools\\draw.py', 'C:\\Dev\\AutoFireBase\\app\\tools\\draw.py', 'DATA'), - ('app\\ui\\__pycache__\\settings.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\ui\\__pycache__\\settings.cpython-311.pyc', - 'DATA'), - ('app\\ui\\__pycache__\\theme.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\ui\\__pycache__\\theme.cpython-311.pyc', - 'DATA'), - ('app\\ui\\settings.py', - 'C:\\Dev\\AutoFireBase\\app\\ui\\settings.py', - 'DATA'), - ('app\\ui\\theme.py', 'C:\\Dev\\AutoFireBase\\app\\ui\\theme.py', 'DATA'), - ('app\\units.py', 'C:\\Dev\\AutoFireBase\\app\\units.py', 'DATA'), - ('app\\wiring.py', 'C:\\Dev\\AutoFireBase\\app\\wiring.py', 'DATA'), - ('core\\__init__.py', 'C:\\Dev\\AutoFireBase\\core\\__init__.py', 'DATA'), - ('core\\__pycache__\\__init__.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\core\\__pycache__\\__init__.cpython-311.pyc', - 'DATA'), - ('core\\error_hook.py', 'C:\\Dev\\AutoFireBase\\core\\error_hook.py', 'DATA'), - ('core\\logger.py', 'C:\\Dev\\AutoFireBase\\core\\logger.py', 'DATA'), - ('core\\logger_bridge.py', - 'C:\\Dev\\AutoFireBase\\core\\logger_bridge.py', - 'DATA'), - ('updater\\__init__.py', - 'C:\\Dev\\AutoFireBase\\updater\\__init__.py', - 'DATA'), - ('updater\\__pycache__\\__init__.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\updater\\__pycache__\\__init__.cpython-311.pyc', - 'DATA'), - ('updater\\auto_update.py', - 'C:\\Dev\\AutoFireBase\\updater\\auto_update.py', - 'DATA')], - '3.11.9 (tags/v3.11.9:de54cf5, Apr 2 2024, 10:12:12) [MSC v.1938 64 bit ' - '(AMD64)]', - [('pyi_rth_inspect', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py', - 'PYSOURCE'), - ('pyi_rth_pyside6', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pyside6.py', - 'PYSOURCE'), - ('boot', 'C:\\Dev\\AutoFireBase\\app\\boot.py', 'PYSOURCE')], - [('_pyi_rth_utils.qt', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PyInstaller\\fake-modules\\_pyi_rth_utils\\qt.py', - 'PYMODULE'), - ('_pyi_rth_utils', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PyInstaller\\fake-modules\\_pyi_rth_utils\\__init__.py', - 'PYMODULE'), - ('zipfile', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\zipfile.py', - 'PYMODULE'), - ('argparse', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\argparse.py', - 'PYMODULE'), - ('textwrap', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\textwrap.py', - 'PYMODULE'), - ('copy', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\copy.py', - 'PYMODULE'), - ('gettext', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\gettext.py', - 'PYMODULE'), - ('py_compile', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\py_compile.py', - 'PYMODULE'), - ('importlib.machinery', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\machinery.py', - 'PYMODULE'), - ('importlib._bootstrap', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\_bootstrap.py', - 'PYMODULE'), - ('importlib._bootstrap_external', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\_bootstrap_external.py', - 'PYMODULE'), - ('importlib.metadata', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\metadata\\__init__.py', - 'PYMODULE'), - ('typing', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\typing.py', - 'PYMODULE'), - ('importlib.abc', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\abc.py', - 'PYMODULE'), - ('importlib.resources.abc', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\resources\\abc.py', - 'PYMODULE'), - ('importlib.resources', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\resources\\__init__.py', - 'PYMODULE'), - ('importlib.resources._legacy', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\resources\\_legacy.py', - 'PYMODULE'), - ('importlib.resources._common', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\resources\\_common.py', - 'PYMODULE'), - ('importlib.resources._adapters', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\resources\\_adapters.py', - 'PYMODULE'), - ('tempfile', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\tempfile.py', - 'PYMODULE'), - ('random', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\random.py', - 'PYMODULE'), - ('statistics', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\statistics.py', - 'PYMODULE'), - ('decimal', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\decimal.py', - 'PYMODULE'), - ('_pydecimal', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\_pydecimal.py', - 'PYMODULE'), - ('contextvars', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\contextvars.py', - 'PYMODULE'), - ('fractions', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\fractions.py', - 'PYMODULE'), - ('numbers', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\numbers.py', - 'PYMODULE'), - ('hashlib', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\hashlib.py', - 'PYMODULE'), - ('logging', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\logging\\__init__.py', - 'PYMODULE'), - ('pickle', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\pickle.py', - 'PYMODULE'), - ('pprint', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\pprint.py', - 'PYMODULE'), - ('dataclasses', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\dataclasses.py', - 'PYMODULE'), - ('_compat_pickle', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\_compat_pickle.py', - 'PYMODULE'), - ('string', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\string.py', - 'PYMODULE'), - ('bisect', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\bisect.py', - 'PYMODULE'), - ('importlib._abc', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\_abc.py', - 'PYMODULE'), - ('importlib.metadata._itertools', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\metadata\\_itertools.py', - 'PYMODULE'), - ('importlib.metadata._functools', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\metadata\\_functools.py', - 'PYMODULE'), - ('importlib.metadata._collections', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\metadata\\_collections.py', - 'PYMODULE'), - ('importlib.metadata._meta', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\metadata\\_meta.py', - 'PYMODULE'), - ('importlib.metadata._adapters', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\metadata\\_adapters.py', - 'PYMODULE'), - ('importlib.metadata._text', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\metadata\\_text.py', - 'PYMODULE'), - ('email.message', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\message.py', - 'PYMODULE'), - ('email.policy', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\policy.py', - 'PYMODULE'), - ('email.contentmanager', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\contentmanager.py', - 'PYMODULE'), - ('email.quoprimime', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\quoprimime.py', - 'PYMODULE'), - ('email.headerregistry', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\headerregistry.py', - 'PYMODULE'), - ('email._header_value_parser', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\_header_value_parser.py', - 'PYMODULE'), - ('urllib', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\urllib\\__init__.py', - 'PYMODULE'), - ('email.iterators', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\iterators.py', - 'PYMODULE'), - ('email.generator', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\generator.py', - 'PYMODULE'), - ('email._encoded_words', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\_encoded_words.py', - 'PYMODULE'), - ('base64', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\base64.py', - 'PYMODULE'), - ('getopt', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\getopt.py', - 'PYMODULE'), - ('email.charset', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\charset.py', - 'PYMODULE'), - ('email.encoders', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\encoders.py', - 'PYMODULE'), - ('email.base64mime', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\base64mime.py', - 'PYMODULE'), - ('email._policybase', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\_policybase.py', - 'PYMODULE'), - ('email.header', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\header.py', - 'PYMODULE'), - ('email.errors', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\errors.py', - 'PYMODULE'), - ('email.utils', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\utils.py', - 'PYMODULE'), - ('email._parseaddr', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\_parseaddr.py', - 'PYMODULE'), - ('calendar', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\calendar.py', - 'PYMODULE'), - ('urllib.parse', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\urllib\\parse.py', - 'PYMODULE'), - ('ipaddress', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\ipaddress.py', - 'PYMODULE'), - ('socket', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\socket.py', - 'PYMODULE'), - ('selectors', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\selectors.py', - 'PYMODULE'), - ('quopri', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\quopri.py', - 'PYMODULE'), - ('email', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\__init__.py', - 'PYMODULE'), - ('email.parser', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\parser.py', - 'PYMODULE'), - ('email.feedparser', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\feedparser.py', - 'PYMODULE'), - ('csv', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\csv.py', - 'PYMODULE'), - ('importlib.readers', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\readers.py', - 'PYMODULE'), - ('importlib.resources.readers', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\resources\\readers.py', - 'PYMODULE'), - ('importlib.resources._itertools', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\resources\\_itertools.py', - 'PYMODULE'), - ('tokenize', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\tokenize.py', - 'PYMODULE'), - ('token', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\token.py', - 'PYMODULE'), - ('lzma', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\lzma.py', - 'PYMODULE'), - ('_compression', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\_compression.py', - 'PYMODULE'), - ('bz2', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\bz2.py', - 'PYMODULE'), - ('pathlib', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\pathlib.py', - 'PYMODULE'), - ('fnmatch', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\fnmatch.py', - 'PYMODULE'), - ('contextlib', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\contextlib.py', - 'PYMODULE'), - ('_strptime', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\_strptime.py', - 'PYMODULE'), - ('threading', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\threading.py', - 'PYMODULE'), - ('_threading_local', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\_threading_local.py', - 'PYMODULE'), - ('struct', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\struct.py', - 'PYMODULE'), - ('shutil', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\shutil.py', - 'PYMODULE'), - ('tarfile', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\tarfile.py', - 'PYMODULE'), - ('gzip', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\gzip.py', - 'PYMODULE'), - ('inspect', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\inspect.py', - 'PYMODULE'), - ('dis', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\dis.py', - 'PYMODULE'), - ('opcode', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\opcode.py', - 'PYMODULE'), - ('ast', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\ast.py', - 'PYMODULE'), - ('app.tools.dimension', - 'C:\\Dev\\AutoFireBase\\app\\tools\\dimension.py', - 'PYMODULE'), - ('app.tools', 'C:\\Dev\\AutoFireBase\\app\\tools\\__init__.py', 'PYMODULE'), - ('app.units', 'C:\\Dev\\AutoFireBase\\app\\units.py', 'PYMODULE'), - ('app', 'C:\\Dev\\AutoFireBase\\app\\__init__.py', 'PYMODULE'), - ('shiboken6', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\shiboken6\\__init__.py', - 'PYMODULE'), - ('__future__', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\__future__.py', - 'PYMODULE'), - ('app.tools.draw', 'C:\\Dev\\AutoFireBase\\app\\tools\\draw.py', 'PYMODULE'), - ('app.tools.array', - 'C:\\Dev\\AutoFireBase\\app\\tools\\array.py', - 'PYMODULE'), - ('app.minwin', 'C:\\Dev\\AutoFireBase\\app\\minwin.py', 'PYMODULE'), - ('app.scene', 'C:\\Dev\\AutoFireBase\\app\\scene.py', 'PYMODULE'), - ('tracemalloc', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\tracemalloc.py', - 'PYMODULE'), - ('_py_abc', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\_py_abc.py', - 'PYMODULE'), - ('stringprep', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\stringprep.py', - 'PYMODULE'), - ('importlib.util', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\util.py', - 'PYMODULE'), - ('PySide6', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\__init__.py', - 'PYMODULE'), - ('PySide6.support.deprecated', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\support\\deprecated.py', - 'PYMODULE'), - ('PySide6.support', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\support\\__init__.py', - 'PYMODULE'), - ('importlib', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\__init__.py', - 'PYMODULE'), - ('datetime', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\datetime.py', - 'PYMODULE'), - ('subprocess', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\subprocess.py', - 'PYMODULE'), - ('signal', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\signal.py', - 'PYMODULE')], - [('python311.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\python311.dll', - 'BINARY'), - ('PySide6\\plugins\\platforms\\qdirect2d.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\platforms\\qdirect2d.dll', - 'BINARY'), - ('PySide6\\plugins\\platforms\\qoffscreen.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\platforms\\qoffscreen.dll', - 'BINARY'), - ('PySide6\\plugins\\imageformats\\qwbmp.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\imageformats\\qwbmp.dll', - 'BINARY'), - ('PySide6\\plugins\\platforminputcontexts\\qtvirtualkeyboardplugin.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\platforminputcontexts\\qtvirtualkeyboardplugin.dll', - 'BINARY'), - ('PySide6\\plugins\\imageformats\\qicns.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\imageformats\\qicns.dll', - 'BINARY'), - ('PySide6\\plugins\\platforms\\qminimal.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\platforms\\qminimal.dll', - 'BINARY'), - ('PySide6\\plugins\\imageformats\\qsvg.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\imageformats\\qsvg.dll', - 'BINARY'), - ('PySide6\\plugins\\imageformats\\qtiff.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\imageformats\\qtiff.dll', - 'BINARY'), - ('PySide6\\plugins\\platforms\\qwindows.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\platforms\\qwindows.dll', - 'BINARY'), - ('PySide6\\plugins\\generic\\qtuiotouchplugin.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\generic\\qtuiotouchplugin.dll', - 'BINARY'), - ('PySide6\\plugins\\imageformats\\qico.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\imageformats\\qico.dll', - 'BINARY'), - ('PySide6\\plugins\\imageformats\\qwebp.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\imageformats\\qwebp.dll', - 'BINARY'), - ('PySide6\\plugins\\imageformats\\qpdf.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\imageformats\\qpdf.dll', - 'BINARY'), - ('PySide6\\plugins\\imageformats\\qjpeg.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\imageformats\\qjpeg.dll', - 'BINARY'), - ('PySide6\\plugins\\imageformats\\qgif.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\imageformats\\qgif.dll', - 'BINARY'), - ('PySide6\\plugins\\imageformats\\qtga.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\imageformats\\qtga.dll', - 'BINARY'), - ('PySide6\\plugins\\iconengines\\qsvgicon.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\iconengines\\qsvgicon.dll', - 'BINARY'), - ('PySide6\\plugins\\styles\\qmodernwindowsstyle.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\styles\\qmodernwindowsstyle.dll', - 'BINARY'), - ('PySide6\\opengl32sw.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\opengl32sw.dll', - 'BINARY'), - ('PySide6\\plugins\\networkinformation\\qnetworklistmanager.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\networkinformation\\qnetworklistmanager.dll', - 'BINARY'), - ('PySide6\\plugins\\tls\\qcertonlybackend.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\tls\\qcertonlybackend.dll', - 'BINARY'), - ('PySide6\\plugins\\tls\\qschannelbackend.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\tls\\qschannelbackend.dll', - 'BINARY'), - ('PySide6\\plugins\\tls\\qopensslbackend.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\tls\\qopensslbackend.dll', - 'BINARY'), - ('_decimal.pyd', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\DLLs\\_decimal.pyd', - 'EXTENSION'), - ('_hashlib.pyd', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\DLLs\\_hashlib.pyd', - 'EXTENSION'), - ('unicodedata.pyd', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\DLLs\\unicodedata.pyd', - 'EXTENSION'), - ('select.pyd', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\DLLs\\select.pyd', - 'EXTENSION'), - ('_socket.pyd', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\DLLs\\_socket.pyd', - 'EXTENSION'), - ('_lzma.pyd', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\DLLs\\_lzma.pyd', - 'EXTENSION'), - ('_bz2.pyd', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\DLLs\\_bz2.pyd', - 'EXTENSION'), - ('PySide6\\QtGui.pyd', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\QtGui.pyd', - 'EXTENSION'), - ('shiboken6\\Shiboken.pyd', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\shiboken6\\Shiboken.pyd', - 'EXTENSION'), - ('PySide6\\QtCore.pyd', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\QtCore.pyd', - 'EXTENSION'), - ('PySide6\\QtWidgets.pyd', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\QtWidgets.pyd', - 'EXTENSION'), - ('PySide6\\QtNetwork.pyd', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\QtNetwork.pyd', - 'EXTENSION'), - ('VCRUNTIME140.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\VCRUNTIME140.dll', - 'BINARY'), - ('shiboken6\\MSVCP140.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\shiboken6\\MSVCP140.dll', - 'BINARY'), - ('PySide6\\Qt6Gui.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6Gui.dll', - 'BINARY'), - ('VCRUNTIME140_1.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\VCRUNTIME140_1.dll', - 'BINARY'), - ('PySide6\\Qt6Core.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6Core.dll', - 'BINARY'), - ('PySide6\\Qt6VirtualKeyboard.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6VirtualKeyboard.dll', - 'BINARY'), - ('PySide6\\Qt6Svg.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6Svg.dll', - 'BINARY'), - ('PySide6\\Qt6Network.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6Network.dll', - 'BINARY'), - ('PySide6\\Qt6Pdf.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6Pdf.dll', - 'BINARY'), - ('PySide6\\Qt6Widgets.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6Widgets.dll', - 'BINARY'), - ('libcrypto-3.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\DLLs\\libcrypto-3.dll', - 'BINARY'), - ('PySide6\\VCRUNTIME140_1.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\VCRUNTIME140_1.dll', - 'BINARY'), - ('shiboken6\\shiboken6.abi3.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\shiboken6\\shiboken6.abi3.dll', - 'BINARY'), - ('python3.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\python3.dll', - 'BINARY'), - ('PySide6\\MSVCP140_2.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\MSVCP140_2.dll', - 'BINARY'), - ('PySide6\\pyside6.abi3.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\pyside6.abi3.dll', - 'BINARY'), - ('PySide6\\VCRUNTIME140.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\VCRUNTIME140.dll', - 'BINARY'), - ('PySide6\\MSVCP140.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\MSVCP140.dll', - 'BINARY'), - ('shiboken6\\VCRUNTIME140_1.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\shiboken6\\VCRUNTIME140_1.dll', - 'BINARY'), - ('shiboken6\\VCRUNTIME140.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\shiboken6\\VCRUNTIME140.dll', - 'BINARY'), - ('PySide6\\MSVCP140_1.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\MSVCP140_1.dll', - 'BINARY'), - ('PySide6\\Qt6Qml.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6Qml.dll', - 'BINARY'), - ('PySide6\\Qt6Quick.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6Quick.dll', - 'BINARY'), - ('PySide6\\Qt6QmlMeta.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6QmlMeta.dll', - 'BINARY'), - ('PySide6\\Qt6OpenGL.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6OpenGL.dll', - 'BINARY'), - ('PySide6\\Qt6QmlModels.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6QmlModels.dll', - 'BINARY'), - ('PySide6\\Qt6QmlWorkerScript.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6QmlWorkerScript.dll', - 'BINARY')], - [], - [], - [('app\\README.txt', 'C:\\Dev\\AutoFireBase\\app\\README.txt', 'DATA'), - ('app\\__init__.py', 'C:\\Dev\\AutoFireBase\\app\\__init__.py', 'DATA'), - ('app\\__pycache__\\__init__.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\__pycache__\\__init__.cpython-311.pyc', - 'DATA'), - ('app\\__pycache__\\assistant.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\__pycache__\\assistant.cpython-311.pyc', - 'DATA'), - ('app\\__pycache__\\catalog.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\__pycache__\\catalog.cpython-311.pyc', - 'DATA'), - ('app\\__pycache__\\coverage.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\__pycache__\\coverage.cpython-311.pyc', - 'DATA'), - ('app\\__pycache__\\device.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\__pycache__\\device.cpython-311.pyc', - 'DATA'), - ('app\\__pycache__\\main.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\__pycache__\\main.cpython-311.pyc', - 'DATA'), - ('app\\__pycache__\\scene.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\__pycache__\\scene.cpython-311.pyc', - 'DATA'), - ('app\\__pycache__\\wiring.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\__pycache__\\wiring.cpython-311.pyc', - 'DATA'), - ('app\\ai_scaffold.py', 'C:\\Dev\\AutoFireBase\\app\\ai_scaffold.py', 'DATA'), - ('app\\assistant.py', 'C:\\Dev\\AutoFireBase\\app\\assistant.py', 'DATA'), - ('app\\boot.py', 'C:\\Dev\\AutoFireBase\\app\\boot.py', 'DATA'), - ('app\\boot.py.bak_20250908_213900', - 'C:\\Dev\\AutoFireBase\\app\\boot.py.bak_20250908_213900', - 'DATA'), - ('app\\catalog.py', 'C:\\Dev\\AutoFireBase\\app\\catalog.py', 'DATA'), - ('app\\coverage.py', 'C:\\Dev\\AutoFireBase\\app\\coverage.py', 'DATA'), - ('app\\data\\iface.py', 'C:\\Dev\\AutoFireBase\\app\\data\\iface.py', 'DATA'), - ('app\\data\\sqlite_store.py', - 'C:\\Dev\\AutoFireBase\\app\\data\\sqlite_store.py', - 'DATA'), - ('app\\device.py', 'C:\\Dev\\AutoFireBase\\app\\device.py', 'DATA'), - ('app\\dialogs\\__init__.py', - 'C:\\Dev\\AutoFireBase\\app\\dialogs\\__init__.py', - 'DATA'), - ('app\\dialogs\\__pycache__\\__init__.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\dialogs\\__pycache__\\__init__.cpython-311.pyc', - 'DATA'), - ('app\\dialogs\\array.py', - 'C:\\Dev\\AutoFireBase\\app\\dialogs\\array.py', - 'DATA'), - ('app\\dialogs\\coverage.py', - 'C:\\Dev\\AutoFireBase\\app\\dialogs\\coverage.py', - 'DATA'), - ('app\\dialogs\\device_props.py', - 'C:\\Dev\\AutoFireBase\\app\\dialogs\\device_props.py', - 'DATA'), - ('app\\layout.py', 'C:\\Dev\\AutoFireBase\\app\\layout.py', 'DATA'), - ('app\\main.py', 'C:\\Dev\\AutoFireBase\\app\\main.py', 'DATA'), - ('app\\main.py.bak', 'C:\\Dev\\AutoFireBase\\app\\main.py.bak', 'DATA'), - ('app\\main.py.bak_20250908_211210', - 'C:\\Dev\\AutoFireBase\\app\\main.py.bak_20250908_211210', - 'DATA'), - ('app\\main_startup_safety.py', - 'C:\\Dev\\AutoFireBase\\app\\main_startup_safety.py', - 'DATA'), - ('app\\minwin.py', 'C:\\Dev\\AutoFireBase\\app\\minwin.py', 'DATA'), - ('app\\scene.py', 'C:\\Dev\\AutoFireBase\\app\\scene.py', 'DATA'), - ('app\\scene.py.bak', 'C:\\Dev\\AutoFireBase\\app\\scene.py.bak', 'DATA'), - ('app\\settings.py', 'C:\\Dev\\AutoFireBase\\app\\settings.py', 'DATA'), - ('app\\tools\\__init__.py', - 'C:\\Dev\\AutoFireBase\\app\\tools\\__init__.py', - 'DATA'), - ('app\\tools\\__pycache__\\__init__.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\tools\\__pycache__\\__init__.cpython-311.pyc', - 'DATA'), - ('app\\tools\\__pycache__\\align.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\tools\\__pycache__\\align.cpython-311.pyc', - 'DATA'), - ('app\\tools\\__pycache__\\array.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\tools\\__pycache__\\array.cpython-311.pyc', - 'DATA'), - ('app\\tools\\__pycache__\\draw.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\tools\\__pycache__\\draw.cpython-311.pyc', - 'DATA'), - ('app\\tools\\align.py', - 'C:\\Dev\\AutoFireBase\\app\\tools\\align.py', - 'DATA'), - ('app\\tools\\array.py', - 'C:\\Dev\\AutoFireBase\\app\\tools\\array.py', - 'DATA'), - ('app\\tools\\array.py.bak_20250908_211210', - 'C:\\Dev\\AutoFireBase\\app\\tools\\array.py.bak_20250908_211210', - 'DATA'), - ('app\\tools\\dimension.py', - 'C:\\Dev\\AutoFireBase\\app\\tools\\dimension.py', - 'DATA'), - ('app\\tools\\dimension.py.bak', - 'C:\\Dev\\AutoFireBase\\app\\tools\\dimension.py.bak', - 'DATA'), - ('app\\tools\\draw.py', 'C:\\Dev\\AutoFireBase\\app\\tools\\draw.py', 'DATA'), - ('app\\ui\\__pycache__\\settings.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\ui\\__pycache__\\settings.cpython-311.pyc', - 'DATA'), - ('app\\ui\\__pycache__\\theme.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\ui\\__pycache__\\theme.cpython-311.pyc', - 'DATA'), - ('app\\ui\\settings.py', - 'C:\\Dev\\AutoFireBase\\app\\ui\\settings.py', - 'DATA'), - ('app\\ui\\theme.py', 'C:\\Dev\\AutoFireBase\\app\\ui\\theme.py', 'DATA'), - ('app\\units.py', 'C:\\Dev\\AutoFireBase\\app\\units.py', 'DATA'), - ('app\\wiring.py', 'C:\\Dev\\AutoFireBase\\app\\wiring.py', 'DATA'), - ('core\\__init__.py', 'C:\\Dev\\AutoFireBase\\core\\__init__.py', 'DATA'), - ('core\\__pycache__\\__init__.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\core\\__pycache__\\__init__.cpython-311.pyc', - 'DATA'), - ('core\\error_hook.py', 'C:\\Dev\\AutoFireBase\\core\\error_hook.py', 'DATA'), - ('core\\logger.py', 'C:\\Dev\\AutoFireBase\\core\\logger.py', 'DATA'), - ('core\\logger_bridge.py', - 'C:\\Dev\\AutoFireBase\\core\\logger_bridge.py', - 'DATA'), - ('updater\\__init__.py', - 'C:\\Dev\\AutoFireBase\\updater\\__init__.py', - 'DATA'), - ('updater\\__pycache__\\__init__.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\updater\\__pycache__\\__init__.cpython-311.pyc', - 'DATA'), - ('updater\\auto_update.py', - 'C:\\Dev\\AutoFireBase\\updater\\auto_update.py', - 'DATA'), - ('PySide6\\translations\\qt_help_gl.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_gl.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_pl.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_pl.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_hr.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_hr.qm', - 'DATA'), - ('PySide6\\translations\\qt_en.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_en.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_de.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_de.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_pt_BR.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_pt_BR.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_fr.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_fr.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_sv.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_sv.qm', - 'DATA'), - ('PySide6\\translations\\qt_sl.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_sl.qm', - 'DATA'), - ('PySide6\\translations\\qt_pl.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_pl.qm', - 'DATA'), - ('PySide6\\translations\\qt_gd.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_gd.qm', - 'DATA'), - ('PySide6\\translations\\qt_it.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_it.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_ru.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_ru.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_ar.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_ar.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_ca.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_ca.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_en.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_en.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_es.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_es.qm', - 'DATA'), - ('PySide6\\translations\\qt_ja.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_ja.qm', - 'DATA'), - ('PySide6\\translations\\qt_tr.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_tr.qm', - 'DATA'), - ('PySide6\\translations\\qt_fr.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_fr.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_fi.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_fi.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_ka.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_ka.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_hr.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_hr.qm', - 'DATA'), - ('PySide6\\translations\\qt_sv.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_sv.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_nn.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_nn.qm', - 'DATA'), - ('PySide6\\translations\\qt_lg.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_lg.qm', - 'DATA'), - ('PySide6\\translations\\qt_cs.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_cs.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_fa.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_fa.qm', - 'DATA'), - ('PySide6\\translations\\qt_gl.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_gl.qm', - 'DATA'), - ('PySide6\\translations\\qt_ko.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_ko.qm', - 'DATA'), - ('PySide6\\translations\\qt_nl.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_nl.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_sl.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_sl.qm', - 'DATA'), - ('PySide6\\translations\\qt_lv.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_lv.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_es.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_es.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_ko.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_ko.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_uk.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_uk.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_bg.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_bg.qm', - 'DATA'), - ('PySide6\\translations\\qt_ca.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_ca.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_uk.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_uk.qm', - 'DATA'), - ('PySide6\\translations\\qt_ka.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_ka.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_lg.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_lg.qm', - 'DATA'), - ('PySide6\\translations\\qt_pt_BR.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_pt_BR.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_cs.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_cs.qm', - 'DATA'), - ('PySide6\\translations\\qt_bg.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_bg.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_zh_CN.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_zh_CN.qm', - 'DATA'), - ('PySide6\\translations\\qt_hr.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_hr.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_zh_CN.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_zh_CN.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_da.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_da.qm', - 'DATA'), - ('PySide6\\translations\\qt_pt_PT.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_pt_PT.qm', - 'DATA'), - ('PySide6\\translations\\qt_sk.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_sk.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_nl.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_nl.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_sv.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_sv.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_en.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_en.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_ja.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_ja.qm', - 'DATA'), - ('PySide6\\translations\\qt_nn.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_nn.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_he.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_he.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_cs.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_cs.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_hu.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_hu.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_tr.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_tr.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_hu.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_hu.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_nn.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_nn.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_ja.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_ja.qm', - 'DATA'), - ('PySide6\\translations\\qt_zh_CN.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_zh_CN.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_ru.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_ru.qm', - 'DATA'), - ('PySide6\\translations\\qt_de.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_de.qm', - 'DATA'), - ('PySide6\\translations\\qt_ar.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_ar.qm', - 'DATA'), - ('PySide6\\translations\\qt_uk.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_uk.qm', - 'DATA'), - ('PySide6\\translations\\qt_es.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_es.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_tr.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_tr.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_de.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_de.qm', - 'DATA'), - ('PySide6\\translations\\qt_fi.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_fi.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_pt_BR.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_pt_BR.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_zh_TW.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_zh_TW.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_it.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_it.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_ar.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_ar.qm', - 'DATA'), - ('PySide6\\translations\\qt_he.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_he.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_ka.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_ka.qm', - 'DATA'), - ('PySide6\\translations\\qt_da.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_da.qm', - 'DATA'), - ('PySide6\\translations\\qt_lt.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_lt.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_it.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_it.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_sk.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_sk.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_nl.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_nl.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_zh_TW.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_zh_TW.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_bg.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_bg.qm', - 'DATA'), - ('PySide6\\translations\\qt_zh_TW.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_zh_TW.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_fr.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_fr.qm', - 'DATA'), - ('PySide6\\translations\\qt_fa.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_fa.qm', - 'DATA'), - ('PySide6\\translations\\qt_ru.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_ru.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_ca.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_ca.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_lv.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_lv.qm', - 'DATA'), - ('PySide6\\translations\\qt_hu.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_hu.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_da.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_da.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_pl.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_pl.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_gd.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_gd.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_sk.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_sk.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_ko.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_ko.qm', - 'DATA'), - ('base_library.zip', - 'C:\\Dev\\AutoFireBase\\build\\AutoFire_20250909_200404\\AutoFire\\base_library.zip', - 'DATA')], - [('keyword', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\keyword.py', - 'PYMODULE'), - ('io', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\io.py', - 'PYMODULE'), - ('ntpath', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\ntpath.py', - 'PYMODULE'), - ('linecache', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\linecache.py', - 'PYMODULE'), - ('sre_compile', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\sre_compile.py', - 'PYMODULE'), - ('sre_constants', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\sre_constants.py', - 'PYMODULE'), - ('posixpath', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\posixpath.py', - 'PYMODULE'), - ('weakref', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\weakref.py', - 'PYMODULE'), - ('copyreg', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\copyreg.py', - 'PYMODULE'), - ('re._parser', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\re\\_parser.py', - 'PYMODULE'), - ('re._constants', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\re\\_constants.py', - 'PYMODULE'), - ('re._compiler', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\re\\_compiler.py', - 'PYMODULE'), - ('re._casefix', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\re\\_casefix.py', - 'PYMODULE'), - ('re', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\re\\__init__.py', - 'PYMODULE'), - ('warnings', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\warnings.py', - 'PYMODULE'), - ('locale', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\locale.py', - 'PYMODULE'), - ('stat', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\stat.py', - 'PYMODULE'), - ('heapq', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\heapq.py', - 'PYMODULE'), - ('_collections_abc', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\_collections_abc.py', - 'PYMODULE'), - ('functools', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\functools.py', - 'PYMODULE'), - ('_weakrefset', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\_weakrefset.py', - 'PYMODULE'), - ('sre_parse', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\sre_parse.py', - 'PYMODULE'), - ('collections.abc', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\collections\\abc.py', - 'PYMODULE'), - ('collections', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\collections\\__init__.py', - 'PYMODULE'), - ('abc', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\abc.py', - 'PYMODULE'), - ('codecs', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\codecs.py', - 'PYMODULE'), - ('encodings.zlib_codec', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\zlib_codec.py', - 'PYMODULE'), - ('encodings.uu_codec', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\uu_codec.py', - 'PYMODULE'), - ('encodings.utf_8_sig', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\utf_8_sig.py', - 'PYMODULE'), - ('encodings.utf_8', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\utf_8.py', - 'PYMODULE'), - ('encodings.utf_7', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\utf_7.py', - 'PYMODULE'), - ('encodings.utf_32_le', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\utf_32_le.py', - 'PYMODULE'), - ('encodings.utf_32_be', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\utf_32_be.py', - 'PYMODULE'), - ('encodings.utf_32', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\utf_32.py', - 'PYMODULE'), - ('encodings.utf_16_le', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\utf_16_le.py', - 'PYMODULE'), - ('encodings.utf_16_be', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\utf_16_be.py', - 'PYMODULE'), - ('encodings.utf_16', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\utf_16.py', - 'PYMODULE'), - ('encodings.unicode_escape', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\unicode_escape.py', - 'PYMODULE'), - ('encodings.undefined', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\undefined.py', - 'PYMODULE'), - ('encodings.tis_620', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\tis_620.py', - 'PYMODULE'), - ('encodings.shift_jisx0213', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\shift_jisx0213.py', - 'PYMODULE'), - ('encodings.shift_jis_2004', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\shift_jis_2004.py', - 'PYMODULE'), - ('encodings.shift_jis', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\shift_jis.py', - 'PYMODULE'), - ('encodings.rot_13', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\rot_13.py', - 'PYMODULE'), - ('encodings.raw_unicode_escape', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\raw_unicode_escape.py', - 'PYMODULE'), - ('encodings.quopri_codec', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\quopri_codec.py', - 'PYMODULE'), - ('encodings.punycode', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\punycode.py', - 'PYMODULE'), - ('encodings.ptcp154', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\ptcp154.py', - 'PYMODULE'), - ('encodings.palmos', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\palmos.py', - 'PYMODULE'), - ('encodings.oem', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\oem.py', - 'PYMODULE'), - ('encodings.mbcs', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\mbcs.py', - 'PYMODULE'), - ('encodings.mac_turkish', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\mac_turkish.py', - 'PYMODULE'), - ('encodings.mac_romanian', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\mac_romanian.py', - 'PYMODULE'), - ('encodings.mac_roman', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\mac_roman.py', - 'PYMODULE'), - ('encodings.mac_latin2', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\mac_latin2.py', - 'PYMODULE'), - ('encodings.mac_iceland', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\mac_iceland.py', - 'PYMODULE'), - ('encodings.mac_greek', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\mac_greek.py', - 'PYMODULE'), - ('encodings.mac_farsi', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\mac_farsi.py', - 'PYMODULE'), - ('encodings.mac_cyrillic', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\mac_cyrillic.py', - 'PYMODULE'), - ('encodings.mac_croatian', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\mac_croatian.py', - 'PYMODULE'), - ('encodings.mac_arabic', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\mac_arabic.py', - 'PYMODULE'), - ('encodings.latin_1', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\latin_1.py', - 'PYMODULE'), - ('encodings.kz1048', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\kz1048.py', - 'PYMODULE'), - ('encodings.koi8_u', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\koi8_u.py', - 'PYMODULE'), - ('encodings.koi8_t', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\koi8_t.py', - 'PYMODULE'), - ('encodings.koi8_r', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\koi8_r.py', - 'PYMODULE'), - ('encodings.johab', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\johab.py', - 'PYMODULE'), - ('encodings.iso8859_9', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\iso8859_9.py', - 'PYMODULE'), - ('encodings.iso8859_8', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\iso8859_8.py', - 'PYMODULE'), - ('encodings.iso8859_7', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\iso8859_7.py', - 'PYMODULE'), - ('encodings.iso8859_6', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\iso8859_6.py', - 'PYMODULE'), - ('encodings.iso8859_5', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\iso8859_5.py', - 'PYMODULE'), - ('encodings.iso8859_4', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\iso8859_4.py', - 'PYMODULE'), - ('encodings.iso8859_3', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\iso8859_3.py', - 'PYMODULE'), - ('encodings.iso8859_2', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\iso8859_2.py', - 'PYMODULE'), - ('encodings.iso8859_16', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\iso8859_16.py', - 'PYMODULE'), - ('encodings.iso8859_15', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\iso8859_15.py', - 'PYMODULE'), - ('encodings.iso8859_14', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\iso8859_14.py', - 'PYMODULE'), - ('encodings.iso8859_13', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\iso8859_13.py', - 'PYMODULE'), - ('encodings.iso8859_11', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\iso8859_11.py', - 'PYMODULE'), - ('encodings.iso8859_10', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\iso8859_10.py', - 'PYMODULE'), - ('encodings.iso8859_1', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\iso8859_1.py', - 'PYMODULE'), - ('encodings.iso2022_kr', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\iso2022_kr.py', - 'PYMODULE'), - ('encodings.iso2022_jp_ext', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\iso2022_jp_ext.py', - 'PYMODULE'), - ('encodings.iso2022_jp_3', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\iso2022_jp_3.py', - 'PYMODULE'), - ('encodings.iso2022_jp_2004', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\iso2022_jp_2004.py', - 'PYMODULE'), - ('encodings.iso2022_jp_2', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\iso2022_jp_2.py', - 'PYMODULE'), - ('encodings.iso2022_jp_1', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\iso2022_jp_1.py', - 'PYMODULE'), - ('encodings.iso2022_jp', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\iso2022_jp.py', - 'PYMODULE'), - ('encodings.idna', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\idna.py', - 'PYMODULE'), - ('encodings.hz', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\hz.py', - 'PYMODULE'), - ('encodings.hp_roman8', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\hp_roman8.py', - 'PYMODULE'), - ('encodings.hex_codec', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\hex_codec.py', - 'PYMODULE'), - ('encodings.gbk', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\gbk.py', - 'PYMODULE'), - ('encodings.gb2312', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\gb2312.py', - 'PYMODULE'), - ('encodings.gb18030', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\gb18030.py', - 'PYMODULE'), - ('encodings.euc_kr', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\euc_kr.py', - 'PYMODULE'), - ('encodings.euc_jp', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\euc_jp.py', - 'PYMODULE'), - ('encodings.euc_jisx0213', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\euc_jisx0213.py', - 'PYMODULE'), - ('encodings.euc_jis_2004', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\euc_jis_2004.py', - 'PYMODULE'), - ('encodings.cp950', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp950.py', - 'PYMODULE'), - ('encodings.cp949', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp949.py', - 'PYMODULE'), - ('encodings.cp932', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp932.py', - 'PYMODULE'), - ('encodings.cp875', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp875.py', - 'PYMODULE'), - ('encodings.cp874', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp874.py', - 'PYMODULE'), - ('encodings.cp869', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp869.py', - 'PYMODULE'), - ('encodings.cp866', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp866.py', - 'PYMODULE'), - ('encodings.cp865', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp865.py', - 'PYMODULE'), - ('encodings.cp864', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp864.py', - 'PYMODULE'), - ('encodings.cp863', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp863.py', - 'PYMODULE'), - ('encodings.cp862', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp862.py', - 'PYMODULE'), - ('encodings.cp861', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp861.py', - 'PYMODULE'), - ('encodings.cp860', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp860.py', - 'PYMODULE'), - ('encodings.cp858', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp858.py', - 'PYMODULE'), - ('encodings.cp857', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp857.py', - 'PYMODULE'), - ('encodings.cp856', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp856.py', - 'PYMODULE'), - ('encodings.cp855', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp855.py', - 'PYMODULE'), - ('encodings.cp852', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp852.py', - 'PYMODULE'), - ('encodings.cp850', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp850.py', - 'PYMODULE'), - ('encodings.cp775', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp775.py', - 'PYMODULE'), - ('encodings.cp737', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp737.py', - 'PYMODULE'), - ('encodings.cp720', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp720.py', - 'PYMODULE'), - ('encodings.cp500', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp500.py', - 'PYMODULE'), - ('encodings.cp437', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp437.py', - 'PYMODULE'), - ('encodings.cp424', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp424.py', - 'PYMODULE'), - ('encodings.cp273', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp273.py', - 'PYMODULE'), - ('encodings.cp1258', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp1258.py', - 'PYMODULE'), - ('encodings.cp1257', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp1257.py', - 'PYMODULE'), - ('encodings.cp1256', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp1256.py', - 'PYMODULE'), - ('encodings.cp1255', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp1255.py', - 'PYMODULE'), - ('encodings.cp1254', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp1254.py', - 'PYMODULE'), - ('encodings.cp1253', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp1253.py', - 'PYMODULE'), - ('encodings.cp1252', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp1252.py', - 'PYMODULE'), - ('encodings.cp1251', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp1251.py', - 'PYMODULE'), - ('encodings.cp1250', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp1250.py', - 'PYMODULE'), - ('encodings.cp1140', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp1140.py', - 'PYMODULE'), - ('encodings.cp1125', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp1125.py', - 'PYMODULE'), - ('encodings.cp1026', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp1026.py', - 'PYMODULE'), - ('encodings.cp1006', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp1006.py', - 'PYMODULE'), - ('encodings.cp037', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\cp037.py', - 'PYMODULE'), - ('encodings.charmap', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\charmap.py', - 'PYMODULE'), - ('encodings.bz2_codec', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\bz2_codec.py', - 'PYMODULE'), - ('encodings.big5hkscs', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\big5hkscs.py', - 'PYMODULE'), - ('encodings.big5', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\big5.py', - 'PYMODULE'), - ('encodings.base64_codec', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\base64_codec.py', - 'PYMODULE'), - ('encodings.ascii', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\ascii.py', - 'PYMODULE'), - ('encodings.aliases', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\aliases.py', - 'PYMODULE'), - ('encodings', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\encodings\\__init__.py', - 'PYMODULE'), - ('genericpath', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\genericpath.py', - 'PYMODULE'), - ('reprlib', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\reprlib.py', - 'PYMODULE'), - ('enum', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\enum.py', - 'PYMODULE'), - ('operator', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\operator.py', - 'PYMODULE'), - ('types', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\types.py', - 'PYMODULE'), - ('traceback', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\traceback.py', - 'PYMODULE'), - ('os', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\os.py', - 'PYMODULE')]) diff --git a/build/AutoFire_20250909_200404/AutoFire/AutoFire.exe b/build/AutoFire_20250909_200404/AutoFire/AutoFire.exe deleted file mode 100644 index 3ef2f24..0000000 Binary files a/build/AutoFire_20250909_200404/AutoFire/AutoFire.exe and /dev/null differ diff --git a/build/AutoFire_20250909_200404/AutoFire/AutoFire.pkg b/build/AutoFire_20250909_200404/AutoFire/AutoFire.pkg deleted file mode 100644 index 0ce74be..0000000 Binary files a/build/AutoFire_20250909_200404/AutoFire/AutoFire.pkg and /dev/null differ diff --git a/build/AutoFire_20250909_200404/AutoFire/COLLECT-00.toc b/build/AutoFire_20250909_200404/AutoFire/COLLECT-00.toc deleted file mode 100644 index 3928331..0000000 --- a/build/AutoFire_20250909_200404/AutoFire/COLLECT-00.toc +++ /dev/null @@ -1,611 +0,0 @@ -([('AutoFire.exe', - 'C:\\Dev\\AutoFireBase\\build\\AutoFire_20250909_200404\\AutoFire\\AutoFire.exe', - 'EXECUTABLE'), - ('python311.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\python311.dll', - 'BINARY'), - ('PySide6\\plugins\\platforms\\qdirect2d.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\platforms\\qdirect2d.dll', - 'BINARY'), - ('PySide6\\plugins\\platforms\\qoffscreen.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\platforms\\qoffscreen.dll', - 'BINARY'), - ('PySide6\\plugins\\imageformats\\qwbmp.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\imageformats\\qwbmp.dll', - 'BINARY'), - ('PySide6\\plugins\\platforminputcontexts\\qtvirtualkeyboardplugin.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\platforminputcontexts\\qtvirtualkeyboardplugin.dll', - 'BINARY'), - ('PySide6\\plugins\\imageformats\\qicns.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\imageformats\\qicns.dll', - 'BINARY'), - ('PySide6\\plugins\\platforms\\qminimal.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\platforms\\qminimal.dll', - 'BINARY'), - ('PySide6\\plugins\\imageformats\\qsvg.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\imageformats\\qsvg.dll', - 'BINARY'), - ('PySide6\\plugins\\imageformats\\qtiff.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\imageformats\\qtiff.dll', - 'BINARY'), - ('PySide6\\plugins\\platforms\\qwindows.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\platforms\\qwindows.dll', - 'BINARY'), - ('PySide6\\plugins\\generic\\qtuiotouchplugin.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\generic\\qtuiotouchplugin.dll', - 'BINARY'), - ('PySide6\\plugins\\imageformats\\qico.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\imageformats\\qico.dll', - 'BINARY'), - ('PySide6\\plugins\\imageformats\\qwebp.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\imageformats\\qwebp.dll', - 'BINARY'), - ('PySide6\\plugins\\imageformats\\qpdf.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\imageformats\\qpdf.dll', - 'BINARY'), - ('PySide6\\plugins\\imageformats\\qjpeg.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\imageformats\\qjpeg.dll', - 'BINARY'), - ('PySide6\\plugins\\imageformats\\qgif.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\imageformats\\qgif.dll', - 'BINARY'), - ('PySide6\\plugins\\imageformats\\qtga.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\imageformats\\qtga.dll', - 'BINARY'), - ('PySide6\\plugins\\iconengines\\qsvgicon.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\iconengines\\qsvgicon.dll', - 'BINARY'), - ('PySide6\\plugins\\styles\\qmodernwindowsstyle.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\styles\\qmodernwindowsstyle.dll', - 'BINARY'), - ('PySide6\\opengl32sw.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\opengl32sw.dll', - 'BINARY'), - ('PySide6\\plugins\\networkinformation\\qnetworklistmanager.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\networkinformation\\qnetworklistmanager.dll', - 'BINARY'), - ('PySide6\\plugins\\tls\\qcertonlybackend.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\tls\\qcertonlybackend.dll', - 'BINARY'), - ('PySide6\\plugins\\tls\\qschannelbackend.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\tls\\qschannelbackend.dll', - 'BINARY'), - ('PySide6\\plugins\\tls\\qopensslbackend.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\plugins\\tls\\qopensslbackend.dll', - 'BINARY'), - ('_decimal.pyd', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\DLLs\\_decimal.pyd', - 'EXTENSION'), - ('_hashlib.pyd', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\DLLs\\_hashlib.pyd', - 'EXTENSION'), - ('unicodedata.pyd', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\DLLs\\unicodedata.pyd', - 'EXTENSION'), - ('select.pyd', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\DLLs\\select.pyd', - 'EXTENSION'), - ('_socket.pyd', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\DLLs\\_socket.pyd', - 'EXTENSION'), - ('_lzma.pyd', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\DLLs\\_lzma.pyd', - 'EXTENSION'), - ('_bz2.pyd', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\DLLs\\_bz2.pyd', - 'EXTENSION'), - ('PySide6\\QtGui.pyd', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\QtGui.pyd', - 'EXTENSION'), - ('shiboken6\\Shiboken.pyd', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\shiboken6\\Shiboken.pyd', - 'EXTENSION'), - ('PySide6\\QtCore.pyd', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\QtCore.pyd', - 'EXTENSION'), - ('PySide6\\QtWidgets.pyd', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\QtWidgets.pyd', - 'EXTENSION'), - ('PySide6\\QtNetwork.pyd', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\QtNetwork.pyd', - 'EXTENSION'), - ('VCRUNTIME140.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\VCRUNTIME140.dll', - 'BINARY'), - ('shiboken6\\MSVCP140.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\shiboken6\\MSVCP140.dll', - 'BINARY'), - ('PySide6\\Qt6Gui.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6Gui.dll', - 'BINARY'), - ('VCRUNTIME140_1.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\VCRUNTIME140_1.dll', - 'BINARY'), - ('PySide6\\Qt6Core.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6Core.dll', - 'BINARY'), - ('PySide6\\Qt6VirtualKeyboard.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6VirtualKeyboard.dll', - 'BINARY'), - ('PySide6\\Qt6Svg.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6Svg.dll', - 'BINARY'), - ('PySide6\\Qt6Network.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6Network.dll', - 'BINARY'), - ('PySide6\\Qt6Pdf.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6Pdf.dll', - 'BINARY'), - ('PySide6\\Qt6Widgets.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6Widgets.dll', - 'BINARY'), - ('libcrypto-3.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\DLLs\\libcrypto-3.dll', - 'BINARY'), - ('PySide6\\VCRUNTIME140_1.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\VCRUNTIME140_1.dll', - 'BINARY'), - ('shiboken6\\shiboken6.abi3.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\shiboken6\\shiboken6.abi3.dll', - 'BINARY'), - ('python3.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\python3.dll', - 'BINARY'), - ('PySide6\\MSVCP140_2.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\MSVCP140_2.dll', - 'BINARY'), - ('PySide6\\pyside6.abi3.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\pyside6.abi3.dll', - 'BINARY'), - ('PySide6\\VCRUNTIME140.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\VCRUNTIME140.dll', - 'BINARY'), - ('PySide6\\MSVCP140.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\MSVCP140.dll', - 'BINARY'), - ('shiboken6\\VCRUNTIME140_1.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\shiboken6\\VCRUNTIME140_1.dll', - 'BINARY'), - ('shiboken6\\VCRUNTIME140.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\shiboken6\\VCRUNTIME140.dll', - 'BINARY'), - ('PySide6\\MSVCP140_1.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\MSVCP140_1.dll', - 'BINARY'), - ('PySide6\\Qt6Qml.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6Qml.dll', - 'BINARY'), - ('PySide6\\Qt6Quick.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6Quick.dll', - 'BINARY'), - ('PySide6\\Qt6QmlMeta.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6QmlMeta.dll', - 'BINARY'), - ('PySide6\\Qt6OpenGL.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6OpenGL.dll', - 'BINARY'), - ('PySide6\\Qt6QmlModels.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6QmlModels.dll', - 'BINARY'), - ('PySide6\\Qt6QmlWorkerScript.dll', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\Qt6QmlWorkerScript.dll', - 'BINARY'), - ('app\\README.txt', 'C:\\Dev\\AutoFireBase\\app\\README.txt', 'DATA'), - ('app\\__init__.py', 'C:\\Dev\\AutoFireBase\\app\\__init__.py', 'DATA'), - ('app\\__pycache__\\__init__.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\__pycache__\\__init__.cpython-311.pyc', - 'DATA'), - ('app\\__pycache__\\assistant.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\__pycache__\\assistant.cpython-311.pyc', - 'DATA'), - ('app\\__pycache__\\catalog.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\__pycache__\\catalog.cpython-311.pyc', - 'DATA'), - ('app\\__pycache__\\coverage.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\__pycache__\\coverage.cpython-311.pyc', - 'DATA'), - ('app\\__pycache__\\device.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\__pycache__\\device.cpython-311.pyc', - 'DATA'), - ('app\\__pycache__\\main.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\__pycache__\\main.cpython-311.pyc', - 'DATA'), - ('app\\__pycache__\\scene.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\__pycache__\\scene.cpython-311.pyc', - 'DATA'), - ('app\\__pycache__\\wiring.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\__pycache__\\wiring.cpython-311.pyc', - 'DATA'), - ('app\\ai_scaffold.py', 'C:\\Dev\\AutoFireBase\\app\\ai_scaffold.py', 'DATA'), - ('app\\assistant.py', 'C:\\Dev\\AutoFireBase\\app\\assistant.py', 'DATA'), - ('app\\boot.py', 'C:\\Dev\\AutoFireBase\\app\\boot.py', 'DATA'), - ('app\\boot.py.bak_20250908_213900', - 'C:\\Dev\\AutoFireBase\\app\\boot.py.bak_20250908_213900', - 'DATA'), - ('app\\catalog.py', 'C:\\Dev\\AutoFireBase\\app\\catalog.py', 'DATA'), - ('app\\coverage.py', 'C:\\Dev\\AutoFireBase\\app\\coverage.py', 'DATA'), - ('app\\data\\iface.py', 'C:\\Dev\\AutoFireBase\\app\\data\\iface.py', 'DATA'), - ('app\\data\\sqlite_store.py', - 'C:\\Dev\\AutoFireBase\\app\\data\\sqlite_store.py', - 'DATA'), - ('app\\device.py', 'C:\\Dev\\AutoFireBase\\app\\device.py', 'DATA'), - ('app\\dialogs\\__init__.py', - 'C:\\Dev\\AutoFireBase\\app\\dialogs\\__init__.py', - 'DATA'), - ('app\\dialogs\\__pycache__\\__init__.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\dialogs\\__pycache__\\__init__.cpython-311.pyc', - 'DATA'), - ('app\\dialogs\\array.py', - 'C:\\Dev\\AutoFireBase\\app\\dialogs\\array.py', - 'DATA'), - ('app\\dialogs\\coverage.py', - 'C:\\Dev\\AutoFireBase\\app\\dialogs\\coverage.py', - 'DATA'), - ('app\\dialogs\\device_props.py', - 'C:\\Dev\\AutoFireBase\\app\\dialogs\\device_props.py', - 'DATA'), - ('app\\layout.py', 'C:\\Dev\\AutoFireBase\\app\\layout.py', 'DATA'), - ('app\\main.py', 'C:\\Dev\\AutoFireBase\\app\\main.py', 'DATA'), - ('app\\main.py.bak', 'C:\\Dev\\AutoFireBase\\app\\main.py.bak', 'DATA'), - ('app\\main.py.bak_20250908_211210', - 'C:\\Dev\\AutoFireBase\\app\\main.py.bak_20250908_211210', - 'DATA'), - ('app\\main_startup_safety.py', - 'C:\\Dev\\AutoFireBase\\app\\main_startup_safety.py', - 'DATA'), - ('app\\minwin.py', 'C:\\Dev\\AutoFireBase\\app\\minwin.py', 'DATA'), - ('app\\scene.py', 'C:\\Dev\\AutoFireBase\\app\\scene.py', 'DATA'), - ('app\\scene.py.bak', 'C:\\Dev\\AutoFireBase\\app\\scene.py.bak', 'DATA'), - ('app\\settings.py', 'C:\\Dev\\AutoFireBase\\app\\settings.py', 'DATA'), - ('app\\tools\\__init__.py', - 'C:\\Dev\\AutoFireBase\\app\\tools\\__init__.py', - 'DATA'), - ('app\\tools\\__pycache__\\__init__.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\tools\\__pycache__\\__init__.cpython-311.pyc', - 'DATA'), - ('app\\tools\\__pycache__\\align.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\tools\\__pycache__\\align.cpython-311.pyc', - 'DATA'), - ('app\\tools\\__pycache__\\array.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\tools\\__pycache__\\array.cpython-311.pyc', - 'DATA'), - ('app\\tools\\__pycache__\\draw.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\tools\\__pycache__\\draw.cpython-311.pyc', - 'DATA'), - ('app\\tools\\align.py', - 'C:\\Dev\\AutoFireBase\\app\\tools\\align.py', - 'DATA'), - ('app\\tools\\array.py', - 'C:\\Dev\\AutoFireBase\\app\\tools\\array.py', - 'DATA'), - ('app\\tools\\array.py.bak_20250908_211210', - 'C:\\Dev\\AutoFireBase\\app\\tools\\array.py.bak_20250908_211210', - 'DATA'), - ('app\\tools\\dimension.py', - 'C:\\Dev\\AutoFireBase\\app\\tools\\dimension.py', - 'DATA'), - ('app\\tools\\dimension.py.bak', - 'C:\\Dev\\AutoFireBase\\app\\tools\\dimension.py.bak', - 'DATA'), - ('app\\tools\\draw.py', 'C:\\Dev\\AutoFireBase\\app\\tools\\draw.py', 'DATA'), - ('app\\ui\\__pycache__\\settings.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\ui\\__pycache__\\settings.cpython-311.pyc', - 'DATA'), - ('app\\ui\\__pycache__\\theme.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\app\\ui\\__pycache__\\theme.cpython-311.pyc', - 'DATA'), - ('app\\ui\\settings.py', - 'C:\\Dev\\AutoFireBase\\app\\ui\\settings.py', - 'DATA'), - ('app\\ui\\theme.py', 'C:\\Dev\\AutoFireBase\\app\\ui\\theme.py', 'DATA'), - ('app\\units.py', 'C:\\Dev\\AutoFireBase\\app\\units.py', 'DATA'), - ('app\\wiring.py', 'C:\\Dev\\AutoFireBase\\app\\wiring.py', 'DATA'), - ('core\\__init__.py', 'C:\\Dev\\AutoFireBase\\core\\__init__.py', 'DATA'), - ('core\\__pycache__\\__init__.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\core\\__pycache__\\__init__.cpython-311.pyc', - 'DATA'), - ('core\\error_hook.py', 'C:\\Dev\\AutoFireBase\\core\\error_hook.py', 'DATA'), - ('core\\logger.py', 'C:\\Dev\\AutoFireBase\\core\\logger.py', 'DATA'), - ('core\\logger_bridge.py', - 'C:\\Dev\\AutoFireBase\\core\\logger_bridge.py', - 'DATA'), - ('updater\\__init__.py', - 'C:\\Dev\\AutoFireBase\\updater\\__init__.py', - 'DATA'), - ('updater\\__pycache__\\__init__.cpython-311.pyc', - 'C:\\Dev\\AutoFireBase\\updater\\__pycache__\\__init__.cpython-311.pyc', - 'DATA'), - ('updater\\auto_update.py', - 'C:\\Dev\\AutoFireBase\\updater\\auto_update.py', - 'DATA'), - ('PySide6\\translations\\qt_help_gl.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_gl.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_pl.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_pl.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_hr.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_hr.qm', - 'DATA'), - ('PySide6\\translations\\qt_en.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_en.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_de.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_de.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_pt_BR.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_pt_BR.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_fr.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_fr.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_sv.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_sv.qm', - 'DATA'), - ('PySide6\\translations\\qt_sl.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_sl.qm', - 'DATA'), - ('PySide6\\translations\\qt_pl.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_pl.qm', - 'DATA'), - ('PySide6\\translations\\qt_gd.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_gd.qm', - 'DATA'), - ('PySide6\\translations\\qt_it.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_it.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_ru.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_ru.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_ar.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_ar.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_ca.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_ca.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_en.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_en.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_es.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_es.qm', - 'DATA'), - ('PySide6\\translations\\qt_ja.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_ja.qm', - 'DATA'), - ('PySide6\\translations\\qt_tr.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_tr.qm', - 'DATA'), - ('PySide6\\translations\\qt_fr.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_fr.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_fi.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_fi.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_ka.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_ka.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_hr.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_hr.qm', - 'DATA'), - ('PySide6\\translations\\qt_sv.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_sv.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_nn.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_nn.qm', - 'DATA'), - ('PySide6\\translations\\qt_lg.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_lg.qm', - 'DATA'), - ('PySide6\\translations\\qt_cs.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_cs.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_fa.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_fa.qm', - 'DATA'), - ('PySide6\\translations\\qt_gl.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_gl.qm', - 'DATA'), - ('PySide6\\translations\\qt_ko.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_ko.qm', - 'DATA'), - ('PySide6\\translations\\qt_nl.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_nl.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_sl.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_sl.qm', - 'DATA'), - ('PySide6\\translations\\qt_lv.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_lv.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_es.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_es.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_ko.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_ko.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_uk.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_uk.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_bg.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_bg.qm', - 'DATA'), - ('PySide6\\translations\\qt_ca.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_ca.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_uk.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_uk.qm', - 'DATA'), - ('PySide6\\translations\\qt_ka.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_ka.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_lg.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_lg.qm', - 'DATA'), - ('PySide6\\translations\\qt_pt_BR.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_pt_BR.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_cs.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_cs.qm', - 'DATA'), - ('PySide6\\translations\\qt_bg.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_bg.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_zh_CN.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_zh_CN.qm', - 'DATA'), - ('PySide6\\translations\\qt_hr.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_hr.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_zh_CN.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_zh_CN.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_da.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_da.qm', - 'DATA'), - ('PySide6\\translations\\qt_pt_PT.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_pt_PT.qm', - 'DATA'), - ('PySide6\\translations\\qt_sk.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_sk.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_nl.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_nl.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_sv.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_sv.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_en.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_en.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_ja.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_ja.qm', - 'DATA'), - ('PySide6\\translations\\qt_nn.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_nn.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_he.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_he.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_cs.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_cs.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_hu.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_hu.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_tr.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_tr.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_hu.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_hu.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_nn.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_nn.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_ja.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_ja.qm', - 'DATA'), - ('PySide6\\translations\\qt_zh_CN.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_zh_CN.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_ru.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_ru.qm', - 'DATA'), - ('PySide6\\translations\\qt_de.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_de.qm', - 'DATA'), - ('PySide6\\translations\\qt_ar.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_ar.qm', - 'DATA'), - ('PySide6\\translations\\qt_uk.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_uk.qm', - 'DATA'), - ('PySide6\\translations\\qt_es.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_es.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_tr.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_tr.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_de.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_de.qm', - 'DATA'), - ('PySide6\\translations\\qt_fi.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_fi.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_pt_BR.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_pt_BR.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_zh_TW.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_zh_TW.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_it.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_it.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_ar.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_ar.qm', - 'DATA'), - ('PySide6\\translations\\qt_he.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_he.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_ka.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_ka.qm', - 'DATA'), - ('PySide6\\translations\\qt_da.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_da.qm', - 'DATA'), - ('PySide6\\translations\\qt_lt.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_lt.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_it.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_it.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_sk.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_sk.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_nl.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_nl.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_zh_TW.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_zh_TW.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_bg.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_bg.qm', - 'DATA'), - ('PySide6\\translations\\qt_zh_TW.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_zh_TW.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_fr.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_fr.qm', - 'DATA'), - ('PySide6\\translations\\qt_fa.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_fa.qm', - 'DATA'), - ('PySide6\\translations\\qt_ru.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_ru.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_ca.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_ca.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_lv.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_lv.qm', - 'DATA'), - ('PySide6\\translations\\qt_hu.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_hu.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_da.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_da.qm', - 'DATA'), - ('PySide6\\translations\\qt_help_pl.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qt_help_pl.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_gd.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_gd.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_sk.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_sk.qm', - 'DATA'), - ('PySide6\\translations\\qtbase_ko.qm', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\translations\\qtbase_ko.qm', - 'DATA'), - ('base_library.zip', - 'C:\\Dev\\AutoFireBase\\build\\AutoFire_20250909_200404\\AutoFire\\base_library.zip', - 'DATA')],) diff --git a/build/AutoFire_20250909_200404/AutoFire/EXE-00.toc b/build/AutoFire_20250909_200404/AutoFire/EXE-00.toc deleted file mode 100644 index d6456c1..0000000 --- a/build/AutoFire_20250909_200404/AutoFire/EXE-00.toc +++ /dev/null @@ -1,69 +0,0 @@ -('C:\\Dev\\AutoFireBase\\build\\AutoFire_20250909_200404\\AutoFire\\AutoFire.exe', - False, - False, - True, - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PyInstaller\\bootloader\\images\\icon-windowed.ico', - None, - False, - False, - b'\n\n \n \n \n \n \n \n \n ' - b'\n <' - b'application>\n \n \n ' - b' \n \n \n \n <' - b'/compatibility>\n ' - b'\n \n true\n \n \n \n \n \n \n \n', - True, - False, - None, - None, - None, - 'C:\\Dev\\AutoFireBase\\build\\AutoFire_20250909_200404\\AutoFire\\AutoFire.pkg', - [('pyi-contents-directory _internal', '', 'OPTION'), - ('PYZ-00.pyz', - 'C:\\Dev\\AutoFireBase\\build\\AutoFire_20250909_200404\\AutoFire\\PYZ-00.pyz', - 'PYZ'), - ('struct', - 'C:\\Dev\\AutoFireBase\\build\\AutoFire_20250909_200404\\AutoFire\\localpycs\\struct.pyc', - 'PYMODULE'), - ('pyimod01_archive', - 'C:\\Dev\\AutoFireBase\\build\\AutoFire_20250909_200404\\AutoFire\\localpycs\\pyimod01_archive.pyc', - 'PYMODULE'), - ('pyimod02_importers', - 'C:\\Dev\\AutoFireBase\\build\\AutoFire_20250909_200404\\AutoFire\\localpycs\\pyimod02_importers.pyc', - 'PYMODULE'), - ('pyimod03_ctypes', - 'C:\\Dev\\AutoFireBase\\build\\AutoFire_20250909_200404\\AutoFire\\localpycs\\pyimod03_ctypes.pyc', - 'PYMODULE'), - ('pyimod04_pywin32', - 'C:\\Dev\\AutoFireBase\\build\\AutoFire_20250909_200404\\AutoFire\\localpycs\\pyimod04_pywin32.pyc', - 'PYMODULE'), - ('pyiboot01_bootstrap', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PyInstaller\\loader\\pyiboot01_bootstrap.py', - 'PYSOURCE'), - ('pyi_rth_inspect', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py', - 'PYSOURCE'), - ('pyi_rth_pyside6', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pyside6.py', - 'PYSOURCE'), - ('boot', 'C:\\Dev\\AutoFireBase\\app\\boot.py', 'PYSOURCE')], - [], - False, - False, - 1757466257, - [('runw.exe', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PyInstaller\\bootloader\\Windows-64bit-intel\\runw.exe', - 'EXECUTABLE')], - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\python311.dll') diff --git a/build/AutoFire_20250909_200404/AutoFire/PKG-00.toc b/build/AutoFire_20250909_200404/AutoFire/PKG-00.toc deleted file mode 100644 index 3056a5a..0000000 --- a/build/AutoFire_20250909_200404/AutoFire/PKG-00.toc +++ /dev/null @@ -1,47 +0,0 @@ -('C:\\Dev\\AutoFireBase\\build\\AutoFire_20250909_200404\\AutoFire\\AutoFire.pkg', - {'BINARY': True, - 'DATA': True, - 'EXECUTABLE': True, - 'EXTENSION': True, - 'PYMODULE': True, - 'PYSOURCE': True, - 'PYZ': False, - 'SPLASH': True, - 'SYMLINK': False}, - [('pyi-contents-directory _internal', '', 'OPTION'), - ('PYZ-00.pyz', - 'C:\\Dev\\AutoFireBase\\build\\AutoFire_20250909_200404\\AutoFire\\PYZ-00.pyz', - 'PYZ'), - ('struct', - 'C:\\Dev\\AutoFireBase\\build\\AutoFire_20250909_200404\\AutoFire\\localpycs\\struct.pyc', - 'PYMODULE'), - ('pyimod01_archive', - 'C:\\Dev\\AutoFireBase\\build\\AutoFire_20250909_200404\\AutoFire\\localpycs\\pyimod01_archive.pyc', - 'PYMODULE'), - ('pyimod02_importers', - 'C:\\Dev\\AutoFireBase\\build\\AutoFire_20250909_200404\\AutoFire\\localpycs\\pyimod02_importers.pyc', - 'PYMODULE'), - ('pyimod03_ctypes', - 'C:\\Dev\\AutoFireBase\\build\\AutoFire_20250909_200404\\AutoFire\\localpycs\\pyimod03_ctypes.pyc', - 'PYMODULE'), - ('pyimod04_pywin32', - 'C:\\Dev\\AutoFireBase\\build\\AutoFire_20250909_200404\\AutoFire\\localpycs\\pyimod04_pywin32.pyc', - 'PYMODULE'), - ('pyiboot01_bootstrap', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PyInstaller\\loader\\pyiboot01_bootstrap.py', - 'PYSOURCE'), - ('pyi_rth_inspect', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py', - 'PYSOURCE'), - ('pyi_rth_pyside6', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pyside6.py', - 'PYSOURCE'), - ('boot', 'C:\\Dev\\AutoFireBase\\app\\boot.py', 'PYSOURCE')], - 'python311.dll', - True, - False, - False, - [], - None, - None, - None) diff --git a/build/AutoFire_20250909_200404/AutoFire/PYZ-00.pyz b/build/AutoFire_20250909_200404/AutoFire/PYZ-00.pyz deleted file mode 100644 index c71e88f..0000000 Binary files a/build/AutoFire_20250909_200404/AutoFire/PYZ-00.pyz and /dev/null differ diff --git a/build/AutoFire_20250909_200404/AutoFire/PYZ-00.toc b/build/AutoFire_20250909_200404/AutoFire/PYZ-00.toc deleted file mode 100644 index 837ac07..0000000 --- a/build/AutoFire_20250909_200404/AutoFire/PYZ-00.toc +++ /dev/null @@ -1,331 +0,0 @@ -('C:\\Dev\\AutoFireBase\\build\\AutoFire_20250909_200404\\AutoFire\\PYZ-00.pyz', - [('PySide6', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\__init__.py', - 'PYMODULE'), - ('PySide6.support', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\support\\__init__.py', - 'PYMODULE'), - ('PySide6.support.deprecated', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PySide6\\support\\deprecated.py', - 'PYMODULE'), - ('__future__', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\__future__.py', - 'PYMODULE'), - ('_compat_pickle', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\_compat_pickle.py', - 'PYMODULE'), - ('_compression', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\_compression.py', - 'PYMODULE'), - ('_py_abc', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\_py_abc.py', - 'PYMODULE'), - ('_pydecimal', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\_pydecimal.py', - 'PYMODULE'), - ('_pyi_rth_utils', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PyInstaller\\fake-modules\\_pyi_rth_utils\\__init__.py', - 'PYMODULE'), - ('_pyi_rth_utils.qt', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\PyInstaller\\fake-modules\\_pyi_rth_utils\\qt.py', - 'PYMODULE'), - ('_strptime', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\_strptime.py', - 'PYMODULE'), - ('_threading_local', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\_threading_local.py', - 'PYMODULE'), - ('app', 'C:\\Dev\\AutoFireBase\\app\\__init__.py', 'PYMODULE'), - ('app.minwin', 'C:\\Dev\\AutoFireBase\\app\\minwin.py', 'PYMODULE'), - ('app.scene', 'C:\\Dev\\AutoFireBase\\app\\scene.py', 'PYMODULE'), - ('app.tools', 'C:\\Dev\\AutoFireBase\\app\\tools\\__init__.py', 'PYMODULE'), - ('app.tools.array', - 'C:\\Dev\\AutoFireBase\\app\\tools\\array.py', - 'PYMODULE'), - ('app.tools.dimension', - 'C:\\Dev\\AutoFireBase\\app\\tools\\dimension.py', - 'PYMODULE'), - ('app.tools.draw', 'C:\\Dev\\AutoFireBase\\app\\tools\\draw.py', 'PYMODULE'), - ('app.units', 'C:\\Dev\\AutoFireBase\\app\\units.py', 'PYMODULE'), - ('argparse', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\argparse.py', - 'PYMODULE'), - ('ast', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\ast.py', - 'PYMODULE'), - ('base64', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\base64.py', - 'PYMODULE'), - ('bisect', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\bisect.py', - 'PYMODULE'), - ('bz2', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\bz2.py', - 'PYMODULE'), - ('calendar', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\calendar.py', - 'PYMODULE'), - ('contextlib', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\contextlib.py', - 'PYMODULE'), - ('contextvars', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\contextvars.py', - 'PYMODULE'), - ('copy', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\copy.py', - 'PYMODULE'), - ('csv', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\csv.py', - 'PYMODULE'), - ('dataclasses', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\dataclasses.py', - 'PYMODULE'), - ('datetime', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\datetime.py', - 'PYMODULE'), - ('decimal', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\decimal.py', - 'PYMODULE'), - ('dis', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\dis.py', - 'PYMODULE'), - ('email', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\__init__.py', - 'PYMODULE'), - ('email._encoded_words', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\_encoded_words.py', - 'PYMODULE'), - ('email._header_value_parser', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\_header_value_parser.py', - 'PYMODULE'), - ('email._parseaddr', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\_parseaddr.py', - 'PYMODULE'), - ('email._policybase', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\_policybase.py', - 'PYMODULE'), - ('email.base64mime', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\base64mime.py', - 'PYMODULE'), - ('email.charset', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\charset.py', - 'PYMODULE'), - ('email.contentmanager', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\contentmanager.py', - 'PYMODULE'), - ('email.encoders', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\encoders.py', - 'PYMODULE'), - ('email.errors', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\errors.py', - 'PYMODULE'), - ('email.feedparser', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\feedparser.py', - 'PYMODULE'), - ('email.generator', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\generator.py', - 'PYMODULE'), - ('email.header', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\header.py', - 'PYMODULE'), - ('email.headerregistry', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\headerregistry.py', - 'PYMODULE'), - ('email.iterators', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\iterators.py', - 'PYMODULE'), - ('email.message', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\message.py', - 'PYMODULE'), - ('email.parser', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\parser.py', - 'PYMODULE'), - ('email.policy', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\policy.py', - 'PYMODULE'), - ('email.quoprimime', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\quoprimime.py', - 'PYMODULE'), - ('email.utils', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\email\\utils.py', - 'PYMODULE'), - ('fnmatch', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\fnmatch.py', - 'PYMODULE'), - ('fractions', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\fractions.py', - 'PYMODULE'), - ('getopt', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\getopt.py', - 'PYMODULE'), - ('gettext', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\gettext.py', - 'PYMODULE'), - ('gzip', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\gzip.py', - 'PYMODULE'), - ('hashlib', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\hashlib.py', - 'PYMODULE'), - ('importlib', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\__init__.py', - 'PYMODULE'), - ('importlib._abc', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\_abc.py', - 'PYMODULE'), - ('importlib._bootstrap', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\_bootstrap.py', - 'PYMODULE'), - ('importlib._bootstrap_external', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\_bootstrap_external.py', - 'PYMODULE'), - ('importlib.abc', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\abc.py', - 'PYMODULE'), - ('importlib.machinery', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\machinery.py', - 'PYMODULE'), - ('importlib.metadata', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\metadata\\__init__.py', - 'PYMODULE'), - ('importlib.metadata._adapters', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\metadata\\_adapters.py', - 'PYMODULE'), - ('importlib.metadata._collections', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\metadata\\_collections.py', - 'PYMODULE'), - ('importlib.metadata._functools', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\metadata\\_functools.py', - 'PYMODULE'), - ('importlib.metadata._itertools', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\metadata\\_itertools.py', - 'PYMODULE'), - ('importlib.metadata._meta', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\metadata\\_meta.py', - 'PYMODULE'), - ('importlib.metadata._text', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\metadata\\_text.py', - 'PYMODULE'), - ('importlib.readers', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\readers.py', - 'PYMODULE'), - ('importlib.resources', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\resources\\__init__.py', - 'PYMODULE'), - ('importlib.resources._adapters', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\resources\\_adapters.py', - 'PYMODULE'), - ('importlib.resources._common', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\resources\\_common.py', - 'PYMODULE'), - ('importlib.resources._itertools', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\resources\\_itertools.py', - 'PYMODULE'), - ('importlib.resources._legacy', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\resources\\_legacy.py', - 'PYMODULE'), - ('importlib.resources.abc', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\resources\\abc.py', - 'PYMODULE'), - ('importlib.resources.readers', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\resources\\readers.py', - 'PYMODULE'), - ('importlib.util', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\importlib\\util.py', - 'PYMODULE'), - ('inspect', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\inspect.py', - 'PYMODULE'), - ('ipaddress', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\ipaddress.py', - 'PYMODULE'), - ('logging', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\logging\\__init__.py', - 'PYMODULE'), - ('lzma', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\lzma.py', - 'PYMODULE'), - ('numbers', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\numbers.py', - 'PYMODULE'), - ('opcode', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\opcode.py', - 'PYMODULE'), - ('pathlib', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\pathlib.py', - 'PYMODULE'), - ('pickle', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\pickle.py', - 'PYMODULE'), - ('pprint', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\pprint.py', - 'PYMODULE'), - ('py_compile', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\py_compile.py', - 'PYMODULE'), - ('quopri', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\quopri.py', - 'PYMODULE'), - ('random', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\random.py', - 'PYMODULE'), - ('selectors', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\selectors.py', - 'PYMODULE'), - ('shiboken6', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\shiboken6\\__init__.py', - 'PYMODULE'), - ('shutil', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\shutil.py', - 'PYMODULE'), - ('signal', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\signal.py', - 'PYMODULE'), - ('socket', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\socket.py', - 'PYMODULE'), - ('statistics', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\statistics.py', - 'PYMODULE'), - ('string', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\string.py', - 'PYMODULE'), - ('stringprep', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\stringprep.py', - 'PYMODULE'), - ('subprocess', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\subprocess.py', - 'PYMODULE'), - ('tarfile', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\tarfile.py', - 'PYMODULE'), - ('tempfile', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\tempfile.py', - 'PYMODULE'), - ('textwrap', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\textwrap.py', - 'PYMODULE'), - ('threading', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\threading.py', - 'PYMODULE'), - ('token', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\token.py', - 'PYMODULE'), - ('tokenize', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\tokenize.py', - 'PYMODULE'), - ('tracemalloc', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\tracemalloc.py', - 'PYMODULE'), - ('typing', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\typing.py', - 'PYMODULE'), - ('urllib', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\urllib\\__init__.py', - 'PYMODULE'), - ('urllib.parse', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\urllib\\parse.py', - 'PYMODULE'), - ('zipfile', - 'C:\\Users\\whoba\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\zipfile.py', - 'PYMODULE')]) diff --git a/build/AutoFire_20250909_200404/AutoFire/base_library.zip b/build/AutoFire_20250909_200404/AutoFire/base_library.zip deleted file mode 100644 index 4a8f95a..0000000 Binary files a/build/AutoFire_20250909_200404/AutoFire/base_library.zip and /dev/null differ diff --git a/build/AutoFire_20250909_200404/AutoFire/localpycs/pyimod01_archive.pyc b/build/AutoFire_20250909_200404/AutoFire/localpycs/pyimod01_archive.pyc deleted file mode 100644 index 3e21cb9..0000000 Binary files a/build/AutoFire_20250909_200404/AutoFire/localpycs/pyimod01_archive.pyc and /dev/null differ diff --git a/build/AutoFire_20250909_200404/AutoFire/localpycs/pyimod02_importers.pyc b/build/AutoFire_20250909_200404/AutoFire/localpycs/pyimod02_importers.pyc deleted file mode 100644 index b410b40..0000000 Binary files a/build/AutoFire_20250909_200404/AutoFire/localpycs/pyimod02_importers.pyc and /dev/null differ diff --git a/build/AutoFire_20250909_200404/AutoFire/localpycs/pyimod03_ctypes.pyc b/build/AutoFire_20250909_200404/AutoFire/localpycs/pyimod03_ctypes.pyc deleted file mode 100644 index 726f51f..0000000 Binary files a/build/AutoFire_20250909_200404/AutoFire/localpycs/pyimod03_ctypes.pyc and /dev/null differ diff --git a/build/AutoFire_20250909_200404/AutoFire/localpycs/pyimod04_pywin32.pyc b/build/AutoFire_20250909_200404/AutoFire/localpycs/pyimod04_pywin32.pyc deleted file mode 100644 index 34842ca..0000000 Binary files a/build/AutoFire_20250909_200404/AutoFire/localpycs/pyimod04_pywin32.pyc and /dev/null differ diff --git a/build/AutoFire_20250909_200404/AutoFire/localpycs/struct.pyc b/build/AutoFire_20250909_200404/AutoFire/localpycs/struct.pyc deleted file mode 100644 index 3fa7004..0000000 Binary files a/build/AutoFire_20250909_200404/AutoFire/localpycs/struct.pyc and /dev/null differ diff --git a/build/AutoFire_20250909_200404/AutoFire/warn-AutoFire.txt b/build/AutoFire_20250909_200404/AutoFire/warn-AutoFire.txt deleted file mode 100644 index b7254f1..0000000 --- a/build/AutoFire_20250909_200404/AutoFire/warn-AutoFire.txt +++ /dev/null @@ -1,27 +0,0 @@ - -This file lists modules PyInstaller was not able to find. This does not -necessarily mean this module is required for running your program. Python and -Python 3rd-party packages include a lot of conditional or optional modules. For -example the module 'ntpath' only exists on Windows, whereas the module -'posixpath' only exists on Posix systems. - -Types if import: -* top-level: imported at the top-level - look at these first -* conditional: imported within an if-statement -* delayed: imported within a function -* optional: imported within a try-except-statement - -IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for - tracking down the missing module yourself. Thanks! - -missing module named 'org.python' - imported by copy (optional) -missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional) -missing module named org - imported by pickle (optional) -excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional) -missing module named posix - imported by os (conditional, optional), posixpath (optional), shutil (conditional), importlib._bootstrap_external (conditional) -missing module named resource - imported by posix (top-level) -missing module named grp - imported by shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional) -missing module named pwd - imported by posixpath (delayed, conditional, optional), shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional) -invalid module named app.main - imported by C:\Dev\AutoFireBase\app\boot.py (top-level) -missing module named _posixsubprocess - imported by subprocess (conditional) -missing module named fcntl - imported by subprocess (optional) diff --git a/build/AutoFire_20250909_200404/AutoFire/xref-AutoFire.html b/build/AutoFire_20250909_200404/AutoFire/xref-AutoFire.html deleted file mode 100644 index 7e3a6d3..0000000 --- a/build/AutoFire_20250909_200404/AutoFire/xref-AutoFire.html +++ /dev/null @@ -1,7703 +0,0 @@ - - - - - modulegraph cross reference for boot.py, pyi_rth_inspect.py, pyi_rth_pyside6.py - - - -

modulegraph cross reference for boot.py, pyi_rth_inspect.py, pyi_rth_pyside6.py

- -
- - boot.py -Script
-imports: - PySide6 - • PySide6.QtWidgets - • _collections_abc - • _weakrefset - • abc - • app.main - • app.minwin - • app.tools.array - • app.tools.dimension - • app.tools.draw - • codecs - • collections - • collections.abc - • copyreg - • datetime - • encodings - • encodings.aliases - • encodings.ascii - • encodings.base64_codec - • encodings.big5 - • encodings.big5hkscs - • encodings.bz2_codec - • encodings.charmap - • encodings.cp037 - • encodings.cp1006 - • encodings.cp1026 - • encodings.cp1125 - • encodings.cp1140 - • encodings.cp1250 - • encodings.cp1251 - • encodings.cp1252 - • encodings.cp1253 - • encodings.cp1254 - • encodings.cp1255 - • encodings.cp1256 - • encodings.cp1257 - • encodings.cp1258 - • encodings.cp273 - • encodings.cp424 - • encodings.cp437 - • encodings.cp500 - • encodings.cp720 - • encodings.cp737 - • encodings.cp775 - • encodings.cp850 - • encodings.cp852 - • encodings.cp855 - • encodings.cp856 - • encodings.cp857 - • encodings.cp858 - • encodings.cp860 - • encodings.cp861 - • encodings.cp862 - • encodings.cp863 - • encodings.cp864 - • encodings.cp865 - • encodings.cp866 - • encodings.cp869 - • encodings.cp874 - • encodings.cp875 - • encodings.cp932 - • encodings.cp949 - • encodings.cp950 - • encodings.euc_jis_2004 - • encodings.euc_jisx0213 - • encodings.euc_jp - • encodings.euc_kr - • encodings.gb18030 - • encodings.gb2312 - • encodings.gbk - • encodings.hex_codec - • encodings.hp_roman8 - • encodings.hz - • encodings.idna - • encodings.iso2022_jp - • encodings.iso2022_jp_1 - • encodings.iso2022_jp_2 - • encodings.iso2022_jp_2004 - • encodings.iso2022_jp_3 - • encodings.iso2022_jp_ext - • encodings.iso2022_kr - • encodings.iso8859_1 - • encodings.iso8859_10 - • encodings.iso8859_11 - • encodings.iso8859_13 - • encodings.iso8859_14 - • encodings.iso8859_15 - • encodings.iso8859_16 - • encodings.iso8859_2 - • encodings.iso8859_3 - • encodings.iso8859_4 - • encodings.iso8859_5 - • encodings.iso8859_6 - • encodings.iso8859_7 - • encodings.iso8859_8 - • encodings.iso8859_9 - • encodings.johab - • encodings.koi8_r - • encodings.koi8_t - • encodings.koi8_u - • encodings.kz1048 - • encodings.latin_1 - • encodings.mac_arabic - • encodings.mac_croatian - • encodings.mac_cyrillic - • encodings.mac_farsi - • encodings.mac_greek - • encodings.mac_iceland - • encodings.mac_latin2 - • encodings.mac_roman - • encodings.mac_romanian - • encodings.mac_turkish - • encodings.mbcs - • encodings.oem - • encodings.palmos - • encodings.ptcp154 - • encodings.punycode - • encodings.quopri_codec - • encodings.raw_unicode_escape - • encodings.rot_13 - • encodings.shift_jis - • encodings.shift_jis_2004 - • encodings.shift_jisx0213 - • encodings.tis_620 - • encodings.undefined - • encodings.unicode_escape - • encodings.utf_16 - • encodings.utf_16_be - • encodings.utf_16_le - • encodings.utf_32 - • encodings.utf_32_be - • encodings.utf_32_le - • encodings.utf_7 - • encodings.utf_8 - • encodings.utf_8_sig - • encodings.uu_codec - • encodings.zlib_codec - • enum - • functools - • genericpath - • heapq - • importlib - • importlib.util - • io - • keyword - • linecache - • locale - • ntpath - • operator - • os - • posixpath - • pyi_rth_inspect.py - • pyi_rth_pyside6.py - • re - • re._casefix - • re._compiler - • re._constants - • re._parser - • reprlib - • sre_compile - • sre_constants - • sre_parse - • stat - • sys - • traceback - • types - • warnings - • weakref - -
- -
- -
- - pyi_rth_inspect.py -Script
-imports: - inspect - • os - • sys - • zipfile - -
-
-imported by: - boot.py - -
- -
- -
- - pyi_rth_pyside6.py -Script
-imports: - _pyi_rth_utils - • _pyi_rth_utils.qt - • os - • sys - -
-
-imported by: - boot.py - -
- -
- -
- - 'org.python' -MissingModule
-imported by: - copy - -
- -
- -
- - PySide6 -Package
-imports: - PySide6 - • PySide6.QtNetwork - • PySide6.QtWidgets - • PySide6.support.deprecated - • inspect - • os - • pathlib - • shiboken6 - • shiboken6.Shiboken - • sys - • types - -
- - -
- -
- - PySide6.QtCore C:\Users\whoba\AppData\Local\Programs\Python\Python311\Lib\site-packages\PySide6\QtCore.pyd
-imports: - PySide6 - • PySide6.QtCore - • __future__ - • collections.abc - • enum - • os - • shiboken6 - • shiboken6.Shiboken - • typing - -
- - -
- -
- - PySide6.QtGui C:\Users\whoba\AppData\Local\Programs\Python\Python311\Lib\site-packages\PySide6\QtGui.pyd
-imports: - PySide6 - • PySide6.QtCore - • PySide6.QtGui - • __future__ - • collections.abc - • enum - • os - • shiboken6 - • shiboken6.Shiboken - • typing - -
-
-imported by: - PySide6.QtGui - • PySide6.QtWidgets - • app.scene - • app.tools.dimension - • app.tools.draw - -
- -
- -
- - PySide6.QtNetwork C:\Users\whoba\AppData\Local\Programs\Python\Python311\Lib\site-packages\PySide6\QtNetwork.pyd
-imports: - PySide6 - • PySide6.QtCore - • PySide6.QtNetwork - • __future__ - • collections.abc - • enum - • os - • shiboken6 - • shiboken6.Shiboken - • typing - -
-
-imported by: - PySide6 - • PySide6.QtNetwork - -
- -
- -
- - PySide6.QtWidgets C:\Users\whoba\AppData\Local\Programs\Python\Python311\Lib\site-packages\PySide6\QtWidgets.pyd
-imports: - PySide6 - • PySide6.QtCore - • PySide6.QtGui - • PySide6.QtWidgets - • __future__ - • collections.abc - • enum - • os - • shiboken6 - • shiboken6.Shiboken - • typing - -
-
-imported by: - PySide6 - • PySide6.QtWidgets - • app.minwin - • app.scene - • app.tools.dimension - • app.tools.draw - • boot.py - -
- -
- -
- - PySide6.support -Package
-imports: - PySide6 - • __future__ - • shiboken6.Shiboken - -
-
-imported by: - PySide6.support.deprecated - -
- -
- -
- - PySide6.support.deprecated -SourceModule
-imports: - PySide6.support - • __future__ - -
-
-imported by: - PySide6 - -
- -
- - - -
- - _abc (builtin module)
-imported by: - abc - -
- -
- -
- - _ast (builtin module)
-imported by: - ast - -
- -
- -
- - _bisect (builtin module)
-imported by: - bisect - -
- -
- -
- - _blake2 (builtin module)
-imported by: - hashlib - -
- -
- -
- - _bz2 C:\Users\whoba\AppData\Local\Programs\Python\Python311\DLLs\_bz2.pyd
-imported by: - bz2 - -
- -
- -
- - _codecs (builtin module)
-imported by: - codecs - -
- -
- -
- - _codecs_cn (builtin module)
-imported by: - encodings.gb18030 - • encodings.gb2312 - • encodings.gbk - • encodings.hz - -
- -
- -
- - _codecs_hk (builtin module)
-imported by: - encodings.big5hkscs - -
- -
- -
- - _codecs_iso2022 (builtin module) - -
- -
- - _codecs_jp (builtin module) - -
- -
- - _codecs_kr (builtin module)
-imported by: - encodings.cp949 - • encodings.euc_kr - • encodings.johab - -
- -
- -
- - _codecs_tw (builtin module)
-imported by: - encodings.big5 - • encodings.cp950 - -
- -
- -
- - _collections (builtin module)
-imported by: - collections - • threading - -
- -
- -
- - _collections_abc -SourceModule
-imports: - abc - • sys - -
-
-imported by: - boot.py - • collections - • collections.abc - • contextlib - • locale - • os - • pathlib - • random - • types - • weakref - -
- -
- -
- - _compat_pickle -SourceModule
-imported by: - _pickle - • pickle - -
- -
- -
- - _compression -SourceModule
-imports: - io - • sys - -
-
-imported by: - bz2 - • gzip - • lzma - -
- -
- -
- - _contextvars (builtin module)
-imported by: - contextvars - -
- -
- -
- - _csv (builtin module)
-imported by: - csv - -
- -
- -
- - _datetime (builtin module)
-imports: - _strptime - • time - -
-
-imported by: - datetime - -
- -
- -
- - _decimal C:\Users\whoba\AppData\Local\Programs\Python\Python311\DLLs\_decimal.pyd
-imported by: - decimal - -
- -
- -
- - _frozen_importlib -ExcludedModule
-imported by: - importlib - • importlib.abc - -
- -
- -
- - _frozen_importlib_external -MissingModule
-imported by: - importlib - • importlib._bootstrap - • importlib.abc - -
- -
- -
- - _functools (builtin module)
-imported by: - functools - -
- -
- -
- - _hashlib C:\Users\whoba\AppData\Local\Programs\Python\Python311\DLLs\_hashlib.pyd
-imported by: - hashlib - -
- -
- -
- - _heapq (builtin module)
-imported by: - heapq - -
- -
- -
- - _imp (builtin module)
-imported by: - importlib - • importlib._bootstrap_external - • importlib.util - -
- -
- -
- - _io (builtin module)
-imported by: - importlib._bootstrap_external - • io - -
- -
- -
- - _locale (builtin module)
-imported by: - locale - -
- -
- -
- - _lzma C:\Users\whoba\AppData\Local\Programs\Python\Python311\DLLs\_lzma.pyd
-imported by: - lzma - -
- -
- -
- - _md5 (builtin module)
-imported by: - hashlib - -
- -
- - - -
- - _opcode (builtin module)
-imported by: - opcode - -
- -
- -
- - _operator (builtin module)
-imported by: - operator - -
- -
- -
- - _pickle (builtin module)
-imports: - _compat_pickle - • codecs - • copyreg - -
-
-imported by: - pickle - -
- -
- -
- - _posixsubprocess -MissingModule
-imports: - gc - -
-
-imported by: - subprocess - -
- -
- -
- - _py_abc -SourceModule
-imports: - _weakrefset - -
-
-imported by: - abc - -
- -
- -
- - _pydecimal -SourceModule
-imports: - collections - • contextvars - • itertools - • locale - • math - • numbers - • re - • sys - -
-
-imported by: - decimal - -
- -
- -
- - _pyi_rth_utils -Package
-imports: - _pyi_rth_utils.qt - • os - • sys - -
-
-imported by: - _pyi_rth_utils.qt - • pyi_rth_pyside6.py - -
- -
- -
- - _pyi_rth_utils.qt -SourceModule
-imports: - _pyi_rth_utils - • atexit - • importlib - • os - -
-
-imported by: - _pyi_rth_utils - • pyi_rth_pyside6.py - -
- -
- -
- - _random (builtin module)
-imported by: - random - -
- -
- -
- - _sha1 (builtin module)
-imported by: - hashlib - -
- -
- -
- - _sha256 (builtin module)
-imported by: - hashlib - -
- -
- -
- - _sha3 (builtin module)
-imported by: - hashlib - -
- -
- -
- - _sha512 (builtin module)
-imported by: - hashlib - • random - -
- -
- -
- - _signal (builtin module)
-imported by: - signal - -
- -
- -
- - _socket C:\Users\whoba\AppData\Local\Programs\Python\Python311\DLLs\_socket.pyd
-imported by: - socket - -
- -
- -
- - _sre (builtin module)
-imports: - copy - • re - -
-
-imported by: - re._compiler - • re._constants - -
- -
- -
- - _stat (builtin module)
-imported by: - stat - -
- -
- -
- - _statistics (builtin module)
-imported by: - statistics - -
- -
- -
- - _string (builtin module)
-imported by: - string - -
- -
- -
- - _strptime -SourceModule
-imports: - _thread - • calendar - • datetime - • locale - • re - • time - -
-
-imported by: - _datetime - • datetime - • time - -
- -
- -
- - _struct (builtin module)
-imported by: - struct - -
- -
- -
- - _thread (builtin module)
-imported by: - _strptime - • dataclasses - • functools - • reprlib - • tempfile - • threading - -
- -
- -
- - _threading_local -SourceModule
-imports: - contextlib - • threading - • weakref - -
-
-imported by: - threading - -
- -
- -
- - _tokenize (builtin module)
-imported by: - tokenize - -
- -
- -
- - _tracemalloc (builtin module)
-imported by: - tracemalloc - -
- -
- -
- - _typing (builtin module)
-imported by: - typing - -
- -
- -
- - _warnings (builtin module)
-imported by: - importlib._bootstrap_external - • warnings - -
- -
- -
- - _weakref (builtin module)
-imported by: - _weakrefset - • collections - • weakref - -
- -
- -
- - _weakrefset -SourceModule
-imports: - _weakref - • types - -
-
-imported by: - _py_abc - • boot.py - • threading - • weakref - -
- -
- -
- - _winapi (builtin module)
-imported by: - encodings - • ntpath - • subprocess - -
- -
- -
- - abc -SourceModule
-imports: - _abc - • _py_abc - -
-
-imported by: - _collections_abc - • boot.py - • contextlib - • dataclasses - • email._policybase - • functools - • importlib._abc - • importlib.abc - • importlib.metadata - • importlib.resources.abc - • inspect - • io - • numbers - • os - • selectors - • typing - -
- -
- -
- - app -Package
-imports: - app.units - -
-
-imported by: - app.main - • app.minwin - • app.scene - • app.tools - • app.tools.dimension - • app.units - -
- -
- -
- - app.main -InvalidSourceModule
-imports: - app - -
-
-imported by: - boot.py - -
- -
- -
- - app.minwin -SourceModule
-imports: - PySide6 - • PySide6.QtCore - • PySide6.QtWidgets - • app - • app.scene - -
-
-imported by: - boot.py - -
- -
- -
- - app.scene -SourceModule
-imports: - PySide6 - • PySide6.QtCore - • PySide6.QtGui - • PySide6.QtWidgets - • app - -
-
-imported by: - app.minwin - -
- -
- -
- - app.tools -Package
-imports: - app - -
-
-imported by: - app.tools.array - • app.tools.dimension - • app.tools.draw - -
- -
- -
- - app.tools.array -SourceModule
-imports: - PySide6 - • PySide6.QtCore - • app.tools - • dataclasses - -
-
-imported by: - boot.py - -
- -
- -
- - app.tools.dimension -SourceModule
-imports: - PySide6 - • PySide6.QtCore - • PySide6.QtGui - • PySide6.QtWidgets - • app - • app.tools - • app.units - • math - -
-
-imported by: - boot.py - -
- -
- -
- - app.tools.draw -SourceModule
-imports: - PySide6 - • PySide6.QtCore - • PySide6.QtGui - • PySide6.QtWidgets - • app.tools - -
-
-imported by: - boot.py - -
- -
- -
- - app.units -SourceModule
-imports: - app - • math - -
-
-imported by: - app - • app.tools.dimension - -
- -
- -
- - argparse -SourceModule
-imports: - copy - • gettext - • os - • re - • shutil - • sys - • textwrap - • warnings - -
-
-imported by: - ast - • calendar - • dis - • gzip - • inspect - • py_compile - • tarfile - • tokenize - • zipfile - -
- -
- -
- - array (builtin module)
-imported by: - socket - -
- -
- -
- - ast -SourceModule
-imports: - _ast - • argparse - • collections - • contextlib - • enum - • inspect - • sys - • warnings - -
-
-imported by: - inspect - • traceback - -
- -
- -
- - atexit (builtin module)
-imported by: - _pyi_rth_utils.qt - • logging - • weakref - -
- -
- -
- - base64 -SourceModule
-imports: - binascii - • getopt - • re - • struct - • sys - -
- - -
- -
- - binascii (builtin module) - -
- -
- - bisect -SourceModule
-imports: - _bisect - -
-
-imported by: - random - • statistics - -
- -
- -
- - builtins (builtin module)
-imported by: - bz2 - • codecs - • dataclasses - • enum - • gettext - • gzip - • inspect - • locale - • lzma - • operator - • reprlib - • subprocess - • tarfile - • tokenize - • warnings - -
- -
- -
- - bz2 -SourceModule
-imports: - _bz2 - • _compression - • builtins - • io - • os - -
-
-imported by: - encodings.bz2_codec - • shutil - • tarfile - • zipfile - -
- -
- -
- - calendar -SourceModule
-imports: - argparse - • datetime - • itertools - • locale - • sys - -
-
-imported by: - _strptime - • email._parseaddr - -
- -
- -
- - codecs -SourceModule
-imports: - _codecs - • builtins - • encodings - • sys - -
-
-imported by: - _pickle - • boot.py - • encodings - • encodings.ascii - • encodings.base64_codec - • encodings.big5 - • encodings.big5hkscs - • encodings.bz2_codec - • encodings.charmap - • encodings.cp037 - • encodings.cp1006 - • encodings.cp1026 - • encodings.cp1125 - • encodings.cp1140 - • encodings.cp1250 - • encodings.cp1251 - • encodings.cp1252 - • encodings.cp1253 - • encodings.cp1254 - • encodings.cp1255 - • encodings.cp1256 - • encodings.cp1257 - • encodings.cp1258 - • encodings.cp273 - • encodings.cp424 - • encodings.cp437 - • encodings.cp500 - • encodings.cp720 - • encodings.cp737 - • encodings.cp775 - • encodings.cp850 - • encodings.cp852 - • encodings.cp855 - • encodings.cp856 - • encodings.cp857 - • encodings.cp858 - • encodings.cp860 - • encodings.cp861 - • encodings.cp862 - • encodings.cp863 - • encodings.cp864 - • encodings.cp865 - • encodings.cp866 - • encodings.cp869 - • encodings.cp874 - • encodings.cp875 - • encodings.cp932 - • encodings.cp949 - • encodings.cp950 - • encodings.euc_jis_2004 - • encodings.euc_jisx0213 - • encodings.euc_jp - • encodings.euc_kr - • encodings.gb18030 - • encodings.gb2312 - • encodings.gbk - • encodings.hex_codec - • encodings.hp_roman8 - • encodings.hz - • encodings.idna - • encodings.iso2022_jp - • encodings.iso2022_jp_1 - • encodings.iso2022_jp_2 - • encodings.iso2022_jp_2004 - • encodings.iso2022_jp_3 - • encodings.iso2022_jp_ext - • encodings.iso2022_kr - • encodings.iso8859_1 - • encodings.iso8859_10 - • encodings.iso8859_11 - • encodings.iso8859_13 - • encodings.iso8859_14 - • encodings.iso8859_15 - • encodings.iso8859_16 - • encodings.iso8859_2 - • encodings.iso8859_3 - • encodings.iso8859_4 - • encodings.iso8859_5 - • encodings.iso8859_6 - • encodings.iso8859_7 - • encodings.iso8859_8 - • encodings.iso8859_9 - • encodings.johab - • encodings.koi8_r - • encodings.koi8_t - • encodings.koi8_u - • encodings.kz1048 - • encodings.latin_1 - • encodings.mac_arabic - • encodings.mac_croatian - • encodings.mac_cyrillic - • encodings.mac_farsi - • encodings.mac_greek - • encodings.mac_iceland - • encodings.mac_latin2 - • encodings.mac_roman - • encodings.mac_romanian - • encodings.mac_turkish - • encodings.mbcs - • encodings.oem - • encodings.palmos - • encodings.ptcp154 - • encodings.punycode - • encodings.quopri_codec - • encodings.raw_unicode_escape - • encodings.rot_13 - • encodings.shift_jis - • encodings.shift_jis_2004 - • encodings.shift_jisx0213 - • encodings.tis_620 - • encodings.undefined - • encodings.unicode_escape - • encodings.utf_16 - • encodings.utf_16_be - • encodings.utf_16_le - • encodings.utf_32 - • encodings.utf_32_be - • encodings.utf_32_le - • encodings.utf_7 - • encodings.utf_8 - • encodings.utf_8_sig - • encodings.uu_codec - • encodings.zlib_codec - • pickle - • tokenize - -
- -
- -
- - collections -Package
-imports: - _collections - • _collections_abc - • _weakref - • copy - • heapq - • itertools - • keyword - • operator - • reprlib - • sys - -
-
-imported by: - _pydecimal - • ast - • boot.py - • collections.abc - • contextlib - • dis - • email.feedparser - • functools - • importlib.metadata - • importlib.metadata._collections - • importlib.resources.readers - • inspect - • pprint - • selectors - • shutil - • statistics - • string - • threading - • tokenize - • typing - • urllib.parse - -
- -
- -
- - collections.abc -SourceModule
-imports: - _collections_abc - • collections - -
-
-imported by: - PySide6.QtCore - • PySide6.QtGui - • PySide6.QtNetwork - • PySide6.QtWidgets - • boot.py - • inspect - • logging - • selectors - • traceback - • tracemalloc - • typing - -
- -
- -
- - contextlib -SourceModule
-imports: - _collections_abc - • abc - • collections - • functools - • os - • sys - • types - -
- - -
- -
- - contextvars -SourceModule
-imports: - _contextvars - -
-
-imported by: - _pydecimal - -
- -
- -
- - copy -SourceModule
-imports: - 'org.python' - • copyreg - • types - • weakref - -
-
-imported by: - _sre - • argparse - • collections - • dataclasses - • email.generator - • gettext - • tarfile - • weakref - -
- -
- -
- - copyreg -SourceModule
-imports: - functools - • operator - -
-
-imported by: - _pickle - • boot.py - • copy - • pickle - • re - -
- -
- -
- - csv -SourceModule
-imports: - _csv - • io - • re - -
-
-imported by: - importlib.metadata - -
- -
- -
- - dataclasses -SourceModule
-imports: - _thread - • abc - • builtins - • copy - • functools - • inspect - • itertools - • keyword - • re - • sys - • types - -
-
-imported by: - app.tools.array - • pprint - -
- -
- -
- - datetime -SourceModule
-imports: - _datetime - • _strptime - • math - • operator - • sys - • time - -
-
-imported by: - _strptime - • boot.py - • calendar - • email.utils - -
- -
- -
- - decimal -SourceModule
-imports: - _decimal - • _pydecimal - -
-
-imported by: - fractions - • statistics - -
- -
- -
- - dis -SourceModule
-imports: - argparse - • collections - • io - • opcode - • sys - • types - -
-
-imported by: - inspect - -
- -
- - - -
- - email._encoded_words -SourceModule
-imports: - base64 - • binascii - • email - • email.errors - • functools - • re - • string - -
-
-imported by: - email._header_value_parser - • email.message - -
- -
- -
- - email._header_value_parser -SourceModule
-imports: - email - • email._encoded_words - • email.errors - • email.utils - • operator - • re - • string - • sys - • urllib - -
-
-imported by: - email - • email.headerregistry - -
- -
- -
- - email._parseaddr -SourceModule
-imports: - calendar - • email - • time - -
-
-imported by: - email.utils - -
- -
- -
- - email._policybase -SourceModule
-imports: - abc - • email - • email.charset - • email.header - • email.utils - -
-
-imported by: - email.feedparser - • email.message - • email.parser - • email.policy - -
- -
- -
- - email.base64mime -SourceModule
-imports: - base64 - • binascii - • email - -
-
-imported by: - email.charset - • email.header - -
- -
- -
- - email.charset -SourceModule
-imports: - email - • email.base64mime - • email.encoders - • email.errors - • email.quoprimime - • functools - -
-
-imported by: - email - • email._policybase - • email.contentmanager - • email.header - • email.message - • email.utils - -
- -
- -
- - email.contentmanager -SourceModule
-imports: - binascii - • email - • email.charset - • email.errors - • email.message - • email.quoprimime - -
-
-imported by: - email.policy - -
- -
- -
- - email.encoders -SourceModule
-imports: - base64 - • email - • quopri - -
-
-imported by: - email.charset - -
- -
- -
- - email.errors -SourceModule
-imports: - email - -
- - -
- -
- - email.feedparser -SourceModule
-imports: - collections - • email - • email._policybase - • email.errors - • email.message - • io - • re - -
-
-imported by: - email.parser - -
- -
- -
- - email.generator -SourceModule
-imports: - copy - • email - • email.utils - • io - • random - • re - • sys - • time - -
-
-imported by: - email.message - -
- -
- -
- - email.header -SourceModule
-imports: - binascii - • email - • email.base64mime - • email.charset - • email.errors - • email.quoprimime - • re - -
-
-imported by: - email - • email._policybase - -
- -
- -
- - email.headerregistry -SourceModule
-imports: - email - • email._header_value_parser - • email.errors - • email.utils - • types - -
-
-imported by: - email.policy - -
- -
- -
- - email.iterators -SourceModule
-imports: - email - • io - • sys - -
-
-imported by: - email.message - -
- -
- -
- - email.message -SourceModule
-imports: - binascii - • email - • email._encoded_words - • email._policybase - • email.charset - • email.errors - • email.generator - • email.iterators - • email.policy - • email.utils - • io - • quopri - • re - -
- - -
- -
- - email.parser -SourceModule
-imports: - email - • email._policybase - • email.feedparser - • io - -
-
-imported by: - email - -
- -
- -
- - email.policy -SourceModule
-imports: - email - • email._policybase - • email.contentmanager - • email.headerregistry - • email.message - • email.utils - • re - • sys - -
-
-imported by: - email.message - -
- -
- -
- - email.quoprimime -SourceModule
-imports: - email - • re - • string - -
-
-imported by: - email.charset - • email.contentmanager - • email.header - -
- -
- -
- - email.utils -SourceModule
-imports: - datetime - • email - • email._parseaddr - • email.charset - • os - • random - • re - • socket - • time - • urllib.parse - -
- - -
- -
- - encodings -Package
-imports: - _winapi - • codecs - • encodings - • encodings.aliases - • encodings.ascii - • encodings.base64_codec - • encodings.big5 - • encodings.big5hkscs - • encodings.bz2_codec - • encodings.charmap - • encodings.cp037 - • encodings.cp1006 - • encodings.cp1026 - • encodings.cp1125 - • encodings.cp1140 - • encodings.cp1250 - • encodings.cp1251 - • encodings.cp1252 - • encodings.cp1253 - • encodings.cp1254 - • encodings.cp1255 - • encodings.cp1256 - • encodings.cp1257 - • encodings.cp1258 - • encodings.cp273 - • encodings.cp424 - • encodings.cp437 - • encodings.cp500 - • encodings.cp720 - • encodings.cp737 - • encodings.cp775 - • encodings.cp850 - • encodings.cp852 - • encodings.cp855 - • encodings.cp856 - • encodings.cp857 - • encodings.cp858 - • encodings.cp860 - • encodings.cp861 - • encodings.cp862 - • encodings.cp863 - • encodings.cp864 - • encodings.cp865 - • encodings.cp866 - • encodings.cp869 - • encodings.cp874 - • encodings.cp875 - • encodings.cp932 - • encodings.cp949 - • encodings.cp950 - • encodings.euc_jis_2004 - • encodings.euc_jisx0213 - • encodings.euc_jp - • encodings.euc_kr - • encodings.gb18030 - • encodings.gb2312 - • encodings.gbk - • encodings.hex_codec - • encodings.hp_roman8 - • encodings.hz - • encodings.idna - • encodings.iso2022_jp - • encodings.iso2022_jp_1 - • encodings.iso2022_jp_2 - • encodings.iso2022_jp_2004 - • encodings.iso2022_jp_3 - • encodings.iso2022_jp_ext - • encodings.iso2022_kr - • encodings.iso8859_1 - • encodings.iso8859_10 - • encodings.iso8859_11 - • encodings.iso8859_13 - • encodings.iso8859_14 - • encodings.iso8859_15 - • encodings.iso8859_16 - • encodings.iso8859_2 - • encodings.iso8859_3 - • encodings.iso8859_4 - • encodings.iso8859_5 - • encodings.iso8859_6 - • encodings.iso8859_7 - • encodings.iso8859_8 - • encodings.iso8859_9 - • encodings.johab - • encodings.koi8_r - • encodings.koi8_t - • encodings.koi8_u - • encodings.kz1048 - • encodings.latin_1 - • encodings.mac_arabic - • encodings.mac_croatian - • encodings.mac_cyrillic - • encodings.mac_farsi - • encodings.mac_greek - • encodings.mac_iceland - • encodings.mac_latin2 - • encodings.mac_roman - • encodings.mac_romanian - • encodings.mac_turkish - • encodings.mbcs - • encodings.oem - • encodings.palmos - • encodings.ptcp154 - • encodings.punycode - • encodings.quopri_codec - • encodings.raw_unicode_escape - • encodings.rot_13 - • encodings.shift_jis - • encodings.shift_jis_2004 - • encodings.shift_jisx0213 - • encodings.tis_620 - • encodings.undefined - • encodings.unicode_escape - • encodings.utf_16 - • encodings.utf_16_be - • encodings.utf_16_le - • encodings.utf_32 - • encodings.utf_32_be - • encodings.utf_32_le - • encodings.utf_7 - • encodings.utf_8 - • encodings.utf_8_sig - • encodings.uu_codec - • encodings.zlib_codec - • sys - -
-
-imported by: - boot.py - • codecs - • encodings - • encodings.aliases - • encodings.ascii - • encodings.base64_codec - • encodings.big5 - • encodings.big5hkscs - • encodings.bz2_codec - • encodings.charmap - • encodings.cp037 - • encodings.cp1006 - • encodings.cp1026 - • encodings.cp1125 - • encodings.cp1140 - • encodings.cp1250 - • encodings.cp1251 - • encodings.cp1252 - • encodings.cp1253 - • encodings.cp1254 - • encodings.cp1255 - • encodings.cp1256 - • encodings.cp1257 - • encodings.cp1258 - • encodings.cp273 - • encodings.cp424 - • encodings.cp437 - • encodings.cp500 - • encodings.cp720 - • encodings.cp737 - • encodings.cp775 - • encodings.cp850 - • encodings.cp852 - • encodings.cp855 - • encodings.cp856 - • encodings.cp857 - • encodings.cp858 - • encodings.cp860 - • encodings.cp861 - • encodings.cp862 - • encodings.cp863 - • encodings.cp864 - • encodings.cp865 - • encodings.cp866 - • encodings.cp869 - • encodings.cp874 - • encodings.cp875 - • encodings.cp932 - • encodings.cp949 - • encodings.cp950 - • encodings.euc_jis_2004 - • encodings.euc_jisx0213 - • encodings.euc_jp - • encodings.euc_kr - • encodings.gb18030 - • encodings.gb2312 - • encodings.gbk - • encodings.hex_codec - • encodings.hp_roman8 - • encodings.hz - • encodings.idna - • encodings.iso2022_jp - • encodings.iso2022_jp_1 - • encodings.iso2022_jp_2 - • encodings.iso2022_jp_2004 - • encodings.iso2022_jp_3 - • encodings.iso2022_jp_ext - • encodings.iso2022_kr - • encodings.iso8859_1 - • encodings.iso8859_10 - • encodings.iso8859_11 - • encodings.iso8859_13 - • encodings.iso8859_14 - • encodings.iso8859_15 - • encodings.iso8859_16 - • encodings.iso8859_2 - • encodings.iso8859_3 - • encodings.iso8859_4 - • encodings.iso8859_5 - • encodings.iso8859_6 - • encodings.iso8859_7 - • encodings.iso8859_8 - • encodings.iso8859_9 - • encodings.johab - • encodings.koi8_r - • encodings.koi8_t - • encodings.koi8_u - • encodings.kz1048 - • encodings.latin_1 - • encodings.mac_arabic - • encodings.mac_croatian - • encodings.mac_cyrillic - • encodings.mac_farsi - • encodings.mac_greek - • encodings.mac_iceland - • encodings.mac_latin2 - • encodings.mac_roman - • encodings.mac_romanian - • encodings.mac_turkish - • encodings.mbcs - • encodings.oem - • encodings.palmos - • encodings.ptcp154 - • encodings.punycode - • encodings.quopri_codec - • encodings.raw_unicode_escape - • encodings.rot_13 - • encodings.shift_jis - • encodings.shift_jis_2004 - • encodings.shift_jisx0213 - • encodings.tis_620 - • encodings.undefined - • encodings.unicode_escape - • encodings.utf_16 - • encodings.utf_16_be - • encodings.utf_16_le - • encodings.utf_32 - • encodings.utf_32_be - • encodings.utf_32_le - • encodings.utf_7 - • encodings.utf_8 - • encodings.utf_8_sig - • encodings.uu_codec - • encodings.zlib_codec - • locale - -
- -
- -
- - encodings.aliases -SourceModule
-imports: - encodings - -
-
-imported by: - boot.py - • encodings - • locale - -
- -
- -
- - encodings.ascii -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.base64_codec -SourceModule
-imports: - base64 - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.big5 -SourceModule
-imports: - _codecs_tw - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.big5hkscs -SourceModule
-imports: - _codecs_hk - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.bz2_codec -SourceModule
-imports: - bz2 - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.charmap -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp037 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp1006 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp1026 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp1125 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp1140 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp1250 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp1251 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp1252 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp1253 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp1254 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp1255 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp1256 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp1257 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp1258 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp273 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp424 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp437 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp500 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp720 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp737 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp775 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp850 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp852 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp855 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp856 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp857 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp858 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp860 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp861 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp862 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp863 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp864 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp865 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp866 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp869 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp874 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp875 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp932 -SourceModule
-imports: - _codecs_jp - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp949 -SourceModule
-imports: - _codecs_kr - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.cp950 -SourceModule
-imports: - _codecs_tw - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.euc_jis_2004 -SourceModule
-imports: - _codecs_jp - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.euc_jisx0213 -SourceModule
-imports: - _codecs_jp - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.euc_jp -SourceModule
-imports: - _codecs_jp - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.euc_kr -SourceModule
-imports: - _codecs_kr - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.gb18030 -SourceModule
-imports: - _codecs_cn - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.gb2312 -SourceModule
-imports: - _codecs_cn - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.gbk -SourceModule
-imports: - _codecs_cn - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.hex_codec -SourceModule
-imports: - binascii - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.hp_roman8 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.hz -SourceModule
-imports: - _codecs_cn - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.idna -SourceModule
-imports: - codecs - • encodings - • re - • stringprep - • unicodedata - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.iso2022_jp -SourceModule
-imports: - _codecs_iso2022 - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.iso2022_jp_1 -SourceModule
-imports: - _codecs_iso2022 - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.iso2022_jp_2 -SourceModule
-imports: - _codecs_iso2022 - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.iso2022_jp_2004 -SourceModule
-imports: - _codecs_iso2022 - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.iso2022_jp_3 -SourceModule
-imports: - _codecs_iso2022 - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.iso2022_jp_ext -SourceModule
-imports: - _codecs_iso2022 - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.iso2022_kr -SourceModule
-imports: - _codecs_iso2022 - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.iso8859_1 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.iso8859_10 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.iso8859_11 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.iso8859_13 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.iso8859_14 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.iso8859_15 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.iso8859_16 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.iso8859_2 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.iso8859_3 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.iso8859_4 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.iso8859_5 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.iso8859_6 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.iso8859_7 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.iso8859_8 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.iso8859_9 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.johab -SourceModule
-imports: - _codecs_kr - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.koi8_r -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.koi8_t -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.koi8_u -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.kz1048 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.latin_1 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.mac_arabic -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.mac_croatian -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.mac_cyrillic -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.mac_farsi -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.mac_greek -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.mac_iceland -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.mac_latin2 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.mac_roman -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.mac_romanian -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.mac_turkish -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.mbcs -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.oem -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.palmos -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.ptcp154 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.punycode -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.quopri_codec -SourceModule
-imports: - codecs - • encodings - • io - • quopri - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.raw_unicode_escape -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.rot_13 -SourceModule
-imports: - codecs - • encodings - • sys - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.shift_jis -SourceModule
-imports: - _codecs_jp - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.shift_jis_2004 -SourceModule
-imports: - _codecs_jp - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.shift_jisx0213 -SourceModule
-imports: - _codecs_jp - • _multibytecodec - • codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.tis_620 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.undefined -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.unicode_escape -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.utf_16 -SourceModule
-imports: - codecs - • encodings - • sys - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.utf_16_be -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.utf_16_le -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.utf_32 -SourceModule
-imports: - codecs - • encodings - • sys - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.utf_32_be -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.utf_32_le -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.utf_7 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.utf_8 -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.utf_8_sig -SourceModule
-imports: - codecs - • encodings - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.uu_codec -SourceModule
-imports: - binascii - • codecs - • encodings - • io - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - encodings.zlib_codec -SourceModule
-imports: - codecs - • encodings - • zlib - -
-
-imported by: - boot.py - • encodings - -
- -
- -
- - enum -SourceModule
-imports: - builtins - • functools - • operator - • sys - • types - • warnings - -
-
-imported by: - PySide6.QtCore - • PySide6.QtGui - • PySide6.QtNetwork - • PySide6.QtWidgets - • ast - • boot.py - • inspect - • py_compile - • re - • signal - • socket - -
- -
- -
- - errno (builtin module)
-imported by: - gettext - • gzip - • pathlib - • shutil - • socket - • subprocess - • tempfile - -
- -
- -
- - fcntl -MissingModule
-imported by: - subprocess - -
- -
- -
- - fnmatch -SourceModule
-imports: - functools - • os - • posixpath - • re - -
-
-imported by: - pathlib - • shutil - • tracemalloc - -
- -
- -
- - fractions -SourceModule
-imports: - decimal - • math - • numbers - • operator - • re - • sys - -
-
-imported by: - statistics - -
- -
- -
- - functools -SourceModule
-imports: - _functools - • _thread - • abc - • collections - • reprlib - • types - • typing - • weakref - -
-
-imported by: - boot.py - • contextlib - • copyreg - • dataclasses - • email._encoded_words - • email.charset - • enum - • fnmatch - • importlib.metadata - • importlib.metadata._functools - • importlib.resources._common - • importlib.resources._legacy - • importlib.util - • inspect - • ipaddress - • linecache - • locale - • operator - • pathlib - • pickle - • re - • shiboken6 - • statistics - • tempfile - • threading - • tokenize - • tracemalloc - • types - • typing - • urllib.parse - -
- -
- -
- - gc (builtin module)
-imports: - time - -
-
-imported by: - _posixsubprocess - • weakref - -
- -
- -
- - genericpath -SourceModule
-imports: - os - • stat - -
-
-imported by: - boot.py - • ntpath - • posixpath - -
- -
- -
- - getopt -SourceModule
-imports: - gettext - • os - • sys - -
-
-imported by: - base64 - • quopri - -
- -
- -
- - gettext -SourceModule
-imports: - builtins - • copy - • errno - • locale - • operator - • os - • re - • struct - • sys - • warnings - -
-
-imported by: - argparse - • getopt - -
- -
- -
- - grp -MissingModule
-imported by: - pathlib - • shutil - • subprocess - • tarfile - -
- -
- -
- - gzip -SourceModule
-imports: - _compression - • argparse - • builtins - • errno - • io - • os - • struct - • sys - • time - • warnings - • zlib - -
-
-imported by: - tarfile - -
- -
- -
- - hashlib -SourceModule
-imports: - _blake2 - • _hashlib - • _md5 - • _sha1 - • _sha256 - • _sha3 - • _sha512 - • logging - • warnings - -
-
-imported by: - random - -
- -
- -
- - heapq -SourceModule
-imports: - _heapq - -
-
-imported by: - boot.py - • collections - -
- -
- - - -
- - importlib._abc -SourceModule
-imports: - abc - • importlib - • importlib._bootstrap - • warnings - -
-
-imported by: - importlib.abc - • importlib.util - -
- -
- -
- - importlib._bootstrap -SourceModule
-imports: - _frozen_importlib_external - • importlib - -
-
-imported by: - importlib - • importlib._abc - • importlib.machinery - • importlib.util - -
- -
- -
- - importlib._bootstrap_external -SourceModule
-imports: - _imp - • _io - • _warnings - • importlib - • importlib.metadata - • importlib.readers - • marshal - • nt - • posix - • sys - • tokenize - • winreg - -
-
-imported by: - importlib - • importlib.abc - • importlib.machinery - • importlib.util - • py_compile - -
- -
- - - -
- - importlib.machinery -SourceModule -
-imported by: - importlib - • importlib.abc - • inspect - • py_compile - -
- -
- - - -
- - importlib.metadata._adapters -SourceModule
-imports: - email.message - • importlib.metadata - • importlib.metadata._text - • re - • textwrap - -
-
-imported by: - importlib.metadata - -
- -
- -
- - importlib.metadata._collections -SourceModule
-imports: - collections - • importlib.metadata - -
-
-imported by: - importlib.metadata - -
- -
- -
- - importlib.metadata._functools -SourceModule
-imports: - functools - • importlib.metadata - • types - -
-
-imported by: - importlib.metadata - • importlib.metadata._text - -
- -
- -
- - importlib.metadata._itertools -SourceModule
-imports: - importlib.metadata - • itertools - -
-
-imported by: - importlib.metadata - -
- -
- -
- - importlib.metadata._meta -SourceModule
-imports: - importlib.metadata - • typing - -
-
-imported by: - importlib.metadata - -
- -
- -
- - importlib.metadata._text -SourceModule -
-imported by: - importlib.metadata._adapters - -
- -
- -
- - importlib.readers -SourceModule
-imports: - importlib - • importlib.resources.readers - -
-
-imported by: - importlib._bootstrap_external - -
- -
- - - -
- - importlib.resources._adapters -SourceModule
-imports: - contextlib - • importlib.resources - • importlib.resources.abc - • io - -
-
-imported by: - importlib.resources._common - -
- -
- -
- - importlib.resources._common -SourceModule
-imports: - contextlib - • functools - • importlib - • importlib.resources - • importlib.resources._adapters - • importlib.resources.abc - • os - • pathlib - • tempfile - • types - • typing - -
- - -
- -
- - importlib.resources._itertools -SourceModule
-imports: - importlib.resources - • itertools - • typing - -
-
-imported by: - importlib.resources.readers - -
- -
- -
- - importlib.resources._legacy -SourceModule
-imports: - functools - • importlib.resources - • importlib.resources._common - • os - • pathlib - • types - • typing - • warnings - -
-
-imported by: - importlib.resources - -
- -
- -
- - importlib.resources.abc -SourceModule
-imports: - abc - • importlib.resources - • io - • os - • typing - -
- - -
- -
- - importlib.resources.readers -SourceModule -
-imported by: - importlib.readers - -
- -
- -
- - importlib.util -SourceModule
-imports: - _imp - • contextlib - • functools - • importlib - • importlib._abc - • importlib._bootstrap - • importlib._bootstrap_external - • sys - • threading - • types - • warnings - -
-
-imported by: - boot.py - • py_compile - • zipfile - -
- -
- -
- - inspect -SourceModule
-imports: - abc - • argparse - • ast - • builtins - • collections - • collections.abc - • dis - • enum - • functools - • importlib - • importlib.machinery - • itertools - • keyword - • linecache - • operator - • os - • re - • sys - • token - • tokenize - • types - -
-
-imported by: - PySide6 - • ast - • dataclasses - • pyi_rth_inspect.py - -
- -
- -
- - io -SourceModule
-imports: - _io - • abc - • warnings - -
-
-imported by: - _compression - • boot.py - • bz2 - • csv - • dis - • email.feedparser - • email.generator - • email.iterators - • email.message - • email.parser - • encodings.quopri_codec - • encodings.uu_codec - • gzip - • importlib.resources._adapters - • importlib.resources.abc - • logging - • lzma - • os - • pathlib - • pickle - • pprint - • quopri - • shiboken6 - • socket - • subprocess - • tarfile - • tempfile - • tokenize - • zipfile - -
- -
- -
- - ipaddress -SourceModule
-imports: - functools - • re - -
-
-imported by: - urllib.parse - -
- -
- -
- - itertools (builtin module)
-imported by: - _pydecimal - • calendar - • collections - • dataclasses - • importlib.metadata - • importlib.metadata._itertools - • importlib.resources._itertools - • inspect - • pickle - • random - • reprlib - • statistics - • threading - • tokenize - • traceback - • weakref - • zipfile - -
- -
- -
- - keyword -SourceModule
-imported by: - boot.py - • collections - • dataclasses - • inspect - • shiboken6 - -
- -
- -
- - linecache -SourceModule
-imports: - functools - • os - • sys - • tokenize - -
-
-imported by: - boot.py - • inspect - • traceback - • tracemalloc - • warnings - -
- -
- -
- - locale -SourceModule
-imports: - _collections_abc - • _locale - • builtins - • encodings - • encodings.aliases - • functools - • os - • re - • sys - • warnings - -
-
-imported by: - _pydecimal - • _strptime - • boot.py - • calendar - • gettext - • subprocess - -
- -
- -
- - logging -Package
-imports: - atexit - • collections.abc - • io - • os - • pickle - • re - • string - • sys - • threading - • time - • traceback - • types - • warnings - • weakref - -
-
-imported by: - hashlib - -
- -
- -
- - lzma -SourceModule
-imports: - _compression - • _lzma - • builtins - • io - • os - -
-
-imported by: - shutil - • tarfile - • zipfile - -
- -
- -
- - marshal (builtin module)
-imported by: - importlib._bootstrap_external - • shiboken6 - -
- -
- -
- - math (builtin module)
-imported by: - _pydecimal - • app.tools.dimension - • app.units - • datetime - • fractions - • random - • selectors - • statistics - -
- -
- -
- - msvcrt (builtin module)
-imported by: - subprocess - -
- -
- -
- - nt (builtin module)
-imported by: - importlib._bootstrap_external - • ntpath - • os - • shutil - -
- -
- -
- - ntpath -SourceModule
-imports: - _winapi - • genericpath - • nt - • os - • stat - • string - • sys - -
-
-imported by: - boot.py - • os - • os.path - • pathlib - -
- -
- -
- - numbers -SourceModule
-imports: - abc - -
-
-imported by: - _pydecimal - • fractions - • statistics - -
- -
- -
- - opcode -SourceModule
-imports: - _opcode - -
-
-imported by: - dis - -
- -
- -
- - operator -SourceModule
-imports: - _operator - • builtins - • functools - -
-
-imported by: - boot.py - • collections - • copyreg - • datetime - • email._header_value_parser - • enum - • fractions - • gettext - • importlib.metadata - • importlib.resources.readers - • inspect - • pathlib - • random - • statistics - • typing - -
- -
- -
- - org -MissingModule
-imported by: - pickle - -
- -
- -
- - os -SourceModule
-imports: - _collections_abc - • abc - • io - • nt - • ntpath - • os.path - • posix - • posixpath - • stat - • subprocess - • sys - • warnings - -
-
-imported by: - PySide6 - • PySide6.QtCore - • PySide6.QtGui - • PySide6.QtNetwork - • PySide6.QtWidgets - • _pyi_rth_utils - • _pyi_rth_utils.qt - • argparse - • boot.py - • bz2 - • contextlib - • email.utils - • fnmatch - • genericpath - • getopt - • gettext - • gzip - • importlib.metadata - • importlib.resources._common - • importlib.resources._legacy - • importlib.resources.abc - • inspect - • linecache - • locale - • logging - • lzma - • ntpath - • os.path - • pathlib - • posixpath - • py_compile - • pyi_rth_inspect.py - • pyi_rth_pyside6.py - • random - • shiboken6 - • shutil - • socket - • subprocess - • tarfile - • tempfile - • threading - • zipfile - -
- -
- -
- - os.path -AliasNode
-imports: - ntpath - • os - -
-
-imported by: - os - • py_compile - • tracemalloc - -
- -
- -
- - pathlib -SourceModule
-imports: - _collections_abc - • errno - • fnmatch - • functools - • grp - • io - • ntpath - • operator - • os - • posixpath - • pwd - • re - • stat - • sys - • urllib.parse - • warnings - -
- - -
- -
- - pickle -SourceModule
-imports: - _compat_pickle - • _pickle - • codecs - • copyreg - • functools - • io - • itertools - • org - • pprint - • re - • struct - • sys - • types - -
-
-imported by: - logging - • tracemalloc - -
- -
- -
- - posix -MissingModule
-imports: - resource - -
-
-imported by: - importlib._bootstrap_external - • os - • posixpath - • shutil - -
- -
- -
- - posixpath -SourceModule
-imports: - genericpath - • os - • posix - • pwd - • re - • stat - • sys - -
-
-imported by: - boot.py - • fnmatch - • importlib.metadata - • os - • pathlib - • zipfile - -
- -
- -
- - pprint -SourceModule
-imports: - collections - • dataclasses - • io - • re - • sys - • time - • types - -
-
-imported by: - pickle - -
- -
- -
- - pwd -MissingModule
-imported by: - pathlib - • posixpath - • shutil - • subprocess - • tarfile - -
- -
- -
- - py_compile -SourceModule
-imports: - argparse - • enum - • importlib._bootstrap_external - • importlib.machinery - • importlib.util - • os - • os.path - • sys - • traceback - -
-
-imported by: - zipfile - -
- -
- -
- - quopri -SourceModule
-imports: - binascii - • getopt - • io - • sys - -
-
-imported by: - email.encoders - • email.message - • encodings.quopri_codec - -
- -
- -
- - random -SourceModule
-imports: - _collections_abc - • _random - • _sha512 - • bisect - • hashlib - • itertools - • math - • operator - • os - • statistics - • time - • warnings - -
-
-imported by: - email.generator - • email.utils - • statistics - • tempfile - -
- -
- -
- - re -Package
-imports: - copyreg - • enum - • functools - • re - • re._compiler - • re._constants - • re._parser - • warnings - -
-
-imported by: - _pydecimal - • _sre - • _strptime - • argparse - • base64 - • boot.py - • csv - • dataclasses - • email._encoded_words - • email._header_value_parser - • email.feedparser - • email.generator - • email.header - • email.message - • email.policy - • email.quoprimime - • email.utils - • encodings.idna - • fnmatch - • fractions - • gettext - • importlib.metadata - • importlib.metadata._adapters - • importlib.metadata._text - • inspect - • ipaddress - • locale - • logging - • pathlib - • pickle - • posixpath - • pprint - • re - • re._casefix - • re._compiler - • re._constants - • re._parser - • shiboken6 - • sre_compile - • sre_constants - • sre_parse - • string - • tarfile - • textwrap - • tokenize - • typing - • urllib.parse - • warnings - -
- -
- -
- - re._casefix -SourceModule
-imports: - re - -
-
-imported by: - boot.py - • re._compiler - -
- -
- -
- - re._compiler -SourceModule
-imports: - _sre - • re - • re._casefix - • re._constants - • re._parser - • sys - -
-
-imported by: - boot.py - • re - • sre_compile - -
- -
- -
- - re._constants -SourceModule
-imports: - _sre - • re - -
-
-imported by: - boot.py - • re - • re._compiler - • re._parser - • sre_constants - -
- -
- -
- - re._parser -SourceModule
-imports: - re - • re._constants - • unicodedata - • warnings - -
-
-imported by: - boot.py - • re - • re._compiler - • sre_parse - -
- -
- -
- - reprlib -SourceModule
-imports: - _thread - • builtins - • itertools - -
-
-imported by: - boot.py - • collections - • functools - -
- -
- -
- - resource -MissingModule
-imported by: - posix - -
- -
- -
- - select C:\Users\whoba\AppData\Local\Programs\Python\Python311\DLLs\select.pyd
-imported by: - selectors - • subprocess - -
- -
- -
- - selectors -SourceModule
-imports: - abc - • collections - • collections.abc - • math - • select - • sys - -
-
-imported by: - socket - • subprocess - -
- -
- -
- - shiboken6 -Package
-imports: - base64 - • contextlib - • functools - • io - • keyword - • marshal - • os - • re - • shiboken6.Shiboken - • struct - • sys - • tempfile - • textwrap - • traceback - • types - • typing - • zipfile - -
- - -
- -
- - shiboken6.Shiboken C:\Users\whoba\AppData\Local\Programs\Python\Python311\Lib\site-packages\shiboken6\Shiboken.pyd
-imports: - __future__ - • shiboken6 - • shiboken6.Shiboken - -
- - -
- -
- - shutil -SourceModule
-imports: - bz2 - • collections - • errno - • fnmatch - • grp - • lzma - • nt - • os - • posix - • pwd - • stat - • sys - • tarfile - • zipfile - • zlib - -
-
-imported by: - argparse - • tarfile - • tempfile - • zipfile - -
- -
- -
- - signal -SourceModule
-imports: - _signal - • enum - -
-
-imported by: - subprocess - -
- -
- -
- - socket -SourceModule
-imports: - _socket - • array - • enum - • errno - • io - • os - • selectors - • sys - -
-
-imported by: - email.utils - -
- -
- -
- - sre_compile -SourceModule
-imports: - re - • re._compiler - • warnings - -
-
-imported by: - boot.py - -
- -
- -
- - sre_constants -SourceModule
-imports: - re - • re._constants - • warnings - -
-
-imported by: - boot.py - -
- -
- -
- - sre_parse -SourceModule
-imports: - re - • re._parser - • warnings - -
-
-imported by: - boot.py - -
- -
- -
- - stat -SourceModule
-imports: - _stat - -
-
-imported by: - boot.py - • genericpath - • ntpath - • os - • pathlib - • posixpath - • shutil - • tarfile - • tempfile - • zipfile - -
- -
- -
- - statistics -SourceModule
-imports: - _statistics - • bisect - • collections - • decimal - • fractions - • functools - • itertools - • math - • numbers - • operator - • random - • sys - -
-
-imported by: - random - -
- -
- -
- - string -SourceModule
-imports: - _string - • collections - • re - -
-
-imported by: - email._encoded_words - • email._header_value_parser - • email.quoprimime - • logging - • ntpath - -
- -
- -
- - stringprep -SourceModule
-imports: - unicodedata - -
-
-imported by: - encodings.idna - -
- -
- -
- - struct -SourceModule
-imports: - _struct - -
-
-imported by: - base64 - • gettext - • gzip - • pickle - • shiboken6 - • tarfile - • zipfile - -
- -
- -
- - subprocess -SourceModule
-imports: - _posixsubprocess - • _winapi - • builtins - • contextlib - • errno - • fcntl - • grp - • io - • locale - • msvcrt - • os - • pwd - • select - • selectors - • signal - • sys - • threading - • time - • types - • warnings - -
-
-imported by: - os - -
- -
- -
- - sys (builtin module)
-imported by: - PySide6 - • _collections_abc - • _compression - • _pydecimal - • _pyi_rth_utils - • argparse - • ast - • base64 - • boot.py - • calendar - • codecs - • collections - • contextlib - • dataclasses - • datetime - • dis - • email._header_value_parser - • email.generator - • email.iterators - • email.policy - • encodings - • encodings.rot_13 - • encodings.utf_16 - • encodings.utf_32 - • enum - • fractions - • getopt - • gettext - • gzip - • importlib - • importlib._bootstrap_external - • importlib.metadata - • importlib.util - • inspect - • linecache - • locale - • logging - • ntpath - • os - • pathlib - • pickle - • posixpath - • pprint - • py_compile - • pyi_rth_inspect.py - • pyi_rth_pyside6.py - • quopri - • re._compiler - • selectors - • shiboken6 - • shutil - • socket - • statistics - • subprocess - • tarfile - • tempfile - • threading - • tokenize - • traceback - • types - • typing - • urllib.parse - • warnings - • weakref - • zipfile - -
- -
- -
- - tarfile -SourceModule
-imports: - argparse - • builtins - • bz2 - • copy - • grp - • gzip - • io - • lzma - • os - • pwd - • re - • shutil - • stat - • struct - • sys - • time - • warnings - • zlib - -
-
-imported by: - shutil - -
- -
- -
- - tempfile -SourceModule
-imports: - _thread - • errno - • functools - • io - • os - • random - • shutil - • stat - • sys - • types - • warnings - • weakref - -
-
-imported by: - importlib.resources._common - • shiboken6 - -
- -
- -
- - textwrap -SourceModule
-imports: - re - -
-
-imported by: - argparse - • importlib.metadata - • importlib.metadata._adapters - • shiboken6 - • traceback - -
- -
- -
- - threading -SourceModule
-imports: - _collections - • _thread - • _threading_local - • _weakrefset - • collections - • functools - • itertools - • os - • sys - • time - • traceback - • warnings - -
-
-imported by: - _threading_local - • importlib.util - • logging - • subprocess - • zipfile - -
- -
- -
- - time (builtin module)
-imports: - _strptime - -
-
-imported by: - _datetime - • _strptime - • datetime - • email._parseaddr - • email.generator - • email.utils - • gc - • gzip - • logging - • pprint - • random - • subprocess - • tarfile - • threading - • zipfile - -
- -
- -
- - token -SourceModule
-imported by: - inspect - • tokenize - -
- -
- -
- - tokenize -SourceModule
-imports: - _tokenize - • argparse - • builtins - • codecs - • collections - • functools - • io - • itertools - • re - • sys - • token - -
-
-imported by: - importlib._bootstrap_external - • inspect - • linecache - -
- -
- -
- - traceback -SourceModule
-imports: - ast - • collections.abc - • contextlib - • itertools - • linecache - • sys - • textwrap - • unicodedata - -
-
-imported by: - boot.py - • logging - • py_compile - • shiboken6 - • threading - • warnings - -
- -
- -
- - tracemalloc -SourceModule
-imports: - _tracemalloc - • collections.abc - • fnmatch - • functools - • linecache - • os.path - • pickle - -
-
-imported by: - warnings - -
- -
- -
- - types -SourceModule
-imports: - _collections_abc - • functools - • sys - -
-
-imported by: - PySide6 - • _weakrefset - • boot.py - • contextlib - • copy - • dataclasses - • dis - • email.headerregistry - • enum - • functools - • importlib.metadata._functools - • importlib.resources._common - • importlib.resources._legacy - • importlib.util - • inspect - • logging - • pickle - • pprint - • shiboken6 - • subprocess - • tempfile - • typing - • urllib.parse - -
- -
- -
- - typing -SourceModule
-imports: - _typing - • abc - • collections - • collections.abc - • contextlib - • functools - • operator - • re - • sys - • types - • warnings - -
- - -
- -
- - unicodedata C:\Users\whoba\AppData\Local\Programs\Python\Python311\DLLs\unicodedata.pyd
-imported by: - encodings.idna - • re._parser - • stringprep - • traceback - • urllib.parse - -
- -
- -
- - urllib -Package
-imported by: - email._header_value_parser - • urllib.parse - -
- -
- -
- - urllib.parse -SourceModule
-imports: - collections - • functools - • ipaddress - • re - • sys - • types - • unicodedata - • urllib - • warnings - -
-
-imported by: - email.utils - • pathlib - -
- -
- -
- - warnings -SourceModule
-imports: - _warnings - • builtins - • linecache - • re - • sys - • traceback - • tracemalloc - -
-
-imported by: - argparse - • ast - • boot.py - • enum - • gettext - • gzip - • hashlib - • importlib - • importlib._abc - • importlib.abc - • importlib.metadata - • importlib.resources._legacy - • importlib.util - • io - • locale - • logging - • os - • pathlib - • random - • re - • re._parser - • sre_compile - • sre_constants - • sre_parse - • subprocess - • tarfile - • tempfile - • threading - • typing - • urllib.parse - • zipfile - -
- -
- -
- - weakref -SourceModule
-imports: - _collections_abc - • _weakref - • _weakrefset - • atexit - • copy - • gc - • itertools - • sys - -
-
-imported by: - _threading_local - • boot.py - • copy - • functools - • logging - • tempfile - -
- -
- -
- - winreg (builtin module)
-imported by: - importlib._bootstrap_external - -
- -
- -
- - zipfile -SourceModule
-imports: - argparse - • binascii - • bz2 - • contextlib - • importlib.util - • io - • itertools - • lzma - • os - • pathlib - • posixpath - • py_compile - • shutil - • stat - • struct - • sys - • threading - • time - • warnings - • zlib - -
- - -
- -
- - zlib (builtin module)
-imported by: - encodings.zlib_codec - • gzip - • shutil - • tarfile - • zipfile - -
- -
- - - diff --git a/cad_core/README.md b/cad_core/README.md new file mode 100644 index 0000000..3cf71df --- /dev/null +++ b/cad_core/README.md @@ -0,0 +1,9 @@ +# CAD Core + +Pure-Python geometry utilities and algorithms. + +Targets +- Unit-safe helpers (`units`, scaling, formatting). +- Operations: trim, extend, fillet, array/measure, snaps. +- No Qt imports or side-effects. + diff --git a/cad_core/__init__.py b/cad_core/__init__.py new file mode 100644 index 0000000..8391577 --- /dev/null +++ b/cad_core/__init__.py @@ -0,0 +1,5 @@ +"""CAD Core package (geometry and algorithms). + +Contains pure-Python geometry utilities and operations (trim, fillet, extend, snaps). +""" + diff --git a/core/__pycache__/__init__.cpython-311.pyc b/core/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 4da8ece..0000000 Binary files a/core/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/core/__pycache__/error_hook.cpython-311.pyc b/core/__pycache__/error_hook.cpython-311.pyc deleted file mode 100644 index 7db8b86..0000000 Binary files a/core/__pycache__/error_hook.cpython-311.pyc and /dev/null differ diff --git a/db/loader.py b/db/loader.py new file mode 100644 index 0000000..83712db --- /dev/null +++ b/db/loader.py @@ -0,0 +1,120 @@ +import os, sqlite3, json +from pathlib import Path + +DB_DEFAULT = os.path.join(os.path.expanduser('~'), 'AutoFire', 'catalog.db') + +def connect(db_path: str = None): + path = db_path or DB_DEFAULT + Path(os.path.dirname(path)).mkdir(parents=True, exist_ok=True) + con = sqlite3.connect(path) + con.row_factory = sqlite3.Row + return con + +def ensure_schema(con: sqlite3.Connection): + cur = con.cursor() + cur.executescript( + """ + CREATE TABLE IF NOT EXISTS manufacturers( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT UNIQUE NOT NULL + ); + CREATE TABLE IF NOT EXISTS device_types( + id INTEGER PRIMARY KEY AUTOINCREMENT, + code TEXT UNIQUE NOT NULL, + description TEXT + ); + CREATE TABLE IF NOT EXISTS devices( + id INTEGER PRIMARY KEY AUTOINCREMENT, + manufacturer_id INTEGER, + type_id INTEGER, + model TEXT, + name TEXT, + symbol TEXT, + properties_json TEXT, + FOREIGN KEY(manufacturer_id) REFERENCES manufacturers(id), + FOREIGN KEY(type_id) REFERENCES device_types(id) + ); + CREATE TABLE IF NOT EXISTS strobe_candela( + candela INTEGER PRIMARY KEY, + radius_ft REAL NOT NULL + ); + CREATE TABLE IF NOT EXISTS smoke_spacing( + ceiling_height_ft REAL, + spacing_ft REAL, + PRIMARY KEY (ceiling_height_ft) + ); + """ + ) + con.commit() + +def _id_for(cur, table, key, value): + cur.execute(f"SELECT id FROM {table} WHERE {key}=?", (value,)) + row = cur.fetchone() + if row: + return row['id'] + cur.execute(f"INSERT INTO {table}({key}) VALUES(?)", (value,)) + return cur.lastrowid + +def seed_demo(con: sqlite3.Connection): + cur = con.cursor() + cur.execute("SELECT COUNT(*) AS c FROM devices") + if cur.fetchone()['c'] > 0: + return + types = { + 'Detector': 'Smokes/Heat', + 'Notification': 'Strobes/HornStrobes/Speakers', + 'Initiating': 'Pulls/Manual', + } + for code, desc in types.items(): + _id_for(cur, 'device_types', 'code', code) + mfr_id = _id_for(cur, 'manufacturers', 'name', '(Any)') + def add(dev): + t_id = _id_for(cur, 'device_types', 'code', dev['type']) + cur.execute( + "INSERT INTO devices(manufacturer_id,type_id,model,name,symbol,properties_json) VALUES(?,?,?,?,?,?)", + (mfr_id, t_id, dev.get('part_number',''), dev['name'], dev['symbol'], json.dumps(dev.get('props',{}))) + ) + demo = [ + {"name":"Smoke Detector", "symbol":"SD", "type":"Detector", "part_number":"GEN-SD"}, + {"name":"Heat Detector", "symbol":"HD", "type":"Detector", "part_number":"GEN-HD"}, + {"name":"Strobe", "symbol":"S", "type":"Notification", "part_number":"GEN-S", + "props":{"candelas":[15,30,75,95,110,135,185]}}, + {"name":"Horn Strobe", "symbol":"HS", "type":"Notification", "part_number":"GEN-HS", + "props":{"candelas":[15,30,75,95,110,135,185]}}, + {"name":"Speaker", "symbol":"SPK","type":"Notification", "part_number":"GEN-SPK"}, + {"name":"Pull Station", "symbol":"PS", "type":"Initiating", "part_number":"GEN-PS"}, + ] + for d in demo: + add(d) + # seed candela mapping (rough placeholders) + cur.executemany("INSERT OR IGNORE INTO strobe_candela(candela,radius_ft) VALUES(?,?)", + [(15,15.0),(30,20.0),(75,30.0),(95,35.0),(110,38.0),(135,43.0),(185,50.0)]) + # seed smoke spacing (placeholder: single height) + cur.execute("INSERT OR IGNORE INTO smoke_spacing(ceiling_height_ft, spacing_ft) VALUES(?,?)", (10.0, 30.0)) + con.commit() + +def fetch_devices(con: sqlite3.Connection): + cur = con.cursor() + cur.execute( + """ + SELECT d.name, d.symbol, dt.code AS type, m.name AS manufacturer, d.model AS part_number + FROM devices d + LEFT JOIN manufacturers m ON m.id=d.manufacturer_id + LEFT JOIN device_types dt ON dt.id=d.type_id + ORDER BY d.name + """ + ) + return [dict(row) for row in cur.fetchall()] + +def strobe_radius_for_candela(con: sqlite3.Connection, cand: int) -> float | None: + cur = con.cursor(); cur.execute("SELECT radius_ft FROM strobe_candela WHERE candela=?", (int(cand),)) + r = cur.fetchone() + return float(r['radius_ft']) if r else None + +def list_manufacturers(con: sqlite3.Connection): + cur = con.cursor(); cur.execute("SELECT name FROM manufacturers ORDER BY name") + return ['(Any)'] + [r['name'] for r in cur.fetchall()] + +def list_types(con: sqlite3.Connection): + cur = con.cursor(); cur.execute("SELECT code FROM device_types ORDER BY code") + return ['(Any)'] + [r['code'] for r in cur.fetchall()] diff --git a/dist/AutoFire_20250909_200404/AutoFire/AutoFire.exe b/dist/AutoFire_20250909_200404/AutoFire/AutoFire.exe deleted file mode 100644 index 3ef2f24..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/AutoFire.exe and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/MSVCP140.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/MSVCP140.dll deleted file mode 100644 index b76c44d..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/MSVCP140.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/MSVCP140_1.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/MSVCP140_1.dll deleted file mode 100644 index 15727b9..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/MSVCP140_1.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/MSVCP140_2.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/MSVCP140_2.dll deleted file mode 100644 index b1bf14c..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/MSVCP140_2.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6Core.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6Core.dll deleted file mode 100644 index 98ab093..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6Core.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6Gui.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6Gui.dll deleted file mode 100644 index c3ffc67..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6Gui.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6Network.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6Network.dll deleted file mode 100644 index 1e03980..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6Network.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6OpenGL.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6OpenGL.dll deleted file mode 100644 index c93833f..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6OpenGL.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6Pdf.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6Pdf.dll deleted file mode 100644 index d1d7b74..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6Pdf.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6Qml.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6Qml.dll deleted file mode 100644 index 5c5421f..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6Qml.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6QmlMeta.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6QmlMeta.dll deleted file mode 100644 index 1e41a7d..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6QmlMeta.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6QmlModels.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6QmlModels.dll deleted file mode 100644 index e65246d..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6QmlModels.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6QmlWorkerScript.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6QmlWorkerScript.dll deleted file mode 100644 index 1f8c768..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6QmlWorkerScript.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6Quick.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6Quick.dll deleted file mode 100644 index aa59ac3..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6Quick.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6Svg.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6Svg.dll deleted file mode 100644 index e74bbd8..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6Svg.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6VirtualKeyboard.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6VirtualKeyboard.dll deleted file mode 100644 index c887f19..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6VirtualKeyboard.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6Widgets.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6Widgets.dll deleted file mode 100644 index 956fd15..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/Qt6Widgets.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/QtCore.pyd b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/QtCore.pyd deleted file mode 100644 index 27cbe2d..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/QtCore.pyd and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/QtGui.pyd b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/QtGui.pyd deleted file mode 100644 index 5c219f4..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/QtGui.pyd and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/QtNetwork.pyd b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/QtNetwork.pyd deleted file mode 100644 index 034875c..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/QtNetwork.pyd and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/QtWidgets.pyd b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/QtWidgets.pyd deleted file mode 100644 index 02aa909..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/QtWidgets.pyd and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/VCRUNTIME140.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/VCRUNTIME140.dll deleted file mode 100644 index 48e7800..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/VCRUNTIME140.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/VCRUNTIME140_1.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/VCRUNTIME140_1.dll deleted file mode 100644 index d9c5e27..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/VCRUNTIME140_1.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/opengl32sw.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/opengl32sw.dll deleted file mode 100644 index 320db38..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/opengl32sw.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/generic/qtuiotouchplugin.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/generic/qtuiotouchplugin.dll deleted file mode 100644 index 16b651d..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/generic/qtuiotouchplugin.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/iconengines/qsvgicon.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/iconengines/qsvgicon.dll deleted file mode 100644 index 545f25e..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/iconengines/qsvgicon.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qgif.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qgif.dll deleted file mode 100644 index eaced7d..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qgif.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qicns.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qicns.dll deleted file mode 100644 index ed9226b..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qicns.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qico.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qico.dll deleted file mode 100644 index c971ede..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qico.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qjpeg.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qjpeg.dll deleted file mode 100644 index c82a03a..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qjpeg.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qpdf.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qpdf.dll deleted file mode 100644 index aa631a0..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qpdf.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qsvg.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qsvg.dll deleted file mode 100644 index e0c2a37..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qsvg.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qtga.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qtga.dll deleted file mode 100644 index 17036ca..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qtga.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qtiff.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qtiff.dll deleted file mode 100644 index c1d404f..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qtiff.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qwbmp.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qwbmp.dll deleted file mode 100644 index ddc7f16..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qwbmp.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qwebp.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qwebp.dll deleted file mode 100644 index e7ef7a1..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/imageformats/qwebp.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/networkinformation/qnetworklistmanager.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/networkinformation/qnetworklistmanager.dll deleted file mode 100644 index 26ec740..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/networkinformation/qnetworklistmanager.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/platforminputcontexts/qtvirtualkeyboardplugin.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/platforminputcontexts/qtvirtualkeyboardplugin.dll deleted file mode 100644 index 647d9a5..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/platforminputcontexts/qtvirtualkeyboardplugin.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/platforms/qdirect2d.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/platforms/qdirect2d.dll deleted file mode 100644 index 85543df..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/platforms/qdirect2d.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/platforms/qminimal.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/platforms/qminimal.dll deleted file mode 100644 index 57e7fba..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/platforms/qminimal.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/platforms/qoffscreen.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/platforms/qoffscreen.dll deleted file mode 100644 index cb596e5..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/platforms/qoffscreen.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/platforms/qwindows.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/platforms/qwindows.dll deleted file mode 100644 index 60ff91c..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/platforms/qwindows.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/styles/qmodernwindowsstyle.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/styles/qmodernwindowsstyle.dll deleted file mode 100644 index 4b5654c..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/styles/qmodernwindowsstyle.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/tls/qcertonlybackend.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/tls/qcertonlybackend.dll deleted file mode 100644 index c27864c..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/tls/qcertonlybackend.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/tls/qopensslbackend.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/tls/qopensslbackend.dll deleted file mode 100644 index 3ad31c9..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/tls/qopensslbackend.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/tls/qschannelbackend.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/tls/qschannelbackend.dll deleted file mode 100644 index 5d74834..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/plugins/tls/qschannelbackend.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/pyside6.abi3.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/pyside6.abi3.dll deleted file mode 100644 index ad527c6..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/pyside6.abi3.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_ar.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_ar.qm deleted file mode 100644 index ddce1e8..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_ar.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_bg.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_bg.qm deleted file mode 100644 index 3b5c3ad..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_bg.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_ca.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_ca.qm deleted file mode 100644 index 6b46339..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_ca.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_cs.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_cs.qm deleted file mode 100644 index 95be1ea..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_cs.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_da.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_da.qm deleted file mode 100644 index 3ffc148..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_da.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_de.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_de.qm deleted file mode 100644 index dec7e14..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_de.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_en.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_en.qm deleted file mode 100644 index 937ea3e..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_en.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_es.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_es.qm deleted file mode 100644 index 7ea8766..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_es.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_fa.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_fa.qm deleted file mode 100644 index b964c32..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_fa.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_fi.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_fi.qm deleted file mode 100644 index a4cb291..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_fi.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_fr.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_fr.qm deleted file mode 100644 index 7d74c4a..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_fr.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_gd.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_gd.qm deleted file mode 100644 index 7b4d040..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_gd.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_gl.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_gl.qm deleted file mode 100644 index 5255734..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_gl.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_he.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_he.qm deleted file mode 100644 index c9d3107..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_he.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_ar.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_ar.qm deleted file mode 100644 index aa92f02..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_ar.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_bg.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_bg.qm deleted file mode 100644 index c65d260..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_bg.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_ca.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_ca.qm deleted file mode 100644 index 43fd055..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_ca.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_cs.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_cs.qm deleted file mode 100644 index fd50d84..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_cs.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_da.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_da.qm deleted file mode 100644 index 2c26d75..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_da.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_de.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_de.qm deleted file mode 100644 index a6b85a0..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_de.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_en.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_en.qm deleted file mode 100644 index 937ea3e..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_en.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_es.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_es.qm deleted file mode 100644 index 94e3967..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_es.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_fr.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_fr.qm deleted file mode 100644 index 4703e91..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_fr.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_gl.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_gl.qm deleted file mode 100644 index aef1ab6..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_gl.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_hr.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_hr.qm deleted file mode 100644 index 2151a78..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_hr.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_hu.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_hu.qm deleted file mode 100644 index 6c4db44..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_hu.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_it.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_it.qm deleted file mode 100644 index e3bc252..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_it.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_ja.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_ja.qm deleted file mode 100644 index e64507a..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_ja.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_ka.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_ka.qm deleted file mode 100644 index ec0ad83..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_ka.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_ko.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_ko.qm deleted file mode 100644 index f6b1d13..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_ko.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_nl.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_nl.qm deleted file mode 100644 index eb22989..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_nl.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_nn.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_nn.qm deleted file mode 100644 index aa47765..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_nn.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_pl.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_pl.qm deleted file mode 100644 index c2b82b2..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_pl.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_pt_BR.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_pt_BR.qm deleted file mode 100644 index 21b5d02..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_pt_BR.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_ru.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_ru.qm deleted file mode 100644 index 2a7d88b..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_ru.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_sk.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_sk.qm deleted file mode 100644 index 8a4a447..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_sk.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_sl.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_sl.qm deleted file mode 100644 index fd122a6..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_sl.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_sv.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_sv.qm deleted file mode 100644 index 834bdf7..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_sv.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_tr.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_tr.qm deleted file mode 100644 index 52178a8..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_tr.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_uk.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_uk.qm deleted file mode 100644 index 192d28d..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_uk.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_zh_CN.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_zh_CN.qm deleted file mode 100644 index 2eb396f..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_zh_CN.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_zh_TW.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_zh_TW.qm deleted file mode 100644 index 0f41b44..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_help_zh_TW.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_hr.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_hr.qm deleted file mode 100644 index 0a1f8cd..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_hr.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_hu.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_hu.qm deleted file mode 100644 index c6908fc..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_hu.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_it.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_it.qm deleted file mode 100644 index 9cfb64c..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_it.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_ja.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_ja.qm deleted file mode 100644 index cd4aea4..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_ja.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_ka.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_ka.qm deleted file mode 100644 index ec430b0..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_ka.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_ko.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_ko.qm deleted file mode 100644 index b8528c9..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_ko.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_lg.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_lg.qm deleted file mode 100644 index 3e7e410..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_lg.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_lt.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_lt.qm deleted file mode 100644 index e9c36fe..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_lt.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_lv.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_lv.qm deleted file mode 100644 index 6c1126a..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_lv.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_nl.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_nl.qm deleted file mode 100644 index 936ca0d..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_nl.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_nn.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_nn.qm deleted file mode 100644 index 58c5ca1..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_nn.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_pl.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_pl.qm deleted file mode 100644 index 19d6c0f..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_pl.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_pt_BR.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_pt_BR.qm deleted file mode 100644 index fe8dc29..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_pt_BR.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_pt_PT.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_pt_PT.qm deleted file mode 100644 index 03353ea..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_pt_PT.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_ru.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_ru.qm deleted file mode 100644 index 3268b91..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_ru.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_sk.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_sk.qm deleted file mode 100644 index a9b0035..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_sk.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_sl.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_sl.qm deleted file mode 100644 index bc2073b..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_sl.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_sv.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_sv.qm deleted file mode 100644 index f8c9010..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_sv.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_tr.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_tr.qm deleted file mode 100644 index 4163108..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_tr.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_uk.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_uk.qm deleted file mode 100644 index 42abff3..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_uk.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_zh_CN.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_zh_CN.qm deleted file mode 100644 index f35616c..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_zh_CN.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_zh_TW.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_zh_TW.qm deleted file mode 100644 index ea03c3d..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qt_zh_TW.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_ar.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_ar.qm deleted file mode 100644 index 32861b8..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_ar.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_bg.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_bg.qm deleted file mode 100644 index faeb167..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_bg.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_ca.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_ca.qm deleted file mode 100644 index 4e362dc..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_ca.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_cs.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_cs.qm deleted file mode 100644 index 459ef26..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_cs.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_da.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_da.qm deleted file mode 100644 index 4ede24b..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_da.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_de.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_de.qm deleted file mode 100644 index 20d7fd2..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_de.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_en.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_en.qm deleted file mode 100644 index 937ea3e..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_en.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_es.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_es.qm deleted file mode 100644 index 1a13157..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_es.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_fa.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_fa.qm deleted file mode 100644 index aadc0c1..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_fa.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_fi.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_fi.qm deleted file mode 100644 index 934aecd..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_fi.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_fr.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_fr.qm deleted file mode 100644 index 19f0ba5..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_fr.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_gd.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_gd.qm deleted file mode 100644 index 3fe3841..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_gd.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_he.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_he.qm deleted file mode 100644 index 95ed0c7..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_he.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_hr.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_hr.qm deleted file mode 100644 index 4ed06fb..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_hr.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_hu.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_hu.qm deleted file mode 100644 index 291bb89..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_hu.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_it.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_it.qm deleted file mode 100644 index a4175b5..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_it.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_ja.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_ja.qm deleted file mode 100644 index acd2f03..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_ja.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_ka.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_ka.qm deleted file mode 100644 index 2756e92..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_ka.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_ko.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_ko.qm deleted file mode 100644 index 20e4661..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_ko.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_lg.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_lg.qm deleted file mode 100644 index f0a5e71..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_lg.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_lv.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_lv.qm deleted file mode 100644 index f88a761..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_lv.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_nl.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_nl.qm deleted file mode 100644 index de4e74a..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_nl.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_nn.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_nn.qm deleted file mode 100644 index 506ec45..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_nn.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_pl.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_pl.qm deleted file mode 100644 index 3c4e03b..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_pl.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_pt_BR.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_pt_BR.qm deleted file mode 100644 index 6fabd0e..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_pt_BR.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_ru.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_ru.qm deleted file mode 100644 index c1a2286..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_ru.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_sk.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_sk.qm deleted file mode 100644 index 55a377e..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_sk.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_sv.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_sv.qm deleted file mode 100644 index f86d8d0..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_sv.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_tr.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_tr.qm deleted file mode 100644 index efed395..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_tr.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_uk.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_uk.qm deleted file mode 100644 index 21a3038..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_uk.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_zh_CN.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_zh_CN.qm deleted file mode 100644 index 6591a69..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_zh_CN.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_zh_TW.qm b/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_zh_TW.qm deleted file mode 100644 index f32a72f..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/PySide6/translations/qtbase_zh_TW.qm and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/VCRUNTIME140.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/VCRUNTIME140.dll deleted file mode 100644 index a9ed5c4..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/VCRUNTIME140.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/VCRUNTIME140_1.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/VCRUNTIME140_1.dll deleted file mode 100644 index cb34ab6..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/VCRUNTIME140_1.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/_bz2.pyd b/dist/AutoFire_20250909_200404/AutoFire/_internal/_bz2.pyd deleted file mode 100644 index 1ea3068..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/_bz2.pyd and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/_decimal.pyd b/dist/AutoFire_20250909_200404/AutoFire/_internal/_decimal.pyd deleted file mode 100644 index 87d5a98..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/_decimal.pyd and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/_hashlib.pyd b/dist/AutoFire_20250909_200404/AutoFire/_internal/_hashlib.pyd deleted file mode 100644 index 3a0b447..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/_hashlib.pyd and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/_lzma.pyd b/dist/AutoFire_20250909_200404/AutoFire/_internal/_lzma.pyd deleted file mode 100644 index ac25d2a..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/_lzma.pyd and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/_socket.pyd b/dist/AutoFire_20250909_200404/AutoFire/_internal/_socket.pyd deleted file mode 100644 index fcf2c36..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/_socket.pyd and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/README.txt b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/README.txt deleted file mode 100644 index c422094..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/README.txt +++ /dev/null @@ -1 +0,0 @@ -AutoFire 0.4.2 Enhanced - placeholder to reconstruct archive if missing \ No newline at end of file diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__init__.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__init__.py deleted file mode 100644 index c5f84af..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# AutoFire modular package diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__pycache__/__init__.cpython-311.pyc b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index ecc2a26..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__pycache__/assistant.cpython-311.pyc b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__pycache__/assistant.cpython-311.pyc deleted file mode 100644 index fa40fd1..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__pycache__/assistant.cpython-311.pyc and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__pycache__/catalog.cpython-311.pyc b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__pycache__/catalog.cpython-311.pyc deleted file mode 100644 index e994b61..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__pycache__/catalog.cpython-311.pyc and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__pycache__/coverage.cpython-311.pyc b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__pycache__/coverage.cpython-311.pyc deleted file mode 100644 index 454f268..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__pycache__/coverage.cpython-311.pyc and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__pycache__/device.cpython-311.pyc b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__pycache__/device.cpython-311.pyc deleted file mode 100644 index 0f77b8b..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__pycache__/device.cpython-311.pyc and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__pycache__/main.cpython-311.pyc b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__pycache__/main.cpython-311.pyc deleted file mode 100644 index d8d424a..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__pycache__/main.cpython-311.pyc and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__pycache__/scene.cpython-311.pyc b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__pycache__/scene.cpython-311.pyc deleted file mode 100644 index 4f7aa1b..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__pycache__/scene.cpython-311.pyc and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__pycache__/wiring.cpython-311.pyc b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__pycache__/wiring.cpython-311.pyc deleted file mode 100644 index 870fc2e..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/__pycache__/wiring.cpython-311.pyc and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/ai_scaffold.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/ai_scaffold.py deleted file mode 100644 index 345bad8..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/ai_scaffold.py +++ /dev/null @@ -1,41 +0,0 @@ - -from PySide6 import QtCore, QtGui, QtWidgets - -class AssistantDock(QtWidgets.QDockWidget): - def __init__(self, parent=None): - super().__init__("Assistant (stub)", parent) - w = QtWidgets.QWidget(self) - self.setWidget(w) - layout = QtWidgets.QVBoxLayout(w) - - self.txt_history = QtWidgets.QTextEdit(self); self.txt_history.setReadOnly(True) - self.txt_prompt = QtWidgets.QPlainTextEdit(self); self.txt_prompt.setPlaceholderText("Ask a question about this drawing… (offline stub)") - btns = QtWidgets.QHBoxLayout() - self.btn_respond = QtWidgets.QPushButton("Respond (Stub)") - self.btn_clear = QtWidgets.QPushButton("Clear") - btns.addWidget(self.btn_respond); btns.addWidget(self.btn_clear); btns.addStretch(1) - - layout.addWidget(self.txt_history) - layout.addWidget(self.txt_prompt, 1) - layout.addLayout(btns) - - self.btn_respond.clicked.connect(self._respond) - self.btn_clear.clicked.connect(lambda: (self.txt_history.clear(), self.txt_prompt.clear())) - - def _respond(self): - q = self.txt_prompt.toPlainText().strip() - if not q: - QtWidgets.QMessageBox.information(self, "Assistant", "Type a prompt first.") - return - # Offline canned response. Later, can route to a local or remote model. - reply = ( - "Assistant (stub): I can't call external AI from here yet.\n" - "But I can: \n" - "• summarize counts (BOM),\n" - "• list selected items,\n" - "• show keyboard shortcuts.\n" - "Future: connect to a local service for AI drafting/checks.\n" - ) - self.txt_history.append(f"You: {QtGui.QTextDocument().toHtmlEscaped(q)}") - self.txt_history.append(reply.replace("\n", "
")) - self.txt_prompt.clear() diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/assistant.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/assistant.py deleted file mode 100644 index 43be234..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/assistant.py +++ /dev/null @@ -1,39 +0,0 @@ -from PySide6 import QtCore, QtWidgets - -class AssistantDock(QtWidgets.QDockWidget): - """A lightweight in-app assistant scaffold (no network calls). - - Left: simple prompt box + 'Suggest Layout' stub - - Right: log view where future AI outputs could appear - """ - def __init__(self, parent=None): - super().__init__("Assistant (beta)", parent) - self.setObjectName("AssistantDock") - w = QtWidgets.QWidget(); self.setWidget(w) - lay = QtWidgets.QVBoxLayout(w) - - # Input row - self.input = QtWidgets.QLineEdit() - self.input.setPlaceholderText("Ask: e.g., 'Place detectors along corridor at 30 ft spacing'") - self.btn_suggest = QtWidgets.QPushButton("Suggest Layout") - row = QtWidgets.QHBoxLayout() - row.addWidget(self.input); row.addWidget(self.btn_suggest) - lay.addLayout(row) - - # Log/output - self.log = QtWidgets.QTextEdit(); self.log.setReadOnly(True) - self.log.setPlaceholderText("Assistant output will appear here. (Stub — no external calls)") - lay.addWidget(self.log) - - # Wire up stub behavior - self.btn_suggest.clicked.connect(self._on_suggest) - self.input.returnPressed.connect(self._on_suggest) - - def _on_suggest(self): - q = self.input.text().strip() - if not q: - q = "(no prompt)" - # Just echo for now; real logic will be added later - self.log.append(f"You: {q}") - self.log.append("Assistant (stub): I would create a grid/line array based on your spacing and corridor length.") - self.log.append("→ Try the upcoming Array tool under Tools (soon).") - self.input.clear() diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/boot.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/boot.py deleted file mode 100644 index 752818d..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/boot.py +++ /dev/null @@ -1,76 +0,0 @@ -# boot.py — robust loader -import os, sys, traceback, datetime, importlib - -from PySide6 import QtWidgets - -def _log_startup_error(text: str) -> str: - base = os.path.join(os.path.expanduser("~"), "AutoFire", "logs") - os.makedirs(base, exist_ok=True) - path = os.path.join(base, f"startup_error_{datetime.datetime.now():%Y%m%d_%H%M%S}.log") - try: - with open(path, "w", encoding="utf-8") as f: - f.write(text) - except Exception: - pass - return path - -def _load_app_main(): - # 1) normal import - try: - return importlib.import_module("app.main") - except Exception: - pass - - # 2) file-based import from likely locations - candidates = [] - exe_dir = os.path.dirname(sys.executable) if getattr(sys, "frozen", False) else os.path.dirname(__file__) - meipass = getattr(sys, "_MEIPASS", None) - - for base in (exe_dir, meipass, os.path.dirname(__file__)): - if not base: continue - candidates += [ - os.path.join(base, "_internal", "app", "main.py"), - os.path.join(base, "app", "main.py"), - ] - - for path in candidates: - if os.path.exists(path): - try: - import importlib.util, types - spec = importlib.util.spec_from_file_location("app.main", path) - mod = importlib.util.module_from_spec(spec) # type: ignore - assert spec and spec.loader - spec.loader.exec_module(mod) # type: ignore[attr-defined] - sys.modules["app.main"] = mod - return mod - except Exception: - continue - - # give up - raise ModuleNotFoundError("app.main") - -def main(): - app = QtWidgets.QApplication.instance() or QtWidgets.QApplication([]) - try: - m = _load_app_main() - create_window = getattr(m, "create_window", None) - if callable(create_window): - win = create_window() - win.show() - app.exec() - return - - # fallback UI if create_window not present - from PySide6 import QtWidgets as _W - wf = _W.QMainWindow() - wf.setWindowTitle("Auto-Fire — Fallback UI") - lab = _W.QLabel("Fallback loaded (app.main missing create_window).") - lab.setMargin(16); wf.setCentralWidget(lab); wf.resize(900, 600); wf.show() - app.exec() - except Exception: - tb = traceback.format_exc() - p = _log_startup_error(tb) - QtWidgets.QMessageBox.critical(None, "Startup Error", f"{tb}\n\nSaved: {p}") - -if __name__ == "__main__": - main() diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/boot.py.bak_20250908_213900 b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/boot.py.bak_20250908_213900 deleted file mode 100644 index be4b994..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/boot.py.bak_20250908_213900 +++ /dev/null @@ -1,32 +0,0 @@ - -import sys, traceback, os, datetime -from PySide6 import QtWidgets - -def main(): - app = QtWidgets.QApplication(sys.argv) - app.setStyle("Fusion") - try: - from app.main import create_window - win = create_window() - win.show() - sys.exit(app.exec()) - except Exception as ex: - msg = "Startup error:\\n\\n" + "".join(traceback.format_exception(ex)).replace("\\n\\n", "\\n") - w = QtWidgets.QWidget() - w.setWindowTitle("Auto-Fire — Startup Error") - lay = QtWidgets.QVBoxLayout(w) - te = QtWidgets.QPlainTextEdit(readOnly=True); te.setPlainText(msg); lay.addWidget(te) - QtWidgets.QMessageBox.critical(w, "Startup Error", str(ex)) - w.show() - try: - base = os.path.join(os.path.expanduser("~"), "AutoFire", "logs") - os.makedirs(base, exist_ok=True) - ts = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") - with open(os.path.join(base, f"startup_error_{ts}.log"), "w", encoding="utf-8") as f: - f.write(msg) - except Exception: - pass - app.exec() - -if __name__ == "__main__": - main() diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/catalog.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/catalog.py deleted file mode 100644 index d282d30..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/catalog.py +++ /dev/null @@ -1,43 +0,0 @@ - -# app/catalog.py -# Guarantees a basic palette if no external catalog is present. - -DEFAULTS = [ - {"symbol":"GEN", "name":"Generic Device", "manufacturer":"(Generic)", "part_number":"", "type":"Misc"}, - {"symbol":"SD", "name":"Smoke Detector", "manufacturer":"(Generic)", "part_number":"SD-001", "type":"Detector"}, - {"symbol":"HD", "name":"Heat Detector", "manufacturer":"(Generic)", "part_number":"HD-001", "type":"Detector"}, - {"symbol":"ST", "name":"Strobe", "manufacturer":"(Generic)", "part_number":"ST-015", "type":"Notification"}, - {"symbol":"SP", "name":"Speaker", "manufacturer":"(Generic)", "part_number":"SP-015", "type":"Notification"}, -] - -# If you later add a JSON/CSV loader, return those; otherwise return DEFAULTS. -def load_catalog(path: str | None = None): - try: - if path: - import json, os - if os.path.exists(path): - with open(path, "r", encoding="utf-8") as f: - data = json.load(f) - if isinstance(data, list) and data: - return data - except Exception: - pass - return list(DEFAULTS) - -def list_manufacturers(devs): - m = ["(Any)"] - seen = set() - for d in devs: - mf = d.get("manufacturer","").strip() or "(Generic)" - if mf not in seen: - seen.add(mf); m.append(mf) - return m - -def list_types(devs): - t = ["(Any)"] - seen = set() - for d in devs: - ty = d.get("type","").strip() or "Misc" - if ty not in seen: - seen.add(ty); t.append(ty) - return t diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/coverage.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/coverage.py deleted file mode 100644 index 2d70262..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/coverage.py +++ /dev/null @@ -1,52 +0,0 @@ -from PySide6 import QtGui, QtWidgets, QtCore -from PySide6.QtCore import QPointF, QRectF -from PySide6.QtGui import QPen, QBrush, QPainterPath - -try: - # For type hints only (avoid hard import cycles) - from .device import DeviceItem # noqa: F401 -except Exception: - pass - -def rebuild_overlay(devices_group: QtWidgets.QGraphicsItemGroup, - overlay_group: QtWidgets.QGraphicsItemGroup, - size: float = 120.0, - pen: QtGui.QPen | None = None, - brush: QtGui.QBrush | None = None) -> None: - """Rebuilds simple coverage glyphs (square with inner circle) centered on each device. - - size: outer square width/height (scene units) - """ - # Clear previous overlay - for it in list(overlay_group.childItems()): - it.scene().removeItem(it) - - if pen is None: - pen = QtGui.QPen(QtCore.Qt.darkBlue) - pen.setCosmetic(True) - pen.setWidthF(0) - if brush is None: - brush = QtGui.QBrush(QtCore.Qt.transparent) - - half = float(size) / 2.0 - inner_r = float(size) * 0.35 # inner circle radius - - for it in devices_group.childItems(): - # Only draw for device-like items having rect()/center() - if not hasattr(it, "rect"): - continue - try: - c: QPointF = it.rect().center() - except Exception: - continue - - # Build square + circle path - path = QPainterPath() - rect = QRectF(c.x() - half, c.y() - half, size, size) - path.addRect(rect) - path.addEllipse(QRectF(c.x() - inner_r, c.y() - inner_r, inner_r*2, inner_r*2)) - - gp = QtWidgets.QGraphicsPathItem(path) - gp.setPen(pen) - gp.setBrush(brush) - gp.setZValue(79) # just beneath devices_group (which is usually 100) - gp.setParentItem(overlay_group) diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/data/iface.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/data/iface.py deleted file mode 100644 index 55e3593..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/data/iface.py +++ /dev/null @@ -1,26 +0,0 @@ -"""Database interface scaffolding. -We keep the app running without any DB by default. -Later we can implement a SQLite store or remote API. -""" -from dataclasses import dataclass -from typing import Optional, Dict, Any, List - -@dataclass -class DeviceRecord: - id: Optional[int] - name: str - symbol: str - manufacturer: str - part_number: str - type: str - attributes: Dict[str, Any] - -class CatalogStore: - """Read-only catalog interface.""" - def list_devices(self) -> List[DeviceRecord]: ... - def search(self, text: str) -> List[DeviceRecord]: ... - -class ProjectStore: - """Per-project persistence interface (devices, wires, metadata).""" - def save_snapshot(self, data: dict) -> None: ... - def load_snapshot(self) -> dict: ... diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/data/sqlite_store.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/data/sqlite_store.py deleted file mode 100644 index 5561bac..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/data/sqlite_store.py +++ /dev/null @@ -1,58 +0,0 @@ -import sqlite3, json, os -from typing import List -from .iface import DeviceRecord - -SCHEMA = """ -CREATE TABLE IF NOT EXISTS catalog ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - name TEXT, symbol TEXT, manufacturer TEXT, part_number TEXT, type TEXT, attributes TEXT -); -CREATE TABLE IF NOT EXISTS project_snapshots ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - created_at TEXT DEFAULT CURRENT_TIMESTAMP, - data TEXT -); -""" - -class SQLiteStore: - def __init__(self, path: str): - self.path = path - self._ensure() - - def _ensure(self): - os.makedirs(os.path.dirname(self.path), exist_ok=True) - with sqlite3.connect(self.path) as db: - db.executescript(SCHEMA) - - # ---- Catalog ---- - def upsert_catalog(self, items: List[DeviceRecord]): - with sqlite3.connect(self.path) as db: - for d in items: - db.execute( - "INSERT INTO catalog (name, symbol, manufacturer, part_number, type, attributes) VALUES (?,?,?,?,?,?)", - (d.name, d.symbol, d.manufacturer, d.part_number, d.type, json.dumps(d.attributes or {})) - ) - db.commit() - - def list_catalog(self) -> List[DeviceRecord]: - rows = [] - with sqlite3.connect(self.path) as db: - cur = db.execute("SELECT id, name, symbol, manufacturer, part_number, type, attributes FROM catalog ORDER BY name") - rows = cur.fetchall() - out = [] - for id_, name, symbol, manufacturer, part_number, type_, attrs in rows: - out.append(DeviceRecord(id=id_, name=name, symbol=symbol, manufacturer=manufacturer, - part_number=part_number, type=type_, attributes=json.loads(attrs or "{}"))) - return out - - # ---- Project snapshots ---- - def save_snapshot(self, data: dict): - with sqlite3.connect(self.path) as db: - db.execute("INSERT INTO project_snapshots (data) VALUES (?)", (json.dumps(data),)) - db.commit() - - def latest_snapshot(self) -> dict | None: - with sqlite3.connect(self.path) as db: - row = db.execute("SELECT data FROM project_snapshots ORDER BY id DESC LIMIT 1").fetchone() - if not row: return None - return json.loads(row[0]) diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/device.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/device.py deleted file mode 100644 index 9152fc7..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/device.py +++ /dev/null @@ -1,135 +0,0 @@ - -from PySide6 import QtCore, QtGui, QtWidgets - -class DeviceItem(QtWidgets.QGraphicsItemGroup): - def __init__(self, x: float, y: float, symbol: str, name: str, manufacturer: str = "", part_number: str = ""): - super().__init__() - self.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True) - self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True) - self.symbol = symbol - self.name = name - self.manufacturer = manufacturer - self.part_number = part_number - self.locked = False # NEW - - # Label offset (CAD-friendly) - self.label_offset = QtCore.QPointF(12, -14) - - # Base glyph - self._glyph = QtWidgets.QGraphicsEllipseItem(-6, -6, 12, 12) - pen = QtGui.QPen(Qt.black); pen.setCosmetic(True) - self._glyph.setPen(pen) - self._glyph.setBrush(QtGui.QBrush(Qt.white)) - self.addToGroup(self._glyph) - - # Label - self._label = QtWidgets.QGraphicsSimpleTextItem(self.name) - self._label.setFlag(QtWidgets.QGraphicsItem.ItemIgnoresTransformations, True) - self._label.setPos(self.label_offset) - self.addToGroup(self._label) - - # Coverage overlay - self.coverage = {"mode":"none","mount":"ceiling","radius_ft":0.0,"px_per_ft":12.0, - "speaker":{"model":"physics (20log)","db_ref":95.0,"target_db":75.0,"loss10":6.0}, - "strobe":{"candela":177.0,"target_lux":0.2}, - "computed_radius_px": 0.0} - self._cov_circle = None - self._cov_square = None # for ceiling strobe: circle inside square - self._cov_rect = None # for wall: rectangle (simplified) - - self.setPos(x, y) - - # ---------- lock / unlock ---------- - def set_locked(self, v: bool): - self.locked = bool(v) - self.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, not self.locked) - # keep selectable so context menu can unlock later - - # subtle visual hint when locked - pen = self._glyph.pen() - pen.setStyle(QtCore.Qt.SolidLine if not self.locked else QtCore.Qt.DotLine) - self._glyph.setPen(pen) - - def is_locked(self) -> bool: - return bool(self.locked) - - # ---------- labels ---------- - def set_label_text(self, text: str): - self._label.setText(text) - - def set_label_offset(self, dx: float, dy: float): - self.label_offset = QtCore.QPointF(dx, dy) - self._label.setPos(self.label_offset) - - # -------- coverage drawing ---------- - def set_coverage(self, settings: dict): - if not settings: return - self.coverage.update(settings) - self._update_coverage_items() - - def _ensure_cov_items(self): - if self._cov_circle is None: - self._cov_circle = QtWidgets.QGraphicsEllipseItem(); self._cov_circle.setParentItem(self); self._cov_circle.setZValue(-5) - pen = QtGui.QPen(QtGui.QColor(50,120,255,200)); pen.setStyle(QtCore.Qt.DashLine); pen.setCosmetic(True) - self._cov_circle.setPen(pen); self._cov_circle.setBrush(QtGui.QColor(50,120,255,60)) - if self._cov_square is None: - self._cov_square = QtWidgets.QGraphicsRectItem(); self._cov_square.setParentItem(self); self._cov_square.setZValue(-6) - pen = QtGui.QPen(QtGui.QColor(50,120,255,120)); pen.setStyle(QtCore.Qt.DotLine); pen.setCosmetic(True) - self._cov_square.setPen(pen); self._cov_square.setBrush(QtGui.QColor(50,120,255,30)) - if self._cov_rect is None: - self._cov_rect = QtWidgets.QGraphicsRectItem(); self._cov_rect.setParentItem(self); self._cov_rect.setZValue(-6) - pen = QtGui.QPen(QtGui.QColor(50,120,255,120)); pen.setStyle(QtCore.Qt.DotLine); pen.setCosmetic(True) - self._cov_rect.setPen(pen); self._cov_rect.setBrush(QtGui.QColor(50,120,255,30)) - - def _update_coverage_items(self): - mode = self.coverage.get("mode","none") - mount = self.coverage.get("mount","ceiling") - r_px = float(self.coverage.get("computed_radius_px") or 0.0) - - # Hide all first - for it in (self._cov_circle, self._cov_square, self._cov_rect): - if it: it.setVisible(False) - - if mode=="none" or r_px <= 0: - return - - self._ensure_cov_items() - # Always draw circle - self._cov_circle.setRect(-r_px, -r_px, 2*r_px, 2*r_px); self._cov_circle.setVisible(True) - - if mount=="ceiling" and mode=="strobe": - side = 2*r_px - self._cov_square.setRect(-side/2, -side/2, side, side); self._cov_square.setVisible(True) - elif mount=="wall" and mode in ("strobe","speaker"): - self._cov_rect.setRect(0, -r_px, r_px*2.0, r_px*2.0); self._cov_rect.setVisible(True) - - # -------- serialization ---------- - def to_json(self): - return { - "x": float(self.pos().x()), - "y": float(self.pos().y()), - "symbol": self.symbol, - "name": self.name, - "manufacturer": self.manufacturer, - "part_number": self.part_number, - "label_offset": [self.label_offset.x(), self.label_offset.y()], - "coverage": self.coverage, - "locked": bool(self.locked), - "z": float(self.zValue()), - } - - @staticmethod - def from_json(d: dict): - it = DeviceItem(float(d.get("x",0)), float(d.get("y",0)), - d.get("symbol","?"), d.get("name","Device"), - d.get("manufacturer",""), d.get("part_number","")) - off = d.get("label_offset") - if isinstance(off,(list,tuple)) and len(off)==2: - it.set_label_offset(float(off[0]), float(off[1])) - cov = d.get("coverage") - if cov: it.set_coverage(cov) - it.set_locked(bool(d.get("locked", False))) - if "z" in d: - try: it.setZValue(float(d.get("z", 0))) - except Exception: pass - return it diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/dialogs/__init__.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/dialogs/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/dialogs/__pycache__/__init__.cpython-311.pyc b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/dialogs/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index e9da060..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/dialogs/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/dialogs/array.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/dialogs/array.py deleted file mode 100644 index da0a84a..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/dialogs/array.py +++ /dev/null @@ -1,36 +0,0 @@ - -from PySide6 import QtWidgets -from app import units - -class ArrayDialog(QtWidgets.QDialog): - def __init__(self, parent=None, default_px_per_ft=12.0): - super().__init__(parent) - self.setWindowTitle("Place Array") - self.setModal(True); self.setMinimumWidth(360) - - self.spin_rows = QtWidgets.QSpinBox(); self.spin_rows.setRange(1, 500); self.spin_rows.setValue(3) - self.spin_cols = QtWidgets.QSpinBox(); self.spin_cols.setRange(1, 500); self.spin_cols.setValue(3) - self.spin_spacing_ft = QtWidgets.QDoubleSpinBox(); self.spin_spacing_ft.setRange(0.1, 1000); self.spin_spacing_ft.setValue(30.0); self.spin_spacing_ft.setDecimals(2) - self.spin_px_per_ft = QtWidgets.QDoubleSpinBox(); self.spin_px_per_ft.setRange(1, 2000); self.spin_px_per_ft.setValue(default_px_per_ft) - self.chk_use_cov = QtWidgets.QCheckBox("Use selected device coverage tile for spacing") - - form = QtWidgets.QFormLayout() - form.addRow("Rows", self.spin_rows) - form.addRow("Columns", self.spin_cols) - form.addRow("Spacing (ft)", self.spin_spacing_ft) - form.addRow("Pixels per foot", self.spin_px_per_ft) - form.addRow(self.chk_use_cov) - - btns = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel) - btns.accepted.connect(self.accept); btns.rejected.connect(self.reject) - - main = QtWidgets.QVBoxLayout(self) - main.addLayout(form); main.addWidget(btns) - - def get_params(self): - return { - "rows": self.spin_rows.value(), - "cols": self.spin_cols.value(), - "spacing_px": units.ft_to_px(self.spin_spacing_ft.value(), self.spin_px_per_ft.value()), - "use_coverage_tile": self.chk_use_cov.isChecked(), - } diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/dialogs/coverage.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/dialogs/coverage.py deleted file mode 100644 index 4a64a79..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/dialogs/coverage.py +++ /dev/null @@ -1,55 +0,0 @@ -from PySide6 import QtWidgets - -def _ft_in_row(ft=25, inch=0): - wrap = QtWidgets.QWidget() - row = QtWidgets.QHBoxLayout(wrap); row.setContentsMargins(0,0,0,0) - sp_ft = QtWidgets.QSpinBox(); sp_ft.setRange(0, 1000); sp_ft.setValue(int(ft)) - sp_in = QtWidgets.QSpinBox(); sp_in.setRange(0, 11); sp_in.setValue(int(inch)) - row.addWidget(sp_ft); row.addWidget(QtWidgets.QLabel("ft")); row.addSpacing(12) - row.addWidget(sp_in); row.addWidget(QtWidgets.QLabel("in")) - return wrap, sp_ft, sp_in - -class CoverageDialog(QtWidgets.QDialog): - """ - Manual coverage controls. - - Kind chooses the overlay shape: - * Detector -> circle - * Strobe ceiling -> circle + square - * Strobe wall -> rectangle - * Speaker -> circle (wall mode would be rectangle) - - Radius set in feet+inches - """ - def __init__(self, parent=None, existing=None): - super().__init__(parent) - self.setWindowTitle("Coverage") - self.setModal(True) - form = QtWidgets.QFormLayout(self) - ex = existing or {} - - self.cmb_kind = QtWidgets.QComboBox() - opts = ["Detector (circle)", "Strobe — ceiling (circle+square)", "Strobe — wall (rectangle)", "Speaker (circle)"] - self.cmb_kind.addItems(opts) - kind_map = {"detector":0, "strobe_ceiling":1, "strobe_wall":2, "speaker":3} - idx = kind_map.get(ex.get("kind","detector"), 0) - self.cmb_kind.setCurrentIndex(idx) - form.addRow("Kind:", self.cmb_kind) - - r_ft = float(ex.get("radius_ft", 25.0)) - ft = int(r_ft); inc = int(round((r_ft-ft)*12.0)) - row, self.sp_ft, self.sp_in = _ft_in_row(ft, inc) - form.addRow("Radius:", row) - - self.chk_on = QtWidgets.QCheckBox("Enable overlay") - self.chk_on.setChecked(ex.get("mode","none") != "none") - form.addRow("", self.chk_on) - - btns = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel) - btns.accepted.connect(self.accept); btns.rejected.connect(self.reject) - form.addRow(btns) - - def get_settings(self): - kidx = self.cmb_kind.currentIndex() - kind = ["detector","strobe_ceiling","strobe_wall","speaker"][kidx] - ft = self.sp_ft.value(); inc = self.sp_in.value() - enabled = self.chk_on.isChecked() - return {"kind": kind, "mode": ("none" if not enabled else "manual"), "radius_ft": float(ft + inc/12.0)} diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/dialogs/device_props.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/dialogs/device_props.py deleted file mode 100644 index 55ddab3..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/dialogs/device_props.py +++ /dev/null @@ -1,43 +0,0 @@ - -from PySide6 import QtCore, QtGui, QtWidgets - -class DevicePropsDialog(QtWidgets.QDialog): - def __init__(self, parent=None, item=None, px_per_ft=12.0): - super().__init__(parent) - self.setWindowTitle("Device Properties") - self.item = item - self.px_per_ft = float(px_per_ft) - - form = QtWidgets.QFormLayout(self) - - self.ed_name = QtWidgets.QLineEdit(item.name if item else "") - self.ed_symbol = QtWidgets.QLineEdit(item.symbol if item else "") - self.ed_mfr = QtWidgets.QLineEdit(item.manufacturer if item else "") - self.ed_part = QtWidgets.QLineEdit(item.part_number if item else "") - self.spin_off_x = QtWidgets.QDoubleSpinBox(); self.spin_off_x.setRange(-9999, 9999); self.spin_off_x.setDecimals(2) - self.spin_off_y = QtWidgets.QDoubleSpinBox(); self.spin_off_y.setRange(-9999, 9999); self.spin_off_y.setDecimals(2) - if item: - self.spin_off_x.setValue(item.label_offset.x() / self.px_per_ft * 12.0) - self.spin_off_y.setValue(item.label_offset.y() / self.px_per_ft * 12.0) - - form.addRow("Name", self.ed_name) - form.addRow("Symbol", self.ed_symbol) - form.addRow("Manufacturer", self.ed_mfr) - form.addRow("Part #", self.ed_part) - form.addRow("Label offset X (in)", self.spin_off_x) - form.addRow("Label offset Y (in)", self.spin_off_y) - - btns = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel) - btns.accepted.connect(self.accept); btns.rejected.connect(self.reject) - form.addRow(btns) - - def values(self): - dx_px = float(self.spin_off_x.value()) / 12.0 * self.px_per_ft - dy_px = float(self.spin_off_y.value()) / 12.0 * self.px_per_ft - return { - "name": self.ed_name.text().strip(), - "symbol": self.ed_symbol.text().strip(), - "manufacturer": self.ed_mfr.text().strip(), - "part_number": self.ed_part.text().strip(), - "label_offset_px": (dx_px, dy_px), - } diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/layout.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/layout.py deleted file mode 100644 index 2361014..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/layout.py +++ /dev/null @@ -1,43 +0,0 @@ - -from PySide6 import QtCore, QtGui, QtWidgets - -PAGE_SIZES = { - "Letter": (8.5, 11), - "Tabloid": (11, 17), - "A3": (11.69, 16.54), - "A2": (16.54, 23.39), - "A1": (23.39, 33.11), - "A0": (33.11, 46.81), -} - -class PageFrame(QtWidgets.QGraphicsItemGroup): - def __init__(self, px_per_ft: float, size_name="Letter", orientation="Portrait", margin_in=0.5): - super().__init__() - self._px_per_ft = float(px_per_ft) - self._size_name = size_name - self._orient = orientation - self._margin_in = float(margin_in) - self._outer = QtWidgets.QGraphicsRectItem(); self._outer.setPen(QtGui.QPen(QtGui.QColor(180,180,180))) - self._inner = QtWidgets.QGraphicsRectItem(); pen = QtGui.QPen(QtGui.QColor(130,130,130)); pen.setStyle(QtCore.Qt.DashLine); self._inner.setPen(pen) - self.addToGroup(self._outer); self.addToGroup(self._inner) - self.setZValue(-50) - self._recalc() - - def _inch_to_px(self, inches: float) -> float: - return (float(inches)/12.0) * self._px_per_ft - - def _recalc(self): - w_in, h_in = PAGE_SIZES.get(self._size_name, PAGE_SIZES["Letter"]) - if (self._orient or "Portrait").lower().startswith("land"): - w_in, h_in = h_in, w_in - w_px = self._inch_to_px(w_in); h_px = self._inch_to_px(h_in) - m = self._inch_to_px(self._margin_in) - self._outer.setRect(0, 0, w_px, h_px) - self._inner.setRect(m, m, max(0, w_px-2*m), max(0, h_px-2*m)) - - def set_params(self, *, size_name=None, orientation=None, margin_in=None, px_per_ft=None): - if size_name: self._size_name = size_name - if orientation: self._orient = orientation - if margin_in is not None: self._margin_in = float(margin_in) - if px_per_ft is not None: self._px_per_ft = float(px_per_ft) - self._recalc() diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/main.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/main.py deleted file mode 100644 index f1182bf..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/main.py +++ /dev/null @@ -1,27 +0,0 @@ -\nimport os, json, zipfile\n\nfrom PySide6 import QtCore, QtGui, QtWidgets\nfrom PySide6.QtCore import Qt, QPointF, QSize\nfrom PySide6.QtWidgets import (\n QApplication, QMainWindow, QWidget, QHBoxLayout, QVBoxLayout,\n QListWidget, QListWidgetItem, QLineEdit, QLabel, QToolBar, QFileDialog,\n QGraphicsView, QGraphicsPathItem, QMenu, QDockWidget, QCheckBox, QSpinBox, QComboBox, QMessageBox\n)\nfrom PySide6.QtPrintSupport import QPrinter, QPrintDialog\n\nfrom app.scene import GridScene, DEFAULT_GRID_SIZE\nfrom app.device import DeviceItem\nfrom app import catalog\nfrom app.tools import draw as draw_tools\nfrom app.layout import PageFrame, PAGE_SIZES\nfrom app.tools.array import ArraySpec, fill_rect_with_points\n\ntry:\n from app.tools.dimension import DimensionTool\nexcept Exception:\n class DimensionTool:\n def __init__(self, *a, **k): self.active=False\n def start(self): self.active=True\n def on_mouse_move(self, *a, **k): pass\n def on_click(self, *a, **k): self.active=False; return True\n\nAPP_VERSION = "0.6.1-placefix"\nAPP_TITLE = f"Auto-Fire {APP_VERSION}"\nfrom app import units\n\nPREF_DIR = os.path.join(os.path.expanduser("~"), "AutoFire")\nPREF_PATH = os.path.join(PREF_DIR, "preferences.json")\nLOG_DIR = os.path.join(PREF_DIR, "logs")\n\ndef ensure_pref_dir():\n try:\n os.makedirs(PREF_DIR, exist_ok=True); os.makedirs(LOG_DIR, exist_ok=True)\n except Exception:\n pass\n\ndef load_prefs():\n ensure_pref_dir()\n if os.path.exists(PREF_PATH):\n try:\n with open(PREF_PATH, "r", encoding="utf-8") as f:\n return json.load(f)\n except Exception:\n pass\n return {}\n\ndef save_prefs(p):\n ensure_pref_dir()\n try:\n with open(PREF_PATH, "w", encoding="utf-8") as f:\n json.dump(p, f, indent=2)\n except Exception:\n pass\n\ndef apply_theme(theme: str):\n app = QtWidgets.QApplication.instance()\n if not app: return\n if (theme or "").lower() == "light":\n app.setPalette(app.style().standardPalette())\n return\n pal = QtGui.QPalette()\n pal.setColor(QtGui.QPalette.Window, QtGui.QColor(53,53,53))\n pal.setColor(QtGui.QPalette.WindowText, Qt.white)\n pal.setColor(QtGui.QPalette.Base, QtGui.QColor(35,35,35))\n pal.setColor(QtGui.QPalette.AlternateBase, QtGui.QColor(53,53,53))\n pal.setColor(QtGui.QPalette.ToolTipBase, Qt.white)\n pal.setColor(QtGui.QPalette.ToolTipText, Qt.white)\n pal.setColor(QtGui.QPalette.Text, Qt.white)\n pal.setColor(QtGui.QPalette.Button, QtGui.QColor(53,53,53))\n pal.setColor(QtGui.QPalette.ButtonText, Qt.white)\n pal.setColor(QtGui.QPalette.BrightText, Qt.red)\n pal.setColor(QtGui.QPalette.Highlight, QtGui.QColor(42,130,218))\n pal.setColor(QtGui.QPalette.HighlightedText, Qt.black)\n app.setPalette(pal)\n\nclass CanvasView(QGraphicsView):\n def __init__(self, scene, devices_group, wires_group, sketch_group, overlay_group, window_ref):\n super().__init__(scene)\n self.setRenderHints(QtGui.QPainter.Antialiasing | QtGui.QPainter.TextAntialiasing)\n self.setDragMode(QGraphicsView.RubberBandDrag)\n self.setMouseTracking(True)\n self.current_proto = None\n self.devices_group = devices_group\n self.wires_group = wires_group\n self.sketch_group = sketch_group\n self.overlay_group = overlay_group\n self.ortho = False\n self.win = window_ref\n\n # Area-array interaction\n self.area_array_active = False\n self.area_first = None\n self.area_rubber = QtWidgets.QGraphicsRectItem()\n pen = QtGui.QPen(QtGui.QColor(120,200,255,200)); pen.setStyle(Qt.DashLine); pen.setCosmetic(True)\n self.area_rubber.setPen(pen); self.area_rubber.setBrush(QtGui.QColor(120,200,255,40))\n self.area_rubber.setZValue(500); self.area_rubber.setVisible(False)\n self.area_rubber.setParentItem(self.overlay_group)\n\n # Crosshair\n self.cross_v = QtWidgets.QGraphicsLineItem(); self.cross_h = QtWidgets.QGraphicsLineItem()\n pen2 = QtGui.QPen(QtGui.QColor(160,160,160,190)); pen2.setCosmetic(True); pen2.setStyle(Qt.DashLine)\n self.cross_v.setPen(pen2); self.cross_h.setPen(pen2)\n self.cross_v.setParentItem(self.overlay_group); self.cross_h.setParentItem(self.overlay_group)\n self.show_crosshair = True\n\n def set_current_device(self, proto: dict):\n self.current_proto = proto\n if proto:\n self.win.statusBar().showMessage(f"Ready to place: {proto.get('name','Device')} — click on canvas", 3500)\n\n def _update_crosshair(self, sp: QPointF):\n if not self.show_crosshair: return\n rect = self.scene().sceneRect()\n self.cross_v.setLine(sp.x(), rect.top(), sp.x(), rect.bottom())\n self.cross_h.setLine(rect.left(), sp.y(), rect.right(), sp.y())\n from app import units as _u\n# SAFE import: array helpers (never crash on missing module) -try: - from app.tools.array import ArraySpec, fill_rect_with_points # type: ignore -except Exception: - from dataclasses import dataclass - from PySide6 import QtCore - @dataclass - class ArraySpec: - spacing_ft: float = 10.0 - offset_ft_x: float = 0.0 - offset_ft_y: float = 0.0 - def fill_rect_with_points(rect_px: QtCore.QRectF, px_per_ft: float, spec: 'ArraySpec'): - if rect_px.width() <= 0 or rect_px.height() <= 0 or px_per_ft <= 0: - return [] - step = spec.spacing_ft * px_per_ft - ox = rect_px.left() + spec.offset_ft_x * px_per_ft - oy = rect_px.top() + spec.offset_ft_y * px_per_ft - pts = [] - y = oy - while y <= rect_px.bottom() - 1e-6: - x = ox - while x <= rect_px.right() - 1e-6: - pts.append(QtCore.QPointF(x, y)) - x += step - y += step - return pts -\n dx_ft = _u.px_to_ft(sp.x(), self.win.px_per_ft)\n dy_ft = _u.px_to_ft(sp.y(), self.win.px_per_ft)\n self.win.statusBar().showMessage(f"x={_u.fmt_ft_inches(dx_ft)} y={_u.fmt_ft_inches(dy_ft)} scale={self.win.px_per_ft:.2f} px/ft snap={self.win.snap_label}")\n\n def wheelEvent(self, e: QtGui.QWheelEvent):\n s = 1.15 if e.angleDelta().y() > 0 else 1/1.15\n self.scale(s, s)\n\n def keyPressEvent(self, e: QtGui.QKeyEvent):\n if e.key()==Qt.Key_Shift: self.ortho=True; e.accept(); return\n if e.key()==Qt.Key_C: self.show_crosshair = not self.show_crosshair; e.accept(); return\n if e.key()==Qt.Key_G: self.win.set_generic_proto(); e.accept(); return\n if e.key()==Qt.Key_Delete: self.win.delete_selected(); e.accept(); return\n if e.key()==Qt.Key_R: self.win.rotate_selected(); e.accept(); return\n if e.key()==Qt.Key_Escape:\n if self.area_array_active:\n self.area_array_active=False; self.area_first=None; self.area_rubber.setVisible(False); e.accept(); return\n if getattr(self.win, "draw", None): self.win.draw.finish(); e.accept(); return\n super().keyPressEvent(e)\n\n def mousePressEvent(self, e: QtGui.QMouseEvent):\n sp = self.scene().snap(self.mapToScene(e.position().toPoint()))\n if e.button()==Qt.RightButton:\n self.win.canvas_menu(e.globalPosition().toPoint()); e.accept(); return\n\n if e.button()==Qt.LeftButton:\n # Priority: area-array, drawing, dimension, placement\n if self.area_array_active:\n if self.area_first is None:\n self.area_first = sp\n self.win.statusBar().showMessage("Array: pick opposite corner (Esc to cancel)")\n else:\n rect = QtCore.QRectF(self.area_first, sp).normalized()\n self.area_array_active=False; self.area_first=None; self.area_rubber.setVisible(False)\n self.win.place_array_in_rect(rect)\n e.accept(); return\n\n if getattr(self.win, "draw", None) and self.win.draw.mode != 0:\n if self.win.draw.on_click(sp, shift_ortho=self.ortho):\n self.win.push_history(); e.accept(); return\n\n if getattr(self.win, "dim_tool", None) and self.win.dim_tool.active:\n if self.win.dim_tool.on_click(sp):\n e.accept(); return\n\n # If clicking on an existing item, don't place a new one\n under = self.items(e.position().toPoint())\n if any(isinstance(x, QtWidgets.QGraphicsItem) and not isinstance(x, QtWidgets.QGraphicsPixmapItem) and x is not self.area_rubber for x in under):\n super().mousePressEvent(e)\n return\n\n # Place device (always works, even if no catalog)\n d = self.current_proto or {"symbol":"GEN","name":"Generic Device","manufacturer":"Generic","part_number":""}\n it = DeviceItem(sp.x(), sp.y(), d.get("symbol","?"), d.get("name","Device"), d.get("manufacturer",""), d.get("part_number",""))\n it.setParentItem(self.devices_group)\n self.win.push_history()\n e.accept(); return\n\n super().mousePressEvent(e)\n\n def mouseMoveEvent(self, e: QtGui.QMouseEvent):\n sp = self.mapToScene(e.position().toPoint())\n self._update_crosshair(sp)\n if self.area_array_active and self.area_first is not None:\n rect = QtCore.QRectF(self.area_first, sp).normalized()\n self.area_rubber.setRect(rect); self.area_rubber.setVisible(True)\n if getattr(self.win, "draw", None): self.win.draw.on_mouse_move(sp, shift_ortho=self.ortho)\n if getattr(self.win, "dim_tool", None): self.win.dim_tool.on_mouse_move(sp)\n super().mouseMoveEvent(e)\n\nclass MainWindow(QMainWindow):\n def __init__(self):\n super().__init__()\n self.setWindowTitle(APP_TITLE)\n self.resize(1400, 900)\n self.prefs = load_prefs()\n self.px_per_ft = float(self.prefs.get("px_per_ft", 12.0))\n self.snap_label = self.prefs.get("snap_label", "grid")\n self.snap_step_in = float(self.prefs.get("snap_step_in", 0.0))\n\n self.devices_all = catalog.load_catalog()\n\n self.scene = GridScene(int(self.prefs.get("grid", DEFAULT_GRID_SIZE)), 0,0,10000,8000)\n self.scene.snap_enabled = bool(self.prefs.get("snap", True))\n self._apply_snap_step_from_inches(self.snap_step_in)\n\n self.layer_underlay = QtWidgets.QGraphicsItemGroup(); self.layer_underlay.setZValue(-10); self.scene.addItem(self.layer_underlay)\n self.layer_sketch = QtWidgets.QGraphicsItemGroup(); self.layer_sketch.setZValue(40); self.scene.addItem(self.layer_sketch)\n self.layer_wires = QtWidgets.QGraphicsItemGroup(); self.layer_wires.setZValue(60); self.scene.addItem(self.layer_wires)\n self.layer_devices = QtWidgets.QGraphicsItemGroup(); self.layer_devices.setZValue(100); self.scene.addItem(self.layer_devices)\n self.layer_overlay = QtWidgets.QGraphicsItemGroup(); self.layer_overlay.setZValue(200); self.scene.addItem(self.layer_overlay)\n\n self.view = CanvasView(self.scene, self.layer_devices, self.layer_wires, self.layer_sketch, self.layer_overlay, self)\n\n self.draw = draw_tools.DrawController(self, self.layer_sketch)\n try:\n self.dim_tool = DimensionTool(self, self.layer_overlay)\n except Exception:\n self.dim_tool = None\n\n menubar = self.menuBar()\n m_file = menubar.addMenu("&File")\n m_file.addAction("New", self.new_project, QtGui.QKeySequence.New)\n m_file.addAction("Open…", self.open_project, QtGui.QKeySequence.Open)\n m_file.addAction("Save As…", self.save_project_as, QtGui.QKeySequence.SaveAs)\n m_file.addSeparator()\n m_file.addAction("Import DXF Underlay…", self.import_dxf_underlay)\n m_file.addAction("Import Image Underlay…", self.import_image_underlay)\n m_file.addSeparator()\n m_file.addAction("Quit", self.close, QtGui.QKeySequence.Quit)\n\n m_tools = menubar.addMenu("&Tools")\n def add_tool(name, cb):\n act = QtGui.QAction(name, self); act.triggered.connect(cb); m_tools.addAction(act); return act\n self.act_draw_line = add_tool("Draw Line", lambda: self.draw.set_mode(draw_tools.DrawMode.LINE))\n self.act_draw_rect = add_tool("Draw Rect", lambda: self.draw.set_mode(draw_tools.DrawMode.RECT))\n self.act_draw_circle = add_tool("Draw Circle", lambda: self.draw.set_mode(draw_tools.DrawMode.CIRCLE))\n self.act_draw_poly = add_tool("Draw Polyline",lambda: self.draw.set_mode(draw_tools.DrawMode.POLYLINE))\n m_tools.addSeparator()\n m_tools.addAction("Array in Area…", self.start_area_array)\n if self.dim_tool:\n m_tools.addAction("Dimension (D)", self.start_dimension)\n\n m_view = menubar.addMenu("&View")\n self.act_view_grid = QtGui.QAction("Grid", self, checkable=True); self.act_view_grid.setChecked(True); self.act_view_grid.toggled.connect(self.toggle_grid); m_view.addAction(self.act_view_grid)\n self.act_view_snap = QtGui.QAction("Snap", self, checkable=True); self.act_view_snap.setChecked(self.scene.snap_enabled); self.act_view_snap.toggled.connect(self.toggle_snap); m_view.addAction(self.act_view_snap)\n self.act_view_cross = QtGui.QAction("Crosshair (C)", self, checkable=True); self.act_view_cross.setChecked(True); self.act_view_cross.toggled.connect(self.toggle_crosshair); m_view.addAction(self.act_view_cross)\n m_view.addSeparator()\n act_scale = QtGui.QAction("Set Pixels per Foot…", self); act_scale.triggered.connect(self.set_px_per_ft); m_view.addAction(act_scale)\n\n m_help = menubar.addMenu("&Help")\n m_help.addAction("About AutoFire…", self.show_about)\n\n tb = QToolBar("Main"); tb.setIconSize(QSize(16,16)); self.addToolBar(tb)\n tb.addAction(self.act_view_grid); tb.addAction(self.act_view_snap); tb.addAction(self.act_view_cross)\n\n left = QWidget(); ll = QVBoxLayout(left)\n ll.addWidget(QLabel("Device Palette"))\n self.search = QLineEdit(); self.search.setPlaceholderText("Search name / part number…")\n self.cmb_mfr = QComboBox(); self.cmb_type = QComboBox()\n ll_top = QHBoxLayout(); ll_top.addWidget(QLabel("Manufacturer:")); ll_top.addWidget(self.cmb_mfr)\n ll_typ = QHBoxLayout(); ll_typ.addWidget(QLabel("Type:")); ll_typ.addWidget(self.cmb_type)\n self.list = QListWidget()\n ll.addLayout(ll_top); ll.addLayout(ll_typ); ll.addWidget(self.search); ll.addWidget(self.list)\n\n self.devices_all = self.devices_all or []\n self._populate_filters(); self._refresh_device_list()\n self.search.textChanged.connect(self._refresh_device_list)\n self.cmb_mfr.currentIndexChanged.connect(self._refresh_device_list)\n self.cmb_type.currentIndexChanged.connect(self._refresh_device_list)\n self.list.itemClicked.connect(self.choose_device)\n\n # Select first device by default (else generic)\n if self.list.count() > 0:\n self.list.setCurrentRow(0)\n self.choose_device(self.list.item(0))\n else:\n self.set_generic_proto()\n\n splitter = QtWidgets.QSplitter(); splitter.addWidget(left); splitter.addWidget(self.view); splitter.setStretchFactor(1,1)\n container = QWidget(); lay = QHBoxLayout(container); lay.addWidget(splitter); self.setCentralWidget(container)\n\n dock = QDockWidget("Layers / Controls", self); panel = QWidget(); form = QVBoxLayout(panel)\n self.chk_underlay = QCheckBox("Underlay"); self.chk_underlay.setChecked(True); self.chk_underlay.toggled.connect(lambda v: self.layer_underlay.setVisible(v)); form.addWidget(self.chk_underlay)\n self.chk_sketch = QCheckBox("Sketch"); self.chk_sketch.setChecked(True); self.chk_sketch.toggled.connect(lambda v: self.layer_sketch.setVisible(v)); form.addWidget(self.chk_sketch)\n self.chk_wires = QCheckBox("Wiring"); self.chk_wires.setChecked(True); self.chk_wires.toggled.connect(lambda v: self.layer_wires.setVisible(v)); form.addWidget(self.chk_wires)\n self.chk_devices = QCheckBox("Devices"); self.chk_devices.setChecked(True); self.chk_devices.toggled.connect(lambda v: self.layer_devices.setVisible(v)); form.addWidget(self.chk_devices)\n form.addWidget(QLabel("Grid Size"))\n self.spin_grid = QSpinBox(); self.spin_grid.setRange(2, 500); self.spin_grid.setValue(self.scene.grid_size); self.spin_grid.valueChanged.connect(self.change_grid_size); form.addWidget(self.spin_grid)\n panel.setLayout(form); dock.setWidget(panel); self.addDockWidget(Qt.RightDockWidgetArea, dock)\n\n # SHORTCUTS\n QtGui.QShortcut(QtGui.QKeySequence("Ctrl+Z"), self, activated=self.undo)\n QtGui.QShortcut(QtGui.QKeySequence("Ctrl+Y"), self, activated=self.redo)\n if self.dim_tool:\n QtGui.QShortcut(QtGui.QKeySequence("D"), self, activated=self.start_dimension)\n QtGui.QShortcut(QtGui.QKeySequence("Delete"), self, activated=self.delete_selected)\n QtGui.QShortcut(QtGui.QKeySequence("Ctrl+D"), self, activated=self.duplicate_selected)\n QtGui.QShortcut(QtGui.QKeySequence("G"), self, activated=self.set_generic_proto)\n\n self.history = []; self.history_index = -1\n self.push_history()\n\n # ---- palette ----\n def _populate_filters(self):\n def list_mfrs(devs):\n s = set(d.get("manufacturer","") for d in devs if d.get("manufacturer"))\n return ["(Any)"] + sorted(s) if s else ["(Any)"]\n def list_types(devs):\n s = set(d.get("type","") for d in devs if d.get("type"))\n return ["(Any)"] + sorted(s) if s else ["(Any)"]\n\n mfrs = list_mfrs(self.devices_all)\n types = list_types(self.devices_all)\n self.cmb_mfr.clear(); self.cmb_mfr.addItems(mfrs)\n self.cmb_type.clear(); self.cmb_type.addItems(types)\n\n def _refresh_device_list(self):\n q = self.search.text().lower().strip()\n want_mfr = self.cmb_mfr.currentText()\n want_type = self.cmb_type.currentText()\n self.list.clear()\n for d in self.devices_all:\n if want_mfr and want_mfr != "(Any)" and d.get("manufacturer") != want_mfr: continue\n if want_type and want_type != "(Any)" and d.get("type") != want_type: continue\n txt = f"{d.get('name','Device')} ({d.get('symbol','?')})"\n if q and q not in txt.lower() and q not in (d.get('part_number','').lower()): continue\n it = QListWidgetItem(txt); it.setData(Qt.UserRole, d); self.list.addItem(it)\n\n def choose_device(self, it: QListWidgetItem):\n self.view.set_current_device(it.data(Qt.UserRole)); self.statusBar().showMessage(f"Selected: {it.data(Qt.UserRole).get('name','Device')}")\n\n # ---- tools ----\n def start_area_array(self):\n self.view.area_array_active = True\n self.view.area_first = None\n self.statusBar().showMessage("Array: click first corner, then opposite corner (Esc to cancel)")\n\n def place_array_in_rect(self, rect: QtCore.QRectF):\n proto = self.view.current_proto or {"symbol":"GEN","name":"Generic Device","manufacturer":"Generic","part_number":""}\n spacing_ft = self.snap_step_in/12.0 if self.snap_step_in>0 else 10.0\n pts = fill_rect_with_points(rect, self.px_per_ft, ArraySpec(spacing_ft=spacing_ft))\n for p in pts:\n it = DeviceItem(p.x(), p.y(), proto.get("symbol","?"), proto.get("name","Device"), proto.get("manufacturer",""), proto.get("part_number",""))\n it.setParentItem(self.layer_devices)\n self.push_history()\n self.statusBar().showMessage(f"Placed {len(pts)} devices")\n\n # ---- view toggles ----\n def toggle_grid(self, on: bool): self.scene.show_grid = bool(on); self.scene.update()\n def toggle_snap(self, on: bool): self.scene.snap_enabled = bool(on)\n def toggle_crosshair(self, on: bool): self.view.show_crosshair = bool(on)\n\n def set_px_per_ft(self):\n val, ok = QtWidgets.QInputDialog.getDouble(self, "Scale", "Pixels per foot", self.px_per_ft, 1.0, 1000.0, 2)\n if ok:\n self.px_per_ft = float(val)\n self.prefs["px_per_ft"] = self.px_per_ft\n save_prefs(self.prefs)\n self._apply_snap_step_from_inches(self.snap_step_in)\n\n def _apply_snap_step_from_inches(self, inches: float):\n if inches <= 0:\n self.scene.snap_step_px = 0.0\n self.snap_label = "grid"\n else:\n ft = inches / 12.0\n self.scene.snap_step_px = (ft * self.px_per_ft)\n self.snap_label = f'{int(inches)}"'\n self.prefs["snap_step_in"] = inches\n self.prefs["snap_label"] = self.snap_label\n save_prefs(self.prefs)\n\n def set_snap_inches(self, inches: float):\n self._apply_snap_step_from_inches(inches)\n\n # ---- context menu ----\n def canvas_menu(self, global_pos):\n menu = QMenu(self)\n sel = [it for it in self.scene.selectedItems() if isinstance(it, DeviceItem)]\n if sel:\n d = sel[0]\n act_prop = menu.addAction("Properties…")\n act_dup = menu.addAction("Duplicate")\n act_del = menu.addAction("Delete")\n act_front = menu.addAction("Bring to Front")\n act_back = menu.addAction("Send to Back")\n act_lock = menu.addAction("Lock" if not getattr(d, "locked", False) else "Unlock")\n\n act = menu.exec(global_pos)\n if act == act_prop:\n self.edit_device(d)\n elif act == act_dup:\n self.duplicate_selected()\n elif act == act_del:\n self.delete_selected()\n elif act == act_front:\n d.setZValue(d.zValue()+10); self.push_history()\n elif act == act_back:\n d.setZValue(d.zValue()-10); self.push_history()\n elif act == act_lock:\n d.set_locked(not getattr(d, "locked", False)); self.push_history()\n else:\n menu.addAction("Array in Area…", self.start_area_array)\n menu.addAction("Clear Underlay", self.clear_underlay)\n menu.exec(global_pos)\n\n def edit_device(self, item: DeviceItem):\n try:\n from app.dialogs.device_props import DevicePropsDialog\n except Exception:\n QMessageBox.information(self, "Properties", "Properties dialog unavailable in this build.")\n return\n dlg = DevicePropsDialog(self, item, self.px_per_ft)\n if dlg.exec() == QtWidgets.QDialog.Accepted:\n v = dlg.values()\n item.set_label_text(v["name"] or item.name)\n item.name = v["name"] or item.name\n item.symbol = v["symbol"] or item.symbol\n item.manufacturer = v["manufacturer"] or item.manufacturer\n item.part_number = v["part_number"] or item.part_number\n dx, dy = v["label_offset_px"]; item.set_label_offset(dx, dy)\n self.push_history()\n\n # ---- serialize ----\n def serialize_state(self):\n devs = []\n for it in self.layer_devices.childItems():\n if isinstance(it, DeviceItem): devs.append(it.to_json())\n return {"grid":int(self.scene.grid_size), "snap":bool(self.scene.snap_enabled),\n "px_per_ft": float(self.px_per_ft),\n "snap_step_in": float(self.snap_step_in),\n "underlay":{"opacity":1.0},"devices":devs,"wires":[]}\n\n def load_state(self, data):\n for it in list(self.layer_devices.childItems()): it.scene().removeItem(it)\n for it in list(self.layer_wires.childItems()): it.scene().removeItem(it)\n self.scene.snap_enabled = bool(data.get("snap", True)); self.act_view_snap.setChecked(self.scene.snap_enabled)\n self.scene.grid_size = int(data.get("grid", DEFAULT_GRID_SIZE)); self.spin_grid.setValue(self.scene.grid_size)\n self.px_per_ft = float(data.get("px_per_ft", self.px_per_ft))\n self.snap_step_in = float(data.get("snap_step_in", self.snap_step_in))\n self._apply_snap_step_from_inches(self.snap_step_in)\n for d in data.get("devices", []):\n it = DeviceItem.from_json(d); it.setParentItem(self.layer_devices)\n\n def push_history(self):\n if self.history_index < len(self.history)-1: self.history = self.history[:self.history_index+1]\n self.history.append(self.serialize_state()); self.history_index += 1\n\n def undo(self):\n if self.history_index>0:\n self.history_index-=1; self.load_state(self.history[self.history_index]); self.statusBar().showMessage("Undo")\n\n def redo(self):\n if self.history_index < len(self.history)-1:\n self.history_index+=1; self.load_state(self.history[self.history_index]); self.statusBar().showMessage("Redo")\n\n # ---- underlay ----\n def _build_underlay_path(self, msp):\n path = QtGui.QPainterPath()\n for e in msp:\n t = e.dxftype()\n if t=="LINE":\n sx,sy,_=e.dxf.start; ex,ey,_=e.dxf.end\n path.moveTo(float(sx),float(sy)); path.lineTo(float(ex),float(ey))\n elif t=="CIRCLE":\n cx,cy,_=e.dxf.center; r=float(e.dxf.radius); rect=QtCore.QRectF(cx-r, cy-r, 2*r, 2*r); path.addEllipse(rect)\n elif t=="ARC":\n cx,cy,_=e.dxf.center; r=float(e.dxf.radius)\n start=float(e.dxf.start_angle); end=float(e.dxf.end_angle); rect=QtCore.QRectF(cx-r, cy-r, 2*r, 2*r)\n path.arcMoveTo(rect, start); path.arcTo(rect, start, end-start)\n return path\n\n def _apply_underlay_path(self, path):\n for it in list(self.layer_underlay.childItems()): it.scene().removeItem(it)\n pen=QtGui.QPen(Qt.darkGray); pen.setCosmetic(True); pen.setWidthF(0)\n item=QGraphicsPathItem(path); item.setPen(pen); item.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, False); item.setParentItem(self.layer_underlay)\n\n def _load_underlay(self, path):\n try:\n import ezdxf\n except Exception as ex:\n QMessageBox.critical(self,"DXF Import Error","DXF support (ezdxf) is not available in this build.\n\n"+str(ex))\n return\n try:\n doc = ezdxf.readfile(path); msp = doc.modelspace(); p = self._build_underlay_path(msp); self._apply_underlay_path(p)\n except Exception as ex:\n QMessageBox.critical(self,"DXF Import Error", str(ex))\n\n def import_dxf_underlay(self):\n p,_ = QFileDialog.getOpenFileName(self,"Import DXF Underlay","","DXF Files (*.dxf)")\n if not p: return\n self._load_underlay(p)\n\n def import_image_underlay(self):\n p,_ = QFileDialog.getOpenFileName(self,"Import Image Underlay","","Images (*.png *.jpg *.jpeg *.bmp *.tif *.tiff)")\n if not p: return\n img = QtGui.QImage(p)\n if img.isNull():\n QMessageBox.critical(self,"Image Import Error","Could not read the selected image.")\n return\n pix = QtGui.QPixmap.fromImage(img)\n item = QtWidgets.QGraphicsPixmapItem(pix)\n item.setOpacity(0.85)\n item.setZValue(-15)\n item.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True)\n item.setParentItem(self.layer_underlay)\n\n def clear_underlay(self):\n for it in list(self.layer_underlay.childItems()): it.scene().removeItem(it)\n\n def new_project(self):\n self.clear_underlay()\n for it in list(self.layer_devices.childItems()): it.scene().removeItem(it)\n for it in list(self.layer_wires.childItems()): it.scene().removeItem(it)\n self.push_history(); self.statusBar().showMessage("New project")\n\n def save_project_as(self):\n p,_=QFileDialog.getSaveFileName(self,"Save Project As","","AutoFire Bundle (*.autofire)")\n if not p: return\n if not p.lower().endswith(".autofire"): p += ".autofire"\n try:\n data=self.serialize_state()\n with zipfile.ZipFile(p,"w",compression=zipfile.ZIP_DEFLATED) as z:\n z.writestr("project.json", json.dumps(data, indent=2))\n self.statusBar().showMessage(f"Saved: {os.path.basename(p)}")\n except Exception as ex:\n QMessageBox.critical(self,"Save Project Error", str(ex))\n\n def open_project(self):\n p,_=QFileDialog.getOpenFileName(self,"Open Project","","AutoFire Bundle (*.autofire)")\n if not p: return\n try:\n with zipfile.ZipFile(p,"r") as z:\n data=json.loads(z.read("project.json").decode("utf-8"))\n self.load_state(data); self.push_history(); self.statusBar().showMessage(f"Opened: {os.path.basename(p)}")\n except Exception as ex:\n QMessageBox.critical(self,"Open Project Error", str(ex))\n\n def change_grid_size(self, v: int):\n self.scene.grid_size = int(v); self.scene.update()\n\n def fit_view_to_content(self):\n rect=self.scene.itemsBoundingRect().adjusted(-100,-100,100,100)\n if rect.isNull(): rect=QtCore.QRectF(0,0,1000,800)\n self.view.fitInView(rect, Qt.KeepAspectRatio)\n\n def start_dimension(self):\n if self.dim_tool: self.dim_tool.start()\n\n # Selection ops\n def delete_selected(self):\n for it in list(self.scene.selectedItems()):\n if isinstance(it, DeviceItem) and getattr(it, "locked", False):\n continue\n it.scene().removeItem(it)\n self.push_history()\n\n def duplicate_selected(self):\n sel = [it for it in self.scene.selectedItems() if isinstance(it, DeviceItem)]\n for d in sel:\n it = DeviceItem(d.pos().x()+10, d.pos().y()+10, d.symbol, d.name, d.manufacturer, d.part_number)\n it.setParentItem(self.layer_devices)\n self.push_history()\n\n def set_generic_proto(self):\n self.view.set_current_device({"symbol":"GEN","name":"Generic Device","manufacturer":"Generic","part_number":""})\n\n def show_about(self):\n QtWidgets.QMessageBox.information(self,"About", f"Auto-Fire\nVersion {APP_VERSION}")\n\n# factory used by boot.py\ndef create_window():\n return MainWindow()\n\ndef main():\n app = QApplication([])\n # theme\n prefs = load_prefs()\n apply_theme(prefs.get("theme","dark"))\n win = create_window()\n win.show()\n app.exec()\n\nif __name__ == "__main__":\n main() \ No newline at end of file diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/main.py.bak b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/main.py.bak deleted file mode 100644 index 73054fa..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/main.py.bak +++ /dev/null @@ -1,431 +0,0 @@ -import os, json, zipfile - -from PySide6 import QtCore, QtGui, QtWidgets -from PySide6.QtCore import Qt, QPointF, QSize -from PySide6.QtWidgets import ( - QApplication, QMainWindow, QWidget, QHBoxLayout, QVBoxLayout, - QListWidget, QListWidgetItem, QLineEdit, QLabel, QToolBar, QFileDialog, - QGraphicsView, QGraphicsPathItem, QMenu, QDockWidget, QCheckBox, QSpinBox, QComboBox, QMessageBox -) - -from app.scene import GridScene, DEFAULT_GRID_SIZE -from app.device import DeviceItem -from app import catalog -from app.tools import draw as draw_tools -from app.tools.array import ArrayTool -from app.tools.dimension import DimensionTool -from app.dialogs.coverage import CoverageDialog -from app import units - -APP_VERSION = "0.5.1-snapA" -APP_TITLE = f"Auto-Fire {APP_VERSION}" -PREF_DIR = os.path.join(os.path.expanduser("~"), "AutoFire") -PREF_PATH = os.path.join(PREF_DIR, "preferences.json") -LOG_DIR = os.path.join(PREF_DIR, "logs") - -def ensure_pref_dir(): - try: - os.makedirs(PREF_DIR, exist_ok=True); os.makedirs(LOG_DIR, exist_ok=True) - except Exception: - pass - -def load_prefs(): - ensure_pref_dir() - if os.path.exists(PREF_PATH): - try: - with open(PREF_PATH, "r", encoding="utf-8") as f: - return json.load(f) - except Exception: - pass - return {} - -def save_prefs(p): - ensure_pref_dir() - try: - with open(PREF_PATH, "w", encoding="utf-8") as f: - json.dump(p, f, indent=2) - except Exception: - pass - -class CanvasView(QGraphicsView): - def __init__(self, scene, devices_group, wires_group, sketch_group, overlay_group, window_ref): - super().__init__(scene) - self.setRenderHints(QtGui.QPainter.Antialiasing | QtGui.QPainter.TextAntialiasing) - self.setDragMode(QGraphicsView.RubberBandDrag) - self.setMouseTracking(True) - self.current_proto = None - self.devices_group = devices_group - self.wires_group = wires_group - self.sketch_group = sketch_group - self.overlay_group = overlay_group - self.ortho = False - self.win = window_ref - - self.cross_v = QtWidgets.QGraphicsLineItem(); self.cross_h = QtWidgets.QGraphicsLineItem() - pen = QtGui.QPen(QtGui.QColor(150,150,150,170)); pen.setCosmetic(True); pen.setStyle(Qt.DashLine) - self.cross_v.setPen(pen); self.cross_h.setPen(pen) - self.cross_v.setParentItem(self.overlay_group); self.cross_h.setParentItem(self.overlay_group) - self.show_crosshair = True - - def set_current_device(self, proto: dict): - self.current_proto = proto - - def _update_crosshair(self, sp: QPointF): - if not self.show_crosshair: return - rect = self.scene().sceneRect() - self.cross_v.setLine(sp.x(), rect.top(), sp.x(), rect.bottom()) - self.cross_h.setLine(rect.left(), sp.y(), rect.right(), sp.y()) - from app import units as _u - dx_ft = _u.px_to_ft(sp.x(), self.win.px_per_ft) - dy_ft = _u.px_to_ft(sp.y(), self.win.px_per_ft) - self.win.statusBar().showMessage(f"x={_u.fmt_ft_inches(dx_ft)} y={_u.fmt_ft_inches(dy_ft)} scale={self.win.px_per_ft:.2f} px/ft snap={self.win.snap_label}") - - def wheelEvent(self, e: QtGui.QWheelEvent): - s = 1.15 if e.angleDelta().y() > 0 else 1/1.15 - self.scale(s, s) - - def keyPressEvent(self, e: QtGui.QKeyEvent): - if e.key()==Qt.Key_Shift: self.ortho=True; e.accept(); return - if e.key()==Qt.Key_C: self.show_crosshair = not self.show_crosshair; e.accept(); return - if e.key()==Qt.Key_Escape and getattr(self.win, "draw", None): self.win.draw.finish(); e.accept(); return - super().keyPressEvent(e) - - def keyReleaseEvent(self, e: QtGui.QKeyEvent): - if e.key()==Qt.Key_Shift: self.ortho=False; e.accept(); return - super().keyReleaseEvent(e) - - def mouseMoveEvent(self, e: QtGui.QMouseEvent): - sp = self.mapToScene(e.position().toPoint()) - self._update_crosshair(sp) - if getattr(self.win, "draw", None): self.win.draw.on_mouse_move(sp, shift_ortho=self.ortho) - if getattr(self.win, "dim_tool", None): self.win.dim_tool.on_mouse_move(sp) - super().mouseMoveEvent(e) - - def mousePressEvent(self, e: QtGui.QMouseEvent): - win = self.win - sp = self.scene().snap(self.mapToScene(e.position().toPoint())) - if e.button()==Qt.LeftButton: - if getattr(win, "draw", None) and win.draw.mode != 0: - if win.draw.on_click(sp, shift_ortho=self.ortho): win.push_history(); e.accept(); return - if getattr(win, "dim_tool", None) and win.dim_tool.active: - if win.dim_tool.on_click(sp): e.accept(); return - if self.current_proto: - d = self.current_proto - it = DeviceItem(sp.x(), sp.y(), d["symbol"], d["name"], d.get("manufacturer",""), d.get("part_number","")) - it.setParentItem(self.devices_group); win.push_history(); e.accept(); return - elif e.button()==Qt.RightButton: - win.canvas_menu(e.globalPosition().toPoint()); e.accept(); return - super().mousePressEvent(e) - -class MainWindow(QMainWindow): - def __init__(self): - super().__init__() - self.setWindowTitle(APP_TITLE) - self.resize(1400, 900) - self.prefs = load_prefs() - self.px_per_ft = float(self.prefs.get("px_per_ft", 12.0)) - self.snap_label = self.prefs.get("snap_label", "grid") - self.snap_step_in = float(self.prefs.get("snap_step_in", 0.0)) # inches - - self.devices_all = catalog.load_catalog() - - self.scene = GridScene(int(self.prefs.get("grid", DEFAULT_GRID_SIZE)), 0,0,10000,8000) - self.scene.snap_enabled = bool(self.prefs.get("snap", True)) - self._apply_snap_step_from_inches(self.snap_step_in) - - self.layer_underlay = QtWidgets.QGraphicsItemGroup(); self.layer_underlay.setZValue(-10); self.scene.addItem(self.layer_underlay) - self.layer_sketch = QtWidgets.QGraphicsItemGroup(); self.layer_sketch.setZValue(40); self.scene.addItem(self.layer_sketch) - self.layer_wires = QtWidgets.QGraphicsItemGroup(); self.layer_wires.setZValue(60); self.scene.addItem(self.layer_wires) - self.layer_devices = QtWidgets.QGraphicsItemGroup(); self.layer_devices.setZValue(100); self.scene.addItem(self.layer_devices) - self.layer_overlay = QtWidgets.QGraphicsItemGroup(); self.layer_overlay.setZValue(200); self.scene.addItem(self.layer_overlay) - - self.view = CanvasView(self.scene, self.layer_devices, self.layer_wires, self.layer_sketch, self.layer_overlay, self) - - self.current_underlay_path = None - self.underlay_opacity = 1.0 - - self.draw = draw_tools.DrawController(self, self.layer_sketch) - self.array_tool = ArrayTool(self, self.layer_devices) - self.dim_tool = DimensionTool(self, self.layer_overlay) - - menubar = self.menuBar() - m_file = menubar.addMenu("&File") - m_file.addAction("New", self.new_project, QtGui.QKeySequence.New) - m_file.addAction("Open…", self.open_project, QtGui.QKeySequence.Open) - m_file.addAction("Save As…", self.save_project_as, QtGui.QKeySequence.SaveAs) - m_file.addSeparator() - m_file.addAction("Import DXF Underlay…", self.import_dxf_underlay) - m_file.addSeparator() - m_file.addAction("Quit", self.close, QtGui.QKeySequence.Quit) - - m_tools = menubar.addMenu("&Tools") - def add_tool(name, cb): - act = QtGui.QAction(name, self); act.triggered.connect(cb); m_tools.addAction(act); return act - self.act_draw_line = add_tool("Draw Line", lambda: self.draw.set_mode(draw_tools.DrawMode.LINE)) - self.act_draw_rect = add_tool("Draw Rect", lambda: self.draw.set_mode(draw_tools.DrawMode.RECT)) - self.act_draw_circle = add_tool("Draw Circle", lambda: self.draw.set_mode(draw_tools.DrawMode.CIRCLE)) - self.act_draw_poly = add_tool("Draw Polyline",lambda: self.draw.set_mode(draw_tools.DrawMode.POLYLINE)) - m_tools.addSeparator() - m_tools.addAction("Place Array…", self.array_tool.run) - m_tools.addAction("Dimension (D)", self.start_dimension) - - m_view = menubar.addMenu("&View") - self.act_view_grid = QtGui.QAction("Grid", self, checkable=True); self.act_view_grid.setChecked(True); self.act_view_grid.toggled.connect(self.toggle_grid); m_view.addAction(self.act_view_grid) - self.act_view_snap = QtGui.QAction("Snap", self, checkable=True); self.act_view_snap.setChecked(self.scene.snap_enabled); self.act_view_snap.toggled.connect(self.toggle_snap); m_view.addAction(self.act_view_snap) - self.act_view_cross = QtGui.QAction("Crosshair (C)", self, checkable=True); self.act_view_cross.setChecked(True); self.act_view_cross.toggled.connect(self.toggle_crosshair); m_view.addAction(self.act_view_cross) - m_view.addSeparator() - act_scale = QtGui.QAction("Set Pixels per Foot…", self); act_scale.triggered.connect(self.set_px_per_ft); m_view.addAction(act_scale) - m_snap = m_view.addMenu("Snap step") - self.grp_snap = QtGui.QActionGroup(self, exclusive=True) - def add_snap(name, inches): - a = QtGui.QAction(name, self, checkable=True) - if (inches==0 and self.snap_step_in<=0) or (inches>0 and abs(self.snap_step_in-inches)<1e-6): a.setChecked(True) - a.triggered.connect(lambda _=False, inc=inches: self.set_snap_inches(inc)) - self.grp_snap.addAction(a); m_snap.addAction(a) - add_snap("Grid intersections (default)", 0.0) - add_snap('6"', 6.0); add_snap('12"', 12.0); add_snap('24"', 24.0) - - m_help = menubar.addMenu("&Help") - m_help.addAction("About AutoFire…", self.show_about) - - tb = QToolBar("Main"); tb.setIconSize(QSize(16,16)); self.addToolBar(tb) - tb.addAction(self.act_view_grid); tb.addAction(self.act_view_snap); tb.addAction(self.act_view_cross) - tb.addSeparator() - tb.addAction(self.act_draw_line); tb.addAction(self.act_draw_rect); tb.addAction(self.act_draw_circle); tb.addAction(self.act_draw_poly) - tb.addSeparator() - tb.addAction("Array", self.array_tool.run); tb.addAction("Dimension", self.start_dimension) - - left = QWidget(); ll = QVBoxLayout(left) - ll.addWidget(QLabel("Device Palette")) - self.search = QLineEdit(); self.search.setPlaceholderText("Search name / part number…") - self.cmb_mfr = QComboBox(); self.cmb_type = QComboBox() - ll_top = QHBoxLayout(); ll_top.addWidget(QLabel("Manufacturer:")); ll_top.addWidget(self.cmb_mfr) - ll_typ = QHBoxLayout(); ll_typ.addWidget(QLabel("Type:")); ll_typ.addWidget(self.cmb_type) - self.list = QListWidget() - ll.addLayout(ll_top); ll.addLayout(ll_typ); ll.addWidget(self.search); ll.addWidget(self.list) - - self._populate_filters(); self._refresh_device_list() - self.search.textChanged.connect(self._refresh_device_list) - self.cmb_mfr.currentIndexChanged.connect(self._refresh_device_list) - self.cmb_type.currentIndexChanged.connect(self._refresh_device_list) - self.list.itemClicked.connect(self.choose_device) - - splitter = QtWidgets.QSplitter(); splitter.addWidget(left); splitter.addWidget(self.view); splitter.setStretchFactor(1,1) - container = QWidget(); lay = QHBoxLayout(container); lay.addWidget(splitter); self.setCentralWidget(container) - - dock = QDockWidget("Layers / Controls", self); panel = QWidget(); form = QVBoxLayout(panel) - self.chk_underlay = QCheckBox("Underlay"); self.chk_underlay.setChecked(True); self.chk_underlay.toggled.connect(lambda v: self.layer_underlay.setVisible(v)); form.addWidget(self.chk_underlay) - self.chk_sketch = QCheckBox("Sketch"); self.chk_sketch.setChecked(True); self.chk_sketch.toggled.connect(lambda v: self.layer_sketch.setVisible(v)); form.addWidget(self.chk_sketch) - self.chk_wires = QCheckBox("Wiring"); self.chk_wires.setChecked(True); self.chk_wires.toggled.connect(lambda v: self.layer_wires.setVisible(v)); form.addWidget(self.chk_wires) - self.chk_devices = QCheckBox("Devices"); self.chk_devices.setChecked(True); self.chk_devices.toggled.connect(lambda v: self.layer_devices.setVisible(v)); form.addWidget(self.chk_devices) - form.addWidget(QLabel("Grid Size")) - self.spin_grid = QSpinBox(); self.spin_grid.setRange(2, 500); self.spin_grid.setValue(self.scene.grid_size); self.spin_grid.valueChanged.connect(self.change_grid_size); form.addWidget(self.spin_grid) - panel.setLayout(form); dock.setWidget(panel); self.addDockWidget(Qt.RightDockWidgetArea, dock) - - QtWidgets.QShortcut(QtGui.QKeySequence("Ctrl+Z"), self, activated=self.undo) - QtWidgets.QShortcut(QtGui.QKeySequence("Ctrl+Y"), self, activated=self.redo) - QtWidgets.QShortcut(QtGui.QKeySequence("F2"), self, activated=self.fit_view_to_content) - QtWidgets.QShortcut(QtGui.QKeySequence("D"), self, activated=self.start_dimension) - - self.history = []; self.history_index = -1 - self.push_history() - - # ---- palette ---- - def _populate_filters(self): - mfrs = catalog.list_manufacturers(self.devices_all) - types = catalog.list_types(self.devices_all) - self.cmb_mfr.clear(); self.cmb_mfr.addItems(mfrs) - self.cmb_type.clear(); self.cmb_type.addItems(types) - - def _refresh_device_list(self): - q = self.search.text().lower().strip() - want_mfr = self.cmb_mfr.currentText() - want_type = self.cmb_type.currentText() - self.list.clear() - for d in self.devices_all: - if want_mfr and want_mfr != "(Any)" and d.get("manufacturer") != want_mfr: continue - if want_type and want_type != "(Any)" and d.get("type") != want_type: continue - txt = f"{d['name']} ({d['symbol']})" - if q and q not in txt.lower() and q not in (d.get('part_number','').lower()): continue - it = QListWidgetItem(txt); it.setData(Qt.UserRole, d); self.list.addItem(it) - - def choose_device(self, it: QListWidgetItem): - self.view.set_current_device(it.data(Qt.UserRole)); self.statusBar().showMessage(f"Selected: {it.data(Qt.UserRole)['name']}") - - # ---- view toggles ---- - def toggle_grid(self, on: bool): self.scene.show_grid = bool(on); self.scene.update() - def toggle_snap(self, on: bool): self.scene.snap_enabled = bool(on) - def toggle_crosshair(self, on: bool): self.view.show_crosshair = bool(on) - - def set_px_per_ft(self): - val, ok = QtWidgets.QInputDialog.getDouble(self, "Scale", "Pixels per foot", self.px_per_ft, 1.0, 1000.0, 2) - if ok: - self.px_per_ft = float(val) - self.prefs["px_per_ft"] = self.px_per_ft - save_prefs(self.prefs) - self._apply_snap_step_from_inches(self.snap_step_in) - - def _apply_snap_step_from_inches(self, inches: float): - if inches <= 0: - self.scene.snap_step_px = 0.0 - self.snap_label = "grid" - else: - ft = inches / 12.0 - self.scene.snap_step_px = units.ft_to_px(ft, self.px_per_ft) - self.snap_label = f'{int(inches)}"' - self.prefs["snap_step_in"] = inches - self.prefs["snap_label"] = self.snap_label - save_prefs(self.prefs) - - def set_snap_inches(self, inches: float): - self._apply_snap_step_from_inches(inches) - - # ---- scene menu ---- - def canvas_menu(self, global_pos): - menu = QMenu(self) - sel = [it for it in self.scene.selectedItems() if isinstance(it, DeviceItem)] - if sel: - d = sel[0] - act_cov = menu.addAction("Coverage…") - act_tog = menu.addAction("Toggle Coverage On/Off") - act_lbl = menu.addAction("Edit Label…") - act = menu.exec(global_pos) - if act == act_cov: - dlg = CoverageDialog(self, existing=d.coverage) - if dlg.exec() == QtWidgets.QDialog.Accepted: - d.set_coverage(dlg.get_settings()); self.push_history() - elif act == act_tog: - if d.coverage.get("mode","none")=="none": - d.set_coverage({"mode":"manual","radius_ft":25.0,"px_per_ft":self.px_per_ft,"computed_radius_px":25.0*self.px_per_ft}) - else: - d.set_coverage({"mode":"none","computed_radius_px":0.0}) - self.push_history() - elif act == act_lbl: - txt, ok = QtWidgets.QInputDialog.getText(self, "Device Label", "Text:", text=d.name) - if ok: d.set_label_text(txt) - else: - menu.addAction("Clear Underlay", self.clear_underlay) - menu.exec(global_pos) - - # ---- serialize ---- - def serialize_state(self): - devs = [] - for it in self.layer_devices.childItems(): - if isinstance(it, DeviceItem): devs.append(it.to_json()) - return {"grid":int(self.scene.grid_size), "snap":bool(self.scene.snap_enabled), - "px_per_ft": float(self.px_per_ft), - "snap_step_in": float(self.snap_step_in), - "underlay":{"opacity":1.0},"devices":devs,"wires":[]} - - def load_state(self, data): - for it in list(self.layer_devices.childItems()): it.scene().removeItem(it) - for it in list(self.layer_wires.childItems()): it.scene().removeItem(it) - self.scene.snap_enabled = bool(data.get("snap", True)); self.act_view_snap.setChecked(self.scene.snap_enabled) - self.scene.grid_size = int(data.get("grid", DEFAULT_GRID_SIZE)); self.spin_grid.setValue(self.scene.grid_size) - self.px_per_ft = float(data.get("px_per_ft", self.px_per_ft)) - self.snap_step_in = float(data.get("snap_step_in", self.snap_step_in)) - self._apply_snap_step_from_inches(self.snap_step_in) - for d in data.get("devices", []): - it = DeviceItem.from_json(d); it.setParentItem(self.layer_devices) - - def push_history(self): - if self.history_index < len(self.history)-1: self.history = self.history[:self.history_index+1] - self.history.append(self.serialize_state()); self.history_index += 1 - - def undo(self): - if self.history_index>0: - self.history_index-=1; self.load_state(self.history[self.history_index]); self.statusBar().showMessage("Undo") - - def redo(self): - if self.history_index < len(self.history)-1: - self.history_index+=1; self.load_state(self.history[self.history_index]); self.statusBar().showMessage("Redo") - - # ---- underlay ---- - def _build_underlay_path(self, msp): - path = QtGui.QPainterPath() - for e in msp: - t = e.dxftype() - if t=="LINE": - sx,sy,_=e.dxf.start; ex,ey,_=e.dxf.end - path.moveTo(float(sx),float(sy)); path.lineTo(float(ex),float(ey)) - elif t=="CIRCLE": - cx,cy,_=e.dxf.center; r=float(e.dxf.radius); rect=QtCore.QRectF(cx-r, cy-r, 2*r, 2*r); path.addEllipse(rect) - elif t=="ARC": - cx,cy,_=e.dxf.center; r=float(e.dxf.radius) - start=float(e.dxf.start_angle); end=float(e.dxf.end_angle); rect=QtCore.QRectF(cx-r, cy-r, 2*r, 2*r) - path.arcMoveTo(rect, start); path.arcTo(rect, start, end-start) - return path - - def _apply_underlay_path(self, path): - for it in list(self.layer_underlay.childItems()): it.scene().removeItem(it) - pen=QtGui.QPen(Qt.darkGray); pen.setCosmetic(True); pen.setWidthF(0) - item=QGraphicsPathItem(path); item.setPen(pen); item.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, False); item.setParentItem(self.layer_underlay) - - def _load_underlay(self, path): - try: - import ezdxf - except Exception as ex: - QMessageBox.critical(self,"DXF Import Error","DXF support (ezdxf) is not available in this build.\n\n"+str(ex)) - return - try: - doc = ezdxf.readfile(path); msp = doc.modelspace(); p = self._build_underlay_path(msp); self._apply_underlay_path(p) - except Exception as ex: - QMessageBox.critical(self,"DXF Import Error", str(ex)) - - def import_dxf_underlay(self): - p,_ = QFileDialog.getOpenFileName(self,"Import DXF Underlay","","DXF Files (*.dxf)") - if not p: return - self._load_underlay(p) - - def clear_underlay(self): - for it in list(self.layer_underlay.childItems()): it.scene().removeItem(it) - - def new_project(self): - self.clear_underlay() - for it in list(self.layer_devices.childItems()): it.scene().removeItem(it) - for it in list(self.layer_wires.childItems()): it.scene().removeItem(it) - self.push_history(); self.statusBar().showMessage("New project") - - def save_project_as(self): - p,_=QFileDialog.getSaveFileName(self,"Save Project As","","AutoFire Bundle (*.autofire)") - if not p: return - if not p.lower().endswith(".autofire"): p += ".autofire" - try: - data=self.serialize_state() - with zipfile.ZipFile(p,"w",compression=zipfile.ZIP_DEFLATED) as z: - z.writestr("project.json", json.dumps(data, indent=2)) - self.statusBar().showMessage(f"Saved: {os.path.basename(p)}") - except Exception as ex: - QMessageBox.critical(self,"Save Project Error", str(ex)) - - def open_project(self): - p,_=QFileDialog.getOpenFileName(self,"Open Project","","AutoFire Bundle (*.autofire)") - if not p: return - try: - with zipfile.ZipFile(p,"r") as z: - data=json.loads(z.read("project.json").decode("utf-8")) - self.load_state(data); self.push_history(); self.statusBar().showMessage(f"Opened: {os.path.basename(p)}") - except Exception as ex: - QMessageBox.critical(self,"Open Project Error", str(ex)) - - def change_grid_size(self, v: int): - self.scene.grid_size = int(v); self.scene.update() - - def fit_view_to_content(self): - rect=self.scene.itemsBoundingRect().adjusted(-100,-100,100,100) - if rect.isNull(): rect=QtCore.QRectF(0,0,1000,800) - self.view.fitInView(rect, Qt.KeepAspectRatio) - - def start_dimension(self): - self.dim_tool.start() - - def show_about(self): - QtWidgets.QMessageBox.information(self,"About", f"Auto-Fire\nVersion {APP_VERSION}") - -def main(): - app = QApplication([]) - win = MainWindow(); win.show() - app.exec() - -if __name__ == "__main__": - main() diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/main.py.bak_20250908_211210 b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/main.py.bak_20250908_211210 deleted file mode 100644 index 7a51ddd..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/main.py.bak_20250908_211210 +++ /dev/null @@ -1,588 +0,0 @@ - -import os, json, zipfile - -from PySide6 import QtCore, QtGui, QtWidgets -from PySide6.QtCore import Qt, QPointF, QSize -from PySide6.QtWidgets import ( - QApplication, QMainWindow, QWidget, QHBoxLayout, QVBoxLayout, - QListWidget, QListWidgetItem, QLineEdit, QLabel, QToolBar, QFileDialog, - QGraphicsView, QGraphicsPathItem, QMenu, QDockWidget, QCheckBox, QSpinBox, QComboBox, QMessageBox -) -from PySide6.QtPrintSupport import QPrinter, QPrintDialog - -from app.scene import GridScene, DEFAULT_GRID_SIZE -from app.device import DeviceItem -from app import catalog -from app.tools import draw as draw_tools -from app.layout import PageFrame, PAGE_SIZES -from app.tools.array import ArraySpec, fill_rect_with_points - -try: - from app.tools.dimension import DimensionTool -except Exception: - class DimensionTool: - def __init__(self, *a, **k): self.active=False - def start(self): self.active=True - def on_mouse_move(self, *a, **k): pass - def on_click(self, *a, **k): self.active=False; return True - -APP_VERSION = "0.6.1-placefix" -APP_TITLE = f"Auto-Fire {APP_VERSION}" -from app import units - -PREF_DIR = os.path.join(os.path.expanduser("~"), "AutoFire") -PREF_PATH = os.path.join(PREF_DIR, "preferences.json") -LOG_DIR = os.path.join(PREF_DIR, "logs") - -def ensure_pref_dir(): - try: - os.makedirs(PREF_DIR, exist_ok=True); os.makedirs(LOG_DIR, exist_ok=True) - except Exception: - pass - -def load_prefs(): - ensure_pref_dir() - if os.path.exists(PREF_PATH): - try: - with open(PREF_PATH, "r", encoding="utf-8") as f: - return json.load(f) - except Exception: - pass - return {} - -def save_prefs(p): - ensure_pref_dir() - try: - with open(PREF_PATH, "w", encoding="utf-8") as f: - json.dump(p, f, indent=2) - except Exception: - pass - -def apply_theme(theme: str): - app = QtWidgets.QApplication.instance() - if not app: return - if (theme or "").lower() == "light": - app.setPalette(app.style().standardPalette()) - return - pal = QtGui.QPalette() - pal.setColor(QtGui.QPalette.Window, QtGui.QColor(53,53,53)) - pal.setColor(QtGui.QPalette.WindowText, Qt.white) - pal.setColor(QtGui.QPalette.Base, QtGui.QColor(35,35,35)) - pal.setColor(QtGui.QPalette.AlternateBase, QtGui.QColor(53,53,53)) - pal.setColor(QtGui.QPalette.ToolTipBase, Qt.white) - pal.setColor(QtGui.QPalette.ToolTipText, Qt.white) - pal.setColor(QtGui.QPalette.Text, Qt.white) - pal.setColor(QtGui.QPalette.Button, QtGui.QColor(53,53,53)) - pal.setColor(QtGui.QPalette.ButtonText, Qt.white) - pal.setColor(QtGui.QPalette.BrightText, Qt.red) - pal.setColor(QtGui.QPalette.Highlight, QtGui.QColor(42,130,218)) - pal.setColor(QtGui.QPalette.HighlightedText, Qt.black) - app.setPalette(pal) - -class CanvasView(QGraphicsView): - def __init__(self, scene, devices_group, wires_group, sketch_group, overlay_group, window_ref): - super().__init__(scene) - self.setRenderHints(QtGui.QPainter.Antialiasing | QtGui.QPainter.TextAntialiasing) - self.setDragMode(QGraphicsView.RubberBandDrag) - self.setMouseTracking(True) - self.current_proto = None - self.devices_group = devices_group - self.wires_group = wires_group - self.sketch_group = sketch_group - self.overlay_group = overlay_group - self.ortho = False - self.win = window_ref - - # Area-array interaction - self.area_array_active = False - self.area_first = None - self.area_rubber = QtWidgets.QGraphicsRectItem() - pen = QtGui.QPen(QtGui.QColor(120,200,255,200)); pen.setStyle(Qt.DashLine); pen.setCosmetic(True) - self.area_rubber.setPen(pen); self.area_rubber.setBrush(QtGui.QColor(120,200,255,40)) - self.area_rubber.setZValue(500); self.area_rubber.setVisible(False) - self.area_rubber.setParentItem(self.overlay_group) - - # Crosshair - self.cross_v = QtWidgets.QGraphicsLineItem(); self.cross_h = QtWidgets.QGraphicsLineItem() - pen2 = QtGui.QPen(QtGui.QColor(160,160,160,190)); pen2.setCosmetic(True); pen2.setStyle(Qt.DashLine) - self.cross_v.setPen(pen2); self.cross_h.setPen(pen2) - self.cross_v.setParentItem(self.overlay_group); self.cross_h.setParentItem(self.overlay_group) - self.show_crosshair = True - - def set_current_device(self, proto: dict): - self.current_proto = proto - if proto: - self.win.statusBar().showMessage(f"Ready to place: {proto.get('name','Device')} — click on canvas", 3500) - - def _update_crosshair(self, sp: QPointF): - if not self.show_crosshair: return - rect = self.scene().sceneRect() - self.cross_v.setLine(sp.x(), rect.top(), sp.x(), rect.bottom()) - self.cross_h.setLine(rect.left(), sp.y(), rect.right(), sp.y()) - from app import units as _u - dx_ft = _u.px_to_ft(sp.x(), self.win.px_per_ft) - dy_ft = _u.px_to_ft(sp.y(), self.win.px_per_ft) - self.win.statusBar().showMessage(f"x={_u.fmt_ft_inches(dx_ft)} y={_u.fmt_ft_inches(dy_ft)} scale={self.win.px_per_ft:.2f} px/ft snap={self.win.snap_label}") - - def wheelEvent(self, e: QtGui.QWheelEvent): - s = 1.15 if e.angleDelta().y() > 0 else 1/1.15 - self.scale(s, s) - - def keyPressEvent(self, e: QtGui.QKeyEvent): - if e.key()==Qt.Key_Shift: self.ortho=True; e.accept(); return - if e.key()==Qt.Key_C: self.show_crosshair = not self.show_crosshair; e.accept(); return - if e.key()==Qt.Key_G: self.win.set_generic_proto(); e.accept(); return - if e.key()==Qt.Key_Delete: self.win.delete_selected(); e.accept(); return - if e.key()==Qt.Key_R: self.win.rotate_selected(); e.accept(); return - if e.key()==Qt.Key_Escape: - if self.area_array_active: - self.area_array_active=False; self.area_first=None; self.area_rubber.setVisible(False); e.accept(); return - if getattr(self.win, "draw", None): self.win.draw.finish(); e.accept(); return - super().keyPressEvent(e) - - def mousePressEvent(self, e: QtGui.QMouseEvent): - sp = self.scene().snap(self.mapToScene(e.position().toPoint())) - if e.button()==Qt.RightButton: - self.win.canvas_menu(e.globalPosition().toPoint()); e.accept(); return - - if e.button()==Qt.LeftButton: - # Priority: area-array, drawing, dimension, placement - if self.area_array_active: - if self.area_first is None: - self.area_first = sp - self.win.statusBar().showMessage("Array: pick opposite corner (Esc to cancel)") - else: - rect = QtCore.QRectF(self.area_first, sp).normalized() - self.area_array_active=False; self.area_first=None; self.area_rubber.setVisible(False) - self.win.place_array_in_rect(rect) - e.accept(); return - - if getattr(self.win, "draw", None) and self.win.draw.mode != 0: - if self.win.draw.on_click(sp, shift_ortho=self.ortho): - self.win.push_history(); e.accept(); return - - if getattr(self.win, "dim_tool", None) and self.win.dim_tool.active: - if self.win.dim_tool.on_click(sp): - e.accept(); return - - # If clicking on an existing item, don't place a new one - under = self.items(e.position().toPoint()) - if any(isinstance(x, QtWidgets.QGraphicsItem) and not isinstance(x, QtWidgets.QGraphicsPixmapItem) and x is not self.area_rubber for x in under): - super().mousePressEvent(e) - return - - # Place device (always works, even if no catalog) - d = self.current_proto or {"symbol":"GEN","name":"Generic Device","manufacturer":"Generic","part_number":""} - it = DeviceItem(sp.x(), sp.y(), d.get("symbol","?"), d.get("name","Device"), d.get("manufacturer",""), d.get("part_number","")) - it.setParentItem(self.devices_group) - self.win.push_history() - e.accept(); return - - super().mousePressEvent(e) - - def mouseMoveEvent(self, e: QtGui.QMouseEvent): - sp = self.mapToScene(e.position().toPoint()) - self._update_crosshair(sp) - if self.area_array_active and self.area_first is not None: - rect = QtCore.QRectF(self.area_first, sp).normalized() - self.area_rubber.setRect(rect); self.area_rubber.setVisible(True) - if getattr(self.win, "draw", None): self.win.draw.on_mouse_move(sp, shift_ortho=self.ortho) - if getattr(self.win, "dim_tool", None): self.win.dim_tool.on_mouse_move(sp) - super().mouseMoveEvent(e) - -class MainWindow(QMainWindow): - def __init__(self): - super().__init__() - self.setWindowTitle(APP_TITLE) - self.resize(1400, 900) - self.prefs = load_prefs() - self.px_per_ft = float(self.prefs.get("px_per_ft", 12.0)) - self.snap_label = self.prefs.get("snap_label", "grid") - self.snap_step_in = float(self.prefs.get("snap_step_in", 0.0)) - - self.devices_all = catalog.load_catalog() - - self.scene = GridScene(int(self.prefs.get("grid", DEFAULT_GRID_SIZE)), 0,0,10000,8000) - self.scene.snap_enabled = bool(self.prefs.get("snap", True)) - self._apply_snap_step_from_inches(self.snap_step_in) - - self.layer_underlay = QtWidgets.QGraphicsItemGroup(); self.layer_underlay.setZValue(-10); self.scene.addItem(self.layer_underlay) - self.layer_sketch = QtWidgets.QGraphicsItemGroup(); self.layer_sketch.setZValue(40); self.scene.addItem(self.layer_sketch) - self.layer_wires = QtWidgets.QGraphicsItemGroup(); self.layer_wires.setZValue(60); self.scene.addItem(self.layer_wires) - self.layer_devices = QtWidgets.QGraphicsItemGroup(); self.layer_devices.setZValue(100); self.scene.addItem(self.layer_devices) - self.layer_overlay = QtWidgets.QGraphicsItemGroup(); self.layer_overlay.setZValue(200); self.scene.addItem(self.layer_overlay) - - self.view = CanvasView(self.scene, self.layer_devices, self.layer_wires, self.layer_sketch, self.layer_overlay, self) - - self.draw = draw_tools.DrawController(self, self.layer_sketch) - try: - self.dim_tool = DimensionTool(self, self.layer_overlay) - except Exception: - self.dim_tool = None - - menubar = self.menuBar() - m_file = menubar.addMenu("&File") - m_file.addAction("New", self.new_project, QtGui.QKeySequence.New) - m_file.addAction("Open…", self.open_project, QtGui.QKeySequence.Open) - m_file.addAction("Save As…", self.save_project_as, QtGui.QKeySequence.SaveAs) - m_file.addSeparator() - m_file.addAction("Import DXF Underlay…", self.import_dxf_underlay) - m_file.addAction("Import Image Underlay…", self.import_image_underlay) - m_file.addSeparator() - m_file.addAction("Quit", self.close, QtGui.QKeySequence.Quit) - - m_tools = menubar.addMenu("&Tools") - def add_tool(name, cb): - act = QtGui.QAction(name, self); act.triggered.connect(cb); m_tools.addAction(act); return act - self.act_draw_line = add_tool("Draw Line", lambda: self.draw.set_mode(draw_tools.DrawMode.LINE)) - self.act_draw_rect = add_tool("Draw Rect", lambda: self.draw.set_mode(draw_tools.DrawMode.RECT)) - self.act_draw_circle = add_tool("Draw Circle", lambda: self.draw.set_mode(draw_tools.DrawMode.CIRCLE)) - self.act_draw_poly = add_tool("Draw Polyline",lambda: self.draw.set_mode(draw_tools.DrawMode.POLYLINE)) - m_tools.addSeparator() - m_tools.addAction("Array in Area…", self.start_area_array) - if self.dim_tool: - m_tools.addAction("Dimension (D)", self.start_dimension) - - m_view = menubar.addMenu("&View") - self.act_view_grid = QtGui.QAction("Grid", self, checkable=True); self.act_view_grid.setChecked(True); self.act_view_grid.toggled.connect(self.toggle_grid); m_view.addAction(self.act_view_grid) - self.act_view_snap = QtGui.QAction("Snap", self, checkable=True); self.act_view_snap.setChecked(self.scene.snap_enabled); self.act_view_snap.toggled.connect(self.toggle_snap); m_view.addAction(self.act_view_snap) - self.act_view_cross = QtGui.QAction("Crosshair (C)", self, checkable=True); self.act_view_cross.setChecked(True); self.act_view_cross.toggled.connect(self.toggle_crosshair); m_view.addAction(self.act_view_cross) - m_view.addSeparator() - act_scale = QtGui.QAction("Set Pixels per Foot…", self); act_scale.triggered.connect(self.set_px_per_ft); m_view.addAction(act_scale) - - m_help = menubar.addMenu("&Help") - m_help.addAction("About AutoFire…", self.show_about) - - tb = QToolBar("Main"); tb.setIconSize(QSize(16,16)); self.addToolBar(tb) - tb.addAction(self.act_view_grid); tb.addAction(self.act_view_snap); tb.addAction(self.act_view_cross) - - left = QWidget(); ll = QVBoxLayout(left) - ll.addWidget(QLabel("Device Palette")) - self.search = QLineEdit(); self.search.setPlaceholderText("Search name / part number…") - self.cmb_mfr = QComboBox(); self.cmb_type = QComboBox() - ll_top = QHBoxLayout(); ll_top.addWidget(QLabel("Manufacturer:")); ll_top.addWidget(self.cmb_mfr) - ll_typ = QHBoxLayout(); ll_typ.addWidget(QLabel("Type:")); ll_typ.addWidget(self.cmb_type) - self.list = QListWidget() - ll.addLayout(ll_top); ll.addLayout(ll_typ); ll.addWidget(self.search); ll.addWidget(self.list) - - self.devices_all = self.devices_all or [] - self._populate_filters(); self._refresh_device_list() - self.search.textChanged.connect(self._refresh_device_list) - self.cmb_mfr.currentIndexChanged.connect(self._refresh_device_list) - self.cmb_type.currentIndexChanged.connect(self._refresh_device_list) - self.list.itemClicked.connect(self.choose_device) - - # Select first device by default (else generic) - if self.list.count() > 0: - self.list.setCurrentRow(0) - self.choose_device(self.list.item(0)) - else: - self.set_generic_proto() - - splitter = QtWidgets.QSplitter(); splitter.addWidget(left); splitter.addWidget(self.view); splitter.setStretchFactor(1,1) - container = QWidget(); lay = QHBoxLayout(container); lay.addWidget(splitter); self.setCentralWidget(container) - - dock = QDockWidget("Layers / Controls", self); panel = QWidget(); form = QVBoxLayout(panel) - self.chk_underlay = QCheckBox("Underlay"); self.chk_underlay.setChecked(True); self.chk_underlay.toggled.connect(lambda v: self.layer_underlay.setVisible(v)); form.addWidget(self.chk_underlay) - self.chk_sketch = QCheckBox("Sketch"); self.chk_sketch.setChecked(True); self.chk_sketch.toggled.connect(lambda v: self.layer_sketch.setVisible(v)); form.addWidget(self.chk_sketch) - self.chk_wires = QCheckBox("Wiring"); self.chk_wires.setChecked(True); self.chk_wires.toggled.connect(lambda v: self.layer_wires.setVisible(v)); form.addWidget(self.chk_wires) - self.chk_devices = QCheckBox("Devices"); self.chk_devices.setChecked(True); self.chk_devices.toggled.connect(lambda v: self.layer_devices.setVisible(v)); form.addWidget(self.chk_devices) - form.addWidget(QLabel("Grid Size")) - self.spin_grid = QSpinBox(); self.spin_grid.setRange(2, 500); self.spin_grid.setValue(self.scene.grid_size); self.spin_grid.valueChanged.connect(self.change_grid_size); form.addWidget(self.spin_grid) - panel.setLayout(form); dock.setWidget(panel); self.addDockWidget(Qt.RightDockWidgetArea, dock) - - # SHORTCUTS - QtGui.QShortcut(QtGui.QKeySequence("Ctrl+Z"), self, activated=self.undo) - QtGui.QShortcut(QtGui.QKeySequence("Ctrl+Y"), self, activated=self.redo) - if self.dim_tool: - QtGui.QShortcut(QtGui.QKeySequence("D"), self, activated=self.start_dimension) - QtGui.QShortcut(QtGui.QKeySequence("Delete"), self, activated=self.delete_selected) - QtGui.QShortcut(QtGui.QKeySequence("Ctrl+D"), self, activated=self.duplicate_selected) - QtGui.QShortcut(QtGui.QKeySequence("G"), self, activated=self.set_generic_proto) - - self.history = []; self.history_index = -1 - self.push_history() - - # ---- palette ---- - def _populate_filters(self): - def list_mfrs(devs): - s = set(d.get("manufacturer","") for d in devs if d.get("manufacturer")) - return ["(Any)"] + sorted(s) if s else ["(Any)"] - def list_types(devs): - s = set(d.get("type","") for d in devs if d.get("type")) - return ["(Any)"] + sorted(s) if s else ["(Any)"] - - mfrs = list_mfrs(self.devices_all) - types = list_types(self.devices_all) - self.cmb_mfr.clear(); self.cmb_mfr.addItems(mfrs) - self.cmb_type.clear(); self.cmb_type.addItems(types) - - def _refresh_device_list(self): - q = self.search.text().lower().strip() - want_mfr = self.cmb_mfr.currentText() - want_type = self.cmb_type.currentText() - self.list.clear() - for d in self.devices_all: - if want_mfr and want_mfr != "(Any)" and d.get("manufacturer") != want_mfr: continue - if want_type and want_type != "(Any)" and d.get("type") != want_type: continue - txt = f"{d.get('name','Device')} ({d.get('symbol','?')})" - if q and q not in txt.lower() and q not in (d.get('part_number','').lower()): continue - it = QListWidgetItem(txt); it.setData(Qt.UserRole, d); self.list.addItem(it) - - def choose_device(self, it: QListWidgetItem): - self.view.set_current_device(it.data(Qt.UserRole)); self.statusBar().showMessage(f"Selected: {it.data(Qt.UserRole).get('name','Device')}") - - # ---- tools ---- - def start_area_array(self): - self.view.area_array_active = True - self.view.area_first = None - self.statusBar().showMessage("Array: click first corner, then opposite corner (Esc to cancel)") - - def place_array_in_rect(self, rect: QtCore.QRectF): - proto = self.view.current_proto or {"symbol":"GEN","name":"Generic Device","manufacturer":"Generic","part_number":""} - spacing_ft = self.snap_step_in/12.0 if self.snap_step_in>0 else 10.0 - pts = fill_rect_with_points(rect, self.px_per_ft, ArraySpec(spacing_ft=spacing_ft)) - for p in pts: - it = DeviceItem(p.x(), p.y(), proto.get("symbol","?"), proto.get("name","Device"), proto.get("manufacturer",""), proto.get("part_number","")) - it.setParentItem(self.layer_devices) - self.push_history() - self.statusBar().showMessage(f"Placed {len(pts)} devices") - - # ---- view toggles ---- - def toggle_grid(self, on: bool): self.scene.show_grid = bool(on); self.scene.update() - def toggle_snap(self, on: bool): self.scene.snap_enabled = bool(on) - def toggle_crosshair(self, on: bool): self.view.show_crosshair = bool(on) - - def set_px_per_ft(self): - val, ok = QtWidgets.QInputDialog.getDouble(self, "Scale", "Pixels per foot", self.px_per_ft, 1.0, 1000.0, 2) - if ok: - self.px_per_ft = float(val) - self.prefs["px_per_ft"] = self.px_per_ft - save_prefs(self.prefs) - self._apply_snap_step_from_inches(self.snap_step_in) - - def _apply_snap_step_from_inches(self, inches: float): - if inches <= 0: - self.scene.snap_step_px = 0.0 - self.snap_label = "grid" - else: - ft = inches / 12.0 - self.scene.snap_step_px = (ft * self.px_per_ft) - self.snap_label = f'{int(inches)}"' - self.prefs["snap_step_in"] = inches - self.prefs["snap_label"] = self.snap_label - save_prefs(self.prefs) - - def set_snap_inches(self, inches: float): - self._apply_snap_step_from_inches(inches) - - # ---- context menu ---- - def canvas_menu(self, global_pos): - menu = QMenu(self) - sel = [it for it in self.scene.selectedItems() if isinstance(it, DeviceItem)] - if sel: - d = sel[0] - act_prop = menu.addAction("Properties…") - act_dup = menu.addAction("Duplicate") - act_del = menu.addAction("Delete") - act_front = menu.addAction("Bring to Front") - act_back = menu.addAction("Send to Back") - act_lock = menu.addAction("Lock" if not getattr(d, "locked", False) else "Unlock") - - act = menu.exec(global_pos) - if act == act_prop: - self.edit_device(d) - elif act == act_dup: - self.duplicate_selected() - elif act == act_del: - self.delete_selected() - elif act == act_front: - d.setZValue(d.zValue()+10); self.push_history() - elif act == act_back: - d.setZValue(d.zValue()-10); self.push_history() - elif act == act_lock: - d.set_locked(not getattr(d, "locked", False)); self.push_history() - else: - menu.addAction("Array in Area…", self.start_area_array) - menu.addAction("Clear Underlay", self.clear_underlay) - menu.exec(global_pos) - - def edit_device(self, item: DeviceItem): - try: - from app.dialogs.device_props import DevicePropsDialog - except Exception: - QMessageBox.information(self, "Properties", "Properties dialog unavailable in this build.") - return - dlg = DevicePropsDialog(self, item, self.px_per_ft) - if dlg.exec() == QtWidgets.QDialog.Accepted: - v = dlg.values() - item.set_label_text(v["name"] or item.name) - item.name = v["name"] or item.name - item.symbol = v["symbol"] or item.symbol - item.manufacturer = v["manufacturer"] or item.manufacturer - item.part_number = v["part_number"] or item.part_number - dx, dy = v["label_offset_px"]; item.set_label_offset(dx, dy) - self.push_history() - - # ---- serialize ---- - def serialize_state(self): - devs = [] - for it in self.layer_devices.childItems(): - if isinstance(it, DeviceItem): devs.append(it.to_json()) - return {"grid":int(self.scene.grid_size), "snap":bool(self.scene.snap_enabled), - "px_per_ft": float(self.px_per_ft), - "snap_step_in": float(self.snap_step_in), - "underlay":{"opacity":1.0},"devices":devs,"wires":[]} - - def load_state(self, data): - for it in list(self.layer_devices.childItems()): it.scene().removeItem(it) - for it in list(self.layer_wires.childItems()): it.scene().removeItem(it) - self.scene.snap_enabled = bool(data.get("snap", True)); self.act_view_snap.setChecked(self.scene.snap_enabled) - self.scene.grid_size = int(data.get("grid", DEFAULT_GRID_SIZE)); self.spin_grid.setValue(self.scene.grid_size) - self.px_per_ft = float(data.get("px_per_ft", self.px_per_ft)) - self.snap_step_in = float(data.get("snap_step_in", self.snap_step_in)) - self._apply_snap_step_from_inches(self.snap_step_in) - for d in data.get("devices", []): - it = DeviceItem.from_json(d); it.setParentItem(self.layer_devices) - - def push_history(self): - if self.history_index < len(self.history)-1: self.history = self.history[:self.history_index+1] - self.history.append(self.serialize_state()); self.history_index += 1 - - def undo(self): - if self.history_index>0: - self.history_index-=1; self.load_state(self.history[self.history_index]); self.statusBar().showMessage("Undo") - - def redo(self): - if self.history_index < len(self.history)-1: - self.history_index+=1; self.load_state(self.history[self.history_index]); self.statusBar().showMessage("Redo") - - # ---- underlay ---- - def _build_underlay_path(self, msp): - path = QtGui.QPainterPath() - for e in msp: - t = e.dxftype() - if t=="LINE": - sx,sy,_=e.dxf.start; ex,ey,_=e.dxf.end - path.moveTo(float(sx),float(sy)); path.lineTo(float(ex),float(ey)) - elif t=="CIRCLE": - cx,cy,_=e.dxf.center; r=float(e.dxf.radius); rect=QtCore.QRectF(cx-r, cy-r, 2*r, 2*r); path.addEllipse(rect) - elif t=="ARC": - cx,cy,_=e.dxf.center; r=float(e.dxf.radius) - start=float(e.dxf.start_angle); end=float(e.dxf.end_angle); rect=QtCore.QRectF(cx-r, cy-r, 2*r, 2*r) - path.arcMoveTo(rect, start); path.arcTo(rect, start, end-start) - return path - - def _apply_underlay_path(self, path): - for it in list(self.layer_underlay.childItems()): it.scene().removeItem(it) - pen=QtGui.QPen(Qt.darkGray); pen.setCosmetic(True); pen.setWidthF(0) - item=QGraphicsPathItem(path); item.setPen(pen); item.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, False); item.setParentItem(self.layer_underlay) - - def _load_underlay(self, path): - try: - import ezdxf - except Exception as ex: - QMessageBox.critical(self,"DXF Import Error","DXF support (ezdxf) is not available in this build.\n\n"+str(ex)) - return - try: - doc = ezdxf.readfile(path); msp = doc.modelspace(); p = self._build_underlay_path(msp); self._apply_underlay_path(p) - except Exception as ex: - QMessageBox.critical(self,"DXF Import Error", str(ex)) - - def import_dxf_underlay(self): - p,_ = QFileDialog.getOpenFileName(self,"Import DXF Underlay","","DXF Files (*.dxf)") - if not p: return - self._load_underlay(p) - - def import_image_underlay(self): - p,_ = QFileDialog.getOpenFileName(self,"Import Image Underlay","","Images (*.png *.jpg *.jpeg *.bmp *.tif *.tiff)") - if not p: return - img = QtGui.QImage(p) - if img.isNull(): - QMessageBox.critical(self,"Image Import Error","Could not read the selected image.") - return - pix = QtGui.QPixmap.fromImage(img) - item = QtWidgets.QGraphicsPixmapItem(pix) - item.setOpacity(0.85) - item.setZValue(-15) - item.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True) - item.setParentItem(self.layer_underlay) - - def clear_underlay(self): - for it in list(self.layer_underlay.childItems()): it.scene().removeItem(it) - - def new_project(self): - self.clear_underlay() - for it in list(self.layer_devices.childItems()): it.scene().removeItem(it) - for it in list(self.layer_wires.childItems()): it.scene().removeItem(it) - self.push_history(); self.statusBar().showMessage("New project") - - def save_project_as(self): - p,_=QFileDialog.getSaveFileName(self,"Save Project As","","AutoFire Bundle (*.autofire)") - if not p: return - if not p.lower().endswith(".autofire"): p += ".autofire" - try: - data=self.serialize_state() - with zipfile.ZipFile(p,"w",compression=zipfile.ZIP_DEFLATED) as z: - z.writestr("project.json", json.dumps(data, indent=2)) - self.statusBar().showMessage(f"Saved: {os.path.basename(p)}") - except Exception as ex: - QMessageBox.critical(self,"Save Project Error", str(ex)) - - def open_project(self): - p,_=QFileDialog.getOpenFileName(self,"Open Project","","AutoFire Bundle (*.autofire)") - if not p: return - try: - with zipfile.ZipFile(p,"r") as z: - data=json.loads(z.read("project.json").decode("utf-8")) - self.load_state(data); self.push_history(); self.statusBar().showMessage(f"Opened: {os.path.basename(p)}") - except Exception as ex: - QMessageBox.critical(self,"Open Project Error", str(ex)) - - def change_grid_size(self, v: int): - self.scene.grid_size = int(v); self.scene.update() - - def fit_view_to_content(self): - rect=self.scene.itemsBoundingRect().adjusted(-100,-100,100,100) - if rect.isNull(): rect=QtCore.QRectF(0,0,1000,800) - self.view.fitInView(rect, Qt.KeepAspectRatio) - - def start_dimension(self): - if self.dim_tool: self.dim_tool.start() - - # Selection ops - def delete_selected(self): - for it in list(self.scene.selectedItems()): - if isinstance(it, DeviceItem) and getattr(it, "locked", False): - continue - it.scene().removeItem(it) - self.push_history() - - def duplicate_selected(self): - sel = [it for it in self.scene.selectedItems() if isinstance(it, DeviceItem)] - for d in sel: - it = DeviceItem(d.pos().x()+10, d.pos().y()+10, d.symbol, d.name, d.manufacturer, d.part_number) - it.setParentItem(self.layer_devices) - self.push_history() - - def set_generic_proto(self): - self.view.set_current_device({"symbol":"GEN","name":"Generic Device","manufacturer":"Generic","part_number":""}) - - def show_about(self): - QtWidgets.QMessageBox.information(self,"About", f"Auto-Fire\nVersion {APP_VERSION}") - -# factory used by boot.py -def create_window(): - return MainWindow() - -def main(): - app = QApplication([]) - # theme - prefs = load_prefs() - apply_theme(prefs.get("theme","dark")) - win = create_window() - win.show() - app.exec() - -if __name__ == "__main__": - main() diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/main_startup_safety.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/main_startup_safety.py deleted file mode 100644 index 50f1323..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/main_startup_safety.py +++ /dev/null @@ -1,11 +0,0 @@ - -# app/main_startup_safety.py -# This companion module is imported by app/main.py near startup in your last patch. -# If you want to avoid editing main.py directly, this pattern is easy to ship: -def ensure_startup_proto(win): - try: - # If nothing selected, pick Generic so placement always works. - if not getattr(win.view, "current_proto", None): - win.set_generic_proto() - except Exception: - pass diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/minwin.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/minwin.py deleted file mode 100644 index 99bc081..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/minwin.py +++ /dev/null @@ -1,17 +0,0 @@ -from PySide6 import QtWidgets, QtCore -from app.scene import GridScene - -class MinimalMainWindow(QtWidgets.QMainWindow): - def __init__(self): - super().__init__() - self.setWindowTitle("Auto-Fire — Minimal Window (Fallback)") - self.resize(1000, 700) - view = QtWidgets.QGraphicsView(GridScene(20, 0,0,2000,1200)) - self.setCentralWidget(view) - self.statusBar().showMessage("Fallback window loaded. If you see this, main UI didn't start.") - -def run_minimal(): - app = QtWidgets.QApplication.instance() or QtWidgets.QApplication([]) - win = MinimalMainWindow() - win.show() - app.exec() \ No newline at end of file diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/scene.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/scene.py deleted file mode 100644 index 022b5bf..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/scene.py +++ /dev/null @@ -1,42 +0,0 @@ - -from PySide6 import QtCore, QtGui, QtWidgets - -DEFAULT_GRID_SIZE = 40 # pixels - -class GridScene(QtWidgets.QGraphicsScene): - def __init__(self, grid_size=DEFAULT_GRID_SIZE, *args): - super().__init__(*args) - self.grid_size = int(grid_size or DEFAULT_GRID_SIZE) - self.snap_enabled = True - self.snap_step_px = 0.0 # if >0, override grid with exact inch-step in px - self.show_grid = True - self.setSceneRect(0,0,12000,9000) - - def drawBackground(self, painter: QtGui.QPainter, rect: QtCore.QRectF): - if not self.show_grid: return - grid = self.grid_size - left = int(rect.left()) - (int(rect.left()) % grid) - top = int(rect.top()) - (int(rect.top()) % grid) - lines = [] - for x in range(left, int(rect.right())+grid, grid): - lines.append(QtCore.QLineF(x, rect.top(), x, rect.bottom())) - for y in range(top, int(rect.bottom())+grid, grid): - lines.append(QtCore.QLineF(rect.left(), y, rect.right(), y)) - pen = QtGui.QPen(QtGui.QColor(90,90,90)) - pen.setCosmetic(True) - painter.setPen(pen) - painter.drawLines(lines) - - def snap(self, p: QtCore.QPointF) -> QtCore.QPointF: - if not self.snap_enabled: - return QtCore.QPointF(p) - # fine step snap - if self.snap_step_px and self.snap_step_px > 0: - sx = round(p.x() / self.snap_step_px) * self.snap_step_px - sy = round(p.y() / self.snap_step_px) * self.snap_step_px - return QtCore.QPointF(sx, sy) - # grid intersections - g = float(self.grid_size or DEFAULT_GRID_SIZE) - sx = round(p.x() / g) * g - sy = round(p.y() / g) * g - return QtCore.QPointF(sx, sy) diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/scene.py.bak b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/scene.py.bak deleted file mode 100644 index ff18e53..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/scene.py.bak +++ /dev/null @@ -1,35 +0,0 @@ -from PySide6 import QtCore, QtGui, QtWidgets - -DEFAULT_GRID_SIZE = 24 # pixels between grid lines (visual only) - -class GridScene(QtWidgets.QGraphicsScene): - def __init__(self, grid_size: int, *args): - super().__init__(*args) - self.grid_size = int(grid_size) if grid_size and grid_size > 1 else DEFAULT_GRID_SIZE - self.show_grid = True - self.snap_enabled = True - self.snap_step_px = 0.0 # when >0, snap to this increment instead of grid intersections - - def drawBackground(self, painter: QtGui.QPainter, rect: QtCore.QRectF): - if not self.show_grid: - painter.fillRect(rect, QtGui.QColor(250, 250, 250)) - return - painter.fillRect(rect, QtGui.QColor(252, 252, 252)) - left = int(rect.left()) - (int(rect.left()) % self.grid_size) - top = int(rect.top()) - (int(rect.top()) % self.grid_size) - lines = [] - for x in range(left, int(rect.right())+self.grid_size, self.grid_size): - lines.append(QtCore.QLineF(x, rect.top(), x, rect.bottom())) - for y in range(top, int(rect.bottom())+self.grid_size, self.grid_size): - lines.append(QtCore.QLineF(rect.left(), y, rect.right(), y)) - pen = QtGui.QPen(QtGui.QColor(230, 230, 230)); pen.setCosmetic(True) - painter.setPen(pen); painter.drawLines(lines) - - def snap(self, pt: QtCore.QPointF) -> QtCore.QPointF: - if not self.snap_enabled: - return pt - if self.snap_step_px and self.snap_step_px > 0: - step = float(self.snap_step_px) - return QtCore.QPointF(round(pt.x()/step)*step, round(pt.y()/step)*step) - gx = self.grid_size - return QtCore.QPointF(round(pt.x()/gx)*gx, round(pt.y()/gx)*gx) diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/settings.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/settings.py deleted file mode 100644 index e35152c..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/settings.py +++ /dev/null @@ -1,35 +0,0 @@ - -from PySide6 import QtCore, QtGui, QtWidgets - -class SettingsDialog(QtWidgets.QDialog): - def __init__(self, parent=None, init=None): - super().__init__(parent) - self.setWindowTitle("Settings") - init = init or {} - form = QtWidgets.QFormLayout(self) - - self.chk_grid = QtWidgets.QCheckBox(); self.chk_grid.setChecked(bool(init.get("show_grid", True))) - self.chk_snap = QtWidgets.QCheckBox(); self.chk_snap.setChecked(bool(init.get("snap", True))) - - self.cmb_theme = QtWidgets.QComboBox(); self.cmb_theme.addItems(["dark","light"]) - self.cmb_theme.setCurrentText((init.get("theme") or "dark")) - - self.spin_ppf = QtWidgets.QDoubleSpinBox(); self.spin_ppf.setRange(1.0, 2000.0); self.spin_ppf.setDecimals(2) - self.spin_ppf.setValue(float(init.get("px_per_ft", 12.0))) - - form.addRow("Show grid", self.chk_grid) - form.addRow("Snap to grid/step", self.chk_snap) - form.addRow("Theme", self.cmb_theme) - form.addRow("Pixels per foot", self.spin_ppf) - - btns = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel) - btns.accepted.connect(self.accept); btns.rejected.connect(self.reject) - form.addRow(btns) - - def values(self): - return { - "show_grid": self.chk_grid.isChecked(), - "snap": self.chk_snap.isChecked(), - "theme": self.cmb_theme.currentText(), - "px_per_ft": float(self.spin_ppf.value()), - } diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/__init__.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/__init__.py deleted file mode 100644 index c49f691..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# make 'app.tools' a real package diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/__pycache__/__init__.cpython-311.pyc b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 3634d36..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/__pycache__/align.cpython-311.pyc b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/__pycache__/align.cpython-311.pyc deleted file mode 100644 index 1c10a5b..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/__pycache__/align.cpython-311.pyc and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/__pycache__/array.cpython-311.pyc b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/__pycache__/array.cpython-311.pyc deleted file mode 100644 index c060bb3..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/__pycache__/array.cpython-311.pyc and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/__pycache__/draw.cpython-311.pyc b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/__pycache__/draw.cpython-311.pyc deleted file mode 100644 index 624dc5d..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/__pycache__/draw.cpython-311.pyc and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/align.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/align.py deleted file mode 100644 index 2243d75..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/align.py +++ /dev/null @@ -1,44 +0,0 @@ -from __future__ import annotations -from PySide6 import QtWidgets, QtCore -from PySide6.QtCore import QPointF - -def align_left(items): - _align(items, key=lambda it: it.rect().left(), setter=lambda it, x: _move_x(it, x)) - -def align_right(items): - _align(items, key=lambda it: it.rect().right(), setter=lambda it, x: _move_x(it, x - it.rect().width())) - -def align_top(items): - _align(items, key=lambda it: it.rect().top(), setter=lambda it, y: _move_y(it, y)) - -def align_bottom(items): - _align(items, key=lambda it: it.rect().bottom(), setter=lambda it, y: _move_y(it, y - it.rect().height())) - -def distribute_h(items): - if len(items) < 3: return - items = sorted(items, key=lambda it: it.rect().left()) - left = items[0].rect().left(); right = items[-1].rect().left() - step = (right - left) / (len(items)-1) - for i, it in enumerate(items): - _move_x(it, left + i*step) - -def distribute_v(items): - if len(items) < 3: return - items = sorted(items, key=lambda it: it.rect().top()) - top = items[0].rect().top(); bottom = items[-1].rect().top() - step = (bottom - top) / (len(items)-1) - for i, it in enumerate(items): - _move_y(it, top + i*step) - -def _align(items, key, setter): - if not items: return - target = min(items, key=key) - val = key(target) - for it in items: - setter(it, val) - -def _move_x(it, x): - r = it.rect(); it.setPos(x, r.top()) - -def _move_y(it, y): - r = it.rect(); it.setPos(r.left(), y) diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/array.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/array.py deleted file mode 100644 index 5f4879c..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/array.py +++ /dev/null @@ -1,25 +0,0 @@ -from dataclasses import dataclass -from PySide6 import QtCore - -@dataclass -class ArraySpec: - spacing_ft: float = 10.0 - offset_ft_x: float = 0.0 - offset_ft_y: float = 0.0 - -def fill_rect_with_points(rect_px: QtCore.QRectF, px_per_ft: float, spec: ArraySpec): - # Return list of QPointF inside rect at a regular grid spacing. - if rect_px.width() <= 0 or rect_px.height() <= 0 or px_per_ft <= 0: - return [] - step = spec.spacing_ft * px_per_ft - ox = rect_px.left() + spec.offset_ft_x * px_per_ft - oy = rect_px.top() + spec.offset_ft_y * px_per_ft - pts = [] - y = oy - while y <= rect_px.bottom() - 1e-6: - x = ox - while x <= rect_px.right() - 1e-6: - pts.append(QtCore.QPointF(x, y)) - x += step - y += step - return pts diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/array.py.bak_20250908_211210 b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/array.py.bak_20250908_211210 deleted file mode 100644 index ba342e2..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/array.py.bak_20250908_211210 +++ /dev/null @@ -1,62 +0,0 @@ -from PySide6 import QtWidgets -from app import units -from app.device import DeviceItem - -class _ArrayDialog(QtWidgets.QDialog): - def __init__(self, parent=None): - super().__init__(parent) - self.setWindowTitle("Place Array") - form = QtWidgets.QFormLayout(self) - - self.rows = QtWidgets.QSpinBox(); self.rows.setRange(1, 300); self.rows.setValue(2) - self.cols = QtWidgets.QSpinBox(); self.cols.setRange(1, 300); self.cols.setValue(3) - form.addRow("Rows:", self.rows) - form.addRow("Columns:", self.cols) - - self.sp_ft = QtWidgets.QSpinBox(); self.sp_ft.setRange(0, 1000); self.sp_ft.setValue(10) - self.sp_in = QtWidgets.QSpinBox(); self.sp_in.setRange(0, 11); self.sp_in.setValue(0) - row = QtWidgets.QHBoxLayout(); row.addWidget(self.sp_ft); row.addWidget(QtWidgets.QLabel("ft")); row.addSpacing(12); row.addWidget(self.sp_in); row.addWidget(QtWidgets.QLabel("in")) - wrap = QtWidgets.QWidget(); wrap.setLayout(row) - form.addRow("Spacing:", wrap) - - btns = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel) - btns.accepted.connect(self.accept); btns.rejected.connect(self.reject) - form.addRow(btns) - - def get(self): - spacing_ft = self.sp_ft.value() + self.sp_in.value()/12.0 - return self.rows.value(), self.cols.value(), spacing_ft - -class ArrayTool: - def __init__(self, window, layer_devices): - self.win = window - self.layer = layer_devices - - def run(self): - sel = [it for it in self.win.scene.selectedItems() if isinstance(it, DeviceItem)] - if not sel: - QtWidgets.QMessageBox.information(self.win, "Place Array", "Select a placed device to use as the anchor, then run Place Array again.") - return - anchor = sel[0] - dlg = _ArrayDialog(self.win) - if dlg.exec() != QtWidgets.QDialog.Accepted: - return - rows, cols, spacing_ft = dlg.get() - spacing_px = units.ft_to_px(spacing_ft, self.win.px_per_ft) - - symbol = getattr(anchor, "symbol", "?") - name = getattr(anchor, "name", "Device") - mfr = getattr(anchor, "manufacturer", "") - pn = getattr(anchor, "part_number", "") - - ax, ay = anchor.pos().x(), anchor.pos().y() - for r in range(rows): - for c in range(cols): - if r==0 and c==0: - continue - x = ax + c * spacing_px - y = ay + r * spacing_px - it = DeviceItem(x, y, symbol, name, mfr, pn) - it.setParentItem(self.layer) - self.win.push_history() - self.win.statusBar().showMessage(f"Placed array {rows}x{cols} @ {spacing_ft:.2f} ft", 3500) diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/dimension.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/dimension.py deleted file mode 100644 index c4aba08..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/dimension.py +++ /dev/null @@ -1,65 +0,0 @@ -from PySide6 import QtCore, QtGui, QtWidgets -from PySide6.QtCore import Qt, QPointF -from app import units - -class DimensionItem(QtWidgets.QGraphicsItemGroup): - def __init__(self, a: QPointF, b: QPointF, px_per_ft: float): - super().__init__() - self.a = QPointF(a); self.b = QPointF(b); self.px_per_ft = px_per_ft - self.line = QtWidgets.QGraphicsLineItem() - pen = QtGui.QPen(Qt.black); pen.setCosmetic(True) - self.line.setPen(pen); self.addToGroup(self.line) - - self.arrow1 = QtWidgets.QGraphicsLineItem(); self.arrow2 = QtWidgets.QGraphicsLineItem() - for ar in (self.arrow1, self.arrow2): - ar.setPen(pen); self.addToGroup(ar) - - self.text = QtWidgets.QGraphicsSimpleTextItem("") - self.text.setFlag(QtWidgets.QGraphicsItem.ItemIgnoresTransformations, True) - self.addToGroup(self.text); self.update_geom() - - def set_points(self, a: QPointF, b: QPointF): - self.a = QPointF(a); self.b = QPointF(b); self.update_geom() - - def update_geom(self): - self.line.setLine(self.a.x(), self.a.y(), self.b.x(), self.b.y()) - import math - ang = math.atan2(self.b.y()-self.a.y(), self.b.x()-self.a.x()) - L = 10.0; bx, by = self.b.x(), self.b.y() - left = QtCore.QPointF(bx - L*math.cos(ang-0.35), by - L*math.sin(ang-0.35)) - right = QtCore.QPointF(bx - L*math.cos(ang+0.35), by - L*math.sin(ang+0.35)) - self.arrow1.setLine(bx, by, left.x(), left.y()) - self.arrow2.setLine(bx, by, right.x(), right.y()) - dist_px = (QtCore.QLineF(self.a, self.b)).length() - dist_ft = units.px_to_ft(dist_px, self.px_per_ft) - self.text.setText(units.fmt_ft_inches(dist_ft)) - mid = (self.a + self.b) / 2.0 - self.text.setPos(mid + QtCore.QPointF(8, -8)) - -class DimensionTool: - def __init__(self, window, layer_overlay): - self.win = window; self.layer = layer_overlay - self.dim_item = None; self.active = False; self.start_pt = None - - def start(self): - self.finish(); self.active = True - self.win.statusBar().showMessage("Dimension: click start point, then end point. Esc to cancel.") - - def on_mouse_move(self, sp, **kwargs): - if not self.active or self.dim_item is None: return - self.dim_item.set_points(self.start_pt, sp) - - def on_click(self, sp, **kwargs): - if not self.active: return False - if self.dim_item is None: - self.start_pt = sp - self.dim_item = DimensionItem(sp, sp, self.win.px_per_ft) - self.dim_item.setParentItem(self.layer) - return False - else: - self.dim_item.set_points(self.start_pt, sp) - self.win.push_history(); self.active = False; self.win.statusBar().showMessage("") - return True - - def finish(self): - self.active = False; self.dim_item = None; self.start_pt = None diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/dimension.py.bak b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/dimension.py.bak deleted file mode 100644 index c4aba08..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/dimension.py.bak +++ /dev/null @@ -1,65 +0,0 @@ -from PySide6 import QtCore, QtGui, QtWidgets -from PySide6.QtCore import Qt, QPointF -from app import units - -class DimensionItem(QtWidgets.QGraphicsItemGroup): - def __init__(self, a: QPointF, b: QPointF, px_per_ft: float): - super().__init__() - self.a = QPointF(a); self.b = QPointF(b); self.px_per_ft = px_per_ft - self.line = QtWidgets.QGraphicsLineItem() - pen = QtGui.QPen(Qt.black); pen.setCosmetic(True) - self.line.setPen(pen); self.addToGroup(self.line) - - self.arrow1 = QtWidgets.QGraphicsLineItem(); self.arrow2 = QtWidgets.QGraphicsLineItem() - for ar in (self.arrow1, self.arrow2): - ar.setPen(pen); self.addToGroup(ar) - - self.text = QtWidgets.QGraphicsSimpleTextItem("") - self.text.setFlag(QtWidgets.QGraphicsItem.ItemIgnoresTransformations, True) - self.addToGroup(self.text); self.update_geom() - - def set_points(self, a: QPointF, b: QPointF): - self.a = QPointF(a); self.b = QPointF(b); self.update_geom() - - def update_geom(self): - self.line.setLine(self.a.x(), self.a.y(), self.b.x(), self.b.y()) - import math - ang = math.atan2(self.b.y()-self.a.y(), self.b.x()-self.a.x()) - L = 10.0; bx, by = self.b.x(), self.b.y() - left = QtCore.QPointF(bx - L*math.cos(ang-0.35), by - L*math.sin(ang-0.35)) - right = QtCore.QPointF(bx - L*math.cos(ang+0.35), by - L*math.sin(ang+0.35)) - self.arrow1.setLine(bx, by, left.x(), left.y()) - self.arrow2.setLine(bx, by, right.x(), right.y()) - dist_px = (QtCore.QLineF(self.a, self.b)).length() - dist_ft = units.px_to_ft(dist_px, self.px_per_ft) - self.text.setText(units.fmt_ft_inches(dist_ft)) - mid = (self.a + self.b) / 2.0 - self.text.setPos(mid + QtCore.QPointF(8, -8)) - -class DimensionTool: - def __init__(self, window, layer_overlay): - self.win = window; self.layer = layer_overlay - self.dim_item = None; self.active = False; self.start_pt = None - - def start(self): - self.finish(); self.active = True - self.win.statusBar().showMessage("Dimension: click start point, then end point. Esc to cancel.") - - def on_mouse_move(self, sp, **kwargs): - if not self.active or self.dim_item is None: return - self.dim_item.set_points(self.start_pt, sp) - - def on_click(self, sp, **kwargs): - if not self.active: return False - if self.dim_item is None: - self.start_pt = sp - self.dim_item = DimensionItem(sp, sp, self.win.px_per_ft) - self.dim_item.setParentItem(self.layer) - return False - else: - self.dim_item.set_points(self.start_pt, sp) - self.win.push_history(); self.active = False; self.win.statusBar().showMessage("") - return True - - def finish(self): - self.active = False; self.dim_item = None; self.start_pt = None diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/draw.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/draw.py deleted file mode 100644 index d667758..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/tools/draw.py +++ /dev/null @@ -1,117 +0,0 @@ -# Draw tools (absolute-import safe). Modes: 0=NONE, 1=LINE, 2=RECT, 3=CIRCLE, 4=POLYLINE -from PySide6 import QtCore, QtGui, QtWidgets -from PySide6.QtCore import Qt, QPointF, QRectF - -class DrawMode: - NONE = 0 - LINE = 1 - RECT = 2 - CIRCLE = 3 - POLYLINE = 4 - -class DrawController: - def __init__(self, window, sketch_group): - self.win = window - self.group = sketch_group - self.mode = DrawMode.NONE - self.temp_item = None - self.points = [] # for polyline - - def set_mode(self, mode: int): - self.finish() - self.mode = mode - self.win.statusBar().showMessage({DrawMode.LINE:"Line",DrawMode.RECT:"Rect",DrawMode.CIRCLE:"Circle",DrawMode.POLYLINE:"Polyline"}.get(mode,"None")) - - def finish(self): - if self.temp_item is not None: - self.temp_item = None - self.points = [] - self.mode = DrawMode.NONE - - def on_mouse_move(self, scene_pt: QPointF, shift_ortho: bool=False): - if self.mode == DrawMode.NONE: - return - if self.mode in (DrawMode.LINE, DrawMode.RECT, DrawMode.CIRCLE) and self.points: - p0 = self.points[0] - p1 = QPointF(scene_pt.x(), scene_pt.y()) - if shift_ortho: - dx = abs(p1.x() - p0.x()); dy = abs(p1.y() - p0.y()) - if dx > dy: p1.setY(p0.y()) - else: p1.setX(p0.x()) - self._update_temp_shape(p0, p1) - - if self.mode == DrawMode.POLYLINE and self.points: - # Update last segment preview (optional) - pass - - def on_click(self, scene_pt: QPointF, shift_ortho: bool=False) -> bool: - if self.mode == DrawMode.NONE: - return False - - if self.mode in (DrawMode.LINE, DrawMode.RECT, DrawMode.CIRCLE): - if not self.points: - self.points = [scene_pt] - return False - # second click: commit - p0 = self.points[0] - p1 = QPointF(scene_pt.x(), scene_pt.y()) - if shift_ortho: - dx = abs(p1.x() - p0.x()); dy = abs(p1.y() - p0.y()) - if dx > dy: p1.setY(p0.y()) - else: p1.setX(p0.x()) - self._commit_shape(p0, p1) - self.points = [] - return True - - if self.mode == DrawMode.POLYLINE: - if not self.points: - self.points = [scene_pt] - self._start_polyline(scene_pt) - return False - else: - self._extend_polyline(scene_pt) - # End on double-click is handled by finish() via Esc or menu - return True - - return False - - # ---- helpers ---- - def _update_temp_shape(self, p0: QPointF, p1: QPointF): - # For simplicity, use commit each move for preview (fast enough for small scenes) - self._remove_last_preview() - item = None - if self.mode == DrawMode.LINE: - path = QtGui.QPainterPath(p0); path.lineTo(p1) - item = QtWidgets.QGraphicsPathItem(path) - elif self.mode == DrawMode.RECT: - rect = QRectF(min(p0.x(),p1.x()), min(p0.y(),p1.y()), abs(p1.x()-p0.x()), abs(p1.y()-p0.y())) - path = QtGui.QPainterPath(); path.addRect(rect); item = QtWidgets.QGraphicsPathItem(path) - elif self.mode == DrawMode.CIRCLE: - r = ((p1.x()-p0.x())**2 + (p1.y()-p0.y())**2) ** 0.5 - rect = QRectF(p0.x()-r, p0.y()-r, 2*r, 2*r) - path = QtGui.QPainterPath(); path.addEllipse(rect); item = QtWidgets.QGraphicsPathItem(path) - if item: - pen = QtGui.QPen(Qt.blue); pen.setCosmetic(True); item.setPen(pen); item.setParentItem(self.group) - self.temp_item = item - - def _commit_shape(self, p0: QPointF, p1: QPointF): - self._update_temp_shape(p0, p1) - self.temp_item = None # leave it on the scene - - def _remove_last_preview(self): - if self.temp_item is not None: - self.temp_item.scene().removeItem(self.temp_item) - self.temp_item = None - - def _start_polyline(self, pt: QPointF): - path = QtGui.QPainterPath(pt) - item = QtWidgets.QGraphicsPathItem(path) - pen = QtGui.QPen(Qt.darkGreen); pen.setCosmetic(True); item.setPen(pen); item.setParentItem(self.group) - self.temp_item = item - - def _extend_polyline(self, pt: QPointF): - if not isinstance(self.temp_item, QtWidgets.QGraphicsPathItem): - self._start_polyline(pt); return - path = self.temp_item.path() - path.lineTo(pt) - self.temp_item.setPath(path) \ No newline at end of file diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/ui/__pycache__/settings.cpython-311.pyc b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/ui/__pycache__/settings.cpython-311.pyc deleted file mode 100644 index 834f6d0..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/ui/__pycache__/settings.cpython-311.pyc and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/ui/__pycache__/theme.cpython-311.pyc b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/ui/__pycache__/theme.cpython-311.pyc deleted file mode 100644 index 810df11..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/ui/__pycache__/theme.cpython-311.pyc and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/ui/settings.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/ui/settings.py deleted file mode 100644 index 2506789..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/ui/settings.py +++ /dev/null @@ -1,101 +0,0 @@ -from PySide6 import QtCore, QtWidgets - -DEFAULTS = { - "quick_tools_enabled": True, - "quick_tools_items": [ - "draw_line", - "draw_rect", - "draw_circle", - "wiring_mode", - "ortho_always", - "toggle_snap", - "align_submenu" - ], - "theme": "Light", - "quick_tools_filter_visibility": False # when True, only show enabled items in menus/toolbars -} - -TOOL_LABELS = { - "draw_line": "Draw Line", - "draw_rect": "Draw Rect", - "draw_circle": "Draw Circle", - "wiring_mode": "Wiring Mode", - "ortho_always": "Ortho Always (wires)", - "toggle_snap": "Snap On/Off", - "align_submenu": "Align / Distribute" -} - -THEMES = ["Light", "Dark", "High Contrast (Dark)"] - -class SettingsDialog(QtWidgets.QDialog): - def __init__(self, prefs: dict, parent=None): - super().__init__(parent) - self.setWindowTitle("Settings") - self.prefs = prefs - self.resize(480, 560) - - layout = QtWidgets.QVBoxLayout(self) - - # Theme - theme_grp = QtWidgets.QGroupBox("Appearance") - v0 = QtWidgets.QFormLayout(theme_grp) - self.cmb_theme = QtWidgets.QComboBox() - self.cmb_theme.addItems(THEMES) - current_theme = str(self.prefs.get("theme", DEFAULTS["theme"])) - if current_theme in THEMES: - self.cmb_theme.setCurrentIndex(THEMES.index(current_theme)) - v0.addRow("Theme:", self.cmb_theme) - layout.addWidget(theme_grp) - - # Visibility behavior - vis_grp = QtWidgets.QGroupBox("Menus & Toolbars") - vvis = QtWidgets.QVBoxLayout(vis_grp) - self.chk_filter_vis = QtWidgets.QCheckBox("Only show enabled tools in menus/toolbars") - self.chk_filter_vis.setChecked(bool(self.prefs.get("quick_tools_filter_visibility", DEFAULTS["quick_tools_filter_visibility"]))) - help_lbl = QtWidgets.QLabel("When on: drawing actions mirror the enabled list below. Core toggles (Grid/Snap/Wiring/Layers) always remain visible.") - help_lbl.setWordWrap(True) - vvis.addWidget(self.chk_filter_vis) - vvis.addWidget(help_lbl) - layout.addWidget(vis_grp) - - # Right-click Quick Tools - grp = QtWidgets.QGroupBox("Right-click Quick Tools") - v = QtWidgets.QVBoxLayout(grp) - self.chk_enable = QtWidgets.QCheckBox("Enable quick tools menu on right-click") - self.chk_enable.setChecked(bool(self.prefs.get("quick_tools_enabled", DEFAULTS["quick_tools_enabled"]))) - v.addWidget(self.chk_enable) - - v.addWidget(QtWidgets.QLabel("Show these items:")) - self.list = QtWidgets.QListWidget() - self.list.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection) - v.addWidget(self.list, 1) - - # populate checkboxes - items = list(TOOL_LABELS.keys()) - current = set(self.prefs.get("quick_tools_items", DEFAULTS["quick_tools_items"])) - for key in items: - it = QtWidgets.QListWidgetItem(TOOL_LABELS[key]) - it.setFlags(it.flags() | QtCore.Qt.ItemIsUserCheckable) - it.setCheckState(QtCore.Qt.Checked if key in current else QtCore.Qt.Unchecked) - it.setData(QtCore.Qt.UserRole, key) - self.list.addItem(it) - - layout.addWidget(grp, 1) - - # Buttons - bb = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel) - layout.addWidget(bb) - bb.accepted.connect(self.accept) - bb.rejected.connect(self.reject) - - def apply(self): - self.prefs["quick_tools_enabled"] = bool(self.chk_enable.isChecked()) - chosen = [] - for i in range(self.list.count()): - it = self.list.item(i) - if it.checkState() == QtCore.Qt.Checked: - chosen.append(it.data(QtCore.Qt.UserRole)) - self.prefs["quick_tools_items"] = chosen - self.prefs["theme"] = self.cmb_theme.currentText() - self.prefs["quick_tools_filter_visibility"] = bool(self.chk_filter_vis.isChecked()) - return self.prefs diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/ui/theme.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/ui/theme.py deleted file mode 100644 index 930b507..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/ui/theme.py +++ /dev/null @@ -1,40 +0,0 @@ -from PySide6 import QtGui, QtCore - -def apply_theme(app, name: str): - name = (name or "Light").lower() - pal = app.palette() - - if name == "dark": - pal.setColor(pal.Window, QtGui.QColor(45,45,48)) - pal.setColor(pal.WindowText, QtCore.Qt.white) - pal.setColor(pal.Base, QtGui.QColor(30,30,30)) - pal.setColor(pal.AlternateBase, QtGui.QColor(45,45,48)) - pal.setColor(pal.ToolTipBase, QtCore.Qt.white) - pal.setColor(pal.ToolTipText, QtCore.Qt.white) - pal.setColor(pal.Text, QtCore.Qt.white) - pal.setColor(pal.Button, QtGui.QColor(45,45,48)) - pal.setColor(pal.ButtonText, QtCore.Qt.white) - pal.setColor(pal.BrightText, QtCore.Qt.red) - pal.setColor(pal.Highlight, QtGui.QColor(0,120,215)) - pal.setColor(pal.HighlightedText, QtCore.Qt.white) - app.setPalette(pal) - app.setStyleSheet("QToolBar { border: none; } QMenu { background:#2d2d30; color:white; }") - elif name.startswith("high contrast"): - pal.setColor(pal.Window, QtGui.QColor(0,0,0)) - pal.setColor(pal.WindowText, QtCore.Qt.white) - pal.setColor(pal.Base, QtGui.QColor(0,0,0)) - pal.setColor(pal.AlternateBase, QtGui.QColor(30,30,30)) - pal.setColor(pal.ToolTipBase, QtCore.Qt.white) - pal.setColor(pal.ToolTipText, QtCore.Qt.black) - pal.setColor(pal.Text, QtCore.Qt.white) - pal.setColor(pal.Button, QtGui.QColor(0,0,0)) - pal.setColor(pal.ButtonText, QtCore.Qt.white) - pal.setColor(pal.BrightText, QtCore.Qt.yellow) - pal.setColor(pal.Highlight, QtGui.QColor(255,215,0)) - pal.setColor(pal.HighlightedText, QtCore.Qt.black) - app.setPalette(pal) - app.setStyleSheet("QToolBar { border: 1px solid #FFD700; } QMenu { background:#000; color:#fff; }") - else: - # Light default - app.setPalette(app.style().standardPalette()) - app.setStyleSheet("QToolBar { border: none; }") diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/units.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/units.py deleted file mode 100644 index 7b58b3d..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/units.py +++ /dev/null @@ -1,45 +0,0 @@ - -import math - -IN_PER_FT = 12.0 - -def ft_to_inches(ft: float) -> float: - return ft * IN_PER_FT - -def inches_to_ft(inches: float) -> float: - return inches / IN_PER_FT - -def px_to_ft(px: float, px_per_ft: float) -> float: - return px / px_per_ft - -def ft_to_px(ft: float, px_per_ft: float) -> float: - return ft * px_per_ft - -def fmt_ft_inches(ft_val: float) -> str: - neg = ft_val < 0 - ft_val = abs(ft_val) - whole_ft = int(ft_val) - inches = round((ft_val - whole_ft) * 12.0, 2) - return f"-{whole_ft}' {inches:.2f}\"" if neg else f"{whole_ft}' {inches:.2f}\"" - -def from_db_spherical(db_at_1m: float, target_db: float, px_per_ft: float) -> float: - """Return radius in *pixels* using 20*log10(r/reference). Uses 1m≈3.28084ft ref.""" - if db_at_1m <= 0: return 0.0 - if target_db >= db_at_1m: return 0.0 - ratio = 10 ** ((db_at_1m - target_db) / 20.0) # r @ 1m reference - r_ft = ratio * 3.28084 - return r_ft * px_per_ft - -def from_db_per_10ft(db_at_10ft: float, target_db: float, loss_per_10ft: float, px_per_ft: float) -> float: - """Simple linear-per-10ft model (designer-style rule).""" - if db_at_10ft <= 0: return 0.0 - if target_db >= db_at_10ft: return 0.0 - steps = (db_at_10ft - target_db) / max(loss_per_10ft, 0.1) - r_ft = 10.0 * steps - return r_ft * px_per_ft - -def strobe_radius_from_cd_lux(candela: float, lux: float, px_per_ft: float) -> float: - if candela <= 0 or lux <= 0: return 0.0 - r_m = math.sqrt(candela / lux) - r_ft = r_m * 3.28084 - return r_ft * px_per_ft diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/wiring.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/app/wiring.py deleted file mode 100644 index 7b4bf95..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/app/wiring.py +++ /dev/null @@ -1,17 +0,0 @@ - -from PySide6 import QtGui, QtWidgets -from PySide6.QtGui import QPainterPath, QPen -from PySide6.QtCore import QPointF, Qt - -class WireItem(QtWidgets.QGraphicsPathItem): - def __init__(self, a: QPointF, b: QPointF): - super().__init__() - path = QPainterPath(a); path.lineTo(b) - self.setPath(path) - pen = QPen(Qt.darkGreen); pen.setWidth(2); pen.setCosmetic(True) - self.setPen(pen) - self.setZValue(60) - - def to_json(self): - p = self.path(); a = p.elementAt(0); b = p.elementAt(1) - return {"ax": a.x, "ay": a.y, "bx": b.x, "by": b.y} diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/base_library.zip b/dist/AutoFire_20250909_200404/AutoFire/_internal/base_library.zip deleted file mode 100644 index 4a8f95a..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/base_library.zip and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/core/__init__.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/core/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/core/__pycache__/__init__.cpython-311.pyc b/dist/AutoFire_20250909_200404/AutoFire/_internal/core/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 11f52c0..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/core/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/core/error_hook.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/core/error_hook.py deleted file mode 100644 index 55bdb25..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/core/error_hook.py +++ /dev/null @@ -1,16 +0,0 @@ -import sys, traceback -from PySide6 import QtWidgets -from . import logger_bridge - -def excepthook(exc_type, exc, tb): - logger = logger_bridge.get_app_logger() - lines = "".join(traceback.format_exception(exc_type, exc, tb)) - try: - logger.error("UNCAUGHT EXCEPTION\n" + lines) - except Exception: - pass - try: - QtWidgets.QMessageBox.critical(None, "Auto-Fire Error", lines[:2000]) - except Exception: - pass -sys.excepthook = excepthook \ No newline at end of file diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/core/logger.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/core/logger.py deleted file mode 100644 index 6c995b8..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/core/logger.py +++ /dev/null @@ -1,17 +0,0 @@ -import os, logging, logging.handlers, pathlib - -APP_DIR = os.path.join(os.path.expanduser("~"), "AutoFire") -LOG_DIR = os.path.join(APP_DIR, "logs") -pathlib.Path(LOG_DIR).mkdir(parents=True, exist_ok=True) - -def get_logger(name="autofire"): - logger = logging.getLogger(name) - if logger.handlers: - return logger - logger.setLevel(logging.INFO) - log_path = os.path.join(LOG_DIR, f"{name}.log") - handler = logging.handlers.RotatingFileHandler(log_path, maxBytes=1_000_000, backupCount=5, encoding="utf-8") - fmt = logging.Formatter("%(asctime)s | %(levelname)s | %(name)s | %(message)s") - handler.setFormatter(fmt) - logger.addHandler(handler) - return logger \ No newline at end of file diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/core/logger_bridge.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/core/logger_bridge.py deleted file mode 100644 index f2dbb6e..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/core/logger_bridge.py +++ /dev/null @@ -1,7 +0,0 @@ -def get_app_logger(): - try: - from core.logger import get_logger - return get_logger("autofire_app") - except Exception: - import logging - return logging.getLogger("autofire_app_fallback") \ No newline at end of file diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/libcrypto-3.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/libcrypto-3.dll deleted file mode 100644 index dd511fb..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/libcrypto-3.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/python3.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/python3.dll deleted file mode 100644 index 4697e72..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/python3.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/python311.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/python311.dll deleted file mode 100644 index 701d943..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/python311.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/select.pyd b/dist/AutoFire_20250909_200404/AutoFire/_internal/select.pyd deleted file mode 100644 index b008c3f..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/select.pyd and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/shiboken6/MSVCP140.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/shiboken6/MSVCP140.dll deleted file mode 100644 index f229049..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/shiboken6/MSVCP140.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/shiboken6/Shiboken.pyd b/dist/AutoFire_20250909_200404/AutoFire/_internal/shiboken6/Shiboken.pyd deleted file mode 100644 index 664637e..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/shiboken6/Shiboken.pyd and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/shiboken6/VCRUNTIME140.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/shiboken6/VCRUNTIME140.dll deleted file mode 100644 index 1782c45..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/shiboken6/VCRUNTIME140.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/shiboken6/VCRUNTIME140_1.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/shiboken6/VCRUNTIME140_1.dll deleted file mode 100644 index 7dfc0a1..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/shiboken6/VCRUNTIME140_1.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/shiboken6/shiboken6.abi3.dll b/dist/AutoFire_20250909_200404/AutoFire/_internal/shiboken6/shiboken6.abi3.dll deleted file mode 100644 index d6f9c47..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/shiboken6/shiboken6.abi3.dll and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/unicodedata.pyd b/dist/AutoFire_20250909_200404/AutoFire/_internal/unicodedata.pyd deleted file mode 100644 index 723ceb2..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/unicodedata.pyd and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/updater/__init__.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/updater/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/updater/__pycache__/__init__.cpython-311.pyc b/dist/AutoFire_20250909_200404/AutoFire/_internal/updater/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 0f4d315..0000000 Binary files a/dist/AutoFire_20250909_200404/AutoFire/_internal/updater/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/dist/AutoFire_20250909_200404/AutoFire/_internal/updater/auto_update.py b/dist/AutoFire_20250909_200404/AutoFire/_internal/updater/auto_update.py deleted file mode 100644 index 5da9f54..0000000 --- a/dist/AutoFire_20250909_200404/AutoFire/_internal/updater/auto_update.py +++ /dev/null @@ -1,96 +0,0 @@ - -import os, sys, json, zipfile, shutil, time -from pathlib import Path - -def _exe_dir(): - # Return directory next to the running EXE, or project root in dev - if getattr(sys, "frozen", False): - return Path(getattr(sys, "executable")).resolve().parent - return Path(__file__).resolve().parents[1] - -def _log(msg: str): - try: - base = Path.home() / "AutoFire" / "logs" - base.mkdir(parents=True, exist_ok=True) - with (base / "updater.log").open("a", encoding="utf-8") as f: - f.write(time.strftime("[%Y-%m-%d %H:%M:%S] ") + msg + "\n") - except Exception: - pass - -def _candidate_update_dirs(): - # environment override first - env = os.environ.get("AUTO_FIRE_UPDATES_DIR") - base = _exe_dir() - dirs = [] - if env: dirs.append(Path(env)) - # common locations - dirs += [ - Path("C:/AutoFireUpdates"), - Path.home() / "AutoFireUpdates", - base / "updates", - ] - # unique-ify while preserving order - seen = set(); out = [] - for d in dirs: - p = d.resolve() - if p not in seen: - seen.add(p); out.append(p) - return out - -def _iter_patch_zips(d: Path): - if not d.exists(): return [] - zips = sorted([p for p in d.glob("*.zip") if p.is_file()], key=lambda p: p.stat().st_mtime) - return zips - -def _apply_patch_zip(zip_path: Path, target_root: Path) -> bool: - """Very small patcher: expects manifest.json + files (relative paths).""" - with zipfile.ZipFile(zip_path, "r") as z: - try: - manifest = json.loads(z.read("manifest.json").decode("utf-8")) - except Exception: - manifest = None - # write all files except manifest itself - wrote = 0 - for info in z.infolist(): - name = info.filename - if name.endswith("/") or name == "manifest.json": - continue - # normalize to Windows separators - dest = (target_root / Path(name)).resolve() - dest.parent.mkdir(parents=True, exist_ok=True) - with z.open(info, "r") as src, open(dest, "wb") as dst: - shutil.copyfileobj(src, dst) - wrote += 1 - _log(f"Applied {wrote} files from {zip_path.name} into {target_root}") - return wrote > 0 - -def check_and_apply_updates(): - """ - Checks common update folders for *.zip and applies them into the EXE folder. - Non-fatal: all exceptions are swallowed and logged; returns True if anything applied. - """ - try: - base = _exe_dir() - applied_any = False - for d in _candidate_update_dirs(): - try: - for zp in _iter_patch_zips(d): - try: - ok = _apply_patch_zip(zp, base) - # Move to 'applied' folder to avoid reapplying - dst_dir = d / "applied"; dst_dir.mkdir(parents=True, exist_ok=True) - dst = dst_dir / (zp.stem + "_applied" + zp.suffix) - try: - zp.replace(dst) - except Exception: - # if cannot move (e.g., cross-volume), copy then remove - shutil.copy2(zp, dst); os.remove(zp) - applied_any = applied_any or ok - except Exception as e: - _log(f"Failed to apply {zp}: {e}") - except Exception as e: - _log(f"Error scanning {d}: {e}") - return applied_any - except Exception as e: - _log(f"Updater failed: {e}") - return False diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 0000000..e969997 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,23 @@ +# Architecture Overview + +Goal: decouple GUI from algorithms and persistence. + +Packages +- `frontend/` (Qt/PySide6): windows, scenes, tools wiring, input events. +- `cad_core/` (pure Python): geometry ops, snapping, trim/extend/fillet, unit conversion. +- `backend/` (headless): data models, file I/O, `db/loader.py`, configuration, services. + +Current State +- Legacy modules still live under `app/`, `core/`, and `db/`. +- We will incrementally migrate modules into the target packages while preserving behavior. + +Migration Plan (phased) +1. Extract units/geometry helpers from `app/` into `cad_core/`. +2. Move `db/loader.py` and config into `backend/`. +3. Split `app/main.py` into `frontend/app.py` (Qt boot) and per-feature views. +4. Introduce service layer boundaries between frontend and cad_core/backend. + +Testing +- Keep `cad_core/` pure and covered by unit tests. +- Avoid GUI in tests; mock Qt where needed. + diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md new file mode 100644 index 0000000..da70f3f --- /dev/null +++ b/docs/CONTRIBUTING.md @@ -0,0 +1,18 @@ +# Contributing Guide + +Setup +- Windows PowerShell: `./setup_dev.ps1` +- Activate: `. .venv/Scripts/Activate.ps1` + +Workflow +- Create an issue; agree on scope/acceptance criteria. +- Branch: `git checkout -b feat/` +- Code with tests: `pytest -q` +- Format/lint: `ruff check --fix . && black .` +- Commit/push; open PR; link the issue. + +Standards +- Docstrings for public functions/classes; type hints on new code. +- Prefer pure functions in `cad_core/`; side effects in `frontend/` only. +- Keep PRs small and focused; update docs when behavior changes. + diff --git a/docs/SPRINT_01.md b/docs/SPRINT_01.md new file mode 100644 index 0000000..1217494 --- /dev/null +++ b/docs/SPRINT_01.md @@ -0,0 +1,41 @@ +# Sprint 01 – Kickoff Plan + +## Cad Core – Trim/Extend/Fillet Suite +- Branch: `feat/cad-core-trim-suite` +- Goal: Correct, predictable trim/extend/fillet on lines/arcs. +- Acceptance + - Unit tests for typical and edge cases (collinear, no intersection, tangent). + - Pure functions in `cad_core/` (no Qt imports). + - Documented function signatures and behavior. + +## Backend – .autofire Schema & Loader +- Branch: `feat/backend-schema-loader` +- Goal: Define versioned JSON schema for drawings; implement round-trip load/save. +- Acceptance + - `backend` APIs: `save(project) -> str`, `load(str|path) -> project`. + - Tests: save/load round-trip equality on minimal fixture. + - Version field + forward-compat strategy documented. + +## Frontend – Tool Wiring & Shortcuts +- Branch: `feat/frontend-tools-wiring` +- Goal: Cleanly register tools/shortcuts; decouple UI from algorithms. +- Acceptance + - Single registry for tools with names, icons, shortcuts. + - No geometry logic in UI methods; calls into `cad_core`. + - Smoke test for startup remains passing. + +## QA – Test Harness & Fixtures +- Branch: `feat/qa-harness-and-fixtures` +- Goal: Expand pytest harness; tiny fixtures for geometry and I/O. +- Acceptance + - `tests/` structure for cad_core ops and backend I/O. + - Add 8–12 unit tests; CI green. + +## Integration – Split app/main.py (Phase 1) +- Branch: `feat/integration-split-main` +- Goal: Extract boot/wiring from `app/main.py` into `frontend/` without behavior change. +- Acceptance + - New `frontend/app.py` (or similar) hosts Qt app/boot. + - Legacy code imports adjusted minimally; app still runs. + - No geometry logic moved into UI; keep seams. + diff --git a/docs/TEAM.md b/docs/TEAM.md new file mode 100644 index 0000000..0f7b03e --- /dev/null +++ b/docs/TEAM.md @@ -0,0 +1,13 @@ +# Team Roles (AI-assisted) + +- HAL (Lead): scopes work, reviews PRs, coordinates agents. +- FrontEnd: Qt UI, tools wiring, UX. +- BackEnd: data models, loaders, persistence. +- CAD Core: geometry algorithms, snapping, performance. +- QA: tests, fixtures, CI, coverage. +- Integration: refactors, dependency boundaries, import hygiene. + +Coordination +- One branch per task; link PR to the issue. +- Avoid editing the same module across tasks. + diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..d71e0bf --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,8 @@ +# Frontend + +Qt/PySide6 UI: windows, scenes, tools wiring, command handling, and input events. + +Guidelines +- Keep business logic out of the UI where possible. +- Call into `cad_core` for geometry; call `backend` for I/O/services. + diff --git a/frontend/__init__.py b/frontend/__init__.py new file mode 100644 index 0000000..64ab5cb --- /dev/null +++ b/frontend/__init__.py @@ -0,0 +1,6 @@ +"""Frontend package (Qt UI). + +Legacy UI code currently lives in `app/`. As modules are migrated, +imports should come from `frontend.*` rather than `app.*`. +""" + diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..d003f85 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,18 @@ +[tool.black] +line-length = 100 +target-version = ["py311"] + +[tool.ruff] +line-length = 100 +target-version = "py311" +extend-exclude = ["build", "dist", ".venv"] +select = [ + "E", # pycodestyle + "F", # pyflakes + "I", # isort + "UP", # pyupgrade +] + +[tool.ruff.format] +quote-style = "double" + diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000..6dffeae --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,5 @@ +pre-commit +black +ruff +mypy +pytest diff --git a/setup_dev.ps1 b/setup_dev.ps1 new file mode 100644 index 0000000..c452186 --- /dev/null +++ b/setup_dev.ps1 @@ -0,0 +1,42 @@ +param( + [switch]$Force +) + +Write-Host "[dev-setup] Using Python: $(python --version 2>$null)" + +$venvPath = ".venv" +if (-not (Test-Path $venvPath) -or $Force) { + Write-Host "[dev-setup] Creating venv at $venvPath" + python -m venv $venvPath +} + +$activate = Join-Path $venvPath "Scripts/Activate.ps1" +if (-not (Test-Path $activate)) { + Write-Error "Activation script not found at $activate" + exit 1 +} + +Write-Host "[dev-setup] Activating venv" +. $activate + +Write-Host "[dev-setup] Upgrading pip" +python -m pip install --upgrade pip + +if (Test-Path "requirements.txt") { + Write-Host "[dev-setup] Installing project requirements" + pip install -r requirements.txt +} else { + Write-Warning "requirements.txt not found — skipping." +} + +if (Test-Path "requirements-dev.txt") { + Write-Host "[dev-setup] Installing dev tools (pre-commit, black, ruff, mypy)" + pip install -r requirements-dev.txt + Write-Host "[dev-setup] Installing pre-commit hooks" + pre-commit install +} else { + Write-Warning "requirements-dev.txt not found — skipping dev tools." +} + +Write-Host "[dev-setup] Done. To activate later: . .venv/Scripts/Activate.ps1" + diff --git a/tasks/feat-backend-schema-loader.md b/tasks/feat-backend-schema-loader.md new file mode 100644 index 0000000..f4ec651 --- /dev/null +++ b/tasks/feat-backend-schema-loader.md @@ -0,0 +1,3 @@ +Task: Backend – .autofire schema + loader +Define JSON schema v1; implement save/load API in backend/. +Accept: round-trip tests; versioned docs. \ No newline at end of file diff --git a/tasks/feat-cad-core-trim-suite.md b/tasks/feat-cad-core-trim-suite.md new file mode 100644 index 0000000..5d23e7c --- /dev/null +++ b/tasks/feat-cad-core-trim-suite.md @@ -0,0 +1,3 @@ +Task: Cad Core – Trim/Extend/Fillet Suite +Scope: lines/arcs; pure functions in cad_core/. +Accept: tests for typical + edge cases (collinear, no intersect, tangent). \ No newline at end of file diff --git a/tasks/feat-frontend-tools-wiring.md b/tasks/feat-frontend-tools-wiring.md new file mode 100644 index 0000000..7e60bba --- /dev/null +++ b/tasks/feat-frontend-tools-wiring.md @@ -0,0 +1,3 @@ +Task: Frontend – tool registry + shortcuts +UI wires tools; no geometry logic; calls cad_core. +Accept: startup smoke ok. \ No newline at end of file diff --git a/tasks/feat-qa-harness-and-fixtures.md b/tasks/feat-qa-harness-and-fixtures.md new file mode 100644 index 0000000..4f0ec65 --- /dev/null +++ b/tasks/feat-qa-harness-and-fixtures.md @@ -0,0 +1,2 @@ +Task: QA – expand pytest and fixtures +Add 8–12 tests across cad_core/backend; keep CI green. \ No newline at end of file diff --git a/tests/cad_core/test_lines_more.py b/tests/cad_core/test_lines_more.py new file mode 100644 index 0000000..4ae4111 --- /dev/null +++ b/tests/cad_core/test_lines_more.py @@ -0,0 +1,49 @@ +from cad_core.lines import Line, Point, intersection_line_line + + +def test_intersection_tolerates_near_parallel_small_tol(): + # Two lines with very small angle; ensure we can still compute with default tol + l1 = Line(Point(0, 0), Point(1000, 0)) + l2 = Line(Point(500, -1e-6), Point(500, 1e-6)) + ip = intersection_line_line(l1, l2) + assert ip is not None + assert abs(ip.x - 500.0) < 1e-6 + + +def test_simple_intersection(): + l1 = Line(Point(0, 0), Point(10, 10)) + l2 = Line(Point(0, 10), Point(10, 0)) + ip = intersection_line_line(l1, l2) + assert ip is not None + assert abs(ip.x - 5.0) < 1e-9 + assert abs(ip.y - 5.0) < 1e-9 + +def test_horizontal_vertical_intersection(): + l1 = Line(Point(0, 5), Point(10, 5)) + l2 = Line(Point(5, 0), Point(5, 10)) + ip = intersection_line_line(l1, l2) + assert ip is not None + assert abs(ip.x - 5.0) < 1e-9 + assert abs(ip.y - 5.0) < 1e-9 + +def test_collinear_lines(): + l1 = Line(Point(0, 0), Point(10, 0)) + l2 = Line(Point(20, 0), Point(30, 0)) + ip = intersection_line_line(l1, l2) + assert ip is None + +def test_intersection_at_endpoint(): + l1 = Line(Point(0, 0), Point(10, 10)) + l2 = Line(Point(10, 10), Point(20, 0)) + ip = intersection_line_line(l1, l2) + assert ip is not None + assert abs(ip.x - 10.0) < 1e-9 + assert abs(ip.y - 10.0) < 1e-9 + +def test_large_coordinates(): + l1 = Line(Point(1e6, 1e6), Point(1e6 + 10, 1e6 + 10)) + l2 = Line(Point(1e6, 1e6 + 10), Point(1e6 + 10, 1e6)) + ip = intersection_line_line(l1, l2) + assert ip is not None + assert abs(ip.x - (1e6 + 5.0)) < 1e-9 + assert abs(ip.y - (1e6 + 5.0)) < 1e-9 diff --git a/tests/test_units.py b/tests/test_units.py new file mode 100644 index 0000000..6768965 --- /dev/null +++ b/tests/test_units.py @@ -0,0 +1,20 @@ +from app.units import ft_to_px, px_to_ft, fmt_ft_inches + + +def test_ft_px_roundtrip(): + scale = 96.0 # 96 px per ft + feet = 12.5 + px = ft_to_px(feet, scale) + assert px == feet * scale + back = px_to_ft(px, scale) + assert abs(back - feet) < 1e-9 + + +def test_px_to_ft_zero_scale(): + assert px_to_ft(100.0, 0.0) == 0.0 + + +def test_fmt_ft_inches_sign_and_precision(): + assert fmt_ft_inches(5.0) == "5'-0.0\"" + assert fmt_ft_inches(-1.25) == "-1'-3.0\"" + diff --git a/updater/__pycache__/__init__.cpython-311.pyc b/updater/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 0f4d315..0000000 Binary files a/updater/__pycache__/__init__.cpython-311.pyc and /dev/null differ