diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..d72fd52 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.pdf binary diff --git a/.gitignore b/.gitignore index 8585325..ec23b61 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,6 @@ venv/ demos/grounded-extraction/ demos/parse-citations/ outputs/ -scripts/ +demos/*/provisional/output/ +scripts/* +!scripts/build_lighthouse_fixtures.py diff --git a/README.md b/README.md index 78e99d6..f51897d 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,29 @@

Nutrient Extraction Samples

- Most document AI returns values.
This returns values and proof.
+ Extract structured values.
Inspect the returned source regions.

License: MIT Python 3.10+ - 5 demos + 8 demos Nutrient Data Extraction API

- Hovering an extracted field card highlights the exact region of the source document the value came from + Hovering a field highlights the source region returned for that result

-

Hover any extracted field. The highlight lands on the exact pixels it came from.

+

Hover a field. The demo highlights the source region returned for that result.

-Every extracted value carries a **bounding box**, a **confidence score**, and a **page index**. When a value looks wrong you don't go hunting through the document — you hover the field and see precisely where the model looked. A highlight in the wrong place is a visible audit trail. +When the API returns grounding metadata, an extracted field can carry a **bounding box**, a **recognition signal**, and a **page index**. In these reviewed demos, hovering a grounded field shows the source region used for that result. A highlight in the wrong place makes a grounding problem visible; it does not prove the extracted value is correct. ```jsonc // Send a schema. Get back values with provenance. "procedure_code": "99213", // the value "bbox": { "x": 412, "y": 288, "width": 74, "height": 18 }, // where it came from -"confidence": 0.95, // how sure the model was +"confidence": 0.95, // recognition signal; not correctness probability "pageIndex": 0 // which page ``` @@ -32,12 +32,36 @@ Every extracted value carries a **bounding box**, a **confidence score**, and a  ·  Run it yourself  ·  + Reproduce the proof +  ·  + Browse the hub source +  ·  Give it to an agent

--- -## Five documents, five hard problems +## Three authentic-form evidence packages + +On three selected one-page authentic public forms populated with privacy-safe demo values, one live Nutrient Data Extraction API response per form exactly matched **26 of 30 predeclared fields**: mortgage **6/8**, insurance **11/11**, and healthcare **9/11**. All **30/30** returned fields included valid page-bounded primary source regions, and **four mismatches** were retained for review. + +| Package | Selected public form | Exact values | Primary regions returned | Verdict | +|---|---|---:|---:|---| +| [`mortgage_verification`](demos/mortgage_verification/) | U.S. Treasury Request for Mortgage Assistance | 6/8 | 8/8 | Review blocked | +| [`insurance_claim_intake`](demos/insurance_claim_intake/) | GSA Standard Form 91 crash report | 11/11 | 11/11 | 11/11 exact → Continue | +| [`prior_authorization`](demos/prior_authorization/) | CMS GLP-1 Bridge prior-authorization form | 9/11 | 11/11 | Review blocked | + +**[Browse the lighthouse hub source →](docs/lighthouse/index.html)** + +**[Open the reviewed proof hub on GitHub Pages →](https://pspdfkit.github.io/nutrient-extraction-samples/docs/lighthouse/?utm_campaign=de_lighthouse_pilot_v1&utm_source=github&utm_medium=repository&utm_content=cross_vertical.github_sample.v01.proof)** + +This is a three-document demonstration, not an accuracy, production, or performance benchmark. “Reviewed” means that an independent field-by-field evidence audit was recorded; it is not user approval or publication approval. Three of the four mismatches are exposed by returned metadata. The mortgage servicer primary and nested regions clip the decisive final period, so the fourth issue remains visible in the expected-versus-actual ledger beside the returned region. The forms contain privacy-safe demo values—not real people, real claims, PHI, lending decisions, adjudication, coverage decisions, or clinical determinations. + +Pricing and credit usage can change. Check the current official pricing before making a live request. The retained evidence does not independently reconcile account usage or billing. + +--- + +## Five additional documents, five hard problems Each demo is a Python script that calls the API and generates a self-contained HTML file. The generated output is committed — open any of them in a browser with no signup, no key, and no install. @@ -48,7 +72,7 @@ Each demo is a Python script that calls the API and generates a self-contained H ### CMS-1500 Health Insurance Claim `demos/grounded_extraction/` · Data Extraction -Table row extraction across a dense printed grid. The form uses a dropout-red ink grid that scanners typically destroy — procedure codes, diagnosis codes, billing amounts, and provider fields come back correct, each highlighted in the exact table cell it came from. +Table row extraction across a dense printed grid. The reviewed output includes service dates, procedure codes, billing amounts, and provider fields, with displayed grounded values linked to their returned source regions. The source checker also exposes two incorrect service dates in the committed response. **[Open demo →](https://pspdfkit.github.io/nutrient-extraction-samples/demos/grounded_extraction/output/index.html)** @@ -58,7 +82,7 @@ Table row extraction across a dense printed grid. The form uses a dropout-red in ### Indiana State Birth Record `demos/birth_record_extraction/` · Data Extraction -Signature block detection on a mixed handwritten/printed document. The schema separates the *printed name* from the adjacent *cursive signature* — two visually adjacent fields that trip up most models. Includes a before/after tuning comparison showing how schema description specificity fixes extraction errors. +Signature block detection on a mixed handwritten/printed document. The schema separates the *printed name* from the adjacent *cursive signature*. The tuning notes document one observed mismatch and a later reviewed response after the schema description was clarified. **[Open demo →](https://pspdfkit.github.io/nutrient-extraction-samples/demos/birth_record_extraction/output/index.html)** @@ -70,7 +94,7 @@ Signature block detection on a mixed handwritten/printed document. The schema se ### Making Home Affordable — RMA `demos/rma_extraction/` · Data Extraction -Value isolation in a dense 3-column financial table. Monthly Income, Total Assets, and Total Expenses sit side by side with nearly identical labels. The tuning story shows a vague schema description pulling the wrong column, and a precise one fixing it — with the highlight visually confirming the correction. +Value isolation in a dense 3-column financial table. Monthly Income, Total Assets, and Total Expenses sit side by side with similar labels. The tuning notes compare one wrong cached result with a later reviewed result after the schema description was clarified; the highlights show the regions returned for each response. **[Open demo →](https://pspdfkit.github.io/nutrient-extraction-samples/demos/rma_extraction/output/index.html)** @@ -92,7 +116,7 @@ Full narrative extraction from a free-text legal field. `incident_reason` captur ### Small Residential Income Property Appraisal Report `demos/parse_citations/` · Parse API -The document decomposed into semantic blocks — paragraphs, section headers, tables — each with spatial coordinates. This is the RAG citation case: every block in the sidebar links back to its exact location, so a retrieval pipeline can cite its source precisely. Reach for Parse when you need structure-aware chunking rather than field-level extraction. +The document decomposed into semantic blocks — paragraphs, section headers, and tables — with spatial coordinates. In this reviewed response, each rendered block links to its returned source region. Reach for Parse when you need structure-aware chunking rather than field-level extraction. **[Open demo →](https://pspdfkit.github.io/nutrient-extraction-samples/demos/parse_citations/output/index.html)** @@ -166,7 +190,7 @@ Parse credits are charged by mode and page. **Extract requests add 6 credits per | `understand` | 9 | | `agentic` | 18 | -All five demos use `agentic` mode. +All eight demos use `agentic` mode. | Demo | Pages | Normal run | If run live | |---|---:|---:|---:| @@ -174,13 +198,16 @@ All five demos use `agentic` mode. | Indiana Birth Record | 1 | 0 | 24 | | Request for Modification | 4 | 0 | 96 | | CA SC-100 | 4 | 0 | 96 | -| **Extraction subtotal** | **10** | **0** | **240** | +| Authentic-form mortgage verification | 1 | 0 | 24 | +| Authentic-form insurance claim intake | 1 | 0 | 24 | +| Authentic-form prior authorization | 1 | 0 | 24 | +| **Extraction subtotal** | **13** | **0** | **312** | | Appraisal Report (Parse) | 4 | 0 | 72 | -| **Total** | **14** | **0** | **312** | +| **Total** | **17** | **0** | **384** | -Every normal generator run replays its committed cache and costs **0 credits**. Network access is opt-in through `--refresh`: refreshing the four extraction demos costs 240 credits, and refreshing all five costs 312 credits. +Every normal generator run replays its committed cache and costs **0 credits**. Network access is opt-in through `--refresh`: refreshing all seven extraction demos costs 312 credits, and refreshing all eight demos costs 384 credits. -The free tier includes 5,000 credits per month, enough for about **16 live all-five refreshes**. +The free tier includes 5,000 credits per month, enough for about **13 live all-eight refreshes**. --- @@ -188,7 +215,7 @@ The free tier includes 5,000 credits per month, enough for about **16 live all-f Extraction lifts document values into every derivative, so review more than the PDFs. Before committing a document swap, check: -- `demos/*/data/*.pdf` — public-source or synthetic only +- `demos/*/data/*.pdf` — public-source, synthetic, or authentic public forms with privacy-safe demo values only - `demos/*/output/metadata.json` — document values and non-billing response metadata - `demos/parse_citations/data/*_parse_results.json` — document text - `demos/*/cache/*.json` — the full `output` payload @@ -227,7 +254,7 @@ The pin is deliberate: install resolves against upstream `main`, so record the r ## Sample code disclaimer -All documents, names, identifiers, and records in this repository are public-source or synthetic. Extraction results are illustrative only. +Documents in this repository are public-source, synthetic, or authentic public forms populated with privacy-safe demo values. Extraction results are illustrative only. This repository is sample code, not a production-ready workflow. Before processing real documents: @@ -241,7 +268,7 @@ This repository is sample code, not a production-ready workflow. Before processi To suggest a new document type, open an issue with the document name and the fields to extract. To add one yourself, copy an existing demo folder, swap the PDF and `docs.json`, and run the generator — then run the PII review above before committing. -Shared helpers live in `common/` (cache, escaping, rendering), and all five demo generators use them. +Shared helpers live in `common/` (cache, escaping, rendering), and all eight demo generators use them. ## License diff --git a/common/assets/logotype/nutrient-logo.svg b/common/assets/logotype/nutrient-logo.svg new file mode 100644 index 0000000..a16e227 --- /dev/null +++ b/common/assets/logotype/nutrient-logo.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/common/lighthouse.py b/common/lighthouse.py new file mode 100644 index 0000000..5b7154c --- /dev/null +++ b/common/lighthouse.py @@ -0,0 +1,1611 @@ +"""Shared contracts for the Data Extraction lighthouse packages. + +This module deliberately keeps provisional layout data and live API evidence in +different runtime types. It also owns the source-fixture-to-oracle path so an +API response can never become the source of expected values. +""" + +from __future__ import annotations + +import base64 +import hashlib +import json +import math +import re +import textwrap +from collections.abc import Mapping +from dataclasses import dataclass +from pathlib import Path, PurePosixPath +from typing import Any, Literal, TypeAlias +from urllib.parse import urlsplit, urlunsplit + +from .api import EXTRACT_ENDPOINT +from .cache import CacheError, MAX_CACHE_BYTES, validate_response +from .html_env import create_html_env + + +JsonScalar: TypeAlias = str | int | float | bool | None +JsonValue: TypeAlias = JsonScalar | list["JsonValue"] | dict[str, "JsonValue"] +PathPart: TypeAlias = str | int + +COMMITTED_CACHE_KEYS = frozenset( + {"status", "requestId", "output", "reconstructed"} +) +REQUIRED_CACHE_KEYS = frozenset({"status", "requestId", "output"}) +EXTRACT_OUTPUT_KEYS = frozenset({"data", "metadata", "pages"}) +LIVE_RECEIPT_KEYS = frozenset( + {"receiptVersion", "sourceStatus", "requestId", "projectedResponseSha256"} +) +PROVISIONAL_SOURCE_STATUS = "provisional-layout" +LIVE_RECEIPT_SOURCE_STATUS = "live-refresh" +SYNTHETIC_SOURCE_STATUS = "synthetic" +PUBLIC_FORM_SOURCE_STATUS = "public-form-demo" +PROVISIONAL_LABEL = "PROVISIONAL LAYOUT DATA — NO API CALL WAS MADE" +LIVE_REVIEW_LABEL = "LIVE API RESPONSE — REVIEW REQUIRED" +REVIEWED_LIVE_LABEL = "REVIEWED LIVE API RESPONSE" + +MAX_JSON_DEPTH = 64 +MAX_JSON_NODES = 100_000 +MAX_JSON_STRING_LENGTH = 200_000 +MAX_FIXTURE_BYTES = 1_000_000 +MAX_IMAGE_BYTES = 20 * 1024 * 1024 +MAX_FIELDS = 16 +MIN_PAGE_WIDTH = 500.0 +MAX_PAGE_WIDTH = 1_200.0 +MIN_PAGE_HEIGHT = 600.0 +MAX_PAGE_HEIGHT = 1_600.0 + +_SLUG = re.compile(r"[a-z][a-z0-9_]{0,63}\Z") +_SAFE_PATH_KEY = re.compile(r"[A-Za-z_][A-Za-z0-9_]*\Z") +_SAFE_FILE_PART = re.compile(r"[A-Za-z0-9][A-Za-z0-9._-]{0,127}\Z") +_IMAGE_MIME_TYPES = frozenset({"image/png", "image/jpeg", "image/webp"}) +_SHA256 = re.compile(r"[0-9a-f]{64}\Z") +_HTTPS_HOSTNAME = re.compile( + r"(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+" + r"[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\Z" +) +_MISSING = object() +_LIVE_EVIDENCE_TOKEN = object() + + +class LighthouseError(ValueError): + """Raised when lighthouse evidence or fixture input fails closed.""" + + +@dataclass(frozen=True) +class ProvisionalEvidence: + """Offline-only layout data that can never render with a live label.""" + + response: dict[str, Any] + + @property + def label(self) -> str: + return PROVISIONAL_LABEL + + @property + def kind(self) -> Literal["provisional"]: + return "provisional" + + +@dataclass(frozen=True, init=False) +class LiveRefreshEvidence: + """Receipt-bound live evidence; direct construction is forbidden.""" + + _response: dict[str, Any] + _projected_response_sha256: str + reviewed: bool + + def __init__( + self, + response: Any = None, + reviewed: bool = False, + *, + projected_response_sha256: str | None = None, + _token: object | None = None, + ) -> None: + if _token is not _LIVE_EVIDENCE_TOKEN: + raise LighthouseError( + "live evidence can only be loaded from a committed cache and receipt" + ) + if not isinstance(reviewed, bool): + raise LighthouseError("reviewed must be a boolean") + validated = validate_committed_cache(response) + digest = committed_response_digest(validated) + if projected_response_sha256 != digest: + raise LighthouseError("live evidence digest does not match its receipt") + object.__setattr__(self, "_response", validated) + object.__setattr__(self, "_projected_response_sha256", digest) + object.__setattr__(self, "reviewed", reviewed) + + @property + def response(self) -> dict[str, Any]: + return _json_clone(self._response, label="live evidence response") + + def assert_provenance(self) -> None: + if committed_response_digest(self._response) != self._projected_response_sha256: + raise LighthouseError("live evidence no longer matches its receipt") + + @property + def label(self) -> str: + return REVIEWED_LIVE_LABEL if self.reviewed else LIVE_REVIEW_LABEL + + @property + def kind(self) -> Literal["live"]: + return "live" + + +LighthouseEvidence: TypeAlias = ProvisionalEvidence | LiveRefreshEvidence + + +@dataclass(frozen=True) +class ComparisonIssue: + """One independently retained expected/actual/grounding mismatch.""" + + code: Literal[ + "MISSING", "UNEXPECTED", "WRONG", "UNGROUNDED", "INVALID_METADATA" + ] + path: str + message: str + + def as_dict(self) -> dict[str, str]: + return {"code": self.code, "path": self.path, "message": self.message} + + +@dataclass(frozen=True) +class ComparisonReport: + """Complete comparison result; any issue makes the evidence fail.""" + + issues: tuple[ComparisonIssue, ...] + expected_leaves: int + matched_leaves: int + grounded_leaves: int + + @property + def passed(self) -> bool: + return not self.issues + + @property + def exit_code(self) -> int: + return 0 if self.passed else 1 + + def as_dict(self) -> dict[str, Any]: + return { + "passed": self.passed, + "exitCode": self.exit_code, + "expectedLeaves": self.expected_leaves, + "matchedLeaves": self.matched_leaves, + "groundedLeaves": self.grounded_leaves, + "issues": [issue.as_dict() for issue in self.issues], + } + + +@dataclass(frozen=True) +class SourceBox: + """One independently recorded, page-bounded source location.""" + + page_index: Literal[0] + x: float + y: float + width: float + height: float + + def as_metadata(self) -> dict[str, Any]: + return { + "pageIndex": self.page_index, + "bbox": { + "x": self.x, + "y": self.y, + "width": self.width, + "height": self.height, + }, + } + + +@dataclass(frozen=True) +class FixtureField: + path: tuple[PathPart, ...] + label: str + value: JsonScalar + source_box: SourceBox | None = None + + +@dataclass(frozen=True) +class SyntheticFixture: + version: int + slug: str + source_status: Literal["synthetic"] + filename: PurePosixPath + title: str + subtitle: str + page_width: float + page_height: float + fields: tuple[FixtureField, ...] + + +@dataclass(frozen=True) +class PublicFormProvenance: + """Frozen identity for an official form and its privacy-safe demo copy.""" + + publisher: str + official_form_name: str + canonical_source_url: str + original_sha256: str + source_sha256: str + + +@dataclass(frozen=True) +class PublicFormFixture: + """Authentic public form populated only with privacy-safe demo values.""" + + version: int + slug: str + source_status: Literal["public-form-demo"] + filename: PurePosixPath + title: str + subtitle: str + page_width: float + page_height: float + fields: tuple[FixtureField, ...] + provenance: PublicFormProvenance + + +LighthouseFixture: TypeAlias = SyntheticFixture | PublicFormFixture + + +def _validate_json_tree(value: Any, *, label: str) -> None: + """Reject non-JSON, cyclic, oversized, and non-finite structures.""" + + pending: list[tuple[Any, int]] = [(value, 0)] + seen: set[int] = set() + nodes = 0 + while pending: + current, depth = pending.pop() + nodes += 1 + if nodes > MAX_JSON_NODES: + raise LighthouseError(f"{label} exceeds the JSON node limit") + if depth > MAX_JSON_DEPTH: + raise LighthouseError(f"{label} exceeds the JSON depth limit") + + if current is None or isinstance(current, (bool, int)): + continue + if isinstance(current, float): + if not math.isfinite(current): + raise LighthouseError(f"{label} contains a non-finite number") + continue + if isinstance(current, str): + if len(current) > MAX_JSON_STRING_LENGTH: + raise LighthouseError(f"{label} contains an oversized string") + continue + if isinstance(current, dict): + identity = id(current) + if identity in seen: + raise LighthouseError(f"{label} contains a cyclic container") + seen.add(identity) + for key, child in current.items(): + if not isinstance(key, str): + raise LighthouseError(f"{label} contains a non-string object key") + if len(key) > MAX_JSON_STRING_LENGTH: + raise LighthouseError(f"{label} contains an oversized object key") + pending.append((child, depth + 1)) + continue + if isinstance(current, list): + identity = id(current) + if identity in seen: + raise LighthouseError(f"{label} contains a cyclic container") + seen.add(identity) + pending.extend((child, depth + 1) for child in current) + continue + raise LighthouseError(f"{label} contains unsupported JSON data") + + +def _json_clone(value: Any, *, label: str) -> Any: + _validate_json_tree(value, label=label) + try: + serialized = json.dumps( + value, + ensure_ascii=False, + separators=(",", ":"), + allow_nan=False, + ) + return json.loads(serialized) + except (TypeError, ValueError, RecursionError): + raise LighthouseError(f"{label} is not safe JSON") from None + + +def _read_json( + path: str | Path, + *, + label: str, + max_bytes: int = MAX_FIXTURE_BYTES, +) -> Any: + try: + source = Path(path) + if source.is_symlink() or not source.is_file(): + raise LighthouseError(f"{label} path must be a regular, non-symlink file") + if source.stat().st_size > max_bytes: + raise LighthouseError(f"{label} file exceeds the size limit") + payload = source.read_bytes() + except LighthouseError: + raise + except (OSError, TypeError, ValueError): + raise LighthouseError(f"could not safely read {label} file") from None + + def reject_duplicates(pairs: list[tuple[str, Any]]) -> dict[str, Any]: + result: dict[str, Any] = {} + for key, value in pairs: + if key in result: + raise LighthouseError(f"{label} contains a duplicate object key") + result[key] = value + return result + + try: + return json.loads( + payload.decode("utf-8"), + object_pairs_hook=reject_duplicates, + parse_constant=lambda _value: (_ for _ in ()).throw( + LighthouseError(f"{label} contains a non-finite number") + ), + ) + except LighthouseError: + raise + except (UnicodeError, json.JSONDecodeError, RecursionError): + raise LighthouseError(f"{label} file is malformed JSON") from None + + +def _validated_extract_response(response: Any, *, label: str) -> dict[str, Any]: + cloned = _json_clone(response, label=label) + try: + validated = validate_response(cloned, EXTRACT_ENDPOINT) + except (CacheError, TypeError, ValueError, RecursionError): + raise LighthouseError(f"{label} is not a valid Extract response") from None + request_id = validated.get("requestId") + if ( + not isinstance(request_id, str) + or not request_id + or len(request_id) > 1_000 + ): + raise LighthouseError(f"{label}.requestId must be short, non-empty text") + return validated + + +def provisional_evidence(response: Any) -> ProvisionalEvidence: + """Tag layout-only data with an unforgeable-by-label provisional type.""" + + return ProvisionalEvidence( + response=_validated_extract_response(response, label="provisional response") + ) + + +def load_provisional_evidence(path: str | Path) -> ProvisionalEvidence: + """Load the required provisional envelope, never a raw/live cache object.""" + + envelope = _read_json(path, label="provisional evidence") + if not isinstance(envelope, dict): + raise LighthouseError("provisional evidence must be a JSON object") + if set(envelope) != {"sourceStatus", "response"}: + raise LighthouseError( + "provisional evidence must contain only sourceStatus and response" + ) + if envelope["sourceStatus"] != PROVISIONAL_SOURCE_STATUS: + raise LighthouseError("unsupported provisional source status") + return provisional_evidence(envelope["response"]) + + +def validate_committed_cache(response: Any) -> dict[str, Any]: + """Validate the narrow top-level and Extract-output cache envelopes.""" + + if not isinstance(response, Mapping): + raise LighthouseError("committed cache must be a JSON object") + actual_keys = set(response) + unexpected = actual_keys - COMMITTED_CACHE_KEYS + missing = REQUIRED_CACHE_KEYS - actual_keys + if unexpected: + raise LighthouseError( + "committed cache contains unsupported top-level keys: " + + ", ".join(sorted(str(key) for key in unexpected)) + ) + if missing: + raise LighthouseError( + "committed cache is missing required top-level keys: " + + ", ".join(sorted(missing)) + ) + validated = _validated_extract_response(response, label="committed cache") + output = validated["output"] + output_keys = set(output) + if output_keys != EXTRACT_OUTPUT_KEYS: + unexpected_output = output_keys - EXTRACT_OUTPUT_KEYS + missing_output = EXTRACT_OUTPUT_KEYS - output_keys + details: list[str] = [] + if unexpected_output: + details.append( + "unsupported output keys " + + ", ".join(sorted(str(key) for key in unexpected_output)) + ) + if missing_output: + details.append( + "missing output keys " + ", ".join(sorted(missing_output)) + ) + raise LighthouseError("committed cache has " + "; ".join(details)) + _page_dimensions_from_pages(output["pages"]) + return validated + + +def project_committed_cache(response: Any) -> dict[str, Any]: + """Project a live response to only the exact lighthouse allowlist.""" + + if not isinstance(response, Mapping): + raise LighthouseError("live response must be a JSON object") + projected = { + key: response[key] + for key in ("status", "requestId", "output", "reconstructed") + if key in response + } + return validate_committed_cache(projected) + + +def committed_response_digest(response: Any) -> str: + """Return the deterministic digest bound into a live-refresh receipt.""" + + validated = validate_committed_cache(response) + payload = json.dumps( + validated, + ensure_ascii=False, + sort_keys=True, + separators=(",", ":"), + allow_nan=False, + ).encode("utf-8") + return hashlib.sha256(payload).hexdigest() + + +def _validate_live_receipt(receipt: Any, response: Mapping[str, Any]) -> str: + if not isinstance(receipt, dict) or set(receipt) != LIVE_RECEIPT_KEYS: + raise LighthouseError( + "live-refresh receipt must contain exactly the documented keys" + ) + if receipt["receiptVersion"] != 1 or isinstance( + receipt["receiptVersion"], bool + ): + raise LighthouseError("unsupported live-refresh receipt version") + if receipt["sourceStatus"] != LIVE_RECEIPT_SOURCE_STATUS: + raise LighthouseError("unsupported live-refresh receipt source status") + request_id = receipt["requestId"] + if not isinstance(request_id, str) or request_id != response["requestId"]: + raise LighthouseError("live-refresh receipt requestId does not match cache") + digest = receipt["projectedResponseSha256"] + if not isinstance(digest, str) or not _SHA256.fullmatch(digest): + raise LighthouseError("live-refresh receipt digest is malformed") + if digest != committed_response_digest(response): + raise LighthouseError("live-refresh receipt digest does not match cache") + return digest + + +def _is_reconstructed_response(response: Mapping[str, Any]) -> bool: + if response.get("requestId") == "reconstructed": + return True + if "reconstructed" not in response: + return False + marker = response["reconstructed"] + return marker is not None and marker is not False + + +def load_committed_live_evidence( + cache_path: str | Path, + receipt_path: str | Path, + *, + reviewed: bool = False, +) -> LiveRefreshEvidence: + """Load live evidence only from a cache plus its matching refresh receipt.""" + + response = validate_committed_cache( + _read_json( + cache_path, + label="committed live cache", + max_bytes=MAX_CACHE_BYTES, + ) + ) + if _is_reconstructed_response(response): + raise LighthouseError("reconstructed responses cannot be labelled live") + receipt = _read_json( + receipt_path, + label="live-refresh receipt", + max_bytes=MAX_FIXTURE_BYTES, + ) + digest = _validate_live_receipt(receipt, response) + return LiveRefreshEvidence( + response=response, + reviewed=reviewed, + projected_response_sha256=digest, + _token=_LIVE_EVIDENCE_TOKEN, + ) + + +def _path(parent: str, key: str | int) -> str: + if isinstance(key, int): + return f"{parent}[{key}]" + if _SAFE_PATH_KEY.fullmatch(key): + return f"{parent}.{key}" + return f"{parent}[{json.dumps(key, ensure_ascii=False)}]" + + +def _json_type(value: Any) -> str: + if value is None: + return "null" + if isinstance(value, bool): + return "boolean" + if isinstance(value, (int, float)): + return "number" + if isinstance(value, str): + return "string" + if isinstance(value, list): + return "array" + if isinstance(value, dict): + return "object" + return type(value).__name__ + + +def _equal_json_scalar(expected: JsonScalar, actual: Any) -> bool: + if isinstance(expected, bool) or isinstance(actual, bool): + return type(expected) is type(actual) and expected == actual + if expected is None or actual is None: + return expected is actual + if isinstance(expected, (int, float)) and isinstance(actual, (int, float)): + return expected == actual + return type(expected) is type(actual) and expected == actual + + +def _page_dimensions_from_pages(pages: Any) -> tuple[float, float]: + if not isinstance(pages, list) or len(pages) != 1: + raise LighthouseError("lighthouse evidence requires exactly one page") + page = pages[0] + if not isinstance(page, dict): + raise LighthouseError("lighthouse page metadata must be an object") + width = _finite_dimension( + page.get("width"), + label="API page width", + lower=1.0, + upper=20_000.0, + ) + height = _finite_dimension( + page.get("height"), + label="API page height", + lower=1.0, + upper=20_000.0, + ) + return width, height + + +def _grounding_issue( + metadata: Any, + path: str, + page_dimensions: tuple[float, float], +) -> ComparisonIssue | None: + if metadata is None: + return ComparisonIssue("UNGROUNDED", path, "no source metadata") + if not isinstance(metadata, dict): + return ComparisonIssue( + "INVALID_METADATA", path, "source metadata must be an object" + ) + bbox = metadata.get("bbox") + page_index = metadata.get("pageIndex") + if not isinstance(page_index, int) or isinstance(page_index, bool) or page_index != 0: + return ComparisonIssue( + "INVALID_METADATA", path, "pageIndex must be exactly 0 for one-page evidence" + ) + if not isinstance(bbox, dict): + return ComparisonIssue( + "UNGROUNDED", path, "source metadata has no bounding box" + ) + required_bbox_keys = {"x", "y", "width", "height"} + if set(bbox) != required_bbox_keys: + return ComparisonIssue( + "INVALID_METADATA", + path, + "bounding box must contain exactly x, y, width, and height", + ) + for coordinate in ("x", "y", "width", "height"): + value = bbox[coordinate] + if isinstance(value, bool) or not isinstance(value, (int, float)): + return ComparisonIssue( + "INVALID_METADATA", path, f"bounding box {coordinate} must be numeric" + ) + if not math.isfinite(float(value)): + return ComparisonIssue( + "INVALID_METADATA", path, f"bounding box {coordinate} must be finite" + ) + if bbox["x"] < 0 or bbox["y"] < 0: + return ComparisonIssue( + "INVALID_METADATA", path, "bounding box origin must be non-negative" + ) + if bbox["width"] <= 0 or bbox["height"] <= 0: + return ComparisonIssue( + "INVALID_METADATA", path, "bounding box dimensions must be positive" + ) + page_width, page_height = page_dimensions + if bbox["x"] + bbox["width"] > page_width: + return ComparisonIssue( + "INVALID_METADATA", path, "bounding box exceeds the page width" + ) + if bbox["y"] + bbox["height"] > page_height: + return ComparisonIssue( + "INVALID_METADATA", path, "bounding box exceeds the page height" + ) + return None + + +def _subtree_leaf_items(value: Any, path: str) -> list[tuple[str, Any]]: + if isinstance(value, dict): + if not value: + return [(path, value)] + leaves: list[tuple[str, Any]] = [] + for key in sorted(value): + leaves.extend(_subtree_leaf_items(value[key], _path(path, key))) + return leaves + if isinstance(value, list): + if not value: + return [(path, value)] + leaves: list[tuple[str, Any]] = [] + for index, child in enumerate(value): + leaves.extend(_subtree_leaf_items(child, _path(path, index))) + return leaves + return [(path, value)] + + +def _subtree_leaf_paths(value: Any, path: str) -> list[str]: + return [leaf_path for leaf_path, _value in _subtree_leaf_items(value, path)] + + +def compare_expected( + expected: Any, + actual: Any, + metadata: Any, + *, + pages: Any, +) -> ComparisonReport: + """Compare independent source truth with output and retain every issue. + + Exit semantics are encoded on ``ComparisonReport``: zero means every + expected leaf matched and was grounded; one means the evidence cannot + support a successful-extraction claim. + """ + + expected = _json_clone(expected, label="expected source truth") + actual = _json_clone(actual, label="actual output") + metadata = _json_clone(metadata, label="source metadata") + pages = _json_clone(pages, label="API pages") + page_dimensions = _page_dimensions_from_pages(pages) + issues: list[ComparisonIssue] = [] + expected_leaves = 0 + matched_leaves = 0 + grounded_leaves = 0 + + def visit(expected_node: Any, actual_node: Any, meta_node: Any, path: str) -> None: + nonlocal expected_leaves, matched_leaves, grounded_leaves + if isinstance(expected_node, dict): + if not isinstance(actual_node, dict): + leaf_paths = _subtree_leaf_paths(expected_node, path) + issues.append( + ComparisonIssue( + "WRONG", + path, + f"expected object, got {_json_type(actual_node)}", + ) + ) + expected_leaves += len(leaf_paths) + for leaf_path in leaf_paths: + if leaf_path != path: + issues.append( + ComparisonIssue( + "WRONG", + leaf_path, + f"ancestor {path} has the wrong container type", + ) + ) + if isinstance(actual_node, list): + for leaf_path, leaf_value in _subtree_leaf_items( + actual_node, path + ): + if leaf_path != path: + issues.append( + ComparisonIssue( + "UNEXPECTED", + leaf_path, + f"unexpected value {leaf_value!r} is inside wrong-shape ancestor {path}", + ) + ) + return + expected_keys = set(expected_node) + actual_keys = set(actual_node) + for key in sorted(expected_keys - actual_keys): + child_path = _path(path, key) + leaf_paths = _subtree_leaf_paths(expected_node[key], child_path) + for leaf_path in leaf_paths: + issues.append( + ComparisonIssue( + "MISSING", leaf_path, "expected source leaf is absent" + ) + ) + expected_leaves += len(leaf_paths) + for key in sorted(actual_keys - expected_keys): + child_path = _path(path, key) + for leaf_path, leaf_value in _subtree_leaf_items( + actual_node[key], child_path + ): + issues.append( + ComparisonIssue( + "UNEXPECTED", + leaf_path, + f"unexpected value {leaf_value!r} is not in source truth", + ) + ) + for key in sorted(expected_keys & actual_keys): + child_meta = meta_node.get(key) if isinstance(meta_node, dict) else None + visit(expected_node[key], actual_node[key], child_meta, _path(path, key)) + return + + if isinstance(expected_node, list): + if not isinstance(actual_node, list): + leaf_paths = _subtree_leaf_paths(expected_node, path) + issues.append( + ComparisonIssue( + "WRONG", + path, + f"expected array, got {_json_type(actual_node)}", + ) + ) + expected_leaves += len(leaf_paths) + for leaf_path in leaf_paths: + if leaf_path != path: + issues.append( + ComparisonIssue( + "WRONG", + leaf_path, + f"ancestor {path} has the wrong container type", + ) + ) + if isinstance(actual_node, dict): + for leaf_path, leaf_value in _subtree_leaf_items( + actual_node, path + ): + if leaf_path != path: + issues.append( + ComparisonIssue( + "UNEXPECTED", + leaf_path, + f"unexpected value {leaf_value!r} is inside wrong-shape ancestor {path}", + ) + ) + return + for index in range(len(actual_node), len(expected_node)): + child_path = _path(path, index) + leaf_paths = _subtree_leaf_paths(expected_node[index], child_path) + for leaf_path in leaf_paths: + issues.append( + ComparisonIssue( + "MISSING", leaf_path, "expected source leaf is absent" + ) + ) + expected_leaves += len(leaf_paths) + for index in range(len(expected_node), len(actual_node)): + child_path = _path(path, index) + for leaf_path, leaf_value in _subtree_leaf_items( + actual_node[index], child_path + ): + issues.append( + ComparisonIssue( + "UNEXPECTED", + leaf_path, + f"unexpected value {leaf_value!r} is not in source truth", + ) + ) + metadata_items = meta_node if isinstance(meta_node, list) else [] + for index in range(min(len(expected_node), len(actual_node))): + child_meta = ( + metadata_items[index] if index < len(metadata_items) else None + ) + visit( + expected_node[index], + actual_node[index], + child_meta, + _path(path, index), + ) + return + + expected_leaves += 1 + if isinstance(actual_node, (dict, list)): + issues.append( + ComparisonIssue( + "WRONG", + path, + f"expected {_json_type(expected_node)}, got {_json_type(actual_node)}", + ) + ) + for leaf_path, leaf_value in _subtree_leaf_items(actual_node, path): + if leaf_path != path: + issues.append( + ComparisonIssue( + "UNEXPECTED", + leaf_path, + f"unexpected value {leaf_value!r} is inside wrong-shape leaf {path}", + ) + ) + elif not _equal_json_scalar(expected_node, actual_node): + issues.append( + ComparisonIssue( + "WRONG", + path, + f"expected {expected_node!r}, got {actual_node!r}", + ) + ) + else: + matched_leaves += 1 + grounding_issue = _grounding_issue(meta_node, path, page_dimensions) + if grounding_issue is None: + grounded_leaves += 1 + else: + issues.append(grounding_issue) + + visit(expected, actual, metadata, "$") + return ComparisonReport( + issues=tuple(issues), + expected_leaves=expected_leaves, + matched_leaves=matched_leaves, + grounded_leaves=grounded_leaves, + ) + + +def compare_evidence(expected: Any, evidence: LighthouseEvidence) -> ComparisonReport: + """Compare a typed evidence response against separate expected truth.""" + + if not isinstance(evidence, (ProvisionalEvidence, LiveRefreshEvidence)): + raise LighthouseError("evidence must use a lighthouse evidence type") + if isinstance(evidence, LiveRefreshEvidence): + evidence.assert_provenance() + output = evidence.response["output"] + return compare_expected( + expected, + output["data"], + output["metadata"], + pages=output["pages"], + ) + + +def _fixture_text(value: Any, *, label: str, allow_empty: bool = False) -> str: + if not isinstance(value, str): + raise LighthouseError(f"{label} must be text") + if not allow_empty and not value.strip(): + raise LighthouseError(f"{label} must not be empty") + if len(value) > 160: + raise LighthouseError(f"{label} is too long") + if any(ord(character) < 32 or ord(character) > 126 for character in value): + raise LighthouseError(f"{label} must use printable ASCII") + return value + + +def _finite_dimension(value: Any, *, label: str, lower: float, upper: float) -> float: + if isinstance(value, bool) or not isinstance(value, (int, float)): + raise LighthouseError(f"{label} must be numeric") + normalized = float(value) + if not math.isfinite(normalized) or not lower <= normalized <= upper: + raise LighthouseError(f"{label} is outside the supported finite range") + return normalized + + +def _safe_relative_filename(value: Any) -> PurePosixPath: + if not isinstance(value, str) or not value: + raise LighthouseError("document.filename must be non-empty text") + if "\\" in value: + raise LighthouseError("document.filename must use a safe relative path") + filename = PurePosixPath(value) + if ( + filename.is_absolute() + or ".." in filename.parts + or "." in filename.parts + or filename.suffix.lower() != ".pdf" + or not filename.parts + or any(not _SAFE_FILE_PART.fullmatch(part) for part in filename.parts) + ): + raise LighthouseError("document.filename must be a safe relative PDF path") + return filename + + +def _canonical_https_url(value: Any) -> str: + if not isinstance(value, str) or value != value.strip() or not value: + raise LighthouseError( + "provenance.canonicalSourceUrl must be canonical HTTPS text" + ) + if len(value) > 2_048 or any(ord(character) < 33 or ord(character) > 126 for character in value): + raise LighthouseError( + "provenance.canonicalSourceUrl must be canonical HTTPS text" + ) + try: + parsed = urlsplit(value) + port = parsed.port + except ValueError: + raise LighthouseError( + "provenance.canonicalSourceUrl must be a canonical HTTPS URL" + ) from None + hostname = parsed.hostname + if ( + parsed.scheme != "https" + or not hostname + or not _HTTPS_HOSTNAME.fullmatch(hostname) + or not any(character.isalpha() for character in hostname) + or parsed.username is not None + or parsed.password is not None + or port is not None + or parsed.query + or parsed.fragment + or not parsed.path.startswith("/") + or "\\" in parsed.path + or any(part in {".", ".."} for part in parsed.path.split("/")) + or re.search(r"%(?![0-9A-F]{2})", parsed.path) + ): + raise LighthouseError( + "provenance.canonicalSourceUrl must be a canonical HTTPS URL" + ) + canonical = urlunsplit(("https", hostname, parsed.path or "/", "", "")) + if value != canonical: + raise LighthouseError( + "provenance.canonicalSourceUrl must be a canonical HTTPS URL" + ) + return value + + +def _fixture_sha256(value: Any, *, label: str) -> str: + if not isinstance(value, str) or not _SHA256.fullmatch(value): + raise LighthouseError(f"{label} must be a lowercase SHA-256 digest") + return value + + +def _source_box( + value: Any, + *, + label: str, + page_width: float, + page_height: float, +) -> SourceBox: + if not isinstance(value, dict) or set(value) != {"pageIndex", "bbox"}: + raise LighthouseError( + f"{label} must contain exactly pageIndex and bbox" + ) + if value["pageIndex"] != 0 or isinstance(value["pageIndex"], bool): + raise LighthouseError(f"{label}.pageIndex must be exactly 0") + bbox = value["bbox"] + if not isinstance(bbox, dict) or set(bbox) != {"x", "y", "width", "height"}: + raise LighthouseError( + f"{label}.bbox must contain exactly x, y, width, and height" + ) + coordinates: dict[str, float] = {} + for name in ("x", "y", "width", "height"): + raw = bbox[name] + if isinstance(raw, bool) or not isinstance(raw, (int, float)): + raise LighthouseError(f"{label}.bbox.{name} must be numeric") + normalized = float(raw) + if not math.isfinite(normalized): + raise LighthouseError(f"{label}.bbox.{name} must be finite") + coordinates[name] = normalized + if coordinates["x"] < 0 or coordinates["y"] < 0: + raise LighthouseError(f"{label}.bbox origin must be non-negative") + if coordinates["width"] <= 0 or coordinates["height"] <= 0: + raise LighthouseError(f"{label}.bbox dimensions must be positive") + if coordinates["x"] + coordinates["width"] > page_width: + raise LighthouseError(f"{label}.bbox exceeds the declared page width") + if coordinates["y"] + coordinates["height"] > page_height: + raise LighthouseError(f"{label}.bbox exceeds the declared page height") + return SourceBox( + page_index=0, + x=coordinates["x"], + y=coordinates["y"], + width=coordinates["width"], + height=coordinates["height"], + ) + + +def _fixture_fields( + raw_fields: Any, + *, + page_width: float, + page_height: float, + require_source_boxes: bool, +) -> tuple[FixtureField, ...]: + if not isinstance(raw_fields, list) or not 1 <= len(raw_fields) <= MAX_FIELDS: + raise LighthouseError(f"fixture.fields must contain 1 to {MAX_FIELDS} items") + fields: list[FixtureField] = [] + seen_paths: set[tuple[PathPart, ...]] = set() + required_keys = {"path", "label", "value", "source"} if require_source_boxes else { + "path", + "label", + "value", + } + for index, raw_field in enumerate(raw_fields): + label_prefix = f"fixture.fields[{index}]" + if not isinstance(raw_field, dict) or set(raw_field) != required_keys: + raise LighthouseError(f"{label_prefix} has unsupported or missing keys") + raw_path = raw_field["path"] + if not isinstance(raw_path, list) or not raw_path or len(raw_path) > 16: + raise LighthouseError(f"{label_prefix}.path must be a non-empty array") + parts: list[PathPart] = [] + for part in raw_path: + if isinstance(part, bool) or not isinstance(part, (str, int)): + raise LighthouseError(f"{label_prefix}.path contains an invalid segment") + if isinstance(part, int) and part < 0: + raise LighthouseError(f"{label_prefix}.path indices must be non-negative") + if isinstance(part, str) and (not part or len(part) > 80): + raise LighthouseError(f"{label_prefix}.path keys must be short and non-empty") + parts.append(part) + path = tuple(parts) + if path in seen_paths: + raise LighthouseError(f"{label_prefix}.path is duplicated") + for prior in seen_paths: + if path[: len(prior)] == prior or prior[: len(path)] == path: + raise LighthouseError("fixture field paths must not overlap") + seen_paths.add(path) + + scalar = raw_field["value"] + if isinstance(scalar, (dict, list)): + raise LighthouseError(f"{label_prefix}.value must be a JSON scalar") + _validate_json_tree(scalar, label=f"{label_prefix}.value") + visible = _visible_scalar(scalar) + _fixture_text(visible, label=f"{label_prefix}.value", allow_empty=True) + source_box = ( + _source_box( + raw_field["source"], + label=f"{label_prefix}.source", + page_width=page_width, + page_height=page_height, + ) + if require_source_boxes + else None + ) + fields.append( + FixtureField( + path=path, + label=_fixture_text(raw_field["label"], label=f"{label_prefix}.label"), + value=scalar, + source_box=source_box, + ) + ) + return tuple(fields) + + +def parse_fixture(value: Any, *, expected_slug: str | None = None) -> LighthouseFixture: + """Parse a generated-synthetic or authentic-public-form fixture.""" + + value = _json_clone(value, label="fixture") + if not isinstance(value, dict): + raise LighthouseError("fixture must be a JSON object") + version = value.get("version") + source_status = value.get("sourceStatus") + if version == 1 and not isinstance(version, bool): + if source_status != SYNTHETIC_SOURCE_STATUS: + raise LighthouseError( + "unsupported fixture source status; version-1 fixtures must remain synthetic" + ) + required = {"version", "slug", "sourceStatus", "document", "fields"} + elif version == 2 and not isinstance(version, bool): + if source_status != PUBLIC_FORM_SOURCE_STATUS: + raise LighthouseError( + "unsupported fixture version/source status pairing" + ) + required = { + "version", + "slug", + "sourceStatus", + "document", + "provenance", + "fields", + } + else: + raise LighthouseError("unsupported fixture version") + if set(value) != required: + raise LighthouseError("fixture must contain exactly the documented top-level keys") + slug = value["slug"] + if not isinstance(slug, str) or not _SLUG.fullmatch(slug): + raise LighthouseError("fixture.slug is malformed") + if expected_slug is not None and slug != expected_slug: + raise LighthouseError("fixture.slug does not match the selected demo") + + document = value["document"] + if not isinstance(document, dict): + raise LighthouseError("fixture.document must be an object") + if set(document) != {"filename", "title", "subtitle", "width", "height"}: + raise LighthouseError("fixture.document has unsupported or missing keys") + page_width = _finite_dimension( + document["width"], + label="document.width", + lower=MIN_PAGE_WIDTH, + upper=MAX_PAGE_WIDTH, + ) + page_height = _finite_dimension( + document["height"], + label="document.height", + lower=MIN_PAGE_HEIGHT, + upper=MAX_PAGE_HEIGHT, + ) + fields = _fixture_fields( + value["fields"], + page_width=page_width, + page_height=page_height, + require_source_boxes=version == 2, + ) + common = dict( + version=version, + slug=slug, + filename=_safe_relative_filename(document["filename"]), + title=_fixture_text(document["title"], label="document.title"), + subtitle=_fixture_text( + document["subtitle"], label="document.subtitle", allow_empty=True + ), + page_width=page_width, + page_height=page_height, + fields=fields, + ) + if version == 1: + return SyntheticFixture( + source_status=SYNTHETIC_SOURCE_STATUS, + **common, + ) + + provenance = value["provenance"] + if not isinstance(provenance, dict) or set(provenance) != { + "publisher", + "officialFormName", + "canonicalSourceUrl", + "originalSha256", + "sourceSha256", + }: + raise LighthouseError("fixture.provenance has unsupported or missing keys") + return PublicFormFixture( + source_status=PUBLIC_FORM_SOURCE_STATUS, + provenance=PublicFormProvenance( + publisher=_fixture_text( + provenance["publisher"], label="provenance.publisher" + ), + official_form_name=_fixture_text( + provenance["officialFormName"], + label="provenance.officialFormName", + ), + canonical_source_url=_canonical_https_url( + provenance["canonicalSourceUrl"] + ), + original_sha256=_fixture_sha256( + provenance["originalSha256"], + label="provenance.originalSha256", + ), + source_sha256=_fixture_sha256( + provenance["sourceSha256"], + label="provenance.sourceSha256", + ), + ), + **common, + ) + + +def load_fixture(path: str | Path, *, expected_slug: str | None = None) -> LighthouseFixture: + return parse_fixture(_read_json(path, label="fixture"), expected_slug=expected_slug) + + +def _assign_expected(root: Any, path: tuple[PathPart, ...], value: JsonScalar) -> Any: + if root is None: + root = [] if isinstance(path[0], int) else {} + cursor = root + for index, part in enumerate(path): + is_last = index == len(path) - 1 + next_is_index = not is_last and isinstance(path[index + 1], int) + if isinstance(part, str): + if not isinstance(cursor, dict): + raise LighthouseError("fixture paths mix incompatible object and array shapes") + if is_last: + if part in cursor: + raise LighthouseError("fixture paths assign the same source value twice") + cursor[part] = value + else: + if part not in cursor: + cursor[part] = [] if next_is_index else {} + cursor = cursor[part] + else: + if not isinstance(cursor, list): + raise LighthouseError("fixture paths mix incompatible object and array shapes") + if part > len(cursor): + raise LighthouseError("fixture array paths must be contiguous") + if part == len(cursor): + cursor.append(None if is_last else ([] if next_is_index else {})) + if is_last: + if cursor[part] is not None: + raise LighthouseError("fixture paths assign the same source value twice") + cursor[part] = value + else: + cursor = cursor[part] + return root + + +def expected_from_fixture(fixture: LighthouseFixture) -> JsonValue: + """Derive the oracle only from fields that are visibly printed in the PDF.""" + + root: Any = None + for field in fixture.fields: + root = _assign_expected(root, field.path, field.value) + if root is None: + raise LighthouseError("fixture has no source fields") + return _json_clone(root, label="generated expected values") + + +def expected_json_bytes(fixture: LighthouseFixture) -> bytes: + return ( + json.dumps( + expected_from_fixture(fixture), + ensure_ascii=False, + sort_keys=True, + indent=2, + allow_nan=False, + ) + + "\n" + ).encode("utf-8") + + +def _visible_scalar(value: JsonScalar) -> str: + if value is None: + return "null" + if value is True: + return "true" + if value is False: + return "false" + if isinstance(value, float): + if not math.isfinite(value): + raise LighthouseError("fixture value must be finite") + return json.dumps(value, allow_nan=False) + return str(value) + + +def _pdf_literal(value: str) -> str: + _fixture_text(value, label="PDF text", allow_empty=True) + return "(" + value.replace("\\", "\\\\").replace("(", "\\(").replace(")", "\\)") + ")" + + +def _pdf_number(value: float) -> str: + if not math.isfinite(value): + raise LighthouseError("PDF coordinate must be finite") + return f"{value:.2f}".rstrip("0").rstrip(".") + + +def build_synthetic_pdf(fixture: SyntheticFixture) -> bytes: + """Build a stable one-page labelled-field PDF using only the stdlib.""" + + if not isinstance(fixture, SyntheticFixture): + raise LighthouseError( + "synthetic PDF generation accepts only version-1 synthetic fixtures" + ) + + width = fixture.page_width + height = fixture.page_height + margin = 42.0 + gutter = 16.0 + column_width = (width - (2 * margin) - gutter) / 2 + columns = 2 + rows = math.ceil(len(fixture.fields) / columns) + top = height - 148.0 + bottom = 38.0 + available = top - bottom + row_height = min(82.0, available / rows) + if row_height < 58.0: + raise LighthouseError("fixture fields do not fit on one supported page") + + commands = [ + "q", + "0.965 0.953 0.914 rg", + f"0 0 {_pdf_number(width)} {_pdf_number(height)} re f", + "0.075 0.082 0.092 rg", + f"0 {_pdf_number(height - 112)} {_pdf_number(width)} 112 re f", + "BT", + "/F2 22 Tf", + "0.97 0.96 0.91 rg", + f"1 0 0 1 {_pdf_number(margin)} {_pdf_number(height - 62)} Tm", + f"{_pdf_literal(fixture.title)} Tj", + "ET", + "BT", + "/F1 9 Tf", + "0.72 0.75 0.78 rg", + f"1 0 0 1 {_pdf_number(margin)} {_pdf_number(height - 84)} Tm", + f"{_pdf_literal(fixture.subtitle)} Tj", + "ET", + ] + + for index, field in enumerate(fixture.fields): + row = index // columns + column = index % columns + x = margin + column * (column_width + gutter) + y_top = top - row * row_height + y = y_top - row_height + 7.0 + commands.extend( + [ + "0.995 0.991 0.974 rg", + f"{_pdf_number(x)} {_pdf_number(y)} {_pdf_number(column_width)} " + f"{_pdf_number(row_height - 9)} re f", + "0.83 0.81 0.74 RG", + "0.65 w", + f"{_pdf_number(x)} {_pdf_number(y)} {_pdf_number(column_width)} " + f"{_pdf_number(row_height - 9)} re S", + "BT", + "/F2 8 Tf", + "0.28 0.31 0.35 rg", + f"1 0 0 1 {_pdf_number(x + 12)} {_pdf_number(y_top - 20)} Tm", + f"{_pdf_literal(field.label.upper())} Tj", + "ET", + ] + ) + visible_value = _visible_scalar(field.value) + wrapped = textwrap.wrap( + visible_value, + width=max(20, int(column_width / 6.5)), + break_long_words=True, + break_on_hyphens=False, + ) or [""] + if len(wrapped) > 2: + raise LighthouseError( + f"fixture value for {field.label!r} needs more than two PDF lines" + ) + for line_index, line in enumerate(wrapped): + commands.extend( + [ + "BT", + "/F1 12 Tf", + "0.05 0.06 0.07 rg", + f"1 0 0 1 {_pdf_number(x + 12)} " + f"{_pdf_number(y_top - 41 - line_index * 15)} Tm", + f"{_pdf_literal(line)} Tj", + "ET", + ] + ) + + commands.extend( + [ + "BT", + "/F1 7 Tf", + "0.38 0.4 0.42 rg", + f"1 0 0 1 {_pdf_number(margin)} 20 Tm", + f"{_pdf_literal('Synthetic fixture - no real personal or customer data')} Tj", + "ET", + "Q", + ] + ) + content = ("\n".join(commands) + "\n").encode("ascii") + objects = [ + b"<< /Type /Catalog /Pages 2 0 R >>", + b"<< /Type /Pages /Kids [3 0 R] /Count 1 >>", + ( + f"<< /Type /Page /Parent 2 0 R /MediaBox [0 0 {_pdf_number(width)} " + f"{_pdf_number(height)}] /Resources << /Font << /F1 4 0 R /F2 5 0 R >> >> " + "/Contents 6 0 R >>" + ).encode("ascii"), + b"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>", + b"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica-Bold >>", + b"<< /Length " + str(len(content)).encode("ascii") + b" >>\nstream\n" + content + b"endstream", + ] + payload = bytearray(b"%PDF-1.4\n%\xe2\xe3\xcf\xd3\n") + offsets = [0] + for object_number, body in enumerate(objects, start=1): + offsets.append(len(payload)) + payload.extend(f"{object_number} 0 obj\n".encode("ascii")) + payload.extend(body) + payload.extend(b"\nendobj\n") + xref_offset = len(payload) + payload.extend(f"xref\n0 {len(objects) + 1}\n".encode("ascii")) + payload.extend(b"0000000000 65535 f \n") + for offset in offsets[1:]: + payload.extend(f"{offset:010d} 00000 n \n".encode("ascii")) + payload.extend( + ( + f"trailer\n<< /Size {len(objects) + 1} /Root 1 0 R >>\n" + f"startxref\n{xref_offset}\n%%EOF\n" + ).encode("ascii") + ) + return bytes(payload) + + +def _page_dimensions(response: Mapping[str, Any]) -> tuple[float, float]: + return _page_dimensions_from_pages(response["output"]["pages"]) + + +def _lookup_path(root: Any, path: tuple[PathPart, ...]) -> Any: + cursor = root + for part in path: + if isinstance(part, str) and isinstance(cursor, dict) and part in cursor: + cursor = cursor[part] + elif isinstance(part, int) and isinstance(cursor, list) and part < len(cursor): + cursor = cursor[part] + else: + return _MISSING + return cursor + + +def _iter_leaves(value: Any, path: tuple[PathPart, ...] = ()) -> list[tuple[tuple[PathPart, ...], Any]]: + leaves: list[tuple[tuple[PathPart, ...], Any]] = [] + if isinstance(value, dict): + if value: + for key in sorted(value): + leaves.extend(_iter_leaves(value[key], path + (key,))) + else: + leaves.append((path, value)) + elif isinstance(value, list): + if value: + for index, child in enumerate(value): + leaves.extend(_iter_leaves(child, path + (index,))) + else: + leaves.append((path, value)) + else: + leaves.append((path, value)) + return leaves + + +def _display_json(value: Any) -> str: + if value is _MISSING: + return "Missing" + if isinstance(value, str): + return value + return json.dumps(value, ensure_ascii=False, sort_keys=True, allow_nan=False) + + +def _embedded_asset_url(path: Path, *, mime: str, label: str) -> str: + """Return a bundled design asset as a self-contained data URL.""" + + try: + payload = path.read_bytes() + except OSError: + raise LighthouseError(f"could not read bundled {label}") from None + if not payload: + raise LighthouseError(f"bundled {label} is empty") + return f"data:{mime};base64," + base64.b64encode(payload).decode("ascii") + + +def _cards(expected: Any, response: Mapping[str, Any], report: ComparisonReport) -> list[dict[str, Any]]: + output = response["output"] + actual = output["data"] + metadata = output["metadata"] + page_dimensions = _page_dimensions(response) + issue_codes: dict[str, list[str]] = {} + for issue in report.issues: + issue_codes.setdefault(issue.path, []).append(issue.code) + cards: list[dict[str, Any]] = [] + for path, expected_value in _iter_leaves(expected): + path_text = "$" + for part in path: + path_text = _path(path_text, part) + actual_value = _lookup_path(actual, path) + meta_value = _lookup_path(metadata, path) + bbox = None + page_index = None + if _grounding_issue(meta_value, path_text, page_dimensions) is None: + bbox = {coordinate: float(meta_value["bbox"][coordinate]) for coordinate in ("x", "y", "width", "height")} + page_index = meta_value["pageIndex"] + codes = issue_codes.get(path_text, []) + cards.append( + { + "path": path_text, + "expected": _display_json(expected_value), + "actual": _display_json(actual_value), + "status": "pass" if not codes else "fail", + "issues": codes, + "bbox": bbox, + "pageIndex": page_index, + } + ) + return cards + + +def _source_copy(source_status: str) -> dict[str, str]: + if source_status == SYNTHETIC_SOURCE_STATUS: + return { + "eyebrow": "Reviewed evidence / synthetic fixture", + "reviewed_detail": "Reviewed against the visible synthetic source.", + "page_label": "Synthetic source · page 1", + "image_alt_prefix": "Synthetic source document", + "metric_label": "source grounded", + "footnote": ( + "Correctness is determined by the independent synthetic-source " + "oracle. Recognition signals and bounding boxes are supporting " + "evidence, not a substitute for comparison." + ), + } + if source_status == PUBLIC_FORM_SOURCE_STATUS: + return { + "eyebrow": "Reviewed evidence / authentic public form", + "reviewed_detail": ( + "Reviewed against the visible authentic public form with " + "privacy-safe demo values." + ), + "page_label": ( + "Authentic public form · privacy-safe demo values · page 1" + ), + "image_alt_prefix": ( + "Authentic public form with privacy-safe demo values" + ), + "metric_label": "primary regions returned", + "footnote": ( + "Correctness is determined by the independent source oracle for " + "this authentic public form with privacy-safe demo values. " + "Recognition signals and bounding boxes are supporting evidence, " + "not a substitute for comparison." + ), + } + raise LighthouseError("unsupported rendered fixture source status") + + +def render_lighthouse_page( + *, + title: str, + summary: str, + document_name: str, + document_image: bytes, + expected: Any, + evidence: LighthouseEvidence, + image_mime: str = "image/png", + source_status: str = SYNTHETIC_SOURCE_STATUS, +) -> str: + """Render one responsive, self-contained and context-safe proof page.""" + + if not isinstance(evidence, (ProvisionalEvidence, LiveRefreshEvidence)): + raise LighthouseError("evidence must use a lighthouse evidence type") + if image_mime not in _IMAGE_MIME_TYPES: + raise LighthouseError("unsupported embedded image type") + if not isinstance(document_image, bytes) or not document_image: + raise LighthouseError("document image must contain bytes") + if len(document_image) > MAX_IMAGE_BYTES: + raise LighthouseError("document image exceeds the embedded size limit") + for value, label in ( + (title, "page title"), + (summary, "page summary"), + (document_name, "document name"), + ): + if not isinstance(value, str) or not value: + raise LighthouseError(f"{label} must be non-empty text") + + expected = _json_clone(expected, label="expected source truth") + if isinstance(evidence, LiveRefreshEvidence): + evidence.assert_provenance() + response = _validated_extract_response(evidence.response, label="page evidence") + if isinstance(evidence, LiveRefreshEvidence): + response = validate_committed_cache(response) + report = compare_expected( + expected, + response["output"]["data"], + response["output"]["metadata"], + pages=response["output"]["pages"], + ) + page_width, page_height = _page_dimensions(response) + cards = _cards(expected, response, report) + image_url = ( + f"data:{image_mime};base64," + + base64.b64encode(document_image).decode("ascii") + ) + assets_dir = Path(__file__).resolve().parent / "assets" + logo_url = _embedded_asset_url( + assets_dir / "logotype" / "nutrient-logo.svg", + mime="image/svg+xml", + label="Nutrient logo", + ) + request_id = ( + response["requestId"] if isinstance(evidence, LiveRefreshEvidence) else None + ) + source_copy = _source_copy(source_status) + client_data = { + "cards": cards, + "page": {"width": page_width, "height": page_height}, + "comparison": report.as_dict(), + } + template_dir = Path(__file__).resolve().parent / "templates" + template = create_html_env(template_dir).get_template("lighthouse.html") + return template.render( + title=title, + summary=summary, + document_name=document_name, + image_url=image_url, + logo_url=logo_url, + evidence_kind=evidence.kind, + evidence_label=evidence.label, + reviewed=isinstance(evidence, LiveRefreshEvidence) and evidence.reviewed, + request_id=request_id, + comparison=report, + cards=cards, + client_data=client_data, + source_copy=source_copy, + ) diff --git a/common/lighthouse_package.py b/common/lighthouse_package.py new file mode 100644 index 0000000..b9c9d8c --- /dev/null +++ b/common/lighthouse_package.py @@ -0,0 +1,919 @@ +"""One evidence and CLI contract for every lighthouse vertical package. + +The vertical scripts intentionally contain only copy and a ``PackageConfig``. +This module owns the evidence boundary: fixture-derived provisional layout data +is always tagged as provisional, while live evidence can only be created by an +explicit in-memory transport call and replayed from a narrow cache plus receipt. +""" + +from __future__ import annotations + +import argparse +import asyncio +import hashlib +import inspect +import json +import math +import os +import sys +import textwrap +from collections.abc import Awaitable, Callable, Mapping +from dataclasses import dataclass +from pathlib import Path +from typing import Any, TypeAlias + +import pypdfium2 as pdfium + +from . import api as nutrient_api +from .api import EXTRACT_ENDPOINT, ApiError, build_extract_instructions +from .atomic import atomic_write +from .cache import MAX_PDF_BYTES, cache_path +from .lighthouse import ( + COMMITTED_CACHE_KEYS, + LIVE_RECEIPT_SOURCE_STATUS, + PROVISIONAL_SOURCE_STATUS, + LighthouseError, + LighthouseEvidence, + LiveRefreshEvidence, + LighthouseFixture, + ProvisionalEvidence, + PublicFormFixture, + SyntheticFixture, + committed_response_digest, + compare_evidence, + expected_from_fixture, + load_committed_live_evidence, + load_fixture, + load_provisional_evidence, + project_committed_cache, + render_lighthouse_page, + validate_committed_cache, +) +from .render import ensure_page_png + + +Transport: TypeAlias = Callable[ + [bytes, str, Mapping[str, Any], str], + Awaitable[dict[str, Any]] | dict[str, Any], +] + +_DOCUMENT_CONFIG_KEYS = frozenset({"id", "name", "file", "mode", "schema"}) +_OUTPUT_KEYS = frozenset({"data", "metadata", "pages"}) +_MAX_REPOSITORY_JSON_BYTES = 2 * 1024 * 1024 + + +@dataclass(frozen=True) +class PackageConfig: + """Vertical copy and paths consumed by the shared package runner.""" + + demo_dir: Path + slug: str + page_title: str + provisional_summary: str + live_summary: str + reviewed_summary: str + + @property + def fixture_path(self) -> Path: + return self.demo_dir / "fixture.json" + + @property + def docs_path(self) -> Path: + return self.demo_dir / "docs.json" + + @property + def expected_path(self) -> Path: + return self.demo_dir / "expected.json" + + @property + def provisional_path(self) -> Path: + return self.demo_dir / "provisional" / "evidence.json" + + @property + def cache_dir(self) -> Path: + return self.demo_dir / "cache" + + @property + def output_dir(self) -> Path: + return self.demo_dir / "output" + + @property + def output_image_path(self) -> Path: + return self.output_dir / "source-page.png" + + @property + def output_comparison_path(self) -> Path: + return self.output_dir / "comparison.json" + + @property + def output_html_path(self) -> Path: + return self.output_dir / "index.html" + + @property + def provisional_output_dir(self) -> Path: + return self.demo_dir / "provisional" / "output" + + @property + def provisional_output_image_path(self) -> Path: + return self.provisional_output_dir / "source-page.png" + + @property + def provisional_output_comparison_path(self) -> Path: + return self.provisional_output_dir / "comparison.json" + + @property + def provisional_output_html_path(self) -> Path: + return self.provisional_output_dir / "index.html" + + +def _json_bytes(value: Any) -> bytes: + return ( + json.dumps( + value, + ensure_ascii=False, + sort_keys=True, + indent=2, + allow_nan=False, + ) + + "\n" + ).encode("utf-8") + + +def _canonical_json(value: Any) -> str: + return json.dumps( + value, + ensure_ascii=False, + sort_keys=True, + separators=(",", ":"), + allow_nan=False, + ) + + +def _read_repository_json(path: Path, *, label: str) -> Any: + """Read a small, regular JSON file without accepting duplicate keys.""" + + try: + if path.is_symlink() or not path.is_file(): + raise LighthouseError(f"{label} must be a regular, non-symlink file") + if path.stat().st_size > _MAX_REPOSITORY_JSON_BYTES: + raise LighthouseError(f"{label} exceeds the repository JSON size limit") + payload = path.read_bytes() + except LighthouseError: + raise + except OSError: + raise LighthouseError(f"could not safely read {label}") from None + + def reject_duplicates(pairs: list[tuple[str, Any]]) -> dict[str, Any]: + result: dict[str, Any] = {} + for key, value in pairs: + if key in result: + raise LighthouseError(f"{label} contains duplicate key {key!r}") + result[key] = value + return result + + try: + return json.loads( + payload.decode("utf-8"), + object_pairs_hook=reject_duplicates, + parse_constant=lambda _value: (_ for _ in ()).throw( + LighthouseError(f"{label} contains a non-finite number") + ), + ) + except LighthouseError: + raise + except (UnicodeError, json.JSONDecodeError, RecursionError): + raise LighthouseError(f"could not read valid {label} JSON") from None + + +def load_fixture_and_expected( + config: PackageConfig, +) -> tuple[LighthouseFixture, Any]: + """Load source truth and prove expected.json still derives from the fixture.""" + + fixture = load_fixture(config.fixture_path, expected_slug=config.slug) + if isinstance(fixture, PublicFormFixture): + source_pdf_path(config, fixture) + expected = _read_repository_json(config.expected_path, label="expected source truth") + derived = expected_from_fixture(fixture) + try: + matches = _canonical_json(expected) == _canonical_json(derived) + except (TypeError, ValueError, RecursionError): + matches = False + if not matches: + raise LighthouseError( + "expected.json does not exactly match expected_from_fixture(fixture); " + "rebuild and review the fixture before using evidence" + ) + return fixture, expected + + +def load_document_config( + config: PackageConfig, + fixture: LighthouseFixture, +) -> dict[str, Any]: + documents = _read_repository_json( + config.docs_path, + label="document configuration", + ) + if ( + not isinstance(documents, list) + or len(documents) != 1 + or not isinstance(documents[0], dict) + ): + raise LighthouseError("docs.json must contain exactly one document object") + document = documents[0] + if set(document) != _DOCUMENT_CONFIG_KEYS: + raise LighthouseError( + "document configuration has unsupported or missing keys" + ) + if document["id"] != config.slug or document["file"] != fixture.filename.as_posix(): + raise LighthouseError("document configuration does not match fixture identity") + if not isinstance(document["name"], str) or not document["name"].strip(): + raise LighthouseError("document configuration name must be non-empty text") + if not isinstance(document["mode"], str) or not document["mode"].strip(): + raise LighthouseError("document configuration mode must be non-empty text") + if not isinstance(document["schema"], Mapping): + raise LighthouseError("document configuration schema must be an object") + return document + + +def _validate_public_form_source( + source: Path, + fixture: PublicFormFixture, +) -> None: + try: + payload = source.read_bytes() + except OSError: + raise LighthouseError("could not safely read the public-form source PDF") from None + digest = hashlib.sha256(payload).hexdigest() + if digest != fixture.provenance.source_sha256: + raise LighthouseError( + "public-form source PDF does not match provenance.sourceSha256" + ) + + document = None + page = None + try: + document = pdfium.PdfDocument(source) + if len(document) != 1: + raise LighthouseError( + "public-form source PDF must contain exactly one page" + ) + page = document[0] + width, height = page.get_size() + except LighthouseError: + raise + except (OSError, RuntimeError, ValueError, pdfium.PdfiumError): + raise LighthouseError( + "public-form source PDF must be a readable one-page PDF" + ) from None + finally: + if page is not None: + page.close() + if document is not None: + document.close() + if not ( + math.isclose(width, fixture.page_width, rel_tol=0.0, abs_tol=1e-6) + and math.isclose(height, fixture.page_height, rel_tol=0.0, abs_tol=1e-6) + ): + raise LighthouseError( + "public-form source PDF dimensions do not exactly match the fixture" + ) + + +def source_pdf_path(config: PackageConfig, fixture: LighthouseFixture) -> Path: + source = config.demo_dir.joinpath(*fixture.filename.parts) + try: + if source.is_symlink() or not source.is_file(): + raise LighthouseError("source PDF must be a regular, non-symlink file") + if source.stat().st_size > MAX_PDF_BYTES: + raise LighthouseError("source PDF exceeds the size limit") + except LighthouseError: + raise + except OSError: + raise LighthouseError("could not safely inspect the source PDF") from None + if isinstance(fixture, PublicFormFixture): + _validate_public_form_source(source, fixture) + return source + + +def _visible_scalar(value: Any) -> str: + if isinstance(value, str): + return value + return json.dumps(value, ensure_ascii=False, allow_nan=False) + + +def _estimated_helvetica_width(line: str) -> float: + """Estimate the 12pt Helvetica width used by the deterministic fixture PDF.""" + + width = 0.0 + for character in line: + if character == " ": + width += 3.35 + elif character in "ilI.,'!:;|": + width += 3.0 + elif character in "MW@%&": + width += 9.4 + elif character.isupper(): + width += 7.8 + elif character.isdigit(): + width += 6.7 + elif character in "-/()": + width += 4.2 + else: + width += 6.0 + return width + + +def provisional_field_boxes( + fixture: SyntheticFixture, +) -> dict[tuple[str | int, ...], dict[str, Any]]: + """Return source-aligned boxes for the shared two-column synthetic PDF. + + The geometry mirrors ``build_synthetic_pdf`` including its two-line wrap. + It is deliberately fixture-derived layout data, never represented as API + source metadata. + """ + + if not isinstance(fixture, SyntheticFixture): + raise LighthouseError( + "generated two-column geometry accepts only synthetic fixtures" + ) + + margin = 42.0 + gutter = 16.0 + columns = 2 + column_width = (fixture.page_width - (2 * margin) - gutter) / columns + rows = math.ceil(len(fixture.fields) / columns) + layout_top = fixture.page_height - 148.0 + layout_bottom = 38.0 + row_height = min(82.0, (layout_top - layout_bottom) / rows) + if row_height < 58.0: + raise LighthouseError("fixture fields do not fit the shared one-page layout") + + boxes: dict[tuple[str | int, ...], dict[str, Any]] = {} + wrap_width = max(20, int(column_width / 6.5)) + for index, field in enumerate(fixture.fields): + row = index // columns + column = index % columns + field_x = margin + column * (column_width + gutter) + row_top = layout_top - row * row_height + first_baseline = row_top - 41.0 + lines = textwrap.wrap( + _visible_scalar(field.value), + width=wrap_width, + break_long_words=True, + break_on_hyphens=False, + ) or [""] + if len(lines) > 2: + raise LighthouseError( + f"fixture value for {field.label!r} no longer fits the source layout" + ) + text_width = max(_estimated_helvetica_width(line) for line in lines) + boxes[field.path] = { + "pageIndex": 0, + "bbox": { + "x": round(field_x + 10.0, 2), + "y": round(fixture.page_height - first_baseline - 11.0, 2), + "width": round( + min(column_width - 20.0, max(28.0, text_width + 4.0)), + 2, + ), + "height": round(16.0 + 15.0 * (len(lines) - 1), 2), + }, + } + return boxes + + +def _metadata_shape(value: Any) -> Any: + if isinstance(value, dict): + return {key: _metadata_shape(child) for key, child in value.items()} + if isinstance(value, list): + return [_metadata_shape(child) for child in value] + return None + + +def _set_path(root: Any, path: tuple[str | int, ...], value: Any) -> None: + cursor = root + for part in path[:-1]: + try: + cursor = cursor[part] + except (KeyError, IndexError, TypeError): + raise LighthouseError( + f"fixture layout path {path!r} does not match expected.json" + ) from None + try: + cursor[path[-1]] = value + except (KeyError, IndexError, TypeError): + raise LighthouseError( + f"fixture layout path {path!r} does not match expected.json" + ) from None + + +def build_provisional_envelope( + fixture: LighthouseFixture, + expected: Any, +) -> dict[str, Any]: + """Build the exact tagged provisional envelope used by every package.""" + + metadata = _metadata_shape(expected) + if isinstance(fixture, PublicFormFixture): + boxes = {} + for field in fixture.fields: + if field.source_box is None: + raise LighthouseError( + "public-form fixture field is missing its independent source box" + ) + source_box = field.source_box.as_metadata() + bbox = source_box["bbox"] + if ( + source_box["pageIndex"] != 0 + or any( + isinstance(bbox[name], bool) + or not isinstance(bbox[name], (int, float)) + or not math.isfinite(float(bbox[name])) + for name in ("x", "y", "width", "height") + ) + or bbox["x"] < 0 + or bbox["y"] < 0 + or bbox["width"] <= 0 + or bbox["height"] <= 0 + or bbox["x"] + bbox["width"] > fixture.page_width + or bbox["y"] + bbox["height"] > fixture.page_height + ): + raise LighthouseError( + "public-form fixture field has an invalid source box" + ) + boxes[field.path] = source_box + else: + boxes = provisional_field_boxes(fixture) + for field in fixture.fields: + _set_path(metadata, field.path, boxes[field.path]) + + output = { + "data": expected_from_fixture(fixture), + "metadata": metadata, + "pages": [ + {"width": fixture.page_width, "height": fixture.page_height} + ], + } + digest = hashlib.sha256(_canonical_json(output).encode("utf-8")).hexdigest() + response = validate_committed_cache( + { + "status": 200, + "requestId": f"provisional-layout-{fixture.slug}-{digest[:12]}", + "output": output, + "reconstructed": False, + } + ) + return { + "sourceStatus": PROVISIONAL_SOURCE_STATUS, + "response": response, + } + + +def load_package_provisional( + path: Path, + *, + fixture: LighthouseFixture | None = None, + expected: Any = None, +) -> ProvisionalEvidence: + evidence = load_provisional_evidence(path) + response = validate_committed_cache(evidence.response) + if set(response) != COMMITTED_CACHE_KEYS or set(response["output"]) != _OUTPUT_KEYS: + raise LighthouseError( + "provisional package response must use the exact cache-shaped envelope" + ) + if isinstance(fixture, PublicFormFixture): + if expected is None: + raise LighthouseError( + "public-form provisional validation requires expected source truth" + ) + required = build_provisional_envelope(fixture, expected)["response"] + if _canonical_json(response) != _canonical_json(required): + raise LighthouseError( + "public-form provisional evidence does not exactly match its " + "independent fixture values and source boxes" + ) + return evidence + + +def extraction_instructions(document: Mapping[str, Any]) -> dict[str, Any]: + return build_extract_instructions(document["mode"], document["schema"]) + + +def live_evidence_paths( + config: PackageConfig, + fixture: LighthouseFixture, + document: Mapping[str, Any], +) -> tuple[Path, Path]: + response_path = cache_path( + source_pdf_path(config, fixture), + EXTRACT_ENDPOINT, + extraction_instructions(document), + config.cache_dir, + ) + receipt_path = response_path.with_name(f"{response_path.stem}.receipt.json") + return response_path, receipt_path + + +def project_live_response(response: Any) -> dict[str, Any]: + """Drop transport siblings while preserving the full document field trees.""" + + if not isinstance(response, Mapping): + raise LighthouseError("live Extract response must be a JSON object") + output = response.get("output") + if not isinstance(output, Mapping): + raise LighthouseError("live Extract response is missing its output object") + missing_output = _OUTPUT_KEYS - set(output) + if missing_output: + raise LighthouseError( + "live Extract response is missing " + + ", ".join(f"output.{key}" for key in sorted(missing_output)) + ) + projected = project_committed_cache( + { + "status": response.get("status"), + "requestId": response.get("requestId"), + "output": { + "data": output["data"], + "metadata": output["metadata"], + "pages": output["pages"], + }, + "reconstructed": response.get("reconstructed", False), + } + ) + if set(projected) != COMMITTED_CACHE_KEYS or set(projected["output"]) != _OUTPUT_KEYS: + raise LighthouseError("live response did not project to the exact package envelope") + marker = projected["reconstructed"] + if projected["requestId"] == "reconstructed" or ( + marker is not None and marker is not False + ): + raise LighthouseError("reconstructed responses cannot be persisted as live evidence") + return projected + + +def _live_receipt(projected: Mapping[str, Any]) -> dict[str, Any]: + return { + "receiptVersion": 1, + "sourceStatus": LIVE_RECEIPT_SOURCE_STATUS, + "requestId": projected["requestId"], + "projectedResponseSha256": committed_response_digest(projected), + } + + +async def refresh_live_evidence( + config: PackageConfig, + fixture: LighthouseFixture, + document: Mapping[str, Any], + *, + transport: Transport | None = None, + environment: Mapping[str, str] | None = None, +) -> LiveRefreshEvidence: + """Call Extract in memory and persist only an exact cache and bound receipt.""" + + selected_environment = os.environ if environment is None else environment + api_key = selected_environment.get("NUTRIENT_API_KEY") + if not isinstance(api_key, str) or not api_key.strip(): + raise LighthouseError( + "--refresh requires NUTRIENT_API_KEY in the current environment" + ) + + pdf_path = source_pdf_path(config, fixture) + try: + pdf_bytes = pdf_path.read_bytes() + except OSError: + raise LighthouseError("could not read the source PDF") from None + if len(pdf_bytes) > MAX_PDF_BYTES: + raise LighthouseError("source PDF exceeds the size limit") + + selected_transport = transport or nutrient_api.extract_transport + try: + pending = selected_transport( + pdf_bytes, + pdf_path.name, + extraction_instructions(document), + api_key, + ) + raw_response = await pending if inspect.isawaitable(pending) else pending + except ApiError: + raise + except Exception: + raise ApiError("Nutrient extract request failed.") from None + + projected = project_live_response(raw_response) + serialized = _canonical_json(projected) + if api_key in serialized: + raise LighthouseError( + "live Extract response contained sensitive request material and was not persisted" + ) + + response_path, receipt_path = live_evidence_paths( + config, + fixture, + document, + ) + receipt = _live_receipt(projected) + # Both payloads are completely validated before either narrow destination is + # replaced. A partial write still fails closed because replay requires both. + response_payload = _json_bytes(projected) + receipt_payload = _json_bytes(receipt) + atomic_write(response_path, response_payload) + atomic_write(receipt_path, receipt_payload) + return load_committed_live_evidence( + response_path, + receipt_path, + reviewed=False, + ) + + +def load_live_replay( + config: PackageConfig, + fixture: LighthouseFixture, + document: Mapping[str, Any], + *, + reviewed: bool, +) -> LiveRefreshEvidence: + response_path, receipt_path = live_evidence_paths(config, fixture, document) + if not response_path.is_file() or not receipt_path.is_file(): + raise LighthouseError( + "receipt-bound live evidence is unavailable because its cache or " + "receipt is missing. No provisional fallback was used; select " + "--provisional for generation or --allow-provisional for a " + "layout-only check" + ) + try: + return load_committed_live_evidence( + response_path, + receipt_path, + reviewed=reviewed, + ) + except LighthouseError as error: + raise LighthouseError( + f"receipt-bound live evidence is invalid: {error}. No provisional " + "fallback was used" + ) from None + + +def comparison_artifact( + evidence: LighthouseEvidence, + report: Any, +) -> dict[str, Any]: + return { + "artifactVersion": 1, + "evidenceKind": evidence.kind, + "evidenceLabel": evidence.label, + "reviewed": isinstance(evidence, LiveRefreshEvidence) and evidence.reviewed, + "comparison": report.as_dict(), + } + + +def _artifact_paths( + config: PackageConfig, + evidence: LighthouseEvidence, +) -> tuple[Path, Path, Path]: + if isinstance(evidence, ProvisionalEvidence): + return ( + config.provisional_output_image_path, + config.provisional_output_comparison_path, + config.provisional_output_html_path, + ) + return ( + config.output_image_path, + config.output_comparison_path, + config.output_html_path, + ) + + +def _write_comparison( + config: PackageConfig, + evidence: LighthouseEvidence, + report: Any, +) -> None: + _image_path, comparison_path, _html_path = _artifact_paths(config, evidence) + atomic_write( + comparison_path, + _json_bytes(comparison_artifact(evidence, report)), + ) + + +def _summary(config: PackageConfig, evidence: LighthouseEvidence) -> str: + if isinstance(evidence, ProvisionalEvidence): + return config.provisional_summary + if evidence.reviewed: + return config.reviewed_summary + return config.live_summary + + +def write_generated_outputs( + config: PackageConfig, + fixture: LighthouseFixture, + expected: Any, + evidence: LighthouseEvidence, +) -> int: + """Render complete artifacts and return the complete comparison exit code.""" + + report = compare_evidence(expected, evidence) + response = evidence.response + page = response["output"]["pages"][0] + pdf_path = source_pdf_path(config, fixture) + image_path, comparison_path, html_path = _artifact_paths(config, evidence) + ensure_page_png( + pdf_path, + 0, + image_path, + page_dims=page, + refresh=True, + ) + _write_comparison(config, evidence, report) + html = render_lighthouse_page( + title=config.page_title, + summary=_summary(config, evidence), + document_name=fixture.title, + document_image=image_path.read_bytes(), + expected=expected, + evidence=evidence, + source_status=fixture.source_status, + ) + normalized_html = "\n".join(line.rstrip() for line in html.splitlines()) + "\n" + atomic_write(html_path, normalized_html.encode("utf-8")) + + print(f"Evidence: {evidence.label}") + print( + "Comparison: " + f"{report.matched_leaves}/{report.expected_leaves} values matched; " + f"{report.grounded_leaves}/{report.expected_leaves} source-grounded; " + f"{len(report.issues)} issue(s)." + ) + print(f"Wrote {image_path}") + print(f"Wrote {comparison_path}") + print(f"Wrote {html_path}") + if isinstance(evidence, ProvisionalEvidence): + print("RESULT: PROVISIONAL LAYOUT ONLY — NO API CALL; not release evidence.") + elif evidence.reviewed and report.passed: + print("PASS: reviewed live evidence matches the independent source oracle.") + elif report.passed: + print("RESULT: LIVE MATCH — REVIEW REQUIRED before any public claim.") + else: + print("FAIL: retained issues block a successful-extraction claim.") + return report.exit_code + + +def build_generator_parser(config: PackageConfig) -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + description=( + f"Generate the {config.slug} lighthouse package. Every mode is " + "explicit; only --refresh can read NUTRIENT_API_KEY or call Extract." + ) + ) + modes = parser.add_mutually_exclusive_group(required=True) + modes.add_argument( + "--provisional", + action="store_true", + help="Build deterministic layout-only evidence without credentials or network access.", + ) + modes.add_argument( + "--refresh", + action="store_true", + help="Explicitly call Extract and write an unreviewed exact cache plus receipt.", + ) + modes.add_argument( + "--replay-live", + action="store_true", + help="Replay a receipt-bound live cache with the review-required label.", + ) + modes.add_argument( + "--replay-reviewed", + action="store_true", + help="Replay receipt-bound live evidence after a recorded human review.", + ) + return parser + + +def build_checker_parser(config: PackageConfig) -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + description=( + f"Compare {config.slug} evidence with its independent source oracle." + ) + ) + modes = parser.add_mutually_exclusive_group() + modes.add_argument( + "--allow-provisional", + action="store_true", + help="Check tagged layout-only data while acknowledging it is not API evidence.", + ) + modes.add_argument( + "--reviewed-live", + action="store_true", + help="Check the receipt-bound live cache after a recorded human review.", + ) + return parser + + +def generator_main( + config: PackageConfig, + argv: list[str] | None = None, + *, + transport: Transport | None = None, + environment: Mapping[str, str] | None = None, +) -> int: + args = build_generator_parser(config).parse_args(argv) + try: + fixture, expected = load_fixture_and_expected(config) + document = load_document_config(config, fixture) + + if args.provisional: + envelope = build_provisional_envelope(fixture, expected) + atomic_write(config.provisional_path, _json_bytes(envelope)) + evidence: LighthouseEvidence = load_package_provisional( + config.provisional_path, + fixture=fixture, + expected=expected, + ) + elif args.refresh: + print( + "LIVE REFRESH: this explicit path can consume Data Extraction API " + "credits and requires NUTRIENT_API_KEY." + ) + evidence = asyncio.run( + refresh_live_evidence( + config, + fixture, + document, + transport=transport, + environment=environment, + ) + ) + else: + evidence = load_live_replay( + config, + fixture, + document, + reviewed=args.replay_reviewed, + ) + + return write_generated_outputs(config, fixture, expected, evidence) + except (ApiError, LighthouseError, OSError, TypeError, ValueError) as error: + print(f"ERROR: {error}", file=sys.stderr) + return 1 + + +def checker_main( + config: PackageConfig, + argv: list[str] | None = None, +) -> int: + args = build_checker_parser(config).parse_args(argv) + try: + fixture, expected = load_fixture_and_expected(config) + if args.allow_provisional: + evidence: LighthouseEvidence = load_package_provisional( + config.provisional_path, + fixture=fixture, + expected=expected, + ) + print( + "PROVISIONAL LAYOUT ONLY — NO API CALL: this comparison cannot " + "support a release claim." + ) + else: + document = load_document_config(config, fixture) + evidence = load_live_replay( + config, + fixture, + document, + reviewed=args.reviewed_live, + ) + if args.reviewed_live: + print("Checking recorded, reviewed, receipt-bound live evidence.") + else: + print("LIVE API RESPONSE — REVIEW REQUIRED before any public claim.") + + report = compare_evidence(expected, evidence) + _write_comparison(config, evidence, report) + for issue in report.issues: + print(f"{issue.code} {issue.path}: {issue.message}") + if isinstance(evidence, ProvisionalEvidence) and report.passed: + print( + f"RESULT: PROVISIONAL LAYOUT MATCH — NO API CALL; " + f"{report.matched_leaves}/{report.expected_leaves} values and " + f"{report.grounded_leaves}/{report.expected_leaves} layout boxes match." + ) + elif isinstance(evidence, LiveRefreshEvidence) and not evidence.reviewed and report.passed: + print( + f"RESULT: LIVE MATCH — REVIEW REQUIRED; " + f"{report.matched_leaves}/{report.expected_leaves} values match." + ) + elif report.passed: + print( + f"PASS: {report.matched_leaves}/{report.expected_leaves} values " + "match and every leaf has a valid source box." + ) + else: + print( + f"FAIL: retained {len(report.issues)} issue(s); " + "successful-extraction claims remain blocked." + ) + return report.exit_code + except (LighthouseError, OSError, TypeError, ValueError) as error: + print(f"BLOCKED: {error}", file=sys.stderr) + return 1 diff --git a/common/render.py b/common/render.py index ba39be9..2699859 100644 --- a/common/render.py +++ b/common/render.py @@ -131,6 +131,10 @@ def _rasterize_page( _validate_page_index(page_index) document = pdfium.PdfDocument(Path(pdf_path)) + # Form widgets are not part of the normal page-content render. The form + # environment must be initialized before retrieving a page so filled + # AcroForm values appear in the generated proof image. + document.init_forms() page = None bitmap = None try: @@ -143,6 +147,7 @@ def _rasterize_page( scale, expected_size = _render_geometry(page_width, page_height, page_dims) bitmap = page.render( scale=scale, + may_draw_forms=True, fill_color=(255, 255, 255, 255), force_bitmap_format=raw.FPDFBitmap_BGRA, rev_byteorder=True, diff --git a/common/seed_cache.py b/common/seed_cache.py index 6044f09..c90071c 100644 --- a/common/seed_cache.py +++ b/common/seed_cache.py @@ -2,11 +2,13 @@ from __future__ import annotations +import hashlib import json import math +import re import sys from html.parser import HTMLParser -from pathlib import Path +from pathlib import Path, PurePosixPath from typing import Any REPO_ROOT = Path(__file__).resolve().parents[1] @@ -22,15 +24,16 @@ build_parse_instructions, ) from common.atomic import atomic_write # noqa: E402 -from common.cache import seed_cached_response # noqa: E402 +from common.cache import ( # noqa: E402 + cache_key as compute_cache_key, + seed_cached_response, +) DEMOS_ROOT = REPO_ROOT / "demos" MANIFEST_PATH = DEMOS_ROOT / "seed_manifest.json" SC100_CARDS_PATH = DEMOS_ROOT / "sc100_extraction/output/metadata.json" SC100_HTML_PATH = DEMOS_ROOT / "sc100_extraction/output/index.html" -SC100_RESPONSE_PATH = ( - DEMOS_ROOT / "sc100_extraction/data/reconstructed_response.json" -) +SC100_RESPONSE_PATH = DEMOS_ROOT / "sc100_extraction/data/reconstructed_response.json" EXTRACT_FIXTURES = ( ("grounded_extraction", "output/metadata.json"), @@ -43,10 +46,50 @@ "data/appraisal_report_parse_results.json", ) SEEDED_FIXTURES = tuple( - (demo, source_file, EXTRACT_ENDPOINT) - for demo, source_file in EXTRACT_FIXTURES + (demo, source_file, EXTRACT_ENDPOINT) for demo, source_file in EXTRACT_FIXTURES ) + ((*PARSE_FIXTURE, PARSE_ENDPOINT),) +MANAGED_DEMOS = frozenset(demo for demo, _source, _endpoint in SEEDED_FIXTURES) +PRESERVED_INVENTORY_KIND = "reviewed_live_authentic_form" +PRESERVED_ENTRY_KEYS = frozenset( + { + "demo", + "inventory_kind", + "source_file", + "pdf", + "endpoint", + "replay_config_source", + "cache_key", + "receipt_file", + "comparison_file", + "reviewed_output_file", + "source_page_file", + "sha256", + "legacy_evidence", + } +) +PRESERVED_SHA256_KEYS = frozenset( + { + "pdf", + "response_cache", + "receipt", + "comparison", + "reviewed_output", + "source_page", + } +) +PRESERVED_LEGACY_KEYS = frozenset({"pdf", "cache_key", "receipt_file", "sha256"}) +PRESERVED_LEGACY_SHA256_KEYS = frozenset({"pdf", "response_cache", "receipt"}) +LIVE_RECEIPT_KEYS = frozenset( + {"receiptVersion", "sourceStatus", "requestId", "projectedResponseSha256"} +) +LIVE_CACHE_KEYS = frozenset({"status", "requestId", "output", "reconstructed"}) +_DEMO_ID = re.compile(r"[a-z][a-z0-9_]{0,63}\Z") +_SHA256 = re.compile(r"[0-9a-f]{64}\Z") +_EXTRACT_CACHE_KEY = re.compile( + rf"([0-9a-f]{{64}})-{re.escape(EXTRACT_ENDPOINT)}-([0-9a-f]{{64}})\Z" +) + class _Sc100PageParser(HTMLParser): """Collect committed SC-100 page dimensions from image data attributes.""" @@ -87,14 +130,396 @@ def _load_json(path: Path) -> Any: def _write_json(path: Path, value: Any) -> None: - payload = (json.dumps(value, ensure_ascii=False, indent=2) + "\n").encode( - "utf-8" - ) + payload = (json.dumps(value, ensure_ascii=False, indent=2) + "\n").encode("utf-8") if path.exists() and path.read_bytes() == payload: return atomic_write(path, payload) +def _reject_duplicate_object_keys( + pairs: list[tuple[str, Any]], +) -> dict[str, Any]: + value: dict[str, Any] = {} + for key, item in pairs: + if key in value: + raise ValueError(f"seed manifest contains duplicate key {key!r}") + value[key] = item + return value + + +def _load_existing_manifest() -> list[Any]: + if MANIFEST_PATH.is_symlink(): + raise ValueError("seed manifest must not be a symbolic link") + if not MANIFEST_PATH.exists(): + return [] + try: + with MANIFEST_PATH.open(encoding="utf-8") as manifest_file: + value = json.load( + manifest_file, + object_pairs_hook=_reject_duplicate_object_keys, + ) + except (OSError, UnicodeError, json.JSONDecodeError, RecursionError) as error: + raise ValueError(f"seed manifest is malformed: {error}") from None + if not isinstance(value, list): + raise ValueError("seed manifest must be a JSON array") + return value + + +def _require_exact_keys( + value: Any, + expected: frozenset[str], + label: str, +) -> dict[str, Any]: + if not isinstance(value, dict) or set(value) != expected: + raise ValueError(f"{label} must contain exactly {sorted(expected)!r}") + return value + + +def _require_string(value: Any, label: str) -> str: + if not isinstance(value, str) or not value: + raise ValueError(f"{label} must be a non-empty string") + return value + + +def _require_sha256(value: Any, label: str) -> str: + digest = _require_string(value, label) + if not _SHA256.fullmatch(digest): + raise ValueError(f"{label} must be a lowercase SHA-256 digest") + return digest + + +def _safe_preserved_path( + value: Any, + *, + demo: str, + label: str, + expected: str | None = None, +) -> Path: + path_value = _require_string(value, label) + if expected is not None and path_value != expected: + raise ValueError(f"{label} must be {expected!r}") + if "\\" in path_value: + raise ValueError(f"{label} must use canonical POSIX separators") + + raw_parts = path_value.split("/") + relative_path = PurePosixPath(path_value) + if ( + relative_path.is_absolute() + or any(part in {"", ".", ".."} for part in raw_parts) + or relative_path.as_posix() != path_value + ): + raise ValueError(f"{label} must be a canonical repo-relative path") + if relative_path.parts[:2] != ("demos", demo): + raise ValueError(f"{label} must stay inside demos/{demo}") + + candidate = REPO_ROOT.joinpath(*relative_path.parts) + cursor = REPO_ROOT + for part in relative_path.parts: + cursor /= part + if cursor.is_symlink(): + raise ValueError(f"{label} must not traverse a symbolic link") + try: + resolved = candidate.resolve(strict=True) + resolved.relative_to((DEMOS_ROOT / demo).resolve(strict=True)) + except (OSError, ValueError): + raise ValueError( + f"{label} must resolve to an existing file inside demos/{demo}" + ) from None + if not candidate.is_file(): + raise ValueError(f"{label} must identify a regular file") + return candidate + + +def _sha256_file(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as source_file: + while chunk := source_file.read(1024 * 1024): + digest.update(chunk) + return digest.hexdigest() + + +def _validate_file_digest(path: Path, expected: Any, label: str) -> None: + expected_digest = _require_sha256(expected, f"{label} SHA-256") + if _sha256_file(path) != expected_digest: + raise ValueError(f"{label} does not match its preserved SHA-256") + + +def _validate_extract_cache_key( + value: Any, + *, + pdf_sha256: str, + label: str, +) -> str: + cache_key = _require_string(value, label) + match = _EXTRACT_CACHE_KEY.fullmatch(cache_key) + if match is None or match.group(1) != pdf_sha256: + raise ValueError( + f"{label} must be an Extract cache key bound to its PDF SHA-256" + ) + return cache_key + + +def _response_digest(response: dict[str, Any]) -> str: + try: + payload = json.dumps( + response, + ensure_ascii=False, + sort_keys=True, + separators=(",", ":"), + allow_nan=False, + ).encode("utf-8") + except (TypeError, ValueError): + raise ValueError("preserved live cache is not canonical JSON") from None + return hashlib.sha256(payload).hexdigest() + + +def _validate_receipt_bound_cache( + response_path: Path, + receipt_path: Path, + *, + label: str, +) -> None: + response = _load_json(response_path) + if ( + not isinstance(response, dict) + or set(response) != LIVE_CACHE_KEYS + or response.get("status") != 200 + or not isinstance(response.get("requestId"), str) + or not response["requestId"] + or not isinstance(response.get("output"), dict) + or set(response["output"]) != {"data", "metadata", "pages"} + or not isinstance(response["output"]["data"], dict) + or not isinstance(response["output"]["metadata"], dict) + or not isinstance(response["output"]["pages"], list) + or response["reconstructed"] is not False + ): + raise ValueError( + f"{label} cache must be an exact, non-reconstructed live response" + ) + + receipt = _load_json(receipt_path) + if not isinstance(receipt, dict) or set(receipt) != LIVE_RECEIPT_KEYS: + raise ValueError(f"{label} receipt must contain exactly the live receipt keys") + if receipt["receiptVersion"] != 1 or isinstance(receipt["receiptVersion"], bool): + raise ValueError(f"{label} receiptVersion must be 1") + if receipt["sourceStatus"] != "live-refresh": + raise ValueError(f"{label} receipt sourceStatus must be 'live-refresh'") + request_id = response["requestId"] + if ( + not isinstance(request_id, str) + or not request_id + or receipt["requestId"] != request_id + ): + raise ValueError(f"{label} receipt requestId must match its cache") + receipt_digest = _require_sha256( + receipt["projectedResponseSha256"], + f"{label} receipt projectedResponseSha256", + ) + if receipt_digest != _response_digest(response): + raise ValueError(f"{label} receipt digest must match its cache") + + +def _validate_preserved_entry( + entry: dict[str, Any], +) -> tuple[list[str], list[str]]: + _require_exact_keys(entry, PRESERVED_ENTRY_KEYS, "preserved manifest entry") + demo = _require_string(entry["demo"], "preserved manifest demo") + if not _DEMO_ID.fullmatch(demo): + raise ValueError("preserved manifest demo must be a safe demo identifier") + if demo in MANAGED_DEMOS: + raise ValueError(f"managed demo {demo!r} cannot be preserved") + if entry["inventory_kind"] != PRESERVED_INVENTORY_KIND: + raise ValueError( + "unmanaged manifest entries must explicitly use inventory_kind " + f"{PRESERVED_INVENTORY_KIND!r}" + ) + if entry["endpoint"] != EXTRACT_URL: + raise ValueError(f"preserved manifest entry {demo!r} must use {EXTRACT_URL}") + + demo_prefix = f"demos/{demo}" + sha256 = _require_exact_keys( + entry["sha256"], + PRESERVED_SHA256_KEYS, + f"{demo}.sha256", + ) + pdf_sha256 = _require_sha256(sha256["pdf"], f"{demo}.sha256.pdf") + cache_key = _validate_extract_cache_key( + entry["cache_key"], + pdf_sha256=pdf_sha256, + label=f"{demo}.cache_key", + ) + expected_paths = { + "source_file": f"{demo_prefix}/cache/{cache_key}.json", + "replay_config_source": f"{demo_prefix}/docs.json", + "receipt_file": f"{demo_prefix}/cache/{cache_key}.receipt.json", + "comparison_file": f"{demo_prefix}/output/comparison.json", + "reviewed_output_file": f"{demo_prefix}/output/index.html", + "source_page_file": f"{demo_prefix}/output/source-page.png", + } + paths = { + key: _safe_preserved_path( + entry[key], + demo=demo, + label=f"{demo}.{key}", + expected=expected, + ) + for key, expected in expected_paths.items() + } + paths["pdf"] = _safe_preserved_path( + entry["pdf"], + demo=demo, + label=f"{demo}.pdf", + ) + + config = _document_config(DEMOS_ROOT / demo) + if _configured_pdf_path(DEMOS_ROOT / demo, config) != paths["pdf"].resolve(): + raise ValueError(f"{demo}.pdf does not match its docs.json config") + mode = config.get("mode") + schema = config.get("schema") + if not isinstance(mode, str) or not isinstance(schema, dict): + raise ValueError(f"{demo}.docs.json must contain an Extract mode and schema") + expected_cache_key = compute_cache_key( + paths["pdf"], + EXTRACT_ENDPOINT, + build_extract_instructions(mode, schema), + ) + if cache_key != expected_cache_key: + raise ValueError(f"{demo}.cache_key does not match its PDF and docs.json") + + hash_paths = { + "pdf": "pdf", + "response_cache": "source_file", + "receipt": "receipt_file", + "comparison": "comparison_file", + "reviewed_output": "reviewed_output_file", + "source_page": "source_page_file", + } + for hash_name, path_name in hash_paths.items(): + _validate_file_digest( + paths[path_name], + sha256[hash_name], + f"{demo} {hash_name}", + ) + _validate_receipt_bound_cache( + paths["source_file"], + paths["receipt_file"], + label=f"{demo} current evidence", + ) + + legacy = _require_exact_keys( + entry["legacy_evidence"], + PRESERVED_LEGACY_KEYS, + f"{demo}.legacy_evidence", + ) + legacy_sha256 = _require_exact_keys( + legacy["sha256"], + PRESERVED_LEGACY_SHA256_KEYS, + f"{demo}.legacy_evidence.sha256", + ) + legacy_pdf_sha256 = _require_sha256( + legacy_sha256["pdf"], + f"{demo}.legacy_evidence.sha256.pdf", + ) + legacy_cache_key = _validate_extract_cache_key( + legacy["cache_key"], + pdf_sha256=legacy_pdf_sha256, + label=f"{demo}.legacy_evidence.cache_key", + ) + if legacy_cache_key == cache_key: + raise ValueError(f"{demo} current and legacy cache keys must differ") + legacy_paths = { + "pdf": _safe_preserved_path( + legacy["pdf"], + demo=demo, + label=f"{demo}.legacy_evidence.pdf", + ), + "response_cache": _safe_preserved_path( + f"{demo_prefix}/cache/{legacy_cache_key}.json", + demo=demo, + label=f"{demo}.legacy_evidence.response_cache", + ), + "receipt": _safe_preserved_path( + legacy["receipt_file"], + demo=demo, + label=f"{demo}.legacy_evidence.receipt_file", + expected=f"{demo_prefix}/cache/{legacy_cache_key}.receipt.json", + ), + } + legacy_relative_pdf = PurePosixPath(legacy["pdf"]) + if legacy_relative_pdf.parts[:3] != ("demos", demo, "data"): + raise ValueError(f"{demo}.legacy_evidence.pdf must stay in its data directory") + for hash_name, path in legacy_paths.items(): + _validate_file_digest( + path, + legacy_sha256[hash_name], + f"{demo} legacy {hash_name}", + ) + _validate_receipt_bound_cache( + legacy_paths["response_cache"], + legacy_paths["receipt"], + label=f"{demo} legacy evidence", + ) + + preserved_paths = [entry[key] for key in (*expected_paths, "pdf")] + preserved_paths.extend( + [ + legacy["pdf"], + _repo_relative(legacy_paths["response_cache"]), + legacy["receipt_file"], + ] + ) + return [cache_key, legacy_cache_key], preserved_paths + + +def _load_preserved_manifest_entries() -> tuple[ + list[dict[str, Any]], set[str], set[str] +]: + preserved: list[dict[str, Any]] = [] + seen_demos: set[str] = set() + cache_key_owners: dict[str, str] = {} + path_owners: dict[str, str] = {} + + for index, raw_entry in enumerate(_load_existing_manifest()): + if not isinstance(raw_entry, dict): + raise ValueError(f"seed manifest entry {index} must be a JSON object") + demo = _require_string( + raw_entry.get("demo"), f"seed manifest entry {index}.demo" + ) + if not _DEMO_ID.fullmatch(demo): + raise ValueError(f"seed manifest entry {index}.demo is unsafe") + if demo in seen_demos: + raise ValueError(f"seed manifest demo collision for {demo!r}") + seen_demos.add(demo) + + if demo in MANAGED_DEMOS: + if "inventory_kind" in raw_entry: + raise ValueError(f"managed demo {demo!r} cannot be preserved") + continue + if raw_entry.get("inventory_kind") != PRESERVED_INVENTORY_KIND: + raise ValueError( + f"unmanaged demo {demo!r} lacks an explicitly supported inventory_kind" + ) + + cache_keys, paths = _validate_preserved_entry(raw_entry) + for cache_key in cache_keys: + if cache_key in cache_key_owners: + raise ValueError( + "preserved cache-key collision between " + f"{cache_key_owners[cache_key]!r} and {demo!r}" + ) + cache_key_owners[cache_key] = demo + for path in paths: + if path in path_owners: + raise ValueError( + "preserved path collision between " + f"{path_owners[path]!r} and {demo!r}: {path}" + ) + path_owners[path] = demo + preserved.append(raw_entry) + + return preserved, set(cache_key_owners), set(path_owners) + + def _repo_relative(path: Path) -> str: return path.resolve().relative_to(REPO_ROOT).as_posix() @@ -106,7 +531,9 @@ def _document_config(demo_dir: Path) -> dict[str, Any]: or len(configs) != 1 or not isinstance(configs[0], dict) ): - raise ValueError(f"{_repo_relative(demo_dir / 'docs.json')} must have one config") + raise ValueError( + f"{_repo_relative(demo_dir / 'docs.json')} must have one config" + ) return configs[0] @@ -178,7 +605,9 @@ def _sc100_pages() -> list[dict[str, int | float]]: parser.feed(SC100_HTML_PATH.read_text(encoding="utf-8")) pages = sorted(parser.pages, key=lambda page: int(page["page"])) if [page["page"] for page in pages] != [1, 2, 3, 4]: - raise ValueError("SC-100 index.html must contain pages 1 through 4 exactly once") + raise ValueError( + "SC-100 index.html must contain pages 1 through 4 exactly once" + ) return pages @@ -291,11 +720,110 @@ def _seed_entry( } +def _validate_managed_manifest( + manifest: list[dict[str, Any]], +) -> tuple[set[str], set[str]]: + if len(manifest) != len(SEEDED_FIXTURES): + raise RuntimeError("seed manifest entry count does not match fixtures") + + expected_keys = frozenset( + {"demo", "source_file", "pdf", "endpoint", "replay_config", "cache_key"} + ) + cache_keys: set[str] = set() + paths: set[str] = set() + seen_demos: set[str] = set() + for entry, (demo, source_file, endpoint) in zip( + manifest, + SEEDED_FIXTURES, + strict=True, + ): + _require_exact_keys(entry, expected_keys, f"managed manifest entry {demo}") + if entry["demo"] != demo or demo in seen_demos: + raise RuntimeError("managed seed manifest demo order or identity changed") + seen_demos.add(demo) + + demo_dir = DEMOS_ROOT / demo + config = _document_config(demo_dir) + pdf_path = _configured_pdf_path(demo_dir, config) + expected_source = _repo_relative(demo_dir / source_file) + expected_pdf = _repo_relative(pdf_path) + expected_url = EXTRACT_URL if endpoint == EXTRACT_ENDPOINT else PARSE_URL + if entry["source_file"] != expected_source: + raise RuntimeError(f"managed seed source path changed for {demo}") + if entry["pdf"] != expected_pdf: + raise RuntimeError(f"managed seed PDF path changed for {demo}") + if entry["endpoint"] != expected_url: + raise RuntimeError(f"managed seed endpoint changed for {demo}") + + if endpoint == EXTRACT_ENDPOINT: + mode = config.get("mode") + schema = config.get("schema") + if not isinstance(mode, str) or not isinstance(schema, dict): + raise RuntimeError(f"managed Extract config is malformed for {demo}") + expected_replay_config = build_extract_instructions(mode, schema) + else: + mode = config.get("mode") + if mode != "agentic": + raise RuntimeError(f"managed Parse config is malformed for {demo}") + expected_replay_config = build_parse_instructions(mode) + if entry["replay_config"] != expected_replay_config: + raise RuntimeError(f"managed replay config changed for {demo}") + + expected_cache_key = compute_cache_key( + pdf_path, + endpoint, + expected_replay_config, + ) + if entry["cache_key"] != expected_cache_key: + raise RuntimeError(f"managed cache key changed unexpectedly for {demo}") + if expected_cache_key in cache_keys: + raise RuntimeError(f"managed cache-key collision for {demo}") + cache_keys.add(expected_cache_key) + + managed_paths = { + expected_source, + expected_pdf, + f"demos/{demo}/docs.json", + f"demos/{demo}/cache/{expected_cache_key}.json", + } + if paths & managed_paths: + raise RuntimeError(f"managed seed path collision for {demo}") + paths.update(managed_paths) + + if seen_demos != MANAGED_DEMOS: + raise RuntimeError("managed seed manifest does not cover every fixture") + return cache_keys, paths + + +def _reject_manifest_collisions( + managed_cache_keys: set[str], + managed_paths: set[str], + preserved_cache_keys: set[str], + preserved_paths: set[str], +) -> None: + cache_collisions = managed_cache_keys & preserved_cache_keys + if cache_collisions: + raise ValueError( + f"managed and preserved cache-key collision: {sorted(cache_collisions)!r}" + ) + path_collisions = managed_paths & preserved_paths + if path_collisions: + raise ValueError( + f"managed and preserved path collision: {sorted(path_collisions)!r}" + ) + + def main() -> None: + ( + preserved_entries, + preserved_cache_keys, + preserved_paths, + ) = _load_preserved_manifest_entries() + reconstructed_response = reconstruct_sc100_response() _write_json(SC100_RESPONSE_PATH, reconstructed_response) - manifest: list[dict[str, Any]] = [] + managed_manifest: list[dict[str, Any]] = [] for demo, source_file in EXTRACT_FIXTURES: demo_dir = DEMOS_ROOT / demo config = _document_config(demo_dir) @@ -303,7 +831,7 @@ def main() -> None: config["mode"], config["schema"], ) - manifest.append( + managed_manifest.append( _seed_entry( demo, source_file, @@ -325,7 +853,7 @@ def main() -> None: or parse_response["configuration"].get("mode") != "agentic" ): raise ValueError("parse sidecar must echo the authoritative agentic mode") - manifest.append( + managed_manifest.append( _seed_entry( parse_demo, parse_source, @@ -335,12 +863,20 @@ def main() -> None: ) ) - if len(manifest) != len(SEEDED_FIXTURES): - raise RuntimeError("seed manifest entry count does not match fixtures") + managed_cache_keys, managed_paths = _validate_managed_manifest(managed_manifest) + _reject_manifest_collisions( + managed_cache_keys, + managed_paths, + preserved_cache_keys, + preserved_paths, + ) + manifest = [*managed_manifest, *preserved_entries] _write_json(MANIFEST_PATH, manifest) - for entry in manifest: + for entry in managed_manifest: print(f"{entry['demo']}: {entry['cache_key']}") + for entry in preserved_entries: + print(f"{entry['demo']}: preserved {entry['cache_key']}") if __name__ == "__main__": diff --git a/common/templates/lighthouse.html b/common/templates/lighthouse.html new file mode 100644 index 0000000..c936085 --- /dev/null +++ b/common/templates/lighthouse.html @@ -0,0 +1,825 @@ + + + + + + + {{ title }} + + + +
+
+ Nutrient + Data Extraction API / source proof +
+
+
+

{{ source_copy.eyebrow }}

+

{{ title }}

+

{{ summary }}

+
+ +
+ +
+
+
+ {{ document_name }} + {{ source_copy.page_label }} +
+
+ {{ source_copy.image_alt_prefix }}: {{ document_name }} + +
+
+ + +
+ +

{{ source_copy.footnote }}

+
+ + + + diff --git a/demos/grounded_extraction/check_expected.py b/demos/grounded_extraction/check_expected.py new file mode 100644 index 0000000..9b79c3d --- /dev/null +++ b/demos/grounded_extraction/check_expected.py @@ -0,0 +1,159 @@ +"""Compare source-reviewed CMS-1500 ground truth and grounding with a response.""" + +from __future__ import annotations + +import argparse +import json +import math +from pathlib import Path +from typing import Any + + +DEMO_ROOT = Path(__file__).resolve().parent +DEFAULT_EXPECTED = DEMO_ROOT / "expected.json" +DEFAULT_RESPONSE = DEMO_ROOT / "output" / "metadata.json" + + +def _path(parent: str, key: str | int) -> str: + return f"{parent}[{key}]" if isinstance(key, int) else f"{parent}.{key}" + + +def _has_grounding(metadata: Any, pages: Any) -> bool: + if not isinstance(metadata, dict): + return False + bbox = metadata.get("bbox") + page_index = metadata.get("pageIndex") + if not isinstance(bbox, dict) or isinstance(page_index, bool): + return False + if ( + not isinstance(page_index, int) + or not isinstance(pages, list) + or page_index < 0 + or page_index >= len(pages) + ): + return False + page = pages[page_index] + if not isinstance(page, dict): + return False + dimensions: dict[str, float] = {} + for dimension in ("width", "height"): + value = page.get(dimension) + if isinstance(value, bool) or not isinstance(value, (int, float)): + return False + numeric = float(value) + if not math.isfinite(numeric) or numeric <= 0: + return False + dimensions[dimension] = numeric + coordinates: dict[str, float] = {} + for coordinate in ("x", "y", "width", "height"): + value = bbox.get(coordinate) + if isinstance(value, bool) or not isinstance(value, (int, float)): + return False + numeric = float(value) + if not math.isfinite(numeric): + return False + coordinates[coordinate] = numeric + return ( + coordinates["x"] >= 0 + and coordinates["y"] >= 0 + and coordinates["width"] > 0 + and coordinates["height"] > 0 + and coordinates["x"] + coordinates["width"] <= dimensions["width"] + and coordinates["y"] + coordinates["height"] <= dimensions["height"] + ) + + +def compare( + expected: Any, + actual: Any, + metadata: Any, + pages: Any, + path: str = "$", +) -> tuple[list[str], int]: + issues: list[str] = [] + grounded_leaves = 0 + + if isinstance(expected, dict): + if not isinstance(actual, dict): + return [f"WRONG {path}: expected object, got {type(actual).__name__}"], 0 + actual_keys = set(actual) + expected_keys = set(expected) + for key in sorted(expected_keys - actual_keys): + issues.append(f"MISSING {_path(path, key)}") + for key in sorted(actual_keys - expected_keys): + issues.append(f"UNEXPECTED {_path(path, key)}") + for key in sorted(expected_keys & actual_keys): + child_meta = metadata.get(key) if isinstance(metadata, dict) else None + child_issues, child_grounded = compare( + expected[key], actual[key], child_meta, pages, _path(path, key) + ) + issues.extend(child_issues) + grounded_leaves += child_grounded + return issues, grounded_leaves + + if isinstance(expected, list): + if not isinstance(actual, list): + return [f"WRONG {path}: expected array, got {type(actual).__name__}"], 0 + if len(actual) < len(expected): + for index in range(len(actual), len(expected)): + issues.append(f"MISSING {_path(path, index)}") + if len(actual) > len(expected): + for index in range(len(expected), len(actual)): + issues.append(f"UNEXPECTED {_path(path, index)}") + metadata_items = metadata if isinstance(metadata, list) else [] + for index in range(min(len(expected), len(actual))): + child_meta = metadata_items[index] if index < len(metadata_items) else None + child_issues, child_grounded = compare( + expected[index], actual[index], child_meta, pages, _path(path, index) + ) + issues.extend(child_issues) + grounded_leaves += child_grounded + return issues, grounded_leaves + + if actual != expected: + issues.append(f"WRONG {path}: expected {expected!r}, got {actual!r}") + if not _has_grounding(metadata, pages): + issues.append(f"UNGROUNDED {path}") + else: + grounded_leaves += 1 + return issues, grounded_leaves + + +def _load_json(path: Path) -> Any: + with path.open(encoding="utf-8") as source_file: + return json.load(source_file) + + +def main() -> int: + parser = argparse.ArgumentParser( + description="Check source-reviewed values and grounding in a CMS-1500 response." + ) + parser.add_argument("--expected", type=Path, default=DEFAULT_EXPECTED) + parser.add_argument("--response", type=Path, default=DEFAULT_RESPONSE) + args = parser.parse_args() + + expected = _load_json(args.expected) + response = _load_json(args.response) + try: + output = response["output"] + actual = output["data"] + metadata = output["metadata"] + pages = output["pages"] + except (KeyError, TypeError): + print("WRONG $: response must contain output.data, output.metadata, and output.pages") + return 1 + + issues, grounded_leaves = compare(expected, actual, metadata, pages) + if issues: + print("\n".join(issues)) + return 1 + + print( + f"PASS: source-reviewed values match; " + f"{grounded_leaves} leaves include grounding" + ) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/demos/grounded_extraction/expected.json b/demos/grounded_extraction/expected.json new file mode 100644 index 0000000..6267c5f --- /dev/null +++ b/demos/grounded_extraction/expected.json @@ -0,0 +1,29 @@ +{ + "insured_id_number": "XW1234567", + "patient_name": "Thornton, Emily R.", + "prior_authorization_number": "PA-0098765", + "total_charge": { + "amount": 170, + "iso_4217_currency_code": "USD" + }, + "service_lines": [ + { + "date_of_service_from": "07 10 26", + "procedure_code": "99213", + "line_charges": { + "amount": 125, + "iso_4217_currency_code": "USD" + }, + "rendering_provider_npi": "1234567890" + }, + { + "date_of_service_from": "07 10 26", + "procedure_code": "87880", + "line_charges": { + "amount": 45, + "iso_4217_currency_code": "USD" + }, + "rendering_provider_npi": "1234567890" + } + ] +} diff --git a/demos/grounded_extraction/instructions.json b/demos/grounded_extraction/instructions.json new file mode 100644 index 0000000..d9c6e66 --- /dev/null +++ b/demos/grounded_extraction/instructions.json @@ -0,0 +1,72 @@ +{ + "mode": "agentic", + "schema": { + "type": "object", + "properties": { + "insured_id_number": { + "type": "string", + "description": "The insured's ID number found in Box 1a." + }, + "patient_name": { + "type": "string", + "description": "The patient's name (Last Name, First Name, Middle Initial) from Box 2." + }, + "prior_authorization_number": { + "type": "string", + "description": "The prior authorization number from Box 23." + }, + "total_charge": { + "type": "object", + "properties": { + "amount": { "type": "number" }, + "iso_4217_currency_code": { "type": "string" } + }, + "required": ["amount", "iso_4217_currency_code"], + "description": "The total charges from Box 28." + }, + "service_lines": { + "type": "array", + "description": "The list of service lines from the table in Box 24.", + "items": { + "type": "object", + "properties": { + "date_of_service_from": { + "type": "string", + "description": "The start date of service from Box 24A (MM DD YY)." + }, + "procedure_code": { + "type": "string", + "description": "The CPT or HCPCS procedure code from Box 24D." + }, + "line_charges": { + "type": "object", + "properties": { + "amount": { "type": "number" }, + "iso_4217_currency_code": { "type": "string" } + }, + "required": ["amount", "iso_4217_currency_code"], + "description": "The charges for this specific service line from Box 24F." + }, + "rendering_provider_npi": { + "type": "string", + "description": "The NPI of the rendering provider from Box 24J." + } + }, + "required": [ + "date_of_service_from", + "procedure_code", + "line_charges", + "rendering_provider_npi" + ] + } + } + }, + "required": [ + "insured_id_number", + "patient_name", + "total_charge", + "service_lines" + ] + }, + "citationsEnabled": true +} diff --git a/demos/grounded_extraction/output/cms_1500_page_0.png b/demos/grounded_extraction/output/cms_1500_page_0.png index 685d362..dd6f1b5 100644 Binary files a/demos/grounded_extraction/output/cms_1500_page_0.png and b/demos/grounded_extraction/output/cms_1500_page_0.png differ diff --git a/demos/insurance_claim_intake/README.md b/demos/insurance_claim_intake/README.md new file mode 100644 index 0000000..8b014a0 --- /dev/null +++ b/demos/insurance_claim_intake/README.md @@ -0,0 +1,101 @@ +# GSA SF 91 extraction with returned source regions + +This developer sample maps page 1 of the U.S. General Services +Administration's **Standard Form 91, Motor Vehicle Accident (Crash) Report, +revision 09/2020** to structured fields with independently recorded source +regions. + +The blank official form is frozen at `source/SF91-20.pdf` from the canonical +GSA URL: + +`https://www.gsa.gov/system/files/SF91-20.pdf` + +The one-page demo input is a flattened raster of the official first page with +11 privacy-safe demo values painted into the matching printed fields. It has no +XFA, JavaScript, AcroForm field tree, or Widget annotations. The values are not +customer data, a real person, or a real claim. They do not represent coverage, +liability, fraud, eligibility, payment, or adjudication. + +**[Open this reviewed proof on GitHub Pages →](https://pspdfkit.github.io/nutrient-extraction-samples/docs/lighthouse/assets/insurance-claim-intake-reviewed.html?utm_campaign=de_lighthouse_pilot_v1&utm_source=github&utm_medium=repository&utm_content=insurance_claim_intake.github_sample.v01.proof)** + +## Rebuild the frozen input and oracle + +From the repository root: + +```bash +python3 demos/insurance_claim_intake/build_fixture.py +python3 demos/insurance_claim_intake/build_fixture.py --check +``` + +The builder verifies the frozen official-source and legacy-fixture hashes, +renders only SF 91 page 1, creates the deterministic 612x792 flattened PDF, +and derives `expected.json` only from the 11 values defined in the fixture. It +does not read a credential, call the network, or consume credits. + +The earlier bespoke sheet remains byte-for-byte preserved as +`data/legacy-synthetic-insurance-claim-intake.pdf`. The existing cache and +receipt also remain unchanged as historical evidence for that earlier source; +they are not valid replay evidence for the new public-form input. + +## Offline provisional package + +```bash +python3 demos/insurance_claim_intake/generate_demo.py --provisional +python3 demos/insurance_claim_intake/check_expected.py --allow-provisional +``` + +Open `demos/insurance_claim_intake/provisional/output/index.html` directly. The page is +self-contained. These commands do not read `NUTRIENT_API_KEY`, access or mutate +the historical live cache, call the network, or consume credits. A zero exit +code means only that the fixture-derived values and the 11 manually reviewed +page-0 source boxes match the independent oracle. Provisional evidence cannot +support a release claim. The commands write only below `provisional/` and never +replace the committed reviewed artifacts under `output/`. + +## Current reviewed live response + +The one approved replacement request completed once with HTTP 200. Its reviewed +receipt-bound response matched 11/11 predeclared values exactly, returned 11/11 +valid page-bounded primary regions, and retained zero issues. Reproduce it +offline without a credential or network request: + +```bash +python3 demos/insurance_claim_intake/generate_demo.py --replay-reviewed +python3 demos/insurance_claim_intake/check_expected.py --reviewed-live +``` + +Reviewed records the evidence audit; it does not generalize beyond this form or +approve publication. + +## Future refresh gate + +The approved replacement call is complete. No additional refresh or retry is +authorized. Only `--refresh` can read `NUTRIENT_API_KEY`, call the API, and +consume credits. A future separately approved gate would use: + +```bash +python3 demos/insurance_claim_intake/generate_demo.py --refresh +python3 demos/insurance_claim_intake/check_expected.py +python3 demos/insurance_claim_intake/generate_demo.py --replay-live +``` + +`--refresh` keeps the broad response in memory and writes only the narrow cache +plus its request-ID/SHA-256 receipt. Replays never fall back to provisional evidence. +The retained historical synthetic cache remains deliberately ineligible for +this public-form input. + +## Provenance boundary + +- Publisher: U.S. General Services Administration +- Form: Standard Form 91, Motor Vehicle Accident (Crash) Report, revision + 09/2020 +- Canonical URL: `https://www.gsa.gov/system/files/SF91-20.pdf` +- Original SHA-256: + `18a11675590189964522114c294b8ea0974f86989fb7f49a31788ba2807d44ac` +- Transformation: rasterize page 1 without form rendering, fit it beneath the + ASCII provenance rail, and paint only the 11 fixture values into the printed + fields + +Generated provisional artifacts are `provisional/evidence.json`, +`provisional/output/source-page.png`, `provisional/output/comparison.json`, and +`provisional/output/index.html`. diff --git a/demos/insurance_claim_intake/build_fixture.py b/demos/insurance_claim_intake/build_fixture.py new file mode 100644 index 0000000..573fca0 --- /dev/null +++ b/demos/insurance_claim_intake/build_fixture.py @@ -0,0 +1,403 @@ +#!/usr/bin/env python3 +"""Build the deterministic privacy-safe GSA SF 91 demo fixture. + +The official source remains byte-for-byte frozen under ``source/``. This +builder renders only page 1 to pixels, places that image below a provenance +rail, and paints the fixture oracle values into the matching printed fields. +The derived PDF therefore carries no XFA, AcroForm, Widget, or JavaScript +objects from the downloaded form. +""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import math +import sys +import zlib +from dataclasses import dataclass +from pathlib import Path +from typing import Any + +import pypdfium2 as pdfium +from pypdfium2 import raw + + +REPO_ROOT = Path(__file__).resolve().parents[2] +if str(REPO_ROOT) not in sys.path: + sys.path.insert(0, str(REPO_ROOT)) + +from common.atomic import atomic_write # noqa: E402 +from common.lighthouse import expected_json_bytes, parse_fixture # noqa: E402 + + +DEMO_DIR = Path(__file__).resolve().parent +SOURCE_PATH = DEMO_DIR / "source" / "SF91-20.pdf" +LEGACY_PATH = DEMO_DIR / "data" / "legacy-synthetic-insurance-claim-intake.pdf" +PDF_PATH = DEMO_DIR / "data" / "insurance-claim-intake.pdf" +FIXTURE_PATH = DEMO_DIR / "fixture.json" +EXPECTED_PATH = DEMO_DIR / "expected.json" + +ORIGINAL_SHA256 = "18a11675590189964522114c294b8ea0974f86989fb7f49a31788ba2807d44ac" +LEGACY_SHA256 = "acb9970d933b9b1af6d9b8c08c3843006f09e8d574f07ea0b29cf51c27e2ca33" + +PAGE_WIDTH = 612.0 +PAGE_HEIGHT = 792.0 +RAIL_HEIGHT = 28.0 +FORM_SCALE = (PAGE_HEIGHT - RAIL_HEIGHT) / PAGE_HEIGHT +FORM_X = (PAGE_WIDTH - PAGE_WIDTH * FORM_SCALE) / 2.0 +RASTER_SCALE = 3.0 + + +@dataclass(frozen=True) +class FieldSpec: + path: tuple[str, ...] + label: str + value: str + # Exact page-1 Widget rectangle from the downloaded SF 91, in PDF points. + rect: tuple[float, float, float, float] + font_size: float = 8.25 + top_aligned: bool = False + + +FIELDS = ( + FieldSpec( + ("crash", "date"), + "Crash date", + "08/03/2026", + (484.458, 676.459, 575.924, 688.450), + ), + FieldSpec( + ("federal_vehicle", "driver_name"), + "Federal vehicle driver name", + "Alvarez, Noah", + (27.000, 675.723, 297.850, 688.479), + ), + FieldSpec( + ("federal_vehicle", "tag_id"), + "Federal vehicle tag or identification number", + "GSA-48312", + (27.000, 626.201, 169.622, 638.957), + ), + FieldSpec( + ("federal_vehicle", "estimated_repair_cost"), + "Federal vehicle estimated repair cost", + "2750.00", + (184.207, 626.201, 273.768, 638.957), + ), + FieldSpec( + ("federal_vehicle", "year"), + "Federal vehicle year", + "2023", + (276.766, 626.201, 352.542, 638.957), + ), + FieldSpec( + ("federal_vehicle", "make"), + "Federal vehicle make", + "Subaru", + (355.263, 626.201, 422.784, 638.957), + ), + FieldSpec( + ("federal_vehicle", "model"), + "Federal vehicle model", + "Outback", + (425.384, 626.201, 492.568, 638.957), + ), + FieldSpec( + ("federal_vehicle", "damage"), + "Federal vehicle damage description", + "Rear bumper and liftgate dented; vehicle remains drivable.", + (27.000, 604.460, 585.071, 617.216), + font_size=7.25, + ), + FieldSpec( + ("other_vehicle", "driver_name"), + "Other vehicle driver name", + "Chen, Maya", + (27.000, 554.230, 250.937, 566.986), + ), + FieldSpec( + ("other_vehicle", "insurance", "company"), + "Other vehicle driver's insurance company", + "Prairie Mutual Insurance", + (27.000, 407.651, 421.761, 443.991), + top_aligned=True, + ), + FieldSpec( + ("other_vehicle", "insurance", "policy_number"), + "Other vehicle driver's insurance policy number", + "PN-84-221907", + (424.814, 431.206, 585.828, 443.962), + ), +) + + +class FixtureBuildError(RuntimeError): + """Raised when a frozen source or generated artifact violates the contract.""" + + +def _sha256(payload: bytes) -> str: + return hashlib.sha256(payload).hexdigest() + + +def _read_frozen(path: Path, *, expected_sha256: str, label: str) -> bytes: + if path.is_symlink() or not path.is_file(): + raise FixtureBuildError(f"{label} must be a regular, non-symlink file") + payload = path.read_bytes() + if _sha256(payload) != expected_sha256: + raise FixtureBuildError(f"{label} does not match its frozen SHA-256") + return payload + + +def _pdf_number(value: float) -> str: + if not math.isfinite(value): + raise FixtureBuildError("PDF coordinates must be finite") + rendered = f"{value:.6f}".rstrip("0").rstrip(".") + return rendered or "0" + + +def _pdf_text(value: str) -> str: + try: + value.encode("ascii") + except UnicodeEncodeError: + raise FixtureBuildError("fixture PDF text must be ASCII") from None + return value.replace("\\", "\\\\").replace("(", "\\(").replace(")", "\\)") + + +def _render_page_one(source: Path) -> tuple[bytes, int, int]: + document = pdfium.PdfDocument(source) + page = None + bitmap = None + try: + if len(document) != 5: + raise FixtureBuildError( + "frozen SF 91 source must contain exactly five pages" + ) + page = document[0] + width, height = page.get_size() + if not ( + math.isclose(width, PAGE_WIDTH, rel_tol=0.0, abs_tol=1e-6) + and math.isclose(height, PAGE_HEIGHT, rel_tol=0.0, abs_tol=1e-6) + ): + raise FixtureBuildError("SF 91 page 1 must be exactly 612x792 points") + bitmap = page.render( + scale=RASTER_SCALE, + may_draw_forms=False, + fill_color=(255, 255, 255, 255), + force_bitmap_format=raw.FPDFBitmap_BGRA, + rev_byteorder=True, + ) + rgba = bytes(bitmap.buffer) + image_width = bitmap.width + image_height = bitmap.height + if len(rgba) != image_width * image_height * 4: + raise FixtureBuildError("SF 91 raster buffer is not tightly packed RGBA") + rgb = bytearray(image_width * image_height * 3) + rgb[0::3] = rgba[0::4] + rgb[1::3] = rgba[1::4] + rgb[2::3] = rgba[2::4] + return bytes(rgb), image_width, image_height + finally: + if bitmap is not None: + bitmap.close() + if page is not None: + page.close() + document.close() + + +def _field_baseline(field: FieldSpec) -> tuple[float, float]: + x0, y0, _x1, y1 = field.rect + source_y = y1 - field.font_size - 3.0 if field.top_aligned else y0 + 2.45 + return ( + FORM_X + FORM_SCALE * (x0 + 2.5), + FORM_SCALE * source_y, + ) + + +def _field_box(field: FieldSpec) -> dict[str, Any]: + x0, y0, x1, y1 = field.rect + return { + "pageIndex": 0, + "bbox": { + "x": round(FORM_X + FORM_SCALE * x0, 2), + "y": round(PAGE_HEIGHT - FORM_SCALE * y1, 2), + "width": round(FORM_SCALE * (x1 - x0), 2), + "height": round(FORM_SCALE * (y1 - y0), 2), + }, + } + + +def _content_stream() -> bytes: + commands = [ + "q", + ( + f"{_pdf_number(PAGE_WIDTH * FORM_SCALE)} 0 0 " + f"{_pdf_number(PAGE_HEIGHT * FORM_SCALE)} {_pdf_number(FORM_X)} 0 cm" + ), + "/Im0 Do", + "Q", + "0.035 0.184 0.271 rg", + f"0 {_pdf_number(PAGE_HEIGHT - RAIL_HEIGHT)} {_pdf_number(PAGE_WIDTH)} {_pdf_number(RAIL_HEIGHT)} re f", + "BT", + "/F2 9.2 Tf", + "1 1 1 rg", + "18 774.2 Td", + f"({_pdf_text('AUTHENTIC PUBLIC FORM - PRIVACY-SAFE DEMO VALUES')}) Tj", + "ET", + "0.024 0.282 0.431 rg", + ] + for field in FIELDS: + x, y = _field_baseline(field) + commands.extend( + [ + "BT", + f"/F2 {_pdf_number(field.font_size * FORM_SCALE)} Tf", + f"{_pdf_number(x)} {_pdf_number(y)} Td", + f"({_pdf_text(field.value)}) Tj", + "ET", + ] + ) + return ("\n".join(commands) + "\n").encode("ascii") + + +def _assemble_pdf(image_rgb: bytes, image_width: int, image_height: int) -> bytes: + compressed_image = zlib.compress(image_rgb, level=9) + content = _content_stream() + objects = [ + b"<< /Type /Catalog /Pages 2 0 R >>", + b"<< /Type /Pages /Kids [3 0 R] /Count 1 >>", + ( + b"<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] " + b"/CropBox [0 0 612 792] /Resources << " + b"/XObject << /Im0 4 0 R >> /Font << /F1 5 0 R /F2 6 0 R >> >> " + b"/Contents 7 0 R >>" + ), + ( + f"<< /Type /XObject /Subtype /Image /Width {image_width} " + f"/Height {image_height} /ColorSpace /DeviceRGB /BitsPerComponent 8 " + f"/Filter /FlateDecode /Length {len(compressed_image)} >>\nstream\n" + ).encode("ascii") + + compressed_image + + b"\nendstream", + b"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>", + b"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica-Bold >>", + b"<< /Length " + + str(len(content)).encode("ascii") + + b" >>\nstream\n" + + content + + b"endstream", + ] + payload = bytearray(b"%PDF-1.4\n%\xe2\xe3\xcf\xd3\n") + offsets = [0] + for object_number, body in enumerate(objects, start=1): + offsets.append(len(payload)) + payload.extend(f"{object_number} 0 obj\n".encode("ascii")) + payload.extend(body) + payload.extend(b"\nendobj\n") + xref_offset = len(payload) + payload.extend(f"xref\n0 {len(objects) + 1}\n".encode("ascii")) + payload.extend(b"0000000000 65535 f \n") + for offset in offsets[1:]: + payload.extend(f"{offset:010d} 00000 n \n".encode("ascii")) + payload.extend( + ( + f"trailer\n<< /Size {len(objects) + 1} /Root 1 0 R >>\n" + f"startxref\n{xref_offset}\n%%EOF\n" + ).encode("ascii") + ) + return bytes(payload) + + +def _fixture_payload(source_sha256: str) -> dict[str, Any]: + return { + "version": 2, + "slug": "insurance_claim_intake", + "sourceStatus": "public-form-demo", + "document": { + "filename": "data/insurance-claim-intake.pdf", + "title": "GSA STANDARD FORM 91 - MOTOR VEHICLE ACCIDENT (CRASH) REPORT", + "subtitle": "Authentic public form with privacy-safe demo values - not customer claim data", + "width": PAGE_WIDTH, + "height": PAGE_HEIGHT, + }, + "provenance": { + "publisher": "U.S. General Services Administration", + "officialFormName": "Standard Form 91, Motor Vehicle Accident (Crash) Report, revision 09/2020", + "canonicalSourceUrl": "https://www.gsa.gov/system/files/SF91-20.pdf", + "originalSha256": ORIGINAL_SHA256, + "sourceSha256": source_sha256, + }, + "fields": [ + { + "path": list(field.path), + "label": field.label, + "value": field.value, + "source": _field_box(field), + } + for field in FIELDS + ], + } + + +def _json_bytes(value: Any) -> bytes: + return ( + json.dumps(value, ensure_ascii=False, indent=2, allow_nan=False) + "\n" + ).encode("utf-8") + + +def _check_bytes(path: Path, expected: bytes) -> None: + if path.is_symlink() or not path.is_file(): + raise FixtureBuildError(f"generated artifact is missing: {path}") + if path.read_bytes() != expected: + raise FixtureBuildError(f"generated artifact is stale: {path}") + + +def build(*, check: bool) -> str: + _read_frozen( + SOURCE_PATH, expected_sha256=ORIGINAL_SHA256, label="official SF 91 source" + ) + _read_frozen( + LEGACY_PATH, expected_sha256=LEGACY_SHA256, label="legacy synthetic fixture" + ) + image_rgb, image_width, image_height = _render_page_one(SOURCE_PATH) + pdf_payload = _assemble_pdf(image_rgb, image_width, image_height) + derived_sha256 = _sha256(pdf_payload) + fixture_value = _fixture_payload(derived_sha256) + fixture = parse_fixture(fixture_value, expected_slug="insurance_claim_intake") + fixture_payload = _json_bytes(fixture_value) + expected_payload = expected_json_bytes(fixture) + + if check: + _check_bytes(PDF_PATH, pdf_payload) + _check_bytes(FIXTURE_PATH, fixture_payload) + _check_bytes(EXPECTED_PATH, expected_payload) + else: + atomic_write(PDF_PATH, pdf_payload) + atomic_write(FIXTURE_PATH, fixture_payload) + atomic_write(EXPECTED_PATH, expected_payload) + return derived_sha256 + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--check", + action="store_true", + help="Verify the derived PDF, fixture, and oracle byte-for-byte without writing.", + ) + args = parser.parse_args(argv) + try: + digest = build(check=args.check) + except (FixtureBuildError, OSError, RuntimeError, ValueError) as error: + print(f"fixture build failed: {error}", file=sys.stderr) + return 1 + action = "Verified" if args.check else "Built" + print(f"{action} deterministic GSA SF 91 demo input: {digest}") + print(f"{action} {FIXTURE_PATH.relative_to(REPO_ROOT)}") + print(f"{action} {EXPECTED_PATH.relative_to(REPO_ROOT)}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/demos/insurance_claim_intake/cache/82bd017e04267eca150ef8ccb3f2471a5b445680d882f8375a174391c47fbbeb-extraction-extract-5270e4d2c6eb39ec7ff32e01fc0e8a6012e6a031be8a2532f16b9ff3ed397207.json b/demos/insurance_claim_intake/cache/82bd017e04267eca150ef8ccb3f2471a5b445680d882f8375a174391c47fbbeb-extraction-extract-5270e4d2c6eb39ec7ff32e01fc0e8a6012e6a031be8a2532f16b9ff3ed397207.json new file mode 100644 index 0000000..857c8ec --- /dev/null +++ b/demos/insurance_claim_intake/cache/82bd017e04267eca150ef8ccb3f2471a5b445680d882f8375a174391c47fbbeb-extraction-extract-5270e4d2c6eb39ec7ff32e01fc0e8a6012e6a031be8a2532f16b9ff3ed397207.json @@ -0,0 +1,364 @@ +{ + "output": { + "data": { + "crash": { + "date": "08/03/2026" + }, + "federal_vehicle": { + "damage": "Rear bumper and liftgate dented; vehicle remains drivable.", + "driver_name": "Alvarez, Noah", + "estimated_repair_cost": "2750.00", + "make": "Subaru", + "model": "Outback", + "tag_id": "GSA-48312", + "year": "2023" + }, + "other_vehicle": { + "driver_name": "Chen, Maya", + "insurance": { + "company": "Prairie Mutual Insurance", + "policy_number": "PN-84-221907" + } + } + }, + "metadata": { + "crash": { + "date": { + "bbox": { + "height": 19, + "width": 111, + "x": 1333, + "y": 363 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 19.2310791015625, + "width": 111.8370361328125, + "x": 1333, + "y": 362.8481750488281 + }, + "block_id": "b42", + "pageIndex": 0, + "pageNumber": 1 + } + ] + } + }, + "federal_vehicle": { + "damage": { + "bbox": { + "height": 22, + "width": 541, + "x": 108, + "y": 558 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 23.74444580078125, + "width": 541.694091796875, + "x": 107.30591583251953, + "y": 556.2555541992188 + }, + "block_id": "b13", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "driver_name": { + "bbox": { + "height": 22, + "width": 147, + "x": 108, + "y": 363 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 22, + "width": 147.87762451171875, + "x": 107.18013763427734, + "y": 363 + }, + "block_id": "b8", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "estimated_repair_cost": { + "bbox": { + "height": 19, + "width": 80, + "x": 530, + "y": 497 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 19.356658935546875, + "width": 1155, + "x": 108, + "y": 496.6433410644531 + }, + "block_id": "b11", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "make": { + "bbox": { + "height": 19, + "width": 75, + "x": 988, + "y": 497 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 19.356658935546875, + "width": 1155, + "x": 108, + "y": 496.6433410644531 + }, + "block_id": "b11", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "model": { + "bbox": { + "height": 19, + "width": 86, + "x": 1177, + "y": 497 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 19.356658935546875, + "width": 1155, + "x": 108, + "y": 496.6433410644531 + }, + "block_id": "b11", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "tag_id": { + "bbox": { + "height": 19, + "width": 116, + "x": 108, + "y": 497 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 19.356658935546875, + "width": 1155, + "x": 108, + "y": 496.6433410644531 + }, + "block_id": "b11", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "year": { + "bbox": { + "height": 19, + "width": 50, + "x": 777, + "y": 497 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 19.356658935546875, + "width": 1155, + "x": 108, + "y": 496.6433410644531 + }, + "block_id": "b11", + "pageIndex": 0, + "pageNumber": 1 + } + ] + } + }, + "other_vehicle": { + "driver_name": { + "bbox": { + "height": 25, + "width": 121, + "x": 108, + "y": 688 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 25, + "width": 123.93738555908203, + "x": 107.32357025146484, + "y": 688 + }, + "block_id": "b16", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "insurance": { + "company": { + "bbox": { + "height": 19, + "width": 255, + "x": 111, + "y": 1022 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 19.25897216796875, + "width": 257.7248229980469, + "x": 108.29705047607422, + "y": 1021.9465942382812 + }, + "block_id": "b23", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "policy_number": { + "bbox": { + "height": 19, + "width": 144, + "x": 1175, + "y": 1019 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 19.827392578125, + "width": 146.0274658203125, + "x": 1172.9725341796875, + "y": 1018.35302734375 + }, + "block_id": "b38", + "pageIndex": 0, + "pageNumber": 1 + } + ] + } + } + } + }, + "pages": [ + { + "height": 2200, + "page": 1, + "width": 1700 + } + ] + }, + "reconstructed": false, + "requestId": "GM0DIIhdRBPv1QwAABRx", + "status": 200 +} diff --git a/demos/insurance_claim_intake/cache/82bd017e04267eca150ef8ccb3f2471a5b445680d882f8375a174391c47fbbeb-extraction-extract-5270e4d2c6eb39ec7ff32e01fc0e8a6012e6a031be8a2532f16b9ff3ed397207.receipt.json b/demos/insurance_claim_intake/cache/82bd017e04267eca150ef8ccb3f2471a5b445680d882f8375a174391c47fbbeb-extraction-extract-5270e4d2c6eb39ec7ff32e01fc0e8a6012e6a031be8a2532f16b9ff3ed397207.receipt.json new file mode 100644 index 0000000..812a309 --- /dev/null +++ b/demos/insurance_claim_intake/cache/82bd017e04267eca150ef8ccb3f2471a5b445680d882f8375a174391c47fbbeb-extraction-extract-5270e4d2c6eb39ec7ff32e01fc0e8a6012e6a031be8a2532f16b9ff3ed397207.receipt.json @@ -0,0 +1,6 @@ +{ + "projectedResponseSha256": "fc8f0c0c6e1b0a858c5ea1db07f0fecdd073a67f6dd6e77fcd389ed4e596a351", + "receiptVersion": 1, + "requestId": "GM0DIIhdRBPv1QwAABRx", + "sourceStatus": "live-refresh" +} diff --git a/demos/insurance_claim_intake/cache/acb9970d933b9b1af6d9b8c08c3843006f09e8d574f07ea0b29cf51c27e2ca33-extraction-extract-ab82c0e620306ef4a76f60768e4d990f80af692bc65304953f8499474f5921b0.json b/demos/insurance_claim_intake/cache/acb9970d933b9b1af6d9b8c08c3843006f09e8d574f07ea0b29cf51c27e2ca33-extraction-extract-ab82c0e620306ef4a76f60768e4d990f80af692bc65304953f8499474f5921b0.json new file mode 100644 index 0000000..f5667dc --- /dev/null +++ b/demos/insurance_claim_intake/cache/acb9970d933b9b1af6d9b8c08c3843006f09e8d574f07ea0b29cf51c27e2ca33-extraction-extract-ab82c0e620306ef4a76f60768e4d990f80af692bc65304953f8499474f5921b0.json @@ -0,0 +1,335 @@ +{ + "output": { + "data": { + "claimant": { + "full_name": "Noah Alvarez" + }, + "contact": { + "phone": "202-555-0147", + "preferred_channel": "SMS" + }, + "incident": { + "damage_summary": "Rear bumper and liftgate damage after a low-speed collision.", + "date_time": "08/03/2026 14:20 ET", + "injury_reported": false, + "location": "2480 Lakeview Avenue, Dayton, OH 45402" + }, + "policy_number": "PN-84-221907", + "report_id": "FNOL-2026-0318", + "vehicle": { + "description": "2023 Subaru Outback" + } + }, + "metadata": { + "claimant": { + "full_name": { + "bbox": { + "height": 30, + "width": 194, + "x": 152, + "y": 725 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 121.62408447265625, + "width": 262.7068176269531, + "x": 138.15469360351562, + "y": 653.2998046875 + }, + "block_id": "c3", + "pageIndex": 0, + "pageNumber": 1 + } + ] + } + }, + "contact": { + "phone": { + "bbox": { + "height": 27, + "width": 208, + "x": 905, + "y": 1411 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 113.76904296875, + "width": 252.21588134765625, + "x": 888.6723022460938, + "y": 1343.890869140625 + }, + "block_id": "c14", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "preferred_channel": { + "bbox": { + "height": 27, + "width": 66, + "x": 150, + "y": 1411 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 109.833740234375, + "width": 387.7152099609375, + "x": 137.69606018066406, + "y": 1343.647216796875 + }, + "block_id": "c12", + "pageIndex": 0, + "pageNumber": 1 + } + ] + } + }, + "incident": { + "damage_summary": { + "bbox": { + "height": 78, + "width": 594, + "x": 152, + "y": 1180 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 151.563232421875, + "width": 619.718017578125, + "x": 142.6626434326172, + "y": 1110.341064453125 + }, + "block_id": "c9", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "date_time": { + "bbox": { + "height": 27, + "width": 308, + "x": 905, + "y": 727 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 119.902099609375, + "width": 344.51702880859375, + "x": 892.4646606445312, + "y": 652.6572265625 + }, + "block_id": "c5", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "injury_reported": { + "bbox": { + "height": 30, + "width": 69, + "x": 905, + "y": 1180 + }, + "confidence": 0.9696927825876808, + "confidenceComponents": { + "formatScore": 1, + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 119.9205322265625, + "width": 250.24951171875, + "x": 888.0830078125, + "y": 1109.43701171875 + }, + "block_id": "c11", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "location": { + "bbox": { + "height": 36, + "width": 638, + "x": 150, + "y": 952 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 114.8956298828125, + "width": 655.6699829101562, + "x": 141.1292724609375, + "y": 882.1363525390625 + }, + "block_id": "c6", + "pageIndex": 0, + "pageNumber": 1 + } + ] + } + }, + "policy_number": { + "bbox": { + "height": 27, + "width": 213, + "x": 908, + "y": 499 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 103.48837280273438, + "width": 236.252685546875, + "x": 886.796142578125, + "y": 435.4425354003906 + }, + "block_id": "c2", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "report_id": { + "bbox": { + "height": 27, + "width": 255, + "x": 152, + "y": 499 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 111.19833374023438, + "width": 284.0660705566406, + "x": 140.63339233398438, + "y": 436.6828308105469 + }, + "block_id": "c0", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "vehicle": { + "description": { + "bbox": { + "height": 30, + "width": 324, + "x": 905, + "y": 952 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 128.818359375, + "width": 359.55609130859375, + "x": 891.6477661132812, + "y": 878.775634765625 + }, + "block_id": "c8", + "pageIndex": 0, + "pageNumber": 1 + } + ] + } + } + }, + "pages": [ + { + "height": 2200, + "page": 1, + "width": 1700 + } + ] + }, + "reconstructed": false, + "requestId": "GMxyH47KVYwzQswAG1GR", + "status": 200 +} diff --git a/demos/insurance_claim_intake/cache/acb9970d933b9b1af6d9b8c08c3843006f09e8d574f07ea0b29cf51c27e2ca33-extraction-extract-ab82c0e620306ef4a76f60768e4d990f80af692bc65304953f8499474f5921b0.receipt.json b/demos/insurance_claim_intake/cache/acb9970d933b9b1af6d9b8c08c3843006f09e8d574f07ea0b29cf51c27e2ca33-extraction-extract-ab82c0e620306ef4a76f60768e4d990f80af692bc65304953f8499474f5921b0.receipt.json new file mode 100644 index 0000000..a9fc00b --- /dev/null +++ b/demos/insurance_claim_intake/cache/acb9970d933b9b1af6d9b8c08c3843006f09e8d574f07ea0b29cf51c27e2ca33-extraction-extract-ab82c0e620306ef4a76f60768e4d990f80af692bc65304953f8499474f5921b0.receipt.json @@ -0,0 +1,6 @@ +{ + "projectedResponseSha256": "9b24b56920a115d01c43f5c99e6ec418ec22caccd9b9e9d2173824e0ffc2a07b", + "receiptVersion": 1, + "requestId": "GMxyH47KVYwzQswAG1GR", + "sourceStatus": "live-refresh" +} diff --git a/demos/insurance_claim_intake/check_expected.py b/demos/insurance_claim_intake/check_expected.py new file mode 100644 index 0000000..c52c09c --- /dev/null +++ b/demos/insurance_claim_intake/check_expected.py @@ -0,0 +1,14 @@ +"""Check first-notice-of-loss intake evidence against the source oracle.""" + +from __future__ import annotations + +try: + from .generate_demo import CONFIG +except ImportError: + from generate_demo import CONFIG + +from common.lighthouse_package import checker_main + + +if __name__ == "__main__": + raise SystemExit(checker_main(CONFIG)) diff --git a/demos/insurance_claim_intake/data/insurance-claim-intake.pdf b/demos/insurance_claim_intake/data/insurance-claim-intake.pdf new file mode 100644 index 0000000..9d657d8 Binary files /dev/null and b/demos/insurance_claim_intake/data/insurance-claim-intake.pdf differ diff --git a/demos/insurance_claim_intake/data/legacy-synthetic-insurance-claim-intake.pdf b/demos/insurance_claim_intake/data/legacy-synthetic-insurance-claim-intake.pdf new file mode 100644 index 0000000..1223143 Binary files /dev/null and b/demos/insurance_claim_intake/data/legacy-synthetic-insurance-claim-intake.pdf differ diff --git a/demos/insurance_claim_intake/docs.json b/demos/insurance_claim_intake/docs.json new file mode 100644 index 0000000..5f5c9da --- /dev/null +++ b/demos/insurance_claim_intake/docs.json @@ -0,0 +1,106 @@ +[ + { + "id": "insurance_claim_intake", + "name": "GSA SF 91 Motor Vehicle Accident Report", + "file": "data/insurance-claim-intake.pdf", + "mode": "agentic", + "schema": { + "type": "object", + "properties": { + "crash": { + "type": "object", + "description": "Crash details printed on the GSA Standard Form 91.", + "properties": { + "date": { + "type": "string", + "description": "The crash date exactly as printed in field 3, DATE OF CRASH." + } + }, + "required": [ + "date" + ] + }, + "federal_vehicle": { + "type": "object", + "description": "Federal vehicle details printed in Section I of the GSA Standard Form 91.", + "properties": { + "driver_name": { + "type": "string", + "description": "The federal vehicle driver's name exactly as printed in field 1." + }, + "tag_id": { + "type": "string", + "description": "The federal vehicle tag or identification number exactly as printed in field 5." + }, + "estimated_repair_cost": { + "type": "string", + "description": "The federal vehicle estimated repair cost exactly as printed in field 6, preserving the decimal form as a string." + }, + "year": { + "type": "string", + "description": "The federal vehicle model year exactly as printed in field 7." + }, + "make": { + "type": "string", + "description": "The federal vehicle make exactly as printed in field 8." + }, + "model": { + "type": "string", + "description": "The federal vehicle model exactly as printed in field 9." + }, + "damage": { + "type": "string", + "description": "The federal vehicle damage description exactly as printed in field 11." + } + }, + "required": [ + "driver_name", + "tag_id", + "estimated_repair_cost", + "year", + "make", + "model", + "damage" + ] + }, + "other_vehicle": { + "type": "object", + "description": "Other vehicle details printed in Section II of the GSA Standard Form 91.", + "properties": { + "driver_name": { + "type": "string", + "description": "The other vehicle driver's name exactly as printed in field 12." + }, + "insurance": { + "type": "object", + "description": "The other vehicle driver's insurer details printed in field 23.", + "properties": { + "company": { + "type": "string", + "description": "The insurance company name exactly as printed in field 23a." + }, + "policy_number": { + "type": "string", + "description": "The insurance policy number exactly as printed in field 23b." + } + }, + "required": [ + "company", + "policy_number" + ] + } + }, + "required": [ + "driver_name", + "insurance" + ] + } + }, + "required": [ + "crash", + "federal_vehicle", + "other_vehicle" + ] + } + } +] diff --git a/demos/insurance_claim_intake/expected.json b/demos/insurance_claim_intake/expected.json new file mode 100644 index 0000000..1787dc0 --- /dev/null +++ b/demos/insurance_claim_intake/expected.json @@ -0,0 +1,21 @@ +{ + "crash": { + "date": "08/03/2026" + }, + "federal_vehicle": { + "damage": "Rear bumper and liftgate dented; vehicle remains drivable.", + "driver_name": "Alvarez, Noah", + "estimated_repair_cost": "2750.00", + "make": "Subaru", + "model": "Outback", + "tag_id": "GSA-48312", + "year": "2023" + }, + "other_vehicle": { + "driver_name": "Chen, Maya", + "insurance": { + "company": "Prairie Mutual Insurance", + "policy_number": "PN-84-221907" + } + } +} diff --git a/demos/insurance_claim_intake/fixture.json b/demos/insurance_claim_intake/fixture.json new file mode 100644 index 0000000..d37acb8 --- /dev/null +++ b/demos/insurance_claim_intake/fixture.json @@ -0,0 +1,210 @@ +{ + "version": 2, + "slug": "insurance_claim_intake", + "sourceStatus": "public-form-demo", + "document": { + "filename": "data/insurance-claim-intake.pdf", + "title": "GSA STANDARD FORM 91 - MOTOR VEHICLE ACCIDENT (CRASH) REPORT", + "subtitle": "Authentic public form with privacy-safe demo values - not customer claim data", + "width": 612.0, + "height": 792.0 + }, + "provenance": { + "publisher": "U.S. General Services Administration", + "officialFormName": "Standard Form 91, Motor Vehicle Accident (Crash) Report, revision 09/2020", + "canonicalSourceUrl": "https://www.gsa.gov/system/files/SF91-20.pdf", + "originalSha256": "18a11675590189964522114c294b8ea0974f86989fb7f49a31788ba2807d44ac", + "sourceSha256": "82bd017e04267eca150ef8ccb3f2471a5b445680d882f8375a174391c47fbbeb" + }, + "fields": [ + { + "path": [ + "crash", + "date" + ], + "label": "Crash date", + "value": "08/03/2026", + "source": { + "pageIndex": 0, + "bbox": { + "x": 478.15, + "y": 127.89, + "width": 88.23, + "height": 11.57 + } + } + }, + { + "path": [ + "federal_vehicle", + "driver_name" + ], + "label": "Federal vehicle driver name", + "value": "Alvarez, Noah", + "source": { + "pageIndex": 0, + "bbox": { + "x": 36.86, + "y": 127.86, + "width": 261.27, + "height": 12.31 + } + } + }, + { + "path": [ + "federal_vehicle", + "tag_id" + ], + "label": "Federal vehicle tag or identification number", + "value": "GSA-48312", + "source": { + "pageIndex": 0, + "bbox": { + "x": 36.86, + "y": 175.63, + "width": 137.58, + "height": 12.31 + } + } + }, + { + "path": [ + "federal_vehicle", + "estimated_repair_cost" + ], + "label": "Federal vehicle estimated repair cost", + "value": "2750.00", + "source": { + "pageIndex": 0, + "bbox": { + "x": 188.51, + "y": 175.63, + "width": 86.39, + "height": 12.31 + } + } + }, + { + "path": [ + "federal_vehicle", + "year" + ], + "label": "Federal vehicle year", + "value": "2023", + "source": { + "pageIndex": 0, + "bbox": { + "x": 277.8, + "y": 175.63, + "width": 73.1, + "height": 12.31 + } + } + }, + { + "path": [ + "federal_vehicle", + "make" + ], + "label": "Federal vehicle make", + "value": "Subaru", + "source": { + "pageIndex": 0, + "bbox": { + "x": 353.52, + "y": 175.63, + "width": 65.13, + "height": 12.31 + } + } + }, + { + "path": [ + "federal_vehicle", + "model" + ], + "label": "Federal vehicle model", + "value": "Outback", + "source": { + "pageIndex": 0, + "bbox": { + "x": 421.16, + "y": 175.63, + "width": 64.81, + "height": 12.31 + } + } + }, + { + "path": [ + "federal_vehicle", + "damage" + ], + "label": "Federal vehicle damage description", + "value": "Rear bumper and liftgate dented; vehicle remains drivable.", + "source": { + "pageIndex": 0, + "bbox": { + "x": 36.86, + "y": 196.6, + "width": 538.34, + "height": 12.31 + } + } + }, + { + "path": [ + "other_vehicle", + "driver_name" + ], + "label": "Other vehicle driver name", + "value": "Chen, Maya", + "source": { + "pageIndex": 0, + "bbox": { + "x": 36.86, + "y": 245.06, + "width": 216.02, + "height": 12.31 + } + } + }, + { + "path": [ + "other_vehicle", + "insurance", + "company" + ], + "label": "Other vehicle driver's insurance company", + "value": "Prairie Mutual Insurance", + "source": { + "pageIndex": 0, + "bbox": { + "x": 36.86, + "y": 363.71, + "width": 380.8, + "height": 35.06 + } + } + }, + { + "path": [ + "other_vehicle", + "insurance", + "policy_number" + ], + "label": "Other vehicle driver's insurance policy number", + "value": "PN-84-221907", + "source": { + "pageIndex": 0, + "bbox": { + "x": 420.61, + "y": 363.73, + "width": 155.32, + "height": 12.31 + } + } + } + ] +} diff --git a/demos/insurance_claim_intake/generate_demo.py b/demos/insurance_claim_intake/generate_demo.py new file mode 100644 index 0000000..238885b --- /dev/null +++ b/demos/insurance_claim_intake/generate_demo.py @@ -0,0 +1,40 @@ +"""Generate the authentic GSA SF 91 lighthouse package.""" + +from __future__ import annotations + +import sys +from pathlib import Path + + +REPO_ROOT = Path(__file__).resolve().parents[2] +if str(REPO_ROOT) not in sys.path: + sys.path.insert(0, str(REPO_ROOT)) + +from common.lighthouse_package import PackageConfig, generator_main # noqa: E402 + + +CONFIG = PackageConfig( + demo_dir=Path(__file__).resolve().parent, + slug="insurance_claim_intake", + page_title="A loss notice, mapped back to source", + provisional_summary=( + "An offline layout rehearsal for the authentic GSA SF 91 with " + "privacy-safe demo values. No API call was made, and this is not " + "release evidence." + ), + live_summary=( + "A receipt-bound live Extract response over the authentic GSA SF 91 " + "demo input, paired with source grounding. Independent evidence review " + "remains required." + ), + reviewed_summary=( + "A receipt-bound live Extract response with a recorded independent " + "field-by-field audit against the visible authentic public form. The " + "package retains every exact match and mismatch; the page shows the " + "API's primary returned source region for each field." + ), +) + + +if __name__ == "__main__": + raise SystemExit(generator_main(CONFIG)) diff --git a/demos/insurance_claim_intake/output/comparison.json b/demos/insurance_claim_intake/output/comparison.json new file mode 100644 index 0000000..aabe2c0 --- /dev/null +++ b/demos/insurance_claim_intake/output/comparison.json @@ -0,0 +1,14 @@ +{ + "artifactVersion": 1, + "comparison": { + "exitCode": 0, + "expectedLeaves": 11, + "groundedLeaves": 11, + "issues": [], + "matchedLeaves": 11, + "passed": true + }, + "evidenceKind": "live", + "evidenceLabel": "REVIEWED LIVE API RESPONSE", + "reviewed": true +} diff --git a/demos/insurance_claim_intake/output/index.html b/demos/insurance_claim_intake/output/index.html new file mode 100644 index 0000000..722e610 --- /dev/null +++ b/demos/insurance_claim_intake/output/index.html @@ -0,0 +1,914 @@ + + + + + + + A loss notice, mapped back to source + + + +
+
+ Nutrient + Data Extraction API / source proof +
+
+
+

Reviewed evidence / authentic public form

+

A loss notice, mapped back to source

+

A receipt-bound live Extract response with a recorded independent field-by-field audit against the visible authentic public form. The package retains every exact match and mismatch; the page shows the API's primary returned source region for each field.

+
+ +
+ +
+
+
+ GSA STANDARD FORM 91 - MOTOR VEHICLE ACCIDENT (CRASH) REPORT + Authentic public form · privacy-safe demo values · page 1 +
+
+ Authentic public form with privacy-safe demo values: GSA STANDARD FORM 91 - MOTOR VEHICLE ACCIDENT (CRASH) REPORT + +
+
+ + +
+ +

Correctness is determined by the independent source oracle for this authentic public form with privacy-safe demo values. Recognition signals and bounding boxes are supporting evidence, not a substitute for comparison.

+
+ + + + diff --git a/demos/insurance_claim_intake/output/playwright/live-desktop.png b/demos/insurance_claim_intake/output/playwright/live-desktop.png new file mode 100644 index 0000000..578bad0 Binary files /dev/null and b/demos/insurance_claim_intake/output/playwright/live-desktop.png differ diff --git a/demos/insurance_claim_intake/output/playwright/live-mobile-scrolled.png b/demos/insurance_claim_intake/output/playwright/live-mobile-scrolled.png new file mode 100644 index 0000000..a2a002c Binary files /dev/null and b/demos/insurance_claim_intake/output/playwright/live-mobile-scrolled.png differ diff --git a/demos/insurance_claim_intake/output/playwright/live-mobile.png b/demos/insurance_claim_intake/output/playwright/live-mobile.png new file mode 100644 index 0000000..c0ab339 Binary files /dev/null and b/demos/insurance_claim_intake/output/playwright/live-mobile.png differ diff --git a/demos/insurance_claim_intake/output/playwright/provisional-desktop.png b/demos/insurance_claim_intake/output/playwright/provisional-desktop.png new file mode 100644 index 0000000..510a3d8 Binary files /dev/null and b/demos/insurance_claim_intake/output/playwright/provisional-desktop.png differ diff --git a/demos/insurance_claim_intake/output/playwright/provisional-mobile.png b/demos/insurance_claim_intake/output/playwright/provisional-mobile.png new file mode 100644 index 0000000..8e5680c Binary files /dev/null and b/demos/insurance_claim_intake/output/playwright/provisional-mobile.png differ diff --git a/demos/insurance_claim_intake/output/source-page.png b/demos/insurance_claim_intake/output/source-page.png new file mode 100644 index 0000000..f031f6a Binary files /dev/null and b/demos/insurance_claim_intake/output/source-page.png differ diff --git a/demos/insurance_claim_intake/provisional/evidence.json b/demos/insurance_claim_intake/provisional/evidence.json new file mode 100644 index 0000000..682aef3 --- /dev/null +++ b/demos/insurance_claim_intake/provisional/evidence.json @@ -0,0 +1,146 @@ +{ + "response": { + "output": { + "data": { + "crash": { + "date": "08/03/2026" + }, + "federal_vehicle": { + "damage": "Rear bumper and liftgate dented; vehicle remains drivable.", + "driver_name": "Alvarez, Noah", + "estimated_repair_cost": "2750.00", + "make": "Subaru", + "model": "Outback", + "tag_id": "GSA-48312", + "year": "2023" + }, + "other_vehicle": { + "driver_name": "Chen, Maya", + "insurance": { + "company": "Prairie Mutual Insurance", + "policy_number": "PN-84-221907" + } + } + }, + "metadata": { + "crash": { + "date": { + "bbox": { + "height": 11.57, + "width": 88.23, + "x": 478.15, + "y": 127.89 + }, + "pageIndex": 0 + } + }, + "federal_vehicle": { + "damage": { + "bbox": { + "height": 12.31, + "width": 538.34, + "x": 36.86, + "y": 196.6 + }, + "pageIndex": 0 + }, + "driver_name": { + "bbox": { + "height": 12.31, + "width": 261.27, + "x": 36.86, + "y": 127.86 + }, + "pageIndex": 0 + }, + "estimated_repair_cost": { + "bbox": { + "height": 12.31, + "width": 86.39, + "x": 188.51, + "y": 175.63 + }, + "pageIndex": 0 + }, + "make": { + "bbox": { + "height": 12.31, + "width": 65.13, + "x": 353.52, + "y": 175.63 + }, + "pageIndex": 0 + }, + "model": { + "bbox": { + "height": 12.31, + "width": 64.81, + "x": 421.16, + "y": 175.63 + }, + "pageIndex": 0 + }, + "tag_id": { + "bbox": { + "height": 12.31, + "width": 137.58, + "x": 36.86, + "y": 175.63 + }, + "pageIndex": 0 + }, + "year": { + "bbox": { + "height": 12.31, + "width": 73.1, + "x": 277.8, + "y": 175.63 + }, + "pageIndex": 0 + } + }, + "other_vehicle": { + "driver_name": { + "bbox": { + "height": 12.31, + "width": 216.02, + "x": 36.86, + "y": 245.06 + }, + "pageIndex": 0 + }, + "insurance": { + "company": { + "bbox": { + "height": 35.06, + "width": 380.8, + "x": 36.86, + "y": 363.71 + }, + "pageIndex": 0 + }, + "policy_number": { + "bbox": { + "height": 12.31, + "width": 155.32, + "x": 420.61, + "y": 363.73 + }, + "pageIndex": 0 + } + } + } + }, + "pages": [ + { + "height": 792.0, + "width": 612.0 + } + ] + }, + "reconstructed": false, + "requestId": "provisional-layout-insurance_claim_intake-d32ef14cf081", + "status": 200 + }, + "sourceStatus": "provisional-layout" +} diff --git a/demos/insurance_claim_intake/source/SF91-20.pdf b/demos/insurance_claim_intake/source/SF91-20.pdf new file mode 100644 index 0000000..20efa75 Binary files /dev/null and b/demos/insurance_claim_intake/source/SF91-20.pdf differ diff --git a/demos/mortgage_verification/README.md b/demos/mortgage_verification/README.md new file mode 100644 index 0000000..c02f2bb --- /dev/null +++ b/demos/mortgage_verification/README.md @@ -0,0 +1,101 @@ +# Mortgage-assistance form extraction + +This developer sample maps page 1 of an authentic public Request for Mortgage +Assistance (RMA) form to eight reviewable fields. The visible names, +identifiers, address, phone number, selections, and hardship explanation are +privacy-safe demo values. They are not customer data, a real borrower, or a +lending decision. + +The committed output is a reviewed, receipt-bound live API response over this +public-form demo input. It matched 6/8 predeclared values exactly, returned a +valid page-bounded primary region for all eight fields, and retains both +punctuation mismatches. Reviewed does not mean correct, and it does not approve +publication. + +**[Open this reviewed proof on GitHub Pages →](https://pspdfkit.github.io/nutrient-extraction-samples/docs/lighthouse/assets/mortgage-verification-reviewed.html?utm_campaign=de_lighthouse_pilot_v1&utm_source=github&utm_medium=repository&utm_content=mortgage_verification.github_sample.v01.proof)** + +## Source and transformation + +- Publisher: U.S. Department of the Treasury, Making Home Affordable. +- Form: Request for Mortgage Assistance (RMA). +- Program context: . +- Frozen original: `source/rma_form.pdf`. +- Original SHA-256: + `15ea438e22263407da910f88ac353855c205cfe4cf479ef17468cb74b683db8c`. +- Derived demo SHA-256: + `2eab5c8c1c843ef5f0f0bef9e361f818369a6e5e7652f00e6e614d381a36018e`. + +The exact historical download URL for the repository scan was not recorded. +The Treasury URL above is canonical program context and is not claimed to be +the byte-download URL for the frozen file. + +`build_public_form.py` verifies the original bytes, preserves the previous +bespoke PDF as `data/legacy-synthetic-mortgage-verification.pdf`, rasterizes +source page 1, and fits it beneath the provenance rail on one exact 612x792 +PDF page. The result contains no AcroForm field tree, Widget annotations, or +JavaScript. The eight source boxes in `fixture.json` were independently drawn +over the final rendered page and visually checked against their exact values. + +Rebuild the deterministic PDF from the repository root: + +```bash +python3 demos/mortgage_verification/build_public_form.py +``` + +Two consecutive builds must report the same derived SHA-256 above. + +## Offline provisional proof + +From the repository root: + +```bash +python3 demos/mortgage_verification/generate_demo.py --provisional +python3 demos/mortgage_verification/check_expected.py --allow-provisional +``` + +Open `demos/mortgage_verification/provisional/output/index.html` directly. The page is +self-contained. These commands do not read `NUTRIENT_API_KEY`, access a live +cache, call the network, or consume credits. A zero exit code means only that +the fixture-derived values and independently recorded source boxes match the +oracle in `expected.json`. They write only below `provisional/` and never +replace the committed reviewed artifacts under `output/`. + +## Live refresh gate + +Only `--refresh` can read `NUTRIENT_API_KEY`, call the Data Extraction API, and +consume credits. Run it only within an explicitly approved live gate: + +```bash +python3 demos/mortgage_verification/generate_demo.py --refresh +python3 demos/mortgage_verification/check_expected.py +python3 demos/mortgage_verification/generate_demo.py --replay-live +``` + +The refresh path writes a new cache whose key is bound to this public-form PDF +and a matching request-ID/SHA-256 receipt. Historical synthetic caches and +receipts remain preserved and are not valid evidence for the new input. Live +replays require both a matching cache and receipt; they never fall back to provisional evidence. + +After the live response has received a recorded independent review, reproduce +that reviewed state with: + +```bash +python3 demos/mortgage_verification/generate_demo.py --replay-reviewed +python3 demos/mortgage_verification/check_expected.py --reviewed-live +``` + +Those flags reproduce a recorded review; they do not perform a new review or +approve publication. + +## Boundaries + +This sample demonstrates extraction and returned primary source regions. It is not +KYC, underwriting, an eligibility decision, or an accuracy, compliance, +security, or performance benchmark. The servicer region clips the decisive +final period, so the page does not claim complete semantic grounding. + +Generated provisional artifacts are `provisional/evidence.json`, +`provisional/output/source-page.png`, `provisional/output/comparison.json`, and +`provisional/output/index.html`. +The current output artifacts represent the reviewed public-form response; +historical captures in `output/playwright/` remain legacy evidence. diff --git a/demos/mortgage_verification/build_public_form.py b/demos/mortgage_verification/build_public_form.py new file mode 100644 index 0000000..8291712 --- /dev/null +++ b/demos/mortgage_verification/build_public_form.py @@ -0,0 +1,239 @@ +"""Build the privacy-safe one-page Treasury RMA demo input. + +The repository source is a four-page scan whose first page already contains +the approved demo values. This builder freezes the original bytes, preserves +the previous bespoke fixture, rasterizes only page 1, and places that page +beneath an ASCII provenance rail on an exact US-letter canvas. +""" + +from __future__ import annotations + +import hashlib +import io +import math +import os +import tempfile +from pathlib import Path + +import pypdfium2 as pdfium +from PIL import Image +from pypdf import PdfReader +from pypdfium2 import raw +from reportlab.lib.utils import ImageReader +from reportlab.pdfgen import canvas + + +DEMO_DIR = Path(__file__).resolve().parent +REPO_ROOT = DEMO_DIR.parents[1] +REPOSITORY_SOURCE = REPO_ROOT / "demos" / "rma_extraction" / "data" / "rma_form.pdf" +FROZEN_SOURCE = DEMO_DIR / "source" / "rma_form.pdf" +ACTIVE_INPUT = DEMO_DIR / "data" / "mortgage-verification.pdf" +LEGACY_INPUT = DEMO_DIR / "data" / "legacy-synthetic-mortgage-verification.pdf" + +ORIGINAL_SHA256 = "15ea438e22263407da910f88ac353855c205cfe4cf479ef17468cb74b683db8c" +LEGACY_SHA256 = "15f9be3fc3c78a78bb5a67e8f2b8fa0d09383626b0c2600676e2a3f95d054e77" +DERIVED_SHA256 = "2eab5c8c1c843ef5f0f0bef9e361f818369a6e5e7652f00e6e614d381a36018e" +PROVENANCE_RAIL = "AUTHENTIC PUBLIC FORM - PRIVACY-SAFE DEMO VALUES" + +PAGE_WIDTH = 612.0 +PAGE_HEIGHT = 792.0 +RAIL_HEIGHT = 32.0 +FORM_TOP_GAP = 6.0 +FORM_BOTTOM_MARGIN = 8.0 +FORM_SIDE_MARGIN = 12.0 +RENDER_SCALE = 1.5 + + +def _sha256(payload: bytes) -> str: + return hashlib.sha256(payload).hexdigest() + + +def _atomic_write(path: Path, payload: bytes) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + if path.is_file() and path.read_bytes() == payload: + return + descriptor, temporary_name = tempfile.mkstemp( + dir=path.parent, + prefix=f".{path.name}.", + suffix=".tmp", + ) + temporary = Path(temporary_name) + try: + with os.fdopen(descriptor, "wb") as stream: + stream.write(payload) + stream.flush() + os.fsync(stream.fileno()) + os.replace(temporary, path) + finally: + if temporary.exists(): + temporary.unlink() + + +def _require_digest(path: Path, expected: str, *, label: str) -> bytes: + try: + if path.is_symlink() or not path.is_file(): + raise RuntimeError(f"{label} must be a regular, non-symlink file") + payload = path.read_bytes() + except RuntimeError: + raise + except OSError as error: + raise RuntimeError(f"could not read {label}: {path}") from error + actual = _sha256(payload) + if actual != expected: + raise RuntimeError( + f"{label} SHA-256 mismatch: expected {expected}, found {actual}" + ) + return payload + + +def _freeze_inputs() -> None: + source_payload = _require_digest( + REPOSITORY_SOURCE, + ORIGINAL_SHA256, + label="repository Treasury RMA source", + ) + if FROZEN_SOURCE.exists(): + _require_digest( + FROZEN_SOURCE, + ORIGINAL_SHA256, + label="frozen Treasury RMA source", + ) + else: + _atomic_write(FROZEN_SOURCE, source_payload) + + if LEGACY_INPUT.exists(): + _require_digest(LEGACY_INPUT, LEGACY_SHA256, label="legacy bespoke fixture") + else: + legacy_payload = _require_digest( + ACTIVE_INPUT, + LEGACY_SHA256, + label="current bespoke fixture before preservation", + ) + _atomic_write(LEGACY_INPUT, legacy_payload) + + +def _render_first_page(source: Path) -> Image.Image: + document = pdfium.PdfDocument(source) + page = None + bitmap = None + try: + if len(document) != 4: + raise RuntimeError("the frozen Treasury RMA source must contain four pages") + page = document[0] + bitmap = page.render( + scale=RENDER_SCALE, + may_draw_forms=False, + fill_color=(255, 255, 255, 255), + force_bitmap_format=raw.FPDFBitmap_BGRA, + rev_byteorder=True, + ) + return bitmap.to_pil().convert("RGB") + finally: + if bitmap is not None: + bitmap.close() + if page is not None: + page.close() + document.close() + + +def _build_pdf(source: Path) -> bytes: + image = _render_first_page(source) + encoded_image = io.BytesIO() + image.save( + encoded_image, + format="JPEG", + quality=92, + subsampling=0, + optimize=False, + progressive=False, + dpi=(216, 216), + ) + encoded_image.seek(0) + form_height = PAGE_HEIGHT - RAIL_HEIGHT - FORM_TOP_GAP - FORM_BOTTOM_MARGIN + form_width = PAGE_WIDTH - (2 * FORM_SIDE_MARGIN) + scale = min(form_width / image.width, form_height / image.height) + draw_width = image.width * scale + draw_height = image.height * scale + draw_x = (PAGE_WIDTH - draw_width) / 2 + draw_y = FORM_BOTTOM_MARGIN + + output = io.BytesIO() + pdf = canvas.Canvas( + output, + pagesize=(PAGE_WIDTH, PAGE_HEIGHT), + bottomup=1, + pageCompression=1, + invariant=1, + pdfVersion=(1, 4), + ) + pdf.setTitle("Treasury RMA privacy-safe public-form demo") + pdf.setAuthor("Nutrient") + pdf.setSubject("Authentic public form with privacy-safe demo values") + pdf.setFillColorRGB(1, 1, 1) + pdf.rect(0, 0, PAGE_WIDTH, PAGE_HEIGHT, stroke=0, fill=1) + pdf.drawImage( + ImageReader(encoded_image), + draw_x, + draw_y, + width=draw_width, + height=draw_height, + preserveAspectRatio=True, + anchor="c", + mask=None, + ) + pdf.setFillColorRGB(0.075, 0.082, 0.092) + pdf.rect(0, PAGE_HEIGHT - RAIL_HEIGHT, PAGE_WIDTH, RAIL_HEIGHT, stroke=0, fill=1) + pdf.setFillColorRGB(0.97, 0.96, 0.91) + pdf.setFont("Helvetica-Bold", 9) + pdf.drawCentredString( + PAGE_WIDTH / 2, + PAGE_HEIGHT - 20.5, + PROVENANCE_RAIL, + ) + pdf.showPage() + pdf.save() + return output.getvalue() + + +def _validate_output(payload: bytes) -> None: + reader = PdfReader(io.BytesIO(payload), strict=True) + if len(reader.pages) != 1: + raise RuntimeError("derived demo input must contain exactly one page") + page = reader.pages[0] + width = float(page.mediabox.width) + height = float(page.mediabox.height) + if not ( + math.isclose(width, PAGE_WIDTH, rel_tol=0.0, abs_tol=1e-6) + and math.isclose(height, PAGE_HEIGHT, rel_tol=0.0, abs_tol=1e-6) + ): + raise RuntimeError("derived demo input must be exactly 612x792 points") + root = reader.trailer["/Root"] + if "/AcroForm" in root: + raise RuntimeError("derived demo input must not contain an AcroForm tree") + if "/OpenAction" in root or "/AA" in root: + raise RuntimeError("derived demo input must not contain document actions") + names = root.get("/Names") + if names is not None and "/JavaScript" in names.get_object(): + raise RuntimeError("derived demo input must not contain JavaScript") + for annotation in page.get("/Annots", []): + if annotation.get_object().get("/Subtype") == "/Widget": + raise RuntimeError("derived demo input must not contain Widget annotations") + + +def main() -> int: + _freeze_inputs() + payload = _build_pdf(FROZEN_SOURCE) + _validate_output(payload) + digest = _sha256(payload) + if digest != DERIVED_SHA256: + raise RuntimeError( + f"derived demo SHA-256 mismatch: expected {DERIVED_SHA256}, found {digest}" + ) + _atomic_write(ACTIVE_INPUT, payload) + print(f"Wrote {ACTIVE_INPUT}") + print(f"SHA-256: {digest}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/demos/mortgage_verification/cache/15f9be3fc3c78a78bb5a67e8f2b8fa0d09383626b0c2600676e2a3f95d054e77-extraction-extract-b35c962edca85f56a9f2707e49646779b4db844e5c22ad71f6b29b445118de59.json b/demos/mortgage_verification/cache/15f9be3fc3c78a78bb5a67e8f2b8fa0d09383626b0c2600676e2a3f95d054e77-extraction-extract-b35c962edca85f56a9f2707e49646779b4db844e5c22ad71f6b29b445118de59.json new file mode 100644 index 0000000..c3064dd --- /dev/null +++ b/demos/mortgage_verification/cache/15f9be3fc3c78a78bb5a67e8f2b8fa0d09383626b0c2600676e2a3f95d054e77-extraction-extract-b35c962edca85f56a9f2707e49646779b4db844e5c22ad71f6b29b445118de59.json @@ -0,0 +1,302 @@ +{ + "output": { + "data": { + "applicant": { + "full_name": "Maya Chen" + }, + "application_id": "MV-2026-0147", + "assets": { + "account_suffix": "4821", + "currency_code": "USD", + "institution": "Pioneer Community Bank", + "liquid_assets_amount": 42380.55, + "statement_date": "07/31/2026" + }, + "employment": { + "employer": "Northstar Bicycle Works", + "gross_monthly_income": 8450 + } + }, + "metadata": { + "applicant": { + "full_name": { + "bbox": { + "height": 35, + "width": 166, + "x": 908, + "y": 497 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 100.30905151367188, + "width": 283.30889892578125, + "x": 889.0565795898438, + "y": 437.7625427246094 + }, + "block_id": "c2", + "pageIndex": 0, + "pageNumber": 1 + } + ] + } + }, + "application_id": { + "bbox": { + "height": 27, + "width": 216, + "x": 152, + "y": 499 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 106.76181030273438, + "width": 243.75071716308594, + "x": 139.2238311767578, + "y": 440.1905212402344 + }, + "block_id": "c0", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "assets": { + "account_suffix": { + "bbox": { + "height": 27, + "width": 69, + "x": 905, + "y": 955 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 127.0947265625, + "width": 234.75067138671875, + "x": 886.1770629882812, + "y": 877.35400390625 + }, + "block_id": "c8", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "currency_code": { + "bbox": { + "height": 27, + "width": 66, + "x": 908, + "y": 1183 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 112.8935546875, + "width": 230.3309326171875, + "x": 882.4371337890625, + "y": 1111.9052734375 + }, + "block_id": "c11", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "institution": { + "bbox": { + "height": 36, + "width": 375, + "x": 152, + "y": 952 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 112.4415283203125, + "width": 397.8053894042969, + "x": 139.49319458007812, + "y": 881.8719482421875 + }, + "block_id": "c6", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "liquid_assets_amount": { + "bbox": { + "height": 27, + "width": 138, + "x": 150, + "y": 1183 + }, + "confidence": 0.9696927825876808, + "confidenceComponents": { + "formatScore": 1, + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 106.1611328125, + "width": 295.01995849609375, + "x": 137.06915283203125, + "y": 1113.830322265625 + }, + "block_id": "c9", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "statement_date": { + "bbox": { + "height": 27, + "width": 166, + "x": 150, + "y": 1411 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 112.9716796875, + "width": 216.06668090820312, + "x": 136.45748901367188, + "y": 1340.06201171875 + }, + "block_id": "c12", + "pageIndex": 0, + "pageNumber": 1 + } + ] + } + }, + "employment": { + "employer": { + "bbox": { + "height": 36, + "width": 350, + "x": 152, + "y": 725 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 117.83197021484375, + "width": 379.09326171875, + "x": 138.40736389160156, + "y": 656.2883911132812 + }, + "block_id": "c3", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "gross_monthly_income": { + "bbox": { + "height": 27, + "width": 102, + "x": 905, + "y": 727 + }, + "confidence": 0.9696927825876808, + "confidenceComponents": { + "formatScore": 1, + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 114.23687744140625, + "width": 326.03857421875, + "x": 887.140869140625, + "y": 655.0525512695312 + }, + "block_id": "c5", + "pageIndex": 0, + "pageNumber": 1 + } + ] + } + } + }, + "pages": [ + { + "height": 2200, + "page": 1, + "width": 1700 + } + ] + }, + "reconstructed": false, + "requestId": "GMxyEMJHL4iNXZIAIFuS", + "status": 200 +} diff --git a/demos/mortgage_verification/cache/15f9be3fc3c78a78bb5a67e8f2b8fa0d09383626b0c2600676e2a3f95d054e77-extraction-extract-b35c962edca85f56a9f2707e49646779b4db844e5c22ad71f6b29b445118de59.receipt.json b/demos/mortgage_verification/cache/15f9be3fc3c78a78bb5a67e8f2b8fa0d09383626b0c2600676e2a3f95d054e77-extraction-extract-b35c962edca85f56a9f2707e49646779b4db844e5c22ad71f6b29b445118de59.receipt.json new file mode 100644 index 0000000..528acf8 --- /dev/null +++ b/demos/mortgage_verification/cache/15f9be3fc3c78a78bb5a67e8f2b8fa0d09383626b0c2600676e2a3f95d054e77-extraction-extract-b35c962edca85f56a9f2707e49646779b4db844e5c22ad71f6b29b445118de59.receipt.json @@ -0,0 +1,6 @@ +{ + "projectedResponseSha256": "0093e8ff403c1f91f7fdb7e99dc87c8e4667db392c265142a142d18fa3eb76a9", + "receiptVersion": 1, + "requestId": "GMxyEMJHL4iNXZIAIFuS", + "sourceStatus": "live-refresh" +} diff --git a/demos/mortgage_verification/cache/2eab5c8c1c843ef5f0f0bef9e361f818369a6e5e7652f00e6e614d381a36018e-extraction-extract-c916fe75b45defb3f9078a09545733ea7e8ae8d20310dfb490ecbeb2bff6c2aa.json b/demos/mortgage_verification/cache/2eab5c8c1c843ef5f0f0bef9e361f818369a6e5e7652f00e6e614d381a36018e-extraction-extract-c916fe75b45defb3f9078a09545733ea7e8ae8d20310dfb490ecbeb2bff6c2aa.json new file mode 100644 index 0000000..e312319 --- /dev/null +++ b/demos/mortgage_verification/cache/2eab5c8c1c843ef5f0f0bef9e361f818369a6e5e7652f00e6e614d381a36018e-extraction-extract-c916fe75b45defb3f9078a09545733ea7e8ae8d20310dfb490ecbeb2bff6c2aa.json @@ -0,0 +1,293 @@ +{ + "output": { + "data": { + "borrower": { + "full_name": "Patricia N Alvarez", + "home_phone": "(555) 201-4477", + "mailing_address": "3390 Maple Grove Lane, Denver, CO 80219" + }, + "hardship": { + "summary": "Reduced work hours led to a decrease in household income, making it difficult to keep up with the mortgage payment." + }, + "loan_id": "0012345678", + "property": { + "intent": "Keep the Property", + "occupancy": "Primary Residence" + }, + "servicer": { + "name": "Meridian Loan Servicing, Inc" + } + }, + "metadata": { + "borrower": { + "full_name": { + "bbox": { + "height": 20, + "width": 178, + "x": 221, + "y": 424 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "recognitionScore": 0.8044138550758362, + "source_bboxes": [ + { + "bbox": { + "height": 21.946197509765625, + "width": 180.84298706054688, + "x": 218.82769775390625, + "y": 422.6753234863281 + }, + "block_id": "b10", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "home_phone": { + "bbox": { + "height": 21, + "width": 148, + "x": 221, + "y": 547 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "recognitionScore": 0.9559304118156433, + "source_bboxes": [ + { + "bbox": { + "height": 22.35614013671875, + "width": 151.29733276367188, + "x": 218.701171875, + "y": 546.0486450195312 + }, + "block_id": "b14", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "mailing_address": { + "bbox": { + "height": 19, + "width": 424, + "x": 215, + "y": 814 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "recognitionScore": 0.9402267932891846, + "source_bboxes": [ + { + "bbox": { + "height": 25.2564697265625, + "width": 428.6247253417969, + "x": 212.91757202148438, + "y": 811.1243896484375 + }, + "block_id": "b20", + "pageIndex": 0, + "pageNumber": 1 + } + ] + } + }, + "hardship": { + "summary": { + "bbox": { + "height": 82.7344970703125, + "width": 1095.7192993164062, + "x": 206.76531982421875, + "y": 1880.2655029296875 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match_multiblock", + "pageIndex": 0, + "pageNumber": 1, + "recognitionScore": 0.9451408982276917, + "source_bboxes": [ + { + "bbox": { + "height": 25.5250244140625, + "width": 512.3526000976562, + "x": 790.1320190429688, + "y": 1880.2655029296875 + }, + "block_id": "b50", + "pageIndex": 0, + "pageNumber": 1 + }, + { + "bbox": { + "height": 27.9561767578125, + "width": 647.2346801757812, + "x": 206.76531982421875, + "y": 1935.0438232421875 + }, + "block_id": "b51", + "pageIndex": 0, + "pageNumber": 1 + } + ] + } + }, + "loan_id": { + "bbox": { + "height": 19, + "width": 121, + "x": 397, + "y": 313 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "recognitionScore": 0.35208237171173096, + "source_bboxes": [ + { + "bbox": { + "height": 32, + "width": 304.698486328125, + "x": 215.2185821533203, + "y": 303 + }, + "block_id": "b7", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "property": { + "intent": { + "bbox": { + "height": 20, + "width": 154, + "x": 511, + "y": 663 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "recognitionScore": 0.8242091536521912, + "source_bboxes": [ + { + "bbox": { + "height": 24.36517333984375, + "width": 185.878662109375, + "x": 479.97625732421875, + "y": 658.7664184570312 + }, + "block_id": "b52", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "occupancy": { + "bbox": { + "height": 20, + "width": 155, + "x": 510, + "y": 701 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "recognitionScore": 0.9627319574356079, + "source_bboxes": [ + { + "bbox": { + "height": 23.46051025390625, + "width": 186.79177856445312, + "x": 480.2521667480469, + "y": 699.1741943359375 + }, + "block_id": "b53", + "pageIndex": 0, + "pageNumber": 1 + } + ] + } + }, + "servicer": { + "name": { + "bbox": { + "height": 19, + "width": 270, + "x": 1005, + "y": 316 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "recognitionScore": 0.8718842267990112, + "source_bboxes": [ + { + "bbox": { + "height": 23.895355224609375, + "width": 355.8447265625, + "x": 920.6536865234375, + "y": 312.4984436035156 + }, + "block_id": "b4", + "pageIndex": 0, + "pageNumber": 1 + } + ] + } + } + }, + "pages": [ + { + "height": 2200, + "page": 1, + "width": 1700 + } + ] + }, + "reconstructed": false, + "requestId": "GM0CoPTBV6-M19QAAlcB", + "status": 200 +} diff --git a/demos/mortgage_verification/cache/2eab5c8c1c843ef5f0f0bef9e361f818369a6e5e7652f00e6e614d381a36018e-extraction-extract-c916fe75b45defb3f9078a09545733ea7e8ae8d20310dfb490ecbeb2bff6c2aa.receipt.json b/demos/mortgage_verification/cache/2eab5c8c1c843ef5f0f0bef9e361f818369a6e5e7652f00e6e614d381a36018e-extraction-extract-c916fe75b45defb3f9078a09545733ea7e8ae8d20310dfb490ecbeb2bff6c2aa.receipt.json new file mode 100644 index 0000000..9fa5208 --- /dev/null +++ b/demos/mortgage_verification/cache/2eab5c8c1c843ef5f0f0bef9e361f818369a6e5e7652f00e6e614d381a36018e-extraction-extract-c916fe75b45defb3f9078a09545733ea7e8ae8d20310dfb490ecbeb2bff6c2aa.receipt.json @@ -0,0 +1,6 @@ +{ + "projectedResponseSha256": "ec7b7c8b77c6c009b5b9dfbdfef8e6da8fcaebb537167561cda7ba2d71a9aca1", + "receiptVersion": 1, + "requestId": "GM0CoPTBV6-M19QAAlcB", + "sourceStatus": "live-refresh" +} diff --git a/demos/mortgage_verification/check_expected.py b/demos/mortgage_verification/check_expected.py new file mode 100644 index 0000000..766795c --- /dev/null +++ b/demos/mortgage_verification/check_expected.py @@ -0,0 +1,14 @@ +"""Check mortgage-verification evidence against the source oracle.""" + +from __future__ import annotations + +try: + from .generate_demo import CONFIG +except ImportError: + from generate_demo import CONFIG + +from common.lighthouse_package import checker_main + + +if __name__ == "__main__": + raise SystemExit(checker_main(CONFIG)) diff --git a/demos/mortgage_verification/data/legacy-synthetic-mortgage-verification.pdf b/demos/mortgage_verification/data/legacy-synthetic-mortgage-verification.pdf new file mode 100644 index 0000000..7eaa34d Binary files /dev/null and b/demos/mortgage_verification/data/legacy-synthetic-mortgage-verification.pdf differ diff --git a/demos/mortgage_verification/data/mortgage-verification.pdf b/demos/mortgage_verification/data/mortgage-verification.pdf new file mode 100644 index 0000000..3e3ac89 Binary files /dev/null and b/demos/mortgage_verification/data/mortgage-verification.pdf differ diff --git a/demos/mortgage_verification/docs.json b/demos/mortgage_verification/docs.json new file mode 100644 index 0000000..09479e0 --- /dev/null +++ b/demos/mortgage_verification/docs.json @@ -0,0 +1,91 @@ +[ + { + "id": "mortgage_verification", + "name": "Treasury Request for Mortgage Assistance (RMA) - privacy-safe demo", + "file": "data/mortgage-verification.pdf", + "mode": "agentic", + "schema": { + "type": "object", + "properties": { + "loan_id": { + "type": "string", + "description": "The value printed beside Loan I.D. Number; preserve leading zeroes." + }, + "borrower": { + "type": "object", + "description": "Borrower contact details visibly printed on page 1 of the RMA form.", + "properties": { + "full_name": { + "type": "string", + "description": "The borrower's full name printed in the Borrower's name field." + }, + "home_phone": { + "type": "string", + "description": "The value printed in Home phone number with area code, preserving punctuation." + }, + "mailing_address": { + "type": "string", + "description": "The complete value printed in the Mailing address field." + } + }, + "required": [ + "full_name", + "home_phone", + "mailing_address" + ] + }, + "servicer": { + "type": "object", + "description": "Mortgage-servicer details visibly printed at the top of page 1.", + "properties": { + "name": { + "type": "string", + "description": "The full company name printed beside Servicer." + } + }, + "required": [ + "name" + ] + }, + "property": { + "type": "object", + "description": "The selected property-intent and residence options on page 1.", + "properties": { + "intent": { + "type": "string", + "description": "The checked choice in the I want to row." + }, + "occupancy": { + "type": "string", + "description": "The checked choice in the The property is my row." + } + }, + "required": [ + "intent", + "occupancy" + ] + }, + "hardship": { + "type": "object", + "description": "The borrower's visible explanation in the Hardship Affidavit section.", + "properties": { + "summary": { + "type": "string", + "description": "The complete two-line value printed beside Explanation, preserving sentence punctuation." + } + }, + "required": [ + "summary" + ] + } + }, + "required": [ + "loan_id", + "borrower", + "servicer", + "property", + "hardship" + ] + } + } +] diff --git a/demos/mortgage_verification/expected.json b/demos/mortgage_verification/expected.json new file mode 100644 index 0000000..4c30646 --- /dev/null +++ b/demos/mortgage_verification/expected.json @@ -0,0 +1,18 @@ +{ + "borrower": { + "full_name": "Patricia N. Alvarez", + "home_phone": "(555) 201-4477", + "mailing_address": "3390 Maple Grove Lane, Denver, CO 80219" + }, + "hardship": { + "summary": "Reduced work hours led to a decrease in household income, making it difficult to keep up with the mortgage payment." + }, + "loan_id": "0012345678", + "property": { + "intent": "Keep the Property", + "occupancy": "Primary Residence" + }, + "servicer": { + "name": "Meridian Loan Servicing, Inc." + } +} diff --git a/demos/mortgage_verification/fixture.json b/demos/mortgage_verification/fixture.json new file mode 100644 index 0000000..5fd00ca --- /dev/null +++ b/demos/mortgage_verification/fixture.json @@ -0,0 +1,93 @@ +{ + "version": 2, + "slug": "mortgage_verification", + "sourceStatus": "public-form-demo", + "document": { + "filename": "data/mortgage-verification.pdf", + "title": "Treasury Request for Mortgage Assistance (RMA) - page 1", + "subtitle": "Authentic public form with privacy-safe demo values", + "width": 612, + "height": 792 + }, + "provenance": { + "publisher": "U.S. Department of the Treasury, Making Home Affordable", + "officialFormName": "Request for Mortgage Assistance (RMA)", + "canonicalSourceUrl": "https://home.treasury.gov/data/troubled-assets-relief-program/housing/mha", + "originalSha256": "15ea438e22263407da910f88ac353855c205cfe4cf479ef17468cb74b683db8c", + "sourceSha256": "2eab5c8c1c843ef5f0f0bef9e361f818369a6e5e7652f00e6e614d381a36018e" + }, + "fields": [ + { + "path": ["loan_id"], + "label": "Loan I.D. Number", + "value": "0012345678", + "source": { + "pageIndex": 0, + "bbox": {"x": 139, "y": 109, "width": 53, "height": 15} + } + }, + { + "path": ["borrower", "full_name"], + "label": "Borrower's name", + "value": "Patricia N. Alvarez", + "source": { + "pageIndex": 0, + "bbox": {"x": 75, "y": 149, "width": 76, "height": 16} + } + }, + { + "path": ["servicer", "name"], + "label": "Servicer", + "value": "Meridian Loan Servicing, Inc.", + "source": { + "pageIndex": 0, + "bbox": {"x": 358, "y": 109, "width": 107, "height": 15} + } + }, + { + "path": ["borrower", "home_phone"], + "label": "Home phone number with area code", + "value": "(555) 201-4477", + "source": { + "pageIndex": 0, + "bbox": {"x": 75, "y": 194, "width": 70, "height": 14} + } + }, + { + "path": ["borrower", "mailing_address"], + "label": "Mailing address", + "value": "3390 Maple Grove Lane, Denver, CO 80219", + "source": { + "pageIndex": 0, + "bbox": {"x": 74, "y": 289, "width": 159, "height": 15} + } + }, + { + "path": ["property", "intent"], + "label": "I want to", + "value": "Keep the Property", + "source": { + "pageIndex": 0, + "bbox": {"x": 169, "y": 236, "width": 81, "height": 14} + } + }, + { + "path": ["property", "occupancy"], + "label": "The property is my", + "value": "Primary Residence", + "source": { + "pageIndex": 0, + "bbox": {"x": 169, "y": 250, "width": 81, "height": 14} + } + }, + { + "path": ["hardship", "summary"], + "label": "Hardship explanation", + "value": "Reduced work hours led to a decrease in household income, making it difficult to keep up with the mortgage payment.", + "source": { + "pageIndex": 0, + "bbox": {"x": 74, "y": 674, "width": 477, "height": 37} + } + } + ] +} diff --git a/demos/mortgage_verification/generate_demo.py b/demos/mortgage_verification/generate_demo.py new file mode 100644 index 0000000..33e3644 --- /dev/null +++ b/demos/mortgage_verification/generate_demo.py @@ -0,0 +1,40 @@ +"""Generate the mortgage-verification lighthouse package.""" + +from __future__ import annotations + +import sys +from pathlib import Path + + +REPO_ROOT = Path(__file__).resolve().parents[2] +if str(REPO_ROOT) not in sys.path: + sys.path.insert(0, str(REPO_ROOT)) + +from common.lighthouse_package import PackageConfig, generator_main + + +CONFIG = PackageConfig( + demo_dir=Path(__file__).resolve().parent, + slug="mortgage_verification", + page_title="Mortgage-assistance form extraction", + provisional_summary=( + "An offline layout proof over an authentic Treasury RMA public form " + "carrying privacy-safe demo values. No API call was made, and this is " + "not release evidence." + ), + live_summary=( + "A receipt-bound live Extract response over the authentic public RMA " + "demo input. Independent evidence review remains required before " + "public use." + ), + reviewed_summary=( + "A receipt-bound live Extract response with a recorded independent " + "field-by-field audit against the visible public-form source. The " + "package retains every exact match and mismatch; the page shows the " + "API's primary returned source region for each field." + ), +) + + +if __name__ == "__main__": + raise SystemExit(generator_main(CONFIG)) diff --git a/demos/mortgage_verification/output/comparison.json b/demos/mortgage_verification/output/comparison.json new file mode 100644 index 0000000..a60fc68 --- /dev/null +++ b/demos/mortgage_verification/output/comparison.json @@ -0,0 +1,25 @@ +{ + "artifactVersion": 1, + "comparison": { + "exitCode": 1, + "expectedLeaves": 8, + "groundedLeaves": 8, + "issues": [ + { + "code": "WRONG", + "message": "expected 'Patricia N. Alvarez', got 'Patricia N Alvarez'", + "path": "$.borrower.full_name" + }, + { + "code": "WRONG", + "message": "expected 'Meridian Loan Servicing, Inc.', got 'Meridian Loan Servicing, Inc'", + "path": "$.servicer.name" + } + ], + "matchedLeaves": 6, + "passed": false + }, + "evidenceKind": "live", + "evidenceLabel": "REVIEWED LIVE API RESPONSE", + "reviewed": true +} diff --git a/demos/mortgage_verification/output/index.html b/demos/mortgage_verification/output/index.html new file mode 100644 index 0000000..70d36a3 --- /dev/null +++ b/demos/mortgage_verification/output/index.html @@ -0,0 +1,901 @@ + + + + + + + Mortgage-assistance form extraction + + + +
+
+ Nutrient + Data Extraction API / source proof +
+
+
+

Reviewed evidence / authentic public form

+

Mortgage-assistance form extraction

+

A receipt-bound live Extract response with a recorded independent field-by-field audit against the visible public-form source. The package retains every exact match and mismatch; the page shows the API's primary returned source region for each field.

+
+ +
+ +
+
+
+ Treasury Request for Mortgage Assistance (RMA) - page 1 + Authentic public form · privacy-safe demo values · page 1 +
+
+ Authentic public form with privacy-safe demo values: Treasury Request for Mortgage Assistance (RMA) - page 1 + +
+
+ + +
+ +

Correctness is determined by the independent source oracle for this authentic public form with privacy-safe demo values. Recognition signals and bounding boxes are supporting evidence, not a substitute for comparison.

+
+ + + + diff --git a/demos/mortgage_verification/output/playwright/live-desktop.png b/demos/mortgage_verification/output/playwright/live-desktop.png new file mode 100644 index 0000000..3d4cdb0 Binary files /dev/null and b/demos/mortgage_verification/output/playwright/live-desktop.png differ diff --git a/demos/mortgage_verification/output/playwright/live-mobile-scrolled.png b/demos/mortgage_verification/output/playwright/live-mobile-scrolled.png new file mode 100644 index 0000000..89c5c2a Binary files /dev/null and b/demos/mortgage_verification/output/playwright/live-mobile-scrolled.png differ diff --git a/demos/mortgage_verification/output/playwright/live-mobile.png b/demos/mortgage_verification/output/playwright/live-mobile.png new file mode 100644 index 0000000..509b81a Binary files /dev/null and b/demos/mortgage_verification/output/playwright/live-mobile.png differ diff --git a/demos/mortgage_verification/output/source-page.png b/demos/mortgage_verification/output/source-page.png new file mode 100644 index 0000000..1da6055 Binary files /dev/null and b/demos/mortgage_verification/output/source-page.png differ diff --git a/demos/mortgage_verification/provisional/evidence.json b/demos/mortgage_verification/provisional/evidence.json new file mode 100644 index 0000000..f6126db --- /dev/null +++ b/demos/mortgage_verification/provisional/evidence.json @@ -0,0 +1,116 @@ +{ + "response": { + "output": { + "data": { + "borrower": { + "full_name": "Patricia N. Alvarez", + "home_phone": "(555) 201-4477", + "mailing_address": "3390 Maple Grove Lane, Denver, CO 80219" + }, + "hardship": { + "summary": "Reduced work hours led to a decrease in household income, making it difficult to keep up with the mortgage payment." + }, + "loan_id": "0012345678", + "property": { + "intent": "Keep the Property", + "occupancy": "Primary Residence" + }, + "servicer": { + "name": "Meridian Loan Servicing, Inc." + } + }, + "metadata": { + "borrower": { + "full_name": { + "bbox": { + "height": 16.0, + "width": 76.0, + "x": 75.0, + "y": 149.0 + }, + "pageIndex": 0 + }, + "home_phone": { + "bbox": { + "height": 14.0, + "width": 70.0, + "x": 75.0, + "y": 194.0 + }, + "pageIndex": 0 + }, + "mailing_address": { + "bbox": { + "height": 15.0, + "width": 159.0, + "x": 74.0, + "y": 289.0 + }, + "pageIndex": 0 + } + }, + "hardship": { + "summary": { + "bbox": { + "height": 37.0, + "width": 477.0, + "x": 74.0, + "y": 674.0 + }, + "pageIndex": 0 + } + }, + "loan_id": { + "bbox": { + "height": 15.0, + "width": 53.0, + "x": 139.0, + "y": 109.0 + }, + "pageIndex": 0 + }, + "property": { + "intent": { + "bbox": { + "height": 14.0, + "width": 81.0, + "x": 169.0, + "y": 236.0 + }, + "pageIndex": 0 + }, + "occupancy": { + "bbox": { + "height": 14.0, + "width": 81.0, + "x": 169.0, + "y": 250.0 + }, + "pageIndex": 0 + } + }, + "servicer": { + "name": { + "bbox": { + "height": 15.0, + "width": 107.0, + "x": 358.0, + "y": 109.0 + }, + "pageIndex": 0 + } + } + }, + "pages": [ + { + "height": 792.0, + "width": 612.0 + } + ] + }, + "reconstructed": false, + "requestId": "provisional-layout-mortgage_verification-b1fac06a48fe", + "status": 200 + }, + "sourceStatus": "provisional-layout" +} diff --git a/demos/mortgage_verification/source/README.md b/demos/mortgage_verification/source/README.md new file mode 100644 index 0000000..910524c --- /dev/null +++ b/demos/mortgage_verification/source/README.md @@ -0,0 +1,16 @@ +# Frozen source provenance + +`rma_form.pdf` is the repository copy of the U.S. Department of the Treasury, +Making Home Affordable Request for Mortgage Assistance (RMA). Its SHA-256 is: + +`15ea438e22263407da910f88ac353855c205cfe4cf479ef17468cb74b683db8c` + +Canonical program context: + + +The exact historical download URL for these repository bytes was not recorded. +The context URL is therefore not represented as the exact byte source. + +The derived one-page demo uses only source page 1, keeps its visible sample +values, and adds an external provenance rail. See `../build_public_form.py` for +the deterministic transformation. diff --git a/demos/mortgage_verification/source/rma_form.pdf b/demos/mortgage_verification/source/rma_form.pdf new file mode 100644 index 0000000..128f4b5 Binary files /dev/null and b/demos/mortgage_verification/source/rma_form.pdf differ diff --git a/demos/parse_citations/data/appraisal_report_parse_results.json b/demos/parse_citations/data/appraisal_report_parse_results.json index eda7326..1be491d 100644 --- a/demos/parse_citations/data/appraisal_report_parse_results.json +++ b/demos/parse_citations/data/appraisal_report_parse_results.json @@ -1,33 +1,21 @@ { - "configuration": { - "apiVersion": "2026-05-25", - "engine": { - "requestedEngineVersion": "stable" - }, - "language": "auto", - "maxLanguages": 2, - "maxScripts": 2, - "mode": "agentic", - "outputFormat": "both" - }, - "metrics": { - "pagesProcessed": 4, - "processingTimeMs": 73270 - }, + "status": 200, + "requestId": "GMdeOmUhCtuGm9IAAG6B", "output": { "elements": [ { - "altDescription": "Circular black-and-white seal or logo with a weighing scale symbol in the center.", + "altDescription": "Circular seal or logo with a central balance scale icon and surrounding text.", "bounds": { "height": 75.61899, "width": 78.97654, "x": 93.46006, "y": 32.45165 }, + "cells": null, "classification": "other", "classificationConfidence": 0.06777428, "confidence": 0.94334936, - "id": "9bb9aa7a-70b3-4750-bb56-ec14286d41d5", + "id": "53ec30c1-d43c-4c22-be04-3e828d230432", "page": { "height": 2200, "pageIndex": 0, @@ -62,8 +50,9 @@ "x": 351.4891, "y": 86.55932 }, + "cells": null, "confidence": 0.7658751, - "id": "baa30cb6-622c-475b-9164-4b89e73b892d", + "id": "7d6508fd-10a7-43ef-87ce-0504030757dc", "page": { "height": 2200, "pageIndex": 0, @@ -91,190 +80,21 @@ "readingOrder": 1, "role": "SectionHeader", "text": "SMALL RESIDENTIAL INCOME PROPERY APPRAISAL REPORT", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 111, - "x": 352, - "y": 88 - }, - "confidence": 1, - "points": [ - [ - 352, - 88 - ], - [ - 463, - 88 - ], - [ - 463, - 115 - ], - [ - 352, - 115 - ] - ], - "text": "SMALL" - }, - { - "bounds": { - "height": 27, - "width": 219, - "x": 474, - "y": 88 - }, - "confidence": 1, - "points": [ - [ - 474, - 88 - ], - [ - 693, - 88 - ], - [ - 693, - 115 - ], - [ - 474, - 115 - ] - ], - "text": "RESIDENTIAL" - }, - { - "bounds": { - "height": 27, - "width": 130, - "x": 705, - "y": 88 - }, - "confidence": 1, - "points": [ - [ - 705, - 88 - ], - [ - 835, - 88 - ], - [ - 835, - 115 - ], - [ - 705, - 115 - ] - ], - "text": "INCOME" - }, - { - "bounds": { - "height": 27, - "width": 161, - "x": 849, - "y": 88 - }, - "confidence": 1, - "points": [ - [ - 849, - 88 - ], - [ - 1010, - 88 - ], - [ - 1010, - 115 - ], - [ - 849, - 115 - ] - ], - "text": "PROPERY" - }, - { - "bounds": { - "height": 27, - "width": 186, - "x": 1022, - "y": 88 - }, - "confidence": 1, - "points": [ - [ - 1022, - 88 - ], - [ - 1208, - 88 - ], - [ - 1208, - 115 - ], - [ - 1022, - 115 - ] - ], - "text": "APPRAISAL" - }, - { - "bounds": { - "height": 27, - "width": 138, - "x": 1219, - "y": 88 - }, - "confidence": 1, - "points": [ - [ - 1219, - 88 - ], - [ - 1357, - 88 - ], - [ - 1357, - 115 - ], - [ - 1219, - 115 - ] - ], - "text": "REPORT" - } - ] + "type": "paragraph" }, { - "altDescription": "Circular black-and-white seal or logo with a weighing scale symbol in the center.", + "altDescription": "Circular seal or logo with a central balance scale icon and surrounding text.", "bounds": { "height": 76.01593, "width": 79.09949, "x": 1484.3022, "y": 32.485218 }, + "cells": null, "classification": "other", "classificationConfidence": 0.06777531, "confidence": 0.9492254, - "id": "74c5512e-e775-41e7-aaed-d84e05c92406", + "id": "a47f710f-92f1-4c56-936c-80a715cf154d", "page": { "height": 2200, "pageIndex": 0, @@ -309,8 +129,9 @@ "x": 1348.1819, "y": 133.5393 }, + "cells": null, "confidence": 0.84244454, - "id": "0e935282-9285-413f-86c4-2a34fd3562be", + "id": "703183fe-dcf6-41fb-a8d0-b606cff3fcab", "page": { "height": 2200, "pageIndex": 0, @@ -347,8 +168,9 @@ "x": 87.98707, "y": 133.6173 }, + "cells": null, "confidence": 0.76828945, - "id": "7edb00cc-9264-48e9-8156-7aae2f74b506", + "id": "b9c6006c-ac3c-4ca6-a3b0-b1a8643f0b65", "page": { "height": 2200, "pageIndex": 0, @@ -376,149 +198,7 @@ "readingOrder": 5, "role": "Text", "text": "Property Address Willowbrook Lane 1487_____________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 94, - "x": 88, - "y": 136 - }, - "confidence": 1, - "points": [ - [ - 88, - 136 - ], - [ - 182, - 136 - ], - [ - 182, - 163 - ], - [ - 88, - 163 - ] - ], - "text": "Property" - }, - { - "bounds": { - "height": 22, - "width": 91, - "x": 191, - "y": 136 - }, - "confidence": 1, - "points": [ - [ - 191, - 136 - ], - [ - 282, - 136 - ], - [ - 282, - 158 - ], - [ - 191, - 158 - ] - ], - "text": "Address" - }, - { - "bounds": { - "height": 19, - "width": 124, - "x": 350, - "y": 136 - }, - "confidence": 1, - "points": [ - [ - 350, - 136 - ], - [ - 474, - 136 - ], - [ - 474, - 155 - ], - [ - 350, - 155 - ] - ], - "text": "Willowbrook" - }, - { - "bounds": { - "height": 19, - "width": 47, - "x": 483, - "y": 136 - }, - "confidence": 1, - "points": [ - [ - 483, - 136 - ], - [ - 530, - 136 - ], - [ - 530, - 155 - ], - [ - 483, - 155 - ] - ], - "text": "Lane" - }, - { - "bounds": { - "height": 25, - "width": 522, - "x": 294, - "y": 136 - }, - "confidence": 1, - "points": [ - [ - 294, - 136 - ], - [ - 816, - 136 - ], - [ - 816, - 161 - ], - [ - 294, - 161 - ] - ], - "text": "1487_____________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -527,8 +207,9 @@ "x": 88, "y": 162.32098 }, + "cells": null, "confidence": 0.76072836, - "id": "71e4b9b1-13b1-4d46-a34d-0ac3906d6a5a", + "id": "1b603f03-ce11-4c3f-b243-5dc88e77bfd2", "page": { "height": 2200, "pageIndex": 0, @@ -556,289 +237,7 @@ "readingOrder": 6, "role": "Text", "text": "Legal Description 12, Block 3, Willowbrook Estates Subdivision Lot____________________________________________________________County Sangamon___________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 58, - "x": 88, - "y": 166 - }, - "confidence": 1, - "points": [ - [ - 88, - 166 - ], - [ - 146, - 166 - ], - [ - 146, - 193 - ], - [ - 88, - 193 - ] - ], - "text": "Legal" - }, - { - "bounds": { - "height": 27, - "width": 122, - "x": 161, - "y": 166 - }, - "confidence": 1, - "points": [ - [ - 161, - 166 - ], - [ - 283, - 166 - ], - [ - 283, - 193 - ], - [ - 161, - 193 - ] - ], - "text": "Description" - }, - { - "bounds": { - "height": 22, - "width": 30, - "x": 333, - "y": 163 - }, - "confidence": 1, - "points": [ - [ - 333, - 163 - ], - [ - 363, - 163 - ], - [ - 363, - 185 - ], - [ - 333, - 185 - ] - ], - "text": "12," - }, - { - "bounds": { - "height": 19, - "width": 55, - "x": 372, - "y": 163 - }, - "confidence": 1, - "points": [ - [ - 372, - 163 - ], - [ - 427, - 163 - ], - [ - 427, - 182 - ], - [ - 372, - 182 - ] - ], - "text": "Block" - }, - { - "bounds": { - "height": 22, - "width": 19, - "x": 433, - "y": 163 - }, - "confidence": 1, - "points": [ - [ - 433, - 163 - ], - [ - 452, - 163 - ], - [ - 452, - 185 - ], - [ - 433, - 185 - ] - ], - "text": "3," - }, - { - "bounds": { - "height": 19, - "width": 124, - "x": 458, - "y": 163 - }, - "confidence": 1, - "points": [ - [ - 458, - 163 - ], - [ - 582, - 163 - ], - [ - 582, - 182 - ], - [ - 458, - 182 - ] - ], - "text": "Willowbrook" - }, - { - "bounds": { - "height": 19, - "width": 75, - "x": 588, - "y": 163 - }, - "confidence": 1, - "points": [ - [ - 588, - 163 - ], - [ - 663, - 163 - ], - [ - 663, - 182 - ], - [ - 588, - 182 - ] - ], - "text": "Estates" - }, - { - "bounds": { - "height": 19, - "width": 116, - "x": 672, - "y": 163 - }, - "confidence": 1, - "points": [ - [ - 672, - 163 - ], - [ - 788, - 163 - ], - [ - 788, - 182 - ], - [ - 672, - 182 - ] - ], - "text": "Subdivision" - }, - { - "bounds": { - "height": 30, - "width": 924, - "x": 294, - "y": 163 - }, - "confidence": 1, - "points": [ - [ - 294, - 163 - ], - [ - 1218, - 163 - ], - [ - 1218, - 193 - ], - [ - 294, - 193 - ] - ], - "text": "Lot____________________________________________________________County" - }, - { - "bounds": { - "height": 25, - "width": 383, - "x": 1225, - "y": 166 - }, - "confidence": 1, - "points": [ - [ - 1225, - 166 - ], - [ - 1608, - 166 - ], - [ - 1608, - 191 - ], - [ - 1225, - 191 - ] - ], - "text": "Sangamon___________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -847,8 +246,9 @@ "x": 86, "y": 193.63255 }, + "cells": null, "confidence": 0.7474221, - "id": "4622b5ee-5831-4964-9daa-ad3c4d4f33a8", + "id": "d01fbb7d-bb79-4228-854e-7e4466c83456", "page": { "height": 2200, "pageIndex": 0, @@ -876,373 +276,7 @@ "readingOrder": 7, "role": "Text", "text": "Assessor’s Parcel No. 14-22-301-012______________________Tax Year 2025_______ R.E. Taxes $ 6,850___________ Special Assessments $", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 122, - "x": 86, - "y": 197 - }, - "confidence": 1, - "points": [ - [ - 86, - 197 - ], - [ - 208, - 197 - ], - [ - 208, - 219 - ], - [ - 86, - 219 - ] - ], - "text": "Assessor’s" - }, - { - "bounds": { - "height": 22, - "width": 69, - "x": 216, - "y": 197 - }, - "confidence": 1, - "points": [ - [ - 216, - 197 - ], - [ - 285, - 197 - ], - [ - 285, - 219 - ], - [ - 216, - 219 - ] - ], - "text": "Parcel" - }, - { - "bounds": { - "height": 22, - "width": 38, - "x": 294, - "y": 197 - }, - "confidence": 1, - "points": [ - [ - 294, - 197 - ], - [ - 332, - 197 - ], - [ - 332, - 219 - ], - [ - 294, - 219 - ] - ], - "text": "No." - }, - { - "bounds": { - "height": 25, - "width": 350, - "x": 338, - "y": 197 - }, - "confidence": 1, - "points": [ - [ - 338, - 197 - ], - [ - 688, - 197 - ], - [ - 688, - 222 - ], - [ - 338, - 222 - ] - ], - "text": "14-22-301-012______________________Tax" - }, - { - "bounds": { - "height": 22, - "width": 50, - "x": 694, - "y": 197 - }, - "confidence": 1, - "points": [ - [ - 694, - 197 - ], - [ - 744, - 197 - ], - [ - 744, - 219 - ], - [ - 694, - 219 - ] - ], - "text": "Year" - }, - { - "bounds": { - "height": 27, - "width": 105, - "x": 752, - "y": 194 - }, - "confidence": 1, - "points": [ - [ - 752, - 194 - ], - [ - 857, - 194 - ], - [ - 857, - 221 - ], - [ - 752, - 221 - ] - ], - "text": "2025_______" - }, - { - "bounds": { - "height": 19, - "width": 47, - "x": 863, - "y": 197 - }, - "confidence": 1, - "points": [ - [ - 863, - 197 - ], - [ - 910, - 197 - ], - [ - 910, - 216 - ], - [ - 863, - 216 - ] - ], - "text": "R.E." - }, - { - "bounds": { - "height": 22, - "width": 66, - "x": 913, - "y": 197 - }, - "confidence": 1, - "points": [ - [ - 913, - 197 - ], - [ - 979, - 197 - ], - [ - 979, - 219 - ], - [ - 913, - 219 - ] - ], - "text": "Taxes" - }, - { - "bounds": { - "height": 27, - "width": 13, - "x": 986, - "y": 194 - }, - "confidence": 1, - "points": [ - [ - 986, - 194 - ], - [ - 999, - 194 - ], - [ - 999, - 221 - ], - [ - 986, - 221 - ] - ], - "text": "$" - }, - { - "bounds": { - "height": 27, - "width": 158, - "x": 1005, - "y": 194 - }, - "confidence": 1, - "points": [ - [ - 1005, - 194 - ], - [ - 1163, - 194 - ], - [ - 1163, - 221 - ], - [ - 1005, - 221 - ] - ], - "text": "6,850___________" - }, - { - "bounds": { - "height": 25, - "width": 80, - "x": 1175, - "y": 197 - }, - "confidence": 1, - "points": [ - [ - 1175, - 197 - ], - [ - 1255, - 197 - ], - [ - 1255, - 222 - ], - [ - 1175, - 222 - ] - ], - "text": "Special" - }, - { - "bounds": { - "height": 22, - "width": 150, - "x": 1263, - "y": 197 - }, - "confidence": 1, - "points": [ - [ - 1263, - 197 - ], - [ - 1413, - 197 - ], - [ - 1413, - 219 - ], - [ - 1263, - 219 - ] - ], - "text": "Assessments" - }, - { - "bounds": { - "height": 27, - "width": 16, - "x": 1422, - "y": 194 - }, - "confidence": 1, - "points": [ - [ - 1422, - 194 - ], - [ - 1438, - 194 - ], - [ - 1438, - 221 - ], - [ - 1422, - 221 - ] - ], - "text": "$" - } - ] + "type": "paragraph" }, { "bounds": { @@ -1251,8 +285,9 @@ "x": 650.61597, "y": 194.8384 }, + "cells": null, "confidence": 0.78466713, - "id": "e154b803-43dd-430f-ad68-fa53816250bc", + "id": "7175a822-e585-415f-9061-9b2d88f2a069", "page": { "height": 2200, "pageIndex": 0, @@ -1289,8 +324,9 @@ "x": 87.34662, "y": 225.97736 }, + "cells": null, "confidence": 0.830245, - "id": "6084160e-7cc0-4343-929e-1f9f90e0ec9f", + "id": "72228a60-af83-45f4-bf87-f404171fbb86", "page": { "height": 2200, "pageIndex": 0, @@ -1318,345 +354,7 @@ "readingOrder": 9, "role": "Text", "text": "Neighborhood or Project Name Estates Willowbrook_____________________________ Map Reference 22-14N-4W____________ Census Tract 0012.00________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 155, - "x": 88, - "y": 227 - }, - "confidence": 1, - "points": [ - [ - 88, - 227 - ], - [ - 243, - 227 - ], - [ - 243, - 252 - ], - [ - 88, - 252 - ] - ], - "text": "Neighborhood" - }, - { - "bounds": { - "height": 16, - "width": 25, - "x": 252, - "y": 230 - }, - "confidence": 1, - "points": [ - [ - 252, - 230 - ], - [ - 277, - 230 - ], - [ - 277, - 246 - ], - [ - 252, - 246 - ] - ], - "text": "or" - }, - { - "bounds": { - "height": 25, - "width": 77, - "x": 288, - "y": 227 - }, - "confidence": 1, - "points": [ - [ - 288, - 227 - ], - [ - 365, - 227 - ], - [ - 365, - 252 - ], - [ - 288, - 252 - ] - ], - "text": "Project" - }, - { - "bounds": { - "height": 19, - "width": 66, - "x": 375, - "y": 227 - }, - "confidence": 1, - "points": [ - [ - 375, - 227 - ], - [ - 441, - 227 - ], - [ - 441, - 246 - ], - [ - 375, - 246 - ] - ], - "text": "Name" - }, - { - "bounds": { - "height": 19, - "width": 75, - "x": 577, - "y": 227 - }, - "confidence": 1, - "points": [ - [ - 577, - 227 - ], - [ - 652, - 227 - ], - [ - 652, - 246 - ], - [ - 577, - 246 - ] - ], - "text": "Estates" - }, - { - "bounds": { - "height": 25, - "width": 411, - "x": 447, - "y": 227 - }, - "confidence": 1, - "points": [ - [ - 447, - 227 - ], - [ - 858, - 227 - ], - [ - 858, - 252 - ], - [ - 447, - 252 - ] - ], - "text": "Willowbrook_____________________________" - }, - { - "bounds": { - "height": 25, - "width": 47, - "x": 863, - "y": 227 - }, - "confidence": 1, - "points": [ - [ - 863, - 227 - ], - [ - 910, - 227 - ], - [ - 910, - 252 - ], - [ - 863, - 252 - ] - ], - "text": "Map" - }, - { - "bounds": { - "height": 19, - "width": 113, - "x": 922, - "y": 227 - }, - "confidence": 1, - "points": [ - [ - 922, - 227 - ], - [ - 1035, - 227 - ], - [ - 1035, - 246 - ], - [ - 922, - 246 - ] - ], - "text": "Reference" - }, - { - "bounds": { - "height": 25, - "width": 175, - "x": 1044, - "y": 227 - }, - "confidence": 1, - "points": [ - [ - 1044, - 227 - ], - [ - 1219, - 227 - ], - [ - 1219, - 252 - ], - [ - 1044, - 252 - ] - ], - "text": "22-14N-4W____________" - }, - { - "bounds": { - "height": 19, - "width": 86, - "x": 1225, - "y": 227 - }, - "confidence": 1, - "points": [ - [ - 1225, - 227 - ], - [ - 1311, - 227 - ], - [ - 1311, - 246 - ], - [ - 1225, - 246 - ] - ], - "text": "Census" - }, - { - "bounds": { - "height": 19, - "width": 55, - "x": 1316, - "y": 227 - }, - "confidence": 1, - "points": [ - [ - 1316, - 227 - ], - [ - 1371, - 227 - ], - [ - 1371, - 246 - ], - [ - 1316, - 246 - ] - ], - "text": "Tract" - }, - { - "bounds": { - "height": 25, - "width": 227, - "x": 1380, - "y": 227 - }, - "confidence": 1, - "points": [ - [ - 1380, - 227 - ], - [ - 1607, - 227 - ], - [ - 1607, - 252 - ], - [ - 1380, - 252 - ] - ], - "text": "0012.00________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -1665,8 +363,9 @@ "x": 87.5034, "y": 259.46173 }, + "cells": null, "confidence": 0.73177606, - "id": "24418dc8-6b9d-4491-ad3f-7d3778448e12", + "id": "29afd06a-ec4c-45e3-a04a-c87002688cf1", "page": { "height": 2200, "pageIndex": 0, @@ -1703,8 +402,9 @@ "x": 87.0855, "y": 302.46182 }, + "cells": null, "confidence": 0.71601045, - "id": "f18ef0f5-3d8b-4062-aa9e-e297247523f1", + "id": "ce633ac8-6518-417b-a859-446a3654e7d6", "page": { "height": 2200, "pageIndex": 0, @@ -1741,8 +441,9 @@ "x": 88.393265, "y": 334.9407 }, + "cells": null, "confidence": 0.6519315, - "id": "af662016-5959-40e8-a896-47adbf36be38", + "id": "caf50ef0-9556-47c4-b8c3-2345bc82e4ab", "page": { "height": 2200, "pageIndex": 0, @@ -1779,8 +480,9 @@ "x": 88, "y": 297 }, + "cells": null, "confidence": 0.70216876, - "id": "1b5e7d81-7c4e-4a55-9f21-30767eaf0fb1", + "id": "7112d322-4892-44af-8ccf-2896caadb415", "page": { "height": 2200, "pageIndex": 0, @@ -1808,485 +510,7 @@ "readingOrder": 13, "role": "CheckboxSelected", "text": "Property rights appraised 4 ❐ Fee Simple ❐ Leasehold Project Type ❐ PUD ❐ Condominium HOA$__________ /mo", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 94, - "x": 88, - "y": 302 - }, - "confidence": 1, - "points": [ - [ - 88, - 302 - ], - [ - 182, - 302 - ], - [ - 182, - 329 - ], - [ - 88, - 329 - ] - ], - "text": "Property" - }, - { - "bounds": { - "height": 27, - "width": 63, - "x": 188, - "y": 302 - }, - "confidence": 1, - "points": [ - [ - 188, - 302 - ], - [ - 251, - 302 - ], - [ - 251, - 329 - ], - [ - 188, - 329 - ] - ], - "text": "rights" - }, - { - "bounds": { - "height": 27, - "width": 108, - "x": 258, - "y": 302 - }, - "confidence": 1, - "points": [ - [ - 258, - 302 - ], - [ - 366, - 302 - ], - [ - 366, - 329 - ], - [ - 258, - 329 - ] - ], - "text": "appraised" - }, - { - "bounds": { - "height": 13, - "width": 13, - "x": 391, - "y": 300 - }, - "confidence": 1, - "points": [ - [ - 391, - 300 - ], - [ - 404, - 300 - ], - [ - 404, - 313 - ], - [ - 391, - 313 - ] - ], - "text": "4" - }, - { - "bounds": { - "height": 27, - "width": 25, - "x": 388, - "y": 297 - }, - "confidence": 1, - "points": [ - [ - 388, - 297 - ], - [ - 413, - 297 - ], - [ - 413, - 324 - ], - [ - 388, - 324 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 424, - "y": 302 - }, - "confidence": 1, - "points": [ - [ - 424, - 302 - ], - [ - 465, - 302 - ], - [ - 465, - 324 - ], - [ - 424, - 324 - ] - ], - "text": "Fee" - }, - { - "bounds": { - "height": 27, - "width": 77, - "x": 472, - "y": 302 - }, - "confidence": 1, - "points": [ - [ - 472, - 302 - ], - [ - 549, - 302 - ], - [ - 549, - 329 - ], - [ - 472, - 329 - ] - ], - "text": "Simple" - }, - { - "bounds": { - "height": 27, - "width": 25, - "x": 569, - "y": 297 - }, - "confidence": 1, - "points": [ - [ - 569, - 297 - ], - [ - 594, - 297 - ], - [ - 594, - 324 - ], - [ - 569, - 324 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 113, - "x": 605, - "y": 302 - }, - "confidence": 1, - "points": [ - [ - 605, - 302 - ], - [ - 718, - 302 - ], - [ - 718, - 324 - ], - [ - 605, - 324 - ] - ], - "text": "Leasehold" - }, - { - "bounds": { - "height": 27, - "width": 77, - "x": 783, - "y": 302 - }, - "confidence": 1, - "points": [ - [ - 783, - 302 - ], - [ - 860, - 302 - ], - [ - 860, - 329 - ], - [ - 783, - 329 - ] - ], - "text": "Project" - }, - { - "bounds": { - "height": 27, - "width": 52, - "x": 863, - "y": 302 - }, - "confidence": 1, - "points": [ - [ - 863, - 302 - ], - [ - 915, - 302 - ], - [ - 915, - 329 - ], - [ - 863, - 329 - ] - ], - "text": "Type" - }, - { - "bounds": { - "height": 27, - "width": 27, - "x": 938, - "y": 297 - }, - "confidence": 1, - "points": [ - [ - 938, - 297 - ], - [ - 965, - 297 - ], - [ - 965, - 324 - ], - [ - 938, - 324 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 52, - "x": 974, - "y": 302 - }, - "confidence": 1, - "points": [ - [ - 974, - 302 - ], - [ - 1026, - 302 - ], - [ - 1026, - 324 - ], - [ - 974, - 324 - ] - ], - "text": "PUD" - }, - { - "bounds": { - "height": 27, - "width": 25, - "x": 1047, - "y": 297 - }, - "confidence": 1, - "points": [ - [ - 1047, - 297 - ], - [ - 1072, - 297 - ], - [ - 1072, - 324 - ], - [ - 1047, - 324 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 152, - "x": 1083, - "y": 302 - }, - "confidence": 1, - "points": [ - [ - 1083, - 302 - ], - [ - 1235, - 302 - ], - [ - 1235, - 324 - ], - [ - 1083, - 324 - ] - ], - "text": "Condominium" - }, - { - "bounds": { - "height": 25, - "width": 211, - "x": 1327, - "y": 302 - }, - "confidence": 1, - "points": [ - [ - 1327, - 302 - ], - [ - 1538, - 302 - ], - [ - 1538, - 327 - ], - [ - 1327, - 327 - ] - ], - "text": "HOA$__________" - }, - { - "bounds": { - "height": 22, - "width": 44, - "x": 1541, - "y": 302 - }, - "confidence": 1, - "points": [ - [ - 1541, - 302 - ], - [ - 1585, - 302 - ], - [ - 1585, - 324 - ], - [ - 1541, - 324 - ] - ], - "text": "/mo" - } - ] + "type": "paragraph" }, { "bounds": { @@ -2295,8 +519,9 @@ "x": 356.27908, "y": 334.63983 }, + "cells": null, "confidence": 0.5092468, - "id": "0f34a03b-9736-4de6-9a27-fd24d9b7ca1f", + "id": "2a047132-9b60-4144-af85-1bf1105aaae9", "page": { "height": 2200, "pageIndex": 0, @@ -2333,8 +558,9 @@ "x": 87.74953, "y": 365.38895 }, + "cells": null, "confidence": 0.7707116, - "id": "631933dd-4575-4e6b-832d-2fcf5104866a", + "id": "b9aebe32-9338-496e-af8b-49e1d8b985c1", "page": { "height": 2200, "pageIndex": 0, @@ -2371,8 +597,9 @@ "x": 86.35928, "y": 397.1936 }, + "cells": null, "confidence": 0.70279366, - "id": "7bbf6e90-6919-45d4-b44d-65f7e8ce2b58", + "id": "d57543f2-3f4b-432e-97cb-3f72acf722b1", "page": { "height": 2200, "pageIndex": 0, @@ -2409,8 +636,9 @@ "x": 88, "y": 449 }, + "cells": null, "confidence": 0.76999295, - "id": "77212251-5237-465a-9664-d432e52f6854", + "id": "83057ad2-20b1-4d78-bb33-e3c58a89eb61", "page": { "height": 2200, "pageIndex": 0, @@ -2438,37 +666,7 @@ "readingOrder": 17, "role": "Text", "text": "Location", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 86, - "x": 88, - "y": 449 - }, - "confidence": 1, - "points": [ - [ - 88, - 449 - ], - [ - 174, - 449 - ], - [ - 174, - 468 - ], - [ - 88, - 468 - ] - ], - "text": "Location" - } - ] + "type": "paragraph" }, { "bounds": { @@ -2477,8 +675,9 @@ "x": 88, "y": 482.69095 }, + "cells": null, "confidence": 0.73965394, - "id": "5b3c9a79-162c-490c-9e47-876a0589ade5", + "id": "9310bd3f-2f8c-4908-a6ab-17946eddf042", "page": { "height": 2200, "pageIndex": 0, @@ -2506,65 +705,7 @@ "readingOrder": 18, "role": "Text", "text": "Built up", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 44, - "x": 88, - "y": 483 - }, - "confidence": 1, - "points": [ - [ - 88, - 483 - ], - [ - 132, - 483 - ], - [ - 132, - 502 - ], - [ - 88, - 502 - ] - ], - "text": "Built" - }, - { - "bounds": { - "height": 19, - "width": 25, - "x": 138, - "y": 488 - }, - "confidence": 1, - "points": [ - [ - 138, - 488 - ], - [ - 163, - 488 - ], - [ - 163, - 507 - ], - [ - 138, - 507 - ] - ], - "text": "up" - } - ] + "type": "paragraph" }, { "bounds": { @@ -2573,8 +714,9 @@ "x": 88, "y": 515.6182 }, + "cells": null, "confidence": 0.7750601, - "id": "d2ca820b-a938-4953-bdbd-e4a898f2ad94", + "id": "2a9e3547-2da5-4dcb-810a-a11977ae31fa", "page": { "height": 2200, "pageIndex": 0, @@ -2602,65 +744,7 @@ "readingOrder": 19, "role": "Text", "text": "Growth rate", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 72, - "x": 88, - "y": 516 - }, - "confidence": 1, - "points": [ - [ - 88, - 516 - ], - [ - 160, - 516 - ], - [ - 160, - 535 - ], - [ - 88, - 535 - ] - ], - "text": "Growth" - }, - { - "bounds": { - "height": 16, - "width": 38, - "x": 172, - "y": 519 - }, - "confidence": 1, - "points": [ - [ - 172, - 519 - ], - [ - 210, - 519 - ], - [ - 210, - 535 - ], - [ - 172, - 535 - ] - ], - "text": "rate" - } - ] + "type": "paragraph" }, { "bounds": { @@ -2669,8 +753,9 @@ "x": 88, "y": 548.4025 }, + "cells": null, "confidence": 0.79868084, - "id": "943524a7-b215-4193-a038-5a1f21b7d746", + "id": "778c556b-a2d7-44c8-be72-767b38e716bb", "page": { "height": 2200, "pageIndex": 0, @@ -2698,65 +783,7 @@ "readingOrder": 20, "role": "Text", "text": "Property Values", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 86, - "x": 88, - "y": 550 - }, - "confidence": 1, - "points": [ - [ - 88, - 550 - ], - [ - 174, - 550 - ], - [ - 174, - 575 - ], - [ - 88, - 575 - ] - ], - "text": "Property" - }, - { - "bounds": { - "height": 19, - "width": 66, - "x": 180, - "y": 550 - }, - "confidence": 1, - "points": [ - [ - 180, - 550 - ], - [ - 246, - 550 - ], - [ - 246, - 569 - ], - [ - 180, - 569 - ] - ], - "text": "Values" - } - ] + "type": "paragraph" }, { "bounds": { @@ -2765,8 +792,9 @@ "x": 88, "y": 583 }, + "cells": null, "confidence": 0.83080953, - "id": "c3b71044-b40d-4583-bf44-2540cd0bf2e5", + "id": "ff2e78b6-86c4-4621-8bed-03dc690c0c46", "page": { "height": 2200, "pageIndex": 0, @@ -2794,37 +822,7 @@ "readingOrder": 21, "role": "Text", "text": "Demand/Supply", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 161, - "x": 88, - "y": 583 - }, - "confidence": 1, - "points": [ - [ - 88, - 583 - ], - [ - 249, - 583 - ], - [ - 249, - 608 - ], - [ - 88, - 608 - ] - ], - "text": "Demand/Supply" - } - ] + "type": "paragraph" }, { "bounds": { @@ -2833,8 +831,9 @@ "x": 88, "y": 615.40735 }, + "cells": null, "confidence": 0.85416514, - "id": "1070f227-7518-4781-b405-cab2d054992d", + "id": "98bd0c22-2785-44ea-a1ed-7123f480dcea", "page": { "height": 2200, "pageIndex": 0, @@ -2862,65 +861,7 @@ "readingOrder": 22, "role": "Text", "text": "Marketing time", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 97, - "x": 88, - "y": 616 - }, - "confidence": 1, - "points": [ - [ - 88, - 616 - ], - [ - 185, - 616 - ], - [ - 185, - 641 - ], - [ - 88, - 641 - ] - ], - "text": "Marketing" - }, - { - "bounds": { - "height": 19, - "width": 44, - "x": 194, - "y": 616 - }, - "confidence": 1, - "points": [ - [ - 194, - 616 - ], - [ - 238, - 616 - ], - [ - 238, - 635 - ], - [ - 194, - 635 - ] - ], - "text": "time" - } - ] + "type": "paragraph" }, { "bounds": { @@ -2929,8 +870,9 @@ "x": 282.14676, "y": 446.6327 }, + "cells": null, "confidence": 0.8326646, - "id": "3dbc5b48-7daf-4caf-be53-02a6eb00c81e", + "id": "0b83d996-3351-4257-a6b4-4f7663a14fe2", "page": { "height": 2200, "pageIndex": 0, @@ -2958,65 +900,7 @@ "readingOrder": 23, "role": "CheckboxUnselected", "text": "❐ Urban", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 22, - "x": 283, - "y": 447 - }, - "confidence": 1, - "points": [ - [ - 283, - 447 - ], - [ - 305, - 447 - ], - [ - 305, - 469 - ], - [ - 283, - 469 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 61, - "x": 313, - "y": 449 - }, - "confidence": 1, - "points": [ - [ - 313, - 449 - ], - [ - 374, - 449 - ], - [ - 374, - 468 - ], - [ - 313, - 468 - ] - ], - "text": "Urban" - } - ] + "type": "paragraph" }, { "bounds": { @@ -3025,8 +909,9 @@ "x": 282.16977, "y": 479.66013 }, + "cells": null, "confidence": 0.8462913, - "id": "5dfa5b2d-79d8-4c0f-9c05-e020dbb5c6ce", + "id": "3f98758b-2b04-43e9-9cd5-2ad2527d4582", "page": { "height": 2200, "pageIndex": 0, @@ -3054,93 +939,7 @@ "readingOrder": 24, "role": "CheckboxUnselected", "text": "❐ Over 75%", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 22, - "x": 283, - "y": 480 - }, - "confidence": 1, - "points": [ - [ - 283, - 480 - ], - [ - 305, - 480 - ], - [ - 305, - 502 - ], - [ - 283, - 502 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 50, - "x": 313, - "y": 483 - }, - "confidence": 1, - "points": [ - [ - 313, - 483 - ], - [ - 363, - 483 - ], - [ - 363, - 502 - ], - [ - 313, - 502 - ] - ], - "text": "Over" - }, - { - "bounds": { - "height": 19, - "width": 44, - "x": 372, - "y": 483 - }, - "confidence": 1, - "points": [ - [ - 372, - 483 - ], - [ - 416, - 483 - ], - [ - 416, - 502 - ], - [ - 372, - 502 - ] - ], - "text": "75%" - } - ] + "type": "paragraph" }, { "bounds": { @@ -3149,8 +948,9 @@ "x": 281.59253, "y": 512.81854 }, + "cells": null, "confidence": 0.8381685, - "id": "2725790a-b3df-4069-816e-3d1777b741b0", + "id": "ed68dcb5-dac4-436b-a340-fc6429a5918c", "page": { "height": 2200, "pageIndex": 0, @@ -3178,65 +978,7 @@ "readingOrder": 25, "role": "CheckboxUnselected", "text": "❐ Rapid", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 22, - "x": 283, - "y": 513 - }, - "confidence": 1, - "points": [ - [ - 283, - 513 - ], - [ - 305, - 513 - ], - [ - 305, - 535 - ], - [ - 283, - 535 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 25, - "width": 55, - "x": 313, - "y": 516 - }, - "confidence": 1, - "points": [ - [ - 313, - 516 - ], - [ - 368, - 516 - ], - [ - 368, - 541 - ], - [ - 313, - 541 - ] - ], - "text": "Rapid" - } - ] + "type": "paragraph" }, { "bounds": { @@ -3245,8 +987,9 @@ "x": 281.29663, "y": 546.98035 }, + "cells": null, "confidence": 0.8211604, - "id": "ae527db2-507f-4e8f-8fdd-25bb5f928554", + "id": "852dd111-3dc0-470e-b045-a82b10ebdcbd", "page": { "height": 2200, "pageIndex": 0, @@ -3274,65 +1017,7 @@ "readingOrder": 26, "role": "CheckboxUnselected", "text": "❐ Increasing", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 22, - "x": 283, - "y": 547 - }, - "confidence": 1, - "points": [ - [ - 283, - 547 - ], - [ - 305, - 547 - ], - [ - 305, - 569 - ], - [ - 283, - 569 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 25, - "width": 102, - "x": 316, - "y": 550 - }, - "confidence": 1, - "points": [ - [ - 316, - 550 - ], - [ - 418, - 550 - ], - [ - 418, - 575 - ], - [ - 316, - 575 - ] - ], - "text": "Increasing" - } - ] + "type": "paragraph" }, { "bounds": { @@ -3341,8 +1026,9 @@ "x": 281.96024, "y": 580 }, + "cells": null, "confidence": 0.828138, - "id": "8374898a-2e4d-46fe-b09b-7e6ce8034d1a", + "id": "e1acdbe6-270c-4fa5-8d10-d7320c1117bd", "page": { "height": 2200, "pageIndex": 0, @@ -3370,65 +1056,7 @@ "readingOrder": 27, "role": "CheckboxUnselected", "text": "❐ Shortage", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 22, - "x": 283, - "y": 580 - }, - "confidence": 1, - "points": [ - [ - 283, - 580 - ], - [ - 305, - 580 - ], - [ - 305, - 602 - ], - [ - 283, - 602 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 25, - "width": 91, - "x": 313, - "y": 583 - }, - "confidence": 1, - "points": [ - [ - 313, - 583 - ], - [ - 404, - 583 - ], - [ - 404, - 608 - ], - [ - 313, - 608 - ] - ], - "text": "Shortage" - } - ] + "type": "paragraph" }, { "bounds": { @@ -3437,8 +1065,9 @@ "x": 282.1698, "y": 613 }, + "cells": null, "confidence": 0.7924792, - "id": "1f24b6f6-78ce-43cc-ad31-d984e757ba96", + "id": "e72e187b-5ac5-45ee-aea6-332b0415d477", "page": { "height": 2200, "pageIndex": 0, @@ -3466,121 +1095,7 @@ "readingOrder": 28, "role": "CheckboxUnselected", "text": "❐ Under 3 mos.", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 22, - "x": 283, - "y": 613 - }, - "confidence": 1, - "points": [ - [ - 283, - 613 - ], - [ - 305, - 613 - ], - [ - 305, - 635 - ], - [ - 283, - 635 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 61, - "x": 313, - "y": 616 - }, - "confidence": 1, - "points": [ - [ - 313, - 616 - ], - [ - 374, - 616 - ], - [ - 374, - 635 - ], - [ - 313, - 635 - ] - ], - "text": "Under" - }, - { - "bounds": { - "height": 19, - "width": 13, - "x": 380, - "y": 616 - }, - "confidence": 1, - "points": [ - [ - 380, - 616 - ], - [ - 393, - 616 - ], - [ - 393, - 635 - ], - [ - 380, - 635 - ] - ], - "text": "3" - }, - { - "bounds": { - "height": 13, - "width": 47, - "x": 402, - "y": 622 - }, - "confidence": 1, - "points": [ - [ - 402, - 622 - ], - [ - 449, - 622 - ], - [ - 449, - 635 - ], - [ - 402, - 635 - ] - ], - "text": "mos." - } - ] + "type": "paragraph" }, { "bounds": { @@ -3589,8 +1104,9 @@ "x": 86, "y": 686 }, + "cells": null, "confidence": 0.76488626, - "id": "f0b1f269-ad98-416b-8e4e-cb5d6ff526e6", + "id": "8db920ac-eedf-457b-99b6-e34a415b6b0f", "page": { "height": 2200, "pageIndex": 0, @@ -3618,317 +1134,7 @@ "readingOrder": 29, "role": "Text", "text": "Typical 2-4 family bldg. Present land use % Land use change", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 77, - "x": 86, - "y": 686 - }, - "confidence": 1, - "points": [ - [ - 86, - 686 - ], - [ - 163, - 686 - ], - [ - 163, - 713 - ], - [ - 86, - 713 - ] - ], - "text": "Typical" - }, - { - "bounds": { - "height": 22, - "width": 38, - "x": 169, - "y": 686 - }, - "confidence": 1, - "points": [ - [ - 169, - 686 - ], - [ - 207, - 686 - ], - [ - 207, - 708 - ], - [ - 169, - 708 - ] - ], - "text": "2-4" - }, - { - "bounds": { - "height": 27, - "width": 66, - "x": 213, - "y": 686 - }, - "confidence": 1, - "points": [ - [ - 213, - 686 - ], - [ - 279, - 686 - ], - [ - 279, - 713 - ], - [ - 213, - 713 - ] - ], - "text": "family" - }, - { - "bounds": { - "height": 27, - "width": 52, - "x": 288, - "y": 686 - }, - "confidence": 1, - "points": [ - [ - 288, - 686 - ], - [ - 340, - 686 - ], - [ - 340, - 713 - ], - [ - 288, - 713 - ] - ], - "text": "bldg." - }, - { - "bounds": { - "height": 22, - "width": 86, - "x": 1097, - "y": 686 - }, - "confidence": 1, - "points": [ - [ - 1097, - 686 - ], - [ - 1183, - 686 - ], - [ - 1183, - 708 - ], - [ - 1097, - 708 - ] - ], - "text": "Present" - }, - { - "bounds": { - "height": 22, - "width": 47, - "x": 1191, - "y": 686 - }, - "confidence": 1, - "points": [ - [ - 1191, - 686 - ], - [ - 1238, - 686 - ], - [ - 1238, - 708 - ], - [ - 1191, - 708 - ] - ], - "text": "land" - }, - { - "bounds": { - "height": 16, - "width": 41, - "x": 1247, - "y": 691 - }, - "confidence": 1, - "points": [ - [ - 1247, - 691 - ], - [ - 1288, - 691 - ], - [ - 1288, - 707 - ], - [ - 1247, - 707 - ] - ], - "text": "use" - }, - { - "bounds": { - "height": 19, - "width": 25, - "x": 1294, - "y": 688 - }, - "confidence": 1, - "points": [ - [ - 1294, - 688 - ], - [ - 1319, - 688 - ], - [ - 1319, - 707 - ], - [ - 1294, - 707 - ] - ], - "text": "%" - }, - { - "bounds": { - "height": 22, - "width": 52, - "x": 1413, - "y": 686 - }, - "confidence": 1, - "points": [ - [ - 1413, - 686 - ], - [ - 1465, - 686 - ], - [ - 1465, - 708 - ], - [ - 1413, - 708 - ] - ], - "text": "Land" - }, - { - "bounds": { - "height": 16, - "width": 41, - "x": 1477, - "y": 691 - }, - "confidence": 1, - "points": [ - [ - 1477, - 691 - ], - [ - 1518, - 691 - ], - [ - 1518, - 707 - ], - [ - 1477, - 707 - ] - ], - "text": "use" - }, - { - "bounds": { - "height": 27, - "width": 83, - "x": 1527, - "y": 686 - }, - "confidence": 1, - "points": [ - [ - 1527, - 686 - ], - [ - 1610, - 686 - ], - [ - 1610, - 713 - ], - [ - 1527, - 713 - ] - ], - "text": "change" - } - ] + "type": "paragraph" }, { "bounds": { @@ -3937,8 +1143,9 @@ "x": 86, "y": 716 }, + "cells": null, "confidence": 0.68334365, - "id": "ff64d4e5-17b6-4981-8fa4-ca59a8dbad05", + "id": "9cfe2be7-10eb-42f7-a498-355cff21cecb", "page": { "height": 2200, "pageIndex": 0, @@ -3966,401 +1173,7 @@ "readingOrder": 30, "role": "Text", "text": "Typical rent $ 950 ________ 4 ❐ Stable ❐ Declining One family ❐ Likely", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 77, - "x": 86, - "y": 716 - }, - "confidence": 1, - "points": [ - [ - 86, - 716 - ], - [ - 163, - 716 - ], - [ - 163, - 743 - ], - [ - 86, - 743 - ] - ], - "text": "Typical" - }, - { - "bounds": { - "height": 19, - "width": 44, - "x": 172, - "y": 719 - }, - "confidence": 1, - "points": [ - [ - 172, - 719 - ], - [ - 216, - 719 - ], - [ - 216, - 738 - ], - [ - 172, - 738 - ] - ], - "text": "rent" - }, - { - "bounds": { - "height": 25, - "width": 16, - "x": 222, - "y": 716 - }, - "confidence": 1, - "points": [ - [ - 222, - 716 - ], - [ - 238, - 716 - ], - [ - 238, - 741 - ], - [ - 222, - 741 - ] - ], - "text": "$" - }, - { - "bounds": { - "height": 16, - "width": 30, - "x": 244, - "y": 722 - }, - "confidence": 1, - "points": [ - [ - 244, - 722 - ], - [ - 274, - 722 - ], - [ - 274, - 738 - ], - [ - 244, - 738 - ] - ], - "text": "950" - }, - { - "bounds": { - "height": 2, - "width": 116, - "x": 241, - "y": 738 - }, - "confidence": 1, - "points": [ - [ - 241, - 738 - ], - [ - 357, - 738 - ], - [ - 357, - 740 - ], - [ - 241, - 740 - ] - ], - "text": "________" - }, - { - "bounds": { - "height": 13, - "width": 13, - "x": 677, - "y": 719 - }, - "confidence": 1, - "points": [ - [ - 677, - 719 - ], - [ - 690, - 719 - ], - [ - 690, - 732 - ], - [ - 677, - 732 - ] - ], - "text": "4" - }, - { - "bounds": { - "height": 22, - "width": 19, - "x": 677, - "y": 716 - }, - "confidence": 1, - "points": [ - [ - 677, - 716 - ], - [ - 696, - 716 - ], - [ - 696, - 738 - ], - [ - 677, - 738 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 72, - "x": 702, - "y": 716 - }, - "confidence": 1, - "points": [ - [ - 702, - 716 - ], - [ - 774, - 716 - ], - [ - 774, - 738 - ], - [ - 702, - 738 - ] - ], - "text": "Stable" - }, - { - "bounds": { - "height": 22, - "width": 19, - "x": 788, - "y": 716 - }, - "confidence": 1, - "points": [ - [ - 788, - 716 - ], - [ - 807, - 716 - ], - [ - 807, - 738 - ], - [ - 788, - 738 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 27, - "width": 102, - "x": 816, - "y": 716 - }, - "confidence": 1, - "points": [ - [ - 816, - 716 - ], - [ - 918, - 716 - ], - [ - 918, - 743 - ], - [ - 816, - 743 - ] - ], - "text": "Declining" - }, - { - "bounds": { - "height": 22, - "width": 47, - "x": 1094, - "y": 716 - }, - "confidence": 1, - "points": [ - [ - 1094, - 716 - ], - [ - 1141, - 716 - ], - [ - 1141, - 738 - ], - [ - 1094, - 738 - ] - ], - "text": "One" - }, - { - "bounds": { - "height": 27, - "width": 66, - "x": 1147, - "y": 716 - }, - "confidence": 1, - "points": [ - [ - 1147, - 716 - ], - [ - 1213, - 716 - ], - [ - 1213, - 743 - ], - [ - 1147, - 743 - ] - ], - "text": "family" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 1525, - "y": 716 - }, - "confidence": 1, - "points": [ - [ - 1525, - 716 - ], - [ - 1547, - 716 - ], - [ - 1547, - 738 - ], - [ - 1525, - 738 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 27, - "width": 63, - "x": 1552, - "y": 716 - }, - "confidence": 1, - "points": [ - [ - 1552, - 716 - ], - [ - 1615, - 716 - ], - [ - 1615, - 743 - ], - [ - 1552, - 743 - ] - ], - "text": "Likely" - } - ] + "type": "paragraph" }, { "bounds": { @@ -4369,8 +1182,9 @@ "x": 88, "y": 747 }, + "cells": null, "confidence": 0.6851993, - "id": "19b3455a-bb31-427d-a73a-81d93119282a", + "id": "d3c44611-ec86-41a0-955f-a4999011cea0", "page": { "height": 2200, "pageIndex": 0, @@ -4398,401 +1212,7 @@ "readingOrder": 31, "role": "Text", "text": "Est. neighborhood apt. vacancy 4____ % ❐ Declining 2-4 family ❐ In process to:", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 41, - "x": 88, - "y": 747 - }, - "confidence": 1, - "points": [ - [ - 88, - 747 - ], - [ - 129, - 747 - ], - [ - 129, - 769 - ], - [ - 88, - 769 - ] - ], - "text": "Est." - }, - { - "bounds": { - "height": 25, - "width": 152, - "x": 138, - "y": 747 - }, - "confidence": 1, - "points": [ - [ - 138, - 747 - ], - [ - 290, - 747 - ], - [ - 290, - 772 - ], - [ - 138, - 772 - ] - ], - "text": "neighborhood" - }, - { - "bounds": { - "height": 25, - "width": 41, - "x": 297, - "y": 747 - }, - "confidence": 1, - "points": [ - [ - 297, - 747 - ], - [ - 338, - 747 - ], - [ - 338, - 772 - ], - [ - 297, - 772 - ] - ], - "text": "apt." - }, - { - "bounds": { - "height": 19, - "width": 94, - "x": 347, - "y": 752 - }, - "confidence": 1, - "points": [ - [ - 347, - 752 - ], - [ - 441, - 752 - ], - [ - 441, - 771 - ], - [ - 347, - 771 - ] - ], - "text": "vacancy" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 449, - "y": 750 - }, - "confidence": 1, - "points": [ - [ - 449, - 750 - ], - [ - 510, - 750 - ], - [ - 510, - 772 - ], - [ - 449, - 772 - ] - ], - "text": "4____" - }, - { - "bounds": { - "height": 22, - "width": 25, - "x": 511, - "y": 747 - }, - "confidence": 1, - "points": [ - [ - 511, - 747 - ], - [ - 536, - 747 - ], - [ - 536, - 769 - ], - [ - 511, - 769 - ] - ], - "text": "%" - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 797, - "y": 747 - }, - "confidence": 1, - "points": [ - [ - 797, - 747 - ], - [ - 819, - 747 - ], - [ - 819, - 766 - ], - [ - 797, - 766 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 25, - "width": 100, - "x": 827, - "y": 747 - }, - "confidence": 1, - "points": [ - [ - 827, - 747 - ], - [ - 927, - 747 - ], - [ - 927, - 772 - ], - [ - 827, - 772 - ] - ], - "text": "Declining" - }, - { - "bounds": { - "height": 19, - "width": 38, - "x": 1100, - "y": 747 - }, - "confidence": 1, - "points": [ - [ - 1100, - 747 - ], - [ - 1138, - 747 - ], - [ - 1138, - 766 - ], - [ - 1100, - 766 - ] - ], - "text": "2-4" - }, - { - "bounds": { - "height": 25, - "width": 66, - "x": 1144, - "y": 747 - }, - "confidence": 1, - "points": [ - [ - 1144, - 747 - ], - [ - 1210, - 747 - ], - [ - 1210, - 772 - ], - [ - 1144, - 772 - ] - ], - "text": "family" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1375, - "y": 747 - }, - "confidence": 1, - "points": [ - [ - 1375, - 747 - ], - [ - 1394, - 747 - ], - [ - 1394, - 766 - ], - [ - 1375, - 766 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1402, - "y": 747 - }, - "confidence": 1, - "points": [ - [ - 1402, - 747 - ], - [ - 1421, - 747 - ], - [ - 1421, - 766 - ], - [ - 1402, - 766 - ] - ], - "text": "In" - }, - { - "bounds": { - "height": 19, - "width": 88, - "x": 1427, - "y": 752 - }, - "confidence": 1, - "points": [ - [ - 1427, - 752 - ], - [ - 1515, - 752 - ], - [ - 1515, - 771 - ], - [ - 1427, - 771 - ] - ], - "text": "process" - }, - { - "bounds": { - "height": 22, - "width": 27, - "x": 1522, - "y": 747 - }, - "confidence": 1, - "points": [ - [ - 1522, - 747 - ], - [ - 1549, - 747 - ], - [ - 1549, - 769 - ], - [ - 1522, - 769 - ] - ], - "text": "to:" - } - ] + "type": "paragraph" }, { "bounds": { @@ -4801,8 +1221,9 @@ "x": 88.36274, "y": 777.1145 }, + "cells": null, "confidence": 0.52131695, - "id": "4512f91d-c6c1-4ae1-a469-e1b95affa159", + "id": "305039a5-48c1-42a5-bd9d-4b67c2410c84", "page": { "height": 2200, "pageIndex": 0, @@ -4839,8 +1260,9 @@ "x": 411.36584, "y": 776.18964 }, + "cells": null, "confidence": 0.7957097, - "id": "6dfcac58-0dba-45b7-b7ea-265331961e18", + "id": "ed0a0a26-293b-4478-aec8-a1786c65b71f", "page": { "height": 2200, "pageIndex": 0, @@ -4877,8 +1299,9 @@ "x": 818.4954, "y": 131.75447 }, + "cells": null, "confidence": 0.8956052, - "id": "427c0bd1-db02-47ed-b5bb-fbc833587d7b", + "id": "c14811be-6ec1-4a56-8e42-6fb7153bc5b8", "page": { "height": 2200, "pageIndex": 0, @@ -4915,8 +1338,9 @@ "x": 861.63184, "y": 192.64 }, + "cells": null, "confidence": 0.74128765, - "id": "74f8a59e-accc-4068-b15c-7f3e3550ed30", + "id": "d2771e8f-79ab-4810-9514-4fbe9afcb6ed", "page": { "height": 2200, "pageIndex": 0, @@ -4953,8 +1377,9 @@ "x": 862.10486, "y": 225.16203 }, + "cells": null, "confidence": 0.8326281, - "id": "8e43752d-936d-479c-b5b0-c9d44e26292e", + "id": "d9d5af94-5234-4452-a608-15a457f26df5", "page": { "height": 2200, "pageIndex": 0, @@ -4991,8 +1416,9 @@ "x": 88, "y": 258 }, + "cells": null, "confidence": 0.8332931, - "id": "2a3339b5-1ebd-4f06-af1f-b4bc66c572f6", + "id": "d01e2c1d-00ad-406f-bc23-b767911a3adf", "page": { "height": 2200, "pageIndex": 0, @@ -5020,345 +1446,7 @@ "readingOrder": 37, "role": "Text", "text": "Borrower Ashford Robert____________________________ Current Owner Ashford Robert________________________ Occupant ❐ Owner ❐ Vacant", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 102, - "x": 88, - "y": 263 - }, - "confidence": 1, - "points": [ - [ - 88, - 263 - ], - [ - 190, - 263 - ], - [ - 190, - 285 - ], - [ - 88, - 285 - ] - ], - "text": "Borrower" - }, - { - "bounds": { - "height": 19, - "width": 80, - "x": 275, - "y": 261 - }, - "confidence": 1, - "points": [ - [ - 275, - 261 - ], - [ - 355, - 261 - ], - [ - 355, - 280 - ], - [ - 275, - 280 - ] - ], - "text": "Ashford" - }, - { - "bounds": { - "height": 27, - "width": 394, - "x": 200, - "y": 261 - }, - "confidence": 1, - "points": [ - [ - 200, - 261 - ], - [ - 594, - 261 - ], - [ - 594, - 288 - ], - [ - 200, - 288 - ] - ], - "text": "Robert____________________________" - }, - { - "bounds": { - "height": 22, - "width": 83, - "x": 600, - "y": 263 - }, - "confidence": 1, - "points": [ - [ - 600, - 263 - ], - [ - 683, - 263 - ], - [ - 683, - 285 - ], - [ - 600, - 285 - ] - ], - "text": "Current" - }, - { - "bounds": { - "height": 22, - "width": 75, - "x": 691, - "y": 263 - }, - "confidence": 1, - "points": [ - [ - 691, - 263 - ], - [ - 766, - 263 - ], - [ - 766, - 285 - ], - [ - 691, - 285 - ] - ], - "text": "Owner" - }, - { - "bounds": { - "height": 19, - "width": 80, - "x": 844, - "y": 263 - }, - "confidence": 1, - "points": [ - [ - 844, - 263 - ], - [ - 924, - 263 - ], - [ - 924, - 282 - ], - [ - 844, - 282 - ] - ], - "text": "Ashford" - }, - { - "bounds": { - "height": 25, - "width": 338, - "x": 769, - "y": 263 - }, - "confidence": 1, - "points": [ - [ - 769, - 263 - ], - [ - 1107, - 263 - ], - [ - 1107, - 288 - ], - [ - 769, - 288 - ] - ], - "text": "Robert________________________" - }, - { - "bounds": { - "height": 25, - "width": 108, - "x": 1119, - "y": 263 - }, - "confidence": 1, - "points": [ - [ - 1119, - 263 - ], - [ - 1227, - 263 - ], - [ - 1227, - 288 - ], - [ - 1119, - 288 - ] - ], - "text": "Occupant" - }, - { - "bounds": { - "height": 25, - "width": 25, - "x": 1244, - "y": 258 - }, - "confidence": 1, - "points": [ - [ - 1244, - 258 - ], - [ - 1269, - 258 - ], - [ - 1269, - 283 - ], - [ - 1244, - 283 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 75, - "x": 1277, - "y": 263 - }, - "confidence": 1, - "points": [ - [ - 1277, - 263 - ], - [ - 1352, - 263 - ], - [ - 1352, - 285 - ], - [ - 1277, - 285 - ] - ], - "text": "Owner" - }, - { - "bounds": { - "height": 25, - "width": 27, - "x": 1497, - "y": 258 - }, - "confidence": 1, - "points": [ - [ - 1497, - 258 - ], - [ - 1524, - 258 - ], - [ - 1524, - 283 - ], - [ - 1497, - 283 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 77, - "x": 1530, - "y": 263 - }, - "confidence": 1, - "points": [ - [ - 1530, - 263 - ], - [ - 1607, - 263 - ], - [ - 1607, - 285 - ], - [ - 1530, - 285 - ] - ], - "text": "Vacant" - } - ] + "type": "paragraph" }, { "bounds": { @@ -5367,8 +1455,9 @@ "x": 567.87854, "y": 299.79 }, + "cells": null, "confidence": 0.8279545, - "id": "fa242e10-2b09-4c91-870a-9a62ae946195", + "id": "5b82aede-6863-437b-be2f-0cb1145f5ff9", "page": { "height": 2200, "pageIndex": 0, @@ -5405,8 +1494,9 @@ "x": 781.0541, "y": 300.7975 }, + "cells": null, "confidence": 0.66929793, - "id": "6b84a1d0-34a2-426c-83b8-ad5928241c77", + "id": "9b3c3e7f-91b7-422b-869e-5a78a413b4c1", "page": { "height": 2200, "pageIndex": 0, @@ -5443,8 +1533,9 @@ "x": 1136.5096, "y": 135.01816 }, + "cells": null, "confidence": 0.86237174, - "id": "9e5227b3-b69f-49b2-83c8-577543527e74", + "id": "84c50581-79b0-4b70-9194-b7ea41a7be5c", "page": { "height": 2200, "pageIndex": 0, @@ -5481,8 +1572,9 @@ "x": 1136.4537, "y": 165.13635 }, + "cells": null, "confidence": 0.8311438, - "id": "161a3ad1-775b-4a59-b181-a427f7135001", + "id": "59da7aa6-b0ad-415f-bbb4-72fa9d5cd6cb", "page": { "height": 2200, "pageIndex": 0, @@ -5519,8 +1611,9 @@ "x": 1172.8058, "y": 193.48608 }, + "cells": null, "confidence": 0.8320459, - "id": "440486cb-f7c9-487e-b4e9-60f8b0aba13b", + "id": "b880de15-f72a-4e4b-a5af-05f9825d7481", "page": { "height": 2200, "pageIndex": 0, @@ -5557,8 +1650,9 @@ "x": 1224.8376, "y": 226.07741 }, + "cells": null, "confidence": 0.772318, - "id": "2688e921-b178-4ed3-a180-d6140804935c", + "id": "e6e08754-c132-48de-bbdc-be589a147b4a", "page": { "height": 2200, "pageIndex": 0, @@ -5595,8 +1689,9 @@ "x": 1117.9945, "y": 262.15036 }, + "cells": null, "confidence": 0.77650136, - "id": "9d10d7d4-43ae-4553-8f17-8bff872dbaf6", + "id": "f4d73314-69cd-4a88-8eeb-8795f1d730c4", "page": { "height": 2200, "pageIndex": 0, @@ -5633,8 +1728,9 @@ "x": 1047.7126, "y": 299.16302 }, + "cells": null, "confidence": 0.8087682, - "id": "c5a54ffe-56fc-4771-9d80-5a40c87034f5", + "id": "5ca43039-6c06-46a6-8f88-cb6a914f184d", "page": { "height": 2200, "pageIndex": 0, @@ -5671,8 +1767,9 @@ "x": 938.27405, "y": 298.23392 }, + "cells": null, "confidence": 0.78730553, - "id": "5ef0da62-8c8a-4137-8602-13a1898b1041", + "id": "0c517698-6452-433a-8500-9d0c563967d3", "page": { "height": 2200, "pageIndex": 0, @@ -5709,8 +1806,9 @@ "x": 1245.3245, "y": 257.4391 }, + "cells": null, "confidence": 0.8187224, - "id": "79bc9472-a733-4165-acac-7825ce60b642", + "id": "d1452a6d-52fc-4b80-bac5-45767c49ad52", "page": { "height": 2200, "pageIndex": 0, @@ -5747,8 +1845,9 @@ "x": 1325.5518, "y": 301.26477 }, + "cells": null, "confidence": 0.6752923, - "id": "c220c514-26e7-4721-a5ec-3dc2d2c420fe", + "id": "46a0c40b-8abc-4263-b202-43ea6909edda", "page": { "height": 2200, "pageIndex": 0, @@ -5775,7 +1874,7 @@ ], "readingOrder": 48, "role": "Text", - "text": "HOA$", + "text": "HOAS", "type": "paragraph" }, { @@ -5785,8 +1884,9 @@ "x": 86, "y": 335.49716 }, + "cells": null, "confidence": 0.7811751, - "id": "99f41846-c1ce-4b16-88fd-0b9cd929b852", + "id": "7fa8a343-6c98-4a2b-b2cb-6a3be16386dc", "page": { "height": 2200, "pageIndex": 0, @@ -5814,569 +1914,7 @@ "readingOrder": 49, "role": "Text", "text": "Sales Price $ 285,000_______ Date of Sale Description and $ amount of loan charges/concessions to be paid by seller N/A__________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 63, - "x": 86, - "y": 336 - }, - "confidence": 1, - "points": [ - [ - 86, - 336 - ], - [ - 149, - 336 - ], - [ - 149, - 358 - ], - [ - 86, - 358 - ] - ], - "text": "Sales" - }, - { - "bounds": { - "height": 22, - "width": 58, - "x": 158, - "y": 336 - }, - "confidence": 1, - "points": [ - [ - 158, - 336 - ], - [ - 216, - 336 - ], - [ - 216, - 358 - ], - [ - 158, - 358 - ] - ], - "text": "Price" - }, - { - "bounds": { - "height": 25, - "width": 16, - "x": 222, - "y": 336 - }, - "confidence": 1, - "points": [ - [ - 222, - 336 - ], - [ - 238, - 336 - ], - [ - 238, - 361 - ], - [ - 222, - 361 - ] - ], - "text": "$" - }, - { - "bounds": { - "height": 22, - "width": 102, - "x": 241, - "y": 338 - }, - "confidence": 1, - "points": [ - [ - 241, - 338 - ], - [ - 343, - 338 - ], - [ - 343, - 360 - ], - [ - 241, - 360 - ] - ], - "text": "285,000_______" - }, - { - "bounds": { - "height": 22, - "width": 50, - "x": 358, - "y": 336 - }, - "confidence": 1, - "points": [ - [ - 358, - 336 - ], - [ - 408, - 336 - ], - [ - 408, - 358 - ], - [ - 358, - 358 - ] - ], - "text": "Date" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 416, - "y": 336 - }, - "confidence": 1, - "points": [ - [ - 416, - 336 - ], - [ - 438, - 336 - ], - [ - 438, - 358 - ], - [ - 416, - 358 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 22, - "width": 52, - "x": 444, - "y": 336 - }, - "confidence": 1, - "points": [ - [ - 444, - 336 - ], - [ - 496, - 336 - ], - [ - 496, - 358 - ], - [ - 444, - 358 - ] - ], - "text": "Sale" - }, - { - "bounds": { - "height": 27, - "width": 122, - "x": 633, - "y": 336 - }, - "confidence": 1, - "points": [ - [ - 633, - 336 - ], - [ - 755, - 336 - ], - [ - 755, - 363 - ], - [ - 633, - 363 - ] - ], - "text": "Description" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 763, - "y": 336 - }, - "confidence": 1, - "points": [ - [ - 763, - 336 - ], - [ - 804, - 336 - ], - [ - 804, - 358 - ], - [ - 763, - 358 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 25, - "width": 16, - "x": 813, - "y": 336 - }, - "confidence": 1, - "points": [ - [ - 813, - 336 - ], - [ - 829, - 336 - ], - [ - 829, - 361 - ], - [ - 813, - 361 - ] - ], - "text": "$" - }, - { - "bounds": { - "height": 19, - "width": 86, - "x": 836, - "y": 338 - }, - "confidence": 1, - "points": [ - [ - 836, - 338 - ], - [ - 922, - 338 - ], - [ - 922, - 357 - ], - [ - 836, - 357 - ] - ], - "text": "amount" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 927, - "y": 336 - }, - "confidence": 1, - "points": [ - [ - 927, - 336 - ], - [ - 949, - 336 - ], - [ - 949, - 358 - ], - [ - 927, - 358 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 22, - "width": 47, - "x": 958, - "y": 336 - }, - "confidence": 1, - "points": [ - [ - 958, - 336 - ], - [ - 1005, - 336 - ], - [ - 1005, - 358 - ], - [ - 958, - 358 - ] - ], - "text": "loan" - }, - { - "bounds": { - "height": 27, - "width": 233, - "x": 1013, - "y": 336 - }, - "confidence": 1, - "points": [ - [ - 1013, - 336 - ], - [ - 1246, - 336 - ], - [ - 1246, - 363 - ], - [ - 1013, - 363 - ] - ], - "text": "charges/concessions" - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 1255, - "y": 338 - }, - "confidence": 1, - "points": [ - [ - 1255, - 338 - ], - [ - 1277, - 338 - ], - [ - 1277, - 357 - ], - [ - 1255, - 357 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 22, - "width": 27, - "x": 1286, - "y": 336 - }, - "confidence": 1, - "points": [ - [ - 1286, - 336 - ], - [ - 1313, - 336 - ], - [ - 1313, - 358 - ], - [ - 1286, - 358 - ] - ], - "text": "be" - }, - { - "bounds": { - "height": 27, - "width": 47, - "x": 1322, - "y": 336 - }, - "confidence": 1, - "points": [ - [ - 1322, - 336 - ], - [ - 1369, - 336 - ], - [ - 1369, - 363 - ], - [ - 1322, - 363 - ] - ], - "text": "paid" - }, - { - "bounds": { - "height": 27, - "width": 27, - "x": 1377, - "y": 336 - }, - "confidence": 1, - "points": [ - [ - 1377, - 336 - ], - [ - 1404, - 336 - ], - [ - 1404, - 363 - ], - [ - 1377, - 363 - ] - ], - "text": "by" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 1413, - "y": 336 - }, - "confidence": 1, - "points": [ - [ - 1413, - 336 - ], - [ - 1474, - 336 - ], - [ - 1474, - 358 - ], - [ - 1413, - 358 - ] - ], - "text": "seller" - }, - { - "bounds": { - "height": 25, - "width": 144, - "x": 1477, - "y": 336 - }, - "confidence": 1, - "points": [ - [ - 1477, - 336 - ], - [ - 1621, - 336 - ], - [ - 1621, - 361 - ], - [ - 1477, - 361 - ] - ], - "text": "N/A__________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -6385,8 +1923,9 @@ "x": 88, "y": 366 }, + "cells": null, "confidence": 0.7642762, - "id": "308ff626-fa1e-4893-87b7-5ff6f4dbdb13", + "id": "b9a56c84-3b08-43a2-a859-2ae67d90f705", "page": { "height": 2200, "pageIndex": 0, @@ -6414,317 +1953,7 @@ "readingOrder": 50, "role": "Text", "text": "Lender/Client National Bank Heritage_______________________________ Address Financial Plaza, Springfield, IL 62701 500___________________________________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 152, - "x": 88, - "y": 366 - }, - "confidence": 1, - "points": [ - [ - 88, - 366 - ], - [ - 240, - 366 - ], - [ - 240, - 388 - ], - [ - 88, - 388 - ] - ], - "text": "Lender/Client" - }, - { - "bounds": { - "height": 22, - "width": 83, - "x": 347, - "y": 366 - }, - "confidence": 1, - "points": [ - [ - 347, - 366 - ], - [ - 430, - 366 - ], - [ - 430, - 388 - ], - [ - 347, - 388 - ] - ], - "text": "National" - }, - { - "bounds": { - "height": 22, - "width": 52, - "x": 436, - "y": 366 - }, - "confidence": 1, - "points": [ - [ - 436, - 366 - ], - [ - 488, - 366 - ], - [ - 488, - 388 - ], - [ - 436, - 388 - ] - ], - "text": "Bank" - }, - { - "bounds": { - "height": 27, - "width": 438, - "x": 252, - "y": 366 - }, - "confidence": 1, - "points": [ - [ - 252, - 366 - ], - [ - 690, - 366 - ], - [ - 690, - 393 - ], - [ - 252, - 393 - ] - ], - "text": "Heritage_______________________________" - }, - { - "bounds": { - "height": 22, - "width": 94, - "x": 700, - "y": 366 - }, - "confidence": 1, - "points": [ - [ - 700, - 366 - ], - [ - 794, - 366 - ], - [ - 794, - 388 - ], - [ - 700, - 388 - ] - ], - "text": "Address" - }, - { - "bounds": { - "height": 19, - "width": 83, - "x": 841, - "y": 369 - }, - "confidence": 1, - "points": [ - [ - 841, - 369 - ], - [ - 924, - 369 - ], - [ - 924, - 388 - ], - [ - 841, - 388 - ] - ], - "text": "Financial" - }, - { - "bounds": { - "height": 22, - "width": 55, - "x": 930, - "y": 369 - }, - "confidence": 1, - "points": [ - [ - 930, - 369 - ], - [ - 985, - 369 - ], - [ - 985, - 391 - ], - [ - 930, - 391 - ] - ], - "text": "Plaza," - }, - { - "bounds": { - "height": 25, - "width": 105, - "x": 991, - "y": 369 - }, - "confidence": 1, - "points": [ - [ - 991, - 369 - ], - [ - 1096, - 369 - ], - [ - 1096, - 394 - ], - [ - 991, - 394 - ] - ], - "text": "Springfield," - }, - { - "bounds": { - "height": 19, - "width": 16, - "x": 1102, - "y": 369 - }, - "confidence": 1, - "points": [ - [ - 1102, - 369 - ], - [ - 1118, - 369 - ], - [ - 1118, - 388 - ], - [ - 1102, - 388 - ] - ], - "text": "IL" - }, - { - "bounds": { - "height": 19, - "width": 55, - "x": 1125, - "y": 369 - }, - "confidence": 1, - "points": [ - [ - 1125, - 369 - ], - [ - 1180, - 369 - ], - [ - 1180, - 388 - ], - [ - 1125, - 388 - ] - ], - "text": "62701" - }, - { - "bounds": { - "height": 22, - "width": 824, - "x": 797, - "y": 369 - }, - "confidence": 1, - "points": [ - [ - 797, - 369 - ], - [ - 1621, - 369 - ], - [ - 1621, - 391 - ], - [ - 797, - 391 - ] - ], - "text": "500___________________________________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -6733,8 +1962,9 @@ "x": 86, "y": 396.33026 }, + "cells": null, "confidence": 0.80223554, - "id": "4aa13079-e680-4761-9321-72863bf026a9", + "id": "689d8c52-b3ba-44fa-a534-0f9f68b8200d", "page": { "height": 2200, "pageIndex": 0, @@ -6762,373 +1992,7 @@ "readingOrder": 51, "role": "Text", "text": "Nathan Reyes, Certified Residential Appraiser___________________________________ Address Oak Grove Drive, Springfield, IL 62702 1200___________________________________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 66, - "x": 200, - "y": 400 - }, - "confidence": 1, - "points": [ - [ - 200, - 400 - ], - [ - 266, - 400 - ], - [ - 266, - 419 - ], - [ - 200, - 419 - ] - ], - "text": "Nathan" - }, - { - "bounds": { - "height": 25, - "width": 63, - "x": 272, - "y": 400 - }, - "confidence": 1, - "points": [ - [ - 272, - 400 - ], - [ - 335, - 400 - ], - [ - 335, - 425 - ], - [ - 272, - 425 - ] - ], - "text": "Reyes," - }, - { - "bounds": { - "height": 19, - "width": 77, - "x": 344, - "y": 400 - }, - "confidence": 1, - "points": [ - [ - 344, - 400 - ], - [ - 421, - 400 - ], - [ - 421, - 419 - ], - [ - 344, - 419 - ] - ], - "text": "Certified" - }, - { - "bounds": { - "height": 19, - "width": 102, - "x": 427, - "y": 400 - }, - "confidence": 1, - "points": [ - [ - 427, - 400 - ], - [ - 529, - 400 - ], - [ - 529, - 419 - ], - [ - 427, - 419 - ] - ], - "text": "Residential" - }, - { - "bounds": { - "height": 25, - "width": 605, - "x": 86, - "y": 397 - }, - "confidence": 1, - "points": [ - [ - 86, - 397 - ], - [ - 691, - 397 - ], - [ - 691, - 422 - ], - [ - 86, - 422 - ] - ], - "text": "Appraiser___________________________________" - }, - { - "bounds": { - "height": 22, - "width": 94, - "x": 700, - "y": 397 - }, - "confidence": 1, - "points": [ - [ - 700, - 397 - ], - [ - 794, - 397 - ], - [ - 794, - 419 - ], - [ - 700, - 419 - ] - ], - "text": "Address" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 855, - "y": 397 - }, - "confidence": 1, - "points": [ - [ - 855, - 397 - ], - [ - 896, - 397 - ], - [ - 896, - 419 - ], - [ - 855, - 419 - ] - ], - "text": "Oak" - }, - { - "bounds": { - "height": 19, - "width": 61, - "x": 902, - "y": 400 - }, - "confidence": 1, - "points": [ - [ - 902, - 400 - ], - [ - 963, - 400 - ], - [ - 963, - 419 - ], - [ - 902, - 419 - ] - ], - "text": "Grove" - }, - { - "bounds": { - "height": 25, - "width": 58, - "x": 972, - "y": 397 - }, - "confidence": 1, - "points": [ - [ - 972, - 397 - ], - [ - 1030, - 397 - ], - [ - 1030, - 422 - ], - [ - 972, - 422 - ] - ], - "text": "Drive," - }, - { - "bounds": { - "height": 27, - "width": 113, - "x": 1038, - "y": 397 - }, - "confidence": 1, - "points": [ - [ - 1038, - 397 - ], - [ - 1151, - 397 - ], - [ - 1151, - 424 - ], - [ - 1038, - 424 - ] - ], - "text": "Springfield," - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1158, - "y": 400 - }, - "confidence": 1, - "points": [ - [ - 1158, - 400 - ], - [ - 1177, - 400 - ], - [ - 1177, - 419 - ], - [ - 1158, - 419 - ] - ], - "text": "IL" - }, - { - "bounds": { - "height": 19, - "width": 63, - "x": 1183, - "y": 400 - }, - "confidence": 1, - "points": [ - [ - 1183, - 400 - ], - [ - 1246, - 400 - ], - [ - 1246, - 419 - ], - [ - 1183, - 419 - ] - ], - "text": "62702" - }, - { - "bounds": { - "height": 22, - "width": 824, - "x": 797, - "y": 400 - }, - "confidence": 1, - "points": [ - [ - 797, - 400 - ], - [ - 1621, - 400 - ], - [ - 1621, - 422 - ], - [ - 797, - 422 - ] - ], - "text": "1200___________________________________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -7137,8 +2001,9 @@ "x": 788, "y": 447.8956 }, + "cells": null, "confidence": 0.6094553, - "id": "d3fe8e9e-e67e-403a-97c3-29540ab6ea69", + "id": "a126a68f-b1e5-424d-82df-01d0d35f95a6", "page": { "height": 2200, "pageIndex": 0, @@ -7166,65 +2031,7 @@ "readingOrder": 52, "role": "Text", "text": "Single Family", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 63, - "x": 788, - "y": 483 - }, - "confidence": 1, - "points": [ - [ - 788, - 483 - ], - [ - 851, - 483 - ], - [ - 851, - 508 - ], - [ - 788, - 508 - ] - ], - "text": "Single" - }, - { - "bounds": { - "height": 25, - "width": 66, - "x": 855, - "y": 483 - }, - "confidence": 1, - "points": [ - [ - 855, - 483 - ], - [ - 921, - 483 - ], - [ - 921, - 508 - ], - [ - 855, - 508 - ] - ], - "text": "Family" - } - ] + "type": "paragraph" }, { "bounds": { @@ -7233,8 +2040,9 @@ "x": 787.9971, "y": 514.8089 }, + "cells": null, "confidence": 0.67681855, - "id": "6655977a-0ce0-48eb-80ca-96ea916dd7d5", + "id": "528b8793-93c0-48ea-b8ae-85ed347184c3", "page": { "height": 2200, "pageIndex": 0, @@ -7262,149 +2070,7 @@ "readingOrder": 53, "role": "Text", "text": "Occupancy $(000) Occupancy $(000) (yrs)", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 119, - "x": 788, - "y": 516 - }, - "confidence": 1, - "points": [ - [ - 788, - 516 - ], - [ - 907, - 516 - ], - [ - 907, - 541 - ], - [ - 788, - 541 - ] - ], - "text": "Occupancy" - }, - { - "bounds": { - "height": 25, - "width": 63, - "x": 1022, - "y": 516 - }, - "confidence": 1, - "points": [ - [ - 1022, - 516 - ], - [ - 1085, - 516 - ], - [ - 1085, - 541 - ], - [ - 1022, - 541 - ] - ], - "text": "$(000)" - }, - { - "bounds": { - "height": 25, - "width": 119, - "x": 1244, - "y": 516 - }, - "confidence": 1, - "points": [ - [ - 1244, - 516 - ], - [ - 1363, - 516 - ], - [ - 1363, - 541 - ], - [ - 1244, - 541 - ] - ], - "text": "Occupancy" - }, - { - "bounds": { - "height": 25, - "width": 63, - "x": 1461, - "y": 516 - }, - "confidence": 1, - "points": [ - [ - 1461, - 516 - ], - [ - 1524, - 516 - ], - [ - 1524, - 541 - ], - [ - 1461, - 541 - ] - ], - "text": "$(000)" - }, - { - "bounds": { - "height": 25, - "width": 50, - "x": 1583, - "y": 516 - }, - "confidence": 1, - "points": [ - [ - 1583, - 516 - ], - [ - 1633, - 516 - ], - [ - 1633, - 541 - ], - [ - 1583, - 541 - ] - ], - "text": "(yrs)" - } - ] + "type": "paragraph" }, { "bounds": { @@ -7413,8 +2079,9 @@ "x": 787.81024, "y": 547.0943 }, + "cells": null, "confidence": 0.84626544, - "id": "dc32f7db-7764-4b23-9d10-e6bb727f97f8", + "id": "2d7acd2a-6750-4447-9d13-dbf58a006bcc", "page": { "height": 2200, "pageIndex": 0, @@ -7451,8 +2118,9 @@ "x": 788.4812, "y": 580.525 }, + "cells": null, "confidence": 0.8277513, - "id": "d95c5abe-75b3-4a06-a0b6-1c5490b1048c", + "id": "7985a850-7585-49e1-af8f-bb89d9c5bcce", "page": { "height": 2200, "pageIndex": 0, @@ -7489,8 +2157,9 @@ "x": 788, "y": 613 }, + "cells": null, "confidence": 0.8584973, - "id": "da53d29f-cf53-49ea-b9f5-01530cacfd5c", + "id": "3314ccf1-040e-4254-8a90-a12bff36350a", "page": { "height": 2200, "pageIndex": 0, @@ -7518,233 +2187,7 @@ "readingOrder": 56, "role": "CheckboxUnselected", "text": "❐ Vacant (0-5%) Predominant ❐ Vacant (0-5%) Predominant", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 22, - "x": 788, - "y": 613 - }, - "confidence": 1, - "points": [ - [ - 788, - 613 - ], - [ - 810, - 613 - ], - [ - 810, - 635 - ], - [ - 788, - 635 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 66, - "x": 819, - "y": 616 - }, - "confidence": 1, - "points": [ - [ - 819, - 616 - ], - [ - 885, - 616 - ], - [ - 885, - 635 - ], - [ - 819, - 635 - ] - ], - "text": "Vacant" - }, - { - "bounds": { - "height": 25, - "width": 63, - "x": 894, - "y": 616 - }, - "confidence": 1, - "points": [ - [ - 894, - 616 - ], - [ - 957, - 616 - ], - [ - 957, - 641 - ], - [ - 894, - 641 - ] - ], - "text": "(0-5%)" - }, - { - "bounds": { - "height": 19, - "width": 127, - "x": 1044, - "y": 616 - }, - "confidence": 1, - "points": [ - [ - 1044, - 616 - ], - [ - 1171, - 616 - ], - [ - 1171, - 635 - ], - [ - 1044, - 635 - ] - ], - "text": "Predominant" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 1244, - "y": 613 - }, - "confidence": 1, - "points": [ - [ - 1244, - 613 - ], - [ - 1266, - 613 - ], - [ - 1266, - 635 - ], - [ - 1244, - 635 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 69, - "x": 1275, - "y": 616 - }, - "confidence": 1, - "points": [ - [ - 1275, - 616 - ], - [ - 1344, - 616 - ], - [ - 1344, - 635 - ], - [ - 1275, - 635 - ] - ], - "text": "Vacant" - }, - { - "bounds": { - "height": 25, - "width": 66, - "x": 1352, - "y": 616 - }, - "confidence": 1, - "points": [ - [ - 1352, - 616 - ], - [ - 1418, - 616 - ], - [ - 1418, - 641 - ], - [ - 1352, - 641 - ] - ], - "text": "(0-5%)" - }, - { - "bounds": { - "height": 19, - "width": 124, - "x": 1491, - "y": 616 - }, - "confidence": 1, - "points": [ - [ - 1491, - 616 - ], - [ - 1615, - 616 - ], - [ - 1615, - 635 - ], - [ - 1491, - 635 - ] - ], - "text": "Predominant" - } - ] + "type": "paragraph" }, { "bounds": { @@ -7753,8 +2196,9 @@ "x": 788, "y": 646.4148 }, + "cells": null, "confidence": 0.55615556, - "id": "e087993a-1fb5-4c23-a940-350641192829", + "id": "4c10e7b8-5f64-4795-9ebb-5dcf7c251719", "page": { "height": 2200, "pageIndex": 0, @@ -7782,233 +2226,7 @@ "readingOrder": 57, "role": "CheckboxUnselected", "text": "❐ Vacant (over 5%) ❐ Vacant (over 5%)", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 22, - "x": 788, - "y": 647 - }, - "confidence": 1, - "points": [ - [ - 788, - 647 - ], - [ - 810, - 647 - ], - [ - 810, - 669 - ], - [ - 788, - 669 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 69, - "x": 819, - "y": 650 - }, - "confidence": 1, - "points": [ - [ - 819, - 650 - ], - [ - 888, - 650 - ], - [ - 888, - 669 - ], - [ - 819, - 669 - ] - ], - "text": "Vacant" - }, - { - "bounds": { - "height": 25, - "width": 50, - "x": 897, - "y": 650 - }, - "confidence": 1, - "points": [ - [ - 897, - 650 - ], - [ - 947, - 650 - ], - [ - 947, - 675 - ], - [ - 897, - 675 - ] - ], - "text": "(over" - }, - { - "bounds": { - "height": 25, - "width": 41, - "x": 952, - "y": 650 - }, - "confidence": 1, - "points": [ - [ - 952, - 650 - ], - [ - 993, - 650 - ], - [ - 993, - 675 - ], - [ - 952, - 675 - ] - ], - "text": "5%)" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 1244, - "y": 647 - }, - "confidence": 1, - "points": [ - [ - 1244, - 647 - ], - [ - 1266, - 647 - ], - [ - 1266, - 669 - ], - [ - 1244, - 669 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 69, - "x": 1275, - "y": 650 - }, - "confidence": 1, - "points": [ - [ - 1275, - 650 - ], - [ - 1344, - 650 - ], - [ - 1344, - 669 - ], - [ - 1275, - 669 - ] - ], - "text": "Vacant" - }, - { - "bounds": { - "height": 25, - "width": 50, - "x": 1352, - "y": 650 - }, - "confidence": 1, - "points": [ - [ - 1352, - 650 - ], - [ - 1402, - 650 - ], - [ - 1402, - 675 - ], - [ - 1352, - 675 - ] - ], - "text": "(over" - }, - { - "bounds": { - "height": 25, - "width": 38, - "x": 1411, - "y": 650 - }, - "confidence": 1, - "points": [ - [ - 1411, - 650 - ], - [ - 1449, - 650 - ], - [ - 1449, - 675 - ], - [ - 1411, - 675 - ] - ], - "text": "5%)" - } - ] + "type": "paragraph" }, { "bounds": { @@ -8017,8 +2235,9 @@ "x": 790.69946, "y": 715.961 }, + "cells": null, "confidence": 0.75709814, - "id": "5a4b1c73-d3e5-42e8-8755-f7ca0589cea3", + "id": "083a1844-1be9-455e-b6ac-d7b0e32f91c2", "page": { "height": 2200, "pageIndex": 0, @@ -8055,8 +2274,9 @@ "x": 799.4713, "y": 745.5905 }, + "cells": null, "confidence": 0.7077225, - "id": "ea7e117d-a80d-432d-8a18-24588cf1cadc", + "id": "3b9fa3af-096c-4c34-8f90-5b4d07d58274", "page": { "height": 2200, "pageIndex": 0, @@ -8093,8 +2313,9 @@ "x": 88, "y": 776.98114 }, + "cells": null, "confidence": 0.7639862, - "id": "5712f0c3-2e75-4a92-b839-968a7e04b079", + "id": "5b9a0d39-c9b0-4650-9ea4-b13853e0a33c", "page": { "height": 2200, "pageIndex": 0, @@ -8122,401 +2343,7 @@ "readingOrder": 60, "role": "Text", "text": "Rent controls ❐ Yes ❐ Likely If yes or likely, describe____________ Multi family _____", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 52, - "x": 88, - "y": 777 - }, - "confidence": 1, - "points": [ - [ - 88, - 777 - ], - [ - 140, - 777 - ], - [ - 140, - 799 - ], - [ - 88, - 799 - ] - ], - "text": "Rent" - }, - { - "bounds": { - "height": 22, - "width": 86, - "x": 147, - "y": 777 - }, - "confidence": 1, - "points": [ - [ - 147, - 777 - ], - [ - 233, - 777 - ], - [ - 233, - 799 - ], - [ - 147, - 799 - ] - ], - "text": "controls" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 247, - "y": 777 - }, - "confidence": 1, - "points": [ - [ - 247, - 777 - ], - [ - 266, - 777 - ], - [ - 266, - 796 - ], - [ - 247, - 796 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 272, - "y": 777 - }, - "confidence": 1, - "points": [ - [ - 272, - 777 - ], - [ - 313, - 777 - ], - [ - 313, - 799 - ], - [ - 272, - 799 - ] - ], - "text": "Yes" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 411, - "y": 777 - }, - "confidence": 1, - "points": [ - [ - 411, - 777 - ], - [ - 430, - 777 - ], - [ - 430, - 796 - ], - [ - 411, - 796 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 25, - "width": 63, - "x": 436, - "y": 777 - }, - "confidence": 1, - "points": [ - [ - 436, - 777 - ], - [ - 499, - 777 - ], - [ - 499, - 802 - ], - [ - 436, - 802 - ] - ], - "text": "Likely" - }, - { - "bounds": { - "height": 19, - "width": 13, - "x": 555, - "y": 777 - }, - "confidence": 1, - "points": [ - [ - 555, - 777 - ], - [ - 568, - 777 - ], - [ - 568, - 796 - ], - [ - 555, - 796 - ] - ], - "text": "If" - }, - { - "bounds": { - "height": 22, - "width": 38, - "x": 575, - "y": 780 - }, - "confidence": 1, - "points": [ - [ - 575, - 780 - ], - [ - 613, - 780 - ], - [ - 613, - 802 - ], - [ - 575, - 802 - ] - ], - "text": "yes" - }, - { - "bounds": { - "height": 19, - "width": 25, - "x": 619, - "y": 780 - }, - "confidence": 1, - "points": [ - [ - 619, - 780 - ], - [ - 644, - 780 - ], - [ - 644, - 799 - ], - [ - 619, - 799 - ] - ], - "text": "or" - }, - { - "bounds": { - "height": 25, - "width": 58, - "x": 650, - "y": 777 - }, - "confidence": 1, - "points": [ - [ - 650, - 777 - ], - [ - 708, - 777 - ], - [ - 708, - 802 - ], - [ - 650, - 802 - ] - ], - "text": "likely," - }, - { - "bounds": { - "height": 25, - "width": 269, - "x": 713, - "y": 777 - }, - "confidence": 1, - "points": [ - [ - 713, - 777 - ], - [ - 982, - 777 - ], - [ - 982, - 802 - ], - [ - 713, - 802 - ] - ], - "text": "describe____________" - }, - { - "bounds": { - "height": 22, - "width": 52, - "x": 1094, - "y": 777 - }, - "confidence": 1, - "points": [ - [ - 1094, - 777 - ], - [ - 1146, - 777 - ], - [ - 1146, - 799 - ], - [ - 1094, - 799 - ] - ], - "text": "Multi" - }, - { - "bounds": { - "height": 25, - "width": 66, - "x": 1155, - "y": 777 - }, - "confidence": 1, - "points": [ - [ - 1155, - 777 - ], - [ - 1221, - 777 - ], - [ - 1221, - 802 - ], - [ - 1155, - 802 - ] - ], - "text": "family" - }, - { - "bounds": { - "height": 5, - "width": 75, - "x": 1227, - "y": 797 - }, - "confidence": 1, - "points": [ - [ - 1227, - 797 - ], - [ - 1302, - 797 - ], - [ - 1302, - 802 - ], - [ - 1227, - 802 - ] - ], - "text": "_____" - } - ] + "type": "paragraph" }, { "bounds": { @@ -8525,8 +2352,9 @@ "x": 87.056625, "y": 866 }, + "cells": null, "confidence": 0.80528224, - "id": "1ba8398c-c22c-4989-a4b3-d92951f853ef", + "id": "e95e2a43-e376-4631-8563-c9773d25f76b", "page": { "height": 2200, "pageIndex": 0, @@ -8554,373 +2382,7 @@ "readingOrder": 61, "role": "Text", "text": "Note: Race and the racial composition of the neighborhood are not appraisal factors", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 58, - "x": 88, - "y": 866 - }, - "confidence": 1, - "points": [ - [ - 88, - 866 - ], - [ - 146, - 866 - ], - [ - 146, - 888 - ], - [ - 88, - 888 - ] - ], - "text": "Note:" - }, - { - "bounds": { - "height": 22, - "width": 58, - "x": 155, - "y": 866 - }, - "confidence": 1, - "points": [ - [ - 155, - 866 - ], - [ - 213, - 866 - ], - [ - 213, - 888 - ], - [ - 155, - 888 - ] - ], - "text": "Race" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 222, - "y": 866 - }, - "confidence": 1, - "points": [ - [ - 222, - 866 - ], - [ - 263, - 866 - ], - [ - 263, - 888 - ], - [ - 222, - 888 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 272, - "y": 866 - }, - "confidence": 1, - "points": [ - [ - 272, - 866 - ], - [ - 308, - 866 - ], - [ - 308, - 888 - ], - [ - 272, - 888 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 58, - "x": 316, - "y": 866 - }, - "confidence": 1, - "points": [ - [ - 316, - 866 - ], - [ - 374, - 866 - ], - [ - 374, - 888 - ], - [ - 316, - 888 - ] - ], - "text": "racial" - }, - { - "bounds": { - "height": 27, - "width": 133, - "x": 383, - "y": 866 - }, - "confidence": 1, - "points": [ - [ - 383, - 866 - ], - [ - 516, - 866 - ], - [ - 516, - 893 - ], - [ - 383, - 893 - ] - ], - "text": "composition" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 525, - "y": 866 - }, - "confidence": 1, - "points": [ - [ - 525, - 866 - ], - [ - 547, - 866 - ], - [ - 547, - 888 - ], - [ - 525, - 888 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 552, - "y": 866 - }, - "confidence": 1, - "points": [ - [ - 552, - 866 - ], - [ - 588, - 866 - ], - [ - 588, - 888 - ], - [ - 552, - 888 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 152, - "x": 597, - "y": 866 - }, - "confidence": 1, - "points": [ - [ - 597, - 866 - ], - [ - 749, - 866 - ], - [ - 749, - 893 - ], - [ - 597, - 893 - ] - ], - "text": "neighborhood" - }, - { - "bounds": { - "height": 16, - "width": 36, - "x": 758, - "y": 872 - }, - "confidence": 1, - "points": [ - [ - 758, - 872 - ], - [ - 794, - 872 - ], - [ - 794, - 888 - ], - [ - 758, - 888 - ] - ], - "text": "are" - }, - { - "bounds": { - "height": 19, - "width": 36, - "x": 802, - "y": 869 - }, - "confidence": 1, - "points": [ - [ - 802, - 869 - ], - [ - 838, - 869 - ], - [ - 838, - 888 - ], - [ - 802, - 888 - ] - ], - "text": "not" - }, - { - "bounds": { - "height": 27, - "width": 102, - "x": 844, - "y": 866 - }, - "confidence": 1, - "points": [ - [ - 844, - 866 - ], - [ - 946, - 866 - ], - [ - 946, - 893 - ], - [ - 844, - 893 - ] - ], - "text": "appraisal" - }, - { - "bounds": { - "height": 22, - "width": 75, - "x": 955, - "y": 866 - }, - "confidence": 1, - "points": [ - [ - 955, - 866 - ], - [ - 1030, - 866 - ], - [ - 1030, - 888 - ], - [ - 955, - 888 - ] - ], - "text": "factors" - } - ] + "type": "paragraph" }, { "bounds": { @@ -8929,8 +2391,9 @@ "x": 87.44337, "y": 896.7186 }, + "cells": null, "confidence": 0.6639906, - "id": "2fcb79ed-db9d-4291-a808-54ed4a601e36", + "id": "15f5af5a-c4f6-4190-ade0-614d90a160a8", "page": { "height": 2200, "pageIndex": 0, @@ -8958,121 +2421,7 @@ "readingOrder": 62, "role": "Text", "text": "Neighborhood boundaries and characteristics:", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 155, - "x": 88, - "y": 897 - }, - "confidence": 1, - "points": [ - [ - 88, - 897 - ], - [ - 243, - 897 - ], - [ - 243, - 922 - ], - [ - 88, - 922 - ] - ], - "text": "Neighborhood" - }, - { - "bounds": { - "height": 22, - "width": 124, - "x": 255, - "y": 897 - }, - "confidence": 1, - "points": [ - [ - 255, - 897 - ], - [ - 379, - 897 - ], - [ - 379, - 919 - ], - [ - 255, - 919 - ] - ], - "text": "boundaries" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 391, - "y": 897 - }, - "confidence": 1, - "points": [ - [ - 391, - 897 - ], - [ - 432, - 897 - ], - [ - 432, - 919 - ], - [ - 391, - 919 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 22, - "width": 166, - "x": 444, - "y": 897 - }, - "confidence": 1, - "points": [ - [ - 444, - 897 - ], - [ - 610, - 897 - ], - [ - 610, - 919 - ], - [ - 444, - 919 - ] - ], - "text": "characteristics:" - } - ] + "type": "paragraph" }, { "bounds": { @@ -9081,8 +2430,9 @@ "x": 88, "y": 926.2247 }, + "cells": null, "confidence": 0.79738826, - "id": "44e54f78-fcea-490f-9226-fc28453c95d8", + "id": "1a3874be-d5b8-4a16-89ec-3ab00bd6433d", "page": { "height": 2200, "pageIndex": 0, @@ -9110,961 +2460,7 @@ "readingOrder": 63, "role": "Text", "text": "Proximity to employment centers in downtown Springfield (10 minutes), grocery, schools, and public transportation supports steady rental demand and _____________________________________________________________________________________________________________\nEmployment base is stable, anchored by state government, healthcare, and higher education employers. _____________________________________________________________________________________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 94, - "x": 91, - "y": 927 - }, - "confidence": 1, - "points": [ - [ - 91, - 927 - ], - [ - 185, - 927 - ], - [ - 185, - 954 - ], - [ - 91, - 954 - ] - ], - "text": "Proximity" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 191, - "y": 930 - }, - "confidence": 1, - "points": [ - [ - 191, - 930 - ], - [ - 210, - 930 - ], - [ - 210, - 949 - ], - [ - 191, - 949 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 27, - "width": 127, - "x": 216, - "y": 927 - }, - "confidence": 1, - "points": [ - [ - 216, - 927 - ], - [ - 343, - 927 - ], - [ - 343, - 954 - ], - [ - 216, - 954 - ] - ], - "text": "employment" - }, - { - "bounds": { - "height": 19, - "width": 72, - "x": 350, - "y": 930 - }, - "confidence": 1, - "points": [ - [ - 350, - 930 - ], - [ - 422, - 930 - ], - [ - 422, - 949 - ], - [ - 350, - 949 - ] - ], - "text": "centers" - }, - { - "bounds": { - "height": 22, - "width": 16, - "x": 430, - "y": 927 - }, - "confidence": 1, - "points": [ - [ - 430, - 927 - ], - [ - 446, - 927 - ], - [ - 446, - 949 - ], - [ - 430, - 949 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 22, - "width": 102, - "x": 455, - "y": 927 - }, - "confidence": 1, - "points": [ - [ - 455, - 927 - ], - [ - 557, - 927 - ], - [ - 557, - 949 - ], - [ - 455, - 949 - ] - ], - "text": "downtown" - }, - { - "bounds": { - "height": 27, - "width": 108, - "x": 563, - "y": 927 - }, - "confidence": 1, - "points": [ - [ - 563, - 927 - ], - [ - 671, - 927 - ], - [ - 671, - 954 - ], - [ - 563, - 954 - ] - ], - "text": "Springfield" - }, - { - "bounds": { - "height": 22, - "width": 33, - "x": 677, - "y": 930 - }, - "confidence": 1, - "points": [ - [ - 677, - 930 - ], - [ - 710, - 930 - ], - [ - 710, - 952 - ], - [ - 677, - 952 - ] - ], - "text": "(10" - }, - { - "bounds": { - "height": 25, - "width": 91, - "x": 719, - "y": 927 - }, - "confidence": 1, - "points": [ - [ - 719, - 927 - ], - [ - 810, - 927 - ], - [ - 810, - 952 - ], - [ - 719, - 952 - ] - ], - "text": "minutes)," - }, - { - "bounds": { - "height": 22, - "width": 83, - "x": 816, - "y": 933 - }, - "confidence": 1, - "points": [ - [ - 816, - 933 - ], - [ - 899, - 933 - ], - [ - 899, - 955 - ], - [ - 816, - 955 - ] - ], - "text": "grocery," - }, - { - "bounds": { - "height": 25, - "width": 83, - "x": 908, - "y": 927 - }, - "confidence": 1, - "points": [ - [ - 908, - 927 - ], - [ - 991, - 927 - ], - [ - 991, - 952 - ], - [ - 908, - 952 - ] - ], - "text": "schools," - }, - { - "bounds": { - "height": 22, - "width": 38, - "x": 997, - "y": 927 - }, - "confidence": 1, - "points": [ - [ - 997, - 927 - ], - [ - 1035, - 927 - ], - [ - 1035, - 949 - ], - [ - 997, - 949 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 27, - "width": 58, - "x": 1044, - "y": 927 - }, - "confidence": 1, - "points": [ - [ - 1044, - 927 - ], - [ - 1102, - 927 - ], - [ - 1102, - 954 - ], - [ - 1044, - 954 - ] - ], - "text": "public" - }, - { - "bounds": { - "height": 27, - "width": 141, - "x": 1108, - "y": 927 - }, - "confidence": 1, - "points": [ - [ - 1108, - 927 - ], - [ - 1249, - 927 - ], - [ - 1249, - 954 - ], - [ - 1108, - 954 - ] - ], - "text": "transportation" - }, - { - "bounds": { - "height": 25, - "width": 86, - "x": 1255, - "y": 930 - }, - "confidence": 1, - "points": [ - [ - 1255, - 930 - ], - [ - 1341, - 930 - ], - [ - 1341, - 955 - ], - [ - 1255, - 955 - ] - ], - "text": "supports" - }, - { - "bounds": { - "height": 27, - "width": 69, - "x": 1350, - "y": 927 - }, - "confidence": 1, - "points": [ - [ - 1350, - 927 - ], - [ - 1419, - 927 - ], - [ - 1419, - 954 - ], - [ - 1350, - 954 - ] - ], - "text": "steady" - }, - { - "bounds": { - "height": 22, - "width": 55, - "x": 1425, - "y": 927 - }, - "confidence": 1, - "points": [ - [ - 1425, - 927 - ], - [ - 1480, - 927 - ], - [ - 1480, - 949 - ], - [ - 1425, - 949 - ] - ], - "text": "rental" - }, - { - "bounds": { - "height": 22, - "width": 83, - "x": 1486, - "y": 927 - }, - "confidence": 1, - "points": [ - [ - 1486, - 927 - ], - [ - 1569, - 927 - ], - [ - 1569, - 949 - ], - [ - 1486, - 949 - ] - ], - "text": "demand" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1577, - "y": 927 - }, - "confidence": 1, - "points": [ - [ - 1577, - 927 - ], - [ - 1613, - 927 - ], - [ - 1613, - 949 - ], - [ - 1577, - 949 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 5, - "width": 1519, - "x": 88, - "y": 947 - }, - "confidence": 1, - "points": [ - [ - 88, - 947 - ], - [ - 1607, - 947 - ], - [ - 1607, - 952 - ], - [ - 88, - 952 - ] - ], - "text": "_____________________________________________________________________________________________________________" - }, - { - "bounds": { - "height": 27, - "width": 130, - "x": 91, - "y": 958 - }, - "confidence": 1, - "points": [ - [ - 91, - 958 - ], - [ - 221, - 958 - ], - [ - 221, - 985 - ], - [ - 91, - 985 - ] - ], - "text": "Employment" - }, - { - "bounds": { - "height": 22, - "width": 50, - "x": 224, - "y": 958 - }, - "confidence": 1, - "points": [ - [ - 224, - 958 - ], - [ - 274, - 958 - ], - [ - 274, - 980 - ], - [ - 224, - 980 - ] - ], - "text": "base" - }, - { - "bounds": { - "height": 22, - "width": 16, - "x": 280, - "y": 958 - }, - "confidence": 1, - "points": [ - [ - 280, - 958 - ], - [ - 296, - 958 - ], - [ - 296, - 980 - ], - [ - 280, - 980 - ] - ], - "text": "is" - }, - { - "bounds": { - "height": 25, - "width": 69, - "x": 302, - "y": 958 - }, - "confidence": 1, - "points": [ - [ - 302, - 958 - ], - [ - 371, - 958 - ], - [ - 371, - 983 - ], - [ - 302, - 983 - ] - ], - "text": "stable," - }, - { - "bounds": { - "height": 22, - "width": 97, - "x": 377, - "y": 958 - }, - "confidence": 1, - "points": [ - [ - 377, - 958 - ], - [ - 474, - 958 - ], - [ - 474, - 980 - ], - [ - 377, - 980 - ] - ], - "text": "anchored" - }, - { - "bounds": { - "height": 27, - "width": 25, - "x": 480, - "y": 958 - }, - "confidence": 1, - "points": [ - [ - 480, - 958 - ], - [ - 505, - 958 - ], - [ - 505, - 985 - ], - [ - 480, - 985 - ] - ], - "text": "by" - }, - { - "bounds": { - "height": 19, - "width": 50, - "x": 511, - "y": 961 - }, - "confidence": 1, - "points": [ - [ - 511, - 961 - ], - [ - 561, - 961 - ], - [ - 561, - 980 - ], - [ - 511, - 980 - ] - ], - "text": "state" - }, - { - "bounds": { - "height": 25, - "width": 127, - "x": 566, - "y": 961 - }, - "confidence": 1, - "points": [ - [ - 566, - 961 - ], - [ - 693, - 961 - ], - [ - 693, - 986 - ], - [ - 566, - 986 - ] - ], - "text": "government," - }, - { - "bounds": { - "height": 25, - "width": 113, - "x": 700, - "y": 958 - }, - "confidence": 1, - "points": [ - [ - 700, - 958 - ], - [ - 813, - 958 - ], - [ - 813, - 983 - ], - [ - 700, - 983 - ] - ], - "text": "healthcare," - }, - { - "bounds": { - "height": 22, - "width": 38, - "x": 819, - "y": 958 - }, - "confidence": 1, - "points": [ - [ - 819, - 958 - ], - [ - 857, - 958 - ], - [ - 857, - 980 - ], - [ - 819, - 980 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 27, - "width": 63, - "x": 866, - "y": 958 - }, - "confidence": 1, - "points": [ - [ - 866, - 958 - ], - [ - 929, - 958 - ], - [ - 929, - 985 - ], - [ - 866, - 985 - ] - ], - "text": "higher" - }, - { - "bounds": { - "height": 22, - "width": 97, - "x": 936, - "y": 958 - }, - "confidence": 1, - "points": [ - [ - 936, - 958 - ], - [ - 1033, - 958 - ], - [ - 1033, - 980 - ], - [ - 936, - 980 - ] - ], - "text": "education" - }, - { - "bounds": { - "height": 27, - "width": 111, - "x": 1041, - "y": 958 - }, - "confidence": 1, - "points": [ - [ - 1041, - 958 - ], - [ - 1152, - 958 - ], - [ - 1152, - 985 - ], - [ - 1041, - 985 - ] - ], - "text": "employers." - }, - { - "bounds": { - "height": 5, - "width": 1519, - "x": 88, - "y": 977 - }, - "confidence": 1, - "points": [ - [ - 88, - 977 - ], - [ - 1607, - 977 - ], - [ - 1607, - 982 - ], - [ - 88, - 982 - ] - ], - "text": "_____________________________________________________________________________________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -10073,8 +2469,9 @@ "x": 86, "y": 984.0764 }, + "cells": null, "confidence": 0.7640414, - "id": "0e1d7fe5-cbe0-466a-9bc2-5abc5f491b91", + "id": "c9357e05-f826-431c-b5d8-7c18a5c9f586", "page": { "height": 2200, "pageIndex": 0, @@ -10102,653 +2499,7 @@ "readingOrder": 64, "role": "Text", "text": "Factors that affect the marketability of the properties in the neighborhood (proximity to employment and amenities, employment stability,\nappeal to market, etc.): __________________________________________________________________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 80, - "x": 88, - "y": 986 - }, - "confidence": 1, - "points": [ - [ - 88, - 986 - ], - [ - 168, - 986 - ], - [ - 168, - 1008 - ], - [ - 88, - 1008 - ] - ], - "text": "Factors" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 177, - "y": 986 - }, - "confidence": 1, - "points": [ - [ - 177, - 986 - ], - [ - 218, - 986 - ], - [ - 218, - 1008 - ], - [ - 177, - 1008 - ] - ], - "text": "that" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 227, - "y": 986 - }, - "confidence": 1, - "points": [ - [ - 227, - 986 - ], - [ - 288, - 986 - ], - [ - 288, - 1008 - ], - [ - 227, - 1008 - ] - ], - "text": "affect" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 294, - "y": 986 - }, - "confidence": 1, - "points": [ - [ - 294, - 986 - ], - [ - 330, - 986 - ], - [ - 330, - 1008 - ], - [ - 294, - 1008 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 141, - "x": 338, - "y": 986 - }, - "confidence": 1, - "points": [ - [ - 338, - 986 - ], - [ - 479, - 986 - ], - [ - 479, - 1013 - ], - [ - 338, - 1013 - ] - ], - "text": "marketability" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 488, - "y": 986 - }, - "confidence": 1, - "points": [ - [ - 488, - 986 - ], - [ - 510, - 986 - ], - [ - 510, - 1008 - ], - [ - 488, - 1008 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 516, - "y": 986 - }, - "confidence": 1, - "points": [ - [ - 516, - 986 - ], - [ - 552, - 986 - ], - [ - 552, - 1008 - ], - [ - 516, - 1008 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 111, - "x": 561, - "y": 986 - }, - "confidence": 1, - "points": [ - [ - 561, - 986 - ], - [ - 672, - 986 - ], - [ - 672, - 1013 - ], - [ - 561, - 1013 - ] - ], - "text": "properties" - }, - { - "bounds": { - "height": 22, - "width": 19, - "x": 680, - "y": 986 - }, - "confidence": 1, - "points": [ - [ - 680, - 986 - ], - [ - 699, - 986 - ], - [ - 699, - 1008 - ], - [ - 680, - 1008 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 708, - "y": 986 - }, - "confidence": 1, - "points": [ - [ - 708, - 986 - ], - [ - 744, - 986 - ], - [ - 744, - 1008 - ], - [ - 708, - 1008 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 150, - "x": 752, - "y": 986 - }, - "confidence": 1, - "points": [ - [ - 752, - 986 - ], - [ - 902, - 986 - ], - [ - 902, - 1013 - ], - [ - 752, - 1013 - ] - ], - "text": "neighborhood" - }, - { - "bounds": { - "height": 27, - "width": 108, - "x": 913, - "y": 986 - }, - "confidence": 1, - "points": [ - [ - 913, - 986 - ], - [ - 1021, - 986 - ], - [ - 1021, - 1013 - ], - [ - 913, - 1013 - ] - ], - "text": "(proximity" - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 1027, - "y": 988 - }, - "confidence": 1, - "points": [ - [ - 1027, - 988 - ], - [ - 1049, - 988 - ], - [ - 1049, - 1007 - ], - [ - 1027, - 1007 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 27, - "width": 136, - "x": 1058, - "y": 986 - }, - "confidence": 1, - "points": [ - [ - 1058, - 986 - ], - [ - 1194, - 986 - ], - [ - 1194, - 1013 - ], - [ - 1058, - 1013 - ] - ], - "text": "employment" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 1200, - "y": 986 - }, - "confidence": 1, - "points": [ - [ - 1200, - 986 - ], - [ - 1241, - 986 - ], - [ - 1241, - 1008 - ], - [ - 1200, - 1008 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 25, - "width": 113, - "x": 1250, - "y": 986 - }, - "confidence": 1, - "points": [ - [ - 1250, - 986 - ], - [ - 1363, - 986 - ], - [ - 1363, - 1011 - ], - [ - 1250, - 1011 - ] - ], - "text": "amenities," - }, - { - "bounds": { - "height": 27, - "width": 136, - "x": 1372, - "y": 986 - }, - "confidence": 1, - "points": [ - [ - 1372, - 986 - ], - [ - 1508, - 986 - ], - [ - 1508, - 1013 - ], - [ - 1372, - 1013 - ] - ], - "text": "employment" - }, - { - "bounds": { - "height": 27, - "width": 86, - "x": 1516, - "y": 986 - }, - "confidence": 1, - "points": [ - [ - 1516, - 986 - ], - [ - 1602, - 986 - ], - [ - 1602, - 1013 - ], - [ - 1516, - 1013 - ] - ], - "text": "stability," - }, - { - "bounds": { - "height": 27, - "width": 75, - "x": 86, - "y": 1016 - }, - "confidence": 1, - "points": [ - [ - 86, - 1016 - ], - [ - 161, - 1016 - ], - [ - 161, - 1043 - ], - [ - 86, - 1043 - ] - ], - "text": "appeal" - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 166, - "y": 1019 - }, - "confidence": 1, - "points": [ - [ - 166, - 1019 - ], - [ - 188, - 1019 - ], - [ - 188, - 1038 - ], - [ - 166, - 1038 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 25, - "width": 80, - "x": 197, - "y": 1016 - }, - "confidence": 1, - "points": [ - [ - 197, - 1016 - ], - [ - 277, - 1016 - ], - [ - 277, - 1041 - ], - [ - 197, - 1041 - ] - ], - "text": "market," - }, - { - "bounds": { - "height": 27, - "width": 55, - "x": 286, - "y": 1016 - }, - "confidence": 1, - "points": [ - [ - 286, - 1016 - ], - [ - 341, - 1016 - ], - [ - 341, - 1043 - ], - [ - 286, - 1043 - ] - ], - "text": "etc.):" - }, - { - "bounds": { - "height": 2, - "width": 1255, - "x": 352, - "y": 1038 - }, - "confidence": 1, - "points": [ - [ - 352, - 1038 - ], - [ - 1607, - 1038 - ], - [ - 1607, - 1040 - ], - [ - 352, - 1040 - ] - ], - "text": "__________________________________________________________________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -10757,8 +2508,9 @@ "x": 85.37959, "y": 1049.8269 }, + "cells": null, "confidence": 0.91563004, - "id": "84c2f8ec-2d60-4ffc-8918-33bf59aab021", + "id": "f8faa9ca-c6ec-4c2c-b008-6ab1835b33e0", "page": { "height": 2200, "pageIndex": 0, @@ -10786,2809 +2538,7 @@ "readingOrder": 65, "role": "Text", "text": "competing listings within the immediate subject neighborhood were found to be materially superior or inferior; market conditions have been stable with No_____________________________________________________________________________________________________________\nThe following available listings represent the most current, similar, and proximate competitive properties to the subject property in the\nsubject neighborhood. This analysis is intended to evaluate the inventory currently on the market competing with the subject property in the\nsubject neighborhood and recent price and marketing time trends affecting the subject property. (Listings outside the subject neighborhood\nare not considered applicable) The listing comparables can be the rental or sale comparables if they are currently for sale.", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 105, - "x": 124, - "y": 1050 - }, - "confidence": 1, - "points": [ - [ - 124, - 1050 - ], - [ - 229, - 1050 - ], - [ - 229, - 1077 - ], - [ - 124, - 1077 - ] - ], - "text": "competing" - }, - { - "bounds": { - "height": 27, - "width": 66, - "x": 238, - "y": 1050 - }, - "confidence": 1, - "points": [ - [ - 238, - 1050 - ], - [ - 304, - 1050 - ], - [ - 304, - 1077 - ], - [ - 238, - 1077 - ] - ], - "text": "listings" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 311, - "y": 1050 - }, - "confidence": 1, - "points": [ - [ - 311, - 1050 - ], - [ - 372, - 1050 - ], - [ - 372, - 1072 - ], - [ - 311, - 1072 - ] - ], - "text": "within" - }, - { - "bounds": { - "height": 22, - "width": 33, - "x": 377, - "y": 1050 - }, - "confidence": 1, - "points": [ - [ - 377, - 1050 - ], - [ - 410, - 1050 - ], - [ - 410, - 1072 - ], - [ - 377, - 1072 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 105, - "x": 416, - "y": 1050 - }, - "confidence": 1, - "points": [ - [ - 416, - 1050 - ], - [ - 521, - 1050 - ], - [ - 521, - 1072 - ], - [ - 416, - 1072 - ] - ], - "text": "immediate" - }, - { - "bounds": { - "height": 27, - "width": 75, - "x": 527, - "y": 1050 - }, - "confidence": 1, - "points": [ - [ - 527, - 1050 - ], - [ - 602, - 1050 - ], - [ - 602, - 1077 - ], - [ - 527, - 1077 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 27, - "width": 138, - "x": 608, - "y": 1050 - }, - "confidence": 1, - "points": [ - [ - 608, - 1050 - ], - [ - 746, - 1050 - ], - [ - 746, - 1077 - ], - [ - 608, - 1077 - ] - ], - "text": "neighborhood" - }, - { - "bounds": { - "height": 16, - "width": 50, - "x": 752, - "y": 1055 - }, - "confidence": 1, - "points": [ - [ - 752, - 1055 - ], - [ - 802, - 1055 - ], - [ - 802, - 1071 - ], - [ - 752, - 1071 - ] - ], - "text": "were" - }, - { - "bounds": { - "height": 22, - "width": 58, - "x": 808, - "y": 1050 - }, - "confidence": 1, - "points": [ - [ - 808, - 1050 - ], - [ - 866, - 1050 - ], - [ - 866, - 1072 - ], - [ - 808, - 1072 - ] - ], - "text": "found" - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 872, - "y": 1052 - }, - "confidence": 1, - "points": [ - [ - 872, - 1052 - ], - [ - 894, - 1052 - ], - [ - 894, - 1071 - ], - [ - 872, - 1071 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 22, - "width": 25, - "x": 899, - "y": 1050 - }, - "confidence": 1, - "points": [ - [ - 899, - 1050 - ], - [ - 924, - 1050 - ], - [ - 924, - 1072 - ], - [ - 899, - 1072 - ] - ], - "text": "be" - }, - { - "bounds": { - "height": 27, - "width": 100, - "x": 930, - "y": 1050 - }, - "confidence": 1, - "points": [ - [ - 930, - 1050 - ], - [ - 1030, - 1050 - ], - [ - 1030, - 1077 - ], - [ - 930, - 1077 - ] - ], - "text": "materially" - }, - { - "bounds": { - "height": 27, - "width": 86, - "x": 1036, - "y": 1050 - }, - "confidence": 1, - "points": [ - [ - 1036, - 1050 - ], - [ - 1122, - 1050 - ], - [ - 1122, - 1077 - ], - [ - 1036, - 1077 - ] - ], - "text": "superior" - }, - { - "bounds": { - "height": 16, - "width": 22, - "x": 1125, - "y": 1055 - }, - "confidence": 1, - "points": [ - [ - 1125, - 1055 - ], - [ - 1147, - 1055 - ], - [ - 1147, - 1071 - ], - [ - 1125, - 1071 - ] - ], - "text": "or" - }, - { - "bounds": { - "height": 25, - "width": 75, - "x": 1152, - "y": 1050 - }, - "confidence": 1, - "points": [ - [ - 1152, - 1050 - ], - [ - 1227, - 1050 - ], - [ - 1227, - 1075 - ], - [ - 1152, - 1075 - ] - ], - "text": "inferior;" - }, - { - "bounds": { - "height": 22, - "width": 69, - "x": 1236, - "y": 1050 - }, - "confidence": 1, - "points": [ - [ - 1236, - 1050 - ], - [ - 1305, - 1050 - ], - [ - 1305, - 1072 - ], - [ - 1236, - 1072 - ] - ], - "text": "market" - }, - { - "bounds": { - "height": 22, - "width": 102, - "x": 1311, - "y": 1050 - }, - "confidence": 1, - "points": [ - [ - 1311, - 1050 - ], - [ - 1413, - 1050 - ], - [ - 1413, - 1072 - ], - [ - 1311, - 1072 - ] - ], - "text": "conditions" - }, - { - "bounds": { - "height": 22, - "width": 47, - "x": 1422, - "y": 1050 - }, - "confidence": 1, - "points": [ - [ - 1422, - 1050 - ], - [ - 1469, - 1050 - ], - [ - 1469, - 1072 - ], - [ - 1422, - 1072 - ] - ], - "text": "have" - }, - { - "bounds": { - "height": 22, - "width": 50, - "x": 1477, - "y": 1050 - }, - "confidence": 1, - "points": [ - [ - 1477, - 1050 - ], - [ - 1527, - 1050 - ], - [ - 1527, - 1072 - ], - [ - 1477, - 1072 - ] - ], - "text": "been" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 1533, - "y": 1050 - }, - "confidence": 1, - "points": [ - [ - 1533, - 1050 - ], - [ - 1594, - 1050 - ], - [ - 1594, - 1072 - ], - [ - 1533, - 1072 - ] - ], - "text": "stable" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 1600, - "y": 1050 - }, - "confidence": 1, - "points": [ - [ - 1600, - 1050 - ], - [ - 1641, - 1050 - ], - [ - 1641, - 1072 - ], - [ - 1600, - 1072 - ] - ], - "text": "with" - }, - { - "bounds": { - "height": 19, - "width": 1519, - "x": 88, - "y": 1052 - }, - "confidence": 1, - "points": [ - [ - 88, - 1052 - ], - [ - 1607, - 1052 - ], - [ - 1607, - 1071 - ], - [ - 88, - 1071 - ] - ], - "text": "No_____________________________________________________________________________________________________________" - }, - { - "bounds": { - "height": 22, - "width": 44, - "x": 86, - "y": 1077 - }, - "confidence": 1, - "points": [ - [ - 86, - 1077 - ], - [ - 130, - 1077 - ], - [ - 130, - 1099 - ], - [ - 86, - 1099 - ] - ], - "text": "The" - }, - { - "bounds": { - "height": 25, - "width": 94, - "x": 138, - "y": 1077 - }, - "confidence": 1, - "points": [ - [ - 138, - 1077 - ], - [ - 232, - 1077 - ], - [ - 232, - 1102 - ], - [ - 138, - 1102 - ] - ], - "text": "following" - }, - { - "bounds": { - "height": 22, - "width": 97, - "x": 244, - "y": 1077 - }, - "confidence": 1, - "points": [ - [ - 244, - 1077 - ], - [ - 341, - 1077 - ], - [ - 341, - 1099 - ], - [ - 244, - 1099 - ] - ], - "text": "available" - }, - { - "bounds": { - "height": 25, - "width": 75, - "x": 350, - "y": 1077 - }, - "confidence": 1, - "points": [ - [ - 350, - 1077 - ], - [ - 425, - 1077 - ], - [ - 425, - 1102 - ], - [ - 350, - 1102 - ] - ], - "text": "listings" - }, - { - "bounds": { - "height": 25, - "width": 105, - "x": 433, - "y": 1077 - }, - "confidence": 1, - "points": [ - [ - 433, - 1077 - ], - [ - 538, - 1077 - ], - [ - 538, - 1102 - ], - [ - 433, - 1102 - ] - ], - "text": "represent" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 547, - "y": 1077 - }, - "confidence": 1, - "points": [ - [ - 547, - 1077 - ], - [ - 583, - 1077 - ], - [ - 583, - 1099 - ], - [ - 547, - 1099 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 52, - "x": 591, - "y": 1077 - }, - "confidence": 1, - "points": [ - [ - 591, - 1077 - ], - [ - 643, - 1077 - ], - [ - 643, - 1099 - ], - [ - 591, - 1099 - ] - ], - "text": "most" - }, - { - "bounds": { - "height": 25, - "width": 83, - "x": 652, - "y": 1077 - }, - "confidence": 1, - "points": [ - [ - 652, - 1077 - ], - [ - 735, - 1077 - ], - [ - 735, - 1102 - ], - [ - 652, - 1102 - ] - ], - "text": "current," - }, - { - "bounds": { - "height": 25, - "width": 77, - "x": 747, - "y": 1077 - }, - "confidence": 1, - "points": [ - [ - 747, - 1077 - ], - [ - 824, - 1077 - ], - [ - 824, - 1102 - ], - [ - 747, - 1102 - ] - ], - "text": "similar," - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 833, - "y": 1077 - }, - "confidence": 1, - "points": [ - [ - 833, - 1077 - ], - [ - 874, - 1077 - ], - [ - 874, - 1099 - ], - [ - 833, - 1099 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 25, - "width": 108, - "x": 883, - "y": 1077 - }, - "confidence": 1, - "points": [ - [ - 883, - 1077 - ], - [ - 991, - 1077 - ], - [ - 991, - 1102 - ], - [ - 883, - 1102 - ] - ], - "text": "proximate" - }, - { - "bounds": { - "height": 25, - "width": 127, - "x": 999, - "y": 1077 - }, - "confidence": 1, - "points": [ - [ - 999, - 1077 - ], - [ - 1126, - 1077 - ], - [ - 1126, - 1102 - ], - [ - 999, - 1102 - ] - ], - "text": "competitive" - }, - { - "bounds": { - "height": 25, - "width": 113, - "x": 1133, - "y": 1077 - }, - "confidence": 1, - "points": [ - [ - 1133, - 1077 - ], - [ - 1246, - 1077 - ], - [ - 1246, - 1102 - ], - [ - 1133, - 1102 - ] - ], - "text": "properties" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 1252, - "y": 1077 - }, - "confidence": 1, - "points": [ - [ - 1252, - 1077 - ], - [ - 1274, - 1077 - ], - [ - 1274, - 1099 - ], - [ - 1252, - 1099 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1283, - "y": 1077 - }, - "confidence": 1, - "points": [ - [ - 1283, - 1077 - ], - [ - 1319, - 1077 - ], - [ - 1319, - 1099 - ], - [ - 1283, - 1099 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 25, - "width": 80, - "x": 1327, - "y": 1077 - }, - "confidence": 1, - "points": [ - [ - 1327, - 1077 - ], - [ - 1407, - 1077 - ], - [ - 1407, - 1102 - ], - [ - 1327, - 1102 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 25, - "width": 94, - "x": 1413, - "y": 1077 - }, - "confidence": 1, - "points": [ - [ - 1413, - 1077 - ], - [ - 1507, - 1077 - ], - [ - 1507, - 1102 - ], - [ - 1413, - 1102 - ] - ], - "text": "property" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1516, - "y": 1077 - }, - "confidence": 1, - "points": [ - [ - 1516, - 1077 - ], - [ - 1535, - 1077 - ], - [ - 1535, - 1096 - ], - [ - 1516, - 1096 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1544, - "y": 1077 - }, - "confidence": 1, - "points": [ - [ - 1544, - 1077 - ], - [ - 1580, - 1077 - ], - [ - 1580, - 1099 - ], - [ - 1544, - 1099 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 25, - "width": 80, - "x": 86, - "y": 1108 - }, - "confidence": 1, - "points": [ - [ - 86, - 1108 - ], - [ - 166, - 1108 - ], - [ - 166, - 1133 - ], - [ - 86, - 1133 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 25, - "width": 158, - "x": 175, - "y": 1108 - }, - "confidence": 1, - "points": [ - [ - 175, - 1108 - ], - [ - 333, - 1108 - ], - [ - 333, - 1133 - ], - [ - 175, - 1133 - ] - ], - "text": "neighborhood." - }, - { - "bounds": { - "height": 19, - "width": 50, - "x": 338, - "y": 1108 - }, - "confidence": 1, - "points": [ - [ - 338, - 1108 - ], - [ - 388, - 1108 - ], - [ - 388, - 1127 - ], - [ - 338, - 1127 - ] - ], - "text": "This" - }, - { - "bounds": { - "height": 25, - "width": 91, - "x": 394, - "y": 1108 - }, - "confidence": 1, - "points": [ - [ - 394, - 1108 - ], - [ - 485, - 1108 - ], - [ - 485, - 1133 - ], - [ - 394, - 1133 - ] - ], - "text": "analysis" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 494, - "y": 1108 - }, - "confidence": 1, - "points": [ - [ - 494, - 1108 - ], - [ - 513, - 1108 - ], - [ - 513, - 1127 - ], - [ - 494, - 1127 - ] - ], - "text": "is" - }, - { - "bounds": { - "height": 19, - "width": 94, - "x": 522, - "y": 1108 - }, - "confidence": 1, - "points": [ - [ - 522, - 1108 - ], - [ - 616, - 1108 - ], - [ - 616, - 1127 - ], - [ - 522, - 1127 - ] - ], - "text": "intended" - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 625, - "y": 1108 - }, - "confidence": 1, - "points": [ - [ - 625, - 1108 - ], - [ - 647, - 1108 - ], - [ - 647, - 1127 - ], - [ - 625, - 1127 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 19, - "width": 94, - "x": 652, - "y": 1108 - }, - "confidence": 1, - "points": [ - [ - 652, - 1108 - ], - [ - 746, - 1108 - ], - [ - 746, - 1127 - ], - [ - 652, - 1127 - ] - ], - "text": "evaluate" - }, - { - "bounds": { - "height": 19, - "width": 36, - "x": 755, - "y": 1108 - }, - "confidence": 1, - "points": [ - [ - 755, - 1108 - ], - [ - 791, - 1108 - ], - [ - 791, - 1127 - ], - [ - 755, - 1127 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 25, - "width": 102, - "x": 797, - "y": 1108 - }, - "confidence": 1, - "points": [ - [ - 797, - 1108 - ], - [ - 899, - 1108 - ], - [ - 899, - 1133 - ], - [ - 797, - 1133 - ] - ], - "text": "inventory" - }, - { - "bounds": { - "height": 25, - "width": 97, - "x": 908, - "y": 1108 - }, - "confidence": 1, - "points": [ - [ - 908, - 1108 - ], - [ - 1005, - 1108 - ], - [ - 1005, - 1133 - ], - [ - 908, - 1133 - ] - ], - "text": "currently" - }, - { - "bounds": { - "height": 16, - "width": 27, - "x": 1011, - "y": 1111 - }, - "confidence": 1, - "points": [ - [ - 1011, - 1111 - ], - [ - 1038, - 1111 - ], - [ - 1038, - 1127 - ], - [ - 1011, - 1127 - ] - ], - "text": "on" - }, - { - "bounds": { - "height": 19, - "width": 36, - "x": 1047, - "y": 1108 - }, - "confidence": 1, - "points": [ - [ - 1047, - 1108 - ], - [ - 1083, - 1108 - ], - [ - 1083, - 1127 - ], - [ - 1047, - 1127 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 19, - "width": 77, - "x": 1091, - "y": 1108 - }, - "confidence": 1, - "points": [ - [ - 1091, - 1108 - ], - [ - 1168, - 1108 - ], - [ - 1168, - 1127 - ], - [ - 1091, - 1127 - ] - ], - "text": "market" - }, - { - "bounds": { - "height": 25, - "width": 116, - "x": 1175, - "y": 1108 - }, - "confidence": 1, - "points": [ - [ - 1175, - 1108 - ], - [ - 1291, - 1108 - ], - [ - 1291, - 1133 - ], - [ - 1175, - 1133 - ] - ], - "text": "competing" - }, - { - "bounds": { - "height": 19, - "width": 47, - "x": 1297, - "y": 1108 - }, - "confidence": 1, - "points": [ - [ - 1297, - 1108 - ], - [ - 1344, - 1108 - ], - [ - 1344, - 1127 - ], - [ - 1297, - 1127 - ] - ], - "text": "with" - }, - { - "bounds": { - "height": 19, - "width": 36, - "x": 1350, - "y": 1108 - }, - "confidence": 1, - "points": [ - [ - 1350, - 1108 - ], - [ - 1386, - 1108 - ], - [ - 1386, - 1127 - ], - [ - 1350, - 1127 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 25, - "width": 80, - "x": 1394, - "y": 1108 - }, - "confidence": 1, - "points": [ - [ - 1394, - 1108 - ], - [ - 1474, - 1108 - ], - [ - 1474, - 1133 - ], - [ - 1394, - 1133 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 25, - "width": 91, - "x": 1483, - "y": 1108 - }, - "confidence": 1, - "points": [ - [ - 1483, - 1108 - ], - [ - 1574, - 1108 - ], - [ - 1574, - 1133 - ], - [ - 1483, - 1133 - ] - ], - "text": "property" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1583, - "y": 1108 - }, - "confidence": 1, - "points": [ - [ - 1583, - 1108 - ], - [ - 1602, - 1108 - ], - [ - 1602, - 1127 - ], - [ - 1583, - 1127 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 19, - "width": 36, - "x": 1611, - "y": 1108 - }, - "confidence": 1, - "points": [ - [ - 1611, - 1108 - ], - [ - 1647, - 1108 - ], - [ - 1647, - 1127 - ], - [ - 1611, - 1127 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 80, - "x": 86, - "y": 1136 - }, - "confidence": 1, - "points": [ - [ - 86, - 1136 - ], - [ - 166, - 1136 - ], - [ - 166, - 1163 - ], - [ - 86, - 1163 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 27, - "width": 152, - "x": 175, - "y": 1136 - }, - "confidence": 1, - "points": [ - [ - 175, - 1136 - ], - [ - 327, - 1136 - ], - [ - 327, - 1163 - ], - [ - 175, - 1163 - ] - ], - "text": "neighborhood" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 336, - "y": 1136 - }, - "confidence": 1, - "points": [ - [ - 336, - 1136 - ], - [ - 377, - 1136 - ], - [ - 377, - 1158 - ], - [ - 336, - 1158 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 19, - "width": 72, - "x": 386, - "y": 1138 - }, - "confidence": 1, - "points": [ - [ - 386, - 1138 - ], - [ - 458, - 1138 - ], - [ - 458, - 1157 - ], - [ - 386, - 1157 - ] - ], - "text": "recent" - }, - { - "bounds": { - "height": 27, - "width": 52, - "x": 466, - "y": 1136 - }, - "confidence": 1, - "points": [ - [ - 466, - 1136 - ], - [ - 518, - 1136 - ], - [ - 518, - 1163 - ], - [ - 466, - 1163 - ] - ], - "text": "price" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 527, - "y": 1136 - }, - "confidence": 1, - "points": [ - [ - 527, - 1136 - ], - [ - 568, - 1136 - ], - [ - 568, - 1158 - ], - [ - 527, - 1158 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 27, - "width": 108, - "x": 580, - "y": 1136 - }, - "confidence": 1, - "points": [ - [ - 580, - 1136 - ], - [ - 688, - 1136 - ], - [ - 688, - 1163 - ], - [ - 580, - 1163 - ] - ], - "text": "marketing" - }, - { - "bounds": { - "height": 22, - "width": 47, - "x": 697, - "y": 1136 - }, - "confidence": 1, - "points": [ - [ - 697, - 1136 - ], - [ - 744, - 1136 - ], - [ - 744, - 1158 - ], - [ - 697, - 1158 - ] - ], - "text": "time" - }, - { - "bounds": { - "height": 22, - "width": 72, - "x": 752, - "y": 1136 - }, - "confidence": 1, - "points": [ - [ - 752, - 1136 - ], - [ - 824, - 1136 - ], - [ - 824, - 1158 - ], - [ - 752, - 1158 - ] - ], - "text": "trends" - }, - { - "bounds": { - "height": 27, - "width": 94, - "x": 830, - "y": 1136 - }, - "confidence": 1, - "points": [ - [ - 830, - 1136 - ], - [ - 924, - 1136 - ], - [ - 924, - 1163 - ], - [ - 830, - 1163 - ] - ], - "text": "affecting" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 933, - "y": 1136 - }, - "confidence": 1, - "points": [ - [ - 933, - 1136 - ], - [ - 969, - 1136 - ], - [ - 969, - 1158 - ], - [ - 933, - 1158 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 80, - "x": 977, - "y": 1136 - }, - "confidence": 1, - "points": [ - [ - 977, - 1136 - ], - [ - 1057, - 1136 - ], - [ - 1057, - 1163 - ], - [ - 977, - 1163 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 25, - "width": 94, - "x": 1066, - "y": 1138 - }, - "confidence": 1, - "points": [ - [ - 1066, - 1138 - ], - [ - 1160, - 1138 - ], - [ - 1160, - 1163 - ], - [ - 1066, - 1163 - ] - ], - "text": "property." - }, - { - "bounds": { - "height": 27, - "width": 94, - "x": 1169, - "y": 1136 - }, - "confidence": 1, - "points": [ - [ - 1169, - 1136 - ], - [ - 1263, - 1136 - ], - [ - 1263, - 1163 - ], - [ - 1169, - 1163 - ] - ], - "text": "(Listings" - }, - { - "bounds": { - "height": 22, - "width": 80, - "x": 1272, - "y": 1136 - }, - "confidence": 1, - "points": [ - [ - 1272, - 1136 - ], - [ - 1352, - 1136 - ], - [ - 1352, - 1158 - ], - [ - 1272, - 1158 - ] - ], - "text": "outside" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1361, - "y": 1136 - }, - "confidence": 1, - "points": [ - [ - 1361, - 1136 - ], - [ - 1397, - 1136 - ], - [ - 1397, - 1158 - ], - [ - 1361, - 1158 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 80, - "x": 1405, - "y": 1136 - }, - "confidence": 1, - "points": [ - [ - 1405, - 1136 - ], - [ - 1485, - 1136 - ], - [ - 1485, - 1163 - ], - [ - 1405, - 1163 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 27, - "width": 150, - "x": 1494, - "y": 1136 - }, - "confidence": 1, - "points": [ - [ - 1494, - 1136 - ], - [ - 1644, - 1136 - ], - [ - 1644, - 1163 - ], - [ - 1494, - 1163 - ] - ], - "text": "neighborhood" - }, - { - "bounds": { - "height": 16, - "width": 38, - "x": 86, - "y": 1172 - }, - "confidence": 1, - "points": [ - [ - 86, - 1172 - ], - [ - 124, - 1172 - ], - [ - 124, - 1188 - ], - [ - 86, - 1188 - ] - ], - "text": "are" - }, - { - "bounds": { - "height": 19, - "width": 33, - "x": 133, - "y": 1169 - }, - "confidence": 1, - "points": [ - [ - 133, - 1169 - ], - [ - 166, - 1169 - ], - [ - 166, - 1188 - ], - [ - 133, - 1188 - ] - ], - "text": "not" - }, - { - "bounds": { - "height": 22, - "width": 122, - "x": 175, - "y": 1166 - }, - "confidence": 1, - "points": [ - [ - 175, - 1166 - ], - [ - 297, - 1166 - ], - [ - 297, - 1188 - ], - [ - 175, - 1188 - ] - ], - "text": "considered" - }, - { - "bounds": { - "height": 27, - "width": 119, - "x": 305, - "y": 1166 - }, - "confidence": 1, - "points": [ - [ - 305, - 1166 - ], - [ - 424, - 1166 - ], - [ - 424, - 1193 - ], - [ - 305, - 1193 - ] - ], - "text": "applicable)" - }, - { - "bounds": { - "height": 22, - "width": 44, - "x": 433, - "y": 1166 - }, - "confidence": 1, - "points": [ - [ - 433, - 1166 - ], - [ - 477, - 1166 - ], - [ - 477, - 1188 - ], - [ - 433, - 1188 - ] - ], - "text": "The" - }, - { - "bounds": { - "height": 27, - "width": 63, - "x": 486, - "y": 1166 - }, - "confidence": 1, - "points": [ - [ - 486, - 1166 - ], - [ - 549, - 1166 - ], - [ - 549, - 1193 - ], - [ - 486, - 1193 - ] - ], - "text": "listing" - }, - { - "bounds": { - "height": 27, - "width": 141, - "x": 558, - "y": 1166 - }, - "confidence": 1, - "points": [ - [ - 558, - 1166 - ], - [ - 699, - 1166 - ], - [ - 699, - 1193 - ], - [ - 558, - 1193 - ] - ], - "text": "comparables" - }, - { - "bounds": { - "height": 16, - "width": 38, - "x": 708, - "y": 1172 - }, - "confidence": 1, - "points": [ - [ - 708, - 1172 - ], - [ - 746, - 1172 - ], - [ - 746, - 1188 - ], - [ - 708, - 1188 - ] - ], - "text": "can" - }, - { - "bounds": { - "height": 22, - "width": 27, - "x": 758, - "y": 1166 - }, - "confidence": 1, - "points": [ - [ - 758, - 1166 - ], - [ - 785, - 1166 - ], - [ - 785, - 1188 - ], - [ - 758, - 1188 - ] - ], - "text": "be" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 791, - "y": 1166 - }, - "confidence": 1, - "points": [ - [ - 791, - 1166 - ], - [ - 827, - 1166 - ], - [ - 827, - 1188 - ], - [ - 791, - 1188 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 63, - "x": 836, - "y": 1166 - }, - "confidence": 1, - "points": [ - [ - 836, - 1166 - ], - [ - 899, - 1166 - ], - [ - 899, - 1188 - ], - [ - 836, - 1188 - ] - ], - "text": "rental" - }, - { - "bounds": { - "height": 16, - "width": 22, - "x": 908, - "y": 1172 - }, - "confidence": 1, - "points": [ - [ - 908, - 1172 - ], - [ - 930, - 1172 - ], - [ - 930, - 1188 - ], - [ - 908, - 1188 - ] - ], - "text": "or" - }, - { - "bounds": { - "height": 22, - "width": 47, - "x": 938, - "y": 1166 - }, - "confidence": 1, - "points": [ - [ - 938, - 1166 - ], - [ - 985, - 1166 - ], - [ - 985, - 1188 - ], - [ - 938, - 1188 - ] - ], - "text": "sale" - }, - { - "bounds": { - "height": 27, - "width": 144, - "x": 991, - "y": 1166 - }, - "confidence": 1, - "points": [ - [ - 991, - 1166 - ], - [ - 1135, - 1166 - ], - [ - 1135, - 1193 - ], - [ - 991, - 1193 - ] - ], - "text": "comparables" - }, - { - "bounds": { - "height": 22, - "width": 13, - "x": 1144, - "y": 1166 - }, - "confidence": 1, - "points": [ - [ - 1144, - 1166 - ], - [ - 1157, - 1166 - ], - [ - 1157, - 1188 - ], - [ - 1144, - 1188 - ] - ], - "text": "if" - }, - { - "bounds": { - "height": 27, - "width": 47, - "x": 1163, - "y": 1166 - }, - "confidence": 1, - "points": [ - [ - 1163, - 1166 - ], - [ - 1210, - 1166 - ], - [ - 1210, - 1193 - ], - [ - 1163, - 1193 - ] - ], - "text": "they" - }, - { - "bounds": { - "height": 16, - "width": 36, - "x": 1219, - "y": 1172 - }, - "confidence": 1, - "points": [ - [ - 1219, - 1172 - ], - [ - 1255, - 1172 - ], - [ - 1255, - 1188 - ], - [ - 1219, - 1188 - ] - ], - "text": "are" - }, - { - "bounds": { - "height": 27, - "width": 97, - "x": 1263, - "y": 1166 - }, - "confidence": 1, - "points": [ - [ - 1263, - 1166 - ], - [ - 1360, - 1166 - ], - [ - 1360, - 1193 - ], - [ - 1263, - 1193 - ] - ], - "text": "currently" - }, - { - "bounds": { - "height": 22, - "width": 30, - "x": 1369, - "y": 1166 - }, - "confidence": 1, - "points": [ - [ - 1369, - 1166 - ], - [ - 1399, - 1166 - ], - [ - 1399, - 1188 - ], - [ - 1369, - 1188 - ] - ], - "text": "for" - }, - { - "bounds": { - "height": 22, - "width": 52, - "x": 1405, - "y": 1166 - }, - "confidence": 1, - "points": [ - [ - 1405, - 1166 - ], - [ - 1457, - 1166 - ], - [ - 1457, - 1188 - ], - [ - 1405, - 1188 - ] - ], - "text": "sale." - } - ] + "type": "paragraph" }, { "bounds": { @@ -13597,8 +2547,9 @@ "x": 86, "y": 1466 }, + "cells": null, "confidence": 0.8691046, - "id": "c90e5f58-b7c1-4c06-b514-4dcb196caa0c", + "id": "de6e5df1-8a77-4b29-8abd-a242cf71c08f", "page": { "height": 2200, "pageIndex": 0, @@ -13626,177 +2577,7 @@ "readingOrder": 66, "role": "Text", "text": "Comparison of listings to subject propert:", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 136, - "x": 86, - "y": 1466 - }, - "confidence": 1, - "points": [ - [ - 86, - 1466 - ], - [ - 222, - 1466 - ], - [ - 222, - 1493 - ], - [ - 86, - 1493 - ] - ], - "text": "Comparison" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 230, - "y": 1466 - }, - "confidence": 1, - "points": [ - [ - 230, - 1466 - ], - [ - 252, - 1466 - ], - [ - 252, - 1488 - ], - [ - 230, - 1488 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 27, - "width": 77, - "x": 258, - "y": 1466 - }, - "confidence": 1, - "points": [ - [ - 258, - 1466 - ], - [ - 335, - 1466 - ], - [ - 335, - 1493 - ], - [ - 258, - 1493 - ] - ], - "text": "listings" - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 341, - "y": 1469 - }, - "confidence": 1, - "points": [ - [ - 341, - 1469 - ], - [ - 363, - 1469 - ], - [ - 363, - 1488 - ], - [ - 341, - 1488 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 27, - "width": 80, - "x": 372, - "y": 1466 - }, - "confidence": 1, - "points": [ - [ - 372, - 1466 - ], - [ - 452, - 1466 - ], - [ - 452, - 1493 - ], - [ - 372, - 1493 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 25, - "width": 86, - "x": 458, - "y": 1469 - }, - "confidence": 1, - "points": [ - [ - 458, - 1469 - ], - [ - 544, - 1469 - ], - [ - 544, - 1494 - ], - [ - 458, - 1494 - ] - ], - "text": "propert:" - } - ] + "type": "paragraph" }, { "bounds": { @@ -13805,8 +2586,9 @@ "x": 84.77426, "y": 1525.7681 }, + "cells": null, "confidence": 0.94679344, - "id": "77f4125d-2741-4efa-8910-eb9cfedea410", + "id": "7adf6082-1b57-4a24-aef1-c34ee319a7a1", "page": { "height": 2200, "pageIndex": 0, @@ -13834,1717 +2616,7 @@ "readingOrder": 67, "role": "Text", "text": "Market conditions that affect 2-4 family properties in the subject neighborhood (including the above neighborhood indicators of growth\nrate, property values, demand/supply, and marketing time) and the prevalence and impact in the subject market area regarding loan\ndiscounts, interest buydowns and concessions, and identification of trends in listing prices, average days on market and any change over\npast year, etc.: _________________________________________________________________________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 75, - "x": 88, - "y": 1527 - }, - "confidence": 1, - "points": [ - [ - 88, - 1527 - ], - [ - 163, - 1527 - ], - [ - 163, - 1549 - ], - [ - 88, - 1549 - ] - ], - "text": "Market" - }, - { - "bounds": { - "height": 22, - "width": 113, - "x": 172, - "y": 1527 - }, - "confidence": 1, - "points": [ - [ - 172, - 1527 - ], - [ - 285, - 1527 - ], - [ - 285, - 1549 - ], - [ - 172, - 1549 - ] - ], - "text": "conditions" - }, - { - "bounds": { - "height": 22, - "width": 44, - "x": 291, - "y": 1527 - }, - "confidence": 1, - "points": [ - [ - 291, - 1527 - ], - [ - 335, - 1527 - ], - [ - 335, - 1549 - ], - [ - 291, - 1549 - ] - ], - "text": "that" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 344, - "y": 1527 - }, - "confidence": 1, - "points": [ - [ - 344, - 1527 - ], - [ - 405, - 1527 - ], - [ - 405, - 1549 - ], - [ - 344, - 1549 - ] - ], - "text": "affect" - }, - { - "bounds": { - "height": 19, - "width": 36, - "x": 413, - "y": 1527 - }, - "confidence": 1, - "points": [ - [ - 413, - 1527 - ], - [ - 449, - 1527 - ], - [ - 449, - 1546 - ], - [ - 413, - 1546 - ] - ], - "text": "2-4" - }, - { - "bounds": { - "height": 25, - "width": 66, - "x": 458, - "y": 1527 - }, - "confidence": 1, - "points": [ - [ - 458, - 1527 - ], - [ - 524, - 1527 - ], - [ - 524, - 1552 - ], - [ - 458, - 1552 - ] - ], - "text": "family" - }, - { - "bounds": { - "height": 25, - "width": 111, - "x": 533, - "y": 1527 - }, - "confidence": 1, - "points": [ - [ - 533, - 1527 - ], - [ - 644, - 1527 - ], - [ - 644, - 1552 - ], - [ - 533, - 1552 - ] - ], - "text": "properties" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 652, - "y": 1527 - }, - "confidence": 1, - "points": [ - [ - 652, - 1527 - ], - [ - 671, - 1527 - ], - [ - 671, - 1546 - ], - [ - 652, - 1546 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 680, - "y": 1527 - }, - "confidence": 1, - "points": [ - [ - 680, - 1527 - ], - [ - 716, - 1527 - ], - [ - 716, - 1549 - ], - [ - 680, - 1549 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 25, - "width": 80, - "x": 725, - "y": 1527 - }, - "confidence": 1, - "points": [ - [ - 725, - 1527 - ], - [ - 805, - 1527 - ], - [ - 805, - 1552 - ], - [ - 725, - 1552 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 25, - "width": 152, - "x": 813, - "y": 1527 - }, - "confidence": 1, - "points": [ - [ - 813, - 1527 - ], - [ - 965, - 1527 - ], - [ - 965, - 1552 - ], - [ - 813, - 1552 - ] - ], - "text": "neighborhood" - }, - { - "bounds": { - "height": 25, - "width": 105, - "x": 974, - "y": 1527 - }, - "confidence": 1, - "points": [ - [ - 974, - 1527 - ], - [ - 1079, - 1527 - ], - [ - 1079, - 1552 - ], - [ - 974, - 1552 - ] - ], - "text": "(including" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1088, - "y": 1527 - }, - "confidence": 1, - "points": [ - [ - 1088, - 1527 - ], - [ - 1124, - 1527 - ], - [ - 1124, - 1549 - ], - [ - 1088, - 1549 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 69, - "x": 1133, - "y": 1527 - }, - "confidence": 1, - "points": [ - [ - 1133, - 1527 - ], - [ - 1202, - 1527 - ], - [ - 1202, - 1549 - ], - [ - 1133, - 1549 - ] - ], - "text": "above" - }, - { - "bounds": { - "height": 25, - "width": 152, - "x": 1211, - "y": 1527 - }, - "confidence": 1, - "points": [ - [ - 1211, - 1527 - ], - [ - 1363, - 1527 - ], - [ - 1363, - 1552 - ], - [ - 1211, - 1552 - ] - ], - "text": "neighborhood" - }, - { - "bounds": { - "height": 22, - "width": 108, - "x": 1372, - "y": 1527 - }, - "confidence": 1, - "points": [ - [ - 1372, - 1527 - ], - [ - 1480, - 1527 - ], - [ - 1480, - 1549 - ], - [ - 1372, - 1549 - ] - ], - "text": "indicators" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 1488, - "y": 1527 - }, - "confidence": 1, - "points": [ - [ - 1488, - 1527 - ], - [ - 1510, - 1527 - ], - [ - 1510, - 1549 - ], - [ - 1488, - 1549 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 25, - "width": 75, - "x": 1519, - "y": 1527 - }, - "confidence": 1, - "points": [ - [ - 1519, - 1527 - ], - [ - 1594, - 1527 - ], - [ - 1594, - 1552 - ], - [ - 1519, - 1552 - ] - ], - "text": "growth" - }, - { - "bounds": { - "height": 22, - "width": 47, - "x": 88, - "y": 1558 - }, - "confidence": 1, - "points": [ - [ - 88, - 1558 - ], - [ - 135, - 1558 - ], - [ - 135, - 1580 - ], - [ - 88, - 1580 - ] - ], - "text": "rate," - }, - { - "bounds": { - "height": 25, - "width": 94, - "x": 144, - "y": 1558 - }, - "confidence": 1, - "points": [ - [ - 144, - 1558 - ], - [ - 238, - 1558 - ], - [ - 238, - 1583 - ], - [ - 144, - 1583 - ] - ], - "text": "property" - }, - { - "bounds": { - "height": 22, - "width": 80, - "x": 244, - "y": 1558 - }, - "confidence": 1, - "points": [ - [ - 244, - 1558 - ], - [ - 324, - 1558 - ], - [ - 324, - 1580 - ], - [ - 244, - 1580 - ] - ], - "text": "values," - }, - { - "bounds": { - "height": 25, - "width": 172, - "x": 333, - "y": 1558 - }, - "confidence": 1, - "points": [ - [ - 333, - 1558 - ], - [ - 505, - 1558 - ], - [ - 505, - 1583 - ], - [ - 333, - 1583 - ] - ], - "text": "demand/supply," - }, - { - "bounds": { - "height": 19, - "width": 41, - "x": 516, - "y": 1558 - }, - "confidence": 1, - "points": [ - [ - 516, - 1558 - ], - [ - 557, - 1558 - ], - [ - 557, - 1577 - ], - [ - 516, - 1577 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 25, - "width": 108, - "x": 566, - "y": 1558 - }, - "confidence": 1, - "points": [ - [ - 566, - 1558 - ], - [ - 674, - 1558 - ], - [ - 674, - 1583 - ], - [ - 566, - 1583 - ] - ], - "text": "marketing" - }, - { - "bounds": { - "height": 25, - "width": 55, - "x": 683, - "y": 1558 - }, - "confidence": 1, - "points": [ - [ - 683, - 1558 - ], - [ - 738, - 1558 - ], - [ - 738, - 1583 - ], - [ - 683, - 1583 - ] - ], - "text": "time)" - }, - { - "bounds": { - "height": 19, - "width": 41, - "x": 747, - "y": 1558 - }, - "confidence": 1, - "points": [ - [ - 747, - 1558 - ], - [ - 788, - 1558 - ], - [ - 788, - 1577 - ], - [ - 747, - 1577 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 19, - "width": 36, - "x": 797, - "y": 1558 - }, - "confidence": 1, - "points": [ - [ - 797, - 1558 - ], - [ - 833, - 1558 - ], - [ - 833, - 1577 - ], - [ - 797, - 1577 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 25, - "width": 122, - "x": 841, - "y": 1558 - }, - "confidence": 1, - "points": [ - [ - 841, - 1558 - ], - [ - 963, - 1558 - ], - [ - 963, - 1583 - ], - [ - 841, - 1583 - ] - ], - "text": "prevalence" - }, - { - "bounds": { - "height": 19, - "width": 41, - "x": 972, - "y": 1558 - }, - "confidence": 1, - "points": [ - [ - 972, - 1558 - ], - [ - 1013, - 1558 - ], - [ - 1013, - 1577 - ], - [ - 972, - 1577 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 25, - "width": 75, - "x": 1022, - "y": 1558 - }, - "confidence": 1, - "points": [ - [ - 1022, - 1558 - ], - [ - 1097, - 1558 - ], - [ - 1097, - 1583 - ], - [ - 1022, - 1583 - ] - ], - "text": "impact" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1105, - "y": 1558 - }, - "confidence": 1, - "points": [ - [ - 1105, - 1558 - ], - [ - 1124, - 1558 - ], - [ - 1124, - 1577 - ], - [ - 1105, - 1577 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 19, - "width": 36, - "x": 1130, - "y": 1558 - }, - "confidence": 1, - "points": [ - [ - 1130, - 1558 - ], - [ - 1166, - 1558 - ], - [ - 1166, - 1577 - ], - [ - 1130, - 1577 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 25, - "width": 80, - "x": 1175, - "y": 1558 - }, - "confidence": 1, - "points": [ - [ - 1175, - 1558 - ], - [ - 1255, - 1558 - ], - [ - 1255, - 1583 - ], - [ - 1175, - 1583 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 19, - "width": 77, - "x": 1263, - "y": 1558 - }, - "confidence": 1, - "points": [ - [ - 1263, - 1558 - ], - [ - 1340, - 1558 - ], - [ - 1340, - 1577 - ], - [ - 1263, - 1577 - ] - ], - "text": "market" - }, - { - "bounds": { - "height": 16, - "width": 52, - "x": 1347, - "y": 1561 - }, - "confidence": 1, - "points": [ - [ - 1347, - 1561 - ], - [ - 1399, - 1561 - ], - [ - 1399, - 1577 - ], - [ - 1347, - 1577 - ] - ], - "text": "area" - }, - { - "bounds": { - "height": 25, - "width": 102, - "x": 1408, - "y": 1558 - }, - "confidence": 1, - "points": [ - [ - 1408, - 1558 - ], - [ - 1510, - 1558 - ], - [ - 1510, - 1583 - ], - [ - 1408, - 1583 - ] - ], - "text": "regarding" - }, - { - "bounds": { - "height": 19, - "width": 47, - "x": 1522, - "y": 1558 - }, - "confidence": 1, - "points": [ - [ - 1522, - 1558 - ], - [ - 1569, - 1558 - ], - [ - 1569, - 1577 - ], - [ - 1522, - 1577 - ] - ], - "text": "loan" - }, - { - "bounds": { - "height": 25, - "width": 113, - "x": 86, - "y": 1586 - }, - "confidence": 1, - "points": [ - [ - 86, - 1586 - ], - [ - 199, - 1586 - ], - [ - 199, - 1611 - ], - [ - 86, - 1611 - ] - ], - "text": "discounts," - }, - { - "bounds": { - "height": 22, - "width": 83, - "x": 208, - "y": 1586 - }, - "confidence": 1, - "points": [ - [ - 208, - 1586 - ], - [ - 291, - 1586 - ], - [ - 291, - 1608 - ], - [ - 208, - 1608 - ] - ], - "text": "interest" - }, - { - "bounds": { - "height": 27, - "width": 111, - "x": 300, - "y": 1586 - }, - "confidence": 1, - "points": [ - [ - 300, - 1586 - ], - [ - 411, - 1586 - ], - [ - 411, - 1613 - ], - [ - 300, - 1613 - ] - ], - "text": "buydowns" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 419, - "y": 1586 - }, - "confidence": 1, - "points": [ - [ - 419, - 1586 - ], - [ - 460, - 1586 - ], - [ - 460, - 1608 - ], - [ - 419, - 1608 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 25, - "width": 144, - "x": 469, - "y": 1586 - }, - "confidence": 1, - "points": [ - [ - 469, - 1586 - ], - [ - 613, - 1586 - ], - [ - 613, - 1611 - ], - [ - 469, - 1611 - ] - ], - "text": "concessions," - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 622, - "y": 1586 - }, - "confidence": 1, - "points": [ - [ - 622, - 1586 - ], - [ - 663, - 1586 - ], - [ - 663, - 1608 - ], - [ - 622, - 1608 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 22, - "width": 138, - "x": 672, - "y": 1586 - }, - "confidence": 1, - "points": [ - [ - 672, - 1586 - ], - [ - 810, - 1586 - ], - [ - 810, - 1608 - ], - [ - 672, - 1608 - ] - ], - "text": "identification" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 819, - "y": 1586 - }, - "confidence": 1, - "points": [ - [ - 819, - 1586 - ], - [ - 841, - 1586 - ], - [ - 841, - 1608 - ], - [ - 819, - 1608 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 22, - "width": 72, - "x": 847, - "y": 1586 - }, - "confidence": 1, - "points": [ - [ - 847, - 1586 - ], - [ - 919, - 1586 - ], - [ - 919, - 1608 - ], - [ - 847, - 1608 - ] - ], - "text": "trends" - }, - { - "bounds": { - "height": 22, - "width": 19, - "x": 927, - "y": 1586 - }, - "confidence": 1, - "points": [ - [ - 927, - 1586 - ], - [ - 946, - 1586 - ], - [ - 946, - 1608 - ], - [ - 927, - 1608 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 27, - "width": 63, - "x": 955, - "y": 1586 - }, - "confidence": 1, - "points": [ - [ - 955, - 1586 - ], - [ - 1018, - 1586 - ], - [ - 1018, - 1613 - ], - [ - 955, - 1613 - ] - ], - "text": "listing" - }, - { - "bounds": { - "height": 27, - "width": 72, - "x": 1027, - "y": 1586 - }, - "confidence": 1, - "points": [ - [ - 1027, - 1586 - ], - [ - 1099, - 1586 - ], - [ - 1099, - 1613 - ], - [ - 1027, - 1613 - ] - ], - "text": "prices," - }, - { - "bounds": { - "height": 22, - "width": 91, - "x": 1108, - "y": 1591 - }, - "confidence": 1, - "points": [ - [ - 1108, - 1591 - ], - [ - 1199, - 1591 - ], - [ - 1199, - 1613 - ], - [ - 1108, - 1613 - ] - ], - "text": "average" - }, - { - "bounds": { - "height": 27, - "width": 52, - "x": 1208, - "y": 1586 - }, - "confidence": 1, - "points": [ - [ - 1208, - 1586 - ], - [ - 1260, - 1586 - ], - [ - 1260, - 1613 - ], - [ - 1208, - 1613 - ] - ], - "text": "days" - }, - { - "bounds": { - "height": 16, - "width": 27, - "x": 1269, - "y": 1591 - }, - "confidence": 1, - "points": [ - [ - 1269, - 1591 - ], - [ - 1296, - 1591 - ], - [ - 1296, - 1607 - ], - [ - 1269, - 1607 - ] - ], - "text": "on" - }, - { - "bounds": { - "height": 22, - "width": 77, - "x": 1305, - "y": 1586 - }, - "confidence": 1, - "points": [ - [ - 1305, - 1586 - ], - [ - 1382, - 1586 - ], - [ - 1382, - 1608 - ], - [ - 1305, - 1608 - ] - ], - "text": "market" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 1391, - "y": 1586 - }, - "confidence": 1, - "points": [ - [ - 1391, - 1586 - ], - [ - 1432, - 1586 - ], - [ - 1432, - 1608 - ], - [ - 1391, - 1608 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 1441, - "y": 1591 - }, - "confidence": 1, - "points": [ - [ - 1441, - 1591 - ], - [ - 1482, - 1591 - ], - [ - 1482, - 1613 - ], - [ - 1441, - 1613 - ] - ], - "text": "any" - }, - { - "bounds": { - "height": 27, - "width": 83, - "x": 1488, - "y": 1586 - }, - "confidence": 1, - "points": [ - [ - 1488, - 1586 - ], - [ - 1571, - 1586 - ], - [ - 1571, - 1613 - ], - [ - 1488, - 1613 - ] - ], - "text": "change" - }, - { - "bounds": { - "height": 16, - "width": 50, - "x": 1580, - "y": 1591 - }, - "confidence": 1, - "points": [ - [ - 1580, - 1591 - ], - [ - 1630, - 1591 - ], - [ - 1630, - 1607 - ], - [ - 1580, - 1607 - ] - ], - "text": "over" - }, - { - "bounds": { - "height": 25, - "width": 50, - "x": 86, - "y": 1619 - }, - "confidence": 1, - "points": [ - [ - 86, - 1619 - ], - [ - 136, - 1619 - ], - [ - 136, - 1644 - ], - [ - 86, - 1644 - ] - ], - "text": "past" - }, - { - "bounds": { - "height": 22, - "width": 55, - "x": 138, - "y": 1622 - }, - "confidence": 1, - "points": [ - [ - 138, - 1622 - ], - [ - 193, - 1622 - ], - [ - 193, - 1644 - ], - [ - 138, - 1644 - ] - ], - "text": "year," - }, - { - "bounds": { - "height": 19, - "width": 47, - "x": 200, - "y": 1619 - }, - "confidence": 1, - "points": [ - [ - 200, - 1619 - ], - [ - 247, - 1619 - ], - [ - 247, - 1638 - ], - [ - 200, - 1638 - ] - ], - "text": "etc.:" - }, - { - "bounds": { - "height": 2, - "width": 1352, - "x": 255, - "y": 1638 - }, - "confidence": 1, - "points": [ - [ - 255, - 1638 - ], - [ - 1607, - 1638 - ], - [ - 1607, - 1640 - ], - [ - 255, - 1640 - ] - ], - "text": "_________________________________________________________________________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -15553,8 +2625,9 @@ "x": 87.97719, "y": 1676.1521 }, + "cells": null, "confidence": 0.80983156, - "id": "c3da3b36-81b6-4896-9179-f05f77976a3f", + "id": "39739a2e-6af9-4209-abd2-6f45b704dd6b", "page": { "height": 2200, "pageIndex": 0, @@ -15582,205 +2655,7 @@ "readingOrder": 68, "role": "Text", "text": "150' x 200' irregular Dimensions____________________________________________________________________ Level Topography________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 38, - "x": 208, - "y": 1677 - }, - "confidence": 1, - "points": [ - [ - 208, - 1677 - ], - [ - 246, - 1677 - ], - [ - 246, - 1696 - ], - [ - 208, - 1696 - ] - ], - "text": "150'" - }, - { - "bounds": { - "height": 13, - "width": 11, - "x": 252, - "y": 1683 - }, - "confidence": 1, - "points": [ - [ - 252, - 1683 - ], - [ - 263, - 1683 - ], - [ - 263, - 1696 - ], - [ - 252, - 1696 - ] - ], - "text": "x" - }, - { - "bounds": { - "height": 19, - "width": 38, - "x": 269, - "y": 1677 - }, - "confidence": 1, - "points": [ - [ - 269, - 1677 - ], - [ - 307, - 1677 - ], - [ - 307, - 1696 - ], - [ - 269, - 1696 - ] - ], - "text": "200'" - }, - { - "bounds": { - "height": 25, - "width": 77, - "x": 313, - "y": 1677 - }, - "confidence": 1, - "points": [ - [ - 313, - 1677 - ], - [ - 390, - 1677 - ], - [ - 390, - 1702 - ], - [ - 313, - 1702 - ] - ], - "text": "irregular" - }, - { - "bounds": { - "height": 22, - "width": 963, - "x": 88, - "y": 1677 - }, - "confidence": 1, - "points": [ - [ - 88, - 1677 - ], - [ - 1051, - 1677 - ], - [ - 1051, - 1699 - ], - [ - 88, - 1699 - ] - ], - "text": "Dimensions____________________________________________________________________" - }, - { - "bounds": { - "height": 19, - "width": 50, - "x": 1208, - "y": 1677 - }, - "confidence": 1, - "points": [ - [ - 1208, - 1677 - ], - [ - 1258, - 1677 - ], - [ - 1258, - 1696 - ], - [ - 1208, - 1696 - ] - ], - "text": "Level" - }, - { - "bounds": { - "height": 22, - "width": 522, - "x": 1086, - "y": 1677 - }, - "confidence": 1, - "points": [ - [ - 1086, - 1677 - ], - [ - 1608, - 1677 - ], - [ - 1608, - 1699 - ], - [ - 1086, - 1699 - ] - ], - "text": "Topography________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -15789,8 +2664,9 @@ "x": 86, "y": 1702 }, + "cells": null, "confidence": 0.66670537, - "id": "1ffd891c-073b-40f8-b76e-5372f4eb4cc2", + "id": "d9d7980c-d640-42c1-802a-8acd92413b0e", "page": { "height": 2200, "pageIndex": 0, @@ -15818,317 +2694,7 @@ "readingOrder": 69, "role": "Text", "text": "Site area acres (30,000 sq. ft.) 0.69______________________________________________________________________ Size for area Typical______________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 38, - "x": 86, - "y": 1702 - }, - "confidence": 1, - "points": [ - [ - 86, - 1702 - ], - [ - 124, - 1702 - ], - [ - 124, - 1721 - ], - [ - 86, - 1721 - ] - ], - "text": "Site" - }, - { - "bounds": { - "height": 13, - "width": 44, - "x": 133, - "y": 1708 - }, - "confidence": 1, - "points": [ - [ - 133, - 1708 - ], - [ - 177, - 1708 - ], - [ - 177, - 1721 - ], - [ - 133, - 1721 - ] - ], - "text": "area" - }, - { - "bounds": { - "height": 13, - "width": 50, - "x": 227, - "y": 1708 - }, - "confidence": 1, - "points": [ - [ - 227, - 1708 - ], - [ - 277, - 1708 - ], - [ - 277, - 1721 - ], - [ - 227, - 1721 - ] - ], - "text": "acres" - }, - { - "bounds": { - "height": 22, - "width": 72, - "x": 283, - "y": 1702 - }, - "confidence": 1, - "points": [ - [ - 283, - 1702 - ], - [ - 355, - 1702 - ], - [ - 355, - 1724 - ], - [ - 283, - 1724 - ] - ], - "text": "(30,000" - }, - { - "bounds": { - "height": 19, - "width": 30, - "x": 358, - "y": 1708 - }, - "confidence": 1, - "points": [ - [ - 358, - 1708 - ], - [ - 388, - 1708 - ], - [ - 388, - 1727 - ], - [ - 358, - 1727 - ] - ], - "text": "sq." - }, - { - "bounds": { - "height": 22, - "width": 25, - "x": 391, - "y": 1702 - }, - "confidence": 1, - "points": [ - [ - 391, - 1702 - ], - [ - 416, - 1702 - ], - [ - 416, - 1724 - ], - [ - 391, - 1724 - ] - ], - "text": "ft.)" - }, - { - "bounds": { - "height": 22, - "width": 872, - "x": 180, - "y": 1702 - }, - "confidence": 1, - "points": [ - [ - 180, - 1702 - ], - [ - 1052, - 1702 - ], - [ - 1052, - 1724 - ], - [ - 180, - 1724 - ] - ], - "text": "0.69______________________________________________________________________" - }, - { - "bounds": { - "height": 19, - "width": 44, - "x": 1086, - "y": 1702 - }, - "confidence": 1, - "points": [ - [ - 1086, - 1702 - ], - [ - 1130, - 1702 - ], - [ - 1130, - 1721 - ], - [ - 1086, - 1721 - ] - ], - "text": "Size" - }, - { - "bounds": { - "height": 22, - "width": 30, - "x": 1213, - "y": 1702 - }, - "confidence": 1, - "points": [ - [ - 1213, - 1702 - ], - [ - 1243, - 1702 - ], - [ - 1243, - 1724 - ], - [ - 1213, - 1724 - ] - ], - "text": "for" - }, - { - "bounds": { - "height": 16, - "width": 47, - "x": 1247, - "y": 1708 - }, - "confidence": 1, - "points": [ - [ - 1247, - 1708 - ], - [ - 1294, - 1708 - ], - [ - 1294, - 1724 - ], - [ - 1247, - 1724 - ] - ], - "text": "area" - }, - { - "bounds": { - "height": 27, - "width": 472, - "x": 1136, - "y": 1702 - }, - "confidence": 1, - "points": [ - [ - 1136, - 1702 - ], - [ - 1608, - 1702 - ], - [ - 1608, - 1729 - ], - [ - 1136, - 1729 - ] - ], - "text": "Typical______________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -16137,8 +2703,9 @@ "x": 391.44214, "y": 1702.8004 }, + "cells": null, "confidence": 0.53720796, - "id": "81d3afb3-a19d-465e-bb02-3a11209ee8fe", + "id": "7dde0933-6a27-4cb6-af37-3e381bd1a938", "page": { "height": 2200, "pageIndex": 0, @@ -16175,8 +2742,9 @@ "x": 86, "y": 1728.715 }, + "cells": null, "confidence": 0.73763835, - "id": "c0366612-3e4d-4ad4-8f73-02587201945d", + "id": "52656b58-3087-4de4-9587-16725537c563", "page": { "height": 2200, "pageIndex": 0, @@ -16204,289 +2772,7 @@ "readingOrder": 71, "role": "Text", "text": "Specific zoning classification and description Two-Family Residential R-2,_________________________________________ Shape Rectangular____________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 80, - "x": 86, - "y": 1730 - }, - "confidence": 1, - "points": [ - [ - 86, - 1730 - ], - [ - 166, - 1730 - ], - [ - 166, - 1752 - ], - [ - 86, - 1752 - ] - ], - "text": "Specific" - }, - { - "bounds": { - "height": 22, - "width": 66, - "x": 172, - "y": 1730 - }, - "confidence": 1, - "points": [ - [ - 172, - 1730 - ], - [ - 238, - 1730 - ], - [ - 238, - 1752 - ], - [ - 172, - 1752 - ] - ], - "text": "zoning" - }, - { - "bounds": { - "height": 19, - "width": 127, - "x": 247, - "y": 1730 - }, - "confidence": 1, - "points": [ - [ - 247, - 1730 - ], - [ - 374, - 1730 - ], - [ - 374, - 1749 - ], - [ - 247, - 1749 - ] - ], - "text": "classification" - }, - { - "bounds": { - "height": 19, - "width": 38, - "x": 380, - "y": 1730 - }, - "confidence": 1, - "points": [ - [ - 380, - 1730 - ], - [ - 418, - 1730 - ], - [ - 418, - 1749 - ], - [ - 380, - 1749 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 22, - "width": 108, - "x": 427, - "y": 1730 - }, - "confidence": 1, - "points": [ - [ - 427, - 1730 - ], - [ - 535, - 1730 - ], - [ - 535, - 1752 - ], - [ - 427, - 1752 - ] - ], - "text": "description" - }, - { - "bounds": { - "height": 25, - "width": 108, - "x": 586, - "y": 1730 - }, - "confidence": 1, - "points": [ - [ - 586, - 1730 - ], - [ - 694, - 1730 - ], - [ - 694, - 1755 - ], - [ - 586, - 1755 - ] - ], - "text": "Two-Family" - }, - { - "bounds": { - "height": 19, - "width": 102, - "x": 700, - "y": 1730 - }, - "confidence": 1, - "points": [ - [ - 700, - 1730 - ], - [ - 802, - 1730 - ], - [ - 802, - 1749 - ], - [ - 700, - 1749 - ] - ], - "text": "Residential" - }, - { - "bounds": { - "height": 22, - "width": 511, - "x": 541, - "y": 1730 - }, - "confidence": 1, - "points": [ - [ - 541, - 1730 - ], - [ - 1052, - 1730 - ], - [ - 1052, - 1752 - ], - [ - 541, - 1752 - ] - ], - "text": "R-2,_________________________________________" - }, - { - "bounds": { - "height": 22, - "width": 66, - "x": 1086, - "y": 1730 - }, - "confidence": 1, - "points": [ - [ - 1086, - 1730 - ], - [ - 1152, - 1730 - ], - [ - 1152, - 1752 - ], - [ - 1086, - 1752 - ] - ], - "text": "Shape" - }, - { - "bounds": { - "height": 25, - "width": 449, - "x": 1158, - "y": 1730 - }, - "confidence": 1, - "points": [ - [ - 1158, - 1730 - ], - [ - 1607, - 1730 - ], - [ - 1607, - 1755 - ], - [ - 1158, - 1755 - ] - ], - "text": "Rectangular____________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -16495,8 +2781,9 @@ "x": 85.98133, "y": 1754.3981 }, + "cells": null, "confidence": 0.502758, - "id": "6b62a671-e92f-4de8-afec-384d48325c63", + "id": "ac13039d-ea29-410a-93e5-3a9bf7c9e73d", "page": { "height": 2200, "pageIndex": 0, @@ -16524,513 +2811,7 @@ "readingOrder": 72, "role": "Text", "text": "Zoning compliance 4 ❐ Legal ❐ Legal nonconforming (Grandfathered use) ❐ Illegal ❐ No zoning Drainage adequate Appears__________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 69, - "x": 86, - "y": 1755 - }, - "confidence": 1, - "points": [ - [ - 86, - 1755 - ], - [ - 155, - 1755 - ], - [ - 155, - 1780 - ], - [ - 86, - 1780 - ] - ], - "text": "Zoning" - }, - { - "bounds": { - "height": 25, - "width": 113, - "x": 161, - "y": 1755 - }, - "confidence": 1, - "points": [ - [ - 161, - 1755 - ], - [ - 274, - 1755 - ], - [ - 274, - 1780 - ], - [ - 161, - 1780 - ] - ], - "text": "compliance" - }, - { - "bounds": { - "height": 11, - "width": 11, - "x": 305, - "y": 1758 - }, - "confidence": 1, - "points": [ - [ - 305, - 1758 - ], - [ - 316, - 1758 - ], - [ - 316, - 1769 - ], - [ - 305, - 1769 - ] - ], - "text": "4" - }, - { - "bounds": { - "height": 16, - "width": 16, - "x": 302, - "y": 1758 - }, - "confidence": 1, - "points": [ - [ - 302, - 1758 - ], - [ - 318, - 1758 - ], - [ - 318, - 1774 - ], - [ - 302, - 1774 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 25, - "width": 52, - "x": 327, - "y": 1755 - }, - "confidence": 1, - "points": [ - [ - 327, - 1755 - ], - [ - 379, - 1755 - ], - [ - 379, - 1780 - ], - [ - 327, - 1780 - ] - ], - "text": "Legal" - }, - { - "bounds": { - "height": 16, - "width": 19, - "x": 400, - "y": 1758 - }, - "confidence": 1, - "points": [ - [ - 400, - 1758 - ], - [ - 419, - 1758 - ], - [ - 419, - 1774 - ], - [ - 400, - 1774 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 25, - "width": 55, - "x": 424, - "y": 1755 - }, - "confidence": 1, - "points": [ - [ - 424, - 1755 - ], - [ - 479, - 1755 - ], - [ - 479, - 1780 - ], - [ - 424, - 1780 - ] - ], - "text": "Legal" - }, - { - "bounds": { - "height": 25, - "width": 147, - "x": 486, - "y": 1755 - }, - "confidence": 1, - "points": [ - [ - 486, - 1755 - ], - [ - 633, - 1755 - ], - [ - 633, - 1780 - ], - [ - 486, - 1780 - ] - ], - "text": "nonconforming" - }, - { - "bounds": { - "height": 25, - "width": 150, - "x": 641, - "y": 1755 - }, - "confidence": 1, - "points": [ - [ - 641, - 1755 - ], - [ - 791, - 1755 - ], - [ - 791, - 1780 - ], - [ - 641, - 1780 - ] - ], - "text": "(Grandfathered" - }, - { - "bounds": { - "height": 25, - "width": 44, - "x": 797, - "y": 1755 - }, - "confidence": 1, - "points": [ - [ - 797, - 1755 - ], - [ - 841, - 1755 - ], - [ - 841, - 1780 - ], - [ - 797, - 1780 - ] - ], - "text": "use)" - }, - { - "bounds": { - "height": 16, - "width": 16, - "x": 855, - "y": 1758 - }, - "confidence": 1, - "points": [ - [ - 855, - 1758 - ], - [ - 871, - 1758 - ], - [ - 871, - 1774 - ], - [ - 855, - 1774 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 25, - "width": 55, - "x": 880, - "y": 1755 - }, - "confidence": 1, - "points": [ - [ - 880, - 1755 - ], - [ - 935, - 1755 - ], - [ - 935, - 1780 - ], - [ - 880, - 1780 - ] - ], - "text": "Illegal" - }, - { - "bounds": { - "height": 16, - "width": 16, - "x": 944, - "y": 1758 - }, - "confidence": 1, - "points": [ - [ - 944, - 1758 - ], - [ - 960, - 1758 - ], - [ - 960, - 1774 - ], - [ - 944, - 1774 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 30, - "x": 966, - "y": 1755 - }, - "confidence": 1, - "points": [ - [ - 966, - 1755 - ], - [ - 996, - 1755 - ], - [ - 996, - 1774 - ], - [ - 966, - 1774 - ] - ], - "text": "No" - }, - { - "bounds": { - "height": 25, - "width": 66, - "x": 1002, - "y": 1755 - }, - "confidence": 1, - "points": [ - [ - 1002, - 1755 - ], - [ - 1068, - 1755 - ], - [ - 1068, - 1780 - ], - [ - 1002, - 1780 - ] - ], - "text": "zoning" - }, - { - "bounds": { - "height": 25, - "width": 88, - "x": 1088, - "y": 1755 - }, - "confidence": 1, - "points": [ - [ - 1088, - 1755 - ], - [ - 1176, - 1755 - ], - [ - 1176, - 1780 - ], - [ - 1088, - 1780 - ] - ], - "text": "Drainage" - }, - { - "bounds": { - "height": 25, - "width": 86, - "x": 1266, - "y": 1755 - }, - "confidence": 1, - "points": [ - [ - 1266, - 1755 - ], - [ - 1352, - 1755 - ], - [ - 1352, - 1780 - ], - [ - 1266, - 1780 - ] - ], - "text": "adequate" - }, - { - "bounds": { - "height": 25, - "width": 424, - "x": 1183, - "y": 1755 - }, - "confidence": 1, - "points": [ - [ - 1183, - 1755 - ], - [ - 1607, - 1755 - ], - [ - 1607, - 1780 - ], - [ - 1183, - 1780 - ] - ], - "text": "Appears__________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -17039,8 +2820,9 @@ "x": 86.64513, "y": 1783 }, + "cells": null, "confidence": 0.72539264, - "id": "78f9bfd2-829e-41b0-8099-050779d15d36", + "id": "b624c5ad-783d-4df8-9207-eb4567232347", "page": { "height": 2200, "pageIndex": 0, @@ -17068,457 +2850,7 @@ "readingOrder": 73, "role": "Text", "text": "Highest & best use as improved: 4 ❐ Present use ❐ Other use (explain) Residential View_________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 75, - "x": 88, - "y": 1786 - }, - "confidence": 1, - "points": [ - [ - 88, - 1786 - ], - [ - 163, - 1786 - ], - [ - 163, - 1808 - ], - [ - 88, - 1808 - ] - ], - "text": "Highest" - }, - { - "bounds": { - "height": 19, - "width": 16, - "x": 169, - "y": 1786 - }, - "confidence": 1, - "points": [ - [ - 169, - 1786 - ], - [ - 185, - 1786 - ], - [ - 185, - 1805 - ], - [ - 169, - 1805 - ] - ], - "text": "&" - }, - { - "bounds": { - "height": 19, - "width": 41, - "x": 191, - "y": 1786 - }, - "confidence": 1, - "points": [ - [ - 191, - 1786 - ], - [ - 232, - 1786 - ], - [ - 232, - 1805 - ], - [ - 191, - 1805 - ] - ], - "text": "best" - }, - { - "bounds": { - "height": 16, - "width": 36, - "x": 238, - "y": 1788 - }, - "confidence": 1, - "points": [ - [ - 238, - 1788 - ], - [ - 274, - 1788 - ], - [ - 274, - 1804 - ], - [ - 238, - 1804 - ] - ], - "text": "use" - }, - { - "bounds": { - "height": 16, - "width": 25, - "x": 280, - "y": 1788 - }, - "confidence": 1, - "points": [ - [ - 280, - 1788 - ], - [ - 305, - 1788 - ], - [ - 305, - 1804 - ], - [ - 280, - 1804 - ] - ], - "text": "as" - }, - { - "bounds": { - "height": 22, - "width": 97, - "x": 311, - "y": 1786 - }, - "confidence": 1, - "points": [ - [ - 311, - 1786 - ], - [ - 408, - 1786 - ], - [ - 408, - 1808 - ], - [ - 311, - 1808 - ] - ], - "text": "improved:" - }, - { - "bounds": { - "height": 11, - "width": 11, - "x": 433, - "y": 1786 - }, - "confidence": 1, - "points": [ - [ - 433, - 1786 - ], - [ - 444, - 1786 - ], - [ - 444, - 1797 - ], - [ - 433, - 1797 - ] - ], - "text": "4" - }, - { - "bounds": { - "height": 22, - "width": 19, - "x": 430, - "y": 1783 - }, - "confidence": 1, - "points": [ - [ - 430, - 1783 - ], - [ - 449, - 1783 - ], - [ - 449, - 1805 - ], - [ - 430, - 1805 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 86, - "x": 458, - "y": 1783 - }, - "confidence": 1, - "points": [ - [ - 458, - 1783 - ], - [ - 544, - 1783 - ], - [ - 544, - 1805 - ], - [ - 458, - 1805 - ] - ], - "text": "Present" - }, - { - "bounds": { - "height": 16, - "width": 41, - "x": 550, - "y": 1788 - }, - "confidence": 1, - "points": [ - [ - 550, - 1788 - ], - [ - 591, - 1788 - ], - [ - 591, - 1804 - ], - [ - 550, - 1804 - ] - ], - "text": "use" - }, - { - "bounds": { - "height": 22, - "width": 19, - "x": 613, - "y": 1783 - }, - "confidence": 1, - "points": [ - [ - 613, - 1783 - ], - [ - 632, - 1783 - ], - [ - 632, - 1805 - ], - [ - 613, - 1805 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 63, - "x": 638, - "y": 1783 - }, - "confidence": 1, - "points": [ - [ - 638, - 1783 - ], - [ - 701, - 1783 - ], - [ - 701, - 1805 - ], - [ - 638, - 1805 - ] - ], - "text": "Other" - }, - { - "bounds": { - "height": 16, - "width": 38, - "x": 711, - "y": 1788 - }, - "confidence": 1, - "points": [ - [ - 711, - 1788 - ], - [ - 749, - 1788 - ], - [ - 749, - 1804 - ], - [ - 711, - 1804 - ] - ], - "text": "use" - }, - { - "bounds": { - "height": 27, - "width": 94, - "x": 758, - "y": 1783 - }, - "confidence": 1, - "points": [ - [ - 758, - 1783 - ], - [ - 852, - 1783 - ], - [ - 852, - 1810 - ], - [ - 758, - 1810 - ] - ], - "text": "(explain)" - }, - { - "bounds": { - "height": 22, - "width": 113, - "x": 1144, - "y": 1783 - }, - "confidence": 1, - "points": [ - [ - 1144, - 1783 - ], - [ - 1257, - 1783 - ], - [ - 1257, - 1805 - ], - [ - 1144, - 1805 - ] - ], - "text": "Residential" - }, - { - "bounds": { - "height": 25, - "width": 522, - "x": 1086, - "y": 1783 - }, - "confidence": 1, - "points": [ - [ - 1086, - 1783 - ], - [ - 1608, - 1783 - ], - [ - 1608, - 1808 - ], - [ - 1086, - 1808 - ] - ], - "text": "View_________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -17527,8 +2859,9 @@ "x": 88.528206, "y": 1842.4094 }, + "cells": null, "confidence": 0.60456574, - "id": "bf4e21b3-78f7-4623-9ffb-bc67bda538e9", + "id": "be563a7c-3115-4998-b5a9-12ebaa1a6d9a", "page": { "height": 2200, "pageIndex": 0, @@ -17565,8 +2898,9 @@ "x": 86.23232, "y": 1904.378 }, + "cells": null, "confidence": 0.51260847, - "id": "a9ea5b5b-825f-4c92-9a1a-c8a9f4f27bc6", + "id": "14f8e304-b39c-4ff8-aa22-162b3e811d76", "page": { "height": 2200, "pageIndex": 0, @@ -17603,8 +2937,9 @@ "x": 86, "y": 1962.653 }, + "cells": null, "confidence": 0.5573976, - "id": "edf58acf-95c9-495d-9bee-9edea12beadf", + "id": "512c469a-3c73-4d95-842b-71da8e873220", "page": { "height": 2200, "pageIndex": 0, @@ -17632,373 +2967,7 @@ "readingOrder": 76, "role": "CheckboxSelected", "text": "Sanitary sewer 4 ❐ Street lights Overhead_______________ 4 ❐ ❐Fema Map 17167C0210F No._________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 94, - "x": 86, - "y": 1963 - }, - "confidence": 1, - "points": [ - [ - 86, - 1963 - ], - [ - 180, - 1963 - ], - [ - 180, - 1988 - ], - [ - 86, - 1988 - ] - ], - "text": "Sanitary" - }, - { - "bounds": { - "height": 16, - "width": 69, - "x": 188, - "y": 1969 - }, - "confidence": 1, - "points": [ - [ - 188, - 1969 - ], - [ - 257, - 1969 - ], - [ - 257, - 1985 - ], - [ - 188, - 1985 - ] - ], - "text": "sewer" - }, - { - "bounds": { - "height": 13, - "width": 13, - "x": 263, - "y": 1966 - }, - "confidence": 1, - "points": [ - [ - 263, - 1966 - ], - [ - 276, - 1966 - ], - [ - 276, - 1979 - ], - [ - 263, - 1979 - ] - ], - "text": "4" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 261, - "y": 1963 - }, - "confidence": 1, - "points": [ - [ - 261, - 1963 - ], - [ - 280, - 1963 - ], - [ - 280, - 1982 - ], - [ - 261, - 1982 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 69, - "x": 511, - "y": 1963 - }, - "confidence": 1, - "points": [ - [ - 511, - 1963 - ], - [ - 580, - 1963 - ], - [ - 580, - 1985 - ], - [ - 511, - 1985 - ] - ], - "text": "Street" - }, - { - "bounds": { - "height": 25, - "width": 58, - "x": 588, - "y": 1963 - }, - "confidence": 1, - "points": [ - [ - 588, - 1963 - ], - [ - 646, - 1963 - ], - [ - 646, - 1988 - ], - [ - 588, - 1988 - ] - ], - "text": "lights" - }, - { - "bounds": { - "height": 25, - "width": 213, - "x": 658, - "y": 1963 - }, - "confidence": 1, - "points": [ - [ - 658, - 1963 - ], - [ - 871, - 1963 - ], - [ - 871, - 1988 - ], - [ - 658, - 1988 - ] - ], - "text": "Overhead_______________" - }, - { - "bounds": { - "height": 11, - "width": 16, - "x": 919, - "y": 1966 - }, - "confidence": 1, - "points": [ - [ - 919, - 1966 - ], - [ - 935, - 1966 - ], - [ - 935, - 1977 - ], - [ - 919, - 1977 - ] - ], - "text": "4" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 919, - "y": 1963 - }, - "confidence": 1, - "points": [ - [ - 919, - 1963 - ], - [ - 938, - 1963 - ], - [ - 938, - 1982 - ], - [ - 919, - 1982 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 141, - "x": 1011, - "y": 1963 - }, - "confidence": 1, - "points": [ - [ - 1011, - 1963 - ], - [ - 1152, - 1963 - ], - [ - 1152, - 1985 - ], - [ - 1011, - 1985 - ] - ], - "text": "❐Fema" - }, - { - "bounds": { - "height": 25, - "width": 50, - "x": 1158, - "y": 1963 - }, - "confidence": 1, - "points": [ - [ - 1158, - 1963 - ], - [ - 1208, - 1963 - ], - [ - 1208, - 1988 - ], - [ - 1158, - 1988 - ] - ], - "text": "Map" - }, - { - "bounds": { - "height": 16, - "width": 116, - "x": 1255, - "y": 1969 - }, - "confidence": 1, - "points": [ - [ - 1255, - 1969 - ], - [ - 1371, - 1969 - ], - [ - 1371, - 1985 - ], - [ - 1255, - 1985 - ] - ], - "text": "17167C0210F" - }, - { - "bounds": { - "height": 25, - "width": 391, - "x": 1216, - "y": 1963 - }, - "confidence": 1, - "points": [ - [ - 1216, - 1963 - ], - [ - 1607, - 1963 - ], - [ - 1607, - 1988 - ], - [ - 1216, - 1988 - ] - ], - "text": "No._________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -18007,8 +2976,9 @@ "x": 86, "y": 1992.2312 }, + "cells": null, "confidence": 0.5156393, - "id": "8b728033-bb60-4896-a2e3-afe9c094385e", + "id": "7b5460ed-6691-44fd-a096-50cd6525b8df", "page": { "height": 2200, "pageIndex": 0, @@ -18036,121 +3006,7 @@ "readingOrder": 77, "role": "Text", "text": "Storm sewer 4 ❐", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 66, - "x": 86, - "y": 1994 - }, - "confidence": 1, - "points": [ - [ - 86, - 1994 - ], - [ - 152, - 1994 - ], - [ - 152, - 2016 - ], - [ - 86, - 2016 - ] - ], - "text": "Storm" - }, - { - "bounds": { - "height": 19, - "width": 69, - "x": 161, - "y": 1997 - }, - "confidence": 1, - "points": [ - [ - 161, - 1997 - ], - [ - 230, - 1997 - ], - [ - 230, - 2016 - ], - [ - 161, - 2016 - ] - ], - "text": "sewer" - }, - { - "bounds": { - "height": 13, - "width": 11, - "x": 266, - "y": 1994 - }, - "confidence": 1, - "points": [ - [ - 266, - 1994 - ], - [ - 277, - 1994 - ], - [ - 277, - 2007 - ], - [ - 266, - 2007 - ] - ], - "text": "4" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 261, - "y": 1994 - }, - "confidence": 1, - "points": [ - [ - 261, - 1994 - ], - [ - 280, - 1994 - ], - [ - 280, - 2013 - ], - [ - 261, - 2013 - ] - ], - "text": "❐" - } - ] + "type": "paragraph" }, { "bounds": { @@ -18159,8 +3015,9 @@ "x": 613.9484, "y": 1782.1697 }, + "cells": null, "confidence": 0.7620375, - "id": "c8c077b6-f303-4adb-bb13-f023345ec2da", + "id": "4f5d90cd-1f6a-4dd5-a0b8-4928aacb9611", "page": { "height": 2200, "pageIndex": 0, @@ -18197,8 +3054,9 @@ "x": 430.3328, "y": 1782.7319 }, + "cells": null, "confidence": 0.62679946, - "id": "70f999c4-3a61-4fe7-8fba-559d69929458", + "id": "c79fb626-c8cb-44f6-b8de-8ab14a7aa672", "page": { "height": 2200, "pageIndex": 0, @@ -18235,8 +3093,9 @@ "x": 380.05145, "y": 1842.2983 }, + "cells": null, "confidence": 0.5919843, - "id": "b37c2150-490f-4429-bc5e-7e9c8649c2ac", + "id": "7ef88a3e-3414-42c3-96f3-67a002ddd09f", "page": { "height": 2200, "pageIndex": 0, @@ -18273,8 +3132,9 @@ "x": 511.6526, "y": 1841.9419 }, + "cells": null, "confidence": 0.8011547, - "id": "341f4270-55c3-4a53-af5e-a4f712a3594f", + "id": "599e1be7-7ffa-4daa-b4b0-645935d6fa57", "page": { "height": 2200, "pageIndex": 0, @@ -18311,8 +3171,9 @@ "x": 512.119, "y": 1872.5857 }, + "cells": null, "confidence": 0.72535336, - "id": "848e5b70-1589-4f15-aba6-b6de41c94406", + "id": "7b2a0a6b-63b5-4e55-8ab8-b039a3f50f61", "page": { "height": 2200, "pageIndex": 0, @@ -18349,8 +3210,9 @@ "x": 86, "y": 1902 }, + "cells": null, "confidence": 0.68175685, - "id": "f82b49ca-ac79-407f-a17e-f5319b2f9b93", + "id": "03fb53c9-e230-4ff0-9ac9-5799cdd8ca0b", "page": { "height": 2200, "pageIndex": 0, @@ -18378,93 +3240,7 @@ "readingOrder": 83, "role": "Text", "text": "Gas Curb/gutter Concrete________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 47, - "x": 86, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 86, - 1902 - ], - [ - 133, - 1902 - ], - [ - 133, - 1924 - ], - [ - 86, - 1924 - ] - ], - "text": "Gas" - }, - { - "bounds": { - "height": 27, - "width": 124, - "x": 513, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 513, - 1902 - ], - [ - 637, - 1902 - ], - [ - 637, - 1929 - ], - [ - 513, - 1929 - ] - ], - "text": "Curb/gutter" - }, - { - "bounds": { - "height": 22, - "width": 227, - "x": 644, - "y": 1905 - }, - "confidence": 1, - "points": [ - [ - 644, - 1905 - ], - [ - 871, - 1905 - ], - [ - 871, - 1927 - ], - [ - 644, - 1927 - ] - ], - "text": "Concrete________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -18473,8 +3249,9 @@ "x": 511.32782, "y": 1932.4541 }, + "cells": null, "confidence": 0.65416294, - "id": "634dfe0f-884c-457d-afe5-d771b2d72904", + "id": "eecae918-9184-40ec-94bf-bd44c4e459b0", "page": { "height": 2200, "pageIndex": 0, @@ -18511,8 +3288,9 @@ "x": 511.33917, "y": 1962.8569 }, + "cells": null, "confidence": 0.75400156, - "id": "f28323b8-85ba-48bc-81aa-8a7a20ea9069", + "id": "f1b0ac83-0b42-4166-9238-046fc2f64552", "page": { "height": 2200, "pageIndex": 0, @@ -18549,8 +3327,9 @@ "x": 511.16302, "y": 1993.2764 }, + "cells": null, "confidence": 0.76546496, - "id": "6b6b540e-a925-440b-b911-acfd10f82d65", + "id": "afc25f58-4c0d-44e8-bc13-5fb4c478f6e8", "page": { "height": 2200, "pageIndex": 0, @@ -18587,8 +3366,9 @@ "x": 85.92773, "y": 2021.9955 }, + "cells": null, "confidence": 0.78406745, - "id": "901ca1fd-5c2b-45ed-8fea-ad7f573e6bd8", + "id": "2970d290-cf32-43a2-acd3-4ea8e1ebe966", "page": { "height": 2200, "pageIndex": 0, @@ -18616,765 +3396,7 @@ "readingOrder": 87, "role": "Text", "text": "Comments (apparent adverse easements, encroashments, special assessments, slide areas, illegal or legal nonconforming zoning, use,\netc): adverse easements or encroachments noted. Zoning conforms to current use. No_________________________________________________________________________________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 122, - "x": 86, - "y": 2022 - }, - "confidence": 1, - "points": [ - [ - 86, - 2022 - ], - [ - 208, - 2022 - ], - [ - 208, - 2044 - ], - [ - 86, - 2044 - ] - ], - "text": "Comments" - }, - { - "bounds": { - "height": 25, - "width": 108, - "x": 216, - "y": 2024 - }, - "confidence": 1, - "points": [ - [ - 216, - 2024 - ], - [ - 324, - 2024 - ], - [ - 324, - 2049 - ], - [ - 216, - 2049 - ] - ], - "text": "(apparent" - }, - { - "bounds": { - "height": 19, - "width": 88, - "x": 333, - "y": 2024 - }, - "confidence": 1, - "points": [ - [ - 333, - 2024 - ], - [ - 421, - 2024 - ], - [ - 421, - 2043 - ], - [ - 333, - 2043 - ] - ], - "text": "adverse" - }, - { - "bounds": { - "height": 22, - "width": 130, - "x": 430, - "y": 2024 - }, - "confidence": 1, - "points": [ - [ - 430, - 2024 - ], - [ - 560, - 2024 - ], - [ - 560, - 2046 - ], - [ - 430, - 2046 - ] - ], - "text": "easements," - }, - { - "bounds": { - "height": 22, - "width": 177, - "x": 569, - "y": 2024 - }, - "confidence": 1, - "points": [ - [ - 569, - 2024 - ], - [ - 746, - 2024 - ], - [ - 746, - 2046 - ], - [ - 569, - 2046 - ] - ], - "text": "encroashments," - }, - { - "bounds": { - "height": 25, - "width": 77, - "x": 755, - "y": 2024 - }, - "confidence": 1, - "points": [ - [ - 755, - 2024 - ], - [ - 832, - 2024 - ], - [ - 832, - 2049 - ], - [ - 755, - 2049 - ] - ], - "text": "special" - }, - { - "bounds": { - "height": 22, - "width": 150, - "x": 844, - "y": 2024 - }, - "confidence": 1, - "points": [ - [ - 844, - 2024 - ], - [ - 994, - 2024 - ], - [ - 994, - 2046 - ], - [ - 844, - 2046 - ] - ], - "text": "assessments," - }, - { - "bounds": { - "height": 19, - "width": 52, - "x": 1005, - "y": 2024 - }, - "confidence": 1, - "points": [ - [ - 1005, - 2024 - ], - [ - 1057, - 2024 - ], - [ - 1057, - 2043 - ], - [ - 1005, - 2043 - ] - ], - "text": "slide" - }, - { - "bounds": { - "height": 19, - "width": 69, - "x": 1066, - "y": 2027 - }, - "confidence": 1, - "points": [ - [ - 1066, - 2027 - ], - [ - 1135, - 2027 - ], - [ - 1135, - 2046 - ], - [ - 1066, - 2046 - ] - ], - "text": "areas," - }, - { - "bounds": { - "height": 25, - "width": 63, - "x": 1144, - "y": 2024 - }, - "confidence": 1, - "points": [ - [ - 1144, - 2024 - ], - [ - 1207, - 2024 - ], - [ - 1207, - 2049 - ], - [ - 1144, - 2049 - ] - ], - "text": "illegal" - }, - { - "bounds": { - "height": 16, - "width": 25, - "x": 1216, - "y": 2027 - }, - "confidence": 1, - "points": [ - [ - 1216, - 2027 - ], - [ - 1241, - 2027 - ], - [ - 1241, - 2043 - ], - [ - 1216, - 2043 - ] - ], - "text": "or" - }, - { - "bounds": { - "height": 25, - "width": 52, - "x": 1250, - "y": 2024 - }, - "confidence": 1, - "points": [ - [ - 1250, - 2024 - ], - [ - 1302, - 2024 - ], - [ - 1302, - 2049 - ], - [ - 1250, - 2049 - ] - ], - "text": "legal" - }, - { - "bounds": { - "height": 25, - "width": 163, - "x": 1311, - "y": 2024 - }, - "confidence": 1, - "points": [ - [ - 1311, - 2024 - ], - [ - 1474, - 2024 - ], - [ - 1474, - 2049 - ], - [ - 1311, - 2049 - ] - ], - "text": "nonconforming" - }, - { - "bounds": { - "height": 25, - "width": 80, - "x": 1486, - "y": 2024 - }, - "confidence": 1, - "points": [ - [ - 1486, - 2024 - ], - [ - 1566, - 2024 - ], - [ - 1566, - 2049 - ], - [ - 1486, - 2049 - ] - ], - "text": "zoning," - }, - { - "bounds": { - "height": 19, - "width": 47, - "x": 1575, - "y": 2027 - }, - "confidence": 1, - "points": [ - [ - 1575, - 2027 - ], - [ - 1622, - 2027 - ], - [ - 1622, - 2046 - ], - [ - 1575, - 2046 - ] - ], - "text": "use," - }, - { - "bounds": { - "height": 27, - "width": 50, - "x": 86, - "y": 2052 - }, - "confidence": 1, - "points": [ - [ - 86, - 2052 - ], - [ - 136, - 2052 - ], - [ - 136, - 2079 - ], - [ - 86, - 2079 - ] - ], - "text": "etc):" - }, - { - "bounds": { - "height": 22, - "width": 80, - "x": 183, - "y": 2055 - }, - "confidence": 1, - "points": [ - [ - 183, - 2055 - ], - [ - 263, - 2055 - ], - [ - 263, - 2077 - ], - [ - 183, - 2077 - ] - ], - "text": "adverse" - }, - { - "bounds": { - "height": 19, - "width": 113, - "x": 269, - "y": 2058 - }, - "confidence": 1, - "points": [ - [ - 269, - 2058 - ], - [ - 382, - 2058 - ], - [ - 382, - 2077 - ], - [ - 269, - 2077 - ] - ], - "text": "easements" - }, - { - "bounds": { - "height": 16, - "width": 22, - "x": 388, - "y": 2061 - }, - "confidence": 1, - "points": [ - [ - 388, - 2061 - ], - [ - 410, - 2061 - ], - [ - 410, - 2077 - ], - [ - 388, - 2077 - ] - ], - "text": "or" - }, - { - "bounds": { - "height": 22, - "width": 155, - "x": 416, - "y": 2055 - }, - "confidence": 1, - "points": [ - [ - 416, - 2055 - ], - [ - 571, - 2055 - ], - [ - 571, - 2077 - ], - [ - 416, - 2077 - ] - ], - "text": "encroachments" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 580, - "y": 2055 - }, - "confidence": 1, - "points": [ - [ - 580, - 2055 - ], - [ - 641, - 2055 - ], - [ - 641, - 2077 - ], - [ - 580, - 2077 - ] - ], - "text": "noted." - }, - { - "bounds": { - "height": 27, - "width": 72, - "x": 647, - "y": 2055 - }, - "confidence": 1, - "points": [ - [ - 647, - 2055 - ], - [ - 719, - 2055 - ], - [ - 719, - 2082 - ], - [ - 647, - 2082 - ] - ], - "text": "Zoning" - }, - { - "bounds": { - "height": 22, - "width": 94, - "x": 725, - "y": 2055 - }, - "confidence": 1, - "points": [ - [ - 725, - 2055 - ], - [ - 819, - 2055 - ], - [ - 819, - 2077 - ], - [ - 725, - 2077 - ] - ], - "text": "conforms" - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 824, - "y": 2058 - }, - "confidence": 1, - "points": [ - [ - 824, - 2058 - ], - [ - 846, - 2058 - ], - [ - 846, - 2077 - ], - [ - 824, - 2077 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 19, - "width": 72, - "x": 852, - "y": 2058 - }, - "confidence": 1, - "points": [ - [ - 852, - 2058 - ], - [ - 924, - 2058 - ], - [ - 924, - 2077 - ], - [ - 852, - 2077 - ] - ], - "text": "current" - }, - { - "bounds": { - "height": 16, - "width": 41, - "x": 930, - "y": 2061 - }, - "confidence": 1, - "points": [ - [ - 930, - 2061 - ], - [ - 971, - 2061 - ], - [ - 971, - 2077 - ], - [ - 930, - 2077 - ] - ], - "text": "use." - }, - { - "bounds": { - "height": 19, - "width": 1461, - "x": 147, - "y": 2058 - }, - "confidence": 1, - "points": [ - [ - 147, - 2058 - ], - [ - 1608, - 2058 - ], - [ - 1608, - 2077 - ], - [ - 147, - 2077 - ] - ], - "text": "No_________________________________________________________________________________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -19383,8 +3405,9 @@ "x": 88, "y": 2105 }, + "cells": null, "confidence": 1, - "id": "6acb215a-70e3-4b79-8dff-14d8de40b611", + "id": "dd1bb876-12cc-4e16-93f8-1f5966b71fb1", "page": { "height": 2200, "pageIndex": 0, @@ -19412,37 +3435,7 @@ "readingOrder": 88, "role": "Text", "text": "_____________________________________________________________________________________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 2, - "width": 1519, - "x": 88, - "y": 2105 - }, - "confidence": 1, - "points": [ - [ - 88, - 2105 - ], - [ - 1607, - 2105 - ], - [ - 1607, - 2107 - ], - [ - 88, - 2107 - ] - ], - "text": "_____________________________________________________________________________________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -19451,8 +3444,9 @@ "x": 819.0473, "y": 1842.6373 }, + "cells": null, "confidence": 0.73211944, - "id": "dd12055c-84a5-4350-82c3-0f568b65080f", + "id": "b337cdb8-1211-492e-9314-ee1ccd058e7c", "page": { "height": 2200, "pageIndex": 0, @@ -19489,8 +3483,9 @@ "x": 244.08379, "y": 1841.6421 }, + "cells": null, "confidence": 0.6888105, - "id": "8ce3215c-e3a8-4dce-bded-7ff5d1f5ed32", + "id": "063b3983-c7c5-40bd-b0d3-62a87c9c7f41", "page": { "height": 2200, "pageIndex": 0, @@ -19527,8 +3522,9 @@ "x": 1088.1455, "y": 1675.1329 }, + "cells": null, "confidence": 0.8412119, - "id": "558c0098-2793-4304-9231-da2cd9ed24ae", + "id": "22404257-7f04-49ce-a5b1-a06b2b1c0580", "page": { "height": 2200, "pageIndex": 0, @@ -19565,8 +3561,9 @@ "x": 1087.8441, "y": 1703.5294 }, + "cells": null, "confidence": 0.80778396, - "id": "2a4ddbd8-76ad-41a5-93f6-9daa2e14d44e", + "id": "e2052811-4422-4882-860c-bae7af8643c0", "page": { "height": 2200, "pageIndex": 0, @@ -19603,8 +3600,9 @@ "x": 1088.0198, "y": 1728.7517 }, + "cells": null, "confidence": 0.7697266, - "id": "e2f76c7e-eeee-449f-a7c1-7d0ca1dd8104", + "id": "eea508eb-152f-4e9e-9ed7-7bb70e20a432", "page": { "height": 2200, "pageIndex": 0, @@ -19641,8 +3639,9 @@ "x": 1087.3754, "y": 1754.1467 }, + "cells": null, "confidence": 0.80249274, - "id": "b2eb22fc-b72d-4ab1-a711-8f3df54e6e6a", + "id": "306cf974-15fe-4be7-a58f-20bc9ddf1e91", "page": { "height": 2200, "pageIndex": 0, @@ -19679,8 +3678,9 @@ "x": 1087.2948, "y": 1783.6954 }, + "cells": null, "confidence": 0.78306407, - "id": "fb5a145c-c9e0-4b99-80f5-6e08b875ac09", + "id": "2f5439b8-b50b-4228-9e8e-61cb4ecd3a01", "page": { "height": 2200, "pageIndex": 0, @@ -19717,8 +3717,9 @@ "x": 1088, "y": 1813 }, + "cells": null, "confidence": 0.7861436, - "id": "de2360c4-cadc-41c2-8926-3c4435052121", + "id": "1ee79f27-d8d6-447d-83e8-60b9ecb5cfad", "page": { "height": 2200, "pageIndex": 0, @@ -19746,121 +3747,7 @@ "readingOrder": 96, "role": "Text", "text": "Landscaping mature trees Typical,__________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 147, - "x": 1088, - "y": 1813 - }, - "confidence": 1, - "points": [ - [ - 1088, - 1813 - ], - [ - 1235, - 1813 - ], - [ - 1235, - 1838 - ], - [ - 1088, - 1838 - ] - ], - "text": "Landscaping" - }, - { - "bounds": { - "height": 16, - "width": 63, - "x": 1319, - "y": 1819 - }, - "confidence": 1, - "points": [ - [ - 1319, - 1819 - ], - [ - 1382, - 1819 - ], - [ - 1382, - 1835 - ], - [ - 1319, - 1835 - ] - ], - "text": "mature" - }, - { - "bounds": { - "height": 16, - "width": 47, - "x": 1388, - "y": 1819 - }, - "confidence": 1, - "points": [ - [ - 1388, - 1819 - ], - [ - 1435, - 1819 - ], - [ - 1435, - 1835 - ], - [ - 1388, - 1835 - ] - ], - "text": "trees" - }, - { - "bounds": { - "height": 25, - "width": 366, - "x": 1241, - "y": 1816 - }, - "confidence": 1, - "points": [ - [ - 1241, - 1816 - ], - [ - 1607, - 1816 - ], - [ - 1607, - 1841 - ], - [ - 1241, - 1841 - ] - ], - "text": "Typical,__________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -19869,8 +3756,9 @@ "x": 88, "y": 1843.6366 }, + "cells": null, "confidence": 0.80545706, - "id": "00e2d190-cf08-474b-9008-f1a99020ee8c", + "id": "01928774-2d35-4f65-b1f7-4f058ede1e39", "page": { "height": 2200, "pageIndex": 0, @@ -19898,345 +3786,7 @@ "readingOrder": 97, "role": "Text", "text": "Utilities Public Other Off-site improvements Type Public Private Driveway shared 2-car Asphalt,_____________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 83, - "x": 88, - "y": 1844 - }, - "confidence": 1, - "points": [ - [ - 88, - 1844 - ], - [ - 171, - 1844 - ], - [ - 171, - 1866 - ], - [ - 88, - 1866 - ] - ], - "text": "Utilities" - }, - { - "bounds": { - "height": 22, - "width": 69, - "x": 244, - "y": 1844 - }, - "confidence": 1, - "points": [ - [ - 244, - 1844 - ], - [ - 313, - 1844 - ], - [ - 313, - 1866 - ], - [ - 244, - 1866 - ] - ], - "text": "Public" - }, - { - "bounds": { - "height": 22, - "width": 63, - "x": 380, - "y": 1844 - }, - "confidence": 1, - "points": [ - [ - 380, - 1844 - ], - [ - 443, - 1844 - ], - [ - 443, - 1866 - ], - [ - 380, - 1866 - ] - ], - "text": "Other" - }, - { - "bounds": { - "height": 22, - "width": 83, - "x": 511, - "y": 1844 - }, - "confidence": 1, - "points": [ - [ - 511, - 1844 - ], - [ - 594, - 1844 - ], - [ - 594, - 1866 - ], - [ - 511, - 1866 - ] - ], - "text": "Off-site" - }, - { - "bounds": { - "height": 25, - "width": 155, - "x": 602, - "y": 1844 - }, - "confidence": 1, - "points": [ - [ - 602, - 1844 - ], - [ - 757, - 1844 - ], - [ - 757, - 1869 - ], - [ - 602, - 1869 - ] - ], - "text": "improvements" - }, - { - "bounds": { - "height": 25, - "width": 55, - "x": 816, - "y": 1844 - }, - "confidence": 1, - "points": [ - [ - 816, - 1844 - ], - [ - 871, - 1844 - ], - [ - 871, - 1869 - ], - [ - 816, - 1869 - ] - ], - "text": "Type" - }, - { - "bounds": { - "height": 22, - "width": 69, - "x": 899, - "y": 1844 - }, - "confidence": 1, - "points": [ - [ - 899, - 1844 - ], - [ - 968, - 1844 - ], - [ - 968, - 1866 - ], - [ - 899, - 1866 - ] - ], - "text": "Public" - }, - { - "bounds": { - "height": 22, - "width": 77, - "x": 988, - "y": 1844 - }, - "confidence": 1, - "points": [ - [ - 988, - 1844 - ], - [ - 1065, - 1844 - ], - [ - 1065, - 1866 - ], - [ - 988, - 1866 - ] - ], - "text": "Private" - }, - { - "bounds": { - "height": 25, - "width": 105, - "x": 1088, - "y": 1844 - }, - "confidence": 1, - "points": [ - [ - 1088, - 1844 - ], - [ - 1193, - 1844 - ], - [ - 1193, - 1869 - ], - [ - 1088, - 1869 - ] - ], - "text": "Driveway" - }, - { - "bounds": { - "height": 22, - "width": 69, - "x": 1288, - "y": 1844 - }, - "confidence": 1, - "points": [ - [ - 1288, - 1844 - ], - [ - 1357, - 1844 - ], - [ - 1357, - 1866 - ], - [ - 1288, - 1866 - ] - ], - "text": "shared" - }, - { - "bounds": { - "height": 19, - "width": 52, - "x": 1366, - "y": 1847 - }, - "confidence": 1, - "points": [ - [ - 1366, - 1847 - ], - [ - 1418, - 1847 - ], - [ - 1418, - 1866 - ], - [ - 1366, - 1866 - ] - ], - "text": "2-car" - }, - { - "bounds": { - "height": 27, - "width": 408, - "x": 1200, - "y": 1844 - }, - "confidence": 1, - "points": [ - [ - 1200, - 1844 - ], - [ - 1608, - 1844 - ], - [ - 1608, - 1871 - ], - [ - 1200, - 1871 - ] - ], - "text": "Asphalt,_____________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -20245,8 +3795,9 @@ "x": 511, "y": 1872 }, + "cells": null, "confidence": 0.7476007, - "id": "bf3d8f1e-0ea9-4667-8228-55f6b51b7bf6", + "id": "fd19abb0-84cf-4e66-a682-74145b522c66", "page": { "height": 2200, "pageIndex": 0, @@ -20274,261 +3825,7 @@ "readingOrder": 98, "role": "Text", "text": "Street paved Asphalt____________________ ❐Apparent easements utility easements along Standard____________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 69, - "x": 511, - "y": 1872 - }, - "confidence": 1, - "points": [ - [ - 511, - 1872 - ], - [ - 580, - 1872 - ], - [ - 580, - 1894 - ], - [ - 511, - 1894 - ] - ], - "text": "Street" - }, - { - "bounds": { - "height": 25, - "width": 61, - "x": 669, - "y": 1874 - }, - "confidence": 1, - "points": [ - [ - 669, - 1874 - ], - [ - 730, - 1874 - ], - [ - 730, - 1899 - ], - [ - 669, - 1899 - ] - ], - "text": "paved" - }, - { - "bounds": { - "height": 25, - "width": 286, - "x": 586, - "y": 1874 - }, - "confidence": 1, - "points": [ - [ - 586, - 1874 - ], - [ - 872, - 1874 - ], - [ - 872, - 1899 - ], - [ - 586, - 1899 - ] - ], - "text": "Asphalt____________________" - }, - { - "bounds": { - "height": 25, - "width": 177, - "x": 1011, - "y": 1874 - }, - "confidence": 1, - "points": [ - [ - 1011, - 1874 - ], - [ - 1188, - 1874 - ], - [ - 1188, - 1899 - ], - [ - 1011, - 1899 - ] - ], - "text": "❐Apparent" - }, - { - "bounds": { - "height": 19, - "width": 122, - "x": 1200, - "y": 1874 - }, - "confidence": 1, - "points": [ - [ - 1200, - 1874 - ], - [ - 1322, - 1874 - ], - [ - 1322, - 1893 - ], - [ - 1200, - 1893 - ] - ], - "text": "easements" - }, - { - "bounds": { - "height": 25, - "width": 47, - "x": 1416, - "y": 1877 - }, - "confidence": 1, - "points": [ - [ - 1416, - 1877 - ], - [ - 1463, - 1877 - ], - [ - 1463, - 1902 - ], - [ - 1416, - 1902 - ] - ], - "text": "utility" - }, - { - "bounds": { - "height": 16, - "width": 100, - "x": 1469, - "y": 1880 - }, - "confidence": 1, - "points": [ - [ - 1469, - 1880 - ], - [ - 1569, - 1880 - ], - [ - 1569, - 1896 - ], - [ - 1469, - 1896 - ] - ], - "text": "easements" - }, - { - "bounds": { - "height": 25, - "width": 52, - "x": 1575, - "y": 1877 - }, - "confidence": 1, - "points": [ - [ - 1575, - 1877 - ], - [ - 1627, - 1877 - ], - [ - 1627, - 1902 - ], - [ - 1575, - 1902 - ] - ], - "text": "along" - }, - { - "bounds": { - "height": 22, - "width": 283, - "x": 1325, - "y": 1877 - }, - "confidence": 1, - "points": [ - [ - 1325, - 1877 - ], - [ - 1608, - 1877 - ], - [ - 1608, - 1899 - ], - [ - 1325, - 1899 - ] - ], - "text": "Standard____________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -20537,8 +3834,9 @@ "x": 1087.4241, "y": 1932.4323 }, + "cells": null, "confidence": 0.6305144, - "id": "f886114f-4ea0-404f-bd58-6a2b3c1e48c1", + "id": "41e93c90-cc04-4442-a612-a693be90130e", "page": { "height": 2200, "pageIndex": 0, @@ -20575,8 +3873,9 @@ "x": 1087.0326, "y": 1962.7322 }, + "cells": null, "confidence": 0.74293, - "id": "e1101400-0933-4a1d-8702-522dadbd7e8d", + "id": "7984751e-5112-4dcd-a062-6a4347e3dce4", "page": { "height": 2200, "pageIndex": 0, @@ -20613,8 +3912,9 @@ "x": 1380.9241, "y": 1932.4584 }, + "cells": null, "confidence": 0.6234876, - "id": "7ece6278-fc60-4ca9-9ef2-5825cee50377", + "id": "8dd0d710-0888-4089-9d91-062bbfcc44ac", "page": { "height": 2200, "pageIndex": 0, @@ -20651,8 +3951,9 @@ "x": 788, "y": 448.22253 }, + "cells": null, "confidence": 0.7939793, - "id": "1bbd89a2-80b4-4765-b024-7b0803d56105", + "id": "b2108b78-9a52-417d-869a-5bfaa3f49e39", "page": { "height": 2200, "pageIndex": 0, @@ -20680,233 +3981,7 @@ "readingOrder": 102, "role": "Text", "text": "Predominant Single family housing Predominant 2-4 family housing", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 127, - "x": 788, - "y": 449 - }, - "confidence": 1, - "points": [ - [ - 788, - 449 - ], - [ - 915, - 449 - ], - [ - 915, - 468 - ], - [ - 788, - 468 - ] - ], - "text": "Predominant" - }, - { - "bounds": { - "height": 25, - "width": 63, - "x": 999, - "y": 449 - }, - "confidence": 1, - "points": [ - [ - 999, - 449 - ], - [ - 1062, - 449 - ], - [ - 1062, - 474 - ], - [ - 999, - 474 - ] - ], - "text": "Single" - }, - { - "bounds": { - "height": 25, - "width": 58, - "x": 1069, - "y": 449 - }, - "confidence": 1, - "points": [ - [ - 1069, - 449 - ], - [ - 1127, - 449 - ], - [ - 1127, - 474 - ], - [ - 1069, - 474 - ] - ], - "text": "family" - }, - { - "bounds": { - "height": 25, - "width": 77, - "x": 1133, - "y": 449 - }, - "confidence": 1, - "points": [ - [ - 1133, - 449 - ], - [ - 1210, - 449 - ], - [ - 1210, - 474 - ], - [ - 1133, - 474 - ] - ], - "text": "housing" - }, - { - "bounds": { - "height": 19, - "width": 124, - "x": 1238, - "y": 449 - }, - "confidence": 1, - "points": [ - [ - 1238, - 449 - ], - [ - 1362, - 449 - ], - [ - 1362, - 468 - ], - [ - 1238, - 468 - ] - ], - "text": "Predominant" - }, - { - "bounds": { - "height": 19, - "width": 33, - "x": 1458, - "y": 449 - }, - "confidence": 1, - "points": [ - [ - 1458, - 449 - ], - [ - 1491, - 449 - ], - [ - 1491, - 468 - ], - [ - 1458, - 468 - ] - ], - "text": "2-4" - }, - { - "bounds": { - "height": 25, - "width": 61, - "x": 1497, - "y": 449 - }, - "confidence": 1, - "points": [ - [ - 1497, - 449 - ], - [ - 1558, - 449 - ], - [ - 1558, - 474 - ], - [ - 1497, - 474 - ] - ], - "text": "family" - }, - { - "bounds": { - "height": 25, - "width": 77, - "x": 1563, - "y": 449 - }, - "confidence": 1, - "points": [ - [ - 1563, - 449 - ], - [ - 1640, - 449 - ], - [ - 1640, - 474 - ], - [ - 1563, - 474 - ] - ], - "text": "housing" - } - ] + "type": "paragraph" }, { "bounds": { @@ -20915,8 +3990,9 @@ "x": 1126.2278, "y": 483.3553 }, + "cells": null, "confidence": 0.5394126, - "id": "16b3a655-5935-44dd-938b-276291763487", + "id": "3a343ca1-1adc-4c43-a3b5-1a60fec2e6f8", "page": { "height": 2200, "pageIndex": 0, @@ -20953,8 +4029,9 @@ "x": 1238.0159, "y": 448.52078 }, + "cells": null, "confidence": 0.774351, - "id": "dcd0268d-dc94-41f2-9e3f-508ad9a73333", + "id": "33373d86-3117-415b-9404-2be49e94c1ab", "page": { "height": 2200, "pageIndex": 0, @@ -20991,8 +4068,9 @@ "x": 1245.1691, "y": 481.7899 }, + "cells": null, "confidence": 0.7011242, - "id": "f41ca7aa-fb1e-4e33-b86f-c6fbfc2a7bec", + "id": "4f17e74e-3ed2-45af-b893-eeb97fc3ba4b", "page": { "height": 2200, "pageIndex": 0, @@ -21029,8 +4107,9 @@ "x": 1244.7555, "y": 515.0571 }, + "cells": null, "confidence": 0.6538947, - "id": "a7854649-0033-4e05-a1ce-7b46c070a837", + "id": "22b07814-5305-4783-8ab1-8619791af130", "page": { "height": 2200, "pageIndex": 0, @@ -21067,8 +4146,9 @@ "x": 788, "y": 546.79736 }, + "cells": null, "confidence": 0.8216744, - "id": "362f5bc8-f043-471c-8478-da30eb5c5bc6", + "id": "3a8cefb1-8697-4c90-8ce5-727faf063c45", "page": { "height": 2200, "pageIndex": 0, @@ -21096,149 +4176,7 @@ "readingOrder": 107, "role": "CheckboxSelected", "text": "❐ Owner 4 ❐ Owner", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 22, - "x": 788, - "y": 547 - }, - "confidence": 1, - "points": [ - [ - 788, - 547 - ], - [ - 810, - 547 - ], - [ - 810, - 569 - ], - [ - 788, - 569 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 66, - "x": 819, - "y": 550 - }, - "confidence": 1, - "points": [ - [ - 819, - 550 - ], - [ - 885, - 550 - ], - [ - 885, - 569 - ], - [ - 819, - 569 - ] - ], - "text": "Owner" - }, - { - "bounds": { - "height": 11, - "width": 13, - "x": 1250, - "y": 552 - }, - "confidence": 1, - "points": [ - [ - 1250, - 552 - ], - [ - 1263, - 552 - ], - [ - 1263, - 563 - ], - [ - 1250, - 563 - ] - ], - "text": "4" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 1244, - "y": 547 - }, - "confidence": 1, - "points": [ - [ - 1244, - 547 - ], - [ - 1266, - 547 - ], - [ - 1266, - 569 - ], - [ - 1244, - 569 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 66, - "x": 1277, - "y": 550 - }, - "confidence": 1, - "points": [ - [ - 1277, - 550 - ], - [ - 1343, - 550 - ], - [ - 1343, - 569 - ], - [ - 1277, - 569 - ] - ], - "text": "Owner" - } - ] + "type": "paragraph" }, { "bounds": { @@ -21247,8 +4185,9 @@ "x": 1245.4707, "y": 579.83856 }, + "cells": null, "confidence": 0.80994934, - "id": "2b8ca63b-b267-420c-bb6f-0a671d25d71d", + "id": "a0ff52c1-4f05-442f-8da4-c52c7cadd442", "page": { "height": 2200, "pageIndex": 0, @@ -21285,8 +4224,9 @@ "x": 1245.8438, "y": 613.97754 }, + "cells": null, "confidence": 0.84707636, - "id": "9d76d6e9-0236-482e-8d8b-163712900864", + "id": "0dba88b1-b156-4fa4-9fa3-33820a6a3b0f", "page": { "height": 2200, "pageIndex": 0, @@ -21323,8 +4263,9 @@ "x": 1246.0901, "y": 646.2902 }, + "cells": null, "confidence": 0.84032375, - "id": "15b9ccd3-b41e-4b63-a6c6-ab54cfc81097", + "id": "f0b8f72d-b252-475b-8182-071e0c5bb2b2", "page": { "height": 2200, "pageIndex": 0, @@ -21351,7 +4292,7 @@ ], "readingOrder": 110, "role": "CheckboxUnselected", - "text": "Vacant (over 5%)", + "text": "Vacant over 5%", "type": "paragraph" }, { @@ -21361,8 +4302,9 @@ "x": 1095.7427, "y": 685.6061 }, + "cells": null, "confidence": 0.7601719, - "id": "bc0a64c1-9d9d-4db9-85bb-0d4111d00d9a", + "id": "ad01241b-23e5-4384-9c12-6562b5cb62a4", "page": { "height": 2200, "pageIndex": 0, @@ -21399,8 +4341,9 @@ "x": 1094.0166, "y": 717.69366 }, + "cells": null, "confidence": 0.5734749, - "id": "231d1940-38cd-4242-9ffb-1120d57c6243", + "id": "94df3095-ccc3-4689-8031-4d650cfa4603", "page": { "height": 2200, "pageIndex": 0, @@ -21437,8 +4380,9 @@ "x": 1096.9583, "y": 747.2375 }, + "cells": null, "confidence": 0.6053193, - "id": "dae14b53-5598-4c99-bef4-1f2de283d3d3", + "id": "d3ca5d22-5e96-4449-a03b-a72c414aa84d", "page": { "height": 2200, "pageIndex": 0, @@ -21475,8 +4419,9 @@ "x": 1093.289, "y": 776.2828 }, + "cells": null, "confidence": 0.52194566, - "id": "81b634d4-b899-4106-a3cd-a5c6f44e680d", + "id": "93e6139f-54c5-4c11-9c3b-74181f525c88", "page": { "height": 2200, "pageIndex": 0, @@ -21513,8 +4458,9 @@ "x": 1086, "y": 805 }, + "cells": null, "confidence": 0.6171675, - "id": "37f1e4fa-e829-4e26-a0c6-a7746eb191b5", + "id": "2afe8efd-6495-471b-8caf-ae031082e230", "page": { "height": 2200, "pageIndex": 0, @@ -21542,149 +4488,7 @@ "readingOrder": 115, "role": "Text", "text": "to the south, and Commercial", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 16, - "width": 19, - "x": 1086, - "y": 813 - }, - "confidence": 1, - "points": [ - [ - 1086, - 813 - ], - [ - 1105, - 813 - ], - [ - 1105, - 829 - ], - [ - 1086, - 829 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 19, - "width": 33, - "x": 1111, - "y": 811 - }, - "confidence": 1, - "points": [ - [ - 1111, - 811 - ], - [ - 1144, - 811 - ], - [ - 1144, - 830 - ], - [ - 1111, - 830 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 1150, - "y": 811 - }, - "confidence": 1, - "points": [ - [ - 1150, - 811 - ], - [ - 1211, - 811 - ], - [ - 1211, - 833 - ], - [ - 1150, - 833 - ] - ], - "text": "south," - }, - { - "bounds": { - "height": 19, - "width": 38, - "x": 1219, - "y": 811 - }, - "confidence": 1, - "points": [ - [ - 1219, - 811 - ], - [ - 1257, - 811 - ], - [ - 1257, - 830 - ], - [ - 1219, - 830 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 22, - "width": 136, - "x": 1094, - "y": 805 - }, - "confidence": 1, - "points": [ - [ - 1094, - 805 - ], - [ - 1230, - 805 - ], - [ - 1230, - 827 - ], - [ - 1094, - 827 - ] - ], - "text": "Commercial" - } - ] + "type": "paragraph" }, { "bounds": { @@ -21693,8 +4497,9 @@ "x": 1413.0552, "y": 686.65906 }, + "cells": null, "confidence": 0.6707317, - "id": "91a2fb3e-4b54-45d5-b832-ba060adf0c26", + "id": "e95c39a5-24c7-4bcb-8e3f-6c983749b96c", "page": { "height": 2200, "pageIndex": 0, @@ -21731,8 +4536,9 @@ "x": 1527.2808, "y": 715.2623 }, + "cells": null, "confidence": 0.6029566, - "id": "36987c40-6a12-4747-a95e-c4a239ea7e63", + "id": "4bcb273f-db6a-4ce8-a558-4dd9335eb975", "page": { "height": 2200, "pageIndex": 0, @@ -21769,8 +4575,9 @@ "x": 1375.5531, "y": 746.4315 }, + "cells": null, "confidence": 0.7997322, - "id": "fde58c8e-41a8-4099-a1fa-c981d3b7a90f", + "id": "690c08df-c9c9-4d8f-b97f-3cf6fbbafab8", "page": { "height": 2200, "pageIndex": 0, @@ -21807,8 +4614,9 @@ "x": 456.81604, "y": 446.59058 }, + "cells": null, "confidence": 0.8682944, - "id": "b0755b0f-e944-4f43-a7f6-4c1eb3609b5f", + "id": "ae2827ef-0d13-47de-8856-a5c459d06690", "page": { "height": 2200, "pageIndex": 0, @@ -21836,93 +4644,7 @@ "readingOrder": 119, "role": "CheckboxSelected", "text": "4 ❐ Suburban", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 13, - "width": 16, - "x": 461, - "y": 449 - }, - "confidence": 1, - "points": [ - [ - 461, - 449 - ], - [ - 477, - 449 - ], - [ - 477, - 462 - ], - [ - 461, - 462 - ] - ], - "text": "4" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 458, - "y": 447 - }, - "confidence": 1, - "points": [ - [ - 458, - 447 - ], - [ - 480, - 447 - ], - [ - 480, - 469 - ], - [ - 458, - 469 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 97, - "x": 488, - "y": 449 - }, - "confidence": 1, - "points": [ - [ - 488, - 449 - ], - [ - 585, - 449 - ], - [ - 585, - 468 - ], - [ - 488, - 468 - ] - ], - "text": "Suburban" - } - ] + "type": "paragraph" }, { "bounds": { @@ -21931,8 +4653,9 @@ "x": 456.4448, "y": 479.36438 }, + "cells": null, "confidence": 0.81071293, - "id": "2cf304a8-9217-44b6-9069-b94851d9958b", + "id": "c4dd13e9-8d52-43bc-bed0-2e6b140505e1", "page": { "height": 2200, "pageIndex": 0, @@ -21960,93 +4683,7 @@ "readingOrder": 120, "role": "CheckboxSelected", "text": "4 ❐ 25-75%", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 13, - "width": 16, - "x": 461, - "y": 483 - }, - "confidence": 1, - "points": [ - [ - 461, - 483 - ], - [ - 477, - 483 - ], - [ - 477, - 496 - ], - [ - 461, - 496 - ] - ], - "text": "4" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 458, - "y": 480 - }, - "confidence": 1, - "points": [ - [ - 458, - 480 - ], - [ - 480, - 480 - ], - [ - 480, - 502 - ], - [ - 458, - 502 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 77, - "x": 488, - "y": 483 - }, - "confidence": 1, - "points": [ - [ - 488, - 483 - ], - [ - 565, - 483 - ], - [ - 565, - 502 - ], - [ - 488, - 502 - ] - ], - "text": "25-75%" - } - ] + "type": "paragraph" }, { "bounds": { @@ -22055,8 +4692,9 @@ "x": 457.36115, "y": 511.93472 }, + "cells": null, "confidence": 0.8482855, - "id": "4f5f0762-5c8f-43e3-974c-934201f8c76c", + "id": "376e90ea-074f-41f2-903a-8c631d95cf35", "page": { "height": 2200, "pageIndex": 0, @@ -22084,93 +4722,7 @@ "readingOrder": 121, "role": "CheckboxSelected", "text": "4 ❐ Stable", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 13, - "width": 16, - "x": 461, - "y": 516 - }, - "confidence": 1, - "points": [ - [ - 461, - 516 - ], - [ - 477, - 516 - ], - [ - 477, - 529 - ], - [ - 461, - 529 - ] - ], - "text": "4" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 458, - "y": 513 - }, - "confidence": 1, - "points": [ - [ - 458, - 513 - ], - [ - 480, - 513 - ], - [ - 480, - 535 - ], - [ - 458, - 535 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 63, - "x": 486, - "y": 516 - }, - "confidence": 1, - "points": [ - [ - 486, - 516 - ], - [ - 549, - 516 - ], - [ - 549, - 535 - ], - [ - 486, - 535 - ] - ], - "text": "Stable" - } - ] + "type": "paragraph" }, { "bounds": { @@ -22179,8 +4731,9 @@ "x": 457.03827, "y": 546.92365 }, + "cells": null, "confidence": 0.82588786, - "id": "cf853289-8a75-41d8-8db6-c3a36dd57e81", + "id": "936159ed-863a-4e27-9c67-a0b600745c15", "page": { "height": 2200, "pageIndex": 0, @@ -22208,93 +4761,7 @@ "readingOrder": 122, "role": "CheckboxSelected", "text": "4 ❐ Stable", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 13, - "width": 16, - "x": 461, - "y": 550 - }, - "confidence": 1, - "points": [ - [ - 461, - 550 - ], - [ - 477, - 550 - ], - [ - 477, - 563 - ], - [ - 461, - 563 - ] - ], - "text": "4" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 458, - "y": 547 - }, - "confidence": 1, - "points": [ - [ - 458, - 547 - ], - [ - 480, - 547 - ], - [ - 480, - 569 - ], - [ - 458, - 569 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 63, - "x": 486, - "y": 550 - }, - "confidence": 1, - "points": [ - [ - 486, - 550 - ], - [ - 549, - 550 - ], - [ - 549, - 569 - ], - [ - 486, - 569 - ] - ], - "text": "Stable" - } - ] + "type": "paragraph" }, { "bounds": { @@ -22303,8 +4770,9 @@ "x": 456.76562, "y": 580 }, + "cells": null, "confidence": 0.84321874, - "id": "59581149-112f-4d6f-9785-2e9edf4651e7", + "id": "318eab57-febc-42f5-85a3-41bbe9c0b0bd", "page": { "height": 2200, "pageIndex": 0, @@ -22332,121 +4800,7 @@ "readingOrder": 123, "role": "CheckboxSelected", "text": "4 ❐ In balance", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 13, - "width": 16, - "x": 461, - "y": 583 - }, - "confidence": 1, - "points": [ - [ - 461, - 583 - ], - [ - 477, - 583 - ], - [ - 477, - 596 - ], - [ - 461, - 596 - ] - ], - "text": "4" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 458, - "y": 580 - }, - "confidence": 1, - "points": [ - [ - 458, - 580 - ], - [ - 480, - 580 - ], - [ - 480, - 602 - ], - [ - 458, - 602 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 16, - "x": 488, - "y": 583 - }, - "confidence": 1, - "points": [ - [ - 488, - 583 - ], - [ - 504, - 583 - ], - [ - 504, - 602 - ], - [ - 488, - 602 - ] - ], - "text": "In" - }, - { - "bounds": { - "height": 19, - "width": 77, - "x": 513, - "y": 583 - }, - "confidence": 1, - "points": [ - [ - 513, - 583 - ], - [ - 590, - 583 - ], - [ - 590, - 602 - ], - [ - 513, - 602 - ] - ], - "text": "balance" - } - ] + "type": "paragraph" }, { "bounds": { @@ -22455,8 +4809,9 @@ "x": 456.88242, "y": 613 }, + "cells": null, "confidence": 0.8076844, - "id": "9fbb2b9b-8292-4bd7-8921-34d590995098", + "id": "50d774c8-ea6b-4888-b3b8-433a78775926", "page": { "height": 2200, "pageIndex": 0, @@ -22484,121 +4839,7 @@ "readingOrder": 124, "role": "CheckboxSelected", "text": "4 ❐ 3-6 mos.", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 13, - "width": 16, - "x": 461, - "y": 616 - }, - "confidence": 1, - "points": [ - [ - 461, - 616 - ], - [ - 477, - 616 - ], - [ - 477, - 629 - ], - [ - 461, - 629 - ] - ], - "text": "4" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 458, - "y": 613 - }, - "confidence": 1, - "points": [ - [ - 458, - 613 - ], - [ - 480, - 613 - ], - [ - 480, - 635 - ], - [ - 458, - 635 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 33, - "x": 488, - "y": 616 - }, - "confidence": 1, - "points": [ - [ - 488, - 616 - ], - [ - 521, - 616 - ], - [ - 521, - 635 - ], - [ - 488, - 635 - ] - ], - "text": "3-6" - }, - { - "bounds": { - "height": 13, - "width": 50, - "x": 527, - "y": 622 - }, - "confidence": 1, - "points": [ - [ - 527, - 622 - ], - [ - 577, - 622 - ], - [ - 577, - 635 - ], - [ - 527, - 635 - ] - ], - "text": "mos." - } - ] + "type": "paragraph" }, { "bounds": { @@ -22607,8 +4848,9 @@ "x": 607.8654, "y": 446.95975 }, + "cells": null, "confidence": 0.75566787, - "id": "c28bed36-4918-481e-a587-96dc59f852e8", + "id": "fd609d53-dc0f-4f3d-8c78-e823d0c784b3", "page": { "height": 2200, "pageIndex": 0, @@ -22636,65 +4878,7 @@ "readingOrder": 125, "role": "CheckboxUnselected", "text": "❐ Rural", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 22, - "x": 608, - "y": 447 - }, - "confidence": 1, - "points": [ - [ - 608, - 447 - ], - [ - 630, - 447 - ], - [ - 630, - 469 - ], - [ - 608, - 469 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 52, - "x": 638, - "y": 449 - }, - "confidence": 1, - "points": [ - [ - 638, - 449 - ], - [ - 690, - 449 - ], - [ - 690, - 468 - ], - [ - 638, - 468 - ] - ], - "text": "Rural" - } - ] + "type": "paragraph" }, { "bounds": { @@ -22703,8 +4887,9 @@ "x": 607.55963, "y": 479.94223 }, + "cells": null, "confidence": 0.8407869, - "id": "c6d0cc4d-c522-495c-bf88-f1dfc9f59713", + "id": "46ccf496-d9fa-4b08-950b-00191c1315d4", "page": { "height": 2200, "pageIndex": 0, @@ -22732,93 +4917,7 @@ "readingOrder": 126, "role": "CheckboxUnselected", "text": "❐ Under 25%", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 22, - "x": 608, - "y": 480 - }, - "confidence": 1, - "points": [ - [ - 608, - 480 - ], - [ - 630, - 480 - ], - [ - 630, - 502 - ], - [ - 608, - 502 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 61, - "x": 638, - "y": 483 - }, - "confidence": 1, - "points": [ - [ - 638, - 483 - ], - [ - 699, - 483 - ], - [ - 699, - 502 - ], - [ - 638, - 502 - ] - ], - "text": "Under" - }, - { - "bounds": { - "height": 19, - "width": 47, - "x": 705, - "y": 483 - }, - "confidence": 1, - "points": [ - [ - 705, - 483 - ], - [ - 752, - 483 - ], - [ - 752, - 502 - ], - [ - 705, - 502 - ] - ], - "text": "25%" - } - ] + "type": "paragraph" }, { "bounds": { @@ -22827,8 +4926,9 @@ "x": 607.7231, "y": 512.5644 }, + "cells": null, "confidence": 0.771621, - "id": "b78974d6-6388-49bf-8faf-474cea068ee2", + "id": "46cf89e5-5f53-4062-9d22-6b8c05da31eb", "page": { "height": 2200, "pageIndex": 0, @@ -22856,65 +4956,7 @@ "readingOrder": 127, "role": "CheckboxUnselected", "text": "❐ Slow", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 22, - "x": 608, - "y": 513 - }, - "confidence": 1, - "points": [ - [ - 608, - 513 - ], - [ - 630, - 513 - ], - [ - 630, - 535 - ], - [ - 608, - 535 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 50, - "x": 636, - "y": 516 - }, - "confidence": 1, - "points": [ - [ - 636, - 516 - ], - [ - 686, - 516 - ], - [ - 686, - 535 - ], - [ - 636, - 535 - ] - ], - "text": "Slow" - } - ] + "type": "paragraph" }, { "bounds": { @@ -22923,8 +4965,9 @@ "x": 607.9271, "y": 580 }, + "cells": null, "confidence": 0.8322678, - "id": "4c075780-a773-4d81-88d5-170098bcdb53", + "id": "632a1455-4adf-4834-96b4-eece2533313a", "page": { "height": 2200, "pageIndex": 0, @@ -22952,93 +4995,7 @@ "readingOrder": 128, "role": "CheckboxUnselected", "text": "❐ Over supply", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 22, - "x": 608, - "y": 580 - }, - "confidence": 1, - "points": [ - [ - 608, - 580 - ], - [ - 630, - 580 - ], - [ - 630, - 602 - ], - [ - 608, - 602 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 50, - "x": 638, - "y": 583 - }, - "confidence": 1, - "points": [ - [ - 638, - 583 - ], - [ - 688, - 583 - ], - [ - 688, - 602 - ], - [ - 638, - 602 - ] - ], - "text": "Over" - }, - { - "bounds": { - "height": 25, - "width": 66, - "x": 697, - "y": 583 - }, - "confidence": 1, - "points": [ - [ - 697, - 583 - ], - [ - 763, - 583 - ], - [ - 763, - 608 - ], - [ - 697, - 608 - ] - ], - "text": "supply" - } - ] + "type": "paragraph" }, { "bounds": { @@ -23047,8 +5004,9 @@ "x": 607.5477, "y": 613 }, + "cells": null, "confidence": 0.83587754, - "id": "c42478d1-270b-4981-b46d-4d435c893f83", + "id": "44d4f106-a04c-4066-9105-5b3743330e5f", "page": { "height": 2200, "pageIndex": 0, @@ -23076,121 +5034,7 @@ "readingOrder": 129, "role": "CheckboxUnselected", "text": "❐ Over 6 mos.", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 22, - "x": 608, - "y": 613 - }, - "confidence": 1, - "points": [ - [ - 608, - 613 - ], - [ - 630, - 613 - ], - [ - 630, - 635 - ], - [ - 608, - 635 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 50, - "x": 638, - "y": 616 - }, - "confidence": 1, - "points": [ - [ - 638, - 616 - ], - [ - 688, - 616 - ], - [ - 688, - 635 - ], - [ - 638, - 635 - ] - ], - "text": "Over" - }, - { - "bounds": { - "height": 19, - "width": 13, - "x": 694, - "y": 616 - }, - "confidence": 1, - "points": [ - [ - 694, - 616 - ], - [ - 707, - 616 - ], - [ - 707, - 635 - ], - [ - 694, - 635 - ] - ], - "text": "6" - }, - { - "bounds": { - "height": 13, - "width": 47, - "x": 716, - "y": 622 - }, - "confidence": 1, - "points": [ - [ - 716, - 622 - ], - [ - 763, - 622 - ], - [ - 763, - 635 - ], - [ - 716, - 635 - ] - ], - "text": "mos." - } - ] + "type": "paragraph" }, { "bounds": { @@ -23199,8 +5043,9 @@ "x": 677.80396, "y": 715.80334 }, + "cells": null, "confidence": 0.6177362, - "id": "cd94aae3-0c10-42fa-bd0c-cd0fbc6d7540", + "id": "bded906b-4a80-45ec-b11b-de9c22de9545", "page": { "height": 2200, "pageIndex": 0, @@ -23237,8 +5082,9 @@ "x": 753.62085, "y": 192.09045 }, + "cells": null, "confidence": 0.6821304, - "id": "e65d130d-267b-4378-ae46-f65d56d89d2b", + "id": "4870e3d9-272a-419f-9590-febff2a19791", "page": { "height": 2200, "pageIndex": 0, @@ -23275,8 +5121,9 @@ "x": 47.02567, "y": 205.1013 }, + "cells": null, "confidence": 0.79456633, - "id": "4384e865-55c9-4094-8b4f-4778dd8f5c8f", + "id": "97cad986-802b-48e9-81c1-8aca6a161215", "page": { "height": 2200, "pageIndex": 0, @@ -23313,8 +5160,9 @@ "x": 46.45737, "y": 870.4129 }, + "cells": null, "confidence": 0.81834817, - "id": "f4265619-60a5-441e-a5e7-1877a906e8d1", + "id": "fc281b4a-77e9-4e8b-90c1-1576aec404b3", "page": { "height": 2200, "pageIndex": 0, @@ -23351,8 +5199,9 @@ "x": 1499.1122, "y": 257.8615 }, + "cells": null, "confidence": 0.77395415, - "id": "7fec4b8f-a61b-49ed-b6cb-367c8b581b6f", + "id": "7e739ed4-9fe4-419f-8913-f8829c733fdb", "page": { "height": 2200, "pageIndex": 0, @@ -23389,8 +5238,9 @@ "x": 1542.4333, "y": 303.27698 }, + "cells": null, "confidence": 0.57727927, - "id": "9d0dc865-316d-402c-a1e9-c587140138f3", + "id": "8f1f984e-77c8-414f-9ea5-c8c487d11975", "page": { "height": 2200, "pageIndex": 0, @@ -23427,8 +5277,9 @@ "x": 1458.0778, "y": 448.70886 }, + "cells": null, "confidence": 0.7197258, - "id": "7dac5487-8c9f-4a13-9371-ac716861ea8f", + "id": "6c84368b-3c9f-4919-96cf-857875d875ee", "page": { "height": 2200, "pageIndex": 0, @@ -23465,8 +5316,9 @@ "x": 1458.9281, "y": 481.9559 }, + "cells": null, "confidence": 0.64225674, - "id": "acefa282-33f3-4f73-87d8-32ba81b69760", + "id": "0307f0a0-27f2-4392-9861-99f91583c82f", "page": { "height": 2200, "pageIndex": 0, @@ -23503,8 +5355,9 @@ "x": 1459.0128, "y": 514.54474 }, + "cells": null, "confidence": 0.59097576, - "id": "3a972569-ff6d-4ccf-aeee-f9f936893e3c", + "id": "e8affe9b-4bb2-4103-8bae-304023e87d97", "page": { "height": 2200, "pageIndex": 0, @@ -23541,8 +5394,9 @@ "x": 1581.6611, "y": 483.52966 }, + "cells": null, "confidence": 0.5654755, - "id": "9b716c1d-4c05-4060-81bb-b2cb9f7473ff", + "id": "93b74f13-6292-4af5-b038-62315bc72aee", "page": { "height": 2200, "pageIndex": 0, @@ -23579,8 +5433,9 @@ "x": 1581.6412, "y": 515.867 }, + "cells": null, "confidence": 0.50207365, - "id": "ef46f6e0-1970-4f49-be64-11e32b13ff40", + "id": "252b1530-e34c-4949-b4e7-fb56ae1eedd4", "page": { "height": 2200, "pageIndex": 0, @@ -23617,8 +5472,9 @@ "x": 1525.8134, "y": 582.5939 }, + "cells": null, "confidence": 0.52505624, - "id": "e222cbf9-ff18-4c5c-ba5f-5780e12aeffb", + "id": "587c6c05-8221-4e6c-aa3b-9fc3b055a0a7", "page": { "height": 2200, "pageIndex": 0, @@ -23655,8 +5511,9 @@ "x": 1462.1752, "y": 608.97424 }, + "cells": null, "confidence": 0.5960686, - "id": "76492d3b-2cf1-4c99-9bda-b46a19c28e1f", + "id": "bbeb2406-b9f0-417c-b3fd-b44808caeb14", "page": { "height": 2200, "pageIndex": 0, @@ -23693,8 +5550,9 @@ "x": 1022.6053, "y": 515.9587 }, + "cells": null, "confidence": 0.5707275, - "id": "0a176a05-3548-4d87-9eaa-ef5c61fb352d", + "id": "8bdeb9cf-6470-4212-8d36-d29566aa1808", "page": { "height": 2200, "pageIndex": 0, @@ -23731,8 +5589,9 @@ "x": 788, "y": 580 }, + "cells": null, "confidence": 0.6572287, - "id": "65964d9d-260d-4031-bb16-0763c1b0e8b4", + "id": "0f75654c-a724-49a3-abac-e812bb1eef36", "page": { "height": 2200, "pageIndex": 0, @@ -23760,261 +5619,7 @@ "readingOrder": 144, "role": "Text", "text": "❐ Tenant 260_____ High 45_____ ❐ Tenant High 50_____", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 22, - "x": 788, - "y": 580 - }, - "confidence": 1, - "points": [ - [ - 788, - 580 - ], - [ - 810, - 580 - ], - [ - 810, - 602 - ], - [ - 788, - 602 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 69, - "x": 816, - "y": 583 - }, - "confidence": 1, - "points": [ - [ - 816, - 583 - ], - [ - 885, - 583 - ], - [ - 885, - 602 - ], - [ - 816, - 602 - ] - ], - "text": "Tenant" - }, - { - "bounds": { - "height": 19, - "width": 63, - "x": 1016, - "y": 586 - }, - "confidence": 1, - "points": [ - [ - 1016, - 586 - ], - [ - 1079, - 586 - ], - [ - 1079, - 605 - ], - [ - 1016, - 605 - ] - ], - "text": "260_____" - }, - { - "bounds": { - "height": 25, - "width": 44, - "x": 1086, - "y": 583 - }, - "confidence": 1, - "points": [ - [ - 1086, - 583 - ], - [ - 1130, - 583 - ], - [ - 1130, - 608 - ], - [ - 1086, - 608 - ] - ], - "text": "High" - }, - { - "bounds": { - "height": 19, - "width": 66, - "x": 1136, - "y": 586 - }, - "confidence": 1, - "points": [ - [ - 1136, - 586 - ], - [ - 1202, - 586 - ], - [ - 1202, - 605 - ], - [ - 1136, - 605 - ] - ], - "text": "45_____" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 1244, - "y": 580 - }, - "confidence": 1, - "points": [ - [ - 1244, - 580 - ], - [ - 1266, - 580 - ], - [ - 1266, - 602 - ], - [ - 1244, - 602 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 66, - "x": 1275, - "y": 583 - }, - "confidence": 1, - "points": [ - [ - 1275, - 583 - ], - [ - 1341, - 583 - ], - [ - 1341, - 602 - ], - [ - 1275, - 602 - ] - ], - "text": "Tenant" - }, - { - "bounds": { - "height": 25, - "width": 44, - "x": 1527, - "y": 583 - }, - "confidence": 1, - "points": [ - [ - 1527, - 583 - ], - [ - 1571, - 583 - ], - [ - 1571, - 608 - ], - [ - 1527, - 608 - ] - ], - "text": "High" - }, - { - "bounds": { - "height": 19, - "width": 69, - "x": 1575, - "y": 586 - }, - "confidence": 1, - "points": [ - [ - 1575, - 586 - ], - [ - 1644, - 586 - ], - [ - 1644, - 605 - ], - [ - 1575, - 605 - ] - ], - "text": "50_____" - } - ] + "type": "paragraph" }, { "bounds": { @@ -24023,8 +5628,9 @@ "x": 1026.3267, "y": 613.30914 }, + "cells": null, "confidence": 0.51191866, - "id": "82db8d73-a4cd-4617-8a92-ba37f5685007", + "id": "48af4fd8-ba29-4227-99c3-b3b8684679ac", "page": { "height": 2200, "pageIndex": 0, @@ -24061,8 +5667,9 @@ "x": 1647, "y": 1050 }, + "cells": null, "confidence": 1, - "id": "f617a9eb-03c6-4291-8f8d-b08cb1b75c36", + "id": "595aa54a-054a-4486-a03f-0e1f2ba2c6e9", "page": { "height": 2200, "pageIndex": 0, @@ -24090,37 +5697,7 @@ "readingOrder": 146, "role": "Text", "text": "typical", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 66, - "x": 1647, - "y": 1050 - }, - "confidence": 1, - "points": [ - [ - 1647, - 1050 - ], - [ - 1713, - 1050 - ], - [ - 1713, - 1077 - ], - [ - 1647, - 1077 - ] - ], - "text": "typical" - } - ] + "type": "paragraph" }, { "bounds": { @@ -24129,8 +5706,9 @@ "x": 1674, "y": 1877 }, + "cells": null, "confidence": 1, - "id": "b9d82fc0-6f28-427c-a5bb-ffa7cb1c7179", + "id": "499081bc-e6b2-4f01-9165-937dfa020ce4", "page": { "height": 2200, "pageIndex": 0, @@ -24158,37 +5736,7 @@ "readingOrder": 147, "role": "Text", "text": "lot", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 25, - "x": 1674, - "y": 1877 - }, - "confidence": 1, - "points": [ - [ - 1674, - 1877 - ], - [ - 1699, - 1877 - ], - [ - 1699, - 1896 - ], - [ - 1674, - 1896 - ] - ], - "text": "lot" - } - ] + "type": "paragraph" }, { "bounds": { @@ -24197,8 +5745,9 @@ "x": 899.2269, "y": 1841.9495 }, + "cells": null, "confidence": 0.68563807, - "id": "20fc0c0f-7c48-4708-a6ab-7d6eb421af87", + "id": "2c2ffba2-4140-4153-874c-ab427f9e7568", "page": { "height": 2200, "pageIndex": 0, @@ -24235,8 +5784,9 @@ "x": 511, "y": 1933 }, + "cells": null, "confidence": 0.55539, - "id": "6a83fb67-3eb1-40a1-9b62-7d18009a4fb2", + "id": "58a6b4ce-9d20-40da-b6ea-6e5f8652d5ac", "page": { "height": 2200, "pageIndex": 0, @@ -24264,205 +5814,7 @@ "readingOrder": 149, "role": "Text", "text": "Sidewalk 4 ❐ ❐Fema Zone Map Date", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 105, - "x": 511, - "y": 1933 - }, - "confidence": 1, - "points": [ - [ - 511, - 1933 - ], - [ - 616, - 1933 - ], - [ - 616, - 1955 - ], - [ - 511, - 1955 - ] - ], - "text": "Sidewalk" - }, - { - "bounds": { - "height": 13, - "width": 16, - "x": 919, - "y": 1936 - }, - "confidence": 1, - "points": [ - [ - 919, - 1936 - ], - [ - 935, - 1936 - ], - [ - 935, - 1949 - ], - [ - 919, - 1949 - ] - ], - "text": "4" - }, - { - "bounds": { - "height": 22, - "width": 19, - "x": 919, - "y": 1933 - }, - "confidence": 1, - "points": [ - [ - 919, - 1933 - ], - [ - 938, - 1933 - ], - [ - 938, - 1955 - ], - [ - 919, - 1955 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 141, - "x": 1011, - "y": 1933 - }, - "confidence": 1, - "points": [ - [ - 1011, - 1933 - ], - [ - 1152, - 1933 - ], - [ - 1152, - 1955 - ], - [ - 1011, - 1955 - ] - ], - "text": "❐Fema" - }, - { - "bounds": { - "height": 22, - "width": 58, - "x": 1158, - "y": 1933 - }, - "confidence": 1, - "points": [ - [ - 1158, - 1933 - ], - [ - 1216, - 1933 - ], - [ - 1216, - 1955 - ], - [ - 1158, - 1955 - ] - ], - "text": "Zone" - }, - { - "bounds": { - "height": 27, - "width": 47, - "x": 1383, - "y": 1933 - }, - "confidence": 1, - "points": [ - [ - 1383, - 1933 - ], - [ - 1430, - 1933 - ], - [ - 1430, - 1960 - ], - [ - 1383, - 1960 - ] - ], - "text": "Map" - }, - { - "bounds": { - "height": 22, - "width": 52, - "x": 1441, - "y": 1933 - }, - "confidence": 1, - "points": [ - [ - 1441, - 1933 - ], - [ - 1493, - 1933 - ], - [ - 1493, - 1955 - ], - [ - 1441, - 1955 - ] - ], - "text": "Date" - } - ] + "type": "paragraph" }, { "bounds": { @@ -24471,8 +5823,9 @@ "x": 918.8051, "y": 1962.2273 }, + "cells": null, "confidence": 0.5116332, - "id": "115cfba8-7fd2-4e44-8cf4-6dd8a07d9ebc", + "id": "2f551054-cccf-4829-a39c-344e917c755b", "page": { "height": 2200, "pageIndex": 0, @@ -24509,8 +5862,9 @@ "x": 989.08984, "y": 1841.965 }, + "cells": null, "confidence": 0.6511531, - "id": "b0c6e2cc-517a-4cd4-a6e2-59bd2f029784", + "id": "0414f797-b0d6-4bf7-b4a2-df12c33b9db1", "page": { "height": 2200, "pageIndex": 0, @@ -24547,8 +5901,9 @@ "x": 53.14818, "y": 2118.6816 }, + "cells": null, "confidence": 0.78344476, - "id": "20d9dc27-5b2f-4d9a-abd8-1d0c8baa95fc", + "id": "a9d073db-da78-4f8d-8110-9276f2485efc", "page": { "height": 2200, "pageIndex": 0, @@ -24576,289 +5931,7 @@ "readingOrder": 152, "role": "Footer", "text": "Freddie Mac Form 72 Page 1 Fannie Mae Form 1025", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 75, - "x": 55, - "y": 2119 - }, - "confidence": 1, - "points": [ - [ - 55, - 2119 - ], - [ - 130, - 2119 - ], - [ - 130, - 2138 - ], - [ - 55, - 2138 - ] - ], - "text": "Freddie" - }, - { - "bounds": { - "height": 19, - "width": 41, - "x": 138, - "y": 2119 - }, - "confidence": 1, - "points": [ - [ - 138, - 2119 - ], - [ - 179, - 2119 - ], - [ - 179, - 2138 - ], - [ - 138, - 2138 - ] - ], - "text": "Mac" - }, - { - "bounds": { - "height": 19, - "width": 50, - "x": 188, - "y": 2119 - }, - "confidence": 1, - "points": [ - [ - 188, - 2119 - ], - [ - 238, - 2119 - ], - [ - 238, - 2138 - ], - [ - 188, - 2138 - ] - ], - "text": "Form" - }, - { - "bounds": { - "height": 19, - "width": 25, - "x": 247, - "y": 2119 - }, - "confidence": 1, - "points": [ - [ - 247, - 2119 - ], - [ - 272, - 2119 - ], - [ - 272, - 2138 - ], - [ - 247, - 2138 - ] - ], - "text": "72" - }, - { - "bounds": { - "height": 25, - "width": 50, - "x": 830, - "y": 2119 - }, - "confidence": 1, - "points": [ - [ - 830, - 2119 - ], - [ - 880, - 2119 - ], - [ - 880, - 2144 - ], - [ - 830, - 2144 - ] - ], - "text": "Page" - }, - { - "bounds": { - "height": 19, - "width": 8, - "x": 888, - "y": 2119 - }, - "confidence": 1, - "points": [ - [ - 888, - 2119 - ], - [ - 896, - 2119 - ], - [ - 896, - 2138 - ], - [ - 888, - 2138 - ] - ], - "text": "1" - }, - { - "bounds": { - "height": 19, - "width": 63, - "x": 1402, - "y": 2119 - }, - "confidence": 1, - "points": [ - [ - 1402, - 2119 - ], - [ - 1465, - 2119 - ], - [ - 1465, - 2138 - ], - [ - 1402, - 2138 - ] - ], - "text": "Fannie" - }, - { - "bounds": { - "height": 19, - "width": 41, - "x": 1475, - "y": 2119 - }, - "confidence": 1, - "points": [ - [ - 1475, - 2119 - ], - [ - 1516, - 2119 - ], - [ - 1516, - 2138 - ], - [ - 1475, - 2138 - ] - ], - "text": "Mae" - }, - { - "bounds": { - "height": 19, - "width": 50, - "x": 1525, - "y": 2119 - }, - "confidence": 1, - "points": [ - [ - 1525, - 2119 - ], - [ - 1575, - 2119 - ], - [ - 1575, - 2138 - ], - [ - 1525, - 2138 - ] - ], - "text": "Form" - }, - { - "bounds": { - "height": 19, - "width": 47, - "x": 1583, - "y": 2119 - }, - "confidence": 1, - "points": [ - [ - 1583, - 2119 - ], - [ - 1630, - 2119 - ], - [ - 1630, - 2138 - ], - [ - 1583, - 2138 - ] - ], - "text": "1025" - } - ] + "type": "paragraph" }, { "bounds": { @@ -24867,8 +5940,9 @@ "x": 52.452663, "y": 2145.3901 }, + "cells": null, "confidence": 0.87288135, - "id": "4db24fa6-3851-4c14-9769-c723378390e1", + "id": "f5fabb2f-f917-464a-afef-6a20a5ebab29", "page": { "height": 2200, "pageIndex": 0, @@ -24896,177 +5970,7 @@ "readingOrder": 153, "role": "Footer", "text": "National Association of Real Estate Appraisers", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 80, - "x": 55, - "y": 2147 - }, - "confidence": 1, - "points": [ - [ - 55, - 2147 - ], - [ - 135, - 2147 - ], - [ - 135, - 2166 - ], - [ - 55, - 2166 - ] - ], - "text": "National" - }, - { - "bounds": { - "height": 19, - "width": 116, - "x": 141, - "y": 2147 - }, - "confidence": 1, - "points": [ - [ - 141, - 2147 - ], - [ - 257, - 2147 - ], - [ - 257, - 2166 - ], - [ - 141, - 2166 - ] - ], - "text": "Association" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 263, - "y": 2147 - }, - "confidence": 1, - "points": [ - [ - 263, - 2147 - ], - [ - 282, - 2147 - ], - [ - 282, - 2166 - ], - [ - 263, - 2166 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 19, - "width": 44, - "x": 291, - "y": 2147 - }, - "confidence": 1, - "points": [ - [ - 291, - 2147 - ], - [ - 335, - 2147 - ], - [ - 335, - 2166 - ], - [ - 291, - 2166 - ] - ], - "text": "Real" - }, - { - "bounds": { - "height": 19, - "width": 61, - "x": 347, - "y": 2147 - }, - "confidence": 1, - "points": [ - [ - 347, - 2147 - ], - [ - 408, - 2147 - ], - [ - 408, - 2166 - ], - [ - 347, - 2166 - ] - ], - "text": "Estate" - }, - { - "bounds": { - "height": 22, - "width": 105, - "x": 416, - "y": 2147 - }, - "confidence": 1, - "points": [ - [ - 416, - 2147 - ], - [ - 521, - 2147 - ], - [ - 521, - 2169 - ], - [ - 416, - 2169 - ] - ], - "text": "Appraisers" - } - ] + "type": "paragraph" }, { "bounds": { @@ -25075,8 +5979,9 @@ "x": 827.8556, "y": 2118.6196 }, + "cells": null, "confidence": 0.9250283, - "id": "ebbe29c5-0db0-4b32-955f-278c3deca106", + "id": "a57701d9-3d88-4f41-8be0-5c5211d1b967", "page": { "height": 2200, "pageIndex": 0, @@ -25113,8 +6018,9 @@ "x": 1399.6283, "y": 2118.1816 }, + "cells": null, "confidence": 0.9045906, - "id": "385522be-6ebf-41f8-b6bf-867936decc20", + "id": "5d12126b-250f-4cc6-86df-8ec84df909d9", "page": { "height": 2200, "pageIndex": 0, @@ -25151,8 +6057,9 @@ "x": 341, "y": 20.379242 }, + "cells": null, "confidence": 0.7445783, - "id": "def90e5d-6c6b-46b5-b95b-fc697a559579", + "id": "fbc47e93-12d0-40cd-bd59-eab7e0343c25", "page": { "height": 2200, "pageIndex": 1, @@ -25180,177 +6087,7 @@ "readingOrder": 0, "role": "SectionHeader", "text": "SMALL RESIDENTIAL INCOME PROPERTY APPRAISAL REPORT", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 111, - "x": 341, - "y": 22 - }, - "confidence": 1, - "points": [ - [ - 341, - 22 - ], - [ - 452, - 22 - ], - [ - 452, - 49 - ], - [ - 341, - 49 - ] - ], - "text": "SMALL" - }, - { - "bounds": { - "height": 27, - "width": 216, - "x": 463, - "y": 22 - }, - "confidence": 1, - "points": [ - [ - 463, - 22 - ], - [ - 679, - 22 - ], - [ - 679, - 49 - ], - [ - 463, - 49 - ] - ], - "text": "RESIDENTIAL" - }, - { - "bounds": { - "height": 27, - "width": 130, - "x": 694, - "y": 22 - }, - "confidence": 1, - "points": [ - [ - 694, - 22 - ], - [ - 824, - 22 - ], - [ - 824, - 49 - ], - [ - 694, - 49 - ] - ], - "text": "INCOME" - }, - { - "bounds": { - "height": 27, - "width": 183, - "x": 838, - "y": 22 - }, - "confidence": 1, - "points": [ - [ - 838, - 22 - ], - [ - 1021, - 22 - ], - [ - 1021, - 49 - ], - [ - 838, - 49 - ] - ], - "text": "PROPERTY" - }, - { - "bounds": { - "height": 27, - "width": 186, - "x": 1033, - "y": 22 - }, - "confidence": 1, - "points": [ - [ - 1033, - 22 - ], - [ - 1219, - 22 - ], - [ - 1219, - 49 - ], - [ - 1033, - 49 - ] - ], - "text": "APPRAISAL" - }, - { - "bounds": { - "height": 27, - "width": 138, - "x": 1230, - "y": 22 - }, - "confidence": 1, - "points": [ - [ - 1230, - 22 - ], - [ - 1368, - 22 - ], - [ - 1368, - 49 - ], - [ - 1230, - 49 - ] - ], - "text": "REPORT" - } - ] + "type": "paragraph" }, { "bounds": { @@ -25359,8 +6096,9 @@ "x": 69, "y": 73.103455 }, + "cells": null, "confidence": 0.7232486, - "id": "ef2b6c52-d3e5-4e2c-b3cb-2e3cb724f909", + "id": "d7c025a4-72fd-476c-90f9-b3b8e932a5e2", "page": { "height": 2200, "pageIndex": 1, @@ -25388,373 +6126,7 @@ "readingOrder": 2, "role": "Text", "text": "General desciption Exterior description (Materials/ condition) Foundation Concrete Poured_______________ Insulation (R-value if known)", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 88, - "x": 69, - "y": 75 - }, - "confidence": 1, - "points": [ - [ - 69, - 75 - ], - [ - 157, - 75 - ], - [ - 157, - 97 - ], - [ - 69, - 97 - ] - ], - "text": "General" - }, - { - "bounds": { - "height": 25, - "width": 113, - "x": 166, - "y": 75 - }, - "confidence": 1, - "points": [ - [ - 166, - 75 - ], - [ - 279, - 75 - ], - [ - 279, - 100 - ], - [ - 166, - 100 - ] - ], - "text": "desciption" - }, - { - "bounds": { - "height": 22, - "width": 86, - "x": 400, - "y": 75 - }, - "confidence": 1, - "points": [ - [ - 400, - 75 - ], - [ - 486, - 75 - ], - [ - 486, - 97 - ], - [ - 400, - 97 - ] - ], - "text": "Exterior" - }, - { - "bounds": { - "height": 25, - "width": 122, - "x": 494, - "y": 75 - }, - "confidence": 1, - "points": [ - [ - 494, - 75 - ], - [ - 616, - 75 - ], - [ - 616, - 100 - ], - [ - 494, - 100 - ] - ], - "text": "description" - }, - { - "bounds": { - "height": 25, - "width": 116, - "x": 627, - "y": 75 - }, - "confidence": 1, - "points": [ - [ - 627, - 75 - ], - [ - 743, - 75 - ], - [ - 743, - 100 - ], - [ - 627, - 100 - ] - ], - "text": "(Materials/" - }, - { - "bounds": { - "height": 25, - "width": 108, - "x": 752, - "y": 75 - }, - "confidence": 1, - "points": [ - [ - 752, - 75 - ], - [ - 860, - 75 - ], - [ - 860, - 100 - ], - [ - 752, - 100 - ] - ], - "text": "condition)" - }, - { - "bounds": { - "height": 22, - "width": 127, - "x": 888, - "y": 75 - }, - "confidence": 1, - "points": [ - [ - 888, - 75 - ], - [ - 1015, - 75 - ], - [ - 1015, - 97 - ], - [ - 888, - 97 - ] - ], - "text": "Foundation" - }, - { - "bounds": { - "height": 16, - "width": 75, - "x": 1088, - "y": 77 - }, - "confidence": 1, - "points": [ - [ - 1088, - 77 - ], - [ - 1163, - 77 - ], - [ - 1163, - 93 - ], - [ - 1088, - 93 - ] - ], - "text": "Concrete" - }, - { - "bounds": { - "height": 22, - "width": 213, - "x": 1019, - "y": 77 - }, - "confidence": 1, - "points": [ - [ - 1019, - 77 - ], - [ - 1232, - 77 - ], - [ - 1232, - 99 - ], - [ - 1019, - 99 - ] - ], - "text": "Poured_______________" - }, - { - "bounds": { - "height": 22, - "width": 105, - "x": 1283, - "y": 75 - }, - "confidence": 1, - "points": [ - [ - 1283, - 75 - ], - [ - 1388, - 75 - ], - [ - 1388, - 97 - ], - [ - 1283, - 97 - ] - ], - "text": "Insulation" - }, - { - "bounds": { - "height": 25, - "width": 94, - "x": 1397, - "y": 75 - }, - "confidence": 1, - "points": [ - [ - 1397, - 75 - ], - [ - 1491, - 75 - ], - [ - 1491, - 100 - ], - [ - 1397, - 100 - ] - ], - "text": "(R-value" - }, - { - "bounds": { - "height": 19, - "width": 11, - "x": 1502, - "y": 75 - }, - "confidence": 1, - "points": [ - [ - 1502, - 75 - ], - [ - 1513, - 75 - ], - [ - 1513, - 94 - ], - [ - 1502, - 94 - ] - ], - "text": "if" - }, - { - "bounds": { - "height": 25, - "width": 77, - "x": 1525, - "y": 75 - }, - "confidence": 1, - "points": [ - [ - 1525, - 75 - ], - [ - 1602, - 75 - ], - [ - 1602, - 100 - ], - [ - 1525, - 100 - ] - ], - "text": "known)" - } - ] + "type": "paragraph" }, { "bounds": { @@ -25763,8 +6135,9 @@ "x": 399.57266, "y": 105.45115 }, + "cells": null, "confidence": 0.66274685, - "id": "978d345d-9312-4d2a-a3b8-bc9cc8cb1b84", + "id": "7e5a7277-f44b-4dc3-a3e9-c1f7141c3d0d", "page": { "height": 2200, "pageIndex": 1, @@ -25801,8 +6174,9 @@ "x": 399.9932, "y": 134.2641 }, + "cells": null, "confidence": 0.6951259, - "id": "ffb7a2db-2d62-45b6-bb20-fa308060b9ef", + "id": "5e0eef9e-c821-4766-8359-f94da7a40948", "page": { "height": 2200, "pageIndex": 1, @@ -25839,8 +6213,9 @@ "x": 400.34177, "y": 165.09921 }, + "cells": null, "confidence": 0.67595273, - "id": "9b6a5368-d671-48ca-afb4-5bcf3a1d11c5", + "id": "1e233812-9c74-4a8c-bde7-0732c5391639", "page": { "height": 2200, "pageIndex": 1, @@ -25877,8 +6252,9 @@ "x": 69, "y": 102 }, + "cells": null, "confidence": 0.64052814, - "id": "c4f865b3-a8f9-4e6f-be86-3bb964766a9d", + "id": "47ce8ebc-6634-4a71-aaa8-8bb4ca946f95", "page": { "height": 2200, "pageIndex": 1, @@ -25906,205 +6282,7 @@ "readingOrder": 6, "role": "Text", "text": "Units/bldgs. Foundation Concrete Poured___________________ Slab ❐ Roof", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 130, - "x": 69, - "y": 105 - }, - "confidence": 1, - "points": [ - [ - 69, - 105 - ], - [ - 199, - 105 - ], - [ - 199, - 130 - ], - [ - 69, - 130 - ] - ], - "text": "Units/bldgs." - }, - { - "bounds": { - "height": 19, - "width": 127, - "x": 400, - "y": 105 - }, - "confidence": 1, - "points": [ - [ - 400, - 105 - ], - [ - 527, - 105 - ], - [ - 527, - 124 - ], - [ - 400, - 124 - ] - ], - "text": "Foundation" - }, - { - "bounds": { - "height": 19, - "width": 91, - "x": 683, - "y": 105 - }, - "confidence": 1, - "points": [ - [ - 683, - 105 - ], - [ - 774, - 105 - ], - [ - 774, - 124 - ], - [ - 683, - 124 - ] - ], - "text": "Concrete" - }, - { - "bounds": { - "height": 27, - "width": 269, - "x": 602, - "y": 102 - }, - "confidence": 1, - "points": [ - [ - 602, - 102 - ], - [ - 871, - 102 - ], - [ - 871, - 129 - ], - [ - 602, - 129 - ] - ], - "text": "Poured___________________" - }, - { - "bounds": { - "height": 22, - "width": 52, - "x": 886, - "y": 102 - }, - "confidence": 1, - "points": [ - [ - 886, - 102 - ], - [ - 938, - 102 - ], - [ - 938, - 124 - ], - [ - 886, - 124 - ] - ], - "text": "Slab" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1280, - "y": 105 - }, - "confidence": 1, - "points": [ - [ - 1280, - 105 - ], - [ - 1299, - 105 - ], - [ - 1299, - 124 - ], - [ - 1280, - 124 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 52, - "x": 1308, - "y": 105 - }, - "confidence": 1, - "points": [ - [ - 1308, - 105 - ], - [ - 1360, - 105 - ], - [ - 1360, - 124 - ], - [ - 1308, - 124 - ] - ], - "text": "Roof" - } - ] + "type": "paragraph" }, { "bounds": { @@ -26113,8 +6291,9 @@ "x": 69, "y": 133 }, + "cells": null, "confidence": 0.6878886, - "id": "aa3cccab-e4f7-4367-84d1-137ad31c5533", + "id": "27a346c8-20e6-4fb3-b3da-8ec1902b381c", "page": { "height": 2200, "pageIndex": 1, @@ -26142,345 +6321,7 @@ "readingOrder": 7, "role": "Text", "text": "Stories Exterior walls Veneer/Vinyl Siding Brick___________________ Crawl space 4 ❐ Ceiling R-38___________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 77, - "x": 69, - "y": 133 - }, - "confidence": 1, - "points": [ - [ - 69, - 133 - ], - [ - 146, - 133 - ], - [ - 146, - 155 - ], - [ - 69, - 155 - ] - ], - "text": "Stories" - }, - { - "bounds": { - "height": 22, - "width": 86, - "x": 400, - "y": 133 - }, - "confidence": 1, - "points": [ - [ - 400, - 133 - ], - [ - 486, - 133 - ], - [ - 486, - 155 - ], - [ - 400, - 155 - ] - ], - "text": "Exterior" - }, - { - "bounds": { - "height": 22, - "width": 58, - "x": 494, - "y": 133 - }, - "confidence": 1, - "points": [ - [ - 494, - 133 - ], - [ - 552, - 133 - ], - [ - 552, - 155 - ], - [ - 494, - 155 - ] - ], - "text": "walls" - }, - { - "bounds": { - "height": 25, - "width": 119, - "x": 652, - "y": 136 - }, - "confidence": 1, - "points": [ - [ - 652, - 136 - ], - [ - 771, - 136 - ], - [ - 771, - 161 - ], - [ - 652, - 161 - ] - ], - "text": "Veneer/Vinyl" - }, - { - "bounds": { - "height": 25, - "width": 58, - "x": 777, - "y": 136 - }, - "confidence": 1, - "points": [ - [ - 777, - 136 - ], - [ - 835, - 136 - ], - [ - 835, - 161 - ], - [ - 777, - 161 - ] - ], - "text": "Siding" - }, - { - "bounds": { - "height": 25, - "width": 269, - "x": 602, - "y": 136 - }, - "confidence": 1, - "points": [ - [ - 602, - 136 - ], - [ - 871, - 136 - ], - [ - 871, - 161 - ], - [ - 602, - 161 - ] - ], - "text": "Brick___________________" - }, - { - "bounds": { - "height": 22, - "width": 63, - "x": 888, - "y": 133 - }, - "confidence": 1, - "points": [ - [ - 888, - 133 - ], - [ - 951, - 133 - ], - [ - 951, - 155 - ], - [ - 888, - 155 - ] - ], - "text": "Crawl" - }, - { - "bounds": { - "height": 22, - "width": 69, - "x": 961, - "y": 138 - }, - "confidence": 1, - "points": [ - [ - 961, - 138 - ], - [ - 1030, - 138 - ], - [ - 1030, - 160 - ], - [ - 961, - 160 - ] - ], - "text": "space" - }, - { - "bounds": { - "height": 13, - "width": 13, - "x": 1286, - "y": 138 - }, - "confidence": 1, - "points": [ - [ - 1286, - 138 - ], - [ - 1299, - 138 - ], - [ - 1299, - 151 - ], - [ - 1286, - 151 - ] - ], - "text": "4" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1280, - "y": 136 - }, - "confidence": 1, - "points": [ - [ - 1280, - 136 - ], - [ - 1299, - 136 - ], - [ - 1299, - 155 - ], - [ - 1280, - 155 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 27, - "width": 75, - "x": 1311, - "y": 133 - }, - "confidence": 1, - "points": [ - [ - 1311, - 133 - ], - [ - 1386, - 133 - ], - [ - 1386, - 160 - ], - [ - 1311, - 160 - ] - ], - "text": "Ceiling" - }, - { - "bounds": { - "height": 22, - "width": 161, - "x": 1447, - "y": 138 - }, - "confidence": 1, - "points": [ - [ - 1447, - 138 - ], - [ - 1608, - 138 - ], - [ - 1608, - 160 - ], - [ - 1447, - 160 - ] - ], - "text": "R-38___________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -26489,8 +6330,9 @@ "x": 601.65295, "y": 165.12842 }, + "cells": null, "confidence": 0.65514, - "id": "1e28cf4b-91a8-492d-ad20-f820b5235d1b", + "id": "aefeb4d4-3dd5-4c70-8f71-dbf844a8b67e", "page": { "height": 2200, "pageIndex": 1, @@ -26527,8 +6369,9 @@ "x": 400.25644, "y": 193.97772 }, + "cells": null, "confidence": 0.6012981, - "id": "0938bdfa-d5ca-4b6f-bd8d-acef67533c92", + "id": "cd46847e-b0f6-4b5b-9511-ee31a40395e7", "page": { "height": 2200, "pageIndex": 1, @@ -26565,8 +6408,9 @@ "x": 399.28998, "y": 224 }, + "cells": null, "confidence": 0.64842045, - "id": "d593c73a-8e5b-481a-939f-7d1eb186eb33", + "id": "f68e75f5-02c0-4878-885c-9d8c9902001f", "page": { "height": 2200, "pageIndex": 1, @@ -26594,289 +6438,7 @@ "readingOrder": 10, "role": "Text", "text": "Window type Double-hung Vinyl___________________ Settlement noted None_____________ ❐ None Adequate___________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 88, - "x": 400, - "y": 224 - }, - "confidence": 1, - "points": [ - [ - 400, - 224 - ], - [ - 488, - 224 - ], - [ - 488, - 246 - ], - [ - 400, - 246 - ] - ], - "text": "Window" - }, - { - "bounds": { - "height": 25, - "width": 50, - "x": 497, - "y": 224 - }, - "confidence": 1, - "points": [ - [ - 497, - 224 - ], - [ - 547, - 224 - ], - [ - 547, - 249 - ], - [ - 497, - 249 - ] - ], - "text": "type" - }, - { - "bounds": { - "height": 25, - "width": 116, - "x": 652, - "y": 224 - }, - "confidence": 1, - "points": [ - [ - 652, - 224 - ], - [ - 768, - 224 - ], - [ - 768, - 249 - ], - [ - 652, - 249 - ] - ], - "text": "Double-hung" - }, - { - "bounds": { - "height": 25, - "width": 272, - "x": 600, - "y": 224 - }, - "confidence": 1, - "points": [ - [ - 600, - 224 - ], - [ - 872, - 224 - ], - [ - 872, - 249 - ], - [ - 600, - 249 - ] - ], - "text": "Vinyl___________________" - }, - { - "bounds": { - "height": 22, - "width": 119, - "x": 888, - "y": 224 - }, - "confidence": 1, - "points": [ - [ - 888, - 224 - ], - [ - 1007, - 224 - ], - [ - 1007, - 246 - ], - [ - 888, - 246 - ] - ], - "text": "Settlement" - }, - { - "bounds": { - "height": 13, - "width": 41, - "x": 1091, - "y": 227 - }, - "confidence": 1, - "points": [ - [ - 1091, - 227 - ], - [ - 1132, - 227 - ], - [ - 1132, - 240 - ], - [ - 1091, - 240 - ] - ], - "text": "noted" - }, - { - "bounds": { - "height": 22, - "width": 186, - "x": 1047, - "y": 227 - }, - "confidence": 1, - "points": [ - [ - 1047, - 227 - ], - [ - 1233, - 227 - ], - [ - 1233, - 249 - ], - [ - 1047, - 249 - ] - ], - "text": "None_____________" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1280, - "y": 224 - }, - "confidence": 1, - "points": [ - [ - 1280, - 224 - ], - [ - 1299, - 224 - ], - [ - 1299, - 243 - ], - [ - 1280, - 243 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 1308, - "y": 224 - }, - "confidence": 1, - "points": [ - [ - 1308, - 224 - ], - [ - 1369, - 224 - ], - [ - 1369, - 246 - ], - [ - 1308, - 246 - ] - ], - "text": "None" - }, - { - "bounds": { - "height": 22, - "width": 158, - "x": 1450, - "y": 227 - }, - "confidence": 1, - "points": [ - [ - 1450, - 227 - ], - [ - 1608, - 227 - ], - [ - 1608, - 249 - ], - [ - 1450, - 249 - ] - ], - "text": "Adequate___________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -26885,8 +6447,9 @@ "x": 599.6662, "y": 223.86134 }, + "cells": null, "confidence": 0.66586816, - "id": "32e81dda-1666-4f2a-9318-46e146b7e10c", + "id": "2381f91f-4e4e-4896-ae1d-e626407b32c9", "page": { "height": 2200, "pageIndex": 1, @@ -26923,8 +6486,9 @@ "x": 398.77667, "y": 252 }, + "cells": null, "confidence": 0.61243284, - "id": "892f5f53-d44d-4b8c-832e-0d240a5eb71a", + "id": "6087d1a7-3134-42d7-b002-02b3afeb1b70", "page": { "height": 2200, "pageIndex": 1, @@ -26952,177 +6516,7 @@ "readingOrder": 12, "role": "Text", "text": "Storm sash/screens Infestation noted None_____________ Adequacy", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 66, - "x": 400, - "y": 252 - }, - "confidence": 1, - "points": [ - [ - 400, - 252 - ], - [ - 466, - 252 - ], - [ - 466, - 274 - ], - [ - 400, - 274 - ] - ], - "text": "Storm" - }, - { - "bounds": { - "height": 19, - "width": 147, - "x": 474, - "y": 255 - }, - "confidence": 1, - "points": [ - [ - 474, - 255 - ], - [ - 621, - 255 - ], - [ - 621, - 274 - ], - [ - 474, - 274 - ] - ], - "text": "sash/screens" - }, - { - "bounds": { - "height": 19, - "width": 113, - "x": 888, - "y": 255 - }, - "confidence": 1, - "points": [ - [ - 888, - 255 - ], - [ - 1001, - 255 - ], - [ - 1001, - 274 - ], - [ - 888, - 274 - ] - ], - "text": "Infestation" - }, - { - "bounds": { - "height": 16, - "width": 47, - "x": 1094, - "y": 255 - }, - "confidence": 1, - "points": [ - [ - 1094, - 255 - ], - [ - 1141, - 255 - ], - [ - 1141, - 271 - ], - [ - 1094, - 271 - ] - ], - "text": "noted" - }, - { - "bounds": { - "height": 25, - "width": 188, - "x": 1044, - "y": 255 - }, - "confidence": 1, - "points": [ - [ - 1044, - 255 - ], - [ - 1232, - 255 - ], - [ - 1232, - 280 - ], - [ - 1044, - 280 - ] - ], - "text": "None_____________" - }, - { - "bounds": { - "height": 25, - "width": 116, - "x": 1280, - "y": 255 - }, - "confidence": 1, - "points": [ - [ - 1280, - 255 - ], - [ - 1396, - 255 - ], - [ - 1396, - 280 - ], - [ - 1280, - 280 - ] - ], - "text": "Adequacy" - } - ] + "type": "paragraph" }, { "bounds": { @@ -27131,8 +6525,9 @@ "x": 399.1846, "y": 284.88458 }, + "cells": null, "confidence": 0.5839574, - "id": "079c5e08-9a81-4e4d-ad28-4b31e009f44c", + "id": "4443f41c-f146-41da-bb99-3b668f4a3665", "page": { "height": 2200, "pageIndex": 1, @@ -27169,8 +6564,9 @@ "x": 674.918, "y": 283.40167 }, + "cells": null, "confidence": 0.52500653, - "id": "6dbbf5bb-64a7-499c-870b-1996bef352bd", + "id": "ae8c900e-117f-4893-8d77-30580e43c105", "page": { "height": 2200, "pageIndex": 1, @@ -27197,7 +6593,7 @@ ], "readingOrder": 14, "role": "CheckboxUnselected", - "text": "☐ Yes", + "text": "Yes", "type": "paragraph" }, { @@ -27207,8 +6603,9 @@ "x": 398.6959, "y": 342.17978 }, + "cells": null, "confidence": 0.5545413, - "id": "cc9e4fae-c4aa-4f2f-a339-2e662884ac1c", + "id": "e7895fd8-f0b6-484d-bc09-9d5d761fe1ff", "page": { "height": 2200, "pageIndex": 1, @@ -27236,121 +6633,7 @@ "readingOrder": 15, "role": "Text", "text": "Construction and Safety Standards)", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 138, - "x": 400, - "y": 344 - }, - "confidence": 1, - "points": [ - [ - 400, - 344 - ], - [ - 538, - 344 - ], - [ - 538, - 366 - ], - [ - 400, - 366 - ] - ], - "text": "Construction" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 550, - "y": 344 - }, - "confidence": 1, - "points": [ - [ - 550, - 344 - ], - [ - 591, - 344 - ], - [ - 591, - 366 - ], - [ - 550, - 366 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 27, - "width": 72, - "x": 600, - "y": 344 - }, - "confidence": 1, - "points": [ - [ - 600, - 344 - ], - [ - 672, - 344 - ], - [ - 672, - 371 - ], - [ - 600, - 371 - ] - ], - "text": "Safety" - }, - { - "bounds": { - "height": 25, - "width": 122, - "x": 680, - "y": 344 - }, - "confidence": 1, - "points": [ - [ - 680, - 344 - ], - [ - 802, - 344 - ], - [ - 802, - 369 - ], - [ - 680, - 369 - ] - ], - "text": "Standards)" - } - ] + "type": "paragraph" }, { "bounds": { @@ -27359,8 +6642,9 @@ "x": 454.29034, "y": 536.86487 }, + "cells": null, "confidence": 0.5593473, - "id": "0b6a784c-b169-40c9-a5fa-c4d57401c0aa", + "id": "ac2634b5-8484-4aa2-bde4-caae3faba94f", "page": { "height": 2200, "pageIndex": 1, @@ -27387,7 +6671,7 @@ ], "readingOrder": 16, "role": "Text", - "text": "Rooms", + "text": "Rooms:", "type": "paragraph" }, { @@ -27397,8 +6681,9 @@ "x": 67.62999, "y": 73.404175 }, + "cells": null, "confidence": 0.6651954, - "id": "d36ca88a-f9f2-4ef0-ad8a-3a2a70ff45e5", + "id": "615c6ec7-bdf0-4093-82fd-5e0fcb067d82", "page": { "height": 2200, "pageIndex": 1, @@ -27435,8 +6720,9 @@ "x": 67.987724, "y": 104.11494 }, + "cells": null, "confidence": 0.6096153, - "id": "c7ef3cb6-66ea-4c7d-b0bf-90e32242f92e", + "id": "8070933a-31f3-4437-8b8d-40adb0c9bba1", "page": { "height": 2200, "pageIndex": 1, @@ -27473,8 +6759,9 @@ "x": 68.393974, "y": 134.18185 }, + "cells": null, "confidence": 0.62926716, - "id": "413214db-0a82-4469-b34e-71cf1ddc493e", + "id": "3843b3d1-c716-46c5-a5cf-8bef8475d934", "page": { "height": 2200, "pageIndex": 1, @@ -27511,8 +6798,9 @@ "x": 66, "y": 162.8016 }, + "cells": null, "confidence": 0.6413592, - "id": "b8c10566-aadf-4815-9779-3694ae1b7940", + "id": "e13dc965-57a9-4e84-b7a0-35b0f711952f", "page": { "height": 2200, "pageIndex": 1, @@ -27540,401 +6828,7 @@ "readingOrder": 20, "role": "Text", "text": "Type (det./att.) Detached_________ Roof surface Shingle Asphalt___________________ Sump Pump None_____________ 4 ❐ Walls R-13___________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 55, - "x": 66, - "y": 163 - }, - "confidence": 1, - "points": [ - [ - 66, - 163 - ], - [ - 121, - 163 - ], - [ - 121, - 190 - ], - [ - 66, - 190 - ] - ], - "text": "Type" - }, - { - "bounds": { - "height": 27, - "width": 100, - "x": 127, - "y": 163 - }, - "confidence": 1, - "points": [ - [ - 127, - 163 - ], - [ - 227, - 163 - ], - [ - 227, - 190 - ], - [ - 127, - 190 - ] - ], - "text": "(det./att.)" - }, - { - "bounds": { - "height": 22, - "width": 130, - "x": 227, - "y": 166 - }, - "confidence": 1, - "points": [ - [ - 227, - 166 - ], - [ - 357, - 166 - ], - [ - 357, - 188 - ], - [ - 227, - 188 - ] - ], - "text": "Detached_________" - }, - { - "bounds": { - "height": 22, - "width": 52, - "x": 400, - "y": 163 - }, - "confidence": 1, - "points": [ - [ - 400, - 163 - ], - [ - 452, - 163 - ], - [ - 452, - 185 - ], - [ - 400, - 185 - ] - ], - "text": "Roof" - }, - { - "bounds": { - "height": 22, - "width": 83, - "x": 461, - "y": 163 - }, - "confidence": 1, - "points": [ - [ - 461, - 163 - ], - [ - 544, - 163 - ], - [ - 544, - 185 - ], - [ - 461, - 185 - ] - ], - "text": "surface" - }, - { - "bounds": { - "height": 22, - "width": 63, - "x": 669, - "y": 166 - }, - "confidence": 1, - "points": [ - [ - 669, - 166 - ], - [ - 732, - 166 - ], - [ - 732, - 188 - ], - [ - 669, - 188 - ] - ], - "text": "Shingle" - }, - { - "bounds": { - "height": 22, - "width": 269, - "x": 602, - "y": 166 - }, - "confidence": 1, - "points": [ - [ - 602, - 166 - ], - [ - 871, - 166 - ], - [ - 871, - 188 - ], - [ - 602, - 188 - ] - ], - "text": "Asphalt___________________" - }, - { - "bounds": { - "height": 27, - "width": 63, - "x": 888, - "y": 163 - }, - "confidence": 1, - "points": [ - [ - 888, - 163 - ], - [ - 951, - 163 - ], - [ - 951, - 190 - ], - [ - 888, - 190 - ] - ], - "text": "Sump" - }, - { - "bounds": { - "height": 27, - "width": 63, - "x": 963, - "y": 163 - }, - "confidence": 1, - "points": [ - [ - 963, - 163 - ], - [ - 1026, - 163 - ], - [ - 1026, - 190 - ], - [ - 963, - 190 - ] - ], - "text": "Pump" - }, - { - "bounds": { - "height": 22, - "width": 186, - "x": 1047, - "y": 166 - }, - "confidence": 1, - "points": [ - [ - 1047, - 166 - ], - [ - 1233, - 166 - ], - [ - 1233, - 188 - ], - [ - 1047, - 188 - ] - ], - "text": "None_____________" - }, - { - "bounds": { - "height": 13, - "width": 13, - "x": 1286, - "y": 166 - }, - "confidence": 1, - "points": [ - [ - 1286, - 166 - ], - [ - 1299, - 166 - ], - [ - 1299, - 179 - ], - [ - 1286, - 179 - ] - ], - "text": "4" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1280, - "y": 166 - }, - "confidence": 1, - "points": [ - [ - 1280, - 166 - ], - [ - 1299, - 166 - ], - [ - 1299, - 185 - ], - [ - 1280, - 185 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 63, - "x": 1305, - "y": 163 - }, - "confidence": 1, - "points": [ - [ - 1305, - 163 - ], - [ - 1368, - 163 - ], - [ - 1368, - 185 - ], - [ - 1305, - 185 - ] - ], - "text": "Walls" - }, - { - "bounds": { - "height": 19, - "width": 161, - "x": 1447, - "y": 169 - }, - "confidence": 1, - "points": [ - [ - 1447, - 169 - ], - [ - 1608, - 169 - ], - [ - 1608, - 188 - ], - [ - 1447, - 188 - ] - ], - "text": "R-13___________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -27943,8 +6837,9 @@ "x": 68.35975, "y": 194 }, + "cells": null, "confidence": 0.6131697, - "id": "997eb696-6dbc-46e3-97f9-12fcbb181602", + "id": "a1682fcc-e4b3-4516-bf1f-917bf817e625", "page": { "height": 2200, "pageIndex": 1, @@ -27972,373 +6867,7 @@ "readingOrder": 21, "role": "Text", "text": "Design (style) Traditional _________ Gutters & dwnspts Aluminum__________________ Dampness noted None_____________ ❐ Floor", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 77, - "x": 69, - "y": 194 - }, - "confidence": 1, - "points": [ - [ - 69, - 194 - ], - [ - 146, - 194 - ], - [ - 146, - 221 - ], - [ - 69, - 221 - ] - ], - "text": "Design" - }, - { - "bounds": { - "height": 27, - "width": 66, - "x": 158, - "y": 194 - }, - "confidence": 1, - "points": [ - [ - 158, - 194 - ], - [ - 224, - 194 - ], - [ - 224, - 221 - ], - [ - 158, - 221 - ] - ], - "text": "(style)" - }, - { - "bounds": { - "height": 16, - "width": 88, - "x": 230, - "y": 200 - }, - "confidence": 1, - "points": [ - [ - 230, - 200 - ], - [ - 318, - 200 - ], - [ - 318, - 216 - ], - [ - 230, - 216 - ] - ], - "text": "Traditional" - }, - { - "bounds": { - "height": 2, - "width": 130, - "x": 227, - "y": 216 - }, - "confidence": 1, - "points": [ - [ - 227, - 216 - ], - [ - 357, - 216 - ], - [ - 357, - 218 - ], - [ - 227, - 218 - ] - ], - "text": "_________" - }, - { - "bounds": { - "height": 22, - "width": 83, - "x": 400, - "y": 194 - }, - "confidence": 1, - "points": [ - [ - 400, - 194 - ], - [ - 483, - 194 - ], - [ - 483, - 216 - ], - [ - 400, - 216 - ] - ], - "text": "Gutters" - }, - { - "bounds": { - "height": 22, - "width": 16, - "x": 488, - "y": 194 - }, - "confidence": 1, - "points": [ - [ - 488, - 194 - ], - [ - 504, - 194 - ], - [ - 504, - 216 - ], - [ - 488, - 216 - ] - ], - "text": "&" - }, - { - "bounds": { - "height": 27, - "width": 94, - "x": 511, - "y": 194 - }, - "confidence": 1, - "points": [ - [ - 511, - 194 - ], - [ - 605, - 194 - ], - [ - 605, - 221 - ], - [ - 511, - 221 - ] - ], - "text": "dwnspts" - }, - { - "bounds": { - "height": 25, - "width": 255, - "x": 616, - "y": 194 - }, - "confidence": 1, - "points": [ - [ - 616, - 194 - ], - [ - 871, - 194 - ], - [ - 871, - 219 - ], - [ - 616, - 219 - ] - ], - "text": "Aluminum__________________" - }, - { - "bounds": { - "height": 27, - "width": 122, - "x": 888, - "y": 194 - }, - "confidence": 1, - "points": [ - [ - 888, - 194 - ], - [ - 1010, - 194 - ], - [ - 1010, - 221 - ], - [ - 888, - 221 - ] - ], - "text": "Dampness" - }, - { - "bounds": { - "height": 19, - "width": 52, - "x": 1102, - "y": 194 - }, - "confidence": 1, - "points": [ - [ - 1102, - 194 - ], - [ - 1154, - 194 - ], - [ - 1154, - 213 - ], - [ - 1102, - 213 - ] - ], - "text": "noted" - }, - { - "bounds": { - "height": 25, - "width": 186, - "x": 1047, - "y": 194 - }, - "confidence": 1, - "points": [ - [ - 1047, - 194 - ], - [ - 1233, - 194 - ], - [ - 1233, - 219 - ], - [ - 1047, - 219 - ] - ], - "text": "None_____________" - }, - { - "bounds": { - "height": 22, - "width": 19, - "x": 1280, - "y": 194 - }, - "confidence": 1, - "points": [ - [ - 1280, - 194 - ], - [ - 1299, - 194 - ], - [ - 1299, - 216 - ], - [ - 1280, - 216 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 58, - "x": 1308, - "y": 194 - }, - "confidence": 1, - "points": [ - [ - 1308, - 194 - ], - [ - 1366, - 194 - ], - [ - 1366, - 216 - ], - [ - 1308, - 216 - ] - ], - "text": "Floor" - } - ] + "type": "paragraph" }, { "bounds": { @@ -28347,8 +6876,9 @@ "x": 68.83052, "y": 315.04675 }, + "cells": null, "confidence": 0.5554702, - "id": "deab83fe-86f2-494a-aeca-3b2012ee573e", + "id": "0995eb4c-44fc-471c-9fce-39f71f5ca299", "page": { "height": 2200, "pageIndex": 1, @@ -28385,8 +6915,9 @@ "x": 67.770325, "y": 536 }, + "cells": null, "confidence": 0.5202663, - "id": "a1e4ad56-409e-4ae8-934e-0acc97bff03d", + "id": "64156bbc-93f9-4f74-9043-c3a6429a43bf", "page": { "height": 2200, "pageIndex": 1, @@ -28414,149 +6945,7 @@ "readingOrder": 23, "role": "Text", "text": "Improvements contain Rooms: Bedrooms: Bath(s):", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 158, - "x": 69, - "y": 536 - }, - "confidence": 1, - "points": [ - [ - 69, - 536 - ], - [ - 227, - 536 - ], - [ - 227, - 561 - ], - [ - 69, - 561 - ] - ], - "text": "Improvements" - }, - { - "bounds": { - "height": 22, - "width": 80, - "x": 238, - "y": 536 - }, - "confidence": 1, - "points": [ - [ - 238, - 536 - ], - [ - 318, - 536 - ], - [ - 318, - 558 - ], - [ - 238, - 558 - ] - ], - "text": "contain" - }, - { - "bounds": { - "height": 22, - "width": 86, - "x": 452, - "y": 536 - }, - "confidence": 1, - "points": [ - [ - 452, - 536 - ], - [ - 538, - 536 - ], - [ - 538, - 558 - ], - [ - 452, - 558 - ] - ], - "text": "Rooms:" - }, - { - "bounds": { - "height": 22, - "width": 119, - "x": 652, - "y": 536 - }, - "confidence": 1, - "points": [ - [ - 652, - 536 - ], - [ - 771, - 536 - ], - [ - 771, - 558 - ], - [ - 652, - 558 - ] - ], - "text": "Bedrooms:" - }, - { - "bounds": { - "height": 25, - "width": 86, - "x": 949, - "y": 536 - }, - "confidence": 1, - "points": [ - [ - 949, - 536 - ], - [ - 1035, - 536 - ], - [ - 1035, - 561 - ], - [ - 949, - 561 - ] - ], - "text": "Bath(s):" - } - ] + "type": "paragraph" }, { "bounds": { @@ -28565,8 +6954,9 @@ "x": 651.4116, "y": 536.2318 }, + "cells": null, "confidence": 0.61974144, - "id": "f8d12d73-e976-4268-a43b-24fb9519972b", + "id": "726af236-7a9a-4ddb-b33c-c4b4a144217b", "page": { "height": 2200, "pageIndex": 1, @@ -28603,8 +6993,9 @@ "x": 888.1661, "y": 74.749435 }, + "cells": null, "confidence": 0.6945261, - "id": "b24746cb-386a-4e6c-bfef-c6159f8280b3", + "id": "735fa9ce-4da1-4983-8fbf-ca7af6b04bb4", "page": { "height": 2200, "pageIndex": 1, @@ -28641,8 +7032,9 @@ "x": 887.1523, "y": 105.398735 }, + "cells": null, "confidence": 0.67259884, - "id": "0358109d-d60a-4bf7-8e01-e9da6df10027", + "id": "39f10333-a46e-49b7-b2d9-df998c7e0900", "page": { "height": 2200, "pageIndex": 1, @@ -28679,8 +7071,9 @@ "x": 886.2315, "y": 135.40654 }, + "cells": null, "confidence": 0.6316269, - "id": "824f4963-2eb3-4033-903c-2ca5a163461e", + "id": "366a5954-b79a-4402-940f-e9ce84206afe", "page": { "height": 2200, "pageIndex": 1, @@ -28717,8 +7110,9 @@ "x": 886.1053, "y": 164.51047 }, + "cells": null, "confidence": 0.6994686, - "id": "46b60265-8289-42b1-b7b0-602b9bcf30bd", + "id": "9b9da33d-9f55-4555-9bca-5937fd5afca5", "page": { "height": 2200, "pageIndex": 1, @@ -28755,8 +7149,9 @@ "x": 886.3948, "y": 194.64003 }, + "cells": null, "confidence": 0.68158746, - "id": "4526f76e-7a12-4acb-8bea-c260f505ccdd", + "id": "d5bc0fd5-e8ad-46fb-8527-2ed1b4d3567a", "page": { "height": 2200, "pageIndex": 1, @@ -28793,8 +7188,9 @@ "x": 886.958, "y": 223.26251 }, + "cells": null, "confidence": 0.6469718, - "id": "40d87010-7b62-494f-9ced-208d13510283", + "id": "98e38cbb-4507-487c-a107-67711bfe9f10", "page": { "height": 2200, "pageIndex": 1, @@ -28831,8 +7227,9 @@ "x": 887.657, "y": 254.14188 }, + "cells": null, "confidence": 0.58595866, - "id": "68a99803-5047-4372-8ff5-2f3f58a4fd43", + "id": "95270f38-3ece-4dfb-b10e-0ee565c6d94f", "page": { "height": 2200, "pageIndex": 1, @@ -28869,8 +7266,9 @@ "x": 887.1649, "y": 283.55417 }, + "cells": null, "confidence": 0.5376614, - "id": "dff5c0c2-0bf2-4b50-97c4-87f6226cc6a0", + "id": "c3a323d3-ca40-459d-85a0-683280cc9828", "page": { "height": 2200, "pageIndex": 1, @@ -28907,8 +7305,9 @@ "x": 69, "y": 313 }, + "cells": null, "confidence": 0.5830073, - "id": "41488dba-2e6a-412a-a1c9-d5a01ce5d0d3", + "id": "babc6bf4-4920-4d67-a727-fd6471bfac34", "page": { "height": 2200, "pageIndex": 1, @@ -28936,261 +7335,7 @@ "readingOrder": 33, "role": "Text", "text": "Effective age (yrs.) 20_____ Basement finish finished rec 50%___________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 94, - "x": 69, - "y": 313 - }, - "confidence": 1, - "points": [ - [ - 69, - 313 - ], - [ - 163, - 313 - ], - [ - 163, - 335 - ], - [ - 69, - 335 - ] - ], - "text": "Effective" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 172, - "y": 319 - }, - "confidence": 1, - "points": [ - [ - 172, - 319 - ], - [ - 213, - 319 - ], - [ - 213, - 341 - ], - [ - 172, - 341 - ] - ], - "text": "age" - }, - { - "bounds": { - "height": 27, - "width": 58, - "x": 219, - "y": 313 - }, - "confidence": 1, - "points": [ - [ - 219, - 313 - ], - [ - 277, - 313 - ], - [ - 277, - 340 - ], - [ - 219, - 340 - ] - ], - "text": "(yrs.)" - }, - { - "bounds": { - "height": 19, - "width": 75, - "x": 283, - "y": 319 - }, - "confidence": 1, - "points": [ - [ - 283, - 319 - ], - [ - 358, - 319 - ], - [ - 358, - 338 - ], - [ - 283, - 338 - ] - ], - "text": "20_____" - }, - { - "bounds": { - "height": 22, - "width": 111, - "x": 888, - "y": 313 - }, - "confidence": 1, - "points": [ - [ - 888, - 313 - ], - [ - 999, - 313 - ], - [ - 999, - 335 - ], - [ - 888, - 335 - ] - ], - "text": "Basement" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 1008, - "y": 313 - }, - "confidence": 1, - "points": [ - [ - 1008, - 313 - ], - [ - 1069, - 313 - ], - [ - 1069, - 335 - ], - [ - 1008, - 335 - ] - ], - "text": "finish" - }, - { - "bounds": { - "height": 19, - "width": 72, - "x": 1122, - "y": 313 - }, - "confidence": 1, - "points": [ - [ - 1122, - 313 - ], - [ - 1194, - 313 - ], - [ - 1194, - 332 - ], - [ - 1122, - 332 - ] - ], - "text": "finished" - }, - { - "bounds": { - "height": 13, - "width": 27, - "x": 1200, - "y": 319 - }, - "confidence": 1, - "points": [ - [ - 1200, - 319 - ], - [ - 1227, - 319 - ], - [ - 1227, - 332 - ], - [ - 1200, - 332 - ] - ], - "text": "rec" - }, - { - "bounds": { - "height": 25, - "width": 158, - "x": 1075, - "y": 313 - }, - "confidence": 1, - "points": [ - [ - 1075, - 313 - ], - [ - 1233, - 313 - ], - [ - 1233, - 338 - ], - [ - 1075, - 338 - ] - ], - "text": "50%___________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -29199,8 +7344,9 @@ "x": 948.74664, "y": 535.9121 }, + "cells": null, "confidence": 0.56227535, - "id": "9ee4cba3-2d59-41b3-886f-d62d1cfd916e", + "id": "1e6a6c0a-3f97-4ebb-83ee-7ca4a7e5f711", "page": { "height": 2200, "pageIndex": 1, @@ -29237,8 +7383,9 @@ "x": 1150, "y": 535.64716 }, + "cells": null, "confidence": 0.57381755, - "id": "a1170e39-270a-4c6c-8ce0-3aee4436a65d", + "id": "e1a609cc-8d9f-4012-88a7-3a6513879728", "page": { "height": 2200, "pageIndex": 1, @@ -29266,177 +7413,7 @@ "readingOrder": 35, "role": "Text", "text": "Square feet of Gross Building Area", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 80, - "x": 1150, - "y": 536 - }, - "confidence": 1, - "points": [ - [ - 1150, - 536 - ], - [ - 1230, - 536 - ], - [ - 1230, - 561 - ], - [ - 1150, - 561 - ] - ], - "text": "Square" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 1238, - "y": 536 - }, - "confidence": 1, - "points": [ - [ - 1238, - 536 - ], - [ - 1279, - 536 - ], - [ - 1279, - 558 - ], - [ - 1238, - 558 - ] - ], - "text": "feet" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 1288, - "y": 536 - }, - "confidence": 1, - "points": [ - [ - 1288, - 536 - ], - [ - 1310, - 536 - ], - [ - 1310, - 558 - ], - [ - 1288, - 558 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 22, - "width": 66, - "x": 1316, - "y": 536 - }, - "confidence": 1, - "points": [ - [ - 1316, - 536 - ], - [ - 1382, - 536 - ], - [ - 1382, - 558 - ], - [ - 1316, - 558 - ] - ], - "text": "Gross" - }, - { - "bounds": { - "height": 25, - "width": 88, - "x": 1391, - "y": 536 - }, - "confidence": 1, - "points": [ - [ - 1391, - 536 - ], - [ - 1479, - 536 - ], - [ - 1479, - 561 - ], - [ - 1391, - 561 - ] - ], - "text": "Building" - }, - { - "bounds": { - "height": 22, - "width": 52, - "x": 1488, - "y": 536 - }, - "confidence": 1, - "points": [ - [ - 1488, - 536 - ], - [ - 1540, - 536 - ], - [ - 1540, - 558 - ], - [ - 1488, - 558 - ] - ], - "text": "Area" - } - ] + "type": "paragraph" }, { "bounds": { @@ -29445,8 +7422,9 @@ "x": 67.14448, "y": 563 }, + "cells": null, "confidence": 0.72017634, - "id": "1e13e510-3ded-4323-9080-cb5e5580b049", + "id": "feb537d2-ec33-4877-b208-845f032eac7c", "page": { "height": 2200, "pageIndex": 1, @@ -29474,597 +7452,7 @@ "readingOrder": 36, "role": "Text", "text": "COMMON AREAS) OF THE IMPROVEMENTS GROSS BUILDING AREA (GBA) IS DEFINED AS THE TOTAL FINISHED AREA (INCLUDING\nBASED UPON EXTERIOR MEASUREMENTS.", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 116, - "x": 1108, - "y": 563 - }, - "confidence": 1, - "points": [ - [ - 1108, - 563 - ], - [ - 1224, - 563 - ], - [ - 1224, - 585 - ], - [ - 1108, - 585 - ] - ], - "text": "COMMON" - }, - { - "bounds": { - "height": 27, - "width": 94, - "x": 1230, - "y": 563 - }, - "confidence": 1, - "points": [ - [ - 1230, - 563 - ], - [ - 1324, - 563 - ], - [ - 1324, - 590 - ], - [ - 1230, - 590 - ] - ], - "text": "AREAS)" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1330, - "y": 563 - }, - "confidence": 1, - "points": [ - [ - 1330, - 563 - ], - [ - 1366, - 563 - ], - [ - 1366, - 585 - ], - [ - 1330, - 585 - ] - ], - "text": "OF" - }, - { - "bounds": { - "height": 19, - "width": 50, - "x": 1372, - "y": 566 - }, - "confidence": 1, - "points": [ - [ - 1372, - 566 - ], - [ - 1422, - 566 - ], - [ - 1422, - 585 - ], - [ - 1372, - 585 - ] - ], - "text": "THE" - }, - { - "bounds": { - "height": 22, - "width": 202, - "x": 1427, - "y": 563 - }, - "confidence": 1, - "points": [ - [ - 1427, - 563 - ], - [ - 1629, - 563 - ], - [ - 1629, - 585 - ], - [ - 1427, - 585 - ] - ], - "text": "IMPROVEMENTS" - }, - { - "bounds": { - "height": 22, - "width": 88, - "x": 69, - "y": 563 - }, - "confidence": 1, - "points": [ - [ - 69, - 563 - ], - [ - 157, - 563 - ], - [ - 157, - 585 - ], - [ - 69, - 585 - ] - ], - "text": "GROSS" - }, - { - "bounds": { - "height": 22, - "width": 116, - "x": 166, - "y": 563 - }, - "confidence": 1, - "points": [ - [ - 166, - 563 - ], - [ - 282, - 563 - ], - [ - 282, - 585 - ], - [ - 166, - 585 - ] - ], - "text": "BUILDING" - }, - { - "bounds": { - "height": 19, - "width": 69, - "x": 288, - "y": 566 - }, - "confidence": 1, - "points": [ - [ - 288, - 566 - ], - [ - 357, - 566 - ], - [ - 357, - 585 - ], - [ - 288, - 585 - ] - ], - "text": "AREA" - }, - { - "bounds": { - "height": 27, - "width": 69, - "x": 363, - "y": 563 - }, - "confidence": 1, - "points": [ - [ - 363, - 563 - ], - [ - 432, - 563 - ], - [ - 432, - 590 - ], - [ - 363, - 590 - ] - ], - "text": "(GBA)" - }, - { - "bounds": { - "height": 22, - "width": 25, - "x": 438, - "y": 563 - }, - "confidence": 1, - "points": [ - [ - 438, - 563 - ], - [ - 463, - 563 - ], - [ - 463, - 585 - ], - [ - 438, - 585 - ] - ], - "text": "IS" - }, - { - "bounds": { - "height": 19, - "width": 108, - "x": 469, - "y": 566 - }, - "confidence": 1, - "points": [ - [ - 469, - 566 - ], - [ - 577, - 566 - ], - [ - 577, - 585 - ], - [ - 469, - 585 - ] - ], - "text": "DEFINED" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 583, - "y": 563 - }, - "confidence": 1, - "points": [ - [ - 583, - 563 - ], - [ - 619, - 563 - ], - [ - 619, - 585 - ], - [ - 583, - 585 - ] - ], - "text": "AS" - }, - { - "bounds": { - "height": 19, - "width": 50, - "x": 622, - "y": 566 - }, - "confidence": 1, - "points": [ - [ - 622, - 566 - ], - [ - 672, - 566 - ], - [ - 672, - 585 - ], - [ - 622, - 585 - ] - ], - "text": "THE" - }, - { - "bounds": { - "height": 22, - "width": 77, - "x": 677, - "y": 563 - }, - "confidence": 1, - "points": [ - [ - 677, - 563 - ], - [ - 754, - 563 - ], - [ - 754, - 585 - ], - [ - 677, - 585 - ] - ], - "text": "TOTAL" - }, - { - "bounds": { - "height": 22, - "width": 116, - "x": 761, - "y": 563 - }, - "confidence": 1, - "points": [ - [ - 761, - 563 - ], - [ - 877, - 563 - ], - [ - 877, - 585 - ], - [ - 761, - 585 - ] - ], - "text": "FINISHED" - }, - { - "bounds": { - "height": 19, - "width": 69, - "x": 883, - "y": 566 - }, - "confidence": 1, - "points": [ - [ - 883, - 566 - ], - [ - 952, - 566 - ], - [ - 952, - 585 - ], - [ - 883, - 585 - ] - ], - "text": "AREA" - }, - { - "bounds": { - "height": 27, - "width": 144, - "x": 958, - "y": 563 - }, - "confidence": 1, - "points": [ - [ - 958, - 563 - ], - [ - 1102, - 563 - ], - [ - 1102, - 590 - ], - [ - 958, - 590 - ] - ], - "text": "(INCLUDING" - }, - { - "bounds": { - "height": 22, - "width": 83, - "x": 69, - "y": 594 - }, - "confidence": 1, - "points": [ - [ - 69, - 594 - ], - [ - 152, - 594 - ], - [ - 152, - 616 - ], - [ - 69, - 616 - ] - ], - "text": "BASED" - }, - { - "bounds": { - "height": 22, - "width": 69, - "x": 161, - "y": 594 - }, - "confidence": 1, - "points": [ - [ - 161, - 594 - ], - [ - 230, - 594 - ], - [ - 230, - 616 - ], - [ - 161, - 616 - ] - ], - "text": "UPON" - }, - { - "bounds": { - "height": 22, - "width": 127, - "x": 238, - "y": 594 - }, - "confidence": 1, - "points": [ - [ - 238, - 594 - ], - [ - 365, - 594 - ], - [ - 365, - 616 - ], - [ - 238, - 616 - ] - ], - "text": "EXTERIOR" - }, - { - "bounds": { - "height": 22, - "width": 216, - "x": 375, - "y": 594 - }, - "confidence": 1, - "points": [ - [ - 375, - 594 - ], - [ - 591, - 594 - ], - [ - 591, - 616 - ], - [ - 375, - 616 - ] - ], - "text": "MEASUREMENTS." - } - ] + "type": "paragraph" }, { "bounds": { @@ -30073,8 +7461,9 @@ "x": 458.7424, "y": 629.2326 }, + "cells": null, "confidence": 0.5621711, - "id": "181de0e5-c067-4f25-9f6a-88c6c4499aef", + "id": "fe1a6d04-b1ad-4ef4-8a07-223cbf43d1fd", "page": { "height": 2200, "pageIndex": 1, @@ -30111,8 +7500,9 @@ "x": 455.2481, "y": 718.55145 }, + "cells": null, "confidence": 0.62172765, - "id": "1cfa70dd-f43a-4fc2-bdf7-f550cd3744ae", + "id": "1bde49ae-76f1-47b5-9ae5-6cfc25dc54bc", "page": { "height": 2200, "pageIndex": 1, @@ -30149,8 +7539,9 @@ "x": 477.91577, "y": 751.4126 }, + "cells": null, "confidence": 0.5864967, - "id": "81fcd577-6240-4915-b532-9508d17d4c63", + "id": "6a5f82f0-162b-4d92-baf1-c3b9b2547ba7", "page": { "height": 2200, "pageIndex": 1, @@ -30187,8 +7578,9 @@ "x": 461, "y": 627 }, + "cells": null, "confidence": 0.6047645, - "id": "05a52716-1ee2-457a-a9c1-b27e1830796b", + "id": "700fe942-3ad6-475a-b943-accc85d776ee", "page": { "height": 2200, "pageIndex": 1, @@ -30216,177 +7608,7 @@ "readingOrder": 40, "role": "Text", "text": "Heating Kitchen equip. (#/unit. cond.) Attic", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 86, - "x": 461, - "y": 627 - }, - "confidence": 1, - "points": [ - [ - 461, - 627 - ], - [ - 547, - 627 - ], - [ - 547, - 654 - ], - [ - 461, - 654 - ] - ], - "text": "Heating" - }, - { - "bounds": { - "height": 22, - "width": 80, - "x": 744, - "y": 627 - }, - "confidence": 1, - "points": [ - [ - 744, - 627 - ], - [ - 824, - 627 - ], - [ - 824, - 649 - ], - [ - 744, - 649 - ] - ], - "text": "Kitchen" - }, - { - "bounds": { - "height": 27, - "width": 66, - "x": 833, - "y": 627 - }, - "confidence": 1, - "points": [ - [ - 833, - 627 - ], - [ - 899, - 627 - ], - [ - 899, - 654 - ], - [ - 833, - 654 - ] - ], - "text": "equip." - }, - { - "bounds": { - "height": 27, - "width": 75, - "x": 961, - "y": 627 - }, - "confidence": 1, - "points": [ - [ - 961, - 627 - ], - [ - 1036, - 627 - ], - [ - 1036, - 654 - ], - [ - 961, - 654 - ] - ], - "text": "(#/unit." - }, - { - "bounds": { - "height": 27, - "width": 69, - "x": 1041, - "y": 627 - }, - "confidence": 1, - "points": [ - [ - 1041, - 627 - ], - [ - 1110, - 627 - ], - [ - 1110, - 654 - ], - [ - 1041, - 654 - ] - ], - "text": "cond.)" - }, - { - "bounds": { - "height": 22, - "width": 50, - "x": 1150, - "y": 627 - }, - "confidence": 1, - "points": [ - [ - 1150, - 627 - ], - [ - 1200, - 627 - ], - [ - 1200, - 649 - ], - [ - 1150, - 649 - ] - ], - "text": "Attic" - } - ] + "type": "paragraph" }, { "bounds": { @@ -30395,8 +7617,9 @@ "x": 743.4198, "y": 658 }, + "cells": null, "confidence": 0.62903094, - "id": "9e67ca86-50b0-410a-879a-07a76c1d4d59", + "id": "88eb7ef3-8a2a-4f56-9a9f-b845cb24251c", "page": { "height": 2200, "pageIndex": 1, @@ -30424,121 +7647,7 @@ "readingOrder": 41, "role": "Text", "text": "Yes Refrigerator_________________ ❐ None", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 16, - "width": 30, - "x": 880, - "y": 663 - }, - "confidence": 1, - "points": [ - [ - 880, - 663 - ], - [ - 910, - 663 - ], - [ - 910, - 679 - ], - [ - 880, - 679 - ] - ], - "text": "Yes" - }, - { - "bounds": { - "height": 27, - "width": 377, - "x": 744, - "y": 658 - }, - "confidence": 1, - "points": [ - [ - 744, - 658 - ], - [ - 1121, - 658 - ], - [ - 1121, - 685 - ], - [ - 744, - 685 - ] - ], - "text": "Refrigerator_________________" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1150, - "y": 661 - }, - "confidence": 1, - "points": [ - [ - 1150, - 661 - ], - [ - 1169, - 661 - ], - [ - 1169, - 680 - ], - [ - 1150, - 680 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 1177, - "y": 658 - }, - "confidence": 1, - "points": [ - [ - 1177, - 658 - ], - [ - 1238, - 658 - ], - [ - 1238, - 680 - ], - [ - 1177, - 680 - ] - ], - "text": "None" - } - ] + "type": "paragraph" }, { "bounds": { @@ -30547,8 +7656,9 @@ "x": 743.15234, "y": 690.56384 }, + "cells": null, "confidence": 0.65269685, - "id": "55059421-0ef0-4a41-b746-9af9e14758f0", + "id": "71a44d24-ac1b-4786-91a1-1f970bc6c203", "page": { "height": 2200, "pageIndex": 1, @@ -30585,8 +7695,9 @@ "x": 743.3563, "y": 719.9357 }, + "cells": null, "confidence": 0.5627176, - "id": "f642e95e-936a-4ec8-9175-97f3030e7cb5", + "id": "ef3d5548-379c-4f3c-8fca-47da5f732891", "page": { "height": 2200, "pageIndex": 1, @@ -30623,8 +7734,9 @@ "x": 743.7055, "y": 749.3836 }, + "cells": null, "confidence": 0.5885358, - "id": "8229028d-6fba-4de7-956f-64033808c4d9", + "id": "f4754cb5-ff4d-4de0-bd35-8c2b55d96f8a", "page": { "height": 2200, "pageIndex": 1, @@ -30661,8 +7773,9 @@ "x": 743.09534, "y": 778.8595 }, + "cells": null, "confidence": 0.5677829, - "id": "d9f1fd33-22de-4acc-bd5d-eccbebe4220c", + "id": "6f58ffb0-4300-43fc-b98e-32b3727e1c41", "page": { "height": 2200, "pageIndex": 1, @@ -30699,8 +7812,9 @@ "x": 743.29236, "y": 811.4724 }, + "cells": null, "confidence": 0.5280428, - "id": "05b3f3b8-4aeb-4b35-af9a-289494301b94", + "id": "f53868f9-ec10-4cbb-bbad-9dbdc1bfd965", "page": { "height": 2200, "pageIndex": 1, @@ -30737,8 +7851,9 @@ "x": 743.59045, "y": 838 }, + "cells": null, "confidence": 0.6158591, - "id": "d907c970-0212-4396-b39b-9db4bf68bd64", + "id": "89627601-1c5f-4ec0-9ecd-cb46c7ee921a", "page": { "height": 2200, "pageIndex": 1, @@ -30766,233 +7881,7 @@ "readingOrder": 47, "role": "Text", "text": "Washer/dryer (each unit) Yes_______________ ❐ Finished Offstreet ❐", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 152, - "x": 744, - "y": 838 - }, - "confidence": 1, - "points": [ - [ - 744, - 838 - ], - [ - 896, - 838 - ], - [ - 896, - 865 - ], - [ - 744, - 865 - ] - ], - "text": "Washer/dryer" - }, - { - "bounds": { - "height": 25, - "width": 58, - "x": 952, - "y": 841 - }, - "confidence": 1, - "points": [ - [ - 952, - 841 - ], - [ - 1010, - 841 - ], - [ - 1010, - 866 - ], - [ - 952, - 866 - ] - ], - "text": "(each" - }, - { - "bounds": { - "height": 25, - "width": 41, - "x": 1019, - "y": 841 - }, - "confidence": 1, - "points": [ - [ - 1019, - 841 - ], - [ - 1060, - 841 - ], - [ - 1060, - 866 - ], - [ - 1019, - 866 - ] - ], - "text": "unit)" - }, - { - "bounds": { - "height": 19, - "width": 213, - "x": 908, - "y": 844 - }, - "confidence": 1, - "points": [ - [ - 908, - 844 - ], - [ - 1121, - 844 - ], - [ - 1121, - 863 - ], - [ - 908, - 863 - ] - ], - "text": "Yes_______________" - }, - { - "bounds": { - "height": 22, - "width": 19, - "x": 1150, - "y": 838 - }, - "confidence": 1, - "points": [ - [ - 1150, - 838 - ], - [ - 1169, - 838 - ], - [ - 1169, - 860 - ], - [ - 1150, - 860 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 91, - "x": 1180, - "y": 838 - }, - "confidence": 1, - "points": [ - [ - 1180, - 838 - ], - [ - 1271, - 838 - ], - [ - 1271, - 860 - ], - [ - 1180, - 860 - ] - ], - "text": "Finished" - }, - { - "bounds": { - "height": 22, - "width": 97, - "x": 1336, - "y": 838 - }, - "confidence": 1, - "points": [ - [ - 1336, - 838 - ], - [ - 1433, - 838 - ], - [ - 1433, - 860 - ], - [ - 1336, - 860 - ] - ], - "text": "Offstreet" - }, - { - "bounds": { - "height": 22, - "width": 19, - "x": 1519, - "y": 838 - }, - "confidence": 1, - "points": [ - [ - 1519, - 838 - ], - [ - 1538, - 838 - ], - [ - 1538, - 860 - ], - [ - 1519, - 860 - ] - ], - "text": "❐" - } - ] + "type": "paragraph" }, { "bounds": { @@ -31001,8 +7890,9 @@ "x": 744.74133, "y": 870.0424 }, + "cells": null, "confidence": 0.54435074, - "id": "1c49f769-1075-4460-b8f9-1379dcc36cdd", + "id": "530d426c-f60a-4427-adb3-4fa0ddee2851", "page": { "height": 2200, "pageIndex": 1, @@ -31039,8 +7929,9 @@ "x": 960.0741, "y": 628.9252 }, + "cells": null, "confidence": 0.61700493, - "id": "aced95a3-34d2-46cb-87a9-2504dcec9a01", + "id": "09b8bd92-1e4b-457c-973b-ce472ea05e38", "page": { "height": 2200, "pageIndex": 1, @@ -31077,8 +7968,9 @@ "x": 1148.8312, "y": 629.01526 }, + "cells": null, "confidence": 0.6206455, - "id": "ad13328e-e1ef-4fc9-9cd5-70c062ade5c2", + "id": "eae26b01-0d73-42b0-bc1e-f530efe59ed9", "page": { "height": 2200, "pageIndex": 1, @@ -31115,8 +8007,9 @@ "x": 1149.3243, "y": 658.92175 }, + "cells": null, "confidence": 0.6602759, - "id": "994dae7a-6ec8-4d26-93a9-8660d44a663e", + "id": "e3ddef54-b639-487c-bf75-56a02d665c5b", "page": { "height": 2200, "pageIndex": 1, @@ -31153,8 +8046,9 @@ "x": 197, "y": 688 }, + "cells": null, "confidence": 0.69577163, - "id": "b7b679d9-5218-469b-b630-0a4a887db0c3", + "id": "8820f154-28fe-419a-81db-654e0b5dc9b7", "page": { "height": 2200, "pageIndex": 1, @@ -31182,177 +8076,7 @@ "readingOrder": 52, "role": "CheckboxUnselected", "text": "Drywall/Good__________________Fuel Range/oven ❐ Stairs Carport ❐", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 308, - "x": 197, - "y": 688 - }, - "confidence": 1, - "points": [ - [ - 197, - 688 - ], - [ - 505, - 688 - ], - [ - 505, - 713 - ], - [ - 197, - 713 - ] - ], - "text": "Drywall/Good__________________Fuel" - }, - { - "bounds": { - "height": 27, - "width": 138, - "x": 744, - "y": 688 - }, - "confidence": 1, - "points": [ - [ - 744, - 688 - ], - [ - 882, - 688 - ], - [ - 882, - 715 - ], - [ - 744, - 715 - ] - ], - "text": "Range/oven" - }, - { - "bounds": { - "height": 22, - "width": 19, - "x": 1150, - "y": 688 - }, - "confidence": 1, - "points": [ - [ - 1150, - 688 - ], - [ - 1169, - 688 - ], - [ - 1169, - 710 - ], - [ - 1150, - 710 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 63, - "x": 1175, - "y": 688 - }, - "confidence": 1, - "points": [ - [ - 1175, - 688 - ], - [ - 1238, - 688 - ], - [ - 1238, - 710 - ], - [ - 1175, - 710 - ] - ], - "text": "Stairs" - }, - { - "bounds": { - "height": 27, - "width": 88, - "x": 1336, - "y": 688 - }, - "confidence": 1, - "points": [ - [ - 1336, - 688 - ], - [ - 1424, - 688 - ], - [ - 1424, - 715 - ], - [ - 1336, - 715 - ] - ], - "text": "Carport" - }, - { - "bounds": { - "height": 22, - "width": 19, - "x": 1519, - "y": 688 - }, - "confidence": 1, - "points": [ - [ - 1519, - 688 - ], - [ - 1538, - 688 - ], - [ - 1538, - 710 - ], - [ - 1519, - 710 - ] - ], - "text": "❐" - } - ] + "type": "paragraph" }, { "bounds": { @@ -31361,8 +8085,9 @@ "x": 66, "y": 717.74524 }, + "cells": null, "confidence": 0.5039003, - "id": "44595ad4-0f0d-455d-8e03-529c38ce11c5", + "id": "63debe77-3eb9-4424-9056-a2bfe92df9bb", "page": { "height": 2200, "pageIndex": 1, @@ -31390,289 +8115,7 @@ "readingOrder": 53, "role": "CheckboxUnselected", "text": "Trim/finish Wood/Good__________________Condition Good__________ Disposal 4 ❐ Drop stair Attached ❐", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 116, - "x": 66, - "y": 719 - }, - "confidence": 1, - "points": [ - [ - 66, - 719 - ], - [ - 182, - 719 - ], - [ - 182, - 741 - ], - [ - 66, - 741 - ] - ], - "text": "Trim/finish" - }, - { - "bounds": { - "height": 25, - "width": 369, - "x": 197, - "y": 719 - }, - "confidence": 1, - "points": [ - [ - 197, - 719 - ], - [ - 566, - 719 - ], - [ - 566, - 744 - ], - [ - 197, - 744 - ] - ], - "text": "Wood/Good__________________Condition" - }, - { - "bounds": { - "height": 22, - "width": 144, - "x": 575, - "y": 722 - }, - "confidence": 1, - "points": [ - [ - 575, - 722 - ], - [ - 719, - 722 - ], - [ - 719, - 744 - ], - [ - 575, - 744 - ] - ], - "text": "Good__________" - }, - { - "bounds": { - "height": 25, - "width": 100, - "x": 744, - "y": 719 - }, - "confidence": 1, - "points": [ - [ - 744, - 719 - ], - [ - 844, - 719 - ], - [ - 844, - 744 - ], - [ - 744, - 744 - ] - ], - "text": "Disposal" - }, - { - "bounds": { - "height": 13, - "width": 16, - "x": 1150, - "y": 719 - }, - "confidence": 1, - "points": [ - [ - 1150, - 719 - ], - [ - 1166, - 719 - ], - [ - 1166, - 732 - ], - [ - 1150, - 732 - ] - ], - "text": "4" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1150, - "y": 719 - }, - "confidence": 1, - "points": [ - [ - 1150, - 719 - ], - [ - 1169, - 719 - ], - [ - 1169, - 738 - ], - [ - 1150, - 738 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 25, - "width": 52, - "x": 1177, - "y": 719 - }, - "confidence": 1, - "points": [ - [ - 1177, - 719 - ], - [ - 1229, - 719 - ], - [ - 1229, - 744 - ], - [ - 1177, - 744 - ] - ], - "text": "Drop" - }, - { - "bounds": { - "height": 22, - "width": 47, - "x": 1238, - "y": 719 - }, - "confidence": 1, - "points": [ - [ - 1238, - 719 - ], - [ - 1285, - 719 - ], - [ - 1285, - 741 - ], - [ - 1238, - 741 - ] - ], - "text": "stair" - }, - { - "bounds": { - "height": 22, - "width": 100, - "x": 1336, - "y": 719 - }, - "confidence": 1, - "points": [ - [ - 1336, - 719 - ], - [ - 1436, - 719 - ], - [ - 1436, - 741 - ], - [ - 1336, - 741 - ] - ], - "text": "Attached" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1519, - "y": 719 - }, - "confidence": 1, - "points": [ - [ - 1519, - 719 - ], - [ - 1538, - 719 - ], - [ - 1538, - 738 - ], - [ - 1519, - 738 - ] - ], - "text": "❐" - } - ] + "type": "paragraph" }, { "bounds": { @@ -31681,8 +8124,9 @@ "x": 1149.4647, "y": 746.9664 }, + "cells": null, "confidence": 0.61371946, - "id": "7569de86-af6c-4e99-8a9e-3886f1d7a0c8", + "id": "0fdeef66-9b62-4e8c-9972-8c96f0c2cfc2", "page": { "height": 2200, "pageIndex": 1, @@ -31719,8 +8163,9 @@ "x": 1150.2661, "y": 777.43243 }, + "cells": null, "confidence": 0.6856967, - "id": "058cdbd9-53a4-470f-bf31-2e1ca76f3aad", + "id": "8814bfe7-0941-4176-bd70-496b26e391dc", "page": { "height": 2200, "pageIndex": 1, @@ -31757,8 +8202,9 @@ "x": 744, "y": 807.9388 }, + "cells": null, "confidence": 0.7268472, - "id": "b8d64a8b-ee02-45e8-96cd-f7d3082cc354", + "id": "0e9b0f23-376c-437e-9e60-ae18cc04ea7c", "page": { "height": 2200, "pageIndex": 1, @@ -31786,149 +8232,7 @@ "readingOrder": 56, "role": "CheckboxUnselected", "text": "Compactor ❐ Heated Inadequate ❐", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 124, - "x": 744, - "y": 808 - }, - "confidence": 1, - "points": [ - [ - 744, - 808 - ], - [ - 868, - 808 - ], - [ - 868, - 835 - ], - [ - 744, - 835 - ] - ], - "text": "Compactor" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1150, - "y": 811 - }, - "confidence": 1, - "points": [ - [ - 1150, - 811 - ], - [ - 1169, - 811 - ], - [ - 1169, - 830 - ], - [ - 1150, - 830 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 80, - "x": 1177, - "y": 808 - }, - "confidence": 1, - "points": [ - [ - 1177, - 808 - ], - [ - 1257, - 808 - ], - [ - 1257, - 830 - ], - [ - 1177, - 830 - ] - ], - "text": "Heated" - }, - { - "bounds": { - "height": 27, - "width": 127, - "x": 1338, - "y": 808 - }, - "confidence": 1, - "points": [ - [ - 1338, - 808 - ], - [ - 1465, - 808 - ], - [ - 1465, - 835 - ], - [ - 1338, - 835 - ] - ], - "text": "Inadequate" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1519, - "y": 811 - }, - "confidence": 1, - "points": [ - [ - 1519, - 811 - ], - [ - 1538, - 811 - ], - [ - 1538, - 830 - ], - [ - 1519, - 830 - ] - ], - "text": "❐" - } - ] + "type": "paragraph" }, { "bounds": { @@ -31937,8 +8241,9 @@ "x": 1150.1672, "y": 838.4792 }, + "cells": null, "confidence": 0.7001297, - "id": "46531767-9feb-4631-a7dc-1606e347ce5d", + "id": "c0d9b923-9000-4594-a04c-eda119160370", "page": { "height": 2200, "pageIndex": 1, @@ -31975,8 +8280,9 @@ "x": 744, "y": 868.87537 }, + "cells": null, "confidence": 0.69361806, - "id": "4a014cf2-0a5e-4a15-bc33-6e2bbeeb30d0", + "id": "3ef46cac-1d05-4448-beed-4cdf67ce98f2", "page": { "height": 2200, "pageIndex": 1, @@ -32004,149 +8310,7 @@ "readingOrder": 58, "role": "CheckboxUnselected", "text": "Finished ❐ Unfinished None ❐", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 97, - "x": 744, - "y": 869 - }, - "confidence": 1, - "points": [ - [ - 744, - 869 - ], - [ - 841, - 869 - ], - [ - 841, - 891 - ], - [ - 744, - 891 - ] - ], - "text": "Finished" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1150, - "y": 869 - }, - "confidence": 1, - "points": [ - [ - 1150, - 869 - ], - [ - 1169, - 869 - ], - [ - 1169, - 888 - ], - [ - 1150, - 888 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 116, - "x": 1180, - "y": 869 - }, - "confidence": 1, - "points": [ - [ - 1180, - 869 - ], - [ - 1296, - 869 - ], - [ - 1296, - 891 - ], - [ - 1180, - 891 - ] - ], - "text": "Unfinished" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 1338, - "y": 869 - }, - "confidence": 1, - "points": [ - [ - 1338, - 869 - ], - [ - 1399, - 869 - ], - [ - 1399, - 891 - ], - [ - 1338, - 891 - ] - ], - "text": "None" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1519, - "y": 869 - }, - "confidence": 1, - "points": [ - [ - 1519, - 869 - ], - [ - 1538, - 869 - ], - [ - 1538, - 888 - ], - [ - 1519, - 888 - ] - ], - "text": "❐" - } - ] + "type": "paragraph" }, { "bounds": { @@ -32155,8 +8319,9 @@ "x": 1043.3577, "y": 104.53013 }, + "cells": null, "confidence": 0.6606693, - "id": "8fa0de1f-8bef-46b8-bb79-b134c16cdec1", + "id": "4590a135-ba51-4b39-802c-562e8a0c518c", "page": { "height": 2200, "pageIndex": 1, @@ -32193,8 +8358,9 @@ "x": 1045.6676, "y": 136.56993 }, + "cells": null, "confidence": 0.5703567, - "id": "85428ad3-7227-4522-9f69-0d9ebe5789a5", + "id": "73df7032-293f-494f-90c4-27152b328056", "page": { "height": 2200, "pageIndex": 1, @@ -32231,8 +8397,9 @@ "x": 1047.2905, "y": 164.94461 }, + "cells": null, "confidence": 0.62080896, - "id": "302adc82-3b6c-4b19-910a-ce57d12eec27", + "id": "4e559b48-116a-41dc-9711-a4a81e6aad82", "page": { "height": 2200, "pageIndex": 1, @@ -32269,8 +8436,9 @@ "x": 1046.9863, "y": 194.30711 }, + "cells": null, "confidence": 0.66027784, - "id": "d7ec924f-cba8-49a5-a672-e17cf1aa756b", + "id": "055cbb85-d873-4756-b7f6-3bf1bc7ab4a8", "page": { "height": 2200, "pageIndex": 1, @@ -32307,8 +8475,9 @@ "x": 1045.7909, "y": 225.45648 }, + "cells": null, "confidence": 0.6498124, - "id": "aa0ace84-3e85-44a1-8716-7d4a9ff7b4e2", + "id": "944c9852-8fab-4b94-9faa-25d78bbfbae2", "page": { "height": 2200, "pageIndex": 1, @@ -32345,8 +8514,9 @@ "x": 1044.449, "y": 254.56096 }, + "cells": null, "confidence": 0.6209034, - "id": "b52c34da-4ed4-459a-8a8b-fbe16146e9e7", + "id": "445f9af2-4457-450c-8cac-a176180a8062", "page": { "height": 2200, "pageIndex": 1, @@ -32383,8 +8553,9 @@ "x": 1282.4026, "y": 73.20239 }, + "cells": null, "confidence": 0.68638414, - "id": "45cc74ed-6c09-4720-b5c9-c8ba47d99ba4", + "id": "b44b0c21-2ce8-4ae5-93f6-71bf20d505b0", "page": { "height": 2200, "pageIndex": 1, @@ -32421,8 +8592,9 @@ "x": 1281.2765, "y": 104.38008 }, + "cells": null, "confidence": 0.53570145, - "id": "a219e0b7-1c50-4dfa-b475-3f0aa6906e8c", + "id": "23058683-d658-4b36-b3de-ee5ac119554e", "page": { "height": 2200, "pageIndex": 1, @@ -32459,8 +8631,9 @@ "x": 1280.2367, "y": 134.90956 }, + "cells": null, "confidence": 0.6488327, - "id": "c125e4aa-d809-4eca-837d-38c79be21799", + "id": "df2df11a-87ce-430c-a8fc-4051a2b01127", "page": { "height": 2200, "pageIndex": 1, @@ -32497,8 +8670,9 @@ "x": 1280.0386, "y": 162.6554 }, + "cells": null, "confidence": 0.6607432, - "id": "5394d343-7ed1-47d8-b15f-b27bb11d01c4", + "id": "f7bb3c48-7ae4-4158-a53a-f91ebd23426c", "page": { "height": 2200, "pageIndex": 1, @@ -32535,8 +8709,9 @@ "x": 1279.7091, "y": 194.8918 }, + "cells": null, "confidence": 0.6811933, - "id": "1730c43e-cffc-493a-ba4b-4471b4d5dbdc", + "id": "05293443-ffb9-4d94-ab9c-ce1c2f6f351b", "page": { "height": 2200, "pageIndex": 1, @@ -32563,7 +8738,7 @@ ], "readingOrder": 69, "role": "CheckboxUnselected", - "text": "□ Floor", + "text": "Floor", "type": "paragraph" }, { @@ -32573,8 +8748,9 @@ "x": 1279.963, "y": 223.0644 }, + "cells": null, "confidence": 0.51758873, - "id": "463566da-e0dd-4d29-883b-92a01be09d1d", + "id": "c861cf96-06d4-4748-88da-106c4da434ee", "page": { "height": 2200, "pageIndex": 1, @@ -32601,7 +8777,7 @@ ], "readingOrder": 70, "role": "CheckboxUnselected", - "text": "□ None", + "text": "None", "type": "paragraph" }, { @@ -32611,8 +8787,9 @@ "x": 1280.175, "y": 254.36958 }, + "cells": null, "confidence": 0.53752553, - "id": "20770198-d395-4de6-91e9-9e324371e1b2", + "id": "fb3a3c0a-47ef-47bd-a774-1c3251c45238", "page": { "height": 2200, "pageIndex": 1, @@ -32649,8 +8826,9 @@ "x": 400, "y": 283 }, + "cells": null, "confidence": 0.60927343, - "id": "538b666e-2579-4ca8-8d76-41f6739d50d1", + "id": "796d1c59-fc57-47ae-8311-3b2694aa8ca7", "page": { "height": 2200, "pageIndex": 1, @@ -32678,289 +8856,7 @@ "readingOrder": 72, "role": "Text", "text": "Manufactured housing ❐ Yes Basement Energy efficient items _____ Double-pane", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 152, - "x": 400, - "y": 283 - }, - "confidence": 1, - "points": [ - [ - 400, - 283 - ], - [ - 552, - 283 - ], - [ - 552, - 305 - ], - [ - 400, - 305 - ] - ], - "text": "Manufactured" - }, - { - "bounds": { - "height": 27, - "width": 88, - "x": 558, - "y": 283 - }, - "confidence": 1, - "points": [ - [ - 558, - 283 - ], - [ - 646, - 283 - ], - [ - 646, - 310 - ], - [ - 558, - 310 - ] - ], - "text": "housing" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 675, - "y": 286 - }, - "confidence": 1, - "points": [ - [ - 675, - 286 - ], - [ - 694, - 286 - ], - [ - 694, - 305 - ], - [ - 675, - 305 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 38, - "x": 700, - "y": 283 - }, - "confidence": 1, - "points": [ - [ - 700, - 283 - ], - [ - 738, - 283 - ], - [ - 738, - 305 - ], - [ - 700, - 305 - ] - ], - "text": "Yes" - }, - { - "bounds": { - "height": 22, - "width": 113, - "x": 888, - "y": 283 - }, - "confidence": 1, - "points": [ - [ - 888, - 283 - ], - [ - 1001, - 283 - ], - [ - 1001, - 305 - ], - [ - 888, - 305 - ] - ], - "text": "Basement" - }, - { - "bounds": { - "height": 27, - "width": 77, - "x": 1283, - "y": 283 - }, - "confidence": 1, - "points": [ - [ - 1283, - 283 - ], - [ - 1360, - 283 - ], - [ - 1360, - 310 - ], - [ - 1283, - 310 - ] - ], - "text": "Energy" - }, - { - "bounds": { - "height": 22, - "width": 86, - "x": 1369, - "y": 283 - }, - "confidence": 1, - "points": [ - [ - 1369, - 283 - ], - [ - 1455, - 283 - ], - [ - 1455, - 305 - ], - [ - 1369, - 305 - ] - ], - "text": "efficient" - }, - { - "bounds": { - "height": 22, - "width": 58, - "x": 1463, - "y": 283 - }, - "confidence": 1, - "points": [ - [ - 1463, - 283 - ], - [ - 1521, - 283 - ], - [ - 1521, - 305 - ], - [ - 1463, - 305 - ] - ], - "text": "items" - }, - { - "bounds": { - "height": 5, - "width": 75, - "x": 1533, - "y": 305 - }, - "confidence": 1, - "points": [ - [ - 1533, - 305 - ], - [ - 1608, - 305 - ], - [ - 1608, - 310 - ], - [ - 1533, - 310 - ] - ], - "text": "_____" - }, - { - "bounds": { - "height": 22, - "width": 108, - "x": 1533, - "y": 288 - }, - "confidence": 1, - "points": [ - [ - 1533, - 288 - ], - [ - 1641, - 288 - ], - [ - 1641, - 310 - ], - [ - 1533, - 310 - ] - ], - "text": "Double-pane" - } - ] + "type": "paragraph" }, { "bounds": { @@ -32969,8 +8865,9 @@ "x": 1447.2872, "y": 138.30064 }, + "cells": null, "confidence": 0.6203391, - "id": "53b609fc-42b5-42bd-8fec-0c17a71c5359", + "id": "a8fe67c5-4266-42fd-8c52-e15996973778", "page": { "height": 2200, "pageIndex": 1, @@ -33007,8 +8904,9 @@ "x": 1446.899, "y": 168.52652 }, + "cells": null, "confidence": 0.6267271, - "id": "cc24a609-7b1e-428b-9e56-b1ca405f0aa0", + "id": "d38bd883-65ce-4e28-ba52-9c34678065be", "page": { "height": 2200, "pageIndex": 1, @@ -33045,8 +8943,9 @@ "x": 1449.3066, "y": 226.3187 }, + "cells": null, "confidence": 0.6472771, - "id": "0fbba896-a9c3-4919-8b56-c98a5eefd927", + "id": "841d7f16-e9ba-4571-85f8-a2b074a3a9b5", "page": { "height": 2200, "pageIndex": 1, @@ -33083,8 +8982,9 @@ "x": 1644, "y": 288 }, + "cells": null, "confidence": 1, - "id": "0d084865-0b83-41de-a0f6-02b11cc8bb9a", + "id": "3ac3c358-17ac-48aa-8474-dfd705c2a552", "page": { "height": 2200, "pageIndex": 1, @@ -33112,37 +9012,7 @@ "readingOrder": 76, "role": "Text", "text": "windows", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 16, - "width": 72, - "x": 1644, - "y": 288 - }, - "confidence": 1, - "points": [ - [ - 1644, - 288 - ], - [ - 1716, - 288 - ], - [ - 1716, - 304 - ], - [ - 1644, - 304 - ] - ], - "text": "windows" - } - ] + "type": "paragraph" }, { "bounds": { @@ -33151,8 +9021,9 @@ "x": 1636, "y": 966 }, + "cells": null, "confidence": 1, - "id": "e213e716-5e7f-4364-8cfc-b617f5262e1d", + "id": "a59f9078-653a-4523-90ed-6caa979bf203", "page": { "height": 2200, "pageIndex": 1, @@ -33180,37 +9051,7 @@ "readingOrder": 77, "role": "Text", "text": "average", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 80, - "x": 1636, - "y": 966 - }, - "confidence": 1, - "points": [ - [ - 1636, - 966 - ], - [ - 1716, - 966 - ], - [ - 1716, - 988 - ], - [ - 1636, - 988 - ] - ], - "text": "average" - } - ] + "type": "paragraph" }, { "bounds": { @@ -33219,8 +9060,9 @@ "x": 197.35265, "y": 688.1722 }, + "cells": null, "confidence": 0.5229601, - "id": "1c396b2e-5b26-48bd-a6c7-34fcdcca4d9a", + "id": "8e0812bb-446e-4bc1-b013-2907779f967f", "page": { "height": 2200, "pageIndex": 1, @@ -33257,8 +9099,9 @@ "x": 69.25093, "y": 717.74536 }, + "cells": null, "confidence": 0.5255272, - "id": "4e8c5f0f-005d-4571-b5ea-8e3eb0a3cbac", + "id": "6eaa4ac8-8b0a-41c3-a8b1-f77d75cae218", "page": { "height": 2200, "pageIndex": 1, @@ -33295,8 +9138,9 @@ "x": 198.12804, "y": 747.1608 }, + "cells": null, "confidence": 0.5116437, - "id": "847153e6-8354-4985-af90-fb7ac871f477", + "id": "9edb9450-af69-4909-8982-23e8794173e1", "page": { "height": 2200, "pageIndex": 1, @@ -33333,8 +9177,9 @@ "x": 69, "y": 776.12305 }, + "cells": null, "confidence": 0.57378584, - "id": "8913f813-5e0f-42e6-84a4-62dbfeae932a", + "id": "8ba9ee72-2283-4742-88ae-fd6096a7a68e", "page": { "height": 2200, "pageIndex": 1, @@ -33362,289 +9207,7 @@ "readingOrder": 81, "role": "Text", "text": "Bath Ceramic Tile wainscot________________Cooling____________ Fan/hood ❐ Floor Adequate 4 ❐", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 50, - "x": 69, - "y": 777 - }, - "confidence": 1, - "points": [ - [ - 69, - 777 - ], - [ - 119, - 777 - ], - [ - 119, - 799 - ], - [ - 69, - 799 - ] - ], - "text": "Bath" - }, - { - "bounds": { - "height": 19, - "width": 77, - "x": 227, - "y": 777 - }, - "confidence": 1, - "points": [ - [ - 227, - 777 - ], - [ - 304, - 777 - ], - [ - 304, - 796 - ], - [ - 227, - 796 - ] - ], - "text": "Ceramic" - }, - { - "bounds": { - "height": 19, - "width": 33, - "x": 311, - "y": 777 - }, - "confidence": 1, - "points": [ - [ - 311, - 777 - ], - [ - 344, - 777 - ], - [ - 344, - 796 - ], - [ - 311, - 796 - ] - ], - "text": "Tile" - }, - { - "bounds": { - "height": 27, - "width": 591, - "x": 127, - "y": 777 - }, - "confidence": 1, - "points": [ - [ - 127, - 777 - ], - [ - 718, - 777 - ], - [ - 718, - 804 - ], - [ - 127, - 804 - ] - ], - "text": "wainscot________________Cooling____________" - }, - { - "bounds": { - "height": 22, - "width": 105, - "x": 744, - "y": 777 - }, - "confidence": 1, - "points": [ - [ - 744, - 777 - ], - [ - 849, - 777 - ], - [ - 849, - 799 - ], - [ - 744, - 799 - ] - ], - "text": "Fan/hood" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1150, - "y": 780 - }, - "confidence": 1, - "points": [ - [ - 1150, - 780 - ], - [ - 1169, - 780 - ], - [ - 1169, - 799 - ], - [ - 1150, - 799 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 55, - "x": 1177, - "y": 777 - }, - "confidence": 1, - "points": [ - [ - 1177, - 777 - ], - [ - 1232, - 777 - ], - [ - 1232, - 799 - ], - [ - 1177, - 799 - ] - ], - "text": "Floor" - }, - { - "bounds": { - "height": 27, - "width": 111, - "x": 1336, - "y": 777 - }, - "confidence": 1, - "points": [ - [ - 1336, - 777 - ], - [ - 1447, - 777 - ], - [ - 1447, - 804 - ], - [ - 1336, - 804 - ] - ], - "text": "Adequate" - }, - { - "bounds": { - "height": 13, - "width": 11, - "x": 1522, - "y": 780 - }, - "confidence": 1, - "points": [ - [ - 1522, - 780 - ], - [ - 1533, - 780 - ], - [ - 1533, - 793 - ], - [ - 1522, - 793 - ] - ], - "text": "4" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1519, - "y": 780 - }, - "confidence": 1, - "points": [ - [ - 1519, - 780 - ], - [ - 1538, - 780 - ], - [ - 1538, - 799 - ], - [ - 1519, - 799 - ] - ], - "text": "❐" - } - ] + "type": "paragraph" }, { "bounds": { @@ -33653,8 +9216,9 @@ "x": 67.50168, "y": 898.33905 }, + "cells": null, "confidence": 0.6076812, - "id": "281fd763-c982-4207-8e33-83103a559d91", + "id": "9d0f5f0f-f92b-4783-872a-23892eb44470", "page": { "height": 2200, "pageIndex": 1, @@ -33682,65 +9246,7 @@ "readingOrder": 82, "role": "Text", "text": "Fireplace(s) No", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 130, - "x": 69, - "y": 899 - }, - "confidence": 1, - "points": [ - [ - 69, - 899 - ], - [ - 199, - 899 - ], - [ - 199, - 924 - ], - [ - 69, - 924 - ] - ], - "text": "Fireplace(s)" - }, - { - "bounds": { - "height": 19, - "width": 30, - "x": 883, - "y": 905 - }, - "confidence": 1, - "points": [ - [ - 883, - 905 - ], - [ - 913, - 905 - ], - [ - 913, - 924 - ], - [ - 883, - 924 - ] - ], - "text": "No" - } - ] + "type": "paragraph" }, { "bounds": { @@ -33749,8 +9255,9 @@ "x": 882.2332, "y": 902.3154 }, + "cells": null, "confidence": 0.52140206, - "id": "dd315841-c3bf-413a-bcae-1134e561cf57", + "id": "d54b4947-1704-4979-80a7-a3caf26576b7", "page": { "height": 2200, "pageIndex": 1, @@ -33787,8 +9294,9 @@ "x": 66.59386, "y": 929.66907 }, + "cells": null, "confidence": 0.5998311, - "id": "bd9df96e-480d-448c-820a-b41cd10a4d96", + "id": "228fcfca-9701-4d5c-af67-e740e0ef709f", "page": { "height": 2200, "pageIndex": 1, @@ -33816,373 +9324,7 @@ "readingOrder": 84, "role": "Text", "text": "Condition of the improvements, repairs needed, quality of construction, additional features, modernization etc.:", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 105, - "x": 69, - "y": 930 - }, - "confidence": 1, - "points": [ - [ - 69, - 930 - ], - [ - 174, - 930 - ], - [ - 174, - 952 - ], - [ - 69, - 952 - ] - ], - "text": "Condition" - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 183, - "y": 933 - }, - "confidence": 1, - "points": [ - [ - 183, - 933 - ], - [ - 205, - 933 - ], - [ - 205, - 952 - ], - [ - 183, - 952 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 19, - "width": 36, - "x": 211, - "y": 933 - }, - "confidence": 1, - "points": [ - [ - 211, - 933 - ], - [ - 247, - 933 - ], - [ - 247, - 952 - ], - [ - 211, - 952 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 25, - "width": 163, - "x": 255, - "y": 933 - }, - "confidence": 1, - "points": [ - [ - 255, - 933 - ], - [ - 418, - 933 - ], - [ - 418, - 958 - ], - [ - 255, - 958 - ] - ], - "text": "improvements," - }, - { - "bounds": { - "height": 25, - "width": 77, - "x": 427, - "y": 933 - }, - "confidence": 1, - "points": [ - [ - 427, - 933 - ], - [ - 504, - 933 - ], - [ - 504, - 958 - ], - [ - 427, - 958 - ] - ], - "text": "repairs" - }, - { - "bounds": { - "height": 22, - "width": 88, - "x": 513, - "y": 933 - }, - "confidence": 1, - "points": [ - [ - 513, - 933 - ], - [ - 601, - 933 - ], - [ - 601, - 955 - ], - [ - 513, - 955 - ] - ], - "text": "needed," - }, - { - "bounds": { - "height": 25, - "width": 75, - "x": 611, - "y": 933 - }, - "confidence": 1, - "points": [ - [ - 611, - 933 - ], - [ - 686, - 933 - ], - [ - 686, - 958 - ], - [ - 611, - 958 - ] - ], - "text": "quality" - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 694, - "y": 933 - }, - "confidence": 1, - "points": [ - [ - 694, - 933 - ], - [ - 716, - 933 - ], - [ - 716, - 952 - ], - [ - 694, - 952 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 22, - "width": 141, - "x": 722, - "y": 933 - }, - "confidence": 1, - "points": [ - [ - 722, - 933 - ], - [ - 863, - 933 - ], - [ - 863, - 955 - ], - [ - 722, - 955 - ] - ], - "text": "construction," - }, - { - "bounds": { - "height": 19, - "width": 108, - "x": 872, - "y": 933 - }, - "confidence": 1, - "points": [ - [ - 872, - 933 - ], - [ - 980, - 933 - ], - [ - 980, - 952 - ], - [ - 872, - 952 - ] - ], - "text": "additional" - }, - { - "bounds": { - "height": 22, - "width": 97, - "x": 988, - "y": 933 - }, - "confidence": 1, - "points": [ - [ - 988, - 933 - ], - [ - 1085, - 933 - ], - [ - 1085, - 955 - ], - [ - 988, - 955 - ] - ], - "text": "features," - }, - { - "bounds": { - "height": 19, - "width": 158, - "x": 1094, - "y": 933 - }, - "confidence": 1, - "points": [ - [ - 1094, - 933 - ], - [ - 1252, - 933 - ], - [ - 1252, - 952 - ], - [ - 1094, - 952 - ] - ], - "text": "modernization" - }, - { - "bounds": { - "height": 19, - "width": 47, - "x": 1261, - "y": 933 - }, - "confidence": 1, - "points": [ - [ - 1261, - 933 - ], - [ - 1308, - 933 - ], - [ - 1308, - 952 - ], - [ - 1261, - 952 - ] - ], - "text": "etc.:" - } - ] + "type": "paragraph" }, { "bounds": { @@ -34191,8 +9333,9 @@ "x": 73.402336, "y": 960.24677 }, + "cells": null, "confidence": 0.7066795, - "id": "2142d68a-4ada-44c5-962a-117aff2bea2e", + "id": "896fe0ce-da89-4cba-8e5f-b9c6a5753f67", "page": { "height": 2200, "pageIndex": 1, @@ -34220,653 +9363,7 @@ "readingOrder": 85, "role": "Text", "text": "is in good overall condition with no material repairs needed. Kitchens and baths were updated approximately 8 years ago. Construction quality is Property_______________________________________________________________________________________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 13, - "x": 169, - "y": 961 - }, - "confidence": 1, - "points": [ - [ - 169, - 961 - ], - [ - 182, - 961 - ], - [ - 182, - 983 - ], - [ - 169, - 983 - ] - ], - "text": "is" - }, - { - "bounds": { - "height": 22, - "width": 16, - "x": 191, - "y": 961 - }, - "confidence": 1, - "points": [ - [ - 191, - 961 - ], - [ - 207, - 961 - ], - [ - 207, - 983 - ], - [ - 191, - 983 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 27, - "width": 52, - "x": 213, - "y": 961 - }, - "confidence": 1, - "points": [ - [ - 213, - 961 - ], - [ - 265, - 961 - ], - [ - 265, - 988 - ], - [ - 213, - 988 - ] - ], - "text": "good" - }, - { - "bounds": { - "height": 22, - "width": 66, - "x": 272, - "y": 961 - }, - "confidence": 1, - "points": [ - [ - 272, - 961 - ], - [ - 338, - 961 - ], - [ - 338, - 983 - ], - [ - 272, - 983 - ] - ], - "text": "overall" - }, - { - "bounds": { - "height": 22, - "width": 91, - "x": 347, - "y": 961 - }, - "confidence": 1, - "points": [ - [ - 347, - 961 - ], - [ - 438, - 961 - ], - [ - 438, - 983 - ], - [ - 347, - 983 - ] - ], - "text": "condition" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 444, - "y": 961 - }, - "confidence": 1, - "points": [ - [ - 444, - 961 - ], - [ - 485, - 961 - ], - [ - 485, - 983 - ], - [ - 444, - 983 - ] - ], - "text": "with" - }, - { - "bounds": { - "height": 16, - "width": 25, - "x": 491, - "y": 966 - }, - "confidence": 1, - "points": [ - [ - 491, - 966 - ], - [ - 516, - 966 - ], - [ - 516, - 982 - ], - [ - 491, - 982 - ] - ], - "text": "no" - }, - { - "bounds": { - "height": 22, - "width": 80, - "x": 525, - "y": 961 - }, - "confidence": 1, - "points": [ - [ - 525, - 961 - ], - [ - 605, - 961 - ], - [ - 605, - 983 - ], - [ - 525, - 983 - ] - ], - "text": "material" - }, - { - "bounds": { - "height": 27, - "width": 69, - "x": 611, - "y": 961 - }, - "confidence": 1, - "points": [ - [ - 611, - 961 - ], - [ - 680, - 961 - ], - [ - 680, - 988 - ], - [ - 611, - 988 - ] - ], - "text": "repairs" - }, - { - "bounds": { - "height": 22, - "width": 80, - "x": 688, - "y": 961 - }, - "confidence": 1, - "points": [ - [ - 688, - 961 - ], - [ - 768, - 961 - ], - [ - 768, - 983 - ], - [ - 688, - 983 - ] - ], - "text": "needed." - }, - { - "bounds": { - "height": 22, - "width": 86, - "x": 777, - "y": 961 - }, - "confidence": 1, - "points": [ - [ - 777, - 961 - ], - [ - 863, - 961 - ], - [ - 863, - 983 - ], - [ - 777, - 983 - ] - ], - "text": "Kitchens" - }, - { - "bounds": { - "height": 22, - "width": 38, - "x": 869, - "y": 961 - }, - "confidence": 1, - "points": [ - [ - 869, - 961 - ], - [ - 907, - 961 - ], - [ - 907, - 983 - ], - [ - 869, - 983 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 22, - "width": 55, - "x": 916, - "y": 961 - }, - "confidence": 1, - "points": [ - [ - 916, - 961 - ], - [ - 971, - 961 - ], - [ - 971, - 983 - ], - [ - 916, - 983 - ] - ], - "text": "baths" - }, - { - "bounds": { - "height": 16, - "width": 50, - "x": 977, - "y": 966 - }, - "confidence": 1, - "points": [ - [ - 977, - 966 - ], - [ - 1027, - 966 - ], - [ - 1027, - 982 - ], - [ - 977, - 982 - ] - ], - "text": "were" - }, - { - "bounds": { - "height": 27, - "width": 83, - "x": 1033, - "y": 961 - }, - "confidence": 1, - "points": [ - [ - 1033, - 961 - ], - [ - 1116, - 961 - ], - [ - 1116, - 988 - ], - [ - 1033, - 988 - ] - ], - "text": "updated" - }, - { - "bounds": { - "height": 27, - "width": 144, - "x": 1122, - "y": 961 - }, - "confidence": 1, - "points": [ - [ - 1122, - 961 - ], - [ - 1266, - 961 - ], - [ - 1266, - 988 - ], - [ - 1122, - 988 - ] - ], - "text": "approximately" - }, - { - "bounds": { - "height": 19, - "width": 13, - "x": 1272, - "y": 963 - }, - "confidence": 1, - "points": [ - [ - 1272, - 963 - ], - [ - 1285, - 963 - ], - [ - 1285, - 982 - ], - [ - 1272, - 982 - ] - ], - "text": "8" - }, - { - "bounds": { - "height": 22, - "width": 58, - "x": 1288, - "y": 966 - }, - "confidence": 1, - "points": [ - [ - 1288, - 966 - ], - [ - 1346, - 966 - ], - [ - 1346, - 988 - ], - [ - 1288, - 988 - ] - ], - "text": "years" - }, - { - "bounds": { - "height": 22, - "width": 44, - "x": 1352, - "y": 966 - }, - "confidence": 1, - "points": [ - [ - 1352, - 966 - ], - [ - 1396, - 966 - ], - [ - 1396, - 988 - ], - [ - 1352, - 988 - ] - ], - "text": "ago." - }, - { - "bounds": { - "height": 22, - "width": 127, - "x": 1405, - "y": 961 - }, - "confidence": 1, - "points": [ - [ - 1405, - 961 - ], - [ - 1532, - 961 - ], - [ - 1532, - 983 - ], - [ - 1405, - 983 - ] - ], - "text": "Construction" - }, - { - "bounds": { - "height": 27, - "width": 69, - "x": 1538, - "y": 961 - }, - "confidence": 1, - "points": [ - [ - 1538, - 961 - ], - [ - 1607, - 961 - ], - [ - 1607, - 988 - ], - [ - 1538, - 988 - ] - ], - "text": "quality" - }, - { - "bounds": { - "height": 22, - "width": 13, - "x": 1613, - "y": 961 - }, - "confidence": 1, - "points": [ - [ - 1613, - 961 - ], - [ - 1626, - 961 - ], - [ - 1626, - 983 - ], - [ - 1613, - 983 - ] - ], - "text": "is" - }, - { - "bounds": { - "height": 25, - "width": 1547, - "x": 75, - "y": 963 - }, - "confidence": 1, - "points": [ - [ - 75, - 963 - ], - [ - 1622, - 963 - ], - [ - 1622, - 988 - ], - [ - 75, - 988 - ] - ], - "text": "Property_______________________________________________________________________________________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -34875,8 +9372,9 @@ "x": 74.960045, "y": 1018.624 }, + "cells": null, "confidence": 0.7196805, - "id": "f8cad5f8-3a82-4ebd-b0b6-460ed5457a04", + "id": "99769029-1a0e-4eee-bbea-4152d298ec69", "page": { "height": 2200, "pageIndex": 1, @@ -34904,429 +9402,7 @@ "readingOrder": 86, "role": "Text", "text": "physical depreciation consistent with effective age of 20 years; no functional Normal_______________________________________________________________________________________________________________ external obsolescence noted.", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 83, - "x": 155, - "y": 1019 - }, - "confidence": 1, - "points": [ - [ - 155, - 1019 - ], - [ - 238, - 1019 - ], - [ - 238, - 1046 - ], - [ - 155, - 1046 - ] - ], - "text": "physical" - }, - { - "bounds": { - "height": 27, - "width": 124, - "x": 244, - "y": 1019 - }, - "confidence": 1, - "points": [ - [ - 244, - 1019 - ], - [ - 368, - 1019 - ], - [ - 368, - 1046 - ], - [ - 244, - 1046 - ] - ], - "text": "depreciation" - }, - { - "bounds": { - "height": 22, - "width": 105, - "x": 375, - "y": 1019 - }, - "confidence": 1, - "points": [ - [ - 375, - 1019 - ], - [ - 480, - 1019 - ], - [ - 480, - 1041 - ], - [ - 375, - 1041 - ] - ], - "text": "consistent" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 483, - "y": 1019 - }, - "confidence": 1, - "points": [ - [ - 483, - 1019 - ], - [ - 524, - 1019 - ], - [ - 524, - 1041 - ], - [ - 483, - 1041 - ] - ], - "text": "with" - }, - { - "bounds": { - "height": 22, - "width": 83, - "x": 533, - "y": 1019 - }, - "confidence": 1, - "points": [ - [ - 533, - 1019 - ], - [ - 616, - 1019 - ], - [ - 616, - 1041 - ], - [ - 533, - 1041 - ] - ], - "text": "effective" - }, - { - "bounds": { - "height": 22, - "width": 38, - "x": 622, - "y": 1025 - }, - "confidence": 1, - "points": [ - [ - 622, - 1025 - ], - [ - 660, - 1025 - ], - [ - 660, - 1047 - ], - [ - 622, - 1047 - ] - ], - "text": "age" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 669, - "y": 1019 - }, - "confidence": 1, - "points": [ - [ - 669, - 1019 - ], - [ - 691, - 1019 - ], - [ - 691, - 1041 - ], - [ - 669, - 1041 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 19, - "width": 25, - "x": 694, - "y": 1022 - }, - "confidence": 1, - "points": [ - [ - 694, - 1022 - ], - [ - 719, - 1022 - ], - [ - 719, - 1041 - ], - [ - 694, - 1041 - ] - ], - "text": "20" - }, - { - "bounds": { - "height": 22, - "width": 63, - "x": 725, - "y": 1025 - }, - "confidence": 1, - "points": [ - [ - 725, - 1025 - ], - [ - 788, - 1025 - ], - [ - 788, - 1047 - ], - [ - 725, - 1047 - ] - ], - "text": "years;" - }, - { - "bounds": { - "height": 16, - "width": 25, - "x": 794, - "y": 1025 - }, - "confidence": 1, - "points": [ - [ - 794, - 1025 - ], - [ - 819, - 1025 - ], - [ - 819, - 1041 - ], - [ - 794, - 1041 - ] - ], - "text": "no" - }, - { - "bounds": { - "height": 22, - "width": 100, - "x": 824, - "y": 1019 - }, - "confidence": 1, - "points": [ - [ - 824, - 1019 - ], - [ - 924, - 1019 - ], - [ - 924, - 1041 - ], - [ - 824, - 1041 - ] - ], - "text": "functional" - }, - { - "bounds": { - "height": 27, - "width": 1547, - "x": 75, - "y": 1019 - }, - "confidence": 1, - "points": [ - [ - 75, - 1019 - ], - [ - 1622, - 1019 - ], - [ - 1622, - 1046 - ], - [ - 75, - 1046 - ] - ], - "text": "Normal_______________________________________________________________________________________________________________" - }, - { - "bounds": { - "height": 22, - "width": 80, - "x": 958, - "y": 1019 - }, - "confidence": 1, - "points": [ - [ - 958, - 1019 - ], - [ - 1038, - 1019 - ], - [ - 1038, - 1041 - ], - [ - 958, - 1041 - ] - ], - "text": "external" - }, - { - "bounds": { - "height": 22, - "width": 141, - "x": 1044, - "y": 1019 - }, - "confidence": 1, - "points": [ - [ - 1044, - 1019 - ], - [ - 1185, - 1019 - ], - [ - 1185, - 1041 - ], - [ - 1044, - 1041 - ] - ], - "text": "obsolescence" - }, - { - "bounds": { - "height": 22, - "width": 63, - "x": 1191, - "y": 1019 - }, - "confidence": 1, - "points": [ - [ - 1191, - 1019 - ], - [ - 1254, - 1019 - ], - [ - 1254, - 1041 - ], - [ - 1191, - 1041 - ] - ], - "text": "noted." - } - ] + "type": "paragraph" }, { "bounds": { @@ -35335,8 +9411,9 @@ "x": 69, "y": 1083 }, + "cells": null, "confidence": 0.5099021, - "id": "f095e871-9f98-4cfd-bc56-23315fa8c6e1", + "id": "ba2fb544-2cd2-4538-82f1-37c571744165", "page": { "height": 2200, "pageIndex": 1, @@ -35364,317 +9441,7 @@ "readingOrder": 87, "role": "Text", "text": "Depreciation (physical, functional, and external inadequacies, etc.):\nknown or observed. None_______________________________________________________________________________________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 138, - "x": 69, - "y": 1083 - }, - "confidence": 1, - "points": [ - [ - 69, - 1083 - ], - [ - 207, - 1083 - ], - [ - 207, - 1110 - ], - [ - 69, - 1110 - ] - ], - "text": "Depreciation" - }, - { - "bounds": { - "height": 27, - "width": 102, - "x": 219, - "y": 1083 - }, - "confidence": 1, - "points": [ - [ - 219, - 1083 - ], - [ - 321, - 1083 - ], - [ - 321, - 1110 - ], - [ - 219, - 1110 - ] - ], - "text": "(physical," - }, - { - "bounds": { - "height": 25, - "width": 113, - "x": 333, - "y": 1083 - }, - "confidence": 1, - "points": [ - [ - 333, - 1083 - ], - [ - 446, - 1083 - ], - [ - 446, - 1108 - ], - [ - 333, - 1108 - ] - ], - "text": "functional," - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 458, - "y": 1083 - }, - "confidence": 1, - "points": [ - [ - 458, - 1083 - ], - [ - 499, - 1083 - ], - [ - 499, - 1105 - ], - [ - 458, - 1105 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 22, - "width": 88, - "x": 508, - "y": 1083 - }, - "confidence": 1, - "points": [ - [ - 508, - 1083 - ], - [ - 596, - 1083 - ], - [ - 596, - 1105 - ], - [ - 508, - 1105 - ] - ], - "text": "external" - }, - { - "bounds": { - "height": 27, - "width": 152, - "x": 608, - "y": 1083 - }, - "confidence": 1, - "points": [ - [ - 608, - 1083 - ], - [ - 760, - 1083 - ], - [ - 760, - 1110 - ], - [ - 608, - 1110 - ] - ], - "text": "inadequacies," - }, - { - "bounds": { - "height": 27, - "width": 55, - "x": 772, - "y": 1083 - }, - "confidence": 1, - "points": [ - [ - 772, - 1083 - ], - [ - 827, - 1083 - ], - [ - 827, - 1110 - ], - [ - 772, - 1110 - ] - ], - "text": "etc.):" - }, - { - "bounds": { - "height": 22, - "width": 66, - "x": 133, - "y": 1116 - }, - "confidence": 1, - "points": [ - [ - 133, - 1116 - ], - [ - 199, - 1116 - ], - [ - 199, - 1138 - ], - [ - 133, - 1138 - ] - ], - "text": "known" - }, - { - "bounds": { - "height": 16, - "width": 22, - "x": 205, - "y": 1122 - }, - "confidence": 1, - "points": [ - [ - 205, - 1122 - ], - [ - 227, - 1122 - ], - [ - 227, - 1138 - ], - [ - 205, - 1138 - ] - ], - "text": "or" - }, - { - "bounds": { - "height": 22, - "width": 100, - "x": 233, - "y": 1116 - }, - "confidence": 1, - "points": [ - [ - 233, - 1116 - ], - [ - 333, - 1116 - ], - [ - 333, - 1138 - ], - [ - 233, - 1138 - ] - ], - "text": "observed." - }, - { - "bounds": { - "height": 22, - "width": 1550, - "x": 72, - "y": 1119 - }, - "confidence": 1, - "points": [ - [ - 72, - 1119 - ], - [ - 1622, - 1119 - ], - [ - 1622, - 1141 - ], - [ - 72, - 1141 - ] - ], - "text": "None_______________________________________________________________________________________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -35683,8 +9450,9 @@ "x": 66, "y": 1236 }, + "cells": null, "confidence": 0.83770245, - "id": "545049b2-b26d-4ffa-aa78-a8cca9c5208e", + "id": "0a24efae-30ed-4d4c-b9fa-43fdce9a4bdb", "page": { "height": 2200, "pageIndex": 1, @@ -35712,821 +9480,7 @@ "readingOrder": 88, "role": "Text", "text": "Adverse environmental conditions (such as, but not limited to, hazardous wastes, toxic substances, etc.) present in the improvements on site,\nor in the immediate vicinity of the subject property:", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 94, - "x": 66, - "y": 1236 - }, - "confidence": 1, - "points": [ - [ - 66, - 1236 - ], - [ - 160, - 1236 - ], - [ - 160, - 1258 - ], - [ - 66, - 1258 - ] - ], - "text": "Adverse" - }, - { - "bounds": { - "height": 22, - "width": 158, - "x": 166, - "y": 1236 - }, - "confidence": 1, - "points": [ - [ - 166, - 1236 - ], - [ - 324, - 1236 - ], - [ - 324, - 1258 - ], - [ - 166, - 1258 - ] - ], - "text": "environmental" - }, - { - "bounds": { - "height": 22, - "width": 113, - "x": 333, - "y": 1236 - }, - "confidence": 1, - "points": [ - [ - 333, - 1236 - ], - [ - 446, - 1236 - ], - [ - 446, - 1258 - ], - [ - 333, - 1258 - ] - ], - "text": "conditions" - }, - { - "bounds": { - "height": 27, - "width": 61, - "x": 452, - "y": 1236 - }, - "confidence": 1, - "points": [ - [ - 452, - 1236 - ], - [ - 513, - 1236 - ], - [ - 513, - 1263 - ], - [ - 452, - 1263 - ] - ], - "text": "(such" - }, - { - "bounds": { - "height": 19, - "width": 33, - "x": 522, - "y": 1241 - }, - "confidence": 1, - "points": [ - [ - 522, - 1241 - ], - [ - 555, - 1241 - ], - [ - 555, - 1260 - ], - [ - 522, - 1260 - ] - ], - "text": "as," - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 563, - "y": 1236 - }, - "confidence": 1, - "points": [ - [ - 563, - 1236 - ], - [ - 599, - 1236 - ], - [ - 599, - 1258 - ], - [ - 563, - 1258 - ] - ], - "text": "but" - }, - { - "bounds": { - "height": 19, - "width": 33, - "x": 608, - "y": 1238 - }, - "confidence": 1, - "points": [ - [ - 608, - 1238 - ], - [ - 641, - 1238 - ], - [ - 641, - 1257 - ], - [ - 608, - 1257 - ] - ], - "text": "not" - }, - { - "bounds": { - "height": 22, - "width": 72, - "x": 650, - "y": 1236 - }, - "confidence": 1, - "points": [ - [ - 650, - 1236 - ], - [ - 722, - 1236 - ], - [ - 722, - 1258 - ], - [ - 650, - 1258 - ] - ], - "text": "limited" - }, - { - "bounds": { - "height": 22, - "width": 27, - "x": 727, - "y": 1238 - }, - "confidence": 1, - "points": [ - [ - 727, - 1238 - ], - [ - 754, - 1238 - ], - [ - 754, - 1260 - ], - [ - 727, - 1260 - ] - ], - "text": "to," - }, - { - "bounds": { - "height": 22, - "width": 116, - "x": 766, - "y": 1236 - }, - "confidence": 1, - "points": [ - [ - 766, - 1236 - ], - [ - 882, - 1236 - ], - [ - 882, - 1258 - ], - [ - 766, - 1258 - ] - ], - "text": "hazardous" - }, - { - "bounds": { - "height": 22, - "width": 86, - "x": 888, - "y": 1238 - }, - "confidence": 1, - "points": [ - [ - 888, - 1238 - ], - [ - 974, - 1238 - ], - [ - 974, - 1260 - ], - [ - 888, - 1260 - ] - ], - "text": "wastes," - }, - { - "bounds": { - "height": 22, - "width": 55, - "x": 980, - "y": 1236 - }, - "confidence": 1, - "points": [ - [ - 980, - 1236 - ], - [ - 1035, - 1236 - ], - [ - 1035, - 1258 - ], - [ - 980, - 1258 - ] - ], - "text": "toxic" - }, - { - "bounds": { - "height": 25, - "width": 133, - "x": 1041, - "y": 1236 - }, - "confidence": 1, - "points": [ - [ - 1041, - 1236 - ], - [ - 1174, - 1236 - ], - [ - 1174, - 1261 - ], - [ - 1041, - 1261 - ] - ], - "text": "substances," - }, - { - "bounds": { - "height": 27, - "width": 47, - "x": 1183, - "y": 1236 - }, - "confidence": 1, - "points": [ - [ - 1183, - 1236 - ], - [ - 1230, - 1236 - ], - [ - 1230, - 1263 - ], - [ - 1183, - 1263 - ] - ], - "text": "etc.)" - }, - { - "bounds": { - "height": 25, - "width": 86, - "x": 1238, - "y": 1238 - }, - "confidence": 1, - "points": [ - [ - 1238, - 1238 - ], - [ - 1324, - 1238 - ], - [ - 1324, - 1263 - ], - [ - 1238, - 1263 - ] - ], - "text": "present" - }, - { - "bounds": { - "height": 22, - "width": 19, - "x": 1330, - "y": 1236 - }, - "confidence": 1, - "points": [ - [ - 1330, - 1236 - ], - [ - 1349, - 1236 - ], - [ - 1349, - 1258 - ], - [ - 1330, - 1258 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1358, - "y": 1236 - }, - "confidence": 1, - "points": [ - [ - 1358, - 1236 - ], - [ - 1394, - 1236 - ], - [ - 1394, - 1258 - ], - [ - 1358, - 1258 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 155, - "x": 1402, - "y": 1236 - }, - "confidence": 1, - "points": [ - [ - 1402, - 1236 - ], - [ - 1557, - 1236 - ], - [ - 1557, - 1263 - ], - [ - 1402, - 1263 - ] - ], - "text": "improvements" - }, - { - "bounds": { - "height": 16, - "width": 27, - "x": 1566, - "y": 1241 - }, - "confidence": 1, - "points": [ - [ - 1566, - 1241 - ], - [ - 1593, - 1241 - ], - [ - 1593, - 1257 - ], - [ - 1566, - 1257 - ] - ], - "text": "on" - }, - { - "bounds": { - "height": 25, - "width": 47, - "x": 1600, - "y": 1236 - }, - "confidence": 1, - "points": [ - [ - 1600, - 1236 - ], - [ - 1647, - 1236 - ], - [ - 1647, - 1261 - ], - [ - 1600, - 1261 - ] - ], - "text": "site," - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 69, - "y": 1272 - }, - "confidence": 1, - "points": [ - [ - 69, - 1272 - ], - [ - 91, - 1272 - ], - [ - 91, - 1291 - ], - [ - 69, - 1291 - ] - ], - "text": "or" - }, - { - "bounds": { - "height": 19, - "width": 16, - "x": 100, - "y": 1269 - }, - "confidence": 1, - "points": [ - [ - 100, - 1269 - ], - [ - 116, - 1269 - ], - [ - 116, - 1288 - ], - [ - 100, - 1288 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 124, - "y": 1269 - }, - "confidence": 1, - "points": [ - [ - 124, - 1269 - ], - [ - 160, - 1269 - ], - [ - 160, - 1291 - ], - [ - 124, - 1291 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 113, - "x": 169, - "y": 1269 - }, - "confidence": 1, - "points": [ - [ - 169, - 1269 - ], - [ - 282, - 1269 - ], - [ - 282, - 1291 - ], - [ - 169, - 1291 - ] - ], - "text": "immediate" - }, - { - "bounds": { - "height": 25, - "width": 75, - "x": 291, - "y": 1269 - }, - "confidence": 1, - "points": [ - [ - 291, - 1269 - ], - [ - 366, - 1269 - ], - [ - 366, - 1294 - ], - [ - 291, - 1294 - ] - ], - "text": "vicinity" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 375, - "y": 1269 - }, - "confidence": 1, - "points": [ - [ - 375, - 1269 - ], - [ - 397, - 1269 - ], - [ - 397, - 1291 - ], - [ - 375, - 1291 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 402, - "y": 1269 - }, - "confidence": 1, - "points": [ - [ - 402, - 1269 - ], - [ - 438, - 1269 - ], - [ - 438, - 1291 - ], - [ - 402, - 1291 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 25, - "width": 80, - "x": 444, - "y": 1269 - }, - "confidence": 1, - "points": [ - [ - 444, - 1269 - ], - [ - 524, - 1269 - ], - [ - 524, - 1294 - ], - [ - 444, - 1294 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 25, - "width": 97, - "x": 533, - "y": 1269 - }, - "confidence": 1, - "points": [ - [ - 533, - 1269 - ], - [ - 630, - 1269 - ], - [ - 630, - 1294 - ], - [ - 533, - 1294 - ] - ], - "text": "property:" - } - ] + "type": "paragraph" }, { "bounds": { @@ -36535,8 +9489,9 @@ "x": 716, "y": 1447.0763 }, + "cells": null, "confidence": 0.70910245, - "id": "db56e4ec-4ea6-4cab-93ec-cf64d9778cca", + "id": "e328d8aa-f825-46e0-ac88-70e55ae30565", "page": { "height": 2200, "pageIndex": 1, @@ -36564,65 +9519,7 @@ "readingOrder": 89, "role": "SectionHeader", "text": "VALUATION ANALYSIS", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 136, - "x": 716, - "y": 1450 - }, - "confidence": 1, - "points": [ - [ - 716, - 1450 - ], - [ - 852, - 1450 - ], - [ - 852, - 1469 - ], - [ - 716, - 1469 - ] - ], - "text": "VALUATION" - }, - { - "bounds": { - "height": 19, - "width": 119, - "x": 861, - "y": 1450 - }, - "confidence": 1, - "points": [ - [ - 861, - 1450 - ], - [ - 980, - 1450 - ], - [ - 980, - 1469 - ], - [ - 861, - 1469 - ] - ], - "text": "ANALYSIS" - } - ] + "type": "paragraph" }, { "bounds": { @@ -36631,8 +9528,9 @@ "x": 69, "y": 1477 }, + "cells": null, "confidence": 0.7841986, - "id": "c1c598f3-1db6-43b1-85f0-6163d3cd09a9", + "id": "5e39a0c3-b0bd-4e41-b068-211e9f4041e7", "page": { "height": 2200, "pageIndex": 1, @@ -36660,1073 +9558,7 @@ "readingOrder": 90, "role": "Text", "text": "ESTIMATED SITE VALUE----------------------- $ 65,000______________ Comments on Cost Approach (such as, source of cost estimate, site\nvalue, square foot calculations and, for HUD and VA, the estimated\nremaining economic life on the property): estimate from Marshall & Cost_____________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 138, - "x": 69, - "y": 1477 - }, - "confidence": 1, - "points": [ - [ - 69, - 1477 - ], - [ - 207, - 1477 - ], - [ - 207, - 1499 - ], - [ - 69, - 1499 - ] - ], - "text": "ESTIMATED" - }, - { - "bounds": { - "height": 22, - "width": 55, - "x": 213, - "y": 1477 - }, - "confidence": 1, - "points": [ - [ - 213, - 1477 - ], - [ - 268, - 1477 - ], - [ - 268, - 1499 - ], - [ - 213, - 1499 - ] - ], - "text": "SITE" - }, - { - "bounds": { - "height": 22, - "width": 275, - "x": 275, - "y": 1477 - }, - "confidence": 1, - "points": [ - [ - 275, - 1477 - ], - [ - 550, - 1477 - ], - [ - 550, - 1499 - ], - [ - 275, - 1499 - ] - ], - "text": "VALUE-----------------------" - }, - { - "bounds": { - "height": 25, - "width": 13, - "x": 577, - "y": 1477 - }, - "confidence": 1, - "points": [ - [ - 577, - 1477 - ], - [ - 590, - 1477 - ], - [ - 590, - 1502 - ], - [ - 577, - 1502 - ] - ], - "text": "$" - }, - { - "bounds": { - "height": 25, - "width": 202, - "x": 600, - "y": 1480 - }, - "confidence": 1, - "points": [ - [ - 600, - 1480 - ], - [ - 802, - 1480 - ], - [ - 802, - 1505 - ], - [ - 600, - 1505 - ] - ], - "text": "65,000______________" - }, - { - "bounds": { - "height": 22, - "width": 122, - "x": 852, - "y": 1477 - }, - "confidence": 1, - "points": [ - [ - 852, - 1477 - ], - [ - 974, - 1477 - ], - [ - 974, - 1499 - ], - [ - 852, - 1499 - ] - ], - "text": "Comments" - }, - { - "bounds": { - "height": 16, - "width": 27, - "x": 980, - "y": 1483 - }, - "confidence": 1, - "points": [ - [ - 980, - 1483 - ], - [ - 1007, - 1483 - ], - [ - 1007, - 1499 - ], - [ - 980, - 1499 - ] - ], - "text": "on" - }, - { - "bounds": { - "height": 22, - "width": 52, - "x": 1016, - "y": 1477 - }, - "confidence": 1, - "points": [ - [ - 1016, - 1477 - ], - [ - 1068, - 1477 - ], - [ - 1068, - 1499 - ], - [ - 1016, - 1499 - ] - ], - "text": "Cost" - }, - { - "bounds": { - "height": 27, - "width": 108, - "x": 1075, - "y": 1477 - }, - "confidence": 1, - "points": [ - [ - 1075, - 1477 - ], - [ - 1183, - 1477 - ], - [ - 1183, - 1504 - ], - [ - 1075, - 1504 - ] - ], - "text": "Approach" - }, - { - "bounds": { - "height": 27, - "width": 58, - "x": 1191, - "y": 1477 - }, - "confidence": 1, - "points": [ - [ - 1191, - 1477 - ], - [ - 1249, - 1477 - ], - [ - 1249, - 1504 - ], - [ - 1191, - 1504 - ] - ], - "text": "(such" - }, - { - "bounds": { - "height": 19, - "width": 33, - "x": 1258, - "y": 1483 - }, - "confidence": 1, - "points": [ - [ - 1258, - 1483 - ], - [ - 1291, - 1483 - ], - [ - 1291, - 1502 - ], - [ - 1258, - 1502 - ] - ], - "text": "as," - }, - { - "bounds": { - "height": 16, - "width": 75, - "x": 1300, - "y": 1483 - }, - "confidence": 1, - "points": [ - [ - 1300, - 1483 - ], - [ - 1375, - 1483 - ], - [ - 1375, - 1499 - ], - [ - 1300, - 1499 - ] - ], - "text": "source" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 1380, - "y": 1477 - }, - "confidence": 1, - "points": [ - [ - 1380, - 1477 - ], - [ - 1402, - 1477 - ], - [ - 1402, - 1499 - ], - [ - 1380, - 1499 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 19, - "width": 47, - "x": 1411, - "y": 1480 - }, - "confidence": 1, - "points": [ - [ - 1411, - 1480 - ], - [ - 1458, - 1480 - ], - [ - 1458, - 1499 - ], - [ - 1411, - 1499 - ] - ], - "text": "cost" - }, - { - "bounds": { - "height": 25, - "width": 100, - "x": 1463, - "y": 1477 - }, - "confidence": 1, - "points": [ - [ - 1463, - 1477 - ], - [ - 1563, - 1477 - ], - [ - 1563, - 1502 - ], - [ - 1463, - 1502 - ] - ], - "text": "estimate," - }, - { - "bounds": { - "height": 22, - "width": 38, - "x": 1572, - "y": 1477 - }, - "confidence": 1, - "points": [ - [ - 1572, - 1477 - ], - [ - 1610, - 1477 - ], - [ - 1610, - 1499 - ], - [ - 1572, - 1499 - ] - ], - "text": "site" - }, - { - "bounds": { - "height": 25, - "width": 66, - "x": 852, - "y": 1508 - }, - "confidence": 1, - "points": [ - [ - 852, - 1508 - ], - [ - 918, - 1508 - ], - [ - 918, - 1533 - ], - [ - 852, - 1533 - ] - ], - "text": "value," - }, - { - "bounds": { - "height": 22, - "width": 75, - "x": 927, - "y": 1513 - }, - "confidence": 1, - "points": [ - [ - 927, - 1513 - ], - [ - 1002, - 1513 - ], - [ - 1002, - 1535 - ], - [ - 927, - 1535 - ] - ], - "text": "square" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 1011, - "y": 1508 - }, - "confidence": 1, - "points": [ - [ - 1011, - 1508 - ], - [ - 1052, - 1508 - ], - [ - 1052, - 1530 - ], - [ - 1011, - 1530 - ] - ], - "text": "foot" - }, - { - "bounds": { - "height": 22, - "width": 133, - "x": 1058, - "y": 1508 - }, - "confidence": 1, - "points": [ - [ - 1058, - 1508 - ], - [ - 1191, - 1508 - ], - [ - 1191, - 1530 - ], - [ - 1058, - 1530 - ] - ], - "text": "calculations" - }, - { - "bounds": { - "height": 25, - "width": 47, - "x": 1200, - "y": 1508 - }, - "confidence": 1, - "points": [ - [ - 1200, - 1508 - ], - [ - 1247, - 1508 - ], - [ - 1247, - 1533 - ], - [ - 1200, - 1533 - ] - ], - "text": "and," - }, - { - "bounds": { - "height": 22, - "width": 30, - "x": 1255, - "y": 1508 - }, - "confidence": 1, - "points": [ - [ - 1255, - 1508 - ], - [ - 1285, - 1508 - ], - [ - 1285, - 1530 - ], - [ - 1255, - 1530 - ] - ], - "text": "for" - }, - { - "bounds": { - "height": 22, - "width": 52, - "x": 1294, - "y": 1508 - }, - "confidence": 1, - "points": [ - [ - 1294, - 1508 - ], - [ - 1346, - 1508 - ], - [ - 1346, - 1530 - ], - [ - 1294, - 1530 - ] - ], - "text": "HUD" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 1355, - "y": 1508 - }, - "confidence": 1, - "points": [ - [ - 1355, - 1508 - ], - [ - 1396, - 1508 - ], - [ - 1396, - 1530 - ], - [ - 1355, - 1530 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 25, - "width": 38, - "x": 1402, - "y": 1508 - }, - "confidence": 1, - "points": [ - [ - 1402, - 1508 - ], - [ - 1440, - 1508 - ], - [ - 1440, - 1533 - ], - [ - 1402, - 1533 - ] - ], - "text": "VA," - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1450, - "y": 1508 - }, - "confidence": 1, - "points": [ - [ - 1450, - 1508 - ], - [ - 1486, - 1508 - ], - [ - 1486, - 1530 - ], - [ - 1450, - 1530 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 108, - "x": 1491, - "y": 1508 - }, - "confidence": 1, - "points": [ - [ - 1491, - 1508 - ], - [ - 1599, - 1508 - ], - [ - 1599, - 1530 - ], - [ - 1491, - 1530 - ] - ], - "text": "estimated" - }, - { - "bounds": { - "height": 27, - "width": 111, - "x": 852, - "y": 1538 - }, - "confidence": 1, - "points": [ - [ - 852, - 1538 - ], - [ - 963, - 1538 - ], - [ - 963, - 1565 - ], - [ - 852, - 1565 - ] - ], - "text": "remaining" - }, - { - "bounds": { - "height": 22, - "width": 108, - "x": 972, - "y": 1538 - }, - "confidence": 1, - "points": [ - [ - 972, - 1538 - ], - [ - 1080, - 1538 - ], - [ - 1080, - 1560 - ], - [ - 972, - 1560 - ] - ], - "text": "economic" - }, - { - "bounds": { - "height": 22, - "width": 30, - "x": 1088, - "y": 1538 - }, - "confidence": 1, - "points": [ - [ - 1088, - 1538 - ], - [ - 1118, - 1538 - ], - [ - 1118, - 1560 - ], - [ - 1088, - 1560 - ] - ], - "text": "life" - }, - { - "bounds": { - "height": 16, - "width": 27, - "x": 1127, - "y": 1544 - }, - "confidence": 1, - "points": [ - [ - 1127, - 1544 - ], - [ - 1154, - 1544 - ], - [ - 1154, - 1560 - ], - [ - 1127, - 1560 - ] - ], - "text": "on" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1163, - "y": 1538 - }, - "confidence": 1, - "points": [ - [ - 1163, - 1538 - ], - [ - 1199, - 1538 - ], - [ - 1199, - 1560 - ], - [ - 1163, - 1560 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 108, - "x": 1208, - "y": 1538 - }, - "confidence": 1, - "points": [ - [ - 1208, - 1538 - ], - [ - 1316, - 1538 - ], - [ - 1316, - 1565 - ], - [ - 1208, - 1565 - ] - ], - "text": "property):" - }, - { - "bounds": { - "height": 22, - "width": 86, - "x": 1375, - "y": 1538 - }, - "confidence": 1, - "points": [ - [ - 1375, - 1538 - ], - [ - 1461, - 1538 - ], - [ - 1461, - 1560 - ], - [ - 1375, - 1560 - ] - ], - "text": "estimate" - }, - { - "bounds": { - "height": 22, - "width": 50, - "x": 1466, - "y": 1538 - }, - "confidence": 1, - "points": [ - [ - 1466, - 1538 - ], - [ - 1516, - 1538 - ], - [ - 1516, - 1560 - ], - [ - 1466, - 1560 - ] - ], - "text": "from" - }, - { - "bounds": { - "height": 22, - "width": 86, - "x": 1522, - "y": 1538 - }, - "confidence": 1, - "points": [ - [ - 1522, - 1538 - ], - [ - 1608, - 1538 - ], - [ - 1608, - 1560 - ], - [ - 1522, - 1560 - ] - ], - "text": "Marshall" - }, - { - "bounds": { - "height": 19, - "width": 16, - "x": 1613, - "y": 1541 - }, - "confidence": 1, - "points": [ - [ - 1613, - 1541 - ], - [ - 1629, - 1541 - ], - [ - 1629, - 1560 - ], - [ - 1613, - 1560 - ] - ], - "text": "&" - }, - { - "bounds": { - "height": 22, - "width": 300, - "x": 1322, - "y": 1541 - }, - "confidence": 1, - "points": [ - [ - 1322, - 1541 - ], - [ - 1622, - 1541 - ], - [ - 1622, - 1563 - ], - [ - 1322, - 1563 - ] - ], - "text": "Cost_____________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -37735,8 +9567,9 @@ "x": 1337.9357, "y": 688.0288 }, + "cells": null, "confidence": 0.5950759, - "id": "3a260418-c144-4a82-a63f-db995ffc1bd1", + "id": "1321baa9-bfb4-4d2f-aad5-5004fd72452f", "page": { "height": 2200, "pageIndex": 1, @@ -37773,8 +9606,9 @@ "x": 1337.7356, "y": 718.4492 }, + "cells": null, "confidence": 0.54840034, - "id": "6271c0eb-f226-46a4-a503-772f33a6010f", + "id": "8fdefd5e-7004-40a0-a7ee-677778c227bb", "page": { "height": 2200, "pageIndex": 1, @@ -37811,8 +9645,9 @@ "x": 197, "y": 746.1893 }, + "cells": null, "confidence": 0.47247168, - "id": "74e4bd1b-37e7-4c37-b0e5-2ba0e6012a8a", + "id": "9c98c2cd-234f-4402-9d09-38d2212931a6", "page": { "height": 2200, "pageIndex": 1, @@ -37840,317 +9675,7 @@ "readingOrder": 93, "role": "CheckboxSelected", "text": "Tile Ceramic__________________ Air Central_________________ Yes Dishwasher_________________ ❐ Scuttle Detached 4 ❐", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 16, - "width": 30, - "x": 272, - "y": 750 - }, - "confidence": 1, - "points": [ - [ - 272, - 750 - ], - [ - 302, - 750 - ], - [ - 302, - 766 - ], - [ - 272, - 766 - ] - ], - "text": "Tile" - }, - { - "bounds": { - "height": 25, - "width": 258, - "x": 197, - "y": 750 - }, - "confidence": 1, - "points": [ - [ - 197, - 750 - ], - [ - 455, - 750 - ], - [ - 455, - 775 - ], - [ - 197, - 775 - ] - ], - "text": "Ceramic__________________" - }, - { - "bounds": { - "height": 22, - "width": 33, - "x": 555, - "y": 750 - }, - "confidence": 1, - "points": [ - [ - 555, - 750 - ], - [ - 588, - 750 - ], - [ - 588, - 772 - ], - [ - 555, - 772 - ] - ], - "text": "Air" - }, - { - "bounds": { - "height": 25, - "width": 241, - "x": 477, - "y": 750 - }, - "confidence": 1, - "points": [ - [ - 477, - 750 - ], - [ - 718, - 750 - ], - [ - 718, - 775 - ], - [ - 477, - 775 - ] - ], - "text": "Central_________________" - }, - { - "bounds": { - "height": 19, - "width": 38, - "x": 883, - "y": 752 - }, - "confidence": 1, - "points": [ - [ - 883, - 752 - ], - [ - 921, - 752 - ], - [ - 921, - 771 - ], - [ - 883, - 771 - ] - ], - "text": "Yes" - }, - { - "bounds": { - "height": 25, - "width": 377, - "x": 744, - "y": 750 - }, - "confidence": 1, - "points": [ - [ - 744, - 750 - ], - [ - 1121, - 750 - ], - [ - 1121, - 775 - ], - [ - 744, - 775 - ] - ], - "text": "Dishwasher_________________" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1150, - "y": 750 - }, - "confidence": 1, - "points": [ - [ - 1150, - 750 - ], - [ - 1169, - 750 - ], - [ - 1169, - 769 - ], - [ - 1150, - 769 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 77, - "x": 1175, - "y": 750 - }, - "confidence": 1, - "points": [ - [ - 1175, - 750 - ], - [ - 1252, - 750 - ], - [ - 1252, - 769 - ], - [ - 1175, - 769 - ] - ], - "text": "Scuttle" - }, - { - "bounds": { - "height": 19, - "width": 108, - "x": 1338, - "y": 750 - }, - "confidence": 1, - "points": [ - [ - 1338, - 750 - ], - [ - 1446, - 750 - ], - [ - 1446, - 769 - ], - [ - 1338, - 769 - ] - ], - "text": "Detached" - }, - { - "bounds": { - "height": 13, - "width": 11, - "x": 1522, - "y": 750 - }, - "confidence": 1, - "points": [ - [ - 1522, - 750 - ], - [ - 1533, - 750 - ], - [ - 1533, - 763 - ], - [ - 1522, - 763 - ] - ], - "text": "4" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1519, - "y": 750 - }, - "confidence": 1, - "points": [ - [ - 1519, - 750 - ], - [ - 1538, - 750 - ], - [ - 1538, - 769 - ], - [ - 1519, - 769 - ] - ], - "text": "❐" - } - ] + "type": "paragraph" }, { "bounds": { @@ -38159,8 +9684,9 @@ "x": 1337.9039, "y": 776.36646 }, + "cells": null, "confidence": 0.5455386, - "id": "b28c9240-ae3f-4210-9283-fe1649c14017", + "id": "d47f54d1-717d-4c0b-9e83-adee8855a14b", "page": { "height": 2200, "pageIndex": 1, @@ -38197,8 +9723,9 @@ "x": 1338.3245, "y": 809.92004 }, + "cells": null, "confidence": 0.6586281, - "id": "1d4af36c-e84c-43bd-bf21-442beacecd16", + "id": "ecddb0ca-a1f8-4dfb-bcc4-eba175cff90d", "page": { "height": 2200, "pageIndex": 1, @@ -38235,8 +9762,9 @@ "x": 1338.0477, "y": 838.13544 }, + "cells": null, "confidence": 0.6906795, - "id": "8ad47e66-931a-457c-a5b7-ab5d6d5470c7", + "id": "2740e498-144e-422f-afe1-06bf113bdfdc", "page": { "height": 2200, "pageIndex": 1, @@ -38273,8 +9801,9 @@ "x": 1337.3383, "y": 868.34875 }, + "cells": null, "confidence": 0.7071753, - "id": "c3a13625-6ee2-4d59-8494-d0d7016e2d8b", + "id": "54cdd028-7f0b-4a6a-8127-d8bfc0d13e27", "page": { "height": 2200, "pageIndex": 1, @@ -38311,8 +9840,9 @@ "x": 34.627262, "y": 1105.5693 }, + "cells": null, "confidence": 0.69792396, - "id": "4afac2d7-58a9-4c33-ad7e-5a18efea570d", + "id": "ee5f3840-f88f-43cc-8b64-c5417f7b88c3", "page": { "height": 2200, "pageIndex": 1, @@ -38349,8 +9879,9 @@ "x": 36.084408, "y": 1676.0568 }, + "cells": null, "confidence": 0.66890794, - "id": "a8d074eb-aefd-4bfc-93fb-b1cfbc515d1b", + "id": "09458f6c-6697-476d-94ab-4cdd3625423e", "page": { "height": 2200, "pageIndex": 1, @@ -38387,8 +9918,9 @@ "x": 68.89732, "y": 1477.4384 }, + "cells": null, "confidence": 0.56334955, - "id": "0eb9e052-1b01-4afa-8d8a-11e1acf0283b", + "id": "264befcf-65e4-414d-b24f-b7ff91867ece", "page": { "height": 2200, "pageIndex": 1, @@ -38425,8 +9957,9 @@ "x": 575.5457, "y": 1477.5085 }, + "cells": null, "confidence": 0.5193186, - "id": "0d6248dd-d385-40b2-9a9c-503df199729a", + "id": "7ecf2730-f023-40a7-8a2e-7889095f8f46", "page": { "height": 2200, "pageIndex": 1, @@ -38463,8 +9996,9 @@ "x": 68.73636, "y": 1507.6403 }, + "cells": null, "confidence": 0.62185246, - "id": "9180d0cd-e317-4561-8b81-77e7f0fc4976", + "id": "d3cd9ddb-fab8-49af-8694-a9f0c353375c", "page": { "height": 2200, "pageIndex": 1, @@ -38492,149 +10026,7 @@ "readingOrder": 102, "role": "Text", "text": "ESTIMATED REPRODUCTION COST-NEW OF IMPROVEMENTS:", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 138, - "x": 69, - "y": 1508 - }, - "confidence": 1, - "points": [ - [ - 69, - 1508 - ], - [ - 207, - 1508 - ], - [ - 207, - 1530 - ], - [ - 69, - 1530 - ] - ], - "text": "ESTIMATED" - }, - { - "bounds": { - "height": 22, - "width": 202, - "x": 213, - "y": 1508 - }, - "confidence": 1, - "points": [ - [ - 213, - 1508 - ], - [ - 415, - 1508 - ], - [ - 415, - 1530 - ], - [ - 213, - 1530 - ] - ], - "text": "REPRODUCTION" - }, - { - "bounds": { - "height": 22, - "width": 133, - "x": 422, - "y": 1508 - }, - "confidence": 1, - "points": [ - [ - 422, - 1508 - ], - [ - 555, - 1508 - ], - [ - 555, - 1530 - ], - [ - 422, - 1530 - ] - ], - "text": "COST-NEW" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 558, - "y": 1508 - }, - "confidence": 1, - "points": [ - [ - 558, - 1508 - ], - [ - 594, - 1508 - ], - [ - 594, - 1530 - ], - [ - 558, - 1530 - ] - ], - "text": "OF" - }, - { - "bounds": { - "height": 22, - "width": 205, - "x": 602, - "y": 1508 - }, - "confidence": 1, - "points": [ - [ - 602, - 1508 - ], - [ - 807, - 1508 - ], - [ - 807, - 1530 - ], - [ - 602, - 1530 - ] - ], - "text": "IMPROVEMENTS:" - } - ] + "type": "paragraph" }, { "bounds": { @@ -38643,8 +10035,9 @@ "x": 554.1769, "y": 1537.5325 }, + "cells": null, "confidence": 0.5323956, - "id": "d294bef8-0620-4a66-b87a-6d963f225efd", + "id": "505c7657-1479-46cd-a65b-3d60a06de6ea", "page": { "height": 2200, "pageIndex": 1, @@ -38672,93 +10065,7 @@ "readingOrder": 103, "role": "Text", "text": "= $ 237,500______________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 11, - "width": 16, - "x": 555, - "y": 1547 - }, - "confidence": 1, - "points": [ - [ - 555, - 1547 - ], - [ - 571, - 1547 - ], - [ - 571, - 1558 - ], - [ - 555, - 1558 - ] - ], - "text": "=" - }, - { - "bounds": { - "height": 25, - "width": 13, - "x": 577, - "y": 1538 - }, - "confidence": 1, - "points": [ - [ - 577, - 1538 - ], - [ - 590, - 1538 - ], - [ - 590, - 1563 - ], - [ - 577, - 1563 - ] - ], - "text": "$" - }, - { - "bounds": { - "height": 25, - "width": 202, - "x": 600, - "y": 1538 - }, - "confidence": 1, - "points": [ - [ - 600, - 1538 - ], - [ - 802, - 1538 - ], - [ - 802, - 1563 - ], - [ - 600, - 1563 - ] - ], - "text": "237,500______________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -38767,8 +10074,9 @@ "x": 553.4567, "y": 1570.6565 }, + "cells": null, "confidence": 0.5621577, - "id": "0b3d313c-2e33-41e9-af6d-8afa92ceac91", + "id": "67056fb3-81dd-40eb-b1c3-f6cb4e7ed028", "page": { "height": 2200, "pageIndex": 1, @@ -38805,8 +10113,9 @@ "x": 553.9402, "y": 1628.8927 }, + "cells": null, "confidence": 0.5689577, - "id": "9c856bcb-3a62-48a0-9509-ce09a5582fbe", + "id": "0977d96b-cacb-403d-b588-0c712e1ab71d", "page": { "height": 2200, "pageIndex": 1, @@ -38843,8 +10152,9 @@ "x": 554.675, "y": 1661.1945 }, + "cells": null, "confidence": 0.5389971, - "id": "2bedbc46-fe04-49bc-bc3b-84ab7953e7bb", + "id": "2c1faa71-89c8-4736-b3f8-28ed2fcfe2ab", "page": { "height": 2200, "pageIndex": 1, @@ -38881,8 +10191,9 @@ "x": 555, "y": 1688 }, + "cells": null, "confidence": 0.555646, - "id": "4d052b59-5cb8-4b6c-8fcb-efb09298a242", + "id": "2e145a74-074f-4956-ab45-95ec5ae6cab9", "page": { "height": 2200, "pageIndex": 1, @@ -38910,65 +10221,7 @@ "readingOrder": 107, "role": "Text", "text": "= $", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 11, - "width": 16, - "x": 555, - "y": 1697 - }, - "confidence": 1, - "points": [ - [ - 555, - 1697 - ], - [ - 571, - 1697 - ], - [ - 571, - 1708 - ], - [ - 555, - 1708 - ] - ], - "text": "=" - }, - { - "bounds": { - "height": 25, - "width": 13, - "x": 577, - "y": 1688 - }, - "confidence": 1, - "points": [ - [ - 577, - 1688 - ], - [ - 590, - 1688 - ], - [ - 590, - 1713 - ], - [ - 577, - 1713 - ] - ], - "text": "$" - } - ] + "type": "paragraph" }, { "bounds": { @@ -38977,8 +10230,9 @@ "x": 553.3737, "y": 1777 }, + "cells": null, "confidence": 0.54170907, - "id": "47980cfc-ba2a-4cca-a2de-cf7fb3154c22", + "id": "0e6d2b7a-20e2-44c1-8c05-41994f79a185", "page": { "height": 2200, "pageIndex": 1, @@ -39006,65 +10260,7 @@ "readingOrder": 108, "role": "Text", "text": "= $", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 8, - "width": 16, - "x": 555, - "y": 1788 - }, - "confidence": 1, - "points": [ - [ - 555, - 1788 - ], - [ - 571, - 1788 - ], - [ - 571, - 1796 - ], - [ - 555, - 1796 - ] - ], - "text": "=" - }, - { - "bounds": { - "height": 25, - "width": 13, - "x": 577, - "y": 1777 - }, - "confidence": 1, - "points": [ - [ - 577, - 1777 - ], - [ - 590, - 1777 - ], - [ - 590, - 1802 - ], - [ - 577, - 1802 - ] - ], - "text": "$" - } - ] + "type": "paragraph" }, { "bounds": { @@ -39073,8 +10269,9 @@ "x": 553.90594, "y": 1808 }, + "cells": null, "confidence": 0.5762757, - "id": "98619fd5-b108-4ca4-b4ca-3a97d912bb96", + "id": "f853c210-97fe-4de7-9098-82df93bba270", "page": { "height": 2200, "pageIndex": 1, @@ -39102,65 +10299,7 @@ "readingOrder": 109, "role": "Text", "text": "= $", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 8, - "width": 16, - "x": 555, - "y": 1819 - }, - "confidence": 1, - "points": [ - [ - 555, - 1819 - ], - [ - 571, - 1819 - ], - [ - 571, - 1827 - ], - [ - 555, - 1827 - ] - ], - "text": "=" - }, - { - "bounds": { - "height": 25, - "width": 13, - "x": 577, - "y": 1808 - }, - "confidence": 1, - "points": [ - [ - 577, - 1808 - ], - [ - 590, - 1808 - ], - [ - 590, - 1833 - ], - [ - 577, - 1833 - ] - ], - "text": "$" - } - ] + "type": "paragraph" }, { "bounds": { @@ -39169,8 +10308,9 @@ "x": 554.3201, "y": 1839.2015 }, + "cells": null, "confidence": 0.5118019, - "id": "684ba4e0-dbd5-42f6-8fc3-ea16914779bd", + "id": "adfa4b61-d21f-4801-ae61-3c9a9f467aab", "page": { "height": 2200, "pageIndex": 1, @@ -39207,8 +10347,9 @@ "x": 554.789, "y": 1870.0671 }, + "cells": null, "confidence": 0.5337139, - "id": "c12a517f-2622-4ba7-84af-05629d009245", + "id": "b94e3f61-fb04-470b-b04b-b2ff4edc547b", "page": { "height": 2200, "pageIndex": 1, @@ -39245,8 +10386,9 @@ "x": 461.93884, "y": 1928.9065 }, + "cells": null, "confidence": 0.57075, - "id": "1de402e6-a42b-4a5b-9075-bf4c0866f5ce", + "id": "fb63f7dc-b74a-4e7a-9944-e096e3ceac44", "page": { "height": 2200, "pageIndex": 1, @@ -39283,8 +10425,9 @@ "x": 1691, "y": 1538 }, + "cells": null, "confidence": 1, - "id": "ba76bb14-1c66-43db-a62e-b32f9ed795f5", + "id": "c99636ce-346d-4053-bd3a-4890dee67560", "page": { "height": 2200, "pageIndex": 1, @@ -39312,37 +10455,7 @@ "readingOrder": 113, "role": "Text", "text": "Residential", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 113, - "x": 1691, - "y": 1538 - }, - "confidence": 1, - "points": [ - [ - 1691, - 1538 - ], - [ - 1804, - 1538 - ], - [ - 1804, - 1560 - ], - [ - 1691, - 1560 - ] - ], - "text": "Residential" - } - ] + "type": "paragraph" }, { "bounds": { @@ -39351,8 +10464,9 @@ "x": 238, "y": 1566 }, + "cells": null, "confidence": 0.56151915, - "id": "1fa16e29-f941-4b69-831f-fa27edcbf231", + "id": "f2ca57e0-7eb8-41a5-a545-8fe4db3b3e02", "page": { "height": 2200, "pageIndex": 1, @@ -39380,177 +10494,7 @@ "readingOrder": 114, "role": "Text", "text": "Sq. Ft. @ $ = $", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 36, - "x": 238, - "y": 1569 - }, - "confidence": 1, - "points": [ - [ - 238, - 1569 - ], - [ - 274, - 1569 - ], - [ - 274, - 1594 - ], - [ - 238, - 1594 - ] - ], - "text": "Sq." - }, - { - "bounds": { - "height": 22, - "width": 27, - "x": 280, - "y": 1569 - }, - "confidence": 1, - "points": [ - [ - 280, - 1569 - ], - [ - 307, - 1569 - ], - [ - 307, - 1591 - ], - [ - 280, - 1591 - ] - ], - "text": "Ft." - }, - { - "bounds": { - "height": 25, - "width": 25, - "x": 313, - "y": 1569 - }, - "confidence": 1, - "points": [ - [ - 313, - 1569 - ], - [ - 338, - 1569 - ], - [ - 338, - 1594 - ], - [ - 313, - 1594 - ] - ], - "text": "@" - }, - { - "bounds": { - "height": 27, - "width": 13, - "x": 344, - "y": 1566 - }, - "confidence": 1, - "points": [ - [ - 344, - 1566 - ], - [ - 357, - 1566 - ], - [ - 357, - 1593 - ], - [ - 344, - 1593 - ] - ], - "text": "$" - }, - { - "bounds": { - "height": 8, - "width": 16, - "x": 555, - "y": 1577 - }, - "confidence": 1, - "points": [ - [ - 555, - 1577 - ], - [ - 571, - 1577 - ], - [ - 571, - 1585 - ], - [ - 555, - 1585 - ] - ], - "text": "=" - }, - { - "bounds": { - "height": 27, - "width": 13, - "x": 577, - "y": 1566 - }, - "confidence": 1, - "points": [ - [ - 577, - 1566 - ], - [ - 590, - 1566 - ], - [ - 590, - 1593 - ], - [ - 577, - 1593 - ] - ], - "text": "$" - } - ] + "type": "paragraph" }, { "bounds": { @@ -39559,8 +10503,9 @@ "x": 237.96584, "y": 1596.3375 }, + "cells": null, "confidence": 0.5699276, - "id": "1422e06a-2d92-48a7-8c84-d126766f7b88", + "id": "75e89333-804c-4220-826f-77147761d71a", "page": { "height": 2200, "pageIndex": 1, @@ -39588,121 +10533,7 @@ "readingOrder": 115, "role": "Text", "text": "Sq. Ft. @ $", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 36, - "x": 238, - "y": 1600 - }, - "confidence": 1, - "points": [ - [ - 238, - 1600 - ], - [ - 274, - 1600 - ], - [ - 274, - 1625 - ], - [ - 238, - 1625 - ] - ], - "text": "Sq." - }, - { - "bounds": { - "height": 19, - "width": 27, - "x": 280, - "y": 1600 - }, - "confidence": 1, - "points": [ - [ - 280, - 1600 - ], - [ - 307, - 1600 - ], - [ - 307, - 1619 - ], - [ - 280, - 1619 - ] - ], - "text": "Ft." - }, - { - "bounds": { - "height": 22, - "width": 25, - "x": 313, - "y": 1600 - }, - "confidence": 1, - "points": [ - [ - 313, - 1600 - ], - [ - 338, - 1600 - ], - [ - 338, - 1622 - ], - [ - 313, - 1622 - ] - ], - "text": "@" - }, - { - "bounds": { - "height": 25, - "width": 13, - "x": 344, - "y": 1597 - }, - "confidence": 1, - "points": [ - [ - 344, - 1597 - ], - [ - 357, - 1597 - ], - [ - 357, - 1622 - ], - [ - 344, - 1622 - ] - ], - "text": "$" - } - ] + "type": "paragraph" }, { "bounds": { @@ -39711,8 +10542,9 @@ "x": 237.99727, "y": 1627 }, + "cells": null, "confidence": 0.58350235, - "id": "0631487f-be00-4bb5-9c29-a5bd1611188e", + "id": "a25d73d5-a991-4cce-94ca-0c8a9722089e", "page": { "height": 2200, "pageIndex": 1, @@ -39740,177 +10572,7 @@ "readingOrder": 116, "role": "Text", "text": "Sq. Ft. @ $ = $", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 36, - "x": 238, - "y": 1627 - }, - "confidence": 1, - "points": [ - [ - 238, - 1627 - ], - [ - 274, - 1627 - ], - [ - 274, - 1654 - ], - [ - 238, - 1654 - ] - ], - "text": "Sq." - }, - { - "bounds": { - "height": 22, - "width": 27, - "x": 280, - "y": 1627 - }, - "confidence": 1, - "points": [ - [ - 280, - 1627 - ], - [ - 307, - 1627 - ], - [ - 307, - 1649 - ], - [ - 280, - 1649 - ] - ], - "text": "Ft." - }, - { - "bounds": { - "height": 25, - "width": 25, - "x": 313, - "y": 1627 - }, - "confidence": 1, - "points": [ - [ - 313, - 1627 - ], - [ - 338, - 1627 - ], - [ - 338, - 1652 - ], - [ - 313, - 1652 - ] - ], - "text": "@" - }, - { - "bounds": { - "height": 25, - "width": 13, - "x": 344, - "y": 1627 - }, - "confidence": 1, - "points": [ - [ - 344, - 1627 - ], - [ - 357, - 1627 - ], - [ - 357, - 1652 - ], - [ - 344, - 1652 - ] - ], - "text": "$" - }, - { - "bounds": { - "height": 8, - "width": 16, - "x": 555, - "y": 1638 - }, - "confidence": 1, - "points": [ - [ - 555, - 1638 - ], - [ - 571, - 1638 - ], - [ - 571, - 1646 - ], - [ - 555, - 1646 - ] - ], - "text": "=" - }, - { - "bounds": { - "height": 25, - "width": 13, - "x": 577, - "y": 1627 - }, - "confidence": 1, - "points": [ - [ - 577, - 1627 - ], - [ - 590, - 1627 - ], - [ - 590, - 1652 - ], - [ - 577, - 1652 - ] - ], - "text": "$" - } - ] + "type": "paragraph" }, { "bounds": { @@ -39919,8 +10581,9 @@ "x": 237.82965, "y": 1658 }, + "cells": null, "confidence": 0.59451073, - "id": "b10ecc9e-75ba-4fea-b51d-bc070116f9ff", + "id": "7ea69005-dd32-4e49-ba25-edbea7a54156", "page": { "height": 2200, "pageIndex": 1, @@ -39948,177 +10611,7 @@ "readingOrder": 117, "role": "Text", "text": "Sq. Ft. @ $ = $", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 36, - "x": 238, - "y": 1658 - }, - "confidence": 1, - "points": [ - [ - 238, - 1658 - ], - [ - 274, - 1658 - ], - [ - 274, - 1685 - ], - [ - 238, - 1685 - ] - ], - "text": "Sq." - }, - { - "bounds": { - "height": 22, - "width": 27, - "x": 280, - "y": 1658 - }, - "confidence": 1, - "points": [ - [ - 280, - 1658 - ], - [ - 307, - 1658 - ], - [ - 307, - 1680 - ], - [ - 280, - 1680 - ] - ], - "text": "Ft." - }, - { - "bounds": { - "height": 25, - "width": 25, - "x": 313, - "y": 1658 - }, - "confidence": 1, - "points": [ - [ - 313, - 1658 - ], - [ - 338, - 1658 - ], - [ - 338, - 1683 - ], - [ - 313, - 1683 - ] - ], - "text": "@" - }, - { - "bounds": { - "height": 25, - "width": 13, - "x": 344, - "y": 1658 - }, - "confidence": 1, - "points": [ - [ - 344, - 1658 - ], - [ - 357, - 1658 - ], - [ - 357, - 1683 - ], - [ - 344, - 1683 - ] - ], - "text": "$" - }, - { - "bounds": { - "height": 8, - "width": 16, - "x": 555, - "y": 1669 - }, - "confidence": 1, - "points": [ - [ - 555, - 1669 - ], - [ - 571, - 1669 - ], - [ - 571, - 1677 - ], - [ - 555, - 1677 - ] - ], - "text": "=" - }, - { - "bounds": { - "height": 25, - "width": 13, - "x": 577, - "y": 1658 - }, - "confidence": 1, - "points": [ - [ - 577, - 1658 - ], - [ - 590, - 1658 - ], - [ - 590, - 1683 - ], - [ - 577, - 1683 - ] - ], - "text": "$" - } - ] + "type": "paragraph" }, { "bounds": { @@ -40127,8 +10620,9 @@ "x": 65.298355, "y": 1838 }, + "cells": null, "confidence": 0.661154, - "id": "fe4dde65-9b55-4520-bfa0-bb51976aacf7", + "id": "181cce8c-b7d4-4eb2-8b9e-f09845f58af9", "page": { "height": 2200, "pageIndex": 1, @@ -40156,177 +10650,7 @@ "readingOrder": 118, "role": "Text", "text": "Special Energy Efficient Items = $", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 80, - "x": 69, - "y": 1838 - }, - "confidence": 1, - "points": [ - [ - 69, - 1838 - ], - [ - 149, - 1838 - ], - [ - 149, - 1865 - ], - [ - 69, - 1865 - ] - ], - "text": "Special" - }, - { - "bounds": { - "height": 27, - "width": 80, - "x": 158, - "y": 1838 - }, - "confidence": 1, - "points": [ - [ - 158, - 1838 - ], - [ - 238, - 1838 - ], - [ - 238, - 1865 - ], - [ - 158, - 1865 - ] - ], - "text": "Energy" - }, - { - "bounds": { - "height": 22, - "width": 88, - "x": 247, - "y": 1838 - }, - "confidence": 1, - "points": [ - [ - 247, - 1838 - ], - [ - 335, - 1838 - ], - [ - 335, - 1860 - ], - [ - 247, - 1860 - ] - ], - "text": "Efficient" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 344, - "y": 1838 - }, - "confidence": 1, - "points": [ - [ - 344, - 1838 - ], - [ - 405, - 1838 - ], - [ - 405, - 1860 - ], - [ - 344, - 1860 - ] - ], - "text": "Items" - }, - { - "bounds": { - "height": 11, - "width": 13, - "x": 555, - "y": 1847 - }, - "confidence": 1, - "points": [ - [ - 555, - 1847 - ], - [ - 568, - 1847 - ], - [ - 568, - 1858 - ], - [ - 555, - 1858 - ] - ], - "text": "=" - }, - { - "bounds": { - "height": 25, - "width": 13, - "x": 577, - "y": 1838 - }, - "confidence": 1, - "points": [ - [ - 577, - 1838 - ], - [ - 590, - 1838 - ], - [ - 590, - 1863 - ], - [ - 577, - 1863 - ] - ], - "text": "$" - } - ] + "type": "paragraph" }, { "bounds": { @@ -40335,8 +10659,9 @@ "x": 69, "y": 1866 }, + "cells": null, "confidence": 0.59410405, - "id": "47e6f8ca-8230-4cc6-82ca-d41b0d35cdf4", + "id": "af9999c3-80ff-471e-b2b3-37ea4784a3b6", "page": { "height": 2200, "pageIndex": 1, @@ -40364,149 +10689,7 @@ "readingOrder": 119, "role": "Text", "text": "Porches, Patios, etc. = $", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 94, - "x": 69, - "y": 1869 - }, - "confidence": 1, - "points": [ - [ - 69, - 1869 - ], - [ - 163, - 1869 - ], - [ - 163, - 1894 - ], - [ - 69, - 1894 - ] - ], - "text": "Porches," - }, - { - "bounds": { - "height": 25, - "width": 72, - "x": 175, - "y": 1869 - }, - "confidence": 1, - "points": [ - [ - 175, - 1869 - ], - [ - 247, - 1869 - ], - [ - 247, - 1894 - ], - [ - 175, - 1894 - ] - ], - "text": "Patios," - }, - { - "bounds": { - "height": 22, - "width": 38, - "x": 255, - "y": 1869 - }, - "confidence": 1, - "points": [ - [ - 255, - 1869 - ], - [ - 293, - 1869 - ], - [ - 293, - 1891 - ], - [ - 255, - 1891 - ] - ], - "text": "etc." - }, - { - "bounds": { - "height": 8, - "width": 16, - "x": 555, - "y": 1877 - }, - "confidence": 1, - "points": [ - [ - 555, - 1877 - ], - [ - 571, - 1877 - ], - [ - 571, - 1885 - ], - [ - 555, - 1885 - ] - ], - "text": "=" - }, - { - "bounds": { - "height": 27, - "width": 13, - "x": 577, - "y": 1866 - }, - "confidence": 1, - "points": [ - [ - 577, - 1866 - ], - [ - 590, - 1866 - ], - [ - 590, - 1893 - ], - [ - 577, - 1893 - ] - ], - "text": "$" - } - ] + "type": "paragraph" }, { "bounds": { @@ -40515,8 +10698,9 @@ "x": 66, "y": 1897.8901 }, + "cells": null, "confidence": 0.61717993, - "id": "983a267a-2196-4ead-9f7f-48793be80ab7", + "id": "ea75c820-41c6-4a61-a311-789ad5dd3a3f", "page": { "height": 2200, "pageIndex": 1, @@ -40544,121 +10728,7 @@ "readingOrder": 120, "role": "Text", "text": "Total Estimated Cost New", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 55, - "x": 66, - "y": 1899 - }, - "confidence": 1, - "points": [ - [ - 66, - 1899 - ], - [ - 121, - 1899 - ], - [ - 121, - 1918 - ], - [ - 66, - 1918 - ] - ], - "text": "Total" - }, - { - "bounds": { - "height": 19, - "width": 111, - "x": 130, - "y": 1899 - }, - "confidence": 1, - "points": [ - [ - 130, - 1899 - ], - [ - 241, - 1899 - ], - [ - 241, - 1918 - ], - [ - 130, - 1918 - ] - ], - "text": "Estimated" - }, - { - "bounds": { - "height": 19, - "width": 50, - "x": 249, - "y": 1899 - }, - "confidence": 1, - "points": [ - [ - 249, - 1899 - ], - [ - 299, - 1899 - ], - [ - 299, - 1918 - ], - [ - 249, - 1918 - ] - ], - "text": "Cost" - }, - { - "bounds": { - "height": 19, - "width": 50, - "x": 308, - "y": 1899 - }, - "confidence": 1, - "points": [ - [ - 308, - 1899 - ], - [ - 358, - 1899 - ], - [ - 358, - 1918 - ], - [ - 308, - 1918 - ] - ], - "text": "New" - } - ] + "type": "paragraph" }, { "bounds": { @@ -40667,8 +10737,9 @@ "x": 200, "y": 1927 }, + "cells": null, "confidence": 0.62940365, - "id": "e1bb512e-0894-4bbd-8183-66d8e8fb6878", + "id": "585ae149-fa89-42cd-ac45-b52db4c17aa3", "page": { "height": 2200, "pageIndex": 1, @@ -40696,93 +10767,7 @@ "readingOrder": 121, "role": "Text", "text": "Physical Functional External", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 94, - "x": 200, - "y": 1927 - }, - "confidence": 1, - "points": [ - [ - 200, - 1927 - ], - [ - 294, - 1927 - ], - [ - 294, - 1954 - ], - [ - 200, - 1954 - ] - ], - "text": "Physical" - }, - { - "bounds": { - "height": 22, - "width": 116, - "x": 319, - "y": 1927 - }, - "confidence": 1, - "points": [ - [ - 319, - 1927 - ], - [ - 435, - 1927 - ], - [ - 435, - 1949 - ], - [ - 319, - 1949 - ] - ], - "text": "Functional" - }, - { - "bounds": { - "height": 22, - "width": 91, - "x": 463, - "y": 1927 - }, - "confidence": 1, - "points": [ - [ - 463, - 1927 - ], - [ - 554, - 1927 - ], - [ - 554, - 1949 - ], - [ - 463, - 1949 - ] - ], - "text": "External" - } - ] + "type": "paragraph" }, { "bounds": { @@ -40791,8 +10776,9 @@ "x": 319.76242, "y": 1929.4333 }, + "cells": null, "confidence": 0.5838697, - "id": "c7d850fc-7bdb-4a4d-b35f-b2cd28608703", + "id": "573baad3-c856-4a58-9b02-3c3179d435e2", "page": { "height": 2200, "pageIndex": 1, @@ -40829,8 +10815,9 @@ "x": 233, "y": 1978.4908 }, + "cells": null, "confidence": 0.56847876, - "id": "05167fc7-467c-41e6-8518-235db9c5506a", + "id": "2492f0d7-c56a-458a-9a45-bf85a8fa3edc", "page": { "height": 2200, "pageIndex": 1, @@ -40858,93 +10845,7 @@ "readingOrder": 123, "role": "Text", "text": "15,000 0 15,000", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 69, - "x": 233, - "y": 1980 - }, - "confidence": 1, - "points": [ - [ - 233, - 1980 - ], - [ - 302, - 1980 - ], - [ - 302, - 2002 - ], - [ - 233, - 2002 - ] - ], - "text": "15,000" - }, - { - "bounds": { - "height": 19, - "width": 13, - "x": 311, - "y": 1980 - }, - "confidence": 1, - "points": [ - [ - 311, - 1980 - ], - [ - 324, - 1980 - ], - [ - 324, - 1999 - ], - [ - 311, - 1999 - ] - ], - "text": "0" - }, - { - "bounds": { - "height": 22, - "width": 69, - "x": 602, - "y": 1988 - }, - "confidence": 1, - "points": [ - [ - 602, - 1988 - ], - [ - 671, - 1988 - ], - [ - 671, - 2010 - ], - [ - 602, - 2010 - ] - ], - "text": "15,000" - } - ] + "type": "paragraph" }, { "bounds": { @@ -40953,8 +10854,9 @@ "x": 67.887436, "y": 1958 }, + "cells": null, "confidence": 0.5873002, - "id": "0dbf29ea-cdc1-49a5-927f-b4d61be28e7f", + "id": "e0d9c1e6-1823-4b78-8d12-422df3e7163d", "page": { "height": 2200, "pageIndex": 1, @@ -40982,37 +10884,7 @@ "readingOrder": 124, "role": "Text", "text": "Less", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 52, - "x": 69, - "y": 1958 - }, - "confidence": 1, - "points": [ - [ - 69, - 1958 - ], - [ - 121, - 1958 - ], - [ - 121, - 1980 - ], - [ - 69, - 1980 - ] - ], - "text": "Less" - } - ] + "type": "paragraph" }, { "bounds": { @@ -41021,8 +10893,9 @@ "x": 68.31167, "y": 1988 }, + "cells": null, "confidence": 0.6167661, - "id": "5620eb20-83a1-4e50-beb7-ea85e9c336bb", + "id": "a94d5157-9c6a-4a08-87b6-35c4b8ec18da", "page": { "height": 2200, "pageIndex": 1, @@ -41050,37 +10923,7 @@ "readingOrder": 125, "role": "Text", "text": "Depreciation", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 144, - "x": 69, - "y": 1988 - }, - "confidence": 1, - "points": [ - [ - 69, - 1988 - ], - [ - 213, - 1988 - ], - [ - 213, - 2015 - ], - [ - 69, - 2015 - ] - ], - "text": "Depreciation" - } - ] + "type": "paragraph" }, { "bounds": { @@ -41089,8 +10932,9 @@ "x": 68.48565, "y": 2016 }, + "cells": null, "confidence": 0.62876, - "id": "e56445a6-14e5-4fce-9859-d5b16affef28", + "id": "ae76b225-98e5-4d33-a2f5-882795bf2529", "page": { "height": 2200, "pageIndex": 1, @@ -41118,177 +10962,7 @@ "readingOrder": 126, "role": "Text", "text": "Depreciation Value of Improvements $ 230,500__________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 138, - "x": 69, - "y": 2019 - }, - "confidence": 1, - "points": [ - [ - 69, - 2019 - ], - [ - 207, - 2019 - ], - [ - 207, - 2044 - ], - [ - 69, - 2044 - ] - ], - "text": "Depreciation" - }, - { - "bounds": { - "height": 22, - "width": 63, - "x": 216, - "y": 2019 - }, - "confidence": 1, - "points": [ - [ - 216, - 2019 - ], - [ - 279, - 2019 - ], - [ - 279, - 2041 - ], - [ - 216, - 2041 - ] - ], - "text": "Value" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 288, - "y": 2019 - }, - "confidence": 1, - "points": [ - [ - 288, - 2019 - ], - [ - 310, - 2019 - ], - [ - 310, - 2041 - ], - [ - 288, - 2041 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 25, - "width": 158, - "x": 319, - "y": 2019 - }, - "confidence": 1, - "points": [ - [ - 319, - 2019 - ], - [ - 477, - 2019 - ], - [ - 477, - 2044 - ], - [ - 319, - 2044 - ] - ], - "text": "Improvements" - }, - { - "bounds": { - "height": 27, - "width": 16, - "x": 638, - "y": 2016 - }, - "confidence": 1, - "points": [ - [ - 638, - 2016 - ], - [ - 654, - 2016 - ], - [ - 654, - 2043 - ], - [ - 638, - 2043 - ] - ], - "text": "$" - }, - { - "bounds": { - "height": 22, - "width": 144, - "x": 658, - "y": 2022 - }, - "confidence": 1, - "points": [ - [ - 658, - 2022 - ], - [ - 802, - 2022 - ], - [ - 802, - 2044 - ], - [ - 658, - 2044 - ] - ], - "text": "230,500__________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -41297,8 +10971,9 @@ "x": 66, "y": 2049.1377 }, + "cells": null, "confidence": 0.66048443, - "id": "632a6542-0ce7-4734-9386-506032c75b1d", + "id": "3c51eb17-8044-4ace-94d9-49145357cdd3", "page": { "height": 2200, "pageIndex": 1, @@ -41326,177 +11001,7 @@ "readingOrder": 127, "role": "Text", "text": "\\As is\\ Value of Site Improvements", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 38, - "x": 66, - "y": 2050 - }, - "confidence": 1, - "points": [ - [ - 66, - 2050 - ], - [ - 104, - 2050 - ], - [ - 104, - 2069 - ], - [ - 66, - 2069 - ] - ], - "text": "\\As" - }, - { - "bounds": { - "height": 19, - "width": 27, - "x": 111, - "y": 2050 - }, - "confidence": 1, - "points": [ - [ - 111, - 2050 - ], - [ - 138, - 2050 - ], - [ - 138, - 2069 - ], - [ - 111, - 2069 - ] - ], - "text": "is\\" - }, - { - "bounds": { - "height": 19, - "width": 63, - "x": 141, - "y": 2050 - }, - "confidence": 1, - "points": [ - [ - 141, - 2050 - ], - [ - 204, - 2050 - ], - [ - 204, - 2069 - ], - [ - 141, - 2069 - ] - ], - "text": "Value" - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 211, - "y": 2050 - }, - "confidence": 1, - "points": [ - [ - 211, - 2050 - ], - [ - 233, - 2050 - ], - [ - 233, - 2069 - ], - [ - 211, - 2069 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 19, - "width": 44, - "x": 238, - "y": 2050 - }, - "confidence": 1, - "points": [ - [ - 238, - 2050 - ], - [ - 282, - 2050 - ], - [ - 282, - 2069 - ], - [ - 238, - 2069 - ] - ], - "text": "Site" - }, - { - "bounds": { - "height": 25, - "width": 155, - "x": 291, - "y": 2050 - }, - "confidence": 1, - "points": [ - [ - 291, - 2050 - ], - [ - 446, - 2050 - ], - [ - 446, - 2075 - ], - [ - 291, - 2075 - ] - ], - "text": "Improvements" - } - ] + "type": "paragraph" }, { "bounds": { @@ -41505,8 +11010,9 @@ "x": 67.8176, "y": 2077 }, + "cells": null, "confidence": 0.63464403, - "id": "48b1b61f-57d1-450b-a9a1-b276ddc1f281", + "id": "04358ab2-8537-4973-9e83-7e3fac4fadc0", "page": { "height": 2200, "pageIndex": 1, @@ -41534,149 +11040,7 @@ "readingOrder": 128, "role": "Text", "text": "INDICATED VALUE BY COST APPROACH", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 130, - "x": 69, - "y": 2077 - }, - "confidence": 1, - "points": [ - [ - 69, - 2077 - ], - [ - 199, - 2077 - ], - [ - 199, - 2099 - ], - [ - 69, - 2099 - ] - ], - "text": "INDICATED" - }, - { - "bounds": { - "height": 22, - "width": 80, - "x": 205, - "y": 2077 - }, - "confidence": 1, - "points": [ - [ - 205, - 2077 - ], - [ - 285, - 2077 - ], - [ - 285, - 2099 - ], - [ - 205, - 2099 - ] - ], - "text": "VALUE" - }, - { - "bounds": { - "height": 22, - "width": 33, - "x": 294, - "y": 2077 - }, - "confidence": 1, - "points": [ - [ - 294, - 2077 - ], - [ - 327, - 2077 - ], - [ - 327, - 2099 - ], - [ - 294, - 2099 - ] - ], - "text": "BY" - }, - { - "bounds": { - "height": 22, - "width": 72, - "x": 333, - "y": 2077 - }, - "confidence": 1, - "points": [ - [ - 333, - 2077 - ], - [ - 405, - 2077 - ], - [ - 405, - 2099 - ], - [ - 333, - 2099 - ] - ], - "text": "COST" - }, - { - "bounds": { - "height": 22, - "width": 138, - "x": 411, - "y": 2077 - }, - "confidence": 1, - "points": [ - [ - 411, - 2077 - ], - [ - 549, - 2077 - ], - [ - 549, - 2099 - ], - [ - 411, - 2099 - ] - ], - "text": "APPROACH" - } - ] + "type": "paragraph" }, { "bounds": { @@ -41685,8 +11049,9 @@ "x": 603.50977, "y": 1987.5347 }, + "cells": null, "confidence": 0.5052944, - "id": "dbc61eca-9576-4275-9ae4-204ecdb91017", + "id": "dfc744f1-8d13-4b60-86e2-73e8536fbd10", "page": { "height": 2200, "pageIndex": 1, @@ -41723,8 +11088,9 @@ "x": 641.7898, "y": 2018.0353 }, + "cells": null, "confidence": 0.5524014, - "id": "48b7a42a-76bb-48e9-8bd8-b4b53ea5b301", + "id": "ea36d68e-fb8c-438c-852e-adbc7d2440ef", "page": { "height": 2200, "pageIndex": 1, @@ -41761,8 +11127,9 @@ "x": 42.3466, "y": 2118.3599 }, + "cells": null, "confidence": 0.72748053, - "id": "8c7e9eae-ea67-4a78-8819-b63ce2046a44", + "id": "28bb5c5c-fc5f-4fd3-9d76-63e23eaff65e", "page": { "height": 2200, "pageIndex": 1, @@ -41790,121 +11157,7 @@ "readingOrder": 131, "role": "Footer", "text": "Freddie Mac Form 72", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 75, - "x": 44, - "y": 2119 - }, - "confidence": 1, - "points": [ - [ - 44, - 2119 - ], - [ - 119, - 2119 - ], - [ - 119, - 2138 - ], - [ - 44, - 2138 - ] - ], - "text": "Freddie" - }, - { - "bounds": { - "height": 19, - "width": 41, - "x": 127, - "y": 2119 - }, - "confidence": 1, - "points": [ - [ - 127, - 2119 - ], - [ - 168, - 2119 - ], - [ - 168, - 2138 - ], - [ - 127, - 2138 - ] - ], - "text": "Mac" - }, - { - "bounds": { - "height": 19, - "width": 50, - "x": 177, - "y": 2119 - }, - "confidence": 1, - "points": [ - [ - 177, - 2119 - ], - [ - 227, - 2119 - ], - [ - 227, - 2138 - ], - [ - 177, - 2138 - ] - ], - "text": "Form" - }, - { - "bounds": { - "height": 19, - "width": 25, - "x": 236, - "y": 2119 - }, - "confidence": 1, - "points": [ - [ - 236, - 2119 - ], - [ - 261, - 2119 - ], - [ - 261, - 2138 - ], - [ - 236, - 2138 - ] - ], - "text": "72" - } - ] + "type": "paragraph" }, { "bounds": { @@ -41913,8 +11166,9 @@ "x": 41, "y": 2144 }, + "cells": null, "confidence": 0.78739417, - "id": "81a71e4b-54e8-4ce1-80a1-03b4bb09cd4a", + "id": "d42d4768-dace-4b01-9428-4c60fdc58ad3", "page": { "height": 2200, "pageIndex": 1, @@ -41942,177 +11196,7 @@ "readingOrder": 132, "role": "Footer", "text": "National Association of Real Estate Appraisers", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 83, - "x": 41, - "y": 2144 - }, - "confidence": 1, - "points": [ - [ - 41, - 2144 - ], - [ - 124, - 2144 - ], - [ - 124, - 2163 - ], - [ - 41, - 2163 - ] - ], - "text": "National" - }, - { - "bounds": { - "height": 19, - "width": 113, - "x": 130, - "y": 2144 - }, - "confidence": 1, - "points": [ - [ - 130, - 2144 - ], - [ - 243, - 2144 - ], - [ - 243, - 2163 - ], - [ - 130, - 2163 - ] - ], - "text": "Association" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 252, - "y": 2144 - }, - "confidence": 1, - "points": [ - [ - 252, - 2144 - ], - [ - 271, - 2144 - ], - [ - 271, - 2163 - ], - [ - 252, - 2163 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 19, - "width": 44, - "x": 280, - "y": 2144 - }, - "confidence": 1, - "points": [ - [ - 280, - 2144 - ], - [ - 324, - 2144 - ], - [ - 324, - 2163 - ], - [ - 280, - 2163 - ] - ], - "text": "Real" - }, - { - "bounds": { - "height": 19, - "width": 61, - "x": 336, - "y": 2144 - }, - "confidence": 1, - "points": [ - [ - 336, - 2144 - ], - [ - 397, - 2144 - ], - [ - 397, - 2163 - ], - [ - 336, - 2163 - ] - ], - "text": "Estate" - }, - { - "bounds": { - "height": 25, - "width": 108, - "x": 402, - "y": 2144 - }, - "confidence": 1, - "points": [ - [ - 402, - 2144 - ], - [ - 510, - 2144 - ], - [ - 510, - 2169 - ], - [ - 402, - 2169 - ] - ], - "text": "Appraisers" - } - ] + "type": "paragraph" }, { "bounds": { @@ -42121,8 +11205,9 @@ "x": 799.0771, "y": 2118.6099 }, + "cells": null, "confidence": 0.8113241, - "id": "9edc401b-2a6a-4b32-8e3d-3bf7f653a5b0", + "id": "7ba1f30d-3ba6-4970-89a4-78d0ea314d35", "page": { "height": 2200, "pageIndex": 1, @@ -42159,8 +11244,9 @@ "x": 800, "y": 2118.6152 }, + "cells": null, "confidence": 0.8654839, - "id": "ffbff850-a05b-4fee-883a-306734f6cf13", + "id": "cdb00a8a-1c70-4c36-ba7a-584d89bd99a0", "page": { "height": 2200, "pageIndex": 1, @@ -42188,177 +11274,7 @@ "readingOrder": 134, "role": "Footer", "text": "Page 2 Fannie Mae Form 1025", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 50, - "x": 800, - "y": 2119 - }, - "confidence": 1, - "points": [ - [ - 800, - 2119 - ], - [ - 850, - 2119 - ], - [ - 850, - 2141 - ], - [ - 800, - 2141 - ] - ], - "text": "Page" - }, - { - "bounds": { - "height": 19, - "width": 13, - "x": 855, - "y": 2119 - }, - "confidence": 1, - "points": [ - [ - 855, - 2119 - ], - [ - 868, - 2119 - ], - [ - 868, - 2138 - ], - [ - 855, - 2138 - ] - ], - "text": "2" - }, - { - "bounds": { - "height": 19, - "width": 66, - "x": 1400, - "y": 2119 - }, - "confidence": 1, - "points": [ - [ - 1400, - 2119 - ], - [ - 1466, - 2119 - ], - [ - 1466, - 2138 - ], - [ - 1400, - 2138 - ] - ], - "text": "Fannie" - }, - { - "bounds": { - "height": 19, - "width": 41, - "x": 1472, - "y": 2119 - }, - "confidence": 1, - "points": [ - [ - 1472, - 2119 - ], - [ - 1513, - 2119 - ], - [ - 1513, - 2138 - ], - [ - 1472, - 2138 - ] - ], - "text": "Mae" - }, - { - "bounds": { - "height": 19, - "width": 50, - "x": 1522, - "y": 2119 - }, - "confidence": 1, - "points": [ - [ - 1522, - 2119 - ], - [ - 1572, - 2119 - ], - [ - 1572, - 2138 - ], - [ - 1522, - 2138 - ] - ], - "text": "Form" - }, - { - "bounds": { - "height": 19, - "width": 47, - "x": 1580, - "y": 2119 - }, - "confidence": 1, - "points": [ - [ - 1580, - 2119 - ], - [ - 1627, - 2119 - ], - [ - 1627, - 2138 - ], - [ - 1580, - 2138 - ] - ], - "text": "1025" - } - ] + "type": "paragraph" }, { "bounds": { @@ -42367,8 +11283,9 @@ "x": 336, "y": 24.355537 }, + "cells": null, "confidence": 0.7690126, - "id": "230f6e12-1530-4bf7-a2d6-51dde797e9cc", + "id": "09992788-e2ed-4b55-8841-0aa93077e964", "page": { "height": 2200, "pageIndex": 2, @@ -42396,177 +11313,7 @@ "readingOrder": 0, "role": "SectionHeader", "text": "SMALL RESIDENTIAL INCOME PROPERTY APPRAISAL REPORT", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 111, - "x": 336, - "y": 25 - }, - "confidence": 1, - "points": [ - [ - 336, - 25 - ], - [ - 447, - 25 - ], - [ - 447, - 52 - ], - [ - 336, - 52 - ] - ], - "text": "SMALL" - }, - { - "bounds": { - "height": 27, - "width": 219, - "x": 458, - "y": 25 - }, - "confidence": 1, - "points": [ - [ - 458, - 25 - ], - [ - 677, - 25 - ], - [ - 677, - 52 - ], - [ - 458, - 52 - ] - ], - "text": "RESIDENTIAL" - }, - { - "bounds": { - "height": 27, - "width": 130, - "x": 688, - "y": 25 - }, - "confidence": 1, - "points": [ - [ - 688, - 25 - ], - [ - 818, - 25 - ], - [ - 818, - 52 - ], - [ - 688, - 52 - ] - ], - "text": "INCOME" - }, - { - "bounds": { - "height": 27, - "width": 183, - "x": 833, - "y": 25 - }, - "confidence": 1, - "points": [ - [ - 833, - 25 - ], - [ - 1016, - 25 - ], - [ - 1016, - 52 - ], - [ - 833, - 52 - ] - ], - "text": "PROPERTY" - }, - { - "bounds": { - "height": 27, - "width": 186, - "x": 1027, - "y": 25 - }, - "confidence": 1, - "points": [ - [ - 1027, - 25 - ], - [ - 1213, - 25 - ], - [ - 1213, - 52 - ], - [ - 1027, - 52 - ] - ], - "text": "APPRAISAL" - }, - { - "bounds": { - "height": 27, - "width": 136, - "x": 1227, - "y": 25 - }, - "confidence": 1, - "points": [ - [ - 1227, - 25 - ], - [ - 1363, - 25 - ], - [ - 1363, - 52 - ], - [ - 1227, - 52 - ] - ], - "text": "REPORT" - } - ] + "type": "paragraph" }, { "bounds": { @@ -42575,8 +11322,9 @@ "x": 65.90447, "y": 68.21784 }, + "cells": null, "confidence": 0.9656785, - "id": "d4b153ac-70f3-44df-99c9-0e2e498cdeb6", + "id": "876f9863-9176-4f56-bae0-f57ec0e30034", "page": { "height": 2200, "pageIndex": 2, @@ -42604,2893 +11352,7 @@ "readingOrder": 1, "role": "Text", "text": "At least three rental comparables should be reported and analyzed in this section. The rental comparables should represent the most current\nrental information on properties are similar and proximate to the subject property as possible. (This comparison is based on current rental\ndata, therefore, the rental comparables typically are not the same comparables used in the sales comparison analysis.) The appraisal report\nshould assure the reader that the units and properties selected as comparables are comparable to the subject property (both the units and\nthe overall property) and accurately represent the rental market for the subject property (unless otherwise stated within the report).", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 27, - "x": 66, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 66, - 69 - ], - [ - 93, - 69 - ], - [ - 93, - 91 - ], - [ - 66, - 91 - ] - ], - "text": "At" - }, - { - "bounds": { - "height": 22, - "width": 55, - "x": 100, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 100, - 69 - ], - [ - 155, - 69 - ], - [ - 155, - 91 - ], - [ - 100, - 91 - ] - ], - "text": "least" - }, - { - "bounds": { - "height": 22, - "width": 58, - "x": 161, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 161, - 69 - ], - [ - 219, - 69 - ], - [ - 219, - 91 - ], - [ - 161, - 91 - ] - ], - "text": "three" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 227, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 227, - 69 - ], - [ - 288, - 69 - ], - [ - 288, - 91 - ], - [ - 227, - 91 - ] - ], - "text": "rental" - }, - { - "bounds": { - "height": 25, - "width": 144, - "x": 297, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 297, - 69 - ], - [ - 441, - 69 - ], - [ - 441, - 94 - ], - [ - 297, - 94 - ] - ], - "text": "comparables" - }, - { - "bounds": { - "height": 22, - "width": 75, - "x": 447, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 447, - 69 - ], - [ - 522, - 69 - ], - [ - 522, - 91 - ], - [ - 447, - 91 - ] - ], - "text": "should" - }, - { - "bounds": { - "height": 22, - "width": 27, - "x": 530, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 530, - 69 - ], - [ - 557, - 69 - ], - [ - 557, - 91 - ], - [ - 530, - 91 - ] - ], - "text": "be" - }, - { - "bounds": { - "height": 25, - "width": 94, - "x": 566, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 566, - 69 - ], - [ - 660, - 69 - ], - [ - 660, - 94 - ], - [ - 566, - 94 - ] - ], - "text": "reported" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 669, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 669, - 69 - ], - [ - 710, - 69 - ], - [ - 710, - 91 - ], - [ - 669, - 91 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 25, - "width": 100, - "x": 719, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 719, - 69 - ], - [ - 819, - 69 - ], - [ - 819, - 94 - ], - [ - 719, - 94 - ] - ], - "text": "analyzed" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 827, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 827, - 69 - ], - [ - 846, - 69 - ], - [ - 846, - 88 - ], - [ - 827, - 88 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 852, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 852, - 69 - ], - [ - 893, - 69 - ], - [ - 893, - 91 - ], - [ - 852, - 91 - ] - ], - "text": "this" - }, - { - "bounds": { - "height": 22, - "width": 83, - "x": 902, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 902, - 69 - ], - [ - 985, - 69 - ], - [ - 985, - 91 - ], - [ - 902, - 91 - ] - ], - "text": "section." - }, - { - "bounds": { - "height": 22, - "width": 44, - "x": 991, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 991, - 69 - ], - [ - 1035, - 69 - ], - [ - 1035, - 91 - ], - [ - 991, - 91 - ] - ], - "text": "The" - }, - { - "bounds": { - "height": 22, - "width": 63, - "x": 1044, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 1044, - 69 - ], - [ - 1107, - 69 - ], - [ - 1107, - 91 - ], - [ - 1044, - 91 - ] - ], - "text": "rental" - }, - { - "bounds": { - "height": 25, - "width": 141, - "x": 1116, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 1116, - 69 - ], - [ - 1257, - 69 - ], - [ - 1257, - 94 - ], - [ - 1116, - 94 - ] - ], - "text": "comparables" - }, - { - "bounds": { - "height": 22, - "width": 72, - "x": 1266, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 1266, - 69 - ], - [ - 1338, - 69 - ], - [ - 1338, - 91 - ], - [ - 1266, - 91 - ] - ], - "text": "should" - }, - { - "bounds": { - "height": 25, - "width": 105, - "x": 1350, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 1350, - 69 - ], - [ - 1455, - 69 - ], - [ - 1455, - 94 - ], - [ - 1350, - 94 - ] - ], - "text": "represent" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1461, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 1461, - 69 - ], - [ - 1497, - 69 - ], - [ - 1497, - 91 - ], - [ - 1461, - 91 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 55, - "x": 1505, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 1505, - 69 - ], - [ - 1560, - 69 - ], - [ - 1560, - 91 - ], - [ - 1505, - 91 - ] - ], - "text": "most" - }, - { - "bounds": { - "height": 22, - "width": 80, - "x": 1566, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 1566, - 69 - ], - [ - 1646, - 69 - ], - [ - 1646, - 91 - ], - [ - 1566, - 91 - ] - ], - "text": "current" - }, - { - "bounds": { - "height": 19, - "width": 61, - "x": 69, - "y": 100 - }, - "confidence": 1, - "points": [ - [ - 69, - 100 - ], - [ - 130, - 100 - ], - [ - 130, - 119 - ], - [ - 69, - 119 - ] - ], - "text": "rental" - }, - { - "bounds": { - "height": 19, - "width": 124, - "x": 138, - "y": 100 - }, - "confidence": 1, - "points": [ - [ - 138, - 100 - ], - [ - 262, - 100 - ], - [ - 262, - 119 - ], - [ - 138, - 119 - ] - ], - "text": "information" - }, - { - "bounds": { - "height": 16, - "width": 30, - "x": 269, - "y": 102 - }, - "confidence": 1, - "points": [ - [ - 269, - 102 - ], - [ - 299, - 102 - ], - [ - 299, - 118 - ], - [ - 269, - 118 - ] - ], - "text": "on" - }, - { - "bounds": { - "height": 25, - "width": 111, - "x": 308, - "y": 100 - }, - "confidence": 1, - "points": [ - [ - 308, - 100 - ], - [ - 419, - 100 - ], - [ - 419, - 125 - ], - [ - 308, - 125 - ] - ], - "text": "properties" - }, - { - "bounds": { - "height": 16, - "width": 38, - "x": 424, - "y": 102 - }, - "confidence": 1, - "points": [ - [ - 424, - 102 - ], - [ - 462, - 102 - ], - [ - 462, - 118 - ], - [ - 424, - 118 - ] - ], - "text": "are" - }, - { - "bounds": { - "height": 19, - "width": 75, - "x": 469, - "y": 100 - }, - "confidence": 1, - "points": [ - [ - 469, - 100 - ], - [ - 544, - 100 - ], - [ - 544, - 119 - ], - [ - 469, - 119 - ] - ], - "text": "similar" - }, - { - "bounds": { - "height": 19, - "width": 41, - "x": 550, - "y": 100 - }, - "confidence": 1, - "points": [ - [ - 550, - 100 - ], - [ - 591, - 100 - ], - [ - 591, - 119 - ], - [ - 550, - 119 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 25, - "width": 111, - "x": 600, - "y": 100 - }, - "confidence": 1, - "points": [ - [ - 600, - 100 - ], - [ - 711, - 100 - ], - [ - 711, - 125 - ], - [ - 600, - 125 - ] - ], - "text": "proximate" - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 719, - "y": 100 - }, - "confidence": 1, - "points": [ - [ - 719, - 100 - ], - [ - 741, - 100 - ], - [ - 741, - 119 - ], - [ - 719, - 119 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 19, - "width": 36, - "x": 747, - "y": 100 - }, - "confidence": 1, - "points": [ - [ - 747, - 100 - ], - [ - 783, - 100 - ], - [ - 783, - 119 - ], - [ - 747, - 119 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 25, - "width": 80, - "x": 791, - "y": 100 - }, - "confidence": 1, - "points": [ - [ - 791, - 100 - ], - [ - 871, - 100 - ], - [ - 871, - 125 - ], - [ - 791, - 125 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 25, - "width": 94, - "x": 877, - "y": 100 - }, - "confidence": 1, - "points": [ - [ - 877, - 100 - ], - [ - 971, - 100 - ], - [ - 971, - 125 - ], - [ - 877, - 125 - ] - ], - "text": "property" - }, - { - "bounds": { - "height": 16, - "width": 27, - "x": 977, - "y": 102 - }, - "confidence": 1, - "points": [ - [ - 977, - 102 - ], - [ - 1004, - 102 - ], - [ - 1004, - 118 - ], - [ - 977, - 118 - ] - ], - "text": "as" - }, - { - "bounds": { - "height": 25, - "width": 97, - "x": 1013, - "y": 100 - }, - "confidence": 1, - "points": [ - [ - 1013, - 100 - ], - [ - 1110, - 100 - ], - [ - 1110, - 125 - ], - [ - 1013, - 125 - ] - ], - "text": "possible." - }, - { - "bounds": { - "height": 25, - "width": 55, - "x": 1119, - "y": 100 - }, - "confidence": 1, - "points": [ - [ - 1119, - 100 - ], - [ - 1174, - 100 - ], - [ - 1174, - 125 - ], - [ - 1119, - 125 - ] - ], - "text": "(This" - }, - { - "bounds": { - "height": 25, - "width": 130, - "x": 1183, - "y": 100 - }, - "confidence": 1, - "points": [ - [ - 1183, - 100 - ], - [ - 1313, - 100 - ], - [ - 1313, - 125 - ], - [ - 1183, - 125 - ] - ], - "text": "comparison" - }, - { - "bounds": { - "height": 19, - "width": 16, - "x": 1322, - "y": 100 - }, - "confidence": 1, - "points": [ - [ - 1322, - 100 - ], - [ - 1338, - 100 - ], - [ - 1338, - 119 - ], - [ - 1322, - 119 - ] - ], - "text": "is" - }, - { - "bounds": { - "height": 19, - "width": 69, - "x": 1347, - "y": 100 - }, - "confidence": 1, - "points": [ - [ - 1347, - 100 - ], - [ - 1416, - 100 - ], - [ - 1416, - 119 - ], - [ - 1347, - 119 - ] - ], - "text": "based" - }, - { - "bounds": { - "height": 16, - "width": 27, - "x": 1422, - "y": 102 - }, - "confidence": 1, - "points": [ - [ - 1422, - 102 - ], - [ - 1449, - 102 - ], - [ - 1449, - 118 - ], - [ - 1422, - 118 - ] - ], - "text": "on" - }, - { - "bounds": { - "height": 19, - "width": 80, - "x": 1458, - "y": 100 - }, - "confidence": 1, - "points": [ - [ - 1458, - 100 - ], - [ - 1538, - 100 - ], - [ - 1538, - 119 - ], - [ - 1458, - 119 - ] - ], - "text": "current" - }, - { - "bounds": { - "height": 19, - "width": 61, - "x": 1547, - "y": 100 - }, - "confidence": 1, - "points": [ - [ - 1547, - 100 - ], - [ - 1608, - 100 - ], - [ - 1608, - 119 - ], - [ - 1547, - 119 - ] - ], - "text": "rental" - }, - { - "bounds": { - "height": 25, - "width": 55, - "x": 66, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 66, - 127 - ], - [ - 121, - 127 - ], - [ - 121, - 152 - ], - [ - 66, - 152 - ] - ], - "text": "data," - }, - { - "bounds": { - "height": 25, - "width": 108, - "x": 130, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 130, - 127 - ], - [ - 238, - 127 - ], - [ - 238, - 152 - ], - [ - 130, - 152 - ] - ], - "text": "therefore," - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 247, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 247, - 127 - ], - [ - 283, - 127 - ], - [ - 283, - 149 - ], - [ - 247, - 149 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 291, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 291, - 127 - ], - [ - 352, - 127 - ], - [ - 352, - 149 - ], - [ - 291, - 149 - ] - ], - "text": "rental" - }, - { - "bounds": { - "height": 27, - "width": 141, - "x": 361, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 361, - 127 - ], - [ - 502, - 127 - ], - [ - 502, - 154 - ], - [ - 361, - 154 - ] - ], - "text": "comparables" - }, - { - "bounds": { - "height": 27, - "width": 91, - "x": 511, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 511, - 127 - ], - [ - 602, - 127 - ], - [ - 602, - 154 - ], - [ - 511, - 154 - ] - ], - "text": "typically" - }, - { - "bounds": { - "height": 16, - "width": 38, - "x": 608, - "y": 133 - }, - "confidence": 1, - "points": [ - [ - 608, - 133 - ], - [ - 646, - 133 - ], - [ - 646, - 149 - ], - [ - 608, - 149 - ] - ], - "text": "are" - }, - { - "bounds": { - "height": 19, - "width": 33, - "x": 655, - "y": 130 - }, - "confidence": 1, - "points": [ - [ - 655, - 130 - ], - [ - 688, - 130 - ], - [ - 688, - 149 - ], - [ - 655, - 149 - ] - ], - "text": "not" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 697, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 697, - 127 - ], - [ - 733, - 127 - ], - [ - 733, - 149 - ], - [ - 697, - 149 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 16, - "width": 63, - "x": 738, - "y": 133 - }, - "confidence": 1, - "points": [ - [ - 738, - 133 - ], - [ - 801, - 133 - ], - [ - 801, - 149 - ], - [ - 738, - 149 - ] - ], - "text": "same" - }, - { - "bounds": { - "height": 27, - "width": 144, - "x": 808, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 808, - 127 - ], - [ - 952, - 127 - ], - [ - 952, - 154 - ], - [ - 808, - 154 - ] - ], - "text": "comparables" - }, - { - "bounds": { - "height": 22, - "width": 52, - "x": 961, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 961, - 127 - ], - [ - 1013, - 127 - ], - [ - 1013, - 149 - ], - [ - 961, - 149 - ] - ], - "text": "used" - }, - { - "bounds": { - "height": 22, - "width": 16, - "x": 1025, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 1025, - 127 - ], - [ - 1041, - 127 - ], - [ - 1041, - 149 - ], - [ - 1025, - 149 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1050, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 1050, - 127 - ], - [ - 1086, - 127 - ], - [ - 1086, - 149 - ], - [ - 1050, - 149 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 58, - "x": 1094, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 1094, - 127 - ], - [ - 1152, - 127 - ], - [ - 1152, - 149 - ], - [ - 1094, - 149 - ] - ], - "text": "sales" - }, - { - "bounds": { - "height": 27, - "width": 130, - "x": 1161, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 1161, - 127 - ], - [ - 1291, - 127 - ], - [ - 1291, - 154 - ], - [ - 1161, - 154 - ] - ], - "text": "comparison" - }, - { - "bounds": { - "height": 27, - "width": 105, - "x": 1300, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 1300, - 127 - ], - [ - 1405, - 127 - ], - [ - 1405, - 154 - ], - [ - 1300, - 154 - ] - ], - "text": "analysis.)" - }, - { - "bounds": { - "height": 22, - "width": 44, - "x": 1411, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 1411, - 127 - ], - [ - 1455, - 127 - ], - [ - 1455, - 149 - ], - [ - 1411, - 149 - ] - ], - "text": "The" - }, - { - "bounds": { - "height": 27, - "width": 100, - "x": 1463, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 1463, - 127 - ], - [ - 1563, - 127 - ], - [ - 1563, - 154 - ], - [ - 1463, - 154 - ] - ], - "text": "appraisal" - }, - { - "bounds": { - "height": 25, - "width": 66, - "x": 1575, - "y": 130 - }, - "confidence": 1, - "points": [ - [ - 1575, - 130 - ], - [ - 1641, - 130 - ], - [ - 1641, - 155 - ], - [ - 1575, - 155 - ] - ], - "text": "report" - }, - { - "bounds": { - "height": 22, - "width": 72, - "x": 69, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 69, - 158 - ], - [ - 141, - 158 - ], - [ - 141, - 180 - ], - [ - 69, - 180 - ] - ], - "text": "should" - }, - { - "bounds": { - "height": 16, - "width": 75, - "x": 150, - "y": 163 - }, - "confidence": 1, - "points": [ - [ - 150, - 163 - ], - [ - 225, - 163 - ], - [ - 225, - 179 - ], - [ - 150, - 179 - ] - ], - "text": "assure" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 233, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 233, - 158 - ], - [ - 269, - 158 - ], - [ - 269, - 180 - ], - [ - 233, - 180 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 72, - "x": 277, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 277, - 158 - ], - [ - 349, - 158 - ], - [ - 349, - 180 - ], - [ - 277, - 180 - ] - ], - "text": "reader" - }, - { - "bounds": { - "height": 22, - "width": 44, - "x": 355, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 355, - 158 - ], - [ - 399, - 158 - ], - [ - 399, - 180 - ], - [ - 355, - 180 - ] - ], - "text": "that" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 405, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 405, - 158 - ], - [ - 441, - 158 - ], - [ - 441, - 180 - ], - [ - 405, - 180 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 52, - "x": 449, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 449, - 158 - ], - [ - 501, - 158 - ], - [ - 501, - 180 - ], - [ - 449, - 180 - ] - ], - "text": "units" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 511, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 511, - 158 - ], - [ - 552, - 158 - ], - [ - 552, - 180 - ], - [ - 511, - 180 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 27, - "width": 111, - "x": 561, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 561, - 158 - ], - [ - 672, - 158 - ], - [ - 672, - 185 - ], - [ - 561, - 185 - ] - ], - "text": "properties" - }, - { - "bounds": { - "height": 22, - "width": 91, - "x": 680, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 680, - 158 - ], - [ - 771, - 158 - ], - [ - 771, - 180 - ], - [ - 680, - 180 - ] - ], - "text": "selected" - }, - { - "bounds": { - "height": 16, - "width": 27, - "x": 780, - "y": 163 - }, - "confidence": 1, - "points": [ - [ - 780, - 163 - ], - [ - 807, - 163 - ], - [ - 807, - 179 - ], - [ - 780, - 179 - ] - ], - "text": "as" - }, - { - "bounds": { - "height": 27, - "width": 141, - "x": 816, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 816, - 158 - ], - [ - 957, - 158 - ], - [ - 957, - 185 - ], - [ - 816, - 185 - ] - ], - "text": "comparables" - }, - { - "bounds": { - "height": 16, - "width": 36, - "x": 966, - "y": 163 - }, - "confidence": 1, - "points": [ - [ - 966, - 163 - ], - [ - 1002, - 163 - ], - [ - 1002, - 179 - ], - [ - 966, - 179 - ] - ], - "text": "are" - }, - { - "bounds": { - "height": 27, - "width": 130, - "x": 1011, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 1011, - 158 - ], - [ - 1141, - 158 - ], - [ - 1141, - 185 - ], - [ - 1011, - 185 - ] - ], - "text": "comparable" - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 1150, - "y": 161 - }, - "confidence": 1, - "points": [ - [ - 1150, - 161 - ], - [ - 1172, - 161 - ], - [ - 1172, - 180 - ], - [ - 1150, - 180 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1177, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 1177, - 158 - ], - [ - 1213, - 158 - ], - [ - 1213, - 180 - ], - [ - 1177, - 180 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 80, - "x": 1222, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 1222, - 158 - ], - [ - 1302, - 158 - ], - [ - 1302, - 185 - ], - [ - 1222, - 185 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 25, - "width": 91, - "x": 1311, - "y": 161 - }, - "confidence": 1, - "points": [ - [ - 1311, - 161 - ], - [ - 1402, - 161 - ], - [ - 1402, - 186 - ], - [ - 1311, - 186 - ] - ], - "text": "property" - }, - { - "bounds": { - "height": 27, - "width": 55, - "x": 1411, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 1411, - 158 - ], - [ - 1466, - 158 - ], - [ - 1466, - 185 - ], - [ - 1411, - 185 - ] - ], - "text": "(both" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1475, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 1475, - 158 - ], - [ - 1511, - 158 - ], - [ - 1511, - 180 - ], - [ - 1475, - 180 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 52, - "x": 1519, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 1519, - 158 - ], - [ - 1571, - 158 - ], - [ - 1571, - 180 - ], - [ - 1519, - 180 - ] - ], - "text": "units" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 1577, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 1577, - 158 - ], - [ - 1618, - 158 - ], - [ - 1618, - 180 - ], - [ - 1577, - 180 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 66, - "y": 188 - }, - "confidence": 1, - "points": [ - [ - 66, - 188 - ], - [ - 102, - 188 - ], - [ - 102, - 210 - ], - [ - 66, - 210 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 75, - "x": 111, - "y": 188 - }, - "confidence": 1, - "points": [ - [ - 111, - 188 - ], - [ - 186, - 188 - ], - [ - 186, - 210 - ], - [ - 111, - 210 - ] - ], - "text": "overall" - }, - { - "bounds": { - "height": 27, - "width": 97, - "x": 194, - "y": 188 - }, - "confidence": 1, - "points": [ - [ - 194, - 188 - ], - [ - 291, - 188 - ], - [ - 291, - 215 - ], - [ - 194, - 215 - ] - ], - "text": "property)" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 300, - "y": 188 - }, - "confidence": 1, - "points": [ - [ - 300, - 188 - ], - [ - 341, - 188 - ], - [ - 341, - 210 - ], - [ - 300, - 210 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 27, - "width": 116, - "x": 350, - "y": 188 - }, - "confidence": 1, - "points": [ - [ - 350, - 188 - ], - [ - 466, - 188 - ], - [ - 466, - 215 - ], - [ - 350, - 215 - ] - ], - "text": "accurately" - }, - { - "bounds": { - "height": 25, - "width": 108, - "x": 472, - "y": 191 - }, - "confidence": 1, - "points": [ - [ - 472, - 191 - ], - [ - 580, - 191 - ], - [ - 580, - 216 - ], - [ - 472, - 216 - ] - ], - "text": "represent" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 586, - "y": 188 - }, - "confidence": 1, - "points": [ - [ - 586, - 188 - ], - [ - 622, - 188 - ], - [ - 622, - 210 - ], - [ - 586, - 210 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 630, - "y": 188 - }, - "confidence": 1, - "points": [ - [ - 630, - 188 - ], - [ - 691, - 188 - ], - [ - 691, - 210 - ], - [ - 630, - 210 - ] - ], - "text": "rental" - }, - { - "bounds": { - "height": 22, - "width": 77, - "x": 700, - "y": 188 - }, - "confidence": 1, - "points": [ - [ - 700, - 188 - ], - [ - 777, - 188 - ], - [ - 777, - 210 - ], - [ - 700, - 210 - ] - ], - "text": "market" - }, - { - "bounds": { - "height": 22, - "width": 30, - "x": 783, - "y": 188 - }, - "confidence": 1, - "points": [ - [ - 783, - 188 - ], - [ - 813, - 188 - ], - [ - 813, - 210 - ], - [ - 783, - 210 - ] - ], - "text": "for" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 819, - "y": 188 - }, - "confidence": 1, - "points": [ - [ - 819, - 188 - ], - [ - 855, - 188 - ], - [ - 855, - 210 - ], - [ - 819, - 210 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 80, - "x": 863, - "y": 188 - }, - "confidence": 1, - "points": [ - [ - 863, - 188 - ], - [ - 943, - 188 - ], - [ - 943, - 215 - ], - [ - 863, - 215 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 25, - "width": 91, - "x": 952, - "y": 191 - }, - "confidence": 1, - "points": [ - [ - 952, - 191 - ], - [ - 1043, - 191 - ], - [ - 1043, - 216 - ], - [ - 952, - 216 - ] - ], - "text": "property" - }, - { - "bounds": { - "height": 27, - "width": 80, - "x": 1052, - "y": 188 - }, - "confidence": 1, - "points": [ - [ - 1052, - 188 - ], - [ - 1132, - 188 - ], - [ - 1132, - 215 - ], - [ - 1052, - 215 - ] - ], - "text": "(unless" - }, - { - "bounds": { - "height": 22, - "width": 108, - "x": 1138, - "y": 188 - }, - "confidence": 1, - "points": [ - [ - 1138, - 188 - ], - [ - 1246, - 188 - ], - [ - 1246, - 210 - ], - [ - 1138, - 210 - ] - ], - "text": "otherwise" - }, - { - "bounds": { - "height": 22, - "width": 66, - "x": 1255, - "y": 188 - }, - "confidence": 1, - "points": [ - [ - 1255, - 188 - ], - [ - 1321, - 188 - ], - [ - 1321, - 210 - ], - [ - 1255, - 210 - ] - ], - "text": "stated" - }, - { - "bounds": { - "height": 22, - "width": 63, - "x": 1330, - "y": 188 - }, - "confidence": 1, - "points": [ - [ - 1330, - 188 - ], - [ - 1393, - 188 - ], - [ - 1393, - 210 - ], - [ - 1330, - 210 - ] - ], - "text": "within" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1402, - "y": 188 - }, - "confidence": 1, - "points": [ - [ - 1402, - 188 - ], - [ - 1438, - 188 - ], - [ - 1438, - 210 - ], - [ - 1402, - 210 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 77, - "x": 1447, - "y": 188 - }, - "confidence": 1, - "points": [ - [ - 1447, - 188 - ], - [ - 1524, - 188 - ], - [ - 1524, - 215 - ], - [ - 1447, - 215 - ] - ], - "text": "report)." - } - ] + "type": "paragraph" }, { "bounds": { @@ -45499,8 +11361,9 @@ "x": 106.039566, "y": 227 }, + "cells": null, "confidence": 0.52705026, - "id": "3365d306-5b09-44e4-9c14-7e1380f720a7", + "id": "9b7c99c8-90a8-4d8d-a1c8-53bba46a2880", "page": { "height": 2200, "pageIndex": 2, @@ -45528,37 +11391,7 @@ "readingOrder": 3, "role": "Text", "text": "ITEM", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 55, - "x": 108, - "y": 227 - }, - "confidence": 1, - "points": [ - [ - 108, - 227 - ], - [ - 163, - 227 - ], - [ - 163, - 249 - ], - [ - 108, - 249 - ] - ], - "text": "ITEM" - } - ] + "type": "paragraph" }, { "bounds": { @@ -45567,8 +11400,9 @@ "x": 66, "y": 288 }, + "cells": null, "confidence": 0.62168103, - "id": "85de0463-d7ac-4258-b883-7e32ae183d66", + "id": "ac592eb4-325b-425b-825e-e111b71499e5", "page": { "height": 2200, "pageIndex": 2, @@ -45596,37 +11430,7 @@ "readingOrder": 4, "role": "Text", "text": "Address", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 97, - "x": 66, - "y": 288 - }, - "confidence": 1, - "points": [ - [ - 66, - 288 - ], - [ - 163, - 288 - ], - [ - 163, - 310 - ], - [ - 66, - 310 - ] - ], - "text": "Address" - } - ] + "type": "paragraph" }, { "bounds": { @@ -45635,8 +11439,9 @@ "x": 166, "y": 268.16333 }, + "cells": null, "confidence": 0.6550952, - "id": "c0c0d0f5-e193-47ae-b440-3c65d3981ebb", + "id": "d6c823b4-89d0-4870-b57b-733c0e34d071", "page": { "height": 2200, "pageIndex": 2, @@ -45664,149 +11469,7 @@ "readingOrder": 5, "role": "Text", "text": "1487 Willowbrook Lane, Springfield, IL", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 50, - "x": 166, - "y": 269 - }, - "confidence": 1, - "points": [ - [ - 166, - 269 - ], - [ - 216, - 269 - ], - [ - 216, - 288 - ], - [ - 166, - 288 - ] - ], - "text": "1487" - }, - { - "bounds": { - "height": 19, - "width": 127, - "x": 222, - "y": 269 - }, - "confidence": 1, - "points": [ - [ - 222, - 269 - ], - [ - 349, - 269 - ], - [ - 349, - 288 - ], - [ - 222, - 288 - ] - ], - "text": "Willowbrook" - }, - { - "bounds": { - "height": 22, - "width": 55, - "x": 355, - "y": 269 - }, - "confidence": 1, - "points": [ - [ - 355, - 269 - ], - [ - 410, - 269 - ], - [ - 410, - 291 - ], - [ - 355, - 291 - ] - ], - "text": "Lane," - }, - { - "bounds": { - "height": 25, - "width": 113, - "x": 416, - "y": 269 - }, - "confidence": 1, - "points": [ - [ - 416, - 269 - ], - [ - 529, - 269 - ], - [ - 529, - 294 - ], - [ - 416, - 294 - ] - ], - "text": "Springfield," - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 538, - "y": 269 - }, - "confidence": 1, - "points": [ - [ - 538, - 269 - ], - [ - 557, - 269 - ], - [ - 557, - 288 - ], - [ - 538, - 288 - ] - ], - "text": "IL" - } - ] + "type": "paragraph" }, { "bounds": { @@ -45815,8 +11478,9 @@ "x": 66.32423, "y": 318.75037 }, + "cells": null, "confidence": 0.67378664, - "id": "22bf4472-9cf1-4a75-a7ee-2d39f3d4cb18", + "id": "9b32758e-ebc5-496e-b27e-23fff7f6d98e", "page": { "height": 2200, "pageIndex": 2, @@ -45844,93 +11508,7 @@ "readingOrder": 6, "role": "Text", "text": "Proximity to subject", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 102, - "x": 69, - "y": 319 - }, - "confidence": 1, - "points": [ - [ - 69, - 319 - ], - [ - 171, - 319 - ], - [ - 171, - 344 - ], - [ - 69, - 344 - ] - ], - "text": "Proximity" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 177, - "y": 319 - }, - "confidence": 1, - "points": [ - [ - 177, - 319 - ], - [ - 199, - 319 - ], - [ - 199, - 341 - ], - [ - 177, - 341 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 25, - "width": 80, - "x": 208, - "y": 319 - }, - "confidence": 1, - "points": [ - [ - 208, - 319 - ], - [ - 288, - 319 - ], - [ - 288, - 344 - ], - [ - 208, - 344 - ] - ], - "text": "subject" - } - ] + "type": "paragraph" }, { "bounds": { @@ -45939,8 +11517,9 @@ "x": 66.71561, "y": 348.1814 }, + "cells": null, "confidence": 0.64859027, - "id": "a2e3d33a-4c7e-42e5-9fcb-40d03feaeca4", + "id": "33a98c82-b58c-44c6-83ff-4f68143d2835", "page": { "height": 2200, "pageIndex": 2, @@ -45968,121 +11547,7 @@ "readingOrder": 7, "role": "Text", "text": "Lease dates (if available)", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 66, - "x": 69, - "y": 350 - }, - "confidence": 1, - "points": [ - [ - 69, - 350 - ], - [ - 135, - 350 - ], - [ - 135, - 369 - ], - [ - 69, - 369 - ] - ], - "text": "Lease" - }, - { - "bounds": { - "height": 19, - "width": 63, - "x": 144, - "y": 350 - }, - "confidence": 1, - "points": [ - [ - 144, - 350 - ], - [ - 207, - 350 - ], - [ - 207, - 369 - ], - [ - 144, - 369 - ] - ], - "text": "dates" - }, - { - "bounds": { - "height": 25, - "width": 22, - "x": 216, - "y": 350 - }, - "confidence": 1, - "points": [ - [ - 216, - 350 - ], - [ - 238, - 350 - ], - [ - 238, - 375 - ], - [ - 216, - 375 - ] - ], - "text": "(if" - }, - { - "bounds": { - "height": 25, - "width": 105, - "x": 247, - "y": 350 - }, - "confidence": 1, - "points": [ - [ - 247, - 350 - ], - [ - 352, - 350 - ], - [ - 352, - 375 - ], - [ - 247, - 375 - ] - ], - "text": "available)" - } - ] + "type": "paragraph" }, { "bounds": { @@ -46091,8 +11556,9 @@ "x": 66.78499, "y": 377 }, + "cells": null, "confidence": 0.6422573, - "id": "8f8fe85f-a61c-4fac-bf7d-b8fcb996ba1d", + "id": "2975de2f-5d71-40d5-b4c4-1848621d54cc", "page": { "height": 2200, "pageIndex": 2, @@ -46120,93 +11586,7 @@ "readingOrder": 8, "role": "Text", "text": "Rent survey date", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 52, - "x": 69, - "y": 377 - }, - "confidence": 1, - "points": [ - [ - 69, - 377 - ], - [ - 121, - 377 - ], - [ - 121, - 399 - ], - [ - 69, - 399 - ] - ], - "text": "Rent" - }, - { - "bounds": { - "height": 22, - "width": 75, - "x": 130, - "y": 383 - }, - "confidence": 1, - "points": [ - [ - 130, - 383 - ], - [ - 205, - 383 - ], - [ - 205, - 405 - ], - [ - 130, - 405 - ] - ], - "text": "survey" - }, - { - "bounds": { - "height": 22, - "width": 50, - "x": 211, - "y": 377 - }, - "confidence": 1, - "points": [ - [ - 211, - 377 - ], - [ - 261, - 377 - ], - [ - 261, - 399 - ], - [ - 211, - 399 - ] - ], - "text": "date" - } - ] + "type": "paragraph" }, { "bounds": { @@ -46215,8 +11595,9 @@ "x": 66.5797, "y": 408 }, + "cells": null, "confidence": 0.64269924, - "id": "f64b1cfd-4e1c-4be3-aafc-bc119703722b", + "id": "e4f4496b-0567-4be5-9484-99dfb30ddd3f", "page": { "height": 2200, "pageIndex": 2, @@ -46244,65 +11625,7 @@ "readingOrder": 9, "role": "Text", "text": "Data source", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 52, - "x": 69, - "y": 408 - }, - "confidence": 1, - "points": [ - [ - 69, - 408 - ], - [ - 121, - 408 - ], - [ - 121, - 430 - ], - [ - 69, - 430 - ] - ], - "text": "Data" - }, - { - "bounds": { - "height": 16, - "width": 75, - "x": 130, - "y": 413 - }, - "confidence": 1, - "points": [ - [ - 130, - 413 - ], - [ - 205, - 413 - ], - [ - 205, - 429 - ], - [ - 130, - 429 - ] - ], - "text": "source" - } - ] + "type": "paragraph" }, { "bounds": { @@ -46311,8 +11634,9 @@ "x": 66.25786, "y": 438 }, + "cells": null, "confidence": 0.6433595, - "id": "83fc6b9b-2706-4ded-832f-f674a952132d", + "id": "2624ea7f-9923-4cbc-9795-9ef0e583cd7a", "page": { "height": 2200, "pageIndex": 2, @@ -46340,65 +11664,7 @@ "readingOrder": 10, "role": "Text", "text": "Rent concessions", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 52, - "x": 69, - "y": 438 - }, - "confidence": 1, - "points": [ - [ - 69, - 438 - ], - [ - 121, - 438 - ], - [ - 121, - 460 - ], - [ - 69, - 460 - ] - ], - "text": "Rent" - }, - { - "bounds": { - "height": 22, - "width": 141, - "x": 130, - "y": 438 - }, - "confidence": 1, - "points": [ - [ - 130, - 438 - ], - [ - 271, - 438 - ], - [ - 271, - 460 - ], - [ - 130, - 460 - ] - ], - "text": "concessions" - } - ] + "type": "paragraph" }, { "bounds": { @@ -46407,8 +11673,9 @@ "x": 67.43957, "y": 497.82062 }, + "cells": null, "confidence": 0.6998724, - "id": "474bf85f-d727-4510-9734-083cdc08ca9d", + "id": "c3e079c2-3f1b-4f4a-8c02-e590f553b157", "page": { "height": 2200, "pageIndex": 2, @@ -46436,289 +11703,7 @@ "readingOrder": 11, "role": "Text", "text": "Description of property-\nunits, design, appeal,\nage, vacancies, and\nconditions", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 124, - "x": 69, - "y": 499 - }, - "confidence": 1, - "points": [ - [ - 69, - 499 - ], - [ - 193, - 499 - ], - [ - 193, - 524 - ], - [ - 69, - 524 - ] - ], - "text": "Description" - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 202, - "y": 499 - }, - "confidence": 1, - "points": [ - [ - 202, - 499 - ], - [ - 224, - 499 - ], - [ - 224, - 518 - ], - [ - 202, - 518 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 25, - "width": 100, - "x": 233, - "y": 499 - }, - "confidence": 1, - "points": [ - [ - 233, - 499 - ], - [ - 333, - 499 - ], - [ - 333, - 524 - ], - [ - 233, - 524 - ] - ], - "text": "property-" - }, - { - "bounds": { - "height": 25, - "width": 58, - "x": 69, - "y": 527 - }, - "confidence": 1, - "points": [ - [ - 69, - 527 - ], - [ - 127, - 527 - ], - [ - 127, - 552 - ], - [ - 69, - 552 - ] - ], - "text": "units," - }, - { - "bounds": { - "height": 27, - "width": 80, - "x": 136, - "y": 527 - }, - "confidence": 1, - "points": [ - [ - 136, - 527 - ], - [ - 216, - 527 - ], - [ - 216, - 554 - ], - [ - 136, - 554 - ] - ], - "text": "design," - }, - { - "bounds": { - "height": 27, - "width": 80, - "x": 227, - "y": 527 - }, - "confidence": 1, - "points": [ - [ - 227, - 527 - ], - [ - 307, - 527 - ], - [ - 307, - 554 - ], - [ - 227, - 554 - ] - ], - "text": "appeal," - }, - { - "bounds": { - "height": 22, - "width": 47, - "x": 69, - "y": 563 - }, - "confidence": 1, - "points": [ - [ - 69, - 563 - ], - [ - 116, - 563 - ], - [ - 116, - 585 - ], - [ - 69, - 585 - ] - ], - "text": "age," - }, - { - "bounds": { - "height": 25, - "width": 119, - "x": 124, - "y": 558 - }, - "confidence": 1, - "points": [ - [ - 124, - 558 - ], - [ - 243, - 558 - ], - [ - 243, - 583 - ], - [ - 124, - 583 - ] - ], - "text": "vacancies," - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 252, - "y": 558 - }, - "confidence": 1, - "points": [ - [ - 252, - 558 - ], - [ - 293, - 558 - ], - [ - 293, - 580 - ], - [ - 252, - 580 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 22, - "width": 116, - "x": 69, - "y": 588 - }, - "confidence": 1, - "points": [ - [ - 69, - 588 - ], - [ - 185, - 588 - ], - [ - 185, - 610 - ], - [ - 69, - 610 - ] - ], - "text": "conditions" - } - ] + "type": "paragraph" }, { "bounds": { @@ -46727,8 +11712,9 @@ "x": 67.30546, "y": 798.0922 }, + "cells": null, "confidence": 0.53321683, - "id": "91e9b5b4-3baf-46d2-81bf-353c3fed9c1c", + "id": "46bc8aac-d699-4732-a7a7-ee8f5be2a465", "page": { "height": 2200, "pageIndex": 2, @@ -46756,205 +11742,7 @@ "readingOrder": 12, "role": "Text", "text": "Utilities, furniture\nand amenities included\nin rent", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 86, - "x": 69, - "y": 800 - }, - "confidence": 1, - "points": [ - [ - 69, - 800 - ], - [ - 155, - 800 - ], - [ - 155, - 825 - ], - [ - 69, - 825 - ] - ], - "text": "Utilities," - }, - { - "bounds": { - "height": 19, - "width": 91, - "x": 166, - "y": 800 - }, - "confidence": 1, - "points": [ - [ - 166, - 800 - ], - [ - 257, - 800 - ], - [ - 257, - 819 - ], - [ - 166, - 819 - ] - ], - "text": "furniture" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 69, - "y": 827 - }, - "confidence": 1, - "points": [ - [ - 69, - 827 - ], - [ - 110, - 827 - ], - [ - 110, - 849 - ], - [ - 69, - 849 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 22, - "width": 108, - "x": 122, - "y": 827 - }, - "confidence": 1, - "points": [ - [ - 122, - 827 - ], - [ - 230, - 827 - ], - [ - 230, - 849 - ], - [ - 122, - 849 - ] - ], - "text": "amenities" - }, - { - "bounds": { - "height": 22, - "width": 94, - "x": 238, - "y": 827 - }, - "confidence": 1, - "points": [ - [ - 238, - 827 - ], - [ - 332, - 827 - ], - [ - 332, - 849 - ], - [ - 238, - 849 - ] - ], - "text": "included" - }, - { - "bounds": { - "height": 22, - "width": 19, - "x": 69, - "y": 858 - }, - "confidence": 1, - "points": [ - [ - 69, - 858 - ], - [ - 88, - 858 - ], - [ - 88, - 880 - ], - [ - 69, - 880 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 19, - "width": 41, - "x": 97, - "y": 861 - }, - "confidence": 1, - "points": [ - [ - 97, - 861 - ], - [ - 138, - 861 - ], - [ - 138, - 880 - ], - [ - 97, - 880 - ] - ], - "text": "rent" - } - ] + "type": "paragraph" }, { "bounds": { @@ -46963,8 +11751,9 @@ "x": 66, "y": 1041 }, + "cells": null, "confidence": 0.8133485, - "id": "13558258-24b4-429f-bd1b-4c9feae9f7aa", + "id": "c7126cf5-e785-4a9d-9051-608183da72f5", "page": { "height": 2200, "pageIndex": 2, @@ -46992,737 +11781,7 @@ "readingOrder": 13, "role": "Text", "text": "Analysis of rental data and support for estimated market rents for the individual subject units (including the adjustments used, the adequacy\nof comparables, rental concessions, etc.)", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 94, - "x": 66, - "y": 1041 - }, - "confidence": 1, - "points": [ - [ - 66, - 1041 - ], - [ - 160, - 1041 - ], - [ - 160, - 1068 - ], - [ - 66, - 1068 - ] - ], - "text": "Analysis" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 169, - "y": 1041 - }, - "confidence": 1, - "points": [ - [ - 169, - 1041 - ], - [ - 191, - 1041 - ], - [ - 191, - 1063 - ], - [ - 169, - 1063 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 200, - "y": 1041 - }, - "confidence": 1, - "points": [ - [ - 200, - 1041 - ], - [ - 261, - 1041 - ], - [ - 261, - 1063 - ], - [ - 200, - 1063 - ] - ], - "text": "rental" - }, - { - "bounds": { - "height": 22, - "width": 50, - "x": 269, - "y": 1041 - }, - "confidence": 1, - "points": [ - [ - 269, - 1041 - ], - [ - 319, - 1041 - ], - [ - 319, - 1063 - ], - [ - 269, - 1063 - ] - ], - "text": "data" - }, - { - "bounds": { - "height": 22, - "width": 44, - "x": 325, - "y": 1041 - }, - "confidence": 1, - "points": [ - [ - 325, - 1041 - ], - [ - 369, - 1041 - ], - [ - 369, - 1063 - ], - [ - 325, - 1063 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 25, - "width": 86, - "x": 375, - "y": 1044 - }, - "confidence": 1, - "points": [ - [ - 375, - 1044 - ], - [ - 461, - 1044 - ], - [ - 461, - 1069 - ], - [ - 375, - 1069 - ] - ], - "text": "support" - }, - { - "bounds": { - "height": 22, - "width": 30, - "x": 466, - "y": 1041 - }, - "confidence": 1, - "points": [ - [ - 466, - 1041 - ], - [ - 496, - 1041 - ], - [ - 496, - 1063 - ], - [ - 466, - 1063 - ] - ], - "text": "for" - }, - { - "bounds": { - "height": 22, - "width": 108, - "x": 505, - "y": 1041 - }, - "confidence": 1, - "points": [ - [ - 505, - 1041 - ], - [ - 613, - 1041 - ], - [ - 613, - 1063 - ], - [ - 505, - 1063 - ] - ], - "text": "estimated" - }, - { - "bounds": { - "height": 22, - "width": 77, - "x": 622, - "y": 1041 - }, - "confidence": 1, - "points": [ - [ - 622, - 1041 - ], - [ - 699, - 1041 - ], - [ - 699, - 1063 - ], - [ - 622, - 1063 - ] - ], - "text": "market" - }, - { - "bounds": { - "height": 19, - "width": 55, - "x": 708, - "y": 1044 - }, - "confidence": 1, - "points": [ - [ - 708, - 1044 - ], - [ - 763, - 1044 - ], - [ - 763, - 1063 - ], - [ - 708, - 1063 - ] - ], - "text": "rents" - }, - { - "bounds": { - "height": 22, - "width": 30, - "x": 769, - "y": 1041 - }, - "confidence": 1, - "points": [ - [ - 769, - 1041 - ], - [ - 799, - 1041 - ], - [ - 799, - 1063 - ], - [ - 769, - 1063 - ] - ], - "text": "for" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 805, - "y": 1041 - }, - "confidence": 1, - "points": [ - [ - 805, - 1041 - ], - [ - 841, - 1041 - ], - [ - 841, - 1063 - ], - [ - 805, - 1063 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 105, - "x": 849, - "y": 1041 - }, - "confidence": 1, - "points": [ - [ - 849, - 1041 - ], - [ - 954, - 1041 - ], - [ - 954, - 1063 - ], - [ - 849, - 1063 - ] - ], - "text": "individual" - }, - { - "bounds": { - "height": 27, - "width": 80, - "x": 963, - "y": 1041 - }, - "confidence": 1, - "points": [ - [ - 963, - 1041 - ], - [ - 1043, - 1041 - ], - [ - 1043, - 1068 - ], - [ - 963, - 1068 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 22, - "width": 52, - "x": 1050, - "y": 1041 - }, - "confidence": 1, - "points": [ - [ - 1050, - 1041 - ], - [ - 1102, - 1041 - ], - [ - 1102, - 1063 - ], - [ - 1050, - 1063 - ] - ], - "text": "units" - }, - { - "bounds": { - "height": 27, - "width": 105, - "x": 1111, - "y": 1041 - }, - "confidence": 1, - "points": [ - [ - 1111, - 1041 - ], - [ - 1216, - 1041 - ], - [ - 1216, - 1068 - ], - [ - 1111, - 1068 - ] - ], - "text": "(including" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1225, - "y": 1041 - }, - "confidence": 1, - "points": [ - [ - 1225, - 1041 - ], - [ - 1261, - 1041 - ], - [ - 1261, - 1063 - ], - [ - 1225, - 1063 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 136, - "x": 1269, - "y": 1041 - }, - "confidence": 1, - "points": [ - [ - 1269, - 1041 - ], - [ - 1405, - 1041 - ], - [ - 1405, - 1068 - ], - [ - 1269, - 1068 - ] - ], - "text": "adjustments" - }, - { - "bounds": { - "height": 25, - "width": 58, - "x": 1413, - "y": 1041 - }, - "confidence": 1, - "points": [ - [ - 1413, - 1041 - ], - [ - 1471, - 1041 - ], - [ - 1471, - 1066 - ], - [ - 1413, - 1066 - ] - ], - "text": "used," - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1480, - "y": 1041 - }, - "confidence": 1, - "points": [ - [ - 1480, - 1041 - ], - [ - 1516, - 1041 - ], - [ - 1516, - 1063 - ], - [ - 1480, - 1063 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 108, - "x": 1525, - "y": 1041 - }, - "confidence": 1, - "points": [ - [ - 1525, - 1041 - ], - [ - 1633, - 1041 - ], - [ - 1633, - 1068 - ], - [ - 1525, - 1068 - ] - ], - "text": "adequacy" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 69, - "y": 1072 - }, - "confidence": 1, - "points": [ - [ - 69, - 1072 - ], - [ - 91, - 1072 - ], - [ - 91, - 1094 - ], - [ - 69, - 1094 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 27, - "width": 150, - "x": 97, - "y": 1072 - }, - "confidence": 1, - "points": [ - [ - 97, - 1072 - ], - [ - 247, - 1072 - ], - [ - 247, - 1099 - ], - [ - 97, - 1099 - ] - ], - "text": "comparables," - }, - { - "bounds": { - "height": 22, - "width": 63, - "x": 255, - "y": 1072 - }, - "confidence": 1, - "points": [ - [ - 255, - 1072 - ], - [ - 318, - 1072 - ], - [ - 318, - 1094 - ], - [ - 255, - 1094 - ] - ], - "text": "rental" - }, - { - "bounds": { - "height": 25, - "width": 144, - "x": 327, - "y": 1072 - }, - "confidence": 1, - "points": [ - [ - 327, - 1072 - ], - [ - 471, - 1072 - ], - [ - 471, - 1097 - ], - [ - 327, - 1097 - ] - ], - "text": "concessions," - }, - { - "bounds": { - "height": 27, - "width": 47, - "x": 480, - "y": 1072 - }, - "confidence": 1, - "points": [ - [ - 480, - 1072 - ], - [ - 527, - 1072 - ], - [ - 527, - 1099 - ], - [ - 480, - 1099 - ] - ], - "text": "etc.)" - } - ] + "type": "paragraph" }, { "bounds": { @@ -47731,8 +11790,9 @@ "x": 74.52588, "y": 1101.3265 }, + "cells": null, "confidence": 0.75865275, - "id": "bc957cd2-8826-4d46-9f9b-a7d74983193f", + "id": "c5f45219-6a83-4248-9daa-853977b8e75b", "page": { "height": 2200, "pageIndex": 2, @@ -47760,401 +11820,7 @@ "readingOrder": 14, "role": "Text", "text": "rental is similar in size, age, and condition to the subject and supports Comparable_______________________________________________________________________________________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 58, - "x": 205, - "y": 1102 - }, - "confidence": 1, - "points": [ - [ - 205, - 1102 - ], - [ - 263, - 1102 - ], - [ - 263, - 1124 - ], - [ - 205, - 1124 - ] - ], - "text": "rental" - }, - { - "bounds": { - "height": 22, - "width": 16, - "x": 269, - "y": 1102 - }, - "confidence": 1, - "points": [ - [ - 269, - 1102 - ], - [ - 285, - 1102 - ], - [ - 285, - 1124 - ], - [ - 269, - 1124 - ] - ], - "text": "is" - }, - { - "bounds": { - "height": 22, - "width": 69, - "x": 291, - "y": 1102 - }, - "confidence": 1, - "points": [ - [ - 291, - 1102 - ], - [ - 360, - 1102 - ], - [ - 360, - 1124 - ], - [ - 291, - 1124 - ] - ], - "text": "similar" - }, - { - "bounds": { - "height": 22, - "width": 16, - "x": 366, - "y": 1102 - }, - "confidence": 1, - "points": [ - [ - 366, - 1102 - ], - [ - 382, - 1102 - ], - [ - 382, - 1124 - ], - [ - 366, - 1124 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 25, - "width": 47, - "x": 388, - "y": 1102 - }, - "confidence": 1, - "points": [ - [ - 388, - 1102 - ], - [ - 435, - 1102 - ], - [ - 435, - 1127 - ], - [ - 388, - 1127 - ] - ], - "text": "size," - }, - { - "bounds": { - "height": 22, - "width": 44, - "x": 441, - "y": 1108 - }, - "confidence": 1, - "points": [ - [ - 441, - 1108 - ], - [ - 485, - 1108 - ], - [ - 485, - 1130 - ], - [ - 441, - 1130 - ] - ], - "text": "age," - }, - { - "bounds": { - "height": 22, - "width": 38, - "x": 494, - "y": 1102 - }, - "confidence": 1, - "points": [ - [ - 494, - 1102 - ], - [ - 532, - 1102 - ], - [ - 532, - 1124 - ], - [ - 494, - 1124 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 22, - "width": 91, - "x": 538, - "y": 1102 - }, - "confidence": 1, - "points": [ - [ - 538, - 1102 - ], - [ - 629, - 1102 - ], - [ - 629, - 1124 - ], - [ - 538, - 1124 - ] - ], - "text": "condition" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 636, - "y": 1105 - }, - "confidence": 1, - "points": [ - [ - 636, - 1105 - ], - [ - 655, - 1105 - ], - [ - 655, - 1124 - ], - [ - 636, - 1124 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 22, - "width": 33, - "x": 661, - "y": 1102 - }, - "confidence": 1, - "points": [ - [ - 661, - 1102 - ], - [ - 694, - 1102 - ], - [ - 694, - 1124 - ], - [ - 661, - 1124 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 75, - "x": 700, - "y": 1102 - }, - "confidence": 1, - "points": [ - [ - 700, - 1102 - ], - [ - 775, - 1102 - ], - [ - 775, - 1129 - ], - [ - 700, - 1129 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 22, - "width": 38, - "x": 777, - "y": 1102 - }, - "confidence": 1, - "points": [ - [ - 777, - 1102 - ], - [ - 815, - 1102 - ], - [ - 815, - 1124 - ], - [ - 777, - 1124 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 25, - "width": 88, - "x": 822, - "y": 1105 - }, - "confidence": 1, - "points": [ - [ - 822, - 1105 - ], - [ - 910, - 1105 - ], - [ - 910, - 1130 - ], - [ - 822, - 1130 - ] - ], - "text": "supports" - }, - { - "bounds": { - "height": 27, - "width": 1547, - "x": 75, - "y": 1102 - }, - "confidence": 1, - "points": [ - [ - 75, - 1102 - ], - [ - 1622, - 1102 - ], - [ - 1622, - 1129 - ], - [ - 75, - 1129 - ] - ], - "text": "Comparable_______________________________________________________________________________________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -48163,8 +11829,9 @@ "x": 75, "y": 1133 }, + "cells": null, "confidence": 0.8107013, - "id": "0ddce95b-2c61-470b-bb4b-ade8d3ee8923", + "id": "029aabbd-dfbd-4ce9-8f32-157e7fb2fd4f", "page": { "height": 2200, "pageIndex": 2, @@ -48192,233 +11859,7 @@ "readingOrder": 15, "role": "Text", "text": "estimated market rents used in income approach. the_______________________________________________________________________________________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 100, - "x": 113, - "y": 1133 - }, - "confidence": 1, - "points": [ - [ - 113, - 1133 - ], - [ - 213, - 1133 - ], - [ - 213, - 1155 - ], - [ - 113, - 1155 - ] - ], - "text": "estimated" - }, - { - "bounds": { - "height": 22, - "width": 72, - "x": 219, - "y": 1133 - }, - "confidence": 1, - "points": [ - [ - 219, - 1133 - ], - [ - 291, - 1133 - ], - [ - 291, - 1155 - ], - [ - 219, - 1155 - ] - ], - "text": "market" - }, - { - "bounds": { - "height": 19, - "width": 47, - "x": 297, - "y": 1136 - }, - "confidence": 1, - "points": [ - [ - 297, - 1136 - ], - [ - 344, - 1136 - ], - [ - 344, - 1155 - ], - [ - 297, - 1155 - ] - ], - "text": "rents" - }, - { - "bounds": { - "height": 22, - "width": 50, - "x": 352, - "y": 1133 - }, - "confidence": 1, - "points": [ - [ - 352, - 1133 - ], - [ - 402, - 1133 - ], - [ - 402, - 1155 - ], - [ - 352, - 1155 - ] - ], - "text": "used" - }, - { - "bounds": { - "height": 22, - "width": 19, - "x": 408, - "y": 1133 - }, - "confidence": 1, - "points": [ - [ - 408, - 1133 - ], - [ - 427, - 1133 - ], - [ - 427, - 1155 - ], - [ - 408, - 1155 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 22, - "width": 72, - "x": 472, - "y": 1133 - }, - "confidence": 1, - "points": [ - [ - 472, - 1133 - ], - [ - 544, - 1133 - ], - [ - 544, - 1155 - ], - [ - 472, - 1155 - ] - ], - "text": "income" - }, - { - "bounds": { - "height": 27, - "width": 102, - "x": 550, - "y": 1133 - }, - "confidence": 1, - "points": [ - [ - 550, - 1133 - ], - [ - 652, - 1133 - ], - [ - 652, - 1160 - ], - [ - 550, - 1160 - ] - ], - "text": "approach." - }, - { - "bounds": { - "height": 25, - "width": 1547, - "x": 75, - "y": 1133 - }, - "confidence": 1, - "points": [ - [ - 75, - 1133 - ], - [ - 1622, - 1133 - ], - [ - 1622, - 1158 - ], - [ - 75, - 1158 - ] - ], - "text": "the_______________________________________________________________________________________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -48427,8 +11868,9 @@ "x": 66, "y": 1251.666 }, + "cells": null, "confidence": 0.9358579, - "id": "a12e764e-4bd5-414b-bb8c-dacbd09c26dd", + "id": "effaec2a-e8fe-42e2-a0b8-07f166a71685", "page": { "height": 2200, "pageIndex": 2, @@ -48456,3341 +11898,7 @@ "readingOrder": 16, "role": "Text", "text": "Subject’s rent schedule reconciles the applicable indicated monthly market rents to the appropriate subject unit, and provides the estimated\nrents for the subject property. The appraiser must review characteristics of the comparable sales to determine whether estimated rents\nshould reflect actual or market rents. For example, if actual rents were available on the sales comparables and used to derive the gross rent\nmultiplier (GRM), actual rents for the subject should be used. If market rents were used to construct the comparables’ rents and derive the\nGRM, market rents should be used. The total estimated rent must represent rent characteristic consistent with sales comparable data used to\nderive the GRM. The total gross estimated rent is not adjusted for vacancy.", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 100, - "x": 69, - "y": 1252 - }, - "confidence": 1, - "points": [ - [ - 69, - 1252 - ], - [ - 169, - 1252 - ], - [ - 169, - 1279 - ], - [ - 69, - 1279 - ] - ], - "text": "Subject’s" - }, - { - "bounds": { - "height": 19, - "width": 44, - "x": 177, - "y": 1255 - }, - "confidence": 1, - "points": [ - [ - 177, - 1255 - ], - [ - 221, - 1255 - ], - [ - 221, - 1274 - ], - [ - 177, - 1274 - ] - ], - "text": "rent" - }, - { - "bounds": { - "height": 22, - "width": 102, - "x": 227, - "y": 1252 - }, - "confidence": 1, - "points": [ - [ - 227, - 1252 - ], - [ - 329, - 1252 - ], - [ - 329, - 1274 - ], - [ - 227, - 1274 - ] - ], - "text": "schedule" - }, - { - "bounds": { - "height": 22, - "width": 111, - "x": 338, - "y": 1252 - }, - "confidence": 1, - "points": [ - [ - 338, - 1252 - ], - [ - 449, - 1252 - ], - [ - 449, - 1274 - ], - [ - 338, - 1274 - ] - ], - "text": "reconciles" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 458, - "y": 1252 - }, - "confidence": 1, - "points": [ - [ - 458, - 1252 - ], - [ - 494, - 1252 - ], - [ - 494, - 1274 - ], - [ - 458, - 1274 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 111, - "x": 502, - "y": 1252 - }, - "confidence": 1, - "points": [ - [ - 502, - 1252 - ], - [ - 613, - 1252 - ], - [ - 613, - 1279 - ], - [ - 502, - 1279 - ] - ], - "text": "applicable" - }, - { - "bounds": { - "height": 22, - "width": 100, - "x": 622, - "y": 1252 - }, - "confidence": 1, - "points": [ - [ - 622, - 1252 - ], - [ - 722, - 1252 - ], - [ - 722, - 1274 - ], - [ - 622, - 1274 - ] - ], - "text": "indicated" - }, - { - "bounds": { - "height": 27, - "width": 86, - "x": 733, - "y": 1252 - }, - "confidence": 1, - "points": [ - [ - 733, - 1252 - ], - [ - 819, - 1252 - ], - [ - 819, - 1279 - ], - [ - 733, - 1279 - ] - ], - "text": "monthly" - }, - { - "bounds": { - "height": 22, - "width": 77, - "x": 827, - "y": 1252 - }, - "confidence": 1, - "points": [ - [ - 827, - 1252 - ], - [ - 904, - 1252 - ], - [ - 904, - 1274 - ], - [ - 827, - 1274 - ] - ], - "text": "market" - }, - { - "bounds": { - "height": 19, - "width": 55, - "x": 913, - "y": 1255 - }, - "confidence": 1, - "points": [ - [ - 913, - 1255 - ], - [ - 968, - 1255 - ], - [ - 968, - 1274 - ], - [ - 913, - 1274 - ] - ], - "text": "rents" - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 974, - "y": 1255 - }, - "confidence": 1, - "points": [ - [ - 974, - 1255 - ], - [ - 996, - 1255 - ], - [ - 996, - 1274 - ], - [ - 974, - 1274 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1005, - "y": 1252 - }, - "confidence": 1, - "points": [ - [ - 1005, - 1252 - ], - [ - 1041, - 1252 - ], - [ - 1041, - 1274 - ], - [ - 1005, - 1274 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 127, - "x": 1050, - "y": 1252 - }, - "confidence": 1, - "points": [ - [ - 1050, - 1252 - ], - [ - 1177, - 1252 - ], - [ - 1177, - 1279 - ], - [ - 1050, - 1279 - ] - ], - "text": "appropriate" - }, - { - "bounds": { - "height": 27, - "width": 80, - "x": 1183, - "y": 1252 - }, - "confidence": 1, - "points": [ - [ - 1183, - 1252 - ], - [ - 1263, - 1252 - ], - [ - 1263, - 1279 - ], - [ - 1183, - 1279 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 25, - "width": 47, - "x": 1272, - "y": 1252 - }, - "confidence": 1, - "points": [ - [ - 1272, - 1252 - ], - [ - 1319, - 1252 - ], - [ - 1319, - 1277 - ], - [ - 1272, - 1277 - ] - ], - "text": "unit," - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 1327, - "y": 1252 - }, - "confidence": 1, - "points": [ - [ - 1327, - 1252 - ], - [ - 1368, - 1252 - ], - [ - 1368, - 1274 - ], - [ - 1327, - 1274 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 27, - "width": 94, - "x": 1377, - "y": 1252 - }, - "confidence": 1, - "points": [ - [ - 1377, - 1252 - ], - [ - 1471, - 1252 - ], - [ - 1471, - 1279 - ], - [ - 1377, - 1279 - ] - ], - "text": "provides" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1480, - "y": 1252 - }, - "confidence": 1, - "points": [ - [ - 1480, - 1252 - ], - [ - 1516, - 1252 - ], - [ - 1516, - 1274 - ], - [ - 1480, - 1274 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 108, - "x": 1525, - "y": 1252 - }, - "confidence": 1, - "points": [ - [ - 1525, - 1252 - ], - [ - 1633, - 1252 - ], - [ - 1633, - 1274 - ], - [ - 1525, - 1274 - ] - ], - "text": "estimated" - }, - { - "bounds": { - "height": 22, - "width": 55, - "x": 69, - "y": 1283 - }, - "confidence": 1, - "points": [ - [ - 69, - 1283 - ], - [ - 124, - 1283 - ], - [ - 124, - 1305 - ], - [ - 69, - 1305 - ] - ], - "text": "rents" - }, - { - "bounds": { - "height": 22, - "width": 30, - "x": 130, - "y": 1283 - }, - "confidence": 1, - "points": [ - [ - 130, - 1283 - ], - [ - 160, - 1283 - ], - [ - 160, - 1305 - ], - [ - 130, - 1305 - ] - ], - "text": "for" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 166, - "y": 1283 - }, - "confidence": 1, - "points": [ - [ - 166, - 1283 - ], - [ - 202, - 1283 - ], - [ - 202, - 1305 - ], - [ - 166, - 1305 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 25, - "width": 80, - "x": 211, - "y": 1283 - }, - "confidence": 1, - "points": [ - [ - 211, - 1283 - ], - [ - 291, - 1283 - ], - [ - 291, - 1308 - ], - [ - 211, - 1308 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 25, - "width": 94, - "x": 300, - "y": 1283 - }, - "confidence": 1, - "points": [ - [ - 300, - 1283 - ], - [ - 394, - 1283 - ], - [ - 394, - 1308 - ], - [ - 300, - 1308 - ] - ], - "text": "property." - }, - { - "bounds": { - "height": 22, - "width": 44, - "x": 400, - "y": 1283 - }, - "confidence": 1, - "points": [ - [ - 400, - 1283 - ], - [ - 444, - 1283 - ], - [ - 444, - 1305 - ], - [ - 400, - 1305 - ] - ], - "text": "The" - }, - { - "bounds": { - "height": 25, - "width": 105, - "x": 452, - "y": 1283 - }, - "confidence": 1, - "points": [ - [ - 452, - 1283 - ], - [ - 557, - 1283 - ], - [ - 557, - 1308 - ], - [ - 452, - 1308 - ] - ], - "text": "appraiser" - }, - { - "bounds": { - "height": 22, - "width": 55, - "x": 563, - "y": 1283 - }, - "confidence": 1, - "points": [ - [ - 563, - 1283 - ], - [ - 618, - 1283 - ], - [ - 618, - 1305 - ], - [ - 563, - 1305 - ] - ], - "text": "must" - }, - { - "bounds": { - "height": 22, - "width": 69, - "x": 627, - "y": 1283 - }, - "confidence": 1, - "points": [ - [ - 627, - 1283 - ], - [ - 696, - 1283 - ], - [ - 696, - 1305 - ], - [ - 627, - 1305 - ] - ], - "text": "review" - }, - { - "bounds": { - "height": 22, - "width": 161, - "x": 705, - "y": 1283 - }, - "confidence": 1, - "points": [ - [ - 705, - 1283 - ], - [ - 866, - 1283 - ], - [ - 866, - 1305 - ], - [ - 705, - 1305 - ] - ], - "text": "characteristics" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 872, - "y": 1283 - }, - "confidence": 1, - "points": [ - [ - 872, - 1283 - ], - [ - 894, - 1283 - ], - [ - 894, - 1305 - ], - [ - 872, - 1305 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 899, - "y": 1283 - }, - "confidence": 1, - "points": [ - [ - 899, - 1283 - ], - [ - 935, - 1283 - ], - [ - 935, - 1305 - ], - [ - 899, - 1305 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 25, - "width": 130, - "x": 944, - "y": 1283 - }, - "confidence": 1, - "points": [ - [ - 944, - 1283 - ], - [ - 1074, - 1283 - ], - [ - 1074, - 1308 - ], - [ - 944, - 1308 - ] - ], - "text": "comparable" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 1080, - "y": 1283 - }, - "confidence": 1, - "points": [ - [ - 1080, - 1283 - ], - [ - 1141, - 1283 - ], - [ - 1141, - 1305 - ], - [ - 1080, - 1305 - ] - ], - "text": "sales" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 1147, - "y": 1283 - }, - "confidence": 1, - "points": [ - [ - 1147, - 1283 - ], - [ - 1169, - 1283 - ], - [ - 1169, - 1305 - ], - [ - 1147, - 1305 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 22, - "width": 111, - "x": 1177, - "y": 1283 - }, - "confidence": 1, - "points": [ - [ - 1177, - 1283 - ], - [ - 1288, - 1283 - ], - [ - 1288, - 1305 - ], - [ - 1177, - 1305 - ] - ], - "text": "determine" - }, - { - "bounds": { - "height": 22, - "width": 91, - "x": 1297, - "y": 1283 - }, - "confidence": 1, - "points": [ - [ - 1297, - 1283 - ], - [ - 1388, - 1283 - ], - [ - 1388, - 1305 - ], - [ - 1297, - 1305 - ] - ], - "text": "whether" - }, - { - "bounds": { - "height": 22, - "width": 108, - "x": 1394, - "y": 1283 - }, - "confidence": 1, - "points": [ - [ - 1394, - 1283 - ], - [ - 1502, - 1283 - ], - [ - 1502, - 1305 - ], - [ - 1394, - 1305 - ] - ], - "text": "estimated" - }, - { - "bounds": { - "height": 22, - "width": 55, - "x": 1511, - "y": 1283 - }, - "confidence": 1, - "points": [ - [ - 1511, - 1283 - ], - [ - 1566, - 1283 - ], - [ - 1566, - 1305 - ], - [ - 1511, - 1305 - ] - ], - "text": "rents" - }, - { - "bounds": { - "height": 19, - "width": 72, - "x": 69, - "y": 1313 - }, - "confidence": 1, - "points": [ - [ - 69, - 1313 - ], - [ - 141, - 1313 - ], - [ - 141, - 1332 - ], - [ - 69, - 1332 - ] - ], - "text": "should" - }, - { - "bounds": { - "height": 19, - "width": 69, - "x": 150, - "y": 1313 - }, - "confidence": 1, - "points": [ - [ - 150, - 1313 - ], - [ - 219, - 1313 - ], - [ - 219, - 1332 - ], - [ - 150, - 1332 - ] - ], - "text": "reflect" - }, - { - "bounds": { - "height": 19, - "width": 66, - "x": 224, - "y": 1313 - }, - "confidence": 1, - "points": [ - [ - 224, - 1313 - ], - [ - 290, - 1313 - ], - [ - 290, - 1332 - ], - [ - 224, - 1332 - ] - ], - "text": "actual" - }, - { - "bounds": { - "height": 16, - "width": 25, - "x": 300, - "y": 1316 - }, - "confidence": 1, - "points": [ - [ - 300, - 1316 - ], - [ - 325, - 1316 - ], - [ - 325, - 1332 - ], - [ - 300, - 1332 - ] - ], - "text": "or" - }, - { - "bounds": { - "height": 19, - "width": 77, - "x": 330, - "y": 1313 - }, - "confidence": 1, - "points": [ - [ - 330, - 1313 - ], - [ - 407, - 1313 - ], - [ - 407, - 1332 - ], - [ - 330, - 1332 - ] - ], - "text": "market" - }, - { - "bounds": { - "height": 19, - "width": 61, - "x": 416, - "y": 1313 - }, - "confidence": 1, - "points": [ - [ - 416, - 1313 - ], - [ - 477, - 1313 - ], - [ - 477, - 1332 - ], - [ - 416, - 1332 - ] - ], - "text": "rents." - }, - { - "bounds": { - "height": 19, - "width": 38, - "x": 486, - "y": 1313 - }, - "confidence": 1, - "points": [ - [ - 486, - 1313 - ], - [ - 524, - 1313 - ], - [ - 524, - 1332 - ], - [ - 486, - 1332 - ] - ], - "text": "For" - }, - { - "bounds": { - "height": 25, - "width": 100, - "x": 530, - "y": 1313 - }, - "confidence": 1, - "points": [ - [ - 530, - 1313 - ], - [ - 630, - 1313 - ], - [ - 630, - 1338 - ], - [ - 530, - 1338 - ] - ], - "text": "example," - }, - { - "bounds": { - "height": 19, - "width": 13, - "x": 638, - "y": 1313 - }, - "confidence": 1, - "points": [ - [ - 638, - 1313 - ], - [ - 651, - 1313 - ], - [ - 651, - 1332 - ], - [ - 638, - 1332 - ] - ], - "text": "if" - }, - { - "bounds": { - "height": 19, - "width": 66, - "x": 661, - "y": 1313 - }, - "confidence": 1, - "points": [ - [ - 661, - 1313 - ], - [ - 727, - 1313 - ], - [ - 727, - 1332 - ], - [ - 661, - 1332 - ] - ], - "text": "actual" - }, - { - "bounds": { - "height": 19, - "width": 55, - "x": 736, - "y": 1313 - }, - "confidence": 1, - "points": [ - [ - 736, - 1313 - ], - [ - 791, - 1313 - ], - [ - 791, - 1332 - ], - [ - 736, - 1332 - ] - ], - "text": "rents" - }, - { - "bounds": { - "height": 16, - "width": 55, - "x": 797, - "y": 1316 - }, - "confidence": 1, - "points": [ - [ - 797, - 1316 - ], - [ - 852, - 1316 - ], - [ - 852, - 1332 - ], - [ - 797, - 1332 - ] - ], - "text": "were" - }, - { - "bounds": { - "height": 19, - "width": 97, - "x": 861, - "y": 1313 - }, - "confidence": 1, - "points": [ - [ - 861, - 1313 - ], - [ - 958, - 1313 - ], - [ - 958, - 1332 - ], - [ - 861, - 1332 - ] - ], - "text": "available" - }, - { - "bounds": { - "height": 16, - "width": 27, - "x": 966, - "y": 1316 - }, - "confidence": 1, - "points": [ - [ - 966, - 1316 - ], - [ - 993, - 1316 - ], - [ - 993, - 1332 - ], - [ - 966, - 1332 - ] - ], - "text": "on" - }, - { - "bounds": { - "height": 19, - "width": 36, - "x": 1002, - "y": 1313 - }, - "confidence": 1, - "points": [ - [ - 1002, - 1313 - ], - [ - 1038, - 1313 - ], - [ - 1038, - 1332 - ], - [ - 1002, - 1332 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 19, - "width": 58, - "x": 1044, - "y": 1313 - }, - "confidence": 1, - "points": [ - [ - 1044, - 1313 - ], - [ - 1102, - 1313 - ], - [ - 1102, - 1332 - ], - [ - 1044, - 1332 - ] - ], - "text": "sales" - }, - { - "bounds": { - "height": 25, - "width": 144, - "x": 1111, - "y": 1313 - }, - "confidence": 1, - "points": [ - [ - 1111, - 1313 - ], - [ - 1255, - 1313 - ], - [ - 1255, - 1338 - ], - [ - 1111, - 1338 - ] - ], - "text": "comparables" - }, - { - "bounds": { - "height": 19, - "width": 41, - "x": 1261, - "y": 1313 - }, - "confidence": 1, - "points": [ - [ - 1261, - 1313 - ], - [ - 1302, - 1313 - ], - [ - 1302, - 1332 - ], - [ - 1261, - 1332 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 19, - "width": 55, - "x": 1311, - "y": 1313 - }, - "confidence": 1, - "points": [ - [ - 1311, - 1313 - ], - [ - 1366, - 1313 - ], - [ - 1366, - 1332 - ], - [ - 1311, - 1332 - ] - ], - "text": "used" - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 1372, - "y": 1313 - }, - "confidence": 1, - "points": [ - [ - 1372, - 1313 - ], - [ - 1394, - 1313 - ], - [ - 1394, - 1332 - ], - [ - 1372, - 1332 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 19, - "width": 69, - "x": 1402, - "y": 1313 - }, - "confidence": 1, - "points": [ - [ - 1402, - 1313 - ], - [ - 1471, - 1313 - ], - [ - 1471, - 1332 - ], - [ - 1402, - 1332 - ] - ], - "text": "derive" - }, - { - "bounds": { - "height": 19, - "width": 36, - "x": 1477, - "y": 1313 - }, - "confidence": 1, - "points": [ - [ - 1477, - 1313 - ], - [ - 1513, - 1313 - ], - [ - 1513, - 1332 - ], - [ - 1477, - 1332 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 63, - "x": 1519, - "y": 1316 - }, - "confidence": 1, - "points": [ - [ - 1519, - 1316 - ], - [ - 1582, - 1316 - ], - [ - 1582, - 1338 - ], - [ - 1519, - 1338 - ] - ], - "text": "gross" - }, - { - "bounds": { - "height": 19, - "width": 41, - "x": 1591, - "y": 1313 - }, - "confidence": 1, - "points": [ - [ - 1591, - 1313 - ], - [ - 1632, - 1313 - ], - [ - 1632, - 1332 - ], - [ - 1591, - 1332 - ] - ], - "text": "rent" - }, - { - "bounds": { - "height": 27, - "width": 100, - "x": 69, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 69, - 1341 - ], - [ - 169, - 1341 - ], - [ - 169, - 1368 - ], - [ - 69, - 1368 - ] - ], - "text": "multiplier" - }, - { - "bounds": { - "height": 27, - "width": 80, - "x": 177, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 177, - 1341 - ], - [ - 257, - 1341 - ], - [ - 257, - 1368 - ], - [ - 177, - 1368 - ] - ], - "text": "(GRM)," - }, - { - "bounds": { - "height": 22, - "width": 66, - "x": 263, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 263, - 1341 - ], - [ - 329, - 1341 - ], - [ - 329, - 1363 - ], - [ - 263, - 1363 - ] - ], - "text": "actual" - }, - { - "bounds": { - "height": 19, - "width": 55, - "x": 338, - "y": 1344 - }, - "confidence": 1, - "points": [ - [ - 338, - 1344 - ], - [ - 393, - 1344 - ], - [ - 393, - 1363 - ], - [ - 338, - 1363 - ] - ], - "text": "rents" - }, - { - "bounds": { - "height": 22, - "width": 30, - "x": 402, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 402, - 1341 - ], - [ - 432, - 1341 - ], - [ - 432, - 1363 - ], - [ - 402, - 1363 - ] - ], - "text": "for" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 438, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 438, - 1341 - ], - [ - 474, - 1341 - ], - [ - 474, - 1363 - ], - [ - 438, - 1363 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 80, - "x": 480, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 480, - 1341 - ], - [ - 560, - 1341 - ], - [ - 560, - 1368 - ], - [ - 480, - 1368 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 22, - "width": 72, - "x": 569, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 569, - 1341 - ], - [ - 641, - 1341 - ], - [ - 641, - 1363 - ], - [ - 569, - 1363 - ] - ], - "text": "should" - }, - { - "bounds": { - "height": 22, - "width": 27, - "x": 650, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 650, - 1341 - ], - [ - 677, - 1341 - ], - [ - 677, - 1363 - ], - [ - 650, - 1363 - ] - ], - "text": "be" - }, - { - "bounds": { - "height": 22, - "width": 58, - "x": 686, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 686, - 1341 - ], - [ - 744, - 1341 - ], - [ - 744, - 1363 - ], - [ - 686, - 1363 - ] - ], - "text": "used." - }, - { - "bounds": { - "height": 22, - "width": 13, - "x": 755, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 755, - 1341 - ], - [ - 768, - 1341 - ], - [ - 768, - 1363 - ], - [ - 755, - 1363 - ] - ], - "text": "If" - }, - { - "bounds": { - "height": 22, - "width": 77, - "x": 775, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 775, - 1341 - ], - [ - 852, - 1341 - ], - [ - 852, - 1363 - ], - [ - 775, - 1363 - ] - ], - "text": "market" - }, - { - "bounds": { - "height": 19, - "width": 55, - "x": 858, - "y": 1344 - }, - "confidence": 1, - "points": [ - [ - 858, - 1344 - ], - [ - 913, - 1344 - ], - [ - 913, - 1363 - ], - [ - 858, - 1363 - ] - ], - "text": "rents" - }, - { - "bounds": { - "height": 16, - "width": 55, - "x": 922, - "y": 1347 - }, - "confidence": 1, - "points": [ - [ - 922, - 1347 - ], - [ - 977, - 1347 - ], - [ - 977, - 1363 - ], - [ - 922, - 1363 - ] - ], - "text": "were" - }, - { - "bounds": { - "height": 22, - "width": 55, - "x": 983, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 983, - 1341 - ], - [ - 1038, - 1341 - ], - [ - 1038, - 1363 - ], - [ - 983, - 1363 - ] - ], - "text": "used" - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 1044, - "y": 1344 - }, - "confidence": 1, - "points": [ - [ - 1044, - 1344 - ], - [ - 1066, - 1344 - ], - [ - 1066, - 1363 - ], - [ - 1044, - 1363 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 19, - "width": 102, - "x": 1072, - "y": 1344 - }, - "confidence": 1, - "points": [ - [ - 1072, - 1344 - ], - [ - 1174, - 1344 - ], - [ - 1174, - 1363 - ], - [ - 1072, - 1363 - ] - ], - "text": "construct" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1180, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 1180, - 1341 - ], - [ - 1216, - 1341 - ], - [ - 1216, - 1363 - ], - [ - 1180, - 1363 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 150, - "x": 1225, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 1225, - 1341 - ], - [ - 1375, - 1341 - ], - [ - 1375, - 1368 - ], - [ - 1225, - 1368 - ] - ], - "text": "comparables’" - }, - { - "bounds": { - "height": 19, - "width": 55, - "x": 1380, - "y": 1344 - }, - "confidence": 1, - "points": [ - [ - 1380, - 1344 - ], - [ - 1435, - 1344 - ], - [ - 1435, - 1363 - ], - [ - 1380, - 1363 - ] - ], - "text": "rents" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 1444, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 1444, - 1341 - ], - [ - 1485, - 1341 - ], - [ - 1485, - 1363 - ], - [ - 1444, - 1363 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 22, - "width": 69, - "x": 1491, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 1491, - 1341 - ], - [ - 1560, - 1341 - ], - [ - 1560, - 1363 - ], - [ - 1491, - 1363 - ] - ], - "text": "derive" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1569, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 1569, - 1341 - ], - [ - 1605, - 1341 - ], - [ - 1605, - 1363 - ], - [ - 1569, - 1363 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 25, - "width": 63, - "x": 69, - "y": 1372 - }, - "confidence": 1, - "points": [ - [ - 69, - 1372 - ], - [ - 132, - 1372 - ], - [ - 132, - 1397 - ], - [ - 69, - 1397 - ] - ], - "text": "GRM," - }, - { - "bounds": { - "height": 22, - "width": 77, - "x": 141, - "y": 1372 - }, - "confidence": 1, - "points": [ - [ - 141, - 1372 - ], - [ - 218, - 1372 - ], - [ - 218, - 1394 - ], - [ - 141, - 1394 - ] - ], - "text": "market" - }, - { - "bounds": { - "height": 19, - "width": 55, - "x": 227, - "y": 1375 - }, - "confidence": 1, - "points": [ - [ - 227, - 1375 - ], - [ - 282, - 1375 - ], - [ - 282, - 1394 - ], - [ - 227, - 1394 - ] - ], - "text": "rents" - }, - { - "bounds": { - "height": 22, - "width": 75, - "x": 288, - "y": 1372 - }, - "confidence": 1, - "points": [ - [ - 288, - 1372 - ], - [ - 363, - 1372 - ], - [ - 363, - 1394 - ], - [ - 288, - 1394 - ] - ], - "text": "should" - }, - { - "bounds": { - "height": 22, - "width": 30, - "x": 369, - "y": 1372 - }, - "confidence": 1, - "points": [ - [ - 369, - 1372 - ], - [ - 399, - 1372 - ], - [ - 399, - 1394 - ], - [ - 369, - 1394 - ] - ], - "text": "be" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 405, - "y": 1372 - }, - "confidence": 1, - "points": [ - [ - 405, - 1372 - ], - [ - 466, - 1372 - ], - [ - 466, - 1394 - ], - [ - 405, - 1394 - ] - ], - "text": "used." - }, - { - "bounds": { - "height": 22, - "width": 44, - "x": 472, - "y": 1372 - }, - "confidence": 1, - "points": [ - [ - 472, - 1372 - ], - [ - 516, - 1372 - ], - [ - 516, - 1394 - ], - [ - 472, - 1394 - ] - ], - "text": "The" - }, - { - "bounds": { - "height": 22, - "width": 47, - "x": 522, - "y": 1372 - }, - "confidence": 1, - "points": [ - [ - 522, - 1372 - ], - [ - 569, - 1372 - ], - [ - 569, - 1394 - ], - [ - 522, - 1394 - ] - ], - "text": "total" - }, - { - "bounds": { - "height": 22, - "width": 108, - "x": 577, - "y": 1372 - }, - "confidence": 1, - "points": [ - [ - 577, - 1372 - ], - [ - 685, - 1372 - ], - [ - 685, - 1394 - ], - [ - 577, - 1394 - ] - ], - "text": "estimated" - }, - { - "bounds": { - "height": 19, - "width": 44, - "x": 694, - "y": 1375 - }, - "confidence": 1, - "points": [ - [ - 694, - 1375 - ], - [ - 738, - 1375 - ], - [ - 738, - 1394 - ], - [ - 694, - 1394 - ] - ], - "text": "rent" - }, - { - "bounds": { - "height": 19, - "width": 55, - "x": 744, - "y": 1375 - }, - "confidence": 1, - "points": [ - [ - 744, - 1375 - ], - [ - 799, - 1375 - ], - [ - 799, - 1394 - ], - [ - 744, - 1394 - ] - ], - "text": "must" - }, - { - "bounds": { - "height": 25, - "width": 105, - "x": 808, - "y": 1375 - }, - "confidence": 1, - "points": [ - [ - 808, - 1375 - ], - [ - 913, - 1375 - ], - [ - 913, - 1400 - ], - [ - 808, - 1400 - ] - ], - "text": "represent" - }, - { - "bounds": { - "height": 19, - "width": 44, - "x": 919, - "y": 1375 - }, - "confidence": 1, - "points": [ - [ - 919, - 1375 - ], - [ - 963, - 1375 - ], - [ - 963, - 1394 - ], - [ - 919, - 1394 - ] - ], - "text": "rent" - }, - { - "bounds": { - "height": 22, - "width": 150, - "x": 969, - "y": 1372 - }, - "confidence": 1, - "points": [ - [ - 969, - 1372 - ], - [ - 1119, - 1372 - ], - [ - 1119, - 1394 - ], - [ - 969, - 1394 - ] - ], - "text": "characteristic" - }, - { - "bounds": { - "height": 22, - "width": 113, - "x": 1125, - "y": 1372 - }, - "confidence": 1, - "points": [ - [ - 1125, - 1372 - ], - [ - 1238, - 1372 - ], - [ - 1238, - 1394 - ], - [ - 1125, - 1394 - ] - ], - "text": "consistent" - }, - { - "bounds": { - "height": 22, - "width": 47, - "x": 1244, - "y": 1372 - }, - "confidence": 1, - "points": [ - [ - 1244, - 1372 - ], - [ - 1291, - 1372 - ], - [ - 1291, - 1394 - ], - [ - 1244, - 1394 - ] - ], - "text": "with" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 1297, - "y": 1372 - }, - "confidence": 1, - "points": [ - [ - 1297, - 1372 - ], - [ - 1358, - 1372 - ], - [ - 1358, - 1394 - ], - [ - 1297, - 1394 - ] - ], - "text": "sales" - }, - { - "bounds": { - "height": 27, - "width": 130, - "x": 1363, - "y": 1372 - }, - "confidence": 1, - "points": [ - [ - 1363, - 1372 - ], - [ - 1493, - 1372 - ], - [ - 1493, - 1399 - ], - [ - 1363, - 1399 - ] - ], - "text": "comparable" - }, - { - "bounds": { - "height": 22, - "width": 50, - "x": 1502, - "y": 1372 - }, - "confidence": 1, - "points": [ - [ - 1502, - 1372 - ], - [ - 1552, - 1372 - ], - [ - 1552, - 1394 - ], - [ - 1502, - 1394 - ] - ], - "text": "data" - }, - { - "bounds": { - "height": 22, - "width": 55, - "x": 1558, - "y": 1372 - }, - "confidence": 1, - "points": [ - [ - 1558, - 1372 - ], - [ - 1613, - 1372 - ], - [ - 1613, - 1394 - ], - [ - 1558, - 1394 - ] - ], - "text": "used" - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 1619, - "y": 1375 - }, - "confidence": 1, - "points": [ - [ - 1619, - 1375 - ], - [ - 1641, - 1375 - ], - [ - 1641, - 1394 - ], - [ - 1619, - 1394 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 22, - "width": 69, - "x": 66, - "y": 1402 - }, - "confidence": 1, - "points": [ - [ - 66, - 1402 - ], - [ - 135, - 1402 - ], - [ - 135, - 1424 - ], - [ - 66, - 1424 - ] - ], - "text": "derive" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 144, - "y": 1402 - }, - "confidence": 1, - "points": [ - [ - 144, - 1402 - ], - [ - 180, - 1402 - ], - [ - 180, - 1424 - ], - [ - 144, - 1424 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 63, - "x": 186, - "y": 1402 - }, - "confidence": 1, - "points": [ - [ - 186, - 1402 - ], - [ - 249, - 1402 - ], - [ - 249, - 1424 - ], - [ - 186, - 1424 - ] - ], - "text": "GRM." - }, - { - "bounds": { - "height": 22, - "width": 44, - "x": 255, - "y": 1402 - }, - "confidence": 1, - "points": [ - [ - 255, - 1402 - ], - [ - 299, - 1402 - ], - [ - 299, - 1424 - ], - [ - 255, - 1424 - ] - ], - "text": "The" - }, - { - "bounds": { - "height": 22, - "width": 47, - "x": 305, - "y": 1402 - }, - "confidence": 1, - "points": [ - [ - 305, - 1402 - ], - [ - 352, - 1402 - ], - [ - 352, - 1424 - ], - [ - 305, - 1424 - ] - ], - "text": "total" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 361, - "y": 1408 - }, - "confidence": 1, - "points": [ - [ - 361, - 1408 - ], - [ - 422, - 1408 - ], - [ - 422, - 1430 - ], - [ - 361, - 1430 - ] - ], - "text": "gross" - }, - { - "bounds": { - "height": 22, - "width": 108, - "x": 430, - "y": 1402 - }, - "confidence": 1, - "points": [ - [ - 430, - 1402 - ], - [ - 538, - 1402 - ], - [ - 538, - 1424 - ], - [ - 430, - 1424 - ] - ], - "text": "estimated" - }, - { - "bounds": { - "height": 19, - "width": 41, - "x": 547, - "y": 1405 - }, - "confidence": 1, - "points": [ - [ - 547, - 1405 - ], - [ - 588, - 1405 - ], - [ - 588, - 1424 - ], - [ - 547, - 1424 - ] - ], - "text": "rent" - }, - { - "bounds": { - "height": 22, - "width": 16, - "x": 597, - "y": 1402 - }, - "confidence": 1, - "points": [ - [ - 597, - 1402 - ], - [ - 613, - 1402 - ], - [ - 613, - 1424 - ], - [ - 597, - 1424 - ] - ], - "text": "is" - }, - { - "bounds": { - "height": 19, - "width": 36, - "x": 622, - "y": 1405 - }, - "confidence": 1, - "points": [ - [ - 622, - 1405 - ], - [ - 658, - 1405 - ], - [ - 658, - 1424 - ], - [ - 622, - 1424 - ] - ], - "text": "not" - }, - { - "bounds": { - "height": 27, - "width": 94, - "x": 663, - "y": 1402 - }, - "confidence": 1, - "points": [ - [ - 663, - 1402 - ], - [ - 757, - 1402 - ], - [ - 757, - 1429 - ], - [ - 663, - 1429 - ] - ], - "text": "adjusted" - }, - { - "bounds": { - "height": 22, - "width": 27, - "x": 766, - "y": 1402 - }, - "confidence": 1, - "points": [ - [ - 766, - 1402 - ], - [ - 793, - 1402 - ], - [ - 793, - 1424 - ], - [ - 766, - 1424 - ] - ], - "text": "for" - }, - { - "bounds": { - "height": 22, - "width": 97, - "x": 800, - "y": 1408 - }, - "confidence": 1, - "points": [ - [ - 800, - 1408 - ], - [ - 897, - 1408 - ], - [ - 897, - 1430 - ], - [ - 800, - 1430 - ] - ], - "text": "vacancy." - } - ] + "type": "paragraph" }, { "bounds": { @@ -51799,8 +11907,9 @@ "x": 67.41051, "y": 1672 }, + "cells": null, "confidence": 0.7630623, - "id": "10e06364-d3bf-4beb-8182-d0ee672157d3", + "id": "23bf6346-b1f8-4b0a-b1cf-a2a849a5e16e", "page": { "height": 2200, "pageIndex": 2, @@ -51828,121 +11937,7 @@ "readingOrder": 17, "role": "Text", "text": "Other monthly income (itemize)", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 63, - "x": 69, - "y": 1672 - }, - "confidence": 1, - "points": [ - [ - 69, - 1672 - ], - [ - 132, - 1672 - ], - [ - 132, - 1694 - ], - [ - 69, - 1694 - ] - ], - "text": "Other" - }, - { - "bounds": { - "height": 27, - "width": 88, - "x": 138, - "y": 1672 - }, - "confidence": 1, - "points": [ - [ - 138, - 1672 - ], - [ - 226, - 1672 - ], - [ - 226, - 1699 - ], - [ - 138, - 1699 - ] - ], - "text": "monthly" - }, - { - "bounds": { - "height": 22, - "width": 80, - "x": 236, - "y": 1672 - }, - "confidence": 1, - "points": [ - [ - 236, - 1672 - ], - [ - 316, - 1672 - ], - [ - 316, - 1694 - ], - [ - 236, - 1694 - ] - ], - "text": "income" - }, - { - "bounds": { - "height": 27, - "width": 94, - "x": 325, - "y": 1672 - }, - "confidence": 1, - "points": [ - [ - 325, - 1672 - ], - [ - 419, - 1672 - ], - [ - 419, - 1699 - ], - [ - 325, - 1699 - ] - ], - "text": "(itemize)" - } - ] + "type": "paragraph" }, { "bounds": { @@ -51951,8 +11946,9 @@ "x": 66, "y": 1702 }, + "cells": null, "confidence": 0.61560583, - "id": "8a53f17b-1d3c-4822-9dc0-bf693b367601", + "id": "bfa22230-91e8-4043-8c8a-bb98990cd611", "page": { "height": 2200, "pageIndex": 2, @@ -51980,345 +11976,7 @@ "readingOrder": 18, "role": "Text", "text": "Vacancy: Actual last year 5___ Estimated Annually Total gross estimated rent$ 27,600_________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 27, - "width": 102, - "x": 66, - "y": 1702 - }, - "confidence": 1, - "points": [ - [ - 66, - 1702 - ], - [ - 168, - 1702 - ], - [ - 168, - 1729 - ], - [ - 66, - 1729 - ] - ], - "text": "Vacancy:" - }, - { - "bounds": { - "height": 22, - "width": 69, - "x": 175, - "y": 1702 - }, - "confidence": 1, - "points": [ - [ - 175, - 1702 - ], - [ - 244, - 1702 - ], - [ - 244, - 1724 - ], - [ - 175, - 1724 - ] - ], - "text": "Actual" - }, - { - "bounds": { - "height": 22, - "width": 38, - "x": 252, - "y": 1702 - }, - "confidence": 1, - "points": [ - [ - 252, - 1702 - ], - [ - 290, - 1702 - ], - [ - 290, - 1724 - ], - [ - 252, - 1724 - ] - ], - "text": "last" - }, - { - "bounds": { - "height": 22, - "width": 50, - "x": 300, - "y": 1708 - }, - "confidence": 1, - "points": [ - [ - 300, - 1708 - ], - [ - 350, - 1708 - ], - [ - 350, - 1730 - ], - [ - 300, - 1730 - ] - ], - "text": "year" - }, - { - "bounds": { - "height": 22, - "width": 47, - "x": 352, - "y": 1705 - }, - "confidence": 1, - "points": [ - [ - 352, - 1705 - ], - [ - 399, - 1705 - ], - [ - 399, - 1727 - ], - [ - 352, - 1727 - ] - ], - "text": "5___" - }, - { - "bounds": { - "height": 22, - "width": 108, - "x": 713, - "y": 1702 - }, - "confidence": 1, - "points": [ - [ - 713, - 1702 - ], - [ - 821, - 1702 - ], - [ - 821, - 1724 - ], - [ - 713, - 1724 - ] - ], - "text": "Estimated" - }, - { - "bounds": { - "height": 27, - "width": 97, - "x": 1063, - "y": 1702 - }, - "confidence": 1, - "points": [ - [ - 1063, - 1702 - ], - [ - 1160, - 1702 - ], - [ - 1160, - 1729 - ], - [ - 1063, - 1729 - ] - ], - "text": "Annually" - }, - { - "bounds": { - "height": 22, - "width": 52, - "x": 1180, - "y": 1702 - }, - "confidence": 1, - "points": [ - [ - 1180, - 1702 - ], - [ - 1232, - 1702 - ], - [ - 1232, - 1724 - ], - [ - 1180, - 1724 - ] - ], - "text": "Total" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 1241, - "y": 1708 - }, - "confidence": 1, - "points": [ - [ - 1241, - 1708 - ], - [ - 1302, - 1708 - ], - [ - 1302, - 1730 - ], - [ - 1241, - 1730 - ] - ], - "text": "gross" - }, - { - "bounds": { - "height": 22, - "width": 108, - "x": 1311, - "y": 1702 - }, - "confidence": 1, - "points": [ - [ - 1311, - 1702 - ], - [ - 1419, - 1702 - ], - [ - 1419, - 1724 - ], - [ - 1311, - 1724 - ] - ], - "text": "estimated" - }, - { - "bounds": { - "height": 25, - "width": 55, - "x": 1427, - "y": 1702 - }, - "confidence": 1, - "points": [ - [ - 1427, - 1702 - ], - [ - 1482, - 1702 - ], - [ - 1482, - 1727 - ], - [ - 1427, - 1727 - ] - ], - "text": "rent$" - }, - { - "bounds": { - "height": 22, - "width": 130, - "x": 1491, - "y": 1705 - }, - "confidence": 1, - "points": [ - [ - 1491, - 1705 - ], - [ - 1621, - 1705 - ], - [ - 1621, - 1727 - ], - [ - 1491, - 1727 - ] - ], - "text": "27,600_________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -52327,8 +11985,9 @@ "x": 68.44714, "y": 1732.2156 }, + "cells": null, "confidence": 0.7038179, - "id": "09d346c0-a605-4bac-82e0-ff34bccfb1ea", + "id": "a5e5aa6f-0162-483f-807e-667a4888e5b1", "page": { "height": 2200, "pageIndex": 2, @@ -52356,569 +12015,7 @@ "readingOrder": 19, "role": "Text", "text": "Utilities included in estimated rent ❐ Electric ❐ Water 4 ❐ Sewer 4 ❐ Gas ❐ Oil ❐ Trash Collection", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 80, - "x": 69, - "y": 1733 - }, - "confidence": 1, - "points": [ - [ - 69, - 1733 - ], - [ - 149, - 1733 - ], - [ - 149, - 1755 - ], - [ - 69, - 1755 - ] - ], - "text": "Utilities" - }, - { - "bounds": { - "height": 22, - "width": 94, - "x": 155, - "y": 1733 - }, - "confidence": 1, - "points": [ - [ - 155, - 1733 - ], - [ - 249, - 1733 - ], - [ - 249, - 1755 - ], - [ - 155, - 1755 - ] - ], - "text": "included" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 255, - "y": 1733 - }, - "confidence": 1, - "points": [ - [ - 255, - 1733 - ], - [ - 274, - 1733 - ], - [ - 274, - 1752 - ], - [ - 255, - 1752 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 22, - "width": 111, - "x": 280, - "y": 1733 - }, - "confidence": 1, - "points": [ - [ - 280, - 1733 - ], - [ - 391, - 1733 - ], - [ - 391, - 1755 - ], - [ - 280, - 1755 - ] - ], - "text": "estimated" - }, - { - "bounds": { - "height": 22, - "width": 44, - "x": 397, - "y": 1733 - }, - "confidence": 1, - "points": [ - [ - 397, - 1733 - ], - [ - 441, - 1733 - ], - [ - 441, - 1755 - ], - [ - 397, - 1755 - ] - ], - "text": "rent" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 461, - "y": 1733 - }, - "confidence": 1, - "points": [ - [ - 461, - 1733 - ], - [ - 480, - 1733 - ], - [ - 480, - 1752 - ], - [ - 461, - 1752 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 80, - "x": 488, - "y": 1733 - }, - "confidence": 1, - "points": [ - [ - 488, - 1733 - ], - [ - 568, - 1733 - ], - [ - 568, - 1755 - ], - [ - 488, - 1755 - ] - ], - "text": "Electric" - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 588, - "y": 1733 - }, - "confidence": 1, - "points": [ - [ - 588, - 1733 - ], - [ - 610, - 1733 - ], - [ - 610, - 1752 - ], - [ - 588, - 1752 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 66, - "x": 616, - "y": 1733 - }, - "confidence": 1, - "points": [ - [ - 616, - 1733 - ], - [ - 682, - 1733 - ], - [ - 682, - 1755 - ], - [ - 616, - 1755 - ] - ], - "text": "Water" - }, - { - "bounds": { - "height": 11, - "width": 13, - "x": 702, - "y": 1736 - }, - "confidence": 1, - "points": [ - [ - 702, - 1736 - ], - [ - 715, - 1736 - ], - [ - 715, - 1747 - ], - [ - 702, - 1747 - ] - ], - "text": "4" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 702, - "y": 1733 - }, - "confidence": 1, - "points": [ - [ - 702, - 1733 - ], - [ - 721, - 1733 - ], - [ - 721, - 1752 - ], - [ - 702, - 1752 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 72, - "x": 727, - "y": 1733 - }, - "confidence": 1, - "points": [ - [ - 727, - 1733 - ], - [ - 799, - 1733 - ], - [ - 799, - 1755 - ], - [ - 727, - 1755 - ] - ], - "text": "Sewer" - }, - { - "bounds": { - "height": 11, - "width": 13, - "x": 822, - "y": 1736 - }, - "confidence": 1, - "points": [ - [ - 822, - 1736 - ], - [ - 835, - 1736 - ], - [ - 835, - 1747 - ], - [ - 822, - 1747 - ] - ], - "text": "4" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 819, - "y": 1733 - }, - "confidence": 1, - "points": [ - [ - 819, - 1733 - ], - [ - 838, - 1733 - ], - [ - 838, - 1752 - ], - [ - 819, - 1752 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 47, - "x": 844, - "y": 1733 - }, - "confidence": 1, - "points": [ - [ - 844, - 1733 - ], - [ - 891, - 1733 - ], - [ - 891, - 1755 - ], - [ - 844, - 1755 - ] - ], - "text": "Gas" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 911, - "y": 1733 - }, - "confidence": 1, - "points": [ - [ - 911, - 1733 - ], - [ - 930, - 1733 - ], - [ - 930, - 1752 - ], - [ - 911, - 1752 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 30, - "x": 936, - "y": 1733 - }, - "confidence": 1, - "points": [ - [ - 936, - 1733 - ], - [ - 966, - 1733 - ], - [ - 966, - 1755 - ], - [ - 936, - 1755 - ] - ], - "text": "Oil" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 988, - "y": 1733 - }, - "confidence": 1, - "points": [ - [ - 988, - 1733 - ], - [ - 1007, - 1733 - ], - [ - 1007, - 1752 - ], - [ - 988, - 1752 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 1013, - "y": 1733 - }, - "confidence": 1, - "points": [ - [ - 1013, - 1733 - ], - [ - 1074, - 1733 - ], - [ - 1074, - 1755 - ], - [ - 1013, - 1755 - ] - ], - "text": "Trash" - }, - { - "bounds": { - "height": 22, - "width": 111, - "x": 1080, - "y": 1733 - }, - "confidence": 1, - "points": [ - [ - 1080, - 1733 - ], - [ - 1191, - 1733 - ], - [ - 1191, - 1755 - ], - [ - 1080, - 1755 - ] - ], - "text": "Collection" - } - ] + "type": "paragraph" }, { "bounds": { @@ -52927,8 +12024,9 @@ "x": 1180.4036, "y": 1701.9899 }, + "cells": null, "confidence": 0.5716726, - "id": "84f17237-4999-4364-b58d-962661906531", + "id": "5d215ff4-fe05-4e5e-bd90-cb0f8d0df335", "page": { "height": 2200, "pageIndex": 2, @@ -52965,8 +12063,9 @@ "x": 1062.8385, "y": 1703.0668 }, + "cells": null, "confidence": 0.55812323, - "id": "ea3f711a-7c3d-4b56-ab80-18ffe8ddc55f", + "id": "2762eb7b-8849-4c88-aacd-0c50b5f3aee9", "page": { "height": 2200, "pageIndex": 2, @@ -53003,8 +12102,9 @@ "x": 988.1458, "y": 1733.1675 }, + "cells": null, "confidence": 0.7368785, - "id": "71b66e27-d6d9-4d8f-bbbd-ff0513570d7c", + "id": "842fe8c9-1dff-455c-87c5-58ba31ef73c4", "page": { "height": 2200, "pageIndex": 2, @@ -53041,8 +12141,9 @@ "x": 461.15814, "y": 1733.1561 }, + "cells": null, "confidence": 0.7338908, - "id": "2c0bb4e5-5868-49e1-a136-76fc75699091", + "id": "84d99bfe-858b-4f8d-98d0-549f2b1a16db", "page": { "height": 2200, "pageIndex": 2, @@ -53079,8 +12180,9 @@ "x": 713.0072, "y": 1702.4014 }, + "cells": null, "confidence": 0.4933789, - "id": "17af4178-bec2-451c-89bc-ef7d7bf4aa73", + "id": "cf6393cf-9d1c-4bca-a1b7-ea51bbed6850", "page": { "height": 2200, "pageIndex": 2, @@ -53117,8 +12219,9 @@ "x": 701.56525, "y": 1733.2775 }, + "cells": null, "confidence": 0.6640657, - "id": "1b096259-8618-44a6-8b66-ec1db9157822", + "id": "a249224e-60a7-475b-9c4f-7629f418b90f", "page": { "height": 2200, "pageIndex": 2, @@ -53155,8 +12258,9 @@ "x": 590.0267, "y": 1733.0808 }, + "cells": null, "confidence": 0.68600935, - "id": "9841fb17-8fe7-419f-bdf3-df5fd445a769", + "id": "27c0b0a4-3aa2-42d3-9733-b280aa63cadc", "page": { "height": 2200, "pageIndex": 2, @@ -53193,8 +12297,9 @@ "x": 819.26605, "y": 1732.9629 }, + "cells": null, "confidence": 0.7763996, - "id": "b6690e56-b559-489a-b847-ce0c46b2fb3f", + "id": "729915cb-03a2-4f5a-a0b0-ec1bf6dd4cb6", "page": { "height": 2200, "pageIndex": 2, @@ -53231,8 +12336,9 @@ "x": 911.82715, "y": 1733.5411 }, + "cells": null, "confidence": 0.6607714, - "id": "41d00262-2442-4990-ae17-97fbcda27359", + "id": "58dad446-fa13-4fdf-b7a4-67c5cad9efb0", "page": { "height": 2200, "pageIndex": 2, @@ -53269,8 +12375,9 @@ "x": 67.60096, "y": 1791 }, + "cells": null, "confidence": 0.61418545, - "id": "88a330eb-dbc3-4446-a9b7-da123bb868f4", + "id": "67825baa-6f98-479a-afd5-96a5b8972db9", "page": { "height": 2200, "pageIndex": 2, @@ -53298,849 +12405,7 @@ "readingOrder": 29, "role": "Text", "text": "Comments on the rent schedule, actual rents, estimated rents (especially regarding differences between actual and estimated rents),\nutilities, etc.: rents are supported by comparable rental data in the immediate Estimated_____________________________________________________________________________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 119, - "x": 69, - "y": 1791 - }, - "confidence": 1, - "points": [ - [ - 69, - 1791 - ], - [ - 188, - 1791 - ], - [ - 188, - 1813 - ], - [ - 69, - 1813 - ] - ], - "text": "Comments" - }, - { - "bounds": { - "height": 16, - "width": 27, - "x": 197, - "y": 1797 - }, - "confidence": 1, - "points": [ - [ - 197, - 1797 - ], - [ - 224, - 1797 - ], - [ - 224, - 1813 - ], - [ - 197, - 1813 - ] - ], - "text": "on" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 233, - "y": 1791 - }, - "confidence": 1, - "points": [ - [ - 233, - 1791 - ], - [ - 269, - 1791 - ], - [ - 269, - 1813 - ], - [ - 233, - 1813 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 19, - "width": 44, - "x": 277, - "y": 1794 - }, - "confidence": 1, - "points": [ - [ - 277, - 1794 - ], - [ - 321, - 1794 - ], - [ - 321, - 1813 - ], - [ - 277, - 1813 - ] - ], - "text": "rent" - }, - { - "bounds": { - "height": 25, - "width": 108, - "x": 327, - "y": 1791 - }, - "confidence": 1, - "points": [ - [ - 327, - 1791 - ], - [ - 435, - 1791 - ], - [ - 435, - 1816 - ], - [ - 327, - 1816 - ] - ], - "text": "schedule," - }, - { - "bounds": { - "height": 22, - "width": 66, - "x": 444, - "y": 1791 - }, - "confidence": 1, - "points": [ - [ - 444, - 1791 - ], - [ - 510, - 1791 - ], - [ - 510, - 1813 - ], - [ - 444, - 1813 - ] - ], - "text": "actual" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 519, - "y": 1794 - }, - "confidence": 1, - "points": [ - [ - 519, - 1794 - ], - [ - 580, - 1794 - ], - [ - 580, - 1816 - ], - [ - 519, - 1816 - ] - ], - "text": "rents," - }, - { - "bounds": { - "height": 22, - "width": 111, - "x": 588, - "y": 1791 - }, - "confidence": 1, - "points": [ - [ - 588, - 1791 - ], - [ - 699, - 1791 - ], - [ - 699, - 1813 - ], - [ - 588, - 1813 - ] - ], - "text": "estimated" - }, - { - "bounds": { - "height": 19, - "width": 55, - "x": 708, - "y": 1794 - }, - "confidence": 1, - "points": [ - [ - 708, - 1794 - ], - [ - 763, - 1794 - ], - [ - 763, - 1813 - ], - [ - 708, - 1813 - ] - ], - "text": "rents" - }, - { - "bounds": { - "height": 27, - "width": 116, - "x": 772, - "y": 1791 - }, - "confidence": 1, - "points": [ - [ - 772, - 1791 - ], - [ - 888, - 1791 - ], - [ - 888, - 1818 - ], - [ - 772, - 1818 - ] - ], - "text": "(especially" - }, - { - "bounds": { - "height": 27, - "width": 105, - "x": 897, - "y": 1791 - }, - "confidence": 1, - "points": [ - [ - 897, - 1791 - ], - [ - 1002, - 1791 - ], - [ - 1002, - 1818 - ], - [ - 897, - 1818 - ] - ], - "text": "regarding" - }, - { - "bounds": { - "height": 22, - "width": 122, - "x": 1011, - "y": 1791 - }, - "confidence": 1, - "points": [ - [ - 1011, - 1791 - ], - [ - 1133, - 1791 - ], - [ - 1133, - 1813 - ], - [ - 1011, - 1813 - ] - ], - "text": "differences" - }, - { - "bounds": { - "height": 22, - "width": 94, - "x": 1141, - "y": 1791 - }, - "confidence": 1, - "points": [ - [ - 1141, - 1791 - ], - [ - 1235, - 1791 - ], - [ - 1235, - 1813 - ], - [ - 1141, - 1813 - ] - ], - "text": "between" - }, - { - "bounds": { - "height": 22, - "width": 66, - "x": 1244, - "y": 1791 - }, - "confidence": 1, - "points": [ - [ - 1244, - 1791 - ], - [ - 1310, - 1791 - ], - [ - 1310, - 1813 - ], - [ - 1244, - 1813 - ] - ], - "text": "actual" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 1319, - "y": 1791 - }, - "confidence": 1, - "points": [ - [ - 1319, - 1791 - ], - [ - 1360, - 1791 - ], - [ - 1360, - 1813 - ], - [ - 1319, - 1813 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 22, - "width": 108, - "x": 1369, - "y": 1791 - }, - "confidence": 1, - "points": [ - [ - 1369, - 1791 - ], - [ - 1477, - 1791 - ], - [ - 1477, - 1813 - ], - [ - 1369, - 1813 - ] - ], - "text": "estimated" - }, - { - "bounds": { - "height": 27, - "width": 69, - "x": 1488, - "y": 1791 - }, - "confidence": 1, - "points": [ - [ - 1488, - 1791 - ], - [ - 1557, - 1791 - ], - [ - 1557, - 1818 - ], - [ - 1488, - 1818 - ] - ], - "text": "rents)," - }, - { - "bounds": { - "height": 25, - "width": 80, - "x": 69, - "y": 1822 - }, - "confidence": 1, - "points": [ - [ - 69, - 1822 - ], - [ - 149, - 1822 - ], - [ - 149, - 1847 - ], - [ - 69, - 1847 - ] - ], - "text": "utilities," - }, - { - "bounds": { - "height": 19, - "width": 47, - "x": 158, - "y": 1824 - }, - "confidence": 1, - "points": [ - [ - 158, - 1824 - ], - [ - 205, - 1824 - ], - [ - 205, - 1843 - ], - [ - 158, - 1843 - ] - ], - "text": "etc.:" - }, - { - "bounds": { - "height": 19, - "width": 50, - "x": 322, - "y": 1824 - }, - "confidence": 1, - "points": [ - [ - 322, - 1824 - ], - [ - 372, - 1824 - ], - [ - 372, - 1843 - ], - [ - 322, - 1843 - ] - ], - "text": "rents" - }, - { - "bounds": { - "height": 16, - "width": 33, - "x": 377, - "y": 1827 - }, - "confidence": 1, - "points": [ - [ - 377, - 1827 - ], - [ - 410, - 1827 - ], - [ - 410, - 1843 - ], - [ - 377, - 1843 - ] - ], - "text": "are" - }, - { - "bounds": { - "height": 27, - "width": 102, - "x": 419, - "y": 1822 - }, - "confidence": 1, - "points": [ - [ - 419, - 1822 - ], - [ - 521, - 1822 - ], - [ - 521, - 1849 - ], - [ - 419, - 1849 - ] - ], - "text": "supported" - }, - { - "bounds": { - "height": 27, - "width": 25, - "x": 527, - "y": 1822 - }, - "confidence": 1, - "points": [ - [ - 527, - 1822 - ], - [ - 552, - 1822 - ], - [ - 552, - 1849 - ], - [ - 527, - 1849 - ] - ], - "text": "by" - }, - { - "bounds": { - "height": 27, - "width": 119, - "x": 558, - "y": 1822 - }, - "confidence": 1, - "points": [ - [ - 558, - 1822 - ], - [ - 677, - 1822 - ], - [ - 677, - 1849 - ], - [ - 558, - 1849 - ] - ], - "text": "comparable" - }, - { - "bounds": { - "height": 22, - "width": 58, - "x": 683, - "y": 1822 - }, - "confidence": 1, - "points": [ - [ - 683, - 1822 - ], - [ - 741, - 1822 - ], - [ - 741, - 1844 - ], - [ - 683, - 1844 - ] - ], - "text": "rental" - }, - { - "bounds": { - "height": 22, - "width": 44, - "x": 747, - "y": 1822 - }, - "confidence": 1, - "points": [ - [ - 747, - 1822 - ], - [ - 791, - 1822 - ], - [ - 791, - 1844 - ], - [ - 747, - 1844 - ] - ], - "text": "data" - }, - { - "bounds": { - "height": 22, - "width": 16, - "x": 800, - "y": 1822 - }, - "confidence": 1, - "points": [ - [ - 800, - 1822 - ], - [ - 816, - 1822 - ], - [ - 816, - 1844 - ], - [ - 800, - 1844 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 22, - "width": 33, - "x": 822, - "y": 1822 - }, - "confidence": 1, - "points": [ - [ - 822, - 1822 - ], - [ - 855, - 1822 - ], - [ - 855, - 1844 - ], - [ - 822, - 1844 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 105, - "x": 861, - "y": 1822 - }, - "confidence": 1, - "points": [ - [ - 861, - 1822 - ], - [ - 966, - 1822 - ], - [ - 966, - 1844 - ], - [ - 861, - 1844 - ] - ], - "text": "immediate" - }, - { - "bounds": { - "height": 25, - "width": 1408, - "x": 213, - "y": 1822 - }, - "confidence": 1, - "points": [ - [ - 213, - 1822 - ], - [ - 1621, - 1822 - ], - [ - 1621, - 1847 - ], - [ - 213, - 1847 - ] - ], - "text": "Estimated_____________________________________________________________________________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -54149,8 +12414,9 @@ "x": 75, "y": 1850.347 }, + "cells": null, "confidence": 0.80477077, - "id": "8549235a-9837-4486-b1f4-ae40a908cc1c", + "id": "9b4a139b-d9f3-41cb-a323-2baaa4485926", "page": { "height": 2200, "pageIndex": 2, @@ -54178,317 +12444,7 @@ "readingOrder": 30, "role": "Text", "text": "vacancy and collection loss estimated at 5%, consistent with market. neighborhood;_______________________________________________________________________________________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 86, - "x": 227, - "y": 1858 - }, - "confidence": 1, - "points": [ - [ - 227, - 1858 - ], - [ - 313, - 1858 - ], - [ - 313, - 1877 - ], - [ - 227, - 1877 - ] - ], - "text": "vacancy" - }, - { - "bounds": { - "height": 19, - "width": 38, - "x": 316, - "y": 1852 - }, - "confidence": 1, - "points": [ - [ - 316, - 1852 - ], - [ - 354, - 1852 - ], - [ - 354, - 1871 - ], - [ - 316, - 1871 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 19, - "width": 94, - "x": 363, - "y": 1852 - }, - "confidence": 1, - "points": [ - [ - 363, - 1852 - ], - [ - 457, - 1852 - ], - [ - 457, - 1871 - ], - [ - 363, - 1871 - ] - ], - "text": "collection" - }, - { - "bounds": { - "height": 19, - "width": 38, - "x": 466, - "y": 1852 - }, - "confidence": 1, - "points": [ - [ - 466, - 1852 - ], - [ - 504, - 1852 - ], - [ - 504, - 1871 - ], - [ - 466, - 1871 - ] - ], - "text": "loss" - }, - { - "bounds": { - "height": 19, - "width": 100, - "x": 511, - "y": 1852 - }, - "confidence": 1, - "points": [ - [ - 511, - 1852 - ], - [ - 611, - 1852 - ], - [ - 611, - 1871 - ], - [ - 511, - 1871 - ] - ], - "text": "estimated" - }, - { - "bounds": { - "height": 16, - "width": 22, - "x": 616, - "y": 1855 - }, - "confidence": 1, - "points": [ - [ - 616, - 1855 - ], - [ - 638, - 1855 - ], - [ - 638, - 1871 - ], - [ - 616, - 1871 - ] - ], - "text": "at" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 644, - "y": 1852 - }, - "confidence": 1, - "points": [ - [ - 644, - 1852 - ], - [ - 680, - 1852 - ], - [ - 680, - 1874 - ], - [ - 644, - 1874 - ] - ], - "text": "5%," - }, - { - "bounds": { - "height": 19, - "width": 105, - "x": 688, - "y": 1852 - }, - "confidence": 1, - "points": [ - [ - 688, - 1852 - ], - [ - 793, - 1852 - ], - [ - 793, - 1871 - ], - [ - 688, - 1871 - ] - ], - "text": "consistent" - }, - { - "bounds": { - "height": 19, - "width": 41, - "x": 797, - "y": 1852 - }, - "confidence": 1, - "points": [ - [ - 797, - 1852 - ], - [ - 838, - 1852 - ], - [ - 838, - 1871 - ], - [ - 797, - 1871 - ] - ], - "text": "with" - }, - { - "bounds": { - "height": 19, - "width": 75, - "x": 847, - "y": 1852 - }, - "confidence": 1, - "points": [ - [ - 847, - 1852 - ], - [ - 922, - 1852 - ], - [ - 922, - 1871 - ], - [ - 847, - 1871 - ] - ], - "text": "market." - }, - { - "bounds": { - "height": 25, - "width": 1547, - "x": 75, - "y": 1852 - }, - "confidence": 1, - "points": [ - [ - 75, - 1852 - ], - [ - 1622, - 1852 - ], - [ - 1622, - 1877 - ], - [ - 75, - 1877 - ] - ], - "text": "neighborhood;_______________________________________________________________________________________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -54497,8 +12453,9 @@ "x": 377, "y": 321.04608 }, + "cells": null, "confidence": 0.5549172, - "id": "d9933fb7-0aeb-4881-81f8-289d1829c012", + "id": "b37325ce-34d6-47f3-aa1d-8692757cf893", "page": { "height": 2200, "pageIndex": 2, @@ -54526,37 +12483,7 @@ "readingOrder": 31, "role": "Text", "text": "N/A", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 16, - "width": 30, - "x": 377, - "y": 325 - }, - "confidence": 1, - "points": [ - [ - 377, - 325 - ], - [ - 407, - 325 - ], - [ - 407, - 341 - ], - [ - 377, - 341 - ] - ], - "text": "N/A" - } - ] + "type": "paragraph" }, { "bounds": { @@ -54565,8 +12492,9 @@ "x": 377, "y": 352.81042 }, + "cells": null, "confidence": 0.5265371, - "id": "56ff4963-c13a-4c8c-88dd-80c7a3aba13b", + "id": "9baf2999-a445-4ec2-93ea-7b7d52de085c", "page": { "height": 2200, "pageIndex": 2, @@ -54594,37 +12522,7 @@ "readingOrder": 32, "role": "Text", "text": "N/A", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 16, - "width": 30, - "x": 377, - "y": 355 - }, - "confidence": 1, - "points": [ - [ - 377, - 355 - ], - [ - 407, - 355 - ], - [ - 407, - 371 - ], - [ - 377, - 371 - ] - ], - "text": "N/A" - } - ] + "type": "paragraph" }, { "bounds": { @@ -54633,8 +12531,9 @@ "x": 375, "y": 411 }, + "cells": null, "confidence": 0.6055975, - "id": "f9af643c-5445-4ade-a5e2-7934024c0c76", + "id": "81af65da-69bb-4fcf-ac82-36e9f1d2f03d", "page": { "height": 2200, "pageIndex": 2, @@ -54662,65 +12561,7 @@ "readingOrder": 33, "role": "Text", "text": "07/2026 07/2026", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 16, - "width": 69, - "x": 375, - "y": 413 - }, - "confidence": 1, - "points": [ - [ - 375, - 413 - ], - [ - 444, - 413 - ], - [ - 444, - 429 - ], - [ - 375, - 429 - ] - ], - "text": "07/2026" - }, - { - "bounds": { - "height": 16, - "width": 69, - "x": 663, - "y": 411 - }, - "confidence": 1, - "points": [ - [ - 663, - 411 - ], - [ - 732, - 411 - ], - [ - 732, - 427 - ], - [ - 663, - 427 - ] - ], - "text": "07/2026" - } - ] + "type": "paragraph" }, { "bounds": { @@ -54729,8 +12570,9 @@ "x": 377, "y": 438 }, + "cells": null, "confidence": 0.6863562, - "id": "31ed9c29-8bfa-41c6-a5e7-005fa6c363ff", + "id": "97414c25-f1a7-4096-b2bc-cf35d94bf98b", "page": { "height": 2200, "pageIndex": 2, @@ -54758,121 +12600,7 @@ "readingOrder": 34, "role": "Text", "text": "Owner/Lease records MLS/Property Manager", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 124, - "x": 377, - "y": 441 - }, - "confidence": 1, - "points": [ - [ - 377, - 441 - ], - [ - 501, - 441 - ], - [ - 501, - 460 - ], - [ - 377, - 460 - ] - ], - "text": "Owner/Lease" - }, - { - "bounds": { - "height": 19, - "width": 66, - "x": 508, - "y": 441 - }, - "confidence": 1, - "points": [ - [ - 508, - 441 - ], - [ - 574, - 441 - ], - [ - 574, - 460 - ], - [ - 508, - 460 - ] - ], - "text": "records" - }, - { - "bounds": { - "height": 25, - "width": 127, - "x": 663, - "y": 438 - }, - "confidence": 1, - "points": [ - [ - 663, - 438 - ], - [ - 790, - 438 - ], - [ - 790, - 463 - ], - [ - 663, - 463 - ] - ], - "text": "MLS/Property" - }, - { - "bounds": { - "height": 25, - "width": 83, - "x": 797, - "y": 438 - }, - "confidence": 1, - "points": [ - [ - 797, - 438 - ], - [ - 880, - 438 - ], - [ - 880, - 463 - ], - [ - 797, - 463 - ] - ], - "text": "Manager" - } - ] + "type": "paragraph" }, { "bounds": { @@ -54881,8 +12609,9 @@ "x": 384.51797, "y": 467.8128 }, + "cells": null, "confidence": 0.69086385, - "id": "2167175e-cc7a-4f9d-b10a-ab933e21fd1f", + "id": "87a66cc8-ba91-4b2f-877e-5d5a204162b9", "page": { "height": 2200, "pageIndex": 2, @@ -54910,261 +12639,7 @@ "readingOrder": 35, "role": "Text", "text": "No. Units None No. Vac.None No. Units No. Vac.", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 36, - "x": 388, - "y": 469 - }, - "confidence": 1, - "points": [ - [ - 388, - 469 - ], - [ - 424, - 469 - ], - [ - 424, - 491 - ], - [ - 388, - 491 - ] - ], - "text": "No." - }, - { - "bounds": { - "height": 22, - "width": 58, - "x": 430, - "y": 469 - }, - "confidence": 1, - "points": [ - [ - 430, - 469 - ], - [ - 488, - 469 - ], - [ - 488, - 491 - ], - [ - 430, - 491 - ] - ], - "text": "Units" - }, - { - "bounds": { - "height": 16, - "width": 44, - "x": 488, - "y": 472 - }, - "confidence": 1, - "points": [ - [ - 488, - 472 - ], - [ - 532, - 472 - ], - [ - 532, - 488 - ], - [ - 488, - 488 - ] - ], - "text": "None" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 533, - "y": 469 - }, - "confidence": 1, - "points": [ - [ - 533, - 469 - ], - [ - 569, - 469 - ], - [ - 569, - 491 - ], - [ - 533, - 491 - ] - ], - "text": "No." - }, - { - "bounds": { - "height": 22, - "width": 97, - "x": 575, - "y": 469 - }, - "confidence": 1, - "points": [ - [ - 575, - 469 - ], - [ - 672, - 469 - ], - [ - 672, - 491 - ], - [ - 575, - 491 - ] - ], - "text": "Vac.None" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 675, - "y": 469 - }, - "confidence": 1, - "points": [ - [ - 675, - 469 - ], - [ - 711, - 469 - ], - [ - 711, - 491 - ], - [ - 675, - 491 - ] - ], - "text": "No." - }, - { - "bounds": { - "height": 22, - "width": 55, - "x": 719, - "y": 469 - }, - "confidence": 1, - "points": [ - [ - 719, - 469 - ], - [ - 774, - 469 - ], - [ - 774, - 491 - ], - [ - 719, - 491 - ] - ], - "text": "Units" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 849, - "y": 469 - }, - "confidence": 1, - "points": [ - [ - 849, - 469 - ], - [ - 885, - 469 - ], - [ - 885, - 491 - ], - [ - 849, - 491 - ] - ], - "text": "No." - }, - { - "bounds": { - "height": 22, - "width": 47, - "x": 891, - "y": 469 - }, - "confidence": 1, - "points": [ - [ - 891, - 469 - ], - [ - 938, - 469 - ], - [ - 938, - 491 - ], - [ - 891, - 491 - ] - ], - "text": "Vac." - } - ] + "type": "paragraph" }, { "bounds": { @@ -55173,8 +12648,9 @@ "x": 384.44684, "y": 499 }, + "cells": null, "confidence": 0.6685508, - "id": "891061b1-bd8a-4ee7-9a4b-1a940e06de77", + "id": "dffc444f-e777-4a34-8e2a-63e85c81129b", "page": { "height": 2200, "pageIndex": 2, @@ -55202,121 +12678,7 @@ "readingOrder": 36, "role": "Text", "text": "Yr. Blt: Yr. Blt:", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 30, - "x": 388, - "y": 499 - }, - "confidence": 1, - "points": [ - [ - 388, - 499 - ], - [ - 418, - 499 - ], - [ - 418, - 518 - ], - [ - 388, - 518 - ] - ], - "text": "Yr." - }, - { - "bounds": { - "height": 19, - "width": 36, - "x": 424, - "y": 499 - }, - "confidence": 1, - "points": [ - [ - 424, - 499 - ], - [ - 460, - 499 - ], - [ - 460, - 518 - ], - [ - 424, - 518 - ] - ], - "text": "Blt:" - }, - { - "bounds": { - "height": 19, - "width": 30, - "x": 675, - "y": 499 - }, - "confidence": 1, - "points": [ - [ - 675, - 499 - ], - [ - 705, - 499 - ], - [ - 705, - 518 - ], - [ - 675, - 518 - ] - ], - "text": "Yr." - }, - { - "bounds": { - "height": 19, - "width": 36, - "x": 711, - "y": 499 - }, - "confidence": 1, - "points": [ - [ - 711, - 499 - ], - [ - 747, - 499 - ], - [ - 747, - 518 - ], - [ - 711, - 518 - ] - ], - "text": "Blt:" - } - ] + "type": "paragraph" }, { "bounds": { @@ -55325,8 +12687,9 @@ "x": 686, "y": 227 }, + "cells": null, "confidence": 0.5279237, - "id": "976f79a1-8628-4cbd-b05d-cbc18e46d980", + "id": "4b338a5c-00f2-414d-a743-0d472415464a", "page": { "height": 2200, "pageIndex": 2, @@ -55354,93 +12717,7 @@ "readingOrder": 37, "role": "Text", "text": "COMPARABLE NO. 1", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 172, - "x": 686, - "y": 227 - }, - "confidence": 1, - "points": [ - [ - 686, - 227 - ], - [ - 858, - 227 - ], - [ - 858, - 249 - ], - [ - 686, - 249 - ] - ], - "text": "COMPARABLE" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 866, - "y": 227 - }, - "confidence": 1, - "points": [ - [ - 866, - 227 - ], - [ - 907, - 227 - ], - [ - 907, - 249 - ], - [ - 866, - 249 - ] - ], - "text": "NO." - }, - { - "bounds": { - "height": 19, - "width": 8, - "x": 916, - "y": 230 - }, - "confidence": 1, - "points": [ - [ - 916, - 230 - ], - [ - 924, - 230 - ], - [ - 924, - 249 - ], - [ - 916, - 249 - ] - ], - "text": "1" - } - ] + "type": "paragraph" }, { "bounds": { @@ -55449,8 +12726,9 @@ "x": 663, "y": 276.56833 }, + "cells": null, "confidence": 0.5965391, - "id": "861ebc4d-6684-4435-82de-09fed38c850e", + "id": "6bbd2c5b-a174-4641-9319-ede0b5b29092", "page": { "height": 2200, "pageIndex": 2, @@ -55478,149 +12756,7 @@ "readingOrder": 38, "role": "Text", "text": "1522 Maple Ridge Court, Springfield,", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 50, - "x": 663, - "y": 280 - }, - "confidence": 1, - "points": [ - [ - 663, - 280 - ], - [ - 713, - 280 - ], - [ - 713, - 299 - ], - [ - 663, - 299 - ] - ], - "text": "1522" - }, - { - "bounds": { - "height": 27, - "width": 61, - "x": 722, - "y": 277 - }, - "confidence": 1, - "points": [ - [ - 722, - 277 - ], - [ - 783, - 277 - ], - [ - 783, - 304 - ], - [ - 722, - 304 - ] - ], - "text": "Maple" - }, - { - "bounds": { - "height": 27, - "width": 58, - "x": 791, - "y": 277 - }, - "confidence": 1, - "points": [ - [ - 791, - 277 - ], - [ - 849, - 277 - ], - [ - 849, - 304 - ], - [ - 791, - 304 - ] - ], - "text": "Ridge" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 855, - "y": 280 - }, - "confidence": 1, - "points": [ - [ - 855, - 280 - ], - [ - 916, - 280 - ], - [ - 916, - 302 - ], - [ - 855, - 302 - ] - ], - "text": "Court," - }, - { - "bounds": { - "height": 27, - "width": 113, - "x": 924, - "y": 277 - }, - "confidence": 1, - "points": [ - [ - 924, - 277 - ], - [ - 1037, - 277 - ], - [ - 1037, - 304 - ], - [ - 924, - 304 - ] - ], - "text": "Springfield," - } - ] + "type": "paragraph" }, { "bounds": { @@ -55629,8 +12765,9 @@ "x": 663, "y": 319.26242 }, + "cells": null, "confidence": 0.6922569, - "id": "0cc4c2df-fff1-41dc-9d0a-6848342736e7", + "id": "4df930eb-62eb-41c7-ad0b-9e5eb6b41b76", "page": { "height": 2200, "pageIndex": 2, @@ -55658,93 +12795,7 @@ "readingOrder": 39, "role": "Text", "text": "0.4 miles north", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 16, - "width": 27, - "x": 663, - "y": 322 - }, - "confidence": 1, - "points": [ - [ - 663, - 322 - ], - [ - 690, - 322 - ], - [ - 690, - 338 - ], - [ - 663, - 338 - ] - ], - "text": "0.4" - }, - { - "bounds": { - "height": 16, - "width": 41, - "x": 697, - "y": 322 - }, - "confidence": 1, - "points": [ - [ - 697, - 322 - ], - [ - 738, - 322 - ], - [ - 738, - 338 - ], - [ - 697, - 338 - ] - ], - "text": "miles" - }, - { - "bounds": { - "height": 16, - "width": 44, - "x": 744, - "y": 322 - }, - "confidence": 1, - "points": [ - [ - 744, - 322 - ], - [ - 788, - 322 - ], - [ - 788, - 338 - ], - [ - 744, - 338 - ] - ], - "text": "north" - } - ] + "type": "paragraph" }, { "bounds": { @@ -55753,8 +12804,9 @@ "x": 663, "y": 350.06815 }, + "cells": null, "confidence": 0.6845468, - "id": "5f0fc1d3-91ee-4050-a9f7-134ec0196d96", + "id": "90852788-db16-4fde-83b4-ad2fe9633068", "page": { "height": 2200, "pageIndex": 2, @@ -55782,37 +12834,7 @@ "readingOrder": 40, "role": "Text", "text": "01/2025", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 16, - "width": 66, - "x": 663, - "y": 352 - }, - "confidence": 1, - "points": [ - [ - 663, - 352 - ], - [ - 729, - 352 - ], - [ - 729, - 368 - ], - [ - 663, - 368 - ] - ], - "text": "01/2025" - } - ] + "type": "paragraph" }, { "bounds": { @@ -55821,8 +12843,9 @@ "x": 663.93207, "y": 408.56387 }, + "cells": null, "confidence": 0.64392984, - "id": "4c50d78a-f697-46aa-aa09-00455ea7565c", + "id": "85f14805-1b02-4788-99ca-5eb7e094d706", "page": { "height": 2200, "pageIndex": 2, @@ -55859,8 +12882,9 @@ "x": 664.3146, "y": 436.17746 }, + "cells": null, "confidence": 0.74477375, - "id": "ca42b668-8483-4a84-bc34-afdae7c95415", + "id": "5a5c87b4-61ff-42b6-9585-e6f193a94b61", "page": { "height": 2200, "pageIndex": 2, @@ -55897,8 +12921,9 @@ "x": 669.9558, "y": 468.5186 }, + "cells": null, "confidence": 0.6231271, - "id": "caa6930a-52cf-4254-a83a-c3ab23d8ee64", + "id": "95d198ca-8a87-4a43-badf-62b827cb4bcc", "page": { "height": 2200, "pageIndex": 2, @@ -55935,8 +12960,9 @@ "x": 673.5402, "y": 498.79205 }, + "cells": null, "confidence": 0.66438186, - "id": "07aade36-b059-4bb8-92ff-6a5760a6e492", + "id": "3cc15b33-b33e-496e-99d1-ab9e75ac7421", "page": { "height": 2200, "pageIndex": 2, @@ -55963,7 +12989,7 @@ ], "readingOrder": 44, "role": "Text", - "text": "Yr. Blt.", + "text": "Yr. Blt:", "type": "paragraph" }, { @@ -55973,8 +12999,9 @@ "x": 849.66205, "y": 468.181 }, + "cells": null, "confidence": 0.7050573, - "id": "f97fe1eb-77b0-406f-8662-b49879828245", + "id": "be5e9437-1685-4b8d-a355-84b23c08fcf4", "page": { "height": 2200, "pageIndex": 2, @@ -56011,8 +13038,9 @@ "x": 1009.95917, "y": 468.5792 }, + "cells": null, "confidence": 0.6304051, - "id": "fd5897b2-ea78-4240-8f40-2fb88f388b6f", + "id": "f422a944-cc9c-4e6a-8a50-62bcd14015e8", "page": { "height": 2200, "pageIndex": 2, @@ -56049,8 +13077,9 @@ "x": 1007.18176, "y": 499 }, + "cells": null, "confidence": 0.6795087, - "id": "402c7e42-dabb-4105-8704-f19b03730db1", + "id": "91cdebc6-39a2-47f0-a558-73d396ecdcc1", "page": { "height": 2200, "pageIndex": 2, @@ -56078,121 +13107,7 @@ "readingOrder": 47, "role": "Text", "text": "Yr. Blt. Yr. Blt.", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 30, - "x": 1008, - "y": 499 - }, - "confidence": 1, - "points": [ - [ - 1008, - 499 - ], - [ - 1038, - 499 - ], - [ - 1038, - 518 - ], - [ - 1008, - 518 - ] - ], - "text": "Yr." - }, - { - "bounds": { - "height": 19, - "width": 33, - "x": 1047, - "y": 499 - }, - "confidence": 1, - "points": [ - [ - 1047, - 499 - ], - [ - 1080, - 499 - ], - [ - 1080, - 518 - ], - [ - 1047, - 518 - ] - ], - "text": "Blt." - }, - { - "bounds": { - "height": 19, - "width": 30, - "x": 1372, - "y": 499 - }, - "confidence": 1, - "points": [ - [ - 1372, - 499 - ], - [ - 1402, - 499 - ], - [ - 1402, - 518 - ], - [ - 1372, - 518 - ] - ], - "text": "Yr." - }, - { - "bounds": { - "height": 19, - "width": 33, - "x": 1408, - "y": 499 - }, - "confidence": 1, - "points": [ - [ - 1408, - 499 - ], - [ - 1441, - 499 - ], - [ - 1441, - 518 - ], - [ - 1408, - 518 - ] - ], - "text": "Blt." - } - ] + "type": "paragraph" }, { "bounds": { @@ -56201,8 +13116,9 @@ "x": 1175.5645, "y": 468.92914 }, + "cells": null, "confidence": 0.6731747, - "id": "f1499340-7ca9-441a-be77-0b7187022e83", + "id": "3d06d02b-7e16-4c00-814c-5b7c03f705c9", "page": { "height": 2200, "pageIndex": 2, @@ -56239,8 +13155,9 @@ "x": 1013, "y": 467.3454 }, + "cells": null, "confidence": 0.63110644, - "id": "edd328fe-d53e-4d8a-8202-9eafcd5e593c", + "id": "46d167f0-1de0-4187-805e-fd97afb89f62", "page": { "height": 2200, "pageIndex": 2, @@ -56268,261 +13185,7 @@ "readingOrder": 49, "role": "Text", "text": "No. Units No. Vac. No. Units 01 No. Vac.", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 36, - "x": 1013, - "y": 469 - }, - "confidence": 1, - "points": [ - [ - 1013, - 469 - ], - [ - 1049, - 469 - ], - [ - 1049, - 491 - ], - [ - 1013, - 491 - ] - ], - "text": "No." - }, - { - "bounds": { - "height": 22, - "width": 58, - "x": 1055, - "y": 469 - }, - "confidence": 1, - "points": [ - [ - 1055, - 469 - ], - [ - 1113, - 469 - ], - [ - 1113, - 491 - ], - [ - 1055, - 491 - ] - ], - "text": "Units" - }, - { - "bounds": { - "height": 22, - "width": 38, - "x": 1175, - "y": 469 - }, - "confidence": 1, - "points": [ - [ - 1175, - 469 - ], - [ - 1213, - 469 - ], - [ - 1213, - 491 - ], - [ - 1175, - 491 - ] - ], - "text": "No." - }, - { - "bounds": { - "height": 22, - "width": 47, - "x": 1216, - "y": 469 - }, - "confidence": 1, - "points": [ - [ - 1216, - 469 - ], - [ - 1263, - 469 - ], - [ - 1263, - 491 - ], - [ - 1216, - 491 - ] - ], - "text": "Vac." - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1372, - "y": 469 - }, - "confidence": 1, - "points": [ - [ - 1372, - 469 - ], - [ - 1408, - 469 - ], - [ - 1408, - 491 - ], - [ - 1372, - 491 - ] - ], - "text": "No." - }, - { - "bounds": { - "height": 22, - "width": 55, - "x": 1413, - "y": 469 - }, - "confidence": 1, - "points": [ - [ - 1413, - 469 - ], - [ - 1468, - 469 - ], - [ - 1468, - 491 - ], - [ - 1413, - 491 - ] - ], - "text": "Units" - }, - { - "bounds": { - "height": 16, - "width": 19, - "x": 1475, - "y": 472 - }, - "confidence": 1, - "points": [ - [ - 1475, - 472 - ], - [ - 1494, - 472 - ], - [ - 1494, - 488 - ], - [ - 1475, - 488 - ] - ], - "text": "01" - }, - { - "bounds": { - "height": 22, - "width": 38, - "x": 1513, - "y": 469 - }, - "confidence": 1, - "points": [ - [ - 1513, - 469 - ], - [ - 1551, - 469 - ], - [ - 1551, - 491 - ], - [ - 1513, - 491 - ] - ], - "text": "No." - }, - { - "bounds": { - "height": 22, - "width": 47, - "x": 1555, - "y": 469 - }, - "confidence": 1, - "points": [ - [ - 1555, - 469 - ], - [ - 1602, - 469 - ], - [ - 1602, - 491 - ], - [ - 1555, - 491 - ] - ], - "text": "Vac." - } - ] + "type": "paragraph" }, { "bounds": { @@ -56531,8 +13194,9 @@ "x": 1371.0685, "y": 499.0892 }, + "cells": null, "confidence": 0.7170623, - "id": "f3dea5b5-c964-4e0a-86ca-f9e4e6fcab10", + "id": "ec262047-7954-44ea-bb62-0dcd5ba6ffdb", "page": { "height": 2200, "pageIndex": 2, @@ -56569,8 +13233,9 @@ "x": 1514.6366, "y": 468.70728 }, + "cells": null, "confidence": 0.5752412, - "id": "7a07f96b-7926-4f1e-8988-a7592eaab843", + "id": "f428bb63-4275-46a5-a5e4-cb163e3493ed", "page": { "height": 2200, "pageIndex": 2, @@ -56607,8 +13272,9 @@ "x": 35.74848, "y": 950.8891 }, + "cells": null, "confidence": 0.7706177, - "id": "8f02991c-c9fd-4d6b-8489-a3fae8175138", + "id": "a26e741b-27a3-4503-9017-92a7fef30dce", "page": { "height": 2200, "pageIndex": 2, @@ -56645,8 +13311,9 @@ "x": 56.892574, "y": 2107.203 }, + "cells": null, "confidence": 0.81399643, - "id": "a8c7d552-442d-4d3d-a843-d8648e50e2d2", + "id": "249f94b7-1a7a-4e43-85d4-0b4f0b1fb2ad", "page": { "height": 2200, "pageIndex": 2, @@ -56674,121 +13341,7 @@ "readingOrder": 53, "role": "Footer", "text": "Freddie Mac Form 72", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 75, - "x": 58, - "y": 2108 - }, - "confidence": 1, - "points": [ - [ - 58, - 2108 - ], - [ - 133, - 2108 - ], - [ - 133, - 2127 - ], - [ - 58, - 2127 - ] - ], - "text": "Freddie" - }, - { - "bounds": { - "height": 19, - "width": 41, - "x": 141, - "y": 2108 - }, - "confidence": 1, - "points": [ - [ - 141, - 2108 - ], - [ - 182, - 2108 - ], - [ - 182, - 2127 - ], - [ - 141, - 2127 - ] - ], - "text": "Mac" - }, - { - "bounds": { - "height": 19, - "width": 50, - "x": 191, - "y": 2108 - }, - "confidence": 1, - "points": [ - [ - 191, - 2108 - ], - [ - 241, - 2108 - ], - [ - 241, - 2127 - ], - [ - 191, - 2127 - ] - ], - "text": "Form" - }, - { - "bounds": { - "height": 19, - "width": 25, - "x": 249, - "y": 2108 - }, - "confidence": 1, - "points": [ - [ - 249, - 2108 - ], - [ - 274, - 2108 - ], - [ - 274, - 2127 - ], - [ - 249, - 2127 - ] - ], - "text": "72" - } - ] + "type": "paragraph" }, { "bounds": { @@ -56797,8 +13350,9 @@ "x": 56.899895, "y": 2134.1565 }, + "cells": null, "confidence": 0.8331044, - "id": "e114de02-e139-4401-8752-462796838e21", + "id": "6be7396e-64bc-4e99-903e-4930fca2f4de", "page": { "height": 2200, "pageIndex": 2, @@ -56826,177 +13380,7 @@ "readingOrder": 54, "role": "Footer", "text": "National Association of Real Estate Appraisers", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 80, - "x": 58, - "y": 2136 - }, - "confidence": 1, - "points": [ - [ - 58, - 2136 - ], - [ - 138, - 2136 - ], - [ - 138, - 2155 - ], - [ - 58, - 2155 - ] - ], - "text": "National" - }, - { - "bounds": { - "height": 19, - "width": 113, - "x": 144, - "y": 2136 - }, - "confidence": 1, - "points": [ - [ - 144, - 2136 - ], - [ - 257, - 2136 - ], - [ - 257, - 2155 - ], - [ - 144, - 2155 - ] - ], - "text": "Association" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 266, - "y": 2136 - }, - "confidence": 1, - "points": [ - [ - 266, - 2136 - ], - [ - 285, - 2136 - ], - [ - 285, - 2155 - ], - [ - 266, - 2155 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 19, - "width": 44, - "x": 294, - "y": 2136 - }, - "confidence": 1, - "points": [ - [ - 294, - 2136 - ], - [ - 338, - 2136 - ], - [ - 338, - 2155 - ], - [ - 294, - 2155 - ] - ], - "text": "Real" - }, - { - "bounds": { - "height": 19, - "width": 61, - "x": 350, - "y": 2136 - }, - "confidence": 1, - "points": [ - [ - 350, - 2136 - ], - [ - 411, - 2136 - ], - [ - 411, - 2155 - ], - [ - 350, - 2155 - ] - ], - "text": "Estate" - }, - { - "bounds": { - "height": 22, - "width": 105, - "x": 419, - "y": 2136 - }, - "confidence": 1, - "points": [ - [ - 419, - 2136 - ], - [ - 524, - 2136 - ], - [ - 524, - 2158 - ], - [ - 419, - 2158 - ] - ], - "text": "Appraisers" - } - ] + "type": "paragraph" }, { "bounds": { @@ -57005,8 +13389,9 @@ "x": 769, "y": 2107.1008 }, + "cells": null, "confidence": 0.9183024, - "id": "82214bc9-5d7a-4975-8075-960c484bc66c", + "id": "068cbf28-307c-4e46-8403-9fbaf4d5fc1e", "page": { "height": 2200, "pageIndex": 2, @@ -57034,65 +13419,7 @@ "readingOrder": 55, "role": "Footer", "text": "Page 3", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 52, - "x": 769, - "y": 2108 - }, - "confidence": 1, - "points": [ - [ - 769, - 2108 - ], - [ - 821, - 2108 - ], - [ - 821, - 2133 - ], - [ - 769, - 2133 - ] - ], - "text": "Page" - }, - { - "bounds": { - "height": 19, - "width": 13, - "x": 827, - "y": 2108 - }, - "confidence": 1, - "points": [ - [ - 827, - 2108 - ], - [ - 840, - 2108 - ], - [ - 840, - 2127 - ], - [ - 827, - 2127 - ] - ], - "text": "3" - } - ] + "type": "paragraph" }, { "bounds": { @@ -57101,8 +13428,9 @@ "x": 1408.9453, "y": 2106.629 }, + "cells": null, "confidence": 0.91171306, - "id": "5b54d2a1-0d84-4669-b196-7e7de604a898", + "id": "23f824cd-7afb-47aa-976c-ccf79c959950", "page": { "height": 2200, "pageIndex": 2, @@ -57130,121 +13458,7 @@ "readingOrder": 56, "role": "Footer", "text": "Fannie Mae Form 1025", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 66, - "x": 1411, - "y": 2108 - }, - "confidence": 1, - "points": [ - [ - 1411, - 2108 - ], - [ - 1477, - 2108 - ], - [ - 1477, - 2127 - ], - [ - 1411, - 2127 - ] - ], - "text": "Fannie" - }, - { - "bounds": { - "height": 19, - "width": 44, - "x": 1483, - "y": 2108 - }, - "confidence": 1, - "points": [ - [ - 1483, - 2108 - ], - [ - 1527, - 2108 - ], - [ - 1527, - 2127 - ], - [ - 1483, - 2127 - ] - ], - "text": "Mae" - }, - { - "bounds": { - "height": 19, - "width": 50, - "x": 1533, - "y": 2108 - }, - "confidence": 1, - "points": [ - [ - 1533, - 2108 - ], - [ - 1583, - 2108 - ], - [ - 1583, - 2127 - ], - [ - 1533, - 2127 - ] - ], - "text": "Form" - }, - { - "bounds": { - "height": 19, - "width": 50, - "x": 1591, - "y": 2108 - }, - "confidence": 1, - "points": [ - [ - 1591, - 2108 - ], - [ - 1641, - 2108 - ], - [ - 1641, - 2127 - ], - [ - 1591, - 2127 - ] - ], - "text": "1025" - } - ] + "type": "paragraph" }, { "bounds": { @@ -57253,8 +13467,9 @@ "x": 335.97873, "y": 30 }, + "cells": null, "confidence": 0.7334596, - "id": "8a738de5-43d2-4ca6-9034-484cc964bbc6", + "id": "54da0220-2c24-4e63-bb04-16773fbc7fb7", "page": { "height": 2200, "pageIndex": 3, @@ -57282,177 +13497,7 @@ "readingOrder": 0, "role": "SectionHeader", "text": "SMALL RESIDENTIAL INCOME PROPERTY APPRAISAL REPORT", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 30, - "width": 111, - "x": 336, - "y": 30 - }, - "confidence": 1, - "points": [ - [ - 336, - 30 - ], - [ - 447, - 30 - ], - [ - 447, - 60 - ], - [ - 336, - 60 - ] - ], - "text": "SMALL" - }, - { - "bounds": { - "height": 30, - "width": 219, - "x": 458, - "y": 30 - }, - "confidence": 1, - "points": [ - [ - 458, - 30 - ], - [ - 677, - 30 - ], - [ - 677, - 60 - ], - [ - 458, - 60 - ] - ], - "text": "RESIDENTIAL" - }, - { - "bounds": { - "height": 30, - "width": 130, - "x": 688, - "y": 30 - }, - "confidence": 1, - "points": [ - [ - 688, - 30 - ], - [ - 818, - 30 - ], - [ - 818, - 60 - ], - [ - 688, - 60 - ] - ], - "text": "INCOME" - }, - { - "bounds": { - "height": 30, - "width": 183, - "x": 833, - "y": 30 - }, - "confidence": 1, - "points": [ - [ - 833, - 30 - ], - [ - 1016, - 30 - ], - [ - 1016, - 60 - ], - [ - 833, - 60 - ] - ], - "text": "PROPERTY" - }, - { - "bounds": { - "height": 30, - "width": 186, - "x": 1027, - "y": 30 - }, - "confidence": 1, - "points": [ - [ - 1027, - 30 - ], - [ - 1213, - 30 - ], - [ - 1213, - 60 - ], - [ - 1027, - 60 - ] - ], - "text": "APPRAISAL" - }, - { - "bounds": { - "height": 30, - "width": 136, - "x": 1227, - "y": 30 - }, - "confidence": 1, - "points": [ - [ - 1227, - 30 - ], - [ - 1363, - 30 - ], - [ - 1363, - 60 - ], - [ - 1227, - 60 - ] - ], - "text": "REPORT" - } - ] + "type": "paragraph" }, { "bounds": { @@ -57461,8 +13506,9 @@ "x": 65.86101, "y": 66 }, + "cells": null, "confidence": 0.9705866, - "id": "8fa32a44-29e1-4c5f-96ba-6ed4301624de", + "id": "29635d29-6a5d-4eb2-a668-9505f8a271dd", "page": { "height": 2200, "pageIndex": 3, @@ -57490,3649 +13536,7 @@ "readingOrder": 1, "role": "Text", "text": "The undersigned has received three recent sales of properties most similar and proximate to the subject property and has described and\nanalyzed these in this analysis. If there is a significant variation between the subject and comparable properties, the analysis includes a\ndollar adjustment reflecting the market reaction to those items or an explanation supported by the market data. If a significant item in the\ncomparable property is superior to, or more favorable than, the subject property, a minus (-) adjustment is made, thus reducing the adjusted\nsales price of the comparable property. If a significant item in the comparable property is inferior to, or less favorable than, the subject\nproperty, a plus (+) adjustment is made, thus increasing sales price of the comparable property. [(1) Sales Price/Gross Monthly Rent]", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 44, - "x": 66, - "y": 66 - }, - "confidence": 1, - "points": [ - [ - 66, - 66 - ], - [ - 110, - 66 - ], - [ - 110, - 88 - ], - [ - 66, - 88 - ] - ], - "text": "The" - }, - { - "bounds": { - "height": 27, - "width": 138, - "x": 119, - "y": 66 - }, - "confidence": 1, - "points": [ - [ - 119, - 66 - ], - [ - 257, - 66 - ], - [ - 257, - 93 - ], - [ - 119, - 93 - ] - ], - "text": "undersigned" - }, - { - "bounds": { - "height": 22, - "width": 38, - "x": 266, - "y": 66 - }, - "confidence": 1, - "points": [ - [ - 266, - 66 - ], - [ - 304, - 66 - ], - [ - 304, - 88 - ], - [ - 266, - 88 - ] - ], - "text": "has" - }, - { - "bounds": { - "height": 22, - "width": 94, - "x": 313, - "y": 66 - }, - "confidence": 1, - "points": [ - [ - 313, - 66 - ], - [ - 407, - 66 - ], - [ - 407, - 88 - ], - [ - 313, - 88 - ] - ], - "text": "received" - }, - { - "bounds": { - "height": 22, - "width": 58, - "x": 416, - "y": 66 - }, - "confidence": 1, - "points": [ - [ - 416, - 66 - ], - [ - 474, - 66 - ], - [ - 474, - 88 - ], - [ - 416, - 88 - ] - ], - "text": "three" - }, - { - "bounds": { - "height": 19, - "width": 69, - "x": 483, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 483, - 69 - ], - [ - 552, - 69 - ], - [ - 552, - 88 - ], - [ - 483, - 88 - ] - ], - "text": "recent" - }, - { - "bounds": { - "height": 22, - "width": 58, - "x": 561, - "y": 66 - }, - "confidence": 1, - "points": [ - [ - 561, - 66 - ], - [ - 619, - 66 - ], - [ - 619, - 88 - ], - [ - 561, - 88 - ] - ], - "text": "sales" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 627, - "y": 66 - }, - "confidence": 1, - "points": [ - [ - 627, - 66 - ], - [ - 649, - 66 - ], - [ - 649, - 88 - ], - [ - 627, - 88 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 27, - "width": 111, - "x": 655, - "y": 66 - }, - "confidence": 1, - "points": [ - [ - 655, - 66 - ], - [ - 766, - 66 - ], - [ - 766, - 93 - ], - [ - 655, - 93 - ] - ], - "text": "properties" - }, - { - "bounds": { - "height": 19, - "width": 55, - "x": 775, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 775, - 69 - ], - [ - 830, - 69 - ], - [ - 830, - 88 - ], - [ - 775, - 88 - ] - ], - "text": "most" - }, - { - "bounds": { - "height": 22, - "width": 72, - "x": 838, - "y": 66 - }, - "confidence": 1, - "points": [ - [ - 838, - 66 - ], - [ - 910, - 66 - ], - [ - 910, - 88 - ], - [ - 838, - 88 - ] - ], - "text": "similar" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 919, - "y": 66 - }, - "confidence": 1, - "points": [ - [ - 919, - 66 - ], - [ - 960, - 66 - ], - [ - 960, - 88 - ], - [ - 919, - 88 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 27, - "width": 108, - "x": 969, - "y": 66 - }, - "confidence": 1, - "points": [ - [ - 969, - 66 - ], - [ - 1077, - 66 - ], - [ - 1077, - 93 - ], - [ - 969, - 93 - ] - ], - "text": "proximate" - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 1086, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 1086, - 69 - ], - [ - 1108, - 69 - ], - [ - 1108, - 88 - ], - [ - 1086, - 88 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 22, - "width": 33, - "x": 1116, - "y": 66 - }, - "confidence": 1, - "points": [ - [ - 1116, - 66 - ], - [ - 1149, - 66 - ], - [ - 1149, - 88 - ], - [ - 1116, - 88 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 80, - "x": 1158, - "y": 66 - }, - "confidence": 1, - "points": [ - [ - 1158, - 66 - ], - [ - 1238, - 66 - ], - [ - 1238, - 93 - ], - [ - 1158, - 93 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 25, - "width": 91, - "x": 1247, - "y": 69 - }, - "confidence": 1, - "points": [ - [ - 1247, - 69 - ], - [ - 1338, - 69 - ], - [ - 1338, - 94 - ], - [ - 1247, - 94 - ] - ], - "text": "property" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 1347, - "y": 66 - }, - "confidence": 1, - "points": [ - [ - 1347, - 66 - ], - [ - 1388, - 66 - ], - [ - 1388, - 88 - ], - [ - 1347, - 88 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 1397, - "y": 66 - }, - "confidence": 1, - "points": [ - [ - 1397, - 66 - ], - [ - 1438, - 66 - ], - [ - 1438, - 88 - ], - [ - 1397, - 88 - ] - ], - "text": "has" - }, - { - "bounds": { - "height": 22, - "width": 108, - "x": 1444, - "y": 66 - }, - "confidence": 1, - "points": [ - [ - 1444, - 66 - ], - [ - 1552, - 66 - ], - [ - 1552, - 88 - ], - [ - 1444, - 88 - ] - ], - "text": "described" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 1561, - "y": 66 - }, - "confidence": 1, - "points": [ - [ - 1561, - 66 - ], - [ - 1602, - 66 - ], - [ - 1602, - 88 - ], - [ - 1561, - 88 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 27, - "width": 100, - "x": 69, - "y": 97 - }, - "confidence": 1, - "points": [ - [ - 69, - 97 - ], - [ - 169, - 97 - ], - [ - 169, - 124 - ], - [ - 69, - 124 - ] - ], - "text": "analyzed" - }, - { - "bounds": { - "height": 22, - "width": 63, - "x": 175, - "y": 97 - }, - "confidence": 1, - "points": [ - [ - 175, - 97 - ], - [ - 238, - 97 - ], - [ - 238, - 119 - ], - [ - 175, - 119 - ] - ], - "text": "these" - }, - { - "bounds": { - "height": 22, - "width": 19, - "x": 247, - "y": 97 - }, - "confidence": 1, - "points": [ - [ - 247, - 97 - ], - [ - 266, - 97 - ], - [ - 266, - 119 - ], - [ - 247, - 119 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 272, - "y": 97 - }, - "confidence": 1, - "points": [ - [ - 272, - 97 - ], - [ - 313, - 97 - ], - [ - 313, - 119 - ], - [ - 272, - 119 - ] - ], - "text": "this" - }, - { - "bounds": { - "height": 27, - "width": 94, - "x": 322, - "y": 97 - }, - "confidence": 1, - "points": [ - [ - 322, - 97 - ], - [ - 416, - 97 - ], - [ - 416, - 124 - ], - [ - 322, - 124 - ] - ], - "text": "analysis." - }, - { - "bounds": { - "height": 22, - "width": 13, - "x": 427, - "y": 97 - }, - "confidence": 1, - "points": [ - [ - 427, - 97 - ], - [ - 440, - 97 - ], - [ - 440, - 119 - ], - [ - 427, - 119 - ] - ], - "text": "If" - }, - { - "bounds": { - "height": 22, - "width": 58, - "x": 447, - "y": 97 - }, - "confidence": 1, - "points": [ - [ - 447, - 97 - ], - [ - 505, - 97 - ], - [ - 505, - 119 - ], - [ - 447, - 119 - ] - ], - "text": "there" - }, - { - "bounds": { - "height": 22, - "width": 19, - "x": 513, - "y": 97 - }, - "confidence": 1, - "points": [ - [ - 513, - 97 - ], - [ - 532, - 97 - ], - [ - 532, - 119 - ], - [ - 513, - 119 - ] - ], - "text": "is" - }, - { - "bounds": { - "height": 16, - "width": 13, - "x": 541, - "y": 102 - }, - "confidence": 1, - "points": [ - [ - 541, - 102 - ], - [ - 554, - 102 - ], - [ - 554, - 118 - ], - [ - 541, - 118 - ] - ], - "text": "a" - }, - { - "bounds": { - "height": 27, - "width": 113, - "x": 561, - "y": 97 - }, - "confidence": 1, - "points": [ - [ - 561, - 97 - ], - [ - 674, - 97 - ], - [ - 674, - 124 - ], - [ - 561, - 124 - ] - ], - "text": "significant" - }, - { - "bounds": { - "height": 22, - "width": 97, - "x": 680, - "y": 97 - }, - "confidence": 1, - "points": [ - [ - 680, - 97 - ], - [ - 777, - 97 - ], - [ - 777, - 119 - ], - [ - 680, - 119 - ] - ], - "text": "variation" - }, - { - "bounds": { - "height": 22, - "width": 94, - "x": 786, - "y": 97 - }, - "confidence": 1, - "points": [ - [ - 786, - 97 - ], - [ - 880, - 97 - ], - [ - 880, - 119 - ], - [ - 786, - 119 - ] - ], - "text": "between" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 886, - "y": 97 - }, - "confidence": 1, - "points": [ - [ - 886, - 97 - ], - [ - 922, - 97 - ], - [ - 922, - 119 - ], - [ - 886, - 119 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 80, - "x": 930, - "y": 97 - }, - "confidence": 1, - "points": [ - [ - 930, - 97 - ], - [ - 1010, - 97 - ], - [ - 1010, - 124 - ], - [ - 930, - 124 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 1019, - "y": 97 - }, - "confidence": 1, - "points": [ - [ - 1019, - 97 - ], - [ - 1060, - 97 - ], - [ - 1060, - 119 - ], - [ - 1019, - 119 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 27, - "width": 133, - "x": 1066, - "y": 97 - }, - "confidence": 1, - "points": [ - [ - 1066, - 97 - ], - [ - 1199, - 97 - ], - [ - 1199, - 124 - ], - [ - 1066, - 124 - ] - ], - "text": "comparable" - }, - { - "bounds": { - "height": 27, - "width": 116, - "x": 1208, - "y": 97 - }, - "confidence": 1, - "points": [ - [ - 1208, - 97 - ], - [ - 1324, - 97 - ], - [ - 1324, - 124 - ], - [ - 1208, - 124 - ] - ], - "text": "properties," - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1333, - "y": 97 - }, - "confidence": 1, - "points": [ - [ - 1333, - 97 - ], - [ - 1369, - 97 - ], - [ - 1369, - 119 - ], - [ - 1333, - 119 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 88, - "x": 1377, - "y": 97 - }, - "confidence": 1, - "points": [ - [ - 1377, - 97 - ], - [ - 1465, - 97 - ], - [ - 1465, - 124 - ], - [ - 1377, - 124 - ] - ], - "text": "analysis" - }, - { - "bounds": { - "height": 22, - "width": 91, - "x": 1475, - "y": 97 - }, - "confidence": 1, - "points": [ - [ - 1475, - 97 - ], - [ - 1566, - 97 - ], - [ - 1566, - 119 - ], - [ - 1475, - 119 - ] - ], - "text": "includes" - }, - { - "bounds": { - "height": 16, - "width": 13, - "x": 1575, - "y": 102 - }, - "confidence": 1, - "points": [ - [ - 1575, - 102 - ], - [ - 1588, - 102 - ], - [ - 1588, - 118 - ], - [ - 1575, - 118 - ] - ], - "text": "a" - }, - { - "bounds": { - "height": 22, - "width": 63, - "x": 66, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 66, - 127 - ], - [ - 129, - 127 - ], - [ - 129, - 149 - ], - [ - 66, - 149 - ] - ], - "text": "dollar" - }, - { - "bounds": { - "height": 25, - "width": 124, - "x": 136, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 136, - 127 - ], - [ - 260, - 127 - ], - [ - 260, - 152 - ], - [ - 136, - 152 - ] - ], - "text": "adjustment" - }, - { - "bounds": { - "height": 25, - "width": 102, - "x": 266, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 266, - 127 - ], - [ - 368, - 127 - ], - [ - 368, - 152 - ], - [ - 266, - 152 - ] - ], - "text": "reflecting" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 375, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 375, - 127 - ], - [ - 411, - 127 - ], - [ - 411, - 149 - ], - [ - 375, - 149 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 77, - "x": 419, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 419, - 127 - ], - [ - 496, - 127 - ], - [ - 496, - 149 - ], - [ - 419, - 149 - ] - ], - "text": "market" - }, - { - "bounds": { - "height": 22, - "width": 88, - "x": 502, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 502, - 127 - ], - [ - 590, - 127 - ], - [ - 590, - 149 - ], - [ - 502, - 149 - ] - ], - "text": "reaction" - }, - { - "bounds": { - "height": 22, - "width": 19, - "x": 600, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 600, - 127 - ], - [ - 619, - 127 - ], - [ - 619, - 149 - ], - [ - 600, - 149 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 627, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 627, - 127 - ], - [ - 688, - 127 - ], - [ - 688, - 149 - ], - [ - 627, - 149 - ] - ], - "text": "those" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 697, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 697, - 127 - ], - [ - 758, - 127 - ], - [ - 758, - 149 - ], - [ - 697, - 149 - ] - ], - "text": "items" - }, - { - "bounds": { - "height": 16, - "width": 25, - "x": 763, - "y": 133 - }, - "confidence": 1, - "points": [ - [ - 763, - 133 - ], - [ - 788, - 133 - ], - [ - 788, - 149 - ], - [ - 763, - 149 - ] - ], - "text": "or" - }, - { - "bounds": { - "height": 16, - "width": 27, - "x": 794, - "y": 133 - }, - "confidence": 1, - "points": [ - [ - 794, - 133 - ], - [ - 821, - 133 - ], - [ - 821, - 149 - ], - [ - 794, - 149 - ] - ], - "text": "an" - }, - { - "bounds": { - "height": 25, - "width": 127, - "x": 830, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 830, - 127 - ], - [ - 957, - 127 - ], - [ - 957, - 152 - ], - [ - 830, - 152 - ] - ], - "text": "explanation" - }, - { - "bounds": { - "height": 25, - "width": 113, - "x": 963, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 963, - 127 - ], - [ - 1076, - 127 - ], - [ - 1076, - 152 - ], - [ - 963, - 152 - ] - ], - "text": "supported" - }, - { - "bounds": { - "height": 25, - "width": 27, - "x": 1083, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 1083, - 127 - ], - [ - 1110, - 127 - ], - [ - 1110, - 152 - ], - [ - 1083, - 152 - ] - ], - "text": "by" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1116, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 1116, - 127 - ], - [ - 1152, - 127 - ], - [ - 1152, - 149 - ], - [ - 1116, - 149 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 77, - "x": 1161, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 1161, - 127 - ], - [ - 1238, - 127 - ], - [ - 1238, - 149 - ], - [ - 1161, - 149 - ] - ], - "text": "market" - }, - { - "bounds": { - "height": 22, - "width": 55, - "x": 1244, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 1244, - 127 - ], - [ - 1299, - 127 - ], - [ - 1299, - 149 - ], - [ - 1244, - 149 - ] - ], - "text": "data." - }, - { - "bounds": { - "height": 19, - "width": 13, - "x": 1308, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 1308, - 127 - ], - [ - 1321, - 127 - ], - [ - 1321, - 146 - ], - [ - 1308, - 146 - ] - ], - "text": "If" - }, - { - "bounds": { - "height": 16, - "width": 13, - "x": 1330, - "y": 133 - }, - "confidence": 1, - "points": [ - [ - 1330, - 133 - ], - [ - 1343, - 133 - ], - [ - 1343, - 149 - ], - [ - 1330, - 149 - ] - ], - "text": "a" - }, - { - "bounds": { - "height": 25, - "width": 113, - "x": 1350, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 1350, - 127 - ], - [ - 1463, - 127 - ], - [ - 1463, - 152 - ], - [ - 1350, - 152 - ] - ], - "text": "significant" - }, - { - "bounds": { - "height": 22, - "width": 47, - "x": 1469, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 1469, - 127 - ], - [ - 1516, - 127 - ], - [ - 1516, - 149 - ], - [ - 1469, - 149 - ] - ], - "text": "item" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1525, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 1525, - 127 - ], - [ - 1544, - 127 - ], - [ - 1544, - 146 - ], - [ - 1525, - 146 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1552, - "y": 127 - }, - "confidence": 1, - "points": [ - [ - 1552, - 127 - ], - [ - 1588, - 127 - ], - [ - 1588, - 149 - ], - [ - 1552, - 149 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 25, - "width": 133, - "x": 66, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 66, - 158 - ], - [ - 199, - 158 - ], - [ - 199, - 183 - ], - [ - 66, - 183 - ] - ], - "text": "comparable" - }, - { - "bounds": { - "height": 25, - "width": 94, - "x": 205, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 205, - 158 - ], - [ - 299, - 158 - ], - [ - 299, - 183 - ], - [ - 205, - 183 - ] - ], - "text": "property" - }, - { - "bounds": { - "height": 19, - "width": 16, - "x": 308, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 308, - 158 - ], - [ - 324, - 158 - ], - [ - 324, - 177 - ], - [ - 308, - 177 - ] - ], - "text": "is" - }, - { - "bounds": { - "height": 25, - "width": 91, - "x": 333, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 333, - 158 - ], - [ - 424, - 158 - ], - [ - 424, - 183 - ], - [ - 333, - 183 - ] - ], - "text": "superior" - }, - { - "bounds": { - "height": 25, - "width": 27, - "x": 430, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 430, - 158 - ], - [ - 457, - 158 - ], - [ - 457, - 183 - ], - [ - 430, - 183 - ] - ], - "text": "to," - }, - { - "bounds": { - "height": 16, - "width": 25, - "x": 466, - "y": 161 - }, - "confidence": 1, - "points": [ - [ - 466, - 161 - ], - [ - 491, - 161 - ], - [ - 491, - 177 - ], - [ - 466, - 177 - ] - ], - "text": "or" - }, - { - "bounds": { - "height": 16, - "width": 58, - "x": 497, - "y": 161 - }, - "confidence": 1, - "points": [ - [ - 497, - 161 - ], - [ - 555, - 161 - ], - [ - 555, - 177 - ], - [ - 497, - 177 - ] - ], - "text": "more" - }, - { - "bounds": { - "height": 19, - "width": 102, - "x": 561, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 561, - 158 - ], - [ - 663, - 158 - ], - [ - 663, - 177 - ], - [ - 561, - 177 - ] - ], - "text": "favorable" - }, - { - "bounds": { - "height": 25, - "width": 55, - "x": 669, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 669, - 158 - ], - [ - 724, - 158 - ], - [ - 724, - 183 - ], - [ - 669, - 183 - ] - ], - "text": "than," - }, - { - "bounds": { - "height": 19, - "width": 36, - "x": 733, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 733, - 158 - ], - [ - 769, - 158 - ], - [ - 769, - 177 - ], - [ - 733, - 177 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 25, - "width": 80, - "x": 777, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 777, - 158 - ], - [ - 857, - 158 - ], - [ - 857, - 183 - ], - [ - 777, - 183 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 25, - "width": 94, - "x": 866, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 866, - 158 - ], - [ - 960, - 158 - ], - [ - 960, - 183 - ], - [ - 866, - 183 - ] - ], - "text": "property," - }, - { - "bounds": { - "height": 16, - "width": 16, - "x": 969, - "y": 161 - }, - "confidence": 1, - "points": [ - [ - 969, - 161 - ], - [ - 985, - 161 - ], - [ - 985, - 177 - ], - [ - 969, - 177 - ] - ], - "text": "a" - }, - { - "bounds": { - "height": 19, - "width": 63, - "x": 994, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 994, - 158 - ], - [ - 1057, - 158 - ], - [ - 1057, - 177 - ], - [ - 994, - 177 - ] - ], - "text": "minus" - }, - { - "bounds": { - "height": 25, - "width": 25, - "x": 1066, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 1066, - 158 - ], - [ - 1091, - 158 - ], - [ - 1091, - 183 - ], - [ - 1066, - 183 - ] - ], - "text": "(-)" - }, - { - "bounds": { - "height": 25, - "width": 122, - "x": 1100, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 1100, - 158 - ], - [ - 1222, - 158 - ], - [ - 1222, - 183 - ], - [ - 1100, - 183 - ] - ], - "text": "adjustment" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1230, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 1230, - 158 - ], - [ - 1249, - 158 - ], - [ - 1249, - 177 - ], - [ - 1230, - 177 - ] - ], - "text": "is" - }, - { - "bounds": { - "height": 25, - "width": 66, - "x": 1258, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 1258, - 158 - ], - [ - 1324, - 158 - ], - [ - 1324, - 183 - ], - [ - 1258, - 183 - ] - ], - "text": "made," - }, - { - "bounds": { - "height": 19, - "width": 50, - "x": 1333, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 1333, - 158 - ], - [ - 1383, - 158 - ], - [ - 1383, - 177 - ], - [ - 1333, - 177 - ] - ], - "text": "thus" - }, - { - "bounds": { - "height": 25, - "width": 97, - "x": 1388, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 1388, - 158 - ], - [ - 1485, - 158 - ], - [ - 1485, - 183 - ], - [ - 1388, - 183 - ] - ], - "text": "reducing" - }, - { - "bounds": { - "height": 19, - "width": 36, - "x": 1491, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 1491, - 158 - ], - [ - 1527, - 158 - ], - [ - 1527, - 177 - ], - [ - 1491, - 177 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 25, - "width": 94, - "x": 1536, - "y": 158 - }, - "confidence": 1, - "points": [ - [ - 1536, - 158 - ], - [ - 1630, - 158 - ], - [ - 1630, - 183 - ], - [ - 1536, - 183 - ] - ], - "text": "adjusted" - }, - { - "bounds": { - "height": 22, - "width": 58, - "x": 69, - "y": 186 - }, - "confidence": 1, - "points": [ - [ - 69, - 186 - ], - [ - 127, - 186 - ], - [ - 127, - 208 - ], - [ - 69, - 208 - ] - ], - "text": "sales" - }, - { - "bounds": { - "height": 27, - "width": 52, - "x": 136, - "y": 186 - }, - "confidence": 1, - "points": [ - [ - 136, - 186 - ], - [ - 188, - 186 - ], - [ - 188, - 213 - ], - [ - 136, - 213 - ] - ], - "text": "price" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 197, - "y": 186 - }, - "confidence": 1, - "points": [ - [ - 197, - 186 - ], - [ - 219, - 186 - ], - [ - 219, - 208 - ], - [ - 197, - 208 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 233, - "y": 186 - }, - "confidence": 1, - "points": [ - [ - 233, - 186 - ], - [ - 269, - 186 - ], - [ - 269, - 208 - ], - [ - 233, - 208 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 133, - "x": 275, - "y": 186 - }, - "confidence": 1, - "points": [ - [ - 275, - 186 - ], - [ - 408, - 186 - ], - [ - 408, - 213 - ], - [ - 275, - 213 - ] - ], - "text": "comparable" - }, - { - "bounds": { - "height": 25, - "width": 97, - "x": 413, - "y": 188 - }, - "confidence": 1, - "points": [ - [ - 413, - 188 - ], - [ - 510, - 188 - ], - [ - 510, - 213 - ], - [ - 413, - 213 - ] - ], - "text": "property." - }, - { - "bounds": { - "height": 22, - "width": 13, - "x": 519, - "y": 186 - }, - "confidence": 1, - "points": [ - [ - 519, - 186 - ], - [ - 532, - 186 - ], - [ - 532, - 208 - ], - [ - 519, - 208 - ] - ], - "text": "If" - }, - { - "bounds": { - "height": 16, - "width": 16, - "x": 538, - "y": 191 - }, - "confidence": 1, - "points": [ - [ - 538, - 191 - ], - [ - 554, - 191 - ], - [ - 554, - 207 - ], - [ - 538, - 207 - ] - ], - "text": "a" - }, - { - "bounds": { - "height": 27, - "width": 113, - "x": 561, - "y": 186 - }, - "confidence": 1, - "points": [ - [ - 561, - 186 - ], - [ - 674, - 186 - ], - [ - 674, - 213 - ], - [ - 561, - 213 - ] - ], - "text": "significant" - }, - { - "bounds": { - "height": 22, - "width": 47, - "x": 680, - "y": 186 - }, - "confidence": 1, - "points": [ - [ - 680, - 186 - ], - [ - 727, - 186 - ], - [ - 727, - 208 - ], - [ - 680, - 208 - ] - ], - "text": "item" - }, - { - "bounds": { - "height": 22, - "width": 19, - "x": 736, - "y": 186 - }, - "confidence": 1, - "points": [ - [ - 736, - 186 - ], - [ - 755, - 186 - ], - [ - 755, - 208 - ], - [ - 736, - 208 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 761, - "y": 186 - }, - "confidence": 1, - "points": [ - [ - 761, - 186 - ], - [ - 797, - 186 - ], - [ - 797, - 208 - ], - [ - 761, - 208 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 130, - "x": 805, - "y": 186 - }, - "confidence": 1, - "points": [ - [ - 805, - 186 - ], - [ - 935, - 186 - ], - [ - 935, - 213 - ], - [ - 805, - 213 - ] - ], - "text": "comparable" - }, - { - "bounds": { - "height": 25, - "width": 91, - "x": 944, - "y": 188 - }, - "confidence": 1, - "points": [ - [ - 944, - 188 - ], - [ - 1035, - 188 - ], - [ - 1035, - 213 - ], - [ - 944, - 213 - ] - ], - "text": "property" - }, - { - "bounds": { - "height": 22, - "width": 19, - "x": 1044, - "y": 186 - }, - "confidence": 1, - "points": [ - [ - 1044, - 186 - ], - [ - 1063, - 186 - ], - [ - 1063, - 208 - ], - [ - 1044, - 208 - ] - ], - "text": "is" - }, - { - "bounds": { - "height": 22, - "width": 77, - "x": 1069, - "y": 186 - }, - "confidence": 1, - "points": [ - [ - 1069, - 186 - ], - [ - 1146, - 186 - ], - [ - 1146, - 208 - ], - [ - 1069, - 208 - ] - ], - "text": "inferior" - }, - { - "bounds": { - "height": 22, - "width": 27, - "x": 1152, - "y": 188 - }, - "confidence": 1, - "points": [ - [ - 1152, - 188 - ], - [ - 1179, - 188 - ], - [ - 1179, - 210 - ], - [ - 1152, - 210 - ] - ], - "text": "to," - }, - { - "bounds": { - "height": 16, - "width": 22, - "x": 1188, - "y": 191 - }, - "confidence": 1, - "points": [ - [ - 1188, - 191 - ], - [ - 1210, - 191 - ], - [ - 1210, - 207 - ], - [ - 1188, - 207 - ] - ], - "text": "or" - }, - { - "bounds": { - "height": 22, - "width": 44, - "x": 1219, - "y": 186 - }, - "confidence": 1, - "points": [ - [ - 1219, - 186 - ], - [ - 1263, - 186 - ], - [ - 1263, - 208 - ], - [ - 1219, - 208 - ] - ], - "text": "less" - }, - { - "bounds": { - "height": 22, - "width": 102, - "x": 1269, - "y": 186 - }, - "confidence": 1, - "points": [ - [ - 1269, - 186 - ], - [ - 1371, - 186 - ], - [ - 1371, - 208 - ], - [ - 1269, - 208 - ] - ], - "text": "favorable" - }, - { - "bounds": { - "height": 25, - "width": 55, - "x": 1377, - "y": 186 - }, - "confidence": 1, - "points": [ - [ - 1377, - 186 - ], - [ - 1432, - 186 - ], - [ - 1432, - 211 - ], - [ - 1377, - 211 - ] - ], - "text": "than," - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 1441, - "y": 186 - }, - "confidence": 1, - "points": [ - [ - 1441, - 186 - ], - [ - 1477, - 186 - ], - [ - 1477, - 208 - ], - [ - 1441, - 208 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 80, - "x": 1486, - "y": 186 - }, - "confidence": 1, - "points": [ - [ - 1486, - 186 - ], - [ - 1566, - 186 - ], - [ - 1566, - 213 - ], - [ - 1486, - 213 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 25, - "width": 94, - "x": 69, - "y": 219 - }, - "confidence": 1, - "points": [ - [ - 69, - 219 - ], - [ - 163, - 219 - ], - [ - 163, - 244 - ], - [ - 69, - 244 - ] - ], - "text": "property," - }, - { - "bounds": { - "height": 16, - "width": 16, - "x": 172, - "y": 222 - }, - "confidence": 1, - "points": [ - [ - 172, - 222 - ], - [ - 188, - 222 - ], - [ - 188, - 238 - ], - [ - 172, - 238 - ] - ], - "text": "a" - }, - { - "bounds": { - "height": 27, - "width": 47, - "x": 194, - "y": 216 - }, - "confidence": 1, - "points": [ - [ - 194, - 216 - ], - [ - 241, - 216 - ], - [ - 241, - 243 - ], - [ - 194, - 243 - ] - ], - "text": "plus" - }, - { - "bounds": { - "height": 27, - "width": 30, - "x": 249, - "y": 216 - }, - "confidence": 1, - "points": [ - [ - 249, - 216 - ], - [ - 279, - 216 - ], - [ - 279, - 243 - ], - [ - 249, - 243 - ] - ], - "text": "(+)" - }, - { - "bounds": { - "height": 27, - "width": 122, - "x": 288, - "y": 216 - }, - "confidence": 1, - "points": [ - [ - 288, - 216 - ], - [ - 410, - 216 - ], - [ - 410, - 243 - ], - [ - 288, - 243 - ] - ], - "text": "adjustment" - }, - { - "bounds": { - "height": 22, - "width": 16, - "x": 419, - "y": 216 - }, - "confidence": 1, - "points": [ - [ - 419, - 216 - ], - [ - 435, - 216 - ], - [ - 435, - 238 - ], - [ - 419, - 238 - ] - ], - "text": "is" - }, - { - "bounds": { - "height": 25, - "width": 66, - "x": 444, - "y": 216 - }, - "confidence": 1, - "points": [ - [ - 444, - 216 - ], - [ - 510, - 216 - ], - [ - 510, - 241 - ], - [ - 444, - 241 - ] - ], - "text": "made," - }, - { - "bounds": { - "height": 22, - "width": 50, - "x": 519, - "y": 216 - }, - "confidence": 1, - "points": [ - [ - 519, - 216 - ], - [ - 569, - 216 - ], - [ - 569, - 238 - ], - [ - 519, - 238 - ] - ], - "text": "thus" - }, - { - "bounds": { - "height": 27, - "width": 113, - "x": 575, - "y": 216 - }, - "confidence": 1, - "points": [ - [ - 575, - 216 - ], - [ - 688, - 216 - ], - [ - 688, - 243 - ], - [ - 575, - 243 - ] - ], - "text": "increasing" - }, - { - "bounds": { - "height": 22, - "width": 58, - "x": 697, - "y": 216 - }, - "confidence": 1, - "points": [ - [ - 697, - 216 - ], - [ - 755, - 216 - ], - [ - 755, - 238 - ], - [ - 697, - 238 - ] - ], - "text": "sales" - }, - { - "bounds": { - "height": 27, - "width": 55, - "x": 763, - "y": 216 - }, - "confidence": 1, - "points": [ - [ - 763, - 216 - ], - [ - 818, - 216 - ], - [ - 818, - 243 - ], - [ - 763, - 243 - ] - ], - "text": "price" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 824, - "y": 216 - }, - "confidence": 1, - "points": [ - [ - 824, - 216 - ], - [ - 846, - 216 - ], - [ - 846, - 238 - ], - [ - 824, - 238 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 852, - "y": 216 - }, - "confidence": 1, - "points": [ - [ - 852, - 216 - ], - [ - 888, - 216 - ], - [ - 888, - 238 - ], - [ - 852, - 238 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 130, - "x": 897, - "y": 216 - }, - "confidence": 1, - "points": [ - [ - 897, - 216 - ], - [ - 1027, - 216 - ], - [ - 1027, - 243 - ], - [ - 897, - 243 - ] - ], - "text": "comparable" - }, - { - "bounds": { - "height": 25, - "width": 97, - "x": 1033, - "y": 219 - }, - "confidence": 1, - "points": [ - [ - 1033, - 219 - ], - [ - 1130, - 219 - ], - [ - 1130, - 244 - ], - [ - 1033, - 244 - ] - ], - "text": "property." - }, - { - "bounds": { - "height": 27, - "width": 36, - "x": 1138, - "y": 216 - }, - "confidence": 1, - "points": [ - [ - 1138, - 216 - ], - [ - 1174, - 216 - ], - [ - 1174, - 243 - ], - [ - 1138, - 243 - ] - ], - "text": "[(1)" - }, - { - "bounds": { - "height": 22, - "width": 63, - "x": 1183, - "y": 216 - }, - "confidence": 1, - "points": [ - [ - 1183, - 216 - ], - [ - 1246, - 216 - ], - [ - 1246, - 238 - ], - [ - 1183, - 238 - ] - ], - "text": "Sales" - }, - { - "bounds": { - "height": 22, - "width": 130, - "x": 1255, - "y": 216 - }, - "confidence": 1, - "points": [ - [ - 1255, - 216 - ], - [ - 1385, - 216 - ], - [ - 1385, - 238 - ], - [ - 1255, - 238 - ] - ], - "text": "Price/Gross" - }, - { - "bounds": { - "height": 27, - "width": 88, - "x": 1391, - "y": 216 - }, - "confidence": 1, - "points": [ - [ - 1391, - 216 - ], - [ - 1479, - 216 - ], - [ - 1479, - 243 - ], - [ - 1391, - 243 - ] - ], - "text": "Monthly" - }, - { - "bounds": { - "height": 27, - "width": 58, - "x": 1488, - "y": 216 - }, - "confidence": 1, - "points": [ - [ - 1488, - 216 - ], - [ - 1546, - 216 - ], - [ - 1546, - 243 - ], - [ - 1488, - 243 - ] - ], - "text": "Rent]" - } - ] + "type": "paragraph" }, { "bounds": { @@ -61141,8 +13545,9 @@ "x": 66, "y": 1246.5564 }, + "cells": null, "confidence": 0.839406, - "id": "8266df93-ac2c-49a0-b78c-72607a1ceae8", + "id": "156702a7-a280-4217-82ec-4727b543c02e", "page": { "height": 2200, "pageIndex": 3, @@ -61170,821 +13575,7 @@ "readingOrder": 3, "role": "Text", "text": "Comments on sales comparison (including reconciliation of all indicators of value as to consistency and relative strength and evaluation of\nthe typical investor’s purchaser’s motivation in that market): _______________________________________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 22, - "width": 119, - "x": 69, - "y": 1247 - }, - "confidence": 1, - "points": [ - [ - 69, - 1247 - ], - [ - 188, - 1247 - ], - [ - 188, - 1269 - ], - [ - 69, - 1269 - ] - ], - "text": "Comments" - }, - { - "bounds": { - "height": 16, - "width": 27, - "x": 197, - "y": 1252 - }, - "confidence": 1, - "points": [ - [ - 197, - 1252 - ], - [ - 224, - 1252 - ], - [ - 224, - 1268 - ], - [ - 197, - 1268 - ] - ], - "text": "on" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 233, - "y": 1247 - }, - "confidence": 1, - "points": [ - [ - 233, - 1247 - ], - [ - 294, - 1247 - ], - [ - 294, - 1269 - ], - [ - 233, - 1269 - ] - ], - "text": "sales" - }, - { - "bounds": { - "height": 27, - "width": 130, - "x": 300, - "y": 1247 - }, - "confidence": 1, - "points": [ - [ - 300, - 1247 - ], - [ - 430, - 1247 - ], - [ - 430, - 1274 - ], - [ - 300, - 1274 - ] - ], - "text": "comparison" - }, - { - "bounds": { - "height": 27, - "width": 108, - "x": 438, - "y": 1247 - }, - "confidence": 1, - "points": [ - [ - 438, - 1247 - ], - [ - 546, - 1247 - ], - [ - 546, - 1274 - ], - [ - 438, - 1274 - ] - ], - "text": "(including" - }, - { - "bounds": { - "height": 22, - "width": 144, - "x": 555, - "y": 1247 - }, - "confidence": 1, - "points": [ - [ - 555, - 1247 - ], - [ - 699, - 1247 - ], - [ - 699, - 1269 - ], - [ - 555, - 1269 - ] - ], - "text": "reconciliation" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 708, - "y": 1247 - }, - "confidence": 1, - "points": [ - [ - 708, - 1247 - ], - [ - 730, - 1247 - ], - [ - 730, - 1269 - ], - [ - 708, - 1269 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 22, - "width": 25, - "x": 738, - "y": 1247 - }, - "confidence": 1, - "points": [ - [ - 738, - 1247 - ], - [ - 763, - 1247 - ], - [ - 763, - 1269 - ], - [ - 738, - 1269 - ] - ], - "text": "all" - }, - { - "bounds": { - "height": 22, - "width": 108, - "x": 772, - "y": 1247 - }, - "confidence": 1, - "points": [ - [ - 772, - 1247 - ], - [ - 880, - 1247 - ], - [ - 880, - 1269 - ], - [ - 772, - 1269 - ] - ], - "text": "indicators" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 888, - "y": 1247 - }, - "confidence": 1, - "points": [ - [ - 888, - 1247 - ], - [ - 910, - 1247 - ], - [ - 910, - 1269 - ], - [ - 888, - 1269 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 916, - "y": 1247 - }, - "confidence": 1, - "points": [ - [ - 916, - 1247 - ], - [ - 977, - 1247 - ], - [ - 977, - 1269 - ], - [ - 916, - 1269 - ] - ], - "text": "value" - }, - { - "bounds": { - "height": 16, - "width": 27, - "x": 986, - "y": 1252 - }, - "confidence": 1, - "points": [ - [ - 986, - 1252 - ], - [ - 1013, - 1252 - ], - [ - 1013, - 1268 - ], - [ - 986, - 1268 - ] - ], - "text": "as" - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 1019, - "y": 1250 - }, - "confidence": 1, - "points": [ - [ - 1019, - 1250 - ], - [ - 1041, - 1250 - ], - [ - 1041, - 1269 - ], - [ - 1019, - 1269 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 27, - "width": 133, - "x": 1050, - "y": 1247 - }, - "confidence": 1, - "points": [ - [ - 1050, - 1247 - ], - [ - 1183, - 1247 - ], - [ - 1183, - 1274 - ], - [ - 1050, - 1274 - ] - ], - "text": "consistency" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 1188, - "y": 1247 - }, - "confidence": 1, - "points": [ - [ - 1188, - 1247 - ], - [ - 1229, - 1247 - ], - [ - 1229, - 1269 - ], - [ - 1188, - 1269 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 22, - "width": 80, - "x": 1241, - "y": 1247 - }, - "confidence": 1, - "points": [ - [ - 1241, - 1247 - ], - [ - 1321, - 1247 - ], - [ - 1321, - 1269 - ], - [ - 1241, - 1269 - ] - ], - "text": "relative" - }, - { - "bounds": { - "height": 27, - "width": 88, - "x": 1330, - "y": 1247 - }, - "confidence": 1, - "points": [ - [ - 1330, - 1247 - ], - [ - 1418, - 1247 - ], - [ - 1418, - 1274 - ], - [ - 1330, - 1274 - ] - ], - "text": "strength" - }, - { - "bounds": { - "height": 22, - "width": 41, - "x": 1427, - "y": 1247 - }, - "confidence": 1, - "points": [ - [ - 1427, - 1247 - ], - [ - 1468, - 1247 - ], - [ - 1468, - 1269 - ], - [ - 1427, - 1269 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 22, - "width": 113, - "x": 1477, - "y": 1247 - }, - "confidence": 1, - "points": [ - [ - 1477, - 1247 - ], - [ - 1590, - 1247 - ], - [ - 1590, - 1269 - ], - [ - 1477, - 1269 - ] - ], - "text": "evaluation" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 1600, - "y": 1247 - }, - "confidence": 1, - "points": [ - [ - 1600, - 1247 - ], - [ - 1622, - 1247 - ], - [ - 1622, - 1269 - ], - [ - 1600, - 1269 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 66, - "y": 1277 - }, - "confidence": 1, - "points": [ - [ - 66, - 1277 - ], - [ - 102, - 1277 - ], - [ - 102, - 1299 - ], - [ - 66, - 1299 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 27, - "width": 72, - "x": 111, - "y": 1277 - }, - "confidence": 1, - "points": [ - [ - 111, - 1277 - ], - [ - 183, - 1277 - ], - [ - 183, - 1304 - ], - [ - 111, - 1304 - ] - ], - "text": "typical" - }, - { - "bounds": { - "height": 22, - "width": 102, - "x": 191, - "y": 1277 - }, - "confidence": 1, - "points": [ - [ - 191, - 1277 - ], - [ - 293, - 1277 - ], - [ - 293, - 1299 - ], - [ - 191, - 1299 - ] - ], - "text": "investor’s" - }, - { - "bounds": { - "height": 27, - "width": 127, - "x": 302, - "y": 1277 - }, - "confidence": 1, - "points": [ - [ - 302, - 1277 - ], - [ - 429, - 1277 - ], - [ - 429, - 1304 - ], - [ - 302, - 1304 - ] - ], - "text": "purchaser’s" - }, - { - "bounds": { - "height": 22, - "width": 111, - "x": 438, - "y": 1277 - }, - "confidence": 1, - "points": [ - [ - 438, - 1277 - ], - [ - 549, - 1277 - ], - [ - 549, - 1299 - ], - [ - 438, - 1299 - ] - ], - "text": "motivation" - }, - { - "bounds": { - "height": 22, - "width": 16, - "x": 561, - "y": 1277 - }, - "confidence": 1, - "points": [ - [ - 561, - 1277 - ], - [ - 577, - 1277 - ], - [ - 577, - 1299 - ], - [ - 561, - 1299 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 22, - "width": 44, - "x": 586, - "y": 1277 - }, - "confidence": 1, - "points": [ - [ - 586, - 1277 - ], - [ - 630, - 1277 - ], - [ - 630, - 1299 - ], - [ - 586, - 1299 - ] - ], - "text": "that" - }, - { - "bounds": { - "height": 27, - "width": 88, - "x": 638, - "y": 1277 - }, - "confidence": 1, - "points": [ - [ - 638, - 1277 - ], - [ - 726, - 1277 - ], - [ - 726, - 1304 - ], - [ - 638, - 1304 - ] - ], - "text": "market):" - }, - { - "bounds": { - "height": 2, - "width": 880, - "x": 741, - "y": 1300 - }, - "confidence": 1, - "points": [ - [ - 741, - 1300 - ], - [ - 1621, - 1300 - ], - [ - 1621, - 1302 - ], - [ - 741, - 1302 - ] - ], - "text": "_______________________________________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -61993,8 +13584,9 @@ "x": 73.27276, "y": 1340.9595 }, + "cells": null, "confidence": 0.70540446, - "id": "b30aa536-c2e9-45b8-ba93-f2933b893f40", + "id": "25a3693a-8de5-47ea-9cad-2cfd89f238c5", "page": { "height": 2200, "pageIndex": 3, @@ -62022,373 +13614,7 @@ "readingOrder": 4, "role": "Text", "text": "comparable sale is similar in location, condition, and unit configuration to the The_______________________________________________________________________________________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 122, - "x": 119, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 119, - 1341 - ], - [ - 241, - 1341 - ], - [ - 241, - 1366 - ], - [ - 119, - 1366 - ] - ], - "text": "comparable" - }, - { - "bounds": { - "height": 19, - "width": 41, - "x": 247, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 247, - 1341 - ], - [ - 288, - 1341 - ], - [ - 288, - 1360 - ], - [ - 247, - 1360 - ] - ], - "text": "sale" - }, - { - "bounds": { - "height": 19, - "width": 16, - "x": 294, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 294, - 1341 - ], - [ - 310, - 1341 - ], - [ - 310, - 1360 - ], - [ - 294, - 1360 - ] - ], - "text": "is" - }, - { - "bounds": { - "height": 19, - "width": 69, - "x": 316, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 316, - 1341 - ], - [ - 385, - 1341 - ], - [ - 385, - 1360 - ], - [ - 316, - 1360 - ] - ], - "text": "similar" - }, - { - "bounds": { - "height": 19, - "width": 16, - "x": 391, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 391, - 1341 - ], - [ - 407, - 1341 - ], - [ - 407, - 1360 - ], - [ - 391, - 1360 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 22, - "width": 83, - "x": 416, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 416, - 1341 - ], - [ - 499, - 1341 - ], - [ - 499, - 1363 - ], - [ - 416, - 1363 - ] - ], - "text": "location," - }, - { - "bounds": { - "height": 22, - "width": 97, - "x": 505, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 505, - 1341 - ], - [ - 602, - 1341 - ], - [ - 602, - 1363 - ], - [ - 505, - 1363 - ] - ], - "text": "condition," - }, - { - "bounds": { - "height": 19, - "width": 38, - "x": 611, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 611, - 1341 - ], - [ - 649, - 1341 - ], - [ - 649, - 1360 - ], - [ - 611, - 1360 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 19, - "width": 38, - "x": 655, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 655, - 1341 - ], - [ - 693, - 1341 - ], - [ - 693, - 1360 - ], - [ - 655, - 1360 - ] - ], - "text": "unit" - }, - { - "bounds": { - "height": 25, - "width": 130, - "x": 700, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 700, - 1341 - ], - [ - 830, - 1341 - ], - [ - 830, - 1366 - ], - [ - 700, - 1366 - ] - ], - "text": "configuration" - }, - { - "bounds": { - "height": 16, - "width": 19, - "x": 836, - "y": 1344 - }, - "confidence": 1, - "points": [ - [ - 836, - 1344 - ], - [ - 855, - 1344 - ], - [ - 855, - 1360 - ], - [ - 836, - 1360 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 19, - "width": 33, - "x": 861, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 861, - 1341 - ], - [ - 894, - 1341 - ], - [ - 894, - 1360 - ], - [ - 861, - 1360 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 1547, - "x": 75, - "y": 1341 - }, - "confidence": 1, - "points": [ - [ - 75, - 1341 - ], - [ - 1622, - 1341 - ], - [ - 1622, - 1363 - ], - [ - 75, - 1363 - ] - ], - "text": "The_______________________________________________________________________________________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -62397,8 +13623,9 @@ "x": 74.22542, "y": 1369 }, + "cells": null, "confidence": 0.6262004, - "id": "13f45279-034a-4049-8777-d3d251825423", + "id": "e5e6b663-fa05-4ae7-af02-7ddf1c0a4abf", "page": { "height": 2200, "pageIndex": 3, @@ -62426,317 +13653,7 @@ "readingOrder": 5, "role": "Text", "text": "no significant adjustments were warranted. Investor purchasers in this market subject;_______________________________________________________________________________________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 13, - "width": 25, - "x": 161, - "y": 1375 - }, - "confidence": 1, - "points": [ - [ - 161, - 1375 - ], - [ - 186, - 1375 - ], - [ - 186, - 1388 - ], - [ - 161, - 1388 - ] - ], - "text": "no" - }, - { - "bounds": { - "height": 25, - "width": 105, - "x": 191, - "y": 1369 - }, - "confidence": 1, - "points": [ - [ - 191, - 1369 - ], - [ - 296, - 1369 - ], - [ - 296, - 1394 - ], - [ - 191, - 1394 - ] - ], - "text": "significant" - }, - { - "bounds": { - "height": 25, - "width": 122, - "x": 300, - "y": 1369 - }, - "confidence": 1, - "points": [ - [ - 300, - 1369 - ], - [ - 422, - 1369 - ], - [ - 422, - 1394 - ], - [ - 300, - 1394 - ] - ], - "text": "adjustments" - }, - { - "bounds": { - "height": 13, - "width": 50, - "x": 430, - "y": 1375 - }, - "confidence": 1, - "points": [ - [ - 430, - 1375 - ], - [ - 480, - 1375 - ], - [ - 480, - 1388 - ], - [ - 430, - 1388 - ] - ], - "text": "were" - }, - { - "bounds": { - "height": 19, - "width": 108, - "x": 486, - "y": 1369 - }, - "confidence": 1, - "points": [ - [ - 486, - 1369 - ], - [ - 594, - 1369 - ], - [ - 594, - 1388 - ], - [ - 486, - 1388 - ] - ], - "text": "warranted." - }, - { - "bounds": { - "height": 19, - "width": 86, - "x": 600, - "y": 1369 - }, - "confidence": 1, - "points": [ - [ - 600, - 1369 - ], - [ - 686, - 1369 - ], - [ - 686, - 1388 - ], - [ - 600, - 1388 - ] - ], - "text": "Investor" - }, - { - "bounds": { - "height": 25, - "width": 113, - "x": 688, - "y": 1369 - }, - "confidence": 1, - "points": [ - [ - 688, - 1369 - ], - [ - 801, - 1369 - ], - [ - 801, - 1394 - ], - [ - 688, - 1394 - ] - ], - "text": "purchasers" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 808, - "y": 1369 - }, - "confidence": 1, - "points": [ - [ - 808, - 1369 - ], - [ - 827, - 1369 - ], - [ - 827, - 1388 - ], - [ - 808, - 1388 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 19, - "width": 36, - "x": 830, - "y": 1369 - }, - "confidence": 1, - "points": [ - [ - 830, - 1369 - ], - [ - 866, - 1369 - ], - [ - 866, - 1388 - ], - [ - 830, - 1388 - ] - ], - "text": "this" - }, - { - "bounds": { - "height": 19, - "width": 72, - "x": 874, - "y": 1369 - }, - "confidence": 1, - "points": [ - [ - 874, - 1369 - ], - [ - 946, - 1369 - ], - [ - 946, - 1388 - ], - [ - 874, - 1388 - ] - ], - "text": "market" - }, - { - "bounds": { - "height": 25, - "width": 1547, - "x": 75, - "y": 1369 - }, - "confidence": 1, - "points": [ - [ - 75, - 1369 - ], - [ - 1622, - 1369 - ], - [ - 1622, - 1394 - ], - [ - 75, - 1394 - ] - ], - "text": "subject;_______________________________________________________________________________________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -62745,8 +13662,9 @@ "x": 66, "y": 1512.6287 }, + "cells": null, "confidence": 0.6222827, - "id": "b1948040-41a4-4bcd-8111-512be8e6533c", + "id": "23c67199-4f45-4579-9aad-898a842a6fc9", "page": { "height": 2200, "pageIndex": 3, @@ -62774,933 +13692,7 @@ "readingOrder": 6, "role": "Text", "text": "Analysis of any current agreement of sale, option, or listing of the subject property and analysis of any prior sales of subject and\ncomparables within one year of the date of appraisal: __________________________________________________________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 86, - "x": 66, - "y": 1513 - }, - "confidence": 1, - "points": [ - [ - 66, - 1513 - ], - [ - 152, - 1513 - ], - [ - 152, - 1538 - ], - [ - 66, - 1538 - ] - ], - "text": "Analysis" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 158, - "y": 1513 - }, - "confidence": 1, - "points": [ - [ - 158, - 1513 - ], - [ - 177, - 1513 - ], - [ - 177, - 1532 - ], - [ - 158, - 1532 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 19, - "width": 36, - "x": 186, - "y": 1519 - }, - "confidence": 1, - "points": [ - [ - 186, - 1519 - ], - [ - 222, - 1519 - ], - [ - 222, - 1538 - ], - [ - 186, - 1538 - ] - ], - "text": "any" - }, - { - "bounds": { - "height": 16, - "width": 72, - "x": 227, - "y": 1516 - }, - "confidence": 1, - "points": [ - [ - 227, - 1516 - ], - [ - 299, - 1516 - ], - [ - 299, - 1532 - ], - [ - 227, - 1532 - ] - ], - "text": "current" - }, - { - "bounds": { - "height": 22, - "width": 108, - "x": 305, - "y": 1516 - }, - "confidence": 1, - "points": [ - [ - 305, - 1516 - ], - [ - 413, - 1516 - ], - [ - 413, - 1538 - ], - [ - 305, - 1538 - ] - ], - "text": "agreement" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 419, - "y": 1513 - }, - "confidence": 1, - "points": [ - [ - 419, - 1513 - ], - [ - 438, - 1513 - ], - [ - 438, - 1532 - ], - [ - 419, - 1532 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 22, - "width": 47, - "x": 444, - "y": 1513 - }, - "confidence": 1, - "points": [ - [ - 444, - 1513 - ], - [ - 491, - 1513 - ], - [ - 491, - 1535 - ], - [ - 444, - 1535 - ] - ], - "text": "sale," - }, - { - "bounds": { - "height": 25, - "width": 66, - "x": 499, - "y": 1513 - }, - "confidence": 1, - "points": [ - [ - 499, - 1513 - ], - [ - 565, - 1513 - ], - [ - 565, - 1538 - ], - [ - 499, - 1538 - ] - ], - "text": "option," - }, - { - "bounds": { - "height": 13, - "width": 19, - "x": 575, - "y": 1519 - }, - "confidence": 1, - "points": [ - [ - 575, - 1519 - ], - [ - 594, - 1519 - ], - [ - 594, - 1532 - ], - [ - 575, - 1532 - ] - ], - "text": "or" - }, - { - "bounds": { - "height": 25, - "width": 55, - "x": 602, - "y": 1513 - }, - "confidence": 1, - "points": [ - [ - 602, - 1513 - ], - [ - 657, - 1513 - ], - [ - 657, - 1538 - ], - [ - 602, - 1538 - ] - ], - "text": "listing" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 666, - "y": 1513 - }, - "confidence": 1, - "points": [ - [ - 666, - 1513 - ], - [ - 685, - 1513 - ], - [ - 685, - 1532 - ], - [ - 666, - 1532 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 19, - "width": 33, - "x": 691, - "y": 1513 - }, - "confidence": 1, - "points": [ - [ - 691, - 1513 - ], - [ - 724, - 1513 - ], - [ - 724, - 1532 - ], - [ - 691, - 1532 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 25, - "width": 72, - "x": 730, - "y": 1513 - }, - "confidence": 1, - "points": [ - [ - 730, - 1513 - ], - [ - 802, - 1513 - ], - [ - 802, - 1538 - ], - [ - 730, - 1538 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 22, - "width": 83, - "x": 808, - "y": 1516 - }, - "confidence": 1, - "points": [ - [ - 808, - 1516 - ], - [ - 891, - 1516 - ], - [ - 891, - 1538 - ], - [ - 808, - 1538 - ] - ], - "text": "property" - }, - { - "bounds": { - "height": 19, - "width": 38, - "x": 897, - "y": 1513 - }, - "confidence": 1, - "points": [ - [ - 897, - 1513 - ], - [ - 935, - 1513 - ], - [ - 935, - 1532 - ], - [ - 897, - 1532 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 25, - "width": 83, - "x": 941, - "y": 1513 - }, - "confidence": 1, - "points": [ - [ - 941, - 1513 - ], - [ - 1024, - 1513 - ], - [ - 1024, - 1538 - ], - [ - 941, - 1538 - ] - ], - "text": "analysis" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1030, - "y": 1513 - }, - "confidence": 1, - "points": [ - [ - 1030, - 1513 - ], - [ - 1049, - 1513 - ], - [ - 1049, - 1532 - ], - [ - 1030, - 1532 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 19, - "width": 36, - "x": 1058, - "y": 1519 - }, - "confidence": 1, - "points": [ - [ - 1058, - 1519 - ], - [ - 1094, - 1519 - ], - [ - 1094, - 1538 - ], - [ - 1058, - 1538 - ] - ], - "text": "any" - }, - { - "bounds": { - "height": 25, - "width": 47, - "x": 1100, - "y": 1513 - }, - "confidence": 1, - "points": [ - [ - 1100, - 1513 - ], - [ - 1147, - 1513 - ], - [ - 1147, - 1538 - ], - [ - 1100, - 1538 - ] - ], - "text": "prior" - }, - { - "bounds": { - "height": 19, - "width": 52, - "x": 1152, - "y": 1513 - }, - "confidence": 1, - "points": [ - [ - 1152, - 1513 - ], - [ - 1204, - 1513 - ], - [ - 1204, - 1532 - ], - [ - 1152, - 1532 - ] - ], - "text": "sales" - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 1211, - "y": 1513 - }, - "confidence": 1, - "points": [ - [ - 1211, - 1513 - ], - [ - 1233, - 1513 - ], - [ - 1233, - 1532 - ], - [ - 1211, - 1532 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 25, - "width": 72, - "x": 1238, - "y": 1513 - }, - "confidence": 1, - "points": [ - [ - 1238, - 1513 - ], - [ - 1310, - 1513 - ], - [ - 1310, - 1538 - ], - [ - 1238, - 1538 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 19, - "width": 36, - "x": 1316, - "y": 1513 - }, - "confidence": 1, - "points": [ - [ - 1316, - 1513 - ], - [ - 1352, - 1513 - ], - [ - 1352, - 1532 - ], - [ - 1316, - 1532 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 25, - "width": 130, - "x": 66, - "y": 1541 - }, - "confidence": 1, - "points": [ - [ - 66, - 1541 - ], - [ - 196, - 1541 - ], - [ - 196, - 1566 - ], - [ - 66, - 1566 - ] - ], - "text": "comparables" - }, - { - "bounds": { - "height": 19, - "width": 55, - "x": 202, - "y": 1541 - }, - "confidence": 1, - "points": [ - [ - 202, - 1541 - ], - [ - 257, - 1541 - ], - [ - 257, - 1560 - ], - [ - 202, - 1560 - ] - ], - "text": "within" - }, - { - "bounds": { - "height": 13, - "width": 38, - "x": 266, - "y": 1547 - }, - "confidence": 1, - "points": [ - [ - 266, - 1547 - ], - [ - 304, - 1547 - ], - [ - 304, - 1560 - ], - [ - 266, - 1560 - ] - ], - "text": "one" - }, - { - "bounds": { - "height": 19, - "width": 44, - "x": 311, - "y": 1547 - }, - "confidence": 1, - "points": [ - [ - 311, - 1547 - ], - [ - 355, - 1547 - ], - [ - 355, - 1566 - ], - [ - 311, - 1566 - ] - ], - "text": "year" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 361, - "y": 1541 - }, - "confidence": 1, - "points": [ - [ - 361, - 1541 - ], - [ - 380, - 1541 - ], - [ - 380, - 1560 - ], - [ - 361, - 1560 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 19, - "width": 33, - "x": 386, - "y": 1541 - }, - "confidence": 1, - "points": [ - [ - 386, - 1541 - ], - [ - 419, - 1541 - ], - [ - 419, - 1560 - ], - [ - 386, - 1560 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 19, - "width": 44, - "x": 424, - "y": 1541 - }, - "confidence": 1, - "points": [ - [ - 424, - 1541 - ], - [ - 468, - 1541 - ], - [ - 468, - 1560 - ], - [ - 424, - 1560 - ] - ], - "text": "date" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 474, - "y": 1541 - }, - "confidence": 1, - "points": [ - [ - 474, - 1541 - ], - [ - 493, - 1541 - ], - [ - 493, - 1560 - ], - [ - 474, - 1560 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 25, - "width": 94, - "x": 502, - "y": 1541 - }, - "confidence": 1, - "points": [ - [ - 502, - 1541 - ], - [ - 596, - 1541 - ], - [ - 596, - 1566 - ], - [ - 502, - 1566 - ] - ], - "text": "appraisal:" - }, - { - "bounds": { - "height": 2, - "width": 1016, - "x": 605, - "y": 1561 - }, - "confidence": 1, - "points": [ - [ - 605, - 1561 - ], - [ - 1621, - 1561 - ], - [ - 1621, - 1563 - ], - [ - 605, - 1563 - ] - ], - "text": "__________________________________________________________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -63709,8 +13701,9 @@ "x": 69.723724, "y": 1566 }, + "cells": null, "confidence": 0.7567921, - "id": "ea3d4dc5-e1aa-403e-aadc-4c5dbc5011bd", + "id": "96befc45-5749-4743-9b20-65283dc771e8", "page": { "height": 2200, "pageIndex": 3, @@ -63738,457 +13731,7 @@ "readingOrder": 7, "role": "Text", "text": "subject property is not currently listed for sale, and there are no known prior sales The_____________________________________________________________________________________________________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 25, - "width": 75, - "x": 116, - "y": 1566 - }, - "confidence": 1, - "points": [ - [ - 116, - 1566 - ], - [ - 191, - 1566 - ], - [ - 191, - 1591 - ], - [ - 116, - 1591 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 22, - "width": 86, - "x": 197, - "y": 1569 - }, - "confidence": 1, - "points": [ - [ - 197, - 1569 - ], - [ - 283, - 1569 - ], - [ - 283, - 1591 - ], - [ - 197, - 1591 - ] - ], - "text": "property" - }, - { - "bounds": { - "height": 19, - "width": 13, - "x": 288, - "y": 1566 - }, - "confidence": 1, - "points": [ - [ - 288, - 1566 - ], - [ - 301, - 1566 - ], - [ - 301, - 1585 - ], - [ - 288, - 1585 - ] - ], - "text": "is" - }, - { - "bounds": { - "height": 16, - "width": 33, - "x": 311, - "y": 1569 - }, - "confidence": 1, - "points": [ - [ - 311, - 1569 - ], - [ - 344, - 1569 - ], - [ - 344, - 1585 - ], - [ - 311, - 1585 - ] - ], - "text": "not" - }, - { - "bounds": { - "height": 25, - "width": 91, - "x": 347, - "y": 1566 - }, - "confidence": 1, - "points": [ - [ - 347, - 1566 - ], - [ - 438, - 1566 - ], - [ - 438, - 1591 - ], - [ - 347, - 1591 - ] - ], - "text": "currently" - }, - { - "bounds": { - "height": 19, - "width": 52, - "x": 444, - "y": 1566 - }, - "confidence": 1, - "points": [ - [ - 444, - 1566 - ], - [ - 496, - 1566 - ], - [ - 496, - 1585 - ], - [ - 444, - 1585 - ] - ], - "text": "listed" - }, - { - "bounds": { - "height": 19, - "width": 27, - "x": 502, - "y": 1566 - }, - "confidence": 1, - "points": [ - [ - 502, - 1566 - ], - [ - 529, - 1566 - ], - [ - 529, - 1585 - ], - [ - 502, - 1585 - ] - ], - "text": "for" - }, - { - "bounds": { - "height": 22, - "width": 47, - "x": 536, - "y": 1566 - }, - "confidence": 1, - "points": [ - [ - 536, - 1566 - ], - [ - 583, - 1566 - ], - [ - 583, - 1588 - ], - [ - 536, - 1588 - ] - ], - "text": "sale," - }, - { - "bounds": { - "height": 19, - "width": 36, - "x": 591, - "y": 1566 - }, - "confidence": 1, - "points": [ - [ - 591, - 1566 - ], - [ - 627, - 1566 - ], - [ - 627, - 1585 - ], - [ - 591, - 1585 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 19, - "width": 52, - "x": 633, - "y": 1566 - }, - "confidence": 1, - "points": [ - [ - 633, - 1566 - ], - [ - 685, - 1566 - ], - [ - 685, - 1585 - ], - [ - 633, - 1585 - ] - ], - "text": "there" - }, - { - "bounds": { - "height": 13, - "width": 33, - "x": 694, - "y": 1572 - }, - "confidence": 1, - "points": [ - [ - 694, - 1572 - ], - [ - 727, - 1572 - ], - [ - 727, - 1585 - ], - [ - 694, - 1585 - ] - ], - "text": "are" - }, - { - "bounds": { - "height": 13, - "width": 25, - "x": 733, - "y": 1572 - }, - "confidence": 1, - "points": [ - [ - 733, - 1572 - ], - [ - 758, - 1572 - ], - [ - 758, - 1585 - ], - [ - 733, - 1585 - ] - ], - "text": "no" - }, - { - "bounds": { - "height": 19, - "width": 63, - "x": 766, - "y": 1566 - }, - "confidence": 1, - "points": [ - [ - 766, - 1566 - ], - [ - 829, - 1566 - ], - [ - 829, - 1585 - ], - [ - 766, - 1585 - ] - ], - "text": "known" - }, - { - "bounds": { - "height": 25, - "width": 47, - "x": 838, - "y": 1566 - }, - "confidence": 1, - "points": [ - [ - 838, - 1566 - ], - [ - 885, - 1566 - ], - [ - 885, - 1591 - ], - [ - 838, - 1591 - ] - ], - "text": "prior" - }, - { - "bounds": { - "height": 19, - "width": 52, - "x": 888, - "y": 1566 - }, - "confidence": 1, - "points": [ - [ - 888, - 1566 - ], - [ - 940, - 1566 - ], - [ - 940, - 1585 - ], - [ - 888, - 1585 - ] - ], - "text": "sales" - }, - { - "bounds": { - "height": 25, - "width": 1550, - "x": 72, - "y": 1566 - }, - "confidence": 1, - "points": [ - [ - 72, - 1566 - ], - [ - 1622, - 1566 - ], - [ - 1622, - 1591 - ], - [ - 72, - 1591 - ] - ], - "text": "The_____________________________________________________________________________________________________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -64197,8 +13740,9 @@ "x": 70.50023, "y": 1596.0598 }, + "cells": null, "confidence": 0.64142895, - "id": "7e05197e-1b0c-49d8-8f40-3382c437fc83", + "id": "7aef766c-8329-4924-8417-caeedd940c45", "page": { "height": 2200, "pageIndex": 3, @@ -64226,401 +13770,7 @@ "readingOrder": 8, "role": "Text", "text": "the subject or comparables within the past year that would affect this analysis. of_____________________________________________________________________________________________________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 33, - "x": 97, - "y": 1597 - }, - "confidence": 1, - "points": [ - [ - 97, - 1597 - ], - [ - 130, - 1597 - ], - [ - 130, - 1616 - ], - [ - 97, - 1616 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 25, - "width": 75, - "x": 136, - "y": 1597 - }, - "confidence": 1, - "points": [ - [ - 136, - 1597 - ], - [ - 211, - 1597 - ], - [ - 211, - 1622 - ], - [ - 136, - 1622 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 13, - "width": 25, - "x": 213, - "y": 1602 - }, - "confidence": 1, - "points": [ - [ - 213, - 1602 - ], - [ - 238, - 1602 - ], - [ - 238, - 1615 - ], - [ - 213, - 1615 - ] - ], - "text": "or" - }, - { - "bounds": { - "height": 25, - "width": 130, - "x": 241, - "y": 1597 - }, - "confidence": 1, - "points": [ - [ - 241, - 1597 - ], - [ - 371, - 1597 - ], - [ - 371, - 1622 - ], - [ - 241, - 1622 - ] - ], - "text": "comparables" - }, - { - "bounds": { - "height": 19, - "width": 61, - "x": 377, - "y": 1597 - }, - "confidence": 1, - "points": [ - [ - 377, - 1597 - ], - [ - 438, - 1597 - ], - [ - 438, - 1616 - ], - [ - 377, - 1616 - ] - ], - "text": "within" - }, - { - "bounds": { - "height": 19, - "width": 30, - "x": 444, - "y": 1597 - }, - "confidence": 1, - "points": [ - [ - 444, - 1597 - ], - [ - 474, - 1597 - ], - [ - 474, - 1616 - ], - [ - 444, - 1616 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 44, - "x": 483, - "y": 1600 - }, - "confidence": 1, - "points": [ - [ - 483, - 1600 - ], - [ - 527, - 1600 - ], - [ - 527, - 1622 - ], - [ - 483, - 1622 - ] - ], - "text": "past" - }, - { - "bounds": { - "height": 19, - "width": 47, - "x": 530, - "y": 1602 - }, - "confidence": 1, - "points": [ - [ - 530, - 1602 - ], - [ - 577, - 1602 - ], - [ - 577, - 1621 - ], - [ - 530, - 1621 - ] - ], - "text": "year" - }, - { - "bounds": { - "height": 19, - "width": 38, - "x": 583, - "y": 1597 - }, - "confidence": 1, - "points": [ - [ - 583, - 1597 - ], - [ - 621, - 1597 - ], - [ - 621, - 1616 - ], - [ - 583, - 1616 - ] - ], - "text": "that" - }, - { - "bounds": { - "height": 19, - "width": 61, - "x": 627, - "y": 1597 - }, - "confidence": 1, - "points": [ - [ - 627, - 1597 - ], - [ - 688, - 1597 - ], - [ - 688, - 1616 - ], - [ - 627, - 1616 - ] - ], - "text": "would" - }, - { - "bounds": { - "height": 19, - "width": 58, - "x": 694, - "y": 1597 - }, - "confidence": 1, - "points": [ - [ - 694, - 1597 - ], - [ - 752, - 1597 - ], - [ - 752, - 1616 - ], - [ - 694, - 1616 - ] - ], - "text": "affect" - }, - { - "bounds": { - "height": 19, - "width": 36, - "x": 755, - "y": 1597 - }, - "confidence": 1, - "points": [ - [ - 755, - 1597 - ], - [ - 791, - 1597 - ], - [ - 791, - 1616 - ], - [ - 755, - 1616 - ] - ], - "text": "this" - }, - { - "bounds": { - "height": 25, - "width": 88, - "x": 797, - "y": 1597 - }, - "confidence": 1, - "points": [ - [ - 797, - 1597 - ], - [ - 885, - 1597 - ], - [ - 885, - 1622 - ], - [ - 797, - 1622 - ] - ], - "text": "analysis." - }, - { - "bounds": { - "height": 22, - "width": 1550, - "x": 72, - "y": 1597 - }, - "confidence": 1, - "points": [ - [ - 72, - 1597 - ], - [ - 1622, - 1597 - ], - [ - 1622, - 1619 - ], - [ - 72, - 1619 - ] - ], - "text": "of_____________________________________________________________________________________________________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -64629,8 +13779,9 @@ "x": 64.073685, "y": 1621.8406 }, + "cells": null, "confidence": 0.5430971, - "id": "4aba3fb2-fbf7-4a11-b45d-05b1becfd781", + "id": "687da27c-84df-47f3-8053-13745e74542e", "page": { "height": 2200, "pageIndex": 3, @@ -64658,1185 +13809,7 @@ "readingOrder": 9, "role": "Text", "text": "Total gross monthly estimated rent $ 2,300________ x gross rent multiplier (GRM) 132.6________ =$ 305,000________ INDICATED VALUE BY INCOMING APPROACH\nComments on income approach (including expense rates, if available, and reconciliation of the GRM) derived from comparable rental sale; income approach GRM___________________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 50, - "x": 66, - "y": 1624 - }, - "confidence": 1, - "points": [ - [ - 66, - 1624 - ], - [ - 116, - 1624 - ], - [ - 116, - 1643 - ], - [ - 66, - 1643 - ] - ], - "text": "Total" - }, - { - "bounds": { - "height": 19, - "width": 55, - "x": 122, - "y": 1630 - }, - "confidence": 1, - "points": [ - [ - 122, - 1630 - ], - [ - 177, - 1630 - ], - [ - 177, - 1649 - ], - [ - 122, - 1649 - ] - ], - "text": "gross" - }, - { - "bounds": { - "height": 25, - "width": 77, - "x": 186, - "y": 1624 - }, - "confidence": 1, - "points": [ - [ - 186, - 1624 - ], - [ - 263, - 1624 - ], - [ - 263, - 1649 - ], - [ - 186, - 1649 - ] - ], - "text": "monthly" - }, - { - "bounds": { - "height": 19, - "width": 97, - "x": 272, - "y": 1624 - }, - "confidence": 1, - "points": [ - [ - 272, - 1624 - ], - [ - 369, - 1624 - ], - [ - 369, - 1643 - ], - [ - 272, - 1643 - ] - ], - "text": "estimated" - }, - { - "bounds": { - "height": 16, - "width": 38, - "x": 377, - "y": 1627 - }, - "confidence": 1, - "points": [ - [ - 377, - 1627 - ], - [ - 415, - 1627 - ], - [ - 415, - 1643 - ], - [ - 377, - 1643 - ] - ], - "text": "rent" - }, - { - "bounds": { - "height": 22, - "width": 13, - "x": 422, - "y": 1624 - }, - "confidence": 1, - "points": [ - [ - 422, - 1624 - ], - [ - 435, - 1624 - ], - [ - 435, - 1646 - ], - [ - 422, - 1646 - ] - ], - "text": "$" - }, - { - "bounds": { - "height": 22, - "width": 102, - "x": 444, - "y": 1624 - }, - "confidence": 1, - "points": [ - [ - 444, - 1624 - ], - [ - 546, - 1624 - ], - [ - 546, - 1646 - ], - [ - 444, - 1646 - ] - ], - "text": "2,300________" - }, - { - "bounds": { - "height": 13, - "width": 11, - "x": 550, - "y": 1630 - }, - "confidence": 1, - "points": [ - [ - 550, - 1630 - ], - [ - 561, - 1630 - ], - [ - 561, - 1643 - ], - [ - 550, - 1643 - ] - ], - "text": "x" - }, - { - "bounds": { - "height": 19, - "width": 55, - "x": 569, - "y": 1630 - }, - "confidence": 1, - "points": [ - [ - 569, - 1630 - ], - [ - 624, - 1630 - ], - [ - 624, - 1649 - ], - [ - 569, - 1649 - ] - ], - "text": "gross" - }, - { - "bounds": { - "height": 16, - "width": 38, - "x": 633, - "y": 1627 - }, - "confidence": 1, - "points": [ - [ - 633, - 1627 - ], - [ - 671, - 1627 - ], - [ - 671, - 1643 - ], - [ - 633, - 1643 - ] - ], - "text": "rent" - }, - { - "bounds": { - "height": 25, - "width": 88, - "x": 680, - "y": 1624 - }, - "confidence": 1, - "points": [ - [ - 680, - 1624 - ], - [ - 768, - 1624 - ], - [ - 768, - 1649 - ], - [ - 680, - 1649 - ] - ], - "text": "multiplier" - }, - { - "bounds": { - "height": 25, - "width": 66, - "x": 777, - "y": 1624 - }, - "confidence": 1, - "points": [ - [ - 777, - 1624 - ], - [ - 843, - 1624 - ], - [ - 843, - 1649 - ], - [ - 777, - 1649 - ] - ], - "text": "(GRM)" - }, - { - "bounds": { - "height": 22, - "width": 105, - "x": 849, - "y": 1624 - }, - "confidence": 1, - "points": [ - [ - 849, - 1624 - ], - [ - 954, - 1624 - ], - [ - 954, - 1646 - ], - [ - 849, - 1646 - ] - ], - "text": "132.6________" - }, - { - "bounds": { - "height": 22, - "width": 27, - "x": 955, - "y": 1624 - }, - "confidence": 1, - "points": [ - [ - 955, - 1624 - ], - [ - 982, - 1624 - ], - [ - 982, - 1646 - ], - [ - 955, - 1646 - ] - ], - "text": "=$" - }, - { - "bounds": { - "height": 22, - "width": 105, - "x": 986, - "y": 1624 - }, - "confidence": 1, - "points": [ - [ - 986, - 1624 - ], - [ - 1091, - 1624 - ], - [ - 1091, - 1646 - ], - [ - 986, - 1646 - ] - ], - "text": "305,000________" - }, - { - "bounds": { - "height": 19, - "width": 116, - "x": 1100, - "y": 1624 - }, - "confidence": 1, - "points": [ - [ - 1100, - 1624 - ], - [ - 1216, - 1624 - ], - [ - 1216, - 1643 - ], - [ - 1100, - 1643 - ] - ], - "text": "INDICATED" - }, - { - "bounds": { - "height": 19, - "width": 72, - "x": 1225, - "y": 1624 - }, - "confidence": 1, - "points": [ - [ - 1225, - 1624 - ], - [ - 1297, - 1624 - ], - [ - 1297, - 1643 - ], - [ - 1225, - 1643 - ] - ], - "text": "VALUE" - }, - { - "bounds": { - "height": 19, - "width": 30, - "x": 1305, - "y": 1624 - }, - "confidence": 1, - "points": [ - [ - 1305, - 1624 - ], - [ - 1335, - 1624 - ], - [ - 1335, - 1643 - ], - [ - 1305, - 1643 - ] - ], - "text": "BY" - }, - { - "bounds": { - "height": 19, - "width": 113, - "x": 1344, - "y": 1624 - }, - "confidence": 1, - "points": [ - [ - 1344, - 1624 - ], - [ - 1457, - 1624 - ], - [ - 1457, - 1643 - ], - [ - 1344, - 1643 - ] - ], - "text": "INCOMING" - }, - { - "bounds": { - "height": 19, - "width": 122, - "x": 1466, - "y": 1624 - }, - "confidence": 1, - "points": [ - [ - 1466, - 1624 - ], - [ - 1588, - 1624 - ], - [ - 1588, - 1643 - ], - [ - 1466, - 1643 - ] - ], - "text": "APPROACH" - }, - { - "bounds": { - "height": 19, - "width": 108, - "x": 69, - "y": 1652 - }, - "confidence": 1, - "points": [ - [ - 69, - 1652 - ], - [ - 177, - 1652 - ], - [ - 177, - 1671 - ], - [ - 69, - 1671 - ] - ], - "text": "Comments" - }, - { - "bounds": { - "height": 16, - "width": 25, - "x": 183, - "y": 1655 - }, - "confidence": 1, - "points": [ - [ - 183, - 1655 - ], - [ - 208, - 1655 - ], - [ - 208, - 1671 - ], - [ - 183, - 1671 - ] - ], - "text": "on" - }, - { - "bounds": { - "height": 19, - "width": 72, - "x": 216, - "y": 1652 - }, - "confidence": 1, - "points": [ - [ - 216, - 1652 - ], - [ - 288, - 1652 - ], - [ - 288, - 1671 - ], - [ - 216, - 1671 - ] - ], - "text": "income" - }, - { - "bounds": { - "height": 22, - "width": 94, - "x": 294, - "y": 1652 - }, - "confidence": 1, - "points": [ - [ - 294, - 1652 - ], - [ - 388, - 1652 - ], - [ - 388, - 1674 - ], - [ - 294, - 1674 - ] - ], - "text": "approach" - }, - { - "bounds": { - "height": 22, - "width": 94, - "x": 397, - "y": 1652 - }, - "confidence": 1, - "points": [ - [ - 397, - 1652 - ], - [ - 491, - 1652 - ], - [ - 491, - 1674 - ], - [ - 397, - 1674 - ] - ], - "text": "(including" - }, - { - "bounds": { - "height": 19, - "width": 86, - "x": 497, - "y": 1655 - }, - "confidence": 1, - "points": [ - [ - 497, - 1655 - ], - [ - 583, - 1655 - ], - [ - 583, - 1674 - ], - [ - 497, - 1674 - ] - ], - "text": "expense" - }, - { - "bounds": { - "height": 22, - "width": 55, - "x": 591, - "y": 1652 - }, - "confidence": 1, - "points": [ - [ - 591, - 1652 - ], - [ - 646, - 1652 - ], - [ - 646, - 1674 - ], - [ - 591, - 1674 - ] - ], - "text": "rates," - }, - { - "bounds": { - "height": 16, - "width": 11, - "x": 655, - "y": 1652 - }, - "confidence": 1, - "points": [ - [ - 655, - 1652 - ], - [ - 666, - 1652 - ], - [ - 666, - 1668 - ], - [ - 655, - 1668 - ] - ], - "text": "if" - }, - { - "bounds": { - "height": 22, - "width": 94, - "x": 672, - "y": 1652 - }, - "confidence": 1, - "points": [ - [ - 672, - 1652 - ], - [ - 766, - 1652 - ], - [ - 766, - 1674 - ], - [ - 672, - 1674 - ] - ], - "text": "available," - }, - { - "bounds": { - "height": 19, - "width": 36, - "x": 775, - "y": 1652 - }, - "confidence": 1, - "points": [ - [ - 775, - 1652 - ], - [ - 811, - 1652 - ], - [ - 811, - 1671 - ], - [ - 775, - 1671 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 19, - "width": 130, - "x": 819, - "y": 1652 - }, - "confidence": 1, - "points": [ - [ - 819, - 1652 - ], - [ - 949, - 1652 - ], - [ - 949, - 1671 - ], - [ - 819, - 1671 - ] - ], - "text": "reconciliation" - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 955, - "y": 1652 - }, - "confidence": 1, - "points": [ - [ - 955, - 1652 - ], - [ - 977, - 1652 - ], - [ - 977, - 1671 - ], - [ - 955, - 1671 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 19, - "width": 30, - "x": 983, - "y": 1652 - }, - "confidence": 1, - "points": [ - [ - 983, - 1652 - ], - [ - 1013, - 1652 - ], - [ - 1013, - 1671 - ], - [ - 983, - 1671 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 58, - "x": 1022, - "y": 1652 - }, - "confidence": 1, - "points": [ - [ - 1022, - 1652 - ], - [ - 1080, - 1652 - ], - [ - 1080, - 1674 - ], - [ - 1022, - 1674 - ] - ], - "text": "GRM)" - }, - { - "bounds": { - "height": 19, - "width": 77, - "x": 1141, - "y": 1649 - }, - "confidence": 1, - "points": [ - [ - 1141, - 1649 - ], - [ - 1218, - 1649 - ], - [ - 1218, - 1668 - ], - [ - 1141, - 1668 - ] - ], - "text": "derived" - }, - { - "bounds": { - "height": 19, - "width": 47, - "x": 1225, - "y": 1649 - }, - "confidence": 1, - "points": [ - [ - 1225, - 1649 - ], - [ - 1272, - 1649 - ], - [ - 1272, - 1668 - ], - [ - 1225, - 1668 - ] - ], - "text": "from" - }, - { - "bounds": { - "height": 25, - "width": 119, - "x": 1277, - "y": 1649 - }, - "confidence": 1, - "points": [ - [ - 1277, - 1649 - ], - [ - 1396, - 1649 - ], - [ - 1396, - 1674 - ], - [ - 1277, - 1674 - ] - ], - "text": "comparable" - }, - { - "bounds": { - "height": 19, - "width": 58, - "x": 1402, - "y": 1649 - }, - "confidence": 1, - "points": [ - [ - 1402, - 1649 - ], - [ - 1460, - 1649 - ], - [ - 1460, - 1668 - ], - [ - 1402, - 1668 - ] - ], - "text": "rental" - }, - { - "bounds": { - "height": 22, - "width": 47, - "x": 1466, - "y": 1649 - }, - "confidence": 1, - "points": [ - [ - 1466, - 1649 - ], - [ - 1513, - 1649 - ], - [ - 1513, - 1671 - ], - [ - 1466, - 1671 - ] - ], - "text": "sale;" - }, - { - "bounds": { - "height": 19, - "width": 72, - "x": 1522, - "y": 1649 - }, - "confidence": 1, - "points": [ - [ - 1522, - 1649 - ], - [ - 1594, - 1649 - ], - [ - 1594, - 1668 - ], - [ - 1522, - 1668 - ] - ], - "text": "income" - }, - { - "bounds": { - "height": 25, - "width": 97, - "x": 1600, - "y": 1649 - }, - "confidence": 1, - "points": [ - [ - 1600, - 1649 - ], - [ - 1697, - 1649 - ], - [ - 1697, - 1674 - ], - [ - 1600, - 1674 - ] - ], - "text": "approach" - }, - { - "bounds": { - "height": 25, - "width": 538, - "x": 1083, - "y": 1649 - }, - "confidence": 1, - "points": [ - [ - 1083, - 1649 - ], - [ - 1621, - 1649 - ], - [ - 1621, - 1674 - ], - [ - 1083, - 1674 - ] - ], - "text": "GRM___________________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -65845,8 +13818,9 @@ "x": 69, "y": 1705 }, + "cells": null, "confidence": 0.67734665, - "id": "fa62d31a-dd8d-46c9-ac95-45fc5c557c7f", + "id": "743f3c8d-a49d-4a43-92c9-52e73f991bc1", "page": { "height": 2200, "pageIndex": 3, @@ -65874,177 +13848,7 @@ "readingOrder": 10, "role": "Text", "text": "INDICATED VALUE BY SALES COMPARISON APPROACH", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 100, - "x": 69, - "y": 1705 - }, - "confidence": 1, - "points": [ - [ - 69, - 1705 - ], - [ - 169, - 1705 - ], - [ - 169, - 1724 - ], - [ - 69, - 1724 - ] - ], - "text": "INDICATED" - }, - { - "bounds": { - "height": 16, - "width": 63, - "x": 169, - "y": 1708 - }, - "confidence": 1, - "points": [ - [ - 169, - 1708 - ], - [ - 232, - 1708 - ], - [ - 232, - 1724 - ], - [ - 169, - 1724 - ] - ], - "text": "VALUE" - }, - { - "bounds": { - "height": 16, - "width": 25, - "x": 236, - "y": 1708 - }, - "confidence": 1, - "points": [ - [ - 236, - 1708 - ], - [ - 261, - 1708 - ], - [ - 261, - 1724 - ], - [ - 236, - 1724 - ] - ], - "text": "BY" - }, - { - "bounds": { - "height": 19, - "width": 61, - "x": 263, - "y": 1705 - }, - "confidence": 1, - "points": [ - [ - 263, - 1705 - ], - [ - 324, - 1705 - ], - [ - 324, - 1724 - ], - [ - 263, - 1724 - ] - ], - "text": "SALES" - }, - { - "bounds": { - "height": 19, - "width": 127, - "x": 327, - "y": 1705 - }, - "confidence": 1, - "points": [ - [ - 327, - 1705 - ], - [ - 454, - 1705 - ], - [ - 454, - 1724 - ], - [ - 327, - 1724 - ] - ], - "text": "COMPARISON" - }, - { - "bounds": { - "height": 19, - "width": 105, - "x": 458, - "y": 1705 - }, - "confidence": 1, - "points": [ - [ - 458, - 1705 - ], - [ - 563, - 1705 - ], - [ - 563, - 1724 - ], - [ - 458, - 1724 - ] - ], - "text": "APPROACH" - } - ] + "type": "paragraph" }, { "bounds": { @@ -66053,8 +13857,9 @@ "x": 69, "y": 1728.8583 }, + "cells": null, "confidence": 0.6204289, - "id": "c609580c-3e24-4f7b-89ae-c1d50b49bc25", + "id": "2b2e61f4-d70e-4535-90e6-491eeffebfd5", "page": { "height": 2200, "pageIndex": 3, @@ -66082,177 +13887,7 @@ "readingOrder": 11, "role": "Text", "text": "INDICATED VALUE BY INCOME $ 305,000___________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 100, - "x": 69, - "y": 1730 - }, - "confidence": 1, - "points": [ - [ - 69, - 1730 - ], - [ - 169, - 1730 - ], - [ - 169, - 1749 - ], - [ - 69, - 1749 - ] - ], - "text": "INDICATED" - }, - { - "bounds": { - "height": 19, - "width": 61, - "x": 169, - "y": 1730 - }, - "confidence": 1, - "points": [ - [ - 169, - 1730 - ], - [ - 230, - 1730 - ], - [ - 230, - 1749 - ], - [ - 169, - 1749 - ] - ], - "text": "VALUE" - }, - { - "bounds": { - "height": 19, - "width": 25, - "x": 236, - "y": 1730 - }, - "confidence": 1, - "points": [ - [ - 236, - 1730 - ], - [ - 261, - 1730 - ], - [ - 261, - 1749 - ], - [ - 236, - 1749 - ] - ], - "text": "BY" - }, - { - "bounds": { - "height": 19, - "width": 75, - "x": 263, - "y": 1730 - }, - "confidence": 1, - "points": [ - [ - 263, - 1730 - ], - [ - 338, - 1730 - ], - [ - 338, - 1749 - ], - [ - 263, - 1749 - ] - ], - "text": "INCOME" - }, - { - "bounds": { - "height": 19, - "width": 13, - "x": 1391, - "y": 1730 - }, - "confidence": 1, - "points": [ - [ - 1391, - 1730 - ], - [ - 1404, - 1730 - ], - [ - 1404, - 1749 - ], - [ - 1391, - 1749 - ] - ], - "text": "$" - }, - { - "bounds": { - "height": 22, - "width": 208, - "x": 1413, - "y": 1730 - }, - "confidence": 1, - "points": [ - [ - 1413, - 1730 - ], - [ - 1621, - 1730 - ], - [ - 1621, - 1752 - ], - [ - 1413, - 1752 - ] - ], - "text": "305,000___________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -66261,8 +13896,9 @@ "x": 69, "y": 1752 }, + "cells": null, "confidence": 0.649327, - "id": "eab36538-4850-4ca7-af09-cddbc8447da8", + "id": "0148de3e-83fd-4ce8-9852-e74483a88341", "page": { "height": 2200, "pageIndex": 3, @@ -66290,205 +13926,7 @@ "readingOrder": 12, "role": "Text", "text": "INDICATED VALUE BY COST APPROACH $ 295,500___________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 16, - "width": 100, - "x": 69, - "y": 1755 - }, - "confidence": 1, - "points": [ - [ - 69, - 1755 - ], - [ - 169, - 1755 - ], - [ - 169, - 1771 - ], - [ - 69, - 1771 - ] - ], - "text": "INDICATED" - }, - { - "bounds": { - "height": 16, - "width": 61, - "x": 169, - "y": 1755 - }, - "confidence": 1, - "points": [ - [ - 169, - 1755 - ], - [ - 230, - 1755 - ], - [ - 230, - 1771 - ], - [ - 169, - 1771 - ] - ], - "text": "VALUE" - }, - { - "bounds": { - "height": 16, - "width": 25, - "x": 236, - "y": 1755 - }, - "confidence": 1, - "points": [ - [ - 236, - 1755 - ], - [ - 261, - 1755 - ], - [ - 261, - 1771 - ], - [ - 236, - 1771 - ] - ], - "text": "BY" - }, - { - "bounds": { - "height": 16, - "width": 52, - "x": 263, - "y": 1755 - }, - "confidence": 1, - "points": [ - [ - 263, - 1755 - ], - [ - 315, - 1755 - ], - [ - 315, - 1771 - ], - [ - 263, - 1771 - ] - ], - "text": "COST" - }, - { - "bounds": { - "height": 16, - "width": 105, - "x": 319, - "y": 1755 - }, - "confidence": 1, - "points": [ - [ - 319, - 1755 - ], - [ - 424, - 1755 - ], - [ - 424, - 1771 - ], - [ - 319, - 1771 - ] - ], - "text": "APPROACH" - }, - { - "bounds": { - "height": 19, - "width": 13, - "x": 1391, - "y": 1755 - }, - "confidence": 1, - "points": [ - [ - 1391, - 1755 - ], - [ - 1404, - 1755 - ], - [ - 1404, - 1774 - ], - [ - 1391, - 1774 - ] - ], - "text": "$" - }, - { - "bounds": { - "height": 22, - "width": 208, - "x": 1413, - "y": 1752 - }, - "confidence": 1, - "points": [ - [ - 1413, - 1752 - ], - [ - 1621, - 1752 - ], - [ - 1621, - 1774 - ], - [ - 1413, - 1774 - ] - ], - "text": "295,500___________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -66497,8 +13935,9 @@ "x": 281.6343, "y": 1777.9708 }, + "cells": null, "confidence": 0.7422199, - "id": "cea26749-dc70-45dd-a96c-9747038f9487", + "id": "19c3ae88-290a-40a5-b5f2-b66a1fa9b978", "page": { "height": 2200, "pageIndex": 3, @@ -66535,8 +13974,9 @@ "x": 280, "y": 1779.3513 }, + "cells": null, "confidence": 0.45211408, - "id": "a383e957-071f-4897-8fbb-591ac9664f8a", + "id": "da93090f-ec30-4196-bff8-c3c7f231e0ad", "page": { "height": 2200, "pageIndex": 3, @@ -66564,653 +14004,7 @@ "readingOrder": 14, "role": "CheckboxUnselected", "text": "4 ❐ \\as is\\ ❐ subject to the repairs, alterations, inspections, or conditions listed below ❐ subject to completion per plans and specifications", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 13, - "width": 13, - "x": 283, - "y": 1780 - }, - "confidence": 1, - "points": [ - [ - 283, - 1780 - ], - [ - 296, - 1780 - ], - [ - 296, - 1793 - ], - [ - 283, - 1793 - ] - ], - "text": "4" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 280, - "y": 1780 - }, - "confidence": 1, - "points": [ - [ - 280, - 1780 - ], - [ - 299, - 1780 - ], - [ - 299, - 1799 - ], - [ - 280, - 1799 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 16, - "width": 27, - "x": 305, - "y": 1783 - }, - "confidence": 1, - "points": [ - [ - 305, - 1783 - ], - [ - 332, - 1783 - ], - [ - 332, - 1799 - ], - [ - 305, - 1799 - ] - ], - "text": "\\as" - }, - { - "bounds": { - "height": 16, - "width": 22, - "x": 338, - "y": 1783 - }, - "confidence": 1, - "points": [ - [ - 338, - 1783 - ], - [ - 360, - 1783 - ], - [ - 360, - 1799 - ], - [ - 338, - 1799 - ] - ], - "text": "is\\" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 391, - "y": 1780 - }, - "confidence": 1, - "points": [ - [ - 391, - 1780 - ], - [ - 410, - 1780 - ], - [ - 410, - 1799 - ], - [ - 391, - 1799 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 63, - "x": 416, - "y": 1783 - }, - "confidence": 1, - "points": [ - [ - 416, - 1783 - ], - [ - 479, - 1783 - ], - [ - 479, - 1802 - ], - [ - 416, - 1802 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 16, - "width": 19, - "x": 483, - "y": 1783 - }, - "confidence": 1, - "points": [ - [ - 483, - 1783 - ], - [ - 502, - 1783 - ], - [ - 502, - 1799 - ], - [ - 483, - 1799 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 16, - "width": 27, - "x": 505, - "y": 1783 - }, - "confidence": 1, - "points": [ - [ - 505, - 1783 - ], - [ - 532, - 1783 - ], - [ - 532, - 1799 - ], - [ - 505, - 1799 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 19, - "width": 63, - "x": 538, - "y": 1783 - }, - "confidence": 1, - "points": [ - [ - 538, - 1783 - ], - [ - 601, - 1783 - ], - [ - 601, - 1802 - ], - [ - 538, - 1802 - ] - ], - "text": "repairs," - }, - { - "bounds": { - "height": 19, - "width": 97, - "x": 608, - "y": 1783 - }, - "confidence": 1, - "points": [ - [ - 608, - 1783 - ], - [ - 705, - 1783 - ], - [ - 705, - 1802 - ], - [ - 608, - 1802 - ] - ], - "text": "alterations," - }, - { - "bounds": { - "height": 19, - "width": 102, - "x": 711, - "y": 1783 - }, - "confidence": 1, - "points": [ - [ - 711, - 1783 - ], - [ - 813, - 1783 - ], - [ - 813, - 1802 - ], - [ - 711, - 1802 - ] - ], - "text": "inspections," - }, - { - "bounds": { - "height": 13, - "width": 19, - "x": 819, - "y": 1786 - }, - "confidence": 1, - "points": [ - [ - 819, - 1786 - ], - [ - 838, - 1786 - ], - [ - 838, - 1799 - ], - [ - 819, - 1799 - ] - ], - "text": "or" - }, - { - "bounds": { - "height": 16, - "width": 88, - "x": 841, - "y": 1783 - }, - "confidence": 1, - "points": [ - [ - 841, - 1783 - ], - [ - 929, - 1783 - ], - [ - 929, - 1799 - ], - [ - 841, - 1799 - ] - ], - "text": "conditions" - }, - { - "bounds": { - "height": 16, - "width": 44, - "x": 936, - "y": 1783 - }, - "confidence": 1, - "points": [ - [ - 936, - 1783 - ], - [ - 980, - 1783 - ], - [ - 980, - 1799 - ], - [ - 936, - 1799 - ] - ], - "text": "listed" - }, - { - "bounds": { - "height": 16, - "width": 52, - "x": 986, - "y": 1783 - }, - "confidence": 1, - "points": [ - [ - 986, - 1783 - ], - [ - 1038, - 1783 - ], - [ - 1038, - 1799 - ], - [ - 986, - 1799 - ] - ], - "text": "below" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 1069, - "y": 1780 - }, - "confidence": 1, - "points": [ - [ - 1069, - 1780 - ], - [ - 1088, - 1780 - ], - [ - 1088, - 1799 - ], - [ - 1069, - 1799 - ] - ], - "text": "❐" - }, - { - "bounds": { - "height": 19, - "width": 61, - "x": 1097, - "y": 1783 - }, - "confidence": 1, - "points": [ - [ - 1097, - 1783 - ], - [ - 1158, - 1783 - ], - [ - 1158, - 1802 - ], - [ - 1097, - 1802 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 16, - "width": 16, - "x": 1163, - "y": 1783 - }, - "confidence": 1, - "points": [ - [ - 1163, - 1783 - ], - [ - 1179, - 1783 - ], - [ - 1179, - 1799 - ], - [ - 1163, - 1799 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 19, - "width": 94, - "x": 1186, - "y": 1783 - }, - "confidence": 1, - "points": [ - [ - 1186, - 1783 - ], - [ - 1280, - 1783 - ], - [ - 1280, - 1802 - ], - [ - 1186, - 1802 - ] - ], - "text": "completion" - }, - { - "bounds": { - "height": 16, - "width": 30, - "x": 1286, - "y": 1786 - }, - "confidence": 1, - "points": [ - [ - 1286, - 1786 - ], - [ - 1316, - 1786 - ], - [ - 1316, - 1802 - ], - [ - 1286, - 1802 - ] - ], - "text": "per" - }, - { - "bounds": { - "height": 19, - "width": 47, - "x": 1319, - "y": 1783 - }, - "confidence": 1, - "points": [ - [ - 1319, - 1783 - ], - [ - 1366, - 1783 - ], - [ - 1366, - 1802 - ], - [ - 1319, - 1802 - ] - ], - "text": "plans" - }, - { - "bounds": { - "height": 16, - "width": 33, - "x": 1372, - "y": 1783 - }, - "confidence": 1, - "points": [ - [ - 1372, - 1783 - ], - [ - 1405, - 1783 - ], - [ - 1405, - 1799 - ], - [ - 1372, - 1799 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 19, - "width": 119, - "x": 1408, - "y": 1783 - }, - "confidence": 1, - "points": [ - [ - 1408, - 1783 - ], - [ - 1527, - 1783 - ], - [ - 1527, - 1802 - ], - [ - 1408, - 1802 - ] - ], - "text": "specifications" - } - ] + "type": "paragraph" }, { "bounds": { @@ -67219,8 +14013,9 @@ "x": 69, "y": 1827 }, + "cells": null, "confidence": 0.6891169, - "id": "598029d5-76fb-43e5-b520-927cbe100da5", + "id": "2f7fb9ea-3f80-45d6-87b7-d5c9659b57d8", "page": { "height": 2200, "pageIndex": 3, @@ -67248,401 +14043,7 @@ "readingOrder": 15, "role": "Text", "text": "Greatest weight was given to the sales comparison approach, as it most directly _______________________________________________________________________________________________________________________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 88, - "x": 72, - "y": 1830 - }, - "confidence": 1, - "points": [ - [ - 72, - 1830 - ], - [ - 160, - 1830 - ], - [ - 160, - 1849 - ], - [ - 72, - 1849 - ] - ], - "text": "Greatest" - }, - { - "bounds": { - "height": 27, - "width": 69, - "x": 166, - "y": 1827 - }, - "confidence": 1, - "points": [ - [ - 166, - 1827 - ], - [ - 235, - 1827 - ], - [ - 235, - 1854 - ], - [ - 166, - 1854 - ] - ], - "text": "weight" - }, - { - "bounds": { - "height": 16, - "width": 38, - "x": 238, - "y": 1833 - }, - "confidence": 1, - "points": [ - [ - 238, - 1833 - ], - [ - 276, - 1833 - ], - [ - 276, - 1849 - ], - [ - 238, - 1849 - ] - ], - "text": "was" - }, - { - "bounds": { - "height": 27, - "width": 55, - "x": 286, - "y": 1827 - }, - "confidence": 1, - "points": [ - [ - 286, - 1827 - ], - [ - 341, - 1827 - ], - [ - 341, - 1854 - ], - [ - 286, - 1854 - ] - ], - "text": "given" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 347, - "y": 1830 - }, - "confidence": 1, - "points": [ - [ - 347, - 1830 - ], - [ - 366, - 1830 - ], - [ - 366, - 1849 - ], - [ - 347, - 1849 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 22, - "width": 33, - "x": 372, - "y": 1827 - }, - "confidence": 1, - "points": [ - [ - 372, - 1827 - ], - [ - 405, - 1827 - ], - [ - 405, - 1849 - ], - [ - 372, - 1849 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 52, - "x": 411, - "y": 1827 - }, - "confidence": 1, - "points": [ - [ - 411, - 1827 - ], - [ - 463, - 1827 - ], - [ - 463, - 1849 - ], - [ - 411, - 1849 - ] - ], - "text": "sales" - }, - { - "bounds": { - "height": 27, - "width": 119, - "x": 469, - "y": 1827 - }, - "confidence": 1, - "points": [ - [ - 469, - 1827 - ], - [ - 588, - 1827 - ], - [ - 588, - 1854 - ], - [ - 469, - 1854 - ] - ], - "text": "comparison" - }, - { - "bounds": { - "height": 27, - "width": 102, - "x": 594, - "y": 1827 - }, - "confidence": 1, - "points": [ - [ - 594, - 1827 - ], - [ - 696, - 1827 - ], - [ - 696, - 1854 - ], - [ - 594, - 1854 - ] - ], - "text": "approach," - }, - { - "bounds": { - "height": 16, - "width": 25, - "x": 702, - "y": 1833 - }, - "confidence": 1, - "points": [ - [ - 702, - 1833 - ], - [ - 727, - 1833 - ], - [ - 727, - 1849 - ], - [ - 702, - 1849 - ] - ], - "text": "as" - }, - { - "bounds": { - "height": 22, - "width": 11, - "x": 736, - "y": 1827 - }, - "confidence": 1, - "points": [ - [ - 736, - 1827 - ], - [ - 747, - 1827 - ], - [ - 747, - 1849 - ], - [ - 736, - 1849 - ] - ], - "text": "it" - }, - { - "bounds": { - "height": 19, - "width": 52, - "x": 752, - "y": 1830 - }, - "confidence": 1, - "points": [ - [ - 752, - 1830 - ], - [ - 804, - 1830 - ], - [ - 804, - 1849 - ], - [ - 752, - 1849 - ] - ], - "text": "most" - }, - { - "bounds": { - "height": 27, - "width": 75, - "x": 808, - "y": 1827 - }, - "confidence": 1, - "points": [ - [ - 808, - 1827 - ], - [ - 883, - 1827 - ], - [ - 883, - 1854 - ], - [ - 808, - 1854 - ] - ], - "text": "directly" - }, - { - "bounds": { - "height": 5, - "width": 1552, - "x": 69, - "y": 1847 - }, - "confidence": 1, - "points": [ - [ - 69, - 1847 - ], - [ - 1621, - 1847 - ], - [ - 1621, - 1852 - ], - [ - 69, - 1852 - ] - ], - "text": "_______________________________________________________________________________________________________________________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -67651,8 +14052,9 @@ "x": 1393.0969, "y": 1727.1581 }, + "cells": null, "confidence": 0.56249344, - "id": "76d33470-6f13-4129-970b-ee4332fb29a1", + "id": "342352b8-6cf8-4ef3-9581-6405d989ca84", "page": { "height": 2200, "pageIndex": 3, @@ -67689,8 +14091,9 @@ "x": 1393.8177, "y": 1753.4255 }, + "cells": null, "confidence": 0.50977415, - "id": "0f70d594-b31f-4aa4-883a-61de2d86dc18", + "id": "2c16b0fc-9167-48b9-8ecb-432c5314f344", "page": { "height": 2200, "pageIndex": 3, @@ -67727,8 +14130,9 @@ "x": 1071.4923, "y": 1778.1521 }, + "cells": null, "confidence": 0.5841844, - "id": "2027eb22-c101-4e2e-9bbb-3e4c02aee70d", + "id": "b0416882-37a3-4fdd-9674-4d38a4fa0173", "page": { "height": 2200, "pageIndex": 3, @@ -67765,8 +14169,9 @@ "x": 69, "y": 1849 }, + "cells": null, "confidence": 0.64272004, - "id": "b78bdf89-f7f7-4d26-b509-6db41c2aee49", + "id": "97ec97d0-e4dc-488f-9b69-9b5bbf53c3c9", "page": { "height": 2200, "pageIndex": 3, @@ -67794,401 +14199,7 @@ "readingOrder": 19, "role": "Text", "text": "Final reconciliation: the actions of typical investor-purchasers in this market. The income approach reflects_______________________________________________________________________________________________________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 16, - "width": 41, - "x": 69, - "y": 1855 - }, - "confidence": 1, - "points": [ - [ - 69, - 1855 - ], - [ - 110, - 1855 - ], - [ - 110, - 1871 - ], - [ - 69, - 1871 - ] - ], - "text": "Final" - }, - { - "bounds": { - "height": 16, - "width": 119, - "x": 113, - "y": 1855 - }, - "confidence": 1, - "points": [ - [ - 113, - 1855 - ], - [ - 232, - 1855 - ], - [ - 232, - 1871 - ], - [ - 113, - 1871 - ] - ], - "text": "reconciliation:" - }, - { - "bounds": { - "height": 22, - "width": 30, - "x": 316, - "y": 1849 - }, - "confidence": 1, - "points": [ - [ - 316, - 1849 - ], - [ - 346, - 1849 - ], - [ - 346, - 1871 - ], - [ - 316, - 1871 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 22, - "width": 72, - "x": 355, - "y": 1849 - }, - "confidence": 1, - "points": [ - [ - 355, - 1849 - ], - [ - 427, - 1849 - ], - [ - 427, - 1871 - ], - [ - 355, - 1871 - ] - ], - "text": "actions" - }, - { - "bounds": { - "height": 22, - "width": 22, - "x": 433, - "y": 1849 - }, - "confidence": 1, - "points": [ - [ - 433, - 1849 - ], - [ - 455, - 1849 - ], - [ - 455, - 1871 - ], - [ - 433, - 1871 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 27, - "width": 66, - "x": 458, - "y": 1849 - }, - "confidence": 1, - "points": [ - [ - 458, - 1849 - ], - [ - 524, - 1849 - ], - [ - 524, - 1876 - ], - [ - 458, - 1876 - ] - ], - "text": "typical" - }, - { - "bounds": { - "height": 27, - "width": 200, - "x": 530, - "y": 1849 - }, - "confidence": 1, - "points": [ - [ - 530, - 1849 - ], - [ - 730, - 1849 - ], - [ - 730, - 1876 - ], - [ - 530, - 1876 - ] - ], - "text": "investor-purchasers" - }, - { - "bounds": { - "height": 22, - "width": 16, - "x": 738, - "y": 1849 - }, - "confidence": 1, - "points": [ - [ - 738, - 1849 - ], - [ - 754, - 1849 - ], - [ - 754, - 1871 - ], - [ - 738, - 1871 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 22, - "width": 36, - "x": 761, - "y": 1849 - }, - "confidence": 1, - "points": [ - [ - 761, - 1849 - ], - [ - 797, - 1849 - ], - [ - 797, - 1871 - ], - [ - 761, - 1871 - ] - ], - "text": "this" - }, - { - "bounds": { - "height": 22, - "width": 75, - "x": 805, - "y": 1849 - }, - "confidence": 1, - "points": [ - [ - 805, - 1849 - ], - [ - 880, - 1849 - ], - [ - 880, - 1871 - ], - [ - 805, - 1871 - ] - ], - "text": "market." - }, - { - "bounds": { - "height": 22, - "width": 38, - "x": 886, - "y": 1849 - }, - "confidence": 1, - "points": [ - [ - 886, - 1849 - ], - [ - 924, - 1849 - ], - [ - 924, - 1871 - ], - [ - 886, - 1871 - ] - ], - "text": "The" - }, - { - "bounds": { - "height": 22, - "width": 72, - "x": 933, - "y": 1849 - }, - "confidence": 1, - "points": [ - [ - 933, - 1849 - ], - [ - 1005, - 1849 - ], - [ - 1005, - 1871 - ], - [ - 933, - 1871 - ] - ], - "text": "income" - }, - { - "bounds": { - "height": 27, - "width": 94, - "x": 1013, - "y": 1849 - }, - "confidence": 1, - "points": [ - [ - 1013, - 1849 - ], - [ - 1107, - 1849 - ], - [ - 1107, - 1876 - ], - [ - 1013, - 1876 - ] - ], - "text": "approach" - }, - { - "bounds": { - "height": 25, - "width": 1386, - "x": 236, - "y": 1849 - }, - "confidence": 1, - "points": [ - [ - 236, - 1849 - ], - [ - 1622, - 1849 - ], - [ - 1622, - 1874 - ], - [ - 236, - 1874 - ] - ], - "text": "reflects_______________________________________________________________________________________________________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -68197,8 +14208,9 @@ "x": 66, "y": 1899.1642 }, + "cells": null, "confidence": 0.70888937, - "id": "48fd733a-a176-4982-b69c-9e2d2c6b0bdf", + "id": "87f037ff-6f19-4261-9cf9-bb3e34615ba0", "page": { "height": 2200, "pageIndex": 3, @@ -68226,1521 +14238,7 @@ "readingOrder": 20, "role": "Text", "text": "The purpose of this appraisal is to estimate the market value of the real property that is the subject of this report, based on the above conditions and the certification, contingent and\nlimiting conditions, and market value definition, that are stated in the attached Freddie Mac Form 439/Fannie Mae Form 1004B (Revised __________________ ).", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 16, - "width": 36, - "x": 66, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 66, - 1902 - ], - [ - 102, - 1902 - ], - [ - 102, - 1918 - ], - [ - 66, - 1918 - ] - ], - "text": "The" - }, - { - "bounds": { - "height": 16, - "width": 69, - "x": 108, - "y": 1905 - }, - "confidence": 1, - "points": [ - [ - 108, - 1905 - ], - [ - 177, - 1905 - ], - [ - 177, - 1921 - ], - [ - 108, - 1921 - ] - ], - "text": "purpose" - }, - { - "bounds": { - "height": 16, - "width": 19, - "x": 183, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 183, - 1902 - ], - [ - 202, - 1902 - ], - [ - 202, - 1918 - ], - [ - 183, - 1918 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 16, - "width": 33, - "x": 205, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 205, - 1902 - ], - [ - 238, - 1902 - ], - [ - 238, - 1918 - ], - [ - 205, - 1918 - ] - ], - "text": "this" - }, - { - "bounds": { - "height": 19, - "width": 80, - "x": 241, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 241, - 1902 - ], - [ - 321, - 1902 - ], - [ - 321, - 1921 - ], - [ - 241, - 1921 - ] - ], - "text": "appraisal" - }, - { - "bounds": { - "height": 16, - "width": 13, - "x": 327, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 327, - 1902 - ], - [ - 340, - 1902 - ], - [ - 340, - 1918 - ], - [ - 327, - 1918 - ] - ], - "text": "is" - }, - { - "bounds": { - "height": 16, - "width": 16, - "x": 347, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 347, - 1902 - ], - [ - 363, - 1902 - ], - [ - 363, - 1918 - ], - [ - 347, - 1918 - ] - ], - "text": "to" - }, - { - "bounds": { - "height": 16, - "width": 75, - "x": 369, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 369, - 1902 - ], - [ - 444, - 1902 - ], - [ - 444, - 1918 - ], - [ - 369, - 1918 - ] - ], - "text": "estimate" - }, - { - "bounds": { - "height": 16, - "width": 27, - "x": 449, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 449, - 1902 - ], - [ - 476, - 1902 - ], - [ - 476, - 1918 - ], - [ - 449, - 1918 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 16, - "width": 61, - "x": 483, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 483, - 1902 - ], - [ - 544, - 1902 - ], - [ - 544, - 1918 - ], - [ - 483, - 1918 - ] - ], - "text": "market" - }, - { - "bounds": { - "height": 16, - "width": 50, - "x": 547, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 547, - 1902 - ], - [ - 597, - 1902 - ], - [ - 597, - 1918 - ], - [ - 547, - 1918 - ] - ], - "text": "value" - }, - { - "bounds": { - "height": 16, - "width": 19, - "x": 600, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 600, - 1902 - ], - [ - 619, - 1902 - ], - [ - 619, - 1918 - ], - [ - 600, - 1918 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 16, - "width": 27, - "x": 622, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 622, - 1902 - ], - [ - 649, - 1902 - ], - [ - 649, - 1918 - ], - [ - 622, - 1918 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 16, - "width": 33, - "x": 655, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 655, - 1902 - ], - [ - 688, - 1902 - ], - [ - 688, - 1918 - ], - [ - 655, - 1918 - ] - ], - "text": "real" - }, - { - "bounds": { - "height": 19, - "width": 72, - "x": 694, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 694, - 1902 - ], - [ - 766, - 1902 - ], - [ - 766, - 1921 - ], - [ - 694, - 1921 - ] - ], - "text": "property" - }, - { - "bounds": { - "height": 16, - "width": 33, - "x": 772, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 772, - 1902 - ], - [ - 805, - 1902 - ], - [ - 805, - 1918 - ], - [ - 772, - 1918 - ] - ], - "text": "that" - }, - { - "bounds": { - "height": 16, - "width": 13, - "x": 811, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 811, - 1902 - ], - [ - 824, - 1902 - ], - [ - 824, - 1918 - ], - [ - 811, - 1918 - ] - ], - "text": "is" - }, - { - "bounds": { - "height": 16, - "width": 27, - "x": 830, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 830, - 1902 - ], - [ - 857, - 1902 - ], - [ - 857, - 1918 - ], - [ - 830, - 1918 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 19, - "width": 63, - "x": 863, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 863, - 1902 - ], - [ - 926, - 1902 - ], - [ - 926, - 1921 - ], - [ - 863, - 1921 - ] - ], - "text": "subject" - }, - { - "bounds": { - "height": 16, - "width": 19, - "x": 930, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 930, - 1902 - ], - [ - 949, - 1902 - ], - [ - 949, - 1918 - ], - [ - 930, - 1918 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 16, - "width": 33, - "x": 952, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 952, - 1902 - ], - [ - 985, - 1902 - ], - [ - 985, - 1918 - ], - [ - 952, - 1918 - ] - ], - "text": "this" - }, - { - "bounds": { - "height": 19, - "width": 55, - "x": 991, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 991, - 1902 - ], - [ - 1046, - 1902 - ], - [ - 1046, - 1921 - ], - [ - 991, - 1921 - ] - ], - "text": "report," - }, - { - "bounds": { - "height": 16, - "width": 52, - "x": 1052, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 1052, - 1902 - ], - [ - 1104, - 1902 - ], - [ - 1104, - 1918 - ], - [ - 1052, - 1918 - ] - ], - "text": "based" - }, - { - "bounds": { - "height": 13, - "width": 22, - "x": 1111, - "y": 1905 - }, - "confidence": 1, - "points": [ - [ - 1111, - 1905 - ], - [ - 1133, - 1905 - ], - [ - 1133, - 1918 - ], - [ - 1111, - 1918 - ] - ], - "text": "on" - }, - { - "bounds": { - "height": 16, - "width": 27, - "x": 1138, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 1138, - 1902 - ], - [ - 1165, - 1902 - ], - [ - 1165, - 1918 - ], - [ - 1138, - 1918 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 16, - "width": 52, - "x": 1172, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 1172, - 1902 - ], - [ - 1224, - 1902 - ], - [ - 1224, - 1918 - ], - [ - 1172, - 1918 - ] - ], - "text": "above" - }, - { - "bounds": { - "height": 16, - "width": 88, - "x": 1230, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 1230, - 1902 - ], - [ - 1318, - 1902 - ], - [ - 1318, - 1918 - ], - [ - 1230, - 1918 - ] - ], - "text": "conditions" - }, - { - "bounds": { - "height": 16, - "width": 33, - "x": 1325, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 1325, - 1902 - ], - [ - 1358, - 1902 - ], - [ - 1358, - 1918 - ], - [ - 1325, - 1918 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 16, - "width": 27, - "x": 1363, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 1363, - 1902 - ], - [ - 1390, - 1902 - ], - [ - 1390, - 1918 - ], - [ - 1363, - 1918 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 19, - "width": 102, - "x": 1397, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 1397, - 1902 - ], - [ - 1499, - 1902 - ], - [ - 1499, - 1921 - ], - [ - 1397, - 1921 - ] - ], - "text": "certification," - }, - { - "bounds": { - "height": 19, - "width": 91, - "x": 1505, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 1505, - 1902 - ], - [ - 1596, - 1902 - ], - [ - 1596, - 1921 - ], - [ - 1505, - 1921 - ] - ], - "text": "contingent" - }, - { - "bounds": { - "height": 16, - "width": 33, - "x": 1602, - "y": 1902 - }, - "confidence": 1, - "points": [ - [ - 1602, - 1902 - ], - [ - 1635, - 1902 - ], - [ - 1635, - 1918 - ], - [ - 1602, - 1918 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 69, - "y": 1924 - }, - "confidence": 1, - "points": [ - [ - 69, - 1924 - ], - [ - 130, - 1924 - ], - [ - 130, - 1946 - ], - [ - 69, - 1946 - ] - ], - "text": "limiting" - }, - { - "bounds": { - "height": 19, - "width": 94, - "x": 133, - "y": 1924 - }, - "confidence": 1, - "points": [ - [ - 133, - 1924 - ], - [ - 227, - 1924 - ], - [ - 227, - 1943 - ], - [ - 133, - 1943 - ] - ], - "text": "conditions," - }, - { - "bounds": { - "height": 16, - "width": 33, - "x": 230, - "y": 1924 - }, - "confidence": 1, - "points": [ - [ - 230, - 1924 - ], - [ - 263, - 1924 - ], - [ - 263, - 1940 - ], - [ - 230, - 1940 - ] - ], - "text": "and" - }, - { - "bounds": { - "height": 16, - "width": 61, - "x": 269, - "y": 1924 - }, - "confidence": 1, - "points": [ - [ - 269, - 1924 - ], - [ - 330, - 1924 - ], - [ - 330, - 1940 - ], - [ - 269, - 1940 - ] - ], - "text": "market" - }, - { - "bounds": { - "height": 16, - "width": 47, - "x": 333, - "y": 1924 - }, - "confidence": 1, - "points": [ - [ - 333, - 1924 - ], - [ - 380, - 1924 - ], - [ - 380, - 1940 - ], - [ - 333, - 1940 - ] - ], - "text": "value" - }, - { - "bounds": { - "height": 19, - "width": 86, - "x": 383, - "y": 1924 - }, - "confidence": 1, - "points": [ - [ - 383, - 1924 - ], - [ - 469, - 1924 - ], - [ - 469, - 1943 - ], - [ - 383, - 1943 - ] - ], - "text": "definition," - }, - { - "bounds": { - "height": 16, - "width": 33, - "x": 472, - "y": 1924 - }, - "confidence": 1, - "points": [ - [ - 472, - 1924 - ], - [ - 505, - 1924 - ], - [ - 505, - 1940 - ], - [ - 472, - 1940 - ] - ], - "text": "that" - }, - { - "bounds": { - "height": 13, - "width": 27, - "x": 511, - "y": 1927 - }, - "confidence": 1, - "points": [ - [ - 511, - 1927 - ], - [ - 538, - 1927 - ], - [ - 538, - 1940 - ], - [ - 511, - 1940 - ] - ], - "text": "are" - }, - { - "bounds": { - "height": 16, - "width": 55, - "x": 541, - "y": 1924 - }, - "confidence": 1, - "points": [ - [ - 541, - 1924 - ], - [ - 596, - 1924 - ], - [ - 596, - 1940 - ], - [ - 541, - 1940 - ] - ], - "text": "stated" - }, - { - "bounds": { - "height": 16, - "width": 13, - "x": 602, - "y": 1924 - }, - "confidence": 1, - "points": [ - [ - 602, - 1924 - ], - [ - 615, - 1924 - ], - [ - 615, - 1940 - ], - [ - 602, - 1940 - ] - ], - "text": "in" - }, - { - "bounds": { - "height": 16, - "width": 30, - "x": 619, - "y": 1924 - }, - "confidence": 1, - "points": [ - [ - 619, - 1924 - ], - [ - 649, - 1924 - ], - [ - 649, - 1940 - ], - [ - 619, - 1940 - ] - ], - "text": "the" - }, - { - "bounds": { - "height": 16, - "width": 75, - "x": 652, - "y": 1924 - }, - "confidence": 1, - "points": [ - [ - 652, - 1924 - ], - [ - 727, - 1924 - ], - [ - 727, - 1940 - ], - [ - 652, - 1940 - ] - ], - "text": "attached" - }, - { - "bounds": { - "height": 16, - "width": 66, - "x": 733, - "y": 1924 - }, - "confidence": 1, - "points": [ - [ - 733, - 1924 - ], - [ - 799, - 1924 - ], - [ - 799, - 1940 - ], - [ - 733, - 1940 - ] - ], - "text": "Freddie" - }, - { - "bounds": { - "height": 16, - "width": 38, - "x": 802, - "y": 1924 - }, - "confidence": 1, - "points": [ - [ - 802, - 1924 - ], - [ - 840, - 1924 - ], - [ - 840, - 1940 - ], - [ - 802, - 1940 - ] - ], - "text": "Mac" - }, - { - "bounds": { - "height": 16, - "width": 44, - "x": 847, - "y": 1924 - }, - "confidence": 1, - "points": [ - [ - 847, - 1924 - ], - [ - 891, - 1924 - ], - [ - 891, - 1940 - ], - [ - 847, - 1940 - ] - ], - "text": "Form" - }, - { - "bounds": { - "height": 16, - "width": 100, - "x": 894, - "y": 1924 - }, - "confidence": 1, - "points": [ - [ - 894, - 1924 - ], - [ - 994, - 1924 - ], - [ - 994, - 1940 - ], - [ - 894, - 1940 - ] - ], - "text": "439/Fannie" - }, - { - "bounds": { - "height": 16, - "width": 38, - "x": 997, - "y": 1924 - }, - "confidence": 1, - "points": [ - [ - 997, - 1924 - ], - [ - 1035, - 1924 - ], - [ - 1035, - 1940 - ], - [ - 997, - 1940 - ] - ], - "text": "Mae" - }, - { - "bounds": { - "height": 16, - "width": 44, - "x": 1041, - "y": 1924 - }, - "confidence": 1, - "points": [ - [ - 1041, - 1924 - ], - [ - 1085, - 1924 - ], - [ - 1085, - 1940 - ], - [ - 1041, - 1940 - ] - ], - "text": "Form" - }, - { - "bounds": { - "height": 16, - "width": 55, - "x": 1091, - "y": 1924 - }, - "confidence": 1, - "points": [ - [ - 1091, - 1924 - ], - [ - 1146, - 1924 - ], - [ - 1146, - 1940 - ], - [ - 1091, - 1940 - ] - ], - "text": "1004B" - }, - { - "bounds": { - "height": 22, - "width": 77, - "x": 1152, - "y": 1924 - }, - "confidence": 1, - "points": [ - [ - 1152, - 1924 - ], - [ - 1229, - 1924 - ], - [ - 1229, - 1946 - ], - [ - 1152, - 1946 - ] - ], - "text": "(Revised" - }, - { - "bounds": { - "height": 2, - "width": 200, - "x": 1238, - "y": 1941 - }, - "confidence": 1, - "points": [ - [ - 1238, - 1941 - ], - [ - 1438, - 1941 - ], - [ - 1438, - 1943 - ], - [ - 1238, - 1943 - ] - ], - "text": "__________________" - }, - { - "bounds": { - "height": 22, - "width": 11, - "x": 1450, - "y": 1924 - }, - "confidence": 1, - "points": [ - [ - 1450, - 1924 - ], - [ - 1461, - 1924 - ], - [ - 1461, - 1946 - ], - [ - 1450, - 1946 - ] - ], - "text": ")." - } - ] + "type": "paragraph" }, { "bounds": { @@ -69749,8 +14247,9 @@ "x": 69, "y": 1947 }, + "cells": null, "confidence": 0.6093819, - "id": "979e1763-eab9-4a17-b274-954f73986f3e", + "id": "bf0dcf94-0932-46d4-bd53-17a2afd1c418", "page": { "height": 2200, "pageIndex": 3, @@ -69778,625 +14277,7 @@ "readingOrder": 21, "role": "Text", "text": "I (WE) ESTIMATE THE MARKET VALUE, AS DEFINED, OF THE REAL PROPERTY THAT IS THE SUBJECT OF THIS REPORT, AS OF 07/28/2026______________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 5, - "x": 69, - "y": 1947 - }, - "confidence": 1, - "points": [ - [ - 69, - 1947 - ], - [ - 74, - 1947 - ], - [ - 74, - 1966 - ], - [ - 69, - 1966 - ] - ], - "text": "I" - }, - { - "bounds": { - "height": 22, - "width": 44, - "x": 77, - "y": 1947 - }, - "confidence": 1, - "points": [ - [ - 77, - 1947 - ], - [ - 121, - 1947 - ], - [ - 121, - 1969 - ], - [ - 77, - 1969 - ] - ], - "text": "(WE)" - }, - { - "bounds": { - "height": 19, - "width": 94, - "x": 124, - "y": 1947 - }, - "confidence": 1, - "points": [ - [ - 124, - 1947 - ], - [ - 218, - 1947 - ], - [ - 218, - 1966 - ], - [ - 124, - 1966 - ] - ], - "text": "ESTIMATE" - }, - { - "bounds": { - "height": 19, - "width": 38, - "x": 222, - "y": 1947 - }, - "confidence": 1, - "points": [ - [ - 222, - 1947 - ], - [ - 260, - 1947 - ], - [ - 260, - 1966 - ], - [ - 222, - 1966 - ] - ], - "text": "THE" - }, - { - "bounds": { - "height": 19, - "width": 83, - "x": 263, - "y": 1947 - }, - "confidence": 1, - "points": [ - [ - 263, - 1947 - ], - [ - 346, - 1947 - ], - [ - 346, - 1966 - ], - [ - 263, - 1966 - ] - ], - "text": "MARKET" - }, - { - "bounds": { - "height": 22, - "width": 66, - "x": 347, - "y": 1947 - }, - "confidence": 1, - "points": [ - [ - 347, - 1947 - ], - [ - 413, - 1947 - ], - [ - 413, - 1969 - ], - [ - 347, - 1969 - ] - ], - "text": "VALUE," - }, - { - "bounds": { - "height": 19, - "width": 27, - "x": 416, - "y": 1947 - }, - "confidence": 1, - "points": [ - [ - 416, - 1947 - ], - [ - 443, - 1947 - ], - [ - 443, - 1966 - ], - [ - 416, - 1966 - ] - ], - "text": "AS" - }, - { - "bounds": { - "height": 22, - "width": 88, - "x": 447, - "y": 1947 - }, - "confidence": 1, - "points": [ - [ - 447, - 1947 - ], - [ - 535, - 1947 - ], - [ - 535, - 1969 - ], - [ - 447, - 1969 - ] - ], - "text": "DEFINED," - }, - { - "bounds": { - "height": 19, - "width": 27, - "x": 538, - "y": 1947 - }, - "confidence": 1, - "points": [ - [ - 538, - 1947 - ], - [ - 565, - 1947 - ], - [ - 565, - 1966 - ], - [ - 538, - 1966 - ] - ], - "text": "OF" - }, - { - "bounds": { - "height": 19, - "width": 38, - "x": 569, - "y": 1947 - }, - "confidence": 1, - "points": [ - [ - 569, - 1947 - ], - [ - 607, - 1947 - ], - [ - 607, - 1966 - ], - [ - 569, - 1966 - ] - ], - "text": "THE" - }, - { - "bounds": { - "height": 19, - "width": 52, - "x": 611, - "y": 1947 - }, - "confidence": 1, - "points": [ - [ - 611, - 1947 - ], - [ - 663, - 1947 - ], - [ - 663, - 1966 - ], - [ - 611, - 1966 - ] - ], - "text": "REAL" - }, - { - "bounds": { - "height": 19, - "width": 105, - "x": 666, - "y": 1947 - }, - "confidence": 1, - "points": [ - [ - 666, - 1947 - ], - [ - 771, - 1947 - ], - [ - 771, - 1966 - ], - [ - 666, - 1966 - ] - ], - "text": "PROPERTY" - }, - { - "bounds": { - "height": 19, - "width": 50, - "x": 772, - "y": 1947 - }, - "confidence": 1, - "points": [ - [ - 772, - 1947 - ], - [ - 822, - 1947 - ], - [ - 822, - 1966 - ], - [ - 772, - 1966 - ] - ], - "text": "THAT" - }, - { - "bounds": { - "height": 19, - "width": 19, - "x": 824, - "y": 1947 - }, - "confidence": 1, - "points": [ - [ - 824, - 1947 - ], - [ - 843, - 1947 - ], - [ - 843, - 1966 - ], - [ - 824, - 1966 - ] - ], - "text": "IS" - }, - { - "bounds": { - "height": 19, - "width": 41, - "x": 844, - "y": 1947 - }, - "confidence": 1, - "points": [ - [ - 844, - 1947 - ], - [ - 885, - 1947 - ], - [ - 885, - 1966 - ], - [ - 844, - 1966 - ] - ], - "text": "THE" - }, - { - "bounds": { - "height": 19, - "width": 88, - "x": 888, - "y": 1947 - }, - "confidence": 1, - "points": [ - [ - 888, - 1947 - ], - [ - 976, - 1947 - ], - [ - 976, - 1966 - ], - [ - 888, - 1966 - ] - ], - "text": "SUBJECT" - }, - { - "bounds": { - "height": 19, - "width": 27, - "x": 980, - "y": 1947 - }, - "confidence": 1, - "points": [ - [ - 980, - 1947 - ], - [ - 1007, - 1947 - ], - [ - 1007, - 1966 - ], - [ - 980, - 1966 - ] - ], - "text": "OF" - }, - { - "bounds": { - "height": 19, - "width": 44, - "x": 1008, - "y": 1947 - }, - "confidence": 1, - "points": [ - [ - 1008, - 1947 - ], - [ - 1052, - 1947 - ], - [ - 1052, - 1966 - ], - [ - 1008, - 1966 - ] - ], - "text": "THIS" - }, - { - "bounds": { - "height": 22, - "width": 80, - "x": 1058, - "y": 1947 - }, - "confidence": 1, - "points": [ - [ - 1058, - 1947 - ], - [ - 1138, - 1947 - ], - [ - 1138, - 1969 - ], - [ - 1058, - 1969 - ] - ], - "text": "REPORT," - }, - { - "bounds": { - "height": 19, - "width": 27, - "x": 1141, - "y": 1947 - }, - "confidence": 1, - "points": [ - [ - 1141, - 1947 - ], - [ - 1168, - 1947 - ], - [ - 1168, - 1966 - ], - [ - 1141, - 1966 - ] - ], - "text": "AS" - }, - { - "bounds": { - "height": 19, - "width": 27, - "x": 1172, - "y": 1947 - }, - "confidence": 1, - "points": [ - [ - 1172, - 1947 - ], - [ - 1199, - 1947 - ], - [ - 1199, - 1966 - ], - [ - 1172, - 1966 - ] - ], - "text": "OF" - }, - { - "bounds": { - "height": 22, - "width": 416, - "x": 1205, - "y": 1947 - }, - "confidence": 1, - "points": [ - [ - 1205, - 1947 - ], - [ - 1621, - 1947 - ], - [ - 1621, - 1969 - ], - [ - 1205, - 1969 - ] - ], - "text": "07/28/2026______________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -70405,8 +14286,9 @@ "x": 66.585396, "y": 1967.6992 }, + "cells": null, "confidence": 0.649093, - "id": "52868b38-b790-4268-b011-d03cff058fc1", + "id": "a27069bd-4b6c-4b6f-b3a0-2db802d3abcd", "page": { "height": 2200, "pageIndex": 3, @@ -70434,457 +14316,7 @@ "readingOrder": 22, "role": "Text", "text": "(WHICH IS THE DATE OF INSPECTION AND THE EFFECTIVE DATE OF THIS REPORT) TO BE $", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 72, - "x": 69, - "y": 1972 - }, - "confidence": 1, - "points": [ - [ - 69, - 1972 - ], - [ - 141, - 1972 - ], - [ - 141, - 1991 - ], - [ - 69, - 1991 - ] - ], - "text": "(WHICH" - }, - { - "bounds": { - "height": 16, - "width": 19, - "x": 144, - "y": 1972 - }, - "confidence": 1, - "points": [ - [ - 144, - 1972 - ], - [ - 163, - 1972 - ], - [ - 163, - 1988 - ], - [ - 144, - 1988 - ] - ], - "text": "IS" - }, - { - "bounds": { - "height": 16, - "width": 41, - "x": 163, - "y": 1972 - }, - "confidence": 1, - "points": [ - [ - 163, - 1972 - ], - [ - 204, - 1972 - ], - [ - 204, - 1988 - ], - [ - 163, - 1988 - ] - ], - "text": "THE" - }, - { - "bounds": { - "height": 16, - "width": 47, - "x": 208, - "y": 1972 - }, - "confidence": 1, - "points": [ - [ - 208, - 1972 - ], - [ - 255, - 1972 - ], - [ - 255, - 1988 - ], - [ - 208, - 1988 - ] - ], - "text": "DATE" - }, - { - "bounds": { - "height": 16, - "width": 30, - "x": 258, - "y": 1972 - }, - "confidence": 1, - "points": [ - [ - 258, - 1972 - ], - [ - 288, - 1972 - ], - [ - 288, - 1988 - ], - [ - 258, - 1988 - ] - ], - "text": "OF" - }, - { - "bounds": { - "height": 16, - "width": 116, - "x": 291, - "y": 1972 - }, - "confidence": 1, - "points": [ - [ - 291, - 1972 - ], - [ - 407, - 1972 - ], - [ - 407, - 1988 - ], - [ - 291, - 1988 - ] - ], - "text": "INSPECTION" - }, - { - "bounds": { - "height": 16, - "width": 41, - "x": 411, - "y": 1972 - }, - "confidence": 1, - "points": [ - [ - 411, - 1972 - ], - [ - 452, - 1972 - ], - [ - 452, - 1988 - ], - [ - 411, - 1988 - ] - ], - "text": "AND" - }, - { - "bounds": { - "height": 16, - "width": 38, - "x": 455, - "y": 1972 - }, - "confidence": 1, - "points": [ - [ - 455, - 1972 - ], - [ - 493, - 1972 - ], - [ - 493, - 1988 - ], - [ - 455, - 1988 - ] - ], - "text": "THE" - }, - { - "bounds": { - "height": 16, - "width": 105, - "x": 499, - "y": 1972 - }, - "confidence": 1, - "points": [ - [ - 499, - 1972 - ], - [ - 604, - 1972 - ], - [ - 604, - 1988 - ], - [ - 499, - 1988 - ] - ], - "text": "EFFECTIVE" - }, - { - "bounds": { - "height": 16, - "width": 50, - "x": 608, - "y": 1972 - }, - "confidence": 1, - "points": [ - [ - 608, - 1972 - ], - [ - 658, - 1972 - ], - [ - 658, - 1988 - ], - [ - 608, - 1988 - ] - ], - "text": "DATE" - }, - { - "bounds": { - "height": 16, - "width": 27, - "x": 661, - "y": 1972 - }, - "confidence": 1, - "points": [ - [ - 661, - 1972 - ], - [ - 688, - 1972 - ], - [ - 688, - 1988 - ], - [ - 661, - 1988 - ] - ], - "text": "OF" - }, - { - "bounds": { - "height": 16, - "width": 47, - "x": 688, - "y": 1972 - }, - "confidence": 1, - "points": [ - [ - 688, - 1972 - ], - [ - 735, - 1972 - ], - [ - 735, - 1988 - ], - [ - 688, - 1988 - ] - ], - "text": "THIS" - }, - { - "bounds": { - "height": 19, - "width": 86, - "x": 738, - "y": 1972 - }, - "confidence": 1, - "points": [ - [ - 738, - 1972 - ], - [ - 824, - 1972 - ], - [ - 824, - 1991 - ], - [ - 738, - 1991 - ] - ], - "text": "REPORT)" - }, - { - "bounds": { - "height": 16, - "width": 27, - "x": 827, - "y": 1972 - }, - "confidence": 1, - "points": [ - [ - 827, - 1972 - ], - [ - 854, - 1972 - ], - [ - 854, - 1988 - ], - [ - 827, - 1988 - ] - ], - "text": "TO" - }, - { - "bounds": { - "height": 16, - "width": 25, - "x": 858, - "y": 1972 - }, - "confidence": 1, - "points": [ - [ - 858, - 1972 - ], - [ - 883, - 1972 - ], - [ - 883, - 1988 - ], - [ - 858, - 1988 - ] - ], - "text": "BE" - }, - { - "bounds": { - "height": 19, - "width": 11, - "x": 886, - "y": 1972 - }, - "confidence": 1, - "points": [ - [ - 886, - 1972 - ], - [ - 897, - 1972 - ], - [ - 897, - 1991 - ], - [ - 886, - 1991 - ] - ], - "text": "$" - } - ] + "type": "paragraph" }, { "bounds": { @@ -70893,8 +14325,9 @@ "x": 70.98647, "y": 1992.2898 }, + "cells": null, "confidence": 0.50567985, - "id": "63f99a93-52b8-45ff-a937-3f48708be13a", + "id": "9cda0caf-4dff-41dc-a821-84e5c038c1f4", "page": { "height": 2200, "pageIndex": 3, @@ -70931,8 +14364,9 @@ "x": 66.778046, "y": 2037.56 }, + "cells": null, "confidence": 0.6819047, - "id": "c276a29b-7b7c-4ad0-9ffd-4823c2d2c387", + "id": "7a181e83-a4a8-46db-85a3-584835c4573c", "page": { "height": 2200, "pageIndex": 3, @@ -70960,205 +14394,7 @@ "readingOrder": 24, "role": "Text", "text": "Name Reyes, Certified Residential Appraiser Nathan___________________________________________________________________________ Name", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 16, - "width": 47, - "x": 69, - "y": 2041 - }, - "confidence": 1, - "points": [ - [ - 69, - 2041 - ], - [ - 116, - 2041 - ], - [ - 116, - 2057 - ], - [ - 69, - 2057 - ] - ], - "text": "Name" - }, - { - "bounds": { - "height": 25, - "width": 69, - "x": 202, - "y": 2038 - }, - "confidence": 1, - "points": [ - [ - 202, - 2038 - ], - [ - 271, - 2038 - ], - [ - 271, - 2063 - ], - [ - 202, - 2063 - ] - ], - "text": "Reyes," - }, - { - "bounds": { - "height": 19, - "width": 86, - "x": 280, - "y": 2038 - }, - "confidence": 1, - "points": [ - [ - 280, - 2038 - ], - [ - 366, - 2038 - ], - [ - 366, - 2057 - ], - [ - 280, - 2057 - ] - ], - "text": "Certified" - }, - { - "bounds": { - "height": 19, - "width": 113, - "x": 372, - "y": 2038 - }, - "confidence": 1, - "points": [ - [ - 372, - 2038 - ], - [ - 485, - 2038 - ], - [ - 485, - 2057 - ], - [ - 372, - 2057 - ] - ], - "text": "Residential" - }, - { - "bounds": { - "height": 25, - "width": 102, - "x": 488, - "y": 2038 - }, - "confidence": 1, - "points": [ - [ - 488, - 2038 - ], - [ - 590, - 2038 - ], - [ - 590, - 2063 - ], - [ - 488, - 2063 - ] - ], - "text": "Appraiser" - }, - { - "bounds": { - "height": 22, - "width": 816, - "x": 122, - "y": 2038 - }, - "confidence": 1, - "points": [ - [ - 122, - 2038 - ], - [ - 938, - 2038 - ], - [ - 938, - 2060 - ], - [ - 122, - 2060 - ] - ], - "text": "Nathan___________________________________________________________________________" - }, - { - "bounds": { - "height": 16, - "width": 50, - "x": 983, - "y": 2041 - }, - "confidence": 1, - "points": [ - [ - 983, - 2041 - ], - [ - 1033, - 2041 - ], - [ - 1033, - 2057 - ], - [ - 983, - 2057 - ] - ], - "text": "Name" - } - ] + "type": "paragraph" }, { "bounds": { @@ -71167,8 +14403,9 @@ "x": 68.95024, "y": 2010.1622 }, + "cells": null, "confidence": 0.6233694, - "id": "46f07120-efb0-48f6-a538-ad05a8014bce", + "id": "f70201d0-ef59-45f7-9948-d78a76873748", "page": { "height": 2200, "pageIndex": 3, @@ -71196,121 +14433,7 @@ "readingOrder": 25, "role": "Text", "text": "Signature Nathan Reyes ________________________________________________________________________", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 80, - "x": 69, - "y": 2019 - }, - "confidence": 1, - "points": [ - [ - 69, - 2019 - ], - [ - 149, - 2019 - ], - [ - 149, - 2038 - ], - [ - 69, - 2038 - ] - ], - "text": "Signature" - }, - { - "bounds": { - "height": 27, - "width": 94, - "x": 169, - "y": 2011 - }, - "confidence": 1, - "points": [ - [ - 169, - 2011 - ], - [ - 263, - 2011 - ], - [ - 263, - 2038 - ], - [ - 169, - 2038 - ] - ], - "text": "Nathan" - }, - { - "bounds": { - "height": 30, - "width": 83, - "x": 275, - "y": 2013 - }, - "confidence": 1, - "points": [ - [ - 275, - 2013 - ], - [ - 358, - 2013 - ], - [ - 358, - 2043 - ], - [ - 275, - 2043 - ] - ], - "text": "Reyes" - }, - { - "bounds": { - "height": 2, - "width": 783, - "x": 155, - "y": 2036 - }, - "confidence": 1, - "points": [ - [ - 155, - 2036 - ], - [ - 938, - 2036 - ], - [ - 938, - 2038 - ], - [ - 155, - 2038 - ] - ], - "text": "________________________________________________________________________" - } - ] + "type": "paragraph" }, { "bounds": { @@ -71319,8 +14442,9 @@ "x": 65.00929, "y": 2063 }, + "cells": null, "confidence": 0.6499941, - "id": "71cb0dc3-7ce8-4b4b-adc0-69669f00d911", + "id": "3b685cb7-a3ce-4aab-a2ef-3e165cd8f54c", "page": { "height": 2200, "pageIndex": 3, @@ -71348,177 +14472,7 @@ "readingOrder": 26, "role": "Text", "text": "Date Report Signed Date Report Signed", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 41, - "x": 69, - "y": 2063 - }, - "confidence": 1, - "points": [ - [ - 69, - 2063 - ], - [ - 110, - 2063 - ], - [ - 110, - 2082 - ], - [ - 69, - 2082 - ] - ], - "text": "Date" - }, - { - "bounds": { - "height": 22, - "width": 58, - "x": 113, - "y": 2063 - }, - "confidence": 1, - "points": [ - [ - 113, - 2063 - ], - [ - 171, - 2063 - ], - [ - 171, - 2085 - ], - [ - 113, - 2085 - ] - ], - "text": "Report" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 175, - "y": 2063 - }, - "confidence": 1, - "points": [ - [ - 175, - 2063 - ], - [ - 236, - 2063 - ], - [ - 236, - 2085 - ], - [ - 175, - 2085 - ] - ], - "text": "Signed" - }, - { - "bounds": { - "height": 19, - "width": 41, - "x": 983, - "y": 2063 - }, - "confidence": 1, - "points": [ - [ - 983, - 2063 - ], - [ - 1024, - 2063 - ], - [ - 1024, - 2082 - ], - [ - 983, - 2082 - ] - ], - "text": "Date" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 1027, - "y": 2063 - }, - "confidence": 1, - "points": [ - [ - 1027, - 2063 - ], - [ - 1088, - 2063 - ], - [ - 1088, - 2085 - ], - [ - 1027, - 2085 - ] - ], - "text": "Report" - }, - { - "bounds": { - "height": 22, - "width": 61, - "x": 1091, - "y": 2063 - }, - "confidence": 1, - "points": [ - [ - 1091, - 2063 - ], - [ - 1152, - 2063 - ], - [ - 1152, - 2085 - ], - [ - 1091, - 2085 - ] - ], - "text": "Signed" - } - ] + "type": "paragraph" }, { "bounds": { @@ -71527,8 +14481,9 @@ "x": 67.779495, "y": 2083.3752 }, + "cells": null, "confidence": 0.57997966, - "id": "05a7363c-18bb-42c8-b3d2-f7b65d5cba2a", + "id": "917e0f7c-1ce9-4b19-a414-3fc91343705f", "page": { "height": 2200, "pageIndex": 3, @@ -71556,233 +14511,7 @@ "readingOrder": 27, "role": "Text", "text": "State Certification # State State Certification # State", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 16, - "width": 44, - "x": 69, - "y": 2088 - }, - "confidence": 1, - "points": [ - [ - 69, - 2088 - ], - [ - 113, - 2088 - ], - [ - 113, - 2104 - ], - [ - 69, - 2104 - ] - ], - "text": "State" - }, - { - "bounds": { - "height": 16, - "width": 102, - "x": 119, - "y": 2088 - }, - "confidence": 1, - "points": [ - [ - 119, - 2088 - ], - [ - 221, - 2088 - ], - [ - 221, - 2104 - ], - [ - 119, - 2104 - ] - ], - "text": "Certification" - }, - { - "bounds": { - "height": 16, - "width": 13, - "x": 227, - "y": 2088 - }, - "confidence": 1, - "points": [ - [ - 227, - 2088 - ], - [ - 240, - 2088 - ], - [ - 240, - 2104 - ], - [ - 227, - 2104 - ] - ], - "text": "#" - }, - { - "bounds": { - "height": 16, - "width": 47, - "x": 805, - "y": 2088 - }, - "confidence": 1, - "points": [ - [ - 805, - 2088 - ], - [ - 852, - 2088 - ], - [ - 852, - 2104 - ], - [ - 805, - 2104 - ] - ], - "text": "State" - }, - { - "bounds": { - "height": 16, - "width": 47, - "x": 983, - "y": 2088 - }, - "confidence": 1, - "points": [ - [ - 983, - 2088 - ], - [ - 1030, - 2088 - ], - [ - 1030, - 2104 - ], - [ - 983, - 2104 - ] - ], - "text": "State" - }, - { - "bounds": { - "height": 16, - "width": 102, - "x": 1036, - "y": 2088 - }, - "confidence": 1, - "points": [ - [ - 1036, - 2088 - ], - [ - 1138, - 2088 - ], - [ - 1138, - 2104 - ], - [ - 1036, - 2104 - ] - ], - "text": "Certification" - }, - { - "bounds": { - "height": 16, - "width": 11, - "x": 1144, - "y": 2088 - }, - "confidence": 1, - "points": [ - [ - 1144, - 2088 - ], - [ - 1155, - 2088 - ], - [ - 1155, - 2104 - ], - [ - 1144, - 2104 - ] - ], - "text": "#" - }, - { - "bounds": { - "height": 16, - "width": 47, - "x": 1505, - "y": 2088 - }, - "confidence": 1, - "points": [ - [ - 1505, - 2088 - ], - [ - 1552, - 2088 - ], - [ - 1552, - 2104 - ], - [ - 1505, - 2104 - ] - ], - "text": "State" - } - ] + "type": "paragraph" }, { "bounds": { @@ -71791,8 +14520,9 @@ "x": 66, "y": 2111.089 }, + "cells": null, "confidence": 0.60216326, - "id": "a70b4ba0-30b7-4b22-9287-a7211a8408bf", + "id": "44bf2d42-ce50-4328-be92-bada93cccca2", "page": { "height": 2200, "pageIndex": 3, @@ -71820,289 +14550,7 @@ "readingOrder": 28, "role": "Text", "text": "Or State License # State Or State License # State", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 16, - "width": 25, - "x": 66, - "y": 2113 - }, - "confidence": 1, - "points": [ - [ - 66, - 2113 - ], - [ - 91, - 2113 - ], - [ - 91, - 2129 - ], - [ - 66, - 2129 - ] - ], - "text": "Or" - }, - { - "bounds": { - "height": 16, - "width": 47, - "x": 94, - "y": 2113 - }, - "confidence": 1, - "points": [ - [ - 94, - 2113 - ], - [ - 141, - 2113 - ], - [ - 141, - 2129 - ], - [ - 94, - 2129 - ] - ], - "text": "State" - }, - { - "bounds": { - "height": 16, - "width": 66, - "x": 147, - "y": 2113 - }, - "confidence": 1, - "points": [ - [ - 147, - 2113 - ], - [ - 213, - 2113 - ], - [ - 213, - 2129 - ], - [ - 147, - 2129 - ] - ], - "text": "License" - }, - { - "bounds": { - "height": 16, - "width": 13, - "x": 219, - "y": 2113 - }, - "confidence": 1, - "points": [ - [ - 219, - 2113 - ], - [ - 232, - 2113 - ], - [ - 232, - 2129 - ], - [ - 219, - 2129 - ] - ], - "text": "#" - }, - { - "bounds": { - "height": 16, - "width": 47, - "x": 805, - "y": 2113 - }, - "confidence": 1, - "points": [ - [ - 805, - 2113 - ], - [ - 852, - 2113 - ], - [ - 852, - 2129 - ], - [ - 805, - 2129 - ] - ], - "text": "State" - }, - { - "bounds": { - "height": 16, - "width": 25, - "x": 983, - "y": 2113 - }, - "confidence": 1, - "points": [ - [ - 983, - 2113 - ], - [ - 1008, - 2113 - ], - [ - 1008, - 2129 - ], - [ - 983, - 2129 - ] - ], - "text": "Or" - }, - { - "bounds": { - "height": 16, - "width": 47, - "x": 1011, - "y": 2113 - }, - "confidence": 1, - "points": [ - [ - 1011, - 2113 - ], - [ - 1058, - 2113 - ], - [ - 1058, - 2129 - ], - [ - 1011, - 2129 - ] - ], - "text": "State" - }, - { - "bounds": { - "height": 16, - "width": 66, - "x": 1063, - "y": 2113 - }, - "confidence": 1, - "points": [ - [ - 1063, - 2113 - ], - [ - 1129, - 2113 - ], - [ - 1129, - 2129 - ], - [ - 1063, - 2129 - ] - ], - "text": "License" - }, - { - "bounds": { - "height": 16, - "width": 11, - "x": 1136, - "y": 2113 - }, - "confidence": 1, - "points": [ - [ - 1136, - 2113 - ], - [ - 1147, - 2113 - ], - [ - 1147, - 2129 - ], - [ - 1136, - 2129 - ] - ], - "text": "#" - }, - { - "bounds": { - "height": 16, - "width": 47, - "x": 1505, - "y": 2113 - }, - "confidence": 1, - "points": [ - [ - 1505, - 2113 - ], - [ - 1552, - 2113 - ], - [ - 1552, - 2129 - ], - [ - 1505, - 2129 - ] - ], - "text": "State" - } - ] + "type": "paragraph" }, { "bounds": { @@ -72111,8 +14559,9 @@ "x": 66, "y": 1993.3231 }, + "cells": null, "confidence": 0.72924703, - "id": "9539803c-9255-48e7-bc57-492c2b8c2382", + "id": "c17528cd-889f-419e-8533-dd181817d020", "page": { "height": 2200, "pageIndex": 3, @@ -72140,177 +14589,7 @@ "readingOrder": 29, "role": "Text", "text": "APPRAISER: SUPERVISORY APPRAISER (ONLY IF REQUIRED):", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 113, - "x": 66, - "y": 1994 - }, - "confidence": 1, - "points": [ - [ - 66, - 1994 - ], - [ - 179, - 1994 - ], - [ - 179, - 2013 - ], - [ - 66, - 2013 - ] - ], - "text": "APPRAISER:" - }, - { - "bounds": { - "height": 19, - "width": 138, - "x": 983, - "y": 1994 - }, - "confidence": 1, - "points": [ - [ - 983, - 1994 - ], - [ - 1121, - 1994 - ], - [ - 1121, - 2013 - ], - [ - 983, - 2013 - ] - ], - "text": "SUPERVISORY" - }, - { - "bounds": { - "height": 19, - "width": 111, - "x": 1122, - "y": 1994 - }, - "confidence": 1, - "points": [ - [ - 1122, - 1994 - ], - [ - 1233, - 1994 - ], - [ - 1233, - 2013 - ], - [ - 1122, - 2013 - ] - ], - "text": "APPRAISER" - }, - { - "bounds": { - "height": 22, - "width": 58, - "x": 1236, - "y": 1994 - }, - "confidence": 1, - "points": [ - [ - 1236, - 1994 - ], - [ - 1294, - 1994 - ], - [ - 1294, - 2016 - ], - [ - 1236, - 2016 - ] - ], - "text": "(ONLY" - }, - { - "bounds": { - "height": 16, - "width": 16, - "x": 1297, - "y": 1994 - }, - "confidence": 1, - "points": [ - [ - 1297, - 1994 - ], - [ - 1313, - 1994 - ], - [ - 1313, - 2010 - ], - [ - 1297, - 2010 - ] - ], - "text": "IF" - }, - { - "bounds": { - "height": 22, - "width": 111, - "x": 1316, - "y": 1994 - }, - "confidence": 1, - "points": [ - [ - 1316, - 1994 - ], - [ - 1427, - 1994 - ], - [ - 1427, - 2016 - ], - [ - 1316, - 2016 - ] - ], - "text": "REQUIRED):" - } - ] + "type": "paragraph" }, { "bounds": { @@ -72319,8 +14598,9 @@ "x": 984.04346, "y": 2019.2604 }, + "cells": null, "confidence": 0.68671864, - "id": "3d323673-f322-4781-ba22-13923e8572b1", + "id": "18b0c789-225f-43b2-ae30-d1495bc4692d", "page": { "height": 2200, "pageIndex": 3, @@ -72357,8 +14637,9 @@ "x": 983.36646, "y": 2040.2361 }, + "cells": null, "confidence": 0.7564666, - "id": "0b4200ef-62db-4452-b288-0d315117d0b2", + "id": "2a6386e7-0642-45cc-8243-96d03698fe17", "page": { "height": 2200, "pageIndex": 3, @@ -72395,8 +14676,9 @@ "x": 983.6323, "y": 2063.5852 }, + "cells": null, "confidence": 0.79050535, - "id": "b558e41d-6884-417e-8576-5837da8a27ea", + "id": "8e10c6f3-8a0e-4a5a-8611-a668808ff882", "page": { "height": 2200, "pageIndex": 3, @@ -72433,8 +14715,9 @@ "x": 983.4871, "y": 2088.1506 }, + "cells": null, "confidence": 0.7449045, - "id": "415c9fa9-9bfa-4089-870e-eb786adb19d9", + "id": "d4e5fd23-c2bf-4b3b-86fc-6116778625af", "page": { "height": 2200, "pageIndex": 3, @@ -72471,8 +14754,9 @@ "x": 983.3037, "y": 2111.7244 }, + "cells": null, "confidence": 0.7274561, - "id": "617abd97-9ccb-4b52-b872-3a699f9adb41", + "id": "5186bf90-8217-4680-885e-9946332c4108", "page": { "height": 2200, "pageIndex": 3, @@ -72509,8 +14793,9 @@ "x": 36.84057, "y": 608.1843 }, + "cells": null, "confidence": 0.60344404, - "id": "c40130a6-185a-493a-b03f-2e1fcd82eeb7", + "id": "bdd35052-7746-4608-8104-9a20730d9aa0", "page": { "height": 2200, "pageIndex": 3, @@ -72547,8 +14832,9 @@ "x": 37.14544, "y": 1873.3638 }, + "cells": null, "confidence": 0.7381536, - "id": "e2292511-f72a-4111-8f87-cc368fee9ff3", + "id": "490c1116-ab26-4163-ad65-e2cb1f73263f", "page": { "height": 2200, "pageIndex": 3, @@ -72585,8 +14871,9 @@ "x": 804.5285, "y": 2087.5718 }, + "cells": null, "confidence": 0.65301716, - "id": "2538684a-1e8a-428e-9b8c-a9786b88fd95", + "id": "0ab37bc6-0127-4fb6-a764-facb68eebca1", "page": { "height": 2200, "pageIndex": 3, @@ -72623,8 +14910,9 @@ "x": 805.4762, "y": 2112.2634 }, + "cells": null, "confidence": 0.6585797, - "id": "8ef11fc7-fdc3-4b50-b00a-fa793693714b", + "id": "24f816a1-1478-4f86-b007-c706b1a801b3", "page": { "height": 2200, "pageIndex": 3, @@ -72661,8 +14949,9 @@ "x": 1505.0703, "y": 2087.1624 }, + "cells": null, "confidence": 0.56594193, - "id": "1a4aa86d-8a0e-465e-a485-83a7039432fd", + "id": "21d6f85b-af97-429d-a002-727e944bcc54", "page": { "height": 2200, "pageIndex": 3, @@ -72699,8 +14988,9 @@ "x": 1505.4346, "y": 2112.8284 }, + "cells": null, "confidence": 0.6554538, - "id": "8250a214-8f96-4c3d-91e1-31dffc684c75", + "id": "255c9aaa-22e3-455f-b283-2e199f21ed8f", "page": { "height": 2200, "pageIndex": 3, @@ -72737,8 +15027,9 @@ "x": 54.780468, "y": 2142.1638 }, + "cells": null, "confidence": 0.6866562, - "id": "0dafed28-238d-41ac-97ae-0705549155bb", + "id": "c501e9e4-b0df-4253-b750-37cf19539aba", "page": { "height": 2200, "pageIndex": 3, @@ -72766,289 +15057,7 @@ "readingOrder": 41, "role": "Footer", "text": "Freddie Mac Form 72 Page 4 Fannie Mae Form 1025", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 75, - "x": 55, - "y": 2144 - }, - "confidence": 1, - "points": [ - [ - 55, - 2144 - ], - [ - 130, - 2144 - ], - [ - 130, - 2163 - ], - [ - 55, - 2163 - ] - ], - "text": "Freddie" - }, - { - "bounds": { - "height": 19, - "width": 41, - "x": 138, - "y": 2144 - }, - "confidence": 1, - "points": [ - [ - 138, - 2144 - ], - [ - 179, - 2144 - ], - [ - 179, - 2163 - ], - [ - 138, - 2163 - ] - ], - "text": "Mac" - }, - { - "bounds": { - "height": 19, - "width": 50, - "x": 188, - "y": 2144 - }, - "confidence": 1, - "points": [ - [ - 188, - 2144 - ], - [ - 238, - 2144 - ], - [ - 238, - 2163 - ], - [ - 188, - 2163 - ] - ], - "text": "Form" - }, - { - "bounds": { - "height": 16, - "width": 25, - "x": 247, - "y": 2144 - }, - "confidence": 1, - "points": [ - [ - 247, - 2144 - ], - [ - 272, - 2144 - ], - [ - 272, - 2160 - ], - [ - 247, - 2160 - ] - ], - "text": "72" - }, - { - "bounds": { - "height": 22, - "width": 50, - "x": 794, - "y": 2144 - }, - "confidence": 1, - "points": [ - [ - 794, - 2144 - ], - [ - 844, - 2144 - ], - [ - 844, - 2166 - ], - [ - 794, - 2166 - ] - ], - "text": "Page" - }, - { - "bounds": { - "height": 16, - "width": 13, - "x": 849, - "y": 2144 - }, - "confidence": 1, - "points": [ - [ - 849, - 2144 - ], - [ - 862, - 2144 - ], - [ - 862, - 2160 - ], - [ - 849, - 2160 - ] - ], - "text": "4" - }, - { - "bounds": { - "height": 19, - "width": 66, - "x": 1408, - "y": 2144 - }, - "confidence": 1, - "points": [ - [ - 1408, - 2144 - ], - [ - 1474, - 2144 - ], - [ - 1474, - 2163 - ], - [ - 1408, - 2163 - ] - ], - "text": "Fannie" - }, - { - "bounds": { - "height": 19, - "width": 44, - "x": 1480, - "y": 2144 - }, - "confidence": 1, - "points": [ - [ - 1480, - 2144 - ], - [ - 1524, - 2144 - ], - [ - 1524, - 2163 - ], - [ - 1480, - 2163 - ] - ], - "text": "Mae" - }, - { - "bounds": { - "height": 19, - "width": 50, - "x": 1530, - "y": 2144 - }, - "confidence": 1, - "points": [ - [ - 1530, - 2144 - ], - [ - 1580, - 2144 - ], - [ - 1580, - 2163 - ], - [ - 1530, - 2163 - ] - ], - "text": "Form" - }, - { - "bounds": { - "height": 19, - "width": 50, - "x": 1588, - "y": 2144 - }, - "confidence": 1, - "points": [ - [ - 1588, - 2144 - ], - [ - 1638, - 2144 - ], - [ - 1638, - 2163 - ], - [ - 1588, - 2163 - ] - ], - "text": "1025" - } - ] + "type": "paragraph" }, { "bounds": { @@ -73057,8 +15066,9 @@ "x": 53.308453, "y": 2168.4448 }, + "cells": null, "confidence": 0.68706167, - "id": "8a1b08df-42f4-4231-95a5-8814789078a5", + "id": "43bbbc0d-1c21-468c-a753-4b0f4b552bce", "page": { "height": 2200, "pageIndex": 3, @@ -73086,177 +15096,7 @@ "readingOrder": 42, "role": "Footer", "text": "National Association of Real Estate Appraisers", - "type": "paragraph", - "words": [ - { - "bounds": { - "height": 19, - "width": 80, - "x": 55, - "y": 2169 - }, - "confidence": 1, - "points": [ - [ - 55, - 2169 - ], - [ - 135, - 2169 - ], - [ - 135, - 2188 - ], - [ - 55, - 2188 - ] - ], - "text": "National" - }, - { - "bounds": { - "height": 19, - "width": 116, - "x": 141, - "y": 2169 - }, - "confidence": 1, - "points": [ - [ - 141, - 2169 - ], - [ - 257, - 2169 - ], - [ - 257, - 2188 - ], - [ - 141, - 2188 - ] - ], - "text": "Association" - }, - { - "bounds": { - "height": 19, - "width": 22, - "x": 263, - "y": 2169 - }, - "confidence": 1, - "points": [ - [ - 263, - 2169 - ], - [ - 285, - 2169 - ], - [ - 285, - 2188 - ], - [ - 263, - 2188 - ] - ], - "text": "of" - }, - { - "bounds": { - "height": 19, - "width": 47, - "x": 291, - "y": 2169 - }, - "confidence": 1, - "points": [ - [ - 291, - 2169 - ], - [ - 338, - 2169 - ], - [ - 338, - 2188 - ], - [ - 291, - 2188 - ] - ], - "text": "Real" - }, - { - "bounds": { - "height": 19, - "width": 61, - "x": 347, - "y": 2169 - }, - "confidence": 1, - "points": [ - [ - 347, - 2169 - ], - [ - 408, - 2169 - ], - [ - 408, - 2188 - ], - [ - 347, - 2188 - ] - ], - "text": "Estate" - }, - { - "bounds": { - "height": 25, - "width": 105, - "x": 416, - "y": 2169 - }, - "confidence": 1, - "points": [ - [ - 416, - 2169 - ], - [ - 521, - 2169 - ], - [ - 521, - 2194 - ], - [ - 416, - 2194 - ] - ], - "text": "Appraisers" - } - ] + "type": "paragraph" }, { "bounds": { @@ -73265,8 +15105,9 @@ "x": 792.2724, "y": 2142.542 }, + "cells": null, "confidence": 0.9124754, - "id": "11d903b2-423b-4a82-8791-4ca48e78a7ba", + "id": "7d54c092-4bf0-4a83-a2d1-a67a3a51b484", "page": { "height": 2200, "pageIndex": 3, @@ -73303,8 +15144,9 @@ "x": 1407.5188, "y": 2142.4934 }, + "cells": null, "confidence": 0.9118423, - "id": "77d273ba-c76c-4129-9089-d57495dbb5ef", + "id": "79e3c80a-84b0-4934-9779-b5fe7d3c2250", "page": { "height": 2200, "pageIndex": 3, @@ -73366,16 +15208,20 @@ "textDirection": "lrtb" } ] + } + }, + "configuration": { + "apiVersion": "2026-05-25", + "engine": { + "requestedEngineVersion": "stable" }, - "markdown": "![Circular black-and-white seal or logo with a weighing scale symbol in the center.]\n\n\n## SMALL RESIDENTIAL INCOME PROPERY APPRAISAL REPORT\n\n\n![Circular black-and-white seal or logo with a weighing scale symbol in the center.]\n\n\nZip Code 62704\n\n\nProperty Address Willowbrook Lane 1487_____________________________________\n\n\nLegal Description 12, Block 3, Willowbrook Estates Subdivision Lot____________________________________________________________County Sangamon___________________________\n\n\nAssessor's Parcel No. 14-22-301-012______________________Tax Year 2025_______ R.E. Taxes $ 6,850___________ Special Assessments $\n\n\nTax Year\n\n\nNeighborhood or Project Name Estates Willowbrook_____________________________ Map Reference 22-14N-4W____________ Census Tract 0012.00________________\n\n\nBorrower Robert Ashford\n\n\nProperty rights appraised\n\n\nSales Price $ 285,000\n\n\nProperty rights appraised 4 ❐ Fee Simple ❐ Leasehold Project Type ❐ PUD ❐ Condominium HOA$__________ /mo\n\n\nDate of Sale\n\n\nLender/Client Heritage National Bank\n\n\nAppraiser Nathan Reyes, Certified Residential Appraiser\n\n\nLocation\n\n\nBuilt up\n\n\nGrowth rate\n\n\nProperty Values\n\n\nDemand/Supply\n\n\nMarketing time\n\n\n❐ Urban\n\n\n❐ Over 75%\n\n\n❐ Rapid\n\n\n❐ Increasing\n\n\n❐ Shortage\n\n\n❐ Under 3 mos.\n\n\nTypical 2-4 family bldg. Present land use % Land use change\n\n\nTypical rent $ 950 ________ 4 ❐ Stable ❐ Declining One family ❐ Likely\n\n\nEst. neighborhood apt. vacancy 4____ % ❐ Declining 2-4 family ❐ In process to:\n\n\nRent controls □ Yes\n\n\n□ Likely\n\n\nCity Springfield\n\n\nR.E. Taxes $ 6,850\n\n\nMap Reference 22-14N-4W\n\n\nBorrower Ashford Robert____________________________ Current Owner Ashford Robert________________________ Occupant ❐ Owner ❐ Vacant\n\n\n□ Leasehold\n\n\nProject Type\n\n\nStateIL\n\n\nCounty Sangamon\n\n\nSpecial Assessments $ 0\n\n\nCensus Tract 0012.00\n\n\nOccupant\n\n\nCondominium\n\n\nPUD\n\n\nOwner\n\n\nHOA$\n\n\nSales Price $ 285,000_______ Date of Sale Description and $ amount of loan charges/concessions to be paid by seller N/A__________\n\n\nLender/Client National Bank Heritage_______________________________ Address Financial Plaza, Springfield, IL 62701 500___________________________________________________________\n\n\nNathan Reyes, Certified Residential Appraiser___________________________________ Address Oak Grove Drive, Springfield, IL 62702 1200___________________________________________________________\n\n\nSingle Family\n\n\nOccupancy $(000) Occupancy $(000) (yrs)\n\n\nOwner\n\n\nTenant\n\n\n❐ Vacant (0-5%) Predominant ❐ Vacant (0-5%) Predominant\n\n\n❐ Vacant (over 5%) ❐ Vacant (over 5%)\n\n\nDeclining\n\n\nDeclining\n\n\nRent controls ❐ Yes ❐ Likely If yes or likely, describe____________ Multi family _____\n\n\nNote: Race and the racial composition of the neighborhood are not appraisal factors\n\n\nNeighborhood boundaries and characteristics:\n\n\nProximity to employment centers in downtown Springfield (10 minutes), grocery, schools, and public transportation supports steady rental demand and _____________________________________________________________________________________________________________ Employment base is stable, anchored by state government, healthcare, and higher education employers. _____________________________________________________________________________________________________________\n\n\nFactors that affect the marketability of the properties in the neighborhood (proximity to employment and amenities, employment stability, appeal to market, etc.): __________________________________________________________________________________________\n\n\ncompeting listings within the immediate subject neighborhood were found to be materially superior or inferior; market conditions have been stable with No_____________________________________________________________________________________________________________ The following available listings represent the most current, similar, and proximate competitive properties to the subject property in the subject neighborhood. This analysis is intended to evaluate the inventory currently on the market competing with the subject property in the subject neighborhood and recent price and marketing time trends affecting the subject property. (Listings outside the subject neighborhood are not considered applicable) The listing comparables can be the rental or sale comparables if they are currently for sale.\n\n\nComparison of listings to subject propert:\n\n\nMarket conditions that affect 2-4 family properties in the subject neighborhood (including the above neighborhood indicators of growth rate, property values, demand/supply, and marketing time) and the prevalence and impact in the subject market area regarding loan discounts, interest buydowns and concessions, and identification of trends in listing prices, average days on market and any change over past year, etc.: _________________________________________________________________________________________________\n\n\n150' x 200' irregular Dimensions____________________________________________________________________ Level Topography________________________________\n\n\nSite area acres (30,000 sq. ft.) 0.69______________________________________________________________________ Size for area Typical______________________________________\n\n\nft.)\n\n\nSpecific zoning classification and description Two-Family Residential R-2,_________________________________________ Shape Rectangular____________________________________\n\n\nZoning compliance 4 ❐ Legal ❐ Legal nonconforming (Grandfathered use) ❐ Illegal ❐ No zoning Drainage adequate Appears__________________________________\n\n\nHighest & best use as improved: 4 ❐ Present use ❐ Other use (explain) Residential View_________________________________\n\n\nUtilities\n\n\nGas\n\n\nSanitary sewer 4 ❐ Street lights Overhead_______________ 4 ❐ ❐Fema Map 17167C0210F No._________________________\n\n\nStorm sewer 4 ❐\n\n\nOther use (explain)\n\n\nPresent use\n\n\nOther\n\n\nOff-site improvements\n\n\nStreet Asphalt paved\n\n\nGas Curb/gutter Concrete________________\n\n\nSidewalk\n\n\nStreet lights Overhead\n\n\nAlley None\n\n\nComments (apparent adverse easements, encroashments, special assessments, slide areas, illegal or legal nonconforming zoning, use, etc): adverse easements or encroachments noted. Zoning conforms to current use. No_________________________________________________________________________________________________________\n\n\n_____________________________________________________________________________________________________________\n\n\nType\n\n\nPublic\n\n\nTopographyLevel\n\n\nSize Typical for area\n\n\nShape Rectangular\n\n\nDrainage Appears adequate\n\n\nView Residential\n\n\nLandscaping mature trees Typical,__________________________\n\n\nUtilities Public Other Off-site improvements Type Public Private Driveway shared 2-car Asphalt,_____________________________\n\n\nStreet paved Asphalt____________________ ❐Apparent easements utility easements along Standard____________________\n\n\nFema Zone X\n\n\nFema Map No. 17167C0210F\n\n\nMap Date\n\n\nPredominant Single family housing Predominant 2-4 family housing\n\n\nAge\n\n\nPredominant\n\n\n2-4 Family\n\n\nOccupancy\n\n\n❐ Owner 4 ❐ Owner\n\n\nTenant\n\n\nVacant (0-5%)\n\n\nVacant (over 5%)\n\n\nPresent land use %\n\n\nOne family\n\n\n2-4 family\n\n\nMulti family\n\n\nto the south, and Commercial\n\n\nLand use change\n\n\nLikely\n\n\nIn process to:\n\n\n4 ❐ Suburban\n\n\n4 ❐ 25-75%\n\n\n4 ❐ Stable\n\n\n4 ❐ Stable\n\n\n4 ❐ In balance\n\n\n4 ❐ 3-6 mos.\n\n\n❐ Rural\n\n\n❐ Under 25%\n\n\n❐ Slow\n\n\n❐ Over supply\n\n\n❐ Over 6 mos.\n\n\nStable\n\n\n2025\n\n\n## SUBJECT\n\n\n## NEIGHBORHOOD\n\n\nVacant\n\n\n/mo\n\n\n2-4 family housing\n\n\nPrice\n\n\n$(000)\n\n\nAge\n\n\n(yrs)\n\n\nHigh 50\n\n\nPredominant\n\n\n$(000)\n\n\n❐ Tenant 260_____ High 45_____ ❐ Tenant High 50_____\n\n\nPredominant\n\n\ntypical\n\n\nlot\n\n\nPublic\n\n\nSidewalk 4 ❐ ❐Fema Zone Map Date\n\n\n☑\n\n\nPrivate\n\n\n## SMALL RESIDENTIAL INCOME PROPERTY APPRAISAL REPORT\n\n\nGeneral desciption Exterior description (Materials/ condition) Foundation Concrete Poured_______________ Insulation (R-value if known)\n\n\nFoundation\n\n\nExterior walls\n\n\nRoof surface\n\n\nUnits/bldgs. Foundation Concrete Poured___________________ Slab ❐ Roof\n\n\nStories Exterior walls Veneer/Vinyl Siding Brick___________________ Crawl space 4 ❐ Ceiling R-38___________\n\n\nAsphalt Shingle\n\n\nGutters & dwnspsts Aluminum\n\n\nWindow type Double-hung Vinyl___________________ Settlement noted None_____________ ❐ None Adequate___________\n\n\nVinyl Double-hung\n\n\nStorm sash/screens Infestation noted None_____________ Adequacy\n\n\nManufactured housing\n\n\n☐ Yes\n\n\nConstruction and Safety Standards)\n\n\nRooms\n\n\nGeneral desciption\n\n\nUnits/bldgs.\n\n\nStories 2\n\n\nType (det./att.) Detached_________ Roof surface Shingle Asphalt___________________ Sump Pump None_____________ 4 ❐ Walls R-13___________\n\n\nDesign (style) Traditional _________ Gutters & dwnspts Aluminum__________________ Dampness noted None_____________ ❐ Floor\n\n\nEffective age (yrs.) 20\n\n\nImprovements contain Rooms: Bedrooms: Bath(s):\n\n\n## Bedrooms\n\n\nFoundation Poured Concrete\n\n\nSlab\n\n\nCrawl space\n\n\nSump Pump\n\n\nDampness\n\n\nSettlement\n\n\nInfestation\n\n\nBasement\n\n\nEffective age (yrs.) 20_____ Basement finish finished rec 50%___________\n\n\nBath(s)\n\n\nSquare feet of Gross Building Area\n\n\nCOMMON AREAS) OF THE IMPROVEMENTS GROSS BUILDING AREA (GBA) IS DEFINED AS THE TOTAL FINISHED AREA (INCLUDING BASED UPON EXTERIOR MEASUREMENTS.\n\n\nHeating\n\n\nCondition Good\n\n\nCentral Air\n\n\nHeating Kitchen equip. (#/unit. cond.) Attic\n\n\nYes Refrigerator_________________ ❐ None\n\n\nRange/oven Yes\n\n\nDisposal\n\n\nDishwasher Yes\n\n\nFan/hood\n\n\nCompactor No\n\n\nWasher/dryer (each unit) Yes_______________ ❐ Finished Offstreet ❐\n\n\nFinished\n\n\n(#/unit. cond.)\n\n\nAttic\n\n\nNone\n\n\nDrywall/Good__________________Fuel Range/oven ❐ Stairs Carport ❐\n\n\nTrim/finish Wood/Good__________________Condition Good__________ Disposal 4 ❐ Drop stair Attached ❐\n\n\nScuttle\n\n\nFloor\n\n\nCompactor ❐ Heated Inadequate ❐\n\n\nFinished\n\n\nFinished ❐ Unfinished None ❐\n\n\nN/A\n\n\nNone\n\n\nNone\n\n\nNone noted\n\n\nNone noted\n\n\nNone noted\n\n\nInsulation (R-value if known)\n\n\nRoof\n\n\nCeiling\n\n\nWalls\n\n\n□ Floor\n\n\n□ None\n\n\nAdequacy\n\n\nManufactured housing ❐ Yes Basement Energy efficient items _____ Double-pane\n\n\nR-38\n\n\nR-13\n\n\nAdequate\n\n\nwindows\n\n\naverage\n\n\nDrywall/Good\n\n\nTrim/finish Wood/Good\n\n\nCeramic Tile\n\n\nBath Ceramic Tile wainscot________________Cooling____________ Fan/hood ❐ Floor Adequate 4 ❐\n\n\nFireplace(s) No\n\n\nNo\n\n\nCondition of the improvements, repairs needed, quality of construction, additional features, modernization etc.:\n\n\nis in good overall condition with no material repairs needed. Kitchens and baths were updated approximately 8 years ago. Construction quality is Property_______________________________________________________________________________________________________________\n\n\nphysical depreciation consistent with effective age of 20 years; no functional Normal_______________________________________________________________________________________________________________ external obsolescence noted.\n\n\nDepreciation (physical, functional, and external inadequacies, etc.): known or observed. None_______________________________________________________________________________________________________________\n\n\nAdverse environmental conditions (such as, but not limited to, hazardous wastes, toxic substances, etc.) present in the improvements on site, or in the immediate vicinity of the subject property:\n\n\n## VALUATION ANALYSIS\n\n\nESTIMATED SITE VALUE----------------------- $ 65,000______________ Comments on Cost Approach (such as, source of cost estimate, site value, square foot calculations and, for HUD and VA, the estimated remaining economic life on the property): estimate from Marshall & Cost_____________________\n\n\nCarport\n\n\nAttached\n\n\nTile Ceramic__________________ Air Central_________________ Yes Dishwasher_________________ ❐ Scuttle Detached 4 ❐\n\n\nAdequate\n\n\nInadequate\n\n\nOffstreet\n\n\nNone\n\n\n## ADDITIONAL COMMENTS\n\n\n## COST APPROACH\n\n\nESTIMATED SITE VALUE\n\n\n$ 65,000\n\n\nESTIMATED REPRODUCTION COST-NEW OF IMPROVEMENTS:\n\n\n= $ 237,500______________\n\n\n= $\n\n\n= $\n\n\n= $\n\n\n= $\n\n\n= $\n\n\n= $\n\n\n= $ 0\n\n\n= $ 8,000\n\n\nExternal\n\n\nResidential\n\n\nSq. Ft. @ $ = $\n\n\nSq. Ft. @ $\n\n\nSq. Ft. @ $ = $\n\n\nSq. Ft. @ $ = $\n\n\nSpecial Energy Efficient Items = $\n\n\nPorches, Patios, etc. = $\n\n\nTotal Estimated Cost New\n\n\nPhysical Functional External\n\n\nFunctional\n\n\n15,000 0 15,000\n\n\nLess\n\n\nDepreciation\n\n\nDepreciation Value of Improvements $ 230,500__________\n\n\n\\As is\\ Value of Site Improvements\n\n\nINDICATED VALUE BY COST APPROACH\n\n\n15,000\n\n\n$ 230,500\n\n\n## SMALL RESIDENTIAL INCOME PROPERTY APPRAISAL REPORT\n\n\nAt least three rental comparables should be reported and analyzed in this section. The rental comparables should represent the most current rental information on properties are similar and proximate to the subject property as possible. (This comparison is based on current rental data, therefore, the rental comparables typically are not the same comparables used in the sales comparison analysis.) The appraisal report should assure the reader that the units and properties selected as comparables are comparable to the subject property (both the units and the overall property) and accurately represent the rental market for the subject property (unless otherwise stated within the report).\n\n\nITEM\n\n\nAddress\n\n\n1487 Willowbrook Lane, Springfield, IL\n\n\nProximity to subject\n\n\nLease dates (if available)\n\n\nRent survey date\n\n\nData source\n\n\nRent concessions\n\n\nDescription of property- units, design, appeal, age, vacancies, and conditions\n\n\nUtilities, furniture and amenities included in rent\n\n\nAnalysis of rental data and support for estimated market rents for the individual subject units (including the adjustments used, the adequacy of comparables, rental concessions, etc.)\n\n\nrental is similar in size, age, and condition to the subject and supports Comparable_______________________________________________________________________________________________________________\n\n\nestimated market rents used in income approach. the_______________________________________________________________________________________________________________\n\n\nSubject's rent schedule reconciles the applicable indicated monthly market rents to the appropriate subject unit, and provides the estimated rents for the subject property. The appraiser must review characteristics of the comparable sales to determine whether estimated rents should reflect actual or market rents. For example, if actual rents were available on the sales comparables and used to derive the gross rent multiplier (GRM), actual rents for the subject should be used. If market rents were used to construct the comparables' rents and derive the GRM, market rents should be used. The total estimated rent must represent rent characteristic consistent with sales comparable data used to derive the GRM. The total gross estimated rent is not adjusted for vacancy.\n\n\nOther monthly income (itemize)\n\n\nVacancy: Actual last year 5___ Estimated Annually Total gross estimated rent$ 27,600_________\n\n\nUtilities included in estimated rent ❐ Electric ❐ Water 4 ❐ Sewer 4 ❐ Gas ❐ Oil ❐ Trash Collection\n\n\nTotal gross estimated rent$ 27,600\n\n\nAnnually\n\n\nTrash Collection\n\n\nElectric\n\n\nEstimated\n\n\nSewer\n\n\nWater\n\n\nGas\n\n\nOil\n\n\nComments on the rent schedule, actual rents, estimated rents (especially regarding differences between actual and estimated rents), utilities, etc.: rents are supported by comparable rental data in the immediate Estimated_____________________________________________________________________________________________________\n\n\nvacancy and collection loss estimated at 5%, consistent with market. neighborhood;_______________________________________________________________________________________________________________\n\n\nN/A\n\n\nN/A\n\n\n07/2026 07/2026\n\n\nOwner/Lease records MLS/Property Manager\n\n\nNo. Units None No. Vac.None No. Units No. Vac.\n\n\nYr. Blt: Yr. Blt:\n\n\nCOMPARABLE NO. 1\n\n\n1522 Maple Ridge Court, Springfield,\n\n\n0.4 miles north\n\n\n01/2025\n\n\n07/2026\n\n\nMLS / Property Manager\n\n\nNo. Units\n\n\nYr. Blt.\n\n\nNo. Vac.\n\n\nNo. Units\n\n\nYr. Blt. Yr. Blt.\n\n\nNo. Vac.\n\n\nNo. Units No. Vac. No. Units 01 No. Vac.\n\n\nYr. Blt.\n\n\nNo. Vac.\n\n\n## COMPARABLE RENTAL DATA\n\n\n## SMALL RESIDENTIAL INCOME PROPERTY APPRAISAL REPORT\n\n\nThe undersigned has received three recent sales of properties most similar and proximate to the subject property and has described and analyzed these in this analysis. If there is a significant variation between the subject and comparable properties, the analysis includes a dollar adjustment reflecting the market reaction to those items or an explanation supported by the market data. If a significant item in the comparable property is superior to, or more favorable than, the subject property, a minus (-) adjustment is made, thus reducing the adjusted sales price of the comparable property. If a significant item in the comparable property is inferior to, or less favorable than, the subject property, a plus (+) adjustment is made, thus increasing sales price of the comparable property. [(1) Sales Price/Gross Monthly Rent]\n\n\nComments on sales comparison (including reconciliation of all indicators of value as to consistency and relative strength and evaluation of the typical investor's purchaser's motivation in that market): _______________________________________________________________\n\n\ncomparable sale is similar in location, condition, and unit configuration to the The_______________________________________________________________________________________________________________\n\n\nno significant adjustments were warranted. Investor purchasers in this market subject;_______________________________________________________________________________________________________________\n\n\nAnalysis of any current agreement of sale, option, or listing of the subject property and analysis of any prior sales of subject and comparables within one year of the date of appraisal: __________________________________________________________________________________\n\n\nsubject property is not currently listed for sale, and there are no known prior sales The_____________________________________________________________________________________________________________________________\n\n\nthe subject or comparables within the past year that would affect this analysis. of_____________________________________________________________________________________________________________________________\n\n\nTotal gross monthly estimated rent $ 2,300________ x gross rent multiplier (GRM) 132.6________ =$ 305,000________ INDICATED VALUE BY INCOMING APPROACH Comments on income approach (including expense rates, if available, and reconciliation of the GRM) derived from comparable rental sale; income approach GRM___________________________________________\n\n\nINDICATED VALUE BY SALES COMPARISON APPROACH\n\n\nINDICATED VALUE BY INCOME $ 305,000___________________\n\n\nINDICATED VALUE BY COST APPROACH $ 295,500___________________\n\n\n\\as is\\\n\n\n4 ❐ \\as is\\ ❐ subject to the repairs, alterations, inspections, or conditions listed below ❐ subject to completion per plans and specifications\n\n\nGreatest weight was given to the sales comparison approach, as it most directly _______________________________________________________________________________________________________________________________________________\n\n\n$ 305,000\n\n\n$ 295,500\n\n\nsubject to completion per plans and specifications\n\n\nFinal reconciliation: the actions of typical investor-purchasers in this market. The income approach reflects_______________________________________________________________________________________________________________________________\n\n\nThe purpose of this appraisal is to estimate the market value of the real property that is the subject of this report, based on the above conditions and the certification, contingent and limiting conditions, and market value definition, that are stated in the attached Freddie Mac Form 439/Fannie Mae Form 1004B (Revised __________________ ).\n\n\nI (WE) ESTIMATE THE MARKET VALUE, AS DEFINED, OF THE REAL PROPERTY THAT IS THE SUBJECT OF THIS REPORT, AS OF 07/28/2026______________________________________\n\n\n(WHICH IS THE DATE OF INSPECTION AND THE EFFECTIVE DATE OF THIS REPORT) TO BE $\n\n\nAPPRAISER\n\n\nName Reyes, Certified Residential Appraiser Nathan___________________________________________________________________________ Name\n\n\nSignature Nathan Reyes ________________________________________________________________________\n\n\nDate Report Signed Date Report Signed\n\n\nState Certification # State State Certification # State\n\n\nOr State License # State Or State License # State\n\n\nAPPRAISER: SUPERVISORY APPRAISER (ONLY IF REQUIRED):\n\n\nSignature\n\n\nName\n\n\nDate Report Signed\n\n\nState Certification #\n\n\nOr State License #\n\n\n## SALES COMPARISON ANALYSIS\n\n\n## RECONCILIATION\n\n\nState IL\n\n\nState\n\n\nState\n\n\nState\n" + "maxLanguages": 2, + "maxScripts": 2, + "mode": "agentic", + "outputFormat": "spatial" }, - "requestId": "GMbEtO8RKGGynJIAA0DS", - "runId": "7KQ3QSHZJTC8YJH67EQ00VANX4", - "status": 200, - "usage": { - "data_extraction_credits": { - "cost": 72, - "remainingCredits": 4928 - } + "metrics": { + "pagesProcessed": 4, + "processingTimeMs": 56126 } -} \ No newline at end of file +} diff --git a/demos/prior_authorization/README.md b/demos/prior_authorization/README.md new file mode 100644 index 0000000..3e695e1 --- /dev/null +++ b/demos/prior_authorization/README.md @@ -0,0 +1,85 @@ +# CMS GLP-1 Bridge prior-authorization extraction + +This developer sample maps page 1 of the official CMS Medicare GLP-1 Bridge +Prior Authorization Request Form to structured intake fields with source +regions. The form contains only clearly fictional, privacy-safe demo values. It +contains no PHI and does not represent a patient, prescription, payer decision, +clinical determination, or coverage outcome. + +The unchanged downloaded CMS source is preserved at +`source/cms-glp-1-bridge-original.pdf` with SHA-256 +`c223dc0f6acaf1d7b7e345bdf968ba2373ce94b39994b006a1e9915a07768fa0`. +Its canonical publisher URL is `https://www.cms.gov/glp-1-bridge.pdf`. + +**[Open this reviewed proof on GitHub Pages →](https://pspdfkit.github.io/nutrient-extraction-samples/docs/lighthouse/assets/prior-authorization-reviewed.html?utm_campaign=de_lighthouse_pilot_v1&utm_source=github&utm_medium=repository&utm_content=prior_authorization.github_sample.v01.proof)** + +`data/prior-authorization.pdf` is a deterministic one-page derivative. It +keeps CMS page 1 as vector content, reserves a restrained provenance rail, and +adds only the eleven approved demo values in their printed fields and +checkboxes. It has no AcroForm tree or Widget annotations. The previous bespoke +fixture remains available as `data/legacy-synthetic-prior-authorization.pdf`. + +## Rebuild the public-form input + +From the repository root: + +```bash +python3 demos/prior_authorization/build_public_form.py +python3 demos/prior_authorization/build_public_form.py --check +``` + +The builder verifies the approved original and derived hashes before writing. +`--check` compares the committed PDF byte-for-byte without modifying it. + +## Offline provisional package + +```bash +python3 demos/prior_authorization/generate_demo.py --provisional +python3 demos/prior_authorization/check_expected.py --allow-provisional +``` + +Open `demos/prior_authorization/provisional/output/index.html` directly. The page is +self-contained. These commands do not read `NUTRIENT_API_KEY`, use a response +cache, call the network, or consume credits. A zero exit code means only that +the fixture-derived values and manually reviewed page-0 source boxes match the +independent oracle. Provisional evidence is not API-performance evidence. The +commands write only below `provisional/` and never replace the committed +reviewed artifacts under `output/`. + +## Live refresh gate + +`--refresh` is the only credential-reading and network-capable path. It consumes +Extract API credits and may run only through the separately approved live gate: + +```bash +python3 demos/prior_authorization/generate_demo.py --refresh +python3 demos/prior_authorization/check_expected.py +python3 demos/prior_authorization/generate_demo.py --replay-live +``` + +The historical cache and receipt are preserved, but they are bound to the +legacy synthetic input and cannot serve as evidence for this public-form +fixture. Replays require an exact input/request match. +Replays never fall back to provisional evidence. + +After a replacement live response has received a recorded independent review, +reproduce that reviewed state with: + +```bash +python3 demos/prior_authorization/generate_demo.py --replay-reviewed +python3 demos/prior_authorization/check_expected.py --reviewed-live +``` + +These commands replay receipt-bound evidence and its recorded review. They do +not perform a new review or themselves approve publication. + +## Boundaries + +This is intake and source review only. It does not decide patient care, medical +necessity, coverage, payer action, or compliance. It is not an accuracy, +compliance, security, or performance benchmark. Source regions make results +reviewable; the independent oracle determines whether this single form matches. + +Generated provisional artifacts are `provisional/evidence.json`, +`provisional/output/source-page.png`, `provisional/output/comparison.json`, and +`provisional/output/index.html`. diff --git a/demos/prior_authorization/build_public_form.py b/demos/prior_authorization/build_public_form.py new file mode 100644 index 0000000..46cf49d --- /dev/null +++ b/demos/prior_authorization/build_public_form.py @@ -0,0 +1,287 @@ +"""Build the deterministic, flattened CMS public-form demo input. + +The downloaded CMS PDF remains unchanged under ``source/``. This builder keeps +page 1 as vector content, scales it just enough to reserve a top provenance +rail, and overlays only the privacy-safe values approved for the demo. +""" + +from __future__ import annotations + +import argparse +import hashlib +import os +import sys +import tempfile +from copy import deepcopy +from io import BytesIO +from pathlib import Path + +from pypdf import PageObject, PdfReader, PdfWriter, Transformation +from pypdf.generic import NameObject +from reportlab.pdfbase.pdfmetrics import stringWidth +from reportlab.pdfgen.canvas import Canvas + + +DEMO_DIR = Path(__file__).resolve().parent +ORIGINAL = DEMO_DIR / "source" / "cms-glp-1-bridge-original.pdf" +OUTPUT = DEMO_DIR / "data" / "prior-authorization.pdf" + +ORIGINAL_SHA256 = "c223dc0f6acaf1d7b7e345bdf968ba2373ce94b39994b006a1e9915a07768fa0" +DERIVED_SHA256 = "18bb2e0c4419c0c2acb002acb0b4857efacc7e96f37d15decebfe06d3394d530" +PAGE_WIDTH = 612.0 +PAGE_HEIGHT = 792.0 +FORM_SCALE = 0.96 +FORM_X = (PAGE_WIDTH - PAGE_WIDTH * FORM_SCALE) / 2 +FORM_Y = 0.0 +TOP_GAP = PAGE_HEIGHT - (PAGE_HEIGHT * FORM_SCALE + FORM_Y) + +PROVENANCE_RAIL = "AUTHENTIC PUBLIC FORM - PRIVACY-SAFE DEMO VALUES" +INK = (24 / 255, 52 / 255, 91 / 255) + + +def _sha256(payload: bytes) -> str: + return hashlib.sha256(payload).hexdigest() + + +def _read_frozen(path: Path, *, expected_sha256: str, label: str) -> bytes: + if path.is_symlink() or not path.is_file(): + raise ValueError(f"{label} must be a regular, non-symlink file") + payload = path.read_bytes() + actual = _sha256(payload) + if actual != expected_sha256: + raise ValueError( + f"{label} SHA-256 mismatch: expected {expected_sha256}, found {actual}" + ) + return payload + + +def _atomic_write(path: Path, payload: bytes) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + if path.is_file() and not path.is_symlink() and path.read_bytes() == payload: + return + descriptor, temporary_name = tempfile.mkstemp( + dir=path.parent, + prefix=f".{path.name}.", + suffix=".tmp", + ) + temporary = Path(temporary_name) + try: + with os.fdopen(descriptor, "wb") as stream: + stream.write(payload) + stream.flush() + os.fsync(stream.fileno()) + os.replace(temporary, path) + finally: + if temporary.exists(): + temporary.unlink() + + +def _final_x(original_x: float) -> float: + return FORM_X + original_x * FORM_SCALE + + +def _final_y_from_top(original_baseline_top: float) -> float: + return PAGE_HEIGHT - (TOP_GAP + original_baseline_top * FORM_SCALE) + + +def _draw_value( + canvas: Canvas, + value: str, + *, + x: float, + baseline_top: float, + size: float = 8.5, + max_width: float | None = None, +) -> None: + if max_width is not None and stringWidth(value, "Helvetica-Bold", size) > max_width: + raise ValueError(f"demo value does not fit its printed field: {value!r}") + canvas.setFont("Helvetica-Bold", size) + canvas.setFillColorRGB(*INK) + canvas.drawString(_final_x(x), _final_y_from_top(baseline_top), value) + + +def _draw_x(canvas: Canvas, *, x: float, top: float, size: float = 6.0) -> None: + """Draw a centered vector X inside an existing printed checkbox.""" + + left = _final_x(x) + upper = PAGE_HEIGHT - (TOP_GAP + top * FORM_SCALE) + canvas.setStrokeColorRGB(*INK) + canvas.setLineWidth(1.0) + canvas.line(left, upper, left + size, upper - size) + canvas.line(left, upper - size, left + size, upper) + + +def _overlay_pdf() -> BytesIO: + payload = BytesIO() + canvas = Canvas( + payload, + pagesize=(PAGE_WIDTH, PAGE_HEIGHT), + invariant=1, + pageCompression=1, + ) + + # The rail occupies only the space created above the scaled original page. + canvas.setFillColorRGB(1, 1, 1) + canvas.rect(0, PAGE_HEIGHT - TOP_GAP, PAGE_WIDTH, TOP_GAP, fill=1, stroke=0) + canvas.setStrokeColorRGB(0.72, 0.74, 0.78) + canvas.setLineWidth(0.6) + canvas.line(18, PAGE_HEIGHT - TOP_GAP + 1.5, PAGE_WIDTH - 18, PAGE_HEIGHT - TOP_GAP + 1.5) + canvas.setFillColorRGB(0.16, 0.18, 0.22) + canvas.setFont("Helvetica-Bold", 7.5) + canvas.drawCentredString(PAGE_WIDTH / 2, PAGE_HEIGHT - 18.5, PROVENANCE_RAIL) + + _draw_value(canvas, "Elena Brooks", x=101, baseline_top=194.5, max_width=190) + _draw_value(canvas, "DEMO-MBI-771204", x=147, baseline_top=222.0, max_width=145) + _draw_value(canvas, "04/18/1987", x=123, baseline_top=237.0, max_width=170) + _draw_value( + canvas, + "742 Demo Street, Austin, TX 78745", + x=84, + baseline_top=252.0, + size=7.8, + max_width=210, + ) + + _draw_value(canvas, "Priya Raman, MD", x=392, baseline_top=194.5, max_width=188) + _draw_value(canvas, "(555) 470-2200", x=350, baseline_top=226.0, max_width=225) + _draw_value(canvas, "1234567890", x=341, baseline_top=255.0, max_width=92) + + # Replace the selected printed drug option so its visible oracle text is + # exactly the approved value (without the publisher's registration mark). + drug_left = _final_x(34) + drug_top = TOP_GAP + 338.0 * FORM_SCALE + drug_width = 112 * FORM_SCALE + drug_height = 22 * FORM_SCALE + canvas.setFillColorRGB(1, 1, 1) + canvas.rect( + drug_left, + PAGE_HEIGHT - drug_top - drug_height, + drug_width, + drug_height, + fill=1, + stroke=0, + ) + canvas.setStrokeColorRGB(0.25, 0.27, 0.31) + canvas.setLineWidth(0.7) + box_x = _final_x(36) + box_y = PAGE_HEIGHT - (TOP_GAP + 344.0 * FORM_SCALE) - 7.5 + canvas.rect(box_x, box_y, 7.5, 7.5, fill=0, stroke=1) + _draw_x(canvas, x=36.8, top=345.0, size=5.8) + _draw_value(canvas, "Wegovy Injection", x=47, baseline_top=352.8, size=8.2, max_width=95) + + _draw_x(canvas, x=60.7, top=513.8) + _draw_x(canvas, x=326.1, top=578.4) + _draw_x(canvas, x=326.1, top=654.5) + + canvas.showPage() + canvas.save() + payload.seek(0) + return payload + + +def _build_payload() -> bytes: + _read_frozen( + ORIGINAL, + expected_sha256=ORIGINAL_SHA256, + label="official CMS source", + ) + + source_reader = PdfReader(ORIGINAL) + if len(source_reader.pages) != 3: + raise ValueError("official CMS source must contain exactly three pages") + source_page = deepcopy(source_reader.pages[0]) + if float(source_page.mediabox.width) != PAGE_WIDTH or float(source_page.mediabox.height) != PAGE_HEIGHT: + raise ValueError("official CMS page 1 must be exactly 612x792 points") + source_page.pop(NameObject("/Annots"), None) + + page = PageObject.create_blank_page(width=PAGE_WIDTH, height=PAGE_HEIGHT) + page.merge_transformed_page( + source_page, + Transformation().scale(FORM_SCALE).translate(FORM_X, FORM_Y), + over=True, + expand=False, + ) + overlay_reader = PdfReader(_overlay_pdf()) + page.merge_page(overlay_reader.pages[0], over=True, expand=False) + page.pop(NameObject("/Annots"), None) + + writer = PdfWriter() + writer.add_page(page) + writer.metadata = None + writer.add_metadata( + { + "/Title": "CMS GLP-1 Bridge Prior Authorization Request Form - Privacy-Safe Demo", + "/Author": "Centers for Medicare & Medicaid Services", + "/Subject": "Authentic public form with privacy-safe demo values", + "/Creator": "Nutrient deterministic public-form fixture builder", + "/Producer": "pypdf", + } + ) + writer.root_object.pop(NameObject("/AcroForm"), None) + + payload = BytesIO() + writer.write(payload) + return payload.getvalue() + + +def _validate_output(payload: bytes) -> None: + reopened = PdfReader(BytesIO(payload), strict=True) + if len(reopened.pages) != 1: + raise ValueError("derived demo PDF must contain exactly one page") + if reopened.get_fields(): + raise ValueError("derived demo PDF must not contain AcroForm fields") + if "/AcroForm" in reopened.trailer["/Root"]: + raise ValueError("derived demo PDF must not contain an AcroForm tree") + widgets = [ + annotation + for annotation in reopened.pages[0].get("/Annots", []) + if annotation.get_object().get("/Subtype") == "/Widget" + ] + if widgets: + raise ValueError("derived demo PDF must not contain Widget annotations") + if float(reopened.pages[0].mediabox.width) != PAGE_WIDTH or float(reopened.pages[0].mediabox.height) != PAGE_HEIGHT: + raise ValueError("derived demo PDF must remain exactly 612x792 points") + + +def build(*, check: bool) -> str: + payload = _build_payload() + _validate_output(payload) + digest = _sha256(payload) + if digest != DERIVED_SHA256: + raise ValueError( + f"derived demo SHA-256 mismatch: expected {DERIVED_SHA256}, found {digest}" + ) + + if check: + _read_frozen( + OUTPUT, + expected_sha256=DERIVED_SHA256, + label="committed derived demo", + ) + if OUTPUT.read_bytes() != payload: + raise ValueError("committed derived demo bytes are stale") + else: + _atomic_write(OUTPUT, payload) + return digest + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--check", + action="store_true", + help="Verify the deterministic derived PDF byte-for-byte without writing.", + ) + args = parser.parse_args(argv) + try: + digest = build(check=args.check) + except (OSError, RuntimeError, ValueError) as error: + print(f"public-form build failed: {error}", file=sys.stderr) + return 1 + action = "Verified" if args.check else "Built" + print(f"{action} deterministic CMS public-form demo: {digest}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/demos/prior_authorization/cache/18bb2e0c4419c0c2acb002acb0b4857efacc7e96f37d15decebfe06d3394d530-extraction-extract-335056f54e95ba9cd7e96cd888db202cfb359998701790e7c15b155719d8c579.json b/demos/prior_authorization/cache/18bb2e0c4419c0c2acb002acb0b4857efacc7e96f37d15decebfe06d3394d530-extraction-extract-335056f54e95ba9cd7e96cd888db202cfb359998701790e7c15b155719d8c579.json new file mode 100644 index 0000000..242f187 --- /dev/null +++ b/demos/prior_authorization/cache/18bb2e0c4419c0c2acb002acb0b4857efacc7e96f37d15decebfe06d3394d530-extraction-extract-335056f54e95ba9cd7e96cd888db202cfb359998701790e7c15b155719d8c579.json @@ -0,0 +1,404 @@ +{ + "output": { + "data": { + "patient": { + "address": "742 Demo Street, Austin, TX 78745", + "date_of_birth": "04/18/1987", + "full_name": "Elena Brooks", + "mbi": "DEMO-MBI-771204" + }, + "prescriber": { + "name": "Priya Raman, MD", + "npi": "1234567890", + "phone": "(555) 470-2200" + }, + "request": { + "mash_with_fibrosis": "No", + "moderate_to_severe_osa": "No", + "part_d_acknowledgement": "Not acknowledged", + "requested_drug": "Wegovy® InjectionInjection" + } + }, + "metadata": { + "patient": { + "address": { + "bbox": { + "height": 22, + "width": 355, + "x": 258, + "y": 741 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 27.052978515625, + "width": 483, + "x": 130, + "y": 736 + }, + "block_id": "b36", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "date_of_birth": { + "bbox": { + "height": 19, + "width": 119, + "x": 361, + "y": 702 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 27, + "width": 350, + "x": 130, + "y": 694 + }, + "block_id": "b7", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "full_name": { + "bbox": { + "height": 22, + "width": 147, + "x": 305, + "y": 586 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 22.3251953125, + "width": 322.04144287109375, + "x": 129.9585418701172, + "y": 586 + }, + "block_id": "b5", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "mbi": { + "bbox": { + "height": 19, + "width": 208, + "x": 427, + "y": 661 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 26.67767333984375, + "width": 505.05267333984375, + "x": 129.94732666015625, + "y": 653.3223266601562 + }, + "block_id": "b6", + "pageIndex": 0, + "pageNumber": 1 + } + ] + } + }, + "prescriber": { + "name": { + "bbox": { + "height": 25, + "width": 192, + "x": 1080, + "y": 588 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 26.34765625, + "width": 395, + "x": 877, + "y": 586.65234375 + }, + "block_id": "b14", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "npi": { + "bbox": { + "height": 19, + "width": 130, + "x": 944, + "y": 750 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 28, + "width": 419.7984619140625, + "x": 877, + "y": 741 + }, + "block_id": "b37", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "phone": { + "bbox": { + "height": 22, + "width": 161, + "x": 966, + "y": 672 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 28.865478515625, + "width": 252.0611572265625, + "x": 877, + "y": 666 + }, + "block_id": "b15", + "pageIndex": 0, + "pageNumber": 1 + } + ] + } + }, + "request": { + "mash_with_fibrosis": { + "bbox": { + "height": 22, + "width": 33, + "x": 936, + "y": 1830 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match_multiblock", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 60, + "width": 1345.88134765625, + "x": 154.11862182617188, + "y": 1722 + }, + "block_id": "b30", + "pageIndex": 0, + "pageNumber": 1 + }, + { + "bbox": { + "height": 28.6666259765625, + "width": 71.2203369140625, + "x": 897.7796630859375, + "y": 1827.0257568359375 + }, + "block_id": "b32", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "moderate_to_severe_osa": { + "bbox": { + "height": 22, + "width": 33, + "x": 936, + "y": 1627 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match_multiblock", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 28.1552734375, + "width": 933.2867431640625, + "x": 155, + "y": 1549.7626953125 + }, + "block_id": "b27", + "pageIndex": 0, + "pageNumber": 1 + }, + { + "bbox": { + "height": 28.0264892578125, + "width": 71.54876708984375, + "x": 897.4512329101562, + "y": 1623.81787109375 + }, + "block_id": "b29", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "part_d_acknowledgement": { + "bbox": { + "height": 27, + "width": 219, + "x": 944, + "y": 1458 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match_multiblock", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 125.712158203125, + "width": 1336.0391845703125, + "x": 154.76771545410156, + "y": 1294.5450439453125 + }, + "block_id": "b24", + "pageIndex": 0, + "pageNumber": 1 + }, + { + "bbox": { + "height": 28.9830322265625, + "width": 756.853515625, + "x": 154.83094787597656, + "y": 1418.0169677734375 + }, + "block_id": "b25", + "pageIndex": 0, + "pageNumber": 1 + }, + { + "bbox": { + "height": 35.659423828125, + "width": 923.8389892578125, + "x": 241, + "y": 1452.340576171875 + }, + "block_id": "b26", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "requested_drug": { + "bbox": { + "height": 33, + "width": 213, + "x": 130, + "y": 1002 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 33, + "width": 218.35037231445312, + "x": 127.6062240600586, + "y": 1002 + }, + "block_id": "b12", + "pageIndex": 0, + "pageNumber": 1 + } + ] + } + } + }, + "pages": [ + { + "height": 2200, + "page": 1, + "width": 1700 + } + ] + }, + "reconstructed": false, + "requestId": "GM0DoXo4axpduywAADaR", + "status": 200 +} diff --git a/demos/prior_authorization/cache/18bb2e0c4419c0c2acb002acb0b4857efacc7e96f37d15decebfe06d3394d530-extraction-extract-335056f54e95ba9cd7e96cd888db202cfb359998701790e7c15b155719d8c579.receipt.json b/demos/prior_authorization/cache/18bb2e0c4419c0c2acb002acb0b4857efacc7e96f37d15decebfe06d3394d530-extraction-extract-335056f54e95ba9cd7e96cd888db202cfb359998701790e7c15b155719d8c579.receipt.json new file mode 100644 index 0000000..bfb7c02 --- /dev/null +++ b/demos/prior_authorization/cache/18bb2e0c4419c0c2acb002acb0b4857efacc7e96f37d15decebfe06d3394d530-extraction-extract-335056f54e95ba9cd7e96cd888db202cfb359998701790e7c15b155719d8c579.receipt.json @@ -0,0 +1,6 @@ +{ + "projectedResponseSha256": "2d02fe3111c5c7aa9952f71bc92cf416bbad386362253fe675d277766567521a", + "receiptVersion": 1, + "requestId": "GM0DoXo4axpduywAADaR", + "sourceStatus": "live-refresh" +} diff --git a/demos/prior_authorization/cache/8b71d8dfe70b98f5d35b1e3709fc6eb0891daf3108c705676341f4c22f936354-extraction-extract-1f70709d4b47f8041baa824b5664ab140725273ae45199fe9c8dd06b36e178b4.json b/demos/prior_authorization/cache/8b71d8dfe70b98f5d35b1e3709fc6eb0891daf3108c705676341f4c22f936354-extraction-extract-1f70709d4b47f8041baa824b5664ab140725273ae45199fe9c8dd06b36e178b4.json new file mode 100644 index 0000000..8702d2c --- /dev/null +++ b/demos/prior_authorization/cache/8b71d8dfe70b98f5d35b1e3709fc6eb0891daf3108c705676341f4c22f936354-extraction-extract-1f70709d4b47f8041baa824b5664ab140725273ae45199fe9c8dd06b36e178b4.json @@ -0,0 +1,360 @@ +{ + "output": { + "data": { + "ordering_provider": { + "facility": "Example Regional Imaging Center", + "name": "Priya Raman, MD" + }, + "patient": { + "date_of_birth": "04/18/1987", + "full_name": "Elena Brooks", + "member_id": "DEMO-MBR-771204" + }, + "request_id": "PA-2026-0904", + "service": { + "description": "MRI lumbar spine without contrast", + "diagnosis_code": "M54.16", + "procedure_code": "72148", + "requested_date": "09/04/2026", + "urgency": "Standard" + } + }, + "metadata": { + "ordering_provider": { + "facility": { + "bbox": { + "height": 36, + "width": 508, + "x": 152, + "y": 1636 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 121.5677490234375, + "width": 541.71484375, + "x": 143.91555786132812, + "y": 1563.8052978515625 + }, + "block_id": "c10", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "name": { + "bbox": { + "height": 33, + "width": 258, + "x": 908, + "y": 1411 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 133.738525390625, + "width": 302.8409423828125, + "x": 887.1649169921875, + "y": 1333.83544921875 + }, + "block_id": "c9", + "pageIndex": 0, + "pageNumber": 1 + } + ] + } + }, + "patient": { + "date_of_birth": { + "bbox": { + "height": 27, + "width": 166, + "x": 905, + "y": 727 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 112.32342529296875, + "width": 318.14892578125, + "x": 882.349365234375, + "y": 656.6233520507812 + }, + "block_id": "c3", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "full_name": { + "bbox": { + "height": 30, + "width": 194, + "x": 908, + "y": 497 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 114.26654052734375, + "width": 249.502685546875, + "x": 892.5068359375, + "y": 434.53619384765625 + }, + "block_id": "c1", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "member_id": { + "bbox": { + "height": 27, + "width": 305, + "x": 152, + "y": 727 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 110.2230224609375, + "width": 325.1792907714844, + "x": 140.72415161132812, + "y": 659.0892333984375 + }, + "block_id": "c2", + "pageIndex": 0, + "pageNumber": 1 + } + ] + } + }, + "request_id": { + "bbox": { + "height": 27, + "width": 213, + "x": 152, + "y": 499 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 114.07315063476562, + "width": 228.39222717285156, + "x": 140.7161102294922, + "y": 438.6919860839844 + }, + "block_id": "c0", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "service": { + "description": { + "bbox": { + "height": 36, + "width": 503, + "x": 152, + "y": 952 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 117.3704833984375, + "width": 530.685302734375, + "x": 142.96115112304688, + "y": 880.19677734375 + }, + "block_id": "c4", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "diagnosis_code": { + "bbox": { + "height": 27, + "width": 108, + "x": 908, + "y": 955 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 108.879150390625, + "width": 240.497802734375, + "x": 883.07958984375, + "y": 880.0494384765625 + }, + "block_id": "c5", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "procedure_code": { + "bbox": { + "height": 27, + "width": 91, + "x": 150, + "y": 1183 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 125.56201171875, + "width": 239.44369506835938, + "x": 138.72900390625, + "y": 1107.876220703125 + }, + "block_id": "c6", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "requested_date": { + "bbox": { + "height": 27, + "width": 166, + "x": 150, + "y": 1411 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 142.850830078125, + "width": 329.1785888671875, + "x": 140.31956481933594, + "y": 1332.922607421875 + }, + "block_id": "c8", + "pageIndex": 0, + "pageNumber": 1 + } + ] + }, + "urgency": { + "bbox": { + "height": 30, + "width": 136, + "x": 905, + "y": 1180 + }, + "confidence": 0.95, + "confidenceComponents": { + "groundingScore": 0.95, + "source": "no-logprobs" + }, + "match": "id_match", + "pageIndex": 0, + "pageNumber": 1, + "source_bboxes": [ + { + "bbox": { + "height": 149.9942626953125, + "width": 169.3035888671875, + "x": 892.998291015625, + "y": 1104.669189453125 + }, + "block_id": "c7", + "pageIndex": 0, + "pageNumber": 1 + } + ] + } + } + }, + "pages": [ + { + "height": 2200, + "page": 1, + "width": 1700 + } + ] + }, + "reconstructed": false, + "requestId": "GMxyKfuz8lVFQGEAG1PB", + "status": 200 +} diff --git a/demos/prior_authorization/cache/8b71d8dfe70b98f5d35b1e3709fc6eb0891daf3108c705676341f4c22f936354-extraction-extract-1f70709d4b47f8041baa824b5664ab140725273ae45199fe9c8dd06b36e178b4.receipt.json b/demos/prior_authorization/cache/8b71d8dfe70b98f5d35b1e3709fc6eb0891daf3108c705676341f4c22f936354-extraction-extract-1f70709d4b47f8041baa824b5664ab140725273ae45199fe9c8dd06b36e178b4.receipt.json new file mode 100644 index 0000000..e2ee1f3 --- /dev/null +++ b/demos/prior_authorization/cache/8b71d8dfe70b98f5d35b1e3709fc6eb0891daf3108c705676341f4c22f936354-extraction-extract-1f70709d4b47f8041baa824b5664ab140725273ae45199fe9c8dd06b36e178b4.receipt.json @@ -0,0 +1,6 @@ +{ + "projectedResponseSha256": "fcb222e7d473ec743c4dccda0954423d24a80c20e511e9faaf894d47341dc722", + "receiptVersion": 1, + "requestId": "GMxyKfuz8lVFQGEAG1PB", + "sourceStatus": "live-refresh" +} diff --git a/demos/prior_authorization/check_expected.py b/demos/prior_authorization/check_expected.py new file mode 100644 index 0000000..8c48f8a --- /dev/null +++ b/demos/prior_authorization/check_expected.py @@ -0,0 +1,14 @@ +"""Check prior-authorization intake evidence against the source oracle.""" + +from __future__ import annotations + +try: + from .generate_demo import CONFIG +except ImportError: + from generate_demo import CONFIG + +from common.lighthouse_package import checker_main + + +if __name__ == "__main__": + raise SystemExit(checker_main(CONFIG)) diff --git a/demos/prior_authorization/data/legacy-synthetic-prior-authorization.pdf b/demos/prior_authorization/data/legacy-synthetic-prior-authorization.pdf new file mode 100644 index 0000000..6a2fcf6 Binary files /dev/null and b/demos/prior_authorization/data/legacy-synthetic-prior-authorization.pdf differ diff --git a/demos/prior_authorization/data/prior-authorization.pdf b/demos/prior_authorization/data/prior-authorization.pdf new file mode 100644 index 0000000..1ff8ec7 Binary files /dev/null and b/demos/prior_authorization/data/prior-authorization.pdf differ diff --git a/demos/prior_authorization/docs.json b/demos/prior_authorization/docs.json new file mode 100644 index 0000000..bd3a380 --- /dev/null +++ b/demos/prior_authorization/docs.json @@ -0,0 +1,84 @@ +[ + { + "id": "prior_authorization", + "name": "CMS GLP-1 Bridge Prior Authorization Request Form", + "file": "data/prior-authorization.pdf", + "mode": "agentic", + "schema": { + "type": "object", + "properties": { + "patient": { + "type": "object", + "description": "Patient details printed in the patient section of the form.", + "properties": { + "full_name": { + "type": "string", + "description": "The patient's full name from the field labeled 'Patient name'." + }, + "mbi": { + "type": "string", + "description": "The Medicare beneficiary MBI exactly as printed, preserving letters, digits, and separators." + }, + "date_of_birth": { + "type": "string", + "description": "The patient date of birth exactly as printed." + }, + "address": { + "type": "string", + "description": "The complete patient address exactly as printed in the address field." + } + }, + "required": ["full_name", "mbi", "date_of_birth", "address"] + }, + "prescriber": { + "type": "object", + "description": "Prescriber details printed in the prescriber section of the form.", + "properties": { + "name": { + "type": "string", + "description": "The prescriber's name and credentials exactly as printed." + }, + "phone": { + "type": "string", + "description": "The prescriber phone number exactly as printed." + }, + "npi": { + "type": "string", + "description": "The prescriber NPI exactly as printed, returned as text." + } + }, + "required": ["name", "phone", "npi"] + }, + "request": { + "type": "object", + "description": "The selected drug and the answers marked in questions 1 through 3.", + "properties": { + "requested_drug": { + "type": "string", + "description": "The exact requested-drug option marked under 'Requested drug (select one)'." + }, + "part_d_acknowledgement": { + "type": "string", + "description": "Return 'Acknowledged' when that option is marked in question 1; otherwise return 'Not acknowledged'." + }, + "moderate_to_severe_osa": { + "type": "string", + "description": "Return the exact marked 'Yes' or 'No' answer to question 2." + }, + "mash_with_fibrosis": { + "type": "string", + "description": "Return the exact marked 'Yes' or 'No' answer to question 3." + } + }, + "required": [ + "requested_drug", + "part_d_acknowledgement", + "moderate_to_severe_osa", + "mash_with_fibrosis" + ] + } + }, + "required": ["patient", "prescriber", "request"] + } + } +] diff --git a/demos/prior_authorization/expected.json b/demos/prior_authorization/expected.json new file mode 100644 index 0000000..42ff71b --- /dev/null +++ b/demos/prior_authorization/expected.json @@ -0,0 +1,19 @@ +{ + "patient": { + "full_name": "Elena Brooks", + "mbi": "DEMO-MBI-771204", + "date_of_birth": "04/18/1987", + "address": "742 Demo Street, Austin, TX 78745" + }, + "prescriber": { + "name": "Priya Raman, MD", + "phone": "(555) 470-2200", + "npi": "1234567890" + }, + "request": { + "requested_drug": "Wegovy Injection", + "part_d_acknowledgement": "Acknowledged", + "moderate_to_severe_osa": "No", + "mash_with_fibrosis": "No" + } +} diff --git a/demos/prior_authorization/fixture.json b/demos/prior_authorization/fixture.json new file mode 100644 index 0000000..a12d9e0 --- /dev/null +++ b/demos/prior_authorization/fixture.json @@ -0,0 +1,120 @@ +{ + "version": 2, + "slug": "prior_authorization", + "sourceStatus": "public-form-demo", + "document": { + "filename": "data/prior-authorization.pdf", + "title": "CMS GLP-1 Bridge Prior Authorization Request Form", + "subtitle": "Authentic public form - privacy-safe demo values", + "width": 612, + "height": 792 + }, + "provenance": { + "publisher": "Centers for Medicare & Medicaid Services", + "officialFormName": "Medicare GLP-1 Bridge Prior Authorization Request Form", + "canonicalSourceUrl": "https://www.cms.gov/glp-1-bridge.pdf", + "originalSha256": "c223dc0f6acaf1d7b7e345bdf968ba2373ce94b39994b006a1e9915a07768fa0", + "sourceSha256": "18bb2e0c4419c0c2acb002acb0b4857efacc7e96f37d15decebfe06d3394d530" + }, + "fields": [ + { + "path": ["patient", "full_name"], + "label": "Patient full name", + "value": "Elena Brooks", + "source": { + "pageIndex": 0, + "bbox": {"x": 108, "y": 209, "width": 58, "height": 12} + } + }, + { + "path": ["patient", "mbi"], + "label": "Medicare beneficiary MBI", + "value": "DEMO-MBI-771204", + "source": { + "pageIndex": 0, + "bbox": {"x": 152, "y": 236, "width": 79, "height": 12} + } + }, + { + "path": ["patient", "date_of_birth"], + "label": "Patient date of birth", + "value": "04/18/1987", + "source": { + "pageIndex": 0, + "bbox": {"x": 129, "y": 251, "width": 47, "height": 12} + } + }, + { + "path": ["patient", "address"], + "label": "Patient address", + "value": "742 Demo Street, Austin, TX 78745", + "source": { + "pageIndex": 0, + "bbox": {"x": 91, "y": 266, "width": 132, "height": 11} + } + }, + { + "path": ["prescriber", "name"], + "label": "Prescriber name", + "value": "Priya Raman, MD", + "source": { + "pageIndex": 0, + "bbox": {"x": 387, "y": 209, "width": 74, "height": 12} + } + }, + { + "path": ["prescriber", "phone"], + "label": "Prescriber phone", + "value": "(555) 470-2200", + "source": { + "pageIndex": 0, + "bbox": {"x": 347, "y": 240, "width": 63, "height": 12} + } + }, + { + "path": ["prescriber", "npi"], + "label": "Prescriber NPI", + "value": "1234567890", + "source": { + "pageIndex": 0, + "bbox": {"x": 338, "y": 268, "width": 52, "height": 12} + } + }, + { + "path": ["request", "requested_drug"], + "label": "Requested drug", + "value": "Wegovy Injection", + "source": { + "pageIndex": 0, + "bbox": {"x": 45, "y": 357, "width": 85, "height": 18} + } + }, + { + "path": ["request", "part_d_acknowledgement"], + "label": "Part D acknowledgement", + "value": "Acknowledged", + "source": { + "pageIndex": 0, + "bbox": {"x": 68, "y": 516, "width": 83, "height": 18} + } + }, + { + "path": ["request", "moderate_to_severe_osa"], + "label": "Moderate to severe OSA", + "value": "No", + "source": { + "pageIndex": 0, + "bbox": {"x": 322, "y": 577, "width": 38, "height": 18} + } + }, + { + "path": ["request", "mash_with_fibrosis"], + "label": "MASH with fibrosis", + "value": "No", + "source": { + "pageIndex": 0, + "bbox": {"x": 322, "y": 650, "width": 38, "height": 18} + } + } + ] +} diff --git a/demos/prior_authorization/generate_demo.py b/demos/prior_authorization/generate_demo.py new file mode 100644 index 0000000..99772f1 --- /dev/null +++ b/demos/prior_authorization/generate_demo.py @@ -0,0 +1,39 @@ +"""Generate the prior-authorization intake lighthouse package.""" + +from __future__ import annotations + +import sys +from pathlib import Path + + +REPO_ROOT = Path(__file__).resolve().parents[2] +if str(REPO_ROOT) not in sys.path: + sys.path.insert(0, str(REPO_ROOT)) + +from common.lighthouse_package import PackageConfig, generator_main + + +CONFIG = PackageConfig( + demo_dir=Path(__file__).resolve().parent, + slug="prior_authorization", + page_title="CMS prior-authorization intake, field by field", + provisional_summary=( + "An offline rehearsal of an authentic CMS public form with privacy-safe " + "demo values and independently reviewed source regions. No API call was " + "made, and this is not release evidence." + ), + live_summary=( + "A receipt-bound live Extract response compared with the independent " + "public-form oracle. Independent evidence review remains required." + ), + reviewed_summary=( + "A receipt-bound live Extract response with a recorded independent " + "field-by-field audit against the visible authentic public form. The " + "package retains every exact match and mismatch; the page shows the " + "API's primary returned source region for each field." + ), +) + + +if __name__ == "__main__": + raise SystemExit(generator_main(CONFIG)) diff --git a/demos/prior_authorization/output/comparison.json b/demos/prior_authorization/output/comparison.json new file mode 100644 index 0000000..46cc573 --- /dev/null +++ b/demos/prior_authorization/output/comparison.json @@ -0,0 +1,25 @@ +{ + "artifactVersion": 1, + "comparison": { + "exitCode": 1, + "expectedLeaves": 11, + "groundedLeaves": 11, + "issues": [ + { + "code": "WRONG", + "message": "expected 'Acknowledged', got 'Not acknowledged'", + "path": "$.request.part_d_acknowledgement" + }, + { + "code": "WRONG", + "message": "expected 'Wegovy Injection', got 'Wegovy® InjectionInjection'", + "path": "$.request.requested_drug" + } + ], + "matchedLeaves": 9, + "passed": false + }, + "evidenceKind": "live", + "evidenceLabel": "REVIEWED LIVE API RESPONSE", + "reviewed": true +} diff --git a/demos/prior_authorization/output/index.html b/demos/prior_authorization/output/index.html new file mode 100644 index 0000000..28ac2f0 --- /dev/null +++ b/demos/prior_authorization/output/index.html @@ -0,0 +1,931 @@ + + + + + + + CMS prior-authorization intake, field by field + + + +
+
+ Nutrient + Data Extraction API / source proof +
+
+
+

Reviewed evidence / authentic public form

+

CMS prior-authorization intake, field by field

+

A receipt-bound live Extract response with a recorded independent field-by-field audit against the visible authentic public form. The package retains every exact match and mismatch; the page shows the API's primary returned source region for each field.

+
+ +
+ +
+
+
+ CMS GLP-1 Bridge Prior Authorization Request Form + Authentic public form · privacy-safe demo values · page 1 +
+
+ Authentic public form with privacy-safe demo values: CMS GLP-1 Bridge Prior Authorization Request Form + +
+
+ + +
+ +

Correctness is determined by the independent source oracle for this authentic public form with privacy-safe demo values. Recognition signals and bounding boxes are supporting evidence, not a substitute for comparison.

+
+ + + + diff --git a/demos/prior_authorization/output/playwright/live-desktop.png b/demos/prior_authorization/output/playwright/live-desktop.png new file mode 100644 index 0000000..c8600ab Binary files /dev/null and b/demos/prior_authorization/output/playwright/live-desktop.png differ diff --git a/demos/prior_authorization/output/playwright/live-mobile-scrolled.png b/demos/prior_authorization/output/playwright/live-mobile-scrolled.png new file mode 100644 index 0000000..360033e Binary files /dev/null and b/demos/prior_authorization/output/playwright/live-mobile-scrolled.png differ diff --git a/demos/prior_authorization/output/playwright/live-mobile.png b/demos/prior_authorization/output/playwright/live-mobile.png new file mode 100644 index 0000000..5a84807 Binary files /dev/null and b/demos/prior_authorization/output/playwright/live-mobile.png differ diff --git a/demos/prior_authorization/output/source-page.png b/demos/prior_authorization/output/source-page.png new file mode 100644 index 0000000..3e1eea1 Binary files /dev/null and b/demos/prior_authorization/output/source-page.png differ diff --git a/demos/prior_authorization/provisional/evidence.json b/demos/prior_authorization/provisional/evidence.json new file mode 100644 index 0000000..649800e --- /dev/null +++ b/demos/prior_authorization/provisional/evidence.json @@ -0,0 +1,142 @@ +{ + "response": { + "output": { + "data": { + "patient": { + "address": "742 Demo Street, Austin, TX 78745", + "date_of_birth": "04/18/1987", + "full_name": "Elena Brooks", + "mbi": "DEMO-MBI-771204" + }, + "prescriber": { + "name": "Priya Raman, MD", + "npi": "1234567890", + "phone": "(555) 470-2200" + }, + "request": { + "mash_with_fibrosis": "No", + "moderate_to_severe_osa": "No", + "part_d_acknowledgement": "Acknowledged", + "requested_drug": "Wegovy Injection" + } + }, + "metadata": { + "patient": { + "address": { + "bbox": { + "height": 11.0, + "width": 132.0, + "x": 91.0, + "y": 266.0 + }, + "pageIndex": 0 + }, + "date_of_birth": { + "bbox": { + "height": 12.0, + "width": 47.0, + "x": 129.0, + "y": 251.0 + }, + "pageIndex": 0 + }, + "full_name": { + "bbox": { + "height": 12.0, + "width": 58.0, + "x": 108.0, + "y": 209.0 + }, + "pageIndex": 0 + }, + "mbi": { + "bbox": { + "height": 12.0, + "width": 79.0, + "x": 152.0, + "y": 236.0 + }, + "pageIndex": 0 + } + }, + "prescriber": { + "name": { + "bbox": { + "height": 12.0, + "width": 74.0, + "x": 387.0, + "y": 209.0 + }, + "pageIndex": 0 + }, + "npi": { + "bbox": { + "height": 12.0, + "width": 52.0, + "x": 338.0, + "y": 268.0 + }, + "pageIndex": 0 + }, + "phone": { + "bbox": { + "height": 12.0, + "width": 63.0, + "x": 347.0, + "y": 240.0 + }, + "pageIndex": 0 + } + }, + "request": { + "mash_with_fibrosis": { + "bbox": { + "height": 18.0, + "width": 38.0, + "x": 322.0, + "y": 650.0 + }, + "pageIndex": 0 + }, + "moderate_to_severe_osa": { + "bbox": { + "height": 18.0, + "width": 38.0, + "x": 322.0, + "y": 577.0 + }, + "pageIndex": 0 + }, + "part_d_acknowledgement": { + "bbox": { + "height": 18.0, + "width": 83.0, + "x": 68.0, + "y": 516.0 + }, + "pageIndex": 0 + }, + "requested_drug": { + "bbox": { + "height": 18.0, + "width": 85.0, + "x": 45.0, + "y": 357.0 + }, + "pageIndex": 0 + } + } + }, + "pages": [ + { + "height": 792.0, + "width": 612.0 + } + ] + }, + "reconstructed": false, + "requestId": "provisional-layout-prior_authorization-d3a44af77af3", + "status": 200 + }, + "sourceStatus": "provisional-layout" +} diff --git a/demos/prior_authorization/source/cms-glp-1-bridge-original.pdf b/demos/prior_authorization/source/cms-glp-1-bridge-original.pdf new file mode 100644 index 0000000..26b3c93 Binary files /dev/null and b/demos/prior_authorization/source/cms-glp-1-bridge-original.pdf differ diff --git a/demos/seed_manifest.json b/demos/seed_manifest.json index a5a53b6..af265a9 100644 --- a/demos/seed_manifest.json +++ b/demos/seed_manifest.json @@ -348,7 +348,7 @@ "demo": "parse_citations", "source_file": "demos/parse_citations/data/appraisal_report_parse_results.json", "pdf": "demos/parse_citations/data/appraisal_report.pdf", - "endpoint": "https://api.nutrient.io/parse", + "endpoint": "https://api.nutrient.io/extraction/parse", "replay_config": { "mode": "agentic", "outputFormat": { @@ -360,5 +360,98 @@ } }, "cache_key": "829ebf31fe9e6a24aaf2bce403220aec367fdc883ff4f335f0b6b49749b32ae2-extraction-parse-8972b5a5f8b0d4fd21a998424ebcd83289b3b06e188cac9916cc1b1c9b9d813e" + }, + { + "demo": "mortgage_verification", + "inventory_kind": "reviewed_live_authentic_form", + "source_file": "demos/mortgage_verification/cache/2eab5c8c1c843ef5f0f0bef9e361f818369a6e5e7652f00e6e614d381a36018e-extraction-extract-c916fe75b45defb3f9078a09545733ea7e8ae8d20310dfb490ecbeb2bff6c2aa.json", + "pdf": "demos/mortgage_verification/data/mortgage-verification.pdf", + "endpoint": "https://api.nutrient.io/extraction/extract", + "replay_config_source": "demos/mortgage_verification/docs.json", + "cache_key": "2eab5c8c1c843ef5f0f0bef9e361f818369a6e5e7652f00e6e614d381a36018e-extraction-extract-c916fe75b45defb3f9078a09545733ea7e8ae8d20310dfb490ecbeb2bff6c2aa", + "receipt_file": "demos/mortgage_verification/cache/2eab5c8c1c843ef5f0f0bef9e361f818369a6e5e7652f00e6e614d381a36018e-extraction-extract-c916fe75b45defb3f9078a09545733ea7e8ae8d20310dfb490ecbeb2bff6c2aa.receipt.json", + "comparison_file": "demos/mortgage_verification/output/comparison.json", + "reviewed_output_file": "demos/mortgage_verification/output/index.html", + "source_page_file": "demos/mortgage_verification/output/source-page.png", + "sha256": { + "pdf": "2eab5c8c1c843ef5f0f0bef9e361f818369a6e5e7652f00e6e614d381a36018e", + "response_cache": "2c20be96b8496f675ed8f0a70c77226afbd7008a59cdb47eea8a000f7b6c04e8", + "receipt": "c931efb663f093748713de0cd4b51d497dbe808443e6a6afca4143210048facb", + "comparison": "afb217cc553e4507e3a8dd1130e9ed51e0605f5f4fb2c066049f956ea81c2936", + "reviewed_output": "06c747b2f58a069dc109eebc578a4afc24326d3544aac69a110c431e0f99bca3", + "source_page": "43f0b6d63e9f42cd8efc49ab379dd8fe63984107c2cc8152d1347d4df3b77975" + }, + "legacy_evidence": { + "pdf": "demos/mortgage_verification/data/legacy-synthetic-mortgage-verification.pdf", + "cache_key": "15f9be3fc3c78a78bb5a67e8f2b8fa0d09383626b0c2600676e2a3f95d054e77-extraction-extract-b35c962edca85f56a9f2707e49646779b4db844e5c22ad71f6b29b445118de59", + "receipt_file": "demos/mortgage_verification/cache/15f9be3fc3c78a78bb5a67e8f2b8fa0d09383626b0c2600676e2a3f95d054e77-extraction-extract-b35c962edca85f56a9f2707e49646779b4db844e5c22ad71f6b29b445118de59.receipt.json", + "sha256": { + "pdf": "15f9be3fc3c78a78bb5a67e8f2b8fa0d09383626b0c2600676e2a3f95d054e77", + "response_cache": "a1c31e6f3b8b2f9647107926687d1396ced32dbe47d47c378c9c8894e109f1a1", + "receipt": "4d08edf9538d4dc5d8cedfce5edf15dd4deb7e7c343440044400158597dd7d1a" + } + } + }, + { + "demo": "insurance_claim_intake", + "inventory_kind": "reviewed_live_authentic_form", + "source_file": "demos/insurance_claim_intake/cache/82bd017e04267eca150ef8ccb3f2471a5b445680d882f8375a174391c47fbbeb-extraction-extract-5270e4d2c6eb39ec7ff32e01fc0e8a6012e6a031be8a2532f16b9ff3ed397207.json", + "pdf": "demos/insurance_claim_intake/data/insurance-claim-intake.pdf", + "endpoint": "https://api.nutrient.io/extraction/extract", + "replay_config_source": "demos/insurance_claim_intake/docs.json", + "cache_key": "82bd017e04267eca150ef8ccb3f2471a5b445680d882f8375a174391c47fbbeb-extraction-extract-5270e4d2c6eb39ec7ff32e01fc0e8a6012e6a031be8a2532f16b9ff3ed397207", + "receipt_file": "demos/insurance_claim_intake/cache/82bd017e04267eca150ef8ccb3f2471a5b445680d882f8375a174391c47fbbeb-extraction-extract-5270e4d2c6eb39ec7ff32e01fc0e8a6012e6a031be8a2532f16b9ff3ed397207.receipt.json", + "comparison_file": "demos/insurance_claim_intake/output/comparison.json", + "reviewed_output_file": "demos/insurance_claim_intake/output/index.html", + "source_page_file": "demos/insurance_claim_intake/output/source-page.png", + "sha256": { + "pdf": "82bd017e04267eca150ef8ccb3f2471a5b445680d882f8375a174391c47fbbeb", + "response_cache": "72170c3c25bfaea102ef747097ee94d27a11179a12564c6d19d940923ee0424a", + "receipt": "254617154a5b3f34984ce4e094403dc2366cf3fd01f8e6d8e4696f961171029c", + "comparison": "35f05513552be18c8b792f1edafe6199f59a7efe883271b87426e26571da6db2", + "reviewed_output": "2fe6ca1bc12be0ff4a5fb46f7ec7728a12986bc17cf7a3d898d4d2664c5f7a44", + "source_page": "d9b1eb577f262e5da8237146061f4b77613c3b2ff01c87c9f17d5cdfe2970bc5" + }, + "legacy_evidence": { + "pdf": "demos/insurance_claim_intake/data/legacy-synthetic-insurance-claim-intake.pdf", + "cache_key": "acb9970d933b9b1af6d9b8c08c3843006f09e8d574f07ea0b29cf51c27e2ca33-extraction-extract-ab82c0e620306ef4a76f60768e4d990f80af692bc65304953f8499474f5921b0", + "receipt_file": "demos/insurance_claim_intake/cache/acb9970d933b9b1af6d9b8c08c3843006f09e8d574f07ea0b29cf51c27e2ca33-extraction-extract-ab82c0e620306ef4a76f60768e4d990f80af692bc65304953f8499474f5921b0.receipt.json", + "sha256": { + "pdf": "acb9970d933b9b1af6d9b8c08c3843006f09e8d574f07ea0b29cf51c27e2ca33", + "response_cache": "57dff011062c8cac680176e371b644a1ac97a854a72b26c80627c8076b9c1a30", + "receipt": "0ffe741675fadf513682a3d7e1ddcd5001d1cf3801164c708172f8ab270eed1c" + } + } + }, + { + "demo": "prior_authorization", + "inventory_kind": "reviewed_live_authentic_form", + "source_file": "demos/prior_authorization/cache/18bb2e0c4419c0c2acb002acb0b4857efacc7e96f37d15decebfe06d3394d530-extraction-extract-335056f54e95ba9cd7e96cd888db202cfb359998701790e7c15b155719d8c579.json", + "pdf": "demos/prior_authorization/data/prior-authorization.pdf", + "endpoint": "https://api.nutrient.io/extraction/extract", + "replay_config_source": "demos/prior_authorization/docs.json", + "cache_key": "18bb2e0c4419c0c2acb002acb0b4857efacc7e96f37d15decebfe06d3394d530-extraction-extract-335056f54e95ba9cd7e96cd888db202cfb359998701790e7c15b155719d8c579", + "receipt_file": "demos/prior_authorization/cache/18bb2e0c4419c0c2acb002acb0b4857efacc7e96f37d15decebfe06d3394d530-extraction-extract-335056f54e95ba9cd7e96cd888db202cfb359998701790e7c15b155719d8c579.receipt.json", + "comparison_file": "demos/prior_authorization/output/comparison.json", + "reviewed_output_file": "demos/prior_authorization/output/index.html", + "source_page_file": "demos/prior_authorization/output/source-page.png", + "sha256": { + "pdf": "18bb2e0c4419c0c2acb002acb0b4857efacc7e96f37d15decebfe06d3394d530", + "response_cache": "407ee89890604ca46ff356ec72a20968f504ad2f6015998719d49edd4f736805", + "receipt": "c63cb5d4b14dd5460af7ae321f2357aaecba600faefee3427141abdaf9b2ce59", + "comparison": "c974f57939385f4e0cd935aa5ec480920baa8245b593a3f0ff5132e4fa101eb9", + "reviewed_output": "c947213165b41a517551eda77dc2f1ce58ad63d43a92f51be6d737ea36a2b027", + "source_page": "ce4494e56f05d93575038187d950432e88d3574a2dc765d37b06a230183cdade" + }, + "legacy_evidence": { + "pdf": "demos/prior_authorization/data/legacy-synthetic-prior-authorization.pdf", + "cache_key": "8b71d8dfe70b98f5d35b1e3709fc6eb0891daf3108c705676341f4c22f936354-extraction-extract-1f70709d4b47f8041baa824b5664ab140725273ae45199fe9c8dd06b36e178b4", + "receipt_file": "demos/prior_authorization/cache/8b71d8dfe70b98f5d35b1e3709fc6eb0891daf3108c705676341f4c22f936354-extraction-extract-1f70709d4b47f8041baa824b5664ab140725273ae45199fe9c8dd06b36e178b4.receipt.json", + "sha256": { + "pdf": "8b71d8dfe70b98f5d35b1e3709fc6eb0891daf3108c705676341f4c22f936354", + "response_cache": "934ad86cefc1419537d7380bc736770ee2ccac5fa13c673cf6ea34446b2abbb0", + "receipt": "80aecfe92b4465500f5bca5d949a08ab2459bda441786d18d3e5c7ae46d0d920" + } + } } ] diff --git a/docs/lighthouse-design-source.md b/docs/lighthouse-design-source.md new file mode 100644 index 0000000..f0238a5 --- /dev/null +++ b/docs/lighthouse-design-source.md @@ -0,0 +1,53 @@ +# Lighthouse design source + +The lighthouse pages adapt the visual system from a frozen Nutrient website +`homepage-vnext` snapshot while keeping the public sample self-contained. + +## Frozen source + +- Repository: `PSPDFKit/nutrient-website` +- Branch: `jdrhyne/homepage-vnext` +- Commit: `71f76eb62384241e2cf18d76fd31020b95a0a1f6` +- Commit date: `2026-06-30T10:38:20-04:00` +- Reference screenshot: `vnext-fullpage-desktop.png` + +## Copied design language + +- An editorial sans-serif system stack for display and body copy. +- A system monospace stack for uppercase supertitles, paths, counts, and request + metadata. +- White primary canvas, warm-gray secondary surfaces, near-black text and + feature bands, thin warm-gray separators, and restrained data-green status. +- Large calm type, 16–32 px rounded containers, compact black buttons, and + layout density that alternates between generous narrative sections and + structured evidence rows. + +The pilot keeps its existing evidence contract and accessibility behavior. It +does not copy the homepage's uncited trust-gap statistics or product claims. + +## Frozen assets + +| Asset | SHA-256 | +|---|---| +| `common/assets/logotype/nutrient-logo.svg` | `c9102300d8cce70ed381f1775057fb72f5f874fafafde3efabdc82d8a0cbcb88` | + +The deployable hub contains a byte-identical logo copy under +`docs/lighthouse/assets/`. It uses system font stacks and redistributes no +commercial font binaries. + +## Authentic-form evidence refresh + +The V4 hub keeps this frozen visual system while replacing the earlier +synthetic-fixture presentation with three selected one-page authentic public +forms populated with privacy-safe demo values. Each linked proof page is a +byte-identical copy of the corresponding current reviewed output under +`demos/*/output/index.html`. + +The presentation reports the recorded envelope rather than converting it into +a broader product claim: 26/30 predeclared fields matched exactly, all 30 +returned fields included valid page-bounded primary source regions, and four +mismatches remain visible. Mortgage and healthcare are marked `Review blocked`; +the insurance summary routes `11/11 exact → Continue`, while its technical +checker page reports `Pass`. This is a three-document demonstration, not an +accuracy, production, or performance benchmark. A recorded review is not +publication approval. diff --git a/docs/lighthouse-pilot-measurement.md b/docs/lighthouse-pilot-measurement.md new file mode 100644 index 0000000..f9f52ea --- /dev/null +++ b/docs/lighthouse-pilot-measurement.md @@ -0,0 +1,253 @@ +# Data Extraction lighthouse pilot measurement brief + +## Status and boundary + +This is the measurement contract for the three-package Data Extraction developer-marketing pilot: + +- banking: `mortgage_verification`, +- insurance: `insurance_claim_intake`, and +- healthcare: `prior_authorization`. + +It measures a Layer 1 developer/PLG awareness and activation program. A conversation about source-grounded human review is a future-facing Layer 2 signal, not evidence that a complete Govern product is demonstrated, generally available, or shipped. + +This brief is **non-authorizing**. It does not authorize tracking changes, analytics configuration, account creation, credit grants, API calls, deployment, publication, community posting, or any other production change. It only defines what must be measured if and when the relevant owners approve a launch. + +## Questions the pilot must answer + +1. Which vertical story moves an eligible developer from evidence inspection to a first authenticated Extract request? +2. Which story produces a second request within seven days, rather than a one-off trial? +3. Where does each vertical lose people: sample inspection, destination CTA, key creation, or first request? +4. Which story prompts qualified conversations about future governed-review workflows without treating those conversations as product proof? + +Reach, impressions, video views, stars, and raw traffic are diagnostic context. They do not decide the winning vertical. + +## Link taxonomy + +### Required parameters + +Every campaign-controlled outbound link must use these lowercase, enumerated fields: + +| Field | Contract | Example | +|---|---|---| +| `utm_campaign` | Fixed for the entire pilot: `de_lighthouse_pilot_v1` | `de_lighthouse_pilot_v1` | +| `utm_source` | The channel or surface containing the link | `x` | +| `utm_medium` | The channel class | `organic_social` | +| `utm_content` | `...` | `mortgage_verification.social_video.v01.github` | + +`utm_content` carries four required tokens: + +| Token | Allowed values | +|---|---| +| `vertical` | `mortgage_verification`, `insurance_claim_intake`, `prior_authorization`, `cross_vertical` | +| `asset` | `social_video`, `technical_walkthrough`, `github_sample`, `proof_page`, `owned_hub`, `product_page`, `workflow_template` | +| `variant` | `v01`, `v02`, `v03`, incremented only when creative or CTA changes materially | +| `cta` | `github`, `proof`, `studio`, `docs`, `signup` | + +No free-form values are allowed. Campaign parameters must never contain a person's name, email, company, document name, account ID, request ID, medical information, financial information, claim information, or any other personal or customer data. + +### Channel values + +These values describe candidate distribution surfaces; listing them does not authorize using them. + +| Surface | `utm_source` | `utm_medium` | +|---|---|---| +| X post | `x` | `organic_social` | +| LinkedIn post | `linkedin` | `organic_social` | +| Show HN post | `hacker_news` | `community` | +| r/dataengineering post | `reddit_dataengineering` | `community` | +| Vertical README or repository link | `github` | `repository` | +| Nutrient proof page or pilot hub | `nutrient_owned` | `owned` | +| Nutrient Data Extraction product page | `nutrient_owned` | `owned` | +| n8n template or workflow listing | `n8n` | `workflow_template` | + +Use the source of the link being clicked, not the user's presumed original source. Preserve the session's original campaign touch separately. For example, a proof-page-to-Studio link uses `utm_source=nutrient_owned`; the page session retains the X or GitHub acquisition touch that brought the visitor there. + +### Examples + +```text +# X video -> banking GitHub sample +?utm_campaign=de_lighthouse_pilot_v1&utm_source=x&utm_medium=organic_social&utm_content=mortgage_verification.social_video.v01.github + +# Banking README -> banking proof page +?utm_campaign=de_lighthouse_pilot_v1&utm_source=github&utm_medium=repository&utm_content=mortgage_verification.github_sample.v01.proof + +# Insurance proof page -> Studio +?utm_campaign=de_lighthouse_pilot_v1&utm_source=nutrient_owned&utm_medium=owned&utm_content=insurance_claim_intake.proof_page.v01.studio + +# Mortgage product-page module -> reviewed proof +?utm_campaign=de_lighthouse_pilot_v1&utm_source=nutrient_owned&utm_medium=owned&utm_content=mortgage_verification.product_page.v01.proof + +# Healthcare technical walkthrough -> docs +?utm_campaign=de_lighthouse_pilot_v1&utm_source=linkedin&utm_medium=organic_social&utm_content=prior_authorization.technical_walkthrough.v01.docs +``` + +Before launch, an owner must create a link ledger with one row per public link and these columns: + +```text +link_id, destination_url, utm_campaign, utm_source, utm_medium, +vertical, asset, variant, cta, planned_surface, owner, approval_status +``` + +The destination URL must resolve to the exact GitHub sample, proof page, Studio entry, documentation page, or signup flow. Do not substitute the homepage. The ledger is the reconciliation source for valid campaign values; this document neither creates redirect links nor configures tracking. + +## Time windows and baseline + +Let `T0` be the UTC timestamp when the first approved public pilot asset is published. + +- **Baseline:** the 21 complete UTC days in `[T0 - 21 days, T0)`. +- **Observation:** the 21 days in `[T0, T0 + 21 days)`. +- **Seven-day maturity addendum:** events through `T0 + 28 days` are used only to complete the seven-day repeat outcome for organizations whose first request occurred late in the observation window. + +The day-21 report includes the seven-day repeat rate only for first requests at or before `T0 + 14 days`; later first requests are labelled `pending`, not failures. The day-28 addendum reports the fully matured 21-day first-request cohort. + +### What must be collected before `T0` + +No baseline value is assumed. Before publication, the measurement owner must record: + +1. Daily eligible sessions and destination-CTA clicks for the exact current Studio, docs, signup, and Data Extraction landing surfaces. +2. Daily new API-key organizations, first authenticated Extract requests, and seven-day second-request outcomes for new-key cohorts. +3. Existing bot, employee, agency, synthetic-monitoring, and test-account exclusion rules. +4. Current consent coverage and the proportion of web sessions that remain unattributed. +5. GitHub repository unique visitors and unique cloners captured daily; GitHub's available retention window must not be assumed to preserve the full pilot. +6. Existing qualified Data Extraction conversations and their qualification rubric, if one is already in use. +7. Exact source-system names, query owners, and query or dashboard version identifiers. + +If a source cannot produce a historical field, report the baseline as `not available`; do not reconstruct vertical, identity, or intent from names, email domains, or document content. + +## Event and metric definitions + +### Eligibility and exclusions + +An **eligible session** is a consented, bot-filtered first-party web session that views a pilot proof page or hub and is not identified as Nutrient staff, an agency working on the pilot, synthetic monitoring, a test account, or an approval-gated evidence run. Sessions without analytics consent remain in source-system operational totals where policy permits, but they are reported as unattributed and are not fingerprinted or estimated back into the campaign funnel. + +An **attributed organization** is an external organization whose consented first-party campaign touch can be joined, inside the approved restricted data environment, to its signup or developer account. Primary attribution is the most recent valid pilot touch in the seven days before the conversion. Preserve the earliest valid pilot touch as an assisted-touch field. If no compliant join exists, count the event in the operational total and mark it `unattributed`. + +For all activation metrics, deduplicate at organization level. Event totals may be shown separately for troubleshooting, but one active developer generating many requests must not outweigh several organizations activating once. + +### Exact funnel definitions + +| Event or metric | Exact definition | Primary source of truth | Owner placeholder | +|---|---|---|---| +| `pilot_asset_view` | One eligible first-party session viewing a pilot proof page, hub, or reviewed-examples product-page module. Deduplicate to one view per session, vertical, and asset. A product-page module view requires an existing consented section-view signal; a page load alone must not be relabelled as module exposure. | Existing consented first-party web analytics | `[Owner: Web Analytics]` | +| Native asset reach | Platform-reported impressions, video views, and outbound clicks for the exact post. Report by platform definition; never merge unlike platform definitions. | Native X, LinkedIn, HN, Reddit, or n8n reporting | `[Owner: Developer Marketing]` | +| GitHub repository traffic | Daily repository unique visitors and unique cloners from GitHub Traffic. This is repository-level context, not vertical attribution. Stars and forks are context only. | GitHub Traffic | `[Owner: Developer Relations]` | +| GitHub vertical engagement | An eligible first-party session arriving from a tagged CTA in a vertical README or sample. Deduplicate by session and destination. This is the attributable GitHub signal because repository traffic does not establish path-level vertical intent. | First-party web analytics plus the link ledger | `[Owner: Web Analytics]` | +| `destination_cta_click` | One click from an eligible asset session to `github`, `proof`, `studio`, `docs`, or `signup`. Deduplicate repeated clicks to the same destination within a session. | Existing first-party web analytics or native outbound-click reporting | `[Owner: Web Analytics]` | +| `destination_cta_ctr` | Distinct eligible sessions with at least one specified CTA click divided by eligible sessions that viewed the source asset. Compute separately by vertical, asset, channel, and CTA. | Derived from eligible views and clicks | `[Owner: Growth Analytics]` | +| `api_key_created` | The first API key created during the observation window for an external organization that had no API key before the event. Key rotations and additional keys do not count. | Developer-account or key-management system | `[Owner: Developer Platform]` | +| `first_authenticated_extract_request` | The earliest request from an eligible external organization to the Extract endpoint for which authentication succeeded. Downstream extraction success is not required; record completion status separately so setup and product failures remain visible. Exclude staff, tests, live-evidence runs, and rejected authentication. | API gateway plus Extract request records | `[Owner: Data Extraction Engineering]` | +| `first_request_conversion` | Attributed organizations with a first authenticated Extract request divided by attributed organizations with `api_key_created`. Also report activated organizations per 100 eligible proof-page sessions as the cross-vertical primary rate. | Restricted join of account and API operational records | `[Owner: Growth Analytics]` | +| `second_extract_request_7d` | An eligible organization has a second distinct authenticated Extract request within 168 hours after its first. A repeated log line or transport retry with the same request ID is not distinct. | API gateway plus Extract request records | `[Owner: Data Extraction Engineering]` | +| `seven_day_repeat_rate` | Organizations with `second_extract_request_7d` divided by organizations whose first authenticated request has had the full 168-hour opportunity to mature. Pending organizations are excluded from both numerator and denominator. | Derived from API operational records | `[Owner: Growth Analytics]` | +| `qualified_governed_review_conversation` | One external organization, counted once, enters a two-way conversation during the observation window, is attributable to the pilot or explicitly self-reports it, describes a real document workflow, and states a need for at least one future-facing control such as source verification, human review, approval, exception handling, audit evidence, or access control. A qualified owner must record the qualifying need and next step. | CRM record plus manual qualification | `[Owner: RevOps / Product Marketing]` | + +For `first_authenticated_extract_request`, report the first request's outcome as `completed`, `product_error`, or `client_error` using the source system's existing status contract. Authentication failures remain a separate setup diagnostic; they do not satisfy the event. + +### Required rates and cuts + +Every report must include raw numerator, denominator, rate, and unattributed count. Required cuts are vertical, channel, originating asset, CTA destination, and day. Do not publish a percentage when its denominator is hidden. + +The decision metrics are, in order: + +1. **Activation:** distinct organizations with a first authenticated Extract request per 100 eligible proof-page sessions. +2. **Depth:** seven-day repeat rate among matured first-request organizations. +3. **Future workflow fit:** distinct qualified governed-review conversations, with the stated need categorized but not presented as shipped-product adoption. + +The diagnostic metrics are GitHub unique visitors/cloners, GitHub vertical engagement, destination CTA CTR, key creation, request outcome, native reach, and video completion. They explain a funnel break; they do not override activation and depth. + +## Attribution and reconciliation + +### Attribution rules + +1. Validate every campaign link against the approved link ledger. Invalid or partially populated values become `unattributed`; analysts must not repair them by guessing. +2. Store the first valid pilot touch and the most recent valid pilot touch. Use seven-day last-pilot-touch for the primary funnel and first touch only as an assisted view. +3. A proof-page CTA click retains both the page session's acquisition touch and the CTA link's own `nutrient_owned` asset identity. +4. Use organization-level operational records for key creation and requests. Never place API keys, request IDs, document identifiers, or organization identifiers in browser analytics. +5. Keep GitHub aggregate traffic separate from vertical-attributed README return traffic. Do not allocate aggregate clones, stars, or views across verticals by assumption. +6. Count one qualified conversation per organization. A CRM thread and a meeting about the same workflow are one conversation outcome, not two. + +### Reconciliation procedure + +`[Owner: Growth Analytics]` must maintain a read-only reporting extract or workbook with these daily UTC stages: + +1. Freeze the approved link-ledger version and list any links actually used. +2. Export raw and eligible asset sessions and CTA clicks, retaining bot, consent, staff, and test exclusions as separate counts. +3. Export operational key-creation and Extract-request cohorts. Backend source totals must reconcile exactly to staged totals before exclusions; any difference is an error, not sampling noise. +4. Join only through the approved restricted identity mapping. Split operational events into `attributed`, `unattributed`, `excluded_internal_or_test`, and `join_error`; never inflate web totals to compensate for consent or blocking. +5. Deduplicate conversations by organization and have `[Owner: RevOps / Product Marketing]` sign off on the qualification fields. +6. Compare each daily total with the prior export. Late-arriving or corrected events must carry an as-of timestamp and explanation. +7. Produce day-7, day-14, and day-21 snapshots, then the day-28 seven-day-maturity addendum. Each snapshot records source query/dashboard versions and the link-ledger version. + +Any unresolved join error, unexplained operational-count mismatch, taxonomy parse failure, or changed exclusion rule must be disclosed beside the metric. It must not be silently converted to zero. + +## Stop, continue, and iterate criteria + +### Comparable-exposure rule + +Compare verticals on equal first-party exposure, not raw traffic. Let `n` be the smallest eligible proof-page-session count among the three verticals. Compute the comparison rates on the first `n` eligible sessions for each vertical, ordered by UTC timestamp. If `n < 50` at day 21, the comparison is **underpowered**: do not name a winning or losing industry and do not stop a vertical because its post received less distribution. + +The `50`-session value is a pilot decision floor, not a claimed historical baseline or a statistical-significance guarantee. Show interval estimates and absolute counts; treat close rates as a tie rather than manufacturing precision. + +### Continue + +Continue a vertical's current story into a second distribution cycle when all of the following are true: + +1. its evidence and claim-quality gates remain valid, +2. it has at least one attributed first authenticated Extract request, and +3. it has at least one depth signal: a matured seven-day second request or a qualified governed-review conversation. + +If more than one vertical qualifies, rank first by activation rate on equalized exposure, then by seven-day repeat rate. Qualified conversations break a remaining tie; impressions, stars, and raw views do not. + +### Iterate + +Iterate the asset, CTA, or onboarding step rather than the industry thesis when any of these patterns occurs: + +- `n < 50`: distribution is insufficient; improve reach to the same proof artifact without declaring product-market evidence. +- destination CTA CTR is at or above the three-vertical pooled rate but key creation or first-request conversion is below it: inspect destination continuity, signup, key issuance, docs, and first-request setup. +- GitHub vertical engagement is present but proof-page CTA engagement is weak: revise the README-to-proof handoff or CTA, preserving the sample and evidence contract. +- first requests occur but no matured organization sends a second request and no qualified conversation appears: interview the activated cohort and revise the repeat-use path before increasing distribution. +- native reach is high but eligible proof-page sessions are low: revise the post's demonstration and link framing; do not count the reach as success. + +Change one material variable per variant and increment `variant`; otherwise attribution cannot identify what improved. + +### Stop or reposition + +Stop the **current story/asset combination**, not the underlying industry, when equalized exposure has reached at least 50 eligible sessions and it has both: + +1. zero attributed first authenticated Extract requests, and +2. zero qualified governed-review conversations. + +Also stop immediately if the package loses its evidence chain, exposes sensitive data, makes an unsupported compliance or correctness claim, or implies that the future Layer 2 Govern experience is demonstrated or shipped. A stop for evidence integrity overrides favorable reach or click metrics. + +At day 21, `[Decision owner: CEO / Growth lead]`, `[Owner: Developer Marketing]`, `[Owner: Growth Analytics]`, and `[Owner: Data Extraction Product]` record one outcome per vertical: `continue`, `iterate_distribution`, `iterate_activation`, `stop_current_story`, or `underpowered`. The record must include the exact numerator, denominator, baseline comparison, exclusions, and unresolved data-quality issues. + +## Privacy and identity boundaries + +- Follow the existing consent, retention, access-control, deletion, and regional policies; this brief does not override or extend them. +- Do not add cross-device fingerprinting, third-party enrichment, email-domain inference, document inspection, or deanonymization to recover attribution. +- Browser events contain only the enumerated campaign fields and non-sensitive asset interaction. They never contain API keys, request IDs, raw URLs with secrets, document contents, extracted values, schemas containing customer data, or personal identifiers. +- Account-to-request joining occurs only in the approved restricted data environment using existing internal identifiers. Reporting outside that environment is aggregated by organization and suppresses row-level identity. +- Synthetic fixture identities and approval-gated live-evidence accounts are excluded from commercial funnel results. +- CRM qualification records the workflow category, stated review need, attribution basis, owner, and next step. It does not copy confidential documents or sensitive conversation content into the campaign report. +- Unconsented or unjoinable activity remains explicitly unattributed. No modeled uplift or identity stitching may be used to make the pilot appear more successful. + +## Pre-launch assignment checklist + +The pilot is not measurement-ready until the responsible owners have filled and approved all of the following: + +- `[Measurement owner: unassigned]` +- `[Developer Marketing owner: unassigned]` +- `[Web Analytics owner: unassigned]` +- `[Developer Platform / key-data owner: unassigned]` +- `[Data Extraction request-data owner: unassigned]` +- `[RevOps qualification owner: unassigned]` +- `[Privacy review owner: unassigned]` +- `[Decision owner: unassigned]` +- `[Existing analytics source and query/dashboard version: unassigned]` +- `[Key-management source and query version: unassigned]` +- `[API request source and query version: unassigned]` +- `[CRM source and qualification view: unassigned]` +- `[Baseline snapshot location and as-of timestamp: unassigned]` +- `[Approved link-ledger location and version: unassigned]` + +Until those assignments, baselines, and approvals exist, this document remains a planning artifact only. diff --git a/docs/lighthouse/assets/insurance-claim-intake-reviewed.html b/docs/lighthouse/assets/insurance-claim-intake-reviewed.html new file mode 100644 index 0000000..722e610 --- /dev/null +++ b/docs/lighthouse/assets/insurance-claim-intake-reviewed.html @@ -0,0 +1,914 @@ + + + + + + + A loss notice, mapped back to source + + + +
+
+ Nutrient + Data Extraction API / source proof +
+
+
+

Reviewed evidence / authentic public form

+

A loss notice, mapped back to source

+

A receipt-bound live Extract response with a recorded independent field-by-field audit against the visible authentic public form. The package retains every exact match and mismatch; the page shows the API's primary returned source region for each field.

+
+ +
+ +
+
+
+ GSA STANDARD FORM 91 - MOTOR VEHICLE ACCIDENT (CRASH) REPORT + Authentic public form · privacy-safe demo values · page 1 +
+
+ Authentic public form with privacy-safe demo values: GSA STANDARD FORM 91 - MOTOR VEHICLE ACCIDENT (CRASH) REPORT + +
+
+ + +
+ +

Correctness is determined by the independent source oracle for this authentic public form with privacy-safe demo values. Recognition signals and bounding boxes are supporting evidence, not a substitute for comparison.

+
+ + + + diff --git a/docs/lighthouse/assets/mortgage-verification-reviewed.html b/docs/lighthouse/assets/mortgage-verification-reviewed.html new file mode 100644 index 0000000..70d36a3 --- /dev/null +++ b/docs/lighthouse/assets/mortgage-verification-reviewed.html @@ -0,0 +1,901 @@ + + + + + + + Mortgage-assistance form extraction + + + +
+
+ Nutrient + Data Extraction API / source proof +
+
+
+

Reviewed evidence / authentic public form

+

Mortgage-assistance form extraction

+

A receipt-bound live Extract response with a recorded independent field-by-field audit against the visible public-form source. The package retains every exact match and mismatch; the page shows the API's primary returned source region for each field.

+
+ +
+ +
+
+
+ Treasury Request for Mortgage Assistance (RMA) - page 1 + Authentic public form · privacy-safe demo values · page 1 +
+
+ Authentic public form with privacy-safe demo values: Treasury Request for Mortgage Assistance (RMA) - page 1 + +
+
+ + +
+ +

Correctness is determined by the independent source oracle for this authentic public form with privacy-safe demo values. Recognition signals and bounding boxes are supporting evidence, not a substitute for comparison.

+
+ + + + diff --git a/docs/lighthouse/assets/nutrient-logo.svg b/docs/lighthouse/assets/nutrient-logo.svg new file mode 100644 index 0000000..a16e227 --- /dev/null +++ b/docs/lighthouse/assets/nutrient-logo.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/docs/lighthouse/assets/prior-authorization-reviewed.html b/docs/lighthouse/assets/prior-authorization-reviewed.html new file mode 100644 index 0000000..28ac2f0 --- /dev/null +++ b/docs/lighthouse/assets/prior-authorization-reviewed.html @@ -0,0 +1,931 @@ + + + + + + + CMS prior-authorization intake, field by field + + + +
+
+ Nutrient + Data Extraction API / source proof +
+
+
+

Reviewed evidence / authentic public form

+

CMS prior-authorization intake, field by field

+

A receipt-bound live Extract response with a recorded independent field-by-field audit against the visible authentic public form. The package retains every exact match and mismatch; the page shows the API's primary returned source region for each field.

+
+ +
+ +
+
+
+ CMS GLP-1 Bridge Prior Authorization Request Form + Authentic public form · privacy-safe demo values · page 1 +
+
+ Authentic public form with privacy-safe demo values: CMS GLP-1 Bridge Prior Authorization Request Form + +
+
+ + +
+ +

Correctness is determined by the independent source oracle for this authentic public form with privacy-safe demo values. Recognition signals and bounding boxes are supporting evidence, not a substitute for comparison.

+
+ + + + diff --git a/docs/lighthouse/index.html b/docs/lighthouse/index.html new file mode 100644 index 0000000..19e4534 --- /dev/null +++ b/docs/lighthouse/index.html @@ -0,0 +1,1437 @@ + + + + + + + Reviewed Data Extraction proofs | Nutrient + + + + + + + + +
+
+
+
+

Three verticals · reviewed live evidence

+

Follow every value back to the page.

+

+ On three selected one-page authentic public forms populated with privacy-safe + demo values, one live Nutrient Data Extraction API response per form exactly + matched 26 of 30 predeclared fields: mortgage 6/8, insurance 11/11, and + healthcare 9/11. All 30 returned fields included valid page-bounded primary + source regions, and four mismatches were retained for review. +

+ +
+ + + +
+
3selected authentic public forms
+
26/30predeclared fields matched exactly
+
30/30primary regions returned and page-bounded
+
4retained comparison issues
+
+
+
+ +
+
+
+
+

The differentiator

+

The proof is the chain.

+
+

+ A plausible value is not enough. Each package keeps the document, extracted + JSON value, source location, and independent oracle result connected so a + developer can inspect where the answer came from. +

+
+ +
    +
  1. +

    Document

    +

    A selected authentic public form carries only privacy-safe demo values.

    + PDF · page 1 +
  2. +
  3. +

    JSON value

    +

    The schema requests a typed field and the live response returns its value.

    + $.field → value +
  4. +
  5. +

    Primary source region

    +

    The response returns a page index and primary box that a reviewer can inspect.

    + pageIndex + bbox +
  6. +
  7. +

    Oracle status

    +

    A predeclared expected value decides whether the field is exact or retained for review.

    + JSON-value match +
  8. +
+
+
+ +
+
+
+
+

Reviewed proof pages

+

Three documents. Three concrete stories.

+
+

+ Every proof opens locally and displays one receipt-bound live response beside + its selected authentic public form and predeclared expected values. +

+
+ +
+
+
+
+ + + Reviewed mortgage extraction proof showing an authentic public RMA form beside eight compared fields and two retained issues + +
+
Current reviewed proof · Treasury RMA form · privacy-safe demo values
+
+
+
01 / MortgageReview blocked
+

Two punctuation mismatches, preserved for review.

+

+ Six of eight values matched exactly. The borrower-name region exposes one + omitted period; the servicer primary and nested regions clip the decisive + final period, so the expected-versus-actual ledger carries that evidence. +

+
+
Exact values
6/8
+
Primary regions returned
8/8
+
Retained issues
2
+
+

+ Scope: verification evidence only—not KYC, underwriting, + a lending decision, compliance, or production accuracy. +

+ +
+
+ +
+
+
+ + + Reviewed insurance extraction proof showing an authentic public GSA crash report beside eleven exact fields + +
+
Current reviewed proof · GSA Standard Form 91 · privacy-safe demo values
+
+
+
02 / Insurance11/11 exact → Continue
+

Eleven exact fields on one government crash form.

+

+ The live response matched every predeclared value and returned a valid, + page-bounded primary source region for each field on this selected form. +

+
+
Exact values
11/11
+
Primary regions returned
11/11
+
Retained issues
0
+
+

+ Scope: document intake only—not coverage, liability, + fraud, eligibility, payment, adjudication, compliance, or production accuracy. +

+ +
+
+ +
+
+
+ + + Reviewed prior-authorization proof showing an authentic public CMS form beside eleven compared fields and two retained issues + +
+
Current reviewed proof · CMS GLP-1 Bridge form · privacy-safe demo values
+
+
+
03 / HealthcareReview blocked
+

A checked box—and the wrong extracted answer.

+

+ Nine of eleven values matched exactly. The ledger retains a wrong + acknowledgement answer and a duplicated requested-drug value beside their + returned primary regions. +

+
+
Exact values
9/11
+
Primary regions returned
11/11
+
Retained issues
2
+
+

+ Scope: intake and source review only—not clinical + correctness, medical necessity, coverage, eligibility, approval, + compliance, or production accuracy. +

+ +
+
+
+
+
+ +
+
+
+

Claim boundary

+

Evidence this narrow stays useful.

+
+
+

+ These pages demonstrate one extraction chain across three selected one-page + authentic public forms populated with privacy-safe demo values. One live + response was recorded per form. This is a demonstration, not an accuracy, + production, or performance benchmark. +

+

+ Three of the four mismatches are exposed by returned metadata. The fourth stays + visible in the expected-versus-actual ledger and beside the returned region on + the full proof page. For mortgage servicer name, the primary and nested regions + clip the decisive final period. Grounding makes mistakes reviewable. It does + not make them correct. +

+

+ WORKFLOW SCHEMATIC · CONCEPT: + Extract → Source evidence → Decision gate. This is a discussion model for + future review, approval, exception, audit, or access controls—not shipped + product UI or proof of a complete governed-review workflow. +

+
    +
  • No accuracy, production, or performance benchmark claim
  • +
  • No compliance, security, or regulatory certification claim
  • +
  • No KYC, underwriting, lending, coverage, liability, fraud, or adjudication decision
  • +
  • No clinical correctness, medical necessity, eligibility, or healthcare approval
  • +
  • No account-balance reconciliation, personal user approval, or publication approval
  • +
+
+
+
+ +
+
+
+

Run your own document

+

Move from proof to first request.

+
+
+

+ Start in the official guide or Studio, review current pricing, and get the + separate Data Extraction API key before making an authenticated request. +

+ +

+ Pricing and credit usage can change. Check the current official pricing page + before making a live request. +

+
+
+
+
+ +
+ +
+ + diff --git a/docs/reproducible-proof.md b/docs/reproducible-proof.md new file mode 100644 index 0000000..5bf0429 --- /dev/null +++ b/docs/reproducible-proof.md @@ -0,0 +1,60 @@ +# Reproduce one grounded extraction + +This path fixes the document, instructions, response projection, source-reviewed ground truth, and regression command so the example can be inspected without relying on a screenshot or a marketing claim. It deliberately exposes a known extraction failure; it is not presented as an accuracy success. + +## Reviewed inputs and output + +- Document: [`demos/grounded_extraction/data/CMS-1500.pdf`](../demos/grounded_extraction/data/CMS-1500.pdf), a one-page form filled with synthetic values. +- Request instructions: [`demos/grounded_extraction/instructions.json`](../demos/grounded_extraction/instructions.json). +- Sanitized response projection: [`demos/grounded_extraction/cache/b8cec10a5a750bbe1e40e8a628e2f1bc9e6644e22fd7cd12a0397200eebc5dda-extraction-extract-9d969f5b8b34b9942b916be84e5e124a1c971cc584fa2803e2c8efc68aa4acec.json`](../demos/grounded_extraction/cache/b8cec10a5a750bbe1e40e8a628e2f1bc9e6644e22fd7cd12a0397200eebc5dda-extraction-extract-9d969f5b8b34b9942b916be84e5e124a1c971cc584fa2803e2c8efc68aa4acec.json). It is not the service's complete raw transport envelope. +- Reviewed rendering, source ground truth, and generated metadata: [`demos/grounded_extraction/output/index.html`](../demos/grounded_extraction/output/index.html), [`expected.json`](../demos/grounded_extraction/expected.json), and [`metadata.json`](../demos/grounded_extraction/output/metadata.json). +- Deterministic checker: [`demos/grounded_extraction/check_expected.py`](../demos/grounded_extraction/check_expected.py). + +The response is illustrative, not a promise that a later model version will return identical values. Grounding metadata shows what source region the response refers to; it does not establish that the value is correct. + +Direct review of the synthetic PDF finds `07 10 26` in Box 24A for both service lines, matching the schema's requested `MM DD YY` format. The committed response instead contains `10 26 07` and `10 07`. `expected.json` records the document values, so the checker intentionally reports both fields as `WRONG`. A corrected public proof requires a newly reviewed keyed response or a different independently verified fixture; the cached response must not be edited to manufacture a pass. + +## Replay the reviewed response offline + +From a clean checkout with Python 3.10 or newer: + +```bash +python3 -m venv .venv +source .venv/bin/activate +python -m pip install -r requirements.txt -r requirements-dev.txt +python -m pytest -q +cd demos/grounded_extraction +python generate_demo.py +python check_expected.py +``` + +The generator is cache-first. Without `--refresh`, it neither reads `NUTRIENT_API_KEY` nor calls the network. `python check_expected.py` currently exits nonzero for the two service-date mismatches above. The regression suite passes only when it verifies that those known mismatches are detected; it does not declare the cached response correct. The suite also pins the reviewed artifact hashes and fails if the committed cache no longer reproduces them. + +## Make the live request + +Live extraction requires a Data Extraction API key and consumes credits. Run this from the repository root: + +```bash +curl --fail-with-body \ + --request POST \ + --url https://api.nutrient.io/extraction/extract \ + --header "Authorization: Bearer ${NUTRIENT_API_KEY}" \ + --form "file=@demos/grounded_extraction/data/CMS-1500.pdf;type=application/pdf" \ + --form "instructions= Path: + if not _SLUG.fullmatch(slug): + raise LighthouseError("demo name must be a lowercase underscore slug") + try: + root = demos_root.resolve(strict=True) + candidate = demos_root / slug + if candidate.is_symlink() or not candidate.is_dir(): + raise LighthouseError("selected demo must be a regular directory") + resolved = candidate.resolve(strict=True) + resolved.relative_to(root) + except LighthouseError: + raise + except (OSError, ValueError): + raise LighthouseError("selected demo escapes the demos directory") from None + return resolved + + +def _safe_destination(demo_dir: Path, relative_path: PurePosixPath) -> Path: + destination = demo_dir.joinpath(*relative_path.parts) + try: + demo_root = demo_dir.resolve(strict=True) + destination.parent.resolve(strict=False).relative_to(demo_root) + except (OSError, ValueError): + raise LighthouseError("generated destination escapes the selected demo") from None + + cursor = demo_root + for part in relative_path.parts[:-1]: + cursor = cursor / part + if cursor.exists() and cursor.is_symlink(): + raise LighthouseError("generated destination contains a symbolic link") + if cursor.exists() and not cursor.is_dir(): + raise LighthouseError("generated destination parent is not a directory") + if destination.is_symlink(): + raise LighthouseError("generated destination must not be a symbolic link") + if destination.exists() and not destination.is_file(): + raise LighthouseError("generated destination must be a regular file") + return destination + + +def _check_bytes(path: Path, expected: bytes) -> None: + try: + if path.is_symlink() or not path.is_file(): + raise FixtureDriftError(f"generated artifact is missing: {path}") + actual = path.read_bytes() + except FixtureDriftError: + raise + except OSError: + raise LighthouseError("could not safely read generated artifact") from None + if actual != expected: + raise FixtureDriftError(f"generated artifact is stale: {path}") + + +def build_demo_fixture( + demo_dir: Path, + *, + check: bool = False, + expected_slug: str | None = None, +) -> BuildResult: + """Build one fixture PDF and expected.json, or verify exact bytes.""" + + if demo_dir.is_symlink() or not demo_dir.is_dir(): + raise LighthouseError("demo directory must be a regular directory") + slug = expected_slug or demo_dir.name + if not _SLUG.fullmatch(slug): + raise LighthouseError("demo name must be a lowercase underscore slug") + fixture = load_fixture(demo_dir / "fixture.json", expected_slug=slug) + if not isinstance(fixture, SyntheticFixture): + raise LighthouseError( + "fixture builder accepts only version-1 synthetic fixtures and will " + "not overwrite an authentic public-form source" + ) + pdf_path = _safe_destination(demo_dir, fixture.filename) + expected_path = _safe_destination(demo_dir, PurePosixPath("expected.json")) + pdf_payload = build_synthetic_pdf(fixture) + expected_payload = expected_json_bytes(fixture) + + if check: + drift: list[str] = [] + for path, payload in ( + (pdf_path, pdf_payload), + (expected_path, expected_payload), + ): + try: + _check_bytes(path, payload) + except FixtureDriftError as error: + drift.append(str(error)) + if drift: + raise FixtureDriftError("\n".join(drift)) + else: + atomic_write(pdf_path, pdf_payload) + atomic_write(expected_path, expected_payload) + + return BuildResult( + pdf_path=pdf_path, + expected_path=expected_path, + checked=check, + ) + + +def parse_args(argv: list[str] | None = None) -> argparse.Namespace: + parser = argparse.ArgumentParser( + description=( + "Build a lighthouse demo's deterministic synthetic PDF and " + "source-derived expected.json." + ) + ) + parser.add_argument("demo", help="Demo directory name under demos/") + parser.add_argument( + "--check", + action="store_true", + help="Verify committed artifacts byte-for-byte without writing.", + ) + return parser.parse_args(argv) + + +def main(argv: list[str] | None = None) -> int: + args = parse_args(argv) + try: + demo_dir = _contained_demo_dir(REPO_ROOT / "demos", args.demo) + result = build_demo_fixture( + demo_dir, + check=args.check, + expected_slug=args.demo, + ) + except FixtureDriftError as error: + print(str(error), file=sys.stderr) + return 1 + except LighthouseError as error: + print(f"fixture build failed: {error}", file=sys.stderr) + return 2 + + action = "Verified" if result.checked else "Built" + print(f"{action} {result.pdf_path.relative_to(REPO_ROOT)}") + print(f"{action} {result.expected_path.relative_to(REPO_ROOT)}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests/test_cache.py b/tests/test_cache.py index 0b43778..965fbc5 100644 --- a/tests/test_cache.py +++ b/tests/test_cache.py @@ -21,6 +21,32 @@ ) REPO_ROOT = Path(__file__).resolve().parents[1] +REVIEWED_LIVE_CACHE_INVENTORY = { + "mortgage_verification": { + "current_cache_key": "2eab5c8c1c843ef5f0f0bef9e361f818369a6e5e7652f00e6e614d381a36018e-extraction-extract-c916fe75b45defb3f9078a09545733ea7e8ae8d20310dfb490ecbeb2bff6c2aa", + "current_response_sha256": "2c20be96b8496f675ed8f0a70c77226afbd7008a59cdb47eea8a000f7b6c04e8", + "current_receipt_sha256": "c931efb663f093748713de0cd4b51d497dbe808443e6a6afca4143210048facb", + "legacy_cache_key": "15f9be3fc3c78a78bb5a67e8f2b8fa0d09383626b0c2600676e2a3f95d054e77-extraction-extract-b35c962edca85f56a9f2707e49646779b4db844e5c22ad71f6b29b445118de59", + "legacy_response_sha256": "a1c31e6f3b8b2f9647107926687d1396ced32dbe47d47c378c9c8894e109f1a1", + "legacy_receipt_sha256": "4d08edf9538d4dc5d8cedfce5edf15dd4deb7e7c343440044400158597dd7d1a", + }, + "insurance_claim_intake": { + "current_cache_key": "82bd017e04267eca150ef8ccb3f2471a5b445680d882f8375a174391c47fbbeb-extraction-extract-5270e4d2c6eb39ec7ff32e01fc0e8a6012e6a031be8a2532f16b9ff3ed397207", + "current_response_sha256": "72170c3c25bfaea102ef747097ee94d27a11179a12564c6d19d940923ee0424a", + "current_receipt_sha256": "254617154a5b3f34984ce4e094403dc2366cf3fd01f8e6d8e4696f961171029c", + "legacy_cache_key": "acb9970d933b9b1af6d9b8c08c3843006f09e8d574f07ea0b29cf51c27e2ca33-extraction-extract-ab82c0e620306ef4a76f60768e4d990f80af692bc65304953f8499474f5921b0", + "legacy_response_sha256": "57dff011062c8cac680176e371b644a1ac97a854a72b26c80627c8076b9c1a30", + "legacy_receipt_sha256": "0ffe741675fadf513682a3d7e1ddcd5001d1cf3801164c708172f8ab270eed1c", + }, + "prior_authorization": { + "current_cache_key": "18bb2e0c4419c0c2acb002acb0b4857efacc7e96f37d15decebfe06d3394d530-extraction-extract-335056f54e95ba9cd7e96cd888db202cfb359998701790e7c15b155719d8c579", + "current_response_sha256": "407ee89890604ca46ff356ec72a20968f504ad2f6015998719d49edd4f736805", + "current_receipt_sha256": "c63cb5d4b14dd5460af7ae321f2357aaecba600faefee3427141abdaf9b2ce59", + "legacy_cache_key": "8b71d8dfe70b98f5d35b1e3709fc6eb0891daf3108c705676341f4c22f936354-extraction-extract-1f70709d4b47f8041baa824b5664ab140725273ae45199fe9c8dd06b36e178b4", + "legacy_response_sha256": "934ad86cefc1419537d7380bc736770ee2ccac5fa13c673cf6ea34446b2abbb0", + "legacy_receipt_sha256": "80aecfe92b4465500f5bca5d949a08ab2459bda441786d18d3e5c7ae46d0d920", + }, +} def _extract_response(value: Any = "cached") -> dict[str, Any]: @@ -54,6 +80,10 @@ def _write_json(path: Path, value: Any) -> None: path.write_text(json.dumps(value), encoding="utf-8") +def _sha256(path: Path) -> str: + return hashlib.sha256(path.read_bytes()).hexdigest() + + def _fail_transport(*_args: object, **_kwargs: object) -> dict[str, Any]: raise AssertionError("cache replay must not call a transport") @@ -319,7 +349,73 @@ def test_sentinel_key_is_refused_and_never_persisted_or_exposed( ) -> None: sentinel = "sentinel-nutrient-key-must-never-be-cached" committed_cache_files = sorted(REPO_ROOT.glob("demos/*/cache/*.json")) - assert len(committed_cache_files) == len(SEEDED_FIXTURES) + committed_cache_paths = set(committed_cache_files) + seed_manifest = _load_json(REPO_ROOT / "demos" / "seed_manifest.json") + assert isinstance(seed_manifest, list) + manifest_by_demo = {entry["demo"]: entry for entry in seed_manifest} + seeded_demos = {demo for demo, _source, _endpoint in SEEDED_FIXTURES} + assert set(manifest_by_demo) == ( + seeded_demos | set(REVIEWED_LIVE_CACHE_INVENTORY) + ) + seeded_cache_paths = { + REPO_ROOT + / "demos" + / demo + / "cache" + / f"{manifest_by_demo[demo]['cache_key']}.json" + for demo, _source, _endpoint in SEEDED_FIXTURES + } + reviewed_cache_paths = { + REPO_ROOT / "demos" / demo / "cache" / filename + for demo, expected in REVIEWED_LIVE_CACHE_INVENTORY.items() + for prefix in ( + expected["current_cache_key"], + expected["legacy_cache_key"], + ) + for filename in (f"{prefix}.json", f"{prefix}.receipt.json") + } + assert seeded_cache_paths | reviewed_cache_paths == committed_cache_paths + + for demo, expected in REVIEWED_LIVE_CACHE_INVENTORY.items(): + entry = manifest_by_demo[demo] + assert entry["inventory_kind"] == "reviewed_live_authentic_form" + assert entry["cache_key"] == expected["current_cache_key"] + assert entry["sha256"]["response_cache"] == expected[ + "current_response_sha256" + ] + assert entry["sha256"]["receipt"] == expected[ + "current_receipt_sha256" + ] + assert entry["legacy_evidence"]["cache_key"] == expected[ + "legacy_cache_key" + ] + assert entry["legacy_evidence"]["sha256"]["response_cache"] == expected[ + "legacy_response_sha256" + ] + assert entry["legacy_evidence"]["sha256"]["receipt"] == expected[ + "legacy_receipt_sha256" + ] + + cache_dir = REPO_ROOT / "demos" / demo / "cache" + for prefix, response_hash, receipt_hash in ( + ( + expected["current_cache_key"], + expected["current_response_sha256"], + expected["current_receipt_sha256"], + ), + ( + expected["legacy_cache_key"], + expected["legacy_response_sha256"], + expected["legacy_receipt_sha256"], + ), + ): + response_path = cache_dir / f"{prefix}.json" + receipt_path = cache_dir / f"{prefix}.receipt.json" + assert response_path in committed_cache_paths + assert receipt_path in committed_cache_paths + assert _sha256(response_path) == response_hash + assert _sha256(receipt_path) == receipt_hash + assert all( sentinel not in cache_file.read_text(encoding="utf-8") for cache_file in committed_cache_files diff --git a/tests/test_convergence.py b/tests/test_convergence.py index 57cd613..6875456 100644 --- a/tests/test_convergence.py +++ b/tests/test_convergence.py @@ -34,14 +34,14 @@ "metadata.json": "21a3fbccb0110b83f9e44db0144efd64eff608de2c7ed6c6df05117f70402642", }, "grounded_extraction": { - "cms_1500_page_0.png": "c95d02b7df14fc03024fabb7fabf0409b8be891d2582c420aaca741114516ae8", - "index.html": "2ce45e5ec368ba356b8abe8e71a17c298eb98a98de15a44cc5f1c88ba363b1a0", - "metadata.json": "d04e81770eac358a27afb8f9ca92b419a0c558cd30a1f1ab113c991e3484ea64", + "cms_1500_page_0.png": "9d5ad6273543be9bd8d4ef82b51d3a2478d9688d5d8bc2c449e7152de59cec7c", + "index.html": "a99c5dab0d56b0453fae9567571feac6829c021c0eca94af76a2388358b67349", + "metadata.json": "28198d99f79b7497240a1d23c7a5bd62f96bb59237b17da8f051ebf060240859", }, "parse_citations": { - "appraisal_report_page_0.png": "2c109c531094705052272607c5c48de653596e9d93f38cc349e766ea24f8bf6b", - "elements.json": "42e79cc0d1866b1c0d166cf5c90b3b0025a647be33572913a0213eecbd8c8615", - "index.html": "5c72f30c8644a488ba6d5f6ec85b0b01f8e78fe5ef857e4eb6f94a1b49067b5a", + "appraisal_report_page_0.png": "00c5e5e5730bf4707ef4c14277ada163530bff872ea6e811918dfaf14adaeb70", + "elements.json": "306943320e3720669b62d3dd2fd7437d187edc62ec169e45cf4fd809384ca9fe", + "index.html": "9a0601e563fb597e8e47bfc2ff24cc62f19c1a1d688a45182d25b6e38ec1525a", }, "rma_extraction": { "index.html": "fc391170fb2691c7ecb9c72cfa0589f4e465308ab8ba963cd678298c30740fee", @@ -60,6 +60,26 @@ "sc100_page_3.png": "9b8be3c89e3dfc2dc9fc051b2e2d912297b311e370efa50815919dc2822d34f2", }, } +REVIEWED_LIGHTHOUSE_ARTIFACT_SHA256 = { + "mortgage_verification": { + "comparison.json": "afb217cc553e4507e3a8dd1130e9ed51e0605f5f4fb2c066049f956ea81c2936", + "index.html": "06c747b2f58a069dc109eebc578a4afc24326d3544aac69a110c431e0f99bca3", + "source-page.png": "43f0b6d63e9f42cd8efc49ab379dd8fe63984107c2cc8152d1347d4df3b77975", + "hub_copy": "mortgage-verification-reviewed.html", + }, + "insurance_claim_intake": { + "comparison.json": "35f05513552be18c8b792f1edafe6199f59a7efe883271b87426e26571da6db2", + "index.html": "2fe6ca1bc12be0ff4a5fb46f7ec7728a12986bc17cf7a3d898d4d2664c5f7a44", + "source-page.png": "d9b1eb577f262e5da8237146061f4b77613c3b2ff01c87c9f17d5cdfe2970bc5", + "hub_copy": "insurance-claim-intake-reviewed.html", + }, + "prior_authorization": { + "comparison.json": "c974f57939385f4e0cd935aa5ec480920baa8245b593a3f0ff5132e4fa101eb9", + "index.html": "c947213165b41a517551eda77dc2f1ce58ad63d43a92f51be6d737ea36a2b027", + "source-page.png": "ce4494e56f05d93575038187d950432e88d3574a2dc765d37b06a230183cdade", + "hub_copy": "prior-authorization-reviewed.html", + }, +} HOSTILE = "" ESCAPED_HOSTILE = "</script><script>alert(1)</script>" TEXT_LEAF_POSITIONS = ("first", "middle", "last") @@ -270,6 +290,32 @@ def test_committed_cache_replay_is_offline_and_preserves_all_artifacts( assert _output_artifact_hashes(demo_dir) == EXPECTED_ARTIFACT_SHA256[demo_name] +def test_reviewed_authentic_form_artifacts_and_hub_copies_are_hash_pinned() -> None: + manifest = json.loads( + (REPO_ROOT / "demos" / "seed_manifest.json").read_text(encoding="utf-8") + ) + manifest_by_demo = {entry["demo"]: entry for entry in manifest} + + for demo, expected in REVIEWED_LIGHTHOUSE_ARTIFACT_SHA256.items(): + output_dir = REPO_ROOT / "demos" / demo / "output" + for artifact_name in ("comparison.json", "index.html", "source-page.png"): + artifact_hash = hashlib.sha256( + (output_dir / artifact_name).read_bytes() + ).hexdigest() + assert artifact_hash == expected[artifact_name] + + copied_proof = ( + REPO_ROOT + / "docs" + / "lighthouse" + / "assets" + / expected["hub_copy"] + ) + copied_hash = hashlib.sha256(copied_proof.read_bytes()).hexdigest() + assert copied_hash == expected["index.html"] + assert manifest_by_demo[demo]["sha256"]["reviewed_output"] == copied_hash + + @pytest.mark.parametrize("position", TEXT_LEAF_POSITIONS) @pytest.mark.parametrize("demo_name", DEMOS) def test_hostile_cached_document_values_are_escaped( diff --git a/tests/test_lighthouse_contract.py b/tests/test_lighthouse_contract.py new file mode 100644 index 0000000..660e7e7 --- /dev/null +++ b/tests/test_lighthouse_contract.py @@ -0,0 +1,1087 @@ +from __future__ import annotations + +import hashlib +import json +from pathlib import Path +from typing import Any + +import pytest + +from common.lighthouse import ( + COMMITTED_CACHE_KEYS, + LIVE_REVIEW_LABEL, + PROVISIONAL_LABEL, + PUBLIC_FORM_SOURCE_STATUS, + REVIEWED_LIVE_LABEL, + FixtureField, + LighthouseError, + LiveRefreshEvidence, + ProvisionalEvidence, + PublicFormFixture, + SyntheticFixture, + build_synthetic_pdf, + committed_response_digest, + compare_evidence, + compare_expected, + expected_from_fixture, + expected_json_bytes, + load_committed_live_evidence, + load_provisional_evidence, + parse_fixture, + project_committed_cache, + provisional_evidence, + render_lighthouse_page, + validate_committed_cache, +) +from scripts.build_lighthouse_fixtures import ( + FixtureDriftError, + build_demo_fixture, +) + + +HOSTILE = "" + + +def _pages() -> list[dict[str, int]]: + return [{"width": 612, "height": 792}] + + +def _metadata_leaf( + *, + x: float = 12, + y: float = 18, + width: float = 120, + height: float = 22, +) -> dict[str, Any]: + return { + "pageIndex": 0, + "bbox": {"x": x, "y": y, "width": width, "height": height}, + "confidence": 0.98, + } + + +def _response( + *, + data: Any | None = None, + metadata: Any | None = None, + request_id: str = "request-live-1", +) -> dict[str, Any]: + if data is None: + data = {"name": "Alex Example", "amount": 42} + if metadata is None: + metadata = {"name": _metadata_leaf(), "amount": _metadata_leaf(y=52)} + return { + "status": 200, + "requestId": request_id, + "output": { + "data": data, + "metadata": metadata, + "pages": _pages(), + }, + "reconstructed": None, + } + + +def _fixture_json(slug: str = "sample_demo") -> dict[str, Any]: + return { + "version": 1, + "slug": slug, + "sourceStatus": "synthetic", + "document": { + "filename": "data/synthetic-source.pdf", + "title": "Synthetic verification packet", + "subtitle": "Source truth for a one-page extraction demo", + "width": 612, + "height": 792, + }, + "fields": [ + {"path": ["borrower", "name"], "label": "Borrower name", "value": "Alex Example"}, + {"path": ["borrower", "income"], "label": "Monthly income", "value": 7200}, + {"path": ["accounts", 0, "suffix"], "label": "Account suffix", "value": "0042"}, + {"path": ["verified"], "label": "Review flag", "value": True}, + ], + } + + +def _public_fixture_json(slug: str = "sample_demo") -> dict[str, Any]: + return { + "version": 2, + "slug": slug, + "sourceStatus": PUBLIC_FORM_SOURCE_STATUS, + "document": { + "filename": "data/privacy-safe-public-form.pdf", + "title": "Official Form 123 demo", + "subtitle": "Authentic public form with privacy-safe demo values", + "width": 612, + "height": 792, + }, + "provenance": { + "publisher": "Example Public Agency", + "officialFormName": "Official Form 123", + "canonicalSourceUrl": "https://www.example.gov/forms/official-123.pdf", + "originalSha256": "1" * 64, + "sourceSha256": "2" * 64, + }, + "fields": [ + { + "path": ["applicant", "name"], + "label": "Applicant name", + "value": "Alex Example", + "source": { + "pageIndex": 0, + "bbox": {"x": 80, "y": 120, "width": 140, "height": 18}, + }, + }, + { + "path": ["reference_number"], + "label": "Reference number", + "value": "DEMO-0042", + "source": { + "pageIndex": 0, + "bbox": {"x": 330, "y": 120, "width": 100, "height": 18}, + }, + }, + ], + } + + +def _write_json(path: Path, value: Any) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(value, ensure_ascii=False, indent=2), encoding="utf-8") + + +def _receipt( + response: dict[str, Any], + *, + source_status: str = "live-refresh", + request_id: str | None = None, + digest: str | None = None, +) -> dict[str, Any]: + return { + "receiptVersion": 1, + "sourceStatus": source_status, + "requestId": request_id or response["requestId"], + "projectedResponseSha256": digest or committed_response_digest(response), + } + + +def _live_evidence( + tmp_path: Path, + response: dict[str, Any] | None = None, + *, + reviewed: bool = False, +) -> LiveRefreshEvidence: + selected_response = response or _response() + cache_path = tmp_path / "cache.json" + receipt_path = tmp_path / "receipt.json" + _write_json(cache_path, selected_response) + _write_json(receipt_path, _receipt(selected_response)) + return load_committed_live_evidence( + cache_path, + receipt_path, + reviewed=reviewed, + ) + + +def test_provisional_and_live_evidence_have_distinct_fixed_labels( + tmp_path: Path, +) -> None: + provisional = provisional_evidence(_response()) + live = _live_evidence(tmp_path / "live") + reviewed = _live_evidence(tmp_path / "reviewed", reviewed=True) + + assert isinstance(provisional, ProvisionalEvidence) + assert isinstance(live, LiveRefreshEvidence) + assert provisional.kind == "provisional" + assert live.kind == "live" + assert provisional.label == PROVISIONAL_LABEL + assert "LIVE" not in provisional.label + assert live.label == LIVE_REVIEW_LABEL + assert reviewed.label == REVIEWED_LIVE_LABEL + + +def test_provisional_loader_requires_the_exact_tagged_envelope(tmp_path: Path) -> None: + source = tmp_path / "provisional.json" + _write_json( + source, + {"sourceStatus": "provisional-layout", "response": _response()}, + ) + + evidence = load_provisional_evidence(source) + + assert isinstance(evidence, ProvisionalEvidence) + for source_status in ("live", "api-output", "reviewed", "synthetic"): + _write_json( + source, + {"sourceStatus": source_status, "response": _response()}, + ) + with pytest.raises(LighthouseError, match="unsupported provisional source status"): + load_provisional_evidence(source) + + +def test_provisional_loader_rejects_raw_cache_and_duplicate_json_keys( + tmp_path: Path, +) -> None: + source = tmp_path / "provisional.json" + _write_json(source, _response()) + with pytest.raises(LighthouseError, match="sourceStatus and response"): + load_provisional_evidence(source) + + source.write_text( + '{"sourceStatus":"provisional-layout","sourceStatus":"live","response":{}}', + encoding="utf-8", + ) + with pytest.raises(LighthouseError, match="duplicate object key"): + load_provisional_evidence(source) + + with pytest.raises(LighthouseError, match="regular, non-symlink|could not safely read"): + load_provisional_evidence("malformed\0path.json") + + +def test_committed_cache_contract_uses_only_the_four_named_keys() -> None: + assert COMMITTED_CACHE_KEYS == { + "status", + "requestId", + "output", + "reconstructed", + } + broader = {**_response(), "configuration": {"mode": "agentic"}, "metrics": {}} + + with pytest.raises(LighthouseError, match="configuration, metrics"): + validate_committed_cache(broader) + + projected = project_committed_cache(broader) + assert set(projected) == COMMITTED_CACHE_KEYS + + +def test_committed_cache_requires_status_request_id_and_output() -> None: + for required in ("status", "requestId", "output"): + malformed = _response() + del malformed[required] + with pytest.raises(LighthouseError, match="missing required"): + validate_committed_cache(malformed) + + +@pytest.mark.parametrize("extra_key", ["billing", "internal", "metrics"]) +def test_committed_cache_rejects_extra_extract_output_envelope_keys( + extra_key: str, +) -> None: + malformed = _response() + malformed["output"][extra_key] = {"secret": "must not persist"} + + with pytest.raises(LighthouseError, match=f"unsupported output keys {extra_key}"): + validate_committed_cache(malformed) + + +def test_committed_cache_allows_document_field_names_inside_output_data() -> None: + response = _response( + data={"billing": {"liquid_balance": 12500}}, + metadata={"billing": {"liquid_balance": _metadata_leaf()}}, + ) + + validated = validate_committed_cache(response) + + assert validated["output"]["data"]["billing"]["liquid_balance"] == 12500 + + +def test_live_evidence_requires_matching_cache_and_receipt(tmp_path: Path) -> None: + cache_path = tmp_path / "cache.json" + receipt_path = tmp_path / "receipt.json" + response = _response() + _write_json(cache_path, response) + _write_json(receipt_path, _receipt(response)) + + evidence = load_committed_live_evidence( + cache_path, + receipt_path, + reviewed=True, + ) + + assert evidence.reviewed is True + assert set(evidence.response) == COMMITTED_CACHE_KEYS + + +def test_live_evidence_rejects_direct_construction_and_raw_wrappers( + tmp_path: Path, +) -> None: + with pytest.raises(LighthouseError, match="only be loaded"): + LiveRefreshEvidence(response=_response()) + + receipt_path = tmp_path / "receipt.json" + _write_json(receipt_path, _receipt(_response())) + with pytest.raises(LighthouseError, match="safely read|regular"): + load_committed_live_evidence(_response(), receipt_path) # type: ignore[arg-type] + + provisional_path = tmp_path / "provisional.json" + _write_json( + provisional_path, + {"sourceStatus": "provisional-layout", "response": _response()}, + ) + with pytest.raises(LighthouseError, match="unsupported top-level keys"): + load_committed_live_evidence(provisional_path, receipt_path) + + +def test_live_evidence_rejects_missing_mismatched_and_forged_receipts( + tmp_path: Path, +) -> None: + cache_path = tmp_path / "cache.json" + receipt_path = tmp_path / "receipt.json" + response = _response() + _write_json(cache_path, response) + + with pytest.raises(LighthouseError, match="regular, non-symlink"): + load_committed_live_evidence(cache_path, receipt_path) + + mismatched_request = _receipt(response, request_id="different-request") + _write_json(receipt_path, mismatched_request) + with pytest.raises(LighthouseError, match="requestId does not match"): + load_committed_live_evidence(cache_path, receipt_path) + + mismatched_digest = _receipt(response, digest="0" * 64) + _write_json(receipt_path, mismatched_digest) + with pytest.raises(LighthouseError, match="digest does not match"): + load_committed_live_evidence(cache_path, receipt_path) + + forged_status = _receipt(response, source_status="provisional-layout") + _write_json(receipt_path, forged_status) + with pytest.raises(LighthouseError, match="unsupported live-refresh receipt source status"): + load_committed_live_evidence(cache_path, receipt_path) + + missing_key = _receipt(response) + del missing_key["projectedResponseSha256"] + _write_json(receipt_path, missing_key) + with pytest.raises(LighthouseError, match="exactly the documented keys"): + load_committed_live_evidence(cache_path, receipt_path) + + +def test_live_evidence_rejects_reconstructed_and_broader_cache_files( + tmp_path: Path, +) -> None: + cache_path = tmp_path / "cache.json" + receipt_path = tmp_path / "receipt.json" + response = _response() + + _write_json(cache_path, {**_response(), "configuration": {}}) + _write_json(receipt_path, _receipt(response)) + with pytest.raises(LighthouseError, match="unsupported"): + load_committed_live_evidence(cache_path, receipt_path) + + for marker in (True, 0, 0.0, ""): + response = _response() + response["reconstructed"] = marker + _write_json(cache_path, response) + _write_json(receipt_path, _receipt(response)) + with pytest.raises(LighthouseError, match="reconstructed responses"): + load_committed_live_evidence(cache_path, receipt_path) + + +def test_live_evidence_permits_only_absent_none_or_boolean_false_reconstruction_marker( + tmp_path: Path, +) -> None: + for index, marker in enumerate((None, False)): + response = _response() + response["reconstructed"] = marker + evidence = _live_evidence(tmp_path / str(index), response) + assert evidence.kind == "live" + + absent = _response() + del absent["reconstructed"] + assert _live_evidence(tmp_path / "absent", absent).kind == "live" + + +def test_comparison_pass_and_exit_semantics_require_values_and_grounding() -> None: + expected = {"name": "Alex Example", "amount": 42} + response = _response() + + report = compare_expected( + expected, + response["output"]["data"], + response["output"]["metadata"], + pages=response["output"]["pages"], + ) + + assert report.passed is True + assert report.exit_code == 0 + assert report.issues == () + assert report.expected_leaves == 2 + assert report.matched_leaves == 2 + assert report.grounded_leaves == 2 + + +def test_comparison_retains_all_value_shape_and_grounding_mismatches() -> None: + expected = {"a": "source-a", "b": "source-b", "items": [1, 2]} + actual = {"a": "wrong", "items": [1, 3, 4], "extra": "not-source"} + metadata = { + "a": None, + "items": [_metadata_leaf(), {"pageIndex": "zero", "bbox": {}}], + } + + report = compare_expected(expected, actual, metadata, pages=_pages()) + codes_and_paths = {(issue.code, issue.path) for issue in report.issues} + + assert report.passed is False + assert report.exit_code == 1 + assert ("WRONG", "$.a") in codes_and_paths + assert ("UNGROUNDED", "$.a") in codes_and_paths + assert ("MISSING", "$.b") in codes_and_paths + assert ("WRONG", "$.items[1]") in codes_and_paths + assert ("INVALID_METADATA", "$.items[1]") in codes_and_paths + assert ("UNEXPECTED", "$.items[2]") in codes_and_paths + assert ("UNEXPECTED", "$.extra") in codes_and_paths + assert len(report.issues) == 7 + + +def test_comparison_uses_strict_json_scalar_types() -> None: + report = compare_expected( + {"approved": True}, + {"approved": 1}, + {"approved": _metadata_leaf()}, + pages=_pages(), + ) + + assert report.exit_code == 1 + assert [(issue.code, issue.path) for issue in report.issues] == [ + ("WRONG", "$.approved") + ] + + +def test_comparison_rejects_non_finite_values_and_handles_hostile_paths() -> None: + with pytest.raises(LighthouseError, match="non-finite"): + compare_expected( + {"value": 1}, + {"value": float("nan")}, + {"value": _metadata_leaf()}, + pages=_pages(), + ) + + report = compare_expected( + {HOSTILE: "source"}, + {HOSTILE: "different"}, + {HOSTILE: _metadata_leaf()}, + pages=_pages(), + ) + assert report.issues[0].path.startswith('$["') + + +@pytest.mark.parametrize( + "metadata, message", + [ + ( + { + "pageIndex": 0, + "bbox": {"x": 1, "y": 1, "width": 20, "extra": 4}, + }, + "exactly x, y, width, and height", + ), + ( + { + "pageIndex": 0, + "bbox": { + "x": 1, + "y": 1, + "width": 20, + "height": 10, + "extra": 4, + }, + }, + "exactly x, y, width, and height", + ), + (_metadata_leaf(x=600, width=20), "exceeds the page width"), + (_metadata_leaf(y=780, height=20), "exceeds the page height"), + ({**_metadata_leaf(), "pageIndex": 1}, "pageIndex must be exactly 0"), + ], +) +def test_grounding_requires_exact_in_page_one_page_geometry( + metadata: dict[str, Any], + message: str, +) -> None: + report = compare_expected( + {"value": "source"}, + {"value": "source"}, + {"value": metadata}, + pages=_pages(), + ) + + assert report.exit_code == 1 + assert [(issue.code, issue.path) for issue in report.issues] == [ + ("INVALID_METADATA", "$.value") + ] + assert message in report.issues[0].message + + +@pytest.mark.parametrize( + "pages", + [ + [], + [{"width": 612, "height": 792}, {"width": 612, "height": 792}], + [{"width": float("nan"), "height": 792}], + [{"width": 612, "height": 0}], + ], +) +def test_direct_comparison_rejects_invalid_page_contract(pages: Any) -> None: + with pytest.raises(LighthouseError, match="exactly one page|non-finite|finite range"): + compare_expected( + {"value": "source"}, + {"value": "source"}, + {"value": _metadata_leaf()}, + pages=pages, + ) + + +def test_structural_mismatches_expand_to_every_affected_leaf() -> None: + expected = { + "person": { + "name": "Alex Example", + "employer": {"name": "Example Industries"}, + } + } + + wrong_container = compare_expected( + expected, + {"person": "not-an-object"}, + {"person": _metadata_leaf()}, + pages=_pages(), + ) + wrong_paths = { + issue.path for issue in wrong_container.issues if issue.code == "WRONG" + } + assert "$.person" in wrong_paths + assert "$.person.name" in wrong_paths + assert "$.person.employer.name" in wrong_paths + + missing_object = compare_expected( + expected, + {"person": {}}, + {"person": {}}, + pages=_pages(), + ) + missing_paths = { + issue.path for issue in missing_object.issues if issue.code == "MISSING" + } + assert missing_paths == {"$.person.name", "$.person.employer.name"} + + unexpected_object = compare_expected( + {"known": "source"}, + { + "known": "source", + "unexpected": {"nested": {"first": 1, "second": 2}}, + }, + {"known": _metadata_leaf()}, + pages=_pages(), + ) + unexpected_paths = { + issue.path for issue in unexpected_object.issues if issue.code == "UNEXPECTED" + } + assert unexpected_paths == { + "$.unexpected.nested.first", + "$.unexpected.nested.second", + } + + +def test_render_marks_shape_affected_cards_failed_and_lists_unexpected_leaves() -> None: + expected = {"person": {"name": "Alex", "employer": "Example Industries"}} + response = _response( + data={ + "person": "wrong-container", + "unexpected": {"nested": {"secret": "visible-ledger-entry"}}, + }, + metadata={"person": _metadata_leaf()}, + ) + + html = render_lighthouse_page( + title="Structural comparison", + summary="Every structural failure remains visible.", + document_name="Synthetic source", + document_image=b"stable-image-bytes", + expected=expected, + evidence=provisional_evidence(response), + ) + + assert html.count('class="field-card fail"') == 2 + assert 'class="field-card pass"' not in html + assert "$.person.name" in html + assert "$.person.employer" in html + assert "$.unexpected.nested.secret" in html + assert "visible-ledger-entry" in html + assert "Every retained issue" in html + + +def test_expected_values_are_derived_from_fixture_source_not_response() -> None: + fixture = parse_fixture(_fixture_json()) + expected = expected_from_fixture(fixture) + response_data = json.loads(json.dumps(expected)) + response_data["borrower"]["name"] = "Model Changed This" + metadata = { + "borrower": { + "name": _metadata_leaf(), + "income": _metadata_leaf(y=45), + }, + "accounts": [{"suffix": _metadata_leaf(y=75)}], + "verified": _metadata_leaf(y=105), + } + evidence = provisional_evidence(_response(data=response_data, metadata=metadata)) + + report = compare_evidence(expected, evidence) + + assert expected["borrower"]["name"] == "Alex Example" + assert any( + issue.code == "WRONG" and issue.path == "$.borrower.name" + for issue in report.issues + ) + + +def test_fixture_rejects_traversal_real_data_status_and_path_collisions() -> None: + traversal = _fixture_json() + traversal["document"]["filename"] = "../outside.pdf" + with pytest.raises(LighthouseError, match="safe relative PDF path"): + parse_fixture(traversal) + + nul_path = _fixture_json() + nul_path["document"]["filename"] = "data/source\0.pdf" + with pytest.raises(LighthouseError, match="safe relative PDF path"): + parse_fixture(nul_path) + + real_data = _fixture_json() + real_data["sourceStatus"] = "customer-data" + with pytest.raises(LighthouseError, match="unsupported fixture source status"): + parse_fixture(real_data) + + collision = _fixture_json() + collision["fields"].append( + {"path": ["borrower"], "label": "Collision", "value": "bad"} + ) + with pytest.raises(LighthouseError, match="must not overlap"): + parse_fixture(collision) + + +def test_public_form_fixture_requires_distinct_versioned_provenance_and_boxes() -> None: + fixture = parse_fixture(_public_fixture_json()) + + assert isinstance(fixture, PublicFormFixture) + assert fixture.version == 2 + assert fixture.source_status == PUBLIC_FORM_SOURCE_STATUS + assert fixture.provenance.publisher == "Example Public Agency" + assert fixture.provenance.official_form_name == "Official Form 123" + assert fixture.provenance.canonical_source_url.startswith("https://") + assert fixture.fields[0].source_box is not None + assert fixture.fields[0].source_box.as_metadata() == { + "pageIndex": 0, + "bbox": {"x": 80.0, "y": 120.0, "width": 140.0, "height": 18.0}, + } + assert expected_from_fixture(fixture) == { + "applicant": {"name": "Alex Example"}, + "reference_number": "DEMO-0042", + } + + +def test_fixture_source_types_cannot_be_silently_relabelled() -> None: + relabelled_synthetic = _fixture_json() + relabelled_synthetic["sourceStatus"] = PUBLIC_FORM_SOURCE_STATUS + with pytest.raises( + LighthouseError, + match="version-1 fixtures must remain synthetic", + ): + parse_fixture(relabelled_synthetic) + + relabelled_public = _public_fixture_json() + relabelled_public["sourceStatus"] = "synthetic" + with pytest.raises(LighthouseError, match="version/source status"): + parse_fixture(relabelled_public) + + +@pytest.mark.parametrize( + "mutate, message", + [ + ( + lambda value: value["provenance"].__setitem__( + "canonicalSourceUrl", "http://www.example.gov/form.pdf" + ), + "canonical HTTPS URL", + ), + ( + lambda value: value["provenance"].__setitem__( + "canonicalSourceUrl", "https://user@example.gov/form.pdf" + ), + "canonical HTTPS URL", + ), + ( + lambda value: value["provenance"].__setitem__( + "canonicalSourceUrl", "https://EXAMPLE.gov/form.pdf" + ), + "canonical HTTPS URL", + ), + ( + lambda value: value["provenance"].__setitem__( + "sourceSha256", "A" * 64 + ), + "lowercase SHA-256", + ), + ( + lambda value: value["provenance"].__setitem__( + "originalSha256", "not-a-digest" + ), + "lowercase SHA-256", + ), + ( + lambda value: value["provenance"].__setitem__("publisher", ""), + "must not be empty", + ), + ], +) +def test_public_form_fixture_rejects_malformed_provenance( + mutate: Any, + message: str, +) -> None: + value = _public_fixture_json() + mutate(value) + with pytest.raises(LighthouseError, match=message): + parse_fixture(value) + + +@pytest.mark.parametrize( + "source, message", + [ + ( + {"pageIndex": 0, "bbox": {"x": 1, "y": 2, "width": 3}}, + "exactly x, y, width, and height", + ), + ( + { + "pageIndex": 1, + "bbox": {"x": 1, "y": 2, "width": 3, "height": 4}, + }, + "pageIndex must be exactly 0", + ), + ( + { + "pageIndex": 0, + "bbox": {"x": -1, "y": 2, "width": 3, "height": 4}, + }, + "origin must be non-negative", + ), + ( + { + "pageIndex": 0, + "bbox": {"x": 1, "y": 2, "width": 0, "height": 4}, + }, + "dimensions must be positive", + ), + ( + { + "pageIndex": 0, + "bbox": {"x": 600, "y": 2, "width": 13, "height": 4}, + }, + "exceeds the declared page width", + ), + ( + { + "pageIndex": 0, + "bbox": {"x": 1, "y": 790, "width": 3, "height": 3}, + }, + "exceeds the declared page height", + ), + ], +) +def test_public_form_fixture_rejects_malformed_or_out_of_page_boxes( + source: dict[str, Any], + message: str, +) -> None: + value = _public_fixture_json() + value["fields"][0]["source"] = source + with pytest.raises(LighthouseError, match=message): + parse_fixture(value) + + +@pytest.mark.parametrize( + "mutate, message", + [ + (lambda value: value["document"].__setitem__("width", float("inf")), "non-finite|finite range"), + (lambda value: value["fields"][0].__setitem__("label", "line\nbreak"), "printable ASCII"), + (lambda value: value["fields"][0].__setitem__("value", {"nested": "no"}), "JSON scalar"), + (lambda value: value.__setitem__("version", 2), "unsupported fixture version"), + ], +) +def test_fixture_fails_safely_on_malformed_values(mutate: Any, message: str) -> None: + value = _fixture_json() + mutate(value) + with pytest.raises(LighthouseError, match=message): + parse_fixture(value) + + +def test_synthetic_pdf_and_expected_json_are_byte_stable() -> None: + fixture = parse_fixture(_fixture_json()) + + first_pdf = build_synthetic_pdf(fixture) + second_pdf = build_synthetic_pdf(fixture) + first_expected = expected_json_bytes(fixture) + second_expected = expected_json_bytes(fixture) + + assert first_pdf == second_pdf + assert first_pdf.startswith(b"%PDF-1.4") + assert first_pdf.endswith(b"%%EOF\n") + assert first_expected == second_expected + assert json.loads(first_expected) == expected_from_fixture(fixture) + assert hashlib.sha256(first_pdf).hexdigest() == ( + "a40b66c379e3eac25068f626679fb527377f473e010d59f6d9d53d714201008d" + ) + assert hashlib.sha256(first_expected).hexdigest() == ( + "271de86a00b49fb54079df8a1f860d6fb65da5adf1f9e45b325a464135a2c0c8" + ) + + +def test_synthetic_pdf_builder_rejects_public_form_fixture() -> None: + fixture = parse_fixture(_public_fixture_json()) + + with pytest.raises(LighthouseError, match="only version-1 synthetic"): + build_synthetic_pdf(fixture) # type: ignore[arg-type] + + +def test_pdf_generator_escapes_hostile_pdf_literal_text() -> None: + value = _fixture_json() + value["fields"][0]["value"] = r"hostile (value) \\ still literal" + fixture = parse_fixture(value) + + pdf = build_synthetic_pdf(fixture) + + assert b"hostile \\(value\\)" in pdf + assert b"\\\\\\\\ still literal" in pdf + + +def test_fixture_builder_writes_and_checks_without_mutating_in_check_mode( + tmp_path: Path, +) -> None: + demo_dir = tmp_path / "sample_demo" + demo_dir.mkdir() + _write_json(demo_dir / "fixture.json", _fixture_json()) + + built = build_demo_fixture(demo_dir) + expected_before = built.expected_path.read_bytes() + checked = build_demo_fixture(demo_dir, check=True) + + assert checked.checked is True + assert built.pdf_path.is_file() + assert expected_before == built.expected_path.read_bytes() + + built.expected_path.write_text("{}\n", encoding="utf-8") + stale_before = built.expected_path.read_bytes() + with pytest.raises(FixtureDriftError, match="stale"): + build_demo_fixture(demo_dir, check=True) + assert built.expected_path.read_bytes() == stale_before + + +def test_fixture_builder_rejects_symlink_destinations(tmp_path: Path) -> None: + demo_dir = tmp_path / "sample_demo" + demo_dir.mkdir() + _write_json(demo_dir / "fixture.json", _fixture_json()) + outside = tmp_path / "outside.pdf" + outside.write_bytes(b"preserve") + data_dir = demo_dir / "data" + data_dir.mkdir() + (data_dir / "synthetic-source.pdf").symlink_to(outside) + + with pytest.raises(LighthouseError, match="symbolic link"): + build_demo_fixture(demo_dir) + assert outside.read_bytes() == b"preserve" + + +def test_fixture_builder_never_overwrites_public_form_sources_or_oracles( + tmp_path: Path, +) -> None: + demo_dir = tmp_path / "sample_demo" + source_path = demo_dir / "data" / "privacy-safe-public-form.pdf" + source_path.parent.mkdir(parents=True) + source_before = b"preserve-authentic-public-form" + expected_before = b'{"preserve":"oracle"}\n' + source_path.write_bytes(source_before) + (demo_dir / "expected.json").write_bytes(expected_before) + fixture_value = _public_fixture_json() + fixture_value["provenance"]["sourceSha256"] = hashlib.sha256( + source_before + ).hexdigest() + _write_json(demo_dir / "fixture.json", fixture_value) + + with pytest.raises(LighthouseError, match="will not overwrite"): + build_demo_fixture(demo_dir) + + assert source_path.read_bytes() == source_before + assert (demo_dir / "expected.json").read_bytes() == expected_before + + +def test_rendered_page_is_self_contained_and_escapes_all_hostile_text( + tmp_path: Path, +) -> None: + response = _response( + data={"name": HOSTILE}, + metadata={"name": _metadata_leaf()}, + request_id=HOSTILE, + ) + evidence = _live_evidence(tmp_path, response) + + html = render_lighthouse_page( + title=HOSTILE, + summary=HOSTILE, + document_name=HOSTILE, + document_image=b"stable-image-bytes", + expected={"name": HOSTILE}, + evidence=evidence, + ) + + assert HOSTILE not in html + assert "</script><script>alert" in html + assert "\\u003c/script>\\u003cscript>alert" in html + assert "data:image/png;base64," in html + assert "http://" not in html + assert "https://" not in html + assert LIVE_REVIEW_LABEL in html + + +def test_provisional_page_never_displays_request_id_or_live_label() -> None: + response = _response(request_id="fake-live-looking-request") + evidence = provisional_evidence(response) + + html = render_lighthouse_page( + title="Layout proof", + summary="Offline layout test", + document_name="Synthetic source", + document_image=b"stable-image-bytes", + expected={"name": "Alex Example", "amount": 42}, + evidence=evidence, + ) + + assert PROVISIONAL_LABEL in html + assert "fake-live-looking-request" not in html + assert LIVE_REVIEW_LABEL not in html + assert REVIEWED_LIVE_LABEL not in html + assert "Layout development only; not release evidence." in html + assert "PROVISIONAL LAYOUT MATCH · NO API CALL" in html + assert ">Pass<" not in html + assert "background: var(--citrus);" in html + assert "background: var(--success);" not in html + assert "source grounded" in html + assert "primary regions returned" not in html + + +def test_public_form_page_uses_authentic_privacy_safe_copy() -> None: + html = render_lighthouse_page( + title="Official form proof", + summary="Privacy-safe source verification", + document_name="Official Form 123", + document_image=b"stable-image-bytes", + expected={"name": "Alex Example", "amount": 42}, + evidence=provisional_evidence(_response()), + source_status=PUBLIC_FORM_SOURCE_STATUS, + ) + + assert "Reviewed evidence / authentic public form" in html + assert "Authentic public form · privacy-safe demo values · page 1" in html + assert "Authentic public form with privacy-safe demo values" in html + assert "synthetic fixture" not in html.lower() + assert "synthetic source" not in html.lower() + assert "customer data" not in html.lower() + assert "primary regions returned" in html + assert "source grounded" not in html + + +def test_reviewed_public_form_page_uses_primary_region_metric( + tmp_path: Path, +) -> None: + html = render_lighthouse_page( + title="Reviewed official form proof", + summary="Reviewed privacy-safe source verification", + document_name="Official Form 123", + document_image=b"stable-image-bytes", + expected={"name": "Alex Example", "amount": 42}, + evidence=_live_evidence(tmp_path, reviewed=True), + source_status=PUBLIC_FORM_SOURCE_STATUS, + ) + + assert ">Pass<" in html + assert "primary regions returned" in html + assert "source grounded" not in html + + +def test_only_reviewed_live_match_uses_an_unqualified_pass(tmp_path: Path) -> None: + unreviewed = _live_evidence(tmp_path / "unreviewed") + reviewed = _live_evidence(tmp_path / "reviewed", reviewed=True) + common = { + "title": "Live evidence state", + "summary": "Receipt-bound comparison", + "document_name": "Synthetic source", + "document_image": b"stable-image-bytes", + "expected": {"name": "Alex Example", "amount": 42}, + } + + unreviewed_html = render_lighthouse_page(evidence=unreviewed, **common) + reviewed_html = render_lighthouse_page(evidence=reviewed, **common) + + assert "LIVE MATCH · REVIEW REQUIRED" in unreviewed_html + assert ">Pass<" not in unreviewed_html + assert "background: var(--cobalt);" in unreviewed_html + assert ">Pass<" in reviewed_html + assert "background: var(--success);" in reviewed_html + + +def test_render_fails_closed_on_malformed_pages_metadata_and_image_types() -> None: + response = _response() + response["output"]["pages"][0]["width"] = float("nan") + with pytest.raises(LighthouseError, match="non-finite"): + provisional_evidence(response) + + response = _response(metadata={"name": _metadata_leaf(), "amount": _metadata_leaf(width=-1)}) + html = render_lighthouse_page( + title="Safe failure report", + summary="Malformed grounding remains visible as a mismatch.", + document_name="Synthetic source", + document_image=b"stable-image-bytes", + expected={"name": "Alex Example", "amount": 42}, + evidence=provisional_evidence(response), + ) + assert "INVALID_METADATA" in html + assert "Review blocked" in html + + with pytest.raises(LighthouseError, match="unsupported embedded image type"): + render_lighthouse_page( + title="Bad image", + summary="No external resources", + document_name="Synthetic source", + document_image=b"image", + image_mime="image/svg+xml", + expected={"name": "Alex Example", "amount": 42}, + evidence=provisional_evidence(_response()), + ) + + +def test_render_revalidates_receipt_bound_live_evidence(tmp_path: Path) -> None: + evidence = _live_evidence(tmp_path) + evidence._response["output"]["data"]["name"] = "tampered after receipt" + + with pytest.raises(LighthouseError, match="no longer matches its receipt"): + render_lighthouse_page( + title="Tampered cache", + summary="Must fail closed", + document_name="Synthetic source", + document_image=b"image", + expected={"name": "Alex Example", "amount": 42}, + evidence=evidence, + ) + + +def test_dataclass_fixture_builds_nested_oracle_without_response_input() -> None: + fixture = SyntheticFixture( + version=1, + slug="manual_fixture", + source_status="synthetic", + filename=Path("data/manual.pdf"), # type: ignore[arg-type] + title="Manual fixture", + subtitle="Source only", + page_width=612, + page_height=792, + fields=( + FixtureField(("items", 0, "code"), "Code", "A-1"), + FixtureField(("items", 1, "code"), "Code", "B-2"), + ), + ) + + assert expected_from_fixture(fixture) == { + "items": [{"code": "A-1"}, {"code": "B-2"}] + } diff --git a/tests/test_lighthouse_package_contract.py b/tests/test_lighthouse_package_contract.py new file mode 100644 index 0000000..ec600b8 --- /dev/null +++ b/tests/test_lighthouse_package_contract.py @@ -0,0 +1,706 @@ +from __future__ import annotations + +import hashlib +import json +import os +import shutil +from dataclasses import replace +from pathlib import Path +from typing import Any + +import pytest + +import common.lighthouse_package as lighthouse_package +import demos.prior_authorization.build_public_form as prior_authorization_builder +from common.lighthouse import ( + COMMITTED_CACHE_KEYS, + LighthouseError, + PUBLIC_FORM_SOURCE_STATUS, + build_synthetic_pdf, + committed_response_digest, + expected_from_fixture, + load_committed_live_evidence, + parse_fixture, +) +from common.lighthouse_package import ( + PackageConfig, + build_checker_parser, + build_generator_parser, + build_provisional_envelope, + checker_main, + generator_main, + live_evidence_paths, + load_document_config, + load_fixture_and_expected, +) +from demos.insurance_claim_intake.generate_demo import CONFIG as INSURANCE_CONFIG +from demos.mortgage_verification.generate_demo import CONFIG as MORTGAGE_CONFIG +from demos.prior_authorization.generate_demo import CONFIG as HEALTHCARE_CONFIG + + +PACKAGE_CONFIGS = (MORTGAGE_CONFIG, INSURANCE_CONFIG, HEALTHCARE_CONFIG) +OUTPUT_ARTIFACTS = ( + "provisional/evidence.json", + "provisional/output/source-page.png", + "provisional/output/comparison.json", + "provisional/output/index.html", +) + + +def _json(path: Path) -> Any: + return json.loads(path.read_text(encoding="utf-8")) + + +def _write_json(path: Path, value: Any) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text( + json.dumps(value, ensure_ascii=False, sort_keys=True, indent=2) + "\n", + encoding="utf-8", + ) + + +def test_prior_authorization_builder_checks_without_writing( + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, +) -> None: + output = tmp_path / "prior-authorization.pdf" + output.write_bytes(prior_authorization_builder.OUTPUT.read_bytes()) + before = output.read_bytes() + monkeypatch.setattr(prior_authorization_builder, "OUTPUT", output) + + assert prior_authorization_builder.build(check=True) == ( + prior_authorization_builder.DERIVED_SHA256 + ) + assert output.read_bytes() == before + + +def test_prior_authorization_builder_never_overwrites_on_digest_drift( + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, +) -> None: + output = tmp_path / "prior-authorization.pdf" + output.write_bytes(b"reviewed-input-must-survive") + monkeypatch.setattr(prior_authorization_builder, "OUTPUT", output) + monkeypatch.setattr(prior_authorization_builder, "DERIVED_SHA256", "0" * 64) + + with pytest.raises(ValueError, match="derived demo SHA-256 mismatch"): + prior_authorization_builder.build(check=False) + assert output.read_bytes() == b"reviewed-input-must-survive" + + +def _copy_config(tmp_path: Path, original: PackageConfig) -> PackageConfig: + destination = tmp_path / original.slug + destination.mkdir() + for filename in ("fixture.json", "docs.json", "expected.json"): + shutil.copy2(original.demo_dir / filename, destination / filename) + fixture = _json(original.demo_dir / "fixture.json") + relative_pdf = Path(fixture["document"]["filename"]) + copied_pdf = destination / relative_pdf + copied_pdf.parent.mkdir(parents=True, exist_ok=True) + shutil.copy2(original.demo_dir / relative_pdf, copied_pdf) + return replace(original, demo_dir=destination) + + +def _public_form_config( + tmp_path: Path, + *, + declared_width: int = 612, + declared_height: int = 792, +) -> PackageConfig: + slug = "public_form_demo" + demo_dir = tmp_path / slug + source_path = demo_dir / "data" / "privacy-safe-public-form.pdf" + source_path.parent.mkdir(parents=True) + generated_fixture = parse_fixture( + { + "version": 1, + "slug": slug, + "sourceStatus": "synthetic", + "document": { + "filename": "data/generated.pdf", + "title": "Test-only PDF", + "subtitle": "Package contract test source", + "width": 612, + "height": 792, + }, + "fields": [ + { + "path": ["applicant", "name"], + "label": "Applicant name", + "value": "Alex Example", + } + ], + } + ) + source_payload = build_synthetic_pdf(generated_fixture) + source_path.write_bytes(source_payload) + fixture_value = { + "version": 2, + "slug": slug, + "sourceStatus": PUBLIC_FORM_SOURCE_STATUS, + "document": { + "filename": "data/privacy-safe-public-form.pdf", + "title": "Official Form 123 demo", + "subtitle": "Authentic public form with privacy-safe demo values", + "width": declared_width, + "height": declared_height, + }, + "provenance": { + "publisher": "Example Public Agency", + "officialFormName": "Official Form 123", + "canonicalSourceUrl": "https://www.example.gov/forms/official-123.pdf", + "originalSha256": "1" * 64, + "sourceSha256": hashlib.sha256(source_payload).hexdigest(), + }, + "fields": [ + { + "path": ["applicant", "name"], + "label": "Applicant name", + "value": "Alex Example", + "source": { + "pageIndex": 0, + "bbox": {"x": 13, "y": 17, "width": 101, "height": 19}, + }, + } + ], + } + _write_json(demo_dir / "fixture.json", fixture_value) + fixture = parse_fixture(fixture_value, expected_slug=slug) + _write_json(demo_dir / "expected.json", expected_from_fixture(fixture)) + _write_json( + demo_dir / "docs.json", + [ + { + "id": slug, + "name": "Official Form 123", + "file": "data/privacy-safe-public-form.pdf", + "mode": "extract", + "schema": { + "type": "object", + "properties": { + "applicant": { + "type": "object", + "properties": {"name": {"type": "string"}}, + } + }, + }, + } + ], + ) + return PackageConfig( + demo_dir=demo_dir, + slug=slug, + page_title="Official public form proof", + provisional_summary="Offline public-form layout proof.", + live_summary="Live public-form evidence requires review.", + reviewed_summary="Reviewed public-form evidence.", + ) + + +def _hashes(config: PackageConfig) -> dict[str, str]: + return { + relative: hashlib.sha256((config.demo_dir / relative).read_bytes()).hexdigest() + for relative in OUTPUT_ARTIFACTS + } + + +class _NoEnvironmentAccess(dict[str, str]): + def get(self, key: str, default: Any = None) -> Any: + raise AssertionError(f"offline mode read environment key {key}") + + +@pytest.mark.parametrize("original", PACKAGE_CONFIGS, ids=lambda item: item.slug) +def test_provisional_generation_is_offline_exact_and_deterministic( + tmp_path: Path, + original: PackageConfig, +) -> None: + config = _copy_config(tmp_path, original) + + def forbidden_transport(*_args: Any, **_kwargs: Any) -> dict[str, Any]: + raise AssertionError("offline mode called the live transport") + + first_exit = generator_main( + config, + ["--provisional"], + transport=forbidden_transport, + environment=_NoEnvironmentAccess(), + ) + first_hashes = _hashes(config) + second_exit = generator_main( + config, + ["--provisional"], + transport=forbidden_transport, + environment=_NoEnvironmentAccess(), + ) + + assert first_exit == second_exit == 0 + assert first_hashes == _hashes(config) + assert not config.cache_dir.exists() + + envelope = _json(config.provisional_path) + assert set(envelope) == {"sourceStatus", "response"} + assert envelope["sourceStatus"] == "provisional-layout" + assert set(envelope["response"]) == COMMITTED_CACHE_KEYS + assert set(envelope["response"]["output"]) == {"data", "metadata", "pages"} + + artifact = _json(config.provisional_output_comparison_path) + assert set(artifact) == { + "artifactVersion", + "evidenceKind", + "evidenceLabel", + "reviewed", + "comparison", + } + assert artifact["artifactVersion"] == 1 + assert artifact["evidenceKind"] == "provisional" + assert artifact["reviewed"] is False + assert set(artifact["comparison"]) == { + "passed", + "exitCode", + "expectedLeaves", + "matchedLeaves", + "groundedLeaves", + "issues", + } + + html = config.provisional_output_html_path.read_text(encoding="utf-8") + assert "data:image/png;base64," in html + assert "http://" not in html + assert "https://" not in html + assert "PROVISIONAL LAYOUT MATCH · NO API CALL" in html + assert ">Pass<" not in html + assert "background: var(--citrus);" in html + assert "background: var(--success);" not in html + + +def test_public_form_uses_current_explicit_insurance_damage_box() -> None: + fixture, expected = load_fixture_and_expected(INSURANCE_CONFIG) + envelope = build_provisional_envelope(fixture, expected) + damage = envelope["response"]["output"]["metadata"]["federal_vehicle"][ + "damage" + ] + + assert damage == { + "pageIndex": 0, + "bbox": { + "x": 36.86, + "y": 196.6, + "width": 538.34, + "height": 12.31, + }, + } + assert damage["bbox"]["x"] + damage["bbox"]["width"] <= fixture.page_width + assert damage["bbox"]["y"] + damage["bbox"]["height"] <= fixture.page_height + + +@pytest.mark.parametrize("original", PACKAGE_CONFIGS, ids=lambda item: item.slug) +def test_provisional_commands_never_overwrite_reviewed_outputs( + tmp_path: Path, + original: PackageConfig, +) -> None: + config = _copy_config(tmp_path, original) + reviewed = { + config.output_image_path: b"reviewed-image", + config.output_comparison_path: b"reviewed-comparison", + config.output_html_path: b"reviewed-html", + } + for path, payload in reviewed.items(): + path.parent.mkdir(parents=True, exist_ok=True) + path.write_bytes(payload) + + assert generator_main(config, ["--provisional"]) == 0 + assert checker_main(config, ["--allow-provisional"]) == 0 + + assert all(path.read_bytes() == payload for path, payload in reviewed.items()) + assert config.provisional_output_image_path.is_file() + assert config.provisional_output_comparison_path.is_file() + assert config.provisional_output_html_path.is_file() + + +def test_public_form_provisional_uses_only_explicit_independent_boxes_and_copy( + tmp_path: Path, +) -> None: + config = _public_form_config(tmp_path) + fixture, expected = load_fixture_and_expected(config) + + envelope = build_provisional_envelope(fixture, expected) + source = envelope["response"]["output"]["metadata"]["applicant"]["name"] + assert source == { + "pageIndex": 0, + "bbox": {"x": 13.0, "y": 17.0, "width": 101.0, "height": 19.0}, + } + + assert generator_main( + config, + ["--provisional"], + transport=lambda *_args, **_kwargs: (_ for _ in ()).throw( + AssertionError("offline public-form mode called the live transport") + ), + environment=_NoEnvironmentAccess(), + ) == 0 + html = config.provisional_output_html_path.read_text(encoding="utf-8") + assert "Reviewed evidence / authentic public form" in html + assert "Authentic public form · privacy-safe demo values · page 1" in html + assert "customer data" not in html.lower() + assert "synthetic fixture" not in html.lower() + assert "primary regions returned" in html + assert "source grounded" not in html + + +def test_public_form_package_rejects_source_hash_and_page_dimension_drift( + tmp_path: Path, +) -> None: + hash_config = _public_form_config(tmp_path / "hash") + source_path = hash_config.demo_dir / "data" / "privacy-safe-public-form.pdf" + source_path.write_bytes(source_path.read_bytes() + b"\nmutated") + with pytest.raises(LighthouseError, match="sourceSha256"): + load_fixture_and_expected(hash_config) + + dimension_config = _public_form_config( + tmp_path / "dimensions", + declared_width=700, + ) + with pytest.raises(LighthouseError, match="dimensions do not exactly match"): + load_fixture_and_expected(dimension_config) + + +def test_public_form_checker_rejects_provisional_box_substitution( + tmp_path: Path, + capsys: pytest.CaptureFixture[str], +) -> None: + config = _public_form_config(tmp_path) + assert generator_main(config, ["--provisional"]) == 0 + envelope = _json(config.provisional_path) + envelope["response"]["output"]["metadata"]["applicant"]["name"]["bbox"][ + "x" + ] = 14 + _write_json(config.provisional_path, envelope) + + assert checker_main(config, ["--allow-provisional"]) == 1 + assert "does not exactly match its independent fixture values and source boxes" in ( + capsys.readouterr().err + ) + + +@pytest.mark.parametrize("original", PACKAGE_CONFIGS, ids=lambda item: item.slug) +def test_missing_live_evidence_exits_one_without_provisional_fallback( + tmp_path: Path, + capsys: pytest.CaptureFixture[str], + original: PackageConfig, +) -> None: + config = _copy_config(tmp_path, original) + + assert generator_main(config, ["--replay-live"]) == 1 + assert checker_main(config, []) == 1 + + captured = capsys.readouterr() + assert "No provisional fallback was used" in captured.err + assert not config.provisional_path.exists() + assert not config.output_html_path.exists() + + +def test_broad_live_response_is_projected_in_memory_and_mismatch_is_retained( + tmp_path: Path, +) -> None: + config = _copy_config(tmp_path, MORTGAGE_CONFIG) + fixture, expected = load_fixture_and_expected(config) + provisional = build_provisional_envelope(fixture, expected)["response"] + broad_data = json.loads(json.dumps(expected)) + broad_data["transport_visible_extra"] = "document-extra-preserved" + broad_metadata = json.loads(json.dumps(provisional["output"]["metadata"])) + broad_metadata["transport_visible_extra"] = { + "pageIndex": 0, + "bbox": {"x": 12, "y": 12, "width": 80, "height": 16}, + } + raw_marker = "RAW-ONLY-MARKER-MUST-NEVER-BE-WRITTEN" + broad_response = { + "status": 200, + "requestId": "request-broad-live-1", + "configuration": {"rawMarker": raw_marker}, + "metrics": {"rawMarker": raw_marker}, + "output": { + "data": broad_data, + "metadata": broad_metadata, + "pages": provisional["output"]["pages"], + "transportDebug": {"rawMarker": raw_marker}, + }, + "reconstructed": False, + "rawTopLevel": raw_marker, + } + + def fake_transport( + _pdf: bytes, + _filename: str, + _instructions: Any, + api_key: str, + ) -> dict[str, Any]: + assert api_key == "test-api-key-not-a-real-secret" + return broad_response + + exit_code = generator_main( + config, + ["--refresh"], + transport=fake_transport, + environment={"NUTRIENT_API_KEY": "test-api-key-not-a-real-secret"}, + ) + + assert exit_code == 1 + document = load_document_config(config, fixture) + response_path, receipt_path = live_evidence_paths(config, fixture, document) + cache = _json(response_path) + receipt = _json(receipt_path) + assert set(cache) == COMMITTED_CACHE_KEYS + assert set(cache["output"]) == {"data", "metadata", "pages"} + assert "configuration" not in cache + assert "metrics" not in cache + assert "rawTopLevel" not in cache + assert "transportDebug" not in cache["output"] + assert cache["output"]["data"]["transport_visible_extra"] == ( + "document-extra-preserved" + ) + assert receipt["requestId"] == cache["requestId"] + assert receipt["projectedResponseSha256"] == committed_response_digest(cache) + assert sorted(path.name for path in config.cache_dir.iterdir()) == sorted( + [response_path.name, receipt_path.name] + ) + assert raw_marker not in "".join( + path.read_text(encoding="utf-8", errors="ignore") + for path in config.demo_dir.rglob("*") + if path.is_file() + ) + + comparison = _json(config.output_comparison_path)["comparison"] + assert comparison["passed"] is False + assert comparison["exitCode"] == 1 + assert any( + issue["code"] == "UNEXPECTED" + and issue["path"] == "$.transport_visible_extra" + for issue in comparison["issues"] + ) + + +def test_live_replay_requires_request_and_digest_binding(tmp_path: Path) -> None: + config = _copy_config(tmp_path, HEALTHCARE_CONFIG) + fixture, expected = load_fixture_and_expected(config) + document = load_document_config(config, fixture) + response = build_provisional_envelope(fixture, expected)["response"] + response["requestId"] = "request-live-binding-1" + response_path, receipt_path = live_evidence_paths(config, fixture, document) + _write_json(response_path, response) + receipt = { + "receiptVersion": 1, + "sourceStatus": "live-refresh", + "requestId": response["requestId"], + "projectedResponseSha256": committed_response_digest(response), + } + _write_json(receipt_path, receipt) + + assert load_committed_live_evidence(response_path, receipt_path).kind == "live" + + receipt["requestId"] = "different-request" + _write_json(receipt_path, receipt) + with pytest.raises(LighthouseError, match="requestId does not match"): + load_committed_live_evidence(response_path, receipt_path) + + receipt["requestId"] = response["requestId"] + receipt["projectedResponseSha256"] = "0" * 64 + _write_json(receipt_path, receipt) + with pytest.raises(LighthouseError, match="digest does not match"): + load_committed_live_evidence(response_path, receipt_path) + + +def test_checker_retains_provisional_mismatch_and_exits_one( + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, +) -> None: + config = _copy_config(tmp_path, INSURANCE_CONFIG) + assert generator_main(config, ["--provisional"]) == 0 + exact_envelope = config.provisional_path.read_bytes() + original_loader = lighthouse_package.load_fixture_and_expected + + def load_with_changed_expected( + selected_config: PackageConfig, + ) -> tuple[Any, Any]: + fixture, expected = original_loader(selected_config) + changed_expected = json.loads(json.dumps(expected)) + changed_expected["other_vehicle"]["insurance"]["policy_number"] = ( + "WRONG-POLICY" + ) + return fixture, changed_expected + + monkeypatch.setattr( + lighthouse_package, + "load_fixture_and_expected", + load_with_changed_expected, + ) + + assert checker_main(config, ["--allow-provisional"]) == 1 + assert config.provisional_path.read_bytes() == exact_envelope + artifact = _json(config.provisional_output_comparison_path) + assert artifact["comparison"]["exitCode"] == 1 + assert any( + issue["code"] == "WRONG" + and issue["path"] == "$.other_vehicle.insurance.policy_number" + for issue in artifact["comparison"]["issues"] + ) + + +@pytest.mark.parametrize("original", PACKAGE_CONFIGS, ids=lambda item: item.slug) +def test_expected_fixture_drift_blocks_generator_and_checker_before_evidence( + tmp_path: Path, + capsys: pytest.CaptureFixture[str], + original: PackageConfig, +) -> None: + config = _copy_config(tmp_path, original) + config.expected_path.write_text("{}\n", encoding="utf-8") + + assert generator_main(config, ["--provisional"]) == 1 + assert checker_main(config, ["--allow-provisional"]) == 1 + captured = capsys.readouterr() + assert captured.err.count("expected.json does not exactly match") == 2 + assert not config.provisional_path.exists() + + +def _options(parser: Any) -> set[str]: + return { + option + for action in parser._actions + for option in action.option_strings + if option != "--help" and option != "-h" + } + + +@pytest.mark.parametrize("config", PACKAGE_CONFIGS, ids=lambda item: item.slug) +def test_all_packages_expose_only_the_normalized_cli_flags( + config: PackageConfig, +) -> None: + generator = build_generator_parser(config) + checker = build_checker_parser(config) + + assert _options(generator) == { + "--provisional", + "--refresh", + "--replay-live", + "--replay-reviewed", + } + assert _options(checker) == {"--allow-provisional", "--reviewed-live"} + with pytest.raises(SystemExit) as missing_mode: + generator.parse_args([]) + assert missing_mode.value.code == 2 + with pytest.raises(SystemExit): + generator.parse_args(["--provisional", "--refresh"]) + with pytest.raises(SystemExit): + checker.parse_args(["--allow-provisional", "--reviewed-live"]) + + +@pytest.mark.parametrize("config", PACKAGE_CONFIGS, ids=lambda item: item.slug) +def test_readme_uses_the_normalized_commands_and_preserves_no_fallback_language( + config: PackageConfig, +) -> None: + readme = (config.demo_dir / "README.md").read_text(encoding="utf-8") + relative_script = f"demos/{config.slug}" + + for command in ( + f"python3 {relative_script}/generate_demo.py --provisional", + f"python3 {relative_script}/check_expected.py --allow-provisional", + f"python3 {relative_script}/generate_demo.py --refresh", + f"python3 {relative_script}/check_expected.py", + f"python3 {relative_script}/generate_demo.py --replay-live", + f"python3 {relative_script}/generate_demo.py --replay-reviewed", + f"python3 {relative_script}/check_expected.py --reviewed-live", + ): + assert command in readme + assert "never fall back to provisional evidence" in readme + assert "--reviewed-replay" not in readme + assert "--replay-reviewed-live" not in readme + + +@pytest.mark.skipif( + os.environ.get("NUTRIENT_LIGHTHOUSE_PLAYWRIGHT") != "1", + reason=( + "set NUTRIENT_LIGHTHOUSE_PLAYWRIGHT=1 to run the opt-in local-browser " + "sticky-verdict regression" + ), +) +def test_playwright_mobile_provisional_verdict_stays_visible_after_card_scroll( + tmp_path: Path, +) -> None: + """Exercise the real 390x844 sticky containing block for all packages.""" + + try: + from playwright.sync_api import sync_playwright + except ImportError: + pytest.fail( + "NUTRIENT_LIGHTHOUSE_PLAYWRIGHT=1 requires an available Playwright " + "Python runtime and Chromium browser" + ) + + configs = [_copy_config(tmp_path, original) for original in PACKAGE_CONFIGS] + for config in configs: + assert generator_main(config, ["--provisional"]) == 0 + + def leaf_paths( + value: Any, + path: tuple[str | int, ...] = (), + ) -> list[tuple[str | int, ...]]: + if isinstance(value, dict) and value: + return [ + leaf + for key in sorted(value) + for leaf in leaf_paths(value[key], path + (key,)) + ] + if isinstance(value, list) and value: + return [ + leaf + for index, child in enumerate(value) + for leaf in leaf_paths(child, path + (index,)) + ] + return [path] + + def rendered_path(path: tuple[str | int, ...]) -> str: + result = "$" + for part in path: + if isinstance(part, int): + result += f"[{part}]" + elif part.isascii() and part.isidentifier(): + result += f".{part}" + else: + result += f"[{json.dumps(part, ensure_ascii=False)}]" + return result + + targets: list[tuple[PackageConfig, str]] = [] + for config in configs: + fixture, expected = load_fixture_and_expected(config) + assert fixture.source_status == PUBLIC_FORM_SOURCE_STATUS + current_leaf_paths = leaf_paths(expected) + assert len(current_leaf_paths) == len(fixture.fields) + targets.append((config, rendered_path(current_leaf_paths[-1]))) + + expected_verdict = "PROVISIONAL LAYOUT MATCH · NO API CALL" + viewport = {"width": 390, "height": 844} + + with sync_playwright() as playwright: + browser = playwright.chromium.launch(headless=True) + try: + page = browser.new_page(viewport=viewport) + for config, field_path in targets: + page.goto(config.provisional_output_html_path.as_uri(), wait_until="load") + card = page.locator(".field-card", has_text=field_path) + assert card.count() == 1, field_path + assert card.evaluate( + "element => element === element.parentElement.lastElementChild" + ) + card.scroll_into_view_if_needed() + page.wait_for_timeout(50) + + verdict = page.locator(".results-head .verdict") + assert verdict.inner_text().strip() == expected_verdict + assert verdict.is_visible() + bounds = verdict.bounding_box() + assert bounds is not None + assert 0 <= bounds["x"] + assert bounds["x"] + bounds["width"] <= viewport["width"] + assert 0 <= bounds["y"] + assert bounds["y"] + bounds["height"] <= viewport["height"] + finally: + browser.close() diff --git a/tests/test_lighthouse_packages.py b/tests/test_lighthouse_packages.py new file mode 100644 index 0000000..9a6a67b --- /dev/null +++ b/tests/test_lighthouse_packages.py @@ -0,0 +1,292 @@ +from __future__ import annotations + +import hashlib +import json +import re +from html.parser import HTMLParser +from pathlib import Path +from urllib.parse import parse_qs, urlparse + + +ROOT = Path(__file__).resolve().parents[1] +README = ROOT / "README.md" +HUB = ROOT / "docs" / "lighthouse" / "index.html" +VERTICAL_READMES = ( + ROOT / "demos" / "mortgage_verification" / "README.md", + ROOT / "demos" / "insurance_claim_intake" / "README.md", + ROOT / "demos" / "prior_authorization" / "README.md", +) +MEASUREMENT_ENUMS = { + "utm_campaign": {"de_lighthouse_pilot_v1"}, + "utm_source": {"nutrient_owned"}, + "utm_medium": {"owned"}, +} +VERTICALS = { + "mortgage_verification", + "insurance_claim_intake", + "prior_authorization", + "cross_vertical", +} +ASSETS = {"owned_hub"} +VARIANTS = {"v01"} +CTAS = {"github", "proof", "studio", "docs", "signup"} +PROOF_ASSETS = { + "mortgage-verification-reviewed.html": ( + ROOT / "demos" / "mortgage_verification" / "output" / "index.html" + ), + "insurance-claim-intake-reviewed.html": ( + ROOT / "demos" / "insurance_claim_intake" / "output" / "index.html" + ), + "prior-authorization-reviewed.html": ( + ROOT / "demos" / "prior_authorization" / "output" / "index.html" + ), +} +COMPARISONS = { + "mortgage_verification": { + "expectedLeaves": 8, + "groundedLeaves": 8, + "matchedLeaves": 6, + "issues": 2, + "passed": False, + "verdict": "Review blocked", + }, + "insurance_claim_intake": { + "expectedLeaves": 11, + "groundedLeaves": 11, + "matchedLeaves": 11, + "issues": 0, + "passed": True, + "verdict": "Pass", + }, + "prior_authorization": { + "expectedLeaves": 11, + "groundedLeaves": 11, + "matchedLeaves": 9, + "issues": 2, + "passed": False, + "verdict": "Review blocked", + }, +} +SCREENSHOTS = { + "lighthouse-hub-375.png", + "lighthouse-hub-414.png", + "lighthouse-hub-768.png", + "lighthouse-hub-1024.png", + "lighthouse-hub-1440.png", + "lighthouse-mortgage-desktop.png", + "lighthouse-mortgage-mobile.png", + "lighthouse-insurance-desktop.png", + "lighthouse-insurance-mobile.png", + "lighthouse-healthcare-desktop.png", + "lighthouse-healthcare-mobile.png", +} +DESIGN_ASSETS = { + "nutrient-logo.svg": ( + "c9102300d8cce70ed381f1775057fb72f5f874fafafde3efabdc82d8a0cbcb88" + ), +} + + +class _HubParser(HTMLParser): + def __init__(self) -> None: + super().__init__() + self.links: list[str] = [] + self.images: list[dict[str, str]] = [] + self.ids: set[str] = set() + + def handle_starttag( + self, + tag: str, + attrs: list[tuple[str, str | None]], + ) -> None: + values = {key: value or "" for key, value in attrs} + if values.get("id"): + self.ids.add(values["id"]) + if tag == "a" and values.get("href"): + self.links.append(values["href"]) + if tag == "img": + self.images.append(values) + + +def _sha256(path: Path) -> str: + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def _load_json(path: Path) -> object: + return json.loads(path.read_text(encoding="utf-8")) + + +def _parse_hub() -> tuple[str, _HubParser]: + html = HUB.read_text(encoding="utf-8") + parser = _HubParser() + parser.feed(html) + return html, parser + + +def test_hub_has_complete_local_reviewed_evidence() -> None: + html, parser = _parse_hub() + readme = README.read_text(encoding="utf-8") + + assert {"main", "evidence", "proofs", "limits"} <= parser.ids + assert "26/30" in html + assert "mortgage 6/8, insurance 11/11" in html + assert "healthcare 9/11" in html + assert "30/30" in html + assert "four mismatches were retained for review" in html + assert html.count('class="proof-verdict blocked">Review blocked') == 2 + assert ( + html.count( + 'class="proof-verdict pass">11/11 exact → Continue' + ) + == 1 + ) + assert html.count("Pricing and credit usage can change.") == 2 + assert "Review current pricing" in html + assert "11/11 exact → Continue" in readme + assert "Pricing and credit usage can change." in readme + for public_summary in (html, readme): + assert "72 credits" not in public_summary + assert "72-credit" not in public_summary + assert "not an accuracy,\n production, or performance benchmark" in html + assert "does not approve publication" in html + assert "Three of the four mismatches are exposed by returned metadata" in html + assert "clip the decisive final period" in html + assert "source-grounded" not in html.lower() + assert "semantically grounded" not in html.lower() + for vertical_readme in VERTICAL_READMES: + assert "source-grounded" not in vertical_readme.read_text( + encoding="utf-8" + ).lower() + assert "customer data" not in html.lower() + assert "30/30JSON values matched" not in html + assert not re.search(r"GMxy[A-Za-z0-9]+", html) + + for copied_name, reviewed_output in PROOF_ASSETS.items(): + copied = ROOT / "docs" / "lighthouse" / "assets" / copied_name + assert copied.is_file() + assert _sha256(copied) == _sha256(reviewed_output) + + aggregate = { + "expected": 0, + "grounded": 0, + "matched": 0, + "issues": 0, + } + for demo, expected in COMPARISONS.items(): + artifact = _load_json( + ROOT / "demos" / demo / "output" / "comparison.json" + ) + assert isinstance(artifact, dict) + assert artifact["evidenceKind"] == "live" + assert artifact["evidenceLabel"] == "REVIEWED LIVE API RESPONSE" + assert artifact["reviewed"] is True + comparison = artifact["comparison"] + assert comparison["expectedLeaves"] == expected["expectedLeaves"] + assert comparison["groundedLeaves"] == expected["groundedLeaves"] + assert comparison["matchedLeaves"] == expected["matchedLeaves"] + assert len(comparison["issues"]) == expected["issues"] + assert comparison["passed"] is expected["passed"] + aggregate["expected"] += comparison["expectedLeaves"] + aggregate["grounded"] += comparison["groundedLeaves"] + aggregate["matched"] += comparison["matchedLeaves"] + aggregate["issues"] += len(comparison["issues"]) + + proof_html = ( + ROOT / "demos" / demo / "output" / "index.html" + ).read_text(encoding="utf-8") + assert expected["verdict"] in proof_html + assert "primary regions returned" in proof_html + assert "source grounded" not in proof_html.lower() + + assert aggregate == { + "expected": 30, + "grounded": 30, + "matched": 26, + "issues": 4, + } + + screenshot_dir = ROOT / "docs" / "screenshots" + assert all((screenshot_dir / name).is_file() for name in SCREENSHOTS) + proof_images = [image for image in parser.images if image.get("loading")] + assert len(proof_images) == 3 + assert all(image.get("loading") == "eager" for image in proof_images) + assert all(image.get("alt", "").strip() for image in parser.images) + + +def test_hub_and_proofs_use_the_frozen_design_without_proprietary_fonts() -> None: + html, _ = _parse_hub() + design_source = (ROOT / "docs" / "lighthouse-design-source.md").read_text( + encoding="utf-8" + ) + + assert "71f76eb62384241e2cf18d76fd31020b95a0a1f6" in design_source + assert '"Avenir Next", Avenir, "Segoe UI"' in html + assert "ABC Monument" not in html + assert "assets/fonts/" not in html + assert "Website-v3 company theme" in html + assert 'src="assets/nutrient-logo.svg"' in html + assert ( + '' + ) in html + + deployed_assets = ROOT / "docs" / "lighthouse" / "assets" + for relative, expected_hash in DESIGN_ASSETS.items(): + asset = deployed_assets / relative + assert asset.is_file() + assert _sha256(asset) == expected_hash + + for reviewed_output in PROOF_ASSETS.values(): + proof_html = reviewed_output.read_text(encoding="utf-8") + assert '"Avenir Next", Avenir, "Segoe UI"' in proof_html + assert "font-src data:" not in proof_html + assert "data:font/" not in proof_html + assert "ABC Monument" not in proof_html + assert "Website-v3 visual layer" in proof_html + assert 'alt="Nutrient"' in proof_html + assert "max-height: none" in proof_html + + assert not (ROOT / "common" / "assets" / "fonts").exists() + assert not (deployed_assets / "fonts").exists() + + +def test_hub_links_follow_fixed_measurement_contract() -> None: + _, parser = _parse_hub() + campaign_links = [href for href in parser.links if "utm_campaign=" in href] + + assert len(campaign_links) == 10 + for href in campaign_links: + query = parse_qs(urlparse(href).query, strict_parsing=True) + assert set(query) == { + "utm_campaign", + "utm_source", + "utm_medium", + "utm_content", + } + for parameter, allowed in MEASUREMENT_ENUMS.items(): + assert set(query[parameter]) <= allowed + + content = query["utm_content"][0].split(".") + assert len(content) == 4 + vertical, asset, variant, cta = content + assert vertical in VERTICALS + assert asset in ASSETS + assert variant in VARIANTS + assert cta in CTAS + + +def test_hub_links_resolve_or_use_the_expected_public_hosts() -> None: + _, parser = _parse_hub() + external_hosts = set() + + for href in parser.links: + parsed = urlparse(href) + if parsed.scheme in {"http", "https"}: + external_hosts.add(parsed.netloc) + continue + if href.startswith("#"): + continue + local_path = (HUB.parent / parsed.path).resolve() + assert local_path.is_file(), href + + assert external_hosts == {"github.com", "www.nutrient.io", "dashboard.nutrient.io"} diff --git a/tests/test_render.py b/tests/test_render.py index 58fb6d8..63c0cc8 100644 --- a/tests/test_render.py +++ b/tests/test_render.py @@ -3,6 +3,7 @@ import pypdfium2 as pdfium import pytest +from pypdfium2 import raw from common import render @@ -49,6 +50,41 @@ def test_grounded_page_matches_committed_png_dimensions(tmp_path: Path) -> None: assert _png_dimensions(rendered_path) == (1700, 2200) +def _cms_rgba(*, may_draw_forms: bool) -> bytes: + document = pdfium.PdfDocument(GROUNDED_PDF) + document.init_forms() + page = None + bitmap = None + try: + page = document[0] + bitmap = page.render( + scale=1700 / page.get_size()[0], + may_draw_forms=may_draw_forms, + fill_color=(255, 255, 255, 255), + force_bitmap_format=raw.FPDFBitmap_BGRA, + rev_byteorder=True, + ) + return bytes(bitmap.buffer) + finally: + if bitmap is not None: + bitmap.close() + if page is not None: + page.close() + document.close() + + +def test_grounded_page_render_includes_acroform_values() -> None: + rendered, image_size = render._rasterize_page( + GROUNDED_PDF, + 0, + page_dims={"width": 1700, "height": 2200}, + ) + + assert image_size == (1700, 2200) + assert rendered == _cms_rgba(may_draw_forms=True) + assert rendered != _cms_rgba(may_draw_forms=False) + + def test_missing_api_dimensions_use_200_dpi_scale(tmp_path: Path) -> None: pdf_path = tmp_path / "points.pdf" rendered_path = tmp_path / "points.png" diff --git a/tests/test_reproducible_proof.py b/tests/test_reproducible_proof.py new file mode 100644 index 0000000..26d884c --- /dev/null +++ b/tests/test_reproducible_proof.py @@ -0,0 +1,134 @@ +from __future__ import annotations + +import json +import subprocess +import sys +from pathlib import Path + +from common.api import build_extract_instructions + + +REPO_ROOT = Path(__file__).resolve().parents[1] +DEMO_ROOT = REPO_ROOT / "demos" / "grounded_extraction" + + +def _load_json(path: Path) -> object: + with path.open(encoding="utf-8") as source_file: + return json.load(source_file) + + +def test_published_instructions_match_the_generator_contract() -> None: + configs = _load_json(DEMO_ROOT / "docs.json") + assert isinstance(configs, list) and len(configs) == 1 + config = configs[0] + assert isinstance(config, dict) + + expected = build_extract_instructions(config["mode"], config["schema"]) + + assert _load_json(DEMO_ROOT / "instructions.json") == expected + + +def test_proof_document_links_every_published_artifact() -> None: + proof = (REPO_ROOT / "docs" / "reproducible-proof.md").read_text( + encoding="utf-8" + ) + required_paths = ( + "demos/grounded_extraction/data/CMS-1500.pdf", + "demos/grounded_extraction/instructions.json", + "demos/grounded_extraction/expected.json", + "demos/grounded_extraction/check_expected.py", + "demos/grounded_extraction/output/index.html", + "demos/grounded_extraction/output/metadata.json", + ) + + for relative_path in required_paths: + assert (REPO_ROOT / relative_path).is_file() + assert relative_path in proof + + cache_files = list((DEMO_ROOT / "cache").glob("*.json")) + assert len(cache_files) == 1 + assert cache_files[0].relative_to(REPO_ROOT).as_posix() in proof + + assert "https://api.nutrient.io/extraction/extract" in proof + assert "python -m pytest -q" in proof + assert "python check_expected.py" in proof + + +def _run_checker(tmp_path: Path, mutate: str | None = None) -> subprocess.CompletedProcess[str]: + response = _load_json(DEMO_ROOT / "output" / "metadata.json") + assert isinstance(response, dict) + output = response["output"] + assert isinstance(output, dict) + + if mutate == "missing": + del output["data"]["patient_name"] + elif mutate == "wrong": + output["data"]["patient_name"] = "Wrong Person" + elif mutate == "ungrounded": + del output["metadata"]["patient_name"]["bbox"] + elif mutate == "wrong_page": + output["metadata"]["patient_name"]["pageIndex"] = 1 + elif mutate == "negative_origin": + output["metadata"]["patient_name"]["bbox"]["x"] = -1 + elif mutate == "outside_page": + output["metadata"]["patient_name"]["bbox"]["x"] = output["pages"][0][ + "width" + ] + elif mutate == "source_corrected": + for service_line in output["data"]["service_lines"]: + service_line["date_of_service_from"] = "07 10 26" + + response_path = tmp_path / "response.json" + response_path.write_text(json.dumps(response), encoding="utf-8") + return subprocess.run( + [ + sys.executable, + str(DEMO_ROOT / "check_expected.py"), + "--response", + str(response_path), + ], + check=False, + capture_output=True, + text=True, + ) + + +def test_checker_reports_known_wrong_dates_in_reviewed_response(tmp_path: Path) -> None: + result = _run_checker(tmp_path) + + assert result.returncode == 1 + assert ( + "WRONG $.service_lines[0].date_of_service_from: " + "expected '07 10 26', got '10 26 07'" + ) in result.stdout + assert ( + "WRONG $.service_lines[1].date_of_service_from: " + "expected '07 10 26', got '10 07'" + ) in result.stdout + + +def test_checker_accepts_a_source_corrected_response(tmp_path: Path) -> None: + result = _run_checker(tmp_path, "source_corrected") + + assert result.returncode == 0 + assert result.stdout.startswith("PASS:") + + +def test_checker_classifies_missing_wrong_and_ungrounded_fields( + tmp_path: Path, +) -> None: + for mutation, label in ( + ("missing", "MISSING $.patient_name"), + ("wrong", "WRONG $.patient_name"), + ("ungrounded", "UNGROUNDED $.patient_name"), + ): + result = _run_checker(tmp_path, mutation) + assert result.returncode == 1 + assert label in result.stdout + + +def test_checker_rejects_grounding_outside_the_declared_page(tmp_path: Path) -> None: + for mutation in ("wrong_page", "negative_origin", "outside_page"): + result = _run_checker(tmp_path, mutation) + assert result.returncode == 1 + assert "UNGROUNDED $.patient_name" in result.stdout diff --git a/tests/test_transports.py b/tests/test_transports.py index 48b8d2f..99d5b45 100644 --- a/tests/test_transports.py +++ b/tests/test_transports.py @@ -160,7 +160,7 @@ def test_parse_transport_pins_exact_multipart_request( assert captured == [ CapturedRequest( method="POST", - url="https://api.nutrient.io/parse", + url="https://api.nutrient.io/extraction/parse", headers={"Authorization": "Bearer transport-test-key"}, part_names=["file", "instructions"], file_name="appraisal.pdf",