import os from reportlab.lib.pagesizes import letter from reportlab.lib import colors from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, Preformatted, HRFlowable from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.pdfgen import canvas class NumberedCanvas(canvas.Canvas): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._saved_page_states = [] def showPage(self): self._saved_page_states.append(dict(self.__dict__)) self._startPage() def save(self): num = len(self._saved_page_states) for state in self._saved_page_states: self.__dict__.update(state) if self._pageNumber > 1: self.setFont("Helvetica-Bold", 8) self.setFillColor(colors.HexColor("#0F172A")) self.drawString(36, 756, "FORENSIC DATA AUDIT REPORT") self.drawRightString(576, 756, "AWS S3 & CLOUD API AUDIT") self.setStrokeColor(colors.HexColor("#CBD5E1")) self.setLineWidth(0.5) self.line(36, 748, 576, 748) self.setFont("Helvetica-Bold", 8) self.setFillColor(colors.HexColor("#991B1B")) self.drawString(36, 25, "CONFIDENTIAL") self.setFont("Helvetica", 8) self.setFillColor(colors.HexColor("#64748B")) self.drawString(100, 25, "- FOR JUDICIAL & ADMINISTRATIVE REVIEW ONLY") self.drawRightString(576, 25, f"Page {self._pageNumber} of {num}") self.setStrokeColor(colors.HexColor("#CBD5E1")) self.setLineWidth(0.5) self.line(36, 36, 576, 36) super().showPage() super().save() def create_pdf(fn="Forensic_Data_Audit_Report.pdf"): doc = SimpleDocTemplate(fn, pagesize=letter, leftMargin=36, rightMargin=36, topMargin=54, bottomMargin=54) NAVY, SLATE, BLUE = colors.HexColor("#0F172A"), colors.HexColor("#1E293B"), colors.HexColor("#0284C7") BG, BORDER = colors.HexColor("#F8FAFC"), colors.HexColor("#E2E8F0") st = getSampleStyleSheet() title_st = ParagraphStyle('T', parent=st['Normal'], fontName='Helvetica-Bold', fontSize=13, leading=16, textColor=NAVY) h1_st = ParagraphStyle('H1', parent=st['Normal'], fontName='Helvetica-Bold', fontSize=10, leading=13, textColor=NAVY, spaceBefore=8, spaceAfter=3) h2_st = ParagraphStyle('H2', parent=st['Normal'], fontName='Helvetica-Bold', fontSize=8.5, leading=11, textColor=BLUE, spaceBefore=6, spaceAfter=2) body_st = ParagraphStyle('B', parent=st['Normal'], fontName='Helvetica', fontSize=7.5, leading=10, textColor=NAVY) bullet_st = ParagraphStyle('BU', parent=body_st, leftIndent=8, firstLineIndent=-5, spaceAfter=2) code_st = ParagraphStyle('C', parent=st['Normal'], fontName='Courier', fontSize=6, leading=8, textColor=NAVY) cell_st = ParagraphStyle('TC', parent=st['Normal'], fontName='Helvetica', fontSize=6.5, leading=8.5, textColor=NAVY) th_st = ParagraphStyle('THC', parent=st['Normal'], fontName='Helvetica-Bold', fontSize=6.5, leading=8.5, textColor=colors.white) def tbl(hdrs, rows, w): hr = [Paragraph(h, th_st) for h in hdrs] rw = [[Paragraph(str(c), cell_st) for c in r] for r in rows] t = Table([hr] + rw, colWidths=w) t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,0), SLATE), ('VALIGN', (0,0), (-1,-1), 'TOP'), ('PADDING', (0,0), (-1,-1), 3), ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.white, BG]), ('GRID', (0,0), (-1,-1), 0.5, BORDER) ])) return t def box(txt): p = Preformatted(txt.strip(), code_st) t = Table([[p]], colWidths=[540]) t.setStyle(TableStyle([('BACKGROUND', (0,0), (-1,-1), BG), ('BOX', (0,0), (-1,-1), 0.5, BORDER), ('PADDING', (0,0), (-1,-1), 4)])) return t story = [ Paragraph("FORENSIC DATA AUDIT REPORT & CLOUD EXPLOITATION ANALYSIS", title_st), HRFlowable(width="100%", thickness=1, color=NAVY, spaceAfter=6), box(''), Spacer(1, 6), Paragraph("Executive Summary & Scope", h1_st), Paragraph("Commercial background checks, real estate aggregators, and benefit verification engines rely on automated scrapers, APIs, and cloud storage[span_0](start_span)[span_0](end_span)[span_1](start_span)[span_1](end_span)[span_2](start_span)[span_2](end_span). Unverified municipal court entries or corrupt employer SUTA payroll feeds propagate across search engines and paywalled portals[span_3](start_span)[span_3](end_span)[span_4](start_span)[span_4](end_span).", body_st), box("[Municipal Dockets / SUTA Feeds] -> [Scrapers/Crawlers] -> [GCS & AWS S3 Storage]\n |\n[Streamlit Curation] <-> [AWS Boto3 HeadObject] <-> [S3 REST API / XML]"), Spacer(1, 6), Paragraph("Forensic Findings Matrix", h1_st), Paragraph("1. Municipal Court Dockets", h2_st), tbl(["Identifier", "Court/Entity", "Status & Financial Context", "Forensic Impact"], [ ["Case UC-70001632[span_5](start_span)[span_5](end_span)", "Beaverton Municipal[span_6](start_span)[span_6](end_span)", "Misdemeanor DWS; $2,000 fine; $50/mo plan signed Aug 17, 2026[span_7](start_span)[span_7](end_span).", "Primary record; active compliance under Judge Britton[span_8](start_span)[span_8](end_span)."], ["Case UC-70001129[span_9](start_span)[span_9](end_span)", "Beaverton Municipal[span_10](start_span)[span_10](end_span)", "Show Cause Notice July 24, 2020 for alleged non-payment[span_11](start_span)[span_11](end_span).", "Administrative notice via collection delay[span_12](start_span)[span_12](end_span)."], ["Case D090386M[span_13](start_span)[span_13](end_span)", "WA County Circuit[span_14](start_span)[span_14](end_span)", "Unlawful Entry / Theft 2nd ($805.00 balance)[span_15](start_span)[span_15](end_span).", "Expungement blocked due to unpaid balance[span_16](start_span)[span_16](end_span)."], ["Case D090221M[span_17](start_span)[span_17](end_span)", "WA County Circuit[span_18](start_span)[span_18](end_span)", "Giving False Info / Theft ($626.60 balance)[span_19](start_span)[span_19](end_span).", "Expungement blocked due to unpaid balance[span_20](start_span)[span_20](end_span)."], ["Account 6673873[span_21](start_span)[span_21](end_span)[span_22](start_span)[span_22](end_span)", "Professional Credit Service[span_23](start_span)[span_23](end_span)[span_24](start_span)[span_24](end_span)", "$1,253.06 consolidated debt collection (PIN: 40107)[span_25](start_span)[span_25](end_span)[span_26](start_span)[span_26](end_span).", "Consolidated multi-county court fees[span_27](start_span)[span_27](end_span)[span_28](start_span)[span_28](end_span)."] ], [90, 110, 170, 170]), Spacer(1, 4), Paragraph("2. Corporate Payroll & SUTA Dumping", h2_st), tbl(["UI Identifier", "Source Agency", "Reported vs. Actual", "Contamination Mechanism"], [ ["Claim 001-2036078[span_29](start_span)[span_29](end_span)", "OED[span_30](start_span)[span_30](end_span)", "Claimant ID: 0001-0020031[span_31](start_span)[span_31](end_span).", "Master UI claim file[span_32](start_span)[span_32](end_span)."], ["Letter L0014056337[span_33](start_span)[span_33](end_span)", "OED / Frances[span_34](start_span)[span_34](end_span)", "$49,682.61 reported vs $58,599.71 actual[span_35](start_span)[span_35](end_span).", "Wage suppressed by $8,917.10 via YTD reset[span_36](start_span)[span_36](end_span)."], ["Letter L0014657611[span_37](start_span)[span_37](end_span)", "OED / Frances[span_38](start_span)[span_38](end_span)", "Declared paid thru Nov 30 during active Dec review[span_39](start_span)[span_39](end_span).", "False payment notice masking frozen status[span_40](start_span)[span_40](end_span)."] ], [95, 110, 165, 170]), Spacer(1, 4), Paragraph("3. Real Estate & Geospatial Mismatches", h2_st), tbl(["Element", "Declared Value", "API Endpoint / Payload", "Anomaly & Fraud Indicator"], [ ["Parcel APN[span_41](start_span)[span_41](end_span)[span_42](start_span)[span_42](end_span)", "1S1E03AA 03800[span_43](start_span)[span_43](end_span)[span_44](start_span)[span_44](end_span)", "Multnomah County Assessor[span_45](start_span)[span_45](end_span)[span_46](start_span)[span_46](end_span)", "GEOID: 41051001101 (Tract 11.01)[span_47](start_span)[span_47](end_span)."], ["Coordinates[span_48](start_span)[span_48](end_span)[span_49](start_span)[span_49](end_span)", "45.517063, -122.665537[span_50](start_span)[span_50](end_span)[span_51](start_span)[span_51](end_span)", "Maps API: 45.5170175, -122.6448472[span_52](start_span)[span_52](end_span)[span_53](start_span)[span_53](end_span)", "1.05-mile spatial variance[span_54](start_span)[span_54](end_span)[span_55](start_span)[span_55](end_span)."], ["Street View[span_56](start_span)[span_56](end_span)[span_57](start_span)[span_57](end_span)", "66 SE Morrison St[span_58](start_span)[span_58](end_span)[span_59](start_span)[span_59](end_span)", "Street View: 2026 SE Morrison St[span_60](start_span)[span_60](end_span)[span_61](start_span)[span_61](end_span)", "Mapped 19 blocks offset[span_62](start_span)[span_62](end_span)[span_63](start_span)[span_63](end_span)."], ["Tax History[span_64](start_span)[span_64](end_span)[span_65](start_span)[span_65](end_span)", "Duplicate 2020 Entries[span_66](start_span)[span_66](end_span)[span_67](start_span)[span_67](end_span)", "DOM Render / Scraped Feed[span_68](start_span)[span_68](end_span)", "2020 listed twice ($696 vs $788)[span_69](start_span)[span_69](end_span)[span_70](start_span)[span_70](end_span)."] ], [85, 115, 170, 170]), Spacer(1, 6), Paragraph("AWS & S3 Metadata Deep Dive", h1_st), box("XML Namespace: http://doc.s3.amazonaws.com/2006-03-01\nBucket: sex-offenders-images-v3\nPagination: AK18134108399901.jpeg (true)\nAnomalies: AK11610.jpeg & AK144027898482835015.jpeg (712,240 Bytes / 695.55 KB)"), Spacer(1, 4), Paragraph("AWS Boto3 HeadObject Protocol", h2_st), box("import boto3\ndef extract_s3_meta(bucket, key):\n s3 = boto3.client('s3')\n res = s3.head_object(Bucket=bucket, Key=key)\n return {'Key': key, 'Length': res.get('ContentLength'), 'ETag': res.get('ETag'), 'Meta': res.get('Metadata')}"), Spacer(1, 6), Paragraph("Statutory Violation Matrix", h1_st), tbl(["Statute", "Target", "Violative Vector", "Enforcement"], [ ["18 U.S.C. § 1343\n(Wire Fraud)[span_71](start_span)[span_71](end_span)[span_72](start_span)[span_72](end_span)[span_73](start_span)[span_73](end_span)", "Data Brokers[span_74](start_span)[span_74](end_span)", "Selling corrupted real estate/criminal reports via payment gateways[span_75](start_span)[span_75](end_span).", "Indictment; 18 U.S.C. § 981 Civil Forfeiture[span_76](start_span)[span_76](end_span)."], ["ORS 657.480\n(SUTA Dumping)[span_77](start_span)[span_77](end_span)", "ASM LLC[span_78](start_span)[span_78](end_span)", "Entity switch resetting YTD wages to $0 to evade UI tax rates[span_79](start_span)[span_79](end_span).", "OED Re-assignment; BOLI Claims; IRS Form 3949-A[span_80](start_span)[span_80](end_span)."], ["ORS 646.608\n(Oregon UTPA)[span_81](start_span)[span_81](end_span)", "Aggregators[span_82](start_span)[span_82](end_span)", "Publishing deceptive coordinates and false street view labels[span_83](start_span)[span_83](end_span)[span_84](start_span)[span_84](end_span).", "OR DOJ Consumer Action; ORS 646.638 damages[span_85](start_span)[span_85](end_span)."], ["18 U.S.C. § 7(6)\n(SMTJ Venue)[span_86](start_span)[span_86](end_span)", "Cloud Hosts[span_87](start_span)[span_87](end_span)", "Routing wire transfers and scraped feeds across LEO satellites/APIs[span_88](start_span)[span_88](end_span)[span_89](start_span)[span_89](end_span)[span_90](start_span)[span_90](end_span).", "Establishes federal criminal venue in US District Court[span_91](start_span)[span_91](end_span)."] ], [90, 85, 185, 180]), Spacer(1, 4), Paragraph("Judicial Remediation Plan", h2_st), Paragraph("- FCRA Dispute: Submit 15 U.S.C. § 1681i direct disputes attaching Beaverton Payment Plan signed Aug 17, 2026[span_92](start_span)[span_92](end_span)[span_93](start_span)[span_93](end_span).", bullet_st), Paragraph("- S3 Suppression: Serve DELETE demands on GCS/S3 bucket admins hosting sex-offenders-images-v3 keys[span_94](start_span)[span_94](end_span)[span_95](start_span)[span_95](end_span).", bullet_st), Paragraph("- BOLI / IRS Filings: Submit BOLI wage claim for 471 Q2 hours & IRS Form 3949-A for May 16, 2025 SUTA swap[span_96](start_span)[span_96](end_span).", bullet_st), Paragraph("- DOJ Seizure Motion: Submit audit to US Attorney for 18 U.S.C. § 981 forfeiture against fraud gateways[span_97](start_span)[span_97](end_span)[span_98](start_span)[span_98](end_span).", bullet_st) ] doc.build(story, canvasmaker=NumberedCanvas) if __name__ == "__main__": create_pdf()