diff --git a/gen_mindmap.py b/gen_mindmap.py
deleted file mode 100644
index 7e83176..0000000
--- a/gen_mindmap.py
+++ /dev/null
@@ -1,1648 +0,0 @@
-"""
-RealRate radial mindmap — universal generator
-Usage:
- python gen_mindmap.py # TriLinc Global Impact Fund (default)
- python gen_mindmap.py trilinc # TriLinc Global Impact Fund
- python gen_mindmap.py strata # Strata Critical Medical Inc
- python gen_mindmap.py hp # HP Inc.
- python gen_mindmap.py angi # Angi Inc.
- python gen_mindmap.py nvidia # Nvidia Corp.
- python gen_mindmap.py harley # Harley Davidson INC
-"""
-import sys, math, base64, re, requests, urllib3, time, os
-from pathlib import Path
-from PIL import Image as _PIL
-from playwright.sync_api import sync_playwright
-
-urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
-
-# ── Company selection ──────────────────────────────────────────────────────────
-COMPANY = sys.argv[1].lower() if len(sys.argv) > 1 else "trilinc"
-if COMPANY not in ("trilinc", "strata", "hp", "angi", "nvidia", "tesla", "apple", "harley"):
- print(f"Unknown company '{COMPANY}'. Use: trilinc, strata, hp, angi, nvidia, tesla, apple, harley"); sys.exit(1)
-
-# ── Constants ──────────────────────────────────────────────────────────────────
-W, H = 1920, 1080
-F = "'Manrope',Segoe UI,Helvetica Neue,Arial,sans-serif"
-BG = "#050B18"; GREY="#AFAFAF"; WH="#FFFFFF"
-AMBER="#F59E0B"; CYAN="#3DBACD"; LIME="#86EF60"; SKY="#60A5FA"
-EMER="#34D399"; PINK="#F472B6"; PURP="#A78BFA"; ORAN="#FB923C"
-TBLUE="#2563EB"; TAQUA="#0891B2"
-_ACCENT_BY_COMPANY = {
- "trilinc": EMER, "strata": SKY, "tesla": SKY, "angi": PINK,
- "nvidia": LIME, "harley": AMBER, "apple": ORAN,
-}
-ACCENT = _ACCENT_BY_COMPANY.get(COMPANY, CYAN)
-
-CACHE_DIR = Path(__file__).parent / "img_cache"
-CACHE_DIR.mkdir(exist_ok=True)
-
-HDRS = {
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36",
- "Referer": "https://en.wikipedia.org/",
- "Accept": "image/webp,image/jpeg,image/*,*/*;q=0.8",
- "Accept-Language": "en-US,en;q=0.9",
-}
-
-# ── Utilities ──────────────────────────────────────────────────────────────────
-def verify_ranking_url(industry_slug, fallback_year):
- try:
- hdrs = {"User-Agent": HDRS["User-Agent"], "Accept-Language": "en-US,en;q=0.9"}
- r = requests.get("https://realrate.ai/rankings", timeout=20, headers=hdrs, verify=False)
- r.raise_for_status()
- hits = re.findall(r'/rankings/([\w]+)/(\d{4})', r.text)
- matches = [(slug, yr) for slug, yr in hits if industry_slug in slug]
- if matches:
- slug, yr = max(matches, key=lambda x: x[1])
- url = f"https://realrate.ai/rankings/{slug}/{yr}"
- print(f" Ranking URL verified: {url}")
- return url
- except Exception as e:
- print(f" Warning: rankings page fetch failed — {e}")
- fallback = f"https://realrate.ai/rankings/{industry_slug}/{fallback_year}"
- print(f" Ranking URL (fallback): {fallback}")
- return fallback
-
-def raster_mime(d):
- if d[:5] == 'iVBOR': return 'image/png'
- if d[:5] == 'UklGR': return 'image/webp'
- if d[:4] == '/9j/': return 'image/jpeg'
- return None
-
-def is_raster_b64(d):
- return raster_mime(d) is not None
-
-def cache_path(url, suffix=".cache"):
- return CACHE_DIR / (base64.urlsafe_b64encode(url.encode()).decode()[:80] + suffix)
-
-def fetch_b64(url):
- cf = cache_path(url)
- if cf.exists():
- d = cf.read_text()
- if is_raster_b64(d):
- return d
- print(f" Cache invalid, re-fetching {url[-50:]}")
- cf.unlink()
- time.sleep(1.2)
- r = requests.get(url, timeout=30, headers=HDRS, verify=False)
- r.raise_for_status()
- d = base64.b64encode(r.content).decode()
- if not is_raster_b64(d):
- raise ValueError(f"Not a raster image: {url[-40:]}")
- cf.write_text(d)
- return d
-
-def wiki_image_url(article_title, thumb_size=400):
- api = "https://en.wikipedia.org/w/api.php"
- params = {"action":"query","titles":article_title,"prop":"pageimages",
- "pithumbsize":thumb_size,"format":"json","formatversion":"2"}
- r = requests.get(api, params=params, headers=HDRS, verify=False, timeout=20)
- r.raise_for_status()
- pages = r.json().get("query",{}).get("pages",[])
- if pages and "thumbnail" in pages[0]:
- return pages[0]["thumbnail"]["source"]
- return None
-
-def try_wiki(article_titles, label, size=400):
- for title in article_titles:
- try:
- time.sleep(1.2)
- url = wiki_image_url(title, size)
- if not url:
- print(f" {label} '{title}' — no image found"); continue
- d = fetch_b64(url)
- print(f" {label} OK [{title}]"); return d
- except Exception as e:
- print(f" {label} '{title}' fail: {e}")
- return None
-
-def try_fetch(urls, label):
- for url in urls:
- try:
- d = fetch_b64(url); print(f" {label} OK"); return d
- except Exception as e: print(f" {label} ..{url[-40:]} fail: {e}")
- return None
-
-# ── Ranking URL ────────────────────────────────────────────────────────────────
-print("Verifying ranking URL…")
-_ranking_cfg = {
- "trilinc": ("us_finance_services", "2025"),
- "strata": ("us_air", "2026"),
- "hp": ("us_computers", "2025"),
- "angi": ("us_advertising", "2025"),
- "nvidia": ("us_semiconductors", "2026"),
- "tesla": ("us_motor", "2026"),
- "apple": ("us_computers", "2025"),
- "harley": ("us_motor", "2026"),
-}
-RANKING_URL = verify_ranking_url(*_ranking_cfg[COMPANY])
-
-# ── Assets ────────────────────────────────────────────────────────────────────
-print("Fetching assets…")
-
-RL_PATH = Path(__file__).parent.parent / "RealRate Logos" / "RealRate_logo_horizontal.png"
-RL_D = base64.b64encode(RL_PATH.read_bytes()).decode() if RL_PATH.exists() else None
-print(" RealRate logo:", "OK" if RL_D else "MISSING")
-
-LOGO_SVG_D = None # SVG logo data (base64) — used when PNG logo unavailable
-
-if COMPANY == "trilinc":
- B1_D = try_fetch(["https://www.trilincglobal.com/wp-content/uploads/2023/05/gloria-website-photo.jpg"],
- "Gloria Nelund") or try_wiki(["Gloria Nelund","TriLinc Global Impact Fund"], "Gloria Nelund")
- B2_D = try_wiki(["Sustainable Development Goals","Social finance","Microfinance"], "Fund Overview")
- B6_D = try_wiki(["Developing country","Sub-Saharan Africa"], "Globe/Impact")
- LOGO_D = None
-
-elif COMPANY == "strata":
- B1_D = try_wiki(["Air ambulance","Air medical services","Medical evacuation"], "Air Medical")
- B2_D = try_wiki(["Critical care medicine","Intensive care medicine","Emergency medical services"], "Company Overview")
- B6_D = try_wiki(["Helicopter","Aviation medicine","Emergency medicine"], "Helicopter")
- LOGO_D = try_fetch(["https://www.realrate-archive.com/us_air/logos/0001779128_256x256.png"], "Strata logo")
-
-elif COMPANY == "hp":
- B1_D = try_wiki(["Enrique Lores","HP Inc."], "Enrique Lores")
- B2_D = try_wiki(["HP Inc.","Hewlett-Packard"], "HP Overview")
- B6_D = try_wiki(["AI PC","HP LaserJet","Personal computer"], "HP Strategy")
- LOGO_D = try_fetch(["https://www.realrate-archive.com/us_computers/logos/0000047217_256x256.png"], "HP logo")
-
-elif COMPANY == "angi":
- B1_D = try_wiki(["Jeff Kip","Angi Inc.","HomeAdvisor"], "Jeff Kip / Angi")
- B2_D = try_wiki(["Angi Inc.","HomeAdvisor","Home services"], "Angi Overview")
- B6_D = try_wiki(["Home improvement","Home repair","Handyman"], "Highlights")
- LOGO_D = try_fetch(["https://www.realrate-archive.com/us_advertising/logos/0001707092_256x256.png"], "Angi logo")
-
-elif COMPANY == "nvidia":
- B1_D = try_wiki(["Jensen Huang","Nvidia"], "Jensen Huang")
- B2_D = try_wiki(["Nvidia","Nvidia Headquarters"], "Nvidia Overview")
- B6_D = None # AI Leadership uses svg_neural icon
- LOGO_D = try_fetch([
- "https://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Nvidia_logo.svg/320px-Nvidia_logo.svg.png",
- "https://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Nvidia_logo.svg/640px-Nvidia_logo.svg.png",
- ], "Nvidia logo")
- NV_GPU_D = try_wiki(["Hopper (microarchitecture)","Blackwell (microarchitecture)","Nvidia GPU","GeForce RTX 4090"], "GPU chip image")
- NV_DC_D = try_wiki(["Data center","Server room","Cloud computing"], "Data center image")
-
-elif COMPANY == "tesla":
- B1_D = try_wiki(["Elon Musk","Tesla Motors"], "Elon Musk")
- B2_D = try_wiki(["Tesla Inc.","Tesla Gigafactory Shanghai","Tesla Model Y"], "Tesla Overview")
- B6_D = try_wiki(["Tesla Cybertruck","Tesla Model Y","Tesla Model 3"], "Tesla Car")
- LOGO_D = None
- svg_local = Path(__file__).parent / "Tesla Inc" / "tesla_t_logo.svg"
- svg_url = "https://upload.wikimedia.org/wikipedia/commons/b/bd/Tesla_Motors.svg"
- svg_cf = cache_path(svg_url, ".svgcache")
- if svg_local.exists():
- LOGO_SVG_D = base64.b64encode(svg_local.read_bytes()).decode()
- print(" Tesla SVG logo OK (local)")
- elif svg_cf.exists():
- LOGO_SVG_D = svg_cf.read_text(); print(" Tesla SVG logo OK (cached)")
- else:
- LOGO_D = try_fetch([
- "https://www.tesla.com/apple-touch-icon.png",
- "https://digitalassets.tesla.com/tesla-contents/image/upload/Logomark_Red_RGB.png",
- "https://logo.clearbit.com/tesla.com",
- ], "Tesla logo PNG")
- if not LOGO_D:
- try:
- time.sleep(1.2)
- r = requests.get(svg_url, timeout=30, headers=HDRS, verify=False)
- r.raise_for_status()
- if b''
- f''
- f''
- f''
- f'')
-
-def svg_leaf(cx, cy, col):
- return (f''
- f''
- f''
- f'')
-
-def svg_handshake(cx, cy, col):
- return (f''
- f''
- f''
- f'')
-
-def svg_helicopter(cx, cy, col):
- return (f''
- f''
- f''
- f''
- f''
- f''
- f''
- f''
- f'')
-
-def svg_cross(cx, cy, col):
- return (f''
- f'')
-
-def svg_growth(cx, cy, col):
- return (f''
- f''
- f'')
-
-def svg_house(cx, cy, col):
- return (f''
- f''
- f'')
-
-def svg_wrench(cx, cy, col):
- return (f''
- f''
- f'')
-
-def svg_chip(cx, cy, col):
- return (
- f''
- f''
- f''
- f''
- f''
- f''
- f''
- f''
- f''
- f''
- )
-
-def svg_neural(cx, cy, col):
- inp = [(cx-17, cy-10), (cx-17, cy), (cx-17, cy+10)]
- hid = [(cx, cy-7), (cx, cy+7)]
- out = [(cx+17, cy)]
- svg = ""
- for ix,iy in inp:
- for hx,hy in hid:
- svg += f''
- for hx,hy in hid:
- for ox,oy in out:
- svg += f''
- for nx,ny in inp:
- svg += f''
- for nx,ny in hid:
- svg += f''
- for nx,ny in out:
- svg += f''
- return svg
-
-def svg_trend(cx, cy, col, label="ECR"):
- return (f''
- f''
- f'{label}')
-
-def svg_car(cx, cy, col):
- return (
- f''
- f''
- f''
- f''
- f''
- )
-
-def svg_bolt(cx, cy, col):
- return (
- f''
- )
-
-def svg_motorcycle(cx, cy, col):
- return (
- f''
- f''
- f''
- f''
- f''
- f''
- )
-
-# ── Reusable SVG component builders ───────────────────────────────────────────
-def ecr_gauge(cx, cy, ecr_val, ecr_max, status, col=None):
- arc_r = 36
- c = col or LIME
- ea = (-math.pi/2) + 2*math.pi*min(ecr_val/ecr_max, 0.95)
- return (
- f''
- f''
- f'ECR'
- f'{ecr_val}%'
- f'{status}'
- )
-
-def balance_sheet_svg(cx, cy, assets_label):
- return (
- f'BALANCE SHEET'
- + "".join(f'' for i,h in enumerate([24,28,8,12,6]))
- + f'{assets_label}'
- )
-
-def pie_svg(cx, cy, r, segments, center_label, fsize=13):
- sa = -math.pi/2
- svg = ""
- for pct, sc in segments:
- sw = 2*math.pi*pct/100; ea = sa+sw
- x1 = cx+r*math.cos(sa); y1 = cy+r*math.sin(sa)
- x2 = cx+r*math.cos(ea); y2 = cy+r*math.sin(ea)
- svg += f''
- sa = ea
- svg += f''
- svg += f'{center_label}'
- return svg
-
-def ecr_drivers_svg(cx, cy, plus_label, minus_label, ecr_pct, status, col=None):
- c = col or EMER
- return (
- f'ECR DRIVERS'
- f''
- f'{plus_label}'
- f''
- f'{minus_label}'
- f'{ecr_pct}'
- f'{status}'
- )
-
-# ── Shared helpers ─────────────────────────────────────────────────────────────
-def cedge(cx,cy,r,tx,ty):
- angle = math.atan2(ty-cy, tx-cx)
- return int(cx+r*math.cos(angle)), int(cy+r*math.sin(angle))
-
-def ico(kind,x,y,col):
- cx,cy=x+10,y+10
- if kind=="clock":
- return (f''
- f''
- f'')
- if kind=="star":
- pts=[]
- for i in range(10):
- a_=math.pi*i/5-math.pi/2; r_=8 if i%2==0 else 3.5
- pts.append(f"{cx+r_*math.cos(a_):.1f},{cy+r_*math.sin(a_):.1f}")
- return f''
- if kind=="chart":
- bars=[(x,y+12,3,8),(x+4,y+6,3,14),(x+8,y+2,3,18),(x+12,y+7,3,13),(x+16,y+4,3,16)]
- return "".join(f'' for bx,by,bw,bh in bars)
- if kind=="trending":
- return (f''
- f'')
- if kind=="globe":
- return (f''
- f''
- f'')
- if kind=="building":
- return (f''
- f''
- f''
- f'')
- if kind=="dollar":
- return f'$'
- if kind=="leaf":
- return (f''
- f'')
- if kind=="news":
- return (f''
- f''
- f'')
- if kind=="people":
- return (f''
- f''
- f''
- f'')
- return ""
-
-# ══════════════════════════════════════════════════════════════════════════════
-def build():
- p=[]; a=p.append
-
- HX,HY,HW,HH = 700,348,480,292
- HCX,HCY = HX+HW//2, HY+HH//2 # 940, 494
-
- # Branch circles
- B1_CX,B1_CY,B1_R = 640,300,82 # AMBER
- B7_CX,B7_CY,B7_R = 600,600,68 # PURP
- B2_CX,B2_CY,B2_R = 940,130,64 # CYAN
- B3_CX,B3_CY,B3_R = 1400,200,64 # LIME
- B4_CX,B4_CY,B4_R = 1480,430,62 # SKY
- B5_CX,B5_CY,B5_R = 1390,720,62 # EMER
- B6_CX,B6_CY,B6_R = 920,820,62 # ORAN
-
- # Decorative circles
- D1_CX,D1_CY,D1_R = 700, 820, 44
- D2_CX,D2_CY,D2_R = 1155, 770, 44
- D3_CX,D3_CY,D3_R = 220, 623, 44
- D4_CX,D4_CY,D4_R = 1170, 185, 44
-
- a(f''); return '\n'.join(p)
-
-html = (f'
'
- f''
- f''
- f''
- f'{build()}')
-
-# ── Output paths ───────────────────────────────────────────────────────────────
-HERE = Path(__file__).parent
-_subdirs = {
- "trilinc": None,
- "strata": "Strata Critical Medical",
- "hp": "HP Inc",
- "angi": "Angi Inc",
- "nvidia": "Nvidia Corp",
- "tesla": "Tesla Inc",
- "apple": "Apple Inc",
- "harley": "Harley Davidson INC",
-}
-_subdir = _subdirs[COMPANY]
-OUT_DIR = HERE / _subdir if _subdir else HERE
-if _subdir:
- OUT_DIR.mkdir(exist_ok=True)
-OUT = str(OUT_DIR / f"{COMPANY}-mindmap.png")
-POST_PATH = str(OUT_DIR / f"{COMPANY}-linkedin-post.txt")
-
-# ── Render ─────────────────────────────────────────────────────────────────────
-print("Rendering…")
-with sync_playwright() as pw:
- br = pw.chromium.launch()
- pg = br.new_page(viewport={"width": W, "height": H}, device_scale_factor=2)
- pg.set_content(html, timeout=60000)
- try:
- pg.wait_for_load_state("networkidle", timeout=45000)
- except Exception:
- pass
- pg.wait_for_timeout(2500)
- HI_OUT = OUT.replace(".png", "_2x.png")
- pg.screenshot(path=HI_OUT, clip={"x": 0, "y": 0, "width": W, "height": H})
- br.close()
-
-img_out = _PIL.open(HI_OUT).resize((W, H), _PIL.LANCZOS)
-img_out.save(OUT, "PNG", optimize=True)
-os.remove(HI_OUT)
-print(f"Done (1920×1080): {OUT}")
-
-# ── LinkedIn post ──────────────────────────────────────────────────────────────
-if COMPANY == "trilinc":
- CAPTION = f"""\
-TriLinc Global Impact Fund ranks #1 in US Finance Services. ECR: 124%.
-
-46 percentage points above the industry average of 78%. Top-Rated by RealRate's independent, explainable financial AI.
-
-THE FUND
-Founded 2008 · Delaware, USA · Ticker: TRLC · ~$1.4B AUM
-Female-founded · Female-owned · Female-led
-
-LEADERSHIP
-Gloria Nelund — Founder, Chief Executive Officer & Chief Compliance Officer
-Former CEO, US Private Wealth at Deutsche Bank — oversaw $50 billion in assets under management
-Over 40 years of experience in international asset management
-
-FINANCIAL HEALTH
-Total Assets: $282.8M · Stockholders' Equity: $272.6M · Liabilities: $10.2M
-Equity-to-Assets Ratio: 96.4% · Net Income: –$8.5M
-Primary ECR Drivers: Equity +57pp · Revenue –17pp
-
-INVESTMENT STRATEGY
-Direct loans · Trade finance · Structured credit · Preferred equity
-SMEs with fewer than 500 employees · Developing economies · Local sub-advisors · 4 continents
-
-IMPACT
-Sustainable community development · Workforce capacity building · Financial inclusion · Food security
-Sectors: Education · Energy · Housing · Health
-
-2008: Founded | 2017: TRLC listed on OTC Pink Markets | 2025: Ranked #1 in US Finance Services
-
-Powered by RealRate: Using Explainable Financial AI
-
-Full US Finance Services ranking: {RANKING_URL}
-
-#RealRate #ImpactInvesting #ESG #SMELending #FinancialHealth"""
-
-elif COMPANY == "hp":
- CAPTION = f"""\
-HP Inc. ranks #9 in US Computers. ECR: 258%.
-
-At the industry average of 258%. Rated by RealRate's independent, explainable financial AI.
-
-THE COMPANY
-Personal computing and printing technology leader · Palo Alto, California
-Founded 1939 · Spun off from Hewlett-Packard November 2015 · Ticker: HPQ
-~58,000 employees worldwide
-
-LEADERSHIP
-Enrique Lores — President & Chief Executive Officer
-Joined HP in 1989 · Led Imaging, Printing & Solutions before becoming CEO November 2019
-"Future Ready" transformation — restructuring for AI-era growth and subscription revenue
-
-FINANCIAL HEALTH
-Revenue: $53.6B (FY2024) · Net Income: $2.8B · Operating margin: 7.1%
-Total Assets: $39.9B · Stockholders' Equity: –$1.3B (deficit from cumulative buybacks)
-Cash: $3.25B · Long-term Debt: $8.3B · R&D: $1.64B
-
-BUSINESS SEGMENTS
-Personal Systems: ~$34.4B (64%) — PCs, laptops, workstations, Chromebooks
-Printing: ~$19.1B (36%) — LaserJet, OfficeJet, Instant Ink supplies
-Poly collaboration hardware — acquired 2022 · hybrid work solutions
-
-HISTORY
-1939: William Hewlett & Dave Packard found the company in a Palo Alto garage
-2015: Hewlett-Packard splits into HP Inc. (HPQ) and Hewlett Packard Enterprise (HPE)
-FY2024: $53.6B revenue · ECR 258% · AI PC transformation underway
-
-Powered by RealRate: Using Explainable Financial AI
-
-Full US Computers ranking: {RANKING_URL}
-
-#RealRate #HPInc #AIComputer #FinancialHealth #TechIndustry"""
-
-elif COMPANY == "strata":
- CAPTION = f"""\
-Strata Critical Medical ranks #1 in US Air. ECR: 123%.
-
-54 percentage points above the industry average of 69%. Top-Rated by RealRate's independent, explainable financial AI.
-
-THE COMPANY
-Air Medical Transport · Critical Care · Emergency Response · Delaware, USA
-CIK: 0001779128 · OTC-listed · STCM · Publicly reporting
-
-FINANCIAL HEALTH
-Total Assets: $325.5M · Stockholders' Equity: $279.1M · Liabilities: $46.4M
-Revenue: $197.1M (FY2025) · Net Income: +$41.3M
-First profitable year in company history
-
-ECR DRIVERS
-Greatest Strength: Operating Expenses — +46pp contribution to ECR
-Greatest Weakness: Other Expenses — –81pp drag on ECR
-
-GROWTH JOURNEY
-2021: Revenue $50.5M · Net Income –$40.1M — Rapid expansion phase begins
-2022–2024: Revenue grew from $146M to $249M — approximately 4× growth in 3 years
-2025: ECR 123% · #1 US Air · RealRate — First profitable year in history
-
-Powered by RealRate: Using Explainable Financial AI
-
-Full US Air ranking: {RANKING_URL}
-
-#RealRate #AirMedical #CriticalCare #FinancialHealth #Healthcare"""
-
-elif COMPANY == "nvidia":
- CAPTION = f"""\
-Nvidia Corp. ranks #8 in US Semiconductors. ECR: 351%.
-
-98 percentage points above the industry average of 253%. Top-Rated by RealRate's independent, explainable financial AI.
-
-THE COMPANY
-AI computing and GPU technology leader · Santa Clara, California
-Founded April 5, 1993 · NASDAQ: NVDA · ~36,000 employees worldwide
-
-LEADERSHIP
-Jensen Huang — Co-Founder & Chief Executive Officer
-Oregon State BSc Electrical Engineering · Stanford MS Electrical Engineering
-Led Nvidia from gaming graphics chipmaker to the world's AI computing infrastructure provider
-
-FINANCIAL HEALTH
-Revenue: $130.5B (FY2025) · Net Income: $72.9B
-Total Assets: $111.6B · Stockholders' Equity: $79.3B · Liabilities: $32.3B
-R&D investment: $12.9B
-
-ECR DRIVERS
-Greatest Strength: Net Income — +94pp contribution to ECR
-Greatest Weakness: Stockholders' Equity — –56pp drag on ECR
-
-BUSINESS SEGMENTS
-Data Center: ~$115.2B (88%) — H100, H200, Blackwell B200, GB200 NVL72, NVLink, InfiniBand
-Gaming: ~$11.4B (9%) — GeForce RTX 50 series · DLSS 4 · Ray Tracing
-Professional Visualization · Automotive · OEM: ~$3.9B (3%) — DRIVE platform · Omniverse · Jetson
-
-HISTORY
-1993: Jensen Huang, Curtis Priem & Chris Malachowsky found Nvidia in Santa Clara
-1999: GeForce 256 — world's first GPU | 2006: CUDA platform — AI computing foundation
-2025: ECR 351% · #8 US Semiconductors · Revenue +114% YoY · RealRate
-
-Powered by RealRate: Using Explainable Financial AI
-
-Full US Semiconductors ranking: {RANKING_URL}
-
-#RealRate #Nvidia #AIComputing #GPUs #FinancialHealth"""
-
-elif COMPANY == "tesla":
- CAPTION = f"""\
-Tesla Inc ranks #9 in US Motor. ECR: 135%.
-
-34 percentage points above the industry average of 102%. Top-Rated by RealRate's independent, explainable financial AI.
-
-THE COMPANY
-Electric vehicles, energy storage, and AI company · Austin, Texas
-Founded July 1, 2003 · NASDAQ: TSLA
-~125,665 employees worldwide
-
-LEADERSHIP
-Elon Musk — Co-Founder & Chief Executive Officer (since 2008)
-Also CEO of SpaceX, xAI, Neuralink & The Boring Company
-Driving Tesla's transition from EV maker to full-stack AI and robotics company
-
-FINANCIAL HEALTH
-Revenue: $94.8B (FY2025) · Net Income: $3.9B · R&D: $6.4B
-Total Assets: $137.8B · Stockholders' Equity: $82.9B · Liabilities: $54.9B
-Equity-to-Assets Ratio: 60.2%
-
-ECR DRIVERS
-Greatest Strength: Cost of Goods and Services Sold — +36pp contribution to ECR
-Greatest Weakness: Other Expenses — –27pp drag on ECR
-
-BUSINESS SEGMENTS
-Automotive: ~81% — Model 3/Y/S/X/Cybertruck · Full Self-Driving · Robotaxi
-Energy Generation & Storage: ~13% — Powerwall · Megapack · Solar Roof
-Services & Other: ~6% — Supercharger network · Insurance · Tesla Fleet
-
-HISTORY
-2003: Tesla Motors founded by Martin Eberhard & Marc Tarpenning · San Carlos, California
-2008: Elon Musk becomes CEO · First Roadster delivered | 2010: TSLA IPO on NASDAQ
-2025: ECR 135% · #9 US Motor · Top-Rated · Revenue $94.8B · Robotaxi & Optimus era
-
-Powered by RealRate: Using Explainable Financial AI
-
-Full US Motor ranking: {RANKING_URL}
-
-#RealRate #Tesla #ElectricVehicles #FinancialHealth #EV"""
-
-elif COMPANY == "angi":
- CAPTION = f"""\
-Angi Inc. ranks #1 in US Advertising. ECR: 157%.
-
-78 percentage points above the industry average of 80%. Top-Rated by RealRate's independent, explainable financial AI.
-
-THE COMPANY
-Online home services marketplace · Denver, Colorado
-Founded 1995 · NASDAQ: ANGI · IAC subsidiary
-~4,500 employees worldwide
-
-LEADERSHIP
-Jeff Kip — Chief Executive Officer
-Brands: Angi (formerly Angie's List) · HomeAdvisor · Handy
-Connecting homeowners with local service professionals across the United States
-
-FINANCIAL HEALTH
-Total Assets: $1.68B · Stockholders' Equity: $1.46B · Liabilities: $222.4M
-Revenue: $1.03B · Net Income: +$43.8M
-Equity-to-Assets Ratio: 86.7%
-
-ECR DRIVERS
-Greatest Strength: Stockholders' Equity — +68pp contribution to ECR
-Greatest Weakness: Marketing & Selling Expenses — –22pp drag on ECR
-
-PLATFORM
-Angi: Homeowner marketplace · Crowd-sourced reviews · Cost guides
-HomeAdvisor: Instant Pro Connect · Local professionals · Project matching
-Handy: On-demand home services · Cleaning · Assembly · Moving · Repairs
-
-HISTORY
-1995: Angie's List founded in Columbus, Ohio — review platform for home service contractors
-1998: ServiceMagic founded, rebranded HomeAdvisor in 2012
-2017: ANGI Homeservices formed via HomeAdvisor & Angie's List merger | 2021: Rebranded to Angi Inc.
-2025: ECR 157% · #1 US Advertising · RealRate
-
-Powered by RealRate: Using Explainable Financial AI
-
-Full US Advertising ranking: {RANKING_URL}
-
-#RealRate #HomeServices #AngiInc #FinancialHealth #Marketplace"""
-
-elif COMPANY == "harley":
- CAPTION = f"""\
-Harley Davidson INC ranks #5 in US Motor. ECR: 147%.
-
-45 percentage points above the industry average of 102%. Top-Rated by RealRate's independent, explainable financial AI.
-
-THE COMPANY
-Iconic American motorcycle brand · Milwaukee, Wisconsin
-Founded 1903 · NYSE: HOG · ~5,900 employees worldwide
-Brands: Harley-Davidson · LiveWire · Harley-Davidson Financial Services (HDFS)
-
-LEADERSHIP
-Jochen Zeitz — President & Chief Executive Officer
-Former CEO of Puma AG · Architect of the "Hardwire" 2021–2025 strategic plan
-Focus on premium motorcycles, selective market expansion, and EV platform development
-
-FINANCIAL HEALTH
-Revenue: $5.84B · Net Income: $695M
-Total Assets: $12.1B · Stockholders' Equity: $3.25B · Liabilities: ~$8.85B
-
-ECR DRIVERS
-Greatest Strength: Stockholders' Equity — +30pp contribution to ECR
-Greatest Weakness: Liabilities, Current — –18pp drag on ECR
-
-BUSINESS
-Motorcycles & Related Products: Touring, Softail, Sportster, Adventure, Electric
-Financial Services (HDFS): Retail loans, wholesale financing, insurance, licensing
-LiveWire (NYSE: LVWR): Dedicated EV motorcycle brand, spun off 2022
-
-HISTORY
-1903: William Harley & Arthur Davidson build first motorcycle in Milwaukee backyard
-1969: AMF acquisition | 1981: Management buyout — independence restored
-2021: Hardwire strategy launched | 2022: LiveWire EV brand spun off
-2026: ECR 147% · #5 US Motor · Top-Rated · RealRate
-
-Powered by RealRate: Using Explainable Financial AI
-
-Full US Motor ranking: {RANKING_URL}
-
-#RealRate #HarleyDavidson #Motorcycles #FinancialHealth #EV"""
-
-elif COMPANY == "apple":
- CAPTION = f"""\
-Apple Inc. ranks #1 in US Computers. ECR: 430%.
-
-177 percentage points above the industry average of 253%. Top-Rated by RealRate's independent, explainable financial AI.
-
-THE COMPANY
-World's most valuable technology company · Cupertino, California
-Founded April 1, 1976 · NASDAQ: AAPL · ~150,000 employees worldwide
-
-LEADERSHIP
-Tim Cook — Chief Executive Officer
-CEO since August 2011 · Auburn University BSc Industrial Engineering · Duke MBA
-Led Apple's transformation from hardware maker to services, AI, and spatial computing company
-
-FINANCIAL HEALTH
-Revenue: $416B (FY2025) · +6% YoY · Net Income: $112B · Operating Margin: 32%
-Total Assets: $364.9B · Stockholders' Equity: $56.9B
-Cash & Securities: $162B · R&D investment: $34.6B · Market Cap: $3.0 Trillion
-
-BUSINESS SEGMENTS
-iPhone: ~$201B (48%) — iPhone 16 series · Apple Intelligence · 5G
-Services: ~$96B (23%) — App Store · iCloud · Apple TV+ · Apple Pay · Apple Arcade
-Mac · iPad · Wearables: ~$119B (29%) — Apple Silicon M4 · Vision Pro · AirPods Pro
-
-HISTORY
-1976: Steve Jobs, Steve Wozniak & Ronald Wayne found Apple · Cupertino, California
-1984: Macintosh launched | 2007: iPhone changes mobile computing | 2011: Tim Cook becomes CEO
-2025: ECR 430% · #1 US Computers · Revenue $416B · Market Cap $3.0 Trillion · RealRate
-
-Powered by RealRate: Using Explainable Financial AI
-
-Full US Computers ranking: {RANKING_URL}
-
-#RealRate #Apple #iPhone #FinancialHealth #TechIndustry"""
-
-with open(POST_PATH, "w", encoding="utf-8") as _f:
- _f.write(CAPTION + "\n")
-print("LinkedIn post saved:", POST_PATH)
diff --git a/run_mindmaps.ps1 b/run_mindmaps.ps1
deleted file mode 100644
index 5e2bbc3..0000000
--- a/run_mindmaps.ps1
+++ /dev/null
@@ -1,25 +0,0 @@
-# Run from any directory — script always executes from its own folder
-$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
-Set-Location $ScriptDir
-
-$COMPANIES = @("trilinc", "strata", "hp", "angi", "nvidia", "tesla", "apple", "harley")
-
-if ($args.Count -eq 0) {
- Write-Host "Usage: .\run_mindmaps.ps1 [company2 ...] | .\run_mindmaps.ps1 all"
- Write-Host "Companies: $($COMPANIES -join ', ')"
- exit 0
-}
-
-$targets = if ($args[0] -eq "all") { $COMPANIES } else { $args }
-
-foreach ($company in $targets) {
- if ($COMPANIES -notcontains $company) {
- Write-Warning "Unknown company: $company — skipping"
- continue
- }
- Write-Host "Generating mind map for $company..."
- python gen_mindmap.py $company
- if ($LASTEXITCODE -ne 0) {
- Write-Warning "Failed: $company (exit $LASTEXITCODE)"
- }
-}
diff --git a/run_mindmaps.sh b/run_mindmaps.sh
deleted file mode 100644
index ce78a7f..0000000
--- a/run_mindmaps.sh
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/usr/bin/env bash
-set -e
-# Always run from the script's own directory
-cd "$(dirname "$0")"
-
-COMPANIES=(trilinc strata hp angi nvidia tesla apple harley)
-
-usage() {
- echo "Usage: bash run_mindmaps.sh [company2 ...] | bash run_mindmaps.sh all"
- echo "Companies: ${COMPANIES[*]}"
-}
-
-if [ $# -eq 0 ]; then
- usage
- exit 0
-fi
-
-if [ "$1" = "all" ]; then
- targets=("${COMPANIES[@]}")
-else
- targets=("$@")
-fi
-
-for company in "${targets[@]}"; do
- found=0
- for c in "${COMPANIES[@]}"; do
- [ "$c" = "$company" ] && found=1 && break
- done
- if [ $found -eq 0 ]; then
- echo "Warning: Unknown company '$company' — skipping"
- continue
- fi
- echo "Generating mind map for $company..."
- python gen_mindmap.py "$company"
-done
diff --git a/skills/mindmap.md b/skills/mindmap.md
index eb70aa7..8a9bf48 100644
--- a/skills/mindmap.md
+++ b/skills/mindmap.md
@@ -1,80 +1,1872 @@
----
-description: Generate a RealRate mind map for one or more companies. Usage: /mindmap [company2 ...] | /mindmap all
-argument-hint:
-allowed-tools: [Bash]
----
+# RealRate Mind Map Generator
-# Mind Map Generator
+Generate a 1920×1080 radial "mind map" infographic (PNG) plus a ready-to-post
+LinkedIn caption for one or more RealRate-ranked companies. Usage:
+`/mindmap [company2 ...]` or `/mindmap all`.
-Generate 1920×1080 LinkedIn mind map images for one or more RealRate-ranked companies.
+This skill is self-contained — everything needed to run it lives in this
+file. It does **not** scan the filesystem for a pre-existing script, does
+**not** assume any personal machine path, and does **not** require any
+sibling folder (like a `RealRate Logos/` asset folder) to already exist.
+The complete generator — including the RealRate logo, embedded as base64 —
+lives in the "Generator source" section below. Clone this repo onto any
+machine and it works identically, with nothing else present.
-## Arguments
+## How this skill works — no directory scanning, no pre-existing files
-The user invoked this command with: $ARGUMENTS
+1. Copy the Python source verbatim from **Generator source** below into a
+ new file named `gen_mindmap.py`, written into whichever directory the
+ user wants the output to land in (ask if unclear; default to the
+ current working directory). The script writes its own output — a PNG,
+ a caption `.txt`, and a small `img_cache/` folder — next to wherever it
+ is placed, so placing it in the target output directory is what
+ controls where results go.
+2. Run it once per requested company:
+ ```
+ python gen_mindmap.py
+ ```
+ (fall back to `python3` if `python` doesn't resolve on this machine).
+ If the request is `all`, run it once for every key in the Supported
+ Companies table below.
+3. After the run, delete the `gen_mindmap.py` file (and, unless the user
+ wants to keep it for faster re-runs, the `img_cache/` folder) — leave
+ only the generated PNG and caption `.txt` behind. This skill never
+ leaves a script file sitting in the user's project.
+4. Report the output file paths to the user. This skill only generates
+ files — never open, upload, or post the image or caption anywhere.
-## Supported Companies
+Do not retype, paraphrase, or "improve" the script from memory — copy it
+byte-for-byte from the fenced block below. It's long because it draws
+custom SVG icons, gauges, and precise per-company layout; small edits
+easily break positioning.
-| Argument | Company | Industry | ECR | Rank |
-|---|---|---|---|---|
-| `trilinc` | TriLinc Global | US Finance Services | 124% | #1/4 |
-| `strata` | Strata Critical Medical | US Air | 123% | #1/4 |
-| `hp` | HP Inc. | US Computers | 258% | #9/17 |
-| `angi` | Angi Inc. | US Advertising | 157% | #1/4 |
-| `nvidia` | Nvidia Corp. | US Semiconductors | 351% | #8/44 |
-| `tesla` | Tesla Inc. | US Motor | 135% | #9/38 |
-| `apple` | Apple Inc. | US Computers | 430% | #1/17 |
-| `harley` | Harley Davidson INC | US Motor | 147% | #5/38 |
+## First-run dependencies
-Use `all` to run every company in sequence.
+The generator needs `requests`, `playwright`, `Pillow`, and a one-time
+Playwright browser install:
-## Instructions
+```
+pip install requests playwright Pillow
+playwright install chromium
+```
-1. Parse $ARGUMENTS. Lowercase and trim each token.
-2. If no argument is given, list the supported companies above and stop.
-3. If the argument is `all`, expand to the full company list above.
-4. For each company in the list:
- - Run via Bash:
- ```
- python gen_mindmap.py
- ```
- - `gen_mindmap.py` is the source of truth for supported companies. If it exits with an error, report the error message to the user and continue to the next company.
- - On success, report the output path printed by the script (e.g. `Done (1920×1080): `).
-5. After all runs, print a summary:
- - ✓ succeeded: list company names
- - ✗ failed: list company names with their error
+If a run fails with a missing package or missing browser error, tell the
+user to run the above and retry — do not silently install dependencies
+without asking first.
-## Output locations
+## Standing rule — one generator, embedded here
-Each company writes to its own subfolder inside the project directory:
+This skill file is the single source of truth for the generator. To add a
+new company, edit the `elif COMPANY == "companyname":` blocks inside the
+embedded script directly — there are two such blocks (one for image/asset
+fetching near the top, one for the SVG copy/caption text near the bottom).
+Never fork a second script or duplicate the generator elsewhere. Once
+edited, update the Supported Companies and Archive Slugs tables below to
+match.
-| Company | Subfolder |
-|---|---|
-| trilinc | *(root — no subfolder)* |
-| strata | `Strata Critical Medical/` |
-| hp | `HP Inc/` |
-| angi | `Angi Inc/` |
-| nvidia | `Nvidia Corp/` |
-| tesla | `Tesla Inc/` |
-| apple | `Apple Inc/` |
-| harley | `Harley Davidson INC/` |
+## Supported companies
-Files per company: `-mindmap.png` (1920×1080) · `-linkedin-post.txt`
+| Key | Company | Industry |
+|---|---|---|
+| `trilinc` | TriLinc Global Impact Fund | US Finance Services |
+| `strata` | Strata Critical Medical | US Air |
+| `hp` | HP Inc. | US Computers |
+| `angi` | Angi Inc. | US Advertising |
+| `nvidia` | Nvidia Corp. | US Semiconductors |
+| `tesla` | Tesla Inc. | US Motor |
+| `apple` | Apple Inc. | US Computers |
+| `harley` | Harley Davidson INC | US Motor |
-## First-run dependencies
+If an unrecognised key is given, stop and tell the user which keys are
+supported instead of guessing.
+
+**Archive slugs per company** (industry archive path vs. public rankings
+slug — these can differ by year):
+
+| Company | Archive path | Rankings slug |
+|---|---|---|
+| trilinc | `us_finance_services/2025/` | `us_finance_services/2026` |
+| strata | `us_air/2025/` | `us_air/2026` |
+| hp | `us_computers/2025/` | `us_computers/2025` |
+| angi | `us_advertising/2025/` | `us_advertising/2026` |
+| nvidia | `us_semiconductors/2025/` | `us_semiconductors/2026` |
+| tesla | `us_motor/2025/` | `us_motor/2026` |
+| apple | `us_computers/2025/` | `us_computers/2025` |
+| harley | `us_motor/2025/` | `us_motor/2026` |
+
+## Data source — always fetch live, never hardcode
+
+**Rule: never hardcode or recall ECR/financial values from memory. Always
+fetch live from the ranking data archive first**, using the archive path
+for that company's industry from the table above, then update the
+relevant `elif COMPANY ==` block in the embedded script with the verified
+numbers before generating.
-The generator needs the packages in `requirements.txt` (repo root) and a
-one-time Playwright browser install. If a run fails with a missing package or
-missing browser error, tell the user to run:
+The archive is internal-only — used for data verification, never shared or
+linked publicly (not in captions, not in code comments, not committed to a
+public file). Only the public rankings URL
+(`realrate.ai/rankings/[slug]/[year]`) and methodology URL
+(`realrate.ai/methodology`) are safe to reference publicly. The embedded
+script already fetches the live rankings URL on every run and only falls
+back to the slug table above if that fetch fails.
+
+## Shared canvas & layout
+
+All companies share the same layout constants — read these before editing
+the embedded script or adding a new company block:
```
-pip install -r requirements.txt
-playwright install chromium
+SVG coords: W=1920, H=1080 (internal coordinate space — never change)
+Output size: 1920×1080 px (SVG viewBox scales via preserveAspectRatio="none")
+Hub centre: HCX=940, HCY=494 (rect HX=700, HY=348, HW=480, HH=292)
+Hub radius: HR=200
+Render: Playwright viewport=1920×1080, device_scale_factor=2 → Pillow LANCZOS → 1920×1080
```
-and then retry — do not silently install dependencies without asking first.
-Fall back to `python3`/`pip3` if `python`/`pip` don't resolve on this machine.
+Font sizes are defined in the same 1920×1080 SVG coordinate space as the
+output, so SVG px = visible px directly (1:1 scale).
+
+**Hub centre layout (all companies):**
+
+```
+Row 1 (HY+10 → HY+62): RealRate logo — white box 220×52, centred at HCX
+ separator at HY+68
+
+Row 2 (company content):
+ • All except Tesla — company logo centred in 72×72 white box (top HY+76),
+ company name centred at HCX below the box (HY+170)
+ • Tesla only — T-mark logo 72×72 white box LEFT (x=HCX-150),
+ "Tesla Inc." centred in the right zone (x≈984, y=tl_cy+14)
+
+ separator at HY+156
+ descriptor line 1 at HY+170
+ descriptor line 2 at HY+184
+ separator at HY+192
+
+Badges (HY+200, h=50):
+ ECR SCORE 100px HCX-168
+ INDUSTRY RANK 120px HCX-60
+ STATUS 100px HCX+68
+ — badge span=336px, fits inside circle at this y (d≈104, r=200)
+```
+
+**Branch circle positions (all companies):**
+
+| Role | Colour | cx, cy, r |
+|---|---|---|
+| B1 — CEO / Leader | AMBER #F59E0B | 640, 300, 82 |
+| B7 — History / Journey | PURP #A78BFA | 600, 600, 68 |
+| B2 — Company Overview | CYAN #3DBACD | 940, 130, 64 |
+| B3 — Industry Position | LIME #86EF60 | 1400, 200, 64 |
+| B4 — Financial Health | SKY #60A5FA | 1480, 430, 62 |
+| B5 — Segments / Strategy | EMER #34D399 | 1390, 720, 62 |
+| B6 — Highlights / Focus | ORAN #FB923C | 920, 820, 62 |
+
+**Decorative circle positions (all companies):**
+
+| Role | cx, cy, r |
+|---|---|
+| D1 — bottom-left | 700, 820, 44 |
+| D2 — bottom-right | 1155, 770, 44 |
+| D3 — mid-left | 220, 623, 44 |
+| D4 — top-right | 1170, 185, 44 |
+
+**Accent colour per company:** EMER (trilinc) · SKY (strata) · CYAN (hp) ·
+PINK (angi) · LIME (nvidia) · SKY (tesla — full blue palette: TBLUE #2563EB
+· TAQUA #0891B2 · PURP · CYAN · SKY)
+
+**Font sizes (SVG coords = visible px at 1:1 scale):**
+
+| Context | SVG px | Visible px |
+|---|---|---|
+| Node box title | 22 | ~14 |
+| Node box subtitle | 18 | ~11 |
+| Branch outer label | 20 | ~12.5 |
+| ECR gauge value | 22 | ~14 |
+| ECR gauge label / status | 12–14 | ~8 |
+| Hub company name | 28–52 (varies) | ~18–33 |
+| Hub descriptor text | 17–18 | ~11 |
+| Badge value | 18–28 | ~11–17 |
+| Badge label | 16 | ~10 |
+| D4 data value | 19–22 | ~12–14 |
+| Footer | 20 | ~12.5 |
+
+## LinkedIn post rules
+
+The caption is generated automatically by the script on every run —
+paste-ready, no edits needed. Rules baked into the generator's caption
+logic:
+
+- Never tag companies in the caption — always in the first pinned comment
+- Max 5 hashtags, always include `#RealRate`
+- Every post must include: `Powered by RealRate: Using Explainable Financial AI`
+- Link only to the public rankings page for that industry/year — never to
+ the internal archive
+- The ranking URL is fetched live on every run; falls back to the slug in
+ the Archive Slugs table above if the live fetch fails
+
+To update caption copy, edit the `CAPTION` f-string in the relevant
+`elif COMPANY == "..."` block inside the embedded script.
+
+## Key links
+
+| | URL |
+|---|---|
+| Rankings (public) | https://realrate.ai/rankings |
+| Methodology (public) | https://realrate.ai/methodology |
+| Internal ranking archive | *(internal only — never link or share publicly)* |
+
+## Generator source
+
+Copy this exactly into `gen_mindmap.py` (see step 1 above). It embeds the
+RealRate logo as base64 internally, so no external logo file is needed.
+
+```python
+"""
+RealRate radial mindmap — universal generator
+Usage:
+ python gen_mindmap.py # TriLinc Global Impact Fund (default)
+ python gen_mindmap.py trilinc # TriLinc Global Impact Fund
+ python gen_mindmap.py strata # Strata Critical Medical Inc
+ python gen_mindmap.py hp # HP Inc.
+ python gen_mindmap.py angi # Angi Inc.
+ python gen_mindmap.py nvidia # Nvidia Corp.
+ python gen_mindmap.py harley # Harley Davidson INC
+"""
+import sys, math, base64, re, requests, urllib3, time, os
+from pathlib import Path
+from PIL import Image as _PIL
+from playwright.sync_api import sync_playwright
+
+urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
+
+# ── Company selection ──────────────────────────────────────────────────────────
+COMPANY = sys.argv[1].lower() if len(sys.argv) > 1 else "trilinc"
+if COMPANY not in ("trilinc", "strata", "hp", "angi", "nvidia", "tesla", "apple", "harley"):
+ print(f"Unknown company '{COMPANY}'. Use: trilinc, strata, hp, angi, nvidia, tesla, apple, harley"); sys.exit(1)
+
+# ── Constants ──────────────────────────────────────────────────────────────────
+W, H = 1920, 1080
+F = "'Manrope',Segoe UI,Helvetica Neue,Arial,sans-serif"
+BG = "#050B18"; GREY="#AFAFAF"; WH="#FFFFFF"
+AMBER="#F59E0B"; CYAN="#3DBACD"; LIME="#86EF60"; SKY="#60A5FA"
+EMER="#34D399"; PINK="#F472B6"; PURP="#A78BFA"; ORAN="#FB923C"
+TBLUE="#2563EB"; TAQUA="#0891B2"
+_ACCENT_BY_COMPANY = {
+ "trilinc": EMER, "strata": SKY, "tesla": SKY, "angi": PINK,
+ "nvidia": LIME, "harley": AMBER, "apple": ORAN,
+}
+ACCENT = _ACCENT_BY_COMPANY.get(COMPANY, CYAN)
+
+CACHE_DIR = Path(__file__).parent / "img_cache"
+CACHE_DIR.mkdir(exist_ok=True)
+
+HDRS = {
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36",
+ "Referer": "https://en.wikipedia.org/",
+ "Accept": "image/webp,image/jpeg,image/*,*/*;q=0.8",
+ "Accept-Language": "en-US,en;q=0.9",
+}
+
+# ── Utilities ──────────────────────────────────────────────────────────────────
+def verify_ranking_url(industry_slug, fallback_year):
+ try:
+ hdrs = {"User-Agent": HDRS["User-Agent"], "Accept-Language": "en-US,en;q=0.9"}
+ r = requests.get("https://realrate.ai/rankings", timeout=20, headers=hdrs, verify=False)
+ r.raise_for_status()
+ hits = re.findall(r'/rankings/([\w]+)/(\d{4})', r.text)
+ matches = [(slug, yr) for slug, yr in hits if industry_slug in slug]
+ if matches:
+ slug, yr = max(matches, key=lambda x: x[1])
+ url = f"https://realrate.ai/rankings/{slug}/{yr}"
+ print(f" Ranking URL verified: {url}")
+ return url
+ except Exception as e:
+ print(f" Warning: rankings page fetch failed — {e}")
+ fallback = f"https://realrate.ai/rankings/{industry_slug}/{fallback_year}"
+ print(f" Ranking URL (fallback): {fallback}")
+ return fallback
+
+def raster_mime(d):
+ if d[:5] == 'iVBOR': return 'image/png'
+ if d[:5] == 'UklGR': return 'image/webp'
+ if d[:4] == '/9j/': return 'image/jpeg'
+ return None
+
+def is_raster_b64(d):
+ return raster_mime(d) is not None
+
+def cache_path(url, suffix=".cache"):
+ return CACHE_DIR / (base64.urlsafe_b64encode(url.encode()).decode()[:80] + suffix)
+
+def fetch_b64(url):
+ cf = cache_path(url)
+ if cf.exists():
+ d = cf.read_text()
+ if is_raster_b64(d):
+ return d
+ print(f" Cache invalid, re-fetching {url[-50:]}")
+ cf.unlink()
+ time.sleep(1.2)
+ r = requests.get(url, timeout=30, headers=HDRS, verify=False)
+ r.raise_for_status()
+ d = base64.b64encode(r.content).decode()
+ if not is_raster_b64(d):
+ raise ValueError(f"Not a raster image: {url[-40:]}")
+ cf.write_text(d)
+ return d
+
+def wiki_image_url(article_title, thumb_size=400):
+ api = "https://en.wikipedia.org/w/api.php"
+ params = {"action":"query","titles":article_title,"prop":"pageimages",
+ "pithumbsize":thumb_size,"format":"json","formatversion":"2"}
+ r = requests.get(api, params=params, headers=HDRS, verify=False, timeout=20)
+ r.raise_for_status()
+ pages = r.json().get("query",{}).get("pages",[])
+ if pages and "thumbnail" in pages[0]:
+ return pages[0]["thumbnail"]["source"]
+ return None
+
+def try_wiki(article_titles, label, size=400):
+ for title in article_titles:
+ try:
+ time.sleep(1.2)
+ url = wiki_image_url(title, size)
+ if not url:
+ print(f" {label} '{title}' — no image found"); continue
+ d = fetch_b64(url)
+ print(f" {label} OK [{title}]"); return d
+ except Exception as e:
+ print(f" {label} '{title}' fail: {e}")
+ return None
+
+def try_fetch(urls, label):
+ for url in urls:
+ try:
+ d = fetch_b64(url); print(f" {label} OK"); return d
+ except Exception as e: print(f" {label} ..{url[-40:]} fail: {e}")
+ return None
+
+# ── Ranking URL ────────────────────────────────────────────────────────────────
+print("Verifying ranking URL…")
+_ranking_cfg = {
+ "trilinc": ("us_finance_services", "2025"),
+ "strata": ("us_air", "2026"),
+ "hp": ("us_computers", "2025"),
+ "angi": ("us_advertising", "2025"),
+ "nvidia": ("us_semiconductors", "2026"),
+ "tesla": ("us_motor", "2026"),
+ "apple": ("us_computers", "2025"),
+ "harley": ("us_motor", "2026"),
+}
+RANKING_URL = verify_ranking_url(*_ranking_cfg[COMPANY])
+
+# ── Assets ────────────────────────────────────────────────────────────────────
+print("Fetching assets…")
+
+RL_D = "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" # RealRate logo, embedded directly in this script — no external file dependency
+print(" RealRate logo: OK (embedded)")
+
+LOGO_SVG_D = None # SVG logo data (base64) — used when PNG logo unavailable
+
+if COMPANY == "trilinc":
+ B1_D = try_fetch(["https://www.trilincglobal.com/wp-content/uploads/2023/05/gloria-website-photo.jpg"],
+ "Gloria Nelund") or try_wiki(["Gloria Nelund","TriLinc Global Impact Fund"], "Gloria Nelund")
+ B2_D = try_wiki(["Sustainable Development Goals","Social finance","Microfinance"], "Fund Overview")
+ B6_D = try_wiki(["Developing country","Sub-Saharan Africa"], "Globe/Impact")
+ LOGO_D = None
+
+elif COMPANY == "strata":
+ B1_D = try_wiki(["Air ambulance","Air medical services","Medical evacuation"], "Air Medical")
+ B2_D = try_wiki(["Critical care medicine","Intensive care medicine","Emergency medical services"], "Company Overview")
+ B6_D = try_wiki(["Helicopter","Aviation medicine","Emergency medicine"], "Helicopter")
+ LOGO_D = try_fetch(["https://www.realrate-archive.com/us_air/logos/0001779128_256x256.png"], "Strata logo")
+
+elif COMPANY == "hp":
+ B1_D = try_wiki(["Enrique Lores","HP Inc."], "Enrique Lores")
+ B2_D = try_wiki(["HP Inc.","Hewlett-Packard"], "HP Overview")
+ B6_D = try_wiki(["AI PC","HP LaserJet","Personal computer"], "HP Strategy")
+ LOGO_D = try_fetch(["https://www.realrate-archive.com/us_computers/logos/0000047217_256x256.png"], "HP logo")
+
+elif COMPANY == "angi":
+ B1_D = try_wiki(["Jeff Kip","Angi Inc.","HomeAdvisor"], "Jeff Kip / Angi")
+ B2_D = try_wiki(["Angi Inc.","HomeAdvisor","Home services"], "Angi Overview")
+ B6_D = try_wiki(["Home improvement","Home repair","Handyman"], "Highlights")
+ LOGO_D = try_fetch(["https://www.realrate-archive.com/us_advertising/logos/0001707092_256x256.png"], "Angi logo")
+
+elif COMPANY == "nvidia":
+ B1_D = try_wiki(["Jensen Huang","Nvidia"], "Jensen Huang")
+ B2_D = try_wiki(["Nvidia","Nvidia Headquarters"], "Nvidia Overview")
+ B6_D = None # AI Leadership uses svg_neural icon
+ LOGO_D = try_fetch([
+ "https://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Nvidia_logo.svg/320px-Nvidia_logo.svg.png",
+ "https://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Nvidia_logo.svg/640px-Nvidia_logo.svg.png",
+ ], "Nvidia logo")
+ NV_GPU_D = try_wiki(["Hopper (microarchitecture)","Blackwell (microarchitecture)","Nvidia GPU","GeForce RTX 4090"], "GPU chip image")
+ NV_DC_D = try_wiki(["Data center","Server room","Cloud computing"], "Data center image")
+
+elif COMPANY == "tesla":
+ B1_D = try_wiki(["Elon Musk","Tesla Motors"], "Elon Musk")
+ B2_D = try_wiki(["Tesla Inc.","Tesla Gigafactory Shanghai","Tesla Model Y"], "Tesla Overview")
+ B6_D = try_wiki(["Tesla Cybertruck","Tesla Model Y","Tesla Model 3"], "Tesla Car")
+ LOGO_D = None
+ svg_local = Path(__file__).parent / "Tesla Inc" / "tesla_t_logo.svg"
+ svg_url = "https://upload.wikimedia.org/wikipedia/commons/b/bd/Tesla_Motors.svg"
+ svg_cf = cache_path(svg_url, ".svgcache")
+ if svg_local.exists():
+ LOGO_SVG_D = base64.b64encode(svg_local.read_bytes()).decode()
+ print(" Tesla SVG logo OK (local)")
+ elif svg_cf.exists():
+ LOGO_SVG_D = svg_cf.read_text(); print(" Tesla SVG logo OK (cached)")
+ else:
+ LOGO_D = try_fetch([
+ "https://www.tesla.com/apple-touch-icon.png",
+ "https://digitalassets.tesla.com/tesla-contents/image/upload/Logomark_Red_RGB.png",
+ "https://logo.clearbit.com/tesla.com",
+ ], "Tesla logo PNG")
+ if not LOGO_D:
+ try:
+ time.sleep(1.2)
+ r = requests.get(svg_url, timeout=30, headers=HDRS, verify=False)
+ r.raise_for_status()
+ if b''
+ f''
+ f''
+ f''
+ f'')
+
+def svg_leaf(cx, cy, col):
+ return (f''
+ f''
+ f''
+ f'')
+
+def svg_handshake(cx, cy, col):
+ return (f''
+ f''
+ f''
+ f'')
+
+def svg_helicopter(cx, cy, col):
+ return (f''
+ f''
+ f''
+ f''
+ f''
+ f''
+ f''
+ f''
+ f'')
+
+def svg_cross(cx, cy, col):
+ return (f''
+ f'')
+
+def svg_growth(cx, cy, col):
+ return (f''
+ f''
+ f'')
+
+def svg_house(cx, cy, col):
+ return (f''
+ f''
+ f'')
+
+def svg_wrench(cx, cy, col):
+ return (f''
+ f''
+ f'')
+
+def svg_chip(cx, cy, col):
+ return (
+ f''
+ f''
+ f''
+ f''
+ f''
+ f''
+ f''
+ f''
+ f''
+ f''
+ )
+
+def svg_neural(cx, cy, col):
+ inp = [(cx-17, cy-10), (cx-17, cy), (cx-17, cy+10)]
+ hid = [(cx, cy-7), (cx, cy+7)]
+ out = [(cx+17, cy)]
+ svg = ""
+ for ix,iy in inp:
+ for hx,hy in hid:
+ svg += f''
+ for hx,hy in hid:
+ for ox,oy in out:
+ svg += f''
+ for nx,ny in inp:
+ svg += f''
+ for nx,ny in hid:
+ svg += f''
+ for nx,ny in out:
+ svg += f''
+ return svg
+
+def svg_trend(cx, cy, col, label="ECR"):
+ return (f''
+ f''
+ f'{label}')
+
+def svg_car(cx, cy, col):
+ return (
+ f''
+ f''
+ f''
+ f''
+ f''
+ )
+
+def svg_bolt(cx, cy, col):
+ return (
+ f''
+ )
+
+def svg_motorcycle(cx, cy, col):
+ return (
+ f''
+ f''
+ f''
+ f''
+ f''
+ f''
+ )
+
+# ── Reusable SVG component builders ───────────────────────────────────────────
+def ecr_gauge(cx, cy, ecr_val, ecr_max, status, col=None):
+ arc_r = 36
+ c = col or LIME
+ ea = (-math.pi/2) + 2*math.pi*min(ecr_val/ecr_max, 0.95)
+ return (
+ f''
+ f''
+ f'ECR'
+ f'{ecr_val}%'
+ f'{status}'
+ )
+
+def balance_sheet_svg(cx, cy, assets_label):
+ return (
+ f'BALANCE SHEET'
+ + "".join(f'' for i,h in enumerate([24,28,8,12,6]))
+ + f'{assets_label}'
+ )
+
+def pie_svg(cx, cy, r, segments, center_label, fsize=13):
+ sa = -math.pi/2
+ svg = ""
+ for pct, sc in segments:
+ sw = 2*math.pi*pct/100; ea = sa+sw
+ x1 = cx+r*math.cos(sa); y1 = cy+r*math.sin(sa)
+ x2 = cx+r*math.cos(ea); y2 = cy+r*math.sin(ea)
+ svg += f''
+ sa = ea
+ svg += f''
+ svg += f'{center_label}'
+ return svg
+
+def ecr_drivers_svg(cx, cy, plus_label, minus_label, ecr_pct, status, col=None):
+ c = col or EMER
+ return (
+ f'ECR DRIVERS'
+ f''
+ f'{plus_label}'
+ f''
+ f'{minus_label}'
+ f'{ecr_pct}'
+ f'{status}'
+ )
+
+# ── Shared helpers ─────────────────────────────────────────────────────────────
+def cedge(cx,cy,r,tx,ty):
+ angle = math.atan2(ty-cy, tx-cx)
+ return int(cx+r*math.cos(angle)), int(cy+r*math.sin(angle))
+
+def ico(kind,x,y,col):
+ cx,cy=x+10,y+10
+ if kind=="clock":
+ return (f''
+ f''
+ f'')
+ if kind=="star":
+ pts=[]
+ for i in range(10):
+ a_=math.pi*i/5-math.pi/2; r_=8 if i%2==0 else 3.5
+ pts.append(f"{cx+r_*math.cos(a_):.1f},{cy+r_*math.sin(a_):.1f}")
+ return f''
+ if kind=="chart":
+ bars=[(x,y+12,3,8),(x+4,y+6,3,14),(x+8,y+2,3,18),(x+12,y+7,3,13),(x+16,y+4,3,16)]
+ return "".join(f'' for bx,by,bw,bh in bars)
+ if kind=="trending":
+ return (f''
+ f'')
+ if kind=="globe":
+ return (f''
+ f''
+ f'')
+ if kind=="building":
+ return (f''
+ f''
+ f''
+ f'')
+ if kind=="dollar":
+ return f'$'
+ if kind=="leaf":
+ return (f''
+ f'')
+ if kind=="news":
+ return (f''
+ f''
+ f'')
+ if kind=="people":
+ return (f''
+ f''
+ f''
+ f'')
+ return ""
+
+# ══════════════════════════════════════════════════════════════════════════════
+def build():
+ p=[]; a=p.append
+
+ HX,HY,HW,HH = 700,348,480,292
+ HCX,HCY = HX+HW//2, HY+HH//2 # 940, 494
+
+ # Branch circles
+ B1_CX,B1_CY,B1_R = 640,300,82 # AMBER
+ B7_CX,B7_CY,B7_R = 600,600,68 # PURP
+ B2_CX,B2_CY,B2_R = 940,130,64 # CYAN
+ B3_CX,B3_CY,B3_R = 1400,200,64 # LIME
+ B4_CX,B4_CY,B4_R = 1480,430,62 # SKY
+ B5_CX,B5_CY,B5_R = 1390,720,62 # EMER
+ B6_CX,B6_CY,B6_R = 920,820,62 # ORAN
+
+ # Decorative circles
+ D1_CX,D1_CY,D1_R = 700, 820, 44
+ D2_CX,D2_CY,D2_R = 1155, 770, 44
+ D3_CX,D3_CY,D3_R = 220, 623, 44
+ D4_CX,D4_CY,D4_R = 1170, 185, 44
+
+ a(f'')
+ a('')
+ a(f'''
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ''')
+ a('')
+
+ a(f'')
+
+ GRID = 240
+ for gy in range(0, H+1, GRID):
+ a(f'')
+ for gx in range(0, W+1, GRID):
+ a(f'')
+ for gy in range(0, H+1, GRID):
+ for gx in range(0, W+1, GRID):
+ a(f'')
+
+ a(f'')
+
+ for dx,dy,dr,dc,dop in [
+ (188,748,3,AMBER,.28),(312,82,2,ACCENT,.24),(1722,142,3,PURP,.24),(1632,952,2,ACCENT,.27),
+ (858,50,2,LIME,.2),(1098,1030,2,PURP,.2),(502,515,1.5,ACCENT,.14),(1438,575,1.5,AMBER,.14),
+ (658,988,2,ACCENT,.17),(1288,76,2,LIME,.17),(448,298,1.5,CYAN,.11),(1564,385,1.5,SKY,.11)]:
+ a(f'')
+
+ def t(x,y,s,sz=13,col=WH,anch="start",wt="400",op=1,sp="0"):
+ a(f'{s}')
+
+ def mline(x1,y1,cp1x,cp1y,cp2x,cp2y,x2,y2,col):
+ q=f"M{x1},{y1} C{cp1x},{cp1y} {cp2x},{cp2y} {x2},{y2}"
+ a(f'')
+ a(f'')
+ a(f'')
+ a(f'')
+ a(f'')
+
+ def sline(x1,y1,cpx,cpy,x2,y2,col):
+ q=f"M{x1},{y1} Q{cpx},{cpy} {x2},{y2}"
+ a(f'')
+ a(f'')
+ a(f'')
+
+ def white_box(x, y, w, h, col=None, op=.35):
+ c = col or ACCENT
+ a(f'')
+ a(f'')
+
+ def hub_logo_png(x, y, data, size=64, box=72):
+ white_box(x, y, box, box, op=.3)
+ if data:
+ pad = (box - size) // 2
+ a(f'')
+ return bool(data)
+
+ def draw_circle(cx, cy, r, col, grad, label, *,
+ img=None, clip_id=None, svg_icon=None, inner_svg=None, fallback="?"):
+ a(f'')
+ a(f'')
+ a(f'')
+ if inner_svg:
+ a(f'')
+ a(inner_svg)
+ else:
+ if img:
+ a(f'')
+ elif svg_icon:
+ a(svg_icon)
+ else:
+ t(cx, cy+8, fallback, 32, WH, "middle", "800")
+ a(f'')
+ lw = max(220, len(label)*12+22)
+ a(f'')
+ t(cx, cy+r+35, label, 20, col, "middle", "800", sp=".5")
+
+ def snode(nx,ny,nw,nh,col,grad,line1,line2="",icon_kind=""):
+ a(f'')
+ a(f'')
+ if icon_kind:
+ ix=nx+nw-30; iy=ny+(nh-22)//2
+ a(f'')
+ a(ico(icon_kind,ix,iy,col))
+ tx=nx+14; tw=nw-16-(46 if icon_kind else 0)
+ a(f'')
+ if line2:
+ a(f'{line1}')
+ a(f'{line2}')
+ else:
+ a(f'{line1}')
+ a('')
+
+ # ── MAIN LINES ────────────────────────────────────────────────────────────
+ ex1,ey1 = cedge(B1_CX,B1_CY,B1_R, 772,385)
+ mline(772,385, 720,360, 680,335, ex1,ey1, AMBER)
+ ex2,ey2 = cedge(B2_CX,B2_CY,B2_R, 940,294)
+ mline(940,294, 938,260, 940,220, ex2,ey2, CYAN)
+ ex3,ey3 = cedge(B3_CX,B3_CY,B3_R, 1108,385)
+ mline(1108,385, 1200,310, 1340,244, ex3,ey3, LIME)
+ ex4,ey4 = cedge(B4_CX,B4_CY,B4_R, 1138,473)
+ mline(1138,473, 1265,462, 1398,446, ex4,ey4, SKY)
+ ex5,ey5 = cedge(B5_CX,B5_CY,B5_R, 1098,592)
+ mline(1098,592, 1218,635, 1328,675, ex5,ey5, EMER)
+ ex6,ey6 = cedge(B6_CX,B6_CY,B6_R, 933,694)
+ mline(933,694, 930,742, 924,778, ex6,ey6, ORAN)
+ ex7,ey7 = cedge(B7_CX,B7_CY,B7_R, 749,554)
+ mline(749,554, 690,565, 634,578, ex7,ey7, PURP)
+
+ # ── SUB LINES ─────────────────────────────────────────────────────────────
+ s1_ce = cedge(B1_CX,B1_CY,B1_R, 225,147)
+ sline(*s1_ce, 450,220, 225,147, AMBER)
+ s2_ce = cedge(B1_CX,B1_CY,B1_R, 225,283)
+ sline(*s2_ce, 450,296, 225,283, AMBER)
+ s3_ce = cedge(B1_CX,B1_CY,B1_R, 225,479)
+ sline(*s3_ce, 450,430, 225,479, AMBER)
+
+ ap1_ce = cedge(B2_CX,B2_CY,B2_R, 665,57)
+ sline(*ap1_ce, 810,92, 665,57, CYAN)
+ ap2_ce = cedge(B2_CX,B2_CY,B2_R, 1225,57)
+ sline(*ap2_ce, 1160,90, 1225,57, CYAN)
+
+ in1_ce = cedge(B3_CX,B3_CY,B3_R, 1689,51)
+ sline(*in1_ce, 1500,126, 1689,51, LIME)
+ in2_ce = cedge(B3_CX,B3_CY,B3_R, 1689,147)
+ sline(*in2_ce, 1500,174, 1689,147, LIME)
+
+ fn1_ce = cedge(B4_CX,B4_CY,B4_R, 1735,291)
+ sline(*fn1_ce, 1558,362, 1735,291, SKY)
+ fn2_ce = cedge(B4_CX,B4_CY,B4_R, 1735,387)
+ sline(*fn2_ce, 1558,416, 1735,387, SKY)
+ fn3_ce = cedge(B4_CX,B4_CY,B4_R, 1735,483)
+ sline(*fn3_ce, 1558,460, 1735,483, SKY)
+
+ b5_1ce = cedge(B5_CX,B5_CY,B5_R, 1682,663)
+ sline(*b5_1ce, 1464,692, 1682,663, EMER)
+ b5_2ce = cedge(B5_CX,B5_CY,B5_R, 1622,759)
+ sline(*b5_2ce, 1464,730, 1622,759, EMER)
+ b5_3ce = cedge(B5_CX,B5_CY,B5_R, 1682,855)
+ sline(*b5_3ce, 1464,788, 1682,855, EMER)
+
+ b6_1ce = cedge(B6_CX,B6_CY,B6_R, 720,983)
+ sline(*b6_1ce, 820,940, 720,983, ORAN)
+ b6_2ce = cedge(B6_CX,B6_CY,B6_R, 1110,983)
+ sline(*b6_2ce, 960,942, 1110,983, ORAN)
+ b6_3ce = cedge(B6_CX,B6_CY,B6_R, 1500,983)
+ sline(*b6_3ce, 1062,942, 1500,983, ORAN)
+
+ b7_1ce = cedge(B7_CX,B7_CY,B7_R, 215,768)
+ sline(*b7_1ce, 430,680, 215,768, PURP)
+ b7_2ce = cedge(B7_CX,B7_CY,B7_R, 215,864)
+ sline(*b7_2ce, 430,762, 215,864, PURP)
+ b7_3ce = cedge(B7_CX,B7_CY,B7_R, 215,960)
+ sline(*b7_3ce, 430,842, 215,960, PURP)
+
+ # ══════════════════════════════════════════════════════════════════════════
+ # COMPANY-SPECIFIC BRANCH CONTENT
+ # ══════════════════════════════════════════════════════════════════════════
+ if COMPANY == "trilinc":
+
+ # B1 — GLORIA NELUND
+ draw_circle(B1_CX,B1_CY,B1_R, AMBER,"gAmb","Gloria Nelund · CEO", img=B1_D, clip_id="b1Clip")
+ snode(15,104, 420,86,AMBER,"gAmb","CEO, Founder & President","Chief Compliance Officer · TriLinc","star")
+ snode(15,240, 420,86,AMBER,"gAmb","Deutsche Bank: CEO US Private Wealth","Managed $50B · World's 5th largest bank","chart")
+ snode(15,436, 420,86,AMBER,"gAmb","Founded TriLinc 2008","40+ years in international asset management","trending")
+
+ # B2 — FUND OVERVIEW
+ draw_circle(B2_CX,B2_CY,B2_R, CYAN,"gCyn","FUND OVERVIEW", img=B2_D, clip_id="b2Clip", fallback="FO")
+ snode(460,14, 410,86,CYAN,"gCyn","Founded: 2008 · Delaware, USA","Ticker: TRLC · Public offering closed 2017","clock")
+ snode(1010,14, 430,86,CYAN,"gCyn","~$1.4B AUM · TriLinc Global Advisors","Female-founded · -owned · -led","building")
+
+ # B3 — INDUSTRY POSITION
+ draw_circle(B3_CX,B3_CY,B3_R, LIME,"gLme","INDUSTRY POSITION",
+ inner_svg=ecr_gauge(B3_CX,B3_CY,124,150,"TOP-RATED"))
+ snode(1474, 8, 430,86,LIME,"gLme","ECR: 124% · Top-Rated · RealRate","#1 of 4 US Finance Services companies","star")
+ snode(1474,104, 430,86,LIME,"gLme","46pp above industry avg (78%)","Highest ECR in US Finance Services 2025","chart")
+
+ # B4 — FINANCIAL HEALTH
+ draw_circle(B4_CX,B4_CY,B4_R, SKY,"gSky","FINANCIAL HEALTH",
+ inner_svg=balance_sheet_svg(B4_CX,B4_CY,"$282.8M"))
+ snode(1560,248, 350,86,SKY,"gSky","Total Assets: $282.8M","Stockholders' Equity: $272.6M","dollar")
+ snode(1560,344, 350,86,SKY,"gSky","Liabilities: $10.2M","Equity-to-Assets ratio: 96.4%","chart")
+ snode(1560,440, 350,86,SKY,"gSky","Net Income: –$8.5M","ECR driver: Equity +57pp · Revenue –17pp","trending")
+
+ # B5 — INVESTMENT STRATEGY
+ draw_circle(B5_CX,B5_CY,B5_R, EMER,"gEmr","INVESTMENT STRATEGY",
+ inner_svg=pie_svg(B5_CX,B5_CY,32,[(40,LIME),(30,CYAN),(20,AMBER),(10,EMER)],"SME"))
+ snode(1462,620, 440,86,EMER,"gEmr","Direct loans · Loan participations","Trade finance · Convertible debt","dollar")
+ snode(1462,716, 440,86,EMER,"gEmr","Target: SMEs with <500 employees","Developing economies · local sub-advisors","globe")
+ snode(1462,812, 440,86,EMER,"gEmr","Structured credit · Preferred equity","Growth-stage businesses · 4 continents","chart")
+
+ # B6 — IMPACT FOCUS
+ draw_circle(B6_CX,B6_CY,B6_R, ORAN,"gOrn","IMPACT FOCUS",
+ img=B6_D, clip_id="b6Clip", svg_icon=svg_leaf(B6_CX,B6_CY,ORAN))
+ snode(530,940, 380,86,ORAN,"gOrn","Building Sustainable Communities","Education · Energy · Housing · Health","leaf")
+ snode(920,940, 380,86,ORAN,"gOrn","Strengthening the Workforce","Job creation · Equality · Capacity building","people")
+ snode(1310,940,380,86,ORAN,"gOrn","Financial inclusion · Food security","Measurable social impact metrics tracked","globe")
+
+ # B7 — MISSION & HISTORY
+ draw_circle(B7_CX,B7_CY,B7_R, PURP,"gMH","Mission & History",
+ svg_icon=svg_handshake(B7_CX,B7_CY,PURP))
+ snode(15,725, 400,86,PURP,"gPrp","2008: Founded · Delaware, USA","Female-founded · -owned · -led fund","clock")
+ snode(15,821, 400,86,PURP,"gPrp","2017: Public offering closed","TRLC listed · OTC Pink Markets","trending")
+ snode(15,917, 400,86,PURP,"gPrp","2025: #1 US Finance Services · RealRate","Named Top Real Leader of Impact Investing","star")
+
+ # DECORATIVE
+ draw_circle(D1_CX,D1_CY,D1_R, ORAN,"gOrn","Global Reach",
+ img=B6_D, clip_id="d1Clip", svg_icon=svg_globe(D1_CX,D1_CY,ORAN))
+ draw_circle(D2_CX,D2_CY,D2_R, EMER,"gEmr","Sub-Advisors",
+ svg_icon=svg_handshake(D2_CX,D2_CY,EMER))
+ draw_circle(D3_CX,D3_CY,D3_R, LIME,"gLme","ECR Trend",
+ svg_icon=svg_trend(D3_CX,D3_CY,LIME,"ECR +46pp"))
+ draw_circle(D4_CX,D4_CY,D4_R, CYAN,"gCyn","$1.4B AUM", fallback=" ")
+ t(D4_CX, D4_CY-6, "$1.4B", 22, WH, "middle", "800")
+ t(D4_CX, D4_CY+12, "AUM", 16, CYAN, "middle", "700")
+
+ ECR_VAL, RANK_VAL, STATUS_VAL = "124%", "#1 / 4", "Top-Rated"
+
+ elif COMPANY == "strata":
+
+ # B1 — AIR MEDICAL SERVICES
+ draw_circle(B1_CX,B1_CY,B1_R, AMBER,"gAmb","Air Medical Services",
+ img=B1_D, clip_id="b1Clip", svg_icon=svg_helicopter(B1_CX,B1_CY,AMBER))
+ snode(15,104, 420,86,AMBER,"gAmb","Air Medical Transport · Critical Care","Emergency Response Services","star")
+ snode(15,240, 420,86,AMBER,"gAmb","OTC-listed · CIK: 0001779128 · Delaware","Air ambulance services · US market","building")
+ snode(15,436, 420,86,AMBER,"gAmb","Critical airborne medical transport","Serving patients across US air network","trending")
+
+ # B2 — COMPANY OVERVIEW
+ draw_circle(B2_CX,B2_CY,B2_R, CYAN,"gCyn","COMPANY OVERVIEW",
+ img=B2_D, clip_id="b2Clip", fallback="CO")
+ snode(460,14, 410,86,CYAN,"gCyn","Air Medical Transport · Critical Care","Emergency Response · Delaware, USA","clock")
+ snode(1010,14, 430,86,CYAN,"gCyn","CIK: 0001779128 · OTC-listed · STCM","US Air Industry · Publicly reporting","news")
+
+ # B3 — INDUSTRY POSITION
+ draw_circle(B3_CX,B3_CY,B3_R, LIME,"gLme","INDUSTRY POSITION",
+ inner_svg=ecr_gauge(B3_CX,B3_CY,123,150,"TOP-RATED"))
+ snode(1474, 8, 430,86,LIME,"gLme","ECR: 123% · Top-Rated · RealRate","#1 of 4 US Air companies","star")
+ snode(1474,104, 430,86,LIME,"gLme","54pp above industry avg (69%)","Highest ECR in US Air 2025","chart")
+
+ # B4 — FINANCIAL HEALTH
+ draw_circle(B4_CX,B4_CY,B4_R, SKY,"gSky","FINANCIAL HEALTH",
+ inner_svg=balance_sheet_svg(B4_CX,B4_CY,"$325.5M"))
+ snode(1560,248, 350,86,SKY,"gSky","Total Assets: $325.5M","Stockholders' Equity: $279.1M","dollar")
+ snode(1560,344, 350,86,SKY,"gSky","Liabilities: $46.4M","Revenue: $197.1M (FY2025)","chart")
+ snode(1560,440, 350,86,SKY,"gSky","Net Income: +$41.3M","First profitable year in company history","trending")
+
+ # B5 — ECR ANALYSIS
+ draw_circle(B5_CX,B5_CY,B5_R, EMER,"gEmr","ECR ANALYSIS",
+ inner_svg=ecr_drivers_svg(B5_CX,B5_CY,"+46pp","–81pp","123%","TOP-RATED"))
+ snode(1462,620, 440,86,EMER,"gEmr","Greatest Strength: Operating Expenses","+46pp contribution to ECR","chart")
+ snode(1462,716, 440,86,EMER,"gEmr","Greatest Weakness: Other Expenses","–81pp drag on ECR","trending")
+ snode(1462,812, 440,86,EMER,"gEmr","ECR: 123% · 54pp above industry avg","Market average: 69%","star")
+
+ # B6 — 2025 HIGHLIGHTS
+ draw_circle(B6_CX,B6_CY,B6_R, ORAN,"gOrn","2025 HIGHLIGHTS",
+ img=B6_D, clip_id="b6Clip", svg_icon=svg_helicopter(B6_CX,B6_CY,ORAN))
+ snode(530,940, 380,86,ORAN,"gOrn","FY2025 Revenue: $197.1M","Net Income: +$41.3M (first profitable)","dollar")
+ snode(920,940, 380,86,ORAN,"gOrn","Equity: $279.1M · Assets: $325.5M","Equity-to-Assets ratio: 85.8%","chart")
+ snode(1310,940,380,86,ORAN,"gOrn","ECR trajectory: 87→92→73→90→123%","Consistent upward ECR momentum","trending")
+
+ # B7 — GROWTH JOURNEY
+ draw_circle(B7_CX,B7_CY,B7_R, PURP,"gMH","Growth Journey",
+ svg_icon=svg_growth(B7_CX,B7_CY,PURP))
+ snode(15,725, 400,86,PURP,"gPrp","2021: Revenue $50.5M · Net Income –$40.1M","Rapid expansion phase begins","clock")
+ snode(15,821, 400,86,PURP,"gPrp","2022–2024: Revenue $146M → $249M","~4× growth in 3 years","trending")
+ snode(15,917, 400,86,PURP,"gPrp","2025: ECR 123% · #1 US Air · RealRate","First profitable year in history","star")
+
+ # DECORATIVE
+ draw_circle(D1_CX,D1_CY,D1_R, AMBER,"gAmb","Air Fleet",
+ img=B6_D, clip_id="d1Clip", svg_icon=svg_helicopter(D1_CX,D1_CY,AMBER))
+ draw_circle(D2_CX,D2_CY,D2_R, CYAN,"gCyn","Medical Care",
+ svg_icon=svg_cross(D2_CX,D2_CY,CYAN))
+ draw_circle(D3_CX,D3_CY,D3_R, LIME,"gLme","ECR Trend",
+ svg_icon=svg_trend(D3_CX,D3_CY,LIME,"→ 123%"))
+ draw_circle(D4_CX,D4_CY,D4_R, SKY,"gSky","Revenue", fallback=" ")
+ t(D4_CX, D4_CY-6, "$197M", 22, WH, "middle", "800")
+ t(D4_CX, D4_CY+12, "FY2025", 16, SKY, "middle", "700")
+
+ ECR_VAL, RANK_VAL, STATUS_VAL = "123%", "#1 / 4", "Top-Rated"
+
+ elif COMPANY == "hp":
+
+ # B1 — ENRIQUE LORES
+ draw_circle(B1_CX,B1_CY,B1_R, AMBER,"gAmb","Enrique Lores · CEO", img=B1_D, clip_id="b1Clip")
+ snode(15,104, 420,86,AMBER,"gAmb","President & CEO since November 2019","Joined HP in 1989 · 35+ years with HP","star")
+ snode(15,240, 420,86,AMBER,"gAmb","Led Imaging, Printing & Solutions","MBA IESE · Industrial Engineering","chart")
+ snode(15,436, 420,86,AMBER,"gAmb","'Future Ready' transformation plan","AI PCs · Subscriptions · Cost efficiency","trending")
+
+ # B2 — COMPANY OVERVIEW
+ draw_circle(B2_CX,B2_CY,B2_R, CYAN,"gCyn","COMPANY OVERVIEW",
+ img=B2_D, clip_id="b2Clip", fallback="HP")
+ snode(460,14, 410,86,CYAN,"gCyn","Founded: 1939 · Palo Alto, California","Split from Hewlett-Packard: November 2015","clock")
+ snode(1010,14, 430,86,CYAN,"gCyn","~58,000 employees worldwide","HQ: 1501 Page Mill Rd · Palo Alto, CA","building")
+
+ # B3 — INDUSTRY POSITION
+ draw_circle(B3_CX,B3_CY,B3_R, LIME,"gLme","INDUSTRY POSITION",
+ inner_svg=ecr_gauge(B3_CX,B3_CY,258,300,"RATED"))
+ snode(1474, 8, 430,86,LIME,"gLme","ECR: 258% · Rated · RealRate","#9 of 17 US Computers companies","star")
+ snode(1474,104, 430,86,LIME,"gLme","At the industry average (258%)","Balance sheet leverage offsets revenue strength","chart")
+
+ # B4 — FINANCIAL HEALTH
+ draw_circle(B4_CX,B4_CY,B4_R, SKY,"gSky","FINANCIAL HEALTH",
+ inner_svg=balance_sheet_svg(B4_CX,B4_CY,"$39.9B"))
+ snode(1560,248, 350,86,SKY,"gSky","Revenue: $53.6B (FY2024)","Net Income: $2.8B · EPS: $2.81","dollar")
+ snode(1560,344, 350,86,SKY,"gSky","Operating margin: 7.1%","R&D investment: $1.64B","chart")
+ snode(1560,440, 350,86,SKY,"gSky","Total Assets: $39.9B · Cash: $3.25B","LT Debt: $8.3B · Equity Deficit: –$1.3B","trending")
+
+ # B5 — BUSINESS SEGMENTS
+ draw_circle(B5_CX,B5_CY,B5_R, EMER,"gEmr","BUSINESS SEGMENTS",
+ inner_svg=pie_svg(B5_CX,B5_CY,32,[(64.3,LIME),(35.7,CYAN)],"2 SEG",fsize=7))
+ snode(1462,620, 440,86,EMER,"gEmr","Personal Systems: ~$34.4B · 64%","PCs · Laptops · Workstations · Chromebooks","chart")
+ snode(1462,716, 440,86,EMER,"gEmr","Printing: ~$19.1B · 36%","LaserJet · OfficeJet · Instant Ink · Supplies","dollar")
+ snode(1462,812, 440,86,EMER,"gEmr","Stockholders' Equity: –$1.3B","Liabilities: $41.2B · Buyback-driven balance sheet","trending")
+
+ # B6 — STRATEGY & INNOVATION
+ draw_circle(B6_CX,B6_CY,B6_R, ORAN,"gOrn","STRATEGY & INNOVATION",
+ img=B6_D, clip_id="b6Clip", svg_icon=svg_globe(B6_CX,B6_CY,ORAN))
+ snode(530,940, 380,86,ORAN,"gOrn","AI PC leadership · HP Omnibook Ultra","Neural Processing Unit · Windows AI integration","trending")
+ snode(920,940, 380,86,ORAN,"gOrn","HP+ Instant Ink subscription model","Recurring revenue · Sustainability · HP Planet Partners","leaf")
+ snode(1310,940,380,86,ORAN,"gOrn","Poly collaboration hardware (acq. 2022)","Hybrid work solutions · Video conferencing","globe")
+
+ # B7 — COMPANY HISTORY
+ draw_circle(B7_CX,B7_CY,B7_R, PURP,"gMH","Company History",
+ svg_icon=svg_growth(B7_CX,B7_CY,PURP))
+ snode(15,725, 400,86,PURP,"gPrp","1939: Founded by Hewlett & Packard","Palo Alto garage · HP200A audio oscillator","clock")
+ snode(15,821, 400,86,PURP,"gPrp","2015: HP splits into HP Inc. & HPE","HP Inc. keeps HPQ · PC & Printer business","trending")
+ snode(15,917, 400,86,PURP,"gPrp","FY2024: Revenue $53.6B · ECR 258% · RealRate","'Future Ready' AI transformation underway","star")
+
+ # DECORATIVE
+ draw_circle(D1_CX,D1_CY,D1_R, ORAN,"gOrn","Global Reach",
+ img=B6_D, clip_id="d1Clip", svg_icon=svg_globe(D1_CX,D1_CY,ORAN))
+ draw_circle(D2_CX,D2_CY,D2_R, CYAN,"gCyn","Poly & Collab",
+ svg_icon=svg_handshake(D2_CX,D2_CY,CYAN))
+ draw_circle(D3_CX,D3_CY,D3_R, LIME,"gLme","ECR Trend",
+ svg_icon=svg_trend(D3_CX,D3_CY,LIME,"258%"))
+ draw_circle(D4_CX,D4_CY,D4_R, SKY,"gSky","$53.6B", fallback=" ")
+ t(D4_CX, D4_CY-6, "$53.6B", 19, WH, "middle", "800")
+ t(D4_CX, D4_CY+12, "Revenue", 14, SKY, "middle", "700")
+
+ ECR_VAL, RANK_VAL, STATUS_VAL = "258%", "#9 / 17", "Rated"
+
+ elif COMPANY == "angi":
+
+ # B1 — JEFF KIP / LEADERSHIP
+ draw_circle(B1_CX,B1_CY,B1_R, AMBER,"gAmb","Jeff Kip · CEO",
+ img=B1_D, clip_id="b1Clip", svg_icon=svg_house(B1_CX,B1_CY,AMBER))
+ snode(15,104, 420,86,AMBER,"gAmb","Chief Executive Officer, Angi Inc.","NASDAQ: ANGI · Denver, Colorado","star")
+ snode(15,240, 420,86,AMBER,"gAmb","IAC subsidiary · ~4,500 employees","Brands: Angi · HomeAdvisor · Handy","building")
+ snode(15,436, 420,86,AMBER,"gAmb","Platform transformation · AI integration","Connecting homeowners with professionals","trending")
+
+ # B2 — COMPANY OVERVIEW
+ draw_circle(B2_CX,B2_CY,B2_R, CYAN,"gCyn","COMPANY OVERVIEW",
+ img=B2_D, clip_id="b2Clip", fallback="AN")
+ snode(460,14, 410,86,CYAN,"gCyn","Founded: 1995 · Denver, Colorado","Formed 2017 via HomeAdvisor & Angie's List merger","clock")
+ snode(1010,14, 430,86,CYAN,"gCyn","~4,500 employees worldwide","Ticker: ANGI · NASDAQ · IAC subsidiary","building")
+
+ # B3 — INDUSTRY POSITION
+ draw_circle(B3_CX,B3_CY,B3_R, LIME,"gLme","INDUSTRY POSITION",
+ inner_svg=ecr_gauge(B3_CX,B3_CY,157,200,"TOP-RATED"))
+ snode(1474, 8, 430,86,LIME,"gLme","ECR: 157% · Top-Rated · RealRate","#1 of 4 US Advertising companies","star")
+ snode(1474,104, 430,86,LIME,"gLme","78pp above industry avg (80%)","Highest ECR in US Advertising 2025","chart")
+
+ # B4 — FINANCIAL HEALTH
+ draw_circle(B4_CX,B4_CY,B4_R, SKY,"gSky","FINANCIAL HEALTH",
+ inner_svg=balance_sheet_svg(B4_CX,B4_CY,"$1.68B"))
+ snode(1560,248, 350,86,SKY,"gSky","Total Assets: $1.68B","Stockholders' Equity: $1.46B","dollar")
+ snode(1560,344, 350,86,SKY,"gSky","Liabilities: $222.4M","Revenue: $1.03B","chart")
+ snode(1560,440, 350,86,SKY,"gSky","Net Income: +$43.8M","Equity-to-Assets ratio: 86.7%","trending")
+
+ # B5 — PLATFORM & BRANDS
+ draw_circle(B5_CX,B5_CY,B5_R, EMER,"gEmr","PLATFORM & BRANDS",
+ inner_svg=pie_svg(B5_CX,B5_CY,32,[(50,LIME),(30,CYAN),(20,AMBER)],"3 BRANDS",fsize=6.5))
+ snode(1462,620, 440,86,EMER,"gEmr","Angi (formerly Angie's List)","Homeowner marketplace · Reviews · Cost guides","globe")
+ snode(1462,716, 440,86,EMER,"gEmr","HomeAdvisor · Instant Pro Connect","Local professionals · Project cost estimator","people")
+ snode(1462,812, 440,86,EMER,"gEmr","Handy · On-demand home services","Cleaning · Assembly · Moving · Repairs","chart")
+
+ # B6 — 2025 HIGHLIGHTS
+ draw_circle(B6_CX,B6_CY,B6_R, ORAN,"gOrn","2025 HIGHLIGHTS",
+ img=B6_D, clip_id="b6Clip", svg_icon=svg_house(B6_CX,B6_CY,ORAN))
+ snode(530,940, 380,86,ORAN,"gOrn","Revenue: $1.03B · Net Income: +$43.8M","ECR Strength: Equity +68pp","dollar")
+ snode(920,940, 380,86,ORAN,"gOrn","Equity: $1.46B · Assets: $1.68B","Equity-to-Assets ratio: 86.7%","chart")
+ snode(1310,940,380,86,ORAN,"gOrn","ECR Weakness: Marketing Expenses –22pp","Industry avg: 80% · 78pp above average","trending")
+
+ # B7 — COMPANY HISTORY
+ draw_circle(B7_CX,B7_CY,B7_R, PURP,"gMH","Company History",
+ svg_icon=svg_growth(B7_CX,B7_CY,PURP))
+ snode(15,725, 400,86,PURP,"gPrp","1995: Angie's List · Columbus, Ohio","Crowd-sourced reviews for home contractors","clock")
+ snode(15,821, 400,86,PURP,"gPrp","1998: ServiceMagic → HomeAdvisor (2012)","2017: ANGI Homeservices via merger","trending")
+ snode(15,917, 400,86,PURP,"gPrp","2021: Rebranded to Angi Inc. · NASDAQ","2025: #1 US Advertising · RealRate","star")
+
+ # DECORATIVE
+ draw_circle(D1_CX,D1_CY,D1_R, ORAN,"gOrn","Home Services",
+ img=B6_D, clip_id="d1Clip", svg_icon=svg_house(D1_CX,D1_CY,ORAN))
+ draw_circle(D2_CX,D2_CY,D2_R, CYAN,"gCyn","Pro Network",
+ svg_icon=svg_handshake(D2_CX,D2_CY,CYAN))
+ draw_circle(D3_CX,D3_CY,D3_R, LIME,"gLme","ECR Trend",
+ svg_icon=svg_trend(D3_CX,D3_CY,LIME,"→ 157%"))
+ draw_circle(D4_CX,D4_CY,D4_R, SKY,"gSky","$1.03B", fallback=" ")
+ t(D4_CX, D4_CY-6, "$1.03B", 20, WH, "middle", "800")
+ t(D4_CX, D4_CY+12, "Revenue", 14, SKY, "middle", "700")
+
+ ECR_VAL, RANK_VAL, STATUS_VAL = "157%", "#1 / 4", "Top-Rated"
+
+ elif COMPANY == "nvidia":
-## Automation scripts (run outside Claude)
+ # B1 — JENSEN HUANG
+ draw_circle(B1_CX,B1_CY,B1_R, AMBER,"gAmb","Jensen Huang · CEO", img=B1_D, clip_id="b1Clip")
+ snode(15,104, 420,86,AMBER,"gAmb","Co-Founder & CEO since 1993 · NVDA","Pioneer of GPU computing · CUDA architect","star")
+ snode(15,240, 420,86,AMBER,"gAmb","Oregon State BSc EE · Stanford MS EE","30+ years leading Nvidia as CEO","chart")
+ snode(15,436, 420,86,AMBER,"gAmb","Led Nvidia from gaming GPUs to AI supercomputing",""The most important chip company in the world"","trending")
-- PowerShell: `.\run_mindmaps.ps1 apple nvidia` or `.\run_mindmaps.ps1 all`
-- Bash: `bash run_mindmaps.sh apple nvidia` or `bash run_mindmaps.sh all`
+ # B2 — COMPANY OVERVIEW
+ draw_circle(B2_CX,B2_CY,B2_R, CYAN,"gCyn","COMPANY OVERVIEW",
+ img=B2_D, clip_id="b2Clip", fallback="NV")
+ snode(460,14, 410,86,CYAN,"gCyn","Founded: April 5, 1993 · Santa Clara, CA","Founders: Huang · Priem · Malachowsky","clock")
+ snode(1010,14, 430,86,CYAN,"gCyn","~36,000 employees worldwide","HQ: Endeavor Campus · Santa Clara, CA","building")
+
+ # B3 — INDUSTRY POSITION
+ draw_circle(B3_CX,B3_CY,B3_R, LIME,"gLme","INDUSTRY POSITION",
+ inner_svg=ecr_gauge(B3_CX,B3_CY,351,400,"TOP-RATED"))
+ snode(1474, 8, 430,86,LIME,"gLme","ECR: 351% · Top-Rated · RealRate","#8 of 44 US Semiconductors companies","star")
+ snode(1474,104, 430,86,LIME,"gLme","98pp above industry avg (253%)","Top-Rated in US Semiconductors 2025","chart")
+
+ # B4 — FINANCIAL HEALTH
+ draw_circle(B4_CX,B4_CY,B4_R, SKY,"gSky","FINANCIAL HEALTH",
+ inner_svg=balance_sheet_svg(B4_CX,B4_CY,"$111.6B"))
+ snode(1560,248, 350,86,SKY,"gSky","Revenue: $130.5B (FY2025)","Net Income: $72.9B","dollar")
+ snode(1560,344, 350,86,SKY,"gSky","Total Assets: $111.6B","Stockholders' Equity: $79.3B","chart")
+ snode(1560,440, 350,86,SKY,"gSky","Liabilities: $32.3B","R&D investment: $12.9B","trending")
+
+ # B5 — BUSINESS SEGMENTS
+ draw_circle(B5_CX,B5_CY,B5_R, EMER,"gEmr","BUSINESS SEGMENTS",
+ inner_svg=pie_svg(B5_CX,B5_CY,32,[(88.3,LIME),(8.7,CYAN),(3.0,AMBER)],"DC 88%",fsize=6.5))
+ snode(1462,620, 440,86,EMER,"gEmr","Data Center: ~$115.2B · 88%","AI training · inference · HPC · NVLink","chart")
+ snode(1462,716, 440,86,EMER,"gEmr","Gaming: ~$11.4B · 9%","GeForce RTX 50 series · DLSS 4 · Ray Tracing","dollar")
+ snode(1462,812, 440,86,EMER,"gEmr","Pro Viz · Automotive · OEM: ~$3.9B · 3%","DRIVE platform · Omniverse · Jetson","globe")
+
+ # B6 — AI LEADERSHIP
+ draw_circle(B6_CX,B6_CY,B6_R, ORAN,"gOrn","AI LEADERSHIP",
+ svg_icon=svg_neural(B6_CX,B6_CY,ORAN))
+ snode(530,940, 380,86,ORAN,"gOrn","Blackwell GPU architecture launch 2025","B200 · GB200 NVL72 · AI superchip era","trending")
+ snode(920,940, 380,86,ORAN,"gOrn","Revenue +114% YoY · Net Income +145%","AI demand acceleration · Data Center boom","chart")
+ snode(1310,940,380,86,ORAN,"gOrn","CUDA platform · 3M+ developers","Software ecosystem moat · AI standard","globe")
+
+ # B7 — COMPANY HISTORY
+ draw_circle(B7_CX,B7_CY,B7_R, PURP,"gMH","Company History",
+ svg_icon=svg_growth(B7_CX,B7_CY,PURP))
+ snode(15,725, 400,86,PURP,"gPrp","1993: Founded · Santa Clara, CA","Jensen Huang · Priem · Malachowsky","clock")
+ snode(15,821, 400,86,PURP,"gPrp","1999: GeForce 256 — world's first GPU","2006: CUDA — AI computing foundation","trending")
+ snode(15,917, 400,86,PURP,"gPrp","2025: ECR 351% · #8 US Semiconductors · RealRate","Revenue +114% YoY · AI supercycle","star")
+
+ # DECORATIVE
+ draw_circle(D1_CX,D1_CY,D1_R, ORAN,"gOrn","AI Chips",
+ img=NV_GPU_D, clip_id="d1Clip", svg_icon=svg_chip(D1_CX,D1_CY,ORAN))
+ draw_circle(D2_CX,D2_CY,D2_R, CYAN,"gCyn","Data Center",
+ img=NV_DC_D, clip_id="d2Clip", svg_icon=svg_wrench(D2_CX,D2_CY,CYAN))
+ draw_circle(D3_CX,D3_CY,D3_R, LIME,"gLme","ECR Trend",
+ svg_icon=svg_trend(D3_CX,D3_CY,LIME,"→ 351%"))
+ draw_circle(D4_CX,D4_CY,D4_R, SKY,"gSky","$130.5B", fallback=" ")
+ t(D4_CX, D4_CY-6, "$130.5B", 18, WH, "middle", "800")
+ t(D4_CX, D4_CY+12, "Revenue", 14, SKY, "middle", "700")
+
+ ECR_VAL, RANK_VAL, STATUS_VAL = "351%", "#8 / 44", "Top-Rated"
+
+ elif COMPANY == "tesla":
+
+ # B1 — ELON MUSK
+ draw_circle(B1_CX,B1_CY,B1_R, TBLUE,"gTBlu","Elon Musk · CEO", img=B1_D, clip_id="b1Clip")
+ snode(15,104, 420,86,TBLUE,"gTBlu","Co-Founder & CEO since 2008 · TSLA","SpaceX · xAI · Neuralink · The Boring Co","star")
+ snode(15,240, 420,86,TBLUE,"gTBlu","BSc Physics & Economics — Univ. Pennsylvania","Founded Zip2 (1995) · X.com → PayPal (1999)","chart")
+ snode(15,436, 420,86,TBLUE,"gTBlu","Autonomous AI vision: FSD & Robotaxi 2026","Tesla Bot (Optimus) · AI Supercomputer: Dojo","trending")
+
+ # B2 — COMPANY OVERVIEW
+ draw_circle(B2_CX,B2_CY,B2_R, CYAN,"gCyn","COMPANY OVERVIEW",
+ img=B2_D, clip_id="b2Clip", fallback="TS")
+ snode(460,14, 410,86,CYAN,"gCyn","Founded: July 1, 2003 · San Carlos, CA","HQ: Austin, Texas (relocated 2021) · NASDAQ: TSLA","clock")
+ snode(1010,14, 430,86,CYAN,"gCyn","~125,665 employees worldwide","Gigafactories: Austin · Berlin · Shanghai · Fremont","building")
+
+ # B3 — INDUSTRY POSITION
+ draw_circle(B3_CX,B3_CY,B3_R, SKY,"gSky","INDUSTRY POSITION",
+ inner_svg=ecr_gauge(B3_CX,B3_CY,135,150,"TOP-RATED",col=SKY))
+ snode(1474, 8, 430,86,SKY,"gSky","ECR: 135% · Top-Rated · RealRate","#9 of 38 US Motor companies","star")
+ snode(1474,104, 430,86,SKY,"gSky","34pp above industry avg (102%)","9 of 38 US Motor companies Top-Rated","chart")
+
+ # B4 — FINANCIAL HEALTH
+ draw_circle(B4_CX,B4_CY,B4_R, SKY,"gSky","FINANCIAL HEALTH",
+ inner_svg=balance_sheet_svg(B4_CX,B4_CY,"$137.8B"))
+ snode(1560,248, 350,86,SKY,"gSky","Revenue: $94.8B (FY2025)","Net Income: $3.9B · R&D: $6.4B","dollar")
+ snode(1560,344, 350,86,SKY,"gSky","Total Assets: $137.8B","Stockholders' Equity: $82.9B","chart")
+ snode(1560,440, 350,86,SKY,"gSky","Liabilities: $54.9B","Equity-to-Assets ratio: 60.2%","trending")
+
+ # B5 — BUSINESS SEGMENTS
+ draw_circle(B5_CX,B5_CY,B5_R, TAQUA,"gTAqua","BUSINESS SEGMENTS",
+ inner_svg=pie_svg(B5_CX,B5_CY,32,[(81,SKY),(13,CYAN),(6,TBLUE)],"3 SEG",fsize=6.5))
+ snode(1462,620, 440,86,TAQUA,"gTAqua","Automotive: ~$77.1B · ~81%","Model 3/Y/S/X/Cybertruck · FSD · Robotaxi","trending")
+ snode(1462,716, 440,86,TAQUA,"gTAqua","Energy Gen & Storage: ~$11.6B · ~13%","Powerwall · Megapack · Solar Roof","chart")
+ snode(1462,812, 440,86,TAQUA,"gTAqua","Services & Other: ~$6.1B · ~6%","Supercharger · Insurance · Tesla Fleet","globe")
+
+ # B6 — 2025 HIGHLIGHTS
+ draw_circle(B6_CX,B6_CY,B6_R, TAQUA,"gTAqua","2025 HIGHLIGHTS",
+ img=B6_D, clip_id="b6Clip", svg_icon=svg_car(B6_CX,B6_CY,TAQUA))
+ snode(530,940, 380,86,TAQUA,"gTAqua","Revenue: $94.8B · Net Income: $3.9B","R&D: $6.4B · SG&A: $5.8B · Tesla IR 2025","dollar")
+ snode(920,940, 380,86,TAQUA,"gTAqua","~1.79M vehicles delivered · FY2025","Cybertruck ramp · Model Y Juniper refresh","chart")
+ snode(1310,940,380,86,TAQUA,"gTAqua","Optimus production starts · FSD v13","Robotaxi pilot · Austin, TX · Tesla Shareholder","trending")
+
+ # B7 — COMPANY HISTORY
+ draw_circle(B7_CX,B7_CY,B7_R, PURP,"gMH","Company History",
+ svg_icon=svg_growth(B7_CX,B7_CY,PURP))
+ snode(15,725, 400,86,PURP,"gPrp","2003: Founded · San Carlos, California","Eberhard & Tarpenning · Musk joins 2004","clock")
+ snode(15,821, 400,86,PURP,"gPrp","2010: TSLA IPO · NASDAQ · 2012: Model S","First US EV company IPO since Ford (1956)","trending")
+ snode(15,917, 400,86,PURP,"gPrp","2025: ECR 135% · #9 US Motor · RealRate","Revenue $94.8B · Robotaxi & Optimus era","star")
+
+ # DECORATIVE
+ draw_circle(D1_CX,D1_CY,D1_R, TBLUE,"gTBlu","EV Pioneer",
+ svg_icon=svg_car(D1_CX,D1_CY,TBLUE))
+ draw_circle(D2_CX,D2_CY,D2_R, TAQUA,"gTAqua","Energy",
+ svg_icon=svg_bolt(D2_CX,D2_CY,TAQUA))
+ draw_circle(D3_CX,D3_CY,D3_R, SKY,"gSky","ECR Trend",
+ svg_icon=svg_trend(D3_CX,D3_CY,SKY,"→ 135%"))
+ draw_circle(D4_CX,D4_CY,D4_R, CYAN,"gCyn","$94.8B", fallback=" ")
+ t(D4_CX, D4_CY-6, "$94.8B", 20, WH, "middle", "800")
+ t(D4_CX, D4_CY+12, "Revenue", 9, CYAN, "middle", "700")
+
+ ECR_VAL, RANK_VAL, STATUS_VAL = "135%", "#9 / 38", "Top-Rated"
+
+ elif COMPANY == "apple":
+
+ # B1 — TIM COOK
+ draw_circle(B1_CX,B1_CY,B1_R, AMBER,"gAmb","Tim Cook · CEO", img=B1_D, clip_id="b1Clip")
+ snode(15,104, 420,86,AMBER,"gAmb","Chief Executive Officer since August 2011","Auburn BSc IE · Duke MBA · Former Apple COO","star")
+ snode(15,240, 420,86,AMBER,"gAmb","Led services transformation & Apple Silicon","$700B+ in share buybacks since 2012","chart")
+ snode(15,436, 420,86,AMBER,"gAmb","Apple Intelligence · Spatial Computing","Vision Pro · AI integration across ecosystem","trending")
+
+ # B2 — COMPANY OVERVIEW
+ draw_circle(B2_CX,B2_CY,B2_R, CYAN,"gCyn","COMPANY OVERVIEW",
+ img=B2_D, clip_id="b2Clip", fallback="AP")
+ snode(460,14, 410,86,CYAN,"gCyn","Founded: April 1, 1976 · Cupertino, CA","Jobs · Wozniak · Wayne · NASDAQ: AAPL","clock")
+ snode(1010,14, 430,86,CYAN,"gCyn","~150,000 employees worldwide","Apple Park HQ · Cupertino, California","building")
+
+ # B3 — INDUSTRY POSITION
+ draw_circle(B3_CX,B3_CY,B3_R, LIME,"gLme","INDUSTRY POSITION",
+ inner_svg=ecr_gauge(B3_CX,B3_CY,430,500,"TOP-RATED"))
+ snode(1474, 8, 430,86,LIME,"gLme","ECR: 430% · Top-Rated · RealRate","#1 of 17 US Computers companies","star")
+ snode(1474,104, 430,86,LIME,"gLme","177pp above industry avg (253%)","Highest ECR in US Computers 2025","chart")
+
+ # B4 — FINANCIAL HEALTH
+ draw_circle(B4_CX,B4_CY,B4_R, SKY,"gSky","FINANCIAL HEALTH",
+ inner_svg=balance_sheet_svg(B4_CX,B4_CY,"$364.9B"))
+ snode(1560,248, 350,86,SKY,"gSky","Revenue: $416B (FY2025) +6% YoY","Net Income: $112B · Op. Margin: 32%","dollar")
+ snode(1560,344, 350,86,SKY,"gSky","Total Assets: $364.9B","Cash & Securities: $162B","chart")
+ snode(1560,440, 350,86,SKY,"gSky","R&D: $34.6B · Market Cap: $3.0T","Stockholders' Equity: $56.9B","trending")
+
+ # B5 — BUSINESS SEGMENTS
+ draw_circle(B5_CX,B5_CY,B5_R, EMER,"gEmr","BUSINESS SEGMENTS",
+ inner_svg=pie_svg(B5_CX,B5_CY,32,[(48,ORAN),(23,LIME),(29,CYAN)],"3 SEG",fsize=6.5))
+ snode(1462,620, 440,86,EMER,"gEmr","iPhone: ~$201B · 48%","iPhone 16 series · Apple Intelligence · 5G","chart")
+ snode(1462,716, 440,86,EMER,"gEmr","Services: ~$96B · 23%","App Store · iCloud · Apple TV+ · Apple Pay","dollar")
+ snode(1462,812, 440,86,EMER,"gEmr","Mac · iPad · Wearables: ~$119B · 29%","Apple Silicon · Vision Pro · AirPods Pro","globe")
+
+ # B6 — 2025 HIGHLIGHTS
+ draw_circle(B6_CX,B6_CY,B6_R, ORAN,"gOrn","2025 HIGHLIGHTS",
+ img=B6_D, clip_id="b6Clip", svg_icon=svg_chip(B6_CX,B6_CY,ORAN))
+ snode(530,940, 380,86,ORAN,"gOrn","Revenue: $416B (+6% YoY)","Net Income: $112B · Market Cap: $3.0T","dollar")
+ snode(920,940, 380,86,ORAN,"gOrn","Apple Intelligence & Siri AI overhaul","Vision Pro spatial computing · M4 chip era","trending")
+ snode(1310,940,380,86,ORAN,"gOrn","Services record: ~$96B revenue","App Store · iCloud · Subscription platform","chart")
+
+ # B7 — COMPANY HISTORY
+ draw_circle(B7_CX,B7_CY,B7_R, PURP,"gMH","Company History",
+ svg_icon=svg_growth(B7_CX,B7_CY,PURP))
+ snode(15,725, 400,86,PURP,"gPrp","1976: Founded · Cupertino, California","Jobs · Wozniak · Wayne · Apple I computer","clock")
+ snode(15,821, 400,86,PURP,"gPrp","1984: Macintosh · 2007: iPhone launched","2011: Tim Cook becomes CEO · Post-Jobs era","trending")
+ snode(15,917, 400,86,PURP,"gPrp","2025: ECR 430% · #1 US Computers · RealRate","Revenue $416B · Market Cap $3.0T","star")
+
+ # DECORATIVE
+ draw_circle(D1_CX,D1_CY,D1_R, ORAN,"gOrn","Products",
+ img=B6_D, clip_id="d1Clip", svg_icon=svg_chip(D1_CX,D1_CY,ORAN))
+ draw_circle(D2_CX,D2_CY,D2_R, CYAN,"gCyn","Ecosystem",
+ svg_icon=svg_neural(D2_CX,D2_CY,CYAN))
+ draw_circle(D3_CX,D3_CY,D3_R, LIME,"gLme","ECR Trend",
+ svg_icon=svg_trend(D3_CX,D3_CY,LIME,"→ 430%"))
+ draw_circle(D4_CX,D4_CY,D4_R, SKY,"gSky","$3.0T", fallback=" ")
+ t(D4_CX, D4_CY-6, "$3.0T", 22, WH, "middle", "800")
+ t(D4_CX, D4_CY+12, "Mkt Cap", 14, SKY, "middle", "700")
+
+ ECR_VAL, RANK_VAL, STATUS_VAL = "430%", "#1 / 17", "Top-Rated"
+
+ elif COMPANY == "harley":
+
+ # B1 — JOCHEN ZEITZ / CEO
+ draw_circle(B1_CX,B1_CY,B1_R, AMBER,"gAmb","Jochen Zeitz · CEO",
+ img=B1_D, clip_id="b1Clip", svg_icon=svg_motorcycle(B1_CX,B1_CY,AMBER))
+ snode(15,104, 420,86,AMBER,"gAmb","President & CEO since February 2020","Architect of Hardwire 5-year strategy 2021–2025","star")
+ snode(15,240, 420,86,AMBER,"gAmb","Former CEO of Puma AG · Sustainability champion","Led HD's pivot to premium focus & profitability","chart")
+ snode(15,436, 420,86,AMBER,"gAmb","LiveWire EV spin-off 2022 · NYSE: LVWR","Selective market expansion · Global brand depth","trending")
+
+ # B2 — COMPANY OVERVIEW
+ draw_circle(B2_CX,B2_CY,B2_R, CYAN,"gCyn","COMPANY OVERVIEW",
+ img=B2_D, clip_id="b2Clip", fallback="HD")
+ snode(460,14, 410,86,CYAN,"gCyn","Founded: 1903 · Milwaukee, Wisconsin","NYSE: HOG · One of the world's oldest motorcycle brands","clock")
+ snode(1010,14, 430,86,CYAN,"gCyn","~5,900 employees worldwide","HQ: 3700 W Juneau Ave · Milwaukee, WI 53208","building")
+
+ # B3 — INDUSTRY POSITION
+ draw_circle(B3_CX,B3_CY,B3_R, LIME,"gLme","INDUSTRY POSITION",
+ inner_svg=ecr_gauge(B3_CX,B3_CY,147,200,"TOP-RATED"))
+ snode(1474, 8, 430,86,LIME,"gLme","ECR: 147% · Top-Rated · RealRate","#5 of 38 US Motor companies","star")
+ snode(1474,104, 430,86,LIME,"gLme","45pp above industry avg (102%)","Top-Rated in US Motor 2026","chart")
+
+ # B4 — FINANCIAL HEALTH
+ draw_circle(B4_CX,B4_CY,B4_R, SKY,"gSky","FINANCIAL HEALTH",
+ inner_svg=balance_sheet_svg(B4_CX,B4_CY,"$12.1B"))
+ snode(1560,248, 350,86,SKY,"gSky","Revenue: $5.84B · Net Income: $695M","Total Assets: $12.1B","dollar")
+ snode(1560,344, 350,86,SKY,"gSky","Stockholders' Equity: $3.25B","Liabilities: ~$8.85B","chart")
+ snode(1560,440, 350,86,SKY,"gSky","ECR Strength: Stockholders' Equity +30pp","ECR Weakness: Current Liabilities –18pp","trending")
+
+ # B5 — ECR ANALYSIS
+ draw_circle(B5_CX,B5_CY,B5_R, EMER,"gEmr","ECR ANALYSIS",
+ inner_svg=ecr_drivers_svg(B5_CX,B5_CY,"+30pp","–18pp","147%","TOP-RATED"))
+ snode(1462,620, 440,86,EMER,"gEmr","Greatest Strength: Stockholders' Equity","+30pp contribution to ECR","chart")
+ snode(1462,716, 440,86,EMER,"gEmr","Greatest Weakness: Liabilities, Current","–18pp drag on ECR","trending")
+ snode(1462,812, 440,86,EMER,"gEmr","ECR: 147% · 45pp above industry avg","Market average: 102% · #5 of 38 US Motor","star")
+
+ # B6 — HARDWIRE STRATEGY / HIGHLIGHTS
+ draw_circle(B6_CX,B6_CY,B6_R, ORAN,"gOrn","HARDWIRE STRATEGY",
+ img=B6_D, clip_id="b6Clip", svg_icon=svg_motorcycle(B6_CX,B6_CY,ORAN))
+ snode(530,940, 380,86,ORAN,"gOrn","Revenue: $5.84B · Net Income: $695M","Premium motorcycle focus · Selective market expansion","dollar")
+ snode(920,940, 380,86,ORAN,"gOrn","HD Financial Services (HDFS)","Retail loans · Wholesale financing · Insurance","chart")
+ snode(1310,940,380,86,ORAN,"gOrn","LiveWire (NYSE: LVWR) · EV expansion","S2 Del Mar · S2 Mulholland · Electric future","trending")
+
+ # B7 — COMPANY HISTORY
+ draw_circle(B7_CX,B7_CY,B7_R, PURP,"gMH","Company History",
+ svg_icon=svg_growth(B7_CX,B7_CY,PURP))
+ snode(15,725, 400,86,PURP,"gPrp","1903: Founded · Milwaukee, Wisconsin","William Harley & Arthur Davidson · Backyard workshop","clock")
+ snode(15,821, 400,86,PURP,"gPrp","1969: AMF acquisition · 1981: Management buyout","120+ years of American motorcycle heritage","trending")
+ snode(15,917, 400,86,PURP,"gPrp","2026: ECR 147% · #5 US Motor · RealRate","Hardwire strategy · Premium focus · EV expansion","star")
+
+ # DECORATIVE
+ draw_circle(D1_CX,D1_CY,D1_R, ORAN,"gOrn","Heritage",
+ img=B6_D, clip_id="d1Clip", svg_icon=svg_motorcycle(D1_CX,D1_CY,ORAN))
+ draw_circle(D2_CX,D2_CY,D2_R, CYAN,"gCyn","HDFS",
+ svg_icon=svg_handshake(D2_CX,D2_CY,CYAN))
+ draw_circle(D3_CX,D3_CY,D3_R, LIME,"gLme","ECR Trend",
+ svg_icon=svg_trend(D3_CX,D3_CY,LIME,"→ 147%"))
+ draw_circle(D4_CX,D4_CY,D4_R, SKY,"gSky","$5.84B", fallback=" ")
+ t(D4_CX, D4_CY-6, "$5.84B", 20, WH, "middle", "800")
+ t(D4_CX, D4_CY+12, "Revenue", 14, SKY, "middle", "700")
+
+ ECR_VAL, RANK_VAL, STATUS_VAL = "147%", "#5 / 38", "Top-Rated"
+
+ # ══════════════════════════════════════════════════════════════════════════
+ # CENTER HUB
+ # ══════════════════════════════════════════════════════════════════════════
+ HR = 200
+
+ a(f'')
+ a(f'')
+ a(f'')
+ a(f'')
+ a(f'')
+ a(f'')
+ a(f'')
+ a(f'')
+ a(f'')
+
+ for ang_deg in [0, 90, 180, 270]:
+ a1 = math.radians(ang_deg - 18); a2 = math.radians(ang_deg + 18)
+ ri = HR - 8
+ a(f'')
+
+ for i in range(8):
+ ang = math.radians(i * 45)
+ a(f'')
+
+ # ── Hub Row 1: RealRate logo (centered, top) ─────────────────────────────
+ rl_w, rl_h = 220, 52
+ rl_x, rl_y = HCX - rl_w // 2, HY + 10
+ white_box(rl_x, rl_y, rl_w, rl_h)
+ if RL_D:
+ a(f'')
+
+ a(f'')
+
+ # ── Hub Row 2: Company logo (centered, 72×72) stacked above company name ──
+ lg_bw, lg_bh = 72, 72
+ lg_bx = HCX - lg_bw // 2 # centered
+ lg_by = HY + 76 # top of logo box
+
+ if COMPANY == "trilinc":
+ white_box(lg_bx, lg_by, lg_bw, lg_bh, op=.3)
+ a(f''
+ f''
+ f''
+ f''
+ f''
+ f'')
+ t(HCX, HY+170, "TriLinc Global", 36, WH, "middle", "800")
+ t(HCX, HY+170, "Impact Investing · SME Lending · Developing Economies", 17, GREY, "middle", "500", op=.88, sp=".4")
+ t(HCX, HY+184, "TRLC · Est. 2008 · Delaware, USA", 18, GREY, "middle", "500", sp=".3")
+
+ elif COMPANY == "strata":
+ if not hub_logo_png(lg_bx, lg_by, LOGO_D):
+ a(f''
+ f''
+ f''
+ f''
+ f''
+ f''
+ f''
+ f''
+ f''
+ f''
+ f'')
+ t(HCX, HY+164, "Strata Critical", 28, WH, "middle", "800")
+ t(HCX, HY+192, "Medical", 28, WH, "middle", "800")
+ t(HCX, HY+170, "Air Medical Transport · Critical Care · Emergency Response", 17, GREY, "middle", "500", op=.88, sp=".4")
+ t(HCX, HY+184, "CIK: 0001779128 · OTC-listed · Delaware, USA", 18, GREY, "middle", "500", sp=".3")
+
+ elif COMPANY == "hp":
+ if not hub_logo_png(lg_bx, lg_by, LOGO_D):
+ a(f''
+ f''
+ f''
+ f''
+ f''
+ f'')
+ t(HCX, HY+170, "HP Inc.", 46, WH, "middle", "800")
+ t(HCX, HY+170, "Personal Systems · Printing · Technology", 17, GREY, "middle", "500", op=.88, sp=".4")
+ t(HCX, HY+184, "Est. 1939 · HPQ · Palo Alto, California", 18, GREY, "middle", "500", sp=".3")
+
+ elif COMPANY == "angi":
+ t(HCX, HY+130, "Angi Inc.", 52, WH, "middle", "800")
+ t(HCX, HY+170, "Home Services · Marketplace · Reviews", 18, GREY, "middle", "500", op=.88, sp=".4")
+ t(HCX, HY+184, "ANGI · NASDAQ · Est. 1995 · Denver, CO", 18, GREY, "middle", "500", sp=".3")
+
+ elif COMPANY == "nvidia":
+ hub_logo_png(lg_bx, lg_by, LOGO_D)
+ t(HCX, HY+170, "Nvidia Corp.", 38, WH, "middle", "800")
+ t(HCX, HY+170, "AI Computing · GPU Architecture · Data Center", 17, GREY, "middle", "500", op=.88, sp=".4")
+ t(HCX, HY+184, "NVDA · Est. 1993 · Santa Clara, California", 18, GREY, "middle", "500", sp=".3")
+
+ elif COMPANY == "apple":
+ if not hub_logo_png(lg_bx, lg_by, LOGO_D):
+ a(f''
+ f''
+ f''
+ f'')
+ t(HCX, HY+170, "Apple Inc.", 46, WH, "middle", "800")
+ t(HCX, HY+170, "iPhone · Mac · Services · Apple Intelligence", 17, GREY, "middle", "500", op=.88, sp=".4")
+ t(HCX, HY+184, "AAPL · Est. 1976 · Cupertino, California", 18, GREY, "middle", "500", sp=".3")
+
+ elif COMPANY == "tesla":
+ # Logo LEFT, name RIGHT in the same row
+ tl_cy = HY + 112 # row vertical center
+ tl_bx = HCX - 150 # logo box left edge (x=790)
+ tl_by = tl_cy - lg_bw // 2 # logo box top
+ white_box(tl_bx, tl_by, lg_bw, lg_bh, op=.3)
+ if LOGO_SVG_D:
+ _svg = base64.b64decode(LOGO_SVG_D).decode('utf-8')
+ _svg = _svg.replace('viewBox="0 0 278.67201 360.43799"', 'viewBox="0 15 278.67201 237"')
+ _svg_enc = base64.b64encode(_svg.encode('utf-8')).decode()
+ a(f'')
+ elif LOGO_D:
+ a(f'')
+ _nx = (tl_bx + lg_bw + 12 + HCX + 155) // 2 # center of right zone ≈ 984
+ t(_nx, tl_cy + 14, "Tesla Inc.", 40, WH, "middle", "800")
+ t(HCX, HY+170, "Electric Vehicles · Energy Storage · AI Robotics", 17, GREY, "middle", "500", op=.88, sp=".4")
+ t(HCX, HY+184, "TSLA · NASDAQ · Est. 2003 · Austin, Texas", 18, GREY, "middle", "500", sp=".3")
+
+ elif COMPANY == "harley":
+ if not hub_logo_png(lg_bx, lg_by, LOGO_D):
+ a(f''
+ f''
+ f'H-D'
+ f'')
+ t(HCX, HY+170, "Harley Davidson INC", 34, WH, "middle", "800")
+ t(HCX, HY+170, "Motorcycles · Financial Services · LiveWire EV", 17, GREY, "middle", "500", op=.88, sp=".4")
+ t(HCX, HY+184, "HOG · NYSE · Est. 1903 · Milwaukee, Wisconsin", 18, GREY, "middle", "500", sp=".3")
+
+ a(f'')
+ a(f'')
+
+ def badge(bx,by,bw,bh,c,label,val,fsz=24):
+ a(f'')
+ t(bx+bw//2, by+16, label, 16, c, "middle", wt="700", sp="1.1")
+ t(bx+bw//2, by+40, val, fsz, WH, "middle", "800")
+
+ # Badges centred at HCX; span 336px → fits inside circle at this y (r=200, d≈104)
+ by_,bh_ = HY+200, 50
+ badge(HCX-168, by_, 100, bh_, CYAN, "ECR SCORE", ECR_VAL, 28)
+ badge(HCX-60, by_, 120, bh_, AMBER, "INDUSTRY RANK",RANK_VAL, 24)
+ badge(HCX+68, by_, 100, bh_, LIME, "STATUS", STATUS_VAL, 18)
+
+ a(f'')
+ t(W//2,1070,"Powered by RealRate: Using Explainable Financial AI · realrate.ai · ECR Data from RealRate",
+ 20,"#A8D8FF","middle",op=.9,sp=".6")
+
+ a(''); return '\n'.join(p)
+
+html = (f''
+ f''
+ f''
+ f''
+ f'{build()}')
+
+# ── Output paths ───────────────────────────────────────────────────────────────
+HERE = Path(__file__).parent
+_subdirs = {
+ "trilinc": None,
+ "strata": "Strata Critical Medical",
+ "hp": "HP Inc",
+ "angi": "Angi Inc",
+ "nvidia": "Nvidia Corp",
+ "tesla": "Tesla Inc",
+ "apple": "Apple Inc",
+ "harley": "Harley Davidson INC",
+}
+_subdir = _subdirs[COMPANY]
+OUT_DIR = HERE / _subdir if _subdir else HERE
+if _subdir:
+ OUT_DIR.mkdir(exist_ok=True)
+OUT = str(OUT_DIR / f"{COMPANY}-mindmap.png")
+POST_PATH = str(OUT_DIR / f"{COMPANY}-linkedin-post.txt")
+
+# ── Render ─────────────────────────────────────────────────────────────────────
+print("Rendering…")
+with sync_playwright() as pw:
+ br = pw.chromium.launch()
+ pg = br.new_page(viewport={"width": W, "height": H}, device_scale_factor=2)
+ pg.set_content(html, timeout=60000)
+ try:
+ pg.wait_for_load_state("networkidle", timeout=45000)
+ except Exception:
+ pass
+ pg.wait_for_timeout(2500)
+ HI_OUT = OUT.replace(".png", "_2x.png")
+ pg.screenshot(path=HI_OUT, clip={"x": 0, "y": 0, "width": W, "height": H})
+ br.close()
+
+img_out = _PIL.open(HI_OUT).resize((W, H), _PIL.LANCZOS)
+img_out.save(OUT, "PNG", optimize=True)
+os.remove(HI_OUT)
+print(f"Done (1920×1080): {OUT}")
+
+# ── LinkedIn post ──────────────────────────────────────────────────────────────
+if COMPANY == "trilinc":
+ CAPTION = f"""\
+TriLinc Global Impact Fund ranks #1 in US Finance Services. ECR: 124%.
+
+46 percentage points above the industry average of 78%. Top-Rated by RealRate's independent, explainable financial AI.
+
+THE FUND
+Founded 2008 · Delaware, USA · Ticker: TRLC · ~$1.4B AUM
+Female-founded · Female-owned · Female-led
+
+LEADERSHIP
+Gloria Nelund — Founder, Chief Executive Officer & Chief Compliance Officer
+Former CEO, US Private Wealth at Deutsche Bank — oversaw $50 billion in assets under management
+Over 40 years of experience in international asset management
+
+FINANCIAL HEALTH
+Total Assets: $282.8M · Stockholders' Equity: $272.6M · Liabilities: $10.2M
+Equity-to-Assets Ratio: 96.4% · Net Income: –$8.5M
+Primary ECR Drivers: Equity +57pp · Revenue –17pp
+
+INVESTMENT STRATEGY
+Direct loans · Trade finance · Structured credit · Preferred equity
+SMEs with fewer than 500 employees · Developing economies · Local sub-advisors · 4 continents
+
+IMPACT
+Sustainable community development · Workforce capacity building · Financial inclusion · Food security
+Sectors: Education · Energy · Housing · Health
+
+2008: Founded | 2017: TRLC listed on OTC Pink Markets | 2025: Ranked #1 in US Finance Services
+
+Powered by RealRate: Using Explainable Financial AI
+
+Full US Finance Services ranking: {RANKING_URL}
+
+#RealRate #ImpactInvesting #ESG #SMELending #FinancialHealth"""
+
+elif COMPANY == "hp":
+ CAPTION = f"""\
+HP Inc. ranks #9 in US Computers. ECR: 258%.
+
+At the industry average of 258%. Rated by RealRate's independent, explainable financial AI.
+
+THE COMPANY
+Personal computing and printing technology leader · Palo Alto, California
+Founded 1939 · Spun off from Hewlett-Packard November 2015 · Ticker: HPQ
+~58,000 employees worldwide
+
+LEADERSHIP
+Enrique Lores — President & Chief Executive Officer
+Joined HP in 1989 · Led Imaging, Printing & Solutions before becoming CEO November 2019
+"Future Ready" transformation — restructuring for AI-era growth and subscription revenue
+
+FINANCIAL HEALTH
+Revenue: $53.6B (FY2024) · Net Income: $2.8B · Operating margin: 7.1%
+Total Assets: $39.9B · Stockholders' Equity: –$1.3B (deficit from cumulative buybacks)
+Cash: $3.25B · Long-term Debt: $8.3B · R&D: $1.64B
+
+BUSINESS SEGMENTS
+Personal Systems: ~$34.4B (64%) — PCs, laptops, workstations, Chromebooks
+Printing: ~$19.1B (36%) — LaserJet, OfficeJet, Instant Ink supplies
+Poly collaboration hardware — acquired 2022 · hybrid work solutions
+
+HISTORY
+1939: William Hewlett & Dave Packard found the company in a Palo Alto garage
+2015: Hewlett-Packard splits into HP Inc. (HPQ) and Hewlett Packard Enterprise (HPE)
+FY2024: $53.6B revenue · ECR 258% · AI PC transformation underway
+
+Powered by RealRate: Using Explainable Financial AI
+
+Full US Computers ranking: {RANKING_URL}
+
+#RealRate #HPInc #AIComputer #FinancialHealth #TechIndustry"""
+
+elif COMPANY == "strata":
+ CAPTION = f"""\
+Strata Critical Medical ranks #1 in US Air. ECR: 123%.
+
+54 percentage points above the industry average of 69%. Top-Rated by RealRate's independent, explainable financial AI.
+
+THE COMPANY
+Air Medical Transport · Critical Care · Emergency Response · Delaware, USA
+CIK: 0001779128 · OTC-listed · STCM · Publicly reporting
+
+FINANCIAL HEALTH
+Total Assets: $325.5M · Stockholders' Equity: $279.1M · Liabilities: $46.4M
+Revenue: $197.1M (FY2025) · Net Income: +$41.3M
+First profitable year in company history
+
+ECR DRIVERS
+Greatest Strength: Operating Expenses — +46pp contribution to ECR
+Greatest Weakness: Other Expenses — –81pp drag on ECR
+
+GROWTH JOURNEY
+2021: Revenue $50.5M · Net Income –$40.1M — Rapid expansion phase begins
+2022–2024: Revenue grew from $146M to $249M — approximately 4× growth in 3 years
+2025: ECR 123% · #1 US Air · RealRate — First profitable year in history
+
+Powered by RealRate: Using Explainable Financial AI
+
+Full US Air ranking: {RANKING_URL}
+
+#RealRate #AirMedical #CriticalCare #FinancialHealth #Healthcare"""
+
+elif COMPANY == "nvidia":
+ CAPTION = f"""\
+Nvidia Corp. ranks #8 in US Semiconductors. ECR: 351%.
+
+98 percentage points above the industry average of 253%. Top-Rated by RealRate's independent, explainable financial AI.
+
+THE COMPANY
+AI computing and GPU technology leader · Santa Clara, California
+Founded April 5, 1993 · NASDAQ: NVDA · ~36,000 employees worldwide
+
+LEADERSHIP
+Jensen Huang — Co-Founder & Chief Executive Officer
+Oregon State BSc Electrical Engineering · Stanford MS Electrical Engineering
+Led Nvidia from gaming graphics chipmaker to the world's AI computing infrastructure provider
+
+FINANCIAL HEALTH
+Revenue: $130.5B (FY2025) · Net Income: $72.9B
+Total Assets: $111.6B · Stockholders' Equity: $79.3B · Liabilities: $32.3B
+R&D investment: $12.9B
+
+ECR DRIVERS
+Greatest Strength: Net Income — +94pp contribution to ECR
+Greatest Weakness: Stockholders' Equity — –56pp drag on ECR
+
+BUSINESS SEGMENTS
+Data Center: ~$115.2B (88%) — H100, H200, Blackwell B200, GB200 NVL72, NVLink, InfiniBand
+Gaming: ~$11.4B (9%) — GeForce RTX 50 series · DLSS 4 · Ray Tracing
+Professional Visualization · Automotive · OEM: ~$3.9B (3%) — DRIVE platform · Omniverse · Jetson
+
+HISTORY
+1993: Jensen Huang, Curtis Priem & Chris Malachowsky found Nvidia in Santa Clara
+1999: GeForce 256 — world's first GPU | 2006: CUDA platform — AI computing foundation
+2025: ECR 351% · #8 US Semiconductors · Revenue +114% YoY · RealRate
+
+Powered by RealRate: Using Explainable Financial AI
+
+Full US Semiconductors ranking: {RANKING_URL}
+
+#RealRate #Nvidia #AIComputing #GPUs #FinancialHealth"""
+
+elif COMPANY == "tesla":
+ CAPTION = f"""\
+Tesla Inc ranks #9 in US Motor. ECR: 135%.
+
+34 percentage points above the industry average of 102%. Top-Rated by RealRate's independent, explainable financial AI.
+
+THE COMPANY
+Electric vehicles, energy storage, and AI company · Austin, Texas
+Founded July 1, 2003 · NASDAQ: TSLA
+~125,665 employees worldwide
+
+LEADERSHIP
+Elon Musk — Co-Founder & Chief Executive Officer (since 2008)
+Also CEO of SpaceX, xAI, Neuralink & The Boring Company
+Driving Tesla's transition from EV maker to full-stack AI and robotics company
+
+FINANCIAL HEALTH
+Revenue: $94.8B (FY2025) · Net Income: $3.9B · R&D: $6.4B
+Total Assets: $137.8B · Stockholders' Equity: $82.9B · Liabilities: $54.9B
+Equity-to-Assets Ratio: 60.2%
+
+ECR DRIVERS
+Greatest Strength: Cost of Goods and Services Sold — +36pp contribution to ECR
+Greatest Weakness: Other Expenses — –27pp drag on ECR
+
+BUSINESS SEGMENTS
+Automotive: ~81% — Model 3/Y/S/X/Cybertruck · Full Self-Driving · Robotaxi
+Energy Generation & Storage: ~13% — Powerwall · Megapack · Solar Roof
+Services & Other: ~6% — Supercharger network · Insurance · Tesla Fleet
+
+HISTORY
+2003: Tesla Motors founded by Martin Eberhard & Marc Tarpenning · San Carlos, California
+2008: Elon Musk becomes CEO · First Roadster delivered | 2010: TSLA IPO on NASDAQ
+2025: ECR 135% · #9 US Motor · Top-Rated · Revenue $94.8B · Robotaxi & Optimus era
+
+Powered by RealRate: Using Explainable Financial AI
+
+Full US Motor ranking: {RANKING_URL}
+
+#RealRate #Tesla #ElectricVehicles #FinancialHealth #EV"""
+
+elif COMPANY == "angi":
+ CAPTION = f"""\
+Angi Inc. ranks #1 in US Advertising. ECR: 157%.
+
+78 percentage points above the industry average of 80%. Top-Rated by RealRate's independent, explainable financial AI.
+
+THE COMPANY
+Online home services marketplace · Denver, Colorado
+Founded 1995 · NASDAQ: ANGI · IAC subsidiary
+~4,500 employees worldwide
+
+LEADERSHIP
+Jeff Kip — Chief Executive Officer
+Brands: Angi (formerly Angie's List) · HomeAdvisor · Handy
+Connecting homeowners with local service professionals across the United States
+
+FINANCIAL HEALTH
+Total Assets: $1.68B · Stockholders' Equity: $1.46B · Liabilities: $222.4M
+Revenue: $1.03B · Net Income: +$43.8M
+Equity-to-Assets Ratio: 86.7%
+
+ECR DRIVERS
+Greatest Strength: Stockholders' Equity — +68pp contribution to ECR
+Greatest Weakness: Marketing & Selling Expenses — –22pp drag on ECR
+
+PLATFORM
+Angi: Homeowner marketplace · Crowd-sourced reviews · Cost guides
+HomeAdvisor: Instant Pro Connect · Local professionals · Project matching
+Handy: On-demand home services · Cleaning · Assembly · Moving · Repairs
+
+HISTORY
+1995: Angie's List founded in Columbus, Ohio — review platform for home service contractors
+1998: ServiceMagic founded, rebranded HomeAdvisor in 2012
+2017: ANGI Homeservices formed via HomeAdvisor & Angie's List merger | 2021: Rebranded to Angi Inc.
+2025: ECR 157% · #1 US Advertising · RealRate
+
+Powered by RealRate: Using Explainable Financial AI
+
+Full US Advertising ranking: {RANKING_URL}
+
+#RealRate #HomeServices #AngiInc #FinancialHealth #Marketplace"""
+
+elif COMPANY == "harley":
+ CAPTION = f"""\
+Harley Davidson INC ranks #5 in US Motor. ECR: 147%.
+
+45 percentage points above the industry average of 102%. Top-Rated by RealRate's independent, explainable financial AI.
+
+THE COMPANY
+Iconic American motorcycle brand · Milwaukee, Wisconsin
+Founded 1903 · NYSE: HOG · ~5,900 employees worldwide
+Brands: Harley-Davidson · LiveWire · Harley-Davidson Financial Services (HDFS)
+
+LEADERSHIP
+Jochen Zeitz — President & Chief Executive Officer
+Former CEO of Puma AG · Architect of the "Hardwire" 2021–2025 strategic plan
+Focus on premium motorcycles, selective market expansion, and EV platform development
+
+FINANCIAL HEALTH
+Revenue: $5.84B · Net Income: $695M
+Total Assets: $12.1B · Stockholders' Equity: $3.25B · Liabilities: ~$8.85B
+
+ECR DRIVERS
+Greatest Strength: Stockholders' Equity — +30pp contribution to ECR
+Greatest Weakness: Liabilities, Current — –18pp drag on ECR
+
+BUSINESS
+Motorcycles & Related Products: Touring, Softail, Sportster, Adventure, Electric
+Financial Services (HDFS): Retail loans, wholesale financing, insurance, licensing
+LiveWire (NYSE: LVWR): Dedicated EV motorcycle brand, spun off 2022
+
+HISTORY
+1903: William Harley & Arthur Davidson build first motorcycle in Milwaukee backyard
+1969: AMF acquisition | 1981: Management buyout — independence restored
+2021: Hardwire strategy launched | 2022: LiveWire EV brand spun off
+2026: ECR 147% · #5 US Motor · Top-Rated · RealRate
+
+Powered by RealRate: Using Explainable Financial AI
+
+Full US Motor ranking: {RANKING_URL}
+
+#RealRate #HarleyDavidson #Motorcycles #FinancialHealth #EV"""
+
+elif COMPANY == "apple":
+ CAPTION = f"""\
+Apple Inc. ranks #1 in US Computers. ECR: 430%.
+
+177 percentage points above the industry average of 253%. Top-Rated by RealRate's independent, explainable financial AI.
+
+THE COMPANY
+World's most valuable technology company · Cupertino, California
+Founded April 1, 1976 · NASDAQ: AAPL · ~150,000 employees worldwide
+
+LEADERSHIP
+Tim Cook — Chief Executive Officer
+CEO since August 2011 · Auburn University BSc Industrial Engineering · Duke MBA
+Led Apple's transformation from hardware maker to services, AI, and spatial computing company
+
+FINANCIAL HEALTH
+Revenue: $416B (FY2025) · +6% YoY · Net Income: $112B · Operating Margin: 32%
+Total Assets: $364.9B · Stockholders' Equity: $56.9B
+Cash & Securities: $162B · R&D investment: $34.6B · Market Cap: $3.0 Trillion
+
+BUSINESS SEGMENTS
+iPhone: ~$201B (48%) — iPhone 16 series · Apple Intelligence · 5G
+Services: ~$96B (23%) — App Store · iCloud · Apple TV+ · Apple Pay · Apple Arcade
+Mac · iPad · Wearables: ~$119B (29%) — Apple Silicon M4 · Vision Pro · AirPods Pro
+
+HISTORY
+1976: Steve Jobs, Steve Wozniak & Ronald Wayne found Apple · Cupertino, California
+1984: Macintosh launched | 2007: iPhone changes mobile computing | 2011: Tim Cook becomes CEO
+2025: ECR 430% · #1 US Computers · Revenue $416B · Market Cap $3.0 Trillion · RealRate
+
+Powered by RealRate: Using Explainable Financial AI
+
+Full US Computers ranking: {RANKING_URL}
+
+#RealRate #Apple #iPhone #FinancialHealth #TechIndustry"""
+
+with open(POST_PATH, "w", encoding="utf-8") as _f:
+ _f.write(CAPTION + "\n")
+print("LinkedIn post saved:", POST_PATH)
+```