{"id":13185,"date":"2026-05-20T22:17:17","date_gmt":"2026-05-20T20:17:17","guid":{"rendered":"https:\/\/geopard.tech\/?page_id=13185"},"modified":"2026-05-25T23:00:43","modified_gmt":"2026-05-25T21:00:43","slug":"kalkulator-povrata-ulaganja-za-zoniranje","status":"publish","type":"page","link":"https:\/\/geopard.tech\/hr\/zoning-roi-calculator\/","title":{"rendered":"Kalkulator ROI-a za zoniranje"},"content":{"rendered":"\n<div class=\"gp-lead\">\n<style>\n\/* Hide the WP page title heading on tool pages \u2014 the hero below carries the page name *\/\n#simple_page > .container > h1,\n.entry-header, .entry-title, .wp-block-post-title, h1.page-title,\n.post-header, .single-page .page-title { display: none !important; }\n\n.gp-lead{font-family:var(--wp--preset--font-family--nunito,\"Nunito\",system-ui,-apple-system,Segoe UI,sans-serif);color:#212121;max-width:1600px;margin:0 auto;padding:0 16px}\n.gp-lead h1,.gp-lead h2,.gp-lead h3{font-family:var(--wp--preset--font-family--poppins,\"Poppins\",system-ui,-apple-system,sans-serif);font-weight:700;color:#145328;line-height:1.2;letter-spacing:-0.01em}\n.gp-lead h2{font-size:1.55rem;margin:28px 0 14px}\n.gp-lead h3{font-size:1.1rem;margin:0 0 10px;color:#145328}\n.gp-lead p{line-height:1.65;color:#2c3e2c;margin:0 0 14px}\n.gp-lead a{color:#15701e;text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:2px}\n.gp-lead a:hover{color:#145328}\n.gp-lead strong{color:#145328}\n.gp-lead .gpx-hero{position:relative;background:radial-gradient(900px 360px at 0% -10%,rgba(74,222,128,0.18),transparent 60%),radial-gradient(700px 320px at 105% 110%,rgba(247,106,12,0.10),transparent 60%),linear-gradient(180deg,#fbfcf6 0%,#f1f6e8 100%);border:1px solid #d6e2c5;border-radius:20px;padding:30px 34px 26px;margin:6px 0 24px;overflow:hidden;box-shadow:0 12px 32px rgba(20,83,40,0.06),0 0 0 1px rgba(255,255,255,0.55) inset;text-align:center}\n.gp-lead .gpx-hero-eyebrow{display:inline-flex;align-items:center;gap:8px;font-family:var(--wp--preset--font-family--poppins,\"Poppins\",sans-serif);font-size:.74rem;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:#15701e;background:#fff;border:1px solid #cfe4d4;border-radius:999px;padding:6px 12px;margin:0 0 16px;box-shadow:0 1px 2px rgba(20,83,40,0.05)}\n.gp-lead .gpx-hero-eyebrow::before{content:\"\";width:7px;height:7px;border-radius:50%;background:#22c55e;box-shadow:0 0 0 3px rgba(34,197,94,0.22)}\n.gp-lead .gpx-hero-title{font-family:var(--wp--preset--font-family--poppins,\"Poppins\",sans-serif);font-size:1.95rem;line-height:1.18;color:#0e3a1c;margin:0 auto 12px;font-weight:800;letter-spacing:-0.018em;max-width:820px}\n.gp-lead .gpx-hero-title .accent{background:linear-gradient(120deg,#f76a0c 0%,#15701e 100%);-webkit-background-clip:text;background-clip:text;color:transparent;font-style:normal}\n.gp-lead .gpx-hero .lede{font-size:1.04rem;line-height:1.55;color:#243024;margin:0 auto;max-width:820px;font-weight:400}\n.gp-lead .gpx-hero .lede strong{color:#0e3a1c;font-weight:600}\n.gp-lead .gpx-hero-features{display:flex;flex-wrap:wrap;gap:8px;margin:20px 0 0;justify-content:center}\n.gp-lead .gpx-hero-feat{display:inline-flex;align-items:center;gap:8px;background:#fff;border:1px solid #d8e6d8;color:#1c4a2a;font-size:.86rem;font-weight:600;padding:7px 13px;border-radius:999px;font-family:var(--wp--preset--font-family--poppins,\"Poppins\",sans-serif);box-shadow:0 1px 2px rgba(20,83,40,0.04)}\n.gp-lead .gpx-hero-feat::before{content:\"\\2713\";width:16px;height:16px;flex:0 0 16px;background:#22c55e;color:#fff;border-radius:50%;font-size:10px;font-weight:800;line-height:16px;text-align:center}\n.gp-lead .gpx-hero-feat.is-trust{background:transparent;border-color:transparent;color:#3a4a3a;padding:7px 6px;box-shadow:none}\n.gp-lead .gpx-hero-feat.is-trust::before{content:\"\\1F512\";width:auto;height:auto;background:transparent;color:#15701e;font-size:13px;line-height:1}\n.gp-lead .gpx-cta{background:linear-gradient(135deg,#145328 0%,#1b7a2a 65%,#1a7951 100%);border-radius:18px;padding:38px 40px;margin:36px 0 24px;color:#fafbf4;text-align:center;position:relative;overflow:hidden}\n.gp-lead .gpx-cta::before{content:\"\";position:absolute;inset:auto -40px -60px auto;width:200px;height:200px;background:radial-gradient(circle,rgba(247,106,12,0.28),transparent 70%);pointer-events:none}\n.gp-lead .gpx-cta h2{color:#fff;margin:0 0 12px;font-size:1.6rem}\n.gp-lead .gpx-cta p{color:rgba(255,255,255,0.95);font-size:1.05rem;max-width:740px;margin:0 auto 22px}\n.gp-lead .gpx-btn{display:inline-block;background:#f76a0c;color:#fff;font-family:var(--wp--preset--font-family--poppins,\"Poppins\",sans-serif);font-weight:600;font-size:1rem;padding:14px 30px;border-radius:999px;text-decoration:none;transition:transform .15s,box-shadow .15s,background .15s;box-shadow:0 6px 18px rgba(247,106,12,0.4)}\n.gp-lead .gpx-btn:hover{transform:translateY(-1px);background:#ff7d24;color:#fff;box-shadow:0 8px 24px rgba(247,106,12,0.5)}\n.gp-lead .gpx-faq{margin:36px 0 8px}\n.gp-lead .gpx-faq h2{text-align:center;margin:0 0 20px;font-size:1.6rem}\n.gp-lead .gpx-tabs{border:1px solid #e8ebe2;border-radius:16px;overflow:hidden;background:#fff;box-shadow:0 2px 14px rgba(20,83,40,0.06)}\n.gp-lead .gpx-tablist{display:flex;gap:0;background:#f6f7f1;border-bottom:1px solid #e8ebe2;overflow-x:auto;scrollbar-width:none}\n.gp-lead .gpx-tablist::-webkit-scrollbar{display:none}\n.gp-lead .gpx-tab{flex:1 1 auto;min-width:max-content;background:transparent;border:0;padding:16px 22px;font-family:var(--wp--preset--font-family--poppins,\"Poppins\",sans-serif);font-size:.95rem;font-weight:600;color:#4c6066;cursor:pointer;border-bottom:3px solid transparent;transition:color .15s,border-color .15s,background .15s;white-space:nowrap;letter-spacing:.01em}\n.gp-lead .gpx-tab:hover{color:#145328;background:rgba(123,220,181,0.14)}\n.gp-lead .gpx-tab[aria-selected=\"true\"]{color:#145328;border-bottom-color:#15701e;background:#fff}\n.gp-lead .gpx-tab:focus{outline:2px solid #15701e;outline-offset:-2px}\n.gp-lead .gpx-panel{padding:28px 32px;display:none;animation:gpxfade .25s ease}\n.gp-lead .gpx-panel.is-active{display:block}\n@keyframes gpxfade{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}\n.gp-lead .gpx-panel p{margin:0;line-height:1.7;color:#243024;font-size:1rem}\n.gp-lead .gpx-panel p+p{margin-top:10px}\n.gp-lead .gpx-panel kbd,.gp-lead .gpx-panel code{background:#f0f3ec;padding:2px 6px;border-radius:4px;font-family:var(--wp--preset--font-family--dm-mono,\"DM Mono\",ui-monospace,monospace);font-size:.88em;color:#145328}\n.gp-lead .gpx-integ{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;margin:10px 0 20px}\n.gp-lead .gpx-integ-label{font-size:.86rem;color:rgba(255,255,255,0.86);margin:0 0 8px;font-weight:500;letter-spacing:.01em}\n.gp-lead .gpx-integ-chip{background:rgba(255,255,255,0.16);border:1px solid rgba(255,255,255,0.32);color:#fff;padding:6px 14px;border-radius:999px;font-size:.85rem;font-weight:600;letter-spacing:.02em}\n@media (max-width:760px){\n  .gp-lead h2{font-size:1.3rem}\n  .gp-lead .gpx-hero{padding:22px 20px;margin:4px 0 16px;border-radius:16px}\n  .gp-lead .gpx-hero-eyebrow{font-size:.68rem;letter-spacing:.12em;padding:5px 10px;margin-bottom:12px}\n  .gp-lead .gpx-hero-title{font-size:1.4rem;line-height:1.2;margin-bottom:8px}\n  .gp-lead .gpx-hero .lede{font-size:.95rem;line-height:1.5}\n  .gp-lead .gpx-hero-features{gap:6px;margin-top:14px}\n  .gp-lead .gpx-hero-feat{font-size:.78rem;padding:6px 10px}\n  .gp-lead .gpx-cta{padding:24px 22px}\n  .gp-lead .gpx-panel{padding:22px 20px}\n  .gp-lead .gpx-tab{padding:14px 16px;font-size:.9rem}\n}\n<\/style>\n<section class=\"gpx-hero\">\n  <div class=\"gpx-hero-eyebrow\">Field Data Explorer \u00b7 No signup<\/div>\n  <h1 class=\"gpx-hero-title\">Inspect any precision-ag file in seconds. See the <span class=\"accent\">variability<\/span> hiding inside.<\/h1>\n  <p class=\"lede\">Drop your yield, as-applied, soil samples, or boundaries from John Deere, Trimble, or ISO-XML. Auto-splits Coverage, replays the operation, surfaces zone-level variability worth acting on.<\/p>\n  <div class=\"gpx-hero-features\">\n    <span class=\"gpx-hero-feat\">Yield, as-applied, soil, boundaries<\/span>\n    <span class=\"gpx-hero-feat\">Operation replay<\/span>\n    <span class=\"gpx-hero-feat\">Variability heatmap<\/span>\n    <span class=\"gpx-hero-feat is-trust\">Data stays in your browser<\/span>\n  <\/div>\n<\/section>\n<\/div>\n\n\n\n\n\n<div class=\"gpy-wrap\" id=\"gpy-roi-root\" data-theme=\"light\">\n<style>\n.gpy-wrap{all:initial;display:block;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Helvetica Neue\",Arial,sans-serif;font-size:13px;line-height:1.45;border-radius:12px;overflow:hidden;max-width:100%}\n.gpy-wrap *,.gpy-wrap *::before,.gpy-wrap *::after{box-sizing:border-box}\n\n.gpy-wrap[data-theme=\"light\"]{\n  --bg:#fdfcf8;--panel:#ffffff;--panel2:#f7f5ef;--line:#e8e4d8;--line2:#d9d3c3;\n  --ink:#1a1a1a;--ink-dim:#6b6b6b;\n  --accent:#2d6a4f;--accent-h:#346e55;--accent-soft:#86c9a8;\n  --cta-bg:linear-gradient(145deg,#eefbf3 0%,#dff5e6 100%);\n  --cta-border:#b8e5c6;--cta-title:#0f5033;--cta-text:#1e5d3a;\n  --shadow:0 4px 20px rgba(30,40,50,.08);--shadow-sm:0 1px 3px rgba(30,40,50,.06);\n  color:var(--ink);background:var(--bg);border:1px solid var(--line);box-shadow:var(--shadow);\n}\n.gpy-wrap[data-theme=\"dark\"]{\n  --bg:#0b0f14;--panel:#11171f;--panel2:#161e2a;--line:#1f2a3a;--line2:#2a3548;\n  --ink:#e7edf5;--ink-dim:#93a0b3;\n  --accent:#4ade80;--accent-h:#52e089;--accent-soft:#86efac;\n  --cta-bg:linear-gradient(145deg,#0f2a1f 0%,#112e25 100%);\n  --cta-border:#1e5e3d;--cta-title:#86efac;--cta-text:#d1fae5;\n  --shadow:0 10px 40px rgba(0,0,0,.4);--shadow-sm:0 2px 6px rgba(0,0,0,.25);\n  color:var(--ink);background:var(--bg);border:1px solid var(--line);box-shadow:var(--shadow);\n}\n\n.gpy-wrap .gpy-card{background:var(--panel2);border:1px solid var(--line);border-radius:9px;padding:13px}\n.gpy-wrap .gpy-card h3{font-size:10px;text-transform:uppercase;letter-spacing:.12em;color:var(--ink-dim);margin:0 0 10px 0;font-weight:600;font-family:\"SF Mono\",ui-monospace,Menlo,monospace}\n\n.gpy-wrap .gpy-seg{display:flex;gap:3px;background:var(--bg);padding:3px;border-radius:7px;border:1px solid var(--line)}\n.gpy-wrap .gpy-seg button{flex:1;background:transparent;border:0;color:var(--ink-dim);padding:7px 4px;font-family:\"SF Mono\",ui-monospace,Menlo,monospace;font-size:11px;border-radius:5px;cursor:pointer;transition:all .15s;font-weight:600}\n.gpy-wrap .gpy-seg button.on{background:var(--panel);color:var(--ink);box-shadow:var(--shadow-sm)}\n\n.gpy-wrap .gpy-tog2{display:flex;align-items:center;gap:9px;font-size:12px;color:var(--ink);padding:5px 0;cursor:pointer;user-select:none}\n.gpy-wrap .gpy-tog2 input{accent-color:var(--accent);cursor:pointer;width:14px;height:14px;margin:0;flex:none}\n\n.gpy-wrap .gpy-roi{background:var(--panel)}\n.gpy-wrap .gpy-roi-head{padding:20px 22px 14px}\n.gpy-wrap .gpy-roi-title{font-size:18px;font-weight:700;margin:0;color:var(--ink);letter-spacing:-.01em;display:flex;align-items:center;gap:10px}\n.gpy-wrap .gpy-roi-title::before{content:\"\";width:6px;height:6px;background:var(--accent);border-radius:50%;flex:none;box-shadow:0 0 10px var(--accent)}\n.gpy-wrap .gpy-roi-sub{color:var(--ink-dim);font-size:12px;margin-top:6px;max-width:580px;line-height:1.55}\n.gpy-wrap .gpy-roi-body{display:grid;grid-template-columns:1fr 1fr;gap:14px;padding:0 18px 18px;align-items:start}\n.gpy-wrap .gpy-roi-col{display:flex;flex-direction:column;gap:10px}\n.gpy-wrap .gpy-roi-row{display:flex;justify-content:space-between;align-items:center;gap:10px;margin-bottom:8px}\n.gpy-wrap .gpy-roi-row:last-child{margin-bottom:0}\n.gpy-wrap .gpy-roi-row > span:first-child{flex:none;width:78px;color:var(--ink-dim);text-transform:uppercase;font-size:10px;font-family:\"SF Mono\",ui-monospace,Menlo,monospace;letter-spacing:.05em;font-weight:600}\n.gpy-wrap .gpy-roi-input-grp{display:flex;align-items:center;gap:6px;flex:1}\n.gpy-wrap .gpy-roi-input-grp input[type=number]{flex:1;min-width:0;background:var(--bg);color:var(--ink);border:1px solid var(--line);border-radius:6px;padding:7px 9px;font-family:\"SF Mono\",ui-monospace,Menlo,monospace;font-size:12px;outline:none;transition:border-color .15s;-moz-appearance:textfield}\n.gpy-wrap .gpy-roi-input-grp input[type=number]::-webkit-outer-spin-button,\n.gpy-wrap .gpy-roi-input-grp input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}\n.gpy-wrap .gpy-roi-input-grp input[type=number]:focus{border-color:var(--accent-soft);box-shadow:0 0 0 3px rgba(74,222,128,.12)}\n.gpy-wrap .gpy-roi-input-grp select.gpy-roi-mini{background:var(--bg);color:var(--ink);border:1px solid var(--line);border-radius:6px;padding:7px 8px;font-family:\"SF Mono\",ui-monospace,Menlo,monospace;font-size:11px;cursor:pointer;outline:none;width:auto}\n.gpy-wrap .gpy-roi-unit{color:var(--ink-dim);font-size:11px;font-family:\"SF Mono\",ui-monospace,Menlo,monospace;flex:none}\n.gpy-wrap .gpy-roi-hint{color:var(--ink-dim);font-size:11px;margin-top:9px;font-family:\"SF Mono\",ui-monospace,Menlo,monospace;line-height:1.5}\n.gpy-wrap .gpy-roi-result{background:var(--cta-bg);border:1px solid var(--cta-border);border-radius:10px;padding:22px;text-align:center;position:relative;overflow:hidden}\n.gpy-wrap .gpy-roi-result::before{content:\"\";position:absolute;top:-40px;right:-40px;width:120px;height:120px;background:radial-gradient(circle,rgba(74,222,128,.15) 0%,transparent 70%);pointer-events:none}\n.gpy-wrap .gpy-roi-result-label{font-size:10px;text-transform:uppercase;letter-spacing:.14em;color:var(--cta-title);font-weight:700;font-family:\"SF Mono\",ui-monospace,Menlo,monospace;margin-bottom:10px;position:relative}\n.gpy-wrap .gpy-roi-result-main{font-size:32px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--ink);letter-spacing:-.02em;position:relative;line-height:1}\n.gpy-wrap .gpy-roi-result-main .dash{color:var(--ink-dim);margin:0 4px;font-weight:400}\n.gpy-wrap .gpy-roi-result-unit{font-size:11px;color:var(--ink-dim);font-family:\"SF Mono\",ui-monospace,Menlo,monospace;text-transform:uppercase;letter-spacing:.06em;margin-top:6px;font-weight:600;position:relative}\n.gpy-wrap .gpy-roi-divider{height:1px;background:var(--cta-border);margin:18px 0;position:relative}\n.gpy-wrap .gpy-roi-result-total{font-size:22px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--ink);position:relative;line-height:1}\n.gpy-wrap .gpy-roi-result-total .dash{color:var(--ink-dim);margin:0 3px;font-weight:400}\n.gpy-wrap .gpy-roi-note{font-size:11px;color:var(--cta-text);line-height:1.6;margin-top:14px;padding:0 4px}\n.gpy-wrap .gpy-roi-note strong{color:var(--ink);font-weight:600}\n.gpy-wrap .gpy-roi-note .pct{font-family:\"SF Mono\",ui-monospace,Menlo,monospace;color:var(--ink)}\n.gpy-wrap .gpy-roi-cta{display:flex;align-items:center;justify-content:center;gap:6px;background:var(--accent);color:#0b0f14;border:0;padding:12px;border-radius:8px;font-weight:700;font-size:14px;cursor:pointer;text-decoration:none;font-family:inherit;width:100%;transition:background .15s;margin-top:14px}\n.gpy-wrap[data-theme=\"light\"] .gpy-roi-cta{color:#fff}\n.gpy-wrap .gpy-roi-cta:hover{background:var(--accent-h)}\n.gpy-wrap .gpy-roi-cta .arr{transition:transform .15s}\n.gpy-wrap .gpy-roi-cta:hover .arr{transform:translateX(4px)}\n\n\/* Secondary cross-link CTA \u2192 Guidance Lines tool. Quieter than primary CTA so\n   it reads as \"while you're here, also try this\", not as a competing button. *\/\n.gpy-wrap .gpy-roi-xlink{display:flex;align-items:center;gap:11px;background:transparent;border:1px solid var(--cta-border);border-radius:9px;padding:11px 14px;margin-top:10px;color:var(--cta-text);text-decoration:none;transition:all .15s;font-family:inherit}\n.gpy-wrap .gpy-roi-xlink:hover{background:var(--bg);border-color:var(--accent);color:var(--ink)}\n.gpy-wrap .gpy-roi-xlink-icon{flex:none;font-size:20px;line-height:1}\n.gpy-wrap .gpy-roi-xlink-text{flex:1;min-width:0;display:flex;flex-direction:column;text-align:left;line-height:1.35}\n.gpy-wrap .gpy-roi-xlink-text strong{font-size:12px;color:var(--ink);font-weight:700}\n.gpy-wrap .gpy-roi-xlink-text span{font-size:11px;color:var(--ink-dim);font-family:'SF Mono',ui-monospace,Menlo,monospace}\n.gpy-wrap .gpy-roi-xlink .arr{flex:none;color:var(--accent);font-weight:700;transition:transform .15s}\n.gpy-wrap .gpy-roi-xlink:hover .arr{transform:translateX(3px)}\n\n@media (max-width:820px){\n  .gpy-wrap .gpy-roi-head{padding:18px 16px 12px}\n  .gpy-wrap .gpy-roi-body{grid-template-columns:1fr;gap:12px;padding:0 16px 16px}\n  .gpy-wrap .gpy-roi-row{flex-wrap:wrap;gap:6px;margin-bottom:10px}\n  .gpy-wrap .gpy-roi-row > span:first-child{width:100%;font-size:10px}\n  .gpy-wrap .gpy-roi-input-grp{width:100%}\n  .gpy-wrap .gpy-roi-input-grp input[type=number]{padding:11px 12px;font-size:14px;min-height:44px}\n  .gpy-wrap .gpy-roi-input-grp select.gpy-roi-mini{padding:11px 10px;font-size:13px;min-height:44px}\n  .gpy-wrap .gpy-roi-result-main{font-size:26px}\n  .gpy-wrap .gpy-roi-cta{padding:14px;font-size:14px;min-height:48px}\n  .gpy-wrap .gpy-seg button{padding:11px 6px;font-size:11px;min-height:40px}\n  .gpy-wrap .gpy-tog2{padding:8px 0;font-size:13px;min-height:36px}\n  .gpy-wrap .gpy-tog2 input{width:18px;height:18px}\n}\n@media (max-width:480px){\n  .gpy-wrap{font-size:14px;border-radius:0}\n  .gpy-wrap .gpy-roi-title{font-size:16px}\n  .gpy-wrap .gpy-roi-result-main{font-size:22px}\n  .gpy-wrap .gpy-roi-result-total{font-size:18px}\n}\n\n\/* Widescreen layout \u2014 fill the 1600px gp-lead container densely.\n   Left half becomes a 2-col card grid (Field | Variability+Practices stacked);\n   right half holds an enlarged Result panel + note + CTA. *\/\n@media (min-width:1200px){\n  .gpy-wrap .gpy-roi-head{padding:24px 26px 16px}\n  .gpy-wrap .gpy-roi-title{font-size:20px}\n  .gpy-wrap .gpy-roi-sub{font-size:13px;max-width:720px}\n  .gpy-wrap .gpy-roi-locale{margin:16px 22px 0;padding:14px 18px;font-size:13px}\n  .gpy-wrap .gpy-roi-locale .roi-loc-country{font-size:14px}\n  .gpy-wrap .gpy-roi-locale .roi-loc-stats{font-size:12px}\n  .gpy-wrap .gpy-roi-locale-picker{margin:8px 22px 0;padding:14px 18px}\n  .gpy-wrap .gpy-roi-body{grid-template-columns:1.95fr 1.35fr;gap:18px;padding:0 22px 22px}\n  .gpy-wrap .gpy-roi-col:first-child{display:grid;grid-template-columns:1fr 1fr;grid-template-areas:\"field var\" \"field practices\";gap:12px}\n  .gpy-wrap .gpy-roi-col:first-child > .gpy-card:nth-child(1){grid-area:field}\n  .gpy-wrap .gpy-roi-col:first-child > .gpy-card:nth-child(2){grid-area:var}\n  .gpy-wrap .gpy-roi-col:first-child > .gpy-card:nth-child(3){grid-area:practices}\n  .gpy-wrap .gpy-roi-col:nth-child(2){position:sticky;top:18px}\n  .gpy-wrap .gpy-card{padding:16px}\n  .gpy-wrap .gpy-card h3{font-size:11px;margin-bottom:12px}\n  .gpy-wrap .gpy-roi-result{padding:28px 26px}\n  .gpy-wrap .gpy-roi-result-label{font-size:11px;margin-bottom:14px}\n  .gpy-wrap .gpy-roi-result-main{font-size:40px}\n  .gpy-wrap .gpy-roi-result-total{font-size:28px}\n  .gpy-wrap .gpy-roi-result-unit{font-size:12px}\n  .gpy-wrap .gpy-roi-divider{margin:22px 0}\n  .gpy-wrap .gpy-roi-note{font-size:12px}\n  .gpy-wrap .gpy-roi-cta{padding:14px;font-size:15px}\n}\n\n\/* Locale banner \u2014 auto-detected country \/ agroclimatic zone *\/\n.gpy-wrap .gpy-roi-locale{display:flex;align-items:center;gap:12px;padding:12px 16px;background:linear-gradient(90deg,rgba(74,222,128,0.12),rgba(74,222,128,0.04));border:1px solid var(--accent-soft);border-radius:10px;margin:16px 18px 0 18px;font-family:'SF Mono',ui-monospace,Menlo,monospace;font-size:12px;color:var(--ink);flex-wrap:wrap}\n.gpy-wrap .gpy-roi-locale .roi-loc-icon{flex:none;font-size:18px;line-height:1}\n.gpy-wrap .gpy-roi-locale .roi-loc-text{flex:1;min-width:0;line-height:1.5}\n.gpy-wrap .gpy-roi-locale .roi-loc-country{font-weight:700;color:var(--accent);font-size:13px}\n.gpy-wrap .gpy-roi-locale .roi-loc-zone{color:var(--ink);font-weight:600}\n.gpy-wrap .gpy-roi-locale .roi-loc-stats{display:block;color:var(--ink-dim);font-size:11px;margin-top:3px;font-weight:500}\n.gpy-wrap .gpy-roi-locale .roi-loc-edit{background:transparent;border:1px solid var(--line);color:var(--ink-dim);padding:6px 12px;border-radius:6px;cursor:pointer;font-size:11px;font-family:inherit;font-weight:600;flex:none;transition:all .15s}\n.gpy-wrap .gpy-roi-locale .roi-loc-edit:hover{color:var(--ink);background:var(--bg);border-color:var(--ink-dim)}\n.gpy-wrap .gpy-roi-locale-picker{display:none;flex-direction:column;padding:12px 16px;margin:6px 18px 0 18px;background:var(--panel2);border:1px solid var(--line);border-radius:8px;gap:10px}\n.gpy-wrap .gpy-roi-locale-picker.show{display:flex}\n.gpy-wrap .gpy-roi-locale-picker .roi-picker-tabs{display:flex;gap:4px;background:var(--bg);padding:3px;border-radius:7px;border:1px solid var(--line);align-self:flex-start}\n.gpy-wrap .gpy-roi-locale-picker .roi-picker-tab{background:transparent;border:0;color:var(--ink-dim);padding:6px 13px;font-family:'SF Mono',ui-monospace,Menlo,monospace;font-size:11px;border-radius:5px;cursor:pointer;font-weight:600;transition:all .12s}\n.gpy-wrap .gpy-roi-locale-picker .roi-picker-tab.on{background:var(--panel);color:var(--ink);box-shadow:var(--shadow-sm)}\n.gpy-wrap .gpy-roi-locale-picker .roi-picker-list{display:flex;flex-direction:column;gap:10px}\n.gpy-wrap .gpy-roi-locale-picker .roi-picker-grp{display:flex;align-items:flex-start;gap:12px;padding:6px 0;border-top:1px solid var(--line);flex-wrap:wrap}\n.gpy-wrap .gpy-roi-locale-picker .roi-picker-grp:first-child{border-top:0;padding-top:2px}\n.gpy-wrap .gpy-roi-locale-picker .roi-picker-grp-h{flex:none;min-width:118px;font-family:'SF Mono',ui-monospace,Menlo,monospace;font-size:10px;text-transform:uppercase;letter-spacing:.12em;color:var(--ink-dim);font-weight:700;padding-top:7px}\n.gpy-wrap .gpy-roi-locale-picker .roi-picker-grp-row{display:flex;flex-wrap:wrap;gap:6px;flex:1;min-width:0}\n.gpy-wrap .gpy-roi-locale-picker .roi-picker-list button{background:var(--bg);border:1px solid var(--line);color:var(--ink);padding:6px 11px;border-radius:5px;font-size:11px;font-family:'SF Mono',ui-monospace,monospace;cursor:pointer;font-weight:600;transition:all .12s}\n.gpy-wrap .gpy-roi-locale-picker .roi-picker-list button:hover{border-color:var(--accent);color:var(--accent)}\n.gpy-wrap .gpy-roi-locale-picker .roi-picker-list button.on{background:var(--accent);color:#0b0f14;border-color:var(--accent)}\n.gpy-wrap[data-theme=\"light\"] .gpy-roi-locale-picker .roi-picker-list button.on{color:#fff}\n.gpy-wrap .gpy-roi-globe{width:100%;max-width:760px;background:linear-gradient(180deg,#e0f2fe 0%,#bae6fd 100%);border-radius:10px;border:1px solid var(--line);overflow:hidden;display:block}\n.gpy-wrap[data-theme=\"dark\"] .gpy-roi-globe{background:linear-gradient(180deg,#0f1c2e 0%,#0a1422 100%)}\n.gpy-wrap .gpy-roi-globe .roi-graticule{stroke:rgba(0,0,0,0.08);stroke-width:1;stroke-dasharray:3 4;fill:none}\n.gpy-wrap[data-theme=\"dark\"] .gpy-roi-globe .roi-graticule{stroke:rgba(255,255,255,0.10)}\n.gpy-wrap .gpy-roi-globe .roi-continent{fill:rgba(34,197,94,0.12);stroke:rgba(34,197,94,0.30);stroke-width:1}\n.gpy-wrap[data-theme=\"dark\"] .gpy-roi-globe .roi-continent{fill:rgba(74,222,128,0.15);stroke:rgba(74,222,128,0.30)}\n.gpy-wrap .gpy-roi-globe .roi-country-dot{cursor:pointer;transition:all .15s ease}\n.gpy-wrap .gpy-roi-globe .roi-country-dot circle{fill:#22c55e;stroke:#fff;stroke-width:2;transition:r .15s ease}\n.gpy-wrap[data-theme=\"dark\"] .gpy-roi-globe .roi-country-dot circle{stroke:#0a1422}\n.gpy-wrap .gpy-roi-globe .roi-country-dot text{font-family:\"SF Mono\",ui-monospace,Menlo,monospace;font-size:10px;font-weight:700;fill:#0e3a1c;text-anchor:middle;pointer-events:none;user-select:none}\n.gpy-wrap[data-theme=\"dark\"] .gpy-roi-globe .roi-country-dot text{fill:#e7edf5}\n.gpy-wrap .gpy-roi-globe .roi-country-dot:hover circle{r:11;fill:#15701e}\n.gpy-wrap .gpy-roi-globe .roi-country-dot.on circle{r:12;fill:#f76a0c;stroke-width:3}\n.gpy-wrap .gpy-roi-globe .roi-country-dot.on text{fill:#0e3a1c;font-size:11px}\n.gpy-wrap[data-theme=\"dark\"] .gpy-roi-globe .roi-country-dot.on text{fill:#fff}\n.gpy-wrap .gpy-roi-globe-caption{font-size:11px;color:var(--ink-dim);text-align:center;margin-top:4px;font-family:'SF Mono',ui-monospace,Menlo,monospace}\n@media (max-width:480px){\n  .gpy-wrap .gpy-roi-locale{margin:14px 12px 0;padding:11px 13px;gap:10px}\n  .gpy-wrap .gpy-roi-locale .roi-loc-icon{font-size:16px}\n  .gpy-wrap .gpy-roi-locale .roi-loc-country{font-size:12px}\n  .gpy-wrap .gpy-roi-locale-picker{margin:6px 12px 0}\n  .gpy-wrap .gpy-roi-locale-picker button{padding:8px 10px;min-height:36px}\n}\n<\/style>\n\n<div class=\"gpy-roi\">\n  <div class=\"gpy-roi-head\">\n    <div style=\"display:flex;justify-content:space-between;align-items:flex-start;gap:16px;flex-wrap:wrap\">\n      <div style=\"min-width:0;flex:1\">\n        <h2 class=\"gpy-roi-title\">Zoning ROI Calculator<\/h2>\n        <p class=\"gpy-roi-sub\">Approximate. Conservative. Based on published variable-rate trial results. Estimate the agronomic upside of running zone-based prescriptions on a field with this profile.<\/p>\n      <\/div>\n      <div class=\"gpy-seg\" id=\"roi-units\" style=\"flex:none\">\n        <button data-u=\"metric\" class=\"on\">Metric<\/button>\n        <button data-u=\"imperial\">Imperial<\/button>\n      <\/div>\n    <\/div>\n  <\/div>\n  <div class=\"gpy-roi-locale\" id=\"roi-locale\">\n    <span class=\"roi-loc-icon\" aria-hidden=\"true\">\ud83d\udccd<\/span>\n    <span class=\"roi-loc-text\">\n      <span class=\"roi-loc-country\" id=\"roi-loc-country\">Detecting your region\u2026<\/span> <span id=\"roi-loc-sep\" hidden>\u00b7<\/span> <span class=\"roi-loc-zone\" id=\"roi-loc-zone\"><\/span>\n      <span class=\"roi-loc-stats\" id=\"roi-loc-stats\"><\/span>\n    <\/span>\n    <button class=\"roi-loc-edit\" id=\"roi-loc-edit\" type=\"button\" aria-controls=\"roi-locale-picker\" aria-expanded=\"false\">Change region<\/button>\n  <\/div>\n  <div class=\"gpy-roi-locale-picker\" id=\"roi-locale-picker\" role=\"region\" aria-label=\"Pick a different region\">\n    <div class=\"roi-picker-tabs\" role=\"tablist\" aria-label=\"Region picker mode\">\n      <button type=\"button\" class=\"roi-picker-tab on\" data-view=\"map\" role=\"tab\" aria-selected=\"true\">\ud83d\uddfa\ufe0f Map<\/button>\n      <button type=\"button\" class=\"roi-picker-tab\" data-view=\"list\" role=\"tab\" aria-selected=\"false\">\ud83d\udccb List<\/button>\n    <\/div>\n    <div class=\"roi-picker-map\" id=\"roi-picker-map\" role=\"tabpanel\"><\/div>\n    <div class=\"roi-picker-list\" id=\"roi-picker-list\" role=\"tabpanel\" hidden><\/div>\n  <\/div>\n  <div class=\"gpy-roi-body\">\n    <div class=\"gpy-roi-col\">\n      <div class=\"gpy-card\">\n        <h3>Field<\/h3>\n        <div class=\"gpy-roi-row\">\n          <span>Area<\/span>\n          <div class=\"gpy-roi-input-grp\">\n            <input type=\"number\" id=\"roi-area\" value=\"100\" min=\"0.1\" step=\"1\">\n            <select id=\"roi-area-u\" class=\"gpy-roi-mini\">\n              <option value=\"ha\">ha<\/option>\n              <option value=\"ac\">ac<\/option>\n            <\/select>\n          <\/div>\n        <\/div>\n        <div class=\"gpy-roi-row\">\n          <span>Crop<\/span>\n          <div class=\"gpy-roi-input-grp\">\n            <select id=\"roi-crop\" class=\"gpy-roi-mini\" style=\"flex:1\">\n              <option value=\"corn\">Corn<\/option>\n              <option value=\"soybean\">Soybean<\/option>\n              <option value=\"wheat\">Wheat<\/option>\n              <option value=\"sunflower\">Sunflower<\/option>\n              <option value=\"rapeseed\">Rapeseed \/ Canola<\/option>\n              <option value=\"cotton\">Cotton<\/option>\n              <option value=\"potato\">Potato<\/option>\n              <option value=\"other\">Other<\/option>\n            <\/select>\n          <\/div>\n        <\/div>\n        <div class=\"gpy-roi-row\">\n          <span>Yield<\/span>\n          <div class=\"gpy-roi-input-grp\">\n            <input type=\"number\" id=\"roi-yield\" value=\"10\" min=\"0.1\" step=\"0.5\">\n            <span class=\"gpy-roi-unit\" id=\"roi-yield-u\">t\/ha<\/span>\n          <\/div>\n        <\/div>\n        <div class=\"gpy-roi-row\">\n          <span>Price<\/span>\n          <div class=\"gpy-roi-input-grp\">\n            <span class=\"gpy-roi-unit\" id=\"roi-price-sym\">$<\/span>\n            <input type=\"number\" id=\"roi-price\" value=\"200\" min=\"0\" step=\"10\">\n            <span class=\"gpy-roi-unit\" id=\"roi-price-u\">\/t<\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"gpy-card\">\n        <h3>Field variability<\/h3>\n        <div class=\"gpy-seg\" id=\"roi-var\">\n          <button data-v=\"low\">Low<\/button>\n          <button data-v=\"medium\" class=\"on\">Medium<\/button>\n          <button data-v=\"high\">High<\/button>\n        <\/div>\n        <div class=\"gpy-roi-hint\" id=\"roi-var-hint\">10\u201325% yield variation across the field. Typical for most farms.<\/div>\n      <\/div>\n\n      <div class=\"gpy-card\">\n        <h3>Practices to vary<\/h3>\n        <label class=\"gpy-tog2\"><input type=\"checkbox\" data-pr=\"seed\" checked><span>Seeding rate<\/span><\/label>\n        <label class=\"gpy-tog2\"><input type=\"checkbox\" data-pr=\"n\" checked><span>Nitrogen<\/span><\/label>\n        <label class=\"gpy-tog2\"><input type=\"checkbox\" data-pr=\"pk\"><span>P \/ K fertilizer<\/span><\/label>\n        <label class=\"gpy-tog2\"><input type=\"checkbox\" data-pr=\"lime\"><span>Lime \/ pH correction<\/span><\/label>\n        <label class=\"gpy-tog2\"><input type=\"checkbox\" data-pr=\"crop\"><span>Crop protection<\/span><\/label>\n      <\/div>\n    <\/div>\n\n    <div class=\"gpy-roi-col\">\n      <div class=\"gpy-roi-result\">\n        <div class=\"gpy-roi-result-label\">Estimated annual benefit<\/div>\n        <div class=\"gpy-roi-result-main\">\n          <span id=\"roi-per-low\">$0<\/span><span class=\"dash\">\u2014<\/span><span id=\"roi-per-high\">$0<\/span>\n        <\/div>\n        <div class=\"gpy-roi-result-unit\"><span id=\"roi-per-unit\">per hectare<\/span><\/div>\n        <div class=\"gpy-roi-divider\"><\/div>\n        <div class=\"gpy-roi-result-total\">\n          <span id=\"roi-tot-low\">$0<\/span><span class=\"dash\">\u2014<\/span><span id=\"roi-tot-high\">$0<\/span>\n        <\/div>\n        <div class=\"gpy-roi-result-unit\">total \/ year<\/div>\n      <\/div>\n      <div class=\"gpy-roi-note\">\n        <strong>What this is.<\/strong> Range of revenue gain typically reported from variable-rate management on fields with this variability profile. Reflects <span class=\"pct\" id=\"roi-pct\">1.0\u20131.5%<\/span> of gross revenue. Drivers: input savings on weak zones + yield gain on strong zones. Real numbers vary with soil, equipment, operator skill, and weather.<br><br>\n        <strong>What it isn&#8217;t.<\/strong> A quote. A guarantee. An equipment ROI (this is the agronomic upside, before factoring monitor\/controller costs). For a real per-field projection grounded in your yield history and soil data, you need actual zone analysis. That&#8217;s what GeoPard does in ~15 minutes per field.\n      <\/div>\n      <a class=\"gpy-roi-cta\" href=\"https:\/\/app.geopard.tech\/signup?utm_source=zoning-roi-calc&amp;utm_medium=wp-embed&amp;utm_campaign=roi-calc\" target=\"_blank\" rel=\"noopener\">\n        Run this for your real fields<span class=\"arr\">\u2192<\/span>\n      <\/a>\n      <a class=\"gpy-roi-xlink\" href=\"\/guidance-lines\/\" rel=\"noopener\">\n        <span class=\"gpy-roi-xlink-icon\" aria-hidden=\"true\">\ud83d\udccf<\/span>\n        <span class=\"gpy-roi-xlink-text\">\n          <strong>More savings hiding in your AB lines?<\/strong>\n          <span>Test pass-direction &#038; overlap on the Guidance Lines Simulator<\/span>\n        <\/span>\n        <span class=\"arr\">\u2192<\/span>\n      <\/a>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script nowprocket data-no-optimize=\"1\" data-no-defer=\"1\" data-no-minify=\"1\">\n(function(){\n  var root = document.getElementById('gpy-roi-root');\n  if(!root ? true : root.dataset.roiInit) return;\n  root.dataset.roiInit = '1';\n  var $ = function(s){ return root.querySelector(s); };\n  \/\/ Per-crop defaults in BOTH unit systems. Numbers are conservative midpoints\n  \/\/ from FAO + USDA + AHDB market data. Imperial uses standard US ag units per\n  \/\/ crop (bu\/ac for grains, lb\/ac for cotton\/sunflower, cwt\/ac for potato).\n  var CROPS = {\n    metric: {\n      corn:      { yld: 10,   price: 200,  yldUnit: 't\/ha', priceUnit: '\/t' },\n      soybean:   { yld: 3,    price: 400,  yldUnit: 't\/ha', priceUnit: '\/t' },\n      wheat:     { yld: 6,    price: 250,  yldUnit: 't\/ha', priceUnit: '\/t' },\n      sunflower: { yld: 3,    price: 450,  yldUnit: 't\/ha', priceUnit: '\/t' },\n      rapeseed:  { yld: 3.5,  price: 500,  yldUnit: 't\/ha', priceUnit: '\/t' },\n      cotton:    { yld: 1.5,  price: 1500, yldUnit: 't\/ha', priceUnit: '\/t' },\n      potato:    { yld: 30,   price: 250,  yldUnit: 't\/ha', priceUnit: '\/t' },\n      other:     { yld: 5,    price: 300,  yldUnit: 't\/ha', priceUnit: '\/t' }\n    },\n    imperial: {\n      corn:      { yld: 180,  price: 4.50, yldUnit: 'bu\/ac',  priceUnit: '\/bu' },\n      soybean:   { yld: 50,   price: 11,   yldUnit: 'bu\/ac',  priceUnit: '\/bu' },\n      wheat:     { yld: 60,   price: 6,    yldUnit: 'bu\/ac',  priceUnit: '\/bu' },\n      sunflower: { yld: 1500, price: 0.20, yldUnit: 'lb\/ac',  priceUnit: '\/lb' },\n      rapeseed:  { yld: 40,   price: 12,   yldUnit: 'bu\/ac',  priceUnit: '\/bu' },\n      cotton:    { yld: 800,  price: 0.75, yldUnit: 'lb\/ac',  priceUnit: '\/lb' },\n      potato:    { yld: 400,  price: 10,   yldUnit: 'cwt\/ac', priceUnit: '\/cwt' },\n      other:     { yld: 80,   price: 5,    yldUnit: 'bu\/ac',  priceUnit: '\/bu' }\n    }\n  };\n  \/\/ Calibrated to conservative midpoints of published VRA trial literature.\n  \/\/ Default scenario (corn, medium variability, VRS+VRN): ~3% revenue lift =\n  \/\/ $18-30\/ac at $810\/ac gross. Matches Iowa State PMR-1010, AHDB UK, and\n  \/\/ independent multi-year corn variable-rate studies.\n  var ROI = {\n    base: 0.02,\n    variability: { low: 0.4, medium: 1.0, high: 1.7 },\n    practices:   [0, 1.0, 1.5, 1.9, 2.2, 2.4],\n    range: 0.25\n  };\n  var VAR_HINTS = {\n    low:    'Under 10% yield variation. Uniform soils, flat fields \u2014 VRA upside is modest.',\n    medium: '10\u201325% yield variation. Typical for most farms.',\n    high:   'Over 25% variation. Variable soils, rolling topography, or eroded \/ compacted zones \u2014 biggest VRA upside.'\n  };\n  \/\/ \u2500\u2500\u2500 REGIONAL DEFAULTS \u2014 agroclimatic zones \u00d7 crops \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  \/\/ Country code \u2192 { name, zone, continent, units, areaDefault }\n  \/\/ Zone names use farmer-recognisable language, not K\u00f6ppen codes.\n  \/\/ `continent` groups the country in the List-view picker.\n  var COUNTRIES = {\n    US: { name:'United States',  zone:'Continental Cornbelt',          continent:'North America', units:'imperial', areaDefault:200 },\n    CA: { name:'Canada',          zone:'Northern Plains \/ Prairies',    continent:'North America', units:'imperial', areaDefault:300 },\n    BR: { name:'Brazil',          zone:'Subtropical Cerrado',           continent:'South America', units:'metric',   areaDefault:250 },\n    AR: { name:'Argentina',       zone:'Pampas',                        continent:'South America', units:'metric',   areaDefault:250 },\n    GB: { name:'United Kingdom',  zone:'Atlantic Maritime',             continent:'Europe',        units:'metric',   areaDefault:80  },\n    FR: { name:'France',          zone:'Atlantic Temperate',            continent:'Europe',        units:'metric',   areaDefault:120 },\n    DE: { name:'Germany',         zone:'Atlantic \/ Continental',        continent:'Europe',        units:'metric',   areaDefault:80  },\n    ES: { name:'Spain',           zone:'Mediterranean',                 continent:'Europe',        units:'metric',   areaDefault:60  },\n    IT: { name:'Italy',           zone:'Mediterranean',                 continent:'Europe',        units:'metric',   areaDefault:40  },\n    PL: { name:'Poland',          zone:'Continental Eastern Europe',    continent:'Europe',        units:'metric',   areaDefault:60  },\n    UA: { name:'Ukraine',         zone:'Continental Steppe',            continent:'Europe',        units:'metric',   areaDefault:500 },\n    RO: { name:'Romania',         zone:'Continental Eastern Europe',    continent:'Europe',        units:'metric',   areaDefault:200 },\n    HU: { name:'Hungary',         zone:'Continental Eastern Europe',    continent:'Europe',        units:'metric',   areaDefault:120 },\n    KZ: { name:'Kazakhstan',      zone:'Continental Steppe',            continent:'Asia',          units:'metric',   areaDefault:1000 },\n    IN: { name:'India',           zone:'Monsoon Tropical',              continent:'Asia',          units:'metric',   areaDefault:20  },\n    CN: { name:'China',           zone:'Continental \/ Monsoon',         continent:'Asia',          units:'metric',   areaDefault:50  },\n    ZA: { name:'South Africa',    zone:'Subtropical Highveld',          continent:'Africa',        units:'metric',   areaDefault:150 },\n    AU: { name:'Australia',       zone:'Mediterranean \/ Semi-arid',     continent:'Oceania',       units:'metric',   areaDefault:500 },\n    NZ: { name:'New Zealand',     zone:'Temperate Oceanic',             continent:'Oceania',       units:'metric',   areaDefault:100 }\n  };\n  \/\/ Display order for the List-view groupings (also drives the picker layout).\n  var CONTINENT_ORDER = ['North America','South America','Europe','Asia','Africa','Oceania'];\n  \/\/ Zone \u00d7 crop \u2192 { yld, price, yldUnit, priceUnit } \u2014 metric base. Imperial\n  \/\/ conversion happens at display time via CROPS[unitSystem]. Calibrated from\n  \/\/ FAO \/ USDA NASS \/ AHDB \/ university-extension yield midpoints (3-year averages\n  \/\/ 2021-2024 where available). Missing combinations fall back to global CROPS.\n  var REGIONAL_YIELDS = {\n    'Continental Cornbelt': {\n      corn:      { yld:12,   price:200, yldUnit:'t\/ha', priceUnit:'\/t' },\n      soybean:   { yld:3.5,  price:400, yldUnit:'t\/ha', priceUnit:'\/t' },\n      wheat:     { yld:6.5,  price:250, yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Northern Plains \/ Prairies': {\n      wheat:     { yld:4,    price:250, yldUnit:'t\/ha', priceUnit:'\/t' },\n      corn:      { yld:9,    price:200, yldUnit:'t\/ha', priceUnit:'\/t' },\n      rapeseed:  { yld:2.5,  price:500, yldUnit:'t\/ha', priceUnit:'\/t' },\n      soybean:   { yld:3,    price:400, yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Subtropical Cerrado': {\n      soybean:   { yld:3.5,  price:380, yldUnit:'t\/ha', priceUnit:'\/t' },\n      corn:      { yld:6.5,  price:180, yldUnit:'t\/ha', priceUnit:'\/t' },\n      cotton:    { yld:1.7,  price:1500,yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Pampas': {\n      soybean:   { yld:3.2,  price:380, yldUnit:'t\/ha', priceUnit:'\/t' },\n      corn:      { yld:8.5,  price:180, yldUnit:'t\/ha', priceUnit:'\/t' },\n      wheat:     { yld:3.5,  price:230, yldUnit:'t\/ha', priceUnit:'\/t' },\n      sunflower: { yld:2.5,  price:450, yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Mediterranean \/ Semi-arid': {\n      wheat:     { yld:2.5,  price:280, yldUnit:'t\/ha', priceUnit:'\/t' },\n      rapeseed:  { yld:1.8,  price:520, yldUnit:'t\/ha', priceUnit:'\/t' },\n      cotton:    { yld:1.5,  price:1500,yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Temperate Oceanic': {\n      wheat:     { yld:8,    price:280, yldUnit:'t\/ha', priceUnit:'\/t' },\n      corn:      { yld:11,   price:220, yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Atlantic Maritime': {\n      wheat:     { yld:8.5,  price:230, yldUnit:'t\/ha', priceUnit:'\/t' },\n      rapeseed:  { yld:3.5,  price:480, yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Atlantic Temperate': {\n      wheat:     { yld:7,    price:230, yldUnit:'t\/ha', priceUnit:'\/t' },\n      corn:      { yld:10,   price:200, yldUnit:'t\/ha', priceUnit:'\/t' },\n      rapeseed:  { yld:3.5,  price:480, yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Atlantic \/ Continental': {\n      wheat:     { yld:7.5,  price:240, yldUnit:'t\/ha', priceUnit:'\/t' },\n      rapeseed:  { yld:3.5,  price:500, yldUnit:'t\/ha', priceUnit:'\/t' },\n      corn:      { yld:10,   price:210, yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Mediterranean': {\n      wheat:     { yld:3.5,  price:280, yldUnit:'t\/ha', priceUnit:'\/t' },\n      sunflower: { yld:2.5,  price:450, yldUnit:'t\/ha', priceUnit:'\/t' },\n      rapeseed:  { yld:2.5,  price:500, yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Continental Eastern Europe': {\n      wheat:     { yld:5.5,  price:230, yldUnit:'t\/ha', priceUnit:'\/t' },\n      corn:      { yld:7.5,  price:200, yldUnit:'t\/ha', priceUnit:'\/t' },\n      sunflower: { yld:2.8,  price:450, yldUnit:'t\/ha', priceUnit:'\/t' },\n      rapeseed:  { yld:3,    price:500, yldUnit:'t\/ha', priceUnit:'\/t' },\n      soybean:   { yld:2.7,  price:400, yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Continental Steppe': {\n      wheat:     { yld:3.5,  price:230, yldUnit:'t\/ha', priceUnit:'\/t' },\n      sunflower: { yld:2.5,  price:450, yldUnit:'t\/ha', priceUnit:'\/t' },\n      corn:      { yld:6.5,  price:200, yldUnit:'t\/ha', priceUnit:'\/t' },\n      rapeseed:  { yld:2.8,  price:500, yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Subtropical Highveld': {\n      corn:      { yld:5.5,  price:220, yldUnit:'t\/ha', priceUnit:'\/t' },\n      soybean:   { yld:2.5,  price:400, yldUnit:'t\/ha', priceUnit:'\/t' },\n      wheat:     { yld:3.5,  price:280, yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Monsoon Tropical': {\n      wheat:     { yld:3.5,  price:300, yldUnit:'t\/ha', priceUnit:'\/t' },\n      cotton:    { yld:1.5,  price:1700,yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Continental \/ Monsoon': {\n      corn:      { yld:7,    price:230, yldUnit:'t\/ha', priceUnit:'\/t' },\n      wheat:     { yld:5.5,  price:280, yldUnit:'t\/ha', priceUnit:'\/t' },\n      cotton:    { yld:1.8,  price:1600,yldUnit:'t\/ha', priceUnit:'\/t' }\n    }\n  };\n  \/\/ Country centroid (lng, lat) for the globe-view markers. Approximations\n  \/\/ of major-ag-region centres, not strict geographic centroids.\n  var COUNTRY_COORDS = {\n    US: [-98,  39], CA: [-100, 56], BR: [-55, -10], AR: [-64, -38],\n    AU: [134, -25], NZ: [174, -41], GB: [ -2,  54], FR: [  2,  47],\n    DE: [ 10,  51], ES: [ -4,  40], IT: [ 13,  42], PL: [ 19,  52],\n    UA: [ 32,  49], RO: [ 25,  46], HU: [ 19,  47], KZ: [ 67,  48],\n    ZA: [ 25, -29], IN: [ 78,  20], CN: [104,  35]\n  };\n  \/\/ Country detection: layered fallbacks, browser-only (rule 4 forbids IP geo).\n  \/\/ Order: (1) localStorage saved \u2192 (2) Intl.Locale.region from each\n  \/\/ navigator.languages entry \u2192 (3) `xx-CC` suffix regex on languages \u2192\n  \/\/ (4) Intl timezone \u2192 mapped country. TZ map covers the 20 supported\n  \/\/ COUNTRIES directly, plus neighbouring TZs that route to the closest\n  \/\/ supported country (Europe\/Vienna\u2192DE, Europe\/Stockholm\u2192PL, etc.) so VPN\n  \/\/ \/ satellite-office \/ nearby-country users still land on a sensible default.\n  var TZ_COUNTRY = {\n    \/\/ United States\n    'America\/Chicago':'US','America\/Los_Angeles':'US','America\/New_York':'US','America\/Denver':'US',\n    'America\/Indiana\/Indianapolis':'US','America\/Detroit':'US','America\/St_Louis':'US','America\/Phoenix':'US',\n    'America\/Anchorage':'US','America\/Boise':'US','America\/Kentucky\/Louisville':'US','America\/Indianapolis':'US',\n    \/\/ Canada\n    'America\/Toronto':'CA','America\/Edmonton':'CA','America\/Winnipeg':'CA','America\/Vancouver':'CA',\n    'America\/Halifax':'CA','America\/Regina':'CA','America\/St_Johns':'CA','America\/Montreal':'CA',\n    \/\/ South America\n    'America\/Sao_Paulo':'BR','America\/Recife':'BR','America\/Bahia':'BR','America\/Fortaleza':'BR',\n    'America\/Argentina\/Buenos_Aires':'AR','America\/Argentina\/Cordoba':'AR','America\/Argentina\/Mendoza':'AR',\n    'America\/Montevideo':'AR','America\/Asuncion':'AR',\n    \/\/ Western Europe\n    'Europe\/London':'GB','Europe\/Belfast':'GB','Europe\/Dublin':'GB',\n    'Europe\/Paris':'FR','Europe\/Brussels':'FR','Europe\/Luxembourg':'FR','Europe\/Amsterdam':'DE',\n    'Europe\/Berlin':'DE','Europe\/Vienna':'DE','Europe\/Zurich':'DE','Europe\/Copenhagen':'DE',\n    'Europe\/Madrid':'ES','Europe\/Lisbon':'ES','Europe\/Andorra':'ES','Atlantic\/Canary':'ES',\n    'Europe\/Rome':'IT','Europe\/Vatican':'IT','Europe\/Malta':'IT','Europe\/San_Marino':'IT',\n    \/\/ Central \/ Eastern Europe\n    'Europe\/Warsaw':'PL','Europe\/Prague':'PL','Europe\/Bratislava':'PL','Europe\/Stockholm':'PL',\n    'Europe\/Oslo':'PL','Europe\/Helsinki':'PL',\n    'Europe\/Kiev':'UA','Europe\/Kyiv':'UA','Europe\/Uzhgorod':'UA','Europe\/Zaporozhye':'UA','Europe\/Simferopol':'UA',\n    'Europe\/Bucharest':'RO','Europe\/Sofia':'RO','Europe\/Chisinau':'RO',\n    'Europe\/Budapest':'HU','Europe\/Belgrade':'HU','Europe\/Zagreb':'HU','Europe\/Ljubljana':'HU','Europe\/Sarajevo':'HU','Europe\/Skopje':'HU','Europe\/Tirane':'HU','Europe\/Podgorica':'HU',\n    \/\/ Central Asia (incl. neighbours of the steppe belt)\n    'Asia\/Almaty':'KZ','Asia\/Aqtobe':'KZ','Asia\/Aqtau':'KZ','Asia\/Atyrau':'KZ','Asia\/Oral':'KZ',\n    'Asia\/Tashkent':'KZ','Asia\/Bishkek':'KZ','Asia\/Dushanbe':'KZ','Asia\/Ashgabat':'KZ',\n    'Asia\/Yekaterinburg':'KZ','Asia\/Omsk':'KZ','Asia\/Novosibirsk':'KZ','Asia\/Krasnoyarsk':'KZ',\n    \/\/ Africa\n    'Africa\/Johannesburg':'ZA','Africa\/Cairo':'ZA','Africa\/Casablanca':'ZA','Africa\/Nairobi':'ZA',\n    'Africa\/Lagos':'ZA','Africa\/Algiers':'ZA','Africa\/Tunis':'ZA',\n    \/\/ Oceania\n    'Australia\/Sydney':'AU','Australia\/Melbourne':'AU','Australia\/Brisbane':'AU',\n    'Australia\/Perth':'AU','Australia\/Adelaide':'AU','Australia\/Darwin':'AU','Australia\/Hobart':'AU',\n    'Pacific\/Auckland':'NZ','Pacific\/Chatham':'NZ',\n    \/\/ South + East Asia\n    'Asia\/Kolkata':'IN','Asia\/Calcutta':'IN','Asia\/Karachi':'IN','Asia\/Dhaka':'IN','Asia\/Colombo':'IN','Asia\/Kathmandu':'IN',\n    'Asia\/Shanghai':'CN','Asia\/Beijing':'CN','Asia\/Urumqi':'CN','Asia\/Harbin':'CN','Asia\/Hong_Kong':'CN',\n    'Asia\/Macau':'CN','Asia\/Taipei':'CN','Asia\/Seoul':'CN','Asia\/Tokyo':'CN'\n  };\n  \/\/ Stash how detection landed (for the locale banner debug line \u2014 user asked\n  \/\/ to surface this so they can see why the default is what it is).\n  var detectSource = '';\n  \/\/ Map any ISO country code (incl. unsupported ones) to the closest country\n  \/\/ we DO have in COUNTRIES. Used after IP geolocation when the visitor's\n  \/\/ actual country isn't in our supported set \u2014 instead of falling back to US\n  \/\/ we land them on the geographically nearest agroclimatic match.\n  var CC_FALLBACK = {\n    \/\/ North America\n    MX:'US',GT:'US',CR:'US',PA:'US',CU:'US',DO:'US',HT:'US',JM:'US',PR:'US',\n    \/\/ South America\n    UY:'AR',PY:'AR',CL:'AR',BO:'AR',PE:'AR',EC:'AR',CO:'AR',VE:'AR',GY:'BR',SR:'BR',\n    \/\/ Western \/ Central Europe\n    AT:'DE',CH:'DE',BE:'FR',NL:'DE',LU:'FR',DK:'DE',IS:'GB',\n    SE:'PL',NO:'PL',FI:'PL',\n    IE:'GB',PT:'ES',GR:'IT',MT:'IT',CY:'IT',\n    \/\/ Eastern Europe \/ Balkans\n    CZ:'PL',SK:'PL',SI:'HU',HR:'HU',BA:'HU',RS:'HU',ME:'HU',MK:'HU',AL:'HU',XK:'HU',\n    BG:'RO',MD:'RO',\n    LT:'PL',LV:'PL',EE:'PL',\n    \/\/ Russia + Belarus \u2192 KZ (steppe-belt match)\n    RU:'KZ',BY:'PL',\n    \/\/ Africa\n    KE:'ZA',ZM:'ZA',ZW:'ZA',BW:'ZA',MZ:'ZA',TZ:'ZA',UG:'ZA',RW:'ZA',NG:'ZA',GH:'ZA',\n    EG:'ZA',MA:'ZA',TN:'ZA',DZ:'ZA',ET:'ZA',SD:'ZA',NA:'ZA',\n    \/\/ Central Asia + Caucasus\n    UZ:'KZ',KG:'KZ',TJ:'KZ',TM:'KZ',AZ:'KZ',GE:'KZ',AM:'KZ',MN:'KZ',\n    \/\/ South Asia\n    PK:'IN',BD:'IN',NP:'IN',LK:'IN',BT:'IN',MM:'IN',AF:'IN',\n    \/\/ East \/ SE Asia\n    JP:'CN',KR:'CN',TW:'CN',HK:'CN',MY:'CN',SG:'CN',TH:'CN',VN:'CN',PH:'CN',ID:'CN',\n    LA:'CN',KH:'CN',\n    \/\/ Oceania (other islands)\n    FJ:'AU',PG:'AU',NC:'AU',VU:'AU',SB:'AU'\n  };\n  function resolveCC(cc){\n    if(!cc) return null;\n    cc = String(cc).toUpperCase();\n    if(COUNTRIES[cc]) return cc;\n    if(CC_FALLBACK[cc] ? COUNTRIES[CC_FALLBACK[cc]] : false) return CC_FALLBACK[cc];\n    return null;\n  }\n  function detectCountry(){\n    try {\n      var saved = localStorage.getItem('gpy-roi-country');\n      if(saved ? COUNTRIES[saved] : false){ detectSource = 'saved'; return saved; }\n    } catch(_){}\n    \/\/ WP server-side hook: if the WordPress theme \/ plugin injected\n    \/\/   window.__GP_GEO = { country: 'XX' }\n    \/\/ (e.g., from a server-side GeoIP plugin reading the visitor's IP), trust\n    \/\/ that signal first. Lets the site upgrade detection later without touching\n    \/\/ the tool's JS.\n    try {\n      var gp = window.__GP_GEO;\n      if(gp ? gp.country : false){\n        var fromWP = resolveCC(gp.country);\n        if(fromWP){ detectSource = 'WordPress geo'; return fromWP; }\n      }\n    } catch(_){}\n    \/\/ Walk every navigator.languages entry (most browsers list 2-5).\n    var langs = [];\n    try { if(navigator.languages ? navigator.languages.length : false) langs = Array.prototype.slice.call(navigator.languages); } catch(_){}\n    try { if(navigator.language) langs.push(navigator.language); } catch(_){}\n    for(var li=0; li<langs.length; li++){\n      var lng = (langs[li] || '').trim();\n      if(!lng) continue;\n      \/\/ First try Intl.Locale \u2014 most reliable for tags like \"uk-UA\" or \"kk-Cyrl-KZ\".\n      try {\n        var loc = new Intl.Locale(lng);\n        if(loc.region ? COUNTRIES[loc.region] : false){\n          detectSource = 'language ' + lng;\n          return loc.region;\n        }\n      } catch(_){}\n      \/\/ Fallback regex for older browsers \/ non-standard tags.\n      var m = lng.match(\/[a-z]{2,3}[_-]([A-Z]{2})(?:[_-]|$)\/);\n      if(m ? COUNTRIES[m[1]] : false){\n        detectSource = 'language ' + lng;\n        return m[1];\n      }\n    }\n    \/\/ Timezone fallback \u2014 usually accurate for non-VPN users.\n    try {\n      var tz = Intl.DateTimeFormat().resolvedOptions().timeZone || '';\n      if(TZ_COUNTRY[tz] ? COUNTRIES[TZ_COUNTRY[tz]] : false){\n        detectSource = 'timezone ' + tz;\n        return TZ_COUNTRY[tz];\n      }\n    } catch(_){}\n    detectSource = 'fallback';\n    return 'US';\n  }\n  \/\/ Refine the detected country via a single IP-geolocation request.\n  \/\/ Runs AFTER first paint so the page renders fast even on slow connections.\n  \/\/ Exception to rule 4 (no external runtime fetches) \u2014 surfaced in the locale\n  \/\/ banner as \"via IP geolocation\" so the privacy trade-off is visible.\n  \/\/ Endpoint: api.country.is \u2014 anonymous, returns just { country: \"XX\" }, no\n  \/\/ tracking pixels, no PII beyond the IP it already received.\n  function refineWithIP(){\n    try {\n      \/\/ Only refine if the user hasn't explicitly chosen a country before.\n      if(localStorage.getItem('gpy-roi-country')) return;\n    } catch(_){}\n    if(!window.fetch) return;\n    var done = false;\n    var t = setTimeout(function(){ done = true; }, 2500);\n    fetch('https:\/\/api.country.is\/', { credentials:'omit' })\n      .then(function(r){ return r.ok ? r.json() : null; })\n      .then(function(d){\n        if(done ? true : !d) return;\n        clearTimeout(t);\n        var cc = resolveCC(d.country);\n        if(!cc ? true : cc === state.country) return;\n        state.country = cc;\n        detectSource = 'IP geolocation';\n        \/\/ Refresh defaults that depend on country (unit system + area + crop).\n        try {\n          if(!localStorage.getItem('gpy-units')){\n            unitSystem = COUNTRIES[cc].units;\n            syncUnitButtons();\n          }\n        } catch(_){}\n        var areaInputEl = $('#roi-area');\n        if(areaInputEl ? !areaInputEl.dataset.userEdited : false){\n          var defaultArea = COUNTRIES[cc].areaDefault;\n          areaInputEl.value = unitSystem === 'imperial' ? Math.round(defaultArea * 2.47105) : defaultArea;\n        }\n        applyCropDefaults();\n        updateLocaleBanner();\n        syncPickerSelection();\n        update();\n      })\n      .catch(function(){ clearTimeout(t); });\n  }\n  var detectedCountry = detectCountry();\n  \/\/ Persist unit system but seed it from detected country if user hasn't chosen.\n  var unitSystem = (COUNTRIES[detectedCountry] ? COUNTRIES[detectedCountry].units : 'metric');\n  try {\n    var saved = localStorage.getItem('gpy-units');\n    if(saved === 'metric' ? true : saved === 'imperial') unitSystem = saved;\n  } catch(e){}\n  \/\/ Country \u2192 local currency. FX rates are midpoint approximations (Jan 2026)\n  \/\/ for display-only conversion; precise live FX isn't worth the runtime fetch\n  \/\/ for what's already an approximate ROI tool. Commodity-pegged regions\n  \/\/ (AR, UA, KZ) keep USD because that's how local grain markets actually quote.\n  var CURRENCY = {\n    US: { symbol:'$',   code:'USD', toUSD:1.0,  locale:'en-US' },\n    CA: { symbol:'CA$', code:'CAD', toUSD:1.36, locale:'en-CA' },\n    BR: { symbol:'R$',  code:'BRL', toUSD:5.0,  locale:'pt-BR' },\n    AR: { symbol:'$',   code:'USD', toUSD:1.0,  locale:'es-AR' },\n    GB: { symbol:'\u00a3',   code:'GBP', toUSD:0.79, locale:'en-GB' },\n    FR: { symbol:'\u20ac',   code:'EUR', toUSD:0.92, locale:'fr-FR' },\n    DE: { symbol:'\u20ac',   code:'EUR', toUSD:0.92, locale:'de-DE' },\n    ES: { symbol:'\u20ac',   code:'EUR', toUSD:0.92, locale:'es-ES' },\n    IT: { symbol:'\u20ac',   code:'EUR', toUSD:0.92, locale:'it-IT' },\n    PL: { symbol:'z\u0142',  code:'PLN', toUSD:4.0,  locale:'pl-PL' },\n    UA: { symbol:'$',   code:'USD', toUSD:1.0,  locale:'uk-UA' },\n    RO: { symbol:'lei', code:'RON', toUSD:4.6,  locale:'ro-RO' },\n    HU: { symbol:'Ft',  code:'HUF', toUSD:360,  locale:'hu-HU' },\n    KZ: { symbol:'$',   code:'USD', toUSD:1.0,  locale:'kk-KZ' },\n    AU: { symbol:'A$',  code:'AUD', toUSD:1.5,  locale:'en-AU' },\n    NZ: { symbol:'NZ$', code:'NZD', toUSD:1.65, locale:'en-NZ' },\n    ZA: { symbol:'R',   code:'ZAR', toUSD:18,   locale:'en-ZA' },\n    IN: { symbol:'\u20b9',   code:'INR', toUSD:83,   locale:'en-IN' },\n    CN: { symbol:'\u00a5',   code:'CNY', toUSD:7.2,  locale:'zh-CN' }\n  };\n  function currencyOf(cc){\n    return CURRENCY[cc] ? CURRENCY[cc] : CURRENCY.US;\n  }\n  var state = { variability: 'medium', country: detectedCountry };\n  \/\/ Format a money amount in the active country's currency. Math is already\n  \/\/ in local currency (defaults are pre-converted in applyCropDefaults), so\n  \/\/ this only applies the symbol + locale-appropriate thousands separator.\n  function fmtMoney(n){\n    var ccy = currencyOf(state.country);\n    var sym = ccy.symbol;\n    if(!isFinite(n) ? true : n < 0) return sym + '0';\n    var loc = ccy.locale;\n    if(n >= 1000){\n      return sym + Math.round(n).toLocaleString(loc);\n    }\n    if(n >= 100){\n      return sym + Math.round(n).toLocaleString(loc);\n    }\n    if(n >= 10)  return sym + (Math.round(n*10)\/10).toFixed(1);\n    return sym + (Math.round(n*100)\/100).toFixed(2);\n  }\n  \/\/ Backward-compat alias \u2014 the old name is still referenced in older builds.\n  var fmtUSD = fmtMoney;\n  function getPracticeCount(){\n    var cbs = root.querySelectorAll('input[data-pr]');\n    var n = 0;\n    for(var i=0;i<cbs.length;i++){ if(cbs[i].checked) n++; }\n    return Math.max(1, Math.min(5, n));\n  }\n  \/\/ Convert a metric regional entry (t\/ha + $\/t) to imperial for the relevant\n  \/\/ crop. Same per-crop ratios used by the global CROPS table.\n  function metricToImperial(crop, metricEntry){\n    \/\/ crop-specific bu\/lb\/cwt conversion factors (1 metric tonne -> imperial)\n    var bushelTo = {\n      corn:39.368, wheat:36.744, soybean:36.744, rapeseed:44.092\n    };\n    if(bushelTo[crop]){\n      var perBu = metricEntry.price \/ bushelTo[crop];\n      return { yld: Math.round(metricEntry.yld * bushelTo[crop] \/ 2.47105),\n               price: Math.round(perBu * 100) \/ 100,\n               yldUnit: 'bu\/ac', priceUnit: '\/bu' };\n    }\n    if(crop === 'cotton' ? true : crop === 'sunflower'){\n      \/\/ 1 t = 2204.62 lb; convert per-acre\n      var ldYldMet = metricEntry.yld * 2204.62 \/ 2.47105;\n      var pricePerLb = metricEntry.price \/ 2204.62;\n      return { yld: Math.round(ldYldMet),\n               price: Math.round(pricePerLb * 100) \/ 100,\n               yldUnit: 'lb\/ac', priceUnit: '\/lb' };\n    }\n    if(crop === 'potato'){\n      \/\/ 1 t \u2248 22.046 cwt\n      return { yld: Math.round(metricEntry.yld * 22.046 \/ 2.47105),\n               price: Math.round(metricEntry.price \/ 22.046 * 10) \/ 10,\n               yldUnit: 'cwt\/ac', priceUnit: '\/cwt' };\n    }\n    return null;\n  }\n  function applyCropDefaults(){\n    var crop = $('#roi-crop').value;\n    \/\/ Regional first: zone-specific yield\/price if available for this crop.\n    var country = state.country;\n    var zone = COUNTRIES[country] ? COUNTRIES[country].zone : null;\n    var regional = (zone ? REGIONAL_YIELDS[zone] : null);\n    var entry = regional ? regional[crop] : null;\n    var c;\n    if(entry){\n      c = (unitSystem === 'imperial') ? (metricToImperial(crop, entry) ? metricToImperial(crop, entry) : CROPS.imperial[crop]) : entry;\n    } else {\n      c = CROPS[unitSystem][crop];\n    }\n    if(!c) return;\n    $('#roi-yield').value = c.yld;\n    \/\/ Defaults stored in USD baseline \u2192 convert into the active country's\n    \/\/ currency so the user sees realistic local-currency prices.\n    var fx = currencyOf(state.country).toUSD;\n    var localPrice = c.price * fx;\n    \/\/ Round to sensible precision per magnitude.\n    if(localPrice >= 1000) localPrice = Math.round(localPrice \/ 10) * 10;\n    else if(localPrice >= 100) localPrice = Math.round(localPrice);\n    else if(localPrice >= 10) localPrice = Math.round(localPrice * 10) \/ 10;\n    else localPrice = Math.round(localPrice * 100) \/ 100;\n    $('#roi-price').value = localPrice;\n    $('#roi-yield-u').textContent = c.yldUnit;\n    $('#roi-price-u').textContent = c.priceUnit;\n    \/\/ Currency symbol prefix on the price input.\n    var symEl = $('#roi-price-sym');\n    if(symEl) symEl.textContent = currencyOf(state.country).symbol;\n  }\n  \/\/ Refresh the locale banner with the active country \/ zone \/ regional stats\n  \/\/ summary. Called on first paint and whenever the user picks a new country\n  \/\/ via the \"Change\" picker.\n  function updateLocaleBanner(){\n    var country = state.country;\n    var info = COUNTRIES[country];\n    if(!info) return;\n    var banner = $('#roi-locale');\n    if(!banner) return;\n    banner.removeAttribute('hidden');\n    $('#roi-loc-country').textContent = info.name;\n    $('#roi-loc-zone').textContent = info.zone;\n    var sep = $('#roi-loc-sep'); if(sep) sep.removeAttribute('hidden');\n    \/\/ Regional summary stats: top 3 crops in this zone with their typical yields\n    var regional = REGIONAL_YIELDS[info.zone];\n    var statsEl = $('#roi-loc-stats');\n    if(statsEl){\n      var line;\n      if(regional){\n        var crops = Object.keys(regional).slice(0, 3);\n        var bits = [];\n        for(var i=0; i<crops.length; i++){\n          var cr = crops[i];\n          var e = regional[cr];\n          var display;\n          if(unitSystem === 'imperial'){\n            var imp = metricToImperial(cr, e);\n            display = imp ? (imp.yld + ' ' + imp.yldUnit) : (e.yld + ' ' + e.yldUnit);\n          } else {\n            display = e.yld + ' ' + e.yldUnit;\n          }\n          bits.push(cr + ' ' + display);\n        }\n        line = 'Typical: ' + bits.join(' \u00b7 ');\n      } else {\n        line = 'Using global midpoints (no regional table for ' + info.zone + ').';\n      }\n      \/\/ Append a tiny \"via X\" hint so the user can see which signal we used.\n      if(detectSource ? state.country === detectedCountry : false){\n        line += '  \u00b7  via ' + detectSource;\n      }\n      statsEl.textContent = line;\n    }\n  }\n  \/\/ Equirectangular projection from lng \/ lat to viewBox coords.\n  function projGlobe(lng, lat, W, H){\n    return {\n      x: (lng + 180) \/ 360 * W,\n      y: (90 - lat) \/ 180 * H\n    };\n  }\n  \/\/ Marks the active country across BOTH the globe SVG (orange dot) and the\n  \/\/ List view button (filled accent button). Called from any click handler.\n  function syncPickerSelection(){\n    var pmap = $('#roi-picker-map');\n    if(pmap){\n      var dots = pmap.querySelectorAll('.roi-country-dot');\n      for(var i=0; i<dots.length; i++) dots[i].classList.toggle('on', dots[i].dataset.cc === state.country);\n    }\n    var plist = $('#roi-picker-list');\n    if(plist){\n      var btns = plist.querySelectorAll('button');\n      for(var j=0; j<btns.length; j++) btns[j].classList.toggle('on', btns[j].dataset.cc === state.country);\n    }\n  }\n  \/\/ Called from globe-dot click or list-button click. Applies new country,\n  \/\/ refreshes unit system \/ area \/ crop defaults \/ banner \/ result.\n  function selectCountry(cc){\n    if(!COUNTRIES[cc]) return;\n    state.country = cc;\n    try { localStorage.setItem('gpy-roi-country', cc); } catch(_){}\n    try {\n      if(!localStorage.getItem('gpy-units')){\n        unitSystem = COUNTRIES[cc].units;\n        syncUnitButtons();\n        applyUnitSystem();\n      }\n    } catch(_){}\n    var areaInput = $('#roi-area');\n    if(areaInput ? !areaInput.dataset.userEdited : false){\n      var defaultArea = COUNTRIES[cc].areaDefault;\n      areaInput.value = unitSystem === 'imperial' ? Math.round(defaultArea * 2.47105) : defaultArea;\n    }\n    applyCropDefaults();\n    updateLocaleBanner();\n    syncPickerSelection();\n    update();\n  }\n  \/\/ Build the country picker: globe SVG (Map view) + button list (List view)\n  \/\/ with tab toggle. Globe view is the default \u2014 more impressive on first\n  \/\/ open. Lazy-built on first \"Change\" click.\n  function buildLocalePicker(){\n    var picker = $('#roi-locale-picker');\n    if(!picker ? true : picker.dataset.built === '1') return;\n    \/\/ ---- Globe (Map view) ----\n    var W = 760, H = 380;\n    var svgParts = [];\n    svgParts.push('<svg class=\"gpy-roi-globe\" viewBox=\"0 0 ' + W + ' ' + H + '\" preserveAspectRatio=\"xMidYMid meet\" role=\"img\" aria-label=\"World map with supported countries\">');\n    \/\/ Graticule (simple grid every 30\u00b0 lng, 20\u00b0 lat)\n    svgParts.push('<g class=\"roi-graticule\">');\n    for(var gx=0; gx<=360; gx+=30){\n      var px = gx \/ 360 * W;\n      svgParts.push('<line class=\"roi-graticule\" x1=\"' + px.toFixed(1) + '\" y1=\"0\" x2=\"' + px.toFixed(1) + '\" y2=\"' + H + '\"\/>');\n    }\n    for(var gy=0; gy<=180; gy+=20){\n      var py = gy \/ 180 * H;\n      svgParts.push('<line class=\"roi-graticule\" x1=\"0\" y1=\"' + py.toFixed(1) + '\" x2=\"' + W + '\" y2=\"' + py.toFixed(1) + '\"\/>');\n    }\n    \/\/ Equator (heavier line)\n    var eqY = (90 \/ 180 * H).toFixed(1);\n    svgParts.push('<line x1=\"0\" y1=\"' + eqY + '\" x2=\"' + W + '\" y2=\"' + eqY + '\" stroke=\"rgba(0,0,0,0.18)\" stroke-width=\"1\" stroke-dasharray=\"6 4\"\/>');\n    svgParts.push('<\/g>');\n    \/\/ Supported countries \u2014 clickable centroid dots, color-coded.\n    svgParts.push('<g class=\"roi-countries\">');\n    var cc_keys = Object.keys(COUNTRY_COORDS);\n    for(var k=0; k<cc_keys.length; k++){\n      var cc = cc_keys[k];\n      var coord = COUNTRY_COORDS[cc];\n      var info = COUNTRIES[cc];\n      if(!info ? true : !coord) continue;\n      var on = cc === state.country ? ' on' : '';\n      var c = projGlobe(coord[0], coord[1], W, H);\n      svgParts.push(\n        '<g class=\"roi-country-dot' + on + '\" data-cc=\"' + cc + '\" tabindex=\"0\" role=\"button\" aria-label=\"' + info.name + '\">' +\n          '<title>' + info.name + ' \u00b7 ' + info.zone + '<\/title>' +\n          '<circle cx=\"' + c.x.toFixed(1) + '\" cy=\"' + c.y.toFixed(1) + '\" r=\"9\"\/>' +\n          '<text x=\"' + c.x.toFixed(1) + '\" y=\"' + (c.y + 3).toFixed(1) + '\">' + cc + '<\/text>' +\n        '<\/g>'\n      );\n    }\n    svgParts.push('<\/g>');\n    svgParts.push('<\/svg>');\n    svgParts.push('<div class=\"gpy-roi-globe-caption\">Click any green dot to switch country. Selection tunes the calculator defaults.<\/div>');\n    var mapEl = $('#roi-picker-map');\n    if(mapEl) mapEl.innerHTML = svgParts.join('');\n    \/\/ ---- List view (grouped by continent) ----\n    var groups = {};\n    var allKeys = Object.keys(COUNTRIES);\n    for(var lgi=0; lgi<allKeys.length; lgi++){\n      var lgk = allKeys[lgi];\n      var cont = COUNTRIES[lgk].continent || 'Other';\n      if(!groups[cont]) groups[cont] = [];\n      groups[cont].push(lgk);\n    }\n    var listHtml = '';\n    for(var ci=0; ci<CONTINENT_ORDER.length; ci++){\n      var cont2 = CONTINENT_ORDER[ci];\n      var members = groups[cont2];\n      if(!members ? true : !members.length) continue;\n      members.sort(function(a, b){ return COUNTRIES[a].name.localeCompare(COUNTRIES[b].name); });\n      listHtml += '<div class=\"roi-picker-grp\"><div class=\"roi-picker-grp-h\">' + cont2 + '<\/div><div class=\"roi-picker-grp-row\">';\n      for(var li=0; li<members.length; li++){\n        var lk = members[li];\n        var lon = lk === state.country ? ' on' : '';\n        listHtml += '<button type=\"button\" data-cc=\"' + lk + '\" class=\"' + (lon ? 'on' : '') + '\">' + COUNTRIES[lk].name + '<\/button>';\n      }\n      listHtml += '<\/div><\/div>';\n    }\n    var listEl = $('#roi-picker-list');\n    if(listEl) listEl.innerHTML = listHtml;\n    \/\/ Click handlers (delegated)\n    if(mapEl){\n      mapEl.addEventListener('click', function(ev){\n        var g = ev.target.closest ? ev.target.closest('.roi-country-dot') : null;\n        if(g ? g.dataset.cc : false) selectCountry(g.dataset.cc);\n      });\n      mapEl.addEventListener('keydown', function(ev){\n        if(ev.key !== 'Enter' ? ev.key !== ' ' : false) return;\n        var g = ev.target.closest ? ev.target.closest('.roi-country-dot') : null;\n        if(g ? g.dataset.cc : false){ ev.preventDefault(); selectCountry(g.dataset.cc); }\n      });\n    }\n    if(listEl){\n      listEl.addEventListener('click', function(ev){\n        if(ev.target.tagName !== 'BUTTON') return;\n        var cc = ev.target.dataset.cc;\n        if(cc) selectCountry(cc);\n      });\n    }\n    \/\/ Tab switching (Map <-> List)\n    var tabs = picker.querySelectorAll('.roi-picker-tab');\n    for(var ti=0; ti<tabs.length; ti++){\n      tabs[ti].addEventListener('click', function(){\n        var view = this.dataset.view;\n        for(var t=0; t<tabs.length; t++){\n          var on2 = tabs[t].dataset.view === view;\n          tabs[t].classList.toggle('on', on2);\n          tabs[t].setAttribute('aria-selected', on2 ? 'true' : 'false');\n        }\n        if(mapEl) mapEl.hidden = (view !== 'map');\n        if(listEl) listEl.hidden = (view !== 'list');\n      });\n    }\n    picker.dataset.built = '1';\n  }\n  function applyUnitSystem(){\n    var areaUnit = $('#roi-area-u');\n    if(unitSystem === 'imperial'){\n      areaUnit.value = 'ac';\n    } else {\n      areaUnit.value = 'ha';\n    }\n    $('#roi-per-unit').textContent = unitSystem === 'imperial' ? 'per acre' : 'per hectare';\n    applyCropDefaults();\n    update();\n    try { localStorage.setItem('gpy-units', unitSystem); } catch(e){}\n  }\n  function update(){\n    var area = +$('#roi-area').value || 0;\n    var areaUnit = $('#roi-area-u').value;\n    var yld = +$('#roi-yield').value || 0;\n    var price = +$('#roi-price').value || 0;\n    var k = getPracticeCount();\n    \/\/ Revenue per yield-area-unit (matches what user entered: bu\/ac \u00d7 $\/bu = $\/ac,\n    \/\/ or t\/ha \u00d7 $\/t = $\/ha).\n    var revPerArea = yld * price;\n    \/\/ ROI per yield-area-unit.\n    var central = ROI.base * ROI.variability[state.variability] * ROI.practices[k];\n    var lowPct = central * (1 - ROI.range);\n    var hiPct  = central * (1 + ROI.range);\n    var perAreaLow = revPerArea * lowPct;\n    var perAreaHi  = revPerArea * hiPct;\n    \/\/ Total: bring area into yield's denominator\n    var areaInYldUnits;\n    if(unitSystem === 'imperial'){\n      areaInYldUnits = areaUnit === 'ha' ? area * 2.47105 : area; \/\/ ha \u2192 ac\n    } else {\n      areaInYldUnits = areaUnit === 'ac' ? area \/ 2.47105 : area; \/\/ ac \u2192 ha\n    }\n    var totLow = perAreaLow * areaInYldUnits;\n    var totHi  = perAreaHi  * areaInYldUnits;\n    $('#roi-per-low').textContent = fmtUSD(perAreaLow);\n    $('#roi-per-high').textContent = fmtUSD(perAreaHi);\n    $('#roi-tot-low').textContent = fmtUSD(totLow);\n    $('#roi-tot-high').textContent = fmtUSD(totHi);\n    $('#roi-pct').textContent = (lowPct*100).toFixed(2) + '\u2013' + (hiPct*100).toFixed(2) + '%';\n  }\n  ['#roi-area', '#roi-yield', '#roi-price'].forEach(function(sel){\n    $(sel).addEventListener('input', update);\n  });\n  $('#roi-area-u').addEventListener('change', update);\n  $('#roi-crop').addEventListener('change', function(){\n    applyCropDefaults();\n    update();\n  });\n  var varBtns = root.querySelectorAll('#roi-var button');\n  for(var i=0;i<varBtns.length;i++){\n    varBtns[i].addEventListener('click', function(){\n      for(var j=0;j<varBtns.length;j++) varBtns[j].classList.remove('on');\n      this.classList.add('on');\n      state.variability = this.dataset.v;\n      $('#roi-var-hint').textContent = VAR_HINTS[state.variability];\n      update();\n    });\n  }\n  var prCbs = root.querySelectorAll('input[data-pr]');\n  for(var i=0;i<prCbs.length;i++){\n    prCbs[i].addEventListener('change', update);\n  }\n  function syncUnitButtons(){\n    var btns = root.querySelectorAll('#roi-units button');\n    for(var i=0;i<btns.length;i++){\n      btns[i].classList.toggle('on', btns[i].dataset.u === unitSystem);\n    }\n  }\n  var unitBtns = root.querySelectorAll('#roi-units button');\n  for(var i=0;i<unitBtns.length;i++){\n    unitBtns[i].addEventListener('click', function(){\n      unitSystem = this.dataset.u;\n      syncUnitButtons();\n      applyUnitSystem();\n      updateLocaleBanner();\n    });\n  }\n  \/\/ Mark roi-area as user-edited so the country picker won't overwrite it.\n  var areaInputEl = $('#roi-area');\n  if(areaInputEl){\n    areaInputEl.addEventListener('input', function(){ this.dataset.userEdited = '1'; });\n  }\n  \/\/ Pre-fill the area input with the detected country's typical farm size,\n  \/\/ only if the user hasn't already touched it (e.g., on first paint).\n  if(areaInputEl ? !areaInputEl.dataset.userEdited : false){\n    var startInfo = COUNTRIES[state.country];\n    if(startInfo){\n      areaInputEl.value = unitSystem === 'imperial'\n        ? Math.round(startInfo.areaDefault * 2.47105)\n        : startInfo.areaDefault;\n    }\n  }\n  \/\/ Wire the \"Change\" picker toggle button.\n  var locEditBtn = $('#roi-loc-edit');\n  var locPicker = $('#roi-locale-picker');\n  if(locEditBtn ? locPicker : false){\n    locEditBtn.addEventListener('click', function(){\n      buildLocalePicker();\n      var open = locPicker.classList.toggle('show');\n      locEditBtn.setAttribute('aria-expanded', open ? 'true' : 'false');\n    });\n  }\n  syncUnitButtons();\n  applyUnitSystem();\n  updateLocaleBanner();\n  \/\/ Async refinement via IP \u2014 runs after first paint so the page is interactive\n  \/\/ immediately; the banner \/ defaults update silently if a better signal lands.\n  refineWithIP();\n})();\n<\/script>\n<\/div>\n\n\n\n<div class=\"gp-lead\">\n<section class=\"gpx-cta\">\n  <h2>Bigger picture? GeoPard turns the data into prescriptions.<\/h2>\n  <p>This page reads one file at a time. The full GeoPard platform combines multi-year yield, NDVI, soil, and topography into management zones, generates variable rate prescriptions, and pushes them to your machine.<\/p>\n  <div class=\"gpx-integ-label\">Push prescriptions and pull as-applied data with:<\/div>\n  <div class=\"gpx-integ\">\n    <span class=\"gpx-integ-chip\">John Deere Operations Center<\/span>\n    <span class=\"gpx-integ-chip\">CNH FieldOps<\/span>\n    <span class=\"gpx-integ-chip\">AGCO \/ PTx FarmEngage<\/span>\n  <\/div>\n  <a class=\"gpx-btn\" href=\"https:\/\/app.geopard.tech\/signup?utm_source=geopard.tech&amp;utm_medium=lead-magnet&amp;utm_campaign=field-data-explorer&amp;utm_content=below-tool-cta\">Register free in GeoPard &rarr;<\/a>\n<\/section>\n\n<section class=\"gpx-faq\" aria-labelledby=\"gpx-faq-h\">\n  <h2 id=\"gpx-faq-h\">Frequently asked questions<\/h2>\n  <div class=\"gpx-tabs\">\n    <div class=\"gpx-tablist\" role=\"tablist\" aria-label=\"Field Data Explorer FAQ\">\n      <button class=\"gpx-tab\" role=\"tab\" id=\"gpx-tab-1\" aria-controls=\"gpx-panel-1\" aria-selected=\"true\" tabindex=\"0\">File formats<\/button>\n      <button class=\"gpx-tab\" role=\"tab\" id=\"gpx-tab-2\" aria-controls=\"gpx-panel-2\" aria-selected=\"false\" tabindex=\"-1\">Privacy &amp; data<\/button>\n      <button class=\"gpx-tab\" role=\"tab\" id=\"gpx-tab-3\" aria-controls=\"gpx-panel-3\" aria-selected=\"false\" tabindex=\"-1\">Outlier colors<\/button>\n      <button class=\"gpx-tab\" role=\"tab\" id=\"gpx-tab-4\" aria-controls=\"gpx-panel-4\" aria-selected=\"false\" tabindex=\"-1\">Saving analysis<\/button>\n      <button class=\"gpx-tab\" role=\"tab\" id=\"gpx-tab-5\" aria-controls=\"gpx-panel-5\" aria-selected=\"false\" tabindex=\"-1\">Integrations<\/button>\n    <\/div>\n    <div class=\"gpx-panel is-active\" role=\"tabpanel\" id=\"gpx-panel-1\" aria-labelledby=\"gpx-tab-1\">\n      <h3>What file formats and layers are supported?<\/h3>\n      <p><strong>Layers:<\/strong> yield maps, as-applied (seeding, fertilizer, spraying, lime), soil sample points, field boundaries, and Trimble Coverage maps.<\/p>\n      <p><strong>Containers:<\/strong> <strong>GeoJSON<\/strong> with Point, LineString, Polygon, or MultiPolygon geometry, and <strong>zipped shapefiles<\/strong> in EPSG:4326 (WGS84). Projected shapefiles will silently mis-place coordinates, so convert them to WGS84 first or use the full GeoPard import flow which handles reprojection.<\/p>\n    <\/div>\n    <div class=\"gpx-panel\" role=\"tabpanel\" id=\"gpx-panel-2\" aria-labelledby=\"gpx-tab-2\" hidden>\n      <h3>Are you storing my data?<\/h3>\n      <p>No. The page is fully client-side. Nothing about your file leaves the browser. There is no upload, no server log, no telemetry on the file contents. Close the tab and it is gone. You can verify this with browser dev tools by watching the Network panel after dropping a file.<\/p>\n    <\/div>\n    <div class=\"gpx-panel\" role=\"tabpanel\" id=\"gpx-panel-3\" aria-labelledby=\"gpx-tab-3\" hidden>\n      <h3>Why are some points grey or violet?<\/h3>\n      <p><strong>Grey<\/strong> = low-side outliers (likely a missed pass, wet spot, header float issue, or boundary noise). <strong>Violet<\/strong> = high-side outliers (likely double-pass overlaps in as-applied maps, or a moisture or sensor hot spot in yield). Adjust the <code>sigma<\/code> slider to make outlier detection more or less strict, or toggle outliers off to see the raw distribution.<\/p>\n    <\/div>\n    <div class=\"gpx-panel\" role=\"tabpanel\" id=\"gpx-panel-4\" aria-labelledby=\"gpx-tab-4\" hidden>\n      <h3>Can I save my analysis?<\/h3>\n      <p>Not from this page. Saving farm history, sharing fields with your agronomist, layering NDVI, soil tests, and elevation, generating variable rate prescriptions, and exporting work files to your equipment platform all live in the full GeoPard app.<\/p>\n    <\/div>\n    <div class=\"gpx-panel\" role=\"tabpanel\" id=\"gpx-panel-5\" aria-labelledby=\"gpx-tab-5\" hidden>\n      <h3>What equipment platforms can GeoPard write prescriptions to?<\/h3>\n      <p>From the full GeoPard platform you can push variable rate prescription files and import as-applied data with <strong>John Deere Operations Center<\/strong>, <strong>CNH FieldOps<\/strong>, and <strong>AGCO \/ PTx FarmEngage<\/strong>, plus shapefile and ISO-XML exports for other monitors. Talk to us if you run a mixed fleet.<\/p>\n    <\/div>\n  <\/div>\n<\/section>\n<script type=\"application\/ld+json\" data-no-optimize=\"1\" data-no-minify=\"1\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What file formats and layers are supported?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Layers: yield maps, as-applied (seeding, fertilizer, spraying, lime), soil sample points, field boundaries, and Trimble Coverage maps. Containers: GeoJSON with Point, LineString, Polygon, or MultiPolygon geometry, and zipped shapefiles in EPSG:4326 (WGS84). Projected shapefiles will silently mis-place coordinates, so convert them to WGS84 first or use the full GeoPard import flow which handles reprojection.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Are you storing my data?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"No. The page is fully client-side. Nothing about your file leaves the browser. There is no upload, no server log, no telemetry on the file contents. Close the tab and it is gone. You can verify this with browser dev tools by watching the Network panel after dropping a file.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Why are some points grey or violet?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Grey = low-side outliers (likely a missed pass, wet spot, header float issue, or boundary noise). Violet = high-side outliers (likely double-pass overlaps in as-applied maps, or a moisture or sensor hot spot in yield). Adjust the sigma slider to make outlier detection more or less strict, or toggle outliers off to see the raw distribution.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Can I save my analysis?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Not from this page. Saving farm history, sharing fields with your agronomist, layering NDVI, soil tests, and elevation, generating variable rate prescriptions, and exporting work files to your equipment platform all live in the full GeoPard app.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What equipment platforms can GeoPard write prescriptions to?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"From the full GeoPard platform you can push variable rate prescription files and import as-applied data with John Deere Operations Center, CNH FieldOps, and AGCO \/ PTx FarmEngage, plus shapefile and ISO-XML exports for other monitors. Talk to us if you run a mixed fleet.\"\n      }\n    }\n  ]\n}\n<\/script>\n<\/div>\n<script nowprocket data-no-optimize=\"1\" data-no-defer=\"1\" data-no-minify=\"1\">\n(function(){\n  var root = document.querySelector('.gp-lead .gpx-faq');\n  if(!root) return;\n  var tabs = root.querySelectorAll('.gpx-tab');\n  var panels = root.querySelectorAll('.gpx-panel');\n  function activate(idx){\n    tabs.forEach(function(t,i){\n      var on = i===idx;\n      t.setAttribute('aria-selected', on ? 'true' : 'false');\n      t.setAttribute('tabindex', on ? '0' : '-1');\n    });\n    panels.forEach(function(p,i){\n      var on = i===idx;\n      p.classList.toggle('is-active', on);\n      if(on){ p.removeAttribute('hidden'); } else { p.setAttribute('hidden',''); }\n    });\n  }\n  tabs.forEach(function(t,i){\n    t.addEventListener('click', function(){ activate(i); });\n    t.addEventListener('keydown', function(e){\n      var n=tabs.length, ni=i;\n      if(e.key==='ArrowRight'){ni=(i+1)%n;}\n      else if(e.key==='ArrowLeft'){ni=(i-1+n)%n;}\n      else if(e.key==='Home'){ni=0;}\n      else if(e.key==='End'){ni=n-1;}\n      else { return; }\n      e.preventDefault();\n      activate(ni);\n      tabs[ni].focus();\n    });\n  });\n})();\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>Kalkulator povrata ulaganja za zoniranje Pribli\u017eno. Konzervativno. Na temelju objavljenih rezultata pokusa s varijabilnom stopom. Procijenite agronomsku korist od primjene propisanih zona na polju s ovim profilom\u2026.<\/p>","protected":false},"author":210157960,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_eb_attr":"","content-type":"","footnotes":"","big_sky_generated":false},"class_list":["post-13185","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Zoning ROI Calculator - GeoPard Agriculture<\/title>\n<meta name=\"description\" content=\"Calculate your Zoning ROI with our easy-to-use calculator. Estimate annual benefits based on crop variability and practices.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/geopard.tech\/hr\/kalkulator-povrata-ulaganja-za-zoniranje\/\" \/>\n<meta property=\"og:locale\" content=\"hr_HR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Zoning ROI Calculator - GeoPard Agriculture\" \/>\n<meta property=\"og:description\" content=\"Calculate your Zoning ROI with our easy-to-use calculator. Estimate annual benefits based on crop variability and practices.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/geopard.tech\/hr\/kalkulator-povrata-ulaganja-za-zoniranje\/\" \/>\n<meta property=\"og:site_name\" content=\"GeoPard - Precision agriculture Mapping software\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/geopardAgriculture\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-25T21:00:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2026\/03\/GeoPard-Background-Precision-Ag-software-Do-more-with-your-data.png?fit=3116%2C1754&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"3116\" \/>\n\t<meta property=\"og:image:height\" content=\"1754\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@geopardagri\" \/>\n<meta name=\"twitter:label1\" content=\"Procijenjeno vrijeme \u010ditanja\" \/>\n\t<meta name=\"twitter:data1\" content=\"4 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/geopard.tech\\\/zoning-roi-calculator\\\/\",\"url\":\"https:\\\/\\\/geopard.tech\\\/zoning-roi-calculator\\\/\",\"name\":\"Zoning ROI Calculator - GeoPard Agriculture\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/geopard.tech\\\/#website\"},\"datePublished\":\"2026-05-20T20:17:17+00:00\",\"dateModified\":\"2026-05-25T21:00:43+00:00\",\"description\":\"Calculate your Zoning ROI with our easy-to-use calculator. Estimate annual benefits based on crop variability and practices.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/geopard.tech\\\/zoning-roi-calculator\\\/#breadcrumb\"},\"inLanguage\":\"hr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/geopard.tech\\\/zoning-roi-calculator\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/geopard.tech\\\/zoning-roi-calculator\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/geopard.tech\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Zoning ROI Calculator\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/geopard.tech\\\/#website\",\"url\":\"https:\\\/\\\/geopard.tech\\\/\",\"name\":\"GeoPard - Precision agriculture software\",\"description\":\"Precision agriculture Mapping software\",\"publisher\":{\"@id\":\"https:\\\/\\\/geopard.tech\\\/#organization\"},\"alternateName\":\"GeoPard\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/geopard.tech\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"hr\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/geopard.tech\\\/#organization\",\"name\":\"GeoPard Agriculture\",\"alternateName\":\"GeoPard\",\"url\":\"https:\\\/\\\/geopard.tech\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"hr\",\"@id\":\"https:\\\/\\\/geopard.tech\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/geopard.tech\\\/wp-content\\\/uploads\\\/2022\\\/03\\\/favicon.png?fit=200%2C200&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/geopard.tech\\\/wp-content\\\/uploads\\\/2022\\\/03\\\/favicon.png?fit=200%2C200&ssl=1\",\"width\":200,\"height\":200,\"caption\":\"GeoPard Agriculture\"},\"image\":{\"@id\":\"https:\\\/\\\/geopard.tech\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/geopardAgriculture\\\/\",\"https:\\\/\\\/x.com\\\/geopardagri\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/geopard-agriculture\\\/\",\"https:\\\/\\\/www.instagram.com\\\/geopardagriculture\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Kalkulator ROI-a za zoniranje - GeoPard Agriculture","description":"Izra\u010dunajte povrat ulaganja u zoniranje pomo\u0107u na\u0161eg jednostavnog kalkulatora. Procijenite godi\u0161nje koristi na temelju varijabilnosti usjeva i praksi.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/geopard.tech\/hr\/kalkulator-povrata-ulaganja-za-zoniranje\/","og_locale":"hr_HR","og_type":"article","og_title":"Zoning ROI Calculator - GeoPard Agriculture","og_description":"Calculate your Zoning ROI with our easy-to-use calculator. Estimate annual benefits based on crop variability and practices.","og_url":"https:\/\/geopard.tech\/hr\/kalkulator-povrata-ulaganja-za-zoniranje\/","og_site_name":"GeoPard - Precision agriculture Mapping software","article_publisher":"https:\/\/www.facebook.com\/geopardAgriculture\/","article_modified_time":"2026-05-25T21:00:43+00:00","og_image":[{"width":3116,"height":1754,"url":"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2026\/03\/GeoPard-Background-Precision-Ag-software-Do-more-with-your-data.png?fit=3116%2C1754&ssl=1","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_site":"@geopardagri","twitter_misc":{"Procijenjeno vrijeme \u010ditanja":"4 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/geopard.tech\/zoning-roi-calculator\/","url":"https:\/\/geopard.tech\/zoning-roi-calculator\/","name":"Kalkulator ROI-a za zoniranje - GeoPard Agriculture","isPartOf":{"@id":"https:\/\/geopard.tech\/#website"},"datePublished":"2026-05-20T20:17:17+00:00","dateModified":"2026-05-25T21:00:43+00:00","description":"Izra\u010dunajte povrat ulaganja u zoniranje pomo\u0107u na\u0161eg jednostavnog kalkulatora. Procijenite godi\u0161nje koristi na temelju varijabilnosti usjeva i praksi.","breadcrumb":{"@id":"https:\/\/geopard.tech\/zoning-roi-calculator\/#breadcrumb"},"inLanguage":"hr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/geopard.tech\/zoning-roi-calculator\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/geopard.tech\/zoning-roi-calculator\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/geopard.tech\/"},{"@type":"ListItem","position":2,"name":"Zoning ROI Calculator"}]},{"@type":"WebSite","@id":"https:\/\/geopard.tech\/#website","url":"https:\/\/geopard.tech\/","name":"GeoPard - Softver za preciznu poljoprivredu","description":"Precizna poljoprivreda Softver za mapiranje","publisher":{"@id":"https:\/\/geopard.tech\/#organization"},"alternateName":"GeoPard","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/geopard.tech\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"hr"},{"@type":"Organization","@id":"https:\/\/geopard.tech\/#organization","name":"GeoPard Poljoprivreda","alternateName":"GeoPard","url":"https:\/\/geopard.tech\/","logo":{"@type":"ImageObject","inLanguage":"hr","@id":"https:\/\/geopard.tech\/#\/schema\/logo\/image\/","url":"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2022\/03\/favicon.png?fit=200%2C200&ssl=1","contentUrl":"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2022\/03\/favicon.png?fit=200%2C200&ssl=1","width":200,"height":200,"caption":"GeoPard Agriculture"},"image":{"@id":"https:\/\/geopard.tech\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/geopardAgriculture\/","https:\/\/x.com\/geopardagri","https:\/\/www.linkedin.com\/company\/geopard-agriculture\/","https:\/\/www.instagram.com\/geopardagriculture\/"]}]}},"jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/PdiCPa-3qF","_links":{"self":[{"href":"https:\/\/geopard.tech\/hr\/wp-json\/wp\/v2\/pages\/13185","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/geopard.tech\/hr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/geopard.tech\/hr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/geopard.tech\/hr\/wp-json\/wp\/v2\/users\/210157960"}],"replies":[{"embeddable":true,"href":"https:\/\/geopard.tech\/hr\/wp-json\/wp\/v2\/comments?post=13185"}],"version-history":[{"count":0,"href":"https:\/\/geopard.tech\/hr\/wp-json\/wp\/v2\/pages\/13185\/revisions"}],"wp:attachment":[{"href":"https:\/\/geopard.tech\/hr\/wp-json\/wp\/v2\/media?parent=13185"}],"curies":[{"name":"radni list","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}